limixbot 0.3.12 → 0.3.15

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 (123) hide show
  1. package/dist/assets/{ActivityPanel-CJM61CWQ.js → ActivityPanel-CrqSA80q.js} +1 -1
  2. package/dist/assets/{App-DRnqqiJP.js → App-Bx6hl9Sg.js} +129 -129
  3. package/dist/assets/{AppEventEditor-1hupO_kL.js → AppEventEditor-DLfkpP1d.js} +1 -1
  4. package/dist/assets/{BotSettingsDialog-B56-kmya.js → BotSettingsDialog-rHcw4pr0.js} +1 -1
  5. package/dist/assets/{BrowserPanel-BXBygd1y.js → BrowserPanel-BgNsYU3s.js} +1 -1
  6. package/dist/assets/{BrowserProfilesManager-CzzGhZGz.js → BrowserProfilesManager-ByQtDUyM.js} +1 -1
  7. package/dist/assets/{CloudAddDialog-MMhMrVK3.js → CloudAddDialog-754PKKwo.js} +1 -1
  8. package/dist/assets/{ComputerFilesPane-Hpxjnk2e.js → ComputerFilesPane-IP5ib-4w.js} +1 -1
  9. package/dist/assets/{ComputerPanel-CMce64RT.js → ComputerPanel-CndWeumv.js} +2 -2
  10. package/dist/assets/{DataPanel-BQ7Ua1Oq.js → DataPanel-BWlfa8L7.js} +1 -1
  11. package/dist/assets/{DesktopViewer-BRzNtGEm.js → DesktopViewer-tgbnWJ7S.js} +1 -1
  12. package/dist/assets/{FilesView-DQYXl0zm.js → FilesView-PiPhchvH.js} +1 -1
  13. package/dist/assets/{GrokMoveDialog-Dk-pwczv.js → GrokMoveDialog-DGBkFh2_.js} +1 -1
  14. package/dist/assets/{InspectorPanel-CvnM0TFW.js → InspectorPanel-DMb9KlS1.js} +1 -1
  15. package/dist/assets/{KeyboardShortcutsModal-BQ8aAw16.js → KeyboardShortcutsModal-DcAnacT0.js} +1 -1
  16. package/dist/assets/{LiveDesktop-Cr7uAFoQ.js → LiveDesktop-pNuAQp7j.js} +1 -1
  17. package/dist/assets/{LocalVmWorkspace-BJ-i68MR.js → LocalVmWorkspace-rUDRW4sg.js} +1 -1
  18. package/dist/assets/{MacLocalControl-DE8MVZkU.js → MacLocalControl-D2_QV-or.js} +1 -1
  19. package/dist/assets/{MarkdownFilePreview-B_6azXNT.js → MarkdownFilePreview-DNNn-HhY.js} +1 -1
  20. package/dist/assets/{MenuMotion-BDYr4RxL.js → MenuMotion-CIhkQGNX.js} +1 -1
  21. package/dist/assets/{NewBotDialog-D9fUysLU.js → NewBotDialog-C1onlYty.js} +1 -1
  22. package/dist/assets/{PhoneAppDialog-DUv4Qx8n.js → PhoneAppDialog-DygQ7EJ1.js} +1 -1
  23. package/dist/assets/{PlacesRail-yZdo57pP.js → PlacesRail-DC3DtwQy.js} +1 -1
  24. package/dist/assets/{PluginsPanel-DYuWdWZd.js → PluginsPanel-BZv6B1JK.js} +1 -1
  25. package/dist/assets/{ProIntroduction-DapZkP7I.js → ProIntroduction-DeMFeFxH.js} +1 -1
  26. package/dist/assets/{RemoteAgentSettingsPanel-sNv3TbBd.js → RemoteAgentSettingsPanel-DyVQB35x.js} +1 -1
  27. package/dist/assets/{RoomPanel-DrlyOJKZ.js → RoomPanel-DEH49als.js} +1 -1
  28. package/dist/assets/{RoutinesPage-CIo30TVq.js → RoutinesPage-CRI83T_I.js} +1 -1
  29. package/dist/assets/SettingsModal-Dcdk0Qvv.js +11 -0
  30. package/dist/assets/{ShareTeamDialog-CH1ts7Uj.js → ShareTeamDialog-D5ML8qDY.js} +1 -1
  31. package/dist/assets/{SignedInSites-CisTAQW0.js → SignedInSites-Bjc69Ty-.js} +1 -1
  32. package/dist/assets/{TeamLibraryPanel-DvnKye05.js → TeamLibraryPanel-CVcmOn6k.js} +1 -1
  33. package/dist/assets/{TeamMapPage-JOiilgs0.js → TeamMapPage-C3-Cu90W.js} +1 -1
  34. package/dist/assets/{TriggersPage-DQ3HQ6_i.js → TriggersPage-DS2Ceion.js} +1 -1
  35. package/dist/assets/{VisibilitySection-DXfPp0Ql.js → VisibilitySection-DigpYJ5s.js} +1 -1
  36. package/dist/assets/{WebhookTrigger-BYeOyOpX.js → WebhookTrigger-BP28l-Jy.js} +1 -1
  37. package/dist/assets/{WorksOnGrid-8fCnUzpQ.js → WorksOnGrid-dVy5M1Fj.js} +1 -1
  38. package/dist/assets/{abnfDiagram-YUKMZFIV-Boj-Bkbs.js → abnfDiagram-YUKMZFIV-DE2rjoCc.js} +1 -1
  39. package/dist/assets/{activity-MpAxS_kw.js → activity-8Dgeq15H.js} +1 -1
  40. package/dist/assets/{architectureDiagram-47P4ROYG-Cl-ocqce.js → architectureDiagram-47P4ROYG-DrIn6OKQ.js} +1 -1
  41. package/dist/assets/{blockDiagram-E7TT5TSB-0nSQiv6g.js → blockDiagram-E7TT5TSB-BQdVPMCR.js} +1 -1
  42. package/dist/assets/{c4Diagram-CRA5TL53-Cx9iymkb.js → c4Diagram-CRA5TL53-DFb8MJmm.js} +1 -1
  43. package/dist/assets/{calendar-days-DXHDRm_4.js → calendar-days-Bs4Es4HT.js} +1 -1
  44. package/dist/assets/channel-1lG6Uyuf.js +1 -0
  45. package/dist/assets/{chunk-2Q5K7J3B-0rIrumUG.js → chunk-2Q5K7J3B-BXaLRTO9.js} +1 -1
  46. package/dist/assets/{chunk-5VM5RSS4-w9e6iKvs.js → chunk-5VM5RSS4-Cie3uAC2.js} +1 -1
  47. package/dist/assets/{chunk-7TKQ45FW-c4KxVKkf.js → chunk-7TKQ45FW-Bw5vFHu9.js} +1 -1
  48. package/dist/assets/{chunk-AW2ZBBNX-DmaBcuOP.js → chunk-AW2ZBBNX-CkxRWzwT.js} +1 -1
  49. package/dist/assets/{chunk-FVRAUYC3-BLzfqLHR.js → chunk-FVRAUYC3-7FMS_2yS.js} +2 -2
  50. package/dist/assets/{chunk-HTAEGDNF-BN48XtBm.js → chunk-HTAEGDNF-DQ_kiZYj.js} +1 -1
  51. package/dist/assets/{chunk-JWPE2WC7-D2NACa6i.js → chunk-JWPE2WC7-DD4AjX_J.js} +1 -1
  52. package/dist/assets/{chunk-KQW6MTUR-CbAfnxxG.js → chunk-KQW6MTUR-DAs7Un1F.js} +1 -1
  53. package/dist/assets/{chunk-XXDRQBXY-Bwg-DPP_.js → chunk-XXDRQBXY-qEAG8aNp.js} +1 -1
  54. package/dist/assets/{classDiagram-v2-K4WV4PDN-Dh3ohoZp.js → classDiagram-v2-K4WV4PDN-SFDos9_W.js} +1 -1
  55. package/dist/assets/{coins-Bv8-qll4.js → coins-ni7p9MMO.js} +1 -1
  56. package/dist/assets/{core-DeJAGBXR.js → core-CMus8yJ9.js} +1 -1
  57. package/dist/assets/{cose-bilkent-JH36ORCC-DCHadn0L.js → cose-bilkent-JH36ORCC-BIvnumq9.js} +1 -1
  58. package/dist/assets/{cynefin-EF2NZ3EQ-ClpPPxUg.js → cynefin-EF2NZ3EQ-DEyZ973A.js} +1 -1
  59. package/dist/assets/{cynefinDiagram-3GCD6N5R-DZ5l7nkL.js → cynefinDiagram-3GCD6N5R-DIH2LA6q.js} +1 -1
  60. package/dist/assets/{dagre-W4DXFKR2-BagTvT62.js → dagre-W4DXFKR2-doItNion.js} +1 -1
  61. package/dist/assets/{diagram-2UJZ2QOL-DuByootb.js → diagram-2UJZ2QOL-DKfcZ3Fe.js} +1 -1
  62. package/dist/assets/{diagram-OVF4WLC6-BQ8Cvr0D.js → diagram-OVF4WLC6-BRnKWMs5.js} +1 -1
  63. package/dist/assets/{diagram-PFPMY2P6-D_pklaf9.js → diagram-PFPMY2P6-C3aLszxc.js} +1 -1
  64. package/dist/assets/{diagram-UMYRVEAY-1BuHq7tR.js → diagram-UMYRVEAY-DbMKM9Kw.js} +1 -1
  65. package/dist/assets/{diagram-YEKJPTXX-CK0cPx8n.js → diagram-YEKJPTXX-BqrhdTTX.js} +1 -1
  66. package/dist/assets/{diagram-ZIFT7M5P-DVzPho45.js → diagram-ZIFT7M5P-CYnUFm0_.js} +1 -1
  67. package/dist/assets/{ebnfDiagram-VR2GEFS7-D8UO_5sE.js → ebnfDiagram-VR2GEFS7-CnuOWBxY.js} +1 -1
  68. package/dist/assets/{elk-IJKZMXRS-BRigfR5V.js → elk-IJKZMXRS-BmtbqAAs.js} +1 -1
  69. package/dist/assets/{erDiagram-O2IAPWRE-CXHPobWj.js → erDiagram-O2IAPWRE-CL6oNmZD.js} +1 -1
  70. package/dist/assets/{file-up-CQezfdJk.js → file-up-DT7t5NXT.js} +1 -1
  71. package/dist/assets/{flowDiagram-OXPTDLAJ-CqKD6jh8.js → flowDiagram-OXPTDLAJ-CE9hfMoK.js} +1 -1
  72. package/dist/assets/{ganttDiagram-R7TSEDQI-C9FV3gsA.js → ganttDiagram-R7TSEDQI-DRU_A2cB.js} +1 -1
  73. package/dist/assets/{gitGraphDiagram-XJZIOB7I-CRu4dnr_.js → gitGraphDiagram-XJZIOB7I-BPkWYlKZ.js} +1 -1
  74. package/dist/assets/{import-name-dEG0japD.js → import-name-DutQXK90.js} +1 -1
  75. package/dist/assets/{index-COnd2OMZ.js → index-C6OVbzeZ.js} +2 -2
  76. package/dist/assets/{index-B4HW_T-k.js → index-CiYcp06m.js} +1 -1
  77. package/dist/assets/{infoDiagram-5W2HQ5XZ-CCRjb2CQ.js → infoDiagram-5W2HQ5XZ-C4SBhDtT.js} +1 -1
  78. package/dist/assets/{ishikawaDiagram-K3B6WC7H-TaNPsGZS.js → ishikawaDiagram-K3B6WC7H-3TlhKRsV.js} +1 -1
  79. package/dist/assets/{journeyDiagram-COXZFDF6-Dz7YIIc2.js → journeyDiagram-COXZFDF6-K9dyCbpb.js} +1 -1
  80. package/dist/assets/{kanban-definition-P3RFRI5V-Cg69Fpp8.js → kanban-definition-P3RFRI5V-Df8i0B0H.js} +1 -1
  81. package/dist/assets/{mcp-servers-Ih6dI7Ga.js → mcp-servers-xuxWmmEV.js} +1 -1
  82. package/dist/assets/{mermaid.core-DiG3LoLz.js → mermaid.core-Dj_sBsXx.js} +4 -4
  83. package/dist/assets/{mindmap-definition-LZFPQGKD-nxP4f0fq.js → mindmap-definition-LZFPQGKD-CuBxqBw1.js} +1 -1
  84. package/dist/assets/{minimize-B_k_fmmo.js → minimize-CuDlETLH.js} +1 -1
  85. package/dist/assets/{monitor-BfmnPU-I.js → monitor-DqFADU6d.js} +1 -1
  86. package/dist/assets/{new-bot-CQm0FPc5.js → new-bot-DoJRfwOC.js} +1 -1
  87. package/dist/assets/{org-library-C2li0IRL.js → org-library-B7nhJQxt.js} +1 -1
  88. package/dist/assets/{package-format-B3whu9DW.js → package-format-FvzPr9Xd.js} +1 -1
  89. package/dist/assets/{pegDiagram-BGZESJAR-gPjpGcNH.js → pegDiagram-BGZESJAR-BDWRqrLr.js} +1 -1
  90. package/dist/assets/{pieDiagram-CAPJLFHJ-Cgh25Z4_.js → pieDiagram-CAPJLFHJ-BByTBeRn.js} +1 -1
  91. package/dist/assets/{quadrantDiagram-GDMTTRAM-DD9luyqA.js → quadrantDiagram-GDMTTRAM-D0SI7j3Y.js} +1 -1
  92. package/dist/assets/{rail-B1mj4zlo.js → rail-BEOIK49V.js} +1 -1
  93. package/dist/assets/{railroadDiagram-SM67HX2B-CS_TYko7.js → railroadDiagram-SM67HX2B-Dz3tUGbx.js} +1 -1
  94. package/dist/assets/{remote-desktop-panel-DIllbP7i.js → remote-desktop-panel-DgZionIJ.js} +1 -1
  95. package/dist/assets/{requirementDiagram-X7JNWC4A-BePHia6E.js → requirementDiagram-X7JNWC4A-DrwqW7OV.js} +1 -1
  96. package/dist/assets/{sankeyDiagram-UM26HJRW-24ExCXGS.js → sankeyDiagram-UM26HJRW-95WqcM7l.js} +1 -1
  97. package/dist/assets/{sequenceDiagram-ZO4K6R2Y-Dtmx27I5.js → sequenceDiagram-ZO4K6R2Y-1zoh2EeE.js} +1 -1
  98. package/dist/assets/{sizeCapture-INFHLROL-2LvmoT1T.js → sizeCapture-INFHLROL-IzBNvZN8.js} +1 -1
  99. package/dist/assets/{stateDiagram-v2-TBUQTH76-moL2SIo9.js → stateDiagram-v2-TBUQTH76-CXdapkBV.js} +1 -1
  100. package/dist/assets/styles-CSArda2J.css +1 -0
  101. package/dist/assets/{swimlanes-N4OXWK64-D95Pk8qh.js → swimlanes-N4OXWK64-QK7_rFPB.js} +1 -1
  102. package/dist/assets/swimlanesDiagram-K3J5GTZL-B4Zj1xuq.js +8 -0
  103. package/dist/assets/{team-share-0GXKeixY.js → team-share-NJEAQGUX.js} +1 -1
  104. package/dist/assets/{timeline-definition-YOQAKGHF-HM-J25k2.js → timeline-definition-YOQAKGHF-MhSu-mD6.js} +1 -1
  105. package/dist/assets/{usecaseDiagram-VIAY4XPW-C6q6bCzJ.js → usecaseDiagram-VIAY4XPW-DdZIcDLN.js} +1 -1
  106. package/dist/assets/{vennDiagram-BLWOH2XV-hf0dh2yT.js → vennDiagram-BLWOH2XV-DDMi9wJz.js} +1 -1
  107. package/dist/assets/{wardleyDiagram-YMQ3BMBF-CpT_eRn9.js → wardleyDiagram-YMQ3BMBF-DrZpbJKY.js} +1 -1
  108. package/dist/assets/{xychartDiagram-TAQBALBS-D6g1V9DG.js → xychartDiagram-TAQBALBS-__UkZCKS.js} +1 -1
  109. package/dist/index.html +3 -3
  110. package/dist/rail.html +5 -5
  111. package/dist-server/index.js +307 -289
  112. package/dist-server/openmausbot.js +17 -16
  113. package/dist-server/package.json +1 -1
  114. package/dist-server/pair-cli.js +17 -16
  115. package/dist-server/server/index.js +2 -0
  116. package/dist-server/server/limix-skill-hub.js +264 -0
  117. package/dist-server/server/routes/bot-skills.js +11 -0
  118. package/package.json +1 -1
  119. package/dist/assets/SettingsModal-BpJhi2nc.js +0 -11
  120. package/dist/assets/channel-BStWWrSt.js +0 -1
  121. package/dist/assets/styles-bUbK33f1.css +0 -1
  122. package/dist/assets/swimlanesDiagram-K3J5GTZL-DByi9G3i.js +0 -8
  123. /package/dist/assets/{styles-6RbfQIY7.js → styles-Btbbe7r3.js} +0 -0
@@ -1864,7 +1864,7 @@ void 0)if(end===-1&&tokenChars[code]===1)start===-1&&(start=i);else if(i!==0&&(c
1864
1864
  x ${i}`);else if(isEscaping){if(tokenChars[code]!==1)throw new SyntaxError(`Unexpected character at index ${i}`);start===-1?start=i:mustUnescape||(mustUnescape=!0),isEscaping=!1}else if(inQuotes)if(tokenChars[code]===1)start===-1&&(start=i);else if(code===34&&start!==-1)inQuotes=!1,end=i;else if(code===92)isEscaping=!0;else throw new SyntaxError(`Unexpected character at index ${i}`);else if(code===34&&header3.charCodeAt(i-1)===61)inQuotes=!0;else if(end===-1&&tokenChars[code]===1)start===-1&&(start=
1865
1865
  i);else if(start!==-1&&(code===32||code===9))end===-1&&(end=i);else if(code===59||code===44){if(start===-1)throw new SyntaxError(`Unexpected character at index ${i}`);end===-1&&(end=i);let value3=header3.slice(start,end);mustUnescape&&(value3=value3.replace(/\\/g,""),mustUnescape=!1),push2(params2,paramName,value3),code===44&&(push2(offers,extensionName,params2),params2=Object.create(null),extensionName=void 0),paramName=void 0,start=end=-1}else throw new SyntaxError(`Unexpected character at ind\
1866
1866
  ex ${i}`);if(start===-1||inQuotes||code===32||code===9)throw new SyntaxError("Unexpected end of input");end===-1&&(end=i);let token3=header3.slice(start,end);return extensionName===void 0?push2(offers,token3,params2):(paramName===void 0?push2(params2,token3,!0):mustUnescape?push2(params2,paramName,token3.replace(/\\/g,"")):push2(params2,paramName,token3),push2(offers,extensionName,params2)),offers}function format6(extensions3){return Object.keys(extensions3).map(extension4=>{let configurations=extensions3[extension4];
1867
- return Array.isArray(configurations)||(configurations=[configurations]),configurations.map(params2=>[extension4].concat(Object.keys(params2).map(k3=>{let values4=params2[k3];return Array.isArray(values4)||(values4=[values4]),values4.map(v4=>v4===!0?k3:`${k3}=${v4}`).join("; ")})).join("; ")).join(", ")}).join(", ")}module.exports={format:format6,parse:parse17}}});var require_websocket=__commonJS({"node_modules/.pnpm/ws@8.22.0/node_modules/ws/lib/websocket.js"(exports,module){"use strict";var EventEmitter9=__require("events"),https3=__require("https"),http3=__require("http"),net10=__require("net"),tls5=__require("tls"),{randomBytes:randomBytes40,createHash:createHash129}=__require("crypto"),{Duplex:Duplex3,Readable:Readable2}=__require("stream"),{URL:URL3}=__require("url"),PerMessageDeflate2=require_permessage_deflate(),Receiver2=require_receiver(),Sender2=require_sender(),
1867
+ return Array.isArray(configurations)||(configurations=[configurations]),configurations.map(params2=>[extension4].concat(Object.keys(params2).map(k3=>{let values4=params2[k3];return Array.isArray(values4)||(values4=[values4]),values4.map(v4=>v4===!0?k3:`${k3}=${v4}`).join("; ")})).join("; ")).join(", ")}).join(", ")}module.exports={format:format6,parse:parse17}}});var require_websocket=__commonJS({"node_modules/.pnpm/ws@8.22.0/node_modules/ws/lib/websocket.js"(exports,module){"use strict";var EventEmitter9=__require("events"),https3=__require("https"),http3=__require("http"),net10=__require("net"),tls5=__require("tls"),{randomBytes:randomBytes40,createHash:createHash130}=__require("crypto"),{Duplex:Duplex3,Readable:Readable2}=__require("stream"),{URL:URL3}=__require("url"),PerMessageDeflate2=require_permessage_deflate(),Receiver2=require_receiver(),Sender2=require_sender(),
1868
1868
  {isBlob}=require_validation(),{BINARY_TYPES,CLOSE_TIMEOUT:CLOSE_TIMEOUT2,EMPTY_BUFFER,GUID,kForOnEventAttribute,kListener,kStatusCode,kWebSocket,NOOP}=require_constants(),{EventTarget:{addEventListener:addEventListener2,removeEventListener}}=require_event_target(),{format:format6,parse:parse17}=require_extension(),{toBuffer:toBuffer2}=require_buffer_util(),kAborted=Symbol("kAborted"),protocolVersions=[8,13],readyStates=["CONNECTING","OPEN","CLOSING","CLOSED"],subprotocolRegex=/^[!#$%&'*+\-.0-9A-Z^_`|a-z~]+$/,
1869
1869
  WebSocket3=class _WebSocket extends EventEmitter9{constructor(address3,protocols,options2){super(),this._binaryType=BINARY_TYPES[0],this._closeCode=1006,this._closeFrameReceived=!1,this._closeFrameSent=!1,this._closeMessage=EMPTY_BUFFER,this._closeTimer=null,this._errorEmitted=!1,this._extensions={},this._paused=!1,this._protocol="",this._readyState=_WebSocket.CONNECTING,this._receiver=null,this._sender=null,this._socket=null,address3!==null?(this._bufferedAmount=0,this._isServer=!1,this._redirects=
1870
1870
  0,protocols===void 0?!options2||options2.protocols===void 0?protocols=[]:Array.isArray(options2.protocols)?protocols=options2.protocols:protocols=[options2.protocols]:Array.isArray(protocols)||(typeof protocols=="object"&&protocols!==null?(options2=protocols,options2.protocols===void 0?protocols=[]:Array.isArray(options2.protocols)?protocols=options2.protocols:protocols=[options2.protocols]):protocols=[protocols]),initAsClient(this,address3,protocols,options2)):(this._autoPong=options2.autoPong,
@@ -1890,7 +1890,7 @@ new PerMessageDeflate2({...opts.perMessageDeflate,isServer:!1,maxPayload:opts.ma
1890
1890
  parsedUrl2.host;let headers=options2&&options2.headers;if(options2={...options2,headers:{}},headers)for(let[key8,value3]of Object.entries(headers))options2.headers[key8.toLowerCase()]=value3}else if(websocket.listenerCount("redirect")===0){let isSameHost=isIpcUrl?websocket._originalIpc?opts.socketPath===websocket._originalHostOrSocketPath:!1:websocket._originalIpc?!1:parsedUrl2.host===websocket._originalHostOrSocketPath;(!isSameHost||websocket._originalSecure&&!isSecure)&&(delete opts.headers.authorization,
1891
1891
  delete opts.headers.cookie,isSameHost||delete opts.headers.host,opts.auth=void 0)}opts.auth&&!options2.headers.authorization&&(options2.headers.authorization="Basic "+Buffer.from(opts.auth).toString("base64")),req=websocket._req=request9(opts),websocket._redirects&&websocket.emit("redirect",websocket.url,req)}else req=websocket._req=request9(opts);opts.timeout&&req.on("timeout",()=>{abortHandshake(websocket,req,"Opening handshake has timed out")}),req.on("error",err=>{req===null||req[kAborted]||
1892
1892
  (req=websocket._req=null,emitErrorAndClose(websocket,err))}),req.on("response",res=>{let location=res.headers.location,statusCode=res.statusCode;if(location&&opts.followRedirects&&statusCode>=300&&statusCode<400){if(++websocket._redirects>opts.maxRedirects){abortHandshake(websocket,req,"Maximum redirects exceeded");return}req.abort();let addr;try{addr=new URL3(location,address3)}catch{let err=new SyntaxError(`Invalid URL: ${location}`);emitErrorAndClose(websocket,err);return}initAsClient(websocket,
1893
- addr,protocols,options2)}else websocket.emit("unexpected-response",req,res)||abortHandshake(websocket,req,`Unexpected server response: ${res.statusCode}`)}),req.on("upgrade",(res,socket,head)=>{if(websocket.emit("upgrade",res),websocket.readyState!==WebSocket3.CONNECTING)return;req=websocket._req=null;let upgrade=res.headers.upgrade;if(upgrade===void 0||upgrade.toLowerCase()!=="websocket"){abortHandshake(websocket,socket,"Invalid Upgrade header");return}let digest5=createHash129("sha1").update(key7+
1893
+ addr,protocols,options2)}else websocket.emit("unexpected-response",req,res)||abortHandshake(websocket,req,`Unexpected server response: ${res.statusCode}`)}),req.on("upgrade",(res,socket,head)=>{if(websocket.emit("upgrade",res),websocket.readyState!==WebSocket3.CONNECTING)return;req=websocket._req=null;let upgrade=res.headers.upgrade;if(upgrade===void 0||upgrade.toLowerCase()!=="websocket"){abortHandshake(websocket,socket,"Invalid Upgrade header");return}let digest5=createHash130("sha1").update(key7+
1894
1894
  GUID).digest("base64");if(res.headers["sec-websocket-accept"]!==digest5){abortHandshake(websocket,socket,"Invalid Sec-WebSocket-Accept header");return}let serverProt=res.headers["sec-websocket-protocol"],protError;if(serverProt!==void 0?protocolSet.size?protocolSet.has(serverProt)||(protError="Server sent an invalid subprotocol"):protError="Server sent a subprotocol but none was requested":protocolSet.size&&(protError="Server sent no subprotocol"),protError){abortHandshake(websocket,socket,protError);
1895
1895
  return}serverProt&&(websocket._protocol=serverProt);let secWebSocketExtensions=res.headers["sec-websocket-extensions"];if(secWebSocketExtensions!==void 0){if(!perMessageDeflate){abortHandshake(websocket,socket,"Server sent a Sec-WebSocket-Extensions header but no extension was requested");return}let extensions3;try{extensions3=parse17(secWebSocketExtensions)}catch{abortHandshake(websocket,socket,"Invalid Sec-WebSocket-Extensions header");return}let extensionNames=Object.keys(extensions3);if(extensionNames.
1896
1896
  length!==1||extensionNames[0]!==PerMessageDeflate2.extensionName){abortHandshake(websocket,socket,"Server indicated an extension that was not requested");return}try{perMessageDeflate.accept(extensions3[PerMessageDeflate2.extensionName])}catch{abortHandshake(websocket,socket,"Invalid Sec-WebSocket-Extensions header");return}websocket._extensions[PerMessageDeflate2.extensionName]=perMessageDeflate}websocket.setSocket(socket,head,{allowSynchronousEvents:opts.allowSynchronousEvents,generateMask:opts.
@@ -1907,7 +1907,7 @@ let terminateOnDestroy=!0,duplex=new Duplex3({...options2,autoDestroy:!1,emitClo
1907
1907
  CLOSED){callback(err),process.nextTick(emitClose,duplex);return}let called=!1;ws3.once("error",function(err2){called=!0,callback(err2)}),ws3.once("close",function(){called||callback(err),process.nextTick(emitClose,duplex)}),terminateOnDestroy&&ws3.terminate()},duplex._final=function(callback){if(ws3.readyState===ws3.CONNECTING){ws3.once("open",function(){duplex._final(callback)});return}ws3._socket!==null&&(ws3._socket._writableState.finished?(callback(),duplex._readableState.endEmitted&&duplex.
1908
1908
  destroy()):(ws3._socket.once("finish",function(){callback()}),ws3.close()))},duplex._read=function(){ws3.isPaused&&ws3.resume()},duplex._write=function(chunk,encoding,callback){if(ws3.readyState===ws3.CONNECTING){ws3.once("open",function(){duplex._write(chunk,encoding,callback)});return}ws3.send(chunk,callback)},duplex.on("end",duplexOnEnd),duplex.on("error",duplexOnError),duplex}module.exports=createWebSocketStream2}});var require_subprotocol=__commonJS({"node_modules/.pnpm/ws@8.22.0/node_modules/ws/lib/subprotocol.js"(exports,module){"use strict";var{tokenChars}=require_validation();function parse17(header3){let protocols=new Set,start=-1,end=-1,i=0;for(i;i<header3.length;i++){let code=header3.charCodeAt(i);if(end===-1&&tokenChars[code]===1)start===-1&&(start=i);else if(i!==0&&(code===32||code===9))end===-1&&start!==-1&&(end=i);else if(code===44){if(start===-1)throw new SyntaxError(`Unexpected character at in\
1909
1909
  dex ${i}`);end===-1&&(end=i);let protocol2=header3.slice(start,end);if(protocols.has(protocol2))throw new SyntaxError(`The "${protocol2}" subprotocol is duplicated`);protocols.add(protocol2),start=end=-1}else throw new SyntaxError(`Unexpected character at index ${i}`)}if(start===-1||end!==-1)throw new SyntaxError("Unexpected end of input");let protocol=header3.slice(start,i);if(protocols.has(protocol))throw new SyntaxError(`The "${protocol}" subprotocol is duplicated`);return protocols.add(protocol),
1910
- protocols}module.exports={parse:parse17}}});var require_websocket_server=__commonJS({"node_modules/.pnpm/ws@8.22.0/node_modules/ws/lib/websocket-server.js"(exports,module){"use strict";var EventEmitter9=__require("events"),http3=__require("http"),{Duplex:Duplex3}=__require("stream"),{createHash:createHash129}=__require("crypto"),extension4=require_extension(),PerMessageDeflate2=require_permessage_deflate(),subprotocol2=require_subprotocol(),WebSocket3=require_websocket(),{CLOSE_TIMEOUT:CLOSE_TIMEOUT2,GUID,kWebSocket}=require_constants(),keyRegex=/^[+/0-9A-Za-z]{22}==$/,
1910
+ protocols}module.exports={parse:parse17}}});var require_websocket_server=__commonJS({"node_modules/.pnpm/ws@8.22.0/node_modules/ws/lib/websocket-server.js"(exports,module){"use strict";var EventEmitter9=__require("events"),http3=__require("http"),{Duplex:Duplex3}=__require("stream"),{createHash:createHash130}=__require("crypto"),extension4=require_extension(),PerMessageDeflate2=require_permessage_deflate(),subprotocol2=require_subprotocol(),WebSocket3=require_websocket(),{CLOSE_TIMEOUT:CLOSE_TIMEOUT2,GUID,kWebSocket}=require_constants(),keyRegex=/^[+/0-9A-Za-z]{22}==$/,
1911
1911
  RUNNING2=0,CLOSING=1,CLOSED=2,WebSocketServer2=class extends EventEmitter9{constructor(options2,callback){if(super(),options2={allowSynchronousEvents:!0,autoPong:!0,maxBufferedChunks:256*1024,maxFragments:16*1024,maxPayload:100*1024*1024,skipUTF8Validation:!1,perMessageDeflate:!1,handleProtocols:null,clientTracking:!0,closeTimeout:CLOSE_TIMEOUT2,verifyClient:null,noServer:!1,backlog:null,server:null,host:null,path:null,port:null,WebSocket:WebSocket3,...options2},options2.port==null&&!options2.server&&
1912
1912
  !options2.noServer||options2.port!=null&&(options2.server||options2.noServer)||options2.server&&options2.noServer)throw new TypeError('One and only one of the "port", "server", or "noServer" options must be specified');if(options2.port!=null?(this._server=http3.createServer((req,res)=>{let body2=http3.STATUS_CODES[426];res.writeHead(426,{"Content-Length":body2.length,"Content-Type":"text/plain"}),res.end(body2)}),this._server.listen(options2.port,options2.host,options2.backlog,callback)):options2.
1913
1913
  server&&(this._server=options2.server),this._server){let emitConnection=this.emit.bind(this,"connection");this._removeListeners=addListeners(this._server,{listening:this.emit.bind(this,"listening"),error:this.emit.bind(this,"error"),upgrade:(req,socket,head)=>{this.handleUpgrade(req,socket,head,emitConnection)}})}options2.perMessageDeflate===!0&&(options2.perMessageDeflate={}),options2.clientTracking&&(this.clients=new Set,this._shouldEmitClose=!1),this.options=options2,this._state=RUNNING2}address(){
@@ -1918,7 +1918,7 @@ this,req,socket,400,"Missing or invalid Sec-WebSocket-Version header",{"Sec-WebS
1918
1918
  cket-extensions"],extensions3={};if(this.options.perMessageDeflate&&secWebSocketExtensions!==void 0){let perMessageDeflate=new PerMessageDeflate2({...this.options.perMessageDeflate,isServer:!0,maxPayload:this.options.maxPayload});try{let offers=extension4.parse(secWebSocketExtensions);offers[PerMessageDeflate2.extensionName]&&(perMessageDeflate.accept(offers[PerMessageDeflate2.extensionName]),extensions3[PerMessageDeflate2.extensionName]=perMessageDeflate)}catch{abortHandshakeOrEmitwsClientError(
1919
1919
  this,req,socket,400,"Invalid or unacceptable Sec-WebSocket-Extensions header");return}}if(this.options.verifyClient){let info2={origin:req.headers[`${version5===8?"sec-websocket-origin":"origin"}`],secure:!!(req.socket.authorized||req.socket.encrypted),req};if(this.options.verifyClient.length===2){this.options.verifyClient(info2,(verified,code,message8,headers)=>{if(!verified)return abortHandshake(socket,code||401,message8,headers);this.completeUpgrade(extensions3,key7,protocols,req,socket,head,
1920
1920
  cb)});return}if(!this.options.verifyClient(info2))return abortHandshake(socket,401)}this.completeUpgrade(extensions3,key7,protocols,req,socket,head,cb)}completeUpgrade(extensions3,key7,protocols,req,socket,head,cb){if(!socket.readable||!socket.writable)return socket.destroy();if(socket[kWebSocket])throw new Error("server.handleUpgrade() was called more than once with the same socket, possibly due to a misconfiguration");if(this._state>RUNNING2)return abortHandshake(socket,503);let headers=["HTTP\
1921
- /1.1 101 Switching Protocols","Upgrade: websocket","Connection: Upgrade",`Sec-WebSocket-Accept: ${createHash129("sha1").update(key7+GUID).digest("base64")}`],ws3=new this.options.WebSocket(null,void 0,this.options);if(protocols.size){let protocol=this.options.handleProtocols?this.options.handleProtocols(protocols,req):protocols.values().next().value;protocol&&(headers.push(`Sec-WebSocket-Protocol: ${protocol}`),ws3._protocol=protocol)}if(extensions3[PerMessageDeflate2.extensionName]){let params2=extensions3[PerMessageDeflate2.
1921
+ /1.1 101 Switching Protocols","Upgrade: websocket","Connection: Upgrade",`Sec-WebSocket-Accept: ${createHash130("sha1").update(key7+GUID).digest("base64")}`],ws3=new this.options.WebSocket(null,void 0,this.options);if(protocols.size){let protocol=this.options.handleProtocols?this.options.handleProtocols(protocols,req):protocols.values().next().value;protocol&&(headers.push(`Sec-WebSocket-Protocol: ${protocol}`),ws3._protocol=protocol)}if(extensions3[PerMessageDeflate2.extensionName]){let params2=extensions3[PerMessageDeflate2.
1922
1922
  extensionName].params,value3=extension4.format({[PerMessageDeflate2.extensionName]:[params2]});headers.push(`Sec-WebSocket-Extensions: ${value3}`),ws3._extensions=extensions3}this.emit("headers",headers,req),socket.write(headers.concat(`\r
1923
1923
  `).join(`\r
1924
1924
  `)),socket.removeListener("error",socketOnError),ws3.setSocket(socket,head,{allowSynchronousEvents:this.options.allowSynchronousEvents,maxBufferedChunks:this.options.maxBufferedChunks,maxFragments:this.options.maxFragments,maxPayload:this.options.maxPayload,skipUTF8Validation:this.options.skipUTF8Validation}),this.clients&&(this.clients.add(ws3),ws3.on("close",()=>{this.clients.delete(ws3),this._shouldEmitClose&&!this.clients.size&&process.nextTick(emitClose,this)})),cb(ws3,req)}};module.exports=
@@ -4208,11 +4208,11 @@ botId,this.engine=engine}open(){if(!this.state){let opening=(this.closing??Promi
4208
4208
  join96(folder3,DATA_DB_FILE),settings),bot,panel;try{bot=await instance.connect(),panel=await instance.connect(),await bot.run(`CREATE SCHEMA IF NOT EXISTS ${DATA_RESULTS_SCHEMA}`);let keywords2=await bot.runAndReadAll("SELECT keyword_name FROM duckdb_keywords() WHERE keyword_category = 'reserved'"),reserved=new Set(keywords2.getRowsJson().map(row=>String(row[0]).toLowerCase()));return{binding,instance,lanes:{bot:new Lane(bot),panel:new Lane(panel)},reserved}}catch(error66){throw bot?.closeSync(),
4209
4209
  panel?.closeSync(),instance.closeSync(),error66}}touch(){this.idleTimer&&clearTimeout(this.idleTimer),this.idleTimer=setTimeout(()=>{this.idleTimer=null,this.inFlight>0?this.touch():this.close()},this.engine.idleMs),this.idleTimer.unref()}async statement(connection,sql,options2,work){this.inFlight++;try{let open14=await this.open();return await open14.lanes[connection].run(sql,options2,conn=>work(open14,conn))}catch(error66){if(error66 instanceof DataFailure&&error66.error.code==="table_not_foun\
4210
4210
  d"&&!error66.error.candidates){let wanted=missingTableName(error66.error.message);wanted&&(error66.error.candidates=await this.candidates(wanted).catch(()=>[]))}throw error66}finally{this.inFlight--,this.touch()}}cells(binding,chunk){let json7=binding.JsonDuckDBValueConverter;return chunk.convertRows((value3,type4)=>{if(value3===null)return null;if(type4.typeId===binding.DuckDBTypeId.BLOB)return`<blob ${value3.bytes.length} bytes>`;let converted=json7(value3,type4,json7);return converted!==null&&
4211
- typeof converted=="object"?JSON.stringify(converted):converted})}resultColumns(result2){return Array.from({length:result2.columnCount},(_3,i)=>({name:result2.columnName(i),type:result2.columnType(i).toString()}))}async read(open14,conn,sql,maxRows=1/0){let started2=performance.now(),result2=await conn.run(sql);result2.statementType!==open14.binding.StatementType.SELECT&&result2.statementType!==open14.binding.StatementType.EXPLAIN&&(this.statsCache.clear(),this.statsRevision++);let rows2=[];for(let i=0;i<
4212
- result2.chunkCount&&rows2.length<maxRows;i++)for(let row of this.cells(open14.binding,result2.getChunk(i))){if(rows2.length>=maxRows)break;rows2.push(row)}return{columns:this.resultColumns(result2),rows:rows2,rowCount:result2.rowCount,truncated:rows2.length<result2.rowCount,elapsedMs:Math.round(performance.now()-started2)}}async run(sql,options2){let maxRows=options2.maxRows===void 0?1/0:Math.max(0,options2.maxRows);return await this.loadExtensions(options2),this.statement(options2.connection,sql,
4211
+ typeof converted=="object"?JSON.stringify(converted):converted})}resultColumns(result2){return Array.from({length:result2.columnCount},(_3,i)=>({name:result2.columnName(i),type:result2.columnType(i).toString()}))}async read(open14,conn,sql,maxRows=1/0){let started3=performance.now(),result2=await conn.run(sql);result2.statementType!==open14.binding.StatementType.SELECT&&result2.statementType!==open14.binding.StatementType.EXPLAIN&&(this.statsCache.clear(),this.statsRevision++);let rows2=[];for(let i=0;i<
4212
+ result2.chunkCount&&rows2.length<maxRows;i++)for(let row of this.cells(open14.binding,result2.getChunk(i))){if(rows2.length>=maxRows)break;rows2.push(row)}return{columns:this.resultColumns(result2),rows:rows2,rowCount:result2.rowCount,truncated:rows2.length<result2.rowCount,elapsedMs:Math.round(performance.now()-started3)}}async run(sql,options2){let maxRows=options2.maxRows===void 0?1/0:Math.max(0,options2.maxRows);return await this.loadExtensions(options2),this.statement(options2.connection,sql,
4213
4213
  options2,(open14,conn)=>this.read(open14,conn,sql,maxRows))}async loadExtensions(options2){let extensions3=options2.extensions??[];if(!extensions3.length)return;let label4=extensions3.map(extension4=>`INSTALL ${extension4} FROM core`).join("; ");await this.statement(options2.connection,label4,{timeoutMs:EXTENSION_INSTALL_TIMEOUT_MS,signal:options2.signal},(_open,conn)=>loadExtensions(conn,extensions3))}async materialise(sql,name6,options2){if(!RESULT_NAME.test(name6))throw new DataFailure({code:"\
4214
- invalid_input",message:`Result name "${name6}" must be a plain identifier (letters, digits, underscore).`});let table3=`${DATA_RESULTS_SCHEMA}.${name6}`,body2=sql.trim().replace(/;+\s*$/,""),create5=`CREATE OR REPLACE TABLE ${table3} AS ${body2}`;return this.statement(options2.connection,sql,options2,async(open14,conn)=>{let started2=performance.now(),created=await this.read(open14,conn,create5),described=await this.read(open14,conn,`DESCRIBE ${table3}`);return{table:table3,columns:described.rows.
4215
- map(row=>({name:String(row[0]),type:String(row[1])})),rowCount:toCount(created.rows[0]?.[0]??0),elapsedMs:Math.round(performance.now()-started2)}})}async dropResult(name6,connection="bot"){if(!RESULT_NAME.test(name6))throw new DataFailure({code:"invalid_input",message:`Result name "${name6}" must be a plain identifier (letters, digits, underscore).`});let sql=`DROP TABLE IF EXISTS ${DATA_RESULTS_SCHEMA}.${name6}`;await this.statement(connection,sql,{},(open14,conn)=>this.read(open14,conn,sql))}async catalog(connection="\
4214
+ invalid_input",message:`Result name "${name6}" must be a plain identifier (letters, digits, underscore).`});let table3=`${DATA_RESULTS_SCHEMA}.${name6}`,body2=sql.trim().replace(/;+\s*$/,""),create5=`CREATE OR REPLACE TABLE ${table3} AS ${body2}`;return this.statement(options2.connection,sql,options2,async(open14,conn)=>{let started3=performance.now(),created=await this.read(open14,conn,create5),described=await this.read(open14,conn,`DESCRIBE ${table3}`);return{table:table3,columns:described.rows.
4215
+ map(row=>({name:String(row[0]),type:String(row[1])})),rowCount:toCount(created.rows[0]?.[0]??0),elapsedMs:Math.round(performance.now()-started3)}})}async dropResult(name6,connection="bot"){if(!RESULT_NAME.test(name6))throw new DataFailure({code:"invalid_input",message:`Result name "${name6}" must be a plain identifier (letters, digits, underscore).`});let sql=`DROP TABLE IF EXISTS ${DATA_RESULTS_SCHEMA}.${name6}`;await this.statement(connection,sql,{},(open14,conn)=>this.read(open14,conn,sql))}async catalog(connection="\
4216
4216
  panel"){let sql="SELECT table_schema, table_name, table_type FROM information_schema.tables WHERE table_catalog = current_database() AND table_schema NOT IN ('information_schema', 'pg_catalog') ORDER BY table_schema, table_name";return(await this.statement(connection,sql,{},(open14,conn)=>this.read(open14,conn,sql))).rows.map(row=>({schema:String(row[0]),name:String(row[1]),type:String(row[2])}))}displayName(entry2){return entry2.schema==="main"?entry2.name:`${entry2.schema}.${entry2.name}`}qualified(entry2,reserved){
4217
4217
  let part2=name6=>PLAIN_IDENTIFIER.test(name6)&&!reserved.has(name6)?name6:quoteIdentifier(name6);return`${part2(entry2.schema)}.${part2(entry2.name)}`}splitIdentifier(text30){let parts3=[],current3="",quoted5=!1;for(let i=0;i<text30.length;i++){let char=text30[i];char==='"'?quoted5&&text30[i+1]==='"'?(current3+='"',i++):quoted5=!quoted5:char==="."&&!quoted5?(parts3.push(current3),current3=""):current3+=char}return parts3.push(current3),parts3.map(part2=>part2.trim())}async lookup(name6){let parts3=this.
4218
4218
  splitIdentifier(name6.trim()).slice(-2),table3=parts3[parts3.length-1],schema4=parts3.length===2?parts3[0]:null;if(!table3)throw new DataFailure({code:"invalid_input",message:"A table name is required."});let entries4=await this.catalog(),inSchema=schema4?entries4.filter(entry2=>entry2.schema===schema4||entry2.schema.toLowerCase()===schema4.toLowerCase()):entries4,rank3=entry2=>entry2.schema==="main"?0:entry2.schema===DATA_RESULTS_SCHEMA?1:2,exact=inSchema.filter(entry2=>entry2.name===table3).sort(
@@ -10056,10 +10056,10 @@ event2)}}module.exports={register,registerBeforeExit,unregister}}});var require_
10056
10056
  pino-elasticsearch":"^9.0.0","sonic-boom":"^5.0.0","ts-node":"^10.8.0",tsd:"^0.33.0",typescript:"~5.7.3"},scripts:{build:"tsc --noEmit",lint:"eslint",test:'npm run lint && npm run build && npm run test:types && npm run transpile && borp --expose-gc --pattern "test/*.test.{js,mjs}"',"test:ci":'npm run lint && npm run test:types && npm run transpile && borp --expose-gc --pattern "test/*.test.{js,mjs}"',"test:types":"tsd","test:yarn":'npm run transpile && borp --expose-gc --pattern "test/*.test.js"',
10057
10057
  transpile:"sh ./test/ts/transpile.sh"},tsd:{directory:"test/types"},repository:{type:"git",url:"git+https://github.com/mcollina/thread-stream.git"},keywords:["worker","thread","threads","stream"],author:"Matteo Collina <hello@matteocollina.com>",license:"MIT",bugs:{url:"https://github.com/mcollina/thread-stream/issues"},homepage:"https://github.com/mcollina/thread-stream#readme"}}});var require_wait=__commonJS({"node_modules/.pnpm/thread-stream@4.2.1/node_modules/thread-stream/lib/wait.js"(exports,module){"use strict";function wait2(state,index4,expected,timeout3,done){let max4=timeout3===1/0?1/0:Date.now()+timeout3,check4=previous2=>{let current3=Atomics.load(state,index4);if(current3>=expected){done(null,"ok");return}if(previous2!==void 0&&current3!==previous2){done(null,"not-equal");return}if(max4!==1/0&&Date.now()>max4){done(null,"timed-out");return}let remaining2=max4===
10058
10058
  1/0?1e4:Math.min(1e4,Math.max(1,max4-Date.now())),result2=Atomics.waitAsync(state,index4,current3,remaining2);result2.async?result2.value.then(res=>{if(res==="ok"){let latest=Atomics.load(state,index4);done(null,latest>=expected?"ok":"not-equal");return}check4(current3)}):setImmediate(done,null,"not-equal")};check4()}function waitDiff(state,index4,expected,timeout3,done){let max4=timeout3===1/0?1/0:Date.now()+timeout3,check4=()=>{if(Atomics.load(state,index4)!==expected){done(null,"ok");return}if(max4!==
10059
- 1/0&&Date.now()>max4){done(null,"timed-out");return}let remaining2=max4===1/0?1e4:Math.min(1e4,Math.max(1,max4-Date.now())),result2=Atomics.waitAsync(state,index4,expected,remaining2);result2.async?result2.value.then(res=>{if(res==="ok"){done(null,"ok");return}check4()}):setImmediate(check4)};check4()}module.exports={wait:wait2,waitDiff}}});var require_indexes=__commonJS({"node_modules/.pnpm/thread-stream@4.2.1/node_modules/thread-stream/lib/indexes.js"(exports,module){"use strict";module.exports={WRITE_INDEX:4,READ_INDEX:8,SEQ_INDEX:2}}});var require_thread_stream=__commonJS({"node_modules/.pnpm/thread-stream@4.2.1/node_modules/thread-stream/index.js"(exports,module){"use strict";var{version:version5}=require_package(),{EventEmitter:EventEmitter9}=__require("events"),{Worker:Worker3}=__require("worker_threads"),{join:join278}=__require("path"),{pathToFileURL:pathToFileURL3}=__require("url"),{wait:wait2}=require_wait(),{WRITE_INDEX,READ_INDEX,SEQ_INDEX}=require_indexes(),buffer=__require("buffer"),assert3=__require("assert"),kImpl=Symbol(
10059
+ 1/0&&Date.now()>max4){done(null,"timed-out");return}let remaining2=max4===1/0?1e4:Math.min(1e4,Math.max(1,max4-Date.now())),result2=Atomics.waitAsync(state,index4,expected,remaining2);result2.async?result2.value.then(res=>{if(res==="ok"){done(null,"ok");return}check4()}):setImmediate(check4)};check4()}module.exports={wait:wait2,waitDiff}}});var require_indexes=__commonJS({"node_modules/.pnpm/thread-stream@4.2.1/node_modules/thread-stream/lib/indexes.js"(exports,module){"use strict";module.exports={WRITE_INDEX:4,READ_INDEX:8,SEQ_INDEX:2}}});var require_thread_stream=__commonJS({"node_modules/.pnpm/thread-stream@4.2.1/node_modules/thread-stream/index.js"(exports,module){"use strict";var{version:version5}=require_package(),{EventEmitter:EventEmitter9}=__require("events"),{Worker:Worker3}=__require("worker_threads"),{join:join279}=__require("path"),{pathToFileURL:pathToFileURL3}=__require("url"),{wait:wait2}=require_wait(),{WRITE_INDEX,READ_INDEX,SEQ_INDEX}=require_indexes(),buffer=__require("buffer"),assert3=__require("assert"),kImpl=Symbol(
10060
10060
  "kImpl"),MAX_STRING2=buffer.constants.MAX_STRING_LENGTH;function noop8(){}function updateState(stream2,fn){Atomics.add(stream2[kImpl].state,SEQ_INDEX,1),fn(),Atomics.add(stream2[kImpl].state,SEQ_INDEX,1),Atomics.notify(stream2[kImpl].state,SEQ_INDEX)}function resetIndexes(stream2){updateState(stream2,()=>{Atomics.store(stream2[kImpl].state,READ_INDEX,0),Atomics.store(stream2[kImpl].state,WRITE_INDEX,0)}),Atomics.notify(stream2[kImpl].state,READ_INDEX)}var FakeWeakRef=class{constructor(value3){this.
10061
10061
  _value=value3}deref(){return this._value}},FakeFinalizationRegistry=class{register(){}unregister(){}},FinalizationRegistry2=process.env.NODE_V8_COVERAGE?FakeFinalizationRegistry:global.FinalizationRegistry||FakeFinalizationRegistry,WeakRef2=process.env.NODE_V8_COVERAGE?FakeWeakRef:global.WeakRef||FakeWeakRef,registry3=new FinalizationRegistry2(worker=>{worker.exited||worker.terminate()});function createWorker(stream2,opts){let{filename,workerData}=opts,toExecute=("__bundlerPathsOverrides"in globalThis?
10062
- globalThis.__bundlerPathsOverrides:{})["thread-stream-worker"]||join278(__dirname,"lib","worker.js"),worker=new Worker3(toExecute,{...opts.workerOpts,name:opts.workerOpts?.name||"thread-stream",trackUnmanagedFds:!1,workerData:{filename:filename.indexOf("file://")===0?filename:pathToFileURL3(filename).href,dataBuf:stream2[kImpl].dataBuf,stateBuf:stream2[kImpl].stateBuf,workerData:{$context:{threadStreamVersion:version5},...workerData}}});return worker.stream=new FakeWeakRef(stream2),worker.on("me\
10062
+ globalThis.__bundlerPathsOverrides:{})["thread-stream-worker"]||join279(__dirname,"lib","worker.js"),worker=new Worker3(toExecute,{...opts.workerOpts,name:opts.workerOpts?.name||"thread-stream",trackUnmanagedFds:!1,workerData:{filename:filename.indexOf("file://")===0?filename:pathToFileURL3(filename).href,dataBuf:stream2[kImpl].dataBuf,stateBuf:stream2[kImpl].stateBuf,workerData:{$context:{threadStreamVersion:version5},...workerData}}});return worker.stream=new FakeWeakRef(stream2),worker.on("me\
10063
10063
  ssage",onWorkerMessage),worker.on("exit",onWorkerExit),registry3.register(stream2,worker),worker}function drain3(stream2){assert3(!stream2[kImpl].sync),stream2[kImpl].needDrain&&(stream2[kImpl].needDrain=!1,stream2.emit("drain"))}function nextFlush(stream2){for(;;){let writeIndex2=Atomics.load(stream2[kImpl].state,WRITE_INDEX);if(stream2.destroyed||writeIndex2<0)return;let leftover=stream2[kImpl].data.length-writeIndex2;if(leftover>0){if(stream2[kImpl].bufLen===0){stream2[kImpl].flushing=!1,stream2[kImpl].
10064
10064
  ending?end(stream2):stream2[kImpl].needDrain&&process.nextTick(drain3,stream2);return}write4(stream2,leftover,noop8);continue}if(leftover===0){if(writeIndex2===0&&stream2[kImpl].bufLen===0)return;waitForRead(stream2,()=>{stream2.destroyed||(resetIndexes(stream2),nextFlush(stream2))});return}destroy(stream2,new Error("overwritten"));return}}function onWorkerMessage(msg){let stream2=this.stream.deref();if(stream2===void 0){this.exited=!0,this.terminate();return}if(msg?.code!=null)switch(msg.code){case"\
10065
10065
  READY":stream2[kImpl].ending||(this.stream=new WeakRef2(stream2)),waitForRead(stream2,()=>{stream2[kImpl].ready=!0,stream2.emit("ready")});break;case"ERROR":destroy(stream2,msg.err);break;case"EVENT":Array.isArray(msg.args)?stream2.emit(msg.name,...msg.args):stream2.emit(msg.name,msg.args);break;case"FLUSHED":{if(msg.context!=="thread-stream"){destroy(stream2,new Error("this should not happen: "+msg.code));break}let cb=stream2[kImpl].flushCallbacks.get(msg.id);cb&&(stream2[kImpl].flushCallbacks.
@@ -10078,15 +10078,15 @@ for(;remaining2>0&&stream2[kImpl].bufLen!==0;){let head=stream2[kImpl].bufHead,b
10078
10078
  bufHead),stream2[kImpl].bufHead=0);continue}buf.copy(stream2[kImpl].data,offset4,0,remaining2),stream2[kImpl].buf[head]=buf.subarray(remaining2),stream2[kImpl].bufLen-=remaining2,offset4+=remaining2,remaining2=0}return updateState(stream2,()=>{Atomics.store(stream2[kImpl].state,WRITE_INDEX,offset4)}),cb(),!0}function end(stream2){if(!(stream2[kImpl].ended||!stream2[kImpl].ending||stream2[kImpl].flushing)){stream2[kImpl].ended=!0;try{stream2.flushSync();let readIndex=Atomics.load(stream2[kImpl].state,
10079
10079
  READ_INDEX);updateState(stream2,()=>{Atomics.store(stream2[kImpl].state,WRITE_INDEX,-1)});let spins=0;for(;readIndex!==-1;){if(Atomics.wait(stream2[kImpl].state,READ_INDEX,readIndex,1e3),readIndex=Atomics.load(stream2[kImpl].state,READ_INDEX),readIndex===-2){destroy(stream2,new Error("end() failed"));return}if(++spins===10){destroy(stream2,new Error("end() took too long (10s)"));return}}process.nextTick(()=>{stream2[kImpl].finished=!0,stream2.emit("finish")})}catch(err){destroy(stream2,err)}}}function writeSync6(stream2){
10080
10080
  let cb=()=>{stream2[kImpl].ending?end(stream2):stream2[kImpl].needDrain&&process.nextTick(drain3,stream2)};for(stream2[kImpl].flushing=!1;stream2[kImpl].bufLen!==0;){let writeIndex2=Atomics.load(stream2[kImpl].state,WRITE_INDEX);if(writeIndex2<0)throw new Error("_writeSync failed");let leftover=stream2[kImpl].data.length-writeIndex2;if(leftover===0){flushSync(stream2),resetIndexes(stream2);continue}else if(leftover<0)throw new Error("overwritten");write4(stream2,leftover,cb)}}function flushSync(stream2){
10081
- if(stream2[kImpl].flushing)throw new Error("unable to flush while flushing");let writeIndex2=Atomics.load(stream2[kImpl].state,WRITE_INDEX),spins=0;for(;;){let readIndex=Atomics.load(stream2[kImpl].state,READ_INDEX);if(readIndex===-2)throw Error("_flushSync failed");if(readIndex!==writeIndex2)Atomics.wait(stream2[kImpl].state,READ_INDEX,readIndex,1e3);else break;if(++spins===10)throw new Error("_flushSync took too long (10s)")}}module.exports=ThreadStream}});var require_transport=__commonJS({"node_modules/.pnpm/pino@10.3.1/node_modules/pino/lib/transport.js"(exports,module){"use strict";var{createRequire:createRequire2}=__require("module"),{existsSync:existsSync99}=__require("node:fs"),getCallers=require_caller(),{join:join278,isAbsolute:isAbsolute42,sep:sep17}=__require("node:path"),{fileURLToPath:fileURLToPath4}=__require("node:url"),sleep7=require_atomic_sleep(),onExit=require_on_exit_leak_free(),ThreadStream=require_thread_stream();function setupOnExit(stream2){
10081
+ if(stream2[kImpl].flushing)throw new Error("unable to flush while flushing");let writeIndex2=Atomics.load(stream2[kImpl].state,WRITE_INDEX),spins=0;for(;;){let readIndex=Atomics.load(stream2[kImpl].state,READ_INDEX);if(readIndex===-2)throw Error("_flushSync failed");if(readIndex!==writeIndex2)Atomics.wait(stream2[kImpl].state,READ_INDEX,readIndex,1e3);else break;if(++spins===10)throw new Error("_flushSync took too long (10s)")}}module.exports=ThreadStream}});var require_transport=__commonJS({"node_modules/.pnpm/pino@10.3.1/node_modules/pino/lib/transport.js"(exports,module){"use strict";var{createRequire:createRequire2}=__require("module"),{existsSync:existsSync100}=__require("node:fs"),getCallers=require_caller(),{join:join279,isAbsolute:isAbsolute42,sep:sep17}=__require("node:path"),{fileURLToPath:fileURLToPath4}=__require("node:url"),sleep7=require_atomic_sleep(),onExit=require_on_exit_leak_free(),ThreadStream=require_thread_stream();function setupOnExit(stream2){
10082
10082
  onExit.register(stream2,autoEnd),onExit.registerBeforeExit(stream2,flush),stream2.on("close",function(){onExit.unregister(stream2)})}function hasPreloadFlags(){let execArgv=process.execArgv;for(let i=0;i<execArgv.length;i++){let arg=execArgv[i];if(arg==="--import"||arg==="--require"||arg==="-r"||arg.startsWith("--import=")||arg.startsWith("--require=")||arg.startsWith("-r="))return!0}return!1}function sanitizeNodeOptions(nodeOptions){let tokens=nodeOptions.match(/(?:[^\s"']+|"[^"]*"|'[^']*')+/g);
10083
10083
  if(!tokens)return nodeOptions;let sanitized=[],changed3=!1;for(let i=0;i<tokens.length;i++){let token3=tokens[i];if(token3==="--require"||token3==="-r"||token3==="--import"){let next=tokens[i+1];if(next&&shouldDropPreload(next)){changed3=!0,i++;continue}sanitized.push(token3),next&&(sanitized.push(next),i++);continue}if(token3.startsWith("--require=")||token3.startsWith("-r=")||token3.startsWith("--import=")){let value3=token3.slice(token3.indexOf("=")+1);if(shouldDropPreload(value3)){changed3=!0;
10084
- continue}}sanitized.push(token3)}return changed3?sanitized.join(" "):nodeOptions}function shouldDropPreload(value3){let unquoted=stripQuotes2(value3);if(!unquoted)return!1;let path6=unquoted;if(path6.startsWith("file://"))try{path6=fileURLToPath4(path6)}catch{return!1}return isAbsolute42(path6)&&!existsSync99(path6)}function stripQuotes2(value3){let first2=value3[0],last=value3[value3.length-1];return first2==='"'&&last==='"'||first2==="'"&&last==="'"?value3.slice(1,-1):value3}function buildStream(filename,workerData,workerOpts,sync,name6){
10084
+ continue}}sanitized.push(token3)}return changed3?sanitized.join(" "):nodeOptions}function shouldDropPreload(value3){let unquoted=stripQuotes2(value3);if(!unquoted)return!1;let path6=unquoted;if(path6.startsWith("file://"))try{path6=fileURLToPath4(path6)}catch{return!1}return isAbsolute42(path6)&&!existsSync100(path6)}function stripQuotes2(value3){let first2=value3[0],last=value3[value3.length-1];return first2==='"'&&last==='"'||first2==="'"&&last==="'"?value3.slice(1,-1):value3}function buildStream(filename,workerData,workerOpts,sync,name6){
10085
10085
  if(!workerOpts.execArgv&&hasPreloadFlags()&&__require.main===void 0&&(workerOpts={...workerOpts,execArgv:[]}),!workerOpts.env&&process.env.NODE_OPTIONS){let nodeOptions=sanitizeNodeOptions(process.env.NODE_OPTIONS);nodeOptions!==process.env.NODE_OPTIONS&&(workerOpts={...workerOpts,env:{...process.env,NODE_OPTIONS:nodeOptions}})}workerOpts={...workerOpts,name:name6};let stream2=new ThreadStream({filename,workerData,workerOpts,sync});stream2.on("ready",onReady),stream2.on("close",function(){process.
10086
10086
  removeListener("exit",onExit2)}),process.on("exit",onExit2);function onReady(){process.removeListener("exit",onExit2),stream2.unref(),workerOpts.autoEnd!==!1&&setupOnExit(stream2)}function onExit2(){stream2.closed||(stream2.flushSync(),sleep7(100),stream2.end())}return stream2}function autoEnd(stream2){stream2.ref(),stream2.flushSync(),stream2.end(),stream2.once("close",function(){stream2.unref()})}function flush(stream2){stream2.flushSync()}function transport(fullOptions){let{pipeline:pipeline10,
10087
10087
  targets,levels:levels2,dedupe,worker={},caller=getCallers(),sync=!1}=fullOptions,options2={...fullOptions.options},callers=typeof caller=="string"?[caller]:caller,bundlerOverrides=typeof globalThis=="object"&&Object.prototype.hasOwnProperty.call(globalThis,"__bundlerPathsOverrides")&&globalThis.__bundlerPathsOverrides&&typeof globalThis.__bundlerPathsOverrides=="object"?globalThis.__bundlerPathsOverrides:Object.create(null),target4=fullOptions.target;if(target4&&targets)throw new Error("only one\
10088
- of target or targets can be specified");targets?(target4=bundlerOverrides["pino-worker"]||join278(__dirname,"worker.js"),options2.targets=targets.filter(dest=>dest.target).map(dest=>({...dest,target:fixTarget(dest.target)})),options2.pipelines=targets.filter(dest=>dest.pipeline).map(dest=>dest.pipeline.map(t=>({...t,level:dest.level,target:fixTarget(t.target)})))):pipeline10&&(target4=bundlerOverrides["pino-worker"]||join278(__dirname,"worker.js"),options2.pipelines=[pipeline10.map(dest=>({...dest,
10089
- target:fixTarget(dest.target)}))]),levels2&&(options2.levels=levels2),dedupe&&(options2.dedupe=dedupe),options2.pinoWillSendConfig=!0;let name6=targets||pipeline10?"pino.transport":target4;return buildStream(fixTarget(target4),options2,worker,sync,name6);function fixTarget(origin2){if(origin2=bundlerOverrides[origin2]||origin2,isAbsolute42(origin2)||origin2.indexOf("file://")===0)return origin2;if(origin2==="pino/file")return join278(__dirname,"..","file.js");let fixTarget2;for(let filePath2 of callers)
10088
+ of target or targets can be specified");targets?(target4=bundlerOverrides["pino-worker"]||join279(__dirname,"worker.js"),options2.targets=targets.filter(dest=>dest.target).map(dest=>({...dest,target:fixTarget(dest.target)})),options2.pipelines=targets.filter(dest=>dest.pipeline).map(dest=>dest.pipeline.map(t=>({...t,level:dest.level,target:fixTarget(t.target)})))):pipeline10&&(target4=bundlerOverrides["pino-worker"]||join279(__dirname,"worker.js"),options2.pipelines=[pipeline10.map(dest=>({...dest,
10089
+ target:fixTarget(dest.target)}))]),levels2&&(options2.levels=levels2),dedupe&&(options2.dedupe=dedupe),options2.pinoWillSendConfig=!0;let name6=targets||pipeline10?"pino.transport":target4;return buildStream(fixTarget(target4),options2,worker,sync,name6);function fixTarget(origin2){if(origin2=bundlerOverrides[origin2]||origin2,isAbsolute42(origin2)||origin2.indexOf("file://")===0)return origin2;if(origin2==="pino/file")return join279(__dirname,"..","file.js");let fixTarget2;for(let filePath2 of callers)
10090
10090
  try{let context3=filePath2==="node:repl"?process.cwd()+sep17:filePath2;fixTarget2=createRequire2(context3).resolve(origin2);break}catch{continue}if(!fixTarget2)throw new Error(`unable to determine transport target for "${origin2}"`);return fixTarget2}}module.exports=transport}});var require_tools=__commonJS({"node_modules/.pnpm/pino@10.3.1/node_modules/pino/lib/tools.js"(exports,module){"use strict";var diagChan=__require("node:diagnostics_channel"),format6=require_quick_format_unescaped(),{mapHttpRequest,mapHttpResponse}=require_pino_std_serializers(),SonicBoom=require_sonic_boom(),onExit=require_on_exit_leak_free(),{lsCacheSym,chindingsSym,writeSym,serializersSym,formatOptsSym,endSym,stringifiersSym,stringifySym,stringifySafeSym,wildcardFirstSym,nestedKeySym,formattersSym,
10091
10091
  messageKeySym,errorKeySym,nestedKeyStrSym,msgPrefixSym}=require_symbols2(),{isMainThread}=__require("worker_threads"),transport=require_transport(),[nodeMajor]=process.versions.node.split(".").map(v4=>Number(v4)),asJsonChan=diagChan.tracingChannel("pino_asJson"),asString=nodeMajor>=25?str=>JSON.stringify(str):_asString;function noop8(){}function genLog(level,hook){if(!hook)return LOG;return function(...args){hook.call(this,args,LOG,level)};function LOG(o,...n){if(typeof o=="object"){let msg=o;o!==
10092
10092
  null&&(o.method&&o.headers&&o.socket?o=mapHttpRequest(o):typeof o.setHeader=="function"&&(o=mapHttpResponse(o)));let formatParams;msg===null&&n.length===0?formatParams=[null]:(msg=n.shift(),formatParams=n),typeof this[msgPrefixSym]=="string"&&msg!==void 0&&msg!==null&&(msg=this[msgPrefixSym]+msg),this[writeSym](o,format6(msg,formatParams,this[formatOptsSym]),level)}else{let msg=o===void 0?n.shift():o;typeof this[msgPrefixSym]=="string"&&msg!==void 0&&msg!==null&&(msg=this[msgPrefixSym]+msg),this[writeSym](
@@ -10129,30 +10129,30 @@ if(hasOwnProperty3.call(options2,"deterministic")&&(value3=options2.deterministi
10129
10129
  items`}function getUniqueReplacerSet(replacerArray){let replacerSet=new Set;for(let value3 of replacerArray)(typeof value3=="string"||typeof value3=="number")&&replacerSet.add(String(value3));return replacerSet}function getStrictOption(options2){if(hasOwnProperty3.call(options2,"strict")){let value3=options2.strict;if(typeof value3!="boolean")throw new TypeError('The "strict" argument must be of type boolean');if(value3)return value4=>{let message8=`Object can not safely be stringified. Receive\
10130
10130
  d type ${typeof value4}`;throw typeof value4!="function"&&(message8+=` (${value4.toString()})`),new Error(message8)}}}function configure2(options2){options2={...options2};let fail14=getStrictOption(options2);fail14&&(options2.bigint===void 0&&(options2.bigint=!1),"circularValue"in options2||(options2.circularValue=Error));let circularValue=getCircularValueOption(options2),bigint4=getBooleanOption(options2,"bigint"),deterministic=getDeterministicOption(options2),comparator2=typeof deterministic==
10131
10131
  "function"?deterministic:void 0,maximumDepth=getPositiveIntegerOption(options2,"maximumDepth"),maximumBreadth=getPositiveIntegerOption(options2,"maximumBreadth");function stringifyFnReplacer(key7,parent2,stack2,replacer,spacer,indentation){let value3=parent2[key7];switch(typeof value3=="object"&&value3!==null&&typeof value3.toJSON=="function"&&(value3=value3.toJSON(key7)),value3=replacer.call(parent2,key7,value3),typeof value3){case"string":return strEscape(value3);case"object":{if(value3===null)
10132
- return"null";if(stack2.indexOf(value3)!==-1)return circularValue;let res="",join278=",",originalIndentation=indentation;if(Array.isArray(value3)){if(value3.length===0)return"[]";if(maximumDepth<stack2.length+1)return'"[Array]"';stack2.push(value3),spacer!==""&&(indentation+=spacer,res+=`
10133
- ${indentation}`,join278=`,
10134
- ${indentation}`);let maximumValuesToStringify=Math.min(value3.length,maximumBreadth),i=0;for(;i<maximumValuesToStringify-1;i++){let tmp2=stringifyFnReplacer(String(i),value3,stack2,replacer,spacer,indentation);res+=tmp2!==void 0?tmp2:"null",res+=join278}let tmp=stringifyFnReplacer(String(i),value3,stack2,replacer,spacer,indentation);if(res+=tmp!==void 0?tmp:"null",value3.length-1>maximumBreadth){let removedKeys=value3.length-maximumBreadth-1;res+=`${join278}"... ${getItemCount(removedKeys)} not \
10132
+ return"null";if(stack2.indexOf(value3)!==-1)return circularValue;let res="",join279=",",originalIndentation=indentation;if(Array.isArray(value3)){if(value3.length===0)return"[]";if(maximumDepth<stack2.length+1)return'"[Array]"';stack2.push(value3),spacer!==""&&(indentation+=spacer,res+=`
10133
+ ${indentation}`,join279=`,
10134
+ ${indentation}`);let maximumValuesToStringify=Math.min(value3.length,maximumBreadth),i=0;for(;i<maximumValuesToStringify-1;i++){let tmp2=stringifyFnReplacer(String(i),value3,stack2,replacer,spacer,indentation);res+=tmp2!==void 0?tmp2:"null",res+=join279}let tmp=stringifyFnReplacer(String(i),value3,stack2,replacer,spacer,indentation);if(res+=tmp!==void 0?tmp:"null",value3.length-1>maximumBreadth){let removedKeys=value3.length-maximumBreadth-1;res+=`${join279}"... ${getItemCount(removedKeys)} not \
10135
10135
  stringified"`}return spacer!==""&&(res+=`
10136
- ${originalIndentation}`),stack2.pop(),`[${res}]`}let keys5=Object.keys(value3),keyLength=keys5.length;if(keyLength===0)return"{}";if(maximumDepth<stack2.length+1)return'"[Object]"';let whitespace="",separator="";spacer!==""&&(indentation+=spacer,join278=`,
10137
- ${indentation}`,whitespace=" ");let maximumPropertiesToStringify=Math.min(keyLength,maximumBreadth);deterministic&&!isTypedArrayWithEntries(value3)&&(keys5=sort3(keys5,comparator2)),stack2.push(value3);for(let i=0;i<maximumPropertiesToStringify;i++){let key8=keys5[i],tmp=stringifyFnReplacer(key8,value3,stack2,replacer,spacer,indentation);tmp!==void 0&&(res+=`${separator}${strEscape(key8)}:${whitespace}${tmp}`,separator=join278)}if(keyLength>maximumBreadth){let removedKeys=keyLength-maximumBreadth;
10138
- res+=`${separator}"...":${whitespace}"${getItemCount(removedKeys)} not stringified"`,separator=join278}return spacer!==""&&separator.length>1&&(res=`
10136
+ ${originalIndentation}`),stack2.pop(),`[${res}]`}let keys5=Object.keys(value3),keyLength=keys5.length;if(keyLength===0)return"{}";if(maximumDepth<stack2.length+1)return'"[Object]"';let whitespace="",separator="";spacer!==""&&(indentation+=spacer,join279=`,
10137
+ ${indentation}`,whitespace=" ");let maximumPropertiesToStringify=Math.min(keyLength,maximumBreadth);deterministic&&!isTypedArrayWithEntries(value3)&&(keys5=sort3(keys5,comparator2)),stack2.push(value3);for(let i=0;i<maximumPropertiesToStringify;i++){let key8=keys5[i],tmp=stringifyFnReplacer(key8,value3,stack2,replacer,spacer,indentation);tmp!==void 0&&(res+=`${separator}${strEscape(key8)}:${whitespace}${tmp}`,separator=join279)}if(keyLength>maximumBreadth){let removedKeys=keyLength-maximumBreadth;
10138
+ res+=`${separator}"...":${whitespace}"${getItemCount(removedKeys)} not stringified"`,separator=join279}return spacer!==""&&separator.length>1&&(res=`
10139
10139
  ${indentation}${res}
10140
10140
  ${originalIndentation}`),stack2.pop(),`{${res}}`}case"number":return isFinite(value3)?String(value3):fail14?fail14(value3):"null";case"boolean":return value3===!0?"true":"false";case"undefined":return;case"bigint":if(bigint4)return String(value3);default:return fail14?fail14(value3):void 0}}function stringifyArrayReplacer(key7,value3,stack2,replacer,spacer,indentation){switch(typeof value3=="object"&&value3!==null&&typeof value3.toJSON=="function"&&(value3=value3.toJSON(key7)),typeof value3){case"\
10141
- string":return strEscape(value3);case"object":{if(value3===null)return"null";if(stack2.indexOf(value3)!==-1)return circularValue;let originalIndentation=indentation,res="",join278=",";if(Array.isArray(value3)){if(value3.length===0)return"[]";if(maximumDepth<stack2.length+1)return'"[Array]"';stack2.push(value3),spacer!==""&&(indentation+=spacer,res+=`
10142
- ${indentation}`,join278=`,
10143
- ${indentation}`);let maximumValuesToStringify=Math.min(value3.length,maximumBreadth),i=0;for(;i<maximumValuesToStringify-1;i++){let tmp2=stringifyArrayReplacer(String(i),value3[i],stack2,replacer,spacer,indentation);res+=tmp2!==void 0?tmp2:"null",res+=join278}let tmp=stringifyArrayReplacer(String(i),value3[i],stack2,replacer,spacer,indentation);if(res+=tmp!==void 0?tmp:"null",value3.length-1>maximumBreadth){let removedKeys=value3.length-maximumBreadth-1;res+=`${join278}"... ${getItemCount(removedKeys)}\
10141
+ string":return strEscape(value3);case"object":{if(value3===null)return"null";if(stack2.indexOf(value3)!==-1)return circularValue;let originalIndentation=indentation,res="",join279=",";if(Array.isArray(value3)){if(value3.length===0)return"[]";if(maximumDepth<stack2.length+1)return'"[Array]"';stack2.push(value3),spacer!==""&&(indentation+=spacer,res+=`
10142
+ ${indentation}`,join279=`,
10143
+ ${indentation}`);let maximumValuesToStringify=Math.min(value3.length,maximumBreadth),i=0;for(;i<maximumValuesToStringify-1;i++){let tmp2=stringifyArrayReplacer(String(i),value3[i],stack2,replacer,spacer,indentation);res+=tmp2!==void 0?tmp2:"null",res+=join279}let tmp=stringifyArrayReplacer(String(i),value3[i],stack2,replacer,spacer,indentation);if(res+=tmp!==void 0?tmp:"null",value3.length-1>maximumBreadth){let removedKeys=value3.length-maximumBreadth-1;res+=`${join279}"... ${getItemCount(removedKeys)}\
10144
10144
  not stringified"`}return spacer!==""&&(res+=`
10145
- ${originalIndentation}`),stack2.pop(),`[${res}]`}stack2.push(value3);let whitespace="";spacer!==""&&(indentation+=spacer,join278=`,
10146
- ${indentation}`,whitespace=" ");let separator="";for(let key8 of replacer){let tmp=stringifyArrayReplacer(key8,value3[key8],stack2,replacer,spacer,indentation);tmp!==void 0&&(res+=`${separator}${strEscape(key8)}:${whitespace}${tmp}`,separator=join278)}return spacer!==""&&separator.length>1&&(res=`
10145
+ ${originalIndentation}`),stack2.pop(),`[${res}]`}stack2.push(value3);let whitespace="";spacer!==""&&(indentation+=spacer,join279=`,
10146
+ ${indentation}`,whitespace=" ");let separator="";for(let key8 of replacer){let tmp=stringifyArrayReplacer(key8,value3[key8],stack2,replacer,spacer,indentation);tmp!==void 0&&(res+=`${separator}${strEscape(key8)}:${whitespace}${tmp}`,separator=join279)}return spacer!==""&&separator.length>1&&(res=`
10147
10147
  ${indentation}${res}
10148
10148
  ${originalIndentation}`),stack2.pop(),`{${res}}`}case"number":return isFinite(value3)?String(value3):fail14?fail14(value3):"null";case"boolean":return value3===!0?"true":"false";case"undefined":return;case"bigint":if(bigint4)return String(value3);default:return fail14?fail14(value3):void 0}}function stringifyIndent(key7,value3,stack2,spacer,indentation){switch(typeof value3){case"string":return strEscape(value3);case"object":{if(value3===null)return"null";if(typeof value3.toJSON=="function"){if(value3=
10149
10149
  value3.toJSON(key7),typeof value3!="object")return stringifyIndent(key7,value3,stack2,spacer,indentation);if(value3===null)return"null"}if(stack2.indexOf(value3)!==-1)return circularValue;let originalIndentation=indentation;if(Array.isArray(value3)){if(value3.length===0)return"[]";if(maximumDepth<stack2.length+1)return'"[Array]"';stack2.push(value3),indentation+=spacer;let res2=`
10150
- ${indentation}`,join279=`,
10151
- ${indentation}`,maximumValuesToStringify=Math.min(value3.length,maximumBreadth),i=0;for(;i<maximumValuesToStringify-1;i++){let tmp2=stringifyIndent(String(i),value3[i],stack2,spacer,indentation);res2+=tmp2!==void 0?tmp2:"null",res2+=join279}let tmp=stringifyIndent(String(i),value3[i],stack2,spacer,indentation);if(res2+=tmp!==void 0?tmp:"null",value3.length-1>maximumBreadth){let removedKeys=value3.length-maximumBreadth-1;res2+=`${join279}"... ${getItemCount(removedKeys)} not stringified"`}return res2+=
10150
+ ${indentation}`,join280=`,
10151
+ ${indentation}`,maximumValuesToStringify=Math.min(value3.length,maximumBreadth),i=0;for(;i<maximumValuesToStringify-1;i++){let tmp2=stringifyIndent(String(i),value3[i],stack2,spacer,indentation);res2+=tmp2!==void 0?tmp2:"null",res2+=join280}let tmp=stringifyIndent(String(i),value3[i],stack2,spacer,indentation);if(res2+=tmp!==void 0?tmp:"null",value3.length-1>maximumBreadth){let removedKeys=value3.length-maximumBreadth-1;res2+=`${join280}"... ${getItemCount(removedKeys)} not stringified"`}return res2+=
10152
10152
  `
10153
- ${originalIndentation}`,stack2.pop(),`[${res2}]`}let keys5=Object.keys(value3),keyLength=keys5.length;if(keyLength===0)return"{}";if(maximumDepth<stack2.length+1)return'"[Object]"';indentation+=spacer;let join278=`,
10154
- ${indentation}`,res="",separator="",maximumPropertiesToStringify=Math.min(keyLength,maximumBreadth);isTypedArrayWithEntries(value3)&&(res+=stringifyTypedArray(value3,join278,maximumBreadth),keys5=keys5.slice(value3.length),maximumPropertiesToStringify-=value3.length,separator=join278),deterministic&&(keys5=sort3(keys5,comparator2)),stack2.push(value3);for(let i=0;i<maximumPropertiesToStringify;i++){let key8=keys5[i],tmp=stringifyIndent(key8,value3[key8],stack2,spacer,indentation);tmp!==void 0&&(res+=
10155
- `${separator}${strEscape(key8)}: ${tmp}`,separator=join278)}if(keyLength>maximumBreadth){let removedKeys=keyLength-maximumBreadth;res+=`${separator}"...": "${getItemCount(removedKeys)} not stringified"`,separator=join278}return separator!==""&&(res=`
10153
+ ${originalIndentation}`,stack2.pop(),`[${res2}]`}let keys5=Object.keys(value3),keyLength=keys5.length;if(keyLength===0)return"{}";if(maximumDepth<stack2.length+1)return'"[Object]"';indentation+=spacer;let join279=`,
10154
+ ${indentation}`,res="",separator="",maximumPropertiesToStringify=Math.min(keyLength,maximumBreadth);isTypedArrayWithEntries(value3)&&(res+=stringifyTypedArray(value3,join279,maximumBreadth),keys5=keys5.slice(value3.length),maximumPropertiesToStringify-=value3.length,separator=join279),deterministic&&(keys5=sort3(keys5,comparator2)),stack2.push(value3);for(let i=0;i<maximumPropertiesToStringify;i++){let key8=keys5[i],tmp=stringifyIndent(key8,value3[key8],stack2,spacer,indentation);tmp!==void 0&&(res+=
10155
+ `${separator}${strEscape(key8)}: ${tmp}`,separator=join279)}if(keyLength>maximumBreadth){let removedKeys=keyLength-maximumBreadth;res+=`${separator}"...": "${getItemCount(removedKeys)} not stringified"`,separator=join279}return separator!==""&&(res=`
10156
10156
  ${indentation}${res}
10157
10157
  ${originalIndentation}`),stack2.pop(),`{${res}}`}case"number":return isFinite(value3)?String(value3):fail14?fail14(value3):"null";case"boolean":return value3===!0?"true":"false";case"undefined":return;case"bigint":if(bigint4)return String(value3);default:return fail14?fail14(value3):void 0}}function stringifySimple(key7,value3,stack2){switch(typeof value3){case"string":return strEscape(value3);case"object":{if(value3===null)return"null";if(typeof value3.toJSON=="function"){if(value3=value3.toJSON(
10158
10158
  key7),typeof value3!="object")return stringifySimple(key7,value3,stack2);if(value3===null)return"null"}if(stack2.indexOf(value3)!==-1)return circularValue;let res="",hasLength=value3.length!==void 0;if(hasLength&&Array.isArray(value3)){if(value3.length===0)return"[]";if(maximumDepth<stack2.length+1)return'"[Array]"';stack2.push(value3);let maximumValuesToStringify=Math.min(value3.length,maximumBreadth),i=0;for(;i<maximumValuesToStringify-1;i++){let tmp2=stringifySimple(String(i),value3[i],stack2);
@@ -13340,7 +13340,7 @@ r.replace):void 0}}function isStringRule(r){return Object.prototype.hasOwnProper
13340
13340
  r))return toSticky(r.regex);if(isStringRule(r)){if(r.str.length===0)throw new Error(`Rule #${i} ("${r.name}") has empty "str" property, which is not allowed.`);return new RegExp(escapeRegExp(r.str),"y")}return new RegExp(escapeRegExp(r.name),"y")}function escapeRegExp(str){return str.replace(/[-[\]{}()*+!<=:?./\\^$|#\s,]/g,"\\$&")}function toSticky(re3){if(re3.global)throw new Error(`Regular expression /${re3.source}/${re3.flags} contains the global flag, which is not allowed.`);return re3.sticky?
13341
13341
  re3:new RegExp(re3.source,re3.flags+"y")}function toNonSticky(re3){return re3.sticky?new RegExp(re3.source,re3.flags.replace("y","")):re3}function createLexer(rules,state="",options2={}){let options1=typeof state!="string"?state:options2,state1=typeof state=="string"?state:"",unifiedRules=rules.map(toUnifiedRule),isLineNumbers=!!options1.lineNumbers;return function(str,offset4=0){let positionQuery=isLineNumbers?createPositionQuery(str):void 0,position3={line:0,column:0},currentIndex=offset4,tokens=[];
13342
13342
  loopStr:for(;currentIndex<str.length;){let anyMatch=!1;for(let rule4 of unifiedRules){rule4.regex.lastIndex=currentIndex;let match5=rule4.regex.exec(str);if(match5&&match5[0].length>0){if(rule4.discard||(positionQuery&&(position3=positionQuery(currentIndex)),tokens.push({state:state1,name:rule4.name,text:rule4.replacer?rule4.replacer(match5[0]):match5[0],offset:currentIndex,len:match5[0].length,line:position3.line,column:position3.column})),currentIndex=rule4.regex.lastIndex,anyMatch=!0,rule4.push){
13343
- let r=rule4.push(str,currentIndex);tokens.push(...r.tokens),currentIndex=r.offset}if(rule4.pop)break loopStr;break}}if(!anyMatch)break}return{tokens,offset:currentIndex,complete:str.length<=currentIndex}}}var linebreaksRe,init_leac=__esm({"node_modules/.pnpm/leac@0.7.0/node_modules/leac/lib/leac.mjs"(){linebreaksRe=/\n/g}});function mapInner(r,f3){return r.matched?{matched:!0,position:r.position,value:f3(r.value,r.position)}:r}function mapOuter(r,f3){return r.matched?f3(r):r}function ab4(pa2,pb,join278){return(data4,i)=>mapOuter(pa2(data4,i),ma2=>mapInner(pb(data4,ma2.position),(vb,j2)=>join278(ma2.value,vb,data4,i,j2)))}function abc2(pa2,pb,pc,join278){return(data4,i)=>mapOuter(pa2(data4,i),ma2=>mapOuter(pb(data4,ma2.position),mb2=>mapInner(pc(data4,mb2.position),(vc,j2)=>join278(ma2.value,mb2.value,vc,data4,i,j2))))}
13343
+ let r=rule4.push(str,currentIndex);tokens.push(...r.tokens),currentIndex=r.offset}if(rule4.pop)break loopStr;break}}if(!anyMatch)break}return{tokens,offset:currentIndex,complete:str.length<=currentIndex}}}var linebreaksRe,init_leac=__esm({"node_modules/.pnpm/leac@0.7.0/node_modules/leac/lib/leac.mjs"(){linebreaksRe=/\n/g}});function mapInner(r,f3){return r.matched?{matched:!0,position:r.position,value:f3(r.value,r.position)}:r}function mapOuter(r,f3){return r.matched?f3(r):r}function ab4(pa2,pb,join279){return(data4,i)=>mapOuter(pa2(data4,i),ma2=>mapInner(pb(data4,ma2.position),(vb,j2)=>join279(ma2.value,vb,data4,i,j2)))}function abc2(pa2,pb,pc,join279){return(data4,i)=>mapOuter(pa2(data4,i),ma2=>mapOuter(pb(data4,ma2.position),mb2=>mapInner(pc(data4,mb2.position),(vc,j2)=>join279(ma2.value,mb2.value,vc,data4,i,j2))))}
13344
13344
  function ahead(p3){return(data4,i)=>mapOuter(p3(data4,i),m1=>({matched:!0,position:i,value:m1.value}))}function all2(...ps2){return(data4,i)=>{let result2=[],position3=i;for(let p3 of ps2){let r1=p3(data4,position3);if(r1.matched)result2.push(r1.value),position3=r1.position;else return{matched:!1}}return{matched:!0,position:position3,value:result2}}}function chain(p3,f3){return(data4,i)=>mapOuter(p3(data4,i),m1=>f3(m1.value,data4,i,m1.position)(data4,m1.position))}function chainReduce(acc,f3){return(data4,i)=>{
13345
13345
  let loop=!0,acc1=acc,pos=i;do{let r=f3(acc1,data4,pos)(data4,pos);r.matched?(acc1=r.value,pos=r.position):loop=!1}while(loop);return{matched:!0,position:pos,value:acc1}}}function eitherOr(pa2,pb){return(data4,i)=>{let r1=pa2(data4,i);return r1.matched?r1:pb(data4,i)}}function error65(message8){return(data4,i)=>{throw new Error(message8 instanceof Function?message8(data4,i):message8)}}function first(...ps2){return(data4,i)=>{for(let p3 of ps2){let result2=p3(data4,i);if(result2.matched)return result2}
13346
13346
  return{matched:!1}}}function map5(p3,mapper){return(data4,i)=>mapInner(p3(data4,i),(v4,j2)=>mapper(v4,data4,i,j2))}function flatten1(p3){return map5(p3,vs2=>vs2.flatMap(v4=>v4))}function flatten2(...ps2){return flatten1(all2(...ps2))}function left(pa2,pb){return ab4(pa2,pb,va=>va)}function reduceLeft(acc,p3,reducer){return chainReduce(acc,acc2=>map5(p3,(v4,data4,i,j2)=>reducer(acc2,v4,data4,i,j2)))}function leftAssoc2(pLeft,pOper,pRight){return chain(pLeft,v0=>reduceLeft(v0,ab4(pOper,pRight,(f3,y6)=>[
@@ -15073,11 +15073,11 @@ mod.js"(){init_mod();init_aesGcm();init_exportOnly();init_native();init_dhkemX25
15073
15073
  let parsed2;try{parsed2=JSON.parse(raw)}catch{parsed2=null}(!parsed2||typeof parsed2!="object"||Array.isArray(parsed2))&&invalid("the Cloud home's secrets from the launcher are not readable");let record31=parsed2;return Object.fromEntries(CLOUD_HOME_SECRET_KEYS.flatMap(key7=>typeof record31[key7]=="string"&&record31[key7]?[[key7,record31[key7]]]:[]))}var BOOT_CLOUD_SECRETS=takeCloudSecrets();init_user_errors();var START_FAILURE={"serverError.computer.desktopOnly":"chat.notice.computerDesktopOnly","serverError.computer.permissionsThenRestart":"chat.notice.computerPermissionsThenRestart","serverError.computer.notReadyDetail":"chat.notice.computerNotReadyDetail","serverError.computer.notReadyMacPermission":"chat.notice.computerNotReadyMacPermission","serverError.computer.systemUnsupported":"chat.notice.computerSystemUnsupported","serverError.computer.aiUnsupported":"chat.notice.compute\
15074
15074
  rAiUnsupported","serverError.engine.signedOut":"chat.notice.engineSignedOut"};function startFailureText(error66){let fields2=userErrorFields(error66);if(!(!fields2.errorKey||!Object.hasOwn(START_FAILURE,fields2.errorKey)))return{key:START_FAILURE[fields2.errorKey],...fields2.errorParams?{params:fields2.errorParams}:{}}}function reserveGmailDrafts(calls2,reserved){let keys5=[];for(let call2 of calls2){if(call2.slug!=="GMAIL_CREATE_EMAIL_DRAFT")continue;let args=call2.arguments,thread=args&&typeof args.thread_id=="string"?args.thread_id:"";if(!thread)continue;let key7=JSON.stringify([args?.user_id??"me",thread]);if(reserved.has(key7)||keys5.includes(key7))return"Draft creation for this Gmail thread was already attempted in this request. Read the existing drafts and update the intended draft by ID; do not create \
15075
15075
  another, including after a timeout.";keys5.push(key7)}for(let key7 of keys5)reserved.add(key7);return null}function createGmailDrafts(deps){let byGeneration=new Map,byNode=new Map;function forNode(id12){for(let cachedId of byNode.keys()){let node4=deps.node(cachedId);(!node4||deps.ended(node4.status))&&byNode.delete(cachedId)}let node3=deps.node(id12);if(!node3)return;let cached4=byNode.get(id12);if(cached4)return cached4;let owner2=deps.owner(node3.threadId),reserved=owner2?.generations.has(id12)&&owner2.gmailDrafts?owner2.gmailDrafts:(node3.parentId?forNode(node3.parentId):void 0)??new Set;return byNode.
15076
- set(id12,reserved),reserved}return{forNode,forTurn(threadId,generation,handoffId){let cached4=byGeneration.get(generation);if(cached4)return cached4;let owner2=deps.owner(threadId),reserved=owner2?.generation===generation&&owner2.gmailDrafts?owner2.gmailDrafts:forNode(handoffId??generation)??new Set;return byGeneration.set(generation,reserved),reserved},forRoomTurn(generation,handoffId){byGeneration.set(generation,forNode(handoffId)??new Set)},endTurn(generation){byGeneration.delete(generation)}}}import{AsyncLocalStorage as AsyncLocalStorage5}from"node:async_hooks";import{createHash as createHash128,randomBytes as randomBytes39,randomUUID as randomUUID91,timingSafeEqual as timingSafeEqual17}from"node:crypto";import{existsSync as existsSync98,realpathSync as realpathSync28,rmSync as rmSync68}from"node:fs";import{homedir as homedir44}from"node:os";import{rm as removeDirectory}from"node:fs/promises";import{createServer as createServer16}from"node:http";init_redact();import{randomUUID}from"node:crypto";var TOOL_RESULT_PREVIEW_CHARS=16e3,TOOL_RESULT_MAX_CHARS=128*1024,TOOL_RESULT_TTL_MS=60*6e4,MAX_RESULTS=128,MAX_RESULTS_PER_OWNER=16,MAX_BYTES=16*1024*1024,MAX_OWNER_BYTES=2*1024*1024;function toolResultPrefix(text30,chars){let prefix=text30.slice(0,chars),last=prefix.charCodeAt(prefix.length-1);return last>=55296&&last<=56319?prefix.slice(0,-1):prefix}var ToolResults=class{results=new Map;now;constructor(now2=Date.now){this.now=now2}expire(){let now2=this.
15076
+ set(id12,reserved),reserved}return{forNode,forTurn(threadId,generation,handoffId){let cached4=byGeneration.get(generation);if(cached4)return cached4;let owner2=deps.owner(threadId),reserved=owner2?.generation===generation&&owner2.gmailDrafts?owner2.gmailDrafts:forNode(handoffId??generation)??new Set;return byGeneration.set(generation,reserved),reserved},forRoomTurn(generation,handoffId){byGeneration.set(generation,forNode(handoffId)??new Set)},endTurn(generation){byGeneration.delete(generation)}}}import{AsyncLocalStorage as AsyncLocalStorage5}from"node:async_hooks";import{createHash as createHash129,randomBytes as randomBytes39,randomUUID as randomUUID91,timingSafeEqual as timingSafeEqual17}from"node:crypto";import{existsSync as existsSync99,realpathSync as realpathSync28,rmSync as rmSync68}from"node:fs";import{homedir as homedir44}from"node:os";import{rm as removeDirectory}from"node:fs/promises";import{createServer as createServer16}from"node:http";init_redact();import{randomUUID}from"node:crypto";var TOOL_RESULT_PREVIEW_CHARS=16e3,TOOL_RESULT_MAX_CHARS=128*1024,TOOL_RESULT_TTL_MS=60*6e4,MAX_RESULTS=128,MAX_RESULTS_PER_OWNER=16,MAX_BYTES=16*1024*1024,MAX_OWNER_BYTES=2*1024*1024;function toolResultPrefix(text30,chars){let prefix=text30.slice(0,chars),last=prefix.charCodeAt(prefix.length-1);return last>=55296&&last<=56319?prefix.slice(0,-1):prefix}var ToolResults=class{results=new Map;now;constructor(now2=Date.now){this.now=now2}expire(){let now2=this.
15077
15077
  now();for(let[id12,result2]of this.results)result2.expiresAt<=now2&&this.results.delete(id12)}save(owner2,text30,truncated=!1){this.expire();let redacted=redactSecretsInText(text30),bounded3=toolResultPrefix(redacted,TOOL_RESULT_MAX_CHARS),result2={botId:owner2.botId,threadId:owner2.threadId,text:bounded3,bytes:Buffer.byteLength(bounded3),expiresAt:this.now()+TOOL_RESULT_TTL_MS,truncated:truncated||bounded3.length<redacted.length},id12=`r-${randomUUID()}`;this.results.set(id12,result2);for(let ownOnly of[
15078
15078
  !0,!1]){let entries4=[...this.results].filter(([,entry2])=>!ownOnly||entry2.botId===owner2.botId&&entry2.threadId===owner2.threadId),bytes4=entries4.reduce((sum3,[,entry2])=>sum3+entry2.bytes,0),count12=entries4.length;for(let[oldId,entry2]of entries4){if(bytes4<=(ownOnly?MAX_OWNER_BYTES:MAX_BYTES)&&count12<=(ownOnly?MAX_RESULTS_PER_OWNER:MAX_RESULTS))break;this.results.delete(oldId),bytes4-=entry2.bytes,count12--}}return{id:id12,length:bounded3.length,truncated:result2.truncated,expiresAt:result2.
15079
15079
  expiresAt}}read(owner2,id12,offset4){this.expire();let result2=this.results.get(id12);if(!result2||result2.botId!==owner2.botId||result2.threadId!==owner2.threadId||!Number.isSafeInteger(offset4)||offset4<0||offset4>result2.text.length)return null;let char=result2.text.charCodeAt(offset4),start=char>=56320&&char<=57343?Math.max(0,offset4-1):offset4,text30=toolResultPrefix(result2.text.slice(start),TOOL_RESULT_PREVIEW_CHARS);return{id:id12,text:text30,offset:start,nextOffset:start+text30.length,length:result2.
15080
- text.length,truncated:result2.truncated,expiresAt:result2.expiresAt}}};import{basename as basename37,join as join277}from"node:path";import{createHash,timingSafeEqual}from"node:crypto";import{closeSync as closeSync2,constants,fstatSync,openSync,readSync}from"node:fs";var MAX_FILE_BYTES=1048576,ID=/^[\w-]{1,128}$/,fingerprint=token3=>createHash("sha256").update(token3).digest("hex"),sameFingerprint=(left2,right2)=>{let a=Buffer.from(left2),b11=Buffer.from(right2);return a.length===b11.length&&timingSafeEqual(a,b11)};function registrations(file3){let fd;try{fd=openSync(file3,constants.O_RDONLY|(process.platform==="win32"?0:constants.
15080
+ text.length,truncated:result2.truncated,expiresAt:result2.expiresAt}}};import{basename as basename37,join as join278}from"node:path";import{createHash,timingSafeEqual}from"node:crypto";import{closeSync as closeSync2,constants,fstatSync,openSync,readSync}from"node:fs";var MAX_FILE_BYTES=1048576,ID=/^[\w-]{1,128}$/,fingerprint=token3=>createHash("sha256").update(token3).digest("hex"),sameFingerprint=(left2,right2)=>{let a=Buffer.from(left2),b11=Buffer.from(right2);return a.length===b11.length&&timingSafeEqual(a,b11)};function registrations(file3){let fd;try{fd=openSync(file3,constants.O_RDONLY|(process.platform==="win32"?0:constants.
15081
15081
  O_NOFOLLOW|constants.O_NONBLOCK));let stat16=fstatSync(fd);if(!stat16.isFile()||stat16.size>MAX_FILE_BYTES)return[];if(process.platform!=="win32"&&(stat16.mode&63)!==0)return console.warn("[comms] ignoring external runtime credentials: use a private file (chmod 600)"),[];let bytes4=Buffer.alloc(stat16.size+1),count12=0;for(;;){let read4=readSync(fd,bytes4,count12,bytes4.length-count12,null);if(!read4)break;if(count12+=read4,count12>stat16.size)return[]}let parsed2=JSON.parse(bytes4.subarray(0,count12).
15082
15082
  toString("utf8"));return!parsed2||typeof parsed2!="object"||Array.isArray(parsed2)?[]:Object.entries(parsed2).flatMap(([botId,value3])=>{if(!ID.test(botId)||!value3||typeof value3!="object"||Array.isArray(value3))return[];let{token:token3,threadId}=value3;return typeof token3!="string"||token3.length<32||token3.length>4096||/\s/.test(token3)?[]:typeof threadId!="string"||!ID.test(threadId)?[]:[{botId,tokenHash:fingerprint(token3),threadId}]})}catch{return[]}finally{fd!==void 0&&closeSync2(fd)}}function resolveRegistration(file3,tokenHash,botForId){
15083
15083
  let matches3=registrations(file3).filter(entry2=>sameFingerprint(entry2.tokenHash,tokenHash));if(matches3.length!==1)return null;let registration=matches3[0],bot=botForId(registration.botId);if(!bot||bot.hidden)return null;let task2=bot.tasks?.find(candidate=>candidate.threadId===registration.threadId);return!task2||task2.archivedAt!==void 0?null:{botId:bot.id,threadId:task2.threadId,tokenHash}}function authorizeExternalRuntime(file3,header3,botForId){return typeof header3!="string"||!/^Bearer \S{32,4096}$/.
@@ -15668,7 +15668,7 @@ rows2.map(r=>[r.pid,r.startedAt]));return treePids(rows2,root3).filter(pid=>pid!
15668
15668
  e Win32_Process|Select-Object ProcessId,ParentProcessId,KernelModeTime,UserModeTime,CreationDate;$ids=@(${root3});$q=@(${root3});while($q.Count){$p=$q[0];$q=@($q|Select-Object -Skip 1);foreach($c in $all|Where-Object{$_.ParentProcessId -eq $p}){if($ids -notcontains $c.ProcessId){$ids+=$c.ProcessId;$q+=$c.ProcessId}}};`+own4+'$cpu=($all|Where-Object{$ids -contains $_.ProcessId}|ForEach-Object{[double]$_.KernelModeTime+[double]$_.UserModeTime}|Measure-Object -Sum).Sum/10000;$n=@(Get-NetTCPConnecti\
15669
15669
  on -State Established|Where-Object{$ids -contains $_.OwningProcess}).Count;Write-Output "$cpu $n"',out=await run("powershell.exe",["-NoProfile","-NonInteractive","-Command",script],8e3);if(out?.trim()==="none")return{cpuMs:null,connections:null};let[cpu,n]=(out??"").trim().split(/\s+/),cpuMs=Number(cpu),connections=Number(n);return{cpuMs:cpu!==void 0&&Number.isFinite(cpuMs)?cpuMs:null,connections:n!==void 0&&Number.isFinite(connections)?connections:null}}var realProc={read:path6=>readFileSync23(
15670
15670
  path6,"utf8"),list:path6=>readdirSync6(path6),link:path6=>readlinkSync(path6)},PROC_TICKS=100;function sampleLinuxProc(root3,since,proc=realProc){let unknown2={cpuMs:null,connections:null},names5;try{names5=proc.list("/proc")}catch{return unknown2}let bootMs=0;try{bootMs=Number(/^btime (\d+)$/m.exec(proc.read("/proc/stat"))?.[1]??0)*1e3}catch{}let rows2=[];for(let name6 of names5){if(!/^\d+$/.test(name6))continue;let stat16;try{stat16=proc.read(`/proc/${name6}/stat`)}catch{continue}let fields2=stat16.
15671
- slice(stat16.lastIndexOf(")")+2).split(" "),ticks2=(Number(fields2[11])||0)+(Number(fields2[12])||0),started2=Number(fields2[19]);rows2.push({pid:Number(name6),ppid:Number(fields2[1]),cpuMs:ticks2*(1e3/PROC_TICKS),startedAt:bootMs&&Number.isFinite(started2)?bootMs+started2*(1e3/PROC_TICKS):null})}if(!rows2.some(row=>row.pid===root3))return unknown2;let pids=since===void 0?treePids(rows2,root3):startedSince(rows2,root3,since);if(!pids.length)return unknown2;let cpuMs=rows2.filter(row=>pids.includes(
15671
+ slice(stat16.lastIndexOf(")")+2).split(" "),ticks2=(Number(fields2[11])||0)+(Number(fields2[12])||0),started3=Number(fields2[19]);rows2.push({pid:Number(name6),ppid:Number(fields2[1]),cpuMs:ticks2*(1e3/PROC_TICKS),startedAt:bootMs&&Number.isFinite(started3)?bootMs+started3*(1e3/PROC_TICKS):null})}if(!rows2.some(row=>row.pid===root3))return unknown2;let pids=since===void 0?treePids(rows2,root3):startedSince(rows2,root3,since);if(!pids.length)return unknown2;let cpuMs=rows2.filter(row=>pids.includes(
15672
15672
  row.pid)).reduce((sum3,row)=>sum3+row.cpuMs,0),sockets=new Set,namespaces=new Map;for(let pid of pids){try{let ns2=proc.link(`/proc/${pid}/ns/net`);namespaces.has(ns2)||namespaces.set(ns2,pid)}catch{}let fds;try{fds=proc.list(`/proc/${pid}/fd`)}catch{continue}for(let fd of fds)try{let inode=/^socket:\[(\d+)\]$/.exec(proc.link(`/proc/${pid}/fd/${fd}`))?.[1];inode&&sockets.add(inode)}catch{}}let connections=0,readable2=!1;for(let pid of namespaces.size?namespaces.values():[root3])for(let table3 of[
15673
15673
  "tcp","tcp6"]){let text30;try{text30=proc.read(`/proc/${pid}/net/${table3}`),readable2=!0}catch{continue}for(let line6 of text30.split(`
15674
15674
  `).slice(1)){let cols=line6.trim().split(/\s+/);cols.length>=10&&cols[3]==="01"&&sockets.has(cols[9])&&(connections+=1)}}return{cpuMs,connections:readable2?connections:null}}function sampleProcessTree(pid,since){if(process.platform==="linux")try{return Promise.resolve(sampleLinuxProc(pid,since))}catch{return Promise.resolve({cpuMs:null,connections:null})}return(process.platform==="win32"?sampleWindows(pid,since):samplePosix(pid,since)).catch(()=>({cpuMs:null,connections:null}))}var LIMIT_WORDS=/\b429\b|rate.?limit|too many requests|usage limit|quota|GoUsageLimitError|FreeUsageLimitError|insufficient_quota|credits? (?:exhausted|used up)|out of credits/i,
@@ -16664,7 +16664,7 @@ instance.instanceId||record31.adapter!==input2.instance.adapter||handed.config!=
16664
16664
  handed).map(message8=>[message8.id,message8.earlier===!0]));for(let id12 of unseen.keys())if(!inWindow.has(id12))return;for(let id12 of texts2.keys())inWindow.has(id12)||texts2.delete(id12);let lines=[],shown3=new Map;for(let line6 of window2){let hash4=lineHash(line6.text),earlier=unseen.get(line6.id),known=texts2.get(line6.id);if(earlier===void 0&&known===OWN2){texts2.set(line6.id,hash4);continue}earlier===void 0&&known===hash4||(shown3.set(line6.id,hash4),lines.push(earlier!==void 0?earlier?{
16665
16665
  ...line6,earlier:!0}:line6:known===void 0?{...line6,earlier:!0}:{...line6,updated:!0}))}return{session:handed.session,lines,shown:shown3}}function decide5(input2,full,today2){let{threadId,botId,instance,window:window2}=input2,legacy=()=>({mode:"legacy",text:full,send:today2});if(!roomSessionsEnabled(deps.settings(),deps.env))return clear2(),legacy();let at8=now2();prune3(at8);let stale=inFlight.get(threadId);stale&&drop(threadId,stale.botId),land2(threadId);let speakers=lastSpeakers.get(threadId)??
16666
16666
  new Map;lastSpeakers.set(threadId,speakers);let spokeLast=speakers.get(instance.instanceId)?.botId===botId;speakers.set(instance.instanceId,{botId,at:at8});let idleMs=roomSessionIdleMs(instance.driverKind);if(idleMs===void 0||instance.adapter.capabilities.strictResume!==!0||!input2.hooks||input2.guestConfined){drop(threadId,botId);let untracked=traces.get(threadId)?.get(botId);return untracked&&(untracked.ended=void 0),legacy()}let asked,context3=()=>(asked??={reading:input2.context?.()}).reading;
16667
- contextFell(traces.get(threadId)?.get(botId),context3)&&drop(threadId,botId);let config3=createHash16("sha256").update(JSON.stringify(input2.config)).digest("hex"),{order}=window2,ids=window2.lines.map(line6=>line6.id),first2=ids.length?order.indexOf(ids[0]):order.length,started2=sessionStart(order,ids,order.slice(first2)),nothing={...order.length?{omitted:order.at(-1)}:{},sent:[]},handoff2={botId,instanceId:instance.instanceId,config:config3,started:started2,recovery:started2,resumed:nothing,carried:[],
16667
+ contextFell(traces.get(threadId)?.get(botId),context3)&&drop(threadId,botId);let config3=createHash16("sha256").update(JSON.stringify(input2.config)).digest("hex"),{order}=window2,ids=window2.lines.map(line6=>line6.id),first2=ids.length?order.indexOf(ids[0]):order.length,started3=sessionStart(order,ids,order.slice(first2)),nothing={...order.length?{omitted:order.at(-1)}:{},sent:[]},handoff2={botId,instanceId:instance.instanceId,config:config3,started:started3,recovery:started3,resumed:nothing,carried:[],
16668
16668
  own:[]},fly=(delta2,cursor3)=>{handoffs2.dispatching(threadId,input2.claimId),inFlight.set(threadId,{botId,instanceId:instance.instanceId,adapter:instance.adapter,claimId:input2.claimId,since:at8,...cursor3===void 0?{}:{cursor:cursor3},window:new Map(window2.lines.map(line6=>[line6.id,lineHash(line6.text)])),delta:delta2})},delta=spokeLast?unseenLines(records.get(threadId)?.get(botId),input2,config3,idleMs,context3):void 0;return delta?(handoffs2.begin(threadId,input2.claimId,{...handoff2,resumeCursor:delta.
16669
16669
  session,placed:[...order]}),fly(delta.shown,delta.session),{mode:"resume",text:input2.wrap(renderRoomDelta(delta.lines)+input2.tail),send:{resumeCursor:delta.session,recoveryText:full}}):(drop(threadId,botId),handoffs2.begin(threadId,input2.claimId,{...handoff2,resumeCursor:void 0,placed:[]}),fly(new Map),{mode:"start",text:full,send:today2})}function forget(threadId){records.delete(threadId),lastSpeakers.delete(threadId),traces.delete(threadId),land2(threadId)}function guarded(threadId,work){try{
16670
16670
  work()}catch(error66){try{forget(threadId)}catch{}console.warn(`room sessions: forgot the sessions of thread ${threadId} (${error66 instanceof Error?error66.message:String(error66)})`)}}function onEvent(event2){if(handoffs2.onEvent(event2),event2.type!=="turn.completed"&&event2.type!=="session.started")return;let flight=inFlight.get(event2.threadId);if(!flight||event2.providerInstanceId!==flight.instanceId||flight.turnId&&event2.turnId&&event2.turnId!==flight.turnId)return;if(event2.type==="sess\
@@ -17548,8 +17548,8 @@ withoutExe=lower.endsWith(".exe")?lower.slice(0,-4):lower;return entries4.some(e
17548
17548
  slice(at8,open14)," "),at8=end}return decodeEntities(words6.join("")).replace(/\s+/g," ").trim()}function pageSays(text30,wanted){let needle=wanted.replace(/\s+/g," ").trim().toLowerCase();return text30.toLowerCase().includes(needle)}var PAGE_TIMEOUT_MS=15e3,PAGE_MAX_BYTES=2*1024*1024,PAGE_MAX_REDIRECTS=3,fail2=(error66,refused2=!1)=>({ok:!1,refused:refused2,error:error66});function requestOnce(url2,address3,signal,maxBytes){return new Promise((resolve56,reject)=>{let pinned2=(_host,lookupOptions,callback)=>{
17549
17549
  lookupOptions.all?callback(null,[address3]):callback(null,address3.address,address3.family)},req=(url2.protocol==="https:"?httpsRequest4:httpRequest6)(url2,{agent:!1,signal,lookup:pinned2,headers:{"user-agent":"LimixBot-wait",accept:"text/html,text/plain;q=0.9,*/*;q=0.1"}},response=>{let status5=response.statusCode??0,{headers}=response;if(status5<200||status5>=300){response.destroy(),resolve56({status:status5,location:headers.location,headers,body:Buffer.alloc(0)});return}let chunks=[],size3=0;
17550
17550
  response.on("data",chunk=>{chunks.push(chunk),size3+=chunk.length,size3>=maxBytes&&(response.destroy(),resolve56({status:status5,headers,body:Buffer.concat(chunks).subarray(0,maxBytes)}))}),response.on("end",()=>resolve56({status:status5,headers,body:Buffer.concat(chunks)})),response.on("error",reject)});req.on("error",reject),req.end()})}function withinSignal(promise2,signal){return new Promise((resolve56,reject)=>{if(signal.aborted)return reject(signal.reason);let abort=()=>reject(signal.reason);
17551
- signal.addEventListener("abort",abort,{once:!0}),promise2.then(resolve56,reject).finally(()=>signal.removeEventListener("abort",abort))})}async function fetchPageText(rawUrl,options2={}){let page=await fetchPublicPage(rawUrl,options2);return page.ok?{ok:!0,text:pageText(page.body.toString("utf8"))}:page}async function fetchPublicPage(rawUrl,options2={}){let lookup8=options2.lookup??resolveTarget,allow=options2.allow??(({address:address3})=>addressClass(address3,ownAddresses())==="public"),maxBytes=options2.
17552
- maxBytes??PAGE_MAX_BYTES,signal=AbortSignal.timeout(options2.timeoutMs??PAGE_TIMEOUT_MS),url2;try{url2=new URL(rawUrl)}catch{return fail2("That is not a web address.",!0)}try{for(let hop=0;;hop++){if(url2.protocol!=="http:"&&url2.protocol!=="https:"||url2.username||url2.password)return fail2("Only an http or https address with no sign-in details can be checked.",!0);let host3=url2.hostname.replace(/^\[|\]$/g,""),literal6=isIP6(host3),addresses2=literal6?[{address:host3,family:literal6}]:await withinSignal(
17551
+ signal.addEventListener("abort",abort,{once:!0}),promise2.then(resolve56,reject).finally(()=>signal.removeEventListener("abort",abort))})}async function fetchPageText(rawUrl2,options2={}){let page=await fetchPublicPage(rawUrl2,options2);return page.ok?{ok:!0,text:pageText(page.body.toString("utf8"))}:page}async function fetchPublicPage(rawUrl2,options2={}){let lookup8=options2.lookup??resolveTarget,allow=options2.allow??(({address:address3})=>addressClass(address3,ownAddresses())==="public"),maxBytes=options2.
17552
+ maxBytes??PAGE_MAX_BYTES,signal=AbortSignal.timeout(options2.timeoutMs??PAGE_TIMEOUT_MS),url2;try{url2=new URL(rawUrl2)}catch{return fail2("That is not a web address.",!0)}try{for(let hop=0;;hop++){if(url2.protocol!=="http:"&&url2.protocol!=="https:"||url2.username||url2.password)return fail2("Only an http or https address with no sign-in details can be checked.",!0);let host3=url2.hostname.replace(/^\[|\]$/g,""),literal6=isIP6(host3),addresses2=literal6?[{address:host3,family:literal6}]:await withinSignal(
17553
17553
  lookup8(host3),signal);if(addresses2.length===0)return fail2("That address could not be found.");if(!addresses2.every(({address:address3})=>allow({host:host3,address:address3})))return fail2(`${host3} points at this computer or a private network, which waits never check. Use a page on the public web.`,!0);signal.throwIfAborted();let answer2=await requestOnce(url2,addresses2[0],signal,maxBytes);if(answer2.status>=300&&answer2.status<400&&answer2.location){if(hop>=(options2.maxRedirects??PAGE_MAX_REDIRECTS))
17554
17554
  return fail2("The page redirected too many times.");url2=new URL(answer2.location,url2);continue}return answer2.status<200||answer2.status>=300?fail2(`The page answered ${answer2.status}.`):{ok:!0,url:url2,headers:answer2.headers,body:answer2.body}}}catch{return signal.aborted?fail2("The page took too long to answer."):fail2("The page could not be reached.")}}var SCHEME_SOURCE=/^[a-z][a-z0-9+.-]*:$/,HOST_SOURCE=/^(?:([a-z][a-z0-9+.-]*):\/\/)?(\*|(?:\*\.)?[a-z0-9-]+(?:\.[a-z0-9-]+)*)(?::(\d+|\*))?(\/[^?#]*)?$/;function headerItems(value3){return(value3===void 0?[]:[value3].flat()).flatMap(item=>item.split(","))}function schemeMatches(scheme3,app){return scheme3===app.protocol||scheme3==="http:"&&app.protocol==="https:"}function hostMatches(host3,app){return host3==="*"?!0:host3.startsWith("*.")?app.hostname.endsWith(host3.slice(1)):app.hostname===host3}
17555
17555
  function sourceMatches(token3,page,app){let source4=token3.toLowerCase();if(source4==="*")return!0;if(source4==="'self'")return app.origin===page.origin;if(source4.startsWith("'"))return!1;if(SCHEME_SOURCE.test(source4))return schemeMatches(source4,app);let parts3=HOST_SOURCE.exec(source4);if(!parts3)return null;let[,scheme3,host3,port,path6]=parts3;if(!schemeMatches(scheme3?`${scheme3}:`:page.protocol,app)||!hostMatches(host3,app))return!1;let defaultPort=app.protocol==="https:"?"443":"80",appPort=app.
@@ -18284,7 +18284,7 @@ member.email}),email3=member.member.email;if(path6===MY_CONNECTIONS_PATH){if(met
18284
18284
  ownAppsNeedKey()?{ownApps:"needs-key"}:{},apps:apps2.map(slug3=>{let state=states3?.[slug3];return{slug:slug3,name:appLabel(slug3),connected:state?.connected===!0,...again&&state?.connected!==!0?{reconnect:!0}:{},accounts:(state?.accounts??[]).map(account2=>({id:account2.id,alias:account2.alias?.trim()||null,status:account2.status}))}}),mcp:deps.host.personMcp().flatMap(name6=>{let stored=server2(name6);if(!stored||!isRemoteMcpServer(stored))return[];let signedIn=deps.host.people.oauth(person2).
18285
18285
  authState(name6,stored.url)==="signed-in",key7=deps.host.people.key(person2,name6,stored.url)!==null;return[{name:name6,host:host2(stored.url),connected:signedIn||key7,how:signedIn?"sign-in":key7?"key":null,offers:stored.oauth||!Object.keys(stored.headers).length?"sign-in":"key"}]})})}let app=/^\/api\/team\/my-connections\/apps\/([^/]+)(\/connect)?$/.exec(path6);if(app){let slug3=decodeURIComponent(app[1]).toLowerCase();if(!APP_SLUG.test(slug3)||!deps.host.personApps().includes(slug3))return json7(
18286
18286
  res,409,{error:`${appLabel(slug3)} is ${team.name}'s, connected once for everyone by an admin.`});if(app[2]&&method2==="POST"){let refused2=deps.policy?.appRefusal(slug3);if(refused2)return json7(res,403,{error:refused2,code:"managed_policy"});if(deps.host.ownAppsNeedKey())return json7(res,409,{...userError("serverError.team.ownAppsNeedKey",{team:team.name}),code:"own_apps_need_key"});try{let access2=await deps.host.people.ensureAppsAccess(person2,email3);if(!access2)return json7(res,503,{error:"\
18287
- Connected apps aren't available on this Cloud right now. Try again in a minute."});let[asThem,installation]=deps.host.via(access2),started2=await deps.composio.authorizeService(asThem,slug3,null,installation);return deps.host.people.appConnecting(person2,slug3),json7(res,200,started2)}catch(error66){let status5=error66.status;return json7(res,typeof status5=="number"&&status5>=400&&status5<500?status5:502,{error:error66 instanceof Error?error66.message:"The app's sign-in couldn't start."})}}if(!app[2]&&
18287
+ Connected apps aren't available on this Cloud right now. Try again in a minute."});let[asThem,installation]=deps.host.via(access2),started3=await deps.composio.authorizeService(asThem,slug3,null,installation);return deps.host.people.appConnecting(person2,slug3),json7(res,200,started3)}catch(error66){let status5=error66.status;return json7(res,typeof status5=="number"&&status5>=400&&status5<500?status5:502,{error:error66 instanceof Error?error66.message:"The app's sign-in couldn't start."})}}if(!app[2]&&
18288
18288
  method2==="DELETE"){let access2=deps.host.people.appsAccess(person2);if(access2){let[asThem,installation]=deps.host.via(access2);await deps.composio.removeService(asThem,slug3,installation)}return json7(res,200,{ok:!0})}return json7(res,405,{error:"method not allowed"})}let mcp=/^\/api\/team\/my-connections\/mcp\/([a-z][a-z0-9_-]{0,31})(\/sign-in|\/key)?$/.exec(path6);if(mcp){let name6=mcp[1],stored=server2(name6);if(!stored||!deps.host.personMcp().includes(name6)||!isRemoteMcpServer(stored))return json7(
18289
18289
  res,409,{error:`${name6} is ${team.name}'s, connected once for everyone by an admin.`});if(deps.host.people.remember(person2,email3),(mcp[2]==="/sign-in"||mcp[2]==="/key")&&method2!=="DELETE"){let refused2=deps.policy?.mcpRefusal(name6,stored.url);if(refused2)return json7(res,403,{error:refused2,code:"managed_policy"})}if(mcp[2]==="/sign-in"&&method2==="POST"){let origin2=mcpCallbackOrigin(provesSameOrigin(req)?requestOrigin(req):null,[deps.publicOrigin]);try{return res.setHeader("Cache-Control",
18290
18290
  "no-store"),json7(res,200,{auth:await deps.host.people.oauth(person2).start(name6,stored.url,void 0,auth.session.id,{remote:origin2!==null,origin:origin2})})}catch(error66){return error66 instanceof McpOAuthError&&error66.code==="not-oauth"?json7(res,400,{error:"This server doesn't offer a sign-in. Add your own key instead.",code:error66.code}):error66 instanceof McpOAuthError?json7(res,400,{error:error66.message,code:error66.code}):error66 instanceof McpSignInError?json7(res,error66.status,{error:error66.
@@ -18856,8 +18856,8 @@ return"reason"in server2?signedInUnreachableText(name6,server2.reason(void 0)):s
18856
18856
  turnPerson(threadId);return person2&&auth.kind==="session"&&personKey(auth.session)===person2?null:person2?serverLine(language,"server.mcp.signIn.onlyPerson",{name:deps.personName(person2)}):serverLine(language,"server.mcp.signIn.onlyOwner")}function browserFor(auth,req,label4,language){if(auth.kind==="loopback"&&auth.companionDevice){let origin2=mcpCallbackOrigin(null,deps.publicOrigins());return origin2?{remote:!0,origin:origin2}:{status:409,error:serverLine(language,"server.mcp.signIn.onYourM\
18857
18857
  ac",{label:label4})}}return auth.kind!=="session"||!isProxied(req)&&isLoopbackHost(req.headers.host)?{remote:!1}:{remote:!0,origin:mcpCallbackOrigin(provesSameOrigin(req)?requestOrigin(req):null,deps.publicOrigins())}}async function authorize(auth,req,threadId,card){let{slug:name6,label:label4}=card.connector,language=deps.language(threadId);if(card.connector.dismissed)return{status:409,body:{error:"This sign-in request was set aside. Ask the bot again."}};let denied2=mayAuthorize(auth,name6,label4,
18858
18858
  threadId,language);if(denied2)return{status:409,body:{error:denied2}};let server2=current3(name6);if("reason"in server2)return unreachable(threadId,card,server2);let browser=browserFor(auth,req,label4,language);if("error"in browser)return{status:browser.status,body:{error:browser.error}};if(browser.remote&&(!browser.origin||server2.oauth))return{status:409,body:{error:serverLine(language,"server.mcp.signIn.inSettings")}};let manager=signer(name6,threadId),owner2=cardOwner(threadId,card.id);browser.
18859
- remote&&manager.waiting(name6,owner2)?.loopback&&cancel(name6,threadId,card.id);let started2;try{started2=await manager.start(name6,server2.url,void 0,owner2,browser)}catch(error66){return error66 instanceof McpSignInError?{status:error66.status,body:{error:error66.message}}:error66 instanceof McpOAuthError?{status:400,body:{error:error66.message,code:error66.code}}:{status:502,body:{error:error66 instanceof Error?error66.message:"Sign-in could not start."}}}return started2.pasteBack?(cancel(name6,
18860
- threadId,card.id),{status:409,body:{error:serverLine(language,"server.mcp.signIn.inSettings")}}):started2.phase!=="waiting"||!started2.authorizationUrl?{status:409,body:{error:"This sign-in has ended. Start again."}}:(patch2(threadId,card.id,{status:"authorizing",error:void 0}),{status:200,body:{url:started2.authorizationUrl}})}function unreachable(threadId,card,server2){let error66=server2.reason(deps.language(threadId));patch2(threadId,card.id,{status:"failed",error:error66});let said2=`Limix \
18859
+ remote&&manager.waiting(name6,owner2)?.loopback&&cancel(name6,threadId,card.id);let started3;try{started3=await manager.start(name6,server2.url,void 0,owner2,browser)}catch(error66){return error66 instanceof McpSignInError?{status:error66.status,body:{error:error66.message}}:error66 instanceof McpOAuthError?{status:400,body:{error:error66.message,code:error66.code}}:{status:502,body:{error:error66 instanceof Error?error66.message:"Sign-in could not start."}}}return started3.pasteBack?(cancel(name6,
18860
+ threadId,card.id),{status:409,body:{error:serverLine(language,"server.mcp.signIn.inSettings")}}):started3.phase!=="waiting"||!started3.authorizationUrl?{status:409,body:{error:"This sign-in has ended. Start again."}}:(patch2(threadId,card.id,{status:"authorizing",error:void 0}),{status:200,body:{url:started3.authorizationUrl}})}function unreachable(threadId,card,server2){let error66=server2.reason(deps.language(threadId));patch2(threadId,card.id,{status:"failed",error:error66});let said2=`Limix \
18861
18861
  Bot MCP sign-in for ${card.connector.slug}: ${server2.reason(void 0)} Nothing was signed in.`;return!find4(threadId,card.id).connector.resumed&&deps.answer(threadId,card.id,said2)&&patch2(threadId,card.id,{resumed:!0}),{status:server2.status,body:{error:error66}}}function resume(threadId,id12){let card=find4(threadId,id12);return!card||card.connector.dismissed||card.connector.status!=="connected"?!1:(!card.connector.resumed&&deps.answer(threadId,id12,signedInTextNow(card.connector.slug))&&patch2(
18862
18862
  threadId,id12,{resumed:!0}),!0)}function signedIn(threadId,id12){let card=find4(threadId,id12);!card||card.connector.dismissed||(card.connector.status!=="connected"&&(patch2(threadId,id12,{status:"connected",error:void 0}),deps.changed()),resume(threadId,id12))}function status5(threadId,card){let name6=card.connector.slug,server2=current3(name6),connected=!("reason"in server2)&&signer(name6,threadId)?.authState(name6,server2.url)==="signed-in";connected&&signedIn(threadId,card.id),!connected&&card.
18863
18863
  connector.status==="authorizing"&&!signer(name6,threadId)?.waiting(name6,cardOwner(threadId,card.id))&&patch2(threadId,card.id,{status:"required",error:serverLine(deps.language(threadId),"server.mcp.signIn.expired")});let pending3=!connected&&find4(threadId,card.id)?.connector.status==="authorizing";return{status:200,body:{connected,pending:pending3,status:connected?"connected":pending3?"authorizing":"required"}}}function dismiss(threadId,card){patch2(threadId,card.id,{dismissed:!0}),cancel(card.
@@ -20054,12 +20054,12 @@ EMON")==="1")return parent2}return null}async function releaseBrowserProfile(dir
20054
20054
  heldProfiles.delete(dir);let table3=await processTable(!0);if(!table3)return;let browsers=[...table3].filter(([,entry2])=>!entry2.zombie&&namesProfile(entry2.args??"",dir)&&!/(?:^|\s)--type=/.test(entry2.args??""));for(let[pid,entry2]of browsers){let daemon=await daemonOf(pid,table3);if(daemon!==null){heldProfiles.set(dir,{target:target4,daemon});return}if(!await stopBrowserProcesses({daemon:pid,members:new Map([[pid,entry2.started]]),groups:entry2.pgid===pid?[pid]:[]}))return}for(let name6 of["\
20055
20055
  SingletonLock","SingletonSocket","SingletonCookie"])try{unlinkSync9(join80(dir,name6))}catch{}}var WINDOWS_PROFILE_BROWSERS="$d = $env:OMB_BROWSER_PROFILE; $all = @(Get-CimInstance Win32_Process); $by = @{}; foreach ($p in $all) { $by[$p.ProcessId] = $p } ; ConvertTo-Json -Compress -InputObject @($all | Where-Object { $_.CommandLine -and $_.CommandLine.IndexOf($d, [StringComparison]::OrdinalIgnoreCase) -ge 0 } | ForEach-Object { $q = $by[$_.ParentProcessId]; $g = $(if ($q) { $by[$q.ParentProcess\
20056
20056
  Id] }); [pscustomobject]@{ ProcessId = $_.ProcessId; ParentProcessId = $_.ParentProcessId; CommandLine = $_.CommandLine; Name = $_.Name; Started = $_.CreationDate.ToUniversalTime().ToString('o'); ParentName = $(if ($q) { $q.Name }); ParentStarted = $(if ($q) { $q.CreationDate.ToUniversalTime().ToString('o') }); GrandparentId = $(if ($q) { $q.ParentProcessId }); GrandparentName = $(if ($g) { $g.Name }); GrandparentStarted = $(if ($g) { $g.CreationDate.ToUniversalTime().ToString('o') }) } })",WINDOWS_PROCESS_STARTED="\
20057
- (Get-CimInstance Win32_Process -Filter ('ProcessId=' + [uint32]$env:OMB_PROCESS_ID)).CreationDate.ToUniversalTime().ToString('o')",CHROMIUM_IMAGE=/^(?:chrome|chromium|msedge|brave|chrome-headless-shell)\.exe$/i;function windowsArgs(line6){let args=[],arg="",quoted5=!1,started2=!1;for(let char of line6)char==='"'?(quoted5=!quoted5,started2=!0):!quoted5&&/\s/.test(char)?(started2&&args.push(arg),arg="",started2=!1):(arg+=char,started2=!0);return started2&&args.push(arg),args}function lockReleased(lock){
20057
+ (Get-CimInstance Win32_Process -Filter ('ProcessId=' + [uint32]$env:OMB_PROCESS_ID)).CreationDate.ToUniversalTime().ToString('o')",CHROMIUM_IMAGE=/^(?:chrome|chromium|msedge|brave|chrome-headless-shell)\.exe$/i;function windowsArgs(line6){let args=[],arg="",quoted5=!1,started3=!1;for(let char of line6)char==='"'?(quoted5=!quoted5,started3=!0):!quoted5&&/\s/.test(char)?(started3&&args.push(arg),arg="",started3=!1):(arg+=char,started3=!0);return started3&&args.push(arg),args}function lockReleased(lock){
20058
20058
  try{return unlinkSync9(lock),!0}catch(error66){return error66.code==="ENOENT"}}var heldWindowsProfiles=new Map;async function releaseWindowsProfile(dir,binaryPath,chromePath){let lock=join80(dir,"lockfile");if(lockReleased(lock)){heldWindowsProfiles.delete(dir);return}let held4=heldWindowsProfiles.get(dir);if(held4&&processAlive(held4.browser)&&await imageOf(held4.daemon)===held4.image&&(held4.shell===void 0||await imageOf(held4.shell)==="cmd.exe"))return;heldWindowsProfiles.delete(dir);let listing2=await execText(
20059
- "powershell.exe",["-NoProfile","-NonInteractive","-Command",WINDOWS_PROFILE_BROWSERS],{OMB_BROWSER_PROFILE:dir},15e3),rows2;try{rows2=JSON.parse(listing2??"")}catch{return}let flag4=`--user-data-dir=${dir}`.toLowerCase(),text30=value3=>typeof value3=="string"?value3:"",chromeImage=chromePath?win322.basename(chromePath).toLowerCase():void 0,isChrome=name6=>CHROMIUM_IMAGE.test(name6)||name6.toLowerCase()===chromeImage,parentOf=(name6,parentStarted,started2)=>text30(name6)&&text30(parentStarted)&&text30(
20060
- parentStarted)<=text30(started2)?text30(name6).toLowerCase():"",browsers=(Array.isArray(rows2)?rows2:[rows2]).flatMap(row=>{let{ProcessId:pid,ParentProcessId:ppid,CommandLine:line6,Name:name6,Started:started2,ParentName:parent2,ParentStarted:parentStarted,GrandparentId:gppid,GrandparentName:grandparent,GrandparentStarted:grandparentStarted}=row??{};if(!Number.isInteger(pid)||!Number.isInteger(ppid)||typeof line6!="string"||!isChrome(text30(name6))||!text30(started2))return[];let args=windowsArgs(
20061
- line6).map(arg=>arg.toLowerCase());if(!args.includes(flag4)||args.some(arg=>arg.startsWith("--type=")))return[];let daemon=parentOf(parent2,parentStarted,started2);return daemon==="cmd.exe"?[{pid,started:started2,daemonPid:gppid,shell:ppid,daemon:Number.isInteger(gppid)?parentOf(grandparent,grandparentStarted,parentStarted):""}]:[{pid,started:started2,daemonPid:ppid,daemon}]});for(let{pid,started:started2,daemonPid,shell:shell2,daemon}of browsers){if(daemon.startsWith("agent-browser")||binaryPath&&
20062
- daemon===win322.basename(binaryPath).toLowerCase()){heldWindowsProfiles.set(dir,{browser:pid,daemon:daemonPid,image:daemon,shell:shell2});return}(await execText("powershell.exe",["-NoProfile","-NonInteractive","-Command",WINDOWS_PROCESS_STARTED],{OMB_PROCESS_ID:String(pid)},15e3))?.trim()===started2&&await execText("taskkill",["/PID",String(pid),"/T","/F"])}browsers.length&&await within3(2e3,async()=>lockReleased(lock))}function stillRuns(tree,table3,pid){let entry2=table3.get(pid);return!!entry2&&
20059
+ "powershell.exe",["-NoProfile","-NonInteractive","-Command",WINDOWS_PROFILE_BROWSERS],{OMB_BROWSER_PROFILE:dir},15e3),rows2;try{rows2=JSON.parse(listing2??"")}catch{return}let flag4=`--user-data-dir=${dir}`.toLowerCase(),text30=value3=>typeof value3=="string"?value3:"",chromeImage=chromePath?win322.basename(chromePath).toLowerCase():void 0,isChrome=name6=>CHROMIUM_IMAGE.test(name6)||name6.toLowerCase()===chromeImage,parentOf=(name6,parentStarted,started3)=>text30(name6)&&text30(parentStarted)&&text30(
20060
+ parentStarted)<=text30(started3)?text30(name6).toLowerCase():"",browsers=(Array.isArray(rows2)?rows2:[rows2]).flatMap(row=>{let{ProcessId:pid,ParentProcessId:ppid,CommandLine:line6,Name:name6,Started:started3,ParentName:parent2,ParentStarted:parentStarted,GrandparentId:gppid,GrandparentName:grandparent,GrandparentStarted:grandparentStarted}=row??{};if(!Number.isInteger(pid)||!Number.isInteger(ppid)||typeof line6!="string"||!isChrome(text30(name6))||!text30(started3))return[];let args=windowsArgs(
20061
+ line6).map(arg=>arg.toLowerCase());if(!args.includes(flag4)||args.some(arg=>arg.startsWith("--type=")))return[];let daemon=parentOf(parent2,parentStarted,started3);return daemon==="cmd.exe"?[{pid,started:started3,daemonPid:gppid,shell:ppid,daemon:Number.isInteger(gppid)?parentOf(grandparent,grandparentStarted,parentStarted):""}]:[{pid,started:started3,daemonPid:ppid,daemon}]});for(let{pid,started:started3,daemonPid,shell:shell2,daemon}of browsers){if(daemon.startsWith("agent-browser")||binaryPath&&
20062
+ daemon===win322.basename(binaryPath).toLowerCase()){heldWindowsProfiles.set(dir,{browser:pid,daemon:daemonPid,image:daemon,shell:shell2});return}(await execText("powershell.exe",["-NoProfile","-NonInteractive","-Command",WINDOWS_PROCESS_STARTED],{OMB_PROCESS_ID:String(pid)},15e3))?.trim()===started3&&await execText("taskkill",["/PID",String(pid),"/T","/F"])}browsers.length&&await within3(2e3,async()=>lockReleased(lock))}function stillRuns(tree,table3,pid){let entry2=table3.get(pid);return!!entry2&&
20063
20063
  !entry2.zombie&&entry2.started===tree.members.get(pid)}function survivors(tree,table3){let same5=pid=>table3.get(pid)?.started===tree.members.get(pid),groups=tree.groups.filter(group2=>!table3.has(group2)||same5(group2)),pids=[...table3].filter(([pid,entry2])=>!entry2.zombie&&(tree.members.has(pid)&&same5(pid)||groups.includes(entry2.pgid))).map(([pid])=>pid);return{pids,groups:groups.filter(group2=>pids.some(pid=>table3.get(pid).pgid===group2))}}async function windowsDaemonRuns(tree){let image4=await imageOf(
20064
20064
  tree.daemon);return image4===null?null:!!image4&&image4===tree.image}async function browserProcessesRunning(tree){if(process.platform==="win32")return await windowsDaemonRuns(tree)??processAlive(tree.daemon);let table3=await processTable();return table3?survivors(tree,table3).pids.length>0:[...tree.members.keys()].some(processAlive)}async function within3(ms2,done){for(let until=Date.now()+ms2;;await new Promise(resolve56=>setTimeout(resolve56,100))){if(await done())return!0;if(Date.now()>=until)
20065
20065
  return!1}}async function stopBrowserProcesses(tree,graceMs=1500){if(process.platform==="win32")return await windowsDaemonRuns(tree)&&await execText("taskkill",["/PID",String(tree.daemon),"/T","/F"]),within3(2e3,async()=>await windowsDaemonRuns(tree)===!1);let send3=(target4,signal)=>{try{process.kill(target4,signal)}catch{}},rootRuns=async()=>{let table3=await processTable();return table3?stillRuns(tree,table3,tree.daemon):processAlive(tree.daemon)};await rootRuns()&&(send3(tree.daemon,"SIGTERM"),
@@ -20122,8 +20122,8 @@ onnection closed."))}}))}armIdle(){this.idleTimer&&clearTimeout(this.idleTimer),
20122
20122
  null?finish():this.child.stdin.end()})}stop(error66=new TransportError("Browser connection closed."),scope="tree"){if(this.stoppedPromise)return this.stoppedPromise;this.stopped=!0,this.idleTimer&&clearTimeout(this.idleTimer),this.buffer=Buffer.alloc(0);for(let pending3 of this.pending.values())clearTimeout(pending3.timer),pending3.reject(error66);return this.pending.clear(),this.onClose(),this.stoppedPromise=scope==="transport"?this.retireTransport():killCliTree(this.child,1e3).then(stopped=>{if(!stopped)
20123
20123
  try{process.platform!=="win32"&&this.child.pid?process.kill(-this.child.pid,"SIGKILL"):this.child.kill("SIGKILL")}catch{}}),this.stoppedPromise}},BrowserRuntime=class{gates=new Map;clients=new Map;recoveries=new Map;toolLists=new Map;idleCloseListeners=new Set;options;closeBrowser;applyViewport;launch;relayCommand;steps;lanes=new BrowserLanes;pageSizes=new PageSizes({apply:(session,size3)=>{let spec=this.gates.get(session)?.spec;return spec&&this.applyViewport?this.applyViewport(spec,size3):Promise.
20124
20124
  resolve()},lane:(session,work)=>this.lanes.run(session,work,this.options.laneWaitMs),watched:session=>{let gate=this.gates.get(session);return!!(gate&&gate.watchers>0&&!gate.closing)}});holds=new SecretHolds((session,clear2)=>this.lanes.run(session,()=>this.agentAction(session,clear2,!1),this.options.laneWaitMs).then(ran=>ran!==null));scrub;onTiming;constructor({closeBrowser:closeBrowser2,applyViewport,launch,relayCommand:relayCommand2,steps,scrub:scrub2,onTiming,...options2}={}){this.options={...BROWSER_CALL_DEFAULTS,
20125
- takeoverTimeoutMs:15e3,idleMs:6e4,maxPending:16,resultBudget:DEFAULT_BROWSER_RESULT_BUDGET,recoveryCheckMs:3e4,...options2},this.closeBrowser=closeBrowser2??(async()=>!1),this.applyViewport=applyViewport,this.launch=launch,this.relayCommand=relayCommand2,this.steps=steps,this.scrub=scrub2??scrubHeldSecrets,this.onTiming=onTiming}timed(session,tool5,phases,fn){if(!this.onTiming)return fn();let onTiming=this.onTiming,started2=performance.now(),inFlight=this.gate(session).agents,report2=outcome=>onTiming(
20126
- {session,tool:tool5,outcome,totalMs:performance.now()-started2,...phases,inFlight});return fn().then(result2=>(report2(result2?.isError===!0?"error":"ok"),result2),error66=>{throw report2("error"),error66})}gate(session){let gate=this.gates.get(session);return gate||(gate={owner:null,ready:!1,releasing:!1,agents:0,probes:0,dispatched:0,humans:0,uncertain:!1,lostCall:null,closing:!1,changed:new Set,watchers:0,calls:0,lastUsed:Date.now(),reopened:null},this.gates.set(session,gate)),gate}changed(gate){
20125
+ takeoverTimeoutMs:15e3,idleMs:6e4,maxPending:16,resultBudget:DEFAULT_BROWSER_RESULT_BUDGET,recoveryCheckMs:3e4,...options2},this.closeBrowser=closeBrowser2??(async()=>!1),this.applyViewport=applyViewport,this.launch=launch,this.relayCommand=relayCommand2,this.steps=steps,this.scrub=scrub2??scrubHeldSecrets,this.onTiming=onTiming}timed(session,tool5,phases,fn){if(!this.onTiming)return fn();let onTiming=this.onTiming,started3=performance.now(),inFlight=this.gate(session).agents,report2=outcome=>onTiming(
20126
+ {session,tool:tool5,outcome,totalMs:performance.now()-started3,...phases,inFlight});return fn().then(result2=>(report2(result2?.isError===!0?"error":"ok"),result2),error66=>{throw report2("error"),error66})}gate(session){let gate=this.gates.get(session);return gate||(gate={owner:null,ready:!1,releasing:!1,agents:0,probes:0,dispatched:0,humans:0,uncertain:!1,lostCall:null,closing:!1,changed:new Set,watchers:0,calls:0,lastUsed:Date.now(),reopened:null},this.gates.set(session,gate)),gate}changed(gate){
20127
20127
  gate.releasing&&gate.humans===0&&(gate.owner=null,gate.releasing=!1,gate.ready=!1);for(let notify2 of gate.changed)notify2()}async withAgentAction(session,fn){return this.agentAction(session,fn,!0)}async agentAction(session,fn,use){let gate=this.gate(session);if(gate.owner!==null)throw new Error(BROWSER_CONTROL_REFUSAL);if(gate.uncertain)throw new Error(BROWSER_INTERRUPTED);if(gate.closing)throw new Error("The browser is closing. Try again shortly.");gate.agents++;try{let result2=await fn();if(gate.
20128
20128
  owner!==null)throw new Error(BROWSER_CONTROL_REFUSAL);return result2}finally{gate.agents--,use&&(gate.lastUsed=Date.now()),this.changed(gate)}}async withSecretInput(session,spec,fn,ctx){let outcome=await this.lanes.run(session,async()=>{let value3=await this.withAgentAction(session,async()=>{let filled=await fn();return filled.held&&this.holds.hold(session,filled.held),filled}),step2=await this.steps?.signIn({session,spec,ctx},value3).catch(()=>null);return step2?{...value3,text:`${value3.text} \
20129
20129
  Recorded as step ${step2}.`}:value3},this.options.laneWaitMs);if(outcome===null)throw new Error(LANE_BUSY);return outcome}async previewFrame(session,capture){if(this.gate(session).agents>0||this.lanes.held(session))throw new Error("The browser is busy with an agent action.");let phases={};return this.timed(session,"preview_frame",phases,()=>this.agentAction(session,async()=>{let frame2=this.steps?.recentFrame(session)??await capture(),png2=frame2?.png;return typeof png2=="string"&&(phases.chars=
@@ -20814,8 +20814,8 @@ return state==="succeeded"?"completed":state==="queued"?"pending":state==="faile
20814
20814
  ` (key needs: ${body2.error.requiredScopes.join(", ")})`:"",hint=typeof body2?.error?.hint=="string"?` ${body2.error.hint}`:"";return json4(status5===403?409:status5,{ok:!1,message:`Instabox: ${message8}${scopes}${hint}${code?` [${code}]`:""}`,error:{code,message:message8}})}async function ib(token3,path6,call2={}){let headers={"X-API-Key":token3,...call2.headers};call2.body!==void 0&&(headers["content-type"]="application/json"),call2.idempotent&&(headers["Idempotency-Key"]??=randomUUID31());let raw=await fetch(
20815
20815
  `${INSTABOX_API}${path6}`,{method:call2.method??"GET",headers,body:call2.body===void 0?void 0:JSON.stringify(call2.body),signal:call2.signal??void 0}),body2=raw.headers.get("content-type")?.includes("json")?await raw.clone().json().catch(()=>null):null;return{status:raw.status,ok:raw.ok,body:body2,raw}}var WITH_DISPLAY='if [ -z "$DISPLAY" ]; then for s in /tmp/.X11-unix/X*; do [ -e "$s" ] && export DISPLAY=":${s##*X}" && break; done; fi; ';async function exec(token3,machineId,cmd,timeoutSeconds,signal){
20816
20816
  return ib(token3,`/v1/machines/${machineId}/exec`,{method:"POST",body:{cmd:WITH_DISPLAY+cmd,timeoutSeconds:Math.max(1,Math.min(EXEC_MAX_SECONDS,Math.round(timeoutSeconds))),noHistory:!0},signal})}var shellQuote=value3=>`'${value3.replace(/'/g,"'\\''")}'`,SCREEN_TOOLS=`command -v xdotool >/dev/null && command -v xclip >/dev/null && (command -v scrot || command -v import || command -v ffmpeg) >/dev/null || { S=; [ "$(id -u)" = 0 ] || S='sudo -n'; $S apt-get update -qq >/dev/null 2>&1; DEBIAN_FRONT\
20817
- END=noninteractive $S apt-get install -y -qq xdotool xclip scrot imagemagick >/dev/null 2>&1; }; command -v xdotool >/dev/null`,toolsReady=new Set;async function startDesktop(token3,machineId,signal){let status5=await ib(token3,`/v1/machines/${machineId}/desktop`,{method:"POST",body:{action:"status"},signal});if(!status5.ok)return boatError(status5.status,status5.body);if(!(status5.body?.running===!0||status5.body?.state==="running")){let started2=await ib(token3,`/v1/machines/${machineId}/deskt\
20818
- op`,{method:"POST",body:{action:"start",width:DESKTOP_WIDTH2,height:DESKTOP_HEIGHT},signal});if(!started2.ok)return started2.status===409||started2.status===202?"provisioning":boatError(started2.status,started2.body);if(!(started2.body?.running===!0||started2.body?.state==="running"))return"provisioning"}if(!toolsReady.has(machineId)){let tools2=await exec(token3,machineId,SCREEN_TOOLS,300,signal);tools2.ok&&tools2.body?.exitCode===0&&toolsReady.add(machineId)}return"ready"}async function startDetached(token3,machineId,command3,signal){
20817
+ END=noninteractive $S apt-get install -y -qq xdotool xclip scrot imagemagick >/dev/null 2>&1; }; command -v xdotool >/dev/null`,toolsReady=new Set;async function startDesktop(token3,machineId,signal){let status5=await ib(token3,`/v1/machines/${machineId}/desktop`,{method:"POST",body:{action:"status"},signal});if(!status5.ok)return boatError(status5.status,status5.body);if(!(status5.body?.running===!0||status5.body?.state==="running")){let started3=await ib(token3,`/v1/machines/${machineId}/deskt\
20818
+ op`,{method:"POST",body:{action:"start",width:DESKTOP_WIDTH2,height:DESKTOP_HEIGHT},signal});if(!started3.ok)return started3.status===409||started3.status===202?"provisioning":boatError(started3.status,started3.body);if(!(started3.body?.running===!0||started3.body?.state==="running"))return"provisioning"}if(!toolsReady.has(machineId)){let tools2=await exec(token3,machineId,SCREEN_TOOLS,300,signal);tools2.ok&&tools2.body?.exitCode===0&&toolsReady.add(machineId)}return"ready"}async function startDetached(token3,machineId,command3,signal){
20819
20819
  let processId=Math.floor(Date.now()/1e3)*1e3+Math.floor(Math.random()*1e3),base2=`${BG_DIR}/${processId}`,script=`mkdir -p ${BG_DIR}; ( bash -lc ${shellQuote(command3)} > ${base2}.out 2> ${base2}.err; echo $? > ${base2}.exit ) </dev/null >/dev/null 2>&1 & echo started`,res=await exec(token3,machineId,script,30,signal);return res.ok?/started/.test(String(res.body?.stdout??""))?json4(200,{processId}):json4(502,{ok:!1,message:"Instabox did not start the command"}):boatError(res.status,res.body)}async function readDetached(token3,machineId,processId,tailBytes,signal){
20820
20820
  if(!/^\d{1,16}$/.test(processId))return json4(404,{ok:!1,message:"unknown process"});let base2=`${BG_DIR}/${processId}`,n=Math.max(1,Math.min(1e6,tailBytes)),script=`[ -e ${base2}.out ] || { echo GONE; exit 0; }; printf 'EXIT:%s\\n' "$(cat ${base2}.exit 2>/dev/null)"; printf 'OUT:'; tail -c ${n} ${base2}.out | base64 -w0; printf '\\nERR:'; tail -c ${n} ${base2}.err | base64 -w0; echo`,res=await exec(token3,machineId,script,30,signal);if(!res.ok)return boatError(res.status,res.body);let out=String(
20821
20821
  res.body?.stdout??"");if(out.startsWith("GONE"))return json4(404,{ok:!1,message:"unknown process"});let field5=key7=>out.match(new RegExp(`^${key7}:(.*)$`,"m"))?.[1]?.trim()??"",exit2=field5("EXIT"),decode9=b64=>Buffer.from(b64,"base64").toString("utf8"),running5=exit2==="";return json4(200,{running:running5,exitCode:running5?null:Number.parseInt(exit2,10),stdout:decode9(field5("OUT")),stderr:decode9(field5("ERR"))})}async function instaboxFetch(rawToken,path6,opts={}){let token3=rawToken.trim(),
@@ -20828,7 +20828,7 @@ headers:key7?{"Idempotency-Key":`${key7}-${templateId}`}:{},body:{...name6?{name
20828
20828
  ok:!1,message:"not found"}):boatError(got.status,got.body)}if(method2==="PATCH"){let got=await ib(token3,`/v1/machines/${machineId}`,{signal});return got.ok?typeof reqBody?.name=="string"&&sandboxFrom(got.body).name!==reqBody.name?json4(409,{ok:!1,message:"Instabox cannot rename a machine; delete it and let Limix Bot create a new one"}):json4(200,{sandbox:sandboxFrom(got.body)}):boatError(got.status,got.body)}if(method2==="DELETE"){let removed=await ib(token3,`/v1/machines/${machineId}`,{method:"\
20829
20829
  DELETE",idempotent:!0,headers:{"X-Confirm-Delete":machineId},signal});if(removed.status===404||removed.status===410)return json4(404,{ok:!1,message:"not found"});if(!removed.ok)return boatError(removed.status,removed.body);let opId=typeof removed.body?.id=="string"?removed.body.id:null;if(!opId)return json4(202,{operation:{id:deletionOperationId(machineId),kind:"sandbox",targetId:machineId,status:"completed",stage:"completed"}});let id12=deletionOperationId(opId);deletionOps.set(id12,{opId,machineId});
20830
20830
  let status5=deletionStatus(removed.body?.state);return json4(202,{operation:{id:id12,kind:"sandbox",targetId:machineId,status:status5,stage:status5==="completed"?"completed":"removing"}})}}let action3=parts3.slice(2).join("/");if(method2==="POST"&&(action3==="resume"||action3==="stop")){let verb=action3==="stop"?"stop":"start";if(action3==="resume"){let got=await ib(token3,`/v1/machines/${machineId}`,{signal});got.ok&&got.body?.state==="suspended"&&(verb="resume")}let res=await ib(token3,`/v1/ma\
20831
- chines/${machineId}/${verb}`,{method:"POST",idempotent:!0,body:{},signal});return res.ok?json4(202,{ok:!0}):res.status===409?json4(409,{ok:!1,message:"busy"}):boatError(res.status,res.body)}if(method2==="POST"&&action3==="desktop"){let started2=await startDesktop(token3,machineId,signal);if(started2 instanceof Response)return started2;if(started2==="provisioning")return json4(200,{provisioning:!0});let stream2=await ib(token3,`/v1/machines/${machineId}/desktop/stream`,{method:"POST",body:{viewOnly:!1,
20831
+ chines/${machineId}/${verb}`,{method:"POST",idempotent:!0,body:{},signal});return res.ok?json4(202,{ok:!0}):res.status===409?json4(409,{ok:!1,message:"busy"}):boatError(res.status,res.body)}if(method2==="POST"&&action3==="desktop"){let started3=await startDesktop(token3,machineId,signal);if(started3 instanceof Response)return started3;if(started3==="provisioning")return json4(200,{provisioning:!0});let stream2=await ib(token3,`/v1/machines/${machineId}/desktop/stream`,{method:"POST",body:{viewOnly:!1,
20832
20832
  ttlSeconds:STREAM_TTL_SECONDS},signal});return stream2.ok?json4(200,{desktopUrl:typeof stream2.body?.url=="string"?stream2.body.url:null}):boatError(stream2.status,stream2.body)}if(method2==="POST"&&action3==="commands"){let command3=typeof reqBody?.command=="string"?reqBody.command:"";if(reqBody?.detached===!0)return startDetached(token3,machineId,command3,signal);let res=await exec(token3,machineId,command3,EXEC_MAX_SECONDS,signal);return res.ok?json4(200,{exitCode:res.body?.exitCode??null,stdout:res.
20833
20833
  body?.stdout??"",stderr:res.body?.stderr??"",...res.body?.timedOut?{timedOut:!0}:{}}):boatError(res.status,res.body)}if(method2==="GET"&&parts3[2]==="commands"&&parts3.length===4)return readDetached(token3,machineId,parts3[3],Number(url2.searchParams.get("tailBytes")??4096),signal);if(method2==="GET"&&(action3==="artifacts"||action3==="files")){let filePath2=url2.searchParams.get("path")??"";if(!filePath2.startsWith("/"))return json4(400,{ok:!1,message:"absolute path required"});let direct=await ib(
20834
20834
  token3,`/v1/machines/${machineId}/files/content?path=${encodeURIComponent(filePath2)}`,{signal});if(direct.ok&&!direct.raw.headers.get("content-type")?.includes("json")){let bytes4=Buffer.from(await direct.raw.arrayBuffer());return action3==="files"?json4(200,{content:bytes4.toString("base64")}):new Response(new Uint8Array(bytes4),{status:200,headers:{"content-type":"application/octet-stream"}})}let res=await exec(token3,machineId,`base64 -w0 ${shellQuote(filePath2)}`,60,signal);if(!res.ok)return boatError(
@@ -20998,7 +20998,7 @@ if(name6==="exec")return args.background===!0?START_LATE:EXEC_LATE}import{create
20998
20998
  2 ? 0 : 3)'`,3e4)).ok)return bot.file;let node3=await computer.run("node -v",3e4);if(!node3.ok||Number(/^v(\d+)/.exec(node3.stdout.trim())?.[1]??0)<22)throw new MeetingEngineError("The cloud computer needs Node.js 22 or newer for meeting notes.");let encoded=Buffer.from(bot.text).toString("base64");await must(computer,`mkdir -p ${ROOT2} && : > ${bot.file}.b64`,"Preparing the meeting bot");for(let i=0;i<encoded.length;i+=CHUNK)await must(computer,`printf %s ${quote2(encoded.slice(i,i+CHUNK))} >> ${bot.
20999
20999
  file}.b64`,"Copying the meeting bot");return await must(computer,`base64 -d ${bot.file}.b64 > ${bot.file}.tmp && mv ${bot.file}.tmp ${bot.file} && rm -f ${bot.file}.b64`,"Unpacking the meeting bot"),bot.file}async function put(computer,id12,command3){let bot=source4();await must(computer,`node ${bot.file} put ${folder3(id12)} ${Buffer.from(JSON.stringify(command3)).toString("base64")}`,"Reaching the meeting bot",3e4)}let speech=grant=>grant.kind==="eleven"?{kind:"eleven",token:grant.token,...grant.
21000
21000
  rotateMs?{rotateMs:grant.rotateMs}:{}}:{kind:grant.kind};return{async join(computer,start){let file3=await install2(computer),dir=folder3(start.id),config3={url:start.url,platform:start.platform,name:start.name,consent:start.consent,stt:speech(start.speech),maxMs:start.maxMs,lobbyMs:start.lobbyMs,aloneMs:start.aloneMs};await must(computer,`mkdir -p ${dir} && printf %s ${Buffer.from(JSON.stringify(config3)).toString("base64")} | base64 -d > ${dir}/config.json && chmod 600 ${dir}/config.json`,"Set\
21001
- ting up the meeting");let started2=await computer.start(`cd "$HOME" && exec node ${file3} run ${dir} >> ${dir}/stdout.log 2>&1`);if(!started2.ok)throw new MeetingEngineError(started2.error)},async events(computer,id12,after,waitSeconds){let bot=source4(),out=await must(computer,`node ${bot.file} wait ${folder3(id12)} ${Math.max(0,Math.floor(after))} ${Math.max(0,Math.floor(waitSeconds))}`,"Reading the meeting",(waitSeconds+45)*1e3),parsed2;try{parsed2=JSON.parse(out)}catch{throw new MeetingEngineError(
21001
+ ting up the meeting");let started3=await computer.start(`cd "$HOME" && exec node ${file3} run ${dir} >> ${dir}/stdout.log 2>&1`);if(!started3.ok)throw new MeetingEngineError(started3.error)},async events(computer,id12,after,waitSeconds){let bot=source4(),out=await must(computer,`node ${bot.file} wait ${folder3(id12)} ${Math.max(0,Math.floor(after))} ${Math.max(0,Math.floor(waitSeconds))}`,"Reading the meeting",(waitSeconds+45)*1e3),parsed2;try{parsed2=JSON.parse(out)}catch{throw new MeetingEngineError(
21002
21002
  "The meeting bot gave an unreadable answer.")}return{events:Array.isArray(parsed2.events)?parsed2.events:[],alive:parsed2.alive===!0}},chatSend:(computer,id12,message8)=>put(computer,id12,{kind:"chat",id:message8.id,text:message8.text}),leave:(computer,id12)=>put(computer,id12,{kind:"leave"}),supply:(computer,id12,grant)=>grant.kind==="eleven"?put(computer,id12,{kind:"token",token:grant.token}):Promise.resolve(),heard:(computer,id12,chunk)=>put(computer,id12,{kind:"words",start:chunk.start,words:chunk.
21003
21003
  words})}}var LEAVE_ACTION="meeting_leave",END_LINE={left:"server.meetings.end.left",stop_requested:"server.meetings.end.stop_requested",meeting_ended:"server.meetings.end.meeting_ended",removed:"server.meetings.end.removed",denied:"server.meetings.end.denied",lobby_timeout:"server.meetings.end.lobby_timeout",guests_blocked:"server.meetings.end.guests_blocked",meet_refused:"server.meetings.end.meet_refused",not_found:"server.meetings.end.not_found",join_failed:"server.meetings.end.join_failed",consent_failed:"\
21004
21004
  server.meetings.end.consent_failed",alone:"server.meetings.end.alone",max_length:"server.meetings.end.max_length",crashed:"server.meetings.end.crashed",lost:"server.meetings.end.lost",speech_unavailable:"server.meetings.end.speech_unavailable"},words3=(key7,params2)=>({key:key7,...params2?{params:params2}:{}}),clip6=(value3,max4)=>value3.length<=max4?value3:`${value3.slice(0,max4-1)}\u2026`,text11=(value3,said2,weight2)=>({type:"Text",value:clip6(value3,WIDGET_LIMITS.text),...weight2?{weight:weight2}:
@@ -21059,8 +21059,8 @@ OPENAI_API,openai,OPENAI_MODEL,"OpenAI",audio2,fetchImpl,signal)}:{kind:"whisper
21059
21059
  {}};let said2=typeof body2?.detail?.message=="string"?body2.detail.message:"";throw new SpeechRefusal(included2?said2||`Meeting transcription isn't available on this Cloud right now (${response.status}).`:`ElevenLabs refused a transcription token for the speech key in Settings (${response.status}).${said2?` ${said2}`:""}`)}async function transcribe(api,key7,model4,name6,audio2,fetchImpl,signal){let form2=new FormData;form2.append("file",new Blob([new Uint8Array(audio2)],{type:"audio/ogg"}),"spee\
21060
21060
  ch.ogg"),form2.append("model",model4),form2.append("response_format","verbose_json"),form2.append("timestamp_granularities[]","word"),form2.append("timestamp_granularities[]","segment");let response=await fetchImpl(`${api.replace(/\/+$/,"")}/audio/transcriptions`,{method:"POST",redirect:"error",headers:{authorization:`Bearer ${key7}`},body:form2,signal:signal??AbortSignal.timeout(6e4)}),body2=await response.json().catch(()=>null);if(!response.ok){let said2=typeof body2?.error?.message=="string"?
21061
21061
  ` ${body2.error.message.slice(0,200)}`:"";throw new SpeechRefusal(`${name6} refused the transcription request with the key in Settings (${response.status}).${said2}`)}let ms2=value3=>Math.max(0,Math.round(Number(value3)*1e3)||0),words6=Array.isArray(body2?.words)?body2.words.flatMap(w4=>typeof w4?.word=="string"&&w4.word.trim()?[{w:w4.word.trim(),s:ms2(w4.start),e:ms2(w4.end)}]:[]):[];if(words6.length)return words6;let segments3=Array.isArray(body2?.segments)?body2.segments.flatMap(s4=>typeof s4?.
21062
- text=="string"&&s4.text.trim()?[{w:s4.text.trim(),s:ms2(s4.start),e:ms2(s4.end)}]:[]):[];return segments3.length?segments3:typeof body2?.text=="string"&&body2.text.trim()?[{w:body2.text.trim(),s:0,e:0}]:[]}init_peer_provenance();var START_BUDGET_MS=15e4,BUSY_WAIT_MS=15*6e4;function createMeetingsHost(deps,routeDeps){let{cfg:cfg2,store:store5}=deps,engine=createBotEngine(),speaker2=record31=>{let bot=store5.bot(record31.botId);return bot?{id:bot.id,name:bot.name,color:bot.color}:null},computer=boxId=>({async run(command3,timeoutMs2){let result2=await runCommand2(cfg2,boxId,isolatedRemoteCommand(command3),{timeoutMs:timeoutMs2});return{ok:result2.ok,stdout:result2.stdout,stderr:result2.stderr}},async start(command3){let started2=await startInBackground(
21063
- cfg2,boxId,command3,AbortSignal.timeout(6e4));return started2.isError?{ok:!1,error:started2.content.map(part2=>"text"in part2?part2.text:"").join(" ")}:{ok:!0}}});async function followUp(record31,prompt){let until=Date.now()+BUSY_WAIT_MS;for(;deps.threadBusy(record31.botId,record31.threadId);){if(Date.now()>until)throw new Error("the conversation stayed busy");await new Promise(resolve56=>setTimeout(resolve56,2e3))}routeDeps().markOutside(record31.threadId),await deps.startTurn(record31.botId,prompt,
21062
+ text=="string"&&s4.text.trim()?[{w:s4.text.trim(),s:ms2(s4.start),e:ms2(s4.end)}]:[]):[];return segments3.length?segments3:typeof body2?.text=="string"&&body2.text.trim()?[{w:body2.text.trim(),s:0,e:0}]:[]}init_peer_provenance();var START_BUDGET_MS=15e4,BUSY_WAIT_MS=15*6e4;function createMeetingsHost(deps,routeDeps){let{cfg:cfg2,store:store5}=deps,engine=createBotEngine(),speaker2=record31=>{let bot=store5.bot(record31.botId);return bot?{id:bot.id,name:bot.name,color:bot.color}:null},computer=boxId=>({async run(command3,timeoutMs2){let result2=await runCommand2(cfg2,boxId,isolatedRemoteCommand(command3),{timeoutMs:timeoutMs2});return{ok:result2.ok,stdout:result2.stdout,stderr:result2.stderr}},async start(command3){let started3=await startInBackground(
21063
+ cfg2,boxId,command3,AbortSignal.timeout(6e4));return started3.isError?{ok:!1,error:started3.content.map(part2=>"text"in part2?part2.text:"").join(" ")}:{ok:!0}}});async function followUp(record31,prompt){let until=Date.now()+BUSY_WAIT_MS;for(;deps.threadBusy(record31.botId,record31.threadId);){if(Date.now()>until)throw new Error("the conversation stayed busy");await new Promise(resolve56=>setTimeout(resolve56,2e3))}routeDeps().markOutside(record31.threadId),await deps.startTurn(record31.botId,prompt,
21064
21064
  {threadId:record31.threadId,unattended:!0,cardContinuation:!0,origin:OUTSIDE})}let meetings=createMeetings({dataDir:deps.dataDir,engine,speech:record31=>speechSource(cfg2,{local:record31.local===!0}),async computerFor(record31){let bot=store5.bot(record31.botId);if(!bot)return{error:"The bot is gone."};if(!boatConfigured(cfg2))return{error:"Meeting notes need a cloud computer, and none is set up here."};let machine=record31.owner===bot.id?await deps.power().start(bot,{threadId:`meeting:${record31.
21065
21065
  id}`,generation:record31.id},{budgetMs:START_BUDGET_MS}):await readyBoat(cfg2,record31.owner,START_BUDGET_MS);return!machine||typeof machine.id!="string"?{error:"The cloud computer didn't start in time."}:(deps.power().used(record31.owner),{boxId:machine.id})},computer,touch:owner2=>deps.power().used(owner2),card:{show(record31){let bot=speaker2(record31);if(!bot)return null;let made=createAgentCard({store:store5,bot,threadId:record31.threadId,input:{tool:"show_widget",widget:liveCard(record31,0)},
21066
21066
  serverCard:!0});return made.ok?made.messageId:null},update(record31){let bot=speaker2(record31);!bot||!record31.cardMessageId||createAgentCard({store:store5,bot,threadId:record31.threadId,input:{tool:"update_widget",widget_id:record31.cardMessageId,widget:liveCard(record31,meetings.minutes(record31))},serverCard:!0})}},say(record31,line6){let language=conversationLanguage(record31.threadId),reason3=serverLine(language,END_LINE[line6.reason]),text30=line6.joined?serverLine(language,"server.meetin\
@@ -21146,18 +21146,18 @@ parsed2.error);let scope=parsed2.scope,servers=[],observers=new Map,searchable=n
21146
21146
  eligible("agents")&&servers.push(["agents",agentsServer]),integrations?.composio&&eligible("composio")&&servers.push(["composio",integrations.composio]),integrations?.composioOwn&&eligible(OWN_APPS_SERVER)&&servers.push([OWN_APPS_SERVER,integrations.composioOwn]),integrations?.data&&eligible("data")&&servers.push(["data",integrations.data]),integrations?.email&&eligible("email")&&servers.push(["email",integrations.email]),integrations?.device&&eligible("device")&&servers.push(["device",integrations.
21147
21147
  device]);let mustHave=descriptor=>descriptor===agentsServer||descriptor===integrations?.localComputer&&integrations?.localComputer?.scope!=="local-computer",startupMs=mcpStartupMs(),builtIns=servers.length,besideBrowser=servers.some(([,descriptor])=>descriptor===integrations?.browser),merged2=[],firstOf=new Map;for(let[name6,server2]of Object.entries(integrations?.custom??{})){if(!eligible(name6))continue;let key7=scope===void 0?sameServerKey(server2):void 0,first2=key7===void 0?void 0:firstOf.get(
21148
21148
  key7);if(first2){first2.same.push(name6);continue}key7!==void 0&&firstOf.set(key7,{server:name6,same:[]});let remote=remoteMcpSpec(server2)!==void 0,apps2=appMountFor(name6,{integrations});apps2&&!remote&&observers.set(name6,new AppObserver(apps2));let stdio=mcpStdioServer(server2,{nodeEnv:{ELECTRON_RUN_AS_NODE:"1"},...remote?{directory:{name:name6,...scope?{toolScope:scope}:{}}}:{},...apps2&&remote?{apps:apps2}:{}});if(!stdio)throw new Error("MCP server configuration is invalid");remote&&searchable.
21149
- add(name6),servers.push([name6,{command:stdio.command,args:stdio.args??[],env:stdio.env??{}}])}for(let group2 of firstOf.values())group2.same.length&&merged2.push(group2);if(servers.length>32)throw new Error("MCP server count exceeds the 32-server limit");let clients=[],skipped2=[],trimmed=[],started2=new Map,startedAt=[],closed=!1,closing,close2=()=>closing||(closed=!0,signal.removeEventListener("abort",cancel),closing=Promise.allSettled(clients.map(client=>client.close())).then(results=>{if(results.
21149
+ add(name6),servers.push([name6,{command:stdio.command,args:stdio.args??[],env:stdio.env??{}}])}for(let group2 of firstOf.values())group2.same.length&&merged2.push(group2);if(servers.length>32)throw new Error("MCP server count exceeds the 32-server limit");let clients=[],skipped2=[],trimmed=[],started3=new Map,startedAt=[],closed=!1,closing,close2=()=>closing||(closed=!0,signal.removeEventListener("abort",cancel),closing=Promise.allSettled(clients.map(client=>client.close())).then(results=>{if(results.
21150
21150
  some(result2=>result2.status==="rejected"))throw new ChatToolSessionError("MCP server shutdown could not be confirmed; execution outcome may be uncertain")}),closing),cancel=()=>{close2().catch(()=>{})};signal.addEventListener("abort",cancel,{once:!0});let definitions=[],registered2=new Map,catalog=new Map,directoryNames=new Map,directory,budget={limit:toolLimit,listed:0,servers:[]},register=(origin2,tools2)=>{let staged=[];for(let{tool:tool5,schema:schema4,check:check4}of tools2){let[listed3]=schemaProfile?
21151
21151
  fitToolList([tool5],schemaProfile,line6=>console.warn(`chat-mcp: ${origin2.server}: ${line6}`)):[tool5];if(!object2(listed3)||!object2(listed3.inputSchema))continue;let parameters={...check4==="full"?listed3.inputSchema:withoutDanglingReferences(listed3.inputSchema)},constraints={};if(computerUse)for(let key7 of["anyOf","oneOf","allOf","not"])key7 in parameters&&(constraints[key7]=parameters[key7],delete parameters[key7]);let description2=(typeof listed3.description=="string"?listed3.description:
21152
21152
  "Configured MCP tool")+(Object.keys(constraints).length?" Additional argument constraints (validated before execution): "+JSON.stringify(constraints):""),name6=uniqueName(chatToolName(origin2.server,tool5.name),candidate=>registered2.has(candidate)||staged.some(entry2=>entry2.definition.function.name===candidate));staged.push({tool:{...origin2,name:tool5.name,schema:schema4},definition:{type:"function",function:{name:name6,description:description2,parameters}}})}if(Buffer.byteLength(JSON.stringify(
21153
21153
  [...definitions,...staged.map(entry2=>entry2.definition)]))>CATALOG_BYTES)throw new Error("MCP tool catalog exceeds the 1MB limit");for(let{tool:tool5,definition:definition4}of staged)registered2.set(definition4.function.name,tool5),definitions.push(definition4);if(origin2.agents)for(let[alias,{tools:targets}]of Object.entries(AGENTS_TOOL_ALIASES)){let listed3=staged.find(entry2=>targets.includes(entry2.tool.name)),name6=chatToolName(origin2.server,alias);listed3&&!registered2.has(name6)&&registered2.
21154
- set(name6,{...listed3.tool,name:alias,schema:compileToolSchema({type:"object"})})}},skip=async(server2,error66,client=started2.get(server2))=>{let reason3=error66 instanceof Error?error66.message:"MCP server failed to start";skipped2.push({server:server2,reason:reason3}),console.warn(`chat-mcp: skipping MCP server "${server2}" for this turn: ${reason3}`),await client?.close()},offeredTools=[],configured2=[],layout=async limit2=>{definitions.length=0,registered2.clear(),catalog.clear(),directoryNames.
21154
+ set(name6,{...listed3.tool,name:alias,schema:compileToolSchema({type:"object"})})}},skip=async(server2,error66,client=started3.get(server2))=>{let reason3=error66 instanceof Error?error66.message:"MCP server failed to start";skipped2.push({server:server2,reason:reason3}),console.warn(`chat-mcp: skipping MCP server "${server2}" for this turn: ${reason3}`),await client?.close()},offeredTools=[],configured2=[],layout=async limit2=>{definitions.length=0,registered2.clear(),catalog.clear(),directoryNames.
21155
21155
  clear(),directory=void 0,trimmed.length=0,Object.assign(budget,{limit:limit2,listed:0,servers:[]});let room=limit2===null?1/0:Math.max(0,limit2-RUNTIME_TOOLS),wanted=[...offeredTools,...configured2].reduce((sum3,server2)=>sum3+server2.tools.length,0),searchRoom=configured2.some(server2=>server2.tools.length)&&wanted>room?DIRECTORY_TOOL_COUNT:0,shares=limit2===null?void 0:shareToolBudget(offeredTools.map(({origin:origin2,tools:tools2},index4)=>({name:String(index4),tools:tools2.length,agents:origin2.
21156
21156
  agents})).sort((a,b11)=>Number(b11.agents)-Number(a.agents)),room-searchRoom);for(let[index4,{origin:origin2,tools:listed3}]of offeredTools.entries()){let tools2=capToolList(listed3,shares?.get(String(index4)));tools2.length<listed3.length&&(trimmed.push({server:origin2.server,listed:tools2.length,of:listed3.length}),console.warn(`chat-mcp: "${origin2.server}" listed ${tools2.length} of ${listed3.length} tools to fit the model's ${limit2}-tool limit`)),register(origin2,tools2)}let direct=directServers(
21157
21157
  configured2.map(({origin:origin2,tools:tools2})=>({name:origin2.server,tools:tools2.length})),room-definitions.length),searched=[];for(let server2 of configured2){if(signal.aborted||closed)throw aborted2();if(!direct.has(server2.origin.server))searched.push(server2);else try{register(server2.origin,server2.tools)}catch(error66){configured2=configured2.filter(entry2=>entry2!==server2),await skip(server2.origin.server,error66,server2.origin.client);continue}budget.servers.push({name:server2.origin.
21158
21158
  server,tools:server2.tools.length,direct:direct.has(server2.origin.server)})}if(searched.length){let entries4=[];for(let{origin:origin2,tools:tools2}of searched)for(let{tool:tool5,schema:schema4}of tools2){let name6=uniqueName(chatToolName(origin2.server,tool5.name),candidate=>catalog.has(candidate));catalog.set(name6,{...origin2,name:tool5.name,schema:schema4}),entries4.push({...tool5,name:name6})}directory=new ToolDirectory(entries4,{check:(tool5,args)=>{let validate3=catalog.get(tool5.name).schema;
21159
21159
  return validate3(args)?void 0:schemaProblems(validate3.errors)}});for(let tool5 of directory.listed({server:DIRECTORY_SERVER,servers:searched.map(({origin:origin2})=>origin2.server)})){let name6=uniqueName(chatToolName(DIRECTORY_SERVER,tool5.name),candidate=>registered2.has(candidate)||directoryNames.has(candidate));directoryNames.set(name6,tool5.name),definitions.push({type:"function",function:{name:name6,description:tool5.description,parameters:tool5.inputSchema}})}}budget.listed=definitions.length};
21160
- try{if(signal.aborted)throw aborted2();let mounts=await Promise.allSettled(servers.map(async([name6,descriptor],index4)=>{if(signal.aborted||closed)throw aborted2();let client=new ChatMcpClient(descriptor,computerUse,index4>=builtIns);clients.push(client),started2.set(name6,client),startedAt[index4]=client;let computer=descriptor===integrations?.localComputer,keeps=tool5=>!computer||!object2(tool5)||typeof tool5.name!="string"||listsComputerTool(tool5.name,besideBrowser),include=tool5=>keeps(tool5)&&
21160
+ try{if(signal.aborted)throw aborted2();let mounts=await Promise.allSettled(servers.map(async([name6,descriptor],index4)=>{if(signal.aborted||closed)throw aborted2();let client=new ChatMcpClient(descriptor,computerUse,index4>=builtIns);clients.push(client),started3.set(name6,client),startedAt[index4]=client;let computer=descriptor===integrations?.localComputer,keeps=tool5=>!computer||!object2(tool5)||typeof tool5.name!="string"||listsComputerTool(tool5.name,besideBrowser),include=tool5=>keeps(tool5)&&
21161
21161
  (scope===void 0||object2(tool5)&&typeof tool5.name=="string"&&(searchable.has(name6)&&isDirectoryTool(tool5.name)||allowsTool(scope,{kind:"mcp",server:name6,name:tool5.name}))),tools2=await client.tools(signal,include,searchable.has(name6)?REMOTE_MCP_STARTUP_MS:startupMs,observers.get(name6));if(!tools2.length&&scope===void 0&&descriptor===integrations?.localComputer)throw new Error("The Local VM listed no tools");let launch=createHash47("sha256").update(JSON.stringify(descriptor)).digest("hex");
21162
21162
  return{origin:{client,server:name6,launch,builtInBrowser:descriptor===integrations?.browser,agents:descriptor===agentsServer,hostComputer:descriptor===integrations?.localComputer&&integrations?.localComputer?.scope==="local-computer",required:index4<builtIns&&mustHave(descriptor),searched:searchable.has(name6)},tools:tools2}}));for(let[index4,mount]of mounts.entries()){if(signal.aborted||closed)throw aborted2();let name6=servers[index4][0];if(mount.status==="rejected"){if(index4>=builtIns||OPTIONAL_BUILT_INS.
21163
21163
  has(name6)&&!mustHave(servers[index4][1])){await skip(name6,mount.reason,startedAt[index4]);continue}throw new Error(`MCP server "${name6}" didn't start: ${mount.reason instanceof Error?mount.reason.message:"no reason given"}`)}if(index4<builtIns){offeredTools.push({origin:mount.value.origin,tools:checkedTools(mount.value.tools,mount.value.origin.server)});continue}try{configured2.push({origin:mount.value.origin,tools:checkedTools(mount.value.tools,mount.value.origin.server)})}catch(error66){await skip(
@@ -21295,8 +21295,8 @@ idleMs()>=this.quietLimitMs()){this.expired();return}this.progressAt=Date.now()}
21295
21295
  return Date.now()-this.progressAt}quietLimitMs(){return this.runningTools.size>0?Math.max(this.limitMs,ROOM_TOOL_QUIET_LIMIT_MS):this.limitMs}hold(){this.heldAt=Date.now(),this.timer!==null&&(clearTimeout(this.timer),this.timer=null,this.idleMs()>=this.quietLimitMs()&&this.expired())}rearm(){this.timer!==null&&(clearTimeout(this.timer),this.timer=null,this.arm())}arm(){if(this.stopped||this.fired||this.openWaits>0)return;let leftMs=this.quietLimitMs()-this.idleMs();if(leftMs<=0){this.expired();return}
21296
21296
  this.timer=setTimeout(()=>{this.timer=null,this.arm()},leftMs)}expired(){this.stopped||this.fired||(this.fired=!0,this.fire())}},RoomTurnStallRegistry=class{handlers=new Map;register(threadId,handler){return this.handlers.set(threadId,handler),()=>{this.handlers.get(threadId)===handler&&this.handlers.delete(threadId)}}stall(threadId,cause){let handler=this.handlers.get(threadId);return handler?(this.handlers.delete(threadId),handler(cause),!0):!1}};function roomTurnTimeoutMessage(botName,minutes3,language){
21297
21297
  return serverLine(language,minutes3===1?"server.rooms.turnStalled.one":"server.rooms.turnStalled.many",{bot:botName,count:minutes3})}function roomTurnEnd(event2,orchestrated,claim2){return claim2?.parked?{outcome:"parked"}:claim2?{outcome:"provider_failed",stopReason:claim2.message}:orchestrated&&!event2.ok?{outcome:"provider_failed",stopReason:event2.stopReason??null}:{outcome:"settled"}}init_user_errors();init_chat_notices();init_user_errors();async function emailSignInRoute(deps,req,res,path6,method2){if(method2!=="POST"||path6!=="/api/auth/email/start"&&path6!=="/api/auth/email/verify")return!1;if(deps.cloudHome)return json3(res,403,{...userError("serverError.cloud.personal"),code:"cloud_personal"}),!0;if(!/^application\/json\b/i.test(String(req.headers["content-type"]??"")))return json3(res,415,{error:"send the sign-in request as JSON (content-type: application/json)"}),!0;let{emailSignIn:emailSignIn2,sessions:sessions2}=deps;
21298
- if(!emailSignIn2.enabled())return json3(res,404,userError("serverError.email.notSetUp")),!0;let source4=requestSource(req),allowed3=sessions2.attemptAllowed(source4);if(!allowed3.ok)return json3(res,429,userError("serverError.signIn.tooMany",{seconds:Math.ceil(allowed3.retryAfterMs/1e3)})),!0;let body2=await readBody(req),email3=typeof body2?.email=="string"?body2.email:"";if(path6==="/api/auth/email/start"){let started2=await emailSignIn2.start(email3,deps.target(req));return started2.ok?(json3(
21299
- res,200,{ok:!0}),!0):(started2.status===403&&sessions2.noteFailure(source4),json3(res,started2.status,refusalBody(started2)),!0)}let code=typeof body2?.code=="string"?body2.code:"",label4=typeof body2?.label=="string"?body2.label:"",verified=await emailSignIn2.verify(email3,code);if(!verified.ok)return(verified.status===401||verified.status===403)&&sessions2.noteFailure(source4),console.warn(`email sign-in refused from ${source4}: ${verified.error}`),json3(res,verified.status,refusalBody(verified)),
21298
+ if(!emailSignIn2.enabled())return json3(res,404,userError("serverError.email.notSetUp")),!0;let source4=requestSource(req),allowed3=sessions2.attemptAllowed(source4);if(!allowed3.ok)return json3(res,429,userError("serverError.signIn.tooMany",{seconds:Math.ceil(allowed3.retryAfterMs/1e3)})),!0;let body2=await readBody(req),email3=typeof body2?.email=="string"?body2.email:"";if(path6==="/api/auth/email/start"){let started3=await emailSignIn2.start(email3,deps.target(req));return started3.ok?(json3(
21299
+ res,200,{ok:!0}),!0):(started3.status===403&&sessions2.noteFailure(source4),json3(res,started3.status,refusalBody(started3)),!0)}let code=typeof body2?.code=="string"?body2.code:"",label4=typeof body2?.label=="string"?body2.label:"",verified=await emailSignIn2.verify(email3,code);if(!verified.ok)return(verified.status===401||verified.status===403)&&sessions2.noteFailure(source4),console.warn(`email sign-in refused from ${source4}: ${verified.error}`),json3(res,verified.status,refusalBody(verified)),
21300
21300
  !0;sessions2.clearFailures(source4);let issued=sessions2.issue({label:label4.trim()||labelFromUserAgent(req.headers["user-agent"]),scopes:verified.scopes,userId:verified.userId,email:verified.email}),secure=requestOrigin(req)?.startsWith("https://")===!0;return res.setHeader("set-cookie",serializeSessionCookie(deps.cookieName,issued.token,{secure,maxAgeSeconds:cookieMaxAgeSeconds(issued.session)})),json3(res,200,{session:issued.session,environment:deps.environment()}),!0}function createPersonStop(deps){let{store:store5}=deps;async function stopThreadForPerson2(botId,threadId,by){let routines2=deps.routines(),routine=routines2?.activeBotRunForBot(botId),free=deps.stopping(botId,threadId);routine?.threadId===threadId?await routines2.cancelRun(routine.id):(deps.handoffs().stoppedByPerson(threadId),deps.markStopped(threadId,by),deps.stopGoal(threadId),await deps.interruptDirectThread(botId,threadId)),free()}async function stopOnTypedCommand2(input2){let{botId,threadId,
21301
21301
  text:text30,trigger,busy}=input2;if(input2.fromApp||trigger.kind!=="user"&&trigger.kind!=="owner"||!isStopCommand(text30,store5.bot(botId)?.name))return null;let everyone=addressesEveryone(text30);if(!busy&&!everyone&&(input2.row.via||deps.asking(threadId)||!deps.working(botId,threadId)))return null;let refusal7=id12=>deps.stopRefusal?.(id12,input2.by??{admin:!1})??null,refused2=everyone?null:refusal7(threadId);if(refused2)throw Object.assign(new Error(refused2),{status:403,code:"stop_not_yours"});
21302
21302
  input2.personPresent&&deps.clearUnattended(threadId);let message8=store5.appendMessage(threadId,{role:"user",kind:"text",text:text30,...input2.row}),stopping2=(everyone?store5.tasks(botId).map(task2=>task2.threadId):[threadId]).filter(id12=>(id12===threadId&&busy||deps.working(botId,id12))&&refusal7(id12)===null);for(let id12 of stopping2)await stopThreadForPerson2(botId,id12,input2.row.sender);return stopping2.length||store5.appendMessage(threadId,{role:"bot",kind:"activity",tool:{name:serverLine(
@@ -21355,7 +21355,7 @@ open_url"&&isRedditAddress(String(args.url))?REDDIT_REFUSAL:null:"Unknown cloud
21355
21355
  y}`,command3;switch(name6){case"get_screen_size":command3="xdotool getdisplaygeometry";break;case"click":command3=`${mouse} click --repeat ${a.count??1} --delay 100 ${buttons[String(a.button??"left")]}`;break;case"move":command3=mouse;break;case"drag":command3=`${mouse} mousedown 1 mousemove --sync ${a.to_x} ${a.to_y} mouseup 1`;break;case"type_text":command3=`printf %s ${quote3(Buffer.from(String(a.text)).toString("base64"))} | base64 -d | xclip -selection clipboard && xdotool key --clearmodifi\
21356
21356
  ers ctrl+v`;break;case"key_press":command3=`xdotool key --clearmodifiers ${quote3(String(a.key))}`;break;case"scroll":command3=`${mouse} click --repeat ${a.amount??3} --delay 80 ${scrollButtons[String(a.direction)]}`;break;case"open_url":command3=`nohup xdg-open ${quote3(String(a.url))} >/dev/null 2>&1 </dev/null &`;break;case"exec":if(a.background===!0)return startInBackground(cfg2,boxId,String(a.command),signal);command3=String(a.command);break;case"exec_status":return backgroundStatus(cfg2,boxId,
21357
21357
  a,signal);default:return{isError:!0,content:[{type:"text",text:"Unknown cloud computer tool."}]}}let result2=await runCommand2(cfg2,boxId,isolatedRemoteCommand(command3),{signal});return signal.throwIfAborted(),name6==="open_url"&&result2.ok?{content:[{type:"text",text:"Browser launch requested. Page loading is not confirmed; inspect the screen before continuing."}]}:name6==="exec"&&result2.timedOut?{isError:!0,content:[{type:"text",text:EXEC_LATE}]}:{isError:!result2.ok,content:[{type:"text",text:JSON.
21358
- stringify(result2)}]}}async function cloudComputerRpc(request9,deps){let started2=Date.now();if(request9?.method==="tools/list")return deps.assertActive(),{tools:CLOUD_COMPUTER_TOOLS};if(request9?.method!=="tools/call")throw Object.assign(new Error("unsupported computer method"),{status:400});let params2=request9.params&&typeof request9.params=="object"?request9.params:{},args=params2.arguments??{},copy6=typeof params2.name=="string"&&COPY_TOOLS.has(params2.name),deadline=started2+(deps.budgetMs??
21358
+ stringify(result2)}]}}async function cloudComputerRpc(request9,deps){let started3=Date.now();if(request9?.method==="tools/list")return deps.assertActive(),{tools:CLOUD_COMPUTER_TOOLS};if(request9?.method!=="tools/call")throw Object.assign(new Error("unsupported computer method"),{status:400});let params2=request9.params&&typeof request9.params=="object"?request9.params:{},args=params2.arguments??{},copy6=typeof params2.name=="string"&&COPY_TOOLS.has(params2.name),deadline=started3+(deps.budgetMs??
21359
21359
  cloudComputerCallBudgetMs(params2.name)),problem=cloudComputerCallProblem(params2.name,args);if(problem)return{isError:!0,content:[{type:"text",text:problem}]};let control=await deps.gate();if(control.held)return{isError:!0,content:[{type:"text",text:controlRefusal(control)}]};deps.assertActive();let boxId=deps.boxId();if(!boxId)return{isError:!0,content:[{type:"text",text:CLOUD_COMPUTER_NOT_READY}]};let late=AbortSignal.timeout(Math.max(1,deadline-Date.now())),result2;try{result2=await runCloudComputerTool(
21360
21360
  deps.cfg,boxId,params2.name,args,AbortSignal.any([deps.signal,late]),deps.folder?.())}catch(error66){if(!late.aborted||deps.signal.aborted)throw error66;return{isError:!0,content:[{type:"text",text:commandLateText(params2.name,args)??(copy6?CLOUD_COMPUTER_COPY_LATE:CLOUD_COMPUTER_LATE)}]}}return deps.assertActive(),result2}init_engine();init_chart_compiler();var dataEngine2=dataEngine,compileChart2=compileChart,validateVegaLite2=async spec=>(await init_vega_lite_validator().then(()=>vega_lite_validator_exports)).validateVegaLite(spec),chartRenderer2={svg:async(...args)=>(await init_render().then(()=>render_exports)).chartRenderer.svg(...args),png:async(...args)=>(await init_render().then(()=>render_exports)).chartRenderer.png(...args)};init_data_surface();init_mcp_schema_validator();init_types();import{existsSync as existsSync41,mkdirSync as mkdirSync52,readdirSync as readdirSync26,realpathSync as realpathSync18,statSync as statSync20,writeFileSync as writeFileSync22}from"node:fs";import{randomUUID as randomUUID36}from"node:crypto";import{homedir as homedir18}from"node:os";import{basename as basename17,dirname as dirname39,extname as extname4,isAbsolute as isAbsolute19,join as join99,resolve as resolve26,sep as sep8}from"node:path";
21361
21361
  var IDENT="^[A-Za-z_][A-Za-z0-9_]{0,62}$",tool2=(name6,description2,properties,required4=[])=>({name:name6,description:description2,inputSchema:{type:"object",properties,required:required4,additionalProperties:!1}}),CHART_SPEC_SCHEMA={type:"object",description:"A small chart spec the server compiles to SQL (with the reduction) and Vega-Lite.",properties:{type:{type:"string",enum:["bar","line","area","scatter","histogram","pie","heatmap"]},x:{type:"string",maxLength:200,description:"Column for th\
@@ -21402,20 +21402,20 @@ reader2==="sqlite"||reader2==="xlsx")throw fail8("source_unsupported","A glob ne
21402
21402
  for(let entry2 of readdirSync26(local,{recursive:!0,withFileTypes:!0})){if(!entry2.isFile())continue;let reader2=readerFor(extensionOf(entry2.name),void 0);!reader2||reader2==="sqlite"||reader2==="xlsx"||(families.get(reader2)??families.set(reader2,new Set).get(reader2)).add(extensionOf(entry2.name).toLowerCase())}if(!families.size)throw fail8("source_unsupported",`${local} holds no csv, tsv, json or parquet files.`);let stem2=input2.name??basename17(local),folder3=local.replace(/\\/g,"/");return[
21403
21403
  ...families.entries()].map(([reader2,exts])=>{let globs=[...exts].map(ext=>`${folder3}/**/*${ext}`);return{kind:"folder",source:local,stem:families.size===1?stem2:`${stem2}_${reader2}`,reader:readerExpression(reader2,globs.length===1?globs[0]:globs,input2,!0),warnings}})}let reader=readerFor(extensionOf(local),kind2);if(!reader)throw fail8("source_unsupported",`No reader for ${extensionOf(local)||"a file without an extension"}.`,{hint:"Pass kind: csv, tsv, json, parquet, xlsx or sqlite."});return reader===
21404
21404
  "sqlite"?[{kind:"sqlite",source:local,stem:input2.name??stemOf(local),attach:{type:"sqlite",connection:local,table:input2.sheet},warnings}]:(reader==="xlsx"&&!input2.sheet&&warnings.push("Loaded the workbook's first sheet; pass sheet to load another."),extensionOf(local).toLowerCase()===".txt"&&warnings.push("Read as CSV; pass options.delimiter if the columns did not split."),[{kind:reader==="tsv"?"csv":reader,source:local,stem:input2.name??(input2.sheet?`${stemOf(local)}_${input2.sheet}`:stemOf(
21405
- local)),reader:readerExpression(reader,local,input2,!1),...reader==="xlsx"?{extensions:["excel"]}:{},warnings}])}var DATABASE_TABLES_MAX=25;async function loadData(ctx,input2){let started2=Date.now(),plans=planLoad(input2),replace3=input2.replace!==!1,existing=new Set((await ctx.database.listTables()).map(table3=>table3.name.toLowerCase())),unique2=base2=>{let stem2=tableNameFrom(base2),name6=stem2;for(let n=2;!replace3&&existing.has(name6.toLowerCase());n++)name6=`${stem2.slice(0,62-String(n).length)}\
21405
+ local)),reader:readerExpression(reader,local,input2,!1),...reader==="xlsx"?{extensions:["excel"]}:{},warnings}])}var DATABASE_TABLES_MAX=25;async function loadData(ctx,input2){let started3=Date.now(),plans=planLoad(input2),replace3=input2.replace!==!1,existing=new Set((await ctx.database.listTables()).map(table3=>table3.name.toLowerCase())),unique2=base2=>{let stem2=tableNameFrom(base2),name6=stem2;for(let n=2;!replace3&&existing.has(name6.toLowerCase());n++)name6=`${stem2.slice(0,62-String(n).length)}\
21406
21406
  _${n}`;return existing.add(name6.toLowerCase()),name6},tables=[],warnings=[],create5=async(name6,relation,plan,options2)=>{let sql=`CREATE ${replace3?"OR REPLACE ":""}TABLE ${quoteIdent(name6)} AS SELECT * FROM ${relation}`;await ctx.database.run(sql,runOptions(ctx,{extensions:plan.extensions}));let described=await ctx.database.describe(quoteIdent(name6),runOptions(ctx)),columns=boundColumns(described.columns,DATA_LIMITS.describeBytesMax,200).columns;ctx.sheet.recordSource({name:name6,sqlName:quoteIdent(
21407
21407
  name6),kind:plan.kind,source:plan.source,options:options2,rowCount:described.rowCount,columns,loadedAt:new Date().toISOString()}),tables.push({name:name6,rowCount:described.rowCount,columns,source:plan.source})},recordedOptions=plan=>({...input2.sheet?{sheet:input2.sheet}:{},...plan.attach?.table?{table:plan.attach.table}:{},...Object.fromEntries(Object.entries(input2.options??{}).filter(([,value3])=>value3!==void 0))});for(let plan of plans){if(warnings.push(...plan.warnings),plan.reader){await create5(
21408
21408
  unique2(plan.stem),plan.reader,plan,recordedOptions(plan));continue}let attach=plan.attach,alias=`omb_src_${Date.now().toString(36)}`;await ctx.database.run(`ATTACH ${quoteLiteral2(attach.connection)} AS ${quoteIdent(alias)} (TYPE ${attach.type}, READ_ONLY)`,runOptions(ctx,{extensions:[attach.type]}));try{let chosen;if(attach.table){let parts3=attach.table.split(".");chosen=[parts3.length>1?{schema:parts3[0],table:parts3.slice(1).join(".")}:{schema:"",table:attach.table}]}else{if(chosen=(await ctx.
21409
21409
  database.run(`SELECT schema_name, table_name FROM duckdb_tables() WHERE database_name = ${quoteLiteral2(alias)} AND NOT internal AND schema_name NOT IN ('information_schema', 'pg_catalog', 'mysql', 'performance_schema', 'sys') ORDER BY schema_name, table_name`,runOptions(ctx,{maxRows:DATABASE_TABLES_MAX+1}))).rows.map(row=>({schema:String(row[0]),table:String(row[1])})),chosen.length>DATABASE_TABLES_MAX)throw fail8("invalid_input",`${plan.source} has more than ${DATABASE_TABLES_MAX} tables.`,{hint:`\
21410
21410
  Pass sheet with one of: ${chosen.slice(0,DATABASE_TABLES_MAX).map(entry2=>`${entry2.schema}.${entry2.table}`).join(", ")}.`});if(!chosen.length)throw fail8("source_unsupported",`${plan.source} has no tables to load.`)}for(let entry2 of chosen){let relation=entry2.schema?`${quoteIdent(alias)}.${quoteIdent(entry2.schema)}.${quoteIdent(entry2.table)}`:`${quoteIdent(alias)}.${quoteIdent(entry2.table)}`,name6=unique2(chosen.length>1?entry2.table:input2.name??entry2.table);await create5(name6,relation,
21411
- plan,{...recordedOptions(plan),table:entry2.schema?`${entry2.schema}.${entry2.table}`:entry2.table})}}finally{await ctx.database.run(`DETACH ${quoteIdent(alias)}`,{connection:ctx.connection}).catch(()=>{})}}return{tables,warnings,elapsedMs:Date.now()-started2}}var IDENTIFIER_LIKE=/^\s*("[^"]+"|[A-Za-z_][\w$]*)(\.("[^"]+"|[A-Za-z_][\w$]*)){0,2}\s*$/;async function describeTarget(ctx,target4){let started2=Date.now(),relation,name6,sql;if(IDENTIFIER_LIKE.test(target4))name6=await ctx.database.resolveTable(
21411
+ plan,{...recordedOptions(plan),table:entry2.schema?`${entry2.schema}.${entry2.table}`:entry2.table})}}finally{await ctx.database.run(`DETACH ${quoteIdent(alias)}`,{connection:ctx.connection}).catch(()=>{})}}return{tables,warnings,elapsedMs:Date.now()-started3}}var IDENTIFIER_LIKE=/^\s*("[^"]+"|[A-Za-z_][\w$]*)(\.("[^"]+"|[A-Za-z_][\w$]*)){0,2}\s*$/;async function describeTarget(ctx,target4){let started3=Date.now(),relation,name6,sql;if(IDENTIFIER_LIKE.test(target4))name6=await ctx.database.resolveTable(
21412
21412
  target4.trim()),relation=name6;else{let kind2=gateSql(target4);if(kind2.kind!=="read"||!kind2.materialisable)throw fail8("invalid_input","Describe takes a table name or a SELECT.",{sql:target4});sql=target4,relation=`(${target4})`}let described=await ctx.database.describe(relation,runOptions(ctx)),{columns,truncated}=boundColumns(described.columns,DATA_LIMITS.describeBytesMax);return{...name6?{name:name6}:{},...sql?{sql}:{},rowCount:described.rowCount,columns,...truncated?{truncated}:{},elapsedMs:Date.
21413
- now()-started2}}async function describeSavedResult(ctx,id12){let cards=[...ctx.sheet.sheet().cards].reverse().sort((left2,right2)=>right2.updatedAt.localeCompare(left2.updatedAt)),selected=id12?cards.find(card2=>card2.id===id12):cards[0];if(id12&&!selected)throw fail8("card_not_found",`No card ${id12} on the sheet.`);let summary3=({id:id13,title:title3,kind:kind2,status:status5,rowCount,updatedAt,by})=>({id:id13,title:title3,kind:kind2,status:status5,rowCount,updatedAt,by}),card=selected?summary3(
21413
+ now()-started3}}async function describeSavedResult(ctx,id12){let cards=[...ctx.sheet.sheet().cards].reverse().sort((left2,right2)=>right2.updatedAt.localeCompare(left2.updatedAt)),selected=id12?cards.find(card2=>card2.id===id12):cards[0];if(id12&&!selected)throw fail8("card_not_found",`No card ${id12} on the sheet.`);let summary3=({id:id13,title:title3,kind:kind2,status:status5,rowCount,updatedAt,by})=>({id:id13,title:title3,kind:kind2,status:status5,rowCount,updatedAt,by}),card=selected?summary3(
21414
21414
  selected):null,result2={card,cards:[],tables:[],truncated:!1,omitted:[]},fits2=()=>Buffer.byteLength(JSON.stringify(result2))<=DATA_LIMITS.describeBytesMax;if(selected&&card)for(let field5 of["sql",selected.chart?"chart":"vegaLite"])selected[field5]!==void 0&&(card[field5]=selected[field5],fits2()||(delete card[field5],result2.omitted.push(field5),result2.truncated=!0));for(let entry2 of cards)if(result2.cards.push(summary3(entry2)),!fits2()){result2.cards.pop(),result2.truncated=!0;break}for(let{
21415
- name:name6,sqlName,rowCount}of await ctx.database.listTables())if(result2.tables.push({name:name6,...sqlName?{sqlName}:{},rowCount}),!fits2()){result2.tables.pop(),result2.truncated=!0;break}return result2}async function runSql(ctx,input2){let started2=Date.now(),limit2=Math.min(Math.max(1,Math.trunc(input2.limit??DATA_LIMITS.sqlRowsDefault)),DATA_LIMITS.sqlRowsMax),kind2=gateSql(input2.sql,{allowCreate:!0});if(kind2.kind==="create"){await ctx.database.run(input2.sql,runOptions(ctx));let described=await ctx.
21416
- database.describe(kind2.target,runOptions(ctx));return{table:kind2.target,columns:boundColumns(described.columns,DATA_LIMITS.describeBytesMax).columns,rowCount:described.rowCount,rows:[],truncated:!1,elapsedMs:Date.now()-started2}}if(!kind2.materialisable){let result2=await ctx.database.run(input2.sql,runOptions(ctx,{maxRows:limit2+1})),bounded4=boundRows(result2.rows,limit2,DATA_LIMITS.sqlBytesMax);return{table:null,columns:result2.columns,rowCount:result2.rowCount,rows:bounded4.rows,truncated:bounded4.
21417
- truncated||result2.truncated,elapsedMs:Date.now()-started2}}let name6=input2.name?tableNameFrom(input2.name):ctx.sheet.nextResultName(),materialised=await ctx.database.materialise(input2.sql,name6,runOptions(ctx)),page=await ctx.database.run(`SELECT * FROM ${materialised.table} LIMIT ${limit2+1}`,runOptions(ctx,{maxRows:limit2+1})),bounded3=boundRows(page.rows,limit2,DATA_LIMITS.sqlBytesMax);return{table:materialised.table,columns:materialised.columns,rowCount:materialised.rowCount,rows:bounded3.
21418
- rows,truncated:bounded3.truncated||materialised.rowCount>bounded3.rows.length,elapsedMs:Date.now()-started2}}var OUTPUT_TOO_LARGE_HINT="Aggregate or filter in SQL (GROUP BY, date_trunc, LIMIT) so the chart draws fewer marks.",cardRuns=new WeakMap;function cancelCardRun(sheet,id12){cardRuns.get(sheet)?.get(id12)?.controller.abort()}async function showCard(context3,input2,onCardReady){let started2=Date.now(),controller=new AbortController,ctx={...context3,signal:AbortSignal.any([context3.signal,controller.
21415
+ name:name6,sqlName,rowCount}of await ctx.database.listTables())if(result2.tables.push({name:name6,...sqlName?{sqlName}:{},rowCount}),!fits2()){result2.tables.pop(),result2.truncated=!0;break}return result2}async function runSql(ctx,input2){let started3=Date.now(),limit2=Math.min(Math.max(1,Math.trunc(input2.limit??DATA_LIMITS.sqlRowsDefault)),DATA_LIMITS.sqlRowsMax),kind2=gateSql(input2.sql,{allowCreate:!0});if(kind2.kind==="create"){await ctx.database.run(input2.sql,runOptions(ctx));let described=await ctx.
21416
+ database.describe(kind2.target,runOptions(ctx));return{table:kind2.target,columns:boundColumns(described.columns,DATA_LIMITS.describeBytesMax).columns,rowCount:described.rowCount,rows:[],truncated:!1,elapsedMs:Date.now()-started3}}if(!kind2.materialisable){let result2=await ctx.database.run(input2.sql,runOptions(ctx,{maxRows:limit2+1})),bounded4=boundRows(result2.rows,limit2,DATA_LIMITS.sqlBytesMax);return{table:null,columns:result2.columns,rowCount:result2.rowCount,rows:bounded4.rows,truncated:bounded4.
21417
+ truncated||result2.truncated,elapsedMs:Date.now()-started3}}let name6=input2.name?tableNameFrom(input2.name):ctx.sheet.nextResultName(),materialised=await ctx.database.materialise(input2.sql,name6,runOptions(ctx)),page=await ctx.database.run(`SELECT * FROM ${materialised.table} LIMIT ${limit2+1}`,runOptions(ctx,{maxRows:limit2+1})),bounded3=boundRows(page.rows,limit2,DATA_LIMITS.sqlBytesMax);return{table:materialised.table,columns:materialised.columns,rowCount:materialised.rowCount,rows:bounded3.
21418
+ rows,truncated:bounded3.truncated||materialised.rowCount>bounded3.rows.length,elapsedMs:Date.now()-started3}}var OUTPUT_TOO_LARGE_HINT="Aggregate or filter in SQL (GROUP BY, date_trunc, LIMIT) so the chart draws fewer marks.",cardRuns=new WeakMap;function cancelCardRun(sheet,id12){cardRuns.get(sheet)?.get(id12)?.controller.abort()}async function showCard(context3,input2,onCardReady){let started3=Date.now(),controller=new AbortController,ctx={...context3,signal:AbortSignal.any([context3.signal,controller.
21419
21419
  signal])};ctx.signal.throwIfAborted();let runs=cardRuns.get(ctx.sheet)??new Map;cardRuns.set(ctx.sheet,runs);let card=input2.id?ctx.sheet.card(input2.id):void 0;if(input2.id&&!card)throw fail8("card_not_found",`No card ${input2.id} on the sheet.`);let kind2=input2.kind??card?.kind,chart=input2.chart??(kind2==="chart"&&!input2.vegaLite?card?.chart:void 0),vegaLite=input2.vegaLite??(kind2==="chart"&&!chart?card?.vegaLite:void 0);if(input2={...input2,chart,vegaLite,live:input2.live||!!(card?.result&&
21420
21420
  ctx.by==="bot")},input2.live&&card?.status==="running"&&!card.result)throw fail8("invalid_input","Wait for this card's first result before editing its SQL.");let claim2=id12=>{let previous2=runs.get(id12);previous2?.controller.abort(),runs.set(id12,{controller,previous:previous2?.previous??card})};if(card&&claim2(card.id),input2.live&&card?.status==="running"){let previous2=runs.get(card.id)?.previous;card=ctx.sheet.updateCard(card.id,{status:previous2?.status==="failed"?"failed":"ready",error:previous2?.
21421
21421
  error,by:previous2?.by??card.by})}let current3=()=>card!==void 0&&runs.get(card.id)?.controller===controller&&ctx.sheet.card(card.id)!==void 0,assertCurrent=()=>{if(ctx.signal.throwIfAborted(),!current3())throw fail8("cancelled","A newer edit replaced this query.")},resultName,committed=!1,cardSql=input2.sql,warnings=[];try{if(kind2!=="table"&&kind2!=="chart")throw fail8("invalid_input",'A new result needs kind "table" or "chart".');if(input2.live&&!input2.id)throw fail8("invalid_input","A live \
@@ -21426,8 +21426,8 @@ rowCount>=limit2;truncated&&warnings.push(`The card keeps the first ${limit2.toL
21426
21426
  ctx));if(materialised.rowCount>DATA_LIMITS.chartMaxMarks)throw fail8("output_too_large",`The chart would draw ${materialised.rowCount.toLocaleString("en-US")} marks; the limit is ${DATA_LIMITS.chartMaxMarks.toLocaleString("en-US")}.`,{sql:compiled.sql,hint:OUTPUT_TOO_LARGE_HINT});let counted3=await ctx.database.run(`SELECT count(*) FROM ${from}`,runOptions(ctx,{maxRows:1})),inputRows=Number(counted3.rows[0]?.[0]??0),method2=inputRows===materialised.rowCount?"none":compiled.reduction.method,reduction={
21427
21427
  ...compiled.reduction,method:method2,inputRows,outputRows:materialised.rowCount};patch2={result:resultName,columns:materialised.columns,rowCount:materialised.rowCount,truncated:!1,chart:input2.chart,vegaLite:compiled.vegaLite,reduction}}else{let vegaLite2=await ctx.validateVegaLite(input2.vegaLite),limit2=Math.min(Math.max(1,Math.trunc(input2.limit??DATA_LIMITS.chartMaxMarks)),DATA_LIMITS.chartMaxMarks),materialised=await ctx.database.materialise(`SELECT * FROM ${from} LIMIT ${limit2+1}`,resultName,
21428
21428
  runOptions(ctx));if(materialised.rowCount>limit2)throw fail8("output_too_large",`The chart would bind more than ${limit2.toLocaleString("en-US")} rows.`,{sql:cardSql,hint:OUTPUT_TOO_LARGE_HINT});let counted3=await ctx.database.run(`SELECT count(*) FROM ${from}`,runOptions(ctx,{maxRows:1})),reduction={method:"none",inputRows:Number(counted3.rows[0]?.[0]??0),outputRows:materialised.rowCount};patch2={result:resultName,columns:materialised.columns,rowCount:materialised.rowCount,truncated:!1,chart:void 0,
21429
- vegaLite:vegaLite2,reduction}}assertCurrent();let previousResult=ctx.sheet.card(card.id)?.result,ready=ctx.sheet.updateCard(card.id,{...patch2,kind:kind2,title:input2.title??ctx.sheet.card(card.id)?.title??title3,sql:cardSql,by:ctx.by,status:"ready",error:void 0,elapsedMs:Date.now()-started2});return committed=!0,onCardReady?.(ready),previousResult&&previousResult!==resultName&&await ctx.database.dropResult(previousResult,ctx.connection).catch(()=>{}),{id:ready.id,sheet:ctx.sheet.outline(),rowCount:ready.
21430
- rowCount??0,...ready.truncated?{truncated:!0}:{},...ready.reduction?{reduction:ready.reduction}:{},warnings,elapsedMs:Date.now()-started2}}catch(error66){let dataError=toDataError(error66,cardSql,ctx.signal);throw card&&current3()&&!input2.live&&ctx.sheet.updateCard(card.id,{status:"failed",error:dataError,elapsedMs:Date.now()-started2}),new DataFailure(dataError)}finally{card&&runs.get(card.id)?.controller===controller&&runs.delete(card.id),resultName&&!committed&&await ctx.database.dropResult(
21429
+ vegaLite:vegaLite2,reduction}}assertCurrent();let previousResult=ctx.sheet.card(card.id)?.result,ready=ctx.sheet.updateCard(card.id,{...patch2,kind:kind2,title:input2.title??ctx.sheet.card(card.id)?.title??title3,sql:cardSql,by:ctx.by,status:"ready",error:void 0,elapsedMs:Date.now()-started3});return committed=!0,onCardReady?.(ready),previousResult&&previousResult!==resultName&&await ctx.database.dropResult(previousResult,ctx.connection).catch(()=>{}),{id:ready.id,sheet:ctx.sheet.outline(),rowCount:ready.
21430
+ rowCount??0,...ready.truncated?{truncated:!0}:{},...ready.reduction?{reduction:ready.reduction}:{},warnings,elapsedMs:Date.now()-started3}}catch(error66){let dataError=toDataError(error66,cardSql,ctx.signal);throw card&&current3()&&!input2.live&&ctx.sheet.updateCard(card.id,{status:"failed",error:dataError,elapsedMs:Date.now()-started3}),new DataFailure(dataError)}finally{card&&runs.get(card.id)?.controller===controller&&runs.delete(card.id),resultName&&!committed&&await ctx.database.dropResult(
21431
21431
  resultName,ctx.connection).catch(()=>{})}}var same=(a,b11)=>process.platform==="win32"?a.toLowerCase()===b11.toLowerCase():a===b11,isUnder=(child2,root3)=>same(child2,root3)||(process.platform==="win32"?child2.toLowerCase().startsWith(`${root3.toLowerCase()}${sep8}`):child2.startsWith(`${root3}${sep8}`));function realIntent(path6){let dir=path6,rest=[];for(;!existsSync41(dir);){let parent2=dirname39(dir);if(parent2===dir)return path6;rest.unshift(basename17(dir)),dir=parent2}return join99(realpathSync18.
21432
21432
  native(dir),...rest)}function resolveExportPath(roots,requested,stem2,ext){let allowed3=roots.filter(root3=>root3&&isAbsolute19(root3)).map(root3=>resolve26(root3));if(!allowed3.length)throw fail8("invalid_input","There is no folder to export into on this computer.");let target4;if(!requested)target4=join99(allowed3[0],`${tableNameFrom(stem2)}.${ext}`);else{let expanded=requested.startsWith("~/")||requested==="~"?join99(homedir18(),requested.slice(1)):requested;target4=resolve26(isAbsolute19(expanded)?
21433
21433
  expanded:join99(allowed3[0],expanded)),existsSync41(target4)&&statSync20(target4).isDirectory()?target4=join99(target4,`${tableNameFrom(stem2)}.${ext}`):extname4(target4)||(target4=`${target4}.${ext}`)}let intent=realIntent(target4);if(!allowed3.some(root3=>isUnder(intent,realIntent(root3))))throw fail8("invalid_input",`${requested??target4} is outside the folders an export may use.`,{hint:`Export into ${allowed3.join(" or ")}.`});let unique2=target4;for(let n=2;existsSync41(unique2);n++)unique2=
@@ -21597,7 +21597,7 @@ thod not allowed"});let done=await postiz2.disconnect();return done.ok?json7(res
21597
21597
  let mark2=markOf(url2,key7);rejected.has(mark2)||(rejected.add(mark2),changed())}function noteKeyAccepted(url2,key7){rejected.size>0&&rejected.delete(markOf(url2,key7))&&changed()}function forgetKey(key7){if(rejected.size===0)return;let suffix=` ${fingerprint2(key7)}`,before=rejected.size;for(let mark2 of rejected)mark2.endsWith(suffix)&&rejected.delete(mark2);rejected.size!==before&&changed()}function onKeyRejectionChange(listener2){return listeners.add(listener2),()=>listeners.delete(listener2)}
21598
21598
  function rejectsKey(status5,body2){return/\b(?:quota|billing|credits?|rate.?limit|insufficient.?(?:balance|funds))\b/i.test(body2)?!1:status5===401?!0:status5!==400&&status5!==403?!1:/\binvalid_api_key\b|\b(?:invalid|incorrect|revoked|expired|disabled|deactivated)[ _-]?(?:api[ _-]?)?key\b|\bapi[ _-]?key (?:is |was |has been )?(?:invalid|incorrect|revoked|expired|disabled|not valid)\b/i.test(body2)}init_mcp_registry();init_connection();var KEY_CHECK_MS=15e3,RECHECK_MS=5*6e4,BUSY_RETRY_MS=50,BUSY_GIVE_UP_MS=1e4,hostOf2=address3=>{try{return new URL(address3).host}catch{return address3}};function keyCheckRefusal(result2,address3){let host3=hostOf2(address3);return result2.reason==="keys"||result2.auth==="required"?{status:400,code:"key_rejected",error:"Postiz didn't accept this API key. Copy it again from Postiz \u2192 Settings \u2192 Public API."}:result2.reason==="unreachable"||result2.reason===
21599
21599
  "timeout"?{status:400,code:"unreachable",error:`Couldn't reach a Postiz server at ${host3}. Check the address and try again.`}:{status:400,code:"not_postiz",error:`${host3} didn't answer like Postiz. Check the address. Postiz Cloud's is https://api.postiz.com.`}}function createPostiz(deps){let probe2=deps.probe??probeMcpServer,now2=deps.now??Date.now,checkedAt2=-1/0,entry2=()=>{let raw=deps.cfg().mcpServers?.[POSTIZ_SERVER];if(raw===void 0)return;let parsed2=parseStoredMcpServer(POSTIZ_SERVER,raw);
21600
- return parsed2.ok&&isRemoteMcpServer(parsed2.server)?parsed2.server:null},method2=()=>{let current3=entry2();return current3===void 0?null:current3?postizEntryMethod(current3,deps.cfg().postiz)??"taken":"taken"},taken={status:409,code:"taken",error:"An MCP server named postiz is already set up in MCP servers. Remove it there to connect Postiz here."},write4=(next,started2=now2())=>{if(deps.mcpConfigBusy.get()){now2()-started2<BUSY_GIVE_UP_MS&&setTimeout(()=>write4(next,started2),BUSY_RETRY_MS).unref?.();
21600
+ return parsed2.ok&&isRemoteMcpServer(parsed2.server)?parsed2.server:null},method2=()=>{let current3=entry2();return current3===void 0?null:current3?postizEntryMethod(current3,deps.cfg().postiz)??"taken":"taken"},taken={status:409,code:"taken",error:"An MCP server named postiz is already set up in MCP servers. Remove it there to connect Postiz here."},write4=(next,started3=now2())=>{if(deps.mcpConfigBusy.get()){now2()-started3<BUSY_GIVE_UP_MS&&setTimeout(()=>write4(next,started3),BUSY_RETRY_MS).unref?.();
21601
21601
  return}deps.mcpConfigBusy.set(!0);try{let servers={...deps.cfg().mcpServers},before=entry2();next?servers[POSTIZ_SERVER]=next:delete servers[POSTIZ_SERVER],deps.persistMcpServers(servers),(!next||before?.url!==next.url)&&deps.mcpOAuth.forget(POSTIZ_SERVER),deps.appCatalog?.forgetServer(POSTIZ_SERVER),next&&deps.appCatalog?.serverChanged(POSTIZ_SERVER),checkedAt2=-1/0}finally{deps.mcpConfigBusy.set(!1)}},server2=(url2,enabled)=>({type:"http",url:url2,headers:{},enabled}),status5=()=>{let cfg2=deps.
21602
21602
  cfg(),address3=savedPostizAddress(cfg2.postiz),key7=cfg2.postiz?.key?.trim()??"",team=!!deps.team.team,base2={address:address3,host:hostOf2(address3),selfHosted:address3!==postizCloud(),keySaved:key7!=="",team,scope:team?deps.team.scopes.scope("mcp",POSTIZ_SERVER):"team"},how=method2(),refusal7=deps.mcpPolicyRefusal(POSTIZ_SERVER,server2(how==="key"?postizKeyUrl(address3):postizSignInUrl(),!1));if(refusal7)return{...base2,state:"blocked",how:null,message:refusal7};if(how==="taken")return{...base2,
21603
21603
  state:"taken",how:null};let current3=entry2();if(!current3||how!=="sign-in"&&how!=="key")return{...base2,state:"not-connected",how:null};if(how==="sign-in"){let auth=deps.mcpOAuth.authState(POSTIZ_SERVER,current3.url);return auth==="needs-sign-in"?{...base2,state:"needs-sign-in",how}:{...base2,state:auth==="signed-in"&&current3.enabled?"connected":"not-connected",how}}return key7?keyRejected(current3.url,key7)?{...base2,state:"key-refused",how}:{...base2,state:current3.enabled?"connected":"not-c\
@@ -21919,49 +21919,49 @@ ${batch.threadId}`,entry2=byThread.get(key7)??{botId:batch.botId,threadId:batch.
21919
21919
  []}catch{return[]}}function dropPending(botId){let parsed2;try{parsed2=JSON.parse(readFileSync85(pendingPath(),"utf8"))}catch{return}if(!Array.isArray(parsed2?.batches))return;let kept2=parsed2.batches.filter(batch=>batch?.botId!==botId);if(kept2.length!==parsed2.batches.length)try{kept2.length?writeFileAtomic(pendingPath(),`${JSON.stringify({batches:kept2})}
21920
21920
  `,{mode:384}):rmSync34(pendingPath(),{force:!0})}catch{}}function readRaw(botId,relative27){try{return readMemoryText(join110(workspaceDir(botId),relative27))}catch{return null}}async function askModel(engine,prompt,timeoutMs2=MODEL_TIMEOUT_MS){if(!engine.generateText)return null;let expiry=new AbortController,timer4,expired2=new Promise((_3,reject)=>{timer4=setTimeout(()=>{let error66=new DOMException("The background model call timed out.","TimeoutError");expiry.abort(error66),reject(error66)},
21921
21921
  timeoutMs2),timer4.unref?.()});try{let answer2=await Promise.race([engine.generateText(prompt,{signal:expiry.signal}),expired2]);return typeof answer2=="string"?answer2:null}catch{return null}finally{clearTimeout(timer4)}}function callBytes(batch){let{said:said2,replied}=captureSize(batch.turns);return said2+replied}var IDEAS_FOR_MS=1440*6e4,NO_DREAM_ENGINE="This bot's engine cannot make the background model call a dream uses.",NO_TEXT_ENGINE="This bot's engine cannot make the quick background m\
21922
- odel call upkeep uses, so only expired notes and exact duplicates are tidied.";function createMemoryUpkeep(deps){let now2=()=>deps.now?.()??new Date,log7=line6=>deps.log?.(line6),inflight=new Set,tidying=new Map,dreaming=new Map,timer4=null,first2=null,generation=0,paused=!1,cancelled=started2=>started2!==generation||paused,queue=[],worker=null,known=null,unsaved2=!1,open14=[],loaded2=()=>known??=loadState();function flush(){if(!(!unsaved2||!known)&&saveState(known)){unsaved2=!1;for(let batch of open14)
21922
+ odel call upkeep uses, so only expired notes and exact duplicates are tidied.";function createMemoryUpkeep(deps){let now2=()=>deps.now?.()??new Date,log7=line6=>deps.log?.(line6),inflight=new Set,tidying=new Map,dreaming=new Map,timer4=null,first2=null,generation=0,paused=!1,cancelled=started3=>started3!==generation||paused,queue=[],worker=null,known=null,unsaved2=!1,open14=[],loaded2=()=>known??=loadState();function flush(){if(!(!unsaved2||!known)&&saveState(known)){unsaved2=!1;for(let batch of open14)
21923
21923
  batch.dirty=!1}}function batched(work2,flushWhileOpen=!1){let batch={dirty:!1,flushWhileOpen};open14.push(batch);let end=()=>{let at8=open14.lastIndexOf(batch);at8>=0&&open14.splice(at8,1),batch.dirty&&(batch.flushWhileOpen||!open14.length)&&flush()},promise2;try{promise2=work2()}catch(error66){throw end(),error66}return promise2.finally(end)}let record31=(botId,patch2)=>{if(!deps.bot(botId))return;let state=loaded2();if(state.bots[botId]={...state.bots[botId],...patch2},unsaved2=!0,!open14.length){
21924
21924
  flush();return}for(let batch of open14)batch.dirty=!0},track2=promise2=>(inflight.add(promise2),promise2.finally(()=>inflight.delete(promise2)).catch(()=>{}),promise2),writing=deps.writing??((_botId,write4)=>write4());function fileCandidates(botId,candidates,filed){let before=readRaw(botId,"MEMORY.md"),archiveBefore=readRaw(botId,ARCHIVE_PATH),fresh=newCandidates(candidates,before??"").filter(candidate=>!isForgotten(candidate.text)),{source:source4,via,threadId}=filed,kept2=[],added=0,byTopic=new Map;
21925
21925
  for(let candidate of fresh){if(candidate.topic){byTopic.set(candidate.topic,[...byTopic.get(candidate.topic)??[],candidate]);continue}updateMemory(botId,{action:"append",text:candidate.text,...candidate.until?{until:candidate.until}:{}},{source:source4,now:now2()}).ok&&(added+=1,kept2.push({text:candidate.text,where:"MEMORY.md"}))}recordMemoryChange(botId,{path:ARCHIVE_PATH,actor:"upkeep",via,threadId,before:archiveBefore,after:readRaw(botId,ARCHIVE_PATH)}),added&&recordMemoryChange(botId,{path:"\
21926
21926
  MEMORY.md",actor:"upkeep",via,threadId,before,after:readRaw(botId,"MEMORY.md")});let existing=new Map(listMemoryTopics(botId).map(topic=>[topic.name.toLowerCase(),topic.name])),topics=0;for(let[wanted,group2]of byTopic){let name6=existing.get(wanted)??wanted,path6=`memory/${name6}`,current3=readRaw(botId,path6);if(current3!==null&&Buffer.byteLength(current3,"utf8")>TOPIC_MAX_BYTES)continue;let seen=notebookIdentities(current3??""),unseen=group2.filter(candidate=>!seen.has(factIdentity(candidate.
21927
21927
  text))),lines=unseen.map(candidate=>memoryEntry(candidate.text,{source:source4,now:now2(),...candidate.until?{until:candidate.until}:{}}));if(!lines.length)continue;let title3=name6.replace(/\.md$/,"").replace(/-/g," "),aliases=[...new Set(group2.flatMap(candidate=>candidate.topicAliases??[]))];try{writeMemoryTopic(botId,name6,mergeTopicText(current3,{title:title3,aliases,lines}))}catch{continue}recordMemoryChange(botId,{path:path6,actor:"upkeep",via,threadId,before:current3,after:readRaw(botId,
21928
21928
  path6)}),existing.set(name6.toLowerCase(),name6),topics+=lines.length,kept2.push(...unseen.map(candidate=>({text:candidate.text,where:path6})))}return{added,topics,kept:kept2}}function attribute(candidates,conversations2,still){let owner2=conversations2.map(conversation2=>conversation2.turns.every(turn=>turn.owner!==!1)),sizes=conversations2.map(conversation2=>captureSize(conversation2.turns).said),guess=sizes.indexOf(Math.max(...sizes));return candidates.flatMap(candidate=>{let named4=conversations2.
21929
- length===1?0:candidate.from!==void 0&&candidate.from<=conversations2.length?candidate.from-1:-1,sure=named4>=0,at8=sure?named4:guess;return!still[at8]||!sure&&!still.every(Boolean)?[]:[{candidate,at:at8,aboutMe:candidate.aboutUser&&owner2[at8]&&(sure||owner2.every(Boolean))}]})}async function captureCall(batches){let started2=generation,id12=batches[0].botId,bot=deps.bot(id12),at8=now2().getTime(),off2={at:at8,added:0,topics:0,aboutMe:0,note:"upkeep is off"};if(!upkeepEnabled(bot))return off2;let byThread=new Map;
21929
+ length===1?0:candidate.from!==void 0&&candidate.from<=conversations2.length?candidate.from-1:-1,sure=named4>=0,at8=sure?named4:guess;return!still[at8]||!sure&&!still.every(Boolean)?[]:[{candidate,at:at8,aboutMe:candidate.aboutUser&&owner2[at8]&&(sure||owner2.every(Boolean))}]})}async function captureCall(batches){let started3=generation,id12=batches[0].botId,bot=deps.bot(id12),at8=now2().getTime(),off2={at:at8,added:0,topics:0,aboutMe:0,note:"upkeep is off"};if(!upkeepEnabled(bot))return off2;let byThread=new Map;
21930
21930
  for(let batch of batches){let same5=byThread.get(batch.threadId);same5?same5.turns.push(...batch.turns):byThread.set(batch.threadId,{...batch,turns:[...batch.turns]})}let allowed3=threadId=>deps.mayCapture?.(id12,threadId)??!0,refused2={at:at8,added:0,topics:0,aboutMe:0,note:"this conversation no longer feeds the bot's memory"},conversations2=[...byThread.values()].filter(conversation2=>allowed3(conversation2.threadId));if(!conversations2.length)return refused2;let engine=deps.engine(id12);if(!engine?.
21931
- generateText){let report3={at:at8,added:0,topics:0,aboutMe:0,note:NO_TEXT_ENGINE};return record31(id12,{lastCapture:report3}),report3}ensureWorkspace(id12);let today2=memoryDate(now2()),answer2=await askModel(engine,capturePrompt({botName:bot.name,conversations:conversations2.map(conversation2=>conversation2.turns),notebook:readRaw(id12,"MEMORY.md")??"",today:today2,topics:memoryTopicIndex(id12)}));if(started2!==generation)return{...off2,note:"upkeep stopped"};if(answer2===null){let report3={at:at8,
21931
+ generateText){let report3={at:at8,added:0,topics:0,aboutMe:0,note:NO_TEXT_ENGINE};return record31(id12,{lastCapture:report3}),report3}ensureWorkspace(id12);let today2=memoryDate(now2()),answer2=await askModel(engine,capturePrompt({botName:bot.name,conversations:conversations2.map(conversation2=>conversation2.turns),notebook:readRaw(id12,"MEMORY.md")??"",today:today2,topics:memoryTopicIndex(id12)}));if(started3!==generation)return{...off2,note:"upkeep stopped"};if(answer2===null){let report3={at:at8,
21932
21932
  added:0,topics:0,aboutMe:0,note:"The capture call did not answer in time."};return record31(id12,{lastCapture:report3}),report3}if(paused)return queue.unshift(...conversations2.map(batch=>({batch}))),{at:at8,added:0,topics:0,aboutMe:0,note:"deferred until the backup finishes"};if(!upkeepEnabled(deps.bot(id12)))return off2;let still=conversations2.map(conversation2=>allowed3(conversation2.threadId));if(!still.some(Boolean))return refused2;let filed=attribute(parseCandidates(answer2,today2,captureItemLimit(
21933
21933
  conversations2.length)),conversations2,still).flatMap(item=>{let turns2=conversations2[item.at].turns;return isForgotten(item.candidate.text)||!statedInConversation(item.candidate,turns2,!1)?[]:[{...item,aboutMe:item.aboutMe&&statedInConversation(item.candidate,turns2,!0)}]}),{added,topics}=writing(id12,()=>{let added2=0,topics2=0;return conversations2.forEach((conversation2,i)=>{let own4=filed.filter(item=>item.at===i).map(item=>item.candidate);if(!own4.length)return;let result2=fileCandidates(
21934
- id12,own4,{source:`${deps.sourceLabel(id12,conversation2.threadId)} (noticed)`,via:"capture",threadId:conversation2.threadId});added2+=result2.added,topics2+=result2.topics}),{added:added2,topics:topics2}}),learned2=filed.filter(item=>item.aboutMe).map(item=>item.candidate.text),aboutMe=learned2.length?deps.addToAboutMe({botId:id12,botName:bot.name},learned2):0,organized=await organize(id12),report2={at:at8,added,topics,aboutMe,organized};return cancelled(started2)||(record31(id12,{lastCapture:report2}),
21934
+ id12,own4,{source:`${deps.sourceLabel(id12,conversation2.threadId)} (noticed)`,via:"capture",threadId:conversation2.threadId});added2+=result2.added,topics2+=result2.topics}),{added:added2,topics:topics2}}),learned2=filed.filter(item=>item.aboutMe).map(item=>item.candidate.text),aboutMe=learned2.length?deps.addToAboutMe({botId:id12,botName:bot.name},learned2):0,organized=await organize(id12),report2={at:at8,added,topics,aboutMe,organized};return cancelled(started3)||(record31(id12,{lastCapture:report2}),
21935
21935
  (added||topics||aboutMe)&&log7(`memory upkeep: noticed ${added} fact(s) for MEMORY.md, ${topics} for topic files and ${aboutMe} for About me \u2014 ${bot.name} (${id12}) from ${conversations2.map(conversation2=>conversation2.threadId).join(", ")}`)),report2}function takeCall(){let first3=queue.shift(),call2=[first3],turns2=first3.batch.turns.length,bytes4=callBytes(first3.batch);for(let i=0;i<queue.length;){let next=queue[i],size3=callBytes(next.batch);next.batch.botId===first3.batch.botId&&turns2+
21936
- next.batch.turns.length<=CAPTURE_CALL_MAX_TURNS&&bytes4+size3<=CAPTURE_CALL_MAX_BYTES?(call2.push(...queue.splice(i,1)),turns2+=next.batch.turns.length,bytes4+=size3):i+=1}return call2}async function work(){let started2=generation;try{for(await Promise.resolve();!cancelled(started2)&&queue.length;){let call2=takeCall();try{let report2=await batched(()=>captureCall(call2.map(entry2=>entry2.batch)),!0);for(let entry2 of call2)entry2.done?.resolve(report2)}catch(error66){log7(`memory upkeep: captur\
21936
+ next.batch.turns.length<=CAPTURE_CALL_MAX_TURNS&&bytes4+size3<=CAPTURE_CALL_MAX_BYTES?(call2.push(...queue.splice(i,1)),turns2+=next.batch.turns.length,bytes4+=size3):i+=1}return call2}async function work(){let started3=generation;try{for(await Promise.resolve();!cancelled(started3)&&queue.length;){let call2=takeCall();try{let report2=await batched(()=>captureCall(call2.map(entry2=>entry2.batch)),!0);for(let entry2 of call2)entry2.done?.resolve(report2)}catch(error66){log7(`memory upkeep: captur\
21937
21937
  e failed for ${call2[0].batch.botId}: ${error66.message}`);for(let entry2 of call2)entry2.done?.reject(error66)}}}finally{worker=null,kick()}}function kick(){!worker&&!paused&&queue.length&&(worker=track2(work()))}function enqueue3(entry2){queue.push(entry2),kick()}function dropQueued(botId){for(let i=queue.length-1;i>=0;i--){if(queue[i].batch.botId!==botId)continue;let[entry2]=queue.splice(i,1);entry2.done?.resolve({at:now2().getTime(),added:0,topics:0,aboutMe:0,note:"upkeep is off"})}}let buffer=new CaptureBuffer(
21938
- {quietMs:deps.quietMs,maxTurns:CAPTURE_MAX_TURNS,gatherMs:CAPTURE_GATHER_MS,onFlush:batch=>{worthCapturing(batch.turns)&&enqueue3({batch})}});async function organize(botId){let started2=generation,engine=deps.engine(botId);if(!engine?.generateText)return 0;let today2=memoryDate(now2()),core=new Set(loaded2().bots[botId]?.core??[]),first3=readRaw(botId,"MEMORY.md")??"",candidates=organizeCandidates(first3,today2,core);if(!candidates.length)return 0;let answer2=await askModel(engine,organizePrompt(
21939
- candidates,memoryTopicIndex(botId),today2));if(answer2===null||cancelled(started2)||!upkeepEnabled(deps.bot(botId)))return 0;let before=readRaw(botId,"MEMORY.md")??"";if(before!==first3)return 0;let proposed=parseMoves(answer2,candidates);if(proposed===null)return 0;let moved=new Set(proposed.map(move3=>move3.entry.line)),moves=proposed.slice(0,MAX_MOVES),judgedCore=candidates.filter(entry2=>!moved.has(entry2.line)).map(entry2=>factIdentity(entry2.body));return record31(botId,{core:[...new Set([
21938
+ {quietMs:deps.quietMs,maxTurns:CAPTURE_MAX_TURNS,gatherMs:CAPTURE_GATHER_MS,onFlush:batch=>{worthCapturing(batch.turns)&&enqueue3({batch})}});async function organize(botId){let started3=generation,engine=deps.engine(botId);if(!engine?.generateText)return 0;let today2=memoryDate(now2()),core=new Set(loaded2().bots[botId]?.core??[]),first3=readRaw(botId,"MEMORY.md")??"",candidates=organizeCandidates(first3,today2,core);if(!candidates.length)return 0;let answer2=await askModel(engine,organizePrompt(
21939
+ candidates,memoryTopicIndex(botId),today2));if(answer2===null||cancelled(started3)||!upkeepEnabled(deps.bot(botId)))return 0;let before=readRaw(botId,"MEMORY.md")??"";if(before!==first3)return 0;let proposed=parseMoves(answer2,candidates);if(proposed===null)return 0;let moved=new Set(proposed.map(move3=>move3.entry.line)),moves=proposed.slice(0,MAX_MOVES),judgedCore=candidates.filter(entry2=>!moved.has(entry2.line)).map(entry2=>factIdentity(entry2.body));return record31(botId,{core:[...new Set([
21940
21940
  ...loaded2().bots[botId]?.core??[],...judgedCore])].slice(-MAX_CORE)}),moves.length?writing(botId,()=>{let{byTopic}=applyMoves(before,moves),written=new Set,existing=new Map(listMemoryTopics(botId).map(topic=>[topic.name.toLowerCase(),topic.name])),count12=0;for(let[wanted,group2]of byTopic){let name6=existing.get(wanted)??wanted,path6=`memory/${name6}`,current3=readRaw(botId,path6),seen=notebookIdentities(current3??""),lines=group2.lines.filter(line6=>!seen.has(lineFactIdentity(line6)));if(lines.
21941
21941
  length){try{writeMemoryTopic(botId,name6,mergeTopicText(current3,{title:name6.replace(/\.md$/,"").replace(/-/g," "),aliases:group2.aliases,lines}))}catch(error66){log7(`memory upkeep: could not write ${path6}; kept its entries in MEMORY.md: ${error66.message}`);continue}recordMemoryChange(botId,{path:path6,actor:"upkeep",via:"organize",before:current3,after:readRaw(botId,path6)})}existing.set(name6.toLowerCase(),name6),written.add(wanted),count12+=group2.lines.length}if(!written.size)return 0;let{
21942
21942
  text:text30}=applyMoves(before,moves.filter(move3=>written.has(move3.topic)));return writeMemoryFile(botId,text30),recordMemoryChange(botId,{path:"MEMORY.md",actor:"upkeep",via:"organize",before,after:readRaw(botId,"MEMORY.md")}),log7(`memory upkeep: moved ${count12} entr${count12===1?"y":"ies"} from MEMORY.md into topic files for ${deps.bot(botId)?.name??botId}`),count12}):0}function appendArchive(botId,archived){let archiveBefore=readRaw(botId,ARCHIVE_PATH);appendMemoryArchive(botId,archived),
21943
- recordMemoryChange(botId,{path:ARCHIVE_PATH,actor:"upkeep",via:"tidy",before:archiveBefore,after:readRaw(botId,ARCHIVE_PATH)})}async function runTidy(botId){let started2=generation,bot=deps.bot(botId),at8=now2().getTime(),today2=memoryDate(now2()),stopped={at:at8,expired:0,duplicates:0,superseded:0,deferred:0,contradictionsChecked:!1,note:"Memory upkeep is off or paused; no further changes were made."};if(cancelled(started2)||!upkeepEnabled(bot))return stopped;ensureWorkspace(botId);let organized=await organize(
21944
- botId);if(cancelled(started2)||!upkeepEnabled(deps.bot(botId)))return stopped;let first3=readRaw(botId,"MEMORY.md")??"",engine=deps.engine(botId),candidates=contradictionCandidates(first3,today2),contradictions=[],contradictionsChecked=!1,note2;if(!engine?.generateText)note2=NO_TEXT_ENGINE;else if(candidates.length<MIN_ENTRIES_FOR_CONTRADICTIONS)note2=`Contradictions are checked from ${MIN_ENTRIES_FOR_CONTRADICTIONS} notes on.`;else{let answer2=await askModel(engine,contradictionPrompt(candidates));
21945
- answer2===null?note2="The contradiction check did not answer in time.":(contradictions=parseContradictions(answer2,candidates.length),contradictionsChecked=!0)}if(cancelled(started2)||!upkeepEnabled(deps.bot(botId)))return stopped;let before=readRaw(botId,"MEMORY.md")??"";before!==first3&&contradictions.length&&(contradictions=[],note2="The notes changed during the check; contradictions wait for the next tidy-up.");let plan=planTidy(before,today2,contradictions);if(planChanges(plan)){let{text:text30,
21943
+ recordMemoryChange(botId,{path:ARCHIVE_PATH,actor:"upkeep",via:"tidy",before:archiveBefore,after:readRaw(botId,ARCHIVE_PATH)})}async function runTidy(botId){let started3=generation,bot=deps.bot(botId),at8=now2().getTime(),today2=memoryDate(now2()),stopped={at:at8,expired:0,duplicates:0,superseded:0,deferred:0,contradictionsChecked:!1,note:"Memory upkeep is off or paused; no further changes were made."};if(cancelled(started3)||!upkeepEnabled(bot))return stopped;ensureWorkspace(botId);let organized=await organize(
21944
+ botId);if(cancelled(started3)||!upkeepEnabled(deps.bot(botId)))return stopped;let first3=readRaw(botId,"MEMORY.md")??"",engine=deps.engine(botId),candidates=contradictionCandidates(first3,today2),contradictions=[],contradictionsChecked=!1,note2;if(!engine?.generateText)note2=NO_TEXT_ENGINE;else if(candidates.length<MIN_ENTRIES_FOR_CONTRADICTIONS)note2=`Contradictions are checked from ${MIN_ENTRIES_FOR_CONTRADICTIONS} notes on.`;else{let answer2=await askModel(engine,contradictionPrompt(candidates));
21945
+ answer2===null?note2="The contradiction check did not answer in time.":(contradictions=parseContradictions(answer2,candidates.length),contradictionsChecked=!0)}if(cancelled(started3)||!upkeepEnabled(deps.bot(botId)))return stopped;let before=readRaw(botId,"MEMORY.md")??"";before!==first3&&contradictions.length&&(contradictions=[],note2="The notes changed during the check; contradictions wait for the next tidy-up.");let plan=planTidy(before,today2,contradictions);if(planChanges(plan)){let{text:text30,
21946
21946
  archived}=applyTidy(before,plan,today2);writing(botId,()=>{archived.length&&appendArchive(botId,archived),writeMemoryFile(botId,text30)}),recordMemoryChange(botId,{path:"MEMORY.md",actor:"upkeep",via:"tidy",before,after:readRaw(botId,"MEMORY.md")})}let topicExpired=0,topicDuplicates=0,topicSuperseded=0,topicDeferred=0,topicChecks=0,topicsDeferred=0,topicCursor=loaded2().bots[botId]?.topicCursor,deadline=Date.now()+MODEL_TIMEOUT_MS,topics=listMemoryTopics(botId).filter(topic=>topic.name!==ARCHIVE_TOPIC).
21947
21947
  sort((a,b11)=>a.name.localeCompare(b11.name)),cursorAt2=topics.findIndex(topic=>topic.name===topicCursor)+1;for(let topic of[...topics.slice(cursorAt2),...topics.slice(0,cursorAt2)]){let path6=`memory/${topic.name}`,topicBefore=readRaw(botId,path6);if(topicBefore===null)continue;let topicCandidates=contradictionCandidates(topicBefore,today2),topicContradictions=[];if(engine?.generateText&&topicCandidates.length>=2){let remaining2=deadline-Date.now();if(topicChecks>=MAX_TOPIC_CHECKS||remaining2<=
21948
- 0)topicsDeferred++;else{topicChecks++,topicCursor=topic.name;let answer2=await askModel(engine,contradictionPrompt(topicCandidates),remaining2);if(cancelled(started2)||!upkeepEnabled(deps.bot(botId)))return stopped;if(readRaw(botId,path6)!==topicBefore){topicsDeferred++;continue}answer2!==null?(topicContradictions=parseContradictions(answer2,topicCandidates.length),contradictionsChecked=!0,note2?.startsWith("Contradictions are checked from")&&(note2=void 0)):topicsDeferred++}}let topicPlan=planTidy(
21948
+ 0)topicsDeferred++;else{topicChecks++,topicCursor=topic.name;let answer2=await askModel(engine,contradictionPrompt(topicCandidates),remaining2);if(cancelled(started3)||!upkeepEnabled(deps.bot(botId)))return stopped;if(readRaw(botId,path6)!==topicBefore){topicsDeferred++;continue}answer2!==null?(topicContradictions=parseContradictions(answer2,topicCandidates.length),contradictionsChecked=!0,note2?.startsWith("Contradictions are checked from")&&(note2=void 0)):topicsDeferred++}}let topicPlan=planTidy(
21949
21949
  topicBefore,today2,topicContradictions,1);if(topicSuperseded+=topicPlan.superseded.length,topicDeferred+=topicPlan.deferred,!planChanges(topicPlan))continue;let tidied=applyTidy(topicBefore,topicPlan,today2);writing(botId,()=>{tidied.archived.length&&appendArchive(botId,tidied.archived),writeMemoryTopic(botId,topic.name,tidied.text)}),recordMemoryChange(botId,{path:path6,actor:"upkeep",via:"tidy",before:topicBefore,after:readRaw(botId,path6)}),topicExpired+=topicPlan.expired.length,topicDuplicates+=
21950
21950
  topicPlan.duplicates.length}topicsDeferred&&(note2=[note2,`${topicsDeferred} topic checks deferred because of the budget, a timeout or concurrent edits.`].filter(Boolean).join(" "));let report2={at:at8,expired:plan.expired.length+topicExpired,duplicates:plan.duplicates.length+topicDuplicates,superseded:plan.superseded.length+topicSuperseded,deferred:plan.deferred+topicDeferred,...organized?{organized}:{},contradictionsChecked,topicChecks,topicsDeferred,...note2?{note:note2}:{}};return record31(botId,
21951
21951
  {lastTidy:report2,topicCursor}),(report2.expired||report2.duplicates||report2.superseded||organized)&&log7(`memory upkeep: tidied ${bot?.name??botId} \u2014 ${report2.expired} expired, ${report2.duplicates} duplicate(s), ${report2.superseded} contradicted`),report2}function tidy(botId){let running5=tidying.get(botId);if(running5)return running5;let promise2=track2(batched(()=>runTidy(botId))).finally(()=>tidying.delete(botId));return tidying.set(botId,promise2),promise2}function dreamSince(botId,at8){
21952
- return loaded2().bots[botId]?.dreamedTo??at8-DREAM_FIRST_LOOKBACK_MS}async function runDream(botId){let started2=generation,bot=deps.bot(botId),at8=now2().getTime(),report2=(note2,conversations3=0)=>({at:at8,conversations:conversations3,learned:[],outdated:[],ideas:[],aboutMe:0,note:note2});if(cancelled(started2)||!upkeepEnabled(bot))return report2("Memory upkeep is off or paused, so nothing was read.");if(!deps.conversations)return report2("Dreaming is not available here.");let engine=deps.engine(
21952
+ return loaded2().bots[botId]?.dreamedTo??at8-DREAM_FIRST_LOOKBACK_MS}async function runDream(botId){let started3=generation,bot=deps.bot(botId),at8=now2().getTime(),report2=(note2,conversations3=0)=>({at:at8,conversations:conversations3,learned:[],outdated:[],ideas:[],aboutMe:0,note:note2});if(cancelled(started3)||!upkeepEnabled(bot))return report2("Memory upkeep is off or paused, so nothing was read.");if(!deps.conversations)return report2("Dreaming is not available here.");let engine=deps.engine(
21953
21953
  botId);if(!engine?.generateText){let off2=report2(NO_DREAM_ENGINE);return record31(botId,{lastDream:off2}),off2}let conversations2=deps.conversations(botId,dreamSince(botId,at8));if(conversations2.length<DREAM_MIN_CONVERSATIONS){let few=report2(`A dream needs at least ${DREAM_MIN_CONVERSATIONS} chats where you wrote since the last one; there ${conversations2.length===1?"is 1":`are ${conversations2.length}`}.`,conversations2.length);return record31(botId,{lastDream:few}),few}ensureWorkspace(botId);
21954
- let today2=memoryDate(now2()),first3=readRaw(botId,"MEMORY.md")??"",notebook=contradictionCandidates(first3,today2),answer2=await askModel(engine,dreamPrompt({botName:bot.name,today:today2,conversations:conversations2,notebook,topics:memoryTopicIndex(botId)}),DREAM_TIMEOUT_MS);if(cancelled(started2)||!upkeepEnabled(deps.bot(botId)))return report2("Memory upkeep was stopped, switched off or paused during the dream; no changes were made.",conversations2.length);if(answer2===null){let late=report2(
21954
+ let today2=memoryDate(now2()),first3=readRaw(botId,"MEMORY.md")??"",notebook=contradictionCandidates(first3,today2),answer2=await askModel(engine,dreamPrompt({botName:bot.name,today:today2,conversations:conversations2,notebook,topics:memoryTopicIndex(botId)}),DREAM_TIMEOUT_MS);if(cancelled(started3)||!upkeepEnabled(deps.bot(botId)))return report2("Memory upkeep was stopped, switched off or paused during the dream; no changes were made.",conversations2.length);if(answer2===null){let late=report2(
21955
21955
  "The dream did not answer in time.",conversations2.length);return record31(botId,{lastDream:late}),late}let dreamt=parseDream(answer2,conversations2.length,notebook.length);dreamt.learned=dreamt.learned.filter(item=>checkDreamFacts(item.text,item.from,item.evidence,conversations2)&&!isForgotten(item.text)),dreamt.outdated=dreamt.outdated.filter(item=>checkDreamFacts(item.now,item.from,item.evidence,conversations2)&&!isForgotten(item.now));let source4=`dream across ${conversations2.length} chats`,
21956
21956
  written=writing(botId,()=>{let before=readRaw(botId,"MEMORY.md")??"",outdated=[],stale=dreamt.outdated.length>0&&before!==first3;if(!stale){for(let item of dreamt.outdated){let entry2=notebook[item.line];updateMemory(botId,{action:"supersede",oldText:entry2.body,text:item.now},{source:source4,now:now2()}).ok&&outdated.push({was:entry2.body,now:item.now})}outdated.length&&recordMemoryChange(botId,{path:"MEMORY.md",actor:"upkeep",via:"dream",before,after:readRaw(botId,"MEMORY.md")})}let candidates=dreamt.
21957
21957
  learned.map(item=>({text:item.text,kind:"preference",aboutUser:item.aboutUser,...item.topic?{topic:item.topic}:{},...item.topicAliases?{topicAliases:item.topicAliases}:{}})),{kept:kept2}=candidates.length?fileCandidates(botId,candidates,{source:source4,via:"dream"}):{kept:[]};return{outdated,kept:kept2,stale}}),aboutUser=dreamt.learned.filter(item=>item.aboutUser).map(item=>item.text),aboutMe=aboutUser.length?deps.addToAboutMe({botId,botName:bot.name},aboutUser):0,done={at:at8,conversations:conversations2.
21958
21958
  length,learned:written.kept,outdated:written.outdated,ideas:dreamt.ideas.map(idea=>idea.text),aboutMe,...written.stale?{note:"The notes changed during the dream, so outdated notes wait for the next one."}:{}};return record31(botId,{lastDream:done,dreamedTo:at8}),log7(`memory upkeep: ${bot.name} (${botId}) dreamt over ${conversations2.length} chats \u2014 ${done.learned.length} learned, ${done.outdated.length} updated, ${done.ideas.length} idea(s), ${aboutMe} for About me`),done}function dream(botId){
21959
- let started2=generation,running5=dreaming.get(botId);if(running5?.generation===started2)return running5.promise;let promise2=track2(batched(()=>runDream(botId))).finally(()=>{dreaming.get(botId)?.promise===promise2&&dreaming.delete(botId)});return dreaming.set(botId,{generation:started2,promise:promise2}),promise2}function dreamDue(botId){let current3=now2(),saved=loaded2().bots[botId];return deps.dreamer?.()!==botId||!deps.conversations||current3.getHours()<deps.tidyHour()||saved?.lastDream&&memoryDate(
21960
- new Date(saved.lastDream.at))>=memoryDate(current3)?!1:deps.conversations(botId,dreamSince(botId,current3.getTime())).length>=DREAM_MIN_CONVERSATIONS}function due(botId){let current3=now2();if(current3.getHours()<deps.tidyHour())return!1;let last=loaded2().bots[botId]?.lastTidy?.at;return!last||memoryDate(new Date(last))<memoryDate(current3)}async function tick2(){let started2=generation;cancelled(started2)||await batched(async()=>{for(let bot of deps.bots()){if(cancelled(started2))return;if(!(!upkeepEnabled(
21961
- bot)||deps.busy(bot.id))){if(due(bot.id))try{await tidy(bot.id)}catch(error66){log7(`memory upkeep: tidy failed for ${bot.id}: ${error66.message}`)}if(cancelled(started2))return;try{if(deps.busy(bot.id)||!dreamDue(bot.id))continue;await dream(bot.id)}catch(error66){log7(`memory upkeep: dream failed for ${bot.id}: ${error66.message}`)}}}})}return{noteTurn(botId,threadId,turn){upkeepEnabled(deps.bot(botId))&&(!turn.person.trim()&&!turn.bot.trim()||buffer.add(botId,threadId,turn))},flushThread:threadId=>buffer.
21959
+ let started3=generation,running5=dreaming.get(botId);if(running5?.generation===started3)return running5.promise;let promise2=track2(batched(()=>runDream(botId))).finally(()=>{dreaming.get(botId)?.promise===promise2&&dreaming.delete(botId)});return dreaming.set(botId,{generation:started3,promise:promise2}),promise2}function dreamDue(botId){let current3=now2(),saved=loaded2().bots[botId];return deps.dreamer?.()!==botId||!deps.conversations||current3.getHours()<deps.tidyHour()||saved?.lastDream&&memoryDate(
21960
+ new Date(saved.lastDream.at))>=memoryDate(current3)?!1:deps.conversations(botId,dreamSince(botId,current3.getTime())).length>=DREAM_MIN_CONVERSATIONS}function due(botId){let current3=now2();if(current3.getHours()<deps.tidyHour())return!1;let last=loaded2().bots[botId]?.lastTidy?.at;return!last||memoryDate(new Date(last))<memoryDate(current3)}async function tick2(){let started3=generation;cancelled(started3)||await batched(async()=>{for(let bot of deps.bots()){if(cancelled(started3))return;if(!(!upkeepEnabled(
21961
+ bot)||deps.busy(bot.id))){if(due(bot.id))try{await tidy(bot.id)}catch(error66){log7(`memory upkeep: tidy failed for ${bot.id}: ${error66.message}`)}if(cancelled(started3))return;try{if(deps.busy(bot.id)||!dreamDue(bot.id))continue;await dream(bot.id)}catch(error66){log7(`memory upkeep: dream failed for ${bot.id}: ${error66.message}`)}}}})}return{noteTurn(botId,threadId,turn){upkeepEnabled(deps.bot(botId))&&(!turn.person.trim()&&!turn.bot.trim()||buffer.add(botId,threadId,turn))},flushThread:threadId=>buffer.
21962
21962
  flush(threadId),dropBot(botId){buffer.dropBot(botId),dropQueued(botId)},forgetBot(botId){buffer.dropBot(botId),dropQueued(botId),dropPending(botId);let state=loaded2();state.bots[botId]&&(delete state.bots[botId],unsaved2=!0,flush())},capture:batch=>new Promise((resolve56,reject)=>enqueue3({batch,done:{resolve:resolve56,reject}})),tidy,dream,ideas(botId){let last=loaded2().bots[botId]?.lastDream;return last&&now2().getTime()-last.at<IDEAS_FOR_MS?{ideas:last.ideas,conversations:last.conversations}:
21963
21963
  {ideas:[],conversations:0}},status(botId){let{lastTidy,lastCapture,lastDream}=loaded2().bots[botId]??{};return{...lastTidy?{lastTidy}:{},...lastCapture?{lastCapture}:{},...lastDream?{lastDream}:{},modelSteps:!!deps.engine(botId)?.generateText}},tick:tick2,start(){if(timer4)return;if(deps.restoreTurn)try{for(let saved of takePending())if(upkeepEnabled(deps.bot(saved.botId)))for(let turnId of saved.turnIds){let turn=deps.restoreTurn(saved.botId,saved.threadId,turnId);turn&&(turn.person.trim()||turn.
21964
- bot.trim())&&buffer.add(saved.botId,saved.threadId,{...turn,turnId})}}catch(error66){log7(`memory upkeep: could not queue turns saved at the last shutdown: ${error66.message}`)}let started2=generation,scheduledTick=()=>{started2===generation&&tick2()};timer4=setInterval(scheduledTick,TIDY_CHECK_MS),timer4.unref?.(),first2=setTimeout(scheduledTick,6e4),first2.unref?.()},stop(){generation++,timer4&&clearInterval(timer4),timer4=null,first2&&clearTimeout(first2),first2=null;let queued=queue.splice(0);
21964
+ bot.trim())&&buffer.add(saved.botId,saved.threadId,{...turn,turnId})}}catch(error66){log7(`memory upkeep: could not queue turns saved at the last shutdown: ${error66.message}`)}let started3=generation,scheduledTick=()=>{started3===generation&&tick2()};timer4=setInterval(scheduledTick,TIDY_CHECK_MS),timer4.unref?.(),first2=setTimeout(scheduledTick,6e4),first2.unref?.()},stop(){generation++,timer4&&clearInterval(timer4),timer4=null,first2&&clearTimeout(first2),first2=null;let queued=queue.splice(0);
21965
21965
  for(let entry2 of queued)entry2.done?.resolve({at:now2().getTime(),added:0,topics:0,aboutMe:0,note:"kept for the next start"});let waiting2=[...queued.map(entry2=>entry2.batch),...buffer.drain()];deps.restoreTurn&&savePending(waiting2),flush()},pause(){paused=!0},resume(){paused=!1,kick()},async idle(){for(;inflight.size;)await Promise.allSettled(inflight)}}}init_cache_keepwarm();import{mkdirSync as mkdirSync59,readFileSync as readFileSync86}from"node:fs";import{dirname as dirname40}from"node:path";init_atomic();init_config3();var SKILL_REVIEW_MARKER="You are the SKILL REVIEW step",MAX_REVIEW_CHANGES=3,REVIEW_TIMEOUT_MS=3*6e4,RETRY_AFTER_MS2=15*6e4,MAX_FAILED_REVIEWS=3,SETTLE_DELAY_MS=1500,SETTLE_TRIES=5,MAX_COUNTERS=500,TRANSCRIPT_TAIL=40,TRANSCRIPT_MAX_CHARS=4e4,SKILL_DONE={create:"created",update:"updated",enable:"turned on",disable:"turned off",delete:"deleted"},FULL_LINE_MAX=2500,SKILL_BODIES_MAX_CHARS=3e4,SKILL_BODY_MAX_CHARS=12e3;function turnToolSteps(messages,turnId,botId,room){let steps=0;for(let message8 of messages)
21966
21966
  message8.kind!=="activity"||message8.turnId!==turnId||!message8.tool?.name||message8.tool.setup||room&&message8.from?.botId!==botId||(steps+=1);return steps}var oneLine7=(text30,max4)=>{let flat2=text30.replace(/\s+/g," ").trim();return flat2.length>max4?`${flat2.slice(0,max4)}\u2026`:flat2},clip10=(text30,max4)=>{let trimmed=text30.trim();return trimmed.length>max4?`${trimmed.slice(0,max4)}\u2026`:trimmed};function entriesFor(messages,bot,room){let entries4=[];for(let message8 of messages){let mine=room?
21967
21967
  message8.from?.botId===bot.id:!message8.from||message8.from.botId===bot.id;if(message8.kind==="text"&&message8.text?.trim())message8.role==="user"?entries4.push({role:"person",speaker:"Person",text:message8.text}):entries4.push({role:mine?"self":"other",speaker:mine?bot.name:message8.from?.name??"Another bot",text:message8.text});else if(message8.kind==="activity"&&message8.tool?.name&&!message8.tool.setup&&mine){let detail=[message8.tool.input,message8.tool.summary].filter(part2=>!!part2?.trim()).
@@ -22338,8 +22338,8 @@ if(this.pending.delete(message8.id),pending3.timer&&clearTimeout(pending3.timer)
22338
22338
  this.failAll(error66 instanceof Error?error66:new Error(String(error66)))}return!0}consumeDiagnostics(chunk){this.initializationComplete||(this.startupDiagnosticBytes+=Buffer.byteLength(chunk));let{lines,rest}=takeLines(this.diagnosticBuffer+chunk);this.diagnosticBuffer=rest.length>MAX_DIAGNOSTIC_LINE_CHARS?"":rest;for(let line6 of lines)this.announceAuthorizationUrl(line6)||this.noteDiagnostic(line6)}noteDiagnostic(line6){this.noteStartupDiagnostic(line6),this.stderrTail.note(line6)}noteStartupDiagnostic(line6){
22339
22339
  this.initializationComplete||(this.nativeStartupHint??=startupHint(line6))}failAll(error66){for(let pending3 of this.pending.values())pending3.timer&&clearTimeout(pending3.timer),pending3.reject(error66);this.pending.clear()}request(method2,params2,timeoutMs2=3e4,expired2=async()=>new Error(`${method2} timed out.`)){if(this.closed)return Promise.reject(new Error("Antigravity ACP is closed."));let id12=this.nextId++;return new Promise((resolveRequest,reject)=>{let arm=milliseconds2=>{let timer4=setTimeout(
22340
22340
  async()=>{let outcome=await expired2(),pending3=this.pending.get(id12);if(pending3){if(typeof outcome=="number"){pending3.timer=arm(outcome);return}this.pending.delete(id12),reject(outcome)}},milliseconds2);return timer4.unref?.(),timer4};this.pending.set(id12,{resolve:resolveRequest,reject,timer:arm(timeoutMs2)}),this.child.stdin.write(`${JSON.stringify({jsonrpc:"2.0",id:id12,method:method2,params:params2})}
22341
- `)})}async unpackedBytes(){return this.tempDirectory?folderBytes(this.tempDirectory,Date.now()+UNPACK_COUNT_BUDGET_MS):{bytes:0,complete:!0}}async initialize(windowMs=STARTUP_TIMEOUT_MS,deadline=Date.now()+STARTUP_CAP_MS){let started2=Date.now(),counting=this.unpackedBytes(),unpacked,expired2=async()=>{let before=(await counting).bytes,count12=await this.unpackedBytes(),now2=count12.bytes,progressing=!count12.complete||now2>(unpacked??before);count12.complete&&(unpacked=now2);let left2=deadline-
22342
- Date.now();return progressing&&left2>0?Math.min(windowMs,left2):(this.noteStartupDiagnostic(this.diagnosticBuffer),new Error(`Antigravity initialization timed out after ${Math.ceil((Date.now()-started2)/1e3)} seconds (${process.platform}-${process.arch}). The executable was found, but did not finish starting. `+(this.nativeStartupHint?`${this.nativeStartupHint} `:"")+`Startup output: ${this.startupOutputBytes} bytes; diagnostic output: ${this.startupDiagnosticBytes} bytes. `+(this.tempDirectory?
22341
+ `)})}async unpackedBytes(){return this.tempDirectory?folderBytes(this.tempDirectory,Date.now()+UNPACK_COUNT_BUDGET_MS):{bytes:0,complete:!0}}async initialize(windowMs=STARTUP_TIMEOUT_MS,deadline=Date.now()+STARTUP_CAP_MS){let started3=Date.now(),counting=this.unpackedBytes(),unpacked,expired2=async()=>{let before=(await counting).bytes,count12=await this.unpackedBytes(),now2=count12.bytes,progressing=!count12.complete||now2>(unpacked??before);count12.complete&&(unpacked=now2);let left2=deadline-
22342
+ Date.now();return progressing&&left2>0?Math.min(windowMs,left2):(this.noteStartupDiagnostic(this.diagnosticBuffer),new Error(`Antigravity initialization timed out after ${Math.ceil((Date.now()-started3)/1e3)} seconds (${process.platform}-${process.arch}). The executable was found, but did not finish starting. `+(this.nativeStartupHint?`${this.nativeStartupHint} `:"")+`Startup output: ${this.startupOutputBytes} bytes; diagnostic output: ${this.startupDiagnosticBytes} bytes. `+(this.tempDirectory?
22343
22343
  `Unpacked into temp: ${Math.round(Math.max(0,now2-before)/1e6)} MB. `:"")+"Retry setup. If it still fails, share this error and your Limix Bot version; do not paste Google sign-in links or tokens."))},initialized2=await this.request("initialize",{protocolVersion:1,clientInfo:{name:"openmausbot",version:"0.0.0"},clientCapabilities:{fs:{readTextFile:!1,writeTextFile:!1},terminal:!1}},Math.min(windowMs,Math.max(0,deadline-Date.now())),expired2);return this.initializationComplete=!0,this.nativeStartupHint=
22344
22344
  void 0,this.stderrTail.clear(),initialized2}close(){this.closed||(this.closed=!0,this.failAll(new Error("Antigravity ACP was closed.")),this.stopping=this.stopGracefully())}async stopGracefully(){try{this.child.stdin?.end()}catch{}let timer4;return await Promise.race([this.exited,new Promise(resolve56=>{timer4=setTimeout(resolve56,GRACEFUL_EXIT_MS),timer4.unref?.()})]),clearTimeout(timer4),killCliTree(this.child)}async closeAndWait(timeoutMs2=12e3){this.close();let timer4,timedOut3=new Promise(resolve56=>{
22345
22345
  timer4=setTimeout(()=>resolve56(!1),timeoutMs2),timer4.unref?.()});try{return await Promise.race([this.stopping,timedOut3])}finally{clearTimeout(timer4)}}};function parseAntigravityAuthorizationUrl(authorizationUrl){if(authorizationUrl.length>16384||/\s/u.test(authorizationUrl))throw new Error("Antigravity returned an invalid Google sign-in URL.");let url2=new URL(authorizationUrl),state=url2.searchParams.get("state"),redirectUri=url2.searchParams.get("redirect_uri");if(url2.origin!=="https://ac\
@@ -23048,10 +23048,10 @@ let use=botFolderUse(parsed2.server,dataDir);if(!use||use==="several"||!isBot(us
23048
23048
  entries(raw??{}).filter(([name6,value3])=>{let parsed2=parseStoredMcpServer(name6,value3);return!(parsed2.ok&&!isRemoteMcpServer(parsed2.server)&&parsed2.server.bot===botId)});return kept2.length===Object.keys(raw??{}).length?null:Object.fromEntries(kept2)}init_mcp_app_catalog();init_mcp_registry();init_tool_scope();var CLAIMED_FILE=dataDir=>join132(dataDir,"mcp-bot-servers.json"),PACKAGE_RUNNERS=new Set(["uvx","npx","bunx","pipx","pnpm","uv"]),PACKAGE_START_MS=12e4,startCheckTimeout=command3=>PACKAGE_RUNNERS.has(launcherOf(command3))?PACKAGE_START_MS:void 0;function claimedNotice(botName,names5){let tools2=names5.toSorted().map(toolLabel);return tools2.length===1?`The ${tools2[0]} tool only works for ${botName}, so it's off for your other bots.`:`The ${nameList(tools2)}\
23049
23049
  tools only work for ${botName}, so they're off for your other bots.`}function enabledCommandServers(cfg2){let out={};for(let[name6,raw]of Object.entries(cfg2.mcpServers??{})){let parsed2=parseStoredMcpServer(name6,raw);if(!parsed2.ok||isRemoteMcpServer(parsed2.server)||!parsed2.server.enabled||parsed2.server.runsOn)continue;let{command:command3,args,env,bot}=parsed2.server;out[name6]={command:command3,args,env,...bot?{bot}:{}}}return out}function keyRemoved(keys5,cfg2,name6){let parsed2=parseStoredMcpServer(
23050
23050
  name6,cfg2.mcpServers?.[name6]);if(!parsed2.ok)return!1;let resolved2=keys5.resolve(name6,parsed2.server);return!resolved2.ok&&resolved2.reason==="removed"}function withRestarts(servers,restarts){return Object.fromEntries(Object.entries(servers).map(([name6,server2])=>{let count12=restarts.get(name6);return[name6,count12&&"command"in server2?{...server2,env:{...server2.env,[MCP_RESTART_ENV]:String(count12)}}:server2]}))}function createMcpServersHost(deps){let configured2=bot=>deps.policy(customMcpServers(
23051
- deps.cfg(),bot.mcpServers,bot.id)),keyed3=bot=>{let servers={},off2=[];for(let[name6,server2]of Object.entries(configured2(bot))){let resolved2=deps.keys?deps.keys.resolve(name6,server2,bot.id):{ok:!0,server:server2};resolved2.ok?servers[name6]=resolved2.server:off2.push({name:name6,error:resolved2.why,key:!0})}return{servers,off:off2}},started2=bot=>deps.startsServers(bot.id)?Object.keys(configured2(bot)).filter(name6=>canUseMcpServer(bot.toolScope,name6)):[],asBot=botId=>{let own4=join132(deps.
23051
+ deps.cfg(),bot.mcpServers,bot.id)),keyed3=bot=>{let servers={},off2=[];for(let[name6,server2]of Object.entries(configured2(bot))){let resolved2=deps.keys?deps.keys.resolve(name6,server2,bot.id):{ok:!0,server:server2};resolved2.ok?servers[name6]=resolved2.server:off2.push({name:name6,error:resolved2.why,key:!0})}return{servers,off:off2}},started3=bot=>deps.startsServers(bot.id)?Object.keys(configured2(bot)).filter(name6=>canUseMcpServer(bot.toolScope,name6)):[],asBot=botId=>{let own4=join132(deps.
23052
23052
  dataDir,"workspaces",botId);return{id:botId,cwd:existsSync54(own4)?own4:deps.dataDir}},start=deps.start??(async(name6,server2,botId)=>{await deps.keys?.warm(name6,server2);let keyedStart=deps.keys?deps.keys.resolve(name6,server2):{ok:!0,server:server2};if(!keyedStart.ok)return{ok:!1,error:keyedStart.why};let result2=await probeMcpServer({...keyedStart.server,enabled:!0},startCheckTimeout(server2.command),void 0,{asBot:asBot(botId)});return result2.ok?{ok:!0}:{ok:!1,error:result2.error}}),checks=createMcpHealth(
23053
- {file:join132(deps.dataDir,"mcp-health.json"),servers:()=>Object.fromEntries(Object.entries(enabledCommandServers(deps.cfg())).filter(([name6,server2])=>!deps.keys||deps.keys.resolve(name6,server2).ok)),users:name6=>deps.bots().filter(bot=>started2(bot).includes(name6)),start,tell:deps.tell}),restarts=new Map,health2={...checks,changed(name6){restarts.set(name6,(restarts.get(name6)??0)+1),checks.changed(name6)}};return{health:health2,probeAs:server2=>server2.bot?asBot(server2.bot):{},mounted:bot=>withRestarts(
23054
- health2.usable(bot.id,keyed3(bot).servers),restarts),given:bot=>Object.keys(configured2(bot)),prepare:async bot=>{if(deps.keys)for(let[name6,raw]of Object.entries(deps.cfg().mcpServers??{})){let parsed2=bot.mcpServers&&!bot.mcpServers.includes(name6)?null:parseStoredMcpServer(name6,raw);parsed2?.ok&&parsed2.server.enabled&&await deps.keys.warm(name6,parsed2.server)}await health2.prepare(bot.id,started2(bot))},off:bot=>[...health2.off(bot.id,started2(bot)),...keyed3(bot).off.filter(({name:name6})=>canUseMcpServer(
23053
+ {file:join132(deps.dataDir,"mcp-health.json"),servers:()=>Object.fromEntries(Object.entries(enabledCommandServers(deps.cfg())).filter(([name6,server2])=>!deps.keys||deps.keys.resolve(name6,server2).ok)),users:name6=>deps.bots().filter(bot=>started3(bot).includes(name6)),start,tell:deps.tell}),restarts=new Map,health2={...checks,changed(name6){restarts.set(name6,(restarts.get(name6)??0)+1),checks.changed(name6)}};return{health:health2,probeAs:server2=>server2.bot?asBot(server2.bot):{},mounted:bot=>withRestarts(
23054
+ health2.usable(bot.id,keyed3(bot).servers),restarts),given:bot=>Object.keys(configured2(bot)),prepare:async bot=>{if(deps.keys)for(let[name6,raw]of Object.entries(deps.cfg().mcpServers??{})){let parsed2=bot.mcpServers&&!bot.mcpServers.includes(name6)?null:parseStoredMcpServer(name6,raw);parsed2?.ok&&parsed2.server.enabled&&await deps.keys.warm(name6,parsed2.server)}await health2.prepare(bot.id,started3(bot))},off:bot=>[...health2.off(bot.id,started3(bot)),...keyed3(bot).off.filter(({name:name6})=>canUseMcpServer(
23055
23055
  bot.toolScope,name6))],listing:server2=>{let offFor=health2.offFor(server2.name),keyGone=deps.keys?keyRemoved(deps.keys,deps.cfg(),server2.name):!1;return{...server2,...offFor.length?{offFor}:{},...keyGone?{keyOff:!0}:{}}},keyChanged(item){for(let name6 of deps.keys?.usedBy(item)??[])health2.changed(name6)},botAdd:(current3,body2,botId)=>addBotMcpServer(current3,body2,botId,deps.dataDir,deps.boxed()),botKeep:(server2,botId)=>keepForBot(server2,botId,deps.dataDir,deps.boxed()),botDeleted(botId){let before=deps.
23056
23056
  cfg().mcpServers,next=withoutBotMcpServers(before,botId);if(next){deps.persist(next);for(let name6 of Object.keys(before??{}))Object.hasOwn(next,name6)||deps.keys?.forgetServer(name6)}},boot(){if(deps.boxed()&&!existsSync54(CLAIMED_FILE(deps.dataDir))){let bots=deps.bots(),claimed=claimBotMcpServers(deps.cfg().mcpServers,deps.dataDir,botId=>bots.some(bot=>bot.id===botId));claimed&&deps.persist(claimed.next),writeFileAtomic(CLAIMED_FILE(deps.dataDir),JSON.stringify({claimedAt:Date.now()}),{mode:384});
23057
23057
  for(let[botId,names5]of Object.entries(claimed?.claimed??{})){let bot=bots.find(candidate=>candidate.id===botId);bot&&bots.length>1&&deps.tell(claimedNotice(bot.name,names5),bot)}}health2.checkAll()}}}init_mcp_registry();init_mcp_registry();function customMcpResultBudgets(cfg2,names5){let out={};for(let name6 of names5){let raw=cfg2.mcpServers?.[name6];if(raw===void 0)continue;let parsed2=parseStoredMcpServer(name6,raw);parsed2.ok&&parsed2.server.resultBudget!==void 0&&(out[name6]=parsed2.server.resultBudget)}return out}function attachCustomMcp(integrations,custom21,cfg2,turn){if(!Object.keys(custom21).length)return;integrations.custom=turn?brokerRemoteMcp(custom21,turn):custom21;let budgets2=customMcpResultBudgets(
@@ -23131,7 +23131,7 @@ ession"||depth2!==null&&depth2>lastDepth,depth:depth2??lastDepth}}var PLAN_TEXT_
23131
23131
  _update":{let reported=reportedSoFar(session),marker=hermesCompaction(update4._meta,reported.compressionDepth)??hermesCompaction(meta3,reported.compressionDepth);return marker?(reported.compressionDepth=marker.depth,marker.compacted&&(turn.usageCompacted=!0),{}):{}}case"plan":{if(!acpPlanLinesEnabled(env))return{};let reported=reportedSoFar(session),line6=planLine(update4.entries);return line6===null||line6===reported.planLine?{}:(reported.planLine=line6,{step:{title:line6,input:toolDetailPreview(
23132
23132
  update4.entries)}})}default:return{}}}function advertisedCommands(update4){let commands=update4;return commands?.sessionUpdate!=="available_commands_update"||!Array.isArray(commands.availableCommands)?null:new Set(commands.availableCommands.flatMap(command3=>typeof command3?.name=="string"?[command3.name]:[]))}function acpTurnSteering(support11,running5,send3){let answered3=!1,markAnswered=()=>{},answeredSignal=new Promise(resolve56=>{markAnswered=resolve56}),open14=()=>!answered3&&running5(),flight=null,previous2=Promise.resolve(),
23133
23133
  out=0,start=text30=>{let guidance2=text30.trim();if(!guidance2||!open14())return{outcome:Promise.resolve("refused"),done:Promise.resolve()};let decide5=()=>{},outcome=new Promise(resolve56=>{decide5=resolve56}),own4={verdict:null,decide:decide5};flight=own4,out+=1,answeredSignal.then(()=>decide5("indeterminate"));let done=send3(`/${support11.command} ${guidance2}`).then(()=>decide5("indeterminate"),()=>decide5(own4.verdict===null&&open14()?"refused":"indeterminate")).finally(()=>{out-=1,flight===
23134
- own4&&(flight=null)});return{outcome,done}};return{swallow(chunk){let own4=flight,verdict=own4?support11.answer(chunk):null;return!own4||!verdict?!1:(own4.verdict===null&&(own4.verdict=verdict,own4.decide(verdict==="refused"?"refused":open14()?"steered":"indeterminate")),!0)},steer(text30){let started2=previous2.then(()=>start(text30));return previous2=started2.then(one5=>one5.done),started2.then(one5=>one5.outcome)},promptAnswered(){return answered3=!0,markAnswered(),out>0?previous2:null}}}var SessionModelControls=class{revision=0;input;constructor(input2){this.input=input2}usesAgentDefault(){return this.input.selection?.agentDefault!==void 0&&this.input.model()===this.input.selection.agentDefault}modelOf(result2){let configId=this.input.selection?.configId??"model";if(this.input.selection?.allowLegacy)return acpModelOption(result2,configId)?.currentValue??null;let option2=(Array.isArray(result2?.configOptions)?result2.configOptions:[]).find(entry2=>entry2?.id===configId);return typeof option2?.
23134
+ own4&&(flight=null)});return{outcome,done}};return{swallow(chunk){let own4=flight,verdict=own4?support11.answer(chunk):null;return!own4||!verdict?!1:(own4.verdict===null&&(own4.verdict=verdict,own4.decide(verdict==="refused"?"refused":open14()?"steered":"indeterminate")),!0)},steer(text30){let started3=previous2.then(()=>start(text30));return previous2=started3.then(one5=>one5.done),started3.then(one5=>one5.outcome)},promptAnswered(){return answered3=!0,markAnswered(),out>0?previous2:null}}}var SessionModelControls=class{revision=0;input;constructor(input2){this.input=input2}usesAgentDefault(){return this.input.selection?.agentDefault!==void 0&&this.input.model()===this.input.selection.agentDefault}modelOf(result2){let configId=this.input.selection?.configId??"model";if(this.input.selection?.allowLegacy)return acpModelOption(result2,configId)?.currentValue??null;let option2=(Array.isArray(result2?.configOptions)?result2.configOptions:[]).find(entry2=>entry2?.id===configId);return typeof option2?.
23135
23135
  currentValue=="string"?option2.currentValue:null}receive(result2,replace3=!1){if(!replace3&&!Array.isArray(result2?.configOptions)&&!result2?.models)return;let state=replace3?result2:{...this.input.state(),...result2};if(this.input.store(state),this.revision++,!this.input.variants)return;let model4=this.input.model(),nativeModel=this.usesAgentDefault()?model4:this.modelOf(state)??model4;if(!nativeModel)return;let option2=acpVariantOption(state);this.input.report(nativeModel===model4?this.input.reportedModel()??
23136
23136
  nativeModel:nativeModel,{options:option2?.options??[],...option2?.currentValue!==void 0?{currentValue:option2.currentValue}:{}})}confirms(model4){if(!model4||this.usesAgentDefault())return!0;let selected=this.modelOf(this.input.state());return selected===model4||selected===null&&this.input.selection?.unsetIds?.includes(model4)===!0}variant(value3){if(!this.input.variants)throw new Error(`${this.input.displayName} does not support model variants`);let option2=acpVariantOption(this.input.state());
23137
23137
  if(!option2||!option2.options.some(entry2=>entry2.id===value3))throw new Error(`${this.input.displayName} does not advertise variant ${value3} for this model`);return option2}async select(request9,sessionId,timeoutMs2){let wanted=this.input.model(),selected=this.modelOf(this.input.state());if(!wanted||this.usesAgentDefault()||wanted===selected)return selected;let configId=this.input.selection?.configId??"model",option2=this.input.selection?.allowLegacy?acpModelOption(this.input.state(),configId):
@@ -23549,8 +23549,8 @@ stableInstructions??turn.system??""),approvalParams;approvalMode==="custom"?appr
23549
23549
  rebuiltFromReplay=!1,promptText=turn.text;if(cursor3){let resumeThread=()=>request9("thread/resume",{...selectionConfig,threadId:cursor3,developerInstructions,model:selection3.model,...selection3.modelProvider?{modelProvider:selection3.modelProvider}:{},...approvalParams.thread}),resumeUnarchived=()=>resumeThread().catch(error66=>archivedNativeCodexThread(error66,cursor3)?request9("thread/unarchive",{threadId:cursor3}).then(resumeThread,()=>Promise.reject(error66)):Promise.reject(error66));try{let resumed;
23550
23550
  try{resumed=await resumeUnarchived()}catch(error66){if(!approvalParams.fallback||!permissionProfileUnsupported(error66))throw error66;approvalParams=approvalParams.fallback,resumed=await resumeUnarchived()}approvalParams=withResolvedSandbox(approvalParams,resumed),codexThreadId=resumed?.thread?.id??cursor3,rolloutAt=rolloutMark(resumed?.thread?.path),resumedNativeThread=!0}catch(error66){let failure11=classifyResumeFailure({attempted:!0,rejected:error66 instanceof CodexRpcError,promptSubmitted,producedOutput:state.
23551
23551
  sawStreamDelta});if(recoveredMissingSession||stopRequested||state.settled||!turn.recoveryText?.trim()||!(missingNativeCodexThread(error66,cursor3)||archivedNativeCodexThread(error66,cursor3)||codexProviderMismatch(error66))||!mayReplay(failure11))throw error66;recoveredMissingSession=!0;let rebuild=recoveryPromptFor({recoveryText:turn.recoveryText,currentText:turn.text,failure:failure11});rebuiltFromReplay=rebuild.replayed,promptText=rebuild.text}}if(!codexThreadId){let startThread=()=>request9(
23552
- "thread/start",{...selectionConfig,developerInstructions,cwd:turn.cwd??homedir24(),model:selection3.model,...selection3.modelProvider?{modelProvider:selection3.modelProvider}:{},...approvalParams.thread,...turn.guestConfined?{environments:[]}:{},ephemeral:!1}),started2;try{started2=await startThread()}catch(error66){if(!approvalParams.fallback||!permissionProfileUnsupported(error66))throw error66;approvalParams=approvalParams.fallback,started2=await startThread()}approvalParams=withResolvedSandbox(
23553
- approvalParams,started2),codexThreadId=started2?.thread?.id??null,rolloutAt=rolloutMark(started2?.thread?.path),startedModel=started2?.model??null}if(!codexThreadId)throw new Error("Codex did not return a native thread id");let{deliverVolatile,hadVolatile,commitVolatile}=await syncCodexInstructions(threadId,codexThreadId,developerInstructions,promptSplit?turn.systemVolatile??"":"",resumedNativeThread,request9,!!turn.mentionTurn);deliverVolatile&&(promptText=withContextNote(volatileContextNote(promptSplit?
23552
+ "thread/start",{...selectionConfig,developerInstructions,cwd:turn.cwd??homedir24(),model:selection3.model,...selection3.modelProvider?{modelProvider:selection3.modelProvider}:{},...approvalParams.thread,...turn.guestConfined?{environments:[]}:{},ephemeral:!1}),started3;try{started3=await startThread()}catch(error66){if(!approvalParams.fallback||!permissionProfileUnsupported(error66))throw error66;approvalParams=approvalParams.fallback,started3=await startThread()}approvalParams=withResolvedSandbox(
23553
+ approvalParams,started3),codexThreadId=started3?.thread?.id??null,rolloutAt=rolloutMark(started3?.thread?.path),startedModel=started3?.model??null}if(!codexThreadId)throw new Error("Codex did not return a native thread id");let{deliverVolatile,hadVolatile,commitVolatile}=await syncCodexInstructions(threadId,codexThreadId,developerInstructions,promptSplit?turn.systemVolatile??"":"",resumedNativeThread,request9,!!turn.mentionTurn);deliverVolatile&&(promptText=withContextNote(volatileContextNote(promptSplit?
23554
23554
  turn.systemVolatile??"":"",hadVolatile),promptText)),emit2({...base2(threadId,turnId),type:"session.started",sessionId:codexThreadId,model:startedModel??turn.model??null,...rebuiltFromReplay?{rebuilt:!0}:{}}),rebuiltFromReplay&&emit2({...base2(threadId,turnId),type:"runtime.notice",message:rebuiltSessionNotice("Codex")});let turnInput=[...promptText?[{type:"text",text:promptText}]:[],...await codexImageInputs(turn.images)],startTurn2=()=>(promptSubmitted=!0,startingNativeTurn=!0,request9("turn/s\
23555
23555
  tart",{threadId:codexThreadId,input:turnInput,...approvalParams.turn,...turn.guestConfined?{environments:[]}:{},...turn.effort?{effort:turn.effort}:{}})),waitNames=supportsMcpStartup(initialized2?.userAgent)?enabledMcpMounts([...selectedMcp.keys(),...directMounts],effectiveConfig,turn.toolScope!==void 0):[];if(!await mcpStartup.settled(waitNames,stopSignal.signal)||stopRequested||state.settled)return releaseSlot();try{await startTurn2()}catch(error66){if(!approvalParams.fallback||!permissionProfileUnsupported(
23556
23556
  error66))throw error66;approvalParams=approvalParams.fallback,await startTurn2()}commitVolatile&&commitVolatile(),releaseSlot()}catch(e){let failure11=e instanceof Error?e:{text:String(e)},raw=e instanceof Error?e.message:String(e),refused2=chatgptTurn&&loginMark()!==null&&codexSignInRefused({message:raw});hideRefusedModel(raw);let reported=refused2?{message:codexSignInExpired(raw)}:codexUserFailure(raw,route),needsAuth=refused2||/(?:\b401\b|unauthorized|missing bearer|authentication required)/i.
@@ -23688,13 +23688,13 @@ finishReason})`);if(toolFailed){if(!denials.length&&!turnEntry.ending&&correctiv
23688
23688
  MAX_ANNOUNCEMENT_NUDGES||turnEntry.ending)throw stopReason="incomplete_action",new ChatProtocolError(`Stopped after ${turnEntry.ending?`${MAX_CHAT_ROUNDS} steps`:`${MAX_ANNOUNCEMENT_NUDGES} announcement nudges`} without a verified final answer. Earlier operations may have taken effect; inspect their state and continue only the remaining work.`);if(callsAtNudge===seenCalls.size)throw stopReason="incomplete_action",new ChatProtocolError("The model announced another action without tool progress aft\
23689
23689
  er a nudge. The task is incomplete; earlier operations may have taken effect. Inspect their state before continuing.");nudges+=1,callsAtNudge=seenCalls.size,messages.push(assistantReply(model4,completion,completion.text),{role:"user",content:NUDGE_ANNOUNCED_ACTION});continue}if(turnEntry.asides.length){messages.push(assistantReply(model4,completion,reply4));continue}ok2=!0;break}if(!tools2.definitions.length)throw new ChatProtocolError("provider returned tool calls, but no tools are available fo\
23690
23690
  r this turn");for(let call2 of completion.toolCalls){if(seenCalls.has(call2.id))throw new ChatProtocolError("provider reused a tool-call ID; refusing to repeat an operation");seenCalls.add(call2.id)}if(seenCalls.size>MAX_TURN_TOOL_CALLS)throw new ChatProtocolError(stoppedAfter(`${MAX_TURN_TOOL_CALLS} tool calls`));messages.push(assistantReply(model4,completion,completion.text||null,completion.toolCalls)),denials.length||(toolFailed=!1,failedCalls.length=0);let screenshotParts=[];for(let call2 of completion.
23691
- toolCalls){abort.signal.throwIfAborted();let result2,started2=!1,fatal,title3=call2.function.name,skipRepeatCount=!1;try{let args;try{args=JSON.parse(call2.function.arguments)}catch{throw new ChatProtocolError("tool arguments are not complete JSON")}if(!object4(args))throw new ChatProtocolError("tool arguments must be a JSON object");let inputPreview=preview3(args);if(call2.function.name===ASK_USER_TOOL){if(!questionAllowed||!allowsTool(scope,{kind:"native",name:ASK_USER_TOOL}))throw new Error("\
23692
- Tool selection excludes this tool");let questions=parseAskQuestions(args);if(abort.signal.throwIfAborted(),emit2({...base2(turn.threadId,turnId),type:"item.started",itemType:"tool",itemId:call2.id,title:call2.function.name,...inputPreview?{input:inputPreview}:{}}),started2=!0,!questions)denials.push(ASK_USER_TOOL),result2={ok:!1,text:"The ask_user arguments are malformed: pass a JSON object with a questions array of one to six questions, each with a question string and at most twelve options car\
23691
+ toolCalls){abort.signal.throwIfAborted();let result2,started3=!1,fatal,title3=call2.function.name,skipRepeatCount=!1;try{let args;try{args=JSON.parse(call2.function.arguments)}catch{throw new ChatProtocolError("tool arguments are not complete JSON")}if(!object4(args))throw new ChatProtocolError("tool arguments must be a JSON object");let inputPreview=preview3(args);if(call2.function.name===ASK_USER_TOOL){if(!questionAllowed||!allowsTool(scope,{kind:"native",name:ASK_USER_TOOL}))throw new Error("\
23692
+ Tool selection excludes this tool");let questions=parseAskQuestions(args);if(abort.signal.throwIfAborted(),emit2({...base2(turn.threadId,turnId),type:"item.started",itemType:"tool",itemId:call2.id,title:call2.function.name,...inputPreview?{input:inputPreview}:{}}),started3=!0,!questions)denials.push(ASK_USER_TOOL),result2={ok:!1,text:"The ask_user arguments are malformed: pass a JSON object with a questions array of one to six questions, each with a question string and at most twelve options car\
23693
23693
  rying a label. Ask again with valid arguments."};else{let answer2=await approval.question(ASK_USER_TOOL,askQuestionSummary(questions),questions);abort.signal.throwIfAborted(),answer2===null?result2={ok:!0,text:"The person did not answer this question. Do not guess an answer; ask again later or proceed without it."}:result2={ok:!0,text:answer2}}}else{let refused2=repeats2?.refuses(call2.function.name,call2.function.arguments);if(refused2)throw skipRepeatCount=!0,new Error(refused2);tools2.validate(
23694
23694
  call2.function.name,args);let shown3=tools2.view(call2.function.name,args);title3=shown3.title;let shownPreview=shown3.input===args?inputPreview:preview3(shown3.input),full=(turn.approvalModeNow?.()??turn.approvalMode)==="full",floored=approval.floored({full,threadId:turn.threadId,botId:turn.botId,shown:shown3,summary:shownPreview}),allowed3=!floored&&(full||!shown3.ask||await approval.ask(shown3.title,shownPreview??"This tool has no arguments.",shown3.grant));if(abort.signal.throwIfAborted(),emit2(
23695
- {...base2(turn.threadId,turnId),type:"item.started",itemType:"tool",itemId:call2.id,title:shown3.title,...shownPreview?{input:shownPreview}:{}}),started2=!0,allowed3){if(result2=await tools2.execute(call2.function.name,args,abort.signal),result2.images?.length&&!seesImages(turn)){let{images:_dropped,...rest}=result2;result2={...rest,text:`${rest.text}
23695
+ {...base2(turn.threadId,turnId),type:"item.started",itemType:"tool",itemId:call2.id,title:shown3.title,...shownPreview?{input:shownPreview}:{}}),started3=!0,allowed3){if(result2=await tools2.execute(call2.function.name,args,abort.signal),result2.images?.length&&!seesImages(turn)){let{images:_dropped,...rest}=result2;result2={...rest,text:`${rest.text}
23696
23696
  ${TEXT_ONLY_SCREENSHOT_NOTE}`}}if(result2.images?.length)try{assertImageTransport(options2.apiUrl),retainImages(result2.images)}catch(error66){throw new ChatToolSessionError(asError(error66).message)}}else denials.push(shown3.title),result2={ok:!1,text:refusal3(floored,message8=>emit2({...base2(turn.threadId,turnId),type:"runtime.notice",message:message8}))}}}catch(error66){error66 instanceof ChatToolSessionError&&(fatal=error66),result2={ok:!1,text:abort.signal.aborted?"Tool interrupted; an ope\
23697
- ration already dispatched may have taken effect. Verify its state before retrying.":safeText2(asError(error66).message).slice(0,2e3)}}started2||emit2({...base2(turn.threadId,turnId),type:"item.started",itemType:"tool",itemId:call2.id,title:call2.function.name});let repeatNote=skipRepeatCount?void 0:repeats2?.noteAfter(call2.function.name,call2.function.arguments,result2),text30=safeText2(result2.text),output4=preview3({ok:result2.ok,result:text30});if(emit2({...base2(turn.threadId,turnId),type:"\
23697
+ ration already dispatched may have taken effect. Verify its state before retrying.":safeText2(asError(error66).message).slice(0,2e3)}}started3||emit2({...base2(turn.threadId,turnId),type:"item.started",itemType:"tool",itemId:call2.id,title:call2.function.name});let repeatNote=skipRepeatCount?void 0:repeats2?.noteAfter(call2.function.name,call2.function.arguments,result2),text30=safeText2(result2.text),output4=preview3({ok:result2.ok,result:text30});if(emit2({...base2(turn.threadId,turnId),type:"\
23698
23698
  item.completed",itemType:"tool",itemId:call2.id,ok:result2.ok,output:output4}),result2.ok||(toolFailed=!0,failedCalls.push(title3)),messages.push({role:"tool",tool_call_id:call2.id,content:JSON.stringify({ok:result2.ok,result:repeatNote?`${text30}
23699
23699
 
23700
23700
  ${repeatNote}`:text30})}),screenshotParts.push(...chatToolImages(call2.id,result2.images)),abort.signal.throwIfAborted(),fatal)throw fatal;if(repeats2?.stopped)throw stopReason="incomplete_action",new ChatProtocolError(repeats2.stopped)}screenshotParts.length&&messages.push({role:"user",content:screenshotParts})}if(!ok2)throw new ChatProtocolError(stoppedAfter(`${MAX_CHAT_ROUNDS} steps`))}catch(value3){stopReason=abort.signal.aborted?"interrupted":stopReason??"error",failure11=safeText2(asError(
@@ -24262,7 +24262,7 @@ sage again to continue."))})},closeHost=async state=>{let host3=state.host;state
24262
24262
  command,args:server2.args,env:server2.env,mode:"optional"}])),approvalMode=museApprovalMode(turn.approvalMode),key7=JSON.stringify([cwd,museServeArgs(turn.approvalMode),servers]);turn.sessionReset&&(await closeHost(state),state.sessionId=void 0);let cursor3=!turn.sessionReset&&typeof turn.resumeCursor=="string"?turn.resumeCursor:void 0;if(state.host&&!state.host.closed&&state.host.key===key7&&state.sessionId&&(!cursor3||cursor3===state.sessionId))return state.approvalMode!==approvalMode&&(await state.
24263
24263
  host.connection.command("session/setApprovalMode",{sessionId:state.sessionId,mode:approvalMode}),state.approvalMode=approvalMode),{text:turn.text,rebuilt:!1,started:!1};await closeHost(state);let host3=await startHost(museServeArgs(turn.approvalMode),cwd,key7,servers.length>0,"bot");if(state.active?.turnId!==turnId)throw await host3.close().catch(()=>{}),new Error("Muse Code was stopped while it was starting.");state.host=host3,attach(state,host3),servers.length&&!host3.grantedMcp&&emit2({type:"\
24264
24264
  runtime.notice",threadId:state.threadId,turnId,message:"This Muse Code cannot take Limix Bot's tools (browser, teammates, apps). Update Muse Code to use them."});let config4=servers.length&&host3.grantedMcp?{config:{mcpServers}}:{},resumeId=cursor3??state.sessionId;if(resumeId)try{return await host3.connection.command("session/resume",{sessionId:resumeId,excludeItems:!0,...config4}),state.sessionId=resumeId,await host3.connection.command("session/setApprovalMode",{sessionId:resumeId,mode:approvalMode}),
24265
- state.approvalMode=approvalMode,{text:turn.text,rebuilt:!1,started:!0}}catch(error66){let kind2=error66 instanceof MspError?error66.kind:void 0;if(kind2!=="sessionNotFound"&&kind2!=="notFound")throw error66}let model4=turn.model||catalog.default,started2=asRecord3(await host3.connection.command("session/start",{workspaceRoot:cwd,providerId:PROVIDER_ID2,approvalMode,...model4?{modelId:model4}:{},...config4})),session=asRecord3(started2.session);if(typeof session.sessionId!="string")throw new Error(
24265
+ state.approvalMode=approvalMode,{text:turn.text,rebuilt:!1,started:!0}}catch(error66){let kind2=error66 instanceof MspError?error66.kind:void 0;if(kind2!=="sessionNotFound"&&kind2!=="notFound")throw error66}let model4=turn.model||catalog.default,started3=asRecord3(await host3.connection.command("session/start",{workspaceRoot:cwd,providerId:PROVIDER_ID2,approvalMode,...model4?{modelId:model4}:{},...config4})),session=asRecord3(started3.session);if(typeof session.sessionId!="string")throw new Error(
24266
24266
  "Muse Code started a session without an id.");state.sessionId=session.sessionId,state.model=typeof session.modelId=="string"?session.modelId:model4,state.approvalMode=approvalMode;let rebuilt=!!(resumeId&&turn.recoveryText);return{text:rebuilt?turn.recoveryText:turn.text,rebuilt,started:!0}},runTurn=async(state,turn,active3)=>{let threadId=turn.threadId;try{let session=await ensureSession(state,turn,active3.turnId),host3=state.host,sessionId=state.sessionId;session.started&&emit2({type:"session.\
24267
24267
  started",threadId,turnId:active3.turnId,sessionId,model:state.model??turn.model??null,...session.rebuilt?{rebuilt:!0}:{}}),turn.model&&turn.model!==state.model&&(await host3.connection.command("session/setModel",{sessionId,model:{modelId:turn.model,providerId:PROVIDER_ID2}}),state.model=turn.model);let halves=promptHalves(turn),text30=session.text;if(halves.stable!==null){let receiptKey=JSON.stringify([threadId,sessionId]),composed2=splitSessionPrompt(halves.stable,halves.volatile,readPromptSplitReceipt(
24268
24268
  DRIVER_KIND6,receiptKey),turn.system,text30,!!turn.mentionTurn,RE_ANCHOR_TURNS);text30=composed2.text,active3.receipt={key:receiptKey,receipt:composed2.receipt}}else turn.system&&session.started&&(text30=`${turn.system}
@@ -24350,8 +24350,8 @@ text!==text30||message8.replyToId!==replyToId||(message8.channelMode??"chat")!==
24350
24350
  result:current3};this.inFlight.set(key7,entry2);let clear2=()=>{this.inFlight.get(key7)===entry2&&this.inFlight.delete(key7)};return current3.then(clear2,clear2),current3}};function sendFingerprint(text30,replyToId,channelMode){return JSON.stringify([text30,replyToId??null,channelMode??null])}init_config3();import{appendFile as appendFile5}from"node:fs/promises";import{join as join162}from"node:path";init_redact2();init_contracts();import{stripVTControlCharacters as stripVTControlCharacters7}from"node:util";init_redact2();init_redact2();init_tool_summary();var STEP_TARGET_MAX=60,ARG_MAX=40,cut3=(text30,limit2)=>{let clean10=redactSecretsInText(text30.replace(new RegExp("\\p{Cc}+","gu")," ").replace(/\s+/g," ").trim());return clean10.length>limit2?`${clean10.slice(0,limit2-1).trimEnd()}\u2026`:clean10},ASSIGNMENT2=/(^|[\s;&|(`])([A-Za-z_][A-Za-z0-9_]*)=(?:«redacted \d+ chars»|"(?:[^"\\]|\\.)*"|'[^']*'|[^\s;&|)`]*)/g;function maskAssignments(command3){return command3.replace(ASSIGNMENT2,"$1$2=\u2026")}function splitSegments(command3){
24351
24351
  let out=[],current3="",quote4=null,depth2=0;for(let i=0;i<command3.length;i++){let c=command3[i];if(quote4){current3+=c,c===quote4?quote4=null:c==="\\"&&quote4==='"'&&i+1<command3.length&&(current3+=command3[++i]);continue}if(c==="'"||c==='"'||c==="`"){quote4=c,current3+=c;continue}if(c==="\\"&&i+1<command3.length){current3+=c+command3[++i];continue}c==="("?depth2++:c===")"&&(depth2=Math.max(0,depth2-1));let redirect=c==="&"&&(command3[i-1]===">"||command3[i-1]==="<"||command3[i+1]===">");if(depth2===
24352
24352
  0&&!redirect&&(c===";"||c==="|"||c==="&"||c===`
24353
- `)){out.push(current3),current3="";continue}current3+=c}return out.push(current3),out.map(segment=>segment.trim()).filter(Boolean)}var ESCAPED_IN_QUOTES=new Set(['"',"\\","$","`"]),ESCAPED_BARE=new Set([...ESCAPED_IN_QUOTES,"'"," ","&","|",";","(",")","<",">"]);function splitWords2(segment){let out=[],word="",started2=!1,quote4=null;for(let i=0;i<segment.length;i++){let c=segment[i];if(quote4){c===quote4?quote4=null:c==="\\"&&quote4==='"'&&ESCAPED_IN_QUOTES.has(segment[i+1]??"")?word+=segment[++i]:
24354
- word+=c;continue}if(c==="'"||c==='"'){quote4=c,started2=!0;continue}if(c==="\\"&&ESCAPED_BARE.has(segment[i+1]??"")){word+=segment[++i],started2=!0;continue}if(/\s/.test(c)){started2&&out.push(word),word="",started2=!1;continue}word+=c,started2=!0}return started2&&out.push(word),out}var isAssignment=word=>/^[A-Za-z_][A-Za-z0-9_]*=/.test(word),isFlag=word=>word.startsWith("-")&&word.length>1,baseName=word=>word.replace(/[\\/]+$/,"").split(/[\\/]/).pop()??word,programName3=word=>baseName(word).replace(
24353
+ `)){out.push(current3),current3="";continue}current3+=c}return out.push(current3),out.map(segment=>segment.trim()).filter(Boolean)}var ESCAPED_IN_QUOTES=new Set(['"',"\\","$","`"]),ESCAPED_BARE=new Set([...ESCAPED_IN_QUOTES,"'"," ","&","|",";","(",")","<",">"]);function splitWords2(segment){let out=[],word="",started3=!1,quote4=null;for(let i=0;i<segment.length;i++){let c=segment[i];if(quote4){c===quote4?quote4=null:c==="\\"&&quote4==='"'&&ESCAPED_IN_QUOTES.has(segment[i+1]??"")?word+=segment[++i]:
24354
+ word+=c;continue}if(c==="'"||c==='"'){quote4=c,started3=!0;continue}if(c==="\\"&&ESCAPED_BARE.has(segment[i+1]??"")){word+=segment[++i],started3=!0;continue}if(/\s/.test(c)){started3&&out.push(word),word="",started3=!1;continue}word+=c,started3=!0}return started3&&out.push(word),out}var isAssignment=word=>/^[A-Za-z_][A-Za-z0-9_]*=/.test(word),isFlag=word=>word.startsWith("-")&&word.length>1,baseName=word=>word.replace(/[\\/]+$/,"").split(/[\\/]/).pop()??word,programName3=word=>baseName(word).replace(
24355
24355
  /\.exe$/i,""),SHELLS2=new Set(["sh","bash","zsh","dash","ksh","fish"]),WRAPPER_VALUE_FLAGS={sudo:"ugCDhprtUT",doas:"uC",env:"uSC",nice:"n",ionice:"cnp",timeout:"sk",stdbuf:"ioe"},WRAPPERS2=new Set([...Object.keys(WRAPPER_VALUE_FLAGS),"nohup","time","exec","command","builtin","caffeinate","xvfb-run","chronic","unbuffer"]),PREPARING=new Set(["cd","pushd","popd","export","set","unset","source",".","alias","true",":","shopt","ulimit","umask","trap","mkdir","touch","clear","nvm","pyenv","conda","deac\
24356
24356
  tivate","chmod","eval"]),PLUMBING=new Set(["echo","printf","cat","tee","head","tail","grep","egrep","rg","sort","uniq","wc","sed","awk","cut","tr","jq","xargs","less","more","column","sleep","date","wait","test","[","ls","pwd","which"]),INTERPRETER=/^(?:python[0-9.]*|pypy[0-9.]*|node|nodejs|deno|bun|ruby|perl|php|Rscript|tsx|ts-node|osascript|pwsh|powershell|cmd|lua|julia|java|sh|bash|zsh|dash|ksh|fish)$/i,RUNNERS=new Set(["npm","pnpm","yarn","bun","uv","poetry","pdm","hatch","deno","pipenv","ry\
24357
24357
  e"]),RUNNER_VERBS=new Set(["run","exec","x","dlx","run-script","task"]),SCRIPT2=/\.(?:py|js|mjs|cjs|ts|mts|tsx|sh|bash|zsh|rb|pl|php|lua|r|jl|ps1|jar)$/i;function programOf(words6){let i=0;for(;;){for(;i<words6.length&&isAssignment(words6[i]);)i++;let word=words6[i];if(word===void 0)return;let name6=programName3(word);if(!WRAPPERS2.has(name6))return{name:name6,args:words6.slice(i+1)};for(i++;i<words6.length&&(isFlag(words6[i])||isAssignment(words6[i]));){let flag4=words6[i++];/^-[A-Za-z]$/.test(
@@ -24579,7 +24579,7 @@ type==="turn.started"){settle3(event2.threadId);let kind2=match4(KIND,event2.pro
24579
24579
  record31("turn",event2.stopReason,engines.get(event2.threadId)??match4(KIND,event2.provider),at8,options2.botOf?.(event2.threadId)??null,event2.threadId)}},noteRoutineRun(run11){if(!["completed","failed","missed","cancelled"].includes(run11.status))return;let routineId2=match4(ID9,run11.routineId);if(!routineId2)return;let previous2=routines2.get(routineId2);if(previous2?.runId===run11.id&&previous2.status===run11.status)return;let failed2=run11.status==="failed"||run11.status==="missed",sameRun2=previous2?.
24580
24580
  runId===run11.id&&(previous2.status==="failed"||previous2.status==="missed"),consecutiveFailures=failed2?(previous2?.consecutiveFailures??0)+(sameRun2?0:1):run11.status==="completed"?0:previous2?.consecutiveFailures??0;remember3(routines2,routineId2,{routineId:routineId2,runId:run11.id,status:run11.status,at:run11.finishedAt??now2(),consecutiveFailures},ROUTINE_CAP)},read(after){settleStale();let cursor3=/^(\d{1,15})\.(\d{1,15})$/.exec(after??""),since=cursor3&&Number(cursor3[1])===bootedAt&&Number(
24581
24581
  cursor3[2])<=seq2?Number(cursor3[2]):0,incidents=[...buckets.values()].filter(bucket=>bucket.seq>since).sort((a,b11)=>a.seq-b11.seq).map(bucket=>({...bucket})),current3=Math.floor(now2()/MINUTE),turns2={started15m:0,failed15m:0,started24h:0,failed24h:0};for(let[minute,slot]of minutes3)minute<=current3-WINDOW_24H||(turns2.started24h+=slot.started,turns2.failed24h+=slot.failed,minute>current3-WINDOW_15M&&(turns2.started15m+=slot.started,turns2.failed15m+=slot.failed));return{since,seq:seq2,incidents,
24582
- turns:turns2,routines:[...routines2.values()].map(({runId:_runId,...routine})=>routine)}},cursor:at8=>`${bootedAt}.${at8}`}}function backgroundLookup(load9,ttlMs,now2){let value3=null,checkedAt2=null,failed2=!1,running5=!1;return()=>{if(!running5&&(checkedAt2===null||now2()-checkedAt2>=ttlMs)){let started2=load9();if(started2){running5=!0;let timer4,timeout3=new Promise((_3,reject)=>{timer4=setTimeout(()=>reject(new Error("timeout")),LOOKUP_TIMEOUT_MS),timer4.unref?.()});Promise.race([started2,timeout3]).
24582
+ turns:turns2,routines:[...routines2.values()].map(({runId:_runId,...routine})=>routine)}},cursor:at8=>`${bootedAt}.${at8}`}}function backgroundLookup(load9,ttlMs,now2){let value3=null,checkedAt2=null,failed2=!1,running5=!1;return()=>{if(!running5&&(checkedAt2===null||now2()-checkedAt2>=ttlMs)){let started3=load9();if(started3){running5=!0;let timer4,timeout3=new Promise((_3,reject)=>{timer4=setTimeout(()=>reject(new Error("timeout")),LOOKUP_TIMEOUT_MS),timer4.unref?.()});Promise.race([started3,timeout3]).
24583
24583
  then(answer2=>{value3=answer2,failed2=!1},()=>{failed2=!0}).finally(()=>{clearTimeout(timer4),checkedAt2=now2(),running5=!1})}}return{value:value3,checkedAt:checkedAt2,failed:failed2}}}function memoryBytes(){let totalBytes=totalmem5();try{let available=/^MemAvailable:\s+(\d+) kB$/m.exec(readFileSync126("/proc/meminfo","utf8"))?.[1];if(available)return{totalBytes,availableBytes:Number(available)*1024}}catch{}return{totalBytes,availableBytes:freemem2()}}function diskBytes(dir){try{let stats=statfsSync3(
24584
24584
  dir);return{totalBytes:stats.blocks*stats.bsize,freeBytes:stats.bavail*stats.bsize}}catch{return null}}function writable(dir){try{return accessSync2(dir,constants17.W_OK),!0}catch{return!1}}function boxSummary(report2){if(!report2)return null;let failed2=report2.checks?.failed.filter(id12=>CODE2.test(id12)).slice(0,50)??[],broker={...report2.broker,unbrokered:report2.broker.unbrokered.filter(name6=>KIND.test(name6)).slice(0,50)};return{box:report2.box,reason:report2.reason,checks:report2.checks?
24585
24585
  `${report2.checks.passed}/${report2.checks.total}`:null,failed:failed2,boxed:report2.boxed,refused:report2.refused,broker,hardening:report2.hardening}}function createCloudHealth(deps){let now2=deps.now??Date.now,ledger2=createCloudHealthLedger({botOf:threadId=>deps.store.botByThread(threadId)?.id??null,now:now2}),speed=deps.speed??createCloudSpeed({now:now2});deps.store.onChange(change2=>{change2.type==="message"&&(ledger2.noteMessage(change2.threadId,change2.message),speed.noteMessage(change2.threadId,
@@ -24679,9 +24679,9 @@ the Admin with the wake notice (${error66 instanceof Error?error66.name:"error"}
24679
24679
  array(external_exports.object({id:external_exports.string().min(1).max(100),outcome:external_exports.enum(["turning-on","declined","failed"]),reason:external_exports.enum([...SCREEN_REASONS,"paused","terminal-off"]).optional()}).strict()).max(20)}).strict(),PRESENT_WAIT_MS=2e4,ASK_WAIT_MS=4e4,PRESENT_FRESH_MS=45e3,RECONNECT_GRACE_MS=2e4,TURN_ON_MS=9e4,NOT_NOW_MS=10*6e4,CARRY_ON_MS=15*6e4,CARRY_ON_EVERY_MS=5e3,REFRESH_MS=15e3,OPEN_LIMIT=50,OPEN=new Set(["asking","turning-on","failed"]),ComputerAsks=class{asks=new Map;desktops=new Map;version=0;listeners=new Set;ticking=null;deps;now;setTimer;clearTimer;constructor(deps){
24680
24680
  this.deps=deps,this.now=deps.now??Date.now,this.setTimer=deps.setTimer??setTimeout,this.clearTimer=deps.clearTimer??clearTimeout}async present(state,answers,answerer,heard,signal,waitMs=PRESENT_WAIT_MS){let before=this.desktops.get(state.name);this.desktops.set(state.name,{state,seen:this.now()});for(let answer2 of answers)this.desktopAnswer(answer2,answerer);(!before||JSON.stringify(before.state)!==JSON.stringify(state))&&this.refresh(),heard===this.version&&!signal?.aborted&&await new Promise(
24681
24681
  resolve56=>{let done=()=>{this.clearTimer(timer4),this.listeners.delete(done),signal?.removeEventListener("abort",done),resolve56()},timer4=this.setTimer(done,waitMs);this.listeners.add(done),signal?.addEventListener("abort",done,{once:!0})});let entry2=this.desktops.get(state.name);return entry2&&(entry2.seen=this.now()),{version:this.version,asks:[...this.asks.values()].filter(ask2=>OPEN.has(ask2.state)).map(ask2=>({id:ask2.id,need:ask2.need,reason:ask2.reason,bot:ask2.botName,...ask2.why?{why:ask2.
24682
- why}:{},state:ask2.state,turnOn:ask2.turnOn}))}}async ask(input2,waitMs=ASK_WAIT_MS){let started2=this.now(),met=this.met(input2.need);if(met)return{state:"ready",computerId:met.id,device:this.device()};let open14=[...this.asks.values()].find(ask3=>ask3.threadId===input2.threadId&&ask3.need===input2.need&&OPEN.has(ask3.state));if(open14?.state==="failed")return{state:"failed",device:open14.device,reason:open14.reason};if(open14)return this.waitFor(open14,waitMs);let refused2=[...this.asks.values()].
24683
- find(ask3=>ask3.threadId===input2.threadId&&ask3.need===input2.need&&ask3.botId===input2.bot.id&&ask3.state==="declined"&&this.now()-(ask3.settledAt??0)<NOT_NOW_MS);if(refused2)return{state:"declined",device:refused2.device,reason:refused2.reason};let reason3=this.reasonFor(input2.need);for(;(reason3==="closed"||reason3==="starting")&&this.now()-started2<Math.min(RECONNECT_GRACE_MS,waitMs);){if(await this.changeOrTimeout(1e3),met=this.met(input2.need),met)return{state:"ready",computerId:met.id,device:this.
24684
- device()};reason3=this.reasonFor(input2.need)}if(!turnsOnFromHere(reason3)&&!needsTheApp(reason3))return{state:reason3==="starting"?"waiting":"unavailable",device:this.device(),reason:reason3};if([...this.asks.values()].filter(ask3=>OPEN.has(ask3.state)).length>=OPEN_LIMIT)return{state:"unavailable",device:this.device(),reason:reason3};let ask2=this.raise(input2,reason3);return this.waitFor(ask2,Math.max(1e3,waitMs-(this.now()-started2)))}answer(requestId,behavior){let ask2=this.asks.get(requestId);
24682
+ why}:{},state:ask2.state,turnOn:ask2.turnOn}))}}async ask(input2,waitMs=ASK_WAIT_MS){let started3=this.now(),met=this.met(input2.need);if(met)return{state:"ready",computerId:met.id,device:this.device()};let open14=[...this.asks.values()].find(ask3=>ask3.threadId===input2.threadId&&ask3.need===input2.need&&OPEN.has(ask3.state));if(open14?.state==="failed")return{state:"failed",device:open14.device,reason:open14.reason};if(open14)return this.waitFor(open14,waitMs);let refused2=[...this.asks.values()].
24683
+ find(ask3=>ask3.threadId===input2.threadId&&ask3.need===input2.need&&ask3.botId===input2.bot.id&&ask3.state==="declined"&&this.now()-(ask3.settledAt??0)<NOT_NOW_MS);if(refused2)return{state:"declined",device:refused2.device,reason:refused2.reason};let reason3=this.reasonFor(input2.need);for(;(reason3==="closed"||reason3==="starting")&&this.now()-started3<Math.min(RECONNECT_GRACE_MS,waitMs);){if(await this.changeOrTimeout(1e3),met=this.met(input2.need),met)return{state:"ready",computerId:met.id,device:this.
24684
+ device()};reason3=this.reasonFor(input2.need)}if(!turnsOnFromHere(reason3)&&!needsTheApp(reason3))return{state:reason3==="starting"?"waiting":"unavailable",device:this.device(),reason:reason3};if([...this.asks.values()].filter(ask3=>OPEN.has(ask3.state)).length>=OPEN_LIMIT)return{state:"unavailable",device:this.device(),reason:reason3};let ask2=this.raise(input2,reason3);return this.waitFor(ask2,Math.max(1e3,waitMs-(this.now()-started3)))}answer(requestId,behavior){let ask2=this.asks.get(requestId);
24685
24685
  return ask2?OPEN.has(ask2.state)?behavior!=="allow"?(this.settle(ask2,"declined"),!0):(turnsOnFromHere(ask2.reason)&&this.turnOn(ask2),!0):!0:!1}lendingChanged(){this.refresh()}cancel(threadId){for(let ask2 of this.asks.values())ask2.threadId===threadId&&OPEN.has(ask2.state)&&this.settle(ask2,"ended")}dismissStale(){let dismissed=0;for(let{threadId,messageId:messageId2}of optionCardsForTools([COMPUTER_ASK_TOOL])){let card=this.deps.store.messagesFor(threadId).find(message8=>message8.id===messageId2)?.
24686
24686
  card;!card?.computerAsk||this.asks.has(card.requestId??"")||!OPEN.has(card.computerAsk.state)||this.deps.store.patchMessage(threadId,messageId2,{card:{...card,answered:card.answered??"deny",dismissed:!0,computerAsk:{...card.computerAsk,state:"ended"}}})&&(dismissed+=1)}return dismissed}reasonFor(need){let desktop=this.freshDesktop();return desktop?.paused?"paused":desktop?need==="screen"?desktop.screen.ready?"starting":desktop.screen.reason??"starting":need==="terminal"?desktop.terminal?"startin\
24687
24687
  g":"terminal-off":"starting":this.deps.online().length?"update":this.deps.known().length?"closed":"never"}static say(reply4,name6){if(reply4.state==="ready")return`Their ${reply4.device} lends what you need now: computer_id ${reply4.computerId}. Go on with shared_computer; verify the result before saying it's done.`;let line6=computerAskReasonLine({reason:reply4.reason,device:reply4.device},name6),why=computerAskText(line6.key,line6.params),stay="Don't switch to your own cloud computer or browse\
@@ -25034,8 +25034,8 @@ routerRejected"};function deciderPatchKey(patch2,current3){let jevKey=patch2.key
25034
25034
  openrouterModel)?.trim(),api=patch2.openrouterModel!==void 0?patch2.openrouterApi:patch2.openrouterApi??current3?.openrouterApi;return{provider:"openrouter",check:{key:openrouterKey,provider:"openrouter",model:savedModel||OPENROUTER_DEFAULT_MODEL,api:savedModel?api==="decisions"?"decisions":"chat":OPENROUTER_DEFAULT_API}}}function checkAccount(cfg2,input2){let draft=input2.key?.trim();if(!draft&&!input2.provider)return deciderAccount(cfg2,"keyCheck");let provider=input2.provider??draftProvider(cfg2);
25035
25035
  return provider==="workersai"?workersAiAccount(cfg2,{token:draft,accountId:input2.accountId}):provider==="openrouter"?openrouterAccount(cfg2,draft):jevAccount(cfg2,draft)??includedAccount()}var isJob=seam=>DECIDER_JOBS.includes(seam);function createDecider(deps){let fetchImpl=deps.fetch??fetch,now2=deps.now??(()=>performance.now());function gate(cfg2,seam){return cfg2.decider?.provider==="off"?"disabled":seam==="keyCheck"?null:deciderConfigured(cfg2)?deciderEnabled(cfg2)?isJob(seam)&&!deciderJobOn(
25036
25036
  cfg2,seam)?"job_off":deciderAccount(cfg2,seam)?null:"no_key":"disabled":cfg2.decider?.enabled===!0?"no_key":"disabled"}async function call2(seam,account2,request9,options2){let provider=account2.provider,backend=BACKENDS[provider];if(options2.signal?.aborted)return{ok:!1,provider,reason:"cancelled"};let timeoutMs2=Math.min(MAX_TIMEOUT_MS,Math.max(MIN_TIMEOUT_MS,options2.timeoutMs??DEFAULT_DECIDER_TIMEOUT_MS)),controller=new AbortController,onAbort=()=>controller.abort();options2.signal?.addEventListener(
25037
- "abort",onAbort,{once:!0});let timer4,timedOut3=new Promise(resolve56=>{timer4=setTimeout(()=>{controller.abort(),resolve56({ok:!1,reason:"timeout"})},timeoutMs2)}),started2=now2(),outcome;try{let decided2=Promise.resolve().then(()=>backend.decide({key:account2.token,baseUrl:account2.api,...account2.accountId?{accountId:account2.accountId}:{},...options2.careful?{careful:!0}:{},...account2.included?{relaySeam:seam}:{},...request9,signal:controller.signal,fetch:fetchImpl})).catch(()=>({ok:!1,reason:"\
25038
- malformed"}));outcome=await Promise.race([decided2,timedOut3])}finally{clearTimeout(timer4),options2.signal?.removeEventListener("abort",onAbort)}let latencyMs=Math.max(0,Math.round(now2()-started2));if(!outcome.ok&&outcome.reason!=="timeout"&&options2.signal?.aborted&&(outcome={ok:!1,reason:"cancelled"}),deps.dataDir){let first2=outcome.ok?Object.values(outcome.answers).find(answer2=>answer2.type==="choice"):void 0,model4=request9.model??(outcome.ok?outcome.model:void 0);appendDeciderLog(deps.dataDir,
25037
+ "abort",onAbort,{once:!0});let timer4,timedOut3=new Promise(resolve56=>{timer4=setTimeout(()=>{controller.abort(),resolve56({ok:!1,reason:"timeout"})},timeoutMs2)}),started3=now2(),outcome;try{let decided2=Promise.resolve().then(()=>backend.decide({key:account2.token,baseUrl:account2.api,...account2.accountId?{accountId:account2.accountId}:{},...options2.careful?{careful:!0}:{},...account2.included?{relaySeam:seam}:{},...request9,signal:controller.signal,fetch:fetchImpl})).catch(()=>({ok:!1,reason:"\
25038
+ malformed"}));outcome=await Promise.race([decided2,timedOut3])}finally{clearTimeout(timer4),options2.signal?.removeEventListener("abort",onAbort)}let latencyMs=Math.max(0,Math.round(now2()-started3));if(!outcome.ok&&outcome.reason!=="timeout"&&options2.signal?.aborted&&(outcome={ok:!1,reason:"cancelled"}),deps.dataDir){let first2=outcome.ok?Object.values(outcome.answers).find(answer2=>answer2.type==="choice"):void 0,model4=request9.model??(outcome.ok?outcome.model:void 0);appendDeciderLog(deps.dataDir,
25039
25039
  {at:new Date().toISOString(),seam,provider,...model4&&provider!=="jev"?{model:model4}:{},ok:outcome.ok,...outcome.ok?{}:{reason:outcome.reason,...outcome.status?{status:outcome.status}:{}},...first2?{choice:first2.choice}:{},pTop:first2?.pTop??null,margin:first2?.margin??null,latencyMs,...outcome.ok&&outcome.inputTokens!==void 0?{inputTokens:outcome.inputTokens}:{},stateHash:stateHash(request9.state)})}return outcome.ok?{ok:!0,provider,answers:outcome.answers,latencyMs,...outcome.inputTokens!==void 0?
25040
25040
  {inputTokens:outcome.inputTokens}:{},...outcome.model?{model:outcome.model}:{}}:{ok:!1,provider,reason:outcome.reason,...outcome.status?{status:outcome.status}:{},latencyMs}}let openrouterRequest=(cfg2,account2,input2={})=>account2.provider!=="openrouter"?{}:input2.model?.trim()?{model:input2.model.trim(),api:input2.api??"chat"}:{model:deciderModel(cfg2),api:deciderApi(cfg2)};async function ask2(seam,state,questions,options2={}){try{let cfg2=deps.config(),refused2=gate(cfg2,seam);if(refused2)return{
25041
25041
  ok:!1,reason:refused2};let account2=deciderAccount(cfg2,seam);return account2.included&&!relayAccepts(seam,state,questions)?{ok:!1,reason:"misconfigured"}:await call2(seam,account2,{...openrouterRequest(cfg2,account2),state,questions},options2)}catch{return{ok:!1,reason:"malformed"}}}let single=result2=>result2.ok?{...result2,answers:result2.answers.answer}:result2;return{ask:ask2,async choose(seam,state,question,options2){let asked={answer:{type:"choice",instructions:question.instructions,options:question.
@@ -25069,8 +25069,8 @@ keys(clef).length?call2(clefUrl,{...clefRequestBody(state,clefQuestions(clef),CL
25069
25069
  name6,fromClairic[name6]??fromClef[name6]??null])),model:[read4&&"clairic",decided2&&CLEF_FLASH].filter(Boolean).join("+")}}var DEFAULT_EXTRACT_TIMEOUT_MS=8e3,MIN_TIMEOUT_MS2=50,MAX_TIMEOUT_MS2=3e4;function extractorAccount(cfg2,request9){return[workersAiAccount(cfg2),includedAccount(),openrouterAccount(cfg2)].find(account2=>!!account2&&!(account2.included&&request9&&!relayAcceptsExtract(request9.seam,request9.fields,request9.input)))??null}function extractorReady(cfg2){return helpersOn(cfg2,extractorAccount(cfg2))}function describeExtractor(cfg2){let account2=extractorAccount(cfg2);return{...account2?{provider:account2.
25070
25070
  provider}:{},...account2?.included?{included:!0}:{},ready:helpersOn(cfg2,account2)}}function openrouterModel(cfg2){let own4=cfg2.decider?.openrouterModel?.trim();return own4&&cfg2.decider?.openrouterApi==="chat"?own4:OPENROUTER_EXTRACT_MODEL}var today=timeZone=>{try{return new Intl.DateTimeFormat("en-CA",{timeZone,year:"numeric",month:"2-digit",day:"2-digit"}).format(new Date)}catch{return new Date().toISOString().slice(0,10)}};function createExtractor(deps){let fetchImpl=deps.fetch??fetch,now2=deps.
25071
25071
  now??(()=>performance.now());async function call2(account2,cfg2,seam,fields2,input2,options2){let provider=account2.provider;if(options2.signal?.aborted)return{ok:!1,provider,reason:"cancelled"};let timeoutMs2=Math.min(MAX_TIMEOUT_MS2,Math.max(MIN_TIMEOUT_MS2,options2.timeoutMs??DEFAULT_EXTRACT_TIMEOUT_MS)),controller=new AbortController,onAbort=()=>controller.abort();options2.signal?.addEventListener("abort",onAbort,{once:!0});let timer4,timedOut3=new Promise(resolve56=>{timer4=setTimeout(()=>{
25072
- controller.abort(),resolve56({ok:!1,reason:"timeout"})},timeoutMs2)}),request9={key:account2.token,baseUrl:account2.api,...account2.accountId?{accountId:account2.accountId}:{},...provider==="openrouter"?{model:openrouterModel(cfg2)}:{},seam,fields:fields2,input:input2,referenceDate:today(deps.timeZone?.()),signal:controller.signal,fetch:fetchImpl},backend=provider==="workersai"?extractWithWorkersAi:provider==="openrouter"?extractWithOpenRouter:extractWithRelay,started2=now2(),outcome;try{outcome=
25073
- await Promise.race([Promise.resolve().then(()=>backend(request9)).catch(()=>({ok:!1,reason:"malformed"})),timedOut3])}finally{clearTimeout(timer4),options2.signal?.removeEventListener("abort",onAbort)}let latencyMs=Math.max(0,Math.round(now2()-started2));if(!outcome.ok){let reason3=outcome.reason!=="timeout"&&options2.signal?.aborted?"cancelled":outcome.reason;return{ok:!1,provider,reason:reason3,...outcome.status?{status:outcome.status}:{},latencyMs}}return{ok:!0,provider,values:outcome.values,
25072
+ controller.abort(),resolve56({ok:!1,reason:"timeout"})},timeoutMs2)}),request9={key:account2.token,baseUrl:account2.api,...account2.accountId?{accountId:account2.accountId}:{},...provider==="openrouter"?{model:openrouterModel(cfg2)}:{},seam,fields:fields2,input:input2,referenceDate:today(deps.timeZone?.()),signal:controller.signal,fetch:fetchImpl},backend=provider==="workersai"?extractWithWorkersAi:provider==="openrouter"?extractWithOpenRouter:extractWithRelay,started3=now2(),outcome;try{outcome=
25073
+ await Promise.race([Promise.resolve().then(()=>backend(request9)).catch(()=>({ok:!1,reason:"malformed"})),timedOut3])}finally{clearTimeout(timer4),options2.signal?.removeEventListener("abort",onAbort)}let latencyMs=Math.max(0,Math.round(now2()-started3));if(!outcome.ok){let reason3=outcome.reason!=="timeout"&&options2.signal?.aborted?"cancelled":outcome.reason;return{ok:!1,provider,reason:reason3,...outcome.status?{status:outcome.status}:{},latencyMs}}return{ok:!0,provider,values:outcome.values,
25074
25074
  ...outcome.model?{model:outcome.model}:{},latencyMs}}return{async extract(seam,fields2,input2,options2={}){try{if(extractRequestProblem(fields2,input2)!==null)return{ok:!1,reason:"misconfigured"};let cfg2=deps.config();if(cfg2.decider?.provider==="off")return{ok:!1,reason:"disabled"};let any3=extractorAccount(cfg2);if(!any3)return{ok:!1,reason:cfg2.decider?.enabled===!0?"no_key":"disabled"};if(!helpersOn(cfg2,any3))return{ok:!1,reason:"disabled"};if(seam==="inboxTriage"&&cfg2.decider?.jobs?.inboxTriage===
25075
25075
  !1)return{ok:!1,reason:"job_off"};let account2=extractorAccount(cfg2,{seam,fields:fields2,input:input2});return account2?await call2(account2,cfg2,seam,fields2,input2,options2):{ok:!1,reason:any3.included?"misconfigured":"no_key"}}catch{return{ok:!1,reason:"malformed"}}},async testKey(options2={}){try{let cfg2=deps.config(),account2=extractorAccount(cfg2,{seam:"keyCheck",...EXTRACT_KEY_CHECK});return account2?await call2(account2,cfg2,"keyCheck",EXTRACT_KEY_CHECK.fields,EXTRACT_KEY_CHECK.input,{
25076
25076
  timeoutMs:1e4,...options2}):{ok:!1,reason:"no_key"}}catch{return{ok:!1,reason:"malformed"}}}}}function describeHelpers(cfg2){let accountId=cfg2.decider?.workersAiAccountId?.trim();return{own:{jev:!!cfg2.decider?.key?.trim(),workersAi:!!cfg2.decider?.workersAiToken?.trim(),openrouter:!!cfg2.decider?.openrouterKey?.trim()},...sharedOpenRouterKey(cfg2)?{sharedKey:!0}:{},...accountId?{workersAiAccountId:accountId}:{},extraction:describeExtractor(cfg2)}}var TEXT_MAX4=2e3;function createStopLineRoutes(){return async({req,res,path:path6,method:method2,json:json7,readBody:readBody2})=>{if(!(method2==="POST"&&path6==="/api/stop-line"))return PASS;let body2;try{body2=await readBody2(req,8192)}catch{return json7(res,400,{error:"expected a small JSON body"})}let text30=body2&&typeof body2=="object"?body2.text:void 0;return typeof text30!="string"?json7(res,400,{error:"text must be a string"}):json7(res,200,{stop:text30.length<=TEXT_MAX4&&isStopCommand(
@@ -25202,15 +25202,15 @@ d URL"}:{owner:owner2,repo,...ref4?{ref:ref4}:{},path:decoded,...extra}}function
25202
25202
  ook like a skills.sh repository or skill URL"}:{owner:registry3[1],repo:registry3[2],path:"",skill:registry3[3]};let shorthand=text30.match(/^([\w.-]+)\/([\w.-]+)$/);return shorthand?target3(shorthand[1],shorthand[2],void 0,""):{error:"that does not look like a GitHub or skills.sh repository, folder, or SKILL.md URL"}}var CONTENT_ENTRY=external_exports.object({type:external_exports.string(),name:external_exports.string(),path:external_exports.string(),sha:external_exports.string().optional(),download_url:external_exports.
25203
25203
  string().nullable().optional()}),CONTENT_LISTING=external_exports.array(external_exports.unknown()).catch([]);function asEntries(listing2){return listing2.flatMap(item=>{let entry2=CONTENT_ENTRY.safeParse(item);return entry2.success?[entry2.data]:[]})}function encodePath2(path6){let parts3=path6.split("/").filter(Boolean);if(parts3.some(part2=>part2==="."||part2===".."))throw new Error(`refusing the path ${JSON.stringify(path6)}`);return parts3.map(encodeURIComponent).join("/")}function apiError(response,url2){
25204
25204
  let limited=response.status===429||response.status===403&&response.headers.get("x-ratelimit-remaining")==="0";return new GitHubApiError(limited?"GitHub's limit for requests without sign-in was reached \u2014 try again within the hour":`GitHub API ${response.status} for ${url2}`)}async function apiGet(url2,fetcher,accept="application/vnd.github+json"){let response=await fetcher(url2,{headers:{accept,"user-agent":USER_AGENT}});if(!response.ok)throw apiError(response,url2);return response}async function resolveCommit(owner2,repo,ref4,fetcher){
25205
- let url2=`${API5}/repos/${owner2}/${repo}/commits/${encodeURIComponent(ref4)}`,sha=(await(await apiGet(url2,fetcher,"application/vnd.github.sha")).text()).trim();if(!/^[0-9a-f]{40}$/.test(sha))throw new GitHubApiError(`GitHub did not name a commit for ${url2}`);return sha}async function listDir2(snapshot4,path6,fetcher){let url2=`${API5}/repos/${snapshot4.owner}/${snapshot4.repo}/contents/${encodePath2(path6)}?ref=${snapshot4.commit}`,entries4=asEntries(CONTENT_LISTING.parse(await(await apiGet(url2,
25206
- fetcher)).json()));for(let entry2 of entries4)entry2.type==="dir"&&entry2.sha&&snapshot4.trees.set(entry2.path,entry2.sha);return entries4}function assertPinnedRawUrl(url2){let parsed2;try{parsed2=new URL(url2)}catch{throw new Error(`refusing to download ${url2} \u2014 not a valid URL`)}if(parsed2.protocol!=="https:"||parsed2.username||parsed2.password||parsed2.port||parsed2.hostname!==RAW_HOST)throw new Error(`refusing to download ${url2} \u2014 skill files must be https://raw.githubusercontent.com \
25207
- links`)}async function fetchBytes(url2,fetcher){assertPinnedRawUrl(url2);let response=await fetcher(url2,{headers:{"user-agent":USER_AGENT},redirect:"error"});if(!response.ok)throw new Error(`download failed (${response.status})`);return Buffer.from(await response.arrayBuffer())}var MAX_SKILLS_PER_IMPORT=30,MAX_FOLDERS_WALKED=24,MAX_CHILDREN_PER_FOLDER=60,passThrough=error66=>error66 instanceof ImportLimitError||error66 instanceof Error&&error66.name==="TimeoutError",toSkillSlug=name6=>name6.toLowerCase().
25208
- replace(/[\s_]+/g,"-").replace(/[^a-z0-9-]/g,"").replace(/-+/g,"-").replace(/^-|-$/g,"");async function skillNameFrom(entries4,fetcher){let skillMd=entries4.find(entry2=>entry2.type==="file"&&entry2.name==="SKILL.md"&&entry2.download_url);if(skillMd)try{return(await fetchBytes(skillMd.download_url,fetcher)).toString("utf8").match(/^---\r?\n([\s\S]*?)\r?\n---/)?.[1]?.match(/^name:\s*(.+)$/m)?.[1]?.trim()}catch(error66){if(passThrough(error66))throw error66;return}}async function discoverSkillDirs(target4,snapshot4,fetcher){
25205
+ let url2=`${API5}/repos/${owner2}/${repo}/commits/${encodeURIComponent(ref4)}`,sha2=(await(await apiGet(url2,fetcher,"application/vnd.github.sha")).text()).trim();if(!/^[0-9a-f]{40}$/.test(sha2))throw new GitHubApiError(`GitHub did not name a commit for ${url2}`);return sha2}async function listDir2(snapshot4,path6,fetcher){let url2=`${API5}/repos/${snapshot4.owner}/${snapshot4.repo}/contents/${encodePath2(path6)}?ref=${snapshot4.commit}`,entries4=asEntries(CONTENT_LISTING.parse(await(await apiGet(
25206
+ url2,fetcher)).json()));for(let entry2 of entries4)entry2.type==="dir"&&entry2.sha&&snapshot4.trees.set(entry2.path,entry2.sha);return entries4}function assertPinnedRawUrl(url2){let parsed2;try{parsed2=new URL(url2)}catch{throw new Error(`refusing to download ${url2} \u2014 not a valid URL`)}if(parsed2.protocol!=="https:"||parsed2.username||parsed2.password||parsed2.port||parsed2.hostname!==RAW_HOST)throw new Error(`refusing to download ${url2} \u2014 skill files must be https://raw.githubusercontent\
25207
+ .com links`)}async function fetchBytes(url2,fetcher){assertPinnedRawUrl(url2);let response=await fetcher(url2,{headers:{"user-agent":USER_AGENT},redirect:"error"});if(!response.ok)throw new Error(`download failed (${response.status})`);return Buffer.from(await response.arrayBuffer())}var MAX_SKILLS_PER_IMPORT=30,MAX_FOLDERS_WALKED=24,MAX_CHILDREN_PER_FOLDER=60,passThrough=error66=>error66 instanceof ImportLimitError||error66 instanceof Error&&error66.name==="TimeoutError",toSkillSlug=name6=>name6.
25208
+ toLowerCase().replace(/[\s_]+/g,"-").replace(/[^a-z0-9-]/g,"").replace(/-+/g,"-").replace(/^-|-$/g,"");async function skillNameFrom(entries4,fetcher){let skillMd=entries4.find(entry2=>entry2.type==="file"&&entry2.name==="SKILL.md"&&entry2.download_url);if(skillMd)try{return(await fetchBytes(skillMd.download_url,fetcher)).toString("utf8").match(/^---\r?\n([\s\S]*?)\r?\n---/)?.[1]?.match(/^name:\s*(.+)$/m)?.[1]?.trim()}catch(error66){if(passThrough(error66))throw error66;return}}async function discoverSkillDirs(target4,snapshot4,fetcher){
25209
25209
  let root3=await listDir2(snapshot4,target4.path,fetcher),wanted=target4.skill&&toSkillSlug(target4.skill)||void 0,dirMatches=dir=>!!wanted&&toSkillSlug(dir.split("/").at(-1))===wanted,isWanted=async(dir,entries4)=>{if(!wanted||dirMatches(dir))return!0;let name6=await skillNameFrom(entries4,fetcher);return!!name6&&toSkillSlug(name6)===wanted};if(root3.some(entry2=>entry2.type==="file"&&entry2.name==="SKILL.md")&&await isWanted(target4.path,root3))return[target4.path];let dirs=root3.filter(entry2=>entry2.
25210
25210
  type==="dir"),found2=[],preferred=["skills",".claude",".agents"],rank3=name6=>wanted&&toSkillSlug(name6)===wanted?0:preferred.includes(name6)?1:2,ordered=[...dirs].sort((a,b11)=>rank3(a.name)-rank3(b11.name)),enough=()=>found2.length>=(wanted?1:MAX_SKILLS_PER_IMPORT);for(let dir of ordered.slice(0,MAX_FOLDERS_WALKED)){if(enough())break;let base2=dir.name===".claude"||dir.name===".agents"?`${dir.path}/skills`:dir.path,children4;try{children4=await listDir2(snapshot4,base2,fetcher)}catch(error66){
25211
25211
  if(passThrough(error66))throw error66;continue}if(children4.some(entry2=>entry2.type==="file"&&entry2.name==="SKILL.md")){await isWanted(base2,children4)&&found2.push(base2);continue}let childDirs=children4.filter(entry2=>entry2.type==="dir"),exact=wanted?childDirs.find(child2=>dirMatches(child2.path)):void 0,candidates=exact?[exact,...childDirs.filter(child2=>child2!==exact).slice(0,MAX_CHILDREN_PER_FOLDER-1)]:childDirs.slice(0,MAX_CHILDREN_PER_FOLDER);for(let child2 of candidates){if(enough())
25212
25212
  break;try{let inner=await listDir2(snapshot4,child2.path,fetcher);inner.some(entry2=>entry2.type==="file"&&entry2.name==="SKILL.md")&&await isWanted(child2.path,inner)&&found2.push(child2.path)}catch(error66){if(passThrough(error66))throw error66}}}return found2}var TREE=external_exports.object({truncated:external_exports.boolean().optional(),tree:external_exports.array(external_exports.object({path:external_exports.string(),mode:external_exports.string(),type:external_exports.string(),sha:external_exports.
25213
- string(),size:external_exports.number().optional()}))});async function folderTree(snapshot4,dir,fetcher){dir&&!snapshot4.trees.has(dir)&&await listDir2(snapshot4,dir.includes("/")?dir.slice(0,dir.lastIndexOf("/")):"",fetcher);let sha=dir?snapshot4.trees.get(dir):snapshot4.commit;if(!sha)throw new GitHubApiError(`GitHub did not list the folder ${dir}`);let url2=`${API5}/repos/${snapshot4.owner}/${snapshot4.repo}/git/trees/${sha}?recursive=1`,listing2=TREE.safeParse(await(await apiGet(url2,fetcher)).
25213
+ string(),size:external_exports.number().optional()}))});async function folderTree(snapshot4,dir,fetcher){dir&&!snapshot4.trees.has(dir)&&await listDir2(snapshot4,dir.includes("/")?dir.slice(0,dir.lastIndexOf("/")):"",fetcher);let sha2=dir?snapshot4.trees.get(dir):snapshot4.commit;if(!sha2)throw new GitHubApiError(`GitHub did not list the folder ${dir}`);let url2=`${API5}/repos/${snapshot4.owner}/${snapshot4.repo}/git/trees/${sha2}?recursive=1`,listing2=TREE.safeParse(await(await apiGet(url2,fetcher)).
25214
25214
  json());if(!listing2.success)throw new GitHubApiError(`GitHub sent an unreadable folder listing for ${url2}`);if(listing2.data.truncated)throw new ImportLimitError("That skill folder holds too many files to list \u2014 paste a smaller folder instead.");return listing2.data.tree.map(entry2=>({path:entry2.path,sha:entry2.sha,size:entry2.size??0,kind:entry2.type==="tree"?"folder":entry2.type==="commit"?"submodule":entry2.mode==="120000"?"link":"file",executable:entry2.mode==="100755"}))}var gitBlobSha=bytes4=>createHash79(
25215
25215
  "sha1").update(`blob ${bytes4.length}\0`).update(bytes4).digest("hex"),isLfsPointer=bytes4=>bytes4.length<1024&&bytes4.toString("utf8").startsWith(`version https://git-lfs.github.com/spec/v1
25216
25216
  `);async function fetchSkillFolder(target4,snapshot4,dir,fetcher){let entries4=await folderTree(snapshot4,dir,fetcher),{take:take2,skipped:skipped2}=planSkillFolder(entries4);if(take2[0]?.path!=="SKILL.md")throw new Error(`no SKILL.md in ${dir||"the repository root"}`);if(take2[0].size>262144)throw new Error(`SKILL.md is larger than ${262144/1024}KB`);let files2=[];for(let i=0;i<take2.length;i+=PARALLEL_DOWNLOADS){let batch=await Promise.all(take2.slice(i,i+PARALLEL_DOWNLOADS).map(async entry2=>{
@@ -25432,10 +25432,10 @@ test(option2)||JARGON.test(option2)||HEALTH.test(option2)||script&&!script.test(
25432
25432
  `).filter(line6=>!LEARNED_LINE.test(line6)).join(" "),clean10=factLine(redact(kept2).replace(EMAIL2,"[email]").replace(PHONE2,"[phone]"),1600);if(!clean10)return;if(clean10.length<=1500)return clean10;let cut4=clean10.slice(0,1500);return cut4.slice(0,Math.max(cut4.lastIndexOf(" "),1e3)).trim()}function worthAsking(facts,apps2){return hasSetupChoices(facts.languageCode)?!!(facts.name||facts.title||facts.department||facts.aboutMe||facts.otherJobs.length||apps2&&("later"in apps2||apps2.known.length)):
25433
25433
  !0}var SETUP_SUGGESTIONS_DEADLINE_MS=6e3,RENAME_SETTLE_MS=600,APPS_WAIT_MS=700,sleep2=ms2=>new Promise(resolve56=>{setTimeout(resolve56,ms2).unref?.()}),typedName=name6=>name6.trim()&&!isPickedBotName(name6)?name6:void 0,calledKey=bot=>JSON.stringify([factLine(typedName(bot.name),80),factLine(bot.title,120),factLine(bot.section,60)]);function createSetupSuggestions(deps){let jobs=new Map,called=new Map(deps.store.bots.map(bot=>[bot.id,calledKey(bot)])),unanswered=bot=>{let greeting=openSetupOffer(
25434
25434
  deps.store,bot.id,bot.threadId);return greeting&&!deps.store.taskByThread(bot.id,bot.threadId)?.setupRequest?greeting:null};function drop(botId){let job=jobs.get(botId);job&&(jobs.delete(botId),clearTimeout(job.timer),job.stop.abort())}function begin(bot,greetingId){drop(bot.id);let job={threadId:bot.threadId,greetingId,stop:new AbortController};return jobs.set(bot.id,job),job}function settle3(botId,job,choices){if(jobs.get(botId)!==job)return null;drop(botId);let greeting=deps.store.messagesFor(
25435
- job.threadId).find(message8=>message8.id===job.greetingId);if(!greeting?.setupChoicesPending&&greeting?.setupChoicesUpdating===void 0)return!1;let bot=deps.store.bot(botId),shown3=choices!==null&&bot!==null&&unanswered(bot)?.id===job.greetingId;return deps.store.patchMessage(job.threadId,job.greetingId,{setupChoicesPending:void 0,setupChoicesUpdating:void 0,...shown3?{setupChoices:[...choices]}:{}}),shown3}async function ask2(writer,basis2,apps2,stop2){let started2=Date.now(),expiry=new AbortController,
25435
+ job.threadId).find(message8=>message8.id===job.greetingId);if(!greeting?.setupChoicesPending&&greeting?.setupChoicesUpdating===void 0)return!1;let bot=deps.store.bot(botId),shown3=choices!==null&&bot!==null&&unanswered(bot)?.id===job.greetingId;return deps.store.patchMessage(job.threadId,job.greetingId,{setupChoicesPending:void 0,setupChoicesUpdating:void 0,...shown3?{setupChoices:[...choices]}:{}}),shown3}async function ask2(writer,basis2,apps2,stop2){let started3=Date.now(),expiry=new AbortController,
25436
25436
  timer4=setTimeout(()=>expiry.abort(),SETUP_SUGGESTIONS_DEADLINE_MS);timer4.unref?.();let signal=AbortSignal.any([expiry.signal,stop2]),ended2=new Promise((_3,reject)=>signal.addEventListener("abort",()=>reject(new Error("ended")),{once:!0}));ended2.catch(()=>{});try{let named4=apps2&&"later"in apps2?await Promise.race([apps2.later,sleep2(APPS_WAIT_MS).then(()=>[]),ended2]):apps2?.known??[];if(!worthAsking(basis2,{known:named4}))return{choices:null,outcome:"nothing to go on"};let prompt=setupSuggestionPrompt(
25437
- {...basis2,apps:named4}),remaining2=Math.max(1,SETUP_SUGGESTIONS_DEADLINE_MS-(Date.now()-started2)),reply4=await Promise.race([writer.generateText(prompt,{signal,timeoutMs:remaining2}),ended2]),choices=parseSetupSuggestions(reply4,basis2.languageCode);return{choices,outcome:choices?"shown":"unusable reply"}}catch{return{choices:null,outcome:stop2.aborted?"stopped":expiry.signal.aborted?"late":"failed"}}finally{clearTimeout(timer4)}}async function write4(bot,job,writer,basis2,apps2,renamed2){let started2=Date.
25438
- now(),{choices,outcome}=await ask2(writer,basis2,apps2,job.stop.signal);try{let shown3=settle3(bot.id,job,choices??(renamed2&&outcome==="nothing to go on"?setupChoices(basis2.languageCode):null));if(shown3===null)return;deps.log?.(`setup card answers for ${bot.id}${renamed2?" after a rename":""}: ${!shown3&&outcome==="shown"?"late":outcome} after ${Date.now()-started2} ms (${bot.modelSelection.instanceId}, ${writer.via})`)}catch{deps.log?.(`setup card answers for ${bot.id}: could not be saved`)}}
25437
+ {...basis2,apps:named4}),remaining2=Math.max(1,SETUP_SUGGESTIONS_DEADLINE_MS-(Date.now()-started3)),reply4=await Promise.race([writer.generateText(prompt,{signal,timeoutMs:remaining2}),ended2]),choices=parseSetupSuggestions(reply4,basis2.languageCode);return{choices,outcome:choices?"shown":"unusable reply"}}catch{return{choices:null,outcome:stop2.aborted?"stopped":expiry.signal.aborted?"late":"failed"}}finally{clearTimeout(timer4)}}async function write4(bot,job,writer,basis2,apps2,renamed2){let started3=Date.
25438
+ now(),{choices,outcome}=await ask2(writer,basis2,apps2,job.stop.signal);try{let shown3=settle3(bot.id,job,choices??(renamed2&&outcome==="nothing to go on"?setupChoices(basis2.languageCode):null));if(shown3===null)return;deps.log?.(`setup card answers for ${bot.id}${renamed2?" after a rename":""}: ${!shown3&&outcome==="shown"?"late":outcome} after ${Date.now()-started3} ms (${bot.modelSelection.instanceId}, ${writer.via})`)}catch{deps.log?.(`setup card answers for ${bot.id}: could not be saved`)}}
25439
25439
  function end(botId,job,why,choices=null){try{settle3(botId,job,choices)!==null&&deps.log?.(`setup card answers for ${botId} after a rename: ${why}`)}catch{deps.log?.(`setup card answers for ${botId}: could not be saved`)}}function rewrite2(botId,job){let bot=deps.store.bot(botId);if(!(!bot||jobs.get(botId)!==job))try{if(!unanswered(bot))return end(botId,job,"answered first");let basis2=deps.facts(bot),apps2=deps.apps(bot);if(!worthAsking(basis2,apps2))return end(botId,job,"nothing to go on",setupChoices(
25440
25440
  basis2.languageCode));let writer=deps.withinBudget()?deps.writer(bot.id):null;if(!writer)return end(botId,job,"no one can write them");write4(bot,job,writer,basis2,apps2,!0)}catch{end(botId,job,"not asked")}}function renamed(bot){let greeting=deps.enabled()&&deps.canSetUp(bot)?unanswered(bot):null,current3=jobs.get(bot.id);if(!greeting){current3&&settle3(bot.id,current3,null);return}let job=begin(bot,greeting.id);deps.store.patchMessage(bot.threadId,greeting.id,{setupChoicesPending:void 0,setupChoicesUpdating:Date.
25441
25441
  now()}),job.timer=setTimeout(()=>rewrite2(bot.id,job),RENAME_SETTLE_MS),job.timer.unref?.()}return deps.store.onChange(change2=>{if(change2.type==="bot.deleted")called.delete(change2.botId),drop(change2.botId);else if(change2.type==="message"&&change2.message.role==="user")for(let[botId,job]of jobs)job.threadId===change2.threadId&&settle3(botId,job,null);else if(change2.type==="bot"){let bot=deps.store.bot(change2.botId);if(!bot)return;let key7=calledKey(bot),before=called.get(bot.id);called.set(
@@ -26216,9 +26216,9 @@ target(call2),probe2=await this.ports.probe(target4),aliveAfter=probe2?probe2.co
26216
26216
  !1?"no-browser":"page-not-responding",engineMs}),out;let recording=state.recorded&&ok2,pending3=[],settleMs=0;if(recording){let settled2=await this.settle(target4,probe2.port,state.actionAt,()=>call2.stopped());if(pending3=settled2.pending,settleMs=settled2.ms,call2.stopped()||await this.reader(target4,probe2.port,FRAME_WAIT_MS*2)({action:"evaluate",script:FRAME_SCRIPT}),call2.stopped())return await halted({settleMs}),out}let read4=this.reader(target4,probe2.port),geometry=null,failure11;if(state.
26217
26217
  recorded){let answer2=await read4({action:"evaluate",script:GEOMETRY_SCRIPT});geometry=parseGeometry(answer2?.data?.result),failure11=answer2?.error}let page=geometry??parseGeometry((await read4({action:"evaluate",script:PAGE_SCRIPT}))?.data?.result);this.health.setPage(call2.session,page?.url??null,page?.loadedAt??null);let delta=await this.health.read(call2.session,read4,call2.ctx?.threadId??null,state.noDaemon);this.ports.takeStarted(call2.session)&&await this.started(call2,steps,!0,out);let pageHost=this.
26218
26218
  health.pageHost(call2.session),lines=[state.late?healthLine(this.health.visible(call2.session,state.late),[],"late",SETTLE_CAP_MS/1e3,pageHost):null,delta?healthLine(this.health.visible(call2.session,delta),recording?unansweredWorthSaying(pending3):[],state.action?"after":"late",SETTLE_CAP_MS/1e3,pageHost):null,browserEgress.takeNotice(call2.session)];for(let text30 of lines)text30&&out.parts.push({type:"text",text:text30});if(state.recorded){let step2=await this.write(call2,state,{ok:ok2,engineMs,
26219
- settleMs,geometry,failure:failure11,delta,pending:pending3,captureFrom:probe2.port});step2&&out.parts.push({type:"text",text:`Recorded as step ${step2}.`})}}catch{}return out}async started(call2,steps,news,out){out.launched||(out.launched=!0,steps.refs.clear(),await call2.resize(),news&&out.parts.push({type:"text",text:RELAUNCHED}))}async settle(target4,port,since,stopped){let started2=this.now(),read4=this.reader(target4,port,SETTLE_CAP_MS+PASS_MS),site=this.health.pageSite(target4.session),pending3=[];
26219
+ settleMs,geometry,failure:failure11,delta,pending:pending3,captureFrom:probe2.port});step2&&out.parts.push({type:"text",text:`Recorded as step ${step2}.`})}}catch{}return out}async started(call2,steps,news,out){out.launched||(out.launched=!0,steps.refs.clear(),await call2.resize(),news&&out.parts.push({type:"text",text:RELAUNCHED}))}async settle(target4,port,since,stopped){let started3=this.now(),read4=this.reader(target4,port,SETTLE_CAP_MS+PASS_MS),site=this.health.pageSite(target4.session),pending3=[];
26220
26220
  for(let wait2=50;!stopped()&&(await this.sleep(wait2),!stopped());wait2=100){let answer2=await read4({action:"requests",type:"document,fetch,xhr"}),list10=Array.isArray(answer2?.data?.requests)?answer2.data.requests:null;if(!list10||(pending3=list10.flatMap(raw=>{let at8=finite2(record21(raw)?.timestamp),request9=reduceRequest(raw,site,this.now());return!request9?.pending||at8!==null&&at8<since-50?[]:request9.type.toLowerCase()==="document"||request9.method!=="GET"&&request9.firstParty?[request9]:
26221
- []}),!pending3.length||this.now()-started2>=SETTLE_CAP_MS))break}return{pending:pending3,ms:this.now()-started2}}async write(call2,state,facts){let ctx=call2.ctx;if(!ctx||!this.evidence)return null;let steps=this.session(call2.session),geometry=facts.geometry??null,navigated=!!(state.geometry&&geometry&&state.geometry.url!==geometry.url),ref4=state.target?.role!==void 0?{role:state.target.role,name:state.target.name??""}:void 0,{marker,why}=markerFor(state.box,state.geometry,geometry,{navigated,
26221
+ []}),!pending3.length||this.now()-started3>=SETTLE_CAP_MS))break}return{pending:pending3,ms:this.now()-started3}}async write(call2,state,facts){let ctx=call2.ctx;if(!ctx||!this.evidence)return null;let steps=this.session(call2.session),geometry=facts.geometry??null,navigated=!!(state.geometry&&geometry&&state.geometry.url!==geometry.url),ref4=state.target?.role!==void 0?{role:state.target.role,name:state.target.name??""}:void 0,{marker,why}=markerFor(state.box,state.geometry,geometry,{navigated,
26222
26222
  inFrame:state.target?.inFrame??!1}),here=geometry?pageKey(geometry.url):null;steps.codeUrl!==null&&here!==null&&here!==steps.codeUrl&&(steps.codeUntil=0),steps.secretPage!==null&&here!==null&&here!==steps.secretPage&&(steps.secretPage=null);let typed=call2.tool==="agent_browser_fill"||call2.tool==="agent_browser_type",target4=state.target;if(typed&&here!==null&&(target4?.inFrame&&SECRET_TARGET.test(`${target4.role??""} ${target4.name??""}`)||geometry?.focus?.frame==="cross"&&geometry.focus.secret)&&
26223
26223
  (steps.secretPage=here),!this.evidence.accepts(ctx.threadId))return null;let step2=this.evidence.nextStep(),imageSkipped=facts.imageSkipped??null;imageSkipped||(!geometry||this.ports.isTripped(call2.session)?imageSkipped=/dialog/iu.test(facts.failure??"")?"dialog-open":"page-not-responding":geometry.unmasked>0||steps.secretPage!==null&&steps.secretPage===here?imageSkipped="secret-on-screen":steps.codeUntil>this.now()?imageSkipped="code-recently-typed":call2.stopped()?imageSkipped="person-took-co\
26224
26224
  ntrol":call2.alive()||(imageSkipped="turn-ended"));let imagePath=null,captureMs;if(!imageSkipped&&facts.captureFrom!==void 0){let slot=this.evidence.imageTarget(ctx.threadId,ctx.generation,step2);if("skipped"in slot)imageSkipped=slot.skipped;else{let captureStarted=this.now(),taken=!1;try{taken=(await relay(facts.captureFrom,{action:"screenshot",path:slot.path,format:"jpeg",quality:JPEG_QUALITY},{timeoutMs:SCREENSHOT_MS,maxBytes:65536})).success}catch(error66){error66 instanceof RelayTimeout&&this.
@@ -26306,7 +26306,7 @@ code:fields2.code},...fields2.text===void 0?{}:{text:fields2.text}};if(command3.
26306
26306
  let releases=command3.action==="input_keyboard"&&eventType2==="keyUp"||type4==="input_mouse"&&eventType2==="mouseReleased",confirmed;try{confirmed=await this.sendInput(viewer,viewer.port,command3,releases)}catch(error66){throw error66 instanceof BrowserInputRefusedError&&(command3.action==="input_keyboard"&&eventType2==="keyDown"&&viewer.pressedKeys.delete(key7),type4==="input_mouse"&&eventType2==="mousePressed"&&viewer.pressedButtons.delete(String(fields2.button))),error66}if(!confirmed)throw new BrowserInputUnconfirmedError;
26307
26307
  (command3.action==="press"||command3.action==="input_keyboard"&&eventType2==="keyUp")&&viewer.pressedKeys.delete(key7),type4==="input_mouse"&&eventType2==="mouseReleased"&&viewer.pressedButtons.delete(String(fields2.button))}async sendInput(viewer,port,command3,releases){let send3=()=>relay(port,command3,INPUT_RELAY).then(answer2=>answer2.success),watch=this.dialogs.get(viewer.session)?.watch,before=watch?.opened??0,asked=()=>!!watch&&(watch.dialog!==null||watch.opened!==before),answered3=async()=>(await watch.
26308
26308
  settled(viewer.abort.signal),!viewer.abort.signal.aborted);try{if(await send3())return!0;if(asked())return await answered3();if(command3.action!=="press"&&await send3())return!0}catch{if(asked())return await answered3();if(!await this.ended(port))return!1;if(!releases)throw new BrowserSlowActionError;return send3().catch(()=>!1)}if(releases||command3.action==="press")return!1;throw new BrowserInputRefusedError}async watchDialogs(viewer){if(!this.devTools||!viewer.port||attachesToChrome(viewer.spec.
26309
- env??{}))return;let devTools=this.devTools,port=viewer.port,join278=()=>{let entry2=this.dialogs.get(viewer.session);return!entry2||entry2.watch.closed?!1:(this.current(viewer)&&entry2.views.add(viewer.id),!0)};if(join278())return;let url2=localDevToolsUrl(await devTools.url(port).catch(()=>null));if(join278()||!url2||!this.current(viewer))return;let session=viewer.session,watch=new DialogWatch(()=>this.control(session));this.dialogs.set(session,{watch,views:new Set([viewer.id])}),await watch.start(
26309
+ env??{}))return;let devTools=this.devTools,port=viewer.port,join279=()=>{let entry2=this.dialogs.get(viewer.session);return!entry2||entry2.watch.closed?!1:(this.current(viewer)&&entry2.views.add(viewer.id),!0)};if(join279())return;let url2=localDevToolsUrl(await devTools.url(port).catch(()=>null));if(join279()||!url2||!this.current(viewer))return;let session=viewer.session,watch=new DialogWatch(()=>this.control(session));this.dialogs.set(session,{watch,views:new Set([viewer.id])}),await watch.start(
26310
26310
  url2,devTools.connect).catch(()=>watch.close())}unwatchDialogs(viewer){let entry2=this.dialogs.get(viewer.session);!entry2?.views.delete(viewer.id)||entry2.views.size||(entry2.watch.close(),this.dialogs.delete(viewer.session))}async restartUnresponsive(viewer){if(viewer.restarting)return!1;viewer.restarting=!0;try{await this.runtime.restart(viewer.session,viewer.person,async()=>{let env=browserRuntimeEnv({...viewer.spec.env,AGENT_BROWSER_SESSION:viewer.session});if(!await closeBrowserSession(viewer.
26311
26311
  spec.command,env))throw new Error("browser close failed")});let note2={type:"error",retryable:!0,message:restartedNote(viewer.spec.env?.AGENT_BROWSER_RESTORE_SAVE!=="never")};for(let other of this.viewers.values())other.session===viewer.session&&this.send(other,note2);return this.closeForSession(viewer.session),!0}catch{return!1}finally{viewer.restarting=!1,viewer.closed&&this.runtime.release(viewer.session,viewer.person),this.control(viewer.session)}}ended(port){return relay(port,{action:"strea\
26312
26312
  m_status"},ENDED_PROBE).then(answer2=>answer2.success,()=>!1)}async open(options2){let replaced=options2.resume?this.viewers.get(options2.resume):void 0;if(replaced&&replaced.owner===options2.owner&&replaced.botId===options2.botId&&this.close(replaced,!0,!0),this.viewers.size>=8||[...this.viewers.values()].filter(v4=>v4.session===options2.session).length>=2)throw new BrowserLiveError("Too many browser views are open. Close another browser panel first.",429);let viewer={...options2,id:randomUUID64(),
@@ -26621,9 +26621,9 @@ resolve():new Promise((resolve56,reject)=>{let listener2=()=>{done()&&(this.#lis
26621
26621
  before||(this.#listeners.delete(listener2),clearTimeout(timer4),resolve56(this.#loaderId))};this.#listeners.add(listener2);let timer4=setTimeout(()=>{this.#listeners.delete(listener2),reject(new DriverError("timeout",`The page did not start loading within ${timeoutMs2} ms.`))},timeoutMs2)})}adopt(loaderId,loaded2){if(this.#loaderId===null){if(this.#reset(loaderId),loaded2)for(let name6 of["DOMContentLoaded","load"])this.#reached.add(name6);this.#notify()}}#event(params2){if(params2.frameId!==this.#mainFrameId)
26622
26622
  return;let loaderId=String(params2.loaderId??""),name6=String(params2.name??"");(name6==="init"||this.#loaderId===null)&&this.#reset(loaderId),loaderId===this.#loaderId&&(this.#reached.add(name6),this.#notify())}#reset(loaderId){this.#loaderId=loaderId,this.#reached=new Set}#notify(){for(let listener2 of this.#listeners)listener2()}},CONNECTED="function () { return this.isConnected && (!this.checkVisibility || this.checkVisibility()); }";async function elementPresent(context3,target4){let ref4=target4.
26623
26623
  ref??(target4.selector!==void 0?parseRef(target4.selector):null);if(ref4)try{return await callOnNode(context3.frames,context3.refs.resolve(ref4),CONNECTED)}catch(error66){if(error66 instanceof DriverError&&error66.code==="stale-ref")throw error66;return!1}if(target4.selector===void 0)throw new DriverError("invalid-selector","Name the element with a ref or a selector.");try{return await countSelector(context3.frames,target4.selector)>0}catch(error66){if(error66 instanceof DriverError&&error66.code===
26624
- "invalid-selector")throw error66;return!1}}async function waitFor(context3,conditions){let timeoutMs2=Math.min(Math.max(0,conditions.timeoutMs??DEFAULT_WAIT_MS),MAX_WAIT_MS),started2=Date.now(),checks=[],{text:text30,target:target4,urlIncludes,load:load9}=conditions;if(text30!==void 0&&checks.push(()=>valueInWorld(context3.frames,context3.frames.mainFrameId,`(document.body ? document.body.innerText : "").includes(${JSON.stringify(text30)})`).then(found2=>found2===!0,()=>!1)),target4!==void 0){let wantGone=conditions.
26624
+ "invalid-selector")throw error66;return!1}}async function waitFor(context3,conditions){let timeoutMs2=Math.min(Math.max(0,conditions.timeoutMs??DEFAULT_WAIT_MS),MAX_WAIT_MS),started3=Date.now(),checks=[],{text:text30,target:target4,urlIncludes,load:load9}=conditions;if(text30!==void 0&&checks.push(()=>valueInWorld(context3.frames,context3.frames.mainFrameId,`(document.body ? document.body.innerText : "").includes(${JSON.stringify(text30)})`).then(found2=>found2===!0,()=>!1)),target4!==void 0){let wantGone=conditions.
26625
26625
  gone===!0;checks.push(async()=>await elementPresent(context3,target4)!==wantGone)}if(urlIncludes!==void 0&&checks.push(async()=>context3.url().includes(urlIncludes)),load9!==void 0&&checks.push(async()=>context3.lifecycle.reached(load9)),conditions.ms!==void 0){let ms2=Math.min(Math.max(0,conditions.ms),MAX_WAIT_MS);if(ms2>timeoutMs2&&checks.length)throw new DriverError("refused",`The wait of ${ms2} ms is longer than its ${timeoutMs2} ms timeout.`);await sleep4(ms2)}if(checks.length)for(;;){if((await Promise.
26626
- all(checks.map(check4=>check4()))).every(Boolean))return;if(Date.now()-started2>=timeoutMs2)throw new DriverError("timeout",`Waited ${timeoutMs2}ms without every condition holding.`);await sleep4(POLL_MS5)}}import{readdirSync as readdirSync45,readFileSync as readFileSync152,statSync as statSync40}from"node:fs";import{join as join207}from"node:path";var ID14=/^[a-p]{32}$/,MAX_EXTENSIONS=50;function extensionPage(url2){try{let parsed2=new URL(url2);return parsed2.protocol==="chrome-extension:"&&ID14.test(parsed2.hostname)&&!parsed2.username&&!parsed2.password&&!parsed2.port}catch{return!1}}function readJson3(path6){try{let value3=JSON.parse(readFileSync152(path6,"utf8").replace(/^/u,""));return value3&&
26626
+ all(checks.map(check4=>check4()))).every(Boolean))return;if(Date.now()-started3>=timeoutMs2)throw new DriverError("timeout",`Waited ${timeoutMs2}ms without every condition holding.`);await sleep4(POLL_MS5)}}import{readdirSync as readdirSync45,readFileSync as readFileSync152,statSync as statSync40}from"node:fs";import{join as join207}from"node:path";var ID14=/^[a-p]{32}$/,MAX_EXTENSIONS=50;function extensionPage(url2){try{let parsed2=new URL(url2);return parsed2.protocol==="chrome-extension:"&&ID14.test(parsed2.hostname)&&!parsed2.username&&!parsed2.password&&!parsed2.port}catch{return!1}}function readJson3(path6){try{let value3=JSON.parse(readFileSync152(path6,"utf8").replace(/^/u,""));return value3&&
26627
26627
  typeof value3=="object"&&!Array.isArray(value3)?value3:null}catch{return null}}var text20=value3=>typeof value3=="string"&&value3.trim()?value3.trim():null,field4=(value3,key7)=>value3&&typeof value3=="object"?value3[key7]:void 0;function localized(name6,dir,manifest){let key7=/^__MSG_(\w+)__$/u.exec(name6)?.[1];if(!key7)return name6;let locale4=text20(manifest.default_locale);if(!locale4||!/^[\w-]{1,20}$/u.test(locale4))return null;let messages=readJson3(join207(dir,"_locales",locale4,"messages\
26628
26628
  .json")),entry2=messages&&Object.entries(messages).find(([candidate])=>candidate.toLowerCase()===key7.toLowerCase())?.[1];return text20(field4(entry2,"message"))}function pageOf2(manifest){let page=text20(field4(manifest.options_ui,"page"))??text20(manifest.options_page)??text20(field4(manifest.action,"default_popup"))??text20(field4(manifest.browser_action,"default_popup"));return page&&!/^[a-z][\w+.-]*:/iu.test(page)&&!page.startsWith("//")?page.replace(/^\/+/u,""):null}function newestVersion(dir){
26629
26629
  let versions=readdirSync45(dir).filter(name6=>!name6.startsWith("."));return versions.sort((a,b11)=>statSync40(join207(dir,b11)).mtimeMs-statSync40(join207(dir,a)).mtimeMs),versions[0]?join207(dir,versions[0]):null}function installedExtensions(userDataDir){let root3=join207(userDataDir,"Default","Extensions"),ids;try{ids=readdirSync45(root3).filter(id12=>ID14.test(id12))}catch{return[]}let found2=[];for(let id12 of ids)try{let dir=newestVersion(join207(root3,id12)),manifest=dir?readJson3(join207(
@@ -26705,12 +26705,12 @@ file3,args,{timeout:EXTRACT_TIMEOUT_MS,windowsHide:!0,maxBuffer:16*1024*1024},er
26705
26705
  options2.dataDir,options2.pin),running5=installs2.get(directory);return running5||(running5=install(options2).finally(()=>installs2.delete(directory)),installs2.set(directory,running5)),running5}async function install(options2){let{dataDir,pin}=options2,executable=chromeForTestingExecutable(dataDir,pin);if(existsSync81(executable))return executable;let directory=chromeForTestingDirectory(dataDir,pin),root3=dirname67(directory);mkdirSync102(root3,{recursive:!0,mode:448});for(let name6 of readdirSync46(
26706
26706
  root3)){let part2=join210(root3,name6);name6.endsWith(".part")&&Date.now()-statSync42(part2).mtimeMs>DOWNLOAD_TIMEOUT_MS3&&rmSync58(part2,{recursive:!0,force:!0})}let tag3=randomBytes26(6).toString("hex"),archive=join210(root3,`${pin.platform}.${tag3}.zip.part`),staging2=join210(root3,`${pin.platform}.${tag3}.part`);try{if(await downloadArchive(options2.url??chromeForTestingUrl(pin),archive,pin.bytes,options2)!==pin.sha256)throw new Error("the Chrome download failed its SHA-256 check; nothing wa\
26707
26707
  s installed");if(await(options2.extract??extractZip2)(archive,staging2),!existsSync81(join210(staging2,EXECUTABLES[pin.platform])))throw new Error("the Chrome archive did not hold the browser; nothing was installed");return rmSync58(directory,{recursive:!0,force:!0}),renameWithRetry(staging2,directory),executable}finally{rmSync58(archive,{force:!0}),rmSync58(staging2,{recursive:!0,force:!0})}}import{spawnSync as spawnSync3}from"node:child_process";import{existsSync as existsSync82,readdirSync as readdirSync47}from"node:fs";import{homedir as homedir38}from"node:os";import{posix as posix8,resolve as resolve48,win32 as win329}from"node:path";var MAC_CHROME_BINARY="Contents/MacOS/Google Chrome",MAC_POLICIES="/Library/Managed Preferences",WINDOWS_POLICIES="HKLM\\SOFTWARE\\Policies\\Google\\Chrome",WINDOWS_APP_PATHS="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\chrome.exe",LINUX_CHROME="/opt/google/chrome/chrome",LINUX_POLICIES="/etc/opt/chrome/policies/managed",AGENT_BROWSER_LAYOUTS={darwin:"Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing",linux:"chrome",win32:"chrome.exe"},paths=platform2=>platform2===
26708
- "win32"?win329:posix8;function isHeadlessShell(path6){return/chrome-headless-shell/iu.test(path6)}function installedGoogleChrome(host3){let{join:join278}=paths(host3.platform),candidates=[];if(host3.platform==="darwin"){let registered2=host3.appForBundleId("com.google.Chrome");registered2&&candidates.push(join278(registered2,MAC_CHROME_BINARY)),candidates.push(join278("/Applications/Google Chrome.app",MAC_CHROME_BINARY),join278(host3.home,"Applications/Google Chrome.app",MAC_CHROME_BINARY))}else if(host3.
26709
- platform==="win32"){for(let hive of["HKLM","HKCU"]){let registered2=host3.registryValue(`${hive}\\${WINDOWS_APP_PATHS}`);registered2&&candidates.push(registered2.replace(/^"|"$/gu,""))}for(let root3 of[host3.env.ProgramFiles,host3.env["ProgramFiles(x86)"],host3.env.LOCALAPPDATA])root3&&candidates.push(join278(root3,"Google","Chrome","Application","chrome.exe"))}else host3.platform==="linux"&&candidates.push(LINUX_CHROME);return candidates.find(candidate=>host3.exists(candidate))??null}function chromePolicyManaged(host3){
26710
- let{basename:basename38,join:join278}=paths(host3.platform);if(host3.platform==="darwin"){let user=host3.env.USER||basename38(host3.home);return host3.exists(join278(MAC_POLICIES,"com.google.Chrome.plist"))||host3.exists(join278(MAC_POLICIES,user,"com.google.Chrome.plist"))}return host3.platform==="win32"?host3.registryKeyExists(WINDOWS_POLICIES):host3.platform==="linux"?host3.list(LINUX_POLICIES).some(name6=>name6.endsWith(".json")):!1}function agentBrowserChrome(host3){let layout=AGENT_BROWSER_LAYOUTS[host3.
26711
- platform];if(!layout)return null;let{join:join278}=paths(host3.platform),browsers=join278(host3.home,".agent-browser","browsers");return host3.list(browsers).filter(name6=>name6.startsWith("chrome-")).sort((a,b11)=>b11.localeCompare(a,void 0,{numeric:!0})).map(version5=>join278(browsers,version5,layout)).find(candidate=>host3.exists(candidate))??null}var LINUX_ENGINE_BROWSERS=["google-chrome","google-chrome-stable","google-chrome-unstable","chromium","chromium-browser","brave-browser","brave-bro\
26712
- wser-stable"],LINUX_CACHE_EXECUTABLES=["chrome-linux64/chrome","chrome-linux/chrome"];function engineFindsLinuxBrowser(host3){let{join:join278}=posix8;if((host3.enginePath?.()??host3.env.PATH??"").split(":").filter(Boolean).some(directory=>LINUX_ENGINE_BROWSERS.some(name6=>host3.exists(join278(directory,name6)))))return!0;let cached4=(directory,prefix)=>host3.list(directory).some(name6=>name6.startsWith(prefix)&&LINUX_CACHE_EXECUTABLES.some(executable=>host3.exists(join278(directory,name6,executable))));
26713
- return cached4(join278(host3.env.PUPPETEER_CACHE_DIR||join278(host3.home,".cache","puppeteer"),"chrome"),"linux")||cached4(host3.env.PLAYWRIGHT_BROWSERS_PATH||join278(host3.home,".cache","ms-playwright"),"chromium-")}function resolveChromePlan(host3,engine,options2={}){let{env,platform:platform2}=host3;if(env.OMB_BROWSER_LEGACY_SHELL?.trim()==="1")return{kind:"legacy",reason:"OMB_BROWSER_LEGACY_SHELL=1"};let named4=env.OMB_CHROME_PATH?.trim()||env.AGENT_BROWSER_EXECUTABLE_PATH?.trim();if(named4)
26708
+ "win32"?win329:posix8;function isHeadlessShell(path6){return/chrome-headless-shell/iu.test(path6)}function installedGoogleChrome(host3){let{join:join279}=paths(host3.platform),candidates=[];if(host3.platform==="darwin"){let registered2=host3.appForBundleId("com.google.Chrome");registered2&&candidates.push(join279(registered2,MAC_CHROME_BINARY)),candidates.push(join279("/Applications/Google Chrome.app",MAC_CHROME_BINARY),join279(host3.home,"Applications/Google Chrome.app",MAC_CHROME_BINARY))}else if(host3.
26709
+ platform==="win32"){for(let hive of["HKLM","HKCU"]){let registered2=host3.registryValue(`${hive}\\${WINDOWS_APP_PATHS}`);registered2&&candidates.push(registered2.replace(/^"|"$/gu,""))}for(let root3 of[host3.env.ProgramFiles,host3.env["ProgramFiles(x86)"],host3.env.LOCALAPPDATA])root3&&candidates.push(join279(root3,"Google","Chrome","Application","chrome.exe"))}else host3.platform==="linux"&&candidates.push(LINUX_CHROME);return candidates.find(candidate=>host3.exists(candidate))??null}function chromePolicyManaged(host3){
26710
+ let{basename:basename38,join:join279}=paths(host3.platform);if(host3.platform==="darwin"){let user=host3.env.USER||basename38(host3.home);return host3.exists(join279(MAC_POLICIES,"com.google.Chrome.plist"))||host3.exists(join279(MAC_POLICIES,user,"com.google.Chrome.plist"))}return host3.platform==="win32"?host3.registryKeyExists(WINDOWS_POLICIES):host3.platform==="linux"?host3.list(LINUX_POLICIES).some(name6=>name6.endsWith(".json")):!1}function agentBrowserChrome(host3){let layout=AGENT_BROWSER_LAYOUTS[host3.
26711
+ platform];if(!layout)return null;let{join:join279}=paths(host3.platform),browsers=join279(host3.home,".agent-browser","browsers");return host3.list(browsers).filter(name6=>name6.startsWith("chrome-")).sort((a,b11)=>b11.localeCompare(a,void 0,{numeric:!0})).map(version5=>join279(browsers,version5,layout)).find(candidate=>host3.exists(candidate))??null}var LINUX_ENGINE_BROWSERS=["google-chrome","google-chrome-stable","google-chrome-unstable","chromium","chromium-browser","brave-browser","brave-bro\
26712
+ wser-stable"],LINUX_CACHE_EXECUTABLES=["chrome-linux64/chrome","chrome-linux/chrome"];function engineFindsLinuxBrowser(host3){let{join:join279}=posix8;if((host3.enginePath?.()??host3.env.PATH??"").split(":").filter(Boolean).some(directory=>LINUX_ENGINE_BROWSERS.some(name6=>host3.exists(join279(directory,name6)))))return!0;let cached4=(directory,prefix)=>host3.list(directory).some(name6=>name6.startsWith(prefix)&&LINUX_CACHE_EXECUTABLES.some(executable=>host3.exists(join279(directory,name6,executable))));
26713
+ return cached4(join279(host3.env.PUPPETEER_CACHE_DIR||join279(host3.home,".cache","puppeteer"),"chrome"),"linux")||cached4(host3.env.PLAYWRIGHT_BROWSERS_PATH||join279(host3.home,".cache","ms-playwright"),"chromium-")}function resolveChromePlan(host3,engine,options2={}){let{env,platform:platform2}=host3;if(env.OMB_BROWSER_LEGACY_SHELL?.trim()==="1")return{kind:"legacy",reason:"OMB_BROWSER_LEGACY_SHELL=1"};let named4=env.OMB_CHROME_PATH?.trim()||env.AGENT_BROWSER_EXECUTABLE_PATH?.trim();if(named4)
26714
26714
  return isHeadlessShell(named4)?{kind:"legacy",reason:"the named browser is a headless shell"}:host3.exists(named4)?{kind:"chrome",chrome:{path:paths(platform2).isAbsolute(named4)?named4:resolve48(named4),source:"named"},fallback:null}:{kind:"legacy",reason:`${named4} does not exist`};if(!engine?.managed)return{kind:"legacy",reason:"agent-browser was named, so it picks its own browser"};let pin=platform2==="linux"&&env.OMB_RESOURCES_PATH?null:chromeForTestingPin(platform2,host3.arch),installed2=installedGoogleChrome(
26715
26715
  host3);if(installed2&&!chromePolicyManaged(host3))return{kind:"chrome",chrome:{path:installed2,source:"installed"},fallback:pin};if(platform2==="linux"&&env.OMB_RESOURCES_PATH)return{kind:"legacy",reason:installed2?"Google Chrome here is managed by an organization":"Google Chrome is not installed"};let own4=agentBrowserChrome(host3);if(own4)return{kind:"chrome",chrome:{path:own4,source:"agent-browser"},fallback:null};if(pin){let executable=chromeForTestingExecutable(host3.dataDir,pin);return host3.
26716
26716
  exists(executable)?{kind:"chrome",chrome:{path:executable,source:"downloaded"},fallback:null}:platform2==="linux"&&!options2.downloading&&engineFindsLinuxBrowser(host3)?{kind:"legacy",reason:"agent-browser found a browser on this server"}:{kind:"download",pin}}return{kind:"legacy",reason:installed2?"Google Chrome here is managed by an organization":"no Chrome is installed and none is pinned for this platform"}}function registryQuery(args){let result2=spawnSync3("reg",["query",...args],{encoding:"\
@@ -27007,8 +27007,8 @@ force:!0})}#unused(profile,idleMs){return profile.run!==null&&!profile.starting&
27007
27007
  length<this.#options.maxRunning)return;let candidate=others.filter(other=>other.hub.size===0&&this.#unused(other,0)).sort((a,b11)=>a.lastUsed-b11.lastUsed)[0];if(candidate){await this.#stop(candidate,{kind:"idle",pages:[]});continue}if(Date.now()>=until)throw new Error(`${others.length} browsers are already open on this computer, the most it runs at once. Wait for another bot to finish with its browser, then try again.`);await new Promise(resolve56=>setTimeout(resolve56,500))}}runs(session){let profile=this.#bySession(
27008
27008
  session);return!!(profile&&(profile.run||profile.starting))}async closeUnused(session){let profile=this.#bySession(session);return!profile||!this.#unused(profile,0)?!1:(await this.#stop(profile,{kind:"idle",pages:[]}),!0)}async closeIdle(idleMs=this.#options.idleMs()){let closed=[];for(let profile of this.profiles())!(idleMs>0)||!this.#unused(profile,idleMs)||(await this.#stop(profile,{kind:"idle",pages:[]}),closed.push(profile.key));return closed}async close(session){let profile=this.#bySession(
27009
27009
  session);this.#holds.drop(session),profile&&await this.#stop(profile,null)}async erase(key7){let profile=this.#profiles.get(key7);profile?(await this.#stop(profile,null,{erase:!0}),this.#holds.drop(profile.session)):this.#eraseFiles(key7)}async closeAll(){await Promise.all(this.profiles().map(profile=>this.#stop(profile,null)))}async agentRpc(target4,method2,params2,beforeDispatch){if(method2==="tools/list")return{tools:TOOL_LIST.map(tool5=>({...tool5}))};if(method2!=="tools/call")throw new Error(
27010
- "Unsupported browser method.");let profile=this.profile(target4);for(let stopping2=profile.stopping;stopping2;stopping2=profile.stopping)await stopping2;profile.calls++;let name6=toolNameOf2(params2)??"browser",deadline=Date.now()+this.#options.callBudgetMs,started2=performance.now(),result2;try{let work=()=>this.#call(profile,params2,deadline,beforeDispatch),call2=name6===RESTART_TOOL||profile.control.uncertain?work():this.#lanes.run(profile.key,work,this.#options.laneWaitMs);result2=await this.#withinBudget(
27011
- profile,name6,call2,deadline)}finally{profile.calls--,profile.lastUsed=Date.now()}let final=result2??errorResult(LANE_BUSY2);if(this.#options.onTiming?.({session:profile.session,tool:name6,outcome:final.isError?"error":"ok",totalMs:performance.now()-started2,inFlight:profile.control.agents,chars:final.content.reduce((sum3,part2)=>sum3+(part2.type==="text"?part2.text.length:0),0)}),profile.reopened&&profile.run){let note2=reopenedNote(profile.reopened,profile.temporary);return profile.reopened=null,
27010
+ "Unsupported browser method.");let profile=this.profile(target4);for(let stopping2=profile.stopping;stopping2;stopping2=profile.stopping)await stopping2;profile.calls++;let name6=toolNameOf2(params2)??"browser",deadline=Date.now()+this.#options.callBudgetMs,started3=performance.now(),result2;try{let work=()=>this.#call(profile,params2,deadline,beforeDispatch),call2=name6===RESTART_TOOL||profile.control.uncertain?work():this.#lanes.run(profile.key,work,this.#options.laneWaitMs);result2=await this.#withinBudget(
27011
+ profile,name6,call2,deadline)}finally{profile.calls--,profile.lastUsed=Date.now()}let final=result2??errorResult(LANE_BUSY2);if(this.#options.onTiming?.({session:profile.session,tool:name6,outcome:final.isError?"error":"ok",totalMs:performance.now()-started3,inFlight:profile.control.agents,chars:final.content.reduce((sum3,part2)=>sum3+(part2.type==="text"?part2.text.length:0),0)}),profile.reopened&&profile.run){let note2=reopenedNote(profile.reopened,profile.temporary);return profile.reopened=null,
27012
27012
  scrubBrowserResult({...final,content:[{type:"text",text:note2},...final.content]},this.#scrub)}return scrubBrowserResult(final,this.#scrub)}async#withinBudget(profile,call2,work,deadline){let timer4,late=new Promise(resolve56=>{timer4=setTimeout(()=>resolve56("late"),Math.max(0,deadline-Date.now())),timer4.unref?.()}),outcome;try{outcome=await Promise.race([work,late])}finally{clearTimeout(timer4)}return outcome!=="late"?outcome:(work.catch(()=>{}),profile.control.latch(call2),profile.control.lostCall===
27013
27013
  null?errorResult(BROWSER_STUCK):lostCallResult(call2))}async#call(profile,params2,deadline,beforeDispatch){let name6=toolNameOf2(params2),control=profile.control;if(name6===RESTART_TOOL)return beforeDispatch?.(),await this.#agentRestart(profile),textResult("Browser restarted. Open pages were closed back to one blank tab; sign-ins are kept. Open the page you need again and check whether the interrupted action already happened before repeating it.");if(control.uncertain){if(control.owner!==null)throw new Error(
27014
27014
  BROWSER_CONTROL_REFUSAL);let lost=control.lostCall;if(lost===null)return errorResult(BROWSER_STUCK);beforeDispatch?.();let url2=await this.#probe(profile);return url2===null?stillBusyResult(lost):recoveredResult2(lost,url2)}let parsed2=parseToolCall(name6,params2?.arguments);if(!parsed2.ok)return errorResult(parsed2.error);let run11;try{run11=await this.running(profile)}catch(error66){return errorResult(`The browser could not start: ${error66 instanceof Error?error66.message:String(error66)}`)}if(beforeDispatch?.(),
@@ -27642,9 +27642,9 @@ appendMessage(threadId,{role:"bot",kind:"text",text:text30});return deps.store.p
27642
27642
  store.patchMessage(greeting.threadId,greeting.messageId,{text:text30})}async function offer(){if(!state||state.offeredAt||busy)return;let place2=home2();if(!(!place2||!deps.apps.reachable(place2.bot)||deps.threadBusy(place2.bot.id,place2.threadId))){busy=!0;try{let connected=await deps.apps.connected().catch(()=>null);if(!state||state.offeredAt||deps.threadBusy(place2.bot.id,place2.threadId))return;let missing2=LOOK_APPS.filter(app=>connected?.[app]!==!0),there=LOOK_APPS.filter(app=>connected?.[app]===
27643
27643
  !0);if(!missing2.length){mark2({offeredAt:now2()}),appsIn(there,!0);return}let cards=await Promise.all(missing2.map(async slug3=>({slug:slug3,...await deps.apps.card(slug3).catch(()=>({label:APP_NAME[slug3],description:""}))})));if(!state||state.offeredAt||deps.threadBusy(place2.bot.id,place2.threadId))return;let key7=`${FIRST_HOUR_OFFER_KEY}${randomUUID68()}`;say2(place2.bot,place2.threadId,words6().connect);for(let card of cards)deps.store.appendMessage(place2.threadId,{role:"bot",kind:"connec\
27644
27644
  tor",text:connectorCardText(card.label,void 0,deps.language()),connector:{slug:card.slug,label:card.label,description:card.description||connectorCardText(card.label,void 0,deps.language()),status:"required",resumeKey:key7}});mark2({offeredAt:now2(),offerKey:key7}),there.length&&appsIn(there,!0)}finally{busy=!1}}}function appsIn(apps2,ours){if(!state||!apps2.length)return;let known=new Set([...state.apps??[],...apps2]);if(mark2({firstAppAt:state.firstAppAt??now2(),apps:LOOK_APPS.filter(app=>known.
27645
- has(app))}),!(state.lookStartedAt||state.lookSkipped)){if(!ours){mark2({lookSkipped:"own-task"});return}startLook()}}async function startLook(){if(!state||state.lookStartedAt||state.lookSkipped||look2)return;let place2=home2();if(!place2)return;if(deps.threadBusy(place2.bot.id,place2.threadId)){now2()-(state.firstAppAt??now2())>LOOK_WAIT_MS&&mark2({lookSkipped:"failed"});return}let started2=now2();look2={threadId:place2.threadId,drafts:0,until:started2+LOOK_MAX_MS},mark2({lookStartedAt:started2});
27646
- let prompt=lookPrompt({apps:state.apps??[],...firstName(deps.person())?{name:firstName(deps.person())}:{},language:deps.language()});try{await deps.startTurn(place2.bot.id,prompt,{threadId:place2.threadId,cardContinuation:!0,onSettled:outcome=>lookSettled(place2.bot,place2.threadId,started2,outcome.ok)})}catch(error66){look2=null;let code=error66?.code;code==="thread_busy"||code==="thread_limit"?mark2({lookStartedAt:void 0}):(console.warn(`first hour: the first look could not start: ${error66 instanceof
27647
- Error?error66.message:String(error66)}`),lookSettled(place2.bot,place2.threadId,started2,!1))}}function lookSettled(bot,threadId,started2,ok2){if(look2=null,!state||state.firstLookAt||state.lookSkipped)return;ok2&&deps.store.activePath(threadId).some(message8=>message8.role==="bot"&&message8.kind==="text"&&message8.at>=started2&&!!message8.text?.trim())?(mark2({firstLookAt:now2()}),deps.notify(bot,threadId,words6().firstLookReady)):(mark2({lookSkipped:"failed"}),deps.threadBusy(bot.id,threadId)||
27645
+ has(app))}),!(state.lookStartedAt||state.lookSkipped)){if(!ours){mark2({lookSkipped:"own-task"});return}startLook()}}async function startLook(){if(!state||state.lookStartedAt||state.lookSkipped||look2)return;let place2=home2();if(!place2)return;if(deps.threadBusy(place2.bot.id,place2.threadId)){now2()-(state.firstAppAt??now2())>LOOK_WAIT_MS&&mark2({lookSkipped:"failed"});return}let started3=now2();look2={threadId:place2.threadId,drafts:0,until:started3+LOOK_MAX_MS},mark2({lookStartedAt:started3});
27646
+ let prompt=lookPrompt({apps:state.apps??[],...firstName(deps.person())?{name:firstName(deps.person())}:{},language:deps.language()});try{await deps.startTurn(place2.bot.id,prompt,{threadId:place2.threadId,cardContinuation:!0,onSettled:outcome=>lookSettled(place2.bot,place2.threadId,started3,outcome.ok)})}catch(error66){look2=null;let code=error66?.code;code==="thread_busy"||code==="thread_limit"?mark2({lookStartedAt:void 0}):(console.warn(`first hour: the first look could not start: ${error66 instanceof
27647
+ Error?error66.message:String(error66)}`),lookSettled(place2.bot,place2.threadId,started3,!1))}}function lookSettled(bot,threadId,started3,ok2){if(look2=null,!state||state.firstLookAt||state.lookSkipped)return;ok2&&deps.store.activePath(threadId).some(message8=>message8.role==="bot"&&message8.kind==="text"&&message8.at>=started3&&!!message8.text?.trim())?(mark2({firstLookAt:now2()}),deps.notify(bot,threadId,words6().firstLookReady)):(mark2({lookSkipped:"failed"}),deps.threadBusy(bot.id,threadId)||
27648
27648
  say2(bot,threadId,words6().connected)),soon(afterLook)}async function afterLook(){if(!state)return;let place2=home2();if(!place2||deps.threadBusy(place2.bot.id,place2.threadId))return;let looked=!!(state.firstLookAt||state.lookSkipped);looked&&!state.briefOnAt&&state.apps?.length&&!deps.briefOn()&&deps.ensureBrief(),looked&&!state.briefOnAt&&state.apps?.length&&deps.briefOn()&&(say2(place2.bot,place2.threadId,words6().briefOn),mark2({briefOnAt:now2()})),(looked||state.declinedAt)&&!state.phoneOfferedAt&&
27649
27649
  (deps.phones()>0?mark2({phoneOfferedAt:now2(),phonePairedAt:state.phonePairedAt??now2()}):offerPhone(place2.bot,place2.threadId)&&mark2({phoneOfferedAt:now2()}))}function offerPhone(bot,threadId){let w4=words6(),widget={type:"Card",id:"root",title:w4.phoneTitle,children:[{type:"Text",value:w4.phoneBody},{type:"Row",gap:2,children:[{type:"Button",label:w4.phoneButton,style:"primary",iconStart:"phone",onClickAction:{type:"open_phone_pairing"}}]}]},posted=createAgentCard({store:deps.store,bot,threadId,
27650
27650
  input:{tool:"show_widget",widget},serverCard:!0});return posted.ok?(deps.store.patchTask(bot.id,threadId,{unread:!0}),deps.wrote(bot,threadId),!0):(console.warn(`first hour: the phone card was refused: ${posted.error}`),!1)}function phonePaired(){if(!state||state.phonePairedAt)return;mark2({phonePairedAt:now2()});let place2=home2();!place2||!state.firstLookAt||state.firstPushAt||(deps.notify(place2.bot,place2.threadId,words6().firstLookReady),mark2({firstPushAt:now2()}))}function tally(){let since=state?.
@@ -28979,8 +28979,8 @@ ate the library index: ${error66 instanceof Error?error66.message:String(error66
28979
28979
  data)}let adding={};for(let[installId,raw]of Object.entries(parsed2.data.adding??{})){let add11=addingSchema.safeParse(raw);add11.success&&(adding[installId]=add11.data)}let origin2=parsed2.data.source?adminOrigin(parsed2.data.source.adminOrigin):null;return{version:1,source:parsed2.data.source&&origin2?{adminOrigin:origin2,organizationId:parsed2.data.source.organizationId}:null,appliedDigest:parsed2.data.appliedDigest,installs:installs3,adding}}catch{return console.warn("[org-library] state.jso\
28980
28980
  n could not be read; rebuilding it from your bots, rooms and routines"),emptyState()}}save(){mkdirSync112(this.root,{recursive:!0,mode:448}),writeFileAtomic(this.statePath(),`${JSON.stringify(this.state,null,2)}
28981
28981
  `,{mode:384})}blobPath(sha2567){return join233(this.root,"blobs",`${sha2567}.json`)}readBlob(sha2567){if(!HEX64.test(sha2567))return null;let descriptor=null;try{let path6=this.blobPath(sha2567),before=lstatSync40(path6);if(!before.isFile()||before.size>PACKAGE_MAX_BYTES)return null;descriptor=openSync31(path6,constants20.O_RDONLY|(process.platform==="win32"?0:constants20.O_NOFOLLOW??0));let opened=fstatSync17(descriptor);if(!opened.isFile()||opened.size>PACKAGE_MAX_BYTES||opened.ino!==before.ino)
28982
- return null;let bytes4=readFileSync170(descriptor);return sha256Hex5(bytes4)===sha2567?bytes4:null}catch{return null}finally{if(descriptor!==null)try{closeSync34(descriptor)}catch{}}}blobStatus(entry2){if(!entry2.release)return"unavailable";if(entry2.release.formatVersion>PACKAGE_VERSION)return"unsupported";let sha=entry2.release.sha256,key7;try{let stat16=lstatSync40(this.blobPath(sha));if(!stat16.isFile())return"unavailable";key7=`${stat16.size}:${stat16.mtimeMs}:${stat16.ino}`}catch{return"un\
28983
- available"}return this.verified.get(sha)===key7?"ready":this.readBlob(sha)?(this.verified.set(sha,key7),"ready"):"unavailable"}releaseDocument(entry2){if(!entry2.release)return refusal5(404,"no_release","This package has no release to add right now.");if(entry2.release.formatVersion>PACKAGE_VERSION)return refusal5(409,"newer_app_required",NEWER_APP);let bytes4=this.readBlob(entry2.release.sha256);if(!bytes4)return refusal5(503,"blob_unavailable",NOT_READY);let document4;try{document4=parsePackageDocument(
28982
+ return null;let bytes4=readFileSync170(descriptor);return sha256Hex5(bytes4)===sha2567?bytes4:null}catch{return null}finally{if(descriptor!==null)try{closeSync34(descriptor)}catch{}}}blobStatus(entry2){if(!entry2.release)return"unavailable";if(entry2.release.formatVersion>PACKAGE_VERSION)return"unsupported";let sha2=entry2.release.sha256,key7;try{let stat16=lstatSync40(this.blobPath(sha2));if(!stat16.isFile())return"unavailable";key7=`${stat16.size}:${stat16.mtimeMs}:${stat16.ino}`}catch{return"\
28983
+ unavailable"}return this.verified.get(sha2)===key7?"ready":this.readBlob(sha2)?(this.verified.set(sha2,key7),"ready"):"unavailable"}releaseDocument(entry2){if(!entry2.release)return refusal5(404,"no_release","This package has no release to add right now.");if(entry2.release.formatVersion>PACKAGE_VERSION)return refusal5(409,"newer_app_required",NEWER_APP);let bytes4=this.readBlob(entry2.release.sha256);if(!bytes4)return refusal5(503,"blob_unavailable",NOT_READY);let document4;try{document4=parsePackageDocument(
28984
28984
  JSON.parse(bytes4.toString("utf8")),{trust:"org"})}catch(error66){return error66 instanceof PackageFormatError&&error66.code==="newer_version"?refusal5(409,"newer_app_required",NEWER_APP):refusal5(422,"invalid_package",`This package could not be read: ${error66 instanceof Error?error66.message:"it is not a valid package"}`)}let[publisherSlug,packageSlug]=entry2.ref.split("/");return document4.package.id!==packageSlug||document4.package.publisher?.organization!==publisherSlug?refusal5(422,"invali\
28985
28985
  d_package","This package is not the one your organization listed."):{ok:!0,status:200,value:document4}}visibleEntry(packageId){let entry2=this.library?.catalog.packages.find(candidate=>candidate.packageId===packageId);return entry2&&entry2.mode!=="off"?entry2:null}listEntry(entry2){let installId=this.currentInstallId(entry2.packageId),install2=this.state.installs[installId];return{...structuredClone(entry2),blob:this.blobStatus(entry2),installed:install2?{installId,release:install2.release,status:install2.
28986
28986
  status}:null}}list(){return this.library?{organization:{...this.library.catalog.organization},packages:this.library.catalog.packages.filter(entry2=>entry2.mode!=="off").map(entry2=>this.listEntry(entry2)),installs:Object.entries(this.state.installs).filter(([installId,install2])=>this.currentInstallId(install2.packageId)===installId).map(([installId,install2])=>({installId,packageId:install2.packageId,name:install2.name,release:install2.release,status:install2.status,publisher:install2.publisher.
@@ -29000,13 +29000,13 @@ let counts=new Map;for(let value3 of values4)counts.set(value3,(counts.get(value
29000
29000
  return status5;if(lastFailure&&now2()-lastFailure.at<FAILED_START_BACKOFF_MS)return{...status5,problem:lastFailure.problem};starting2??=startMachine(runner,onStart).finally(()=>{starting2=null});try{if(!await starting2)return status5}catch(error66){return lastFailure={at:now2(),problem:error66.message},{...status5,problem:lastFailure.problem}}let fresh=await recheck();for(let tries=1;tries<RECHECK_TRIES&&!fresh.daemonUp;tries++)await pause(1e3),fresh=await recheck();return fresh.daemonUp||fresh.
29001
29001
  runtime!=="podman"?fresh:{...fresh,problem:NOT_ANSWERING_YET}}async function startMachine(runner,onStart){let machines;try{let parsed2=JSON.parse((await runner("podman",["machine","list","--format","json"],1e4)).stdout);machines=Array.isArray(parsed2)?parsed2:[]}catch{return!1}if(machines.some(machine2=>machine2.Running===!0||machine2.Starting===!0))return!1;let machine=machines.find(entry2=>entry2.Default===!0)??(machines.length===1?machines[0]:void 0);if(typeof machine?.Name!="string"||!machine.
29002
29002
  Name)return!1;onStart();try{await runner("podman",["machine","start",machine.Name],MACHINE_START_TIMEOUT_MS)}catch(error66){let detail=String(error66.stderr??"").trim().split(`
29003
- `).at(-1)?.trim();throw new Error(`The Podman machine "${machine.Name}" did not start${detail?` (${detail})`:""}; run podman machine start`,{cause:error66})}return lastFailure=null,!0}var TURN_ENDED_REFUSAL="This bot turn has already ended (it finished or was stopped), so this call was refused. Anything the call started before the turn ended may still have run.";async function guardTurnDispatch(started2,cancelled,stopAfterSetup){let value3=await started2;return cancelled()?(await stopAfterSetup(),{value:value3,cancelled:!0}):{value:value3,cancelled:!1}}var RetiredTurnRegistry=class{#turnIds=new Set;#limit;constructor(limit2=4096){this.#limit=limit2}retire(turnId){for(this.#turnIds.add(turnId);this.#turnIds.size>this.#limit;){let oldest=this.#turnIds.values().next().value;if(oldest===void 0)break;this.#turnIds.delete(oldest)}}has(turnId){return turnId!==
29003
+ `).at(-1)?.trim();throw new Error(`The Podman machine "${machine.Name}" did not start${detail?` (${detail})`:""}; run podman machine start`,{cause:error66})}return lastFailure=null,!0}var TURN_ENDED_REFUSAL="This bot turn has already ended (it finished or was stopped), so this call was refused. Anything the call started before the turn ended may still have run.";async function guardTurnDispatch(started3,cancelled,stopAfterSetup){let value3=await started3;return cancelled()?(await stopAfterSetup(),{value:value3,cancelled:!0}):{value:value3,cancelled:!1}}var RetiredTurnRegistry=class{#turnIds=new Set;#limit;constructor(limit2=4096){this.#limit=limit2}retire(turnId){for(this.#turnIds.add(turnId);this.#turnIds.size>this.#limit;){let oldest=this.#turnIds.values().next().value;if(oldest===void 0)break;this.#turnIds.delete(oldest)}}has(turnId){return turnId!==
29004
29004
  void 0&&this.#turnIds.has(turnId)}},ProviderTurnGenerationRegistry=class{#owners=new Map;#completed;#earlyCompletions=new Map;#limit;constructor(limit2=4096){this.#completed=new RetiredTurnRegistry(limit2),this.#limit=limit2}bind(threadId,generation,turnId){return this.#completed.has(turnId)?!1:(this.#owners.set(turnId,{threadId,generation}),!0)}complete(threadId,turnId,outcome){if(this.#completed.has(turnId))return null;let owner2=this.#owners.get(turnId);if(owner2&&owner2.threadId!==threadId)return null;
29005
29005
  if(this.#completed.retire(turnId),!owner2){if(outcome!==void 0)for(this.#earlyCompletions.set(turnId,{threadId,outcome});this.#earlyCompletions.size>this.#limit;)this.#earlyCompletions.delete(this.#earlyCompletions.keys().next().value);return null}return this.#owners.delete(turnId),owner2}takeEarlyCompletion(threadId,turnId){let receipt=this.#earlyCompletions.get(turnId);if(receipt?.threadId===threadId)return this.#earlyCompletions.delete(turnId),receipt.outcome}deleteGeneration(threadId,generation){
29006
29006
  let removed=[];for(let[turnId,owner2]of this.#owners)owner2.threadId===threadId&&owner2.generation===generation&&(this.#owners.delete(turnId),this.#completed.retire(turnId),removed.push(turnId));return removed}clear(){this.#owners.clear(),this.#earlyCompletions.clear()}},PendingTurnCancellations=class{#ownersByThread=new Map;#clearWaitersByThread=new Map;#ttlMs;constructor(ttlMs=3e4){this.#ttlMs=Math.max(1,Math.floor(ttlMs))}mark(threadId,ownerId){let owners=this.#ownersByThread.get(threadId)??new Map,
29007
29007
  previous2=owners.get(ownerId);previous2&&clearTimeout(previous2);let expiry=setTimeout(()=>{this.#ownersByThread.get(threadId)?.get(ownerId)===expiry&&this.clear(threadId,ownerId)},this.#ttlMs);expiry.unref?.(),owners.set(ownerId,expiry),this.#ownersByThread.set(threadId,owners)}clear(threadId,ownerId){let owners=this.#ownersByThread.get(threadId),expiry=owners?.get(ownerId);if(expiry&&clearTimeout(expiry),owners?.delete(ownerId),owners?.size!==0)return;this.#ownersByThread.delete(threadId);let waiters=this.#clearWaitersByThread.
29008
29008
  get(threadId);this.#clearWaitersByThread.delete(threadId);for(let resolve56 of waiters??[])resolve56()}async waitForClear(threadId){for(;this.has(threadId);)await new Promise(resolve56=>{let waiters=this.#clearWaitersByThread.get(threadId)??new Set;waiters.add(resolve56),this.#clearWaitersByThread.set(threadId,waiters),this.has(threadId)||(waiters.delete(resolve56),waiters.size===0&&this.#clearWaitersByThread.delete(threadId),resolve56())})}has(threadId){return this.#ownersByThread.has(threadId)}};
29009
- function isTurnEventQuarantined(pending3,retired,event2){return retired.has(event2.turnId)?!0:pending3.has(event2.threadId)?(event2.turnId&&retired.retire(event2.turnId),!0):!1}function createGracefulShutdown({cleanup,exit:exit2,timeoutMs:timeoutMs2=6e3}){let started2=!1;return()=>{if(started2)return;started2=!0;let timer4,deadline=new Promise(resolve56=>{timer4=setTimeout(resolve56,timeoutMs2),timer4.unref?.()}),settled2=Promise.allSettled(cleanup.map(job=>Promise.resolve().then(job))).then(()=>{});Promise.race([settled2,deadline]).finally(()=>{timer4&&clearTimeout(timer4),exit2(0)})}}import{execFileSync}from"node:child_process";import{createHash as createHash106,randomUUID as randomUUID76}from"node:crypto";import{existsSync as existsSync90,linkSync as linkSync6,mkdirSync as mkdirSync113,readdirSync as readdirSync51,readFileSync as readFileSync171,readlinkSync as readlinkSync12,renameSync as renameSync32,unlinkSync as unlinkSync25,writeFileSync as writeFileSync45}from"node:fs";import{hostname as hostname7,uptime as uptime2}from"node:os";import{join as join234}from"node:path";
29009
+ function isTurnEventQuarantined(pending3,retired,event2){return retired.has(event2.turnId)?!0:pending3.has(event2.threadId)?(event2.turnId&&retired.retire(event2.turnId),!0):!1}function createGracefulShutdown({cleanup,exit:exit2,timeoutMs:timeoutMs2=6e3}){let started3=!1;return()=>{if(started3)return;started3=!0;let timer4,deadline=new Promise(resolve56=>{timer4=setTimeout(resolve56,timeoutMs2),timer4.unref?.()}),settled2=Promise.allSettled(cleanup.map(job=>Promise.resolve().then(job))).then(()=>{});Promise.race([settled2,deadline]).finally(()=>{timer4&&clearTimeout(timer4),exit2(0)})}}import{execFileSync}from"node:child_process";import{createHash as createHash106,randomUUID as randomUUID76}from"node:crypto";import{existsSync as existsSync90,linkSync as linkSync6,mkdirSync as mkdirSync113,readdirSync as readdirSync51,readFileSync as readFileSync171,readlinkSync as readlinkSync12,renameSync as renameSync32,unlinkSync as unlinkSync25,writeFileSync as writeFileSync45}from"node:fs";import{hostname as hostname7,uptime as uptime2}from"node:os";import{join as join234}from"node:path";
29010
29010
  var LEASE_NAME="openmausbot-server.lease",DELEGATED_CHILD_DIR=".limixbot-server-child",CHILD_LEASE_ENV="OPENMAUSBOT_INTERNAL_DATA_DIR_LEASE",UUID6=/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/,MAX_PID=2147483647,MAX_BOOT_ID=128,MAX_REAPER_GENERATIONS3=128,DataDirLeaseError=class extends Error{name="DataDirLeaseError"};function leaseError(message8,cause){return Object.assign(new DataDirLeaseError(message8),{cause})}function isPid(value3){return Number.isInteger(value3)&&
29011
29011
  value3>0&&value3<=MAX_PID}var cachedBootSession;function readBootSession(){try{if(process.platform==="linux")return normalizeBootId(readFileSync171("/proc/sys/kernel/random/boot_id","utf8"));if(process.platform==="darwin")return normalizeBootId(execFileSync("/usr/sbin/sysctl",["-n","kern.bootsessionuuid"],{encoding:"utf8",timeout:5e3,stdio:["ignore","pipe","ignore"]}))}catch{}return null}function normalizeBootId(value3){let id12=String(value3).trim();return id12.length>0&&id12.length<=MAX_BOOT_ID&&
29012
29012
  !/[^0-9A-Za-z:_.-]/.test(id12)?id12:null}function bootSession(){return cachedBootSession===void 0&&(cachedBootSession=readBootSession()),cachedBootSession}function uptimeMs(){let seconds3=uptime2();return Number.isFinite(seconds3)&&seconds3>=0?Math.floor(seconds3*1e3):0}function isBootIdentity(value3){return value3===null||typeof value3=="string"&&normalizeBootId(value3)===value3}var cachedPidNamespace;function readPidNamespace(){if(process.platform!=="linux")return null;try{return/^pid:\[([1-9][0-9]{0,19})\]$/.
@@ -29020,8 +29020,8 @@ return parseRecord(path6,"The Limix Bot data-directory lease is invalid; refusin
29020
29020
  Limix Bot could not verify the data-directory lease owner; refusing to start.",error66)}}function parseWmiDateTime(value3){let raw=String(value3).trim(),match5=/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})\.(\d{6})([+-]\d{3})$/.exec(raw);if(!match5)return null;let[_3,year,month,day2,hour,minute,second2,micro2,offset4]=match5,ms2=Date.UTC(Number(year),Number(month)-1,Number(day2),Number(hour),Number(minute),Number(second2),Math.floor(Number(micro2)/1e3)),offsetMinutes=Number(offset4);return ms2-offsetMinutes*
29021
29021
  60*1e3}function processCreationTimeMs(pid){return process.platform!=="win32"?null:wmicCreationTimeMs(pid)??cimCreationTimeMs(pid)}function windowsOutput(file3,args,timeout3){return execFileSync(file3,args,{encoding:"utf8",timeout:timeout3,windowsHide:!0,stdio:["ignore","pipe","ignore"]})}function wmicCreationTimeMs(pid){try{let output4=windowsOutput("wmic",["process","where",`ProcessId=${pid}`,"get","CreationDate","/format:csv"],5e3);for(let line6 of output4.split(/\r?\n/)){let trimmed=line6.trim();
29022
29022
  if(!trimmed)continue;let lower=trimmed.toLowerCase();if(lower==="node,creationdate"||lower.startsWith("node,"))continue;let parts3=trimmed.split(","),raw=parts3[parts3.length-1].trim(),parsed2=parseWmiDateTime(raw);if(parsed2!==null)return parsed2}}catch{}return null}function cimCreationTimeMs(pid){let powershell=join234(process.env.SystemRoot||"C:\\Windows","System32","WindowsPowerShell","v1.0","powershell.exe");try{let output4=windowsOutput(powershell,["-NoLogo","-NoProfile","-NonInteractive",
29023
- "-Command",`$p = Get-CimInstance Win32_Process -Filter 'ProcessId=${pid}'; if ($p) { ([DateTimeOffset]$p.CreationDate).ToUnixTimeMilliseconds() }`],15e3),ms2=Number(output4.trim());return output4.trim()&&Number.isSafeInteger(ms2)&&ms2>0?ms2:null}catch{return null}}function ownerIdentityMatches(owner2){if(process.platform==="linux"){if(!Number.isSafeInteger(owner2.start)||typeof owner2.ns!="string"||owner2.ns!==pidNamespace())return!0;let started2=processStartTicks(owner2.pid);return started2===null||
29024
- started2===owner2.start}if(process.platform!=="win32")return!0;let created=processCreationTimeMs(owner2.pid);return created===null?!0:created<owner2.createdAt}function unlinkExact(path6,message8){try{unlinkSync25(path6)}catch(error66){if(error66?.code!=="ENOENT")throw leaseError(message8,error66)}}function publishRecord(path6,record31,prepareMessage,acquireMessage){let candidatePath=`${path6}.candidate-${record31.pid}-${record31.token}`;try{writeFileSync45(candidatePath,`${JSON.stringify(record31)}\
29023
+ "-Command",`$p = Get-CimInstance Win32_Process -Filter 'ProcessId=${pid}'; if ($p) { ([DateTimeOffset]$p.CreationDate).ToUnixTimeMilliseconds() }`],15e3),ms2=Number(output4.trim());return output4.trim()&&Number.isSafeInteger(ms2)&&ms2>0?ms2:null}catch{return null}}function ownerIdentityMatches(owner2){if(process.platform==="linux"){if(!Number.isSafeInteger(owner2.start)||typeof owner2.ns!="string"||owner2.ns!==pidNamespace())return!0;let started3=processStartTicks(owner2.pid);return started3===null||
29024
+ started3===owner2.start}if(process.platform!=="win32")return!0;let created=processCreationTimeMs(owner2.pid);return created===null?!0:created<owner2.createdAt}function unlinkExact(path6,message8){try{unlinkSync25(path6)}catch(error66){if(error66?.code!=="ENOENT")throw leaseError(message8,error66)}}function publishRecord(path6,record31,prepareMessage,acquireMessage){let candidatePath=`${path6}.candidate-${record31.pid}-${record31.token}`;try{writeFileSync45(candidatePath,`${JSON.stringify(record31)}\
29025
29025
 
29026
29026
  `,{flag:"wx",mode:384,flush:!0})}catch(error66){throw leaseError(prepareMessage,error66)}try{try{return linkSync6(candidatePath,path6),!0}catch(error66){if(error66?.code==="EEXIST")return!1;throw leaseError(acquireMessage,error66)}}finally{unlinkExact(candidatePath,"Limix Bot could not remove its lease candidate.")}}function successorReaperPath3(leasePath,targetToken,reaperToken){let digest5=createHash106("sha256").update(reaperToken).digest("hex").slice(0,32);return`${leasePath}.reap-${targetToken}\
29027
29027
  -${digest5}`}function claimReaperAuthority3(leasePath,expected){let reaperPath=`${leasePath}.reap-${expected.token}`;for(let generation=0;generation<MAX_REAPER_GENERATIONS3;generation+=1){let candidate={version:1,pid:process.pid,host:hostname7(),token:randomUUID76(),createdAt:Date.now(),boot:bootSession(),uptime:uptimeMs(),...processIdentity(),targetToken:expected.token};if(publishRecord(reaperPath,candidate,"Limix Bot could not prepare stale-lease recovery.","Limix Bot could not safely recover \
@@ -29212,15 +29212,15 @@ test(name6)||entries4.some(entry2=>TAILSCALE_V62.test(entry2.address))){tailscal
29212
29212
  isPrivateHost(plain4(remoteAddress))}function listenHost(server2,env=process.env){return env.OMB_LAN!=="1"?"127.0.0.1":(server2.on("connection",socket=>{privateConnection(socket.localAddress,socket.remoteAddress)||socket.destroy()}),"0.0.0.0")}function lanUrl(port,env=process.env,addresses2=reachableAddresses){if(env.OMB_LAN!=="1")return null;let address3=addresses2().lan[0];return address3?`http://${address3}:${port}`:null}import{createServer as createServer14}from"node:http";import{isIP as isIP13}from"node:net";import{networkInterfaces as networkInterfaces5}from"node:os";var FOLLOW_MS=15e3,CLOSE_MS=1e3;function servedOrigin(name6,value3){if(typeof value3!="string")return null;try{let url2=new URL(value3);return url2.protocol==="https:"&&!url2.username&&!url2.password&&url2.pathname==="/"&&!url2.search&&!url2.hash&&url2.hostname===name6?url2.origin:null}catch{return null}}function readTailnetShare(input2,standIn=process.env.OMB_TEST_TAILNET_STAND_IN){if(!input2||typeof input2!="object")return null;let raw=input2,name6=typeof raw.name=="string"?raw.name.trim().toLowerCase().
29213
29213
  replace(/\.$/,""):"";if(!isTailnetName(name6))return null;if(raw.served!==void 0){let served=servedOrigin(name6,raw.served);return served?{name:name6,served}:null}if(raw.addresses===void 0||raw.addresses==="interface")return{name:name6,addresses:"interface"};if(!Array.isArray(raw.addresses)||raw.addresses.length===0||raw.addresses.length>8)return null;let addresses2=raw.addresses.map(address3=>bareAddress(String(address3)));return addresses2.every(address3=>isIP13(address3)!==0&&(inTailscaleRange(
29214
29214
  address3)||address3===standIn))?{name:name6,addresses:[...new Set(addresses2)]}:null}function tailnetShareFromEnv(env){if(!env.OMB_TAILNET_NAME)return null;let addresses2=env.OMB_TAILNET_ADDRESSES?.split(",").map(part2=>part2.trim()).filter(Boolean);return readTailnetShare({name:env.OMB_TAILNET_NAME,...env.OMB_TAILNET_SERVED?{served:env.OMB_TAILNET_SERVED}:{},...addresses2?.length?{addresses:addresses2}:{}})}function tailnetPeerAllowed(remoteAddress,bound2){let remote=bareAddress(remoteAddress);
29215
- return!!remote&&(inTailscaleRange(remote)||bound2.includes(remote))}function hostAllowed(host3,allowed3){let value3=(Array.isArray(host3)?host3[0]:host3)?.trim().toLowerCase();return!!value3&&allowed3.has(value3)}function createTailnetShare(options2){let log7=options2.log??(()=>{}),interfaces=options2.interfaces??networkInterfaces5,started2=!1,desired=null,listeners3=new Map,connections=new WeakMap,allowed3=new Set,error66=null,timer4=null,applying=Promise.resolve(),tellParent=null,toldParent="";
29215
+ return!!remote&&(inTailscaleRange(remote)||bound2.includes(remote))}function hostAllowed(host3,allowed3){let value3=(Array.isArray(host3)?host3[0]:host3)?.trim().toLowerCase();return!!value3&&allowed3.has(value3)}function createTailnetShare(options2){let log7=options2.log??(()=>{}),interfaces=options2.interfaces??networkInterfaces5,started3=!1,desired=null,listeners3=new Map,connections=new WeakMap,allowed3=new Set,error66=null,timer4=null,applying=Promise.resolve(),tellParent=null,toldParent="";
29216
29216
  function announce(){let answer2=JSON.stringify(share.state());!tellParent||answer2===toldParent||(toldParent=answer2,tellParent({type:"openmausbot:tailnet-share-state",...share.state()}))}let guarded=async(req,res)=>{if(!hostAllowed(req.headers.host,allowed3)){res.writeHead(421,{"content-type":"application/json","cache-control":"no-store"}),res.end(JSON.stringify({error:"misdirected: this listener answers only this computer's tailnet name"}));return}return options2.handle(req,res)},close2=server2=>{
29217
29217
  for(let socket of connections.get(server2)??[])socket.destroy();return Promise.race([new Promise(resolve56=>server2.close(()=>resolve56())),new Promise(resolve56=>setTimeout(resolve56,CLOSE_MS).unref())])};function open14(address3){let server2=createServer14(IDLE_HTTP_SERVER,guarded);options2.attach(server2,guarded);let held4=new Set;return connections.set(server2,held4),server2.on("connection",socket=>{if(!tailnetPeerAllowed(socket.remoteAddress,[...listeners3.keys()]))return void socket.destroy();
29218
29218
  held4.add(socket),socket.once("close",()=>held4.delete(socket))}),new Promise((resolve56,reject)=>{server2.once("error",reject),server2.listen({port:options2.port,host:address3,ipv6Only:address3.includes(":")},()=>{server2.off("error",reject),server2.on("error",failure11=>log7(`tailnet: ${address3} ${failure11.message}`)),resolve56(server2)})})}async function bind3(config3){let wanted=config3&&"addresses"in config3?config3.addresses==="interface"?tailnetInterfaceAddresses(interfaces()):config3.addresses:
29219
29219
  [];for(let[address3,server2]of listeners3)wanted.includes(address3)||(listeners3.delete(address3),await close2(server2));let failures=[];for(let address3 of wanted)if(!listeners3.has(address3))try{listeners3.set(address3,await open14(address3)),log7(`tailnet: listening on ${address3.includes(":")?`[${address3}]`:address3}:${options2.port} for ${config3.name}`)}catch(failure11){failures.push(`${address3}: ${failure11.code??failure11.message}`)}allowed3=config3?tailnetHosts({name:config3.name,addresses:[
29220
29220
  ...listeners3.keys()],port:options2.port}):new Set,error66=config3&&"addresses"in config3&&listeners3.size===0?failures.length?`could not listen on the tailnet (${failures.join("; ")})`:"Tailscale's interface has no address on this computer":failures.length?`could not listen on ${failures.join("; ")}`:null,error66&&log7(`tailnet: ${error66}`)}function follow(config3){timer4&&clearInterval(timer4),timer4=null,!(!config3||!("addresses"in config3)||config3.addresses!=="interface")&&(timer4=setInterval(
29221
- ()=>{reconcile2().then(announce)},FOLLOW_MS),timer4.unref?.())}let reconcile2=()=>(applying=applying.then(()=>started2?bind3(desired):void 0).catch(failure11=>log7(`tailnet: ${failure11.message}`)),applying),share={apply(config3){return desired=config3,follow(config3),reconcile2()},start(env={}){started2=!0;let fromEnv=desired??tailnetShareFromEnv(env);return(fromEnv?share.apply(fromEnv):reconcile2()).then(announce)},origin(){return desired?"served"in desired?desired.served:listeners3.size?tailnetOrigin(
29221
+ ()=>{reconcile2().then(announce)},FOLLOW_MS),timer4.unref?.())}let reconcile2=()=>(applying=applying.then(()=>started3?bind3(desired):void 0).catch(failure11=>log7(`tailnet: ${failure11.message}`)),applying),share={apply(config3){return desired=config3,follow(config3),reconcile2()},start(env={}){started3=!0;let fromEnv=desired??tailnetShareFromEnv(env);return(fromEnv?share.apply(fromEnv):reconcile2()).then(announce)},origin(){return desired?"served"in desired?desired.served:listeners3.size?tailnetOrigin(
29222
29222
  desired.name,options2.port):null:null},state(){return{origin:share.origin(),listening:[...listeners3.keys()],error:desired&&"served"in desired?null:error66}},receive(message8,reply4){if(!message8||typeof message8!="object"||message8.type!=="openmausbot:tailnet-share")return!1;tellParent=reply4;let config3=readTailnetShare(message8.share);return share.apply(config3).then(()=>{toldParent=JSON.stringify(share.state()),reply4({type:"openmausbot:tailnet-share-state",...share.state()})}),!0},async close(){
29223
- started2=!1,follow(null),await applying;let open15=[...listeners3.values()];listeners3=new Map,allowed3=new Set,await Promise.all(open15.map(close2))}};return share}var failure9=(message8,status5)=>Object.assign(new Error(message8),{status:status5}),ProviderAuthSessions=class{flows=new Map;signedIn;constructor(options2={}){this.signedIn=options2.signedIn??(()=>{})}get active(){return[...this.flows.values()].some(flow3=>flow3.expiresAt>Date.now()&&(flow3.busy||!flow3.revoked))}async start(instance,owner2){if(!instance.startAuthentication)throw failure9("Account setup is unavailable for this provider.",404);let existing=this.flows.get(instance.instanceId);if(existing&&
29223
+ started3=!1,follow(null),await applying;let open15=[...listeners3.values()];listeners3=new Map,allowed3=new Set,await Promise.all(open15.map(close2))}};return share}var failure9=(message8,status5)=>Object.assign(new Error(message8),{status:status5}),ProviderAuthSessions=class{flows=new Map;signedIn;constructor(options2={}){this.signedIn=options2.signedIn??(()=>{})}get active(){return[...this.flows.values()].some(flow3=>flow3.expiresAt>Date.now()&&(flow3.busy||!flow3.revoked))}async start(instance,owner2){if(!instance.startAuthentication)throw failure9("Account setup is unavailable for this provider.",404);let existing=this.flows.get(instance.instanceId);if(existing&&
29224
29224
  (existing.busy||existing.owner!==owner2&&existing.expiresAt>Date.now()))throw failure9("A sign-in is already in progress. Finish or cancel it in the browser that started it, or wait for it to expire.",409);let resuming=existing&&existing.owner===owner2&&existing.expiresAt>Date.now()&&!existing.revoked,flow3=resuming?existing:{instance,owner:owner2,flowId:null,expiresAt:Date.now()+15*6e4,busy:!1,starting:!1,revoked:!1};flow3.busy=!0,flow3.starting=!0,this.flows.set(instance.instanceId,flow3);try{
29225
29225
  let result2=await instance.startAuthentication();if(flow3.revoked||this.flows.get(instance.instanceId)!==flow3)throw await instance.cancelAuthentication?.(),failure9("Sign-in cancelled because the session or provider changed.",409);flow3.flowId=result2.flowId;let expiry=Date.parse(result2.expiresAt??"");return Number.isFinite(expiry)&&(flow3.expiresAt=expiry),result2.phase==="succeeded"&&(this.flows.delete(instance.instanceId),this.signedIn(instance.instanceId)),result2}catch(error66){throw(!resuming||
29226
29226
  flow3.revoked)&&this.flows.get(instance.instanceId)===flow3&&this.flows.delete(instance.instanceId),error66}finally{flow3.busy=!1,flow3.starting=!1}}owned(instanceId,owner2,flowId){let flow3=this.flows.get(instanceId);if(!flowId||!flow3||flow3.revoked||flow3.owner!==owner2||flow3.flowId!==flowId)throw failure9("This sign-in is no longer available in this browser. Start a new sign-in.",404);if(flow3.busy)throw failure9("The sign-in is still being updated. Try again shortly.",409);return flow3}async status(instanceId,owner2,flowId){
@@ -29810,24 +29810,42 @@ routineRun.threadId),await routines2.cancelRun(routineRun.id));let groupTurn=act
29810
29810
  /^\/api\/bots\/([\w-]+)$/),m3&&method2==="DELETE"){let result2=await deleteBotWithLifecycle2(m3[1]);return json7(res,result2.status,result2.body)}return PASS}}init_zod();init_new_bot_defaults();import{lstatSync as lstatSync45,readdirSync as readdirSync58,readFileSync as readFileSync184,statSync as statSync47}from"node:fs";import{basename as basename34,isAbsolute as isAbsolute41,join as join254}from"node:path";var MAX_ENTRIES2=400,MAX_DEPTH5=8;function listEntries(root3){let out=[],walk6=(dir,prefix,depth2)=>{if(!(depth2>MAX_DEPTH5||out.length>MAX_ENTRIES2))for(let name6 of readdirSync58(dir)){if(out.length>MAX_ENTRIES2)return;let absolute=join254(dir,name6),path6=prefix?`${prefix}/${name6}`:name6,info2=lstatSync45(absolute);info2.isSymbolicLink()?out.push({path:path6,kind:"link",size:0,absolute}):info2.isDirectory()?(out.push({path:path6,kind:"folder",size:0,absolute}),walk6(absolute,path6,depth2+1)):
29811
29811
  info2.isFile()&&out.push({path:path6,kind:"file",size:info2.size,executable:process.platform!=="win32"&&(info2.mode&73)!==0,absolute})}};return walk6(root3,"",1),out}function readOne(dir){let{take:take2,skipped:skipped2}=planSkillFolder(listEntries(dir));if(take2[0]?.path!=="SKILL.md")throw new Error(`no SKILL.md in ${basename34(dir)}`);let files2=take2.filter(entry2=>entry2.kind==="file").map(entry2=>({path:entry2.path,content:readFileSync184(entry2.absolute),executable:entry2.executable===!0}));
29812
29812
  return{source:`local:${basename34(dir)}`,files:files2,skipped:skipped2}}function readLocalSkills(folder3){try{if(!isAbsolute41(folder3)||!statSync47(folder3).isDirectory())return{error:"Choose a folder on this computer."};let dirs=[],has2=dir=>{try{return statSync47(join254(dir,"SKILL.md")).isFile()}catch{return!1}};if(has2(folder3))dirs.push(folder3);else for(let name6 of readdirSync58(folder3)){let sub=join254(folder3,name6);try{statSync47(sub).isDirectory()&&has2(sub)&&dirs.push(sub)}catch{}}
29813
- return dirs.length?{skills:dirs.slice(0,50).map(readOne)}:{error:"No SKILL.md found in that folder or in its subfolders."}}catch(error66){return{error:error66 instanceof Error?error66.message:"Could not read that folder."}}}function createBotSkillsRoutes(deps){let{store:store5,cfg:cfg2,listBotSkills:listBotSkills2,readBotSkillFile:readBotSkillFile2,stagedSkillListing:stagedSkillListing2}=deps;return async({req,res,url:url2,path:path6,method:method2,json:json7,readBody:readBody2})=>{let m3=null;if(m3=path6.match(/^\/api\/bots\/([\w-]+)\/skill-template$/),m3&&method2==="POST"){if(!store5.bot(m3[1]))return json7(res,404,{error:"no such bot"});let checked=botSkillTemplateSchema.safeParse(await readBody2(req));if(!checked.
29814
- success)return json7(res,400,{error:checked.error.message});let input2=checked.data,parsed2=parseSkillMd(input2.text);if("error"in parsed2||parsed2.name!==input2.name)return json7(res,400,{error:"Skill name does not match its contents"});let installed2=installSkill(m3[1],input2.source,[{path:"SKILL.md",content:input2.text}]);if("error"in installed2)return json7(res,422,{error:installed2.error});if(input2.enabled){let enabled=setSkillEnabled(m3[1],input2.name,!0);if("error"in enabled)return json7(
29815
- res,422,{error:enabled.error})}return json7(res,201,{installed:installed2})}if(m3=path6.match(/^\/api\/bots\/([\w-]+)\/skills$/),m3&&method2==="GET"){let bot=store5.bot(m3[1]);if(!bot)return json7(res,404,{error:"no such bot"});let asked=url2.searchParams.get("threadId"),threadId=asked&&store5.taskByThread(bot.id,asked)?asked:bot.threadId;if(skillsLibraryEnabled(cfg2)){let{skills,library}=listBotSkillsWithOrigin(m3[1],store5.bot(m3[1]).assignedSkills),names5=new Set(skills.map(skill=>skill.name));
29816
- return json7(res,200,{skills:[...skills,...listBotSkills2(bot,threadId).filter(skill=>!names5.has(skill.name))],library,assignedSkills:store5.bot(m3[1]).assignedSkills,staged:listStagedSkillWrites(m3[1]).map(stagedSkillListing2)})}return json7(res,200,{skills:listBotSkills2(bot,threadId),staged:listStagedSkillWrites(m3[1]).map(stagedSkillListing2)})}if(m3&&method2==="POST"){if(!store5.bot(m3[1]))return json7(res,404,{error:"no such bot"});let parsed2=external_exports.object({source:external_exports.
29817
- string().min(1).max(2e3)}).safeParse(await readBody2(req));if(!parsed2.success)return json7(res,400,{error:"source must be a GitHub or skills.sh URL, or owner/repo"});let fetched=parsed2.data.source.startsWith("local-folder:")?readLocalSkills(parsed2.data.source.slice(13)):await fetchSkillFromSource(parsed2.data.source);if("error"in fetched)return json7(res,422,{error:fetched.error});let results=fetched.skills.map(skill=>({skill,result:installSkill(m3[1],skill.source,skill.files,skill.github)})),
29818
- errors2=results.flatMap(({result:result2})=>"error"in result2?[result2.error]:[]),done=results.flatMap(({skill,result:result2})=>"error"in result2?[]:[{skill,installed:result2}]);if(!done.length)return json7(res,422,{error:errors2.join("; ")||"nothing importable found"});let imported=done.map(({skill,installed:installed2})=>skillImportSummary(installed2.name,skill.files,skill.skipped));return json7(res,201,{installed:done.map(({installed:installed2})=>installed2),imported,errors:errors2})}if(m3=
29819
- path6.match(/^\/api\/bots\/([\w-]+)\/skills\/([a-z0-9-]+)$/),m3&&method2==="GET"){let bot=store5.bot(m3[1]),text30=bot?readBotSkillFile2(bot,m3[2]):null;return text30===null?json7(res,404,{error:"no such skill"}):json7(res,200,{text:text30})}if(m3&&method2==="PATCH"){let parsed2=external_exports.object({enabled:external_exports.boolean()}).safeParse(await readBody2(req));if(!parsed2.success)return json7(res,400,{error:"enabled must be true or false"});let bot=store5.bot(m3[1]);if(bot&&listBotSkills2(
29820
- bot).some(skill=>skill.name===m3[2]&&skill.origin==="imported")){let result3=setImportedSkillEnabled(bot.id,m3[2],parsed2.data.enabled);return"error"in result3?json7(res,409,{error:result3.error}):json7(res,200,{skill:result3})}if(bot&&listBotSkills2(bot).some(skill=>skill.name===m3[2]&&skill.origin==="native")){let result3=setNativeSkillEnabled(bot.id,m3[2],parsed2.data.enabled);if("error"in result3)return json7(res,409,{error:result3.error});let skill=listBotSkills2(bot).find(entry2=>entry2.name===
29821
- m3[2]);return skill?json7(res,200,{skill}):json7(res,404,{error:"no such skill"})}let result2=setSkillEnabled(m3[1],m3[2],parsed2.data.enabled);return"error"in result2?json7(res,404,{error:result2.error}):json7(res,200,{skill:result2})}if(m3&&method2==="DELETE"){let bot=store5.bot(m3[1]);if(!bot)return json7(res,404,{error:"no such bot"});let name6=m3[2],removed=removeSkill(bot.id,name6);if(!("error"in removed))return json7(res,200,{ok:!0});if(skillsLibraryEnabled(cfg2)){let unassigned=unassignLibrarySkill(
29822
- bot.id,name6,bot.assignedSkills);if("unassigned"in unassigned)return"assignedSkills"in unassigned&&store5.patchBot(bot.id,{assignedSkills:unassigned.assignedSkills}),json7(res,200,{ok:!0})}let origin2=listBotSkills2(bot).find(skill=>skill.name===name6)?.origin;return origin2==="imported"?json7(res,404,{error:`"${name6}" comes from this computer and can't be removed from one bot. Turn it off instead.`}):origin2==="native"?json7(res,404,{error:`"${name6}" comes from this bot's engine and can't be \
29823
- removed here.`}):json7(res,404,{error:removed.error})}if(m3=path6.match(/^\/api\/skills-library$/),m3&&method2==="GET"){if(!skillsLibraryEnabled(cfg2))return json7(res,404,{error:"skills library is not enabled"});let index4=readSkillLibraryIndex(),skills=listLibrarySkills().map(listing2=>({name:listing2.name,description:listing2.description,source:listing2.source,enabled:listing2.enabled,everyBot:index4[listing2.name]?.everyBot===!0,tags:listing2.tags??[],version:index4[listing2.name]?.package?.
29824
- release??null,importedAt:listing2.importedAt,...listing2.license?{license:listing2.license}:{},...listing2.compatibility?{compatibility:listing2.compatibility}:{},warnings:listing2.warnings,assignedBots:store5.bots.filter(bot=>bot.assignedSkills?.includes(listing2.name)||index4[listing2.name]?.everyBot===!0&&!librarySkillOptOuts(bot.id).has(listing2.name)).map(bot=>({id:bot.id,name:bot.name}))})).sort((a,b11)=>a.name.localeCompare(b11.name));return json7(res,200,{skills})}if(m3&&method2==="POST"){
29825
- if(!skillsLibraryEnabled(cfg2))return json7(res,404,{error:"skills library is not enabled"});let parsed2=external_exports.object({text:external_exports.string().min(1)}).safeParse(await readBody2(req));if(!parsed2.success)return json7(res,400,{error:"text must be the SKILL.md contents to import"});let skill=parseSkillMd(parsed2.data.text);if("error"in skill)return json7(res,400,{error:skill.error});let installed2=installLibrarySkill({name:skill.name,instructions:parsed2.data.text,source:"local-i\
29826
- mport",license:skill.license,compatibility:skill.compatibility,tags:skill.tags,warnings:scanSkillText(parsed2.data.text),reviewState:"disabled"});return"error"in installed2?json7(res,422,{error:installed2.error}):json7(res,201,{skill:installed2})}if(m3=path6.match(/^\/api\/skills-library\/([a-z0-9-]+)$/),m3&&method2==="GET"){if(!skillsLibraryEnabled(cfg2))return json7(res,404,{error:"skills library is not enabled"});let text30=readLibrarySkillFile(m3[1]);return text30===null?json7(res,404,{error:"\
29827
- no such skill"}):json7(res,200,{text:text30})}if(m3&&method2==="PATCH"){if(!skillsLibraryEnabled(cfg2))return json7(res,404,{error:"skills library is not enabled"});let parsed2=external_exports.object({enabled:external_exports.boolean().optional(),everyBot:external_exports.boolean().optional()}).refine(body2=>body2.enabled!==void 0!=(body2.everyBot!==void 0)).safeParse(await readBody2(req));if(!parsed2.success)return json7(res,400,{error:"enabled or everyBot must be true or false"});let result2=parsed2.
29828
- data.enabled!==void 0?setLibrarySkillReviewState(m3[1],parsed2.data.enabled?"approved":"disabled"):setLibrarySkillEveryBot(m3[1],parsed2.data.everyBot);return"error"in result2?json7(res,404,{error:result2.error}):json7(res,200,{skill:result2})}if(m3=path6.match(/^\/api\/bots\/([\w-]+)\/skills-library$/),m3&&method2==="PUT"){if(!skillsLibraryEnabled(cfg2))return json7(res,404,{error:"skills library is not enabled"});if(!store5.bot(m3[1]))return json7(res,404,{error:"no such bot"});let parsed2=external_exports.
29829
- object({skills:external_exports.array(external_exports.string().min(1).max(64)).max(200)}).safeParse(await readBody2(req));if(!parsed2.success)return json7(res,400,{error:"skills must be a list of skill names"});let index4=readSkillLibraryIndex(),names5=[...new Set(parsed2.data.skills)],unknown2=names5.filter(name6=>!index4[name6]);if(unknown2.length)return json7(res,422,{error:"not in the library: "+unknown2.join(", ")});for(let name6 of names5)setLibrarySkillOptOut(m3[1],name6,!1);return store5.
29830
- patchBot(m3[1],{assignedSkills:names5}),json7(res,200,{assignedSkills:names5})}return PASS}}function createSkillShareRoutes(deps){return async({req,res,path:path6,method:method2,auth,json:json7,readBody:readBody2})=>{if(method2!=="POST")return PASS;let m3=path6.match(/^\/api\/threads\/([\w-]+)\/share-skill$/);if(m3){if(!deps.enabled())return json7(res,404,{error:"sharing learned skills is not enabled"});let body2=await readBody2(req),requestId=typeof body2?.requestId=="string"?body2.requestId:"";if(!requestId)return json7(res,400,{error:"requestId is required"});let refusal7=deps.cardRefusal(
29813
+ return dirs.length?{skills:dirs.slice(0,50).map(readOne)}:{error:"No SKILL.md found in that folder or in its subfolders."}}catch(error66){return{error:error66 instanceof Error?error66.message:"Could not read that folder."}}}import{createHash as createHash117}from"node:crypto";import{existsSync as existsSync98,mkdirSync as mkdirSync120,readFileSync as readFileSync185}from"node:fs";import{join as join255}from"node:path";init_atomic();init_config3();var HUB_REPO="leomieo/limix-skill-hub",HUB_BRANCH="main",SYNC_MIN_GAP_MS=1200*60*1e3,FILE_MAX_BYTES3=1024*1024,DEFAULT_SETTINGS={autoSync:!0,autoInstall:!1,lastSync:null,lastError:null,etag:null},hubDir=()=>join255(DATA_DIR,"skill-hub"),settingsFile=()=>join255(hubDir(),"settings.json"),catalogFile=()=>join255(hubDir(),"catalog.json");function readJson6(file3,fallback2){try{return JSON.parse(readFileSync185(file3,"utf8"))}catch{return fallback2}}function hubSettings(){return{...DEFAULT_SETTINGS,
29814
+ ...readJson6(settingsFile(),{})}}function saveSettings(next){mkdirSync120(hubDir(),{recursive:!0,mode:448}),writeFileAtomic(settingsFile(),JSON.stringify(next,null,2),{mode:384})}function hubCatalog(){let body2=readJson6(catalogFile(),{});return Array.isArray(body2.skills)?body2.skills:[]}var rawUrl=path6=>`https://raw.githubusercontent.com/${HUB_REPO}/${HUB_BRANCH}/${path6}`;async function fetchText(url2,headers={}){return fetch(url2,{signal:AbortSignal.timeout(3e4),headers:{"User-Agent":"limix\
29815
+ -bot",...headers}})}var syncing=null;function syncHub(){return syncing||(syncing=(async()=>{let settings=hubSettings();try{let response=await fetchText(rawUrl("registry/catalog.json"),settings.etag&&existsSync98(catalogFile())?{"If-None-Match":settings.etag}:{});if(response.status===304)return saveSettings({...settings,lastSync:new Date().toISOString(),lastError:null}),{changed:!1,count:hubCatalog().length};if(!response.ok)throw new Error(`Hub tr\u1EA3 v\u1EC1 ${response.status}`);let text30=await response.
29816
+ text(),parsed2=JSON.parse(text30);if(!Array.isArray(parsed2.skills))throw new Error("Danh m\u1EE5c Hub kh\xF4ng \u0111\xFAng \u0111\u1ECBnh d\u1EA1ng");return mkdirSync120(hubDir(),{recursive:!0,mode:448}),writeFileAtomic(catalogFile(),text30,{mode:384}),saveSettings({...settings,etag:response.headers.get("etag"),lastSync:new Date().toISOString(),lastError:null}),settings.autoInstall&&await autoInstallEligible(),{changed:!0,count:parsed2.skills.length}}catch(cause){let message8=cause instanceof Error?
29817
+ cause.message:String(cause);return saveSettings({...settings,lastError:message8}),{error:message8}}finally{syncing=null}})(),syncing)}var SCRIPT4=/\.(py|js|mjs|cjs|ts|sh|bash|zsh|ps1|bat|cmd|rb|pl|php|go|rs|exe|dll|so|dylib|bin|jar|class|scr|msi|com|apk|dex|node|wasm)$/i,MCP_FILE=/(^|\/)(\.mcp\.json|mcp\.json|mcp-servers?\.json|claude_desktop_config\.json)$/i,isToolFile=path6=>SCRIPT4.test(path6)||MCP_FILE.test(path6),sha=data4=>createHash117("sha256").update(data4).digest("hex");function hubSkillBlocked(entry2){
29818
+ return entry2.area==="quarantine"||entry2.security_status==="quarantined"?"Skill n\u1EB1m trong khu c\xE1ch ly v\xEC c\xF3 m\xE3 nguy hi\u1EC3m.":entry2.approval_status==="quarantined"||entry2.approval_status==="rejected"?"Skill b\u1ECB t\u1EEB ch\u1ED1i.":null}function installedFromHub(){let out=new Map;for(let entry2 of Object.values(readSkillLibraryIndex())){let match5=/^limix-hub:([a-z0-9-]+)@([0-9a-f]{64})/.exec(entry2.source);match5&&out.set(match5[1],{checksum:match5[2],sha256:entry2.sha256,
29819
+ reviewState:entry2.reviewState})}return out}function hubSkills(){let installed2=installedFromHub(),library=readSkillLibraryIndex();return hubCatalog().map(entry2=>{let have=installed2.get(entry2.id);return{...entry2,installed:!!have,enabled:have?.reviewState==="approved",updateAvailable:!!(have&&have.checksum!==entry2.checksum),blocked:hubSkillBlocked(entry2)??(!have&&library[entry2.id]?"Th\u01B0 vi\u1EC7n \u0111\xE3 c\xF3 k\u1EF9 n\u0103ng c\xF9ng t\xEAn kh\xF4ng \u0111\u1EBFn t\u1EEB Hub.":null)}})}
29820
+ async function installHubSkill(id12,options2={}){if(!isSkillName(id12))return{error:"T\xEAn k\u1EF9 n\u0103ng kh\xF4ng h\u1EE3p l\u1EC7"};let entry2=hubCatalog().find(e=>e.id===id12);if(!entry2)return{error:"Kh\xF4ng th\u1EA5y k\u1EF9 n\u0103ng n\xE0y trong danh m\u1EE5c Hub. H\xE3y \u0111\u1ED3ng b\u1ED9 l\u1EA1i."};let blocked=hubSkillBlocked(entry2);if(blocked)return{error:blocked};let installed2=installedFromHub().get(id12);if(readSkillLibraryIndex()[id12]&&!installed2)return{error:"Th\u01B0 vi\u1EC7n\
29821
+ \u0111\xE3 c\xF3 k\u1EF9 n\u0103ng c\xF9ng t\xEAn kh\xF4ng \u0111\u1EBFn t\u1EEB Hub."};let wanted=Object.keys(entry2.file_hashes).filter(path6=>path6!=="SKILL.md"&&(options2.allowTools||!isToolFile(path6))),skipped2=Object.keys(entry2.file_hashes).filter(path6=>path6!=="SKILL.md"&&!wanted.includes(path6)),files2=[],skillMd="";for(let path6 of["SKILL.md",...wanted]){let expected=entry2.file_hashes[path6];if(!expected)return{error:`Danh m\u1EE5c thi\u1EBFu m\xE3 ki\u1EC3m tra cho ${path6}`};let response;
29822
+ try{response=await fetchText(rawUrl(`skills/${id12}/${path6}`))}catch(cause){return{error:`Kh\xF4ng t\u1EA3i \u0111\u01B0\u1EE3c ${path6}: ${cause instanceof Error?cause.message:String(cause)}`}}if(!response.ok)return{error:`Kh\xF4ng t\u1EA3i \u0111\u01B0\u1EE3c ${path6} (${response.status})`};let bytes4=new Uint8Array(await response.arrayBuffer());if(bytes4.byteLength>FILE_MAX_BYTES3)return{error:`${path6} qu\xE1 l\u1EDBn`};if(sha(bytes4)!==expected)return{error:`${path6} kh\xF4ng kh\u1EDBp m\xE3 SHA-256 \
29823
+ trong danh m\u1EE5c \u2014 \u0111\xE3 d\u1EEBng c\xE0i`};path6==="SKILL.md"?skillMd=new TextDecoder().decode(bytes4):files2.push({path:path6,content:bytes4})}if(installed2){let retired=retireLibrarySkill(id12,installed2.sha256);if("error"in retired)return{error:retired.error};if("stale"in retired)return{error:"K\u1EF9 n\u0103ng \u0111\xE3 b\u1ECB s\u1EEDa tay sau khi c\xE0i, kh\xF4ng c\u1EADp nh\u1EADt \u0111\xE8."}}let result2=installLibrarySkill({name:id12,instructions:skillMd,source:`limix-hu\
29824
+ b:${id12}@${entry2.checksum} (${entry2.source.repository??"?"}@${(entry2.source.commit??"").slice(0,7)})`,...entry2.license?{license:entry2.license}:{},...entry2.compatibility.text?{compatibility:entry2.compatibility.text}:{},...entry2.tags.length?{tags:entry2.tags}:{},warnings:entry2.notes,skippedFiles:skipped2,reviewState:"disabled",...files2.length?{files:files2}:{}});return"error"in result2?{error:result2.error}:{ok:!0,skipped:skipped2}}function setHubSkillEnabled(id12,enabled){if(!installedFromHub().
29825
+ has(id12))return{error:"K\u1EF9 n\u0103ng n\xE0y ch\u01B0a c\xE0i t\u1EEB Hub"};let entry2=hubCatalog().find(e=>e.id===id12);if(enabled&&entry2&&hubSkillBlocked(entry2))return{error:hubSkillBlocked(entry2)};let result2=setLibrarySkillReviewState(id12,enabled?"approved":"disabled");return"error"in result2?{error:result2.error}:{ok:!0}}function removeHubSkill(id12){let installed2=installedFromHub().get(id12);if(!installed2)return{error:"K\u1EF9 n\u0103ng n\xE0y ch\u01B0a c\xE0i t\u1EEB Hub"};let result2=retireLibrarySkill(
29826
+ id12,installed2.sha256);return"error"in result2?{error:result2.error}:"stale"in result2?{error:"K\u1EF9 n\u0103ng \u0111\xE3 b\u1ECB s\u1EEDa tay sau khi c\xE0i, kh\xF4ng g\u1EE1 t\u1EF1 \u0111\u1ED9ng."}:{ok:!0}}async function autoInstallEligible(){let budget=5;for(let skill of hubSkills()){if(budget<=0)return;if(!(!skill.blocked&&skill.kind==="instructions-only"&&skill.approval_status==="approved"&&(skill.grade==="excellent"||skill.grade==="recommended"))||skill.installed&&!skill.updateAvailable)
29827
+ continue;budget-=1,"ok"in await installHubSkill(skill.id)&&skill.updateAvailable&&skill.enabled&&setHubSkillEnabled(skill.id,!0)}}async function handleLimixHub(method2,path6,body2){let record31=body2&&typeof body2=="object"?body2:{};if(method2==="GET"&&path6==="/api/limix/hub")return{status:200,body:{repo:HUB_REPO,settings:hubSettings(),skills:hubSkills()}};if(method2==="POST"&&path6==="/api/limix/hub/sync"){let result2=await syncHub();return"error"in result2?{status:502,body:result2}:{status:200,
29828
+ body:result2}}if(method2==="POST"&&path6==="/api/limix/hub/settings"){let current3=hubSettings();return saveSettings({...current3,autoSync:typeof record31.autoSync=="boolean"?record31.autoSync:current3.autoSync,autoInstall:typeof record31.autoInstall=="boolean"?record31.autoInstall:current3.autoInstall}),{status:200,body:{settings:hubSettings()}}}let id12=typeof record31.id=="string"?record31.id:"";if(method2==="POST"&&(path6==="/api/limix/hub/install"||path6==="/api/limix/hub/update")){let result2=await installHubSkill(
29829
+ id12,{allowTools:record31.allowTools===!0});return"error"in result2?{status:422,body:result2}:{status:200,body:result2}}if(method2==="POST"&&path6==="/api/limix/hub/enable"){let result2=setHubSkillEnabled(id12,record31.enabled===!0);return"error"in result2?{status:422,body:result2}:{status:200,body:result2}}if(method2==="POST"&&path6==="/api/limix/hub/remove"){let result2=removeHubSkill(id12);return"error"in result2?{status:422,body:result2}:{status:200,body:result2}}return null}var started2=!1;
29830
+ function startHubAutoSync(){if(started2)return;started2=!0;let tick2=()=>{let settings=hubSettings();settings.autoSync&&(settings.lastSync&&Date.now()-Date.parse(settings.lastSync)<SYNC_MIN_GAP_MS||syncHub())};setTimeout(tick2,6e4).unref(),setInterval(tick2,1800*1e3).unref()}function createBotSkillsRoutes(deps){let{store:store5,cfg:cfg2,listBotSkills:listBotSkills2,readBotSkillFile:readBotSkillFile2,stagedSkillListing:stagedSkillListing2}=deps;return async({req,res,url:url2,path:path6,method:method2,json:json7,readBody:readBody2})=>{let m3=null;if(path6.startsWith("/api/limix/hub")){let hub=await handleLimixHub(method2,path6,method2==="POST"?await readBody2(req):void 0);if(hub)return json7(res,hub.status,hub.body)}if(method2==="GET"&&path6==="/api/limix/bundled-skil\
29831
+ ls"){let skills=loadBundledSkills().map(({manifest})=>({id:manifest.id,name:manifest.name,description:manifest.description,defaultEnabled:manifest.defaultEnabled,triggerTerms:manifest.triggerTerms}));return json7(res,200,{skills})}if(m3=path6.match(/^\/api\/bots\/([\w-]+)\/skill-template$/),m3&&method2==="POST"){if(!store5.bot(m3[1]))return json7(res,404,{error:"no such bot"});let checked=botSkillTemplateSchema.safeParse(await readBody2(req));if(!checked.success)return json7(res,400,{error:checked.
29832
+ error.message});let input2=checked.data,parsed2=parseSkillMd(input2.text);if("error"in parsed2||parsed2.name!==input2.name)return json7(res,400,{error:"Skill name does not match its contents"});let installed2=installSkill(m3[1],input2.source,[{path:"SKILL.md",content:input2.text}]);if("error"in installed2)return json7(res,422,{error:installed2.error});if(input2.enabled){let enabled=setSkillEnabled(m3[1],input2.name,!0);if("error"in enabled)return json7(res,422,{error:enabled.error})}return json7(
29833
+ res,201,{installed:installed2})}if(m3=path6.match(/^\/api\/bots\/([\w-]+)\/skills$/),m3&&method2==="GET"){let bot=store5.bot(m3[1]);if(!bot)return json7(res,404,{error:"no such bot"});let asked=url2.searchParams.get("threadId"),threadId=asked&&store5.taskByThread(bot.id,asked)?asked:bot.threadId;if(skillsLibraryEnabled(cfg2)){let{skills,library}=listBotSkillsWithOrigin(m3[1],store5.bot(m3[1]).assignedSkills),names5=new Set(skills.map(skill=>skill.name));return json7(res,200,{skills:[...skills,...listBotSkills2(
29834
+ bot,threadId).filter(skill=>!names5.has(skill.name))],library,assignedSkills:store5.bot(m3[1]).assignedSkills,staged:listStagedSkillWrites(m3[1]).map(stagedSkillListing2)})}return json7(res,200,{skills:listBotSkills2(bot,threadId),staged:listStagedSkillWrites(m3[1]).map(stagedSkillListing2)})}if(m3&&method2==="POST"){if(!store5.bot(m3[1]))return json7(res,404,{error:"no such bot"});let parsed2=external_exports.object({source:external_exports.string().min(1).max(2e3)}).safeParse(await readBody2(req));
29835
+ if(!parsed2.success)return json7(res,400,{error:"source must be a GitHub or skills.sh URL, or owner/repo"});let fetched=parsed2.data.source.startsWith("local-folder:")?readLocalSkills(parsed2.data.source.slice(13)):await fetchSkillFromSource(parsed2.data.source);if("error"in fetched)return json7(res,422,{error:fetched.error});let results=fetched.skills.map(skill=>({skill,result:installSkill(m3[1],skill.source,skill.files,skill.github)})),errors2=results.flatMap(({result:result2})=>"error"in result2?
29836
+ [result2.error]:[]),done=results.flatMap(({skill,result:result2})=>"error"in result2?[]:[{skill,installed:result2}]);if(!done.length)return json7(res,422,{error:errors2.join("; ")||"nothing importable found"});let imported=done.map(({skill,installed:installed2})=>skillImportSummary(installed2.name,skill.files,skill.skipped));return json7(res,201,{installed:done.map(({installed:installed2})=>installed2),imported,errors:errors2})}if(m3=path6.match(/^\/api\/bots\/([\w-]+)\/skills\/([a-z0-9-]+)$/),m3&&
29837
+ method2==="GET"){let bot=store5.bot(m3[1]),text30=bot?readBotSkillFile2(bot,m3[2]):null;return text30===null?json7(res,404,{error:"no such skill"}):json7(res,200,{text:text30})}if(m3&&method2==="PATCH"){let parsed2=external_exports.object({enabled:external_exports.boolean()}).safeParse(await readBody2(req));if(!parsed2.success)return json7(res,400,{error:"enabled must be true or false"});let bot=store5.bot(m3[1]);if(bot&&listBotSkills2(bot).some(skill=>skill.name===m3[2]&&skill.origin==="importe\
29838
+ d")){let result3=setImportedSkillEnabled(bot.id,m3[2],parsed2.data.enabled);return"error"in result3?json7(res,409,{error:result3.error}):json7(res,200,{skill:result3})}if(bot&&listBotSkills2(bot).some(skill=>skill.name===m3[2]&&skill.origin==="native")){let result3=setNativeSkillEnabled(bot.id,m3[2],parsed2.data.enabled);if("error"in result3)return json7(res,409,{error:result3.error});let skill=listBotSkills2(bot).find(entry2=>entry2.name===m3[2]);return skill?json7(res,200,{skill}):json7(res,404,
29839
+ {error:"no such skill"})}let result2=setSkillEnabled(m3[1],m3[2],parsed2.data.enabled);return"error"in result2?json7(res,404,{error:result2.error}):json7(res,200,{skill:result2})}if(m3&&method2==="DELETE"){let bot=store5.bot(m3[1]);if(!bot)return json7(res,404,{error:"no such bot"});let name6=m3[2],removed=removeSkill(bot.id,name6);if(!("error"in removed))return json7(res,200,{ok:!0});if(skillsLibraryEnabled(cfg2)){let unassigned=unassignLibrarySkill(bot.id,name6,bot.assignedSkills);if("unassign\
29840
+ ed"in unassigned)return"assignedSkills"in unassigned&&store5.patchBot(bot.id,{assignedSkills:unassigned.assignedSkills}),json7(res,200,{ok:!0})}let origin2=listBotSkills2(bot).find(skill=>skill.name===name6)?.origin;return origin2==="imported"?json7(res,404,{error:`"${name6}" comes from this computer and can't be removed from one bot. Turn it off instead.`}):origin2==="native"?json7(res,404,{error:`"${name6}" comes from this bot's engine and can't be removed here.`}):json7(res,404,{error:removed.
29841
+ error})}if(m3=path6.match(/^\/api\/skills-library$/),m3&&method2==="GET"){if(!skillsLibraryEnabled(cfg2))return json7(res,404,{error:"skills library is not enabled"});let index4=readSkillLibraryIndex(),skills=listLibrarySkills().map(listing2=>({name:listing2.name,description:listing2.description,source:listing2.source,enabled:listing2.enabled,everyBot:index4[listing2.name]?.everyBot===!0,tags:listing2.tags??[],version:index4[listing2.name]?.package?.release??null,importedAt:listing2.importedAt,...listing2.
29842
+ license?{license:listing2.license}:{},...listing2.compatibility?{compatibility:listing2.compatibility}:{},warnings:listing2.warnings,assignedBots:store5.bots.filter(bot=>bot.assignedSkills?.includes(listing2.name)||index4[listing2.name]?.everyBot===!0&&!librarySkillOptOuts(bot.id).has(listing2.name)).map(bot=>({id:bot.id,name:bot.name}))})).sort((a,b11)=>a.name.localeCompare(b11.name));return json7(res,200,{skills})}if(m3&&method2==="POST"){if(!skillsLibraryEnabled(cfg2))return json7(res,404,{error:"\
29843
+ skills library is not enabled"});let parsed2=external_exports.object({text:external_exports.string().min(1)}).safeParse(await readBody2(req));if(!parsed2.success)return json7(res,400,{error:"text must be the SKILL.md contents to import"});let skill=parseSkillMd(parsed2.data.text);if("error"in skill)return json7(res,400,{error:skill.error});let installed2=installLibrarySkill({name:skill.name,instructions:parsed2.data.text,source:"local-import",license:skill.license,compatibility:skill.compatibility,
29844
+ tags:skill.tags,warnings:scanSkillText(parsed2.data.text),reviewState:"disabled"});return"error"in installed2?json7(res,422,{error:installed2.error}):json7(res,201,{skill:installed2})}if(m3=path6.match(/^\/api\/skills-library\/([a-z0-9-]+)$/),m3&&method2==="GET"){if(!skillsLibraryEnabled(cfg2))return json7(res,404,{error:"skills library is not enabled"});let text30=readLibrarySkillFile(m3[1]);return text30===null?json7(res,404,{error:"no such skill"}):json7(res,200,{text:text30})}if(m3&&method2===
29845
+ "PATCH"){if(!skillsLibraryEnabled(cfg2))return json7(res,404,{error:"skills library is not enabled"});let parsed2=external_exports.object({enabled:external_exports.boolean().optional(),everyBot:external_exports.boolean().optional()}).refine(body2=>body2.enabled!==void 0!=(body2.everyBot!==void 0)).safeParse(await readBody2(req));if(!parsed2.success)return json7(res,400,{error:"enabled or everyBot must be true or false"});let result2=parsed2.data.enabled!==void 0?setLibrarySkillReviewState(m3[1],
29846
+ parsed2.data.enabled?"approved":"disabled"):setLibrarySkillEveryBot(m3[1],parsed2.data.everyBot);return"error"in result2?json7(res,404,{error:result2.error}):json7(res,200,{skill:result2})}if(m3=path6.match(/^\/api\/bots\/([\w-]+)\/skills-library$/),m3&&method2==="PUT"){if(!skillsLibraryEnabled(cfg2))return json7(res,404,{error:"skills library is not enabled"});if(!store5.bot(m3[1]))return json7(res,404,{error:"no such bot"});let parsed2=external_exports.object({skills:external_exports.array(external_exports.
29847
+ string().min(1).max(64)).max(200)}).safeParse(await readBody2(req));if(!parsed2.success)return json7(res,400,{error:"skills must be a list of skill names"});let index4=readSkillLibraryIndex(),names5=[...new Set(parsed2.data.skills)],unknown2=names5.filter(name6=>!index4[name6]);if(unknown2.length)return json7(res,422,{error:"not in the library: "+unknown2.join(", ")});for(let name6 of names5)setLibrarySkillOptOut(m3[1],name6,!1);return store5.patchBot(m3[1],{assignedSkills:names5}),json7(res,200,
29848
+ {assignedSkills:names5})}return PASS}}function createSkillShareRoutes(deps){return async({req,res,path:path6,method:method2,auth,json:json7,readBody:readBody2})=>{if(method2!=="POST")return PASS;let m3=path6.match(/^\/api\/threads\/([\w-]+)\/share-skill$/);if(m3){if(!deps.enabled())return json7(res,404,{error:"sharing learned skills is not enabled"});let body2=await readBody2(req),requestId=typeof body2?.requestId=="string"?body2.requestId:"";if(!requestId)return json7(res,400,{error:"requestId is required"});let refusal7=deps.cardRefusal(
29831
29849
  auth,m3[1],requestId);if(refusal7)return json7(res,403,{error:refusal7});let result2=deps.shareFromReceipt(m3[1],requestId);return result2.ok?json7(res,200,{ok:!0,shared:result2.shared}):json7(res,result2.status,{error:result2.error})}if(m3=path6.match(/^\/api\/bots\/([\w-]+)\/skills\/([a-z0-9-]+)\/share$/),m3){if(!deps.enabled())return json7(res,404,{error:"sharing learned skills is not enabled"});if(!deps.botExists(m3[1]))return json7(res,404,{error:"no such bot"});let shared=deps.shareFromBot(
29832
29850
  m3[1],m3[2]);return"error"in shared?json7(res,422,{error:shared.error}):json7(res,200,{ok:!0,shared})}return PASS}}init_zod();init_user_errors();function createTeamContextRoutes(deps){let{store:store5,teamMemory:teamMemory2}=deps;return async({req,res,url:url2,path:path6,method:method2,json:json7,readBody:readBody2})=>{let m3=null;if(path6==="/api/team-memory"&&(method2==="GET"||method2==="POST")){if(!url2.searchParams.has("section"))return json7(res,400,{error:"section is required"});let section4=sectionContextKey(url2.searchParams.get("section")??"");if(section4&&!store5.sections.includes(section4))return json7(res,404,userError("serve\
29833
29851
  rError.department.notFound"));if(section4.length>60)return json7(res,400,{error:"section must be at most 60 characters"});if(method2==="GET")return json7(res,200,{section:section4,label:sectionContextLabel(section4),entries:teamMemory2.list(section4),loadedIds:teamMemory2.promptSelection(section4).loadedIds});let body2=await readBody2(req);if(!body2||typeof body2!="object"||!TEAM_MEMORY_KINDS.includes(String(body2.kind)))return json7(res,400,{error:`kind must be one of ${TEAM_MEMORY_KINDS.join("\
@@ -29838,7 +29856,7 @@ accept===!0){if(!teamMemory2.resolve(section4,m3[1],"accept",body2.expectedRevis
29838
29856
  success)return json7(res,400,{error:"Invalid memory edit"});if(!teamMemory2.update(section4,m3[1],parsed2.data,body2.expectedRevision))return json7(res,404,{error:"no such entry"})}return json7(res,200,{entries:teamMemory2.list(section4),loadedIds:teamMemory2.promptSelection(section4).loadedIds})}catch(error66){return json7(res,error66 instanceof TeamMemoryConflict?409:400,{error:error66 instanceof Error?error66.message:String(error66),...userErrorFields(error66)})}}if(path6==="/api/section-cont\
29839
29857
  ext"&&(method2==="GET"||method2==="PUT")){if(!url2.searchParams.has("section"))return json7(res,400,{error:"section is required"});let requested=url2.searchParams.get("section")??"",section4=sectionContextKey(requested);if(section4.length>60)return json7(res,400,{error:"section must be at most 60 characters"});if(!(section4===""||store5.sections.includes(section4)||store5.bots.some(bot=>!bot.hidden&&sectionKey2(bot.section)===section4)||store5.groups.some(group2=>sectionKey2(group2.section)===section4)))
29840
29858
  return json7(res,404,userError("serverError.department.missing"));if(method2==="GET"){let context4=readSectionContext(section4);return json7(res,200,{section:section4,label:sectionContextLabel(section4),text:context4?.text??"",updatedAt:context4?.updatedAt??null,maxBytes:SECTION_CONTEXT_MAX_BYTES})}let parsed2=external_exports.object({text:external_exports.string()}).safeParse(await readBody2(req));if(!parsed2.success)return json7(res,400,{error:"text must be a string"});if(Buffer.byteLength(parsed2.
29841
- data.text,"utf8")>SECTION_CONTEXT_MAX_BYTES)return json7(res,400,{error:`section context is capped at ${SECTION_CONTEXT_MAX_BYTES/1e3}KB`});let context3=writeSectionContext(section4,parsed2.data.text);return json7(res,200,{ok:!0,section:section4,label:sectionContextLabel(section4),text:context3?.text??"",updatedAt:context3?.updatedAt??null,maxBytes:SECTION_CONTEXT_MAX_BYTES})}return PASS}}init_zod();import{createHash as createHash117}from"node:crypto";import{readFileSync as readFileSync185}from"node:fs";import{join as join255}from"node:path";var GOES_WELL_WITH={gmail:["googlecalendar","googledrive","slack"],googlecalendar:["gmail","googlemeet","slack"],googledrive:["googledocs","googlesheets","gmail"],googledocs:["googledrive","googlesheets","notion"],googlesheets:["googledrive","airtable","gmail"],outlook:["one_drive","microsoft_teams","slack"],slack:["gmail","notion","linear"],discord:["github","notion","googlecalendar"],github:["linear","slack","notion"],gitlab:["linear","slack","jira"],linear:["github","slack","notion"],jira:["c\
29859
+ data.text,"utf8")>SECTION_CONTEXT_MAX_BYTES)return json7(res,400,{error:`section context is capped at ${SECTION_CONTEXT_MAX_BYTES/1e3}KB`});let context3=writeSectionContext(section4,parsed2.data.text);return json7(res,200,{ok:!0,section:section4,label:sectionContextLabel(section4),text:context3?.text??"",updatedAt:context3?.updatedAt??null,maxBytes:SECTION_CONTEXT_MAX_BYTES})}return PASS}}init_zod();import{createHash as createHash118}from"node:crypto";import{readFileSync as readFileSync186}from"node:fs";import{join as join256}from"node:path";var GOES_WELL_WITH={gmail:["googlecalendar","googledrive","slack"],googlecalendar:["gmail","googlemeet","slack"],googledrive:["googledocs","googlesheets","gmail"],googledocs:["googledrive","googlesheets","notion"],googlesheets:["googledrive","airtable","gmail"],outlook:["one_drive","microsoft_teams","slack"],slack:["gmail","notion","linear"],discord:["github","notion","googlecalendar"],github:["linear","slack","notion"],gitlab:["linear","slack","jira"],linear:["github","slack","notion"],jira:["c\
29842
29860
  onfluence","github","slack"],sentry:["github","linear","slack"],posthog:["github","linear","slack"],notion:["slack","googledrive","linear"],airtable:["slack","googlesheets","notion"],asana:["slack","googlecalendar","gmail"],trello:["slack","googlecalendar","gmail"],hubspot:["gmail","slack","googlecalendar"],salesforce:["gmail","slack","googlesheets"],stripe:["hubspot","slack","googlesheets"],shopify:["stripe","mailchimp","googlesheets"],dropbox:["gmail","slack","notion"],figma:["linear","slack",
29843
29861
  "notion"],zoom:["googlecalendar","slack","gmail"]},STARTER_APPS=["gmail","googlecalendar","slack","notion","googledrive","github","googlesheets","linear","hubspot","airtable","jira","asana","trello","dropbox","zoom","stripe"],SUGGESTED_SECTION_SIZE=6;var WANTED_FIRST_MAX=3,NOISE_WORDS=new Set(["a","an","app","apps","and","connect","for","i","in","my","need","of","on","or","something","that","the","to","tool","tools","want","with"]),partnersOf=slug3=>Object.hasOwn(GOES_WELL_WITH,slug3)?GOES_WELL_WITH[slug3]:[];function pairings(connected){let votes=new Map;for(let app of connected)partnersOf(app).forEach((partner,position3)=>votes.set(partner,(votes.get(partner)??0)+3-position3));return[...votes].sort((a,b11)=>b11[1]-a[1]).map(([slug3])=>slug3)}
29844
29862
  function rankAppSuggestions(input2){let bySlug=new Map(input2.catalog.map(card=>[card.slug,card])),held4=new Set([...input2.held,...input2.connected,...input2.about?[input2.about]:[]]),offerable=slug3=>{let card=bySlug.get(slug3);return!!card&&!card.noAuth&&!held4.has(slug3)&&(input2.allowed?.(slug3)??!0)},ordered=[...(input2.wanted??[]).filter(offerable).slice(0,WANTED_FIRST_MAX),...input2.picks??[],...input2.about?partnersOf(input2.about):[],...pairings(input2.connected),...STARTER_APPS];return[
@@ -29846,7 +29864,7 @@ function rankAppSuggestions(input2){let bySlug=new Map(input2.catalog.map(card=>
29846
29864
  points-a.points||a.index-b11.index).slice(0,limit2).map(({card})=>card)}init_atomic();var APP_PICK_INSTRUCTIONS="Which one app should this person connect next, so their `bots` can do more for them? Go by the `connected_apps` they already use and what the bots are for.",APP_PICK_TIMEOUT_MS=1e4,MAX_CONNECTED=40,MAX_BOTS2=12;function appPickAvailable(cfg2){return deciderEnabled(cfg2)&&!!deciderAccount(cfg2,"botDecide")}function appPickRequest(input2){let candidates=input2.candidates.filter(app=>BOT_DECIDE_LIMITS.id.test(app.slug)).slice(0,BOT_DECIDE_LIMITS.options);return{state:{connected_apps:input2.
29847
29865
  connected.slice(0,MAX_CONNECTED).map(app=>clean3(app,80)),bots:input2.bots.slice(0,MAX_BOTS2).map(bot=>({name:clean3(bot.name,80),...bot.role?.trim()?{role:clean3(bot.role,120)}:{}}))},question:{instructions:APP_PICK_INSTRUCTIONS,options:Object.fromEntries(candidates.map(app=>[app.slug,clean3(app.blurb?`${app.label}: ${app.blurb}`:app.label,200)]))}}}async function pickApps(decider2,input2){let{state,question}=appPickRequest(input2),offered=Object.keys(question.options);if(offered.length<2)return{
29848
29866
  ok:!1};let result2=await decider2.choose("botDecide",state,question,{timeoutMs:APP_PICK_TIMEOUT_MS});if(!result2.ok||!offered.includes(result2.answers.choice))return{ok:!1};let{choice,probabilities}=result2.answers,chance=slug3=>probabilities[slug3]??0;return{ok:!0,slugs:[choice,...offered.filter(slug3=>slug3!==choice).sort((a,b11)=>chance(b11)-chance(a))]}}var SUGGESTIONS_FILE="app-suggestions.json",WANTED_TTL_MS=720*60*60*1e3,WANTED_MAX=20,FIND_LIMIT=8,FIND_NOTED=2,slug2=external_exports.string().min(1).max(100),stateSchema5=external_exports.object({version:external_exports.literal(1),wanted:external_exports.array(external_exports.object({slug:slug2,at:external_exports.number().finite().nonnegative()})).max(WANTED_MAX),pick:external_exports.object({key:external_exports.string().max(80),slugs:external_exports.array(slug2).max(BOT_DECIDE_LIMITS.options)}).
29849
- optional()});function createAppSuggestions(deps){let now2=deps.now??Date.now,file3=join255(deps.dataDir,SUGGESTIONS_FILE),state={version:1,wanted:[]};try{let parsed2=stateSchema5.safeParse(JSON.parse(readFileSync185(file3,"utf8")));parsed2.success&&(state=parsed2.data)}catch{}let save7=()=>{try{writeFileAtomic(file3,`${JSON.stringify(state)}
29867
+ optional()});function createAppSuggestions(deps){let now2=deps.now??Date.now,file3=join256(deps.dataDir,SUGGESTIONS_FILE),state={version:1,wanted:[]};try{let parsed2=stateSchema5.safeParse(JSON.parse(readFileSync186(file3,"utf8")));parsed2.success&&(state=parsed2.data)}catch{}let save7=()=>{try{writeFileAtomic(file3,`${JSON.stringify(state)}
29850
29868
  `,{mode:384})}catch(error66){console.warn(`app suggestions: could not save: ${error66 instanceof Error?error66.message:String(error66)}`)}};function noteWanted(app){state={...state,wanted:[{slug:app,at:now2()},...state.wanted.filter(entry2=>entry2.slug!==app)].slice(0,WANTED_MAX)},save7()}deps.store.onChange(change2=>{if(change2.type!=="message")return;let card=change2.message.connector;card&&card.source!=="mcp"&&card.status!=="connected"&&!card.resumeKey.startsWith(FIRST_HOUR_OFFER_KEY)&&noteWanted(
29851
29869
  card.slug)});let everyoneBots=()=>deps.store.bots.filter(bot=>!bot.hidden&&!bot.movedTo),roles=()=>everyoneBots().map(bot=>({name:bot.name,...bot.title?.trim()||bot.section?.trim()?{role:bot.title?.trim()||bot.section.trim()}:{}})),wantedNow=()=>state.wanted.filter(entry2=>now2()-entry2.at<=WANTED_TTL_MS).map(entry2=>entry2.slug),scopedTo=botId=>{let bot=botId?deps.store.bot(botId):null,bots=bot?[bot]:everyoneBots().filter(one5=>one5.composio!==!1);return app=>deps.offerable(app)&&(!bots.length||
29852
29870
  bots.some(one5=>!one5.connectorScopes||one5.connectorScopes.apps[app]))};async function reading(){if(!deps.configured())return null;try{let[{cards},services2]=await Promise.all([deps.catalog(),deps.services()]),connected=Object.entries(services2).filter(([,service])=>service.connected).map(([app])=>app).sort();return{cards,connected,held:Object.keys(services2),key:pickKey(connected,roles())}}catch{return null}}async function suggest(input2){let here=await reading();if(!here)return{cards:[],pick:"\
@@ -29855,34 +29873,34 @@ return;let candidates=rankAppSuggestions({catalog:here.cards,connected:here.conn
29855
29873
  finally(()=>{picking=null}),await picking,suggest({limit:limit2})},async find(input2){let here=await reading();if(!here)return"The list of apps can't be read right now. Try again in a minute.";let matches3=searchCatalog(here.cards,input2.query,FIND_LIMIT*3),scope=input2.bot.connectorScopes,usable=matches3.filter(card=>(!scope||scope.apps[card.slug])&&!input2.refusal(card.slug)).slice(0,FIND_LIMIT);if(!usable.length)return(matches3[0]?input2.refusal(matches3[0].slug):null)??`No app that can be co\
29856
29874
  nnected here matches "${clean3(input2.query,120)}". Try other words.`;let connected=new Set(here.connected),missing2=usable.filter(card=>!connected.has(card.slug)&&!card.noAuth);for(let card of missing2.slice(0,FIND_NOTED).reverse())noteWanted(card.slug);let standing=card=>connected.has(card.slug)?"connected":card.noAuth?"no sign-in needed":"not connected";return[`Apps matching "${clean3(input2.query,120)}":`,...usable.map(card=>`- ${card.slug}: ${clean3(card.label,80)} (${standing(card)}). ${clean3(
29857
29875
  card.blurb,120)}`),'To show the person a card that connects one, call this tool again with toolkits: ["<slug>"], using a slug listed here.'].join(`
29858
- `)}}}function pickKey(connected,bots){let people=bots.map(bot=>[bot.name,bot.role??""]).sort((a,b11)=>a.join().localeCompare(b11.join()));return createHash117("sha256").update(JSON.stringify([connected,people])).digest("hex")}var MAX_LIMIT2=20,MAX_QUERY=200;function createAppSuggestionRoutes(host3){return async({res,url:url2,path:path6,method:method2,json:json7})=>{if(method2==="GET"&&path6==="/api/connectors/suggestions"){let limit2=Number(url2.searchParams.get("limit")),botId=url2.searchParams.get("botId")??void 0,about=url2.searchParams.get("for")?.trim().toLowerCase()||void 0;return json7(res,200,await host3.suggest({limit:Number.isInteger(limit2)&&limit2>0?Math.min(limit2,MAX_LIMIT2):SUGGESTED_SECTION_SIZE,...botId?
29876
+ `)}}}function pickKey(connected,bots){let people=bots.map(bot=>[bot.name,bot.role??""]).sort((a,b11)=>a.join().localeCompare(b11.join()));return createHash118("sha256").update(JSON.stringify([connected,people])).digest("hex")}var MAX_LIMIT2=20,MAX_QUERY=200;function createAppSuggestionRoutes(host3){return async({res,url:url2,path:path6,method:method2,json:json7})=>{if(method2==="GET"&&path6==="/api/connectors/suggestions"){let limit2=Number(url2.searchParams.get("limit")),botId=url2.searchParams.get("botId")??void 0,about=url2.searchParams.get("for")?.trim().toLowerCase()||void 0;return json7(res,200,await host3.suggest({limit:Number.isInteger(limit2)&&limit2>0?Math.min(limit2,MAX_LIMIT2):SUGGESTED_SECTION_SIZE,...botId?
29859
29877
  {botId}:{},...about?{about}:{}}))}return method2==="POST"&&path6==="/api/connectors/suggestions/pick"?json7(res,200,await host3.pick(SUGGESTED_SECTION_SIZE)):PASS}}function createAppFindRoute(deps){return async({res,path:path6,method:method2,json:json7})=>{if(method2!=="POST"||path6!=="/api/internal/connectors/find")return PASS;let body2=await deps.readBody(),query2=typeof body2?.query=="string"?body2.query.trim().slice(0,MAX_QUERY):"";if(!query2)return json7(res,400,{error:"find must say what t\
29860
29878
  he app is for."});let bot=deps.bot(deps.botId);return bot?json7(res,200,{text:await deps.host.find({query:query2,bot,refusal:deps.refusal})}):json7(res,409,{error:"connected apps are not enabled for this bot"})}}init_user_errors();init_config();var MAX_KEY_LENGTH=512;function createDeciderRoutes(deps){let models=deps.models??createOpenRouterModelCatalog();return async({req,res,path:path6,method:method2,json:json7,readBody:readBody2})=>{if(path6==="/api/decider/models"&&method2==="GET")return res.setHeader("cache-control","no-store"),json7(res,200,await models.load(deps.config().decider?.openrouterBaseUrl));if(path6!=="/api/decider/test"||method2!=="POST")return PASS;let body2=await readBody2(req,8192);if(body2?.key!==void 0&&typeof body2.
29861
29879
  key!="string")return json7(res,400,{error:"key must be a string"});let draft=typeof body2?.key=="string"?body2.key.trim():"";if(draft.length>MAX_KEY_LENGTH)return json7(res,400,{error:"That does not look like an API key."});res.setHeader("cache-control","no-store");let provider=body2?.provider==="jev"||body2?.provider==="openrouter"||body2?.provider==="workersai"?body2.provider:void 0;if(body2?.accountId!==void 0&&(typeof body2.accountId!="string"||!WORKERS_AI_ACCOUNT_ID.test(body2.accountId.trim())))
29862
29880
  return json7(res,400,userError("serverError.decider.accountId"));let accountId=typeof body2?.accountId=="string"?body2.accountId.trim():void 0;if(body2?.model!==void 0&&(typeof body2.model!="string"||body2.model.length>OPENROUTER_MODEL_ID_MAX))return json7(res,400,{error:"model must be an OpenRouter model id"});let model4=typeof body2?.model=="string"&&body2.model.trim()?body2.model.trim():void 0,api=body2?.api==="decisions"||body2?.api==="chat"?body2.api:void 0,result2=await deps.decider.testKey(
29863
29881
  {...draft?{key:draft}:{},...provider?{provider}:{},...model4?{model:model4}:{},...api?{api}:{},...accountId?{accountId}:{}}),read4=!draft&&(!provider||provider==="workersai")&&deps.extractor?await deps.extractor.testKey():null,extraction=read4&&!(read4.ok===!1&&read4.reason==="no_key")?{extraction:read4.ok?{ok:!0}:{ok:!1,reason:read4.reason,...read4.status?{status:read4.status}:{}}}:{};return result2.ok?json7(res,200,{ok:!0,latencyMs:result2.latencyMs,...extraction}):json7(res,200,{ok:!1,reason:result2.
29864
- reason,...result2.status?{status:result2.status}:{},...extraction})}}init_zod();init_bot_avatar();init_zod();import{createHash as createHash118,randomUUID as randomUUID81}from"node:crypto";import{createReadStream as createReadStream10}from"node:fs";import{link as link4,lstat as lstat10,mkdir as mkdir15,open as open13,readdir as readdir13,rename as rename7,stat as stat14,unlink as unlink7}from"node:fs/promises";import{statfsSync as statfsSync4}from"node:fs";import{dirname as dirname77,join as join256}from"node:path";var FILE_PART_BYTES=8*1024*1024,MAX_FILES3=2e5,PARTIAL_MAX_AGE_MS=1440*60*1e3,SHA3=/^[a-f0-9]{64}$/u,PLACE=/^(?:workspaces\/[\w-]{1,128}|task-workspaces\/[\w-]{1,128}\/[\w-]{1,200})\/./u,CARRIED_OTHERWISE=/^workspaces\/[\w-]{1,128}\/(?:MEMORY\.md$|memory(?:\/|$)|skills(?:\/|$))|^(?:workspaces\/[\w-]{1,128}|task-workspaces\/[\w-]{1,128}\/[\w-]{1,200})\/\.(?:claude|agents|grok)(?:\/|$)/u;function movedFilePath(path6){return PLACE.test(path6)&&validRelative(path6)&&!CARRIED_OTHERWISE.test(path6)&&!omittedFromWorkspaceBackup(
29865
- path6)&&!path6.split("/").includes("node_modules")}var hashes=new Map;async function fileSha256(full,size3,mtimeMs){let key7=`${full}\0${size3}\0${mtimeMs}`,known=hashes.get(key7);if(known)return known;let hash4=createHash118("sha256");for await(let chunk of createReadStream10(full))hash4.update(chunk);let digest5=hash4.digest("hex");return hashes.size>=MAX_FILES3&&hashes.delete(hashes.keys().next().value),hashes.set(key7,digest5),digest5}async function listBotFiles(dataDir,botIds){let out=[],walk6=async relative27=>{
29866
- let names5;try{names5=(await readdir13(join256(dataDir,relative27))).sort()}catch{return}for(let name6 of names5){if(out.length>=MAX_FILES3)return;let path6=`${relative27}/${name6}`,info2=await lstat10(join256(dataDir,path6)).catch(()=>null);if(!(!info2||name6==="node_modules")){if(info2.isDirectory()){!CARRIED_OTHERWISE.test(`${path6}/`)&&!omittedFromWorkspaceBackup(path6)&&await walk6(path6);continue}info2.isFile()&&movedFilePath(path6)&&out.push({path:path6,size:info2.size,sha256:await fileSha256(
29867
- join256(dataDir,path6),info2.size,info2.mtimeMs)})}}};for(let id12 of botIds)/^[\w-]{1,128}$/u.test(id12)&&(await walk6(`workspaces/${id12}`),await walk6(`task-workspaces/${id12}`));return out}function space(dataDir){try{let disk=statfsSync4(dataDir,{bigint:!0}),clamp4=value3=>value3>BigInt(Number.MAX_SAFE_INTEGER)?Number.MAX_SAFE_INTEGER:Number(value3);return{freeBytes:clamp4(disk.bavail*disk.bsize),volumeBytes:clamp4(disk.blocks*disk.bsize)}}catch{return null}}var staging=dataDir=>join256(dataDir,
29868
- "tmp","move-files"),partialPath=(dataDir,sha2567,size3)=>join256(staging(dataDir),`${sha2567}-${size3}.partial`);async function tidyPartials(dataDir,now2=Date.now()){let folder3=staging(dataDir);for(let name6 of await readdir13(folder3).catch(()=>[])){if(!name6.endsWith(".partial"))continue;let info2=await stat14(join256(folder3,name6)).catch(()=>null);info2&&now2-info2.mtimeMs>PARTIAL_MAX_AGE_MS&&await unlink7(join256(folder3,name6)).catch(()=>{})}}function rawBody(req,limit2){return new Promise(
29869
- (resolve56,reject)=>{let chunks=[],bytes4=0;req.on("data",chunk=>{bytes4+=chunk.length,bytes4<=limit2&&chunks.push(chunk)}),req.on("end",()=>resolve56(bytes4>limit2?null:Buffer.concat(chunks))),req.on("error",reject)})}async function realFolders(dataDir,path6){let at8=dataDir;for(let part2 of dirname77(path6).split("/")){at8=join256(at8,part2);let info2=await lstat10(at8).catch(()=>null);if(!info2)await mkdir15(at8,{mode:448}).catch(()=>{});else if(!info2.isDirectory()||info2.isSymbolicLink())return!1}
29870
- return(await lstat10(at8).catch(()=>null))?.isDirectory()===!0}async function sha256Of(full){try{let hash4=createHash118("sha256");for await(let chunk of createReadStream10(full))hash4.update(chunk);return hash4.digest("hex")}catch{return null}}var putSchema=external_exports.object({path:external_exports.string().max(4096),size:external_exports.coerce.number().int().min(0).max(Number.MAX_SAFE_INTEGER),sha256:external_exports.string().regex(SHA3),offset:external_exports.coerce.number().int().min(
29871
- 0),mode:external_exports.enum(["new","replace"]),expect:external_exports.string().regex(SHA3).optional()}),partSchema=external_exports.object({path:external_exports.string().max(4096),offset:external_exports.coerce.number().int().min(0),length:external_exports.coerce.number().int().min(1).max(FILE_PART_BYTES)});async function readPart(dataDir,{path:path6,offset:offset4,length:length3}){let at8=dataDir;for(let part2 of path6.split("/")){at8=join256(at8,part2);let info2=await lstat10(at8).catch(()=>null);
29882
+ reason,...result2.status?{status:result2.status}:{},...extraction})}}init_zod();init_bot_avatar();init_zod();import{createHash as createHash119,randomUUID as randomUUID81}from"node:crypto";import{createReadStream as createReadStream10}from"node:fs";import{link as link4,lstat as lstat10,mkdir as mkdir15,open as open13,readdir as readdir13,rename as rename7,stat as stat14,unlink as unlink7}from"node:fs/promises";import{statfsSync as statfsSync4}from"node:fs";import{dirname as dirname77,join as join257}from"node:path";var FILE_PART_BYTES=8*1024*1024,MAX_FILES3=2e5,PARTIAL_MAX_AGE_MS=1440*60*1e3,SHA3=/^[a-f0-9]{64}$/u,PLACE=/^(?:workspaces\/[\w-]{1,128}|task-workspaces\/[\w-]{1,128}\/[\w-]{1,200})\/./u,CARRIED_OTHERWISE=/^workspaces\/[\w-]{1,128}\/(?:MEMORY\.md$|memory(?:\/|$)|skills(?:\/|$))|^(?:workspaces\/[\w-]{1,128}|task-workspaces\/[\w-]{1,128}\/[\w-]{1,200})\/\.(?:claude|agents|grok)(?:\/|$)/u;function movedFilePath(path6){return PLACE.test(path6)&&validRelative(path6)&&!CARRIED_OTHERWISE.test(path6)&&!omittedFromWorkspaceBackup(
29883
+ path6)&&!path6.split("/").includes("node_modules")}var hashes=new Map;async function fileSha256(full,size3,mtimeMs){let key7=`${full}\0${size3}\0${mtimeMs}`,known=hashes.get(key7);if(known)return known;let hash4=createHash119("sha256");for await(let chunk of createReadStream10(full))hash4.update(chunk);let digest5=hash4.digest("hex");return hashes.size>=MAX_FILES3&&hashes.delete(hashes.keys().next().value),hashes.set(key7,digest5),digest5}async function listBotFiles(dataDir,botIds){let out=[],walk6=async relative27=>{
29884
+ let names5;try{names5=(await readdir13(join257(dataDir,relative27))).sort()}catch{return}for(let name6 of names5){if(out.length>=MAX_FILES3)return;let path6=`${relative27}/${name6}`,info2=await lstat10(join257(dataDir,path6)).catch(()=>null);if(!(!info2||name6==="node_modules")){if(info2.isDirectory()){!CARRIED_OTHERWISE.test(`${path6}/`)&&!omittedFromWorkspaceBackup(path6)&&await walk6(path6);continue}info2.isFile()&&movedFilePath(path6)&&out.push({path:path6,size:info2.size,sha256:await fileSha256(
29885
+ join257(dataDir,path6),info2.size,info2.mtimeMs)})}}};for(let id12 of botIds)/^[\w-]{1,128}$/u.test(id12)&&(await walk6(`workspaces/${id12}`),await walk6(`task-workspaces/${id12}`));return out}function space(dataDir){try{let disk=statfsSync4(dataDir,{bigint:!0}),clamp4=value3=>value3>BigInt(Number.MAX_SAFE_INTEGER)?Number.MAX_SAFE_INTEGER:Number(value3);return{freeBytes:clamp4(disk.bavail*disk.bsize),volumeBytes:clamp4(disk.blocks*disk.bsize)}}catch{return null}}var staging=dataDir=>join257(dataDir,
29886
+ "tmp","move-files"),partialPath=(dataDir,sha2567,size3)=>join257(staging(dataDir),`${sha2567}-${size3}.partial`);async function tidyPartials(dataDir,now2=Date.now()){let folder3=staging(dataDir);for(let name6 of await readdir13(folder3).catch(()=>[])){if(!name6.endsWith(".partial"))continue;let info2=await stat14(join257(folder3,name6)).catch(()=>null);info2&&now2-info2.mtimeMs>PARTIAL_MAX_AGE_MS&&await unlink7(join257(folder3,name6)).catch(()=>{})}}function rawBody(req,limit2){return new Promise(
29887
+ (resolve56,reject)=>{let chunks=[],bytes4=0;req.on("data",chunk=>{bytes4+=chunk.length,bytes4<=limit2&&chunks.push(chunk)}),req.on("end",()=>resolve56(bytes4>limit2?null:Buffer.concat(chunks))),req.on("error",reject)})}async function realFolders(dataDir,path6){let at8=dataDir;for(let part2 of dirname77(path6).split("/")){at8=join257(at8,part2);let info2=await lstat10(at8).catch(()=>null);if(!info2)await mkdir15(at8,{mode:448}).catch(()=>{});else if(!info2.isDirectory()||info2.isSymbolicLink())return!1}
29888
+ return(await lstat10(at8).catch(()=>null))?.isDirectory()===!0}async function sha256Of(full){try{let hash4=createHash119("sha256");for await(let chunk of createReadStream10(full))hash4.update(chunk);return hash4.digest("hex")}catch{return null}}var putSchema=external_exports.object({path:external_exports.string().max(4096),size:external_exports.coerce.number().int().min(0).max(Number.MAX_SAFE_INTEGER),sha256:external_exports.string().regex(SHA3),offset:external_exports.coerce.number().int().min(
29889
+ 0),mode:external_exports.enum(["new","replace"]),expect:external_exports.string().regex(SHA3).optional()}),partSchema=external_exports.object({path:external_exports.string().max(4096),offset:external_exports.coerce.number().int().min(0),length:external_exports.coerce.number().int().min(1).max(FILE_PART_BYTES)});async function readPart(dataDir,{path:path6,offset:offset4,length:length3}){let at8=dataDir;for(let part2 of path6.split("/")){at8=join257(at8,part2);let info2=await lstat10(at8).catch(()=>null);
29872
29890
  if(!info2||info2.isSymbolicLink())return null}let handle2=await open13(at8,"r").catch(()=>null);if(!handle2)return null;try{let buffer=Buffer.alloc(length3),{bytesRead}=await handle2.read(buffer,0,length3,offset4);return buffer.subarray(0,bytesRead)}finally{await handle2.close()}}async function takePart(deps,req,query2){let{path:path6,size:size3,sha256:sha2567,offset:offset4,mode,expect:expect2}=query2,botId=/^(?:workspaces|task-workspaces)\/([\w-]{1,128})\//u.exec(path6)?.[1];if(!movedFilePath(
29873
29891
  path6)||!botId)return{status:400,body:{error:"not a bot file a move carries"}};if(!deps.bots().some(bot=>bot.id===botId))return{status:409,body:{error:"This file's bot is not on My Cloud yet."}};let partial2=partialPath(deps.dataDir,sha2567,size3);await mkdir15(staging(deps.dataDir),{recursive:!0,mode:448});let held4=(await stat14(partial2).catch(()=>null))?.size??0;if(offset4!==held4)return await rawBody(req,0),{status:409,body:{received:held4}};let bytes4=await rawBody(req,Math.min(FILE_PART_BYTES,
29874
- size3-held4));if(!bytes4)return{status:413,body:{error:"the part runs past the file's size",received:held4}};if(bytes4.length){let handle2=await open13(partial2,"a",384);try{await handle2.write(bytes4)}finally{await handle2.close()}}let received=held4+bytes4.length;if(received<size3)return{status:200,body:{received}};if(await sha256Of(partial2)!==sha2567)return await unlink7(partial2).catch(()=>{}),{status:422,body:{error:"the file arrived different from what was sent"}};let target4=join256(deps.
29875
- dataDir,path6);if(!await realFolders(deps.dataDir,path6))return{status:409,body:{conflict:!0}};let there=await lstat10(target4).catch(()=>null);if(there&&!there.isFile())return{status:409,body:{conflict:!0}};if(there&&await sha256Of(target4)===sha2567)return await unlink7(partial2).catch(()=>{}),{status:201,body:{stored:!1}};if(mode==="replace"&&there&&expect2&&await sha256Of(target4)===expect2){let placed=join256(staging(deps.dataDir),`${randomUUID81()}.placing`);return await link4(partial2,placed),
29892
+ size3-held4));if(!bytes4)return{status:413,body:{error:"the part runs past the file's size",received:held4}};if(bytes4.length){let handle2=await open13(partial2,"a",384);try{await handle2.write(bytes4)}finally{await handle2.close()}}let received=held4+bytes4.length;if(received<size3)return{status:200,body:{received}};if(await sha256Of(partial2)!==sha2567)return await unlink7(partial2).catch(()=>{}),{status:422,body:{error:"the file arrived different from what was sent"}};let target4=join257(deps.
29893
+ dataDir,path6);if(!await realFolders(deps.dataDir,path6))return{status:409,body:{conflict:!0}};let there=await lstat10(target4).catch(()=>null);if(there&&!there.isFile())return{status:409,body:{conflict:!0}};if(there&&await sha256Of(target4)===sha2567)return await unlink7(partial2).catch(()=>{}),{status:201,body:{stored:!1}};if(mode==="replace"&&there&&expect2&&await sha256Of(target4)===expect2){let placed=join257(staging(deps.dataDir),`${randomUUID81()}.placing`);return await link4(partial2,placed),
29876
29894
  await rename7(placed,target4),await unlink7(partial2).catch(()=>{}),{status:201,body:{stored:!0}}}if(there)return{status:409,body:{conflict:!0}};try{await link4(partial2,target4)}catch(error66){if(error66.code==="EEXIST")return{status:409,body:{conflict:!0}};throw error66}return await unlink7(partial2).catch(()=>{}),{status:201,body:{stored:!0}}}async function moveFilesRoute(deps,{req,res,path:path6,method:method2,url:url2,auth,json:json7}){if(path6!=="/api/cloud-send/files")return!1;if(res.setHeader(
29877
29895
  "cache-control","no-store"),method2==="GET"&&url2.searchParams.has("path")){let part2=partSchema.safeParse(Object.fromEntries(url2.searchParams)),bytes4=part2.success&&movedFilePath(part2.data.path)?await readPart(deps.dataDir,part2.data):null;return bytes4?(res.writeHead(200,{"content-type":"application/octet-stream","content-length":String(bytes4.length)}),res.end(bytes4),!0):(json7(res,404,{error:"no such bot file"}),!0)}if(method2==="GET")return await tidyPartials(deps.dataDir),json7(res,200,
29878
29896
  {v:1,files:await listBotFiles(deps.dataDir,deps.bots().map(bot=>bot.id)),space:space(deps.dataDir)}),!0;if(method2!=="POST")return json7(res,405,{error:"method not allowed"}),!0;if(!deps.owner(auth))return await rawBody(req,0),json7(res,403,{error:"Only My Cloud's owner can move files into it."}),!0;let query2=putSchema.safeParse(Object.fromEntries(url2.searchParams));if(!query2.success)return await rawBody(req,0),json7(res,400,{error:"send ?path, size, sha256, offset and mode"}),!0;let answer2=await takePart(
29879
29897
  deps,req,query2.data);return json7(res,answer2.status,answer2.body),!0}init_zod();var LEASE_MS=10*6e4,askSchema2=external_exports.object({v:external_exports.literal(1),holder:external_exports.string().regex(/^[\w-]{8,128}$/u),label:external_exports.string().max(120).optional(),release:external_exports.literal(!0).optional()});function createMoveLeases(now2=Date.now){let held4=null;return{ask(holder,label4){return held4&&held4.holder!==holder&&held4.until>now2()?held4:(held4={holder,label:label4||(held4?.holder===holder?held4.label:""),until:now2()+LEASE_MS},null)},
29880
29898
  release(holder){held4?.holder===holder&&(held4=null)},held:()=>held4&&held4.until>now2()?held4:null}}async function moveLeaseRoute(deps,{req,res,path:path6,method:method2,auth,json:json7,readBody:readBody2}){if(path6!=="/api/cloud-send/lease")return!1;if(res.setHeader("cache-control","no-store"),method2!=="POST")return json7(res,405,{error:"method not allowed"}),!0;if(!deps.owner(auth))return req.resume(),json7(res,403,{error:"Only My Cloud's owner can move into it."}),!0;let asked=askSchema2.safeParse(
29881
- await readBody2(req,4096));if(!asked.success)return json7(res,400,{error:"send { v: 1, holder, label }"}),!0;let{holder,label:label4="",release:release3}=asked.data;if(release3)return deps.leases.release(holder),json7(res,200,{v:1,held:!1}),!0;let other=deps.leases.ask(holder,label4.trim());return other?(json7(res,409,{v:1,held:!1,label:other.label,until:other.until}),!0):(json7(res,200,{v:1,held:!0,until:deps.leases.held()?.until??null}),!0)}init_zod();import{createHash as createHash119}from"node:crypto";import{lstatSync as lstatSync46,readdirSync as readdirSync59,readFileSync as readFileSync186}from"node:fs";import{hostname as hostname8}from"node:os";import{join as join257}from"node:path";var SHARED_ROOT="/omb-data",FINISHED=new Set(["completed","failed","cancelled","missed"]),KIND_BODY_MAX2=8*1024*1024,ROUTINE_FIELDS=["name","prompt","target","botId","groupId","runOn","schedule","durationMinutes","timeoutMinutes","attachments","continuity","modelSelection","overlap","runOnStartup","sourceThreadId","resultsThreadId","createdAt","checks","access","deliver"],CALL_FIELDS=["name","description","botIds","schedule","durationMinutes","attachments","roomId","createdAt"],WEBHOOK_FIELDS2=[
29899
+ await readBody2(req,4096));if(!asked.success)return json7(res,400,{error:"send { v: 1, holder, label }"}),!0;let{holder,label:label4="",release:release3}=asked.data;if(release3)return deps.leases.release(holder),json7(res,200,{v:1,held:!1}),!0;let other=deps.leases.ask(holder,label4.trim());return other?(json7(res,409,{v:1,held:!1,label:other.label,until:other.until}),!0):(json7(res,200,{v:1,held:!0,until:deps.leases.held()?.until??null}),!0)}init_zod();import{createHash as createHash120}from"node:crypto";import{lstatSync as lstatSync46,readdirSync as readdirSync59,readFileSync as readFileSync187}from"node:fs";import{hostname as hostname8}from"node:os";import{join as join258}from"node:path";var SHARED_ROOT="/omb-data",FINISHED=new Set(["completed","failed","cancelled","missed"]),KIND_BODY_MAX2=8*1024*1024,ROUTINE_FIELDS=["name","prompt","target","botId","groupId","runOn","schedule","durationMinutes","timeoutMinutes","attachments","continuity","modelSelection","overlap","runOnStartup","sourceThreadId","resultsThreadId","createdAt","checks","access","deliver"],CALL_FIELDS=["name","description","botIds","schedule","durationMinutes","attachments","roomId","createdAt"],WEBHOOK_FIELDS2=[
29882
29900
  "name","prompt","botId","runOn","delivery","groupId","eventTypes","maxPendingRuns","resultsThreadId","createdAt"],APP_EVENT_FIELDS=["name","prompt","botId","runOn","app","event","accountId","config","filter","sourceThreadId"],TEXTS=["prompt","description","output","error"],MOVE_BOT_FIELDS=Object.values(MOVE_BOT_PARTS).flat(),record29=value3=>value3!==null&&typeof value3=="object"&&!Array.isArray(value3),pick7=(source4,names5)=>Object.fromEntries(names5.filter(name6=>source4[name6]!==void 0).map(
29883
- name6=>[name6,structuredClone(source4[name6])])),sha2566=value3=>createHash119("sha256").update(value3).digest("hex"),hashOf=value3=>sha2566(canonicalJson(value3).replaceAll("\\\\","/")).slice(0,24);function rebased(value3,from,to2){let copy6=structuredClone(value3),paths2=restorePaths(from,to2);paths2.fields(copy6);for(let key7 of TEXTS)typeof copy6[key7]=="string"&&(copy6[key7]=paths2.text(copy6[key7]));return copy6}var definitionHash=(value3,names5,dataDir)=>hashOf(rebased(pick7(value3,names5),
29884
- dataDir,SHARED_ROOT));function finishedRuns(routines2,routineId2){return routines2.listRuns().filter(run11=>run11.routineId===routineId2&&FINISHED.has(run11.status)&&run11.triggerSource!=="webhook")}function importedSkillFiles(name6){let root3=join257(IMPORTED_SKILLS_DIR,name6),files2=[],skillMd=null,walk6=(folder3,prefix,depth2)=>{if(depth2>8)return!1;for(let entry2 of readdirSync59(folder3).sort()){let full=join257(folder3,entry2),path6=prefix?`${prefix}/${entry2}`:entry2,info2=lstatSync46(full);
29885
- if(info2.isDirectory()){if(!walk6(full,path6,depth2+1))return!1;continue}if(!info2.isFile())return!1;let content4=readFileSync186(full,"utf8");path6==="SKILL.md"?skillMd=content4:files2.push({path:path6,content:content4,executable:(info2.mode&64)!==0})}return!0};try{if(!walk6(root3,"",0))return null}catch{return null}return skillMd===null?null:{skillMd,files:files2}}function importedSkillHash(skill){let lines=[`SKILL.md ${sha2566(skill.skillMd)}`,...[...skill.files].sort((a,b11)=>a.path.localeCompare(
29901
+ name6=>[name6,structuredClone(source4[name6])])),sha2566=value3=>createHash120("sha256").update(value3).digest("hex"),hashOf=value3=>sha2566(canonicalJson(value3).replaceAll("\\\\","/")).slice(0,24);function rebased(value3,from,to2){let copy6=structuredClone(value3),paths2=restorePaths(from,to2);paths2.fields(copy6);for(let key7 of TEXTS)typeof copy6[key7]=="string"&&(copy6[key7]=paths2.text(copy6[key7]));return copy6}var definitionHash=(value3,names5,dataDir)=>hashOf(rebased(pick7(value3,names5),
29902
+ dataDir,SHARED_ROOT));function finishedRuns(routines2,routineId2){return routines2.listRuns().filter(run11=>run11.routineId===routineId2&&FINISHED.has(run11.status)&&run11.triggerSource!=="webhook")}function importedSkillFiles(name6){let root3=join258(IMPORTED_SKILLS_DIR,name6),files2=[],skillMd=null,walk6=(folder3,prefix,depth2)=>{if(depth2>8)return!1;for(let entry2 of readdirSync59(folder3).sort()){let full=join258(folder3,entry2),path6=prefix?`${prefix}/${entry2}`:entry2,info2=lstatSync46(full);
29903
+ if(info2.isDirectory()){if(!walk6(full,path6,depth2+1))return!1;continue}if(!info2.isFile())return!1;let content4=readFileSync187(full,"utf8");path6==="SKILL.md"?skillMd=content4:files2.push({path:path6,content:content4,executable:(info2.mode&64)!==0})}return!0};try{if(!walk6(root3,"",0))return null}catch{return null}return skillMd===null?null:{skillMd,files:files2}}function importedSkillHash(skill){let lines=[`SKILL.md ${sha2566(skill.skillMd)}`,...[...skill.files].sort((a,b11)=>a.path.localeCompare(
29886
29904
  b11.path)).map(file3=>`${file3.executable?"x":"-"} ${file3.path} ${sha2566(file3.content)}`)];return sha2566(lines.join(`
29887
29905
  `)).slice(0,24)}function importedSkills(deps){let out=[];for(let[name6,entry2]of Object.entries(readImportedSkills())){let files2=importedSkillFiles(name6);if(!files2)continue;let{filesSha256:_files,importedAt:_at,...kept2}=entry2;out.push({name:name6,entry:kept2,...files2})}let held4=new Set(out.map(skill=>skill.name));for(let skill of deps.claudeCodeSkills())held4.has(skill.name)||out.push(skill);return out}function librarySkills(){return Object.values(readSkillLibraryIndex()).flatMap(entry2=>{
29888
29906
  let text30=readLibrarySkillFile(entry2.name);return text30===null?[]:[{entry:entry2,text:text30}]})}function moveBotParts(bot,hash4){let fields2=bot;return Object.fromEntries(Object.entries(MOVE_BOT_PARTS).map(([part2,names5])=>[part2,hash4(names5.length===1?fields2[names5[0]]:Object.fromEntries(names5.map(name6=>[name6,fields2[name6]])))]))}function moveItems(deps,bots,only2){let items=[],add11=(kind2,id12,label4,parts3,bot)=>items.push({key:itemKey.moved(kind2,id12),kind:kind2,label:label4.slice(
@@ -29918,9 +29936,9 @@ s being replaced."),held4&&held4.sha256!==sha2566(text30)&&held4.reviewState!==e
29918
29936
  string().max(120).optional(),sourceDefault:external_exports.boolean().optional()});function thisComputerName(){return(process.env.OMB_ENVIRONMENT_LABEL?.trim()||hostname8()).replace(/\.local$/iu,"").slice(0,120)}async function moveKindsRoute(deps,{req,res,path:path6,method:method2,url:url2,auth,json:json7,readBody:readBody2}){if(path6!=="/api/cloud-send/kind")return!1;res.setHeader("cache-control","no-store");try{if(method2==="GET"){let key7=parseKey(url2.searchParams.get("key")),found2=key7&&kindRecord(
29919
29937
  deps,key7.kind,key7.id);return found2?json7(res,200,{v:1,dataDir:deps.dataDir,...key7.kind==="bot"?{computer:thisComputerName()}:{},...found2}):json7(res,404,{error:"not here"}),!0}if(method2==="PUT"){let owner2=deps.owner(auth);if(!owner2)return json7(res,403,{error:"Only My Cloud's owner can move things into it."}),!0;let body2=putSchema2.safeParse(await readBody2(req,KIND_BODY_MAX2)),key7=body2.success?parseKey(body2.data.key):null;return!body2.success||!key7?(json7(res,400,{error:"send { v: \
29920
29938
  1, key, dataDir, record }"}),!0):(await adopt2(deps,key7.kind,key7.id,body2.data.record,body2.data.runs,body2.data.dataDir,owner2,{computer:body2.data.computer,defaultBot:body2.data.sourceDefault}),json7(res,200,{v:1,ok:!0}),!0)}if(method2==="DELETE"){let key7=parseKey(url2.searchParams.get("key"));return key7?.kind!=="app-event"?(json7(res,400,{error:"only an app event My Cloud now collects is let go of here"}),!0):(json7(res,200,{v:1,removed:await(deps.appEvents()?.remove(key7.id)??!1)}),!0)}json7(
29921
- res,405,{error:"method not allowed"})}catch(error66){let status5=error66 instanceof Refused||Number.isInteger(error66.status)?error66.status:500;json7(res,status5,{error:error66.message?.slice(0,300)||"It could not be moved.",...error66 instanceof Refused&&error66.final?{final:!0}:{}})}return!0}init_zod();import{createHash as createHash120}from"node:crypto";var MEMORY_BODY_MAX=16*1024*1024,JOURNAL_ROWS=500,FRONTMATTER=/^---\n[\s\S]*?\n---\n/u;function blocks(text30){let lines=text30.split(`
29939
+ res,405,{error:"method not allowed"})}catch(error66){let status5=error66 instanceof Refused||Number.isInteger(error66.status)?error66.status:500;json7(res,status5,{error:error66.message?.slice(0,300)||"It could not be moved.",...error66 instanceof Refused&&error66.final?{final:!0}:{}})}return!0}init_zod();import{createHash as createHash121}from"node:crypto";var MEMORY_BODY_MAX=16*1024*1024,JOURNAL_ROWS=500,FRONTMATTER=/^---\n[\s\S]*?\n---\n/u;function blocks(text30){let lines=text30.split(`
29922
29940
  `),entries4=new Map(parseMemoryEntries(text30).map(entry2=>[entry2.line,entry2])),out=[];for(let line6=0;line6<lines.length;){let entry2=entries4.get(line6);if(entry2){out.push({text:lines.slice(entry2.line,entry2.end).join(`
29923
- `),identity:`e:${factIdentity(entry2.body)}`}),line6=entry2.end;continue}lines[line6].trim()&&out.push({text:lines[line6],identity:`l:${factIdentity(lines[line6].replace(/~~/gu,""))}`}),line6+=1}return out}function memoryLines(text30){let body2=text30.replace(FRONTMATTER,"");return[...new Set(blocks(body2).map(block=>createHash120("sha256").update(block.identity).digest("hex").slice(0,12)))]}function mergeMemoryText(theirs,mine){if(!theirs.trim())return mine;let front=FRONTMATTER.exec(mine)?.[0]??
29941
+ `),identity:`e:${factIdentity(entry2.body)}`}),line6=entry2.end;continue}lines[line6].trim()&&out.push({text:lines[line6],identity:`l:${factIdentity(lines[line6].replace(/~~/gu,""))}`}),line6+=1}return out}function memoryLines(text30){let body2=text30.replace(FRONTMATTER,"");return[...new Set(blocks(body2).map(block=>createHash121("sha256").update(block.identity).digest("hex").slice(0,12)))]}function mergeMemoryText(theirs,mine){if(!theirs.trim())return mine;let front=FRONTMATTER.exec(mine)?.[0]??
29924
29942
  "",known=new Set(blocks(theirs.replace(FRONTMATTER,"")).map(block=>block.identity)),adding=[];for(let block of blocks(mine.slice(front.length)))known.has(block.identity)||(known.add(block.identity),adding.push(block.text));let base2=!FRONTMATTER.test(theirs)&&front?`${front}${theirs}`:theirs;return adding.length?`${base2.replace(/\s*$/u,"")}
29925
29943
  ${adding.join(`
29926
29944
  `)}
@@ -29936,8 +29954,8 @@ nd { v: 1, bot, files, journal } or { v: 1, about, teams }"}),!0)}function memor
29936
29954
  [],counts=sources2.heads(),leaves=activeLeaves(),conversations2=chatHeads(only2!==void 0?store5.bots.filter(bot=>bot.id===only2):chosen?store5.bots.filter(bot=>chosen.has(bot.id)):store5.bots,rooms).map(head=>({threadId:head.threadId,...head.bot?{bot:head.bot}:{room:head.room},rows:counts.get(head.threadId)?.rows??0,newest:head.lastId,leaf:leaves.get(head.threadId)??head.lastId,settings:conversationSettings(store5,head)})),attachments=sources2.attachments===!1?{}:{attachments:[...attachmentNamesOf(
29937
29955
  new Set(conversations2.map(head=>head.threadId)),sources2.dataDir)].sort()},files2=sources2.files===!1?{}:{files:await listBotFiles(sources2.dataDir,sent)};return only2!==void 0?{v:1,appVersion:summary3.appVersion,items:summary3.items,memory:[],journal:[],learned:[],forgotten:[],teams:[],rooms:[],connections:[],conversations:conversations2,...attachments,...files2,automations:sources2.kinds?automationSwitches(sources2.kinds,only2):[],runs:sources2.kinds?routineRunIds(sources2.kinds,only2):[]}:{v:1,
29938
29956
  appVersion:summary3.appVersion,items:summary3.items,memory:sent.flatMap(memoryOf),journal:sent.map(bot=>({bot,ids:journalIds(bot)})).filter(entry2=>entry2.ids.length),learned:[...new Set(learnedState().learned.map(fact=>factIdentity(fact.text)).filter(Boolean))].sort(),forgotten:[...new Set(learnedState().removed)].sort(),teams:sources2.teamMemory?teamsHere(sources2.teamMemory).map(team=>({section:team.section,context:team.context===null?null:memoryLines(team.context),memory:team.memory.map(entry2=>entry2.
29939
- key??`${entry2.kind}:${entry2.name.toLowerCase()}`).sort()})):[],rooms:rooms.map(room=>({id:room.id,name:room.name,members:[...room.memberIds].sort(),threads:room.tasks?.length?room.tasks.map(task2=>task2.threadId):[room.threadId]})),connections:(await sources2.connections()).map(item=>item.id).sort(),conversations:conversations2,...attachments,...files2,automations:sources2.kinds?automationSwitches(sources2.kinds):[],runs:sources2.kinds?routineRunIds(sources2.kinds):[]}}import{createHash as createHash121}from"node:crypto";var TEAM_HELD_PARTS=["chief","helper"];function empty2(value3){return value3==null||value3===""?!0:Array.isArray(value3)?value3.length===0:typeof value3=="object"&&Object.keys(value3).length===0}function partHash2(value3){if(empty2(value3))return EMPTY3;let kept2=typeof value3=="object"&&!Array.isArray(value3)?Object.fromEntries(Object.entries(value3).filter(([,field5])=>!empty2(field5))):value3;return empty2(kept2)?EMPTY3:createHash121("sha256").update(canonicalJson(kept2)).digest("hex").slice(
29940
- 0,24)}var pictureHashes=new Map;function pictureHash(avatarUrl,picture2){let known=pictureHashes.get(avatarUrl);if(known)return known;let bytes4=picture2(avatarUrl);if(!bytes4)return EMPTY3;let hash4=createHash121("sha256").update(bytes4).digest("hex").slice(0,24);return pictureHashes.size>1e3&&pictureHashes.clear(),pictureHashes.set(avatarUrl,hash4),hash4}function botParts(bot,picture2){let fields2=bot,parts3={};for(let[part2,names5]of Object.entries(BOT_PARTS))parts3[part2]=partHash2(names5.length===
29957
+ key??`${entry2.kind}:${entry2.name.toLowerCase()}`).sort()})):[],rooms:rooms.map(room=>({id:room.id,name:room.name,members:[...room.memberIds].sort(),threads:room.tasks?.length?room.tasks.map(task2=>task2.threadId):[room.threadId]})),connections:(await sources2.connections()).map(item=>item.id).sort(),conversations:conversations2,...attachments,...files2,automations:sources2.kinds?automationSwitches(sources2.kinds):[],runs:sources2.kinds?routineRunIds(sources2.kinds):[]}}import{createHash as createHash122}from"node:crypto";var TEAM_HELD_PARTS=["chief","helper"];function empty2(value3){return value3==null||value3===""?!0:Array.isArray(value3)?value3.length===0:typeof value3=="object"&&Object.keys(value3).length===0}function partHash2(value3){if(empty2(value3))return EMPTY3;let kept2=typeof value3=="object"&&!Array.isArray(value3)?Object.fromEntries(Object.entries(value3).filter(([,field5])=>!empty2(field5))):value3;return empty2(kept2)?EMPTY3:createHash122("sha256").update(canonicalJson(kept2)).digest("hex").slice(
29958
+ 0,24)}var pictureHashes=new Map;function pictureHash(avatarUrl,picture2){let known=pictureHashes.get(avatarUrl);if(known)return known;let bytes4=picture2(avatarUrl);if(!bytes4)return EMPTY3;let hash4=createHash122("sha256").update(bytes4).digest("hex").slice(0,24);return pictureHashes.size>1e3&&pictureHashes.clear(),pictureHashes.set(avatarUrl,hash4),hash4}function botParts(bot,picture2){let fields2=bot,parts3={};for(let[part2,names5]of Object.entries(BOT_PARTS))parts3[part2]=partHash2(names5.length===
29941
29959
  1?fields2[names5[0]]:Object.fromEntries(names5.map(name6=>[name6,fields2[name6]])));return parts3[PICTURE_PART]=bot.avatarUrl?pictureHash(bot.avatarUrl,picture2):EMPTY3,parts3}function unused(bot,skills,greetingOnly,inRoom=()=>!1,automated=()=>!1){return!bot.soul?.trim()&&!bot.title&&!bot.description&&!bot.avatarUrl&&!bot.sidebarHidden&&!bot.welcomed&&skills===0&&(bot.tasks?.length??1)<=1&&greetingOnly(bot.threadId,bot.name)&&!inRoom(bot.id)&&!automated(bot.id)}function cloudSendSummary(sources2,{
29942
29960
  move:move3=!1,bot:only2,bots:chosen,leaving=!1}={}){let items=[],carried2=new Set;for(let bot of sources2.bots()){if(only2!==void 0&&bot.id!==only2||chosen&&!chosen.has(bot.id)||leaving&&bot.movedTo?.state==="moved")continue;let skills=sources2.skills(bot);if(only2===void 0&&unused(bot,skills.length,sources2.greetingOnly,sources2.inRoom,move3?sources2.automated:void 0))continue;carried2.add(bot.id);let parts3={...botParts(bot,sources2.picture),...move3&&sources2.move?sources2.move.botParts(bot):
29943
29961
  {}};if(only2!==void 0)for(let part2 of TEAM_HELD_PARTS)delete parts3[part2];items.push({key:itemKey.bot(bot.id),kind:"bot",label:bot.name,id:bot.id,parts:parts3});for(let skill of skills)items.push({key:itemKey.skill(bot.id,skill.name),kind:"skill",label:skill.name,id:skill.name,bot:bot.id,parts:{text:skill.sha256.slice(0,24)||EMPTY3,on:skill.enabled?"on":"off"}})}if(only2!==void 0){let bot=sources2.bots().find(candidate=>candidate.id===only2);return move3&&sources2.move&&bot&&items.push(...sources2.
@@ -29952,9 +29970,9 @@ deps.cloudHome&&deps.automations&&await automationsOffRoute({automations:deps.au
29952
29970
  ...bot?{bot}:{},...scope?{bots:scope}:{}}),store:deps.chats.store,dataDir:deps.chats.dataDir,connections:deps.connections??(async()=>[]),heads:threadHeads,...move3?{kinds:move3,teamMemory:move3.teamMemory}:{},...bot?{bot}:{},attachments:url2.searchParams.get("attachments")!=="0",files:url2.searchParams.get("files")!=="0",...scope?{scope}:{}})})):json7(res,404,{error:"not found"});if(path6==="/api/cloud-send/verify-secrets"){if(!home2||!deps.connectionFingerprints)return json7(res,404,{error:"not\
29953
29971
  found"});if(method2!=="POST")return json7(res,405,{error:"method not allowed"});let asked=external_exports.object({nonce:external_exports.string().regex(VERIFY_NONCE)}).safeParse(await readBody2(req,4096));return asked.success?(res.setHeader("cache-control","no-store"),json7(res,200,{v:1,vault:1,secrets:{...loginFingerprints(asked.data.nonce,deps.logins),...deps.connectionFingerprints(asked.data.nonce)}})):json7(res,400,{error:"send { nonce }: at least 32 random bytes, base64url"})}if(path6!=="\
29954
29972
  /api/cloud-send")return PASS;if(method2!=="GET")return json7(res,405,{error:"method not allowed"});res.setHeader("cache-control","no-store");let summary3=cloudSendSummary(sources2,{move:url2.searchParams.get("move")==="1",leaving:!home2,...bot?{bot}:{},...scope?{bots:scope}:{}}),item=url2.searchParams.get("item"),items=item===null?summary3.items:summary3.items.filter(entry2=>entry2.key===item||entry2.kind==="skill"&&item===`bot:${entry2.bot}`);return json7(res,200,{...summary3,items,vault:1,...deps.
29955
- chats?{chats:1}:{}})}}import{hostname as hostname9}from"node:os";import{join as join258}from"node:path";init_mcp_registry();init_tool_scope();init_atomic();import{readFileSync as readFileSync187}from"node:fs";init_mcp_registry();function stayedConnectors(servers,programs){return Object.entries(servers??{}).flatMap(([name6,raw])=>{let parsed2=parseStoredMcpServer(name6,raw);if(!parsed2.ok||!parsed2.server.enabled||!parsed2.server.runsOn)return[];let server2=parsed2.server,remote=isRemoteMcpServer(server2),program=remote?"":launcherOf(server2.command),why=isMailConnector(server2)?{kind:"mail"}:!remote&&!/[\\/]/u.test(server2.command)&&!programs.includes(program)?{kind:"program",program}:{kind:"here"};return[{name:name6,computer:server2.
29973
+ chats?{chats:1}:{}})}}import{hostname as hostname9}from"node:os";import{join as join259}from"node:path";init_mcp_registry();init_tool_scope();init_atomic();import{readFileSync as readFileSync188}from"node:fs";init_mcp_registry();function stayedConnectors(servers,programs){return Object.entries(servers??{}).flatMap(([name6,raw])=>{let parsed2=parseStoredMcpServer(name6,raw);if(!parsed2.ok||!parsed2.server.enabled||!parsed2.server.runsOn)return[];let server2=parsed2.server,remote=isRemoteMcpServer(server2),program=remote?"":launcherOf(server2.command),why=isMailConnector(server2)?{kind:"mail"}:!remote&&!/[\\/]/u.test(server2.command)&&!programs.includes(program)?{kind:"program",program}:{kind:"here"};return[{name:name6,computer:server2.
29956
29974
  runsOn.label,runsOn:server2.runsOn,why,...!remote&&server2.bot?{bot:server2.bot}:{}}]})}function stayedWhyText(stayed){return stayed.why.kind==="mail"?`a mail connector keeps its accounts on ${stayed.computer}, and a bot here cannot reach a mail server through it; the email tools do that job here, and request_credential with credential_id email connects them`:stayed.why.kind==="program"?`it needs ${stayed.why.program}, which this Cloud does not have`:`it uses files or an address only ${stayed.computer}\
29957
- has`}function stayedLine(language,stayed){let{name:name6,computer,why}=stayed;return why.kind==="mail"?serverLine(language,"server.moves.connectorStayedMail",{name:name6,computer}):why.kind==="program"?serverLine(language,"server.moves.connectorStayedProgram",{name:name6,computer,program:why.program}):serverLine(language,"server.moves.connectorStayedHere",{name:name6,computer})}function createStayedNotices(deps){let told2=null,record31=()=>{if(told2)return told2;try{told2=JSON.parse(readFileSync187(
29975
+ has`}function stayedLine(language,stayed){let{name:name6,computer,why}=stayed;return why.kind==="mail"?serverLine(language,"server.moves.connectorStayedMail",{name:name6,computer}):why.kind==="program"?serverLine(language,"server.moves.connectorStayedProgram",{name:name6,computer,program:why.program}):serverLine(language,"server.moves.connectorStayedHere",{name:name6,computer})}function createStayedNotices(deps){let told2=null,record31=()=>{if(told2)return told2;try{told2=JSON.parse(readFileSync188(
29958
29976
  deps.file,"utf8"))}catch{told2={}}return told2},key7=stayed2=>`${stayed2.computer}\0${stayed2.name}`,known=(stayed2,bot)=>record31()[key7(stayed2)]?.includes(bot.id)===!0,remember4=(stayed2,bot)=>{let all3=record31();(all3[key7(stayed2)]??=[]).push(bot.id);try{writeFileAtomic(deps.file,JSON.stringify(all3),{mode:384})}catch(error66){console.warn("[connections] could not save what was said about what stayed:",error66)}},stayed=()=>stayedConnectors(deps.servers(),deps.programs()).filter(connector=>(connector.
29959
29977
  why.kind!=="mail"||!deps.mailConnected?.())&&!deps.lent?.(connector.runsOn)),serves=(bot,connector)=>(connector.bot?connector.bot===bot.id:!bot.mcpServers||bot.mcpServers.includes(connector.name))&&canUseMcpServer(bot.toolScope,connector.name);return{moved(language){let left2=stayed().filter(connector=>!deps.bots().some(bot=>known(connector,bot)));if(!left2.length)return;let bots=deps.bots(),speaker2=bots.find(bot=>bot.chiefOfStaff&&left2.some(connector=>serves(bot,connector)))??bots.find(bot=>left2.
29960
29978
  some(connector=>serves(bot,connector)));if(!speaker2)return;let lines=left2.filter(connector=>serves(speaker2,connector)),link5=lines.some(connector=>connector.why.kind==="mail")?`
@@ -29967,7 +29985,7 @@ failedAt=Date.now()}).finally(()=>{reading=null})),slugs.flatMap(slug3=>{let ent
29967
29985
  let granted=bot.composio===!1?[]:Object.keys(bot.connectorTools??{}),apps2=connected(granted.filter(slug3=>SLUG4.test(slug3))).filter(([,on3])=>!on3).map(([slug3])=>toolkitName(slug3.toUpperCase())),from=sources2.movedFrom?.()??null;return[from?` You moved to My Cloud from the person's computer ${from}, with everything in Limix Bot. What lives outside Limix Bot stayed on ${from}: its other folders and files, passkeys, the person's own browser sessions and apps, Local VM disks and model servers o\
29968
29986
  n its home network. When a task needs one, use ${from} if it is lent to My Cloud and online; otherwise say in plain words that it stayed there.`:"",toConnect.length?` Not connected on My Cloud yet: ${toConnect.join("; ")}. When a task needs one, say in plain words that it needs the person once on My Cloud and give its link; do not try another way.`:"",apps2.length?` Assigned to this bot but not connected on My Cloud yet: ${apps2.join(", ")}. When a task needs one, call COMPOSIO_MANAGE_CONNECTION\
29969
29987
  S for it, which shows the person a card to connect it, and end the turn.`:"",...lent?lent.size?[` Runs on the person's own computer and can't be reached now: ${[...lent.values()].join(" ")} If a task needs one, tell the person that in plain words, and do not write your own replacement.`]:[]:[...elsewhere].map(([computer,names5])=>` Runs only on the person's computer ${computer}, not on My Cloud: ${names5.join("; ")}. It worked there before the bots moved here. If a task needs one, tell the perso\
29970
- n in plain words that it stayed on ${computer} and why, not that it was never set up, and do not write your own replacement.`)].join("")}}init_zod();import{createHash as createHash122}from"node:crypto";init_config3();var meSchema=external_exports.object({installationId:external_exports.string().min(1),user:external_exports.string().regex(/^[0-9a-f]{24}$/u).optional(),shared:external_exports.boolean().optional()}),IDENTITY_TTL_MS=10*6e4,APPS_TTL_MS=10*6e4,ownDigest=userId=>createHash122("sha256").update(`omb-composio-own:${userId}`).digest("hex").slice(0,24),identity8=null,apps=null,appsReading=null;function forgetComposioIdentity(){identity8=null,apps=null}async function brokerFetch(path6,init2={}){
29988
+ n in plain words that it stayed on ${computer} and why, not that it was never set up, and do not write your own replacement.`)].join("")}}init_zod();import{createHash as createHash123}from"node:crypto";init_config3();var meSchema=external_exports.object({installationId:external_exports.string().min(1),user:external_exports.string().regex(/^[0-9a-f]{24}$/u).optional(),shared:external_exports.boolean().optional()}),IDENTITY_TTL_MS=10*6e4,APPS_TTL_MS=10*6e4,ownDigest=userId=>createHash123("sha256").update(`omb-composio-own:${userId}`).digest("hex").slice(0,24),identity8=null,apps=null,appsReading=null;function forgetComposioIdentity(){identity8=null,apps=null}async function brokerFetch(path6,init2={}){
29971
29989
  let access2=brokerAccess();if(!access2)throw new Error("The connected-apps service is unavailable.");return fetch(`${access2.url}${path6}`,{...init2,redirect:"error",signal:AbortSignal.timeout(2e4),headers:{authorization:`Bearer ${access2.token}`,...init2.body?{"content-type":"application/json"}:{}}})}async function managedMe(){let access2=brokerAccess();if(!access2)return null;if(identity8&&identity8.token===access2.token&&Date.now()-identity8.at<IDENTITY_TTL_MS)return identity8.value;let response=await brokerFetch(
29972
29990
  "/v1/me");if(!response.ok)return await response.body?.cancel(),null;let parsed2=meSchema.safeParse(await response.json().catch(()=>null));if(!parsed2.success)return null;let value3={installationId:parsed2.data.installationId,...parsed2.data.user?{user:parsed2.data.user}:{},shared:parsed2.data.shared===!0};return identity8={token:access2.token,at:Date.now(),value:value3},value3}function connectedApps(cfg2,key7){return!(apps&&apps.key===key7&&Date.now()-apps.at<APPS_TTL_MS)&&!appsReading&&(appsReading=
29973
29991
  connectedServices(cfg2).then(services2=>{apps={key:key7,at:Date.now(),slugs:Object.entries(services2).filter(([,state])=>state.connected).map(([slug3])=>slug3).sort()}}).catch(()=>{}).finally(()=>{appsReading=null})),apps?.key===key7?apps.slugs:void 0}async function composioIdentity(cfg2){let mode=connectionMode(cfg2);if(mode==="self-hosted"){let userId=cfg2.composio?.userId;return userId?{mode:"own",account:`own:${ownDigest(userId)}`,shared:!1,apps:connectedApps(cfg2,`own:${userId}`)}:null}if(mode!==
@@ -29983,13 +30001,13 @@ return adopted2.ok?json7(res,200,{[adopted2.outcome]:!0}):json7(res,adopted2.sta
29983
30001
  outcome;try{outcome="share"in asked?await deps.adoptShare(asked.share):await deps.adoptOwn(asked.apiKey,asked.userId)}catch(error66){return json7(res,502,{error:error66 instanceof Error&&error66.message?error66.message.slice(0,300):"Connected apps could not be shared."})}if("shared"in outcome)return json7(res,200,{shared:!0});let wanted=[...new Set(asked.apps??[])],connected=wanted.length?await deps.composioConnected(wanted).catch(()=>({})):{};return json7(res,200,{kept:!0,missing:wanted.filter(
29984
30002
  slug3=>connected[slug3]!==!0)})}}var managedService=()=>{try{return brokerAccess()!==null}catch{return!1}};function createCloudConnectionsHost(deps){let label4=(process.env.OMB_ENVIRONMENT_LABEL?.trim()||hostname9()).slice(0,120).trim()||"the person's computer",computer={environmentId:deps.environmentId,label:label4},commands=null,mcpAuth=(name6,url2)=>deps.mcpOAuth.authState(name6,url2),sources2=()=>({config:deps.config(),mcpSignIn:(name6,url2)=>deps.mcpOAuth.signInRecord(name6,url2),email:()=>deps.email?.accounts()??[],...deps.
29985
30003
  mcpKeys?{mcpKeys:deps.mcpKeys}:{}}),composioConnected=async slugs=>Object.fromEntries(Object.entries(await connectionStatus(deps.config(),slugs)).map(([slug3,state])=>[slug3,state.connected])),programs=()=>commands??=launchersOnPath(),prompt=deps.cloudHome?createConnectionPrompt({mcpServers:()=>deps.config().mcpServers,mcpAuth,programs,composioConnected,movedFrom:()=>deps.dataDir?movedFrom(deps.dataDir)?.computer??null:null},deps.cloudHome.publicOrigin):null,stayed=deps.cloudHome&&deps.dataDir&&
29986
- deps.stayedNotices?createStayedNotices({...deps.stayedNotices,origin:deps.cloudHome.publicOrigin,file:join258(deps.dataDir,"connectors-stayed-told.json"),servers:()=>deps.config().mcpServers,programs,mailConnected:()=>(deps.email?.accounts().length??0)>0}):null,connections=async()=>{let cfg2=deps.config();return listConnections({config:cfg2,mcpAuth,composio:await composioIdentity(cfg2).catch(()=>null),email:()=>deps.email?.accounts()??[]})};return{connections,fingerprints:nonce=>connectionFingerprints(
30004
+ deps.stayedNotices?createStayedNotices({...deps.stayedNotices,origin:deps.cloudHome.publicOrigin,file:join259(deps.dataDir,"connectors-stayed-told.json"),servers:()=>deps.config().mcpServers,programs,mailConnected:()=>(deps.email?.accounts().length??0)>0}):null,connections=async()=>{let cfg2=deps.config();return listConnections({config:cfg2,mcpAuth,composio:await composioIdentity(cfg2).catch(()=>null),email:()=>deps.email?.accounts()??[]})};return{connections,fingerprints:nonce=>connectionFingerprints(
29987
30005
  nonce,sources2()),routes:createCloudConnectionRoutes({cloudHome:deps.cloudHome!==null,...deps.ownHome?{ownHome:deps.ownHome}:{},...deps.cloudHome?.team?{personalRefusal:what=>personalConnectionRefusal(deps.cloudHome.team,what)}:{},async list(){return{computer,connections:await connections(),engines:await deps.engines().catch(()=>[]),commands:programs(),...deps.cloudHome?.team?{}:{vaultKeys:!0},...deps.cloudHome===null&&!managedService()?{managedApps:!1}:{}}},adoptShare:adoptComposioShare,adoptOwn:(apiKey,userId)=>adoptOwnComposio(
29988
30006
  deps.config(),apiKey,userId),composioConnected,adoptSignIn(name6,record31,replaces){let raw=deps.config().mcpServers?.[name6],parsed2=raw===void 0?null:parseStoredMcpServer(name6,raw);return!parsed2?.ok||!isRemoteMcpServer(parsed2.server)?{ok:!1,status:404,error:"This MCP server is not here yet."}:parsed2.server.url!==record31.url?{ok:!1,status:409,error:"This MCP server has another address here."}:{ok:!0,outcome:deps.mcpOAuth.adopt(name6,parsed2.server.url,record31,replaces?current3=>signInDigest(
29989
30007
  current3.tokens)===replaces:void 0)}},...deps.email?{adoptEmail:deps.email.adopt}:{},holdKeys:engines=>deps.heldKeys?.hold(engines)??!1}),async handoff(what){if(what.kind==="composio-share")try{return{ok:!0,share:{code:await composioShareCode(what.for)}}}catch(error66){return{ok:!1,error:error66 instanceof Error&&error66.message?error66.message.slice(0,300):"Connected apps could not be shared."}}return what.kind==="connection-fingerprints"?{ok:!0,secrets:connectionFingerprints(what.nonce,sources2())}:
29990
30008
  what.kind==="connection-release"?releaseConnection(what.id,what.digest,{...sources2(),forgetSignIn:name6=>deps.mcpOAuth.forget(name6)}):answerConnection(what.id,sources2())},prompt:(bot,lent)=>prompt?.(bot,lent)??"",moved:language=>stayed?.moved(language),personTurn:(bot,threadId)=>stayed?.personTurn(bot,threadId)}}function createUpdateCheckRoutes(deps){return async({res,path:path6,method:method2,json:json7})=>{if(path6!=="/api/updates/check"||method2!=="GET")return PASS;try{return json7(res,200,await deps.check())}catch(error66){return json7(res,502,{error:`Could not check for updates: ${error66 instanceof Error?error66.message:String(error66)}`})}}}function serverUpdateChecker(where2){return createUpdateChecker({current:serverVersion(),install:installKind({...where2,serverRoot:SERVER_ROOT}),channel:updateChannel()})}function seatCount(list10,sessions2){let people=new Set;for(let entry2 of[...list10.admins,...list10.members])entry2.startsWith("@")||people.add(entry2.trim().toLowerCase());let paired=!1,ownerKnown=list10.admins.some(entry2=>!entry2.startsWith("@"));for(let session of sessions2)session.token||(session.email?(people.add(session.email.trim().toLowerCase()),session.scopes?.includes("admin")&&(ownerKnown=!0)):paired=!0);return people.size+(paired&&!ownerKnown?1:0)}function createSeatsRoutes(deps){return async({
29991
- res,path:path6,method:method2,json:json7})=>path6!=="/api/seats"||method2!=="GET"?PASS:json7(res,200,{seats:seatCount(deps.signInList(),deps.sessions())})}init_atomic();import{readFileSync as readFileSync188}from"node:fs";import{join as join259}from"node:path";var TIME_ZONE_FILE="time-zone.json";function knownTimeZone(value3){if(typeof value3!="string"||value3.length>64||value3!=="UTC"&&!/^[A-Za-z][\w+-]*(\/[\w+-]+){1,2}$/.test(value3))return null;try{return new Intl.DateTimeFormat("en-US",{timeZone:value3}),value3}catch{return null}}function currentTimeZone(env=process.env){return knownTimeZone(env.TZ)??(Intl.DateTimeFormat().resolvedOptions().timeZone||
29992
- "UTC")}function adoptSavedTimeZone(dataDir,env=process.env){let saved;try{saved=JSON.parse(readFileSync188(join259(dataDir,TIME_ZONE_FILE),"utf8"))?.timeZone}catch{return null}let zone=knownTimeZone(saved);return zone&&(env.TZ=zone),zone}function useTimeZone(dataDir,zone,env=process.env){return env.TZ===zone?!1:(writeFileAtomic(join259(dataDir,TIME_ZONE_FILE),`${JSON.stringify({version:1,timeZone:zone})}
30009
+ res,path:path6,method:method2,json:json7})=>path6!=="/api/seats"||method2!=="GET"?PASS:json7(res,200,{seats:seatCount(deps.signInList(),deps.sessions())})}init_atomic();import{readFileSync as readFileSync189}from"node:fs";import{join as join260}from"node:path";var TIME_ZONE_FILE="time-zone.json";function knownTimeZone(value3){if(typeof value3!="string"||value3.length>64||value3!=="UTC"&&!/^[A-Za-z][\w+-]*(\/[\w+-]+){1,2}$/.test(value3))return null;try{return new Intl.DateTimeFormat("en-US",{timeZone:value3}),value3}catch{return null}}function currentTimeZone(env=process.env){return knownTimeZone(env.TZ)??(Intl.DateTimeFormat().resolvedOptions().timeZone||
30010
+ "UTC")}function adoptSavedTimeZone(dataDir,env=process.env){let saved;try{saved=JSON.parse(readFileSync189(join260(dataDir,TIME_ZONE_FILE),"utf8"))?.timeZone}catch{return null}let zone=knownTimeZone(saved);return zone&&(env.TZ=zone),zone}function useTimeZone(dataDir,zone,env=process.env){return env.TZ===zone?!1:(writeFileAtomic(join260(dataDir,TIME_ZONE_FILE),`${JSON.stringify({version:1,timeZone:zone})}
29993
30011
  `,{mode:384}),env.TZ=zone,!0)}function createTimeZoneRoutes(deps){return deps.adopts&&adoptSavedTimeZone(deps.dataDir),async({req,res,path:path6,method:method2,json:json7,readBody:readBody2})=>{if(path6!=="/api/time-zone")return PASS;if(method2==="GET")return json7(res,200,{timeZone:currentTimeZone(),adopts:deps.adopts});if(method2!=="PUT")return PASS;if(!deps.adopts)return json7(res,409,{error:"This computer tells time in its own time zone."});let zone=knownTimeZone((await readBody2(req,4096))?.timeZone);if(!zone)return json7(
29994
30012
  res,400,{error:"timeZone must be an IANA time zone name, like Europe/London."});let changed3=useTimeZone(deps.dataDir,zone);return changed3&&deps.changed(zone),json7(res,200,{timeZone:zone,changed:changed3})}}var ID20=/^[\w.-]{1,128}$/u,SITE=/^[a-z0-9.:[\]-]{1,253}$/u,threadOf=value3=>typeof value3=="string"?value3:null;function ref3(value3){return typeof value3.profile=="string"&&ID20.test(value3.profile)&&value3.bot===void 0?{profile:value3.profile}:typeof value3.bot=="string"&&ID20.test(value3.bot)&&value3.profile===void 0?{bot:value3.bot}:null}function failure10(error66){return error66 instanceof Error&&error66.message?error66.message:"Could not read this browser's sign-ins."}function createBrowserSiteRoutes(deps){
29995
30013
  return async({req,res,url:url2,path:path6,method:method2,json:json7,readBody:readBody2})=>{if(path6==="/api/browser-sites"&&method2==="GET"){let which2=ref3({profile:url2.searchParams.get("profile")??void 0,bot:url2.searchParams.get("bot")??void 0});if(!which2)return json7(res,400,{error:"Name one browser profile or one bot."});let target5=await deps.target(which2,threadOf(url2.searchParams.get("threadId")));if("error"in target5)return json7(res,target5.status,{error:target5.error});res.setHeader(
@@ -30015,10 +30033,10 @@ length>max4)throw new Error(`${field5} is too long`);return normalized2}function
30015
30033
  .outcome`,300)}:{},...typeof raw.setupMinutes=="number"&&Number.isSafeInteger(raw.setupMinutes)&&raw.setupMinutes>0&&raw.setupMinutes<=240?{setupMinutes:raw.setupMinutes}:{},...typeof raw.featured=="boolean"?{featured:raw.featured}:{},...raw.package!==void 0?{package:relativeFile(raw.package,`${field5}.package`,".md","packages/")}:{},manifest:relativeFile(raw.manifest,`${field5}.manifest`,".mausteam.json",prefix),readme:relativeFile(raw.readme,`${field5}.readme`,"README.md",prefix),members:typeof raw.
30016
30034
  members=="number"&&Number.isSafeInteger(raw.members)&&raw.members>0&&raw.members<=200?raw.members:(()=>{throw new Error(`${field5}.members is invalid`)})(),skills:Array.isArray(raw.skills)?raw.skills.map((skill,skillIndex)=>relativeFile(skill,`${field5}.skills[${skillIndex}]`,"SKILL.md",`${prefix}skills/`)):(()=>{throw new Error(`${field5}.skills is invalid`)})(),requires:{apps:stringList2(requires.apps??[],`${field5}.requires.apps`,30)}}});return{format:"openmaus.catalog",version:1,repositoryUrl:TEAM_LIBRARY_REPOSITORY,
30017
30035
  teams}}async function fetchJson2(url2,maxBytes,fetcher){let response=await fetcher(url2,{headers:{accept:"application/json, text/plain;q=0.9"},redirect:"error",signal:AbortSignal.timeout(1e4)});if(!response.ok)throw Object.assign(new Error(`GitHub returned HTTP ${response.status}`),{status:response.status});if(Number(response.headers.get("content-length")??0)>maxBytes)throw new Error("The remote team file is too large");let raw=await response.text();if(Buffer.byteLength(raw)>maxBytes)throw new Error(
30018
- "The remote team file is too large");try{return parseJson(raw)}catch{throw new Error("GitHub did not return valid JSON")}}async function fetchText(url2,maxBytes,fetcher){let response=await fetcher(url2,{headers:{accept:"text/markdown, text/plain;q=0.9"},redirect:"error",signal:AbortSignal.timeout(1e4)});if(!response.ok)throw Object.assign(new Error(`GitHub returned HTTP ${response.status}`),{status:response.status});if(Number(response.headers.get("content-length")??0)>maxBytes)throw new Error("T\
30019
- he remote team file is too large");let raw=await response.text();if(Buffer.byteLength(raw)>maxBytes)throw new Error("The remote team file is too large");return raw}async function fetchTeamCatalog(fetcher=fetch){return parseTeamCatalog(await fetchJson2(TEAM_LIBRARY_CATALOG_URL,MAX_CATALOG_BYTES,fetcher))}function parseShareable(value3){return typeof value3=="string"?parseBotPackage(value3):isBotPackage(value3)?value3.version===1?parseBotPackage(value3):parsePackageDocument(value3,{trust:"file"}):
30020
- parseTeamManifest(value3)}async function fetchShareable(url2,fetcher){return url2.endsWith(".md")?parseBotPackage(await fetchText(url2,MAX_MANIFEST_BYTES,fetcher)):parseShareable(await fetchJson2(url2,MAX_MANIFEST_BYTES,fetcher))}async function fetchLibraryTeam(slug3,fetcher=fetch){if(!/^[a-z0-9][a-z0-9-]*$/.test(slug3))throw new Error("That team name is invalid");let entry2=(await fetchTeamCatalog(fetcher)).teams.find(team=>team.slug===slug3);if(!entry2)throw Object.assign(new Error("That libra\
30021
- ry team was not found"),{status:404});return fetchShareable(`${TEAM_LIBRARY_RAW_ROOT}/${entry2.package??entry2.manifest}`,fetcher)}var MAX_CHIEF_TEAMS=30,MAX_ROLE_TEXT=280,oneLine11=(text30,max4)=>{let line6=text30.replace(/\s+/g," ").trim();return line6.length>max4?`${line6.slice(0,max4-1).trimEnd()}\u2026`:line6};function libraryRoles(team){let role=(member,lead)=>({name:member.name,title:member.title?.trim()||"Specialist",...member.description?.trim()?{does:oneLine11(member.description,MAX_ROLE_TEXT)}:
30036
+ "The remote team file is too large");try{return parseJson(raw)}catch{throw new Error("GitHub did not return valid JSON")}}async function fetchText2(url2,maxBytes,fetcher){let response=await fetcher(url2,{headers:{accept:"text/markdown, text/plain;q=0.9"},redirect:"error",signal:AbortSignal.timeout(1e4)});if(!response.ok)throw Object.assign(new Error(`GitHub returned HTTP ${response.status}`),{status:response.status});if(Number(response.headers.get("content-length")??0)>maxBytes)throw new Error("\
30037
+ The remote team file is too large");let raw=await response.text();if(Buffer.byteLength(raw)>maxBytes)throw new Error("The remote team file is too large");return raw}async function fetchTeamCatalog(fetcher=fetch){return parseTeamCatalog(await fetchJson2(TEAM_LIBRARY_CATALOG_URL,MAX_CATALOG_BYTES,fetcher))}function parseShareable(value3){return typeof value3=="string"?parseBotPackage(value3):isBotPackage(value3)?value3.version===1?parseBotPackage(value3):parsePackageDocument(value3,{trust:"file"}):
30038
+ parseTeamManifest(value3)}async function fetchShareable(url2,fetcher){return url2.endsWith(".md")?parseBotPackage(await fetchText2(url2,MAX_MANIFEST_BYTES,fetcher)):parseShareable(await fetchJson2(url2,MAX_MANIFEST_BYTES,fetcher))}async function fetchLibraryTeam(slug3,fetcher=fetch){if(!/^[a-z0-9][a-z0-9-]*$/.test(slug3))throw new Error("That team name is invalid");let entry2=(await fetchTeamCatalog(fetcher)).teams.find(team=>team.slug===slug3);if(!entry2)throw Object.assign(new Error("That libr\
30039
+ ary team was not found"),{status:404});return fetchShareable(`${TEAM_LIBRARY_RAW_ROOT}/${entry2.package??entry2.manifest}`,fetcher)}var MAX_CHIEF_TEAMS=30,MAX_ROLE_TEXT=280,oneLine11=(text30,max4)=>{let line6=text30.replace(/\s+/g," ").trim();return line6.length>max4?`${line6.slice(0,max4-1).trimEnd()}\u2026`:line6};function libraryRoles(team){let role=(member,lead)=>({name:member.name,title:member.title?.trim()||"Specialist",...member.description?.trim()?{does:oneLine11(member.description,MAX_ROLE_TEXT)}:
30022
30040
  {},...lead?{lead:!0}:{}});if(!("package"in team))return team.team.members.map(member=>role(member,!1));let pkg2=team.version===PACKAGE_V1_VERSION?upgradeV1(team).package:team.package;return pkg2.agents.map(agent=>role(agent,agent.key===pkg2.team?.leader))}async function libraryTeamRoles(fetcher=fetch){let catalog=await fetchTeamCatalog(fetcher);return Promise.all(catalog.teams.slice(0,MAX_CHIEF_TEAMS).map(async entry2=>({name:entry2.name,summary:entry2.summary,roles:await fetchShareable(`${TEAM_LIBRARY_RAW_ROOT}\
30023
30041
  /${entry2.package??entry2.manifest}`,fetcher).then(libraryRoles,()=>[])})))}function safeSegment(value3){return/^[A-Za-z0-9._-]+$/.test(value3)&&value3!=="."&&value3!==".."}function githubManifestUrls(input2){let url2;try{url2=new URL(input2.trim())}catch{throw new Error("Enter a valid GitHub URL")}if(url2.protocol!=="https:"||url2.username||url2.password||url2.port)throw new Error("Only public HTTPS GitHub links are supported");let parts3=url2.pathname.split("/").filter(Boolean).map(part2=>decodeURIComponent(
30024
30042
  part2));if(!parts3.every(safeSegment))throw new Error("That GitHub path is not supported");if(url2.hostname==="github.com"||url2.hostname==="www.github.com"){if(parts3.length===2){let[owner2,repo]=parts3;return[`https://raw.githubusercontent.com/${owner2}/${repo}/main/botmrr.md`,`https://raw.githubusercontent.com/${owner2}/${repo}/main/team.md`,`https://raw.githubusercontent.com/${owner2}/${repo}/main/team.mausteam.json`,`https://raw.githubusercontent.com/${owner2}/${repo}/master/botmrr.md`,`htt\
@@ -30037,7 +30055,7 @@ let asked=answers===void 0?void 0:deps.node(answers),requester=asked?.parentId==
30037
30055
  bot.id,parentThreadId)?.modelSelection;if(!bot||!modelSelection)return{};let needsAsk=modelSwitchNeedsAsk(approvalModeFor(bot),deps.registry.cliTarget(bot.modelSelection.instanceId)?.driverKind,deps.registry.cliTarget(modelSelection.instanceId)?.driverKind);return{modelSelection,...needsAsk?{approvalMode:"ask"}:{}}},name(requester,child2){return own4(requester,child2)?`#${store5.taskByThread(child2.botId,child2.threadId)?.title??"Thread"}`:void 0},label(child2){let task2=store5.taskByThread(child2.
30038
30056
  botId,child2.threadId);return` (your thread #${task2?.title??"Thread"}${task2?.modelSelection?`, on ${task2.modelSelection.model}`:""})`},menu(botId,threadId,search3){let bot=store5.bot(botId);if(!bot)return null;let current3=deps.current(botId,threadId)??bot.modelSelection;return modelMenu({engines:deps.registry.instances(),current:current3,pinned:[bot.modelSelection],refusal:selection3=>refusal7(selection3,bot),down:engine=>deps.givesWay({instanceId:engine.instanceId,model:engine.models.default},
30039
30057
  bot.modelSelection)==="unavailable",search:search3})}}}init_turn_route();init_redact();var SMALL_PLAN={parallel:2,maxTasks:10,smallPlan:!0},MAX_TASKS=200,BURST_PLAN_LIMITS={starter:SMALL_PLAN,personal:SMALL_PLAN,pro:{parallel:10,maxTasks:MAX_TASKS,smallPlan:!1},max:{parallel:25,maxTasks:MAX_TASKS,smallPlan:!1},team:{parallel:25,maxTasks:MAX_TASKS,smallPlan:!1},business:{parallel:25,maxTasks:MAX_TASKS,smallPlan:!1},enterprise:{parallel:25,maxTasks:MAX_TASKS,smallPlan:!1}},OPEN_SOURCE_PARALLEL=10;function burstLimits(host3){return host3.cloudHome?(host3.tier!==void 0&&Object.hasOwn(
30040
- BURST_PLAN_LIMITS,host3.tier)?BURST_PLAN_LIMITS[host3.tier]:void 0)??SMALL_PLAN:{parallel:host3.maxParallel??OPEN_SOURCE_PARALLEL,maxTasks:MAX_TASKS,smallPlan:!1}}import{randomUUID as randomUUID82}from"node:crypto";var BurstLane=class{deps;running=0;pumping=!1;again=!1;constructor(deps){this.deps=deps}runningCount(){return this.running}release(){this.running=Math.max(0,this.running-1),this.pump()}pump(){if(this.pumping){this.again=!0;return}this.pumping=!0;try{do for(this.again=!1;this.running<this.deps.parallel()&&this.deps.hasRoom();){let slot=this.deps.next();if(slot===void 0)break;this.running+=1,this.deps.begin(slot)}while(this.again)}finally{this.pumping=!1}}};import{chmodSync as chmodSync16,closeSync as closeSync37,mkdirSync as mkdirSync120,openSync as openSync34}from"node:fs";import{dirname as dirname78,join as join260}from"node:path";import{DatabaseSync as DatabaseSync8}from"node:sqlite";var EMPTY8={queued:0,running:0,done:0,failed:0,cancelled:0},SCHEMA2=`
30058
+ BURST_PLAN_LIMITS,host3.tier)?BURST_PLAN_LIMITS[host3.tier]:void 0)??SMALL_PLAN:{parallel:host3.maxParallel??OPEN_SOURCE_PARALLEL,maxTasks:MAX_TASKS,smallPlan:!1}}import{randomUUID as randomUUID82}from"node:crypto";var BurstLane=class{deps;running=0;pumping=!1;again=!1;constructor(deps){this.deps=deps}runningCount(){return this.running}release(){this.running=Math.max(0,this.running-1),this.pump()}pump(){if(this.pumping){this.again=!0;return}this.pumping=!0;try{do for(this.again=!1;this.running<this.deps.parallel()&&this.deps.hasRoom();){let slot=this.deps.next();if(slot===void 0)break;this.running+=1,this.deps.begin(slot)}while(this.again)}finally{this.pumping=!1}}};import{chmodSync as chmodSync16,closeSync as closeSync37,mkdirSync as mkdirSync121,openSync as openSync34}from"node:fs";import{dirname as dirname78,join as join261}from"node:path";import{DatabaseSync as DatabaseSync8}from"node:sqlite";var EMPTY8={queued:0,running:0,done:0,failed:0,cancelled:0},SCHEMA2=`
30041
30059
  CREATE TABLE IF NOT EXISTS bursts (
30042
30060
  id TEXT PRIMARY KEY,
30043
30061
  json TEXT NOT NULL,
@@ -30053,7 +30071,7 @@ CREATE TABLE IF NOT EXISTS burst_children (
30053
30071
  PRIMARY KEY (burst_id, seq)
30054
30072
  );
30055
30073
  CREATE INDEX IF NOT EXISTS burst_children_status ON burst_children(burst_id, status, seq);
30056
- `,titleOf=item=>{let line6=item.replace(/\s+/g," ").trim();return line6.length>80?`${line6.slice(0,79).trimEnd()}\u2026`:line6},sampleOf=items=>items.slice(0,5).map(titleOf);function openBurstStore(dataDir){let file3=dataDir===":memory:"?":memory:":join260(dataDir,"bursts.db");file3!==":memory:"&&(mkdirSync120(dirname78(file3),{recursive:!0}),closeSync37(openSync34(file3,"a",384)),chmodSync16(file3,384));let db2=new DatabaseSync8(file3);db2.exec("PRAGMA journal_mode = WAL"),db2.exec(SCHEMA2);let rows2={
30074
+ `,titleOf=item=>{let line6=item.replace(/\s+/g," ").trim();return line6.length>80?`${line6.slice(0,79).trimEnd()}\u2026`:line6},sampleOf=items=>items.slice(0,5).map(titleOf);function openBurstStore(dataDir){let file3=dataDir===":memory:"?":memory:":join261(dataDir,"bursts.db");file3!==":memory:"&&(mkdirSync121(dirname78(file3),{recursive:!0}),closeSync37(openSync34(file3,"a",384)),chmodSync16(file3,384));let db2=new DatabaseSync8(file3);db2.exec("PRAGMA journal_mode = WAL"),db2.exec(SCHEMA2);let rows2={
30057
30075
  insertBurst:db2.prepare("INSERT INTO bursts (id, json, phase, created_at) VALUES (?, ?, ?, ?)"),updateBurst:db2.prepare("UPDATE bursts SET json = ?, phase = ? WHERE id = ?"),getBurst:db2.prepare("SELECT json FROM bursts WHERE id = ?"),activeBursts:db2.prepare("SELECT json FROM bursts WHERE phase IN ('running', 'merging') ORDER BY created_at"),deleteBurst:db2.prepare("DELETE FROM bursts WHERE id = ?"),oldBursts:db2.prepare("SELECT id FROM bursts WHERE phase IN ('done', 'cancelled') AND created_at\
30058
30076
  < ?"),insertChild:db2.prepare("INSERT INTO burst_children (burst_id, seq, json, status) VALUES (?, ?, ?, ?)"),updateChild:db2.prepare("UPDATE burst_children SET json = ?, status = ? WHERE burst_id = ? AND seq = ?"),getChild:db2.prepare("SELECT json FROM burst_children WHERE burst_id = ? AND seq = ?"),nextQueued:db2.prepare("SELECT json FROM burst_children WHERE burst_id = ? AND status = 'queued' ORDER BY seq LIMIT 1"),childrenOf:db2.prepare("SELECT json FROM burst_children WHERE burst_id = ? OR\
30059
30077
  DER BY seq"),childrenIn:db2.prepare("SELECT json FROM burst_children WHERE burst_id = ? AND status = ? ORDER BY seq"),deleteChildren:db2.prepare("DELETE FROM burst_children WHERE burst_id = ?")},parseBurst=row=>JSON.parse(row.json),parseChild=row=>JSON.parse(row.json),transaction2=run11=>{db2.exec("BEGIN");try{let result2=run11();return db2.exec("COMMIT"),result2}catch(error66){throw db2.exec("ROLLBACK"),error66}},writeBurst=burst2=>{rows2.updateBurst.run(JSON.stringify(burst2),burst2.phase,burst2.
@@ -30087,7 +30105,7 @@ counts.queued+burst2.counts.running+burst2.counts.done+burst2.counts.failed+burs
30087
30105
  "It could not start.")}),childEnded(burst2.id)}function settle3(burstId,child2,outcome){ownThreads2.delete(child2.threadId);let cancelled=store5.get(burstId)?.phase==="cancelled",fields2=cancelled?{}:outcome.asked?{error:"It stopped to ask a question. Open its thread to answer."}:outcome.ok&&outcome.text.trim()?{result:clip17(outcome.text.trim(),RESULT_MAX2)}:{error:reasonOf(outcome.text,"It ended without a result.")};store5.settle(burstId,child2.seq,cancelled?"cancelled":"result"in fields2?"don\
30088
30106
  e":"failed",fields2),childEnded(burstId)}function childEnded(burstId){lane.release();let burst2=store5.get(burstId);if(burst2){if(burst2.phase!=="running"){draw3(burst2);return}if(burst2.counts.queued>0||burst2.counts.running>0){draw3(burst2);return}settled2(burst2)}}function settled2(burst2){if(burst2.counts.done===0&&burst2.counts.failed===0){draw3(store5.update(burst2.id,{phase:"cancelled"})??burst2),stopIfIdle();return}let failures=store5.childrenIn(burst2.id,"failed");draw3(store5.update(burst2.
30089
30107
  id,{phase:"merging"})??burst2,failures),merge9(burst2.id)}function merge9(burstId){let burst2=store5.get(burstId);if(!burst2||burst2.phase!=="merging"||merging.has(burstId))return;merging.add(burstId);let done=[],failed2=[],read4=()=>(done=store5.childrenIn(burstId,"done"),failed2=store5.childrenIn(burstId,"failed"),mergePrompt(burst2,done,failed2,burst2.counts.cancelled)),ended2=!1,end=outcome=>{ended2||(ended2=!0,merging.delete(burstId),finish(burst2,done,failed2,outcome))};deps.startMerge(burst2,
30090
- read4,end).then(started2=>{!started2&&!ended2&&(ended2=!0,merging.delete(burstId))},error66=>{ended2||(ended2=!0,merging.delete(burstId),log7(`${burstId} merge could not start: ${error66 instanceof Error?error66.message:String(error66)}`),done.length===0&&failed2.length===0&&read4(),finish(burst2,done,failed2,{ok:!1,text:""}))})}function finish(burst2,done,failed2,outcome){let current3=store5.update(burst2.id,{phase:"done"})??burst2;try{let text30=outcome.ok&&outcome.text.trim()?outcome.text.trim():
30108
+ read4,end).then(started3=>{!started3&&!ended2&&(ended2=!0,merging.delete(burstId))},error66=>{ended2||(ended2=!0,merging.delete(burstId),log7(`${burstId} merge could not start: ${error66 instanceof Error?error66.message:String(error66)}`),done.length===0&&failed2.length===0&&read4(),finish(burst2,done,failed2,{ok:!1,text:""}))})}function finish(burst2,done,failed2,outcome){let current3=store5.update(burst2.id,{phase:"done"})??burst2;try{let text30=outcome.ok&&outcome.text.trim()?outcome.text.trim():
30091
30109
  deps.postParts(burst2,[...done,...failed2]);draw3(current3,failed2),deps.deliver(current3,text30)}catch(error66){log7(`${burst2.id} could not post its result: ${error66 instanceof Error?error66.message:String(error66)}`)}stopIfIdle()}function enlist(burstId){queued.includes(burstId)||queued.push(burstId)}function ensureTimer(){timer4??=setInterval(tick2,TICK_MS4),timer4.unref?.()}function stopIfIdle(){timer4&&store5.active().length===0&&(clearInterval(timer4),timer4=null)}function tick2(){lane.pump();
30092
30110
  for(let burst2 of store5.active())burst2.phase==="merging"&&merge9(burst2.id);stopIfIdle()}function allowed3(items){return items.slice(0,deps.limits().maxTasks)}return{propose(input2){let task2=clip17(oneLine12(input2.task),500),items=input2.items.map(item=>clip17(item.trim(),ITEM_MAX)).filter(Boolean);if(!task2)return{refused:"A burst needs a task."};if(items.length<2)return{refused:"A burst needs at least two items. One item runs fine in this chat."};let kept2=allowed3(items),burst2=store5.create(
30093
30111
  {id:randomUUID82(),botId:input2.botId,threadId:input2.threadId,task:task2,instructions:input2.instructions.trim().slice(0,INSTRUCTIONS_MAX3),model:input2.model,modelName:input2.modelName,requested:items.length,createdAt:now2(),items:kept2});return card(draw3(burst2))},edit(id12,plan){let burst2=store5.get(id12);if(!burst2)return{refused:"That burst is gone."};if(burst2.phase!=="preview")return{refused:"This burst already ran."};let items=plan.items?.map(item=>clip17(item.trim(),ITEM_MAX)).filter(
@@ -30226,16 +30244,16 @@ push({slug:slug3,name:name6,category:text28(raw.category,80)??"",integrations:Ar
30226
30244
  return raw}let reader=response.body.getReader(),chunks=[],total=0;for(;;){let{done,value:value3}=await reader.read();if(done)break;if(total+=value3.byteLength,total>maxBytes)throw await reader.cancel().catch(()=>{}),oversized();chunks.push(value3)}return Buffer.concat(chunks).toString("utf8")}async function fetchBotDirectory(fetcher=fetch){let response=await fetcher(BOT_DIRECTORY_API_URL,{headers:{accept:"application/json"},redirect:"error",signal:AbortSignal.timeout(1e4)});if(!response.ok)throw new Error(
30227
30245
  `The bot directory returned HTTP ${response.status}`);return parseBotDirectory(parseJson(await readBounded2(response,MAX_DIRECTORY_BYTES)))}var STOPWORDS=new Set(["your","with","that","this","from","have","what","when","where","will","them","then","than","only","also","into","over","about","after","before","every","some","most","much","many","very","just","like","each","other","their","there","these","those","using","based","open","free","fast","simple","easy","apps","tool","tools","project","te\
30228
30246
  am","chat","bots"]);function matchDirectoryBots(profile,bots,limit2=5){let terms2=new Set;for(let stack2 of profile.stacks){let term=stack2.toLowerCase();term.length>=4&&terms2.add(term)}for(let signal of profile.signals)terms2.add(signal.role);for(let raw of`${profile.name} ${profile.summary}`.toLowerCase().split(/[^a-z0-9+.#-]+/)){let word=raw.replace(/^[.#+-]+|[.#+-]+$/g,"");word.length>=4&&!STOPWORDS.has(word)&&terms2.add(word)}return bots.flatMap(bot=>{let haystackParts=[bot.name,bot.category,
30229
- ...bot.integrations].map(part2=>part2.toLowerCase()),matched=[...terms2].filter(term=>haystackParts.some(part2=>part2.includes(term)));return matched.length>0?[{...bot,matched}]:[]}).sort((a,b11)=>b11.matched.length-a.matched.length).slice(0,limit2)}init_bot_visibility();import{readFileSync as readFileSync189,readdirSync as readdirSync60,statSync as statSync48}from"node:fs";import{basename as basename35,join as join261}from"node:path";var MAX_FILE_BYTES3=256e3,MAX_DIR_ENTRIES=400;function readText7(path6){try{return statSync48(path6).size>MAX_FILE_BYTES3?null:readFileSync189(path6,"utf8")}catch{return null}}function listNames2(dir){try{return readdirSync60(dir).slice(0,MAX_DIR_ENTRIES)}catch{return[]}}function isDir(path6){try{return statSync48(path6).isDirectory()}catch{return!1}}function packageJson(cwd){let raw=readText7(join261(cwd,"package.json"));if(!raw)return{deps:new Set};try{let parsed2=JSON.parse(raw);if(!parsed2||
30230
- typeof parsed2!="object"||Array.isArray(parsed2))return{deps:new Set};let pkg2=parsed2,deps=new Set;for(let field5 of["dependencies","devDependencies"]){let block=pkg2[field5];if(block&&typeof block=="object"&&!Array.isArray(block))for(let dep of Object.keys(block))deps.add(dep)}return{name:typeof pkg2.name=="string"?pkg2.name:void 0,description:typeof pkg2.description=="string"?pkg2.description:void 0,deps}}catch{return{deps:new Set}}}function readme(cwd){let raw=readText7(join261(cwd,"README.m\
30231
- d"))??readText7(join261(cwd,"readme.md"))??readText7(join261(cwd,"README"));if(!raw)return{};let title3,summary3;for(let line6 of raw.slice(0,64e3).split(`
30247
+ ...bot.integrations].map(part2=>part2.toLowerCase()),matched=[...terms2].filter(term=>haystackParts.some(part2=>part2.includes(term)));return matched.length>0?[{...bot,matched}]:[]}).sort((a,b11)=>b11.matched.length-a.matched.length).slice(0,limit2)}init_bot_visibility();import{readFileSync as readFileSync190,readdirSync as readdirSync60,statSync as statSync48}from"node:fs";import{basename as basename35,join as join262}from"node:path";var MAX_FILE_BYTES3=256e3,MAX_DIR_ENTRIES=400;function readText7(path6){try{return statSync48(path6).size>MAX_FILE_BYTES3?null:readFileSync190(path6,"utf8")}catch{return null}}function listNames2(dir){try{return readdirSync60(dir).slice(0,MAX_DIR_ENTRIES)}catch{return[]}}function isDir(path6){try{return statSync48(path6).isDirectory()}catch{return!1}}function packageJson(cwd){let raw=readText7(join262(cwd,"package.json"));if(!raw)return{deps:new Set};try{let parsed2=JSON.parse(raw);if(!parsed2||
30248
+ typeof parsed2!="object"||Array.isArray(parsed2))return{deps:new Set};let pkg2=parsed2,deps=new Set;for(let field5 of["dependencies","devDependencies"]){let block=pkg2[field5];if(block&&typeof block=="object"&&!Array.isArray(block))for(let dep of Object.keys(block))deps.add(dep)}return{name:typeof pkg2.name=="string"?pkg2.name:void 0,description:typeof pkg2.description=="string"?pkg2.description:void 0,deps}}catch{return{deps:new Set}}}function readme(cwd){let raw=readText7(join262(cwd,"README.m\
30249
+ d"))??readText7(join262(cwd,"readme.md"))??readText7(join262(cwd,"README"));if(!raw)return{};let title3,summary3;for(let line6 of raw.slice(0,64e3).split(`
30232
30250
  `)){let trimmed=line6.trim();if(trimmed){if(trimmed.startsWith("#")){title3||(title3=trimmed.replace(/^#+\s*/,"").trim()||void 0);continue}if(!(trimmed.startsWith("[![")||trimmed.startsWith("![")||trimmed.startsWith("<")||trimmed.startsWith(">"))){summary3=trimmed.replace(/[*_`]/g,"").slice(0,1e3);break}}}return{title:title3,summary:summary3}}var DETECTORS=[{role:"frontend",deps:["react","vue","svelte","next","nuxt","astro","vite","@angular/core","solid-js"],paths:["index.html","vite.config.ts",
30233
30251
  "vite.config.js","next.config.js","next.config.ts"]},{role:"backend",deps:["express","fastify","koa","hono","@nestjs/core","django","flask","fastapi"],paths:["server","api","go.mod"]},{role:"mobile",deps:["react-native","expo"],paths:["ios","android","pubspec.yaml"]},{role:"data",deps:["prisma","drizzle-orm","knex","sequelize","typeorm","mongoose","pg","mysql2","better-sqlite3","sqlalchemy"],paths:["prisma","migrations"]},{role:"testing",deps:["vitest","jest","mocha","@playwright/test","cypress",
30234
30252
  "pytest"],paths:["test","tests","__tests__","e2e"]},{role:"infra",deps:[],paths:["Dockerfile","docker-compose.yml","docker-compose.yaml","compose.yaml",".github/workflows","terraform","helm"]},{role:"docs",deps:[],paths:["docs","mkdocs.yml"]}],STACK_MARKERS=[{stack:"TypeScript",deps:["typescript"],paths:["tsconfig.json"]},{stack:"React",deps:["react"]},{stack:"Vue",deps:["vue"]},{stack:"Svelte",deps:["svelte"]},{stack:"Next.js",deps:["next"]},{stack:"Vite",deps:["vite"]},{stack:"Node",paths:["pa\
30235
- ckage.json"]},{stack:"Python",paths:["pyproject.toml","requirements.txt","setup.py"]},{stack:"Rust",paths:["Cargo.toml"]},{stack:"Go",paths:["go.mod"]},{stack:"Ruby",paths:["Gemfile"]},{stack:"PHP",paths:["composer.json"]},{stack:"Java",paths:["pom.xml","build.gradle","build.gradle.kts"]},{stack:"Docker",paths:["Dockerfile","docker-compose.yml","compose.yaml"]}];function scoutProject(cwd){let pkg2=packageJson(cwd),md2=readme(cwd),entries4=new Set(listNames2(cwd)),pythonDeps=`${readText7(join261(
30253
+ ckage.json"]},{stack:"Python",paths:["pyproject.toml","requirements.txt","setup.py"]},{stack:"Rust",paths:["Cargo.toml"]},{stack:"Go",paths:["go.mod"]},{stack:"Ruby",paths:["Gemfile"]},{stack:"PHP",paths:["composer.json"]},{stack:"Java",paths:["pom.xml","build.gradle","build.gradle.kts"]},{stack:"Docker",paths:["Dockerfile","docker-compose.yml","compose.yaml"]}];function scoutProject(cwd){let pkg2=packageJson(cwd),md2=readme(cwd),entries4=new Set(listNames2(cwd)),pythonDeps=`${readText7(join262(
30236
30254
  cwd,"requirements.txt"))??""}
30237
- ${readText7(join261(cwd,"pyproject.toml"))??""}`.toLowerCase(),hasDep=dep=>pkg2.deps.has(dep)||pythonDeps.length>1&&pythonDeps.includes(dep),pathEvidence=path6=>path6.includes("/")?isDir(join261(cwd,path6))&&listNames2(join261(cwd,path6)).length>0?`${path6}/`:null:entries4.has(path6)?isDir(join261(cwd,path6))?`${path6}/`:path6:null,signals=[];for(let detector of DETECTORS){let evidence=[];for(let dep of detector.deps)hasDep(dep)&&evidence.push(dep);for(let path6 of detector.paths){let found2=pathEvidence(
30238
- path6);found2&&evidence.push(found2)}if(detector.role==="docs"&&evidence.length>0){let hasMkdocs=evidence.includes("mkdocs.yml"),hasMarkdown=listNames2(join261(cwd,"docs")).some(name6=>name6.endsWith(".md"));if(!hasMkdocs&&!hasMarkdown)continue}evidence.length>0&&signals.push({role:detector.role,evidence:evidence.slice(0,6)})}let stacks=[];for(let marker of STACK_MARKERS){let byDep=marker.deps?.some(dep=>hasDep(dep))??!1,byPath=marker.paths?.some(path6=>entries4.has(path6))??!1;(byDep||byPath)&&
30255
+ ${readText7(join262(cwd,"pyproject.toml"))??""}`.toLowerCase(),hasDep=dep=>pkg2.deps.has(dep)||pythonDeps.length>1&&pythonDeps.includes(dep),pathEvidence=path6=>path6.includes("/")?isDir(join262(cwd,path6))&&listNames2(join262(cwd,path6)).length>0?`${path6}/`:null:entries4.has(path6)?isDir(join262(cwd,path6))?`${path6}/`:path6:null,signals=[];for(let detector of DETECTORS){let evidence=[];for(let dep of detector.deps)hasDep(dep)&&evidence.push(dep);for(let path6 of detector.paths){let found2=pathEvidence(
30256
+ path6);found2&&evidence.push(found2)}if(detector.role==="docs"&&evidence.length>0){let hasMkdocs=evidence.includes("mkdocs.yml"),hasMarkdown=listNames2(join262(cwd,"docs")).some(name6=>name6.endsWith(".md"));if(!hasMkdocs&&!hasMarkdown)continue}evidence.length>0&&signals.push({role:detector.role,evidence:evidence.slice(0,6)})}let stacks=[];for(let marker of STACK_MARKERS){let byDep=marker.deps?.some(dep=>hasDep(dep))??!1,byPath=marker.paths?.some(path6=>entries4.has(path6))??!1;(byDep||byPath)&&
30239
30257
  stacks.push(marker.stack)}return{name:(md2.title??pkg2.name??basename35(cwd)).slice(0,100),summary:(md2.summary??pkg2.description??"").slice(0,1e3),stacks,signals}}var stackLine=profile=>profile.stacks.length>0?` The stack: ${profile.stacks.join(", ")}.`:"",ROLE_TEMPLATES={frontend:{name:"Pixel",title:"Frontend Builder",color:"pink",describe:(profile,evidence)=>`You build and refine the user interface of ${profile.name}.${stackLine(profile)} Your turf shows up as ${evidence.join(", ")}. Keep cha\
30240
30258
  nges small, match the existing component patterns, and check what you built actually renders before calling it done.`},backend:{name:"Forge",title:"Backend Builder",color:"blue",describe:(profile,evidence)=>`You own the server side of ${profile.name}: endpoints, business logic, and the contracts the frontend relies on.${stackLine(profile)} Your turf shows up as ${evidence.join(", ")}. Change behavior only alongside the tests that prove it.`},mobile:{name:"Pocket",title:"Mobile Builder",color:"co\
30241
30259
  ral",describe:(profile,evidence)=>`You keep ${profile.name} working on phones: screens, navigation, and platform quirks.${stackLine(profile)} Your turf shows up as ${evidence.join(", ")}. Test on both platforms before declaring victory.`},data:{name:"Schema",title:"Data Engineer",color:"teal",describe:(profile,evidence)=>`You own the data layer of ${profile.name}: models, migrations, and query performance.${stackLine(profile)} Your turf shows up as ${evidence.join(", ")}. Every migration ships w\
@@ -30302,7 +30320,7 @@ brief,notes:imported.notes,presets:imported.presets??[]})}return PASS}}var MAX_T
30302
30320
  "object"||Array.isArray(body2)||Object.keys(body2).some(key7=>key7!=="threadIds"))return json7(res,400,{error:"send {} or { threadIds }"});let raw=body2.threadIds;if(raw!==void 0&&(!Array.isArray(raw)||raw.length>MAX_THREAD_IDS||raw.some(id12=>typeof id12!="string")))return json7(res,400,{error:"threadIds must be a list of this bot's thread ids"});let tasks2=bot.tasks??[],ids=new Set(tasks2.map(task2=>task2.threadId)),foreign=raw?.find(id12=>!ids.has(id12));if(foreign!==void 0)return json7(res,400,
30303
30321
  {error:`"${foreign}" is not one of this bot's threads`});if(bot.approvalGrant)return json7(res,409,{error:"wait for the approval-level change to finish before changing models"});let listed3=raw===void 0?null:new Set(raw),own4=tasks2.filter(task2=>(!listed3||listed3.has(task2.threadId))&&task2.modelSelection!==void 0&&!sameModelSelection(task2.modelSelection,bot.modelSelection)),busy=own4.filter(task2=>deps.busy(bot.id,task2.threadId)),switched=deps.follow(bot.id,own4.filter(task2=>!busy.includes(
30304
30322
  task2)).map(task2=>task2.threadId));return json7(res,200,{switched:switched.length,busy:busy.length,bot:deps.reply(bot.id)})}}function createUndoRoutes(deps){return async({req,res,path:path6,method:method2,auth,json:json7,readBody:readBody2})=>{let m3=path6.match(/^\/api\/threads\/([\w-]+)\/undo$/);if(!m3||method2!=="POST")return PASS;let threadId=m3[1],body2=await readBody2(req),requestId=typeof body2?.requestId=="string"?body2.requestId:"";if(!requestId)return json7(res,400,{error:"requestId is required"});let refusal7=deps.refusal(auth,threadId,requestId);if(refusal7)return json7(res,403,{error:refusal7});await deps.
30305
- undo(auth,res,threadId,requestId)}}import{createHash as createHash123}from"node:crypto";import{request as request8}from"node:http";import{ServerResponse}from"node:http";import{Socket}from"node:net";var HANDSHAKE_MS=1e4,EARLY_BYTES=64*1024;function createUpgrades(){let owners=[],pending3=new Map,stopped=!1;return{route(owns){owners.push(owns)},attach(server2,handle2){server2.on("upgrade",(req,socket,head)=>{if(stopped||!(socket instanceof Socket)){socket.destroy();return}let res=new ServerResponse(req);res.assignSocket(socket),res.setHeader("connection","close"),socket.on("error",()=>socket.destroy()),res.once("finish",()=>socket.
30323
+ undo(auth,res,threadId,requestId)}}import{createHash as createHash124}from"node:crypto";import{request as request8}from"node:http";import{ServerResponse}from"node:http";import{Socket}from"node:net";var HANDSHAKE_MS=1e4,EARLY_BYTES=64*1024;function createUpgrades(){let owners=[],pending3=new Map,stopped=!1;return{route(owns){owners.push(owns)},attach(server2,handle2){server2.on("upgrade",(req,socket,head)=>{if(stopped||!(socket instanceof Socket)){socket.destroy();return}let res=new ServerResponse(req);res.assignSocket(socket),res.setHeader("connection","close"),socket.on("error",()=>socket.destroy()),res.once("finish",()=>socket.
30306
30324
  end(()=>socket.destroy()));let path6;try{path6=new URL(req.url??"","http://localhost").pathname}catch{res.writeHead(400).end();return}if(!owners.some(owns=>owns(path6))){res.writeHead(404).end();return}let upgrade={socket,head,release:()=>socket.off("data",buffer)},buffer=data4=>{upgrade.head.length+data4.length>EARLY_BYTES?socket.destroy():upgrade.head=Buffer.concat([upgrade.head,data4])};socket.on("data",buffer),socket.once("end",()=>socket.destroy()),socket.once("close",()=>{upgrade.release(),
30307
30325
  pending3.delete(req)}),pending3.set(req,upgrade);let timeout3=setTimeout(()=>socket.destroy(),HANDSHAKE_MS);timeout3.unref(),socket.once("close",()=>clearTimeout(timeout3)),handle2(req,res).catch(()=>{res.headersSent?socket.destroy():res.writeHead(500).end()}).finally(()=>clearTimeout(timeout3))})},pending(req){return pending3.get(req)},close(){stopped=!0;for(let upgrade of pending3.values())upgrade.socket.destroy()}}}var ROUTE2=/^\/api\/desktop-viewer\/(local\/(?:shared|bot-[a-f0-9]{64}|pool-\d+)|vps\/[\w-]+)(\/websockify)?$/,HANDSHAKE_MS2=1e4,RECHECK_MS5=5e3,WS_GUID="258EAFA5-E914-47DA-95CA-C5AB0DC85B11",BOT_ID8=/^[\w-]+$/,CONTROL_LEASE=/^[A-Za-z0-9_-]{16,120}$/;function desktopViewerUrl(target4,threadId){return`/desktop-viewer#${new URLSearchParams({target:target4,...threadId?{threadId}:{}})}`}function createDesktopViewer(deps){let upgrades2=deps.upgrades??createUpgrades(),ownGate=deps.upgrades===void 0;upgrades2.
30308
30326
  route(path6=>!!ROUTE2.exec(path6)?.[2]);let viewers=new Map,stopped=!1;return{route:async({req,res,url:url2,path:path6,method:method2,auth,json:json7})=>{let match5=ROUTE2.exec(path6);if(!match5)return PASS;if(res.setHeader("cache-control","private, no-store"),method2!=="GET")return json7(res,405,{error:"method not allowed"});if(!auth.scopes.includes("admin")||!isSameOrigin(req))return json7(res,403,{error:"forbidden"});let botId=url2.searchParams.get("botId"),controlLeaseId=url2.searchParams.get(
@@ -30312,18 +30330,18 @@ pending(req);if(pending3&&stopped){pending3.socket.destroy();return}let upgrade;
30312
30330
  return json7(res,typeof status5=="number"&&status5>=400&&status5<600?status5:502,{error:"The desktop is not available. Open it again from Limix Bot."})}if(res.destroyed||upgrade?.socket.destroyed)return;let live2=()=>deps.live(auth)&&deps.target(match5[1])?.key===target4.key&&(connection.live?.()??!0);if(!live2())return json7(res,401,{error:"Viewer access expired"});if(!holds())return json7(res,409,{error:"Take control of this computer first"});if(!Number.isInteger(connection.port)||connection.port<
30313
30331
  1||connection.port>65535)return json7(res,409,{error:"The desktop viewer is not available."});if(!match5[2])return json7(res,200,{password:connection.password});if(!upgrade||!pending3)return json7(res,426,{error:"WebSocket upgrade required"});let key7=req.headers["sec-websocket-key"];if(req.headers.upgrade?.toLowerCase()!=="websocket"||req.headers["sec-websocket-version"]!=="13"||typeof key7!="string"||!/^[A-Za-z0-9+/]{22}==$/.test(key7))return json7(res,400,{error:"Invalid WebSocket handshake"});
30314
30332
  let upstream=request8({hostname:"127.0.0.1",port:connection.port,path:"/websockify",headers:{Upgrade:"websocket",Connection:"Upgrade","Sec-WebSocket-Key":key7,"Sec-WebSocket-Version":"13"}}),{socket}=upgrade,peer,recheck,release3=connection.retain?.(),closed=!1,timeout3=setTimeout(()=>fail14(),HANDSHAKE_MS2);timeout3.unref(),upgrade.close=()=>{closed||(closed=!0,release3?.(),clearTimeout(timeout3),clearInterval(recheck),upstream.destroy(),peer?.destroy(),socket.destroy())};let fail14=()=>{if(!closed){
30315
- if(peer||socket.destroyed){upgrade.close();return}!res.headersSent&&!socket.destroyed&&json7(res,502,{error:"Could not connect to the desktop viewer"}),upstream.destroy()}};socket.once("close",upgrade.close),upstream.once("error",fail14),upstream.once("response",answer2=>{answer2.resume(),fail14()}),upstream.once("upgrade",(answer2,remote,remoteHead)=>{let accept=createHash123("sha1").update(key7+WS_GUID).digest("base64");if(!live2()||!holds()||socket.destroyed||answer2.headers["sec-websocket-ac\
30333
+ if(peer||socket.destroyed){upgrade.close();return}!res.headersSent&&!socket.destroyed&&json7(res,502,{error:"Could not connect to the desktop viewer"}),upstream.destroy()}};socket.once("close",upgrade.close),upstream.once("error",fail14),upstream.once("response",answer2=>{answer2.resume(),fail14()}),upstream.once("upgrade",(answer2,remote,remoteHead)=>{let accept=createHash124("sha1").update(key7+WS_GUID).digest("base64");if(!live2()||!holds()||socket.destroyed||answer2.headers["sec-websocket-ac\
30316
30334
  cept"]!==accept||answer2.headers.upgrade?.toLowerCase()!=="websocket"){remote.destroy(),fail14();return}clearTimeout(timeout3),peer=remote,remote.once("error",upgrade.close),remote.once("close",upgrade.close),pending3.release(),res.detachSocket(socket),socket.write(`HTTP/1.1 101 Switching Protocols\r
30317
30335
  Upgrade: websocket\r
30318
30336
  Connection: Upgrade\r
30319
30337
  Sec-WebSocket-Accept: ${accept}\r
30320
30338
  \r
30321
30339
  `),remoteHead.length&&socket.write(remoteHead),pending3.head.length&&remote.write(pending3.head),pending3.head=Buffer.alloc(0),socket.pipe(remote).pipe(socket),connection.touch?.(),recheck=setInterval(()=>{!live2()||!holds()?upgrade.close():connection.touch?.()},RECHECK_MS5),recheck.unref()}),upstream.end()},attach:upgrades2.attach,closeForOwner:(owner2,botId)=>{let closed=0;for(let viewer of viewers.values())viewer.owner!==owner2||botId!==void 0&&viewer.botId!==botId||viewer.socket.destroyed||(viewer.
30322
- close(),closed++);return closed},closeAll:()=>{stopped=!0,ownGate&&upgrades2.close();for(let viewer of viewers.values())viewer.close()}}}import{createReadStream as createReadStream12,rmSync as rmSync65}from"node:fs";import{dirname as dirname79,join as join262}from"node:path";import{Readable,Transform as Transform20}from"node:stream";var LIVE2=/^\/api\/bots\/([\w-]+)\/browser\/(live|action)$/,STREAM=/^\/api\/bots\/([\w-]+)\/browser\/stream$/,UPLOAD2=/^\/api\/bots\/([\w-]+)\/browser\/upload$/,DOWNLOAD=/^\/api\/bots\/([\w-]+)\/browser\/download\/([\w-]{1,64})$/,CHOOSER=/^[\w-]{1,64}$/,UPLOAD_MAX_FILES=20,PICKER_CLOSED="The page's file picker is no longer open.",ownerOf2=auth=>auth.kind==="session"?auth.session.id:"local-owner",UploadError=class extends Error{status;constructor(status5,message8){super(message8),this.status=status5}};
30340
+ close(),closed++);return closed},closeAll:()=>{stopped=!0,ownGate&&upgrades2.close();for(let viewer of viewers.values())viewer.close()}}}import{createReadStream as createReadStream12,rmSync as rmSync65}from"node:fs";import{dirname as dirname79,join as join263}from"node:path";import{Readable,Transform as Transform20}from"node:stream";var LIVE2=/^\/api\/bots\/([\w-]+)\/browser\/(live|action)$/,STREAM=/^\/api\/bots\/([\w-]+)\/browser\/stream$/,UPLOAD2=/^\/api\/bots\/([\w-]+)\/browser\/upload$/,DOWNLOAD=/^\/api\/bots\/([\w-]+)\/browser\/download\/([\w-]{1,64})$/,CHOOSER=/^[\w-]{1,64}$/,UPLOAD_MAX_FILES=20,PICKER_CLOSED="The page's file picker is no longer open.",ownerOf2=auth=>auth.kind==="session"?auth.session.id:"local-owner",UploadError=class extends Error{status;constructor(status5,message8){super(message8),this.status=status5}};
30323
30341
  async function uploadedFiles(req){let type4=String(req.headers["content-type"]??"");if(!/^multipart\/form-data;/i.test(type4))throw new UploadError(415,"Send the files as multipart form data.");if(Number(req.headers["content-length"])>104857600)throw new UploadError(413,"Those files are larger than 100 MB in all.");let bytes4=0,limited=req.pipe(new Transform20({transform(chunk,_encoding,done){bytes4+=chunk.length,done(bytes4>104857600?new UploadError(413,"Those files are larger than 100 MB in al\
30324
30342
  l."):null,chunk)}}));req.once("error",error66=>limited.destroy(error66));let form2;try{form2=await new Request("http://upload.invalid/",{method:"POST",headers:{"content-type":type4},body:Readable.toWeb(limited),duplex:"half"}).formData()}catch(error66){throw error66 instanceof UploadError?error66:bytes4>104857600?new UploadError(413,"Those files are larger than 100 MB in all."):new UploadError(400,"The upload was not valid form data.")}let files2=form2.getAll("file").filter(entry2=>typeof entry2!=
30325
30343
  "string");if(files2.length>UPLOAD_MAX_FILES)throw new UploadError(413,`A page takes at most ${UPLOAD_MAX_FILES} files at once.`);return Promise.all(files2.map(async file3=>({name:file3.name,bytes:new Uint8Array(await file3.arrayBuffer())})))}async function answerUpload(req,deps,browser,owner2,chooser){let files2;try{files2=await uploadedFiles(req)}catch(error66){if(!(error66 instanceof UploadError))throw error66;return{status:error66.status,error:error66.message,unread:!0}}let paths2=storeUploads(
30326
- files2,join262(deps.dataDir,"browser-uploads"));if(await deps.viewers.answerFileChooser(browser,owner2,chooser,paths2).catch(()=>!1))return null;for(let file3 of paths2)rmSync65(dirname79(file3),{recursive:!0,force:!0});return{status:409,error:PICKER_CLOSED}}function createBrowserViewerRoutes(deps){deps.upgrades.route(path6=>STREAM.test(path6));let uploading=new Set;return async({req,res,url:url2,path:path6,method:method2,auth,json:json7,readBody:readBody2})=>{let live2=LIVE2.exec(path6),stream2=live2?
30344
+ files2,join263(deps.dataDir,"browser-uploads"));if(await deps.viewers.answerFileChooser(browser,owner2,chooser,paths2).catch(()=>!1))return null;for(let file3 of paths2)rmSync65(dirname79(file3),{recursive:!0,force:!0});return{status:409,error:PICKER_CLOSED}}function createBrowserViewerRoutes(deps){deps.upgrades.route(path6=>STREAM.test(path6));let uploading=new Set;return async({req,res,url:url2,path:path6,method:method2,auth,json:json7,readBody:readBody2})=>{let live2=LIVE2.exec(path6),stream2=live2?
30327
30345
  null:STREAM.exec(path6),upload=live2||stream2?null:UPLOAD2.exec(path6),download2=live2||stream2||upload?null:DOWNLOAD.exec(path6),botId=(live2??stream2??upload??download2)?.[1];if(!botId)return PASS;res.setHeader("cache-control","no-store");let pending3=stream2?deps.upgrades.pending(req):void 0;if(stream2){if(method2!=="GET")return json7(res,405,{error:"method not allowed"});if(!pending3)return json7(res,426,{error:"WebSocket upgrade required"});if(!isSameOrigin(req))return json7(res,403,{error:"\
30328
30346
  forbidden: cross-origin request"})}let threadId=url2.searchParams.get("threadId"),audience2=deps.audience(auth,threadId);if(!audience2)return json7(res,404,{error:"no such conversation"});let browser=await deps.browser(botId,audience2);if("error"in browser)return json7(res,browser.status,{error:browser.error});let failure11=await deps.authorize(req,auth);if(failure11)return json7(res,failure11.status,{error:failure11.error});let owner2=ownerOf2(auth),person2=deps.person(auth),isCurrent=()=>deps.
30329
30347
  audience(auth,threadId)===audience2&&deps.current(browser.botId,browser.session,auth,audience2);if(live2){if(method2==="GET"&&live2[2]==="live"){req.socket.setTimeout(0);let size3=requestedSize(Number(url2.searchParams.get("width")),Number(url2.searchParams.get("height")));return await deps.viewers.open({botId:browser.botId,session:browser.session,spec:browser.spec,owner:owner2,person:person2,isCurrent,res,resume:url2.searchParams.get("resume"),size:size3})}if(method2==="POST"&&live2[2]==="actio\
@@ -30333,7 +30351,7 @@ browser.session)}))return json7(res,409,{error:"This browser shows in the live v
30333
30351
  ay. Wait for it, then try again."}:null:{status:409,error:PICKER_CLOSED};if(refused2)return res.setHeader("connection","close"),json7(res,refused2.status,{error:refused2.error});uploading.add(owner2);let unanswered=await answerUpload(req,deps,browser,owner2,chooser).finally(()=>uploading.delete(owner2));if(!unanswered){res.writeHead(204).end();return}return unanswered.unread&&res.setHeader("connection","close"),json7(res,unanswered.status,{error:unanswered.error})}if(method2!=="GET")return json7(
30334
30352
  res,405,{error:"method not allowed"});let file3=deps.viewers.download(browser,download2[2]);if(!file3?.path)return json7(res,404,{error:"That download is not available."});let saved=file3.path;res.writeHead(200,{"content-type":"application/octet-stream","content-length":String(file3.receivedBytes),"content-disposition":messageFileDisposition(file3.fileName),"x-content-type-options":"nosniff"}),await new Promise(resolve56=>{let reading=createReadStream12(saved);reading.once("error",()=>{res.destroy(),
30335
30353
  resolve56()}),res.once("close",()=>{reading.destroy(),resolve56()}),reading.pipe(res)})}}var viewerTargetId=target4=>`local/${target4.key.replace(":","-")}`;function localVmViewerStatus(status5,auth){return auth.kind==="loopback"?status5:{...status5,viewer_url:status5.viewer_url?desktopViewerUrl(viewerTargetId({key:status5.target_key})):""}}function localDesktopTarget(target4,deps){return{key:target4.key,async resolve(){let status5=await deps.status(target4);if(!status5.managed||!status5.imageMatches||status5.network!=="loopback"||status5.container!=="running"||!status5.viewer_url)throw Object.assign(new Error("Local VM unavailable"),{status:409});return{
30336
- port:status5.viewer_port??0,password:new URLSearchParams(new URL(status5.viewer_url).hash.slice(1)).get("password"),touch:()=>deps.touch(target4)}}}}function createComputerPreviews(){let inFlight=new Map;return{has:computer=>inFlight.has(computer),get size(){return inFlight.size},capture(computer,shoot){let running5=inFlight.get(computer);if(running5)return running5;let started2=shoot().finally(()=>inFlight.delete(computer));return inFlight.set(computer,started2),started2}}}var ROUTE3=/^\/api\/instances\/([\w.-]+)\/leftover-files(\/remove)?$/u,BUSY_LEFTOVER_ERROR="Already looking for leftover files. Try again in a moment.";function createAntigravityLeftoverRoutes(deps){let busy=!1;return async({req,res,path:path6,method:method2,json:json7,readBody:readBody2})=>{let match5=ROUTE3.exec(path6);if(!match5)return PASS;let removing=!!match5[2];if(method2!==(removing?"POST":"GET"))return PASS;if(deps.hosted)return json7(res,403,{error:HOSTED_PROVIDER_SETTINGS_ERROR});if(removing){
30354
+ port:status5.viewer_port??0,password:new URLSearchParams(new URL(status5.viewer_url).hash.slice(1)).get("password"),touch:()=>deps.touch(target4)}}}}function createComputerPreviews(){let inFlight=new Map;return{has:computer=>inFlight.has(computer),get size(){return inFlight.size},capture(computer,shoot){let running5=inFlight.get(computer);if(running5)return running5;let started3=shoot().finally(()=>inFlight.delete(computer));return inFlight.set(computer,started3),started3}}}var ROUTE3=/^\/api\/instances\/([\w.-]+)\/leftover-files(\/remove)?$/u,BUSY_LEFTOVER_ERROR="Already looking for leftover files. Try again in a moment.";function createAntigravityLeftoverRoutes(deps){let busy=!1;return async({req,res,path:path6,method:method2,json:json7,readBody:readBody2})=>{let match5=ROUTE3.exec(path6);if(!match5)return PASS;let removing=!!match5[2];if(method2!==(removing?"POST":"GET"))return PASS;if(deps.hosted)return json7(res,403,{error:HOSTED_PROVIDER_SETTINGS_ERROR});if(removing){
30337
30355
  if(!String(req.headers["content-type"]??"").toLowerCase().startsWith("application/json"))return json7(res,415,{error:"content-type must be application/json"});await readBody2(req,4096)}if(!deps.isAntigravity(match5[1]))return json7(res,404,{error:"Only Antigravity has leftover files to clear."});if(busy)return json7(res,409,{error:BUSY_LEFTOVER_ERROR});busy=!0,res.setHeader("cache-control","no-store");try{if(!removing){let scan2=await deps.find();return json7(res,200,{bytes:scan2.bytes,folders:scan2.
30338
30356
  folders.length,complete:scan2.complete})}let removed=await deps.remove();return json7(res,200,{freedBytes:removed.freedBytes,removed:removed.removed,remaining:removed.remaining})}catch(error66){return json7(res,500,{error:error66 instanceof Error?error66.message:String(error66)})}finally{busy=!1}}}init_zod();import{randomUUID as randomUUID83}from"node:crypto";var addAccount=createClaudeAccountSchema.pick({displayName:!0}).extend({sourceInstanceId:external_exports.string().min(1).max(200)});function createAntigravityAccountRoutes(deps){return async({req,res,path:path6,method:method2,json:json7,readBody:readBody2})=>{if(method2!=="POST"||path6!=="/api/instances/antigravity-accounts")return PASS;if(!String(req.headers["content-type"]??"").toLowerCase().startsWith("application/json"))return json7(res,415,{error:"content-type must be application/json"});let parsed2=addAccount.
30339
30357
  safeParse(await readBody2(req,8192));if(!parsed2.success)return json7(res,400,{error:"Enter an account name (up to 80 characters) and select an Antigravity provider."});let answered3=deps.exclusive(async()=>{let instances=deps.instances(),source4=instances[parsed2.data.sourceInstanceId];if(source4?.driver!=="antigravityAgent")return json7(res,400,{error:"Select a personal Antigravity provider."});let instanceId=`antigravity-${randomUUID83()}`,cli=source4.config?.cli;return instances[instanceId]=
@@ -30391,14 +30409,14 @@ o your key is not sent in the clear.${TYPE_MODEL}`);let response;try{response=aw
30391
30409
  t the gateway address is reachable from Limix Bot's server.";throw failure11((timeout3?"The request timed out.":"Limix Bot's server could not reach the gateway.")+localHint)}if(response.ok||await response.body?.cancel().catch(()=>{}),response.status===401||response.status===403)throw failure11(`The gateway rejected the API key (HTTP ${response.status}). Use the gateway's client API key, not a ChatGPT or Claude login token.`);if(response.status===404)throw failure11(`The model catalog was not fou\
30392
30410
  nd (HTTP 404). Check the base URL; Codex usually needs /v1 and requests /v1/models.${TYPE_MODEL}`);if(response.status>=300&&response.status<400)throw failure11("The gateway redirected the model request. Enter the final API base URL; credentials are never forwarded through redirects.");if(!response.ok)throw failure11(`The model request failed (HTTP ${response.status}). Check the gateway's status and model catalog support.`);let text30=await readCatalog(response,MAX_CATALOG_BYTES2).catch(()=>{throw failure11(
30393
30411
  "The gateway closed the connection while sending its model catalog. Try again, or check the gateway's logs.")});if(text30===null)throw failure11("The model catalog is larger than 2 MB. Check that the base URL points to the gateway's API.");let body2;try{body2=JSON.parse(text30)}catch{throw failure11("The gateway did not return a JSON model catalog. Check that the base URL points to its API, not its dashboard.")}let data4=body2&&typeof body2=="object"?body2.data:void 0,pattern=codex?/^[\w][\w./+-]*$/:
30394
- CLAUDE_MODEL_ID,models=new Set;for(let item of Array.isArray(data4)?data4:[]){if(models.size>=MAX_MODELS5)break;let id12=item&&typeof item=="object"?item.id:void 0;typeof id12=="string"&&id12.length<=160&&pattern.test(id12)&&(codex||id12!=="default")&&models.add(id12)}if(!models.size)throw failure11(`The gateway returned no supported model IDs. Connect a provider account in the gateway and check its /models catalog.${TYPE_MODEL}`);setModels([...models])}init_zod();import{randomUUID as randomUUID85}from"node:crypto";import{join as join264}from"node:path";init_zod();import{randomUUID as randomUUID84}from"node:crypto";import{join as join263}from"node:path";init_config3();var displayName2=external_exports.string().trim().min(1).max(80).refine(value3=>!new RegExp("\\p{Cc}","u").test(value3),"Name cannot contain control characters"),model2=external_exports.string().trim().max(160).regex(CLAUDE_MODEL_ID,"Use the model id the endpoint serves.").refine(value3=>value3!=="default","Claude Code reserves `default`; use the model id the endpoint serves."),optionalModel=external_exports.union([model2,external_exports.literal("")]),token2=external_exports.string().trim().min(
30412
+ CLAUDE_MODEL_ID,models=new Set;for(let item of Array.isArray(data4)?data4:[]){if(models.size>=MAX_MODELS5)break;let id12=item&&typeof item=="object"?item.id:void 0;typeof id12=="string"&&id12.length<=160&&pattern.test(id12)&&(codex||id12!=="default")&&models.add(id12)}if(!models.size)throw failure11(`The gateway returned no supported model IDs. Connect a provider account in the gateway and check its /models catalog.${TYPE_MODEL}`);setModels([...models])}init_zod();import{randomUUID as randomUUID85}from"node:crypto";import{join as join265}from"node:path";init_zod();import{randomUUID as randomUUID84}from"node:crypto";import{join as join264}from"node:path";init_config3();var displayName2=external_exports.string().trim().min(1).max(80).refine(value3=>!new RegExp("\\p{Cc}","u").test(value3),"Name cannot contain control characters"),model2=external_exports.string().trim().max(160).regex(CLAUDE_MODEL_ID,"Use the model id the endpoint serves.").refine(value3=>value3!=="default","Claude Code reserves `default`; use the model id the endpoint serves."),optionalModel=external_exports.union([model2,external_exports.literal("")]),token2=external_exports.string().trim().min(
30395
30413
  1).max(4096).refine(value3=>!/[\p{Cc}\p{Cf}]/u.test(value3),"Token cannot contain control characters"),baseUrl=external_exports.string().trim().max(2048).refine(value3=>endpointBaseUrl(value3)!==null,"Enter an http(s) base URL."),claudeEndpointSchema=external_exports.object({displayName:displayName2,baseUrl,token:token2,model:model2.optional(),opusModel:optionalModel.optional(),sonnetModel:optionalModel.optional(),haikuModel:optionalModel.optional(),smallFastModel:optionalModel.optional()}).strict(),
30396
30414
  claudeEndpointUpdateSchema=external_exports.object({displayName:displayName2.optional(),token:token2.optional(),baseUrl:baseUrl.optional(),model:model2.optional(),opusModel:optionalModel.optional(),sonnetModel:optionalModel.optional(),haikuModel:optionalModel.optional(),smallFastModel:optionalModel.optional()}).strict().refine(value3=>Object.keys(value3).length>0,"No settings supplied"),TIERS2=[["opusModel","ANTHROPIC_DEFAULT_OPUS_MODEL"],["sonnetModel","ANTHROPIC_DEFAULT_SONNET_MODEL"],["haikuM\
30397
30415
  odel","ANTHROPIC_DEFAULT_HAIKU_MODEL"],["smallFastModel","ANTHROPIC_SMALL_FAST_MODEL"]];function rawConfig2(entry2){return entry2.config&&typeof entry2.config=="object"&&!Array.isArray(entry2.config)?entry2.config:{}}function isClaudeEndpoint(entry2){return entry2?.driver==="claudeAgent"&&Array.isArray(rawConfig2(entry2).endpointModels)&&rawConfig2(entry2).bedrock!==!0}function claudeEndpointInfo(entry2){let config3=rawConfig2(entry2),environment=entry2.environment??{};return{baseUrl:environment.
30398
30416
  ANTHROPIC_BASE_URL??"",models:Array.isArray(config3.endpointModels)?[...config3.endpointModels]:[],tokenSaved:!!(environment.ANTHROPIC_AUTH_TOKEN||environment.ANTHROPIC_API_KEY),opusModel:environment.ANTHROPIC_DEFAULT_OPUS_MODEL??"",sonnetModel:environment.ANTHROPIC_DEFAULT_SONNET_MODEL??"",haikuModel:environment.ANTHROPIC_DEFAULT_HAIKU_MODEL??"",smallFastModel:environment.ANTHROPIC_SMALL_FAST_MODEL??""}}function withClaudeEndpointInfo(described,configs){return Array.isArray(described)?described.
30399
30417
  map(instance=>{let entry2=instance.instanceId?configs[instance.instanceId]:void 0;return entry2&&isClaudeEndpoint(entry2)?{...instance,url:claudeEndpointInfo(entry2).baseUrl,claudeEndpoint:claudeEndpointInfo(entry2)}:instance}):described}function endpointEnvironment(url2,secret,fields2){let address3=endpointBaseUrl(url2);if(!address3)throw Object.assign(new Error("Enter an http(s) base URL."),{status:400});let environment={ANTHROPIC_BASE_URL:address3,...address3==="https://api.anthropic.com"?{}:
30400
30418
  {ANTHROPIC_AUTH_TOKEN:secret},ANTHROPIC_API_KEY:secret,...fields2.model?{ANTHROPIC_MODEL:fields2.model.trim()}:{}};for(let[field5,key7]of TIERS2){let value3=fields2[field5]?.trim();value3&&(environment[key7]=value3)}return environment}function endpointModels(fields2){let tiers2=TIERS2.map(([field5])=>fields2[field5]?.trim()??"").filter(Boolean);return[...new Set([(fields2.model??"").trim(),...tiers2].filter(Boolean))]}function inheritedCli(instances){for(let entry2 of Object.values(instances)){if(entry2.
30401
- driver!=="claudeAgent"||isClaudeEndpoint(entry2)||rawConfig2(entry2).bedrock===!0)continue;let cli=rawConfig2(entry2).cli;if(typeof cli=="string"&&cli)return cli}}function newClaudeEndpoint(cfg2,body2){let instances=persistableInstanceConfigs(cfg2),instanceId=`claude-${randomUUID84()}`,cli=inheritedCli(instances),entry2={driver:"claudeAgent",displayName:body2.displayName,access:"custom",config:{...cli?{cli}:{},configDir:join263(DATA_DIR,"providers",instanceId),requireApiKey:!0,endpointModels:body2.
30419
+ driver!=="claudeAgent"||isClaudeEndpoint(entry2)||rawConfig2(entry2).bedrock===!0)continue;let cli=rawConfig2(entry2).cli;if(typeof cli=="string"&&cli)return cli}}function newClaudeEndpoint(cfg2,body2){let instances=persistableInstanceConfigs(cfg2),instanceId=`claude-${randomUUID84()}`,cli=inheritedCli(instances),entry2={driver:"claudeAgent",displayName:body2.displayName,access:"custom",config:{...cli?{cli}:{},configDir:join264(DATA_DIR,"providers",instanceId),requireApiKey:!0,endpointModels:body2.
30402
30420
  model?endpointModels(body2):officialModels(!1)},environment:endpointEnvironment(body2.baseUrl,body2.token,body2)};return assertSeparateClaudeAccount(instances,instanceId,entry2),instances[instanceId]=entry2,{instanceId,instances}}function updateClaudeEndpoint(cfg2,instanceId,body2){let instances=persistableInstanceConfigs(cfg2),entry2=instances[instanceId];if(!entry2)throw Object.assign(new Error("unknown instance"),{status:404});if(!isClaudeEndpoint(entry2))throw Object.assign(new Error("This C\
30403
30421
  laude instance is not a custom endpoint."),{status:400});let saved=claudeEndpointInfo(entry2);if(!saved.baseUrl||!saved.models.length)throw Object.assign(new Error("This endpoint is missing its address or model. Remove it and add it again."),{status:409});let address3=body2.baseUrl===void 0?saved.baseUrl:endpointBaseUrl(body2.baseUrl);if(!address3)throw Object.assign(new Error("Enter an http(s) base URL."),{status:400});if(body2.token===void 0&&address3!==endpointBaseUrl(saved.baseUrl))throw Object.
30404
30422
  assign(new Error("Enter the endpoint's token again for the new address."),{status:400});let fields2={baseUrl:address3,model:body2.model??entry2.environment?.ANTHROPIC_MODEL};body2.displayName!==void 0&&(fields2.displayName=body2.displayName);for(let[field5,key7]of TIERS2){let value3=body2[field5]!==void 0?body2[field5]:entry2.environment?.[key7];value3!==void 0&&(fields2[field5]=value3)}let secret=body2.token??entry2.environment?.ANTHROPIC_AUTH_TOKEN??entry2.environment?.ANTHROPIC_API_KEY;if(!secret)
@@ -30406,16 +30424,16 @@ throw Object.assign(new Error("Enter the endpoint's token."),{status:400});retur
30406
30424
  test(url2.hostname)},"Use HTTPS, or HTTP on localhost through a secure tunnel.")}),codexEndpointUpdateSchema=codexEndpointSchema.partial().refine(value3=>Object.keys(value3).length>0,"No settings supplied");function configOf(entry2){return entry2.config??{}}function isCodexEndpoint(entry2){if(entry2?.driver!=="codex")return!1;let endpoint=configOf(entry2).endpoint;return!!(endpoint&&typeof endpoint.url=="string"&&endpointBaseUrl(endpoint.url)&&Array.isArray(endpoint.models)&&endpoint.models.every(
30407
30425
  model4=>typeof model4=="string"))}function infoOf(entry2){let endpoint=configOf(entry2).endpoint;return{baseUrl:endpoint.url,models:[...endpoint.models],tokenSaved:!!entry2.environment?.OPENMAUSBOT_CODEX_API_KEY}}function withCodexEndpointInfo(described,configs){return Array.isArray(described)?described.map(instance=>{let entry2=instance.instanceId?configs[instance.instanceId]:void 0;return entry2&&isCodexEndpoint(entry2)?{...instance,url:infoOf(entry2).baseUrl,codexEndpoint:infoOf(entry2)}:instance}):
30408
30426
  described}function newCodexEndpoint(cfg2,body2){let instances=persistableInstanceConfigs(cfg2),instanceId=`codex-endpoint-${randomUUID85()}`,source4=Object.values(instances).find(entry2=>entry2.driver==="codex"&&configOf(entry2).cli),cli=source4?configOf(source4).cli:void 0;return instances[instanceId]={driver:"codex",access:"custom",displayName:body2.displayName,config:{...cli?{cli}:{},endpoint:{url:endpointBaseUrl(body2.baseUrl),...body2.model?{model:body2.model,models:[body2.model]}:{models:officialModels(
30409
- !0)}}},environment:{CODEX_HOME:join264(DATA_DIR,"providers",instanceId),OPENMAUSBOT_CODEX_API_KEY:body2.token}},{instanceId,instances}}function updateCodexEndpoint(cfg2,instanceId,body2){let instances=persistableInstanceConfigs(cfg2),entry2=instances[instanceId];if(!entry2)throw Object.assign(new Error("unknown instance"),{status:404});if(!isCodexEndpoint(entry2))throw Object.assign(new Error("This Codex instance is not a direct API endpoint."),{status:400});let saved=infoOf(entry2),address3=body2.
30427
+ !0)}}},environment:{CODEX_HOME:join265(DATA_DIR,"providers",instanceId),OPENMAUSBOT_CODEX_API_KEY:body2.token}},{instanceId,instances}}function updateCodexEndpoint(cfg2,instanceId,body2){let instances=persistableInstanceConfigs(cfg2),entry2=instances[instanceId];if(!entry2)throw Object.assign(new Error("unknown instance"),{status:404});if(!isCodexEndpoint(entry2))throw Object.assign(new Error("This Codex instance is not a direct API endpoint."),{status:400});let saved=infoOf(entry2),address3=body2.
30410
30428
  baseUrl===void 0?saved.baseUrl:endpointBaseUrl(body2.baseUrl);if(body2.token===void 0&&address3!==saved.baseUrl)throw Object.assign(new Error("Enter the endpoint's token again for the new address."),{status:400});let token3=body2.token??entry2.environment?.OPENMAUSBOT_CODEX_API_KEY;if(!token3)throw Object.assign(new Error("Enter the endpoint's token."),{status:400});return instances[instanceId]={...entry2,...body2.displayName?{displayName:body2.displayName}:{},config:{...configOf(entry2),endpoint:{
30411
- ...configOf(entry2).endpoint,url:address3,...body2.model?{model:body2.model,models:[body2.model]}:{}}},environment:{...entry2.environment,OPENMAUSBOT_CODEX_API_KEY:token3}},{instances}}init_user_errors();init_provider_icon();import{randomUUID as randomUUID87}from"node:crypto";init_zod();import{randomUUID as randomUUID86}from"node:crypto";import{join as join265}from"node:path";init_config3();var displayName3=external_exports.string().trim().min(1).max(80).refine(value3=>!new RegExp("\\p{Cc}","u").test(value3),"Name cannot contain control characters"),awsProfile=external_exports.string().trim().regex(/^[A-Za-z0-9._+=,@-]{1,128}$/,"Enter the AWS profile name from this computer's ~/.aws config."),awsRegion=external_exports.string().trim().regex(/^[a-z]{2}(-[a-z]+)+-\d$/,"Enter an AWS region, such as us-east-1."),model3=external_exports.string().trim().max(160).regex(CLAUDE_MODEL_ID,"Us\
30429
+ ...configOf(entry2).endpoint,url:address3,...body2.model?{model:body2.model,models:[body2.model]}:{}}},environment:{...entry2.environment,OPENMAUSBOT_CODEX_API_KEY:token3}},{instances}}init_user_errors();init_provider_icon();import{randomUUID as randomUUID87}from"node:crypto";init_zod();import{randomUUID as randomUUID86}from"node:crypto";import{join as join266}from"node:path";init_config3();var displayName3=external_exports.string().trim().min(1).max(80).refine(value3=>!new RegExp("\\p{Cc}","u").test(value3),"Name cannot contain control characters"),awsProfile=external_exports.string().trim().regex(/^[A-Za-z0-9._+=,@-]{1,128}$/,"Enter the AWS profile name from this computer's ~/.aws config."),awsRegion=external_exports.string().trim().regex(/^[a-z]{2}(-[a-z]+)+-\d$/,"Enter an AWS region, such as us-east-1."),model3=external_exports.string().trim().max(160).regex(CLAUDE_MODEL_ID,"Us\
30412
30430
  e the model id Bedrock serves.").refine(value3=>value3!=="default","Claude Code reserves `default`; use the model id Bedrock serves."),optionalModel2=external_exports.union([model3,external_exports.literal("")]),claudeBedrockSchema=external_exports.object({displayName:displayName3,awsProfile,awsRegion,model:model3,opusModel:optionalModel2.optional(),sonnetModel:optionalModel2.optional(),haikuModel:optionalModel2.optional(),smallFastModel:optionalModel2.optional()}).strict(),claudeBedrockUpdateSchema=external_exports.
30413
30431
  object({displayName:displayName3.optional(),awsProfile:awsProfile.optional(),awsRegion:awsRegion.optional(),model:model3.optional(),opusModel:optionalModel2.optional(),sonnetModel:optionalModel2.optional(),haikuModel:optionalModel2.optional(),smallFastModel:optionalModel2.optional()}).strict().refine(value3=>Object.keys(value3).length>0,"No settings supplied"),TIERS3=[["opusModel","ANTHROPIC_DEFAULT_OPUS_MODEL"],["sonnetModel","ANTHROPIC_DEFAULT_SONNET_MODEL"],["haikuModel","ANTHROPIC_DEFAULT_HA\
30414
30432
  IKU_MODEL"],["smallFastModel","ANTHROPIC_SMALL_FAST_MODEL"]];function rawConfig3(entry2){return entry2.config&&typeof entry2.config=="object"&&!Array.isArray(entry2.config)?entry2.config:{}}function isClaudeBedrock(entry2){return entry2?.driver==="claudeAgent"&&rawConfig3(entry2).bedrock===!0}function claudeBedrockInfo(entry2){let config3=rawConfig3(entry2),environment=entry2.environment??{};return{awsProfile:environment.AWS_PROFILE??"",awsRegion:environment.AWS_REGION??"",model:environment.ANTHROPIC_MODEL??
30415
30433
  "",models:Array.isArray(config3.endpointModels)?[...config3.endpointModels]:[],opusModel:environment.ANTHROPIC_DEFAULT_OPUS_MODEL??"",sonnetModel:environment.ANTHROPIC_DEFAULT_SONNET_MODEL??"",haikuModel:environment.ANTHROPIC_DEFAULT_HAIKU_MODEL??"",smallFastModel:environment.ANTHROPIC_SMALL_FAST_MODEL??""}}function withClaudeBedrockInfo(described,configs){return Array.isArray(described)?described.map(instance=>{let entry2=instance.instanceId?configs[instance.instanceId]:void 0;return entry2&&isClaudeBedrock(
30416
30434
  entry2)?{...instance,claudeBedrock:claudeBedrockInfo(entry2)}:instance}):described}function bedrockEnvironment(fields2){let environment={CLAUDE_CODE_USE_BEDROCK:"1",AWS_PROFILE:fields2.awsProfile,AWS_REGION:fields2.awsRegion,...fields2.model?{ANTHROPIC_MODEL:fields2.model.trim()}:{}};for(let[field5,key7]of TIERS3){let value3=fields2[field5]?.trim();value3&&(environment[key7]=value3)}return environment}function bedrockModels(fields2){let tiers2=TIERS3.map(([field5])=>fields2[field5]?.trim()??"").
30417
30435
  filter(Boolean);return[...new Set([(fields2.model??"").trim(),...tiers2].filter(Boolean))]}function inheritedCli2(instances){for(let entry2 of Object.values(instances)){if(entry2.driver!=="claudeAgent"||isClaudeBedrock(entry2))continue;let cli=rawConfig3(entry2).cli;if(typeof cli=="string"&&cli)return cli}}function newClaudeBedrock(cfg2,body2){let instances=persistableInstanceConfigs(cfg2),instanceId=`claude-${randomUUID86()}`,cli=inheritedCli2(instances),entry2={driver:"claudeAgent",displayName:body2.
30418
- displayName,access:"custom",config:{...cli?{cli}:{},configDir:join265(DATA_DIR,"providers",instanceId),bedrock:!0,endpointModels:bedrockModels(body2)},environment:bedrockEnvironment(body2)};return assertSeparateClaudeAccount(instances,instanceId,entry2),instances[instanceId]=entry2,{instanceId,instances}}function updateClaudeBedrock(cfg2,instanceId,body2){let instances=persistableInstanceConfigs(cfg2),entry2=instances[instanceId];if(!entry2)throw Object.assign(new Error("unknown instance"),{status:404});
30436
+ displayName,access:"custom",config:{...cli?{cli}:{},configDir:join266(DATA_DIR,"providers",instanceId),bedrock:!0,endpointModels:bedrockModels(body2)},environment:bedrockEnvironment(body2)};return assertSeparateClaudeAccount(instances,instanceId,entry2),instances[instanceId]=entry2,{instanceId,instances}}function updateClaudeBedrock(cfg2,instanceId,body2){let instances=persistableInstanceConfigs(cfg2),entry2=instances[instanceId];if(!entry2)throw Object.assign(new Error("unknown instance"),{status:404});
30419
30437
  if(!isClaudeBedrock(entry2))throw Object.assign(new Error("This Claude instance is not an Amazon Bedrock engine."),{status:400});let saved=claudeBedrockInfo(entry2);if(!saved.awsProfile||!saved.awsRegion)throw Object.assign(new Error("This engine is missing its AWS profile or region. Remove it and add it again."),{status:409});let fields2={awsProfile:body2.awsProfile??saved.awsProfile,awsRegion:body2.awsRegion??saved.awsRegion,model:body2.model??entry2.environment?.ANTHROPIC_MODEL};body2.displayName!==
30420
30438
  void 0&&(fields2.displayName=body2.displayName);for(let[field5,key7]of TIERS3){let value3=body2[field5]!==void 0?body2[field5]:entry2.environment?.[key7];value3!==void 0&&(fields2[field5]=value3)}return instances[instanceId]={...entry2,...fields2.displayName?{displayName:fields2.displayName}:{},environment:bedrockEnvironment(fields2),config:{...rawConfig3(entry2),bedrock:!0,endpointModels:fields2.model&&(body2.model!==void 0||TIERS3.some(([field5])=>body2[field5]!==void 0))?bedrockModels(fields2):
30421
30439
  saved.models}},{instances}}import{dirname as dirname80}from"node:path";var FALLBACK="Run `claude update` in Terminal, then refresh Engines.",CLAUDE_CODE_PACKAGE="@anthropic-ai/claude-code";function isAppInstalledClaude(cli,binDir=enginesBinDir()){let resolved2=findCliCandidates(cli)[0];return resolved2!==void 0&&dirname80(resolved2)===binDir}var appCopy={owns:cli=>isAppInstalledClaude(cli),reinstall:(cli,env)=>installNpmEngine(CLAUDE_CODE_PACKAGE,{cli,env})};function stderrOf2(error66){let stderr=error66.stderr;return typeof stderr=="string"?stderr:Buffer.isBuffer(
@@ -30453,8 +30471,8 @@ status(authStatus[1],auth.kind==="session"?auth.session.id:"loopback",url2.searc
30453
30471
  content-type must be application/json"});let instanceId=instanceAction[1],action3=instanceAction[2],owner2=auth.kind==="session"?auth.session.id:"loopback";action3.startsWith("auth/")&&res.setHeader("cache-control","no-store");try{if(action3==="check"){let instance=registry3.get(instanceId);return instance?(res.setHeader("cache-control","no-store"),json7(res,200,await(deps.checkInstance??checkEngine)(instance))):json7(res,404,{error:"unknown instance"})}if(action3==="refresh-models"){let endpoint=persistableInstanceConfigs(
30454
30472
  cfg2)[instanceId];if(endpoint&&(isClaudeEndpoint(endpoint)||isCodexEndpoint(endpoint))&&isGatewayEndpoint(endpoint)&&!hasExplicitModel(endpoint)){if(providerConfigBusy2.get())return json7(res,409,{error:"provider settings are already being updated"});providerConfigBusy2.set(!0);try{let instances=persistableInstanceConfigs(cfg2);await discoverAgentEndpointModels(instances[instanceId]),await persistProviderInstance2(instanceId,instances)}finally{providerConfigBusy2.set(!1)}}return await registry3.
30455
30473
  refreshModels(instanceId)?json7(res,200,{instances:await describeInstances2()}):json7(res,404,{error:"unknown instance"})}if(action3==="install"){let installed2=await registry3.installRuntime(instanceId);if(!installed2)return json7(res,404,{error:"Installing this engine from Settings is not available on this server. Use the install command on the machine running Limix Bot."});let usingAppCopy=installed2!==!0&&await useAppCopy(instanceId,installed2.useCli);return json7(res,200,{instances:await describeInstances2(),
30456
- ...usingAppCopy?{usingAppCopy:!0}:{}})}if(action3==="auth/start"){let instance=registry3.get(instanceId);if(!instance)return json7(res,404,{error:"unknown instance"});if(instance.authenticationMethod==="browser-pkce"&&(isProxied(req)||!isLoopbackHost(req.socket.remoteAddress)))return json7(res,403,{error:"Continue with ChatGPT on the computer running Limix Bot. Hosted Pro sign-in requires OpenAI's hosted-app approval."});let started2=await providerAuthSessions2.start(instance,owner2);return started2.
30457
- phase==="succeeded"&&registry3.forgetSnapshots(),auth.kind==="session"&&!sessions2.isLive(auth.session.id)?(providerAuthSessions2.revokeOwner(owner2),json7(res,401,{error:"Your session ended. Start a new sign-in."})):json7(res,200,{auth:started2})}if(action3==="auth/sign-out"){let instance=registry3.get(instanceId);return instance?(await providerAuthSessions2.signOut(instance,owner2),registry3.forgetSnapshots(),json7(res,200,{instances:await describeInstances2()})):json7(res,404,{error:"unknown \
30474
+ ...usingAppCopy?{usingAppCopy:!0}:{}})}if(action3==="auth/start"){let instance=registry3.get(instanceId);if(!instance)return json7(res,404,{error:"unknown instance"});if(instance.authenticationMethod==="browser-pkce"&&(isProxied(req)||!isLoopbackHost(req.socket.remoteAddress)))return json7(res,403,{error:"Continue with ChatGPT on the computer running Limix Bot. Hosted Pro sign-in requires OpenAI's hosted-app approval."});let started3=await providerAuthSessions2.start(instance,owner2);return started3.
30475
+ phase==="succeeded"&&registry3.forgetSnapshots(),auth.kind==="session"&&!sessions2.isLive(auth.session.id)?(providerAuthSessions2.revokeOwner(owner2),json7(res,401,{error:"Your session ended. Start a new sign-in."})):json7(res,200,{auth:started3})}if(action3==="auth/sign-out"){let instance=registry3.get(instanceId);return instance?(await providerAuthSessions2.signOut(instance,owner2),registry3.forgetSnapshots(),json7(res,200,{instances:await describeInstances2()})):json7(res,404,{error:"unknown \
30458
30476
  instance"})}if(action3==="auth/complete"){let body3=await readBody2(req),flowId=typeof body3?.flowId=="string"?body3.flowId:"",callbackUrl=typeof body3?.callbackUrl=="string"?body3.callbackUrl:typeof body3?.code=="string"?body3.code:"";return!flowId||!callbackUrl?json7(res,400,{error:"flowId and a code or callbackUrl are required"}):(await providerAuthSessions2.complete(instanceId,owner2,flowId,callbackUrl),registry3.forgetSnapshots(),json7(res,200,{ok:!0}))}let body2=await readBody2(req,4096);return await providerAuthSessions2.
30459
30477
  cancel(instanceId,owner2,typeof body2?.flowId=="string"?body2.flowId:""),json7(res,200,{ok:!0})}catch(error66){let requestedStatus=error66&&typeof error66=="object"?error66.status:void 0,status5=typeof requestedStatus=="number"&&[400,401,404,409,413,415].includes(requestedStatus)?requestedStatus:500;return json7(res,status5,{error:error66 instanceof Error?error66.message:String(error66),...userErrorFields(error66)})}}if(method2==="GET"&&path6==="/api/cli-candidates"){let name6=url2.searchParams.
30460
30478
  get("name")??"";return resetPathCache(),json7(res,200,{candidates:findCliCandidates(name6)})}if(method2==="POST"&&path6==="/api/cli-test"){if(!String(req.headers["content-type"]??"").toLowerCase().startsWith("application/json"))return json7(res,415,{error:"content-type must be application/json"});let body2=await readBody2(req),cli=typeof body2?.cli=="string"?body2.cli.trim():"";if(!cli||/[\n\r]/.test(cli))return json7(res,400,{error:"cli must be a non-empty path"});let driver=typeof body2?.driver==
@@ -30480,19 +30498,19 @@ member.email}),name6,url2):null},lender:deps.lender?.(auth)??null});return"body"
30480
30498
  ok)return json7(res,404,{error:mcpServerNotFound(name6)});if(!isRemoteMcpServer(parsed2.server))return json7(res,400,{error:"Only servers reached by URL can be signed in to."});if(parsed2.server.runsOn)return json7(res,409,{error:runsElsewhere(parsed2.server.runsOn)});let url2=parsed2.server.url;if(action3==="sign-out"&&method2==="POST"&&!flowId)return await mcpOAuth2.signOut(name6,url2),json7(res,200,withServerDetails(mcpServerResponse2()));let owner2=auth.kind==="session"?auth.session.id:"loop\
30481
30499
  back";res.setHeader("Cache-Control","no-store");try{if(action3==="sign-in"&&method2==="GET"&&flowId){let status5=mcpOAuth2.status(name6,flowId,owner2);return status5?json7(res,200,{auth:status5}):json7(res,404,{error:"This sign-in is no longer available in this browser. Start again."})}if(action3==="sign-in"&&method2==="DELETE")return mcpOAuth2.cancelFlow(name6,owner2,flowId),json7(res,200,{ok:!0});if(action3==="sign-in"&&method2==="POST"&&flowId){if(!String(req.headers["content-type"]??"").toLowerCase().
30482
30500
  startsWith("application/json"))return json7(res,415,{error:"content-type must be application/json"});let body2=await readBody2(req,20480);return typeof body2?.callbackUrl!="string"?json7(res,400,{error:"A complete callbackUrl is required."}):json7(res,200,{auth:await mcpOAuth2.completeCallback(name6,flowId,body2.callbackUrl,owner2)})}if(action3==="sign-in"&&method2==="POST"&&!flowId){let remote=auth.kind==="session"&&(isProxied(req)||!isLoopbackHost(req.headers.host)),origin2=remote?mcpCallbackOrigin(
30483
- provesSameOrigin(req)?requestOrigin(req):null,[CLOUD_HOME2?.publicOrigin,hostedWorkspaceConfiguration()?.tenant.origin,savedCustomDomain2(),FALLBACK_PUBLIC_URL2]):null,started2=await mcpOAuth2.start(name6,url2,void 0,owner2,{remote,origin:origin2});return auth.kind==="session"&&!sessions2.isLive(auth.session.id)?(mcpOAuth2.revokeOwner(owner2),json7(res,401,{error:"Your session ended. Start a new sign-in."})):json7(res,200,{auth:started2})}}catch(error66){if(error66 instanceof McpSignInError)return json7(
30501
+ provesSameOrigin(req)?requestOrigin(req):null,[CLOUD_HOME2?.publicOrigin,hostedWorkspaceConfiguration()?.tenant.origin,savedCustomDomain2(),FALLBACK_PUBLIC_URL2]):null,started3=await mcpOAuth2.start(name6,url2,void 0,owner2,{remote,origin:origin2});return auth.kind==="session"&&!sessions2.isLive(auth.session.id)?(mcpOAuth2.revokeOwner(owner2),json7(res,401,{error:"Your session ended. Start a new sign-in."})):json7(res,200,{auth:started3})}}catch(error66){if(error66 instanceof McpSignInError)return json7(
30484
30502
  res,error66.status,{error:error66.message});if(error66 instanceof McpOAuthError)return json7(res,400,{error:error66.message,code:error66.code});if(method2==="POST"&&!flowId)return json7(res,502,{error:error66 instanceof Error?error66.message:"Sign-in could not start."});throw error66}return json7(res,405,{error:"method not allowed"})}if(method2==="POST"&&path6==="/api/mcp/servers"){if(!String(req.headers["content-type"]??"").toLowerCase().startsWith("application/json"))return json7(res,415,{error:"\
30485
30503
  content-type must be application/json"});let body2=await readBody2(req),name6=typeof body2?.name=="string"?body2.name:"",parsed2=parseMcpServerMutation(name6,mcpServerBody(body2));if(!parsed2.ok)return json7(res,400,{error:parsed2.error});let placed=deps.place?await deps.place(parsed2.server,auth):{ok:!0,server:parsed2.server};if(!placed.ok)return json7(res,409,{error:placed.error});let added=config3.add(name6,placed.server,vaultKeysOf(body2,ownsVault()));return added.status<300&&deps.connectionHealth?.
30486
30504
  added("mcp",name6,auth.kind==="session"?auth.session.email??null:null),answer2(res,json7,added)}if(method2==="POST"&&path6==="/api/mcp/servers/import")return String(req.headers["content-type"]??"").toLowerCase().startsWith("application/json")?answer2(res,json7,await config3.addMany(async()=>{let body2=await readBody2(req),text30=typeof body2?.json=="string"?body2.json:"";if(auth.kind==="session"&&!sessions2.isLive(auth.session.id))return{status:401,error:"unauthorized: this session has expired o\
30487
30505
  r was revoked"};if(!text30.trim())return{status:400,error:"Paste the JSON block first."};let parsed2=parseMcpServersImport(text30);if(!parsed2.ok)return{status:400,error:parsed2.error};let servers={};for(let[name6,server2]of Object.entries(parsed2.servers)){let placed=deps.place?await deps.place(server2,auth):{ok:!0,server:server2};if(!placed.ok)return{status:409,error:placed.error};servers[name6]=placed.server}return{servers}})):json7(res,415,{error:"content-type must be application/json"});let mcpServerRoute=/^\/api\/mcp\/servers\/([a-z][a-z0-9_-]{0,31})$/.
30488
30506
  exec(path6);if(mcpServerRoute&&["PUT","PATCH","DELETE"].includes(method2)){if(method2!=="DELETE"&&!String(req.headers["content-type"]??"").toLowerCase().startsWith("application/json"))return json7(res,415,{error:"content-type must be application/json"});let name6=mcpServerRoute[1];if(method2==="DELETE"){let removed=config3.remove(name6);return removed.status<300&&deps.connectionHealth?.removed("mcp",name6),answer2(res,json7,removed)}let body2=await readBody2(req),current3=cfg2.mcpServers??{};if(!Object.
30489
30507
  hasOwn(current3,name6))return json7(res,404,{error:mcpServerNotFound(name6)});let existing=parseStoredMcpServer(name6,current3[name6]);if(!existing.ok)return json7(res,400,{error:existing.error});if(method2==="PATCH"){let key7=body2&&typeof body2=="object"&&!Array.isArray(body2)&&Object.keys(body2).length===1?Object.keys(body2)[0]:void 0;return key7!=="enabled"&&key7!=="apps"||typeof body2[key7]!="boolean"?json7(res,400,{error:"Only an enabled or apps boolean can be changed here."}):answer2(res,
30490
- json7,key7==="enabled"?config3.setEnabled(name6,body2.enabled):config3.setApps(name6,body2.apps))}let{vaultKeys:_keys,...fields2}=body2??{},parsed2=parseMcpServerMutation(name6,fields2,existing.server);return parsed2.ok?answer2(res,json7,config3.replace(name6,parsed2.server,vaultKeysOf(body2,ownsVault()))):json7(res,400,{error:parsed2.error})}return PASS}}import{join as join266}from"node:path";function jitteredWait(base2,random2){return Math.round(base2*(1-.25+2*.25*random2()))}function createBackgroundCheck(deps){let now2=deps.now??Date.now,random2=deps.random??Math.random,setTimer=deps.setTimer??((run11,ms2)=>{let timer5=setTimeout(run11,ms2);return timer5.unref?.(),{cancel:()=>clearTimeout(timer5)}}),timer4=null,running5=null,stopped=!0,tick2=async()=>{if(running5||deps.asleep())return null;let ref4=deps.due()[0];if(ref4===void 0)return null;let startedAt=now2();running5=new AbortController;
30508
+ json7,key7==="enabled"?config3.setEnabled(name6,body2.enabled):config3.setApps(name6,body2.apps))}let{vaultKeys:_keys,...fields2}=body2??{},parsed2=parseMcpServerMutation(name6,fields2,existing.server);return parsed2.ok?answer2(res,json7,config3.replace(name6,parsed2.server,vaultKeysOf(body2,ownsVault()))):json7(res,400,{error:parsed2.error})}return PASS}}import{join as join267}from"node:path";function jitteredWait(base2,random2){return Math.round(base2*(1-.25+2*.25*random2()))}function createBackgroundCheck(deps){let now2=deps.now??Date.now,random2=deps.random??Math.random,setTimer=deps.setTimer??((run11,ms2)=>{let timer5=setTimeout(run11,ms2);return timer5.unref?.(),{cancel:()=>clearTimeout(timer5)}}),timer4=null,running5=null,stopped=!0,tick2=async()=>{if(running5||deps.asleep())return null;let ref4=deps.due()[0];if(ref4===void 0)return null;let startedAt=now2();running5=new AbortController;
30491
30509
  try{let outcome=await deps.check(ref4,running5.signal).catch(()=>null),woke=deps.wokeAt();return outcome===null||deps.asleep()||woke!==null&&woke>=startedAt||running5.signal.aborted?null:(deps.record(ref4,outcome),ref4)}finally{running5=null}},schedule2=ms2=>{timer4=setTimer(()=>{stopped||tick2().finally(()=>{stopped||schedule2(jitteredWait(36e5,random2))})},ms2)};return{start(){stopped&&(stopped=!1,schedule2(9e5+jitteredWait(36e5,random2)))},stop(){stopped=!0,timer4?.cancel(),timer4=null,running5?.
30492
- abort()},tick:tick2}}init_zod();init_atomic();import{readFileSync as readFileSync190}from"node:fs";var CONNECTION_HEALTH_FILE="connection-health.json",HEALTH_STATES=["working","needs-sign-in","refused","unreachable"],FAILURE_CLASSES=["sign-in","expired","refresh-rejected","account-inactive","refused","account-failed","cant-connect","timeout","not-found","bad-answer"],SIGNED_OUT3=new Set(["sign-in","expired","refresh-rejected","account-inactive"]),REFUSED=new Set(["refused","account-failed"]),UNREACHABLE_AFTER=2,healthOf=error66=>SIGNED_OUT3.
30510
+ abort()},tick:tick2}}init_zod();init_atomic();import{readFileSync as readFileSync191}from"node:fs";var CONNECTION_HEALTH_FILE="connection-health.json",HEALTH_STATES=["working","needs-sign-in","refused","unreachable"],FAILURE_CLASSES=["sign-in","expired","refresh-rejected","account-inactive","refused","account-failed","cant-connect","timeout","not-found","bad-answer"],SIGNED_OUT3=new Set(["sign-in","expired","refresh-rejected","account-inactive"]),REFUSED=new Set(["refused","account-failed"]),UNREACHABLE_AFTER=2,healthOf=error66=>SIGNED_OUT3.
30493
30511
  has(error66)?"needs-sign-in":REFUSED.has(error66)?"refused":null;function accountHealth(status5){let word=status5.trim().toUpperCase();return word==="ACTIVE"?{health:"working"}:word==="FAILED"?{health:"refused",error:"account-failed"}:["EXPIRED","INACTIVE","INITIATED","INITIALIZING","PENDING","REVOKED","DISABLED"].includes(word)?{health:"needs-sign-in",error:"account-inactive"}:null}var failureSchema2=external_exports.enum(FAILURE_CLASSES),keptSchema=external_exports.object({health:external_exports.
30494
30512
  enum(HEALTH_STATES).optional(),checkedAt:external_exports.number().optional(),lastError:failureSchema2.optional(),usedAt:external_exports.number().optional(),misses:external_exports.number().int().nonnegative().optional(),missError:failureSchema2.optional()}),fileSchema25=external_exports.object({v:external_exports.literal(1),connections:external_exports.record(external_exports.string(),keptSchema).default({}),people:external_exports.record(external_exports.string(),external_exports.record(external_exports.
30495
- string(),keptSchema)).default({}),added:external_exports.record(external_exports.string(),external_exports.object({email:external_exports.string().max(320),at:external_exports.number()})).default({})}),key6=(kind2,id12)=>`${kind2}:${id12}`;function createConnectionHealth(options2){let now2=options2.now??Date.now,data4={v:1,connections:{},people:{},added:{}};try{data4=fileSchema25.parse(JSON.parse(readFileSync190(options2.file,"utf8")))}catch{}let timer4=null,flush=()=>{timer4&&(clearTimeout(timer4),
30513
+ string(),keptSchema)).default({}),added:external_exports.record(external_exports.string(),external_exports.object({email:external_exports.string().max(320),at:external_exports.number()})).default({})}),key6=(kind2,id12)=>`${kind2}:${id12}`;function createConnectionHealth(options2){let now2=options2.now??Date.now,data4={v:1,connections:{},people:{},added:{}};try{data4=fileSchema25.parse(JSON.parse(readFileSync191(options2.file,"utf8")))}catch{}let timer4=null,flush=()=>{timer4&&(clearTimeout(timer4),
30496
30514
  timer4=null);try{writeFileAtomic(options2.file,`${JSON.stringify(data4)}
30497
30515
  `,{mode:384})}catch(error66){console.warn(`connection health: could not save: ${error66 instanceof Error?error66.message:String(error66)}`)}},save7=()=>{timer4||(timer4=setTimeout(flush,options2.saveDelayMs??2e3),timer4.unref?.())},slot=(ref4,create5)=>{let k3=key6(ref4.kind,ref4.id);if(!ref4.person)return create5?data4.connections[k3]??={}:data4.connections[k3];let own4=create5?data4.people[ref4.person]??={}:data4.people[ref4.person];return own4?create5?own4[k3]??={}:own4[k3]:void 0};return{observe(ref4,outcome,options3={}){
30498
30516
  let kept2=slot(ref4,!0),at8=now2();if(options3.use&&(kept2.usedAt=at8),outcome.ok)Object.assign(kept2,{health:"working",checkedAt:at8}),delete kept2.lastError,delete kept2.misses,delete kept2.missError;else{let decided2=healthOf(outcome.error);decided2?(Object.assign(kept2,{health:decided2,checkedAt:at8,lastError:outcome.error}),delete kept2.misses,delete kept2.missError):(kept2.misses=(kept2.misses??0)+1,kept2.missError=outcome.error,kept2.misses>=UNREACHABLE_AFTER&&Object.assign(kept2,{health:"\
@@ -30504,7 +30522,7 @@ REFUSED2=/\b403\b|forbidden|insufficient[_ ](?:scope|permission)s?|permission de
30504
30522
  `).reverse())if(line6.startsWith("data:"))try{let frame2=JSON.parse(line6.slice(5));if(frame2&&typeof frame2=="object"&&frame2.id!==void 0)return frame2}catch{}return null}function failedErrors(value3,depth2=0,out=[]){if(depth2>5||!value3||typeof value3!="object")return out;if(Array.isArray(value3)){for(let item of value3.slice(0,50))failedErrors(item,depth2+1,out);return out}let record31=value3;(record31.successful===!1||record31.success===!1)&&out.push(typeof record31.error=="string"?record31.
30505
30523
  error:JSON.stringify(record31.error??""));for(let child2 of Object.values(record31))child2&&typeof child2=="object"&&failedErrors(child2,depth2+1,out);return out}var classify=text30=>SIGNED_OUT4.test(text30)?{ok:!1,error:"sign-in"}:REFUSED2.test(text30)?{ok:!1,error:"refused"}:null;function appCallOutcome(status5,bytes4,contentType){if(status5===0||status5>=500)return{ok:!1,error:"cant-connect"};if(status5<200||status5>=300)return null;let frame2=frameOf2(Buffer.from(bytes4.subarray(0,MAX_READ)).
30506
30524
  toString("utf8"),contentType);if(!frame2||typeof frame2!="object"||frame2.error!==void 0||!frame2.result)return null;let texts2=Array.isArray(frame2.result.content)?frame2.result.content.flatMap(item=>item?.type==="text"&&typeof item.text=="string"?[item.text]:[]):[],errors2=[],parsed2=!1;for(let text30 of texts2)try{failedErrors(JSON.parse(text30),0,errors2),parsed2=!0}catch{}return!parsed2&&frame2.result.isError===!0&&errors2.push(...texts2),errors2.length?classify(errors2.join(`
30507
- `).slice(0,4e3))??{ok:!0}:{ok:!0}}init_mcp_registry();var iso3=ms2=>ms2===void 0?void 0:new Date(ms2).toISOString(),ADD_PENDING_MS=60*6e4;function createConnectionHealthHost(deps){let store5=deps.dataDir===null?null:createConnectionHealth({file:join266(deps.dataDir,CONNECTION_HEALTH_FILE),...deps.now?{now:deps.now}:{}}),now2=deps.now??Date.now,remote=name6=>{let raw=deps.mcpServers()[name6],parsed2=raw===void 0?null:parseStoredMcpServer(name6,raw);return parsed2?.ok&&isRemoteMcpServer(parsed2.server)?parsed2.server:null},remoteUrl=name6=>remote(name6)?.
30525
+ `).slice(0,4e3))??{ok:!0}:{ok:!0}}init_mcp_registry();var iso3=ms2=>ms2===void 0?void 0:new Date(ms2).toISOString(),ADD_PENDING_MS=60*6e4;function createConnectionHealthHost(deps){let store5=deps.dataDir===null?null:createConnectionHealth({file:join267(deps.dataDir,CONNECTION_HEALTH_FILE),...deps.now?{now:deps.now}:{}}),now2=deps.now??Date.now,remote=name6=>{let raw=deps.mcpServers()[name6],parsed2=raw===void 0?null:parseStoredMcpServer(name6,raw);return parsed2?.ok&&isRemoteMcpServer(parsed2.server)?parsed2.server:null},remoteUrl=name6=>remote(name6)?.
30508
30526
  url??null,oauthOf=person2=>person2?deps.connections.people.oauth(person2):deps.mcpOAuth,refusedCredentials=async(ref4,error66,firstLine2)=>{let server2=remote(ref4.id);if(!server2)return{ok:!1,error:error66};let oauth=oauthOf(ref4.person);if(oauth.authState(ref4.id,server2.url)!=="signed-in"||forbidsRatherThanSignsOut(firstLine2))return{ok:!1,error:(ref4.person?deps.connections.people.key(ref4.person,ref4.id,server2.url)!==null:Object.keys(server2.headers).length>0)?"refused":error66};let refusal7=await oauth.
30509
30527
  tokenRefused(ref4.id,server2.url);return refusal7==="ended"?{ok:!1,error:"sign-in"}:refusal7==="again"?{ok:!1,error:"refused"}:null},checkTeamServer=async(name6,result2)=>{let outcome=probeOutcome(result2);return outcome.ok||outcome.error!=="refused"?outcome:refusedCredentials({kind:"mcp",id:name6},"refused",result2.ok?"":`HTTP ${result2.status??""}`)},background4=store5&&deps.test?createBackgroundCheck({due:()=>{let personal=deps.connections.personMcp();return Object.keys(deps.mcpServers()).flatMap(
30510
30528
  name6=>{let raw=deps.mcpServers()[name6],parsed2=parseStoredMcpServer(name6,raw);if(!parsed2.ok||!isRemoteMcpServer(parsed2.server)||!parsed2.server.enabled||parsed2.server.runsOn||personal.includes(name6))return[];if(deps.mcpOAuth.authState(name6,parsed2.server.url)==="needs-sign-in")return[];let view3=store5.get({kind:"mcp",id:name6}),last=Math.max(view3.lastUsedAt??0,view3.checkedAt??0);return now2()-last>=864e5?[{name:name6,last}]:[]}).sort((a,b11)=>a.last-b11.last).map(entry2=>entry2.name)},
@@ -30521,7 +30539,7 @@ name6,result2);outcome&&store5.observe({kind:"mcp",id:name6},outcome)},added(kin
30521
30539
  known("mcp"))Object.hasOwn(configured2,id12)||store5.forget("mcp",id12);let scopes=summary3.scopes??{apps:[],mcp:[]};if(summary3.apps.available){let listed3=new Set(summary3.apps.services.map(service=>service.slug));for(let id12 of store5.known("app")){let added=store5.addedBy("app",id12);!listed3.has(id12)&&!scopes.apps.includes(id12)&&(!added||now2()-added.at>=ADD_PENDING_MS)&&store5.forget("app",id12)}}let bots=teamBots(),servers=new Map(bots.map(bot=>[bot,deps.botServers(bot)])),members2=deps.
30522
30540
  roster();return{...summary3,apps:{...summary3.apps,services:summary3.apps.services.map(service=>{let shared=!scopes.apps.includes(service.slug);return{...service,accounts:service.accounts.map(account2=>{let word=accountHealth(account2.status);return word?{...account2,health:word.health}:account2}),...shared?status5(appView(service.slug,service.accounts)):{},...provenance("app",service.slug),bots:bots.filter(bot=>usesApp(bot,service.slug)).map(bot=>bot.name)}})},mcp:summary3.mcp.map(server2=>{let shared=!scopes.
30523
30541
  mcp.includes(server2.name),url2=remoteUrl(server2.name),endsAt=shared&&url2?deps.mcpOAuth.endsAt(server2.name,url2):null;return{...server2,...endsAt!==null?{expiresAt:iso3(endsAt)}:{},...shared?status5(mcpView(server2.name,server2.signedIn,endsAt)):{},...provenance("mcp",server2.name),bots:bots.filter(bot=>servers.get(bot).includes(server2.name)).map(bot=>bot.name)}}),...summary3.people?{people:{...summary3.people,states:await personStates(scopes,members2)}}:{}}},start(){background4?.start()},stop(){
30524
- background4?.stop(),store5?.flush()},checkNow:()=>background4?.tick()??Promise.resolve(null)}}init_zod();init_config3();import{rmSync as rmSync66}from"node:fs";import{join as join267}from"node:path";init_bot_profile();init_redact();init_routine_schedule();var GROK_EXPORT_FORMAT="grok-bot-export";var GROK_EXPORT_FILE=/^grok-bot-export[^/\\]*\.(?:json|md|txt)$/i,GROK_EXPORT_MAX_CHARS=4*1024*1024;var GROK_EXPORT_PROMPT=`I'm moving to another assistant and need a complete, machine-readable copy of your setup. Do not change, pause or delete anything.
30542
+ background4?.stop(),store5?.flush()},checkNow:()=>background4?.tick()??Promise.resolve(null)}}init_zod();init_config3();import{rmSync as rmSync66}from"node:fs";import{join as join268}from"node:path";init_bot_profile();init_redact();init_routine_schedule();var GROK_EXPORT_FORMAT="grok-bot-export";var GROK_EXPORT_FILE=/^grok-bot-export[^/\\]*\.(?:json|md|txt)$/i,GROK_EXPORT_MAX_CHARS=4*1024*1024;var GROK_EXPORT_PROMPT=`I'm moving to another assistant and need a complete, machine-readable copy of your setup. Do not change, pause or delete anything.
30525
30543
 
30526
30544
  Write one JSON document with exactly this shape, then save it as grok-bot-export-<your name>.json (your name in lowercase, spaces as hyphens): in my Downloads folder if you can write to my computer, otherwise in your workspace, and attach it to your reply. If you cannot attach files, put the whole document in a single \`\`\`json code block instead.
30527
30545
 
@@ -30559,10 +30577,10 @@ Rules: include EVERY routine you own (paused ones too) and EVERY skill enabled f
30559
30577
  If it is too long for one message or file, split it: send several documents, each complete and valid in this same shape with the same bot name, each holding the part the others do not. They are imported together.
30560
30578
  `;init_redact();var USER_DATA_FOLDERS=[["Library","Application Support","Grok Bot"],["AppData","Roaming","Grok Bot"],[".config","Grok Bot"]],CACHE_FOLDER="sand-client-persistence",SLICE_PREFIX="sand.client.slice.account.",ROSTER_SLICE="roster.last-roster",MAX_SLICE_BYTES=32*1024*1024,MAX_EXPORT_FILES=20,MAX_EXPORT_BYTES=16*1024*1024,BASE322="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";function sliceId(fileName){if(!fileName.endsWith(".blob"))return null;let stem2=fileName.slice(0,-5).toUpperCase(),bytes4=[],
30561
30579
  bits=0,value3=0;for(let ch2 of stem2){let digit=BASE322.indexOf(ch2);if(digit<0)return null;value3=(value3<<5|digit)&4095,bits+=5,bits>=8&&(bits-=8,bytes4.push(value3>>bits&255))}try{return new TextDecoder("utf-8",{fatal:!0}).decode(new Uint8Array(bytes4))}catch{return null}}function sliceKind(id12){if(!id12?.startsWith(SLICE_PREFIX))return null;let separator=id12.indexOf(".",SLICE_PREFIX.length);if(separator<0)return null;try{return decodeURIComponent(id12.slice(separator+1))}catch{return null}}
30562
- function sliceValue(machine,path6){let raw=machine.fs.read(path6,MAX_SLICE_BYTES,!1);if(!raw)return null;try{let value3=JSON.parse(raw.toString("utf8"))?.value;return value3&&typeof value3=="object"&&!Array.isArray(value3)?value3:null}catch{return null}}var shown2=value3=>typeof value3=="string"?redactSecretsInText(value3.trim()).slice(0,200):"",rows=value3=>Array.isArray(value3)?value3.filter(row=>!!row&&typeof row=="object"):[];function rosterBots(machine){let folder3=USER_DATA_FOLDERS.map(parts3=>join267(
30563
- machine.home,...parts3,CACHE_FOLDER)).find(path6=>machine.fs.lstat(path6)?.isDirectory()),slice5=(folder3?machine.fs.readdir(folder3):null)?.find(name6=>sliceKind(sliceId(name6))===ROSTER_SLICE);return!folder3||!slice5?[]:rows(sliceValue(machine,join267(folder3,slice5))?.rows).flatMap(row=>{let name6=shown2(row.name);return name6&&!row.isGroup?[name6]:[]})}function readExportFiles(machine){let folder3=join267(machine.home,"Downloads"),found2=(machine.fs.readdir(folder3)??[]).filter(name6=>GROK_EXPORT_FILE.
30564
- test(name6)).flatMap(name6=>{let stats=machine.fs.lstat(join267(folder3,name6));return stats?.isFile()&&stats.size<=GROK_EXPORT_MAX_CHARS?[{name:name6,modifiedAt:stats.mtimeMs,size:stats.size}]:[]}).sort((a,b11)=>b11.modifiedAt-a.modifiedAt).slice(0,MAX_EXPORT_FILES),budget=MAX_EXPORT_BYTES;return found2.flatMap(({name:name6,modifiedAt,size:size3})=>{if(size3>budget)return[];let raw=machine.fs.read(join267(folder3,name6),GROK_EXPORT_MAX_CHARS,!1);return raw?(budget-=raw.length,[{name:name6,modifiedAt,
30565
- text:raw.toString("utf8")}]):[]})}function lookForGrokBot(machine){return{files:readExportFiles(machine),bots:rosterBots(machine)}}function removeOldCursorSignIn(dataDir){try{rmSync66(join267(dataDir,"cursor-session.json"),{force:!0})}catch{}}var SETUP_IMPORT_PATH="/api/setup-import",GROK_LOOK_PATH="/api/setup-import/grok",LOCAL_ONLY="Only the desktop app on the computer running Limix Bot can bring in that computer's skills and tools.",requestSchema2=external_exports.object({skills:external_exports.boolean().optional(),tools:external_exports.boolean().optional()}).strict();function createSetupImportRoutes(deps){removeOldCursorSignIn(deps.dataDir??DATA_DIR);let machine=deps.machine??thisMachine,host3={mcpServers:()=>deps.cfg.mcpServers??
30580
+ function sliceValue(machine,path6){let raw=machine.fs.read(path6,MAX_SLICE_BYTES,!1);if(!raw)return null;try{let value3=JSON.parse(raw.toString("utf8"))?.value;return value3&&typeof value3=="object"&&!Array.isArray(value3)?value3:null}catch{return null}}var shown2=value3=>typeof value3=="string"?redactSecretsInText(value3.trim()).slice(0,200):"",rows=value3=>Array.isArray(value3)?value3.filter(row=>!!row&&typeof row=="object"):[];function rosterBots(machine){let folder3=USER_DATA_FOLDERS.map(parts3=>join268(
30581
+ machine.home,...parts3,CACHE_FOLDER)).find(path6=>machine.fs.lstat(path6)?.isDirectory()),slice5=(folder3?machine.fs.readdir(folder3):null)?.find(name6=>sliceKind(sliceId(name6))===ROSTER_SLICE);return!folder3||!slice5?[]:rows(sliceValue(machine,join268(folder3,slice5))?.rows).flatMap(row=>{let name6=shown2(row.name);return name6&&!row.isGroup?[name6]:[]})}function readExportFiles(machine){let folder3=join268(machine.home,"Downloads"),found2=(machine.fs.readdir(folder3)??[]).filter(name6=>GROK_EXPORT_FILE.
30582
+ test(name6)).flatMap(name6=>{let stats=machine.fs.lstat(join268(folder3,name6));return stats?.isFile()&&stats.size<=GROK_EXPORT_MAX_CHARS?[{name:name6,modifiedAt:stats.mtimeMs,size:stats.size}]:[]}).sort((a,b11)=>b11.modifiedAt-a.modifiedAt).slice(0,MAX_EXPORT_FILES),budget=MAX_EXPORT_BYTES;return found2.flatMap(({name:name6,modifiedAt,size:size3})=>{if(size3>budget)return[];let raw=machine.fs.read(join268(folder3,name6),GROK_EXPORT_MAX_CHARS,!1);return raw?(budget-=raw.length,[{name:name6,modifiedAt,
30583
+ text:raw.toString("utf8")}]):[]})}function lookForGrokBot(machine){return{files:readExportFiles(machine),bots:rosterBots(machine)}}function removeOldCursorSignIn(dataDir){try{rmSync66(join268(dataDir,"cursor-session.json"),{force:!0})}catch{}}var SETUP_IMPORT_PATH="/api/setup-import",GROK_LOOK_PATH="/api/setup-import/grok",LOCAL_ONLY="Only the desktop app on the computer running Limix Bot can bring in that computer's skills and tools.",requestSchema2=external_exports.object({skills:external_exports.boolean().optional(),tools:external_exports.boolean().optional()}).strict();function createSetupImportRoutes(deps){removeOldCursorSignIn(deps.dataDir??DATA_DIR);let machine=deps.machine??thisMachine,host3={mcpServers:()=>deps.cfg.mcpServers??
30566
30584
  {},mcpPolicyRefusal:deps.mcpPolicyRefusal,persistMcpServers:deps.persistMcpServers,mcpConfigBusy:deps.mcpConfigBusy,claudeUserMcp:()=>claudeUserMcpEnabled(deps.cfg)};return async({req,res,path:path6,method:method2,auth,json:json7,readBody:readBody2})=>{if(path6===GROK_LOOK_PATH)return method2!=="GET"?json7(res,405,{error:"method not allowed"}):!deps.local||auth.kind!=="loopback"||auth.trust==="service"?json7(res,403,{error:LOCAL_ONLY}):(res.setHeader("Cache-Control","no-store"),json7(res,200,lookForGrokBot(
30567
30585
  machine())));if(path6!==SETUP_IMPORT_PATH)return PASS;if(method2!=="GET"&&method2!=="POST")return json7(res,405,{error:"method not allowed"});if(!deps.local||auth.kind!=="loopback"||auth.trust==="service")return json7(res,403,{error:LOCAL_ONLY});if(res.setHeader("Cache-Control","no-store"),method2==="GET")return json7(res,200,detectSetup(machine(),host3));if(!String(req.headers["content-type"]??"").toLowerCase().startsWith("application/json"))return json7(res,415,{error:"content-type must be app\
30568
30586
  lication/json"});let parsed2=requestSchema2.safeParse(await readBody2(req,4096));return!parsed2.success||!parsed2.data.skills&&!parsed2.data.tools?json7(res,400,{error:"Choose skills, tools or both."}):json7(res,200,applySetupImport(machine(),host3,parsed2.data))}}init_zod();init_config3();init_redact2();var RUNNING=new Set(["idle","ready","running"]),STARTING=new Set(["init","provisioning","provisioned","cloning"]),FAILED=new Set(["error","cancelled"]),MAX_BACKOFF_MS=12e4;function mapComputerState(machine,working){return machine?RUNNING.has(machine.state)?working?"working":"idle":STARTING.has(machine.state)?"starting":SLEEPING_BOAT_STATES.has(machine.state)?"asleep":FAILED.has(machine.state)?"problem":"off":"off"}function createFrameBudget(perSecond,now2){let tokens=perSecond,refilledAt=now2();
@@ -30652,9 +30670,9 @@ req));if(!parsed2.success)return json7(res,400,userError("serverError.department
30652
30670
  includes(section4))return json7(res,404,userError("serverError.department.notFound"));let ids=external_exports.array(external_exports.string().regex(/^[\w-]+$/)).max(MAX_WORKSPACE_BOTS2),parsed2=external_exports.object({addBotIds:ids,removeBotIds:ids}).strict().safeParse(await readBody2(req));if(!parsed2.success)return json7(res,400,{error:"Provide addBotIds and removeBotIds"});for(let[botIds,destination]of[[parsed2.data.addBotIds,section4],[parsed2.data.removeBotIds,void 0]])for(let id12 of botIds){
30653
30671
  let bot=store5.bot(id12);bot&&assertTeamComputerChangeIdle2(bot,{...bot,section:destination})}let result2=store5.updateTeamMembers(section4,parsed2.data.addBotIds,parsed2.data.removeBotIds);return result2.ok?json7(res,200,{sections:store5.sections,bots:result2.bots.map(wireBot2)}):json7(res,result2.reason==="unavailable"?404:409,result2.reason==="chief-conflict"?userError("serverError.department.moveChiefConflict"):result2.reason==="membership-changed"?userError("serverError.department.membershi\
30654
30672
  pChanged"):{error:"One or more bots are unavailable"})}if(method2==="POST"&&path6==="/api/sidebar-sections"){let parsed2=createSidebarSectionSchema.safeParse(await readBody2(req));if(!parsed2.success)return json7(res,400,{error:"Provide a department name and up to 100 valid botIds"});let name6=parsed2.data.name.trim();if(name6.length>60)return json7(res,400,{error:"name must be at most 60 characters"});let botIds=[...new Set(parsed2.data.botIds)];if(!name6&&!botIds.length)return json7(res,400,{error:"\
30655
- Department name is required"});for(let botId of botIds){let bot=store5.bot(botId);bot&&assertTeamComputerChangeIdle2(bot,{...bot,section:name6||void 0})}let result2=store5.setBotsSection(botIds,name6);return result2.ok?json7(res,200,{section:name6,sections:store5.sections,bots:result2.bots.map(wireBot2)}):result2.reason==="chief-conflict"?json7(res,409,{...userError("serverError.department.oneChief")}):json7(res,404,{error:"one or more bots are unavailable"})}return PASS}}init_redact();import{createReadStream as createReadStream13}from"node:fs";import{stat as stat15}from"node:fs/promises";import{join as join268}from"node:path";import{createInterface as createInterface2}from"node:readline";var MAX_CACHED_MONTHS=24,cache4=new Map,loading=new Map;async function readFrom(file3,start,into){let stream2=createReadStream13(file3,{encoding:"utf8",start}),consumed=start,unparsed=0;for await(let line6 of createInterface2({input:stream2,crlfDelay:1/0})){consumed+=unparsed,unparsed=0;let bytes4=Buffer.byteLength(line6)+1;if(!line6){consumed+=bytes4;continue}try{let value3=JSON.parse(line6);isUsageRow(value3)&&into.push(value3),consumed+=bytes4}catch{unparsed=bytes4}}return Math.min(consumed,start+
30673
+ Department name is required"});for(let botId of botIds){let bot=store5.bot(botId);bot&&assertTeamComputerChangeIdle2(bot,{...bot,section:name6||void 0})}let result2=store5.setBotsSection(botIds,name6);return result2.ok?json7(res,200,{section:name6,sections:store5.sections,bots:result2.bots.map(wireBot2)}):result2.reason==="chief-conflict"?json7(res,409,{...userError("serverError.department.oneChief")}):json7(res,404,{error:"one or more bots are unavailable"})}return PASS}}init_redact();import{createReadStream as createReadStream13}from"node:fs";import{stat as stat15}from"node:fs/promises";import{join as join269}from"node:path";import{createInterface as createInterface2}from"node:readline";var MAX_CACHED_MONTHS=24,cache4=new Map,loading=new Map;async function readFrom(file3,start,into){let stream2=createReadStream13(file3,{encoding:"utf8",start}),consumed=start,unparsed=0;for await(let line6 of createInterface2({input:stream2,crlfDelay:1/0})){consumed+=unparsed,unparsed=0;let bytes4=Buffer.byteLength(line6)+1;if(!line6){consumed+=bytes4;continue}try{let value3=JSON.parse(line6);isUsageRow(value3)&&into.push(value3),consumed+=bytes4}catch{unparsed=bytes4}}return Math.min(consumed,start+
30656
30674
  stream2.bytesRead)}function monthRows(file3){let pending3=loading.get(file3);if(pending3)return pending3;let read4=loadMonth(file3).finally(()=>loading.delete(file3));return loading.set(file3,read4),read4}async function loadMonth(file3){let size3;try{size3=(await stat15(file3)).size}catch{return cache4.delete(file3),[]}let cached4=cache4.get(file3);if(cached4&&cached4.size===size3)return cached4.rows;let rows2=cached4&&cached4.size<size3?cached4.rows:[],consumed=await readFrom(file3,cached4&&cached4.
30657
- size<size3?cached4.size:0,rows2);return cache4.delete(file3),cache4.set(file3,{size:consumed,rows:rows2}),cache4.size>MAX_CACHED_MONTHS&&cache4.delete(cache4.keys().next().value),rows2}async function ledgerRows(dataDir,from,to2){let out=[];for(let month of monthsBetween(new Date(from),new Date(to2)))for(let row of await monthRows(join268(dataDir,"usage",`${month}.jsonl`))){let at8=Date.parse(row.at);at8>=from&&at8<=to2&&out.push(row)}return out}function traceRootId(threadId,turnId){return`${encodeURIComponent(threadId)}~${encodeURIComponent(turnId)}`}var SERVER_ICONS={phone:"phone",data:"data",dweb:"web",browser:"browser",computer:"computer"},OWN_SERVERS2=new Set(["agents","ogb","composio",OWN_APPS_SERVER,...Object.keys(SERVER_ICONS)]),COMPOSIO_ACTION=/^([A-Z][A-Z0-9]+)_[A-Z0-9_]+$/,BUILT_IN_ICONS=[[/^(?:websearch|web_search|search_web|google_search|x_search|research)$/,"search"],[/^(?:webfetch|web_fetch|fetch|open_url|read_url|fetch_url)$/,
30675
+ size<size3?cached4.size:0,rows2);return cache4.delete(file3),cache4.set(file3,{size:consumed,rows:rows2}),cache4.size>MAX_CACHED_MONTHS&&cache4.delete(cache4.keys().next().value),rows2}async function ledgerRows(dataDir,from,to2){let out=[];for(let month of monthsBetween(new Date(from),new Date(to2)))for(let row of await monthRows(join269(dataDir,"usage",`${month}.jsonl`))){let at8=Date.parse(row.at);at8>=from&&at8<=to2&&out.push(row)}return out}function traceRootId(threadId,turnId){return`${encodeURIComponent(threadId)}~${encodeURIComponent(turnId)}`}var SERVER_ICONS={phone:"phone",data:"data",dweb:"web",browser:"browser",computer:"computer"},OWN_SERVERS2=new Set(["agents","ogb","composio",OWN_APPS_SERVER,...Object.keys(SERVER_ICONS)]),COMPOSIO_ACTION=/^([A-Z][A-Z0-9]+)_[A-Z0-9_]+$/,BUILT_IN_ICONS=[[/^(?:websearch|web_search|search_web|google_search|x_search|research)$/,"search"],[/^(?:webfetch|web_fetch|fetch|open_url|read_url|fetch_url)$/,
30658
30676
  "web"],[/^(?:bash|shell|terminal|run_command|execute|exec|vm_exec|computer_exec|run_shell_command|local_shell|killshell|bashoutput)$/,"terminal"],[/^(?:read|read_file|write|write_file|create_file|edit|multiedit|str_replace|apply_patch|notebookedit|delete|grep|glob|find|ls|list_files|attach_file|view|tool_result_read)$/,"files"],[/^(?:memory|remember|recall|memory_[a-z_]+|search_memory|save_memory|session_search|session_read)$/,"memory"],[/^(?:routine|routines|schedule|cron)(?:_[a-z_]+)?$|^[a-z_]*(?:routine|trigger)[a-z_]*$/,
30659
30677
  "routine"],[/^(?:publish_page|unpublish_page|[a-z_]*page_publish[a-z_]*|pages?_[a-z_]+)$/,"page"],[/^(?:show_html|show_widget|render_widget|show_chart|show_table|show_card|widget|[a-z_]*_card)$/,"widget"],[/^(?:coordinate_bots|ask_bots?|delegate|task|agent|assignment_status|send_to_bot|select_computer|create_bot)$/,"bots"],[/^(?:(?:open|start|list|close|retry)_threads?|list_bots|list_rooms|list_room_targets|post_to_room|create_room|manage_room)$/,"bots"],[/^(?:phone|android|adb)(?:_[a-z_]+)?$/,"\
30660
30678
  phone"],[/^(?:todowrite|update_plan|plan|think)$/,"plan"],[/^(?:generate_image|image_generation|imagegen|create_image)$/,"image"]];function traceToolLook(name6){let server2=/^mcp__(.+?)__/.exec(name6)?.[1],bare3=name6.replace(TOOL_NAMESPACE,""),composio=COMPOSIO_ACTION.exec(bare3);if(composio&&composio[1]!=="COMPOSIO")return{icon:"app",app:composio[1].toLowerCase()};if(server2&&isConnectedAppsServer(server2)||composio)return{icon:"app"};let surface=toolSurfaceKind(name6);if(surface)return{icon:surface};
@@ -30791,13 +30809,13 @@ pause(watch);let posted=watch.phase==="posted"?watch.row:null;if(watch.phase="ov
30791
30809
  get(event2.threadId);if(event2.type==="turn.started"){if(!event2.turnId||watch?.turnId===event2.turnId)return;watch&&close2(event2.threadId,watch,"over");let next={turnId:event2.turnId,timer:null,phase:"waiting",row:null};watches.set(event2.threadId,next),arm(event2.threadId,next);return}if(!(!watch||event2.turnId!==void 0&&event2.turnId!==watch.turnId)){if(AI_OUTPUT.has(event2.type)){close2(event2.threadId,watch,"settled");return}switch(event2.type){case"runtime.error":close2(event2.threadId,watch,
30792
30810
  "over");return;case"turn.wait_started":pause(watch);return;case"turn.wait_ended":watch.phase==="waiting"&&arm(event2.threadId,watch);return;case"turn.completed":close2(event2.threadId,watch,"over"),watches.delete(event2.threadId);return;default:return}}}}}function closeLeftOpen(deps){let open14;try{open14=(deps.leftOpen??openRescueMessages)()}catch(error66){console.error("first-reply rescue: could not read the notices left open:",error66 instanceof Error?error66.message:error66);return}for(let{threadId,
30793
30811
  message:message8}of open14){let tool5=message8.tool;if(!tool5?.rescue)continue;let botName=deps.store.bot(tool5.rescue.botId)?.name,name6=botName?firstReplyOverName(botName,tool5.rescue.ai):tool5.name;try{deps.store.patchMessage(threadId,message8.id,{tool:{...tool5,name:name6,rescue:{...tool5.rescue,over:!0}}})}catch(error66){console.error(`first-reply rescue: could not close a notice in ${threadId}:`,error66 instanceof Error?error66.message:error66)}}}function createReactionRoutes(deps){return async({req,res,path:path6,method:method2,auth,json:json7,readBody:readBody2})=>{let m3=path6.match(/^\/api\/threads\/([\w-]+)\/messages\/([\w-]+)\/reactions$/);if(!m3||method2!=="POST")return PASS;let body2=await readBody2(req),emoji3=normalizeReaction(body2?.emoji);if(!emoji3)return json7(res,400,{error:`emoji must be one of ${REACTIONS.join(" ")}`});if(body2.on!==void 0&&typeof body2.on!="boolean")return json7(res,400,{error:"on must be true or false"});
30794
- let notYours=deps.cloudGuestSendRefusal(auth,m3[1]);if(notYours)return json7(res,403,{error:notYours});try{return json7(res,200,await deps.react({auth,threadId:m3[1],messageId:m3[2],emoji:emoji3,reactor:deps.reactorFor(auth),on:body2.on}))}catch(error66){let{status:status5,code}=error66;if(typeof status5!="number")throw error66;return json7(res,status5,{error:error66 instanceof Error?error66.message:String(error66),...typeof code=="string"?{code}:{}})}}}import{createHash as createHash124}from"node:crypto";var conflict=message8=>Object.assign(new Error(message8),{status:409}),decidedByBot=card=>card.answeredBy?.kind==="bot";function createPersonReplies(deps){let{store:store5,sendSequencer:sendSequencer2}=deps;function room(threadId){let group2=store5.groupByThread(threadId),owned=group2?group2.dm?group2.threadId===threadId:!!store5.groupTaskByThread(group2.id,threadId):!1;return{group:group2,owned}}async function deliver(reply4){let{auth,threadId,owner:owner2,target:target4,answer:answer2,sendId,about,
30812
+ let notYours=deps.cloudGuestSendRefusal(auth,m3[1]);if(notYours)return json7(res,403,{error:notYours});try{return json7(res,200,await deps.react({auth,threadId:m3[1],messageId:m3[2],emoji:emoji3,reactor:deps.reactorFor(auth),on:body2.on}))}catch(error66){let{status:status5,code}=error66;if(typeof status5!="number")throw error66;return json7(res,status5,{error:error66 instanceof Error?error66.message:String(error66),...typeof code=="string"?{code}:{}})}}}import{createHash as createHash125}from"node:crypto";var conflict=message8=>Object.assign(new Error(message8),{status:409}),decidedByBot=card=>card.answeredBy?.kind==="bot";function createPersonReplies(deps){let{store:store5,sendSequencer:sendSequencer2}=deps;function room(threadId){let group2=store5.groupByThread(threadId),owned=group2?group2.dm?group2.threadId===threadId:!!store5.groupTaskByThread(group2.id,threadId):!1;return{group:group2,owned}}async function deliver(reply4){let{auth,threadId,owner:owner2,target:target4,answer:answer2,sendId,about,
30795
30813
  via,callId}=reply4,{group:group2,owned}=room(threadId);if(group2&&(!owned||!group2.memberIds.includes(owner2.id)))throw conflict(`the bot that ${about==="question"?"asked this question":"wrote this message"} is no longer in this conversation`);if(!group2&&!store5.taskByThread(owner2.id,threadId))throw conflict(`the ${about}'s conversation no longer exists`);let text30=group2?`@${owner2.name}: ${answer2}`:answer2,key7=group2?`group:${group2.id}:${threadId}:${sendId}`:`bot:${owner2.id}:${threadId}\
30796
30814
  :${sendId}`;return sendSequencer2.run(key7,sendFingerprint(text30,target4.id,group2?"chat":void 0),async()=>{let accepted=acceptedSendMatch(store5.messagesFor(threadId),sendId,text30,target4.id,group2?"chat":void 0);if(accepted.kind==="conflict")throw conflict(`this ${about} already has a different recorded answer`);if(accepted.kind==="match")return{queued:!1,repeated:!0};let queuedDirect=group2?null:queuedSteeredMessage(owner2.id,threadId,sendId);if(queuedDirect){if(queuedDirect.text!==text30||
30797
30815
  queuedDirect.replyToId!==target4.id)throw conflict(`this ${about} already has a different queued answer`);return{queued:!0}}let queuedRoom=group2?queuedChannelMessage(group2.id,threadId,sendId):null;if(queuedRoom){if(queuedRoom.text!==text30||queuedRoom.replyToId!==target4.id||queuedRoom.mode!=="chat")throw conflict(`this ${about} already has a different queued answer`);return{queued:!0}}let refused2=reply4.refusal?.();if(refused2)throw conflict(refused2);deps.assertWithinBudget();let sender2=deps.
30798
30816
  messageSender(auth),trigger=deps.usageTriggerFor(auth);if(group2){let current3=store5.group(group2.id);if(!current3||!owned)throw conflict("the room switched tasks before it could receive the answer");return deps.groupThreadIsWorking(current3.id,threadId)?(queueChannelMessage(current3.id,threadId,text30,{replyToId:target4.id,sendId,mode:"chat",sender:sender2,trigger,reaction:target4.reactedWith,mentions:[owner2.id]}),{queued:!0}):(deps.startGroupTurn(current3.id,text30,target4,sendId,"chat",void 0,
30799
30817
  {threadId,sender:sender2,trigger,mentions:[owner2.id]}),{queued:!1})}return{queued:!!(await deps.startOrQueueDirectMessage(owner2.id,threadId,text30,target4,sendId,sender2,trigger,via,callId)).queued}})}function withdraw(threadId,owner2,sendId){let group2=store5.groupByThread(threadId);if(group2){let queued2=queuedChannelMessage(group2.id,threadId,sendId);queued2&&cancelChannelMessage(group2.id,queued2.id);return}let queued=queuedSteeredMessage(owner2.id,threadId,sendId);queued&&cancelSteeredMessage(
30800
- owner2.id,queued.id,threadId)}async function deliverLateQuestionAnswer2(auth,threadId,requestId,answer2,cardMessage,owner2,via,callId){let latestCard=()=>store5.messagesFor(threadId).find(message8=>message8.id===cardMessage.id)?.card,receipt=await deliver({auth,threadId,owner:owner2,target:cardMessage,answer:answer2,via,callId,about:"question",sendId:`late-question-${createHash124("sha256").update(`${threadId}:${requestId}`).digest("hex").slice(0,32)}`,refusal:()=>{let card=latestCard();return!card||
30818
+ owner2.id,queued.id,threadId)}async function deliverLateQuestionAnswer2(auth,threadId,requestId,answer2,cardMessage,owner2,via,callId){let latestCard=()=>store5.messagesFor(threadId).find(message8=>message8.id===cardMessage.id)?.card,receipt=await deliver({auth,threadId,owner:owner2,target:cardMessage,answer:answer2,via,callId,about:"question",sendId:`late-question-${createHash125("sha256").update(`${threadId}:${requestId}`).digest("hex").slice(0,32)}`,refusal:()=>{let card=latestCard();return!card||
30801
30819
  card.answered&&!decidedByBot(card)||card.dismissed?"this question has already been answered":null}}),latest=latestCard();if(latest&&(!latest.answered||decidedByBot(latest))&&!latest.dismissed){let{answeredBy:_decider,...card}=latest;store5.patchMessage(threadId,cardMessage.id,{card:{...card,answered:"answer",answeredText:answer2,dismissed:!1}})}return receipt}return{deliver,withdraw,deliverLateQuestionAnswer:deliverLateQuestionAnswer2}}var EXACT=new Set(["POST /api/internal/hook","POST /api/internal/tool-timing","GET /api/internal/tool-result","POST /api/internal/tool-result","POST /api/internal/options-card","POST /api/internal/escalate","POST /api/internal/people/message","POST /api/internal/attach-file","POST /api/internal/voice-note","GET /api/internal/agents","GET /api/internal/rooms","GET /api/internal/room-targets","GET /api/internal/threads","POST /api/internal/threads","GET /api/internal/assignment-status","GET /api/i\
30802
30820
  nternal/session-search","GET /api/internal/session-read","GET /api/internal/skills","GET /api/internal/team-setup-catalog","GET /api/internal/team-library","GET /api/internal/engine-limits","GET /api/internal/triggers","GET /api/internal/trigger-events","GET /api/internal/waits","POST /api/internal/waits","POST /api/internal/waits/cancel","POST /api/internal/helpers/decide","POST /api/internal/helpers/extract","POST /api/internal/coordinate-bots","POST /api/internal/post-to-room","POST /api/inte\
30803
30821
  rnal/retry-thread","POST /api/internal/trigger-requests","POST /api/internal/manage-room","POST /api/internal/meetings/join","POST /api/internal/meetings/status","POST /api/internal/meetings/chat","POST /api/internal/meetings/leave","POST /api/internal/meetings/notes","POST /api/internal/memory","POST /api/internal/memory/log","POST /api/internal/team-memory","POST /api/internal/profile-requests","POST /api/internal/model-requests","POST /api/internal/team-setup-requests","POST /api/internal/bot\
@@ -30810,16 +30828,16 @@ rite"}),deps.notify(buildNotification("approval",{id:from.id,name:from.name},thr
30810
30828
  emoryTitle":"server.outside.memoryChangeTitle");return propose2(from,threadId,title3,[change2.oldText,change2.text].filter(Boolean).join(" \u2192 ")||action3,{kind:"memory",...change2})},resolve(threadId,requestId,behavior){let message8=store5.messagesFor(threadId).find(line6=>line6.card?.requestId===requestId&&line6.card.outsideWrite),card=message8?.card,write4=card?.outsideWrite;if(!message8||!card||!write4)return null;if(card.answered)return{ok:!0,outcome:card.answered==="allow"?"allowed-once":
30811
30829
  "rejected",alreadySettled:!0};let botId=message8.from?.botId??store5.botByThread(threadId)?.id,bot=botId?store5.bot(botId):void 0,allowed3=behavior==="allow",problem=allowed3?apply3(write4,threadId,botId):null;return store5.patchMessage(threadId,message8.id,{card:{...card,answered:allowed3?problem?"unavailable":"allow":"deny",...problem?{dismissed:!0}:{}}}),deps.decide({threadId,requestId,botId,botName:bot?.name,tool:TOOL3,summary:card.title,decision:allowed3&&!problem?"user-approved":"user-deni\
30812
30830
  ed",source:"user"}),{ok:!0,outcome:allowed3?problem?"unavailable":"allowed-once":"rejected"}}}}init_bot_owner();init_bot_owner();init_audience();var ASK_NOTIFICATIONS=new Set(["approval","question","sign-in","secret","routine-failed","routine-deferred","turn-failed","incident"]);function createAskRouting(deps){function askedPerson(botId,threadId){let member=audienceMember(deps.audienceOf(threadId));if(member)return member;let bot=botId?deps.bot(botId):void 0,owner2=bot?botOwner(bot):null;return owner2&&!deps.gone?.(owner2)?deps.personKeyOf(owner2):null}function asks2(viewer,botId,threadId){if(!deps.team)return!0;
30813
- let person2=askedPerson(botId,threadId);return person2===null?viewer.admin:person2===viewer.person}function notificationReaches(viewer,notification){return deps.team&&typeof notification.forPerson=="string"?notification.forPerson===viewer.person:!deps.team||typeof notification.threadId!="string"||!ASK_NOTIFICATIONS.has(notification.kind)?!0:asks2(viewer,typeof notification.botId=="string"?notification.botId:void 0,notification.threadId)}return{team:deps.team,askedPerson,asks:asks2,notificationReaches}}init_zod();init_bot_owner();init_atomic();import{readFileSync as readFileSync191}from"node:fs";import{join as join269}from"node:path";var TEAM_PEOPLE_FILE="team-people.json",MAX_PEOPLE2=500,personSchema=external_exports.object({email:external_exports.string().min(3).max(254),role:external_exports.enum(["owner","admin","member"]),firstSeenAt:external_exports.number().finite().nonnegative(),lastSeenAt:external_exports.number().finite().nonnegative(),leftAt:external_exports.number().finite().nonnegative().
30814
- optional()}),fileSchema26=external_exports.object({version:external_exports.literal(1),people:external_exports.array(personSchema).max(MAX_PEOPLE2)});function createTeamPeople(dataDir,now2=Date.now){let file3=join269(dataDir,TEAM_PEOPLE_FILE),people=[];try{let parsed2=fileSchema26.safeParse(JSON.parse(readFileSync191(file3,"utf8")));parsed2.success?people=parsed2.data.people:console.warn(`team people: ${file3} is not a people file; starting fresh`)}catch(error66){error66.code!=="ENOENT"&&console.
30831
+ let person2=askedPerson(botId,threadId);return person2===null?viewer.admin:person2===viewer.person}function notificationReaches(viewer,notification){return deps.team&&typeof notification.forPerson=="string"?notification.forPerson===viewer.person:!deps.team||typeof notification.threadId!="string"||!ASK_NOTIFICATIONS.has(notification.kind)?!0:asks2(viewer,typeof notification.botId=="string"?notification.botId:void 0,notification.threadId)}return{team:deps.team,askedPerson,asks:asks2,notificationReaches}}init_zod();init_bot_owner();init_atomic();import{readFileSync as readFileSync192}from"node:fs";import{join as join270}from"node:path";var TEAM_PEOPLE_FILE="team-people.json",MAX_PEOPLE2=500,personSchema=external_exports.object({email:external_exports.string().min(3).max(254),role:external_exports.enum(["owner","admin","member"]),firstSeenAt:external_exports.number().finite().nonnegative(),lastSeenAt:external_exports.number().finite().nonnegative(),leftAt:external_exports.number().finite().nonnegative().
30832
+ optional()}),fileSchema26=external_exports.object({version:external_exports.literal(1),people:external_exports.array(personSchema).max(MAX_PEOPLE2)});function createTeamPeople(dataDir,now2=Date.now){let file3=join270(dataDir,TEAM_PEOPLE_FILE),people=[];try{let parsed2=fileSchema26.safeParse(JSON.parse(readFileSync192(file3,"utf8")));parsed2.success?people=parsed2.data.people:console.warn(`team people: ${file3} is not a people file; starting fresh`)}catch(error66){error66.code!=="ENOENT"&&console.
30815
30833
  warn(`team people: ${file3} is unreadable; starting fresh`)}let listeners3=new Set,changed3=(email3,change2)=>{for(let listener2 of listeners3)try{listener2(email3,change2)}catch(error66){console.warn(`team people: ${error66 instanceof Error?error66.message:String(error66)}`)}},save7=()=>{try{writeFileAtomic(file3,`${JSON.stringify({version:1,people})}
30816
30834
  `,{mode:384})}catch(error66){console.warn(`team people: could not save ${file3}: ${error66 instanceof Error?error66.message:String(error66)}`)}};return{seen(email3,role){let address3=ownerEmail(email3),at8=now2(),known=people.find(person2=>person2.email===address3);known&&known.role===role&&known.leftAt===void 0&&at8-known.lastSeenAt<6e4||(people=[{email:address3,role,firstSeenAt:known?.firstSeenAt??at8,lastSeenAt:at8},...people.filter(person2=>person2.email!==address3)].slice(0,MAX_PEOPLE2),save7(),
30817
30835
  !known||known.leftAt!==void 0?changed3(address3,"joined"):known.role!==role&&changed3(address3,"role"))},left(email3){let address3=ownerEmail(email3),at8=now2(),known=people.find(person2=>person2.email===address3);people=[{email:address3,role:known?.role??"member",firstSeenAt:known?.firstSeenAt??at8,lastSeenAt:known?.lastSeenAt??at8,leftAt:at8},...people.filter(person2=>person2.email!==address3)].slice(0,MAX_PEOPLE2),save7(),known?.leftAt===void 0&&changed3(address3,"left")},onChange(listener2){
30818
30836
  return listeners3.add(listener2),()=>listeners3.delete(listener2)},gone(email3){let address3=ownerEmail(email3);return people.some(person2=>person2.email===address3&&person2.leftAt!==void 0)},has(email3){let address3=ownerEmail(email3);return people.some(person2=>person2.email===address3&&person2.leftAt===void 0)},list(){return people.filter(person2=>person2.leftAt===void 0).sort((a,b11)=>a.email.localeCompare(b11.email))},everyone(){return[...people]}}}var keyOf=email3=>personKey({id:"",email:email3});function createTeamOwners(deps){let team=deps.team,people=team?createTeamPeople(deps.dataDir):null;if(people){for(let session of deps.sessions.list())session.email&&session.teamRole&&people.seen(session.email,session.teamRole);deps.sessions.onSessionIssued(session=>{session.membershipAuthority==="team"&&session.email&&session.teamRole&&people.seen(session.email,session.teamRole)})}let routing=createAskRouting({team:!!team,audienceOf:deps.audienceOf,
30819
30837
  bot:botId=>deps.store().bot(botId)??void 0,personKeyOf:keyOf,gone:email3=>people?.gone(email3)??!1}),viewer=auth=>({person:auth.kind==="session"&&auth.session.email?personKey(auth.session):null,admin:auth.kind==="loopback"||auth.scopes.includes("admin")});return{people,routing,viewer,reaches:(ask2,payload)=>payload.kind!=="notify"||routing.notificationReaches(ask2,payload.notification??{}),noticeRouting:team?{askedPerson:routing.askedPerson,personOf:chief=>{let owner2=botOwner(chief);return owner2?
30820
- keyOf(owner2):null},startedBy:threadId=>deps.starters.get(threadId),open:(threadId,person2)=>deps.starters.set(threadId,person2)}:void 0,asks:team?(auth,botId,threadId)=>routing.asks(viewer(auth),botId,threadId):void 0,left(email3){people?.left(email3)},backfill(moveIns){for(let[botId,move3]of Object.entries(moveIns))move3.email&&!people?.gone(move3.email)&&setCreatedBy(deps.store(),botId,move3.email)}}}init_user_errors();init_peer_provenance();init_zod();init_bot_owner();init_audience();init_zod();init_bot_owner();import{readFileSync as readFileSync192}from"node:fs";import{join as join270}from"node:path";init_atomic();init_audience();init_bot_visibility();init_peer_roster();var PERSON_INBOX_FILE="person-inbox.json",INBOX_TITLE="Inbox",BRIEF_TITLE="Brief",MAX_ITEMS2=2e3,KEEP_MS3=720*60*6e4,NOTE_MAX=2e3,VIEW_ROWS=200,ROW_TEXT_MAX=4e3,ASSISTANT_HOURLY=20,HOUR_MS=60*6e4,id9=external_exports.string().min(1).max(512),person=external_exports.string().regex(/^p_[\w-]{22}$/u),itemSchema=external_exports.object({id:id9,person,botId:id9,threadId:id9,kind:external_exports.enum(["message","ask","result","notice"]),from:external_exports.string().max(200),fromEmail:external_exports.
30838
+ keyOf(owner2):null},startedBy:threadId=>deps.starters.get(threadId),open:(threadId,person2)=>deps.starters.set(threadId,person2)}:void 0,asks:team?(auth,botId,threadId)=>routing.asks(viewer(auth),botId,threadId):void 0,left(email3){people?.left(email3)},backfill(moveIns){for(let[botId,move3]of Object.entries(moveIns))move3.email&&!people?.gone(move3.email)&&setCreatedBy(deps.store(),botId,move3.email)}}}init_user_errors();init_peer_provenance();init_zod();init_bot_owner();init_audience();init_zod();init_bot_owner();import{readFileSync as readFileSync193}from"node:fs";import{join as join271}from"node:path";init_atomic();init_audience();init_bot_visibility();init_peer_roster();var PERSON_INBOX_FILE="person-inbox.json",INBOX_TITLE="Inbox",BRIEF_TITLE="Brief",MAX_ITEMS2=2e3,KEEP_MS3=720*60*6e4,NOTE_MAX=2e3,VIEW_ROWS=200,ROW_TEXT_MAX=4e3,ASSISTANT_HOURLY=20,HOUR_MS=60*6e4,id9=external_exports.string().min(1).max(512),person=external_exports.string().regex(/^p_[\w-]{22}$/u),itemSchema=external_exports.object({id:id9,person,botId:id9,threadId:id9,kind:external_exports.enum(["message","ask","result","notice"]),from:external_exports.string().max(200),fromEmail:external_exports.
30821
30839
  string().max(320).optional(),fromBot:id9.optional(),to:external_exports.enum(["bot","person"]).optional(),asker:person.optional(),origin:external_exports.object({botId:id9,threadId:id9,groupId:id9.optional(),messageId:id9.optional()}).optional(),requestId:external_exports.string().max(200).optional(),text:external_exports.string().max(400),at:external_exports.number(),answered:external_exports.boolean().optional(),seen:external_exports.boolean().optional(),done:external_exports.boolean().optional()}),
30822
- fileSchema27=external_exports.object({version:external_exports.literal(1),homes:external_exports.record(person,external_exports.object({botId:id9,threadId:id9})),items:external_exports.array(itemSchema).max(MAX_ITEMS2)});function createPersonInbox(deps){let{team,store:store5}=deps,now2=deps.now??Date.now,file3=join270(deps.dataDir,PERSON_INBOX_FILE),homes={},items=[],stopped=!1;if(team)try{let parsed2=fileSchema27.safeParse(JSON.parse(readFileSync192(file3,"utf8")));parsed2.success?{homes,items}=
30840
+ fileSchema27=external_exports.object({version:external_exports.literal(1),homes:external_exports.record(person,external_exports.object({botId:id9,threadId:id9})),items:external_exports.array(itemSchema).max(MAX_ITEMS2)});function createPersonInbox(deps){let{team,store:store5}=deps,now2=deps.now??Date.now,file3=join271(deps.dataDir,PERSON_INBOX_FILE),homes={},items=[],stopped=!1;if(team)try{let parsed2=fileSchema27.safeParse(JSON.parse(readFileSync193(file3,"utf8")));parsed2.success?{homes,items}=
30823
30841
  parsed2.data:console.warn(`person inbox: ${file3} is not an inbox file; starting fresh`)}catch(error66){error66.code!=="ENOENT"&&console.warn(`person inbox: ${file3} is unreadable; starting fresh`)}let save7=()=>{items=items.filter(item=>now2()-item.at<KEEP_MS3).slice(-MAX_ITEMS2);try{writeFileAtomic(file3,`${JSON.stringify({version:1,homes,items})}
30824
30842
  `,{mode:384})}catch(error66){console.warn(`person inbox: could not save ${file3}: ${error66 instanceof Error?error66.message:String(error66)}`)}},ownerKey3=bot=>{let email3=botOwner(bot);return email3?deps.personKeyOf(email3):null};function representativeOf(person2){let own4=bot=>!bot.hidden&&ownerKey3(bot)===person2;return store5.bots.find(bot=>bot.chiefOfStaff&&own4(bot))??store5.bots.find(bot=>!!bot.defaultBot?.person&&own4(bot))??null}function home2(person2){if(!team||!deps.person(person2))return null;
30825
30843
  let email3=representativeOf(person2)?void 0:deps.person(person2)?.email;email3&&deps.ensureOwnBot?.(email3);let bot=representativeOf(person2);if(!bot)return null;let standing=standingHome(person2,bot);if(standing?.kept)return{bot,threadId:standing.threadId};let threadId=standing?.threadId;if(standing?.brief)store5.patchTask(bot.id,standing.threadId,{title:INBOX_TITLE});else if(!standing){let created=store5.createTask(bot.id,INBOX_TITLE,!1,void 0,void 0,void 0,void 0,void 0,task2=>deps.starters.set(
@@ -30904,16 +30922,16 @@ long)}. ${SAY_LONG_WAIT} Each has its own line in this inbox, and that is where
30904
30922
  ed"),{status:passed.status})):Promise.resolve(repeated?{queued:!1,repeated:!0}:{queued:!1}):null},view(auth){if(!team&&deps.place)return deps.place.view(auth);let me2=sessionPerson(auth);return team&&me2?inbox.view(me2.key):null},count(auth){if(!team&&deps.place)return deps.place.count(auth);let me2=sessionPerson(auth),view3=team&&me2?inbox.view(me2.key):null;return view3?view3.rows.filter(row=>row.tab==="needs-you"||row.tab==="info"&&row.unread).length:null},markDone(auth,id12){if(!team&&deps.place)
30905
30923
  return deps.place.markDone(auth,id12);let me2=sessionPerson(auth);return team&&me2?inbox.markDone(me2.key,id12):"unknown"},markRead(auth,id12){if(!team&&deps.place)return deps.place.markRead(auth,id12);let me2=sessionPerson(auth);return!!(team&&me2&&inbox.markRead(me2.key,id12))},needsYou(auth){let me2=sessionPerson(auth);return!team||!me2?[]:inbox.unseen(me2.key).filter(item=>item.kind==="message"&&now2()-item.at<WAITING_MS).map(item=>({kind:"message",id:item.id,at:item.at,botId:item.botId,threadId:item.
30906
30924
  threadId,messageId:item.id,from:item.from,...item.fromEmail?{fromEmail:item.fromEmail}:{},text:item.text}))},seen(auth,threadId){team||deps.place?.seen(auth,threadId);let me2=sessionPerson(auth);me2&&inbox.seen(me2.key,threadId)},arrived(auth){let me2=sessionPerson(auth);if(!team||!me2)return{returned:!1};let day2=new Date(now2()).toDateString();if(arrivedOn.get(me2.key)===day2)return{returned:!1};arrivedOn.set(me2.key,day2);let waiting2=inbox.unseen(me2.key)[0];return waiting2?{returned:!1,open:{
30907
- botId:waiting2.botId,threadId:waiting2.threadId}}:{returned:!1}},route(notification,how={}){return!team&&deps.place?deps.place.route(notification,how):inbox.route(notification,how)},handedResult(work,requester){team||deps.place?.handedResult(work,requester)},stop(){unsubscribe2(),inbox.stop(),deps.place?.stop()}}}init_zod();init_atomic();import{createHash as createHash125,createHmac as createHmac9,randomBytes as randomBytes37}from"node:crypto";import{mkdirSync as mkdirSync121,readdirSync as readdirSync61,readFileSync as readFileSync193,rmSync as rmSync67}from"node:fs";import{join as join271}from"node:path";var TEAM_AWAY_ADMIN_PATH="/api/cloud/machines/team-away",AWAY_EMAILS_PATH="/api/me/away-emails",AWAY_WINDOW_MS=10*6e4,AWAY_ASK_MIN_MS=5*6e4,AWAY_GAP_MS=30*6e4,AWAY_DAILY_MAX=6,AWAY_STRETCH_MS=720*6e4,AWAY_ITEMS_MAX=10,AWAY_EMAILS_FILE="away-emails.json",DAY_MS17=1440*6e4,KEYS_KEEP_MS=7*DAY_MS17,KEYS_MAX=5e3,RETRY_MS5=[6e4,5*6e4],UNAVAILABLE_MS=60*6e4,REFRESH_GAP_MS=6e4,FETCH_TIMEOUT_MS6=15e3,ANSWER_MAX_BYTES3=64*1024,PERSON6=/^p_[\w-]{22}$/u,answerSchema4=external_exports.object({v:external_exports.
30908
- literal(1),results:external_exports.array(external_exports.object({id:external_exports.string(),state:external_exports.string()})).max(50),off:external_exports.array(external_exports.string().max(320)).max(1e3).optional()});function teamAwaySignature(secret,machineId,timestamp5,nonce,body2){let bodyHash=createHash125("sha256").update(body2).digest("base64url");return createHmac9("sha256",secret).update(`omb-team-away-v1
30925
+ botId:waiting2.botId,threadId:waiting2.threadId}}:{returned:!1}},route(notification,how={}){return!team&&deps.place?deps.place.route(notification,how):inbox.route(notification,how)},handedResult(work,requester){team||deps.place?.handedResult(work,requester)},stop(){unsubscribe2(),inbox.stop(),deps.place?.stop()}}}init_zod();init_atomic();import{createHash as createHash126,createHmac as createHmac9,randomBytes as randomBytes37}from"node:crypto";import{mkdirSync as mkdirSync122,readdirSync as readdirSync61,readFileSync as readFileSync194,rmSync as rmSync67}from"node:fs";import{join as join272}from"node:path";var TEAM_AWAY_ADMIN_PATH="/api/cloud/machines/team-away",AWAY_EMAILS_PATH="/api/me/away-emails",AWAY_WINDOW_MS=10*6e4,AWAY_ASK_MIN_MS=5*6e4,AWAY_GAP_MS=30*6e4,AWAY_DAILY_MAX=6,AWAY_STRETCH_MS=720*6e4,AWAY_ITEMS_MAX=10,AWAY_EMAILS_FILE="away-emails.json",DAY_MS17=1440*6e4,KEYS_KEEP_MS=7*DAY_MS17,KEYS_MAX=5e3,RETRY_MS5=[6e4,5*6e4],UNAVAILABLE_MS=60*6e4,REFRESH_GAP_MS=6e4,FETCH_TIMEOUT_MS6=15e3,ANSWER_MAX_BYTES3=64*1024,PERSON6=/^p_[\w-]{22}$/u,answerSchema4=external_exports.object({v:external_exports.
30926
+ literal(1),results:external_exports.array(external_exports.object({id:external_exports.string(),state:external_exports.string()})).max(50),off:external_exports.array(external_exports.string().max(320)).max(1e3).optional()});function teamAwaySignature(secret,machineId,timestamp5,nonce,body2){let bodyHash=createHash126("sha256").update(body2).digest("base64url");return createHmac9("sha256",secret).update(`omb-team-away-v1
30909
30927
  ${machineId}
30910
30928
  ${timestamp5}
30911
30929
  ${nonce}
30912
- ${bodyHash}`).digest("base64url")}var awayKey=about=>createHash125("sha256").update(`omb-team-away
30930
+ ${bodyHash}`).digest("base64url")}var awayKey=about=>createHash126("sha256").update(`omb-team-away
30913
30931
  ${about}`).digest("hex"),prefSchema=external_exports.object({version:external_exports.literal(1),on:external_exports.boolean(),synced:external_exports.boolean()});function createTeamAway(deps){let now2=deps.now??Date.now,log7=deps.log??(()=>{}),fetcher=deps.fetchImpl??globalThis.fetch,setTimer=deps.setTimer??((run11,ms2)=>setTimeout(run11,ms2)),clearTimer2=deps.clearTimer??(timer4=>clearTimeout(timer4)),windowMs=deps.windowMs??AWAY_WINDOW_MS,askMinMs=Math.min(AWAY_ASK_MIN_MS,windowMs/2),pending3=new Map,
30914
- timers=new Map,sentKeys=new Map,sentAt2=new Map,stretches=new Map,retries=new Map,unavailableUntil=0,stopped=!1,lastRefresh=0,syncTimer=null,prefPath=person2=>join271(deps.dataDir,"people",person2,AWAY_EMAILS_FILE),readPref=person2=>{if(!PERSON6.test(person2))return null;try{let parsed2=prefSchema.safeParse(JSON.parse(readFileSync193(prefPath(person2),"utf8")));return parsed2.success?parsed2.data:null}catch{return null}},writePref=(person2,pref)=>{if(PERSON6.test(person2))try{if(!pref||pref.on&&
30915
- pref.synced){rmSync67(prefPath(person2),{force:!0});return}mkdirSync121(join271(deps.dataDir,"people",person2),{recursive:!0,mode:448}),writeFileAtomic(prefPath(person2),`${JSON.stringify(pref)}
30916
- `,{mode:384})}catch(error66){log7(`away emails: could not keep a switch: ${error66.code??"error"}`)}},isOn=person2=>readPref(person2)?.on??!0,unsynced=()=>{let people=[];try{people=readdirSync61(join271(deps.dataDir,"people")).filter(one5=>PERSON6.test(one5))}catch{return[]}return people.flatMap(person2=>{let pref=readPref(person2),member=pref&&!pref.synced?deps.member(person2):void 0;return pref&&member?[{person:person2,to:member.email,on:pref.on}]:[]})},here=person2=>{try{return deps.here(person2)}catch{
30932
+ timers=new Map,sentKeys=new Map,sentAt2=new Map,stretches=new Map,retries=new Map,unavailableUntil=0,stopped=!1,lastRefresh=0,syncTimer=null,prefPath=person2=>join272(deps.dataDir,"people",person2,AWAY_EMAILS_FILE),readPref=person2=>{if(!PERSON6.test(person2))return null;try{let parsed2=prefSchema.safeParse(JSON.parse(readFileSync194(prefPath(person2),"utf8")));return parsed2.success?parsed2.data:null}catch{return null}},writePref=(person2,pref)=>{if(PERSON6.test(person2))try{if(!pref||pref.on&&
30933
+ pref.synced){rmSync67(prefPath(person2),{force:!0});return}mkdirSync122(join272(deps.dataDir,"people",person2),{recursive:!0,mode:448}),writeFileAtomic(prefPath(person2),`${JSON.stringify(pref)}
30934
+ `,{mode:384})}catch(error66){log7(`away emails: could not keep a switch: ${error66.code??"error"}`)}},isOn=person2=>readPref(person2)?.on??!0,unsynced=()=>{let people=[];try{people=readdirSync61(join272(deps.dataDir,"people")).filter(one5=>PERSON6.test(one5))}catch{return[]}return people.flatMap(person2=>{let pref=readPref(person2),member=pref&&!pref.synced?deps.member(person2):void 0;return pref&&member?[{person:person2,to:member.email,on:pref.on}]:[]})},here=person2=>{try{return deps.here(person2)}catch{
30917
30935
  return!0}},forget=person2=>{let timer4=timers.get(person2);timer4&&clearTimer2(timer4),timers.delete(person2),pending3.delete(person2),retries.delete(person2),stretches.delete(person2)},stretchOf=person2=>{let known=stretches.get(person2);if(known&&now2()-known.since<AWAY_STRETCH_MS)return known;let fresh={since:now2(),told:new Set};return stretches.set(person2,fresh),fresh},recentSends=person2=>(sentAt2.get(person2)??[]).filter(at8=>now2()-at8<DAY_MS17),remember4=keys5=>{for(let[key7,at8]of sentKeys)
30918
30936
  now2()-at8>=KEYS_KEEP_MS&&sentKeys.delete(key7);for(let key7 of keys5)sentKeys.set(key7,now2());for(;sentKeys.size>KEYS_MAX;)sentKeys.delete(sentKeys.keys().next().value)},schedule2=(person2,at8)=>{if(stopped||timers.has(person2))return;let queue=pending3.get(person2)??[],retry=retries.get(person2);if(!queue.length&&!retry)return;let last=recentSends(person2).at(-1),due=at8??Math.max(Math.min(...queue.map(one5=>one5.at))+windowMs,last!==void 0?last+AWAY_GAP_MS:0),timer4=setTimer(()=>{timers.delete(
30919
30937
  person2),flush(person2)},Math.max(0,due-now2()));timer4.unref?.(),timers.set(person2,timer4)};function noticed(event2){let{person:person2}=event2;if(stopped||!deps.member(person2))return;if(here(person2)){forget(person2);return}if(!isOn(person2))return;let key7=awayKey(event2.about),queue=pending3.get(person2)??[];sentKeys.has(key7)||queue.some(one5=>one5.key===key7)||event2.conversation&&(stretchOf(person2).told.has(event2.conversation)||queue.some(one5=>one5.conversation===event2.conversation))||
@@ -30933,9 +30951,9 @@ card.requestId}`:`inbox:${item.id}`,conversation2=mapped2.routine&&origin2?origi
30933
30951
  {}}});return}let place2=groupName(origin2.threadId,origin2.groupId)??deps.store.bot(origin2.botId)?.name,named4=place2&&place2!==delivery.from.name?{place:place2}:{};deps.noticed({...base2,item:{kind:mapped2.kind,who:delivery.from.name,...named4,...mapped2.routine?{routine:!0}:{}}})}function notified(original,routed,how={}){if(!routed||routed.forPerson||original.forPerson||how.routine)return;let{threadId}=original,own4=audienceMember(deps.audienceOf(threadId));if(WAITING.has(original.kind)){let requestId=(own4?
30934
30952
  openCard(threadId):void 0)?.card?.requestId;if(!own4||!requestId)return;deps.noticed({person:own4,item:{kind:"waiting",private:!0},about:`ask:${threadId}:${requestId}`,thread:threadId,still:()=>openCard(threadId,requestId)!==void 0});return}if(original.kind!=="done"&&original.kind!=="turn-failed"||own4)return;let asked=deps.store.activePath(threadId).findLast(message8=>message8.role==="user"&&!message8.peerAsk&&message8.sender?.id),person2=asked?.sender?.id;if(!asked||!person2)return;let group2=groupName(
30935
30953
  threadId,original.groupId),{groupId}=original;deps.noticed({person:person2,about:`${original.kind}:${threadId}:${asked.id}`,conversation:threadId,...deps.unread?{still:()=>deps.unread(person2,threadId,groupId)}:{},item:{kind:original.kind==="done"?"finished":"failed",who:original.botName,...group2?{place:group2}:{}}})}return{delivered,notified}}function createTeamAwayHost(deps){let home2=deps.cloudHome;if(!home2?.team)return{delivered:()=>{},notified:()=>{},routes:(async()=>PASS)};let windowMs=Number(process.env.OMB_TEAM_AWAY_WINDOW_MS),away=createTeamAway({here:deps.here,language:deps.language,dataDir:deps.dataDir,adminOrigin:home2.adminOrigin,machineId:home2.machineId,secret:home2.bootstrapSecret,member:person2=>deps.people().find(one5=>one5.leftAt===void 0&&personKey({id:"",email:one5.email})===person2),log:line6=>console.log(`team \
30936
- cloud: ${line6}`),...windowMs>0?{windowMs}:{}}),events3=createTeamAwayEvents({audienceOf:deps.audienceOf,store:deps.store,unseen:deps.unseen,noticed:away.noticed,unread:(person2,threadId,groupId)=>roomUnreadFor(deps.store.activePath(threadId),deps.readUpTo(groupId??threadReadKey(threadId),person2),!0)});return{delivered:events3.delivered,notified:(original,routed,how)=>{original&&events3.notified(original,routed,how)},routes:away.routes(deps.session)}}init_zod();import{readFileSync as readFileSync194}from"node:fs";import{join as join272}from"node:path";init_atomic();var PLACE_INBOX_FILE="place-inbox.json",MAX_LINES2=2e3,MAX_SEEN_ASKS=2e3,KEEP_MS4=720*60*6e4,VIEW_ROWS2=200,ROW_TEXT_MAX2=4e3,NOTICE_TEXT_MAX=2e3,HOUR_MS3=60*6e4,PLACE_MESSAGES_HOURLY=10,id10=external_exports.string().min(1).max(512),lineSchema=external_exports.object({id:id10,botId:id10,threadId:id10,groupId:id10.optional(),kind:external_exports.enum(["message","result","notice"]),from:external_exports.string().max(200),workingFor:external_exports.object({botId:id10,name:external_exports.string().
30954
+ cloud: ${line6}`),...windowMs>0?{windowMs}:{}}),events3=createTeamAwayEvents({audienceOf:deps.audienceOf,store:deps.store,unseen:deps.unseen,noticed:away.noticed,unread:(person2,threadId,groupId)=>roomUnreadFor(deps.store.activePath(threadId),deps.readUpTo(groupId??threadReadKey(threadId),person2),!0)});return{delivered:events3.delivered,notified:(original,routed,how)=>{original&&events3.notified(original,routed,how)},routes:away.routes(deps.session)}}init_zod();import{readFileSync as readFileSync195}from"node:fs";import{join as join273}from"node:path";init_atomic();var PLACE_INBOX_FILE="place-inbox.json",MAX_LINES2=2e3,MAX_SEEN_ASKS=2e3,KEEP_MS4=720*60*6e4,VIEW_ROWS2=200,ROW_TEXT_MAX2=4e3,NOTICE_TEXT_MAX=2e3,HOUR_MS3=60*6e4,PLACE_MESSAGES_HOURLY=10,id10=external_exports.string().min(1).max(512),lineSchema=external_exports.object({id:id10,botId:id10,threadId:id10,groupId:id10.optional(),kind:external_exports.enum(["message","result","notice"]),from:external_exports.string().max(200),workingFor:external_exports.object({botId:id10,name:external_exports.string().
30937
30955
  max(200)}).optional(),guest:id10.optional(),text:external_exports.string().max(NOTICE_TEXT_MAX),at:external_exports.number(),seen:external_exports.boolean().optional(),done:external_exports.boolean().optional(),job:id10.optional()}),fileSchema28=external_exports.object({version:external_exports.literal(1),lines:external_exports.array(lineSchema).max(MAX_LINES2),seenAsks:external_exports.array(id10).max(MAX_SEEN_ASKS)});function placeInboxViewer(auth,cloud2){return cloud2.personal&&!cloud2.owner(
30938
- auth)?auth.kind==="session"?{kind:"guest",key:cloud2.personOf(auth.session)}:{kind:"nobody"}:auth.kind==="loopback"&&auth.trust==="service"?{kind:"nobody"}:{kind:"owner"}}function createPlaceInbox(deps){let{store:store5}=deps,now2=deps.now??Date.now,file3=join272(deps.dataDir,PLACE_INBOX_FILE),lines=[],seenAsks=new Set;try{let parsed2=fileSchema28.safeParse(JSON.parse(readFileSync194(file3,"utf8")));parsed2.success?(lines=parsed2.data.lines,seenAsks=new Set(parsed2.data.seenAsks)):console.warn(`\
30956
+ auth)?auth.kind==="session"?{kind:"guest",key:cloud2.personOf(auth.session)}:{kind:"nobody"}:auth.kind==="loopback"&&auth.trust==="service"?{kind:"nobody"}:{kind:"owner"}}function createPlaceInbox(deps){let{store:store5}=deps,now2=deps.now??Date.now,file3=join273(deps.dataDir,PLACE_INBOX_FILE),lines=[],seenAsks=new Set;try{let parsed2=fileSchema28.safeParse(JSON.parse(readFileSync195(file3,"utf8")));parsed2.success?(lines=parsed2.data.lines,seenAsks=new Set(parsed2.data.seenAsks)):console.warn(`\
30939
30957
  place inbox: ${file3} is not an inbox file; starting fresh`)}catch(error66){error66.code!=="ENOENT"&&console.warn(`place inbox: ${file3} is unreadable; starting fresh`)}let save7=()=>{lines=lines.filter(line6=>now2()-line6.at<KEEP_MS4).slice(-MAX_LINES2);try{writeFileAtomic(file3,`${JSON.stringify({version:1,lines,seenAsks:[...seenAsks].slice(-MAX_SEEN_ASKS)})}
30940
30958
  `,{mode:384})}catch(error66){console.warn(`place inbox: could not save ${file3}: ${error66 instanceof Error?error66.message:String(error66)}`)}},workingFor=threadId=>{let botId=deps.handedBy(threadId),bot=botId?store5.bot(botId):void 0;return bot?{botId:bot.id,name:bot.name}:void 0},titleOf2=(botId,threadId)=>store5.groupByThread(threadId)?.name??store5.taskByThread(botId,threadId)?.title??store5.bot(botId)?.name??"";function answeredThere(line6){if(line6.kind!=="message")return!1;let said2=store5.
30941
30959
  messagesFor(line6.threadId);for(let index4=said2.length-1;index4>=0&&said2[index4].at>=line6.at;index4--){let one5=said2[index4];if(one5.role==="user"&&!one5.peerAsk&&!one5.relayed&&one5.via!=="api")return!0}return!1}let lineTab=line6=>line6.done||answeredThere(line6)?"done":"info",lineFor=(auth,line6)=>{let viewer=deps.viewer(auth);return viewer.kind==="nobody"||!deps.sees(auth,line6.threadId)?!1:viewer.kind==="guest"?line6.guest===viewer.key:line6.guest===void 0};function askRows(auth){if(deps.
@@ -30956,7 +30974,7 @@ find(one5=>one5.id===lineId&&lineFor(auth,one5));return line6?(line6.seen||(line
30956
30974
  threadId&&!line6.seen&&lineFor(auth,line6)&&(line6.seen=!0,changed3=!0);changed3&&save7()},stop:unsubscribe2}}var guestNameIn=lines=>lines.findLast(line6=>line6.role==="user"&&!line6.peerAsk&&line6.sender?.name)?.sender?.name;init_peer_provenance();init_provenance_label();init_failed_turn();function relayedTurn(deps){return(botId,threadId,text30,from,relay2)=>{let peerAsk={botId:from.botId,name:from.name},who=relay2.name??"someone",prompt=`${fromNote(relay2.kind==="assistant"?`${who}'s assistant (bot)`:personWho(who),"answer",AUTHORITY.info)}
30957
30975
  ${escapeNotes(text30)}`,decision2=admit("direct",{},deps.state(botId,threadId));if(decision2.action==="queue"){queueSteeredMessage(botId,threadId,text30,{prompt,...decision2.reason?{reason:decision2.reason}:{},peerAsk,origin:OUTSIDE,relay:relay2});return}let userMessage=deps.store.appendMessage(threadId,{role:"user",kind:"text",text:text30,peerAsk,relay:relay2});deps.startTurn(botId,prompt,{threadId,peerAsk,origin:OUTSIDE,userMessage}).catch(error66=>{deps.store.appendMessage(threadId,{role:"bot",
30958
30976
  kind:"activity",tool:failedTurnTool(`this conversation could not carry on \u2014 ${error66 instanceof Error?error66.message:String(error66)}`,{text:{key:"chat.notice.relayCouldNotContinue",params:{error:error66 instanceof Error?error66.message:String(error66)}}})})})}}function busyTimes(events3){let slots=events3.filter(event2=>!event2.allDay&&event2.status!=="cancelled"&&!event2.selfDeclined&&event2.end>event2.start).map(event2=>({start:event2.start,end:event2.end})).sort((a,b11)=>a.start-b11.start),merged2=[];for(let slot of slots){let last=merged2.at(-1);last&&slot.start<=last.end?last.end=Math.max(last.end,slot.end):merged2.push({...slot})}return merged2}function createPersonCalendar(deps){return{async busy(person2,fromMs,toMs){let access2=deps.access(person2);
30959
- if(!access2||!await deps.connected(access2))return null;let reads=createConnectedReads({connected:async()=>({gmail:!1,googlecalendar:!0}),relay:(payload,session,signal)=>deps.relay(payload,session,signal,access2)});return busyTimes(await reads.session().events(fromMs,toMs))}}}init_zod();import{readFileSync as readFileSync195}from"node:fs";import{arch,platform,release as release2}from"node:os";import{join as join273}from"node:path";var DEVS_TAG="devs",startsWithName=(rest,name6)=>rest.slice(0,name6.length).toLowerCase()===name6.toLowerCase()&&!isMentionNameContinuation(rest.slice(name6.length));function devsTagAt(rest,botNames=[]){return startsWithName(rest,DEVS_TAG)?botNames.some(name6=>name6.trim().length>=DEVS_TAG.length&&startsWithName(rest,name6))?void 0:DEVS_TAG.length:void 0}function devsMentionRanges(text30,botNames=[]){let prose=proseOnly(text30),ranges2=[],at8=-1;for(;(at8=prose.indexOf("@",at8+1))!==-1;){if(!isMentionBoundary(
30977
+ if(!access2||!await deps.connected(access2))return null;let reads=createConnectedReads({connected:async()=>({gmail:!1,googlecalendar:!0}),relay:(payload,session,signal)=>deps.relay(payload,session,signal,access2)});return busyTimes(await reads.session().events(fromMs,toMs))}}}init_zod();import{readFileSync as readFileSync196}from"node:fs";import{arch,platform,release as release2}from"node:os";import{join as join274}from"node:path";var DEVS_TAG="devs",startsWithName=(rest,name6)=>rest.slice(0,name6.length).toLowerCase()===name6.toLowerCase()&&!isMentionNameContinuation(rest.slice(name6.length));function devsTagAt(rest,botNames=[]){return startsWithName(rest,DEVS_TAG)?botNames.some(name6=>name6.trim().length>=DEVS_TAG.length&&startsWithName(rest,name6))?void 0:DEVS_TAG.length:void 0}function devsMentionRanges(text30,botNames=[]){let prose=proseOnly(text30),ranges2=[],at8=-1;for(;(at8=prose.indexOf("@",at8+1))!==-1;){if(!isMentionBoundary(
30960
30978
  prose,at8))continue;let length3=devsTagAt(prose.slice(at8+1),botNames);length3!==void 0&&(ranges2.push({start:at8,end:at8+length3+1}),at8+=length3)}return ranges2}var tagsDevs=(text30,botNames=[])=>devsMentionRanges(text30,botNames).length>0;function withoutDevsTags(text30,botNames=[]){let out="",from=0;for(let range6 of devsMentionRanges(text30,botNames))out+=text30.slice(from,range6.start),from=range6.end;return(out+text30.slice(from)).replace(/[ \t]+/g," ").replace(/^[\s,:;.-]+/,"").trim()}var VERSION6=/^v?(\d{1,6})\.(\d{1,6})\.(\d{1,6})(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/;function versionAtLeast2(running5,fixedIn){let have=VERSION6.exec(running5.trim()),want=VERSION6.exec(fixedIn.trim());if(!have||!want||want[4]!==void 0)return!1;for(let part2 of[1,2,3]){let a=Number(have[part2]),b11=Number(want[part2]);if(a!==b11)return a>b11}return have[4]===void 0}init_failed_turn();init_atomic();init_redact2();var DEVS_REPORT_LIMITS={description:1e4,message:3e3,summary:2e3,seen:3e3,steps:2e3,field:40,diagnostics:48e3,problems:20,problemChars:300,logLines:80,logLineChars:400,body:600*1024},CONTACT_FIELDS2=["contactEmail","contact"],URL_IN_TEXT=/\bhttps?:\/\/[^\s"'<>«»]+/gi,URL_MASK="\xABredacted URL parameters\xBB",AUTHORIZATION=/\b(authorization|proxy-authorization)(["']?\s*[:=]\s*["']?)([A-Za-z][A-Za-z0-9_-]*\s+[A-Za-z0-9._~+/=-]+|[A-Za-z0-9._~+/=-]{8,})/gi,COOKIE=/\b((?:set-)?cookie)(["']?\s*[:=]\s*)([^\r\n]+)/gi;
30961
30979
  function redactUrl2(url2){let query2=url2.search(/[?#]/);return(query2<0?url2:url2.slice(0,query2)).replace(/^(https?:\/\/)[^/@]*@/i,"$1\xABredacted credentials\xBB@")+(query2<0?"":`?${URL_MASK}`)}function environmentSecrets(env=process.env){return Object.entries(env).flatMap(([name6,value3])=>value3&&value3.length>=8&&isSecretName(name6)?[value3]:[]).sort((a,b11)=>b11.length-a.length)}function redactReportText(text30,secrets=environmentSecrets()){let out=withoutCitationMarkers(text30);for(let secret of secrets)
30962
30980
  out.includes(secret)&&(out=out.split(secret).join(mask(secret)));return out=out.replace(URL_IN_TEXT,(url2,at8,whole3)=>whole3.startsWith(URL_MASK,at8+url2.length)?url2:redactUrl2(url2)),out=out.replace(AUTHORIZATION,(_m,key7,sep17,value3)=>`${key7}${sep17}${mask(value3)}`),out=out.replace(COOKIE,(_m,key7,sep17,value3)=>`${key7}${sep17}${mask(value3.trim())}`),redactSecretsInText(out)}var EMAIL3=/^[^\s@<>()[\]\\,;:"]{1,64}@[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?(?:\.[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?)+$/;
@@ -30986,7 +31004,7 @@ max(MAX_OUTBOX),tracked:external_exports.array(trackedSchema).max(MAX_TRACKED).o
30986
31004
  h the problem if you can.]`,iso5=at8=>new Date(at8).toISOString(),firstLine=text30=>(text30??"").split(`
30987
31005
  `).map(line6=>line6.trim()).find(Boolean)??"";function conversationProblems(lines){let found2=[];for(let line6 of lines.slice(-SCANNED_LINES)){let at8=iso5(line6.at);if(line6.kind==="activity"&&line6.tool){let{name:name6}=line6.tool,cause=failedTurnCause(name6);if(cause!==null)found2.push(`${at8} turn failed: ${cause}${line6.tool.setup?" (needs setup)":""}`);else if(/^(stopped|notice|recovery):/.test(name6))found2.push(`${at8} ${name6}`);else if(line6.tool.ok===!1){let detail=clip14(firstLine(line6.
30988
31006
  tool.output),200);found2.push(`${at8} tool ${name6} failed${detail?`: ${detail}`:""}`)}}else line6.role==="bot"&&line6.kind==="text"&&line6.turnSucceeded===!1?found2.push(`${at8} turn ${line6.turnId??""} ended without success`.replace(" "," ")):line6.role==="user"&&line6.requestCancelled&&found2.push(`${at8} the person's request was stopped`)}return found2}function health(snapshot4){if(!snapshot4)return"not checked yet";let signedIn=snapshot4.authenticated===void 0?"":snapshot4.authenticated?",\
30989
- signed in":", not signed in";return`${snapshot4.state}${snapshot4.reason?` (${clip14(snapshot4.reason,200)})`:""}${signedIn}${snapshot4.version?`, version ${snapshot4.version}`:""}`}function createDevsReports(deps){let{store:store5}=deps,now2=deps.now??Date.now,file3=join273(deps.dataDir,DEVS_REPORTS_FILE),waiting2=[],outbox=[],tracked=[];try{let parsed2=fileSchema29.safeParse(JSON.parse(readFileSync195(file3,"utf8")));parsed2.success?(outbox=parsed2.data.outbox,waiting2=parsed2.data.waiting.map(
31007
+ signed in":", not signed in";return`${snapshot4.state}${snapshot4.reason?` (${clip14(snapshot4.reason,200)})`:""}${signedIn}${snapshot4.version?`, version ${snapshot4.version}`:""}`}function createDevsReports(deps){let{store:store5}=deps,now2=deps.now??Date.now,file3=join274(deps.dataDir,DEVS_REPORTS_FILE),waiting2=[],outbox=[],tracked=[];try{let parsed2=fileSchema29.safeParse(JSON.parse(readFileSync196(file3,"utf8")));parsed2.success?(outbox=parsed2.data.outbox,waiting2=parsed2.data.waiting.map(
30990
31008
  entry2=>({...entry2,restored:!0})),tracked=parsed2.data.tracked??[]):console.warn(`devs reports: ${file3} is not a reports file; starting fresh`)}catch(error66){error66.code!=="ENOENT"&&console.warn(`devs reports: ${file3} is unreadable; starting fresh`)}let inFlight=new Map,retrying=new Set,told2=[],lastSent=new Map,seen=new Set,save7=()=>{try{writeFileAtomic(file3,`${JSON.stringify({version:1,waiting:waiting2.map(({answered:_a6,offered:_o3,restored:_r3,...entry2})=>entry2),outbox,tracked})}
30991
31009
  `,{mode:384})}catch(error66){console.warn(`devs reports: could not save ${file3}: ${error66 instanceof Error?error66.message:String(error66)}`)}},notice=(threadId,said2)=>{try{store5.appendMessage(threadId,{role:"bot",kind:"activity",tool:{name:`notice: ${said2.line}`,ok:said2.ok}})}catch{}},namesBeforeDevs=()=>[...store5.bots.map(bot=>bot.name),...store5.sections],secrets=()=>environmentSecrets(),languageFor=person2=>deps.lineLanguage?deps.lineLanguage(person2):deps.language(),view3=entry2=>({id:entry2.
30992
31010
  reportId,status:entry2.status,...entry2.status==="fixed"&&entry2.fixedIn?{fixedIn:entry2.fixedIn}:{},...entry2.running?{running:!0}:{}}),show=entry2=>{try{store5.patchMessage(entry2.threadId,entry2.messageId,{bugReport:view3(entry2)})}catch{}};function track2(entry2,reportId,payload,person2,words6){let kept2={reportId,threadId:entry2.threadId,messageId:entry2.messageId,installId:payload.installId.slice(0,64),at:now2(),...person2?{person:person2.slice(0,200)}:{},...words6?{words:clip14(words6.replace(
@@ -31020,8 +31038,8 @@ for(;inFlight.size||retrying.size||asking2;)await Promise.allSettled([...inFligh
31020
31038
  \u2026`:text30;function limixReportSender(alias,fetcher=fetch){return async payload=>{if(!alias)return{ok:!1,retry:!1,why:"refused",detail:"bug reports are not set up in this Limix Bot build"};let id12=`LX-${randomBytes38(4).toString("hex").toUpperCase()}`,fields2={_subject:`Limix Bot bug report ${id12} (${payload.appVersion}, ${payload.platform})`,_template:"box",_captcha:"false",report:id12,version:payload.appVersion,platform:payload.platform,install:payload.installId,message:clipped2(payload.
31021
31039
  description),diagnostics:clipped2(payload.diagnostics)};payload.contactEmail&&(fields2.email=payload.contactEmail,fields2._replyto=payload.contactEmail),payload.contact&&(fields2.contact=payload.contact);let response;try{response=await fetcher(`https://formsubmit.co/ajax/${alias}`,{method:"POST",redirect:"error",cache:"no-store",headers:{accept:"application/json","content-type":"application/json"},body:JSON.stringify(fields2),signal:AbortSignal.timeout(SEND_TIMEOUT_MS)})}catch{return{ok:!1,retry:!0,
31022
31040
  why:"offline"}}let answer2=await response.json().catch(()=>({}));return response.ok&&String(answer2.success)==="true"?{ok:!0,id:id12}:response.status===429?{ok:!1,retry:!0,why:"limited"}:response.ok||response.status>=500?{ok:!1,retry:!0,why:"server"}:{ok:!1,retry:!1,why:"refused",detail:(typeof answer2.message=="string"?answer2.message.replace(new RegExp("\\p{Cc}+","gu")," ").trim().slice(0,200):"")||`status ${response.status}`}}}var limixStatusAsker=()=>async _question=>null;init_redact2();import{format as format5}from"node:util";var KEPT5=200,LINE_MAX2=600;function captureRecentLog(target4=console,now2=Date.now){let kept2=[];for(let level of["warn","error"]){let print=target4[level].bind(target4);target4[level]=(...args)=>{try{let line6=redactSecretsInText(format5(...args)).replace(/\s+/g," ").trim();line6&&kept2.push(`${new Date(now2()).toISOString()} ${level} ${line6.length>LINE_MAX2?`${line6.slice(0,LINE_MAX2-1)}\u2026`:line6}`),kept2.length>KEPT5&&kept2.splice(
31023
- 0,kept2.length-KEPT5)}catch{}print(...args)}}return()=>[...kept2]}import{sep as sep16}from"node:path";function createShareAnswer(deps){let folder3=node3=>{let pinned2=deps.pinned(node3.botId,node3.threadId),cwd=pinned2===void 0?deps.botFolder(node3.botId)??null:pinned2;return cwd&&!cwd.startsWith(deps.privateFolders+sep16)?cwd:null};return(first2,joiner)=>{let a=deps.askedFrom(first2),b11=deps.askedFrom(joiner);return a!==void 0&&b11!==void 0&&deps.audienceOf(a)===deps.audienceOf(b11)&&folder3(first2)===folder3(joiner)}}var SELF_THREAD_REFUSAL="Only a person's own request can open separate threads on yourself, and this turn works on a teammate's hand-off or on a thread you opened yourself. Do the work here, and end with what is still left, so whoever asked can decide. Do not retry.";function selfThreadRefusal(input2){return input2.handoff||input2.requestLine?.peerAsk?SELF_THREAD_REFUSAL:void 0}init_bot_owner();function lookedAfterBy(bot,personName){let email3=botOwner(bot);if(!email3)return null;let name6=personName(personKey({id:"",email:email3}));return name6&&name6!==email3?name6:nameFromEmail(email3)}init_zod();init_atomic();import{readFileSync as readFileSync196}from"node:fs";var HANDED_PEOPLE_FILE="handed-people.json",PERSON7=/^p_[\w-]{22}$/,WORK=/^[\w-]{1,128}$/,KEEP_MS5=720*60*6e4,MAX_ENTRIES3=2e4,fileSchema30=external_exports.object({v:external_exports.literal(1),work:external_exports.record(external_exports.string().regex(WORK),external_exports.object({person:external_exports.string().regex(PERSON7),at:external_exports.number().int().nonnegative(),lends:external_exports.literal(!0).optional()}))}),HandedPeople=class{#file;#now;#work=new Map;constructor(file3,now2=Date.
31024
- now){this.#file=file3,this.#now=now2;try{let parsed2=fileSchema30.safeParse(JSON.parse(readFileSync196(file3,"utf8")));if(parsed2.success)for(let[id12,entry2]of Object.entries(parsed2.data.work))this.#work.set(id12,entry2)}catch{}}record(workId,person2,lends=!1){if(!person2||!PERSON7.test(person2)||!WORK.test(workId)||this.#work.has(workId))return;let now2=this.#now();this.#work.set(workId,{person:person2,at:now2,...lends?{lends:!0}:{}});for(let[id12,entry2]of this.#work)now2-entry2.at>KEEP_MS5&&
31041
+ 0,kept2.length-KEPT5)}catch{}print(...args)}}return()=>[...kept2]}import{sep as sep16}from"node:path";function createShareAnswer(deps){let folder3=node3=>{let pinned2=deps.pinned(node3.botId,node3.threadId),cwd=pinned2===void 0?deps.botFolder(node3.botId)??null:pinned2;return cwd&&!cwd.startsWith(deps.privateFolders+sep16)?cwd:null};return(first2,joiner)=>{let a=deps.askedFrom(first2),b11=deps.askedFrom(joiner);return a!==void 0&&b11!==void 0&&deps.audienceOf(a)===deps.audienceOf(b11)&&folder3(first2)===folder3(joiner)}}var SELF_THREAD_REFUSAL="Only a person's own request can open separate threads on yourself, and this turn works on a teammate's hand-off or on a thread you opened yourself. Do the work here, and end with what is still left, so whoever asked can decide. Do not retry.";function selfThreadRefusal(input2){return input2.handoff||input2.requestLine?.peerAsk?SELF_THREAD_REFUSAL:void 0}init_bot_owner();function lookedAfterBy(bot,personName){let email3=botOwner(bot);if(!email3)return null;let name6=personName(personKey({id:"",email:email3}));return name6&&name6!==email3?name6:nameFromEmail(email3)}init_zod();init_atomic();import{readFileSync as readFileSync197}from"node:fs";var HANDED_PEOPLE_FILE="handed-people.json",PERSON7=/^p_[\w-]{22}$/,WORK=/^[\w-]{1,128}$/,KEEP_MS5=720*60*6e4,MAX_ENTRIES3=2e4,fileSchema30=external_exports.object({v:external_exports.literal(1),work:external_exports.record(external_exports.string().regex(WORK),external_exports.object({person:external_exports.string().regex(PERSON7),at:external_exports.number().int().nonnegative(),lends:external_exports.literal(!0).optional()}))}),HandedPeople=class{#file;#now;#work=new Map;constructor(file3,now2=Date.
31042
+ now){this.#file=file3,this.#now=now2;try{let parsed2=fileSchema30.safeParse(JSON.parse(readFileSync197(file3,"utf8")));if(parsed2.success)for(let[id12,entry2]of Object.entries(parsed2.data.work))this.#work.set(id12,entry2)}catch{}}record(workId,person2,lends=!1){if(!person2||!PERSON7.test(person2)||!WORK.test(workId)||this.#work.has(workId))return;let now2=this.#now();this.#work.set(workId,{person:person2,at:now2,...lends?{lends:!0}:{}});for(let[id12,entry2]of this.#work)now2-entry2.at>KEEP_MS5&&
31025
31043
  this.#work.delete(id12);for(;this.#work.size>MAX_ENTRIES3;)this.#work.delete(this.#work.keys().next().value);try{writeFileAtomic(this.#file,`${JSON.stringify({v:1,work:Object.fromEntries(this.#work)})}
31026
31044
  `,{mode:384})}catch(error66){console.warn(`handed-on work: could not save ${this.#file}: ${error66 instanceof Error?error66.message:String(error66)}`)}}get(workId){return this.#work.get(workId)}},linePerson2=line6=>line6?.role==="user"&&!line6.peerAsk&&line6.sender?.id&&PERSON7.test(line6.sender.id)?line6.sender.id:void 0;function onlyTheirs(thread,person2,since){return!thread.some(line6=>line6.at>=since&&(line6.role==="user"&&!line6.peerAsk&&(line6.sender?.id?line6.sender.id!==person2:line6.steered===
31027
31045
  !0||line6.relayed===!0)||answeredByPerson(line6.card)&&line6.card.answeredBy?.kind==="session"&&line6.card.answeredBy.person!==person2))}function withPerson(origin2,person2,lends=!1){if(origin2.kind!=="user")return origin2;let{person:_previous,lends:_inherited,...rest}=origin2;return person2&&PERSON7.test(person2)?{...rest,person:person2,...lends?{lends:!0}:{}}:rest}function createActingPeople(deps){let requester=(threadId,generation)=>{let thread=deps.store.messagesFor(threadId);if(deps.store.groupByThread(
@@ -31029,7 +31047,7 @@ threadId)){let run11=generation===void 0?void 0:deps.roomRun(generation);if(!run
31029
31047
  null}let handed2=run11.handedFor;return handed2&&onlyTheirs(thread,handed2.person,handed2.since)?handed2.person:null}let request9=deps.direct(threadId),turn=generation??request9?.generation;if(!request9||!turn||request9.stopped||!request9.generations.has(turn)||request9.automation!==void 0)return null;if(request9.messageId){let line6=thread.find(message8=>message8.id===request9.messageId),person2=linePerson2(line6);if(line6&&person2)return onlyTheirs(thread,person2,line6.at)?person2:null}let handed=request9.
31030
31048
  origin?.kind==="user"?request9.origin.person:void 0;return handed&&onlyTheirs(thread,handed,0)?handed:null};return{requester,handOn(turn,work,lends=!1){let person2=requester(turn.threadId,turn.generation);deps.handed.record(work.id,person2,lends),work.rootId===turn.generation&&deps.handed.record(work.rootId,person2,lends)},handedOrigin(origin2,workId){let handed=deps.handed.get(workId);return withPerson(origin2,handed?.person,handed?.lends===!0)},handedRun(workId){let entry2=deps.handed.get(workId);
31031
31049
  return entry2?{person:entry2.person,since:entry2.at}:void 0}}}var keptPrivate=place2=>!!place2.child&&place2.parent!==place2.child,lastLineAsks=text30=>/^needs input:/i.test(text30.trimEnd().split(/\r?\n/).at(-1)?.trim()??"");function privateHandBack(outcome,place2){if(!keptPrivate(place2))return outcome;let where2=`${place2.bot}'s chat with ${place2.person}`,question=`${place2.bot} has a question for ${place2.person}, in ${where2}.`,{evidence:_evidence,...rest}=outcome,asks2=lastLineAsks(outcome.
31032
- text);return{...rest,text:asks2?`NEEDS INPUT: ${question}`:`${outcome.ok?"Done":"It stopped before it finished"}. The result is in ${where2}.`,...outcome.cards?{cards:{...outcome.cards,question}}:{},...outcome.approvalAsk?{approvalAsk:question}:{},...asks2||outcome.cards||outcome.approvalAsk?{privateQuestion:!0}:{}}}function createTurnCallSignals(isActive){let calls2=new Map;return{signal(grant,res){let call2=new AbortController;calls2.set(call2,grant);let onClose=()=>{calls2.delete(call2),res.writableEnded||call2.abort()};return res.closed?onClose():res.once("close",onClose),call2.signal},sweep(){for(let[call2,grant]of calls2)isActive(grant)||(calls2.delete(call2),call2.abort())}}}init_user_errors();import{basename as basename36,join as join275}from"node:path";import{createWriteStream as createWriteStream5}from"node:fs";import{mkdtemp as mkdtemp8,readFile as readFile15,rm as rm14}from"node:fs/promises";import{tmpdir as tmpdir24}from"node:os";import{join as join274}from"node:path";import{pipeline as pipeline9}from"node:stream/promises";var XMIND_MIME="application/vnd.xmind.workbook",MAX_ARCHIVE_ENTRIES=1e4,MAX_CONTENT_BYTES=32*1024*1024,MAX_TOPICS=1e5,MAX_XML_ELEMENTS=5e5;function statusError6(status5,message8){return Object.assign(new Error(message8),{status:status5})}var text29=value3=>typeof value3=="string"?value3:"",list9=value3=>Array.isArray(value3)?value3:[],record30=value3=>value3&&typeof value3=="object"?value3:{};function topicFromJson(raw,budget,floating=!1){if(--budget.topics<0)throw new Error("too many topics");let topic=record30(
31050
+ text);return{...rest,text:asks2?`NEEDS INPUT: ${question}`:`${outcome.ok?"Done":"It stopped before it finished"}. The result is in ${where2}.`,...outcome.cards?{cards:{...outcome.cards,question}}:{},...outcome.approvalAsk?{approvalAsk:question}:{},...asks2||outcome.cards||outcome.approvalAsk?{privateQuestion:!0}:{}}}function createTurnCallSignals(isActive){let calls2=new Map;return{signal(grant,res){let call2=new AbortController;calls2.set(call2,grant);let onClose=()=>{calls2.delete(call2),res.writableEnded||call2.abort()};return res.closed?onClose():res.once("close",onClose),call2.signal},sweep(){for(let[call2,grant]of calls2)isActive(grant)||(calls2.delete(call2),call2.abort())}}}init_user_errors();import{basename as basename36,join as join276}from"node:path";import{createWriteStream as createWriteStream5}from"node:fs";import{mkdtemp as mkdtemp8,readFile as readFile15,rm as rm14}from"node:fs/promises";import{tmpdir as tmpdir24}from"node:os";import{join as join275}from"node:path";import{pipeline as pipeline9}from"node:stream/promises";var XMIND_MIME="application/vnd.xmind.workbook",MAX_ARCHIVE_ENTRIES=1e4,MAX_CONTENT_BYTES=32*1024*1024,MAX_TOPICS=1e5,MAX_XML_ELEMENTS=5e5;function statusError6(status5,message8){return Object.assign(new Error(message8),{status:status5})}var text29=value3=>typeof value3=="string"?value3:"",list9=value3=>Array.isArray(value3)?value3:[],record30=value3=>value3&&typeof value3=="object"?value3:{};function topicFromJson(raw,budget,floating=!1){if(--budget.topics<0)throw new Error("too many topics");let topic=record30(
31033
31051
  raw);return{title:text29(topic.title),note:text29(record30(record30(topic.notes).plain).content),labels:list9(topic.labels).map(text29).filter(Boolean),markers:list9(topic.markers).map(marker=>text29(record30(marker).markerId)).filter(Boolean),href:text29(topic.href),floating,children:Object.entries(record30(topic.children)).flatMap(([group2,topics])=>list9(topics).map(child2=>topicFromJson(child2,budget,group2==="detached")))}}function outlineFromJson(source4){let budget={topics:MAX_TOPICS},sheets=list9(
31034
31052
  JSON.parse(source4)).map(raw=>{let sheet=record30(raw);return{title:text29(sheet.title),root:sheet.rootTopic?topicFromJson(sheet.rootTopic,budget):null}});return renderSheets(sheets)}var XML_ENTITIES={lt:"<",gt:">",amp:"&",quot:'"',apos:"'"};function decodeXml(value3){return value3.replace(/&(?:#x([0-9a-f]+)|#(\d+)|(\w+));/gi,(entity,hex4,decimal2,named4)=>{if(named4)return XML_ENTITIES[named4]??entity;let code=hex4?Number.parseInt(hex4,16):Number(decimal2);return code>0&&code<=1114111?String.fromCodePoint(
31035
31053
  code):entity})}var localName=name6=>name6.slice(name6.indexOf(":")+1);function parseXml(source4){let root3={name:"",attrs:{},children:[],text:""},stack2=[root3],cursor3=0,elements=0;for(;cursor3<source4.length;){let top=stack2[stack2.length-1],open14=source4.indexOf("<",cursor3);if(open14<0)break;if(top.text+=decodeXml(source4.slice(cursor3,open14)),source4.startsWith("<![CDATA[",open14)){let end=source4.indexOf("]]>",open14+9);if(end<0)break;top.text+=source4.slice(open14+9,end),cursor3=end+3;continue}
@@ -31042,15 +31060,15 @@ labels.map(oneLine13).join(", ")}`:"",topic.markers.length?`markers: ${topic.mar
31042
31060
  `)}).join(`
31043
31061
 
31044
31062
  `)+`
31045
- `}async function outlineFromArchive(archive,scratch){let members2=await readZipDirectory(archive,MAX_ARCHIVE_ENTRIES),member=members2.find(entry2=>entry2.name==="content.json")??members2.find(entry2=>entry2.name==="content.xml");if(!member||member.uncompressedBytes>MAX_CONTENT_BYTES)throw new Error("no readable content");let extracted=join274(scratch,"content");await extractZipMember(archive,member,extracted,384);let source4=await readFile15(extracted,"utf8");return member.name==="content.json"?
31046
- outlineFromJson(source4):outlineFromXml(source4)}async function saveXmindUpload(chunks,originalName,options2={}){let name6=`${originalName}.md`;sanitizeSharedFileName(name6,"text/markdown");let scratch=await mkdtemp8(join274(tmpdir24(),"omb-xmind-"));try{let archive=join274(scratch,"map.xmind"),bytes4=0;if(await pipeline9(chunks,async function*(source4){for await(let chunk of source4){if(bytes4+=chunk.byteLength,bytes4>104857600)throw statusError6(413,`file exceeds ${104857600} bytes`);yield chunk}},
31047
- createWriteStream5(archive,{mode:384})),bytes4===0)throw statusError6(400,"empty file");let outline;try{outline=await outlineFromArchive(archive,scratch)}catch{throw statusError6(400,"not a readable XMind file")}return await saveFile2((async function*(){yield Buffer.from(outline,"utf8")})(),name6,"text/markdown",{uploadId:options2.uploadId})}finally{await rm14(scratch,{recursive:!0,force:!0})}}init_bot_visibility();import{createHash as createHash126}from"node:crypto";var RESULT_CLIP=280,NODES_SHOWN=500,ended=a=>a.status==="completed"||a.status==="failed"||a.status==="cancelled",plural4=(n,one5,many2)=>`${n} ${n===1?one5:many2}`,names4=(rows2,label4)=>{let unique2=[...new Set(rows2.map(label4))];return unique2.length>3?`${unique2.slice(0,3).join(", ")} and ${unique2.length-3} more`:unique2.join(", ")};function jobView(input2){let nameOf2=botId=>input2.nameOf(botId)??botId,shows=row=>input2.visible(row.assignee.destination.threadId),label4=row=>shows(row)?nameOf2(
31063
+ `}async function outlineFromArchive(archive,scratch){let members2=await readZipDirectory(archive,MAX_ARCHIVE_ENTRIES),member=members2.find(entry2=>entry2.name==="content.json")??members2.find(entry2=>entry2.name==="content.xml");if(!member||member.uncompressedBytes>MAX_CONTENT_BYTES)throw new Error("no readable content");let extracted=join275(scratch,"content");await extractZipMember(archive,member,extracted,384);let source4=await readFile15(extracted,"utf8");return member.name==="content.json"?
31064
+ outlineFromJson(source4):outlineFromXml(source4)}async function saveXmindUpload(chunks,originalName,options2={}){let name6=`${originalName}.md`;sanitizeSharedFileName(name6,"text/markdown");let scratch=await mkdtemp8(join275(tmpdir24(),"omb-xmind-"));try{let archive=join275(scratch,"map.xmind"),bytes4=0;if(await pipeline9(chunks,async function*(source4){for await(let chunk of source4){if(bytes4+=chunk.byteLength,bytes4>104857600)throw statusError6(413,`file exceeds ${104857600} bytes`);yield chunk}},
31065
+ createWriteStream5(archive,{mode:384})),bytes4===0)throw statusError6(400,"empty file");let outline;try{outline=await outlineFromArchive(archive,scratch)}catch{throw statusError6(400,"not a readable XMind file")}return await saveFile2((async function*(){yield Buffer.from(outline,"utf8")})(),name6,"text/markdown",{uploadId:options2.uploadId})}finally{await rm14(scratch,{recursive:!0,force:!0})}}init_bot_visibility();import{createHash as createHash127}from"node:crypto";var RESULT_CLIP=280,NODES_SHOWN=500,ended=a=>a.status==="completed"||a.status==="failed"||a.status==="cancelled",plural4=(n,one5,many2)=>`${n} ${n===1?one5:many2}`,names4=(rows2,label4)=>{let unique2=[...new Set(rows2.map(label4))];return unique2.length>3?`${unique2.slice(0,3).join(", ")} and ${unique2.length-3} more`:unique2.join(", ")};function jobView(input2){let nameOf2=botId=>input2.nameOf(botId)??botId,shows=row=>input2.visible(row.assignee.destination.threadId),label4=row=>shows(row)?nameOf2(
31048
31066
  row.assignee.botId):"a teammate",byId=new Map(input2.rows.map(row=>[row.id,row])),starts=new Set(input2.scopes),awaited2=new Map,counts=row=>{let known=awaited2.get(row.id);if(known!==void 0)return known;awaited2.set(row.id,!1);let parent2=row.parentId?byId.get(row.parentId):void 0,result2=starts.has(row.id)||row.reply!=="none"&&parent2!==void 0&&!ended(parent2)&&counts(parent2);return awaited2.set(row.id,result2),result2},scoped=input2.rows.filter(row=>starts.has(row.id)),live2=input2.scope==="\
31049
31067
  turn"?scoped.filter(row=>!ended(row)&&row.status!=="waiting"):input2.rows.filter(row=>!ended(row)&&counts(row)),parked2=live2.filter(row=>row.status==="needs_input"),asking2=live2.filter(row=>row.status==="running"&&input2.activityOf(row)==="waiting-on-you"),{conversation:conversation2}=input2,lead=scoped.at(-1),leadName=lead?nameOf2(lead.assignee.botId):conversation2.kind==="room"?"The room":"The bot",state,reason3;if(conversation2.activity==="waiting-on-you"||parked2.length||asking2.length){state=
31050
31068
  "needs-input";let first2=parked2[0]??asking2[0];reason3=first2?shows(first2)?`${nameOf2(first2.assignee.botId)} needs you: ${first2.question??"an approval is waiting in its conversation"}`:"A teammate needs an answer in a conversation you cannot open":`${leadName} is waiting for your answer in this conversation`}else if(conversation2.activity==="dead")state="failed",reason3=`${leadName}'s engine stopped unexpectedly`;else if(conversation2.activity==="no-signal")state="stalled",reason3=`No sign o\
31051
31069
  f progress from ${leadName}'s engine`;else if(conversation2.busy||conversation2.queued>0||live2.length){state="running";let teammates=live2.filter(row=>!starts.has(row.id));reason3=conversation2.busy?`${leadName} is working`:teammates.length?`Waiting on ${plural4(teammates.length,"teammate task","teammate tasks")}: ${names4(teammates,label4)}`:conversation2.queued>0?"A message is waiting its turn":`${leadName} is about to continue`}else if(!lead)state="idle",reason3="Nothing is running in this c\
31052
31070
  onversation";else if(lead.status==="completed"||lead.status==="waiting"){state="completed";let failed2=input2.rows.filter(row=>row.id!==lead.id&&(row.status==="failed"||row.status==="cancelled"));reason3=`${leadName} finished${failed2.length?`; ${plural4(failed2.length,"teammate task","teammate tasks")} did not complete (${names4(failed2,label4)})`:""}`}else state=lead.outcome==="stalled"?"stalled":"failed",reason3=`${leadName}'s work ended ${lead.status==="cancelled"||lead.outcome==="stopped"?"\
31053
- because it was stopped":`as ${lead.outcome??lead.status}`}${lead.outcomeDetail?`: ${lead.outcomeDetail}`:""}`;let shown3=input2.rows.filter(shows),listed3=shown3.slice(-NODES_SHOWN),ordered=[...listed3.filter(row=>starts.has(row.id)),...listed3.filter(row=>!starts.has(row.id))],tally={queued:0,running:0,waiting:0,needsInput:0,completed:0,failed:0,cancelled:0};for(let row of input2.rows)row.status==="needs_input"?tally.needsInput+=1:row.status==="resume"?tally.queued+=1:tally[row.status]+=1;let version5=createHash126(
31071
+ because it was stopped":`as ${lead.outcome??lead.status}`}${lead.outcomeDetail?`: ${lead.outcomeDetail}`:""}`;let shown3=input2.rows.filter(shows),listed3=shown3.slice(-NODES_SHOWN),ordered=[...listed3.filter(row=>starts.has(row.id)),...listed3.filter(row=>!starts.has(row.id))],tally={queued:0,running:0,waiting:0,needsInput:0,completed:0,failed:0,cancelled:0};for(let row of input2.rows)row.status==="needs_input"?tally.needsInput+=1:row.status==="resume"?tally.queued+=1:tally[row.status]+=1;let version5=createHash127(
31054
31072
  "sha256").update(JSON.stringify([state,conversation2.busy,conversation2.activity??"",conversation2.queued,asking2.map(row=>row.id),input2.rows.map(row=>[row.id,row.status,row.outcome??"",row.executions,row.question??""])])).digest("base64url").slice(0,16),node3=row=>{let{destination}=row.assignee,title3=input2.titleOf(row),result2=ended(row)||row.status==="waiting"||row.status==="needs_input"?row.result:"";return{id:row.id,rootId:row.rootId,...row.parentId?{parentId:row.parentId}:{},depth:row.depth,
31055
31073
  botId:row.assignee.botId,botName:nameOf2(row.assignee.botId),threadId:destination.threadId,...title3?{threadTitle:title3}:{},...destination.groupId?{groupId:destination.groupId}:{},status:row.status,...row.outcome?{outcome:row.outcome}:{},...row.outcomeDetail?{outcomeDetail:row.outcomeDetail}:{},...row.question?{question:row.question}:{},mode:row.mode,reply:row.reply,awaited:input2.scope==="job"?counts(row):starts.has(row.id),createdAt:row.createdAt,...row.startedAt!==void 0?{startedAt:row.startedAt}:
31056
31074
  {},...row.finishedAt!==void 0?{finishedAt:row.finishedAt}:{},executions:row.executions,...result2?{result:input2.full||result2.length<=RESULT_CLIP?result2:`${result2.slice(0,RESULT_CLIP)}\u2026`}:{}}};return{threadId:input2.threadId,scope:input2.scope,since:input2.since,now:input2.now,state,reason:reason3,version:version5,conversation:conversation2,roots:[...input2.scopes],nodes:ordered.map(node3),hidden:input2.rows.length-shown3.length,counts:tally,needsInput:[...parked2,...asking2].filter(row=>input2.
@@ -31085,7 +31103,7 @@ received>IMAGE_MAX_BYTES2)return fail14(413,`image exceeds ${IMAGE_MAX_BYTES2} b
31085
31103
  uploadId=validateAttachmentUploadId(url2.searchParams.get("uploadId")??void 0)}catch(error66){throw req.resume(),error66}let name6=url2.searchParams.get("name");if(!name6)return req.resume(),json7(res,400,{error:"name is required"});let rawType=Array.isArray(req.headers["content-type"])?req.headers["content-type"][0]:req.headers["content-type"],rawLength=Array.isArray(req.headers["content-length"])?req.headers["content-length"][0]:req.headers["content-length"],declaredLength=rawLength===void 0?void 0:
31086
31104
  Number(rawLength);if(declaredLength!==void 0&&(!Number.isSafeInteger(declaredLength)||declaredLength<0))return req.resume(),json7(res,400,{error:"content-length must be a non-negative integer"});if(declaredLength!==void 0&&declaredLength>104857600)return req.resume(),json7(res,413,{error:`file exceeds ${104857600} bytes`});try{let chunks=req.iterator({destroyOnReturn:!1}),saved=rawType?.split(";")[0].trim().toLowerCase()===XMIND_MIME?await saveXmindUpload(chunks,name6,{uploadId}):await saveFile2(
31087
31105
  chunks,name6,rawType??"",{uploadId,expectedBytes:declaredLength});return deps.uploads.note(auth,basename36(saved.path)),json7(res,201,saved)}catch(error66){throw req.resume(),error66}}if(path6==="/api/attachment-storage"&&deps.keptAttachments){if(method2==="GET")return json7(res,200,attachmentStorageUsage());if(method2==="POST"){let kept2=deps.keptAttachments();return kept2?json7(res,200,{...clearAttachments(kept2),...attachmentStorageUsage()}):json7(res,503,{error:"Routines are still loading. T\
31088
- ry again in a moment."})}}if(m3=path6.match(/^\/api\/attachments\/([\w.-]+)$/),m3&&method2==="DELETE"){let name6=m3[1];return!UPLOADED_NAME.test(name6)||!deps.uploads.owns(auth,name6)?json7(res,404,{error:"no such attachment"}):deps.attachmentInUse(name6)?json7(res,409,{...userError("serverError.attachment.alreadyInMessage")}):(deleteAttachment(join275(ATTACHMENTS_DIR,name6)),json7(res,200,{ok:!0}))}if(m3&&method2==="GET"){let attachment=readAttachment(m3[1]);if(!attachment)return json7(res,404,
31106
+ ry again in a moment."})}}if(m3=path6.match(/^\/api\/attachments\/([\w.-]+)$/),m3&&method2==="DELETE"){let name6=m3[1];return!UPLOADED_NAME.test(name6)||!deps.uploads.owns(auth,name6)?json7(res,404,{error:"no such attachment"}):deps.attachmentInUse(name6)?json7(res,409,{...userError("serverError.attachment.alreadyInMessage")}):(deleteAttachment(join276(ATTACHMENTS_DIR,name6)),json7(res,200,{ok:!0}))}if(m3&&method2==="GET"){let attachment=readAttachment(m3[1]);if(!attachment)return json7(res,404,
31089
31107
  {error:"no such attachment"});let size3=attachment.bytes.byteLength,headers={"content-type":attachment.mime,"cache-control":"private, no-store","x-content-type-options":"nosniff"};if(attachment.mime.startsWith("audio/")){let rawRange=Array.isArray(req.headers.range)?req.headers.range[0]:req.headers.range,range6=parseAudioRange(rawRange,size3);if(range6.kind==="unsatisfiable")return res.writeHead(416,{...headers,"content-range":`bytes */${size3}`}),res.end();if(range6.kind==="range")return res.writeHead(
31090
31108
  206,{...headers,"content-length":String(range6.end-range6.start+1),"content-range":`bytes ${range6.start}-${range6.end}/${size3}`}),res.end(attachment.bytes.subarray(range6.start,range6.end+1))}return res.writeHead(200,{...headers,"content-length":String(size3)}),res.end(attachment.bytes)}if(method2==="GET"&&path6==="/api/search"){let q2=url2.searchParams.get("q")??"",rawLimit=url2.searchParams.get("limit"),limit2=rawLimit?Math.min(Math.max(Number(rawLimit)||0,1),100):40,threadId=url2.searchParams.
31091
31109
  get("threadId")?.trim()||void 0;if(threadId&&(!store5.botByThread(threadId)&&!store5.groupByThread(threadId)||!visible.thread(threadId)))return json7(res,404,{error:"no such conversation"});let activePaths=new Map,onActivePath=(threadId2,messageId2)=>{let ids=activePaths.get(threadId2);return ids||activePaths.set(threadId2,ids=new Set(store5.activePath(threadId2).map(m4=>m4.id))),ids.has(messageId2)},found2=await searchMessagesAsync(q2,visible.everything?limit2:Math.min(limit2*10,1e3),threadId);
@@ -31106,7 +31124,7 @@ test(resumeKey))return{status:400,body:{error:"invalid resume key"}};if(!items.l
31106
31124
  bot.id,botName:owner2.bot.name,tool:"COMPOSIO_MANAGE_CONNECTIONS",summary:outside,decision:"auto-denied",source:"connector-scope",rule:`scope:${outside}:app`}),{status:403,body:{error:`${owner2.bot.name} has not been given access to ${outside}; allow it under the bot's Access settings first`}}}let scopedLine=deps.refusal(capability2,slugs);if(scopedLine)return{status:409,body:{error:scopedLine}};let authConfigNote=await deps.composio.prepareConnectionAuthConfigs(cfg2,items),connectionState=await deps.
31107
31125
  composio.connectionStatus(cfg2,slugs).catch(()=>({}));requireActive();let messageIds=[];for(let item of items){let existing=deps.store.messagesFor(threadId).find(message9=>message9.connector?.resumeKey===resumeKey&&message9.connector.slug===item.slug&&(message9.connector.alias??"").toLowerCase()===(item.alias??"").toLowerCase());if(existing){messageIds.push(existing.id);continue}let toolkit=await deps.composio.toolkitCard(cfg2,item.slug);requireActive();let connected=connectionState[item.slug]?.
31108
31126
  connected===!0,status5=item.alias?"required":connected?"connected":"required",language=deps.language(threadId),description2=item.alias?connectorCardDescription(toolkit.label,item.alias,language):toolkit.blurb||connectorCardDescription(toolkit.label,void 0,language),message8=deps.store.appendMessage(threadId,{role:"bot",kind:"connector",text:connectorCardText(toolkit.label,item.alias,language),...owner2.group?{from:{botId:owner2.bot.id,name:owner2.bot.name,color:owner2.bot.color}}:{},connector:{slug:item.
31109
- slug,label:toolkit.label,description:description2,status:status5,resumeKey,...item.alias?{alias:item.alias}:{}}});messageIds.push(message8.id)}return deps.maybeResume(threadId,resumeKey),{status:200,body:{messageIds,...authConfigNote?{authConfigNote}:{}}}}return{request:request9}}import{createHash as createHash127,randomUUID as randomUUID90}from"node:crypto";import{readFileSync as readFileSync197}from"node:fs";import{join as join276}from"node:path";init_atomic();var CLOCK_SKEW_MS2=3e4,CODE_WAIT_MS=6e4,CODE_POLL_MS=5e3,BODIES_PER_MAILBOX=10,FAILED_ROUNDS=2,MAX_SCANNED=2e4,MAX_CANDIDATES2=20,NEAR_BEFORE=80,NEAR_AFTER=40,HTML_ENTITIES={nbsp:" ",amp:"&",lt:"<",gt:">",quot:'"',apos:"'"},DROPPED_BLOCKS=/<(style|script|head|title)\b[^>]*>[\s\S]*?<\/\1\s*>|<!--[\s\S]*?-->/giu,LINKS=/\bhttps?:\/\/\S+|\bwww\.\S+/giu,ADDRESSES2=/\S+@\S+/gu,DATES=/\b\d{4}-\d{1,2}-\d{1,2}\b|\b\d{1,2}[/.]\d{1,2}[/.]\d{2,4}\b/gu,COPYRIGHT=/(?:©|\(c\)|copyright)\s*\d{4}/giu,PHONES=/\+\d[\d ().-]{6,}\d|\(\d{3}\)\s*\d{3}[-. ]?\d{4}/gu,
31127
+ slug,label:toolkit.label,description:description2,status:status5,resumeKey,...item.alias?{alias:item.alias}:{}}});messageIds.push(message8.id)}return deps.maybeResume(threadId,resumeKey),{status:200,body:{messageIds,...authConfigNote?{authConfigNote}:{}}}}return{request:request9}}import{createHash as createHash128,randomUUID as randomUUID90}from"node:crypto";import{readFileSync as readFileSync198}from"node:fs";import{join as join277}from"node:path";init_atomic();var CLOCK_SKEW_MS2=3e4,CODE_WAIT_MS=6e4,CODE_POLL_MS=5e3,BODIES_PER_MAILBOX=10,FAILED_ROUNDS=2,MAX_SCANNED=2e4,MAX_CANDIDATES2=20,NEAR_BEFORE=80,NEAR_AFTER=40,HTML_ENTITIES={nbsp:" ",amp:"&",lt:"<",gt:">",quot:'"',apos:"'"},DROPPED_BLOCKS=/<(style|script|head|title)\b[^>]*>[\s\S]*?<\/\1\s*>|<!--[\s\S]*?-->/giu,LINKS=/\bhttps?:\/\/\S+|\bwww\.\S+/giu,ADDRESSES2=/\S+@\S+/gu,DATES=/\b\d{4}-\d{1,2}-\d{1,2}\b|\b\d{1,2}[/.]\d{1,2}[/.]\d{2,4}\b/gu,COPYRIGHT=/(?:©|\(c\)|copyright)\s*\d{4}/giu,PHONES=/\+\d[\d ().-]{6,}\d|\(\d{3}\)\s*\d{3}[-. ]?\d{4}/gu,
31110
31128
  CANDIDATE=/(?<![\p{L}\p{N}-])(\d{3}[- ]\d{3}|\d{4}[- ]\d{4}|[A-Z0-9]{4}-[A-Z0-9]{4}|\d{4,10}|[A-Z0-9]{4,10})(?![\p{L}\p{N}-])/gu,NOT_A_CODE_WORD=/(?:zip|postal|post|promo|coupon|discount|voucher|country|area|referral|invite|gift|error|reference|tracking|bar|qr|source)[- ]?code\b/giu,CODE_WORD=/(?<![\p{L}\p{N}])(?:code|otp|passcode|pin|verification|verify|c[oó]digo|verifica[cç][aã]o|verificaci[oó]n|verifizierungscode|bestätigungscode|sicherheitscode|anmeldecode|код)(?![\p{L}\p{N}])/iu,CODE_MAIL_SUBJECT=/(?<![\p{L}\p{N}])(?:code|otp|passcode|verify|verification|sign[- ]?in|log[- ]?in|login|c[oó]digo|verifica[cç][aã]o)(?![\p{L}\p{N}])/iu;
31111
31129
  function bodyText(raw){return/<[a-z!/][^>]*>/iu.test(raw)?raw.replace(DROPPED_BLOCKS," ").replace(/<br\s*\/?>|<\/(?:p|div|tr|td|table|h[1-6]|li)>/giu,`
31112
31130
  `).replace(/<[^>]*>/gu," ").replace(/&(#\d+|#x[\da-f]+|[a-z]+);/giu,(whole3,name6)=>{if(name6[0]!=="#")return HTML_ENTITIES[name6.toLowerCase()]??whole3;let point11=name6[1]==="x"||name6[1]==="X"?Number.parseInt(name6.slice(2),16):Number(name6.slice(1));return Number.isFinite(point11)&&point11>0&&point11<=1114111?String.fromCodePoint(point11):whole3}):raw}function extractCode(subject,body2,boxes){let fixedLength=boxes!==void 0&&boxes>1?boxes:void 0,text30=`${subject}
@@ -31116,12 +31134,12 @@ index+match5[0].length+NEAR_AFTER).replace(NOT_A_CODE_WORD," ");if(CODE_WORD.tes
31116
31134
  listed3;try{listed3=await box2.list(options2.askedAt-CLOCK_SKEW_MS2)}catch{return round2.failed=!0,round2}let recent=listed3.filter(mail=>mail.at>=options2.askedAt-CLOCK_SKEW_MS2);round2.wrongSender=recent.some(mail=>!sentBySite(mail.from,options2.site)&&CODE_MAIL_SUBJECT.test(mail.subject));let theirs=recent.filter(mail=>sentBySite(mail.from,options2.site)).slice(0,BODIES_PER_MAILBOX);for(let mail of theirs){let result2=read4.get(mail.id);if(!result2){let text30=null;try{text30=await box2.body(
31117
31135
  mail.id)}catch{text30=null}if(text30===null){round2.unreadable=!0;continue}result2=extractCode(mail.subject,text30,options2.boxes),read4.set(mail.id,result2)}result2.kind==="ambiguous"&&(round2.ambiguous=!0),result2.kind==="code"&&(options2.isUsed(result2.code)?round2.used=!0:round2.codes.add(result2.code))}return round2}async function waitForEmailCode(mailboxes,options2){let waitMs=options2.waitMs??CODE_WAIT_MS,pollMs=options2.pollMs??CODE_POLL_MS,deadline=options2.now()+waitMs,read4=mailboxes.
31118
31136
  map(()=>new Map),wrongSender=!1,used=!1,unreadable=!1,failedRounds=0;for(;;){let rounds=await Promise.all(mailboxes.map((box2,index4)=>look(box2,options2,read4[index4]))),codes=new Set(rounds.flatMap(round2=>[...round2.codes]));if(rounds.some(round2=>round2.ambiguous)||codes.size>1)return{kind:"miss",why:"ambiguous"};if(codes.size===1)return{kind:"code",code:[...codes][0]};if(wrongSender||=rounds.some(round2=>round2.wrongSender),used||=rounds.some(round2=>round2.used),unreadable||=rounds.some(round2=>round2.
31119
- unreadable),failedRounds=rounds.every(round2=>round2.failed)?failedRounds+1:0,failedRounds>=FAILED_ROUNDS||options2.now()>=deadline||options2.active?.()===!1)break;await options2.sleep(pollMs)}return failedRounds>=FAILED_ROUNDS||unreadable?{kind:"miss",why:"unreadable"}:used?{kind:"miss",why:"used"}:{kind:"miss",why:wrongSender?"wrong-sender":"not-found"}}var MAIL_CARD_FILE="email-code-card.json",LIST_LIMIT3=20,ACCOUNTS_PER_APP=3,ASKED_BEFORE_CALL_MS=12e4,REMEMBER_ASK_MS=15*6e4,REMEMBER_USED_MS=30*6e4,READS2={gmail:[GMAIL_FETCH_TOOL,GMAIL_MESSAGE_TOOL],outlook:[OUTLOOK_LIST_TOOL,OUTLOOK_MESSAGE_TOOL]};function readAsked(file3){try{let parsed2=JSON.parse(readFileSync197(file3,"utf8"));return new Map(Object.entries(parsed2.asked??{}).filter(([,at8])=>typeof at8=="number"))}catch{return new Map}}function createLoginMailCodes(deps){let run11={recentInbox,
31120
- readMessage:readMessage2,...deps.run},askedFile=join276(deps.dataDir,MAIL_CARD_FILE),asked=readAsked(askedFile),asks2=new Map,used=new Map,usedKey=(site,code)=>createHash127("sha256").update(`${site}\0${code}`).digest("hex"),forgetOld=(map7,before)=>{for(let[key7,at8]of map7)at8<before&&map7.delete(key7)},mayRead3=(bot,app)=>deps.appAllowed(app)&&READS2[app].every(slug3=>connectorAccessDecision(bot.connectorScopes,[{slug:slug3}],[app]).ok&&evaluateConnectorTools([slug3],bot.connectorTools,[app]).
31137
+ unreadable),failedRounds=rounds.every(round2=>round2.failed)?failedRounds+1:0,failedRounds>=FAILED_ROUNDS||options2.now()>=deadline||options2.active?.()===!1)break;await options2.sleep(pollMs)}return failedRounds>=FAILED_ROUNDS||unreadable?{kind:"miss",why:"unreadable"}:used?{kind:"miss",why:"used"}:{kind:"miss",why:wrongSender?"wrong-sender":"not-found"}}var MAIL_CARD_FILE="email-code-card.json",LIST_LIMIT3=20,ACCOUNTS_PER_APP=3,ASKED_BEFORE_CALL_MS=12e4,REMEMBER_ASK_MS=15*6e4,REMEMBER_USED_MS=30*6e4,READS2={gmail:[GMAIL_FETCH_TOOL,GMAIL_MESSAGE_TOOL],outlook:[OUTLOOK_LIST_TOOL,OUTLOOK_MESSAGE_TOOL]};function readAsked(file3){try{let parsed2=JSON.parse(readFileSync198(file3,"utf8"));return new Map(Object.entries(parsed2.asked??{}).filter(([,at8])=>typeof at8=="number"))}catch{return new Map}}function createLoginMailCodes(deps){let run11={recentInbox,
31138
+ readMessage:readMessage2,...deps.run},askedFile=join277(deps.dataDir,MAIL_CARD_FILE),asked=readAsked(askedFile),asks2=new Map,used=new Map,usedKey=(site,code)=>createHash128("sha256").update(`${site}\0${code}`).digest("hex"),forgetOld=(map7,before)=>{for(let[key7,at8]of map7)at8<before&&map7.delete(key7)},mayRead3=(bot,app)=>deps.appAllowed(app)&&READS2[app].every(slug3=>connectorAccessDecision(bot.connectorScopes,[{slug:slug3}],[app]).ok&&evaluateConnectorTools([slug3],bot.connectorTools,[app]).
31121
31139
  allowed);function imapBox(account2){return{list:async sinceMs=>(await run11.recentInbox(account2,deps.imapGuard,{sinceMs,limit:LIST_LIMIT3})).map(mail=>({id:String(mail.uid),at:mail.at,from:mail.from,subject:mail.subject})),body:async id12=>(await run11.readMessage(account2,deps.imapGuard,{mailbox:"INBOX",uid:Number(id12)})).text}}function appBox(app,reads){return app==="gmail"?{list:async sinceMs=>(await reads.emails(sinceMs,LIST_LIMIT3)).emails,body:id12=>reads.messageBody(id12)}:{list:sinceMs=>reads.
31122
31140
  outlookEmails(sinceMs,LIST_LIMIT3),body:id12=>reads.outlookBody(id12)}}async function appBoxes(turn,app){let cfg2=deps.cfg(),access2;if(deps.personApps().includes(app)){let person2=deps.turnPerson(turn.threadId,turn.generation);if(!person2)return[];let own4=deps.appsAccess(person2);if(!own4)return[];[cfg2,access2]=asPerson(cfg2,own4)}let state=(await deps.composio.connectedServices(cfg2,access2))[app];if(!state?.connected)return[];let active3=(state.accounts??[]).filter(one5=>/^active$/i.test(one5.
31123
31141
  status));return(active3.length>1?active3.slice(0,ACCOUNTS_PER_APP).map(one5=>one5.id):[void 0]).map(account2=>appBox(app,createConnectedReads({connected:async()=>null,...account2?{accounts:async()=>({[app]:account2})}:{},relay:(payload,session,signal)=>deps.composio.relayMcp(cfg2,payload,session,void 0,signal,access2)}).session()))}async function mailboxes(bot,turn){let boxes=deps.imapAccounts(bot).slice(0,ACCOUNTS_PER_APP).map(imapBox),unknown2=!1;if(deps.composio.configured(deps.cfg())&&bot.composio!==
31124
- !1){for(let app of["gmail","outlook"])if(mayRead3(bot,app))try{boxes.push(...await appBoxes(turn,app))}catch{unknown2=!0}}return{boxes,unknown:unknown2}}return{async find(bot,turn,ask2,active3){if(ask2.via==="other")return{kind:"skip"};let started2=ask2.now();forgetOld(asks2,started2-REMEMBER_ASK_MS),forgetOld(used,started2-REMEMBER_USED_MS);let key7=`${turn.threadId}\0${ask2.site}`,askedAt=ask2.askedAt??asks2.get(key7)??started2-ASKED_BEFORE_CALL_MS;asks2.set(key7,askedAt);let{boxes,unknown:unknown2}=await mailboxes(
31142
+ !1){for(let app of["gmail","outlook"])if(mayRead3(bot,app))try{boxes.push(...await appBoxes(turn,app))}catch{unknown2=!0}}return{boxes,unknown:unknown2}}return{async find(bot,turn,ask2,active3){if(ask2.via==="other")return{kind:"skip"};let started3=ask2.now();forgetOld(asks2,started3-REMEMBER_ASK_MS),forgetOld(used,started3-REMEMBER_USED_MS);let key7=`${turn.threadId}\0${ask2.site}`,askedAt=ask2.askedAt??asks2.get(key7)??started3-ASKED_BEFORE_CALL_MS;asks2.set(key7,askedAt);let{boxes,unknown:unknown2}=await mailboxes(
31125
31143
  bot,turn);if(!boxes.length)return unknown2?{kind:"miss",why:"unreadable"}:ask2.via==="email"?{kind:"no-mailbox"}:{kind:"skip"};let found2=await waitForEmailCode(boxes,{site:ask2.site,askedAt,...ask2.boxes>1?{boxes:ask2.boxes}:{},isUsed:code=>used.has(usedKey(ask2.site,code)),active:active3,now:ask2.now,sleep:ask2.sleep});return found2.kind==="miss"?found2:{kind:"code",code:found2.code,typed:()=>{used.set(usedKey(ask2.site,found2.code),ask2.now()),asks2.delete(key7)}}},async offerConnect(bot,turn){
31126
31144
  if(deps.unattended(turn.threadId))return{shown:!1};let person2=deps.turnPerson(turn.threadId,turn.generation),onTeam=deps.personApps().includes("gmail"),who=person2??"home";if(asked.has(who))return{shown:!1};let remember4=()=>{asked.set(who,Date.now());try{writeFileAtomic(askedFile,`${JSON.stringify({v:1,asked:Object.fromEntries(asked)})}
31127
31145
  `,{mode:384})}catch(error66){console.warn(`email codes: could not save ${askedFile}: ${error66 instanceof Error?error66.message:String(error66)}`)}},answer2=await deps.connectCard(turn,{botId:bot.id,threadId:turn.threadId,items:["gmail"],resumeKey:randomUUID90()});return answer2.status===200?(remember4(),{shown:!0}):answer2.status===409&&onTeam?(person2&&remember4(),{shown:!1,line:answer2.body.error}):{shown:!1}}}}function createWarmSummary(deps){let scale7=deps.timeScale&&deps.timeScale>0&&deps.timeScale<=1?deps.timeScale:1,[idleMs,soonMs,retryMs,giveUpMs]=[18e4,1e4,12e4,3e6].map(ms2=>Math.max(1,Math.round(ms2*scale7))),pending3=new Map,last=new Map,disposed=!1,note2=(threadId,outcome)=>{last.set(threadId,{at:deps.now(),outcome}),last.size>500&&last.delete(last.keys().next().value),deps.log?.(`warm summary ${threadId}: ${outcome}`)},drop=(p3,outcome)=>{p3.timer?.cancel(),p3.timer=null,p3.dueAt=null,pending3.
@@ -31141,15 +31159,15 @@ if(!deps.enabled()||store5.groupByThread(target4.threadId)||!store5.taskByThread
31141
31159
  botId,threadId))return{reason:"the bot is busy",retry:!0};if(deps.memoryShort())return{reason:"memory is short",retry:!0};if(deps.queued(botId,threadId))return{reason:"a message is waiting for this conversation",retry:!1};if(deps.coordinator.activeDirect(threadId)||deps.coordinator.awaitingTeammateThreads().has(threadId))return{reason:"a teammate is working on this conversation's request",retry:!1};if(deps.waits()?.all().some(w4=>w4.botId===botId&&w4.threadId===threadId&&w4.followUp!==void 0&&w4.
31142
31160
  ending?.status==="fired"))return{reason:"a wait has fired and will carry on here",retry:!1};let routines2=deps.routines();return routines2&&wakeHoldOf(routines2.listRoutines().filter(r=>r.botId===botId),routines2.listRuns().filter(r=>r.botId===botId),now2(),12e4).hold?{reason:"a routine of this bot is about to run",retry:!0}:null},run:async(target4,plan,control)=>plan.way==="native"?native(target4,control):await deps.fold(target4,control.signal)?{ok:!0}:{ok:!1,reason:"the conversation does not n\
31143
31161
  eed a summary yet"},log:deps.log});return{...warm,sawThread(threadId){warm.seen(threadId);let bot=store5.botByThread(threadId),instanceId=bot?store5.taskByThread(bot.id,threadId)?.lastInstanceId:void 0,hold=instanceId?deps.instance(instanceId)?.adapter.cacheKeepWarm?.hold:void 0;hold&&hold(threadId,Math.max(now2()+PRESENCE_HOLD_MS,deps.keepWarmUntil(threadId)??0))}}}var SESSION_READ_MAX_CHARS=8e3,PORT2=Number(process.env.OMB_PORT||process.env.OGB_PORT||8799),WEBHOOK_PORT=Number(process.env.OMB_WEBHOOK_PORT||PORT2+1),WEBHOOK_PUBLIC_URL=process.env.OMB_WEBHOOK_PUBLIC_URL||void 0,STATIC_DIR=process.env.OMB_STATIC_DIR||null;dataFormatAtStart("check",DATA_DIR,serverVersion());ensureDirs();var dataDirLease=acquireDataDirLeaseForProcess(DATA_DIR),dataDirLeaseReleaseAttempted=!1;function releaseDataDirLeaseAtExit(){if(!dataDirLeaseReleaseAttempted){dataDirLeaseReleaseAttempted=
31144
- !0;try{dataDirLease.release()}catch(error66){console.error(`[data-directory] lease release failed: ${error66 instanceof Error?error66.message:String(error66)}`)}}}process.once("exit",releaseDataDirLeaseAtExit);var workspaceRestore={restored:!1},restoredAtStart;existsSync98(join277(DATA_DIR,".backups"))&&(workspaceRestore=applyPendingWorkspaceRestore(DATA_DIR),workspaceRestore.restored&&(restoredAtStart=workspaceRestore.id),!workspaceRestore.restored&&!workspaceRestore.rolledBack&&(workspaceRestore=
31162
+ !0;try{dataDirLease.release()}catch(error66){console.error(`[data-directory] lease release failed: ${error66 instanceof Error?error66.message:String(error66)}`)}}}process.once("exit",releaseDataDirLeaseAtExit);var workspaceRestore={restored:!1},restoredAtStart;existsSync99(join278(DATA_DIR,".backups"))&&(workspaceRestore=applyPendingWorkspaceRestore(DATA_DIR),workspaceRestore.restored&&(restoredAtStart=workspaceRestore.id),!workspaceRestore.restored&&!workspaceRestore.rolledBack&&(workspaceRestore=
31145
31163
  readLastWorkspaceRestore(DATA_DIR)??workspaceRestore));dataFormatAtStart("stamp",DATA_DIR,serverVersion());var workspaceMaintenance=new WorkspaceBackupMaintenance,moveFreeze=createMoveFreeze({dataDir:DATA_DIR,exportOnly:(process.env.OMB_CLOUD_ROLE==="home"||process.env.OMB_CLOUD_ROLE==="team")&&process.env.OMB_CLOUD_EXPORT_ONLY==="1"}),ENVIRONMENT_ID=loadEnvironmentId(DATA_DIR),signInAllowList=cacheUntilConfigChanges(config3=>({admins:parseAllowList(config3.signIn?.admins?.join(",")),members:parseAllowList(
31146
- config3.signIn?.members?.join(","))})),sessions=new SessionRegistry({file:join277(DATA_DIR,"sessions.json"),emailScopesSnapshot:()=>{let membership=signInAllowList();return email3=>allowedScopes(email3,membership)},portalMembership:hostedWorkspaceConfiguration()?.portalMembership===!0,recheckMs:1e3});onConfigSaved(()=>sessions.membershipChanged());var deviceLinks=new DeviceLinks,sharedComputers=new SharedComputers(id12=>sessions.isLive(id12),new LentComputers(join277(DATA_DIR,"lent-computers.jso\
31164
+ config3.signIn?.members?.join(","))})),sessions=new SessionRegistry({file:join278(DATA_DIR,"sessions.json"),emailScopesSnapshot:()=>{let membership=signInAllowList();return email3=>allowedScopes(email3,membership)},portalMembership:hostedWorkspaceConfiguration()?.portalMembership===!0,recheckMs:1e3});onConfigSaved(()=>sessions.membershipChanged());var deviceLinks=new DeviceLinks,sharedComputers=new SharedComputers(id12=>sessions.isLive(id12),new LentComputers(join278(DATA_DIR,"lent-computers.jso\
31147
31165
  n")),deviceLinks,lentCopies);sharedComputers.wokeAt=()=>cloudPowerNow()?.sleptUntil()??null;var startedFromSleep=!1,CLOUD_SECRETS=BOOT_CLOUD_SECRETS,CLOUD_ENV={...process.env,...CLOUD_SECRETS},CLOUD_HOME=cloudHomeConfiguration(CLOUD_ENV),CLOUD_TEAM=CLOUD_HOME?.team??null,CLOUD_PERSONAL=CLOUD_HOME!==null&&CLOUD_TEAM===null,TEAM_LABEL=CLOUD_TEAM?{label:CLOUD_TEAM.name}:{},appLanguage=()=>cfg.language??CLOUD_TEAM?.language,personLanguages=createPersonLanguages({dataDir:DATA_DIR,configured:appLanguage,
31148
31166
  privateTo:threadId=>teamHost.privateTo(threadId)}),threadLanguage=personLanguages.forThread;setConversationLanguage(threadLanguage);CLOUD_HOME&&(repairMovedWorkspacePaths(DATA_DIR),acceptLegacyOrigins(CLOUD_HOME.legacyOrigins));CLOUD_PERSONAL&&sessions.requireAdmin(userError("serverError.cloud.personal"));var lendingEnabled=()=>sharedComputersEnabled(cfg)||CLOUD_HOME!==null||ownHome.here(),ownerLends=()=>ownerLendingEnabled(cfg)&&ownHome.takesMove(),botLending=()=>lendingEnabled()||ownerLends()&&
31149
- sharedComputers.anyLent(),CLOUD_HOME_LENDER="cloud-home",cloudRoutineAuthors=CLOUD_HOME?createCloudRoutineAuthors(join277(DATA_DIR,"lending-routines.json")):null,ownerStartedRoutineRuns=new Set,foreignTurns=new Map,lendingMemory=CLOUD_PERSONAL?createLendingMemory({file:join277(DATA_DIR,"lending-memory.json"),files:botId=>{let bot=store4.bot(botId),ownerOpened=threadId=>{let starter2=threadStarters.get(threadId);return starter2===void 0||cloudOwnerPerson(starter2)};return botMemoryFiles(bot?{id:bot.
31167
+ sharedComputers.anyLent(),CLOUD_HOME_LENDER="cloud-home",cloudRoutineAuthors=CLOUD_HOME?createCloudRoutineAuthors(join278(DATA_DIR,"lending-routines.json")):null,ownerStartedRoutineRuns=new Set,foreignTurns=new Map,lendingMemory=CLOUD_PERSONAL?createLendingMemory({file:join278(DATA_DIR,"lending-memory.json"),files:botId=>{let bot=store4.bot(botId),ownerOpened=threadId=>{let starter2=threadStarters.get(threadId);return starter2===void 0||cloudOwnerPerson(starter2)};return botMemoryFiles(bot?{id:bot.
31150
31168
  id,cwd:bot.cwd,tasks:store4.tasks(bot.id).filter(task2=>ownerOpened(task2.threadId))}:void 0,{workspace:ensureWorkspace,taskWorkspaces:TASK_WORKSPACES_DIR,skillLinks:harnessSkillLinks})},knownBots:()=>store4.bots.map(bot=>bot.id),log:line6=>console.warn(line6),onLocked:botId=>lendingLifts?.memoryLocked(botId)}):null;CLOUD_HOME&&readMemoryOnlyFromRegularFiles();if(CLOUD_HOME){delete process.env.OMB_CLOUD_BOOTSTRAP_SECRET;for(let key7 of CLOUD_IGNORED_KEYS)delete process.env[key7];console.log(`clo\
31151
31169
  ud home ${CLOUD_HOME.machineId}: bots run on the engines the person signs in to here`);for(let warning of CLOUD_HOME.warnings)console.warn(`cloud home: ${warning}`)}holdIncludedServices(CLOUD_ENV);for(let key7 of CLOUD_HOME_SECRET_KEYS)delete process.env[key7];await startBotBoxAtBoot({dataDir:DATA_DIR,port:PORT2});CLOUD_HOME&&Object.keys(CLOUD_SECRETS).length===0&&console.warn("cloud home: its secrets came in this process's environment, which anything running as the same user can read in /proc; \
31152
- start it with cloud-home-start");var threadStarters=new ThreadStarters(join277(DATA_DIR,"thread-starters.json")),commandAllowlist=new CommandAllowlistStore(join277(DATA_DIR,"command-allowlist.json")),logins2=new VaultStore({dataDir:DATA_DIR,secretChanged:item=>mcpServersHost.keyChanged(item)});removeRetiredAppFiles(DATA_DIR);var emailService=createEmailService({dataDir:DATA_DIR,publicOnly:!!CLOUD_HOME,refusal:CLOUD_TEAM?"Email isn't on a Team Cloud yet: every bot there would read the same mailbo\
31170
+ start it with cloud-home-start");var threadStarters=new ThreadStarters(join278(DATA_DIR,"thread-starters.json")),commandAllowlist=new CommandAllowlistStore(join278(DATA_DIR,"command-allowlist.json")),logins2=new VaultStore({dataDir:DATA_DIR,secretChanged:item=>mcpServersHost.keyChanged(item)});removeRetiredAppFiles(DATA_DIR);var emailService=createEmailService({dataDir:DATA_DIR,publicOnly:!!CLOUD_HOME,refusal:CLOUD_TEAM?"Email isn't on a Team Cloud yet: every bot there would read the same mailbo\
31153
31171
  x.":null});addHeldSecretScrubber(text30=>emailService.scrub(text30));var heldSecrets=new HeldSecrets(logins2);addHeldSecretScrubber(text30=>heldSecrets.scrub(text30));var onePassword=new OnePasswordLogins({token:()=>logins2.onePasswordToken(),grants:()=>logins2.onePasswordGrants(),connect:async token3=>{let sdk;try{sdk=nativeRequire()("@1password/sdk")}catch(error66){throw onePasswordUnavailable(error66)}return sdkOnePasswordClient(sdk,token3,serverVersion())}});logins2.onePasswordToken()&&onePassword.
31154
31172
  refresh();var botLogins=new BotLogins(logins2,onePassword,()=>store4.bots,value3=>heldSecrets.remember(value3,"password")),mcpKeys=createMcpKeys({store:logins2,linked:{fresh:()=>botLogins.fresh(),byId:id12=>botLogins.linkedById(id12)}}),SESSION_COOKIE=sessionCookieName(PORT2,ENVIRONMENT_ID),HOSTED_WORKSPACE=hostedWorkspaceConfigured(),workspaceAccess=null,DESKTOP_MANAGED=process.env.OMB_DESKTOP_PARENT==="1",SHARED_WORKSPACE_FULL_ACCESS=sharedWorkspaceFullAccessConfigured(),sharedWorkspaceFullAccessEnabled=()=>SHARED_WORKSPACE_FULL_ACCESS&&
31155
31173
  !!workspaceAccess&&entitled("admin"),HOSTED_FULL_ACCESS_REFUSAL="On a shared company workspace Full access comes only from the operator's dedicated policy";HOSTED_WORKSPACE&&setDefaultApprovalMode("ask");var LOOPBACK10=resolveLoopbackTrust({desktopManaged:DESKTOP_MANAGED,hostedWorkspace:HOSTED_WORKSPACE,cloudHome:!!CLOUD_HOME,fromSource:import.meta.url.endsWith(".ts")}),cliOwnerToken;if(process.env.OMB_CLI_OWNER_STDIN==="1"&&LOOPBACK10.trust==="service"&&process.stdin){let received="";process.stdin.
@@ -31158,7 +31176,7 @@ setEncoding("utf8"),process.stdin.on("error",()=>{}),process.stdin.on("data",chu
31158
31176
  `)&&/^[A-Za-z0-9_-]{43}$/.test(line6)&&(cliOwnerToken=line6)})}delete process.env.OMB_CLI_OWNER_STDIN;var desktopMutationToken=DESKTOP_MANAGED?"":void 0,companionMutationToken=DESKTOP_MANAGED?"":void 0,FALLBACK_PUBLIC_URL=process.env.OMB_PUBLIC_URL?.trim().replace(/\/+$/,"")||null,tailnetShare=createTailnetShare({port:PORT2,handle:(req,res)=>handleRequest(req,res),attach:(listener2,handle2)=>upgrades.attach(listener2,handle2),log:line6=>console.log(line6)}),cfg=loadConfig(),hostedModels=hostedModelPolicy(
31159
31177
  DATA_DIR),providerConfigs=()=>hostedModels?hostedModels.configs():instanceConfigs(cfg),decorateHostedProvider=hostedModels?instance=>hostedModels.decorate(instance):void 0;if(hostedModels){let selection3=hostedModels.select(cfg.defaultModelSelection);selection3.instanceId&&JSON.stringify(selection3)!==JSON.stringify(cfg.defaultModelSelection)&&saveConfig({defaultModelSelection:selection3}),cfg.defaultModelSelection=selection3}bindThreadLogCapProvider(()=>threadEventLogMaxBytes(cfg));bindDecisionRetention(
31160
31178
  ()=>decisionRetentionDays(cfg.decisions?.retentionDays));bindSafetyFloor(()=>cfg);var decider=createDecider({config:()=>cfg,dataDir:DATA_DIR}),extractor=createExtractor({config:()=>cfg,timeZone:()=>proactive.brief.timeZone()}),customDomainVerifier=createCustomDomainVerifier({environmentId:ENVIRONMENT_ID}),emailSignIn=createEmailSignIn({allow:signInAllowList}),customDomainRevision=0;function savedCustomDomain(){if(DESKTOP_MANAGED||!cfg.customDomain)return null;try{return normalizeCustomDomain(cfg.
31161
- customDomain)}catch{return null}}function publicUrl(){return savedCustomDomain()??FALLBACK_PUBLIC_URL??tailnetShare.origin()??lanUrl(PORT2)}function customDomainStatus(){return{customDomain:savedCustomDomain(),publicUrl:publicUrl(),fallbackUrl:FALLBACK_PUBLIC_URL,supported:!DESKTOP_MANAGED,appPort:PORT2,webhookPort:WEBHOOK_PORT,serverIpv4:DESKTOP_MANAGED?null:customDomainIpv4()}}var registry2=new ProviderRegistry(BUILT_IN_DRIVERS,{statusFile:join277(DATA_DIR,"providers","engine-status.json")}),supportsApprovalMode2=createApprovalModeSupport(
31179
+ customDomain)}catch{return null}}function publicUrl(){return savedCustomDomain()??FALLBACK_PUBLIC_URL??tailnetShare.origin()??lanUrl(PORT2)}function customDomainStatus(){return{customDomain:savedCustomDomain(),publicUrl:publicUrl(),fallbackUrl:FALLBACK_PUBLIC_URL,supported:!DESKTOP_MANAGED,appPort:PORT2,webhookPort:WEBHOOK_PORT,serverIpv4:DESKTOP_MANAGED?null:customDomainIpv4()}}var registry2=new ProviderRegistry(BUILT_IN_DRIVERS,{statusFile:join278(DATA_DIR,"providers","engine-status.json")}),supportsApprovalMode2=createApprovalModeSupport(
31162
31180
  registry2);registerEnginesBinDir();var engineUpdates=engineUpdatesFor({drivers:BUILT_IN_DRIVERS,turnRunning:()=>store4.bots.some(bot=>botHasActiveTurn(bot.id))||store4.groups.some(groupIsWorking)||!!routines?.hasActiveRuns(),configuredClis:()=>Object.values(providerConfigs()).flatMap(entry2=>{let cli=entry2.config?.cli;return typeof cli=="string"&&cli?[cli]:[]}),updated:()=>{registry2.forgetSnapshots(),broadcast({kind:"config",...configStatus()})}}),turnTriggers=new Map,NOBODY_PROFILE={name:"",email:"",
31163
31181
  aboutMe:""};function sessionPersonName(session){let claimed=(session.email??session.label??"").trim();return(CLOUD_TEAM?teamHost.memberProfile(session).name:"")||claimed}function messageSender(auth){if(auth.kind!=="session")return;let name6=sessionPersonName(auth.session);return name6?{name:name6,id:actorKey(auth)}:void 0}function teamConversationPerson(threadId){let member=audienceMember(teamHost.audienceOf(threadId));if(member)return member;let run11=routines?.runForThread(threadId);return run11?
31164
31182
  cloudRoutineAuthors?.writer(run11.routineId):void 0}function userNameFor(threadId){if(!CLOUD_TEAM)return cfg.profile?.name?.trim()||"User";let fallback2=teamHost.personName(teamConversationPerson(threadId))??"User";return line6=>teamHost.personName(line6.sender?.id)??line6.sender?.name??fallback2}function roomPeople(threadId,userName){let lines=store4.messagesFor(threadId).filter(line6=>line6.role==="user"&&!line6.peerAsk&&!line6.aside).slice(-200),names5=[...new Set(lines.map(line6=>speakerOf(userName,
@@ -31169,7 +31187,7 @@ origin||owner2.stopped||!owner2.generations.has(capability2.generation)?OUTSIDE:
31169
31187
  threadId)||cloudThreadStarters(threadId).some(person2=>person2!==void 0&&!cloudProvenOwnerPerson(person2)))return!1;let thread=store4.messagesFor(threadId),last=thread.at(-1),cached4=ownerOnlyCache.get(threadId),lastKey=last?`${last.id}:${last.card?.answeredBy?JSON.stringify(last.card.answeredBy):""}`:void 0;if(cached4&&cached4.length===thread.length&&cached4.last===lastKey)return cached4.owner;let owner2=ownerOnlyConversation(thread,cloudProvenOwnerPerson,cloudCardAnswerer)&&!thread.some(cloudReportFromOthers);
31170
31188
  return ownerOnlyCache.size>5e3&&ownerOnlyCache.clear(),ownerOnlyCache.set(threadId,{length:thread.length,last:lastKey,owner:owner2}),owner2}function noteForeignTurn(botId,threadId,generation){if(lendingMemory){foreignTurns.set(generation,{botId,threadId});try{lendingMemory.noteForeignTurn(botId)}catch(error66){console.warn(`lending: could not record a turn someone else started: ${error66.message}`)}}}function foreignTurnRunning(botId){return[...foreignTurns.values()].some(turn=>turn.botId===botId)}
31171
31189
  function sessionLendingPrincipal(auth){return CLOUD_HOME?CLOUD_PERSONAL&&cloudOwnerSession(auth)?CLOUD_HOME_LENDER:null:auth.kind==="session"?personKey(auth.session):null}var CLOUD_OWNER_PROFILE_FIELDS=["name","title","description","soul","notifications"];function cloudThreadRefusal(auth,threadId){return!CLOUD_HOME||cloudOwnerSession(auth)||auth.kind==="session"&&threadStarters.get(threadId)===actorKey(auth)?null:"On this Cloud you can only change conversations you started."}function cloudGuestSendRefusal(auth,threadId){
31172
- return!CLOUD_PERSONAL||auth.kind!=="session"||cloudOwnerSession(auth)||threadStarters.get(threadId)===actorKey(auth)?null:"On this Cloud you can only write in conversations you started. Start a new conversation with this bot."}var CLOUD_OWNER_KEY=CLOUD_PERSONAL?`p_${createHash128("sha256").update(`cloud-owner:${CLOUD_HOME.machineId}`).digest("base64url").slice(0,22)}`:null,cloudEarlierOwners={adopted:new Set,proven:new Set},cloudHome2=null,teamHost=createCloudTeamHost({team:CLOUD_TEAM,dataDir:DATA_DIR,
31190
+ return!CLOUD_PERSONAL||auth.kind!=="session"||cloudOwnerSession(auth)||threadStarters.get(threadId)===actorKey(auth)?null:"On this Cloud you can only write in conversations you started. Start a new conversation with this bot."}var CLOUD_OWNER_KEY=CLOUD_PERSONAL?`p_${createHash129("sha256").update(`cloud-owner:${CLOUD_HOME.machineId}`).digest("base64url").slice(0,22)}`:null,cloudEarlierOwners={adopted:new Set,proven:new Set},cloudHome2=null,teamHost=createCloudTeamHost({team:CLOUD_TEAM,dataDir:DATA_DIR,
31173
31191
  store:{groupByThread:threadId=>store4.groupByThread(threadId),get bots(){return store4.bots}},engineHomes,starters:threadStarters,markers:new Set([CLOUD_NOBODY_KEY,CLOUD_OUTSIDE_KEY]),language:appLanguage,serverProfile:{read:()=>cfg.profile,clear:()=>{adminActorScope.exit(()=>saveConfig({profile:{name:"",email:"",aboutMe:"",avatarUrl:""}})),Object.assign(cfg,loadConfig())}}}),teamOwners=createTeamOwners({team:CLOUD_TEAM,dataDir:DATA_DIR,sessions,store:()=>store4,audienceOf:threadId=>teamHost.audienceOf(
31174
31192
  threadId),starters:threadStarters}),mausbotOwnChat=createMausBotOwnChat({bots:()=>store4.bots,starters:threadStarters,personKey:email3=>personKey({id:"",email:email3}),moveNotes:(from,to2,person2)=>moveMemoryLayer(from,to2,personLanguages.forLine(person2))}),personRooms=createPersonRooms({reads:CLOUD_TEAM?createRoomReads(DATA_DIR,person2=>{botOrders?.forgetPerson(person2),forgetNotificationReader(person2)}):null,store:()=>store4,newestMessageId:threadId=>readCursor(threadId).lastReadMessageId,publicGroupState,
31175
31193
  broadcast,shared:threadId=>teamHost.privateTo(threadId)===null,wireBot:botId=>{let bot=store4.bot(botId);return bot?wireBot(bot):null}}),botOrders=CLOUD_TEAM?createPersonBotOrder(DATA_DIR):null,teamRoutines=createTeamRoutines({team:!!CLOUD_TEAM,privateTo:teamHost.privateTo,task:(botId,threadId)=>store4.taskByThread(botId,threadId),routines:()=>routines,authors:cloudRoutineAuthors,withWriter:withRoutineWriter,ownBot:botId=>{let person2=store4.bot(botId)?.defaultBot?.person;return person2?personKey(
@@ -31183,7 +31201,7 @@ adopted.has(person2)?!0:cloudOwnerDevice(person2):!1}function cloudProvenOwnerPe
31183
31201
  if(auth.kind==="loopback")return auth.trust==="service"&&behavior!=="deny"?"A local service can only decline this request. Approve or answer it in Limix Bot while signed in.":null;let reviewed=auth.scopes.includes("admin")?void 0:store4.messagesFor(threadId).find(message8=>message8.card?.requestId===requestId&&(message8.card.teamMemoryRequest||message8.card.outsideWrite))?.card;if(reviewed)return reviewed.outsideWrite?"Only a workspace admin can save what came in from outside.":"Only a workspace\
31184
31202
  admin can review shared team memory.";if(CLOUD_PERSONAL)return cloudCardRefusal(auth);if(auth.scopes.includes("admin")||!sharedMembership())return null;let setupRefused=CLOUD_TEAM?botAccess.cardRefusal(auth,threadId,requestId):null;if(setupRefused)return setupRefused;let known=[threadStarters.get(threadId),cardRequesterKey(threadId,requestId)].filter(person2=>!!person2);return!known.length||known.includes(personKey(auth.session))||CLOUD_TEAM&&teamOwners.routing.askedPerson(store4.messagesFor(threadId).
31185
31203
  find(line6=>line6.card?.requestId===requestId)?.from?.botId??store4.botByThread(threadId)?.id,threadId)===personKey(auth.session)?null:"Only the person who started this conversation or sent this request, or a workspace admin, can answer this card."}function canManageCommandAllowlist(auth){return auth.kind==="loopback"?auth.trust!=="service":auth.scopes.includes("admin")}var COMMAND_ALLOWLIST_DRIVERS=new Set(["claudeAgent","codex","antigravityAgent","grokAgent","opencodeGo","kimiAgent","droidAgen\
31186
- t","cursorAgent","qwenAgent","geminiAgent","hermesAgent","customAcp"]);function commandAllowlistResponse(bot){let instance=registry2.get(bot.modelSelection.instanceId),task2=store4.taskByThread(bot.id,bot.threadId),cwd=task2?.cwd!==void 0?task2.cwd:bot.cwd??join277(realpathSync28(DATA_DIR),"task-workspaces",bot.id,bot.threadId);return cwd&&existsSync98(cwd)&&(cwd=realpathSync28(cwd)),{rules:commandAllowlist.list(bot.id),supported:COMMAND_ALLOWLIST_DRIVERS.has(instance?.driverKind??""),context:{providerInstanceId:bot.
31204
+ t","cursorAgent","qwenAgent","geminiAgent","hermesAgent","customAcp"]);function commandAllowlistResponse(bot){let instance=registry2.get(bot.modelSelection.instanceId),task2=store4.taskByThread(bot.id,bot.threadId),cwd=task2?.cwd!==void 0?task2.cwd:bot.cwd??join278(realpathSync28(DATA_DIR),"task-workspaces",bot.id,bot.threadId);return cwd&&existsSync99(cwd)&&(cwd=realpathSync28(cwd)),{rules:commandAllowlist.list(bot.id),supported:COMMAND_ALLOWLIST_DRIVERS.has(instance?.driverKind??""),context:{providerInstanceId:bot.
31187
31205
  modelSelection.instanceId,cwd}}}function decisionActorFor(auth){if(auth.kind==="loopback")return auth.trust==="service"?{kind:"worker"}:{kind:"loopback"};let session=auth.session;return{kind:"session",sessionId:session.id,label:session.label,...session.email?{email:session.email}:{},...session.userId&&!session.userId.startsWith("portal:")?{userId:session.userId}:{}}}function cardAnswererFor(auth){return auth.kind==="loopback"?auth.trust==="service"?{kind:"worker"}:{kind:"loopback"}:{kind:"sessio\
31188
31206
  n",name:sessionPersonName(auth.session)||"Signed-in user",person:actorKey(auth)}}var cloudCardAnswersInFlight=new Map;function cloudCardAnswerer(card){return card.answeredBy?card.answeredBy.kind==="session"?card.answeredBy.person:void 0:card.requestId?cloudCardAnswersInFlight.get(card.requestId):void 0}async function answeringCardAs(auth,threadId,requestId,work,via){let open14=(()=>{let card=store4.messagesFor(threadId).find(message8=>message8.card?.requestId===requestId)?.card;return!!(card&&!card.
31189
31207
  answered&&!card.dismissed&&!card.expired)})();open14&&cloudCardAnswersInFlight.set(requestId,auth.kind==="session"?actorKey(auth):!CLOUD_HOME&&auth.trust==="service"?NOT_THE_OWNER:void 0);try{await withDecisionActor(decisionActorFor(auth),work,via)}finally{let message8=open14?store4.messagesFor(threadId).find(candidate=>candidate.card?.requestId===requestId):void 0,card=message8?.card;message8&&card&&!card.answeredBy&&card.answered!=="unavailable"&&(card.answered||card.dismissed)&&store4.patchMessage(
@@ -31211,19 +31229,19 @@ label,scopes:pairing2.scopes}})}plan.engineAction&&rows2.push({category:"engine"
31211
31229
  roomFloor??"everyone"},after:{audienceFloor:room.audienceFloor??"everyone"}}),rows2}function operatorPrices(){return entitled("billing")&&cfg.billing?.prices&&Object.keys(cfg.billing.prices).length?cfg.billing.prices:null}var attributeUsage=createUsageAttribution({section:botId=>store4.bot(botId)?.section,threadTrigger:threadId=>turnTriggers.get(threadId),routineWriter:id12=>{let key7=cloudRoutineAuthors?.writer(id12);return key7?teamOwners.people?.list().find(one5=>personKey({id:"",email:one5.email})===
31212
31230
  key7)?.email:void 0}});function bookTurnUsage(row,tokensReported=!0,notificationThreadId=row.threadId){let cost=tokensReported||row.costUsd!==null?ledgerCost(row,operatorPrices()):{costUsd:null},booked=attributeUsage({...row,...cost,...usageTrace.settle(row.threadId),at:new Date().toISOString()});noteSpend(DATA_DIR,booked,appendUsage(DATA_DIR,booked));let state=spendState(cfg,DATA_DIR),alert=takeSpendAlert(DATA_DIR,state);alert&&state&&broadcast({kind:"notify",notification:logNotification(buildSpendNotification(
31213
31231
  {id:row.botId,name:row.botName},notificationThreadId,spendAlertText(alert,state)))},{adminOnly:!0})}var providerAuthSessions=new ProviderAuthSessions({signedIn:instanceId=>limitTakeover.signedIn(instanceId)}),mcpServersHost=createMcpServersHost({dataDir:DATA_DIR,cfg:()=>cfg,persist:persistMcpServers,bots:()=>store4.bots,policy:servers=>managedPolicy.filterMcp(servers),tell:(text30,about)=>notify(buildNoticeNotification(about,store4.bot(about.id)?.threadId??"",text30)),startsServers:botId=>{let bot=store4.
31214
- bot(botId);return!!(bot&&registry2.get(bot.modelSelection.instanceId)?.adapter.capabilities.customMcp===!0)},boxed:()=>botBox.enabled(),keys:mcpKeys}),mcpOAuth=new McpOAuthManager({file:join277(DATA_DIR,"mcp-oauth.json"),isOwnerLive:owner2=>owner2==="loopback"||sessions.isLive(owner2)||isCardOwnerLive(store4,owner2),onSettled:(name6,phase,owner2)=>{phase==="succeeded"&&connectionHealth.connectedAgain({kind:"mcp",id:name6}),mcpSignInCards.settled(name6,phase,owner2)},onRefresh:(name6,outcome)=>connectionHealth.
31232
+ bot(botId);return!!(bot&&registry2.get(bot.modelSelection.instanceId)?.adapter.capabilities.customMcp===!0)},boxed:()=>botBox.enabled(),keys:mcpKeys}),mcpOAuth=new McpOAuthManager({file:join278(DATA_DIR,"mcp-oauth.json"),isOwnerLive:owner2=>owner2==="loopback"||sessions.isLive(owner2)||isCardOwnerLive(store4,owner2),onSettled:(name6,phase,owner2)=>{phase==="succeeded"&&connectionHealth.connectedAgain({kind:"mcp",id:name6}),mcpSignInCards.settled(name6,phase,owner2)},onRefresh:(name6,outcome)=>connectionHealth.
31215
31233
  refreshed(null,name6,outcome),clients:(name6,url2)=>{let raw=cfg.mcpServers?.[name6],parsed2=raw===void 0?null:parseStoredMcpServer(name6,raw);return parsed2?.ok&&isRemoteMcpServer(parsed2.server)&&parsed2.server.url===url2&&parsed2.server.oauth?mcpKeys.oauthClient(name6,parsed2.server.oauth):void 0}}),teamConnections=createTeamConnectionsHost({team:CLOUD_TEAM,dataDir:DATA_DIR,cfg:()=>cfg,adminOrigin:CLOUD_HOME?.adminOrigin??null,harnessUrl:`http://127.0.0.1:${PORT2}`,audienceOf:teamHost.audienceOf,
31216
31234
  requester:(threadId,generation)=>actingPeople.requester(threadId,generation),personName:person2=>teamHost.personName(person2),roster:()=>(teamOwners.people?.list()??[]).map(member=>({person:personKey({id:"",email:member.email}),email:member.email,role:member.role})),mint:capability2=>mintInternalCapability({...capability2,depth:0,kind:"connectors",skillAuthoring:!1,createdBots:0,openedThreads:0}),mcpOAuth,isOwnerLive:owner2=>sessions.isLive(owner2)||isCardOwnerLive(store4,owner2),onSettled:(name6,phase,owner2)=>mcpSignInCards.
31217
31235
  settled(name6,phase,owner2),onRefresh:(person2,name6,outcome)=>connectionHealth.refreshed(person2,name6,outcome),onPersonChanged:(person2,kind2,id12)=>connectionHealth.connectedAgain({kind:kind2,id:id12,person:person2}),botMcp:bot=>mcpServersHost.mounted(bot),oauthClient:mcpKeys.oauthClient,brokerUrl:()=>CLOUD_TEAM&&cloudConnectedAppsBrokerUrl()||null,fullAccess:fullAccessForSource,composio:composio_exports});teamConnections.primeApps();var connectionHealth=createConnectionHealthHost({dataDir:CLOUD_TEAM?
31218
31236
  DATA_DIR:null,mcpServers:()=>cfg.mcpServers??{},mcpOAuth,connections:teamConnections,bots:()=>store4.bots,botServers:bot=>Object.keys(mcpServersHost.mounted(bot)),roster:()=>teamOwners.people?.list()??[],personKey:email3=>personKey({id:"",email:email3}),personName:email3=>teamHost.people.profile(personKey({id:"",email:email3})).name||null,test:(name6,signal)=>mcpConfig.test(name6,{signal,person:()=>null}),asleep:()=>cloudPowerNow()?.sleeping()??!1,wokeAt:()=>cloudPowerNow()?.sleptUntil()??null});
31219
31237
  CLOUD_TEAM&&connectionHealth.start();var openCodeOrganisationManaged=()=>!1,openCodeKeysAllowed=()=>openCodeProviderKeysAllowed({cloudHome:!!CLOUD_HOME,hostedWorkspace:HOSTED_WORKSPACE,organisationManaged:openCodeOrganisationManaged(),sharedSignIn:sharedSignIn(signInAllowList())});setOpenCodeProviderKeyPolicy(openCodeKeysAllowed);var openCodeKeysLastAllowed=openCodeKeysAllowed();function resyncOpenCodeProviderKeys(){let allowed3=openCodeKeysAllowed();if(allowed3!==openCodeKeysLastAllowed){openCodeKeysLastAllowed=
31220
- allowed3;for(let instance of registry2.instances())instance.driverKind==="opencodeGo"&&registry2.refreshModels(instance.instanceId).then(()=>broadcast({kind:"config",...configStatus()}),()=>{})}}var firstEngineRead=holdUntilFirstEngineRead();await registry2.load(providerConfigs(),decorateHostedProvider);var bundledSkills=loadBundledSkills(),availableSkills=()=>mergeSkills(bundledSkills,loadUserSkills(join277(DATA_DIR,"skills"))),usbPhoneOffered=(instance,skills)=>instance.adapter.capabilities.phoneMcp===
31238
+ allowed3;for(let instance of registry2.instances())instance.driverKind==="opencodeGo"&&registry2.refreshModels(instance.instanceId).then(()=>broadcast({kind:"config",...configStatus()}),()=>{})}}var firstEngineRead=holdUntilFirstEngineRead();await registry2.load(providerConfigs(),decorateHostedProvider);var bundledSkills=loadBundledSkills(),availableSkills=()=>mergeSkills(bundledSkills,loadUserSkills(join278(DATA_DIR,"skills"))),usbPhoneOffered=(instance,skills)=>instance.adapter.capabilities.phoneMcp===
31221
31239
  !0&&!CLOUD_HOME&&!HOSTED_WORKSPACE&&skills.some(({manifest})=>manifest.defaultEnabled&&manifest.requiredCapabilities.includes("phoneMcp")),utilityParentPort=process.parentPort;function postDesktopPrivateMessage(message8){if(!utilityParentPort)return!1;try{return utilityParentPort.postMessage(message8),!0}catch(error66){return console.error(`[desktop-sync] could not send private parent message: ${error66 instanceof Error?error66.message:String(error66)}`),!1}}function applyDesktopMutationTokenMessage(raw){
31222
31240
  if(!raw||typeof raw!="object"||Array.isArray(raw))return!1;let message8=raw;if(message8.type!=="openmausbot:desktop-mutation-token")return!1;if(typeof message8.token!="string"||!/^[A-Za-z0-9_-]{43}$/.test(message8.token))throw new Error("invalid desktop mutation capability");return desktopMutationToken=message8.token,typeof message8.companionToken=="string"&&/^[A-Za-z0-9_-]{43}$/.test(message8.companionToken)&&(companionMutationToken=message8.companionToken),!0}var browserCleanup=new BrowserCleanupCoordinator(
31223
- {file:join277(DATA_DIR,"browser-cleanups.json"),send:request9=>(eraseDeletedBrowser(request9).catch(error66=>(console.warn("browser cleanup: could not clear saved session state",error66),!1)).then(ok2=>{browserCleanup.receive({type:"openmausbot:browser-lifecycle-result",requestId:request9.requestId,ok:ok2})}).catch(error66=>{console.warn("browser cleanup: could not acknowledge cleanup",error66)}),!0)}),phoneSecrets=new PhoneSecretBridge(postDesktopPrivateMessage);utilityParentPort?.on("message",
31241
+ {file:join278(DATA_DIR,"browser-cleanups.json"),send:request9=>(eraseDeletedBrowser(request9).catch(error66=>(console.warn("browser cleanup: could not clear saved session state",error66),!1)).then(ok2=>{browserCleanup.receive({type:"openmausbot:browser-lifecycle-result",requestId:request9.requestId,ok:ok2})}).catch(error66=>{console.warn("browser cleanup: could not acknowledge cleanup",error66)}),!0)}),phoneSecrets=new PhoneSecretBridge(postDesktopPrivateMessage);utilityParentPort?.on("message",
31224
31242
  event2=>{let message8=event2?.data;try{if(applyDesktopMutationTokenMessage(message8)||desktopComputer.receive(message8)||tailnetShare.receive(message8,answer2=>utilityParentPort?.postMessage(answer2))||handleDesktopTrustedApprovalMessage(message8)||browserCleanup.receive(message8)||phoneSecrets.receive(message8)||botLogins.receiveHandoff(message8,postDesktopPrivateMessage,what=>cloudConnections.handoff(what))||applyIncludedPagesMessage(message8))return;if(applyIncludedXMessage(message8))return void broadcast(
31225
31243
  {kind:"config",...configStatus()});if(applyPhoneLinkMessage(message8))return;applyManagedBrokerMessage(message8)}catch(error66){console.error(`[desktop-sync] rejected private parent message: ${error66 instanceof Error?error66.message:String(error66)}`)}});var savedSteps=createSavedSteps({enabled:()=>savedStepsEnabled(cfg),bot:id12=>store4.bot(id12),publish:event2=>bus.publish(event2),engines:{get:threadId=>runningTurnEngines.get(threadId),set:(threadId,engine)=>{runningTurnEngines.set(threadId,engine)}},
31226
- stopped:threadId=>directRequestOwners.get(threadId)?.stopped===!0,generation:threadId=>directTurnGenerationByThread.get(threadId),patchMessage:(threadId,messageId2,patch2)=>{store4.patchMessage(threadId,messageId2,patch2)},withholdHandoff:threadId=>handoffs.withhold(threadId),contextChanged:(botId,threadId)=>{let owner2=store4.bot(botId);owner2&&markTaskContextExternallyUpdated(owner2,threadId)}}),quickFallback=new QuickModelFallback({file:join277(DATA_DIR,"refused-quick-models.json"),publish:event2=>{
31244
+ stopped:threadId=>directRequestOwners.get(threadId)?.stopped===!0,generation:threadId=>directTurnGenerationByThread.get(threadId),patchMessage:(threadId,messageId2,patch2)=>{store4.patchMessage(threadId,messageId2,patch2)},withholdHandoff:threadId=>handoffs.withhold(threadId),contextChanged:(botId,threadId)=>{let owner2=store4.bot(botId);owner2&&markTaskContextExternallyUpdated(owner2,threadId)}}),quickFallback=new QuickModelFallback({file:join278(DATA_DIR,"refused-quick-models.json"),publish:event2=>{
31227
31245
  savedSteps.dispatch.take(event2)||bus.publish(event2)},stopped:threadId=>directRequestOwners.get(threadId)?.stopped===!0}),bus=new EventBus(void 0,event2=>quickFallback.take(event2)||savedSteps.dispatch.take(event2));bus.attach(registry2.instances());bus.subscribe(event2=>savedSteps.observe(event2));var companyRuntimeReady,companyRuntimeStarted=new Promise(resolve56=>{companyRuntimeReady=resolve56}),managedPolicy=new ManagedDesktopPolicy({onChange:()=>{registry2.forgetSnapshots(),broadcast({kind:"\
31228
31246
  config",...configStatus()}),resyncOpenCodeProviderKeys()}});onKeyRejectionChange(()=>{registry2.forgetSnapshots(),broadcast({kind:"config",...configStatus()})});function computerPlaceRefusal(kind2){let cloudHome3=CLOUD_HOME?cloudHomePlaceRefusal(kind2==="thisComputer"?"local":kind2==="localVm"?"vm":"cloud"):void 0;if(cloudHome3)return{message:cloudHome3,code:"cloud_home"};let managed=managedPolicy.computerRefusal(kind2);return managed?{message:managed,code:"managed_policy"}:void 0}function policyModelRefusal(instance){
31229
31247
  let engine=BUILT_IN_DRIVERS.find(driver=>driver.driverKind===instance.driverKind)?.metadata.displayName;return managedPolicy.modelRefusal({driverKind:instance.driverKind,displayName:engine},managedDesktop.owns(instance.instanceId))}var managedDesktop=new ManagedDesktopProviders({registry:registry2,dataDirectory:DATA_DIR,beforeReplace:stopCompanyInstances,migrate:aliases=>{store4.renameInstances(new Map(aliases.map(({from,to:to2})=>[from,to2])))},onAvailability:()=>{registry2.forgetSnapshots(),broadcast(
@@ -31234,7 +31252,7 @@ Promise.resolve()).catch(error66=>{console.warn(`[trial credit] could not start:
31234
31252
  {type:"openmausbot:managed-desktop-result",requestId,ok:ok2})});var orgLibrary=null,pendingOrgLibraryRelay=null;utilityParentPort?.on("message",event2=>{let message8=event2.data;if(message8?.type!=="openmausbot:managed-library")return;let requestId=typeof message8.requestId=="string"&&message8.requestId.length<=100?message8.requestId:void 0,ok2=!0;orgLibrary?ok2=orgLibrary.applyRelay(message8.library??null).ok:pendingOrgLibraryRelay={library:message8.library??null},utilityParentPort.postMessage(
31235
31253
  {type:"openmausbot:managed-desktop-result",requestId,ok:ok2})});utilityParentPort?.on("message",event2=>{let message8=event2.data;if(message8?.type!=="openmausbot:managed-desktop")return;let requestId=typeof message8.requestId=="string"&&message8.requestId.length<=100?message8.requestId:void 0;companyRuntimeStarted.then(()=>managedDesktop.apply(message8.connection)).then(()=>{utilityParentPort.postMessage({type:"openmausbot:managed-desktop-result",requestId,ok:!0})},()=>{utilityParentPort.postMessage(
31236
31254
  {type:"openmausbot:managed-desktop-result",requestId,ok:!1,error:"Company connection could not be applied. Reconnect from desktop Settings."})})});var MAX_ATTACHED_FILES_PER_TURN=10,MAX_ROOM_POSTS_PER_TURN=3,MAX_CREATED_BOTS_PER_TURN=4,MAX_CREATED_BOT_INSTRUCTIONS=4e3,INTERNAL_CAPABILITY_ORPHAN_MS=720*60*6e4,internalCapabilities=new Map,activeInternalGenerationByThread=new Map,turnCallSignals=createTurnCallSignals(internalCapabilityIsActive),internalGenerationByProviderTurn=new ProviderTurnGenerationRegistry,
31237
- computerSelectionTurns=new Map,EXTERNAL_RUNTIME_GENERATION="external-runtime",EXTERNAL_RUNTIMES_FILE=join277(DATA_DIR,"external-runtimes.json");function externalRuntimeMayCall(method2,path6){return method2==="GET"?path6==="/api/internal/agents"||path6==="/api/internal/assignment-status":method2==="POST"&&path6==="/api/internal/coordinate-bots"}function externalRunId(grant){return`external-runtime:${grant.botId}:${grant.threadId}`}function externalRuntimeCapability(header3){let grant=authorizeExternalRuntime(
31255
+ computerSelectionTurns=new Map,EXTERNAL_RUNTIME_GENERATION="external-runtime",EXTERNAL_RUNTIMES_FILE=join278(DATA_DIR,"external-runtimes.json");function externalRuntimeMayCall(method2,path6){return method2==="GET"?path6==="/api/internal/agents"||path6==="/api/internal/assignment-status":method2==="POST"&&path6==="/api/internal/coordinate-bots"}function externalRunId(grant){return`external-runtime:${grant.botId}:${grant.threadId}`}function externalRuntimeCapability(header3){let grant=authorizeExternalRuntime(
31238
31256
  EXTERNAL_RUNTIMES_FILE,header3,id12=>store4.bot(id12));return grant?{botId:grant.botId,threadId:grant.threadId,externalRuntime:grant,generation:EXTERNAL_RUNTIME_GENERATION,depth:0,kind:"agents",skillAuthoring:!1,createdBots:0,openedThreads:0,orphanExpiresAt:Number.MAX_SAFE_INTEGER}:null}var standInRoots=new Set;function beginInternalCapabilityGeneration(threadId,generation=randomUUID91()){let previous2=activeInternalGenerationByThread.get(threadId);return previous2&&revokeInternalCapabilityGeneration(
31239
31257
  threadId,previous2),activeInternalGenerationByThread.set(threadId,generation),generation}var sessionCredentials=new Map;function sessionGrants({generation:_turn,...grants}){let thread=botForThread(grants.botId,grants.threadId);return JSON.stringify({...grants,approval:thread?approvalModeFor(thread):null})}function sessionBearer(capability2){let credentials=sessionCredentials.get(capability2.threadId)??new Map;sessionCredentials.set(capability2.threadId,credentials);let slot=`${capability2.botId}\
31240
31258
  ${capability2.kind}${capability2.connectorsFor?` ${capability2.connectorsFor}`:""}`,grants=sessionGrants(capability2),held4=credentials.get(slot);if(held4?.grants===grants)return held4.token;let token3=randomBytes39(24).toString("hex");return credentials.set(slot,{grants,token:token3}),token3}function mintInternalCapability(capability2,{perTurn=!1}={}){if(activeInternalGenerationByThread.get(capability2.threadId)!==capability2.generation)throw new Error("cannot mint an integration capability fo\
@@ -31294,7 +31312,7 @@ return directTurnClaimIsCurrent(botId,claimId,threadId)?(directTurnDispatchClaim
31294
31312
  let claim2=directTurnDispatchClaims.get(threadId);if(!claim2||claim2.botId!==botId)return null;let compacting=compactionControllers.get(threadId);return compacting?.generation===claim2.id&&compacting.controller.abort(new DirectTurnSetupCancelled("context summarization stopped")),directTurnDispatchClaims.delete(threadId),directTurnGenerationByThread.get(threadId)===claim2.id&&clearTurnDigestState(threadId),claim2.phase==="dispatching"&&markCancelledProviderHandshake(claim2.threadId,`direct:${claim2.
31295
31313
  id}`),claim2}var{browserRuntime,browserLive,usedBrowserSessions,browserSweep,temporaryBrowserSessions,currentBrowserSession,forgetTemporaryBrowser,myChromeAvailable,usesMyChrome,lentChromeSummary,browserSessionSpec,browserIntegration,browserReady,currentBrowserSpec,loginInput,browserSystemPrompt,closeBrowser,browserEngineSwitched,eraseDeletedBrowser,engineSummary,browserSessionsOf,signedInSitesTarget,uploadPaths,eraseAudienceBrowsers}=createBrowserHost({cfg,store:()=>store4,turnResources,activeInternalGenerationByThread,
31296
31314
  mintInternalCapability,DESKTOP_MANAGED,CLOUD_HOME,HOSTED_WORKSPACE,PORT:PORT2,engineMemory,audienceOf:teamHost.browserAudience,...CLOUD_TEAM?{browserBox:(fd,ro2)=>botBox.browserBox(fd,ro2)}:{},lendRefusal:turn=>cloudLendingRefusal({botId:store4.botByThread(turn.threadId)?.id??"",threadId:turn.threadId,generation:turn.generation}),device:()=>deviceLinks.route(CLOUD_HOME_LENDER)??sharedComputers.internetAway(CLOUD_HOME_LENDER)??{unshared:!0},lentChrome:CLOUD_PERSONAL?{route:()=>deviceLinks.chromeRoute(
31297
- CLOUD_HOME_LENDER),lender:()=>sharedComputers.chromeLender(CLOUD_HOME_LENDER)}:void 0}),dataSheets=new DataSheetRegistry({broadcast:frame2=>broadcast({...frame2}),dropResult:async(botId,name6)=>{dataEngine2.unavailable()===null&&await(await dataEngine2.forBot(botId)).dropResult(name6)}});function dataExportRoots(bot){let downloads=join277(homedir44(),"Downloads");return[...existsSync98(downloads)?[downloads]:[],...bot.cwd?[bot.cwd]:[],workspaceDir(bot.id)]}var dataUnavailableLogged=!1;function dataIntegration(botId,turn){
31315
+ CLOUD_HOME_LENDER),lender:()=>sharedComputers.chromeLender(CLOUD_HOME_LENDER)}:void 0}),dataSheets=new DataSheetRegistry({broadcast:frame2=>broadcast({...frame2}),dropResult:async(botId,name6)=>{dataEngine2.unavailable()===null&&await(await dataEngine2.forBot(botId)).dropResult(name6)}});function dataExportRoots(bot){let downloads=join278(homedir44(),"Downloads");return[...existsSync99(downloads)?[downloads]:[],...bot.cwd?[bot.cwd]:[],workspaceDir(bot.id)]}var dataUnavailableLogged=!1;function dataIntegration(botId,turn){
31298
31316
  let unavailable3=dataEngine2.unavailable();if(unavailable3!==null)return dataUnavailableLogged||(dataUnavailableLogged=!0,console.warn(`Data tools unavailable: ${unavailable3}`)),null;let token3=mintInternalCapability({botId,...turn,kind:"data",depth:0,skillAuthoring:!1,createdBots:0,openedThreads:0});return{command:process.execPath,args:[SPAWNED_PROXIES.harnessMcp,"data"],env:{...AGENTS_NODE_FLAG,[harnessMcpTokenEnv("data")]:token3,OMB_HARNESS_URL:`http://127.0.0.1:${PORT2}`}}}var emailIntegration=(bot,turn)=>emailHost.
31299
31317
  integration(bot,()=>mintInternalCapability({botId:bot.id,...turn,kind:"email",depth:0,skillAuthoring:!1,createdBots:0,openedThreads:0}),`http://127.0.0.1:${PORT2}`),browserEngineInstall=null,browserEngineInstallError=null;function browserEngineSummary(){let status5=browserEngineStatus(),progress={myChrome:myChromeAvailable(),...lentChromeSummary(),...browserEngineInstall?{installing:!0}:{},...browserEngineInstallError?{installError:browserEngineInstallError}:{}};return engineSummary(status5.kind===
31300
31318
  "ready"?{kind:"engine",version:status5.version,chrome:chromeLauncher.describe(),...progress}:{kind:"unavailable",reason:status5.reason,installable:status5.installable,...progress})}function phoneIntegration(botId,threadId,generation){let token3=mintInternalCapability({botId,threadId,generation,depth:0,kind:"phone",skillAuthoring:!1,createdBots:0,openedThreads:0}),env={...AGENTS_NODE_FLAG,OMB_PHONE_TOKEN:token3,OMB_HARNESS_URL:`http://127.0.0.1:${PORT2}`};return process.env.OMB_ADB_PATH&&(env.OMB_ADB_PATH=
@@ -31324,13 +31342,13 @@ notes.push({path:`memory/${topic.name}`,text:text30})}return notes}function pack
31324
31342
  saveImage(Buffer.from(bytes4),mime).path);if(!avatarUrl)throw new Error("A picture in this package could not be stored");return avatarUrl}},defaultSelection:()=>selection3,maxBots:MAX_WORKSPACE_BOTS,presets:presetStore}}function defaultsPresetFor(body2,includeNotes){let skipped2=[],avatar=null;if(body2.presetAvatar!==void 0&&body2.presetAvatar!==null&&body2.presetAvatar!==""){let offered=picture(body2.presetAvatar);typeof offered=="string"?skipped2.push({part:`presets[${DEFAULTS_PRESET_KEY}].bot\
31325
31343
  .appearance.avatar`,reason:offered}):avatar=offered}let built=presetFromDefaults(cfg.newBotDefaults,{name:typeof body2.presetName=="string"?body2.presetName:void 0,description:typeof body2.presetDescription=="string"?body2.presetDescription:void 0,includeNotes,avatar});return{preset:built.value,skipped:[...skipped2,...built.skipped]}}function checkedMemberIds(value3){if(!Array.isArray(value3))return{ok:!1,error:"memberIds must be a list of bot IDs"};let invalidIndex=value3.findIndex(id12=>typeof id12!=
31326
31344
  "string"||!id12.trim()||!store4.bot(id12));if(invalidIndex!==-1)return{ok:!1,error:`unknown channel member: ${String(value3[invalidIndex])}`};let memberIds=[...new Set(value3)];return memberIds.length?memberIds.every(id12=>store4.bot(id12)?.hidden)?{ok:!1,error:"a channel needs at least one active bot \u2014 every member given is archived"}:{ok:!0,memberIds}:{ok:!1,error:"a channel needs at least one bot"}}var bootSelection={instanceId:"",model:""},testedAi=createTestedAi({engine:instanceId=>registry2.
31327
- get(instanceId),store:()=>store4,threadBusy,context:selectionContext,changed:()=>refreshUnsetModelSelections().then(()=>broadcast({kind:"config",...configStatus()})),saved:()=>[cfg.defaultModelSelection,cfg.newBotDefaults?.profile.modelSelection],hosted:()=>!!hostedModels,identity:instanceId=>configIdentity(providerConfigs()[instanceId]),file:join277(DATA_DIR,"providers","ai-checks.json"),forBot:selection3=>withNewBotEffort(selection3,cfg.newBots?.effort,registry2.get(selection3.instanceId)?.adapter.
31345
+ get(instanceId),store:()=>store4,threadBusy,context:selectionContext,changed:()=>refreshUnsetModelSelections().then(()=>broadcast({kind:"config",...configStatus()})),saved:()=>[cfg.defaultModelSelection,cfg.newBotDefaults?.profile.modelSelection],hosted:()=>!!hostedModels,identity:instanceId=>configIdentity(providerConfigs()[instanceId]),file:join278(DATA_DIR,"providers","ai-checks.json"),forBot:selection3=>withNewBotEffort(selection3,cfg.newBots?.effort,registry2.get(selection3.instanceId)?.adapter.
31328
31346
  capabilities.effortLevels)}),enginesRead=null,presetStore=createPresetStore(),store4=new Store(()=>bootSelection,selection3=>withNewBotEffort(selection3,cfg.newBots?.effort,registry2.get(selection3.instanceId)?.adapter.capabilities.effortLevels),instanceId=>registry2.cliTarget(instanceId)?.driverKind,()=>appLanguage()??Intl.DateTimeFormat().resolvedOptions().locale,()=>sharedMembership()?void 0:cfg.profile?.name),outsideLineage=createOutsideLineage({home:!!CLOUD_HOME,team:!!CLOUD_TEAM,solo:()=>cloudHome2?.
31329
31347
  solo()===!0,store:store4,confinedNow:threadId=>guestDrivenTurns.has(threadId),activeRun:activeRoutineRunForThread,writer:routineId2=>cloudRoutineAuthors?.writer(routineId2),starters:threadId=>cloudThreadStarters(threadId),guestOpened:cloudGuestOpened,ownerPerson:cloudOwnerPerson,node:id12=>coordinator.node(id12),active:()=>coordinator.active(),language:threadId=>threadLanguage(threadId)}),{outsideDrivenThread,cloudGuestDriven,cloudGuestDrivenHandoff,outsideWorkStaysHere,confinedWhy,guestEngineRefusal}=outsideLineage;
31330
31348
  function botApiThread(id12){let owner2=store4.botByThread(id12);return!!(owner2&&store4.taskByThread(owner2.id,id12)?.botApi)&&!isLimixOwnerThread(id12)}var{messagePage,messageWindow}=messagePages(store4),replyVoiceNotes=createReplyVoiceNotes({store:store4,config:()=>cfg,voiceReady,speak,save:saveAudio,remove:deleteAttachment,redact:redactSecretsInText,language:threadLanguage}),{cloudLendingTurn,cloudLendingRefusalNotice,cloudLendingRefusalForBot,cloudLendingRefusal,cloudThreadStarters,cloudBotOpened,
31331
31349
  cloudLendingView,cloudReportFromOthers,handsOnLending,handedInUnproven,cloudOwnTurnRefusal,roomTurnStarted,roomTurnEnded,roomRun}=createCloudLendingTurns({store:store4,cloudHome:CLOUD_HOME!==null,team:CLOUD_TEAM?.name??null,directRequest:threadId=>directRequestOwners.get(threadId),threadStarter:threadId=>threadStarters.get(threadId),ownerPerson:cloudProvenOwnerPerson,cardAnswerer:cloudCardAnswerer,activeRoutineRun:activeRoutineRunForThread,ownerStartedRun:runId=>ownerStartedRoutineRuns.has(runId),
31332
31350
  routineRunIsOwners:cloudRoutineRunIsOwners,routines:()=>routines,routineAuthors:cloudRoutineAuthors,lentPlatform:()=>sharedComputers.known(CLOUD_HOME_LENDER)[0]?.platform,memoryChangedBySomeoneElse:botId=>lendingMemory?.reconcile(botId,foreignTurnRunning(botId),{cached:!0}).changedBySomeoneElse===!0,lifts:()=>lendingLifts,handedSince:(threadId,since)=>handedInSince(coordinator.all(),threadId,since)}),teamAway=createTeamAwayHost({cloudHome:CLOUD_HOME,dataDir:DATA_DIR,here:person2=>[...sseClients].
31333
- some(client=>client.ask.person===person2),people:()=>teamOwners.people?.everyone()??[],language:personLanguages.forLine,audienceOf:teamHost.audienceOf,store:store4,unseen:person2=>teamMessages.inbox.unseen(person2),readUpTo:(key7,person2)=>personRooms.reads?.readUpTo(key7,person2),session:auth=>auth.kind==="session"?auth.session:null}),actingPeople=createActingPeople({store:store4,direct:threadId=>directRequestOwners.get(threadId),roomRun,handed:new HandedPeople(join277(DATA_DIR,HANDED_PEOPLE_FILE))}),
31351
+ some(client=>client.ask.person===person2),people:()=>teamOwners.people?.everyone()??[],language:personLanguages.forLine,audienceOf:teamHost.audienceOf,store:store4,unseen:person2=>teamMessages.inbox.unseen(person2),readUpTo:(key7,person2)=>personRooms.reads?.readUpTo(key7,person2),session:auth=>auth.kind==="session"?auth.session:null}),actingPeople=createActingPeople({store:store4,direct:threadId=>directRequestOwners.get(threadId),roomRun,handed:new HandedPeople(join278(DATA_DIR,HANDED_PEOPLE_FILE))}),
31334
31352
  lendingLifts=lendingMemory?createLendingLifts({store:store4,stopped:threadId=>directRequestOwners.get(threadId)?.stopped===!0,threadBusy,queued:hasQueuedSteeredMessages,continueRequest:startTurn,notify,language:threadId=>threadLanguage(threadId),device:()=>deviceWord(sharedComputers.known(CLOUD_HOME_LENDER)[0]?.platform),decide:row=>appendDecision(DATA_DIR,row),words:changedWords,ownersAnswer:card=>cloudProvenOwnerPerson(cloudCardAnswerer(card)),memory:{info:botId=>lendingMemory.reviewInfo(botId),
31335
31353
  accept:(botId,token3)=>lendingMemory.review(botId,foreignTurnRunning(botId),token3).ok}}):null,computerAsks=CLOUD_PERSONAL?createComputerAsksHost({store:store4,notify,lending:sharedComputers,principal:CLOUD_HOME_LENDER,threadBusy,queued:hasQueuedSteeredMessages,continueRequest:startTurn,refusal:turn=>sharedComputerPrincipal(turn)?null:cloudLendingRefusalForBot(turn)??"This conversation can't use your computer.",request:threadId=>directRequestOwners.get(threadId),active:turn=>internalCapabilityIsActive(
31336
31354
  turn)}):null,{stopThreadForPerson,stopOnTypedCommand,restartForPerson}=createPersonStop({store:store4,routines:()=>routines,handoffs:()=>handoffs,interruptDirectThread,stopping:(botId,threadId)=>idleThreads.stopping(botId,threadId),clearUnattended,stopGoal:threadId=>oneOnOneGoals.stop(threadId),markStopped:(threadId,by)=>personStops.stop(threadId,liveTurns.running(threadId),directTurnDispatchClaims.has(threadId),by),working:(botId,threadId)=>threadBusy(botId,threadId)||coordinator.activeDirect(threadId),
@@ -31355,7 +31373,7 @@ generation,origin:`http://127.0.0.1:${PORT2}`,personal:CLOUD_PERSONAL,place:CLOU
31355
31373
  awake:starterAwake,waitsOnOthers:threadId=>coordinator.outstandingFor(threadId).length>0,laneOwned:threadId=>burst.laneOwned(threadId),botName:botId=>store4.bot(botId)?.name,pausedLine:(language,limit2)=>serverLine(language,"server.botPaused",{limit:limit2}),refused:()=>broadcast({kind:"config",...configStatus()})});engineMemory.useCap(starterCaps.engine);var cloudPower=null,teamWelcome=createTeamWelcomeStore(DATA_DIR),{cloudHealth,cloudSigned}=createCloudSignedHost({cloudHome:CLOUD_HOME,sessions,
31356
31374
  power:()=>cloudPower,box:()=>botBox.report(),teamAdmin:teamAdminHost(),policyChanged:nudgeCloudTeamPolicy,invited:(email3,by)=>teamWelcome.invited(personKey({id:"",email:email3}),by),memberBrowserOff:()=>managedPolicy.remoteAccessRefusal()!==void 0,plan:cancelled=>routineHolds?.plan(cancelled),planTier:tier2=>cloudPlanTier.set(tier2),memberLeft:email3=>leaveTeam?leaveTeam(email3).then(result2=>(botApi.manager.revokeMintedBy(personKey({id:"",email:email3})),teamOwners.left(email3),teamMessages.inbox.
31357
31375
  forget(personKey({id:"",email:email3})),forgetSetupPresser(store4,personKey({id:"",email:email3})),devsReports.forget(personKey({id:"",email:email3})),result2)):Promise.reject(new Error("not a team")),health:{store:store4,bus,dataDir:DATA_DIR,eventsDir:EVENTS_DIR,version:serverVersion(),image:process.env.OMB_CLOUD_IMAGE,engines:()=>registry2.instances().map(instance=>({instanceId:instance.instanceId,driverKind:instance.driverKind,snapshot:registry2.knownSnapshot(instance.instanceId)})),connectors:()=>emailHost.
31358
- health(configured(cfg)?connectedServices(cfg):null),browser:()=>({available:browserReady(void 0),installing:!!browserEngineInstall,interrupted:browserRuntime.interruptedCount()}),firstHour:()=>firstHourHooks.health(),...engineMemory.enabled?{room:()=>engineMemory.dayPressure()}:{}}}),teamComputers=new TeamComputers(join277(DATA_DIR,"team-computers.json"),ENVIRONMENT_ID),followupsReady=!1,sendSequencer=new SendSequencer;await retryComputerEngineMove();mcpServersHost.boot();store4.needsSeed()&&await Promise.
31376
+ health(configured(cfg)?connectedServices(cfg):null),browser:()=>({available:browserReady(void 0),installing:!!browserEngineInstall,interrupted:browserRuntime.interruptedCount()}),firstHour:()=>firstHourHooks.health(),...engineMemory.enabled?{room:()=>engineMemory.dayPressure()}:{}}}),teamComputers=new TeamComputers(join278(DATA_DIR,"team-computers.json"),ENVIRONMENT_ID),followupsReady=!1,sendSequencer=new SendSequencer;await retryComputerEngineMove();mcpServersHost.boot();store4.needsSeed()&&await Promise.
31359
31377
  race([cloudCreditStarted,new Promise(resolve56=>setTimeout(resolve56,15e3).unref())]);store4.needsSeed()?(firstEngineRead(),await refreshUnsetModelSelections()):enginesRead=registry2.readAtStart(enginesByUse([cfg.defaultModelSelection,...store4.bots.map(bot=>bot.modelSelection)]),firstEngineRead).then(async({engines,changed:changed3})=>{await refreshUnsetModelSelections(engines),changed3&&broadcast({kind:"config",...configStatus()})}).catch(error66=>console.warn(`[engines] reading the engines at\
31360
31378
  start failed: ${error66 instanceof Error?error66.message:String(error66)}`)).finally(()=>{enginesRead=null});var startupCatalogs=registry2.instances().flatMap(instance=>instance.startupModelRefresh?[instance.startupModelRefresh]:[]);for(let pending3 of startupCatalogs)pending3.then(async()=>{try{await refreshUnsetModelSelections()}catch(error66){console.warn(`[engines] refreshing the new-bot default after model discovery failed: ${error66 instanceof Error?error66.message:String(error66)}`)}broadcast(
31361
31379
  {kind:"config",...configStatus()})},()=>{});var firstHourFresh=!!CLOUD_PERSONAL&&store4.needsSeed();testedAi.seed({defaultBot:!CLOUD_TEAM,...firstHourFresh?{intro:bot=>greetingMessage(bot,{name:cfg.profile?.name},cfg.language)}:{}});moveFreeze.hold(()=>{CLOUD_TEAM||ensureDefaultBot(store4,{dataDir:DATA_DIR})},()=>{});CLOUD_TEAM&&readTeamRolesWith(email3=>sessions.list().filter(session=>session.email?.toLowerCase()===email3&&session.teamRole).sort((a,b11)=>b11.createdAt-a.createdAt)[0]?.teamRole??
@@ -31591,16 +31609,16 @@ threshold:()=>skillReviewSteps(cfg),bot:botId=>store4.bot(botId)??void 0,engine:
31591
31609
  editable,enabled:skill.enabled,sha256:skill.sha256,...skill.editable?{body:readSkillFile(botId,skill.name)}:{}}))),currentSha:(botId,name6)=>listSkills(botId).find(skill=>skill.name===name6)?.sha256??skillsHost.sharedSha(botId,name6),apply:(botId,threadId,change2)=>{let bot=store4.bot(botId);if(!bot)return{ok:!1,error:"unknown bot"};let direct=appliesDirectly(botId,threadId);if(!direct)return{ok:!1,error:"this conversation cannot apply skill changes without review"};let askFirst=!skillAutoApplyEnabled(
31592
31610
  cfg);if(change2.action==="update"&&skillsHost.editable(botId,change2.name))return askFirst?{ok:!1,error:"a team-shared skill is not changed while learning asks first"}:skillsHost.applyReviewUpdate(bot,threadId,change2,direct);let staged=stageSkillWrite(botId,{action:change2.action,targetName:change2.action==="update"?change2.name:void 0,files:[{path:"SKILL.md",content:change2.skillMd}],gist:change2.gist||void 0,source:learnSource("automatic review of this conversation")});if("error"in staged)return{
31593
31611
  ok:!1,error:staged.error};if(askFirst)try{let card=appendSkillRequestCard({botId,threadId,staged});return appendDecision(DATA_DIR,{threadId,requestId:card.requestId,botId,botName:bot.name,tool:"stage_skill",summary:card.summary,decision:"card-shown",source:"skill"}),{ok:!0}}catch(error66){return rejectStagedSkillWrite(botId,staged.id),{ok:!1,error:error66 instanceof Error?error66.message:String(error66)}}let applied=applyOwnStagedSkill(bot,threadId,staged,direct);return"error"in applied?{ok:!1,error:applied.
31594
- error}:{ok:!0}},statePath:join277(DATA_DIR,"skill-review.json"),log:line6=>console.log(line6)});bus.subscribe(event2=>{if(!shouldIgnoreProviderEvent(event2)&&!(event2.type!=="turn.completed"||!event2.turnId))try{let messages=store4.activePath(event2.threadId),reply4=messages.findLast(message8=>message8.role==="bot"&&message8.kind==="text"&&message8.turnId===event2.turnId),room=store4.groupByThread(event2.threadId),bot=room?reply4?.from?store4.bot(reply4.from.botId):void 0:store4.botByThread(event2.
31612
+ error}:{ok:!0}},statePath:join278(DATA_DIR,"skill-review.json"),log:line6=>console.log(line6)});bus.subscribe(event2=>{if(!shouldIgnoreProviderEvent(event2)&&!(event2.type!=="turn.completed"||!event2.turnId))try{let messages=store4.activePath(event2.threadId),reply4=messages.findLast(message8=>message8.role==="bot"&&message8.kind==="text"&&message8.turnId===event2.turnId),room=store4.groupByThread(event2.threadId),bot=room?reply4?.from?store4.bot(reply4.from.botId):void 0:store4.botByThread(event2.
31595
31613
  threadId);if(!bot)return;event2.ok&&reply4?.text?.trim()&&!isInternalTurn(event2.threadId)&&!isUnattended(bot.id,event2.threadId)&&!routines?.runForThread(event2.threadId)&&!(CLOUD_HOME&&!cloudOwnerOnlyThread(event2.threadId))&&skillReview.noteTurn(bot.id,event2.threadId,turnToolSteps(messages,event2.turnId,bot.id,!!room)),skillReview.botSettled(bot.id)}catch(error66){console.warn(`skill review: could not count a turn: ${error66.message}`)}});bus.subscribe(event2=>{if(!shouldIgnoreProviderEvent(
31596
31614
  event2)&&!(event2.type!=="turn.completed"||!event2.turnId))try{let messages=store4.messagesFor(event2.threadId),reply4=messages.findLast(message8=>message8.role==="bot"&&message8.kind==="text"&&message8.turnId===event2.turnId),bot=store4.botByThread(event2.threadId)??(reply4?.from?store4.bot(reply4.from.botId):void 0);if(!bot||bot.memoryEnabled===!1)return;let tools2=messages.filter(message8=>message8.kind==="activity"&&message8.turnId===event2.turnId&&message8.tool?.name).map(message8=>message8.
31597
31615
  tool.name),line6=turnOutcomeLine({ok:event2.ok,reply:reply4?.text,stopReason:turnStops.failureCause(event2),tools:tools2});if(!line6)return;let room=store4.groupByThread(event2.threadId);if(room&&!roomFeedsBot(room,bot)||cloudGuestDriven(event2.threadId)||CLOUD_PERSONAL&&(room||!cloudOwnerOnlyThread(event2.threadId)))return;let now2=new Date,layer=teamHost.layer(bot.id,event2.threadId),writeLine=()=>journalTurnWrite(layer,memoryLogPath(now2),event2.threadId,()=>appendMemoryLog(layer,line6,{now:now2,
31598
31616
  source:memorySourceLabel({room,task:store4.taskByThread(bot.id,event2.threadId),threadId:event2.threadId})}));lendingMemory?lendingMemory.trustedWrite(bot.id,writeLine):writeLine()}catch{}});var turnStartedAt=new Map,turnCheckpoints=new Map,liveTurnByThread=new Map;function forgetTurnCheckpoint(threadId){let checkpoint=turnCheckpoints.get(threadId);checkpoint&&(turnCheckpoints.delete(threadId),release(checkpoint.botId,checkpoint.cwd,checkpoint.pin))}function clearTurnDigestState(threadId){turnStartedAt.
31599
- delete(threadId),forgetTurnCheckpoint(threadId),liveTurnByThread.delete(threadId),memoryRowsByThread.delete(threadId)}var TOOL_RESULTS_DIR=join277(DATA_DIR,"tool-results"),TOOL_RESULT_SPILL_MAX=512*1024,DIGESTS_AFTER_COMPACTION=2;function ingestEngineHook(capability2,body2){let event2=body2&&typeof body2=="object"?body2:{},name6=typeof event2.event=="string"?event2.event:"",payload=event2.payload&&typeof event2.payload=="object"?event2.payload:{},threadId=capability2.threadId,chip=text31=>store4.
31617
+ delete(threadId),forgetTurnCheckpoint(threadId),liveTurnByThread.delete(threadId),memoryRowsByThread.delete(threadId)}var TOOL_RESULTS_DIR=join278(DATA_DIR,"tool-results"),TOOL_RESULT_SPILL_MAX=512*1024,DIGESTS_AFTER_COMPACTION=2;function ingestEngineHook(capability2,body2){let event2=body2&&typeof body2=="object"?body2:{},name6=typeof event2.event=="string"?event2.event:"",payload=event2.payload&&typeof event2.payload=="object"?event2.payload:{},threadId=capability2.threadId,chip=text31=>store4.
31600
31618
  appendMessage(threadId,{role:"bot",kind:"activity",tool:{name:text31,ok:!0}});if((name6==="PreCompact"||name6==="SessionStart"&&payload.source==="compact")&&roomSessions.distrust(threadId,capability2.botId),name6==="PreCompact"){let trigger=payload.trigger==="manual"?"manual":"auto";return chip(`context compaction started (${trigger})`),{ok:!0}}if(name6==="SessionStart"){if(payload.source!=="compact")return{ok:!0,ignored:`SessionStart ${String(payload.source??"")}`};let bot=store4.bot(capability2.
31601
31619
  botId),digests4=sinceFreshStart(store4.activePath(threadId)).filter(m3=>m3.kind==="digest"&&m3.digest).slice(-DIGESTS_AFTER_COMPACTION);return chip(`context compacted \u2014 re-sent the last ${digests4.length} digest${digests4.length===1?"":"s"}`),digests4.length?{ok:!0,context:digests4.map(m3=>digestPromptLine(m3.digest,m3.from?.name??store4.bot(m3.digest.botId)?.name??bot?.name??"the bot")).join(`
31602
31620
  `)}:{ok:!0}}if(name6==="Stop")return{ok:!0};if(name6==="PostToolUseFailure")return shellTimeoutHookResult(payload);if(name6!=="PostToolUse")return{ok:!0,ignored:name6||"unknown"};let toolUseId=typeof payload.tool_use_id=="string"?payload.tool_use_id:"";if(!toolUseId)return{ok:!0,ignored:"PostToolUse without tool_use_id"};if(!Object.hasOwn(payload,"tool_response"))return{ok:!0,ignored:"hook did not include a tool response"};let response=payload.tool_response,text30=typeof response=="string"?response:
31603
- JSON.stringify(response??null,null,2),turnId=liveTurnByThread.get(threadId),row=store4.activePath(threadId).findLast(m3=>m3.kind==="activity"&&m3.turnId===turnId&&m3.tool?.itemId===toolUseId);if(!turnId||!row?.tool)return{ok:!0,ignored:"tool not observed in this turn"};let key7=`${threadId}:${turnId}:${toolUseId}`;if(!commandReceipt("hook.ingest",key7)){let dir=join277(TOOL_RESULTS_DIR,threadId.replace(/[^\w.-]/g,"_")),redacted=redactSecretsInText(text30),fullResult=spillToolResult(dir,key7,redacted,
31621
+ JSON.stringify(response??null,null,2),turnId=liveTurnByThread.get(threadId),row=store4.activePath(threadId).findLast(m3=>m3.kind==="activity"&&m3.turnId===turnId&&m3.tool?.itemId===toolUseId);if(!turnId||!row?.tool)return{ok:!0,ignored:"tool not observed in this turn"};let key7=`${threadId}:${turnId}:${toolUseId}`;if(!commandReceipt("hook.ingest",key7)){let dir=join278(TOOL_RESULTS_DIR,threadId.replace(/[^\w.-]/g,"_")),redacted=redactSecretsInText(text30),fullResult=spillToolResult(dir,key7,redacted,
31604
31622
  TOOL_RESULT_SPILL_MAX);store4.patchMessage(threadId,row.id,{tool:{...row.tool,fullResult}},{kind:"hook.ingest",key:key7})}return{ok:!0}}async function scheduleTurnDigest(input2){let at8=Date.now(),startedAt=turnStartedAt.get(input2.threadId);turnStartedAt.delete(input2.threadId);let checkpoint=turnCheckpoints.get(input2.threadId);turnCheckpoints.delete(input2.threadId);let memory2=memoryRowsByThread.get(input2.threadId)??[];memoryRowsByThread.delete(input2.threadId);try{if(!input2.isCurrent())return;
31605
31623
  let activities=store4.activePath(input2.threadId),digest5=buildTurnDigest({turnId:input2.turnId,botId:input2.botId,threadId:input2.threadId,at:at8,durationMs:startedAt?Math.max(0,at8-startedAt):0,activities,memory:memory2,reply:input2.reply,...input2.usage?{usage:input2.usage}:{},hookCoverage:coverageForDriver(input2.driverKind,toolEvidence(activities,input2.turnId),activities.some(m3=>m3.kind==="activity"&&m3.turnId===input2.turnId&&m3.tool?.itemId))}),message8=store4.appendMessage(input2.threadId,
31606
31624
  {role:"bot",kind:"digest",text:renderDigest(digest5),digest:digest5,turnId:input2.turnId,requestMessageId:activities.find(message9=>message9.turnId===input2.turnId&&message9.requestMessageId)?.requestMessageId,turnSucceeded:input2.succeeded,...input2.from?{from:input2.from}:{}},{kind:"digest.append",key:`${input2.threadId}:${input2.turnId}`});if(input2.instanceId&&!input2.from){let handed=store4.taskByThread(input2.botId,input2.threadId)?.handedMessages?.[input2.instanceId];handed&&store4.setHandedMessages(
@@ -31815,7 +31833,7 @@ if(!readiness.ready)throw new Error(readiness.reason??"The cloud computer is not
31815
31833
  bot,threadId,activeMessages),contextOrder=context3.map(m3=>m3.id),replayable=context3.filter(m3=>!skipTranscript.has(m3.id)),record31=latestCompaction(activeMessages),selection3=selectReplay(context3,{budgetBytes:cfg.context?.rebuildBytes??DEFAULT_REBUILD_BYTES,excludedIds:skipTranscript,compaction:record31,tools:replayToolCalls(activeMessages,cfg.context)}),transcript=selection3.transcript.map(({role,text:text31})=>({role,text:text31})),contextReset=selection3.compacted>0&&record31?.id!==task2.
31816
31834
  appliedCompactionId;contextReset&&store4.patchTask(bot.id,threadId,{resumeCursors:{}});let followed=folderToFollow(bot,threadId,task2.cwd,{worksInFolders:supportsWorkspaceFiles(instance.driverKind),keepsPrivateFolder:guestConfined||cloudGuestOpened(threadId)});followed&&store4.patchTask(bot.id,threadId,{cwd:followed,resumeCursors:{}});let rewound=!!task2.rewound,externalContextMarker=isExternalContextMarker(task2.lastInstanceId)?task2.lastInstanceId:void 0,fresh=!rewound&&!externalContextMarker&&
31817
31835
  engineIsFresh({instanceId,lastInstanceId:task2.lastInstanceId,resumeCursors:task2.resumeCursors,transcript:replayable}),strictResume=instance.adapter.capabilities.strictResume===!0,cursor3=task2.resumeCursors[instanceId],handed=strictResume&&!rewound&&!contextReset&&!fresh&&!externalContextMarker&&cursor3!==void 0?task2.handedMessages?.[instanceId]:void 0,unseen=handed&&handedStateUsable(handed,cursor3,contextOrder)?unseenMessages(replayable,contextOrder,handed):void 0,externalUpdate=!!(opts?.coordination?.
31818
- resumed||unseen?.some(m3=>m3.keep)),persistentConfig=[bot.name,bot.title,bot.description,sectionContextSystemPrompt(bot.section),...cfg.everyBotRules?.trim()?[cfg.everyBotRules.trim()]:[],...instance.driverKind==="codex"?[model4,effort??null]:[]],sessionConfig=soul=>createHash128("sha256").update(JSON.stringify([...persistentConfig,soul])).digest("hex").slice(0,16),plannedConfig=sessionConfig(bot.soul),skillAuthoring=skillAuthoringEnabled(cfg)&&agentsMounted,skillCommandText=supportsWorkspaceFiles(
31836
+ resumed||unseen?.some(m3=>m3.keep)),persistentConfig=[bot.name,bot.title,bot.description,sectionContextSystemPrompt(bot.section),...cfg.everyBotRules?.trim()?[cfg.everyBotRules.trim()]:[],...instance.driverKind==="codex"?[model4,effort??null]:[]],sessionConfig=soul=>createHash129("sha256").update(JSON.stringify([...persistentConfig,soul])).digest("hex").slice(0,16),plannedConfig=sessionConfig(bot.soul),skillAuthoring=skillAuthoringEnabled(cfg)&&agentsMounted,skillCommandText=supportsWorkspaceFiles(
31819
31837
  instance.driverKind)?skillsHost.expandSkillCommand(bot,threadId,providerText,instance,personLine?activeMessages.filter(line6=>skipTranscript.has(line6.id)):[],personLine&&!userMessage.relayed&&!startedOutside(threadId)||["schedule","manual","startup"].includes(opts?.automationSource??"")):providerText,setupText=agentsMounted?expandBurstTurnText(expandSetupTurnText(skillCommandText)):skillCommandText,userTurnText=(opts?.app?.context??"")+(opts?.cardContinuation?"":routineRunNote(threadId,opts?.automationSource))+
31820
31838
  labelledLine(personLine&&!opts?.excludeMessageIds?userMessage:{},withReactionNotes(promptWithReply(skillAuthoring?expandLearnTurnText(setupText):setupText,opts?.replyTo,userNameFor(threadId)),personLine?activeMessages:[],skipTranscript,userNameFor(threadId)),lineLabels(threadId)),replay=usesNativeImageInput?extractReplayImages(selection3.inline,turnImages):{transcript:selection3.inline,images:[]},decideContext=config3=>{let effortHeld=!effort&&typeof handed?.effort=="string",handedStale=!!(handed&&
31821
31839
  (!unseen||effortHeld||externalUpdate&&handed.config!==config3)),{block:unseenBlock,placed}=unseen&&!handedStale?renderUnseen(unseen):{block:"",placed:[]},{turnText:contextTurnText,resume}=buildTurnContext({text:userTurnText,transcript:replay.transcript,rewound,fresh:fresh||contextReset,externallyUpdated:!!externalContextMarker||handedStale,replaysNatively:replaysNatively(instance.driverKind)}),resumeCursor=resume?task2.resumeCursors[instanceId]:void 0,recoveryIsReplay=resumeCursor!==void 0&&externalUpdate&&
@@ -31908,11 +31926,11 @@ bot.name,color:source4.bot.color}),store4.appendMessage(sourceThreadId,message8)
31908
31926
  patchTask(run11.botId,run11.threadId,{unread:!1})}return statusChanged&&["waiting","completed","failed","missed"].includes(run11.status)&&(source4.group?store4.patchGroup(source4.group.id,{unread:!0}):store4.patchTask(source4.bot.id,sourceThreadId,{unread:!0})),sourceThreadId}async function interruptRoutineGroupGoal(groupId,threadId,outcome){if(!groupId){oneOnOneGoals.stop(threadId,outcome);let owner2=store4.botByThread(threadId);owner2&&await interruptDirectThread(owner2.id,threadId);return}let speaker2=groupSpeakers.
31909
31927
  get(threadId),bot=speaker2?store4.bot(speaker2.botId):void 0;cancelGroupTurnOperations(groupId,threadId,outcome),revokeInternalCapabilitiesForThread(threadId),await(bot?runningTurnInstance(bot,threadId):null)?.adapter.interruptTurn(threadId).catch(()=>{}),closeOpenApprovals(threadId)}async function stopBotForEmergencyApprovalDowngrade(botId){let bot=store4.bot(botId);if(!bot)return;for(let task2 of store4.tasks(botId))(task2.approvalMode==="full"||task2.approvalMode==="custom")&&store4.patchTask(
31910
31928
  botId,task2.threadId,{approvalMode:"ask",autoApprove:!1,alwaysAllow:[]});let directStop=interruptAllDirectThreads(botId),routineRun=routines?.activeBotRunForBot(bot.id);if(routineRun){routineRun.threadId&&revokeInternalCapabilitiesForThread(routineRun.threadId),cancelDirectTurnDispatch(bot.id,routineRun.threadId),await routines.cancelRun(routineRun.id),routineRun.threadId&&closeOpenApprovals(routineRun.threadId),await directStop;return}let groupTurn=activeGroupTurnForBot(bot.id);if(groupTurn){revokeInternalCapabilitiesForThread(
31911
- groupTurn.threadId),cancelGroupTurnOperations(groupTurn.group.id,groupTurn.threadId);let results=await Promise.allSettled([directStop,runningTurnInstance(bot,groupTurn.threadId)?.adapter.interruptTurn(groupTurn.threadId)]);closeOpenApprovals(groupTurn.threadId);let failure11=results.find(result2=>result2.status==="rejected");if(failure11)throw failure11.reason;return}await directStop}var engineName=engine=>engineLabel(engine,registry2.get(engine)??void 0),limitClock=new LimitResetClock({file:join277(
31912
- DATA_DIR,"limit-holds.json"),accounts:()=>planAccountsFromInstances(instanceConfigs(cfg)),onChange:()=>routines?.retimeLimitResets(),waiting:()=>!!routines?.listRoutines().some(routine=>routine.enabled&&routine.schedule.type==="limit_reset")}),limitTakeover=createLimitTakeover({file:join277(DATA_DIR,"limit-notices.json"),holdsFile:join277(DATA_DIR,"limit-takeover-holds.json"),configs:()=>instanceConfigs(cfg),context:selectionContext,blockedUntil:engine=>limitClock.blockedUntil(engine),resetAt:engine=>limitClock.
31929
+ groupTurn.threadId),cancelGroupTurnOperations(groupTurn.group.id,groupTurn.threadId);let results=await Promise.allSettled([directStop,runningTurnInstance(bot,groupTurn.threadId)?.adapter.interruptTurn(groupTurn.threadId)]);closeOpenApprovals(groupTurn.threadId);let failure11=results.find(result2=>result2.status==="rejected");if(failure11)throw failure11.reason;return}await directStop}var engineName=engine=>engineLabel(engine,registry2.get(engine)??void 0),limitClock=new LimitResetClock({file:join278(
31930
+ DATA_DIR,"limit-holds.json"),accounts:()=>planAccountsFromInstances(instanceConfigs(cfg)),onChange:()=>routines?.retimeLimitResets(),waiting:()=>!!routines?.listRoutines().some(routine=>routine.enabled&&routine.schedule.type==="limit_reset")}),limitTakeover=createLimitTakeover({file:join278(DATA_DIR,"limit-notices.json"),holdsFile:join278(DATA_DIR,"limit-takeover-holds.json"),configs:()=>instanceConfigs(cfg),context:selectionContext,blockedUntil:engine=>limitClock.blockedUntil(engine),resetAt:engine=>limitClock.
31913
31931
  resetAt(engine),enabled:()=>quotaSwitchEnabled(),where:CLOUD_HOME?"on the Cloud":"on this computer",signedOutNow:id12=>registry2.knownSnapshot(id12)?.authenticated===!1,signedOutNoticed:()=>registry2.forgetSnapshots(),botsOn:id12=>store4.bots.filter(bot=>!bot.hidden&&bot.modelSelection.instanceId===id12),engineName,engines:()=>selectableInstances(registry2.instances().map(engine=>({instanceId:engine.instanceId,driverKind:engine.driverKind,displayName:engine.displayName,enabled:engine.enabled,access:registry2.
31914
31932
  access(engine.instanceId),models:engine.models,snapshot:registry2.knownSnapshot(engine.instanceId)??{state:"unavailable",reason:"not read yet"},capabilities:engine.adapter.capabilities}))),chosen:botId=>[...store4.bot(botId)?.fallback??[],...cfg.automaticRecovery?.backup?[cfg.automaticRecovery.backup]:[]],signedOutChosen:botId=>{let bot=store4.bot(botId);return bot?startupBackups(bot,cfg.automaticRecovery):[]},tell:(about,text30)=>notify(buildNoticeNotification(about,store4.bot(about.id)?.threadId??
31915
- "",text30)),record:failover=>limitFailovers.record(failover)});registry2.onSignedIn(instanceId=>limitTakeover.signedIn(instanceId));var limitFailovers=new LimitFailovers({file:join277(DATA_DIR,"limit-failovers.json"),blockedUntil:engine=>limitClock.blockedUntil(engine),signedOut:engine=>limitTakeover.stillSignedOut(engine),engineName,threadModel:(botId,threadId)=>store4.projectBotForTask(botId,threadId)?.modelSelection??null,note:(threadId,line6,text30)=>store4.appendMessage(threadId,{role:"bot",
31933
+ "",text30)),record:failover=>limitFailovers.record(failover)});registry2.onSignedIn(instanceId=>limitTakeover.signedIn(instanceId));var limitFailovers=new LimitFailovers({file:join278(DATA_DIR,"limit-failovers.json"),blockedUntil:engine=>limitClock.blockedUntil(engine),signedOut:engine=>limitTakeover.stillSignedOut(engine),engineName,threadModel:(botId,threadId)=>store4.projectBotForTask(botId,threadId)?.modelSelection??null,note:(threadId,line6,text30)=>store4.appendMessage(threadId,{role:"bot",
31916
31934
  kind:"activity",tool:{name:`recovery: ${line6}`,ok:!0,...text30?{nameCode:text30.key,nameParams:text30.params}:{}}}),switchBack:({botId,threadId,from,to:to2})=>{let current3=store4.projectBotForTask(botId,threadId),checked=current3?checkedTaskModelSwitch(current3,from,!1,!1,!0):null;return!!(checked?.ok&&store4.switchTaskModel(botId,threadId,checked.selection,!1,!1,{...hostedModels?.resetTask(to2,checked.selection),rewound:!0}))}}),automationDestinations=createAutomationDestinations({store:store4,
31917
31935
  mainThread:botMainThread,runs:()=>routines?.listRuns()??[],cloud:CLOUD_HOME?{owner:CLOUD_OWNER_KEY,opener:(id12,routine)=>routine&&teamRoutines.opener(routine)||routineOpener(id12),reportFromOthers:cloudReportFromOthers,opened:(threadId,person2)=>threadStarters.set(threadId,person2),outside:threadId=>outsideLineage.mark(threadId)}:null}),routineModelChecks={check:raw=>checkedModelSelection(raw),bot:botId=>store4.bot(botId),engineSwitchNeedsAsk};routines=new RoutineManager({emit:broadcast,limitResetAt:engine=>limitClock.
31918
31936
  resetAt(engine),checks:proactive.checks,limitBackup:(botId,scope)=>{let bot=store4.bot(botId);return quotaSwitchEnabled()?!!(bot&&limitTakeover.backups(botId,bot.modelSelection,scope,approvalModeFor(bot)).length):!!(bot&&startupBackups(bot,cfg.automaticRecovery).length)},launchId:DESKTOP_MANAGED&&/^[\w-]{1,100}$/.test(process.env.OMB_DESKTOP_LAUNCH_ID??"")?process.env.OMB_DESKTOP_LAUNCH_ID:void 0,skipStartupRuns:startedFromSleep=!!CLOUD_HOME&&wokeFromSleep(DATA_DIR),hasPendingDelegations:runtimeWorkPending,
@@ -31925,7 +31943,7 @@ if(!groupId){oneOnOneGoals.start(coordinatorBotId,threadId,prompt,{runId});retur
31925
31943
  threadId)}finally{closeOpenApprovals(threadId)}},interruptGoal:interruptRoutineGroupGoal,onRunChanged:run11=>{cloudHealth?.noteRoutineRun(run11),syncRoutineRunToSource(run11)},onRunCut:run11=>run11.groupId?coordinator.cancelRoom(run11.groupId,run11.threadId,ROUTINE_RESTARTED):coordinator.cancelDirect(run11.threadId,ROUTINE_RESTARTED),onRunFailed:(run11,alert)=>{cloudHealth?.noteRoutineRun(run11);let bot=store4.bot(run11.botId);if(!bot||alert===null||run11.deliver==="brief")return;let said2=alert?.
31926
31944
  detail??run11.error,detail=said2?`${run11.routineName}: ${said2}`:run11.routineName;automationReports.runFailed(run11,said2??"");let notificationBot=routineSourceOwner(run11)?.bot??bot;notify(buildNotification("routine-failed",notificationBot,routineSourceThread(run11)??run11.threadId??bot.threadId,detail)),reportIncident({kind:"routine-failed",bot,threadId:run11.threadId??bot.threadId,detail})},onRunDeferred:(run11,alert)=>{let bot=store4.bot(run11.botId);if(!bot)return;let minutes3=run11.deferredAt!=
31927
31945
  null&&run11.deferredNoticeAt!=null?Math.max(1,Math.round((run11.deferredNoticeAt-run11.deferredAt)/6e4)):null,detail=`${redactSecretsInText(run11.routineName)}: ${alert?.detail??`target busy${minutes3!=null?` for ${minutes3} minutes`:""}`}`;notify(buildNotification("routine-deferred",routineSourceOwner(run11)?.bot??bot,routineSourceThread(run11)??bot.threadId,detail))}});phones2.adoptRoutines();routineHolds?.attach(routines);outsideLineage.settle(routines.listRuns(),automationDestinations.eventChat);
31928
- CLOUD_HOME&&CLOUD_OWNER_KEY&&cloudRoutineAuthors&&(cloudHome2=settleCloudHome({file:join277(DATA_DIR,"cloud-owner.json"),machineId:CLOUD_HOME.machineId,ownerKey:CLOUD_OWNER_KEY,nobodyKey:CLOUD_NOBODY_KEY,sessions,personKey,starters:threadStarters,authors:cloudRoutineAuthors,routines:()=>routines,store:store4,linePersonKey,asSchedule,...restoredAtStart?{restoredNow:restoredAtStart}:{},...workspaceRestore.restored&&workspaceRestore.id?{lastRestore:workspaceRestore.id}:{},settled:ownership=>{cloudEarlierOwners=
31946
+ CLOUD_HOME&&CLOUD_OWNER_KEY&&cloudRoutineAuthors&&(cloudHome2=settleCloudHome({file:join278(DATA_DIR,"cloud-owner.json"),machineId:CLOUD_HOME.machineId,ownerKey:CLOUD_OWNER_KEY,nobodyKey:CLOUD_NOBODY_KEY,sessions,personKey,starters:threadStarters,authors:cloudRoutineAuthors,routines:()=>routines,store:store4,linePersonKey,asSchedule,...restoredAtStart?{restoredNow:restoredAtStart}:{},...workspaceRestore.restored&&workspaceRestore.id?{lastRestore:workspaceRestore.id}:{},settled:ownership=>{cloudEarlierOwners=
31929
31947
  ownership},provenPerson:cloudProvenOwnerPerson,threadStarters:cloudThreadStarters,cardAnswerer:cloudCardAnswerer,ownersOrNone:key7=>[CLOUD_OWNER_KEY,CLOUD_NOBODY_KEY,CLOUD_OUTSIDE_KEY].includes(key7)||cloudOwnerDevice(key7),reportFromOthers:cloudReportFromOthers,ownersRoutine:cloudOwnersRoutine,log:line6=>console.log(line6)}),sessions.onSessionIssued(session=>{session.scopes.includes("admin")||cloudHome2?.share()}),ownerOnlyCache.clear());routines.clearFrozenResultsThreads();proactive.ensureWatch();
31930
31948
  startFirstHour({hooks:firstHourHooks,fresh:firstHourFresh,store:store4,bus,cfg,dataDir:DATA_DIR,proactive,briefOn:()=>proactive.briefOn(),ensureBrief:()=>{proactive.ensureWatch()},composio:composio_exports,sessions,phones:()=>phones2.paired(),routines:()=>routines,mainThread:botMainThread,threadBusy,startTurn,notify,wrote:markTaskContextExternallyUpdated,stale:shouldIgnoreProviderEvent,welcomeDone:()=>{adminActorScope.exit(()=>saveConfig(welcomeDonePatch(cfg.onboarding))),Object.assign(cfg,loadConfig()),
31931
31949
  broadcast({kind:"config",...configStatus()})}});orgLibrary=new OrgLibrary({dataDir:DATA_DIR,store:store4,routines,skills:{list:listSkills,stamps:skillPackageStamps,setEnabled:setSkillEnabled,installOrg:installOrgSkill,read:readSkillFile,remove:removeSkill},presets:presetStore,sections:{read:section4=>readSectionContext(section4)?.text??"",write:(section4,text30)=>{writeSectionContext(section4,text30)}},postState:message8=>utilityParentPort?.postMessage(message8)});{let early=pendingOrgLibraryRelay;
@@ -31942,7 +31960,7 @@ revokeInternalCapabilitiesForThread,interruptAllDirectThreads,interruptTurn:(bot
31942
31960
  activeRunForBot(bot.id))return deletionResponse(409,{error:"stop this bot's active routine before deleting the bot"});let activeGroup=activeGroupTurnForBot(bot.id);if(activeGroup)return deletionResponse(409,{error:`stop this bot's work in channel ${activeGroup.group.name} before deleting the bot`});if((boatConfigured(cfg)||vpsSshAliasForBot(cfg,bot))&&(bot.busy||hasDirectDispatch(bot.id)))return deletionResponse(409,{error:"stop this bot's work before checking and deleting its cloud computer"});
31943
31961
  let botBoatRecovery=boatCreateRecoverySnapshot().filter(entry2=>entry2.botId===bot.id),botBoatDeletions=boatDeletionSnapshot().filter(entry2=>entry2.ownerBotId===bot.id);if(botBoatRecovery.some(entry2=>!entry2.resolved))return deletionResponse(409,{error:"finish reconciling this bot's pending cloud computer creation before deleting it \u2014 check boat.dev, then retry Boat setup"});let releaseComputerLifecycle=claimBotComputerLifecycle(bot.id),releasePhoneSecretMutation=claimPhoneSecretBotDeletion(
31944
31962
  bot.id);if(!releasePhoneSecretMutation)return releaseComputerLifecycle(),deletionResponse(409,{error:"this bot or one of its channels is securely saving a credential"});let claimedLocalVmTarget=null;try{let localVmCleanup=null;if(localVmMode(cfg)==="per-bot"){let target4=perBotLocalVmTarget(bot.id);if(localVmActiveThreads.has(target4.key)||localVmLifecycleBusy.has(target4.key))return deletionResponse(409,{error:"stop this bot's Local VM turn or setup action before deleting the bot"});if(localVmLeaseFor(
31945
- target4).current(localVmOwnerBusy))return deletionResponse(409,{error:"stop this bot's Local VM turn before deleting the bot"});localVmLifecycleBusy.add(target4.key),claimedLocalVmTarget=target4;let vm=await containerComputerStatus(void 0,void 0,target4);if(!vm.daemonUp&&existsSync98(target4.workspaceDir))return deletionResponse(409,{error:"start the container runtime so Limix Bot can remove this bot's Local VM while deleting it"});if(vm.container!=="missing"&&!vm.managed)return deletionResponse(
31963
+ target4).current(localVmOwnerBusy))return deletionResponse(409,{error:"stop this bot's Local VM turn before deleting the bot"});localVmLifecycleBusy.add(target4.key),claimedLocalVmTarget=target4;let vm=await containerComputerStatus(void 0,void 0,target4);if(!vm.daemonUp&&existsSync99(target4.workspaceDir))return deletionResponse(409,{error:"start the container runtime so Limix Bot can remove this bot's Local VM while deleting it"});if(vm.container!=="missing"&&!vm.managed)return deletionResponse(
31946
31964
  409,{error:`The container named ${vm.container_name} was not created by Limix Bot. Remove it manually before deleting this bot`});localVmCleanup={target:target4,removeContainer:vm.container!=="missing"}}let vpsInventory=await listManagedVpsComputers(vpsConfigForBot(cfg,bot),managedBoatOwners()),vpsLeftOn=vpsInventory.configured&&!vpsInventory.available?vpsSshAliasForBot(cfg,bot):null,ownedVpsComputers=vpsInventory.instances.filter(instance=>instance.ownerBotId===bot.id);if((botBoatRecovery.length>
31947
31965
  0||botBoatDeletions.length>0)&&!boatConfigured(cfg))return deletionResponse(409,{error:"Reconnect the Boat account that owns this bot's remembered cloud computer, then retry deletion"});let cloudInventory=await listManagedBoats(cfg,managedBoatOwners());if(cloudInventory.configured&&!cloudInventory.available)return deletionResponse(503,{error:`${cloudInventory.problem??"cloud computer inventory is unavailable"}. The bot was kept so its computer can be retried safely`});let ownedBoatComputers=cloudInventory.
31948
31966
  instances.filter(instance=>instance.ownerBotId===bot.id);revalidate();let browserCleanupRequest=browserCleanup.prepare("bot",bot.id);try{for(let instance of ownedBoatComputers)if((await deleteManagedBoat(cfg,managedBoatOwners(),instance.boxId,instance.name)).pending)throw Object.assign(new Error("The cloud computer deletion has started but is still finishing. The bot was kept; retry in a moment"),{status:409});for(let instance of ownedVpsComputers)await removeManagedVpsComputer(vpsConfigForBot(cfg,
@@ -31955,7 +31973,7 @@ bot(proposerBotId),target4=store4.bot(targetBotId);return target4?!proposer||!ch
31955
31973
  id===selection3.model&&(option2.orgBlocked||option2.needsCliUpdate));if(unusable2)return unusable2.orgBlocked?"This account's organization turned that model off. Propose another one.":`That model needs version ${unusable2.needsCliUpdate} of its engine's CLI. Update it, or propose another model.`;if(current3?.approvalGrant)return"Wait for the approval-level confirmation before changing this bot's model";if(current3){let mode=approvalModeFor(current3);if(!supportsApprovalMode2(selection3,mode)||engineSwitchNeedsAsk(
31956
31974
  mode,current3.modelSelection,selection3))return`@${current3.name}'s existing permissions are incompatible with that provider. Change its permissions in bot settings, then propose the model change again.`}return null},ownThreads=createOwnThreads({store:store4,registry:registry2,node:id12=>coordinator.node(id12),current:turnSelection,proposalRefusal:validateModelProposal,givesWay:modelGivesWay,modelName}),burst=createBurstHost({dataDir:DATA_DIR,cloudHome:!!CLOUD_HOME,tier:()=>cloudPlanTier.tier(),
31957
31975
  maxParallel:()=>cfg.burst?.maxParallel,hasRoom:()=>engineMemory.laneHasRoom(),store:store4,language:threadId=>threadLanguage(threadId),startTurn:(botId,text30,opts)=>startTurn(botId,text30,opts),stop:(botId,threadId,cause)=>{interruptDirectThread(botId,threadId,cause).catch(()=>{})},threadBusy,opened:(threadId,parent2)=>threadStarters.set(threadId,openerFrom(parent2)),origin:run11=>withPerson({kind:"user",request:quoteInNote(run11.task,400)},threadPersonKey(run11.threadId)),approval:(bot,selection3)=>ownThreads.
31958
- approvalFor(bot,selection3),defaultModel:(bot,threadId)=>burstDefaultModel({own:store4.taskByThread(bot.id,threadId)?.modelSelection??bot.modelSelection,catalog:id12=>registry2.get(id12)?.models,refused:id12=>quickFallback.refused(id12),usable:selection3=>ownThreads.refusal(selection3,bot)===null}),modelName,route:notification=>teamMessages.route(notification,{routine:!0}),announce:notification=>{broadcast({kind:"notify",notification:logNotification(notification)})}}),teamMemory=new TeamMemory(join277(
31976
+ approvalFor(bot,selection3),defaultModel:(bot,threadId)=>burstDefaultModel({own:store4.taskByThread(bot.id,threadId)?.modelSelection??bot.modelSelection,catalog:id12=>registry2.get(id12)?.models,refused:id12=>quickFallback.refused(id12),usable:selection3=>ownThreads.refusal(selection3,bot)===null}),modelName,route:notification=>teamMessages.route(notification,{routine:!0}),announce:notification=>{broadcast({kind:"notify",notification:logNotification(notification)})}}),teamMemory=new TeamMemory(join278(
31959
31977
  DATA_DIR,"team-memory.json")),teamMemoryRequests=createTeamMemoryRequests({teamMemory,store:store4,sectionKey:sectionContextKey,decide:row=>appendDecision(DATA_DIR,row)}),outsideWrites=createOutsideWrites({store:store4,notify,language:threadId=>threadLanguage(threadId),decide:row=>appendDecision(DATA_DIR,row),writeMemory:(botId,threadId,change2)=>{let written=botMemoryUpdate(teamHost.layer(botId,threadId),change2,{source:memorySourceLabel({room:store4.groupByThread(threadId),task:store4.taskByThread(
31960
31978
  teamHost.baseBotId(botId),threadId),threadId}),aboutMe:null,prefer:null});return written.ok?null:written.error}}),outboundRequests=new OutboundRequestService,outboundHold=createOutboundHold({store:store4,dataDir:DATA_DIR,outboundRequests,holdMs:OUTBOUND_HOLD_MS,connectorThread,activeGroupTurnForBot,notify});function resolveAndSendTrust(res,threadId,requestId,behavior){let remembered2=teamMemoryRequests.resolve(threadId,requestId,behavior)??outsideWrites.resolve(threadId,requestId,behavior);if(remembered2)
31961
31979
  return json3(res,200,remembered2),!0;let outboundCard2=store4.messagesFor(threadId).find(message8=>message8.card?.requestId===requestId&&message8.card.outboundRequest);if(outboundCard2?.card?.outboundRequest){let outboundBot=outboundCard2.from?.botId?store4.bot(outboundCard2.from.botId):store4.botByThread(threadId),result2=outboundRequests.resolve({threadId,requestId,behavior});return result2.claimed?result2.state==="already_settled"?(json3(res,200,{ok:!0,outcome:result2.behavior==="allow"?"allo\
@@ -32141,7 +32159,7 @@ noteSkillChange(botId,threadId)});function resolveSkillRequest(args){let message
32141
32159
  card,{...request9,action:request9.action});if(card.answered||card.dismissed){let cleanup=rejectStagedSkillWrite(args.botId,request9.stagedId);return"applied"in cleanup&&cleanup.applied&&card.answered!=="allow"?(store4.patchMessage(args.threadId,message8.id,{card:{...card,answered:"allow",dismissed:!1,held:void 0}}),{claimed:!0,outcome:"allowed-once",alreadySettled:!0}):{claimed:!0,outcome:card.answered==="allow"?"allowed-once":"rejected",alreadySettled:!0}}if(args.behavior!=="allow"){let rejected2=rejectStagedSkillWrite(
32142
32160
  args.botId,request9.stagedId);return"error"in rejected2&&rejected2.error!=="no such staged skill"?{claimed:!0,status:409,error:rejected2.error}:"applied"in rejected2?(store4.patchMessage(args.threadId,message8.id,{card:{...card,answered:"allow",dismissed:!1,held:void 0}}),appendDecision(DATA_DIR,{threadId:args.threadId,requestId:args.requestId,botId:args.botId,botName:args.botName,tool:card.tool,summary:card.subtitle,decision:"user-approved",source:"user"}),{claimed:!0,outcome:"allowed-once"}):(store4.
32143
32161
  patchMessage(args.threadId,message8.id,{card:{...card,answered:"deny",dismissed:!0,held:void 0}}),appendDecision(DATA_DIR,{threadId:args.threadId,requestId:args.requestId,botId:args.botId,botName:args.botName,tool:card.tool,summary:card.subtitle,decision:"user-denied",source:"user"}),{claimed:!0,outcome:"rejected"})}if(typeof request9.preview!="string"||typeof request9.sha256!="string")return{claimed:!0,status:409,error:"this proposal was created by an older build \u2014 deny it and ask the bot to cr\
32144
- eate it again"};if(args.reviewedSha256!==request9.sha256)return{claimed:!0,status:409,error:"reviewedSha256 must match the skill shown on the approval card"};if(createHash128("sha256").update(request9.preview).digest("hex")!==request9.sha256||skillReferencesSha256(request9.references??[])!==request9.referencesSha256)return{claimed:!0,status:422,error:"the skill preview changed after review \u2014 deny and recreate it"};let staged=getStagedSkillWrite(args.botId,request9.stagedId);if(!staged){let replayed=applyStagedSkillWrite(
32162
+ eate it again"};if(args.reviewedSha256!==request9.sha256)return{claimed:!0,status:409,error:"reviewedSha256 must match the skill shown on the approval card"};if(createHash129("sha256").update(request9.preview).digest("hex")!==request9.sha256||skillReferencesSha256(request9.references??[])!==request9.referencesSha256)return{claimed:!0,status:422,error:"the skill preview changed after review \u2014 deny and recreate it"};let staged=getStagedSkillWrite(args.botId,request9.stagedId);if(!staged){let replayed=applyStagedSkillWrite(
32145
32163
  args.botId,request9.stagedId,{expectedSha256:request9.sha256,expectedReferencesSha256:request9.referencesSha256??null});return"error"in replayed||replayed.name!==request9.name||replayed.source!==request9.source?{claimed:!0,status:422,error:"the staged skill no longer matches this approval card"}:store4.patchMessage(args.threadId,message8.id,{card:{...card,answered:"allow",held:void 0}})?(appendDecision(DATA_DIR,{threadId:args.threadId,requestId:args.requestId,botId:args.botId,botName:args.botName,
32146
32164
  tool:card.tool,summary:card.subtitle,decision:"user-approved",source:"user"}),{claimed:!0,outcome:"allowed-once"}):{claimed:!0,status:409,error:"the learned-skill approval card is no longer available"}}if(request9.requestId!==args.requestId||request9.threadId!==args.threadId||staged.action!==request9.action||staged.name!==request9.name||staged.source!==request9.source||staged.sha256!==request9.sha256||staged.referencesSha256!==request9.referencesSha256)return{claimed:!0,status:422,error:"the sta\
32147
32165
  ged skill no longer matches this approval card"};let applied=applyStagedSkillWrite(args.botId,request9.stagedId,{expectedSha256:request9.sha256,expectedReferencesSha256:request9.referencesSha256??null,onApplied:()=>{if(!store4.patchMessage(args.threadId,message8.id,{card:{...card,answered:"allow",held:void 0}}))throw new Error("the learned-skill approval card is no longer available")}});return"error"in applied?(store4.patchMessage(args.threadId,message8.id,{card:{...card,held:applied.error}}),{claimed:!0,
@@ -32170,7 +32188,7 @@ remember(value3,kind2),stepContext:(bot,turn)=>stepContext(bot,turn,()=>liveTurn
32170
32188
  cfg)}}async function readyLocalVmForTurn(botId,target4,isCurrent=()=>!0){localVmLifecycleBusy.add(target4.key);let pooled=target4.key.startsWith("pool:"),ownsProvision=!pooled&&!localVmProvisionBusy;ownsProvision&&(localVmProvisionBusy=!0);let status5;try{if(status5=await containerComputerStatus(void 0,void 0,target4),status5=await startStoppedPodmanMachine(status5,()=>containerComputerStatus(void 0,void 0,target4),()=>broadcast({kind:"computer",botId,state:"provisioning"})),noteLocalVmSeen(target4,
32171
32189
  status5),!isCurrent())return status5;let action3=localVmWakeAction(status5);if(status5.ready||!action3||!status5.runtime||action3==="run"&&!pooled&&!ownsProvision)return status5;if(action3==="run"&&target4.key.startsWith("bot:")){let count12=await existingPerBotLocalVmCount(status5.runtime);if(!isCurrent()||count12>=localVmMaxInstances(cfg))return status5}broadcast({kind:"computer",botId,state:"provisioning"});try{status5=await containerComputerAction(action3,void 0,void 0,target4,localVmResources(
32172
32190
  cfg))}catch{return localVmIdleFor(target4).touch(),status5}}finally{ownsProvision&&(localVmProvisionBusy=!1),localVmLifecycleBusy.delete(target4.key)}localVmIdleFor(target4).touch();let deadline=Date.now()+LOCAL_VM_DESKTOP_WAIT_MS;for(;isCurrent()&&!status5.ready&&status5.container==="running"&&Date.now()<deadline&&(await new Promise(resolve56=>setTimeout(resolve56,2e3)),!!isCurrent());)status5=await containerComputerStatus(void 0,void 0,target4);return status5}async function existingPerBotLocalVmCount(runtime2){
32173
- return(await discoverExistingPerBotLocalVms(store4.bots,runtime2)).length}async function perBotLocalVmCountForModeChange(){let targets=[...new Map(store4.bots.map(bot=>{let target4=perBotLocalVmTarget(bot.id);return[target4.key,target4]})).values()];if(targets.length===0)return 0;let runtime2=await containerRuntimeStatus();return!runtime2.runtime||!runtime2.daemonUp?targets.some(target4=>existsSync98(target4.workspaceDir))?null:0:existingPerBotLocalVmCount(runtime2.runtime)}function configStatus(){
32191
+ return(await discoverExistingPerBotLocalVms(store4.bots,runtime2)).length}async function perBotLocalVmCountForModeChange(){let targets=[...new Map(store4.bots.map(bot=>{let target4=perBotLocalVmTarget(bot.id);return[target4.key,target4]})).values()];if(targets.length===0)return 0;let runtime2=await containerRuntimeStatus();return!runtime2.runtime||!runtime2.daemonUp?targets.some(target4=>existsSync99(target4.workspaceDir))?null:0:existingPerBotLocalVmCount(runtime2.runtime)}function configStatus(){
32174
32192
  let eventLogMaxBytes=threadEventLogMaxBytes(cfg),eventLogRetentionDays=threadEventLogRetentionDays(cfg);return{cloudStarter:cloudPlanTier.starter(),waitingForRoom:engineMemory.waiting(),planTurns:starterCaps.status(),awakeLimit:starterAwake.limit(),pausedBots:starterAwake.paused(),xai:keyStatus(cfg.xai?.key),mistral:keyStatus(cfg.mistral?.key),cerebras:keyStatus(cfg.cerebras?.key),groq:keyStatus(cfg.groq?.key),greenference:keyStatus(cfg.greenference?.key),modelgo:keyStatus(cfg.modelgo?.key),meta:keyStatus(
32175
32193
  cfg.meta?.key),deepseek:keyStatus(cfg.deepseek?.key),xResearch:xResearchStatus(),treg:keyStatus(cfg.treg?.key),postiz:{...keyStatus(cfg.postiz?.key),...cfg.postiz?.url?{url:cfg.postiz.url}:{}},anthropic:{...keyStatus(cfg.anthropic?.key),everyClaudeBot:cfg.anthropic?.everyClaudeBot!==!1},openai:keyStatus(cfg.openai?.key),openrouter:keyStatus(cfg.openrouter?.key),fleet:{available:fleetAvailable(fleetSocketPath())},edition:editionForSettings(editionStatus()),budgets:{...cfg.budgets?.monthlyUsd!==void 0?
32176
32194
  {monthlyUsd:cfg.budgets.monthlyUsd}:{},...cfg.budgets?.warnAtPercent!==void 0?{warnAtPercent:cfg.budgets.warnAtPercent}:{}},billing:{currency:cfg.billing?.currency??"USD",prices:cfg.billing?.prices??{}},decisions:{retentionDays:decisionRetentionDays(cfg.decisions?.retentionDays)},safetyFloor:{enabled:safetyFloorOn()},openaiCompat:{...keyStatus(cfg.openaiCompat?.key),url:cfg.openaiCompat?.url??""},composio:{...connectionMode(cfg)==="self-hosted"?keyHint(cfg.composio?.apiKey):{},configured:configured(
@@ -32216,7 +32234,7 @@ liveRoots,paused:()=>workspaceMaintenance.active||moveFreeze.frozen()}),chatApps
32216
32234
  sessions.isLive(auth.session.id))&&visibleTo(viewerFor(auth)).thread(threadId)}));var{react}=createReactions({store:store4,reply:input2=>teamMessages.reactedIn(input2.auth,input2.threadId,input2.target.id,input2.answer,{sendId:input2.sendId,sender:messageSender(input2.auth)})??personReplies.deliver({...input2,about:"message"}),answerCard:input2=>respondToCard({...input2,via:"reaction"}),withdraw:personReplies.withdraw}),publishedPages=createPublishedPages({dataDir:DATA_DIR,cloudHome:CLOUD_HOME,selfHosted:!CLOUD_HOME&&
32217
32235
  !HOSTED_WORKSPACE&&utilityParentPort===void 0,patch:(threadId,messageId2,text30,publishedPage)=>{store4.patchMessage(threadId,messageId2,{text:text30,publishedPage})},liveRoots:(botId,threadId)=>liveRoots(threadId,botId),paused:()=>workspaceMaintenance.active||moveFreeze.frozen(),apps:{chat:chatApps,store:store4}});ROUTES2.push(createReactionRoutes({react,reactorFor,cloudGuestSendRefusal}),publishedPages.routes,savedSteps.routes,createPlacesElsewhereRoutes({elsewhere:placesElsewhere,owner:auth=>!sharedMembership()&&
32218
32236
  !HOSTED_WORKSPACE&&(auth.kind==="loopback"||ownHome.owner(auth)||CLOUD_PERSONAL&&cloudOwnerSession(auth))}));var keptAttachments=()=>{let routineFiles=routines?.attachmentPaths();return routineFiles&&calendarCalls?keptAttachmentNames([...store4.bots.map(bot=>bot.avatarUrl),cfg.profile?.avatarUrl],[workspaceBannerStore.current()?.name,...routineFiles,...calendarCalls.list().flatMap(call2=>call2.attachments?.map(file3=>file3.path)??[]),...[...turnAttachmentsByTurn.values()].flat().map(file3=>file3.
32219
- path)]):null};createDeleteLeftovers({dataDir:DATA_DIR,store:store4,threadsReferencing,keptAttachments,deleteAttachment:name6=>deleteAttachment(join277(ATTACHMENTS_DIR,name6)),engineFolders:()=>engineSessionFolders(DATA_DIR,[process.env,...Object.values(providerConfigs()).map(instance=>instanceEnvironment(process.env,instance))].flatMap(env=>engineHomes.everyHome(env))),layers:memoryLayerRecords});ROUTES2.push(createThreadRoutes({groupFor:personRooms.groupForAuth,...botOrders?{botOrderFor:(auth,bots)=>{
32237
+ path)]):null};createDeleteLeftovers({dataDir:DATA_DIR,store:store4,threadsReferencing,keptAttachments,deleteAttachment:name6=>deleteAttachment(join278(ATTACHMENTS_DIR,name6)),engineFolders:()=>engineSessionFolders(DATA_DIR,[process.env,...Object.values(providerConfigs()).map(instance=>instanceEnvironment(process.env,instance))].flatMap(env=>engineHomes.everyHome(env))),layers:memoryLayerRecords});ROUTES2.push(createThreadRoutes({groupFor:personRooms.groupForAuth,...botOrders?{botOrderFor:(auth,bots)=>{
32220
32238
  let person2=botOrders.personOf(auth);return person2?botOrders.ordered(person2,bots):bots}}:{},store:store4,userName:userNameFor,sessions,groupUsageReader,lendingEnabled,hostedWorkspace:HOSTED_WORKSPACE,sessionCookie:SESSION_COOKIE,loopback:LOOPBACK10,defaultPage:DEFAULT_PAGE,workspaceAccess:()=>workspaceAccess,desktopMutationToken:()=>desktopMutationToken,companionMutationToken:()=>companionMutationToken,cliOwnerToken:()=>cliOwnerToken,pageSize,messagePage,messageWindow,publicBotQueuedMessages,publicGroupState,
32221
32239
  wireBot,botComputerControlSnapshot,messageFileRootsForThread,viewerFor,visibleTo,coordinator,groupThreadIsWorking,memberDefaultBot:CLOUD_TEAM?email3=>{let own4=ensureDefaultBot(store4,{dataDir:DATA_DIR,person:email3,team:CLOUD_TEAM.name,opened:made=>{mausbotOwnChat.claim(made)}});return own4&&mausbotOwnChat.claim(own4),own4}:void 0,uploads:uploadsFor(createUploadOwners(DATA_DIR),!!CLOUD_TEAM),attachmentInUse:name6=>threadsReferencing(name6).length>0||store4.bots.some(bot=>bot.avatarUrl===`/api/a\
32222
32240
  ttachments/${name6}`),keptAttachments:CLOUD_TEAM?void 0:keptAttachments}));offerAttachmentClear(!CLOUD_TEAM);ROUTES2.push(createBotCreateRoutes({store:store4,cfg,presetStore,orgInstallStatuses,hostedWorkspace:HOSTED_WORKSPACE,hostedFullAccessRefusal:HOSTED_FULL_ACCESS_REFUSAL,desktopManaged:DESKTOP_MANAGED,maxWorkspaceBots:MAX_WORKSPACE_BOTS,paused:botId=>starterAwake.isPaused(botId),cloudOwnerKey:CLOUD_OWNER_KEY,hostedModels,cloudRoutineAuthors,routines:()=>routines,storedAvatarExists,defaultSelection,
@@ -32225,9 +32243,9 @@ profileOf:email3=>teamHost.people.profile(personKey({id:"",email:email3}))}));RO
32225
32243
  engineSwitchNeedsAsk,readCursor,canManageCommandAllowlist,commandAllowlistResponse,cardAnswerRefusal,threadRead:teamMessages.seen,levelOf,personMarkThread:personRooms.personMarkThread}));ROUTES2.push(createBotOrderRoutes({store:store4,visibleFor:auth=>visibleTo(viewerFor(auth)),...botOrders?{own:{person:botOrders.personOf,order:botOrders,told:(person2,botIds)=>broadcast({kind:"bots.order",botIds},{person:person2})}}:{}}),createBotAccessRoutes({team:CLOUD_TEAM,people:teamOwners.people,store:store4,
32226
32244
  levelOf,wireBot,publicGroupState,broadcast,audienceChanged,record:(auth,row)=>appendAdminAction(DATA_DIR,{...row,actor:decisionActorFor(auth)})}),accessRequests.routes);ROUTES2.push(createBotPatchRoutes({store:store4,cfg,registry:registry2,sessions,browserRuntime,browserLive,memoryUpkeep,cacheKeepWarm,hostedModels,supportsApprovalMode:supportsApprovalMode2,routines:()=>routines,activeVpsThreads,hostedWorkspace:HOSTED_WORKSPACE,hostedFullAccessRefusal:HOSTED_FULL_ACCESS_REFUSAL,desktopManaged:DESKTOP_MANAGED,
32227
32245
  broadcast,wireBot,publicGroupState,audienceChanged,storedAvatarExists,requestedTaskBot,threadBusy,activeGroupTurnForBot,checkedModelSelection,engineSwitchNeedsAsk,currentBrowserSession,interruptAllDirectThreads,cancelGroupTurnOperations,revokeInternalCapabilitiesForThread,runningTurnInstance,closeOpenApprovals,assertTeamComputerChangeIdle,forgetTemporaryBrowser,levelOf,team:!!CLOUD_TEAM,mainThreadTasks,chiefChanged:changed3=>chiefRooms.moved(changed3),...personRooms.personMarkThread?{personMarkThread:personRooms.
32228
- personMarkThread,shownThread:(auth,bot)=>memberBot(wireBot(bot),visibleTo(viewerFor(auth))).threadId}:{}}));ROUTES2.push(createBotLifecycleRoutes({store:store4,routines:()=>routines,interruptAllDirectThreads,cancelDirectTurnDispatch,revokeInternalCapabilitiesForThread,activeGroupTurnForBot,cancelGroupTurnOperations,runningTurnInstance,closeOpenApprovals,deleteBotWithLifecycle}));ROUTES2.push(createBotSkillsRoutes({store:store4,cfg,listBotSkills,readBotSkillFile,stagedSkillListing}));ROUTES2.push(
32229
- createEmailRoutes({service:emailService}));ROUTES2.push(phones2.routes);ROUTES2.push(createSkillShareRoutes({enabled:()=>skillsHost.mode()!=="off",botExists:id12=>!!store4.bot(id12),cardRefusal:(auth,threadId,requestId)=>cardAnswerRefusal(auth,threadId,requestId,"allow"),shareFromReceipt:skillsHost.shareFromReceipt,shareFromBot:skillsHost.shareFromBot}));ROUTES2.push(createTeamContextRoutes({store:store4,teamMemory}));ROUTES2.push(createBotMemoryRoutes({bot:id12=>store4.bot(id12),...CLOUD_TEAM?{
32230
- ownLayer:(auth,botId)=>auth.kind==="session"&&visibleTo(viewerFor(auth)).bot(botId)?layerId(botId,memberAudience(personKey(auth.session))):null}:{},taskByThread:(botId,threadId)=>store4.taskByThread(botId,threadId),upkeep:memoryUpkeep,...lendingMemory?{lendingReview:{needed:botId=>{if(!lendingMemory.reconcile(botId,foreignTurnRunning(botId),{cached:!0}).changedBySomeoneElse)return null;let{token:token3,changed:changed3}=lendingMemory.reviewInfo(botId);return{token:token3,changed:changed3}},accept:(botId,token3)=>lendingMemory.
32246
+ personMarkThread,shownThread:(auth,bot)=>memberBot(wireBot(bot),visibleTo(viewerFor(auth))).threadId}:{}}));ROUTES2.push(createBotLifecycleRoutes({store:store4,routines:()=>routines,interruptAllDirectThreads,cancelDirectTurnDispatch,revokeInternalCapabilitiesForThread,activeGroupTurnForBot,cancelGroupTurnOperations,runningTurnInstance,closeOpenApprovals,deleteBotWithLifecycle}));ROUTES2.push(createBotSkillsRoutes({store:store4,cfg,listBotSkills,readBotSkillFile,stagedSkillListing}));startHubAutoSync();
32247
+ ROUTES2.push(createEmailRoutes({service:emailService}));ROUTES2.push(phones2.routes);ROUTES2.push(createSkillShareRoutes({enabled:()=>skillsHost.mode()!=="off",botExists:id12=>!!store4.bot(id12),cardRefusal:(auth,threadId,requestId)=>cardAnswerRefusal(auth,threadId,requestId,"allow"),shareFromReceipt:skillsHost.shareFromReceipt,shareFromBot:skillsHost.shareFromBot}));ROUTES2.push(createTeamContextRoutes({store:store4,teamMemory}));ROUTES2.push(createBotMemoryRoutes({bot:id12=>store4.bot(id12),...CLOUD_TEAM?
32248
+ {ownLayer:(auth,botId)=>auth.kind==="session"&&visibleTo(viewerFor(auth)).bot(botId)?layerId(botId,memberAudience(personKey(auth.session))):null}:{},taskByThread:(botId,threadId)=>store4.taskByThread(botId,threadId),upkeep:memoryUpkeep,...lendingMemory?{lendingReview:{needed:botId=>{if(!lendingMemory.reconcile(botId,foreignTurnRunning(botId),{cached:!0}).changedBySomeoneElse)return null;let{token:token3,changed:changed3}=lendingMemory.reviewInfo(botId);return{token:token3,changed:changed3}},accept:(botId,token3)=>lendingMemory.
32231
32249
  review(botId,foreignTurnRunning(botId),token3).ok,owner:cloudOwnerSession},ownersWrite:(auth,botId,write4)=>cloudOwnerSession(auth)?lendingMemory.trustedWrite(botId,write4):write4()}:{},aboutMe:auth=>CLOUD_TEAM?auth.kind==="session"?teamHost.memberProfile(auth.session).aboutMe:"":cfg.profile?.aboutMe??"",saveAboutMe:(aboutMe,auth)=>{CLOUD_TEAM?auth.kind==="session"&&teamHost.saveMemberProfile(auth.session,{aboutMe}):(saveConfig({profile:{...cfg.profile,aboutMe}}),Object.assign(cfg,loadConfig())),
32232
32250
  broadcast({kind:"config",...configStatus()})}}));var teamMoveIn=CLOUD_TEAM?createTeamMoveIn({team:CLOUD_TEAM,dataDir:DATA_DIR,sessions,store:store4,routines:()=>routines,library:()=>readSkillLibraryIndex(),starters:threadStarters}):null,cloudSendOwner=auth=>teamMoveIn?teamMoveIn.owner(auth):CLOUD_HOME&&auth.kind==="session"&&auth.scopes.includes("admin")||ownHome.owner(auth)?{person:actorKey(auth),name:cfg.profile?.name?.trim()||"User"}:null,botMoves=CLOUD_PERSONAL||DESKTOP_MANAGED?createBotMoves(
32233
32251
  {store:store4,routines:()=>routines,webhooks:()=>webhooks,appEvents:()=>appTriggers.manager,waits:()=>botWaits,busy:id12=>botHasActiveTurn(id12)||!!routines?.activeRunForBot(id12)}):null;ROUTES2.push(createBotMoveRoutes({moves:botMoves,enabled:!!botMoves}));teamMoveIn&&(ROUTES2.unshift(teamMoveIn.guard),ROUTES2.push(teamMoveIn.routes),teamOwners.backfill(teamMoveIn.list()));ROUTES2.push(createDeciderRoutes({decider,extractor,config:()=>cfg}),createImageSettingsRoutes({config:()=>cfg}),createTtsRoutes(
@@ -32247,7 +32265,7 @@ seen,runOwners,runActor,personMarkRoom:personRooms.personMarkRoom,groupFor:perso
32247
32265
  pageSize,messagePage,resolveReplyTarget,runningTurnInstance,startGroupTurn,engineSteersImages,applyRoomHoldsFromMessage,cancelGroupTurnOperations,drainQueuedChannelSends,clearTurnDigestState,closeOpenApprovals,revokeInternalCapabilitiesForThread,stagedSkillCleanupsForThread,rejectDeletedThreadSkillStages}));var taskRoutes=createTaskRoutes({store:store4,threadRead:teamMessages.seen,cloudHome:!!CLOUD_HOME,desktopManaged:DESKTOP_MANAGED,hostedWorkspace:HOSTED_WORKSPACE,hostedFullAccessRefusal:HOSTED_FULL_ACCESS_REFUSAL,
32248
32266
  hostedModels,routines:()=>routines,coordinator,handoffs,skillReview,threadStarters,phoneSecretSubmissions,titleRegenerations,directTurnGenerationByThread,actorKey,cloudOwnerSession,cloudThreadRefusal,sharedWorkspaceFullAccessEnabled,supportsApprovalMode:supportsApprovalMode2,threadBusy,broadcast,notificationListed,publicBot,wireBot,wireTask,pageSize,messagePage,checkedModelSelection,checkedTaskModelSwitch,threadTitleGate,generateThreadTitle,settleDirectFollowup,clearTurnDigestState,revokeInternalCapabilitiesForThread,
32249
32267
  stagedSkillCleanupsForThread,rejectDeletedThreadSkillStages});ROUTES2.push(taskRoutes);var leaveTeam=CLOUD_TEAM?createTeamMemberLeft({dataDir:DATA_DIR,store:store4,openedBy:person2=>threadStarters.threadsOf(person2,5e4),privateTo:teamHost.privateTo,revokeSessions:email3=>sessions.revokeMember(email3),busy:threadBusy,stop:(botId,threadId)=>interruptDirectThread(botId,threadId,"The person left the team"),deleteTasks:taskRoutes.deleteTasks,stopBot:botId=>memberOwnBot.stopWork(botId,"The person left\
32250
- the team"),deleteBot:memberOwnBot.remove,threadsReferencing,deleteAttachment:name6=>deleteAttachment(join277(ATTACHMENTS_DIR,name6)),eraseBrowsers:eraseAudienceBrowsers,forgetConnections:person2=>(connectionHealth.forgetPerson(person2),personRooms.reads?.forgetPerson(person2),teamConnections.forgetPerson(person2)),...teamRoutines.leaving,forgetOnBots:email3=>forgetMember(store4,email3,(bot,access2)=>writeAccess({store:store4,publicGroupState,broadcast,audienceChanged},bot,access2)).length,ownerOf:botId=>{
32268
+ the team"),deleteBot:memberOwnBot.remove,threadsReferencing,deleteAttachment:name6=>deleteAttachment(join278(ATTACHMENTS_DIR,name6)),eraseBrowsers:eraseAudienceBrowsers,forgetConnections:person2=>(connectionHealth.forgetPerson(person2),personRooms.reads?.forgetPerson(person2),teamConnections.forgetPerson(person2)),...teamRoutines.leaving,forgetOnBots:email3=>forgetMember(store4,email3,(bot,access2)=>writeAccess({store:store4,publicGroupState,broadcast,audienceChanged},bot,access2)).length,ownerOf:botId=>{
32251
32269
  let bot=store4.bot(botId);return bot?botOwner(bot):null},record:row=>appendAdminAction(DATA_DIR,{...row,actor:{kind:"session",sessionId:"",label:"Limix Bot Cloud"}})}):null;ROUTES2.push(createTeamRoutes({store:store4,cfg,authorName:auth=>CLOUD_TEAM?auth.kind==="session"&&teamHost.memberProfile(auth.session).name||void 0:cfg.profile?.name?.trim(),routines:()=>routines,orgLibrary:()=>orgLibrary,broadcast,publicBot,publicGroupState,groupWithThread,defaultSelection,defaultsPresetFor,packageImportDeps,
32252
32270
  starterNotes,threadShown,botShown:auth=>botId=>visibleTo(viewerFor(auth)).bot(botId),routineShown:auth=>routine=>routineVisible(routine,visibleTo(viewerFor(auth))),...skillExport(skillsHost)}));ROUTES2.push(createBrowserSiteRoutes({target:(which,threadId)=>signedInSitesTarget(which,threadId===null?"team":teamHost.browserAudience(threadId)),list:target4=>listSignedInSites(target4),signOut:(target4,site)=>signOutOfSites(target4,site)}));ROUTES2.push(createBrowserEvidenceRoutes({evidence:browserEvidence.
32253
32271
  attach({onChange:listener2=>store4.onChange(listener2),threadExists:id12=>!!threadOwner(id12)}),threadExists:id12=>!!threadOwner(id12)}));var loginRoutes=botLogins.routes(id12=>!!store4.bot(id12));ROUTES2.push(createLoginRoutes(loginRoutes),createVaultRoutes({logins:loginRoutes,secrets:logins2,linked:()=>botLogins.linkedSecrets(),keys:mcpKeys}));var privateRecords=createPrivateRecords({visibleFor:auth=>visibleTo(viewerFor(auth)),botExists:id12=>!!store4.bot(id12),routine:id12=>routines?.listRoutines().
@@ -32483,7 +32501,7 @@ id12)):memberIds;if(!allowedRoster(next))return json3(res,403,{error:"keep yours
32483
32501
  {req,res,url:url2,path:path6,method:method2,auth,json:json3,readBody})||await dispatchRoutes([createInternalCredentialRequestRoutes({readBody:readInternalBody,request:body2=>secretCards.requestCredential(internalSender,internalCapability.threadId,body2)})],{req,res,url:url2,path:path6,method:method2,auth,json:json3,readBody})||await dispatchRoutes([createInternalSignInRoutes({readBody:readInternalBody,request:(site,reason3)=>requestSignIn(internalSender,internalCapability.threadId,site,reason3)})],
32484
32502
  {req,res,url:url2,path:path6,method:method2,auth,json:json3,readBody}))return;if(method2==="POST"&&path6==="/api/internal/fill-login"){let body2=await readInternalBody(),outcome=await fillLoginForTurn(internalSender,internalCapability,body2.username,body2.submit,body2.email);return requireActiveInternalCapability(),json3(res,200,outcome)}if(method2==="POST"&&path6==="/api/internal/voice-note"){let body2=await readInternalBody(),text30=typeof body2.text=="string"?body2.text.trim():"";if(!text30)return json3(
32485
32503
  res,400,{error:"text required"});if(text30.length>1e3)return json3(res,413,{error:"voice notes are limited to 1000 characters"});let voiceBot=botForThread(internalSender.id,internalCapability.threadId)??internalSender;if(voiceBot.voiceNotes===!1)return json3(res,403,{error:"voice notes are turned off for this bot"});try{let audio2=await speak(cfg,text30,voiceBot.voice,void 0,callSignal2);requireActiveInternalCapability();let turnId=liveTurnByThread.get(internalCapability.threadId);if(!turnId)return json3(
32486
- res,409,{error:"this turn has not started yet or already ended"});let saved=saveAudio(Buffer.from(audio2.bytes),audio2.mime);if(!existsSync98(saved.path))throw new Error("the voice note's audio file was not saved");let key7=turnAttachmentKey(internalCapability.threadId,turnId),current3=turnAttachmentsByTurn.get(key7)??[];return current3.push({kind:"audio",path:saved.path,mime:saved.mime,text:text30}),turnAttachmentsByTurn.set(key7,current3),console.info(`[voice-note] parked thread=${internalCapability.
32504
+ res,409,{error:"this turn has not started yet or already ended"});let saved=saveAudio(Buffer.from(audio2.bytes),audio2.mime);if(!existsSync99(saved.path))throw new Error("the voice note's audio file was not saved");let key7=turnAttachmentKey(internalCapability.threadId,turnId),current3=turnAttachmentsByTurn.get(key7)??[];return current3.push({kind:"audio",path:saved.path,mime:saved.mime,text:text30}),turnAttachmentsByTurn.set(key7,current3),console.info(`[voice-note] parked thread=${internalCapability.
32487
32505
  threadId} turn=${turnId} file=${basename37(saved.path)}`),json3(res,201,{attached:!0,file:basename37(saved.path)})}catch(error66){let failure11=voiceNoteFailure(error66);if(failure11)return json3(res,failure11.status,failure11.body);throw error66}}if(method2==="POST"&&path6==="/api/internal/connectors/mcp"){let body2=await readInternalBody(),currentSender=store4.bot(internalCapability.botId);if(!currentSender||currentSender.composio===!1||!configured(cfg))return json3(res,403,{error:"connected a\
32488
32506
  pps are not enabled for this bot"});let actor=teamConnections.relayActor(internalCapability);if(actor.refusal)return json3(res,200,{jsonrpc:"2.0",id:body2.id??null,result:{content:[{type:"text",text:actor.refusal}],isError:!0}});let call2=connectorCallFromFrame(body2),serviceSlugs=[];if(call2.kind==="unrecognized"&&currentSender.connectorTools!==void 0){appendDecision(DATA_DIR,{threadId:internalCapability.threadId,botId:currentSender.id,botName:currentSender.name,tool:call2.invoked,summary:call2.
32489
32507
  reason,decision:"auto-denied",source:"connector-scope",rule:"connectorTools"});let refusal7=connectorUnrecognizedText(call2.invoked,call2.reason);return res.writeHead(200,{"content-type":"application/json","cache-control":"no-store"}),res.end(JSON.stringify({jsonrpc:"2.0",id:body2.id??null,result:{content:[{type:"text",text:refusal7}],isError:!0}}))}if(call2.kind==="tools"){if(serviceSlugs=await connectedServiceSlugs(...teamConnections.via(actor.access)),requireActiveInternalCapability(),currentSender=
@@ -32540,11 +32558,11 @@ directTurnDispatchClaims.has(threadId),messageSender(auth));let free=idleThreads
32540
32558
  {}})}if(method2==="GET"&&path6==="/api/connectors/connected"){let availability=connectorAvailability(cfg);if(availability!=="configured")return json3(res,200,{configured:!1,credentialStore:availability==="unreadable"?"unavailable":"ok",services:{}});let inventory=await connectedServicesInventory(cfg);return json3(res,200,{configured:!0,credentialStore:"ok",inventoryComplete:inventory.complete,services:inventory.services})}if(method2==="GET"&&path6==="/api/connectors/tools"){let availability=connectorAvailability(
32541
32559
  cfg),nativeTools={...emailHost.toolListing(),...phones2.toolListing()};if(availability!=="configured")return json3(res,200,{configured:Object.keys(nativeTools).length>0,services:nativeTools});try{return json3(res,200,{configured:!0,services:{...await listConnectorTools(cfg),...nativeTools}})}catch(e){return json3(res,502,{configured:!0,services:{},error:e instanceof Error?e.message:String(e)})}}if(method2==="GET"&&path6==="/api/connectors"){let services2=(url2.searchParams.get("services")??"").split(
32542
32560
  ",").filter(Boolean),availability=connectorAvailability(cfg);if(availability!=="configured")return json3(res,200,{configured:!1,credentialStore:availability==="unreadable"?"unavailable":"ok",services:{}});let status5=await connectionStatus(cfg,services2.length?services2:CURATED_SLUGS);return json3(res,200,{configured:!0,services:status5})}if(m3=path6.match(/^\/api\/connectors\/([\w-]+)\/authorize$/),m3&&method2==="POST"){let body2=await readBody(req),refused3=managedPolicy.appRefusal(m3[1]);if(refused3)
32543
- return json3(res,403,{error:refused3,code:"managed_policy"});let started2=await authorizeService(cfg,m3[1],body2.alias);return routineHolds?.connections("added"),connectionHealth.added("app",m3[1],auth.kind==="session"?auth.session.email??null:null),json3(res,200,started2)}if(m3=path6.match(/^\/api\/connectors\/([\w-]+)\/accounts\/([A-Za-z0-9][A-Za-z0-9_-]{0,127})$/),m3&&method2==="DELETE"){let removed=await removeAccount(cfg,m3[1],m3[2]);return routineHolds?.connections("removed"),json3(res,200,
32561
+ return json3(res,403,{error:refused3,code:"managed_policy"});let started3=await authorizeService(cfg,m3[1],body2.alias);return routineHolds?.connections("added"),connectionHealth.added("app",m3[1],auth.kind==="session"?auth.session.email??null:null),json3(res,200,started3)}if(m3=path6.match(/^\/api\/connectors\/([\w-]+)\/accounts\/([A-Za-z0-9][A-Za-z0-9_-]{0,127})$/),m3&&method2==="DELETE"){let removed=await removeAccount(cfg,m3[1],m3[2]);return routineHolds?.connections("removed"),json3(res,200,
32544
32562
  removed)}if(m3=path6.match(/^\/api\/connectors\/([\w-]+)$/),m3&&method2==="DELETE"){let removed=await removeService(cfg,m3[1]);return routineHolds?.connections("removed"),connectionHealth.removed("app",m3[1]),json3(res,200,removed)}if(m3=path6.match(/^\/api\/bots\/([\w-]+)\/connector-cards\/([\w-]+)\/(authorize|status|resume|dismiss)$/),m3){let body2=method2==="POST"?await readBody(req):{},threadId=String(method2==="GET"?url2.searchParams.get("threadId")??"":body2.threadId??""),message8=connectorMessage(
32545
32563
  m3[1],threadId,m3[2]);if(!message8?.connector)return json3(res,404,{error:"no such connection request"});if(isMcpSignInCard(message8)){res.setHeader("Cache-Control","no-store");let answer2=await mcpSignInCards.route(m3[3],method2,{auth,req,threadId,message:message8});return json3(res,answer2.status,answer2.body)}let connector=message8.connector;if(m3[3]==="authorize"&&!auth.scopes.includes("admin"))return json3(res,403,{error:"forbidden: this session lacks the admin scope"});if(m3[3]==="authoriz\
32546
- e"&&method2==="POST"){let refused3=managedPolicy.appRefusal(connector.slug);if(refused3)return json3(res,403,{error:refused3,code:"managed_policy"});let alias=normalizeAccountAlias(typeof body2.alias=="string"?body2.alias:void 0)??connector.alias;store4.patchMessage(threadId,message8.id,{connector:{...connector,alias,status:"authorizing",error:void 0,dismissed:!1}});try{let started2=await authorizeService(cfg,connector.slug,alias);return routineHolds?.connections("added"),connectionHealth.added(
32547
- "app",connector.slug,auth.kind==="session"?auth.session.email??null:null),json3(res,200,started2)}catch(error66){let detail=error66 instanceof Error?error66.message:String(error66);throw store4.patchMessage(threadId,message8.id,{connector:{...connector,status:"failed",error:detail.slice(0,180)}}),error66}}if(m3[3]==="status"&&method2==="GET"){let service=(await connectionStatus(cfg,[connector.slug]))[connector.slug],account2=connector.alias?service?.accounts?.find(item=>item.alias?.trim().toLowerCase()===
32564
+ e"&&method2==="POST"){let refused3=managedPolicy.appRefusal(connector.slug);if(refused3)return json3(res,403,{error:refused3,code:"managed_policy"});let alias=normalizeAccountAlias(typeof body2.alias=="string"?body2.alias:void 0)??connector.alias;store4.patchMessage(threadId,message8.id,{connector:{...connector,alias,status:"authorizing",error:void 0,dismissed:!1}});try{let started3=await authorizeService(cfg,connector.slug,alias);return routineHolds?.connections("added"),connectionHealth.added(
32565
+ "app",connector.slug,auth.kind==="session"?auth.session.email??null:null),json3(res,200,started3)}catch(error66){let detail=error66 instanceof Error?error66.message:String(error66);throw store4.patchMessage(threadId,message8.id,{connector:{...connector,status:"failed",error:detail.slice(0,180)}}),error66}}if(m3[3]==="status"&&method2==="GET"){let service=(await connectionStatus(cfg,[connector.slug]))[connector.slug],account2=connector.alias?service?.accounts?.find(item=>item.alias?.trim().toLowerCase()===
32548
32566
  connector.alias.toLowerCase()):void 0,state=connector.alias?{connected:/^active$/i.test(account2?.status??""),pending:/^(initiated|initializing|pending)$/i.test(account2?.status??""),status:account2?.status??"not_connected"}:service,failed2=/failed|expired|revoked|error/i.test(state?.status??""),next={...connector,status:state?.connected?"connected":failed2?"failed":"authorizing",error:failed2?`Connection ${state?.status??"failed"}`:void 0};return store4.patchMessage(threadId,message8.id,{connector:next}),
32549
32567
  state?.connected&&maybeResumeConnectors(threadId,connector.resumeKey),json3(res,200,{connected:!!state?.connected,pending:!!state?.pending,status:state?.status})}return m3[3]==="resume"&&method2==="POST"?maybeResumeConnectors(threadId,connector.resumeKey)?json3(res,200,{resumed:!0}):json3(res,409,{error:"finish connecting every requested app first"}):m3[3]==="dismiss"&&method2==="POST"?(store4.patchMessage(threadId,message8.id,{connector:{...connector,dismissed:!0}}),releaseCardNode(threadId,message8.
32550
32568
  id,"The connection request was dismissed"),json3(res,200,{dismissed:!0})):json3(res,405,{error:"method not allowed"})}if(m3=path6.match(/^\/api\/bots\/([\w-]+)\/computer$/),m3&&method2==="GET"){let bot=computerPreviewBot(m3[1],url2);if(!bot)return json3(res,404,{error:"no such bot"});let surface=url2.searchParams.has("threadId")?await computerPreviewSurface(bot,bot.threadId):"cloud";if(surface!=="cloud")return json3(res,200,{surface,configured:!1,backend:bot.cloudBackend==="vps"?"vps":"box"});let teamComputer=inheritedTeamComputer(