@companyhelm/cli 0.0.12 → 0.1.4
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/README.md +40 -37
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +13 -52
- package/dist/commands/dependencies.d.ts +24 -0
- package/dist/commands/dependencies.js +145 -0
- package/dist/commands/down.d.ts +3 -0
- package/dist/commands/down.js +5 -0
- package/dist/commands/interactive.d.ts +6 -0
- package/dist/commands/interactive.js +22 -0
- package/dist/commands/logs.d.ts +3 -0
- package/dist/commands/logs.js +14 -0
- package/dist/commands/register-commands.d.ts +3 -0
- package/dist/commands/register-commands.js +19 -14
- package/dist/commands/reset.d.ts +7 -0
- package/dist/commands/reset.js +51 -0
- package/dist/commands/set-image-version.d.ts +31 -0
- package/dist/commands/set-image-version.js +87 -0
- package/dist/commands/setup-github-app.d.ts +10 -0
- package/dist/commands/setup-github-app.js +211 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.js +5 -30
- package/dist/commands/up.d.ts +3 -0
- package/dist/commands/up.js +14 -0
- package/dist/core/bootstrap/DeploymentBootstrapper.d.ts +9 -0
- package/dist/core/bootstrap/DeploymentBootstrapper.js +99 -0
- package/dist/core/bootstrap/SeedSqlRenderer.d.ts +12 -0
- package/dist/core/bootstrap/SeedSqlRenderer.js +44 -0
- package/dist/core/config/ApiEnvFileWriter.d.ts +6 -0
- package/dist/core/config/ApiEnvFileWriter.js +26 -0
- package/dist/core/config/GithubAppConfig.d.ts +6 -0
- package/dist/core/config/GithubAppConfig.js +26 -0
- package/dist/core/config/GithubAppConfigStore.d.ts +11 -0
- package/dist/core/config/GithubAppConfigStore.js +65 -0
- package/dist/core/docker/ComposeTemplateRenderer.d.ts +19 -0
- package/dist/core/docker/ComposeTemplateRenderer.js +42 -0
- package/dist/core/docker/DockerStackManager.d.ts +26 -0
- package/dist/core/docker/DockerStackManager.js +161 -0
- package/dist/core/logs/LogsService.d.ts +5 -0
- package/dist/core/logs/LogsService.js +13 -0
- package/dist/core/process/CommandRunner.d.ts +4 -0
- package/dist/core/process/CommandRunner.js +43 -0
- package/dist/core/runner/RunnerSupervisor.d.ts +21 -0
- package/dist/core/runner/RunnerSupervisor.js +61 -0
- package/dist/core/runtime/ImageCatalog.d.ts +8 -0
- package/dist/core/runtime/ImageCatalog.js +12 -0
- package/dist/core/runtime/LocalConfigStore.d.ts +16 -0
- package/dist/core/runtime/LocalConfigStore.js +59 -0
- package/dist/core/runtime/ManagedImages.d.ts +10 -0
- package/dist/core/runtime/ManagedImages.js +27 -0
- package/dist/core/runtime/PortAllocator.d.ts +9 -0
- package/dist/core/runtime/PortAllocator.js +20 -0
- package/dist/core/runtime/ProjectPaths.d.ts +7 -0
- package/dist/core/runtime/ProjectPaths.js +16 -0
- package/dist/core/runtime/PublicImageTagRegistry.d.ts +16 -0
- package/dist/core/runtime/PublicImageTagRegistry.js +148 -0
- package/dist/core/runtime/RuntimePaths.d.ts +12 -0
- package/dist/core/runtime/RuntimePaths.js +31 -0
- package/dist/core/runtime/RuntimeState.d.ts +24 -0
- package/dist/core/runtime/RuntimeState.js +1 -0
- package/dist/core/runtime/RuntimeStateStore.d.ts +10 -0
- package/dist/core/runtime/RuntimeStateStore.js +58 -0
- package/dist/core/runtime/Secrets.d.ts +10 -0
- package/dist/core/runtime/Secrets.js +26 -0
- package/dist/core/runtime/VersionCatalog.d.ts +10 -0
- package/dist/core/runtime/VersionCatalog.js +21 -0
- package/dist/core/status/StatusService.d.ts +16 -0
- package/dist/core/status/StatusService.js +21 -0
- package/dist/core/ui/TerminalRenderer.d.ts +17 -0
- package/dist/core/ui/TerminalRenderer.js +71 -0
- package/dist/templates/docker-compose.yaml.tpl +39 -0
- package/dist/templates/seed.sql.tpl +76 -0
- package/package.json +19 -28
- package/src/templates/docker-compose.yaml.tpl +39 -0
- package/src/templates/seed.sql.tpl +76 -0
- package/RUNTIME_IMAGE_VERSION +0 -1
- package/dist/commands/global-options.js +0 -20
- package/dist/commands/root.js +0 -2501
- package/dist/commands/runner/common.js +0 -18
- package/dist/commands/runner/register-runner-commands.js +0 -12
- package/dist/commands/runner/start.js +0 -30
- package/dist/commands/runner/stop.js +0 -55
- package/dist/commands/sdk/codex/auth.js +0 -200
- package/dist/commands/sdk/codex/register-codex-sdk-commands.js +0 -12
- package/dist/commands/sdk/codex/use-dedicated-auth.js +0 -18
- package/dist/commands/sdk/codex/use-host-auth.js +0 -19
- package/dist/commands/sdk/list.js +0 -76
- package/dist/commands/sdk/refresh-models.js +0 -25
- package/dist/commands/sdk/register-sdk-commands.js +0 -14
- package/dist/commands/shell.js +0 -90
- package/dist/commands/startup.js +0 -137
- package/dist/commands/thread/docker.js +0 -77
- package/dist/commands/thread/list.js +0 -37
- package/dist/commands/thread/register-thread-commands.js +0 -12
- package/dist/config.js +0 -105
- package/dist/generated/codex-app-server/AbsolutePathBuf.js +0 -3
- package/dist/generated/codex-app-server/AddConversationListenerParams.js +0 -3
- package/dist/generated/codex-app-server/AddConversationSubscriptionResponse.js +0 -3
- package/dist/generated/codex-app-server/AgentMessageContent.js +0 -3
- package/dist/generated/codex-app-server/AgentMessageContentDeltaEvent.js +0 -3
- package/dist/generated/codex-app-server/AgentMessageDeltaEvent.js +0 -3
- package/dist/generated/codex-app-server/AgentMessageEvent.js +0 -3
- package/dist/generated/codex-app-server/AgentMessageItem.js +0 -3
- package/dist/generated/codex-app-server/AgentReasoningDeltaEvent.js +0 -3
- package/dist/generated/codex-app-server/AgentReasoningEvent.js +0 -3
- package/dist/generated/codex-app-server/AgentReasoningRawContentDeltaEvent.js +0 -3
- package/dist/generated/codex-app-server/AgentReasoningRawContentEvent.js +0 -3
- package/dist/generated/codex-app-server/AgentReasoningSectionBreakEvent.js +0 -3
- package/dist/generated/codex-app-server/AgentStatus.js +0 -3
- package/dist/generated/codex-app-server/ApplyPatchApprovalParams.js +0 -3
- package/dist/generated/codex-app-server/ApplyPatchApprovalRequestEvent.js +0 -3
- package/dist/generated/codex-app-server/ApplyPatchApprovalResponse.js +0 -3
- package/dist/generated/codex-app-server/ArchiveConversationParams.js +0 -3
- package/dist/generated/codex-app-server/ArchiveConversationResponse.js +0 -3
- package/dist/generated/codex-app-server/AskForApproval.js +0 -3
- package/dist/generated/codex-app-server/AuthMode.js +0 -3
- package/dist/generated/codex-app-server/AuthStatusChangeNotification.js +0 -3
- package/dist/generated/codex-app-server/BackgroundEventEvent.js +0 -3
- package/dist/generated/codex-app-server/ByteRange.js +0 -3
- package/dist/generated/codex-app-server/CallToolResult.js +0 -3
- package/dist/generated/codex-app-server/CancelLoginChatGptParams.js +0 -3
- package/dist/generated/codex-app-server/CancelLoginChatGptResponse.js +0 -3
- package/dist/generated/codex-app-server/ClientInfo.js +0 -3
- package/dist/generated/codex-app-server/ClientNotification.js +0 -3
- package/dist/generated/codex-app-server/ClientRequest.js +0 -3
- package/dist/generated/codex-app-server/CodexErrorInfo.js +0 -3
- package/dist/generated/codex-app-server/CollabAgentInteractionBeginEvent.js +0 -3
- package/dist/generated/codex-app-server/CollabAgentInteractionEndEvent.js +0 -3
- package/dist/generated/codex-app-server/CollabAgentSpawnBeginEvent.js +0 -3
- package/dist/generated/codex-app-server/CollabAgentSpawnEndEvent.js +0 -3
- package/dist/generated/codex-app-server/CollabCloseBeginEvent.js +0 -3
- package/dist/generated/codex-app-server/CollabCloseEndEvent.js +0 -3
- package/dist/generated/codex-app-server/CollabResumeBeginEvent.js +0 -3
- package/dist/generated/codex-app-server/CollabResumeEndEvent.js +0 -3
- package/dist/generated/codex-app-server/CollabWaitingBeginEvent.js +0 -3
- package/dist/generated/codex-app-server/CollabWaitingEndEvent.js +0 -3
- package/dist/generated/codex-app-server/CollaborationMode.js +0 -3
- package/dist/generated/codex-app-server/CollaborationModeMask.js +0 -3
- package/dist/generated/codex-app-server/ContentItem.js +0 -3
- package/dist/generated/codex-app-server/ContextCompactedEvent.js +0 -3
- package/dist/generated/codex-app-server/ContextCompactionItem.js +0 -3
- package/dist/generated/codex-app-server/ConversationGitInfo.js +0 -3
- package/dist/generated/codex-app-server/ConversationSummary.js +0 -3
- package/dist/generated/codex-app-server/CreditsSnapshot.js +0 -3
- package/dist/generated/codex-app-server/CustomPrompt.js +0 -3
- package/dist/generated/codex-app-server/DeprecationNoticeEvent.js +0 -3
- package/dist/generated/codex-app-server/DynamicToolCallRequest.js +0 -3
- package/dist/generated/codex-app-server/ElicitationRequestEvent.js +0 -3
- package/dist/generated/codex-app-server/ErrorEvent.js +0 -3
- package/dist/generated/codex-app-server/EventMsg.js +0 -3
- package/dist/generated/codex-app-server/ExecApprovalRequestEvent.js +0 -3
- package/dist/generated/codex-app-server/ExecCommandApprovalParams.js +0 -3
- package/dist/generated/codex-app-server/ExecCommandApprovalResponse.js +0 -3
- package/dist/generated/codex-app-server/ExecCommandBeginEvent.js +0 -3
- package/dist/generated/codex-app-server/ExecCommandEndEvent.js +0 -3
- package/dist/generated/codex-app-server/ExecCommandOutputDeltaEvent.js +0 -3
- package/dist/generated/codex-app-server/ExecCommandSource.js +0 -3
- package/dist/generated/codex-app-server/ExecCommandStatus.js +0 -3
- package/dist/generated/codex-app-server/ExecOneOffCommandParams.js +0 -3
- package/dist/generated/codex-app-server/ExecOneOffCommandResponse.js +0 -3
- package/dist/generated/codex-app-server/ExecOutputStream.js +0 -3
- package/dist/generated/codex-app-server/ExecPolicyAmendment.js +0 -3
- package/dist/generated/codex-app-server/ExitedReviewModeEvent.js +0 -3
- package/dist/generated/codex-app-server/FileChange.js +0 -3
- package/dist/generated/codex-app-server/ForcedLoginMethod.js +0 -3
- package/dist/generated/codex-app-server/ForkConversationParams.js +0 -3
- package/dist/generated/codex-app-server/ForkConversationResponse.js +0 -3
- package/dist/generated/codex-app-server/FunctionCallOutputBody.js +0 -3
- package/dist/generated/codex-app-server/FunctionCallOutputContentItem.js +0 -3
- package/dist/generated/codex-app-server/FunctionCallOutputPayload.js +0 -3
- package/dist/generated/codex-app-server/FuzzyFileSearchParams.js +0 -3
- package/dist/generated/codex-app-server/FuzzyFileSearchResponse.js +0 -3
- package/dist/generated/codex-app-server/FuzzyFileSearchResult.js +0 -3
- package/dist/generated/codex-app-server/FuzzyFileSearchSessionCompletedNotification.js +0 -3
- package/dist/generated/codex-app-server/FuzzyFileSearchSessionUpdatedNotification.js +0 -3
- package/dist/generated/codex-app-server/GetAuthStatusParams.js +0 -3
- package/dist/generated/codex-app-server/GetAuthStatusResponse.js +0 -3
- package/dist/generated/codex-app-server/GetConversationSummaryParams.js +0 -3
- package/dist/generated/codex-app-server/GetConversationSummaryResponse.js +0 -3
- package/dist/generated/codex-app-server/GetHistoryEntryResponseEvent.js +0 -3
- package/dist/generated/codex-app-server/GetUserAgentResponse.js +0 -3
- package/dist/generated/codex-app-server/GetUserSavedConfigResponse.js +0 -3
- package/dist/generated/codex-app-server/GhostCommit.js +0 -3
- package/dist/generated/codex-app-server/GitDiffToRemoteParams.js +0 -3
- package/dist/generated/codex-app-server/GitDiffToRemoteResponse.js +0 -3
- package/dist/generated/codex-app-server/GitSha.js +0 -3
- package/dist/generated/codex-app-server/HistoryEntry.js +0 -3
- package/dist/generated/codex-app-server/InitializeCapabilities.js +0 -3
- package/dist/generated/codex-app-server/InitializeParams.js +0 -3
- package/dist/generated/codex-app-server/InitializeResponse.js +0 -3
- package/dist/generated/codex-app-server/InputItem.js +0 -3
- package/dist/generated/codex-app-server/InputModality.js +0 -3
- package/dist/generated/codex-app-server/InterruptConversationParams.js +0 -3
- package/dist/generated/codex-app-server/InterruptConversationResponse.js +0 -3
- package/dist/generated/codex-app-server/ItemCompletedEvent.js +0 -3
- package/dist/generated/codex-app-server/ItemStartedEvent.js +0 -3
- package/dist/generated/codex-app-server/ListConversationsParams.js +0 -3
- package/dist/generated/codex-app-server/ListConversationsResponse.js +0 -3
- package/dist/generated/codex-app-server/ListCustomPromptsResponseEvent.js +0 -3
- package/dist/generated/codex-app-server/ListRemoteSkillsResponseEvent.js +0 -3
- package/dist/generated/codex-app-server/ListSkillsResponseEvent.js +0 -3
- package/dist/generated/codex-app-server/LocalShellAction.js +0 -3
- package/dist/generated/codex-app-server/LocalShellExecAction.js +0 -3
- package/dist/generated/codex-app-server/LocalShellStatus.js +0 -3
- package/dist/generated/codex-app-server/LoginApiKeyParams.js +0 -3
- package/dist/generated/codex-app-server/LoginApiKeyResponse.js +0 -3
- package/dist/generated/codex-app-server/LoginChatGptCompleteNotification.js +0 -3
- package/dist/generated/codex-app-server/LoginChatGptResponse.js +0 -3
- package/dist/generated/codex-app-server/LogoutChatGptResponse.js +0 -3
- package/dist/generated/codex-app-server/McpAuthStatus.js +0 -3
- package/dist/generated/codex-app-server/McpInvocation.js +0 -3
- package/dist/generated/codex-app-server/McpListToolsResponseEvent.js +0 -3
- package/dist/generated/codex-app-server/McpStartupCompleteEvent.js +0 -3
- package/dist/generated/codex-app-server/McpStartupFailure.js +0 -3
- package/dist/generated/codex-app-server/McpStartupStatus.js +0 -3
- package/dist/generated/codex-app-server/McpStartupUpdateEvent.js +0 -3
- package/dist/generated/codex-app-server/McpToolCallBeginEvent.js +0 -3
- package/dist/generated/codex-app-server/McpToolCallEndEvent.js +0 -3
- package/dist/generated/codex-app-server/MessagePhase.js +0 -3
- package/dist/generated/codex-app-server/ModeKind.js +0 -3
- package/dist/generated/codex-app-server/ModelRerouteEvent.js +0 -3
- package/dist/generated/codex-app-server/ModelRerouteReason.js +0 -3
- package/dist/generated/codex-app-server/NetworkAccess.js +0 -3
- package/dist/generated/codex-app-server/NetworkApprovalContext.js +0 -3
- package/dist/generated/codex-app-server/NetworkApprovalProtocol.js +0 -3
- package/dist/generated/codex-app-server/NewConversationParams.js +0 -3
- package/dist/generated/codex-app-server/NewConversationResponse.js +0 -3
- package/dist/generated/codex-app-server/ParsedCommand.js +0 -3
- package/dist/generated/codex-app-server/PatchApplyBeginEvent.js +0 -3
- package/dist/generated/codex-app-server/PatchApplyEndEvent.js +0 -3
- package/dist/generated/codex-app-server/PatchApplyStatus.js +0 -3
- package/dist/generated/codex-app-server/Personality.js +0 -3
- package/dist/generated/codex-app-server/PlanDeltaEvent.js +0 -3
- package/dist/generated/codex-app-server/PlanItem.js +0 -3
- package/dist/generated/codex-app-server/PlanItemArg.js +0 -3
- package/dist/generated/codex-app-server/PlanType.js +0 -3
- package/dist/generated/codex-app-server/Profile.js +0 -3
- package/dist/generated/codex-app-server/RateLimitSnapshot.js +0 -3
- package/dist/generated/codex-app-server/RateLimitWindow.js +0 -3
- package/dist/generated/codex-app-server/RawResponseItemEvent.js +0 -3
- package/dist/generated/codex-app-server/ReadOnlyAccess.js +0 -3
- package/dist/generated/codex-app-server/ReasoningContentDeltaEvent.js +0 -3
- package/dist/generated/codex-app-server/ReasoningEffort.js +0 -3
- package/dist/generated/codex-app-server/ReasoningItem.js +0 -3
- package/dist/generated/codex-app-server/ReasoningItemContent.js +0 -3
- package/dist/generated/codex-app-server/ReasoningItemReasoningSummary.js +0 -3
- package/dist/generated/codex-app-server/ReasoningRawContentDeltaEvent.js +0 -3
- package/dist/generated/codex-app-server/ReasoningSummary.js +0 -3
- package/dist/generated/codex-app-server/RemoteSkillDownloadedEvent.js +0 -3
- package/dist/generated/codex-app-server/RemoteSkillSummary.js +0 -3
- package/dist/generated/codex-app-server/RemoveConversationListenerParams.js +0 -3
- package/dist/generated/codex-app-server/RemoveConversationSubscriptionResponse.js +0 -3
- package/dist/generated/codex-app-server/RequestId.js +0 -3
- package/dist/generated/codex-app-server/RequestUserInputEvent.js +0 -3
- package/dist/generated/codex-app-server/RequestUserInputQuestion.js +0 -3
- package/dist/generated/codex-app-server/RequestUserInputQuestionOption.js +0 -3
- package/dist/generated/codex-app-server/Resource.js +0 -3
- package/dist/generated/codex-app-server/ResourceTemplate.js +0 -3
- package/dist/generated/codex-app-server/ResponseItem.js +0 -3
- package/dist/generated/codex-app-server/ResumeConversationParams.js +0 -3
- package/dist/generated/codex-app-server/ResumeConversationResponse.js +0 -3
- package/dist/generated/codex-app-server/ReviewCodeLocation.js +0 -3
- package/dist/generated/codex-app-server/ReviewDecision.js +0 -3
- package/dist/generated/codex-app-server/ReviewFinding.js +0 -3
- package/dist/generated/codex-app-server/ReviewLineRange.js +0 -3
- package/dist/generated/codex-app-server/ReviewOutputEvent.js +0 -3
- package/dist/generated/codex-app-server/ReviewRequest.js +0 -3
- package/dist/generated/codex-app-server/ReviewTarget.js +0 -3
- package/dist/generated/codex-app-server/SandboxMode.js +0 -3
- package/dist/generated/codex-app-server/SandboxPolicy.js +0 -3
- package/dist/generated/codex-app-server/SandboxSettings.js +0 -3
- package/dist/generated/codex-app-server/SendUserMessageParams.js +0 -3
- package/dist/generated/codex-app-server/SendUserMessageResponse.js +0 -3
- package/dist/generated/codex-app-server/SendUserTurnParams.js +0 -3
- package/dist/generated/codex-app-server/SendUserTurnResponse.js +0 -3
- package/dist/generated/codex-app-server/ServerNotification.js +0 -3
- package/dist/generated/codex-app-server/ServerRequest.js +0 -3
- package/dist/generated/codex-app-server/SessionConfiguredEvent.js +0 -3
- package/dist/generated/codex-app-server/SessionConfiguredNotification.js +0 -3
- package/dist/generated/codex-app-server/SessionNetworkProxyRuntime.js +0 -3
- package/dist/generated/codex-app-server/SessionSource.js +0 -3
- package/dist/generated/codex-app-server/SetDefaultModelParams.js +0 -3
- package/dist/generated/codex-app-server/SetDefaultModelResponse.js +0 -3
- package/dist/generated/codex-app-server/Settings.js +0 -3
- package/dist/generated/codex-app-server/SkillDependencies.js +0 -3
- package/dist/generated/codex-app-server/SkillErrorInfo.js +0 -3
- package/dist/generated/codex-app-server/SkillInterface.js +0 -3
- package/dist/generated/codex-app-server/SkillMetadata.js +0 -3
- package/dist/generated/codex-app-server/SkillScope.js +0 -3
- package/dist/generated/codex-app-server/SkillToolDependency.js +0 -3
- package/dist/generated/codex-app-server/SkillsListEntry.js +0 -3
- package/dist/generated/codex-app-server/StepStatus.js +0 -3
- package/dist/generated/codex-app-server/StreamErrorEvent.js +0 -3
- package/dist/generated/codex-app-server/SubAgentSource.js +0 -3
- package/dist/generated/codex-app-server/TerminalInteractionEvent.js +0 -3
- package/dist/generated/codex-app-server/TextElement.js +0 -3
- package/dist/generated/codex-app-server/ThreadId.js +0 -3
- package/dist/generated/codex-app-server/ThreadNameUpdatedEvent.js +0 -3
- package/dist/generated/codex-app-server/ThreadRolledBackEvent.js +0 -3
- package/dist/generated/codex-app-server/TokenCountEvent.js +0 -3
- package/dist/generated/codex-app-server/TokenUsage.js +0 -3
- package/dist/generated/codex-app-server/TokenUsageInfo.js +0 -3
- package/dist/generated/codex-app-server/Tool.js +0 -3
- package/dist/generated/codex-app-server/Tools.js +0 -3
- package/dist/generated/codex-app-server/TurnAbortReason.js +0 -3
- package/dist/generated/codex-app-server/TurnAbortedEvent.js +0 -3
- package/dist/generated/codex-app-server/TurnCompleteEvent.js +0 -3
- package/dist/generated/codex-app-server/TurnDiffEvent.js +0 -3
- package/dist/generated/codex-app-server/TurnItem.js +0 -3
- package/dist/generated/codex-app-server/TurnStartedEvent.js +0 -3
- package/dist/generated/codex-app-server/UndoCompletedEvent.js +0 -3
- package/dist/generated/codex-app-server/UndoStartedEvent.js +0 -3
- package/dist/generated/codex-app-server/UpdatePlanArgs.js +0 -3
- package/dist/generated/codex-app-server/UserInfoResponse.js +0 -3
- package/dist/generated/codex-app-server/UserInput.js +0 -3
- package/dist/generated/codex-app-server/UserMessageEvent.js +0 -3
- package/dist/generated/codex-app-server/UserMessageItem.js +0 -3
- package/dist/generated/codex-app-server/UserSavedConfig.js +0 -3
- package/dist/generated/codex-app-server/Verbosity.js +0 -3
- package/dist/generated/codex-app-server/ViewImageToolCallEvent.js +0 -3
- package/dist/generated/codex-app-server/WarningEvent.js +0 -3
- package/dist/generated/codex-app-server/WebSearchAction.js +0 -3
- package/dist/generated/codex-app-server/WebSearchBeginEvent.js +0 -3
- package/dist/generated/codex-app-server/WebSearchEndEvent.js +0 -3
- package/dist/generated/codex-app-server/WebSearchItem.js +0 -3
- package/dist/generated/codex-app-server/WebSearchMode.js +0 -3
- package/dist/generated/codex-app-server/index.js +0 -38
- package/dist/generated/codex-app-server/serde_json/JsonValue.js +0 -3
- package/dist/generated/codex-app-server/v2/Account.js +0 -3
- package/dist/generated/codex-app-server/v2/AccountLoginCompletedNotification.js +0 -3
- package/dist/generated/codex-app-server/v2/AccountRateLimitsUpdatedNotification.js +0 -3
- package/dist/generated/codex-app-server/v2/AccountUpdatedNotification.js +0 -3
- package/dist/generated/codex-app-server/v2/AgentMessageDeltaNotification.js +0 -3
- package/dist/generated/codex-app-server/v2/AnalyticsConfig.js +0 -3
- package/dist/generated/codex-app-server/v2/AppBranding.js +0 -3
- package/dist/generated/codex-app-server/v2/AppDisabledReason.js +0 -3
- package/dist/generated/codex-app-server/v2/AppInfo.js +0 -3
- package/dist/generated/codex-app-server/v2/AppListUpdatedNotification.js +0 -3
- package/dist/generated/codex-app-server/v2/AppMetadata.js +0 -3
- package/dist/generated/codex-app-server/v2/AppReview.js +0 -3
- package/dist/generated/codex-app-server/v2/AppScreenshot.js +0 -3
- package/dist/generated/codex-app-server/v2/AppsConfig.js +0 -3
- package/dist/generated/codex-app-server/v2/AppsListParams.js +0 -3
- package/dist/generated/codex-app-server/v2/AppsListResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/AskForApproval.js +0 -3
- package/dist/generated/codex-app-server/v2/ByteRange.js +0 -3
- package/dist/generated/codex-app-server/v2/CancelLoginAccountParams.js +0 -3
- package/dist/generated/codex-app-server/v2/CancelLoginAccountResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/CancelLoginAccountStatus.js +0 -3
- package/dist/generated/codex-app-server/v2/ChatgptAuthTokensRefreshParams.js +0 -3
- package/dist/generated/codex-app-server/v2/ChatgptAuthTokensRefreshReason.js +0 -3
- package/dist/generated/codex-app-server/v2/ChatgptAuthTokensRefreshResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/CodexErrorInfo.js +0 -3
- package/dist/generated/codex-app-server/v2/CollabAgentState.js +0 -3
- package/dist/generated/codex-app-server/v2/CollabAgentStatus.js +0 -3
- package/dist/generated/codex-app-server/v2/CollabAgentTool.js +0 -3
- package/dist/generated/codex-app-server/v2/CollabAgentToolCallStatus.js +0 -3
- package/dist/generated/codex-app-server/v2/CommandAction.js +0 -3
- package/dist/generated/codex-app-server/v2/CommandExecParams.js +0 -3
- package/dist/generated/codex-app-server/v2/CommandExecResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/CommandExecutionApprovalDecision.js +0 -3
- package/dist/generated/codex-app-server/v2/CommandExecutionOutputDeltaNotification.js +0 -3
- package/dist/generated/codex-app-server/v2/CommandExecutionRequestApprovalParams.js +0 -3
- package/dist/generated/codex-app-server/v2/CommandExecutionRequestApprovalResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/CommandExecutionStatus.js +0 -3
- package/dist/generated/codex-app-server/v2/Config.js +0 -3
- package/dist/generated/codex-app-server/v2/ConfigBatchWriteParams.js +0 -3
- package/dist/generated/codex-app-server/v2/ConfigEdit.js +0 -3
- package/dist/generated/codex-app-server/v2/ConfigLayer.js +0 -3
- package/dist/generated/codex-app-server/v2/ConfigLayerMetadata.js +0 -3
- package/dist/generated/codex-app-server/v2/ConfigLayerSource.js +0 -3
- package/dist/generated/codex-app-server/v2/ConfigReadParams.js +0 -3
- package/dist/generated/codex-app-server/v2/ConfigReadResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/ConfigRequirements.js +0 -3
- package/dist/generated/codex-app-server/v2/ConfigRequirementsReadResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/ConfigValueWriteParams.js +0 -3
- package/dist/generated/codex-app-server/v2/ConfigWarningNotification.js +0 -3
- package/dist/generated/codex-app-server/v2/ConfigWriteResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/ContextCompactedNotification.js +0 -3
- package/dist/generated/codex-app-server/v2/CreditsSnapshot.js +0 -3
- package/dist/generated/codex-app-server/v2/DeprecationNoticeNotification.js +0 -3
- package/dist/generated/codex-app-server/v2/DynamicToolCallOutputContentItem.js +0 -3
- package/dist/generated/codex-app-server/v2/DynamicToolCallParams.js +0 -3
- package/dist/generated/codex-app-server/v2/DynamicToolCallResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/DynamicToolSpec.js +0 -3
- package/dist/generated/codex-app-server/v2/ErrorNotification.js +0 -3
- package/dist/generated/codex-app-server/v2/ExecPolicyAmendment.js +0 -3
- package/dist/generated/codex-app-server/v2/ExperimentalFeature.js +0 -3
- package/dist/generated/codex-app-server/v2/ExperimentalFeatureListParams.js +0 -3
- package/dist/generated/codex-app-server/v2/ExperimentalFeatureListResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/ExperimentalFeatureStage.js +0 -3
- package/dist/generated/codex-app-server/v2/FeedbackUploadParams.js +0 -3
- package/dist/generated/codex-app-server/v2/FeedbackUploadResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/FileChangeApprovalDecision.js +0 -3
- package/dist/generated/codex-app-server/v2/FileChangeOutputDeltaNotification.js +0 -3
- package/dist/generated/codex-app-server/v2/FileChangeRequestApprovalParams.js +0 -3
- package/dist/generated/codex-app-server/v2/FileChangeRequestApprovalResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/FileUpdateChange.js +0 -3
- package/dist/generated/codex-app-server/v2/GetAccountParams.js +0 -3
- package/dist/generated/codex-app-server/v2/GetAccountRateLimitsResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/GetAccountResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/GitInfo.js +0 -3
- package/dist/generated/codex-app-server/v2/HazelnutScope.js +0 -3
- package/dist/generated/codex-app-server/v2/ItemCompletedNotification.js +0 -3
- package/dist/generated/codex-app-server/v2/ItemStartedNotification.js +0 -3
- package/dist/generated/codex-app-server/v2/ListMcpServerStatusParams.js +0 -3
- package/dist/generated/codex-app-server/v2/ListMcpServerStatusResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/LoginAccountParams.js +0 -3
- package/dist/generated/codex-app-server/v2/LoginAccountResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/LogoutAccountResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/McpAuthStatus.js +0 -3
- package/dist/generated/codex-app-server/v2/McpServerOauthLoginCompletedNotification.js +0 -3
- package/dist/generated/codex-app-server/v2/McpServerOauthLoginParams.js +0 -3
- package/dist/generated/codex-app-server/v2/McpServerOauthLoginResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/McpServerRefreshResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/McpServerStatus.js +0 -3
- package/dist/generated/codex-app-server/v2/McpToolCallError.js +0 -3
- package/dist/generated/codex-app-server/v2/McpToolCallProgressNotification.js +0 -3
- package/dist/generated/codex-app-server/v2/McpToolCallResult.js +0 -3
- package/dist/generated/codex-app-server/v2/McpToolCallStatus.js +0 -3
- package/dist/generated/codex-app-server/v2/MergeStrategy.js +0 -3
- package/dist/generated/codex-app-server/v2/Model.js +0 -3
- package/dist/generated/codex-app-server/v2/ModelListParams.js +0 -3
- package/dist/generated/codex-app-server/v2/ModelListResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/ModelRerouteReason.js +0 -3
- package/dist/generated/codex-app-server/v2/ModelReroutedNotification.js +0 -3
- package/dist/generated/codex-app-server/v2/NetworkAccess.js +0 -3
- package/dist/generated/codex-app-server/v2/NetworkRequirements.js +0 -3
- package/dist/generated/codex-app-server/v2/OverriddenMetadata.js +0 -3
- package/dist/generated/codex-app-server/v2/PatchApplyStatus.js +0 -3
- package/dist/generated/codex-app-server/v2/PatchChangeKind.js +0 -3
- package/dist/generated/codex-app-server/v2/PlanDeltaNotification.js +0 -3
- package/dist/generated/codex-app-server/v2/ProductSurface.js +0 -3
- package/dist/generated/codex-app-server/v2/ProfileV2.js +0 -3
- package/dist/generated/codex-app-server/v2/RateLimitSnapshot.js +0 -3
- package/dist/generated/codex-app-server/v2/RateLimitWindow.js +0 -3
- package/dist/generated/codex-app-server/v2/RawResponseItemCompletedNotification.js +0 -3
- package/dist/generated/codex-app-server/v2/ReadOnlyAccess.js +0 -3
- package/dist/generated/codex-app-server/v2/ReasoningEffortOption.js +0 -3
- package/dist/generated/codex-app-server/v2/ReasoningSummaryPartAddedNotification.js +0 -3
- package/dist/generated/codex-app-server/v2/ReasoningSummaryTextDeltaNotification.js +0 -3
- package/dist/generated/codex-app-server/v2/ReasoningTextDeltaNotification.js +0 -3
- package/dist/generated/codex-app-server/v2/RemoteSkillSummary.js +0 -3
- package/dist/generated/codex-app-server/v2/ResidencyRequirement.js +0 -3
- package/dist/generated/codex-app-server/v2/ReviewDelivery.js +0 -3
- package/dist/generated/codex-app-server/v2/ReviewStartParams.js +0 -3
- package/dist/generated/codex-app-server/v2/ReviewStartResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/ReviewTarget.js +0 -3
- package/dist/generated/codex-app-server/v2/SandboxMode.js +0 -3
- package/dist/generated/codex-app-server/v2/SandboxPolicy.js +0 -3
- package/dist/generated/codex-app-server/v2/SandboxWorkspaceWrite.js +0 -3
- package/dist/generated/codex-app-server/v2/SessionSource.js +0 -3
- package/dist/generated/codex-app-server/v2/SkillDependencies.js +0 -3
- package/dist/generated/codex-app-server/v2/SkillErrorInfo.js +0 -3
- package/dist/generated/codex-app-server/v2/SkillInterface.js +0 -3
- package/dist/generated/codex-app-server/v2/SkillMetadata.js +0 -3
- package/dist/generated/codex-app-server/v2/SkillScope.js +0 -3
- package/dist/generated/codex-app-server/v2/SkillToolDependency.js +0 -3
- package/dist/generated/codex-app-server/v2/SkillsConfigWriteParams.js +0 -3
- package/dist/generated/codex-app-server/v2/SkillsConfigWriteResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/SkillsListEntry.js +0 -3
- package/dist/generated/codex-app-server/v2/SkillsListExtraRootsForCwd.js +0 -3
- package/dist/generated/codex-app-server/v2/SkillsListParams.js +0 -3
- package/dist/generated/codex-app-server/v2/SkillsListResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/SkillsRemoteReadParams.js +0 -3
- package/dist/generated/codex-app-server/v2/SkillsRemoteReadResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/SkillsRemoteWriteParams.js +0 -3
- package/dist/generated/codex-app-server/v2/SkillsRemoteWriteResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/TerminalInteractionNotification.js +0 -3
- package/dist/generated/codex-app-server/v2/TextElement.js +0 -3
- package/dist/generated/codex-app-server/v2/TextPosition.js +0 -3
- package/dist/generated/codex-app-server/v2/TextRange.js +0 -3
- package/dist/generated/codex-app-server/v2/Thread.js +0 -3
- package/dist/generated/codex-app-server/v2/ThreadArchiveParams.js +0 -3
- package/dist/generated/codex-app-server/v2/ThreadArchiveResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/ThreadArchivedNotification.js +0 -3
- package/dist/generated/codex-app-server/v2/ThreadCompactStartParams.js +0 -3
- package/dist/generated/codex-app-server/v2/ThreadCompactStartResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/ThreadForkParams.js +0 -3
- package/dist/generated/codex-app-server/v2/ThreadForkResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/ThreadItem.js +0 -3
- package/dist/generated/codex-app-server/v2/ThreadListParams.js +0 -3
- package/dist/generated/codex-app-server/v2/ThreadListResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/ThreadLoadedListParams.js +0 -3
- package/dist/generated/codex-app-server/v2/ThreadLoadedListResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/ThreadNameUpdatedNotification.js +0 -3
- package/dist/generated/codex-app-server/v2/ThreadReadParams.js +0 -3
- package/dist/generated/codex-app-server/v2/ThreadReadResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/ThreadResumeParams.js +0 -3
- package/dist/generated/codex-app-server/v2/ThreadResumeResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/ThreadRollbackParams.js +0 -3
- package/dist/generated/codex-app-server/v2/ThreadRollbackResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/ThreadSetNameParams.js +0 -3
- package/dist/generated/codex-app-server/v2/ThreadSetNameResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/ThreadSortKey.js +0 -3
- package/dist/generated/codex-app-server/v2/ThreadSourceKind.js +0 -3
- package/dist/generated/codex-app-server/v2/ThreadStartParams.js +0 -3
- package/dist/generated/codex-app-server/v2/ThreadStartResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/ThreadStartedNotification.js +0 -3
- package/dist/generated/codex-app-server/v2/ThreadTokenUsage.js +0 -3
- package/dist/generated/codex-app-server/v2/ThreadTokenUsageUpdatedNotification.js +0 -3
- package/dist/generated/codex-app-server/v2/ThreadUnarchiveParams.js +0 -3
- package/dist/generated/codex-app-server/v2/ThreadUnarchiveResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/ThreadUnarchivedNotification.js +0 -3
- package/dist/generated/codex-app-server/v2/TokenUsageBreakdown.js +0 -3
- package/dist/generated/codex-app-server/v2/ToolRequestUserInputAnswer.js +0 -3
- package/dist/generated/codex-app-server/v2/ToolRequestUserInputOption.js +0 -3
- package/dist/generated/codex-app-server/v2/ToolRequestUserInputParams.js +0 -3
- package/dist/generated/codex-app-server/v2/ToolRequestUserInputQuestion.js +0 -3
- package/dist/generated/codex-app-server/v2/ToolRequestUserInputResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/ToolsV2.js +0 -3
- package/dist/generated/codex-app-server/v2/Turn.js +0 -3
- package/dist/generated/codex-app-server/v2/TurnCompletedNotification.js +0 -3
- package/dist/generated/codex-app-server/v2/TurnDiffUpdatedNotification.js +0 -3
- package/dist/generated/codex-app-server/v2/TurnError.js +0 -3
- package/dist/generated/codex-app-server/v2/TurnInterruptParams.js +0 -3
- package/dist/generated/codex-app-server/v2/TurnInterruptResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/TurnPlanStep.js +0 -3
- package/dist/generated/codex-app-server/v2/TurnPlanStepStatus.js +0 -3
- package/dist/generated/codex-app-server/v2/TurnPlanUpdatedNotification.js +0 -3
- package/dist/generated/codex-app-server/v2/TurnStartParams.js +0 -3
- package/dist/generated/codex-app-server/v2/TurnStartResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/TurnStartedNotification.js +0 -3
- package/dist/generated/codex-app-server/v2/TurnStatus.js +0 -3
- package/dist/generated/codex-app-server/v2/TurnSteerParams.js +0 -3
- package/dist/generated/codex-app-server/v2/TurnSteerResponse.js +0 -3
- package/dist/generated/codex-app-server/v2/UserInput.js +0 -3
- package/dist/generated/codex-app-server/v2/WebSearchAction.js +0 -3
- package/dist/generated/codex-app-server/v2/WindowsWorldWritableWarningNotification.js +0 -3
- package/dist/generated/codex-app-server/v2/WriteStatus.js +0 -3
- package/dist/generated/codex-app-server/v2/index.js +0 -3
- package/dist/service/app_server.js +0 -441
- package/dist/service/buffered_client_message_sender.js +0 -89
- package/dist/service/companyhelm_api_client.js +0 -337
- package/dist/service/docker/app_server_container.js +0 -319
- package/dist/service/docker/dind.js +0 -114
- package/dist/service/docker/runtime_app_server_exec.js +0 -97
- package/dist/service/host.js +0 -15
- package/dist/service/runtime_bashrc.js +0 -57
- package/dist/service/runtime_shell.js +0 -23
- package/dist/service/sdk/refresh_models.js +0 -91
- package/dist/service/thread_lifecycle.js +0 -681
- package/dist/service/thread_runtime.js +0 -15
- package/dist/service/thread_turn_state.js +0 -46
- package/dist/service/thread_user_message_request_store.js +0 -136
- package/dist/service/workspace_agents.js +0 -82
- package/dist/state/daemon_state.js +0 -83
- package/dist/state/db.js +0 -63
- package/dist/state/schema.js +0 -59
- package/dist/templates/app_server_bootstrap.sh.j2 +0 -52
- package/dist/templates/runtime_agents.md.j2 +0 -50
- package/dist/templates/runtime_bashrc.j2 +0 -19
- package/dist/utils/async_queue.js +0 -102
- package/dist/utils/daemon.js +0 -15
- package/dist/utils/logger.js +0 -96
- package/dist/utils/path.js +0 -10
- package/dist/utils/process.js +0 -83
- package/dist/utils/terminal.js +0 -34
- package/drizzle/0000_nice_stepford_cuckoos.sql +0 -25
- package/drizzle/0001_third_vermin.sql +0 -22
- package/drizzle/0002_kind_sue_storm.sql +0 -1
- package/drizzle/0003_dizzy_micromax.sql +0 -35
- package/drizzle/0004_sloppy_alex_wilder.sql +0 -23
- package/drizzle/0005_open_toro.sql +0 -23
- package/drizzle/0006_fixed_jack_flag.sql +0 -23
- package/drizzle/0007_mute_lord_tyger.sql +0 -1
- package/drizzle/0008_melted_flatman.sql +0 -8
- package/drizzle/0009_powerful_hellcat.sql +0 -1
- package/drizzle/0010_wealthy_dorian_gray.sql +0 -24
- package/drizzle/0011_actual_lucky.sql +0 -7
- package/drizzle/meta/0000_snapshot.json +0 -174
- package/drizzle/meta/0001_snapshot.json +0 -212
- package/drizzle/meta/0002_snapshot.json +0 -219
- package/drizzle/meta/0003_snapshot.json +0 -240
- package/drizzle/meta/0004_snapshot.json +0 -240
- package/drizzle/meta/0005_snapshot.json +0 -240
- package/drizzle/meta/0006_snapshot.json +0 -240
- package/drizzle/meta/0007_snapshot.json +0 -247
- package/drizzle/meta/0008_snapshot.json +0 -306
- package/drizzle/meta/0009_snapshot.json +0 -313
- package/drizzle/meta/0010_snapshot.json +0 -261
- package/drizzle/meta/_journal.json +0 -90
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import * as clack from "@clack/prompts";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { spawn } from "node:child_process";
|
|
4
|
+
import { createInterface } from "node:readline";
|
|
5
|
+
import { Writable } from "node:stream";
|
|
6
|
+
import { unwrapPromptResult, requireInteractiveTerminal, InteractiveCommandCancelledError } from "./interactive.js";
|
|
7
|
+
import { GithubAppConfigStore } from "../core/config/GithubAppConfigStore.js";
|
|
8
|
+
import { normalizeGithubAppConfig } from "../core/config/GithubAppConfig.js";
|
|
9
|
+
const GITHUB_NEW_APP_URL = "https://github.com/settings/apps/new";
|
|
10
|
+
function createHiddenTerminalOutput() {
|
|
11
|
+
return new Writable({
|
|
12
|
+
write(_chunk, _encoding, callback) {
|
|
13
|
+
callback();
|
|
14
|
+
},
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
function getBrowserOpenCommand(url) {
|
|
18
|
+
if (process.platform === "darwin") {
|
|
19
|
+
return { command: "open", args: [url] };
|
|
20
|
+
}
|
|
21
|
+
if (process.platform === "win32") {
|
|
22
|
+
return { command: "cmd", args: ["/c", "start", "", url] };
|
|
23
|
+
}
|
|
24
|
+
return { command: "xdg-open", args: [url] };
|
|
25
|
+
}
|
|
26
|
+
async function openUrlInBrowser(url) {
|
|
27
|
+
const { command, args } = getBrowserOpenCommand(url);
|
|
28
|
+
await new Promise((resolve, reject) => {
|
|
29
|
+
const child = spawn(command, args, {
|
|
30
|
+
detached: true,
|
|
31
|
+
stdio: "ignore",
|
|
32
|
+
});
|
|
33
|
+
child.once("error", reject);
|
|
34
|
+
child.once("spawn", () => {
|
|
35
|
+
child.unref();
|
|
36
|
+
resolve();
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
function writeGithubAppCreationGuide(output) {
|
|
41
|
+
const divider = chalk.dim("=".repeat(68));
|
|
42
|
+
const label = (text) => chalk.bold(chalk.cyan(text));
|
|
43
|
+
const value = (text) => chalk.white(text);
|
|
44
|
+
output.write([
|
|
45
|
+
divider,
|
|
46
|
+
chalk.bold("Create a GitHub App before continuing"),
|
|
47
|
+
chalk.dim("CompanyHelm needs a local GitHub App before startup can continue."),
|
|
48
|
+
chalk.dim("Agents use that app to access and work on your repositories from isolated container workspaces."),
|
|
49
|
+
chalk.dim("That lets each agent clone repos and operate safely without reusing your host checkout."),
|
|
50
|
+
"",
|
|
51
|
+
`${label("New app page")} ${chalk.underline(chalk.green(GITHUB_NEW_APP_URL))}`,
|
|
52
|
+
"",
|
|
53
|
+
chalk.bold("Required form values"),
|
|
54
|
+
`${label("GitHub App name:")} ${value("Any name you like, e.g. companyhelm <your deployment name>")}`,
|
|
55
|
+
`${label("Public link:")} ${value("Paste your public link here")}`,
|
|
56
|
+
`${label("Setup URL:")} ${value("http://localhost:4173/github/install")}`,
|
|
57
|
+
`${label("Redirect on update:")} ${value("Checked")}`,
|
|
58
|
+
`${label("Webhook:")} ${value("Leave it inactive and uncheck the webhook option")}`,
|
|
59
|
+
`${label("Permissions:")} ${value("Grant at least Contents so CompanyHelm can download repositories; add any additional permissions your agents need")}`,
|
|
60
|
+
`${label("Where can this GitHub App be installed?")} ${value("Select Any account")}`,
|
|
61
|
+
"",
|
|
62
|
+
chalk.bold("Bring back after creation"),
|
|
63
|
+
value("App URL, Client ID, and private key PEM"),
|
|
64
|
+
"",
|
|
65
|
+
divider,
|
|
66
|
+
"",
|
|
67
|
+
].join("\n"));
|
|
68
|
+
}
|
|
69
|
+
async function promptTextValue(message, input, output, validate) {
|
|
70
|
+
const value = await clack.text({
|
|
71
|
+
message,
|
|
72
|
+
input,
|
|
73
|
+
output,
|
|
74
|
+
validate,
|
|
75
|
+
});
|
|
76
|
+
return String(unwrapPromptResult(value, "GitHub App setup cancelled.", output)).trim();
|
|
77
|
+
}
|
|
78
|
+
export async function readPemFromTerminal(input = process.stdin, output = process.stdout) {
|
|
79
|
+
requireInteractiveTerminal(input, output, "setup-github-app requires an interactive terminal.");
|
|
80
|
+
output.write([
|
|
81
|
+
"Generate a private key.",
|
|
82
|
+
"Once downloaded copy the contents (e.g. cat ~/Downloads/{your-app-name}{date}.pem | pbcopy) and paste it here.",
|
|
83
|
+
"",
|
|
84
|
+
].join("\n"));
|
|
85
|
+
const readline = createInterface({
|
|
86
|
+
input,
|
|
87
|
+
output: createHiddenTerminalOutput(),
|
|
88
|
+
terminal: false,
|
|
89
|
+
});
|
|
90
|
+
return await new Promise((resolve, reject) => {
|
|
91
|
+
const lines = [];
|
|
92
|
+
let settled = false;
|
|
93
|
+
const finish = (callback) => {
|
|
94
|
+
if (settled) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
settled = true;
|
|
98
|
+
readline.close();
|
|
99
|
+
callback();
|
|
100
|
+
};
|
|
101
|
+
readline.on("line", (line) => {
|
|
102
|
+
lines.push(line);
|
|
103
|
+
if (/^-----END [A-Z0-9 ]+-----$/.test(line.trim())) {
|
|
104
|
+
finish(() => {
|
|
105
|
+
try {
|
|
106
|
+
const normalized = normalizeGithubAppConfig({
|
|
107
|
+
appUrl: "https://github.com/apps/placeholder",
|
|
108
|
+
appClientId: "placeholder",
|
|
109
|
+
appPrivateKeyPem: `${lines.join("\n")}\n`,
|
|
110
|
+
});
|
|
111
|
+
resolve(normalized.appPrivateKeyPem);
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
reject(error);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
readline.on("close", () => {
|
|
120
|
+
if (settled) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
settled = true;
|
|
124
|
+
reject(new Error("GitHub App PEM input ended before a PEM end marker was received."));
|
|
125
|
+
});
|
|
126
|
+
readline.on("SIGINT", () => {
|
|
127
|
+
finish(() => {
|
|
128
|
+
reject(new InteractiveCommandCancelledError("GitHub App setup cancelled."));
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
readline.on("error", (error) => {
|
|
132
|
+
finish(() => {
|
|
133
|
+
reject(error);
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
export async function promptGithubAppConfig(input = process.stdin, output = process.stdout, openBrowser = openUrlInBrowser) {
|
|
139
|
+
requireInteractiveTerminal(input, output, "setup-github-app requires an interactive terminal.");
|
|
140
|
+
writeGithubAppCreationGuide(output);
|
|
141
|
+
const shouldOpenBrowser = unwrapPromptResult(await clack.confirm({
|
|
142
|
+
message: `Open ${GITHUB_NEW_APP_URL} in your browser now?`,
|
|
143
|
+
active: "Yes",
|
|
144
|
+
inactive: "No",
|
|
145
|
+
initialValue: true,
|
|
146
|
+
input,
|
|
147
|
+
output,
|
|
148
|
+
}), "GitHub App setup cancelled.", output);
|
|
149
|
+
if (shouldOpenBrowser) {
|
|
150
|
+
try {
|
|
151
|
+
await openBrowser(GITHUB_NEW_APP_URL);
|
|
152
|
+
output.write(`Opened ${GITHUB_NEW_APP_URL} in your browser.\n\n`);
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
output.write([
|
|
156
|
+
"Could not open a browser automatically.",
|
|
157
|
+
`Open this URL manually: ${GITHUB_NEW_APP_URL}`,
|
|
158
|
+
"",
|
|
159
|
+
].join("\n"));
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
const appUrl = await promptTextValue("GitHub App URL", input, output, (value) => {
|
|
163
|
+
try {
|
|
164
|
+
new URL(String(value || "").trim());
|
|
165
|
+
return undefined;
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
return "Enter a valid GitHub App URL.";
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
const appClientId = await promptTextValue("GitHub App Client ID (not the App ID)", input, output, (value) => (String(value || "").trim() ? undefined : "Client ID is required."));
|
|
172
|
+
const appPrivateKeyPem = await readPemFromTerminal(input, output);
|
|
173
|
+
return normalizeGithubAppConfig({
|
|
174
|
+
appUrl,
|
|
175
|
+
appClientId,
|
|
176
|
+
appPrivateKeyPem,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
export async function ensureGithubAppConfig(store = new GithubAppConfigStore(), input = process.stdin, output = process.stdout) {
|
|
180
|
+
const existingConfig = store.load();
|
|
181
|
+
if (existingConfig) {
|
|
182
|
+
return existingConfig;
|
|
183
|
+
}
|
|
184
|
+
requireInteractiveTerminal(input, output, `GitHub App config is not set up. Run \`companyhelm setup-github-app\` or rerun \`companyhelm up\` in a TTY.`);
|
|
185
|
+
clack.intro("CompanyHelm GitHub App setup", { output });
|
|
186
|
+
clack.note([
|
|
187
|
+
"No machine GitHub App config was found.",
|
|
188
|
+
"CompanyHelm will collect it now and then continue startup.",
|
|
189
|
+
].join("\n"), "Setup required", { output });
|
|
190
|
+
const config = await promptGithubAppConfig(input, output);
|
|
191
|
+
const spinner = clack.spinner({ output });
|
|
192
|
+
spinner.start("Saving machine GitHub App config");
|
|
193
|
+
const configPath = store.save(config);
|
|
194
|
+
spinner.stop(`Saved GitHub App config to ${configPath}`);
|
|
195
|
+
clack.outro("GitHub App setup complete. Continuing startup.", { output });
|
|
196
|
+
return config;
|
|
197
|
+
}
|
|
198
|
+
export function registerSetupGithubAppCommand(program, store = new GithubAppConfigStore()) {
|
|
199
|
+
program
|
|
200
|
+
.command("setup-github-app")
|
|
201
|
+
.description("Save machine-wide GitHub App config for local deploys.")
|
|
202
|
+
.action(async () => {
|
|
203
|
+
clack.intro("CompanyHelm GitHub App setup");
|
|
204
|
+
const config = await promptGithubAppConfig();
|
|
205
|
+
const spinner = clack.spinner();
|
|
206
|
+
spinner.start("Saving machine GitHub App config");
|
|
207
|
+
const configPath = store.save(config);
|
|
208
|
+
spinner.stop(`Saved GitHub App config to ${configPath}`);
|
|
209
|
+
clack.outro(`Saved GitHub App config to ${configPath}.`);
|
|
210
|
+
});
|
|
211
|
+
}
|
package/dist/commands/status.js
CHANGED
|
@@ -1,32 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
const daemon_state_js_1 = require("../state/daemon_state.js");
|
|
7
|
-
const daemon_js_1 = require("../utils/daemon.js");
|
|
8
|
-
const process_js_1 = require("../utils/process.js");
|
|
9
|
-
function registerStatusCommand(program) {
|
|
10
|
-
program
|
|
11
|
-
.command("status")
|
|
12
|
-
.description("Show whether the local CompanyHelm daemon is running.")
|
|
13
|
-
.option("--state-db-path <path>", "State database path override (defaults to state.db under the active config directory).")
|
|
14
|
-
.action(async (options) => {
|
|
15
|
-
const cfg = config_js_1.config.parse({
|
|
16
|
-
state_db_path: options.stateDbPath,
|
|
17
|
-
});
|
|
18
|
-
const state = await (0, daemon_state_js_1.readCurrentDaemonState)(cfg.state_db_path);
|
|
19
|
-
const running = state?.pid != null && (0, process_js_1.isProcessRunning)(state.pid);
|
|
20
|
-
const logPath = state?.logPath ?? (0, daemon_js_1.resolveDaemonLogPath)(cfg.state_db_path);
|
|
21
|
-
const logDirectory = state?.logPath ? (0, node_path_1.dirname)(state.logPath) : (0, daemon_js_1.resolveDaemonLogDirectory)(cfg.state_db_path);
|
|
22
|
-
console.log(`Daemon: ${running ? "running" : "not running"}`);
|
|
23
|
-
if (state?.pid != null) {
|
|
24
|
-
console.log(`PID: ${running ? state.pid : `${state.pid} (stale)`}`);
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
console.log("PID: none");
|
|
28
|
-
}
|
|
29
|
-
console.log(`Log directory: ${logDirectory}`);
|
|
30
|
-
console.log(`Log file: ${logPath}`);
|
|
1
|
+
import { TerminalRenderer } from "../core/ui/TerminalRenderer.js";
|
|
2
|
+
export function registerStatusCommand(program, dependencies) {
|
|
3
|
+
program.command("status").description("Show deployment status.").action(async () => {
|
|
4
|
+
const renderer = new TerminalRenderer(process.stdout.isTTY);
|
|
5
|
+
process.stdout.write(`${renderer.renderStatus(await dependencies.status())}\n`);
|
|
31
6
|
});
|
|
32
7
|
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
const LOG_LEVELS = new Set(["debug", "info", "warn", "error"]);
|
|
2
|
+
export function registerUpCommand(program, dependencies) {
|
|
3
|
+
program
|
|
4
|
+
.command("up")
|
|
5
|
+
.description("Start or reconcile the local deployment.")
|
|
6
|
+
.option("--log-level <level>", "Set log level for api, frontend, and runner.", "info")
|
|
7
|
+
.action(async (options) => {
|
|
8
|
+
const logLevel = String(options.logLevel || "").trim().toLowerCase();
|
|
9
|
+
if (!LOG_LEVELS.has(logLevel)) {
|
|
10
|
+
throw new Error(`Unsupported log level "${options.logLevel}". Expected one of: debug, info, warn, error.`);
|
|
11
|
+
}
|
|
12
|
+
await dependencies.up({ logLevel: logLevel });
|
|
13
|
+
});
|
|
14
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { LogLevel } from "../../commands/dependencies.js";
|
|
2
|
+
import type { RuntimeState } from "../runtime/RuntimeState.js";
|
|
3
|
+
export declare class DeploymentBootstrapper {
|
|
4
|
+
private readonly renderer;
|
|
5
|
+
writeSeedSql(root: string, state: RuntimeState, passwordHash: string, passwordSalt: string): string;
|
|
6
|
+
writeApiConfig(root: string, state: RuntimeState, logLevel?: LogLevel): string;
|
|
7
|
+
writeFrontendConfig(root: string, state: RuntimeState): string;
|
|
8
|
+
private indentBlock;
|
|
9
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import { RuntimePaths } from "../runtime/RuntimePaths.js";
|
|
3
|
+
import { SeedSqlRenderer } from "./SeedSqlRenderer.js";
|
|
4
|
+
export class DeploymentBootstrapper {
|
|
5
|
+
renderer = new SeedSqlRenderer();
|
|
6
|
+
writeSeedSql(root, state, passwordHash, passwordSalt) {
|
|
7
|
+
const runtimePaths = new RuntimePaths(root);
|
|
8
|
+
const outputPath = runtimePaths.seedFilePath();
|
|
9
|
+
const sql = this.renderer.render({
|
|
10
|
+
companyId: state.company.id,
|
|
11
|
+
companyName: state.company.name,
|
|
12
|
+
username: state.auth.username,
|
|
13
|
+
passwordHash,
|
|
14
|
+
passwordSalt,
|
|
15
|
+
runnerName: state.runner.name,
|
|
16
|
+
runnerSecret: state.runner.secret
|
|
17
|
+
});
|
|
18
|
+
fs.writeFileSync(outputPath, sql, "utf8");
|
|
19
|
+
return outputPath;
|
|
20
|
+
}
|
|
21
|
+
writeApiConfig(root, state, logLevel = "info") {
|
|
22
|
+
const runtimePaths = new RuntimePaths(root);
|
|
23
|
+
const outputPath = runtimePaths.apiConfigPath();
|
|
24
|
+
const yaml = [
|
|
25
|
+
"app:",
|
|
26
|
+
' host: "0.0.0.0"',
|
|
27
|
+
' port: 4000',
|
|
28
|
+
' graphqlEndpoint: "/graphql"',
|
|
29
|
+
" graphiql: true",
|
|
30
|
+
" grpc:",
|
|
31
|
+
' host: "0.0.0.0"',
|
|
32
|
+
" port: 50051",
|
|
33
|
+
" heartbeat:",
|
|
34
|
+
" intervalMs: 20000",
|
|
35
|
+
" jitterMs: 10000",
|
|
36
|
+
"agent:",
|
|
37
|
+
" grpc:",
|
|
38
|
+
' host: "0.0.0.0"',
|
|
39
|
+
" port: 50052",
|
|
40
|
+
"database:",
|
|
41
|
+
' name: "companyhelm"',
|
|
42
|
+
' host: "postgres"',
|
|
43
|
+
" port: 5432",
|
|
44
|
+
" roles:",
|
|
45
|
+
" app_runtime:",
|
|
46
|
+
' username: "app-runtime"',
|
|
47
|
+
' password: "companyhelm-local-app-runtime-role-password"',
|
|
48
|
+
" admin:",
|
|
49
|
+
' username: "postgres"',
|
|
50
|
+
' password: "postgres"',
|
|
51
|
+
"github:",
|
|
52
|
+
' app_client_id: "${GITHUB_APP_CLIENT_ID}"',
|
|
53
|
+
' app_private_key_pem: "${GITHUB_APP_PRIVATE_KEY_PEM}"',
|
|
54
|
+
' app_link: "${GITHUB_APP_URL}"',
|
|
55
|
+
'authProvider: "companyhelm"',
|
|
56
|
+
"auth:",
|
|
57
|
+
" companyhelm:",
|
|
58
|
+
" jwt_private_key_pem: |-",
|
|
59
|
+
this.indentBlock(state.auth.jwtPrivateKeyPem, 6),
|
|
60
|
+
" jwt_public_key_pem: |-",
|
|
61
|
+
this.indentBlock(state.auth.jwtPublicKeyPem, 6),
|
|
62
|
+
' jwt_issuer: "companyhelm.local"',
|
|
63
|
+
' jwt_audience: "companyhelm-web"',
|
|
64
|
+
" jwt_expiration_seconds: 86400",
|
|
65
|
+
"security:",
|
|
66
|
+
" encryption:",
|
|
67
|
+
' key: "companyhelm-local-encryption-key"',
|
|
68
|
+
`log_level: "${logLevel}"`,
|
|
69
|
+
"log_pretty: false",
|
|
70
|
+
""
|
|
71
|
+
].join("\n");
|
|
72
|
+
fs.writeFileSync(outputPath, yaml, "utf8");
|
|
73
|
+
return outputPath;
|
|
74
|
+
}
|
|
75
|
+
writeFrontendConfig(root, state) {
|
|
76
|
+
const runtimePaths = new RuntimePaths(root);
|
|
77
|
+
const outputPath = runtimePaths.frontendConfigPath();
|
|
78
|
+
const yaml = [
|
|
79
|
+
"api:",
|
|
80
|
+
` graphqlApiUrl: "http://127.0.0.1:${state.ports.apiHttp}/graphql"`,
|
|
81
|
+
` runnerGrpcTarget: "localhost:${state.ports.runnerGrpc}"`,
|
|
82
|
+
"auth:",
|
|
83
|
+
' provider: "companyhelm"',
|
|
84
|
+
" companyhelm:",
|
|
85
|
+
' tokenStorageKey: "companyhelm.auth.token"',
|
|
86
|
+
""
|
|
87
|
+
].join("\n");
|
|
88
|
+
fs.writeFileSync(outputPath, yaml, "utf8");
|
|
89
|
+
return outputPath;
|
|
90
|
+
}
|
|
91
|
+
indentBlock(value, spaces) {
|
|
92
|
+
const prefix = " ".repeat(spaces);
|
|
93
|
+
return value
|
|
94
|
+
.trimEnd()
|
|
95
|
+
.split("\n")
|
|
96
|
+
.map((line) => `${prefix}${line}`)
|
|
97
|
+
.join("\n");
|
|
98
|
+
}
|
|
99
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface SeedSqlInput {
|
|
2
|
+
companyId: string;
|
|
3
|
+
companyName: string;
|
|
4
|
+
username: string;
|
|
5
|
+
passwordHash: string;
|
|
6
|
+
passwordSalt?: string;
|
|
7
|
+
runnerName: string;
|
|
8
|
+
runnerSecret: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class SeedSqlRenderer {
|
|
11
|
+
render(input: SeedSqlInput): string;
|
|
12
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = path.dirname(__filename);
|
|
7
|
+
export class SeedSqlRenderer {
|
|
8
|
+
render(input) {
|
|
9
|
+
const templatePath = path.resolve(__dirname, "../../templates/seed.sql.tpl");
|
|
10
|
+
const template = fs.readFileSync(templatePath, "utf8");
|
|
11
|
+
const email = input.username.trim();
|
|
12
|
+
const firstName = email.split("@")[0] || email;
|
|
13
|
+
const runnerSecretHash = createHash("sha256").update(input.runnerSecret).digest("hex");
|
|
14
|
+
const userId = deriveUuid(input.companyId, "user");
|
|
15
|
+
const userAuthId = deriveUuid(input.companyId, "user-auth");
|
|
16
|
+
const runnerId = deriveUuid(input.companyId, "runner");
|
|
17
|
+
return template
|
|
18
|
+
.replaceAll("{{COMPANY_ID}}", input.companyId)
|
|
19
|
+
.replaceAll("{{COMPANY_NAME}}", input.companyName)
|
|
20
|
+
.replaceAll("{{USER_ID}}", userId)
|
|
21
|
+
.replaceAll("{{USER_AUTH_ID}}", userAuthId)
|
|
22
|
+
.replaceAll("{{USER_FIRST_NAME}}", firstName)
|
|
23
|
+
.replaceAll("{{USER_EMAIL}}", email)
|
|
24
|
+
.replaceAll("{{PASSWORD_SALT}}", input.passwordSalt ?? "password-salt")
|
|
25
|
+
.replaceAll("{{PASSWORD_HASH}}", input.passwordHash)
|
|
26
|
+
.replaceAll("{{RUNNER_ID}}", runnerId)
|
|
27
|
+
.replaceAll("{{RUNNER_NAME}}", input.runnerName)
|
|
28
|
+
.replaceAll("{{RUNNER_SECRET_HASH}}", runnerSecretHash);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function deriveUuid(companyId, scope) {
|
|
32
|
+
const hex = createHash("sha256").update(`${companyId}:${scope}`).digest("hex");
|
|
33
|
+
const chars = hex.slice(0, 32).split("");
|
|
34
|
+
chars[12] = "4";
|
|
35
|
+
chars[16] = ((Number.parseInt(chars[16] ?? "0", 16) & 0x3) | 0x8).toString(16);
|
|
36
|
+
const normalized = chars.join("");
|
|
37
|
+
return [
|
|
38
|
+
normalized.slice(0, 8),
|
|
39
|
+
normalized.slice(8, 12),
|
|
40
|
+
normalized.slice(12, 16),
|
|
41
|
+
normalized.slice(16, 20),
|
|
42
|
+
normalized.slice(20, 32)
|
|
43
|
+
].join("-");
|
|
44
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import { ProjectPaths } from "../runtime/ProjectPaths.js";
|
|
3
|
+
function escapeEnvValue(value) {
|
|
4
|
+
return String(value || "")
|
|
5
|
+
.replace(/\\/g, "\\\\")
|
|
6
|
+
.replace(/\r\n/g, "\n")
|
|
7
|
+
.replace(/\r/g, "\n")
|
|
8
|
+
.replace(/\n/g, "\\n");
|
|
9
|
+
}
|
|
10
|
+
export class ApiEnvFileWriter {
|
|
11
|
+
projectPaths;
|
|
12
|
+
constructor(projectRoot = process.cwd()) {
|
|
13
|
+
this.projectPaths = new ProjectPaths(projectRoot);
|
|
14
|
+
}
|
|
15
|
+
write(config) {
|
|
16
|
+
fs.mkdirSync(this.projectPaths.apiDirectoryPath(), { recursive: true });
|
|
17
|
+
const contents = [
|
|
18
|
+
`GITHUB_APP_URL=${escapeEnvValue(config.appUrl)}`,
|
|
19
|
+
`GITHUB_APP_CLIENT_ID=${escapeEnvValue(config.appClientId)}`,
|
|
20
|
+
`GITHUB_APP_PRIVATE_KEY_PEM=${escapeEnvValue(config.appPrivateKeyPem)}`,
|
|
21
|
+
"",
|
|
22
|
+
].join("\n");
|
|
23
|
+
fs.writeFileSync(this.projectPaths.apiEnvPath(), contents, "utf8");
|
|
24
|
+
return this.projectPaths.apiEnvPath();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
function normalizeRequiredValue(value, fieldName) {
|
|
2
|
+
const normalized = String(value || "").trim();
|
|
3
|
+
if (!normalized) {
|
|
4
|
+
throw new Error(`GitHub App config field "${fieldName}" is required.`);
|
|
5
|
+
}
|
|
6
|
+
return normalized;
|
|
7
|
+
}
|
|
8
|
+
export function normalizeGithubAppConfig(config) {
|
|
9
|
+
const appUrl = normalizeRequiredValue(config.appUrl, "appUrl");
|
|
10
|
+
try {
|
|
11
|
+
new URL(appUrl);
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
throw new Error(`GitHub App config field "appUrl" must be a valid URL.`);
|
|
15
|
+
}
|
|
16
|
+
const appClientId = normalizeRequiredValue(config.appClientId, "appClientId");
|
|
17
|
+
const rawPem = String(config.appPrivateKeyPem || "").replace(/\r\n/g, "\n").replace(/\r/g, "\n").trim();
|
|
18
|
+
if (!rawPem) {
|
|
19
|
+
throw new Error('GitHub App config field "appPrivateKeyPem" is required.');
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
appUrl,
|
|
23
|
+
appClientId,
|
|
24
|
+
appPrivateKeyPem: `${rawPem}\n`,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type GithubAppConfig } from "./GithubAppConfig.js";
|
|
2
|
+
export declare class GithubAppConfigStore {
|
|
3
|
+
private readonly configRoot;
|
|
4
|
+
constructor(configRoot?: string);
|
|
5
|
+
configPath(): string;
|
|
6
|
+
hasConfig(): boolean;
|
|
7
|
+
save(config: GithubAppConfig): string;
|
|
8
|
+
load(): GithubAppConfig | null;
|
|
9
|
+
loadOrThrow(): GithubAppConfig;
|
|
10
|
+
delete(): void;
|
|
11
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { parse, stringify } from "yaml";
|
|
5
|
+
import { normalizeGithubAppConfig } from "./GithubAppConfig.js";
|
|
6
|
+
function defaultConfigRoot() {
|
|
7
|
+
const explicitRoot = String(process.env.COMPANYHELM_CONFIG_HOME || "").trim();
|
|
8
|
+
if (explicitRoot) {
|
|
9
|
+
return path.resolve(explicitRoot);
|
|
10
|
+
}
|
|
11
|
+
const xdgRoot = String(process.env.XDG_CONFIG_HOME || "").trim();
|
|
12
|
+
if (xdgRoot) {
|
|
13
|
+
return path.resolve(xdgRoot, "companyhelm");
|
|
14
|
+
}
|
|
15
|
+
return path.join(os.homedir(), ".config", "companyhelm");
|
|
16
|
+
}
|
|
17
|
+
export class GithubAppConfigStore {
|
|
18
|
+
configRoot;
|
|
19
|
+
constructor(configRoot = defaultConfigRoot()) {
|
|
20
|
+
this.configRoot = configRoot;
|
|
21
|
+
}
|
|
22
|
+
configPath() {
|
|
23
|
+
return path.join(this.configRoot, "github-app.yaml");
|
|
24
|
+
}
|
|
25
|
+
hasConfig() {
|
|
26
|
+
return fs.existsSync(this.configPath());
|
|
27
|
+
}
|
|
28
|
+
save(config) {
|
|
29
|
+
const normalized = normalizeGithubAppConfig(config);
|
|
30
|
+
fs.mkdirSync(this.configRoot, { recursive: true });
|
|
31
|
+
const tempPath = `${this.configPath()}.tmp`;
|
|
32
|
+
const yaml = stringify({
|
|
33
|
+
app_url: normalized.appUrl,
|
|
34
|
+
app_client_id: normalized.appClientId,
|
|
35
|
+
app_private_key_pem: normalized.appPrivateKeyPem,
|
|
36
|
+
});
|
|
37
|
+
fs.writeFileSync(tempPath, yaml, { encoding: "utf8", mode: 0o600 });
|
|
38
|
+
fs.renameSync(tempPath, this.configPath());
|
|
39
|
+
return this.configPath();
|
|
40
|
+
}
|
|
41
|
+
load() {
|
|
42
|
+
if (!this.hasConfig()) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
const parsed = parse(fs.readFileSync(this.configPath(), "utf8"));
|
|
46
|
+
if (!parsed || typeof parsed !== "object") {
|
|
47
|
+
throw new Error(`Machine GitHub App config at ${this.configPath()} is invalid.`);
|
|
48
|
+
}
|
|
49
|
+
return normalizeGithubAppConfig({
|
|
50
|
+
appUrl: String(parsed.app_url || ""),
|
|
51
|
+
appClientId: String(parsed.app_client_id || ""),
|
|
52
|
+
appPrivateKeyPem: String(parsed.app_private_key_pem || ""),
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
loadOrThrow() {
|
|
56
|
+
const config = this.load();
|
|
57
|
+
if (!config) {
|
|
58
|
+
throw new Error(`GitHub App config is not set up. Run \`companyhelm setup-github-app\` to create ${this.configPath()}.`);
|
|
59
|
+
}
|
|
60
|
+
return config;
|
|
61
|
+
}
|
|
62
|
+
delete() {
|
|
63
|
+
fs.rmSync(this.configPath(), { force: true });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { LogLevel } from "../../commands/dependencies.js";
|
|
2
|
+
export interface ComposePorts {
|
|
3
|
+
apiHttpPort: number;
|
|
4
|
+
uiPort: number;
|
|
5
|
+
runnerGrpcPort: number;
|
|
6
|
+
agentCliGrpcPort: number;
|
|
7
|
+
}
|
|
8
|
+
export interface ComposePaths {
|
|
9
|
+
apiConfigPath: string;
|
|
10
|
+
apiEnvPath: string;
|
|
11
|
+
frontendConfigPath: string;
|
|
12
|
+
seedFilePath: string;
|
|
13
|
+
}
|
|
14
|
+
export interface ComposeRenderOptions {
|
|
15
|
+
frontendLogLevel?: LogLevel;
|
|
16
|
+
}
|
|
17
|
+
export declare class ComposeTemplateRenderer {
|
|
18
|
+
render(ports: ComposePorts, paths: ComposePaths, options?: ComposeRenderOptions): string;
|
|
19
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { ImageCatalog } from "../runtime/ImageCatalog.js";
|
|
5
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = path.dirname(__filename);
|
|
7
|
+
export class ComposeTemplateRenderer {
|
|
8
|
+
render(ports, paths, options = {}) {
|
|
9
|
+
const templatePath = path.resolve(__dirname, "../../templates/docker-compose.yaml.tpl");
|
|
10
|
+
const template = fs.readFileSync(templatePath, "utf8");
|
|
11
|
+
const images = new ImageCatalog().resolve();
|
|
12
|
+
const frontendLogLevel = options.frontendLogLevel ?? "info";
|
|
13
|
+
const frontendBlock = [
|
|
14
|
+
" frontend:",
|
|
15
|
+
` image: ${images.frontend}`,
|
|
16
|
+
" depends_on:",
|
|
17
|
+
" - api",
|
|
18
|
+
" environment:",
|
|
19
|
+
" COMPANYHELM_CONFIG_PATH: /run/companyhelm/config.yaml",
|
|
20
|
+
` COMPANYHELM_LOG_LEVEL: "${frontendLogLevel}"`,
|
|
21
|
+
` PORT: "${ports.uiPort}"`,
|
|
22
|
+
` npm_config_loglevel: "${frontendLogLevel}"`,
|
|
23
|
+
" ports:",
|
|
24
|
+
` - "${ports.uiPort}:${ports.uiPort}"`,
|
|
25
|
+
" volumes:",
|
|
26
|
+
` - "${paths.frontendConfigPath}:/run/companyhelm/config.yaml:ro"`,
|
|
27
|
+
" networks:",
|
|
28
|
+
" - companyhelm"
|
|
29
|
+
].join("\n");
|
|
30
|
+
return template
|
|
31
|
+
.replaceAll("{{API_IMAGE}}", images.api)
|
|
32
|
+
.replaceAll("{{POSTGRES_IMAGE}}", images.postgres)
|
|
33
|
+
.replaceAll("{{API_CONFIG_PATH}}", paths.apiConfigPath)
|
|
34
|
+
.replaceAll("{{API_ENV_PATH}}", paths.apiEnvPath)
|
|
35
|
+
.replaceAll("{{SEED_FILE_PATH}}", paths.seedFilePath)
|
|
36
|
+
.replaceAll("{{API_HTTP_PORT}}", String(ports.apiHttpPort))
|
|
37
|
+
.replaceAll("{{UI_PORT}}", String(ports.uiPort))
|
|
38
|
+
.replaceAll("{{RUNNER_GRPC_PORT}}", String(ports.runnerGrpcPort))
|
|
39
|
+
.replaceAll("{{AGENT_CLI_GRPC_PORT}}", String(ports.agentCliGrpcPort))
|
|
40
|
+
.replace("{{FRONTEND_SERVICE_BLOCK}}", frontendBlock);
|
|
41
|
+
}
|
|
42
|
+
}
|