vibe64 0.1.32 → 0.1.34
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/bin/run.js +1717 -1648
- package/bin/server.js +81 -68
- package/bin/upgrade-state.js +5438 -5189
- package/dist/assets/{GithubBrowserTabs-2bEGbRAs.js → GithubBrowserTabs-DO5PHon-.js} +1 -1
- package/dist/assets/GithubMarkdown-BQ6MfCDJ.js +3 -0
- package/dist/assets/GithubMarkdown-U7-j-qNI.css +1 -0
- package/dist/assets/StudioErrorNotice-sQfmeR-z.js +1 -0
- package/dist/assets/VAlert-P256xaE0.js +1 -0
- package/dist/assets/VAutocomplete-BDb95qJX.js +1 -0
- package/dist/assets/VAvatar-9ilDR2r2.css +1 -0
- package/dist/assets/VAvatar-DPzqDH4r.js +1 -0
- package/dist/assets/VBtn-B2MBK2DL.js +1 -0
- package/dist/assets/VCard-mXy0k4aS.js +1 -0
- package/dist/assets/VCheckbox-C7A1ZW4D.js +1 -0
- package/dist/assets/VChip-CcI-Oo2J.js +1 -0
- package/dist/assets/VDialog-Bu3EfKb1.js +1 -0
- package/dist/assets/VDivider-BMEqUoAB.js +1 -0
- package/dist/assets/VExpansionPanels-Dgjrop0V.js +1 -0
- package/dist/assets/VMenu-C_x18lwb.js +1 -0
- package/dist/assets/VOverlay-CeMZurIN.js +1 -0
- package/dist/assets/VRadioGroup-CUu2-KIP.js +1 -0
- package/dist/assets/VRow-Cpw7OHQV.js +1 -0
- package/dist/assets/{VSelect-DY-ZuBJJ.js → VSelect-DL3HaA5m.js} +1 -1
- package/dist/assets/VSheet-DZWsu0kL.js +1 -0
- package/dist/assets/VSkeletonLoader-CttxM1tw.js +1 -0
- package/dist/assets/VSpacer-Dhmsvk4t.js +1 -0
- package/dist/assets/{VSwitch-Bm1bwl2V.js → VSwitch-BRHeDJkH.js} +1 -1
- package/dist/assets/VTextField-BR2eZeFT.js +1 -0
- package/dist/assets/VTextarea-DbqamXJd.js +1 -0
- package/dist/assets/Vibe64AsyncModuleState-Dx7YKRPp.js +1 -0
- package/dist/assets/Vibe64DashboardBackButton-DD9UR77P.css +1 -0
- package/dist/assets/Vibe64DashboardBackButton-yE6cyYg2.js +1 -0
- package/dist/assets/Vibe64DashboardPageHeader-BXQR00HK.js +1 -0
- package/dist/assets/Vibe64DashboardPageHeader-Gm1IvlHx.css +1 -0
- package/dist/assets/Vibe64DashboardShell-CuCVMhOc.js +1 -0
- package/dist/assets/Vibe64DashboardShell-MBkUHjs-.css +1 -0
- package/dist/assets/Vibe64DatabaseWorkspace-BONJdxBS.js +18 -0
- package/dist/assets/{Vibe64DatabaseWorkspace-C39Jvver.css → Vibe64DatabaseWorkspace-CR4pzzcf.css} +1 -1
- package/dist/assets/Vibe64OutputControls-DAAmA09l.js +8 -0
- package/dist/assets/{Vibe64OutputControls-CsZFv12r.css → Vibe64OutputControls-DPBsyDZM.css} +1 -1
- package/dist/assets/{Vibe64RepositoryWorkspace-ebUaYOU4.js → Vibe64RepositoryWorkspace-ByQlZbyO.js} +2 -2
- package/dist/assets/{Vibe64RepositoryWorkspace-Cqm6TOFk.css → Vibe64RepositoryWorkspace-CVHcT93M.css} +1 -1
- package/dist/assets/Vibe64SessionFiles-B0u9HKdF.js +107 -0
- package/dist/assets/Vibe64SessionFiles-NjOMVwPR.css +1 -0
- package/dist/assets/Vibe64TemporaryAiFixAction-BGlcrq4d.js +1 -0
- package/dist/assets/Vibe64UiStoryboardView-3WXph5bz.css +1 -0
- package/dist/assets/Vibe64UiStoryboardView-Brlwdvqi.js +7 -0
- package/dist/assets/Vibe64UnavailableSessions-zwlWlcZD.js +1 -0
- package/dist/assets/_sessionId_-CvOkQbVy.js +1 -0
- package/dist/assets/{_sessionTool_-B39BIzzZ.js → _sessionTool_-Dwod5ns9.js} +1 -1
- package/dist/assets/_slug_-B31c15cc.css +1 -0
- package/dist/assets/_slug_-Dy35qLo1.js +1 -0
- package/dist/assets/access-BVu5XYm2.js +1 -0
- package/dist/assets/app-DRXCcv05.css +1 -0
- package/dist/assets/app-zt7HwQKT.js +1 -0
- package/dist/assets/assistantRouting-CwbwfkwB.js +3 -0
- package/dist/assets/{changes-ByjS7QGx.js → changes-olY8cnFK.js} +1 -1
- package/dist/assets/{client-C-tpoG6F.js → client-BrV4QPwG.js} +1 -1
- package/dist/assets/createSimpleFunctional-CZTGuNuR.js +1 -0
- package/dist/assets/dashboard-BnXD-H4R.js +1 -0
- package/dist/assets/definitions-DaOPIkyB.js +1 -0
- package/dist/assets/env-DJhnLOH7.css +1 -0
- package/dist/assets/env-DN0vW4EI.js +1 -0
- package/dist/assets/{error-DFKtZBJ8.js → error-DgrgRbJJ.js} +1 -1
- package/dist/assets/{error-DE4zo8Lk.js → error-Dug56can.js} +1 -1
- package/dist/assets/health-7oIQODer.css +1 -0
- package/dist/assets/health-Z6m96GDr.js +1 -0
- package/dist/assets/history-BOwbCRQP.css +1 -0
- package/dist/assets/history-BxlpB-YH.js +1 -0
- package/dist/assets/incoming-BOxRVlOM.js +2 -0
- package/dist/assets/incoming-DWDrmxyH.css +1 -0
- package/dist/assets/index-BUq-MczL.js +86 -0
- package/dist/assets/{index-D4MsP3dq.css → index-DtmBqE3h.css} +1 -1
- package/dist/assets/{integrations-B4txOZfY.js → integrations-BFltGDVI.js} +1 -1
- package/dist/assets/issues-1iS5zoed.js +1 -0
- package/dist/assets/issues-XnpGgdmn.css +1 -0
- package/dist/assets/layout-BkWVNT37.js +1 -0
- package/dist/assets/lazy-NHSwD9FS.js +1 -0
- package/dist/assets/mdi-C54lQ0i_.js +1 -0
- package/dist/assets/{pages-BW2l8fNe.js → pages-DuMgH61T.js} +1 -1
- package/dist/assets/{placement-JxzrmUR3.js → placement-CwTqWLQH.js} +1 -1
- package/dist/assets/placement-DLsU3pCW.js +1 -0
- package/dist/assets/pull-requests-BJOwNL4k.js +1 -0
- package/dist/assets/pull-requests-CdbhyFOv.css +1 -0
- package/dist/assets/{repository-BTC3lkrh.js → repository-JWLVST3D.js} +1 -1
- package/dist/assets/{VAvatar-CAFvgSUo.js → ripple-BVltMmyV.js} +2 -2
- package/dist/assets/ripple-DqhAt1Ze.css +1 -0
- package/dist/assets/runtime-core.esm-bundler-DGXg_mpN.js +3 -0
- package/dist/assets/{session-CG-TUCJt.css → session-5qADMzDP.css} +1 -1
- package/dist/assets/session-C5Nj8Dlq.js +1 -0
- package/dist/assets/settings-BopLnpB0.css +1 -0
- package/dist/assets/settings-c273Ikrm.js +1 -0
- package/dist/assets/ssrBoot-Rlh6kLbD.js +1 -0
- package/dist/assets/{studioGateApi-C0GvzVlt.js → studioGateApi-DhA9IJGZ.js} +1 -1
- package/dist/assets/{studioUrls-CIab-Axb.js → studioUrls-Dj8rXeXO.js} +1 -1
- package/dist/assets/{useApi-BPuI6ZR9-Dr8wK_Co.js → useApi-BPuI6ZR9-CFWU1m37.js} +1 -1
- package/dist/assets/useArchivedVibe64Sessions-CVZx2Rtm.js +1 -0
- package/dist/assets/useCommand-DWuxfAV0.js +1 -0
- package/dist/assets/useEndpointResource-MWVNfmMa.js +1 -0
- package/dist/assets/{usePaths-DVTieF_G.js → usePaths-Db88-HOm.js} +1 -1
- package/dist/assets/{useUiFeedback-Tzi-PRlX.js → useUiFeedback-0FqKuZRP.js} +1 -1
- package/dist/assets/useVibe64ConversationLog-8cKh1eDm.js +1 -0
- package/dist/assets/useVibe64DatabaseTools-BcRG1s3i.js +1 -0
- package/dist/assets/useVibe64LearningMode-Bl0dGdCh.js +28 -0
- package/dist/assets/useVibe64LearningMode-C3PcXdVg.css +1 -0
- package/dist/assets/useVibe64ProjectScope-DOEVkBqX.js +1 -0
- package/dist/assets/useVibe64SessionData-DFTyLzci.js +1 -0
- package/dist/assets/useVibe64SessionSelection-j9lsllx4.js +1 -0
- package/dist/assets/useVibe64SystemGraph-tNkIwSBQ.js +1 -0
- package/dist/assets/{useVibe64Terminal-C2XJ9Y1K.js → useVibe64Terminal-BPnN25WH.js} +1 -1
- package/dist/assets/vibe64AssistantHost-DdE_-lZF.js +1 -0
- package/dist/assets/vibe64LessonDashboard-DlKYjisq.js +1 -0
- package/dist/assets/vibe64ProjectScope.local-DqT6e5un.js +1 -0
- package/dist/assets/vibe64RepositoryRealtime-DXk0Jai3.js +1 -0
- package/dist/assets/vibe64SessionFocus-OJ2toBd9.css +1 -0
- package/dist/assets/vibe64SessionFocus-kqPOPaOH.js +1 -0
- package/dist/assets/{vibe64SessionInfo-D8l22MFm.js → vibe64SessionInfo-BHxtTrLX.js} +1 -1
- package/dist/assets/vibe64SessionToolDefinitions-NfLd1HZI.js +1 -0
- package/dist/assets/vue-flow-core-BlVEnES8.js +26 -0
- package/dist/index.html +51 -48
- package/docs/colleague-usage/account-profile-and-appearance.md +29 -0
- package/docs/colleague-usage/ai-accounts-and-routing.md +23 -4
- package/docs/colleague-usage/ai-balance-and-allowance.md +4 -0
- package/docs/colleague-usage/architecture-explanations.md +99 -0
- package/docs/colleague-usage/auto-workflow.md +49 -11
- package/docs/colleague-usage/coding-agent-failures.md +94 -0
- package/docs/colleague-usage/coding-agent-goal-pause.md +110 -0
- package/docs/colleague-usage/coding-agent-goals.md +140 -38
- package/docs/colleague-usage/coding-agent-history.md +20 -2
- package/docs/colleague-usage/coding-agent-recovery.md +136 -0
- package/docs/colleague-usage/coding-agents.md +138 -150
- package/docs/colleague-usage/colleague-recovery.md +28 -5
- package/docs/colleague-usage/colleague-upgrade-recovery.md +4 -0
- package/docs/colleague-usage/colleague-watches.md +84 -0
- package/docs/colleague-usage/colleague.md +18 -34
- package/docs/colleague-usage/connected-contributions.md +196 -0
- package/docs/colleague-usage/connected-projects.md +196 -0
- package/docs/colleague-usage/conversation-context.md +67 -1
- package/docs/colleague-usage/dashboard-navigation.md +79 -5
- package/docs/colleague-usage/database.md +11 -0
- package/docs/colleague-usage/developing-vibe64.md +137 -0
- package/docs/colleague-usage/development-copies.md +20 -0
- package/docs/colleague-usage/development-env.md +34 -0
- package/docs/colleague-usage/file-interfaces.md +156 -0
- package/docs/colleague-usage/github-work.md +88 -1
- package/docs/colleague-usage/health-checks.md +32 -0
- package/docs/colleague-usage/incoming-changes.md +94 -0
- package/docs/colleague-usage/learning-chat-retention.md +11 -2
- package/docs/colleague-usage/learning-code-questions.md +55 -0
- package/docs/colleague-usage/learning-course-catalogue.md +118 -0
- package/docs/colleague-usage/learning-diagrams-and-voice.md +97 -0
- package/docs/colleague-usage/learning-history.md +17 -9
- package/docs/colleague-usage/learning-lesson-watch.md +95 -0
- package/docs/colleague-usage/learning-mode-ui.md +187 -85
- package/docs/colleague-usage/learning-native-session.md +12 -10
- package/docs/colleague-usage/learning-practical-exercises.md +71 -0
- package/docs/colleague-usage/learning-practical-gestures.md +18 -1
- package/docs/colleague-usage/learning-practice-projects.md +55 -4
- package/docs/colleague-usage/learning-session-creation.md +7 -7
- package/docs/colleague-usage/learning-teacher-guide.md +52 -0
- package/docs/colleague-usage/learning-with-colleague.md +59 -80
- package/docs/colleague-usage/lesson-authoring.md +12 -4
- package/docs/colleague-usage/lesson-practical-assessment.md +3 -1
- package/docs/colleague-usage/managed-app-access.md +6 -0
- package/docs/colleague-usage/message-delivery-recovery.md +56 -0
- package/docs/colleague-usage/plans.md +14 -7
- package/docs/colleague-usage/preview-browser-checks.md +61 -0
- package/docs/colleague-usage/preview-lesson-presentation.md +56 -0
- package/docs/colleague-usage/preview-starting-application.md +92 -0
- package/docs/colleague-usage/preview.md +70 -96
- package/docs/colleague-usage/project-architecture.md +229 -0
- package/docs/colleague-usage/project-language-tools.md +31 -0
- package/docs/colleague-usage/project-messages.md +106 -0
- package/docs/colleague-usage/project-settings.md +22 -0
- package/docs/colleague-usage/project-setup.md +29 -2
- package/docs/colleague-usage/session-terminal.md +42 -0
- package/docs/colleague-usage/sessions.md +122 -52
- package/docs/colleague-usage/teaching-content.md +12 -6
- package/docs/colleague-usage/temporary-chat-context.md +29 -0
- package/docs/colleague-usage/temporary-chats.md +95 -2
- package/docs/colleague-usage/voice-chat.md +10 -43
- package/docs/colleague-usage/voice-face-and-speaking-voice.md +73 -0
- package/docs/colleague-usage/workspace-preparation.md +89 -0
- package/docs/training-content.md +208 -7
- package/node_modules/@jskit-ai/assistant-core/package.json +1 -1
- package/node_modules/@jskit-ai/assistant-runtime/README.md +29 -0
- package/node_modules/@jskit-ai/assistant-runtime/package.json +1 -1
- package/node_modules/@jskit-ai/assistant-voice/package.json +1 -1
- package/node_modules/@jskit-ai/connector-google-calendar/package.json +1 -1
- package/node_modules/@jskit-ai/connectors-catalog/package.json +1 -1
- package/node_modules/@jskit-ai/connectors-core/package.json +1 -1
- package/node_modules/@jskit-ai/http-runtime/package.json +1 -1
- package/node_modules/@jskit-ai/kernel/package.json +1 -1
- package/node_modules/@jskit-ai/payments-core/package.json +1 -1
- package/node_modules/@jskit-ai/realtime/package.json +1 -1
- package/node_modules/@jskit-ai/resource-core/package.json +1 -1
- package/node_modules/@jskit-ai/resource-crud-core/package.json +1 -1
- package/node_modules/@jskit-ai/uploads-runtime/package.json +1 -1
- package/node_modules/@local/vibe64-core/package.json +1 -0
- package/node_modules/@local/vibe64-execution/src/host/execHelper.js +280 -272
- package/node_modules/@local/vibe64-genesis/README.md +15 -0
- package/node_modules/@local/vibe64-genesis/bin/vibe64-genesis-host-context +879 -1225
- package/node_modules/@local/vibe64-genesis/package.json +2 -1
- package/node_modules/@local/vibe64-genesis/src/server/index.js +496 -418
- package/node_modules/@local/vibe64-genesis/src/server/promptContext.js +165 -146
- package/node_modules/@local/vibe64-runtime/src/server/agentSessionCommandHook.js +8 -8
- package/node_modules/@local/vibe64-runtime/src/server/codexAppServerProcess.js +128 -129
- package/node_modules/@local/vibe64-system-graph/README.md +136 -6
- package/node_modules/@local/vibe64-terminals/package.json +3 -0
- package/node_modules/@local/vibe64-terminals/src/server/sessionWorkOperationCommand.js +1527 -1326
- package/node_modules/@local/vibe64-training/package.json +6 -1
- package/node_modules/@local/vibe64-voice/package.json +1 -0
- package/package.json +16 -16
- package/server.bundle.mjs +42853 -40268
- package/dist/assets/StudioErrorNotice-Ccjvcn9C.js +0 -1
- package/dist/assets/VAlert-B7ciJKQL.js +0 -1
- package/dist/assets/VAutocomplete-QjMk5d_j.js +0 -1
- package/dist/assets/VAvatar-nHaK192T.css +0 -1
- package/dist/assets/VBtn-Kl_qcBsy.js +0 -1
- package/dist/assets/VCard-nrJPeo91.js +0 -1
- package/dist/assets/VCheckbox-DTRAWOIf.js +0 -1
- package/dist/assets/VChip-Dfs5jX0f.js +0 -1
- package/dist/assets/VDialog-Dt1VjJg1.js +0 -1
- package/dist/assets/VDivider-DFsS0OTx.js +0 -1
- package/dist/assets/VExpansionPanels-CYKU0cAr.js +0 -1
- package/dist/assets/VMenu-BLxobsuU.js +0 -1
- package/dist/assets/VOverlay-BvFVZKNS.js +0 -1
- package/dist/assets/VRadioGroup-DzQzpCfg.js +0 -1
- package/dist/assets/VRow-BR2RMCM1.js +0 -1
- package/dist/assets/VSheet-BA95RNmA.js +0 -1
- package/dist/assets/VSkeletonLoader-hpJqr0HL.js +0 -1
- package/dist/assets/VSpacer-B1l1hVvU.js +0 -1
- package/dist/assets/VTextField-CA_p3N4d.js +0 -1
- package/dist/assets/VTextarea-NyCqY4h5.js +0 -1
- package/dist/assets/Vibe64AsyncModuleState-DEFlqJ97.js +0 -1
- package/dist/assets/Vibe64DashboardShell-BNv2I-P8.js +0 -1
- package/dist/assets/Vibe64DashboardShell-w20wNTGW.css +0 -1
- package/dist/assets/Vibe64DatabaseWorkspace-CuY5lN1o.js +0 -43
- package/dist/assets/Vibe64OutputControls-D2JuYlYU.js +0 -8
- package/dist/assets/Vibe64SessionFiles-C-rWehq_.js +0 -34
- package/dist/assets/Vibe64SessionFiles-Dsr6KQNP.css +0 -1
- package/dist/assets/Vibe64SubsystemsView-BvdU_o6H.css +0 -1
- package/dist/assets/Vibe64SubsystemsView-DJCjSzQM.js +0 -1
- package/dist/assets/Vibe64SystemWorldView-B91ioQaO.js +0 -4312
- package/dist/assets/Vibe64SystemWorldView-BXiQ7_Qb.css +0 -1
- package/dist/assets/Vibe64UnavailableSessions-OvnoD3ZB.js +0 -1
- package/dist/assets/_sessionId_-JTvMh54L.js +0 -1
- package/dist/assets/_slug_-DP_heCDa.js +0 -1
- package/dist/assets/_slug_-DmBZGb0q.css +0 -1
- package/dist/assets/access-C8GQIS19.js +0 -1
- package/dist/assets/app-B83lF61Y.js +0 -1
- package/dist/assets/app-ByLIQ3SB.css +0 -1
- package/dist/assets/assistantRouting-TDtryU6o.js +0 -1
- package/dist/assets/createSimpleFunctional-DPIT6zsT.js +0 -1
- package/dist/assets/dashboard-CWGFPojJ.js +0 -1
- package/dist/assets/definitions-BeLcvOW3.js +0 -1
- package/dist/assets/display-BLmcO-5p.js +0 -1
- package/dist/assets/env-7bqFyF_E.css +0 -1
- package/dist/assets/env-BVwxNL8M.js +0 -1
- package/dist/assets/health-BzNhp7r8.js +0 -1
- package/dist/assets/health-DoHTXTGx.css +0 -1
- package/dist/assets/history-BPeZGofK.js +0 -1
- package/dist/assets/history-iMQxp5AR.css +0 -1
- package/dist/assets/httpClient-BaaZuFvF.js +0 -1
- package/dist/assets/index-5sKwLHOH.js +0 -86
- package/dist/assets/issues-DCEhGlfn.css +0 -1
- package/dist/assets/issues-wby50y9b.js +0 -3
- package/dist/assets/layout-YCn17mK1.js +0 -1
- package/dist/assets/lazy-CvQfXeLg.js +0 -1
- package/dist/assets/mdi-C31_SZp-.js +0 -1
- package/dist/assets/placement-C4R2t6rl.js +0 -1
- package/dist/assets/pull-requests-BNK6mq2u.css +0 -1
- package/dist/assets/pull-requests-lNQAigaC.js +0 -1
- package/dist/assets/runtime-core.esm-bundler-DMrccYS5.js +0 -3
- package/dist/assets/session-D38nzG41.js +0 -1
- package/dist/assets/settings-CFyUJ_kR.js +0 -1
- package/dist/assets/settings-vWsAEoE9.css +0 -1
- package/dist/assets/useArchivedVibe64Sessions-C2DSq2Z4.js +0 -1
- package/dist/assets/useCommand-BzThFLYP.js +0 -1
- package/dist/assets/useEndpointResource-C2KD4Ub_.js +0 -1
- package/dist/assets/useVibe64ConversationLog-CMUlXJtU.js +0 -1
- package/dist/assets/useVibe64DatabaseTools-DBcKhm6B.js +0 -1
- package/dist/assets/useVibe64LearningMode-BPRWM5Rp.js +0 -28
- package/dist/assets/useVibe64LearningMode-PJUv0O25.css +0 -1
- package/dist/assets/useVibe64SessionData-CdtJbAIx.js +0 -1
- package/dist/assets/useVibe64SessionSelection-aR0f6xVT.js +0 -1
- package/dist/assets/useVibe64SystemGraph-DeTPBn0e.js +0 -1
- package/dist/assets/vibe64AssistantHost-Dgyz4TrT.js +0 -1
- package/dist/assets/vibe64ProjectScope.local-GOSMVDRi.js +0 -1
- package/dist/assets/vibe64RepositoryRealtime-t5Al8BlU.js +0 -1
- package/dist/assets/vibe64SessionFocus-CcN6Grgw.js +0 -1
- package/dist/assets/vibe64SessionFocus-ChabllPA.css +0 -1
- package/dist/assets/vibe64SessionToolDefinitions-BaO1DEup.js +0 -1
- /package/dist/assets/{vibe64RepositoryRealtime-D_mq1dFE.css → Vibe64TemporaryAiFixAction-D_mq1dFE.css} +0 -0
|
@@ -1,369 +1,377 @@
|
|
|
1
1
|
#!/opt/vibe64/runtime-packs/node26/bin/node
|
|
2
2
|
import { createRequire as __vibe64CreateRequire } from 'node:module';const require=__vibe64CreateRequire(import.meta.url);
|
|
3
|
-
import{spawn as Ye,spawnSync as
|
|
4
|
-
lstatSync as fe,mkdirSync as _e,openSync as Qe,readFileSync as
|
|
5
|
-
unlinkSync as
|
|
6
|
-
import w from"node:process";var Ie=1024*1024,rt=64*1024,nt=10,ot=15e3,it="vibe64.exec-helper.payload",st=1,
|
|
3
|
+
import{spawn as Ye,spawnSync as I}from"node:child_process";import{chmodSync as Je,chownSync as xe,closeSync as Ze,existsSync as T,
|
|
4
|
+
lstatSync as fe,mkdirSync as _e,openSync as Qe,readFileSync as h,readSync as et,realpathSync as te,renameSync as Ne,rmSync as Te,
|
|
5
|
+
unlinkSync as G,writeFileSync as oe}from"node:fs";import u from"node:path";import{createConnection as tt}from"node:net";
|
|
6
|
+
import w from"node:process";var Ie=1024*1024,rt=64*1024,nt=10,ot=15e3,it="vibe64.exec-helper.payload",st=1,at=new Set(["\
|
|
7
7
|
account-auth-terminal","account-status","codex-app-server","create-system-user","deployment-service","enable-system-user",
|
|
8
8
|
"github-api-command","github-toolchain","github-workflow-command","health-status","managed-execution","managed-service",
|
|
9
|
-
"opencode-app-server","vibe64-command"]),je=new Set(["bash","gh","git"]),
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
/vibe64/runtime-packs/policy-bin","/opt/vibe64/runtime-packs/operator-clis/bin","/opt/vibe64/runtime-
|
|
13
|
-
/opt/vibe64/runtime-packs/git/bin","/opt/vibe64/runtime-packs/gh/bin","/opt/vibe64/runtime-packs/ripgrep
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
/
|
|
18
|
-
|
|
9
|
+
"opencode-app-server","vibe64-command","workspace-cache-command"]),je=new Set(["bash","gh","git"]),ct=/^[A-Za-z_][A-Za-z0-9_]*$/u,
|
|
10
|
+
ut=new Set(["BASH_ENV","ENV","GCONV_PATH","GETCONF_DIR","GLIBC_TUNABLES","HOSTALIASES","LOCALDOMAIN","LD_AUDIT","LD_LIBR\
|
|
11
|
+
ARY_PATH","LD_PRELOAD","LOCPATH","MALLOC_TRACE","NIS_PATH","NLSPATH","NODE_OPTIONS","RESOLV_HOST_CONF","RES_OPTIONS","TZ\
|
|
12
|
+
DIR"]),ie=["/opt/vibe64/runtime-packs/policy-bin","/opt/vibe64/runtime-packs/operator-clis/bin","/opt/vibe64/runtime-pac\
|
|
13
|
+
ks/node26/bin","/opt/vibe64/runtime-packs/git/bin","/opt/vibe64/runtime-packs/gh/bin","/opt/vibe64/runtime-packs/ripgrep\
|
|
14
|
+
/bin","/opt/vibe64/runtime-packs/bubblewrap/bin","/opt/vibe64/runtime-packs/bun/bin","/opt/vibe64/runtime-packs/php/bin",
|
|
15
|
+
"/opt/vibe64/runtime-packs/composer/bin","/opt/vibe64/runtime-packs/awsebcli/bin","/opt/vibe64/runtime-packs/cpp/bin","/\
|
|
16
|
+
opt/vibe64/runtime-packs/python/bin","/opt/vibe64/runtime-packs/ruby/bin","/opt/vibe64/runtime-packs/go/bin","/opt/vibe6\
|
|
17
|
+
4/runtime-packs/java/bin","/opt/vibe64/runtime-packs/kotlin/bin","/opt/vibe64/runtime-packs/csharp/bin","/opt/vibe64/run\
|
|
18
|
+
time-packs/rust/bin","/opt/vibe64/runtime-packs/mariadb/bin","/opt/vibe64/runtime-packs/postgresql/bin","/opt/vibe64/run\
|
|
19
|
+
time-packs/sqlite/bin","/opt/vibe64/runtime-packs/playwright/bin","/opt/vibe64/runtime-packs/guard-bin","/usr/local/sbin",
|
|
20
|
+
"/usr/local/bin","/usr/sbin","/usr/bin","/sbin","/bin"].join(":"),mt=/^[a-z][a-z0-9_-]{0,61}[a-z0-9]$/u,j="vibe64",re="v\
|
|
21
|
+
64d_",lt="/var/lib/vibe64",dt=new Set(["root"]),pt=/^[a-f0-9]{8}-[a-f0-9]{4}-[1-8][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/iu,
|
|
19
22
|
ft=new Set(["assistant","browser","control","job","preview","service","terminal"]),wt=new Set(["capture","detached","pty"]),
|
|
20
|
-
|
|
23
|
+
F=64*1024*1024,$e=1024*1024*1024*1024,yt=256*1024*1024,we=1024*1024*1024*1024,de=8,pe=8192,gt=15e3;import.meta.main&&ht().
|
|
21
24
|
catch(e=>{w.stderr.write(`${String(e?.message||e)}
|
|
22
25
|
`),w.exit(2)});async function ht(){if(w.argv[2]==="run-managed"){await bt(w.argv[3]||"");return}if(w.argv[2]!=="execute")
|
|
23
26
|
throw new Error("Usage: vibe64-exec-helper execute [payload-json-file]");let e=Jt(w.argv[3]||"");Lt(e);let t=String(e.operation||
|
|
24
|
-
"").trim();if(!
|
|
25
|
-
Ht(e);return}if(t==="managed-service"){
|
|
27
|
+
"").trim();if(!at.has(t))throw new Error("Vibe64 exec helper rejected an unknown operation.");if(t==="deployment-service"){
|
|
28
|
+
Ht(e);return}if(t==="managed-service"){Kt(e);return}if(t==="managed-execution"){St(e,w.argv[3]||"");return}let r=N(e.username);
|
|
26
29
|
if(t==="create-system-user"||t==="enable-system-user"){Wt(t,e,r);return}Se(r);let n=String(e.command||"").trim();if(!je.
|
|
27
30
|
has(n))throw new Error("Vibe64 exec helper rejected an unknown command.");let o=X(r);ne("uid",e.uid,o.uid),ne("gid",e.gid,
|
|
28
|
-
o.gid);let i=q();
|
|
29
|
-
t),
|
|
30
|
-
w.umask(7);let
|
|
31
|
-
error)throw
|
|
31
|
+
o.gid);let i=q();Ke(i,r),Ue(o.username,j);let s=Fe(e.cwd||"",i.username,{operation:t,targetUser:o}),a=be(e.env||{},o,i.username,
|
|
32
|
+
t),c=Array.isArray(e.args)?e.args.map(d=>String(d)):[],m=e.inputBase64?Buffer.from(String(e.inputBase64),"base64"):void 0;
|
|
33
|
+
w.umask(7);let p=Et(o,n,c,{cwd:s,env:a,...m===void 0?{stdio:"inherit"}:{input:m,stdio:["pipe","inherit","inherit"]}});if(p.
|
|
34
|
+
error)throw p.error;w.exit(typeof p.status=="number"?p.status:1)}function Et(e,t,r,n){return I("/usr/sbin/runuser",["-u",
|
|
32
35
|
e.username,"--","/usr/bin/env","--",`PATH=${n.env.PATH}`,t,...r],{...n,env:{...n.env,PATH:ie}})}function St(e={},t=""){let r=q();
|
|
33
|
-
vt(t,r),
|
|
34
|
-
|
|
35
|
-
`),
|
|
36
|
+
vt(t,r),ae(j);let n=String(e.action||"").trim();if(n.startsWith("workflow-")){let O=Ot(e,r);w.stdout.write(`${JSON.stringify(
|
|
37
|
+
O)}
|
|
38
|
+
`),O.ok!==!0&&(w.exitCode=1);return}let o=W(e.executionId),i=De(o,r);if(n==="inspect"){Pt(i,o,r);return}if(n==="stop"){Gt(
|
|
36
39
|
i,o,r);return}if(n!=="start")throw new Error("Vibe64 exec helper rejected an unknown managed execution action.");let s=It(
|
|
37
|
-
e.mode),
|
|
38
|
-
throw new Error("Vibe64 exec helper rejected a managed execution lifecycle mismatch.");let
|
|
39
|
-
|
|
40
|
+
e.mode),a=Tt(e.kind),c=String(e.lifecycle||"").trim();if(c!==(s==="capture"?"finite":s==="pty"?"interactive":"service"))
|
|
41
|
+
throw new Error("Vibe64 exec helper rejected a managed execution lifecycle mismatch.");let p=Re(e.controllerLeaseName,c),
|
|
42
|
+
d=Nt(e,r),l=String(e.commandOperation||"").trim(),f=Fe(e.cwd||"",r.username,{operation:l,targetUser:d}),g=String(e.command||
|
|
40
43
|
"").trim();if(!g||/[\r\n]/u.test(g))throw new Error("Vibe64 exec helper rejected an invalid managed execution command.");
|
|
41
|
-
if(
|
|
42
|
-
managed command.");let
|
|
43
|
-
if(s!=="capture"||
|
|
44
|
-
releaseEnvironmentFile,r,"environmentFile");let
|
|
45
|
-
"environment"||u.basename(u.dirname(
|
|
46
|
-
f!==C
|
|
47
|
-
|
|
48
|
-
workTasksMax,de,pe,"work-slice task limit");if(
|
|
49
|
-
above its work-slice limit.");let
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
Mt(r,{memoryMaxBytes:H,tasksMax:v});jt(r);let J=Ee(r,o),Z=u.join(J,"command.json");_e(J,{mode:448,recursive:!0}),xe(J,
|
|
53
|
-
uid,
|
|
54
|
-
""),inputPresent:e.inputPresent===!0,...
|
|
44
|
+
if(d.username!==r.username&&!je.has(u.basename(g)))throw new Error("Vibe64 exec helper rejected an unsupported real-user\
|
|
45
|
+
managed command.");let x=Array.isArray(e.args)?e.args.map(O=>String(O)):[],M=be(e.env||{},d,r.username,l),y="";if(e.releaseEnvironmentFile){
|
|
46
|
+
if(s!=="capture"||d.username!==r.username)throw new Error("Release environment requires finite owner execution.");y=ee(e.
|
|
47
|
+
releaseEnvironmentFile,r,"environmentFile");let O=fe(y),B=u.join(u.dirname(u.dirname(y)),"workspace");if(u.basename(y)!==
|
|
48
|
+
"environment"||u.basename(u.dirname(y))!=="service"||!O.isFile()||O.uid!==r.uid||(O.mode&63)!==0||te(y)!==y||te(f)!==f||
|
|
49
|
+
f!==B&&C(B,f).length===0)throw new Error("Release environment must belong to the selected private release.")}let D=U(e.memoryMaxBytes,
|
|
50
|
+
F,$e,"memory limit"),V=U(e.tasksMax,de,pe,"task limit"),H=U(e.workMemoryMaxBytes,yt,we,"work-slice memory limit"),v=U(e.
|
|
51
|
+
workTasksMax,de,pe,"work-slice task limit");if(D>H||V>v)throw new Error("Vibe64 exec helper rejected an execution limit \
|
|
52
|
+
above its work-slice limit.");let k=he(r);if(e.workflow){let O=Ce(e.workflow,r),B=P(O);if(B.activeState!=="active"||!B.controlGroup||
|
|
53
|
+
B.finishedAt)throw new Error("Vibe64 exec helper rejected an execution without its active workflow group.");if(D>B.memoryMaxBytes||
|
|
54
|
+
V>B.tasksMax)throw new Error("Vibe64 exec helper rejected an execution limit above its workflow limit.");k=O.unitName}else
|
|
55
|
+
Mt(r,{memoryMaxBytes:H,tasksMax:v});jt(r);let J=Ee(r,o),Z=u.join(J,"command.json");_e(J,{mode:448,recursive:!0}),xe(J,d.
|
|
56
|
+
uid,d.gid),oe(Z,`${JSON.stringify({args:x,command:g,controllerLeaseName:p,cwd:f,env:M,inputBase64:String(e.inputBase64||
|
|
57
|
+
""),inputPresent:e.inputPresent===!0,...y?{releaseEnvironment:!0}:{},executionId:o,schema:"vibe64.managed-execution.comm\
|
|
55
58
|
and",schemaVersion:1})}
|
|
56
|
-
`,{flag:"wx",mode:384}),Je(Z,384),xe(Z,
|
|
57
|
-
ype=exec",`--slice=${
|
|
58
|
-
p=${
|
|
59
|
-
roperty=EnvironmentFile=${
|
|
59
|
+
`,{flag:"wx",mode:384}),Je(Z,384),xe(Z,d.uid,d.gid);let Xe=u.resolve(w.argv[1]),qe=["--quiet",`--unit=${i}`,"--service-t\
|
|
60
|
+
ype=exec",`--slice=${k}`,`--property=Description=Vibe64 ${a} execution`,`--property=User=${d.username}`,`--property=Grou\
|
|
61
|
+
p=${j}`,"--property=SupplementaryGroups=nix-users","--property=UMask=0007",`--property=WorkingDirectory=${f}`,...y?[`--p\
|
|
62
|
+
roperty=EnvironmentFile=${y}`]:[],"--property=KillMode=control-group","--property=ExitType=cgroup","--property=OOMPolicy\
|
|
60
63
|
=stop","--property=MemoryAccounting=yes","--property=IOAccounting=yes","--property=TasksAccounting=yes",`--property=Memo\
|
|
61
|
-
ryMax=${
|
|
62
|
-
ty"?["--wait","--pty"]:[],Xe,"run-managed",Z],L=
|
|
64
|
+
ryMax=${D}`,`--property=TasksMax=${V}`,"--property=TimeoutStopSec=10s",...s==="capture"?["--wait","--pipe"]:[],...s==="p\
|
|
65
|
+
ty"?["--wait","--pty"]:[],Xe,"run-managed",Z],L=I("systemd-run",qe,{stdio:"inherit"});if((s!=="detached"||L.error||L.status!==
|
|
63
66
|
0)&&Te(J,{force:!0,recursive:!0}),L.error)throw L.error;w.exit(typeof L.status=="number"?L.status:1)}function vt(e="",t={}){
|
|
64
|
-
let r=String(e||"").trim();if(!r)return;let n=u.resolve(r),o=u.join(Y(t.username),"managed-execution-payloads");if(
|
|
65
|
-
length!==1)throw new Error("Vibe64 exec helper rejected an unsafe managed execution payload path.");
|
|
66
|
-
let t=u.resolve(String(e||"")),r=
|
|
67
|
+
let r=String(e||"").trim();if(!r)return;let n=u.resolve(r),o=u.join(Y(t.username),"managed-execution-payloads");if(C(o,n).
|
|
68
|
+
length!==1)throw new Error("Vibe64 exec helper rejected an unsafe managed execution payload path.");G(n)}async function bt(e=""){
|
|
69
|
+
let t=u.resolve(String(e||"")),r=h(t,"utf8");G(t);let n=JSON.parse(r);if(n?.schema!=="vibe64.managed-execution.command"||
|
|
67
70
|
n?.schemaVersion!==1)throw new Error("Vibe64 managed execution runner rejected an invalid payload.");let o=String(n.command||
|
|
68
|
-
"").trim();if(!o||/[\r\n]/u.test(o))throw new Error("Vibe64 managed execution runner rejected an invalid command.");let i
|
|
69
|
-
n.controllerLeaseName,n.controllerLeaseName?"service":""),s=i?await xt(i):null;w.umask(7);let
|
|
70
|
-
|
|
71
|
-
"/"),detached:!!s,env:n.releaseEnvironment===!0?be({...w.env,...n.env},{username:n.env.USER,
|
|
72
|
-
n.env&&typeof n.env=="object"&&!Array.isArray(n.env)?n.env:{},stdio:n.inputPresent===!0?["
|
|
73
|
-
|
|
74
|
-
(
|
|
75
|
-
exitObservedAt:
|
|
76
|
-
exitObservedAt,execMainCode:
|
|
77
|
-
"success":"exit-code",signal:String(
|
|
78
|
-
destroy()}}function
|
|
79
|
-
|
|
80
|
-
throw new Error("Vibe64 exec helper rejected an
|
|
81
|
-
(t,r)=>{let n=tt({path:e}),o=setTimeout(
|
|
82
|
-
|
|
83
|
-
destroy()),t(n)}),n.once("error",i);function i(s){
|
|
84
|
-
|
|
85
|
-
5e3);return t.unref?.(),t}function ke(e=null,t="SIGTERM"){let r=Number(
|
|
86
|
-
w.kill(-r,t)}catch(n){if(n?.code==="ESRCH")return;try{e.kill(t)}catch(o){
|
|
87
|
-
|
|
88
|
-
`)}}}function Mt(e={},{memoryMaxBytes:t=0,tasksMax:r=0}={}){let n=he(e);
|
|
71
|
+
"").trim();if(!o||/[\r\n]/u.test(o))throw new Error("Vibe64 managed execution runner rejected an invalid command.");let i=Re(
|
|
72
|
+
n.controllerLeaseName,n.controllerLeaseName?"service":""),s=i?await xt(i):null;w.umask(7);let a=null,c=null,m=!1,p=()=>{
|
|
73
|
+
m=!0,a&&c===null&&(c=Me(a))};s?.once("close",p);let d=new Date().toISOString();try{a=Ye(o,Array.isArray(n.args)?n.args.map(
|
|
74
|
+
String):[],{cwd:String(n.cwd||"/"),detached:!!s,env:n.releaseEnvironment===!0?be({...w.env,...n.env},{username:n.env.USER,
|
|
75
|
+
home:n.env.HOME},n.env.USER):n.env&&typeof n.env=="object"&&!Array.isArray(n.env)?n.env:{},stdio:n.inputPresent===!0?["p\
|
|
76
|
+
ipe","inherit","inherit"]:"inherit"}),n.inputPresent===!0&&a.stdin.end(Buffer.from(String(n.inputBase64||""),"base64")),
|
|
77
|
+
m&&(c=Me(a));let l=await new Promise((g,x)=>{let M="";a.once("exit",()=>{M=new Date().toISOString()}),a.once("error",x),
|
|
78
|
+
a.once("close",(y,D)=>g({signal:D,status:y,exitObservedAt:M}))}),f=typeof l.status=="number"?l.status:1;Ct(u.dirname(t),
|
|
79
|
+
{...Dt(),executionId:W(n.executionId),startedAt:d,exitObservedAt:l.exitObservedAt,execMainCode:l.signal?"killed":"exited",
|
|
80
|
+
execMainStatus:l.signal||String(f),result:l.signal?"signal":f===0?"success":"exit-code",signal:String(l.signal||"")}),w.
|
|
81
|
+
exitCode=f}finally{c!==null&&clearTimeout(c),s?.off("close",p),s?.destroy()}}function Re(e="",t=""){let r=String(e||"");
|
|
82
|
+
if(t!=="service"){if(r)throw new Error("Vibe64 exec helper rejected a controller lease on a finite execution.");return""}
|
|
83
|
+
if(!/^\0vibe64-resource-controller-[a-z][a-z0-9-]{0,62}$/u.test(r))throw new Error("Vibe64 exec helper rejected an inval\
|
|
84
|
+
id managed service controller lease.");return r}function xt(e=""){return new Promise((t,r)=>{let n=tt({path:e}),o=setTimeout(
|
|
85
|
+
()=>{n.destroy(),r(new Error("Vibe64 managed service could not attach to its controller lease."))},3e3);o.unref?.(),n.once(
|
|
86
|
+
"connect",()=>{clearTimeout(o),n.removeListener("error",i),n.on("error",()=>n.destroy()),t(n)}),n.once("error",i);function i(s){
|
|
87
|
+
clearTimeout(o),n.destroy(),r(new Error(`Vibe64 managed service controller lease is unavailable: ${s?.code||s}`))}})}function Me(e=null){
|
|
88
|
+
ke(e,"SIGTERM");let t=setTimeout(()=>ke(e,"SIGKILL"),5e3);return t.unref?.(),t}function ke(e=null,t="SIGTERM"){let r=Number(
|
|
89
|
+
e?.pid);if(!(!Number.isSafeInteger(r)||r<=1))try{w.kill(-r,t)}catch(n){if(n?.code==="ESRCH")return;try{e.kill(t)}catch(o){
|
|
90
|
+
o?.code!=="ESRCH"&&w.stderr.write(`Vibe64 managed service process tree could not be stopped.
|
|
91
|
+
`)}}}function Mt(e={},{memoryMaxBytes:t=0,tasksMax:r=0}={}){let n=he(e);S("systemctl",["start",n]),S("systemctl",["set-p\
|
|
89
92
|
roperty","--runtime",n,`MemoryMax=${t}`,`TasksMax=${r}`,"MemoryAccounting=yes","IOAccounting=yes","TasksAccounting=yes"])}
|
|
90
|
-
function Ce(e={},t={}){let r=W(e.id);for(let
|
|
91
|
-
|
|
92
|
-
re))throw new Error("Managed workflow accounting requires a workspace daemon owner.");let o
|
|
93
|
+
function Ce(e={},t={}){let r=W(e.id);for(let a of[e.projectKey,e.sessionKey])if(typeof a!="string"||!/^[a-f0-9]{64}$/u.test(
|
|
94
|
+
a))throw new Error("Vibe64 exec helper rejected an invalid workflow accounting identity.");let n=N(t.username);if(!n.startsWith(
|
|
95
|
+
re))throw new Error("Managed workflow accounting requires a workspace daemon owner.");let o=$(n);if(!/^[a-z](?:[a-z0-9-]{0,61}[a-z0-9])?$/u.
|
|
93
96
|
test(o))throw new Error("Invalid managed workflow workspace identity.");let i=`vibe64-${o}-work-p${e.projectKey}.slice`,
|
|
94
97
|
s=`${i.slice(0,-6)}-s${e.sessionKey}.slice`;return{id:r,workspace:o,projectKey:e.projectKey,sessionKey:e.sessionKey,projectUnit:i,
|
|
95
98
|
sessionUnit:s,unitName:`${s.slice(0,-6)}-w${r.replaceAll("-","")}.slice`}}function ye(e){return u.join("/run/vibe64-work\
|
|
96
|
-
flows",e.workspace,`${e.id}.json`)}function kt(e){try{let t=JSON.parse(
|
|
99
|
+
flows",e.workspace,`${e.id}.json`)}function kt(e){try{let t=JSON.parse(h(ye(e),"utf8"));if(t.schema!=="vibe64.managed-wo\
|
|
97
100
|
rkflow.result.v1"||t.unitName!==e.unitName||t.id!==e.id)throw new Error("Invalid managed workflow result identity.");return t}catch(t){
|
|
98
101
|
if(t.code==="ENOENT")return null;throw t}}function At(e,t){let r=ye(e);for(let i of["/run/vibe64-workflows",u.dirname(r)]){
|
|
99
|
-
try{_e(i,{mode:448})}catch(
|
|
102
|
+
try{_e(i,{mode:448})}catch(a){if(a.code!=="EEXIST")throw a}let s=fe(i);if(!s.isDirectory()||s.isSymbolicLink()||s.uid!==
|
|
100
103
|
0||(s.mode&63)!==0)throw new Error("Unsafe managed workflow result directory.")}let n=`${r}.tmp-${w.pid}`,o=Qe(n,"wx",384);
|
|
101
104
|
try{try{oe(o,`${JSON.stringify({...t,schema:"vibe64.managed-workflow.result.v1"})}
|
|
102
|
-
`)}finally{Ze(o)}Ne(n,r)}catch(i){try{
|
|
103
|
-
t write and cleanup failed.")}throw i}}function
|
|
105
|
+
`)}finally{Ze(o)}Ne(n,r)}catch(i){try{G(n)}catch(s){if(s.code!=="ENOENT")throw new AggregateError([i,s],"Workflow receip\
|
|
106
|
+
t write and cleanup failed.")}throw i}}function P(e){let t=A("systemctl",["show",e.unitName,"--no-pager","--property=Loa\
|
|
104
107
|
dState,ActiveState,ControlGroup,MemoryMax,TasksMax"]),r=Object.fromEntries(String(t.stdout||"").trim().split(`
|
|
105
|
-
`).map(s=>{let
|
|
108
|
+
`).map(s=>{let a=s.indexOf("=");return[s.slice(0,a),s.slice(a+1)]})),n=String(r.ControlGroup||"");if(n&&(u.posix.basename(
|
|
106
109
|
n)!==e.unitName||!n.includes(`/vibe64-${e.workspace}-work.slice/`)))throw new Error("Managed workflow group does not bel\
|
|
107
|
-
ong to its workspace.");let o={id:e.id,unitName:e.unitName,activeState:r.ActiveState||"unknown",controlGroup:n,memoryMaxBytes:
|
|
108
|
-
r.MemoryMax),tasksMax:
|
|
109
|
-
(o.scopeEmpty=!0);let i=kt(e);return i?{...i,activeState:o.activeState,controlGroup:o.controlGroup}:o}function
|
|
110
|
-
"string"&&/^[0-9]+$/u.test(e.trim())&&Number.isSafeInteger(Number(e))?Number(e):null}function ge(e=""){function t(
|
|
111
|
-
return"";try{return
|
|
112
|
-
return Object.fromEntries(t(
|
|
113
|
-
`).map(
|
|
110
|
+
ong to its workspace.");let o={id:e.id,unitName:e.unitName,activeState:r.ActiveState||"unknown",controlGroup:n,memoryMaxBytes:E(
|
|
111
|
+
r.MemoryMax),tasksMax:E(r.TasksMax),...ge(n?u.join("/sys/fs/cgroup",n):"")};t.status===0&&r.ActiveState==="inactive"&&!n&&
|
|
112
|
+
(o.scopeEmpty=!0);let i=kt(e);return i?{...i,activeState:o.activeState,controlGroup:o.controlGroup}:o}function E(e){return typeof e==
|
|
113
|
+
"string"&&/^[0-9]+$/u.test(e.trim())&&Number.isSafeInteger(Number(e))?Number(e):null}function ge(e=""){function t(a){if(!e)
|
|
114
|
+
return"";try{return h(u.join(e,a),"utf8")}catch(c){if(c.code==="ENOENT"||c.code==="ENODEV")return"";throw c}}function r(a){
|
|
115
|
+
return Object.fromEntries(t(a).trim().split(`
|
|
116
|
+
`).map(c=>{let[m,p]=c.trim().split(/\s+/u);return[m,E(p)]}))}let n=r("memory.events"),o=r("memory.stat"),i=r("cgroup.eve\
|
|
114
117
|
nts"),s=t("memory.pressure");return{sampledAt:new Date().toISOString(),sampledMonotonicMs:Number(w.hrtime.bigint()/1000000n),
|
|
115
|
-
scopeEmpty:i.populated===0?!0:i.populated===1?!1:null,memoryCurrentBytes:
|
|
116
|
-
ory.peak")),memorySwapCurrentBytes:
|
|
117
|
-
memoryKernelBytes:o.kernel??null,swapInPages:o.pswpin??null,swapOutPages:o.pswpout??null,memoryPressureSomeTotalUsec:
|
|
118
|
-
exec(s)?.[1]),oomCount:n.oom??null,oomKillCount:n.oom_kill??null,limitHitCount:n.max??null,reclaimCount:n.high??null,tasksCurrent:
|
|
118
|
+
scopeEmpty:i.populated===0?!0:i.populated===1?!1:null,memoryCurrentBytes:E(t("memory.current")),memoryPeakBytes:E(t("mem\
|
|
119
|
+
ory.peak")),memorySwapCurrentBytes:E(t("memory.swap.current")),memoryAnonBytes:o.anon??null,memoryFileBytes:o.file??null,
|
|
120
|
+
memoryKernelBytes:o.kernel??null,swapInPages:o.pswpin??null,swapOutPages:o.pswpout??null,memoryPressureSomeTotalUsec:E(/^some\s+.*\btotal=([0-9]+)(?:\s|$)/mu.
|
|
121
|
+
exec(s)?.[1]),oomCount:n.oom??null,oomKillCount:n.oom_kill??null,limitHitCount:n.max??null,reclaimCount:n.high??null,tasksCurrent:E(
|
|
119
122
|
t("pids.current")),peakScope:"workflow-lifetime"}}function Ot(e,t){let r=Ce(e.workflow,t),n=String(e.action||"");if(n===
|
|
120
|
-
"workflow-inspect")return{ok:!0,...
|
|
121
|
-
-forget"){let o=
|
|
122
|
-
can be acknowledged.");try{
|
|
123
|
-
let o=
|
|
123
|
+
"workflow-inspect")return{ok:!0,...P(r)};if(n==="workflow-grow"||n==="workflow-limits")return _t(e,r,t);if(n==="workflow\
|
|
124
|
+
-forget"){let o=P(r);if(o.scopeEmpty!==!0||o.activeState!=="inactive")throw new Error("Only a completed workflow receipt\
|
|
125
|
+
can be acknowledged.");try{G(ye(r))}catch(i){if(i.code!=="ENOENT")throw i}return{ok:!0,id:r.id}}if(n==="workflow-create"){
|
|
126
|
+
let o=U(e.memoryMaxBytes,F,we,"workflow memory limit"),i=U(e.tasksMax,de,pe,"workflow task limit"),s=E(S("systemctl",["s\
|
|
124
127
|
how",he(t),"--property=MemoryMax","--value"]));if(s===null||o>s)throw new Error("Vibe64 exec helper rejected a workflow \
|
|
125
|
-
above its proven work-slice memory limit.");let
|
|
126
|
-
nnot be reused.");if(
|
|
127
|
-
ow cannot be reconfigured by retrying creation.");return{ok:!0,...
|
|
128
|
+
above its proven work-slice memory limit.");let a=P(r);if(a.finishedAt)throw new Error("A completed workflow identity ca\
|
|
129
|
+
nnot be reused.");if(a.activeState==="active"){if(a.memoryMaxBytes!==o||a.tasksMax!==i)throw new Error("An active workfl\
|
|
130
|
+
ow cannot be reconfigured by retrying creation.");return{ok:!0,...a}}S("busctl",["--system","call","org.freedesktop.syst\
|
|
128
131
|
emd1","/org/freedesktop/systemd1","org.freedesktop.systemd1.Manager","StartTransientUnit","ssa(sv)a(sa(sv))",r.unitName,
|
|
129
132
|
"fail","5","MemoryMax","t",String(o),"TasksMax","t",String(i),"MemoryAccounting","b","true","IOAccounting","b","true","T\
|
|
130
|
-
asksAccounting","b","true","0"]),
|
|
131
|
-
|
|
132
|
-
ok:!0,...
|
|
133
|
-
empty",...o};At(r,{...o,finishedAt:new Date().toISOString()})}let i=
|
|
133
|
+
asksAccounting","b","true","0"]),S("systemctl",["start",r.unitName]);let c=P(r);if(c.memoryMaxBytes!==o||c.tasksMax!==i||
|
|
134
|
+
c.scopeEmpty!==!0)throw new Error("Managed workflow creation could not prove its limits and empty accounting group.");return{
|
|
135
|
+
ok:!0,...c}}if(n==="workflow-finish"){let o=P(r);if(!o.finishedAt){if(o.scopeEmpty!==!0)return{ok:!1,code:"workflow_not_\
|
|
136
|
+
empty",...o};At(r,{...o,finishedAt:new Date().toISOString()})}let i=A("systemctl",["stop",r.unitName]),s=P(r);if(s.activeState!==
|
|
134
137
|
"inactive"||s.controlGroup||s.scopeEmpty!==!0)throw new Error(String(i.stderr||"Managed workflow group did not stop.").trim());
|
|
135
138
|
return{ok:!0,...s}}throw new Error("Vibe64 exec helper rejected an unknown workflow action.")}function ue(e,t,r,n){let o=Object.
|
|
136
|
-
fromEntries(
|
|
137
|
-
`).map(
|
|
138
|
-
"Memory growth requires the same active, owned accounting group.");let i=h(
|
|
139
|
-
f8")),s=
|
|
140
|
-
ied.");let
|
|
139
|
+
fromEntries(S("systemctl",["show",e,"--no-pager","--property=ActiveState,ControlGroup,MemoryMax"]).split(`
|
|
140
|
+
`).map(c=>{let m=c.indexOf("=");return[c.slice(0,m),c.slice(m+1)]}));if(o.ActiveState!=="active"||o.ControlGroup!==t)throw new Error(
|
|
141
|
+
"Memory growth requires the same active, owned accounting group.");let i=E(h(u.join("/sys/fs/cgroup",t,"memory.max"),"ut\
|
|
142
|
+
f8")),s=E(o.MemoryMax);if(s===null||i!==Math.floor(s/r)*r)throw new Error("The effective memory limit could not be verif\
|
|
143
|
+
ied.");let a=h(u.join("/sys/fs/cgroup",t,"memory.high"),"utf8").trim();if(a!=="max"&&(E(a)===null||n>Number(a)))throw Object.
|
|
141
144
|
assign(new Error("Memory growth is blocked by the target's memory.high limit."),{limitingGroup:{controlGroup:t,limit:"me\
|
|
142
|
-
mory.high",maximumBytes:
|
|
143
|
-
memoryHighBytes:
|
|
144
|
-
let o={controlGroup:n};for(let[i,s]of[["memory.max","memoryMaxBytes"],["memory.high","memoryHighBytes"]]){let
|
|
145
|
-
"/sys/fs/cgroup",n,i),"utf8").trim(),a
|
|
146
|
-
Memory growth is blocked by an ancestor ${i} limit.`),{limitingGroup:{controlGroup:n,limit:i,maximumBytes:
|
|
147
|
-
o[s]=
|
|
148
|
-
t);if(
|
|
149
|
-
.");let
|
|
150
|
-
"Memory growth requires a bounded list of owned executions.");if(
|
|
151
|
-
"The kernel memory limit granularity is unavailable.");
|
|
152
|
-
floor(
|
|
153
|
-
unitName===f))throw new Error("Duplicate memory growth execution.");let g=
|
|
154
|
-
t");if(g>
|
|
155
|
-
controlGroup}/${f}`,memoryMaxBytes:Math.floor(g/
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
throw new Error("Memory growth cannot lower a live limit or apply to stale limits.");
|
|
159
|
-
for(let[
|
|
160
|
-
`MemoryMax=${f.memoryMaxBytes}`]));if(s=
|
|
161
|
-
memoryMaxBytes),!s.every((
|
|
162
|
-
match the requested limits.");return{ok:!0,id:t.id,changeState:o?"applied":"unchanged",pageSizeBytes:
|
|
163
|
-
ancestors:
|
|
164
|
-
|
|
165
|
-
id,code:"workflow_memory_growth_failed",changeState:
|
|
166
|
-
before:i,after:s,ancestors:
|
|
167
|
-
ne("gid",e.gid,n.gid),n.username!==t.username&&(Se(n.username),
|
|
145
|
+
mory.high",maximumBytes:E(a),requestedBytes:n??null}});return{unitName:e,controlGroup:t,memoryMaxBytes:s,effectiveMemoryMaxBytes:i,
|
|
146
|
+
memoryHighBytes:a==="max"?null:E(a)}}function me(e,t){let r=[];for(let n=u.posix.dirname(e);n!=="/";n=u.posix.dirname(n)){
|
|
147
|
+
let o={controlGroup:n};for(let[i,s]of[["memory.max","memoryMaxBytes"],["memory.high","memoryHighBytes"]]){let a=h(u.join(
|
|
148
|
+
"/sys/fs/cgroup",n,i),"utf8").trim(),c=a==="max"?null:E(a);if(a!=="max"&&(c===null||t>c))throw Object.assign(new Error(`\
|
|
149
|
+
Memory growth is blocked by an ancestor ${i} limit.`),{limitingGroup:{controlGroup:n,limit:i,maximumBytes:c,requestedBytes:t}});
|
|
150
|
+
o[s]=c}r.push(o)}return r}function _t(e,t,r){let n=e.action==="workflow-limits",o=!1,i=[],s=[],a=[],c=[],m=null;try{let p=P(
|
|
151
|
+
t);if(p.activeState!=="active"||!p.controlGroup||p.finishedAt)throw new Error("Memory growth requires an active workflow\
|
|
152
|
+
.");let d=U(e.memoryMaxBytes,F,we,"workflow memory limit");if(!Array.isArray(e.executions)||e.executions.length>128)throw new Error(
|
|
153
|
+
"Memory growth requires a bounded list of owned executions.");if(m=E(S("getconf",["PAGESIZE"])),!m||m>F)throw new Error(
|
|
154
|
+
"The kernel memory limit granularity is unavailable.");a=[{unitName:t.unitName,controlGroup:p.controlGroup,memoryMaxBytes:Math.
|
|
155
|
+
floor(d/m)*m,expectedMemoryMaxBytes:e.expectedMemoryMaxBytes}];for(let l of e.executions){let f=De(l?.id,r);if(a.some(x=>x.
|
|
156
|
+
unitName===f))throw new Error("Duplicate memory growth execution.");let g=U(l.memoryMaxBytes,F,$e,"execution memory limi\
|
|
157
|
+
t");if(g>d)throw new Error("Execution memory growth exceeds its workflow allowance.");a.push({unitName:f,controlGroup:`${p.
|
|
158
|
+
controlGroup}/${f}`,memoryMaxBytes:Math.floor(g/m)*m,expectedMemoryMaxBytes:l.expectedMemoryMaxBytes})}if(i=a.map(l=>ue(
|
|
159
|
+
l.unitName,l.controlGroup,m,n?void 0:l.memoryMaxBytes)),n)return{ok:!0,id:t.id,pageSizeBytes:m,before:i,after:i,ancestors:me(
|
|
160
|
+
p.controlGroup)};for(let[l,f]of a.entries())if(f.expectedMemoryMaxBytes!==i[l].memoryMaxBytes||f.memoryMaxBytes<i[l].effectiveMemoryMaxBytes)
|
|
161
|
+
throw new Error("Memory growth cannot lower a live limit or apply to stale limits.");c=me(p.controlGroup,a[0].memoryMaxBytes);
|
|
162
|
+
for(let[l,f]of a.entries())i[l].memoryMaxBytes!==f.memoryMaxBytes&&(o=!0,S("systemctl",["set-property","--runtime",f.unitName,
|
|
163
|
+
`MemoryMax=${f.memoryMaxBytes}`]));if(s=a.map(l=>ue(l.unitName,l.controlGroup,m,l.memoryMaxBytes)),c=me(p.controlGroup,a[0].
|
|
164
|
+
memoryMaxBytes),!s.every((l,f)=>l.memoryMaxBytes===a[f].memoryMaxBytes))throw new Error("Memory growth readback did not \
|
|
165
|
+
match the requested limits.");return{ok:!0,id:t.id,changeState:o?"applied":"unchanged",pageSizeBytes:m,before:i,after:s,
|
|
166
|
+
ancestors:c}}catch(p){let d="unchanged";return o&&(s=a.map(l=>{try{return ue(l.unitName,l.controlGroup,m)}catch{return null}}),
|
|
167
|
+
d=s.some(l=>l===null)?"unknown":s.every((l,f)=>l.memoryMaxBytes===i[f].memoryMaxBytes)?"unchanged":"partial"),{ok:!1,id:t.
|
|
168
|
+
id,code:"workflow_memory_growth_failed",changeState:d,error:String(p?.message||p),limitingGroup:p?.limitingGroup??null,pageSizeBytes:m,
|
|
169
|
+
before:i,after:s,ancestors:c}}}function Nt(e={},t={}){let r=N(e.username||t.username),n=X(r);return ne("uid",e.uid,n.uid),
|
|
170
|
+
ne("gid",e.gid,n.gid),n.username!==t.username&&(Se(n.username),Ke(t,n.username)),Ue(n.username,j),n}function W(e=""){let t=String(
|
|
168
171
|
e||"").trim();if(!pt.test(t))throw new Error("Vibe64 exec helper rejected an invalid managed execution id.");return t.toLowerCase()}
|
|
169
172
|
function Tt(e=""){let t=String(e||"").trim();if(!ft.has(t))throw new Error("Vibe64 exec helper rejected an unknown manag\
|
|
170
173
|
ed execution kind.");return t}function It(e=""){let t=String(e||"").trim();if(!wt.has(t))throw new Error("Vibe64 exec he\
|
|
171
|
-
lper rejected an unknown managed execution mode.");return t}function
|
|
174
|
+
lper rejected an unknown managed execution mode.");return t}function U(e,t,r,n="value"){let o=Number(e);if(!Number.isSafeInteger(
|
|
172
175
|
o)||o<t||o>r)throw new Error(`Vibe64 exec helper rejected an invalid managed execution ${n}.`);return o}function De(e="",t={}){
|
|
173
|
-
return`vibe64-exec-${
|
|
174
|
-
-work.slice`}function Ee(e={},t=""){return u.join(se(e),"executions",W(t))}function se(e={}){return`/run/vibe64-${
|
|
175
|
-
username))}`}function jt(e={}){let t=se(e);
|
|
176
|
-
s")])}function
|
|
177
|
-
|
|
176
|
+
return`vibe64-exec-${$(N(t.username))}-${W(e).replaceAll("-","")}.service`}function he(e={}){return`vibe64-${$(N(e.username))}\
|
|
177
|
+
-work.slice`}function Ee(e={},t=""){return u.join(se(e),"executions",W(t))}function se(e={}){return`/run/vibe64-${$(N(e.
|
|
178
|
+
username))}`}function jt(e={}){let t=se(e);S("install",["-d","-o",N(e.username),"-g",j,"-m","2750",t,u.join(t,"execution\
|
|
179
|
+
s")])}function $t(e={},t=""){return u.join(Ee(e,t),"result.json")}function Rt(e={},t=""){let r=$t(e,t);try{let n=JSON.parse(
|
|
180
|
+
h(r,"utf8"));return n?.schema==="vibe64.managed-execution.result"&&n.schemaVersion===1&&n.executionId===W(t)?n:{}}catch(n){
|
|
178
181
|
if(n?.code==="ENOENT"||n instanceof SyntaxError)return{};throw n}}function Ct(e="",t={}){let r=u.join(e,"result.json"),n=`${r}\
|
|
179
182
|
.tmp-${w.pid}`;oe(n,`${JSON.stringify({...t,schema:"vibe64.managed-execution.result",schemaVersion:1})}
|
|
180
|
-
`,{flag:"wx",mode:384}),Ne(n,r)}function Dt(){let e=String(
|
|
181
|
-
`).find(s=>s.startsWith("0::")),t=String(e||"").slice(3).replace(/^\/+/,""),r=t?u.join("/sys/fs/cgroup",t):"";if(!r
|
|
183
|
+
`,{flag:"wx",mode:384}),Ne(n,r)}function Dt(){let e=String(h("/proc/self/cgroup","utf8")||"").split(`
|
|
184
|
+
`).find(s=>s.startsWith("0::")),t=String(e||"").slice(3).replace(/^\/+/,""),r=t?u.join("/sys/fs/cgroup",t):"";if(!r||!T(
|
|
182
185
|
r))return{};let n=Ae(u.join(r,"cpu.stat")),o=Ae(u.join(r,"memory.events")),i=Bt(u.join(r,"io.stat"));return{resourceCounters:ge(
|
|
183
|
-
r),cpuUsageNSec:String(Number(n.usage_usec||0)*1e3),ioReadBytes:String(i.readBytes),ioWriteBytes:String(i.writeBytes),memoryCurrent:
|
|
184
|
-
u.join(r,"memory.current")),memoryPeak:
|
|
185
|
-
Number(o.oom_kill||0)),taskLimit:Be(r),tasksCurrent:
|
|
186
|
-
try{let t=String(
|
|
187
|
-
function Be(e,t=
|
|
186
|
+
r),cpuUsageNSec:String(Number(n.usage_usec||0)*1e3),ioReadBytes:String(i.readBytes),ioWriteBytes:String(i.writeBytes),memoryCurrent:z(
|
|
187
|
+
u.join(r,"memory.current")),memoryPeak:z(u.join(r,"memory.peak")),memorySwapCurrent:z(u.join(r,"memory.swap.current")),oomKillCount:String(
|
|
188
|
+
Number(o.oom_kill||0)),taskLimit:Be(r),tasksCurrent:z(u.join(r,"pids.current")),tasksPeak:z(u.join(r,"pids.peak"))}}function z(e=""){
|
|
189
|
+
try{let t=String(h(e,"utf8")||"0").trim();return/^[0-9]+$/u.test(t)?t:"0"}catch(t){if(t?.code==="ENOENT")return"0";throw t}}
|
|
190
|
+
function Be(e,t=h){if(!e)return null;try{let r=a=>{try{return E(/^max\s+(\d+)$/mu.exec(t(u.join(e,a),"utf8"))?.[1])}catch{
|
|
188
191
|
return null}},n=r("pids.events.local"),o=r("pids.events"),i=n>0?n:o;if(!(i>0))return null;let s=t("/proc/self/mountinfo",
|
|
189
192
|
"utf8").split(`
|
|
190
|
-
`).find(
|
|
193
|
+
`).find(a=>a.split(" ")[4]==="/sys/fs/cgroup"&&a.includes(" - cgroup2 "));return{source:"cgroup-pids-events",count:i,scope:n>
|
|
191
194
|
0&&s&&!s.split(/[ ,]/u).includes("pids_localevents")?"execution":"unknown"}}catch{return null}}function Ae(e=""){try{return Object.
|
|
192
|
-
fromEntries(String(
|
|
193
|
-
n||"")?[[r,n]]:[]}))}catch(t){if(t?.code==="ENOENT")return{};throw t}}function Bt(e=""){let t="";try{t=
|
|
195
|
+
fromEntries(String(h(e,"utf8")||"").split(/\r?\n/u).flatMap(t=>{let[r,n]=t.trim().split(/\s+/u);return r&&/^[0-9]+$/u.test(
|
|
196
|
+
n||"")?[[r,n]]:[]}))}catch(t){if(t?.code==="ENOENT")return{};throw t}}function Bt(e=""){let t="";try{t=h(e,"utf8")}catch(o){
|
|
194
197
|
if(o?.code==="ENOENT")return{readBytes:0,writeBytes:0};throw o}let r=0,n=0;for(let o of String(t||"").split(/\r?\n/u))for(let i of o.
|
|
195
|
-
trim().split(/\s+/u).slice(1)){let[s,
|
|
196
|
-
readBytes:r,writeBytes:n}}function
|
|
197
|
-
property=LoadState,ActiveState,SubState,Result,ExecMainCode,ExecMainStatus,
|
|
198
|
-
MainPID,ControlGroup,MemoryCurrent,MemoryPeak,MemorySwapCurrent,TasksCurrent,TasksMax,
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
resourceCounters||
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
IOWriteBytes,
|
|
207
|
-
"not-found"),mainPid:String(
|
|
208
|
-
|
|
209
|
-
Be(
|
|
210
|
-
"",subState:String(
|
|
211
|
-
|
|
212
|
-
n>t?n:t},0))}function Pt(e="",t="",r={}){let n=
|
|
213
|
-
if((n.result==="oom-kill"||Number(n.oomKillCount)>
|
|
214
|
-
"--boot=0","--no-pager","--output=json","--output
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
0&&(o=Vt(
|
|
218
|
-
c>=s){let
|
|
219
|
-
|
|
220
|
-
: fork rejected by pids controller in /.*${e.
|
|
221
|
-
1024});!
|
|
222
|
-
`${JSON.stringify({executionId:t,ok:!0,...n,oomBoundary:o,
|
|
198
|
+
trim().split(/\s+/u).slice(1)){let[s,a]=i.split("=");s==="rbytes"&&(r+=Number(a||0)),s==="wbytes"&&(n+=Number(a||0))}return{
|
|
199
|
+
readBytes:r,writeBytes:n}}function K(e="",t="",r={},{query:n=A,readResult:o=Rt}={}){let i=n("systemctl",["show",e,"--no-\
|
|
200
|
+
pager","--timestamp=us+utc","--property=LoadState,ActiveState,SubState,Result,ExecMainCode,ExecMainStatus,ExecMainStartT\
|
|
201
|
+
imestamp,ExecMainExitTimestamp,MainPID,ControlGroup,MemoryCurrent,MemoryPeak,MemorySwapCurrent,TasksCurrent,TasksMax,CPU\
|
|
202
|
+
UsageNSec,IOReadBytes,IOWriteBytes"]),s={};for(let M of String(i.stdout||"").split(/\r?\n/u)){let y=M.indexOf("=");y>0&&
|
|
203
|
+
(s[M.slice(0,y)]=M.slice(y+1))}s.LoadState==="not-found"&&(s={LoadState:"not-found"});let a=String(s.ControlGroup||"").trim(),
|
|
204
|
+
c=a?u.join("/sys/fs/cgroup",a.replace(/^\/+/,"")):"",m=ge(c),p=c&&T(c)?m.scopeEmpty:!0,d=t?o(r,t):{},l=Date.parse(d.exitObservedAt||
|
|
205
|
+
""),f=Number.isFinite(l)?"runner":"systemd",g=Number.isFinite(l)?l:Date.parse(s.ExecMainExitTimestamp||""),x=Number.isFinite(
|
|
206
|
+
g)&&g>0&&g<=Date.now()?new Date(g).toISOString():"";return{resourceCounters:d.resourceCounters||m,activeState:String(s.ActiveState||
|
|
207
|
+
(d.executionId?"inactive":"unknown")),controlGroup:a,cpuUsageNSec:R(s.CPUUsageNSec,d.cpuUsageNSec),execMainCode:String(s.
|
|
208
|
+
ExecMainCode||d.execMainCode||""),execMainStatus:String(s.ExecMainStatus||d.execMainStatus||""),exitObservedAt:x,exitTimeSource:x?
|
|
209
|
+
f:"",ioReadBytes:R(s.IOReadBytes,d.ioReadBytes),ioWriteBytes:R(s.IOWriteBytes,d.ioWriteBytes),loadState:String(s.LoadState&&
|
|
210
|
+
s.LoadState!=="not-found"?s.LoadState:d.executionId?"recorded":"not-found"),mainPid:String(s.MainPID||"0"),memoryCurrent:R(
|
|
211
|
+
s.MemoryCurrent,d.memoryCurrent),memoryPeak:R(s.MemoryPeak,d.memoryPeak),memorySwapCurrent:R(s.MemorySwapCurrent,d.memorySwapCurrent),
|
|
212
|
+
oomKillCount:R(d.oomKillCount),taskLimit:d.taskLimit||Be(c),result:String(s.Result||d.result||""),signal:String(d.signal||
|
|
213
|
+
""),scopeEmpty:p,startedAt:s.ExecMainStartTimestamp||d.startedAt||"",subState:String(s.SubState||"unknown"),tasksCurrent:R(
|
|
214
|
+
s.TasksCurrent,d.tasksCurrent),tasksPeak:R(d.tasksPeak),tasksMax:String(s.TasksMax||"0"),unitName:e}}function R(...e){return String(
|
|
215
|
+
e.reduce((t,r)=>{let n=Number(r);return Number.isFinite(n)&&n>t?n:t},0))}function Pt(e="",t="",r={}){let n=K(e,t,r),o=null,
|
|
216
|
+
i=n.taskLimit,s=Date.parse(n.startedAt),a=Date.parse(n.exitObservedAt);if((n.result==="oom-kill"||Number(n.oomKillCount)>
|
|
217
|
+
0)&&s>0&&a>=s){let c=Math.min(Date.now(),a+1e3),m=I("journalctl",["-k","--boot=0","--no-pager","--output=json","--output\
|
|
218
|
+
-fields=__REALTIME_TIMESTAMP,__SEQNUM_ID,__SEQNUM,_BOOT_ID,_SOURCE_MONOTONIC_TIMESTAMP,MESSAGE","--lines=65","--case-sen\
|
|
219
|
+
sitive=yes",`--since=@${s/1e3}`,`--until=@${c/1e3}`,`--grep=^oom-kill:|^/[^,]*/${e.replaceAll(".","\\.")}(?:/[^,]*)?,tas\
|
|
220
|
+
k=`],{encoding:"utf8",timeout:2e3,maxBuffer:128*1024});!m.error&&m.status===0&&(o=Vt(m.stdout,{unitName:e,workspace:$(r.
|
|
221
|
+
username),startedAt:s,until:c}))}if(!i&&n.result&&n.result!=="success"&&s>0&&a>=s){let c=Math.min(Date.now(),a+1e3),m=I(
|
|
222
|
+
"journalctl",["-k","--boot=0","--no-pager","--output=json","--output-fields=__REALTIME_TIMESTAMP,MESSAGE","--lines=65","\
|
|
223
|
+
--case-sensitive=yes",`--since=@${s/1e3}`,`--until=@${c/1e3}`,`--grep=^cgroup: fork rejected by pids controller in /.*${e.
|
|
224
|
+
replaceAll(".","\\.")}(?:/|$)`],{encoding:"utf8",timeout:2e3,maxBuffer:128*1024});!m.error&&m.status===0&&(i=Ut(m.stdout,
|
|
225
|
+
{unitName:e,workspace:$(r.username),startedAt:s,until:c}))}w.stdout.write(`${JSON.stringify({executionId:t,ok:!0,...n,oomBoundary:o,
|
|
226
|
+
taskLimit:i})}
|
|
223
227
|
`)}function Ut(e,{unitName:t,workspace:r,startedAt:n,until:o}){if(typeof e!="string"||Buffer.byteLength(e)>128*1024)return null;
|
|
224
|
-
let i=e.trim().split(/\r?\n/u);if(i.length>64)return null;for(let s of i){let
|
|
225
|
-
|
|
226
|
-
exec(
|
|
227
|
-
|
|
228
|
-
recordedAt:new Date(
|
|
228
|
+
let i=e.trim().split(/\r?\n/u);if(i.length>64)return null;for(let s of i){let a;try{a=JSON.parse(s)}catch{continue}let c=Number(
|
|
229
|
+
a?.__REALTIME_TIMESTAMP)/1e3;if(!Number.isFinite(c)||c<n||c>o)continue;let m=typeof a.MESSAGE=="string"&&/^cgroup: fork rejected by pids controller in (\/[a-zA-Z0-9_./-]{1,2048})$/u.
|
|
230
|
+
exec(a.MESSAGE)?.[1];if(!m)continue;let p=m.split("/"),d=p.indexOf(`vibe64-${r}-work.slice`);if(!(p[1]!=="vibe64.slice"||
|
|
231
|
+
d<2||p.indexOf(t)<=d||p.some((l,f)=>f>0&&(!l||l==="."||l===".."))))return{source:"kernel-journal",scope:"unknown",count:null,
|
|
232
|
+
recordedAt:new Date(c).toISOString()}}return null}function Vt(e,{unitName:t,workspace:r,startedAt:n,until:o}){if(typeof e!=
|
|
229
233
|
"string"||Buffer.byteLength(e)>128*1024)return null;let i=e.trim().split(/\r?\n/u);if(i.length>64)return null;let s=i.flatMap(
|
|
230
|
-
|
|
231
|
-
isFinite(
|
|
232
|
-
=")){let v=s.find(
|
|
233
|
-
/^[a-f0-9]{32}$/u.test(
|
|
234
|
-
1&&Number(
|
|
235
|
-
|
|
236
|
-
let
|
|
237
|
-
if(!
|
|
238
|
-
ce"||
|
|
239
|
-
_NONE"&&g)
|
|
240
|
-
0,
|
|
234
|
+
c=>{try{return[JSON.parse(c)]}catch{return[]}}),a=null;for(let c of s){let m=Number(c?.__REALTIME_TIMESTAMP)/1e3;if(!Number.
|
|
235
|
+
isFinite(m)||m<n||m>o)continue;let p=c.MESSAGE;if(typeof p=="string"&&p.startsWith("oom-kill:")&&p.endsWith(",task_memcg\
|
|
236
|
+
=")){let v=s.find(k=>/^[a-f0-9]{32}$/u.test(c.__SEQNUM_ID||"")&&k?.__SEQNUM_ID===c.__SEQNUM_ID&&k?._BOOT_ID===c._BOOT_ID&&
|
|
237
|
+
/^[a-f0-9]{32}$/u.test(c._BOOT_ID||"")&&Number.isSafeInteger(Number(c.__SEQNUM))&&Number(k.__SEQNUM)===Number(c.__SEQNUM)+
|
|
238
|
+
1&&Number(k._SOURCE_MONOTONIC_TIMESTAMP)>=Number(c._SOURCE_MONOTONIC_TIMESTAMP)&&Number(k._SOURCE_MONOTONIC_TIMESTAMP)-Number(
|
|
239
|
+
c._SOURCE_MONOTONIC_TIMESTAMP)<=1e6&&/^\/[a-zA-Z0-9_./-]+,task=[^,]+,pid=\d+,uid=\d+$/u.test(k.MESSAGE||""));v&&(p+=v.MESSAGE)}
|
|
240
|
+
let d=typeof p=="string"&&p.match(/^oom-kill:constraint=(CONSTRAINT_[A-Z_]+),.*?,(?:oom_memcg=(\/[^,]+)|(global_oom)),task_memcg=(\/[^,]+),task=/u);
|
|
241
|
+
if(!d)continue;let[,l,f,g,x]=d,M=x.split("/"),y=M.indexOf(`vibe64-${r}-work.slice`),D=M.indexOf(t);if(M[1]!=="vibe64.sli\
|
|
242
|
+
ce"||y<2||D<=y||M.some((v,k)=>k>0&&(v==="."||v===".."||!/^[a-zA-Z0-9_.-]+$/u.test(v))))continue;let V;if(l==="CONSTRAINT\
|
|
243
|
+
_NONE"&&g)V="host";else if(l==="CONSTRAINT_MEMCG"&&f&&(x===f||x.startsWith(`${f}/`))){let v=f.split("/").at(-1),k=M.slice(
|
|
244
|
+
0,D+1).join("/");V=f===k||f.startsWith(`${k}/`)?"execution":v===`vibe64-${r}-work.slice`?"workspace_work":v===`vibe64-${r}\
|
|
241
245
|
.slice`?"workspace":v==="vibe64.slice"?"platform":/-work-p[a-f0-9]{64}-s[a-f0-9]{64}-w[a-f0-9]{32}\.slice$/u.test(v)?"wo\
|
|
242
246
|
rkflow":/-work-p[a-f0-9]{64}-s[a-f0-9]{64}\.slice$/u.test(v)?"session":/-work-p[a-f0-9]{64}\.slice$/u.test(v)?"project":
|
|
243
|
-
"ancestor"}else return null;let H=f||"";if(
|
|
244
|
-
nel-journal",scope:
|
|
245
|
-
n.scopeEmpty||(
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
247
|
+
"ancestor"}else return null;let H=f||"";if(a&&a.cgroup!==H)return null;(!a||m>Date.parse(a.recordedAt))&&(a={source:"ker\
|
|
248
|
+
nel-journal",scope:V,cgroup:H,recordedAt:new Date(m).toISOString()})}return a}function Gt(e="",t="",r={}){let n=K(e,t,r);
|
|
249
|
+
n.scopeEmpty||A("systemctl",["stop",e]);let o=Date.now()+gt,i=K(e,t,r),s=new Int32Array(new SharedArrayBuffer(4));for(;!i.
|
|
250
|
+
scopeEmpty&&Date.now()<o;)Atomics.wait(s,0,0,25),i=K(e,t,r);i.scopeEmpty||(A("systemctl",["kill","--kill-who=all","--sig\
|
|
251
|
+
nal=SIGKILL",e]),A("systemctl",["stop",e]),i=K(e,t,r)),i.scopeEmpty&&(Te(Ee(r,t),{force:!0,recursive:!0}),A("systemctl",
|
|
252
|
+
["reset-failed",e])),w.stdout.write(`${JSON.stringify({executionId:t,ok:i.scopeEmpty,scopeEmpty:i.scopeEmpty,stopped:n.scopeEmpty===
|
|
253
|
+
!1,...i})}
|
|
250
254
|
`),i.scopeEmpty||w.exit(1)}function Lt(e={}){if(e?.schema!==it||e?.schemaVersion!==st)throw new Error("Vibe64 exec helpe\
|
|
251
|
-
r rejected a non-normalized execution payload.")}function Wt(e="",t={},r=""){Se(r),q(),
|
|
252
|
-
r,String(t.password||"")):X(r),rr(r,
|
|
253
|
-
if(r==="inspect"){
|
|
255
|
+
r rejected a non-normalized execution payload.")}function Wt(e="",t={},r=""){Se(r),q(),ae(j),e==="create-system-user"?tr(
|
|
256
|
+
r,String(t.password||"")):X(r),rr(r,j)}function Ht(e={}){let t=q();ae(j);let r=String(e.action||"").trim(),n=ce(e.unitName);
|
|
257
|
+
if(r==="inspect"){zt(n);return}if(r==="remove"){Yt(n);return}if(r!=="install-start")throw new Error("Vibe64 exec helper \
|
|
254
258
|
rejected an unknown deployment service action.");let o=ee(e.workingDirectory,t,"workingDirectory"),i=ee(e.environmentFile,
|
|
255
|
-
t,"environmentFile"),s=ee(e.startScript,t,"startScript"),
|
|
256
|
-
map(
|
|
257
|
-
Pe({activation:"restart",unit:
|
|
258
|
-
r","--property=ActiveState,SubState,Result,ExecMainCode,ExecMainStatus,NRestarts"]),r=
|
|
259
|
+
t,"environmentFile"),s=ee(e.startScript,t,"startScript"),a=[...new Set((Array.isArray(e.requiredUnits)?e.requiredUnits:[]).
|
|
260
|
+
map(p=>ve(p,t)))],c=We(n),m=sr({environmentFile:i,owner:t,requiredUnits:a,startScript:s,unitName:n,workingDirectory:o});
|
|
261
|
+
Pe({activation:"restart",unit:m,unitName:n,unitPath:c})}function zt(e=""){ce(e);let t=S("systemctl",["show",e,"--no-page\
|
|
262
|
+
r","--property=ActiveState,SubState,Result,ExecMainCode,ExecMainStatus,NRestarts"]),r=A("journalctl",["--unit",e,"--no-p\
|
|
259
263
|
ager","--output=cat","--lines=80"]),n=String(r.stdout||r.stderr||"").trim();w.stdout.write(["Service state:",t,...n?["",
|
|
260
264
|
"Recent service output:",n]:[]].join(`
|
|
261
265
|
`)+`
|
|
262
|
-
`)}function
|
|
266
|
+
`)}function Kt(e={}){let t=q();ae(j);let r=String(e.action||"").trim(),n=ve(e.unitName,t);if(r!=="install-start")throw new Error(
|
|
263
267
|
"Vibe64 exec helper rejected an unknown managed service action.");let o=Oe(e.workingDirectory,t,"workingDirectory"),i=Oe(
|
|
264
|
-
e.startScript,t,"startScript"),s=Le(e.processModel),
|
|
265
|
-
processModel:s,startScript:i,unitName:n,workingDirectory:o});
|
|
266
|
-
unitName:n,unitPath:
|
|
268
|
+
e.startScript,t,"startScript"),s=Le(e.processModel),a=s==="forking"?Ge(e.pidFile,t):"",c=ir(n,t),m=ar({owner:t,pidFile:a,
|
|
269
|
+
processModel:s,startScript:i,unitName:n,workingDirectory:o});Ft({owner:t,pidFile:a,unitName:n}),Pe({activation:"start",unit:m,
|
|
270
|
+
unitName:n,unitPath:c})}function Ft({owner:e={},pidFile:t="",unitName:r=""}={}){if(!t||!T(t))return;let n=String(h(t,"ut\
|
|
267
271
|
f8")||"").trim();if(!/^[1-9][0-9]*$/u.test(n))throw new Error("Vibe64 managed service PID file is invalid.");let o=Number(
|
|
268
|
-
n);if(!Number.isSafeInteger(o)||o<=1)throw new Error("Vibe64 managed service PID is invalid.");if(!
|
|
272
|
+
n);if(!Number.isSafeInteger(o)||o<=1)throw new Error("Vibe64 managed service PID is invalid.");if(!le(o)){Q(t,n);return}
|
|
269
273
|
let i=Xt(o);if(i===null){Q(t,n);return}if(i!==e.uid)throw new Error("Vibe64 managed service PID belongs to another OS us\
|
|
270
|
-
er.");if(qt(o,r))return;try{w.kill(o,"SIGTERM")}catch(
|
|
271
|
-
|
|
272
|
-
ibe64 managed service process did not stop cleanly during ownership transfer.");Q(t,n)}function Q(e="",t=""){
|
|
273
|
-
|
|
274
|
-
function Xt(e=0){let t="";try{t=
|
|
274
|
+
er.");if(qt(o,r))return;try{w.kill(o,"SIGTERM")}catch(c){if(c?.code==="ESRCH"){Q(t,n);return}throw c}let s=Date.now()+3e4,
|
|
275
|
+
a=new Int32Array(new SharedArrayBuffer(4));for(;le(o)&&Date.now()<s;)Atomics.wait(a,0,0,100);if(le(o))throw new Error("V\
|
|
276
|
+
ibe64 managed service process did not stop cleanly during ownership transfer.");Q(t,n)}function Q(e="",t=""){T(e)&&String(
|
|
277
|
+
h(e,"utf8")||"").trim()===t&&G(e)}function le(e=0){try{return w.kill(e,0),!0}catch(t){if(t?.code==="ESRCH")return!1;throw t}}
|
|
278
|
+
function Xt(e=0){let t="";try{t=h(`/proc/${e}/status`,"utf8")}catch(o){if(o?.code==="ENOENT")return null;throw o}let r=String(
|
|
275
279
|
t||"").match(/^Uid:\s+([0-9]+)/mu),n=Number(r?.[1]);if(!Number.isSafeInteger(n))throw new Error("Vibe64 managed service \
|
|
276
|
-
process UID is unavailable.");return n}function qt(e=0,t=""){let r=`/${t}`,n="";try{n=
|
|
280
|
+
process UID is unavailable.");return n}function qt(e=0,t=""){let r=`/${t}`,n="";try{n=h(`/proc/${e}/cgroup`,"utf8")}catch(o){
|
|
277
281
|
if(o?.code==="ENOENT")return!1;throw o}return String(n||"").split(`
|
|
278
282
|
`).some(o=>o.trim().endsWith(r))}function Pe({activation:e="start",unit:t="",unitName:r="",unitPath:n=""}={}){if(e!=="st\
|
|
279
283
|
art"&&e!=="restart")throw new Error("Vibe64 exec helper rejected an unsupported systemd activation.");let o=`${n}.tmp-${w.
|
|
280
|
-
pid}`;oe(o,t,{mode:420});try{
|
|
281
|
-
l",["enable",r]),
|
|
282
|
-
function Yt(e=""){
|
|
283
|
-
e))}catch(t){if(t?.code!=="ENOENT")throw t}
|
|
284
|
+
pid}`;oe(o,t,{mode:420});try{S("mv",[o,n])}catch(i){try{G(o)}catch{}throw i}S("systemctl",["daemon-reload"]),S("systemct\
|
|
285
|
+
l",["enable",r]),A("systemctl",["reset-failed",r]);try{S("systemctl",[e,r])}catch(i){throw A("systemctl",["stop",r]),i}}
|
|
286
|
+
function Yt(e=""){ce(e),A("systemctl",["stop",e]),A("systemctl",["disable",e]),A("systemctl",["reset-failed",e]);try{G(We(
|
|
287
|
+
e))}catch(t){if(t?.code!=="ENOENT")throw t}S("systemctl",["daemon-reload"])}function Jt(e=""){let t=e?h(u.resolve(e),"ut\
|
|
284
288
|
f8"):Zt();if(Buffer.byteLength(t,"utf8")>Ie)throw new Error("Vibe64 exec helper payload is too large.");let r=JSON.parse(
|
|
285
289
|
t);if(!r||typeof r!="object"||Array.isArray(r))throw new Error("Vibe64 exec helper payload must be a JSON object.");return r}
|
|
286
290
|
function Zt(){let e=[],t=Buffer.allocUnsafe(rt),r=new Int32Array(new SharedArrayBuffer(4)),n=Date.now()+ot,o=0;for(;;)try{
|
|
287
291
|
let i=et(0,t,0,t.length,null);if(i===0)break;if(o+=i,o>Ie)throw new Error("Vibe64 exec helper payload is too large.");e.
|
|
288
292
|
push(Buffer.from(t.subarray(0,i)))}catch(i){if(i?.code==="EINTR")continue;if((i?.code==="EAGAIN"||i?.code==="EWOULDBLOCK")&&
|
|
289
293
|
Date.now()<n){Atomics.wait(r,0,0,nt);continue}throw i?.code==="EAGAIN"||i?.code==="EWOULDBLOCK"?new Error("Vibe64 exec h\
|
|
290
|
-
elper timed out waiting for its payload."):i}return Buffer.concat(e,o).toString("utf8")}function
|
|
294
|
+
elper timed out waiting for its payload."):i}return Buffer.concat(e,o).toString("utf8")}function N(e=""){let t=String(e||
|
|
291
295
|
"").trim();if(!t||/[/:\\\r\n]/u.test(t))throw new Error("Vibe64 exec helper rejected an unsafe username.");return t}function Qt(e=""){
|
|
292
|
-
if(!
|
|
296
|
+
if(!mt.test(e))throw new Error("Vibe64 exec helper rejected an unsupported username.")}function Se(e=""){if(Qt(e),e.startsWith(
|
|
293
297
|
re))throw new Error("Vibe64 daemon Unix accounts cannot be managed as app users.");if(dt.has(e))throw new Error("Privile\
|
|
294
|
-
ged Unix accounts cannot be managed as Vibe64 app users.")}function X(e=""){let t=
|
|
298
|
+
ged Unix accounts cannot be managed as Vibe64 app users.")}function X(e=""){let t=I("getent",["passwd",e],{encoding:"utf\
|
|
295
299
|
8"});if(t.status!==0)throw new Error(`OS user was not found: ${e}`);let n=String(t.stdout||"").split(/\r?\n/u)[0].split(
|
|
296
300
|
":");if(n.length<7||n[0]!==e)throw new Error(`OS user was not found: ${e}`);let o=Number(n[2]),i=Number(n[3]);if(!Number.
|
|
297
301
|
isSafeInteger(o)||!Number.isSafeInteger(i))throw new Error(`OS user has invalid uid/gid: ${e}`);return{gid:i,home:n[5],uid:o,
|
|
298
|
-
username:e}}function q(){let e=
|
|
302
|
+
username:e}}function q(){let e=N(w.env.SUDO_USER||"");return X(e)}function Ue(e="",t=""){let r=I("id",["-nG",e],{encoding:"\
|
|
299
303
|
utf8"}),n=String(r.stdout||"").trim().split(/\s+/u);if(r.status!==0||!n.includes(t))throw new Error(`OS user is not enab\
|
|
300
|
-
led for the shared Vibe64 group: ${e}`)}function er(e=""){try{return X(e)}catch{return null}}function
|
|
304
|
+
led for the shared Vibe64 group: ${e}`)}function er(e=""){try{return X(e)}catch{return null}}function ae(e=""){if(I("get\
|
|
301
305
|
ent",["group",e],{encoding:"utf8"}).status!==0)throw new Error(`Required OS group was not found: ${e}`)}function tr(e="",t=""){
|
|
302
306
|
if(er(e))throw new Error(`OS user already exists: ${e}`);if(!t||/[\r\n]/u.test(t))throw new Error("A valid initial passw\
|
|
303
|
-
ord is required to create an OS user.");
|
|
307
|
+
ord is required to create an OS user.");S("useradd",["--create-home","--user-group","--shell","/bin/bash",e]);let r=I("c\
|
|
304
308
|
hpasswd",{encoding:"utf8",input:`${e}:${t}
|
|
305
309
|
`});if(r.status!==0)throw new Error(String(r.stderr||r.stdout||"Could not set OS user password.").trim())}function rr(e="",t=""){
|
|
306
|
-
|
|
307
|
-
r.stderr||r.stdout||`${e} failed.`).trim());return String(r.stdout||"").trim()}function
|
|
308
|
-
utf8"})}function ee(e="",t={},r="path"){let n=nr(e,t);if(
|
|
309
|
-
exist.`);return n}function Oe(e="",t={},r="path"){let n=Ge(e,t);if(
|
|
310
|
-
es not exist.`);return n}function Ve(e={}){let t=
|
|
310
|
+
S("usermod",["-a","-G",t,e])}function S(e="",t=[]){let r=I(e,t,{encoding:"utf8"});if(r.status!==0)throw new Error(String(
|
|
311
|
+
r.stderr||r.stdout||`${e} failed.`).trim());return String(r.stdout||"").trim()}function A(e="",t=[]){return I(e,t,{encoding:"\
|
|
312
|
+
utf8"})}function ee(e="",t={},r="path"){let n=nr(e,t);if(!T(n))throw new Error(`Vibe64 deployment service ${r} does not \
|
|
313
|
+
exist.`);return n}function Oe(e="",t={},r="path"){let n=Ge(e,t);if(!T(n))throw new Error(`Vibe64 managed service ${r} do\
|
|
314
|
+
es not exist.`);return n}function Ve(e={}){let t=N(e.username),r=$(t);if(!r)throw new Error("Vibe64 exec helper could no\
|
|
311
315
|
t resolve the managed service workspace.");return u.join("/var/lib/vibe64",r,"services")}function Ge(e="",t={}){let r=String(
|
|
312
|
-
e||"").trim();if(!r)throw new Error("Vibe64 exec helper rejected an empty managed service path.");let n=
|
|
313
|
-
if(
|
|
316
|
+
e||"").trim();if(!r)throw new Error("Vibe64 exec helper rejected an empty managed service path.");let n=b(r,{allowMissingLeaf:!0});
|
|
317
|
+
if(C(b(Ve(t)),n).length>0)return n;throw new Error("Vibe64 exec helper rejected a managed service path outside the works\
|
|
314
318
|
pace service root.")}function nr(e="",t={}){let r=String(e||"").trim();if(!r)throw new Error("Vibe64 exec helper rejecte\
|
|
315
|
-
d an empty deployment service path.");let n=
|
|
319
|
+
d an empty deployment service path.");let n=b(r),o=b(u.join(String(t.home||"").trim(),".local","state","vibe64","project\
|
|
316
320
|
s"));if(or(o,n))return n;throw new Error("Vibe64 exec helper rejected a deployment service path outside managed roots.")}
|
|
317
|
-
function or(e="",t=""){let r=
|
|
318
|
-
"service")}function
|
|
319
|
-
resolve(r),u.resolve(n));return!o||o.startsWith("..")||u.isAbsolute(o)?[]:o.split(u.sep).filter(Boolean)}function
|
|
321
|
+
function or(e="",t=""){let r=C(e,t);return r.length>=5&&r[1]==="deployments"&&r[2]==="releases"&&(r[4]==="artifact"||r[4]===
|
|
322
|
+
"service")}function C(e="",t=""){let r=String(e||"").trim(),n=String(t||"").trim();if(!r||!n)return[];let o=u.relative(u.
|
|
323
|
+
resolve(r),u.resolve(n));return!o||o.startsWith("..")||u.isAbsolute(o)?[]:o.split(u.sep).filter(Boolean)}function b(e,{allowMissingLeaf:t=!1}={}){
|
|
320
324
|
let r=u.resolve(e);if(t)try{fe(r)}catch(n){if(n.code!=="ENOENT")throw n;return u.join(te(u.dirname(r)),u.basename(r))}return te(
|
|
321
|
-
r)}function
|
|
325
|
+
r)}function ce(e=""){let t=String(e||"").trim();if(!t.startsWith("vibe64-release-")||!t.endsWith(".service")||!/^[A-Za-z0-9_.@:-]+$/u.
|
|
322
326
|
test(t)||t.includes("/")||t.includes(".."))throw new Error("Vibe64 exec helper rejected an unsafe deployment service uni\
|
|
323
327
|
t name.");return t}function ve(e="",t={}){let r=String(e||"").trim(),n=u.basename(u.dirname(Ve(t)));if(!r.startsWith(`vi\
|
|
324
328
|
be64-managed-${n}-`)||!r.endsWith(".service")||!/^[A-Za-z0-9_.@:-]+$/u.test(r)||r.includes("/")||r.includes(".."))throw new Error(
|
|
325
329
|
"Vibe64 exec helper rejected an unsafe managed service unit name.");return r}function Le(e=""){let t=String(e||"").trim();
|
|
326
330
|
if(t!=="forking"&&t!=="simple")throw new Error("Vibe64 exec helper rejected an unsupported managed service process model\
|
|
327
|
-
.");return t}function We(e=""){return u.join("/etc/systemd/system",
|
|
328
|
-
temd/system",ve(e,t))}function He(e={}){return[`User=${
|
|
329
|
-
sk=0007"]}function
|
|
331
|
+
.");return t}function We(e=""){return u.join("/etc/systemd/system",ce(e))}function ir(e="",t={}){return u.join("/etc/sys\
|
|
332
|
+
temd/system",ve(e,t))}function He(e={}){return[`User=${_(e.username)}`,`Group=${j}`,"SupplementaryGroups=nix-users","UMa\
|
|
333
|
+
sk=0007"]}function ze(e={}){return[`Slice=vibe64-${$(N(e.username))}-work.slice`,"MemoryAccounting=yes","IOAccounting=ye\
|
|
330
334
|
s","TasksAccounting=yes","KillMode=control-group","OOMPolicy=stop"]}function sr({environmentFile:e="",owner:t={},requiredUnits:r=[],
|
|
331
335
|
startScript:n="",unitName:o="",workingDirectory:i=""}={}){let s=Array.isArray(r)?r:[];return["[Unit]",`Description=Vibe6\
|
|
332
336
|
4 release service ${o}`,`After=${["network-online.target",...s].join(" ")}`,"Wants=network-online.target",...s.length>0?
|
|
333
|
-
[`Requires=${s.join(" ")}`]:[],"StartLimitIntervalSec=60","StartLimitBurst=5","","[Service]","Type=simple",...He(t),...
|
|
334
|
-
t),`WorkingDirectory=${
|
|
335
|
-
`ExecStart=${
|
|
337
|
+
[`Requires=${s.join(" ")}`]:[],"StartLimitIntervalSec=60","StartLimitBurst=5","","[Service]","Type=simple",...He(t),...ze(
|
|
338
|
+
t),`WorkingDirectory=${_(i)}`,`EnvironmentFile=${_(e)}`,`Environment=PATH=${_(ie)}`,`Environment=TMPDIR=${_(Y(t.username))}`,
|
|
339
|
+
`ExecStart=${_(n)}`,"Restart=always","RestartSec=3","KillSignal=SIGTERM","TimeoutStopSec=30","","[Install]","WantedBy=mu\
|
|
336
340
|
lti-user.target",""].join(`
|
|
337
|
-
`)}function
|
|
341
|
+
`)}function ar({owner:e={},pidFile:t="",processModel:r="simple",startScript:n="",unitName:o="",workingDirectory:i=""}={}){
|
|
338
342
|
let s=Le(r);return["[Unit]",`Description=Vibe64 managed service ${o}`,"After=network-online.target","Wants=network-onlin\
|
|
339
|
-
e.target","","[Service]",`Type=${s}`,...He(e),...
|
|
340
|
-
nt=TMPDIR=${
|
|
343
|
+
e.target","","[Service]",`Type=${s}`,...He(e),...ze(e),`WorkingDirectory=${_(i)}`,`Environment=PATH=${_(ie)}`,`Environme\
|
|
344
|
+
nt=TMPDIR=${_(Y(e.username))}`,`ExecStart=${_(n)}`,...s==="forking"?[`PIDFile=${_(t)}`]:[],"Restart=on-failure","Restart\
|
|
341
345
|
Sec=3","TimeoutStartSec=90","TimeoutStopSec=30","","[Install]","WantedBy=multi-user.target",""].join(`
|
|
342
|
-
`)}function
|
|
346
|
+
`)}function _(e=""){let t=String(e||"").trim();if(!t||/[\r\n]/u.test(t))throw new Error("Vibe64 exec helper rejected an \
|
|
343
347
|
unsafe systemd value.");return t.replaceAll("\\","\\\\").replaceAll('"','\\"')}function ne(e="uid",t=null,r=null){if(!Number.
|
|
344
|
-
isSafeInteger(t)||t<0||t!==r)throw new Error(`Vibe64 exec helper ${e} mismatch.`)}function
|
|
345
|
-
home,".local","state","vibe64","users",`${t}.json`),n=JSON.parse(
|
|
346
|
-
"OS user is not enabled for Vibe64.")}function
|
|
347
|
-
return Y(t);
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
"
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
(
|
|
356
|
-
|
|
348
|
+
isSafeInteger(t)||t<0||t!==r)throw new Error(`Vibe64 exec helper ${e} mismatch.`)}function Ke(e={},t=""){let r=u.join(e.
|
|
349
|
+
home,".local","state","vibe64","users",`${t}.json`),n=JSON.parse(h(r,"utf8"));if(n?.username!==t||n?.status!=="active")throw new Error(
|
|
350
|
+
"OS user is not enabled for Vibe64.")}function Fe(e="",t="",{operation:r="",targetUser:n={}}={}){if(r==="health-status")
|
|
351
|
+
return Y(t);if(r==="workspace-cache-command"){let i=u.join(n.home,".local/state/vibe64/cache-maintenance"),s=b(e),a=C(i,
|
|
352
|
+
s);if(n.username!==t||b(i)!==i||s!==e||a.length!==1||!/^[a-z][a-z0-9-]*-[A-Za-z0-9]{6}$/u.test(a[0]))throw new Error("Ca\
|
|
353
|
+
che maintenance requires an owned workspace scratch directory.");return s}let o=String(e||"").trim();if(!o)return"/";if(r===
|
|
354
|
+
"account-auth-terminal"||r==="account-status"||r==="github-api-command")return ur(o,n);if(r==="vibe64-command"&&n.username===
|
|
355
|
+
t){let i=b(o),s=u.join(n.home,".local","state","vibe64","projects");if(T(s)){let m=b(s);if(i===m||i.startsWith(`${m}${u.
|
|
356
|
+
sep}`))return i}let a=u.join(n.home,".local","state","vibe64","colleague");if(T(a)){let m=C(b(a),i);if(m.length===2&&/^[A-Za-z0-9_-]+$/u.
|
|
357
|
+
test(m[0])&&/^colleague_[a-f0-9]{32}$/u.test(m[1]))return i}let c=u.join(n.home,".local","state","vibe64","training-sour\
|
|
358
|
+
ces");if(T(c)){let m=C(b(c),i);if(m.length===1&&/^(catalogue|topic)-[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/u.
|
|
359
|
+
test(m[0]))return i}}if(r==="codex-app-server"||r==="opencode-app-server"){let i=b(o),s=Number(n.uid),a=[se({username:t})];
|
|
360
|
+
Number.isSafeInteger(s)&&s>=0&&a.push(u.join("/run/user",String(s)));for(let c of a){let m=u.join(c,"vibe64","agent-prov\
|
|
361
|
+
iders");if(!T(m))continue;let p=b(m),d=C(p,i),l=d[0],f=r==="opencode-app-server"?l==="opencode":l==="codex-app-server"||
|
|
362
|
+
/^codex-app-server-[a-f0-9]{12}$/u.test(l),g=r==="codex-app-server"&&d.length===1,x=d.length===2&&d[1]==="workspace";if(f&&
|
|
363
|
+
(g||x))return i}}return cr(o,t)}function cr(e="",t=""){let r=String(e||"").trim();if(!r)throw new Error("Vibe64 exec hel\
|
|
364
|
+
per rejected an empty managed project path.");let n=b(r),o=b(u.join("/var/lib/vibe64",$(t),"projects"));if(n.startsWith(
|
|
357
365
|
`${o}${u.sep}`))return n;throw new Error("Vibe64 exec helper rejected a command path outside the owner project root.")}function ur(e="",t={}){
|
|
358
366
|
let r=String(e||"").trim(),n=String(t.home||"").trim();if(!r||!n)throw new Error("Vibe64 exec helper rejected an empty u\
|
|
359
|
-
ser command path.");let o=
|
|
360
|
-
r rejected a command path outside the target user home.")}function
|
|
361
|
-
function Y(e=""){return u.join(
|
|
362
|
-
-256color"};for(let[i,s]of Object.entries(e))!
|
|
367
|
+
ser command path.");let o=b(r),i=b(n);if(o===i||o.startsWith(`${i}${u.sep}`))return o;throw new Error("Vibe64 exec helpe\
|
|
368
|
+
r rejected a command path outside the target user home.")}function $(e=""){return e.startsWith(re)?e.slice(re.length):e}
|
|
369
|
+
function Y(e=""){return u.join(lt,$(N(e)),"tmp")}function be(e={},t={},r="",n=""){let o={PATH:ie,TERM:w.env.TERM||"xterm\
|
|
370
|
+
-256color"};for(let[i,s]of Object.entries(e))!ct.test(i)||ut.has(i)||i.startsWith("LD_")||i.startsWith("DYLD_")||(o[i]=String(
|
|
363
371
|
s));if(n==="opencode-app-server"){let i=u.join(se({username:r}),"vibe64","agent-providers","opencode");for(let s of["HOM\
|
|
364
|
-
E","XDG_CACHE_HOME","XDG_CONFIG_HOME","XDG_DATA_HOME","XDG_STATE_HOME"]){let
|
|
365
|
-
|
|
366
|
-
resolve(
|
|
367
|
-
u.join(t.home,".local","share");return o.LOGNAME=t.username,o.USER=t.username,o.TMPDIR=Y(r),o}export{ne as assertExpectedId,
|
|
368
|
-
Ut as managedExecutionTaskLimitJournal,ge as managedWorkflowCounters,Ce as managedWorkflowIdentity,
|
|
369
|
-
nr as resolveAllowedDeploymentServicePath,ur as resolveAllowedUserHomePath,Et as runUserCommand};
|
|
372
|
+
E","XDG_CACHE_HOME","XDG_CONFIG_HOME","XDG_DATA_HOME","XDG_STATE_HOME"]){let a=String(e[s]||"").trim();if(!u.isAbsolute(
|
|
373
|
+
a)||C(i,a).length===0)throw new Error(`Vibe64 exec helper rejected OpenCode ${s} outside its provider runtime.`);o[s]=u.
|
|
374
|
+
resolve(a)}}else o.HOME=t.home,o.XDG_CACHE_HOME=u.join(t.home,".cache"),o.XDG_CONFIG_HOME=u.join(t.home,".config"),o.XDG_DATA_HOME=
|
|
375
|
+
u.join(t.home,".local","share");return o.LOGNAME=t.username,o.USER=t.username,o.TMPDIR=Y(r),o}export{ne as assertExpectedId,b as canonicalPath,be as helperChildEnv,Vt as managedExecutionOomBoundary,K as managedExecutionState,
|
|
376
|
+
Be as managedExecutionTaskLimitCounters,Ut as managedExecutionTaskLimitJournal,ge as managedWorkflowCounters,Ce as managedWorkflowIdentity,
|
|
377
|
+
Fe as resolveAllowedCwd,nr as resolveAllowedDeploymentServicePath,ur as resolveAllowedUserHomePath,Et as runUserCommand};
|