limixbot 0.3.1 → 0.3.3
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.
- package/dist/assets/{ActivityPanel-O6Su2c-u.js → ActivityPanel-CagbdBtd.js} +1 -1
- package/dist/assets/{App-Bcey1qup.js → App-DFjF9FvF.js} +119 -119
- package/dist/assets/{AppEventEditor-BlJGPJ3Z.js → AppEventEditor-BgX3KO6T.js} +1 -1
- package/dist/assets/BotSettingsDialog-ieeszW_3.js +16 -0
- package/dist/assets/{BrowserPanel-BWcb5CXi.js → BrowserPanel-BB3qz5lN.js} +2 -2
- package/dist/assets/{BrowserProfilesManager-dKHyQotG.js → BrowserProfilesManager-CVdcfOF8.js} +1 -1
- package/dist/assets/CloudAddDialog-Bl1bRrYD.js +1 -0
- package/dist/assets/{ComputerFilesPane-wgtikCgi.js → ComputerFilesPane-piKNDkt6.js} +1 -1
- package/dist/assets/ComputerPanel-COQweEJR.js +2 -0
- package/dist/assets/{DataPanel-BlBidswi.js → DataPanel-DdHxcsUa.js} +1 -1
- package/dist/assets/{DesktopViewer-D7JeLJbi.js → DesktopViewer-BNIgo9Nm.js} +1 -1
- package/dist/assets/{FilesView-CNkEKeZB.js → FilesView-Dy1gKmcM.js} +1 -1
- package/dist/assets/{GrokMoveDialog-fyBulzXL.js → GrokMoveDialog-CUnJWZi7.js} +6 -6
- package/dist/assets/{InspectorPanel-Cut2OqiB.js → InspectorPanel-CWdxtHne.js} +2 -2
- package/dist/assets/{KeyboardShortcutsModal-DnxUB4cd.js → KeyboardShortcutsModal-6FMUgbpC.js} +1 -1
- package/dist/assets/{LiveDesktop-CnbyXW61.js → LiveDesktop-CDbI9dPy.js} +1 -1
- package/dist/assets/LocalVmWorkspace-CslSGvNI.js +1 -0
- package/dist/assets/{MacLocalControl-CpswtfCI.js → MacLocalControl-CwHtEWES.js} +1 -1
- package/dist/assets/MarkdownFilePreview-DrdGFCnN.js +1 -0
- package/dist/assets/{MenuMotion-VeZ_fZ8M.js → MenuMotion-IQitGKH4.js} +1 -1
- package/dist/assets/{NewBotDialog-rBjsSV0e.js → NewBotDialog-V2wMpLPn.js} +1 -1
- package/dist/assets/PhoneAppDialog-DmBPVDxr.js +1 -0
- package/dist/assets/{PlacesRail-C_3Mh4C8.js → PlacesRail-v1XIqiBG.js} +9 -9
- package/dist/assets/{PluginsPanel-CMsgWSNg.js → PluginsPanel-CMARnTMq.js} +2 -2
- package/dist/assets/{ProIntroduction-6ByF2_US.js → ProIntroduction--jIMb4bL.js} +1 -1
- package/dist/assets/{RemoteAgentSettingsPanel-D4X4rHMQ.js → RemoteAgentSettingsPanel-Co34aJHb.js} +1 -1
- package/dist/assets/{RoomPanel-mg6M04wy.js → RoomPanel-ClyWQx9x.js} +2 -2
- package/dist/assets/{RoutinesPage-DomuZMUT.js → RoutinesPage-DRwSDyGu.js} +1 -1
- package/dist/assets/SettingsModal-CHa_Zc-J.js +11 -0
- package/dist/assets/{ShareTeamDialog-B_0Gr8Mq.js → ShareTeamDialog-BQ9h2Rd2.js} +1 -1
- package/dist/assets/{SignedInSites-C-eqeBxT.js → SignedInSites-B16Ruhd0.js} +1 -1
- package/dist/assets/{TeamLibraryPanel-DpXOFOQr.js → TeamLibraryPanel-NwC4Fc9C.js} +1 -1
- package/dist/assets/TeamMapPage-DabJFxkf.js +1 -0
- package/dist/assets/{TriggersPage-D7RDjrjV.js → TriggersPage-Cn_f8AcZ.js} +1 -1
- package/dist/assets/{VisibilitySection-Bimhk6c5.js → VisibilitySection-DyGNmx9n.js} +1 -1
- package/dist/assets/{WebhookTrigger-D5c2bPJu.js → WebhookTrigger-C-9-FE3w.js} +1 -1
- package/dist/assets/WorksOnGrid-M_5NkZch.js +1 -0
- package/dist/assets/{abnfDiagram-YUKMZFIV-D7az-C1J.js → abnfDiagram-YUKMZFIV-CBzJU2O6.js} +1 -1
- package/dist/assets/{activity-W_ia4q-Y.js → activity-bd7MWK8m.js} +1 -1
- package/dist/assets/{architectureDiagram-47P4ROYG-B2IC9169.js → architectureDiagram-47P4ROYG-DVR1DP3v.js} +1 -1
- package/dist/assets/{blockDiagram-E7TT5TSB-FnweBzU4.js → blockDiagram-E7TT5TSB-BYqUHhoh.js} +1 -1
- package/dist/assets/{c4Diagram-CRA5TL53-rxgwSaAP.js → c4Diagram-CRA5TL53-BtQERHwr.js} +1 -1
- package/dist/assets/{calendar-days-wM1DS-Cu.js → calendar-days-YMHxUvlg.js} +1 -1
- package/dist/assets/channel-D6e78p3W.js +1 -0
- package/dist/assets/{chunk-2Q5K7J3B-B7yhqEe8.js → chunk-2Q5K7J3B-Cwf_xeHP.js} +1 -1
- package/dist/assets/{chunk-5VM5RSS4-Sw6phnaf.js → chunk-5VM5RSS4-Doo-zxI4.js} +1 -1
- package/dist/assets/{chunk-7TKQ45FW-CheglUSd.js → chunk-7TKQ45FW-CD2AgrRj.js} +1 -1
- package/dist/assets/{chunk-AW2ZBBNX-CswkqPkf.js → chunk-AW2ZBBNX-e5OuWeq_.js} +1 -1
- package/dist/assets/{chunk-FVRAUYC3-DeN53o4S.js → chunk-FVRAUYC3-C8jo43it.js} +2 -2
- package/dist/assets/{chunk-HTAEGDNF-CCZ_Udf0.js → chunk-HTAEGDNF-DLsD4agj.js} +1 -1
- package/dist/assets/{chunk-JWPE2WC7-nG1rfC9P.js → chunk-JWPE2WC7-UZDUbeTy.js} +1 -1
- package/dist/assets/{chunk-KQW6MTUR-Bh_TxL0e.js → chunk-KQW6MTUR-DR9SuVX3.js} +1 -1
- package/dist/assets/{chunk-XXDRQBXY-CLIJBS-V.js → chunk-XXDRQBXY-DwEl4815.js} +1 -1
- package/dist/assets/{classDiagram-v2-K4WV4PDN-B04FntQx.js → classDiagram-v2-K4WV4PDN-CQZho8e0.js} +1 -1
- package/dist/assets/{coins-81htcDNx.js → coins-DpzGN3sd.js} +1 -1
- package/dist/assets/{core-BLAzrox0.js → core-BNopzNRl.js} +1 -1
- package/dist/assets/{cose-bilkent-JH36ORCC-D9PAieWF.js → cose-bilkent-JH36ORCC-DUZ9OWzu.js} +1 -1
- package/dist/assets/{cynefin-EF2NZ3EQ-BAC2DRg5.js → cynefin-EF2NZ3EQ-DVHnJdjN.js} +1 -1
- package/dist/assets/{cynefinDiagram-3GCD6N5R-Cc3k_C-5.js → cynefinDiagram-3GCD6N5R-dYhbIkRt.js} +1 -1
- package/dist/assets/{dagre-W4DXFKR2-CpbzxBGo.js → dagre-W4DXFKR2-DqJNpw5w.js} +1 -1
- package/dist/assets/{diagram-2UJZ2QOL-d22NGVzG.js → diagram-2UJZ2QOL-DKNDqAnE.js} +1 -1
- package/dist/assets/{diagram-OVF4WLC6-BFTJTNpN.js → diagram-OVF4WLC6-DENMVM-d.js} +1 -1
- package/dist/assets/{diagram-PFPMY2P6-CA_YgAo3.js → diagram-PFPMY2P6-CrRFeR5V.js} +1 -1
- package/dist/assets/{diagram-UMYRVEAY-CCsuWndY.js → diagram-UMYRVEAY-B5w-desO.js} +1 -1
- package/dist/assets/{diagram-YEKJPTXX-Bcwhmpgl.js → diagram-YEKJPTXX-C7AVX3MB.js} +1 -1
- package/dist/assets/{diagram-ZIFT7M5P-Bs1iIjhq.js → diagram-ZIFT7M5P-BgkTRwwr.js} +1 -1
- package/dist/assets/{ebnfDiagram-VR2GEFS7-CFr96fLM.js → ebnfDiagram-VR2GEFS7-yY_2KNsK.js} +1 -1
- package/dist/assets/{elk-IJKZMXRS-DSdTG_hW.js → elk-IJKZMXRS-xWtfkoqT.js} +1 -1
- package/dist/assets/{erDiagram-O2IAPWRE-BGdMdwi1.js → erDiagram-O2IAPWRE-BMM4saPI.js} +1 -1
- package/dist/assets/{file-up-DvGMRF5I.js → file-up-Bl7ViNTL.js} +1 -1
- package/dist/assets/{flowDiagram-OXPTDLAJ-DL25A20O.js → flowDiagram-OXPTDLAJ-BCRe8i6T.js} +1 -1
- package/dist/assets/{ganttDiagram-R7TSEDQI-DQaNIRGv.js → ganttDiagram-R7TSEDQI-COBrcDi7.js} +1 -1
- package/dist/assets/{gitGraphDiagram-XJZIOB7I-B6ypA1ZF.js → gitGraphDiagram-XJZIOB7I-Dc4RKydD.js} +1 -1
- package/dist/assets/{import-name-Cdh9ZlkK.js → import-name-DA_MmEsd.js} +1 -1
- package/dist/assets/{index-BaW02tJl.js → index-BXLNny-w.js} +1 -1
- package/dist/assets/index-CwYJ9TX8.js +2 -0
- package/dist/assets/{index-CxcnLo81.js → index-D6huutPz.js} +1 -1
- package/dist/assets/{infoDiagram-5W2HQ5XZ-8YbtI4S4.js → infoDiagram-5W2HQ5XZ-BV8RRI_4.js} +1 -1
- package/dist/assets/{ishikawaDiagram-K3B6WC7H-DYpDWk2K.js → ishikawaDiagram-K3B6WC7H-H-XILdGm.js} +1 -1
- package/dist/assets/{journeyDiagram-COXZFDF6-BUd8Vnbq.js → journeyDiagram-COXZFDF6-ChLduKEj.js} +1 -1
- package/dist/assets/{kanban-definition-P3RFRI5V-AywqsEBB.js → kanban-definition-P3RFRI5V-FSZ9F3JH.js} +1 -1
- package/dist/assets/{mcp-servers-Bu5RuYBT.js → mcp-servers-CYvHVOYi.js} +1 -1
- package/dist/assets/{mermaid.core-B5yiNmEY.js → mermaid.core-BRsJ02Pz.js} +4 -4
- package/dist/assets/{mindmap-definition-LZFPQGKD-DRALSCg6.js → mindmap-definition-LZFPQGKD-TWHzZjNT.js} +1 -1
- package/dist/assets/{minimize-CWsi9mRL.js → minimize-BYscOtPM.js} +1 -1
- package/dist/assets/{monitor-c1mf38zt.js → monitor-DFEzCfQk.js} +1 -1
- package/dist/assets/{new-bot-mp2gi3ed.js → new-bot-_oEUbcDw.js} +2 -2
- package/dist/assets/{org-library-Bi3EieNo.js → org-library-CapoiPaN.js} +1 -1
- package/dist/assets/{package-format-CaPiTXn3.js → package-format-Cn4nABBW.js} +1 -1
- package/dist/assets/{pegDiagram-BGZESJAR-Drj_UJz5.js → pegDiagram-BGZESJAR-LQWOF7IE.js} +1 -1
- package/dist/assets/{pieDiagram-CAPJLFHJ-CL7MryRt.js → pieDiagram-CAPJLFHJ-BRXp4qFw.js} +1 -1
- package/dist/assets/{quadrantDiagram-GDMTTRAM-BvWxqPJn.js → quadrantDiagram-GDMTTRAM-DyIdGBZo.js} +1 -1
- package/dist/assets/{rail-DApFzTxo.js → rail-Du7tlPwj.js} +1 -1
- package/dist/assets/{railroadDiagram-SM67HX2B-CGfR0UsO.js → railroadDiagram-SM67HX2B-BrL1MhW1.js} +1 -1
- package/dist/assets/{remote-desktop-panel-B4uIIoh3.js → remote-desktop-panel-DbxYe3uv.js} +1 -1
- package/dist/assets/{requirementDiagram-X7JNWC4A-CJq96anP.js → requirementDiagram-X7JNWC4A-DTYjaC8j.js} +1 -1
- package/dist/assets/{sankeyDiagram-UM26HJRW-BdZSA65i.js → sankeyDiagram-UM26HJRW-BR9dASO5.js} +1 -1
- package/dist/assets/{sequenceDiagram-ZO4K6R2Y-B5W6udgn.js → sequenceDiagram-ZO4K6R2Y-BR1k8h2_.js} +1 -1
- package/dist/assets/{sizeCapture-INFHLROL-CuKCNVLn.js → sizeCapture-INFHLROL-u8zOvZVi.js} +1 -1
- package/dist/assets/{stateDiagram-v2-TBUQTH76-C7mAgpvB.js → stateDiagram-v2-TBUQTH76-mQ64BAFv.js} +1 -1
- package/dist/assets/styles-BlayaJti.js +23 -0
- package/dist/assets/{swimlanes-N4OXWK64-D-mimAU7.js → swimlanes-N4OXWK64-CmzC3Mu0.js} +1 -1
- package/dist/assets/swimlanesDiagram-K3J5GTZL-Coei7rJr.js +8 -0
- package/dist/assets/{team-share-wuAG66b7.js → team-share-C3w1L3WL.js} +1 -1
- package/dist/assets/{timeline-definition-YOQAKGHF-C5prnOXi.js → timeline-definition-YOQAKGHF-9aPCRsK2.js} +1 -1
- package/dist/assets/{usecaseDiagram-VIAY4XPW-BC-9KKSF.js → usecaseDiagram-VIAY4XPW--ngAouwr.js} +1 -1
- package/dist/assets/{vennDiagram-BLWOH2XV-LCNTQN9e.js → vennDiagram-BLWOH2XV-C3zKxuAB.js} +1 -1
- package/dist/assets/vi-uLErku_e.js +15 -0
- package/dist/assets/{wardleyDiagram-YMQ3BMBF-CtWGEzVU.js → wardleyDiagram-YMQ3BMBF-CZWsQPSF.js} +1 -1
- package/dist/assets/{xychartDiagram-TAQBALBS-DadPRdBp.js → xychartDiagram-TAQBALBS-BTcsDP6v.js} +1 -1
- package/dist/index.html +2 -2
- package/dist/rail.html +4 -4
- package/dist-server/index.js +426 -421
- package/dist-server/openmausbot.js +22 -22
- package/dist-server/package.json +1 -1
- package/dist-server/pair-cli.js +22 -22
- package/dist-server/server/index.js +1 -1
- package/dist-server/server/limix-skill-folder.js +72 -0
- package/dist-server/server/routes/bot-skills.js +2 -1
- package/package.json +1 -1
- package/dist/assets/BotSettingsDialog-PiCk9us7.js +0 -16
- package/dist/assets/CloudAddDialog-D1ZSbkxV.js +0 -1
- package/dist/assets/ComputerPanel-Cyj53a7W.js +0 -2
- package/dist/assets/LocalVmWorkspace-D9xFPGF0.js +0 -1
- package/dist/assets/MarkdownFilePreview-V-y-0ksi.js +0 -1
- package/dist/assets/PhoneAppDialog-DAW1N-hM.js +0 -1
- package/dist/assets/SettingsModal-Dd9l0b2C.js +0 -11
- package/dist/assets/TeamMapPage-CIQPYaxL.js +0 -1
- package/dist/assets/WorksOnGrid-PZ-caKHg.js +0 -1
- package/dist/assets/channel-BQyC_QMX.js +0 -1
- package/dist/assets/index-oVds-_Vz.js +0 -2
- package/dist/assets/module-DCUsy2BQ.js +0 -3
- package/dist/assets/styles-C_rlkDrt.js +0 -23
- package/dist/assets/swimlanesDiagram-K3J5GTZL-Dn31PG7h.js +0 -8
- package/dist/assets/vi-NX09tr5q.js +0 -15
package/dist-server/index.js
CHANGED
|
@@ -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&¤t3!==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:
|
|
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:join276}=__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"]||
|
|
10062
|
+
globalThis.__bundlerPathsOverrides:{})["thread-stream-worker"]||join276(__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:
|
|
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:join276,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
|
|
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){
|
|
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"]||
|
|
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,
|
|
10088
|
+
of target or targets can be specified");targets?(target4=bundlerOverrides["pino-worker"]||join276(__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"]||join276(__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 join276(__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="",
|
|
10133
|
-
${indentation}`,
|
|
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+=
|
|
10132
|
+
return"null";if(stack2.indexOf(value3)!==-1)return circularValue;let res="",join276=",",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}`,join276=`,
|
|
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+=join276}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+=`${join276}"... ${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,
|
|
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=
|
|
10138
|
-
res+=`${separator}"...":${whitespace}"${getItemCount(removedKeys)} not stringified"`,separator=
|
|
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,join276=`,
|
|
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=join276)}if(keyLength>maximumBreadth){let removedKeys=keyLength-maximumBreadth;
|
|
10138
|
+
res+=`${separator}"...":${whitespace}"${getItemCount(removedKeys)} not stringified"`,separator=join276}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="",
|
|
10142
|
-
${indentation}`,
|
|
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+=
|
|
10141
|
+
string":return strEscape(value3);case"object":{if(value3===null)return"null";if(stack2.indexOf(value3)!==-1)return circularValue;let originalIndentation=indentation,res="",join276=",";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}`,join276=`,
|
|
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+=join276}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+=`${join276}"... ${getItemCount(removedKeys)}\
|
|
10144
10144
|
not stringified"`}return spacer!==""&&(res+=`
|
|
10145
|
-
${originalIndentation}`),stack2.pop(),`[${res}]`}stack2.push(value3);let whitespace="";spacer!==""&&(indentation+=spacer,
|
|
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=
|
|
10145
|
+
${originalIndentation}`),stack2.pop(),`[${res}]`}stack2.push(value3);let whitespace="";spacer!==""&&(indentation+=spacer,join276=`,
|
|
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=join276)}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}`,
|
|
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+=
|
|
10150
|
+
${indentation}`,join277=`,
|
|
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+=join277}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+=`${join277}"... ${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
|
|
10154
|
-
${indentation}`,res="",separator="",maximumPropertiesToStringify=Math.min(keyLength,maximumBreadth);isTypedArrayWithEntries(value3)&&(res+=stringifyTypedArray(value3,
|
|
10155
|
-
`${separator}${strEscape(key8)}: ${tmp}`,separator=
|
|
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 join276=`,
|
|
10154
|
+
${indentation}`,res="",separator="",maximumPropertiesToStringify=Math.min(keyLength,maximumBreadth);isTypedArrayWithEntries(value3)&&(res+=stringifyTypedArray(value3,join276,maximumBreadth),keys5=keys5.slice(value3.length),maximumPropertiesToStringify-=value3.length,separator=join276),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=join276)}if(keyLength>maximumBreadth){let removedKeys=keyLength-maximumBreadth;res+=`${separator}"...": "${getItemCount(removedKeys)} not stringified"`,separator=join276}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,
|
|
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,join276){return(data4,i)=>mapOuter(pa2(data4,i),ma2=>mapInner(pb(data4,ma2.position),(vb,j2)=>join276(ma2.value,vb,data4,i,j2)))}function abc2(pa2,pb,pc,join276){return(data4,i)=>mapOuter(pa2(data4,i),ma2=>mapOuter(pb(data4,ma2.position),mb2=>mapInner(pc(data4,mb2.position),(vc,j2)=>join276(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)=>[
|
|
@@ -15077,7 +15077,7 @@ set(id12,reserved),reserved}return{forNode,forTurn(threadId,generation,handoffId
|
|
|
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
|
|
15080
|
+
text.length,truncated:result2.truncated,expiresAt:result2.expiresAt}}};import{basename as basename37,join as join275}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(file2){let fd;try{fd=openSync(file2,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(file2,tokenHash,botForId){
|
|
15083
15083
|
let matches3=registrations(file2).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(file2,header3,botForId){return typeof header3!="string"||!/^Bearer \S{32,4096}$/.
|
|
@@ -26276,7 +26276,7 @@ code:fields2.code},...fields2.text===void 0?{}:{text:fields2.text}};if(command3.
|
|
|
26276
26276
|
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;
|
|
26277
26277
|
(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.
|
|
26278
26278
|
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.
|
|
26279
|
-
env??{}))return;let devTools=this.devTools,port=viewer.port,
|
|
26279
|
+
env??{}))return;let devTools=this.devTools,port=viewer.port,join276=()=>{let entry2=this.dialogs.get(viewer.session);return!entry2||entry2.watch.closed?!1:(this.current(viewer)&&entry2.views.add(viewer.id),!0)};if(join276())return;let url2=localDevToolsUrl(await devTools.url(port).catch(()=>null));if(join276()||!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(
|
|
26280
26280
|
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.
|
|
26281
26281
|
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\
|
|
26282
26282
|
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:randomUUID63(),
|
|
@@ -26675,12 +26675,12 @@ file2,args,{timeout:EXTRACT_TIMEOUT_MS,windowsHide:!0,maxBuffer:16*1024*1024},er
|
|
|
26675
26675
|
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(
|
|
26676
26676
|
root3)){let part2=join209(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=join209(root3,`${pin.platform}.${tag3}.zip.part`),staging2=join209(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\
|
|
26677
26677
|
s installed");if(await(options2.extract??extractZip2)(archive,staging2),!existsSync81(join209(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===
|
|
26678
|
-
"win32"?win329:posix8;function isHeadlessShell(path6){return/chrome-headless-shell/iu.test(path6)}function installedGoogleChrome(host3){let{join:
|
|
26679
|
-
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(
|
|
26680
|
-
let{basename:
|
|
26681
|
-
platform];if(!layout)return null;let{join:
|
|
26682
|
-
wser-stable"],LINUX_CACHE_EXECUTABLES=["chrome-linux64/chrome","chrome-linux/chrome"];function engineFindsLinuxBrowser(host3){let{join:
|
|
26683
|
-
return cached4(
|
|
26678
|
+
"win32"?win329:posix8;function isHeadlessShell(path6){return/chrome-headless-shell/iu.test(path6)}function installedGoogleChrome(host3){let{join:join276}=paths(host3.platform),candidates=[];if(host3.platform==="darwin"){let registered2=host3.appForBundleId("com.google.Chrome");registered2&&candidates.push(join276(registered2,MAC_CHROME_BINARY)),candidates.push(join276("/Applications/Google Chrome.app",MAC_CHROME_BINARY),join276(host3.home,"Applications/Google Chrome.app",MAC_CHROME_BINARY))}else if(host3.
|
|
26679
|
+
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(join276(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){
|
|
26680
|
+
let{basename:basename38,join:join276}=paths(host3.platform);if(host3.platform==="darwin"){let user=host3.env.USER||basename38(host3.home);return host3.exists(join276(MAC_POLICIES,"com.google.Chrome.plist"))||host3.exists(join276(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.
|
|
26681
|
+
platform];if(!layout)return null;let{join:join276}=paths(host3.platform),browsers=join276(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=>join276(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\
|
|
26682
|
+
wser-stable"],LINUX_CACHE_EXECUTABLES=["chrome-linux64/chrome","chrome-linux/chrome"];function engineFindsLinuxBrowser(host3){let{join:join276}=posix8;if((host3.enginePath?.()??host3.env.PATH??"").split(":").filter(Boolean).some(directory=>LINUX_ENGINE_BROWSERS.some(name6=>host3.exists(join276(directory,name6)))))return!0;let cached4=(directory,prefix)=>host3.list(directory).some(name6=>name6.startsWith(prefix)&&LINUX_CACHE_EXECUTABLES.some(executable=>host3.exists(join276(directory,name6,executable))));
|
|
26683
|
+
return cached4(join276(host3.env.PUPPETEER_CACHE_DIR||join276(host3.home,".cache","puppeteer"),"chrome"),"linux")||cached4(host3.env.PLAYWRIGHT_BROWSERS_PATH||join276(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)
|
|
26684
26684
|
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(
|
|
26685
26685
|
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.
|
|
26686
26686
|
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:"\
|
|
@@ -29152,7 +29152,7 @@ MANAGED_COMPANION_ORIGIN_VERSION?null:normalizeManagedCompanionAccess(credential
|
|
|
29152
29152
|
Email yourself a new code to reconnect.",network_unavailable:"Limix Bot could not reach its secure connection service. Check your internet and try again.",rate_limited:"Too many attempts were made. Wait a little, then try again.",credential_rotation_rate_limited:"This computer was reconnected too often. Wait a little, then try again.",installation_limit_reached:"This account has reached its computer limit. Remove an old computer and try again.",installation_exists:"This computer is already conn\
|
|
29153
29153
|
ected. Try again to recover it.",endpoint_busy:"The secure connection is still being prepared. Try again in a moment.",endpoint_rate_limited:"The secure connection service is busy right now. Local Wi-Fi and Tailscale pairing still work; try again in {wait}.",update_required:"This version of Limix Bot can no longer make secure links. Update Limix Bot, then try again. Local Wi-Fi and Tailscale pairing still work.",endpoint_capacity:"Secure HTTPS links are temporarily full. Try again in {wait}, or \
|
|
29154
29154
|
pair on this Wi-Fi or with Tailscale.",endpoint_unavailable:"The secure connection service could not finish setup. Local Wi-Fi and Tailscale pairing still work. If this keeps happening, contact support with the error reference.",endpoint_cleanup_pending:"The secure connection is still being removed. Try signing out again shortly.",control_plane_unavailable:"Secure access is not available right now. Local pairing still works.",internal_error:"The secure connection service had a problem. Local pai\
|
|
29155
|
-
ring still works; try again.",invalid_response:"The secure connection service returned an unexpected response. Try again.",request_failed:"The secure connection request could not be completed. Local pairing still works; try again."});var DEFAULT_COMPANION_CONTROL_PLANE_URL="https://accounts.
|
|
29155
|
+
ring still works; try again.",invalid_response:"The secure connection service returned an unexpected response. Try again.",request_failed:"The secure connection request could not be completed. Local pairing still works; try again."});var DEFAULT_COMPANION_CONTROL_PLANE_URL="https://accounts.limixmedia.com";var COMPANION_ACCOUNT_EMAIL_FIELD="companionAccountEmail",COMPANION_INSTALLATION_ID_FIELD="companionInstallationId",COMPANION_INSTALLATION_CREDENTIAL_FIELD="companionInstallationCredential";var DEFAULT_AUTO_RETRY_BASE_MS=10*6e4,DEFAULT_AUTO_RETRY_MAX_MS=360*6e4,DEFAULT_ENDPOINT_CHECK_INTERVAL_MS=15*6e4,DEFAULT_FIRST_ENDPOINT_CHECK_MS=2*6e4,DEFAULT_RELEASE_GRACE_MS=60*6e4,DEFAULT_RELEASE_JITTER_MS=180*6e4,REQUEST_WINDOW_MS=60*6e4;function resolveCompanionControlPlaneURL({isPackaged,environment=process.env}={}){return Object.hasOwn(environment,"OMB_CONTROL_PLANE_URL")?normalizeControlPlaneURL(environment.OMB_CONTROL_PLANE_URL):isPackaged?DEFAULT_COMPANION_CONTROL_PLANE_URL:""}import{createHash as createHash107,randomInt,timingSafeEqual as timingSafeEqual13}from"node:crypto";var SIGNIN_CODE_TTL_MS=10*6e4,SIGNIN_CODE_RESEND_MS=3e4,SIGNIN_CODE_TRIES=5,MAX_PENDING2=1e3,SignInMailError=class extends Error{},LOOPBACK7=/^(?:localhost|127(?:\.\d{1,3}){3}|\[::1\])$/i;function smtpOptions2(url2){let parsed2;try{parsed2=new URL(url2)}catch{throw new SignInMailError("OMB_SIGNIN_SMTP_URL is not a URL such as smtps://user:password@smtp.example.com:465")}if(parsed2.protocol!=="smtp\
|
|
29156
29156
|
s:"&&parsed2.protocol!=="smtp:")throw new SignInMailError("OMB_SIGNIN_SMTP_URL must start with smtps:// or smtp://");let secure=parsed2.protocol==="smtps:",user=decodeURIComponent(parsed2.username);return{host:parsed2.hostname.replace(/^\[(.*)\]$/,"$1"),port:Number(parsed2.port)||(secure?465:587),secure,requireTLS:!secure&&!LOOPBACK7.test(parsed2.hostname),...user?{auth:{user,pass:decodeURIComponent(parsed2.password)}}:{},connectionTimeout:1e4,greetingTimeout:1e4,socketTimeout:2e4}}var digest4=code=>createHash107(
|
|
29157
29157
|
"sha256").update(code).digest();function createSignInMail(options2){let now2=options2.now??Date.now,pending3=new Map,transport=options2.transport?Promise.resolve(options2.transport):void 0,from=()=>{let named4=options2.from?.trim()||smtpOptions2(options2.url).auth?.user||"";if(!named4.includes("@"))throw new SignInMailError("set OMB_SIGNIN_SMTP_FROM to the address sign-in codes come from");return named4},prune3=()=>{for(let[email3,entry2]of pending3)now2()-entry2.sentAt>=SIGNIN_CODE_TTL_MS&&pending3.
|
|
29158
29158
|
delete(email3)};return{async send(email3,target4){prune3();let open14=pending3.get(email3);if(open14&&now2()-open14.sentAt<SIGNIN_CODE_RESEND_MS||!open14&&pending3.size>=MAX_PENDING2)return"tooSoon";let sender2=from();transport??=Promise.resolve().then(()=>(init_nodemailer(),nodemailer_exports)).then(({createTransport:createTransport2})=>createTransport2(smtpOptions2(options2.url)));let code=String(randomInt(0,1e8)).padStart(8,"0");pending3.set(email3,{hash:digest4(code),sentAt:now2(),tries:0});
|
|
@@ -29775,23 +29775,27 @@ return json6(res,400,{error:"botIds must be a non-empty array of distinct bot id
|
|
|
29775
29775
|
id)).map(bot=>bot.id);return person2&&deps.own.told(person2,shown3),json6(res,200,{botIds:shown3})}}function createBotLifecycleRoutes(deps){let{store:store5,interruptAllDirectThreads:interruptAllDirectThreads2,cancelDirectTurnDispatch:cancelDirectTurnDispatch2,revokeInternalCapabilitiesForThread:revokeInternalCapabilitiesForThread2,activeGroupTurnForBot:activeGroupTurnForBot2,cancelGroupTurnOperations:cancelGroupTurnOperations2,runningTurnInstance:runningTurnInstance2,closeOpenApprovals:closeOpenApprovals2,deleteBotWithLifecycle:deleteBotWithLifecycle2}=deps;return async({req,res,path:path6,method:method2,
|
|
29776
29776
|
json:json6})=>{let m3=null,routines2=deps.routines();if(method2==="POST"&&path6==="/api/local-computer/interrupt")return String(req.headers["content-type"]??"").toLowerCase().startsWith("application/json")?(await Promise.allSettled(store5.bots.filter(bot=>bot.computer==="local").map(async bot=>{await interruptAllDirectThreads2(bot.id);let routineRun=routines2.activeBotRunForBot(bot.id);routineRun&&(cancelDirectTurnDispatch2(bot.id,routineRun.threadId),routineRun.threadId&&revokeInternalCapabilitiesForThread2(
|
|
29777
29777
|
routineRun.threadId),await routines2.cancelRun(routineRun.id));let groupTurn=activeGroupTurnForBot2(bot.id);groupTurn&&(cancelGroupTurnOperations2(groupTurn.group.id,groupTurn.threadId),revokeInternalCapabilitiesForThread2(groupTurn.threadId),await runningTurnInstance2(bot,groupTurn.threadId)?.adapter.interruptTurn(groupTurn.threadId).catch(()=>{}),closeOpenApprovals2(groupTurn.threadId))})),json6(res,200,{ok:!0})):json6(res,415,{error:"content-type must be application/json"});if(m3=path6.match(
|
|
29778
|
-
/^\/api\/bots\/([\w-]+)$/),m3&&method2==="DELETE"){let result2=await deleteBotWithLifecycle2(m3[1]);return json6(res,result2.status,result2.body)}return PASS}}init_zod();init_new_bot_defaults();
|
|
29778
|
+
/^\/api\/bots\/([\w-]+)$/),m3&&method2==="DELETE"){let result2=await deleteBotWithLifecycle2(m3[1]);return json6(res,result2.status,result2.body)}return PASS}}init_zod();init_new_bot_defaults();import{lstatSync as lstatSync45,readdirSync as readdirSync58,readFileSync as readFileSync182,statSync as statSync47}from"node:fs";import{basename as basename34,isAbsolute as isAbsolute41,join as join252}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=join252(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)):
|
|
29779
|
+
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:readFileSync182(entry2.absolute),executable:entry2.executable===!0}));
|
|
29780
|
+
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(join252(dir,"SKILL.md")).isFile()}catch{return!1}};if(has2(folder3))dirs.push(folder3);else for(let name6 of readdirSync58(folder3)){let sub=join252(folder3,name6);try{statSync47(sub).isDirectory()&&has2(sub)&&dirs.push(sub)}catch{}}
|
|
29781
|
+
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:json6,readBody:readBody2})=>{let m3=null;if(m3=path6.match(/^\/api\/bots\/([\w-]+)\/skill-template$/),m3&&method2==="POST"){if(!store5.bot(m3[1]))return json6(res,404,{error:"no such bot"});let checked=botSkillTemplateSchema.safeParse(await readBody2(req));if(!checked.
|
|
29779
29782
|
success)return json6(res,400,{error:checked.error.message});let input2=checked.data,parsed2=parseSkillMd(input2.text);if("error"in parsed2||parsed2.name!==input2.name)return json6(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 json6(res,422,{error:installed2.error});if(input2.enabled){let enabled=setSkillEnabled(m3[1],input2.name,!0);if("error"in enabled)return json6(
|
|
29780
29783
|
res,422,{error:enabled.error})}return json6(res,201,{installed:installed2})}if(m3=path6.match(/^\/api\/bots\/([\w-]+)\/skills$/),m3&&method2==="GET"){let bot=store5.bot(m3[1]);if(!bot)return json6(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));
|
|
29781
29784
|
return json6(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 json6(res,200,{skills:listBotSkills2(bot,threadId),staged:listStagedSkillWrites(m3[1]).map(stagedSkillListing2)})}if(m3&&method2==="POST"){if(!store5.bot(m3[1]))return json6(res,404,{error:"no such bot"});let parsed2=external_exports.object({source:external_exports.
|
|
29782
|
-
string().min(1).max(2e3)}).safeParse(await readBody2(req));if(!parsed2.success)return json6(res,400,{error:"source must be a GitHub or skills.sh URL, or owner/repo"});let fetched=await fetchSkillFromSource(parsed2.data.source);if("error"in fetched)return json6(res,422,{error:fetched.error});let results=fetched.skills.map(skill=>({skill,result:installSkill(m3[1],skill.source,skill.files,skill.github)})),
|
|
29783
|
-
flatMap(({skill,result:result2})=>"error"in result2?[]:[{skill,installed:result2}]);if(!done.length)return json6(res,422,{error:errors2.join("; ")||"nothing importable found"});let imported=done.map(({skill,installed:installed2})=>skillImportSummary(installed2.name,skill.files,skill.skipped));return json6(res,201,{installed:done.map(({installed:installed2})=>installed2),imported,errors:errors2})}if(m3=
|
|
29784
|
-
bot(m3[1]),text30=bot?readBotSkillFile2(bot,m3[2]):null;return text30===null?json6(res,404,{error:"no such skill"}):json6(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 json6(res,400,{error:"enabled must be true or false"});let bot=store5.bot(m3[1]);if(bot&&listBotSkills2(
|
|
29785
|
-
bot.id,m3[2],parsed2.data.enabled);return"error"in result3?json6(res,409,{error:result3.error}):json6(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 json6(res,409,{error:result3.error});let skill=listBotSkills2(bot).find(entry2=>entry2.name===
|
|
29786
|
-
m3[1],m3[2],parsed2.data.enabled);return"error"in result2?json6(res,404,{error:result2.error}):json6(res,200,{skill:result2})}if(m3&&method2==="DELETE"){let bot=store5.bot(m3[1]);if(!bot)return json6(res,404,{error:"no such bot"});let name6=m3[2],removed=removeSkill(bot.id,name6);if(!("error"in removed))return json6(res,200,{ok:!0});if(skillsLibraryEnabled(cfg2)){let unassigned=unassignLibrarySkill(
|
|
29787
|
-
store5.patchBot(bot.id,{assignedSkills:unassigned.assignedSkills}),json6(res,200,{ok:!0})}let origin2=listBotSkills2(bot).find(skill=>skill.name===name6)?.origin;return origin2==="imported"?json6(res,404,{error:`"${name6}" comes from this computer and can't be removed from one bot. Turn it off instead.`}):origin2==="native"?json6(res,404,{error:`"${name6}" comes from this bot's engine and can't be
|
|
29788
|
-
m3&&method2==="GET"){if(!skillsLibraryEnabled(cfg2))return json6(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?.
|
|
29789
|
-
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 json6(res,200,{skills})}if(m3&&method2==="POST"){
|
|
29790
|
-
object({text:external_exports.string().min(1)}).safeParse(await readBody2(req));if(!parsed2.success)return json6(res,400,{error:"text must be the SKILL.md contents to import"});let skill=parseSkillMd(parsed2.data.text);if("error"in skill)return json6(res,400,{error:skill.error});let installed2=installLibrarySkill({name:skill.name,instructions:parsed2.data.text,source:"local-
|
|
29791
|
-
disabled"});return"error"in installed2?json6(res,422,{error:installed2.error}):json6(res,201,{skill:installed2})}if(m3=path6.match(/^\/api\/skills-library\/([a-z0-9-]+)$/),m3&&method2==="GET"){if(!skillsLibraryEnabled(cfg2))return json6(res,404,{error:"skills library is not enabled"});let text30=readLibrarySkillFile(m3[1]);return text30===null?json6(res,404,{error:"
|
|
29792
|
-
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 json6(res,400,{error:"enabled or everyBot must be true or false"});let result2=parsed2.
|
|
29793
|
-
parsed2.data.everyBot);return"error"in result2?json6(res,404,{error:result2.error}):json6(res,200,{skill:result2})}if(m3=path6.match(/^\/api\/bots\/([\w-]+)\/skills-library$/),m3&&method2==="PUT"){if(!skillsLibraryEnabled(cfg2))return json6(res,404,{error:"skills library is not enabled"});if(!store5.bot(m3[1]))return json6(res,404,{error:"no such bot"});let parsed2=external_exports.
|
|
29794
|
-
req));if(!parsed2.success)return json6(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 json6(res,422,{error:"not in the library: "+unknown2.join(", ")});for(let name6 of names5)setLibrarySkillOptOut(m3[1],name6,!1);return store5.
|
|
29785
|
+
string().min(1).max(2e3)}).safeParse(await readBody2(req));if(!parsed2.success)return json6(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 json6(res,422,{error:fetched.error});let results=fetched.skills.map(skill=>({skill,result:installSkill(m3[1],skill.source,skill.files,skill.github)})),
|
|
29786
|
+
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 json6(res,422,{error:errors2.join("; ")||"nothing importable found"});let imported=done.map(({skill,installed:installed2})=>skillImportSummary(installed2.name,skill.files,skill.skipped));return json6(res,201,{installed:done.map(({installed:installed2})=>installed2),imported,errors:errors2})}if(m3=
|
|
29787
|
+
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?json6(res,404,{error:"no such skill"}):json6(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 json6(res,400,{error:"enabled must be true or false"});let bot=store5.bot(m3[1]);if(bot&&listBotSkills2(
|
|
29788
|
+
bot).some(skill=>skill.name===m3[2]&&skill.origin==="imported")){let result3=setImportedSkillEnabled(bot.id,m3[2],parsed2.data.enabled);return"error"in result3?json6(res,409,{error:result3.error}):json6(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 json6(res,409,{error:result3.error});let skill=listBotSkills2(bot).find(entry2=>entry2.name===
|
|
29789
|
+
m3[2]);return skill?json6(res,200,{skill}):json6(res,404,{error:"no such skill"})}let result2=setSkillEnabled(m3[1],m3[2],parsed2.data.enabled);return"error"in result2?json6(res,404,{error:result2.error}):json6(res,200,{skill:result2})}if(m3&&method2==="DELETE"){let bot=store5.bot(m3[1]);if(!bot)return json6(res,404,{error:"no such bot"});let name6=m3[2],removed=removeSkill(bot.id,name6);if(!("error"in removed))return json6(res,200,{ok:!0});if(skillsLibraryEnabled(cfg2)){let unassigned=unassignLibrarySkill(
|
|
29790
|
+
bot.id,name6,bot.assignedSkills);if("unassigned"in unassigned)return"assignedSkills"in unassigned&&store5.patchBot(bot.id,{assignedSkills:unassigned.assignedSkills}),json6(res,200,{ok:!0})}let origin2=listBotSkills2(bot).find(skill=>skill.name===name6)?.origin;return origin2==="imported"?json6(res,404,{error:`"${name6}" comes from this computer and can't be removed from one bot. Turn it off instead.`}):origin2==="native"?json6(res,404,{error:`"${name6}" comes from this bot's engine and can't be \
|
|
29791
|
+
removed here.`}):json6(res,404,{error:removed.error})}if(m3=path6.match(/^\/api\/skills-library$/),m3&&method2==="GET"){if(!skillsLibraryEnabled(cfg2))return json6(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?.
|
|
29792
|
+
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 json6(res,200,{skills})}if(m3&&method2==="POST"){
|
|
29793
|
+
if(!skillsLibraryEnabled(cfg2))return json6(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 json6(res,400,{error:"text must be the SKILL.md contents to import"});let skill=parseSkillMd(parsed2.data.text);if("error"in skill)return json6(res,400,{error:skill.error});let installed2=installLibrarySkill({name:skill.name,instructions:parsed2.data.text,source:"local-i\
|
|
29794
|
+
mport",license:skill.license,compatibility:skill.compatibility,tags:skill.tags,warnings:scanSkillText(parsed2.data.text),reviewState:"disabled"});return"error"in installed2?json6(res,422,{error:installed2.error}):json6(res,201,{skill:installed2})}if(m3=path6.match(/^\/api\/skills-library\/([a-z0-9-]+)$/),m3&&method2==="GET"){if(!skillsLibraryEnabled(cfg2))return json6(res,404,{error:"skills library is not enabled"});let text30=readLibrarySkillFile(m3[1]);return text30===null?json6(res,404,{error:"\
|
|
29795
|
+
no such skill"}):json6(res,200,{text:text30})}if(m3&&method2==="PATCH"){if(!skillsLibraryEnabled(cfg2))return json6(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 json6(res,400,{error:"enabled or everyBot must be true or false"});let result2=parsed2.
|
|
29796
|
+
data.enabled!==void 0?setLibrarySkillReviewState(m3[1],parsed2.data.enabled?"approved":"disabled"):setLibrarySkillEveryBot(m3[1],parsed2.data.everyBot);return"error"in result2?json6(res,404,{error:result2.error}):json6(res,200,{skill:result2})}if(m3=path6.match(/^\/api\/bots\/([\w-]+)\/skills-library$/),m3&&method2==="PUT"){if(!skillsLibraryEnabled(cfg2))return json6(res,404,{error:"skills library is not enabled"});if(!store5.bot(m3[1]))return json6(res,404,{error:"no such bot"});let parsed2=external_exports.
|
|
29797
|
+
object({skills:external_exports.array(external_exports.string().min(1).max(64)).max(200)}).safeParse(await readBody2(req));if(!parsed2.success)return json6(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 json6(res,422,{error:"not in the library: "+unknown2.join(", ")});for(let name6 of names5)setLibrarySkillOptOut(m3[1],name6,!1);return store5.
|
|
29798
|
+
patchBot(m3[1],{assignedSkills:names5}),json6(res,200,{assignedSkills:names5})}return PASS}}function createSkillShareRoutes(deps){return async({req,res,path:path6,method:method2,auth,json:json6,readBody:readBody2})=>{if(method2!=="POST")return PASS;let m3=path6.match(/^\/api\/threads\/([\w-]+)\/share-skill$/);if(m3){if(!deps.enabled())return json6(res,404,{error:"sharing learned skills is not enabled"});let body2=await readBody2(req),requestId=typeof body2?.requestId=="string"?body2.requestId:"";if(!requestId)return json6(res,400,{error:"requestId is required"});let refusal7=deps.cardRefusal(
|
|
29795
29799
|
auth,m3[1],requestId);if(refusal7)return json6(res,403,{error:refusal7});let result2=deps.shareFromReceipt(m3[1],requestId);return result2.ok?json6(res,200,{ok:!0,shared:result2.shared}):json6(res,result2.status,{error:result2.error})}if(m3=path6.match(/^\/api\/bots\/([\w-]+)\/skills\/([a-z0-9-]+)\/share$/),m3){if(!deps.enabled())return json6(res,404,{error:"sharing learned skills is not enabled"});if(!deps.botExists(m3[1]))return json6(res,404,{error:"no such bot"});let shared=deps.shareFromBot(
|
|
29796
29800
|
m3[1],m3[2]);return"error"in shared?json6(res,422,{error:shared.error}):json6(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:json6,readBody:readBody2})=>{let m3=null;if(path6==="/api/team-memory"&&(method2==="GET"||method2==="POST")){if(!url2.searchParams.has("section"))return json6(res,400,{error:"section is required"});let section4=sectionContextKey(url2.searchParams.get("section")??"");if(section4&&!store5.sections.includes(section4))return json6(res,404,userError("serve\
|
|
29797
29801
|
rError.department.notFound"));if(section4.length>60)return json6(res,400,{error:"section must be at most 60 characters"});if(method2==="GET")return json6(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 json6(res,400,{error:`kind must be one of ${TEAM_MEMORY_KINDS.join("\
|
|
@@ -29802,7 +29806,7 @@ accept===!0){if(!teamMemory2.resolve(section4,m3[1],"accept",body2.expectedRevis
|
|
|
29802
29806
|
success)return json6(res,400,{error:"Invalid memory edit"});if(!teamMemory2.update(section4,m3[1],parsed2.data,body2.expectedRevision))return json6(res,404,{error:"no such entry"})}return json6(res,200,{entries:teamMemory2.list(section4),loadedIds:teamMemory2.promptSelection(section4).loadedIds})}catch(error66){return json6(res,error66 instanceof TeamMemoryConflict?409:400,{error:error66 instanceof Error?error66.message:String(error66),...userErrorFields(error66)})}}if(path6==="/api/section-cont\
|
|
29803
29807
|
ext"&&(method2==="GET"||method2==="PUT")){if(!url2.searchParams.has("section"))return json6(res,400,{error:"section is required"});let requested=url2.searchParams.get("section")??"",section4=sectionContextKey(requested);if(section4.length>60)return json6(res,400,{error:"section must be at most 60 characters"});if(!(section4===""||store5.sections.includes(section4)||store5.bots.some(bot=>!bot.hidden&§ionKey2(bot.section)===section4)||store5.groups.some(group2=>sectionKey2(group2.section)===section4)))
|
|
29804
29808
|
return json6(res,404,userError("serverError.department.missing"));if(method2==="GET"){let context4=readSectionContext(section4);return json6(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 json6(res,400,{error:"text must be a string"});if(Buffer.byteLength(parsed2.
|
|
29805
|
-
data.text,"utf8")>SECTION_CONTEXT_MAX_BYTES)return json6(res,400,{error:`section context is capped at ${SECTION_CONTEXT_MAX_BYTES/1e3}KB`});let context3=writeSectionContext(section4,parsed2.data.text);return json6(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 createHash116}from"node:crypto";import{readFileSync as
|
|
29809
|
+
data.text,"utf8")>SECTION_CONTEXT_MAX_BYTES)return json6(res,400,{error:`section context is capped at ${SECTION_CONTEXT_MAX_BYTES/1e3}KB`});let context3=writeSectionContext(section4,parsed2.data.text);return json6(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 createHash116}from"node:crypto";import{readFileSync as readFileSync183}from"node:fs";import{join as join253}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\
|
|
29806
29810
|
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",
|
|
29807
29811
|
"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)}
|
|
29808
29812
|
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[
|
|
@@ -29810,7 +29814,7 @@ function rankAppSuggestions(input2){let bySlug=new Map(input2.catalog.map(card=>
|
|
|
29810
29814
|
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.
|
|
29811
29815
|
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{
|
|
29812
29816
|
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)}).
|
|
29813
|
-
optional()});function createAppSuggestions(deps){let now2=deps.now??Date.now,file2=
|
|
29817
|
+
optional()});function createAppSuggestions(deps){let now2=deps.now??Date.now,file2=join253(deps.dataDir,SUGGESTIONS_FILE),state={version:1,wanted:[]};try{let parsed2=stateSchema5.safeParse(JSON.parse(readFileSync183(file2,"utf8")));parsed2.success&&(state=parsed2.data)}catch{}let save7=()=>{try{writeFileAtomic(file2,`${JSON.stringify(state)}
|
|
29814
29818
|
`,{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)&¬eWanted(
|
|
29815
29819
|
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||
|
|
29816
29820
|
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:"\
|
|
@@ -29825,28 +29829,28 @@ he app is for."});let bot=deps.bot(deps.botId);return bot?json6(res,200,{text:aw
|
|
|
29825
29829
|
key!="string")return json6(res,400,{error:"key must be a string"});let draft=typeof body2?.key=="string"?body2.key.trim():"";if(draft.length>MAX_KEY_LENGTH)return json6(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())))
|
|
29826
29830
|
return json6(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 json6(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(
|
|
29827
29831
|
{...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?json6(res,200,{ok:!0,latencyMs:result2.latencyMs,...extraction}):json6(res,200,{ok:!1,reason:result2.
|
|
29828
|
-
reason,...result2.status?{status:result2.status}:{},...extraction})}}init_zod();init_bot_avatar();init_zod();import{createHash as createHash117,randomUUID as randomUUID80}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
|
|
29832
|
+
reason,...result2.status?{status:result2.status}:{},...extraction})}}init_zod();init_bot_avatar();init_zod();import{createHash as createHash117,randomUUID as randomUUID80}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 join254}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(
|
|
29829
29833
|
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=createHash117("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=>{
|
|
29830
|
-
let names5;try{names5=(await readdir13(
|
|
29831
|
-
|
|
29832
|
-
"tmp","move-files"),partialPath=(dataDir,sha2567,size3)=>
|
|
29833
|
-
(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=
|
|
29834
|
+
let names5;try{names5=(await readdir13(join254(dataDir,relative27))).sort()}catch{return}for(let name6 of names5){if(out.length>=MAX_FILES3)return;let path6=`${relative27}/${name6}`,info2=await lstat10(join254(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(
|
|
29835
|
+
join254(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=>join254(dataDir,
|
|
29836
|
+
"tmp","move-files"),partialPath=(dataDir,sha2567,size3)=>join254(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(join254(folder3,name6)).catch(()=>null);info2&&now2-info2.mtimeMs>PARTIAL_MAX_AGE_MS&&await unlink7(join254(folder3,name6)).catch(()=>{})}}function rawBody(req,limit2){return new Promise(
|
|
29837
|
+
(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=join254(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}
|
|
29834
29838
|
return(await lstat10(at8).catch(()=>null))?.isDirectory()===!0}async function sha256Of(full){try{let hash4=createHash117("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(
|
|
29835
|
-
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=
|
|
29839
|
+
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=join254(at8,part2);let info2=await lstat10(at8).catch(()=>null);
|
|
29836
29840
|
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(
|
|
29837
29841
|
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,
|
|
29838
|
-
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=
|
|
29839
|
-
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=
|
|
29842
|
+
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=join254(deps.
|
|
29843
|
+
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=join254(staging(deps.dataDir),`${randomUUID80()}.placing`);return await link4(partial2,placed),
|
|
29840
29844
|
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:json6}){if(path6!=="/api/cloud-send/files")return!1;if(res.setHeader(
|
|
29841
29845
|
"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):(json6(res,404,{error:"no such bot file"}),!0)}if(method2==="GET")return await tidyPartials(deps.dataDir),json6(res,200,
|
|
29842
29846
|
{v:1,files:await listBotFiles(deps.dataDir,deps.bots().map(bot=>bot.id)),space:space(deps.dataDir)}),!0;if(method2!=="POST")return json6(res,405,{error:"method not allowed"}),!0;if(!deps.owner(auth))return await rawBody(req,0),json6(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),json6(res,400,{error:"send ?path, size, sha256, offset and mode"}),!0;let answer2=await takePart(
|
|
29843
29847
|
deps,req,query2.data);return json6(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)},
|
|
29844
29848
|
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:json6,readBody:readBody2}){if(path6!=="/api/cloud-send/lease")return!1;if(res.setHeader("cache-control","no-store"),method2!=="POST")return json6(res,405,{error:"method not allowed"}),!0;if(!deps.owner(auth))return req.resume(),json6(res,403,{error:"Only My Cloud's owner can move into it."}),!0;let asked=askSchema2.safeParse(
|
|
29845
|
-
await readBody2(req,4096));if(!asked.success)return json6(res,400,{error:"send { v: 1, holder, label }"}),!0;let{holder,label:label4="",release:release3}=asked.data;if(release3)return deps.leases.release(holder),json6(res,200,{v:1,held:!1}),!0;let other=deps.leases.ask(holder,label4.trim());return other?(json6(res,409,{v:1,held:!1,label:other.label,until:other.until}),!0):(json6(res,200,{v:1,held:!0,until:deps.leases.held()?.until??null}),!0)}init_zod();import{createHash as createHash118}from"node:crypto";import{lstatSync as
|
|
29849
|
+
await readBody2(req,4096));if(!asked.success)return json6(res,400,{error:"send { v: 1, holder, label }"}),!0;let{holder,label:label4="",release:release3}=asked.data;if(release3)return deps.leases.release(holder),json6(res,200,{v:1,held:!1}),!0;let other=deps.leases.ask(holder,label4.trim());return other?(json6(res,409,{v:1,held:!1,label:other.label,until:other.until}),!0):(json6(res,200,{v:1,held:!0,until:deps.leases.held()?.until??null}),!0)}init_zod();import{createHash as createHash118}from"node:crypto";import{lstatSync as lstatSync46,readdirSync as readdirSync59,readFileSync as readFileSync184}from"node:fs";import{hostname as hostname8}from"node:os";import{join as join255}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=[
|
|
29846
29850
|
"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(
|
|
29847
29851
|
name6=>[name6,structuredClone(source4[name6])])),sha2566=value3=>createHash118("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),
|
|
29848
|
-
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=
|
|
29849
|
-
if(info2.isDirectory()){if(!walk6(full,path6,depth2+1))return!1;continue}if(!info2.isFile())return!1;let content4=
|
|
29852
|
+
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=join255(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=join255(folder3,entry2),path6=prefix?`${prefix}/${entry2}`:entry2,info2=lstatSync46(full);
|
|
29853
|
+
if(info2.isDirectory()){if(!walk6(full,path6,depth2+1))return!1;continue}if(!info2.isFile())return!1;let content4=readFileSync184(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(
|
|
29850
29854
|
b11.path)).map(file2=>`${file2.executable?"x":"-"} ${file2.path} ${sha2566(file2.content)}`)];return sha2566(lines.join(`
|
|
29851
29855
|
`)).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=>{
|
|
29852
29856
|
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(
|
|
@@ -29916,9 +29920,9 @@ deps.cloudHome&&deps.automations&&await automationsOffRoute({automations:deps.au
|
|
|
29916
29920
|
...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}:{}})})):json6(res,404,{error:"not found"});if(path6==="/api/cloud-send/verify-secrets"){if(!home2||!deps.connectionFingerprints)return json6(res,404,{error:"not\
|
|
29917
29921
|
found"});if(method2!=="POST")return json6(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"),json6(res,200,{v:1,vault:1,secrets:{...loginFingerprints(asked.data.nonce,deps.logins),...deps.connectionFingerprints(asked.data.nonce)}})):json6(res,400,{error:"send { nonce }: at least 32 random bytes, base64url"})}if(path6!=="\
|
|
29918
29922
|
/api/cloud-send")return PASS;if(method2!=="GET")return json6(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 json6(res,200,{...summary3,items,vault:1,...deps.
|
|
29919
|
-
chats?{chats:1}:{}})}}import{hostname as hostname9}from"node:os";import{join as
|
|
29923
|
+
chats?{chats:1}:{}})}}import{hostname as hostname9}from"node:os";import{join as join256}from"node:path";init_mcp_registry();init_tool_scope();init_atomic();import{readFileSync as readFileSync185}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.
|
|
29920
29924
|
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}\
|
|
29921
|
-
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(
|
|
29925
|
+
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(readFileSync185(
|
|
29922
29926
|
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.
|
|
29923
29927
|
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.
|
|
29924
29928
|
some(connector=>serves(bot,connector)));if(!speaker2)return;let lines=left2.filter(connector=>serves(speaker2,connector)),link5=lines.some(connector=>connector.why.kind==="mail")?`
|
|
@@ -29947,13 +29951,13 @@ return adopted.ok?json6(res,200,{[adopted.outcome]:!0}):json6(res,adopted.status
|
|
|
29947
29951
|
outcome;try{outcome="share"in asked?await deps.adoptShare(asked.share):await deps.adoptOwn(asked.apiKey,asked.userId)}catch(error66){return json6(res,502,{error:error66 instanceof Error&&error66.message?error66.message.slice(0,300):"Connected apps could not be shared."})}if("shared"in outcome)return json6(res,200,{shared:!0});let wanted=[...new Set(asked.apps??[])],connected=wanted.length?await deps.composioConnected(wanted).catch(()=>({})):{};return json6(res,200,{kept:!0,missing:wanted.filter(
|
|
29948
29952
|
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.
|
|
29949
29953
|
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&&
|
|
29950
|
-
deps.stayedNotices?createStayedNotices({...deps.stayedNotices,origin:deps.cloudHome.publicOrigin,file:
|
|
29954
|
+
deps.stayedNotices?createStayedNotices({...deps.stayedNotices,origin:deps.cloudHome.publicOrigin,file:join256(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(
|
|
29951
29955
|
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(
|
|
29952
29956
|
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(
|
|
29953
29957
|
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())}:
|
|
29954
29958
|
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:json6})=>{if(path6!=="/api/updates/check"||method2!=="GET")return PASS;try{return json6(res,200,await deps.check())}catch(error66){return json6(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({
|
|
29955
|
-
res,path:path6,method:method2,json:json6})=>path6!=="/api/seats"||method2!=="GET"?PASS:json6(res,200,{seats:seatCount(deps.signInList(),deps.sessions())})}init_atomic();import{readFileSync as
|
|
29956
|
-
"UTC")}function adoptSavedTimeZone(dataDir,env=process.env){let saved;try{saved=JSON.parse(
|
|
29959
|
+
res,path:path6,method:method2,json:json6})=>path6!=="/api/seats"||method2!=="GET"?PASS:json6(res,200,{seats:seatCount(deps.signInList(),deps.sessions())})}init_atomic();import{readFileSync as readFileSync186}from"node:fs";import{join as join257}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||
|
|
29960
|
+
"UTC")}function adoptSavedTimeZone(dataDir,env=process.env){let saved;try{saved=JSON.parse(readFileSync186(join257(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(join257(dataDir,TIME_ZONE_FILE),`${JSON.stringify({version:1,timeZone:zone})}
|
|
29957
29961
|
`,{mode:384}),env.TZ=zone,!0)}function createTimeZoneRoutes(deps){return deps.adopts&&adoptSavedTimeZone(deps.dataDir),async({req,res,path:path6,method:method2,json:json6,readBody:readBody2})=>{if(path6!=="/api/time-zone")return PASS;if(method2==="GET")return json6(res,200,{timeZone:currentTimeZone(),adopts:deps.adopts});if(method2!=="PUT")return PASS;if(!deps.adopts)return json6(res,409,{error:"This computer tells time in its own time zone."});let zone=knownTimeZone((await readBody2(req,4096))?.timeZone);if(!zone)return json6(
|
|
29958
29962
|
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),json6(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){
|
|
29959
29963
|
return async({req,res,url:url2,path:path6,method:method2,json:json6,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 json6(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 json6(res,target5.status,{error:target5.error});res.setHeader(
|
|
@@ -30001,7 +30005,7 @@ let asked=answers===void 0?void 0:deps.node(answers),requester=asked?.parentId==
|
|
|
30001
30005
|
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.
|
|
30002
30006
|
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},
|
|
30003
30007
|
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(
|
|
30004
|
-
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 randomUUID81}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
|
|
30008
|
+
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 randomUUID81}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 join258}from"node:path";import{DatabaseSync as DatabaseSync8}from"node:sqlite";var EMPTY8={queued:0,running:0,done:0,failed:0,cancelled:0},SCHEMA2=`
|
|
30005
30009
|
CREATE TABLE IF NOT EXISTS bursts (
|
|
30006
30010
|
id TEXT PRIMARY KEY,
|
|
30007
30011
|
json TEXT NOT NULL,
|
|
@@ -30017,7 +30021,7 @@ CREATE TABLE IF NOT EXISTS burst_children (
|
|
|
30017
30021
|
PRIMARY KEY (burst_id, seq)
|
|
30018
30022
|
);
|
|
30019
30023
|
CREATE INDEX IF NOT EXISTS burst_children_status ON burst_children(burst_id, status, seq);
|
|
30020
|
-
`,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 file2=dataDir===":memory:"?":memory:":
|
|
30024
|
+
`,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 file2=dataDir===":memory:"?":memory:":join258(dataDir,"bursts.db");file2!==":memory:"&&(mkdirSync120(dirname78(file2),{recursive:!0}),closeSync37(openSync34(file2,"a",384)),chmodSync16(file2,384));let db2=new DatabaseSync8(file2);db2.exec("PRAGMA journal_mode = WAL"),db2.exec(SCHEMA2);let rows2={
|
|
30021
30025
|
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\
|
|
30022
30026
|
< ?"),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\
|
|
30023
30027
|
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.
|
|
@@ -30190,17 +30194,17 @@ push({slug:slug3,name:name6,category:text28(raw.category,80)??"",integrations:Ar
|
|
|
30190
30194
|
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(
|
|
30191
30195
|
`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\
|
|
30192
30196
|
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,
|
|
30193
|
-
...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
|
|
30194
|
-
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(
|
|
30195
|
-
d"))??readText7(
|
|
30197
|
+
...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 readFileSync187,readdirSync as readdirSync60,statSync as statSync48}from"node:fs";import{basename as basename35,join as join259}from"node:path";var MAX_FILE_BYTES3=256e3,MAX_DIR_ENTRIES=400;function readText7(path6){try{return statSync48(path6).size>MAX_FILE_BYTES3?null:readFileSync187(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(join259(cwd,"package.json"));if(!raw)return{deps:new Set};try{let parsed2=JSON.parse(raw);if(!parsed2||
|
|
30198
|
+
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(join259(cwd,"README.m\
|
|
30199
|
+
d"))??readText7(join259(cwd,"readme.md"))??readText7(join259(cwd,"README"));if(!raw)return{};let title3,summary3;for(let line6 of raw.slice(0,64e3).split(`
|
|
30196
30200
|
`)){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",
|
|
30197
30201
|
"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",
|
|
30198
30202
|
"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\
|
|
30199
|
-
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(
|
|
30203
|
+
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(join259(
|
|
30200
30204
|
cwd,"requirements.txt"))??""}
|
|
30201
|
-
${readText7(
|
|
30202
|
-
path6);found2&&evidence.push(found2)}if(detector.role==="docs"&&evidence.length>0){let hasMkdocs=evidence.includes("mkdocs.yml"),hasMarkdown=listNames2(
|
|
30203
|
-
stacks.push(marker.stack)}return{name:(md2.title??pkg2.name??
|
|
30205
|
+
${readText7(join259(cwd,"pyproject.toml"))??""}`.toLowerCase(),hasDep=dep=>pkg2.deps.has(dep)||pythonDeps.length>1&&pythonDeps.includes(dep),pathEvidence=path6=>path6.includes("/")?isDir(join259(cwd,path6))&&listNames2(join259(cwd,path6)).length>0?`${path6}/`:null:entries4.has(path6)?isDir(join259(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(
|
|
30206
|
+
path6);found2&&evidence.push(found2)}if(detector.role==="docs"&&evidence.length>0){let hasMkdocs=evidence.includes("mkdocs.yml"),hasMarkdown=listNames2(join259(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)&&
|
|
30207
|
+
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\
|
|
30204
30208
|
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\
|
|
30205
30209
|
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\
|
|
30206
30210
|
ith its rollback story.`},testing:{name:"Probe",title:"Test Engineer",color:"green",describe:(profile,evidence)=>`You guard ${profile.name} with tests: you reproduce bugs before they are fixed and extend coverage where changes land.${stackLine(profile)} Your turf shows up as ${evidence.join(", ")}. A red test you wrote is worth more than a green suite nobody trusts.`},infra:{name:"Anchor",title:"Infra & CI",color:"orange",describe:(profile,evidence)=>`You keep ${profile.name} buildable, shippabl\
|
|
@@ -30283,11 +30287,11 @@ Connection: Upgrade\r
|
|
|
30283
30287
|
Sec-WebSocket-Accept: ${accept}\r
|
|
30284
30288
|
\r
|
|
30285
30289
|
`),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.
|
|
30286
|
-
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
|
|
30290
|
+
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 join260}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}};
|
|
30287
30291
|
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\
|
|
30288
30292
|
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!=
|
|
30289
30293
|
"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 file2=>({name:file2.name,bytes:new Uint8Array(await file2.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(
|
|
30290
|
-
files2,
|
|
30294
|
+
files2,join260(deps.dataDir,"browser-uploads"));if(await deps.viewers.answerFileChooser(browser,owner2,chooser,paths2).catch(()=>!1))return null;for(let file2 of paths2)rmSync65(dirname79(file2),{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:json6,readBody:readBody2})=>{let live2=LIVE2.exec(path6),stream2=live2?
|
|
30291
30295
|
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 json6(res,405,{error:"method not allowed"});if(!pending3)return json6(res,426,{error:"WebSocket upgrade required"});if(!isSameOrigin(req))return json6(res,403,{error:"\
|
|
30292
30296
|
forbidden: cross-origin request"})}let threadId=url2.searchParams.get("threadId"),audience2=deps.audience(auth,threadId);if(!audience2)return json6(res,404,{error:"no such conversation"});let browser=await deps.browser(botId,audience2);if("error"in browser)return json6(res,browser.status,{error:browser.error});let failure11=await deps.authorize(req,auth);if(failure11)return json6(res,failure11.status,{error:failure11.error});let owner2=ownerOf2(auth),person2=deps.person(auth),isCurrent=()=>deps.
|
|
30293
30297
|
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\
|
|
@@ -30355,14 +30359,14 @@ o your key is not sent in the clear.${TYPE_MODEL}`);let response;try{response=aw
|
|
|
30355
30359
|
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\
|
|
30356
30360
|
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(
|
|
30357
30361
|
"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./+-]*$/:
|
|
30358
|
-
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 randomUUID84}from"node:crypto";import{join as
|
|
30362
|
+
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 randomUUID84}from"node:crypto";import{join as join262}from"node:path";init_zod();import{randomUUID as randomUUID83}from"node:crypto";import{join as join261}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(
|
|
30359
30363
|
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(),
|
|
30360
30364
|
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\
|
|
30361
30365
|
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.
|
|
30362
30366
|
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.
|
|
30363
30367
|
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"?{}:
|
|
30364
30368
|
{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.
|
|
30365
|
-
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-${randomUUID83()}`,cli=inheritedCli(instances),entry2={driver:"claudeAgent",displayName:body2.displayName,access:"custom",config:{...cli?{cli}:{},configDir:
|
|
30369
|
+
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-${randomUUID83()}`,cli=inheritedCli(instances),entry2={driver:"claudeAgent",displayName:body2.displayName,access:"custom",config:{...cli?{cli}:{},configDir:join261(DATA_DIR,"providers",instanceId),requireApiKey:!0,endpointModels:body2.
|
|
30366
30370
|
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\
|
|
30367
30371
|
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.
|
|
30368
30372
|
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)
|
|
@@ -30370,16 +30374,16 @@ throw Object.assign(new Error("Enter the endpoint's token."),{status:400});retur
|
|
|
30370
30374
|
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(
|
|
30371
30375
|
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}):
|
|
30372
30376
|
described}function newCodexEndpoint(cfg2,body2){let instances=persistableInstanceConfigs(cfg2),instanceId=`codex-endpoint-${randomUUID84()}`,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(
|
|
30373
|
-
!0)}}},environment:{CODEX_HOME:
|
|
30377
|
+
!0)}}},environment:{CODEX_HOME:join262(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.
|
|
30374
30378
|
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:{
|
|
30375
|
-
...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 randomUUID86}from"node:crypto";init_zod();import{randomUUID as randomUUID85}from"node:crypto";import{join as
|
|
30379
|
+
...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 randomUUID86}from"node:crypto";init_zod();import{randomUUID as randomUUID85}from"node:crypto";import{join as join263}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\
|
|
30376
30380
|
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.
|
|
30377
30381
|
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\
|
|
30378
30382
|
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??
|
|
30379
30383
|
"",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(
|
|
30380
30384
|
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()??"").
|
|
30381
30385
|
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-${randomUUID85()}`,cli=inheritedCli2(instances),entry2={driver:"claudeAgent",displayName:body2.
|
|
30382
|
-
displayName,access:"custom",config:{...cli?{cli}:{},configDir:
|
|
30386
|
+
displayName,access:"custom",config:{...cli?{cli}:{},configDir:join263(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});
|
|
30383
30387
|
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!==
|
|
30384
30388
|
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):
|
|
30385
30389
|
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(
|
|
@@ -30451,12 +30455,12 @@ added("mcp",name6,auth.kind==="session"?auth.session.email??null:null),answer2(r
|
|
|
30451
30455
|
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}})):json6(res,415,{error:"content-type must be application/json"});let mcpServerRoute=/^\/api\/mcp\/servers\/([a-z][a-z0-9_-]{0,31})$/.
|
|
30452
30456
|
exec(path6);if(mcpServerRoute&&["PUT","PATCH","DELETE"].includes(method2)){if(method2!=="DELETE"&&!String(req.headers["content-type"]??"").toLowerCase().startsWith("application/json"))return json6(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,json6,removed)}let body2=await readBody2(req),current3=cfg2.mcpServers??{};if(!Object.
|
|
30453
30457
|
hasOwn(current3,name6))return json6(res,404,{error:mcpServerNotFound(name6)});let existing=parseStoredMcpServer(name6,current3[name6]);if(!existing.ok)return json6(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"?json6(res,400,{error:"Only an enabled or apps boolean can be changed here."}):answer2(res,
|
|
30454
|
-
json6,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,json6,config3.replace(name6,parsed2.server,vaultKeysOf(body2,ownsVault()))):json6(res,400,{error:parsed2.error})}return PASS}}import{join as
|
|
30458
|
+
json6,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,json6,config3.replace(name6,parsed2.server,vaultKeysOf(body2,ownsVault()))):json6(res,400,{error:parsed2.error})}return PASS}}import{join as join264}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;
|
|
30455
30459
|
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?.
|
|
30456
|
-
abort()},tick:tick2}}init_zod();init_atomic();import{readFileSync as
|
|
30460
|
+
abort()},tick:tick2}}init_zod();init_atomic();import{readFileSync as readFileSync188}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.
|
|
30457
30461
|
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.
|
|
30458
30462
|
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.
|
|
30459
|
-
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(
|
|
30463
|
+
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(readFileSync188(options2.file,"utf8")))}catch{}let timer4=null,flush=()=>{timer4&&(clearTimeout(timer4),
|
|
30460
30464
|
timer4=null);try{writeFileAtomic(options2.file,`${JSON.stringify(data4)}
|
|
30461
30465
|
`,{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={}){
|
|
30462
30466
|
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:"\
|
|
@@ -30468,7 +30472,7 @@ REFUSED2=/\b403\b|forbidden|insufficient[_ ](?:scope|permission)s?|permission de
|
|
|
30468
30472
|
`).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.
|
|
30469
30473
|
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)).
|
|
30470
30474
|
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(`
|
|
30471
|
-
`).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:
|
|
30475
|
+
`).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:join264(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)?.
|
|
30472
30476
|
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.
|
|
30473
30477
|
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(
|
|
30474
30478
|
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)},
|
|
@@ -30485,7 +30489,7 @@ name6,result2);outcome&&store5.observe({kind:"mcp",id:name6},outcome)},added(kin
|
|
|
30485
30489
|
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.
|
|
30486
30490
|
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.
|
|
30487
30491
|
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(){
|
|
30488
|
-
background4?.stop(),store5?.flush()},checkNow:()=>background4?.tick()??Promise.resolve(null)}}init_zod();init_config3();import{rmSync as rmSync66}from"node:fs";import{join as
|
|
30492
|
+
background4?.stop(),store5?.flush()},checkNow:()=>background4?.tick()??Promise.resolve(null)}}init_zod();init_config3();import{rmSync as rmSync66}from"node:fs";import{join as join265}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.
|
|
30489
30493
|
|
|
30490
30494
|
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.
|
|
30491
30495
|
|
|
@@ -30523,10 +30527,10 @@ Rules: include EVERY routine you own (paused ones too) and EVERY skill enabled f
|
|
|
30523
30527
|
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.
|
|
30524
30528
|
`;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=[],
|
|
30525
30529
|
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}}
|
|
30526
|
-
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=>
|
|
30527
|
-
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,
|
|
30528
|
-
test(name6)).flatMap(name6=>{let stats=machine.fs.lstat(
|
|
30529
|
-
text:raw.toString("utf8")}]):[]})}function lookForGrokBot(machine){return{files:readExportFiles(machine),bots:rosterBots(machine)}}function removeOldCursorSignIn(dataDir){try{rmSync66(
|
|
30530
|
+
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=>join265(
|
|
30531
|
+
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,join265(folder3,slice5))?.rows).flatMap(row=>{let name6=shown2(row.name);return name6&&!row.isGroup?[name6]:[]})}function readExportFiles(machine){let folder3=join265(machine.home,"Downloads"),found2=(machine.fs.readdir(folder3)??[]).filter(name6=>GROK_EXPORT_FILE.
|
|
30532
|
+
test(name6)).flatMap(name6=>{let stats=machine.fs.lstat(join265(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(join265(folder3,name6),GROK_EXPORT_MAX_CHARS,!1);return raw?(budget-=raw.length,[{name:name6,modifiedAt,
|
|
30533
|
+
text:raw.toString("utf8")}]):[]})}function lookForGrokBot(machine){return{files:readExportFiles(machine),bots:rosterBots(machine)}}function removeOldCursorSignIn(dataDir){try{rmSync66(join265(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??
|
|
30530
30534
|
{},mcpPolicyRefusal:deps.mcpPolicyRefusal,persistMcpServers:deps.persistMcpServers,mcpConfigBusy:deps.mcpConfigBusy,claudeUserMcp:()=>claudeUserMcpEnabled(deps.cfg)};return async({req,res,path:path6,method:method2,auth,json:json6,readBody:readBody2})=>{if(path6===GROK_LOOK_PATH)return method2!=="GET"?json6(res,405,{error:"method not allowed"}):!deps.local||auth.kind!=="loopback"||auth.trust==="service"?json6(res,403,{error:LOCAL_ONLY}):(res.setHeader("Cache-Control","no-store"),json6(res,200,lookForGrokBot(
|
|
30531
30535
|
machine())));if(path6!==SETUP_IMPORT_PATH)return PASS;if(method2!=="GET"&&method2!=="POST")return json6(res,405,{error:"method not allowed"});if(!deps.local||auth.kind!=="loopback"||auth.trust==="service")return json6(res,403,{error:LOCAL_ONLY});if(res.setHeader("Cache-Control","no-store"),method2==="GET")return json6(res,200,detectSetup(machine(),host3));if(!String(req.headers["content-type"]??"").toLowerCase().startsWith("application/json"))return json6(res,415,{error:"content-type must be app\
|
|
30532
30536
|
lication/json"});let parsed2=requestSchema2.safeParse(await readBody2(req,4096));return!parsed2.success||!parsed2.data.skills&&!parsed2.data.tools?json6(res,400,{error:"Choose skills, tools or both."}):json6(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();
|
|
@@ -30616,9 +30620,9 @@ req));if(!parsed2.success)return json6(res,400,userError("serverError.department
|
|
|
30616
30620
|
includes(section4))return json6(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 json6(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){
|
|
30617
30621
|
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?json6(res,200,{sections:store5.sections,bots:result2.bots.map(wireBot2)}):json6(res,result2.reason==="unavailable"?404:409,result2.reason==="chief-conflict"?userError("serverError.department.moveChiefConflict"):result2.reason==="membership-changed"?userError("serverError.department.membershi\
|
|
30618
30622
|
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 json6(res,400,{error:"Provide a department name and up to 100 valid botIds"});let name6=parsed2.data.name.trim();if(name6.length>60)return json6(res,400,{error:"name must be at most 60 characters"});let botIds=[...new Set(parsed2.data.botIds)];if(!name6&&!botIds.length)return json6(res,400,{error:"\
|
|
30619
|
-
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?json6(res,200,{section:name6,sections:store5.sections,bots:result2.bots.map(wireBot2)}):result2.reason==="chief-conflict"?json6(res,409,{...userError("serverError.department.oneChief")}):json6(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
|
|
30623
|
+
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?json6(res,200,{section:name6,sections:store5.sections,bots:result2.bots.map(wireBot2)}):result2.reason==="chief-conflict"?json6(res,409,{...userError("serverError.department.oneChief")}):json6(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 join266}from"node:path";import{createInterface as createInterface2}from"node:readline";var MAX_CACHED_MONTHS=24,cache4=new Map,loading=new Map;async function readFrom(file2,start,into){let stream2=createReadStream13(file2,{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+
|
|
30620
30624
|
stream2.bytesRead)}function monthRows(file2){let pending3=loading.get(file2);if(pending3)return pending3;let read4=loadMonth(file2).finally(()=>loading.delete(file2));return loading.set(file2,read4),read4}async function loadMonth(file2){let size3;try{size3=(await stat15(file2)).size}catch{return cache4.delete(file2),[]}let cached4=cache4.get(file2);if(cached4&&cached4.size===size3)return cached4.rows;let rows2=cached4&&cached4.size<size3?cached4.rows:[],consumed=await readFrom(file2,cached4&&cached4.
|
|
30621
|
-
size<size3?cached4.size:0,rows2);return cache4.delete(file2),cache4.set(file2,{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(
|
|
30625
|
+
size<size3?cached4.size:0,rows2);return cache4.delete(file2),cache4.set(file2,{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(join266(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)$/,
|
|
30622
30626
|
"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_]*$/,
|
|
30623
30627
|
"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_]+)?$/,"\
|
|
30624
30628
|
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};
|
|
@@ -30774,16 +30778,16 @@ rite"}),deps.notify(buildNotification("approval",{id:from.id,name:from.name},thr
|
|
|
30774
30778
|
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":
|
|
30775
30779
|
"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\
|
|
30776
30780
|
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;
|
|
30777
|
-
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
|
|
30778
|
-
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 file2=
|
|
30781
|
+
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 readFileSync189}from"node:fs";import{join as join267}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().
|
|
30782
|
+
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 file2=join267(dataDir,TEAM_PEOPLE_FILE),people=[];try{let parsed2=fileSchema26.safeParse(JSON.parse(readFileSync189(file2,"utf8")));parsed2.success?people=parsed2.data.people:console.warn(`team people: ${file2} is not a people file; starting fresh`)}catch(error66){error66.code!=="ENOENT"&&console.
|
|
30779
30783
|
warn(`team people: ${file2} 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(file2,`${JSON.stringify({version:1,people})}
|
|
30780
30784
|
`,{mode:384})}catch(error66){console.warn(`team people: could not save ${file2}: ${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(),
|
|
30781
30785
|
!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){
|
|
30782
30786
|
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,
|
|
30783
30787
|
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?
|
|
30784
|
-
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
|
|
30788
|
+
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 readFileSync190}from"node:fs";import{join as join268}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.
|
|
30785
30789
|
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()}),
|
|
30786
|
-
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,file2=
|
|
30790
|
+
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,file2=join268(deps.dataDir,PERSON_INBOX_FILE),homes={},items=[],stopped=!1;if(team)try{let parsed2=fileSchema27.safeParse(JSON.parse(readFileSync190(file2,"utf8")));parsed2.success?{homes,items}=
|
|
30787
30791
|
parsed2.data:console.warn(`person inbox: ${file2} is not an inbox file; starting fresh`)}catch(error66){error66.code!=="ENOENT"&&console.warn(`person inbox: ${file2} is unreadable; starting fresh`)}let save7=()=>{items=items.filter(item=>now2()-item.at<KEEP_MS3).slice(-MAX_ITEMS2);try{writeFileAtomic(file2,`${JSON.stringify({version:1,homes,items})}
|
|
30788
30792
|
`,{mode:384})}catch(error66){console.warn(`person inbox: could not save ${file2}: ${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;
|
|
30789
30793
|
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(
|
|
@@ -30868,16 +30872,16 @@ long)}. ${SAY_LONG_WAIT} Each has its own line in this inbox, and that is where
|
|
|
30868
30872
|
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)
|
|
30869
30873
|
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.
|
|
30870
30874
|
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:{
|
|
30871
|
-
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 createHash124,createHmac as createHmac9,randomBytes as randomBytes37}from"node:crypto";import{mkdirSync as mkdirSync121,readdirSync as
|
|
30875
|
+
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 createHash124,createHmac as createHmac9,randomBytes as randomBytes37}from"node:crypto";import{mkdirSync as mkdirSync121,readdirSync as readdirSync61,readFileSync as readFileSync191,rmSync as rmSync67}from"node:fs";import{join as join269}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.
|
|
30872
30876
|
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=createHash124("sha256").update(body2).digest("base64url");return createHmac9("sha256",secret).update(`omb-team-away-v1
|
|
30873
30877
|
${machineId}
|
|
30874
30878
|
${timestamp5}
|
|
30875
30879
|
${nonce}
|
|
30876
30880
|
${bodyHash}`).digest("base64url")}var awayKey=about=>createHash124("sha256").update(`omb-team-away
|
|
30877
30881
|
${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,
|
|
30878
|
-
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=>
|
|
30879
|
-
pref.synced){rmSync67(prefPath(person2),{force:!0});return}mkdirSync121(
|
|
30880
|
-
`,{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=
|
|
30882
|
+
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=>join269(deps.dataDir,"people",person2,AWAY_EMAILS_FILE),readPref=person2=>{if(!PERSON6.test(person2))return null;try{let parsed2=prefSchema.safeParse(JSON.parse(readFileSync191(prefPath(person2),"utf8")));return parsed2.success?parsed2.data:null}catch{return null}},writePref=(person2,pref)=>{if(PERSON6.test(person2))try{if(!pref||pref.on&&
|
|
30883
|
+
pref.synced){rmSync67(prefPath(person2),{force:!0});return}mkdirSync121(join269(deps.dataDir,"people",person2),{recursive:!0,mode:448}),writeFileAtomic(prefPath(person2),`${JSON.stringify(pref)}
|
|
30884
|
+
`,{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(join269(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{
|
|
30881
30885
|
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)
|
|
30882
30886
|
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(
|
|
30883
30887
|
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))||
|
|
@@ -30897,9 +30901,9 @@ card.requestId}`:`inbox:${item.id}`,conversation2=mapped2.routine&&origin2?origi
|
|
|
30897
30901
|
{}}});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?
|
|
30898
30902
|
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(
|
|
30899
30903
|
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 \
|
|
30900
|
-
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
|
|
30904
|
+
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 readFileSync192}from"node:fs";import{join as join270}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().
|
|
30901
30905
|
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(
|
|
30902
|
-
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,file2=
|
|
30906
|
+
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,file2=join270(deps.dataDir,PLACE_INBOX_FILE),lines=[],seenAsks=new Set;try{let parsed2=fileSchema28.safeParse(JSON.parse(readFileSync192(file2,"utf8")));parsed2.success?(lines=parsed2.data.lines,seenAsks=new Set(parsed2.data.seenAsks)):console.warn(`\
|
|
30903
30907
|
place inbox: ${file2} is not an inbox file; starting fresh`)}catch(error66){error66.code!=="ENOENT"&&console.warn(`place inbox: ${file2} is unreadable; starting fresh`)}let save7=()=>{lines=lines.filter(line6=>now2()-line6.at<KEEP_MS4).slice(-MAX_LINES2);try{writeFileAtomic(file2,`${JSON.stringify({version:1,lines,seenAsks:[...seenAsks].slice(-MAX_SEEN_ASKS)})}
|
|
30904
30908
|
`,{mode:384})}catch(error66){console.warn(`place inbox: could not save ${file2}: ${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.
|
|
30905
30909
|
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.
|
|
@@ -30920,7 +30924,7 @@ find(one5=>one5.id===lineId&&lineFor(auth,one5));return line6?(line6.seen||(line
|
|
|
30920
30924
|
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)}
|
|
30921
30925
|
${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",
|
|
30922
30926
|
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);
|
|
30923
|
-
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
|
|
30927
|
+
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 readFileSync193}from"node:fs";import{arch,platform,release as release2}from"node:os";import{join as join271}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(
|
|
30924
30928
|
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;
|
|
30925
30929
|
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)
|
|
30926
30930
|
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])?)+$/;
|
|
@@ -30950,7 +30954,7 @@ max(MAX_OUTBOX),tracked:external_exports.array(trackedSchema).max(MAX_TRACKED).o
|
|
|
30950
30954
|
h the problem if you can.]`,iso5=at8=>new Date(at8).toISOString(),firstLine=text30=>(text30??"").split(`
|
|
30951
30955
|
`).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.
|
|
30952
30956
|
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?",\
|
|
30953
|
-
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,file2=
|
|
30957
|
+
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,file2=join271(deps.dataDir,DEVS_REPORTS_FILE),waiting2=[],outbox=[],tracked=[];try{let parsed2=fileSchema29.safeParse(JSON.parse(readFileSync193(file2,"utf8")));parsed2.success?(outbox=parsed2.data.outbox,waiting2=parsed2.data.waiting.map(
|
|
30954
30958
|
entry2=>({...entry2,restored:!0})),tracked=parsed2.data.tracked??[]):console.warn(`devs reports: ${file2} is not a reports file; starting fresh`)}catch(error66){error66.code!=="ENOENT"&&console.warn(`devs reports: ${file2} is unreadable; starting fresh`)}let inFlight=new Map,retrying=new Set,told2=[],lastSent=new Map,seen=new Set,save7=()=>{try{writeFileAtomic(file2,`${JSON.stringify({version:1,waiting:waiting2.map(({answered:_a6,offered:_o3,restored:_r3,...entry2})=>entry2),outbox,tracked})}
|
|
30955
30959
|
`,{mode:384})}catch(error66){console.warn(`devs reports: could not save ${file2}: ${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.
|
|
30956
30960
|
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(
|
|
@@ -30984,16 +30988,16 @@ for(;inFlight.size||retrying.size||asking2;)await Promise.allSettled([...inFligh
|
|
|
30984
30988
|
\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.
|
|
30985
30989
|
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,
|
|
30986
30990
|
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(
|
|
30987
|
-
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
|
|
30988
|
-
now){this.#file=file2,this.#now=now2;try{let parsed2=fileSchema30.safeParse(JSON.parse(
|
|
30989
|
-
this.#work.delete(id12);for(;this.#work.size>
|
|
30991
|
+
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 readFileSync194}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(file2,now2=Date.
|
|
30992
|
+
now){this.#file=file2,this.#now=now2;try{let parsed2=fileSchema30.safeParse(JSON.parse(readFileSync194(file2,"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&&
|
|
30993
|
+
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)})}
|
|
30990
30994
|
`,{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===
|
|
30991
30995
|
!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(
|
|
30992
30996
|
threadId)){let run11=generation===void 0?void 0:deps.roomRun(generation);if(!run11||run11.cancelled)return null;if(run11.requestMessageId){let line6=thread.find(message8=>message8.id===run11.requestMessageId),person2=linePerson2(line6);if(!line6||!person2)return null;let joined3=new Set(run11.queuedQueueIds??[]),since=thread.reduce((first2,message8)=>message8.queueId!==void 0&&joined3.has(message8.queueId)?Math.min(first2,message8.at):first2,line6.at);return onlyTheirs(thread,person2,since)?person2:
|
|
30993
30997
|
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.
|
|
30994
30998
|
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);
|
|
30995
30999
|
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.
|
|
30996
|
-
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
|
|
31000
|
+
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 join273}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 join272}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(
|
|
30997
31001
|
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(
|
|
30998
31002
|
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(
|
|
30999
31003
|
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}
|
|
@@ -31006,8 +31010,8 @@ labels.map(oneLine13).join(", ")}`:"",topic.markers.length?`markers: ${topic.mar
|
|
|
31006
31010
|
`)}).join(`
|
|
31007
31011
|
|
|
31008
31012
|
`)+`
|
|
31009
|
-
`}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=
|
|
31010
|
-
outlineFromJson(source4):outlineFromXml(source4)}async function saveXmindUpload(chunks,originalName,options2={}){let name6=`${originalName}.md`;sanitizeSharedFileName(name6,"text/markdown");let scratch=await mkdtemp8(
|
|
31013
|
+
`}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=join272(scratch,"content");await extractZipMember(archive,member,extracted,384);let source4=await readFile15(extracted,"utf8");return member.name==="content.json"?
|
|
31014
|
+
outlineFromJson(source4):outlineFromXml(source4)}async function saveXmindUpload(chunks,originalName,options2={}){let name6=`${originalName}.md`;sanitizeSharedFileName(name6,"text/markdown");let scratch=await mkdtemp8(join272(tmpdir24(),"omb-xmind-"));try{let archive=join272(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}},
|
|
31011
31015
|
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 createHash125}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(
|
|
31012
31016
|
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==="\
|
|
31013
31017
|
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=
|
|
@@ -31045,11 +31049,11 @@ name6):null;if(copy6)file2=await openMessageFile(copy6.path,[ATTACHMENTS_DIR],ma
|
|
|
31045
31049
|
gin-resource-policy":"same-origin","referrer-policy":"no-referrer"}:{}}),file2.bytes===0)return await file2.handle.close(),res.end();let stream2=file2.handle.createReadStream({start:0,end:file2.bytes-1,autoClose:!0});stream2.on("error",()=>res.destroy()),res.on("close",()=>stream2.destroy()),stream2.pipe(res);return}if(method2==="POST"&&path6==="/api/attachments"){let uploadId;try{uploadId=validateAttachmentUploadId(url2.searchParams.get("uploadId")??void 0)}catch(error66){throw req.resume(),error66}
|
|
31046
31050
|
let mime=(Array.isArray(req.headers["content-type"])?req.headers["content-type"][0]:req.headers["content-type"])?.split(";")[0]?.trim().toLowerCase();if(!mime||!extensionForMime(mime))return json6(res,400,{error:"content-type must be an image type"});let rawLength=Array.isArray(req.headers["content-length"])?req.headers["content-length"][0]:req.headers["content-length"],declaredLength=rawLength===void 0?void 0:Number(rawLength);if(declaredLength!==void 0&&(!Number.isSafeInteger(declaredLength)||
|
|
31047
31051
|
declaredLength<0))return req.resume(),json6(res,400,{error:"content-length must be a non-negative integer"});if(declaredLength!==void 0&&declaredLength>IMAGE_MAX_BYTES2)return req.resume(),json6(res,413,{error:`image exceeds ${IMAGE_MAX_BYTES2} bytes`});let saved=await new Promise((resolve56,reject)=>{let chunks=[],received=0,settled2=!1,fail14=(status5,msg)=>{settled2||(settled2=!0,reject(Object.assign(new Error(msg),{status:status5})))};req.on("data",chunk=>{if(!settled2){if(received+=chunk.byteLength,
|
|
31048
|
-
received>IMAGE_MAX_BYTES2)return fail14(413,`image exceeds ${IMAGE_MAX_BYTES2} bytes`);chunks.push(chunk)}}),req.on("end",async()=>{if(!settled2){settled2=!0;try{resolve56(await saveImageUpload(Buffer.concat(chunks),mime,uploadId))}catch(e){reject(e instanceof Error?e:new Error(String(e)))}}}),req.on("error",e=>fail14(400,e instanceof Error?e.message:String(e)))});return deps.uploads.note(auth,
|
|
31052
|
+
received>IMAGE_MAX_BYTES2)return fail14(413,`image exceeds ${IMAGE_MAX_BYTES2} bytes`);chunks.push(chunk)}}),req.on("end",async()=>{if(!settled2){settled2=!0;try{resolve56(await saveImageUpload(Buffer.concat(chunks),mime,uploadId))}catch(e){reject(e instanceof Error?e:new Error(String(e)))}}}),req.on("error",e=>fail14(400,e instanceof Error?e.message:String(e)))});return deps.uploads.note(auth,basename36(saved.path)),json6(res,201,saved)}if(method2==="POST"&&path6==="/api/files"){let uploadId;try{
|
|
31049
31053
|
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(),json6(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:
|
|
31050
31054
|
Number(rawLength);if(declaredLength!==void 0&&(!Number.isSafeInteger(declaredLength)||declaredLength<0))return req.resume(),json6(res,400,{error:"content-length must be a non-negative integer"});if(declaredLength!==void 0&&declaredLength>104857600)return req.resume(),json6(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(
|
|
31051
|
-
chunks,name6,rawType??"",{uploadId,expectedBytes:declaredLength});return deps.uploads.note(auth,
|
|
31052
|
-
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)?json6(res,404,{error:"no such attachment"}):deps.attachmentInUse(name6)?json6(res,409,{...userError("serverError.attachment.alreadyInMessage")}):(deleteAttachment(
|
|
31055
|
+
chunks,name6,rawType??"",{uploadId,expectedBytes:declaredLength});return deps.uploads.note(auth,basename36(saved.path)),json6(res,201,saved)}catch(error66){throw req.resume(),error66}}if(path6==="/api/attachment-storage"&&deps.keptAttachments){if(method2==="GET")return json6(res,200,attachmentStorageUsage());if(method2==="POST"){let kept2=deps.keptAttachments();return kept2?json6(res,200,{...clearAttachments(kept2),...attachmentStorageUsage()}):json6(res,503,{error:"Routines are still loading. T\
|
|
31056
|
+
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)?json6(res,404,{error:"no such attachment"}):deps.attachmentInUse(name6)?json6(res,409,{...userError("serverError.attachment.alreadyInMessage")}):(deleteAttachment(join273(ATTACHMENTS_DIR,name6)),json6(res,200,{ok:!0}))}if(m3&&method2==="GET"){let attachment=readAttachment(m3[1]);if(!attachment)return json6(res,404,
|
|
31053
31057
|
{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(
|
|
31054
31058
|
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.
|
|
31055
31059
|
get("threadId")?.trim()||void 0;if(threadId&&(!store5.botByThread(threadId)&&!store5.groupByThread(threadId)||!visible.thread(threadId)))return json6(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);
|
|
@@ -31070,7 +31074,7 @@ test(resumeKey))return{status:400,body:{error:"invalid resume key"}};if(!items.l
|
|
|
31070
31074
|
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.
|
|
31071
31075
|
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]?.
|
|
31072
31076
|
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.
|
|
31073
|
-
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 createHash126,randomUUID as randomUUID89}from"node:crypto";import{readFileSync as
|
|
31077
|
+
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 createHash126,randomUUID as randomUUID89}from"node:crypto";import{readFileSync as readFileSync195}from"node:fs";import{join as join274}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,
|
|
31074
31078
|
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;
|
|
31075
31079
|
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,`
|
|
31076
31080
|
`).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}
|
|
@@ -31080,8 +31084,8 @@ index+match5[0].length+NEAR_AFTER).replace(NOT_A_CODE_WORD," ");if(CODE_WORD.tes
|
|
|
31080
31084
|
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(
|
|
31081
31085
|
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.
|
|
31082
31086
|
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.
|
|
31083
|
-
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(file2){try{let parsed2=JSON.parse(
|
|
31084
|
-
readMessage:readMessage2,...deps.run},askedFile=
|
|
31087
|
+
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(file2){try{let parsed2=JSON.parse(readFileSync195(file2,"utf8"));return new Map(Object.entries(parsed2.asked??{}).filter(([,at8])=>typeof at8=="number"))}catch{return new Map}}function createLoginMailCodes(deps){let run11={recentInbox,
|
|
31088
|
+
readMessage:readMessage2,...deps.run},askedFile=join274(deps.dataDir,MAIL_CARD_FILE),asked=readAsked(askedFile),asks2=new Map,used=new Map,usedKey=(site,code)=>createHash126("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]).
|
|
31085
31089
|
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.
|
|
31086
31090
|
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.
|
|
31087
31091
|
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!==
|
|
@@ -31105,15 +31109,15 @@ if(!deps.enabled()||store5.groupByThread(target4.threadId)||!store5.taskByThread
|
|
|
31105
31109
|
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.
|
|
31106
31110
|
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\
|
|
31107
31111
|
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=
|
|
31108
|
-
!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(
|
|
31112
|
+
!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(join275(DATA_DIR,".backups"))&&(workspaceRestore=applyPendingWorkspaceRestore(DATA_DIR),workspaceRestore.restored&&(restoredAtStart=workspaceRestore.id),!workspaceRestore.restored&&!workspaceRestore.rolledBack&&(workspaceRestore=
|
|
31109
31113
|
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(
|
|
31110
|
-
config3.signIn?.members?.join(","))})),sessions=new SessionRegistry({file:
|
|
31114
|
+
config3.signIn?.members?.join(","))})),sessions=new SessionRegistry({file:join275(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(join275(DATA_DIR,"lent-computers.jso\
|
|
31111
31115
|
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,
|
|
31112
31116
|
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()&&
|
|
31113
|
-
sharedComputers.anyLent(),CLOUD_HOME_LENDER="cloud-home",cloudRoutineAuthors=CLOUD_HOME?createCloudRoutineAuthors(
|
|
31117
|
+
sharedComputers.anyLent(),CLOUD_HOME_LENDER="cloud-home",cloudRoutineAuthors=CLOUD_HOME?createCloudRoutineAuthors(join275(DATA_DIR,"lending-routines.json")):null,ownerStartedRoutineRuns=new Set,foreignTurns=new Map,lendingMemory=CLOUD_PERSONAL?createLendingMemory({file:join275(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.
|
|
31114
31118
|
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\
|
|
31115
31119
|
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; \
|
|
31116
|
-
start it with cloud-home-start");var threadStarters=new ThreadStarters(
|
|
31120
|
+
start it with cloud-home-start");var threadStarters=new ThreadStarters(join275(DATA_DIR,"thread-starters.json")),commandAllowlist=new CommandAllowlistStore(join275(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\
|
|
31117
31121
|
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.
|
|
31118
31122
|
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&&
|
|
31119
31123
|
!!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.
|
|
@@ -31122,7 +31126,7 @@ setEncoding("utf8"),process.stdin.on("error",()=>{}),process.stdin.on("data",chu
|
|
|
31122
31126
|
`)&&/^[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(
|
|
31123
31127
|
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(
|
|
31124
31128
|
()=>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.
|
|
31125
|
-
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:
|
|
31129
|
+
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:join275(DATA_DIR,"providers","engine-status.json")}),supportsApprovalMode2=createApprovalModeSupport(
|
|
31126
31130
|
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:"",
|
|
31127
31131
|
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?
|
|
31128
31132
|
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,
|
|
@@ -31147,7 +31151,7 @@ adopted.has(person2)?!0:cloudOwnerDevice(person2):!1}function cloudProvenOwnerPe
|
|
|
31147
31151
|
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\
|
|
31148
31152
|
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).
|
|
31149
31153
|
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\
|
|
31150
|
-
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??
|
|
31154
|
+
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??join275(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.
|
|
31151
31155
|
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\
|
|
31152
31156
|
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.
|
|
31153
31157
|
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(
|
|
@@ -31175,19 +31179,19 @@ label,scopes:pairing2.scopes}})}plan.engineAction&&rows2.push({category:"engine"
|
|
|
31175
31179
|
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})===
|
|
31176
31180
|
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(
|
|
31177
31181
|
{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.
|
|
31178
|
-
bot(botId);return!!(bot&®istry2.get(bot.modelSelection.instanceId)?.adapter.capabilities.customMcp===!0)},boxed:()=>botBox.enabled(),keys:mcpKeys}),mcpOAuth=new McpOAuthManager({file:
|
|
31182
|
+
bot(botId);return!!(bot&®istry2.get(bot.modelSelection.instanceId)?.adapter.capabilities.customMcp===!0)},boxed:()=>botBox.enabled(),keys:mcpKeys}),mcpOAuth=new McpOAuthManager({file:join275(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.
|
|
31179
31183
|
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,
|
|
31180
31184
|
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.
|
|
31181
31185
|
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?
|
|
31182
31186
|
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});
|
|
31183
31187
|
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=
|
|
31184
|
-
allowed3;for(let instance of registry2.instances())instance.driverKind==="opencodeGo"&®istry2.refreshModels(instance.instanceId).then(()=>broadcast({kind:"config",...configStatus()}),()=>{})}}var firstEngineRead=holdUntilFirstEngineRead();await registry2.load(providerConfigs(),decorateHostedProvider);var bundledSkills=loadBundledSkills(),availableSkills=()=>mergeSkills(bundledSkills,loadUserSkills(
|
|
31188
|
+
allowed3;for(let instance of registry2.instances())instance.driverKind==="opencodeGo"&®istry2.refreshModels(instance.instanceId).then(()=>broadcast({kind:"config",...configStatus()}),()=>{})}}var firstEngineRead=holdUntilFirstEngineRead();await registry2.load(providerConfigs(),decorateHostedProvider);var bundledSkills=loadBundledSkills(),availableSkills=()=>mergeSkills(bundledSkills,loadUserSkills(join275(DATA_DIR,"skills"))),usbPhoneOffered=(instance,skills)=>instance.adapter.capabilities.phoneMcp===
|
|
31185
31189
|
!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){
|
|
31186
31190
|
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(
|
|
31187
|
-
{file:
|
|
31191
|
+
{file:join275(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",
|
|
31188
31192
|
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(
|
|
31189
31193
|
{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)}},
|
|
31190
|
-
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:
|
|
31194
|
+
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:join275(DATA_DIR,"refused-quick-models.json"),publish:event2=>{
|
|
31191
31195
|
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:"\
|
|
31192
31196
|
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){
|
|
31193
31197
|
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(
|
|
@@ -31198,7 +31202,7 @@ Promise.resolve()).catch(error66=>{console.warn(`[trial credit] could not start:
|
|
|
31198
31202
|
{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(
|
|
31199
31203
|
{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(
|
|
31200
31204
|
{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,
|
|
31201
|
-
computerSelectionTurns=new Map,EXTERNAL_RUNTIME_GENERATION="external-runtime",EXTERNAL_RUNTIMES_FILE=
|
|
31205
|
+
computerSelectionTurns=new Map,EXTERNAL_RUNTIME_GENERATION="external-runtime",EXTERNAL_RUNTIMES_FILE=join275(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(
|
|
31202
31206
|
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=randomUUID90()){let previous2=activeInternalGenerationByThread.get(threadId);return previous2&&revokeInternalCapabilityGeneration(
|
|
31203
31207
|
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}\
|
|
31204
31208
|
${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\
|
|
@@ -31258,7 +31262,7 @@ return directTurnClaimIsCurrent(botId,claimId,threadId)?(directTurnDispatchClaim
|
|
|
31258
31262
|
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.
|
|
31259
31263
|
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,
|
|
31260
31264
|
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(
|
|
31261
|
-
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=
|
|
31265
|
+
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=join275(homedir44(),"Downloads");return[...existsSync98(downloads)?[downloads]:[],...bot.cwd?[bot.cwd]:[],workspaceDir(bot.id)]}var dataUnavailableLogged=!1;function dataIntegration(botId,turn){
|
|
31262
31266
|
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.
|
|
31263
31267
|
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===
|
|
31264
31268
|
"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=
|
|
@@ -31288,13 +31292,13 @@ notes.push({path:`memory/${topic.name}`,text:text30})}return notes}function pack
|
|
|
31288
31292
|
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\
|
|
31289
31293
|
.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!=
|
|
31290
31294
|
"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.
|
|
31291
|
-
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:
|
|
31295
|
+
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:join275(DATA_DIR,"providers","ai-checks.json"),forBot:selection3=>withNewBotEffort(selection3,cfg.newBots?.effort,registry2.get(selection3.instanceId)?.adapter.
|
|
31292
31296
|
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?.
|
|
31293
31297
|
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;
|
|
31294
31298
|
function botApiThread(id12){let owner2=store4.botByThread(id12);return!!(owner2&&store4.taskByThread(owner2.id,id12)?.botApi)}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,cloudLendingView,cloudReportFromOthers,
|
|
31295
31299
|
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),routineRunIsOwners:cloudRoutineRunIsOwners,
|
|
31296
31300
|
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].some(client=>client.ask.person===person2),
|
|
31297
|
-
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(
|
|
31301
|
+
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(join275(DATA_DIR,HANDED_PEOPLE_FILE))}),lendingLifts=lendingMemory?createLendingLifts(
|
|
31298
31302
|
{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),accept:(botId,token3)=>lendingMemory.review(
|
|
31299
31303
|
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(turn)}):null,{stopThreadForPerson,stopOnTypedCommand,
|
|
31300
31304
|
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),asking:threadId=>coordinator.awaitingAnswer(
|
|
@@ -31319,7 +31323,7 @@ generation,origin:`http://127.0.0.1:${PORT2}`,personal:CLOUD_PERSONAL,place:CLOU
|
|
|
31319
31323
|
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,
|
|
31320
31324
|
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.
|
|
31321
31325
|
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.
|
|
31322
|
-
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(
|
|
31326
|
+
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(join275(DATA_DIR,"team-computers.json"),ENVIRONMENT_ID),followupsReady=!1,sendSequencer=new SendSequencer;await retryComputerEngineMove();mcpServersHost.boot();store4.needsSeed()&&await Promise.
|
|
31323
31327
|
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\
|
|
31324
31328
|
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(
|
|
31325
31329
|
{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??
|
|
@@ -31555,16 +31559,16 @@ threshold:()=>skillReviewSteps(cfg),bot:botId=>store4.bot(botId)??void 0,engine:
|
|
|
31555
31559
|
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(
|
|
31556
31560
|
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{
|
|
31557
31561
|
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.
|
|
31558
|
-
error}:{ok:!0}},statePath:
|
|
31562
|
+
error}:{ok:!0}},statePath:join275(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.
|
|
31559
31563
|
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(
|
|
31560
31564
|
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.
|
|
31561
31565
|
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,
|
|
31562
31566
|
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.
|
|
31563
|
-
delete(threadId),forgetTurnCheckpoint(threadId),liveTurnByThread.delete(threadId),memoryRowsByThread.delete(threadId)}var TOOL_RESULTS_DIR=
|
|
31567
|
+
delete(threadId),forgetTurnCheckpoint(threadId),liveTurnByThread.delete(threadId),memoryRowsByThread.delete(threadId)}var TOOL_RESULTS_DIR=join275(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.
|
|
31564
31568
|
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.
|
|
31565
31569
|
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(`
|
|
31566
31570
|
`)}:{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:
|
|
31567
|
-
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=
|
|
31571
|
+
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=join275(TOOL_RESULTS_DIR,threadId.replace(/[^\w.-]/g,"_")),redacted=redactSecretsInText(text30),fullResult=spillToolResult(dir,key7,redacted,
|
|
31568
31572
|
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;
|
|
31569
31573
|
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,
|
|
31570
31574
|
{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(
|
|
@@ -31872,11 +31876,11 @@ bot.name,color:source4.bot.color}),store4.appendMessage(sourceThreadId,message8)
|
|
|
31872
31876
|
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.
|
|
31873
31877
|
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(
|
|
31874
31878
|
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(
|
|
31875
|
-
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:
|
|
31876
|
-
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:
|
|
31879
|
+
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:join275(
|
|
31880
|
+
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:join275(DATA_DIR,"limit-notices.json"),holdsFile:join275(DATA_DIR,"limit-takeover-holds.json"),configs:()=>instanceConfigs(cfg),context:selectionContext,blockedUntil:engine=>limitClock.blockedUntil(engine),resetAt:engine=>limitClock.
|
|
31877
31881
|
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.
|
|
31878
31882
|
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??
|
|
31879
|
-
"",text30)),record:failover=>limitFailovers.record(failover)});registry2.onSignedIn(instanceId=>limitTakeover.signedIn(instanceId));var limitFailovers=new LimitFailovers({file:
|
|
31883
|
+
"",text30)),record:failover=>limitFailovers.record(failover)});registry2.onSignedIn(instanceId=>limitTakeover.signedIn(instanceId));var limitFailovers=new LimitFailovers({file:join275(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",
|
|
31880
31884
|
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,
|
|
31881
31885
|
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.
|
|
31882
31886
|
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,
|
|
@@ -31889,7 +31893,7 @@ if(!groupId){oneOnOneGoals.start(coordinatorBotId,threadId,prompt,{runId});retur
|
|
|
31889
31893
|
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?.
|
|
31890
31894
|
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!=
|
|
31891
31895
|
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);
|
|
31892
|
-
CLOUD_HOME&&CLOUD_OWNER_KEY&&cloudRoutineAuthors&&(cloudHome2=settleCloudHome({file:
|
|
31896
|
+
CLOUD_HOME&&CLOUD_OWNER_KEY&&cloudRoutineAuthors&&(cloudHome2=settleCloudHome({file:join275(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=
|
|
31893
31897
|
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();
|
|
31894
31898
|
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()),
|
|
31895
31899
|
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;
|
|
@@ -31919,7 +31923,7 @@ bot(proposerBotId),target4=store4.bot(targetBotId);return target4?!proposer||!ch
|
|
|
31919
31923
|
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(
|
|
31920
31924
|
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(),
|
|
31921
31925
|
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.
|
|
31922
|
-
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(
|
|
31926
|
+
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(join275(
|
|
31923
31927
|
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(
|
|
31924
31928
|
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)
|
|
31925
31929
|
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\
|
|
@@ -32139,288 +32143,289 @@ let eventLogMaxBytes=threadEventLogMaxBytes(cfg),eventLogRetentionDays=threadEve
|
|
|
32139
32143
|
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?
|
|
32140
32144
|
{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(
|
|
32141
32145
|
cfg),mode:connectionMode(cfg)},box:{...describeBoatAccount(cfg),...boatAccount(cfg)?.included?{}:keyHint(cfg.box?.token)},vps:{configured:!!vpsSshAlias(cfg),sshAlias:vpsSshAlias(cfg)??""},opencodeGo:{...keyStatus(cfg.opencodeGo?.apiKey),providerKeys:Object.keys(openCodeProviderKeys(cfg))},tts:describeVoice(cfg),decider:describeDecider(cfg),helpers:describeHelpers(cfg),imageGen:avatarImageStatus(cfg),savedKeys:nestedKeyStatus(cfg),live:liveSettingsFor(cfg),profile:CLOUD_TEAM?NOBODY_PROFILE:{name:cfg.
|
|
32142
|
-
profile?.name
|
|
32143
|
-
cfg)},automaticRecovery:cfg.automaticRecovery??{enabled:!1},cacheKeepWarm:cacheKeepWarmSettings(cfg),newBots:cfg.newBots?.effort?{effort:cfg.newBots.effort}:{},threads:{maxConcurrentPerBot:maxConcurrentBotThreads(cfg,botThreadsHost(cloudPlanTier.starter())),...eventLogMaxBytes!==null?{eventLogMaxBytes}:{},...eventLogRetentionDays!==null?{eventLogRetentionDays}:{}},localVm:{mode:localVmMode(cfg),
|
|
32144
|
-
cfg)},features:{skillAuthoring:skillAuthoringEnabled(cfg),skillReview:cfg.features?.skillReview!==!1,skillAutoApply:skillAutoApplyEnabled(cfg),skillReviewSteps:skillReviewSteps(cfg),skillsLibrary:skillsLibraryEnabled(cfg),shareLearnedSkills:skillsHost.mode(),showToolCalls:showToolCallsEnabled(cfg),browser:builtInBrowserEnabled(cfg),sharedComputers:sharedComputersEnabled(
|
|
32145
|
-
cfg),parallelRoomJobs:parallelRoomJobsEnabled(cfg),llmThreadTitles:llmThreadTitlesEnabled(cfg),savedSteps:savedStepsEnabled(cfg),savedStepsHere:savedSteps.here()},onboarding:{completedAt:cfg.onboarding?.completedAt??"",version:cfg.onboarding?.version??0,reelSeen:cfg.onboarding?.reelSeen===!0,hintsSeen:cfg.onboarding?.hintsSeen??[]
|
|
32146
|
-
signIn?.admins??[],members:cfg.signIn?.members??[]},membership:workspaceMembership(),workspaceBanner:workspaceBannerSummary()}}function configForAccess(status5,admin,session){let profile=CLOUD_TEAM?session?teamHost.memberProfile(session):NOBODY_PROFILE:status5.profile,onboarding=CLOUD_TEAM?teamOnboarding(status5.onboarding,session,
|
|
32147
|
-
edition.features},signIn:{admins:[],members:[]},live:liveSettingsForClient(status5.live),everyBotRules:void 0,vps:{configured:status5.vps.configured,sshAlias:""},opencodeGo:{configured:status5.opencodeGo.configured,providerKeys:[]},...CLOUD_TEAM?{onboarding}:{},profile:CLOUD_TEAM?profile:{name:profile.name,email:""
|
|
32148
|
-
|
|
32149
|
-
driverKind,snapshot:registry2.lastSnapshot(instance.instanceId)}))}),...await teamConnections.adminExtras()})}}function persistMcpServers(next){saveConfig({mcpServers:next}),cfg.mcpServers=next}async function describeInstances(){let configs=providerConfigs();retryComputerEngineMove();let read4=testedAi.read(),
|
|
32150
|
-
engines,read4);let ownReady=cloudCredit!==null&&engines.some(instance=>!selectionContext.company(instance.instanceId)&&readyToRun(instance,selectionContext));return engines.map(instance=>{let entry2=configs[instance.instanceId],described={...instance,...testedAi.info(instance),...engineUpdates.shown(instance.driverKind)
|
|
32151
|
-
config.replyWaitMinutes}:{},...heldKeys?.refusal(instance.instanceId)?{snapshot:{state:"unavailable",reason:TRIAL_KEY_HELD}}:{}};if(hostedModels)return{...described,readOnly:!0,install:void 0,authentication:void 0,cli:void 0,cliCandidates:[]};if(cloudCredit?.owns(instance.instanceId))return{...described,readOnly:!0,trialCredit:cloudCredit.
|
|
32152
|
-
{}};let policyReason=policyModelRefusal(instance),policy=policyReason?{policy:{organizationName:managedPolicy.current().organizationName,reason:policyReason,...managedPolicy.current().team?{team:!0}:{}}}:{};if(managedDesktop.owns(instance.instanceId))return{...described,...policy,readOnly:!0,managed:managedDesktop.
|
|
32153
|
-
...policy,freeUpSpace:!0};if(entry2?.driver!=="claudeAgent")return{...described,...policy};if(instance.instanceId===CLAUDE_API_INSTANCE)return{...described,...policy,authentication:void 0,install:{...instance.install,signInCommand:void 0}};try{let claudeAccount=claudeAccountInfo(instance.instanceId,entry2,instance.
|
|
32154
|
-
install:{...instance.install,signInCommand:void 0}}}})}var companyShutdown=!1;async function stopCompanyInstances(ids){if(!ids.length)return;if(companyShutdown){for(let id12 of ids)providerAuthSessions.clearInstance(id12),bus.detach(id12);return}let cause="turn interrupted \u2014 the Company connection changed",
|
|
32155
|
-
has(botForThread(bot.id,task2.threadId).modelSelection.instanceId)).map(task2=>({botId:bot.id,threadId:task2.threadId,owner:turnResourceOwners.get(task2.threadId),generation:directTurnGenerationByThread.get(task2.threadId)})));for(let{threadId}of direct)turnStops.stopping(threadId,liveTurnByThread.get(threadId),
|
|
32156
|
-
liveTurnByThread.get(threadId),cause);releaseTurnResources(owner2),settleDirectFollowup(owner2?.generation,{ok:!1,text:interrupted}),directTurnGenerationByThread.get(threadId)===generation&&(stopScreenPoller(botId,threadId),releaseLocalVmThread(threadId),watchdog.settle(threadId),closeOpenApprovals(threadId),
|
|
32157
|
-
appendMessage(threadId,{role:"bot",kind:"activity",tool:{name:"Company connection changed \u2014 choose whether to reconnect or use a personal model",ok:!1}}),store4.setTaskActivity(botId,threadId,"idle")))}for(let[threadId,speaker2]of[...groupSpeakers]){if(groupSpeakers.get(threadId)!==speaker2)continue;
|
|
32158
|
-
group2.id,threadId,{status:"stopped",detail:stoppedTurnOutcome({reason:cause,activities:[]}),byHarness:!0}),revokeInternalCapabilitiesForThread(threadId),await runningTurnInstance(bot,threadId)?.adapter.interruptTurn(threadId);let stillOwned=groupSpeakers.get(threadId)===speaker2&&turnResourceOwners.
|
|
32159
|
-
group2&&store4.patchGroup(group2.id,{busyBotId:activeGroupSpeaker(group2.id)?.botId??null}),store4.setActivity(bot.id,"idle"))}for(let id12 of ids)providerAuthSessions.clearInstance(id12),bus.detach(id12)}async function persistProviderInstance(instanceId,instances){if(saveConfig({instances},{replaceInstances:!0}),
|
|
32160
|
-
let live2=registry2.get(instanceId);live2&&bus.attach([live2])}else await registry2.dispose(instanceId);resetPathCache()}function threadEngineId(botId,threadId){return((groupSpeakers.get(threadId)?.botId??botId)===botId?runningTurnEngines.get(threadId)?.instanceId:void 0)??botForThread(botId,threadId)?.
|
|
32161
|
-
values())onChanged(capability2.botId,capability2.threadId)&&revokeEarlierTurnCapabilities(capability2.threadId);for(let[threadId,slots]of sessionCredentials)for(let slot of slots.keys())onChanged(slot.split(" ")[0],threadId)&&slots.delete(slot)}async function reloadProviders(before){
|
|
32162
|
-
bots.flatMap(bot=>store4.tasks(bot.id).filter(task2=>threadBusy(bot.id,task2.threadId)&&onChanged(bot.id,task2.threadId)).map(task2=>({botId:bot.id,threadId:task2.threadId,owner:turnResourceOwners.get(task2.threadId)}))),rooms=[...groupSpeakers.entries()].filter(([threadId,speaker2])=>onChanged(
|
|
32163
|
-
for(let id12 of changed3)providerAuthSessions.clearInstance(id12),bus.detach(id12);for(let task2 of direct)cancelDirectTurnDispatch(task2.botId,task2.threadId);for(let[threadId]of rooms){let group2=store4.groupByThread(threadId);group2&&cancelGroupTurnOperations(group2.id,threadId,{status:"
|
|
32164
|
-
configs,id12)).map(id12=>registry2.dispose(id12))),await registry2.load(Object.fromEntries(kept2.map(id12=>[id12,configs[id12]])),decorateHostedProvider),bus.attach(kept2.flatMap(id12=>registry2.get(id12)??[]))}finally{for(let{botId,threadId,owner:owner2}of direct){let interrupted=stoppedTurnText(
|
|
32165
|
-
settle(threadId),closeOpenApprovals(threadId),directTurnBots.delete(threadId),runningTurnEngines.delete(threadId),routines?.failThread(threadId,"Provider settings changed while this thread was running",{stopReason:"interrupted"}),store4.taskByThread(botId,threadId)&&(store4.appendMessage(threadId,
|
|
32166
|
-
if(releaseLocalVmThread(threadId),releaseTurnResources(turnResourceOwners.get(threadId)),endForeignTurns(threadId),watchdog.settle(threadId),closeOpenApprovals(threadId),groupSpeakers.get(threadId)!==speaker2)continue;runningTurnEngines.delete(threadId),groupSpeakers.delete(threadId);let group2=store4.
|
|
32167
|
-
delete(id12);providerFleetReloading=!1}drainQueuedSends()}var providerConfigBusy=!1,providerInstancesChanging=new Set,mcpConfigBusy=!1,workspaceBackupAccess={authorized:(req,original)=>{let current3=resolveRequestAuth(req,{sessions,cookieName:SESSION_COOKIE,streamPath:"/api/events",url:new URL(
|
|
32168
|
-
scopes.includes("admin")&¤t3.kind===original.kind&&(current3.kind!=="session"||original.kind==="session"&¤t3.session.id===original.session.id))},exclusive:(work,keepLocked)=>workspaceMaintenance.run(async()=>{if(keepLocked&&teamComputers.list().some(computer=>computer.
|
|
32169
|
-
|
|
32170
|
-
every(group2=>!groupIsWorking(group2)),pause:()=>{routines?.stop(),calendarCalls?.stop(),botWaits.stop(),watchdog.stop(),memoryUpkeep.pause()},resume:()=>{moveFreeze.frozen()||(routines?.start(),calendarCalls?.start(),botWaits.start()),watchdog.start(),memoryUpkeep.resume()},flush:async()=>{
|
|
32171
|
-
keepLocked),status:()=>({busy:workspaceMaintenance.active,pendingRestore:workspaceMaintenance.pendingRestore})},workspaceCopyAccess={dataDir:DATA_DIR,appVersion:serverVersion(),readBody,restored:workspaceRestore,...workspaceBackupAccess,...CLOUD_HOME?{restart:()=>{restartRequested
|
|
32172
|
-
id12),hostedReady:()=>!!workspaceAccess&&entitled("admin")}));ROUTES2.push(createStopLineRoutes());var orgInstallStatuses=()=>orgLibrary?.installStatuses()??new Map;ROUTES2.push(createBotPresetRoutes({presets:presetStore,orgStatuses:orgInstallStatuses}));ROUTES2.push(createWorkspaceBannerRoutes(
|
|
32173
|
-
ownHome.owner(auth),computers:sharedComputers,sessionLive:id12=>sessions.isLive(id12),environmentId:ENVIRONMENT_ID,cloudHomeLender:CLOUD_HOME?CLOUD_HOME_LENDER:null,principal:sessionLendingPrincipal,personKey,power:()=>cloudPower,links:CLOUD_HOME?deviceLinks:null,upgrades,asks:computerAsks?.
|
|
32174
|
-
groupSpeakers,routines:()=>routines,fromPhone:phones2.fromPhone,notePhoneSend:phones2.noteSend,desktopManaged:DESKTOP_MANAGED,cloudHome:!!CLOUD_HOME,DirectSendRefused,acceptDirectSend,directSendRefusal,startTurn,usageTriggerFor,messageSender,cloudGuestSendRefusal,cloudThreadRefusal,runOwners,
|
|
32175
|
-
(bot,email3)=>relayedSendRefusal(bot,email3,!!(email3&&teamOwners.people?.list().some(one5=>one5.email===email3&&one5.role!=="member"))):void 0,noAiRefusal:noAiNotice.refusal,cardAnswerRefusal,commandRememberRefusal,requestBehavior,requestedTaskBot,botForThread,threadBusy,botAtThreadCapacity,
|
|
32176
|
-
resolveAndSendMcp,resolveAndSendRoutine,resolveAndSendProfile,resolveAndSendModel,resolveSkillRequest,sendSkillResolution,answerRequest,deliverLateQuestionAnswer,stopThreadForPerson,cancelDirectTurnDispatch,revokeInternalCapabilitiesForThread,cancelGroupTurnOperations,closeOpenApprovals,
|
|
32177
|
-
serverPress(bot,threadId,messageId2,action3,auth)??proactive.brief.serverPress(bot,threadId,messageId2,action3,auth),goals:oneOnOneGoals,inboxReply:teamMessages.replyIn,typedCardAnswer:askCards.typed,...CLOUD_TEAM?{teamAiOwnerName:()=>teamAiOwner(teamOwners.
|
|
32178
|
-
let bot=botId?store4.bot(botId):store4.botByThread(threadId);return bot?messageFileRootsForThread(bot.id,threadId).filter(root3=>root3!==ATTACHMENTS_DIR):null},chatApps=createChatApps({store:store4,dataDir:DATA_DIR,liveRows:liveAppRows,
|
|
32179
|
-
probeAs:server2=>mcpServersHost.probeAs(server2),oauth:mcpOAuth});ROUTES2.push(createChatAppRoutes({store:store4,apps:chatApps,threadRefusal:cloudThreadRefusal,mcpRpc:chatAppsMcp.rpc,threadVisible:(auth,threadId)=>(auth.kind!=="session"||
|
|
32180
|
-
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
|
|
32181
|
-
active||moveFreeze.frozen(),apps:{chat:chatApps,store:store4}});ROUTES2.push(createReactionRoutes({react,reactorFor,cloudGuestSendRefusal}),publishedPages.routes,savedSteps.routes,createPlacesElsewhereRoutes({elsewhere:placesElsewhere,owner:auth=>!sharedMembership()
|
|
32182
|
-
[...store4.bots.map(bot=>bot.avatarUrl),cfg.profile?.avatarUrl],[workspaceBannerStore.current()?.name,...routineFiles,...calendarCalls.list().flatMap(call2=>call2.attachments?.map(file2=>file2.path)??[]),...[...turnAttachmentsByTurn.values()].flat().map(file2=>file2.
|
|
32183
|
-
|
|
32184
|
-
loopback:LOOPBACK10,defaultPage:DEFAULT_PAGE,workspaceAccess:()=>workspaceAccess,desktopMutationToken:()=>desktopMutationToken,companionMutationToken:()=>companionMutationToken,cliOwnerToken:()=>cliOwnerToken,pageSize,messagePage,messageWindow,publicBotQueuedMessages,publicGroupState,
|
|
32185
|
-
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/
|
|
32186
|
-
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,
|
|
32187
|
-
moved(changed3)}),createTeamOwnerRoutes({team:CLOUD_TEAM,people:teamOwners.people,store:store4,presence:teamPresence.of,record:(auth,row)=>appendAdminAction(DATA_DIR,{...row,actor:decisionActorFor(auth)}),sees:(auth,botId)=>visibleTo(viewerFor(auth)).bot(botId),publicBot,
|
|
32188
|
-
cloudOwnerProfileFields:CLOUD_OWNER_PROFILE_FIELDS,hostedModels,supportsApprovalMode:supportsApprovalMode2,directTurnBots,broadcast,notificationListed,wireBot,cloudOwnerSession,storedAvatarExists,requestedTaskBot,threadBusy,activeGroupTurnForBot,checkedModelSelection,
|
|
32189
|
-
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,
|
|
32190
|
-
sessions,browserRuntime,browserLive,memoryUpkeep,cacheKeepWarm,hostedModels,supportsApprovalMode:supportsApprovalMode2,routines:()=>routines,activeVpsThreads,hostedWorkspace:HOSTED_WORKSPACE,hostedFullAccessRefusal:HOSTED_FULL_ACCESS_REFUSAL,desktopManaged:DESKTOP_MANAGED,
|
|
32191
|
-
revokeInternalCapabilitiesForThread,runningTurnInstance,closeOpenApprovals,assertTeamComputerChangeIdle,forgetTemporaryBrowser,levelOf,team:!!CLOUD_TEAM,mainThreadTasks,chiefChanged:changed3=>chiefRooms.moved(changed3),...personRooms.personMarkThread?{personMarkThread:personRooms.
|
|
32192
|
-
revokeInternalCapabilitiesForThread,activeGroupTurnForBot,cancelGroupTurnOperations,runningTurnInstance,closeOpenApprovals,deleteBotWithLifecycle}));ROUTES2.push(createBotSkillsRoutes({store:store4,cfg,listBotSkills,readBotSkillFile,stagedSkillListing}));ROUTES2.push(
|
|
32193
|
-
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?{
|
|
32194
|
-
{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.
|
|
32195
|
-
"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())),
|
|
32196
|
-
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(
|
|
32197
|
-
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(
|
|
32198
|
-
presser:auth=>setupPresser(sharedMembership(),auth,messageSender(auth)),canSetUp:(botId,threadId)=>registry2.get(store4.projectBotForTask(botId,threadId)?.modelSelection.instanceId??"")?.adapter.capabilities.agentsMcp===!0,send:(auth,botId,threadId,text30)=>acceptDirectSend(
|
|
32199
|
-
{desktopManaged:DESKTOP_MANAGED,managed:!!(CLOUD_HOME||HOSTED_WORKSPACE)})}),createSeatsRoutes({signInList:signInAllowList,sessions:()=>sessions.list()}),createTimeZoneRoutes({adopts:!!CLOUD_HOME,dataDir:DATA_DIR,changed:()=>routines?.rescheduleLocalTimes()}),
|
|
32200
|
-
skills:bot=>listSkills(bot.id),logins:logins2,config:()=>cfg,lineLanguage:personLanguages.forLine,chats:{store:store4,dataDir:DATA_DIR,owner:cloudSendOwner,...CLOUD_OWNER_KEY?{ownerKey:CLOUD_OWNER_KEY}:{},stamped:threadId=>ownerOnlyCache.delete(threadId),instanceExists:id12=>!!registry2.
|
|
32201
|
-
appEvents:()=>appTriggers.manager,waits:()=>botWaits},connectionsMoved:language=>cloudConnections.moved(language),connections:()=>cloudConnections.connections(),connectionFingerprints:nonce=>cloudConnections.fingerprints(nonce),move:{dataDir:DATA_DIR,store:store4,routines:()=>routines,calls:()=>calendarCalls,
|
|
32202
|
-
ownRoutine:(routine,person2)=>{cloudRoutineAuthors?.record(routine.id,routine),cloudRoutineAuthors?.wrote(routine.id,person2)},arrived:()=>ownerOnlyCache.clear(),teamMemory,aboutMe:()=>cfg.profile?.aboutMe??"",saveAboutMe:text30=>{saveConfig({profile:{...cfg.profile,aboutMe:text30}}),Object.assign(cfg,
|
|
32203
|
-
needsYou}:{},sources:()=>({bots:store4.bots,groups:store4.groups,routines,parked:coordinator.active(),engines:registry2.instances().map(instance=>({instanceId:instance.instanceId,snapshot:registry2.lastSnapshot(instance.instanceId)}))})}),createInboxRoutes(teamMessages));CLOUD_TEAM&&teamHost.
|
|
32204
|
-
wireBot}),createPresenceRoutes({isOwner:ownerOrAdmin,heard:(auth,language)=>personLanguages.heard(auth.kind==="session"?actorKey(auth):THIS_COMPUTER,language),sawChat:(_auth,threadId)=>{store4.botByThread(threadId)&&sawThread(threadId)},active:async(source4,zone,language)=>{
|
|
32205
|
-
kind==="session"?auth.session:null,welcome:teamWelcome,profile:teamHost.memberProfile,save:teamHost.saveMemberProfile,seed:teamHost.seedMemberProfile,seeded:teamHost.seededFields,changed:()=>broadcast({kind:"config",...configStatus()})}),teamAway.routes,createTeamPhoneRoutes(
|
|
32206
|
-
publicOrigin:CLOUD_HOME?.publicOrigin??null,record:(auth,row)=>appendAdminAction(DATA_DIR,{...row,actor:decisionActorFor(auth)})}),createSignInCardRoutes({settle:signInSettle.settle,saveLogin:(botId,threadId,messageId2,body2,auth)=>CLOUD_TEAM&&!auth.scopes.includes(
|
|
32207
|
-
{logins:logins2,cardBots:id12=>botLogins.cardBots(id12),settle:signInSettle.settle,openCard:(botId,threadId,messageId2)=>{let card=signInMessage(botId,threadId,messageId2)?.signIn;return card&&card.place==="browser"&&!card.superseded&&!card.
|
|
32208
|
-
appRefusal(slug3)&&!managedConnectorUnavailableReason(connectionMode(cfg),slug3)&&!teamConnections.personApps().includes(slug3),pickAvailable:()=>appPickAvailable(cfg),decider});ROUTES2.push(createAppSuggestionRoutes(appSuggestions));
|
|
32209
|
-
cloudHome:!!CLOUD_HOME,visibleFor:auth=>visibleTo(viewerFor(auth)),actorKey,threadStarters,createChannel,publicGroupState,groupFor:personRooms.groupForAuth}));ROUTES2.push(createChannelRoutes({store:store4,threadRead:teamMessages.
|
|
32210
|
-
skillReview,groupSpeakers,groupTurnOperations,lastReply,cloudThreadRefusal,messageSender,usageTriggerFor,publicGroupState,groupWithThread,updateChannel:updateChannel2,groupIsWorking,groupThreadIsWorking,readCursor,
|
|
32211
|
-
var taskRoutes=createTaskRoutes({store:store4,threadRead:teamMessages.seen,cloudHome:!!CLOUD_HOME,desktopManaged:DESKTOP_MANAGED,hostedWorkspace:HOSTED_WORKSPACE,hostedFullAccessRefusal:HOSTED_FULL_ACCESS_REFUSAL,
|
|
32212
|
-
broadcast,notificationListed,publicBot,wireBot,wireTask,pageSize,messagePage,checkedModelSelection,checkedTaskModelSwitch,threadTitleGate,generateThreadTitle,settleDirectFollowup,clearTurnDigestState,revokeInternalCapabilitiesForThread,
|
|
32213
|
-
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
|
|
32214
|
-
forgetPerson(person2)),...teamRoutines.leaving,forgetOnBots:email3=>forgetMember(store4,email3,(bot,access2)=>writeAccess({store:store4,publicGroupState,broadcast,audienceChanged},bot,access2)).length,ownerOf:botId=>{
|
|
32215
|
-
auth.session).name||void 0:cfg.profile?.name?.trim(),routines:()=>routines,orgLibrary:()=>orgLibrary,broadcast,publicBot,publicGroupState,groupWithThread,defaultSelection,defaultsPresetFor,packageImportDeps,
|
|
32216
|
-
null?"team":teamHost.browserAudience(threadId)),list:target4=>listSignedInSites(target4),signOut:(target4,site)=>signOutOfSites(target4,site)}));ROUTES2.push(createBrowserEvidenceRoutes({evidence:browserEvidence.
|
|
32217
|
-
linked:()=>botLogins.linkedSecrets(),keys:mcpKeys}));var privateRecords=createPrivateRecords({visibleFor:auth=>visibleTo(viewerFor(auth)),botExists:id12=>!!store4.bot(id12),routine:id12=>routines?.listRoutines().
|
|
32218
|
-
threadId)??store4.bot(groupSpeakers.get(threadId)?.botId??"");return bot?{botId:bot.id,botName:bot.name,model:bot.modelSelection.model,driverKind:registry2.get(bot.modelSelection.instanceId)?.driverKind??
|
|
32219
|
-
botId,threadIds,(from,to2)=>hostedModels?.resetTask(from,to2)??{}),mayChangeModel:auth=>!CLOUD_HOME||cloudOwnerSession(auth),reply:botId=>publicBot(store4.bot(botId))}));ROUTES2.push(createUndoRoutes(
|
|
32220
|
-
|
|
32221
|
-
mcpConfigBusy:{get:()=>mcpConfigBusy,set:busy=>{mcpConfigBusy=busy}},mcpServerResponse,mcpPolicyRefusal,persistMcpServers,savedCustomDomain,appCatalog:chatAppsMcp,keys:mcpKeys,forgetPeople:name6=>teamConnections.
|
|
32222
|
-
mcp.changed"})}),persistAnnouncedMcpServers=next=>{persistMcpServers(next),broadcast({kind:"mcp.changed"})},postiz=createPostiz({cfg:()=>cfg,mcpOAuth,persistMcpServers:persistAnnouncedMcpServers,mcpConfigBusy:mcpConfig.
|
|
32223
|
-
sharedComputers,sharedComputerControl,closeBrowser,browserEngineSwitched,hostedModels:!!hostedModels,cloudHome:!!CLOUD_HOME,sharedMembership,lendingEnabled:()=>lendingEnabled()||ownerLends(),providerConfigs,localVmIdleMs,
|
|
32224
|
-
managedBoatOwners,providerOperationConflict,perBotLocalVmCountForModeChange,checkedModelSelection,policyModelRefusal,browserSessionSpec,configStatus,configForAccess:(status5,auth)=>configForAccess(status5,auth.scopes.includes(
|
|
32225
|
-
{},resyncOpenCodeProviderKeys,revokeEngineCapabilities,reloadProviders,broadcast,drainQueuedSends,postiz}));ROUTES2.push(createInstanceRoutes({store:store4,cfg,registry:registry2,sessions,providerAuthSessions,hostedModels:!!hostedModels,
|
|
32226
|
-
check}));ROUTES2.push(createMcpServerRoutes({cfg,bot:id12=>store4.bot(id12),sessions,mcpOAuth,teamConnections,cloudHome:CLOUD_HOME,fallbackPublicUrl:FALLBACK_PUBLIC_URL,mcpServerResponse,savedCustomDomain,appCatalog:chatAppsMcp,
|
|
32227
|
-
push(createSetupImportRoutes({local:DESKTOP_MANAGED&&!CLOUD_HOME&&!HOSTED_WORKSPACE,cfg,mcpPolicyRefusal,persistMcpServers:persistAnnouncedMcpServers,mcpConfigBusy:mcpConfig.busy}));ROUTES2.push(createComputerRoutes({store:store4,
|
|
32228
|
-
localVmProvisionBusy:{get:()=>localVmProvisionBusy,set:busy=>{localVmProvisionBusy=busy}},localVmModeChangeBusy:{get:()=>localVmModeChangeBusy},localVmOwnerBusy,localVmIdleMs,localVmLeaseFor,localVmIdleFor,localVmTargetForBot,
|
|
32229
|
-
claimTeamComputerLifecycle,claimBotComputerLifecycle,claimBoatInventoryRequest,claimManagedBoatMutation,claimManagedVpsMutation,cloudComputerUsed:owner2=>cloudComputerPower.used(owner2)}));ROUTES2.push(createStatusRoutes(
|
|
32230
|
-
set:error66=>{browserEngineInstallError=error66}}}));ROUTES2.push(desktopViewer.route);ROUTES2.push(createBrowserViewerRoutes({upgrades,viewers:browserLive,dataDir:DATA_DIR,person:auth=>auth.kind===
|
|
32231
|
-
such bot"};if(!builtInBrowserEnabled(cfg)||bot.browser===!1)return{status:409,error:"Enable this bot's browser in its profile first."};let browser=await browserIntegration(bot.id,bot.browserProfile,
|
|
32232
|
-
is unavailable."},current:(botId,session,auth,audience2)=>{let current3=store4.bot(botId);return!!current3&¤t3.browser!==!1&&builtInBrowserEnabled(cfg)&¤tBrowserSession(current3.id,current3.
|
|
32233
|
-
browserProfile).includes(session)).map(candidate=>({waitingOnBrowser:computerControl.snapshot(candidate.id).help?.place==="browser"})))}));var internalToolRoutes=createInternalToolRoutes({engineLimits:{
|
|
32234
|
-
|
|
32235
|
-
unavailable===!0}));function liveBotFor(botId){let bot=store4.bot(botId);if(!bot)throw new LiveSessionError("That bot no longer exists.",404);return{name:bot.name,title:bot.title,description:bot.
|
|
32236
|
-
return null;let gate=threadTitleGate(bot);return gate.ok?generateThreadTitle(gate.instance,excerpt,"call"):null}var liveCalls=new LiveCallController({store:store4,send:async({auth,botId,threadId,
|
|
32237
|
-
|
|
32238
|
-
busy?task2.activity==="waiting-on-you"?"waiting":"working":"idle"},broadcast:frame2=>broadcast(frame2,{adminOnly:!0}),settings:()=>liveCallSettings(cfg),azureRefusal:auth=>azureLiveCallRefusal(
|
|
32239
|
-
sessionId,endpoint),speakable:text30=>toUtterances(text30),recordCall:input2=>{let row=recordLiveCall({chatExists:(botId,threadId)=>!!store4.taskByThread(botId,threadId),appendMessage:(threadId,message8)=>store4.
|
|
32240
|
-
threadId,row})},log:line6=>console.log(line6)});sessions.onSessionRevoked(sessionId=>liveCalls.sessionRevoked(sessionId));ROUTES2.push(createDataRoutes({bot:id12=>store4.bot(id12),engine:dataEngine2,sheets:dataSheets,
|
|
32241
|
-
botByThread(target4)?.id!==bot.id?null:{botId:bot.id,botName:bot.name,threadId:target4}},settings:()=>liveSettingsFor(cfg),saveSettings:async patch2=>{if(providerConfigBusy)throw Object.assign(new Error("
|
|
32242
|
-
req,res);let url2;try{url2=new URL(req.url??"/",`http://localhost:${PORT2}`)}catch{return json3(res,400,{error:"invalid request URL"})}let path6=url2.pathname,method2=req.method??"GET";cloudPower?.arrived(
|
|
32243
|
-
|
|
32244
|
-
if(workspaceAccess){if(await workspaceAccess.handlePublic(req,res,url2))return}else if(path6.startsWith("/api/auth/hosted/")||path6==="/pair"||path6==="/"&&(!isLoopbackHost(req.headers.host)||isProxied(req)))
|
|
32245
|
-
let answer2=method2==="GET"?await teamConnections.mcpCallback(req.headers.host,url2.search):{status:400,text:"Invalid sign-in callback. Return to Limix Bot and try again."};res.writeHead(answer2.status,
|
|
32246
|
-
"cache-control":"no-store"}).end(),!0):serveStatic(res,path6,STATIC_DIR)))return;if(method2==="GET"&&path6==="/.well-known/openmausbot/environment")return json3(res,200,environmentDescriptor({environmentId:ENVIRONMENT_ID
|
|
32247
|
-
exec(path6);if(method2==="GET"&&domainCheck2){res.setHeader("cache-control","no-store");let challenge=customDomainVerifier.challenge(domainCheck2[1]);return json3(res,challenge?200:404,challenge??
|
|
32248
|
-
sharedComputers:lendingEnabled()})},req,res,path6,method2)||cloudSigned&&await cloudSigned({req,res,url:url2,path:path6,method:method2})||chatApps.serveFile(req,res,path6,method2))return;
|
|
32249
|
-
cookie===!0,label4=typeof body2?.label=="string"?body2.label:"",attemptId=typeof body2?.attemptId=="string"?body2.attemptId:void 0,browser=body2?.browser===!0;if(browser&&body2?.preview
|
|
32250
|
-
let result2=sessions.exchange({code,label:label4,attemptId,browser,source:requestSource(req),fallbackLabel:labelFromUserAgent(req.headers["user-agent"])});if(!result2.ok)return console.
|
|
32251
|
-
sharedComputers:lendingEnabled(),cloudHome:!!CLOUD_HOME,cloudTeam:CLOUD_TEAM!==null,ownHome:ownHome.takesMove()});if(wantsCookie){let previous2=browser?sessions.authenticate(parseCookies(
|
|
32252
|
-
session)})),json3(res,200,{session:result2.session,environment})}return json3(res,200,{token:result2.token,session:result2.session,environment})}if(method2==="POST"&&path6==="/api/
|
|
32253
|
-
deviceName=="string"?body2.deviceName:"",attemptId=typeof body2?.pairRequestId=="string"?body2.pairRequestId:void 0,relayRefusal=phoneRelay?.pairingRefusal(req,credential);
|
|
32254
|
-
|
|
32255
|
-
features:{sharedComputers:lendingEnabled()},loopbackTrust:LOOPBACK10.trust,cliOwnerToken,trustLocalBrowser:LOOPBACK10.localBrowsers,...CLOUD_TEAM?{restricted:moveInRefusal}:
|
|
32256
|
-
|
|
32257
|
-
|
|
32258
|
-
auth,method2,path6,visible);if(refused2)return json3(res,403,refused2);if((viewer.kind==="member"||visible.filtersThreads)&&onJsonBody(res,body2=>memberBody(
|
|
32259
|
-
req,res,path6,auth)
|
|
32260
|
-
|
|
32261
|
-
{}
|
|
32262
|
-
|
|
32263
|
-
|
|
32264
|
-
|
|
32265
|
-
|
|
32266
|
-
|
|
32267
|
-
|
|
32268
|
-
|
|
32269
|
-
|
|
32270
|
-
|
|
32271
|
-
|
|
32272
|
-
|
|
32273
|
-
|
|
32274
|
-
req));if(!parsed2.success||!store4.bot(parsed2.data.botId))return json3(res,400,{error:"invalid test capability"});let live2=activeInternalGenerationByThread.
|
|
32275
|
-
minted.id,threadId),latestUser=[...store4.activePath(threadId)].reverse().find(message8=>message8.role==="user"&&message8.kind==="text"&&message8.
|
|
32276
|
-
|
|
32277
|
-
|
|
32278
|
-
|
|
32279
|
-
|
|
32280
|
-
"
|
|
32281
|
-
|
|
32282
|
-
|
|
32283
|
-
|
|
32284
|
-
|
|
32285
|
-
|
|
32286
|
-
|
|
32287
|
-
|
|
32288
|
-
internalSender.id,
|
|
32289
|
-
|
|
32290
|
-
|
|
32291
|
-
taskByThread(bot.id,internalCapability.threadId),bot.computer),current3=source4?source4.mounted??"off":await computerPreviewSurface(bot,bot.threadId);
|
|
32292
|
-
one or it is unavailable.`}:{},options:options2});if(computerSelectionTurns.get(internalCapability.threadId)!==source4)return json3(res,409,{error:"
|
|
32293
|
-
startsOnFirstCall,chosen),option2=picked.option;return option2?.available?!source4.selected&&picked.current?json3(res,200,{status:"ready",surface:current3,
|
|
32294
|
-
|
|
32295
|
-
"POST"&&path6==="/api/internal/
|
|
32296
|
-
url2.searchParams.get("offset")??"0");if(!/^r-[0-9a-f-]{36}$/.test(id12)||!Number.isSafeInteger(offset4)||offset4<0)return json3(res,400,
|
|
32297
|
-
|
|
32298
|
-
workspaceDir??null}),threadId:internalCapability.threadId,input:(body2?.tool==="show_html"||body2?.tool==="
|
|
32299
|
-
status,{error:result2.error})}if((path6==="/api/internal/memory"||path6==="/api/internal/memory/log")&&method2==="
|
|
32300
|
-
|
|
32301
|
-
trustedWrite(internalSender.id,write4):write4();if(method2==="POST"&&path6==="/api/internal/memory"){let body2=await readInternalBody(),
|
|
32302
|
-
|
|
32303
|
-
|
|
32304
|
-
|
|
32305
|
-
|
|
32306
|
-
|
|
32307
|
-
|
|
32308
|
-
|
|
32309
|
-
|
|
32310
|
-
|
|
32311
|
-
|
|
32312
|
-
|
|
32313
|
-
|
|
32314
|
-
res,200,{claimed:!0}):json3(res,409,{error:"another thread is using the phone"});if(method2==="GET"&&path6==="/api/internal/shared-computers"&&botLending()){let principal=sharedComputerPrincipal(
|
|
32315
|
-
list(principal),...sharedComputers.away(principal),...sharedComputers.screenNotLent(principal),...why?{unavailable:cloudLendingRefusalForBot(internalCapability),say:why}:{}})}if(method2===
|
|
32316
|
-
|
|
32317
|
-
parsed2.data,await sharedComputers.request(parsed2.data,principal,()=>botLending()&&internalCapabilityIsActive(internalCapability)))})}if(method2==="GET"&&path6==="/api
|
|
32318
|
-
title:b11.title||void 0,description:b11.description||void 0}});return json3(res,200,{bots})}if(await dispatchRoutes([createInternalThreadRoutes({store:store4,coordinator,
|
|
32319
|
-
queuedThreadPosition,queuedReason:queuedStatus}),createToolTimingRoute(usageTrace,internalCapability.threadId)],{req,res,url:url2,path:path6,method:method2,auth,json:json3,
|
|
32320
|
-
path=="string"?body2.path:"",requestedName=typeof body2.name=="string"?body2.name:void 0;try{let vm=await attachmentVmForTurn(internalCapability),outcome=await attachForTurn(
|
|
32321
|
-
|
|
32322
|
-
"limit")return json3(res,429,{error:`You already attached ${MAX_ATTACHED_FILES_PER_TURN} files this turn. Put the rest in one document or archive summary instead.`});
|
|
32323
|
-
let status5=typeof error66.status=="number"?error66.status:500,message8=status5===404?`No file was found at ${requestedPath}. Save it under /
|
|
32324
|
-
|
|
32325
|
-
{error:"
|
|
32326
|
-
|
|
32327
|
-
{id:group2.id,name:group2.name,members:group2.memberIds.map(id12=>store4.bot(id12)).filter(member=>!!member).map(member=>member.name)})}return json3(
|
|
32328
|
-
|
|
32329
|
-
|
|
32330
|
-
error});let
|
|
32331
|
-
|
|
32332
|
-
|
|
32333
|
-
|
|
32334
|
-
|
|
32335
|
-
proposed=await routineRequests.submit({botId:from.id,threadId:fromThreadId,proposal:proposedInput,from:sender2,canCommit:()=>internalCapabilityIsActive(
|
|
32336
|
-
"create"||applied.action==="update")&&(cloudRoutineAuthors?.forget(applied.resultId),cloudRoutineAuthors?.wrote(applied.resultId,outside?CLOUD_OUTSIDE_KEY:
|
|
32337
|
-
requestId:proposed.requestId,botId:from.id,botName:from.name,tool:proposedCard?.tool,summary:proposedCard?.subtitle??proposed.summary,decision:"
|
|
32338
|
-
|
|
32339
|
-
|
|
32340
|
-
key,kind:body2.kind,name:body2.name,detail:body2.detail,aliases:body2.aliases},submitted=teamMemoryRequests.submit(from,body2.fromThreadId,!!owner2.
|
|
32341
|
-
|
|
32342
|
-
res,403,{error:"source conversation does not belong to sender"});let targetBotId=body2.forBotId?.trim()||from.id,proposed=profileRequests.submit({botId:from.
|
|
32343
|
-
state==="applied"?"auto-approved":"card-shown",source:proposed.state==="applied"?proposed.appliedBy??"full-access":"profile"}),json3(res,201,proposed)}if(method2===
|
|
32344
|
-
|
|
32345
|
-
reason:body2.reason,from:owner2.group?{botId:from.id,name:from.name,color:from.color}:void 0});return appendDecision(DATA_DIR,{threadId:body2.fromThreadId,
|
|
32346
|
-
|
|
32347
|
-
threadId:internalCapability.threadId})}),
|
|
32348
|
-
"POST"&&path6==="/api/internal/team-setup-requests"){let parsed2=external_exports.object({fromBotId:external_exports.string().optional(),fromThreadId:external_exports.
|
|
32349
|
-
conversation no longer belongs to the Chief"});let proposed=await teamSetupRequests.submit({botId:chief.id,threadId:internalCapability.threadId,plan:parsed2.data.plan,
|
|
32350
|
-
detail,decision:proposed.state==="applied"?"auto-approved":"card-shown",source:"appliedBy"in proposed?proposed.appliedBy:"profile"}),json3(res,201,proposed)}
|
|
32351
|
-
if(!parsed2.success)return json3(res,400,{error:"An exact bot id and deletion reason are required"});let chief=store4.bot(internalCapability.botId),owner2=connectorThread(
|
|
32352
|
-
internalCapability),...owner2.group?{from:{botId:chief.id,name:chief.name,color:chief.color}}:{}});return(proposed.state==="applied"||proposed.state==="
|
|
32353
|
-
|
|
32354
|
-
|
|
32355
|
-
until===null)return json3(res,400,{error:"
|
|
32356
|
-
|
|
32357
|
-
from
|
|
32358
|
-
|
|
32359
|
-
res,
|
|
32360
|
-
|
|
32361
|
-
res,
|
|
32362
|
-
|
|
32363
|
-
|
|
32364
|
-
|
|
32365
|
-
|
|
32366
|
-
|
|
32367
|
-
|
|
32368
|
-
|
|
32369
|
-
|
|
32370
|
-
|
|
32371
|
-
|
|
32372
|
-
|
|
32373
|
-
|
|
32374
|
-
|
|
32375
|
-
addressed,
|
|
32376
|
-
|
|
32377
|
-
|
|
32378
|
-
|
|
32379
|
-
|
|
32380
|
-
|
|
32381
|
-
|
|
32382
|
-
|
|
32383
|
-
|
|
32384
|
-
|
|
32385
|
-
|
|
32386
|
-
|
|
32387
|
-
|
|
32388
|
-
|
|
32389
|
-
|
|
32390
|
-
|
|
32391
|
-
|
|
32392
|
-
|
|
32393
|
-
{
|
|
32394
|
-
|
|
32395
|
-
|
|
32396
|
-
|
|
32397
|
-
|
|
32398
|
-
|
|
32399
|
-
|
|
32400
|
-
|
|
32401
|
-
|
|
32402
|
-
|
|
32403
|
-
|
|
32404
|
-
|
|
32405
|
-
|
|
32406
|
-
|
|
32407
|
-
|
|
32408
|
-
|
|
32409
|
-
|
|
32410
|
-
|
|
32411
|
-
|
|
32412
|
-
|
|
32413
|
-
|
|
32414
|
-
{
|
|
32415
|
-
|
|
32416
|
-
|
|
32417
|
-
|
|
32418
|
-
return json3(res,
|
|
32419
|
-
|
|
32420
|
-
|
|
32421
|
-
|
|
32422
|
-
|
|
32423
|
-
|
|
32146
|
+
profile?.name||process.env.LIMIX_ACCOUNT_NAME||"",email:cfg.profile?.email||process.env.LIMIX_ACCOUNT_EMAIL||"",aboutMe:cfg.profile?.aboutMe??"",...cfg.profile?.avatarUrl?{avatarUrl:cfg.profile.avatarUrl}:{}},managedPolicy:managedPolicy.summary(),...CLOUD_HOME?{cloudHome:!0}:{},...CLOUD_TEAM?{team:{id:CLOUD_TEAM.id,name:CLOUD_TEAM.name,...CLOUD_HOME?{cloudPage:`${CLOUD_HOME.adminOrigin}/cloud`}:{}}}:{},language:appLanguage()??"",computerName:cfg.computerName??"",everyBotRules:cfg.everyBotRules??
|
|
32147
|
+
"",rooms:{turnTimeoutMinutes:roomTurnTimeoutMinutes(cfg)},mcp:{callTimeoutMinutes:mcpCallTimeoutMinutes(cfg)},automaticRecovery:cfg.automaticRecovery??{enabled:!1},cacheKeepWarm:cacheKeepWarmSettings(cfg),newBots:cfg.newBots?.effort?{effort:cfg.newBots.effort}:{},threads:{maxConcurrentPerBot:maxConcurrentBotThreads(cfg,botThreadsHost(cloudPlanTier.starter())),...eventLogMaxBytes!==null?{eventLogMaxBytes}:{},...eventLogRetentionDays!==null?{eventLogRetentionDays}:{}},localVm:{mode:localVmMode(cfg),
|
|
32148
|
+
maxInstances:localVmMaxInstances(cfg),idleTimeoutMinutes:localVmIdleTimeoutMinutes(cfg),preserveInstalledApps:localVmPreservesInstalledApps(cfg)},features:{skillAuthoring:skillAuthoringEnabled(cfg),skillReview:cfg.features?.skillReview!==!1,skillAutoApply:skillAutoApplyEnabled(cfg),skillReviewSteps:skillReviewSteps(cfg),skillsLibrary:skillsLibraryEnabled(cfg),shareLearnedSkills:skillsHost.mode(),showToolCalls:showToolCallsEnabled(cfg),browser:builtInBrowserEnabled(cfg),sharedComputers:sharedComputersEnabled(
|
|
32149
|
+
cfg),claudeUserMcp:claudeUserMcpEnabled(cfg),claudeUserSkills:claudeUserSkillsEnabled(cfg),autoRecall:autoRecallEnabled(cfg),roomMemoryCapture:roomMemoryCaptureEnabled(cfg),parallelRoomJobs:parallelRoomJobsEnabled(cfg),llmThreadTitles:llmThreadTitlesEnabled(cfg),savedSteps:savedStepsEnabled(cfg),savedStepsHere:savedSteps.here()},onboarding:{completedAt:cfg.onboarding?.completedAt??"",version:cfg.onboarding?.version??0,reelSeen:cfg.onboarding?.reelSeen===!0,hintsSeen:cfg.onboarding?.hintsSeen??[],
|
|
32150
|
+
...cfg.onboarding?.firstTurnAt?{firstTurnAt:cfg.onboarding.firstTurnAt}:{}},browserEngine:browserEngineSummary(),browserProfiles:cfg.browserProfiles??[],signIn:{admins:cfg.signIn?.admins??[],members:cfg.signIn?.members??[]},membership:workspaceMembership(),workspaceBanner:workspaceBannerSummary()}}function configForAccess(status5,admin,session){let profile=CLOUD_TEAM?session?teamHost.memberProfile(session):NOBODY_PROFILE:status5.profile,onboarding=CLOUD_TEAM?teamOnboarding(status5.onboarding,session,
|
|
32151
|
+
teamWelcome):status5.onboarding;return admin?CLOUD_TEAM?{...status5,profile,onboarding}:status5:{...withoutKeyHints(status5),edition:{edition:status5.edition.edition,features:status5.edition.features},signIn:{admins:[],members:[]},live:liveSettingsForClient(status5.live),everyBotRules:void 0,vps:{configured:status5.vps.configured,sshAlias:""},opencodeGo:{configured:status5.opencodeGo.configured,providerKeys:[]},...CLOUD_TEAM?{onboarding}:{},profile:CLOUD_TEAM?profile:{name:profile.name,email:"",
|
|
32152
|
+
...profile.avatarUrl?{avatarUrl:profile.avatarUrl}:{}},browserProfiles:status5.browserProfiles.map(profile2=>Object.fromEntries(Object.entries(profile2).filter(([key7])=>key7!=="partitionId")))}}function engineMcpServers(bot){return teamConnections.engineMcp(bot)}function teamAdminHost(){if(CLOUD_TEAM)return{summary:async()=>connectionHealth.adminRead({...teamAdminSummary({apps:configured(cfg)?await connectedServices(cfg).catch(()=>null):null,mcp:mcpServerResponse().servers,status:configStatus(),
|
|
32153
|
+
voice:{key:!!cfg.tts?.key?.trim(),included:describeVoice(cfg).included===!0},engines:registry2.instances().map(instance=>({instanceId:instance.instanceId,name:instance.displayName??instance.driverKind,snapshot:registry2.lastSnapshot(instance.instanceId)}))}),...await teamConnections.adminExtras()})}}function persistMcpServers(next){saveConfig({mcpServers:next}),cfg.mcpServers=next}async function describeInstances(){let configs=providerConfigs();retryComputerEngineMove();let read4=testedAi.read(),
|
|
32154
|
+
engines=selectableInstances(await registry2.describe({known:!0,reuse:{ms:ENGINE_LIST_REUSE_MS,changed:()=>broadcast({kind:"config",...configStatus()})}}));await refreshUnsetModelSelections(engines,read4);let ownReady=cloudCredit!==null&&engines.some(instance=>!selectionContext.company(instance.instanceId)&&readyToRun(instance,selectionContext));return engines.map(instance=>{let entry2=configs[instance.instanceId],described={...instance,...testedAi.info(instance),...engineUpdates.shown(instance.driverKind),
|
|
32155
|
+
...instanceLook(entry2),...entry2?.access?{access:entry2.access}:{},...entry2?.driver==="openai-compat"&&typeof entry2.config?.replyWaitMinutes=="number"?{replyWaitMinutes:entry2.config.replyWaitMinutes}:{},...heldKeys?.refusal(instance.instanceId)?{snapshot:{state:"unavailable",reason:TRIAL_KEY_HELD}}:{}};if(hostedModels)return{...described,readOnly:!0,install:void 0,authentication:void 0,cli:void 0,cliCandidates:[]};if(cloudCredit?.owns(instance.instanceId))return{...described,readOnly:!0,trialCredit:cloudCredit.
|
|
32156
|
+
status(),install:void 0,authentication:void 0,cli:void 0,cliCandidates:[],...ownReady&&described.snapshot.state==="available"?{snapshot:{state:"unavailable",reason:TRIAL_CREDIT_OWN_AI}}:{}};let policyReason=policyModelRefusal(instance),policy=policyReason?{policy:{organizationName:managedPolicy.current().organizationName,reason:policyReason,...managedPolicy.current().team?{team:!0}:{}}}:{};if(managedDesktop.owns(instance.instanceId))return{...described,...policy,readOnly:!0,managed:managedDesktop.
|
|
32157
|
+
info(instance.instanceId),install:void 0,authentication:void 0,cli:void 0,cliCandidates:[]};if(instance.driverKind==="antigravityAgent"&&process.platform==="win32")return{...described,...policy,freeUpSpace:!0};if(entry2?.driver!=="claudeAgent")return{...described,...policy};if(instance.instanceId===CLAUDE_API_INSTANCE)return{...described,...policy,authentication:void 0,install:{...instance.install,signInCommand:void 0}};try{let claudeAccount=claudeAccountInfo(instance.instanceId,entry2,instance.
|
|
32158
|
+
cli??instance.cliDefault??"claude");return{...described,...policy,claudeAccount,install:{...instance.install,signInCommand:claudeAccount.signInCommand}}}catch{return{...described,...policy,install:{...instance.install,signInCommand:void 0}}}})}var companyShutdown=!1;async function stopCompanyInstances(ids){if(!ids.length)return;if(companyShutdown){for(let id12 of ids)providerAuthSessions.clearInstance(id12),bus.detach(id12);return}let cause="turn interrupted \u2014 the Company connection changed",
|
|
32159
|
+
selected=new Set(ids);for(let id12 of ids)providerInstancesChanging.add(id12);let direct=store4.bots.flatMap(bot=>store4.tasks(bot.id).filter(task2=>threadBusy(bot.id,task2.threadId)&&selected.has(botForThread(bot.id,task2.threadId).modelSelection.instanceId)).map(task2=>({botId:bot.id,threadId:task2.threadId,owner:turnResourceOwners.get(task2.threadId),generation:directTurnGenerationByThread.get(task2.threadId)})));for(let{threadId}of direct)turnStops.stopping(threadId,liveTurnByThread.get(threadId),
|
|
32160
|
+
cause);await Promise.all(direct.map(task2=>interruptDirectThread(task2.botId,task2.threadId)));for(let{botId,threadId,owner:owner2,generation}of direct){let interrupted=stoppedTurnText(threadId,liveTurnByThread.get(threadId),cause);releaseTurnResources(owner2),settleDirectFollowup(owner2?.generation,{ok:!1,text:interrupted}),directTurnGenerationByThread.get(threadId)===generation&&(stopScreenPoller(botId,threadId),releaseLocalVmThread(threadId),watchdog.settle(threadId),closeOpenApprovals(threadId),
|
|
32161
|
+
directTurnBots.delete(threadId),routines?.failThread(threadId,"Company connection changed while this thread was running",{stopReason:"interrupted"}),store4.taskByThread(botId,threadId)&&(store4.appendMessage(threadId,{role:"bot",kind:"activity",tool:{name:"Company connection changed \u2014 choose whether to reconnect or use a personal model",ok:!1}}),store4.setTaskActivity(botId,threadId,"idle")))}for(let[threadId,speaker2]of[...groupSpeakers]){if(groupSpeakers.get(threadId)!==speaker2)continue;
|
|
32162
|
+
let bot=store4.bot(speaker2.botId);if(!bot||!selected.has(bot.modelSelection.instanceId))continue;let group2=store4.groupByThread(threadId),owner2=turnResourceOwners.get(threadId);group2&&cancelGroupTurnOperations(group2.id,threadId,{status:"stopped",detail:stoppedTurnOutcome({reason:cause,activities:[]}),byHarness:!0}),revokeInternalCapabilitiesForThread(threadId),await runningTurnInstance(bot,threadId)?.adapter.interruptTurn(threadId);let stillOwned=groupSpeakers.get(threadId)===speaker2&&turnResourceOwners.
|
|
32163
|
+
get(threadId)?.generation===owner2?.generation;releaseTurnResources(owner2),stillOwned&&(releaseLocalVmThread(threadId),watchdog.settle(threadId),closeOpenApprovals(threadId),groupSpeakers.delete(threadId),group2&&store4.patchGroup(group2.id,{busyBotId:activeGroupSpeaker(group2.id)?.botId??null}),store4.setActivity(bot.id,"idle"))}for(let id12 of ids)providerAuthSessions.clearInstance(id12),bus.detach(id12)}async function persistProviderInstance(instanceId,instances){if(saveConfig({instances},{replaceInstances:!0}),
|
|
32164
|
+
cfg.instances=instances,providerAuthSessions.clearInstance(instanceId),bus.detach(instanceId),Object.hasOwn(instances,instanceId)){await registry2.load({[instanceId]:instanceConfigs(cfg)[instanceId]});let live2=registry2.get(instanceId);live2&&bus.attach([live2])}else await registry2.dispose(instanceId);resetPathCache()}function threadEngineId(botId,threadId){return((groupSpeakers.get(threadId)?.botId??botId)===botId?runningTurnEngines.get(threadId)?.instanceId:void 0)??botForThread(botId,threadId)?.
|
|
32165
|
+
modelSelection.instanceId}function revokeEngineCapabilities(engines){if(!engines.size)return;let onChanged=(botId,threadId)=>engines.has(threadEngineId(botId,threadId)??"");for(let capability2 of internalCapabilities.values())onChanged(capability2.botId,capability2.threadId)&&revokeEarlierTurnCapabilities(capability2.threadId);for(let[threadId,slots]of sessionCredentials)for(let slot of slots.keys())onChanged(slot.split(" ")[0],threadId)&&slots.delete(slot)}async function reloadProviders(before){
|
|
32166
|
+
let configs=providerConfigs(),changed3=new Set(changedInstanceIds(before,engineLaunches(configs)));if(!changed3.size)return;let onChanged=(botId,threadId)=>changed3.has(threadEngineId(botId,threadId)??""),direct=store4.bots.flatMap(bot=>store4.tasks(bot.id).filter(task2=>threadBusy(bot.id,task2.threadId)&&onChanged(bot.id,task2.threadId)).map(task2=>({botId:bot.id,threadId:task2.threadId,owner:turnResourceOwners.get(task2.threadId)}))),rooms=[...groupSpeakers.entries()].filter(([threadId,speaker2])=>onChanged(
|
|
32167
|
+
speaker2.botId,threadId)),cause="turn interrupted \u2014 provider settings changed";providerFleetReloading=!0;for(let id12 of changed3)providerInstancesChanging.add(id12);revokeEngineCapabilities(changed3);for(let id12 of changed3)providerAuthSessions.clearInstance(id12),bus.detach(id12);for(let task2 of direct)cancelDirectTurnDispatch(task2.botId,task2.threadId);for(let[threadId]of rooms){let group2=store4.groupByThread(threadId);group2&&cancelGroupTurnOperations(group2.id,threadId,{status:"sto\
|
|
32168
|
+
pped",detail:stoppedTurnOutcome({reason:cause,activities:[]}),byHarness:!0})}try{let kept2=[...changed3].filter(id12=>Object.hasOwn(configs,id12));await Promise.all([...changed3].filter(id12=>!Object.hasOwn(configs,id12)).map(id12=>registry2.dispose(id12))),await registry2.load(Object.fromEntries(kept2.map(id12=>[id12,configs[id12]])),decorateHostedProvider),bus.attach(kept2.flatMap(id12=>registry2.get(id12)??[]))}finally{for(let{botId,threadId,owner:owner2}of direct){let interrupted=stoppedTurnText(
|
|
32169
|
+
threadId,liveTurnByThread.get(threadId),cause);stopScreenPoller(botId,threadId),releaseLocalVmThread(threadId),releaseTurnResources(owner2),endForeignTurns(threadId),vpsThreadEnded(botId,threadId),watchdog.settle(threadId),closeOpenApprovals(threadId),directTurnBots.delete(threadId),runningTurnEngines.delete(threadId),routines?.failThread(threadId,"Provider settings changed while this thread was running",{stopReason:"interrupted"}),store4.taskByThread(botId,threadId)&&(store4.appendMessage(threadId,
|
|
32170
|
+
{role:"bot",kind:"activity",tool:failedTurnTool(cause)}),store4.setTaskActivity(botId,threadId,"idle")),settleDirectFollowup(owner2?.generation,{ok:!1,text:interrupted})}for(let[threadId,speaker2]of rooms){if(releaseLocalVmThread(threadId),releaseTurnResources(turnResourceOwners.get(threadId)),endForeignTurns(threadId),watchdog.settle(threadId),closeOpenApprovals(threadId),groupSpeakers.get(threadId)!==speaker2)continue;runningTurnEngines.delete(threadId),groupSpeakers.delete(threadId);let group2=store4.
|
|
32171
|
+
groupByThread(threadId);group2&&store4.patchGroup(group2.id,{busyBotId:activeGroupSpeaker(group2.id)?.botId??null}),store4.setActivity(speaker2.botId,"idle")}for(let id12 of changed3)providerInstancesChanging.delete(id12);providerFleetReloading=!1}drainQueuedSends()}var providerConfigBusy=!1,providerInstancesChanging=new Set,mcpConfigBusy=!1,workspaceBackupAccess={authorized:(req,original)=>{let current3=resolveRequestAuth(req,{sessions,cookieName:SESSION_COOKIE,streamPath:"/api/events",url:new URL(
|
|
32172
|
+
req.url??"/",`http://localhost:${PORT2}`),loopbackMutationToken:desktopMutationToken,companionMutationToken,loopbackTrust:LOOPBACK10.trust,cliOwnerToken,trustLocalBrowser:LOOPBACK10.localBrowsers}).auth;return!!(current3?.scopes.includes("admin")&¤t3.kind===original.kind&&(current3.kind!=="session"||original.kind==="session"&¤t3.session.id===original.session.id))},exclusive:(work,keepLocked)=>workspaceMaintenance.run(async()=>{if(keepLocked&&teamComputers.list().some(computer=>computer.
|
|
32173
|
+
section!==null))throw Object.assign(new Error("Unassign team computers before restoring this workspace"),{status:409});return work()},{idle:()=>!providerFleetReloading&&!providerAuthSessions.active&&!browserEngineInstall&&!routines?.isTicking&&!calendarCalls?.isTicking&&!botWaits.isTicking&&!localVmImageBusy&&!localVmProvisionBusy&&!localVmModeChangeBusy&&!localVmLifecycleBusy.size&&!boatLifecycleBusyBots.size&&!computerPreviews.size&&!orphanBoatLifecycleBusyIds.size&&!computerProviderConfigTransitions.
|
|
32174
|
+
size&&teamComputers.list().every(computer=>!teamComputerInUse(computer))&&store4.bots.every(bot=>!botHasActiveTurn(bot.id)&&!routines?.activeRunForBot(bot.id)&&!botComputerControlSnapshot(bot.id).held)&&store4.groups.every(group2=>!groupIsWorking(group2)),pause:()=>{routines?.stop(),calendarCalls?.stop(),botWaits.stop(),watchdog.stop(),memoryUpkeep.pause()},resume:()=>{moveFreeze.frozen()||(routines?.start(),calendarCalls?.start(),botWaits.start()),watchdog.start(),memoryUpkeep.resume()},flush:async()=>{
|
|
32175
|
+
await Promise.all([chatApps.settleLive(),flushAllProfileHistory(),flushAllMemoryJournals(),flushUsageLedger(DATA_DIR),flushDecisionLog(DATA_DIR),flushAdminActivity(DATA_DIR)]),await closeMessageSearch(),closeMessageDb()}},keepLocked),status:()=>({busy:workspaceMaintenance.active,pendingRestore:workspaceMaintenance.pendingRestore})},workspaceCopyAccess={dataDir:DATA_DIR,appVersion:serverVersion(),readBody,restored:workspaceRestore,...workspaceBackupAccess,...CLOUD_HOME?{restart:()=>{restartRequested=
|
|
32176
|
+
!0,gracefulShutdown()}}:{}},workspaceBackupRoutes=createWorkspaceBackupRoutes(workspaceCopyAccess),restartRequested=!1,cloudMoveRoutes=createCloudMoveRoutes();ROUTES2.push(createHostedSlackRoutes({bot:id12=>store4.bot(id12),hostedReady:()=>!!workspaceAccess&&entitled("admin")}));ROUTES2.push(createStopLineRoutes());var orgInstallStatuses=()=>orgLibrary?.installStatuses()??new Map;ROUTES2.push(createBotPresetRoutes({presets:presetStore,orgStatuses:orgInstallStatuses}));ROUTES2.push(createWorkspaceBannerRoutes(
|
|
32177
|
+
{changed:()=>broadcast({kind:"config",...configStatus()})}));ROUTES2.push(createStarterAwakeRoutes({awake:starterAwake}));ROUTES2.push(createSharedComputerRoutes({enabled:auth=>lendingEnabled()||ownerLends()&&ownHome.owner(auth),computers:sharedComputers,sessionLive:id12=>sessions.isLive(id12),environmentId:ENVIRONMENT_ID,cloudHomeLender:CLOUD_HOME?CLOUD_HOME_LENDER:null,principal:sessionLendingPrincipal,personKey,power:()=>cloudPower,links:CLOUD_HOME?deviceLinks:null,upgrades,asks:computerAsks?.
|
|
32178
|
+
asks??null,answerer:cardAnswererFor}));ROUTES2.push(createBotMessageRoutes({store:store4,registry:registry2,handoffs,liveTurn:threadId=>liveTurns.running(threadId),phoneSecretSubmissions,directTurnDispatchClaims,groupSpeakers,routines:()=>routines,fromPhone:phones2.fromPhone,notePhoneSend:phones2.noteSend,desktopManaged:DESKTOP_MANAGED,cloudHome:!!CLOUD_HOME,DirectSendRefused,acceptDirectSend,directSendRefusal,startTurn,usageTriggerFor,messageSender,cloudGuestSendRefusal,cloudThreadRefusal,runOwners,
|
|
32179
|
+
runActor,resolveAccessRequest:(threadId,requestId,behavior,message8)=>lendingLifts?.resolve(threadId,requestId,behavior)??accessRequests.resolve(threadId,requestId,behavior,message8),relayRefusal:CLOUD_TEAM?(bot,email3)=>relayedSendRefusal(bot,email3,!!(email3&&teamOwners.people?.list().some(one5=>one5.email===email3&&one5.role!=="member"))):void 0,noAiRefusal:noAiNotice.refusal,cardAnswerRefusal,commandRememberRefusal,requestBehavior,requestedTaskBot,botForThread,threadBusy,botAtThreadCapacity,
|
|
32180
|
+
parksBehindCoordination,activeGroupTurnForBot,runningTurnInstance,engineSteersImages,resolveReplyTarget,turnSelection,policyModelRefusal,clearUnattended,drainQueuedSends,answeringCardAs,resolveAndSendTrust,resolveAndSendTeamSetup,resolveAndSendMcp,resolveAndSendRoutine,resolveAndSendProfile,resolveAndSendModel,resolveSkillRequest,sendSkillResolution,answerRequest,deliverLateQuestionAnswer,stopThreadForPerson,cancelDirectTurnDispatch,revokeInternalCapabilitiesForThread,cancelGroupTurnOperations,closeOpenApprovals,
|
|
32181
|
+
harnessCardOutcome,answeredIn:(threadId,requestId)=>automationReports.answeredIn(teamMessages.inbox.answeredIn(threadId,requestId),requestId),pressRecords:proactive.brief.pressRecords,serverPress:(bot,threadId,messageId2,action3,auth)=>meetingsHost.serverPress(bot,threadId,messageId2,action3,auth)??proactive.brief.serverPress(bot,threadId,messageId2,action3,auth),goals:oneOnOneGoals,inboxReply:teamMessages.replyIn,typedCardAnswer:askCards.typed,...CLOUD_TEAM?{teamAiOwnerName:()=>teamAiOwner(teamOwners.
|
|
32182
|
+
people?.list()??[],teamHost.personName)?.name??""}:{},relayedReaction:(threadId,messageId2,person2,emoji3)=>{store4.setReaction(threadId,messageId2,relayedPersonKey(person2),{emoji:emoji3,name:person2.name??person2.email,at:Date.now()})}}));var liveRoots=(threadId,botId)=>{let bot=botId?store4.bot(botId):store4.botByThread(threadId);return bot?messageFileRootsForThread(bot.id,threadId).filter(root3=>root3!==ATTACHMENTS_DIR):null},chatApps=createChatApps({store:store4,dataDir:DATA_DIR,liveRows:liveAppRows,
|
|
32183
|
+
liveRoots,paused:()=>workspaceMaintenance.active||moveFreeze.frozen()}),chatAppsMcp=createChatAppsMcp({store:store4,apps:chatApps,dataDir:DATA_DIR,keys:mcpKeys,storedServers:()=>cfg.mcpServers??{},mountedServers:engineMcpServers,personMcp:teamConnections.personMcp,probeAs:server2=>mcpServersHost.probeAs(server2),oauth:mcpOAuth});ROUTES2.push(createChatAppRoutes({store:store4,apps:chatApps,threadRefusal:cloudThreadRefusal,mcpRpc:chatAppsMcp.rpc,threadVisible:(auth,threadId)=>(auth.kind!=="session"||
|
|
32184
|
+
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&&
|
|
32185
|
+
!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()&&
|
|
32186
|
+
!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(file2=>file2.path)??[]),...[...turnAttachmentsByTurn.values()].flat().map(file2=>file2.
|
|
32187
|
+
path)]):null};createDeleteLeftovers({dataDir:DATA_DIR,store:store4,threadsReferencing,keptAttachments,deleteAttachment:name6=>deleteAttachment(join275(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)=>{
|
|
32188
|
+
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,
|
|
32189
|
+
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\
|
|
32190
|
+
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,
|
|
32191
|
+
checkedModelSelection,cloudOwnerSession,wireBot,team:CLOUD_TEAM&&teamOwners.people?{name:CLOUD_TEAM.name,people:teamOwners.people}:null,personaliseSetupCard:bot=>setupSuggestions.personalise(bot.id),chiefChanged:changed3=>chiefRooms.moved(changed3)}),createTeamOwnerRoutes({team:CLOUD_TEAM,people:teamOwners.people,store:store4,presence:teamPresence.of,record:(auth,row)=>appendAdminAction(DATA_DIR,{...row,actor:decisionActorFor(auth)}),sees:(auth,botId)=>visibleTo(viewerFor(auth)).bot(botId),publicBot,
|
|
32192
|
+
profileOf:email3=>teamHost.people.profile(personKey({id:"",email:email3}))}));ROUTES2.push(createBotSettingsRoutes({store:store4,cfg,registry:registry2,commandAllowlist,commandAllowlistDrivers:COMMAND_ALLOWLIST_DRIVERS,cloudHome:!!CLOUD_HOME,cloudOwnerProfileFields:CLOUD_OWNER_PROFILE_FIELDS,hostedModels,supportsApprovalMode:supportsApprovalMode2,directTurnBots,broadcast,notificationListed,wireBot,cloudOwnerSession,storedAvatarExists,requestedTaskBot,threadBusy,activeGroupTurnForBot,checkedModelSelection,
|
|
32193
|
+
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,
|
|
32194
|
+
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,
|
|
32195
|
+
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.
|
|
32196
|
+
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(
|
|
32197
|
+
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?{
|
|
32198
|
+
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.
|
|
32199
|
+
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())),
|
|
32200
|
+
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(
|
|
32201
|
+
{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(
|
|
32202
|
+
{config:()=>cfg}),createHelperSuggestionRoutes({notNow:proactive.suggestionNotNow}),createSetupRequestRoutes({store:store4,language:()=>appLanguage()??Intl.DateTimeFormat().resolvedOptions().locale,sendRefusal:cloudGuestSendRefusal,presser:auth=>setupPresser(sharedMembership(),auth,messageSender(auth)),canSetUp:(botId,threadId)=>registry2.get(store4.projectBotForTask(botId,threadId)?.modelSelection.instanceId??"")?.adapter.capabilities.agentsMcp===!0,send:(auth,botId,threadId,text30)=>acceptDirectSend(
|
|
32203
|
+
{botId,threadId,text:text30,sender:messageSender(auth),trigger:usageTriggerFor(auth),personPresent:auth.kind==="session"||DESKTOP_MANAGED})}),createNotificationRoutes(void 0,notificationListed),createUpdateCheckRoutes({check:serverUpdateChecker({desktopManaged:DESKTOP_MANAGED,managed:!!(CLOUD_HOME||HOSTED_WORKSPACE)})}),createSeatsRoutes({signInList:signInAllowList,sessions:()=>sessions.list()}),createTimeZoneRoutes({adopts:!!CLOUD_HOME,dataDir:DATA_DIR,changed:()=>routines?.rescheduleLocalTimes()}),
|
|
32204
|
+
createCloudSendRoutes({appVersion:serverVersion(),...CLOUD_TEAM?{refusal:personalMoveRefusal(CLOUD_TEAM),scope:auth=>teamMoveIn?.scope(auth)??null}:{},bots:()=>store4.bots,messagesTail:(threadId,limit2)=>store4.messagesTail(threadId,limit2),skills:bot=>listSkills(bot.id),logins:logins2,config:()=>cfg,lineLanguage:personLanguages.forLine,chats:{store:store4,dataDir:DATA_DIR,owner:cloudSendOwner,...CLOUD_OWNER_KEY?{ownerKey:CLOUD_OWNER_KEY}:{},stamped:threadId=>ownerOnlyCache.delete(threadId),instanceExists:id12=>!!registry2.
|
|
32205
|
+
get(id12),approvalSupported:(selection3,mode)=>supportsApprovalMode2(selection3,mode)},cloudHome:!!CLOUD_HOME,ownHome:ownHome.owner,automations:{routines:()=>routines,calls:()=>calendarCalls,webhooks:()=>webhooks,appEvents:()=>appTriggers.manager,waits:()=>botWaits},connectionsMoved:language=>cloudConnections.moved(language),connections:()=>cloudConnections.connections(),connectionFingerprints:nonce=>cloudConnections.fingerprints(nonce),move:{dataDir:DATA_DIR,store:store4,routines:()=>routines,calls:()=>calendarCalls,
|
|
32206
|
+
webhooks:()=>webhooks,appEvents:()=>appTriggers.manager,claudeCodeSkills:()=>claudeUserSkillsEnabled(cfg)?claudeCodeSkillInputs():[],instanceExists:id12=>!!registry2.get(id12),owner:cloudSendOwner,ownRoutine:(routine,person2)=>{cloudRoutineAuthors?.record(routine.id,routine),cloudRoutineAuthors?.wrote(routine.id,person2)},arrived:()=>ownerOnlyCache.clear(),teamMemory,aboutMe:()=>cfg.profile?.aboutMe??"",saveAboutMe:text30=>{saveConfig({profile:{...cfg.profile,aboutMe:text30}}),Object.assign(cfg,
|
|
32207
|
+
loadConfig()),broadcast({kind:"config",...configStatus()})}}}),cloudConnections.routes,createTodayRoutes({visibleFor:auth=>visibleTo(viewerFor(auth)),...teamOwners.asks?{asks:teamOwners.asks,messages:teamMessages.needsYou}:{},sources:()=>({bots:store4.bots,groups:store4.groups,routines,parked:coordinator.active(),engines:registry2.instances().map(instance=>({instanceId:instance.instanceId,snapshot:registry2.lastSnapshot(instance.instanceId)}))})}),createInboxRoutes(teamMessages));CLOUD_TEAM&&teamHost.
|
|
32208
|
+
adoptServerProfile(sessions.list().flatMap(session=>session.email?[session.email]:[]));ROUTES2.push(teamPresence.routes,createSidebarSectionRoutes({store:store4,teamComputers,maxBots:MAX_WORKSPACE_BOTS,assertTeamComputerChangeIdle,wireBot}),createPresenceRoutes({isOwner:ownerOrAdmin,heard:(auth,language)=>personLanguages.heard(auth.kind==="session"?actorKey(auth):THIS_COMPUTER,language),sawChat:(_auth,threadId)=>{store4.botByThread(threadId)&&sawThread(threadId)},active:async(source4,zone,language)=>{
|
|
32209
|
+
let answer2=await proactive.brief.active(source4,zone,language);return firstHourHooks.arrived(),answer2},...CLOUD_TEAM?{member:auth=>(noAiNotice.flush(),teamMessages.arrived(auth))}:{}}),createMeRoutes({team:CLOUD_TEAM,session:auth=>auth.kind==="session"?auth.session:null,welcome:teamWelcome,profile:teamHost.memberProfile,save:teamHost.saveMemberProfile,seed:teamHost.seedMemberProfile,seeded:teamHost.seededFields,changed:()=>broadcast({kind:"config",...configStatus()})}),teamAway.routes,createTeamPhoneRoutes(
|
|
32210
|
+
{team:CLOUD_TEAM,sessions,publicBase:(req,auth)=>pairingLinkBase(publicUrl(),auth.kind==="session"?requestOrigin(req):null)}),createTeamConnectionRoutes({host:teamConnections,cfg:()=>cfg,composio:composio_exports,policy:managedPolicy,publicOrigin:CLOUD_HOME?.publicOrigin??null,record:(auth,row)=>appendAdminAction(DATA_DIR,{...row,actor:decisionActorFor(auth)})}),createSignInCardRoutes({settle:signInSettle.settle,saveLogin:(botId,threadId,messageId2,body2,auth)=>CLOUD_TEAM&&!auth.scopes.includes(
|
|
32211
|
+
"admin")?Promise.resolve({status:403,body:memberLoginRefusal(CLOUD_TEAM)}):saveLoginFromCard(botId,threadId,messageId2,body2),saveTarget:signInSaveTarget,threadVisible:(auth,threadId)=>visibleTo(viewerFor(auth)).thread(threadId),vault:createSignInVaultChoices({logins:logins2,cardBots:id12=>botLogins.cardBots(id12),settle:signInSettle.settle,openCard:(botId,threadId,messageId2)=>{let card=signInMessage(botId,threadId,messageId2)?.signIn;return card&&card.place==="browser"&&!card.superseded&&!card.
|
|
32212
|
+
answeredInChat&&!card.stopped&&!signInOutcome(card)?card:null}})}));var appSuggestions=createAppSuggestions({dataDir:DATA_DIR,store:store4,configured:()=>configured(cfg),catalog:()=>listToolkits(cfg),services:()=>connectedServices(cfg),offerable:slug3=>!managedPolicy.appRefusal(slug3)&&!managedConnectorUnavailableReason(connectionMode(cfg),slug3)&&!teamConnections.personApps().includes(slug3),pickAvailable:()=>appPickAvailable(cfg),decider});ROUTES2.push(createAppSuggestionRoutes(appSuggestions));
|
|
32213
|
+
ROUTES2.push(createRoomHoldRoutes({group:id12=>store4.group(id12),groupFor:personRooms.groupForAuth,setHold:(groupId,botId,held4)=>{let updated=setRoomHold(groupId,botId,held4);return updated?publicGroupState(updated):null}}));ROUTES2.push(createGroupRoutes({store:store4,cloudHome:!!CLOUD_HOME,visibleFor:auth=>visibleTo(viewerFor(auth)),actorKey,threadStarters,createChannel,publicGroupState,groupFor:personRooms.groupForAuth}));ROUTES2.push(createChannelRoutes({store:store4,threadRead:teamMessages.
|
|
32214
|
+
seen,runOwners,runActor,personMarkRoom:personRooms.personMarkRoom,groupFor:personRooms.groupForAuth,cfg,userName:userNameFor,desktopManaged:DESKTOP_MANAGED,routines:()=>routines,broadcast,notificationListed,actorKey,threadStarters,phoneSecretSubmissions,sendSequencer,roomMemberContexts,skillReview,groupSpeakers,groupTurnOperations,lastReply,cloudThreadRefusal,messageSender,usageTriggerFor,publicGroupState,groupWithThread,updateChannel:updateChannel2,groupIsWorking,groupThreadIsWorking,readCursor,
|
|
32215
|
+
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,
|
|
32216
|
+
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,
|
|
32217
|
+
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\
|
|
32218
|
+
the team"),deleteBot:memberOwnBot.remove,threadsReferencing,deleteAttachment:name6=>deleteAttachment(join275(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=>{
|
|
32219
|
+
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,
|
|
32220
|
+
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.
|
|
32221
|
+
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().
|
|
32222
|
+
find(routine=>routine.id===id12)});ROUTES2.push(createUsageRoutes({dataDir:DATA_DIR,prices:operatorPrices,budget:()=>spendState(cfg,DATA_DIR),currency:()=>cfg.billing?.currency??"USD",recorder:usageTrace,messages:threadId=>store4.messagesFor(threadId),liveBot:threadId=>{let bot=store4.botByThread(threadId)??store4.bot(groupSpeakers.get(threadId)?.botId??"");return bot?{botId:bot.id,botName:bot.name,model:bot.modelSelection.model,driverKind:registry2.get(bot.modelSelection.instanceId)?.driverKind??
|
|
32223
|
+
""}:null},canSee:auth=>{let visible=visibleTo(viewerFor(auth));return threadId=>visible.thread(threadId)},rowFor:privateRecords.usageRow}));ROUTES2.push(createThreadModelRoutes({bot:id12=>store4.bot(id12),busy:(botId,threadId)=>threadBusy(botId,threadId),follow:(botId,threadIds)=>store4.followBotModel(botId,threadIds,(from,to2)=>hostedModels?.resetTask(from,to2)??{}),mayChangeModel:auth=>!CLOUD_HOME||cloudOwnerSession(auth),reply:botId=>publicBot(store4.bot(botId))}));ROUTES2.push(createUndoRoutes(
|
|
32224
|
+
{refusal:(auth,threadId,requestId)=>cardAnswerRefusal(auth,threadId,requestId,"allow"),undo:(auth,res,threadId,requestId)=>withDecisionActor(decisionActorFor(auth),()=>undoAppliedChange(res,threadId,requestId))}));ROUTES2.push(createAntigravityLeftoverRoutes({hosted:!!hostedModels,isAntigravity:instanceId=>registry2.get(instanceId)?.driverKind==="antigravityAgent",find:()=>findAntigravityLeftovers(),remove:()=>removeAntigravityLeftovers()}));ROUTES2.push(createAntigravityAccountRoutes({instances:()=>persistableInstanceConfigs(
|
|
32225
|
+
cfg),persist:persistProviderInstance,describe:describeInstances,exclusive:work=>providerConfigBusy?null:(providerConfigBusy=!0,work().finally(()=>{providerConfigBusy=!1}))}));var mcpConfig=createMcpConfig({cfg,sessions,mcpOAuth,teamConnections,cloudHome:CLOUD_HOME,fallbackPublicUrl:FALLBACK_PUBLIC_URL,mcpConfigBusy:{get:()=>mcpConfigBusy,set:busy=>{mcpConfigBusy=busy}},mcpServerResponse,mcpPolicyRefusal,persistMcpServers,savedCustomDomain,appCatalog:chatAppsMcp,keys:mcpKeys,forgetPeople:name6=>teamConnections.
|
|
32226
|
+
forgetServer(name6),health:mcpServersHost.health,botsPath:()=>brokerPath(botBox),connectionsChanged:change2=>{routineHolds?.connections(change2)},probeAs:mcpServersHost.probeAs,testElsewhere:(name6,server2,lender,signal)=>lentMcp.test(name6,server2,lender,signal),changed:()=>broadcast({kind:"mcp.changed"})}),persistAnnouncedMcpServers=next=>{persistMcpServers(next),broadcast({kind:"mcp.changed"})},postiz=createPostiz({cfg:()=>cfg,mcpOAuth,persistMcpServers:persistAnnouncedMcpServers,mcpConfigBusy:mcpConfig.
|
|
32227
|
+
busy,mcpPolicyRefusal,appCatalog:chatAppsMcp,team:teamConnections,loopback:!CLOUD_HOME&&!HOSTED_WORKSPACE});ROUTES2.push(createPostizRoutes({postiz}),createConfigRoutes({store:store4,cfg,registry:registry2,sessions,browserCleanup,browserLive,browserRuntime,usedBrowserSessions,decider,sharedComputers,sharedComputerControl,closeBrowser,browserEngineSwitched,hostedModels:!!hostedModels,cloudHome:!!CLOUD_HOME,sharedMembership,lendingEnabled:()=>lendingEnabled()||ownerLends(),providerConfigs,localVmIdleMs,
|
|
32228
|
+
localVmIdles,localVmActiveThreads,localVmLifecycleBusy,localVmImageBusy:{get:()=>localVmImageBusy},localVmModeChangeBusy:{set:busy=>{localVmModeChangeBusy=busy}},providerConfigBusy:{get:()=>providerConfigBusy,set:busy=>{providerConfigBusy=busy}},computerProviderConfigTransitions,managedBoatOwners,providerOperationConflict,perBotLocalVmCountForModeChange,checkedModelSelection,policyModelRefusal,browserSessionSpec,configStatus,configForAccess:(status5,auth)=>configForAccess(status5,auth.scopes.includes(
|
|
32229
|
+
"admin"),auth.kind==="session"?auth.session:null),...CLOUD_TEAM?{ownProfile:(auth,profile)=>auth.kind==="session"?(teamHost.saveMemberProfile(auth.session,profile),!0):!1,ownHints:(auth,hints)=>auth.kind==="session"?(teamWelcome.save(personKey(auth.session),{hints}),!0):!1}:{},resyncOpenCodeProviderKeys,revokeEngineCapabilities,reloadProviders,broadcast,drainQueuedSends,postiz}));ROUTES2.push(createInstanceRoutes({store:store4,cfg,registry:registry2,sessions,providerAuthSessions,hostedModels:!!hostedModels,
|
|
32230
|
+
providerConfigBusy:{get:()=>providerConfigBusy,set:busy=>{providerConfigBusy=busy}},providerInstancesChanging,describeInstances,persistProviderInstance,configStatus,broadcast,testCliBinary,cliProbeEnvironment,threadBusy,botForThread,activeGroupTurnForBot,checkInstance:testedAi.check}));ROUTES2.push(createMcpServerRoutes({cfg,bot:id12=>store4.bot(id12),sessions,mcpOAuth,teamConnections,cloudHome:CLOUD_HOME,fallbackPublicUrl:FALLBACK_PUBLIC_URL,mcpServerResponse,savedCustomDomain,appCatalog:chatAppsMcp,
|
|
32231
|
+
config:mcpConfig,lender:sessionLendingPrincipal,connectionHealth,ownsVault:()=>!CLOUD_TEAM&&!HOSTED_WORKSPACE,place:(server2,auth)=>lentMcp.place(server2,{principal:sessionLendingPrincipal(auth),...auth.kind==="session"?{session:auth.session.id}:{},newest:!0})}));ROUTES2.push(createSetupImportRoutes({local:DESKTOP_MANAGED&&!CLOUD_HOME&&!HOSTED_WORKSPACE,cfg,mcpPolicyRefusal,persistMcpServers:persistAnnouncedMcpServers,mcpConfigBusy:mcpConfig.busy}));ROUTES2.push(createComputerRoutes({store:store4,
|
|
32232
|
+
cfg,sessions,teamComputers,computerControl,routines:()=>routines,controlLeaseIdSchema,boatLifecycleBusyBots,computerProviderConfigTransitions,localVmActiveThreads,localVmLifecycleBusy,localVmSeen,localVmImageBusy:{get:()=>localVmImageBusy,set:busy=>{localVmImageBusy=busy}},localVmProvisionBusy:{get:()=>localVmProvisionBusy,set:busy=>{localVmProvisionBusy=busy}},localVmModeChangeBusy:{get:()=>localVmModeChangeBusy},localVmOwnerBusy,localVmIdleMs,localVmLeaseFor,localVmIdleFor,localVmTargetForBot,
|
|
32233
|
+
localVmTargetForStatus,localVmPayload,localVmInventoryPayload,existingPerBotLocalVmCount,teamComputersPayload,teamComputerInUse,managedBoatOwners,providerTransitionMessage,botHasActiveTurn,botComputerControlKey,botComputerControlSnapshot,computerPreviewBot,computerPreviewSurface,claimTeamComputerLifecycle,claimBotComputerLifecycle,claimBoatInventoryRequest,claimManagedBoatMutation,claimManagedVpsMutation,cloudComputerUsed:owner2=>cloudComputerPower.used(owner2)}));ROUTES2.push(createStatusRoutes(
|
|
32234
|
+
{store:store4,cfg,staticDir:STATIC_DIR,sharedWorkspaceFullAccessEnabled,adminActivityRecording,configStatus,broadcast,threadShown,records:privateRecords,boxOn:()=>botBox.enabled(),browserEngineInstall:{get:()=>browserEngineInstall,set:install2=>{browserEngineInstall=install2}},browserEngineInstallError:{set:error66=>{browserEngineInstallError=error66}}}));ROUTES2.push(desktopViewer.route);ROUTES2.push(createBrowserViewerRoutes({upgrades,viewers:browserLive,dataDir:DATA_DIR,person:auth=>auth.kind===
|
|
32235
|
+
"session"?actorKey(auth):"local-owner",audience:(auth,threadId)=>teamHost.viewerBrowserAudience({threadId,sees:id12=>visibleTo(viewerFor(auth)).thread(id12),person:auth.kind==="session"?actorKey(auth):null}),browser:async(botId,audience2)=>{let bot=store4.bot(botId);if(!bot)return{status:404,error:"no such bot"};if(!builtInBrowserEnabled(cfg)||bot.browser===!1)return{status:409,error:"Enable this bot's browser in its profile first."};let browser=await browserIntegration(bot.id,bot.browserProfile,
|
|
32236
|
+
void 0,audience2);return browser?{botId:bot.id,session:browser.session,spec:browser.spec}:{status:503,error:"Install the browser first."}},authorize:async(req,auth)=>!HOSTED_WORKSPACE||auth.kind!=="session"?null:workspaceAccess?workspaceAccess.authorize(req,auth):{status:503,error:"Workspace sign-in is unavailable."},current:(botId,session,auth,audience2)=>{let current3=store4.bot(botId);return!!current3&¤t3.browser!==!1&&builtInBrowserEnabled(cfg)&¤tBrowserSession(current3.id,current3.
|
|
32237
|
+
browserProfile,audience2)===session&&(auth.kind!=="session"||sessions.isLive(auth.session.id)&&visibleTo(viewerFor(auth)).bot(botId))},restartRefusal:session=>browserRestartRefusal(browserRuntime.interrupted(session),store4.bots.filter(candidate=>candidate.busy&&browserSessionsOf(candidate.id,candidate.browserProfile).includes(session)).map(candidate=>({waitingOnBrowser:computerControl.snapshot(candidate.id).help?.place==="browser"})))}));var internalToolRoutes=createInternalToolRoutes({engineLimits:{
|
|
32238
|
+
instances:()=>registry2.instances(),configs:()=>instanceConfigs(cfg),status:instanceId=>registry2.knownSnapshot(instanceId),load:accounts=>loadPlanUsage({accounts}),audienceOf:threadId=>teamHost.audienceOf(threadId),guestDriven:cloudGuestDriven,dataDir:DATA_DIR},helpers:{decider,extractor},notifications:{bot:id12=>store4.bot(id12),team:sharedMembership,broadcast},xResearch:{credential:()=>researchCredential(cfg.treg?.key),botEnabled:botId=>store4.bot(botId)?.xResearch!==!1,cloudHome:CLOUD_HOME!==
|
|
32239
|
+
null,researchOff:()=>researchAvailability.refused()}}),waitRoutes=createWaitRoutes({waits:botWaits,cloudHome:!!CLOUD_HOME,sleeps:!!CLOUD_HOME&&CLOUD_TEAM===null});ROUTES2.push(createXConnectorRoutes({credential:()=>researchCredential(cfg.treg?.key),included:()=>xCredential(),unavailable:()=>xResearchStatus().unavailable===!0}));function liveBotFor(botId){let bot=store4.bot(botId);if(!bot)throw new LiveSessionError("That bot no longer exists.",404);return{name:bot.name,title:bot.title,description:bot.
|
|
32240
|
+
description}}function liveHistoryFor(threadId){return liveHistoryFrom(sinceFreshStart(store4.activePath(threadId)))}function liveSignedIn(auth){return auth.kind!=="session"||sessions.isLive(auth.session.id)}function liveCallTitle(botId,threadId,excerpt){let bot=store4.projectBotForTask(botId,threadId);if(!bot)return null;let gate=threadTitleGate(bot);return gate.ok?generateThreadTitle(gate.instance,excerpt,"call"):null}var liveCalls=new LiveCallController({store:store4,send:async({auth,botId,threadId,
|
|
32241
|
+
text:text30,callId})=>{if(!liveSignedIn(auth))throw new LiveCallSignedOutError;let receipt=await acceptDirectSend({botId,threadId,text:text30,sendId:phones2.sendIdFor(auth),sender:messageSender(auth),trigger:usageTriggerFor(auth),via:"call",callId,personPresent:!0,admin:runActor(auth).admin});return"queued"in receipt?{kind:"queued",queueId:receipt.queueId}:{kind:receipt.steered?"steered":"started",messageId:receipt.message.id}},respond:async input2=>{let result2=await respondToCard({...input2,via:"\
|
|
32242
|
+
call"});if(result2.ok)return{ok:!0};if(result2.status===401)throw new LiveCallSignedOutError;return{ok:!1,error:result2.error}},queued:isSteeredMessageQueued,signedIn:liveSignedIn,personKey:auth=>messageSender(auth)?.id,activity:(botId,threadId)=>{let task2=store4.taskByThread(botId,threadId);return task2?.busy?task2.activity==="waiting-on-you"?"waiting":"working":"idle"},broadcast:frame2=>broadcast(frame2,{adminOnly:!0}),settings:()=>liveCallSettings(cfg),azureRefusal:auth=>azureLiveCallRefusal(
|
|
32243
|
+
auth,{othersOnLoopback:adminActivityRecording()}),createSession:({key:key7,endpoint,sdp,botId,threadId,voice})=>createLiveSession({key:key7,endpoint,sdp,voice,bot:liveBotFor(botId),history:liveHistoryFor(threadId),cloudHome:!!CLOUD_HOME}),openSocket:openLiveSocket,attachUrl:(sessionId,endpoint)=>liveAttachUrl(sessionId,endpoint),speakable:text30=>toUtterances(text30),recordCall:input2=>{let row=recordLiveCall({chatExists:(botId,threadId)=>!!store4.taskByThread(botId,threadId),appendMessage:(threadId,message8)=>store4.
|
|
32244
|
+
appendMessage(threadId,message8)},input2);row&&titleLiveCall({messagesFor:threadId=>store4.messagesFor(threadId),patchMessage:(threadId,messageId2,patch2)=>store4.patchMessage(threadId,messageId2,patch2),excerpt:callTitleExcerpt,title:liveCallTitle,scrub:redactSecretsInText},{threadId:input2.threadId,row})},log:line6=>console.log(line6)});sessions.onSessionRevoked(sessionId=>liveCalls.sessionRevoked(sessionId));ROUTES2.push(createDataRoutes({bot:id12=>store4.bot(id12),engine:dataEngine2,sheets:dataSheets,
|
|
32245
|
+
compileChart:compileChart2,validateVegaLite:validateVegaLite2,renderer:chartRenderer2,exportRoots:dataExportRoots}));ROUTES2.push(createLiveRoutes({calls:liveCalls,resolveTarget:(botId,threadId)=>{let bot=store4.bot(botId);if(!bot)return null;let target4=threadId??bot.threadId;return store4.botByThread(target4)?.id!==bot.id?null:{botId:bot.id,botName:bot.name,threadId:target4}},settings:()=>liveSettingsFor(cfg),saveSettings:async patch2=>{if(providerConfigBusy)throw Object.assign(new Error("Sett\
|
|
32246
|
+
ings are already being updated. Try again in a moment."),{status:409});return saveLiveSettings(cfg,patch2),Object.assign(cfg,loadConfig()),broadcast({kind:"config",...configStatus()}),liveSettingsFor(cfg)}}));var toolResults=new ToolResults,handleRequest=async(req,res)=>{CLOUD_TEAM&&holdBodyDeadline(req,res);let url2;try{url2=new URL(req.url??"/",`http://localhost:${PORT2}`)}catch{return json3(res,400,{error:"invalid request URL"})}let path6=url2.pathname,method2=req.method??"GET";cloudPower?.arrived(
|
|
32247
|
+
path6,req.headers);let m3=null,releaseWorkspaceRequest;try{if(method2==="GET"&&path6==="/api/health/hosted"){res.setHeader("cache-control","no-store");let hosted=hostedWorkspaceConfiguration();return!hosted?.portalMembership||!workspaceAccess||!entitled("admin")?json3(res,503,{error:"Hosted workspace readiness is unavailable."}):(res.setHeader(HOSTED_CONTRACT_HEADER,String(1)),hostedModels&&res.setHeader(HOSTED_MODEL_POLICY_HEADER,"1"),json3(res,200,{ok:!0,service:"openmausbot",membershipAuthority:"\
|
|
32248
|
+
portal",workspace:hosted.workspace,...HOSTED_CONTRACT_METADATA}))}if(HOSTED_WORKSPACE){if(method2==="POST"&&["/api/auth/pair","/api/pair","/api/auth/pairing","/api/auth/email/start","/api/auth/email/verify"].includes(path6))return json3(res,403,{error:"Sign in through the workspace portal."});if(workspaceAccess){if(await workspaceAccess.handlePublic(req,res,url2))return}else if(path6.startsWith("/api/auth/hosted/")||path6==="/pair"||path6==="/"&&(!isLoopbackHost(req.headers.host)||isProxied(req)))
|
|
32249
|
+
return json3(res,503,{error:"Workspace sign-in is unavailable."})}if(method2==="POST"&&remoteAccessPaths(CLOUD_TEAM!==null).includes(path6)){let refusal7=managedPolicy.remoteAccessRefusal();if(refusal7)return json3(res,403,{error:refusal7,code:"managed_policy"})}if(path6===MCP_OAUTH_CALLBACK_PATH){let answer2=method2==="GET"?await teamConnections.mcpCallback(req.headers.host,url2.search):{status:400,text:"Invalid sign-in callback. Return to Limix Bot and try again."};res.writeHead(answer2.status,
|
|
32250
|
+
{"content-type":"text/plain; charset=utf-8","cache-control":"no-store","referrer-policy":"no-referrer"}),res.end(answer2.text);return}if(method2==="GET"&&!path6.startsWith("/api/")&&!path6.startsWith("/.well-known/")&&(moveFreeze.screen(path6)?(res.writeHead(302,{location:moveFreeze.screen(path6),"cache-control":"no-store"}).end(),!0):serveStatic(res,path6,STATIC_DIR)))return;if(method2==="GET"&&path6==="/.well-known/openmausbot/environment")return json3(res,200,environmentDescriptor({environmentId:ENVIRONMENT_ID,
|
|
32251
|
+
...TEAM_LABEL,desktopManaged:DESKTOP_MANAGED,emailSignIn:!HOSTED_WORKSPACE&&!CLOUD_HOME&&emailSignIn.enabled(),sharedComputers:lendingEnabled(),cloudHome:!!CLOUD_HOME,cloudTeam:CLOUD_TEAM!==null,ownHome:ownHome.takesMove()}));let domainCheck2=/^\/\.well-known\/openmausbot\/domain-check\/([a-f0-9]{64})$/.exec(path6);if(method2==="GET"&&domainCheck2){res.setHeader("cache-control","no-store");let challenge=customDomainVerifier.challenge(domainCheck2[1]);return json3(res,challenge?200:404,challenge??
|
|
32252
|
+
{error:"No active domain check."})}if(await emailSignInRoute({cloudHome:!!CLOUD_HOME,emailSignIn,sessions,cookieName:SESSION_COOKIE,target:r=>signInMailTarget(publicUrl(),requestOrigin(r)),environment:()=>environmentDescriptor({environmentId:ENVIRONMENT_ID,...TEAM_LABEL,desktopManaged:DESKTOP_MANAGED,emailSignIn:!0,sharedComputers:lendingEnabled()})},req,res,path6,method2)||cloudSigned&&await cloudSigned({req,res,url:url2,path:path6,method:method2})||chatApps.serveFile(req,res,path6,method2))return;
|
|
32253
|
+
if(method2==="POST"&&path6==="/api/auth/pair"){if(!/^application\/json\b/i.test(String(req.headers["content-type"]??"")))return json3(res,415,{error:"send the pairing code as JSON (content-type: application/json)"});let body2=await readBody(req),code=typeof body2?.code=="string"?body2.code:"",wantsCookie=body2?.cookie===!0,label4=typeof body2?.label=="string"?body2.label:"",attemptId=typeof body2?.attemptId=="string"?body2.attemptId:void 0,browser=body2?.browser===!0;if(browser&&body2?.preview===
|
|
32254
|
+
!0){let preview3=sessions.previewBrowserSignIn(code);return preview3?json3(res,200,{...preview3,...CLOUD_TEAM?{team:CLOUD_TEAM.name}:{}}):json3(res,401,userError("serverError.pair.linkExpired"))}if(browser&&!wantsCookie)return json3(res,400,{error:"a browser sign-in sets this browser's cookie; send cookie: true"});let result2=sessions.exchange({code,label:label4,attemptId,browser,source:requestSource(req),fallbackLabel:labelFromUserAgent(req.headers["user-agent"])});if(!result2.ok)return console.
|
|
32255
|
+
warn(`pairing refused from ${requestSource(req)}: ${result2.error}`),json3(res,result2.status,refusalBody(result2));CLOUD_TEAM&&teamHost.met(result2.session);let environment=environmentDescriptor({environmentId:ENVIRONMENT_ID,...TEAM_LABEL,desktopManaged:DESKTOP_MANAGED,emailSignIn:!CLOUD_HOME&&emailSignIn.enabled(),sharedComputers:lendingEnabled(),cloudHome:!!CLOUD_HOME,cloudTeam:CLOUD_TEAM!==null,ownHome:ownHome.takesMove()});if(wantsCookie){let previous2=browser?sessions.authenticate(parseCookies(
|
|
32256
|
+
req.headers.cookie).get(SESSION_COOKIE)):null;previous2&&previous2.id!==result2.session.id&&sessions.revoke(previous2.id);let secure=requestOrigin(req)?.startsWith("https://")===!0;return res.setHeader("set-cookie",serializeSessionCookie(SESSION_COOKIE,result2.token,{secure,maxAgeSeconds:cookieMaxAgeSeconds(result2.session)})),json3(res,200,{session:result2.session,environment})}return json3(res,200,{token:result2.token,session:result2.session,environment})}if(method2==="POST"&&path6==="/api/pai\
|
|
32257
|
+
r"){if(!/^application\/json\b/i.test(String(req.headers["content-type"]??"")))return json3(res,415,{error:"send the pairing credential as JSON (content-type: application/json)"});let body2=await readBody(req),credential=typeof body2?.credential=="string"?body2.credential:typeof body2?.code=="string"?body2.code:"",label4=typeof body2?.deviceName=="string"?body2.deviceName:"",attemptId=typeof body2?.pairRequestId=="string"?body2.pairRequestId:void 0,relayRefusal=phoneRelay?.pairingRefusal(req,credential);
|
|
32258
|
+
if(relayRefusal)return json3(res,400,{error:relayRefusal});let paired=sessions.exchange({code:credential,label:label4,attemptId,source:requestSource(req),fallbackLabel:labelFromUserAgent(req.headers["user-agent"])});return paired.ok?json3(res,200,{token:paired.token,device:{id:paired.session.id,name:paired.session.label,createdAt:paired.session.createdAt,lastSeenAt:paired.session.lastSeenAt},serverName:cfg.computerName||environmentDescriptor({environmentId:ENVIRONMENT_ID,...TEAM_LABEL,desktopManaged:DESKTOP_MANAGED}).
|
|
32259
|
+
label,...phoneRelay?.pairedOver(req)}):(console.warn(`pairing refused from ${requestSource(req)}: ${paired.error}`),json3(res,paired.status,refusalBody(paired)))}let gate=resolveRequestAuth(req,{sessions,cookieName:SESSION_COOKIE,streamPath:"/api/events",url:url2,loopbackMutationToken:desktopMutationToken,companionMutationToken,features:{sharedComputers:lendingEnabled()},loopbackTrust:LOOPBACK10.trust,cliOwnerToken,trustLocalBrowser:LOOPBACK10.localBrowsers,...CLOUD_TEAM?{restricted:moveInRefusal}:
|
|
32260
|
+
{},scopeRefusal:(m4,p3)=>liveScopeRefusal(cfg,m4,p3)});if(gate.auth?.kind==="session"&&gate.auth.via==="cookie"){let presented=parseCookies(req.headers.cookie).get(SESSION_COOKIE);if(presented){let secure=HOSTED_WORKSPACE||requestOrigin(req)?.startsWith("https://")===!0;res.setHeader("set-cookie",serializeSessionCookie(SESSION_COOKIE,presented,{secure,maxAgeSeconds:cookieMaxAgeSeconds(gate.auth.session)}))}}if(method2==="GET"&&path6==="/api/health"&&!gate.auth)return json3(res,200,{app:"openmaus\
|
|
32261
|
+
bot"});if(method2==="GET"&&path6==="/api/brand"&&!gate.auth)return json3(res,200,loadBrand());if(!gate.auth)return json3(res,gate.status,{error:gate.error});cloudPower&&gate.auth.kind==="session"&&cloudPower.request(path6,req.headers,res);let auth=gate.auth;if(HOSTED_WORKSPACE&&auth.kind==="session"){let failure11=workspaceAccess?await workspaceAccess.authorize(req,auth):{status:503,error:"Workspace sign-in is unavailable."};if(failure11)return json3(res,failure11.status,{error:failure11.error})}
|
|
32262
|
+
let viewer=viewerFor(auth),visible=visibleTo(viewer),subject=visible.everything?null:pathSubject(path6),hidden=subject&&!subjectVisible(subject,visible)?notFoundFor(subject):hiddenThreadRefusal(req,path6,url2.searchParams,visible,botId=>store4.bot(botId)?.threadId);if(hidden)return json3(res,404,{error:hidden});let refused2=botAccess.accessRefusal(req,auth,method2,path6,visible);if(refused2)return json3(res,403,refused2);if((viewer.kind==="member"||visible.filtersThreads)&&onJsonBody(res,body2=>memberBody(
|
|
32263
|
+
body2,visibleTo(viewer))),beginAdminAudit(req,res,method2,path6,auth),method2==="POST"&&path6==="/api/workspace-backup/restore"&&teamComputers.list().some(computer=>computer.section!==null))return json3(res,409,{error:"Unassign team computers before restoring a workspace; restored team names must not gain access to existing desktops"});if(await workspaceBackupRoutes(req,res,path6,auth)||cloudMoveRoutes(res,path6)||(path6.startsWith("/api/")&&path6!=="/api/events"&&path6!=="/api/health"&&path6!==
|
|
32264
|
+
"/api/sync/changes"&&!isLongPollPath(path6)&&!isWorkspaceBackupSessionControl(method2,path6)&&(releaseWorkspaceRequest=workspaceMaintenance.request()),await dispatchRoutes(ROUTES2,{req,res,url:url2,path:path6,method:method2,auth,json:json3,readBody})))return;if(method2==="GET"&&path6==="/api/auth/session")return json3(res,200,auth.kind==="loopback"?{kind:"loopback",scopes:auth.scopes,environmentId:ENVIRONMENT_ID,...auth.trust?{trust:auth.trust}:{}}:{kind:"session",id:auth.session.id,label:auth.session.
|
|
32265
|
+
label,scopes:auth.scopes,expiresAt:auth.session.expiresAt,via:auth.via,environmentId:ENVIRONMENT_ID,...auth.session.email?{email:auth.session.email}:{},...auth.session.owner?{owner:auth.session.owner}:{},...HOSTED_WORKSPACE?{hosted:!0}:{},...CLOUD_HOME?{cloudHome:!0}:{},...teamSignInFor(CLOUD_HOME,auth.session),...ownHome.owner(auth)?{own:!0,...ownerLends()?{lending:OWNER_LENDING}:{}}:{},...teamHost.sessionInfo(auth.session)?{team:teamHost.sessionInfo(auth.session),openedThreads:threadStarters.threadsOf(
|
|
32266
|
+
actorKey(auth),2e3)}:{},...CLOUD_PERSONAL&&!cloudOwnerSession(auth)?{cloudGuest:!0,openedThreads:threadStarters.threadsOf(actorKey(auth),2e3)}:{},...reactorFor(auth).by!=="user"?{reactor:reactorFor(auth).by}:{}});if(method2==="POST"&&path6==="/api/auth/stream-ticket")return auth.kind==="loopback"?json3(res,200,{ticket:null,reason:"loopback needs no ticket"}):json3(res,200,sessions.issueStreamTicket(auth.session.id));if(method2==="POST"&&path6==="/api/auth/logout")return auth.kind==="session"&&sessions.
|
|
32267
|
+
revoke(auth.session.id),res.setHeader("set-cookie",clearSessionCookie(SESSION_COOKIE)),json3(res,200,{ok:!0});if(method2==="POST"&&path6==="/api/auth/pairing"){let body2=await readBody(req);if(auth.kind==="session"&&!sessions.isLive(auth.session.id))return json3(res,401,{error:"Your session ended. Sign in again before creating a pairing code."});let requested=pairingRequest(body2);if("error"in requested)return json3(res,400,requested);let opened;try{opened=sessions.openPairing(requested)}catch(error66){
|
|
32268
|
+
if(error66.code==="cloud_personal")return json3(res,403,{error:error66.message,code:"cloud_personal",...userErrorFields(error66)});throw error66}let base2=pairingLinkBase(publicUrl(),auth.kind==="session"?requestOrigin(req):null),code=formatPairingCode(opened.code),serverName=cfg.computerName||environmentDescriptor({environmentId:ENVIRONMENT_ID,...TEAM_LABEL,desktopManaged:DESKTOP_MANAGED}).label,invite=phoneRelay?.invite(opened.credential,serverName,base2)??(base2?phonePairingLink({address:base2,
|
|
32269
|
+
token:opened.credential,name:serverName}):null);return json3(res,200,{id:opened.id,code,credential:opened.credential,expiresAt:opened.expiresAt,url:base2?`${base2}/pair#code=${code}`:null,inviteUrl:invite,serverName,...phoneRelay?{relay:phoneRelay.status()}:{},hint:base2?null:"this server has no public address to put in a link: set OMB_PUBLIC_URL, or open /pair on the address you use and type the code"})}if(method2==="GET"&&path6==="/api/auth/pairing")return json3(res,200,{pairings:sessions.openPairings(),
|
|
32270
|
+
publicUrl:publicUrl(),...phoneRelay?{relay:phoneRelay.status()}:{}});if(path6==="/api/settings/custom-domain"){if(res.setHeader("cache-control","no-store"),method2==="GET")return json3(res,200,customDomainStatus());if(method2==="POST"||method2==="DELETE"){if(DESKTOP_MANAGED)return json3(res,409,{error:"Custom domains are configured on a self-hosted Limix Bot server, not the desktop companion."});if(!/^application\/json\b/i.test(String(req.headers["content-type"]??"")))return json3(res,415,{error:"\
|
|
32271
|
+
content-type must be application/json"});if(method2==="DELETE")return saveConfig({customDomain:""}),cfg.customDomain="",customDomainRevision++,json3(res,200,customDomainStatus());let body2=await readBody(req,4096);if(typeof body2?.domain!="string")return json3(res,400,{error:"Enter your domain name."});let revision=customDomainRevision,verified=await customDomainVerifier.verify(body2.domain);return auth.kind==="session"&&!sessions.isLive(auth.session.id)?json3(res,401,{error:"Your session ended.\
|
|
32272
|
+
Sign in again before connecting a domain."}):revision!==customDomainRevision?json3(res,409,{error:"Domain settings changed during verification. Try again."}):(saveConfig({customDomain:verified.origin}),cfg.customDomain=verified.origin,customDomainRevision++,json3(res,200,customDomainStatus()))}}if(m3=path6.match(/^\/api\/auth\/pairing\/([\w-]+)$/),m3&&method2==="DELETE"){let cancelled=sessions.cancelPairing(m3[1]);return json3(res,cancelled?200:404,cancelled?{ok:!0}:{error:"no such pairing code"})}
|
|
32273
|
+
if(method2==="POST"&&path6==="/api/desktop/shared-computer-control"&&(sharedComputersEnabled(cfg)||DESKTOP_MANAGED)){if(auth.kind!=="loopback")return json3(res,403,{error:"Local desktop only"});let body2=await readBody(req,1024);if(!sharedComputersEnabled(cfg)&&!DESKTOP_MANAGED)return json3(res,404,{error:`no route: ${method2} ${path6}`});if(!external_exports.string().uuid().safeParse(body2?.id).success||!["acquire","release","renew"].includes(body2?.action))return json3(res,400,{error:"Invalid \
|
|
32274
|
+
computer lease"});if(body2.action==="release")sharedComputerControl.release(body2.id);else if(body2.action==="renew")sharedComputerControl.renew(body2.id);else{let refusal7=managedPolicy.computerRefusal("thisComputer");if(refusal7)return json3(res,403,{error:refusal7,code:"managed_policy"});let busy=sharedComputerControl.acquire(body2.id);if(busy)return json3(res,409,{error:busy,code:"bot"})}return json3(res,200,{ok:!0})}if(method2==="GET"&&path6==="/api/auth/sessions")return json3(res,200,{sessions:sessions.
|
|
32275
|
+
list(),current:auth.kind==="session"?auth.session.id:null});if(m3=path6.match(/^\/api\/auth\/sessions\/([\w-]+)$/),m3&&method2==="DELETE"){let revoked=sessions.revoke(m3[1]);return auth.kind==="session"&&auth.session.id===m3[1]&&res.setHeader("set-cookie",clearSessionCookie(SESSION_COOKIE)),json3(res,revoked?200:404,revoked?{ok:!0}:{error:"no such session"})}if(method2==="POST"&&path6==="/api/testing/org-library"){let expected=Buffer.from(process.env.OMB_TEST_ORG_LIBRARY_KEY??""),header3=req.headers["\
|
|
32276
|
+
x-openmausbot-test-org-library"],actual=Buffer.from(Array.isArray(header3)?"":String(header3??""));if(expected.length<32||actual.length!==expected.length||!timingSafeEqual16(actual,expected)||!orgLibrary)return json3(res,404,{error:"not found"});let body2=await readBody(req),applied=orgLibrary.applyRelay(body2?.library??null);return await orgLibrary.settled(),json3(res,applied.ok?200:400,{...applied,report:orgLibrary.lastReport()})}if(method2==="POST"&&path6==="/api/testing/internal-capability"){
|
|
32277
|
+
let expected=process.env.OMB_TEST_INTERNAL_CAPABILITY_KEY??"",actual=Array.isArray(req.headers["x-openmausbot-test-capability"])?"":String(req.headers["x-openmausbot-test-capability"]??""),expectedBytes=Buffer.from(expected),actualBytes=Buffer.from(actual);if(!expected||actualBytes.length!==expectedBytes.length||!timingSafeEqual16(actualBytes,expectedBytes))return json3(res,404,{error:"not found"});let parsed2=external_exports.object({botId:external_exports.string().regex(/^[\w-]{1,128}$/),threadId:external_exports.
|
|
32278
|
+
string().regex(/^[\w-]{1,128}$/),kind:external_exports.enum(["agents","connectors","computer","data","email","device"]).default("agents"),depth:external_exports.number().int().min(0).max(MAX_COMMS_DEPTH).default(0),skillAuthoring:external_exports.boolean().default(!1),deliversSavedFiles:external_exports.boolean().default(!1)}).strict().safeParse(await readBody(req));if(!parsed2.success||!store4.bot(parsed2.data.botId))return json3(res,400,{error:"invalid test capability"});let live2=activeInternalGenerationByThread.
|
|
32279
|
+
get(parsed2.data.threadId),liveRoot=live2?coordinator.node(live2):void 0,generation=liveRoot&&!ENDED4.has(liveRoot.status)&&!standInRoots.has(live2)?live2:beginInternalCapabilityGeneration(parsed2.data.threadId);if(generation!==live2){standInRoots.add(generation);let minted=store4.bot(parsed2.data.botId),threadId=parsed2.data.threadId,owner2=connectorThread(minted.id,threadId),latestUser=[...store4.activePath(threadId)].reverse().find(message8=>message8.role==="user"&&message8.kind==="text"&&message8.
|
|
32280
|
+
text),opener=handoffOpener({botId:minted.id,threadId},threadId);coordinator.beginTurn({id:generation,address:{botId:minted.id,threadId,...owner2?.group?{groupId:owner2.group.id}:{}},brief:latestUser?.text??"",level:owner2?.group?delegatedLevel.roomTurn(minted,threadId,void 0):approvalModeForTurn(store4.projectBotForTask(minted.id,threadId)??minted,!1,threadId),...opener?{opener}:{},origin:requestWorkOrigin({line:latestUser})})}let{deliversSavedFiles,...grants}=parsed2.data,token3=mintInternalCapability(
|
|
32281
|
+
{...grants,...deliversSavedFiles?{deliversSavedFiles}:{},generation,createdBots:0,openedThreads:0});return json3(res,201,{token:token3})}if(path6.startsWith("/api/internal/")){let internalCapability=authorizedInternalCapability(req.headers.authorization);if(!internalCapability)return json3(res,401,{error:"unauthorized"});let internalSender=store4.bot(internalCapability.botId);if(!internalSender)return json3(res,401,{error:"unauthorized"});if(internalCapability.generation===EXTERNAL_RUNTIME_GENERATION&&
|
|
32282
|
+
!externalRuntimeMayCall(method2,path6))return json3(res,403,{error:"an external runtime can only list its peers, hand them work with coordinate_bots and read assignment_status"});if(proactive.fence.refusesRoute(internalSender,internalCapability.threadId,method2,path6))return json3(res,403,{error:READ_AND_DRAFT_REFUSAL});if(botApiThread(internalCapability.threadId)&&botApiRouteRefused(method2,path6))return json3(res,403,{error:BOT_API_REFUSAL});if(cloudGuestDriven(internalCapability.threadId)&&outsideRouteRefused(
|
|
32283
|
+
method2,path6))return json3(res,403,{error:OUTSIDE_REFUSAL});let requiredCapabilityKind=path6==="/api/internal/hook"?"hooks":path6==="/api/internal/browser/mcp"?"browser":path6===DATA_INTERNAL_MCP_PATH?"data":path6===EMAIL_INTERNAL_MCP_PATH?"email":path6===PHONE_INTERNAL_MCP_PATH?"device":isLentMcpPath(path6)?"lent":path6==="/api/internal/phone/claim"?"phone":path6.startsWith("/api/internal/connectors/")?"connectors":path6==="/api/internal/computer-control"||path6==="/api/internal/computer/mcp"||
|
|
32284
|
+
path6===COMPUTER_JOURNAL_PATH?"computer":"agents";if(internalCapability.kind!==requiredCapabilityKind)return json3(res,403,{error:"this internal capability cannot access that service"});requiredCapabilityKind!=="agents"&&requiredCapabilityKind!=="hooks"&&usageTrace.timeServed(req,res,internalCapability.threadId);for(let key7 of["self","fromBotId","botId"]){let claimed=url2.searchParams.get(key7);if(claimed!==null&&claimed!==internalSender.id)return json3(res,403,{error:"the internal capability b\
|
|
32285
|
+
elongs to a different bot"})}let claimedThread=url2.searchParams.get("fromThreadId");if(claimedThread!==null&&claimedThread!==internalCapability.threadId)return json3(res,403,{error:"the internal capability belongs to a different conversation"});let readInternalBody=async()=>{let body2=await readBody(req);if(!internalCapabilityIsActive(internalCapability))throw Object.assign(new Error(TURN_ENDED_REFUSAL),{status:401});if(body2&&typeof body2=="object"&&!Array.isArray(body2)){for(let key7 of["from\
|
|
32286
|
+
BotId","botId"])if(body2[key7]!==void 0&&String(body2[key7])!==internalSender.id)throw Object.assign(new Error("the internal capability belongs to a different bot"),{status:403});for(let key7 of["fromThreadId","threadId"])if(body2[key7]!==void 0&&String(body2[key7])!==internalCapability.threadId)throw Object.assign(new Error("the internal capability belongs to a different conversation"),{status:403})}return body2},requireActiveInternalCapability=()=>{if(!internalCapabilityIsActive(internalCapability))
|
|
32287
|
+
throw Object.assign(new Error(TURN_ENDED_REFUSAL),{status:401})},botFolders=async()=>({roots:messageFileRootsForThread(internalSender.id,internalCapability.threadId).filter(root3=>root3!==ATTACHMENTS_DIR),vmWorkspace:(await attachmentVmForTurn(internalCapability))?.workspaceDir??null});if(await lentMcp.route({method:method2,path:path6,req,res,json:json3,turn:internalCapability,readBody:readInternalBody})!==PASS||await internalToolRoutes({method:method2,path:path6,res,json:json3,botId:internalSender.
|
|
32288
|
+
id,threadId:internalCapability.threadId,readBody:readInternalBody,folders:botFolders})!==PASS||await waitRoutes({method:method2,path:path6,res,json:json3,botId:internalSender.id,threadId:internalCapability.threadId,readBody:readInternalBody,...waitTurnChecks(internalCapability,internalSender)})!==PASS||await teamMessages.internal({method:method2,path:path6,res,json:json3,botId:internalSender.id,threadId:internalCapability.threadId,readBody:readInternalBody})!==PASS||await devsReports.internal({method:method2,
|
|
32289
|
+
path:path6,res,json:json3,botId:internalSender.id,threadId:internalCapability.threadId,readBody:readInternalBody})!==PASS||computerAsks&&await computerAsks.internal({method:method2,path:path6,res,json:json3,turn:internalCapability,readBody:readInternalBody})!==PASS||await meetingsHost.internal({method:method2,path:path6,res,json:json3,readBody:readInternalBody,bot:internalSender,threadId:internalCapability.threadId,active:()=>internalCapabilityIsActive(internalCapability)})!==PASS||await imageTools.
|
|
32290
|
+
internal({method:method2,path:path6,res,json:json3,readBody:readInternalBody,threadId:internalCapability.threadId,requireActive:requireActiveInternalCapability,personTurn:turnOrigin(internalCapability).kind==="user"||!!roomRun(internalCapability.generation)?.requestMessageId&&guestDrivenTurns.get(internalCapability.threadId)!==internalCapability.generation})!==PASS)return;let callSignal2=turnCallSignals.signal(internalCapability,res);if(await publishedPages.internal({method:method2,path:path6,res,
|
|
32291
|
+
json:json3,botId:internalSender.id,threadId:internalCapability.threadId,readBody:readInternalBody,requireActive:requireActiveInternalCapability,signal:callSignal2,folders:botFolders,post:(text30,publishedPage,bundle2)=>{let source4=connectorThread(internalSender.id,internalCapability.threadId);return source4?bundle2&&publishedPages.show({threadId:internalCapability.threadId,card:publishedPage,bundle:bundle2,bot:internalSender})||store4.appendMessage(internalCapability.threadId,{role:"bot",kind:"\
|
|
32292
|
+
text",text:text30,publishedPage,...source4.group?{from:{botId:internalSender.id,name:internalSender.name,color:internalSender.color}}:{}}).id:null}})!==PASS)return;let delegatedThisTurn=taskId=>{(internalCapability.delegatedThisTurn??=new Set).add(taskId)},memorySource=()=>memorySourceLabel({room:store4.groupByThread(internalCapability.threadId),task:store4.taskByThread(internalSender.id,internalCapability.threadId),threadId:internalCapability.threadId});if(path6==="/api/internal/computer/select"&&
|
|
32293
|
+
(method2==="GET"||method2==="POST")){let source4=computerSelectionTurns.get(internalCapability.threadId),bot=store4.projectBotForTask(internalSender.id,internalCapability.threadId),canSelect=!!(source4&&source4.generation===internalCapability.generation&&bot&&bot.computer!=="off");if(!bot)return json3(res,403,{error:"Computer selection belongs to a direct bot conversation."});let asked=method2==="POST"?(await readInternalBody()).surface:void 0,browserOnly=canSelect&&!!source4?.handoff;if(browserOnly&&
|
|
32294
|
+
method2==="POST"&&!handoffSurface(asked))return json3(res,403,{error:HANDOFF_BROWSER_ONLY});let requested=browserOnly&&method2==="POST"?handoffSurface(asked):asked,request9=directRequestOwners.get(internalCapability.threadId),refusal7=canSelect?void 0:bot.computer==="off"?COMPUTER_OFF_REFUSAL:computerPickRefusal(request9?.generation===internalCapability.generation?request9.kind:void 0);if(method2==="POST"&&refusal7)return json3(res,403,{error:refusal7});if(method2==="POST"&&requested!=="auto"&&!parseSurface(
|
|
32295
|
+
requested))return json3(res,400,{error:"surface must be auto, cloud, vm, local, or browser"});let unoffered=CLOUD_HOME&&method2==="POST"&&requested!=="auto"?cloudHomePlaceRefusal(parseSurface(requested)):void 0,options2=(await selectableComputers(bot)).filter(option3=>!browserOnly||option3.surface==="browser"),chosen=browserOnly?void 0:chosenPlace(store4.taskByThread(bot.id,internalCapability.threadId),bot.computer),current3=source4?source4.mounted??"off":await computerPreviewSurface(bot,bot.threadId);
|
|
32296
|
+
if(requireActiveInternalCapability(),method2==="GET")return json3(res,200,{current:current3,canSelect,...refusal7?{why:refusal7}:browserOnly?{why:HANDOFF_BROWSER_ONLY}:{},...chosen?{chosen,chosenNote:`The person chose ${surfaceLabel(chosen)} for this conversation, and auto keeps it while it is available. Select another place only when they ask for one or it is unavailable.`}:{},options:options2});if(computerSelectionTurns.get(internalCapability.threadId)!==source4)return json3(res,409,{error:"Th\
|
|
32297
|
+
e user request ended before its computer was selected."});if(unoffered)return json3(res,409,{error:unoffered,options:options2});let claim2=autoVmClaims.get(internalCapability.threadId),startsOnFirstCall=claim2?.owner.generation===internalCapability.generation&&claim2.startsComputer===!0&&!claim2.failed,picked=pickComputer(options2,requested,current3,startsOnFirstCall,chosen),option2=picked.option;return option2?.available?!source4.selected&&picked.current?json3(res,200,{status:"ready",surface:current3,
|
|
32298
|
+
message:option2.ready?"This computer is already selected. Use its mounted tools.":"This computer is already selected. It starts on its first call; use its mounted tools."}):selectTurnPlace(internalCapability,option2.surface)?json3(res,200,{status:"pending",surface:option2.surface,message:`End this turn now without using the previous computer tools. Limix Bot will continue the original request on ${option2.label} with a fresh tool connection.`}):json3(res,409,{error:"A computer switch is already \
|
|
32299
|
+
pending. End this turn to continue there."}):json3(res,409,{error:option2?.reason??"No configured computer or browser is available. Open the Screen panel to set one up.",options:options2})}if(method2==="POST"&&path6==="/api/internal/hook"){let body2=await readInternalBody();return json3(res,200,ingestEngineHook(internalCapability,body2))}if(method2==="POST"&&path6==="/api/internal/tool-result"){let body2=await readInternalBody();return!body2||typeof body2.text!="string"||!body2.text||body2.text.
|
|
32300
|
+
length>TOOL_RESULT_MAX_CHARS||body2.truncated!==void 0&&typeof body2.truncated!="boolean"?json3(res,400,{error:"Expected bounded text and an optional truncated boolean."}):json3(res,201,toolResults.save(internalCapability,body2.text,body2.truncated))}if(method2==="GET"&&path6==="/api/internal/tool-result"){let id12=url2.searchParams.get("id")??"",offset4=Number(url2.searchParams.get("offset")??"0");if(!/^r-[0-9a-f-]{36}$/.test(id12)||!Number.isSafeInteger(offset4)||offset4<0)return json3(res,400,
|
|
32301
|
+
{error:"Expected a saved result id and a non-negative integer offset."});let result2=toolResults.read(internalCapability,id12,offset4);return result2?json3(res,200,result2):json3(res,404,{error:"Saved result unavailable in this bot's conversation, expired, or offset out of range. Do not repeat an action to retrieve its output."})}if(method2==="POST"&&path6==="/api/internal/options-card"){if(!connectorThread(internalSender.id,internalCapability.threadId))return json3(res,403,{error:"source conver\
|
|
32302
|
+
sation does not belong to sender"});let body2=await readInternalBody();requireActiveInternalCapability();let result2=await createAgentCard({store:store4,bot:internalSender,apps:chatApps,folders:async()=>({roots:messageFileRootsForThread(internalSender.id,internalCapability.threadId).filter(root3=>root3!==ATTACHMENTS_DIR),vmWorkspace:(await attachmentVmForTurn(internalCapability))?.workspaceDir??null}),threadId:internalCapability.threadId,input:(body2?.tool==="show_html"||body2?.tool==="update_ht\
|
|
32303
|
+
ml")&&cloudGuestDriven(internalCapability.threadId)?{...body2,frameless:!1}:body2,authored:id12=>handoffs.authored(internalCapability.threadId,internalCapability.generation,id12)});return result2.ok?json3(res,201,{messageId:result2.messageId,..."masked"in result2&&result2.masked?{masked:!0}:{},..."leftOut"in result2&&result2.leftOut?{leftOut:result2.leftOut}:{}}):json3(res,result2.status,{error:result2.error})}if((path6==="/api/internal/memory"||path6==="/api/internal/memory/log")&&method2==="PO\
|
|
32304
|
+
ST"){if(CLOUD_PERSONAL&&cloudHomeOwnTurnRefusal(cloudLendingTurn(internalCapability))!==null)return json3(res,403,{error:"Notes can only be saved from a conversation that only the owner of this Cloud has written in."});if(internalSender.memoryEnabled===!1)return json3(res,403,{error:"Memory is disabled for this bot."});if(cloudGuestDriven(internalCapability.threadId)){let proposed=path6.endsWith("/log")?{status:403,body:{error:OUTSIDE_STAYS_HERE}}:outsideWrites.submitMemory(internalSender,internalCapability.
|
|
32305
|
+
threadId,await readInternalBody());return json3(res,proposed.status,proposed.body)}let room=store4.groupByThread(internalCapability.threadId);if(room&&!roomFeedsBot(room,internalSender))return json3(res,403,{error:"This room is visible to fewer people than you are, so notes from it can't go into your memory. Keep them in the room."})}let ownersWrite=write4=>lendingMemory?lendingMemory.trustedWrite(internalSender.id,write4):write4();if(method2==="POST"&&path6==="/api/internal/memory"){let body2=await readInternalBody(),
|
|
32306
|
+
ownersAsk=CLOUD_TEAM||!store4.groupByThread(internalCapability.threadId)&&ownersOwnAsk(store4.activePath(internalCapability.threadId)),result2=ownersWrite(()=>botMemoryUpdate(teamHost.layer(internalSender.id,internalCapability.threadId),body2,{source:memorySource(),aboutMe:ownersAsk?aboutMeFacts:null,prefer:body2?.action==="prefer"?personPreference.target(internalCapability,internalSender):null}));return json3(res,result2.ok?200:result2.code==="conflict"?409:400,result2)}if(method2==="POST"&&path6===
|
|
32307
|
+
"/api/internal/memory/log"){let body2=await readInternalBody(),result2=ownersWrite(()=>appendMemoryLog(teamHost.layer(internalSender.id,internalCapability.threadId),body2.text,{source:memorySource()}));return json3(res,result2.ok?200:400,result2)}if(method2==="POST"&&path6==="/api/internal/browser/mcp"){let body2=await readInternalBody(),bot=store4.bot(internalCapability.botId);if(!bot||bot.browser===!1||bot.computer==="off"||!builtInBrowserEnabled(cfg))return json3(res,403,{error:"browser tools\
|
|
32308
|
+
are not enabled for this bot"});let browser=await browserIntegration(bot.id,bot.browserProfile,void 0,teamHost.browserAudience(internalCapability.threadId));if(!browser||browser.session!==internalCapability.browserSession)return json3(res,409,{error:"this browser profile changed; start a new turn"});if(body2?.method!=="tools/list"&&body2?.method!=="tools/call")return json3(res,400,{error:"unsupported browser method"});if(body2.method==="tools/call"){let abort=new AbortController;res.once("close",
|
|
32309
|
+
()=>{res.writableEnded||abort.abort()});let refused3=await browserSeats.take(internalCapability,browser.session,abort.signal);if(requireActiveInternalCapability(),refused3)return json3(res,200,{result:{isError:!0,content:[{type:"text",text:refused3}]}})}let params2=body2.params;if(body2.method==="tools/call"&¶ms2?.name===BROWSER_UPLOAD_TOOL){let upload=uploadableFiles(params2.arguments?.files,messageFileRootsForThread(bot.id,internalCapability.threadId));if("error"in upload)return json3(res,
|
|
32310
|
+
200,{result:{isError:!0,content:[{type:"text",text:upload.error}]}});try{params2={...params2,arguments:{...params2.arguments,files:await uploadPaths(upload.files.map((file2,i)=>({file:file2,name:attachmentNameInThread(internalCapability.threadId,params2.arguments.files[i])})),browser.session,browser.spec)}}}catch(error66){if(requireActiveInternalCapability(),!(error66 instanceof BrowserUploadRefusal))throw error66;return json3(res,200,{result:{isError:!0,content:[{type:"text",text:error66.message}]}})}}
|
|
32311
|
+
let result2=await browserRuntime.agentRpc(browser.session,browser.spec,body2.method,params2,()=>{requireActiveInternalCapability();let current3=store4.bot(bot.id);if(!current3||current3.browser===!1||current3.computer==="off"||!builtInBrowserEnabled(cfg)||currentBrowserSession(current3.id,current3.browserProfile,teamHost.browserAudience(internalCapability.threadId))!==browser.session)throw Object.assign(new Error("Browser access changed while connecting."),{status:409});if(body2.method==="tools/\
|
|
32312
|
+
call"&&!claimTurnResource(internalCapability,`browser:${browser.session}`))throw Object.assign(new Error("another thread is using this browser \u2014 pause browser work until that thread finishes"),{status:409})},stepContext(bot,internalCapability,()=>liveTurnByThread.get(internalCapability.threadId)??null));return requireActiveInternalCapability(),body2.method==="tools/call"&&browserSeats.used(internalCapability,browser.session),json3(res,200,{result:result2})}if(await dispatchRoutes([savedSteps.
|
|
32313
|
+
journalRoutes({capability:internalCapability,readBody:readInternalBody}),createAppFindRoute({host:appSuggestions,botId:internalSender.id,readBody:readInternalBody,bot:botId=>{let bot=connectorThread(botId,internalCapability.threadId)?.bot;return bot&&bot.composio!==!1&&configured(cfg)?bot:null},refusal:slug3=>managedConnectorUnavailableReason(connectionMode(cfg),slug3)??managedPolicy.appRefusal(slug3)??teamConnections.connectRefusal(internalCapability,[slug3])})],{req,res,url:url2,path:path6,method:method2,
|
|
32314
|
+
auth,json:json3,readBody}))return;if(method2==="POST"&&path6==="/api/internal/computer/mcp"){let body2=await readInternalBody();if(internalCapability.boxId===void 0)return json3(res,403,{error:"this turn has no cloud computer"});let abort=new AbortController;return res.once("close",()=>{res.writableEnded||abort.abort()}),json3(res,200,{result:await cloudComputerRpc(body2,{cfg,signal:abort.signal,folder:()=>messageFileRootsForThread(internalCapability.botId,internalCapability.threadId)[0],boxId:()=>internalCapability.
|
|
32315
|
+
boxId??claimedBoatId(internalCapability),gate:()=>computerCallGate(internalCapability,abort.signal),assertActive:requireActiveInternalCapability})})}if(method2==="POST"&&path6===DATA_INTERNAL_MCP_PATH){let body2=await readInternalBody(),unavailable3=dataEngine2.unavailable();if(unavailable3!==null)return json3(res,503,{error:`Data tools are unavailable: ${unavailable3}`});let abort=new AbortController;res.once("close",()=>{res.writableEnded||abort.abort()});let database;try{database=await dataEngine2.
|
|
32316
|
+
forBot(internalSender.id)}catch(error66){if(error66 instanceof DataFailure)return json3(res,503,{error:error66.message});throw error66}return requireActiveInternalCapability(),json3(res,200,{result:await dataRpc(body2,{database,sheet:dataSheets.for(internalSender.id),compileChart:compileChart2,validateVegaLite:validateVegaLite2,renderer:chartRenderer2,exportRoots:()=>dataExportRoots(internalSender),signal:abort.signal,assertActive:requireActiveInternalCapability,onShow:card=>{store4.appendMessage(
|
|
32317
|
+
internalCapability.threadId,{role:"bot",kind:"activity",tool:{name:"data_show",ok:!0},dataResult:{botId:internalSender.id,cardId:card.id,title:card.title,kind:card.kind,sql:card.sql},...store4.groupByThread(internalCapability.threadId)?{from:{botId:internalSender.id,name:internalSender.name,color:internalSender.color}}:{}})}})})}if(method2==="POST"&&path6===EMAIL_INTERNAL_MCP_PATH)return json3(res,200,{result:await emailHost.handle(await readInternalBody(),internalCapability,requireActiveInternalCapability)});
|
|
32318
|
+
if(method2==="POST"&&path6===PHONE_INTERNAL_MCP_PATH)return json3(res,200,{result:await phones2.handle(await readInternalBody(),internalCapability,requireActiveInternalCapability)});if(method2==="POST"&&path6==="/api/internal/phone/claim")return requireActiveInternalCapability(),claimTurnResource(internalCapability,"computer:phone")?json3(res,200,{claimed:!0}):json3(res,409,{error:"another thread is using the phone"});if(method2==="GET"&&path6==="/api/internal/shared-computers"&&botLending()){let principal=sharedComputerPrincipal(
|
|
32319
|
+
internalCapability);await sharedComputers.settledAfterWake(principal,()=>internalCapabilityIsActive(internalCapability));let why=CLOUD_HOME&&!principal&&(CLOUD_TEAM||sharedComputers.status(CLOUD_HOME_LENDER).length>0)?cloudLendingRefusalNotice(internalCapability):null;return json3(res,200,{computers:sharedComputers.list(principal),...sharedComputers.away(principal),...sharedComputers.screenNotLent(principal),...why?{unavailable:cloudLendingRefusalForBot(internalCapability),say:why}:{}})}if(method2===
|
|
32320
|
+
"POST"&&path6==="/api/internal/shared-computers"&&botLending()){let parsed2=sharedComputerOperation.safeParse(await readInternalBody());if(!botLending())return json3(res,404,{error:"unknown internal endpoint"});if(!parsed2.success)return json3(res,400,{error:"Invalid shared computer operation"});if(["computer_tools","computer_call"].includes(parsed2.data.action)&&store4.bot(internalCapability.botId)?.computer==="off")return json3(res,403,{error:"This bot has no computer. Change its Computer sett\
|
|
32321
|
+
ing to use a shared computer's apps and screen."});let principal=sharedComputerPrincipal(internalCapability),why=(CLOUD_TEAM?managedPolicy.computerRefusal("thisComputer"):null)??(CLOUD_HOME&&!principal?cloudLendingRefusalForBot(internalCapability):null);return why?json3(res,403,{error:why}):json3(res,200,{result:lentScreenResult(parsed2.data,await sharedComputers.request(parsed2.data,principal,()=>botLending()&&internalCapabilityIsActive(internalCapability)))})}if(method2==="GET"&&path6==="/api/\
|
|
32322
|
+
internal/agents"){let sender2=internalSender,bots=personalReach.peers(store4.bots,sender2,internalCapability.threadId).map(b11=>{let status5=peerStatus(b11.activity,b11.busy);return{id:b11.id,name:b11.name,section:b11.section?.trim()||"",model:b11.modelSelection.model,busy:!!b11.busy,status:status5,statusText:peerStatusWords(status5),title:b11.title||void 0,description:b11.description||void 0}});return json3(res,200,{bots})}if(await dispatchRoutes([createInternalThreadRoutes({store:store4,coordinator,
|
|
32323
|
+
from:internalSender,fromThreadId:internalCapability.threadId,ownsThread:(botId,threadId)=>!!connectorThread(botId,threadId),shown:id12=>!proactive.fence.confines(id12)&&!botApiThread(id12)&&(CLOUD_TEAM?teamHost.readableFrom(internalCapability.threadId)(id12):cloudLendingView(internalCapability)?cloudOwnerOnlyThread(id12):!0),threadBusy,queuedThreadPosition,queuedReason:queuedStatus}),createToolTimingRoute(usageTrace,internalCapability.threadId)],{req,res,url:url2,path:path6,method:method2,auth,json:json3,
|
|
32324
|
+
readBody}))return;if(method2==="POST"&&path6==="/api/internal/attach-file"){let from=internalSender,threadId=internalCapability.threadId,source4=connectorThread(from.id,threadId);if(!source4)return json3(res,403,{error:"source conversation does not belong to sender"});let body2=await readInternalBody(),requestedPath=typeof body2.path=="string"?body2.path:"",requestedName=typeof body2.name=="string"?body2.name:void 0;try{let vm=await attachmentVmForTurn(internalCapability),outcome=await attachForTurn(
|
|
32325
|
+
internalCapability,MAX_ATTACHED_FILES_PER_TURN,{save:()=>saveBotAttachment({path:requestedPath,name:requestedName,roots:messageFileRootsForThread(from.id,threadId).filter(root3=>root3!==ATTACHMENTS_DIR),...vm?{guest:{root:VM_WORKSPACE_GUEST,host:vm.workspaceDir}}:{},...internalCapability.deliversSavedFiles&&internalCapability.turnStartedAt!==void 0?{savedThisTurn:{since:internalCapability.turnStartedAt,refuse:[DATA_DIR]}}:{}}),stillLive:()=>internalCapabilityIsActive({...internalCapability,...vm?
|
|
32326
|
+
{localVmTarget:vm}:{}})&&connectorThread(from.id,threadId)!==null,publish:saved2=>{store4.appendMessage(threadId,{role:"bot",kind:"text",text:"",attachments:[saved2.attachment],...source4.group?{from:{botId:from.id,name:from.name,color:from.color}}:{}})},discard:saved2=>deleteAttachment(saved2.attachment.path)});if(outcome.status==="limit")return json3(res,429,{error:`You already attached ${MAX_ATTACHED_FILES_PER_TURN} files this turn. Put the rest in one document or archive summary instead.`});
|
|
32327
|
+
if(outcome.status==="ended")return json3(res,409,{error:"This turn ended before the file could be attached, so nothing was posted."});let{saved}=outcome,label4=saved.attachment.kind==="file"?saved.attachment.name:requestedName?.trim()||requestedPath.split(/[\\/]/).at(-1)||"image";return json3(res,200,{ok:!0,name:label4,bytes:saved.bytes})}catch(error66){let status5=typeof error66.status=="number"?error66.status:500,message8=status5===404?`No file was found at ${requestedPath}. Save it under /hom\
|
|
32328
|
+
e/cua/workspace (or your working folder) and pass its exact path.`:error66 instanceof Error?error66.message:"could not attach that file";return json3(res,status5,{error:message8})}}if(method2==="POST"&&path6==="/api/internal/vm-exec"){let threadId=internalCapability.threadId;if(!connectorThread(internalSender.id,threadId))return json3(res,403,{error:"source conversation does not belong to sender"});let body2=await readInternalBody();try{let vm=await attachmentVmForTurn(internalCapability);if(!vm)
|
|
32329
|
+
return json3(res,409,{error:"You have no Local VM desktop in this turn, so there is nowhere to run a command."});let runtime2=(await containerRuntimeStatus()).runtime;if(requireActiveInternalCapability(),!runtime2||!internalCapabilityIsActive({...internalCapability,localVmTarget:vm})||botComputerControlSnapshot(internalSender.id).held)return json3(res,409,{error:"The Local VM is no longer available to this turn."});let result2=await containerExec(vm,typeof body2.command=="string"?body2.command:"",
|
|
32330
|
+
{runtime:runtime2,timeoutSeconds:typeof body2.timeout_seconds=="number"?body2.timeout_seconds:void 0});return localVmIdleFor(vm).touch(),json3(res,200,result2)}catch(error66){let status5=typeof error66.status=="number"?error66.status:500;return json3(res,status5,{error:error66 instanceof Error?error66.message:"could not run the command"})}}if(method2==="GET"&&path6==="/api/internal/rooms"){let from=internalSender,fromThreadId=internalCapability.threadId;if(!connectorThread(from.id,fromThreadId))
|
|
32331
|
+
return json3(res,403,{error:"source conversation does not belong to sender"});let rooms=[],unpostable=[];for(let group2 of store4.groups){if(group2.dm||!group2.memberIds.includes(from.id))continue;let eligibility=roomPostEligibility(from,group2,fromThreadId);if(!eligibility.ok){unpostable.push({name:group2.name,reason:eligibility.error});continue}rooms.push({id:group2.id,name:group2.name,members:group2.memberIds.map(id12=>store4.bot(id12)).filter(member=>!!member).map(member=>member.name)})}return json3(
|
|
32332
|
+
res,200,{rooms:rooms.slice(0,50),unpostable:unpostable.slice(0,50)})}let triggerContext={from:internalSender,threadId:internalCapability.threadId,ownsThread:(botId,threadId)=>!!connectorThread(botId,threadId),guestDriven:cloudGuestDriven(internalCapability.threadId),outsideDriven:()=>outsideDrivenThread(internalCapability.threadId),canCommit:()=>internalCapabilityIsActive(internalCapability),routineShown:routine=>teamRoutines.inTurn(routine,internalCapability.threadId)};if(await dispatchRoutes([
|
|
32333
|
+
appTriggers.internalRoutes(triggerContext)],{req,res,url:url2,path:path6,method:method2,auth,json:json3,readBody}))return;if(method2==="POST"&&path6==="/api/internal/trigger-requests"){let from=internalSender,fromThreadId=internalCapability.threadId,owner2=connectorThread(from.id,fromThreadId);if(!owner2)return json3(res,403,{error:"source conversation does not belong to sender"});let request9=parseTriggerRequest(await readInternalBody(),id12=>routines.listRoutines().some(routine=>routine.id===id12)?
|
|
32334
|
+
"schedule":appTriggers.isApp(id12)?"app":"webhook");if(!request9.ok)return json3(res,400,{error:request9.error});let hiddenTrigger=teamRoutines.hiddenTrigger(request9,fromThreadId);if(hiddenTrigger)return json3(res,404,{error:hiddenTrigger});let target4=triggerTarget(from,request9.forBotId,id12=>store4.bot(id12));if("error"in target4)return json3(res,target4.status,{error:target4.error});let forBot=target4.forBot,persistence=proposalPersistence(from.id,fromThreadId,!1);if(!persistence.ok)return json3(
|
|
32335
|
+
res,persistence.status,{error:persistence.error});let sender2=owner2.group?{botId:from.id,name:from.name,color:from.color}:void 0;if(request9.kind==="app")return appTriggers.submit(res,json3,{...triggerContext,operation:request9.operation,forBot,sender:sender2});if(request9.kind==="webhook"){if(cloudGuestDriven(fromThreadId))return json3(res,403,{error:"Only the Cloud's owner can set up or change webhook triggers. Tell the person to ask from their own conversation."});let applied2;try{applied2=webhookRequests.
|
|
32336
|
+
submit({botId:from.id,threadId:fromThreadId,operation:{...request9.operation,forBot},from:sender2,canCommit:()=>internalCapabilityIsActive(internalCapability)})}catch(error66){return json3(res,error66 instanceof WebhookRequestError?error66.status:error66.status??400,{error:error66 instanceof Error?error66.message:String(error66)})}appendDecision(DATA_DIR,{threadId:fromThreadId,requestId:applied2.requestId,botId:from.id,botName:from.name,tool:applied2.action==="create"?"create_trigger":"manage_tr\
|
|
32337
|
+
igger",summary:applied2.summary,decision:"auto-approved",source:"routine"});let hookOwner=store4.bot(forBot?.botId??from.id);return json3(res,201,{...applied2,...applied2.action==="create"&&hookOwner?addressFor({from,owner:hookOwner,guestDriven:!1,outsideDriven:outsideDrivenThread(fromThreadId)},webhooks,applied2.resultId,webhookIngressStatus().baseUrl):{}})}let proposedInput={...request9.proposal,forBot};if(proposedInput.action!=="create"&&(proposedInput.action==="update"?outsideWorkStaysHere(fromThreadId):
|
|
32338
|
+
cloudGuestDriven(fromThreadId))&&!outsideLineage.routineRunsConfined(String(proposedInput.routineId)))return json3(res,403,{error:OUTSIDE_STAYS_HERE});let wasOwners=proposedInput.action!=="create"&&typeof proposedInput.routineId=="string"?cloudRoutineIsOwners(proposedInput.routineId):!1,run11=activeRoutineRunForThread(fromThreadId),outside=!!CLOUD_HOME&&(outsideDrivenThread(fromThreadId)||outsideWorkStaysHere(fromThreadId)),ownersTurn=!outside&&(cloudOwnerOnlyThread(fromThreadId)||cloudRoutineRunIsOwners(
|
|
32339
|
+
run11,from.id,fromThreadId)),ownersLevel=!outside&&CLOUD_HOME&&!cloudGuestDriven(fromThreadId)&&(proposedInput.action==="create"||cloudRoutineAuthors?.writer(String(proposedInput.routineId))===CLOUD_OWNER_KEY)&&(run11?.threadId===fromThreadId||ownerSpokeOnly(store4.messagesFor(fromThreadId),cloudThreadStarters(fromThreadId),cloudProvenOwnerPerson,cloudCardAnswerer)),proposed=await routineRequests.submit({botId:from.id,threadId:fromThreadId,proposal:proposedInput,from:sender2,canCommit:()=>internalCapabilityIsActive(
|
|
32340
|
+
internalCapability)}),proposedCard=store4.messagesFor(fromThreadId).find(message8=>message8.id===proposed.messageId)?.card,applied=CLOUD_HOME&&proposed.state==="applied"&&"result"in proposed?proposed.result:void 0;return applied?.resultId&&ownersTurn?cloudOwnerApplied(applied.action,applied.resultId,wasOwners):applied?.resultId&&(applied.action==="create"||applied.action==="update")&&(cloudRoutineAuthors?.forget(applied.resultId),cloudRoutineAuthors?.wrote(applied.resultId,outside?CLOUD_OUTSIDE_KEY:
|
|
32341
|
+
ownersLevel?CLOUD_OWNER_KEY:CLOUD_NOBODY_KEY)),applied&&wasOwners&&proposedCard?.autoApplied&&proposedCard.routineRequest?.undo&&store4.patchMessage(fromThreadId,proposed.messageId,{card:{...proposedCard,routineRequest:{...proposedCard.routineRequest,undo:{...proposedCard.routineRequest.undo,ownersBefore:!0}}}}),appendDecision(DATA_DIR,{threadId:fromThreadId,requestId:proposed.requestId,botId:from.id,botName:from.name,tool:proposedCard?.tool,summary:proposedCard?.subtitle??proposed.summary,decision:"\
|
|
32342
|
+
auto-approved",source:proposed.appliedBy??"routine"}),json3(res,201,proposed)}if(method2==="POST"&&path6==="/api/internal/team-memory"){let parsed2=external_exports.object({fromBotId:external_exports.string().min(1).max(128),fromThreadId:external_exports.string().min(1).max(128),kind:external_exports.string(),key:external_exports.string().max(240).optional(),name:external_exports.string(),detail:external_exports.string(),aliases:external_exports.array(external_exports.string()).optional()}).strict().
|
|
32343
|
+
safeParse(await readInternalBody());if(!parsed2.success)return json3(res,400,{error:"invalid team memory proposal"});let body2=parsed2.data,from=store4.bot(body2.fromBotId);if(!from)return json3(res,403,{error:"unknown sender"});let owner2=connectorThread(from.id,body2.fromThreadId);if(!owner2)return json3(res,403,{error:"source conversation does not belong to sender"});if(!sameAudience(from.visibility,void 0)||owner2.group&&!roomFeedsBot(owner2.group,from)||teamHost.privateTo(body2.fromThreadId))
|
|
32344
|
+
return json3(res,403,{error:"restricted conversations cannot publish section-wide memory; ask an admin to add it. A preference of the person's own goes in their About me with memory_update action=prefer."});if(!TEAM_MEMORY_KINDS.includes(body2.kind))return json3(res,400,{error:`kind must be one of ${TEAM_MEMORY_KINDS.join(", ")}`});try{let input2={key:body2.key,kind:body2.kind,name:body2.name,detail:body2.detail,aliases:body2.aliases},submitted=teamMemoryRequests.submit(from,body2.fromThreadId,!!owner2.
|
|
32345
|
+
group,input2,appliesDirectly(from.id,body2.fromThreadId));return json3(res,submitted.status,submitted.body)}catch(error66){return json3(res,400,{error:error66 instanceof Error?error66.message:String(error66)})}}if(method2==="POST"&&path6==="/api/internal/profile-requests"){let parsed2=external_exports.object({fromBotId:external_exports.string().min(1).max(128),fromThreadId:external_exports.string().min(1).max(128),forBotId:external_exports.string().max(128).optional(),changes:external_exports.unknown(),
|
|
32346
|
+
reason:external_exports.unknown()}).strict().safeParse(await readInternalBody());if(!parsed2.success)return json3(res,400,{error:"invalid profile proposal"});let body2=parsed2.data,from=store4.bot(body2.fromBotId);if(!from)return json3(res,403,{error:"unknown sender"});let owner2=connectorThread(from.id,body2.fromThreadId);if(!owner2)return json3(res,403,{error:"source conversation does not belong to sender"});let targetBotId=body2.forBotId?.trim()||from.id,proposed=profileRequests.submit({botId:from.
|
|
32347
|
+
id,threadId:body2.fromThreadId,targetBotId,changes:body2.changes,reason:body2.reason,from:owner2.group?{botId:from.id,name:from.name,color:from.color}:void 0});return appendDecision(DATA_DIR,{threadId:body2.fromThreadId,requestId:proposed.requestId,botId:from.id,botName:from.name,tool:"update_profile",summary:proposed.detail,decision:proposed.state==="applied"?"auto-approved":"card-shown",source:proposed.state==="applied"?proposed.appliedBy??"full-access":"profile"}),json3(res,201,proposed)}if(method2===
|
|
32348
|
+
"POST"&&path6==="/api/internal/model-requests"){let parsed2=external_exports.object({fromBotId:external_exports.string().min(1).max(128),fromThreadId:external_exports.string().min(1).max(128),forBotId:external_exports.string().max(128).optional(),modelSelection:external_exports.unknown(),reason:external_exports.unknown()}).strict().safeParse(await readInternalBody());if(!parsed2.success)return json3(res,400,{error:"invalid model proposal"});let body2=parsed2.data,from=store4.bot(body2.fromBotId);
|
|
32349
|
+
if(!from)return json3(res,403,{error:"unknown sender"});let owner2=connectorThread(from.id,body2.fromThreadId);if(!owner2)return json3(res,403,{error:"source conversation does not belong to sender"});let proposed=modelRequests.submit({botId:from.id,threadId:body2.fromThreadId,targetBotId:body2.forBotId?.trim()||from.id,selection:body2.modelSelection,reason:body2.reason,from:owner2.group?{botId:from.id,name:from.name,color:from.color}:void 0});return appendDecision(DATA_DIR,{threadId:body2.fromThreadId,
|
|
32350
|
+
requestId:proposed.requestId,botId:from.id,botName:from.name,tool:"update_model",summary:proposed.detail,decision:proposed.state==="applied"?"auto-approved":"card-shown",source:proposed.state==="applied"?proposed.appliedBy??"full-access":"model"}),json3(res,201,proposed)}if(await dispatchRoutes([createBurstProposalRoutes({requireActive:requireActiveInternalCapability,readBody:readInternalBody,refusal:()=>burstProposalRefusal({owner:connectorThread(internalSender.id,internalCapability.threadId),outside:outsideWorkStaysHere(
|
|
32351
|
+
internalCapability.threadId),self:selfThreadRefusal({handoff:!!internalCapability.roomHandoffId,requestLine:store4.activePath(internalCapability.threadId).findLast(line6=>line6.role==="user"&&line6.kind==="text")})}),model:()=>burst.model(internalSender,internalCapability.threadId),propose:plan=>burst.propose({...plan,botId:internalSender.id,threadId:internalCapability.threadId})}),createInternalChiefTeamRoutes({bot:()=>store4.bot(internalCapability.botId),requireActive:requireActiveInternalCapability,
|
|
32352
|
+
teams:teamSetupTeams,bots:()=>store4.bots,instances:()=>registry2.describe()}),createInternalModelRoutes({requireActive:requireActiveInternalCapability,menu:search3=>ownThreads.menu(internalCapability.botId,internalCapability.threadId,search3)})],{req,res,url:url2,path:path6,method:method2,auth,json:json3,readBody}))return;if(method2==="POST"&&path6==="/api/internal/team-setup-requests"){let parsed2=external_exports.object({fromBotId:external_exports.string().optional(),fromThreadId:external_exports.
|
|
32353
|
+
string().optional(),plan:external_exports.unknown()}).strict().safeParse(await readInternalBody());if(!parsed2.success)return json3(res,400,{error:"Invalid team setup request"});let chief=store4.bot(internalCapability.botId),owner2=connectorThread(chief.id,internalCapability.threadId);if(!owner2)return json3(res,403,{error:"Source conversation no longer belongs to the Chief"});let proposed=await teamSetupRequests.submit({botId:chief.id,threadId:internalCapability.threadId,plan:parsed2.data.plan,
|
|
32354
|
+
canCommit:()=>internalCapabilityIsActive(internalCapability),...owner2.group?{from:{botId:chief.id,name:chief.name,color:chief.color}}:{}});return(proposed.state==="applied"||proposed.state==="pending")&&appendDecision(DATA_DIR,{threadId:internalCapability.threadId,requestId:proposed.requestId,botId:chief.id,tool:"set_up_team",summary:proposed.detail,decision:proposed.state==="applied"?"auto-approved":"card-shown",source:"appliedBy"in proposed?proposed.appliedBy:"profile"}),json3(res,201,proposed)}
|
|
32355
|
+
if(method2==="POST"&&path6==="/api/internal/bot-deletion-requests"){let parsed2=external_exports.object({fromBotId:external_exports.string().optional(),fromThreadId:external_exports.string().optional(),targetBotId:external_exports.string().min(1),reason:external_exports.string().trim().min(1).max(500)}).strict().safeParse(await readInternalBody());if(!parsed2.success)return json3(res,400,{error:"An exact bot id and deletion reason are required"});let chief=store4.bot(internalCapability.botId),owner2=connectorThread(
|
|
32356
|
+
chief.id,internalCapability.threadId);if(!owner2)return json3(res,403,{error:"Source conversation no longer belongs to the Chief"});let proposed=await teamSetupRequests.submitDeletion({botId:chief.id,threadId:internalCapability.threadId,targetBotId:parsed2.data.targetBotId,reason:parsed2.data.reason,canCommit:()=>internalCapabilityIsActive(internalCapability),...owner2.group?{from:{botId:chief.id,name:chief.name,color:chief.color}}:{}});return(proposed.state==="applied"||proposed.state==="pendin\
|
|
32357
|
+
g")&&appendDecision(DATA_DIR,{threadId:internalCapability.threadId,requestId:proposed.requestId,botId:chief.id,tool:"delete_bot",summary:proposed.detail,decision:proposed.state==="applied"?"auto-approved":"card-shown",source:"appliedBy"in proposed?proposed.appliedBy:"profile"}),json3(res,201,proposed)}let discloseRecall=(bot,roomThreadId,sourceThreadIds)=>{let crossing=claimRecallCrossings(roomThreadId,sourceThreadIds);crossing.count&&store4.appendMessage(roomThreadId,{role:"bot",kind:"activity",
|
|
32358
|
+
from:{botId:bot.id,name:bot.name,color:bot.color},tool:{name:recallCrossingLabel(bot.name,crossing.count,threadLanguage(roomThreadId)),ok:!0}})};if(method2==="GET"&&path6==="/api/internal/session-search"){let fromBotId=String(url2.searchParams.get("fromBotId")??""),from=store4.bot(fromBotId);if(!from)return json3(res,403,{error:"unknown sender"});let fromThreadId=internalCapability.threadId;if(!connectorThread(from.id,fromThreadId))return json3(res,403,{error:"source conversation does not belong\
|
|
32359
|
+
to sender"});let q2=String(url2.searchParams.get("q")??"").trim(),now2=Date.now(),sinceRaw=url2.searchParams.get("since"),untilRaw=url2.searchParams.get("until"),since=sinceRaw?parseSince(sinceRaw,now2):null,until=untilRaw?parseUntil(untilRaw,now2):null;if(sinceRaw&&since===null)return json3(res,400,{error:"since must be a date, or a span like 24h, 3d, today, yesterday"});if(untilRaw&&until===null)return json3(res,400,{error:"until must be a date, or a span like 24h, 3d, today, yesterday"});if(!q2&&
|
|
32360
|
+
since===null)return json3(res,400,{error:"q or since is required"});let range6=since!==null||until!==null?{...since!==null?{since}:{},...until!==null?{until}:{}}:void 0,rawLimit=Number(url2.searchParams.get("limit")),limit2=Number.isFinite(rawLimit)&&rawLimit>0?Math.min(Math.trunc(rawLimit),25):12,scope=url2.searchParams.get("scope")??"all";if(scope!=="all"&&scope!=="conversations"&&scope!=="memory"&&scope!=="team")return json3(res,400,{error:"scope must be all, conversations, memory, or team"});
|
|
32361
|
+
let memoryHits=scope==="conversations"||scope==="team"||!q2||from.memoryEnabled===!1?[]:teamHost.memoryIds(from.id,fromThreadId).flatMap(id12=>searchMemoryFiles(id12,q2,limit2)).slice(0,limit2);if(scope==="memory"||scope==="team")return json3(res,200,{hits:[],memoryHits,teamHits:scope==="team"?teamMemory.search(from.section,q2,limit2,range6):[]});let{roomByThread,ownThreads:ownThreads2}=recallThreads(from,internalCapability),inRoom=!!store4.groupByThread(fromThreadId),hits=(q2?recallMessages(q2,
|
|
32362
|
+
ownThreads2,limit2,range6):recentMessages(ownThreads2,range6??{},limit2)).map(hit2=>{let room=roomByThread.get(hit2.threadId);return{...hit2,task:room?(room.tasks??[]).find(task2=>task2.threadId===hit2.threadId)?.title:store4.taskByThread(from.id,hit2.threadId)?.title,...room?{room:room.name}:{},current:hit2.threadId===fromThreadId,crossed:inRoom&&!room&&hit2.threadId!==fromThreadId}});return inRoom&&discloseRecall(from,fromThreadId,hits.filter(hit2=>hit2.crossed).map(hit2=>hit2.threadId)),json3(
|
|
32363
|
+
res,200,{hits,memoryHits,teamHits:scope==="conversations"?[]:teamMemory.search(from.section,q2,limit2,range6)})}if(method2==="GET"&&path6==="/api/internal/session-read"){let fromBotId=String(url2.searchParams.get("fromBotId")??""),from=store4.bot(fromBotId);if(!from)return json3(res,403,{error:"unknown sender"});let fromThreadId=internalCapability.threadId;if(!connectorThread(from.id,fromThreadId))return json3(res,403,{error:"source conversation does not belong to sender"});let threadId=String(url2.
|
|
32364
|
+
searchParams.get("threadId")??"").trim(),messageId2=String(url2.searchParams.get("messageId")??"").trim();if(!threadId||!messageId2)return json3(res,400,{error:"threadId and messageId are required"});let recall=recallThreads(from,internalCapability),message8=recall.ownThreads.includes(threadId)?readMessageText(threadId,messageId2):null;if(!message8)return json3(res,404,{error:"no such message in your conversations"});let readCrossed=!!store4.groupByThread(fromThreadId)&&threadId!==fromThreadId&&
|
|
32365
|
+
!recall.roomByThread.has(threadId);return readCrossed&&discloseRecall(from,fromThreadId,[threadId]),json3(res,200,{...message8,crossed:readCrossed,text:message8.text.length>SESSION_READ_MAX_CHARS?`${message8.text.slice(0,SESSION_READ_MAX_CHARS)}\u2026`:message8.text,task:store4.taskByThread(from.id,threadId)?.title})}if(method2==="GET"&&path6==="/api/internal/skills"){if(!skillAuthoringEnabled(cfg))return json3(res,403,{error:"skill authoring is not enabled in Settings"});if(!internalCapability.
|
|
32366
|
+
skillAuthoring)return json3(res,403,{error:store4.groupByThread(internalCapability.threadId)?roomSkillsRefusal(!!internalCapability.roomHandoffId):"skill authoring is not enabled for this turn"});let from=internalSender,fromThreadId=internalCapability.threadId;return connectorThread(from.id,fromThreadId)?json3(res,200,{skills:skillsHost.harnessListing(from.id,listBotSkills(from)),staged:listStagedSkillWrites(from.id).map(stagedSkillListing)}):json3(res,403,{error:"source conversation does not be\
|
|
32367
|
+
long to sender"})}if(method2==="POST"&&path6==="/api/internal/skills/stage"){if(!skillAuthoringEnabled(cfg))return json3(res,403,{error:"skill authoring is not enabled in Settings"});if(!internalCapability.skillAuthoring)return json3(res,403,{error:store4.groupByThread(internalCapability.threadId)?roomSkillsRefusal(!!internalCapability.roomHandoffId):"skill authoring is not enabled for this turn"});let body2=await readInternalBody(),from=internalSender,fromThreadId=internalCapability.threadId;if(!connectorThread(
|
|
32368
|
+
from.id,fromThreadId))return json3(res,403,{error:"source conversation does not belong to sender"});let direct=appliesDirectly(from.id,fromThreadId);if(isSkillSwitchAction(body2.action)){let staged2=skillSwitch.stage(from,fromThreadId,body2.action,body2,direct);return json3(res,staged2.status,staged2.body)}let persistence=skillProposalPersistence(from.id,fromThreadId,!direct);if(!persistence.ok)return json3(res,persistence.status,{error:persistence.error});let action3=body2.action==="create"||body2.
|
|
32369
|
+
action==="update"?body2.action:"";if(!action3)return json3(res,400,{error:'action must be "create" or "update"'});let skillMd=typeof body2.skill_md=="string"?body2.skill_md:"";if(!skillMd.trim())return json3(res,400,{error:"skill_manage needs skill_md: the full SKILL.md including YAML frontmatter, for example ---\\nname: file-expense\\ndescription: Files an expense in the company portal.\\n---\\n\\n# File expense\\n"});let source4=typeof body2.source=="string"?body2.source.trim():"";if(!source4)
|
|
32370
|
+
return json3(res,400,{error:'source must be a URL, folder, or "conversation"'});let targetName=typeof body2.skill_name=="string"?body2.skill_name.trim():"";if(action3==="update"&&!targetName)return json3(res,400,{error:"skill_name is required when action is update"});let references=parseSkillManageReferences(body2.references);if("error"in references)return json3(res,400,references);if(action3==="update"&&skillsHost.editable(from.id,targetName))return references.length?json3(res,400,{error:"A ski\
|
|
32371
|
+
ll shared through the team library cannot keep reference files yet; put that guidance in SKILL.md."}):json3(res,...skillsHost.harnessUpdate(from,fromThreadId,targetName,skillMd,body2.gist,body2.base_revision,direct));let staged=stageSkillWrite(from.id,{action:action3,targetName:targetName||void 0,files:[{path:"SKILL.md",content:skillMd},...references],gist:typeof body2.gist=="string"?body2.gist:void 0,source:learnSource(source4)});if("error"in staged)return json3(res,422,{error:staged.error});if(direct){
|
|
32372
|
+
let applied=applyOwnStagedSkill(from,fromThreadId,staged,direct);return"error"in applied?json3(res,422,{state:"failed",error:applied.error}):json3(res,201,{state:"applied",stagedId:staged.id,name:staged.name,action:staged.action,gist:staged.gist,warnings:staged.warnings,...applied,summary:`Skill ${staged.name} ${staged.action==="create"?"enabled":"updated"}.`})}let card;try{card=appendSkillRequestCard({botId:from.id,threadId:fromThreadId,staged})}catch(error66){throw rejectStagedSkillWrite(from.
|
|
32373
|
+
id,staged.id),error66}return appendDecision(DATA_DIR,{threadId:fromThreadId,requestId:card.requestId,botId:from.id,botName:from.name,tool:"stage_skill",summary:card.summary,decision:"card-shown",source:"skill"}),json3(res,201,{state:"pending",stagedId:staged.id,name:staged.name,action:staged.action,gist:staged.gist,warnings:staged.warnings,summary:card.summary})}let EXTERNAL=internalCapability.generation===EXTERNAL_RUNTIME_GENERATION,coordinateBots=async call2=>{let refuse4=(status5,error66,more={})=>({
|
|
32374
|
+
status:status5,body:{error:error66,...more}}),source4=store4.groupByThread(internalCapability.threadId);if(source4&&(source4.dm||!source4.memberIds.includes(internalSender.id)))return refuse4(403,"Coordination needs a room you are a member of, or your own conversation.");let address3={groupId:source4?.id,threadId:internalCapability.threadId,botId:internalSender.id},problem=roomHandoffProblem(address3);if(problem)return refuse4(403,problem);if(call2.consult&&call2.reply==="none")return refuse4(400,
|
|
32375
|
+
"consult asks a question whose answer comes back to you; leave reply out");let groupId=call2.groupId??source4?.id,destination=groupId?store4.group(groupId):void 0;if(groupId&&!destination)return refuse4(404,"No such room; use list_room_targets.");if(destination&&destination.id!==source4?.id&&!outsideLineage.mayReach(address3.threadId,destination.threadId))return refuse4(403,OUTSIDE_STAYS_HERE);let botIds=[];for(let raw of call2.botIds){let resolved2=resolveTeammate(store4.bots,internalSender,raw,
|
|
32376
|
+
placesElsewhere.explain,bot=>CLOUD_TEAM?lookedAfterBy(bot,teamHost.personName):null,{reaches:bot=>personalReach.listed(internalSender,bot,address3.threadId),hides:bot=>personalReach.hides(internalSender,bot),refusal:bot=>personalReach.refusal(internalSender,bot,address3.threadId)});if("error"in resolved2)return refuse4(403,resolved2.error);botIds.push(resolved2.id)}if(new Set(botIds).size!==botIds.length)return refuse4(400,"bot_ids name the same teammate twice \u2014 send each teammate once");let addressedRoom=destination&&
|
|
32377
|
+
{id:destination.id,name:destination.name,here:destination.id===source4?.id},roomThreadId=destination&&(addressedRoom?.here?address3.threadId:destination.threadId),targets=botIds.map(botId=>roomHandoffTarget({groupId:destination?.id,threadId:roomThreadId??store4.bot(botId)?.threadId??"",botId},address3)),direct=targets.some(target4=>!target4.groupId),fresh=direct&&call2.thread==="new",folder3=inMyFolderCwd(call2.inMyFolder,direct,store4.taskByThread(internalSender.id,address3.threadId)?.cwd,DATA_DIR);
|
|
32378
|
+
if(fresh&&!EXTERNAL&&internalCapability.openedThreads>=MAX_THREADS_OPENED_PER_TURN)return refuse4(429,`You have already opened ${MAX_THREADS_OPENED_PER_TURN} threads this turn, which is the limit. Do not retry \u2014 finish your turn and tell the person which threads you still wanted to open, so they can open them or ask you again.`);let steersOwn=!destination&&botIds.length===1&&botIds[0]===internalSender.id&&ownThreads.steersOwn(call2.thread,internalSender.id,address3.threadId),toSelf=!!call2.
|
|
32379
|
+
ownThread||steersOwn||ownThreads.answersOwn(call2.answers,internalSender.id);for(let target4 of targets){let addressed=store4.bot(target4.botId),eligibility=target4.botId===internalSender.id&&!toSelf?"Choose a teammate, not yourself":addressed?addressed.hidden?`The bot with id "${target4.botId}" is no longer available \u2014 call list_bots for the ones you can reach`:roomHandoffProblem(target4,address3)??personalReach.handOnProblem(internalSender,addressed,address3.threadId,internalCapability.generation):
|
|
32380
|
+
`No bot with id "${target4.botId}" \u2014 call list_bots and copy the exact id from the result`;if(eligibility)return refuse4(403,eligibility)}let requestBatchKey=destination?randomUUID90():void 0,fanOut=targets.length>1?randomUUID90():void 0,handOnFor=CLOUD_TEAM?teamConnections.handOnFor(internalCapability.threadId,internalCapability.generation):null,generation=EXTERNAL?randomUUID90():internalCapability.generation;if(EXTERNAL){let opener=handoffOpener(internalCapability,address3.threadId),running5=store4.
|
|
32381
|
+
projectBotForTask(internalSender.id,address3.threadId)??internalSender;coordinator.beginTurn({id:generation,address:address3,brief:call2.message,level:approvalModeForTurn(running5,!0,address3.threadId),...opener?{opener}:{}})}let mode=call2.consult?"consult":call2.reply==="none"?"notify":"work",reply4=call2.reply==="none"?"none":EXTERNAL?"poll":"resume",returns=reply4==="none"?"nothing comes back from it":reply4==="poll"?"read its result with assignment_status":"its result will resume you",inRoom=targets.
|
|
32382
|
+
filter(target4=>target4.groupId).length,lanes=inRoom>0&&roomJobs.useLanes(destination,roomThreadId,inRoom,mode),receipts=[],refused3=[],answeredForPerson=new Set;for(let target4 of targets){let createdThread,room=target4.groupId?destination:void 0;try{requireActiveInternalCapability();let recipient=store4.bot(target4.botId);if(!recipient)throw new Error("The recipient no longer exists");let opener=(room?null:handOnFor)??openerFrom(address3.threadId);room||personalReach.checkHandOn(internalSender,
|
|
32383
|
+
recipient,address3.threadId,opener,call2.answers?{threadId:coordinator.node(call2.answers)?.threadId}:void 0);let lends=mode==="work"&&handsOnLending(internalCapability),forPerson=EXTERNAL||room||fresh||call2.answers||mode!=="work"||call2.thread==="standing"||!teammatePrompts.actsForPerson(internalSender,internalCapability.threadId)||!canManage(internalSender,recipient)||!threadReadableFrom(internalCapability.threadId)(call2.thread)||!asksActingPerson(internalCapability.threadId,store4.groupByThread(
|
|
32384
|
+
internalCapability.threadId)?internalCapability.generation:void 0)(call2.thread,recipient.id)?void 0:await questionRouting.answerForPerson({lends,sender:internalSender,senderThreadId:address3.threadId,target:recipient,threadId:call2.thread,message:call2.message});if(forPerson){forPerson.outcome==="failed"?refused3.push(forPerson.detail):answeredForPerson.add(forPerson),receipts.push(forPerson);continue}let continued=room||fresh?void 0:workThreadFor(store4,{botId:target4.botId,botName:recipient.name,
|
|
32385
|
+
fromBotId:internalSender.id,fromThreadId:address3.threadId,thread:call2.thread,notice:mode==="notify",answering:coordinator.answersTo(internalCapability.roomHandoffId??generation),also:task2=>!CLOUD_TEAM||threadStarters.get(task2.threadId)===opener,reach:task2=>outsideLineage.mayReach(address3.threadId,task2.threadId)}),relayed=EXTERNAL||!call2.answers&&(room||fresh||mode==="consult")?void 0:await questionRouting.relay({lends,sender:internalSender,senderThreadId:address3.threadId,senderNode:coordinator.
|
|
32386
|
+
node(internalCapability.roomHandoffId??generation),target:recipient,message:call2.message,...call2.answers?{answers:call2.answers}:{},...continued?{threadId:continued.threadId,...steersOwn?{selected:!0}:{}}:{},...internalCapability.delegatedThisTurn?{sentThisTurn:internalCapability.delegatedThisTurn}:{}});if(relayed){relayed.outcome==="failed"&&refused3.push(relayed.detail),receipts.push(relayed);continue}let lane=room&&lanes?roomJobs.openLane(room,target4.threadId,target4.botId,internalSender,call2.
|
|
32387
|
+
message):void 0,via=lane?"lane":room?"room":"direct";if(lane?.created&&(createdThread=lane.threadId),lane&&delegatedLevel.apply(internalSender,internalCapability.threadId,internalCapability.roomHandoffId??generation,recipient,lane.threadId),!room){let opened={botId:internalSender.id,name:internalSender.name,threadId:address3.threadId,at:Date.now(),...lends?{forOwner:!0}:{}},startedFor=created=>threadStarters.set(created.threadId,opener),task2=continued??(fresh?store4.createTask(target4.botId,call2.
|
|
32388
|
+
title??(call2.message.replace(/\s+/g," ").trim().slice(0,60)||`From ${internalSender.name}`),!1,call2.projectId,opened,call2.ownThread?.approvalMode,call2.ownThread?.modelSelection,folder3.cwd,startedFor):store4.createTask(target4.botId,`@${internalSender.name} \xB7 work`,!1,void 0,{...opened,kind:"work"},void 0,void 0,folder3.cwd,startedFor));if(!task2)throw new Error("The recipient no longer exists");target4.threadId=task2.threadId,continued||(createdThread=task2.threadId),delegatedLevel.apply(
|
|
32389
|
+
internalSender,internalCapability.threadId,internalCapability.roomHandoffId??generation,recipient,target4.threadId),lends&&!levelWithin(approvalModeForTurn(store4.projectBotForTask(recipient.id,target4.threadId)??recipient,!0,target4.threadId),approvalModeForTurn(store4.projectBotForTask(internalSender.id,address3.threadId)??internalSender,internalCapability.depth>0,address3.threadId))&&(lends=!1,handedInUnproven(target4.threadId))}let routed=lane?{botId:target4.botId,threadId:lane.threadId}:target4;
|
|
32390
|
+
outsideLineage.carry(address3.threadId,routed.threadId);let{node:node3,duplicate:duplicate2}=coordinator.enqueue(address3,generation,internalCapability.roomHandoffId,routed,call2.message,{mode,reply:reply4,thread:lane||fresh||steersOwn?"new":"standing",rework:call2.rework,...lane?{}:{requestBatchKey},...fanOut?{fanOut}:{},...call2.ownThread||steersOwn?{ownThread:!0}:{},...call2.doneWhen?{doneWhen:call2.doneWhen}:{}});usageTrace.link(node3.id,node3.parentId,{threadId:internalCapability.threadId,turnId:liveTurnByThread.
|
|
32391
|
+
get(internalCapability.threadId)??""}),duplicate2||(actingPeople.handOn(internalCapability,node3,lends),!lends&&!room&&!lane&&handedInUnproven(routed.threadId)),duplicate2&&createdThread?store4.deleteTask(target4.botId,createdThread):createdThread&&(threadStarters.set(createdThread,opener),fresh&&!EXTERNAL&&(internalCapability.openedThreads+=1)),createdThread=void 0;let title3=via==="room"?void 0:store4.taskByThread(node3.botId,node3.threadId)?.title,finished3={completed:"it already finished and\
|
|
32392
|
+
its result stands; send it with rework=true to run it again",failed:"it failed; send it with rework=true to retry",cancelled:"it was cancelled; send it with rework=true to retry"},notSent=duplicate2&&finished3[node3.status]?`not sent again: ${finished3[node3.status]}`:void 0;notSent&&refused3.push(notSent),receipts.push(peerDeliveryReceipt({botId:node3.botId,botName:recipient.name,outcome:notSent?"failed":!duplicate2||node3.status==="queued"?"queued":"injected",detail:notSent??(duplicate2?`alre\
|
|
32393
|
+
ady sent: it is ${node3.status==="queued"?"queued":"under way"} and ${returns}`:lane?`runs in its own thread "${lane.title}", in parallel with the other room jobs; its result posts in this room and ${returns}`:title3?`${outsideRoomNote(addressedRoom,via)}sent to "${title3}"; it runs after anything still running there`:"handed to the coordinator; the teammate's turn has not started yet"),requestId:node3.id,...via==="room"?{}:{threadId:node3.threadId}})),duplicate2||(EXTERNAL||delegatedThisTurn(node3.
|
|
32394
|
+
id),store4.appendMessage(address3.threadId,sentRow({sender:internalSender,recipient,threadId:node3.threadId,room:addressedRoom,via,language:threadLanguage(address3.threadId),reason:call2.reason,doneWhen:call2.doneWhen?redactSecretsInText(call2.doneWhen):void 0,title:store4.taskByThread(recipient.id,node3.threadId)?.title})))}catch(error66){createdThread&&store4.deleteTask(target4.botId,createdThread);let said2=error66 instanceof Error?error66.message:String(error66);refused3.push(said2);let current3=store4.
|
|
32395
|
+
bot(target4.botId);receipts.push(peerDeliveryReceipt({botId:target4.botId,...current3&&!current3.hidden?{botName:current3.name}:{},outcome:"failed",detail:said2}))}}let sent=refused3.length<receipts.length,answeredOnly=answeredForPerson.size>0&&receipts.every(receipt=>receipt.outcome==="failed"||answeredForPerson.has(receipt)),lead=destination&&sent?roomJobs.describeRoomJobs(destination,roomThreadId,receipts,{senderId:internalSender.id,returns,lanes,awaited:reply4!=="none"}):"";EXTERNAL&&coordinator.
|
|
32396
|
+
endTurn(generation,{ok:sent,text:sent?"":refused3.join("; ")});let message8=coordinateResultMessage(reply4,answeredOnly);return{status:sent?200:409,body:{receipts,...sent?{message:lead?`${lead} ${message8}`:message8}:{error:refused3.join("; ")},...EXTERNAL&&sent?{rootId:generation}:{}}}};if(method2==="GET"&&path6==="/api/internal/assignment-status"){let id12=url2.searchParams.get("id")?.trim()??"",fromThreadId=internalCapability.threadId;if(!connectorThread(internalSender.id,fromThreadId))return json3(
|
|
32397
|
+
res,403,{error:"source conversation does not belong to sender"});let queuedWaiting=id13=>{let node3=coordinator.node(id13);return node3?.status==="queued"?{waiting:queuedStatus(node3)}:{}},shape3=a=>({id:a.id,botId:a.assignee.botId,botName:store4.bot(a.assignee.botId)?.name??a.assignee.botId,status:a.status,...a.outcome!==void 0?{outcome:a.outcome}:{},...a.outcomeDetail!==void 0?{outcomeDetail:a.outcomeDetail}:{},result:a.result,...a.question!==void 0?{question:a.question}:{},mode:a.mode,reply:a.
|
|
32398
|
+
reply,...queuedWaiting(a.id),createdAt:a.createdAt,...a.startedAt!==void 0?{startedAt:a.startedAt}:{},...a.finishedAt!==void 0?{finishedAt:a.finishedAt}:{}}),owned=a=>coordinator.node(a.rootId)?.threadId===fromThreadId,reachable=a=>{let target4=store4.bot(a.assignee.botId);return!target4||target4.id===internalSender.id||canReach(internalSender,target4)||personalReach.reaches(internalSender,target4,fromThreadId)};if(!id12){let outstanding=coordinator.outstandingFor(fromThreadId).flatMap(n=>{let row=coordinator.
|
|
32399
|
+
status(n.id)?.assignment;return row&&reachable(row)?[shape3(row)]:[]});return json3(res,200,{outstanding})}if(internalCapability.delegatedThisTurn?.has(id12))return json3(res,409,{error:`Assignment ${id12} was handed out during this turn. Finish your response now so the teammate can work; its result returns to this conversation and resumes you. Do not check or wait for it until a later turn.`});let waitMs=Math.min(Math.max(Number(url2.searchParams.get("wait_ms"))||0,0),24e4),deadline=Date.now()+
|
|
32400
|
+
waitMs,settled2=new Set(["completed","failed","cancelled"]);for(;;){requireActiveInternalCapability();let status5=coordinator.status(id12);if(!status5)return json3(res,404,{error:"unknown assignment id"});if(!owned(status5.assignment))return json3(res,403,{error:"that assignment belongs to a different conversation"});if(!reachable(status5.assignment))return json3(res,403,{error:"Result withheld: team access changed while the teammate was working"});if(settled2.has(status5.assignment.status)||Date.
|
|
32401
|
+
now()>=deadline){if(EXTERNAL&&!status5.assignment.parentId){let lanes=new Map;for(let item of status5.inbox)item.deliveredAt===void 0&&lanes.set(`${item.ownerBotId}\0${item.ownerThreadId}\0${item.ownerRunId}`,{...item.ownerBotId!==void 0?{botId:item.ownerBotId}:{},...item.ownerThreadId!==void 0?{threadId:item.ownerThreadId}:{},...item.ownerRunId!==void 0?{runId:item.ownerRunId}:{}});for(let lane of lanes.values())coordinator.poll(lane)}let current3=coordinator.status(id12)??status5;return json3(
|
|
32402
|
+
res,200,{assignment:shape3(current3.assignment),children:current3.children.map(shape3),inbox:current3.inbox})}await new Promise(wake2=>setTimeout(wake2,500))}}if(method2==="POST"&&path6==="/api/internal/coordinate-bots"){let parsed2=external_exports.object({groupId:external_exports.string().min(1).max(128).optional(),botIds:external_exports.array(external_exports.string().min(1).max(128)).min(1).max(4).refine(ids=>new Set(ids).size===ids.length),message:external_exports.string().trim().min(1).max(
|
|
32403
|
+
4e3),reason:external_exports.string().trim().max(200).optional(),rework:external_exports.boolean().default(!1),thread:external_exports.string().trim().min(1).max(128).default("standing"),title:external_exports.string().trim().max(80).refine(fitsOnOneLine).optional(),reply:external_exports.enum(["resume","none"]).default("resume"),consult:external_exports.boolean().default(!1),inMyFolder:external_exports.boolean().optional(),done_when:external_exports.string().trim().max(1e3).optional(),answers:external_exports.
|
|
32404
|
+
string().trim().min(1).max(128).optional()}).safeParse(await readInternalBody());if(!parsed2.success)return json3(res,400,{error:coordinateTooLong(parsed2.error.issues)??"Provide 1-4 distinct botIds and a message of 1-4000 characters; thread is standing, new or the id of a thread you opened on that teammate, title one line of at most 80 characters, reply is resume or none, consult is a boolean, done_when at most 1000 characters."});let{groupId,botIds,message:message8,reason:reason3,rework,thread,
|
|
32405
|
+
title:title3,reply:reply4,consult,inMyFolder,done_when:doneWhen,answers}=parsed2.data,result2=await coordinateBots({groupId,botIds,message:message8,reason:reason3||void 0,rework,thread,title:title3||void 0,reply:reply4,consult,inMyFolder,doneWhen:doneWhen||void 0,...answers?{answers}:{}});return refusedHandoffs.settled(internalCapability.threadId,internalSender,botIds,result2.status),json3(res,result2.status,result2.body)}if(method2==="GET"&&path6==="/api/internal/room-targets"){let source4=store4.
|
|
32406
|
+
groupByThread(internalCapability.threadId);if(source4&&(source4.dm||!source4.memberIds.includes(internalSender.id)))return json3(res,403,{error:"Coordination needs a room you are a member of, or your own conversation."});let address3={groupId:source4?.id,threadId:internalCapability.threadId,botId:internalSender.id},problem=roomHandoffProblem(address3);if(problem)return json3(res,403,{error:problem});let rooms=store4.groups.filter(g3=>!g3.dm).map(g3=>({id:g3.id,name:g3.name,workingFolder:g3.cwd||
|
|
32407
|
+
null,members:g3.memberIds.map(id12=>store4.bot(id12)).filter(b11=>b11&&b11.id!==internalSender.id&&!roomHandoffProblem({groupId:g3.id,threadId:g3.id===source4?.id?address3.threadId:g3.threadId,botId:b11.id},address3)).map(b11=>({id:b11.id,name:b11.name,title:b11.title,busy:b11.busy}))})).filter(g3=>g3.members.length);return json3(res,200,{currentRoom:source4?{id:source4.id,name:source4.name,workingFolder:source4.cwd||null}:null,bots:personalReach.peers(store4.bots,internalSender,internalCapability.
|
|
32408
|
+
threadId).map(bot=>({id:bot.id,name:bot.name,title:bot.title,section:bot.section,busy:bot.busy})),rooms,note:"Each bot uses its own environment and permissions. Files are not transferred: pass absolute paths only when accessible to the recipient, otherwise pass the content."})}if(method2==="POST"&&path6==="/api/internal/retry-thread"){let body2=await readInternalBody(),from=internalSender,fromThreadId=internalCapability.threadId;if(!chiefLevel(from)||from.hidden)return json3(res,403,{error:"only\
|
|
32409
|
+
a Chief of Staff can retry a teammate's thread"});let botId=typeof body2.toBotId=="string"?body2.toBotId:"",threadId=typeof body2.toThreadId=="string"?body2.toThreadId:"",note2=typeof body2.note=="string"?body2.note.trim():"",target4=store4.bot(botId);if(!target4||target4.id===from.id)return json3(res,404,{error:"no such teammate"});if(!canManage(from,target4))return json3(res,403,{error:"that bot is not on this Chief's team \u2014 call list_bots for the ones you can reach"});if(store4.groupByThread(
|
|
32410
|
+
threadId))return json3(res,400,{error:"that is a room thread \u2014 use coordinate_bots in the room instead"});let task2=store4.taskByThread(target4.id,threadId);if(!task2||CLOUD_TEAM&&!teamHost.readableFrom(fromThreadId)(threadId))return json3(res,404,{error:"no such thread on that bot"});if(!outsideLineage.mayReach(fromThreadId,threadId))return json3(res,403,{error:OUTSIDE_STAYS_HERE});requireActiveInternalCapability();try{await retryThread({chief:from,bot:target4,threadId,note:note2,unattended:isUnattended(
|
|
32411
|
+
from.id,fromThreadId)})}catch(error66){return json3(res,409,{error:error66 instanceof Error?error66.message:String(error66)})}return store4.appendMessage(fromThreadId,{role:"bot",kind:"activity",tool:{name:`Retried ${target4.name}'s thread #${task2.title}`,ok:!0},threadRef:{botId:target4.id,threadId,title:task2.title}}),json3(res,200,{started:!0,message:`${target4.name}'s thread #${task2.title} is running again. Its result stays in that thread; you are not woken for it \u2014 check later with list_th\
|
|
32412
|
+
reads or session_search if you need to.`})}if(method2==="POST"&&path6==="/api/internal/post-to-room"){let body2=await readInternalBody(),from=internalSender,fromThreadId=internalCapability.threadId,owner2=connectorThread(from.id,fromThreadId);if(!owner2)return json3(res,403,{error:"source conversation does not belong to sender"});let groupId=String(body2.groupId??"").trim(),message8=String(body2.message??"").trim(),attachVoiceNote=body2.attachVoiceNote===!0;if(body2.attachVoiceNote!==void 0&&typeof body2.
|
|
32413
|
+
attachVoiceNote!="boolean")return json3(res,400,{error:"attachVoiceNote must be true or false"});if(!groupId||!message8)return json3(res,400,{error:"post_to_room needs group_id (from list_rooms) and message"});if((internalCapability.roomPosts??0)>=MAX_ROOM_POSTS_PER_TURN)return json3(res,429,{error:`You have already posted ${MAX_ROOM_POSTS_PER_TURN} times this turn, which is the limit. Do not retry \u2014 finish your turn and say anything further to the user directly.`});if(message8.length>ROOM_POST_MAX_CHARS)
|
|
32414
|
+
return json3(res,400,{error:`a room post is at most ${ROOM_POST_MAX_CHARS} characters \u2014 post the short version and keep the detail in your own reply`});let room=store4.group(groupId);if(!room)return json3(res,404,{error:"no such room \u2014 call list_rooms and copy the exact id from the result"});if(!outsideLineage.mayReach(fromThreadId,room.threadId))return json3(res,403,{error:OUTSIDE_STAYS_HERE});if(room.id===owner2.group?.id)return json3(res,409,{error:"you are already speaking in that \
|
|
32415
|
+
room \u2014 say it in your reply instead"});let eligibility=roomPostEligibility(from,room,fromThreadId);if(!eligibility.ok)return json3(res,eligibility.status,{error:eligibility.error});let sameName2=roomPostRefusal(body2.mentionIds,message8,room,id12=>store4.bot(id12));if(sameName2)return json3(res,sameName2.status,{error:sameName2.error});let askBudget=(bot,group2)=>{let attempt2={botId:bot.id,botName:bot.name,text:message8,now:Date.now()},askedAt=owner2.group?void 0:personAsks.get(fromThreadId),
|
|
32416
|
+
spokeAt=Math.max(lastHumanRoomMessageAt(group2)??-1/0,askedAt??-1/0);return Number.isFinite(spokeAt)&&(attempt2.lastHumanAt=spokeAt),decideRoomPost(roomPostBudgets.get(group2.id)??emptyRoomPostBudget(),attempt2)},preflight=askBudget(from,room);if(!preflight.allowed)return roomPostBudgets.set(room.id,preflight.budget),json3(res,429,{error:preflight.message});let poster=from,decision2=askBudget(poster,room);if(roomPostBudgets.set(room.id,decision2.budget),!decision2.allowed)return json3(res,429,{error:decision2.
|
|
32417
|
+
message});let unattended=isUnattended(poster.id,internalCapability.threadId),attachedVoiceNote=!1,stagedAttachments=[],detachParkedAudio;if(attachVoiceNote){let parkedKey=turnAttachmentKey(fromThreadId,liveTurnByThread.get(fromThreadId)),parked2=turnAttachmentsByTurn.get(parkedKey)??[],audio2=parked2.filter(attachment=>attachment.kind==="audio");if(!audio2.length)return json3(res,400,{error:"no voice note to attach \u2014 call send_voice_note in this turn first"});stagedAttachments=audio2.map(attachment=>({
|
|
32418
|
+
kind:"audio",path:attachment.path,mime:attachment.mime,...attachment.text?.trim()?{text:redactSecretsInText(attachment.text.trim())}:{}})),attachedVoiceNote=!0,detachParkedAudio=()=>turnAttachmentsByTurn.set(parkedKey,parked2.filter(attachment=>attachment.kind!=="audio"))}let posted=store4.appendMessage(room.threadId,{role:"bot",kind:"text",text:message8,from:{botId:poster.id,name:poster.name,color:poster.color},peerPost:unattended?{unattended:!0}:{},...attachedVoiceNote?{attachments:stagedAttachments}:
|
|
32419
|
+
{}});internalCapability.roomPosts=(internalCapability.roomPosts??0)+1,detachParkedAudio?.(),store4.patchGroup(room.id,{unread:!0});let chip={role:"bot",kind:"activity",tool:{name:serverLine(threadLanguage(fromThreadId),"server.rooms.postedIn",{room:room.name}),ok:!0},comm:{groupId:room.id,withBotId:poster.id,withName:room.name,withColor:poster.color}};return owner2.group&&(chip.from={botId:poster.id,name:poster.name,color:poster.color}),store4.appendMessage(fromThreadId,chip),json3(res,201,{ok:!0,
|
|
32420
|
+
messageId:posted.id,roomName:room.name,attachedVoiceNote})}if(method2==="POST"&&path6==="/api/internal/threads"){let body2=await readInternalBody(),from=internalSender,fromThreadId=internalCapability.threadId,owner2=connectorThread(from.id,fromThreadId);if(!owner2)return json3(res,403,{error:"source conversation does not belong to sender"});if(outsideWorkStaysHere(fromThreadId))return json3(res,403,{error:"This work came in from outside, so it can't open a new thread. Finish it here."});if(body2.
|
|
32421
|
+
depth!==void 0&&(!Number.isInteger(body2.depth)||body2.depth<0||body2.depth!==internalCapability.depth))return json3(res,403,{error:"the recursion depth does not match this turn"});let title3=String(body2.title??"").trim(),message8=String(body2.message??"").trim();if(!title3||!message8)return json3(res,400,{error:"title and message are required"});if(title3.length>80)return json3(res,400,{error:"title must be at most 80 characters"});if(!fitsOnOneLine(title3))return json3(res,400,{error:"title m\
|
|
32422
|
+
ust fit on one line"});if(internalCapability.openedThreads>=MAX_THREADS_OPENED_PER_TURN)return json3(res,429,{error:`You have already opened ${MAX_THREADS_OPENED_PER_TURN} threads this turn, which is the limit. Do not retry \u2014 finish your turn and tell the person which threads you still wanted to open, so they can open them or ask you again.`});let toBotId=typeof body2.toBotId=="string"&&body2.toBotId.trim()?body2.toBotId.trim():from.id,target4=store4.bot(toBotId);if(!target4)return json3(res,
|
|
32423
|
+
404,{error:"no such bot"});let folder3=typeof body2.folder=="string"?body2.folder.trim():"",projectId;if(folder3){let project3=(target4.projects??[]).find(candidate=>candidate.id===folder3||candidate.name.trim().toLowerCase()===folder3.toLowerCase());if(!project3){let names5=(target4.projects??[]).map(candidate=>candidate.name).join(", ");return json3(res,400,{error:`@${target4.name} has no folder named "${folder3}"${names5?` \u2014 the folders are: ${names5}`:" \u2014 it has no folders; leave folder\
|
|
32424
|
+
out"}`})}projectId=project3.id}let sourceTitle=owner2.group?owner2.group.name:store4.taskByThread(from.id,fromThreadId)?.title??"",picked=body2.modelSelection===void 0?null:checkedModelSelection(body2.modelSelection,void 0,!0),refused3=picked?target4.id!==from.id?"model_selection is only for threads on yourself":picked.ok?ownThreads.refusal(picked.selection,from):picked.error:null;if(refused3)return json3(res,400,{error:refused3});if(target4.id===from.id){let selfRefused=selfThreadRefusal({handoff:!!internalCapability.
|
|
32425
|
+
roomHandoffId,requestLine:store4.activePath(fromThreadId).findLast(line6=>line6.role==="user"&&line6.kind==="text")});if(selfRefused)return json3(res,409,{error:selfRefused});let inherited=picked?.ok?{modelSelection:picked.selection,approvalMode:void 0}:ownThreads.inherited(from.id,fromThreadId);if(body2.reportBack===!0){if(owner2.group)return json3(res,400,{error:"report_back works only from your own conversation, not a room. Leave it out; the thread's result then stays in that thread."});let result3=await coordinateBots(
|
|
32426
|
+
{botIds:[from.id],message:message8,rework:!1,thread:"new",reply:"resume",consult:!1,title:title3,projectId,ownThread:inherited}),receipt=result3.body.receipts?.[0];return json3(res,result3.status===200?201:result3.status,{...result3.body,self:!0,reportBack:!0,title:title3,botId:from.id,botName:from.name,threadId:receipt?.threadId,requestId:receipt?.requestId})}let task2=store4.createTask(from.id,title3,!1,projectId,{botId:from.id,name:from.name,at:Date.now()},inherited.approvalMode,inherited.modelSelection,
|
|
32427
|
+
void 0,created=>threadStarters.set(created.threadId,(CLOUD_TEAM?teamConnections.handOnFor(internalCapability.threadId,internalCapability.generation):null)??openerFrom(fromThreadId)));if(!task2)return json3(res,500,{error:"couldn't create that thread"});internalCapability.openedThreads+=1;let chip={role:"bot",kind:"activity",tool:{name:serverLine(threadLanguage(fromThreadId),"server.rooms.openedThread",{title:task2.title}),ok:!0},threadRef:{botId:from.id,threadId:task2.threadId,title:task2.title}};
|
|
32428
|
+
owner2.group&&(chip.from={botId:from.id,name:from.name,color:from.color}),store4.appendMessage(fromThreadId,chip);let opening=`[Thread you opened yourself${sourceTitle?` from #${sourceTitle}`:""}. The request below is your own words, not the person's: do the work here and end with a clear result they can read.]
|
|
32424
32429
|
|
|
32425
32430
|
${message8}`,outcome=await startOrQueueOpenedThread(from.id,task2.threadId,opening,isUnattended(from.id,fromThreadId),withPerson(turnOrigin(internalCapability),actingPeople.requester(internalCapability.threadId,internalCapability.generation)));return json3(res,201,{threadId:task2.threadId,title:task2.title,botId:from.id,botName:from.name,self:!0,limit:maxConcurrentBotThreads(cfg,botThreadsHost(cloudPlanTier.starter())),...outcome})}let result2=await coordinateBots({botIds:[target4.id],message:message8,
|
|
32426
32431
|
rework:!1,thread:"new",reply:"resume",consult:!1,title:title3,projectId});return json3(res,result2.status,result2.body)}if(method2==="POST"&&path6==="/api/internal/create-bot"){let body2=await readInternalBody(),chief=internalSender,fromThreadId=internalCapability.threadId,owner2=connectorThread(chief.id,fromThreadId);if(!owner2)return json3(res,403,{error:"source conversation does not belong to sender"});if(!chiefLevel(chief))return json3(res,403,{error:"only a section's Chief of Staff can crea\
|
|
@@ -32447,7 +32452,7 @@ id12)):memberIds;if(!allowedRoster(next))return json3(res,403,{error:"keep yours
|
|
|
32447
32452
|
{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(
|
|
32448
32453
|
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(
|
|
32449
32454
|
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.
|
|
32450
|
-
threadId} turn=${turnId} file=${
|
|
32455
|
+
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\
|
|
32451
32456
|
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"&¤tSender.connectorTools!==void 0){appendDecision(DATA_DIR,{threadId:internalCapability.threadId,botId:currentSender.id,botName:currentSender.name,tool:call2.invoked,summary:call2.
|
|
32452
32457
|
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=
|
|
32453
32458
|
store4.bot(internalCapability.botId),!currentSender||currentSender.composio===!1||!configured(cfg))return json3(res,403,{error:"connected apps are no longer enabled for this bot"});let verdict=evaluateConnectorTools(call2.names,currentSender.connectorTools,serviceSlugs);if(!verdict.allowed){for(let denial of verdict.denials)appendDecision(DATA_DIR,{threadId:internalCapability.threadId,botId:currentSender.id,botName:currentSender.name,tool:denial.tool,summary:denial.service===null?"tool name does\
|