limixbot 0.2.13 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/dist/assets/{ActivityPanel-Crvi6UFN.js → ActivityPanel-BDwrkDBX.js} +1 -1
  2. package/dist/assets/{App-DBQxC6tF.js → App-Cb2UOJS6.js} +97 -97
  3. package/dist/assets/{AppEventEditor-BKkrL3lm.js → AppEventEditor-B383TR3m.js} +1 -1
  4. package/dist/assets/BotSettingsDialog-CbbZerHF.js +16 -0
  5. package/dist/assets/{BrowserPanel-CXiPysF8.js → BrowserPanel-DY-yCZ9T.js} +1 -1
  6. package/dist/assets/{BrowserProfilesManager-B5ZQeFJ9.js → BrowserProfilesManager-BmOMzdgM.js} +1 -1
  7. package/dist/assets/{CloudAddDialog-CjSOW3Ui.js → CloudAddDialog-DP5-ha1H.js} +1 -1
  8. package/dist/assets/{ComputerFilesPane-VwEQWopG.js → ComputerFilesPane-CB2u6MXN.js} +1 -1
  9. package/dist/assets/{ComputerPanel-C4y6Mvwd.js → ComputerPanel-DI10c-7Z.js} +2 -2
  10. package/dist/assets/{DataPanel-CeaLVEeb.js → DataPanel-fAjB6GSn.js} +1 -1
  11. package/dist/assets/{DesktopViewer-CfxFVwdn.js → DesktopViewer-mWGetNwB.js} +1 -1
  12. package/dist/assets/{FilesView-B9X_qlkn.js → FilesView-CLR6NiY2.js} +1 -1
  13. package/dist/assets/{GrokMoveDialog-CuC9v4Fd.js → GrokMoveDialog-lZOa5ZKz.js} +2 -2
  14. package/dist/assets/{InspectorPanel-B6ZAVTyD.js → InspectorPanel-lOPEUSb8.js} +1 -1
  15. package/dist/assets/{KeyboardShortcutsModal-DkoOxF2t.js → KeyboardShortcutsModal-BGRMc9wJ.js} +1 -1
  16. package/dist/assets/{LiveDesktop-BsPQ6sGB.js → LiveDesktop-LRjYEzUz.js} +1 -1
  17. package/dist/assets/{LocalVmWorkspace-U6rVY7_g.js → LocalVmWorkspace-Bwq-s97O.js} +1 -1
  18. package/dist/assets/{MacLocalControl-CC-lKazM.js → MacLocalControl-DuTxY3A3.js} +1 -1
  19. package/dist/assets/{MarkdownFilePreview-D0maDIQ1.js → MarkdownFilePreview-B69UWgiO.js} +1 -1
  20. package/dist/assets/{MenuMotion-CLF0GByT.js → MenuMotion-DKMkKESs.js} +1 -1
  21. package/dist/assets/NewBotDialog-Bpi6-xSj.js +1 -0
  22. package/dist/assets/{PhoneAppDialog-CTPZwJnL.js → PhoneAppDialog-V46SXKel.js} +1 -1
  23. package/dist/assets/{PlacesRail-D510vk5R.js → PlacesRail-4ErVypbT.js} +1 -1
  24. package/dist/assets/{PluginsPanel-BC0YDZ8h.js → PluginsPanel-Cw8XeQBF.js} +1 -1
  25. package/dist/assets/{ProIntroduction-BIiaveWm.js → ProIntroduction-DPYk--IK.js} +1 -1
  26. package/dist/assets/{RemoteAgentSettingsPanel-OVWheJHu.js → RemoteAgentSettingsPanel-qxzESq_H.js} +1 -1
  27. package/dist/assets/{RoomPanel-mDRTZ2vs.js → RoomPanel-DaoRmKS_.js} +1 -1
  28. package/dist/assets/{RoutinesPage-9VDuovqw.js → RoutinesPage-CD1DvtyW.js} +2 -2
  29. package/dist/assets/{SettingsModal-BHJvNrwz.js → SettingsModal-C359HBUM.js} +1 -1
  30. package/dist/assets/{ShareTeamDialog-C4go2USY.js → ShareTeamDialog-rc1xx02E.js} +1 -1
  31. package/dist/assets/{SignedInSites-Cm_X_p_X.js → SignedInSites-CPp5ofCJ.js} +1 -1
  32. package/dist/assets/TeamLibraryPanel-D-iDVZPU.js +1 -0
  33. package/dist/assets/{TeamMapPage-CkYOrZ7X.js → TeamMapPage-od4f3NJr.js} +1 -1
  34. package/dist/assets/{TriggersPage-_qYPJ97Z.js → TriggersPage-D2ovyRGM.js} +1 -1
  35. package/dist/assets/{VisibilitySection-CpwyInUL.js → VisibilitySection-oSi2vtmx.js} +1 -1
  36. package/dist/assets/{WebhookTrigger-CfspvK5m.js → WebhookTrigger-CyP8At0y.js} +1 -1
  37. package/dist/assets/{WorksOnGrid-BtfeNPO2.js → WorksOnGrid-DbfBPgPv.js} +1 -1
  38. package/dist/assets/{abnfDiagram-YUKMZFIV-qTIn3JJ1.js → abnfDiagram-YUKMZFIV-C7wn2CLu.js} +1 -1
  39. package/dist/assets/{activity-CEhxqMcq.js → activity-Cru8B1z7.js} +1 -1
  40. package/dist/assets/{architectureDiagram-47P4ROYG-BQls0L4i.js → architectureDiagram-47P4ROYG-DgFc7YIC.js} +1 -1
  41. package/dist/assets/{blockDiagram-E7TT5TSB-DMD6noIL.js → blockDiagram-E7TT5TSB-qR-t8DMo.js} +1 -1
  42. package/dist/assets/{c4Diagram-CRA5TL53-CIp2zuwT.js → c4Diagram-CRA5TL53-DdmUjVbB.js} +1 -1
  43. package/dist/assets/{calendar-days-Di_J-dvc.js → calendar-days-CN7x0QvP.js} +1 -1
  44. package/dist/assets/channel-BIffrG1w.js +1 -0
  45. package/dist/assets/{chunk-2Q5K7J3B-BBkqbpZ4.js → chunk-2Q5K7J3B-D09jrdDt.js} +1 -1
  46. package/dist/assets/{chunk-5VM5RSS4-JdwNE0CO.js → chunk-5VM5RSS4-DJXT-XDN.js} +1 -1
  47. package/dist/assets/{chunk-7TKQ45FW-D_Zh7_1M.js → chunk-7TKQ45FW-CaULsRlr.js} +1 -1
  48. package/dist/assets/{chunk-AW2ZBBNX-BvSbOQeA.js → chunk-AW2ZBBNX-BcEB179w.js} +1 -1
  49. package/dist/assets/{chunk-FVRAUYC3-CXYsdaIb.js → chunk-FVRAUYC3-DMhPq4_N.js} +2 -2
  50. package/dist/assets/{chunk-HTAEGDNF-CO93FKYG.js → chunk-HTAEGDNF-DcoWRcH-.js} +1 -1
  51. package/dist/assets/{chunk-JWPE2WC7-Ko0D98Sv.js → chunk-JWPE2WC7-CpN6DEZO.js} +1 -1
  52. package/dist/assets/{chunk-KQW6MTUR-DBGMbUnJ.js → chunk-KQW6MTUR-BxIldIqB.js} +1 -1
  53. package/dist/assets/{chunk-XXDRQBXY-PVMPph1f.js → chunk-XXDRQBXY--M4TxaOR.js} +1 -1
  54. package/dist/assets/{classDiagram-v2-K4WV4PDN-Z-SRrzrQ.js → classDiagram-v2-K4WV4PDN-DQUUn5pg.js} +1 -1
  55. package/dist/assets/{coins-QIRjm19F.js → coins-DxQLVJqa.js} +1 -1
  56. package/dist/assets/{core-Cb-3LQeb.js → core-CjjU--NA.js} +1 -1
  57. package/dist/assets/{cose-bilkent-JH36ORCC-DcOhjasx.js → cose-bilkent-JH36ORCC-DCCMLnpT.js} +1 -1
  58. package/dist/assets/{cynefin-EF2NZ3EQ-D9Pv76Si.js → cynefin-EF2NZ3EQ-iK--S4gB.js} +1 -1
  59. package/dist/assets/{cynefinDiagram-3GCD6N5R-1Nlm6fT4.js → cynefinDiagram-3GCD6N5R-DiwEQVzk.js} +1 -1
  60. package/dist/assets/{dagre-W4DXFKR2-CW-TdWBz.js → dagre-W4DXFKR2-Bb-WXIrp.js} +1 -1
  61. package/dist/assets/{diagram-2UJZ2QOL-DJYwBSWN.js → diagram-2UJZ2QOL-CU1G-LPy.js} +1 -1
  62. package/dist/assets/{diagram-OVF4WLC6-ZajDgMU2.js → diagram-OVF4WLC6-KUL_hQtY.js} +1 -1
  63. package/dist/assets/{diagram-PFPMY2P6-D03UoQDq.js → diagram-PFPMY2P6-Du0EMvGo.js} +1 -1
  64. package/dist/assets/{diagram-UMYRVEAY-B9gI6La0.js → diagram-UMYRVEAY-BUNv47Vc.js} +1 -1
  65. package/dist/assets/{diagram-YEKJPTXX-Dxzg_fDQ.js → diagram-YEKJPTXX-DyWO406P.js} +1 -1
  66. package/dist/assets/{diagram-ZIFT7M5P-Cv6eTFZE.js → diagram-ZIFT7M5P-DGps1w58.js} +1 -1
  67. package/dist/assets/{ebnfDiagram-VR2GEFS7-BCUklW6x.js → ebnfDiagram-VR2GEFS7-BxaaJRK8.js} +1 -1
  68. package/dist/assets/{elk-IJKZMXRS-VcZs96wT.js → elk-IJKZMXRS-BuVZZmTr.js} +1 -1
  69. package/dist/assets/{erDiagram-O2IAPWRE-CJ61fO-Z.js → erDiagram-O2IAPWRE-qhhsO6Fp.js} +1 -1
  70. package/dist/assets/{file-up-BObBqrEg.js → file-up-BiK20g0M.js} +1 -1
  71. package/dist/assets/{flowDiagram-OXPTDLAJ-CQMoLXxB.js → flowDiagram-OXPTDLAJ-BsRrcKnA.js} +1 -1
  72. package/dist/assets/{ganttDiagram-R7TSEDQI-ev5i74AH.js → ganttDiagram-R7TSEDQI-jVqCmREp.js} +1 -1
  73. package/dist/assets/{gitGraphDiagram-XJZIOB7I-B8MGdCiz.js → gitGraphDiagram-XJZIOB7I-COi9bChD.js} +1 -1
  74. package/dist/assets/{import-name-6aD0J6QH.js → import-name-CrWA8Hw3.js} +1 -1
  75. package/dist/assets/{index-CRF26t5P.js → index-BIC6c7Sg.js} +1 -1
  76. package/dist/assets/{index-DgGTgaCO.js → index-Bhz3ZrDI.js} +2 -2
  77. package/dist/assets/{index-Dpov1WyC.js → index-Dy5VWChH.js} +1 -1
  78. package/dist/assets/{infoDiagram-5W2HQ5XZ-CoqaIohe.js → infoDiagram-5W2HQ5XZ-CUfzOgVW.js} +1 -1
  79. package/dist/assets/{ishikawaDiagram-K3B6WC7H-BMzA3Pkb.js → ishikawaDiagram-K3B6WC7H-DMR_Ey1I.js} +1 -1
  80. package/dist/assets/{journeyDiagram-COXZFDF6-DLNIN037.js → journeyDiagram-COXZFDF6-UiPc_2sp.js} +1 -1
  81. package/dist/assets/{kanban-definition-P3RFRI5V-savLUzO8.js → kanban-definition-P3RFRI5V-VvQXCMxr.js} +1 -1
  82. package/dist/assets/{mcp-servers-D2hHUxUp.js → mcp-servers-CBCpG62C.js} +1 -1
  83. package/dist/assets/{mermaid.core-1h5EGl1v.js → mermaid.core-BZKmLobY.js} +4 -4
  84. package/dist/assets/{mindmap-definition-LZFPQGKD-hMbAYcVv.js → mindmap-definition-LZFPQGKD-BJi3q0s6.js} +1 -1
  85. package/dist/assets/{minimize-63hYzV5y.js → minimize-B78LHbd3.js} +1 -1
  86. package/dist/assets/{monitor-DOeLdhQc.js → monitor-UBjV7Qf5.js} +1 -1
  87. package/dist/assets/{new-bot-DkcWCdL_.js → new-bot-D0DDXTKe.js} +1 -1
  88. package/dist/assets/{org-library-C-rnQ1YG.js → org-library-BdlqWown.js} +1 -1
  89. package/dist/assets/{package-format-CMpBgycc.js → package-format-EwGfXp1v.js} +1 -1
  90. package/dist/assets/{pegDiagram-BGZESJAR-BIY55aib.js → pegDiagram-BGZESJAR-C6W87HN9.js} +1 -1
  91. package/dist/assets/{pieDiagram-CAPJLFHJ-DR8o8piD.js → pieDiagram-CAPJLFHJ-B1E_Ycub.js} +1 -1
  92. package/dist/assets/{quadrantDiagram-GDMTTRAM-Dqb1703W.js → quadrantDiagram-GDMTTRAM-BasGTzC_.js} +1 -1
  93. package/dist/assets/{rail-Ok1gt1lN.js → rail-BFRrwJ6b.js} +1 -1
  94. package/dist/assets/{railroadDiagram-SM67HX2B-ZWJ9xWQY.js → railroadDiagram-SM67HX2B-BZVzOUlx.js} +1 -1
  95. package/dist/assets/{remote-desktop-panel-ganxVzJo.js → remote-desktop-panel--ikzFjV8.js} +1 -1
  96. package/dist/assets/{requirementDiagram-X7JNWC4A-Cjv_VLZj.js → requirementDiagram-X7JNWC4A-C8s2XakO.js} +1 -1
  97. package/dist/assets/{sankeyDiagram-UM26HJRW-ChHoiXzB.js → sankeyDiagram-UM26HJRW-CCCP1mnQ.js} +1 -1
  98. package/dist/assets/{sequenceDiagram-ZO4K6R2Y-B67gwOH0.js → sequenceDiagram-ZO4K6R2Y-BvwC79vw.js} +1 -1
  99. package/dist/assets/{sizeCapture-INFHLROL-DOr4ZALb.js → sizeCapture-INFHLROL-DzRVDjCL.js} +1 -1
  100. package/dist/assets/{stateDiagram-v2-TBUQTH76-DnoBtm-E.js → stateDiagram-v2-TBUQTH76-CKVmZfLe.js} +1 -1
  101. package/dist/assets/{styles-BcVNrxGE.js → styles-Bo7bYxUt.js} +5 -5
  102. package/dist/assets/styles-bUbK33f1.css +1 -0
  103. package/dist/assets/{swimlanes-N4OXWK64-2TFXb7MH.js → swimlanes-N4OXWK64-BaSkTx2s.js} +1 -1
  104. package/dist/assets/swimlanesDiagram-K3J5GTZL-D67LlSLv.js +8 -0
  105. package/dist/assets/{team-share-C9qIusMs.js → team-share-BgI5VFVf.js} +1 -1
  106. package/dist/assets/{timeline-definition-YOQAKGHF-4zjxAMyG.js → timeline-definition-YOQAKGHF-Np9aXu8d.js} +1 -1
  107. package/dist/assets/{usecaseDiagram-VIAY4XPW-CCfZ1eoO.js → usecaseDiagram-VIAY4XPW-CaHpESyo.js} +1 -1
  108. package/dist/assets/{vennDiagram-BLWOH2XV-h7rTFRTN.js → vennDiagram-BLWOH2XV-BpnM9QrV.js} +1 -1
  109. package/dist/assets/vi-B8BbvT0G.js +15 -0
  110. package/dist/assets/{wardleyDiagram-YMQ3BMBF-CXwA22zv.js → wardleyDiagram-YMQ3BMBF-Cb0psm8G.js} +1 -1
  111. package/dist/assets/{xychartDiagram-TAQBALBS-d4qol5BJ.js → xychartDiagram-TAQBALBS-Bi_SjN1M.js} +1 -1
  112. package/dist/index.html +3 -3
  113. package/dist/rail.html +5 -5
  114. package/dist-server/container-mcp.js +22 -21
  115. package/dist-server/index.js +529 -523
  116. package/dist-server/openmausbot.js +46 -46
  117. package/dist-server/package.json +1 -1
  118. package/dist-server/pair-cli.js +46 -46
  119. package/dist-server/server/config.js +6 -1
  120. package/dist-server/server/container-computer.js +4 -4
  121. package/dist-server/server/host/team-connections-host.js +2 -2
  122. package/dist-server/server/index.js +21 -4
  123. package/dist-server/server/limix-skill-folder.js +72 -0
  124. package/dist-server/server/mcp-registry.js +2 -2
  125. package/dist-server/server/routes/bot-skills.js +2 -1
  126. package/dist-server/server/service-unit.js +1 -1
  127. package/dist-server/server/skill-library.js +1 -1
  128. package/dist-server/server/team-library.js +2 -2
  129. package/dist-server/shared/grok-import.js +1 -1
  130. package/dist-server/shared/package-format.js +3 -3
  131. package/dist-server/vps-container-mcp.js +22 -21
  132. package/dist-server/workspace-backup.worker.js +20 -20
  133. package/package.json +1 -1
  134. package/dist/assets/BotSettingsDialog-BVTAiGvS.js +0 -16
  135. package/dist/assets/NewBotDialog-D9e-ED-j.js +0 -1
  136. package/dist/assets/TeamLibraryPanel-B-R6YFK-.js +0 -1
  137. package/dist/assets/channel-DRGNbeY-.js +0 -1
  138. package/dist/assets/styles-D-yh7Z23.css +0 -1
  139. package/dist/assets/swimlanesDiagram-K3J5GTZL-C_836Lnu.js +0 -8
  140. package/dist/assets/vi-KgT8L8Qj.js +0 -15
@@ -1881,29 +1881,29 @@ init_mcp_registry();init_connection();init_schema();init_config();init_live_conf
1881
1881
  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(value=>value===""||isValidSshAlias(value),{message:"must be a simple SSH config alias"}).optional()}),roomConfigSchema=external_exports.object({turnTimeoutMinutes:external_exports.number().int().min(MIN_ROOM_TURN_TIMEOUT_MINUTES).max(MAX_ROOM_TURN_TIMEOUT_MINUTES)}),mcpConfigSchema=
1882
1882
  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(id=>id!=="guest","guest is reserved"),name:external_exports.string().trim().min(1).max(40),browser:external_exports.literal("chrome").optional()}).strict(),legacyBrowserProfileSchema=external_exports.object({id:external_exports.
1883
1883
  string().regex(LEGACY_BROWSER_PROFILE_ID).refine(id=>id!=="guest","guest is reserved"),name:external_exports.string().trim().min(1).max(40),partitionId:external_exports.string().regex(LEGACY_BROWSER_PROFILE_ID).refine(id=>id!=="guest","guest is reserved").optional(),browser:external_exports.literal("chrome").optional()}).strict();legacyBrowserProfilesSchema=external_exports.array(legacyBrowserProfileSchema).max(20),storedBrowserProfilesSchema=legacyBrowserProfilesSchema.transform(profiles=>migrateStoredBrowserProfiles(
1884
- profiles).profiles),browserProfilesSchema=external_exports.array(browserProfileSchema).max(20).superRefine((profiles,ctx)=>{let seen=new Set;profiles.forEach((profile,index2)=>{if(!seen.has(profile.id)){seen.add(profile.id);return}ctx.addIssue({code:"custom",path:[index2,"id"],message:`browser profile id ${profile.id} is duplicated`})})}),featureConfigSchema=external_exports.object({skillAuthoring:external_exports.boolean().optional(),skillReview:external_exports.boolean().optional(),skillReviewSteps:external_exports.
1885
- 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().optional(),smartSetupChoices:external_exports.boolean().optional(),autoRecall:external_exports.boolean().optional(),skillsLibrary:external_exports.boolean().
1886
- 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().optional()}),onboardingConfigSchema=external_exports.object({completedAt:external_exports.string().trim().max(40).optional(),version:external_exports.
1887
- 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),displayName:optionalText2,accentColor:optionalText2,icon:external_exports.discriminatedUnion("kind",[external_exports.object({kind:external_exports.
1888
- 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.string()).optional(),enabled:external_exports.boolean().optional(),hidden:external_exports.boolean().optional(),access:external_exports.
1889
- 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.enum(EFFORT_LEVELS).optional(),variant:external_exports.string().refine(isModelVariant,"invalid model variant").optional()}).
1890
- refine(selection=>selection.variant===void 0||selection.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 enabling automatic recovery",path:["backup"]}),cacheKeepWarmSchema=external_exports.object({enabled:external_exports.boolean(),windowMinutes:external_exports.
1891
- 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.number().int().min(1).max(3650).optional()}).strict(),newBotsConfigSchema=external_exports.object({effort:external_exports.enum(EFFORT_LEVELS).optional()}).
1892
- 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.shape.eventLogRetentionDays.nullable()}),appConfigSchema=external_exports.object({customDomain:external_exports.string().optional(),signIn:external_exports.
1893
- 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(),newBotDefaults:newBotDefaultsSchema.optional(),newBots:newBotsConfigSchema.optional(),cliStartup:external_exports.object({access:external_exports.enum(
1894
- ["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(),postiz:external_exports.object({key:optionalText2,url:optionalText2}).optional(),groq:external_exports.object({key:optionalText2,url:optionalText2}).
1895
- 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}).optional(),anthropic:external_exports.object({key:optionalText2,url:optionalText2,everyClaudeBot:external_exports.boolean().optional()}).optional(),
1896
- 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.string().regex(/^[A-Z]{3}$/).optional(),prices:external_exports.record(external_exports.string().min(1).max(160),external_exports.
1897
- 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.object({apiKey:optionalText2,userId:optionalText2,sessionId:optionalText2}).optional(),box:external_exports.object({token:optionalText2}).
1898
- 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(["elevenlabs","fish","system","chatterbox","xai","gemini","openai"]).optional(),baseUrl:external_exports.string().trim().max(2048).refine(value=>!value||
1899
- /^https?:\/\//i.test(value),"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.optional(),everyBotRules:external_exports.string().max(24e3).optional(),profile:external_exports.object({name:optionalText2,email:optionalText2,aboutMe:external_exports.
1900
- 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.number().positive().max(1e7).optional(),autoCompact:external_exports.boolean().optional()}).extend(roomContextSettings).extend(replaySettings).optional(),
1901
- 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().optional(),decisions:external_exports.object({retentionDays:external_exports.number().int().min(1).max(3650).optional()}).strict().optional(),loopGuard:loopGuardConfigSchema.
1902
- 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.optional(),instances:instanceConfigMapSchema.optional(),mcpServers:external_exports.record(external_exports.string(),external_exports.unknown()).optional()}),storedAppConfigSchema=
1903
- 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(keys=>Object.fromEntries(Object.entries(keys).filter(entry=>typeof entry[1]=="string"))).optional()}).optional()}),appConfigPatchSchema=appConfigSchema.omit({instances:!0,mcpServers:!0,cliStartup:!0,customDomain:!0}).extend({threads:threadsPatchSchema.
1904
- optional(),newBots:newBotsPatchSchema.optional(),imageGen:imageGenPatchSchema.optional()}),jsonObjectSchema2=external_exports.record(external_exports.string(),external_exports.json());DEFAULT_CAPTURE_QUIET_MS=2*6e4,DATA_DIR=process.env.OMB_DATA_DIR||join16(dataHome(),".limixbot"),LEGACY_DATA_DIR=join16(dataHome(),".opengrokbot"),EVENTS_DIR=join16(DATA_DIR,"events"),NATIVE_DIR=join16(DATA_DIR,"native"),lastIgnoredConfigWarning="",storedConfig=settledFileCache(()=>join16(DATA_DIR,"config.json"),()=>parseStoredConfig(
1905
- parseJson(readFileSync9(join16(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=/^[\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=(a2,b3)=>a2.trim().replace(/\/+$/u,"")===b3.trim().replace(
1906
- /\/+$/u,"")}});function agentBrowserReleaseUrl(asset){return asset.url??`https://github.com/vercel-labs/agent-browser/releases/download/v${AGENT_BROWSER_VERSION}/${asset.asset}`}function agentBrowserReleaseVersion(asset){return asset?.version??AGENT_BROWSER_VERSION}function linuxFamilyKey(platform,arch2,musl){return platform==="android"?`linux-musl-${arch2}`:platform==="linux"&&musl?`linux-musl-${arch2}`:`${platform}-${arch2}`}function resolveAgentBrowserReleaseAsset(platform=process.platform,arch2=process.arch,musl=!1){
1884
+ profiles).profiles),browserProfilesSchema=external_exports.array(browserProfileSchema).max(20).superRefine((profiles,ctx)=>{let seen=new Set;profiles.forEach((profile,index2)=>{if(!seen.has(profile.id)){seen.add(profile.id);return}ctx.addIssue({code:"custom",path:[index2,"id"],message:`browser profile id ${profile.id} is duplicated`})})}),featureConfigSchema=external_exports.object({skillAuthoring:external_exports.boolean().optional(),skillReview:external_exports.boolean().optional(),skillAutoApply:external_exports.
1885
+ 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().optional(),smartSetupChoices:external_exports.boolean().optional(),autoRecall:external_exports.boolean().
1886
+ 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().optional()}),onboardingConfigSchema=external_exports.object({completedAt:external_exports.string().
1887
+ 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),displayName:optionalText2,accentColor:optionalText2,icon:external_exports.discriminatedUnion("kin\
1888
+ d",[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.string()).optional(),enabled:external_exports.boolean().optional(),hidden:external_exports.
1889
+ 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.enum(EFFORT_LEVELS).optional(),variant:external_exports.string().refine(isModelVariant,
1890
+ "invalid model variant").optional()}).refine(selection=>selection.variant===void 0||selection.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 enabling automatic recovery",path:["backup"]}),cacheKeepWarmSchema=external_exports.object({enabled:external_exports.
1891
+ 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.number().int().min(1).max(3650).optional()}).strict(),newBotsConfigSchema=external_exports.object({effort:external_exports.
1892
+ 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.shape.eventLogRetentionDays.nullable()}),appConfigSchema=external_exports.object({customDomain:external_exports.string().
1893
+ 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(),newBotDefaults:newBotDefaultsSchema.optional(),newBots:newBotsConfigSchema.optional(),cliStartup:external_exports.
1894
+ 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(),postiz:external_exports.object({key:optionalText2,url:optionalText2}).optional(),groq:external_exports.object(
1895
+ {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}).optional(),anthropic:external_exports.object({key:optionalText2,url:optionalText2,everyClaudeBot:external_exports.
1896
+ 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.string().regex(/^[A-Z]{3}$/).optional(),prices:external_exports.record(external_exports.string().
1897
+ 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.object({apiKey:optionalText2,userId:optionalText2,sessionId:optionalText2}).optional(),
1898
+ 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(["elevenlabs","fish","system","chatterbox","xai","gemini","openai"]).optional(),baseUrl:external_exports.
1899
+ string().trim().max(2048).refine(value=>!value||/^https?:\/\//i.test(value),"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.optional(),everyBotRules:external_exports.string().max(24e3).optional(),profile:external_exports.object(
1900
+ {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.number().positive().max(1e7).optional(),autoCompact:external_exports.boolean().optional()}).
1901
+ 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().optional(),decisions:external_exports.object({retentionDays:external_exports.number().
1902
+ 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.optional(),instances:instanceConfigMapSchema.optional(),mcpServers:external_exports.
1903
+ 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(keys=>Object.fromEntries(Object.entries(keys).filter(entry=>typeof entry[1]=="string"))).optional()}).optional()}),appConfigPatchSchema=
1904
+ 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_CAPTURE_QUIET_MS=2*6e4,DATA_DIR=process.env.OMB_DATA_DIR||join16(dataHome(),".limixbot"),LEGACY_DATA_DIR=join16(dataHome(),".opengrokbot"),EVENTS_DIR=join16(DATA_DIR,"events"),NATIVE_DIR=join16(
1905
+ DATA_DIR,"native"),lastIgnoredConfigWarning="",storedConfig=settledFileCache(()=>join16(DATA_DIR,"config.json"),()=>parseStoredConfig(parseJson(readFileSync9(join16(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=/^[\x21-\x7e]{1,4096}$/;configSaveListeners=new Set;CLAUDE_ROUTING_ENV=["ANTHROPIC_BASE_URL","ANTHROPIC_AUTH_TOKEN","ANTHROPIC_API_KEY","ANTHROPIC_CUSTOM_HEADERS","CLA\
1906
+ UDE_CODE_USE_BEDROCK","CLAUDE_CODE_USE_VERTEX","CLAUDE_CODE_USE_FOUNDRY"];sameUrl=(a2,b3)=>a2.trim().replace(/\/+$/u,"")===b3.trim().replace(/\/+$/u,"")}});function agentBrowserReleaseUrl(asset){return asset.url??`https://github.com/vercel-labs/agent-browser/releases/download/v${AGENT_BROWSER_VERSION}/${asset.asset}`}function agentBrowserReleaseVersion(asset){return asset?.version??AGENT_BROWSER_VERSION}function linuxFamilyKey(platform,arch2,musl){return platform==="android"?`linux-musl-${arch2}`:platform==="linux"&&musl?`linux-musl-${arch2}`:`${platform}-${arch2}`}function resolveAgentBrowserReleaseAsset(platform=process.platform,arch2=process.arch,musl=!1){
1907
1907
  return RELEASES.get(linuxFamilyKey(platform,arch2,musl))??null}var AGENT_BROWSER_VERSION,RELEASES,init_browser_engine_release=__esm({"server/browser-engine-release.ts"(){"use strict";AGENT_BROWSER_VERSION="0.37.0",RELEASES=new Map([["darwin-arm64",{target:"darwin-arm64",asset:"agent-browser-darwin-arm64",sha256:"da5a2b4ef7be8ba279b1258c542c33877f480b1951d0d94de607fc1528edd380",bytes:12429360}],["darwin-x64",{target:"darwin-x64",asset:"agent-browser-darwin-x64",sha256:"f402c96350ffd2adc68d0e5e4d8\
1908
1908
  3aa49cf7735fef29882a8866be36cc2fc67e9",bytes:13588296}],["linux-arm64",{target:"linux-arm64",asset:"agent-browser-linux-arm64",sha256:"0315a8c4f7bf167cc5fd5eeaea79009b0e6b5d2ae8b3057bf6f96be978483426",bytes:12507840}],["linux-musl-arm64",{target:"linux-musl-arm64",asset:"agent-browser-linux-musl-arm64",sha256:"db67c0e84e0668c052c2cbdca325c57f896e309c3723755dcdd65b700f8a2b52",bytes:12369352}],["linux-musl-x64",{target:"linux-musl-x64",asset:"agent-browser-linux-musl-x64",sha256:"5cff3bc7b2486867a\
1909
1909
  ba2901f92c9ce6029bd2a37951630d9feec1c5b3fee402e",bytes:14092888}],["linux-x64",{target:"linux-x64",asset:"agent-browser-linux-x64",sha256:"78e0c5a14a7fa1f3d1ae2acdbdcc94a047b435b998a8c505fcc49d7fa4935a49",bytes:14253776}],["win32-x64",{target:"win32-x64",version:"0.36.0-omb.1",asset:"agent-browser-win32-x64-0.36.0-omb.1.exe",url:"https://github.com/milind-soni/OpenMausBot/releases/download/browser-engine-v0.36.0-omb.1/agent-browser-win32-x64-0.36.0-omb.1.exe",sha256:"33bee834f6a6072ec8688b091472\
@@ -8620,8 +8620,8 @@ child=null,removeTokenFile(tokenFile);let terminated=existing?terminateChild(exi
8620
8620
  ected. Try again to recover it.",endpoint_busy:"The secure connection is still being prepared. Try again in a moment.",endpoint_rate_limited:"The secure connection service is busy right now. Local Wi-Fi and Tailscale pairing still work; try again in {wait}.",update_required:"This version of Limix Bot can no longer make secure links. Update Limix Bot, then try again. Local Wi-Fi and Tailscale pairing still work.",endpoint_capacity:"Secure HTTPS links are temporarily full. Try again in {wait}, or \
8621
8621
  pair on this Wi-Fi or with Tailscale.",endpoint_unavailable:"The secure connection service could not finish setup. Local Wi-Fi and Tailscale pairing still work. If this keeps happening, contact support with the error reference.",endpoint_cleanup_pending:"The secure connection is still being removed. Try signing out again shortly.",control_plane_unavailable:"Secure access is not available right now. Local pairing still works.",internal_error:"The secure connection service had a problem. Local pai\
8622
8622
  ring still works; try again.",invalid_response:"The secure connection service returned an unexpected response. Try again.",request_failed:"The secure connection request could not be completed. Local pairing still works; try again."});function retryWait(retryAfterMs){let seconds=Math.ceil((retryAfterMs??0)/1e3);return seconds>0?seconds<90?`${seconds} seconds`:`${Math.round(seconds/60)} minutes`:"a few minutes"}function friendlyCompanionAccountError(error62){let code=error62 instanceof ControlPlaneError?
8623
- error62.code:"",message5=(FRIENDLY_MESSAGES[code]??FRIENDLY_MESSAGES.request_failed).replace("{wait}",()=>retryWait(error62.retryAfterMs)),reference=error62 instanceof ControlPlaneError&&error62.requestId?` Reference: ${error62.requestId}.`:"";return`${message5}${reference}`}var DEFAULT_COMPANION_CONTROL_PLANE_URL="https://accounts.openmausbot.com",COMPANION_CLIENT_INSTANCE_FIELD="companionClientInstanceId",COMPANION_ACCOUNT_TOKEN_FIELD="companionAccountToken",COMPANION_ACCOUNT_USER_ID_FIELD="companionAccountUserId",COMPANION_ACCOUNT_EMAIL_FIELD="companionAccountEmail",COMPANION_INSTALLATION_ID_FIELD="companionInstallationId",COMPANION_INSTALLATION_CREDENTIAL_FIELD="companionInstallationCredential",COMPANION_INSTALLATION_EXPIRY_FIELD="companionInstallationCredential\
8624
- ExpiresAt",COMPANION_ACCOUNT_CLEANUP_PENDING_FIELD="companionAccountCleanupPending",COMPANION_ENDPOINT_RELEASE_PENDING_FIELD="companionEndpointReleasePending",COMPANION_ENDPOINT_PAUSED_FIELD="companionEndpointPaused",COMPANION_TUNNEL_RETIRED_FIELD="companionTunnelRetired",COMPANION_TUNNEL_WAITING_FIELD="companionTunnelWaiting",UUID=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,INSTALLATION_ID2=UUID,INSTALLATION_CREDENTIAL2=/^omb_install_[A-Za-z0-9_-]{22}\.[A-Za-z0-9_-]{43}$/,
8623
+ error62.code:"",message5=(FRIENDLY_MESSAGES[code]??FRIENDLY_MESSAGES.request_failed).replace("{wait}",()=>retryWait(error62.retryAfterMs)),reference=error62 instanceof ControlPlaneError&&error62.requestId?` Reference: ${error62.requestId}.`:"";return`${message5}${reference}`}var DEFAULT_COMPANION_CONTROL_PLANE_URL="https://accounts.limixmedia.com",COMPANION_CLIENT_INSTANCE_FIELD="companionClientInstanceId",COMPANION_ACCOUNT_TOKEN_FIELD="companionAccountToken",COMPANION_ACCOUNT_USER_ID_FIELD="companionAccountUserId",COMPANION_ACCOUNT_EMAIL_FIELD="companionAccountEmail",COMPANION_INSTALLATION_ID_FIELD="companionInstallationId",COMPANION_INSTALLATION_CREDENTIAL_FIELD="companionInstallationCredential",COMPANION_INSTALLATION_EXPIRY_FIELD="companionInstallationCredentialE\
8624
+ xpiresAt",COMPANION_ACCOUNT_CLEANUP_PENDING_FIELD="companionAccountCleanupPending",COMPANION_ENDPOINT_RELEASE_PENDING_FIELD="companionEndpointReleasePending",COMPANION_ENDPOINT_PAUSED_FIELD="companionEndpointPaused",COMPANION_TUNNEL_RETIRED_FIELD="companionTunnelRetired",COMPANION_TUNNEL_WAITING_FIELD="companionTunnelWaiting",UUID=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,INSTALLATION_ID2=UUID,INSTALLATION_CREDENTIAL2=/^omb_install_[A-Za-z0-9_-]{22}\.[A-Za-z0-9_-]{43}$/,
8625
8625
  DEFAULT_HEALTH_CACHE_MS=3e4,DEFAULT_AUTO_RETRY_BASE_MS=10*6e4,DEFAULT_AUTO_RETRY_MAX_MS=360*6e4,DEFAULT_ENDPOINT_CHECK_INTERVAL_MS=15*6e4,DEFAULT_FIRST_ENDPOINT_CHECK_MS=2*6e4,DEFAULT_RELEASE_GRACE_MS=60*6e4,DEFAULT_RELEASE_JITTER_MS=180*6e4,REQUEST_WINDOW_MS=60*6e4,AUTO_RETRY_CODES=new Set(["endpoint_capacity","endpoint_rate_limited","endpoint_unavailable","endpoint_busy","network_unavailable","control_plane_unavailable","internal_error","rate_limited","credential_rotation_rate_limited"]),ENDPOINT_NEEDS_RECONCILE=new Set(
8626
8626
  ["deleting","deleted","error"]),WATCHDOG_CHECK_STATES=new Set(["starting","ready","retrying","error"]),CONNECTOR_FAILING_STATES=new Set(["retrying","error"]),defaultSetTimer=(callback,milliseconds)=>{let timer2=setTimeout(callback,milliseconds);return timer2.unref?.(),timer2},ownString=(document3,field)=>typeof document3?.[field]=="string"?document3[field]:"";function resolveCompanionControlPlaneURL({isPackaged,environment=process.env}={}){return Object.hasOwn(environment,"OMB_CONTROL_PLANE_URL")?
8627
8627
  normalizeControlPlaneURL(environment.OMB_CONTROL_PLANE_URL):isPackaged?DEFAULT_COMPANION_CONTROL_PLANE_URL:""}function companionAccountCleanupPending(credentials){return credentials?.[COMPANION_ACCOUNT_CLEANUP_PENDING_FIELD]===!0}var companionTunnelRetired=credentials=>!!storedAccount(credentials)&&!managedCompanionTunnelAccess(credentials)&&credentials?.[COMPANION_TUNNEL_RETIRED_FIELD]===!0;function storedAccount(credentials){let email3=normalizeAccountEmail(ownString(credentials,COMPANION_ACCOUNT_EMAIL_FIELD)),
@@ -8651,26 +8651,26 @@ credential)&&await client.revokeInstallation(accountToken,installation.installat
8651
8651
  ...document3};return relayOnly==="retired"?next[COMPANION_TUNNEL_RETIRED_FIELD]=!0:delete next[COMPANION_TUNNEL_RETIRED_FIELD],relayOnly==="retired"||relayOnly==="full"?next[COMPANION_TUNNEL_WAITING_FIELD]=!0:delete next[COMPANION_TUNNEL_WAITING_FIELD],next}),withoutTunnel();try{await updateCredentials(document3=>withProvisionedAccount(document3,{accountToken,user,installation,provision:endpoint}))}catch(error62){throw await client.deleteEndpoint(installation.credential).catch(()=>{}),await client.
8652
8652
  revokeInstallation(accountToken,installation.installation.id).catch(()=>{}),error62}resetAutoRetry();let connection=await activatePersistedEndpoint();return phase=null,companionIsOn()&&connection&&["unavailable","error"].includes(connection.status)&&(phase={status:"error",email:user.email,endpoint:endpoint.endpoint.url,message:"The address is ready, but this app could not start its secure connection. Local pairing still works."}),settledState()},writeLog=line3=>{try{log2(line3)}catch{}},failAction=(error62,{
8653
8653
  email:email3,expiredSessionIsSignedOut=!1,signedOut=!1}={})=>{let message5=friendlyCompanionAccountError(error62);return writeLog(error62 instanceof ControlPlaneError?`companion account: setup failed code=${error62.code} status=${error62.status||"none"} ref=${error62.requestId||"none"}`:"companion account: setup failed on this computer (not a control-plane answer)"),phase={status:signedOut||expiredSessionIsSignedOut&&error62 instanceof ControlPlaneError&&error62.status===401?"signed-out":"error",
8654
- email:email3,message:message5},message5},requestCode=rawEmail=>serialize(async()=>{if(!configured)throw new Error(FRIENDLY_MESSAGES.control_plane_unavailable);let email3=normalizeAccountEmail(rawEmail),requested;try{await requireHealthyControlPlane(),requested=await client.requestOTP(email3)}catch(error62){let message5=failAction(error62,{email:email3,signedOut:!0});throw new Error(message5)}return phase={status:"signed-out",email:requested.email},settledState()}),verifyCode=(rawEmail,rawCode)=>serialize(
8655
- async()=>{if(!configured)throw new Error(FRIENDLY_MESSAGES.control_plane_unavailable);requestedAt=now();let email3=normalizeAccountEmail(rawEmail);phase={status:"connecting",email:email3};let verified;try{await requireHealthyControlPlane(),verified=await client.verifyOTP(email3,rawCode)}catch(error62){let message5=failAction(error62,{email:email3,signedOut:!0});throw new Error(message5)}let previous2=storedAccount(credentials()),refreshingPendingCleanup=!!(previous2&&previous2.userId===verified.
8656
- user.id&&companionAccountCleanupPending(credentials())),authenticatedPersisted=!1;try{previous2&&previous2.userId!==verified.user.id&&await cleanupCurrentAccount();let existingIdentity=ownString(credentials(),COMPANION_CLIENT_INSTANCE_FIELD),clientInstanceId=UUID.test(existingIdentity)?existingIdentity:newClientInstanceId?.();if(!UUID.test(clientInstanceId??""))throw new Error("A stable computer identity could not be created");return await updateCredentials(document3=>withAuthenticatedAccount(document3,
8657
- {...verified,clientInstanceId,preserveCleanupPending:refreshingPendingCleanup})),authenticatedPersisted=!0,refreshingPendingCleanup?(await cleanupCurrentAccount({markPending:!1}),settledState()):await provision(verified)}catch(error62){return authenticatedPersisted||await client.signOut(verified.accountToken).catch(()=>{}),failAction(error62,{email:authenticatedPersisted?verified.user.email:previous2?.email??email3,expiredSessionIsSignedOut:authenticatedPersisted}),authenticatedPersisted&&scheduleAutoRetry(
8658
- error62),settledState()}}),retryWork=async()=>{if(!configured)return settledState();let account2=storedAccount(credentials());if(!account2)return phase=null,settledState();if(companionAccountCleanupPending(credentials())){phase={status:"connecting",email:account2.email};try{await requireHealthyControlPlane(),await cleanupCurrentAccount({markPending:!1})}catch(error62){failAction(error62,{email:account2.email,expiredSessionIsSignedOut:!0})}return settledState()}phase={status:"connecting",email:account2.
8659
- email};try{return await requireHealthyControlPlane(),await provision({accountToken:account2.accountToken,user:{id:account2.userId,email:account2.email}})}catch(error62){return failAction(error62,{email:account2.email,expiredSessionIsSignedOut:!0}),scheduleAutoRetry(error62),settledState()}},retry=()=>serialize(async()=>(requestedAt=now(),retryWork())),reconcileIfEndpointGone=async({onGone=retryWork}={})=>{let document3=credentials(),account2=storedAccount(document3),access2=managedCompanionTunnelAccess(
8660
- document3);if(!account2||!access2||!account2.installationCredential||companionAccountCleanupPending(document3)||typeof client.getEndpoint!="function")return null;lastEndpointCheck=now();let endpoint;try{endpoint=await client.getEndpoint(account2.installationCredential)}catch(error62){return error62 instanceof ControlPlaneError&&error62.status===401?onGone():null}return endpoint&&endpoint.url===access2.endpoint&&!ENDPOINT_NEEDS_RECONCILE.has(endpoint.status)?null:onGone()},endpointCheckDue=()=>lastEndpointCheck===
8661
- null||now()-lastEndpointCheck>=endpointCheckIntervalMs/2,recoveryDue=({atLaunch=!1}={})=>{if(!autoRecover||!companionIsOn())return!1;if(atLaunch)return!0;if(autoRetryTimer!==null)return!1;let connection=managedConnectionState?.()??{};return WATCHDOG_CHECK_STATES.has(connection.status)&&endpointCheckDue()},requestedRecently=()=>requestedAt!==null&&now()-requestedAt<REQUEST_WINDOW_MS,savedAddress=document3=>normalizeManagedCompanionEndpoint(document3[MANAGED_COMPANION_ENDPOINT_FIELD]),phonesUnused=!1,
8662
- currentNeed=async()=>{let answer=await Promise.resolve().then(()=>managedEndpointNeeded()).catch(()=>null);phonesUnused=answer===MANAGED_ENDPOINT_PHONES_UNUSED;let need=phonesUnused?!1:typeof answer=="boolean"?answer:null;return need===!1&&relay.capable()?!1:requestedRecently()?(phonesUnused=!1,!0):need},releaseScheduledAt=()=>{let at2=credentials()[MANAGED_COMPANION_RELEASE_AT_FIELD];return Number.isSafeInteger(at2)&&at2>0?at2:null},cancelRelease=async()=>{releaseScheduledAt()!==null&&await updateCredentials(
8663
- document3=>{let next={...document3};return delete next[MANAGED_COMPANION_RELEASE_AT_FIELD],next})},releaseAddress=async()=>{let need=await currentNeed(),pause2=phonesUnused;if(need!==!1)return need&&await cancelRelease(),settledState();let document3=credentials(),account2=storedAccount(document3);if(!account2?.installationCredential||!managedCompanionTunnelAccess(document3)||companionAccountCleanupPending(document3))return settledState();await stopManagedEndpoint();let removalPending=!1;try{await client.
8664
- deleteEndpoint(account2.installationCredential)}catch(error62){if(removalPending=error62 instanceof ControlPlaneError&&error62.code==="endpoint_cleanup_pending",!(removalPending||error62 instanceof ControlPlaneError&&error62.status===401))return writeLog(error62 instanceof ControlPlaneError?`companion account: could not give the secure address back code=${error62.code} status=${error62.status||"none"} ref=${error62.requestId||"none"}`:"companion account: could not give the secure address back (n\
8665
- ot a control-plane answer)"),await activatePersistedEndpoint(),settledState()}return await updateCredentials(current=>({...withoutManagedCompanionTunnelAccess(current),...removalPending?{[COMPANION_ENDPOINT_RELEASE_PENDING_FIELD]:!0}:{},...pause2?{[COMPANION_ENDPOINT_PAUSED_FIELD]:!0}:{}})),resetAutoRetry(),phase=null,writeLog(pause2?"companion account: gave the secure address back; no paired phone was used in 30 days":"companion account: gave the secure address back; no device needs it"),settledState()},
8666
- reviewAddress=async({atLaunch=!1}={})=>{let document3=credentials();if(!storedAccount(document3)||companionAccountCleanupPending(document3))return null;if(!managedCompanionTunnelAccess(document3)){let waiting2=document3[COMPANION_TUNNEL_WAITING_FIELD]===!0;return!savedAddress(document3)&&!waiting2||autoRetryTimer!==null?null:await currentNeed()===!0?retryWork():null}let need=await currentNeed();if(need!==!1)return need&&await cancelRelease(),need===null&&atLaunch?null:recoveryDue({atLaunch})?reconcileIfEndpointGone():
8667
- null;let releaseAt=releaseScheduledAt();if(releaseAt!==null&&now()>=releaseAt)return releaseAddress();let connection=managedConnectionState?.()??{};if(companionIsOn()&&CONNECTOR_FAILING_STATES.has(connection.status)&&(atLaunch||endpointCheckDue())){let released=await reconcileIfEndpointGone({onGone:releaseAddress});if(released)return released}if(releaseAt===null||releaseAt-now()>releaseGraceMs+releaseJitterMs){let delay3=releaseGraceMs+Math.round(random()*releaseJitterMs);await updateCredentials(
8668
- current=>managedCompanionTunnelAccess(current)?{...current,[MANAGED_COMPANION_RELEASE_AT_FIELD]:now()+delay3}:current),writeLog(`companion account: no device needs the secure address; giving it back in ${Math.round(delay3/6e4)} min`)}return null},retryIfWanted=async()=>requestedRecently()||savedAddress(credentials())&&await currentNeed()!==!1?retryWork():(resetAutoRetry(),phase?.status==="error"&&(phase=null),writeLog("companion account: stopped retrying; no device needs a secure address"),settledState());
8669
- retryFromTimer=()=>serialize(onDemand?retryIfWanted:retryWork);let prepare=()=>serialize(async()=>{let document3=credentials();if(!configured||!companionIsOn()||!storedAccount(document3)||companionAccountCleanupPending(document3))return settledState();if(requestedAt=now(),!managedCompanionTunnelAccess(document3))return retryWork();await cancelRelease();let connection=managedConnectionState?.()??{};if(["stopped","unconfigured"].includes(connection.status))await activatePersistedEndpoint();else if(CONNECTOR_FAILING_STATES.
8670
- has(connection.status)){let repaired=await reconcileIfEndpointGone();if(repaired)return repaired}return settledState()}),watchdogTick=()=>{if(watchdogTimer=null,!disposed&&(watchdogTimer=setTimer(watchdogTick,endpointCheckIntervalMs),phase?.status!=="signed-out")){if(onDemand){serialize(()=>reviewAddress()).catch(()=>{});return}recoveryDue()&&serialize(()=>reconcileIfEndpointGone()).catch(()=>{})}},startWatchdog=()=>{!(autoRecover||onDemand)||disposed||!configured||watchdogTimer!==null||(watchdogTimer=
8671
- setTimer(watchdogTick,firstEndpointCheckMs))};return Object.freeze({state:async()=>(await probeControlPlane(),settledState()),requestCode,verifyCode,retry,prepare,signOut:()=>serialize(async()=>{if(resetAutoRetry(),!storedAccount(credentials()))return await clearAfterCleanup(),settledState();let email3=storedAccount(credentials())?.email;phase={status:"connecting",email:email3};try{return await cleanupCurrentAccount(),healthy=!0,lastHealthCheck=now(),settledState()}catch(error62){return failAction(
8672
- error62,{email:email3}),settledState()}}),restore:()=>serialize(async()=>{if(!configured||(startWatchdog(),!await probeControlPlane({force:!0})))return settledState();if(companionAccountCleanupPending(credentials()))return retryWork();if(await ensureClientIdentity(),onDemand){let reviewed=await reviewAddress({atLaunch:!0});return reviewed||(phase=null,settledState())}let account2=storedAccount(credentials());if(account2&&!managedCompanionTunnelAccess(credentials()))return retryWork();if(autoRecover&&
8673
- account2&&companionIsOn()){let reconciled=await reconcileIfEndpointGone();if(reconciled)return reconciled}return phase=null,settledState()}),dispose:()=>{disposed=!0,cancelAutoRetry(),watchdogTimer!==null&&clearTimer(watchdogTimer),watchdogTimer=null}})}var SIGNIN_CODE_TTL_MS=10*6e4;init_user_errors();function parseAllowList(value){return(value??"").split(/[,\s]+/).map(entry=>entry.trim().toLowerCase()).filter(Boolean)}var NOT_WELCOME={ok:!1,status:403,...userError("serverError.email.notAllowed")};init_decision_log();init_redact2();init_usage_ledger();import{appendFile as appendFile2,mkdir as mkdir2}from"node:fs/promises";import{basename as basename2,join as join2}from"node:path";var DIR2="admin-activity";var PRUNE_EVERY_MS2=60*6e4,writeQueues2=new Map,lastPrune2=new Map;function adminActivityFileFor(dataDir,at2){return join2(dataDir,DIR2,`${monthKey(at2)}.ndjson`)}async function writeRow(dataDir,row){let at2=new Date(row.at);await mkdir2(join2(dataDir,DIR2),{recursive:!0,mode:448}),await appendFile2(adminActivityFileFor(dataDir,at2),JSON.stringify(row)+`
8654
+ email:email3,message:message5},message5},requestCode=rawEmail=>serialize(async()=>{if(!configured)throw new Error(FRIENDLY_MESSAGES.control_plane_unavailable);let email3=normalizeAccountEmail(rawEmail),requested;try{await requireHealthyControlPlane(),requested=await client.requestOTP(email3)}catch(error62){let message5=failAction(error62,{email:email3,signedOut:!0});throw new Error(message5)}return phase={status:"signed-out",email:requested.email},settledState()}),signInFlow=(rawEmail,obtain)=>serialize(
8655
+ async()=>{if(!configured)throw new Error(FRIENDLY_MESSAGES.control_plane_unavailable);requestedAt=now();let email3=normalizeAccountEmail(rawEmail);phase={status:"connecting",email:email3};let verified;try{await requireHealthyControlPlane(),verified=await obtain(email3)}catch(error62){let message5=failAction(error62,{email:email3,signedOut:!0});throw new Error(message5)}let previous2=storedAccount(credentials()),refreshingPendingCleanup=!!(previous2&&previous2.userId===verified.user.id&&companionAccountCleanupPending(
8656
+ credentials())),authenticatedPersisted=!1;try{previous2&&previous2.userId!==verified.user.id&&await cleanupCurrentAccount();let existingIdentity=ownString(credentials(),COMPANION_CLIENT_INSTANCE_FIELD),clientInstanceId=UUID.test(existingIdentity)?existingIdentity:newClientInstanceId?.();if(!UUID.test(clientInstanceId??""))throw new Error("A stable computer identity could not be created");return await updateCredentials(document3=>withAuthenticatedAccount(document3,{...verified,clientInstanceId,preserveCleanupPending:refreshingPendingCleanup})),
8657
+ authenticatedPersisted=!0,refreshingPendingCleanup?(await cleanupCurrentAccount({markPending:!1}),settledState()):await provision(verified)}catch(error62){return authenticatedPersisted||await client.signOut(verified.accountToken).catch(()=>{}),failAction(error62,{email:authenticatedPersisted?verified.user.email:previous2?.email??email3,expiredSessionIsSignedOut:authenticatedPersisted}),authenticatedPersisted&&scheduleAutoRetry(error62),settledState()}}),verifyCode=(rawEmail,rawCode)=>signInFlow(
8658
+ rawEmail,email3=>client.verifyOTP(email3,rawCode)),connectLimix=credential=>signInFlow(credential.email,async()=>({accountToken:credential.bearer,user:{id:credential.userId,email:credential.email}})),retryWork=async()=>{if(!configured)return settledState();let account2=storedAccount(credentials());if(!account2)return phase=null,settledState();if(companionAccountCleanupPending(credentials())){phase={status:"connecting",email:account2.email};try{await requireHealthyControlPlane(),await cleanupCurrentAccount(
8659
+ {markPending:!1})}catch(error62){failAction(error62,{email:account2.email,expiredSessionIsSignedOut:!0})}return settledState()}phase={status:"connecting",email:account2.email};try{return await requireHealthyControlPlane(),await provision({accountToken:account2.accountToken,user:{id:account2.userId,email:account2.email}})}catch(error62){return failAction(error62,{email:account2.email,expiredSessionIsSignedOut:!0}),scheduleAutoRetry(error62),settledState()}},retry=()=>serialize(async()=>(requestedAt=
8660
+ now(),retryWork())),reconcileIfEndpointGone=async({onGone=retryWork}={})=>{let document3=credentials(),account2=storedAccount(document3),access2=managedCompanionTunnelAccess(document3);if(!account2||!access2||!account2.installationCredential||companionAccountCleanupPending(document3)||typeof client.getEndpoint!="function")return null;lastEndpointCheck=now();let endpoint;try{endpoint=await client.getEndpoint(account2.installationCredential)}catch(error62){return error62 instanceof ControlPlaneError&&
8661
+ error62.status===401?onGone():null}return endpoint&&endpoint.url===access2.endpoint&&!ENDPOINT_NEEDS_RECONCILE.has(endpoint.status)?null:onGone()},endpointCheckDue=()=>lastEndpointCheck===null||now()-lastEndpointCheck>=endpointCheckIntervalMs/2,recoveryDue=({atLaunch=!1}={})=>{if(!autoRecover||!companionIsOn())return!1;if(atLaunch)return!0;if(autoRetryTimer!==null)return!1;let connection=managedConnectionState?.()??{};return WATCHDOG_CHECK_STATES.has(connection.status)&&endpointCheckDue()},requestedRecently=()=>requestedAt!==
8662
+ null&&now()-requestedAt<REQUEST_WINDOW_MS,savedAddress=document3=>normalizeManagedCompanionEndpoint(document3[MANAGED_COMPANION_ENDPOINT_FIELD]),phonesUnused=!1,currentNeed=async()=>{let answer=await Promise.resolve().then(()=>managedEndpointNeeded()).catch(()=>null);phonesUnused=answer===MANAGED_ENDPOINT_PHONES_UNUSED;let need=phonesUnused?!1:typeof answer=="boolean"?answer:null;return need===!1&&relay.capable()?!1:requestedRecently()?(phonesUnused=!1,!0):need},releaseScheduledAt=()=>{let at2=credentials()[MANAGED_COMPANION_RELEASE_AT_FIELD];
8663
+ return Number.isSafeInteger(at2)&&at2>0?at2:null},cancelRelease=async()=>{releaseScheduledAt()!==null&&await updateCredentials(document3=>{let next={...document3};return delete next[MANAGED_COMPANION_RELEASE_AT_FIELD],next})},releaseAddress=async()=>{let need=await currentNeed(),pause2=phonesUnused;if(need!==!1)return need&&await cancelRelease(),settledState();let document3=credentials(),account2=storedAccount(document3);if(!account2?.installationCredential||!managedCompanionTunnelAccess(document3)||
8664
+ companionAccountCleanupPending(document3))return settledState();await stopManagedEndpoint();let removalPending=!1;try{await client.deleteEndpoint(account2.installationCredential)}catch(error62){if(removalPending=error62 instanceof ControlPlaneError&&error62.code==="endpoint_cleanup_pending",!(removalPending||error62 instanceof ControlPlaneError&&error62.status===401))return writeLog(error62 instanceof ControlPlaneError?`companion account: could not give the secure address back code=${error62.code}\
8665
+ status=${error62.status||"none"} ref=${error62.requestId||"none"}`:"companion account: could not give the secure address back (not a control-plane answer)"),await activatePersistedEndpoint(),settledState()}return await updateCredentials(current=>({...withoutManagedCompanionTunnelAccess(current),...removalPending?{[COMPANION_ENDPOINT_RELEASE_PENDING_FIELD]:!0}:{},...pause2?{[COMPANION_ENDPOINT_PAUSED_FIELD]:!0}:{}})),resetAutoRetry(),phase=null,writeLog(pause2?"companion account: gave the secure\
8666
+ address back; no paired phone was used in 30 days":"companion account: gave the secure address back; no device needs it"),settledState()},reviewAddress=async({atLaunch=!1}={})=>{let document3=credentials();if(!storedAccount(document3)||companionAccountCleanupPending(document3))return null;if(!managedCompanionTunnelAccess(document3)){let waiting2=document3[COMPANION_TUNNEL_WAITING_FIELD]===!0;return!savedAddress(document3)&&!waiting2||autoRetryTimer!==null?null:await currentNeed()===!0?retryWork():
8667
+ null}let need=await currentNeed();if(need!==!1)return need&&await cancelRelease(),need===null&&atLaunch?null:recoveryDue({atLaunch})?reconcileIfEndpointGone():null;let releaseAt=releaseScheduledAt();if(releaseAt!==null&&now()>=releaseAt)return releaseAddress();let connection=managedConnectionState?.()??{};if(companionIsOn()&&CONNECTOR_FAILING_STATES.has(connection.status)&&(atLaunch||endpointCheckDue())){let released=await reconcileIfEndpointGone({onGone:releaseAddress});if(released)return released}
8668
+ if(releaseAt===null||releaseAt-now()>releaseGraceMs+releaseJitterMs){let delay3=releaseGraceMs+Math.round(random()*releaseJitterMs);await updateCredentials(current=>managedCompanionTunnelAccess(current)?{...current,[MANAGED_COMPANION_RELEASE_AT_FIELD]:now()+delay3}:current),writeLog(`companion account: no device needs the secure address; giving it back in ${Math.round(delay3/6e4)} min`)}return null},retryIfWanted=async()=>requestedRecently()||savedAddress(credentials())&&await currentNeed()!==!1?
8669
+ retryWork():(resetAutoRetry(),phase?.status==="error"&&(phase=null),writeLog("companion account: stopped retrying; no device needs a secure address"),settledState());retryFromTimer=()=>serialize(onDemand?retryIfWanted:retryWork);let prepare=()=>serialize(async()=>{let document3=credentials();if(!configured||!companionIsOn()||!storedAccount(document3)||companionAccountCleanupPending(document3))return settledState();if(requestedAt=now(),!managedCompanionTunnelAccess(document3))return retryWork();await cancelRelease();
8670
+ let connection=managedConnectionState?.()??{};if(["stopped","unconfigured"].includes(connection.status))await activatePersistedEndpoint();else if(CONNECTOR_FAILING_STATES.has(connection.status)){let repaired=await reconcileIfEndpointGone();if(repaired)return repaired}return settledState()}),watchdogTick=()=>{if(watchdogTimer=null,!disposed&&(watchdogTimer=setTimer(watchdogTick,endpointCheckIntervalMs),phase?.status!=="signed-out")){if(onDemand){serialize(()=>reviewAddress()).catch(()=>{});return}
8671
+ recoveryDue()&&serialize(()=>reconcileIfEndpointGone()).catch(()=>{})}},startWatchdog=()=>{!(autoRecover||onDemand)||disposed||!configured||watchdogTimer!==null||(watchdogTimer=setTimer(watchdogTick,firstEndpointCheckMs))};return Object.freeze({state:async()=>(await probeControlPlane(),settledState()),requestCode,verifyCode,connectLimix,retry,prepare,signOut:()=>serialize(async()=>{if(resetAutoRetry(),!storedAccount(credentials()))return await clearAfterCleanup(),settledState();let email3=storedAccount(
8672
+ credentials())?.email;phase={status:"connecting",email:email3};try{return await cleanupCurrentAccount(),healthy=!0,lastHealthCheck=now(),settledState()}catch(error62){return failAction(error62,{email:email3}),settledState()}}),restore:()=>serialize(async()=>{if(!configured||(startWatchdog(),!await probeControlPlane({force:!0})))return settledState();if(companionAccountCleanupPending(credentials()))return retryWork();if(await ensureClientIdentity(),onDemand){let reviewed=await reviewAddress({atLaunch:!0});
8673
+ return reviewed||(phase=null,settledState())}let account2=storedAccount(credentials());if(account2&&!managedCompanionTunnelAccess(credentials()))return retryWork();if(autoRecover&&account2&&companionIsOn()){let reconciled=await reconcileIfEndpointGone();if(reconciled)return reconciled}return phase=null,settledState()}),dispose:()=>{disposed=!0,cancelAutoRetry(),watchdogTimer!==null&&clearTimer(watchdogTimer),watchdogTimer=null}})}var SIGNIN_CODE_TTL_MS=10*6e4;init_user_errors();function parseAllowList(value){return(value??"").split(/[,\s]+/).map(entry=>entry.trim().toLowerCase()).filter(Boolean)}var NOT_WELCOME={ok:!1,status:403,...userError("serverError.email.notAllowed")};init_decision_log();init_redact2();init_usage_ledger();import{appendFile as appendFile2,mkdir as mkdir2}from"node:fs/promises";import{basename as basename2,join as join2}from"node:path";var DIR2="admin-activity";var PRUNE_EVERY_MS2=60*6e4,writeQueues2=new Map,lastPrune2=new Map;function adminActivityFileFor(dataDir,at2){return join2(dataDir,DIR2,`${monthKey(at2)}.ndjson`)}async function writeRow(dataDir,row){let at2=new Date(row.at);await mkdir2(join2(dataDir,DIR2),{recursive:!0,mode:448}),await appendFile2(adminActivityFileFor(dataDir,at2),JSON.stringify(row)+`
8674
8674
  `,{mode:384}),at2.getTime()-(lastPrune2.get(dataDir)??0)>=PRUNE_EVERY_MS2&&(lastPrune2.set(dataDir,at2.getTime()),await pruneMonthFiles(join2(dataDir,DIR2),boundRetentionDays(),at2))}function appendAdminAction(dataDir,row){let record12={...row,at:row.at??new Date().toISOString(),...row.before?{before:auditValues(row.before)}:{},...row.after?{after:auditValues(row.after)}:{}},queued=(writeQueues2.get(dataDir)??Promise.resolve()).then(()=>writeRow(dataDir,record12)).catch(()=>{});writeQueues2.set(
8675
8675
  dataDir,queued),queued.finally(()=>{writeQueues2.get(dataDir)===queued&&writeQueues2.delete(dataDir)})}async function flushAdminActivity(dataDir){await writeQueues2.get(dataDir)}var SECRET_PARTS=["token","secret","password","passwd","passphrase","credential","authorization","cookie","bearer","apikey","api_key"],OPAQUE_MAP=/^(?:headers|env|environment)$/i,MAX_VALUE_CHARS=2e3,HIDDEN="[hidden]";function isSecretName2(name){let lower=name.toLowerCase();return lower.endsWith("tokens")?!1:SECRET_PARTS.some(part=>lower.includes(part))?!0:/(?:^|[_.-])keys?$/.test(lower)||/[a-z]Keys?$/.test(name)}function isSecretParameter(name){
8676
8676
  if(name==="-k"||name==="-K")return!0;let bare=name.replace(/^-+/,"");return isSecretName2(bare)||/^(?:auth|sig|signature|pass|pwd|code)$/i.test(bare)}function keyLikeSegment(segment){return(segment.match(/[A-Za-z0-9]{16,}/g)??[]).some(run6=>/\d/.test(run6)&&/[A-Za-z]/.test(run6))}function maskUrlSecrets(text13){return text13.replace(/\b([a-z][\w+.-]*:\/\/)([^\s/?#]*)([^\s?#]*)([^\s]*)/gi,(_all,scheme,authority2,path3,rest)=>{let at2=authority2.lastIndexOf("@"),host2=at2>=0?`${HIDDEN}@${authority2.
@@ -8696,7 +8696,7 @@ options2.binary,["run","--config",configFile,"--adapter","caddyfile"],{env:{...o
8696
8696
  `);throw new Error(`Caddy stopped right after starting (exit ${settled.code}).
8697
8697
  ${reason}`)}return{configFile,exited,stop:async()=>{child.exitCode!==null||child.signalCode!==null||(child.kill("SIGTERM"),await Promise.race([exited,new Promise(r2=>setTimeout(r2,5e3))]),child.exitCode===null&&child.signalCode===null&&child.kill("SIGKILL"))}}}function normalizeDomainOption(raw){let value=raw.trim().toLowerCase().replace(/^https?:\/\//,"").replace(/\/+$/,""),label2=/^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/;return!value||value.length>253||!value.includes(".")||/[\s/:@?#]/.test(value)||
8698
8698
  !value.split(".").every(part=>label2.test(part))?{error:"--domain takes a bare hostname such as maus.example.com"}:/(?:^|\.)(?:localhost|local|internal|invalid)$/.test(value)?{error:"--domain needs a public domain name that resolves to this machine"}:value}import{spawnSync as spawnSync2}from"node:child_process";import{existsSync as existsSync4,mkdirSync as mkdirSync2,readFileSync as readFileSync2,writeFileSync as writeFileSync3}from"node:fs";import{homedir as homedir3}from"node:os";import{dirname as dirname4,join as join7}from"node:path";import{homedir,userInfo}from"node:os";import{posix}from"node:path";var{basename:basename3,dirname:dirname2,join:join5}=posix,SYSTEMD_UNIT_NAME="openmausbot.service",LAUNCHD_LABEL="com.openmausbot.serve";function quoteSystemd(value){return/[\s"\\]/.test(value)?`"${value.replace(/[\\"]/g,"\\$&")}"`:value}function needsStripTypes(script){return script.endsWith(".ts")}function serviceCommand(spec){return[spec.node,...needsStripTypes(spec.script)?["--experimental-strip-types"]:[],spec.script,"serve",
8699
- ...spec.serveArgs]}function systemdUnit(spec){let lines2=["# Written by `openmausbot service install`. Re-run it to change the options.","[Unit]",`Description=OpenMausBot${spec.label?` (${spec.label})`:""}`,"After=network-online.target","Wants=network-online.target","","[Service]","Type=simple",`User=${spec.user}`,`WorkingDirectory=${spec.home}`,`Environment=HOME=${spec.home}`,`Environment=OMB_DATA_DIR=${spec.dataDir}`,...spec.cliPrefix?[`Environment=${quoteSystemd(`OMB_CLI_PREFIX=${spec.cliPrefix}`)}`]:
8699
+ ...spec.serveArgs]}function systemdUnit(spec){let lines2=["# Written by `openmausbot service install`. Re-run it to change the options.","[Unit]",`Description=Limix Bot${spec.label?` (${spec.label})`:""}`,"After=network-online.target","Wants=network-online.target","","[Service]","Type=simple",`User=${spec.user}`,`WorkingDirectory=${spec.home}`,`Environment=HOME=${spec.home}`,`Environment=OMB_DATA_DIR=${spec.dataDir}`,...spec.cliPrefix?[`Environment=${quoteSystemd(`OMB_CLI_PREFIX=${spec.cliPrefix}`)}`]:
8700
8700
  [],`ExecStart=${serviceCommand(spec).map(quoteSystemd).join(" ")}`,"Restart=always","RestartSec=3","KillMode=mixed","TimeoutStopSec=30"];return spec.bindsLowPorts&&(lines2.push("# serve --domain: Caddy binds ports 80 and 443 without running as root."),lines2.push("AmbientCapabilities=CAP_NET_BIND_SERVICE"),lines2.push("CapabilityBoundingSet=CAP_NET_BIND_SERVICE")),lines2.push("","[Install]","WantedBy=multi-user.target",""),lines2.join(`
8701
8701
  `)}function xml(value){return value.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function launchdPlist(spec){let args=serviceCommand(spec).map(arg=>` <string>${xml(arg)}</string>`).join(`
8702
8702
  `);return['<?xml version="1.0" encoding="UTF-8"?>','<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">','<plist version="1.0">',"<dict>"," <key>Label</key>",` <string>${LAUNCHD_LABEL}</string>`," <key>ProgramArguments</key>"," <array>",args," </array>"," <key>EnvironmentVariables</key>"," <dict>"," <key>HOME</key>",` <string>${xml(spec.home)}</string>`," <key>OMB_DATA_DIR</key>",` <string>${xml(spec.dataDir)}</string>`,...spec.cliPrefix?[" \
@@ -1 +1 @@
1
- {"type":"module","version":"0.2.13"}
1
+ {"type":"module","version":"0.3.2"}
@@ -1880,29 +1880,29 @@ init_mcp_registry();init_connection();init_schema();init_config();init_live_conf
1880
1880
  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(value=>value===""||isValidSshAlias(value),{message:"must be a simple SSH config alias"}).optional()}),roomConfigSchema=external_exports.object({turnTimeoutMinutes:external_exports.number().int().min(MIN_ROOM_TURN_TIMEOUT_MINUTES).max(MAX_ROOM_TURN_TIMEOUT_MINUTES)}),mcpConfigSchema=
1881
1881
  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(id=>id!=="guest","guest is reserved"),name:external_exports.string().trim().min(1).max(40),browser:external_exports.literal("chrome").optional()}).strict(),legacyBrowserProfileSchema=external_exports.object({id:external_exports.
1882
1882
  string().regex(LEGACY_BROWSER_PROFILE_ID).refine(id=>id!=="guest","guest is reserved"),name:external_exports.string().trim().min(1).max(40),partitionId:external_exports.string().regex(LEGACY_BROWSER_PROFILE_ID).refine(id=>id!=="guest","guest is reserved").optional(),browser:external_exports.literal("chrome").optional()}).strict();legacyBrowserProfilesSchema=external_exports.array(legacyBrowserProfileSchema).max(20),storedBrowserProfilesSchema=legacyBrowserProfilesSchema.transform(profiles=>migrateStoredBrowserProfiles(
1883
- profiles).profiles),browserProfilesSchema=external_exports.array(browserProfileSchema).max(20).superRefine((profiles,ctx)=>{let seen=new Set;profiles.forEach((profile,index2)=>{if(!seen.has(profile.id)){seen.add(profile.id);return}ctx.addIssue({code:"custom",path:[index2,"id"],message:`browser profile id ${profile.id} is duplicated`})})}),featureConfigSchema=external_exports.object({skillAuthoring:external_exports.boolean().optional(),skillReview:external_exports.boolean().optional(),skillReviewSteps:external_exports.
1884
- 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().optional(),smartSetupChoices:external_exports.boolean().optional(),autoRecall:external_exports.boolean().optional(),skillsLibrary:external_exports.boolean().
1885
- 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().optional()}),onboardingConfigSchema=external_exports.object({completedAt:external_exports.string().trim().max(40).optional(),version:external_exports.
1886
- 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),displayName:optionalText2,accentColor:optionalText2,icon:external_exports.discriminatedUnion("kind",[external_exports.object({kind:external_exports.
1887
- 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.string()).optional(),enabled:external_exports.boolean().optional(),hidden:external_exports.boolean().optional(),access:external_exports.
1888
- 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.enum(EFFORT_LEVELS).optional(),variant:external_exports.string().refine(isModelVariant,"invalid model variant").optional()}).
1889
- refine(selection=>selection.variant===void 0||selection.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 enabling automatic recovery",path:["backup"]}),cacheKeepWarmSchema=external_exports.object({enabled:external_exports.boolean(),windowMinutes:external_exports.
1890
- 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.number().int().min(1).max(3650).optional()}).strict(),newBotsConfigSchema=external_exports.object({effort:external_exports.enum(EFFORT_LEVELS).optional()}).
1891
- 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.shape.eventLogRetentionDays.nullable()}),appConfigSchema=external_exports.object({customDomain:external_exports.string().optional(),signIn:external_exports.
1892
- 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(),newBotDefaults:newBotDefaultsSchema.optional(),newBots:newBotsConfigSchema.optional(),cliStartup:external_exports.object({access:external_exports.enum(
1893
- ["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(),postiz:external_exports.object({key:optionalText2,url:optionalText2}).optional(),groq:external_exports.object({key:optionalText2,url:optionalText2}).
1894
- 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}).optional(),anthropic:external_exports.object({key:optionalText2,url:optionalText2,everyClaudeBot:external_exports.boolean().optional()}).optional(),
1895
- 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.string().regex(/^[A-Z]{3}$/).optional(),prices:external_exports.record(external_exports.string().min(1).max(160),external_exports.
1896
- 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.object({apiKey:optionalText2,userId:optionalText2,sessionId:optionalText2}).optional(),box:external_exports.object({token:optionalText2}).
1897
- 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(["elevenlabs","fish","system","chatterbox","xai","gemini","openai"]).optional(),baseUrl:external_exports.string().trim().max(2048).refine(value=>!value||
1898
- /^https?:\/\//i.test(value),"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.optional(),everyBotRules:external_exports.string().max(24e3).optional(),profile:external_exports.object({name:optionalText2,email:optionalText2,aboutMe:external_exports.
1899
- 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.number().positive().max(1e7).optional(),autoCompact:external_exports.boolean().optional()}).extend(roomContextSettings).extend(replaySettings).optional(),
1900
- 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().optional(),decisions:external_exports.object({retentionDays:external_exports.number().int().min(1).max(3650).optional()}).strict().optional(),loopGuard:loopGuardConfigSchema.
1901
- 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.optional(),instances:instanceConfigMapSchema.optional(),mcpServers:external_exports.record(external_exports.string(),external_exports.unknown()).optional()}),storedAppConfigSchema=
1902
- 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(keys=>Object.fromEntries(Object.entries(keys).filter(entry=>typeof entry[1]=="string"))).optional()}).optional()}),appConfigPatchSchema=appConfigSchema.omit({instances:!0,mcpServers:!0,cliStartup:!0,customDomain:!0}).extend({threads:threadsPatchSchema.
1903
- optional(),newBots:newBotsPatchSchema.optional(),imageGen:imageGenPatchSchema.optional()}),jsonObjectSchema2=external_exports.record(external_exports.string(),external_exports.json());DEFAULT_CAPTURE_QUIET_MS=2*6e4,DATA_DIR=process.env.OMB_DATA_DIR||join16(dataHome(),".limixbot"),LEGACY_DATA_DIR=join16(dataHome(),".opengrokbot"),EVENTS_DIR=join16(DATA_DIR,"events"),NATIVE_DIR=join16(DATA_DIR,"native"),lastIgnoredConfigWarning="",storedConfig=settledFileCache(()=>join16(DATA_DIR,"config.json"),()=>parseStoredConfig(
1904
- parseJson(readFileSync9(join16(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=/^[\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=(a2,b3)=>a2.trim().replace(/\/+$/u,"")===b3.trim().replace(
1905
- /\/+$/u,"")}});function agentBrowserReleaseUrl(asset){return asset.url??`https://github.com/vercel-labs/agent-browser/releases/download/v${AGENT_BROWSER_VERSION}/${asset.asset}`}function agentBrowserReleaseVersion(asset){return asset?.version??AGENT_BROWSER_VERSION}function linuxFamilyKey(platform,arch2,musl){return platform==="android"?`linux-musl-${arch2}`:platform==="linux"&&musl?`linux-musl-${arch2}`:`${platform}-${arch2}`}function resolveAgentBrowserReleaseAsset(platform=process.platform,arch2=process.arch,musl=!1){
1883
+ profiles).profiles),browserProfilesSchema=external_exports.array(browserProfileSchema).max(20).superRefine((profiles,ctx)=>{let seen=new Set;profiles.forEach((profile,index2)=>{if(!seen.has(profile.id)){seen.add(profile.id);return}ctx.addIssue({code:"custom",path:[index2,"id"],message:`browser profile id ${profile.id} is duplicated`})})}),featureConfigSchema=external_exports.object({skillAuthoring:external_exports.boolean().optional(),skillReview:external_exports.boolean().optional(),skillAutoApply:external_exports.
1884
+ 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().optional(),smartSetupChoices:external_exports.boolean().optional(),autoRecall:external_exports.boolean().
1885
+ 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().optional()}),onboardingConfigSchema=external_exports.object({completedAt:external_exports.string().
1886
+ 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),displayName:optionalText2,accentColor:optionalText2,icon:external_exports.discriminatedUnion("kin\
1887
+ d",[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.string()).optional(),enabled:external_exports.boolean().optional(),hidden:external_exports.
1888
+ 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.enum(EFFORT_LEVELS).optional(),variant:external_exports.string().refine(isModelVariant,
1889
+ "invalid model variant").optional()}).refine(selection=>selection.variant===void 0||selection.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 enabling automatic recovery",path:["backup"]}),cacheKeepWarmSchema=external_exports.object({enabled:external_exports.
1890
+ 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.number().int().min(1).max(3650).optional()}).strict(),newBotsConfigSchema=external_exports.object({effort:external_exports.
1891
+ 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.shape.eventLogRetentionDays.nullable()}),appConfigSchema=external_exports.object({customDomain:external_exports.string().
1892
+ 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(),newBotDefaults:newBotDefaultsSchema.optional(),newBots:newBotsConfigSchema.optional(),cliStartup:external_exports.
1893
+ 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(),postiz:external_exports.object({key:optionalText2,url:optionalText2}).optional(),groq:external_exports.object(
1894
+ {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}).optional(),anthropic:external_exports.object({key:optionalText2,url:optionalText2,everyClaudeBot:external_exports.
1895
+ 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.string().regex(/^[A-Z]{3}$/).optional(),prices:external_exports.record(external_exports.string().
1896
+ 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.object({apiKey:optionalText2,userId:optionalText2,sessionId:optionalText2}).optional(),
1897
+ 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(["elevenlabs","fish","system","chatterbox","xai","gemini","openai"]).optional(),baseUrl:external_exports.
1898
+ string().trim().max(2048).refine(value=>!value||/^https?:\/\//i.test(value),"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.optional(),everyBotRules:external_exports.string().max(24e3).optional(),profile:external_exports.object(
1899
+ {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.number().positive().max(1e7).optional(),autoCompact:external_exports.boolean().optional()}).
1900
+ 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().optional(),decisions:external_exports.object({retentionDays:external_exports.number().
1901
+ 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.optional(),instances:instanceConfigMapSchema.optional(),mcpServers:external_exports.
1902
+ 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(keys=>Object.fromEntries(Object.entries(keys).filter(entry=>typeof entry[1]=="string"))).optional()}).optional()}),appConfigPatchSchema=
1903
+ 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_CAPTURE_QUIET_MS=2*6e4,DATA_DIR=process.env.OMB_DATA_DIR||join16(dataHome(),".limixbot"),LEGACY_DATA_DIR=join16(dataHome(),".opengrokbot"),EVENTS_DIR=join16(DATA_DIR,"events"),NATIVE_DIR=join16(
1904
+ DATA_DIR,"native"),lastIgnoredConfigWarning="",storedConfig=settledFileCache(()=>join16(DATA_DIR,"config.json"),()=>parseStoredConfig(parseJson(readFileSync9(join16(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=/^[\x21-\x7e]{1,4096}$/;configSaveListeners=new Set;CLAUDE_ROUTING_ENV=["ANTHROPIC_BASE_URL","ANTHROPIC_AUTH_TOKEN","ANTHROPIC_API_KEY","ANTHROPIC_CUSTOM_HEADERS","CLA\
1905
+ UDE_CODE_USE_BEDROCK","CLAUDE_CODE_USE_VERTEX","CLAUDE_CODE_USE_FOUNDRY"];sameUrl=(a2,b3)=>a2.trim().replace(/\/+$/u,"")===b3.trim().replace(/\/+$/u,"")}});function agentBrowserReleaseUrl(asset){return asset.url??`https://github.com/vercel-labs/agent-browser/releases/download/v${AGENT_BROWSER_VERSION}/${asset.asset}`}function agentBrowserReleaseVersion(asset){return asset?.version??AGENT_BROWSER_VERSION}function linuxFamilyKey(platform,arch2,musl){return platform==="android"?`linux-musl-${arch2}`:platform==="linux"&&musl?`linux-musl-${arch2}`:`${platform}-${arch2}`}function resolveAgentBrowserReleaseAsset(platform=process.platform,arch2=process.arch,musl=!1){
1906
1906
  return RELEASES.get(linuxFamilyKey(platform,arch2,musl))??null}var AGENT_BROWSER_VERSION,RELEASES,init_browser_engine_release=__esm({"server/browser-engine-release.ts"(){"use strict";AGENT_BROWSER_VERSION="0.37.0",RELEASES=new Map([["darwin-arm64",{target:"darwin-arm64",asset:"agent-browser-darwin-arm64",sha256:"da5a2b4ef7be8ba279b1258c542c33877f480b1951d0d94de607fc1528edd380",bytes:12429360}],["darwin-x64",{target:"darwin-x64",asset:"agent-browser-darwin-x64",sha256:"f402c96350ffd2adc68d0e5e4d8\
1907
1907
  3aa49cf7735fef29882a8866be36cc2fc67e9",bytes:13588296}],["linux-arm64",{target:"linux-arm64",asset:"agent-browser-linux-arm64",sha256:"0315a8c4f7bf167cc5fd5eeaea79009b0e6b5d2ae8b3057bf6f96be978483426",bytes:12507840}],["linux-musl-arm64",{target:"linux-musl-arm64",asset:"agent-browser-linux-musl-arm64",sha256:"db67c0e84e0668c052c2cbdca325c57f896e309c3723755dcdd65b700f8a2b52",bytes:12369352}],["linux-musl-x64",{target:"linux-musl-x64",asset:"agent-browser-linux-musl-x64",sha256:"5cff3bc7b2486867a\
1908
1908
  ba2901f92c9ce6029bd2a37951630d9feec1c5b3fee402e",bytes:14092888}],["linux-x64",{target:"linux-x64",asset:"agent-browser-linux-x64",sha256:"78e0c5a14a7fa1f3d1ae2acdbdcc94a047b435b998a8c505fcc49d7fa4935a49",bytes:14253776}],["win32-x64",{target:"win32-x64",version:"0.36.0-omb.1",asset:"agent-browser-win32-x64-0.36.0-omb.1.exe",url:"https://github.com/milind-soni/OpenMausBot/releases/download/browser-engine-v0.36.0-omb.1/agent-browser-win32-x64-0.36.0-omb.1.exe",sha256:"33bee834f6a6072ec8688b091472\
@@ -8619,8 +8619,8 @@ child=null,removeTokenFile(tokenFile);let terminated=existing?terminateChild(exi
8619
8619
  ected. Try again to recover it.",endpoint_busy:"The secure connection is still being prepared. Try again in a moment.",endpoint_rate_limited:"The secure connection service is busy right now. Local Wi-Fi and Tailscale pairing still work; try again in {wait}.",update_required:"This version of Limix Bot can no longer make secure links. Update Limix Bot, then try again. Local Wi-Fi and Tailscale pairing still work.",endpoint_capacity:"Secure HTTPS links are temporarily full. Try again in {wait}, or \
8620
8620
  pair on this Wi-Fi or with Tailscale.",endpoint_unavailable:"The secure connection service could not finish setup. Local Wi-Fi and Tailscale pairing still work. If this keeps happening, contact support with the error reference.",endpoint_cleanup_pending:"The secure connection is still being removed. Try signing out again shortly.",control_plane_unavailable:"Secure access is not available right now. Local pairing still works.",internal_error:"The secure connection service had a problem. Local pai\
8621
8621
  ring still works; try again.",invalid_response:"The secure connection service returned an unexpected response. Try again.",request_failed:"The secure connection request could not be completed. Local pairing still works; try again."});function retryWait(retryAfterMs){let seconds=Math.ceil((retryAfterMs??0)/1e3);return seconds>0?seconds<90?`${seconds} seconds`:`${Math.round(seconds/60)} minutes`:"a few minutes"}function friendlyCompanionAccountError(error62){let code=error62 instanceof ControlPlaneError?
8622
- error62.code:"",message5=(FRIENDLY_MESSAGES[code]??FRIENDLY_MESSAGES.request_failed).replace("{wait}",()=>retryWait(error62.retryAfterMs)),reference=error62 instanceof ControlPlaneError&&error62.requestId?` Reference: ${error62.requestId}.`:"";return`${message5}${reference}`}var DEFAULT_COMPANION_CONTROL_PLANE_URL="https://accounts.openmausbot.com",COMPANION_CLIENT_INSTANCE_FIELD="companionClientInstanceId",COMPANION_ACCOUNT_TOKEN_FIELD="companionAccountToken",COMPANION_ACCOUNT_USER_ID_FIELD="companionAccountUserId",COMPANION_ACCOUNT_EMAIL_FIELD="companionAccountEmail",COMPANION_INSTALLATION_ID_FIELD="companionInstallationId",COMPANION_INSTALLATION_CREDENTIAL_FIELD="companionInstallationCredential",COMPANION_INSTALLATION_EXPIRY_FIELD="companionInstallationCredential\
8623
- ExpiresAt",COMPANION_ACCOUNT_CLEANUP_PENDING_FIELD="companionAccountCleanupPending",COMPANION_ENDPOINT_RELEASE_PENDING_FIELD="companionEndpointReleasePending",COMPANION_ENDPOINT_PAUSED_FIELD="companionEndpointPaused",COMPANION_TUNNEL_RETIRED_FIELD="companionTunnelRetired",COMPANION_TUNNEL_WAITING_FIELD="companionTunnelWaiting",UUID=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,INSTALLATION_ID2=UUID,INSTALLATION_CREDENTIAL2=/^omb_install_[A-Za-z0-9_-]{22}\.[A-Za-z0-9_-]{43}$/,
8622
+ error62.code:"",message5=(FRIENDLY_MESSAGES[code]??FRIENDLY_MESSAGES.request_failed).replace("{wait}",()=>retryWait(error62.retryAfterMs)),reference=error62 instanceof ControlPlaneError&&error62.requestId?` Reference: ${error62.requestId}.`:"";return`${message5}${reference}`}var DEFAULT_COMPANION_CONTROL_PLANE_URL="https://accounts.limixmedia.com",COMPANION_CLIENT_INSTANCE_FIELD="companionClientInstanceId",COMPANION_ACCOUNT_TOKEN_FIELD="companionAccountToken",COMPANION_ACCOUNT_USER_ID_FIELD="companionAccountUserId",COMPANION_ACCOUNT_EMAIL_FIELD="companionAccountEmail",COMPANION_INSTALLATION_ID_FIELD="companionInstallationId",COMPANION_INSTALLATION_CREDENTIAL_FIELD="companionInstallationCredential",COMPANION_INSTALLATION_EXPIRY_FIELD="companionInstallationCredentialE\
8623
+ xpiresAt",COMPANION_ACCOUNT_CLEANUP_PENDING_FIELD="companionAccountCleanupPending",COMPANION_ENDPOINT_RELEASE_PENDING_FIELD="companionEndpointReleasePending",COMPANION_ENDPOINT_PAUSED_FIELD="companionEndpointPaused",COMPANION_TUNNEL_RETIRED_FIELD="companionTunnelRetired",COMPANION_TUNNEL_WAITING_FIELD="companionTunnelWaiting",UUID=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,INSTALLATION_ID2=UUID,INSTALLATION_CREDENTIAL2=/^omb_install_[A-Za-z0-9_-]{22}\.[A-Za-z0-9_-]{43}$/,
8624
8624
  DEFAULT_HEALTH_CACHE_MS=3e4,DEFAULT_AUTO_RETRY_BASE_MS=10*6e4,DEFAULT_AUTO_RETRY_MAX_MS=360*6e4,DEFAULT_ENDPOINT_CHECK_INTERVAL_MS=15*6e4,DEFAULT_FIRST_ENDPOINT_CHECK_MS=2*6e4,DEFAULT_RELEASE_GRACE_MS=60*6e4,DEFAULT_RELEASE_JITTER_MS=180*6e4,REQUEST_WINDOW_MS=60*6e4,AUTO_RETRY_CODES=new Set(["endpoint_capacity","endpoint_rate_limited","endpoint_unavailable","endpoint_busy","network_unavailable","control_plane_unavailable","internal_error","rate_limited","credential_rotation_rate_limited"]),ENDPOINT_NEEDS_RECONCILE=new Set(
8625
8625
  ["deleting","deleted","error"]),WATCHDOG_CHECK_STATES=new Set(["starting","ready","retrying","error"]),CONNECTOR_FAILING_STATES=new Set(["retrying","error"]),defaultSetTimer=(callback,milliseconds)=>{let timer2=setTimeout(callback,milliseconds);return timer2.unref?.(),timer2},ownString=(document3,field)=>typeof document3?.[field]=="string"?document3[field]:"";function resolveCompanionControlPlaneURL({isPackaged,environment=process.env}={}){return Object.hasOwn(environment,"OMB_CONTROL_PLANE_URL")?
8626
8626
  normalizeControlPlaneURL(environment.OMB_CONTROL_PLANE_URL):isPackaged?DEFAULT_COMPANION_CONTROL_PLANE_URL:""}function companionAccountCleanupPending(credentials){return credentials?.[COMPANION_ACCOUNT_CLEANUP_PENDING_FIELD]===!0}var companionTunnelRetired=credentials=>!!storedAccount(credentials)&&!managedCompanionTunnelAccess(credentials)&&credentials?.[COMPANION_TUNNEL_RETIRED_FIELD]===!0;function storedAccount(credentials){let email3=normalizeAccountEmail(ownString(credentials,COMPANION_ACCOUNT_EMAIL_FIELD)),
@@ -8650,26 +8650,26 @@ credential)&&await client.revokeInstallation(accountToken,installation.installat
8650
8650
  ...document3};return relayOnly==="retired"?next[COMPANION_TUNNEL_RETIRED_FIELD]=!0:delete next[COMPANION_TUNNEL_RETIRED_FIELD],relayOnly==="retired"||relayOnly==="full"?next[COMPANION_TUNNEL_WAITING_FIELD]=!0:delete next[COMPANION_TUNNEL_WAITING_FIELD],next}),withoutTunnel();try{await updateCredentials(document3=>withProvisionedAccount(document3,{accountToken,user,installation,provision:endpoint}))}catch(error62){throw await client.deleteEndpoint(installation.credential).catch(()=>{}),await client.
8651
8651
  revokeInstallation(accountToken,installation.installation.id).catch(()=>{}),error62}resetAutoRetry();let connection=await activatePersistedEndpoint();return phase=null,companionIsOn()&&connection&&["unavailable","error"].includes(connection.status)&&(phase={status:"error",email:user.email,endpoint:endpoint.endpoint.url,message:"The address is ready, but this app could not start its secure connection. Local pairing still works."}),settledState()},writeLog=line3=>{try{log2(line3)}catch{}},failAction=(error62,{
8652
8652
  email:email3,expiredSessionIsSignedOut=!1,signedOut=!1}={})=>{let message5=friendlyCompanionAccountError(error62);return writeLog(error62 instanceof ControlPlaneError?`companion account: setup failed code=${error62.code} status=${error62.status||"none"} ref=${error62.requestId||"none"}`:"companion account: setup failed on this computer (not a control-plane answer)"),phase={status:signedOut||expiredSessionIsSignedOut&&error62 instanceof ControlPlaneError&&error62.status===401?"signed-out":"error",
8653
- email:email3,message:message5},message5},requestCode=rawEmail=>serialize(async()=>{if(!configured)throw new Error(FRIENDLY_MESSAGES.control_plane_unavailable);let email3=normalizeAccountEmail(rawEmail),requested;try{await requireHealthyControlPlane(),requested=await client.requestOTP(email3)}catch(error62){let message5=failAction(error62,{email:email3,signedOut:!0});throw new Error(message5)}return phase={status:"signed-out",email:requested.email},settledState()}),verifyCode=(rawEmail,rawCode)=>serialize(
8654
- async()=>{if(!configured)throw new Error(FRIENDLY_MESSAGES.control_plane_unavailable);requestedAt=now();let email3=normalizeAccountEmail(rawEmail);phase={status:"connecting",email:email3};let verified;try{await requireHealthyControlPlane(),verified=await client.verifyOTP(email3,rawCode)}catch(error62){let message5=failAction(error62,{email:email3,signedOut:!0});throw new Error(message5)}let previous2=storedAccount(credentials()),refreshingPendingCleanup=!!(previous2&&previous2.userId===verified.
8655
- user.id&&companionAccountCleanupPending(credentials())),authenticatedPersisted=!1;try{previous2&&previous2.userId!==verified.user.id&&await cleanupCurrentAccount();let existingIdentity=ownString(credentials(),COMPANION_CLIENT_INSTANCE_FIELD),clientInstanceId=UUID.test(existingIdentity)?existingIdentity:newClientInstanceId?.();if(!UUID.test(clientInstanceId??""))throw new Error("A stable computer identity could not be created");return await updateCredentials(document3=>withAuthenticatedAccount(document3,
8656
- {...verified,clientInstanceId,preserveCleanupPending:refreshingPendingCleanup})),authenticatedPersisted=!0,refreshingPendingCleanup?(await cleanupCurrentAccount({markPending:!1}),settledState()):await provision(verified)}catch(error62){return authenticatedPersisted||await client.signOut(verified.accountToken).catch(()=>{}),failAction(error62,{email:authenticatedPersisted?verified.user.email:previous2?.email??email3,expiredSessionIsSignedOut:authenticatedPersisted}),authenticatedPersisted&&scheduleAutoRetry(
8657
- error62),settledState()}}),retryWork=async()=>{if(!configured)return settledState();let account2=storedAccount(credentials());if(!account2)return phase=null,settledState();if(companionAccountCleanupPending(credentials())){phase={status:"connecting",email:account2.email};try{await requireHealthyControlPlane(),await cleanupCurrentAccount({markPending:!1})}catch(error62){failAction(error62,{email:account2.email,expiredSessionIsSignedOut:!0})}return settledState()}phase={status:"connecting",email:account2.
8658
- email};try{return await requireHealthyControlPlane(),await provision({accountToken:account2.accountToken,user:{id:account2.userId,email:account2.email}})}catch(error62){return failAction(error62,{email:account2.email,expiredSessionIsSignedOut:!0}),scheduleAutoRetry(error62),settledState()}},retry=()=>serialize(async()=>(requestedAt=now(),retryWork())),reconcileIfEndpointGone=async({onGone=retryWork}={})=>{let document3=credentials(),account2=storedAccount(document3),access2=managedCompanionTunnelAccess(
8659
- document3);if(!account2||!access2||!account2.installationCredential||companionAccountCleanupPending(document3)||typeof client.getEndpoint!="function")return null;lastEndpointCheck=now();let endpoint;try{endpoint=await client.getEndpoint(account2.installationCredential)}catch(error62){return error62 instanceof ControlPlaneError&&error62.status===401?onGone():null}return endpoint&&endpoint.url===access2.endpoint&&!ENDPOINT_NEEDS_RECONCILE.has(endpoint.status)?null:onGone()},endpointCheckDue=()=>lastEndpointCheck===
8660
- null||now()-lastEndpointCheck>=endpointCheckIntervalMs/2,recoveryDue=({atLaunch=!1}={})=>{if(!autoRecover||!companionIsOn())return!1;if(atLaunch)return!0;if(autoRetryTimer!==null)return!1;let connection=managedConnectionState?.()??{};return WATCHDOG_CHECK_STATES.has(connection.status)&&endpointCheckDue()},requestedRecently=()=>requestedAt!==null&&now()-requestedAt<REQUEST_WINDOW_MS,savedAddress=document3=>normalizeManagedCompanionEndpoint(document3[MANAGED_COMPANION_ENDPOINT_FIELD]),phonesUnused=!1,
8661
- currentNeed=async()=>{let answer=await Promise.resolve().then(()=>managedEndpointNeeded()).catch(()=>null);phonesUnused=answer===MANAGED_ENDPOINT_PHONES_UNUSED;let need=phonesUnused?!1:typeof answer=="boolean"?answer:null;return need===!1&&relay.capable()?!1:requestedRecently()?(phonesUnused=!1,!0):need},releaseScheduledAt=()=>{let at2=credentials()[MANAGED_COMPANION_RELEASE_AT_FIELD];return Number.isSafeInteger(at2)&&at2>0?at2:null},cancelRelease=async()=>{releaseScheduledAt()!==null&&await updateCredentials(
8662
- document3=>{let next={...document3};return delete next[MANAGED_COMPANION_RELEASE_AT_FIELD],next})},releaseAddress=async()=>{let need=await currentNeed(),pause2=phonesUnused;if(need!==!1)return need&&await cancelRelease(),settledState();let document3=credentials(),account2=storedAccount(document3);if(!account2?.installationCredential||!managedCompanionTunnelAccess(document3)||companionAccountCleanupPending(document3))return settledState();await stopManagedEndpoint();let removalPending=!1;try{await client.
8663
- deleteEndpoint(account2.installationCredential)}catch(error62){if(removalPending=error62 instanceof ControlPlaneError&&error62.code==="endpoint_cleanup_pending",!(removalPending||error62 instanceof ControlPlaneError&&error62.status===401))return writeLog(error62 instanceof ControlPlaneError?`companion account: could not give the secure address back code=${error62.code} status=${error62.status||"none"} ref=${error62.requestId||"none"}`:"companion account: could not give the secure address back (n\
8664
- ot a control-plane answer)"),await activatePersistedEndpoint(),settledState()}return await updateCredentials(current=>({...withoutManagedCompanionTunnelAccess(current),...removalPending?{[COMPANION_ENDPOINT_RELEASE_PENDING_FIELD]:!0}:{},...pause2?{[COMPANION_ENDPOINT_PAUSED_FIELD]:!0}:{}})),resetAutoRetry(),phase=null,writeLog(pause2?"companion account: gave the secure address back; no paired phone was used in 30 days":"companion account: gave the secure address back; no device needs it"),settledState()},
8665
- reviewAddress=async({atLaunch=!1}={})=>{let document3=credentials();if(!storedAccount(document3)||companionAccountCleanupPending(document3))return null;if(!managedCompanionTunnelAccess(document3)){let waiting2=document3[COMPANION_TUNNEL_WAITING_FIELD]===!0;return!savedAddress(document3)&&!waiting2||autoRetryTimer!==null?null:await currentNeed()===!0?retryWork():null}let need=await currentNeed();if(need!==!1)return need&&await cancelRelease(),need===null&&atLaunch?null:recoveryDue({atLaunch})?reconcileIfEndpointGone():
8666
- null;let releaseAt=releaseScheduledAt();if(releaseAt!==null&&now()>=releaseAt)return releaseAddress();let connection=managedConnectionState?.()??{};if(companionIsOn()&&CONNECTOR_FAILING_STATES.has(connection.status)&&(atLaunch||endpointCheckDue())){let released=await reconcileIfEndpointGone({onGone:releaseAddress});if(released)return released}if(releaseAt===null||releaseAt-now()>releaseGraceMs+releaseJitterMs){let delay3=releaseGraceMs+Math.round(random()*releaseJitterMs);await updateCredentials(
8667
- current=>managedCompanionTunnelAccess(current)?{...current,[MANAGED_COMPANION_RELEASE_AT_FIELD]:now()+delay3}:current),writeLog(`companion account: no device needs the secure address; giving it back in ${Math.round(delay3/6e4)} min`)}return null},retryIfWanted=async()=>requestedRecently()||savedAddress(credentials())&&await currentNeed()!==!1?retryWork():(resetAutoRetry(),phase?.status==="error"&&(phase=null),writeLog("companion account: stopped retrying; no device needs a secure address"),settledState());
8668
- retryFromTimer=()=>serialize(onDemand?retryIfWanted:retryWork);let prepare=()=>serialize(async()=>{let document3=credentials();if(!configured||!companionIsOn()||!storedAccount(document3)||companionAccountCleanupPending(document3))return settledState();if(requestedAt=now(),!managedCompanionTunnelAccess(document3))return retryWork();await cancelRelease();let connection=managedConnectionState?.()??{};if(["stopped","unconfigured"].includes(connection.status))await activatePersistedEndpoint();else if(CONNECTOR_FAILING_STATES.
8669
- has(connection.status)){let repaired=await reconcileIfEndpointGone();if(repaired)return repaired}return settledState()}),watchdogTick=()=>{if(watchdogTimer=null,!disposed&&(watchdogTimer=setTimer(watchdogTick,endpointCheckIntervalMs),phase?.status!=="signed-out")){if(onDemand){serialize(()=>reviewAddress()).catch(()=>{});return}recoveryDue()&&serialize(()=>reconcileIfEndpointGone()).catch(()=>{})}},startWatchdog=()=>{!(autoRecover||onDemand)||disposed||!configured||watchdogTimer!==null||(watchdogTimer=
8670
- setTimer(watchdogTick,firstEndpointCheckMs))};return Object.freeze({state:async()=>(await probeControlPlane(),settledState()),requestCode,verifyCode,retry,prepare,signOut:()=>serialize(async()=>{if(resetAutoRetry(),!storedAccount(credentials()))return await clearAfterCleanup(),settledState();let email3=storedAccount(credentials())?.email;phase={status:"connecting",email:email3};try{return await cleanupCurrentAccount(),healthy=!0,lastHealthCheck=now(),settledState()}catch(error62){return failAction(
8671
- error62,{email:email3}),settledState()}}),restore:()=>serialize(async()=>{if(!configured||(startWatchdog(),!await probeControlPlane({force:!0})))return settledState();if(companionAccountCleanupPending(credentials()))return retryWork();if(await ensureClientIdentity(),onDemand){let reviewed=await reviewAddress({atLaunch:!0});return reviewed||(phase=null,settledState())}let account2=storedAccount(credentials());if(account2&&!managedCompanionTunnelAccess(credentials()))return retryWork();if(autoRecover&&
8672
- account2&&companionIsOn()){let reconciled=await reconcileIfEndpointGone();if(reconciled)return reconciled}return phase=null,settledState()}),dispose:()=>{disposed=!0,cancelAutoRetry(),watchdogTimer!==null&&clearTimer(watchdogTimer),watchdogTimer=null}})}var SIGNIN_CODE_TTL_MS=10*6e4;init_user_errors();function parseAllowList(value){return(value??"").split(/[,\s]+/).map(entry=>entry.trim().toLowerCase()).filter(Boolean)}var NOT_WELCOME={ok:!1,status:403,...userError("serverError.email.notAllowed")};init_decision_log();init_redact2();init_usage_ledger();import{appendFile as appendFile2,mkdir as mkdir2}from"node:fs/promises";import{basename as basename2,join as join2}from"node:path";var DIR2="admin-activity";var PRUNE_EVERY_MS2=60*6e4,writeQueues2=new Map,lastPrune2=new Map;function adminActivityFileFor(dataDir,at2){return join2(dataDir,DIR2,`${monthKey(at2)}.ndjson`)}async function writeRow(dataDir,row){let at2=new Date(row.at);await mkdir2(join2(dataDir,DIR2),{recursive:!0,mode:448}),await appendFile2(adminActivityFileFor(dataDir,at2),JSON.stringify(row)+`
8653
+ email:email3,message:message5},message5},requestCode=rawEmail=>serialize(async()=>{if(!configured)throw new Error(FRIENDLY_MESSAGES.control_plane_unavailable);let email3=normalizeAccountEmail(rawEmail),requested;try{await requireHealthyControlPlane(),requested=await client.requestOTP(email3)}catch(error62){let message5=failAction(error62,{email:email3,signedOut:!0});throw new Error(message5)}return phase={status:"signed-out",email:requested.email},settledState()}),signInFlow=(rawEmail,obtain)=>serialize(
8654
+ async()=>{if(!configured)throw new Error(FRIENDLY_MESSAGES.control_plane_unavailable);requestedAt=now();let email3=normalizeAccountEmail(rawEmail);phase={status:"connecting",email:email3};let verified;try{await requireHealthyControlPlane(),verified=await obtain(email3)}catch(error62){let message5=failAction(error62,{email:email3,signedOut:!0});throw new Error(message5)}let previous2=storedAccount(credentials()),refreshingPendingCleanup=!!(previous2&&previous2.userId===verified.user.id&&companionAccountCleanupPending(
8655
+ credentials())),authenticatedPersisted=!1;try{previous2&&previous2.userId!==verified.user.id&&await cleanupCurrentAccount();let existingIdentity=ownString(credentials(),COMPANION_CLIENT_INSTANCE_FIELD),clientInstanceId=UUID.test(existingIdentity)?existingIdentity:newClientInstanceId?.();if(!UUID.test(clientInstanceId??""))throw new Error("A stable computer identity could not be created");return await updateCredentials(document3=>withAuthenticatedAccount(document3,{...verified,clientInstanceId,preserveCleanupPending:refreshingPendingCleanup})),
8656
+ authenticatedPersisted=!0,refreshingPendingCleanup?(await cleanupCurrentAccount({markPending:!1}),settledState()):await provision(verified)}catch(error62){return authenticatedPersisted||await client.signOut(verified.accountToken).catch(()=>{}),failAction(error62,{email:authenticatedPersisted?verified.user.email:previous2?.email??email3,expiredSessionIsSignedOut:authenticatedPersisted}),authenticatedPersisted&&scheduleAutoRetry(error62),settledState()}}),verifyCode=(rawEmail,rawCode)=>signInFlow(
8657
+ rawEmail,email3=>client.verifyOTP(email3,rawCode)),connectLimix=credential=>signInFlow(credential.email,async()=>({accountToken:credential.bearer,user:{id:credential.userId,email:credential.email}})),retryWork=async()=>{if(!configured)return settledState();let account2=storedAccount(credentials());if(!account2)return phase=null,settledState();if(companionAccountCleanupPending(credentials())){phase={status:"connecting",email:account2.email};try{await requireHealthyControlPlane(),await cleanupCurrentAccount(
8658
+ {markPending:!1})}catch(error62){failAction(error62,{email:account2.email,expiredSessionIsSignedOut:!0})}return settledState()}phase={status:"connecting",email:account2.email};try{return await requireHealthyControlPlane(),await provision({accountToken:account2.accountToken,user:{id:account2.userId,email:account2.email}})}catch(error62){return failAction(error62,{email:account2.email,expiredSessionIsSignedOut:!0}),scheduleAutoRetry(error62),settledState()}},retry=()=>serialize(async()=>(requestedAt=
8659
+ now(),retryWork())),reconcileIfEndpointGone=async({onGone=retryWork}={})=>{let document3=credentials(),account2=storedAccount(document3),access2=managedCompanionTunnelAccess(document3);if(!account2||!access2||!account2.installationCredential||companionAccountCleanupPending(document3)||typeof client.getEndpoint!="function")return null;lastEndpointCheck=now();let endpoint;try{endpoint=await client.getEndpoint(account2.installationCredential)}catch(error62){return error62 instanceof ControlPlaneError&&
8660
+ error62.status===401?onGone():null}return endpoint&&endpoint.url===access2.endpoint&&!ENDPOINT_NEEDS_RECONCILE.has(endpoint.status)?null:onGone()},endpointCheckDue=()=>lastEndpointCheck===null||now()-lastEndpointCheck>=endpointCheckIntervalMs/2,recoveryDue=({atLaunch=!1}={})=>{if(!autoRecover||!companionIsOn())return!1;if(atLaunch)return!0;if(autoRetryTimer!==null)return!1;let connection=managedConnectionState?.()??{};return WATCHDOG_CHECK_STATES.has(connection.status)&&endpointCheckDue()},requestedRecently=()=>requestedAt!==
8661
+ null&&now()-requestedAt<REQUEST_WINDOW_MS,savedAddress=document3=>normalizeManagedCompanionEndpoint(document3[MANAGED_COMPANION_ENDPOINT_FIELD]),phonesUnused=!1,currentNeed=async()=>{let answer=await Promise.resolve().then(()=>managedEndpointNeeded()).catch(()=>null);phonesUnused=answer===MANAGED_ENDPOINT_PHONES_UNUSED;let need=phonesUnused?!1:typeof answer=="boolean"?answer:null;return need===!1&&relay.capable()?!1:requestedRecently()?(phonesUnused=!1,!0):need},releaseScheduledAt=()=>{let at2=credentials()[MANAGED_COMPANION_RELEASE_AT_FIELD];
8662
+ return Number.isSafeInteger(at2)&&at2>0?at2:null},cancelRelease=async()=>{releaseScheduledAt()!==null&&await updateCredentials(document3=>{let next={...document3};return delete next[MANAGED_COMPANION_RELEASE_AT_FIELD],next})},releaseAddress=async()=>{let need=await currentNeed(),pause2=phonesUnused;if(need!==!1)return need&&await cancelRelease(),settledState();let document3=credentials(),account2=storedAccount(document3);if(!account2?.installationCredential||!managedCompanionTunnelAccess(document3)||
8663
+ companionAccountCleanupPending(document3))return settledState();await stopManagedEndpoint();let removalPending=!1;try{await client.deleteEndpoint(account2.installationCredential)}catch(error62){if(removalPending=error62 instanceof ControlPlaneError&&error62.code==="endpoint_cleanup_pending",!(removalPending||error62 instanceof ControlPlaneError&&error62.status===401))return writeLog(error62 instanceof ControlPlaneError?`companion account: could not give the secure address back code=${error62.code}\
8664
+ status=${error62.status||"none"} ref=${error62.requestId||"none"}`:"companion account: could not give the secure address back (not a control-plane answer)"),await activatePersistedEndpoint(),settledState()}return await updateCredentials(current=>({...withoutManagedCompanionTunnelAccess(current),...removalPending?{[COMPANION_ENDPOINT_RELEASE_PENDING_FIELD]:!0}:{},...pause2?{[COMPANION_ENDPOINT_PAUSED_FIELD]:!0}:{}})),resetAutoRetry(),phase=null,writeLog(pause2?"companion account: gave the secure\
8665
+ address back; no paired phone was used in 30 days":"companion account: gave the secure address back; no device needs it"),settledState()},reviewAddress=async({atLaunch=!1}={})=>{let document3=credentials();if(!storedAccount(document3)||companionAccountCleanupPending(document3))return null;if(!managedCompanionTunnelAccess(document3)){let waiting2=document3[COMPANION_TUNNEL_WAITING_FIELD]===!0;return!savedAddress(document3)&&!waiting2||autoRetryTimer!==null?null:await currentNeed()===!0?retryWork():
8666
+ null}let need=await currentNeed();if(need!==!1)return need&&await cancelRelease(),need===null&&atLaunch?null:recoveryDue({atLaunch})?reconcileIfEndpointGone():null;let releaseAt=releaseScheduledAt();if(releaseAt!==null&&now()>=releaseAt)return releaseAddress();let connection=managedConnectionState?.()??{};if(companionIsOn()&&CONNECTOR_FAILING_STATES.has(connection.status)&&(atLaunch||endpointCheckDue())){let released=await reconcileIfEndpointGone({onGone:releaseAddress});if(released)return released}
8667
+ if(releaseAt===null||releaseAt-now()>releaseGraceMs+releaseJitterMs){let delay3=releaseGraceMs+Math.round(random()*releaseJitterMs);await updateCredentials(current=>managedCompanionTunnelAccess(current)?{...current,[MANAGED_COMPANION_RELEASE_AT_FIELD]:now()+delay3}:current),writeLog(`companion account: no device needs the secure address; giving it back in ${Math.round(delay3/6e4)} min`)}return null},retryIfWanted=async()=>requestedRecently()||savedAddress(credentials())&&await currentNeed()!==!1?
8668
+ retryWork():(resetAutoRetry(),phase?.status==="error"&&(phase=null),writeLog("companion account: stopped retrying; no device needs a secure address"),settledState());retryFromTimer=()=>serialize(onDemand?retryIfWanted:retryWork);let prepare=()=>serialize(async()=>{let document3=credentials();if(!configured||!companionIsOn()||!storedAccount(document3)||companionAccountCleanupPending(document3))return settledState();if(requestedAt=now(),!managedCompanionTunnelAccess(document3))return retryWork();await cancelRelease();
8669
+ let connection=managedConnectionState?.()??{};if(["stopped","unconfigured"].includes(connection.status))await activatePersistedEndpoint();else if(CONNECTOR_FAILING_STATES.has(connection.status)){let repaired=await reconcileIfEndpointGone();if(repaired)return repaired}return settledState()}),watchdogTick=()=>{if(watchdogTimer=null,!disposed&&(watchdogTimer=setTimer(watchdogTick,endpointCheckIntervalMs),phase?.status!=="signed-out")){if(onDemand){serialize(()=>reviewAddress()).catch(()=>{});return}
8670
+ recoveryDue()&&serialize(()=>reconcileIfEndpointGone()).catch(()=>{})}},startWatchdog=()=>{!(autoRecover||onDemand)||disposed||!configured||watchdogTimer!==null||(watchdogTimer=setTimer(watchdogTick,firstEndpointCheckMs))};return Object.freeze({state:async()=>(await probeControlPlane(),settledState()),requestCode,verifyCode,connectLimix,retry,prepare,signOut:()=>serialize(async()=>{if(resetAutoRetry(),!storedAccount(credentials()))return await clearAfterCleanup(),settledState();let email3=storedAccount(
8671
+ credentials())?.email;phase={status:"connecting",email:email3};try{return await cleanupCurrentAccount(),healthy=!0,lastHealthCheck=now(),settledState()}catch(error62){return failAction(error62,{email:email3}),settledState()}}),restore:()=>serialize(async()=>{if(!configured||(startWatchdog(),!await probeControlPlane({force:!0})))return settledState();if(companionAccountCleanupPending(credentials()))return retryWork();if(await ensureClientIdentity(),onDemand){let reviewed=await reviewAddress({atLaunch:!0});
8672
+ return reviewed||(phase=null,settledState())}let account2=storedAccount(credentials());if(account2&&!managedCompanionTunnelAccess(credentials()))return retryWork();if(autoRecover&&account2&&companionIsOn()){let reconciled=await reconcileIfEndpointGone();if(reconciled)return reconciled}return phase=null,settledState()}),dispose:()=>{disposed=!0,cancelAutoRetry(),watchdogTimer!==null&&clearTimer(watchdogTimer),watchdogTimer=null}})}var SIGNIN_CODE_TTL_MS=10*6e4;init_user_errors();function parseAllowList(value){return(value??"").split(/[,\s]+/).map(entry=>entry.trim().toLowerCase()).filter(Boolean)}var NOT_WELCOME={ok:!1,status:403,...userError("serverError.email.notAllowed")};init_decision_log();init_redact2();init_usage_ledger();import{appendFile as appendFile2,mkdir as mkdir2}from"node:fs/promises";import{basename as basename2,join as join2}from"node:path";var DIR2="admin-activity";var PRUNE_EVERY_MS2=60*6e4,writeQueues2=new Map,lastPrune2=new Map;function adminActivityFileFor(dataDir,at2){return join2(dataDir,DIR2,`${monthKey(at2)}.ndjson`)}async function writeRow(dataDir,row){let at2=new Date(row.at);await mkdir2(join2(dataDir,DIR2),{recursive:!0,mode:448}),await appendFile2(adminActivityFileFor(dataDir,at2),JSON.stringify(row)+`
8673
8673
  `,{mode:384}),at2.getTime()-(lastPrune2.get(dataDir)??0)>=PRUNE_EVERY_MS2&&(lastPrune2.set(dataDir,at2.getTime()),await pruneMonthFiles(join2(dataDir,DIR2),boundRetentionDays(),at2))}function appendAdminAction(dataDir,row){let record12={...row,at:row.at??new Date().toISOString(),...row.before?{before:auditValues(row.before)}:{},...row.after?{after:auditValues(row.after)}:{}},queued=(writeQueues2.get(dataDir)??Promise.resolve()).then(()=>writeRow(dataDir,record12)).catch(()=>{});writeQueues2.set(
8674
8674
  dataDir,queued),queued.finally(()=>{writeQueues2.get(dataDir)===queued&&writeQueues2.delete(dataDir)})}async function flushAdminActivity(dataDir){await writeQueues2.get(dataDir)}var SECRET_PARTS=["token","secret","password","passwd","passphrase","credential","authorization","cookie","bearer","apikey","api_key"],OPAQUE_MAP=/^(?:headers|env|environment)$/i,MAX_VALUE_CHARS=2e3,HIDDEN="[hidden]";function isSecretName2(name){let lower=name.toLowerCase();return lower.endsWith("tokens")?!1:SECRET_PARTS.some(part=>lower.includes(part))?!0:/(?:^|[_.-])keys?$/.test(lower)||/[a-z]Keys?$/.test(name)}function isSecretParameter(name){
8675
8675
  if(name==="-k"||name==="-K")return!0;let bare=name.replace(/^-+/,"");return isSecretName2(bare)||/^(?:auth|sig|signature|pass|pwd|code)$/i.test(bare)}function keyLikeSegment(segment){return(segment.match(/[A-Za-z0-9]{16,}/g)??[]).some(run6=>/\d/.test(run6)&&/[A-Za-z]/.test(run6))}function maskUrlSecrets(text13){return text13.replace(/\b([a-z][\w+.-]*:\/\/)([^\s/?#]*)([^\s?#]*)([^\s]*)/gi,(_all,scheme,authority2,path3,rest)=>{let at2=authority2.lastIndexOf("@"),host2=at2>=0?`${HIDDEN}@${authority2.
@@ -8695,7 +8695,7 @@ options2.binary,["run","--config",configFile,"--adapter","caddyfile"],{env:{...o
8695
8695
  `);throw new Error(`Caddy stopped right after starting (exit ${settled.code}).
8696
8696
  ${reason}`)}return{configFile,exited,stop:async()=>{child.exitCode!==null||child.signalCode!==null||(child.kill("SIGTERM"),await Promise.race([exited,new Promise(r2=>setTimeout(r2,5e3))]),child.exitCode===null&&child.signalCode===null&&child.kill("SIGKILL"))}}}function normalizeDomainOption(raw){let value=raw.trim().toLowerCase().replace(/^https?:\/\//,"").replace(/\/+$/,""),label2=/^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/;return!value||value.length>253||!value.includes(".")||/[\s/:@?#]/.test(value)||
8697
8697
  !value.split(".").every(part=>label2.test(part))?{error:"--domain takes a bare hostname such as maus.example.com"}:/(?:^|\.)(?:localhost|local|internal|invalid)$/.test(value)?{error:"--domain needs a public domain name that resolves to this machine"}:value}import{spawnSync as spawnSync2}from"node:child_process";import{existsSync as existsSync4,mkdirSync as mkdirSync2,readFileSync as readFileSync2,writeFileSync as writeFileSync3}from"node:fs";import{homedir as homedir3}from"node:os";import{dirname as dirname4,join as join7}from"node:path";import{homedir,userInfo}from"node:os";import{posix}from"node:path";var{basename:basename3,dirname:dirname2,join:join5}=posix,SYSTEMD_UNIT_NAME="openmausbot.service",LAUNCHD_LABEL="com.openmausbot.serve";function quoteSystemd(value){return/[\s"\\]/.test(value)?`"${value.replace(/[\\"]/g,"\\$&")}"`:value}function needsStripTypes(script){return script.endsWith(".ts")}function serviceCommand(spec){return[spec.node,...needsStripTypes(spec.script)?["--experimental-strip-types"]:[],spec.script,"serve",
8698
- ...spec.serveArgs]}function systemdUnit(spec){let lines2=["# Written by `openmausbot service install`. Re-run it to change the options.","[Unit]",`Description=OpenMausBot${spec.label?` (${spec.label})`:""}`,"After=network-online.target","Wants=network-online.target","","[Service]","Type=simple",`User=${spec.user}`,`WorkingDirectory=${spec.home}`,`Environment=HOME=${spec.home}`,`Environment=OMB_DATA_DIR=${spec.dataDir}`,...spec.cliPrefix?[`Environment=${quoteSystemd(`OMB_CLI_PREFIX=${spec.cliPrefix}`)}`]:
8698
+ ...spec.serveArgs]}function systemdUnit(spec){let lines2=["# Written by `openmausbot service install`. Re-run it to change the options.","[Unit]",`Description=Limix Bot${spec.label?` (${spec.label})`:""}`,"After=network-online.target","Wants=network-online.target","","[Service]","Type=simple",`User=${spec.user}`,`WorkingDirectory=${spec.home}`,`Environment=HOME=${spec.home}`,`Environment=OMB_DATA_DIR=${spec.dataDir}`,...spec.cliPrefix?[`Environment=${quoteSystemd(`OMB_CLI_PREFIX=${spec.cliPrefix}`)}`]:
8699
8699
  [],`ExecStart=${serviceCommand(spec).map(quoteSystemd).join(" ")}`,"Restart=always","RestartSec=3","KillMode=mixed","TimeoutStopSec=30"];return spec.bindsLowPorts&&(lines2.push("# serve --domain: Caddy binds ports 80 and 443 without running as root."),lines2.push("AmbientCapabilities=CAP_NET_BIND_SERVICE"),lines2.push("CapabilityBoundingSet=CAP_NET_BIND_SERVICE")),lines2.push("","[Install]","WantedBy=multi-user.target",""),lines2.join(`
8700
8700
  `)}function xml(value){return value.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function launchdPlist(spec){let args=serviceCommand(spec).map(arg=>` <string>${xml(arg)}</string>`).join(`
8701
8701
  `);return['<?xml version="1.0" encoding="UTF-8"?>','<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">','<plist version="1.0">',"<dict>"," <key>Label</key>",` <string>${LAUNCHD_LABEL}</string>`," <key>ProgramArguments</key>"," <array>",args," </array>"," <key>EnvironmentVariables</key>"," <dict>"," <key>HOME</key>",` <string>${xml(spec.home)}</string>`," <key>OMB_DATA_DIR</key>",` <string>${xml(spec.dataDir)}</string>`,...spec.cliPrefix?[" \
@@ -202,6 +202,8 @@ const featureConfigSchema = z.object({
202
202
  skillAuthoring: z.boolean().optional(),
203
203
  /** The bot's engine reviews long conversations and updates its learned skills. Off unless true; needs skillAuthoring. */
204
204
  skillReview: z.boolean().optional(),
205
+ /** A skill the review learns is added at once. On unless false; off, the owner is asked first. */
206
+ skillAutoApply: z.boolean().optional(),
205
207
  /** Tool steps in one conversation between automatic reviews. */
206
208
  skillReviewSteps: z.number().int().min(3).max(100).optional(),
207
209
  /** Show each tool run in the transcript. Off unless explicitly enabled. */
@@ -502,8 +504,11 @@ export function skillAuthoringEnabled(cfg) {
502
504
  export const DEFAULT_SKILL_REVIEW_STEPS = 10;
503
505
  export const MIN_SKILL_REVIEW_STEPS = 3;
504
506
  export const MAX_SKILL_REVIEW_STEPS = 100;
507
+ export function skillAutoApplyEnabled(cfg) {
508
+ return cfg.features?.skillAutoApply !== false;
509
+ }
505
510
  export function skillReviewEnabled(cfg) {
506
- return skillAuthoringEnabled(cfg) && cfg.features?.skillReview === true;
511
+ return skillAuthoringEnabled(cfg) && cfg.features?.skillReview !== false;
507
512
  }
508
513
  export function skillReviewSteps(cfg) {
509
514
  const raw = cfg.features?.skillReviewSteps;
@@ -21,8 +21,8 @@ export const BASE_IMAGE_DIGEST = "sha256:274eb636f5cf3fc58f705916ee72b7a701270b3
21
21
  export const BASE_IMAGE = `${BASE_IMAGE_REPOSITORY}@${BASE_IMAGE_DIGEST}`;
22
22
  // localhost/ is explicit: Podman prepends it to unqualified build tags and may then resolve the name on Docker Hub.
23
23
  // Image and container labels, not this mutable tag, decide compatibility.
24
- export const IMAGE_REPOSITORY = "localhost/openmausbot/cua-local-vm";
25
- export const IMAGE_LAYER_VERSION = "8";
24
+ export const IMAGE_REPOSITORY = "localhost/limixbot/cua-local-vm";
25
+ export const IMAGE_LAYER_VERSION = "9";
26
26
  export const IMAGE_LAYER_LABEL = "com.openmausbot.image-layer";
27
27
  export const IMAGE = `${IMAGE_REPOSITORY}:driver-${CUA_DRIVER_VERSION}-v${IMAGE_LAYER_VERSION}`;
28
28
  export const CONTAINER = "openmausbot-computer";
@@ -34,8 +34,8 @@ export const TARGET_LABEL = "com.openmausbot.local-vm-target";
34
34
  export const VM_WORKSPACE_DIR = join(DATA_DIR, "vm-home");
35
35
  export const VM_WORKSPACE_GUEST = "/home/cua/workspace";
36
36
  export const DISPLAY = ":1";
37
- export const CUA_SOCKET = "/run/user/1000/openmausbot-cua.sock";
38
- export const CUA_EXECUTABLE = "/usr/local/libexec/openmausbot/cua-driver";
37
+ export const CUA_SOCKET = "/run/user/1000/limixbot-cua.sock";
38
+ export const CUA_EXECUTABLE = "/usr/local/libexec/limixbot/cua-driver";
39
39
  const RUNTIMES = ["docker", "podman", "container"];
40
40
  const INTERNAL_VIEWER_PORT = 6901;
41
41
  const HOST_VIEWER_PORT = 6080;
@@ -322,7 +322,7 @@ export function createTeamConnectionsHost(deps) {
322
322
  const these = `${list(names)} ${names.length === 1 ? "is" : "are"} each person's own in ${team.name}`;
323
323
  return hasOwn(acting)
324
324
  ? ` ${these}, used only in a chat that is theirs alone. Others read this chat, so ${who}'s own aren't here: what they bring back would be read here. If the task needs one, don't try it another way (the browser or another tool). ${handOnHow(who)}`
325
- : ` ${these}, and ${who} 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 MausBot Cloud"}".`;
325
+ : ` ${these}, and ${who} 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"}".`;
326
326
  }
327
327
  if (!person) {
328
328
  const where = appsPage();
@@ -339,7 +339,7 @@ export function createTeamConnectionsHost(deps) {
339
339
  return (ownApps.length ? ` ${list(ownApps.map(appLabel))} ${ownApps.length === 1 ? "is" : "are"} ${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.` : "")
340
340
  + (ownServers.length ? ` The MCP ${ownServers.length === 1 ? "server" : "servers"} ${list(ownServers)} act${ownServers.length === 1 ? "s" : ""} as ${whose} own account.` : "")
341
341
  + (ownApps.length || ownServers.length ? ` ${only}` : "")
342
- + (missing.length ? ` Each person connects these for themselves, and ${who} hasn't connected ${missing.length === 1 ? "it" : "them"} yet, or their sign-in ended: ${list(missing)}. 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: ${where ?? "your team's page in MausBot Cloud"}".` : "");
342
+ + (missing.length ? ` Each person connects these for themselves, and ${who} hasn't connected ${missing.length === 1 ? "it" : "them"} yet, or their sign-in ended: ${list(missing)}. 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: ${where ?? "your team's page in Limix Bot Cloud"}".` : "");
343
343
  },
344
344
  /** Whose own account a tool call uses, for its step ("using Ada's Notion"): a `person` app through their own bridge,
345
345
  * or a `person` MCP server, in a turn that acts for them. Empty for anything else. */