@runeya/apps-cli 0.1.1 → 0.1.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.
- package/dist/agent/index.js +5303 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent-manager-3S4FUNJS-MYT5X6XQ.js +8 -0
- package/dist/agent-manager-3S4FUNJS-MYT5X6XQ.js.map +1 -0
- package/dist/chunk-32HTB3XS.js +350 -0
- package/dist/chunk-32HTB3XS.js.map +1 -0
- package/dist/chunk-ERJIU7R4.js +195 -0
- package/dist/chunk-ERJIU7R4.js.map +1 -0
- package/dist/chunk-XZPCEGWS.js +2452 -0
- package/dist/chunk-XZPCEGWS.js.map +1 -0
- package/dist/dist-MFM5N25P.js +10985 -0
- package/dist/dist-MFM5N25P.js.map +1 -0
- package/dist/index.js.map +1 -0
- package/dist/kanban-commands-VEVMJTFS-OIYWEHUP.js +14 -0
- package/dist/kanban-commands-VEVMJTFS-OIYWEHUP.js.map +1 -0
- package/dist/package.json +36 -0
- package/dist/runeya +4 -0
- package/dist/web/assets/AddressBar.vue-dB66q4DS.js +1 -0
- package/dist/web/assets/AgentPage-B3wrH3gG.js +2 -0
- package/dist/web/assets/AgentPage-BTWkJvqr.css +1 -0
- package/dist/web/assets/AgentScalarChatInterface.vue-CJVuZIB9.js +13 -0
- package/dist/web/assets/AgentTerminalPage-Cj5fRr-j.js +36 -0
- package/dist/web/assets/AgentTerminalPage-EX_n6P3x.css +1 -0
- package/dist/web/assets/AiChatPage-Dhsx3B9B.js +1 -0
- package/dist/web/assets/ApiDocsPage-BddLJuUF.js +5 -0
- package/dist/web/assets/ApiDocsPage-D2Z0wqGZ.css +1 -0
- package/dist/web/assets/AppLayout-AfhaeKlp.js +1 -0
- package/dist/web/assets/AppLayout-sngalCCj.css +1 -0
- package/dist/web/assets/AuditPage-BBV9FW9y.css +1 -0
- package/dist/web/assets/AuditPage-DqycuiVb.js +1 -0
- package/dist/web/assets/CodeInput.vue-Dyew7ml-.js +1 -0
- package/dist/web/assets/Collection.vue-DePdVAHM.js +1 -0
- package/dist/web/assets/CollectionAuthentication.vue-DagSEg45.js +1 -0
- package/dist/web/assets/CollectionCookies.vue-vMKPCgg1.js +1 -0
- package/dist/web/assets/CollectionEnvironment.vue-B0JkZ6GC.js +1 -0
- package/dist/web/assets/CollectionOverview.vue-Bm7OsMWM.js +1 -0
- package/dist/web/assets/CollectionScripts.vue-CZiBq0rT.js +1 -0
- package/dist/web/assets/CollectionServers.vue-bziJbP-5.js +1 -0
- package/dist/web/assets/CollectionSettings.vue-D4oBu-fT.js +1 -0
- package/dist/web/assets/CollectionSync.vue-BG50-Lo4.js +1 -0
- package/dist/web/assets/CommandActionInput.vue-DmZld2w7.js +1 -0
- package/dist/web/assets/Cookies.vue-DjxMLL79.js +1 -0
- package/dist/web/assets/DashboardPage-QjYCF0Kd.js +1 -0
- package/dist/web/assets/DashboardPage-gZJ4_s8T.css +1 -0
- package/dist/web/assets/DataTable.vue-BV9IuUNB.js +1 -0
- package/dist/web/assets/DataTableCheckbox.vue-Cx0exaNK.js +1 -0
- package/dist/web/assets/DataTableHeader.vue-ZtUdyiLV.js +1 -0
- package/dist/web/assets/DataTableInput.vue-C4NF8kJn.js +1 -0
- package/dist/web/assets/DeleteSidebarListElement.vue-CcAW4Pdn.js +1 -0
- package/dist/web/assets/EditSidebarListElement.vue-Crbagha4.js +1 -0
- package/dist/web/assets/EditorIcon-BaDORp4k.js +15 -0
- package/dist/web/assets/EditorIcon-zS3bHXe1.css +1 -0
- package/dist/web/assets/EmptyState.vue-2hJbVxAi.js +22 -0
- package/dist/web/assets/Environment.vue-CcERFnQq.js +1 -0
- package/dist/web/assets/EnvironmentForm-DSKxdDGW.js +108 -0
- package/dist/web/assets/EnvironmentForm-DVMc303P.css +1 -0
- package/dist/web/assets/EnvironmentFormPage-BDhR07CG.js +1 -0
- package/dist/web/assets/EnvironmentFormPage-OaDJvyrc.css +1 -0
- package/dist/web/assets/EnvironmentListPage-BDqcug66.css +1 -0
- package/dist/web/assets/EnvironmentListPage-BzdxgZdS.js +1 -0
- package/dist/web/assets/EnvironmentModal.vue-DvsPa6V9.js +1 -0
- package/dist/web/assets/EnvironmentSelector-B9SZvB3I.css +1 -0
- package/dist/web/assets/EnvironmentSelector-BWljvJWP.js +1 -0
- package/dist/web/assets/Form.vue-BxhIukSx.js +1 -0
- package/dist/web/assets/IconSelector.vue-SxFpYToZ.js +1 -0
- package/dist/web/assets/KanbanBoardPage-7nOYpwHn.css +1 -0
- package/dist/web/assets/KanbanBoardPage-Bbyn-iLC.js +141 -0
- package/dist/web/assets/KanbanListPage-BEX3MKW0.js +1 -0
- package/dist/web/assets/KanbanListPage-DbdjvTCx.css +1 -0
- package/dist/web/assets/LaunchProjectPage-DB_XBa86.js +1 -0
- package/dist/web/assets/LaunchProjectPage-_L_i2xo0.css +1 -0
- package/dist/web/assets/LaunchServicesPage-BABQz-ey.css +1 -0
- package/dist/web/assets/LaunchServicesPage-fmsU-_p0.js +1 -0
- package/dist/web/assets/LogViewer-CJcXcTP0.css +1 -0
- package/dist/web/assets/LogViewer-CV9OmAb1.js +3 -0
- package/dist/web/assets/ProcessControls-CKmB6sB9.css +1 -0
- package/dist/web/assets/ProcessControls-L_hld0kN.js +1 -0
- package/dist/web/assets/ProcessDetailPage-B0qGKtvQ.css +1 -0
- package/dist/web/assets/ProcessDetailPage-CW0F6wvO.js +1 -0
- package/dist/web/assets/ProcessMetrics-BgEFMdnW.css +1 -0
- package/dist/web/assets/ProcessMetrics-D2vCK15o.js +1 -0
- package/dist/web/assets/ProjectDetailPage-Bo04MsdE.js +1 -0
- package/dist/web/assets/ProjectDetailPage-CZBB6F-t.css +1 -0
- package/dist/web/assets/ProjectListPage-BGU6SKAr.css +1 -0
- package/dist/web/assets/ProjectListPage-CG-r82FQ.js +1 -0
- package/dist/web/assets/RandomJobTestPage-C1mgTTSY.css +1 -0
- package/dist/web/assets/RandomJobTestPage-COnuE_dj.js +2 -0
- package/dist/web/assets/Request.vue-CeAzdpVl.js +1 -0
- package/dist/web/assets/RequestAuth.vue-DABBKM9M.js +1 -0
- package/dist/web/assets/RequestRoot.vue-CRaiGtgb.js +19 -0
- package/dist/web/assets/ScalarAsciiArt.vue-mR3JflbN.js +2 -0
- package/dist/web/assets/ScalarIconEyeSlash.vue-JQCpS43o.js +1 -0
- package/dist/web/assets/ScalarIconTrash.vue-D7zGeCPC.js +1 -0
- package/dist/web/assets/ScenarioEditorPage-BVnDp-fS.js +14 -0
- package/dist/web/assets/ScenarioEditorPage-CfBKebp6.css +1 -0
- package/dist/web/assets/ServerVariablesForm.vue-DbVG31Dx.js +1 -0
- package/dist/web/assets/ServiceControlsBar-Cp2VUifX.js +1 -0
- package/dist/web/assets/ServiceControlsBar-D_S_sGQj.css +1 -0
- package/dist/web/assets/ServiceDetailPage-BriHTCpT.css +1 -0
- package/dist/web/assets/ServiceDetailPage-DMoXJliU.js +2 -0
- package/dist/web/assets/ServiceFormPage-BXTTwyWP.js +1 -0
- package/dist/web/assets/ServiceFormPage-CyY-14jH.css +1 -0
- package/dist/web/assets/Settings.vue-BtjfBYMB.js +1 -0
- package/dist/web/assets/SettingsPage-BFqYvm6R.js +508 -0
- package/dist/web/assets/SettingsPage-vGhb_tlY.css +1 -0
- package/dist/web/assets/SetupKeyPage-CrmikLTx.js +1 -0
- package/dist/web/assets/SetupKeyPage-DoY1Ua1s.css +1 -0
- package/dist/web/assets/SetupPage-CRuL5LXc.js +1 -0
- package/dist/web/assets/SetupPage-_KXpCQSU.css +1 -0
- package/dist/web/assets/Sidebar.vue-CLpz7l3s.js +1 -0
- package/dist/web/assets/SidebarButton.vue-DAvh-OoW.js +1 -0
- package/dist/web/assets/SidebarListElement.vue-CfQ22Epo.js +1 -0
- package/dist/web/assets/UnlockPage-Cx3PYgUl.css +1 -0
- package/dist/web/assets/UnlockPage-UxunGumn.js +1 -0
- package/dist/web/assets/VariablesTable-BtdK5olT.css +1 -0
- package/dist/web/assets/VariablesTable-CKe8mApI.js +1 -0
- package/dist/web/assets/ViewLayout.vue-D30IFsIP.js +1 -0
- package/dist/web/assets/ViewLayoutContent.vue-B4BXKBtQ.js +1 -0
- package/dist/web/assets/ViewLayoutSection.vue-BGkXXzBQ.js +1 -0
- package/dist/web/assets/_plugin-vue_export-helper-C7ztIXtE.js +1 -0
- package/dist/web/assets/abap-C4tHUUCU.js +1 -0
- package/dist/web/assets/active-entities-DMSK8Kvo.js +1 -0
- package/dist/web/assets/apex-6cG6aG-w.js +1 -0
- package/dist/web/assets/api-reference-DUBKG98-.js +1 -0
- package/dist/web/assets/autocomplete-Bx5M86A5.js +308 -0
- package/dist/web/assets/azcli-51BngrSU.js +1 -0
- package/dist/web/assets/base64-uZi92-DX.js +1 -0
- package/dist/web/assets/bat-BDcdVSIt.js +1 -0
- package/dist/web/assets/bicep-Cg0BCcky.js +2 -0
- package/dist/web/assets/cameligo-C3ekVui9.js +1 -0
- package/dist/web/assets/card-6r6P_U-q.js +32 -0
- package/dist/web/assets/checkbox-CQpllPXd.js +141 -0
- package/dist/web/assets/chip-gp-_w98f.js +54 -0
- package/dist/web/assets/clojure-Ci5xNgh_.js +1 -0
- package/dist/web/assets/codicon-DCmgc-ay.ttf +0 -0
- package/dist/web/assets/coffee-xsRz4GKy.js +1 -0
- package/dist/web/assets/column-CE6TbiAC.js +763 -0
- package/dist/web/assets/core-CLjfGkKM.js +1 -0
- package/dist/web/assets/cpp-B2gW4e23.js +1 -0
- package/dist/web/assets/csharp-SRujvHqy.js +1 -0
- package/dist/web/assets/csp-Cr-ll6gP.js +1 -0
- package/dist/web/assets/css-BYTJZCno.js +3 -0
- package/dist/web/assets/cssMode-Bl7Y9u0B.js +4 -0
- package/dist/web/assets/cypher-AmQ0R_D3.js +1 -0
- package/dist/web/assets/dart-Du01a0J5.js +1 -0
- package/dist/web/assets/dist-CNJKy0Au.js +192 -0
- package/dist/web/assets/dist-DGrDIHmK.js +1 -0
- package/dist/web/assets/dist-DkaYBczY.js +1 -0
- package/dist/web/assets/dist-E9g7EMme.js +1 -0
- package/dist/web/assets/dist-wHtavuXf.js +33 -0
- package/dist/web/assets/divider-J1wJyhb6.js +82 -0
- package/dist/web/assets/dockerfile-Dtlk9wqf.js +1 -0
- package/dist/web/assets/ecl-CpmVnLkK.js +1 -0
- package/dist/web/assets/editor.store-CIIP294U.js +1 -0
- package/dist/web/assets/editor.worker-Di51weDy.js +12 -0
- package/dist/web/assets/elixir-B3MVAC8k.js +1 -0
- package/dist/web/assets/fieldset-BRuU3VW2.js +88 -0
- package/dist/web/assets/flow9-Chkly0RN.js +1 -0
- package/dist/web/assets/freemarker2-C-5i2Fhr.js +3 -0
- package/dist/web/assets/fsharp-CZvMkppk.js +1 -0
- package/dist/web/assets/go-dT2iT7lt.js +1 -0
- package/dist/web/assets/graphql-DmObWyBD.js +1 -0
- package/dist/web/assets/handlebars-Bq-uEMhK.js +1 -0
- package/dist/web/assets/hcl-D1x5Oyp4.js +1 -0
- package/dist/web/assets/html-B-mweV_C.js +1 -0
- package/dist/web/assets/htmlMode-BlnuAGDY.js +4 -0
- package/dist/web/assets/index-BRDI9Dib.css +1 -0
- package/dist/web/assets/index-gfmcW9Sb.js +4220 -0
- package/dist/web/assets/ini-Bg2o1S3s.js +1 -0
- package/dist/web/assets/java-XviKSSn5.js +1 -0
- package/dist/web/assets/javascript-D61EWPTf.js +1 -0
- package/dist/web/assets/jsonMode-DmSJWG69.js +10 -0
- package/dist/web/assets/julia-DfTIwUGh.js +1 -0
- package/dist/web/assets/keyboard-nBda2f6m.js +4 -0
- package/dist/web/assets/kotlin-CNaIBh9d.js +1 -0
- package/dist/web/assets/less-D7o76tXd.js +2 -0
- package/dist/web/assets/lexon-Dd374QjV.js +1 -0
- package/dist/web/assets/lib-CegStMAw.js +5 -0
- package/dist/web/assets/library-BwIJAfg0.js +1 -0
- package/dist/web/assets/liquid-BRXADGhu.js +1 -0
- package/dist/web/assets/lua-DZKuiFbY.js +1 -0
- package/dist/web/assets/m3-CbwRx9Bb.js +1 -0
- package/dist/web/assets/markdown-DwLB5Rib.js +1 -0
- package/dist/web/assets/mdx-DXlefD6G.js +1 -0
- package/dist/web/assets/mediaTypes-BtSbXDUA.js +2 -0
- package/dist/web/assets/message-EfwB0RVQ.js +316 -0
- package/dist/web/assets/minus-DCEEn9ly.js +2 -0
- package/dist/web/assets/mips-DLbIq1yM.js +1 -0
- package/dist/web/assets/msdax-D4IjoZ6m.js +1 -0
- package/dist/web/assets/multiselect-BMOAw1qo.js +251 -0
- package/dist/web/assets/mysql-DQL_jy6H.js +1 -0
- package/dist/web/assets/objective-c-D74wM5bv.js +1 -0
- package/dist/web/assets/pascal-5tRlZk4O.js +1 -0
- package/dist/web/assets/pascaligo-CAE4rAEt.js +1 -0
- package/dist/web/assets/password-B0kJu8RE.js +101 -0
- package/dist/web/assets/perl-DREAbuQT.js +1 -0
- package/dist/web/assets/pgsql-DASKdyAW.js +1 -0
- package/dist/web/assets/php-C37ZWqoO.js +1 -0
- package/dist/web/assets/pla-v5u9R8i1.js +1 -0
- package/dist/web/assets/plus-CaknAInj.js +197 -0
- package/dist/web/assets/postiats-Szt5m-7G.js +1 -0
- package/dist/web/assets/powerquery-BzVrUSu3.js +1 -0
- package/dist/web/assets/powershell-BdbPbX_X.js +1 -0
- package/dist/web/assets/pretty-ms-CG-W6pSW.js +202 -0
- package/dist/web/assets/primeicons-C6QP2o4f.woff2 +0 -0
- package/dist/web/assets/primeicons-DMOk5skT.eot +0 -0
- package/dist/web/assets/primeicons-Dr5RGzOO.svg +345 -0
- package/dist/web/assets/primeicons-MpK4pl85.ttf +0 -0
- package/dist/web/assets/primeicons-WjwUDZjB.woff +0 -0
- package/dist/web/assets/process.store-DxDr1XKZ.js +1 -0
- package/dist/web/assets/project.store-CUclo-tf.js +1 -0
- package/dist/web/assets/protobuf-qqDa50tu.js +2 -0
- package/dist/web/assets/pug-Cu20UQ5w.js +1 -0
- package/dist/web/assets/python-BeJzJfgr.js +1 -0
- package/dist/web/assets/qsharp-DcbHL5X7.js +1 -0
- package/dist/web/assets/r-Bvig6Flk.js +1 -0
- package/dist/web/assets/radiobutton-Dpp9kpvR.js +145 -0
- package/dist/web/assets/razor-C8GjTcdm.js +1 -0
- package/dist/web/assets/redis-BxHDcW3-.js +1 -0
- package/dist/web/assets/redshift-B8dvlzjH.js +1 -0
- package/dist/web/assets/restructuredtext-npodtAFM.js +1 -0
- package/dist/web/assets/router-BAq_YY48.js +1 -0
- package/dist/web/assets/ruby-DiofbcJD.js +1 -0
- package/dist/web/assets/rust-BjYid3-m.js +1 -0
- package/dist/web/assets/sb-CzcPAP71.js +1 -0
- package/dist/web/assets/scala-Ci4wFrYi.js +1 -0
- package/dist/web/assets/scheme-D3iWhvP7.js +1 -0
- package/dist/web/assets/scss-DdlqDgmu.js +3 -0
- package/dist/web/assets/settings.store-RtV37pb_.js +1 -0
- package/dist/web/assets/shell-Bawb9gbH.js +1 -0
- package/dist/web/assets/solidity-Z2Sq8PBC.js +1 -0
- package/dist/web/assets/sophia--yD-H1Ow.js +1 -0
- package/dist/web/assets/sparql-0vv3-wLi.js +1 -0
- package/dist/web/assets/sql-0gdWKhmJ.js +1 -0
- package/dist/web/assets/st-rE-x-DTZ.js +1 -0
- package/dist/web/assets/store-BSUCffsu.js +1840 -0
- package/dist/web/assets/style-4Pk2icOw.css +1 -0
- package/dist/web/assets/swift-CSKeG8Ne.js +1 -0
- package/dist/web/assets/systemverilog-CblNM3Im.js +1 -0
- package/dist/web/assets/tabpanel-CXo9Yhvl.js +150 -0
- package/dist/web/assets/tag-BsP7PdQ9.js +54 -0
- package/dist/web/assets/tcl-BYnzj-GZ.js +1 -0
- package/dist/web/assets/toggleswitch-C0fuTzJt.js +115 -0
- package/dist/web/assets/trpc-DgyerAaK.js +1 -0
- package/dist/web/assets/ts.worker-DHQ2j8_R.js +51339 -0
- package/dist/web/assets/tsMode-CaqfXb40.js +11 -0
- package/dist/web/assets/twig-DiGWiEtp.js +1 -0
- package/dist/web/assets/typescript-D23_zyMA.js +1 -0
- package/dist/web/assets/typespec-a6xMcpXw.js +1 -0
- package/dist/web/assets/urls-D4kou9RH.js +12 -0
- package/dist/web/assets/use-tree-walker-BebEauYQ.js +1 -0
- package/dist/web/assets/useAiChatDrawer-DDBZQU71.js +1 -0
- package/dist/web/assets/useClipboard-BgE-EP5h.js +1 -0
- package/dist/web/assets/useLayout-BtC8xLAa.js +1 -0
- package/dist/web/assets/usePluginManager-MFUURiUn.js +1 -0
- package/dist/web/assets/useSidebar-DC34K6Vb.js +1 -0
- package/dist/web/assets/uuid-B9GFVXPm.js +1 -0
- package/dist/web/assets/vb---51HVMC.js +1 -0
- package/dist/web/assets/vue-router-CCwpUNtv.js +1 -0
- package/dist/web/assets/w3c-keyname-DDCGDLuI.js +1 -0
- package/dist/web/assets/wgsl-2A8z4pT5.js +298 -0
- package/dist/web/assets/xml-e0SmIpRt.js +1 -0
- package/dist/web/assets/yaml-ChhAbF6s.js +1 -0
- package/dist/web/index.html +14 -0
- package/package.json +7 -7
- package/Dockerfile +0 -54
- package/scripts/post-build.mjs +0 -61
- package/src/__tests__/cli-port.test.ts +0 -93
- package/src/index.ts +0 -298
- package/src/port-resolution.ts +0 -19
- package/tsconfig.json +0 -9
- package/tsup.config.bundled_lh0xis3zdq.mjs +0 -10
- package/tsup.config.bundled_qj1zdvku09a.mjs +0 -10
- package/tsup.config.ts +0 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../server/src/services/agent-manager.ts","../../server/src/services/agent-store.ts","../../server/src/services/service-store.ts","../../server/src/services/environment-store.ts","../../../packages/shared/src/schemas/user.schema.ts","../../../packages/shared/src/schemas/org.schema.ts","../../../packages/shared/src/schemas/project.schema.ts","../../../packages/shared/src/schemas/service.schema.ts","../../../packages/shared/src/schemas/settings.schema.ts","../../../packages/shared/src/schemas/scenario.schema.ts","../../../packages/shared/src/schemas/log-source.schema.ts","../../../packages/shared/src/schemas/process.schema.ts","../../../packages/shared/src/schemas/log.schema.ts","../../../packages/shared/src/schemas/agent.schema.ts","../../../packages/shared/src/schemas/permission.schema.ts","../../../packages/shared/src/schemas/sync.schema.ts","../../../packages/shared/src/schemas/audit.schema.ts","../../../packages/shared/src/schemas/metrics.schema.ts","../../../packages/shared/src/schemas/environment.schema.ts","../../../packages/shared/src/schemas/environment-overrides.schema.ts","../../../packages/shared/src/schemas/api-key.schema.ts","../../../packages/shared/src/schemas/image.schema.ts","../../../packages/shared/src/schemas/kanban.schema.ts","../../../packages/shared/src/utils/crypto.ts","../../../packages/shared/src/native-parsers.ts","../../../packages/shared/src/js-log-parser.ts","../../../packages/shared/src/constants/intervals.ts","../../../packages/shared/src/constants/buffers.ts","../../../packages/shared/src/constants/timeouts.ts","../../../packages/shared/src/constants/editors.ts","../../server/src/services/agent-spawner.ts","../../server/src/services/traefik-manager.ts","../../server/src/services/agent-ws-bridge.ts"],"sourcesContent":["import { EventEmitter } from 'node:events';\nimport WebSocket from 'ws';\nimport { z } from 'zod';\nimport { agentStore } from './agent-store.js';\nimport { serviceStore } from './service-store.js';\nimport { agentSpawner } from './agent-spawner.js';\nimport { traefikManager } from './traefik-manager.js';\nimport { AgentWSBridge } from './agent-ws-bridge.js';\nimport {\n WS_RECONNECT_MIN,\n WS_RECONNECT_MAX,\n AGENT_HEALTH_POLL_INTERVAL,\n AGENT_FETCH_TIMEOUT,\n AGENT_LONG_FETCH_TIMEOUT,\n TraefikConfigSchema,\n} from '@runeya/packages-shared';\nimport type { AgentConfig, AgentStatus } from '@runeya/packages-shared';\n\nconst HealthMessageSchema = z.object({\n status: z.string(),\n uptime: z.number(),\n runnersAvailable: z.array(z.enum(['native', 'docker'])),\n processCount: z.number(),\n runningCount: z.number(),\n lanIp: z.string().optional(),\n});\n\ninterface AgentConnection {\n config: AgentConfig;\n status: AgentStatus;\n healthWs?: WebSocket;\n bridge?: AgentWSBridge;\n reconnectTimer?: ReturnType<typeof setTimeout>;\n reconnectDelay: number;\n aliveTimer?: ReturnType<typeof setTimeout>;\n}\n\nconst MIN_RECONNECT_DELAY = WS_RECONNECT_MIN;\nconst MAX_RECONNECT_DELAY = WS_RECONNECT_MAX;\nconst ALIVE_TIMEOUT = AGENT_HEALTH_POLL_INTERVAL;\n\nfunction resolvePassthroughValues(names: string[]): Record<string, string> {\n const values: Record<string, string> = {};\n for (const name of names) {\n if (process.env[name] !== undefined) {\n values[name] = process.env[name]!;\n }\n }\n return values;\n}\n\nclass AgentManager extends EventEmitter {\n private connections: Map<string, AgentConnection> = new Map();\n\n constructor() {\n super();\n // Each WS client subscribes to up to 4 process event types + 1 agent status,\n // plus 1 bridge fan-out per agent. Two browser tabs = 10+ listeners easily.\n this.setMaxListeners(50);\n }\n\n // Make an authenticated fetch call to an agent's tRPC endpoint\n private async agentCall<T>(agent: AgentConfig, path: string, input?: unknown, method: 'GET' | 'POST' = 'GET', timeout = AGENT_FETCH_TIMEOUT): Promise<T> {\n const url = new URL(`/api/trpc/${path}`, agent.url);\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${agent.passphrase}`,\n 'Content-Type': 'application/json',\n };\n\n // console.log(`[agent-manager] Calling agent ${agent.id} → ${method} ${path}`);\n\n let response: Response;\n try {\n if (method === 'GET') {\n if (input !== undefined) {\n url.searchParams.set('input', JSON.stringify(input));\n }\n response = await fetch(url.toString(), { headers, signal: AbortSignal.timeout(timeout) });\n } else {\n response = await fetch(url.toString(), {\n method: 'POST',\n headers,\n body: JSON.stringify(input !== undefined ? input : {}),\n signal: AbortSignal.timeout(timeout),\n });\n }\n } catch (err: unknown) {\n console.error('[agent-manager] Agent call failed (' + method + ' ' + path + '):', err instanceof Error ? err.message : String(err)); // nosemgrep: unsafe-formatstring\n throw err;\n }\n\n if (!response.ok) {\n let agentMessage = '';\n try {\n const errBody = await response.json() as { error?: { message?: string }; message?: string };\n agentMessage = errBody?.error?.message ?? errBody?.message ?? '';\n } catch { /* ignore parse errors */ }\n const detail = agentMessage ? `: ${agentMessage}` : '';\n console.error('[agent-manager] Agent call failed: HTTP', response.status, 'for', method, path, detail);\n throw new Error(`Agent call failed: HTTP ${response.status}${detail}`);\n }\n\n const json = await response.json() as { error?: { message?: string }; result?: { data?: T } };\n if (json.error) {\n console.error('[agent-manager] Agent error on', path + ':', json.error);\n throw new Error(`Agent error on ${path}: ${json.error.message ?? 'unknown'}`);\n }\n return json.result?.data as T;\n }\n\n // Query wrapper\n async agentQuery<T>(agentId: string, path: string, input?: unknown): Promise<T> {\n const agent = this.getAgent(agentId);\n if (!agent) throw new Error(`Agent ${agentId} not found`);\n return this.agentCall<T>(agent.config, path, input, 'GET');\n }\n\n // Mutation wrapper\n async agentMutation<T>(agentId: string, path: string, input?: unknown, timeout?: number): Promise<T> {\n const agent = this.getAgent(agentId);\n if (!agent) throw new Error(`Agent ${agentId} not found`);\n return this.agentCall<T>(agent.config, path, input, 'POST', timeout);\n }\n\n /**\n * Open a dynamic tRPC subscription on the agent's WS bridge.\n * Returns an unsubscribe function.\n * Used for per-session streaming (e.g. terminal.onData).\n */\n agentSubscribe(\n agentId: string,\n path: string,\n input: unknown,\n onData: (data: unknown) => void,\n onStop?: () => void,\n ): () => void {\n const conn = this.connections.get(agentId);\n if (!conn?.bridge) throw new Error(`Agent ${agentId} not connected via WebSocket`);\n return conn.bridge.subscribeWithInput(path, input, onData, onStop);\n }\n\n async init(): Promise<void> {\n const agents = await agentStore.list();\n for (const agent of agents) {\n this.connectAgent(agent);\n }\n }\n\n async register(name: string, url: string, passphrase: string): Promise<AgentConfig> {\n const config = await agentStore.register(name, url, passphrase);\n const isReRegistration = this.connections.has(config.id);\n\n // If already connected (e.g. loaded by init() then re-registered by spawner),\n // close the stale WS before opening a fresh one with the new passphrase.\n if (isReRegistration) {\n console.log(`[agent-manager] Re-registering agent ${config.name} (${config.id})`);\n this.disconnectAgent(config.id);\n // Small delay to ensure WS are fully closed before reconnecting\n await new Promise(resolve => setTimeout(resolve, 200));\n }\n\n this.connectAgent(config);\n console.log(`[agent-manager] Agent ${config.name} (${config.id}) connection established`);\n return config;\n }\n\n /**\n * Register a local agent in-memory only (no persistence to agentStore).\n * The local agent is always auto-spawned with deterministic config,\n * so it doesn't need disk persistence.\n * Also reassigns orphaned services (from old UUID-based agent IDs) to this agent.\n */\n async registerLocal(config: AgentConfig): Promise<void> {\n const isReRegistration = this.connections.has(config.id);\n\n if (isReRegistration) {\n console.log(`[agent-manager] Re-registering local agent ${config.name} (${config.id})`);\n this.disconnectAgent(config.id);\n await new Promise(resolve => setTimeout(resolve, 200));\n }\n\n // Load persisted passthrough env for the local agent\n const storedPassthrough = agentStore.getPassthroughEnv(config.id);\n const configWithPassthrough = { ...config, passthroughEnv: storedPassthrough };\n\n // Reassign orphaned services: any service whose agentId doesn't match\n // a known agent gets reassigned to this local agent (migration from UUID → stable ID).\n await this.reassignOrphanedServices(config.id);\n\n this.connectAgent(configWithPassthrough);\n console.log(`[agent-manager] Local agent ${config.name} (${config.id}) connected (in-memory only)`);\n }\n\n /**\n * Find services assigned to unknown agent IDs and reassign them to the given agent.\n * This handles the migration from random UUID-based agent IDs to the stable 'local-agent' ID.\n */\n private async reassignOrphanedServices(localAgentId: string): Promise<void> {\n const allServices = await serviceStore.list();\n const persistedAgents = await agentStore.list();\n const knownIds = new Set([localAgentId, ...persistedAgents.map(a => a.id)]);\n\n for (const service of allServices) {\n if (service.agentId && !knownIds.has(service.agentId)) {\n console.log(`[agent-manager] Reassigning orphaned service ${service.name} (${service.id}) from ${service.agentId} → ${localAgentId}`);\n await serviceStore.update({ id: service.id, agentId: localAgentId });\n }\n }\n }\n\n async update(agentId: string, fields: { name?: string; url?: string; passphrase?: string; passthroughEnv?: string[] }): Promise<AgentConfig> {\n const isLocal = agentSpawner.getLocalAgentId() === agentId;\n\n // Local agent: only passthroughEnv is allowed\n if (isLocal) {\n const hasOtherFields = fields.name !== undefined || fields.url !== undefined || fields.passphrase !== undefined;\n if (hasOtherFields) {\n throw new Error('Cannot modify the local agent');\n }\n }\n\n // Handle passthroughEnv separately (persisted in agentStore, pushed to agent)\n if (fields.passthroughEnv !== undefined) {\n await agentStore.savePassthroughEnv(agentId, fields.passthroughEnv);\n\n const conn = this.connections.get(agentId);\n if (conn) {\n conn.config = { ...conn.config, passthroughEnv: fields.passthroughEnv };\n // Push to the agent\n try {\n await this.agentMutation(agentId, 'config.setPassthroughEnv', {\n names: fields.passthroughEnv,\n values: resolvePassthroughValues(fields.passthroughEnv),\n });\n } catch (err) {\n console.error('[agent-manager] Failed to push passthroughEnv to agent', agentId + ':', err instanceof Error ? err.message : String(err));\n }\n }\n }\n\n // For local agent with only passthroughEnv, return config from connection\n if (isLocal) {\n const conn = this.connections.get(agentId);\n if (!conn) throw new Error(`Agent ${agentId} not found`);\n return conn.config;\n }\n\n // Remote agent: update name/url/passphrase in the store\n const { passthroughEnv: _pt, ...storeFields } = fields;\n const hasStoreFields = storeFields.name !== undefined || storeFields.url !== undefined || storeFields.passphrase !== undefined;\n\n if (hasStoreFields) {\n const updated = await agentStore.update(agentId, storeFields);\n if (!updated) {\n throw new Error(`Agent ${agentId} not found`);\n }\n const conn = this.connections.get(agentId);\n if (conn) {\n conn.config = updated;\n if (storeFields.url !== undefined || storeFields.passphrase !== undefined) {\n this.disconnectAgent(agentId);\n this.connectAgent(updated);\n }\n }\n return updated;\n }\n\n // passthroughEnv-only update for remote agent\n const conn = this.connections.get(agentId);\n if (!conn) throw new Error(`Agent ${agentId} not found`);\n return conn.config;\n }\n\n async remove(agentId: string): Promise<boolean> {\n // Prevent removal of the local spawned agent\n if (agentSpawner.getLocalAgentId() === agentId) {\n throw new Error('Cannot remove the local agent');\n }\n this.disconnectAgent(agentId);\n return agentStore.remove(agentId);\n }\n\n private connectAgent(config: AgentConfig): void {\n const connection: AgentConnection = {\n config,\n status: {\n connected: false,\n lastSeen: null,\n uptime: 0,\n runnersAvailable: [],\n },\n reconnectDelay: MIN_RECONNECT_DELAY,\n };\n\n this.connections.set(config.id, connection);\n this.openHealthWs(config.id);\n this.openBridge(config.id);\n }\n\n private openBridge(agentId: string): void {\n const conn = this.connections.get(agentId);\n if (!conn) return;\n\n console.log(`[agent-manager] Opening tRPC bridge for agent ${conn.config.name} (${agentId})`);\n\n const bridge = new AgentWSBridge(agentId, conn.config.url, conn.config.passphrase);\n conn.bridge = bridge;\n\n // Fan-out bridge events to the AgentManager\n const eventTypes = ['process:status', 'process:log', 'process:health', 'process:metrics'] as const;\n for (const eventType of eventTypes) {\n bridge.on(eventType, (data: unknown) => {\n this.emit(eventType, data);\n });\n }\n\n bridge.connect();\n }\n\n private disconnectAgent(agentId: string): void {\n const conn = this.connections.get(agentId);\n if (!conn) return;\n\n console.log(`[agent-manager] Disconnecting agent ${conn.config.name} (${agentId})`);\n\n if (conn.healthWs) {\n conn.healthWs.removeAllListeners();\n conn.healthWs.close();\n conn.healthWs = undefined;\n }\n if (conn.bridge) {\n conn.bridge.disconnect();\n conn.bridge = undefined;\n }\n if (conn.reconnectTimer) {\n clearTimeout(conn.reconnectTimer);\n conn.reconnectTimer = undefined;\n }\n if (conn.aliveTimer) {\n clearTimeout(conn.aliveTimer);\n conn.aliveTimer = undefined;\n }\n\n this.connections.delete(agentId);\n this.emit('status', { agentId, status: { connected: false, lastSeen: null, uptime: 0, runnersAvailable: [] } satisfies AgentStatus });\n }\n\n private openHealthWs(agentId: string): void {\n const conn = this.connections.get(agentId);\n if (!conn) return;\n\n // Build WS URL from agent HTTP URL\n const httpUrl = new URL(conn.config.url);\n const wsProtocol = httpUrl.protocol === 'https:' ? 'wss:' : 'ws:';\n const wsUrl = `${wsProtocol}//${httpUrl.host}/ws/health`;\n\n const ws = new WebSocket(wsUrl, {\n headers: { 'Authorization': `Bearer ${conn.config.passphrase}` },\n });\n conn.healthWs = ws;\n\n const resetAliveTimer = () => {\n if (conn.aliveTimer) clearTimeout(conn.aliveTimer);\n conn.aliveTimer = setTimeout(() => {\n console.debug(`[agent-manager] Agent ${conn.config.name} (${agentId}) alive timeout — closing WS`);\n ws.close();\n }, ALIVE_TIMEOUT);\n };\n\n ws.on('open', () => {\n console.debug(`[agent-manager] WS open to agent ${conn.config.name} (${agentId})`);\n resetAliveTimer();\n });\n\n ws.on('message', (raw: Buffer | string) => {\n try {\n const health = HealthMessageSchema.parse(\n JSON.parse(typeof raw === 'string' ? raw : raw.toString()),\n );\n\n // Only reset alive timer after successful validation\n resetAliveTimer();\n\n const wasConnected = conn.status.connected;\n conn.status = {\n connected: true,\n lastSeen: new Date().toISOString(),\n uptime: health.uptime,\n runnersAvailable: health.runnersAvailable,\n lanIp: health.lanIp,\n };\n\n // Reset reconnect delay on successful message\n conn.reconnectDelay = MIN_RECONNECT_DELAY;\n\n this.emit('status', { agentId, status: { ...conn.status } satisfies AgentStatus });\n\n if (!wasConnected) {\n console.debug(`[agent-manager] Agent ${conn.config.name} (${agentId}) connected`);\n this.pushPassthroughEnv(agentId);\n this.reconcileAiSpawns(agentId);\n const rawTraefikConfig = agentStore.getTraefikConfig(agentId);\n if (rawTraefikConfig) {\n const parsed = TraefikConfigSchema.safeParse(rawTraefikConfig);\n if (parsed.success) {\n // Decrypt DNS credentials before pushing to agent — the stored config\n // holds encrypted ciphertext which is not valid as env var values.\n const configToPush = {\n ...parsed.data,\n dnsCredentials: traefikManager.decryptDnsCredentials(parsed.data.dnsCredentials ?? {}),\n };\n this.pushTraefikConfig(agentId, configToPush);\n } else {\n console.error('[agent-manager] Invalid Traefik config in store for agent', agentId);\n }\n }\n }\n } catch (err) {\n console.debug('[agent-manager] Failed to parse health message for agent', agentId + ':', err);\n }\n });\n\n ws.on('close', () => {\n if (conn.aliveTimer) {\n clearTimeout(conn.aliveTimer);\n conn.aliveTimer = undefined;\n }\n conn.healthWs = undefined;\n\n if (conn.status.connected) {\n console.debug(`[agent-manager] Agent ${conn.config.name} (${agentId}) disconnected`);\n conn.status.connected = false;\n this.emit('status', { agentId, status: { ...conn.status } satisfies AgentStatus });\n }\n\n // Schedule reconnect only if still tracked\n if (this.connections.has(agentId)) {\n this.scheduleReconnect(agentId);\n }\n });\n\n ws.on('error', (err) => {\n // Error is always followed by close event, no need to handle reconnect here\n if (conn.status.connected) {\n console.debug('[agent-manager] WS error for agent', conn.config.name, '(' + agentId + '):', err.message);\n }\n });\n }\n\n private scheduleReconnect(agentId: string): void {\n const conn = this.connections.get(agentId);\n if (!conn) return;\n\n // Clear any existing reconnect timer\n if (conn.reconnectTimer) {\n clearTimeout(conn.reconnectTimer);\n }\n\n conn.reconnectTimer = setTimeout(() => {\n conn.reconnectTimer = undefined;\n if (this.connections.has(agentId)) {\n this.openHealthWs(agentId);\n }\n }, conn.reconnectDelay);\n\n // Exponential backoff: 1s → 2s → 4s → 8s → 15s (capped)\n conn.reconnectDelay = Math.min(conn.reconnectDelay * 2, MAX_RECONNECT_DELAY);\n }\n\n /**\n * On agent (re)connect, discover any AI spawns still alive on the agent.\n * Log them for now — full rehydration of ActiveSessionRegistry is a follow-up.\n */\n private async reconcileAiSpawns(agentId: string): Promise<void> {\n try {\n const spawns = await this.agentQuery<Array<{ spawnId: string; cli: string; status: string; bufferLength: number }>>(agentId, 'ai.list');\n if (spawns.length > 0) {\n const summary = spawns.map(s => `${s.spawnId} (${s.cli}, ${s.status}, buf:${s.bufferLength})`).join(', ');\n console.log('[agent-manager] Agent %s has %d AI spawn(s): %s', agentId, spawns.length, summary);\n // TODO: rehydrate ActiveSessionRegistry for running spawns that match known conversations\n // For now, ack done spawns without a matching session to allow cleanup\n for (const spawn of spawns) {\n if (spawn.status !== 'running') {\n this.agentMutation(agentId, 'ai.ack', { spawnId: spawn.spawnId }).catch(() => {});\n }\n }\n }\n } catch (err) {\n console.debug('[agent-manager] Failed to reconcile AI spawns for agent', agentId + ':', err instanceof Error ? err.message : String(err));\n }\n }\n\n // Push passthrough env variables to agent on (re)connection\n private async pushPassthroughEnv(agentId: string): Promise<void> {\n const conn = this.connections.get(agentId);\n if (conn && conn.config.passthroughEnv && conn.config.passthroughEnv.length > 0) {\n try {\n await this.agentMutation(agentId, 'config.setPassthroughEnv', {\n names: conn.config.passthroughEnv,\n values: resolvePassthroughValues(conn.config.passthroughEnv),\n });\n console.log('[agent-manager] Pushed passthroughEnv to agent', agentId + ':', conn.config.passthroughEnv.join(', '));\n } catch (err) {\n console.error('[agent-manager] Failed to push passthroughEnv to agent', agentId + ':', err instanceof Error ? err.message : String(err));\n }\n }\n }\n\n // Push Traefik config to agent on (re)connection or after update\n async pushTraefikConfig(agentId: string, config: unknown): Promise<void> {\n const conn = this.connections.get(agentId);\n if (!conn) return;\n try {\n await this.agentMutation(agentId, 'config.setTraefikConfig', config);\n } catch (err) {\n console.error('[agent-manager] Failed to push Traefik config to agent', agentId + ':', err instanceof Error ? err.message : String(err));\n }\n }\n\n /** Returns the local agent ID, or first connected agent, or null. */\n getDefaultAgentId(): string | null {\n const localId = agentSpawner.getLocalAgentId();\n if (localId && this.connections.get(localId)?.status.connected) return localId;\n for (const [id, conn] of this.connections) {\n if (conn.status.connected) return id;\n }\n return null;\n }\n\n getAgent(agentId: string): AgentConnection | undefined {\n return this.connections.get(agentId);\n }\n\n getAgentConfig(agentId: string): AgentConfig | undefined {\n return this.connections.get(agentId)?.config;\n }\n\n listAgents(): Array<{ config: AgentConfig; status: AgentStatus; isLocal: boolean }> {\n const localId = agentSpawner.getLocalAgentId();\n return Array.from(this.connections.values()).map(conn => ({\n config: { ...conn.config, passphrase: '***' }, // Don't expose passphrase\n status: conn.status,\n isLocal: conn.config.id === localId,\n }));\n }\n\n getStatus(agentId: string): AgentStatus | null {\n return this.connections.get(agentId)?.status ?? null;\n }\n\n async shutdown(): Promise<void> {\n const ids = [...this.connections.keys()];\n for (const id of ids) {\n this.disconnectAgent(id);\n }\n }\n}\n\nexport const agentManager = new AgentManager();\n","import { randomUUID, randomBytes, createCipheriv, createDecipheriv } from 'node:crypto';\nimport { readFile, writeFile, rename, mkdir, chmod } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { env } from '../config/env.js';\nimport { getEncryptionKey } from '../utils/encryption-key.js';\nimport type { AgentConfig } from '@runeya/packages-shared';\n\nconst FILENAME = 'agents.json';\nconst ALGORITHM = 'aes-256-gcm';\n\ninterface StoredAgent {\n id: string;\n name: string;\n url: string;\n encrypted: string; // hex\n iv: string; // hex\n authTag: string; // hex\n}\n\nfunction encrypt(plaintext: string): { encrypted: string; iv: string; authTag: string } {\n const maybeKey = getEncryptionKey();\n if (!maybeKey) {\n throw new Error('Encryption key not loaded — please provide the key via setup UI');\n }\n const key: Buffer = maybeKey; // Type narrowing\n const iv = randomBytes(16);\n const cipher = createCipheriv(ALGORITHM, key, iv);\n let enc = cipher.update(plaintext, 'utf-8', 'hex');\n enc += cipher.final('hex');\n const authTag = cipher.getAuthTag().toString('hex');\n return { encrypted: enc, iv: iv.toString('hex'), authTag };\n}\n\nfunction decrypt(encrypted: string, ivHex: string, authTagHex: string): string {\n // Validate all hex inputs before Buffer.from()\n if (!/^[0-9a-f]+$/i.test(encrypted) || !/^[0-9a-f]+$/i.test(ivHex) || !/^[0-9a-f]+$/i.test(authTagHex)) {\n throw new Error('Invalid hex string in encrypted agent data');\n }\n const maybeKey = getEncryptionKey();\n if (!maybeKey) {\n throw new Error('Encryption key not loaded — please provide the key via setup UI');\n }\n const key: Buffer = maybeKey; // Type narrowing\n const iv = Buffer.from(ivHex, 'hex');\n const decipher = createDecipheriv(ALGORITHM, key, iv, { authTagLength: 16 });\n decipher.setAuthTag(Buffer.from(authTagHex, 'hex'));\n let dec = decipher.update(encrypted, 'hex', 'utf-8');\n dec += decipher.final('utf-8');\n return dec;\n}\n\ninterface AgentsFileData {\n agents: StoredAgent[];\n passthroughEnv: Record<string, string[]>;\n traefikConfigs: Record<string, unknown>;\n}\n\nclass AgentStore {\n private agents: Map<string, StoredAgent> = new Map();\n private passthroughEnv: Record<string, string[]> = {};\n private traefikConfigs: Record<string, unknown> = {};\n private loaded = false;\n\n private getFilePath(): string {\n return join(env.DATA_DIR, FILENAME);\n }\n\n private async ensureDir(): Promise<void> {\n await mkdir(env.DATA_DIR, { recursive: true });\n }\n\n private async load(): Promise<void> {\n if (this.loaded) return;\n try {\n const raw = await readFile(this.getFilePath(), 'utf-8');\n const data = JSON.parse(raw);\n if (Array.isArray(data)) {\n // Legacy format: plain StoredAgent[]\n for (const a of data as StoredAgent[]) this.agents.set(a.id, a);\n this.passthroughEnv = {};\n } else {\n // New format: { agents, passthroughEnv }\n const fileData = data as AgentsFileData;\n for (const a of fileData.agents) this.agents.set(a.id, a);\n this.passthroughEnv = fileData.passthroughEnv ?? {};\n this.traefikConfigs = fileData.traefikConfigs ?? {};\n }\n } catch {\n // File doesn't exist yet, start empty\n }\n this.loaded = true;\n }\n\n private async save(): Promise<void> {\n await this.ensureDir();\n const filePath = this.getFilePath();\n const tmpPath = filePath + '.tmp';\n const fileData: AgentsFileData = {\n agents: Array.from(this.agents.values()),\n passthroughEnv: this.passthroughEnv,\n traefikConfigs: this.traefikConfigs,\n };\n await writeFile(tmpPath, JSON.stringify(fileData, null, 2), 'utf-8');\n await rename(tmpPath, filePath);\n await chmod(filePath, 0o600);\n }\n\n private toAgentConfig(stored: StoredAgent): AgentConfig {\n return {\n id: stored.id,\n name: stored.name,\n url: stored.url,\n passphrase: decrypt(stored.encrypted, stored.iv, stored.authTag),\n passthroughEnv: this.passthroughEnv[stored.id] ?? [],\n };\n }\n\n async list(): Promise<AgentConfig[]> {\n await this.load();\n // If no encryption key, return empty list (setup mode)\n if (!getEncryptionKey()) {\n return [];\n }\n return Array.from(this.agents.values()).map(a => this.toAgentConfig(a));\n }\n\n async get(id: string): Promise<AgentConfig | null> {\n await this.load();\n // If no encryption key, return null (setup mode)\n if (!getEncryptionKey()) {\n return null;\n }\n const stored = this.agents.get(id);\n if (!stored) return null;\n return this.toAgentConfig(stored);\n }\n\n async register(name: string, url: string, passphrase: string): Promise<AgentConfig> {\n await this.load();\n // Check if an agent with the same URL already exists\n const existing = Array.from(this.agents.values()).find(a => a.url === url);\n const { encrypted, iv, authTag } = encrypt(passphrase);\n if (existing) {\n // Update existing agent instead of creating duplicate\n existing.name = name;\n existing.encrypted = encrypted;\n existing.iv = iv;\n existing.authTag = authTag;\n await this.save();\n return { id: existing.id, name, url, passphrase, passthroughEnv: this.passthroughEnv[existing.id] ?? [] };\n }\n const id = randomUUID();\n const stored: StoredAgent = { id, name, url, encrypted, iv, authTag };\n this.agents.set(id, stored);\n await this.save();\n return { id, name, url, passphrase, passthroughEnv: [] };\n }\n\n async remove(id: string): Promise<boolean> {\n await this.load();\n if (!this.agents.has(id)) return false;\n this.agents.delete(id);\n delete this.passthroughEnv[id];\n delete this.traefikConfigs[id];\n await this.save();\n return true;\n }\n\n getPassthroughEnv(agentId: string): string[] {\n return this.passthroughEnv[agentId] ?? [];\n }\n\n async savePassthroughEnv(agentId: string, names: string[]): Promise<void> {\n await this.load();\n this.passthroughEnv[agentId] = names;\n await this.save();\n }\n\n getTraefikConfig(agentId: string): unknown | null {\n return this.traefikConfigs[agentId] ?? null;\n }\n\n async saveTraefikConfig(agentId: string, config: unknown): Promise<void> {\n await this.load();\n this.traefikConfigs[agentId] = config;\n await this.save();\n }\n\n async update(id: string, fields: { name?: string; url?: string; passphrase?: string }): Promise<AgentConfig | null> {\n await this.load();\n const stored = this.agents.get(id);\n if (!stored) return null;\n if (fields.name !== undefined) stored.name = fields.name;\n if (fields.url !== undefined) stored.url = fields.url;\n if (fields.passphrase !== undefined) {\n const { encrypted, iv, authTag } = encrypt(fields.passphrase);\n stored.encrypted = encrypted;\n stored.iv = iv;\n stored.authTag = authTag;\n }\n await this.save();\n return this.toAgentConfig(stored);\n }\n\n async updateUrl(id: string, url: string): Promise<AgentConfig | null> {\n await this.load();\n const stored = this.agents.get(id);\n if (!stored) return null;\n stored.url = url;\n this.agents.set(id, stored);\n await this.save();\n return this.toAgentConfig(stored);\n }\n}\n\nexport const agentStore = new AgentStore();\n","import { randomUUID } from 'node:crypto';\nimport { readFile, writeFile, rename, mkdir, chmod } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { env } from '../config/env.js';\nimport { getEncryptionKey } from '../utils/encryption-key.js';\nimport { environmentStore } from './environment-store.js';\nimport { stableEncryptValue, decryptValue, isEncryptedValue } from './crypto-helpers.js';\nimport type { ServiceConfig, CreateService, UpdateService, LogSourceConfig } from '@runeya/packages-shared';\n\nconst FILENAME = 'services.json';\n\n/** Encrypt sensitive log source credentials before writing to disk. */\nfunction encryptLogSources(logSources: LogSourceConfig[]): LogSourceConfig[] {\n return logSources.map((src) => {\n if (src.type === 'mongo') {\n return { ...src, connectionString: stableEncryptValue(src.connectionString) };\n }\n if (src.type === 'mysql' && src.password) {\n return { ...src, password: stableEncryptValue(src.password) };\n }\n return src;\n });\n}\n\n/** Decrypt sensitive log source credentials after reading from disk. */\nfunction decryptLogSources(logSources: LogSourceConfig[]): LogSourceConfig[] {\n return logSources.map((src) => {\n if (src.type === 'mongo' && isEncryptedValue(src.connectionString)) {\n try {\n return { ...src, connectionString: decryptValue(src.connectionString) };\n } catch {\n console.error('[service-store] Failed to decrypt mongo connectionString');\n return src;\n }\n }\n if (src.type === 'mysql' && src.password && isEncryptedValue(src.password)) {\n try {\n return { ...src, password: decryptValue(src.password) };\n } catch {\n console.error('[service-store] Failed to decrypt mysql password');\n return src;\n }\n }\n return src;\n });\n}\n\n/** Prepare service for disk: strip transient env/envSecrets/resolvedLogParsers fields and encrypt log source credentials. */\nfunction prepareForDisk(service: ServiceConfig): ServiceConfig {\n return {\n ...service,\n env: {},\n envSecrets: [],\n resolvedLogParsers: undefined,\n resolvedCwd: undefined,\n logSources: encryptLogSources(service.logSources ?? []),\n };\n}\n\ntype ChangeListener = () => void;\n\nclass ServiceStore {\n private services: Map<string, ServiceConfig> = new Map();\n private loaded = false;\n private listeners: Set<ChangeListener> = new Set();\n\n onChange(fn: ChangeListener): () => void {\n this.listeners.add(fn);\n return () => this.listeners.delete(fn);\n }\n\n private notify(): void {\n for (const fn of this.listeners) fn();\n }\n\n private getFilePath(): string {\n return join(env.DATA_DIR, FILENAME);\n }\n\n private async ensureDir(): Promise<void> {\n await mkdir(env.DATA_DIR, { recursive: true });\n }\n\n private async load(): Promise<void> {\n if (this.loaded) return;\n try {\n const raw = await readFile(this.getFilePath(), 'utf-8');\n const data: ServiceConfig[] = JSON.parse(raw);\n\n if (!getEncryptionKey()) {\n this.loaded = true;\n return;\n }\n\n for (const s of data) {\n // Ensure shell defaults to true for legacy commands stored without it\n if (s.commands) {\n for (const cmd of s.commands) {\n if (cmd.shell === undefined) cmd.shell = true;\n }\n }\n this.services.set(s.id, {\n ...s,\n logSources: decryptLogSources(s.logSources ?? []),\n });\n }\n } catch {\n // File doesn't exist yet, start empty\n }\n this.loaded = true;\n }\n\n private async save(): Promise<void> {\n await this.ensureDir();\n const filePath = this.getFilePath();\n const tmpPath = filePath + '.tmp';\n const preparedServices = Array.from(this.services.values())\n .map(s => prepareForDisk(s));\n const data = JSON.stringify(preparedServices, null, 2);\n await writeFile(tmpPath, data, 'utf-8');\n await rename(tmpPath, filePath);\n await chmod(filePath, 0o600);\n }\n\n async list(): Promise<ServiceConfig[]> {\n await this.load();\n return Array.from(this.services.values());\n }\n\n async get(id: string): Promise<ServiceConfig | null> {\n await this.load();\n return this.services.get(id) ?? null;\n }\n\n async create(input: CreateService): Promise<ServiceConfig> {\n await this.load();\n const service: ServiceConfig = {\n id: randomUUID(),\n orgId: input.orgId ?? null,\n agentId: input.agentId,\n name: input.name,\n commands: input.commands ?? [],\n cwd: input.cwd,\n ports: input.ports ?? [],\n groups: input.groups ?? [],\n description: input.description,\n url: input.url,\n localUrls: input.localUrls ?? [],\n openapiUrl: input.openapiUrl,\n git: input.git,\n meta: input.meta,\n env: {},\n envSecrets: [],\n runner: input.runner ?? 'native',\n dockerConfig: input.dockerConfig,\n healthCheck: input.healthCheck,\n parserIds: input.parserIds ?? [],\n shortcuts: input.shortcuts ?? [],\n logSources: input.logSources ?? [],\n autoRestart: input.autoRestart ?? false,\n restartBackoffMs: input.restartBackoffMs ?? 1000,\n clearLogsOnStart: input.clearLogsOnStart ?? false,\n };\n this.services.set(service.id, service);\n await this.save();\n this.notify();\n return service;\n }\n\n async update(input: UpdateService): Promise<ServiceConfig | null> {\n await this.load();\n const existing = this.services.get(input.id);\n if (!existing) return null;\n const updated: ServiceConfig = {\n ...existing,\n ...(input.agentId !== undefined && { agentId: input.agentId ?? undefined }),\n ...(input.name !== undefined && { name: input.name }),\n ...(input.commands !== undefined && { commands: input.commands }),\n ...(input.cwd !== undefined && { cwd: input.cwd ?? undefined }),\n ...(input.ports !== undefined && { ports: input.ports }),\n ...(input.groups !== undefined && { groups: input.groups }),\n ...(input.description !== undefined && { description: input.description }),\n ...(input.url !== undefined && { url: input.url }),\n ...(input.localUrls !== undefined && { localUrls: input.localUrls }),\n ...(input.openapiUrl !== undefined && { openapiUrl: input.openapiUrl }),\n ...(input.git !== undefined && { git: input.git ?? undefined }),\n ...(input.meta !== undefined && { meta: input.meta ?? undefined }),\n ...(input.runner !== undefined && { runner: input.runner }),\n ...(input.dockerConfig !== undefined && { dockerConfig: input.dockerConfig }),\n ...(input.healthCheck !== undefined && { healthCheck: input.healthCheck ?? undefined }),\n ...(input.autoRestart !== undefined && { autoRestart: input.autoRestart }),\n ...(input.clearLogsOnStart !== undefined && { clearLogsOnStart: input.clearLogsOnStart }),\n ...(input.restartBackoffMs !== undefined && { restartBackoffMs: input.restartBackoffMs }),\n ...(input.orgId !== undefined && { orgId: input.orgId }),\n ...(input.shortcuts !== undefined && { shortcuts: input.shortcuts }),\n ...(input.parserIds !== undefined && { parserIds: input.parserIds }),\n ...(input.logSources !== undefined && { logSources: input.logSources }),\n };\n this.services.set(input.id, updated);\n await this.save();\n this.notify();\n return updated;\n }\n\n async delete(id: string): Promise<boolean> {\n await this.load();\n if (!this.services.has(id)) return false;\n this.services.delete(id);\n await this.save();\n this.notify();\n // Clean up service-scoped environments\n await environmentStore.deleteByReference(id);\n return true;\n }\n}\n\nexport const serviceStore = new ServiceStore();\n","import { randomUUID } from 'node:crypto';\nimport { readFile, writeFile, rename, mkdir, chmod } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { env } from '../config/env.js';\nimport { getEncryptionKey } from '../utils/encryption-key.js';\nimport {\n encryptVariableSlots,\n decryptVariableSlots,\n extractEncryptedVariableSlots,\n} from './crypto-helpers.js';\nimport type { Environment, CreateEnvironment, UpdateEnvironment, VariableSlot } from '@runeya/packages-shared';\nimport { CreateEnvironmentSchema } from '@runeya/packages-shared';\n\nconst FILENAME = 'environments.json';\n\ninterface DiskEncryptedCache {\n envSlots: Record<string, string>;\n}\n\nclass EnvironmentStore {\n private environments: Map<string, Environment> = new Map();\n private loaded = false;\n /** Cache of encrypted secret values as last written to disk */\n private diskEncryptedSlots: Map<string, DiskEncryptedCache> = new Map();\n\n private getFilePath(): string {\n return join(env.DATA_DIR, FILENAME);\n }\n\n private async ensureDir(): Promise<void> {\n await mkdir(env.DATA_DIR, { recursive: true });\n }\n\n private extractEncryptedCache(environment: Environment): DiskEncryptedCache {\n const envSlots = extractEncryptedVariableSlots(\n environment.variables as Record<string, { value: VariableSlot }>,\n );\n return { envSlots };\n }\n\n private encryptEnvironment(environment: Environment): Environment {\n const cache = this.diskEncryptedSlots.get(environment.id);\n\n // Encrypt env variables\n let encryptedVars = environment.variables;\n if (environment.variables && Object.keys(environment.variables).length > 0) {\n encryptedVars = encryptVariableSlots(\n environment.variables as Record<string, { value: VariableSlot }>,\n cache?.envSlots,\n ) as Environment['variables'];\n }\n\n return { ...environment, variables: encryptedVars };\n }\n\n private decryptEnvironment(environment: Environment): Environment {\n // Decrypt env variables\n let decryptedVars = environment.variables;\n if (environment.variables && Object.keys(environment.variables).length > 0) {\n decryptedVars = decryptVariableSlots(\n environment.variables as Record<string, { value: VariableSlot }>,\n `environment ${environment.id}`,\n ) as Environment['variables'];\n }\n\n return { ...environment, variables: decryptedVars };\n }\n\n private async load(): Promise<void> {\n if (this.loaded) return;\n try {\n const raw = await readFile(this.getFilePath(), 'utf-8');\n const data: Environment[] = JSON.parse(raw);\n\n if (!getEncryptionKey()) {\n this.loaded = true;\n return;\n }\n\n for (const e of data) {\n // Cache encrypted slots before decrypting\n this.diskEncryptedSlots.set(e.id, this.extractEncryptedCache(e));\n const decrypted = this.decryptEnvironment(e);\n this.environments.set(e.id, decrypted);\n }\n } catch {\n // File doesn't exist yet, start empty\n }\n this.loaded = true;\n }\n\n private async save(): Promise<void> {\n await this.ensureDir();\n const filePath = this.getFilePath();\n const tmpPath = filePath + '.tmp';\n // Encrypt before saving\n const preparedEnvironments = Array.from(this.environments.values())\n .map(e => this.encryptEnvironment(e));\n // Update disk cache with newly written encrypted values\n for (const e of preparedEnvironments) {\n this.diskEncryptedSlots.set(e.id, this.extractEncryptedCache(e));\n }\n const data = JSON.stringify(preparedEnvironments, null, 2);\n await writeFile(tmpPath, data, 'utf-8');\n await rename(tmpPath, filePath);\n await chmod(filePath, 0o600);\n }\n\n async list(projectId: string): Promise<Environment[]> {\n await this.load();\n return Array.from(this.environments.values()).filter(e => e.projectId === projectId);\n }\n\n async get(id: string): Promise<Environment | null> {\n await this.load();\n return this.environments.get(id) ?? null;\n }\n\n async create(input: CreateEnvironment): Promise<Environment> {\n await this.load();\n const parsed = CreateEnvironmentSchema.parse(input);\n const environment: Environment = {\n id: randomUUID(),\n projectId: parsed.projectId,\n name: parsed.name,\n description: parsed.description,\n parentIds: parsed.parentIds,\n variables: parsed.variables,\n scope: parsed.scope,\n reference: parsed.reference,\n activateOn: parsed.activateOn,\n immutable: parsed.immutable,\n default: parsed.default,\n color: parsed.color,\n bgColor: parsed.bgColor,\n agentId: parsed.agentId,\n };\n // Exclusivity: if this env is default, unset default on all others in the same project\n if (environment.default) {\n for (const [id, e] of this.environments) {\n if (e.projectId === environment.projectId && e.default) {\n this.environments.set(id, { ...e, default: false });\n }\n }\n }\n this.environments.set(environment.id, environment);\n await this.save();\n return environment;\n }\n\n async update(input: UpdateEnvironment): Promise<Environment | null> {\n await this.load();\n const existing = this.environments.get(input.id);\n if (!existing) return null;\n const updated: Environment = {\n ...existing,\n // Immutable environments: allow changing variables, color, description — but not name\n ...(!existing.immutable && input.name !== undefined && { name: input.name }),\n ...(input.description !== undefined && { description: input.description }),\n ...(input.parentIds !== undefined && { parentIds: input.parentIds }),\n ...(input.variables !== undefined && { variables: input.variables }),\n ...(input.scope !== undefined && { scope: input.scope }),\n ...(input.reference !== undefined && { reference: input.reference }),\n ...(input.activateOn !== undefined && { activateOn: input.activateOn }),\n ...(input.color !== undefined && { color: input.color }),\n ...(input.bgColor !== undefined && { bgColor: input.bgColor }),\n ...(input.default !== undefined && { default: input.default }),\n ...(input.agentId !== undefined && { agentId: input.agentId ?? undefined }),\n };\n // Exclusivity: if setting default: true, unset default on all others in the same project\n if (updated.default) {\n for (const [id, e] of this.environments) {\n if (id !== input.id && e.projectId === updated.projectId && e.default) {\n this.environments.set(id, { ...e, default: false });\n }\n }\n }\n this.environments.set(input.id, updated);\n await this.save();\n return updated;\n }\n\n async upsertVariable(environmentId: string, variableId: string, variable: Environment['variables'][string]): Promise<Environment | null> {\n const existing = this.environments.get(environmentId);\n if (!existing) return null;\n const variables = { ...(existing.variables ?? {}), [variableId]: variable };\n return this.update({ id: environmentId, variables });\n }\n\n async removeVariable(environmentId: string, variableId: string): Promise<Environment | null> {\n const existing = this.environments.get(environmentId);\n if (!existing) return null;\n const variables = { ...(existing.variables ?? {}) };\n delete variables[variableId];\n return this.update({ id: environmentId, variables });\n }\n\n async delete(id: string): Promise<boolean> {\n await this.load();\n const env = this.environments.get(id);\n if (!env) return false;\n if (env.immutable) return false; // Can't delete immutable environments\n this.environments.delete(id);\n await this.save();\n return true;\n }\n\n async getByProjectId(projectId: string): Promise<Environment[]> {\n await this.load();\n return Array.from(this.environments.values()).filter(e => e.projectId === projectId);\n }\n\n async listAllGlobal(): Promise<Environment[]> {\n await this.load();\n return Array.from(this.environments.values()).filter(e => e.scope === 'global');\n }\n\n // --- Scope-based Query Methods ---\n\n async listByScope(projectId: string, scope: 'global' | 'service'): Promise<Environment[]> {\n await this.load();\n return Array.from(this.environments.values()).filter(e => e.projectId === projectId && e.scope === scope);\n }\n\n async findServiceEnvironment(serviceId: string, globalEnvId: string): Promise<Environment | null> {\n await this.load();\n for (const e of this.environments.values()) {\n if (e.scope === 'service' && e.reference === serviceId && e.activateOn === globalEnvId) return e;\n }\n return null;\n }\n\n async findServiceEnvironments(serviceId: string): Promise<Environment[]> {\n await this.load();\n return Array.from(this.environments.values()).filter(e => e.scope === 'service' && e.reference === serviceId);\n }\n\n async deleteByReference(serviceId: string): Promise<void> {\n await this.load();\n let changed = false;\n for (const [id, e] of this.environments) {\n if (e.scope === 'service' && e.reference === serviceId) {\n this.environments.delete(id);\n changed = true;\n }\n }\n if (changed) await this.save();\n }\n\n async deleteByActivateOn(globalEnvId: string): Promise<void> {\n await this.load();\n let changed = false;\n for (const [id, e] of this.environments) {\n if (e.scope === 'service' && e.activateOn === globalEnvId) {\n this.environments.delete(id);\n changed = true;\n }\n }\n if (changed) await this.save();\n }\n\n /**\n * When a service is renamed, update the name of all its service-scoped environments\n * to keep the `${serviceName} (${globalEnvName})` pattern in sync.\n */\n async renameByReference(serviceId: string, newServiceName: string): Promise<void> {\n await this.load();\n let changed = false;\n for (const [id, e] of this.environments) {\n if (e.scope === 'service' && e.reference === serviceId && e.activateOn) {\n const globalEnv = this.environments.get(e.activateOn);\n if (!globalEnv) continue;\n this.environments.set(id, { ...e, name: `${newServiceName} (${globalEnv.name})` });\n changed = true;\n }\n }\n if (changed) await this.save();\n }\n\n /**\n * When a global environment is renamed, update the name of all service-scoped\n * environments that activateOn it to keep the naming pattern in sync.\n * Caller provides a serviceId→name map since environmentStore can't access serviceStore.\n */\n async renameByActivateOn(globalEnvId: string, newGlobalName: string, serviceNames: Map<string, string>): Promise<void> {\n await this.load();\n let changed = false;\n for (const [id, e] of this.environments) {\n if (e.scope === 'service' && e.activateOn === globalEnvId && e.reference) {\n const serviceName = serviceNames.get(e.reference);\n if (!serviceName) continue;\n this.environments.set(id, { ...e, name: `${serviceName} (${newGlobalName})` });\n changed = true;\n }\n }\n if (changed) await this.save();\n }\n}\n\nexport const environmentStore = new EnvironmentStore();\n","import { z } from 'zod';\n\nexport const UserSchema = z.object({\n id: z.string().max(128),\n email: z.string().email().max(320),\n name: z.string().min(1).max(500),\n avatar: z.string().url().max(2048).nullable().optional(),\n});\n\nexport type User = z.infer<typeof UserSchema>;\n","import { z } from 'zod';\n\nexport const OrgSchema = z.object({\n id: z.string().max(128),\n name: z.string().min(1).max(100),\n slug: z.string().min(1).max(100).regex(/^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/),\n ownerId: z.string().max(128),\n});\n\nexport type Org = z.infer<typeof OrgSchema>;\n\nexport const OrgMemberSchema = z.object({\n id: z.string().max(128),\n orgId: z.string().max(128),\n userId: z.string().max(128),\n globalRole: z.enum(['owner', 'admin', 'member']),\n invitedAt: z.coerce.date(),\n joinedAt: z.coerce.date().nullable().optional(),\n});\n\nexport type OrgMember = z.infer<typeof OrgMemberSchema>;\n","import { z } from 'zod';\n\nexport const ProjectSchema = z.object({\n id: z.string().max(128),\n orgId: z.string().max(128).nullable().optional(),\n name: z.string().min(1).max(200),\n description: z.string().max(10000).optional().default(''),\n serviceIds: z.array(z.string().max(128)).max(10000).default([]),\n\n // Environment support\n // NOTE: activeEnvironmentId is runtime-only (not persisted to JSON)\n // It's initialized to 'local' by default at load time\n activeEnvironmentId: z.string().max(128).optional(),\n environmentIds: z.array(z.string().max(128)).max(100).default([]),\n});\n\nexport type Project = z.infer<typeof ProjectSchema>;\n\nexport const CreateProjectSchema = ProjectSchema.omit({ id: true }).partial().required({ name: true });\nexport type CreateProject = z.infer<typeof CreateProjectSchema>;\n\nexport const UpdateProjectSchema = ProjectSchema.partial().required({ id: true });\nexport type UpdateProject = z.infer<typeof UpdateProjectSchema>;\n","import { z } from 'zod';\nimport { JSLogParserSchema } from './settings.schema.js';\nimport { LogSourceConfigSchema } from './log-source.schema.js';\n\nexport const HealthCheckSchema = z.object({\n type: z.enum(['http', 'command']).default('http'),\n // HTTP-specific (required when type=http)\n path: z.string().min(1).max(500).startsWith('/').optional(),\n method: z.enum(['GET', 'HEAD', 'POST', 'PUT']).optional().default('GET'),\n expectedStatus: z.number().int().min(100).max(599).optional().default(200),\n // Command-specific (required when type=command)\n command: z.string().min(1).max(4096).optional(),\n // Shared\n interval: z.number().int().positive().default(1000),\n timeout: z.number().int().positive().default(1000),\n retries: z.number().int().nonnegative().default(3),\n initialDelay: z.number().int().nonnegative().optional().default(0),\n}).refine(\n (data) => data.type === 'http' ? !!data.path : !!data.command,\n { message: 'HTTP type requires path; command type requires command' },\n);\n\nexport type HealthCheck = z.infer<typeof HealthCheckSchema>;\n\nexport const BootstrapCommandSchema = z.object({\n id: z.string().min(1).max(64),\n label: z.string().max(200).default(''),\n entrypoint: z.string().max(4096).optional(),\n command: z.string().max(4096).default(''),\n user: z.string().max(256).optional(),\n});\n\nexport type BootstrapCommand = z.infer<typeof BootstrapCommandSchema>;\n\nexport const DockerConfigSchema = z.object({\n // Image mode (pull from registry) — mutually exclusive with build mode in UI\n image: z.string().min(1).max(1024).optional(),\n\n // Build mode — Dockerfile stored inline in services.json\n dockerfile: z.string().max(65536).optional(),\n buildContext: z.string().max(4096).optional(),\n buildArgs: z.record(z.string().max(256), z.string().max(4096)).default({}).refine(\n (obj) => Object.keys(obj).length <= 50,\n { message: 'Max 50 build args' },\n ),\n targetStage: z.string().max(256).optional(),\n\n // Runtime config\n networkMode: z.enum(['host', 'bridge']).default('host'),\n ports: z.array(z.string().max(64)).max(100).default([]),\n volumes: z.array(z.string().max(1024)).max(100).default([]),\n mountRootpath: z.boolean().default(false),\n entrypoint: z.string().max(4096).optional(),\n command: z.string().max(4096).optional(),\n user: z.string().max(256).optional(),\n useNativeCommand: z.boolean().default(false),\n nativeCommandMode: z.enum(['shared', 'isolated']).default('isolated'),\n nativeShell: z.string().max(256).default('sh'),\n bootstrapCommands: z.array(BootstrapCommandSchema).max(20).default([]),\n});\n\nexport type DockerConfig = z.infer<typeof DockerConfigSchema>;\n\nexport const RestartStrategySchema = z.enum(['none', 'on-failure', 'always', 'unless-stopped']).default('none');\nexport type RestartStrategy = z.infer<typeof RestartStrategySchema>;\n\nexport const ServiceShortcutSchema = z.object({\n id: z.string().min(1).max(64),\n label: z.string().max(200).default(''),\n command: z.string().max(4096).default(''),\n cwd: z.string().max(4096).optional(),\n});\n\nexport type ServiceShortcut = z.infer<typeof ServiceShortcutSchema>;\n\nexport const ServiceCommandSchema = z.object({\n id: z.string().min(1).max(64),\n label: z.string().max(200).default(''),\n command: z.string().max(4096).default(''),\n cwd: z.string().max(4096).optional(),\n shell: z.boolean().optional().default(true),\n});\n\nexport type ServiceCommand = z.infer<typeof ServiceCommandSchema>;\n\n// --- Variable Slot Schema ---\n// A VariableSlot represents a single value with optional pre/post concatenation.\n// The final resolved value is: pre + interpolate(value) + post\nexport const VariableSlotSchema = z.object({\n value: z.string().max(8192).default(''),\n pre: z.string().max(8192).default(''),\n post: z.string().max(8192).default(''),\n isSecret: z.boolean().default(false),\n});\n\nexport type VariableSlot = z.infer<typeof VariableSlotSchema>;\n\n// A Variable has a key (env var name) and a value slot.\nexport const VariableSchema = z.object({\n key: z.string().min(1).max(256),\n value: VariableSlotSchema,\n});\n\nexport type Variable = z.infer<typeof VariableSchema>;\n\n// Record of variableId → Variable. Max 200 entries.\n// The key is a unique variable ID (UUID), the Variable contains the env var name in `key`.\nexport const VariablesRecordSchema = z.record(\n z.string().max(128),\n VariableSchema,\n).refine(\n (obj) => Object.keys(obj).length <= 200,\n { message: 'Max 200 variables' },\n);\n\nexport type VariablesRecord = z.infer<typeof VariablesRecordSchema>;\n\n// Record of variable name → VariableSlot (used on disk for base values and overrides separately)\nexport const VariableSlotsRecordSchema = z.record(\n z.string().max(256),\n VariableSlotSchema,\n).refine(\n (obj) => Object.keys(obj).length <= 200,\n { message: 'Max 200 variable slots' },\n);\n\nexport type VariableSlotsRecord = z.infer<typeof VariableSlotsRecordSchema>;\n\nexport const ServiceConfigSchema = z.object({\n id: z.string().max(128),\n orgId: z.string().max(128).nullable().optional(),\n agentId: z.string().max(128).optional(), // Optional: if absent, inherited from active environment's agentId\n name: z.string().min(1).max(200),\n commands: z.array(ServiceCommandSchema).max(50).optional().default([]),\n cwd: z.string().max(4096).optional(),\n ports: z.array(z.number().int().positive().max(65535)).max(20).optional().default([]),\n\n // Metadata fields (migration from old Runeya)\n groups: z.array(z.string().max(200)).max(20).optional().default([]),\n description: z.string().max(2000).optional(),\n url: z.string().max(2048).optional(),\n localUrls: z.array(z.object({\n url: z.string().max(253).regex(/^([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\\.)+[a-z]{2,}$/),\n port: z.number().int().min(1).max(65535),\n })).max(20).optional().default([]),\n openapiUrl: z.string().max(2048).optional(),\n git: z.object({\n remote: z.string().max(2048).optional(),\n home: z.string().max(2048).optional(),\n }).optional(),\n meta: z.record(z.string().max(256), z.string().max(2000)).optional()\n .refine((obj) => !obj || Object.keys(obj).length <= 100, { message: 'Too many meta keys (max 100)' }),\n\n // Transient env dict (resolved by server before deployment, used directly by agent runner — NOT persisted)\n env: z.record(z.string().max(256), z.string().max(8192)).default({}).refine(\n (obj) => Object.keys(obj).length <= 200,\n { message: 'Too many env vars (max 200)' },\n ),\n envSecrets: z.array(z.string().max(256)).max(200).default([]),\n\n // Transient: resolved JS log parsers (from parserIds, resolved by server before deployment — NOT persisted)\n resolvedLogParsers: z.array(JSLogParserSchema).default([]).optional(),\n\n // Transient: resolved working directory (cwd with env vars expanded — NOT persisted)\n resolvedCwd: z.string().optional(),\n\n runner: z.enum(['native', 'docker']).optional().default('native'),\n dockerConfig: DockerConfigSchema.optional(),\n healthCheck: HealthCheckSchema.optional(),\n parserIds: z.array(z.string().max(128)).max(50).default([]),\n shortcuts: z.array(ServiceShortcutSchema).max(50).optional().default([]),\n autoRestart: z.boolean().optional().default(false),\n clearLogsOnStart: z.boolean().optional().default(false),\n restartStrategy: RestartStrategySchema.optional(),\n maxRestarts: z.number().int().nonnegative().optional(),\n restartBackoffMs: z.number().int().positive().optional().default(1000),\n\n // Log sources additionnelles (au-delà du stdout/stderr console par défaut)\n logSources: z.array(LogSourceConfigSchema).max(20).optional().default([]),\n});\n\nexport type ServiceConfig = z.infer<typeof ServiceConfigSchema>;\n\nexport const CreateServiceSchema = ServiceConfigSchema.omit({ id: true }).partial().required({ name: true });\nexport type CreateService = z.infer<typeof CreateServiceSchema>;\n\nexport const UpdateServiceSchema = ServiceConfigSchema.partial().required({ id: true }).extend({\n agentId: z.string().max(128).nullable().optional(), // null = clear (inherit from env), undefined = no change\n cwd: z.string().max(4096).nullable().optional(),\n git: z.object({ remote: z.string().max(2048).optional(), home: z.string().max(2048).optional() }).nullable().optional(),\n meta: z.record(z.string().max(256), z.string().max(2000)).nullable().optional()\n .refine((obj) => !obj || Object.keys(obj).length <= 100, { message: 'Too many meta keys (max 100)' }),\n healthCheck: HealthCheckSchema.nullable().optional(),\n});\nexport type UpdateService = z.infer<typeof UpdateServiceSchema>;\n","import { z } from 'zod';\nimport { ScenarioSchema } from './scenario.schema.js';\n\nexport const AI_PROVIDERS = ['anthropic', 'openai', 'mistral', 'groq', 'ollama'] as const;\nexport type AIProviderType = (typeof AI_PROVIDERS)[number];\n\nexport const AIProviderSchema = z.object({\n id: z.string().min(1).max(128),\n name: z.string().min(1).max(200),\n provider: z.enum(AI_PROVIDERS),\n encryptedApiKey: z.string().max(2000).default(''),\n model: z.string().max(200).optional(),\n active: z.boolean().default(false),\n createdAt: z.coerce.date(),\n updatedAt: z.coerce.date(),\n});\n\nexport type AIProvider = z.infer<typeof AIProviderSchema>;\n\nexport const JSLogParserSchema = z.object({\n id: z.string().min(1).max(128),\n name: z.string().min(1).max(200),\n description: z.string().max(2000).optional(),\n code: z.string().min(1).max(50000).refine(\n (s) => !s.includes('require(') && !s.includes('import ') && !s.includes('eval('),\n { message: 'Code must not contain require, import, or eval patterns' }\n ),\n enabled: z.boolean().default(true),\n version: z.literal(2).default(2).optional(),\n builtin: z.boolean().optional(),\n createdAt: z.coerce.date(),\n updatedAt: z.coerce.date(),\n});\n\nexport type JSLogParser = z.infer<typeof JSLogParserSchema>;\n\nexport const NOTIFICATION_CATEGORIES = [\n 'scenario_waiting_input',\n 'ai_conversation_complete',\n 'ai_conversation_error',\n 'service_error_log',\n 'service_status_changed',\n 'service_health_changed',\n] as const;\nexport type NotificationCategory = (typeof NOTIFICATION_CATEGORIES)[number];\n\nexport const NotificationPreferencesSchema = z.object({\n scenario_waiting_input: z.boolean().default(true),\n ai_conversation_complete: z.boolean().default(true),\n ai_conversation_error: z.boolean().default(true),\n service_error_log: z.boolean().default(true),\n service_status_changed: z.boolean().default(true),\n service_health_changed: z.boolean().default(true),\n});\nexport type NotificationPreferences = z.infer<typeof NotificationPreferencesSchema>;\n\nexport const SettingsSchema = z.object({\n mode: z.enum(['local-simple', 'cloud']),\n cloudUrl: z.string().url().max(2048).nullable().optional(),\n logParsers: z.array(JSLogParserSchema).max(100).default([]),\n scenarios: z.array(ScenarioSchema).max(100).default([]),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n\n\nexport const TraefikConfigSchema = z.object({\n enabled: z.boolean().default(false),\n acmeEmail: z.string().email().max(256).optional(),\n wildcardDomain: z.string().max(253).optional(),\n httpPort: z.number().int().min(1).max(65535).default(80),\n httpsPort: z.number().int().min(1).max(65535).default(443),\n dnsProvider: z.string().max(64).optional(),\n dnsCredentials: z.record(z.string().max(64), z.string().max(2048)).default({}),\n acmeStaging: z.boolean().default(false),\n encryptedCert: z.string().max(65536).optional(),\n encryptedCertKey: z.string().max(65536).optional(),\n});\n\nexport type TraefikConfig = z.infer<typeof TraefikConfigSchema>;\n\nexport const SettingsPrivateSchema = z.object({\n aiProviders: z.array(AIProviderSchema).max(50).default([]),\n scenarios: z.array(ScenarioSchema).max(100).default([]),\n notifications: NotificationPreferencesSchema.default(() => ({\n scenario_waiting_input: true,\n ai_conversation_complete: true,\n ai_conversation_error: true,\n service_error_log: true,\n service_status_changed: true,\n service_health_changed: true,\n })),\n traefikConfig: TraefikConfigSchema.optional(),\n});\n\nexport type SettingsPrivate = z.infer<typeof SettingsPrivateSchema>;\n\nexport const SchemaVersionSchema = z.object({\n version: z.number().int().positive(),\n migratedAt: z.coerce.date(),\n});\n\nexport type SchemaVersion = z.infer<typeof SchemaVersionSchema>;\n","import { z } from 'zod';\n\nconst PositionSchema = z.object({\n x: z.number(),\n y: z.number(),\n});\n\nexport const ScenarioGroupSchema = z.object({\n id: z.string().min(1).max(128),\n name: z.string().min(1).max(200),\n description: z.string().max(1000).optional(),\n color: z.string().max(32).optional(),\n position: PositionSchema.default({ x: 0, y: 0 }),\n width: z.number().default(300),\n height: z.number().default(200),\n});\n\nexport type ScenarioGroup = z.infer<typeof ScenarioGroupSchema>;\n\nexport const SCENARIO_ROLES = [\n 'manager',\n 'engineer',\n 'designer',\n 'analyst',\n 'qa',\n 'devops',\n 'product',\n 'writer',\n 'researcher',\n 'other',\n] as const;\n\nexport type ScenarioRole = typeof SCENARIO_ROLES[number];\n\n// --- Presets ---\n\nexport const ScenarioPresetRoleSchema = z.object({\n id: z.string().min(1).max(64),\n name: z.string().min(1).max(200),\n systemPrompt: z.string().max(10_000).default(''),\n prompt: z.string().max(10_000).default(''),\n});\n\nexport type ScenarioPresetRole = z.infer<typeof ScenarioPresetRoleSchema>;\n\nexport const ScenarioPresetInitialDataSchema = z.object({\n leaderId: z.string().min(1).max(128),\n groups: z.array(z.object({\n id: z.string().min(1).max(128),\n name: z.string().min(1).max(200),\n description: z.string().max(1000).optional(),\n color: z.string().max(32).optional(),\n position: z.object({ x: z.number(), y: z.number() }).default({ x: 0, y: 0 }),\n width: z.number().default(300),\n height: z.number().default(200),\n })).max(100).default([]),\n nodes: z.array(z.object({\n id: z.string().min(1).max(128),\n type: z.enum(['ai', 'ask']).default('ai'),\n parentIds: z.array(z.string().max(128)).default([]),\n groupId: z.string().max(128).nullable().default(null),\n label: z.string().max(240).default(''),\n role: z.string().max(64).default('other'),\n prompt: z.string().max(50_000).default(''),\n question: z.string().max(2_000).default(''),\n autoGenerated: z.boolean().default(true),\n canAddNode: z.boolean().default(false),\n aiCli: z.enum(['claude-code', 'codex']).default('claude-code'),\n model: z.string().max(128).default('sonnet'),\n position: z.object({ x: z.number(), y: z.number() }).default({ x: 0, y: 0 }),\n })).min(1).max(500),\n});\n\nexport type ScenarioPresetInitialData = z.infer<typeof ScenarioPresetInitialDataSchema>;\n\nconst LocalizedStringSchema = z.record(z.string(), z.string().max(100));\n\nexport const ScenarioPresetLabelsSchema = z.object({\n group: LocalizedStringSchema.optional(),\n node: LocalizedStringSchema.optional(),\n role: LocalizedStringSchema.optional(),\n leader: LocalizedStringSchema.optional(),\n});\n\nexport type ScenarioPresetLabels = z.infer<typeof ScenarioPresetLabelsSchema>;\n\nexport const ScenarioPresetSchema = z.object({\n id: z.string().min(1).max(128),\n name: z.string().min(1).max(200),\n icon: z.string().max(64).optional(),\n defaultTraversalMode: z.enum(['hierarchical', 'topological']).optional(),\n canChangeTraversalMode: z.boolean().default(true),\n roles: z.array(ScenarioPresetRoleSchema).min(1).max(100),\n initialData: ScenarioPresetInitialDataSchema.optional(),\n labels: ScenarioPresetLabelsSchema.optional(),\n});\n\nexport type ScenarioPreset = z.infer<typeof ScenarioPresetSchema>;\n\n// --- Node ---\n\nexport const ScenarioNodeSchema = z.object({\n id: z.string().min(1).max(128),\n type: z.enum(['ai', 'ask']).default('ai'),\n parentIds: z.array(z.string().max(128)).default([]),\n groupId: z.string().max(128).nullable().default(null),\n label: z.string().max(240).default(''),\n role: z.string().max(64).default('other'),\n prompt: z.string().max(50_000).default(''),\n question: z.string().max(2_000).default(''),\n autoGenerated: z.boolean().default(true),\n canAddNode: z.boolean().default(false),\n aiCli: z.enum(['claude-code', 'codex']).default('claude-code'),\n model: z.string().max(128).default('sonnet'),\n position: PositionSchema.default({ x: 0, y: 0 }),\n injectParentOutputs: z.boolean().default(false),\n injectedAncestorIds: z.array(z.string().max(128)).default([]),\n});\n\nexport type ScenarioNode = z.infer<typeof ScenarioNodeSchema>;\n\nexport const ScenarioSchema = z.object({\n id: z.string().min(1).max(128),\n name: z.string().min(1).max(200),\n icon: z.string().max(64).optional(),\n description: z.string().max(2000).optional(),\n leaderId: z.string().min(1).max(128),\n groups: z.array(ScenarioGroupSchema).max(100).default([]),\n nodes: z.array(ScenarioNodeSchema).min(1).max(500),\n traversalMode: z.enum(['hierarchical', 'topological']).default('hierarchical'),\n presetId: z.string().max(128).optional(),\n isPublished: z.boolean().default(false),\n createdAt: z.number(),\n updatedAt: z.number(),\n});\n\nexport type Scenario = z.infer<typeof ScenarioSchema>;\n","import { z } from 'zod';\n\nconst safePath = z\n .string()\n .min(1)\n .max(4096)\n .refine(\n (p) => !p.includes('\\0'),\n { message: 'path must not contain null bytes' },\n )\n .refine(\n (p) => !/(^|[/\\\\])\\.\\.([/\\\\]|$)/.test(p),\n { message: 'path must not contain path-traversal sequences (..)' },\n );\n\nexport const ConsoleLogSourceSchema = z.object({\n type: z.literal('console'),\n});\nexport type ConsoleLogSource = z.infer<typeof ConsoleLogSourceSchema>;\n\nexport const FileLogSourceSchema = z.object({\n type: z.literal('file'),\n path: safePath,\n encoding: z.string().max(32).default('utf-8'),\n startFromEnd: z.boolean().default(true),\n});\nexport type FileLogSource = z.infer<typeof FileLogSourceSchema>;\n\nexport const MongoLogSourceSchema = z.object({\n type: z.literal('mongo'),\n /** @sensitive — stored encrypted (AES-256-GCM) on disk */\n connectionString: z.string().min(1).max(2048),\n database: z.string().min(1).max(256),\n collection: z.string().min(1).max(256),\n filter: z.record(z.string(), z.unknown()).optional(),\n timestampField: z.string().max(128).default('timestamp'),\n messageField: z.string().max(128).default('message'),\n levelField: z.string().max(128).optional(),\n});\nexport type MongoLogSource = z.infer<typeof MongoLogSourceSchema>;\n\nexport const MySQLLogSourceSchema = z.object({\n type: z.literal('mysql'),\n host: z.string().min(1).max(253),\n port: z.number().int().min(1).max(65535).default(3306),\n user: z.string().min(1).max(256),\n /** @sensitive — stored encrypted (AES-256-GCM) on disk */\n password: z.string().max(2048),\n database: z.string().min(1).max(256),\n table: z.string().min(1).max(256),\n query: z.string().max(8192).optional(),\n timestampColumn: z.string().max(128).default('created_at'),\n messageColumn: z.string().max(128).default('message'),\n levelColumn: z.string().max(128).optional(),\n pollIntervalMs: z.number().int().min(500).max(60000).default(2000),\n});\nexport type MySQLLogSource = z.infer<typeof MySQLLogSourceSchema>;\n\nexport const LogSourceConfigSchema = z.discriminatedUnion('type', [\n ConsoleLogSourceSchema,\n FileLogSourceSchema,\n MongoLogSourceSchema,\n MySQLLogSourceSchema,\n]);\nexport type LogSourceConfig = z.infer<typeof LogSourceConfigSchema>;\nexport type LogSourceType = LogSourceConfig['type'];\n","import { z } from 'zod';\n\nexport const ProcessStateSchema = z.enum(['starting', 'running', 'stopped', 'errored']);\nexport type ProcessState = z.infer<typeof ProcessStateSchema>;\n\nexport const HealthStatusSchema = z.enum(['healthy', 'unhealthy', 'unknown']);\nexport type HealthStatus = z.infer<typeof HealthStatusSchema>;\n\nexport const ProcessStatusSchema = z.object({\n id: z.string().max(128),\n serviceId: z.string().max(128),\n agentId: z.string().max(128),\n state: ProcessStateSchema,\n pid: z.number().int().nullable().optional(),\n pids: z.array(z.number().int()).optional().default([]),\n exitCode: z.number().int().nullable().optional(),\n startedAt: z.coerce.date().nullable().optional(),\n restartCount: z.number().int().nonnegative().default(0),\n uptime: z.number().nonnegative().default(0),\n healthStatus: HealthStatusSchema.default('unknown'),\n});\n\nexport type ProcessStatus = z.infer<typeof ProcessStatusSchema>;\n","import { z } from 'zod';\n\nexport const LogLevelSchema = z.enum(['debug', 'info', 'warn', 'error', 'fatal']);\nexport type LogLevel = z.infer<typeof LogLevelSchema>;\n\nexport const LogLineSchema = z.object({\n /** Raw log line as received from the process (immutable context) */\n raw: z.string(),\n /** Source stream (immutable context) */\n stream: z.enum(['stdout', 'stderr']),\n /** Severity level */\n level: LogLevelSchema,\n /** Parsed/enriched message to display */\n message: z.string(),\n /** When true, the line is hidden from the log view */\n hidden: z.boolean(),\n /** Arbitrary key/value pairs shown in the detail panel */\n metadata: z.record(z.string().max(256), z.unknown()).refine(\n (obj) => Object.keys(obj).length <= 100,\n { message: 'Too many metadata keys (max 100)' },\n ),\n /** Full parsed JSON object when the line is JSON */\n json: z.record(z.string(), z.unknown()).optional(),\n /** Custom header for the JSON log card (supports HTML, sanitized before display) */\n jsonHeader: z.string().max(256).optional(),\n});\n\nexport type LogLine = z.infer<typeof LogLineSchema>;\n\nexport const LogCardDirectiveSchema = z.object({\n id: z.string().max(128),\n type: z.string().max(64),\n header: z.string().max(256),\n collapsable: z.boolean().optional(),\n collapsed: z.boolean().optional(),\n state: z.enum(['open', 'append', 'close', 'self']),\n});\nexport type LogCardDirective = z.infer<typeof LogCardDirectiveSchema>;\n\nexport const ParsedLogSchema = z.object({\n id: z.string().max(128),\n processId: z.string().max(128),\n pid: z.number().int().nullable().optional(),\n timestamp: z.coerce.date(),\n level: LogLevelSchema.default('info'),\n message: z.string().max(16384),\n raw: z.string().max(16384),\n stream: z.enum(['stdout', 'stderr']).default('stdout'),\n hidden: z.boolean().optional().default(false),\n metadata: z.record(z.string().max(256), z.unknown()).optional().refine(\n (obj) => !obj || Object.keys(obj).length <= 100,\n { message: 'Too many metadata keys (max 100)' },\n ),\n json: z.record(z.string(), z.unknown()).optional(),\n logCard: LogCardDirectiveSchema.optional(),\n sourceType: z.enum(['console', 'file', 'mongo', 'mysql']).optional(),\n sourcePath: z.string().max(4096).optional(),\n});\n\nexport type ParsedLog = z.infer<typeof ParsedLogSchema>;\n","import { z } from 'zod';\n\n/** Regex for valid POSIX environment variable names */\nexport const ENV_VAR_NAME_REGEX = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\nexport const AgentConfigSchema = z.object({\n id: z.string().max(128),\n name: z.string().min(1).max(100),\n url: z.string().url().max(2048),\n passphrase: z.string().min(1).max(1024),\n passthroughEnv: z.array(\n z.string().regex(ENV_VAR_NAME_REGEX).max(256),\n ).max(100).default([]),\n});\n\nexport type AgentConfig = z.infer<typeof AgentConfigSchema>;\n\nexport const AgentStatusSchema = z.object({\n connected: z.boolean(),\n lastSeen: z.string().nullable().optional(),\n uptime: z.number().nonnegative().default(0),\n runnersAvailable: z.array(z.enum(['native', 'docker'])).default(['native']),\n lanIp: z.string().optional(),\n});\n\nexport type AgentStatus = z.infer<typeof AgentStatusSchema>;\n","import { z } from 'zod';\n\nexport const GlobalRoleSchema = z.enum(['owner', 'admin', 'member']);\nexport type GlobalRole = z.infer<typeof GlobalRoleSchema>;\n\nexport const ProjectRoleSchema = z.enum(['admin', 'editor', 'viewer']);\nexport type ProjectRole = z.infer<typeof ProjectRoleSchema>;\n\nexport const ProjectMemberRoleSchema = z.object({\n id: z.string().max(128),\n projectId: z.string().max(128),\n userId: z.string().max(128),\n role: ProjectRoleSchema,\n});\n\nexport type ProjectMemberRole = z.infer<typeof ProjectMemberRoleSchema>;\n","import { z } from 'zod';\n\nexport const ConfigVersionSchema = z.object({\n id: z.string().max(128),\n entityType: z.enum(['project', 'service']),\n entityId: z.string().max(128),\n version: z.string().max(128),\n parentVersion: z.string().max(128),\n data: z.record(z.string(), z.unknown()).refine(\n (obj) => Object.keys(obj).length <= 1000,\n 'Too many data keys (max 1000)',\n ),\n patch: z.array(z.record(z.string(), z.unknown())).max(1000),\n userId: z.string().max(128),\n timestamp: z.coerce.date(),\n resolved: z.boolean().default(false),\n});\n\nexport type ConfigVersion = z.infer<typeof ConfigVersionSchema>;\n\nexport const ConfigChangeSchema = z.object({\n entityType: z.enum(['project', 'service']),\n entityId: z.string().max(128),\n version: z.string().max(128),\n parentVersion: z.string().max(128),\n data: z.record(z.string(), z.unknown()).refine(\n (obj) => Object.keys(obj).length <= 1000,\n 'Too many data keys (max 1000)',\n ),\n patch: z.array(z.record(z.string(), z.unknown())).max(1000),\n});\n\nexport type ConfigChange = z.infer<typeof ConfigChangeSchema>;\n\nexport const SyncStatusSchema = z.object({\n connected: z.boolean(),\n lastSync: z.coerce.date().nullable().optional(),\n pendingChanges: z.number().int().nonnegative().default(0),\n conflicts: z.number().int().nonnegative().default(0),\n});\n\nexport type SyncStatus = z.infer<typeof SyncStatusSchema>;\n","import { z } from 'zod';\n\nexport const AuditActionSchema = z.enum([\n 'create', 'update', 'delete',\n 'invite', 'remove',\n 'deploy', 'start', 'stop',\n 'roleChange',\n]);\n\nexport type AuditAction = z.infer<typeof AuditActionSchema>;\n\nexport const AuditEntityTypeSchema = z.enum([\n 'org', 'project', 'service', 'member', 'permission',\n]);\n\nexport type AuditEntityType = z.infer<typeof AuditEntityTypeSchema>;\n\nexport const AuditLogSchema = z.object({\n id: z.string().max(128),\n orgId: z.string().max(128),\n userId: z.string().max(128),\n action: AuditActionSchema,\n entityType: AuditEntityTypeSchema,\n entityId: z.string().max(128),\n metadata: z.record(z.string().max(256), z.unknown()).default({}).refine(\n (obj) => Object.keys(obj).length <= 100,\n { message: 'Too many metadata keys (max 100)' },\n ),\n timestamp: z.coerce.date(),\n});\n\nexport type AuditLog = z.infer<typeof AuditLogSchema>;\n","import { z } from 'zod';\n\nexport const ProcessMetricsSchema = z.object({\n processId: z.string().max(128),\n cpu: z.number().nonnegative(),\n memory: z.number().int().nonnegative(),\n timestamp: z.string(),\n});\n\nexport type ProcessMetrics = z.infer<typeof ProcessMetricsSchema>;\n","import { z } from 'zod';\nimport { VariableSchema } from './service.schema.js';\n\n// Environment schema — uses VariablesRecord for variable storage\nexport const EnvironmentVariablesSchema = z.record(\n z.string().max(256),\n VariableSchema,\n).refine(\n (obj) => Object.keys(obj).length <= 200,\n { message: 'Max 200 variables' },\n);\n\nexport const EnvironmentSchema = z.object({\n id: z.string().max(128),\n projectId: z.string().max(128),\n name: z.string().min(1).max(200),\n description: z.string().max(2000).optional().default(''),\n parentIds: z.array(z.string().max(128)).max(10).default([]),\n variables: EnvironmentVariablesSchema.default({}),\n // Scope: 'global' = project-level env, 'service' = per-service env\n scope: z.enum(['global', 'service']).default('global'),\n // When scope='service': the serviceId this env belongs to\n reference: z.string().max(128).optional(),\n // When scope='service': the globalEnvId this env activates on\n activateOn: z.string().max(128).optional(),\n immutable: z.boolean().default(false),\n default: z.boolean().optional().default(false),\n color: z.string().max(20).optional(),\n bgColor: z.string().max(20).optional(),\n // When scope='global': the default agent used by services that don't have an explicit agentId\n agentId: z.string().max(128).optional(),\n});\n\nexport type Environment = z.infer<typeof EnvironmentSchema>;\n\n// Resolved environment: flattened env dict + secrets list + source tracking\nexport const ResolvedEnvironmentSchema = z.object({\n variables: z.record(z.string().max(256), VariableSchema)\n .refine((obj) => Object.keys(obj).length <= 500, { message: 'Max 500 resolved variables' }),\n env: z.record(z.string().max(256), z.string().max(8192))\n .refine((obj) => Object.keys(obj).length <= 500, { message: 'Max 500 resolved env vars' }),\n envSecrets: z.array(z.string().max(256)).max(500),\n sources: z.record(z.string().max(256), z.object({\n environmentId: z.string().max(128),\n environmentName: z.string().max(200),\n overridden: z.boolean(),\n resolvedFrom: z.object({\n environmentId: z.string().max(128),\n environmentName: z.string().max(200),\n }).optional(),\n })).refine((obj) => Object.keys(obj).length <= 500, { message: 'Max 500 source entries' }),\n});\n\nexport type ResolvedEnvironment = z.infer<typeof ResolvedEnvironmentSchema>;\n\nexport const CreateEnvironmentSchema = EnvironmentSchema.omit({ id: true }).extend({\n description: z.string().max(2000).optional().default(''),\n parentIds: z.array(z.string().max(128)).max(10).optional().default([]),\n variables: EnvironmentVariablesSchema.optional().default({}),\n scope: z.enum(['global', 'service']).optional().default('global'),\n reference: z.string().max(128).optional(),\n activateOn: z.string().max(128).optional(),\n immutable: z.boolean().optional().default(false),\n});\nexport type CreateEnvironment = z.input<typeof CreateEnvironmentSchema>;\n\n// IMPORTANT: Do NOT simplify this to `EnvironmentSchema.partial().required({ id: true })`.\n//\n// EnvironmentSchema has .default() on several fields (variables: {}, parentIds: [], description: '',\n// scope: 'global', immutable: false, default: false). When Zod parses a partial update input that\n// omits those fields, .partial() alone does NOT strip the defaults — Zod still fills them in.\n// The store checks `input.variables !== undefined` to decide whether to overwrite, so if Zod\n// silently injects `variables: {}`, the store wipes ALL existing variables on every save.\n//\n// The .extend() below overrides those fields without .default(), making them truly optional\n// (undefined when absent). DO NOT remove it or merge the .extend() back into EnvironmentSchema.\nexport const UpdateEnvironmentSchema = EnvironmentSchema\n .partial()\n .required({ id: true })\n .extend({\n description: z.string().max(2000).optional(),\n parentIds: z.array(z.string().max(128)).max(10).optional(),\n variables: EnvironmentVariablesSchema.optional(),\n scope: z.enum(['global', 'service']).optional(),\n immutable: z.boolean().optional(),\n default: z.boolean().optional(),\n agentId: z.string().max(128).nullable().optional(), // null = clear (no default agent)\n });\nexport type UpdateEnvironment = z.infer<typeof UpdateEnvironmentSchema>;\n","import { z } from 'zod';\nimport { VariableSchema } from './service.schema.js';\n\n// Environment overrides: Record<variableId, Variable>\n// Flat structure — each override is keyed by the variable's unique ID.\nexport const EnvironmentOverridesSchema = z.record(\n z.string().max(128),\n VariableSchema,\n).refine(\n (obj) => Object.keys(obj).length <= 5000,\n { message: 'Max 5000 overrides' },\n);\n\nexport type EnvironmentOverrides = z.infer<typeof EnvironmentOverridesSchema>;\n","import { z } from 'zod';\n\nexport const ApiServiceActionSchema = z.enum([\n 'service:read',\n 'service:start',\n 'service:stop',\n 'service:restart',\n 'service:healthcheck',\n 'service:status',\n 'logs:read',\n]);\nexport type ApiServiceAction = z.infer<typeof ApiServiceActionSchema>;\n\n/** Backward-compat alias */\nexport type ApiAction = ApiServiceAction;\n/** @deprecated use ApiServiceActionSchema */\nconst ApiActionSchema = ApiServiceActionSchema;\n\nexport const ApiEnvActionSchema = z.enum(['env:read', 'env:write']);\nexport type ApiEnvAction = z.infer<typeof ApiEnvActionSchema>;\n\nexport const ApiEnvPermSchema = z.object({\n environmentId: z.string().max(128),\n actions: z.array(ApiEnvActionSchema).max(10).default(['env:read']),\n includeSecrets: z.boolean().default(false),\n});\nexport type ApiEnvPerm = z.infer<typeof ApiEnvPermSchema>;\n\nexport const ApiServicePermSchema = z.object({\n serviceId: z.string().max(128),\n actions: z.array(ApiServiceActionSchema).max(10).default(['service:read']),\n environments: z.array(ApiEnvPermSchema).max(100).default([]),\n});\nexport type ApiServicePerm = z.infer<typeof ApiServicePermSchema>;\n\nexport const ApiKeyScopeSchema = z.object({\n services: z.array(ApiServicePermSchema).max(500).default([]),\n});\nexport type ApiKeyScope = z.infer<typeof ApiKeyScopeSchema>;\n\nexport const ApiKeySchema = z.object({\n id: z.string().max(128),\n name: z.string().min(1).max(200),\n key: z.string().regex(/^[0-9a-f]{64}$/i),\n scopes: ApiKeyScopeSchema,\n createdAt: z.string().max(64),\n isPublic: z.boolean().default(false),\n});\nexport type ApiKey = z.infer<typeof ApiKeySchema>;\n\nexport const ApiKeysFileSchema = z.object({\n keys: z.array(ApiKeySchema).max(100),\n});\n\n","import { z } from 'zod';\n\nexport const ALLOWED_IMAGE_MIME_TYPES = ['image/png', 'image/jpeg', 'image/webp', 'image/gif'] as const;\n\nexport const ImagePartSchema = z.object({\n type: z.literal('image'),\n imageId: z.string().regex(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, 'Must be a valid UUID'),\n url: z.string().min(1),\n mimeType: z.enum(ALLOWED_IMAGE_MIME_TYPES),\n altText: z.string().max(500).optional(),\n});\n\nexport type ImagePart = z.infer<typeof ImagePartSchema>;\n\nexport const ImageUploadResponseSchema = z.object({\n imageId: z.string().regex(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, 'Must be a valid UUID'),\n url: z.string().min(1),\n mimeType: z.enum(ALLOWED_IMAGE_MIME_TYPES),\n originalName: z.string(),\n});\n\nexport type ImageUploadResponse = z.infer<typeof ImageUploadResponseSchema>;\n\nexport const ImageMetaSchema = z.object({\n imageId: z.string().regex(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, 'Must be a valid UUID'),\n filePath: z.string().min(1),\n mimeType: z.enum(ALLOWED_IMAGE_MIME_TYPES),\n originalName: z.string().min(1),\n createdAt: z.number().positive(),\n size: z.number().positive().optional(),\n});\n\nexport type ImageMeta = z.infer<typeof ImageMetaSchema>;\n","import { z } from 'zod';\n\n// --- Card History ---\nexport const KanbanCardEventSchema = z.object({\n type: z.enum(['created', 'edited', 'moved', 'image_added', 'image_removed', 'title_changed', 'conversation_started', 'scenario_started', 'comment']),\n timestamp: z.string(),\n /** Extra context: old/new column name, old/new title, comment text, etc. */\n detail: z.string().max(5000).optional(),\n /** Who authored this event — 'ai' or 'user'. Only set for comment events. */\n author: z.enum(['ai', 'user']).optional(),\n /** Conversation that produced this event (comments only). Used to navigate back to the conversation. */\n conversationId: z.string().optional(),\n});\nexport type KanbanCardEvent = z.infer<typeof KanbanCardEventSchema>;\n\n// --- Card ---\nexport const KanbanCardSchema = z.object({\n id: z.string(),\n title: z.string().min(1).max(500),\n markdown: z.string().max(100_000).default(''),\n /** Base64-encoded image data URIs attached to the card */\n images: z.array(z.string()).default([]),\n order: z.number().int(),\n history: z.array(KanbanCardEventSchema).default([]),\n createdAt: z.string(),\n updatedAt: z.string(),\n});\nexport type KanbanCard = z.infer<typeof KanbanCardSchema>;\n\n// --- Column ---\nexport const KanbanColumnSchema = z.object({\n id: z.string(),\n title: z.string().min(1).max(200),\n order: z.number().int(),\n cards: z.array(KanbanCardSchema).default([]),\n});\nexport type KanbanColumn = z.infer<typeof KanbanColumnSchema>;\n\n// --- Board ---\nexport const KanbanBoardSchema = z.object({\n id: z.string(),\n name: z.string().min(1).max(200),\n description: z.string().max(10_000).default(''),\n columns: z.array(KanbanColumnSchema).default([]),\n archived: z.boolean().default(false),\n createdAt: z.string(),\n updatedAt: z.string(),\n});\nexport type KanbanBoard = z.infer<typeof KanbanBoardSchema>;\n\n// --- Inputs ---\nexport const CreateKanbanBoardInput = z.object({\n name: z.string().min(1).max(200),\n description: z.string().max(10_000).optional(),\n});\nexport type CreateKanbanBoardInput = z.infer<typeof CreateKanbanBoardInput>;\n\nexport const UpdateKanbanBoardInput = z.object({\n id: z.string(),\n name: z.string().min(1).max(200).optional(),\n description: z.string().max(10_000).optional(),\n columns: z.array(KanbanColumnSchema).optional(),\n archived: z.boolean().optional(),\n});\nexport type UpdateKanbanBoardInput = z.infer<typeof UpdateKanbanBoardInput>;\n","import { createCipheriv, createDecipheriv, randomBytes, pbkdf2Sync } from 'node:crypto';\n\nconst PREFIX = 'aes256gcm:';\nconst IV_LENGTH = 12;\nconst AUTH_TAG_LENGTH = 16;\nconst KEY_LENGTH = 32;\nconst PBKDF2_ITERATIONS = 100_000;\nconst PBKDF2_DIGEST = 'sha256';\n/** Fixed salt for key derivation — the purpose is the salt (lazy to avoid Buffer at module init) */\nlet _KDF_SALT: Buffer | undefined;\nfunction getKdfSalt(): Buffer {\n if (!_KDF_SALT) _KDF_SALT = Buffer.from('runeya-log-sources-key-v1', 'utf8');\n return _KDF_SALT;\n}\n\n/**\n * Derives a 32-byte AES-256 key from `rawKey` using PBKDF2-SHA256.\n * The input key may be any Buffer (e.g. the raw passphrase bytes).\n */\nexport function deriveKey(rawKey: Buffer): Buffer {\n return pbkdf2Sync(rawKey, getKdfSalt(), PBKDF2_ITERATIONS, KEY_LENGTH, PBKDF2_DIGEST);\n}\n\n/**\n * Encrypts `plaintext` using AES-256-GCM.\n * Returns a string in the format: `aes256gcm:<iv_hex>:<authTag_hex>:<ciphertext_hex>`\n */\nexport function encrypt(plaintext: string, key: Buffer): string {\n const iv = randomBytes(IV_LENGTH);\n const cipher = createCipheriv('aes-256-gcm', key, iv);\n const encrypted = Buffer.concat([cipher.update(plaintext, 'utf8'), cipher.final()]);\n const authTag = cipher.getAuthTag();\n return `${PREFIX}${iv.toString('hex')}:${authTag.toString('hex')}:${encrypted.toString('hex')}`;\n}\n\n/**\n * Decrypts a ciphertext string produced by `encrypt()`.\n * Throws if the format is invalid or authentication fails.\n */\nexport function decrypt(ciphertext: string, key: Buffer): string {\n if (!isEncrypted(ciphertext)) {\n throw new Error('Value is not in encrypted format');\n }\n const parts = ciphertext.slice(PREFIX.length).split(':');\n if (parts.length !== 3) {\n throw new Error('Invalid encrypted value format');\n }\n const [ivHex, authTagHex, encryptedHex] = parts;\n const iv = Buffer.from(ivHex, 'hex');\n const authTag = Buffer.from(authTagHex, 'hex');\n const encryptedBuffer = Buffer.from(encryptedHex, 'hex');\n\n if (iv.length !== IV_LENGTH) throw new Error('Invalid IV length');\n if (authTag.length !== AUTH_TAG_LENGTH) throw new Error('Invalid authTag length');\n\n const decipher = createDecipheriv('aes-256-gcm', key, iv, { authTagLength: 16 });\n decipher.setAuthTag(authTag);\n return Buffer.concat([decipher.update(encryptedBuffer), decipher.final()]).toString('utf8');\n}\n\n/**\n * Returns true if `value` is in the encrypted format produced by `encrypt()`.\n * Safe to call on plain-text values (returns false).\n */\nexport function isEncrypted(value: string): boolean {\n return value.startsWith(PREFIX);\n}\n","import type { JSLogParser } from './schemas/settings.schema.js';\n\n/**\n * Built-in log parsers that ship with Runeya.\n * IDs are prefixed with `native:` to distinguish from user-created parsers.\n *\n * All native parsers use the v2 pipeline signature: (line: LogLine) => LogLine\n * Each parser enriches the LogLine and passes it through. Order matters — the\n * service's parserIds array determines execution order.\n */\n\nconst epoch = new Date('2025-01-01T00:00:00Z');\n\nexport const nativeParsers: JSLogParser[] = [\n {\n id: 'native:json',\n name: 'JSON Log Parser',\n description: 'Parses JSON log lines and extracts level, message, timestamp, metadata, and the full parsed object.',\n code: `(line) => {\n var trimmed = line.message.trim();\n if (!trimmed.startsWith('{')) return line;\n try {\n var obj = JSON.parse(trimmed);\n var level = (obj.level || obj.severity || obj.loglevel || '').toString().toLowerCase();\n var levelMap = { trace: 'debug', debug: 'debug', info: 'info', warn: 'warn', warning: 'warn', error: 'error', fatal: 'fatal', err: 'error' };\n var mappedLevel = levelMap[level] || line.level;\n var message = obj.message || obj.msg || obj.text || trimmed;\n var metadata = {};\n for (var k in obj) {\n if (['level','severity','loglevel','message','msg','text','timestamp','time','ts'].indexOf(k) !== -1) continue;\n metadata[k] = typeof obj[k] === 'string' ? obj[k] : JSON.stringify(obj[k]);\n }\n var merged = {};\n for (var mk in line.metadata) merged[mk] = line.metadata[mk];\n for (var nk in metadata) merged[nk] = metadata[nk];\n return { raw: line.raw, stream: line.stream, level: mappedLevel, message: String(message).slice(0, 16384), hidden: line.hidden, metadata: merged, json: obj, jsonHeader: line.jsonHeader };\n } catch (e) { return line; }\n}`,\n enabled: true,\n version: 2,\n builtin: true,\n createdAt: epoch,\n updatedAt: epoch,\n },\n {\n id: 'native:debug',\n name: 'Runeya Debug Parser',\n description: 'Detects Runeya internal debug logs emitted as JSON arrays: [\"runeya\", payload]. Marks them as debug level.',\n code: `(line) => {\n var trimmed = line.message.trim();\n if (!trimmed.startsWith('[')) return line;\n try {\n var parsed = JSON.parse(trimmed);\n if (!Array.isArray(parsed) || parsed[0] !== 'runeya') return line;\n var debug = parsed.length === 2 ? parsed[1] : parsed.slice(1);\n var message = typeof debug === 'string' ? debug : JSON.stringify(debug);\n var merged = {};\n for (var k in line.metadata) merged[k] = line.metadata[k];\n merged.runeya_debug = JSON.stringify(debug);\n return { raw: line.raw, stream: line.stream, level: 'debug', message: message, hidden: line.hidden, metadata: merged, jsonHeader: line.jsonHeader };\n } catch (e) { return line; }\n}`,\n enabled: true,\n version: 2,\n builtin: true,\n createdAt: epoch,\n updatedAt: epoch,\n },\n {\n id: 'native:links',\n name: 'Link Detector',\n description: 'Detects URLs in plain-text log lines and exposes them in metadata.links for frontend rendering.',\n code: `(line) => {\n var urlRegex = /(https?|ftp):\\\\/\\\\/[\\\\w_-]+(?:\\\\.[\\\\w_-]+)+([\\\\w.,@?^=%&:/~+#-]*[\\\\w@?^=%&/~+#-])?/gi;\n var urls = line.message.match(urlRegex);\n if (!urls || urls.length === 0) return line;\n var merged = {};\n for (var k in line.metadata) merged[k] = line.metadata[k];\n merged.links = urls.join(' ');\n return { raw: line.raw, stream: line.stream, level: line.level, message: line.message, hidden: line.hidden, metadata: merged, jsonHeader: line.jsonHeader };\n}`,\n enabled: true,\n version: 2,\n builtin: true,\n createdAt: epoch,\n updatedAt: epoch,\n },\n];\n\n/** Look up a native parser by ID */\nexport function getNativeParser(id: string): JSLogParser | undefined {\n return nativeParsers.find(p => p.id === id);\n}\n","import vm from 'node:vm';\nimport type { JSLogParser as JSLogParserDef } from './schemas/settings.schema.js';\nimport type { LogLine } from './schemas/log.schema.js';\nimport type { LogLevel } from './schemas/log.schema.js';\n\ninterface CompiledParser {\n id: string;\n name: string;\n enabled: boolean;\n fn: (line: LogLine) => LogLine;\n}\n\nconst VALID_LEVELS = new Set<string>(['debug', 'info', 'warn', 'error', 'fatal']);\n\nexport class JSLogParser {\n private parsers: CompiledParser[] = [];\n\n constructor(definitions: JSLogParserDef[] = []) {\n this.setParsers(definitions);\n }\n\n setParsers(definitions: JSLogParserDef[]): void {\n this.parsers = [];\n\n for (const def of definitions) {\n if (!def.enabled) continue;\n\n try {\n const compiled = this.compileParser(def);\n this.parsers.push({\n id: def.id,\n name: def.name,\n enabled: true,\n fn: compiled,\n });\n } catch (err) {\n console.warn(\n `[js-log-parser] Failed to compile parser \"${def.name}\" (${def.id}): ${\n err instanceof Error ? err.message : String(err)\n }`\n );\n }\n }\n }\n\n parse(line: LogLine): LogLine {\n let current = line;\n\n for (const parser of this.parsers) {\n try {\n current = parser.fn(current);\n } catch (err) {\n console.warn(\n `[js-log-parser] Parser \"${parser.name}\" threw error: ${\n err instanceof Error ? err.message : String(err)\n }`\n );\n }\n }\n\n return this.sanitize(current);\n }\n\n private compileParser(def: JSLogParserDef): (line: LogLine) => LogLine {\n const forbidden = ['require(', 'import ', 'eval('];\n for (const pat of forbidden) {\n if (def.code.includes(pat)) {\n throw new Error('Code contains forbidden patterns (require, import, eval)');\n }\n }\n\n const sandbox = {\n RegExp,\n String,\n Object,\n Array,\n JSON,\n Math,\n Date,\n undefined,\n null: null,\n };\n\n let script: vm.Script;\n try {\n script = new vm.Script(`(${def.code})`, { filename: `parser-${def.id}.js` });\n } catch (err) {\n throw new Error(`Compilation failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n let parserFn: unknown;\n try {\n parserFn = script.runInNewContext(sandbox, { timeout: 100 });\n } catch (err) {\n throw new Error(`Execution failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n if (typeof parserFn !== 'function') {\n throw new Error('Parser code must export a function');\n }\n\n return (line: LogLine): LogLine => {\n const result = parserFn(line);\n if (result === null || result === undefined || typeof result !== 'object') {\n return line;\n }\n return result as LogLine;\n };\n }\n\n /** Sanitize the final LogLine: truncate message, limit metadata, validate level */\n private sanitize(line: LogLine): LogLine {\n let { message, metadata, level } = line;\n\n if (message.length > 16384) {\n message = message.substring(0, 16384) + '...[truncated]';\n }\n\n const metaKeys = Object.keys(metadata);\n if (metaKeys.length > 100) {\n const limited: Record<string, unknown> = {};\n for (let i = 0; i < 100; i++) {\n limited[metaKeys[i]] = metadata[metaKeys[i]];\n }\n metadata = limited;\n }\n\n if (!VALID_LEVELS.has(level)) {\n level = 'info' as LogLevel;\n }\n\n if (message !== line.message || metadata !== line.metadata || level !== line.level) {\n return { ...line, message, metadata, level };\n }\n return line;\n }\n}\n","/** Health check default interval (ms) */\nexport const HEALTH_CHECK_INTERVAL = 30_000;\n\n/** Metrics collection interval (ms) */\nexport const METRICS_INTERVAL = 5_000;\n\n/** Agent health polling interval (ms) */\nexport const AGENT_HEALTH_POLL_INTERVAL = 15_000;\n\n/** UI search/filter debounce (ms) */\nexport const SEARCH_DEBOUNCE = 300;\n\n/** Health check initial delay before first check (ms) */\nexport const HEALTH_CHECK_INITIAL_DELAY = 5_000;\n\n/** Agent health WS interval (ms) */\nexport const HEALTH_WS_INTERVAL = 10_000;\n","/** Default log ring buffer size */\nexport const LOG_BUFFER_SIZE = 5_000;\n\n/** Max log entries displayed in UI */\nexport const LOG_DISPLAY_LIMIT = 500;\n","/** Default process grace period before SIGKILL (ms) */\nexport const GRACE_PERIOD = 10_000;\n\n/** HTTP fetch timeout for agent calls (ms) */\nexport const AGENT_FETCH_TIMEOUT = 10_000;\n\n/** HTTP fetch timeout for long-running agent calls like shortcuts/ad-hoc commands (ms) — 10 minutes */\nexport const AGENT_LONG_FETCH_TIMEOUT = 600_000;\n\n/** HTTP fetch timeout for process stop calls (ms) — grace period + generous buffer */\nexport const AGENT_STOP_FETCH_TIMEOUT = GRACE_PERIOD + 15_000;\n\n/** Passphrase extraction timeout during agent spawn (ms) */\nexport const PASSPHRASE_TIMEOUT = 30_000;\n\n/** Min WS reconnect delay (ms) */\nexport const WS_RECONNECT_MIN = 1_000;\n\n/** Max WS reconnect delay (ms) */\nexport const WS_RECONNECT_MAX = 15_000;\n\n/** Max WS reconnect attempts */\nexport const WS_RECONNECT_MAX_ATTEMPTS = 5;\n\n/** Base retry delay for subscriptions (ms) */\nexport const SUBSCRIPTION_RETRY_BASE = 1_000;\n","export interface EditorDefinition {\n key: string;\n name: string;\n command: string;\n}\n\nexport const SUPPORTED_EDITORS: EditorDefinition[] = [\n { key: 'vscode', name: 'Visual Studio Code', command: 'code' },\n { key: 'cursor', name: 'Cursor', command: 'cursor' },\n { key: 'windsurf', name: 'Windsurf', command: 'windsurf' },\n { key: 'sublime', name: 'Sublime Text', command: 'subl' },\n { key: 'atom', name: 'Atom', command: 'atom' },\n { key: 'antigravity', name: 'Antigravity', command: 'antigravity' },\n { key: 'intellij', name: 'IntelliJ IDEA', command: 'idea' },\n { key: 'android-studio', name: 'Android Studio', command: 'studio' },\n { key: 'webstorm', name: 'WebStorm', command: 'webstorm' },\n { key: 'zed', name: 'Zed', command: 'zed' },\n { key: 'neovim', name: 'Neovim', command: 'nvim' },\n { key: 'vim', name: 'Vim', command: 'vim' },\n { key: 'emacs', name: 'Emacs', command: 'emacs' },\n { key: 'fleet', name: 'Fleet', command: 'fleet' },\n];\n\nexport const EDITOR_BY_KEY = new Map<string, EditorDefinition>(\n SUPPORTED_EDITORS.map((e) => [e.key, e]),\n);\n","import { spawn, type ChildProcess } from 'node:child_process';\nimport { createInterface } from 'node:readline';\nimport { watch } from 'node:fs';\nimport { join } from 'node:path';\nimport { env } from '../config/env.js';\nimport { PASSPHRASE_TIMEOUT } from '@runeya/packages-shared';\nimport { agentManager } from './agent-manager.js';\nimport { deriveStableSecret } from '../utils/encryption-key.js';\n\n/**\n * Build a minimal environment for the spawned agent process.\n * Only pass system-essential and explicitly needed variables —\n * never spread all of process.env to avoid leaking secrets.\n *\n * Returns null if encryption key is not available (setup mode).\n */\nfunction buildAgentEnv(): Record<string, string> | null {\n const safeKeys = ['PATH', 'HOME', 'USER', 'SHELL', 'LANG', 'TERM', 'NODE_ENV', 'TMPDIR', 'TZ', 'DBUS_SESSION_BUS_ADDRESS', 'XDG_RUNTIME_DIR'];\n const agentEnv: Record<string, string> = {\n RUNEYA_AGENT_PORT: String(env.RUNEYA_AGENT_PORT),\n RUNEYA_AGENT_HOST: env.RUNEYA_AGENT_HOST,\n };\n\n // In local-simple mode, use a stable passphrase derived from encryption key\n // (allows committing agents.json without constant changes on restart)\n if (env.MODE === 'local-simple') {\n const passphrase = deriveStableSecret('local-agent-passphrase');\n if (!passphrase) {\n // Encryption key not available — cannot spawn agent\n return null;\n }\n agentEnv.PASSPHRASE_OVERRIDE = passphrase;\n }\n\n for (const key of safeKeys) {\n if (process.env[key]) {\n agentEnv[key] = process.env[key]!;\n }\n }\n\n return agentEnv;\n}\n\nconst LOCAL_AGENT_ID = 'local-agent';\nconst LOCAL_AGENT_NAME = 'local';\n\nclass AgentSpawner {\n private agentProcess: ChildProcess | null = null;\n private exitHandlerRegistered = false;\n private fileWatcher: ReturnType<typeof watch> | null = null;\n private isRestarting = false;\n private agentDistPath: string | null = null;\n\n async spawnLocalAgent(): Promise<void> {\n const agentUrl = `http://${env.RUNEYA_AGENT_HOST}:${env.RUNEYA_AGENT_PORT}`;\n\n // Check if encryption key is available\n const agentEnv = buildAgentEnv();\n if (!agentEnv) {\n console.log('[agent-spawner] ⚠️ Cannot spawn local agent: encryption key not available');\n console.log('[agent-spawner] Please provide the encryption key via the setup UI');\n return;\n }\n\n console.log(`[agent-spawner] Spawning local agent on ${agentUrl}...`);\n\n const isDev = process.env.NODE_ENV === 'development';\n // Use AGENT_BINARY_PATH if provided (e.g., from CLI), otherwise infer from cwd\n this.agentDistPath = env.AGENT_BINARY_PATH || join(process.cwd(), '..', 'agent', 'dist', 'index.js');\n\n // Always spawn from dist/index.js (built by tsup watch in dev mode)\n this.agentProcess = spawn('node', [this.agentDistPath], {\n env: agentEnv,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n if (isDev) {\n // In dev mode, watch dist/index.js and restart agent when it changes\n // (tsup --watch rebuilds this file when src/ changes)\n this.setupFileWatcher();\n }\n\n // Safety net: kill agent synchronously when server process exits for any reason\n // (e.g. Ctrl+C via Turbo/tsup where async shutdown may not complete)\n if (!this.exitHandlerRegistered) {\n this.exitHandlerRegistered = true;\n process.on('exit', () => {\n if (this.agentProcess && !this.agentProcess.killed) {\n this.agentProcess.kill('SIGKILL');\n }\n });\n }\n\n // Parse passphrase from stdout\n const passphrase = await this.waitForPassphrase();\n if (!passphrase) {\n console.error('[agent-spawner] Failed to get passphrase from local agent');\n return;\n }\n\n console.log('[agent-spawner] Local agent started, passphrase received');\n\n // Register the local agent (in-memory only — no persistence to agents.json)\n await agentManager.registerLocal({ id: LOCAL_AGENT_ID, name: LOCAL_AGENT_NAME, url: agentUrl, passphrase, passthroughEnv: [] });\n console.log(`[agent-spawner] Local agent registered as ${LOCAL_AGENT_ID}`);\n }\n\n private waitForPassphrase(): Promise<string | null> {\n return new Promise((resolve) => {\n if (!this.agentProcess?.stdout) {\n resolve(null);\n return;\n }\n\n const rl = createInterface({ input: this.agentProcess.stdout });\n const timeout = setTimeout(() => {\n resolve(null);\n }, PASSPHRASE_TIMEOUT);\n\n let initialPassphraseFound = false;\n\n rl.on('line', (line) => {\n const match = line.match(/^RUNEYA_PASSPHRASE=([a-f0-9]{64})$/);\n if (match) {\n const newPassphrase = match[1];\n\n if (!initialPassphraseFound) {\n // First passphrase - resolve the promise to complete initial spawn\n initialPassphraseFound = true;\n clearTimeout(timeout);\n resolve(newPassphrase);\n } else {\n // Agent reloaded (tsx watch) - update the passphrase\n console.log('[agent-spawner] 🔄 Agent reloaded, updating passphrase...');\n this.updateAgentPassphrase(newPassphrase).catch((err: Error) => {\n console.error('[agent-spawner] Failed to update passphrase after reload:', err);\n });\n }\n // Don't print the passphrase line\n return;\n }\n // Print all non-passphrase agent stdout\n console.log(`[agent] ${line}`);\n });\n\n // Forward stderr permanently\n if (this.agentProcess?.stderr) {\n const stderrRl = createInterface({ input: this.agentProcess.stderr });\n stderrRl.on('line', (line) => {\n console.error(`[agent:err] ${line}`);\n });\n }\n\n this.agentProcess?.on('error', (err) => {\n console.error('[agent-spawner] Failed to spawn agent:', err);\n clearTimeout(timeout);\n if (!initialPassphraseFound) resolve(null);\n });\n\n this.agentProcess?.on('exit', (code) => {\n if (code !== null && code !== 0) {\n console.error(`[agent-spawner] Agent exited with code ${code}`);\n }\n clearTimeout(timeout);\n if (!initialPassphraseFound) resolve(null);\n });\n });\n }\n\n async shutdown(): Promise<void> {\n if (this.fileWatcher) {\n this.fileWatcher.close();\n this.fileWatcher = null;\n }\n\n if (this.agentProcess) {\n console.log('[agent-spawner] Stopping local agent...');\n // SIGKILL for immediate port release — the local agent is stateless\n // so graceful shutdown is unnecessary.\n this.agentProcess.kill('SIGKILL');\n\n await new Promise<void>((resolve) => {\n this.agentProcess?.on('exit', () => resolve());\n // Safety timeout in case 'exit' never fires\n setTimeout(resolve, 2_000);\n });\n\n this.agentProcess = null;\n }\n }\n\n getLocalAgentId(): string | null {\n return LOCAL_AGENT_ID;\n }\n\n private async updateAgentPassphrase(newPassphrase: string): Promise<void> {\n const agentUrl = `http://${env.RUNEYA_AGENT_HOST}:${env.RUNEYA_AGENT_PORT}`;\n await agentManager.registerLocal({ id: LOCAL_AGENT_ID, name: LOCAL_AGENT_NAME, url: agentUrl, passphrase: newPassphrase, passthroughEnv: [] });\n console.log(`[agent-spawner] ✅ Agent passphrase updated, re-registered as ${LOCAL_AGENT_ID}`);\n }\n\n private setupFileWatcher(): void {\n if (!this.agentDistPath) return;\n\n // Close previous watcher if it exists (important for hot reload to keep working)\n if (this.fileWatcher) {\n this.fileWatcher.close();\n }\n\n console.log('[agent-spawner] 🔍 Watching agent dist for changes (hot reload enabled)');\n\n // Watch the dist/ directory instead of the file itself — tsup \"cleans\" the folder\n // (delete + recreate) on every rebuild, which causes fs.watch on a file to lose\n // its inode and stop firing. Watching the directory captures rename/add events too.\n const distDir = join(this.agentDistPath, '..');\n this.fileWatcher = watch(distDir, { persistent: false }, (eventType, filename) => {\n if ((eventType === 'change' || eventType === 'rename') && filename === 'index.js' && !this.isRestarting) {\n this.isRestarting = true;\n console.log('[agent-spawner] 🔄 Agent code changed, restarting...');\n\n // In dev mode, kill immediately for fast hot reload (no graceful shutdown needed)\n if (this.agentProcess && !this.agentProcess.killed) {\n const oldProcess = this.agentProcess;\n\n // Wait for process to fully exit before restarting\n oldProcess.once('exit', () => {\n // Give OS a moment to release the port\n setTimeout(() => {\n this.restartAgent().catch((err: Error) => {\n console.error('[agent-spawner] Failed to restart agent:', err);\n this.isRestarting = false;\n });\n }, 100);\n });\n\n // SIGKILL immediately for instant hot reload\n oldProcess.kill('SIGKILL');\n }\n }\n });\n }\n\n private async restartAgent(): Promise<void> {\n if (!this.agentDistPath) return;\n\n const agentEnv = buildAgentEnv();\n if (!agentEnv) {\n console.log('[agent-spawner] Cannot restart agent: encryption key not available');\n this.isRestarting = false;\n return;\n }\n\n const agentUrl = `http://${env.RUNEYA_AGENT_HOST}:${env.RUNEYA_AGENT_PORT}`;\n const isDev = process.env.NODE_ENV === 'development';\n\n // Spawn new agent process\n this.agentProcess = spawn('node', [this.agentDistPath], {\n env: agentEnv,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n // Setup stdout/stderr forwarding and passphrase detection\n if (this.agentProcess?.stdout) {\n const rl = createInterface({ input: this.agentProcess.stdout });\n rl.on('line', (line) => {\n const match = line.match(/^RUNEYA_PASSPHRASE=([a-f0-9]{64})$/);\n if (match) {\n const newPassphrase = match[1];\n // Update agent registration with new passphrase (in-memory only)\n agentManager.registerLocal({ id: LOCAL_AGENT_ID, name: LOCAL_AGENT_NAME, url: agentUrl, passphrase: newPassphrase, passthroughEnv: [] })\n .then(() => {\n console.log(`[agent-spawner] ✅ Agent restarted and re-registered as ${LOCAL_AGENT_ID}`);\n this.isRestarting = false;\n\n // Recreate file watcher for next hot reload (fs.watch can lose tracking after file replace)\n if (isDev) {\n this.setupFileWatcher();\n }\n })\n .catch((err: Error) => {\n console.error('[agent-spawner] Failed to register agent after restart:', err);\n this.isRestarting = false;\n });\n return;\n }\n console.log(`[agent] ${line}`);\n });\n }\n\n if (this.agentProcess?.stderr) {\n const stderrRl = createInterface({ input: this.agentProcess.stderr });\n stderrRl.on('line', (line) => {\n console.error(`[agent:err] ${line}`);\n });\n }\n }\n}\n\nexport const agentSpawner = new AgentSpawner();\n","import { stableEncryptValue, decryptValue, isEncryptedValue } from './crypto-helpers.js';\n\nclass TraefikManager {\n encryptDnsCredentials(credentials: Record<string, string>): Record<string, string> {\n const result: Record<string, string> = {};\n for (const [key, value] of Object.entries(credentials)) {\n result[key] = isEncryptedValue(value) ? value : stableEncryptValue(value);\n }\n return result;\n }\n\n decryptDnsCredentials(credentials: Record<string, string>): Record<string, string> {\n const result: Record<string, string> = {};\n for (const [key, value] of Object.entries(credentials)) {\n if (isEncryptedValue(value)) {\n try {\n result[key] = decryptValue(value);\n } catch {\n console.error(`[traefik-manager] Failed to decrypt credential: ${key}`);\n result[key] = '';\n }\n } else {\n result[key] = value;\n }\n }\n return result;\n }\n}\n\nexport const traefikManager = new TraefikManager();\n","import { EventEmitter } from 'node:events';\nimport WebSocket from 'ws';\nimport { WS_RECONNECT_MIN, WS_RECONNECT_MAX } from '@runeya/packages-shared';\n\n/**\n * tRPC WS JSON-RPC protocol message types:\n * → { id, method: \"subscription\", params: { path, input } }\n * ← { id, result: { type: \"started\" } }\n * ← { id, result: { type: \"data\", data } }\n * ← { id, result: { type: \"stopped\" } }\n */\n\ninterface TRPCRequest {\n id: number;\n method: 'subscription';\n params: { path: string; input?: unknown };\n}\n\ninterface TRPCResponse {\n id: number;\n result?: {\n type: 'started' | 'data' | 'stopped';\n data?: unknown;\n };\n error?: unknown;\n}\n\ninterface SubscriptionInfo {\n eventType?: string; // e.g. 'process:status' — for static fan-out subscriptions\n onData?: (data: unknown) => void; // for dynamic per-session subscriptions\n onStop?: () => void;\n}\n\nconst SUBSCRIPTION_PATHS: Array<{ path: string; eventType: string }> = [\n { path: 'process.onStatus', eventType: 'process:status' },\n { path: 'process.onLog', eventType: 'process:log' },\n { path: 'process.onHealth', eventType: 'process:health' },\n { path: 'process.onMetrics', eventType: 'process:metrics' },\n];\n\n/**\n * AgentWSBridge opens a WebSocket connection to an agent's tRPC endpoint\n * and subscribes to all process-related subscriptions using the raw\n * tRPC JSON-RPC protocol. Events are emitted with the agentId attached.\n */\nconst PING_INTERVAL_MS = 30_000;\nconst PONG_TIMEOUT_MS = 10_000;\n\nexport class AgentWSBridge extends EventEmitter {\n private ws: WebSocket | null = null;\n private nextId = 1;\n private subscriptions: Map<number, SubscriptionInfo> = new Map();\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private currentReconnectDelay = WS_RECONNECT_MIN;\n private closed = false;\n private pingInterval: ReturnType<typeof setInterval> | null = null;\n private pongTimeout: ReturnType<typeof setTimeout> | null = null;\n\n constructor(\n private agentId: string,\n private url: string,\n private passphrase: string,\n ) {\n super();\n }\n\n connect(): void {\n if (this.closed) return;\n this.cleanup();\n\n const httpUrl = new URL(this.url);\n const wsProtocol = httpUrl.protocol === 'https:' ? 'wss:' : 'ws:';\n // tRPC WS endpoint is at the root (default upgrade path, not /ws/health)\n const wsUrl = `${wsProtocol}//${httpUrl.host}`;\n\n try {\n this.ws = new WebSocket(wsUrl, {\n headers: { 'Authorization': `Bearer ${this.passphrase}` },\n });\n } catch {\n this.scheduleReconnect();\n return;\n }\n\n this.ws.on('open', () => {\n console.log(`[agent-ws-bridge] ✅ Connected to agent ${this.agentId}`);\n this.currentReconnectDelay = WS_RECONNECT_MIN;\n this.startHeartbeat();\n this.subscribeAll();\n console.log(`[agent-ws-bridge] Created ${SUBSCRIPTION_PATHS.length} subscriptions for agent ${this.agentId}`);\n });\n\n this.ws.on('message', (raw: Buffer | string) => {\n try {\n const msg: TRPCResponse = JSON.parse(\n typeof raw === 'string' ? raw : raw.toString(),\n );\n this.handleMessage(msg);\n } catch {\n // Ignore unparseable messages\n }\n });\n\n this.ws.on('pong', () => {\n if (this.pongTimeout) { clearTimeout(this.pongTimeout); this.pongTimeout = null; }\n });\n\n this.ws.on('close', () => {\n console.log(`[agent-ws-bridge] ❌ Disconnected from agent ${this.agentId}`);\n this.stopHeartbeat();\n this.ws = null;\n this.subscriptions.clear();\n if (!this.closed) {\n console.log(`[agent-ws-bridge] Scheduling reconnect for agent ${this.agentId} in ${this.currentReconnectDelay}ms`);\n this.scheduleReconnect();\n }\n });\n\n this.ws.on('error', (err) => {\n console.debug('[agent-ws-bridge] WS error for agent', this.agentId + ':', err.message);\n // 'error' is always followed by 'close'\n });\n }\n\n /**\n * Subscribe to a dynamic tRPC path with an input payload.\n * Returns an unsubscribe function that cleans up on the agent side.\n * Used for per-session subscriptions (e.g. terminal.onData).\n */\n subscribeWithInput(\n path: string,\n input: unknown,\n onData: (data: unknown) => void,\n onStop?: () => void,\n ): () => void {\n const id = this.nextId++;\n this.subscriptions.set(id, { onData, onStop });\n\n if (this.ws?.readyState === WebSocket.OPEN) {\n const msg: TRPCRequest = { id, method: 'subscription', params: { path, input } };\n this.ws.send(JSON.stringify(msg));\n }\n // If WS is not open, we still store the subscription — but it won't receive data.\n // The caller should handle this (e.g. create session only when agent is connected).\n\n return () => {\n this.subscriptions.delete(id);\n if (this.ws?.readyState === WebSocket.OPEN) {\n // tRPC v11 stop message\n this.ws.send(JSON.stringify({ id, method: 'subscription.stop' }));\n }\n };\n }\n\n disconnect(): void {\n this.closed = true;\n this.cleanup();\n }\n\n private startHeartbeat(): void {\n this.stopHeartbeat();\n this.pingInterval = setInterval(() => {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) return;\n this.pongTimeout = setTimeout(() => {\n console.log(`[agent-ws-bridge] Pong timeout for agent ${this.agentId}, closing connection`);\n this.ws?.terminate();\n }, PONG_TIMEOUT_MS);\n this.ws.ping();\n }, PING_INTERVAL_MS);\n }\n\n private stopHeartbeat(): void {\n if (this.pingInterval) { clearInterval(this.pingInterval); this.pingInterval = null; }\n if (this.pongTimeout) { clearTimeout(this.pongTimeout); this.pongTimeout = null; }\n }\n\n private cleanup(): void {\n this.stopHeartbeat();\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n if (this.ws) {\n // Remove all user listeners, but keep a no-op error handler\n // to prevent unhandled error events when closing in CONNECTING state\n this.ws.removeAllListeners();\n this.ws.on('error', () => {});\n this.ws.close();\n this.ws = null;\n }\n this.subscriptions.clear();\n }\n\n private subscribeAll(): void {\n for (const { path, eventType } of SUBSCRIPTION_PATHS) {\n this.sendSubscription(path, eventType);\n }\n }\n\n private sendSubscription(path: string, eventType: string): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) return;\n\n const id = this.nextId++;\n this.subscriptions.set(id, { eventType });\n\n const msg: TRPCRequest = {\n id,\n method: 'subscription',\n params: { path },\n };\n\n this.ws.send(JSON.stringify(msg));\n }\n\n private handleMessage(msg: TRPCResponse): void {\n const sub = this.subscriptions.get(msg.id);\n if (!sub) return;\n\n if (msg.result?.type === 'data' && msg.result.data !== undefined) {\n const data = msg.result.data;\n\n if (sub.onData) {\n // Dynamic subscription — forward raw data to callback\n sub.onData(data);\n } else if (sub.eventType) {\n if (typeof data !== 'object' || data === null) return;\n // Log batches arrive as arrays — emit with agentId attached for filtering\n if (Array.isArray(data)) {\n this.emit(sub.eventType, { batch: data, agentId: this.agentId });\n } else {\n // Spread agent data first, then override agentId with the trusted value\n // to prevent a compromised agent from spoofing its identity\n this.emit(sub.eventType, {\n ...(data as Record<string, unknown>),\n agentId: this.agentId,\n });\n }\n }\n } else if (msg.result?.type === 'started') {\n const label = sub.eventType ?? '(dynamic)';\n console.log(`[agent-ws-bridge] ✅ Subscription ${label} started for agent ${this.agentId}`);\n } else if (msg.result?.type === 'stopped') {\n const label = sub.eventType ?? '(dynamic)';\n console.log(`[agent-ws-bridge] ⏹️ Subscription ${label} stopped for agent ${this.agentId}`);\n if (sub.onStop) sub.onStop();\n this.subscriptions.delete(msg.id);\n } else if (msg.error) {\n const label = sub.eventType ?? '(dynamic)';\n console.debug('[agent-ws-bridge] Subscription error for', label, 'on agent', this.agentId + ':', msg.error);\n if (sub.onStop) sub.onStop();\n this.subscriptions.delete(msg.id);\n }\n }\n\n private scheduleReconnect(): void {\n if (this.closed || this.reconnectTimer) return;\n\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n if (!this.closed) {\n this.connect();\n }\n }, this.currentReconnectDelay);\n\n this.currentReconnectDelay = Math.min(this.currentReconnectDelay * 2, WS_RECONNECT_MAX);\n }\n}\n"],"mappings":"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","names":["EventEmitter","WebSocket","z","randomUUID","readFile","writeFile","rename","mkdir","chmod","join","createCipheriv","createDecipheriv","randomBytes","FILENAME","env","conn","spawn"]}
|