limixbot 0.2.13 → 0.3.1
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-Crvi6UFN.js → ActivityPanel-O6Su2c-u.js} +1 -1
- package/dist/assets/{App-DBQxC6tF.js → App-Bcey1qup.js} +108 -108
- package/dist/assets/{AppEventEditor-BKkrL3lm.js → AppEventEditor-BlJGPJ3Z.js} +1 -1
- package/dist/assets/{BotSettingsDialog-BVTAiGvS.js → BotSettingsDialog-PiCk9us7.js} +4 -4
- package/dist/assets/{BrowserPanel-CXiPysF8.js → BrowserPanel-BWcb5CXi.js} +1 -1
- package/dist/assets/{BrowserProfilesManager-B5ZQeFJ9.js → BrowserProfilesManager-dKHyQotG.js} +1 -1
- package/dist/assets/{CloudAddDialog-CjSOW3Ui.js → CloudAddDialog-D1ZSbkxV.js} +1 -1
- package/dist/assets/{ComputerFilesPane-VwEQWopG.js → ComputerFilesPane-wgtikCgi.js} +1 -1
- package/dist/assets/{ComputerPanel-C4y6Mvwd.js → ComputerPanel-Cyj53a7W.js} +2 -2
- package/dist/assets/{DataPanel-CeaLVEeb.js → DataPanel-BlBidswi.js} +1 -1
- package/dist/assets/{DesktopViewer-CfxFVwdn.js → DesktopViewer-D7JeLJbi.js} +1 -1
- package/dist/assets/{FilesView-B9X_qlkn.js → FilesView-CNkEKeZB.js} +1 -1
- package/dist/assets/{GrokMoveDialog-CuC9v4Fd.js → GrokMoveDialog-fyBulzXL.js} +2 -2
- package/dist/assets/{InspectorPanel-B6ZAVTyD.js → InspectorPanel-Cut2OqiB.js} +1 -1
- package/dist/assets/{KeyboardShortcutsModal-DkoOxF2t.js → KeyboardShortcutsModal-DnxUB4cd.js} +1 -1
- package/dist/assets/{LiveDesktop-BsPQ6sGB.js → LiveDesktop-CnbyXW61.js} +1 -1
- package/dist/assets/{LocalVmWorkspace-U6rVY7_g.js → LocalVmWorkspace-D9xFPGF0.js} +1 -1
- package/dist/assets/{MacLocalControl-CC-lKazM.js → MacLocalControl-CpswtfCI.js} +1 -1
- package/dist/assets/{MarkdownFilePreview-D0maDIQ1.js → MarkdownFilePreview-V-y-0ksi.js} +1 -1
- package/dist/assets/{MenuMotion-CLF0GByT.js → MenuMotion-VeZ_fZ8M.js} +1 -1
- package/dist/assets/NewBotDialog-rBjsSV0e.js +1 -0
- package/dist/assets/{PhoneAppDialog-CTPZwJnL.js → PhoneAppDialog-DAW1N-hM.js} +1 -1
- package/dist/assets/{PlacesRail-D510vk5R.js → PlacesRail-C_3Mh4C8.js} +1 -1
- package/dist/assets/{PluginsPanel-BC0YDZ8h.js → PluginsPanel-CMsgWSNg.js} +1 -1
- package/dist/assets/{ProIntroduction-BIiaveWm.js → ProIntroduction-6ByF2_US.js} +1 -1
- package/dist/assets/{RemoteAgentSettingsPanel-OVWheJHu.js → RemoteAgentSettingsPanel-D4X4rHMQ.js} +1 -1
- package/dist/assets/{RoomPanel-mDRTZ2vs.js → RoomPanel-mg6M04wy.js} +1 -1
- package/dist/assets/{RoutinesPage-9VDuovqw.js → RoutinesPage-DomuZMUT.js} +2 -2
- package/dist/assets/{SettingsModal-BHJvNrwz.js → SettingsModal-Dd9l0b2C.js} +1 -1
- package/dist/assets/{ShareTeamDialog-C4go2USY.js → ShareTeamDialog-B_0Gr8Mq.js} +1 -1
- package/dist/assets/{SignedInSites-Cm_X_p_X.js → SignedInSites-C-eqeBxT.js} +1 -1
- package/dist/assets/TeamLibraryPanel-DpXOFOQr.js +1 -0
- package/dist/assets/{TeamMapPage-CkYOrZ7X.js → TeamMapPage-CIQPYaxL.js} +1 -1
- package/dist/assets/{TriggersPage-_qYPJ97Z.js → TriggersPage-D7RDjrjV.js} +1 -1
- package/dist/assets/{VisibilitySection-CpwyInUL.js → VisibilitySection-Bimhk6c5.js} +1 -1
- package/dist/assets/{WebhookTrigger-CfspvK5m.js → WebhookTrigger-D5c2bPJu.js} +1 -1
- package/dist/assets/{WorksOnGrid-BtfeNPO2.js → WorksOnGrid-PZ-caKHg.js} +1 -1
- package/dist/assets/{abnfDiagram-YUKMZFIV-qTIn3JJ1.js → abnfDiagram-YUKMZFIV-D7az-C1J.js} +1 -1
- package/dist/assets/{activity-CEhxqMcq.js → activity-W_ia4q-Y.js} +1 -1
- package/dist/assets/{architectureDiagram-47P4ROYG-BQls0L4i.js → architectureDiagram-47P4ROYG-B2IC9169.js} +1 -1
- package/dist/assets/{blockDiagram-E7TT5TSB-DMD6noIL.js → blockDiagram-E7TT5TSB-FnweBzU4.js} +1 -1
- package/dist/assets/{c4Diagram-CRA5TL53-CIp2zuwT.js → c4Diagram-CRA5TL53-rxgwSaAP.js} +1 -1
- package/dist/assets/{calendar-days-Di_J-dvc.js → calendar-days-wM1DS-Cu.js} +1 -1
- package/dist/assets/channel-BQyC_QMX.js +1 -0
- package/dist/assets/{chunk-2Q5K7J3B-BBkqbpZ4.js → chunk-2Q5K7J3B-B7yhqEe8.js} +1 -1
- package/dist/assets/{chunk-5VM5RSS4-JdwNE0CO.js → chunk-5VM5RSS4-Sw6phnaf.js} +1 -1
- package/dist/assets/{chunk-7TKQ45FW-D_Zh7_1M.js → chunk-7TKQ45FW-CheglUSd.js} +1 -1
- package/dist/assets/{chunk-AW2ZBBNX-BvSbOQeA.js → chunk-AW2ZBBNX-CswkqPkf.js} +1 -1
- package/dist/assets/{chunk-FVRAUYC3-CXYsdaIb.js → chunk-FVRAUYC3-DeN53o4S.js} +2 -2
- package/dist/assets/{chunk-HTAEGDNF-CO93FKYG.js → chunk-HTAEGDNF-CCZ_Udf0.js} +1 -1
- package/dist/assets/{chunk-JWPE2WC7-Ko0D98Sv.js → chunk-JWPE2WC7-nG1rfC9P.js} +1 -1
- package/dist/assets/{chunk-KQW6MTUR-DBGMbUnJ.js → chunk-KQW6MTUR-Bh_TxL0e.js} +1 -1
- package/dist/assets/{chunk-XXDRQBXY-PVMPph1f.js → chunk-XXDRQBXY-CLIJBS-V.js} +1 -1
- package/dist/assets/{classDiagram-v2-K4WV4PDN-Z-SRrzrQ.js → classDiagram-v2-K4WV4PDN-B04FntQx.js} +1 -1
- package/dist/assets/{coins-QIRjm19F.js → coins-81htcDNx.js} +1 -1
- package/dist/assets/{core-Cb-3LQeb.js → core-BLAzrox0.js} +1 -1
- package/dist/assets/{cose-bilkent-JH36ORCC-DcOhjasx.js → cose-bilkent-JH36ORCC-D9PAieWF.js} +1 -1
- package/dist/assets/{cynefin-EF2NZ3EQ-D9Pv76Si.js → cynefin-EF2NZ3EQ-BAC2DRg5.js} +1 -1
- package/dist/assets/{cynefinDiagram-3GCD6N5R-1Nlm6fT4.js → cynefinDiagram-3GCD6N5R-Cc3k_C-5.js} +1 -1
- package/dist/assets/{dagre-W4DXFKR2-CW-TdWBz.js → dagre-W4DXFKR2-CpbzxBGo.js} +1 -1
- package/dist/assets/{diagram-2UJZ2QOL-DJYwBSWN.js → diagram-2UJZ2QOL-d22NGVzG.js} +1 -1
- package/dist/assets/{diagram-OVF4WLC6-ZajDgMU2.js → diagram-OVF4WLC6-BFTJTNpN.js} +1 -1
- package/dist/assets/{diagram-PFPMY2P6-D03UoQDq.js → diagram-PFPMY2P6-CA_YgAo3.js} +1 -1
- package/dist/assets/{diagram-UMYRVEAY-B9gI6La0.js → diagram-UMYRVEAY-CCsuWndY.js} +1 -1
- package/dist/assets/{diagram-YEKJPTXX-Dxzg_fDQ.js → diagram-YEKJPTXX-Bcwhmpgl.js} +1 -1
- package/dist/assets/{diagram-ZIFT7M5P-Cv6eTFZE.js → diagram-ZIFT7M5P-Bs1iIjhq.js} +1 -1
- package/dist/assets/{ebnfDiagram-VR2GEFS7-BCUklW6x.js → ebnfDiagram-VR2GEFS7-CFr96fLM.js} +1 -1
- package/dist/assets/{elk-IJKZMXRS-VcZs96wT.js → elk-IJKZMXRS-DSdTG_hW.js} +1 -1
- package/dist/assets/{erDiagram-O2IAPWRE-CJ61fO-Z.js → erDiagram-O2IAPWRE-BGdMdwi1.js} +1 -1
- package/dist/assets/{file-up-BObBqrEg.js → file-up-DvGMRF5I.js} +1 -1
- package/dist/assets/{flowDiagram-OXPTDLAJ-CQMoLXxB.js → flowDiagram-OXPTDLAJ-DL25A20O.js} +1 -1
- package/dist/assets/{ganttDiagram-R7TSEDQI-ev5i74AH.js → ganttDiagram-R7TSEDQI-DQaNIRGv.js} +1 -1
- package/dist/assets/{gitGraphDiagram-XJZIOB7I-B8MGdCiz.js → gitGraphDiagram-XJZIOB7I-B6ypA1ZF.js} +1 -1
- package/dist/assets/{import-name-6aD0J6QH.js → import-name-Cdh9ZlkK.js} +1 -1
- package/dist/assets/{index-Dpov1WyC.js → index-BaW02tJl.js} +1 -1
- package/dist/assets/{index-CRF26t5P.js → index-CxcnLo81.js} +1 -1
- package/dist/assets/{index-DgGTgaCO.js → index-oVds-_Vz.js} +2 -2
- package/dist/assets/{infoDiagram-5W2HQ5XZ-CoqaIohe.js → infoDiagram-5W2HQ5XZ-8YbtI4S4.js} +1 -1
- package/dist/assets/{ishikawaDiagram-K3B6WC7H-BMzA3Pkb.js → ishikawaDiagram-K3B6WC7H-DYpDWk2K.js} +1 -1
- package/dist/assets/{journeyDiagram-COXZFDF6-DLNIN037.js → journeyDiagram-COXZFDF6-BUd8Vnbq.js} +1 -1
- package/dist/assets/{kanban-definition-P3RFRI5V-savLUzO8.js → kanban-definition-P3RFRI5V-AywqsEBB.js} +1 -1
- package/dist/assets/{mcp-servers-D2hHUxUp.js → mcp-servers-Bu5RuYBT.js} +1 -1
- package/dist/assets/{mermaid.core-1h5EGl1v.js → mermaid.core-B5yiNmEY.js} +4 -4
- package/dist/assets/{mindmap-definition-LZFPQGKD-hMbAYcVv.js → mindmap-definition-LZFPQGKD-DRALSCg6.js} +1 -1
- package/dist/assets/{minimize-63hYzV5y.js → minimize-CWsi9mRL.js} +1 -1
- package/dist/assets/{monitor-DOeLdhQc.js → monitor-c1mf38zt.js} +1 -1
- package/dist/assets/{new-bot-DkcWCdL_.js → new-bot-mp2gi3ed.js} +1 -1
- package/dist/assets/{org-library-C-rnQ1YG.js → org-library-Bi3EieNo.js} +1 -1
- package/dist/assets/{package-format-CMpBgycc.js → package-format-CaPiTXn3.js} +1 -1
- package/dist/assets/{pegDiagram-BGZESJAR-BIY55aib.js → pegDiagram-BGZESJAR-Drj_UJz5.js} +1 -1
- package/dist/assets/{pieDiagram-CAPJLFHJ-DR8o8piD.js → pieDiagram-CAPJLFHJ-CL7MryRt.js} +1 -1
- package/dist/assets/{quadrantDiagram-GDMTTRAM-Dqb1703W.js → quadrantDiagram-GDMTTRAM-BvWxqPJn.js} +1 -1
- package/dist/assets/{rail-Ok1gt1lN.js → rail-DApFzTxo.js} +1 -1
- package/dist/assets/{railroadDiagram-SM67HX2B-ZWJ9xWQY.js → railroadDiagram-SM67HX2B-CGfR0UsO.js} +1 -1
- package/dist/assets/{remote-desktop-panel-ganxVzJo.js → remote-desktop-panel-B4uIIoh3.js} +1 -1
- package/dist/assets/{requirementDiagram-X7JNWC4A-Cjv_VLZj.js → requirementDiagram-X7JNWC4A-CJq96anP.js} +1 -1
- package/dist/assets/{sankeyDiagram-UM26HJRW-ChHoiXzB.js → sankeyDiagram-UM26HJRW-BdZSA65i.js} +1 -1
- package/dist/assets/{sequenceDiagram-ZO4K6R2Y-B67gwOH0.js → sequenceDiagram-ZO4K6R2Y-B5W6udgn.js} +1 -1
- package/dist/assets/{sizeCapture-INFHLROL-DOr4ZALb.js → sizeCapture-INFHLROL-CuKCNVLn.js} +1 -1
- package/dist/assets/{stateDiagram-v2-TBUQTH76-DnoBtm-E.js → stateDiagram-v2-TBUQTH76-C7mAgpvB.js} +1 -1
- package/dist/assets/{styles-BcVNrxGE.js → styles-C_rlkDrt.js} +2 -2
- package/dist/assets/styles-bUbK33f1.css +1 -0
- package/dist/assets/{swimlanes-N4OXWK64-2TFXb7MH.js → swimlanes-N4OXWK64-D-mimAU7.js} +1 -1
- package/dist/assets/swimlanesDiagram-K3J5GTZL-Dn31PG7h.js +8 -0
- package/dist/assets/{team-share-C9qIusMs.js → team-share-wuAG66b7.js} +1 -1
- package/dist/assets/{timeline-definition-YOQAKGHF-4zjxAMyG.js → timeline-definition-YOQAKGHF-C5prnOXi.js} +1 -1
- package/dist/assets/{usecaseDiagram-VIAY4XPW-CCfZ1eoO.js → usecaseDiagram-VIAY4XPW-BC-9KKSF.js} +1 -1
- package/dist/assets/{vennDiagram-BLWOH2XV-h7rTFRTN.js → vennDiagram-BLWOH2XV-LCNTQN9e.js} +1 -1
- package/dist/assets/{vi-KgT8L8Qj.js → vi-NX09tr5q.js} +1 -1
- package/dist/assets/{wardleyDiagram-YMQ3BMBF-CXwA22zv.js → wardleyDiagram-YMQ3BMBF-CtWGEzVU.js} +1 -1
- package/dist/assets/{xychartDiagram-TAQBALBS-d4qol5BJ.js → xychartDiagram-TAQBALBS-DadPRdBp.js} +1 -1
- package/dist/index.html +3 -3
- package/dist/rail.html +5 -5
- package/dist-server/container-mcp.js +22 -21
- package/dist-server/index.js +106 -105
- package/dist-server/openmausbot.js +24 -24
- package/dist-server/package.json +1 -1
- package/dist-server/pair-cli.js +24 -24
- package/dist-server/server/config.js +6 -1
- package/dist-server/server/container-computer.js +4 -4
- package/dist-server/server/host/team-connections-host.js +2 -2
- package/dist-server/server/index.js +20 -3
- package/dist-server/server/mcp-registry.js +2 -2
- package/dist-server/server/service-unit.js +1 -1
- package/dist-server/server/skill-library.js +1 -1
- package/dist-server/server/team-library.js +2 -2
- package/dist-server/shared/grok-import.js +1 -1
- package/dist-server/shared/package-format.js +3 -3
- package/dist-server/vps-container-mcp.js +22 -21
- package/dist-server/workspace-backup.worker.js +20 -20
- package/package.json +1 -1
- package/dist/assets/NewBotDialog-D9e-ED-j.js +0 -1
- package/dist/assets/TeamLibraryPanel-B-R6YFK-.js +0 -1
- package/dist/assets/channel-DRGNbeY-.js +0 -1
- package/dist/assets/styles-D-yh7Z23.css +0 -1
- package/dist/assets/swimlanesDiagram-K3J5GTZL-C_836Lnu.js +0 -8
package/dist-server/index.js
CHANGED
|
@@ -1653,8 +1653,8 @@ temp2,this.file)}catch(error66){console.error("mcp apps: could not save the app
|
|
|
1653
1653
|
hash:mcpServerConfigHash(server2)};entries4.set(name6,stored);let{at:_a6,...was}=before??{at:0},{at:_b,...now2}=stored;return(!before||JSON.stringify(was)!==JSON.stringify(now2)||stored.at-before.at>60*6e4)&&this.save(),next}recordList(name6,server2,tools2,uiExtension){let known={};for(let tool5 of tools2){let entry2=catalogTool(tool5);entry2&&Object.keys(known).length<MAX_TOOLS&&(known[tool5.name]=entry2)}return this.put(name6,server2,previous2=>({apps:Object.values(known).some(tool5=>tool5.resourceUri!==
|
|
1654
1654
|
void 0),uiExtension:uiExtension??previous2?.uiExtension??"unknown",tools:known,at:this.now()}))}recordTool(name6,server2,definition4){let tool5=catalogTool(definition4);if(!(!tool5||!tool5.resourceUri))return this.put(name6,server2,previous2=>({apps:!0,uiExtension:previous2?.uiExtension??"unknown",tools:{...previous2?.tools,[definition4.name]:tool5},at:previous2?.at??this.now()}))}forget(name6){this.load().delete(name6)&&this.save()}}}});function isRemoteMcpServer(server2){return"url"in server2}function mcpServerServes(server2,botId){return!server2.bot||server2.bot===botId}function isHarnessOwnedMcpEnvName(name6){return name6==="ELECTRON_RUN_AS_NODE"||name6.startsWith("OMB_")||name6.startsWith("OGB_")}function isReservedMcpEnvEntry(name6,value3){return name6==="ELECTRON_RUN_AS_NODE"?value3!=="1":isHarnessOwnedMcpEnvName(name6)}function perTurnCustomMcp(turn){if(!turn.integrations?.custom)return turn;let custom21={...turn.integrations.
|
|
1655
1655
|
custom};for(let[name6,server2]of Object.entries(custom21)){if("url"in server2)continue;let{[MCP_RESTART_ENV]:_restarts,...env}=server2.env,reserved=Object.entries(env).find(([key7,value3])=>isReservedMcpEnvEntry(key7,value3));if(reserved)throw new Error(`Custom MCP server \u201C${name6}\u201D cannot set reserved environment variable \u201C${reserved[0]}\u201D`);custom21[name6]={...server2,env}}return{...turn,integrations:{...turn.integrations,custom:custom21}}}function environmentEntryError(name6,value3){
|
|
1656
|
-
return ENV_NAME.test(name6)?isReservedMcpEnvEntry(name6,value3)?name6==="ELECTRON_RUN_AS_NODE"?`Environment variable \u201C${name6}\u201D is reserved by
|
|
1657
|
-
|
|
1656
|
+
return ENV_NAME.test(name6)?isReservedMcpEnvEntry(name6,value3)?name6==="ELECTRON_RUN_AS_NODE"?`Environment variable \u201C${name6}\u201D is reserved by Limix Bot; a custom server may set it to \u201C1\u201D only.`:`Environment variable \u201C${name6}\u201D is reserved by Limix Bot.`:null:`Environment variable \u201C${name6}\u201D is not valid.`}function headerError(name6,value3){return HEADER_NAME.test(name6)?/[\r\n]/.test(value3)?`Header \u201C${name6}\u201D must be a single line.`:null:`Heade\
|
|
1657
|
+
r \u201C${name6}\u201D is not a valid header name.`}function urlError(value3){let parsed2;try{parsed2=new URL(value3)}catch{return"Use a full address, like https://example.com/mcp."}return parsed2.protocol!=="https:"&&parsed2.protocol!=="http:"?"The address must start with http:// or https://.":parsed2.username||parsed2.password?"Put credentials in a header, not in the address.":null}function resolveOAuthClient(incoming,saved){if(!incoming)return{ok:!0,value:void 0};let clientSecret;if(incoming.
|
|
1658
1658
|
clientSecret===!0){if(!saved?.clientSecret||saved.clientId!==incoming.clientId)return{ok:!1,error:"No client secret is saved for this client ID. Enter it again, or leave it out for an app without one."};clientSecret=saved.clientSecret}else clientSecret=incoming.clientSecret;let scopes=[...new Set(incoming.scopes??[])];return{ok:!0,value:{clientId:incoming.clientId,...clientSecret?{clientSecret}:{},...scopes.length?{scopes}:{}}}}function looksRemote(raw){if(!raw||typeof raw!="object"||Array.isArray(
|
|
1659
1659
|
raw))return!1;let record31=raw;return"url"in record31||record31.type==="http"||record31.type==="sse"}function mcpServerNameError(name6){return MCP_NAME.test(name6)?RESERVED_MCP_NAMES.has(name6)?"That name is reserved by Limix Bot.":null:"Use 1\u201332 lowercase letters, numbers, underscores, or hyphens, starting with a letter."}function resolveSecrets(incoming,saved){let values4={};for(let[key7,value3]of Object.entries(incoming))if(value3===!0){let kept2=saved?.[key7];if(kept2===void 0)return{ok:!1,
|
|
1660
1660
|
error:`No saved value exists for ${key7}.`};values4[key7]=kept2}else values4[key7]=value3;return{ok:!0,values:values4}}function parseStdio(raw,mutation,existing){let parsed2=(mutation?stdioMutationSchema:stdioEntrySchema).safeParse(raw);if(!parsed2.success)return{ok:!1,error:parsed2.error.issues[0]?.message??"Invalid MCP server."};let incoming=parsed2.data.env??{};if(Object.keys(incoming).length>MAX_ENV)return{ok:!1,error:`Use at most ${MAX_ENV} environment variables.`};let env=resolveSecrets(incoming,
|
|
@@ -1723,82 +1723,82 @@ find(profile=>!currentIds.has(profile.id)&&removedPartitions.has(browserProfileP
|
|
|
1723
1723
|
let parsed2=storedAppConfigSchema.safeParse(value3);if(!parsed2.success)throw new Error(schemaIssue(parsed2.error,"Invalid stored configuration"));return parsed2.data}function loadBrowserProfileIdAliases(){try{let document4=external_exports.object({browserProfiles:legacyBrowserProfilesSchema.optional()}).safeParse(parseJson(readFileSync8(join4(DATA_DIR,"config.json"),"utf8")));return!document4.success||!document4.data.browserProfiles?new Map:migrateStoredBrowserProfiles(document4.data.browserProfiles).
|
|
1724
1724
|
aliases}catch{return new Map}}function parseConfigPatch(value3){let parsed2=appConfigPatchSchema.safeParse(value3);if(!parsed2.success)throw Object.assign(new Error(schemaIssue(parsed2.error,"Invalid configuration")),{status:400});return parsed2.data}function vpsSshAlias(cfg2){return isValidSshAlias(cfg2.vps?.sshAlias)?cfg2.vps.sshAlias:null}function browserEngineAttachCdpUrl(cfg2){return isValidCdpTarget(cfg2.browserEngine?.attachCdpUrl)?cfg2.browserEngine.attachCdpUrl:null}function roomTurnTimeoutMinutes(cfg2){
|
|
1725
1725
|
return cfg2.rooms?.turnTimeoutMinutes??DEFAULT_ROOM_TURN_TIMEOUT_MINUTES}function mcpCallTimeoutMinutes(cfg2){return cfg2.mcp?.callTimeoutMinutes??DEFAULT_MCP_CALL_TIMEOUT_MINUTES}function cacheKeepWarmSettings(cfg2){return{enabled:cfg2.cacheKeepWarm?.enabled===!0,windowMinutes:cfg2.cacheKeepWarm?.windowMinutes??180}}function threadEventLogMaxBytes(cfg2){let cap2=cfg2.threads?.eventLogMaxBytes;return typeof cap2=="number"&&Number.isFinite(cap2)&&cap2>0?cap2:null}function threadEventLogRetentionDays(cfg2){
|
|
1726
|
-
return cfg2.threads?.eventLogRetentionDays??null}function skillAuthoringEnabled(cfg2){return cfg2.features?.skillAuthoring!==!1}function skillReviewEnabled(cfg2){return skillAuthoringEnabled(cfg2)&&cfg2.features?.skillReview
|
|
1727
|
-
return cfg2.features?.autoRecall!==!1}function roomMemoryCaptureEnabled(cfg2){return cfg2.features?.roomMemoryCapture===!0}function captureQuietMs(cfg2){return cfg2.memory?.captureQuietMs??DEFAULT_CAPTURE_QUIET_MS}function tidyHour(cfg2){return cfg2.memory?.tidyHour??DEFAULT_TIDY_HOUR}function showToolCallsEnabled(cfg2){return cfg2.features?.showToolCalls===!0}function builtInBrowserEnabled(cfg2,_env=process.env){return cfg2.
|
|
1728
|
-
features?.sharedComputers===!0}function ownerLendingEnabled(cfg2){return cfg2.features?.sharedComputers!==!1}function claudeUserMcpEnabled(cfg2){return cfg2.features?.claudeUserMcp===!0}function engineLaunches(configs,env=process.env){return Object.fromEntries(Object.entries(configs).map(([id12,entry2])=>[id12,{...entry2,fallbackEnv:Object.fromEntries(fallbackEnv(entry2).map(name6=>[name6,env[name6]]))}]))}function fallbackEnv(entry2){
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
structuredClone(storedConfig.read()),lastIgnoredConfigWarning=""}catch(error66){if(error66?.code!=="ENOENT"){let reason3=error66 instanceof SyntaxError?"invalid JSON":error66 instanceof Error?error66.message:"unable to read configuration",warning=`config: ignoring ${join4(DATA_DIR,"config.json")} and using defaults: ${reason3}`;warning!==lastIgnoredConfigWarning&&console.warn(warning),lastIgnoredConfigWarning=warning}else lastIgnoredConfigWarning=
|
|
1732
|
-
|
|
1733
|
-
cfg2.anthropic={...cfg2.anthropic},process.env.OMB_ANTHROPIC_API_KEY!==void 0&&(cfg2.anthropic.key=process.env.OMB_ANTHROPIC_API_KEY),process.env.OMB_ANTHROPIC_API_URL!==void 0&&(cfg2.anthropic.url=process.env.OMB_ANTHROPIC_API_URL),cfg2.openai={...cfg2.openai},process.env.OMB_OPENAI_API_KEY!==void 0&&(cfg2.openai.key=process.env.OMB_OPENAI_API_KEY),cfg2.openrouter={...cfg2.openrouter},process.env.OMB_OPENROUTER_API_KEY!==void 0&&(cfg2.
|
|
1734
|
-
{...cfg2.openaiCompat},process.env.OPENAI_COMPAT_API_KEY!==void 0&&(cfg2.openaiCompat.key=process.env.OPENAI_COMPAT_API_KEY),process.env.OPENAI_COMPAT_URL!==void 0&&(cfg2.openaiCompat.url=process.env.OPENAI_COMPAT_URL),process.env.OPENAI_COMPAT_MODEL!==void 0&&(cfg2.openaiCompat.model=process.env.OPENAI_COMPAT_MODEL),process.env.OPENAI_COMPAT_PROVIDER!==void 0&&(cfg2.openaiCompat.provider=process.env.OPENAI_COMPAT_PROVIDER),cfg2.
|
|
1735
|
-
(cfg2.composio.apiKey=process.env.COMPOSIO_API_KEY),cfg2.box={...cfg2.box},process.env.BOX_TOKEN!==void 0&&(cfg2.box.token=process.env.BOX_TOKEN),cfg2.opencodeGo={...cfg2.opencodeGo},process.env.OPENCODE_API_KEY!==void 0&&(cfg2.opencodeGo.apiKey=process.env.OPENCODE_API_KEY),cfg2.tts={...cfg2.tts},process.env.OMB_TTS_KEY!==void 0&&(cfg2.tts.key=process.env.OMB_TTS_KEY);let presetVoice=process.env.OMB_TTS_DEFAULT_VOICE?.trim();presetVoice
|
|
1736
|
-
"elevenlabs"&&(cfg2.tts.voice=presetVoice),process.env.OMB_FISH_AUDIO_API_KEY!==void 0&&(cfg2.tts.fishKey=process.env.OMB_FISH_AUDIO_API_KEY),process.env.OMB_GEMINI_API_KEY!==void 0&&(cfg2.tts.geminiKey=process.env.OMB_GEMINI_API_KEY),cfg2.decider={...cfg2.decider},process.env.OMB_JEV_API_KEY!==void 0&&(cfg2.decider.key=process.env.OMB_JEV_API_KEY),process.env.OMB_OPENROUTER_DECIDER_KEY!==void 0&&(cfg2.decider.openrouterKey=process.env.
|
|
1737
|
-
void 0&&(cfg2.decider.workersAiToken=process.env.OMB_WORKERS_AI_TOKEN),cfg2.live=liveConfigWithEnv(cfg2.live),cfg2.imageGen={...cfg2.imageGen},process.env.OMB_OPENAI_IMAGE_KEY!==void 0&&(cfg2.imageGen.key=process.env.OMB_OPENAI_IMAGE_KEY),process.env.OMB_CUSTOM_IMAGE_KEY!==void 0&&(cfg2.imageGen.customApiKey=process.env.OMB_CUSTOM_IMAGE_KEY),process.env.OMB_GEMINI_IMAGE_KEY!==void 0&&(cfg2.imageGen.geminiKey=process.env.OMB_GEMINI_IMAGE_KEY);
|
|
1738
|
-
signInEnv.members)&&(cfg2.signIn={...cfg2.signIn,...signInEnv}),cfg2}function cacheUntilConfigChanges(derive2){let cached4=null;return()=>{let stamp2=settledFileStamp(join4(DATA_DIR,"config.json"));if(stamp2!==null&&cached4?.stamp===stamp2)return cached4.value;let value3=derive2(loadConfig());return cached4=stamp2===null||lastIgnoredConfigWarning!==""?null:{stamp:stamp2,value:value3},value3}}function syncCredentialEnv(patch2){let secrets=[[patch2.
|
|
1739
|
-
|
|
1740
|
-
openrouter?.key,"OMB_OPENROUTER_API_KEY"],[patch2.composio?.apiKey,"COMPOSIO_API_KEY"],[patch2.box?.token,"BOX_TOKEN"],[patch2.opencodeGo?.apiKey,"OPENCODE_API_KEY"],[patch2.tts?.key,"OMB_TTS_KEY"],[patch2.tts?.fishKey,"OMB_FISH_AUDIO_API_KEY"],[patch2.tts?.geminiKey,"OMB_GEMINI_API_KEY"],[patch2.decider?.key,"OMB_JEV_API_KEY"],[patch2.decider?.openrouterKey,"OMB_OPENROUTER_DECIDER_KEY"],[patch2.decider?.workersAiToken,"OMB_WORKERS_AI_TOKEN"],[patch2.
|
|
1741
|
-
imageGen?.customApiKey,"OMB_CUSTOM_IMAGE_KEY"],[patch2.imageGen?.geminiKey,"OMB_GEMINI_IMAGE_KEY"],[patch2.live?.key,"OMB_OPENAI_LIVE_KEY"]];for(let[value3,name6]of secrets)value3!==void 0&&(value3?process.env[name6]=value3:delete process.env[name6]);let settings=[[patch2.openaiCompat?.url,"OPENAI_COMPAT_URL"],[patch2.anthropic?.url,"OMB_ANTHROPIC_API_URL"],[patch2.openaiCompat?.model,"OPENAI_COMPAT_MODEL"],[patch2.openaiCompat?.provider,"
|
|
1742
|
-
for(let[value3,name6]of settings)value3!==void 0&&(value3?process.env[name6]=value3:delete process.env[name6])}function openCodeProviderKeyNameRefusal(name6){return OPENCODE_PROVIDER_KEY_NAME.test(name6)?name6==="OPENCODE_API_KEY"?"Save the OpenCode key in the OpenCode API key box instead.":name6.startsWith("OPENCODE_")||name6.startsWith("OMB_")||WORKSPACE_CREDENTIAL_ENV.includes(name6)||PROVIDER_CREDENTIAL_ENV.includes(name6)&&!OPENCODE_PROVIDER_ENV.
|
|
1743
|
-
|
|
1744
|
-
name6,saved[name6]]))}function mergeOpenCodeProviderKeys(cfg2,change2){let keys5=new Map(Object.entries(openCodeProviderKeys(cfg2)));for(let[name6,raw]of Object.entries(change2)){let value3=raw.trim();if(!value3){keys5.delete(name6);continue}let refusal7=openCodeProviderKeyNameRefusal(name6);if(refusal7)return{ok:!1,error:refusal7};if(!OPENCODE_PROVIDER_KEY_VALUE.test(value3))return{ok:!1,error:"That doesn't look like a key. Paste only the key, with
|
|
1745
|
-
size>OPENCODE_PROVIDER_KEY_LIMIT?{ok:!1,error:`OpenCode can hold up to ${OPENCODE_PROVIDER_KEY_LIMIT} provider keys. Remove one you no longer use, then add this one.`}:{ok:!0,keys:Object.fromEntries([...keys5].sort(([a],[b11])=>a<b11?-1:1))}}function onConfigSaved(listener2){return configSaveListeners.add(listener2),()=>{configSaveListeners.delete(listener2)}}function saveConfig(patch2,options2={}){let p3=join4(DATA_DIR,"config.json"),disk={};try{
|
|
1746
|
-
readFileSync8(p3,"utf8")));parsed2.success&&(disk=parsed2.data)}catch{}let checkedPatch=appConfigSchema.partial().extend({threads:threadsPatchSchema.optional(),newBots:newBotsPatchSchema.optional(),imageGen:imageGenPatchSchema.optional()}).parse(patch2),before=configSaveListeners.size?structuredClone(disk):disk,keepImageModels=keepKeysOutOfImageModels(disk,checkedPatch.imageGen),storedProfiles=storedBrowserProfilesSchema.safeParse(disk.browserProfiles);
|
|
1747
|
-
storedProfiles.data);for(let key7 of["xai","anthropic","mistral","cerebras","treg","postiz","groq","greenference","modelgo","meta","deepseek","openai","openrouter","openaiCompat","composio","box","opencodeGo","tts","decider","imageGen","live","profile","rooms","mcp","threads","context","memory","localVm","features","budgets","billing","decisions","loopGuard","onboarding","browserEngine","newBots","safetyFloor"]){let section4=checkedPatch[key7];if(!section4)
|
|
1748
|
-
safeParse(disk[key7]),merged2=current3.success?{...current3.data}:{};key7==="threads"&&!current3.success&&(merged2.maxConcurrentPerBot=defaultBotThreads()),Object.assign(merged2,section4,key7==="browserEngine"&&checkedPatch.browserEngine?.egress?{egress:{...jsonObjectSchema2.safeParse(merged2.egress).data,...checkedPatch.browserEngine.egress}}:{});for(let[sectionKey6,sectionValue]of Object.entries(section4))sectionValue===null&&delete merged2[sectionKey6];
|
|
1749
|
-
vps!==void 0&&(disk.vps=normalizeVpsConfig(checkedPatch.vps));for(let key7 of["language","computerName","everyBotRules"])checkedPatch[key7]!==void 0&&(disk[key7]=checkedPatch[key7]);if(checkedPatch.customDomain!==void 0&&(disk.customDomain=checkedPatch.customDomain),checkedPatch.signIn!==void 0&&(disk.signIn=checkedPatch.signIn),checkedPatch.automaticRecovery!==void 0&&(disk.automaticRecovery=checkedPatch.automaticRecovery),checkedPatch.cacheKeepWarm!==
|
|
1750
|
-
checkedPatch.defaultModelSelection!==void 0&&(disk.defaultModelSelection=checkedPatch.defaultModelSelection,disk.newBotDefaults)){let previousDefaults=newBotDefaultsSchema.parse(disk.newBotDefaults);disk.newBotDefaults=newBotDefaultsSchema.parse({...previousDefaults,profile:{...previousDefaults.profile,modelSelection:checkedPatch.defaultModelSelection}})}if(checkedPatch.newBotDefaults!==void 0&&(disk.newBotDefaults=checkedPatch.newBotDefaults,
|
|
1751
|
-
defaultModelSelection=checkedPatch.newBotDefaults.profile.modelSelection:delete disk.defaultModelSelection),checkedPatch.cliStartup!==void 0&&(disk.cliStartup=checkedPatch.cliStartup),checkedPatch.mcpServers!==void 0&&(disk.mcpServers=jsonObjectSchema2.parse(checkedPatch.mcpServers)),checkedPatch.browserProfiles!==void 0){let existingProfiles=new Map((storedProfiles.success?storedProfiles.data:[]).map(profile=>[profile.id,profile])),nextProfiles=checkedPatch.
|
|
1752
|
-
get(profile.id)?.partitionId;return partitionId?{...profile,partitionId}:profile}),routingConflict=browserProfileReplacementConflict(storedProfiles.success?storedProfiles.data:[],nextProfiles);if(routingConflict)throw Object.assign(new Error(routingConflict),{status:409});if(disk.browserProfiles=nextProfiles,disk.newBotDefaults){let defaults2=newBotDefaultsSchema.parse(disk.newBotDefaults),profileId=defaults2.profile.browserProfile;profileId&&
|
|
1753
|
-
id===profileId)&&(delete defaults2.profile.browserProfile,disk.newBotDefaults=defaults2)}}if(checkedPatch.instances){let currentInstances=jsonObjectSchema2.safeParse(disk.instances),storedInstances=currentInstances.success?currentInstances.data:{},diskInstances=options2.replaceInstances?{}:storedInstances;for(let[instanceId,entry2]of Object.entries(checkedPatch.instances)){let current3=jsonObjectSchema2.safeParse(storedInstances[instanceId]),
|
|
1754
|
-
replaceInstances)for(let key7 of Object.keys(instanceConfigSchema.shape))delete merged2[key7];Object.assign(merged2,entry2),diskInstances[instanceId]=merged2}disk.instances=diskInstances}if(checkedPatch.openaiCompat?.url!==void 0&&checkedPatch.instances?.openaiCompat===void 0){let instances=jsonObjectSchema2.safeParse(disk.instances),entry2=jsonObjectSchema2.safeParse(instances.success?instances.data.openaiCompat:void 0),config3=jsonObjectSchema2.
|
|
1755
|
-
environment=jsonObjectSchema2.safeParse(entry2.success?entry2.data.environment:void 0);if(entry2.success&&entry2.data.driver==="openai-compat"&&config3.success&&!config3.data.key&&(!config3.data.apiKeyEnv||config3.data.apiKeyEnv==="OPENAI_COMPAT_API_KEY")&&!(environment.success&&Object.hasOwn(environment.data,"OPENAI_COMPAT_API_KEY"))){let nextConfig={...config3.data};delete nextConfig.url,disk.instances.openaiCompat={...entry2.data,config:nextConfig}}}
|
|
1756
|
-
p3,JSON.stringify(disk,null,2),{mode:384}),storedConfig.forget();for(let listener2 of configSaveListeners)try{listener2(before,disk)}catch(error66){console.warn(`config: a save listener failed: ${error66 instanceof Error?error66.message:String(error66)}`)}}function withInstanceCli(cfg2,instanceId,cli){let next=structuredClone(cfg2),map7=persistableInstanceConfigs(next);if(!Object.hasOwn(map7,instanceId))return{ok:!1,config:cfg2};let entry2=map7[instanceId],
|
|
1757
|
-
safeParse(entry2.config);if(cliKey){let nextConfig=currentConfig.success?{...currentConfig.data}:{};nextConfig.cli=cliKey,entry2.config=nextConfig}else if(currentConfig.success&&Object.hasOwn(currentConfig.data,"cli")){let rest={...currentConfig.data};delete rest.cli,entry2.config=Object.keys(rest).length?rest:void 0}return next.instances=map7,{ok:!0,config:next}}function persistableInstanceConfigs(cfg2){let map7=instanceConfigs(cfg2);for(let[id12,
|
|
1758
|
-
instances?.[id12]?.environment;environment?entry2.environment={...environment}:delete entry2.environment;let config3=cfg2.instances?.[id12]?.config;config3!==void 0?entry2.config=structuredClone(config3):delete entry2.config}return map7}function claudeInstanceOwnsRouting(environment){return CLAUDE_ROUTING_ENV.some(key7=>typeof environment?.[key7]=="string"&&environment[key7]!=="")}function instanceOwnsRouting(cfg2,entry2,routingDefaults){let config3=typeof entry2.
|
|
1759
|
-
null&&!Array.isArray(entry2.config)?entry2.config:{},own4=value3=>typeof value3=="string"&&value3.trim()!=="",ownUrl=(...workspace)=>own4(config3.url)&&!workspace.some(url2=>url2!==void 0&&sameUrl(config3.url,url2)),compatKeyEnv=routingDefaults?.apiKeyEnv??"OPENAI_COMPAT_API_KEY";switch(entry2.driver){case"claudeAgent":return claudeInstanceOwnsRouting(entry2.environment);case"openai-compat":return own4(config3.key)||own4(entry2.environment?.OPENAI_COMPAT_API_KEY)||
|
|
1760
|
-
own4(config3.apiKeyEnv)&&config3.apiKeyEnv!==compatKeyEnv||ownUrl(routingDefaults?.url||cfg2.openaiCompat?.url||process.env.OPENAI_COMPAT_URL||"https://openrouter.ai/api/v1");case"mistral":return own4(entry2.environment?.MISTRAL_API_KEY)||ownUrl("https://api.mistral.ai/v1");case"cerebras":return own4(entry2.environment?.CEREBRAS_API_KEY)||ownUrl("https://api.cerebras.ai/v1");case"groq":return own4(entry2.environment?.GROQ_API_KEY)||ownUrl("https://api.
|
|
1761
|
-
|
|
1762
|
-
|
|
1763
|
-
greenference.key),driver==="modelgo"&&cfg2.modelgo?.key&&environment.set("MODELGO_API_KEY",cfg2.modelgo.key),driver==="meta"&&cfg2.meta?.key&&environment.set("META_API_KEY",cfg2.meta.key),driver==="deepseekAgent"&&cfg2.deepseek?.key&&environment.set("DEEPSEEK_API_KEY",cfg2.deepseek.key),driver==="grok"&&cfg2.xai?.key&&environment.set("XAI_API_KEY",cfg2.xai.key),driver==="claudeAgent")for(let[name6,value3]of Object.entries(anthropicKeyEnv(cfg2.anthropic,instanceId===
|
|
1764
|
-
set(name6,value3);if(driver==="openai-compat"&&instanceId===OPENAI_API_INSTANCE?cfg2.openai?.key&&environment.set("OMB_OPENAI_API_KEY",cfg2.openai.key):driver==="openai-compat"&&instanceId===OPENROUTER_API_INSTANCE?cfg2.openrouter?.key&&environment.set("OMB_OPENROUTER_API_KEY",cfg2.openrouter.key):(driver==="openai-compat"&&cfg2.openaiCompat?.key&&environment.set("OPENAI_COMPAT_API_KEY",cfg2.openaiCompat.key),driver==="openai-compat"&&cfg2.openaiCompat?.url&&environment.
|
|
1765
|
-
openaiCompat.url)),driver==="opencodeGo"){for(let[name6,key7]of Object.entries(openCodeProviderKeys(cfg2)))environment.set(name6,key7);cfg2.opencodeGo?.apiKey&&environment.set("OPENCODE_API_KEY",cfg2.opencodeGo.apiKey)}return environment}function instanceConfigs(cfg2){let configured2=cfg2.instances&&Object.keys(cfg2.instances).length?cfg2.instances:null,map7=withoutComputerEngine(configured2?{...configured2}:{...DEFAULT_FLEET});if(configured2&&(Object.hasOwn(configured2,
|
|
1766
|
-
configured2,"grok")||Object.hasOwn(configured2,"codex")))for(let[id12,entry2]of Object.entries(PRODUCT_FLEET_ADDITIONS))Object.hasOwn(map7,id12)||(map7[id12]={...entry2});for(let[id12,builtIn]of Object.entries(API_KEY_FLEET)){let saved=map7[id12];if(!saved||saved.driver!==builtIn.driver)continue;let savedConfig=typeof saved.config=="object"&&saved.config!==null&&!Array.isArray(saved.config)?saved.config:{};map7[id12]={...builtIn,...saved,config:{...builtIn.config,...savedConfig}}}
|
|
1767
|
-
driver==="codex"&&!map7.chatgpt.config?.cli){let cli=map7.codex?.config?.cli;typeof cli=="string"&&cli&&(map7.chatgpt={...map7.chatgpt,config:{...map7.chatgpt.config,cli}})}for(let[id12,sourceEntry]of Object.entries(map7)){let entry2={...sourceEntry};map7[id12]=entry2;let environment={...entry2.environment},builtIn=API_KEY_FLEET[id12],routingDefaults=builtIn?.driver===entry2.driver?builtIn.config:void 0,ownsRouting=instanceOwnsRouting(cfg2,entry2,routingDefaults);if(!ownsRouting)
|
|
1768
|
-
cfg2,id12,entry2.driver))environment[key7]=value3;if(entry2.environment=environment,entry2.driver==="groq"&&cfg2.groq?.url&&!ownsRouting&&(entry2.config={...entry2.config,url:cfg2.groq.url}),entry2.driver==="meta"&&cfg2.meta?.url&&!ownsRouting&&(entry2.config={...entry2.config,url:cfg2.meta.url}),entry2.driver==="openai-compat"&&cfg2.openaiCompat&&id12!==OPENAI_API_INSTANCE&&id12!==OPENROUTER_API_INSTANCE){let defaults2={};if(cfg2.openaiCompat.url&&(defaults2.
|
|
1769
|
-
model&&(defaults2.model=cfg2.openaiCompat.model),cfg2.openaiCompat.provider&&(defaults2.provider=cfg2.openaiCompat.provider),Object.keys(defaults2).length){let raw=entry2.config,merged2={...typeof raw=="object"&&raw!==null&&!Array.isArray(raw)?raw:{}};for(let[k3,v4]of Object.entries(defaults2))k3==="provider"&&typeof merged2[k3]=="string"||(typeof merged2[k3]!="string"||!merged2[k3].trim())&&(merged2[k3]=v4);entry2.config=merged2}}}return map7}function skipMcpEntry(name6,why){
|
|
1770
|
-
${why}`;reportedMcpSkips.has(key7)||(reportedMcpSkips.add(key7),console.error(`mcpServers.${JSON.stringify(name6)} skipped \u2014 ${why}`))}function customMcpServers(cfg2,only2,botId){let out={};for(let[name6,raw]of Object.entries(cfg2.mcpServers??{})){if(only2&&!only2.includes(name6))continue;let parsed2=parseStoredMcpServer(name6,raw);if(!parsed2.ok){skipMcpEntry(name6,`${parsed2.error} Expected { "command": "npx", "args": [...], "env": { ... } } or { "type": "http", "url"
|
|
1771
|
-
|
|
1772
|
-
MIN_ROOM_TURN_TIMEOUT_MINUTES,MAX_ROOM_TURN_TIMEOUT_MINUTES,DEFAULT_MCP_CALL_TIMEOUT_MINUTES,MIN_MCP_CALL_TIMEOUT_MINUTES,MAX_MCP_CALL_TIMEOUT_MINUTES,MIN_THREAD_EVENT_LOG_BYTES,MAX_THREAD_EVENT_LOG_BYTES,vpsConfigSchema,roomConfigSchema,mcpConfigSchema,browserProfileSchema,legacyBrowserProfileSchema,legacyBrowserProfilesSchema,storedBrowserProfilesSchema,browserProfilesSchema,featureConfigSchema,onboardingConfigSchema,instanceConfigSchema,instanceConfigMapSchema,
|
|
1773
|
-
cacheKeepWarmSchema,threadsConfigSchema,newBotsConfigSchema,newBotsPatchSchema,threadsPatchSchema,appConfigSchema,storedAppConfigSchema,appConfigPatchSchema,jsonObjectSchema2,DEFAULT_SKILL_REVIEW_STEPS,MIN_SKILL_REVIEW_STEPS,MAX_SKILL_REVIEW_STEPS,DEFAULT_CAPTURE_QUIET_MS,DEFAULT_TIDY_HOUR,DATA_DIR,LEGACY_DATA_DIR,EVENTS_DIR,NATIVE_DIR,lastIgnoredConfigWarning,storedConfig,OPENCODE_PROVIDER_KEY_LIMIT,OPENCODE_PROVIDER_KEY_NAME,OPENCODE_PROVIDER_KEY_VALUE,
|
|
1774
|
-
reportedMcpSkips,init_config3=__esm({"server/config.ts"(){"use strict";init_data_dir();init_sign_in_env();init_zod();init_image_generation_config();init_bot_avatar();init_atomic();init_bot_thread_limits();init_anthropic_key_env();init_computer_engine_removal();init_new_bot_defaults();init_replay_settings();init_wire();init_contracts();init_instance_fleets();init_instance_fleets();init_cache_keepwarm();init_provider_icon();init_side_jobs();init_loop_guard();
|
|
1775
|
-
init_mcp_registry();init_connection();init_schema();init_config();init_live_config();init_config2();init_room_context_settings();init_local_vm_settings();init_local_vm_settings();init_credential_env();optionalText2=external_exports.string().optional(),SSH_ALIAS=/^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$/,LEGACY_BROWSER_PROFILE_ID=/^[A-Za-z0-9_-]{1,40}$/,BROWSER_PROFILE_ID=/^[a-z0-9_-]{1,40}$/,FISH_TTS_MODELS=["s2.1-pro","s2.1-pro-free"],DEFAULT_ROOM_TURN_TIMEOUT_MINUTES=
|
|
1776
|
-
1,MAX_ROOM_TURN_TIMEOUT_MINUTES=1440,DEFAULT_MCP_CALL_TIMEOUT_MINUTES=10,MIN_MCP_CALL_TIMEOUT_MINUTES=1,MAX_MCP_CALL_TIMEOUT_MINUTES=60,MIN_THREAD_EVENT_LOG_BYTES=256*1024,MAX_THREAD_EVENT_LOG_BYTES=4*1024*1024*1024;vpsConfigSchema=external_exports.object({sshAlias:external_exports.string().refine(value3=>value3===""||isValidSshAlias(value3),{message:"must be a simple SSH config alias"}).optional()}),roomConfigSchema=external_exports.object({turnTimeoutMinutes:external_exports.
|
|
1777
|
-
MIN_ROOM_TURN_TIMEOUT_MINUTES).max(MAX_ROOM_TURN_TIMEOUT_MINUTES)}),mcpConfigSchema=external_exports.object({callTimeoutMinutes:external_exports.number().int().min(MIN_MCP_CALL_TIMEOUT_MINUTES).max(MAX_MCP_CALL_TIMEOUT_MINUTES).optional()}).strict(),browserProfileSchema=external_exports.object({id:external_exports.string().regex(BROWSER_PROFILE_ID).refine(id12=>id12!=="guest","guest is reserved"),name:external_exports.string().trim().min(1).max(40),browser:external_exports.literal(
|
|
1778
|
-
strict(),legacyBrowserProfileSchema=external_exports.object({id:external_exports.string().regex(LEGACY_BROWSER_PROFILE_ID).refine(id12=>id12!=="guest","guest is reserved"),name:external_exports.string().trim().min(1).max(40),partitionId:external_exports.string().regex(LEGACY_BROWSER_PROFILE_ID).refine(id12=>id12!=="guest","guest is reserved").optional(),browser:external_exports.literal("chrome").optional()}).strict();legacyBrowserProfilesSchema=external_exports.array(legacyBrowserProfileSchema).
|
|
1726
|
+
return cfg2.threads?.eventLogRetentionDays??null}function skillAuthoringEnabled(cfg2){return cfg2.features?.skillAuthoring!==!1}function skillAutoApplyEnabled(cfg2){return cfg2.features?.skillAutoApply!==!1}function skillReviewEnabled(cfg2){return skillAuthoringEnabled(cfg2)&&cfg2.features?.skillReview!==!1}function skillReviewSteps(cfg2){let raw=cfg2.features?.skillReviewSteps,value3=typeof raw=="number"&&Number.isFinite(raw)?Math.round(raw):DEFAULT_SKILL_REVIEW_STEPS;return Math.min(MAX_SKILL_REVIEW_STEPS,
|
|
1727
|
+
Math.max(MIN_SKILL_REVIEW_STEPS,value3))}function autoRecallEnabled(cfg2){return cfg2.features?.autoRecall!==!1}function roomMemoryCaptureEnabled(cfg2){return cfg2.features?.roomMemoryCapture===!0}function captureQuietMs(cfg2){return cfg2.memory?.captureQuietMs??DEFAULT_CAPTURE_QUIET_MS}function tidyHour(cfg2){return cfg2.memory?.tidyHour??DEFAULT_TIDY_HOUR}function showToolCallsEnabled(cfg2){return cfg2.features?.showToolCalls===!0}function builtInBrowserEnabled(cfg2,_env=process.env){return cfg2.
|
|
1728
|
+
features?.browser!==!1}function sharedComputersEnabled(cfg2){return cfg2.features?.sharedComputers===!0}function ownerLendingEnabled(cfg2){return cfg2.features?.sharedComputers!==!1}function claudeUserMcpEnabled(cfg2){return cfg2.features?.claudeUserMcp===!0}function engineLaunches(configs,env=process.env){return Object.fromEntries(Object.entries(configs).map(([id12,entry2])=>[id12,{...entry2,fallbackEnv:Object.fromEntries(fallbackEnv(entry2).map(name6=>[name6,env[name6]]))}]))}function fallbackEnv(entry2){
|
|
1729
|
+
let config3=typeof entry2.config=="object"&&entry2.config!==null&&!Array.isArray(entry2.config)?entry2.config:{},named4=typeof config3.apiKeyEnv=="string"&&config3.apiKeyEnv?config3.apiKeyEnv:void 0;switch(entry2.driver){case"mistral":return["MISTRAL_API_KEY"];case"cerebras":return["CEREBRAS_API_KEY"];case"grok":return[named4??"XAI_API_KEY"];case"openai-compat":return named4&&Object.values(API_KEY_FLEET).some(own4=>own4.config?.apiKeyEnv===named4)?[named4]:[...new Set([named4??"OPENAI_COMPAT_API\
|
|
1730
|
+
_KEY","OPENAI_COMPAT_API_KEY","OPENAI_COMPAT_URL","OPENAI_COMPAT_MODEL","OPENAI_COMPAT_PROVIDER"])];default:return[]}}function changedInstanceIds(before,after){return[...new Set([...Object.keys(before),...Object.keys(after)])].filter(id12=>!isDeepStrictEqual(before[id12],after[id12]))}function ensureDirs(){if(!existsSync2(DATA_DIR)&&existsSync2(LEGACY_DATA_DIR))try{renameSync3(LEGACY_DATA_DIR,DATA_DIR)}catch{}for(let dir of[DATA_DIR,EVENTS_DIR,NATIVE_DIR])mkdirSync2(dir,{recursive:!0});migrateLegacyFeatureFlags(
|
|
1731
|
+
DATA_DIR)}function loadConfig(){let cfg2={};try{cfg2=structuredClone(storedConfig.read()),lastIgnoredConfigWarning=""}catch(error66){if(error66?.code!=="ENOENT"){let reason3=error66 instanceof SyntaxError?"invalid JSON":error66 instanceof Error?error66.message:"unable to read configuration",warning=`config: ignoring ${join4(DATA_DIR,"config.json")} and using defaults: ${reason3}`;warning!==lastIgnoredConfigWarning&&console.warn(warning),lastIgnoredConfigWarning=warning}else lastIgnoredConfigWarning=
|
|
1732
|
+
""}for(let[name6,env]of[["mistral","MISTRAL_API_KEY"],["cerebras","CEREBRAS_API_KEY"],["groq","OMB_GROQ_API_KEY"],["meta","OMB_META_API_KEY"],["deepseek","OMB_DEEPSEEK_API_KEY"],["greenference","OMB_GREENFERENCE_API_KEY"],["modelgo","OMB_MODELGO_API_KEY"],["xai","XAI_API_KEY"]])cfg2[name6]={...cfg2[name6],...process.env[env]!==void 0?{key:process.env[env]}:{}};process.env.OMB_TREG_KEY!==void 0&&(cfg2.treg={...cfg2.treg,key:process.env.OMB_TREG_KEY}),process.env.OMB_POSTIZ_API_KEY!==void 0&&(cfg2.
|
|
1733
|
+
postiz={...cfg2.postiz,key:process.env.OMB_POSTIZ_API_KEY}),cfg2.anthropic={...cfg2.anthropic},process.env.OMB_ANTHROPIC_API_KEY!==void 0&&(cfg2.anthropic.key=process.env.OMB_ANTHROPIC_API_KEY),process.env.OMB_ANTHROPIC_API_URL!==void 0&&(cfg2.anthropic.url=process.env.OMB_ANTHROPIC_API_URL),cfg2.openai={...cfg2.openai},process.env.OMB_OPENAI_API_KEY!==void 0&&(cfg2.openai.key=process.env.OMB_OPENAI_API_KEY),cfg2.openrouter={...cfg2.openrouter},process.env.OMB_OPENROUTER_API_KEY!==void 0&&(cfg2.
|
|
1734
|
+
openrouter.key=process.env.OMB_OPENROUTER_API_KEY),cfg2.openaiCompat={...cfg2.openaiCompat},process.env.OPENAI_COMPAT_API_KEY!==void 0&&(cfg2.openaiCompat.key=process.env.OPENAI_COMPAT_API_KEY),process.env.OPENAI_COMPAT_URL!==void 0&&(cfg2.openaiCompat.url=process.env.OPENAI_COMPAT_URL),process.env.OPENAI_COMPAT_MODEL!==void 0&&(cfg2.openaiCompat.model=process.env.OPENAI_COMPAT_MODEL),process.env.OPENAI_COMPAT_PROVIDER!==void 0&&(cfg2.openaiCompat.provider=process.env.OPENAI_COMPAT_PROVIDER),cfg2.
|
|
1735
|
+
composio={...cfg2.composio},process.env.COMPOSIO_API_KEY!==void 0&&(cfg2.composio.apiKey=process.env.COMPOSIO_API_KEY),cfg2.box={...cfg2.box},process.env.BOX_TOKEN!==void 0&&(cfg2.box.token=process.env.BOX_TOKEN),cfg2.opencodeGo={...cfg2.opencodeGo},process.env.OPENCODE_API_KEY!==void 0&&(cfg2.opencodeGo.apiKey=process.env.OPENCODE_API_KEY),cfg2.tts={...cfg2.tts},process.env.OMB_TTS_KEY!==void 0&&(cfg2.tts.key=process.env.OMB_TTS_KEY);let presetVoice=process.env.OMB_TTS_DEFAULT_VOICE?.trim();presetVoice&&
|
|
1736
|
+
!cfg2.tts.voice?.trim()&&(cfg2.tts.provider??"elevenlabs")==="elevenlabs"&&(cfg2.tts.voice=presetVoice),process.env.OMB_FISH_AUDIO_API_KEY!==void 0&&(cfg2.tts.fishKey=process.env.OMB_FISH_AUDIO_API_KEY),process.env.OMB_GEMINI_API_KEY!==void 0&&(cfg2.tts.geminiKey=process.env.OMB_GEMINI_API_KEY),cfg2.decider={...cfg2.decider},process.env.OMB_JEV_API_KEY!==void 0&&(cfg2.decider.key=process.env.OMB_JEV_API_KEY),process.env.OMB_OPENROUTER_DECIDER_KEY!==void 0&&(cfg2.decider.openrouterKey=process.env.
|
|
1737
|
+
OMB_OPENROUTER_DECIDER_KEY),process.env.OMB_WORKERS_AI_TOKEN!==void 0&&(cfg2.decider.workersAiToken=process.env.OMB_WORKERS_AI_TOKEN),cfg2.live=liveConfigWithEnv(cfg2.live),cfg2.imageGen={...cfg2.imageGen},process.env.OMB_OPENAI_IMAGE_KEY!==void 0&&(cfg2.imageGen.key=process.env.OMB_OPENAI_IMAGE_KEY),process.env.OMB_CUSTOM_IMAGE_KEY!==void 0&&(cfg2.imageGen.customApiKey=process.env.OMB_CUSTOM_IMAGE_KEY),process.env.OMB_GEMINI_IMAGE_KEY!==void 0&&(cfg2.imageGen.geminiKey=process.env.OMB_GEMINI_IMAGE_KEY);
|
|
1738
|
+
let signInEnv=signInFromEnv();return(signInEnv.admins||signInEnv.members)&&(cfg2.signIn={...cfg2.signIn,...signInEnv}),cfg2}function cacheUntilConfigChanges(derive2){let cached4=null;return()=>{let stamp2=settledFileStamp(join4(DATA_DIR,"config.json"));if(stamp2!==null&&cached4?.stamp===stamp2)return cached4.value;let value3=derive2(loadConfig());return cached4=stamp2===null||lastIgnoredConfigWarning!==""?null:{stamp:stamp2,value:value3},value3}}function syncCredentialEnv(patch2){let secrets=[[patch2.
|
|
1739
|
+
xai?.key,"XAI_API_KEY"],[patch2.mistral?.key,"MISTRAL_API_KEY"],[patch2.cerebras?.key,"CEREBRAS_API_KEY"],[patch2.treg?.key,"OMB_TREG_KEY"],[patch2.postiz?.key,"OMB_POSTIZ_API_KEY"],[patch2.groq?.key,"OMB_GROQ_API_KEY"],[patch2.greenference?.key,"OMB_GREENFERENCE_API_KEY"],[patch2.modelgo?.key,"OMB_MODELGO_API_KEY"],[patch2.meta?.key,"OMB_META_API_KEY"],[patch2.deepseek?.key,"OMB_DEEPSEEK_API_KEY"],[patch2.anthropic?.key,"OMB_ANTHROPIC_API_KEY"],[patch2.openaiCompat?.key,"OPENAI_COMPAT_API_KEY"],
|
|
1740
|
+
[patch2.openai?.key,"OMB_OPENAI_API_KEY"],[patch2.openrouter?.key,"OMB_OPENROUTER_API_KEY"],[patch2.composio?.apiKey,"COMPOSIO_API_KEY"],[patch2.box?.token,"BOX_TOKEN"],[patch2.opencodeGo?.apiKey,"OPENCODE_API_KEY"],[patch2.tts?.key,"OMB_TTS_KEY"],[patch2.tts?.fishKey,"OMB_FISH_AUDIO_API_KEY"],[patch2.tts?.geminiKey,"OMB_GEMINI_API_KEY"],[patch2.decider?.key,"OMB_JEV_API_KEY"],[patch2.decider?.openrouterKey,"OMB_OPENROUTER_DECIDER_KEY"],[patch2.decider?.workersAiToken,"OMB_WORKERS_AI_TOKEN"],[patch2.
|
|
1741
|
+
imageGen?.key,"OMB_OPENAI_IMAGE_KEY"],[patch2.imageGen?.customApiKey,"OMB_CUSTOM_IMAGE_KEY"],[patch2.imageGen?.geminiKey,"OMB_GEMINI_IMAGE_KEY"],[patch2.live?.key,"OMB_OPENAI_LIVE_KEY"]];for(let[value3,name6]of secrets)value3!==void 0&&(value3?process.env[name6]=value3:delete process.env[name6]);let settings=[[patch2.openaiCompat?.url,"OPENAI_COMPAT_URL"],[patch2.anthropic?.url,"OMB_ANTHROPIC_API_URL"],[patch2.openaiCompat?.model,"OPENAI_COMPAT_MODEL"],[patch2.openaiCompat?.provider,"OPENAI_COMP\
|
|
1742
|
+
AT_PROVIDER"],...liveSettingEnv(patch2.live)];for(let[value3,name6]of settings)value3!==void 0&&(value3?process.env[name6]=value3:delete process.env[name6])}function openCodeProviderKeyNameRefusal(name6){return OPENCODE_PROVIDER_KEY_NAME.test(name6)?name6==="OPENCODE_API_KEY"?"Save the OpenCode key in the OpenCode API key box instead.":name6.startsWith("OPENCODE_")||name6.startsWith("OMB_")||WORKSPACE_CREDENTIAL_ENV.includes(name6)||PROVIDER_CREDENTIAL_ENV.includes(name6)&&!OPENCODE_PROVIDER_ENV.
|
|
1743
|
+
includes(name6)?`Limix keeps ${name6} for itself, so OpenCode can't be given it here. Put this key in opencode.json instead.`:void 0:"Use the name the provider reads its key from: capitals, ending in _API_KEY, _KEY or _TOKEN, such as VENICE_API_KEY."}function openCodeProviderKeys(cfg2){let saved=cfg2.opencodeGo?.providerKeys??{},usable=Object.keys(saved).sort().filter(name6=>!openCodeProviderKeyNameRefusal(name6)&&OPENCODE_PROVIDER_KEY_VALUE.test(saved[name6]??"")).slice(0,OPENCODE_PROVIDER_KEY_LIMIT);
|
|
1744
|
+
return Object.fromEntries(usable.map(name6=>[name6,saved[name6]]))}function mergeOpenCodeProviderKeys(cfg2,change2){let keys5=new Map(Object.entries(openCodeProviderKeys(cfg2)));for(let[name6,raw]of Object.entries(change2)){let value3=raw.trim();if(!value3){keys5.delete(name6);continue}let refusal7=openCodeProviderKeyNameRefusal(name6);if(refusal7)return{ok:!1,error:refusal7};if(!OPENCODE_PROVIDER_KEY_VALUE.test(value3))return{ok:!1,error:"That doesn't look like a key. Paste only the key, with n\
|
|
1745
|
+
o spaces."};keys5.set(name6,value3)}return keys5.size>OPENCODE_PROVIDER_KEY_LIMIT?{ok:!1,error:`OpenCode can hold up to ${OPENCODE_PROVIDER_KEY_LIMIT} provider keys. Remove one you no longer use, then add this one.`}:{ok:!0,keys:Object.fromEntries([...keys5].sort(([a],[b11])=>a<b11?-1:1))}}function onConfigSaved(listener2){return configSaveListeners.add(listener2),()=>{configSaveListeners.delete(listener2)}}function saveConfig(patch2,options2={}){let p3=join4(DATA_DIR,"config.json"),disk={};try{
|
|
1746
|
+
let parsed2=jsonObjectSchema2.safeParse(parseJson(readFileSync8(p3,"utf8")));parsed2.success&&(disk=parsed2.data)}catch{}let checkedPatch=appConfigSchema.partial().extend({threads:threadsPatchSchema.optional(),newBots:newBotsPatchSchema.optional(),imageGen:imageGenPatchSchema.optional()}).parse(patch2),before=configSaveListeners.size?structuredClone(disk):disk,keepImageModels=keepKeysOutOfImageModels(disk,checkedPatch.imageGen),storedProfiles=storedBrowserProfilesSchema.safeParse(disk.browserProfiles);
|
|
1747
|
+
storedProfiles.success&&(disk.browserProfiles=storedProfiles.data);for(let key7 of["xai","anthropic","mistral","cerebras","treg","postiz","groq","greenference","modelgo","meta","deepseek","openai","openrouter","openaiCompat","composio","box","opencodeGo","tts","decider","imageGen","live","profile","rooms","mcp","threads","context","memory","localVm","features","budgets","billing","decisions","loopGuard","onboarding","browserEngine","newBots","safetyFloor"]){let section4=checkedPatch[key7];if(!section4)
|
|
1748
|
+
continue;let current3=jsonObjectSchema2.safeParse(disk[key7]),merged2=current3.success?{...current3.data}:{};key7==="threads"&&!current3.success&&(merged2.maxConcurrentPerBot=defaultBotThreads()),Object.assign(merged2,section4,key7==="browserEngine"&&checkedPatch.browserEngine?.egress?{egress:{...jsonObjectSchema2.safeParse(merged2.egress).data,...checkedPatch.browserEngine.egress}}:{});for(let[sectionKey6,sectionValue]of Object.entries(section4))sectionValue===null&&delete merged2[sectionKey6];
|
|
1749
|
+
disk[key7]=merged2}keepImageModels(),checkedPatch.vps!==void 0&&(disk.vps=normalizeVpsConfig(checkedPatch.vps));for(let key7 of["language","computerName","everyBotRules"])checkedPatch[key7]!==void 0&&(disk[key7]=checkedPatch[key7]);if(checkedPatch.customDomain!==void 0&&(disk.customDomain=checkedPatch.customDomain),checkedPatch.signIn!==void 0&&(disk.signIn=checkedPatch.signIn),checkedPatch.automaticRecovery!==void 0&&(disk.automaticRecovery=checkedPatch.automaticRecovery),checkedPatch.cacheKeepWarm!==
|
|
1750
|
+
void 0&&(disk.cacheKeepWarm=checkedPatch.cacheKeepWarm),checkedPatch.defaultModelSelection!==void 0&&(disk.defaultModelSelection=checkedPatch.defaultModelSelection,disk.newBotDefaults)){let previousDefaults=newBotDefaultsSchema.parse(disk.newBotDefaults);disk.newBotDefaults=newBotDefaultsSchema.parse({...previousDefaults,profile:{...previousDefaults.profile,modelSelection:checkedPatch.defaultModelSelection}})}if(checkedPatch.newBotDefaults!==void 0&&(disk.newBotDefaults=checkedPatch.newBotDefaults,
|
|
1751
|
+
checkedPatch.newBotDefaults.profile.modelSelection?disk.defaultModelSelection=checkedPatch.newBotDefaults.profile.modelSelection:delete disk.defaultModelSelection),checkedPatch.cliStartup!==void 0&&(disk.cliStartup=checkedPatch.cliStartup),checkedPatch.mcpServers!==void 0&&(disk.mcpServers=jsonObjectSchema2.parse(checkedPatch.mcpServers)),checkedPatch.browserProfiles!==void 0){let existingProfiles=new Map((storedProfiles.success?storedProfiles.data:[]).map(profile=>[profile.id,profile])),nextProfiles=checkedPatch.
|
|
1752
|
+
browserProfiles.map(profile=>{let partitionId=existingProfiles.get(profile.id)?.partitionId;return partitionId?{...profile,partitionId}:profile}),routingConflict=browserProfileReplacementConflict(storedProfiles.success?storedProfiles.data:[],nextProfiles);if(routingConflict)throw Object.assign(new Error(routingConflict),{status:409});if(disk.browserProfiles=nextProfiles,disk.newBotDefaults){let defaults2=newBotDefaultsSchema.parse(disk.newBotDefaults),profileId=defaults2.profile.browserProfile;profileId&&
|
|
1753
|
+
profileId!=="guest"&&!nextProfiles.some(profile=>profile.id===profileId)&&(delete defaults2.profile.browserProfile,disk.newBotDefaults=defaults2)}}if(checkedPatch.instances){let currentInstances=jsonObjectSchema2.safeParse(disk.instances),storedInstances=currentInstances.success?currentInstances.data:{},diskInstances=options2.replaceInstances?{}:storedInstances;for(let[instanceId,entry2]of Object.entries(checkedPatch.instances)){let current3=jsonObjectSchema2.safeParse(storedInstances[instanceId]),
|
|
1754
|
+
merged2=current3.success?{...current3.data}:{};if(options2.replaceInstances)for(let key7 of Object.keys(instanceConfigSchema.shape))delete merged2[key7];Object.assign(merged2,entry2),diskInstances[instanceId]=merged2}disk.instances=diskInstances}if(checkedPatch.openaiCompat?.url!==void 0&&checkedPatch.instances?.openaiCompat===void 0){let instances=jsonObjectSchema2.safeParse(disk.instances),entry2=jsonObjectSchema2.safeParse(instances.success?instances.data.openaiCompat:void 0),config3=jsonObjectSchema2.
|
|
1755
|
+
safeParse(entry2.success?entry2.data.config:void 0),environment=jsonObjectSchema2.safeParse(entry2.success?entry2.data.environment:void 0);if(entry2.success&&entry2.data.driver==="openai-compat"&&config3.success&&!config3.data.key&&(!config3.data.apiKeyEnv||config3.data.apiKeyEnv==="OPENAI_COMPAT_API_KEY")&&!(environment.success&&Object.hasOwn(environment.data,"OPENAI_COMPAT_API_KEY"))){let nextConfig={...config3.data};delete nextConfig.url,disk.instances.openaiCompat={...entry2.data,config:nextConfig}}}
|
|
1756
|
+
mkdirSync2(DATA_DIR,{recursive:!0}),writeFileAtomic(p3,JSON.stringify(disk,null,2),{mode:384}),storedConfig.forget();for(let listener2 of configSaveListeners)try{listener2(before,disk)}catch(error66){console.warn(`config: a save listener failed: ${error66 instanceof Error?error66.message:String(error66)}`)}}function withInstanceCli(cfg2,instanceId,cli){let next=structuredClone(cfg2),map7=persistableInstanceConfigs(next);if(!Object.hasOwn(map7,instanceId))return{ok:!1,config:cfg2};let entry2=map7[instanceId],
|
|
1757
|
+
cliKey=cli.trim(),currentConfig=jsonObjectSchema2.safeParse(entry2.config);if(cliKey){let nextConfig=currentConfig.success?{...currentConfig.data}:{};nextConfig.cli=cliKey,entry2.config=nextConfig}else if(currentConfig.success&&Object.hasOwn(currentConfig.data,"cli")){let rest={...currentConfig.data};delete rest.cli,entry2.config=Object.keys(rest).length?rest:void 0}return next.instances=map7,{ok:!0,config:next}}function persistableInstanceConfigs(cfg2){let map7=instanceConfigs(cfg2);for(let[id12,
|
|
1758
|
+
entry2]of Object.entries(map7)){let environment=cfg2.instances?.[id12]?.environment;environment?entry2.environment={...environment}:delete entry2.environment;let config3=cfg2.instances?.[id12]?.config;config3!==void 0?entry2.config=structuredClone(config3):delete entry2.config}return map7}function claudeInstanceOwnsRouting(environment){return CLAUDE_ROUTING_ENV.some(key7=>typeof environment?.[key7]=="string"&&environment[key7]!=="")}function instanceOwnsRouting(cfg2,entry2,routingDefaults){let config3=typeof entry2.
|
|
1759
|
+
config=="object"&&entry2.config!==null&&!Array.isArray(entry2.config)?entry2.config:{},own4=value3=>typeof value3=="string"&&value3.trim()!=="",ownUrl=(...workspace)=>own4(config3.url)&&!workspace.some(url2=>url2!==void 0&&sameUrl(config3.url,url2)),compatKeyEnv=routingDefaults?.apiKeyEnv??"OPENAI_COMPAT_API_KEY";switch(entry2.driver){case"claudeAgent":return claudeInstanceOwnsRouting(entry2.environment);case"openai-compat":return own4(config3.key)||own4(entry2.environment?.OPENAI_COMPAT_API_KEY)||
|
|
1760
|
+
own4(entry2.environment?.[compatKeyEnv])||own4(config3.apiKeyEnv)&&config3.apiKeyEnv!==compatKeyEnv||ownUrl(routingDefaults?.url||cfg2.openaiCompat?.url||process.env.OPENAI_COMPAT_URL||"https://openrouter.ai/api/v1");case"mistral":return own4(entry2.environment?.MISTRAL_API_KEY)||ownUrl("https://api.mistral.ai/v1");case"cerebras":return own4(entry2.environment?.CEREBRAS_API_KEY)||ownUrl("https://api.cerebras.ai/v1");case"groq":return own4(entry2.environment?.GROQ_API_KEY)||ownUrl("https://api.gr\
|
|
1761
|
+
oq.com/openai/v1",cfg2.groq?.url);case"greenference":return own4(entry2.environment?.GREENFERENCE_API_KEY)||ownUrl("https://llm.eu.greenference.com/v1");case"modelgo":return own4(entry2.environment?.MODELGO_API_KEY)||ownUrl("https://api.modelgo.ai/v1");case"meta":return own4(entry2.environment?.META_API_KEY)||ownUrl("https://api.meta.ai/v1",cfg2.meta?.url);case"deepseekAgent":return own4(entry2.environment?.DEEPSEEK_API_KEY);case"grok":return own4(entry2.environment?.XAI_API_KEY)||own4(config3.apiKeyEnv)&&
|
|
1762
|
+
config3.apiKeyEnv!=="XAI_API_KEY"||ownUrl("https://api.x.ai/v1",cfg2.xai?.url);default:return!1}}function injectedEnvironment(cfg2,instanceId,driver){let environment=new Map;if(driver==="mistral"&&cfg2.mistral?.key&&environment.set("MISTRAL_API_KEY",cfg2.mistral.key),driver==="cerebras"&&cfg2.cerebras?.key&&environment.set("CEREBRAS_API_KEY",cfg2.cerebras.key),driver==="groq"&&cfg2.groq?.key&&environment.set("GROQ_API_KEY",cfg2.groq.key),driver==="greenference"&&cfg2.greenference?.key&&environment.
|
|
1763
|
+
set("GREENFERENCE_API_KEY",cfg2.greenference.key),driver==="modelgo"&&cfg2.modelgo?.key&&environment.set("MODELGO_API_KEY",cfg2.modelgo.key),driver==="meta"&&cfg2.meta?.key&&environment.set("META_API_KEY",cfg2.meta.key),driver==="deepseekAgent"&&cfg2.deepseek?.key&&environment.set("DEEPSEEK_API_KEY",cfg2.deepseek.key),driver==="grok"&&cfg2.xai?.key&&environment.set("XAI_API_KEY",cfg2.xai.key),driver==="claudeAgent")for(let[name6,value3]of Object.entries(anthropicKeyEnv(cfg2.anthropic,instanceId===
|
|
1764
|
+
CLAUDE_API_INSTANCE)))environment.set(name6,value3);if(driver==="openai-compat"&&instanceId===OPENAI_API_INSTANCE?cfg2.openai?.key&&environment.set("OMB_OPENAI_API_KEY",cfg2.openai.key):driver==="openai-compat"&&instanceId===OPENROUTER_API_INSTANCE?cfg2.openrouter?.key&&environment.set("OMB_OPENROUTER_API_KEY",cfg2.openrouter.key):(driver==="openai-compat"&&cfg2.openaiCompat?.key&&environment.set("OPENAI_COMPAT_API_KEY",cfg2.openaiCompat.key),driver==="openai-compat"&&cfg2.openaiCompat?.url&&environment.
|
|
1765
|
+
set("OPENAI_COMPAT_URL",cfg2.openaiCompat.url)),driver==="opencodeGo"){for(let[name6,key7]of Object.entries(openCodeProviderKeys(cfg2)))environment.set(name6,key7);cfg2.opencodeGo?.apiKey&&environment.set("OPENCODE_API_KEY",cfg2.opencodeGo.apiKey)}return environment}function instanceConfigs(cfg2){let configured2=cfg2.instances&&Object.keys(cfg2.instances).length?cfg2.instances:null,map7=withoutComputerEngine(configured2?{...configured2}:{...DEFAULT_FLEET});if(configured2&&(Object.hasOwn(configured2,
|
|
1766
|
+
"claude")||Object.hasOwn(configured2,"grok")||Object.hasOwn(configured2,"codex")))for(let[id12,entry2]of Object.entries(PRODUCT_FLEET_ADDITIONS))Object.hasOwn(map7,id12)||(map7[id12]={...entry2});for(let[id12,builtIn]of Object.entries(API_KEY_FLEET)){let saved=map7[id12];if(!saved||saved.driver!==builtIn.driver)continue;let savedConfig=typeof saved.config=="object"&&saved.config!==null&&!Array.isArray(saved.config)?saved.config:{};map7[id12]={...builtIn,...saved,config:{...builtIn.config,...savedConfig}}}
|
|
1767
|
+
if(map7.chatgpt?.driver==="codex"&&!map7.chatgpt.config?.cli){let cli=map7.codex?.config?.cli;typeof cli=="string"&&cli&&(map7.chatgpt={...map7.chatgpt,config:{...map7.chatgpt.config,cli}})}for(let[id12,sourceEntry]of Object.entries(map7)){let entry2={...sourceEntry};map7[id12]=entry2;let environment={...entry2.environment},builtIn=API_KEY_FLEET[id12],routingDefaults=builtIn?.driver===entry2.driver?builtIn.config:void 0,ownsRouting=instanceOwnsRouting(cfg2,entry2,routingDefaults);if(!ownsRouting)
|
|
1768
|
+
for(let[key7,value3]of injectedEnvironment(cfg2,id12,entry2.driver))environment[key7]=value3;if(entry2.environment=environment,entry2.driver==="groq"&&cfg2.groq?.url&&!ownsRouting&&(entry2.config={...entry2.config,url:cfg2.groq.url}),entry2.driver==="meta"&&cfg2.meta?.url&&!ownsRouting&&(entry2.config={...entry2.config,url:cfg2.meta.url}),entry2.driver==="openai-compat"&&cfg2.openaiCompat&&id12!==OPENAI_API_INSTANCE&&id12!==OPENROUTER_API_INSTANCE){let defaults2={};if(cfg2.openaiCompat.url&&(defaults2.
|
|
1769
|
+
url=cfg2.openaiCompat.url),cfg2.openaiCompat.model&&(defaults2.model=cfg2.openaiCompat.model),cfg2.openaiCompat.provider&&(defaults2.provider=cfg2.openaiCompat.provider),Object.keys(defaults2).length){let raw=entry2.config,merged2={...typeof raw=="object"&&raw!==null&&!Array.isArray(raw)?raw:{}};for(let[k3,v4]of Object.entries(defaults2))k3==="provider"&&typeof merged2[k3]=="string"||(typeof merged2[k3]!="string"||!merged2[k3].trim())&&(merged2[k3]=v4);entry2.config=merged2}}}return map7}function skipMcpEntry(name6,why){
|
|
1770
|
+
let key7=`${name6}: ${why}`;reportedMcpSkips.has(key7)||(reportedMcpSkips.add(key7),console.error(`mcpServers.${JSON.stringify(name6)} skipped \u2014 ${why}`))}function customMcpServers(cfg2,only2,botId){let out={};for(let[name6,raw]of Object.entries(cfg2.mcpServers??{})){if(only2&&!only2.includes(name6))continue;let parsed2=parseStoredMcpServer(name6,raw);if(!parsed2.ok){skipMcpEntry(name6,`${parsed2.error} Expected { "command": "npx", "args": [...], "env": { ... } } or { "type": "http", "url":\
|
|
1771
|
+
"https://\u2026", "headers": { ... } }`);continue}!parsed2.server.enabled||parsed2.server.runsOn||!mcpServerServes(parsed2.server,botId)||(out[name6]=isRemoteMcpServer(parsed2.server)?{type:parsed2.server.type,url:parsed2.server.url,headers:{...parsed2.server.headers,...postizKeyHeaders(cfg2.postiz,name6,parsed2.server)}}:{command:parsed2.server.command,args:parsed2.server.args,env:parsed2.server.env})}return out}var optionalText2,SSH_ALIAS,LEGACY_BROWSER_PROFILE_ID,BROWSER_PROFILE_ID,FISH_TTS_MODELS,
|
|
1772
|
+
DEFAULT_ROOM_TURN_TIMEOUT_MINUTES,MIN_ROOM_TURN_TIMEOUT_MINUTES,MAX_ROOM_TURN_TIMEOUT_MINUTES,DEFAULT_MCP_CALL_TIMEOUT_MINUTES,MIN_MCP_CALL_TIMEOUT_MINUTES,MAX_MCP_CALL_TIMEOUT_MINUTES,MIN_THREAD_EVENT_LOG_BYTES,MAX_THREAD_EVENT_LOG_BYTES,vpsConfigSchema,roomConfigSchema,mcpConfigSchema,browserProfileSchema,legacyBrowserProfileSchema,legacyBrowserProfilesSchema,storedBrowserProfilesSchema,browserProfilesSchema,featureConfigSchema,onboardingConfigSchema,instanceConfigSchema,instanceConfigMapSchema,
|
|
1773
|
+
defaultModelSelectionSchema,automaticRecoverySchema,cacheKeepWarmSchema,threadsConfigSchema,newBotsConfigSchema,newBotsPatchSchema,threadsPatchSchema,appConfigSchema,storedAppConfigSchema,appConfigPatchSchema,jsonObjectSchema2,DEFAULT_SKILL_REVIEW_STEPS,MIN_SKILL_REVIEW_STEPS,MAX_SKILL_REVIEW_STEPS,DEFAULT_CAPTURE_QUIET_MS,DEFAULT_TIDY_HOUR,DATA_DIR,LEGACY_DATA_DIR,EVENTS_DIR,NATIVE_DIR,lastIgnoredConfigWarning,storedConfig,OPENCODE_PROVIDER_KEY_LIMIT,OPENCODE_PROVIDER_KEY_NAME,OPENCODE_PROVIDER_KEY_VALUE,
|
|
1774
|
+
configSaveListeners,CLAUDE_ROUTING_ENV,sameUrl,reportedMcpSkips,init_config3=__esm({"server/config.ts"(){"use strict";init_data_dir();init_sign_in_env();init_zod();init_image_generation_config();init_bot_avatar();init_atomic();init_bot_thread_limits();init_anthropic_key_env();init_computer_engine_removal();init_new_bot_defaults();init_replay_settings();init_wire();init_contracts();init_instance_fleets();init_instance_fleets();init_cache_keepwarm();init_provider_icon();init_side_jobs();init_loop_guard();
|
|
1775
|
+
init_legacy_feature_flags();init_settled_file();init_mcp_registry();init_connection();init_schema();init_config();init_live_config();init_config2();init_room_context_settings();init_local_vm_settings();init_local_vm_settings();init_credential_env();optionalText2=external_exports.string().optional(),SSH_ALIAS=/^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$/,LEGACY_BROWSER_PROFILE_ID=/^[A-Za-z0-9_-]{1,40}$/,BROWSER_PROFILE_ID=/^[a-z0-9_-]{1,40}$/,FISH_TTS_MODELS=["s2.1-pro","s2.1-pro-free"],DEFAULT_ROOM_TURN_TIMEOUT_MINUTES=
|
|
1776
|
+
5,MIN_ROOM_TURN_TIMEOUT_MINUTES=1,MAX_ROOM_TURN_TIMEOUT_MINUTES=1440,DEFAULT_MCP_CALL_TIMEOUT_MINUTES=10,MIN_MCP_CALL_TIMEOUT_MINUTES=1,MAX_MCP_CALL_TIMEOUT_MINUTES=60,MIN_THREAD_EVENT_LOG_BYTES=256*1024,MAX_THREAD_EVENT_LOG_BYTES=4*1024*1024*1024;vpsConfigSchema=external_exports.object({sshAlias:external_exports.string().refine(value3=>value3===""||isValidSshAlias(value3),{message:"must be a simple SSH config alias"}).optional()}),roomConfigSchema=external_exports.object({turnTimeoutMinutes:external_exports.
|
|
1777
|
+
number().int().min(MIN_ROOM_TURN_TIMEOUT_MINUTES).max(MAX_ROOM_TURN_TIMEOUT_MINUTES)}),mcpConfigSchema=external_exports.object({callTimeoutMinutes:external_exports.number().int().min(MIN_MCP_CALL_TIMEOUT_MINUTES).max(MAX_MCP_CALL_TIMEOUT_MINUTES).optional()}).strict(),browserProfileSchema=external_exports.object({id:external_exports.string().regex(BROWSER_PROFILE_ID).refine(id12=>id12!=="guest","guest is reserved"),name:external_exports.string().trim().min(1).max(40),browser:external_exports.literal(
|
|
1778
|
+
"chrome").optional()}).strict(),legacyBrowserProfileSchema=external_exports.object({id:external_exports.string().regex(LEGACY_BROWSER_PROFILE_ID).refine(id12=>id12!=="guest","guest is reserved"),name:external_exports.string().trim().min(1).max(40),partitionId:external_exports.string().regex(LEGACY_BROWSER_PROFILE_ID).refine(id12=>id12!=="guest","guest is reserved").optional(),browser:external_exports.literal("chrome").optional()}).strict();legacyBrowserProfilesSchema=external_exports.array(legacyBrowserProfileSchema).
|
|
1779
1779
|
max(20),storedBrowserProfilesSchema=legacyBrowserProfilesSchema.transform(profiles=>migrateStoredBrowserProfiles(profiles).profiles),browserProfilesSchema=external_exports.array(browserProfileSchema).max(20).superRefine((profiles,ctx)=>{let seen=new Set;profiles.forEach((profile,index4)=>{if(!seen.has(profile.id)){seen.add(profile.id);return}ctx.addIssue({code:"custom",path:[index4,"id"],message:`browser profile id ${profile.id} is duplicated`})})}),featureConfigSchema=external_exports.object({skillAuthoring:external_exports.
|
|
1780
|
-
boolean().optional(),skillReview:external_exports.boolean().optional(),skillReviewSteps:external_exports.number().int().min(3).max(100).optional(),showToolCalls:external_exports.boolean().optional(),browser:external_exports.boolean().optional(),sharedComputers:external_exports.boolean().optional(),claudeUserMcp:external_exports.boolean().optional(),claudeUserSkills:external_exports.boolean().optional(),llmThreadTitles:external_exports.boolean().
|
|
1781
|
-
optional(),autoRecall:external_exports.boolean().optional(),skillsLibrary:external_exports.boolean().optional(),shareLearnedSkills:external_exports.enum(["off","ask","auto"]).optional(),roomMemoryCapture:external_exports.boolean().optional(),parallelRoomJobs:external_exports.boolean().optional(),acpPlanLines:external_exports.boolean().optional()}).extend({agentsToolBridge:external_exports.boolean().optional(),savedSteps:external_exports.boolean().
|
|
1782
|
-
object({completedAt:external_exports.string().trim().max(40).optional(),version:external_exports.number().int().min(0).max(1e3).optional(),reelSeen:external_exports.boolean().optional(),hintsSeen:external_exports.array(external_exports.string().trim().min(1).max(60)).max(100).optional(),firstTurnAt:external_exports.string().trim().max(40).optional()}).strict(),instanceConfigSchema=external_exports.object({driver:external_exports.string().min(1),
|
|
1783
|
-
icon:external_exports.discriminatedUnion("kind",[external_exports.object({kind:external_exports.literal("preset"),preset:external_exports.enum(PROVIDER_ICON_PRESETS)}).strict(),external_exports.object({kind:external_exports.literal("custom"),dataUrl:external_exports.string()}).strict().refine(icon2=>providerIconError(icon2)===null,{message:"Invalid provider icon"})]).optional(),environment:external_exports.record(external_exports.string(),external_exports.
|
|
1784
|
-
boolean().optional(),hidden:external_exports.boolean().optional(),access:external_exports.enum(["subscription","custom","api"]).optional(),config:external_exports.json().optional()}),instanceConfigMapSchema=external_exports.record(external_exports.string(),instanceConfigSchema),defaultModelSelectionSchema=external_exports.object({instanceId:external_exports.string().trim().min(1).max(200),model:external_exports.string().trim().min(1).max(500),effort:external_exports.
|
|
1785
|
-
variant:external_exports.string().refine(isModelVariant,"invalid model variant").optional()}).refine(selection3=>selection3.variant===void 0||selection3.effort===void 0,"choose either a model variant or an effort level"),automaticRecoverySchema=external_exports.object({enabled:external_exports.boolean(),backup:defaultModelSelectionSchema.optional()}).strict().refine(recovery=>!recovery.enabled||recovery.backup!==void 0,{message:"Choose a backup model before
|
|
1786
|
-
|
|
1787
|
-
3650).optional()}).strict(),newBotsConfigSchema=external_exports.object({effort:external_exports.enum(EFFORT_LEVELS).optional()}).strict(),newBotsPatchSchema=external_exports.object({effort:newBotsConfigSchema.shape.effort.nullable()}).strict(),threadsPatchSchema=threadsConfigSchema.extend({maxConcurrentPerBot:threadsConfigSchema.shape.maxConcurrentPerBot.optional(),eventLogMaxBytes:threadsConfigSchema.shape.eventLogMaxBytes.nullable(),eventLogRetentionDays:threadsConfigSchema.
|
|
1788
|
-
nullable()}),appConfigSchema=external_exports.object({customDomain:external_exports.string().optional(),signIn:external_exports.object({admins:external_exports.array(external_exports.string().max(320)).max(500).optional(),members:external_exports.array(external_exports.string().max(320)).max(5e3).optional()}).optional(),defaultModelSelection:defaultModelSelectionSchema.optional(),automaticRecovery:automaticRecoverySchema.optional(),cacheKeepWarm:cacheKeepWarmSchema.optional(),
|
|
1789
|
-
optional(),newBots:newBotsConfigSchema.optional(),cliStartup:external_exports.object({access:external_exports.enum(["local","tunnel","tailscale","public-url"]),publicUrl:external_exports.string().url().optional(),phone:external_exports.enum(["ios","android"]).optional()}).optional(),mistral:external_exports.object({key:optionalText2}).optional(),cerebras:external_exports.object({key:optionalText2}).optional(),treg:external_exports.object({key:optionalText2}).optional(),
|
|
1790
|
-
{key:optionalText2,url:optionalText2}).optional(),groq:external_exports.object({key:optionalText2,url:optionalText2}).optional(),greenference:external_exports.object({key:optionalText2}).optional(),modelgo:external_exports.object({key:optionalText2}).optional(),meta:external_exports.object({key:optionalText2,url:optionalText2}).optional(),deepseek:external_exports.object({key:optionalText2}).optional(),xai:external_exports.object({key:optionalText2,url:optionalText2}).
|
|
1791
|
-
object({key:optionalText2,url:optionalText2,everyClaudeBot:external_exports.boolean().optional()}).optional(),openai:external_exports.object({key:optionalText2}).optional(),openrouter:external_exports.object({key:optionalText2}).optional(),budgets:external_exports.object({monthlyUsd:external_exports.number().min(0).max(1e6).optional(),warnAtPercent:external_exports.number().int().min(1).max(100).optional()}).optional(),billing:external_exports.object({currency:external_exports.
|
|
1792
|
-
optional(),prices:external_exports.record(external_exports.string().min(1).max(160),external_exports.object({inputPerMillion:external_exports.number().min(0).max(1e6),outputPerMillion:external_exports.number().min(0).max(1e6),cachedInputPerMillion:external_exports.number().min(0).max(1e6).optional()})).optional()}).optional(),openaiCompat:external_exports.object({key:optionalText2,url:optionalText2,model:optionalText2,provider:optionalText2}).optional(),composio:external_exports.
|
|
1793
|
-
userId:optionalText2,sessionId:optionalText2}).optional(),box:external_exports.object({token:optionalText2}).optional(),vps:vpsConfigSchema.optional(),opencodeGo:external_exports.object({apiKey:optionalText2,providerKeys:external_exports.record(external_exports.string(),external_exports.string()).optional()}).optional(),tts:external_exports.object({key:optionalText2,fishKey:optionalText2,geminiKey:optionalText2,voice:optionalText2,provider:external_exports.enum(["
|
|
1794
|
-
|
|
1795
|
-
string().max(24e3).optional(),profile:external_exports.object({name:optionalText2,email:optionalText2,aboutMe:external_exports.string().max(24e3).optional(),avatarUrl:external_exports.union([external_exports.literal(""),botAvatarUrlSchema]).optional()}).optional(),language:optionalText2,computerName:external_exports.string().trim().max(63).optional(),rooms:roomConfigSchema.optional(),mcp:mcpConfigSchema.optional(),context:external_exports.object({compactAt:external_exports.
|
|
1796
|
-
1e7).optional(),autoCompact:external_exports.boolean().optional()}).extend(roomContextSettings).extend(replaySettings).optional(),memory:external_exports.object({captureQuietMs:external_exports.number().int().min(1e3).max(1440*6e4).optional(),tidyHour:external_exports.number().int().min(0).max(23).optional()}).strict().optional(),threads:threadsConfigSchema.optional(),burst:external_exports.object({maxParallel:external_exports.number().int().min(1).max(100).optional()}).strict().
|
|
1797
|
-
object({retentionDays:external_exports.number().int().min(1).max(3650).optional()}).strict().optional(),loopGuard:loopGuardConfigSchema.optional(),safetyFloor:external_exports.object({enabled:external_exports.boolean().optional()}).strict().optional(),localVm:localVmConfigSchema.optional(),features:featureConfigSchema.optional(),onboarding:onboardingConfigSchema.optional(),browserEngine:browserEngineConfigSchema.optional(),browserProfiles:browserProfilesSchema.
|
|
1798
|
-
optional(),mcpServers:external_exports.record(external_exports.string(),external_exports.unknown()).optional()}),storedAppConfigSchema=appConfigSchema.extend(helperStoredShape).extend({browserProfiles:storedBrowserProfilesSchema.optional(),opencodeGo:external_exports.object({apiKey:optionalText2,providerKeys:external_exports.record(external_exports.string(),external_exports.unknown()).catch({}).transform(keys5=>Object.fromEntries(Object.entries(keys5).
|
|
1799
|
-
optional()}).optional()}),appConfigPatchSchema=appConfigSchema.omit({instances:!0,mcpServers:!0,cliStartup:!0,customDomain:!0}).extend({threads:threadsPatchSchema.optional(),newBots:newBotsPatchSchema.optional(),imageGen:imageGenPatchSchema.optional()}),jsonObjectSchema2=external_exports.record(external_exports.string(),external_exports.json());DEFAULT_SKILL_REVIEW_STEPS=10,MIN_SKILL_REVIEW_STEPS=3,MAX_SKILL_REVIEW_STEPS=100;DEFAULT_CAPTURE_QUIET_MS=2*
|
|
1800
|
-
OMB_DATA_DIR||join4(dataHome(),".limixbot"),LEGACY_DATA_DIR=join4(dataHome(),".opengrokbot"),EVENTS_DIR=join4(DATA_DIR,"events"),NATIVE_DIR=join4(DATA_DIR,"native");lastIgnoredConfigWarning="",storedConfig=settledFileCache(()=>join4(DATA_DIR,"config.json"),()=>parseStoredConfig(parseJson(readFileSync8(join4(DATA_DIR,"config.json"),"utf8"))));OPENCODE_PROVIDER_KEY_LIMIT=20,OPENCODE_PROVIDER_KEY_NAME=/^[A-Z][A-Z0-9_]{0,59}_(?:API_KEY|KEY|TOKEN)$/,OPENCODE_PROVIDER_KEY_VALUE
|
|
1801
|
-
configSaveListeners=new Set;CLAUDE_ROUTING_ENV=["ANTHROPIC_BASE_URL","ANTHROPIC_AUTH_TOKEN","ANTHROPIC_API_KEY","ANTHROPIC_CUSTOM_HEADERS","CLAUDE_CODE_USE_BEDROCK","CLAUDE_CODE_USE_VERTEX","CLAUDE_CODE_USE_FOUNDRY"];sameUrl=(a,b11)=>a.trim().replace(/\/+$/u,"")===b11.trim().replace(/\/+$/u,"");reportedMcpSkips=new Set}});var require_constants=__commonJS({"node_modules/.pnpm/ws@8.22.0/node_modules/ws/lib/constants.js"(exports,module){"use strict";var BINARY_TYPES=["nodebuffer","arraybuffer","fragments"],hasBlob=typeof Blob<"u";hasBlob&&BINARY_TYPES.push("blob");module.exports={BINARY_TYPES,CLOSE_TIMEOUT:3e4,EMPTY_BUFFER:Buffer.alloc(0),GUID:"258EAFA5-E914-47DA-95CA-C5AB0DC85B11",hasBlob,kForOnEventAttribute:Symbol("kIsForOnEventAttribute"),kListener:Symbol("kListener"),kStatusCode:Symbol("status-code"),kWebSocket:Symbol(
|
|
1780
|
+
boolean().optional(),skillReview:external_exports.boolean().optional(),skillAutoApply:external_exports.boolean().optional(),skillReviewSteps:external_exports.number().int().min(3).max(100).optional(),showToolCalls:external_exports.boolean().optional(),browser:external_exports.boolean().optional(),sharedComputers:external_exports.boolean().optional(),claudeUserMcp:external_exports.boolean().optional(),claudeUserSkills:external_exports.boolean().optional(),llmThreadTitles:external_exports.boolean().
|
|
1781
|
+
optional(),smartSetupChoices:external_exports.boolean().optional(),autoRecall:external_exports.boolean().optional(),skillsLibrary:external_exports.boolean().optional(),shareLearnedSkills:external_exports.enum(["off","ask","auto"]).optional(),roomMemoryCapture:external_exports.boolean().optional(),parallelRoomJobs:external_exports.boolean().optional(),acpPlanLines:external_exports.boolean().optional()}).extend({agentsToolBridge:external_exports.boolean().optional(),savedSteps:external_exports.boolean().
|
|
1782
|
+
optional()}),onboardingConfigSchema=external_exports.object({completedAt:external_exports.string().trim().max(40).optional(),version:external_exports.number().int().min(0).max(1e3).optional(),reelSeen:external_exports.boolean().optional(),hintsSeen:external_exports.array(external_exports.string().trim().min(1).max(60)).max(100).optional(),firstTurnAt:external_exports.string().trim().max(40).optional()}).strict(),instanceConfigSchema=external_exports.object({driver:external_exports.string().min(1),
|
|
1783
|
+
displayName:optionalText2,accentColor:optionalText2,icon:external_exports.discriminatedUnion("kind",[external_exports.object({kind:external_exports.literal("preset"),preset:external_exports.enum(PROVIDER_ICON_PRESETS)}).strict(),external_exports.object({kind:external_exports.literal("custom"),dataUrl:external_exports.string()}).strict().refine(icon2=>providerIconError(icon2)===null,{message:"Invalid provider icon"})]).optional(),environment:external_exports.record(external_exports.string(),external_exports.
|
|
1784
|
+
string()).optional(),enabled:external_exports.boolean().optional(),hidden:external_exports.boolean().optional(),access:external_exports.enum(["subscription","custom","api"]).optional(),config:external_exports.json().optional()}),instanceConfigMapSchema=external_exports.record(external_exports.string(),instanceConfigSchema),defaultModelSelectionSchema=external_exports.object({instanceId:external_exports.string().trim().min(1).max(200),model:external_exports.string().trim().min(1).max(500),effort:external_exports.
|
|
1785
|
+
enum(EFFORT_LEVELS).optional(),variant:external_exports.string().refine(isModelVariant,"invalid model variant").optional()}).refine(selection3=>selection3.variant===void 0||selection3.effort===void 0,"choose either a model variant or an effort level"),automaticRecoverySchema=external_exports.object({enabled:external_exports.boolean(),backup:defaultModelSelectionSchema.optional()}).strict().refine(recovery=>!recovery.enabled||recovery.backup!==void 0,{message:"Choose a backup model before enablin\
|
|
1786
|
+
g automatic recovery",path:["backup"]}),cacheKeepWarmSchema=external_exports.object({enabled:external_exports.boolean(),windowMinutes:external_exports.number().int().min(15).max(1440).optional()}).strict(),threadsConfigSchema=external_exports.object({maxConcurrentPerBot:external_exports.number().int().min(1).max(MAX_CONCURRENT_BOT_THREADS),eventLogMaxBytes:external_exports.number().int().min(MIN_THREAD_EVENT_LOG_BYTES).max(MAX_THREAD_EVENT_LOG_BYTES).optional(),eventLogRetentionDays:external_exports.
|
|
1787
|
+
number().int().min(1).max(3650).optional()}).strict(),newBotsConfigSchema=external_exports.object({effort:external_exports.enum(EFFORT_LEVELS).optional()}).strict(),newBotsPatchSchema=external_exports.object({effort:newBotsConfigSchema.shape.effort.nullable()}).strict(),threadsPatchSchema=threadsConfigSchema.extend({maxConcurrentPerBot:threadsConfigSchema.shape.maxConcurrentPerBot.optional(),eventLogMaxBytes:threadsConfigSchema.shape.eventLogMaxBytes.nullable(),eventLogRetentionDays:threadsConfigSchema.
|
|
1788
|
+
shape.eventLogRetentionDays.nullable()}),appConfigSchema=external_exports.object({customDomain:external_exports.string().optional(),signIn:external_exports.object({admins:external_exports.array(external_exports.string().max(320)).max(500).optional(),members:external_exports.array(external_exports.string().max(320)).max(5e3).optional()}).optional(),defaultModelSelection:defaultModelSelectionSchema.optional(),automaticRecovery:automaticRecoverySchema.optional(),cacheKeepWarm:cacheKeepWarmSchema.optional(),
|
|
1789
|
+
newBotDefaults:newBotDefaultsSchema.optional(),newBots:newBotsConfigSchema.optional(),cliStartup:external_exports.object({access:external_exports.enum(["local","tunnel","tailscale","public-url"]),publicUrl:external_exports.string().url().optional(),phone:external_exports.enum(["ios","android"]).optional()}).optional(),mistral:external_exports.object({key:optionalText2}).optional(),cerebras:external_exports.object({key:optionalText2}).optional(),treg:external_exports.object({key:optionalText2}).optional(),
|
|
1790
|
+
postiz:external_exports.object({key:optionalText2,url:optionalText2}).optional(),groq:external_exports.object({key:optionalText2,url:optionalText2}).optional(),greenference:external_exports.object({key:optionalText2}).optional(),modelgo:external_exports.object({key:optionalText2}).optional(),meta:external_exports.object({key:optionalText2,url:optionalText2}).optional(),deepseek:external_exports.object({key:optionalText2}).optional(),xai:external_exports.object({key:optionalText2,url:optionalText2}).
|
|
1791
|
+
optional(),anthropic:external_exports.object({key:optionalText2,url:optionalText2,everyClaudeBot:external_exports.boolean().optional()}).optional(),openai:external_exports.object({key:optionalText2}).optional(),openrouter:external_exports.object({key:optionalText2}).optional(),budgets:external_exports.object({monthlyUsd:external_exports.number().min(0).max(1e6).optional(),warnAtPercent:external_exports.number().int().min(1).max(100).optional()}).optional(),billing:external_exports.object({currency:external_exports.
|
|
1792
|
+
string().regex(/^[A-Z]{3}$/).optional(),prices:external_exports.record(external_exports.string().min(1).max(160),external_exports.object({inputPerMillion:external_exports.number().min(0).max(1e6),outputPerMillion:external_exports.number().min(0).max(1e6),cachedInputPerMillion:external_exports.number().min(0).max(1e6).optional()})).optional()}).optional(),openaiCompat:external_exports.object({key:optionalText2,url:optionalText2,model:optionalText2,provider:optionalText2}).optional(),composio:external_exports.
|
|
1793
|
+
object({apiKey:optionalText2,userId:optionalText2,sessionId:optionalText2}).optional(),box:external_exports.object({token:optionalText2}).optional(),vps:vpsConfigSchema.optional(),opencodeGo:external_exports.object({apiKey:optionalText2,providerKeys:external_exports.record(external_exports.string(),external_exports.string()).optional()}).optional(),tts:external_exports.object({key:optionalText2,fishKey:optionalText2,geminiKey:optionalText2,voice:optionalText2,provider:external_exports.enum(["ele\
|
|
1794
|
+
venlabs","fish","system","chatterbox","xai","gemini","openai"]).optional(),baseUrl:external_exports.string().trim().max(2048).refine(value3=>!value3||/^https?:\/\//i.test(value3),"the Chatterbox server address must start with http:// or https://").optional(),model:optionalText2,fishModel:external_exports.enum(FISH_TTS_MODELS).optional(),everyReply:external_exports.boolean().optional()}).optional(),decider:deciderConfigSchema.optional(),live:liveConfigSchema.optional(),imageGen:imageGenConfigSchema.
|
|
1795
|
+
optional(),everyBotRules:external_exports.string().max(24e3).optional(),profile:external_exports.object({name:optionalText2,email:optionalText2,aboutMe:external_exports.string().max(24e3).optional(),avatarUrl:external_exports.union([external_exports.literal(""),botAvatarUrlSchema]).optional()}).optional(),language:optionalText2,computerName:external_exports.string().trim().max(63).optional(),rooms:roomConfigSchema.optional(),mcp:mcpConfigSchema.optional(),context:external_exports.object({compactAt:external_exports.
|
|
1796
|
+
number().positive().max(1e7).optional(),autoCompact:external_exports.boolean().optional()}).extend(roomContextSettings).extend(replaySettings).optional(),memory:external_exports.object({captureQuietMs:external_exports.number().int().min(1e3).max(1440*6e4).optional(),tidyHour:external_exports.number().int().min(0).max(23).optional()}).strict().optional(),threads:threadsConfigSchema.optional(),burst:external_exports.object({maxParallel:external_exports.number().int().min(1).max(100).optional()}).strict().
|
|
1797
|
+
optional(),decisions:external_exports.object({retentionDays:external_exports.number().int().min(1).max(3650).optional()}).strict().optional(),loopGuard:loopGuardConfigSchema.optional(),safetyFloor:external_exports.object({enabled:external_exports.boolean().optional()}).strict().optional(),localVm:localVmConfigSchema.optional(),features:featureConfigSchema.optional(),onboarding:onboardingConfigSchema.optional(),browserEngine:browserEngineConfigSchema.optional(),browserProfiles:browserProfilesSchema.
|
|
1798
|
+
optional(),instances:instanceConfigMapSchema.optional(),mcpServers:external_exports.record(external_exports.string(),external_exports.unknown()).optional()}),storedAppConfigSchema=appConfigSchema.extend(helperStoredShape).extend({browserProfiles:storedBrowserProfilesSchema.optional(),opencodeGo:external_exports.object({apiKey:optionalText2,providerKeys:external_exports.record(external_exports.string(),external_exports.unknown()).catch({}).transform(keys5=>Object.fromEntries(Object.entries(keys5).
|
|
1799
|
+
filter(entry2=>typeof entry2[1]=="string"))).optional()}).optional()}),appConfigPatchSchema=appConfigSchema.omit({instances:!0,mcpServers:!0,cliStartup:!0,customDomain:!0}).extend({threads:threadsPatchSchema.optional(),newBots:newBotsPatchSchema.optional(),imageGen:imageGenPatchSchema.optional()}),jsonObjectSchema2=external_exports.record(external_exports.string(),external_exports.json());DEFAULT_SKILL_REVIEW_STEPS=10,MIN_SKILL_REVIEW_STEPS=3,MAX_SKILL_REVIEW_STEPS=100;DEFAULT_CAPTURE_QUIET_MS=2*
|
|
1800
|
+
6e4,DEFAULT_TIDY_HOUR=3;DATA_DIR=process.env.OMB_DATA_DIR||join4(dataHome(),".limixbot"),LEGACY_DATA_DIR=join4(dataHome(),".opengrokbot"),EVENTS_DIR=join4(DATA_DIR,"events"),NATIVE_DIR=join4(DATA_DIR,"native");lastIgnoredConfigWarning="",storedConfig=settledFileCache(()=>join4(DATA_DIR,"config.json"),()=>parseStoredConfig(parseJson(readFileSync8(join4(DATA_DIR,"config.json"),"utf8"))));OPENCODE_PROVIDER_KEY_LIMIT=20,OPENCODE_PROVIDER_KEY_NAME=/^[A-Z][A-Z0-9_]{0,59}_(?:API_KEY|KEY|TOKEN)$/,OPENCODE_PROVIDER_KEY_VALUE=
|
|
1801
|
+
/^[\x21-\x7e]{1,4096}$/;configSaveListeners=new Set;CLAUDE_ROUTING_ENV=["ANTHROPIC_BASE_URL","ANTHROPIC_AUTH_TOKEN","ANTHROPIC_API_KEY","ANTHROPIC_CUSTOM_HEADERS","CLAUDE_CODE_USE_BEDROCK","CLAUDE_CODE_USE_VERTEX","CLAUDE_CODE_USE_FOUNDRY"];sameUrl=(a,b11)=>a.trim().replace(/\/+$/u,"")===b11.trim().replace(/\/+$/u,"");reportedMcpSkips=new Set}});var require_constants=__commonJS({"node_modules/.pnpm/ws@8.22.0/node_modules/ws/lib/constants.js"(exports,module){"use strict";var BINARY_TYPES=["nodebuffer","arraybuffer","fragments"],hasBlob=typeof Blob<"u";hasBlob&&BINARY_TYPES.push("blob");module.exports={BINARY_TYPES,CLOSE_TIMEOUT:3e4,EMPTY_BUFFER:Buffer.alloc(0),GUID:"258EAFA5-E914-47DA-95CA-C5AB0DC85B11",hasBlob,kForOnEventAttribute:Symbol("kIsForOnEventAttribute"),kListener:Symbol("kListener"),kStatusCode:Symbol("status-code"),kWebSocket:Symbol(
|
|
1802
1802
|
"websocket"),NOOP:()=>{}}}});var require_buffer_util=__commonJS({"node_modules/.pnpm/ws@8.22.0/node_modules/ws/lib/buffer-util.js"(exports,module){"use strict";var{EMPTY_BUFFER}=require_constants(),FastBuffer=Buffer[Symbol.species];function concat4(list10,totalLength){if(list10.length===0)return EMPTY_BUFFER;if(list10.length===1)return list10[0];let target4=Buffer.allocUnsafe(totalLength),offset4=0;for(let i=0;i<list10.length;i++){let buf=list10[i];target4.set(buf,offset4),offset4+=buf.length}return offset4<totalLength?new FastBuffer(
|
|
1803
1803
|
target4.buffer,target4.byteOffset,offset4):target4}function _mask(source4,mask2,output4,offset4,length3){for(let i=0;i<length3;i++)output4[offset4+i]=source4[i]^mask2[i&3]}function _unmask(buffer,mask2){for(let i=0;i<buffer.length;i++)buffer[i]^=mask2[i&3]}function toArrayBuffer2(buf){return buf.length===buf.buffer.byteLength?buf.buffer:buf.buffer.slice(buf.byteOffset,buf.byteOffset+buf.length)}function toBuffer2(data4){if(toBuffer2.readOnly=!0,Buffer.isBuffer(data4))return data4;let buf;return data4 instanceof
|
|
1804
1804
|
ArrayBuffer?buf=new FastBuffer(data4):ArrayBuffer.isView(data4)?buf=new FastBuffer(data4.buffer,data4.byteOffset,data4.byteLength):(buf=Buffer.from(data4),toBuffer2.readOnly=!1),buf}module.exports={concat:concat4,mask:_mask,toArrayBuffer:toArrayBuffer2,toBuffer:toBuffer2,unmask:_unmask};if(!process.env.WS_NO_BUFFER_UTIL)try{let bufferUtil=__require("bufferutil");module.exports.mask=function(source4,mask2,output4,offset4,length3){length3<48?_mask(source4,mask2,output4,offset4,length3):bufferUtil.
|
|
@@ -15830,7 +15830,7 @@ ed with your team, also base_revision: the revision skills_list showed before yo
|
|
|
15830
15830
|
|
|
15831
15831
|
`+AUTHORING_STANDARDS+`
|
|
15832
15832
|
|
|
15833
|
-
When done, tell the user the skill name and a one-line summary of what it captured.`}function expandLearnTurnText(userText){let learn=parseLearnCommand(userText)??parseSaveRunRequest(userText);return learn?buildLearnPrompt(learn.request):userText}init_zod();init_atomic();init_config3();import{existsSync as existsSync13,readFileSync as readFileSync26,readdirSync as readdirSync8,rmSync as rmSync6}from"node:fs";import{basename as basename8,join as join31}from"node:path";import{createHash as createHash9,randomUUID as randomUUID8}from"node:crypto";import{EventEmitter}from"node:events";import{mkdirSync as mkdirSync14,renameSync as renameSync8}from"node:fs";function skillsLibraryEnabled(cfg2){return cfg2.features?.skillsLibrary
|
|
15833
|
+
When done, tell the user the skill name and a one-line summary of what it captured.`}function expandLearnTurnText(userText){let learn=parseLearnCommand(userText)??parseSaveRunRequest(userText);return learn?buildLearnPrompt(learn.request):userText}init_zod();init_atomic();init_config3();import{existsSync as existsSync13,readFileSync as readFileSync26,readdirSync as readdirSync8,rmSync as rmSync6}from"node:fs";import{basename as basename8,join as join31}from"node:path";import{createHash as createHash9,randomUUID as randomUUID8}from"node:crypto";import{EventEmitter}from"node:events";import{mkdirSync as mkdirSync14,renameSync as renameSync8}from"node:fs";function skillsLibraryEnabled(cfg2){return cfg2.features?.skillsLibrary!==!1}var SAFE_ID=/^[a-z0-9]+(?:-[a-z0-9]+)*$/;function strings2(value3){return Array.isArray(value3)&&value3.every(item=>typeof item=="string"&&item.trim())?value3.map(item=>item.trim()):null}function parseSkillManifest(value3,directory){if(!value3||typeof value3!="object")throw new Error(`${directory}/manifest.json is invalid`);let raw=value3,id12=typeof raw.id=="string"?raw.id:"",triggerTerms=strings2(raw.triggerTerms),requiredCapabilities=strings2(
|
|
15834
15834
|
raw.requiredCapabilities);if(!SAFE_ID.test(id12)||id12!==basename8(directory))throw new Error(`${directory}/manifest.json has an invalid id`);if(typeof raw.name!="string"||!raw.name.trim())throw new Error(`${directory}/manifest.json has no name`);if(typeof raw.version!="string"||!/^\d+\.\d+\.\d+$/.test(raw.version))throw new Error(`${directory}/manifest.json has an invalid version`);if(typeof raw.description!="string"||!raw.description.trim())throw new Error(`${directory}/manifest.json has no de\
|
|
15835
15835
|
scription`);if(typeof raw.defaultEnabled!="boolean")throw new Error(`${directory}/manifest.json has no defaultEnabled flag`);if(!triggerTerms?.length)throw new Error(`${directory}/manifest.json has no trigger terms`);if(!requiredCapabilities)throw new Error(`${directory}/manifest.json has invalid capabilities`);return{id:id12,name:raw.name.trim(),version:raw.version,description:raw.description.trim(),defaultEnabled:raw.defaultEnabled,triggerTerms,requiredCapabilities}}function loadSkillDirectory(directory){
|
|
15836
15836
|
let manifestPath2=join31(directory,"manifest.json"),skillPath=join31(directory,"SKILL.md");if(!existsSync13(manifestPath2)||!existsSync13(skillPath))return null;let manifest=parseSkillManifest(JSON.parse(readFileSync26(manifestPath2,"utf8")),directory),instructions=readFileSync26(skillPath,"utf8").trim();if(!instructions.startsWith("---"))throw new Error(`${skillPath} has no skill frontmatter`);return{manifest,instructions,directory}}function loadBundledSkills(root3=process.env.OMB_SKILLS_DIR||join31(
|
|
@@ -18121,11 +18121,11 @@ PROXY_EXECUTE"){if(own4)continue;let held4;try{held4=await deps.composio.verifie
|
|
|
18121
18121
|
if(!team)return null;let apps2=personApps();for(let slug3 of slugs){let app=apps2.includes(slug3)?slug3:null;if(capability2.connectorsFor)return app?lines.connect(appLabel(app),capability2.connectorsFor):lines.teamCard(appLabel(slug3),capability2.connectorsFor);if(app){let person2=turnPerson(capability2.threadId,capability2.generation)??actingFor(capability2.threadId,capability2.generation);return person2?lines.connect(appLabel(app),person2):lines.nobody(appLabel(app))}}return null},async turnMcp(bot,threadId,generation){
|
|
18122
18122
|
let all3=deps.botMcp(bot),names5=personMcp(),out=await withMcpSignIn(without2(all3,names5),deps.mcpOAuth),person2=names5.length?turnPerson(threadId,generation):null;if(!person2)return out;for(let name6 of names5){let spec=all3[name6];if(!spec||!("url"in spec))continue;let own4=await personSpec(person2,name6,spec);own4&&(out[name6]=own4)}return out},engineMcp(bot){return withoutPendingSignIn(without2(deps.botMcp(bot),personMcp()),deps.mcpOAuth)},prompt(threadId,generation,mounted){let apps2=personApps(),
|
|
18123
18123
|
servers=personMcp();if(!team||!apps2.length&&!servers.length)return"";let names5=[...apps2.map(appLabel),...servers],person2=turnPerson(threadId,generation),acting=person2?null:actingFor(threadId,generation);if(acting){let who2=nameOf2(acting),these=`${list(names5)} ${names5.length===1?"is":"are"} each person's own in ${team.name}`;return hasOwn2(acting)?` ${these}, used only in a chat that is theirs alone. Others read this chat, so ${who2}'s own aren't here: what they bring back would be read h\
|
|
18124
|
-
ere. If the task needs one, don't try it another way (the browser or another tool). ${handOnHow(who2)}`:` ${these}, and ${who2} hasn't connected any yet. If the task needs one, don't try it another way (the browser or another tool): reply with one plain line and nothing more about it: "Connect your <name> here: ${ownPage(acting)??"your team's page in
|
|
18124
|
+
ere. If the task needs one, don't try it another way (the browser or another tool). ${handOnHow(who2)}`:` ${these}, and ${who2} hasn't connected any yet. If the task needs one, don't try it another way (the browser or another tool): reply with one plain line and nothing more about it: "Connect your <name> here: ${ownPage(acting)??"your team's page in Limix Bot Cloud"}".`}if(!person2){let where3=appsPage();return` ${list(names5)} ${names5.length===1?"is":"are"} each person's own in ${team.name}: ${names5.
|
|
18125
18125
|
length===1?"it works":"they work"} for the person whose own message started the work, and this work doesn't act for one person (a routine, an outside app or a bot started it, or more than one person wrote in it). If the task needs one, don't try it another way (the browser or another tool): reply with one plain line and nothing more about it: "<name> is each person's own, so I can't use it here. Ask me yourself and I'll use yours${where3?`, or an admin can connect <name> for the whole team: ${where3}`:
|
|
18126
18126
|
""}."`}let who=nameOf2(person2),whose=`${who}'s`,ownApps=mounted.composioOwn?apps2:[],ownServers=servers.filter(name6=>Object.hasOwn(mounted.custom??{},name6)),missing2=[...mounted.composioOwn?[]:apps2.map(appLabel),...servers.filter(name6=>!ownServers.includes(name6))],where2=ownPage(person2),only2=`They are used only for ${who}'s request: if someone else asks for something from them, say they are ${whose}.`;return(ownApps.length?` ${list(ownApps.map(appLabel))} ${ownApps.length===1?"is":"are"}\
|
|
18127
18127
|
${whose} own: use ${ownApps.length===1?"it":"them"} through the ${OWN_APPS_SERVER} tools, which act as their own accounts; ${team.name}'s shared apps stay under composio.`:"")+(ownServers.length?` The MCP ${ownServers.length===1?"server":"servers"} ${list(ownServers)} act${ownServers.length===1?"s":""} as ${whose} own account.`:"")+(ownApps.length||ownServers.length?` ${only2}`:"")+(missing2.length?` Each person connects these for themselves, and ${who} hasn't connected ${missing2.length===1?"i\
|
|
18128
|
-
t":"them"} yet, or their sign-in ended: ${list(missing2)}. If the task needs one, don't try it another way (the browser or another tool): reply with one plain line and nothing more about it: "Connect your <name> here: ${where2??"your team's page in
|
|
18128
|
+
t":"them"} yet, or their sign-in ended: ${list(missing2)}. If the task needs one, don't try it another way (the browser or another tool): reply with one plain line and nothing more about it: "Connect your <name> here: ${where2??"your team's page in Limix Bot Cloud"}".`:"")},toolWhose(threadId,generation,tool5,input2){let apps2=personApps(),servers=personMcp();if(!team||!generation||!apps2.length&&!servers.length)return{};let named4=/^mcp__(.+?)__(.+)$/.exec(tool5),server2=named4?.[1],bare3=named4?.[2]??
|
|
18129
18129
|
tool5,app=null,theirs=()=>!1;if(server2!==void 0&&servers.includes(server2)){let spec=teamServer(server2),url2=spec&&isRemoteMcpServer(spec)?spec.url:null;app=server2,theirs=person3=>!!(url2&&(people.key(person3,server2,url2)||people.oauth(person3).authState(server2,url2)==="signed-in"))}else if(server2===void 0||server2===OWN_APPS_SERVER){let called=typeof input2=="string"?input2:input2===void 0?"":JSON.stringify(input2),slug3=[bare3.replace(/\./g,"_"),...[...called.matchAll(/"tool_slug"\s*:\s*"([A-Za-z0-9_]+)"/g)].
|
|
18130
18130
|
map(match5=>match5[1])].map(candidate=>personAppOf(candidate,apps2)).find(Boolean);app=slug3?appLabel(slug3):null,theirs=person3=>people.appsAccess(person3)!==null}let person2=app?turnPerson(threadId,generation):null;return app&&person2&&theirs(person2)?{whose:{person:nameOf2(person2),app}}:{}},forgetServer(name6){people.forgetServer(name6),scopes.scope("mcp",name6)==="person"&&scopes.set("mcp",name6,"team")},async mcpCallback(host3,search3){let shared=await deps.mcpOAuth.publicCallback(host3,search3);
|
|
18131
18131
|
if(shared.status!==400)return shared;for(let manager of people.liveManagers()){let answer2=await manager.publicCallback(host3,search3);if(answer2.status!==400)return answer2}return shared},ownAppsServices,forgetPerson:person2=>people.forgetPerson(person2),async adminExtras(){if(!team)return{};let apps2=personApps(),servers=personMcp(),byApp=Object.fromEntries(apps2.map(slug3=>[slug3,[]]));if(apps2.length)for(let{email:email3,services:services2}of await ownAppsServices())for(let slug3 of apps2)services2?.[slug3]?.
|
|
@@ -22046,8 +22046,8 @@ linux"||!host3||host3.uid===0||host3.uid===GUEST_UID?null:{uid:host3.uid,gid:hos
|
|
|
22046
22046
|
caps);return HARDENED_CAP_SETS.some(set10=>capSetKey(podmanBrowserSandbox?[...set10,"SYS_CHROOT"]:set10)===key7)}function desktopCapArgs(runtime2){return["--cap-drop","ALL",...(runtime2==="podman"?[...PACKAGE_INSTALL_CAPS,"SYS_CHROOT"]:PACKAGE_INSTALL_CAPS).flatMap(cap2=>["--cap-add",cap2])]}function dockerSecurityIsHardened(config3,options2={}){if(!config3)return!1;let capDrop=(config3.CapDrop??[]).map(cap2=>cap2.toLowerCase()),noNewPrivileges=(config3.SecurityOpt??[]).some(option2=>/^no-new-privileges(?:[:=]true)?$/i.
|
|
22047
22047
|
test(option2)),unsafeSecurityOption=(config3.SecurityOpt??[]).some(option2=>/(?:^|=)(?:unconfined|disable)$/i.test(option2)),restartPolicy=config3.RestartPolicy?.Name,restartPolicyOk=options2.restartPolicy==="any"||(options2.restartPolicy==="unless-stopped"?restartPolicy==="unless-stopped":restartPolicy===void 0||restartPolicy===""||restartPolicy==="no");return capDrop.includes("all")&&isHardenedCapSet(config3.CapAdd,options2.podmanBrowserSandbox===!0)&&(options2.requireNoNewPrivileges!==!0||noNewPrivileges)&&
|
|
22048
22048
|
config3.Privileged===!1&&!config3.PidMode&&config3.IpcMode==="private"&&!config3.UTSMode&&(!config3.Devices||config3.Devices.length===0)&&(!config3.DeviceRequests||config3.DeviceRequests.length===0)&&!unsafeSecurityOption&&!config3.UsernsMode&&config3.CgroupnsMode==="private"&&config3.AutoRemove!==!0&&restartPolicyOk}function podmanSecurityIsHardened(config3,effectiveCaps,boundingCaps,options2={}){return!config3||!isHardenedCapSet(effectiveCaps,!0)||capSetKey(boundingCaps)!==capSetKey(effectiveCaps)?
|
|
22049
|
-
!1:dockerSecurityIsHardened({...config3,CapDrop:["all"],CapAdd:effectiveCaps,PidMode:config3.PidMode==="private"?"":config3.PidMode,UTSMode:config3.UTSMode==="private"?"":config3.UTSMode,UsernsMode:config3.UsernsMode==="private"||config3.UsernsMode==="keep-id:uid=1000,gid=1000"?"":config3.UsernsMode,CgroupnsMode:config3.CgroupnsMode||"private"},{podmanBrowserSandbox:!0,requireNoNewPrivileges:options2.requireNoNewPrivileges})}var run4=promisify2(execFile9),SCREENSHOT_STATUS_TTL_MS=1e4,CUA_DRIVER_VERSION="0.37.0",BASE_IMAGE_REPOSITORY="docker.io/trycua/xfce-cua",BASE_IMAGE_DIGEST="sha256:274eb636f5cf3fc58f705916ee72b7a701270b3877369d08533a385c5325be9b",BASE_IMAGE=`${BASE_IMAGE_REPOSITORY}@${BASE_IMAGE_DIGEST}`,IMAGE_REPOSITORY="localhost/
|
|
22050
|
-
openmausbot-computer",MANAGED_LABEL="com.openmausbot.local-vm",DRIVER_LABEL="com.openmausbot.cua-driver",BASE_IMAGE_LABEL="com.openmausbot.cua-base",WORKSPACE_LABEL="com.openmausbot.workspace",TARGET_LABEL="com.openmausbot.local-vm-target",VM_WORKSPACE_DIR=join111(DATA_DIR,"vm-home"),VM_WORKSPACE_GUEST="/home/cua/workspace",DISPLAY=":1",CUA_SOCKET="/run/user/1000/
|
|
22049
|
+
!1:dockerSecurityIsHardened({...config3,CapDrop:["all"],CapAdd:effectiveCaps,PidMode:config3.PidMode==="private"?"":config3.PidMode,UTSMode:config3.UTSMode==="private"?"":config3.UTSMode,UsernsMode:config3.UsernsMode==="private"||config3.UsernsMode==="keep-id:uid=1000,gid=1000"?"":config3.UsernsMode,CgroupnsMode:config3.CgroupnsMode||"private"},{podmanBrowserSandbox:!0,requireNoNewPrivileges:options2.requireNoNewPrivileges})}var run4=promisify2(execFile9),SCREENSHOT_STATUS_TTL_MS=1e4,CUA_DRIVER_VERSION="0.37.0",BASE_IMAGE_REPOSITORY="docker.io/trycua/xfce-cua",BASE_IMAGE_DIGEST="sha256:274eb636f5cf3fc58f705916ee72b7a701270b3877369d08533a385c5325be9b",BASE_IMAGE=`${BASE_IMAGE_REPOSITORY}@${BASE_IMAGE_DIGEST}`,IMAGE_REPOSITORY="localhost/limixbot/cua-local-vm",IMAGE_LAYER_VERSION="9",IMAGE_LAYER_LABEL="com.openmausbot.image-layer",IMAGE2=`${IMAGE_REPOSITORY}:driver-${CUA_DRIVER_VERSION}-v${IMAGE_LAYER_VERSION}`,CONTAINER2="\
|
|
22050
|
+
openmausbot-computer",MANAGED_LABEL="com.openmausbot.local-vm",DRIVER_LABEL="com.openmausbot.cua-driver",BASE_IMAGE_LABEL="com.openmausbot.cua-base",WORKSPACE_LABEL="com.openmausbot.workspace",TARGET_LABEL="com.openmausbot.local-vm-target",VM_WORKSPACE_DIR=join111(DATA_DIR,"vm-home"),VM_WORKSPACE_GUEST="/home/cua/workspace",DISPLAY=":1",CUA_SOCKET="/run/user/1000/limixbot-cua.sock",CUA_EXECUTABLE="/usr/local/libexec/limixbot/cua-driver",RUNTIMES=["docker","podman","container"],INTERNAL_VIEWER_PORT=6901,
|
|
22051
22051
|
HOST_VIEWER_PORT=6080,SHARED_LOCAL_VM_TARGET={key:"shared",containerName:CONTAINER2,workspaceDir:VM_WORKSPACE_DIR,viewerPort:HOST_VIEWER_PORT,label:"shared"};function perBotLocalVmTarget(botId){let digest5=createHash51("sha256").update(botId).digest("hex"),short2=digest5.slice(0,16);return{key:`bot:${digest5}`,containerName:`${CONTAINER2}-${short2}`,workspaceDir:join111(DATA_DIR,"vm-homes",short2),viewerPort:null,label:digest5}}function poolLocalVmTarget(seat){return{key:`pool:${seat}`,containerName:`${CONTAINER2}\
|
|
22052
22052
|
-p${seat}`,workspaceDir:join111(DATA_DIR,"vm-homes",`pool-${seat}`),viewerPort:null,label:`pool-${seat}`}}function localVmWorkspaceExists(target4){try{return lstatSync22(target4.workspaceDir,{throwIfNoEntry:!1})?.isDirectory()===!0}catch{return!1}}var LINUX_WHEELS={x86_64:{url:"https://files.pythonhosted.org/packages/3b/b0/97f6d8828b8a6ca3649ad7150ddbc23addde56f014c9bd407876484ecb8d/cua_driver-0.37.0-py3-none-manylinux_2_31_x86_64.whl",sha256:"e530ee36226d99516ef7ec696ba31d516e487ae5e5effdd5e261\
|
|
22053
22053
|
0c56af3eee19"},aarch64:{url:"https://files.pythonhosted.org/packages/dc/33/81e2531353837f80358fbf56629a74f50d7f097af4b5f67626b0afce2d61/cua_driver-0.37.0-py3-none-manylinux_2_31_aarch64.whl",sha256:"1a0103fd7fa5e9d51ee3ce26d502eb4187702282b3f4bcf1e9c09c6ce9f9d558"}};function managedImageDockerfile(){return`FROM ${BASE_IMAGE}
|
|
@@ -29972,23 +29972,23 @@ ersation"});let generation=url2.searchParams.get("generation"),after=count11(url
|
|
|
29972
29972
|
once("end",resolve56),res.once("close",()=>{stream2.destroy(),resolve56()}),stream2.pipe(res)})}}var HIDDEN2={status:404,body:{error:"no such sign-in request"}},CARD=/^\/api\/bots\/([\w-]+)\/sign-in-cards\/([\w-]+)\/(done|cancel|save-login|saved-logins|use-login)$/u;function createSignInCardRoutes(deps){return async({req,res,url:url2,path:path6,method:method2,auth,json:json6,readBody:readBody2})=>{let m3=CARD.exec(path6);if(!m3)return PASS;if(m3[3]==="save-login"&&method2==="GET"){let threadId2=url2.searchParams.get("threadId")??"",result3=deps.threadVisible(auth,threadId2)?await deps.saveTarget(
|
|
29973
29973
|
m3[1],threadId2,m3[2]):HIDDEN2;return json6(res,result3.status,result3.body)}if(m3[3]==="saved-logins"&&method2==="GET"){let threadId2=url2.searchParams.get("threadId")??"";res.setHeader("cache-control","no-store");let result3=deps.vault&&deps.threadVisible(auth,threadId2)?deps.vault.list(m3[1],threadId2,m3[2]):{status:200,body:{choices:[]}};return json6(res,result3.status,result3.body)}if(method2!=="POST"||m3[3]==="saved-logins")return PASS;if(m3[3]==="save-login"||m3[3]==="use-login"){if(String(
|
|
29974
29974
|
req.headers["content-type"]??"").split(";",1)[0].trim().toLowerCase()!=="application/json")return json6(res,415,{error:"content-type must be application/json"});let body3=await readBody2(req,16384),fields2=body3&&typeof body3=="object"&&!Array.isArray(body3)?body3:{},threadId2=String(fields2.threadId??"");if(m3[3]==="use-login"){let used=deps.vault&&deps.threadVisible(auth,threadId2)?deps.vault.use(m3[1],threadId2,m3[2],fields2.loginId):HIDDEN2;return json6(res,used.status,used.body)}let result3=deps.
|
|
29975
|
-
threadVisible(auth,threadId2)?await deps.saveLogin(m3[1],threadId2,m3[2],fields2,auth):HIDDEN2;return json6(res,result3.status,result3.body)}let body2=await readBody2(req),threadId=String(body2.threadId??""),result2=deps.threadVisible(auth,threadId)?deps.settle(m3[1],threadId,m3[2],m3[3]==="done"?"done":"cancelled"):HIDDEN2;return json6(res,result2.status,result2.body)}}init_peer_roster();init_schema();var TEAM_LIBRARY_REPOSITORY="https://github.com/
|
|
29976
|
-
|
|
29977
|
-
|
|
29978
|
-
|
|
29979
|
-
|
|
29980
|
-
|
|
29981
|
-
|
|
29982
|
-
|
|
29983
|
-
|
|
29984
|
-
|
|
29985
|
-
|
|
29986
|
-
|
|
29987
|
-
|
|
29988
|
-
|
|
29989
|
-
|
|
29990
|
-
|
|
29991
|
-
|
|
29975
|
+
threadVisible(auth,threadId2)?await deps.saveLogin(m3[1],threadId2,m3[2],fields2,auth):HIDDEN2;return json6(res,result3.status,result3.body)}let body2=await readBody2(req),threadId=String(body2.threadId??""),result2=deps.threadVisible(auth,threadId)?deps.settle(m3[1],threadId,m3[2],m3[3]==="done"?"done":"cancelled"):HIDDEN2;return json6(res,result2.status,result2.body)}}init_peer_roster();init_schema();var TEAM_LIBRARY_REPOSITORY="https://github.com/leomieo/limix-bot-teams",TEAM_LIBRARY_RAW_ROOT="https://raw.githubusercontent.com/leomieo/limix-bot-teams/main",TEAM_LIBRARY_CATALOG_URL=`${TEAM_LIBRARY_RAW_ROOT}/catalog.json`,MAX_CATALOG_BYTES=256e3,MAX_MANIFEST_BYTES=1e6,isRecord38=value3=>!!value3&&typeof value3=="object"&&!Array.isArray(value3);function text27(value3,field5,max4){if(typeof value3!="string"||!value3.trim())throw new Error(`${field5} is required`);let normalized2=value3.trim();if(normalized2.
|
|
29976
|
+
length>max4)throw new Error(`${field5} is too long`);return normalized2}function relativeFile(value3,field5,suffix,prefix){let path6=text27(value3,field5,300);if(path6.startsWith("/")||path6.includes("\\")||path6.split("/").some(part2=>!part2||part2==="."||part2==="..")||!path6.startsWith(prefix)||!path6.endsWith(suffix))throw new Error(`${field5} is not a safe catalog path`);return path6}function stringList2(value3,field5,maxItems){if(!Array.isArray(value3)||value3.length>maxItems)throw new Error(
|
|
29977
|
+
`${field5} is invalid`);return value3.map((item,index4)=>text27(item,`${field5}[${index4}]`,100))}function parseTeamCatalog(value3){if(!isRecord38(value3)||value3.format!=="openmaus.catalog"||value3.version!==1)throw new Error("The team library catalog is not supported");if(!Array.isArray(value3.teams)||value3.teams.length>100)throw new Error("The team library catalog is invalid");let slugs=new Set,teams=value3.teams.map((raw,index4)=>{let field5=`teams[${index4}]`;if(!isRecord38(raw))throw new Error(
|
|
29978
|
+
`${field5} is invalid`);let slug3=text27(raw.slug,`${field5}.slug`,80);if(!/^[a-z0-9][a-z0-9-]*$/.test(slug3)||slugs.has(slug3))throw new Error(`${field5}.slug is invalid`);slugs.add(slug3);let prefix=`teams/${slug3}/`,requires=isRecord38(raw.requires)?raw.requires:{};return{slug:slug3,name:text27(raw.name,`${field5}.name`,100),summary:text27(raw.summary,`${field5}.summary`,300),category:text27(raw.category,`${field5}.category`,80),...typeof raw.outcome=="string"?{outcome:text27(raw.outcome,`${field5}\
|
|
29979
|
+
.outcome`,300)}:{},...typeof raw.setupMinutes=="number"&&Number.isSafeInteger(raw.setupMinutes)&&raw.setupMinutes>0&&raw.setupMinutes<=240?{setupMinutes:raw.setupMinutes}:{},...typeof raw.featured=="boolean"?{featured:raw.featured}:{},...raw.package!==void 0?{package:relativeFile(raw.package,`${field5}.package`,".md","packages/")}:{},manifest:relativeFile(raw.manifest,`${field5}.manifest`,".mausteam.json",prefix),readme:relativeFile(raw.readme,`${field5}.readme`,"README.md",prefix),members:typeof raw.
|
|
29980
|
+
members=="number"&&Number.isSafeInteger(raw.members)&&raw.members>0&&raw.members<=200?raw.members:(()=>{throw new Error(`${field5}.members is invalid`)})(),skills:Array.isArray(raw.skills)?raw.skills.map((skill,skillIndex)=>relativeFile(skill,`${field5}.skills[${skillIndex}]`,"SKILL.md",`${prefix}skills/`)):(()=>{throw new Error(`${field5}.skills is invalid`)})(),requires:{apps:stringList2(requires.apps??[],`${field5}.requires.apps`,30)}}});return{format:"openmaus.catalog",version:1,repositoryUrl:TEAM_LIBRARY_REPOSITORY,
|
|
29981
|
+
teams}}async function fetchJson2(url2,maxBytes,fetcher){let response=await fetcher(url2,{headers:{accept:"application/json, text/plain;q=0.9"},redirect:"error",signal:AbortSignal.timeout(1e4)});if(!response.ok)throw Object.assign(new Error(`GitHub returned HTTP ${response.status}`),{status:response.status});if(Number(response.headers.get("content-length")??0)>maxBytes)throw new Error("The remote team file is too large");let raw=await response.text();if(Buffer.byteLength(raw)>maxBytes)throw new Error(
|
|
29982
|
+
"The remote team file is too large");try{return parseJson(raw)}catch{throw new Error("GitHub did not return valid JSON")}}async function fetchText(url2,maxBytes,fetcher){let response=await fetcher(url2,{headers:{accept:"text/markdown, text/plain;q=0.9"},redirect:"error",signal:AbortSignal.timeout(1e4)});if(!response.ok)throw Object.assign(new Error(`GitHub returned HTTP ${response.status}`),{status:response.status});if(Number(response.headers.get("content-length")??0)>maxBytes)throw new Error("T\
|
|
29983
|
+
he remote team file is too large");let raw=await response.text();if(Buffer.byteLength(raw)>maxBytes)throw new Error("The remote team file is too large");return raw}async function fetchTeamCatalog(fetcher=fetch){return parseTeamCatalog(await fetchJson2(TEAM_LIBRARY_CATALOG_URL,MAX_CATALOG_BYTES,fetcher))}function parseShareable(value3){return typeof value3=="string"?parseBotPackage(value3):isBotPackage(value3)?value3.version===1?parseBotPackage(value3):parsePackageDocument(value3,{trust:"file"}):
|
|
29984
|
+
parseTeamManifest(value3)}async function fetchShareable(url2,fetcher){return url2.endsWith(".md")?parseBotPackage(await fetchText(url2,MAX_MANIFEST_BYTES,fetcher)):parseShareable(await fetchJson2(url2,MAX_MANIFEST_BYTES,fetcher))}async function fetchLibraryTeam(slug3,fetcher=fetch){if(!/^[a-z0-9][a-z0-9-]*$/.test(slug3))throw new Error("That team name is invalid");let entry2=(await fetchTeamCatalog(fetcher)).teams.find(team=>team.slug===slug3);if(!entry2)throw Object.assign(new Error("That libra\
|
|
29985
|
+
ry team was not found"),{status:404});return fetchShareable(`${TEAM_LIBRARY_RAW_ROOT}/${entry2.package??entry2.manifest}`,fetcher)}var MAX_CHIEF_TEAMS=30,MAX_ROLE_TEXT=280,oneLine11=(text30,max4)=>{let line6=text30.replace(/\s+/g," ").trim();return line6.length>max4?`${line6.slice(0,max4-1).trimEnd()}\u2026`:line6};function libraryRoles(team){let role=(member,lead)=>({name:member.name,title:member.title?.trim()||"Specialist",...member.description?.trim()?{does:oneLine11(member.description,MAX_ROLE_TEXT)}:
|
|
29986
|
+
{},...lead?{lead:!0}:{}});if(!("package"in team))return team.team.members.map(member=>role(member,!1));let pkg2=team.version===PACKAGE_V1_VERSION?upgradeV1(team).package:team.package;return pkg2.agents.map(agent=>role(agent,agent.key===pkg2.team?.leader))}async function libraryTeamRoles(fetcher=fetch){let catalog=await fetchTeamCatalog(fetcher);return Promise.all(catalog.teams.slice(0,MAX_CHIEF_TEAMS).map(async entry2=>({name:entry2.name,summary:entry2.summary,roles:await fetchShareable(`${TEAM_LIBRARY_RAW_ROOT}\
|
|
29987
|
+
/${entry2.package??entry2.manifest}`,fetcher).then(libraryRoles,()=>[])})))}function safeSegment(value3){return/^[A-Za-z0-9._-]+$/.test(value3)&&value3!=="."&&value3!==".."}function githubManifestUrls(input2){let url2;try{url2=new URL(input2.trim())}catch{throw new Error("Enter a valid GitHub URL")}if(url2.protocol!=="https:"||url2.username||url2.password||url2.port)throw new Error("Only public HTTPS GitHub links are supported");let parts3=url2.pathname.split("/").filter(Boolean).map(part2=>decodeURIComponent(
|
|
29988
|
+
part2));if(!parts3.every(safeSegment))throw new Error("That GitHub path is not supported");if(url2.hostname==="github.com"||url2.hostname==="www.github.com"){if(parts3.length===2){let[owner2,repo]=parts3;return[`https://raw.githubusercontent.com/${owner2}/${repo}/main/botmrr.md`,`https://raw.githubusercontent.com/${owner2}/${repo}/main/team.md`,`https://raw.githubusercontent.com/${owner2}/${repo}/main/team.mausteam.json`,`https://raw.githubusercontent.com/${owner2}/${repo}/master/botmrr.md`,`htt\
|
|
29989
|
+
ps://raw.githubusercontent.com/${owner2}/${repo}/master/team.md`,`https://raw.githubusercontent.com/${owner2}/${repo}/master/team.mausteam.json`]}if(parts3.length>=5&&(parts3[2]==="blob"||parts3[2]==="raw")){let[owner2,repo,,ref4,...file2]=parts3;if(!file2.at(-1)?.match(/\.(?:md|json)$/))throw new Error("The GitHub link must point to a Markdown playbook or JSON team file");return[`https://raw.githubusercontent.com/${owner2}/${repo}/${ref4}/${file2.join("/")}`]}}if(url2.hostname==="raw.githubuser\
|
|
29990
|
+
content.com"&&parts3.length>=4){if(!parts3.at(-1)?.match(/\.(?:md|json)$/))throw new Error("The GitHub link must point to a Markdown playbook or JSON team file");return[`https://raw.githubusercontent.com/${parts3.join("/")}`]}throw new Error("Paste a GitHub repository, Markdown playbook, or legacy JSON team link")}async function fetchGithubTeam(input2,fetcher=fetch){let urls=githubManifestUrls(input2),lastError;for(let url2 of urls)try{return await fetchShareable(url2,fetcher)}catch(error66){if(lastError=
|
|
29991
|
+
error66,error66.status!==404)throw error66}throw lastError??new Error("No botmrr.md, team.md, or legacy team file was found in that repository")}var NOT_CHIEF="Only an active Chief may plan team setup";function createInternalChiefTeamRoutes(deps){let chief=()=>{let bot=deps.bot();return chiefLevel(bot)&&!bot.hidden?bot:null};return async({res,path:path6,method:method2,json:json6})=>{if(method2!=="GET"||path6!=="/api/internal/team-setup-catalog"&&path6!=="/api/internal/team-library")return PASS;if(!chief())return json6(res,403,{error:NOT_CHIEF});if(path6==="/api/internal/team-library"){let teams;try{teams=await(deps.library??libraryTeamRoles)()}catch{
|
|
29992
29992
|
return json6(res,502,{error:"The team library can't be reached right now. Build the team from what the person asked."})}return deps.requireActive(),chief()?json6(res,200,{teams}):json6(res,403,{error:NOT_CHIEF})}let instances=await deps.instances();deps.requireActive();let current3=chief();return current3?json6(res,200,{teams:deps.teams().filter(name6=>hasTeamAuthority(current3,name6)),bots:deps.bots().filter(bot=>!bot.hidden&&hasTeamAuthority(current3,bot.section)&&(bot.id===current3.id||peerAllowed(
|
|
29993
29993
|
current3,bot))).map(bot=>({id:bot.id,name:bot.name,title:bot.title,section:bot.section??"",modelSelection:bot.modelSelection,chiefOfStaff:!!bot.chiefOfStaff})),instances:instances.map(instance=>({instanceId:instance.instanceId,driverKind:instance.driverKind,displayName:instance.displayName,state:instance.snapshot.state,models:instance.models,effortLevels:instance.capabilities?.effortLevels??[]})),scope:"Bot model defaults apply to groups and new threads; existing threads retain their models. Req\
|
|
29994
29994
|
uested team setup applies immediately, and the person can undo it. Existing unauthorized teams remain outside this Chief's scope."}):json6(res,403,{error:NOT_CHIEF})}}var MENU_SHORT=8,MENU_WHOLE=12,MENU_FOUND=20,MENU_CHECKS=3,SEARCH_MAX_CHARS=200,squash=text30=>text30.toLowerCase().replace(/[^a-z0-9]/g,"");function modelMenu(input2){let terms2=input2.search?.toLowerCase().split(/\s+/).filter(Boolean)??[],room=MENU_FOUND,engines=[],unavailable3=[];for(let engine of input2.engines){let{instanceId}=engine,name6=engine.displayName||engine.driverKind,labels2=new Map(engine.models.options.filter(option2=>!option2.orgBlocked&&!option2.needsCliUpdate).map(option2=>[option2.
|
|
@@ -31552,10 +31552,11 @@ text).join(`
|
|
|
31552
31552
|
role==="bot"&&message8.kind==="text"&&message8.turnId===event2.turnId),member=reply4?.from?store4.bot(reply4.from.botId):void 0;if(!roomCaptureAllowed(room,member)||isUnattended(member.id,event2.threadId))return;let turn2=captureRoomTurnFor(event2.threadId,member.id,event2.turnId);turn2&&memoryUpkeep.noteTurn(teamHost.layer(member.id,event2.threadId),event2.threadId,turn2);return}let bot=store4.botByThread(event2.threadId);if(!bot||!upkeepEnabled(bot)||isInternalTurn(event2.threadId)||isUnattended(
|
|
31553
31553
|
bot.id,event2.threadId)||routines?.runForThread(event2.threadId)||CLOUD_PERSONAL&&!cloudOwnerOnlyThread(event2.threadId))return;let turn=captureTurnFor(event2.threadId,event2.turnId);turn&&memoryUpkeep.noteTurn(teamHost.layer(bot.id,event2.threadId),event2.threadId,teamHost.ownTurn(event2.threadId)?{...turn,owner:!0}:turn)}catch(error66){console.warn(`memory upkeep: could not queue a turn for capture: ${error66.message}`)}});var skillReview=createSkillReview({enabled:()=>skillReviewEnabled(cfg),
|
|
31554
31554
|
threshold:()=>skillReviewSteps(cfg),bot:botId=>store4.bot(botId)??void 0,engine:botId=>sideJobs.text("skill-review",botId),busy:botId=>workspaceMaintenance.active||botHasActiveTurn(botId),transcript:(botId,threadId)=>{let owned=connectorThread(botId,threadId);return!owned||cloudGuestDriven(threadId)?null:{messages:store4.activePath(threadId),room:!!owned.group}},skills:botId=>skillsHost.reviewSkills(botId,listSkills(botId).map(skill=>({name:skill.name,description:skill.description,editable:skill.
|
|
31555
|
-
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"};
|
|
31556
|
-
skillsHost.editable(botId,change2.name))return skillsHost.applyReviewUpdate(bot,threadId,change2,direct);let staged=stageSkillWrite(botId,{action:change2.action,targetName:change2.action==="update"?change2.name:void 0,files:[{path:"SKILL.md",content:change2.skillMd}],gist:change2.gist||void 0,source:learnSource("automatic review of this conversation")});if("error"in staged)return{
|
|
31557
|
-
|
|
31558
|
-
|
|
31555
|
+
editable,enabled:skill.enabled,sha256:skill.sha256,...skill.editable?{body:readSkillFile(botId,skill.name)}:{}}))),currentSha:(botId,name6)=>listSkills(botId).find(skill=>skill.name===name6)?.sha256??skillsHost.sharedSha(botId,name6),apply:(botId,threadId,change2)=>{let bot=store4.bot(botId);if(!bot)return{ok:!1,error:"unknown bot"};let direct=appliesDirectly(botId,threadId);if(!direct)return{ok:!1,error:"this conversation cannot apply skill changes without review"};let askFirst=!skillAutoApplyEnabled(
|
|
31556
|
+
cfg);if(change2.action==="update"&&skillsHost.editable(botId,change2.name))return askFirst?{ok:!1,error:"a team-shared skill is not changed while learning asks first"}:skillsHost.applyReviewUpdate(bot,threadId,change2,direct);let staged=stageSkillWrite(botId,{action:change2.action,targetName:change2.action==="update"?change2.name:void 0,files:[{path:"SKILL.md",content:change2.skillMd}],gist:change2.gist||void 0,source:learnSource("automatic review of this conversation")});if("error"in staged)return{
|
|
31557
|
+
ok:!1,error:staged.error};if(askFirst)try{let card=appendSkillRequestCard({botId,threadId,staged});return appendDecision(DATA_DIR,{threadId,requestId:card.requestId,botId,botName:bot.name,tool:"stage_skill",summary:card.summary,decision:"card-shown",source:"skill"}),{ok:!0}}catch(error66){return rejectStagedSkillWrite(botId,staged.id),{ok:!1,error:error66 instanceof Error?error66.message:String(error66)}}let applied=applyOwnStagedSkill(bot,threadId,staged,direct);return"error"in applied?{ok:!1,error:applied.
|
|
31558
|
+
error}:{ok:!0}},statePath:join274(DATA_DIR,"skill-review.json"),log:line6=>console.log(line6)});bus.subscribe(event2=>{if(!shouldIgnoreProviderEvent(event2)&&!(event2.type!=="turn.completed"||!event2.turnId))try{let messages=store4.activePath(event2.threadId),reply4=messages.findLast(message8=>message8.role==="bot"&&message8.kind==="text"&&message8.turnId===event2.turnId),room=store4.groupByThread(event2.threadId),bot=room?reply4?.from?store4.bot(reply4.from.botId):void 0:store4.botByThread(event2.
|
|
31559
|
+
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(
|
|
31559
31560
|
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.
|
|
31560
31561
|
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,
|
|
31561
31562
|
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.
|
|
@@ -32140,8 +32141,8 @@ cfg.meta?.key),deepseek:keyStatus(cfg.deepseek?.key),xResearch:xResearchStatus()
|
|
|
32140
32141
|
cfg),mode:connectionMode(cfg)},box:{...describeBoatAccount(cfg),...boatAccount(cfg)?.included?{}:keyHint(cfg.box?.token)},vps:{configured:!!vpsSshAlias(cfg),sshAlias:vpsSshAlias(cfg)??""},opencodeGo:{...keyStatus(cfg.opencodeGo?.apiKey),providerKeys:Object.keys(openCodeProviderKeys(cfg))},tts:describeVoice(cfg),decider:describeDecider(cfg),helpers:describeHelpers(cfg),imageGen:avatarImageStatus(cfg),savedKeys:nestedKeyStatus(cfg),live:liveSettingsFor(cfg),profile:CLOUD_TEAM?NOBODY_PROFILE:{name:cfg.
|
|
32141
32142
|
profile?.name??"",email:cfg.profile?.email??"",aboutMe:cfg.profile?.aboutMe??"",...cfg.profile?.avatarUrl?{avatarUrl:cfg.profile.avatarUrl}:{}},managedPolicy:managedPolicy.summary(),...CLOUD_HOME?{cloudHome:!0}:{},...CLOUD_TEAM?{team:{id:CLOUD_TEAM.id,name:CLOUD_TEAM.name,...CLOUD_HOME?{cloudPage:`${CLOUD_HOME.adminOrigin}/cloud`}:{}}}:{},language:appLanguage()??"",computerName:cfg.computerName??"",everyBotRules:cfg.everyBotRules??"",rooms:{turnTimeoutMinutes:roomTurnTimeoutMinutes(cfg)},mcp:{callTimeoutMinutes:mcpCallTimeoutMinutes(
|
|
32142
32143
|
cfg)},automaticRecovery:cfg.automaticRecovery??{enabled:!1},cacheKeepWarm:cacheKeepWarmSettings(cfg),newBots:cfg.newBots?.effort?{effort:cfg.newBots.effort}:{},threads:{maxConcurrentPerBot:maxConcurrentBotThreads(cfg,botThreadsHost(cloudPlanTier.starter())),...eventLogMaxBytes!==null?{eventLogMaxBytes}:{},...eventLogRetentionDays!==null?{eventLogRetentionDays}:{}},localVm:{mode:localVmMode(cfg),maxInstances:localVmMaxInstances(cfg),idleTimeoutMinutes:localVmIdleTimeoutMinutes(cfg),preserveInstalledApps:localVmPreservesInstalledApps(
|
|
32143
|
-
cfg)},features:{skillAuthoring:skillAuthoringEnabled(cfg),skillReview:cfg.features?.skillReview
|
|
32144
|
-
parallelRoomJobs:parallelRoomJobsEnabled(cfg),llmThreadTitles:llmThreadTitlesEnabled(cfg),savedSteps:savedStepsEnabled(cfg),savedStepsHere:savedSteps.here()},onboarding:{completedAt:cfg.onboarding?.completedAt??"",version:cfg.onboarding?.version??0,reelSeen:cfg.onboarding?.reelSeen===!0,hintsSeen:cfg.onboarding?.hintsSeen??[],...cfg.onboarding?.firstTurnAt?{firstTurnAt:cfg.onboarding.firstTurnAt}:{}},browserEngine:browserEngineSummary(),browserProfiles:cfg.browserProfiles??[],signIn:{admins:cfg.
|
|
32144
|
+
cfg)},features:{skillAuthoring:skillAuthoringEnabled(cfg),skillReview:cfg.features?.skillReview!==!1,skillAutoApply:skillAutoApplyEnabled(cfg),skillReviewSteps:skillReviewSteps(cfg),skillsLibrary:skillsLibraryEnabled(cfg),shareLearnedSkills:skillsHost.mode(),showToolCalls:showToolCallsEnabled(cfg),browser:builtInBrowserEnabled(cfg),sharedComputers:sharedComputersEnabled(cfg),claudeUserMcp:claudeUserMcpEnabled(cfg),claudeUserSkills:claudeUserSkillsEnabled(cfg),autoRecall:autoRecallEnabled(cfg),roomMemoryCapture:roomMemoryCaptureEnabled(
|
|
32145
|
+
cfg),parallelRoomJobs:parallelRoomJobsEnabled(cfg),llmThreadTitles:llmThreadTitlesEnabled(cfg),savedSteps:savedStepsEnabled(cfg),savedStepsHere:savedSteps.here()},onboarding:{completedAt:cfg.onboarding?.completedAt??"",version:cfg.onboarding?.version??0,reelSeen:cfg.onboarding?.reelSeen===!0,hintsSeen:cfg.onboarding?.hintsSeen??[],...cfg.onboarding?.firstTurnAt?{firstTurnAt:cfg.onboarding.firstTurnAt}:{}},browserEngine:browserEngineSummary(),browserProfiles:cfg.browserProfiles??[],signIn:{admins:cfg.
|
|
32145
32146
|
signIn?.admins??[],members:cfg.signIn?.members??[]},membership:workspaceMembership(),workspaceBanner:workspaceBannerSummary()}}function configForAccess(status5,admin,session){let profile=CLOUD_TEAM?session?teamHost.memberProfile(session):NOBODY_PROFILE:status5.profile,onboarding=CLOUD_TEAM?teamOnboarding(status5.onboarding,session,teamWelcome):status5.onboarding;return admin?CLOUD_TEAM?{...status5,profile,onboarding}:status5:{...withoutKeyHints(status5),edition:{edition:status5.edition.edition,features:status5.
|
|
32146
32147
|
edition.features},signIn:{admins:[],members:[]},live:liveSettingsForClient(status5.live),everyBotRules:void 0,vps:{configured:status5.vps.configured,sshAlias:""},opencodeGo:{configured:status5.opencodeGo.configured,providerKeys:[]},...CLOUD_TEAM?{onboarding}:{},profile:CLOUD_TEAM?profile:{name:profile.name,email:"",...profile.avatarUrl?{avatarUrl:profile.avatarUrl}:{}},browserProfiles:status5.browserProfiles.map(profile2=>Object.fromEntries(Object.entries(profile2).filter(([key7])=>key7!=="parti\
|
|
32147
32148
|
tionId")))}}function engineMcpServers(bot){return teamConnections.engineMcp(bot)}function teamAdminHost(){if(CLOUD_TEAM)return{summary:async()=>connectionHealth.adminRead({...teamAdminSummary({apps:configured(cfg)?await connectedServices(cfg).catch(()=>null):null,mcp:mcpServerResponse().servers,status:configStatus(),voice:{key:!!cfg.tts?.key?.trim(),included:describeVoice(cfg).included===!0},engines:registry2.instances().map(instance=>({instanceId:instance.instanceId,name:instance.displayName??instance.
|