limixbot 0.3.24 → 0.3.25
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-BjjmX49M.js → ActivityPanel-CgPkGKZZ.js} +1 -1
- package/dist/assets/{App-BWtQhGWp.js → App-lurtH-qI.js} +9 -9
- package/dist/assets/{AppEventEditor-Bq1-MGxi.js → AppEventEditor-G_71EWui.js} +1 -1
- package/dist/assets/BotSettingsDialog-BUvuLu53.js +16 -0
- package/dist/assets/{BrowserPanel-CPLcno_m.js → BrowserPanel-DrKZNyYB.js} +1 -1
- package/dist/assets/{BrowserProfilesManager-D9JsCp1k.js → BrowserProfilesManager-CtiUbbdv.js} +1 -1
- package/dist/assets/{CloudAddDialog-DcmN7A5a.js → CloudAddDialog-D4BX2927.js} +1 -1
- package/dist/assets/{ComputerFilesPane-Bjx6TGmM.js → ComputerFilesPane-RnmlJhlD.js} +1 -1
- package/dist/assets/{ComputerPanel-C9Xx4Ifs.js → ComputerPanel-D8upQSmd.js} +2 -2
- package/dist/assets/{DataPanel-IfpQCi3b.js → DataPanel-MZcku4SL.js} +1 -1
- package/dist/assets/{DesktopViewer-RjjUUlrQ.js → DesktopViewer-p7N7cqle.js} +1 -1
- package/dist/assets/{FilesView-D_0GwHAN.js → FilesView-CDbtoPxh.js} +1 -1
- package/dist/assets/{GrokMoveDialog-CUie-0en.js → GrokMoveDialog-BebZb43R.js} +1 -1
- package/dist/assets/{InspectorPanel-BuFL6wWf.js → InspectorPanel-BMkRIuTz.js} +1 -1
- package/dist/assets/{KeyboardShortcutsModal-uOhXagTA.js → KeyboardShortcutsModal-3XyVcNTZ.js} +1 -1
- package/dist/assets/{LiveDesktop-BwpZa-Ri.js → LiveDesktop-BkRR5lCn.js} +1 -1
- package/dist/assets/{LocalVmWorkspace-CousHKOb.js → LocalVmWorkspace-9l9iWtAy.js} +1 -1
- package/dist/assets/{MacLocalControl-BKDzplO2.js → MacLocalControl-B45d0l7H.js} +1 -1
- package/dist/assets/{MarkdownFilePreview-CCwc1Tek.js → MarkdownFilePreview-ChR-f9oD.js} +1 -1
- package/dist/assets/{MenuMotion-CSgaJLc2.js → MenuMotion-BBaxdyL_.js} +1 -1
- package/dist/assets/{NewBotDialog-BtvoCpqN.js → NewBotDialog-C_uQRhxy.js} +1 -1
- package/dist/assets/{PhoneAppDialog-C1hIwyT8.js → PhoneAppDialog-CDO1xUXD.js} +1 -1
- package/dist/assets/{PlacesRail-PP97GpM6.js → PlacesRail-iu-rjh5s.js} +1 -1
- package/dist/assets/{PluginsPanel-DpUEC1zc.js → PluginsPanel-DlQBRYQB.js} +1 -1
- package/dist/assets/{ProIntroduction-C-7uexIW.js → ProIntroduction-RbtTSiR6.js} +1 -1
- package/dist/assets/{RemoteAgentSettingsPanel-DtofJtgF.js → RemoteAgentSettingsPanel-C8r-80J4.js} +1 -1
- package/dist/assets/{RoomPanel-CHbgQ0xd.js → RoomPanel-BIUTnm5N.js} +1 -1
- package/dist/assets/{RoutinesPage-ZdFTYQc-.js → RoutinesPage-DROK-336.js} +1 -1
- package/dist/assets/{SettingsModal-Cdz3bEYZ.js → SettingsModal--yYGUYK2.js} +3 -3
- package/dist/assets/{ShareTeamDialog-CNu6Kwet.js → ShareTeamDialog-CVnQoRVQ.js} +1 -1
- package/dist/assets/{SignedInSites-CyWcDbLW.js → SignedInSites-B-iBIlfL.js} +1 -1
- package/dist/assets/TeamLibraryPanel-CwVaJVC_.js +1 -0
- package/dist/assets/{TeamMapPage-C2PnNdil.js → TeamMapPage-kXk9hCNu.js} +1 -1
- package/dist/assets/{TriggersPage-B_br6xBZ.js → TriggersPage-prZBUP3d.js} +1 -1
- package/dist/assets/{VisibilitySection-DH0WrBCn.js → VisibilitySection-DJjvTyLx.js} +1 -1
- package/dist/assets/{WebhookTrigger-BASBoMb_.js → WebhookTrigger-BAFikH71.js} +1 -1
- package/dist/assets/{WorksOnGrid-CboITAAs.js → WorksOnGrid-DJmfLtP8.js} +1 -1
- package/dist/assets/{abnfDiagram-YUKMZFIV-CJ69o_vp.js → abnfDiagram-YUKMZFIV-DUI6uevQ.js} +1 -1
- package/dist/assets/{activity-BdRjGS2C.js → activity-DVLFekjx.js} +1 -1
- package/dist/assets/{architectureDiagram-47P4ROYG-BH57AmKC.js → architectureDiagram-47P4ROYG-CMELW5_4.js} +1 -1
- package/dist/assets/{blockDiagram-E7TT5TSB-D3ebMs_o.js → blockDiagram-E7TT5TSB-C3xD0z1e.js} +1 -1
- package/dist/assets/{c4Diagram-CRA5TL53-6TrdcGZR.js → c4Diagram-CRA5TL53-Cm9X0GEV.js} +1 -1
- package/dist/assets/{calendar-days-DiMBTH2e.js → calendar-days-CDvwJ_d4.js} +1 -1
- package/dist/assets/channel-CsOUN1ZX.js +1 -0
- package/dist/assets/{chunk-2Q5K7J3B-BemwHdji.js → chunk-2Q5K7J3B-LWcbjcjL.js} +1 -1
- package/dist/assets/{chunk-5VM5RSS4-CQZbLBld.js → chunk-5VM5RSS4-B3rNoWeE.js} +1 -1
- package/dist/assets/{chunk-7TKQ45FW-Dy6EXFTX.js → chunk-7TKQ45FW-FL9R0rHe.js} +1 -1
- package/dist/assets/{chunk-AW2ZBBNX-BbKGGyK8.js → chunk-AW2ZBBNX-JRef_4rd.js} +1 -1
- package/dist/assets/{chunk-FVRAUYC3-DHqUalc2.js → chunk-FVRAUYC3-C__loQFR.js} +2 -2
- package/dist/assets/{chunk-HTAEGDNF-B66Vjlwq.js → chunk-HTAEGDNF-Bx74_xmN.js} +1 -1
- package/dist/assets/{chunk-JWPE2WC7-DrtdT6L3.js → chunk-JWPE2WC7-B20vr3uH.js} +1 -1
- package/dist/assets/{chunk-KQW6MTUR-t7RW8fFT.js → chunk-KQW6MTUR-DfO9J2pt.js} +1 -1
- package/dist/assets/{chunk-XXDRQBXY-CntyS42N.js → chunk-XXDRQBXY-BAPGqnqj.js} +1 -1
- package/dist/assets/{classDiagram-v2-K4WV4PDN-KlNCgeTt.js → classDiagram-v2-K4WV4PDN-C3VR3yN8.js} +1 -1
- package/dist/assets/{coins-BHKpT34i.js → coins-CueFc0mY.js} +1 -1
- package/dist/assets/{core-DEy6KDLR.js → core-Bw6kaGwe.js} +1 -1
- package/dist/assets/{cose-bilkent-JH36ORCC-C_cXoOGT.js → cose-bilkent-JH36ORCC-19p3m04s.js} +1 -1
- package/dist/assets/{cynefin-EF2NZ3EQ-DGuwW5zt.js → cynefin-EF2NZ3EQ-Tv0tce7B.js} +1 -1
- package/dist/assets/{cynefinDiagram-3GCD6N5R-qMzxXkVk.js → cynefinDiagram-3GCD6N5R-Iin0JwlW.js} +1 -1
- package/dist/assets/{dagre-W4DXFKR2-Q-osY3Yi.js → dagre-W4DXFKR2-00TRmSmB.js} +1 -1
- package/dist/assets/{diagram-2UJZ2QOL-DyVJSBOF.js → diagram-2UJZ2QOL-DslMBjKt.js} +1 -1
- package/dist/assets/{diagram-OVF4WLC6-C5qBFdpm.js → diagram-OVF4WLC6-C3o3f1eL.js} +1 -1
- package/dist/assets/{diagram-PFPMY2P6-C1PW3U2P.js → diagram-PFPMY2P6-RRy9F9wH.js} +1 -1
- package/dist/assets/{diagram-UMYRVEAY-D2pa0Mzi.js → diagram-UMYRVEAY-CWfRKtkp.js} +1 -1
- package/dist/assets/{diagram-YEKJPTXX-BIzOA1li.js → diagram-YEKJPTXX-SlJKvYay.js} +1 -1
- package/dist/assets/{diagram-ZIFT7M5P-B1UL3O8m.js → diagram-ZIFT7M5P-DqzI8_eN.js} +1 -1
- package/dist/assets/{ebnfDiagram-VR2GEFS7-Cxu-kU8s.js → ebnfDiagram-VR2GEFS7-CDsrBNMu.js} +1 -1
- package/dist/assets/{elk-IJKZMXRS-DJS39Bm9.js → elk-IJKZMXRS-iikFqO-X.js} +1 -1
- package/dist/assets/{erDiagram-O2IAPWRE-Cb31BS5L.js → erDiagram-O2IAPWRE-DzFCc0Gp.js} +1 -1
- package/dist/assets/{file-up-DWGlVRGP.js → file-up-BzW-KJx-.js} +1 -1
- package/dist/assets/{flowDiagram-OXPTDLAJ-BaPTzS6m.js → flowDiagram-OXPTDLAJ-U5nLRus2.js} +1 -1
- package/dist/assets/{ganttDiagram-R7TSEDQI-B_Lr-26i.js → ganttDiagram-R7TSEDQI-h7xqrZ23.js} +1 -1
- package/dist/assets/{gitGraphDiagram-XJZIOB7I-UHyDFX6a.js → gitGraphDiagram-XJZIOB7I-Bo9ZX2g5.js} +1 -1
- package/dist/assets/{import-name-Cxwtm5XO.js → import-name-BN_-MYip.js} +1 -1
- package/dist/assets/{index-BSrb6nsc.js → index-BEjJ5c6H.js} +2 -2
- package/dist/assets/{index-BME9PdWM.js → index-DkDFNBNq.js} +1 -1
- package/dist/assets/{infoDiagram-5W2HQ5XZ-B7ovBJYA.js → infoDiagram-5W2HQ5XZ-CAZmFoiz.js} +1 -1
- package/dist/assets/{ishikawaDiagram-K3B6WC7H-BYS-TlrF.js → ishikawaDiagram-K3B6WC7H-T1M7DtvG.js} +1 -1
- package/dist/assets/{journeyDiagram-COXZFDF6-jJxKYEtT.js → journeyDiagram-COXZFDF6-DzO0Gzq9.js} +1 -1
- package/dist/assets/{kanban-definition-P3RFRI5V-DyiFYaIK.js → kanban-definition-P3RFRI5V-C0fM1UHu.js} +1 -1
- package/dist/assets/{mcp-servers-DXFuhTlS.js → mcp-servers-C7oRQpN5.js} +1 -1
- package/dist/assets/{mermaid.core-D3YJgsiB.js → mermaid.core-mKZTdBWz.js} +4 -4
- package/dist/assets/{mindmap-definition-LZFPQGKD-DnbWodUY.js → mindmap-definition-LZFPQGKD-DEgoC28p.js} +1 -1
- package/dist/assets/{minimize-Af1aU3Tz.js → minimize-D-CvaOV-.js} +1 -1
- package/dist/assets/{monitor-DuYHWIyw.js → monitor-DRcE92Rj.js} +1 -1
- package/dist/assets/{new-bot-TwOnvVO1.js → new-bot-COj1uEQa.js} +1 -1
- package/dist/assets/{org-library-BLD6YHcM.js → org-library-BIb28h24.js} +1 -1
- package/dist/assets/{package-format-72bbOy2w.js → package-format-hON5OXLZ.js} +1 -1
- package/dist/assets/{pegDiagram-BGZESJAR-CcOuP6zx.js → pegDiagram-BGZESJAR-Vatn56u_.js} +1 -1
- package/dist/assets/{pieDiagram-CAPJLFHJ-DhCU7Sfy.js → pieDiagram-CAPJLFHJ-DniOgFo3.js} +1 -1
- package/dist/assets/{quadrantDiagram-GDMTTRAM-7OziX26h.js → quadrantDiagram-GDMTTRAM-BqhAQt5w.js} +1 -1
- package/dist/assets/{rail-DI2iZJYt.js → rail-BWcrFQ2_.js} +1 -1
- package/dist/assets/{railroadDiagram-SM67HX2B-rg44R4U2.js → railroadDiagram-SM67HX2B-CxHs3JOs.js} +1 -1
- package/dist/assets/{remote-desktop-panel-BPKKvcHT.js → remote-desktop-panel-9XdtvJrd.js} +1 -1
- package/dist/assets/{requirementDiagram-X7JNWC4A-DFNvg72O.js → requirementDiagram-X7JNWC4A-ChjhMFon.js} +1 -1
- package/dist/assets/{sankeyDiagram-UM26HJRW-CUOrQF2i.js → sankeyDiagram-UM26HJRW-B67bYF8E.js} +1 -1
- package/dist/assets/{sequenceDiagram-ZO4K6R2Y-4HKsH1wt.js → sequenceDiagram-ZO4K6R2Y-CTy7B-eu.js} +1 -1
- package/dist/assets/{sizeCapture-INFHLROL-BEXQDTx-.js → sizeCapture-INFHLROL-uy6qiY-2.js} +1 -1
- package/dist/assets/{stateDiagram-v2-TBUQTH76-BYBLUqiy.js → stateDiagram-v2-TBUQTH76-BvYYPNqL.js} +1 -1
- package/dist/assets/{styles-C2_XZv1s.js → styles-DlOxUga6.js} +1 -1
- package/dist/assets/{swimlanes-N4OXWK64-D-bp8wWN.js → swimlanes-N4OXWK64-CMSAKu-2.js} +1 -1
- package/dist/assets/swimlanesDiagram-K3J5GTZL-BaaZdhur.js +8 -0
- package/dist/assets/{team-share-Dpu1nJNz.js → team-share-BbQqJ5O6.js} +1 -1
- package/dist/assets/{timeline-definition-YOQAKGHF-CtLFkcud.js → timeline-definition-YOQAKGHF-BOK1V5EC.js} +1 -1
- package/dist/assets/{usecaseDiagram-VIAY4XPW-AWOhUKvG.js → usecaseDiagram-VIAY4XPW-DEywfSfC.js} +1 -1
- package/dist/assets/{vennDiagram-BLWOH2XV-C_OYDBvp.js → vennDiagram-BLWOH2XV-DN1iWw97.js} +1 -1
- package/dist/assets/{vi-P4zxF4j0.js → vi-C-E3a4Tv.js} +2 -2
- package/dist/assets/{wardleyDiagram-YMQ3BMBF-CdxMh8tE.js → wardleyDiagram-YMQ3BMBF-BAIfK1We.js} +1 -1
- package/dist/assets/{xychartDiagram-TAQBALBS-BL2spC5z.js → xychartDiagram-TAQBALBS-BLBD8FaQ.js} +1 -1
- package/dist/index.html +2 -2
- package/dist/rail.html +4 -4
- package/dist-server/index.js +244 -229
- package/dist-server/openmausbot.js +1 -1
- package/dist-server/package.json +1 -1
- package/dist-server/pair-cli.js +1 -1
- package/dist-server/server/imported-skills.js +7 -2
- package/dist-server/server/index.js +7 -5
- package/dist-server/server/limix-bot-library.js +6 -0
- package/dist-server/server/limix-skill-hub.js +2 -2
- package/dist-server/server/limix-skill-store.js +179 -0
- package/dist-server/server/routes/bot-skills.js +15 -4
- package/package.json +1 -1
- package/skills/windows-computer-automation/SKILL.md +53 -0
- package/skills/windows-computer-automation/assets/HERIONIX-LEADER-PROMPT.md +25 -0
- package/skills/windows-computer-automation/assets/control-policy.example.json +25 -0
- package/skills/windows-computer-automation/assets/mcp-servers.example.json +19 -0
- package/skills/windows-computer-automation/manifest.json +27 -0
- package/skills/windows-computer-automation/references/herionix-integration.md +72 -0
- package/skills/windows-computer-automation/references/routing.md +26 -0
- package/skills/windows-computer-automation/references/scenarios.md +44 -0
- package/skills/windows-computer-automation/references/security.md +24 -0
- package/skills/windows-computer-automation/scripts/policy_engine.py +235 -0
- package/skills/windows-computer-automation/scripts/test_policy_engine.py +107 -0
- package/dist/assets/BotSettingsDialog-CVlvG4Rb.js +0 -16
- package/dist/assets/TeamLibraryPanel-DMhdlaSH.js +0 -1
- package/dist/assets/channel-k2J2GMwv.js +0 -1
- package/dist/assets/swimlanesDiagram-K3J5GTZL-DTQBdgKt.js +0 -8
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:join281}=__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"]||join281(__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:
|
|
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:existsSync102}=__require("node:fs"),getCallers=require_caller(),{join:join281,isAbsolute:isAbsolute42,sep:sep17}=__require("node:path"),{fileURLToPath:fileURLToPath4}=__require("node:url"),sleep7=require_atomic_sleep(),onExit=require_on_exit_leak_free(),ThreadStream=require_thread_stream();function setupOnExit(stream2){
|
|
10082
10082
|
onExit.register(stream2,autoEnd),onExit.registerBeforeExit(stream2,flush),stream2.on("close",function(){onExit.unregister(stream2)})}function hasPreloadFlags(){let execArgv=process.execArgv;for(let i=0;i<execArgv.length;i++){let arg=execArgv[i];if(arg==="--import"||arg==="--require"||arg==="-r"||arg.startsWith("--import=")||arg.startsWith("--require=")||arg.startsWith("-r="))return!0}return!1}function sanitizeNodeOptions(nodeOptions){let tokens=nodeOptions.match(/(?:[^\s"']+|"[^"]*"|'[^']*')+/g);
|
|
10083
10083
|
if(!tokens)return nodeOptions;let sanitized=[],changed3=!1;for(let i=0;i<tokens.length;i++){let token3=tokens[i];if(token3==="--require"||token3==="-r"||token3==="--import"){let next=tokens[i+1];if(next&&shouldDropPreload(next)){changed3=!0,i++;continue}sanitized.push(token3),next&&(sanitized.push(next),i++);continue}if(token3.startsWith("--require=")||token3.startsWith("-r=")||token3.startsWith("--import=")){let value3=token3.slice(token3.indexOf("=")+1);if(shouldDropPreload(value3)){changed3=!0;
|
|
10084
|
-
continue}}sanitized.push(token3)}return changed3?sanitized.join(" "):nodeOptions}function shouldDropPreload(value3){let unquoted=stripQuotes2(value3);if(!unquoted)return!1;let path6=unquoted;if(path6.startsWith("file://"))try{path6=fileURLToPath4(path6)}catch{return!1}return isAbsolute42(path6)&&!
|
|
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)&&!existsSync102(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,isAbsolute42(origin2)||origin2.indexOf("file://")===0)return origin2;if(origin2==="pino/file")return
|
|
10088
|
+
of target or targets can be specified");targets?(target4=bundlerOverrides["pino-worker"]||join281(__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"]||join281(__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 join281(__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="",join281=",",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}`,join281=`,
|
|
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+=join281}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+=`${join281}"... ${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,join281=`,
|
|
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=join281)}if(keyLength>maximumBreadth){let removedKeys=keyLength-maximumBreadth;
|
|
10138
|
+
res+=`${separator}"...":${whitespace}"${getItemCount(removedKeys)} not stringified"`,separator=join281}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="",join281=",";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}`,join281=`,
|
|
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+=join281}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+=`${join281}"... ${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,join281=`,
|
|
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=join281)}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}`,join282=`,
|
|
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+=join282}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+=`${join282}"... ${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 join281=`,
|
|
10154
|
+
${indentation}`,res="",separator="",maximumPropertiesToStringify=Math.min(keyLength,maximumBreadth);isTypedArrayWithEntries(value3)&&(res+=stringifyTypedArray(value3,join281,maximumBreadth),keys5=keys5.slice(value3.length),maximumPropertiesToStringify-=value3.length,separator=join281),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=join281)}if(keyLength>maximumBreadth){let removedKeys=keyLength-maximumBreadth;res+=`${separator}"...": "${getItemCount(removedKeys)} not stringified"`,separator=join281}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,join281){return(data4,i)=>mapOuter(pa2(data4,i),ma2=>mapInner(pb(data4,ma2.position),(vb,j2)=>join281(ma2.value,vb,data4,i,j2)))}function abc2(pa2,pb,pc,join281){return(data4,i)=>mapOuter(pa2(data4,i),ma2=>mapOuter(pb(data4,ma2.position),mb2=>mapInner(pc(data4,mb2.position),(vc,j2)=>join281(ma2.value,mb2.value,vc,data4,i,j2))))}
|
|
13344
13344
|
function ahead(p3){return(data4,i)=>mapOuter(p3(data4,i),m1=>({matched:!0,position:i,value:m1.value}))}function all2(...ps2){return(data4,i)=>{let result2=[],position3=i;for(let p3 of ps2){let r1=p3(data4,position3);if(r1.matched)result2.push(r1.value),position3=r1.position;else return{matched:!1}}return{matched:!0,position:position3,value:result2}}}function chain(p3,f3){return(data4,i)=>mapOuter(p3(data4,i),m1=>f3(m1.value,data4,i,m1.position)(data4,m1.position))}function chainReduce(acc,f3){return(data4,i)=>{
|
|
13345
13345
|
let loop=!0,acc1=acc,pos=i;do{let r=f3(acc1,data4,pos)(data4,pos);r.matched?(acc1=r.value,pos=r.position):loop=!1}while(loop);return{matched:!0,position:pos,value:acc1}}}function eitherOr(pa2,pb){return(data4,i)=>{let r1=pa2(data4,i);return r1.matched?r1:pb(data4,i)}}function error65(message8){return(data4,i)=>{throw new Error(message8 instanceof Function?message8(data4,i):message8)}}function first(...ps2){return(data4,i)=>{for(let p3 of ps2){let result2=p3(data4,i);if(result2.matched)return result2}
|
|
13346
13346
|
return{matched:!1}}}function map5(p3,mapper){return(data4,i)=>mapInner(p3(data4,i),(v4,j2)=>mapper(v4,data4,i,j2))}function flatten1(p3){return map5(p3,vs2=>vs2.flatMap(v4=>v4))}function flatten2(...ps2){return flatten1(all2(...ps2))}function left(pa2,pb){return ab4(pa2,pb,va=>va)}function reduceLeft(acc,p3,reducer){return chainReduce(acc,acc2=>map5(p3,(v4,data4,i,j2)=>reducer(acc2,v4,data4,i,j2)))}function leftAssoc2(pLeft,pOper,pRight){return chain(pLeft,v0=>reduceLeft(v0,ab4(pOper,pRight,(f3,y6)=>[
|
|
@@ -15073,11 +15073,11 @@ mod.js"(){init_mod();init_aesGcm();init_exportOnly();init_native();init_dhkemX25
|
|
|
15073
15073
|
let parsed2;try{parsed2=JSON.parse(raw)}catch{parsed2=null}(!parsed2||typeof parsed2!="object"||Array.isArray(parsed2))&&invalid("the Cloud home's secrets from the launcher are not readable");let record31=parsed2;return Object.fromEntries(CLOUD_HOME_SECRET_KEYS.flatMap(key7=>typeof record31[key7]=="string"&&record31[key7]?[[key7,record31[key7]]]:[]))}var BOOT_CLOUD_SECRETS=takeCloudSecrets();init_user_errors();var START_FAILURE={"serverError.computer.desktopOnly":"chat.notice.computerDesktopOnly","serverError.computer.permissionsThenRestart":"chat.notice.computerPermissionsThenRestart","serverError.computer.notReadyDetail":"chat.notice.computerNotReadyDetail","serverError.computer.notReadyMacPermission":"chat.notice.computerNotReadyMacPermission","serverError.computer.systemUnsupported":"chat.notice.computerSystemUnsupported","serverError.computer.aiUnsupported":"chat.notice.compute\
|
|
15074
15074
|
rAiUnsupported","serverError.engine.signedOut":"chat.notice.engineSignedOut"};function startFailureText(error66){let fields2=userErrorFields(error66);if(!(!fields2.errorKey||!Object.hasOwn(START_FAILURE,fields2.errorKey)))return{key:START_FAILURE[fields2.errorKey],...fields2.errorParams?{params:fields2.errorParams}:{}}}function reserveGmailDrafts(calls2,reserved){let keys5=[];for(let call2 of calls2){if(call2.slug!=="GMAIL_CREATE_EMAIL_DRAFT")continue;let args=call2.arguments,thread=args&&typeof args.thread_id=="string"?args.thread_id:"";if(!thread)continue;let key7=JSON.stringify([args?.user_id??"me",thread]);if(reserved.has(key7)||keys5.includes(key7))return"Draft creation for this Gmail thread was already attempted in this request. Read the existing drafts and update the intended draft by ID; do not create \
|
|
15075
15075
|
another, including after a timeout.";keys5.push(key7)}for(let key7 of keys5)reserved.add(key7);return null}function createGmailDrafts(deps){let byGeneration=new Map,byNode=new Map;function forNode(id12){for(let cachedId of byNode.keys()){let node4=deps.node(cachedId);(!node4||deps.ended(node4.status))&&byNode.delete(cachedId)}let node3=deps.node(id12);if(!node3)return;let cached5=byNode.get(id12);if(cached5)return cached5;let owner2=deps.owner(node3.threadId),reserved=owner2?.generations.has(id12)&&owner2.gmailDrafts?owner2.gmailDrafts:(node3.parentId?forNode(node3.parentId):void 0)??new Set;return byNode.
|
|
15076
|
-
set(id12,reserved),reserved}return{forNode,forTurn(threadId,generation,handoffId){let cached5=byGeneration.get(generation);if(cached5)return cached5;let owner2=deps.owner(threadId),reserved=owner2?.generation===generation&&owner2.gmailDrafts?owner2.gmailDrafts:forNode(handoffId??generation)??new Set;return byGeneration.set(generation,reserved),reserved},forRoomTurn(generation,handoffId){byGeneration.set(generation,forNode(handoffId)??new Set)},endTurn(generation){byGeneration.delete(generation)}}}import{AsyncLocalStorage as AsyncLocalStorage5}from"node:async_hooks";import{createHash as createHash129,randomBytes as randomBytes39,randomUUID as randomUUID91,timingSafeEqual as timingSafeEqual17}from"node:crypto";import{existsSync as
|
|
15076
|
+
set(id12,reserved),reserved}return{forNode,forTurn(threadId,generation,handoffId){let cached5=byGeneration.get(generation);if(cached5)return cached5;let owner2=deps.owner(threadId),reserved=owner2?.generation===generation&&owner2.gmailDrafts?owner2.gmailDrafts:forNode(handoffId??generation)??new Set;return byGeneration.set(generation,reserved),reserved},forRoomTurn(generation,handoffId){byGeneration.set(generation,forNode(handoffId)??new Set)},endTurn(generation){byGeneration.delete(generation)}}}import{AsyncLocalStorage as AsyncLocalStorage5}from"node:async_hooks";import{createHash as createHash129,randomBytes as randomBytes39,randomUUID as randomUUID91,timingSafeEqual as timingSafeEqual17}from"node:crypto";import{existsSync as existsSync101,realpathSync as realpathSync28,rmSync as rmSync68}from"node:fs";import{homedir as homedir45}from"node:os";import{rm as removeDirectory}from"node:fs/promises";import{createServer as createServer16}from"node:http";init_redact();import{randomUUID}from"node:crypto";var TOOL_RESULT_PREVIEW_CHARS=16e3,TOOL_RESULT_MAX_CHARS=128*1024,TOOL_RESULT_TTL_MS=60*6e4,MAX_RESULTS=128,MAX_RESULTS_PER_OWNER=16,MAX_BYTES=16*1024*1024,MAX_OWNER_BYTES=2*1024*1024;function toolResultPrefix(text31,chars){let prefix=text31.slice(0,chars),last=prefix.charCodeAt(prefix.length-1);return last>=55296&&last<=56319?prefix.slice(0,-1):prefix}var ToolResults=class{results=new Map;now;constructor(now2=Date.now){this.now=now2}expire(){let now2=this.
|
|
15077
15077
|
now();for(let[id12,result2]of this.results)result2.expiresAt<=now2&&this.results.delete(id12)}save(owner2,text31,truncated=!1){this.expire();let redacted=redactSecretsInText(text31),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,text31=toolResultPrefix(result2.text.slice(start),TOOL_RESULT_PREVIEW_CHARS);return{id:id12,text:text31,offset:start,nextOffset:start+text31.length,length:result2.
|
|
15080
|
-
text.length,truncated:result2.truncated,expiresAt:result2.expiresAt}}};import{basename as basename37,join as
|
|
15080
|
+
text.length,truncated:result2.truncated,expiresAt:result2.expiresAt}}};import{basename as basename37,join as join280}from"node:path";import{createHash,timingSafeEqual}from"node:crypto";import{closeSync as closeSync2,constants,fstatSync,openSync,readSync}from"node:fs";var MAX_FILE_BYTES=1048576,ID=/^[\w-]{1,128}$/,fingerprint=token3=>createHash("sha256").update(token3).digest("hex"),sameFingerprint=(left2,right2)=>{let a=Buffer.from(left2),b11=Buffer.from(right2);return a.length===b11.length&&timingSafeEqual(a,b11)};function registrations(file3){let fd;try{fd=openSync(file3,constants.O_RDONLY|(process.platform==="win32"?0:constants.
|
|
15081
15081
|
O_NOFOLLOW|constants.O_NONBLOCK));let stat16=fstatSync(fd);if(!stat16.isFile()||stat16.size>MAX_FILE_BYTES)return[];if(process.platform!=="win32"&&(stat16.mode&63)!==0)return console.warn("[comms] ignoring external runtime credentials: use a private file (chmod 600)"),[];let bytes4=Buffer.alloc(stat16.size+1),count12=0;for(;;){let read4=readSync(fd,bytes4,count12,bytes4.length-count12,null);if(!read4)break;if(count12+=read4,count12>stat16.size)return[]}let parsed2=JSON.parse(bytes4.subarray(0,count12).
|
|
15082
15082
|
toString("utf8"));return!parsed2||typeof parsed2!="object"||Array.isArray(parsed2)?[]:Object.entries(parsed2).flatMap(([botId,value3])=>{if(!ID.test(botId)||!value3||typeof value3!="object"||Array.isArray(value3))return[];let{token:token3,threadId}=value3;return typeof token3!="string"||token3.length<32||token3.length>4096||/\s/.test(token3)?[]:typeof threadId!="string"||!ID.test(threadId)?[]:[{botId,tokenHash:fingerprint(token3),threadId}]})}catch{return[]}finally{fd!==void 0&&closeSync2(fd)}}function resolveRegistration(file3,tokenHash,botForId){
|
|
15083
15083
|
let matches3=registrations(file3).filter(entry2=>sameFingerprint(entry2.tokenHash,tokenHash));if(matches3.length!==1)return null;let registration=matches3[0],bot=botForId(registration.botId);if(!bot||bot.hidden)return null;let task2=bot.tasks?.find(candidate=>candidate.threadId===registration.threadId);return!task2||task2.archivedAt!==void 0?null:{botId:bot.id,threadId:task2.threadId,tokenHash}}function authorizeExternalRuntime(file3,header3,botForId){return typeof header3!="string"||!/^Bearer \S{32,4096}$/.
|
|
@@ -16216,7 +16216,7 @@ skills,library}}function listMigratableSkills(botId){return Object.entries(readM
|
|
|
16216
16216
|
filesSha256}:{},...entry2.github?{github:{...entry2.github}}:{},intact:skillContentMatches(botId,name6,entry2)})).sort((a,b11)=>a.name.localeCompare(b11.name))}function removeManifestEntry(botId,name6,expectSha256){if(!isSkillName(name6))return{error:"invalid skill name"};let manifest=readManifest(botId),entry2=manifest[name6];return entry2?entry2.sha256!==expectSha256?{error:`skill "${name6}" changed since it was read \u2014 leaving it in place`}:(delete manifest[name6],writeManifest(botId,manifest),
|
|
16217
16217
|
syncSkillLinks(botId),{removed:!0}):{removed:!0}}var IMPORTED_SKILLS_DIR=join36(DATA_DIR,"imported-skills"),INDEX_PATH=join36(DATA_DIR,"skill-state","imported-skills.json"),choicesPath2=botId=>join36(DATA_DIR,"skill-state",botId,"imported-skills.json"),sha256Hex2=external_exports.string().regex(/^[a-f0-9]{64}$/),entrySchema=external_exports.object({description:external_exports.string(),source:external_exports.enum(["claudeCode","codex"]),root:external_exports.string(),origin:external_exports.string(),label:external_exports.string(),sha256:sha256Hex2,
|
|
16218
16218
|
filesSha256:sha256Hex2,importedAt:external_exports.string(),warnings:external_exports.array(external_exports.string()),license:external_exports.string().optional(),compatibility:external_exports.string().optional()}),indexSchema=external_exports.record(external_exports.string(),entrySchema),choicesSchema2=external_exports.object({off:external_exports.array(external_exports.string()),on:external_exports.record(external_exports.string(),sha256Hex2).default({}),listed:external_exports.array(external_exports.
|
|
16219
|
-
string()).optional()});function readImportedSkills(){try{let parsed2=indexSchema.safeParse(JSON.parse(readFileSync31(INDEX_PATH,"utf8")));return parsed2.success?Object.fromEntries(Object.entries(parsed2.data).filter(([name6])=>isSkillName(name6))):{}}catch{return{}}}function writeIndex(index4){mkdirSync19(dirname20(INDEX_PATH),{recursive:!0,mode:448}),writeFileAtomic(INDEX_PATH,`${JSON.stringify(index4,null,2)}
|
|
16219
|
+
string()).optional(),picked:external_exports.array(external_exports.string()).optional()});function readImportedSkills(){try{let parsed2=indexSchema.safeParse(JSON.parse(readFileSync31(INDEX_PATH,"utf8")));return parsed2.success?Object.fromEntries(Object.entries(parsed2.data).filter(([name6])=>isSkillName(name6))):{}}catch{return{}}}function writeIndex(index4){mkdirSync19(dirname20(INDEX_PATH),{recursive:!0,mode:448}),writeFileAtomic(INDEX_PATH,`${JSON.stringify(index4,null,2)}
|
|
16220
16220
|
`,{mode:384})}function readChoices2(botId){try{let parsed2=choicesSchema2.safeParse(JSON.parse(readFileSync31(choicesPath2(botId),"utf8")));if(parsed2.success)return parsed2.data}catch{}return{off:[],on:{},listed:[]}}var FIT_MAX_SKILLS=15;function listedImportedSkills(botId,available,about){let{listed:listed3}=readChoices2(botId);if(!listed3||available.length<=FIT_MAX_SKILLS)return[...available];let picked=new Set(available.filter(skill=>listed3.includes(skill.name)).map(skill=>skill.name)),room=Math.
|
|
16221
16221
|
max(0,FIT_MAX_SKILLS-picked.size);for(let skill of rankSkills(available.filter(one5=>!picked.has(one5.name)),about).slice(0,room))picked.add(skill.name);return available.filter(skill=>picked.has(skill.name))}function readFileNoFollow(path6){let fd=null;try{return fd=openSync14(path6,constants7.O_RDONLY|(process.platform==="win32"?0:constants7.O_NOFOLLOW)),fstatSync9(fd).isFile()?readFileSync31(fd):null}catch{return null}finally{if(fd!==null)try{closeSync16(fd)}catch{}}}var MAX_DIGEST_DEPTH=16,digests2=new Map;
|
|
16222
16222
|
function folderDigest(dir){let stats=[],entries4=[],note2=(path6,info2)=>stats.push(`${path6}\0${info2.ino}\0${info2.size}\0${info2.mtimeMs}\0${info2.ctimeMs}\0${info2.mode}`),walk6=(folder3,prefix,depth2)=>{if(depth2>MAX_DIGEST_DEPTH)return!1;let names5;try{names5=readdirSync11(folder3).sort()}catch{return!1}for(let name6 of names5){let full=join36(folder3,name6),path6=prefix?`${prefix}/${name6}`:name6,info2;try{info2=lstatSync8(full)}catch{return!1}if(note2(path6,info2),info2.isDirectory()){if(entries4.
|
|
@@ -16227,14 +16227,14 @@ push({path:path6,folder:!0}),!walk6(full,path6,depth2+1))return!1}else if(info2.
|
|
|
16227
16227
|
files){let parts3=file3.path.split("/"),at8=folder3,placed=!0;for(let part2 of parts3.slice(0,-1)){at8=join36(at8,part2);let state=directoryEntryState(at8);if(state==="missing")try{mkdirSync19(at8,{mode:448})}catch{placed=!1;break}else if(state!=="directory"){placed=!1;break}}if(placed)try{writeFileSync10(join36(at8,parts3[parts3.length-1]),file3.content,{mode:fileMode(file3.executable),flag:"wx"})}catch(error66){let code=error66.code;if(code!=="EEXIST"&&code!=="ENOTDIR"&&code!=="EISDIR")throw error66;
|
|
16228
16228
|
placed=!1}placed||(leftOut2+=1)}return leftOut2}function ensureRealDirectory(path6){if(directoryEntryState(path6)==="missing"&&mkdirSync19(path6,{recursive:!0,mode:448}),directoryEntryState(path6)!=="directory")throw new Error(`${path6} must be a real folder`)}function storeImportedSkills(inputs){ensureRealDirectory(IMPORTED_SKILLS_DIR);let staging2=join36(IMPORTED_SKILLS_DIR,".staging");rmSync8(staging2,{recursive:!0,force:!0}),ensureRealDirectory(staging2);let index4=readImportedSkills(),results=[];
|
|
16229
16229
|
try{for(let input2 of inputs){let staged=join36(staging2,randomUUID11());try{if(!isSkillName(input2.name))throw new Error("invalid skill name");let leftOut2=writeStaged2(staged,input2),digest5=folderDigest(staged);if(!digest5)throw new Error("the staged copy could not be read back");let target4=join36(IMPORTED_SKILLS_DIR,input2.name);entryExistsWithoutFollowing(target4)&&renameSync11(target4,join36(staging2,`${randomUUID11()}-replaced`)),renameSync11(staged,target4),digests2.delete(staged),digests2.
|
|
16230
|
-
delete(target4),index4[input2.name]={...input2.entry,filesSha256:digest5.sha256,importedAt:new Date().toISOString()},results.push({name:input2.name,stored:!0,leftOut:leftOut2})}catch{results.push({name:input2.name,stored:!1,leftOut:0})}}results.some(result2=>result2.stored)&&writeIndex(index4)}finally{rmSync8(staging2,{recursive:!0,force:!0})}return results}function enabledFor2(name6,entry2,choices){return choices.off.includes(name6)?!1:entry2.warnings.length===
|
|
16231
|
-
var comparable2=path6=>{let resolved2=resolve12(path6).replace(/^\\\\\?\\/,"");return process.platform==="win32"?resolved2.toLowerCase():resolved2};function loadedInPlace(entry2,native){return native.some(folder3=>comparable2(folder3)===comparable2(entry2.root))?entryExistsWithoutFollowing(entry2.origin):!1}function importedSkillsFor(botId,shadowed,native=[]){let index4=readImportedSkills(),names5=Object.keys(index4).filter(name6=>!shadowed.has(name6)).sort();
|
|
16232
|
-
botId);return names5.flatMap(name6=>{let entry2=index4[name6];if(!enabledFor2(name6,entry2,choices)||loadedInPlace(entry2,native)||!importedSkillIntact(name6,entry2))return[];let folder3=join36(IMPORTED_SKILLS_DIR,name6);return[{name:name6,description:entry2.description,folder:folder3,file:join36(folder3,"SKILL.md")}]})}var IMPORTED_CHANGED_WARNING="its files changed after it was brought in \u2014 bring it in again from Settings \u2192 Replay welcome
|
|
16233
|
-
let index4=readImportedSkills(),choices=readChoices2(botId),listings2=Object.keys(index4).filter(name6=>!shadowed.has(name6)).sort().map(name6=>{let entry2=index4[name6],intact=importedSkillIntact(name6,entry2),enabled=intact&&enabledFor2(name6,entry2,choices);return{name:name6,description:entry2.description,enabled,listed:!1,...enabled?{file:join36(IMPORTED_SKILLS_DIR,name6,"SKILL.md")}:{},editable:!1,source:entry2.label,sha256:entry2.sha256,
|
|
16234
|
-
license}:{},...entry2.compatibility?{compatibility:entry2.compatibility}:{},warnings:intact?entry2.warnings:[...entry2.warnings,IMPORTED_CHANGED_WARNING],skippedFiles:[],origin:"imported"}}),listed3=new Set(listedImportedSkills(botId,listings2.filter(skill=>skill.enabled),about).map(skill=>skill.name));for(let skill of listings2)skill.listed=listed3.has(skill.name);return[...listings2.filter(skill=>skill.listed),...listings2.filter(skill=>!skill.
|
|
16235
|
-
if(!entry2||!importedSkillIntact(name6,entry2))return null;let text31=readFileNoFollow(join36(IMPORTED_SKILLS_DIR,name6,"SKILL.md"))?.toString("utf8")??null;return text31!==null&&createHash11("sha256").update(text31).digest("hex")===entry2.sha256?text31:null}function setImportedSkillEnabled(botId,name6,enabled){let entry2=readImportedSkills()[name6];if(!entry2)return{error:`no skill named "${name6}" was brought
|
|
16236
|
-
"${name6}" ${IMPORTED_CHANGED_WARNING}`};let choices=readChoices2(botId),off2=choices.off.filter(other=>other!==name6),{[name6]:_read,...on3}=choices.on,listed3=choices.listed?.filter(other=>other!==name6),next=enabled?{off:off2,on:entry2.warnings.length?{...on3,[name6]:entry2.filesSha256}:on3,...listed3?{listed:[...listed3,name6].sort()}:{}
|
|
16237
|
-
choicesPath2(botId),`${JSON.stringify(next,null,2)}
|
|
16230
|
+
delete(target4),index4[input2.name]={...input2.entry,filesSha256:digest5.sha256,importedAt:new Date().toISOString()},results.push({name:input2.name,stored:!0,leftOut:leftOut2})}catch{results.push({name:input2.name,stored:!1,leftOut:0})}}results.some(result2=>result2.stored)&&writeIndex(index4)}finally{rmSync8(staging2,{recursive:!0,force:!0})}return results}function enabledFor2(name6,entry2,choices){return choices.off.includes(name6)||!(choices.picked??[]).includes(name6)?!1:entry2.warnings.length===
|
|
16231
|
+
0||choices.on[name6]===entry2.filesSha256}var comparable2=path6=>{let resolved2=resolve12(path6).replace(/^\\\\\?\\/,"");return process.platform==="win32"?resolved2.toLowerCase():resolved2};function loadedInPlace(entry2,native){return native.some(folder3=>comparable2(folder3)===comparable2(entry2.root))?entryExistsWithoutFollowing(entry2.origin):!1}function importedSkillsFor(botId,shadowed,native=[]){let index4=readImportedSkills(),names5=Object.keys(index4).filter(name6=>!shadowed.has(name6)).sort();
|
|
16232
|
+
if(!names5.length)return[];let choices=readChoices2(botId);return names5.flatMap(name6=>{let entry2=index4[name6];if(!enabledFor2(name6,entry2,choices)||loadedInPlace(entry2,native)||!importedSkillIntact(name6,entry2))return[];let folder3=join36(IMPORTED_SKILLS_DIR,name6);return[{name:name6,description:entry2.description,folder:folder3,file:join36(folder3,"SKILL.md")}]})}var IMPORTED_CHANGED_WARNING="its files changed after it was brought in \u2014 bring it in again from Settings \u2192 Replay welcome tou\
|
|
16233
|
+
r";function importedSkillListings(botId,shadowed,about=""){let index4=readImportedSkills(),choices=readChoices2(botId),listings2=Object.keys(index4).filter(name6=>!shadowed.has(name6)).sort().map(name6=>{let entry2=index4[name6],intact=importedSkillIntact(name6,entry2),enabled=intact&&enabledFor2(name6,entry2,choices);return{name:name6,description:entry2.description,enabled,listed:!1,...enabled?{file:join36(IMPORTED_SKILLS_DIR,name6,"SKILL.md")}:{},editable:!1,source:entry2.label,sha256:entry2.sha256,
|
|
16234
|
+
importedAt:entry2.importedAt,...entry2.license?{license:entry2.license}:{},...entry2.compatibility?{compatibility:entry2.compatibility}:{},warnings:intact?entry2.warnings:[...entry2.warnings,IMPORTED_CHANGED_WARNING],skippedFiles:[],origin:"imported"}}),listed3=new Set(listedImportedSkills(botId,listings2.filter(skill=>skill.enabled),about).map(skill=>skill.name));for(let skill of listings2)skill.listed=listed3.has(skill.name);return[...listings2.filter(skill=>skill.listed),...listings2.filter(skill=>!skill.
|
|
16235
|
+
listed)]}function readImportedSkillFile(name6){let entry2=readImportedSkills()[name6];if(!entry2||!importedSkillIntact(name6,entry2))return null;let text31=readFileNoFollow(join36(IMPORTED_SKILLS_DIR,name6,"SKILL.md"))?.toString("utf8")??null;return text31!==null&&createHash11("sha256").update(text31).digest("hex")===entry2.sha256?text31:null}function setImportedSkillEnabled(botId,name6,enabled){let entry2=readImportedSkills()[name6];if(!entry2)return{error:`no skill named "${name6}" was brought\
|
|
16236
|
+
in from this computer`};if(enabled&&!importedSkillIntact(name6,entry2))return{error:`"${name6}" ${IMPORTED_CHANGED_WARNING}`};let choices=readChoices2(botId),off2=choices.off.filter(other=>other!==name6),{[name6]:_read,...on3}=choices.on,listed3=choices.listed?.filter(other=>other!==name6),picked=(choices.picked??[]).filter(other=>other!==name6),next=enabled?{off:off2,on:entry2.warnings.length?{...on3,[name6]:entry2.filesSha256}:on3,...listed3?{listed:[...listed3,name6].sort()}:{},picked:[...picked,
|
|
16237
|
+
name6].sort()}:{off:[...off2,name6].sort(),on:on3,...listed3?{listed:listed3}:{},picked};return mkdirSync19(dirname20(choicesPath2(botId)),{recursive:!0,mode:448}),writeFileAtomic(choicesPath2(botId),`${JSON.stringify(next,null,2)}
|
|
16238
16238
|
`,{mode:384}),importedSkillListings(botId,new Set).find(skill=>skill.name===name6)}function nativeSkillFolders(engine,options2){if(!engine)return[];let home2=options2.home??homedir8(),env={...options2.env??process.env,...engine.environment},absolute=value3=>value3&&isAbsolute7(value3)?value3:null;if(engine.driverKind==="claudeAgent"){if(env.OMB_CLAUDE_INHERIT_USER_CONFIG==="1")return[join36(absolute(env.CLAUDE_CONFIG_DIR)??join36(home2,".claude"),"skills")];if(!options2.claudeUserSkills)return[];
|
|
16239
16239
|
let folder3=join36(home2,".claude","skills");try{return statSync9(folder3).isDirectory()?[folder3]:[]}catch{return[]}}return engine.driverKind==="codex"?[join36(absolute(env.CODEX_HOME)??join36(home2,".codex"),"skills")]:[]}function importedSkillsPrompt(skills,unlisted=0){if(!skills.length&&!unlisted)return"";let intro=`
|
|
16240
16240
|
|
|
@@ -17381,8 +17381,8 @@ ${r.summary.trim()}`:"";return{text:`A confirmation card is now visible to the u
|
|
|
17381
17381
|
|
|
17382
17382
|
This change has not been applied yet. End this turn and wait for the user to confirm or deny the card; do not claim the ${noun} was created or changed before confirmation.`}}function recallSpeaker(hit2){return typeof hit2.peer=="string"&&hit2.peer?`@${hit2.peer} (another bot \u2014 not your user)`:typeof hit2.from=="string"&&hit2.from?hit2.from:hit2.role==="user"?"user":"you"}function recallWhen(at8,dateOnly){if(typeof at8!="number"||!Number.isFinite(at8))return"";let said2=new Date(at8);if(!Number.
|
|
17383
17383
|
isFinite(said2.getTime()))return"";let pad5=value3=>String(value3).padStart(2,"0"),day2=`${said2.getFullYear()}-${pad5(said2.getMonth()+1)}-${pad5(said2.getDate())}`;return dateOnly?day2:`${day2} ${pad5(said2.getHours())}:${pad5(said2.getMinutes())}`}async function callTool(called,input2,context3){let{name:name6,arguments:given2}=resolveAgentsCall(called,input2),args=dropBlankArguments(name6,given2),refused2=outOfBounds(name6,fullInputSchema(name6),args);if(refused2)return{text:refused2,isError:!0};
|
|
17384
|
-
let member=agentsCallMember(name6,args),{botId:
|
|
17385
|
-
stdout??""),stderr=String(body2.stderr??""),lines=[body2.timedOut?"The command was stopped: it ran past its time limit.":`exit code ${exitCode}`];return stdout&&lines.push("--- stdout ---",stdout.replace(/\s+$/,"")),stderr&&lines.push("--- stderr ---",stderr.replace(/\s+$/,"")),!stdout&&!stderr&&!body2.timedOut&&lines.push("(no output)"),{text:lines.join(`
|
|
17384
|
+
let member=agentsCallMember(name6,args),{botId:BOT_ID10,threadId:THREAD_ID5,depth:DEPTH2}=context3,{api,apiResponse}=context3.client;if(name6==="vm_exec"){let{ok:ok2,body:body2}=await apiResponse("/api/internal/vm-exec",{method:"POST",body:JSON.stringify({command:args.command,...typeof args.timeout_seconds=="number"?{timeout_seconds:args.timeout_seconds}:{}})});if(!ok2)return{text:String(body2.error??"Could not run that command."),isError:!0};let exitCode=Number(body2.exitCode??0),stdout=String(
|
|
17385
|
+
body2.stdout??""),stderr=String(body2.stderr??""),lines=[body2.timedOut?"The command was stopped: it ran past its time limit.":`exit code ${exitCode}`];return stdout&&lines.push("--- stdout ---",stdout.replace(/\s+$/,"")),stderr&&lines.push("--- stderr ---",stderr.replace(/\s+$/,"")),!stdout&&!stderr&&!body2.timedOut&&lines.push("(no output)"),{text:lines.join(`
|
|
17386
17386
|
`),...exitCode!==0||body2.timedOut?{isError:!0}:{}}}if(name6==="attach_file"){let{ok:ok2,body:body2}=await apiResponse("/api/internal/attach-file",{method:"POST",body:JSON.stringify({path:args.path,...typeof args.name=="string"?{name:args.name}:{}})});return ok2?{text:`Attached ${String(body2.name??"the file")} (${Number(body2.bytes??0)} bytes). It now appears in the chat with a preview.`}:{text:String(body2.error??"Could not attach that file."),isError:!0}}if(CARD_TOOL_NAMES.has(name6))return callCardTool(
|
|
17387
17387
|
name6,args,context3);if(RESEARCH_TOOL_NAMES.has(name6))return callResearchTool(name6,args,context3);if(HELPER_TOOL_NAMES.has(name6))return callHelperTool(name6,args,context3);if(IMAGE_TOOL_NAMES.has(name6))return callImageTool(name6,args,context3);if(MEETING_TOOL_NAMES.has(name6))return callMeetingTool(name6,args,context3);if(MAUSBOT_TOOL_NAMES.has(name6))return callMausBotTool(name6,args,context3);if(PAGE_TOOL_NAMES.has(name6))return callPageTool(name6,args,context3);if(PERSON_TOOL_NAMES.has(name6))
|
|
17388
17388
|
return callPersonTool(name6,args,context3);if(DEVS_TOOL_NAMES.has(name6))return callDevsTool(name6,args,context3);if(TRIGGER_TOOL_NAMES.has(name6))return callTriggerTool(name6,args,context3);if(WAIT_TOOL_NAMES.has(name6))return callWaitTool(name6,args,context3);if(name6===USAGE_LIMITS_TOOL)return callUsageLimitsTool(context3);if(COMPUTER_ASK_TOOL_NAMES.has(name6))return callComputerAskTool(args,context3);if(SHARED_COMPUTER_TOOL_NAMES.has(name6)&&!context3.sharedComputers)return{text:"Computer sh\
|
|
@@ -17400,11 +17400,11 @@ args.wait_ms)||0),24e4),query2=new URLSearchParams;id12&&query2.set("id",id12),w
|
|
|
17400
17400
|
it.`:String(r.error??`HTTP ${status5}`),isError:!0};if(id12)return{text:renderAssignmentStatus(r,id12)};let outstanding=Array.isArray(r.outstanding)?r.outstanding.filter(jsonRecord3):[];return outstanding.length?{text:`Outstanding assignments of this conversation (${outstanding.length}):
|
|
17401
17401
|
${outstanding.map(a=>`- ${assignmentLine(a)}`).join(`
|
|
17402
17402
|
`)}
|
|
17403
|
-
Each resumes you when it settles; do not wait on them in this turn.`}:{text:"Nothing outstanding: no assignment of this conversation is still open."}}if(name6==="list_bots"){let bots=(await api(`/api/internal/agents?self=${encodeURIComponent(
|
|
17403
|
+
Each resumes you when it settles; do not wait on them in this turn.`}:{text:"Nothing outstanding: no assignment of this conversation is still open."}}if(name6==="list_bots"){let bots=(await api(`/api/internal/agents?self=${encodeURIComponent(BOT_ID10)}`)).bots??[];return bots.length?{text:`Bots you can reach (every department; you can contact any of them):
|
|
17404
17404
|
${bots.map(b11=>{let role=b11.title?` \u2014 ${b11.title}`:"",about=b11.description?` (${String(b11.description).slice(0,120)})`:"",state=typeof b11.statusText=="string"?b11.status==="available"?"":b11.statusText:b11.busy?"busy":"",team=typeof b11.section=="string"?`, department: ${peerName(b11.section)||"General"}`:"";return`- ${b11.name}${role}${about} [id: ${b11.id}, model: ${b11.model}${team}${state?`, ${state}`:""}]`}).join(`
|
|
17405
17405
|
`)}
|
|
17406
17406
|
|
|
17407
|
-
Use coordinate_bots for concrete work or, with consult: true, for advice, then end your turn. Busy teammates queue and results resume you automatically.`}:{text:"No other bots you can reach yet."}}if(name6==="list_rooms"){let query2=new URLSearchParams({fromBotId:
|
|
17407
|
+
Use coordinate_bots for concrete work or, with consult: true, for advice, then end your turn. Busy teammates queue and results resume you automatically.`}:{text:"No other bots you can reach yet."}}if(name6==="list_rooms"){let query2=new URLSearchParams({fromBotId:BOT_ID10,fromThreadId:THREAD_ID5}),r=await api(`/api/internal/rooms?${query2.toString()}`),rooms=Array.isArray(r.rooms)?r.rooms.filter(jsonRecord3):[],unpostable=Array.isArray(r.unpostable)?r.unpostable.filter(jsonRecord3):[],blocked=unpostable.
|
|
17408
17408
|
length?`
|
|
17409
17409
|
|
|
17410
17410
|
Rooms you are in but cannot post into (no id \u2014 there is nothing to retry; give the user the reason instead):
|
|
@@ -17414,55 +17414,55 @@ ${rooms.map(room=>{let members2=Array.isArray(room.members)?room.members.map(Str
|
|
|
17414
17414
|
`)}
|
|
17415
17415
|
|
|
17416
17416
|
Use post_to_room with one of these ids. A post adds one message to the room; it does not start anyone's turn, so nobody replies to it automatically.${blocked}`}:{text:`You are not in any room you can post into. Tell the user what you wanted to share and let them decide where it goes.${blocked}`}}if(name6==="post_to_room"){let groupId=String(args.group_id??"").trim(),message8=String(args.message??"").trim(),attachVoiceNote=args.attach_voice_note===!0;if(!groupId||!message8)return{text:"post_to_ro\
|
|
17417
|
-
om needs group_id (from list_rooms) and message.",isError:!0};let r=await api("/api/internal/post-to-room",{method:"POST",body:JSON.stringify({fromBotId:
|
|
17418
|
-
|
|
17419
|
-
{fromBotId:
|
|
17417
|
+
om needs group_id (from list_rooms) and message.",isError:!0};let r=await api("/api/internal/post-to-room",{method:"POST",body:JSON.stringify({fromBotId:BOT_ID10,fromThreadId:THREAD_ID5,groupId,message:message8,attachVoiceNote,...args.mention_ids!==void 0?{mentionIds:args.mention_ids}:{}})});return r.error?{text:String(r.error),isError:!0}:{text:`Posted in ${r.roomName??"the room"}${r.attachedVoiceNote?" with the voice note attached":""}. Nobody's turn was started, so expect no reply \u2014 tell the \
|
|
17418
|
+
user it is posted.`}}if(name6==="select_computer"){if(args.surface!==void 0&&(typeof args.surface!="string"||!["auto","cloud","vm","local","browser"].includes(args.surface)))return{text:"Choose auto, cloud, vm, local or browser; omit surface to inspect connected choices.",isError:!0};let result2=await api("/api/internal/computer/select",args.surface===void 0?void 0:{method:"POST",body:JSON.stringify({surface:args.surface})});return{text:JSON.stringify(result2)}}if(name6==="list_threads"){let query2=new URLSearchParams(
|
|
17419
|
+
{fromBotId:BOT_ID10,fromThreadId:THREAD_ID5}),r=await api(`/api/internal/threads?${query2.toString()}`);if(r.error)return{text:`Couldn't list threads: ${String(r.error)}`,isError:!0};let threads2=Array.isArray(r.threads)?r.threads.filter(jsonRecord3):[];if(!threads2.length)return{text:"No threads yet: you have none of your own beyond this one, and you have not opened any on a teammate."};let stateWord={running:"running","waiting-on-you":"waiting on the person",queued:"queued",idle:"idle"};return{
|
|
17420
17420
|
text:`Threads, newest first:
|
|
17421
17421
|
${threads2.map(thread=>{let where2=thread.own===!0?"yours":`on @${String(thread.botName)}${typeof thread.openedBy=="string"&&thread.openedBy?`, opened by @${thread.openedBy}`:""}`,state=stateWord[String(thread.state)]??String(thread.state),unread=thread.unread===!0?", unread for the person":"",handoff2=typeof thread.delegationId=="string"&&thread.delegationId?` [delegation id: ${thread.delegationId}]`:"",waiting2=typeof thread.waiting=="string"&&thread.waiting?`: ${thread.waiting}`:"";return`- #${String(
|
|
17422
17422
|
thread.title)} (${where2}, ${state}${waiting2}${unread}) [thread id: ${String(thread.threadId)}]${handoff2}`}).join(`
|
|
17423
|
-
`)}`}}if(name6==="close_thread"){let threadId=String(args.thread_id??"").trim();if(!threadId)return{text:"close_thread needs the thread_id from list_threads or start_thread.",isError:!0};let r=await api(`/api/internal/threads/${encodeURIComponent(threadId)}/close`,{method:"POST",body:JSON.stringify({fromBotId:
|
|
17424
|
-
""}. It stays in the person's sidebar, idle, with a note that you closed it.`}}if(name6==="start_thread"){let title3=String(args.title??"").trim(),message8=String(args.message??"").trim();if(!title3||!message8)return{text:"start_thread needs title (one short line) and message (the complete first message).",isError:!0};let toBotId=typeof args.bot_id=="string"?args.bot_id.trim():"",folder3=typeof args.folder=="string"?args.folder.trim():"",body2={fromBotId:
|
|
17423
|
+
`)}`}}if(name6==="close_thread"){let threadId=String(args.thread_id??"").trim();if(!threadId)return{text:"close_thread needs the thread_id from list_threads or start_thread.",isError:!0};let r=await api(`/api/internal/threads/${encodeURIComponent(threadId)}/close`,{method:"POST",body:JSON.stringify({fromBotId:BOT_ID10,fromThreadId:THREAD_ID5})});return r.error?{text:`Couldn't close that thread: ${String(r.error)}`,isError:!0}:{text:`Closed #${String(r.title)}${r.botName?` on @${String(r.botName)}`:
|
|
17424
|
+
""}. It stays in the person's sidebar, idle, with a note that you closed it.`}}if(name6==="start_thread"){let title3=String(args.title??"").trim(),message8=String(args.message??"").trim();if(!title3||!message8)return{text:"start_thread needs title (one short line) and message (the complete first message).",isError:!0};let toBotId=typeof args.bot_id=="string"?args.bot_id.trim():"",folder3=typeof args.folder=="string"?args.folder.trim():"",body2={fromBotId:BOT_ID10,fromThreadId:THREAD_ID5,title:title3,
|
|
17425
17425
|
message:message8,depth:DEPTH2};if(toBotId&&(body2.toBotId=toBotId),folder3&&(body2.folder=folder3),args.model_selection!==void 0){let fields2=jsonRecord3(args.model_selection)?args.model_selection:null;if(!fields2||typeof fields2.instanceId!="string"||!fields2.instanceId.trim()||typeof fields2.model!="string"||!fields2.model.trim()||fields2.effort!==void 0&&(typeof fields2.effort!="string"||!fields2.effort.trim()))return{text:"start_thread model_selection needs instanceId and model, as list_mode\
|
|
17426
17426
|
ls gives them, and effort only from that engine's efforts.",isError:!0};body2.modelSelection={instanceId:fields2.instanceId.trim(),model:fields2.model.trim(),...typeof fields2.effort=="string"?{effort:fields2.effort.trim()}:{}}}args.report_back===!0&&(body2.reportBack=!0);let r=await api("/api/internal/threads",{method:"POST",body:JSON.stringify(body2)});if(r.error&&r.state!=="failed")return{text:`Couldn't open that thread: ${String(r.error)}`,isError:!0};if(r.reportBack===!0)return{text:`Opened\
|
|
17427
|
-
thread #${String(r.title??title3)} on yourself [thread id: ${String(r.threadId??"")}]. It starts when this turn ends, and its result comes back to this conversation and resumes you automatically (assignment id: ${String(r.requestId??"unknown")}). Mention it to the person as #${String(r.title??title3)} and finish your turn; do not check or wait for it in this turn. To steer it or send it a follow-up, while it runs or after, use coordinate_bots with bot_ids ["${
|
|
17428
|
-
"")}".`};let receipt=r.self!==!0&&Array.isArray(r.receipts)&&jsonRecord3(r.receipts[0])?r.receipts[0]:void 0,threadTitle=String(r.title??receipt?.title??title3),threadId=String(r.threadId??receipt?.threadId??""),where2=r.self===!0?"on yourself":`on @${String(r.botName??receipt?.botName??"that bot")}`,opened=`Opened thread #${threadTitle} ${where2} [thread id: ${threadId}].`;if(r.self===!0){if(r.state==="running")return{text:`${opened} It is running now, in parallel with this
|
|
17429
|
-
|
|
17430
|
-
text:`${opened} It could not start: ${String(r.error??"unknown reason")}. The thread exists but nothing is running in it; tell the person.`,isError:!0}}let assignmentId=handoffIds(r)[0]??"",approval=r.approvalRequired===!0?" The person must approve this handoff first; their card appears after your turn ends.":"",timing=r.state==="queued"?` @${String(r.botName??"that bot")} can run ${Number(r.limit)||0} threads at once and they are all spoken for, so it waits ${ordinal(Number(r.position)||
|
|
17431
|
-
line for a free slot after this turn ends.`:" It starts when this turn ends, like any handoff.";return{text:`${opened}${timing}${approval} Its result will be delivered to this conversation automatically (assignment id: ${assignmentId||"unknown"}). Acknowledge it, mention it to the person as #${threadTitle}, and finish your turn; do not check or wait for it in this turn.`}}if(name6==="burst")return callBurstTool(args,api);if(name6==="list_models"){let search3=typeof args.search=="string"?args.
|
|
17432
|
-
trim():"",r=await api(`/api/internal/models${search3?`?search=${encodeURIComponent(search3)}`:""}`);return r.error?{text:`Couldn't list models: ${String(r.error)}`,isError:!0}:{text:JSON.stringify(r)}}if(name6==="list_team_setup")return{text:JSON.stringify(await api("/api/internal/team-setup-catalog"))};if(name6==="list_team_library")return{text:JSON.stringify(await api("/api/internal/team-library"))};if(name6==="propose_team_setup"||name6==="propose_bot_deletion"){let deleting=name6==="
|
|
17433
|
-
|
|
17434
|
-
|
|
17427
|
+
thread #${String(r.title??title3)} on yourself [thread id: ${String(r.threadId??"")}]. It starts when this turn ends, and its result comes back to this conversation and resumes you automatically (assignment id: ${String(r.requestId??"unknown")}). Mention it to the person as #${String(r.title??title3)} and finish your turn; do not check or wait for it in this turn. To steer it or send it a follow-up, while it runs or after, use coordinate_bots with bot_ids ["${BOT_ID10}"] and thread "${String(r.
|
|
17428
|
+
threadId??"")}".`};let receipt=r.self!==!0&&Array.isArray(r.receipts)&&jsonRecord3(r.receipts[0])?r.receipts[0]:void 0,threadTitle=String(r.title??receipt?.title??title3),threadId=String(r.threadId??receipt?.threadId??""),where2=r.self===!0?"on yourself":`on @${String(r.botName??receipt?.botName??"that bot")}`,opened=`Opened thread #${threadTitle} ${where2} [thread id: ${threadId}].`;if(r.self===!0){if(r.state==="running")return{text:`${opened} It is running now, in parallel with this conversati\
|
|
17429
|
+
on, and its result stays in that thread \u2014 it will not be delivered here. Mention it to the person as #${threadTitle}; use list_threads in a later turn to see how it is going.`};if(r.state==="queued"){let position3=Number(r.position)||1,limit2=Number(r.limit)||0;return{text:`${opened} You are at your limit of ${limit2} threads running at once, so it is ${ordinal(position3)} in line and starts as soon as one of them finishes \u2014 nothing more to do. Mention it to the person as #${threadTitle}\
|
|
17430
|
+
.`}}return{text:`${opened} It could not start: ${String(r.error??"unknown reason")}. The thread exists but nothing is running in it; tell the person.`,isError:!0}}let assignmentId=handoffIds(r)[0]??"",approval=r.approvalRequired===!0?" The person must approve this handoff first; their card appears after your turn ends.":"",timing=r.state==="queued"?` @${String(r.botName??"that bot")} can run ${Number(r.limit)||0} threads at once and they are all spoken for, so it waits ${ordinal(Number(r.position)||
|
|
17431
|
+
1)} in line for a free slot after this turn ends.`:" It starts when this turn ends, like any handoff.";return{text:`${opened}${timing}${approval} Its result will be delivered to this conversation automatically (assignment id: ${assignmentId||"unknown"}). Acknowledge it, mention it to the person as #${threadTitle}, and finish your turn; do not check or wait for it in this turn.`}}if(name6==="burst")return callBurstTool(args,api);if(name6==="list_models"){let search3=typeof args.search=="string"?args.
|
|
17432
|
+
search.trim():"",r=await api(`/api/internal/models${search3?`?search=${encodeURIComponent(search3)}`:""}`);return r.error?{text:`Couldn't list models: ${String(r.error)}`,isError:!0}:{text:JSON.stringify(r)}}if(name6==="list_team_setup")return{text:JSON.stringify(await api("/api/internal/team-setup-catalog"))};if(name6==="list_team_library")return{text:JSON.stringify(await api("/api/internal/team-library"))};if(name6==="propose_team_setup"||name6==="propose_bot_deletion"){let deleting=name6==="p\
|
|
17433
|
+
ropose_bot_deletion",result2=await api(deleting?"/api/internal/bot-deletion-requests":"/api/internal/team-setup-requests",{method:"POST",body:JSON.stringify({fromBotId:BOT_ID10,fromThreadId:THREAD_ID5,...deleting?{targetBotId:args.bot_id,reason:args.reason}:{plan:args}})}),completed=completedProposalResult(result2,deleting?"the requested bot deletion":"the requested team setup");return completed||{text:`One review card is visible: ${String(result2.title)}. Nothing has been applied. End this turn\
|
|
17434
|
+
; the decision and structured result resume you automatically once. Do not ask again, poll, or repeat this proposal.`}}if(name6==="create_bot"){let botName=String(args.name??"").trim(),role=String(args.role??"").trim(),instructions=String(args.instructions??"").trim();if(!botName||!role||!instructions)return{text:"create_bot needs name, role, and instructions.",isError:!0};let r=await api("/api/internal/create-bot",{method:"POST",body:JSON.stringify({fromBotId:BOT_ID10,fromThreadId:THREAD_ID5,name:botName,
|
|
17435
17435
|
role,instructions,...args.modelSelection!==void 0?{modelSelection:args.modelSelection}:{},...typeof args.cwd=="string"?{cwd:args.cwd.trim()}:{}})});return r.state==="pending"?{text:`One review card is visible: ${String(r.title)}. @${botName} has not been created yet. End this turn; the decision and structured result resume you automatically once. Do not ask again, poll, or repeat this request.`}:r.id?{text:`Created @${r.name??botName} in ${r.section??"General"} [id: ${r.id}].${r.modelSelection?`\
|
|
17436
17436
|
Model: ${JSON.stringify(r.modelSelection)}.`:""} Assign work with coordinate_bots.`}:completedProposalResult(r,`creating @${botName}`)??{text:`@${botName} was not created.`,isError:!0}}if(member==="create_room"){if(args.section!==void 0)return{text:"A room you create stays in your own department; ask the user to move it.",isError:!0};let roomName=String(args.name??"").trim(),memberIds=Array.isArray(args.member_bot_ids)?args.member_bot_ids.map(id12=>String(id12).trim()).filter(Boolean):[],bulletin=typeof args.
|
|
17437
|
-
bulletin=="string"?args.bulletin.trim():void 0;if(!roomName)return{text:"manage_room action=create needs a room name.",isError:!0};if(!memberIds.length)return{text:"manage_room action=create needs at least one bot ID in member_bot_ids.",isError:!0};let r=await api("/api/internal/create-room",{method:"POST",body:JSON.stringify({fromBotId:
|
|
17437
|
+
bulletin=="string"?args.bulletin.trim():void 0;if(!roomName)return{text:"manage_room action=create needs a room name.",isError:!0};if(!memberIds.length)return{text:"manage_room action=create needs at least one bot ID in member_bot_ids.",isError:!0};let r=await api("/api/internal/create-room",{method:"POST",body:JSON.stringify({fromBotId:BOT_ID10,fromThreadId:THREAD_ID5,name:roomName,memberIds,bulletin})});return r.error?{text:`Couldn't create room: ${r.error}`,isError:!0}:{text:`Created room \u201C${r.
|
|
17438
17438
|
name??roomName}\u201D in section \u201C${r.section??"General"}\u201D [id: ${r.id}] with ${r.memberCount??memberIds.length} members.`}}if(member==="manage_room"){if(args.section!==void 0||args.action==="set_section")return{text:"Moving rooms between sections is user-only.",isError:!0};let roomId=String(args.room_id??"").trim(),action3=String(args.action??"").trim();if(!roomId||!action3)return{text:"manage_room needs action and, for any action but create, the room_id from list_rooms.",isError:!0};
|
|
17439
|
-
let memberIds=Array.isArray(args.member_bot_ids)?args.member_bot_ids.map(id12=>String(id12).trim()).filter(Boolean):void 0,roomName=typeof args.name=="string"?args.name.trim():void 0,bulletin=typeof args.bulletin=="string"?args.bulletin.trim():void 0,r=await api("/api/internal/manage-room",{method:"POST",body:JSON.stringify({fromBotId:
|
|
17439
|
+
let memberIds=Array.isArray(args.member_bot_ids)?args.member_bot_ids.map(id12=>String(id12).trim()).filter(Boolean):void 0,roomName=typeof args.name=="string"?args.name.trim():void 0,bulletin=typeof args.bulletin=="string"?args.bulletin.trim():void 0,r=await api("/api/internal/manage-room",{method:"POST",body:JSON.stringify({fromBotId:BOT_ID10,fromThreadId:THREAD_ID5,roomId,action:action3,memberIds,name:roomName,bulletin})});return r.error?{text:`Couldn't manage room: ${r.error}`,isError:!0}:{text:typeof r.
|
|
17440
17440
|
message=="string"?r.message:`Updated room ${roomId}.`}}if(name6==="request_credential"){let credentialId=args.credential_id;if(credentialId===void 0||credentialId==="")return requestCustomSecret(args,context3);if(credentialId===EMAIL_CREDENTIAL)return requestEmailCard(args,context3);if(!isCredentialTargetId(credentialId))return{text:"request_credential needs a supported credential_id.",isError:!0};let reason3=typeof args.reason=="string"?args.reason.trim().slice(0,240):"",r=await api("/api/inter\
|
|
17441
|
-
nal/request-credential",{method:"POST",body:JSON.stringify({fromBotId:
|
|
17442
|
-
|
|
17443
|
-
|
|
17441
|
+
nal/request-credential",{method:"POST",body:JSON.stringify({fromBotId:BOT_ID10,fromThreadId:THREAD_ID5,credentialId,...reason3?{reason:reason3}:{}})});return r.alreadyConfigured?{text:`${r.label??CREDENTIAL_TARGETS[credentialId].label} is already configured. Continue the task.`}:credentialId==="onePasswordToken"?{text:`A secure ${r.label??CREDENTIAL_TARGETS[credentialId].label} request is ready: the person pastes it into its card in Limix Bot, on their computer or in My Cloud, and Limix Bot chec\
|
|
17442
|
+
ks it with 1Password before keeping it. End this turn; Limix Bot will resume the task after they save or decline. Never ask them to paste the token into chat, and never pass it to a command line.`}:{text:`A secure ${r.label??CREDENTIAL_TARGETS[credentialId].label} request is now in this conversation, and the person was notified. The desktop app and a freshly QR-paired mobile app show its secure entry card; older mobile pairings explain how to pair again or finish on the computer. End this turn; \
|
|
17443
|
+
Limix Bot will resume the task after the user saves or declines. Never ask them to paste the key into chat.`}}if(name6==="request_sign_in"){let site=typeof args.site=="string"?args.site.trim():"";if(!site)return{text:"request_sign_in needs site: the page's address or its domain, such as example.com.",isError:!0};let reason3=typeof args.reason=="string"?args.reason.trim().slice(0,240):"",r=await api("/api/internal/request-sign-in",{method:"POST",body:JSON.stringify({fromBotId:BOT_ID10,fromThreadId:THREAD_ID5,
|
|
17444
17444
|
site,...reason3?{reason:reason3}:{}})});return{text:`The person was asked to sign in to ${r.site??site} on ${SIGN_IN_PLACES[String(r.place)]??"the place you work"}. Your turn ends now: say in one short line that you are waiting for them, then stop. Limix Bot resumes you when they finish or decline. Never ask for the password or a code in chat.`}}if(name6==="fill_login"){let username=typeof args.username=="string"?args.username.trim().slice(0,512):"",email3=typeof args.email=="string"?args.email.
|
|
17445
|
-
trim().slice(0,320):"",r=await api("/api/internal/fill-login",{method:"POST",body:JSON.stringify({fromBotId:
|
|
17446
|
-
|
|
17447
|
-
Tell the person the note did not go through; do not say it is attached.",isError:!0}:{text:"Voice note recorded. It will be attached to this turn's reply when the turn ends; the note text is also the visible caption."}}catch(error66){return{text:`Voice note not sent: ${error66 instanceof Error?error66.message:String(error66)}`,isError:!0}}}if(name6==="propose_profile"){if(args.notifications!==void 0&&typeof args.notifications!="boolean"||args.speakReplies!==void 0&&typeof args.speakReplies!="
|
|
17448
|
-
|
|
17449
|
-
notifications),typeof args.speakReplies=="boolean"&&(changes.speakReplies=args.speakReplies),!Object.keys(changes).length)return{text:"propose_profile needs at least one of name, title, description, soul, cwd, notifications, or speakReplies.",isError:!0};let forBotId=String(args.for_bot_id??"").trim(),r=await api("/api/internal/profile-requests",{method:"POST",body:JSON.stringify({fromBotId:
|
|
17445
|
+
trim().slice(0,320):"",r=await api("/api/internal/fill-login",{method:"POST",body:JSON.stringify({fromBotId:BOT_ID10,fromThreadId:THREAD_ID5,...username?{username}:{},...email3?{email:email3}:{},...args.submit===!1?{submit:!1}:{}})});return{text:typeof r.text=="string"&&r.text?r.text:"fill_login did not answer. Call request_sign_in instead.",...r.ok===!0?{}:{isError:!0}}}if(name6==="send_voice_note"){if(typeof args.text!="string"||!args.text.trim())return{text:"send_voice_note needs text: the sh\
|
|
17446
|
+
ort speakable note, at most 1000 characters.",isError:!0};let text31=args.text.trim();if(text31.length>1e3)return{text:`send_voice_note is limited to 1000 characters; this one is ${text31.length}. Shorten the note.`,isError:!0};try{let r=await api("/api/internal/voice-note",{method:"POST",body:JSON.stringify({fromBotId:BOT_ID10,fromThreadId:THREAD_ID5,text:text31})});return r.attached!==!0||typeof r.file!="string"||!r.file?{text:"Voice note not sent: Limix Bot did not confirm the audio was saved\
|
|
17447
|
+
. Tell the person the note did not go through; do not say it is attached.",isError:!0}:{text:"Voice note recorded. It will be attached to this turn's reply when the turn ends; the note text is also the visible caption."}}catch(error66){return{text:`Voice note not sent: ${error66 instanceof Error?error66.message:String(error66)}`,isError:!0}}}if(name6==="propose_profile"){if(args.notifications!==void 0&&typeof args.notifications!="boolean"||args.speakReplies!==void 0&&typeof args.speakReplies!="b\
|
|
17448
|
+
oolean")return{text:"propose_profile notifications and speakReplies must be true or false.",isError:!0};let changes={};if(typeof args.name=="string"&&(changes.name=args.name.trim()),typeof args.title=="string"&&(changes.title=args.title.trim()),typeof args.description=="string"&&(changes.description=args.description.trim()),typeof args.soul=="string"&&(changes.soul=args.soul),typeof args.cwd=="string"&&(changes.cwd=args.cwd.trim()),typeof args.notifications=="boolean"&&(changes.notifications=args.
|
|
17449
|
+
notifications),typeof args.speakReplies=="boolean"&&(changes.speakReplies=args.speakReplies),!Object.keys(changes).length)return{text:"propose_profile needs at least one of name, title, description, soul, cwd, notifications, or speakReplies.",isError:!0};let forBotId=String(args.for_bot_id??"").trim(),r=await api("/api/internal/profile-requests",{method:"POST",body:JSON.stringify({fromBotId:BOT_ID10,fromThreadId:THREAD_ID5,changes,reason:args.reason,forBotId:forBotId||void 0})});return confirmationResult(
|
|
17450
17450
|
r,"the profile change","profile")}if(name6==="propose_model"){let raw=args.model_selection,fields2=typeof raw=="object"&&raw!==null&&!Array.isArray(raw)?raw:null;if(!fields2||typeof fields2.instanceId!="string"||!fields2.instanceId.trim()||typeof fields2.model!="string"||!fields2.model.trim())return{text:"propose_model needs model_selection with instanceId and model.",isError:!0};if(fields2.effort!==void 0&&(typeof fields2.effort!="string"||!fields2.effort.trim())||fields2.variant!==void 0&&(typeof fields2.
|
|
17451
17451
|
variant!="string"||!fields2.variant.trim()))return{text:"propose_model effort and variant must be non-empty strings when supplied.",isError:!0};let selection3={instanceId:fields2.instanceId.trim(),model:fields2.model.trim()};typeof fields2.effort=="string"&&fields2.effort.trim()&&(selection3.effort=fields2.effort.trim()),typeof fields2.variant=="string"&&fields2.variant.trim()&&(selection3.variant=fields2.variant.trim());let forBotId=String(args.for_bot_id??"").trim(),r=await api("/api/internal/\
|
|
17452
|
-
model-requests",{method:"POST",body:JSON.stringify({fromBotId:
|
|
17453
|
-
|
|
17452
|
+
model-requests",{method:"POST",body:JSON.stringify({fromBotId:BOT_ID10,fromThreadId:THREAD_ID5,modelSelection:selection3,reason:args.reason,forBotId:forBotId||void 0})});return confirmationResult(r,"the default model change","model")}if(member==="memory_update"){let passageOnly=args.action==="remove"||args.action==="forget";if(!["append","replace","remove","supersede","forget","prefer"].includes(String(args.action))||!passageOnly&&(typeof args.text!="string"||!args.text.trim())||args.action!=="a\
|
|
17453
|
+
ppend"&&args.action!=="prefer"&&(typeof args.old_text!="string"||!args.old_text.trim()))return{text:"Use memory_update action=append with text, replace or supersede with text and old_text, remove with old_text, forget with old_text naming what to forget, or prefer with text: one standing preference of the person.",isError:!0};let{body:r}=await apiResponse("/api/internal/memory",{method:"POST",body:JSON.stringify({fromBotId:BOT_ID10,fromThreadId:THREAD_ID5,action:args.action,text:args.text,oldText:args.
|
|
17454
17454
|
old_text,...typeof args.until=="string"&&args.until.trim()?{until:args.until.trim()}:{}})});if(r.error||r.ok!==!0)return{text:String(r.error??"Memory update was not confirmed."),isError:!0};if(args.action==="forget")return{text:forgetText(String(args.old_text),r)};if(args.action==="prefer")return{text:preferText(r)};let entry2=typeof r.entry=="string"&&r.entry?` Entry: ${r.entry}`:"",moved=Array.isArray(r.moved)?r.moved.filter(line6=>typeof line6=="string"):[],full=r.truncated?`
|
|
17455
17455
|
Saved, but the lines that never move out of MEMORY.md (hand-written ones, health and safety facts) fill what loads each session, so the newest entries do not load. Tell the person their saved notes are full, and that they can remove ones they no longer need under What it remembers in your panel.`:"",shown3=moved.slice(0,MOVED_ENTRIES_SHOWN).map(text31=>text31.split(`
|
|
17456
17456
|
`)[0]),more=moved.length>shown3.length?`
|
|
17457
17457
|
\u2026and ${moved.length-shown3.length} more`:"",movedNote=moved.length?`
|
|
17458
17458
|
To stay within what loads each session, moved ${moved.length===1?"1 older entry":`${moved.length} older entries`} to your archive (session_search finds them):
|
|
17459
17459
|
${shown3.join(`
|
|
17460
|
-
`)}${more}`:"";return{text:`Memory updated.${entry2}${full}${movedNote}`}}if(name6==="retry_thread"){let botId=String(args.bot_id??"").trim(),threadId=String(args.thread_id??"").trim(),note2=typeof args.note=="string"?args.note.trim():"";if(!botId||!threadId)return{text:"retry_thread needs bot_id and thread_id \u2014 both are in the incident report.",isError:!0};let r=await api("/api/internal/retry-thread",{method:"POST",body:JSON.stringify({fromBotId:
|
|
17460
|
+
`)}${more}`:"";return{text:`Memory updated.${entry2}${full}${movedNote}`}}if(name6==="retry_thread"){let botId=String(args.bot_id??"").trim(),threadId=String(args.thread_id??"").trim(),note2=typeof args.note=="string"?args.note.trim():"";if(!botId||!threadId)return{text:"retry_thread needs bot_id and thread_id \u2014 both are in the incident report.",isError:!0};let r=await api("/api/internal/retry-thread",{method:"POST",body:JSON.stringify({fromBotId:BOT_ID10,fromThreadId:THREAD_ID5,toBotId:botId,
|
|
17461
17461
|
toThreadId:threadId,...note2?{note:note2}:{}})});return r.error?{text:`Couldn't retry that thread: ${String(r.error)}`,isError:!0}:{text:typeof r.message=="string"?r.message:"The thread is running again. Its result stays in that thread; you are not woken for it \u2014 check it later with session_search or list_threads if you need to."}}if(member==="memory_log"){if(typeof args.text!="string"||!args.text.trim())return{text:"memory_log needs text: one line about what happened.",isError:!0};let r=await api(
|
|
17462
|
-
"/api/internal/memory/log",{method:"POST",body:JSON.stringify({fromBotId:
|
|
17463
|
-
name, and detail.",isError:!0};let r=await api("/api/internal/team-memory",{method:"POST",body:JSON.stringify({fromBotId:
|
|
17464
|
-
"string"?args.since.trim():"",until=typeof args.until=="string"?args.until.trim():"";if(!q2&&!since)return{text:'session_search needs a query (a few content words) or a since span, for example {"query":"site audit broken links"} or {"since":"2d"}.',isError:!0};let query2=new URLSearchParams({fromBotId:
|
|
17465
|
-
|
|
17462
|
+
"/api/internal/memory/log",{method:"POST",body:JSON.stringify({fromBotId:BOT_ID10,fromThreadId:THREAD_ID5,text:args.text})});return r.error||r.ok!==!0?{text:String(r.error??"The log line was not confirmed."),isError:!0}:{text:`Logged to ${String(r.file)}: ${String(r.line)}`}}if(name6==="propose_team_memory"){let kind2=String(args.kind??"").trim(),entryName=String(args.name??"").trim(),detail=String(args.detail??"").trim();if(!kind2||!entryName||!detail)return{text:"propose_team_memory needs kind\
|
|
17463
|
+
, name, and detail.",isError:!0};let r=await api("/api/internal/team-memory",{method:"POST",body:JSON.stringify({fromBotId:BOT_ID10,fromThreadId:THREAD_ID5,kind:kind2,key:typeof args.key=="string"?args.key:void 0,name:entryName,detail,aliases:Array.isArray(args.aliases)?args.aliases.filter(alias=>typeof alias=="string"):void 0})});return confirmationResult(r,`the team memory entry for ${entryName}`,"entry")}if(member==="session_search"){let q2=String(args.query??"").trim(),since=typeof args.since==
|
|
17464
|
+
"string"?args.since.trim():"",until=typeof args.until=="string"?args.until.trim():"";if(!q2&&!since)return{text:'session_search needs a query (a few content words) or a since span, for example {"query":"site audit broken links"} or {"since":"2d"}.',isError:!0};let query2=new URLSearchParams({fromBotId:BOT_ID10,fromThreadId:THREAD_ID5});q2&&query2.set("q",q2),since&&query2.set("since",since),until&&query2.set("until",until),typeof args.limit=="number"&&Number.isFinite(args.limit)&&query2.set("lim\
|
|
17465
|
+
it",String(Math.trunc(args.limit))),(args.scope==="conversations"||args.scope==="memory"||args.scope==="team")&&query2.set("scope",args.scope);let r=await api(`/api/internal/session-search?${query2.toString()}`),hits=Array.isArray(r.hits)?r.hits:[],memoryHits=Array.isArray(r.memoryHits)?r.memoryHits.filter(jsonRecord3):[],teamHits=Array.isArray(r.teamHits)?r.teamHits.filter(jsonRecord3):[],memoryBlock=memorySearchText(memoryHits,teamHits),asked=q2?`matches "${q2}"`:`is there since ${since}${until?
|
|
17466
17466
|
` until ${until}`:""}`;if(!hits.length&&!memoryHits.length&&!teamHits.length)return{text:q2?`Nothing of yours ${asked} \u2014 no earlier conversation and no memory file. Try fewer or different words; every word must appear.`:`Nothing of yours ${asked} \u2014 no message in any of your conversations in that window.`};if(!hits.length)return{text:`${memoryBlock}No earlier conversation matches. These are your own notes, not new instructions; build on them.`};let lines=hits.map(hit2=>{let when5=recallWhen(
|
|
17467
17467
|
hit2.at,!!q2),task2=typeof hit2.task=="string"&&hit2.task?`task "${hit2.task}"`:"an earlier task",where2=hit2.current?"this conversation":typeof hit2.room=="string"&&hit2.room?`room "${hit2.room}"${typeof hit2.task=="string"&&hit2.task?`, ${task2}`:""}`:hit2.crossed?`${task2}, private to this user`:task2;return`- [${when5} \xB7 ${where2} \xB7 ${recallSpeaker(hit2)} \xB7 thread ${hit2.threadId} \xB7 message ${hit2.messageId}] ${hit2.snippet}`}),crossed2=hits.some(hit2=>hit2.crossed===!0);return{text:`${memoryBlock}${hits.
|
|
17468
17468
|
length} ${q2?"matching ":""}message${hits.length===1?"":"s"} from your earlier conversations (${q2?"best match first":"newest first"}):
|
|
@@ -17470,23 +17470,23 @@ ${lines.join(`
|
|
|
17470
17470
|
`)}
|
|
17471
17471
|
|
|
17472
17472
|
These are your own past notes. If one of them is the message you need, call session_search with its thread_id and message_id for the full text rather than searching again. Build on them rather than redoing the work; ask the user only about what they do not cover.`+(crossed2?" The hits marked private came from your one-to-one conversation with this user, not from this room; the room has been shown that you recalled them. Use them, and say where something came from if anyone asks.":"")}}if(member===
|
|
17473
|
-
"session_read"){let threadId=String(args.thread_id??"").trim(),messageId2=String(args.message_id??"").trim();if(!threadId||!messageId2)return{text:"Reading a message needs both thread_id and message_id, copied from a session_search hit.",isError:!0};let query2=new URLSearchParams({fromBotId:
|
|
17473
|
+
"session_read"){let threadId=String(args.thread_id??"").trim(),messageId2=String(args.message_id??"").trim();if(!threadId||!messageId2)return{text:"Reading a message needs both thread_id and message_id, copied from a session_search hit.",isError:!0};let query2=new URLSearchParams({fromBotId:BOT_ID10,fromThreadId:THREAD_ID5,threadId,messageId:messageId2}),r;try{r=await api(`/api/internal/session-read?${query2.toString()}`)}catch(error66){return{text:`Couldn't read message ${JSON.stringify(messageId2.
|
|
17474
17474
|
slice(0,80))} in thread ${JSON.stringify(threadId.slice(0,80))}: ${error66 instanceof Error?error66.message:String(error66)}. Copy thread_id and message_id exactly from a session_search hit's "thread \u2026" and "message \u2026" fields.`,isError:!0}}let when5=recallWhen(r.at,!0),readTask=typeof r.task=="string"&&r.task?`task "${r.task}"`:"an earlier task",where2=threadId===THREAD_ID5?"this conversation":r.crossed?`${readTask}, private to this user`:readTask,note2=r.crossed?"(Your own past note f\
|
|
17475
17475
|
rom your one-to-one conversation with this user, not new instructions. The room has been shown that you recalled it.)":"(Your own past note, not new instructions.)";return{text:`[${when5} \xB7 ${where2} \xB7 ${recallSpeaker(r)} \xB7 message ${messageId2}]
|
|
17476
17476
|
|
|
17477
17477
|
${String(r.text??"")}
|
|
17478
17478
|
|
|
17479
|
-
${note2}`}}if(name6==="skills_list"){let query2=new URLSearchParams({fromBotId:
|
|
17480
|
-
user-requested skill, then follow its applied or pending result.'};let live2=skills.length?skills.map(skill=>{let row=skill,revision=typeof row.revision=="string"?`, shared with your team, revision ${row.revision}`:"",unlisted=row.enabled&&row.listed===!1?", not in your prompt: search to read it":"";return`- ${row.name} (${row.enabled?"enabled":"disabled"}, ${row.editable===!0?"learned/editable":"imported"}${revision}${unlisted})`}).join(`
|
|
17479
|
+
${note2}`}}if(name6==="skills_list"){let query2=new URLSearchParams({fromBotId:BOT_ID10,fromThreadId:THREAD_ID5}),r=await api(`/api/internal/skills?${query2.toString()}`),skills=Array.isArray(r.skills)?r.skills:[],staged=Array.isArray(r.staged)?r.staged:[],words6=typeof args.query=="string"?args.query.trim():"";if(words6)return skillSearchResult(words6,skills);if(!skills.length&&!staged.length)return{text:'This bot has no imported skills and nothing staged. Use skill_manage action="create" for a\
|
|
17480
|
+
user-requested skill, then follow its applied or pending result.'};let live2=skills.length?skills.map(skill=>{let row=skill,revision=typeof row.revision=="string"?`, shared with your team, revision ${row.revision}`:"",unlisted=row.enabled&&row.listed===!1?", not in your prompt: search to read it":"";return`- ${row.name} (${row.enabled?"enabled":"disabled"}, ${row.editable===!0?"learned/editable":"imported"}${revision}${unlisted})`}).join(`
|
|
17481
17481
|
`):"(none)",pending3=staged.length?staged.map(entry2=>{let row=entry2;return`- ${row.action} ${row.name}`}).join(`
|
|
17482
17482
|
`):"(none)";return{text:`Imported skills:
|
|
17483
17483
|
${live2}
|
|
17484
17484
|
|
|
17485
17485
|
Staged (waiting for the user's decision):
|
|
17486
|
-
${pending3}`}}if(name6==="skill_manage"){if(isSkillSwitchAction(args.action)){let skillName3=typeof args.skill_name=="string"?args.skill_name.trim():"",verb=skillSwitchVerb(args.action);if(!skillName3)return{text:`skill_manage needs skill_name to ${verb} a skill. Copy the exact name from skills_list.`,isError:!0};let r2=await api("/api/internal/skills/stage",{method:"POST",body:JSON.stringify({fromBotId:
|
|
17486
|
+
${pending3}`}}if(name6==="skill_manage"){if(isSkillSwitchAction(args.action)){let skillName3=typeof args.skill_name=="string"?args.skill_name.trim():"",verb=skillSwitchVerb(args.action);if(!skillName3)return{text:`skill_manage needs skill_name to ${verb} a skill. Copy the exact name from skills_list.`,isError:!0};let r2=await api("/api/internal/skills/stage",{method:"POST",body:JSON.stringify({fromBotId:BOT_ID10,fromThreadId:THREAD_ID5,action:args.action,skill_name:skillName3})}),completed2=completedProposalResult(
|
|
17487
17487
|
r2,`a request to ${verb} skill \u201C${skillName3}\u201D`);return completed2||{text:`A confirmation card is now visible to the user to ${verb} skill \u201C${skillName3}\u201D. Nothing changes until they approve it. End this turn and wait for the decision.`}}if(args.action!=="create"&&args.action!=="update")return{text:'skill_manage action must be "create", "update", "enable", "disable" or "delete".',isError:!0};let skillMd=typeof args.skill_md=="string"?args.skill_md:"";if(!skillMd.trim())return{
|
|
17488
17488
|
text:"skill_manage needs skill_md: the full SKILL.md including YAML frontmatter.",isError:!0};let source4=typeof args.source=="string"?args.source.trim():"";if(!source4)return{text:'skill_manage needs source: the URL, folder, or "conversation" used to author the skill.',isError:!0};let skillName2=typeof args.skill_name=="string"?args.skill_name.trim():"";if(args.action==="update"&&!skillName2)return{text:"skill_manage needs skill_name for an update. Copy the exact name from skills_list.",isError:!0};
|
|
17489
|
-
let r=await api("/api/internal/skills/stage",{method:"POST",body:JSON.stringify({fromBotId:
|
|
17489
|
+
let r=await api("/api/internal/skills/stage",{method:"POST",body:JSON.stringify({fromBotId:BOT_ID10,fromThreadId:THREAD_ID5,action:args.action,skill_name:skillName2||void 0,skill_md:skillMd,...Array.isArray(args.references)?{references:args.references}:{},gist:typeof args.gist=="string"?args.gist:void 0,base_revision:typeof args.base_revision=="string"?args.base_revision:void 0,source:source4})}),nameLabel=typeof r.name=="string"?r.name:"the skill",warningText=Array.isArray(r.warnings)&&r.warnings.
|
|
17490
17490
|
length?`
|
|
17491
17491
|
|
|
17492
17492
|
Scan warnings:
|
|
@@ -26311,7 +26311,7 @@ code:fields2.code},...fields2.text===void 0?{}:{text:fields2.text}};if(command3.
|
|
|
26311
26311
|
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;
|
|
26312
26312
|
(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.
|
|
26313
26313
|
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.
|
|
26314
|
-
env??{}))return;let devTools=this.devTools,port=viewer.port,
|
|
26314
|
+
env??{}))return;let devTools=this.devTools,port=viewer.port,join281=()=>{let entry2=this.dialogs.get(viewer.session);return!entry2||entry2.watch.closed?!1:(this.current(viewer)&&entry2.views.add(viewer.id),!0)};if(join281())return;let url2=localDevToolsUrl(await devTools.url(port).catch(()=>null));if(join281()||!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(
|
|
26315
26315
|
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.
|
|
26316
26316
|
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\
|
|
26317
26317
|
m_status"},ENDED_PROBE).then(answer2=>answer2.success,()=>!1)}async open(options2){let replaced=options2.resume?this.viewers.get(options2.resume):void 0;if(replaced&&replaced.owner===options2.owner&&replaced.botId===options2.botId&&this.close(replaced,!0,!0),this.viewers.size>=8||[...this.viewers.values()].filter(v4=>v4.session===options2.session).length>=2)throw new BrowserLiveError("Too many browser views are open. Close another browser panel first.",429);let viewer={...options2,id:randomUUID64(),
|
|
@@ -26710,12 +26710,12 @@ file3,args,{timeout:EXTRACT_TIMEOUT_MS,windowsHide:!0,maxBuffer:16*1024*1024},er
|
|
|
26710
26710
|
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(existsSync82(executable))return executable;let directory=chromeForTestingDirectory(dataDir,pin),root3=dirname67(directory);mkdirSync103(root3,{recursive:!0,mode:448});for(let name6 of readdirSync46(
|
|
26711
26711
|
root3)){let part2=join211(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=join211(root3,`${pin.platform}.${tag3}.zip.part`),staging2=join211(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\
|
|
26712
26712
|
s installed");if(await(options2.extract??extractZip2)(archive,staging2),!existsSync82(join211(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 existsSync83,readdirSync as readdirSync47}from"node:fs";import{homedir as homedir39}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===
|
|
26713
|
-
"win32"?win329:posix8;function isHeadlessShell(path6){return/chrome-headless-shell/iu.test(path6)}function installedGoogleChrome(host3){let{join:
|
|
26714
|
-
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(
|
|
26715
|
-
let{basename:basename38,join:
|
|
26716
|
-
platform];if(!layout)return null;let{join:
|
|
26717
|
-
wser-stable"],LINUX_CACHE_EXECUTABLES=["chrome-linux64/chrome","chrome-linux/chrome"];function engineFindsLinuxBrowser(host3){let{join:
|
|
26718
|
-
return cached5(
|
|
26713
|
+
"win32"?win329:posix8;function isHeadlessShell(path6){return/chrome-headless-shell/iu.test(path6)}function installedGoogleChrome(host3){let{join:join281}=paths(host3.platform),candidates=[];if(host3.platform==="darwin"){let registered2=host3.appForBundleId("com.google.Chrome");registered2&&candidates.push(join281(registered2,MAC_CHROME_BINARY)),candidates.push(join281("/Applications/Google Chrome.app",MAC_CHROME_BINARY),join281(host3.home,"Applications/Google Chrome.app",MAC_CHROME_BINARY))}else if(host3.
|
|
26714
|
+
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(join281(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){
|
|
26715
|
+
let{basename:basename38,join:join281}=paths(host3.platform);if(host3.platform==="darwin"){let user=host3.env.USER||basename38(host3.home);return host3.exists(join281(MAC_POLICIES,"com.google.Chrome.plist"))||host3.exists(join281(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.
|
|
26716
|
+
platform];if(!layout)return null;let{join:join281}=paths(host3.platform),browsers=join281(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=>join281(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\
|
|
26717
|
+
wser-stable"],LINUX_CACHE_EXECUTABLES=["chrome-linux64/chrome","chrome-linux/chrome"];function engineFindsLinuxBrowser(host3){let{join:join281}=posix8;if((host3.enginePath?.()??host3.env.PATH??"").split(":").filter(Boolean).some(directory=>LINUX_ENGINE_BROWSERS.some(name6=>host3.exists(join281(directory,name6)))))return!0;let cached5=(directory,prefix)=>host3.list(directory).some(name6=>name6.startsWith(prefix)&&LINUX_CACHE_EXECUTABLES.some(executable=>host3.exists(join281(directory,name6,executable))));
|
|
26718
|
+
return cached5(join281(host3.env.PUPPETEER_CACHE_DIR||join281(host3.home,".cache","puppeteer"),"chrome"),"linux")||cached5(host3.env.PLAYWRIGHT_BROWSERS_PATH||join281(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)
|
|
26719
26719
|
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(
|
|
26720
26720
|
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.
|
|
26721
26721
|
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:"\
|
|
@@ -29821,10 +29821,11 @@ raw.category,`${field5}.category`),description:text27(raw.description,`${field5}
|
|
|
29821
29821
|
if(id12!==expectedId)throw new Error("T\u1EC7p bot m\u1EABu kh\xF4ng kh\u1EDBp v\u1EDBi danh s\xE1ch");if(!Array.isArray(value3.tryAsking)||value3.tryAsking.length===0||value3.tryAsking.length>6)throw new Error("tryAsking is invalid");let bot={id:id12,category:category(value3.category,"category"),name:text27(value3.name,"name",40),title:text27(value3.title,"title",80),description:text27(value3.description,"description",300),soul:text27(value3.soul,"soul",8e3),look:look(value3.look,"look"),tryAsking:value3.
|
|
29822
29822
|
tryAsking.map((line6,index4)=>text27(line6,`tryAsking[${index4}]`,200)),apps:apps(value3.apps,"apps")};if(value3.notes!==void 0){if(!isRecord38(value3.notes)||Object.keys(value3.notes).length>6)throw new Error("notes is invalid");bot.notes={};for(let[path6,note2]of Object.entries(value3.notes)){if(!NOTE_PATH.test(path6))throw new Error(`notes path ${path6} is not allowed`);bot.notes[path6]=text27(note2,`notes.${path6}`,8e3)+`
|
|
29823
29823
|
`}}if(value3.routines!==void 0){if(!Array.isArray(value3.routines)||value3.routines.length>5)throw new Error("routines is invalid");bot.routines=value3.routines.map((raw,index4)=>{let field5=`routines[${index4}]`;if(!isRecord38(raw)||!isRecord38(raw.schedule)||raw.schedule.type!=="daily")throw new Error(`${field5} is invalid`);let time6=text27(raw.schedule.time,`${field5}.schedule.time`,5);if(!TIME3.test(time6))throw new Error(`${field5}.schedule.time is invalid`);let weekdays3=raw.schedule.weekdays;
|
|
29824
|
-
if(!Array.isArray(weekdays3)||weekdays3.length===0||weekdays3.length>7||weekdays3.some(day2=>!Number.isInteger(day2)||day2<0||day2>6))throw new Error(`${field5}.schedule.weekdays is invalid`);return{name:text27(raw.name,`${field5}.name`,80),prompt:text27(raw.prompt,`${field5}.prompt`,2e3),schedule:{type:"daily",time:time6,weekdays:[...new Set(weekdays3)].sort()},enabled:!1,overlap:"skip"}})}
|
|
29825
|
-
|
|
29826
|
-
bots;try{let bots=parseBotListing(await fetchJson2(`${TEAM_LIBRARY_RAW_ROOT}/catalog.json${fresh?`?t=${Date.now()}`:""}`,MAX_CATALOG_BYTES));return cached4={at:Date.now(),bots},bots}catch(error66){if(cached4)return cached4.bots;throw error66}}
|
|
29827
|
-
let match5=path6.match(/^\/api\/limix\/bots\/([a-z0-9][a-z0-9-]{0,63})$/);if(!match5)return null;let id12=match5[1];return(await listing2()).some(bot=>bot.id===id12)?{status:200,body:{bot:parseLibraryBot(await fetchJson2(`${TEAM_LIBRARY_RAW_ROOT}
|
|
29824
|
+
if(!Array.isArray(weekdays3)||weekdays3.length===0||weekdays3.length>7||weekdays3.some(day2=>!Number.isInteger(day2)||day2<0||day2>6))throw new Error(`${field5}.schedule.weekdays is invalid`);return{name:text27(raw.name,`${field5}.name`,80),prompt:text27(raw.prompt,`${field5}.prompt`,2e3),schedule:{type:"daily",time:time6,weekdays:[...new Set(weekdays3)].sort()},enabled:!1,overlap:"skip"}})}if(value3.skills!==void 0){if(!Array.isArray(value3.skills)||value3.skills.length>20||value3.skills.some(name6=>typeof name6!=
|
|
29825
|
+
"string"||!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(name6)||name6.length>64))throw new Error("skills is invalid");bot.skills=[...new Set(value3.skills)]}return bot}async function fetchJson2(url2,maxBytes){let response=await fetch(url2,{headers:{accept:"application/json, text/plain;q=0.9"},redirect:"error",signal:AbortSignal.timeout(1e4)});if(!response.ok)throw new Error(`GitHub tr\u1EA3 l\u1ED7i HTTP ${response.status}`);let raw=await response.text();if(Buffer.byteLength(raw)>maxBytes)throw new Error("\
|
|
29826
|
+
T\u1EC7p m\u1EABu qu\xE1 l\u1EDBn");try{return JSON.parse(raw)}catch{throw new Error("GitHub kh\xF4ng tr\u1EA3 v\u1EC1 JSON h\u1EE3p l\u1EC7")}}var cached4=null;async function listing2(fresh=!1){if(!fresh&&cached4&&Date.now()-cached4.at<LIST_TTL_MS)return cached4.bots;try{let bots=parseBotListing(await fetchJson2(`${TEAM_LIBRARY_RAW_ROOT}/catalog.json${fresh?`?t=${Date.now()}`:""}`,MAX_CATALOG_BYTES));return cached4={at:Date.now(),bots},bots}catch(error66){if(cached4)return cached4.bots;throw error66}}
|
|
29827
|
+
async function handleLimixBotLibrary(method2,path6){try{if(method2==="POST"&&path6==="/api/limix/bots/refresh")return{status:200,body:{bots:await listing2(!0)}};if(method2!=="GET")return null;if(path6==="/api/limix/bots")return{status:200,body:{bots:await listing2()}};let match5=path6.match(/^\/api\/limix\/bots\/([a-z0-9][a-z0-9-]{0,63})$/);if(!match5)return null;let id12=match5[1];return(await listing2()).some(bot=>bot.id===id12)?{status:200,body:{bot:parseLibraryBot(await fetchJson2(`${TEAM_LIBRARY_RAW_ROOT}\
|
|
29828
|
+
/bots/${id12}.json?t=${Date.now()}`,MAX_BOT_BYTES),id12)}}:{status:404,body:{error:"Kh\xF4ng c\xF3 bot m\u1EABu n\xE0y"}}}catch(error66){return{status:502,body:{error:error66 instanceof Error?error66.message:String(error66)}}}}init_new_bot_defaults();import{lstatSync as lstatSync45,readdirSync as readdirSync58,readFileSync as readFileSync185,statSync as statSync47}from"node:fs";import{basename as basename34,isAbsolute as isAbsolute41,join as join255}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=join255(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)):
|
|
29828
29829
|
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:readFileSync185(entry2.absolute),executable:entry2.executable===!0}));
|
|
29829
29830
|
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(join255(dir,"SKILL.md")).isFile()}catch{return!1}};if(has2(folder3))dirs.push(folder3);else for(let name6 of readdirSync58(folder3)){let sub=join255(folder3,name6);try{statSync47(sub).isDirectory()&&has2(sub)&&dirs.push(sub)}catch{}}
|
|
29830
29831
|
return dirs.length?{skills:dirs.slice(0,50).map(readOne)}:{error:"No SKILL.md found in that folder or in its subfolders."}}catch(error66){return{error:error66 instanceof Error?error66.message:"Could not read that folder."}}}import{createHash as createHash117}from"node:crypto";import{existsSync as existsSync99,mkdirSync as mkdirSync121,readFileSync as readFileSync186}from"node:fs";import{join as join256}from"node:path";init_atomic();init_config3();var HUB_REPO="leomieo/limix-skill-hub",HUB_BRANCH="main",SYNC_MIN_GAP_MS=1200*60*1e3,FILE_MAX_BYTES3=1024*1024,DEFAULT_SETTINGS={autoSync:!0,autoInstall:!1,lastSync:null,lastError:null,etag:null},hubDir=()=>join256(DATA_DIR,"skill-hub"),settingsFile=()=>join256(hubDir(),"settings.json"),catalogFile=()=>join256(hubDir(),"catalog.json");function readJson6(file3,fallback2){try{return JSON.parse(readFileSync186(file3,"utf8"))}catch{return fallback2}}function hubSettings(){return{...DEFAULT_SETTINGS,
|
|
@@ -29838,31 +29839,45 @@ async function installHubSkill(id12,options2={}){if(!isSkillName(id12))return{er
|
|
|
29838
29839
|
return{error:"Th\u01B0 vi\u1EC7n \u0111\xE3 c\xF3 k\u1EF9 n\u0103ng c\xF9ng t\xEAn kh\xF4ng \u0111\u1EBFn t\u1EEB Hub."};let wanted=Object.keys(entry2.file_hashes).filter(path6=>path6!=="SKILL.md"&&(options2.allowTools||!isToolFile(path6))),skipped2=Object.keys(entry2.file_hashes).filter(path6=>path6!=="SKILL.md"&&!wanted.includes(path6)),files2=[],skillMd="";for(let path6 of["SKILL.md",...wanted]){let expected=entry2.file_hashes[path6];if(!expected)return{error:`Danh m\u1EE5c thi\u1EBFu m\xE3 ki\u1EC3m tra cho ${path6}`};
|
|
29839
29840
|
let response;try{response=await fetchText(rawUrl(`${entry2.area==="quarantine"?"quarantine":"skills"}/${id12}/${path6}`))}catch(cause){return{error:`Kh\xF4ng t\u1EA3i \u0111\u01B0\u1EE3c ${path6}: ${cause instanceof Error?cause.message:String(cause)}`}}if(!response.ok)return{error:`Kh\xF4ng t\u1EA3i \u0111\u01B0\u1EE3c ${path6} (${response.status})`};let bytes4=new Uint8Array(await response.arrayBuffer());if(bytes4.byteLength>FILE_MAX_BYTES3)return{error:`${path6} qu\xE1 l\u1EDBn`};if(sha(bytes4)!==
|
|
29840
29841
|
expected)return{error:`${path6} kh\xF4ng kh\u1EDBp m\xE3 SHA-256 trong danh m\u1EE5c \u2014 \u0111\xE3 d\u1EEBng c\xE0i`};path6==="SKILL.md"?skillMd=new TextDecoder().decode(bytes4):files2.push({path:path6,content:bytes4})}if(installed2){let retired=retireLibrarySkill(id12,installed2.sha256);if("error"in retired)return{error:retired.error};if("stale"in retired)return{error:"K\u1EF9 n\u0103ng \u0111\xE3 b\u1ECB s\u1EEDa tay sau khi c\xE0i, kh\xF4ng c\u1EADp nh\u1EADt \u0111\xE8."}}let result2=installLibrarySkill(
|
|
29841
|
-
{name:id12,instructions:skillMd,source:`limix-hub:${id12}@${entry2.checksum} (${entry2.source.repository??"?"}@${(entry2.source.commit??"").slice(0,7)})`,...entry2.license?{license:entry2.license}:{},...entry2.compatibility.text?{compatibility:entry2.compatibility.text}:{},...entry2.tags.length?{tags:entry2.tags}:{},warnings:entry2.notes,skippedFiles:skipped2,reviewState:"
|
|
29842
|
+
{name:id12,instructions:skillMd,source:`limix-hub:${id12}@${entry2.checksum} (${entry2.source.repository??"?"}@${(entry2.source.commit??"").slice(0,7)})`,...entry2.license?{license:entry2.license}:{},...entry2.compatibility.text?{compatibility:entry2.compatibility.text}:{},...entry2.tags.length?{tags:entry2.tags}:{},warnings:entry2.notes,skippedFiles:skipped2,reviewState:"approved",...files2.length?{files:files2}:{}});return"error"in result2?{error:result2.error}:{ok:!0,skipped:skipped2}}function setHubSkillEnabled(id12,enabled){
|
|
29842
29843
|
if(!installedFromHub().has(id12))return{error:"K\u1EF9 n\u0103ng n\xE0y ch\u01B0a c\xE0i t\u1EEB Hub"};let result2=setLibrarySkillReviewState(id12,enabled?"approved":"disabled");return"error"in result2?{error:result2.error}:{ok:!0}}function removeHubSkill(id12){let installed2=installedFromHub().get(id12);if(!installed2)return{error:"K\u1EF9 n\u0103ng n\xE0y ch\u01B0a c\xE0i t\u1EEB Hub"};let result2=retireLibrarySkill(id12,installed2.sha256);return"error"in result2?{error:result2.error}:"stale"in
|
|
29843
29844
|
result2?{error:"K\u1EF9 n\u0103ng \u0111\xE3 b\u1ECB s\u1EEDa tay sau khi c\xE0i, kh\xF4ng g\u1EE1 t\u1EF1 \u0111\u1ED9ng."}:{ok:!0}}async function autoInstallEligible(){let budget=5;for(let skill of hubSkills()){if(budget<=0)return;if(!(!skill.blocked&&!skill.risky&&skill.kind==="instructions-only"&&skill.approval_status==="approved"&&(skill.grade==="excellent"||skill.grade==="recommended"))||skill.installed&&!skill.updateAvailable)continue;budget-=1,"ok"in await installHubSkill(skill.id)&&skill.
|
|
29844
29845
|
updateAvailable&&skill.enabled&&setHubSkillEnabled(skill.id,!0)}}async function handleLimixHub(method2,path6,body2){let record31=body2&&typeof body2=="object"?body2:{};if(method2==="GET"&&path6==="/api/limix/hub")return{status:200,body:{repo:HUB_REPO,settings:hubSettings(),skills:hubSkills()}};if(method2==="POST"&&path6==="/api/limix/hub/sync"){let result2=await syncHub();return"error"in result2?{status:502,body:result2}:{status:200,body:result2}}if(method2==="POST"&&path6==="/api/limix/hub/sett\
|
|
29845
29846
|
ings"){let current3=hubSettings();return saveSettings({...current3,autoSync:typeof record31.autoSync=="boolean"?record31.autoSync:current3.autoSync,autoInstall:typeof record31.autoInstall=="boolean"?record31.autoInstall:current3.autoInstall}),{status:200,body:{settings:hubSettings()}}}let id12=typeof record31.id=="string"?record31.id:"";if(method2==="POST"&&(path6==="/api/limix/hub/install"||path6==="/api/limix/hub/update")){let result2=await installHubSkill(id12,{allowTools:record31.allowTools===
|
|
29846
29847
|
!0,allowRisky:record31.allowRisky===!0});return"error"in result2?{status:422,body:result2}:{status:200,body:result2}}if(method2==="POST"&&path6==="/api/limix/hub/enable"){let result2=setHubSkillEnabled(id12,record31.enabled===!0);return"error"in result2?{status:422,body:result2}:{status:200,body:result2}}if(method2==="POST"&&path6==="/api/limix/hub/remove"){let result2=removeHubSkill(id12);return"error"in result2?{status:422,body:result2}:{status:200,body:result2}}return null}var started2=!1;function startHubAutoSync(){
|
|
29847
|
-
if(started2)return;started2=!0;let tick2=()=>{let settings=hubSettings();settings.autoSync&&(settings.lastSync&&Date.now()-Date.parse(settings.lastSync)<SYNC_MIN_GAP_MS||syncHub())};setTimeout(tick2,6e4).unref(),setInterval(tick2,1800*1e3).unref()}
|
|
29848
|
-
|
|
29849
|
-
|
|
29850
|
-
|
|
29851
|
-
|
|
29852
|
-
|
|
29853
|
-
|
|
29854
|
-
|
|
29855
|
-
|
|
29856
|
-
|
|
29857
|
-
|
|
29858
|
-
"
|
|
29859
|
-
|
|
29860
|
-
|
|
29861
|
-
|
|
29862
|
-
|
|
29863
|
-
|
|
29864
|
-
res,404,{error:"no such bot"});let
|
|
29865
|
-
|
|
29848
|
+
if(started2)return;started2=!0;let tick2=()=>{let settings=hubSettings();settings.autoSync&&(settings.lastSync&&Date.now()-Date.parse(settings.lastSync)<SYNC_MIN_GAP_MS||syncHub())};setTimeout(tick2,6e4).unref(),setInterval(tick2,1800*1e3).unref()}import{existsSync as existsSync100,mkdirSync as mkdirSync122,readFileSync as readFileSync187}from"node:fs";import{join as join257}from"node:path";init_atomic();init_config3();var LIMIX_CORE_SKILLS=new Set(["create-verification-skill","agent-reach","windows-computer-automation","phone-connection","phone-harness"]),BOT_ID8=/^[\w-]+$/,picksPath=botId=>join257(DATA_DIR,"skill-state",botId,"limix-bundled.json");function bundledPicks(botId){if(!BOT_ID8.test(botId))return new Set;try{let parsed2=JSON.parse(readFileSync187(picksPath(botId),"utf8"));return new Set(Array.isArray(parsed2)?parsed2.filter(name6=>typeof name6=="string"&&isSkillName(name6)):[])}catch{return new Set}}
|
|
29849
|
+
function setBundledPick(botId,id12,on3){if(!BOT_ID8.test(botId)||!isSkillName(id12))return;let picks2=bundledPicks(botId);picks2.has(id12)!==on3&&(on3?picks2.add(id12):picks2.delete(id12),mkdirSync122(join257(DATA_DIR,"skill-state",botId),{recursive:!0,mode:448}),writeFileAtomic(picksPath(botId),`${JSON.stringify([...picks2].sort(),null,2)}
|
|
29850
|
+
`,{mode:384}))}function limixBundledFor(botId,skills){let picks2=bundledPicks(botId);return skills.filter(({manifest})=>LIMIX_CORE_SKILLS.has(manifest.id)||picks2.has(manifest.id))}var slashCalled=(text31,id12)=>new RegExp(`(^|\\s)/${id12.replace(/[-]/g,"\\-")}(?=$|[\\s.,:;!?])`,"m").test(text31);function limixSelectBundled(text31,capabilities,skills){let available=new Set(capabilities),called=skills.filter(({manifest})=>manifest.requiredCapabilities.every(capability2=>available.has(capability2))&&
|
|
29851
|
+
slashCalled(text31,manifest.id));return mergeSkills(selectBundledSkills(text31,available,skills),called)}function limixBundledListings(botId){return limixBundledFor(botId,loadBundledSkills()).map(({manifest})=>({name:manifest.id,description:manifest.description,enabled:!0,editable:!1,source:LIMIX_CORE_SKILLS.has(manifest.id)?"K\u0129 n\u0103ng g\u1ED1c c\u1EE7a Limix Bot":"Kho K\u0129 N\u0103ng (Skills) \xB7 c\xF3 s\u1EB5n",sha256:"",importedAt:"",warnings:[],skippedFiles:[],origin:"bundled",core:LIMIX_CORE_SKILLS.
|
|
29852
|
+
has(manifest.id)}))}function limixBundledSwitch(botId,name6,enabled){return loadBundledSkills().some(({manifest})=>manifest.id===name6)?LIMIX_CORE_SKILLS.has(name6)?enabled?{status:200,body:{skill:limixBundledListings(botId).find(skill=>skill.name===name6)}}:{status:409,body:{error:"K\u0129 n\u0103ng g\u1ED1c c\u1EE7a Limix Bot lu\xF4n b\u1EADt cho m\u1ECDi bot."}}:(setBundledPick(botId,name6,enabled),{status:200,body:{skill:{...limixBundledListings(botId).find(skill=>skill.name===name6),name:name6,
|
|
29853
|
+
enabled}}}):null}function storeItems(bots,botId){let bot=bots.bot(botId),assigned=new Set(bot.assignedSkills??[]),picks2=bundledPicks(botId),items=new Map;for(let{manifest}of loadBundledSkills()){let core=LIMIX_CORE_SKILLS.has(manifest.id);items.set(manifest.id,{name:manifest.id,description:manifest.description,kind:"bundled",added:core||picks2.has(manifest.id),core,ready:!0,warnings:0,source:"C\xF3 s\u1EB5n trong Limix Bot"})}for(let skill of listLibrarySkills()){if(items.has(skill.name))continue;
|
|
29854
|
+
let intact=!skill.warnings.some(warning=>warning.includes("enablement is blocked"));items.set(skill.name,{name:skill.name,description:skill.description,kind:"library",added:assigned.has(skill.name)&&skill.enabled,core:!1,ready:intact,warnings:skill.warnings.length,source:skill.source.startsWith("limix-hub:")?"Th\u01B0 vi\u1EC7n k\u0129 n\u0103ng Limix":"\u0110\xE3 c\xE0i trong C\xE0i \u0111\u1EB7t"})}for(let skill of importedSkillListings(botId,new Set))items.has(skill.name)||items.set(skill.name,
|
|
29855
|
+
{name:skill.name,description:skill.description,kind:"imported",added:skill.enabled,core:!1,ready:!0,warnings:skill.warnings.length,source:skill.source||"T\u1EEB m\xE1y t\xEDnh n\xE0y"});return[...items.values()].sort((a,b11)=>Number(b11.core)-Number(a.core)||a.name.localeCompare(b11.name))}function limixStoreSet(bots,botId,name6,add11,kind2){let bot=bots.bot(botId);if(!bot)return{error:"Kh\xF4ng t\xECm th\u1EA5y bot."};if(!isSkillName(name6))return{error:"T\xEAn k\u0129 n\u0103ng kh\xF4ng h\u1EE3p l\u1EC7."};
|
|
29856
|
+
let item=storeItems(bots,botId).find(entry2=>entry2.name===name6&&(!kind2||entry2.kind===kind2));if(!item)return{error:`Kho ch\u01B0a c\xF3 k\u0129 n\u0103ng "${name6}".`};if(item.kind==="bundled")return item.core?add11?{ok:!0}:{error:"K\u0129 n\u0103ng g\u1ED1c c\u1EE7a Limix Bot lu\xF4n b\u1EADt cho m\u1ECDi bot."}:(setBundledPick(botId,name6,add11),{ok:!0});if(item.kind==="imported"){let result3=setImportedSkillEnabled(botId,name6,add11);return"error"in result3?{error:result3.error}:{ok:!0}}let assigned=bot.
|
|
29857
|
+
assignedSkills??[];if(add11){let listing3=listLibrarySkills().find(skill=>skill.name===name6);if(listing3&&!listing3.enabled){let approved=setLibrarySkillReviewState(name6,"approved");if("error"in approved)return{error:approved.error}}return setLibrarySkillOptOut(botId,name6,!1),assigned.includes(name6)||bots.patchBot(botId,{assignedSkills:[...assigned,name6]}),{ok:!0}}let result2=unassignLibrarySkill(botId,name6,assigned);return"unassigned"in result2&&result2.assignedSkills&&bots.patchBot(botId,
|
|
29858
|
+
{assignedSkills:result2.assignedSkills}),{ok:!0}}function handleLimixSkillStore(bots,method2,path6,body2){let m3=path6.match(/^\/api\/limix\/skill-store\/([\w-]+)$/);if(!m3)return null;let botId=m3[1];if(!bots.bot(botId))return{status:404,body:{error:"Kh\xF4ng t\xECm th\u1EA5y bot."}};if(method2==="GET")return{status:200,body:{skills:storeItems(bots,botId)}};if(method2==="POST"){let raw=body2&&typeof body2=="object"?body2:{},kind2=raw.kind==="bundled"||raw.kind==="library"||raw.kind==="imported"?
|
|
29859
|
+
raw.kind:void 0;if(typeof raw.name!="string"||typeof raw.add!="boolean")return{status:400,body:{error:"C\u1EA7n t\xEAn k\u0129 n\u0103ng v\xE0 add."}};let result2=limixStoreSet(bots,botId,raw.name,raw.add,kind2);return"error"in result2?{status:422,body:result2}:{status:200,body:{skills:storeItems(bots,botId)}}}return{status:405,body:{error:"method not allowed"}}}function limixSkillDefaultsMigration(){let marker=join257(DATA_DIR,"skill-state","limix-skill-defaults-v1.json");if(!existsSync100(marker))
|
|
29860
|
+
try{for(let[name6,entry2]of Object.entries(readSkillLibraryIndex()))entry2.everyBot&&setLibrarySkillEveryBot(name6,!1);mkdirSync122(join257(DATA_DIR,"skill-state"),{recursive:!0,mode:448}),writeFileAtomic(marker,`${JSON.stringify({at:new Date().toISOString()})}
|
|
29861
|
+
`,{mode:384})}catch{}}function createBotSkillsRoutes(deps){let{store:store5,cfg:cfg2,listBotSkills:listBotSkills2,readBotSkillFile:readBotSkillFile2,stagedSkillListing:stagedSkillListing2}=deps;return async({req,res,url:url2,path:path6,method:method2,json:json7,readBody:readBody2})=>{let m3=null;if(path6.startsWith("/api/limix/bots")){let library=await handleLimixBotLibrary(method2,path6);if(library)return json7(res,library.status,library.body)}if(path6.startsWith("/api/limix/hub")){let hub=await handleLimixHub(method2,
|
|
29862
|
+
path6,method2==="POST"?await readBody2(req):void 0);if(hub)return json7(res,hub.status,hub.body)}if(path6.startsWith("/api/limix/skill-store/")){let skillStore=handleLimixSkillStore(store5,method2,path6,method2==="POST"?await readBody2(req):void 0);if(skillStore)return json7(res,skillStore.status,skillStore.body)}if(method2==="GET"&&path6==="/api/limix/bundled-skills"){let skills=loadBundledSkills().map(({manifest})=>({id:manifest.id,name:manifest.name,description:manifest.description,defaultEnabled:manifest.
|
|
29863
|
+
defaultEnabled,triggerTerms:manifest.triggerTerms,core:LIMIX_CORE_SKILLS.has(manifest.id)}));return json7(res,200,{skills})}if(m3=path6.match(/^\/api\/bots\/([\w-]+)\/skill-template$/),m3&&method2==="POST"){if(!store5.bot(m3[1]))return json7(res,404,{error:"no such bot"});let checked=botSkillTemplateSchema.safeParse(await readBody2(req));if(!checked.success)return json7(res,400,{error:checked.error.message});let input2=checked.data,parsed2=parseSkillMd(input2.text);if("error"in parsed2||parsed2.
|
|
29864
|
+
name!==input2.name)return json7(res,400,{error:"Skill name does not match its contents"});let installed2=installSkill(m3[1],input2.source,[{path:"SKILL.md",content:input2.text}]);if("error"in installed2)return json7(res,422,{error:installed2.error});if(input2.enabled){let enabled=setSkillEnabled(m3[1],input2.name,!0);if("error"in enabled)return json7(res,422,{error:enabled.error})}return json7(res,201,{installed:installed2})}if(m3=path6.match(/^\/api\/bots\/([\w-]+)\/skills$/),m3&&method2==="GET"){
|
|
29865
|
+
let bot=store5.bot(m3[1]);if(!bot)return json7(res,404,{error:"no such bot"});let asked=url2.searchParams.get("threadId"),threadId=asked&&store5.taskByThread(bot.id,asked)?asked:bot.threadId;if(skillsLibraryEnabled(cfg2)){let{skills,library}=listBotSkillsWithOrigin(m3[1],store5.bot(m3[1]).assignedSkills),names5=new Set(skills.map(skill=>skill.name));return json7(res,200,{skills:[...skills,...listBotSkills2(bot,threadId).filter(skill=>!names5.has(skill.name)),...limixBundledListings(bot.id).filter(
|
|
29866
|
+
skill=>!names5.has(skill.name)&&!listBotSkills2(bot,threadId).some(other=>other.name===skill.name))],library,assignedSkills:store5.bot(m3[1]).assignedSkills,staged:listStagedSkillWrites(m3[1]).map(stagedSkillListing2)})}return json7(res,200,{skills:[...listBotSkills2(bot,threadId),...limixBundledListings(bot.id)],staged:listStagedSkillWrites(m3[1]).map(stagedSkillListing2)})}if(m3&&method2==="POST"){if(!store5.bot(m3[1]))return json7(res,404,{error:"no such bot"});let parsed2=external_exports.object(
|
|
29867
|
+
{source:external_exports.string().min(1).max(2e3)}).safeParse(await readBody2(req));if(!parsed2.success)return json7(res,400,{error:"source must be a GitHub or skills.sh URL, or owner/repo"});let fetched=parsed2.data.source.startsWith("local-folder:")?readLocalSkills(parsed2.data.source.slice(13)):await fetchSkillFromSource(parsed2.data.source);if("error"in fetched)return json7(res,422,{error:fetched.error});let results=fetched.skills.map(skill=>({skill,result:installSkill(m3[1],skill.source,skill.
|
|
29868
|
+
files,skill.github)})),errors2=results.flatMap(({result:result2})=>"error"in result2?[result2.error]:[]),done=results.flatMap(({skill,result:result2})=>"error"in result2?[]:[{skill,installed:result2}]);if(!done.length)return json7(res,422,{error:errors2.join("; ")||"nothing importable found"});let imported=done.map(({skill,installed:installed2})=>skillImportSummary(installed2.name,skill.files,skill.skipped));return json7(res,201,{installed:done.map(({installed:installed2})=>installed2),imported,
|
|
29869
|
+
errors:errors2})}if(m3=path6.match(/^\/api\/bots\/([\w-]+)\/skills\/([a-z0-9-]+)$/),m3&&method2==="GET"){let bot=store5.bot(m3[1]),text31=bot?readBotSkillFile2(bot,m3[2]):null;return text31===null?json7(res,404,{error:"no such skill"}):json7(res,200,{text:text31})}if(m3&&method2==="PATCH"){let parsed2=external_exports.object({enabled:external_exports.boolean()}).safeParse(await readBody2(req));if(!parsed2.success)return json7(res,400,{error:"enabled must be true or false"});let bot=store5.bot(m3[1]);
|
|
29870
|
+
if(bot&&listBotSkills2(bot).some(skill=>skill.name===m3[2]&&skill.origin==="imported")){let result3=setImportedSkillEnabled(bot.id,m3[2],parsed2.data.enabled);return"error"in result3?json7(res,409,{error:result3.error}):json7(res,200,{skill:result3})}if(bot&&listBotSkills2(bot).some(skill=>skill.name===m3[2]&&skill.origin==="native")){let result3=setNativeSkillEnabled(bot.id,m3[2],parsed2.data.enabled);if("error"in result3)return json7(res,409,{error:result3.error});let skill=listBotSkills2(bot).
|
|
29871
|
+
find(entry2=>entry2.name===m3[2]);return skill?json7(res,200,{skill}):json7(res,404,{error:"no such skill"})}let result2=setSkillEnabled(m3[1],m3[2],parsed2.data.enabled);if("error"in result2){let shipped=limixBundledSwitch(m3[1],m3[2],parsed2.data.enabled);return shipped?json7(res,shipped.status,shipped.body):json7(res,404,{error:result2.error})}return json7(res,200,{skill:result2})}if(m3&&method2==="DELETE"){let bot=store5.bot(m3[1]);if(!bot)return json7(res,404,{error:"no such bot"});let name6=m3[2],
|
|
29872
|
+
removed=removeSkill(bot.id,name6);if(!("error"in removed))return json7(res,200,{ok:!0});if(skillsLibraryEnabled(cfg2)){let unassigned=unassignLibrarySkill(bot.id,name6,bot.assignedSkills);if("unassigned"in unassigned)return"assignedSkills"in unassigned&&store5.patchBot(bot.id,{assignedSkills:unassigned.assignedSkills}),json7(res,200,{ok:!0})}let origin2=listBotSkills2(bot).find(skill=>skill.name===name6)?.origin;return origin2==="imported"?json7(res,404,{error:`"${name6}" comes from this compute\
|
|
29873
|
+
r and can't be removed from one bot. Turn it off instead.`}):origin2==="native"?json7(res,404,{error:`"${name6}" comes from this bot's engine and can't be removed here.`}):json7(res,404,{error:removed.error})}if(m3=path6.match(/^\/api\/skills-library$/),m3&&method2==="GET"){if(!skillsLibraryEnabled(cfg2))return json7(res,404,{error:"skills library is not enabled"});let index4=readSkillLibraryIndex(),skills=listLibrarySkills().map(listing3=>({name:listing3.name,description:listing3.description,source:listing3.
|
|
29874
|
+
source,enabled:listing3.enabled,everyBot:index4[listing3.name]?.everyBot===!0,tags:listing3.tags??[],version:index4[listing3.name]?.package?.release??null,importedAt:listing3.importedAt,...listing3.license?{license:listing3.license}:{},...listing3.compatibility?{compatibility:listing3.compatibility}:{},warnings:listing3.warnings,assignedBots:store5.bots.filter(bot=>bot.assignedSkills?.includes(listing3.name)||index4[listing3.name]?.everyBot===!0&&!librarySkillOptOuts(bot.id).has(listing3.name)).
|
|
29875
|
+
map(bot=>({id:bot.id,name:bot.name}))})).sort((a,b11)=>a.name.localeCompare(b11.name));return json7(res,200,{skills})}if(m3&&method2==="POST"){if(!skillsLibraryEnabled(cfg2))return json7(res,404,{error:"skills library is not enabled"});let parsed2=external_exports.object({text:external_exports.string().min(1)}).safeParse(await readBody2(req));if(!parsed2.success)return json7(res,400,{error:"text must be the SKILL.md contents to import"});let skill=parseSkillMd(parsed2.data.text);if("error"in skill)
|
|
29876
|
+
return json7(res,400,{error:skill.error});let installed2=installLibrarySkill({name:skill.name,instructions:parsed2.data.text,source:"local-import",license:skill.license,compatibility:skill.compatibility,tags:skill.tags,warnings:scanSkillText(parsed2.data.text),reviewState:"disabled"});return"error"in installed2?json7(res,422,{error:installed2.error}):json7(res,201,{skill:installed2})}if(m3=path6.match(/^\/api\/skills-library\/([a-z0-9-]+)$/),m3&&method2==="GET"){if(!skillsLibraryEnabled(cfg2))return json7(
|
|
29877
|
+
res,404,{error:"skills library is not enabled"});let text31=readLibrarySkillFile(m3[1]);return text31===null?json7(res,404,{error:"no such skill"}):json7(res,200,{text:text31})}if(m3&&method2==="PATCH"){if(!skillsLibraryEnabled(cfg2))return json7(res,404,{error:"skills library is not enabled"});let parsed2=external_exports.object({enabled:external_exports.boolean().optional(),everyBot:external_exports.boolean().optional()}).refine(body2=>body2.enabled!==void 0!=(body2.everyBot!==void 0)).safeParse(
|
|
29878
|
+
await readBody2(req));if(!parsed2.success)return json7(res,400,{error:"enabled or everyBot must be true or false"});let result2=parsed2.data.enabled!==void 0?setLibrarySkillReviewState(m3[1],parsed2.data.enabled?"approved":"disabled"):setLibrarySkillEveryBot(m3[1],parsed2.data.everyBot);return"error"in result2?json7(res,404,{error:result2.error}):json7(res,200,{skill:result2})}if(m3=path6.match(/^\/api\/bots\/([\w-]+)\/skills-library$/),m3&&method2==="PUT"){if(!skillsLibraryEnabled(cfg2))return json7(
|
|
29879
|
+
res,404,{error:"skills library is not enabled"});if(!store5.bot(m3[1]))return json7(res,404,{error:"no such bot"});let parsed2=external_exports.object({skills:external_exports.array(external_exports.string().min(1).max(64)).max(200)}).safeParse(await readBody2(req));if(!parsed2.success)return json7(res,400,{error:"skills must be a list of skill names"});let index4=readSkillLibraryIndex(),names5=[...new Set(parsed2.data.skills)],unknown2=names5.filter(name6=>!index4[name6]);if(unknown2.length)return json7(
|
|
29880
|
+
res,422,{error:"not in the library: "+unknown2.join(", ")});for(let name6 of names5)setLibrarySkillOptOut(m3[1],name6,!1);return store5.patchBot(m3[1],{assignedSkills:names5}),json7(res,200,{assignedSkills:names5})}return PASS}}function createSkillShareRoutes(deps){return async({req,res,path:path6,method:method2,auth,json:json7,readBody:readBody2})=>{if(method2!=="POST")return PASS;let m3=path6.match(/^\/api\/threads\/([\w-]+)\/share-skill$/);if(m3){if(!deps.enabled())return json7(res,404,{error:"sharing learned skills is not enabled"});let body2=await readBody2(req),requestId=typeof body2?.requestId=="string"?body2.requestId:"";if(!requestId)return json7(res,400,{error:"requestId is required"});let refusal7=deps.cardRefusal(
|
|
29866
29881
|
auth,m3[1],requestId);if(refusal7)return json7(res,403,{error:refusal7});let result2=deps.shareFromReceipt(m3[1],requestId);return result2.ok?json7(res,200,{ok:!0,shared:result2.shared}):json7(res,result2.status,{error:result2.error})}if(m3=path6.match(/^\/api\/bots\/([\w-]+)\/skills\/([a-z0-9-]+)\/share$/),m3){if(!deps.enabled())return json7(res,404,{error:"sharing learned skills is not enabled"});if(!deps.botExists(m3[1]))return json7(res,404,{error:"no such bot"});let shared=deps.shareFromBot(
|
|
29867
29882
|
m3[1],m3[2]);return"error"in shared?json7(res,422,{error:shared.error}):json7(res,200,{ok:!0,shared})}return PASS}}init_zod();init_user_errors();function createTeamContextRoutes(deps){let{store:store5,teamMemory:teamMemory2}=deps;return async({req,res,url:url2,path:path6,method:method2,json:json7,readBody:readBody2})=>{let m3=null;if(path6==="/api/team-memory"&&(method2==="GET"||method2==="POST")){if(!url2.searchParams.has("section"))return json7(res,400,{error:"section is required"});let section4=sectionContextKey(url2.searchParams.get("section")??"");if(section4&&!store5.sections.includes(section4))return json7(res,404,userError("serve\
|
|
29868
29883
|
rError.department.notFound"));if(section4.length>60)return json7(res,400,{error:"section must be at most 60 characters"});if(method2==="GET")return json7(res,200,{section:section4,label:sectionContextLabel(section4),entries:teamMemory2.list(section4),loadedIds:teamMemory2.promptSelection(section4).loadedIds});let body2=await readBody2(req);if(!body2||typeof body2!="object"||!TEAM_MEMORY_KINDS.includes(String(body2.kind)))return json7(res,400,{error:`kind must be one of ${TEAM_MEMORY_KINDS.join("\
|
|
@@ -29873,7 +29888,7 @@ accept===!0){if(!teamMemory2.resolve(section4,m3[1],"accept",body2.expectedRevis
|
|
|
29873
29888
|
success)return json7(res,400,{error:"Invalid memory edit"});if(!teamMemory2.update(section4,m3[1],parsed2.data,body2.expectedRevision))return json7(res,404,{error:"no such entry"})}return json7(res,200,{entries:teamMemory2.list(section4),loadedIds:teamMemory2.promptSelection(section4).loadedIds})}catch(error66){return json7(res,error66 instanceof TeamMemoryConflict?409:400,{error:error66 instanceof Error?error66.message:String(error66),...userErrorFields(error66)})}}if(path6==="/api/section-cont\
|
|
29874
29889
|
ext"&&(method2==="GET"||method2==="PUT")){if(!url2.searchParams.has("section"))return json7(res,400,{error:"section is required"});let requested=url2.searchParams.get("section")??"",section4=sectionContextKey(requested);if(section4.length>60)return json7(res,400,{error:"section must be at most 60 characters"});if(!(section4===""||store5.sections.includes(section4)||store5.bots.some(bot=>!bot.hidden&§ionKey2(bot.section)===section4)||store5.groups.some(group2=>sectionKey2(group2.section)===section4)))
|
|
29875
29890
|
return json7(res,404,userError("serverError.department.missing"));if(method2==="GET"){let context4=readSectionContext(section4);return json7(res,200,{section:section4,label:sectionContextLabel(section4),text:context4?.text??"",updatedAt:context4?.updatedAt??null,maxBytes:SECTION_CONTEXT_MAX_BYTES})}let parsed2=external_exports.object({text:external_exports.string()}).safeParse(await readBody2(req));if(!parsed2.success)return json7(res,400,{error:"text must be a string"});if(Buffer.byteLength(parsed2.
|
|
29876
|
-
data.text,"utf8")>SECTION_CONTEXT_MAX_BYTES)return json7(res,400,{error:`section context is capped at ${SECTION_CONTEXT_MAX_BYTES/1e3}KB`});let context3=writeSectionContext(section4,parsed2.data.text);return json7(res,200,{ok:!0,section:section4,label:sectionContextLabel(section4),text:context3?.text??"",updatedAt:context3?.updatedAt??null,maxBytes:SECTION_CONTEXT_MAX_BYTES})}return PASS}}init_zod();import{createHash as createHash118}from"node:crypto";import{readFileSync as
|
|
29891
|
+
data.text,"utf8")>SECTION_CONTEXT_MAX_BYTES)return json7(res,400,{error:`section context is capped at ${SECTION_CONTEXT_MAX_BYTES/1e3}KB`});let context3=writeSectionContext(section4,parsed2.data.text);return json7(res,200,{ok:!0,section:section4,label:sectionContextLabel(section4),text:context3?.text??"",updatedAt:context3?.updatedAt??null,maxBytes:SECTION_CONTEXT_MAX_BYTES})}return PASS}}init_zod();import{createHash as createHash118}from"node:crypto";import{readFileSync as readFileSync188}from"node:fs";import{join as join258}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\
|
|
29877
29892
|
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",
|
|
29878
29893
|
"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)}
|
|
29879
29894
|
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[
|
|
@@ -29881,7 +29896,7 @@ function rankAppSuggestions(input2){let bySlug=new Map(input2.catalog.map(card=>
|
|
|
29881
29896
|
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.
|
|
29882
29897
|
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{
|
|
29883
29898
|
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)}).
|
|
29884
|
-
optional()});function createAppSuggestions(deps){let now2=deps.now??Date.now,file3=
|
|
29899
|
+
optional()});function createAppSuggestions(deps){let now2=deps.now??Date.now,file3=join258(deps.dataDir,SUGGESTIONS_FILE),state={version:1,wanted:[]};try{let parsed2=stateSchema5.safeParse(JSON.parse(readFileSync188(file3,"utf8")));parsed2.success&&(state=parsed2.data)}catch{}let save7=()=>{try{writeFileAtomic(file3,`${JSON.stringify(state)}
|
|
29885
29900
|
`,{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(
|
|
29886
29901
|
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||
|
|
29887
29902
|
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:"\
|
|
@@ -29896,28 +29911,28 @@ he app is for."});let bot=deps.bot(deps.botId);return bot?json7(res,200,{text:aw
|
|
|
29896
29911
|
key!="string")return json7(res,400,{error:"key must be a string"});let draft=typeof body2?.key=="string"?body2.key.trim():"";if(draft.length>MAX_KEY_LENGTH)return json7(res,400,{error:"That does not look like an API key."});res.setHeader("cache-control","no-store");let provider=body2?.provider==="jev"||body2?.provider==="openrouter"||body2?.provider==="workersai"?body2.provider:void 0;if(body2?.accountId!==void 0&&(typeof body2.accountId!="string"||!WORKERS_AI_ACCOUNT_ID.test(body2.accountId.trim())))
|
|
29897
29912
|
return json7(res,400,userError("serverError.decider.accountId"));let accountId=typeof body2?.accountId=="string"?body2.accountId.trim():void 0;if(body2?.model!==void 0&&(typeof body2.model!="string"||body2.model.length>OPENROUTER_MODEL_ID_MAX))return json7(res,400,{error:"model must be an OpenRouter model id"});let model4=typeof body2?.model=="string"&&body2.model.trim()?body2.model.trim():void 0,api=body2?.api==="decisions"||body2?.api==="chat"?body2.api:void 0,result2=await deps.decider.testKey(
|
|
29898
29913
|
{...draft?{key:draft}:{},...provider?{provider}:{},...model4?{model:model4}:{},...api?{api}:{},...accountId?{accountId}:{}}),read4=!draft&&(!provider||provider==="workersai")&&deps.extractor?await deps.extractor.testKey():null,extraction=read4&&!(read4.ok===!1&&read4.reason==="no_key")?{extraction:read4.ok?{ok:!0}:{ok:!1,reason:read4.reason,...read4.status?{status:read4.status}:{}}}:{};return result2.ok?json7(res,200,{ok:!0,latencyMs:result2.latencyMs,...extraction}):json7(res,200,{ok:!1,reason:result2.
|
|
29899
|
-
reason,...result2.status?{status:result2.status}:{},...extraction})}}init_zod();init_bot_avatar();init_zod();import{createHash as createHash119,randomUUID as randomUUID81}from"node:crypto";import{createReadStream as createReadStream10}from"node:fs";import{link as link4,lstat as lstat10,mkdir as mkdir15,open as open13,readdir as readdir13,rename as rename7,stat as stat14,unlink as unlink7}from"node:fs/promises";import{statfsSync as statfsSync4}from"node:fs";import{dirname as dirname77,join as
|
|
29914
|
+
reason,...result2.status?{status:result2.status}:{},...extraction})}}init_zod();init_bot_avatar();init_zod();import{createHash as createHash119,randomUUID as randomUUID81}from"node:crypto";import{createReadStream as createReadStream10}from"node:fs";import{link as link4,lstat as lstat10,mkdir as mkdir15,open as open13,readdir as readdir13,rename as rename7,stat as stat14,unlink as unlink7}from"node:fs/promises";import{statfsSync as statfsSync4}from"node:fs";import{dirname as dirname77,join as join259}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(
|
|
29900
29915
|
path6)&&!path6.split("/").includes("node_modules")}var hashes=new Map;async function fileSha256(full,size3,mtimeMs){let key7=`${full}\0${size3}\0${mtimeMs}`,known=hashes.get(key7);if(known)return known;let hash4=createHash119("sha256");for await(let chunk of createReadStream10(full))hash4.update(chunk);let digest5=hash4.digest("hex");return hashes.size>=MAX_FILES3&&hashes.delete(hashes.keys().next().value),hashes.set(key7,digest5),digest5}async function listBotFiles(dataDir,botIds){let out=[],walk6=async relative27=>{
|
|
29901
|
-
let names5;try{names5=(await readdir13(
|
|
29902
|
-
|
|
29903
|
-
"tmp","move-files"),partialPath=(dataDir,sha2567,size3)=>
|
|
29904
|
-
(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=
|
|
29916
|
+
let names5;try{names5=(await readdir13(join259(dataDir,relative27))).sort()}catch{return}for(let name6 of names5){if(out.length>=MAX_FILES3)return;let path6=`${relative27}/${name6}`,info2=await lstat10(join259(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(
|
|
29917
|
+
join259(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=>join259(dataDir,
|
|
29918
|
+
"tmp","move-files"),partialPath=(dataDir,sha2567,size3)=>join259(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(join259(folder3,name6)).catch(()=>null);info2&&now2-info2.mtimeMs>PARTIAL_MAX_AGE_MS&&await unlink7(join259(folder3,name6)).catch(()=>{})}}function rawBody(req,limit2){return new Promise(
|
|
29919
|
+
(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=join259(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}
|
|
29905
29920
|
return(await lstat10(at8).catch(()=>null))?.isDirectory()===!0}async function sha256Of(full){try{let hash4=createHash119("sha256");for await(let chunk of createReadStream10(full))hash4.update(chunk);return hash4.digest("hex")}catch{return null}}var putSchema=external_exports.object({path:external_exports.string().max(4096),size:external_exports.coerce.number().int().min(0).max(Number.MAX_SAFE_INTEGER),sha256:external_exports.string().regex(SHA3),offset:external_exports.coerce.number().int().min(
|
|
29906
|
-
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=
|
|
29921
|
+
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=join259(at8,part2);let info2=await lstat10(at8).catch(()=>null);
|
|
29907
29922
|
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(
|
|
29908
29923
|
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,
|
|
29909
|
-
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=
|
|
29910
|
-
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=
|
|
29924
|
+
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=join259(deps.
|
|
29925
|
+
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=join259(staging(deps.dataDir),`${randomUUID81()}.placing`);return await link4(partial2,placed),
|
|
29911
29926
|
await rename7(placed,target4),await unlink7(partial2).catch(()=>{}),{status:201,body:{stored:!0}}}if(there)return{status:409,body:{conflict:!0}};try{await link4(partial2,target4)}catch(error66){if(error66.code==="EEXIST")return{status:409,body:{conflict:!0}};throw error66}return await unlink7(partial2).catch(()=>{}),{status:201,body:{stored:!0}}}async function moveFilesRoute(deps,{req,res,path:path6,method:method2,url:url2,auth,json:json7}){if(path6!=="/api/cloud-send/files")return!1;if(res.setHeader(
|
|
29912
29927
|
"cache-control","no-store"),method2==="GET"&&url2.searchParams.has("path")){let part2=partSchema.safeParse(Object.fromEntries(url2.searchParams)),bytes4=part2.success&&movedFilePath(part2.data.path)?await readPart(deps.dataDir,part2.data):null;return bytes4?(res.writeHead(200,{"content-type":"application/octet-stream","content-length":String(bytes4.length)}),res.end(bytes4),!0):(json7(res,404,{error:"no such bot file"}),!0)}if(method2==="GET")return await tidyPartials(deps.dataDir),json7(res,200,
|
|
29913
29928
|
{v:1,files:await listBotFiles(deps.dataDir,deps.bots().map(bot=>bot.id)),space:space(deps.dataDir)}),!0;if(method2!=="POST")return json7(res,405,{error:"method not allowed"}),!0;if(!deps.owner(auth))return await rawBody(req,0),json7(res,403,{error:"Only My Cloud's owner can move files into it."}),!0;let query2=putSchema.safeParse(Object.fromEntries(url2.searchParams));if(!query2.success)return await rawBody(req,0),json7(res,400,{error:"send ?path, size, sha256, offset and mode"}),!0;let answer2=await takePart(
|
|
29914
29929
|
deps,req,query2.data);return json7(res,answer2.status,answer2.body),!0}init_zod();var LEASE_MS=10*6e4,askSchema2=external_exports.object({v:external_exports.literal(1),holder:external_exports.string().regex(/^[\w-]{8,128}$/u),label:external_exports.string().max(120).optional(),release:external_exports.literal(!0).optional()});function createMoveLeases(now2=Date.now){let held4=null;return{ask(holder,label4){return held4&&held4.holder!==holder&&held4.until>now2()?held4:(held4={holder,label:label4||(held4?.holder===holder?held4.label:""),until:now2()+LEASE_MS},null)},
|
|
29915
29930
|
release(holder){held4?.holder===holder&&(held4=null)},held:()=>held4&&held4.until>now2()?held4:null}}async function moveLeaseRoute(deps,{req,res,path:path6,method:method2,auth,json:json7,readBody:readBody2}){if(path6!=="/api/cloud-send/lease")return!1;if(res.setHeader("cache-control","no-store"),method2!=="POST")return json7(res,405,{error:"method not allowed"}),!0;if(!deps.owner(auth))return req.resume(),json7(res,403,{error:"Only My Cloud's owner can move into it."}),!0;let asked=askSchema2.safeParse(
|
|
29916
|
-
await readBody2(req,4096));if(!asked.success)return json7(res,400,{error:"send { v: 1, holder, label }"}),!0;let{holder,label:label4="",release:release3}=asked.data;if(release3)return deps.leases.release(holder),json7(res,200,{v:1,held:!1}),!0;let other=deps.leases.ask(holder,label4.trim());return other?(json7(res,409,{v:1,held:!1,label:other.label,until:other.until}),!0):(json7(res,200,{v:1,held:!0,until:deps.leases.held()?.until??null}),!0)}init_zod();import{createHash as createHash120}from"node:crypto";import{lstatSync as lstatSync46,readdirSync as readdirSync59,readFileSync as
|
|
29931
|
+
await readBody2(req,4096));if(!asked.success)return json7(res,400,{error:"send { v: 1, holder, label }"}),!0;let{holder,label:label4="",release:release3}=asked.data;if(release3)return deps.leases.release(holder),json7(res,200,{v:1,held:!1}),!0;let other=deps.leases.ask(holder,label4.trim());return other?(json7(res,409,{v:1,held:!1,label:other.label,until:other.until}),!0):(json7(res,200,{v:1,held:!0,until:deps.leases.held()?.until??null}),!0)}init_zod();import{createHash as createHash120}from"node:crypto";import{lstatSync as lstatSync46,readdirSync as readdirSync59,readFileSync as readFileSync189}from"node:fs";import{hostname as hostname8}from"node:os";import{join as join260}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=[
|
|
29917
29932
|
"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(
|
|
29918
29933
|
name6=>[name6,structuredClone(source4[name6])])),sha2566=value3=>createHash120("sha256").update(value3).digest("hex"),hashOf=value3=>sha2566(canonicalJson(value3).replaceAll("\\\\","/")).slice(0,24);function rebased(value3,from,to2){let copy6=structuredClone(value3),paths2=restorePaths(from,to2);paths2.fields(copy6);for(let key7 of TEXTS)typeof copy6[key7]=="string"&&(copy6[key7]=paths2.text(copy6[key7]));return copy6}var definitionHash=(value3,names5,dataDir)=>hashOf(rebased(pick7(value3,names5),
|
|
29919
|
-
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=
|
|
29920
|
-
if(info2.isDirectory()){if(!walk6(full,path6,depth2+1))return!1;continue}if(!info2.isFile())return!1;let content4=
|
|
29934
|
+
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=join260(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=join260(folder3,entry2),path6=prefix?`${prefix}/${entry2}`:entry2,info2=lstatSync46(full);
|
|
29935
|
+
if(info2.isDirectory()){if(!walk6(full,path6,depth2+1))return!1;continue}if(!info2.isFile())return!1;let content4=readFileSync189(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(
|
|
29921
29936
|
b11.path)).map(file3=>`${file3.executable?"x":"-"} ${file3.path} ${sha2566(file3.content)}`)];return sha2566(lines.join(`
|
|
29922
29937
|
`)).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=>{
|
|
29923
29938
|
let text31=readLibrarySkillFile(entry2.name);return text31===null?[]:[{entry:entry2,text:text31}]})}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(
|
|
@@ -29987,9 +30002,9 @@ deps.cloudHome&&deps.automations&&await automationsOffRoute({automations:deps.au
|
|
|
29987
30002
|
...bot?{bot}:{},...scope?{bots:scope}:{}}),store:deps.chats.store,dataDir:deps.chats.dataDir,connections:deps.connections??(async()=>[]),heads:threadHeads,...move3?{kinds:move3,teamMemory:move3.teamMemory}:{},...bot?{bot}:{},attachments:url2.searchParams.get("attachments")!=="0",files:url2.searchParams.get("files")!=="0",...scope?{scope}:{}})})):json7(res,404,{error:"not found"});if(path6==="/api/cloud-send/verify-secrets"){if(!home2||!deps.connectionFingerprints)return json7(res,404,{error:"not\
|
|
29988
30003
|
found"});if(method2!=="POST")return json7(res,405,{error:"method not allowed"});let asked=external_exports.object({nonce:external_exports.string().regex(VERIFY_NONCE)}).safeParse(await readBody2(req,4096));return asked.success?(res.setHeader("cache-control","no-store"),json7(res,200,{v:1,vault:1,secrets:{...loginFingerprints(asked.data.nonce,deps.logins),...deps.connectionFingerprints(asked.data.nonce)}})):json7(res,400,{error:"send { nonce }: at least 32 random bytes, base64url"})}if(path6!=="\
|
|
29989
30004
|
/api/cloud-send")return PASS;if(method2!=="GET")return json7(res,405,{error:"method not allowed"});res.setHeader("cache-control","no-store");let summary3=cloudSendSummary(sources2,{move:url2.searchParams.get("move")==="1",leaving:!home2,...bot?{bot}:{},...scope?{bots:scope}:{}}),item=url2.searchParams.get("item"),items=item===null?summary3.items:summary3.items.filter(entry2=>entry2.key===item||entry2.kind==="skill"&&item===`bot:${entry2.bot}`);return json7(res,200,{...summary3,items,vault:1,...deps.
|
|
29990
|
-
chats?{chats:1}:{}})}}import{hostname as hostname9}from"node:os";import{join as
|
|
30005
|
+
chats?{chats:1}:{}})}}import{hostname as hostname9}from"node:os";import{join as join261}from"node:path";init_mcp_registry();init_tool_scope();init_atomic();import{readFileSync as readFileSync190}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.
|
|
29991
30006
|
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}\
|
|
29992
|
-
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(
|
|
30007
|
+
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(readFileSync190(
|
|
29993
30008
|
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.
|
|
29994
30009
|
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.
|
|
29995
30010
|
some(connector=>serves(bot,connector)));if(!speaker2)return;let lines=left2.filter(connector=>serves(speaker2,connector)),link5=lines.some(connector=>connector.why.kind==="mail")?`
|
|
@@ -30018,13 +30033,13 @@ return adopted2.ok?json7(res,200,{[adopted2.outcome]:!0}):json7(res,adopted2.sta
|
|
|
30018
30033
|
outcome;try{outcome="share"in asked?await deps.adoptShare(asked.share):await deps.adoptOwn(asked.apiKey,asked.userId)}catch(error66){return json7(res,502,{error:error66 instanceof Error&&error66.message?error66.message.slice(0,300):"Connected apps could not be shared."})}if("shared"in outcome)return json7(res,200,{shared:!0});let wanted=[...new Set(asked.apps??[])],connected=wanted.length?await deps.composioConnected(wanted).catch(()=>({})):{};return json7(res,200,{kept:!0,missing:wanted.filter(
|
|
30019
30034
|
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.
|
|
30020
30035
|
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&&
|
|
30021
|
-
deps.stayedNotices?createStayedNotices({...deps.stayedNotices,origin:deps.cloudHome.publicOrigin,file:
|
|
30036
|
+
deps.stayedNotices?createStayedNotices({...deps.stayedNotices,origin:deps.cloudHome.publicOrigin,file:join261(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(
|
|
30022
30037
|
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(
|
|
30023
30038
|
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(
|
|
30024
30039
|
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())}:
|
|
30025
30040
|
what.kind==="connection-release"?releaseConnection(what.id,what.digest,{...sources2(),forgetSignIn:name6=>deps.mcpOAuth.forget(name6)}):answerConnection(what.id,sources2())},prompt:(bot,lent)=>prompt?.(bot,lent)??"",moved:language=>stayed?.moved(language),personTurn:(bot,threadId)=>stayed?.personTurn(bot,threadId)}}function createUpdateCheckRoutes(deps){return async({res,path:path6,method:method2,json:json7})=>{if(path6!=="/api/updates/check"||method2!=="GET")return PASS;try{return json7(res,200,await deps.check())}catch(error66){return json7(res,502,{error:`Could not check for updates: ${error66 instanceof Error?error66.message:String(error66)}`})}}}function serverUpdateChecker(where2){return createUpdateChecker({current:serverVersion(),install:installKind({...where2,serverRoot:SERVER_ROOT}),channel:updateChannel()})}function seatCount(list10,sessions2){let people=new Set;for(let entry2 of[...list10.admins,...list10.members])entry2.startsWith("@")||people.add(entry2.trim().toLowerCase());let paired=!1,ownerKnown=list10.admins.some(entry2=>!entry2.startsWith("@"));for(let session of sessions2)session.token||(session.email?(people.add(session.email.trim().toLowerCase()),session.scopes?.includes("admin")&&(ownerKnown=!0)):paired=!0);return people.size+(paired&&!ownerKnown?1:0)}function createSeatsRoutes(deps){return async({
|
|
30026
|
-
res,path:path6,method:method2,json:json7})=>path6!=="/api/seats"||method2!=="GET"?PASS:json7(res,200,{seats:seatCount(deps.signInList(),deps.sessions())})}init_atomic();import{readFileSync as
|
|
30027
|
-
"UTC")}function adoptSavedTimeZone(dataDir,env=process.env){let saved;try{saved=JSON.parse(
|
|
30041
|
+
res,path:path6,method:method2,json:json7})=>path6!=="/api/seats"||method2!=="GET"?PASS:json7(res,200,{seats:seatCount(deps.signInList(),deps.sessions())})}init_atomic();import{readFileSync as readFileSync191}from"node:fs";import{join as join262}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||
|
|
30042
|
+
"UTC")}function adoptSavedTimeZone(dataDir,env=process.env){let saved;try{saved=JSON.parse(readFileSync191(join262(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(join262(dataDir,TIME_ZONE_FILE),`${JSON.stringify({version:1,timeZone:zone})}
|
|
30028
30043
|
`,{mode:384}),env.TZ=zone,!0)}function createTimeZoneRoutes(deps){return deps.adopts&&adoptSavedTimeZone(deps.dataDir),async({req,res,path:path6,method:method2,json:json7,readBody:readBody2})=>{if(path6!=="/api/time-zone")return PASS;if(method2==="GET")return json7(res,200,{timeZone:currentTimeZone(),adopts:deps.adopts});if(method2!=="PUT")return PASS;if(!deps.adopts)return json7(res,409,{error:"This computer tells time in its own time zone."});let zone=knownTimeZone((await readBody2(req,4096))?.timeZone);if(!zone)return json7(
|
|
30029
30044
|
res,400,{error:"timeZone must be an IANA time zone name, like Europe/London."});let changed3=useTimeZone(deps.dataDir,zone);return changed3&&deps.changed(zone),json7(res,200,{timeZone:zone,changed:changed3})}}var ID21=/^[\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"&&ID21.test(value3.profile)&&value3.bot===void 0?{profile:value3.profile}:typeof value3.bot=="string"&&ID21.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){
|
|
30030
30045
|
return async({req,res,url:url2,path:path6,method:method2,json:json7,readBody:readBody2})=>{if(path6==="/api/browser-sites"&&method2==="GET"){let which2=ref3({profile:url2.searchParams.get("profile")??void 0,bot:url2.searchParams.get("bot")??void 0});if(!which2)return json7(res,400,{error:"Name one browser profile or one bot."});let target5=await deps.target(which2,threadOf(url2.searchParams.get("threadId")));if("error"in target5)return json7(res,target5.status,{error:target5.error});res.setHeader(
|
|
@@ -30072,7 +30087,7 @@ let asked=answers===void 0?void 0:deps.node(answers),requester=asked?.parentId==
|
|
|
30072
30087
|
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.
|
|
30073
30088
|
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},
|
|
30074
30089
|
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(
|
|
30075
|
-
BURST_PLAN_LIMITS,host3.tier)?BURST_PLAN_LIMITS[host3.tier]:void 0)??SMALL_PLAN:{parallel:host3.maxParallel??OPEN_SOURCE_PARALLEL,maxTasks:MAX_TASKS,smallPlan:!1}}import{randomUUID as randomUUID82}from"node:crypto";var BurstLane=class{deps;running=0;pumping=!1;again=!1;constructor(deps){this.deps=deps}runningCount(){return this.running}release(){this.running=Math.max(0,this.running-1),this.pump()}pump(){if(this.pumping){this.again=!0;return}this.pumping=!0;try{do for(this.again=!1;this.running<this.deps.parallel()&&this.deps.hasRoom();){let slot=this.deps.next();if(slot===void 0)break;this.running+=1,this.deps.begin(slot)}while(this.again)}finally{this.pumping=!1}}};import{chmodSync as chmodSync16,closeSync as closeSync37,mkdirSync as
|
|
30090
|
+
BURST_PLAN_LIMITS,host3.tier)?BURST_PLAN_LIMITS[host3.tier]:void 0)??SMALL_PLAN:{parallel:host3.maxParallel??OPEN_SOURCE_PARALLEL,maxTasks:MAX_TASKS,smallPlan:!1}}import{randomUUID as randomUUID82}from"node:crypto";var BurstLane=class{deps;running=0;pumping=!1;again=!1;constructor(deps){this.deps=deps}runningCount(){return this.running}release(){this.running=Math.max(0,this.running-1),this.pump()}pump(){if(this.pumping){this.again=!0;return}this.pumping=!0;try{do for(this.again=!1;this.running<this.deps.parallel()&&this.deps.hasRoom();){let slot=this.deps.next();if(slot===void 0)break;this.running+=1,this.deps.begin(slot)}while(this.again)}finally{this.pumping=!1}}};import{chmodSync as chmodSync16,closeSync as closeSync37,mkdirSync as mkdirSync123,openSync as openSync34}from"node:fs";import{dirname as dirname78,join as join263}from"node:path";import{DatabaseSync as DatabaseSync8}from"node:sqlite";var EMPTY8={queued:0,running:0,done:0,failed:0,cancelled:0},SCHEMA2=`
|
|
30076
30091
|
CREATE TABLE IF NOT EXISTS bursts (
|
|
30077
30092
|
id TEXT PRIMARY KEY,
|
|
30078
30093
|
json TEXT NOT NULL,
|
|
@@ -30088,7 +30103,7 @@ CREATE TABLE IF NOT EXISTS burst_children (
|
|
|
30088
30103
|
PRIMARY KEY (burst_id, seq)
|
|
30089
30104
|
);
|
|
30090
30105
|
CREATE INDEX IF NOT EXISTS burst_children_status ON burst_children(burst_id, status, seq);
|
|
30091
|
-
`,titleOf=item=>{let line6=item.replace(/\s+/g," ").trim();return line6.length>80?`${line6.slice(0,79).trimEnd()}\u2026`:line6},sampleOf=items=>items.slice(0,5).map(titleOf);function openBurstStore(dataDir){let file3=dataDir===":memory:"?":memory:":
|
|
30106
|
+
`,titleOf=item=>{let line6=item.replace(/\s+/g," ").trim();return line6.length>80?`${line6.slice(0,79).trimEnd()}\u2026`:line6},sampleOf=items=>items.slice(0,5).map(titleOf);function openBurstStore(dataDir){let file3=dataDir===":memory:"?":memory:":join263(dataDir,"bursts.db");file3!==":memory:"&&(mkdirSync123(dirname78(file3),{recursive:!0}),closeSync37(openSync34(file3,"a",384)),chmodSync16(file3,384));let db2=new DatabaseSync8(file3);db2.exec("PRAGMA journal_mode = WAL"),db2.exec(SCHEMA2);let rows2={
|
|
30092
30107
|
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\
|
|
30093
30108
|
< ?"),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\
|
|
30094
30109
|
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.
|
|
@@ -30261,16 +30276,16 @@ push({slug:slug3,name:name6,category:text29(raw.category,80)??"",integrations:Ar
|
|
|
30261
30276
|
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(
|
|
30262
30277
|
`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\
|
|
30263
30278
|
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,
|
|
30264
|
-
...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
|
|
30265
|
-
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(
|
|
30266
|
-
d"))??readText7(
|
|
30279
|
+
...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 readFileSync192,readdirSync as readdirSync60,statSync as statSync48}from"node:fs";import{basename as basename35,join as join264}from"node:path";var MAX_FILE_BYTES3=256e3,MAX_DIR_ENTRIES=400;function readText7(path6){try{return statSync48(path6).size>MAX_FILE_BYTES3?null:readFileSync192(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(join264(cwd,"package.json"));if(!raw)return{deps:new Set};try{let parsed2=JSON.parse(raw);if(!parsed2||
|
|
30280
|
+
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(join264(cwd,"README.m\
|
|
30281
|
+
d"))??readText7(join264(cwd,"readme.md"))??readText7(join264(cwd,"README"));if(!raw)return{};let title3,summary3;for(let line6 of raw.slice(0,64e3).split(`
|
|
30267
30282
|
`)){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",
|
|
30268
30283
|
"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",
|
|
30269
30284
|
"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\
|
|
30270
|
-
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(
|
|
30285
|
+
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(join264(
|
|
30271
30286
|
cwd,"requirements.txt"))??""}
|
|
30272
|
-
${readText7(
|
|
30273
|
-
path6);found2&&evidence.push(found2)}if(detector.role==="docs"&&evidence.length>0){let hasMkdocs=evidence.includes("mkdocs.yml"),hasMarkdown=listNames2(
|
|
30287
|
+
${readText7(join264(cwd,"pyproject.toml"))??""}`.toLowerCase(),hasDep=dep=>pkg2.deps.has(dep)||pythonDeps.length>1&&pythonDeps.includes(dep),pathEvidence=path6=>path6.includes("/")?isDir(join264(cwd,path6))&&listNames2(join264(cwd,path6)).length>0?`${path6}/`:null:entries4.has(path6)?isDir(join264(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(
|
|
30288
|
+
path6);found2&&evidence.push(found2)}if(detector.role==="docs"&&evidence.length>0){let hasMkdocs=evidence.includes("mkdocs.yml"),hasMarkdown=listNames2(join264(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)&&
|
|
30274
30289
|
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\
|
|
30275
30290
|
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\
|
|
30276
30291
|
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\
|
|
@@ -30339,9 +30354,9 @@ groups.map(created=>({...created,messages:[]})),routines:imported.routines,offer
|
|
|
30339
30354
|
task2)).map(task2=>task2.threadId));return json7(res,200,{switched:switched.length,busy:busy.length,bot:deps.reply(bot.id)})}}function createUndoRoutes(deps){return async({req,res,path:path6,method:method2,auth,json:json7,readBody:readBody2})=>{let m3=path6.match(/^\/api\/threads\/([\w-]+)\/undo$/);if(!m3||method2!=="POST")return PASS;let threadId=m3[1],body2=await readBody2(req),requestId=typeof body2?.requestId=="string"?body2.requestId:"";if(!requestId)return json7(res,400,{error:"requestId is required"});let refusal7=deps.refusal(auth,threadId,requestId);if(refusal7)return json7(res,403,{error:refusal7});await deps.
|
|
30340
30355
|
undo(auth,res,threadId,requestId)}}import{createHash as createHash124}from"node:crypto";import{request as request8}from"node:http";import{ServerResponse}from"node:http";import{Socket}from"node:net";var HANDSHAKE_MS=1e4,EARLY_BYTES=64*1024;function createUpgrades(){let owners=[],pending3=new Map,stopped=!1;return{route(owns){owners.push(owns)},attach(server2,handle2){server2.on("upgrade",(req,socket,head)=>{if(stopped||!(socket instanceof Socket)){socket.destroy();return}let res=new ServerResponse(req);res.assignSocket(socket),res.setHeader("connection","close"),socket.on("error",()=>socket.destroy()),res.once("finish",()=>socket.
|
|
30341
30356
|
end(()=>socket.destroy()));let path6;try{path6=new URL(req.url??"","http://localhost").pathname}catch{res.writeHead(400).end();return}if(!owners.some(owns=>owns(path6))){res.writeHead(404).end();return}let upgrade={socket,head,release:()=>socket.off("data",buffer)},buffer=data4=>{upgrade.head.length+data4.length>EARLY_BYTES?socket.destroy():upgrade.head=Buffer.concat([upgrade.head,data4])};socket.on("data",buffer),socket.once("end",()=>socket.destroy()),socket.once("close",()=>{upgrade.release(),
|
|
30342
|
-
pending3.delete(req)}),pending3.set(req,upgrade);let timeout3=setTimeout(()=>socket.destroy(),HANDSHAKE_MS);timeout3.unref(),socket.once("close",()=>clearTimeout(timeout3)),handle2(req,res).catch(()=>{res.headersSent?socket.destroy():res.writeHead(500).end()}).finally(()=>clearTimeout(timeout3))})},pending(req){return pending3.get(req)},close(){stopped=!0;for(let upgrade of pending3.values())upgrade.socket.destroy()}}}var ROUTE2=/^\/api\/desktop-viewer\/(local\/(?:shared|bot-[a-f0-9]{64}|pool-\d+)|vps\/[\w-]+)(\/websockify)?$/,HANDSHAKE_MS2=1e4,RECHECK_MS5=5e3,WS_GUID="258EAFA5-E914-47DA-95CA-C5AB0DC85B11",
|
|
30357
|
+
pending3.delete(req)}),pending3.set(req,upgrade);let timeout3=setTimeout(()=>socket.destroy(),HANDSHAKE_MS);timeout3.unref(),socket.once("close",()=>clearTimeout(timeout3)),handle2(req,res).catch(()=>{res.headersSent?socket.destroy():res.writeHead(500).end()}).finally(()=>clearTimeout(timeout3))})},pending(req){return pending3.get(req)},close(){stopped=!0;for(let upgrade of pending3.values())upgrade.socket.destroy()}}}var ROUTE2=/^\/api\/desktop-viewer\/(local\/(?:shared|bot-[a-f0-9]{64}|pool-\d+)|vps\/[\w-]+)(\/websockify)?$/,HANDSHAKE_MS2=1e4,RECHECK_MS5=5e3,WS_GUID="258EAFA5-E914-47DA-95CA-C5AB0DC85B11",BOT_ID9=/^[\w-]+$/,CONTROL_LEASE=/^[A-Za-z0-9_-]{16,120}$/;function desktopViewerUrl(target4,threadId){return`/desktop-viewer#${new URLSearchParams({target:target4,...threadId?{threadId}:{}})}`}function createDesktopViewer(deps){let upgrades2=deps.upgrades??createUpgrades(),ownGate=deps.upgrades===void 0;upgrades2.
|
|
30343
30358
|
route(path6=>!!ROUTE2.exec(path6)?.[2]);let viewers=new Map,stopped=!1;return{route:async({req,res,url:url2,path:path6,method:method2,auth,json:json7})=>{let match5=ROUTE2.exec(path6);if(!match5)return PASS;if(res.setHeader("cache-control","private, no-store"),method2!=="GET")return json7(res,405,{error:"method not allowed"});if(!auth.scopes.includes("admin")||!isSameOrigin(req))return json7(res,403,{error:"forbidden"});let botId=url2.searchParams.get("botId"),controlLeaseId=url2.searchParams.get(
|
|
30344
|
-
"controlLeaseId"),threadId=url2.searchParams.get("threadId")??void 0;if(botId===null!=(controlLeaseId===null))return json7(res,400,{error:"botId and controlLeaseId go together"});if(botId!==null&&(!
|
|
30359
|
+
"controlLeaseId"),threadId=url2.searchParams.get("threadId")??void 0;if(botId===null!=(controlLeaseId===null))return json7(res,400,{error:"botId and controlLeaseId go together"});if(botId!==null&&(!BOT_ID9.test(botId)||!CONTROL_LEASE.test(controlLeaseId)||!deps.lease||threadId!==void 0&&!BOT_ID9.test(threadId)))return json7(res,400,{error:"botId, threadId or controlLeaseId is not valid"});if(botId===null&&threadId!==void 0)return json7(res,400,{error:"threadId needs botId and controlLeaseId"});if(botId!==
|
|
30345
30360
|
null&&(match5[1]==="local/shared"||match5[1].startsWith("local/pool-")))return json7(res,409,{error:"Phone control requires a per-bot Local VM. Select per-bot mode in Settings \u2192 Computers."});let bound2=botId===null?void 0:deps.lease(match5[1],botId,controlLeaseId,threadId);if(botId!==null&&!bound2)return json7(res,409,{error:"Take control of this computer first"});let holds=()=>bound2?.()??!0,target4=deps.target(match5[1]);if(!target4)return json7(res,404,{error:"Desktop not found"});let pending3=upgrades2.
|
|
30346
30361
|
pending(req);if(pending3&&stopped){pending3.socket.destroy();return}let upgrade;if(pending3){let viewer={socket:pending3.socket,close:()=>pending3.socket.destroy()};auth.kind==="session"&&(viewer.owner=auth.session.id),botId!==null&&(viewer.botId=botId),viewers.set(req,viewer),pending3.socket.once("close",()=>viewers.delete(req)),upgrade=viewer}let connection;try{connection=await target4.resolve()}catch(error66){let status5=error66&&typeof error66=="object"&&"status"in error66?error66.status:502;
|
|
30347
30362
|
return json7(res,typeof status5=="number"&&status5>=400&&status5<600?status5:502,{error:"The desktop is not available. Open it again from Limix Bot."})}if(res.destroyed||upgrade?.socket.destroyed)return;let live2=()=>deps.live(auth)&&deps.target(match5[1])?.key===target4.key&&(connection.live?.()??!0);if(!live2())return json7(res,401,{error:"Viewer access expired"});if(!holds())return json7(res,409,{error:"Take control of this computer first"});if(!Number.isInteger(connection.port)||connection.port<
|
|
@@ -30354,11 +30369,11 @@ Connection: Upgrade\r
|
|
|
30354
30369
|
Sec-WebSocket-Accept: ${accept}\r
|
|
30355
30370
|
\r
|
|
30356
30371
|
`),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.
|
|
30357
|
-
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
|
|
30372
|
+
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 join265}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}};
|
|
30358
30373
|
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\
|
|
30359
30374
|
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!=
|
|
30360
30375
|
"string");if(files2.length>UPLOAD_MAX_FILES)throw new UploadError(413,`A page takes at most ${UPLOAD_MAX_FILES} files at once.`);return Promise.all(files2.map(async file3=>({name:file3.name,bytes:new Uint8Array(await file3.arrayBuffer())})))}async function answerUpload(req,deps,browser,owner2,chooser){let files2;try{files2=await uploadedFiles(req)}catch(error66){if(!(error66 instanceof UploadError))throw error66;return{status:error66.status,error:error66.message,unread:!0}}let paths2=storeUploads(
|
|
30361
|
-
files2,
|
|
30376
|
+
files2,join265(deps.dataDir,"browser-uploads"));if(await deps.viewers.answerFileChooser(browser,owner2,chooser,paths2).catch(()=>!1))return null;for(let file3 of paths2)rmSync65(dirname79(file3),{recursive:!0,force:!0});return{status:409,error:PICKER_CLOSED}}function createBrowserViewerRoutes(deps){deps.upgrades.route(path6=>STREAM.test(path6));let uploading=new Set;return async({req,res,url:url2,path:path6,method:method2,auth,json:json7,readBody:readBody2})=>{let live2=LIVE2.exec(path6),stream2=live2?
|
|
30362
30377
|
null:STREAM.exec(path6),upload=live2||stream2?null:UPLOAD2.exec(path6),download2=live2||stream2||upload?null:DOWNLOAD.exec(path6),botId=(live2??stream2??upload??download2)?.[1];if(!botId)return PASS;res.setHeader("cache-control","no-store");let pending3=stream2?deps.upgrades.pending(req):void 0;if(stream2){if(method2!=="GET")return json7(res,405,{error:"method not allowed"});if(!pending3)return json7(res,426,{error:"WebSocket upgrade required"});if(!isSameOrigin(req))return json7(res,403,{error:"\
|
|
30363
30378
|
forbidden: cross-origin request"})}let threadId=url2.searchParams.get("threadId"),audience2=deps.audience(auth,threadId);if(!audience2)return json7(res,404,{error:"no such conversation"});let browser=await deps.browser(botId,audience2);if("error"in browser)return json7(res,browser.status,{error:browser.error});let failure11=await deps.authorize(req,auth);if(failure11)return json7(res,failure11.status,{error:failure11.error});let owner2=ownerOf2(auth),person2=deps.person(auth),isCurrent=()=>deps.
|
|
30364
30379
|
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\
|
|
@@ -30426,14 +30441,14 @@ o your key is not sent in the clear.${TYPE_MODEL}`);let response;try{response=aw
|
|
|
30426
30441
|
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\
|
|
30427
30442
|
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 text31=await readCatalog(response,MAX_CATALOG_BYTES3).catch(()=>{throw failure11(
|
|
30428
30443
|
"The gateway closed the connection while sending its model catalog. Try again, or check the gateway's logs.")});if(text31===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(text31)}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./+-]*$/:
|
|
30429
|
-
CLAUDE_MODEL_ID,models=new Set;for(let item of Array.isArray(data4)?data4:[]){if(models.size>=MAX_MODELS5)break;let id12=item&&typeof item=="object"?item.id:void 0;typeof id12=="string"&&id12.length<=160&&pattern.test(id12)&&(codex||id12!=="default")&&models.add(id12)}if(!models.size)throw failure11(`The gateway returned no supported model IDs. Connect a provider account in the gateway and check its /models catalog.${TYPE_MODEL}`);setModels([...models])}init_zod();import{randomUUID as randomUUID85}from"node:crypto";import{join as
|
|
30444
|
+
CLAUDE_MODEL_ID,models=new Set;for(let item of Array.isArray(data4)?data4:[]){if(models.size>=MAX_MODELS5)break;let id12=item&&typeof item=="object"?item.id:void 0;typeof id12=="string"&&id12.length<=160&&pattern.test(id12)&&(codex||id12!=="default")&&models.add(id12)}if(!models.size)throw failure11(`The gateway returned no supported model IDs. Connect a provider account in the gateway and check its /models catalog.${TYPE_MODEL}`);setModels([...models])}init_zod();import{randomUUID as randomUUID85}from"node:crypto";import{join as join267}from"node:path";init_zod();import{randomUUID as randomUUID84}from"node:crypto";import{join as join266}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(
|
|
30430
30445
|
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(),
|
|
30431
30446
|
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\
|
|
30432
30447
|
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.
|
|
30433
30448
|
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.
|
|
30434
30449
|
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"?{}:
|
|
30435
30450
|
{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.
|
|
30436
|
-
driver!=="claudeAgent"||isClaudeEndpoint(entry2)||rawConfig2(entry2).bedrock===!0)continue;let cli=rawConfig2(entry2).cli;if(typeof cli=="string"&&cli)return cli}}function newClaudeEndpoint(cfg2,body2){let instances=persistableInstanceConfigs(cfg2),instanceId=`claude-${randomUUID84()}`,cli=inheritedCli(instances),entry2={driver:"claudeAgent",displayName:body2.displayName,access:"custom",config:{...cli?{cli}:{},configDir:
|
|
30451
|
+
driver!=="claudeAgent"||isClaudeEndpoint(entry2)||rawConfig2(entry2).bedrock===!0)continue;let cli=rawConfig2(entry2).cli;if(typeof cli=="string"&&cli)return cli}}function newClaudeEndpoint(cfg2,body2){let instances=persistableInstanceConfigs(cfg2),instanceId=`claude-${randomUUID84()}`,cli=inheritedCli(instances),entry2={driver:"claudeAgent",displayName:body2.displayName,access:"custom",config:{...cli?{cli}:{},configDir:join266(DATA_DIR,"providers",instanceId),requireApiKey:!0,endpointModels:body2.
|
|
30437
30452
|
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\
|
|
30438
30453
|
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.
|
|
30439
30454
|
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)
|
|
@@ -30441,16 +30456,16 @@ throw Object.assign(new Error("Enter the endpoint's token."),{status:400});retur
|
|
|
30441
30456
|
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(
|
|
30442
30457
|
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}):
|
|
30443
30458
|
described}function newCodexEndpoint(cfg2,body2){let instances=persistableInstanceConfigs(cfg2),instanceId=`codex-endpoint-${randomUUID85()}`,source4=Object.values(instances).find(entry2=>entry2.driver==="codex"&&configOf(entry2).cli),cli=source4?configOf(source4).cli:void 0;return instances[instanceId]={driver:"codex",access:"custom",displayName:body2.displayName,config:{...cli?{cli}:{},endpoint:{url:endpointBaseUrl(body2.baseUrl),...body2.model?{model:body2.model,models:[body2.model]}:{models:officialModels(
|
|
30444
|
-
!0)}}},environment:{CODEX_HOME:
|
|
30459
|
+
!0)}}},environment:{CODEX_HOME:join267(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.
|
|
30445
30460
|
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:{
|
|
30446
|
-
...configOf(entry2).endpoint,url:address3,...body2.model?{model:body2.model,models:[body2.model]}:{}}},environment:{...entry2.environment,OPENMAUSBOT_CODEX_API_KEY:token3}},{instances}}init_user_errors();init_provider_icon();import{randomUUID as randomUUID87}from"node:crypto";init_zod();import{randomUUID as randomUUID86}from"node:crypto";import{join as
|
|
30461
|
+
...configOf(entry2).endpoint,url:address3,...body2.model?{model:body2.model,models:[body2.model]}:{}}},environment:{...entry2.environment,OPENMAUSBOT_CODEX_API_KEY:token3}},{instances}}init_user_errors();init_provider_icon();import{randomUUID as randomUUID87}from"node:crypto";init_zod();import{randomUUID as randomUUID86}from"node:crypto";import{join as join268}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\
|
|
30447
30462
|
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.
|
|
30448
30463
|
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\
|
|
30449
30464
|
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??
|
|
30450
30465
|
"",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(
|
|
30451
30466
|
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()??"").
|
|
30452
30467
|
filter(Boolean);return[...new Set([(fields2.model??"").trim(),...tiers2].filter(Boolean))]}function inheritedCli2(instances){for(let entry2 of Object.values(instances)){if(entry2.driver!=="claudeAgent"||isClaudeBedrock(entry2))continue;let cli=rawConfig3(entry2).cli;if(typeof cli=="string"&&cli)return cli}}function newClaudeBedrock(cfg2,body2){let instances=persistableInstanceConfigs(cfg2),instanceId=`claude-${randomUUID86()}`,cli=inheritedCli2(instances),entry2={driver:"claudeAgent",displayName:body2.
|
|
30453
|
-
displayName,access:"custom",config:{...cli?{cli}:{},configDir:
|
|
30468
|
+
displayName,access:"custom",config:{...cli?{cli}:{},configDir:join268(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});
|
|
30454
30469
|
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!==
|
|
30455
30470
|
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):
|
|
30456
30471
|
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(
|
|
@@ -30522,12 +30537,12 @@ added("mcp",name6,auth.kind==="session"?auth.session.email??null:null),answer2(r
|
|
|
30522
30537
|
r was revoked"};if(!text31.trim())return{status:400,error:"Paste the JSON block first."};let parsed2=parseMcpServersImport(text31);if(!parsed2.ok)return{status:400,error:parsed2.error};let servers={};for(let[name6,server2]of Object.entries(parsed2.servers)){let placed=deps.place?await deps.place(server2,auth):{ok:!0,server:server2};if(!placed.ok)return{status:409,error:placed.error};servers[name6]=placed.server}return{servers}})):json7(res,415,{error:"content-type must be application/json"});let mcpServerRoute=/^\/api\/mcp\/servers\/([a-z][a-z0-9_-]{0,31})$/.
|
|
30523
30538
|
exec(path6);if(mcpServerRoute&&["PUT","PATCH","DELETE"].includes(method2)){if(method2!=="DELETE"&&!String(req.headers["content-type"]??"").toLowerCase().startsWith("application/json"))return json7(res,415,{error:"content-type must be application/json"});let name6=mcpServerRoute[1];if(method2==="DELETE"){let removed=config3.remove(name6);return removed.status<300&&deps.connectionHealth?.removed("mcp",name6),answer2(res,json7,removed)}let body2=await readBody2(req),current3=cfg2.mcpServers??{};if(!Object.
|
|
30524
30539
|
hasOwn(current3,name6))return json7(res,404,{error:mcpServerNotFound(name6)});let existing=parseStoredMcpServer(name6,current3[name6]);if(!existing.ok)return json7(res,400,{error:existing.error});if(method2==="PATCH"){let key7=body2&&typeof body2=="object"&&!Array.isArray(body2)&&Object.keys(body2).length===1?Object.keys(body2)[0]:void 0;return key7!=="enabled"&&key7!=="apps"||typeof body2[key7]!="boolean"?json7(res,400,{error:"Only an enabled or apps boolean can be changed here."}):answer2(res,
|
|
30525
|
-
json7,key7==="enabled"?config3.setEnabled(name6,body2.enabled):config3.setApps(name6,body2.apps))}let{vaultKeys:_keys,...fields2}=body2??{},parsed2=parseMcpServerMutation(name6,fields2,existing.server);return parsed2.ok?answer2(res,json7,config3.replace(name6,parsed2.server,vaultKeysOf(body2,ownsVault()))):json7(res,400,{error:parsed2.error})}return PASS}}import{join as
|
|
30540
|
+
json7,key7==="enabled"?config3.setEnabled(name6,body2.enabled):config3.setApps(name6,body2.apps))}let{vaultKeys:_keys,...fields2}=body2??{},parsed2=parseMcpServerMutation(name6,fields2,existing.server);return parsed2.ok?answer2(res,json7,config3.replace(name6,parsed2.server,vaultKeysOf(body2,ownsVault()))):json7(res,400,{error:parsed2.error})}return PASS}}import{join as join269}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;
|
|
30526
30541
|
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?.
|
|
30527
|
-
abort()},tick:tick2}}init_zod();init_atomic();import{readFileSync as
|
|
30542
|
+
abort()},tick:tick2}}init_zod();init_atomic();import{readFileSync as readFileSync193}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.
|
|
30528
30543
|
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.
|
|
30529
30544
|
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.
|
|
30530
|
-
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(
|
|
30545
|
+
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(readFileSync193(options2.file,"utf8")))}catch{}let timer4=null,flush=()=>{timer4&&(clearTimeout(timer4),
|
|
30531
30546
|
timer4=null);try{writeFileAtomic(options2.file,`${JSON.stringify(data4)}
|
|
30532
30547
|
`,{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={}){
|
|
30533
30548
|
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:"\
|
|
@@ -30539,7 +30554,7 @@ REFUSED2=/\b403\b|forbidden|insufficient[_ ](?:scope|permission)s?|permission de
|
|
|
30539
30554
|
`).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.
|
|
30540
30555
|
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=text31=>SIGNED_OUT4.test(text31)?{ok:!1,error:"sign-in"}:REFUSED2.test(text31)?{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)).
|
|
30541
30556
|
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 text31 of texts2)try{failedErrors(JSON.parse(text31),0,errors2),parsed2=!0}catch{}return!parsed2&&frame2.result.isError===!0&&errors2.push(...texts2),errors2.length?classify(errors2.join(`
|
|
30542
|
-
`).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:
|
|
30557
|
+
`).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:join269(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)?.
|
|
30543
30558
|
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.
|
|
30544
30559
|
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(
|
|
30545
30560
|
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)},
|
|
@@ -30556,7 +30571,7 @@ name6,result2);outcome&&store5.observe({kind:"mcp",id:name6},outcome)},added(kin
|
|
|
30556
30571
|
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.
|
|
30557
30572
|
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.
|
|
30558
30573
|
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(){
|
|
30559
|
-
background4?.stop(),store5?.flush()},checkNow:()=>background4?.tick()??Promise.resolve(null)}}init_zod();init_config3();import{rmSync as rmSync66}from"node:fs";import{join as
|
|
30574
|
+
background4?.stop(),store5?.flush()},checkNow:()=>background4?.tick()??Promise.resolve(null)}}init_zod();init_config3();import{rmSync as rmSync66}from"node:fs";import{join as join270}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.
|
|
30560
30575
|
|
|
30561
30576
|
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.
|
|
30562
30577
|
|
|
@@ -30594,10 +30609,10 @@ Rules: include EVERY routine you own (paused ones too) and EVERY skill enabled f
|
|
|
30594
30609
|
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.
|
|
30595
30610
|
`;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=[],
|
|
30596
30611
|
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}}
|
|
30597
|
-
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=>
|
|
30598
|
-
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,
|
|
30599
|
-
test(name6)).flatMap(name6=>{let stats=machine.fs.lstat(
|
|
30600
|
-
text:raw.toString("utf8")}]):[]})}function lookForGrokBot(machine){return{files:readExportFiles(machine),bots:rosterBots(machine)}}function removeOldCursorSignIn(dataDir){try{rmSync66(
|
|
30612
|
+
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=>join270(
|
|
30613
|
+
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,join270(folder3,slice5))?.rows).flatMap(row=>{let name6=shown2(row.name);return name6&&!row.isGroup?[name6]:[]})}function readExportFiles(machine){let folder3=join270(machine.home,"Downloads"),found2=(machine.fs.readdir(folder3)??[]).filter(name6=>GROK_EXPORT_FILE.
|
|
30614
|
+
test(name6)).flatMap(name6=>{let stats=machine.fs.lstat(join270(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(join270(folder3,name6),GROK_EXPORT_MAX_CHARS,!1);return raw?(budget-=raw.length,[{name:name6,modifiedAt,
|
|
30615
|
+
text:raw.toString("utf8")}]):[]})}function lookForGrokBot(machine){return{files:readExportFiles(machine),bots:rosterBots(machine)}}function removeOldCursorSignIn(dataDir){try{rmSync66(join270(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??
|
|
30601
30616
|
{},mcpPolicyRefusal:deps.mcpPolicyRefusal,persistMcpServers:deps.persistMcpServers,mcpConfigBusy:deps.mcpConfigBusy,claudeUserMcp:()=>claudeUserMcpEnabled(deps.cfg)};return async({req,res,path:path6,method:method2,auth,json:json7,readBody:readBody2})=>{if(path6===GROK_LOOK_PATH)return method2!=="GET"?json7(res,405,{error:"method not allowed"}):!deps.local||auth.kind!=="loopback"||auth.trust==="service"?json7(res,403,{error:LOCAL_ONLY}):(res.setHeader("Cache-Control","no-store"),json7(res,200,lookForGrokBot(
|
|
30602
30617
|
machine())));if(path6!==SETUP_IMPORT_PATH)return PASS;if(method2!=="GET"&&method2!=="POST")return json7(res,405,{error:"method not allowed"});if(!deps.local||auth.kind!=="loopback"||auth.trust==="service")return json7(res,403,{error:LOCAL_ONLY});if(res.setHeader("Cache-Control","no-store"),method2==="GET")return json7(res,200,detectSetup(machine(),host3));if(!String(req.headers["content-type"]??"").toLowerCase().startsWith("application/json"))return json7(res,415,{error:"content-type must be app\
|
|
30603
30618
|
lication/json"});let parsed2=requestSchema2.safeParse(await readBody2(req,4096));return!parsed2.success||!parsed2.data.skills&&!parsed2.data.tools?json7(res,400,{error:"Choose skills, tools or both."}):json7(res,200,applySetupImport(machine(),host3,parsed2.data))}}init_zod();init_config3();init_redact2();var RUNNING=new Set(["idle","ready","running"]),STARTING=new Set(["init","provisioning","provisioned","cloning"]),FAILED=new Set(["error","cancelled"]),MAX_BACKOFF_MS=12e4;function mapComputerState(machine,working){return machine?RUNNING.has(machine.state)?working?"working":"idle":STARTING.has(machine.state)?"starting":SLEEPING_BOAT_STATES.has(machine.state)?"asleep":FAILED.has(machine.state)?"problem":"off":"off"}function createFrameBudget(perSecond,now2){let tokens=perSecond,refilledAt=now2();
|
|
@@ -30687,9 +30702,9 @@ req));if(!parsed2.success)return json7(res,400,userError("serverError.department
|
|
|
30687
30702
|
includes(section4))return json7(res,404,userError("serverError.department.notFound"));let ids=external_exports.array(external_exports.string().regex(/^[\w-]+$/)).max(MAX_WORKSPACE_BOTS2),parsed2=external_exports.object({addBotIds:ids,removeBotIds:ids}).strict().safeParse(await readBody2(req));if(!parsed2.success)return json7(res,400,{error:"Provide addBotIds and removeBotIds"});for(let[botIds,destination]of[[parsed2.data.addBotIds,section4],[parsed2.data.removeBotIds,void 0]])for(let id12 of botIds){
|
|
30688
30703
|
let bot=store5.bot(id12);bot&&assertTeamComputerChangeIdle2(bot,{...bot,section:destination})}let result2=store5.updateTeamMembers(section4,parsed2.data.addBotIds,parsed2.data.removeBotIds);return result2.ok?json7(res,200,{sections:store5.sections,bots:result2.bots.map(wireBot2)}):json7(res,result2.reason==="unavailable"?404:409,result2.reason==="chief-conflict"?userError("serverError.department.moveChiefConflict"):result2.reason==="membership-changed"?userError("serverError.department.membershi\
|
|
30689
30704
|
pChanged"):{error:"One or more bots are unavailable"})}if(method2==="POST"&&path6==="/api/sidebar-sections"){let parsed2=createSidebarSectionSchema.safeParse(await readBody2(req));if(!parsed2.success)return json7(res,400,{error:"Provide a department name and up to 100 valid botIds"});let name6=parsed2.data.name.trim();if(name6.length>60)return json7(res,400,{error:"name must be at most 60 characters"});let botIds=[...new Set(parsed2.data.botIds)];if(!name6&&!botIds.length)return json7(res,400,{error:"\
|
|
30690
|
-
Department name is required"});for(let botId of botIds){let bot=store5.bot(botId);bot&&assertTeamComputerChangeIdle2(bot,{...bot,section:name6||void 0})}let result2=store5.setBotsSection(botIds,name6);return result2.ok?json7(res,200,{section:name6,sections:store5.sections,bots:result2.bots.map(wireBot2)}):result2.reason==="chief-conflict"?json7(res,409,{...userError("serverError.department.oneChief")}):json7(res,404,{error:"one or more bots are unavailable"})}return PASS}}init_redact();import{createReadStream as createReadStream13}from"node:fs";import{stat as stat15}from"node:fs/promises";import{join as
|
|
30705
|
+
Department name is required"});for(let botId of botIds){let bot=store5.bot(botId);bot&&assertTeamComputerChangeIdle2(bot,{...bot,section:name6||void 0})}let result2=store5.setBotsSection(botIds,name6);return result2.ok?json7(res,200,{section:name6,sections:store5.sections,bots:result2.bots.map(wireBot2)}):result2.reason==="chief-conflict"?json7(res,409,{...userError("serverError.department.oneChief")}):json7(res,404,{error:"one or more bots are unavailable"})}return PASS}}init_redact();import{createReadStream as createReadStream13}from"node:fs";import{stat as stat15}from"node:fs/promises";import{join as join271}from"node:path";import{createInterface as createInterface2}from"node:readline";var MAX_CACHED_MONTHS=24,cache4=new Map,loading=new Map;async function readFrom(file3,start,into){let stream2=createReadStream13(file3,{encoding:"utf8",start}),consumed=start,unparsed=0;for await(let line6 of createInterface2({input:stream2,crlfDelay:1/0})){consumed+=unparsed,unparsed=0;let bytes4=Buffer.byteLength(line6)+1;if(!line6){consumed+=bytes4;continue}try{let value3=JSON.parse(line6);isUsageRow(value3)&&into.push(value3),consumed+=bytes4}catch{unparsed=bytes4}}return Math.min(consumed,start+
|
|
30691
30706
|
stream2.bytesRead)}function monthRows(file3){let pending3=loading.get(file3);if(pending3)return pending3;let read4=loadMonth(file3).finally(()=>loading.delete(file3));return loading.set(file3,read4),read4}async function loadMonth(file3){let size3;try{size3=(await stat15(file3)).size}catch{return cache4.delete(file3),[]}let cached5=cache4.get(file3);if(cached5&&cached5.size===size3)return cached5.rows;let rows2=cached5&&cached5.size<size3?cached5.rows:[],consumed=await readFrom(file3,cached5&&cached5.
|
|
30692
|
-
size<size3?cached5.size:0,rows2);return cache4.delete(file3),cache4.set(file3,{size:consumed,rows:rows2}),cache4.size>MAX_CACHED_MONTHS&&cache4.delete(cache4.keys().next().value),rows2}async function ledgerRows(dataDir,from,to2){let out=[];for(let month of monthsBetween(new Date(from),new Date(to2)))for(let row of await monthRows(
|
|
30707
|
+
size<size3?cached5.size:0,rows2);return cache4.delete(file3),cache4.set(file3,{size:consumed,rows:rows2}),cache4.size>MAX_CACHED_MONTHS&&cache4.delete(cache4.keys().next().value),rows2}async function ledgerRows(dataDir,from,to2){let out=[];for(let month of monthsBetween(new Date(from),new Date(to2)))for(let row of await monthRows(join271(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)$/,
|
|
30693
30708
|
"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_]*$/,
|
|
30694
30709
|
"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_]+)?$/,"\
|
|
30695
30710
|
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};
|
|
@@ -30845,16 +30860,16 @@ rite"}),deps.notify(buildNotification("approval",{id:from.id,name:from.name},thr
|
|
|
30845
30860
|
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":
|
|
30846
30861
|
"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\
|
|
30847
30862
|
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;
|
|
30848
|
-
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
|
|
30849
|
-
optional()}),fileSchema26=external_exports.object({version:external_exports.literal(1),people:external_exports.array(personSchema).max(MAX_PEOPLE2)});function createTeamPeople(dataDir,now2=Date.now){let file3=
|
|
30863
|
+
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 readFileSync194}from"node:fs";import{join as join272}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().
|
|
30864
|
+
optional()}),fileSchema26=external_exports.object({version:external_exports.literal(1),people:external_exports.array(personSchema).max(MAX_PEOPLE2)});function createTeamPeople(dataDir,now2=Date.now){let file3=join272(dataDir,TEAM_PEOPLE_FILE),people=[];try{let parsed2=fileSchema26.safeParse(JSON.parse(readFileSync194(file3,"utf8")));parsed2.success?people=parsed2.data.people:console.warn(`team people: ${file3} is not a people file; starting fresh`)}catch(error66){error66.code!=="ENOENT"&&console.
|
|
30850
30865
|
warn(`team people: ${file3} is unreadable; starting fresh`)}let listeners3=new Set,changed3=(email3,change2)=>{for(let listener2 of listeners3)try{listener2(email3,change2)}catch(error66){console.warn(`team people: ${error66 instanceof Error?error66.message:String(error66)}`)}},save7=()=>{try{writeFileAtomic(file3,`${JSON.stringify({version:1,people})}
|
|
30851
30866
|
`,{mode:384})}catch(error66){console.warn(`team people: could not save ${file3}: ${error66 instanceof Error?error66.message:String(error66)}`)}};return{seen(email3,role){let address3=ownerEmail(email3),at8=now2(),known=people.find(person2=>person2.email===address3);known&&known.role===role&&known.leftAt===void 0&&at8-known.lastSeenAt<6e4||(people=[{email:address3,role,firstSeenAt:known?.firstSeenAt??at8,lastSeenAt:at8},...people.filter(person2=>person2.email!==address3)].slice(0,MAX_PEOPLE2),save7(),
|
|
30852
30867
|
!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){
|
|
30853
30868
|
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,
|
|
30854
30869
|
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?
|
|
30855
|
-
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
|
|
30870
|
+
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 readFileSync195}from"node:fs";import{join as join273}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.
|
|
30856
30871
|
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()}),
|
|
30857
|
-
fileSchema27=external_exports.object({version:external_exports.literal(1),homes:external_exports.record(person,external_exports.object({botId:id9,threadId:id9})),items:external_exports.array(itemSchema).max(MAX_ITEMS2)});function createPersonInbox(deps){let{team,store:store5}=deps,now2=deps.now??Date.now,file3=
|
|
30872
|
+
fileSchema27=external_exports.object({version:external_exports.literal(1),homes:external_exports.record(person,external_exports.object({botId:id9,threadId:id9})),items:external_exports.array(itemSchema).max(MAX_ITEMS2)});function createPersonInbox(deps){let{team,store:store5}=deps,now2=deps.now??Date.now,file3=join273(deps.dataDir,PERSON_INBOX_FILE),homes={},items=[],stopped=!1;if(team)try{let parsed2=fileSchema27.safeParse(JSON.parse(readFileSync195(file3,"utf8")));parsed2.success?{homes,items}=
|
|
30858
30873
|
parsed2.data:console.warn(`person inbox: ${file3} is not an inbox file; starting fresh`)}catch(error66){error66.code!=="ENOENT"&&console.warn(`person inbox: ${file3} is unreadable; starting fresh`)}let save7=()=>{items=items.filter(item=>now2()-item.at<KEEP_MS3).slice(-MAX_ITEMS2);try{writeFileAtomic(file3,`${JSON.stringify({version:1,homes,items})}
|
|
30859
30874
|
`,{mode:384})}catch(error66){console.warn(`person inbox: could not save ${file3}: ${error66 instanceof Error?error66.message:String(error66)}`)}},ownerKey3=bot=>{let email3=botOwner(bot);return email3?deps.personKeyOf(email3):null};function representativeOf(person2){let own4=bot=>!bot.hidden&&ownerKey3(bot)===person2;return store5.bots.find(bot=>bot.chiefOfStaff&&own4(bot))??store5.bots.find(bot=>!!bot.defaultBot?.person&&own4(bot))??null}function home2(person2){if(!team||!deps.person(person2))return null;
|
|
30860
30875
|
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(
|
|
@@ -30939,16 +30954,16 @@ long)}. ${SAY_LONG_WAIT} Each has its own line in this inbox, and that is where
|
|
|
30939
30954
|
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)
|
|
30940
30955
|
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.
|
|
30941
30956
|
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:{
|
|
30942
|
-
botId:waiting2.botId,threadId:waiting2.threadId}}:{returned:!1}},route(notification,how={}){return!team&&deps.place?deps.place.route(notification,how):inbox.route(notification,how)},handedResult(work,requester){team||deps.place?.handedResult(work,requester)},stop(){unsubscribe2(),inbox.stop(),deps.place?.stop()}}}init_zod();init_atomic();import{createHash as createHash126,createHmac as createHmac9,randomBytes as randomBytes37}from"node:crypto";import{mkdirSync as
|
|
30957
|
+
botId:waiting2.botId,threadId:waiting2.threadId}}:{returned:!1}},route(notification,how={}){return!team&&deps.place?deps.place.route(notification,how):inbox.route(notification,how)},handedResult(work,requester){team||deps.place?.handedResult(work,requester)},stop(){unsubscribe2(),inbox.stop(),deps.place?.stop()}}}init_zod();init_atomic();import{createHash as createHash126,createHmac as createHmac9,randomBytes as randomBytes37}from"node:crypto";import{mkdirSync as mkdirSync124,readdirSync as readdirSync61,readFileSync as readFileSync196,rmSync as rmSync67}from"node:fs";import{join as join274}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.
|
|
30943
30958
|
literal(1),results:external_exports.array(external_exports.object({id:external_exports.string(),state:external_exports.string()})).max(50),off:external_exports.array(external_exports.string().max(320)).max(1e3).optional()});function teamAwaySignature(secret,machineId,timestamp5,nonce,body2){let bodyHash=createHash126("sha256").update(body2).digest("base64url");return createHmac9("sha256",secret).update(`omb-team-away-v1
|
|
30944
30959
|
${machineId}
|
|
30945
30960
|
${timestamp5}
|
|
30946
30961
|
${nonce}
|
|
30947
30962
|
${bodyHash}`).digest("base64url")}var awayKey=about=>createHash126("sha256").update(`omb-team-away
|
|
30948
30963
|
${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,
|
|
30949
|
-
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=>
|
|
30950
|
-
pref.synced){rmSync67(prefPath(person2),{force:!0});return}
|
|
30951
|
-
`,{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(
|
|
30964
|
+
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=>join274(deps.dataDir,"people",person2,AWAY_EMAILS_FILE),readPref=person2=>{if(!PERSON6.test(person2))return null;try{let parsed2=prefSchema.safeParse(JSON.parse(readFileSync196(prefPath(person2),"utf8")));return parsed2.success?parsed2.data:null}catch{return null}},writePref=(person2,pref)=>{if(PERSON6.test(person2))try{if(!pref||pref.on&&
|
|
30965
|
+
pref.synced){rmSync67(prefPath(person2),{force:!0});return}mkdirSync124(join274(deps.dataDir,"people",person2),{recursive:!0,mode:448}),writeFileAtomic(prefPath(person2),`${JSON.stringify(pref)}
|
|
30966
|
+
`,{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(join274(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{
|
|
30952
30967
|
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)
|
|
30953
30968
|
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(
|
|
30954
30969
|
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))||
|
|
@@ -30968,9 +30983,9 @@ card.requestId}`:`inbox:${item.id}`,conversation2=mapped2.routine&&origin2?origi
|
|
|
30968
30983
|
{}}});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?
|
|
30969
30984
|
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(
|
|
30970
30985
|
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 \
|
|
30971
|
-
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
|
|
30986
|
+
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 readFileSync197}from"node:fs";import{join as join275}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().
|
|
30972
30987
|
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(
|
|
30973
|
-
auth)?auth.kind==="session"?{kind:"guest",key:cloud2.personOf(auth.session)}:{kind:"nobody"}:auth.kind==="loopback"&&auth.trust==="service"?{kind:"nobody"}:{kind:"owner"}}function createPlaceInbox(deps){let{store:store5}=deps,now2=deps.now??Date.now,file3=
|
|
30988
|
+
auth)?auth.kind==="session"?{kind:"guest",key:cloud2.personOf(auth.session)}:{kind:"nobody"}:auth.kind==="loopback"&&auth.trust==="service"?{kind:"nobody"}:{kind:"owner"}}function createPlaceInbox(deps){let{store:store5}=deps,now2=deps.now??Date.now,file3=join275(deps.dataDir,PLACE_INBOX_FILE),lines=[],seenAsks=new Set;try{let parsed2=fileSchema28.safeParse(JSON.parse(readFileSync197(file3,"utf8")));parsed2.success?(lines=parsed2.data.lines,seenAsks=new Set(parsed2.data.seenAsks)):console.warn(`\
|
|
30974
30989
|
place inbox: ${file3} is not an inbox file; starting fresh`)}catch(error66){error66.code!=="ENOENT"&&console.warn(`place inbox: ${file3} is unreadable; starting fresh`)}let save7=()=>{lines=lines.filter(line6=>now2()-line6.at<KEEP_MS4).slice(-MAX_LINES2);try{writeFileAtomic(file3,`${JSON.stringify({version:1,lines,seenAsks:[...seenAsks].slice(-MAX_SEEN_ASKS)})}
|
|
30975
30990
|
`,{mode:384})}catch(error66){console.warn(`place inbox: could not save ${file3}: ${error66 instanceof Error?error66.message:String(error66)}`)}},workingFor=threadId=>{let botId=deps.handedBy(threadId),bot=botId?store5.bot(botId):void 0;return bot?{botId:bot.id,name:bot.name}:void 0},titleOf2=(botId,threadId)=>store5.groupByThread(threadId)?.name??store5.taskByThread(botId,threadId)?.title??store5.bot(botId)?.name??"";function answeredThere(line6){if(line6.kind!=="message")return!1;let said2=store5.
|
|
30976
30991
|
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.
|
|
@@ -30991,7 +31006,7 @@ find(one5=>one5.id===lineId&&lineFor(auth,one5));return line6?(line6.seen||(line
|
|
|
30991
31006
|
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,text31,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)}
|
|
30992
31007
|
${escapeNotes(text31)}`,decision2=admit("direct",{},deps.state(botId,threadId));if(decision2.action==="queue"){queueSteeredMessage(botId,threadId,text31,{prompt,...decision2.reason?{reason:decision2.reason}:{},peerAsk,origin:OUTSIDE,relay:relay2});return}let userMessage=deps.store.appendMessage(threadId,{role:"user",kind:"text",text:text31,peerAsk,relay:relay2});deps.startTurn(botId,prompt,{threadId,peerAsk,origin:OUTSIDE,userMessage}).catch(error66=>{deps.store.appendMessage(threadId,{role:"bot",
|
|
30993
31008
|
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);
|
|
30994
|
-
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
|
|
31009
|
+
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 readFileSync198}from"node:fs";import{arch,platform,release as release2}from"node:os";import{join as join276}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(text31,botNames=[]){let prose=proseOnly(text31),ranges2=[],at8=-1;for(;(at8=prose.indexOf("@",at8+1))!==-1;){if(!isMentionBoundary(
|
|
30995
31010
|
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=(text31,botNames=[])=>devsMentionRanges(text31,botNames).length>0;function withoutDevsTags(text31,botNames=[]){let out="",from=0;for(let range6 of devsMentionRanges(text31,botNames))out+=text31.slice(from,range6.start),from=range6.end;return(out+text31.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;
|
|
30996
31011
|
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(text31,secrets=environmentSecrets()){let out=withoutCitationMarkers(text31);for(let secret of secrets)
|
|
30997
31012
|
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])?)+$/;
|
|
@@ -31021,7 +31036,7 @@ max(MAX_OUTBOX),tracked:external_exports.array(trackedSchema).max(MAX_TRACKED).o
|
|
|
31021
31036
|
h the problem if you can.]`,iso5=at8=>new Date(at8).toISOString(),firstLine=text31=>(text31??"").split(`
|
|
31022
31037
|
`).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.
|
|
31023
31038
|
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?",\
|
|
31024
|
-
signed in":", not signed in";return`${snapshot4.state}${snapshot4.reason?` (${clip14(snapshot4.reason,200)})`:""}${signedIn}${snapshot4.version?`, version ${snapshot4.version}`:""}`}function createDevsReports(deps){let{store:store5}=deps,now2=deps.now??Date.now,file3=
|
|
31039
|
+
signed in":", not signed in";return`${snapshot4.state}${snapshot4.reason?` (${clip14(snapshot4.reason,200)})`:""}${signedIn}${snapshot4.version?`, version ${snapshot4.version}`:""}`}function createDevsReports(deps){let{store:store5}=deps,now2=deps.now??Date.now,file3=join276(deps.dataDir,DEVS_REPORTS_FILE),waiting2=[],outbox=[],tracked=[];try{let parsed2=fileSchema29.safeParse(JSON.parse(readFileSync198(file3,"utf8")));parsed2.success?(outbox=parsed2.data.outbox,waiting2=parsed2.data.waiting.map(
|
|
31025
31040
|
entry2=>({...entry2,restored:!0})),tracked=parsed2.data.tracked??[]):console.warn(`devs reports: ${file3} is not a reports file; starting fresh`)}catch(error66){error66.code!=="ENOENT"&&console.warn(`devs reports: ${file3} is unreadable; starting fresh`)}let inFlight=new Map,retrying=new Set,told2=[],lastSent=new Map,seen=new Set,save7=()=>{try{writeFileAtomic(file3,`${JSON.stringify({version:1,waiting:waiting2.map(({answered:_a6,offered:_o3,restored:_r3,...entry2})=>entry2),outbox,tracked})}
|
|
31026
31041
|
`,{mode:384})}catch(error66){console.warn(`devs reports: could not save ${file3}: ${error66 instanceof Error?error66.message:String(error66)}`)}},notice=(threadId,said2)=>{try{store5.appendMessage(threadId,{role:"bot",kind:"activity",tool:{name:`notice: ${said2.line}`,ok:said2.ok}})}catch{}},namesBeforeDevs=()=>[...store5.bots.map(bot=>bot.name),...store5.sections],secrets=()=>environmentSecrets(),languageFor=person2=>deps.lineLanguage?deps.lineLanguage(person2):deps.language(),view3=entry2=>({id:entry2.
|
|
31027
31042
|
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(
|
|
@@ -31055,8 +31070,8 @@ for(;inFlight.size||retrying.size||asking2;)await Promise.allSettled([...inFligh
|
|
|
31055
31070
|
\u2026`:text31;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.
|
|
31056
31071
|
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,
|
|
31057
31072
|
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(
|
|
31058
|
-
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
|
|
31059
|
-
now){this.#file=file3,this.#now=now2;try{let parsed2=fileSchema30.safeParse(JSON.parse(
|
|
31073
|
+
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 readFileSync199}from"node:fs";var HANDED_PEOPLE_FILE="handed-people.json",PERSON7=/^p_[\w-]{22}$/,WORK=/^[\w-]{1,128}$/,KEEP_MS5=720*60*6e4,MAX_ENTRIES3=2e4,fileSchema30=external_exports.object({v:external_exports.literal(1),work:external_exports.record(external_exports.string().regex(WORK),external_exports.object({person:external_exports.string().regex(PERSON7),at:external_exports.number().int().nonnegative(),lends:external_exports.literal(!0).optional()}))}),HandedPeople=class{#file;#now;#work=new Map;constructor(file3,now2=Date.
|
|
31074
|
+
now){this.#file=file3,this.#now=now2;try{let parsed2=fileSchema30.safeParse(JSON.parse(readFileSync199(file3,"utf8")));if(parsed2.success)for(let[id12,entry2]of Object.entries(parsed2.data.work))this.#work.set(id12,entry2)}catch{}}record(workId,person2,lends=!1){if(!person2||!PERSON7.test(person2)||!WORK.test(workId)||this.#work.has(workId))return;let now2=this.#now();this.#work.set(workId,{person:person2,at:now2,...lends?{lends:!0}:{}});for(let[id12,entry2]of this.#work)now2-entry2.at>KEEP_MS5&&
|
|
31060
31075
|
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)})}
|
|
31061
31076
|
`,{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===
|
|
31062
31077
|
!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(
|
|
@@ -31064,7 +31079,7 @@ threadId)){let run11=generation===void 0?void 0:deps.roomRun(generation);if(!run
|
|
|
31064
31079
|
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.
|
|
31065
31080
|
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);
|
|
31066
31081
|
return entry2?{person:entry2.person,since:entry2.at}:void 0}}}var keptPrivate=place2=>!!place2.child&&place2.parent!==place2.child,lastLineAsks=text31=>/^needs input:/i.test(text31.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.
|
|
31067
|
-
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
|
|
31082
|
+
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 join278}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 join277}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 text30=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(
|
|
31068
31083
|
raw);return{title:text30(topic.title),note:text30(record30(record30(topic.notes).plain).content),labels:list9(topic.labels).map(text30).filter(Boolean),markers:list9(topic.markers).map(marker=>text30(record30(marker).markerId)).filter(Boolean),href:text30(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(
|
|
31069
31084
|
JSON.parse(source4)).map(raw=>{let sheet=record30(raw);return{title:text30(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(
|
|
31070
31085
|
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}
|
|
@@ -31077,8 +31092,8 @@ labels.map(oneLine13).join(", ")}`:"",topic.markers.length?`markers: ${topic.mar
|
|
|
31077
31092
|
`)}).join(`
|
|
31078
31093
|
|
|
31079
31094
|
`)+`
|
|
31080
|
-
`}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=
|
|
31081
|
-
outlineFromJson(source4):outlineFromXml(source4)}async function saveXmindUpload(chunks,originalName,options2={}){let name6=`${originalName}.md`;sanitizeSharedFileName(name6,"text/markdown");let scratch=await mkdtemp8(
|
|
31095
|
+
`}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=join277(scratch,"content");await extractZipMember(archive,member,extracted,384);let source4=await readFile15(extracted,"utf8");return member.name==="content.json"?
|
|
31096
|
+
outlineFromJson(source4):outlineFromXml(source4)}async function saveXmindUpload(chunks,originalName,options2={}){let name6=`${originalName}.md`;sanitizeSharedFileName(name6,"text/markdown");let scratch=await mkdtemp8(join277(tmpdir24(),"omb-xmind-"));try{let archive=join277(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}},
|
|
31082
31097
|
createWriteStream5(archive,{mode:384})),bytes4===0)throw statusError6(400,"empty file");let outline;try{outline=await outlineFromArchive(archive,scratch)}catch{throw statusError6(400,"not a readable XMind file")}return await saveFile2((async function*(){yield Buffer.from(outline,"utf8")})(),name6,"text/markdown",{uploadId:options2.uploadId})}finally{await rm14(scratch,{recursive:!0,force:!0})}}init_bot_visibility();import{createHash as createHash127}from"node:crypto";var RESULT_CLIP=280,NODES_SHOWN=500,ended=a=>a.status==="completed"||a.status==="failed"||a.status==="cancelled",plural4=(n,one5,many2)=>`${n} ${n===1?one5:many2}`,names4=(rows2,label4)=>{let unique2=[...new Set(rows2.map(label4))];return unique2.length>3?`${unique2.slice(0,3).join(", ")} and ${unique2.length-3} more`:unique2.join(", ")};function jobView(input2){let nameOf2=botId=>input2.nameOf(botId)??botId,shows=row=>input2.visible(row.assignee.destination.threadId),label4=row=>shows(row)?nameOf2(
|
|
31083
31098
|
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==="\
|
|
31084
31099
|
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=
|
|
@@ -31120,7 +31135,7 @@ received>IMAGE_MAX_BYTES2)return fail14(413,`image exceeds ${IMAGE_MAX_BYTES2} b
|
|
|
31120
31135
|
uploadId=validateAttachmentUploadId(url2.searchParams.get("uploadId")??void 0)}catch(error66){throw req.resume(),error66}let name6=url2.searchParams.get("name");if(!name6)return req.resume(),json7(res,400,{error:"name is required"});let rawType=Array.isArray(req.headers["content-type"])?req.headers["content-type"][0]:req.headers["content-type"],rawLength=Array.isArray(req.headers["content-length"])?req.headers["content-length"][0]:req.headers["content-length"],declaredLength=rawLength===void 0?void 0:
|
|
31121
31136
|
Number(rawLength);if(declaredLength!==void 0&&(!Number.isSafeInteger(declaredLength)||declaredLength<0))return req.resume(),json7(res,400,{error:"content-length must be a non-negative integer"});if(declaredLength!==void 0&&declaredLength>104857600)return req.resume(),json7(res,413,{error:`file exceeds ${104857600} bytes`});try{let chunks=req.iterator({destroyOnReturn:!1}),saved=rawType?.split(";")[0].trim().toLowerCase()===XMIND_MIME?await saveXmindUpload(chunks,name6,{uploadId}):await saveFile2(
|
|
31122
31137
|
chunks,name6,rawType??"",{uploadId,expectedBytes:declaredLength});return deps.uploads.note(auth,basename36(saved.path)),json7(res,201,saved)}catch(error66){throw req.resume(),error66}}if(path6==="/api/attachment-storage"&&deps.keptAttachments){if(method2==="GET")return json7(res,200,attachmentStorageUsage());if(method2==="POST"){let kept2=deps.keptAttachments();return kept2?json7(res,200,{...clearAttachments(kept2),...attachmentStorageUsage()}):json7(res,503,{error:"Routines are still loading. T\
|
|
31123
|
-
ry again in a moment."})}}if(m3=path6.match(/^\/api\/attachments\/([\w.-]+)$/),m3&&method2==="DELETE"){let name6=m3[1];return!UPLOADED_NAME.test(name6)||!deps.uploads.owns(auth,name6)?json7(res,404,{error:"no such attachment"}):deps.attachmentInUse(name6)?json7(res,409,{...userError("serverError.attachment.alreadyInMessage")}):(deleteAttachment(
|
|
31138
|
+
ry again in a moment."})}}if(m3=path6.match(/^\/api\/attachments\/([\w.-]+)$/),m3&&method2==="DELETE"){let name6=m3[1];return!UPLOADED_NAME.test(name6)||!deps.uploads.owns(auth,name6)?json7(res,404,{error:"no such attachment"}):deps.attachmentInUse(name6)?json7(res,409,{...userError("serverError.attachment.alreadyInMessage")}):(deleteAttachment(join278(ATTACHMENTS_DIR,name6)),json7(res,200,{ok:!0}))}if(m3&&method2==="GET"){let attachment=readAttachment(m3[1]);if(!attachment)return json7(res,404,
|
|
31124
31139
|
{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(
|
|
31125
31140
|
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.
|
|
31126
31141
|
get("threadId")?.trim()||void 0;if(threadId&&(!store5.botByThread(threadId)&&!store5.groupByThread(threadId)||!visible.thread(threadId)))return json7(res,404,{error:"no such conversation"});let activePaths=new Map,onActivePath=(threadId2,messageId2)=>{let ids=activePaths.get(threadId2);return ids||activePaths.set(threadId2,ids=new Set(store5.activePath(threadId2).map(m4=>m4.id))),ids.has(messageId2)},found2=await searchMessagesAsync(q2,visible.everything?limit2:Math.min(limit2*10,1e3),threadId);
|
|
@@ -31141,7 +31156,7 @@ test(resumeKey))return{status:400,body:{error:"invalid resume key"}};if(!items.l
|
|
|
31141
31156
|
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.
|
|
31142
31157
|
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]?.
|
|
31143
31158
|
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.
|
|
31144
|
-
slug,label:toolkit.label,description:description2,status:status5,resumeKey,...item.alias?{alias:item.alias}:{}}});messageIds.push(message8.id)}return deps.maybeResume(threadId,resumeKey),{status:200,body:{messageIds,...authConfigNote?{authConfigNote}:{}}}}return{request:request9}}import{createHash as createHash128,randomUUID as randomUUID90}from"node:crypto";import{readFileSync as
|
|
31159
|
+
slug,label:toolkit.label,description:description2,status:status5,resumeKey,...item.alias?{alias:item.alias}:{}}});messageIds.push(message8.id)}return deps.maybeResume(threadId,resumeKey),{status:200,body:{messageIds,...authConfigNote?{authConfigNote}:{}}}}return{request:request9}}import{createHash as createHash128,randomUUID as randomUUID90}from"node:crypto";import{readFileSync as readFileSync200}from"node:fs";import{join as join279}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,
|
|
31145
31160
|
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;
|
|
31146
31161
|
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,`
|
|
31147
31162
|
`).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,text31=`${subject}
|
|
@@ -31151,8 +31166,8 @@ index+match5[0].length+NEAR_AFTER).replace(NOT_A_CODE_WORD," ");if(CODE_WORD.tes
|
|
|
31151
31166
|
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 text31=null;try{text31=await box2.body(
|
|
31152
31167
|
mail.id)}catch{text31=null}if(text31===null){round2.unreadable=!0;continue}result2=extractCode(mail.subject,text31,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.
|
|
31153
31168
|
map(()=>new Map),wrongSender=!1,used=!1,unreadable=!1,failedRounds=0;for(;;){let rounds=await Promise.all(mailboxes.map((box2,index4)=>look2(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.
|
|
31154
|
-
unreadable),failedRounds=rounds.every(round2=>round2.failed)?failedRounds+1:0,failedRounds>=FAILED_ROUNDS||options2.now()>=deadline||options2.active?.()===!1)break;await options2.sleep(pollMs)}return failedRounds>=FAILED_ROUNDS||unreadable?{kind:"miss",why:"unreadable"}:used?{kind:"miss",why:"used"}:{kind:"miss",why:wrongSender?"wrong-sender":"not-found"}}var MAIL_CARD_FILE="email-code-card.json",LIST_LIMIT3=20,ACCOUNTS_PER_APP=3,ASKED_BEFORE_CALL_MS=12e4,REMEMBER_ASK_MS=15*6e4,REMEMBER_USED_MS=30*6e4,READS2={gmail:[GMAIL_FETCH_TOOL,GMAIL_MESSAGE_TOOL],outlook:[OUTLOOK_LIST_TOOL,OUTLOOK_MESSAGE_TOOL]};function readAsked(file3){try{let parsed2=JSON.parse(
|
|
31155
|
-
readMessage:readMessage2,...deps.run},askedFile=
|
|
31169
|
+
unreadable),failedRounds=rounds.every(round2=>round2.failed)?failedRounds+1:0,failedRounds>=FAILED_ROUNDS||options2.now()>=deadline||options2.active?.()===!1)break;await options2.sleep(pollMs)}return failedRounds>=FAILED_ROUNDS||unreadable?{kind:"miss",why:"unreadable"}:used?{kind:"miss",why:"used"}:{kind:"miss",why:wrongSender?"wrong-sender":"not-found"}}var MAIL_CARD_FILE="email-code-card.json",LIST_LIMIT3=20,ACCOUNTS_PER_APP=3,ASKED_BEFORE_CALL_MS=12e4,REMEMBER_ASK_MS=15*6e4,REMEMBER_USED_MS=30*6e4,READS2={gmail:[GMAIL_FETCH_TOOL,GMAIL_MESSAGE_TOOL],outlook:[OUTLOOK_LIST_TOOL,OUTLOOK_MESSAGE_TOOL]};function readAsked(file3){try{let parsed2=JSON.parse(readFileSync200(file3,"utf8"));return new Map(Object.entries(parsed2.asked??{}).filter(([,at8])=>typeof at8=="number"))}catch{return new Map}}function createLoginMailCodes(deps){let run11={recentInbox,
|
|
31170
|
+
readMessage:readMessage2,...deps.run},askedFile=join279(deps.dataDir,MAIL_CARD_FILE),asked=readAsked(askedFile),asks2=new Map,used=new Map,usedKey=(site,code)=>createHash128("sha256").update(`${site}\0${code}`).digest("hex"),forgetOld=(map7,before)=>{for(let[key7,at8]of map7)at8<before&&map7.delete(key7)},mayRead3=(bot,app)=>deps.appAllowed(app)&&READS2[app].every(slug3=>connectorAccessDecision(bot.connectorScopes,[{slug:slug3}],[app]).ok&&evaluateConnectorTools([slug3],bot.connectorTools,[app]).
|
|
31156
31171
|
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.
|
|
31157
31172
|
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.
|
|
31158
31173
|
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!==
|
|
@@ -31176,15 +31191,15 @@ if(!deps.enabled()||store5.groupByThread(target4.threadId)||!store5.taskByThread
|
|
|
31176
31191
|
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.
|
|
31177
31192
|
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\
|
|
31178
31193
|
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=
|
|
31179
|
-
!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;
|
|
31194
|
+
!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;existsSync101(join280(DATA_DIR,".backups"))&&(workspaceRestore=applyPendingWorkspaceRestore(DATA_DIR),workspaceRestore.restored&&(restoredAtStart=workspaceRestore.id),!workspaceRestore.restored&&!workspaceRestore.rolledBack&&(workspaceRestore=
|
|
31180
31195
|
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(
|
|
31181
|
-
config3.signIn?.members?.join(","))})),sessions=new SessionRegistry({file:
|
|
31196
|
+
config3.signIn?.members?.join(","))})),sessions=new SessionRegistry({file:join280(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(join280(DATA_DIR,"lent-computers.jso\
|
|
31182
31197
|
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??(process.env.OMB_UI_LANGUAGE?.trim()||void 0),personLanguages=createPersonLanguages(
|
|
31183
31198
|
{dataDir:DATA_DIR,configured:appLanguage,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()||
|
|
31184
|
-
ownerLends()&&sharedComputers.anyLent(),CLOUD_HOME_LENDER="cloud-home",cloudRoutineAuthors=CLOUD_HOME?createCloudRoutineAuthors(
|
|
31199
|
+
ownerLends()&&sharedComputers.anyLent(),CLOUD_HOME_LENDER="cloud-home",cloudRoutineAuthors=CLOUD_HOME?createCloudRoutineAuthors(join280(DATA_DIR,"lending-routines.json")):null,ownerStartedRoutineRuns=new Set,foreignTurns=new Map,lendingMemory=CLOUD_PERSONAL?createLendingMemory({file:join280(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(
|
|
31185
31200
|
bot?{id:bot.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.
|
|
31186
31201
|
log(`cloud 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\
|
|
31187
|
-
/proc; start it with cloud-home-start");var threadStarters=new ThreadStarters(
|
|
31202
|
+
/proc; start it with cloud-home-start");var threadStarters=new ThreadStarters(join280(DATA_DIR,"thread-starters.json")),commandAllowlist=new CommandAllowlistStore(join280(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 sam\
|
|
31188
31203
|
e mailbox.":null});addHeldSecretScrubber(text31=>emailService.scrub(text31));var heldSecrets=new HeldSecrets(logins2);addHeldSecretScrubber(text31=>heldSecrets.scrub(text31));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()&&
|
|
31189
31204
|
onePassword.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&&
|
|
31190
31205
|
!!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.
|
|
@@ -31193,7 +31208,7 @@ setEncoding("utf8"),process.stdin.on("error",()=>{}),process.stdin.on("data",chu
|
|
|
31193
31208
|
`)&&/^[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(
|
|
31194
31209
|
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(
|
|
31195
31210
|
()=>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.
|
|
31196
|
-
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:
|
|
31211
|
+
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:join280(DATA_DIR,"providers","engine-status.json")}),supportsApprovalMode2=createApprovalModeSupport(
|
|
31197
31212
|
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:"",
|
|
31198
31213
|
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?
|
|
31199
31214
|
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,
|
|
@@ -31218,7 +31233,7 @@ adopted.has(person2)?!0:cloudOwnerDevice(person2):!1}function cloudProvenOwnerPe
|
|
|
31218
31233
|
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\
|
|
31219
31234
|
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).
|
|
31220
31235
|
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\
|
|
31221
|
-
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??
|
|
31236
|
+
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??join280(realpathSync28(DATA_DIR),"task-workspaces",bot.id,bot.threadId);return cwd&&existsSync101(cwd)&&(cwd=realpathSync28(cwd)),{rules:commandAllowlist.list(bot.id),supported:COMMAND_ALLOWLIST_DRIVERS.has(instance?.driverKind??""),context:{
|
|
31222
31237
|
providerInstanceId:bot.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:"l\
|
|
31223
31238
|
oopback"}:{kind:"session",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)?.
|
|
31224
31239
|
card;return!!(card&&!card.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.
|
|
@@ -31246,19 +31261,19 @@ label,scopes:pairing2.scopes}})}plan.engineAction&&rows2.push({category:"engine"
|
|
|
31246
31261
|
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})===
|
|
31247
31262
|
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(
|
|
31248
31263
|
{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:(text31,about)=>notify(buildNoticeNotification(about,store4.bot(about.id)?.threadId??"",text31)),startsServers:botId=>{let bot=store4.
|
|
31249
|
-
bot(botId);return!!(bot&®istry2.get(bot.modelSelection.instanceId)?.adapter.capabilities.customMcp===!0)},boxed:()=>botBox.enabled(),keys:mcpKeys}),mcpOAuth=new McpOAuthManager({file:
|
|
31264
|
+
bot(botId);return!!(bot&®istry2.get(bot.modelSelection.instanceId)?.adapter.capabilities.customMcp===!0)},boxed:()=>botBox.enabled(),keys:mcpKeys}),mcpOAuth=new McpOAuthManager({file:join280(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.
|
|
31250
31265
|
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,
|
|
31251
31266
|
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.
|
|
31252
31267
|
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?
|
|
31253
31268
|
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});
|
|
31254
31269
|
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=
|
|
31255
|
-
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()
|
|
31256
|
-
|
|
31270
|
+
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();limixSkillDefaultsMigration();var availableSkills=()=>mergeSkills(bundledSkills,loadUserSkills(join280(DATA_DIR,"skills"))),usbPhoneOffered=(instance,skills)=>instance.
|
|
31271
|
+
adapter.capabilities.phoneMcp===!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){
|
|
31257
31272
|
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(
|
|
31258
|
-
{file:
|
|
31273
|
+
{file:join280(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",
|
|
31259
31274
|
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(
|
|
31260
31275
|
{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)}},
|
|
31261
|
-
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:
|
|
31276
|
+
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:join280(DATA_DIR,"refused-quick-models.json"),publish:event2=>{
|
|
31262
31277
|
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:"\
|
|
31263
31278
|
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){
|
|
31264
31279
|
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(
|
|
@@ -31269,7 +31284,7 @@ Promise.resolve()).catch(error66=>{console.warn(`[trial credit] could not start:
|
|
|
31269
31284
|
{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(
|
|
31270
31285
|
{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(
|
|
31271
31286
|
{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,
|
|
31272
|
-
computerSelectionTurns=new Map,EXTERNAL_RUNTIME_GENERATION="external-runtime",EXTERNAL_RUNTIMES_FILE=
|
|
31287
|
+
computerSelectionTurns=new Map,EXTERNAL_RUNTIME_GENERATION="external-runtime",EXTERNAL_RUNTIMES_FILE=join280(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(
|
|
31273
31288
|
EXTERNAL_RUNTIMES_FILE,header3,id12=>store4.bot(id12));return grant?{botId:grant.botId,threadId:grant.threadId,externalRuntime:grant,generation:EXTERNAL_RUNTIME_GENERATION,depth:0,kind:"agents",skillAuthoring:!1,createdBots:0,openedThreads:0,orphanExpiresAt:Number.MAX_SAFE_INTEGER}:null}var standInRoots=new Set;function beginInternalCapabilityGeneration(threadId,generation=randomUUID91()){let previous2=activeInternalGenerationByThread.get(threadId);return previous2&&revokeInternalCapabilityGeneration(
|
|
31274
31289
|
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}\
|
|
31275
31290
|
${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\
|
|
@@ -31329,7 +31344,7 @@ return directTurnClaimIsCurrent(botId,claimId,threadId)?(directTurnDispatchClaim
|
|
|
31329
31344
|
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.
|
|
31330
31345
|
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,
|
|
31331
31346
|
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(
|
|
31332
|
-
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=
|
|
31347
|
+
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=join280(homedir45(),"Downloads");return[...existsSync101(downloads)?[downloads]:[],...bot.cwd?[bot.cwd]:[],workspaceDir(bot.id)]}var dataUnavailableLogged=!1;function dataIntegration(botId,turn){
|
|
31333
31348
|
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.
|
|
31334
31349
|
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===
|
|
31335
31350
|
"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=
|
|
@@ -31359,13 +31374,13 @@ notes.push({path:`memory/${topic.name}`,text:text31})}return notes}function pack
|
|
|
31359
31374
|
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\
|
|
31360
31375
|
.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!=
|
|
31361
31376
|
"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.
|
|
31362
|
-
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:
|
|
31377
|
+
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:join280(DATA_DIR,"providers","ai-checks.json"),forBot:selection3=>withNewBotEffort(selection3,cfg.newBots?.effort,registry2.get(selection3.instanceId)?.adapter.
|
|
31363
31378
|
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?.
|
|
31364
31379
|
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;
|
|
31365
31380
|
function botApiThread(id12){let owner2=store4.botByThread(id12);return!!(owner2&&store4.taskByThread(owner2.id,id12)?.botApi)&&!isLimixOwnerThread(id12)}var{messagePage,messageWindow}=messagePages(store4),replyVoiceNotes=createReplyVoiceNotes({store:store4,config:()=>cfg,voiceReady,speak,save:saveAudio,remove:deleteAttachment,redact:redactSecretsInText,language:threadLanguage}),{cloudLendingTurn,cloudLendingRefusalNotice,cloudLendingRefusalForBot,cloudLendingRefusal,cloudThreadStarters,cloudBotOpened,
|
|
31366
31381
|
cloudLendingView,cloudReportFromOthers,handsOnLending,handedInUnproven,cloudOwnTurnRefusal,roomTurnStarted,roomTurnEnded,roomRun}=createCloudLendingTurns({store:store4,cloudHome:CLOUD_HOME!==null,team:CLOUD_TEAM?.name??null,directRequest:threadId=>directRequestOwners.get(threadId),threadStarter:threadId=>threadStarters.get(threadId),ownerPerson:cloudProvenOwnerPerson,cardAnswerer:cloudCardAnswerer,activeRoutineRun:activeRoutineRunForThread,ownerStartedRun:runId=>ownerStartedRoutineRuns.has(runId),
|
|
31367
31382
|
routineRunIsOwners:cloudRoutineRunIsOwners,routines:()=>routines,routineAuthors:cloudRoutineAuthors,lentPlatform:()=>sharedComputers.known(CLOUD_HOME_LENDER)[0]?.platform,memoryChangedBySomeoneElse:botId=>lendingMemory?.reconcile(botId,foreignTurnRunning(botId),{cached:!0}).changedBySomeoneElse===!0,lifts:()=>lendingLifts,handedSince:(threadId,since)=>handedInSince(coordinator.all(),threadId,since)}),teamAway=createTeamAwayHost({cloudHome:CLOUD_HOME,dataDir:DATA_DIR,here:person2=>[...sseClients].
|
|
31368
|
-
some(client=>client.ask.person===person2),people:()=>teamOwners.people?.everyone()??[],language:personLanguages.forLine,audienceOf:teamHost.audienceOf,store:store4,unseen:person2=>teamMessages.inbox.unseen(person2),readUpTo:(key7,person2)=>personRooms.reads?.readUpTo(key7,person2),session:auth=>auth.kind==="session"?auth.session:null}),actingPeople=createActingPeople({store:store4,direct:threadId=>directRequestOwners.get(threadId),roomRun,handed:new HandedPeople(
|
|
31383
|
+
some(client=>client.ask.person===person2),people:()=>teamOwners.people?.everyone()??[],language:personLanguages.forLine,audienceOf:teamHost.audienceOf,store:store4,unseen:person2=>teamMessages.inbox.unseen(person2),readUpTo:(key7,person2)=>personRooms.reads?.readUpTo(key7,person2),session:auth=>auth.kind==="session"?auth.session:null}),actingPeople=createActingPeople({store:store4,direct:threadId=>directRequestOwners.get(threadId),roomRun,handed:new HandedPeople(join280(DATA_DIR,HANDED_PEOPLE_FILE))}),
|
|
31369
31384
|
lendingLifts=lendingMemory?createLendingLifts({store:store4,stopped:threadId=>directRequestOwners.get(threadId)?.stopped===!0,threadBusy,queued:hasQueuedSteeredMessages,continueRequest:startTurn,notify,language:threadId=>threadLanguage(threadId),device:()=>deviceWord(sharedComputers.known(CLOUD_HOME_LENDER)[0]?.platform),decide:row=>appendDecision(DATA_DIR,row),words:changedWords,ownersAnswer:card=>cloudProvenOwnerPerson(cloudCardAnswerer(card)),memory:{info:botId=>lendingMemory.reviewInfo(botId),
|
|
31370
31385
|
accept:(botId,token3)=>lendingMemory.review(botId,foreignTurnRunning(botId),token3).ok}}):null,computerAsks=CLOUD_PERSONAL?createComputerAsksHost({store:store4,notify,lending:sharedComputers,principal:CLOUD_HOME_LENDER,threadBusy,queued:hasQueuedSteeredMessages,continueRequest:startTurn,refusal:turn=>sharedComputerPrincipal(turn)?null:cloudLendingRefusalForBot(turn)??"This conversation can't use your computer.",request:threadId=>directRequestOwners.get(threadId),active:turn=>internalCapabilityIsActive(
|
|
31371
31386
|
turn)}):null,{stopThreadForPerson,stopOnTypedCommand,restartForPerson}=createPersonStop({store:store4,routines:()=>routines,handoffs:()=>handoffs,interruptDirectThread,stopping:(botId,threadId)=>idleThreads.stopping(botId,threadId),clearUnattended,stopGoal:threadId=>oneOnOneGoals.stop(threadId),markStopped:(threadId,by)=>personStops.stop(threadId,liveTurns.running(threadId),directTurnDispatchClaims.has(threadId),by),working:(botId,threadId)=>threadBusy(botId,threadId)||coordinator.activeDirect(threadId),
|
|
@@ -31390,7 +31405,7 @@ generation,origin:`http://127.0.0.1:${PORT2}`,personal:CLOUD_PERSONAL,place:CLOU
|
|
|
31390
31405
|
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,
|
|
31391
31406
|
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.
|
|
31392
31407
|
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.
|
|
31393
|
-
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(
|
|
31408
|
+
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(join280(DATA_DIR,"team-computers.json"),ENVIRONMENT_ID),followupsReady=!1,sendSequencer=new SendSequencer;await retryComputerEngineMove();mcpServersHost.boot();store4.needsSeed()&&await Promise.
|
|
31394
31409
|
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\
|
|
31395
31410
|
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(
|
|
31396
31411
|
{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??
|
|
@@ -31626,16 +31641,16 @@ threshold:()=>skillReviewSteps(cfg),bot:botId=>store4.bot(botId)??void 0,engine:
|
|
|
31626
31641
|
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(
|
|
31627
31642
|
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{
|
|
31628
31643
|
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.
|
|
31629
|
-
error}:{ok:!0}},statePath:
|
|
31644
|
+
error}:{ok:!0}},statePath:join280(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.
|
|
31630
31645
|
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(
|
|
31631
31646
|
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.
|
|
31632
31647
|
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,
|
|
31633
31648
|
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.
|
|
31634
|
-
delete(threadId),forgetTurnCheckpoint(threadId),liveTurnByThread.delete(threadId),memoryRowsByThread.delete(threadId)}var TOOL_RESULTS_DIR=
|
|
31649
|
+
delete(threadId),forgetTurnCheckpoint(threadId),liveTurnByThread.delete(threadId),memoryRowsByThread.delete(threadId)}var TOOL_RESULTS_DIR=join280(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=text32=>store4.
|
|
31635
31650
|
appendMessage(threadId,{role:"bot",kind:"activity",tool:{name:text32,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.
|
|
31636
31651
|
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(`
|
|
31637
31652
|
`)}:{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,text31=typeof response=="string"?response:
|
|
31638
|
-
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=
|
|
31653
|
+
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=join280(TOOL_RESULTS_DIR,threadId.replace(/[^\w.-]/g,"_")),redacted=redactSecretsInText(text31),fullResult=spillToolResult(dir,key7,redacted,
|
|
31639
31654
|
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;
|
|
31640
31655
|
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,
|
|
31641
31656
|
{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(
|
|
@@ -31856,10 +31871,10 @@ labelledLine(personLine&&!opts?.excludeMessageIds?userMessage:{},withReactionNot
|
|
|
31856
31871
|
(!unseen||effortHeld||externalUpdate&&handed.config!==config3)),{block:unseenBlock,placed}=unseen&&!handedStale?renderUnseen(unseen):{block:"",placed:[]},{turnText:contextTurnText,resume}=buildTurnContext({text:userTurnText,transcript:replay.transcript,rewound,fresh:fresh||contextReset,externallyUpdated:!!externalContextMarker||handedStale,replaysNatively:replaysNatively(instance.driverKind)}),resumeCursor=resume?task2.resumeCursors[instanceId]:void 0,recoveryIsReplay=resumeCursor!==void 0&&externalUpdate&&
|
|
31857
31872
|
transcript.length>0,recoveryText=resumeCursor===void 0?void 0:recoveryIsReplay?buildTurnContext({text:userTurnText,transcript:selection3.inline,rewound:!1,fresh:!1,externallyUpdated:!0,replaysNatively:!1}).turnText:buildRecoveryText({text:userTurnText,transcript:selection3.inline}),carried2=[...skipTranscript],windowIds=selection3.representedIds;return{turnText:withUnseenMessages(unseenBlock,contextTurnText),images:contextTurnText!==userTurnText?[...replay.images,...turnImages]:turnImages,resumeCursor,
|
|
31858
31873
|
sessionReset:!resume,recoveryText,handoff:strictResume?{botId:bot.id,instanceId,config:config3,resumeCursor:typeof resumeCursor=="string"?resumeCursor:void 0,...instance.driverKind==="codex"?{effort:effort??null}:{},started:sessionStart(contextOrder,contextTurnText!==userTurnText?windowIds:[],carried2),recovery:sessionStart(contextOrder,recoveryText!==void 0?windowIds:[],carried2),resumed:sessionStart(contextOrder,[],[...placed,...carried2]),placed,carried:carried2,own:[userMessage.id,...opts?.excludeMessageIds??
|
|
31859
|
-
[]]}:void 0}},dispatchContext=decideContext(plannedConfig),persona=botPersona(bot);{let drift=checkSoulDrift(bot.id,bot.soul??"",bot.soulHash??"");drift.drift!==!!bot.soulDrift&&store4.patchBot(bot.id,{soulDrift:drift.drift})}dispatchContext.handoff&&handoffs.begin(threadId,dispatchClaimId,dispatchContext.handoff);let integrations={},browser=null,skills=availableSkills(),phoneOffered=usbPhoneOffered(instance,skills)&&!proactive.fence.confines(threadId)&&!botApiThread(threadId),
|
|
31860
|
-
providerText,[...phoneOffered?["phoneMcp"]:[],...skillAuthoring?["skillAuthoring"]:[]],skills);if(phoneOffered&&(integrations.phone=phoneIntegration(bot.id,threadId,dispatchClaimId)),bot.composio!==!1&&configured(cfg)&&instance.adapter.capabilities.composioMcp===!0&&Object.assign(integrations,await teamConnections.appsIntegrations(bot,threadId,dispatchClaimId,instance.adapter.capabilities.mcpToolsFoundByName?"dotted":"plain")),instance.adapter.capabilities.customMcp
|
|
31861
|
-
threadId)&&!botApiThread(threadId)){let custom21=await mcpServersHost.prepare(bot).then(()=>teamConnections.turnMcp(bot,threadId,dispatchClaimId));attachCustomMcp(integrations,{...custom21,...lentMcp.mounts(bot,{botId:bot.id,threadId,generation:dispatchClaimId})},cfg,{botId:bot.id,threadId}),Object.keys(custom21).length&&Object.assign(integrations,chatAppsMcp.turnMounts(custom21,bot.toolScope))}if(!directTurnClaimIsCurrent(bot.id,dispatchClaimId,threadId))throw new DirectTurnSetupCancelled(
|
|
31862
|
-
stopped while its tools were prepared");let worksInWorkspace=supportsWorkspaceFiles(instance.driverKind);worksInWorkspace&&(ensureWorkspace(bot.id,appLanguage()),bot.memoryEnabled!==!1&&beginMemoryTurn(teamHost.layer(bot.id,threadId),threadId),botBox.lend(bot.id,threadId,teamHost.layerDirs(bot.id,threadId)));let privateWorkspace=worksInWorkspace?ensureTaskWorkspaceWithSkills(bot.id,threadId,skillsHost.turnImports(bot,threadId,instance)):void 0,skillInstructions2=renderSkillInstructions(selectedSkills,
|
|
31874
|
+
[]]}:void 0}},dispatchContext=decideContext(plannedConfig),persona=botPersona(bot);{let drift=checkSoulDrift(bot.id,bot.soul??"",bot.soulHash??"");drift.drift!==!!bot.soulDrift&&store4.patchBot(bot.id,{soulDrift:drift.drift})}dispatchContext.handoff&&handoffs.begin(threadId,dispatchClaimId,dispatchContext.handoff);let integrations={},browser=null,skills=limixBundledFor(bot.id,availableSkills()),phoneOffered=usbPhoneOffered(instance,skills)&&!proactive.fence.confines(threadId)&&!botApiThread(threadId),
|
|
31875
|
+
selectedSkills=limixSelectBundled(providerText,[...phoneOffered?["phoneMcp"]:[],...skillAuthoring?["skillAuthoring"]:[]],skills);if(phoneOffered&&(integrations.phone=phoneIntegration(bot.id,threadId,dispatchClaimId)),bot.composio!==!1&&configured(cfg)&&instance.adapter.capabilities.composioMcp===!0&&Object.assign(integrations,await teamConnections.appsIntegrations(bot,threadId,dispatchClaimId,instance.adapter.capabilities.mcpToolsFoundByName?"dotted":"plain")),instance.adapter.capabilities.customMcp===
|
|
31876
|
+
!0&&!proactive.fence.confines(threadId)&&!botApiThread(threadId)){let custom21=await mcpServersHost.prepare(bot).then(()=>teamConnections.turnMcp(bot,threadId,dispatchClaimId));attachCustomMcp(integrations,{...custom21,...lentMcp.mounts(bot,{botId:bot.id,threadId,generation:dispatchClaimId})},cfg,{botId:bot.id,threadId}),Object.keys(custom21).length&&Object.assign(integrations,chatAppsMcp.turnMounts(custom21,bot.toolScope))}if(!directTurnClaimIsCurrent(bot.id,dispatchClaimId,threadId))throw new DirectTurnSetupCancelled(
|
|
31877
|
+
"turn stopped while its tools were prepared");let worksInWorkspace=supportsWorkspaceFiles(instance.driverKind);worksInWorkspace&&(ensureWorkspace(bot.id,appLanguage()),bot.memoryEnabled!==!1&&beginMemoryTurn(teamHost.layer(bot.id,threadId),threadId),botBox.lend(bot.id,threadId,teamHost.layerDirs(bot.id,threadId)));let privateWorkspace=worksInWorkspace?ensureTaskWorkspaceWithSkills(bot.id,threadId,skillsHost.turnImports(bot,threadId,instance)):void 0,skillInstructions2=renderSkillInstructions(selectedSkills,
|
|
31863
31878
|
{includeRoot:worksInWorkspace}),packagePlaybooks=installedPlaybookInstructions(providerText,bot.playbooks),cwd=(privateWorkspace?store4.pinTaskCwd(bot.id,threadId,privateWorkspace,{privateOnly:cloudGuestOpened(threadId)||botApiThread(threadId)}):null)??void 0,checkpointCwd=cwd&&cwd!==privateWorkspace?cwd:void 0,dwebUrl=process.env.DWEB_URL?.trim();dwebUrl&&(integrations.dweb={url:dwebUrl});let teamComputer=computerSkipped||proactive.fence.confines(threadId)||botApiThread(threadId)?void 0:inheritedTeamComputer(
|
|
31864
31879
|
bot),cloudBackend=teamComputer||opts?.runOn==="cloud"||bot.cloudBackend!=="vps"?"box":"vps",mountsComputerMcp=instance.adapter.capabilities.computerMcp===!0,mountsLocalComputer=instance.adapter.capabilities.localComputerMcp===!0,dispatchTask=store4.taskByThread(bot.id,threadId),ownCloud=!computerSkipped&&plan.computer===void 0&&isHandedWork(opts?.coordination?coordinator.node(opts.coordination.id):void 0)&&!teamComputer&&cloudBackend==="box"&&boatConfigured(cfg)&&canWorkOnCloud(cloudEngine(instance))&&
|
|
31865
31880
|
!computerPlaceRefusal("box")&&!cloudPlaceRefusal(cloudEngine(instance,bot.modelSelection.model),"works-on",bot.name)&&!computerToolsRefusal(toolScope,"works-on",bot.name)?await ownCloudStateWithin(boatStatus(cfg,bot.id)):void 0,handoffOwnCloud=handoffUsesOwnCloud({plan,handoffWork:!!ownCloud,ownCloudState:ownCloud?.state}),wants2=computerSkipped?"off":handoffOwnCloud?"cloud":plan.computer,skipComputer=error66=>{if(!answer2.incident||error66 instanceof DirectTurnSetupCancelled||error66 instanceof
|
|
@@ -31943,11 +31958,11 @@ bot.name,color:source4.bot.color}),store4.appendMessage(sourceThreadId,message8)
|
|
|
31943
31958
|
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.
|
|
31944
31959
|
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(
|
|
31945
31960
|
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(
|
|
31946
|
-
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:
|
|
31947
|
-
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:
|
|
31961
|
+
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:join280(
|
|
31962
|
+
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:join280(DATA_DIR,"limit-notices.json"),holdsFile:join280(DATA_DIR,"limit-takeover-holds.json"),configs:()=>instanceConfigs(cfg),context:selectionContext,blockedUntil:engine=>limitClock.blockedUntil(engine),resetAt:engine=>limitClock.
|
|
31948
31963
|
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.
|
|
31949
31964
|
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,text31)=>notify(buildNoticeNotification(about,store4.bot(about.id)?.threadId??
|
|
31950
|
-
"",text31)),record:failover=>limitFailovers.record(failover)});registry2.onSignedIn(instanceId=>limitTakeover.signedIn(instanceId));var limitFailovers=new LimitFailovers({file:
|
|
31965
|
+
"",text31)),record:failover=>limitFailovers.record(failover)});registry2.onSignedIn(instanceId=>limitTakeover.signedIn(instanceId));var limitFailovers=new LimitFailovers({file:join280(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,text31)=>store4.appendMessage(threadId,{role:"bot",
|
|
31951
31966
|
kind:"activity",tool:{name:`recovery: ${line6}`,ok:!0,...text31?{nameCode:text31.key,nameParams:text31.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,
|
|
31952
31967
|
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.
|
|
31953
31968
|
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,
|
|
@@ -31960,7 +31975,7 @@ if(!groupId){oneOnOneGoals.start(coordinatorBotId,threadId,prompt,{runId});retur
|
|
|
31960
31975
|
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?.
|
|
31961
31976
|
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!=
|
|
31962
31977
|
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);
|
|
31963
|
-
CLOUD_HOME&&CLOUD_OWNER_KEY&&cloudRoutineAuthors&&(cloudHome2=settleCloudHome({file:
|
|
31978
|
+
CLOUD_HOME&&CLOUD_OWNER_KEY&&cloudRoutineAuthors&&(cloudHome2=settleCloudHome({file:join280(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=
|
|
31964
31979
|
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();
|
|
31965
31980
|
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()),
|
|
31966
31981
|
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,text31)=>{writeSectionContext(section4,text31)}},postState:message8=>utilityParentPort?.postMessage(message8)});{let early=pendingOrgLibraryRelay;
|
|
@@ -31977,7 +31992,7 @@ revokeInternalCapabilitiesForThread,interruptAllDirectThreads,interruptTurn:(bot
|
|
|
31977
31992
|
activeRunForBot(bot.id))return deletionResponse(409,{error:"stop this bot's active routine before deleting the bot"});let activeGroup=activeGroupTurnForBot(bot.id);if(activeGroup)return deletionResponse(409,{error:`stop this bot's work in channel ${activeGroup.group.name} before deleting the bot`});if((boatConfigured(cfg)||vpsSshAliasForBot(cfg,bot))&&(bot.busy||hasDirectDispatch(bot.id)))return deletionResponse(409,{error:"stop this bot's work before checking and deleting its cloud computer"});
|
|
31978
31993
|
let botBoatRecovery=boatCreateRecoverySnapshot().filter(entry2=>entry2.botId===bot.id),botBoatDeletions=boatDeletionSnapshot().filter(entry2=>entry2.ownerBotId===bot.id);if(botBoatRecovery.some(entry2=>!entry2.resolved))return deletionResponse(409,{error:"finish reconciling this bot's pending cloud computer creation before deleting it \u2014 check boat.dev, then retry Boat setup"});let releaseComputerLifecycle=claimBotComputerLifecycle(bot.id),releasePhoneSecretMutation=claimPhoneSecretBotDeletion(
|
|
31979
31994
|
bot.id);if(!releasePhoneSecretMutation)return releaseComputerLifecycle(),deletionResponse(409,{error:"this bot or one of its channels is securely saving a credential"});let claimedLocalVmTarget=null;try{let localVmCleanup=null;if(localVmMode(cfg)==="per-bot"){let target4=perBotLocalVmTarget(bot.id);if(localVmActiveThreads.has(target4.key)||localVmLifecycleBusy.has(target4.key))return deletionResponse(409,{error:"stop this bot's Local VM turn or setup action before deleting the bot"});if(localVmLeaseFor(
|
|
31980
|
-
target4).current(localVmOwnerBusy))return deletionResponse(409,{error:"stop this bot's Local VM turn before deleting the bot"});localVmLifecycleBusy.add(target4.key),claimedLocalVmTarget=target4;let vm=await containerComputerStatus(void 0,void 0,target4);if(!vm.daemonUp&&
|
|
31995
|
+
target4).current(localVmOwnerBusy))return deletionResponse(409,{error:"stop this bot's Local VM turn before deleting the bot"});localVmLifecycleBusy.add(target4.key),claimedLocalVmTarget=target4;let vm=await containerComputerStatus(void 0,void 0,target4);if(!vm.daemonUp&&existsSync101(target4.workspaceDir))return deletionResponse(409,{error:"start the container runtime so Limix Bot can remove this bot's Local VM while deleting it"});if(vm.container!=="missing"&&!vm.managed)return deletionResponse(
|
|
31981
31996
|
409,{error:`The container named ${vm.container_name} was not created by Limix Bot. Remove it manually before deleting this bot`});localVmCleanup={target:target4,removeContainer:vm.container!=="missing"}}let vpsInventory=await listManagedVpsComputers(vpsConfigForBot(cfg,bot),managedBoatOwners()),vpsLeftOn=vpsInventory.configured&&!vpsInventory.available?vpsSshAliasForBot(cfg,bot):null,ownedVpsComputers=vpsInventory.instances.filter(instance=>instance.ownerBotId===bot.id);if((botBoatRecovery.length>
|
|
31982
31997
|
0||botBoatDeletions.length>0)&&!boatConfigured(cfg))return deletionResponse(409,{error:"Reconnect the Boat account that owns this bot's remembered cloud computer, then retry deletion"});let cloudInventory=await listManagedBoats(cfg,managedBoatOwners());if(cloudInventory.configured&&!cloudInventory.available)return deletionResponse(503,{error:`${cloudInventory.problem??"cloud computer inventory is unavailable"}. The bot was kept so its computer can be retried safely`});let ownedBoatComputers=cloudInventory.
|
|
31983
31998
|
instances.filter(instance=>instance.ownerBotId===bot.id);revalidate();let browserCleanupRequest=browserCleanup.prepare("bot",bot.id);try{for(let instance of ownedBoatComputers)if((await deleteManagedBoat(cfg,managedBoatOwners(),instance.boxId,instance.name)).pending)throw Object.assign(new Error("The cloud computer deletion has started but is still finishing. The bot was kept; retry in a moment"),{status:409});for(let instance of ownedVpsComputers)await removeManagedVpsComputer(vpsConfigForBot(cfg,
|
|
@@ -31990,7 +32005,7 @@ bot(proposerBotId),target4=store4.bot(targetBotId);return target4?!proposer||!ch
|
|
|
31990
32005
|
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(
|
|
31991
32006
|
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(),
|
|
31992
32007
|
maxParallel:()=>cfg.burst?.maxParallel,hasRoom:()=>engineMemory.laneHasRoom(),store:store4,language:threadId=>threadLanguage(threadId),startTurn:(botId,text31,opts)=>startTurn(botId,text31,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.
|
|
31993
|
-
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(
|
|
32008
|
+
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(join280(
|
|
31994
32009
|
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(
|
|
31995
32010
|
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)
|
|
31996
32011
|
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\
|
|
@@ -32044,31 +32059,31 @@ get(threadId);(!currentOwner||currentOwner.generation===resourceOwner.generation
|
|
|
32044
32059
|
let integrations={},skillAuthoring=skillAuthoringEnabled(cfg)&&hop===0&&!skillAuthoringClaim.claimed&&!cardContinuation&&instance.adapter.capabilities.agentsMcp===!0;instance.adapter.capabilities.agentsMcp===!0&&(integrations.agents=agentsIntegration(bot.id,threadId,hop,skillAuthoring,internalGeneration,orchestration?.roomHandoffId,supportsWorkspaceFiles(instance.driverKind))),instance.adapter.capabilities.hooks===!0&&hooksEnabled()&&(integrations.hooks=hooksIntegration(bot.id,threadId,internalGeneration));
|
|
32045
32060
|
let latestUser=[...store4.activePath(threadId)].reverse().find(message8=>message8.role==="user"&&message8.kind==="text"&&message8.text),usesNativeImageInput=instance.adapter.capabilities.nativeImageInput===!0,burstIds=new Set(operation?.queuedQueueIds??[]),burstOverrides=[],burstImages=[];if(usesNativeImageInput&&!cardContinuation)for(let message8 of store4.activePath(threadId)){if(message8.role!=="user"||message8.kind!=="text"||!message8.text||!message8.queueId||!burstIds.has(message8.queueId))
|
|
32046
32061
|
continue;let resolved2=extractTurnImages(message8.text);burstOverrides.push({messageId:message8.id,text:resolved2.text}),burstImages.push(...resolved2.images,...await videoFramesWithin(burstImages.length+resolved2.images.length,resolved2.videos))}let latestInBurst=latestUser?.queueId!==void 0&&burstIds.has(latestUser.queueId),resolvedLatestImages=latestUser?.text&&!cardContinuation&&!latestInBurst?extractTurnImages(latestUser.text):{text:latestUser?.text??"",images:[],videos:[]},roomWindow=roomTranscript.
|
|
32047
|
-
window(threadId,userName,usesNativeImageInput&&latestUser?[...burstOverrides,...latestInBurst?[]:[{messageId:latestUser.id,text:resolvedLatestImages.text}]]:void 0,bot.id),roomContext=roomWindow.text,turnImages=usesNativeImageInput?[...burstImages,...resolvedLatestImages.images,...await videoFramesWithin(burstImages.length+resolvedLatestImages.images.length,resolvedLatestImages.videos)]:[],skills=availableSkills(),phoneOffered=usbPhoneOffered(instance,skills),selectedSkills=mergeSkills(
|
|
32048
|
-
roomContext,phoneOffered?["phoneMcp"]:[],skills),
|
|
32049
|
-
connected apps are unavailable \u2014 ${error66 instanceof Error?error66.message:String(error66)}`;return store4.appendMessage(threadId,{role:"bot",kind:"activity",from:{botId:bot.id,name:bot.name,color:bot.color},tool:failedTurnTool(message8)}),reportDispatchError(message8),!0}if(instance.adapter.capabilities.customMcp===!0){let custom21={...await mcpServersHost.prepare(bot).then(()=>teamConnections.turnMcp(bot,threadId,internalGeneration)),...lentMcp.mounts(bot,{botId:bot.id,threadId,
|
|
32050
|
-
attachCustomMcp(integrations,custom21,cfg,{botId:bot.id,threadId}),Object.assign(integrations,chatAppsMcp.turnMounts(custom21,bot.toolScope))}if(isCancelled?.())return!1;let readyBot=store4.bot(bot.id);if(!readyBot)return!1;toolScopeForTurn(readyBot.id);let readyGroup=store4.group(group2.id),stillOwnsThread=readyGroup?.dm?readyGroup.threadId===threadId:!!(readyGroup&&store4.groupTaskByThread(readyGroup.id,threadId));if(!readyGroup||!stillOwnsThread||!readyGroup.memberIds.
|
|
32051
|
-
if(registry2.get(readyBot.modelSelection.instanceId)!==instance||roomTurnApprovalMode(readyBot,threadId,orchestration)!==preparedApprovalMode||readyBot.modelSelection.instanceId!==preparedSelection.instanceId||readyBot.modelSelection.model!==preparedSelection.model||readyBot.modelSelection.effort!==preparedSelection.effort||readyBot.modelSelection.variant!==preparedSelection.variant||readyBot.composio!==preparedComposio){if(setupRetry===0)return runGroupMemberTurn(
|
|
32052
|
-
cardContinuation,onDispatchError,isCancelled,onProviderHandshakeStarted,onProviderHandshakeSettled,skillAuthoringClaim,orchestration,operation,1);if(orchestration)return orchestration.result.outcome="busy",!0;let message8=`${readyBot.name}'s settings changed while starting \u2014 skipped this round`;return store4.appendMessage(threadId,{role:"bot",kind:"activity",from:{botId:readyBot.id,name:readyBot.name,color:readyBot.color},tool:{name:serverLine(threadLanguage(
|
|
32053
|
-
|
|
32054
|
-
message8),!0}if(boatLifecycleBusyBots.has(readyBot.id)){if(orchestration)return orchestration.result.outcome="busy",!0;let message8=`${bot.name}'s cloud computer is being changed \u2014 skipped this round`;return store4.appendMessage(threadId,{role:"bot",kind:"activity",from:{botId:bot.id,name:bot.name,color:bot.color},tool:{name:serverLine(threadLanguage(threadId),"server.rooms.cloudComputerChanging",{bot:bot.name}),ok:!1}}),reportDispatchError(message8),!0}if(readyBot.
|
|
32055
|
-
result.outcome="busy",!0;let message8=`${bot.name} became busy in another conversation \u2014 skipped this round`;return store4.appendMessage(threadId,{role:"bot",kind:"activity",from:{botId:bot.id,name:bot.name,color:bot.color},tool:{name:serverLine(threadLanguage(threadId),"server.rooms.becameBusy",{bot:bot.name}),ok:!1}}),reportDispatchError(message8),!0}if(store4.setActivity(bot.id,"working"),roomMemberLock.release(bot.id,threadId),roomSpeaker={botId:bot.
|
|
32056
|
-
now()},groupSpeakers.set(threadId,roomSpeaker),store4.patchGroup(readyGroup.id,{busyBotId:bot.id}),orchestration?.onClaimed?.(),orchestration?.coordination)directCoordinationSettlers.set(internalGeneration,{nodeId:orchestration.coordination.id,settle:orchestration.coordination.settle});else{let opener=handoffOpener({botId:bot.id,threadId},threadId);coordinator.beginTurn({id:internalGeneration,address:{groupId:readyGroup.id,threadId,botId:bot.id},brief:roomTurnBrief(
|
|
32057
|
-
hop:0,latestUser),level:preparedApprovalMode,...opener?{opener}:{},origin:requestWorkOrigin({line:latestUser}),...orchestration?.goalRunId?{goalRunId:orchestration.goalRunId}:{}})}setupStallReason=void 0,unregisterSetupStall=roomStallCompletions.register(threadId,cause=>{setupStallReason=stoppedTurnText(threadId,void 0,cause)}),watchdog.watch(threadId,bot.id);let roomTeamComputer=inheritedTeamComputer(readyBot),roomPlan=resolveSurface({destination:roomTeamComputer?
|
|
32058
|
-
cfg)&&readyBot.browser!==!1&&instance.adapter.capabilities.browserMcp===!0}),roomKind=roomTeamComputer?"box":roomPlan.computer==="local"?"thisComputer":readyBot.computer==="vm"?"localVm":roomPlan.computer==="cloud"?turnProvider(readyBot)==="vps"?"vps":"box":void 0,roomPlaceRefusal=roomKind&&computerPlaceRefusal(roomKind);if(roomPlaceRefusal)throw Object.assign(new Error(roomPlaceRefusal.message),{code:roomPlaceRefusal.code});if(!roomTeamComputer&&
|
|
32059
|
-
cloudEngine(instance,readyBot.modelSelection.model),"room",readyBot.name)??computerToolsRefusal(readyBot.toolScope,"room",readyBot.name);if(unsupported)throw unsupported}if(instance.adapter.capabilities.dataMcp===!0){let data4=dataIntegration(readyBot.id,{threadId,generation:internalGeneration});data4&&(integrations.data=data4)}if(instance.adapter.capabilities.emailMcp===!0){let mail=emailIntegration(readyBot,{threadId,generation:internalGeneration});
|
|
32060
|
-
adapter.capabilities.deviceMcp===!0?phones2.integration(readyBot,{threadId,generation:internalGeneration}):null;if(phone&&(integrations.device=phone),roomPlan.browser&&!(roomPlan.computer===void 0&&roomTeamComputer)){let selectedProfile=readyBot.browserProfile,browser=await browserIntegration(readyBot.id,selectedProfile,{threadId,generation:internalGeneration});browser&&(integrations.browser=browser.integration)}let browserReadyBot=store4.bot(readyBot.
|
|
32061
|
-
groupSpeakers.get(threadId)!==roomSpeaker||activeInternalGenerationByThread.get(threadId)!==internalGeneration)return!1;let roomSetupIsCurrent=()=>!isCancelled?.()&&groupSpeakers.get(threadId)===roomSpeaker&&activeInternalGenerationByThread.get(threadId)===internalGeneration,showClaimedScreen=capture=>{roomSetupIsCurrent()&&(roomScreenBotId=readyBot.id,startScreenPoller(readyBot.id,threadId,{computer:capture}))},failRoomClaim=(failure11,error66)=>{
|
|
32062
|
-
internalGeneration||groupSpeakers.get(threadId)!==roomSpeaker)){if(resourceOwner.computerParkedOn)roomClaimFailure={parked:!0},orchestration&&(orchestration.result.stopReason=`${bot.name} parked waiting for the computer`);else{let placeFailure=error66 instanceof PlaceUnavailableError?error66:void 0,message8=placeFailure?.message??failure11;roomClaimFailure={parked:!1,message:message8},store4.appendMessage(threadId,{role:"bot",kind:"activity",
|
|
32063
|
-
message8,placeFailure?{place:placeFailure.row}:{})}),reportDispatchError(message8),resourceOwner.lazyClaimFailureReported=!0}instance.adapter.interruptTurn(threadId).catch(()=>{})}};try{if(roomTeamComputer&&(integrations.localComputer=mountTeamBoat(roomTeamComputer,readyBot.id,resourceOwner,canWorkOnCloud(cloudEngine(instance)),{onClaimed:showClaimedScreen,onRejected:failRoomClaim})),!roomTeamComputer&&roomPlan.computer==="
|
|
32064
|
-
readyBot.id,instance.adapter.capabilities.localComputerMcp===!0,failRoomClaim),!roomSetupIsCurrent())return!1;roomComputerKind="local"}if(!roomTeamComputer&&roomPlan.computer==="cloud")if(turnProvider(readyBot)==="vps"){vpsThreadStarted(readyBot.id,threadId),roomVpsBotId=readyBot.id;let mounted=await mountBotVps(readyBot,resourceOwner,{start:!0,onClaimed:showClaimedScreen});if(!roomSetupIsCurrent())return!1;if(!("
|
|
32065
|
-
|
|
32066
|
-
readyBot.modelSelection.model).name},source:"room"},!!CLOUD_HOME);let target4={...localVmTargetForThread(readyBot.id,threadId)};if(await waitForLocalVmUpdate(target4,threadId,roomSetupIsCurrent,{botId:readyBot.id,name:readyBot.name,color:readyBot.color}),await bindTurnComputer(resourceOwner,`computer:vm:${target4.key}`,!0),localVmImageBusy||localVmModeChangeBusy||localVmLifecycleBusy.has(target4.key))throw new Error("this
|
|
32067
|
-
claim(threadId,readyBot.id,localVmOwnerBusy))throw new Error("this Local VM is already being used by another turn");localVmMode(cfg)==="pool"&&localVmSeatPool.touch(threadId),roomVmTarget=target4,localVmThreadTargets.set(threadId,target4),localVmActiveThreads.set(target4.key,threadId),localVmIdleFor(target4).touch();let setupIsCurrent=()=>!isCancelled?.()&&groupSpeakers.get(threadId)===roomSpeaker&&activeInternalGenerationByThread.
|
|
32068
|
-
memberIds.includes(readyBot.id)===!0&&store4.bot(readyBot.id)?.busy===!0,vm=await readyLocalVmForTurn(readyBot.id,target4,setupIsCurrent);if(!setupIsCurrent())return!1;if(!vm.ready||!vm.runtime)throw new Error(vm.problem??"the Local VM is not ready");let owner2=localVmLeaseFor(target4).current(localVmOwnerBusy);if(owner2?.threadId!==threadId||owner2.botId!==readyBot.id)throw new Error("the Local VM lease expired while preparing the
|
|
32069
|
-
controlIntegration(readyBot.id,threadId,internalGeneration,{localVmTarget:target4}),target4)}}catch(error66){let place2=roomPlan.computer;throw place2!=="cloud"&&place2!=="vm"&&place2!=="local"?error66:await asPlaceFailure(error66,place2,"room",readyBot,turnProvider(readyBot)==="vps"?"vps":"box")}let roomMembers=readyGroup.memberIds.map(id12=>store4.bot(id12)).filter(b11=>!!b11),roster=roomMembers.map(roomRosterLine).join(", "),
|
|
32070
|
-
roomHandoffId):void 0,roomRequester=roomHandoff?.parentId?store4.bot(coordinator.node(roomHandoff.parentId)?.botId??"")?.name:void 0,requesterRule=roomRequester?` Don't use coordinate_bots toward @${roomRequester} or whoever assigned its work; to ask @${roomRequester} something, end your turn with the question \u2014 it is resumed with your reply.`:"",outsideRoom=integrations.agents&&orchestration&&!orchestration.roomHandoffId?
|
|
32071
|
-
peer.id)):[],system=[`You are ${bot.name}, a bot in the room "${readyGroup.name}" in Limix Bot.`,bot.title&&`Role: ${bot.title}.`,bot.description&&`About: ${bot.description}`,`Room members: ${roster}, and ${typeof userName=="string"?`${userName} (the human)`:roomPeople(threadId,userName)}.`,readyGroup.bulletin.trim()&&`Room bulletin (shared instructions for everyone):
|
|
32062
|
+
window(threadId,userName,usesNativeImageInput&&latestUser?[...burstOverrides,...latestInBurst?[]:[{messageId:latestUser.id,text:resolvedLatestImages.text}]]:void 0,bot.id),roomContext=roomWindow.text,turnImages=usesNativeImageInput?[...burstImages,...resolvedLatestImages.images,...await videoFramesWithin(burstImages.length+resolvedLatestImages.images.length,resolvedLatestImages.videos)]:[],skills=limixBundledFor(bot.id,availableSkills()),phoneOffered=usbPhoneOffered(instance,skills),selectedSkills=mergeSkills(
|
|
32063
|
+
limixSelectBundled(roomContext,phoneOffered?["phoneMcp"]:[],skills),limixSelectBundled(latestUser?.text??"",skillAuthoring?["skillAuthoring"]:[],skills));phoneOffered&&(integrations.phone=phoneIntegration(bot.id,threadId,internalGeneration));try{bot.composio!==!1&&configured(cfg)&&instance.adapter.capabilities.composioMcp===!0&&Object.assign(integrations,await teamConnections.appsIntegrations(bot,threadId,internalGeneration,instance.adapter.capabilities.mcpToolsFoundByName?"dotted":"plain"))}catch(error66){
|
|
32064
|
+
let message8=`connected apps are unavailable \u2014 ${error66 instanceof Error?error66.message:String(error66)}`;return store4.appendMessage(threadId,{role:"bot",kind:"activity",from:{botId:bot.id,name:bot.name,color:bot.color},tool:failedTurnTool(message8)}),reportDispatchError(message8),!0}if(instance.adapter.capabilities.customMcp===!0){let custom21={...await mcpServersHost.prepare(bot).then(()=>teamConnections.turnMcp(bot,threadId,internalGeneration)),...lentMcp.mounts(bot,{botId:bot.id,threadId,
|
|
32065
|
+
generation:internalGeneration})};attachCustomMcp(integrations,custom21,cfg,{botId:bot.id,threadId}),Object.assign(integrations,chatAppsMcp.turnMounts(custom21,bot.toolScope))}if(isCancelled?.())return!1;let readyBot=store4.bot(bot.id);if(!readyBot)return!1;toolScopeForTurn(readyBot.id);let readyGroup=store4.group(group2.id),stillOwnsThread=readyGroup?.dm?readyGroup.threadId===threadId:!!(readyGroup&&store4.groupTaskByThread(readyGroup.id,threadId));if(!readyGroup||!stillOwnsThread||!readyGroup.memberIds.
|
|
32066
|
+
includes(readyBot.id))return!1;if(registry2.get(readyBot.modelSelection.instanceId)!==instance||roomTurnApprovalMode(readyBot,threadId,orchestration)!==preparedApprovalMode||readyBot.modelSelection.instanceId!==preparedSelection.instanceId||readyBot.modelSelection.model!==preparedSelection.model||readyBot.modelSelection.effort!==preparedSelection.effort||readyBot.modelSelection.variant!==preparedSelection.variant||readyBot.composio!==preparedComposio){if(setupRetry===0)return runGroupMemberTurn(
|
|
32067
|
+
groupId,threadId,botId,hop,spoken,cardContinuation,onDispatchError,isCancelled,onProviderHandshakeStarted,onProviderHandshakeSettled,skillAuthoringClaim,orchestration,operation,1);if(orchestration)return orchestration.result.outcome="busy",!0;let message8=`${readyBot.name}'s settings changed while starting \u2014 skipped this round`;return store4.appendMessage(threadId,{role:"bot",kind:"activity",from:{botId:readyBot.id,name:readyBot.name,color:readyBot.color},tool:{name:serverLine(threadLanguage(
|
|
32068
|
+
threadId),"server.rooms.settingsChanged",{bot:readyBot.name}),ok:!1}}),reportDispatchError(message8),!0}if(providerTransitionForTurn(readyBot)){if(orchestration)return orchestration.result.outcome="busy",!0;let message8=`${bot.name}'s computer provider is being updated \u2014 skipped this round`;return store4.appendMessage(threadId,{role:"bot",kind:"activity",from:{botId:bot.id,name:bot.name,color:bot.color},tool:{name:serverLine(threadLanguage(threadId),"server.rooms.providerUpdating",{bot:bot.
|
|
32069
|
+
name}),ok:!1}}),reportDispatchError(message8),!0}if(boatLifecycleBusyBots.has(readyBot.id)){if(orchestration)return orchestration.result.outcome="busy",!0;let message8=`${bot.name}'s cloud computer is being changed \u2014 skipped this round`;return store4.appendMessage(threadId,{role:"bot",kind:"activity",from:{botId:bot.id,name:bot.name,color:bot.color},tool:{name:serverLine(threadLanguage(threadId),"server.rooms.cloudComputerChanging",{bot:bot.name}),ok:!1}}),reportDispatchError(message8),!0}if(readyBot.
|
|
32070
|
+
busy){if(orchestration)return orchestration.result.outcome="busy",!0;let message8=`${bot.name} became busy in another conversation \u2014 skipped this round`;return store4.appendMessage(threadId,{role:"bot",kind:"activity",from:{botId:bot.id,name:bot.name,color:bot.color},tool:{name:serverLine(threadLanguage(threadId),"server.rooms.becameBusy",{bot:bot.name}),ok:!1}}),reportDispatchError(message8),!0}if(store4.setActivity(bot.id,"working"),roomMemberLock.release(bot.id,threadId),roomSpeaker={botId:bot.
|
|
32071
|
+
id,name:bot.name,color:bot.color,since:Date.now()},groupSpeakers.set(threadId,roomSpeaker),store4.patchGroup(readyGroup.id,{busyBotId:bot.id}),orchestration?.onClaimed?.(),orchestration?.coordination)directCoordinationSettlers.set(internalGeneration,{nodeId:orchestration.coordination.id,settle:orchestration.coordination.settle});else{let opener=handoffOpener({botId:bot.id,threadId},threadId);coordinator.beginTurn({id:internalGeneration,address:{groupId:readyGroup.id,threadId,botId:bot.id},brief:roomTurnBrief(
|
|
32072
|
+
threadId,bot,hop>0&&!orchestration?hop:0,latestUser),level:preparedApprovalMode,...opener?{opener}:{},origin:requestWorkOrigin({line:latestUser}),...orchestration?.goalRunId?{goalRunId:orchestration.goalRunId}:{}})}setupStallReason=void 0,unregisterSetupStall=roomStallCompletions.register(threadId,cause=>{setupStallReason=stoppedTurnText(threadId,void 0,cause)}),watchdog.watch(threadId,bot.id);let roomTeamComputer=inheritedTeamComputer(readyBot),roomPlan=resolveSurface({destination:roomTeamComputer?
|
|
32073
|
+
"cloud":readyBot.computer,browserOn:builtInBrowserEnabled(cfg)&&readyBot.browser!==!1&&instance.adapter.capabilities.browserMcp===!0}),roomKind=roomTeamComputer?"box":roomPlan.computer==="local"?"thisComputer":readyBot.computer==="vm"?"localVm":roomPlan.computer==="cloud"?turnProvider(readyBot)==="vps"?"vps":"box":void 0,roomPlaceRefusal=roomKind&&computerPlaceRefusal(roomKind);if(roomPlaceRefusal)throw Object.assign(new Error(roomPlaceRefusal.message),{code:roomPlaceRefusal.code});if(!roomTeamComputer&&
|
|
32074
|
+
roomPlan.computer==="cloud"){let unsupported=cloudPlaceRefusal(cloudEngine(instance,readyBot.modelSelection.model),"room",readyBot.name)??computerToolsRefusal(readyBot.toolScope,"room",readyBot.name);if(unsupported)throw unsupported}if(instance.adapter.capabilities.dataMcp===!0){let data4=dataIntegration(readyBot.id,{threadId,generation:internalGeneration});data4&&(integrations.data=data4)}if(instance.adapter.capabilities.emailMcp===!0){let mail=emailIntegration(readyBot,{threadId,generation:internalGeneration});
|
|
32075
|
+
mail&&(integrations.email=mail)}let phone=instance.adapter.capabilities.deviceMcp===!0?phones2.integration(readyBot,{threadId,generation:internalGeneration}):null;if(phone&&(integrations.device=phone),roomPlan.browser&&!(roomPlan.computer===void 0&&roomTeamComputer)){let selectedProfile=readyBot.browserProfile,browser=await browserIntegration(readyBot.id,selectedProfile,{threadId,generation:internalGeneration});browser&&(integrations.browser=browser.integration)}let browserReadyBot=store4.bot(readyBot.
|
|
32076
|
+
id);if(isCancelled?.()||!browserReadyBot?.busy||groupSpeakers.get(threadId)!==roomSpeaker||activeInternalGenerationByThread.get(threadId)!==internalGeneration)return!1;let roomSetupIsCurrent=()=>!isCancelled?.()&&groupSpeakers.get(threadId)===roomSpeaker&&activeInternalGenerationByThread.get(threadId)===internalGeneration,showClaimedScreen=capture=>{roomSetupIsCurrent()&&(roomScreenBotId=readyBot.id,startScreenPoller(readyBot.id,threadId,{computer:capture}))},failRoomClaim=(failure11,error66)=>{
|
|
32077
|
+
if(!(activeInternalGenerationByThread.get(threadId)!==internalGeneration||groupSpeakers.get(threadId)!==roomSpeaker)){if(resourceOwner.computerParkedOn)roomClaimFailure={parked:!0},orchestration&&(orchestration.result.stopReason=`${bot.name} parked waiting for the computer`);else{let placeFailure=error66 instanceof PlaceUnavailableError?error66:void 0,message8=placeFailure?.message??failure11;roomClaimFailure={parked:!1,message:message8},store4.appendMessage(threadId,{role:"bot",kind:"activity",
|
|
32078
|
+
from:{botId:bot.id,name:bot.name,color:bot.color},tool:failedTurnTool(message8,placeFailure?{place:placeFailure.row}:{})}),reportDispatchError(message8),resourceOwner.lazyClaimFailureReported=!0}instance.adapter.interruptTurn(threadId).catch(()=>{})}};try{if(roomTeamComputer&&(integrations.localComputer=mountTeamBoat(roomTeamComputer,readyBot.id,resourceOwner,canWorkOnCloud(cloudEngine(instance)),{onClaimed:showClaimedScreen,onRejected:failRoomClaim})),!roomTeamComputer&&roomPlan.computer==="loc\
|
|
32079
|
+
al"){if(integrations.localComputer=await mountHostComputer(resourceOwner,readyBot.id,instance.adapter.capabilities.localComputerMcp===!0,failRoomClaim),!roomSetupIsCurrent())return!1;roomComputerKind="local"}if(!roomTeamComputer&&roomPlan.computer==="cloud")if(turnProvider(readyBot)==="vps"){vpsThreadStarted(readyBot.id,threadId),roomVpsBotId=readyBot.id;let mounted=await mountBotVps(readyBot,resourceOwner,{start:!0,onClaimed:showClaimedScreen});if(!roomSetupIsCurrent())return!1;if(!("integratio\
|
|
32080
|
+
n"in mounted))throw new Error(mounted.problem??"the VPS computer could not be created or reached");integrations.localComputer=mounted.integration,roomComputerKind="vps"}else{if(!boatConfigured(cfg))throw boatNotConfigured(readyBot,"room");integrations.localComputer=mountBotBoat(readyBot,resourceOwner,{source:"room",onClaimed:showClaimedScreen,onRejected:failRoomClaim}),roomComputerKind="box"}if(readyBot.computer==="vm"){if(instance.adapter.capabilities.computerMcp!==!0)throw placeUnavailable("vm",
|
|
32081
|
+
{state:"vm-cannot",params:{bot:readyBot.name,model:cloudEngine(instance,readyBot.modelSelection.model).name},source:"room"},!!CLOUD_HOME);let target4={...localVmTargetForThread(readyBot.id,threadId)};if(await waitForLocalVmUpdate(target4,threadId,roomSetupIsCurrent,{botId:readyBot.id,name:readyBot.name,color:readyBot.color}),await bindTurnComputer(resourceOwner,`computer:vm:${target4.key}`,!0),localVmImageBusy||localVmModeChangeBusy||localVmLifecycleBusy.has(target4.key))throw new Error("this Lo\
|
|
32082
|
+
cal VM is being started, stopped, or replaced");if(!localVmLeaseFor(target4).claim(threadId,readyBot.id,localVmOwnerBusy))throw new Error("this Local VM is already being used by another turn");localVmMode(cfg)==="pool"&&localVmSeatPool.touch(threadId),roomVmTarget=target4,localVmThreadTargets.set(threadId,target4),localVmActiveThreads.set(target4.key,threadId),localVmIdleFor(target4).touch();let setupIsCurrent=()=>!isCancelled?.()&&groupSpeakers.get(threadId)===roomSpeaker&&activeInternalGenerationByThread.
|
|
32083
|
+
get(threadId)===internalGeneration&&store4.group(readyGroup.id)?.memberIds.includes(readyBot.id)===!0&&store4.bot(readyBot.id)?.busy===!0,vm=await readyLocalVmForTurn(readyBot.id,target4,setupIsCurrent);if(!setupIsCurrent())return!1;if(!vm.ready||!vm.runtime)throw new Error(vm.problem??"the Local VM is not ready");let owner2=localVmLeaseFor(target4).current(localVmOwnerBusy);if(owner2?.threadId!==threadId||owner2.botId!==readyBot.id)throw new Error("the Local VM lease expired while preparing the\
|
|
32084
|
+
turn");integrations.localComputer=containerComputerMcp2(vm.runtime,controlIntegration(readyBot.id,threadId,internalGeneration,{localVmTarget:target4}),target4)}}catch(error66){let place2=roomPlan.computer;throw place2!=="cloud"&&place2!=="vm"&&place2!=="local"?error66:await asPlaceFailure(error66,place2,"room",readyBot,turnProvider(readyBot)==="vps"?"vps":"box")}let roomMembers=readyGroup.memberIds.map(id12=>store4.bot(id12)).filter(b11=>!!b11),roster=roomMembers.map(roomRosterLine).join(", "),
|
|
32085
|
+
roomHandoff=orchestration?.roomHandoffId?coordinator.node(orchestration.roomHandoffId):void 0,roomRequester=roomHandoff?.parentId?store4.bot(coordinator.node(roomHandoff.parentId)?.botId??"")?.name:void 0,requesterRule=roomRequester?` Don't use coordinate_bots toward @${roomRequester} or whoever assigned its work; to ask @${roomRequester} something, end your turn with the question \u2014 it is resumed with your reply.`:"",outsideRoom=integrations.agents&&orchestration&&!orchestration.roomHandoffId?
|
|
32086
|
+
reachablePeers(store4.bots,bot).filter(peer=>!readyGroup.memberIds.includes(peer.id)):[],system=[`You are ${bot.name}, a bot in the room "${readyGroup.name}" in Limix Bot.`,bot.title&&`Role: ${bot.title}.`,bot.description&&`About: ${bot.description}`,`Room members: ${roster}, and ${typeof userName=="string"?`${userName} (the human)`:roomPeople(threadId,userName)}.`,readyGroup.bulletin.trim()&&`Room bulletin (shared instructions for everyone):
|
|
32072
32087
|
${readyGroup.bulletin.trim()}`,`Reply as yourself, briefly and conversationally. To bring a teammate in, mention them like @Name \u2014 they'll see the conversation and respond.${readyGroup.dm?"":` To get ${typeof userName=="string"?`${userName}'s`:"a person's"} attention or ask them something blocking, write @you.`} A "[reacted \u{1F44D} to \u2026]" line is that person's whole reply to the message it names: \u{1F44D} means yes, go ahead, and \u{1F44E} means no.`,outsideRoom.length>0&&roomPeerRosterSystemPrompt(
|
|
32073
32088
|
outsideRoom),sharedNamesNote(roomMembers.filter(member=>member.id!==bot.id),!!integrations.agents),integrations.agents&&(CREDENTIAL_PROMPT+savedSecretsPrompt(botLogins.secretNamesFor(bot.id))+(orchestration&&!orchestration.roomHandoffId?THREADS_PROMPT:"")).trim(),integrations.agents&&(!orchestration||orchestration.roomHandoffId)&&"For actual Limix Bot teamwork, discover IDs with list_room_targets and use coordinate_bots for advice or work in this or another room. Do not substitute native coding \
|
|
32074
32089
|
helpers for these named bots. Consult only when needed to make a decision; no discussion step is mandatory. Give concrete responsibilities, exact accessible paths and acceptance checks. End your turn after assigning; busy teammates queue and results automatically resume you. When they return, finish the requested verification and give the user one final answer. Native helper names are not evidence that an Limix Bot teammate participated. Plain @mentions are only for conversational replies in thi\
|
|
@@ -32205,7 +32220,7 @@ remember(value3,kind2),stepContext:(bot,turn)=>stepContext(bot,turn,()=>liveTurn
|
|
|
32205
32220
|
cfg)}}async function readyLocalVmForTurn(botId,target4,isCurrent=()=>!0){localVmLifecycleBusy.add(target4.key);let pooled=target4.key.startsWith("pool:"),ownsProvision=!pooled&&!localVmProvisionBusy;ownsProvision&&(localVmProvisionBusy=!0);let status5;try{if(status5=await containerComputerStatus(void 0,void 0,target4),status5=await startStoppedPodmanMachine(status5,()=>containerComputerStatus(void 0,void 0,target4),()=>broadcast({kind:"computer",botId,state:"provisioning"})),noteLocalVmSeen(target4,
|
|
32206
32221
|
status5),!isCurrent())return status5;let action3=localVmWakeAction(status5);if(status5.ready||!action3||!status5.runtime||action3==="run"&&!pooled&&!ownsProvision)return status5;if(action3==="run"&&target4.key.startsWith("bot:")){let count12=await existingPerBotLocalVmCount(status5.runtime);if(!isCurrent()||count12>=localVmMaxInstances(cfg))return status5}broadcast({kind:"computer",botId,state:"provisioning"});try{status5=await containerComputerAction(action3,void 0,void 0,target4,localVmResources(
|
|
32207
32222
|
cfg))}catch{return localVmIdleFor(target4).touch(),status5}}finally{ownsProvision&&(localVmProvisionBusy=!1),localVmLifecycleBusy.delete(target4.key)}localVmIdleFor(target4).touch();let deadline=Date.now()+LOCAL_VM_DESKTOP_WAIT_MS;for(;isCurrent()&&!status5.ready&&status5.container==="running"&&Date.now()<deadline&&(await new Promise(resolve56=>setTimeout(resolve56,2e3)),!!isCurrent());)status5=await containerComputerStatus(void 0,void 0,target4);return status5}async function existingPerBotLocalVmCount(runtime2){
|
|
32208
|
-
return(await discoverExistingPerBotLocalVms(store4.bots,runtime2)).length}async function perBotLocalVmCountForModeChange(){let targets=[...new Map(store4.bots.map(bot=>{let target4=perBotLocalVmTarget(bot.id);return[target4.key,target4]})).values()];if(targets.length===0)return 0;let runtime2=await containerRuntimeStatus();return!runtime2.runtime||!runtime2.daemonUp?targets.some(target4=>
|
|
32223
|
+
return(await discoverExistingPerBotLocalVms(store4.bots,runtime2)).length}async function perBotLocalVmCountForModeChange(){let targets=[...new Map(store4.bots.map(bot=>{let target4=perBotLocalVmTarget(bot.id);return[target4.key,target4]})).values()];if(targets.length===0)return 0;let runtime2=await containerRuntimeStatus();return!runtime2.runtime||!runtime2.daemonUp?targets.some(target4=>existsSync101(target4.workspaceDir))?null:0:existingPerBotLocalVmCount(runtime2.runtime)}function configStatus(){
|
|
32209
32224
|
let eventLogMaxBytes=threadEventLogMaxBytes(cfg),eventLogRetentionDays=threadEventLogRetentionDays(cfg);return{cloudStarter:cloudPlanTier.starter(),waitingForRoom:engineMemory.waiting(),planTurns:starterCaps.status(),awakeLimit:starterAwake.limit(),pausedBots:starterAwake.paused(),xai:keyStatus(cfg.xai?.key),mistral:keyStatus(cfg.mistral?.key),cerebras:keyStatus(cfg.cerebras?.key),groq:keyStatus(cfg.groq?.key),greenference:keyStatus(cfg.greenference?.key),modelgo:keyStatus(cfg.modelgo?.key),meta:keyStatus(
|
|
32210
32225
|
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?
|
|
32211
32226
|
{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(
|
|
@@ -32251,7 +32266,7 @@ liveRoots,paused:()=>workspaceMaintenance.active||moveFreeze.frozen()}),chatApps
|
|
|
32251
32266
|
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&&
|
|
32252
32267
|
!HOSTED_WORKSPACE&&utilityParentPort===void 0,patch:(threadId,messageId2,text31,publishedPage)=>{store4.patchMessage(threadId,messageId2,{text:text31,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()&&
|
|
32253
32268
|
!HOSTED_WORKSPACE&&(auth.kind==="loopback"||ownHome.owner(auth)||CLOUD_PERSONAL&&cloudOwnerSession(auth))}));var keptAttachments=()=>{let routineFiles=routines?.attachmentPaths();return routineFiles&&calendarCalls?keptAttachmentNames([...store4.bots.map(bot=>bot.avatarUrl),cfg.profile?.avatarUrl],[workspaceBannerStore.current()?.name,...routineFiles,...calendarCalls.list().flatMap(call2=>call2.attachments?.map(file3=>file3.path)??[]),...[...turnAttachmentsByTurn.values()].flat().map(file3=>file3.
|
|
32254
|
-
path)]):null};createDeleteLeftovers({dataDir:DATA_DIR,store:store4,threadsReferencing,keptAttachments,deleteAttachment:name6=>deleteAttachment(
|
|
32269
|
+
path)]):null};createDeleteLeftovers({dataDir:DATA_DIR,store:store4,threadsReferencing,keptAttachments,deleteAttachment:name6=>deleteAttachment(join280(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)=>{
|
|
32255
32270
|
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,
|
|
32256
32271
|
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\
|
|
32257
32272
|
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,
|
|
@@ -32282,7 +32297,7 @@ seen,runOwners,runActor,personMarkRoom:personRooms.personMarkRoom,groupFor:perso
|
|
|
32282
32297
|
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,
|
|
32283
32298
|
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,
|
|
32284
32299
|
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\
|
|
32285
|
-
the team"),deleteBot:memberOwnBot.remove,threadsReferencing,deleteAttachment:name6=>deleteAttachment(
|
|
32300
|
+
the team"),deleteBot:memberOwnBot.remove,threadsReferencing,deleteAttachment:name6=>deleteAttachment(join280(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=>{
|
|
32286
32301
|
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,
|
|
32287
32302
|
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.
|
|
32288
32303
|
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().
|
|
@@ -32518,7 +32533,7 @@ id12)):memberIds;if(!allowedRoster(next))return json3(res,403,{error:"keep yours
|
|
|
32518
32533
|
{req,res,url:url2,path:path6,method:method2,auth,json:json3,readBody})||await dispatchRoutes([createInternalCredentialRequestRoutes({readBody:readInternalBody,request:body2=>secretCards.requestCredential(internalSender,internalCapability.threadId,body2)})],{req,res,url:url2,path:path6,method:method2,auth,json:json3,readBody})||await dispatchRoutes([createInternalSignInRoutes({readBody:readInternalBody,request:(site,reason3)=>requestSignIn(internalSender,internalCapability.threadId,site,reason3)})],
|
|
32519
32534
|
{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(),text31=typeof body2.text=="string"?body2.text.trim():"";if(!text31)return json3(
|
|
32520
32535
|
res,400,{error:"text required"});if(text31.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,text31,voiceBot.voice,void 0,callSignal2);requireActiveInternalCapability();let turnId=liveTurnByThread.get(internalCapability.threadId);if(!turnId)return json3(
|
|
32521
|
-
res,409,{error:"this turn has not started yet or already ended"});let saved=saveAudio(Buffer.from(audio2.bytes),audio2.mime);if(!
|
|
32536
|
+
res,409,{error:"this turn has not started yet or already ended"});let saved=saveAudio(Buffer.from(audio2.bytes),audio2.mime);if(!existsSync101(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:text31}),turnAttachmentsByTurn.set(key7,current3),console.info(`[voice-note] parked thread=${internalCapability.
|
|
32522
32537
|
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\
|
|
32523
32538
|
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.
|
|
32524
32539
|
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=
|