@excitedjs/tm 1.1.0
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/tm +76 -0
- package/package.json +39 -0
- package/resolver-register.mjs +7 -0
- package/resolver.mjs +86 -0
- package/src/cli/context.ts +63 -0
- package/src/cli/dispatch.ts +444 -0
- package/src/cli/errors.ts +45 -0
- package/src/cli/parse.ts +265 -0
- package/src/cli.ts +12 -0
- package/src/codex-protocol/AbsolutePathBuf.ts +14 -0
- package/src/codex-protocol/AgentPath.ts +5 -0
- package/src/codex-protocol/ApplyPatchApprovalParams.ts +21 -0
- package/src/codex-protocol/ApplyPatchApprovalResponse.ts +6 -0
- package/src/codex-protocol/AuthMode.ts +8 -0
- package/src/codex-protocol/AutoCompactTokenLimitScope.ts +9 -0
- package/src/codex-protocol/ClientInfo.ts +5 -0
- package/src/codex-protocol/ClientNotification.ts +5 -0
- package/src/codex-protocol/ClientRequest.ts +110 -0
- package/src/codex-protocol/CollaborationMode.ts +10 -0
- package/src/codex-protocol/ContentItem.ts +6 -0
- package/src/codex-protocol/ConversationGitInfo.ts +5 -0
- package/src/codex-protocol/ConversationSummary.ts +8 -0
- package/src/codex-protocol/ExecCommandApprovalParams.ts +16 -0
- package/src/codex-protocol/ExecCommandApprovalResponse.ts +6 -0
- package/src/codex-protocol/ExecPolicyAmendment.ts +12 -0
- package/src/codex-protocol/FileChange.ts +5 -0
- package/src/codex-protocol/ForcedLoginMethod.ts +5 -0
- package/src/codex-protocol/FunctionCallOutputBody.ts +6 -0
- package/src/codex-protocol/FunctionCallOutputContentItem.ts +10 -0
- package/src/codex-protocol/FuzzyFileSearchMatchType.ts +5 -0
- package/src/codex-protocol/FuzzyFileSearchParams.ts +5 -0
- package/src/codex-protocol/FuzzyFileSearchResponse.ts +6 -0
- package/src/codex-protocol/FuzzyFileSearchResult.ts +9 -0
- package/src/codex-protocol/FuzzyFileSearchSessionCompletedNotification.ts +5 -0
- package/src/codex-protocol/FuzzyFileSearchSessionStartParams.ts +5 -0
- package/src/codex-protocol/FuzzyFileSearchSessionStartResponse.ts +5 -0
- package/src/codex-protocol/FuzzyFileSearchSessionStopParams.ts +5 -0
- package/src/codex-protocol/FuzzyFileSearchSessionStopResponse.ts +5 -0
- package/src/codex-protocol/FuzzyFileSearchSessionUpdateParams.ts +5 -0
- package/src/codex-protocol/FuzzyFileSearchSessionUpdateResponse.ts +5 -0
- package/src/codex-protocol/FuzzyFileSearchSessionUpdatedNotification.ts +6 -0
- package/src/codex-protocol/GetAuthStatusParams.ts +5 -0
- package/src/codex-protocol/GetAuthStatusResponse.ts +6 -0
- package/src/codex-protocol/GetConversationSummaryParams.ts +6 -0
- package/src/codex-protocol/GetConversationSummaryResponse.ts +6 -0
- package/src/codex-protocol/GitDiffToRemoteParams.ts +5 -0
- package/src/codex-protocol/GitDiffToRemoteResponse.ts +6 -0
- package/src/codex-protocol/GitSha.ts +5 -0
- package/src/codex-protocol/ImageDetail.ts +5 -0
- package/src/codex-protocol/InitializeCapabilities.ts +21 -0
- package/src/codex-protocol/InitializeParams.ts +7 -0
- package/src/codex-protocol/InitializeResponse.ts +20 -0
- package/src/codex-protocol/InputModality.ts +8 -0
- package/src/codex-protocol/InternalSessionSource.ts +5 -0
- package/src/codex-protocol/LocalShellAction.ts +6 -0
- package/src/codex-protocol/LocalShellExecAction.ts +5 -0
- package/src/codex-protocol/LocalShellStatus.ts +5 -0
- package/src/codex-protocol/MessagePhase.ts +11 -0
- package/src/codex-protocol/ModeKind.ts +8 -0
- package/src/codex-protocol/NetworkPolicyAmendment.ts +6 -0
- package/src/codex-protocol/NetworkPolicyRuleAction.ts +5 -0
- package/src/codex-protocol/ParsedCommand.ts +12 -0
- package/src/codex-protocol/Personality.ts +5 -0
- package/src/codex-protocol/PlanType.ts +5 -0
- package/src/codex-protocol/RealtimeConversationVersion.ts +5 -0
- package/src/codex-protocol/RealtimeOutputModality.ts +5 -0
- package/src/codex-protocol/RealtimeVoice.ts +5 -0
- package/src/codex-protocol/RealtimeVoicesList.ts +6 -0
- package/src/codex-protocol/ReasoningEffort.ts +8 -0
- package/src/codex-protocol/ReasoningItemContent.ts +5 -0
- package/src/codex-protocol/ReasoningItemReasoningSummary.ts +5 -0
- package/src/codex-protocol/ReasoningSummary.ts +10 -0
- package/src/codex-protocol/RequestId.ts +5 -0
- package/src/codex-protocol/Resource.ts +9 -0
- package/src/codex-protocol/ResourceContent.ts +17 -0
- package/src/codex-protocol/ResourceTemplate.ts +9 -0
- package/src/codex-protocol/ResponseItem.ts +17 -0
- package/src/codex-protocol/ReviewDecision.ts +10 -0
- package/src/codex-protocol/ServerNotification.ts +73 -0
- package/src/codex-protocol/ServerRequest.ts +19 -0
- package/src/codex-protocol/SessionSource.ts +7 -0
- package/src/codex-protocol/Settings.ts +9 -0
- package/src/codex-protocol/SubAgentSource.ts +7 -0
- package/src/codex-protocol/ThreadId.ts +5 -0
- package/src/codex-protocol/ThreadMemoryMode.ts +5 -0
- package/src/codex-protocol/Tool.ts +9 -0
- package/src/codex-protocol/Verbosity.ts +9 -0
- package/src/codex-protocol/WebSearchAction.ts +5 -0
- package/src/codex-protocol/WebSearchContextSize.ts +5 -0
- package/src/codex-protocol/WebSearchLocation.ts +5 -0
- package/src/codex-protocol/WebSearchMode.ts +5 -0
- package/src/codex-protocol/WebSearchToolConfig.ts +7 -0
- package/src/codex-protocol/index.ts +86 -0
- package/src/codex-protocol/serde_json/JsonValue.ts +5 -0
- package/src/codex-protocol/v2/Account.ts +6 -0
- package/src/codex-protocol/v2/AccountLoginCompletedNotification.ts +5 -0
- package/src/codex-protocol/v2/AccountRateLimitsUpdatedNotification.ts +6 -0
- package/src/codex-protocol/v2/AccountUpdatedNotification.ts +7 -0
- package/src/codex-protocol/v2/ActivePermissionProfile.ts +15 -0
- package/src/codex-protocol/v2/AddCreditsNudgeCreditType.ts +5 -0
- package/src/codex-protocol/v2/AddCreditsNudgeEmailStatus.ts +5 -0
- package/src/codex-protocol/v2/AdditionalFileSystemPermissions.ts +15 -0
- package/src/codex-protocol/v2/AdditionalNetworkPermissions.ts +5 -0
- package/src/codex-protocol/v2/AdditionalPermissionProfile.ts +11 -0
- package/src/codex-protocol/v2/AgentMessageDeltaNotification.ts +5 -0
- package/src/codex-protocol/v2/AnalyticsConfig.ts +6 -0
- package/src/codex-protocol/v2/AppBranding.ts +8 -0
- package/src/codex-protocol/v2/AppInfo.ts +19 -0
- package/src/codex-protocol/v2/AppListUpdatedNotification.ts +9 -0
- package/src/codex-protocol/v2/AppMetadata.ts +7 -0
- package/src/codex-protocol/v2/AppReview.ts +5 -0
- package/src/codex-protocol/v2/AppScreenshot.ts +5 -0
- package/src/codex-protocol/v2/AppSummary.ts +8 -0
- package/src/codex-protocol/v2/AppToolApproval.ts +5 -0
- package/src/codex-protocol/v2/AppToolsConfig.ts +6 -0
- package/src/codex-protocol/v2/ApprovalsReviewer.ts +12 -0
- package/src/codex-protocol/v2/AppsConfig.ts +8 -0
- package/src/codex-protocol/v2/AppsDefaultConfig.ts +5 -0
- package/src/codex-protocol/v2/AppsListParams.ts +24 -0
- package/src/codex-protocol/v2/AppsListResponse.ts +14 -0
- package/src/codex-protocol/v2/AskForApproval.ts +5 -0
- package/src/codex-protocol/v2/AttestationGenerateParams.ts +5 -0
- package/src/codex-protocol/v2/AttestationGenerateResponse.ts +9 -0
- package/src/codex-protocol/v2/AutoReviewDecisionSource.ts +8 -0
- package/src/codex-protocol/v2/ByteRange.ts +5 -0
- package/src/codex-protocol/v2/CancelLoginAccountParams.ts +5 -0
- package/src/codex-protocol/v2/CancelLoginAccountResponse.ts +6 -0
- package/src/codex-protocol/v2/CancelLoginAccountStatus.ts +5 -0
- package/src/codex-protocol/v2/ChatgptAuthTokensRefreshParams.ts +16 -0
- package/src/codex-protocol/v2/ChatgptAuthTokensRefreshReason.ts +5 -0
- package/src/codex-protocol/v2/ChatgptAuthTokensRefreshResponse.ts +5 -0
- package/src/codex-protocol/v2/CodexErrorInfo.ts +12 -0
- package/src/codex-protocol/v2/CollabAgentState.ts +6 -0
- package/src/codex-protocol/v2/CollabAgentStatus.ts +5 -0
- package/src/codex-protocol/v2/CollabAgentTool.ts +5 -0
- package/src/codex-protocol/v2/CollabAgentToolCallStatus.ts +5 -0
- package/src/codex-protocol/v2/CollaborationModeListParams.ts +8 -0
- package/src/codex-protocol/v2/CollaborationModeListResponse.ts +9 -0
- package/src/codex-protocol/v2/CollaborationModeMask.ts +10 -0
- package/src/codex-protocol/v2/CommandAction.ts +6 -0
- package/src/codex-protocol/v2/CommandExecOutputDeltaNotification.ts +30 -0
- package/src/codex-protocol/v2/CommandExecOutputStream.ts +8 -0
- package/src/codex-protocol/v2/CommandExecParams.ts +105 -0
- package/src/codex-protocol/v2/CommandExecResizeParams.ts +18 -0
- package/src/codex-protocol/v2/CommandExecResizeResponse.ts +8 -0
- package/src/codex-protocol/v2/CommandExecResponse.ts +24 -0
- package/src/codex-protocol/v2/CommandExecTerminalSize.ts +16 -0
- package/src/codex-protocol/v2/CommandExecTerminateParams.ts +13 -0
- package/src/codex-protocol/v2/CommandExecTerminateResponse.ts +8 -0
- package/src/codex-protocol/v2/CommandExecWriteParams.ts +22 -0
- package/src/codex-protocol/v2/CommandExecWriteResponse.ts +8 -0
- package/src/codex-protocol/v2/CommandExecutionApprovalDecision.ts +7 -0
- package/src/codex-protocol/v2/CommandExecutionOutputDeltaNotification.ts +5 -0
- package/src/codex-protocol/v2/CommandExecutionRequestApprovalParams.ts +62 -0
- package/src/codex-protocol/v2/CommandExecutionRequestApprovalResponse.ts +6 -0
- package/src/codex-protocol/v2/CommandExecutionSource.ts +5 -0
- package/src/codex-protocol/v2/CommandExecutionStatus.ts +5 -0
- package/src/codex-protocol/v2/CommandMigration.ts +5 -0
- package/src/codex-protocol/v2/ComputerUseRequirements.ts +5 -0
- package/src/codex-protocol/v2/Config.ts +26 -0
- package/src/codex-protocol/v2/ConfigBatchWriteParams.ts +14 -0
- package/src/codex-protocol/v2/ConfigEdit.ts +7 -0
- package/src/codex-protocol/v2/ConfigLayer.ts +7 -0
- package/src/codex-protocol/v2/ConfigLayerMetadata.ts +6 -0
- package/src/codex-protocol/v2/ConfigLayerSource.ts +21 -0
- package/src/codex-protocol/v2/ConfigReadParams.ts +11 -0
- package/src/codex-protocol/v2/ConfigReadResponse.ts +8 -0
- package/src/codex-protocol/v2/ConfigRequirements.ts +13 -0
- package/src/codex-protocol/v2/ConfigRequirementsReadResponse.ts +10 -0
- package/src/codex-protocol/v2/ConfigValueWriteParams.ts +11 -0
- package/src/codex-protocol/v2/ConfigWarningNotification.ts +22 -0
- package/src/codex-protocol/v2/ConfigWriteResponse.ts +12 -0
- package/src/codex-protocol/v2/ConfiguredHookHandler.ts +5 -0
- package/src/codex-protocol/v2/ConfiguredHookMatcherGroup.ts +6 -0
- package/src/codex-protocol/v2/ContextCompactedNotification.ts +8 -0
- package/src/codex-protocol/v2/CreditsSnapshot.ts +5 -0
- package/src/codex-protocol/v2/DeprecationNoticeNotification.ts +13 -0
- package/src/codex-protocol/v2/DynamicToolCallOutputContentItem.ts +5 -0
- package/src/codex-protocol/v2/DynamicToolCallParams.ts +6 -0
- package/src/codex-protocol/v2/DynamicToolCallResponse.ts +6 -0
- package/src/codex-protocol/v2/DynamicToolCallStatus.ts +5 -0
- package/src/codex-protocol/v2/DynamicToolSpec.ts +6 -0
- package/src/codex-protocol/v2/EnvironmentAddParams.ts +5 -0
- package/src/codex-protocol/v2/EnvironmentAddResponse.ts +5 -0
- package/src/codex-protocol/v2/ErrorNotification.ts +6 -0
- package/src/codex-protocol/v2/ExecPolicyAmendment.ts +5 -0
- package/src/codex-protocol/v2/ExperimentalFeature.ts +37 -0
- package/src/codex-protocol/v2/ExperimentalFeatureEnablementSetParams.ts +12 -0
- package/src/codex-protocol/v2/ExperimentalFeatureEnablementSetResponse.ts +9 -0
- package/src/codex-protocol/v2/ExperimentalFeatureListParams.ts +19 -0
- package/src/codex-protocol/v2/ExperimentalFeatureListResponse.ts +11 -0
- package/src/codex-protocol/v2/ExperimentalFeatureStage.ts +5 -0
- package/src/codex-protocol/v2/ExternalAgentConfigDetectParams.ts +13 -0
- package/src/codex-protocol/v2/ExternalAgentConfigDetectResponse.ts +6 -0
- package/src/codex-protocol/v2/ExternalAgentConfigImportCompletedNotification.ts +5 -0
- package/src/codex-protocol/v2/ExternalAgentConfigImportParams.ts +6 -0
- package/src/codex-protocol/v2/ExternalAgentConfigImportResponse.ts +5 -0
- package/src/codex-protocol/v2/ExternalAgentConfigMigrationItem.ts +11 -0
- package/src/codex-protocol/v2/ExternalAgentConfigMigrationItemType.ts +5 -0
- package/src/codex-protocol/v2/FeedbackUploadParams.ts +5 -0
- package/src/codex-protocol/v2/FeedbackUploadResponse.ts +5 -0
- package/src/codex-protocol/v2/FileChangeApprovalDecision.ts +5 -0
- package/src/codex-protocol/v2/FileChangeOutputDeltaNotification.ts +10 -0
- package/src/codex-protocol/v2/FileChangePatchUpdatedNotification.ts +6 -0
- package/src/codex-protocol/v2/FileChangeRequestApprovalParams.ts +18 -0
- package/src/codex-protocol/v2/FileChangeRequestApprovalResponse.ts +6 -0
- package/src/codex-protocol/v2/FileSystemAccessMode.ts +5 -0
- package/src/codex-protocol/v2/FileSystemPath.ts +7 -0
- package/src/codex-protocol/v2/FileSystemSandboxEntry.ts +7 -0
- package/src/codex-protocol/v2/FileSystemSpecialPath.ts +5 -0
- package/src/codex-protocol/v2/FileUpdateChange.ts +6 -0
- package/src/codex-protocol/v2/ForcedChatgptWorkspaceIds.ts +8 -0
- package/src/codex-protocol/v2/FsChangedNotification.ts +17 -0
- package/src/codex-protocol/v2/FsCopyParams.ts +21 -0
- package/src/codex-protocol/v2/FsCopyResponse.ts +8 -0
- package/src/codex-protocol/v2/FsCreateDirectoryParams.ts +17 -0
- package/src/codex-protocol/v2/FsCreateDirectoryResponse.ts +8 -0
- package/src/codex-protocol/v2/FsGetMetadataParams.ts +13 -0
- package/src/codex-protocol/v2/FsGetMetadataResponse.ts +28 -0
- package/src/codex-protocol/v2/FsReadDirectoryEntry.ts +20 -0
- package/src/codex-protocol/v2/FsReadDirectoryParams.ts +13 -0
- package/src/codex-protocol/v2/FsReadDirectoryResponse.ts +13 -0
- package/src/codex-protocol/v2/FsReadFileParams.ts +13 -0
- package/src/codex-protocol/v2/FsReadFileResponse.ts +12 -0
- package/src/codex-protocol/v2/FsRemoveParams.ts +21 -0
- package/src/codex-protocol/v2/FsRemoveResponse.ts +8 -0
- package/src/codex-protocol/v2/FsUnwatchParams.ts +12 -0
- package/src/codex-protocol/v2/FsUnwatchResponse.ts +8 -0
- package/src/codex-protocol/v2/FsWatchParams.ts +17 -0
- package/src/codex-protocol/v2/FsWatchResponse.ts +13 -0
- package/src/codex-protocol/v2/FsWriteFileParams.ts +17 -0
- package/src/codex-protocol/v2/FsWriteFileResponse.ts +8 -0
- package/src/codex-protocol/v2/GetAccountParams.ts +13 -0
- package/src/codex-protocol/v2/GetAccountRateLimitsResponse.ts +14 -0
- package/src/codex-protocol/v2/GetAccountResponse.ts +6 -0
- package/src/codex-protocol/v2/GitInfo.ts +5 -0
- package/src/codex-protocol/v2/GrantedPermissionProfile.ts +7 -0
- package/src/codex-protocol/v2/GuardianApprovalReview.ts +13 -0
- package/src/codex-protocol/v2/GuardianApprovalReviewAction.ts +9 -0
- package/src/codex-protocol/v2/GuardianApprovalReviewStatus.ts +8 -0
- package/src/codex-protocol/v2/GuardianCommandSource.ts +5 -0
- package/src/codex-protocol/v2/GuardianRiskLevel.ts +8 -0
- package/src/codex-protocol/v2/GuardianUserAuthorization.ts +8 -0
- package/src/codex-protocol/v2/GuardianWarningNotification.ts +13 -0
- package/src/codex-protocol/v2/HookCompletedNotification.ts +6 -0
- package/src/codex-protocol/v2/HookErrorInfo.ts +5 -0
- package/src/codex-protocol/v2/HookEventName.ts +5 -0
- package/src/codex-protocol/v2/HookExecutionMode.ts +5 -0
- package/src/codex-protocol/v2/HookHandlerType.ts +5 -0
- package/src/codex-protocol/v2/HookMetadata.ts +10 -0
- package/src/codex-protocol/v2/HookMigration.ts +5 -0
- package/src/codex-protocol/v2/HookOutputEntry.ts +6 -0
- package/src/codex-protocol/v2/HookOutputEntryKind.ts +5 -0
- package/src/codex-protocol/v2/HookPromptFragment.ts +5 -0
- package/src/codex-protocol/v2/HookRunStatus.ts +5 -0
- package/src/codex-protocol/v2/HookRunSummary.ts +13 -0
- package/src/codex-protocol/v2/HookScope.ts +5 -0
- package/src/codex-protocol/v2/HookSource.ts +5 -0
- package/src/codex-protocol/v2/HookStartedNotification.ts +6 -0
- package/src/codex-protocol/v2/HookTrustStatus.ts +5 -0
- package/src/codex-protocol/v2/HooksListEntry.ts +7 -0
- package/src/codex-protocol/v2/HooksListParams.ts +9 -0
- package/src/codex-protocol/v2/HooksListResponse.ts +6 -0
- package/src/codex-protocol/v2/ItemCompletedNotification.ts +10 -0
- package/src/codex-protocol/v2/ItemGuardianApprovalReviewCompletedNotification.ts +38 -0
- package/src/codex-protocol/v2/ItemGuardianApprovalReviewStartedNotification.ts +33 -0
- package/src/codex-protocol/v2/ItemStartedNotification.ts +10 -0
- package/src/codex-protocol/v2/ListMcpServerStatusParams.ts +19 -0
- package/src/codex-protocol/v2/ListMcpServerStatusResponse.ts +11 -0
- package/src/codex-protocol/v2/LoginAccountParams.ts +21 -0
- package/src/codex-protocol/v2/LoginAccountResponse.ts +17 -0
- package/src/codex-protocol/v2/LogoutAccountResponse.ts +5 -0
- package/src/codex-protocol/v2/ManagedHooksRequirements.ts +6 -0
- package/src/codex-protocol/v2/MarketplaceAddParams.ts +5 -0
- package/src/codex-protocol/v2/MarketplaceAddResponse.ts +6 -0
- package/src/codex-protocol/v2/MarketplaceInterface.ts +5 -0
- package/src/codex-protocol/v2/MarketplaceLoadErrorInfo.ts +6 -0
- package/src/codex-protocol/v2/MarketplaceRemoveParams.ts +5 -0
- package/src/codex-protocol/v2/MarketplaceRemoveResponse.ts +6 -0
- package/src/codex-protocol/v2/MarketplaceUpgradeErrorInfo.ts +5 -0
- package/src/codex-protocol/v2/MarketplaceUpgradeParams.ts +5 -0
- package/src/codex-protocol/v2/MarketplaceUpgradeResponse.ts +7 -0
- package/src/codex-protocol/v2/McpAuthStatus.ts +5 -0
- package/src/codex-protocol/v2/McpElicitationArrayType.ts +5 -0
- package/src/codex-protocol/v2/McpElicitationBooleanSchema.ts +6 -0
- package/src/codex-protocol/v2/McpElicitationBooleanType.ts +5 -0
- package/src/codex-protocol/v2/McpElicitationConstOption.ts +5 -0
- package/src/codex-protocol/v2/McpElicitationEnumSchema.ts +8 -0
- package/src/codex-protocol/v2/McpElicitationLegacyTitledEnumSchema.ts +6 -0
- package/src/codex-protocol/v2/McpElicitationMultiSelectEnumSchema.ts +7 -0
- package/src/codex-protocol/v2/McpElicitationNumberSchema.ts +6 -0
- package/src/codex-protocol/v2/McpElicitationNumberType.ts +5 -0
- package/src/codex-protocol/v2/McpElicitationObjectType.ts +5 -0
- package/src/codex-protocol/v2/McpElicitationPrimitiveSchema.ts +9 -0
- package/src/codex-protocol/v2/McpElicitationSchema.ts +13 -0
- package/src/codex-protocol/v2/McpElicitationSingleSelectEnumSchema.ts +7 -0
- package/src/codex-protocol/v2/McpElicitationStringFormat.ts +5 -0
- package/src/codex-protocol/v2/McpElicitationStringSchema.ts +7 -0
- package/src/codex-protocol/v2/McpElicitationStringType.ts +5 -0
- package/src/codex-protocol/v2/McpElicitationTitledEnumItems.ts +6 -0
- package/src/codex-protocol/v2/McpElicitationTitledMultiSelectEnumSchema.ts +7 -0
- package/src/codex-protocol/v2/McpElicitationTitledSingleSelectEnumSchema.ts +7 -0
- package/src/codex-protocol/v2/McpElicitationUntitledEnumItems.ts +6 -0
- package/src/codex-protocol/v2/McpElicitationUntitledMultiSelectEnumSchema.ts +7 -0
- package/src/codex-protocol/v2/McpElicitationUntitledSingleSelectEnumSchema.ts +6 -0
- package/src/codex-protocol/v2/McpResourceReadParams.ts +5 -0
- package/src/codex-protocol/v2/McpResourceReadResponse.ts +6 -0
- package/src/codex-protocol/v2/McpServerElicitationAction.ts +5 -0
- package/src/codex-protocol/v2/McpServerElicitationRequestParams.ts +16 -0
- package/src/codex-protocol/v2/McpServerElicitationRequestResponse.ts +17 -0
- package/src/codex-protocol/v2/McpServerMigration.ts +5 -0
- package/src/codex-protocol/v2/McpServerOauthLoginCompletedNotification.ts +5 -0
- package/src/codex-protocol/v2/McpServerOauthLoginParams.ts +5 -0
- package/src/codex-protocol/v2/McpServerOauthLoginResponse.ts +5 -0
- package/src/codex-protocol/v2/McpServerRefreshResponse.ts +5 -0
- package/src/codex-protocol/v2/McpServerStartupState.ts +5 -0
- package/src/codex-protocol/v2/McpServerStatus.ts +9 -0
- package/src/codex-protocol/v2/McpServerStatusDetail.ts +5 -0
- package/src/codex-protocol/v2/McpServerStatusUpdatedNotification.ts +6 -0
- package/src/codex-protocol/v2/McpServerToolCallParams.ts +6 -0
- package/src/codex-protocol/v2/McpServerToolCallResponse.ts +6 -0
- package/src/codex-protocol/v2/McpToolCallError.ts +5 -0
- package/src/codex-protocol/v2/McpToolCallProgressNotification.ts +5 -0
- package/src/codex-protocol/v2/McpToolCallResult.ts +6 -0
- package/src/codex-protocol/v2/McpToolCallStatus.ts +5 -0
- package/src/codex-protocol/v2/MemoryCitation.ts +6 -0
- package/src/codex-protocol/v2/MemoryCitationEntry.ts +5 -0
- package/src/codex-protocol/v2/MemoryResetResponse.ts +5 -0
- package/src/codex-protocol/v2/MergeStrategy.ts +5 -0
- package/src/codex-protocol/v2/MigrationDetails.ts +11 -0
- package/src/codex-protocol/v2/MockExperimentalMethodParams.ts +9 -0
- package/src/codex-protocol/v2/MockExperimentalMethodResponse.ts +9 -0
- package/src/codex-protocol/v2/Model.ts +19 -0
- package/src/codex-protocol/v2/ModelAvailabilityNux.ts +5 -0
- package/src/codex-protocol/v2/ModelListParams.ts +17 -0
- package/src/codex-protocol/v2/ModelListResponse.ts +11 -0
- package/src/codex-protocol/v2/ModelProviderCapabilitiesReadParams.ts +5 -0
- package/src/codex-protocol/v2/ModelProviderCapabilitiesReadResponse.ts +5 -0
- package/src/codex-protocol/v2/ModelRerouteReason.ts +5 -0
- package/src/codex-protocol/v2/ModelReroutedNotification.ts +6 -0
- package/src/codex-protocol/v2/ModelServiceTier.ts +5 -0
- package/src/codex-protocol/v2/ModelUpgradeInfo.ts +5 -0
- package/src/codex-protocol/v2/ModelVerification.ts +5 -0
- package/src/codex-protocol/v2/ModelVerificationNotification.ts +6 -0
- package/src/codex-protocol/v2/NetworkAccess.ts +5 -0
- package/src/codex-protocol/v2/NetworkApprovalContext.ts +6 -0
- package/src/codex-protocol/v2/NetworkApprovalProtocol.ts +5 -0
- package/src/codex-protocol/v2/NetworkDomainPermission.ts +5 -0
- package/src/codex-protocol/v2/NetworkPolicyAmendment.ts +6 -0
- package/src/codex-protocol/v2/NetworkPolicyRuleAction.ts +5 -0
- package/src/codex-protocol/v2/NetworkRequirements.ts +32 -0
- package/src/codex-protocol/v2/NetworkUnixSocketPermission.ts +5 -0
- package/src/codex-protocol/v2/NonSteerableTurnKind.ts +5 -0
- package/src/codex-protocol/v2/OverriddenMetadata.ts +7 -0
- package/src/codex-protocol/v2/PatchApplyStatus.ts +5 -0
- package/src/codex-protocol/v2/PatchChangeKind.ts +5 -0
- package/src/codex-protocol/v2/PermissionGrantScope.ts +5 -0
- package/src/codex-protocol/v2/PermissionProfileListParams.ts +17 -0
- package/src/codex-protocol/v2/PermissionProfileListResponse.ts +11 -0
- package/src/codex-protocol/v2/PermissionProfileSummary.ts +13 -0
- package/src/codex-protocol/v2/PermissionsRequestApprovalParams.ts +11 -0
- package/src/codex-protocol/v2/PermissionsRequestApprovalResponse.ts +11 -0
- package/src/codex-protocol/v2/PlanDeltaNotification.ts +9 -0
- package/src/codex-protocol/v2/PluginAuthPolicy.ts +5 -0
- package/src/codex-protocol/v2/PluginAvailability.ts +5 -0
- package/src/codex-protocol/v2/PluginDetail.ts +10 -0
- package/src/codex-protocol/v2/PluginHookSummary.ts +6 -0
- package/src/codex-protocol/v2/PluginInstallParams.ts +6 -0
- package/src/codex-protocol/v2/PluginInstallPolicy.ts +5 -0
- package/src/codex-protocol/v2/PluginInstallResponse.ts +7 -0
- package/src/codex-protocol/v2/PluginInstalledParams.ts +15 -0
- package/src/codex-protocol/v2/PluginInstalledResponse.ts +7 -0
- package/src/codex-protocol/v2/PluginInterface.ts +35 -0
- package/src/codex-protocol/v2/PluginListMarketplaceKind.ts +5 -0
- package/src/codex-protocol/v2/PluginListParams.ts +17 -0
- package/src/codex-protocol/v2/PluginListResponse.ts +7 -0
- package/src/codex-protocol/v2/PluginMarketplaceEntry.ts +13 -0
- package/src/codex-protocol/v2/PluginReadParams.ts +6 -0
- package/src/codex-protocol/v2/PluginReadResponse.ts +6 -0
- package/src/codex-protocol/v2/PluginShareCheckoutParams.ts +5 -0
- package/src/codex-protocol/v2/PluginShareCheckoutResponse.ts +6 -0
- package/src/codex-protocol/v2/PluginShareContext.ts +11 -0
- package/src/codex-protocol/v2/PluginShareDeleteParams.ts +5 -0
- package/src/codex-protocol/v2/PluginShareDeleteResponse.ts +5 -0
- package/src/codex-protocol/v2/PluginShareDiscoverability.ts +5 -0
- package/src/codex-protocol/v2/PluginShareListItem.ts +7 -0
- package/src/codex-protocol/v2/PluginShareListParams.ts +5 -0
- package/src/codex-protocol/v2/PluginShareListResponse.ts +6 -0
- package/src/codex-protocol/v2/PluginSharePrincipal.ts +7 -0
- package/src/codex-protocol/v2/PluginSharePrincipalRole.ts +5 -0
- package/src/codex-protocol/v2/PluginSharePrincipalType.ts +5 -0
- package/src/codex-protocol/v2/PluginShareSaveParams.ts +8 -0
- package/src/codex-protocol/v2/PluginShareSaveResponse.ts +5 -0
- package/src/codex-protocol/v2/PluginShareTarget.ts +7 -0
- package/src/codex-protocol/v2/PluginShareTargetRole.ts +5 -0
- package/src/codex-protocol/v2/PluginShareUpdateDiscoverability.ts +5 -0
- package/src/codex-protocol/v2/PluginShareUpdateTargetsParams.ts +7 -0
- package/src/codex-protocol/v2/PluginShareUpdateTargetsResponse.ts +7 -0
- package/src/codex-protocol/v2/PluginSkillReadParams.ts +5 -0
- package/src/codex-protocol/v2/PluginSkillReadResponse.ts +5 -0
- package/src/codex-protocol/v2/PluginSource.ts +6 -0
- package/src/codex-protocol/v2/PluginSummary.ts +27 -0
- package/src/codex-protocol/v2/PluginUninstallParams.ts +5 -0
- package/src/codex-protocol/v2/PluginUninstallResponse.ts +5 -0
- package/src/codex-protocol/v2/PluginsMigration.ts +5 -0
- package/src/codex-protocol/v2/ProcessExitedNotification.ts +42 -0
- package/src/codex-protocol/v2/ProcessKillParams.ts +12 -0
- package/src/codex-protocol/v2/ProcessKillResponse.ts +8 -0
- package/src/codex-protocol/v2/ProcessOutputDeltaNotification.ts +26 -0
- package/src/codex-protocol/v2/ProcessOutputStream.ts +8 -0
- package/src/codex-protocol/v2/ProcessResizePtyParams.ts +17 -0
- package/src/codex-protocol/v2/ProcessResizePtyResponse.ts +8 -0
- package/src/codex-protocol/v2/ProcessSpawnParams.ts +73 -0
- package/src/codex-protocol/v2/ProcessSpawnResponse.ts +8 -0
- package/src/codex-protocol/v2/ProcessTerminalSize.ts +16 -0
- package/src/codex-protocol/v2/ProcessWriteStdinParams.ts +21 -0
- package/src/codex-protocol/v2/ProcessWriteStdinResponse.ts +8 -0
- package/src/codex-protocol/v2/ProfileV2.ts +19 -0
- package/src/codex-protocol/v2/RateLimitReachedType.ts +5 -0
- package/src/codex-protocol/v2/RateLimitSnapshot.ts +9 -0
- package/src/codex-protocol/v2/RateLimitWindow.ts +5 -0
- package/src/codex-protocol/v2/RawResponseItemCompletedNotification.ts +6 -0
- package/src/codex-protocol/v2/ReasoningEffortOption.ts +6 -0
- package/src/codex-protocol/v2/ReasoningSummaryPartAddedNotification.ts +5 -0
- package/src/codex-protocol/v2/ReasoningSummaryTextDeltaNotification.ts +5 -0
- package/src/codex-protocol/v2/ReasoningTextDeltaNotification.ts +5 -0
- package/src/codex-protocol/v2/RemoteControlConnectionStatus.ts +5 -0
- package/src/codex-protocol/v2/RemoteControlDisableResponse.ts +6 -0
- package/src/codex-protocol/v2/RemoteControlEnableResponse.ts +6 -0
- package/src/codex-protocol/v2/RemoteControlStatusChangedNotification.ts +9 -0
- package/src/codex-protocol/v2/RemoteControlStatusReadResponse.ts +6 -0
- package/src/codex-protocol/v2/RequestPermissionProfile.ts +7 -0
- package/src/codex-protocol/v2/ResidencyRequirement.ts +5 -0
- package/src/codex-protocol/v2/ReviewDelivery.ts +5 -0
- package/src/codex-protocol/v2/ReviewStartParams.ts +12 -0
- package/src/codex-protocol/v2/ReviewStartResponse.ts +13 -0
- package/src/codex-protocol/v2/ReviewTarget.ts +9 -0
- package/src/codex-protocol/v2/SandboxMode.ts +5 -0
- package/src/codex-protocol/v2/SandboxPolicy.ts +7 -0
- package/src/codex-protocol/v2/SandboxWorkspaceWrite.ts +5 -0
- package/src/codex-protocol/v2/SendAddCreditsNudgeEmailParams.ts +6 -0
- package/src/codex-protocol/v2/SendAddCreditsNudgeEmailResponse.ts +6 -0
- package/src/codex-protocol/v2/ServerRequestResolvedNotification.ts +6 -0
- package/src/codex-protocol/v2/SessionMigration.ts +5 -0
- package/src/codex-protocol/v2/SessionSource.ts +6 -0
- package/src/codex-protocol/v2/SkillDependencies.ts +6 -0
- package/src/codex-protocol/v2/SkillErrorInfo.ts +5 -0
- package/src/codex-protocol/v2/SkillInterface.ts +6 -0
- package/src/codex-protocol/v2/SkillMetadata.ts +13 -0
- package/src/codex-protocol/v2/SkillScope.ts +5 -0
- package/src/codex-protocol/v2/SkillSummary.ts +7 -0
- package/src/codex-protocol/v2/SkillToolDependency.ts +5 -0
- package/src/codex-protocol/v2/SkillsChangedNotification.ts +11 -0
- package/src/codex-protocol/v2/SkillsConfigWriteParams.ts +14 -0
- package/src/codex-protocol/v2/SkillsConfigWriteResponse.ts +5 -0
- package/src/codex-protocol/v2/SkillsListEntry.ts +7 -0
- package/src/codex-protocol/v2/SkillsListParams.ts +13 -0
- package/src/codex-protocol/v2/SkillsListResponse.ts +6 -0
- package/src/codex-protocol/v2/SortDirection.ts +5 -0
- package/src/codex-protocol/v2/SubagentMigration.ts +5 -0
- package/src/codex-protocol/v2/TerminalInteractionNotification.ts +5 -0
- package/src/codex-protocol/v2/TextElement.ts +14 -0
- package/src/codex-protocol/v2/TextPosition.ts +13 -0
- package/src/codex-protocol/v2/TextRange.ts +6 -0
- package/src/codex-protocol/v2/Thread.ts +86 -0
- package/src/codex-protocol/v2/ThreadActiveFlag.ts +5 -0
- package/src/codex-protocol/v2/ThreadApproveGuardianDeniedActionParams.ts +10 -0
- package/src/codex-protocol/v2/ThreadApproveGuardianDeniedActionResponse.ts +5 -0
- package/src/codex-protocol/v2/ThreadArchiveParams.ts +5 -0
- package/src/codex-protocol/v2/ThreadArchiveResponse.ts +5 -0
- package/src/codex-protocol/v2/ThreadArchivedNotification.ts +5 -0
- package/src/codex-protocol/v2/ThreadBackgroundTerminalsCleanParams.ts +5 -0
- package/src/codex-protocol/v2/ThreadBackgroundTerminalsCleanResponse.ts +5 -0
- package/src/codex-protocol/v2/ThreadClosedNotification.ts +5 -0
- package/src/codex-protocol/v2/ThreadCompactStartParams.ts +5 -0
- package/src/codex-protocol/v2/ThreadCompactStartResponse.ts +5 -0
- package/src/codex-protocol/v2/ThreadDecrementElicitationParams.ts +12 -0
- package/src/codex-protocol/v2/ThreadDecrementElicitationResponse.ts +16 -0
- package/src/codex-protocol/v2/ThreadForkParams.ts +60 -0
- package/src/codex-protocol/v2/ThreadForkResponse.ts +35 -0
- package/src/codex-protocol/v2/ThreadGoal.ts +6 -0
- package/src/codex-protocol/v2/ThreadGoalClearParams.ts +5 -0
- package/src/codex-protocol/v2/ThreadGoalClearResponse.ts +5 -0
- package/src/codex-protocol/v2/ThreadGoalClearedNotification.ts +5 -0
- package/src/codex-protocol/v2/ThreadGoalGetParams.ts +5 -0
- package/src/codex-protocol/v2/ThreadGoalGetResponse.ts +6 -0
- package/src/codex-protocol/v2/ThreadGoalSetParams.ts +6 -0
- package/src/codex-protocol/v2/ThreadGoalSetResponse.ts +6 -0
- package/src/codex-protocol/v2/ThreadGoalStatus.ts +5 -0
- package/src/codex-protocol/v2/ThreadGoalUpdatedNotification.ts +6 -0
- package/src/codex-protocol/v2/ThreadIncrementElicitationParams.ts +12 -0
- package/src/codex-protocol/v2/ThreadIncrementElicitationResponse.ts +16 -0
- package/src/codex-protocol/v2/ThreadInjectItemsParams.ts +10 -0
- package/src/codex-protocol/v2/ThreadInjectItemsResponse.ts +5 -0
- package/src/codex-protocol/v2/ThreadItem.ts +101 -0
- package/src/codex-protocol/v2/ThreadListParams.ts +54 -0
- package/src/codex-protocol/v2/ThreadListResponse.ts +18 -0
- package/src/codex-protocol/v2/ThreadLoadedListParams.ts +13 -0
- package/src/codex-protocol/v2/ThreadLoadedListResponse.ts +14 -0
- package/src/codex-protocol/v2/ThreadMemoryModeSetParams.ts +6 -0
- package/src/codex-protocol/v2/ThreadMemoryModeSetResponse.ts +5 -0
- package/src/codex-protocol/v2/ThreadMetadataGitInfoUpdateParams.ts +20 -0
- package/src/codex-protocol/v2/ThreadMetadataUpdateParams.ts +12 -0
- package/src/codex-protocol/v2/ThreadMetadataUpdateResponse.ts +6 -0
- package/src/codex-protocol/v2/ThreadNameUpdatedNotification.ts +5 -0
- package/src/codex-protocol/v2/ThreadReadParams.ts +9 -0
- package/src/codex-protocol/v2/ThreadReadResponse.ts +6 -0
- package/src/codex-protocol/v2/ThreadRealtimeAppendAudioParams.ts +9 -0
- package/src/codex-protocol/v2/ThreadRealtimeAppendAudioResponse.ts +8 -0
- package/src/codex-protocol/v2/ThreadRealtimeAppendTextParams.ts +8 -0
- package/src/codex-protocol/v2/ThreadRealtimeAppendTextResponse.ts +8 -0
- package/src/codex-protocol/v2/ThreadRealtimeAudioChunk.ts +8 -0
- package/src/codex-protocol/v2/ThreadRealtimeClosedNotification.ts +8 -0
- package/src/codex-protocol/v2/ThreadRealtimeErrorNotification.ts +8 -0
- package/src/codex-protocol/v2/ThreadRealtimeItemAddedNotification.ts +9 -0
- package/src/codex-protocol/v2/ThreadRealtimeListVoicesParams.ts +8 -0
- package/src/codex-protocol/v2/ThreadRealtimeListVoicesResponse.ts +9 -0
- package/src/codex-protocol/v2/ThreadRealtimeOutputAudioDeltaNotification.ts +9 -0
- package/src/codex-protocol/v2/ThreadRealtimeSdpNotification.ts +8 -0
- package/src/codex-protocol/v2/ThreadRealtimeStartParams.ts +16 -0
- package/src/codex-protocol/v2/ThreadRealtimeStartResponse.ts +8 -0
- package/src/codex-protocol/v2/ThreadRealtimeStartTransport.ts +13 -0
- package/src/codex-protocol/v2/ThreadRealtimeStartedNotification.ts +9 -0
- package/src/codex-protocol/v2/ThreadRealtimeStopParams.ts +8 -0
- package/src/codex-protocol/v2/ThreadRealtimeStopResponse.ts +8 -0
- package/src/codex-protocol/v2/ThreadRealtimeTranscriptDeltaNotification.ts +13 -0
- package/src/codex-protocol/v2/ThreadRealtimeTranscriptDoneNotification.ts +13 -0
- package/src/codex-protocol/v2/ThreadResumeParams.ts +71 -0
- package/src/codex-protocol/v2/ThreadResumeResponse.ts +35 -0
- package/src/codex-protocol/v2/ThreadRollbackParams.ts +12 -0
- package/src/codex-protocol/v2/ThreadRollbackResponse.ts +14 -0
- package/src/codex-protocol/v2/ThreadSetNameParams.ts +5 -0
- package/src/codex-protocol/v2/ThreadSetNameResponse.ts +5 -0
- package/src/codex-protocol/v2/ThreadSettings.ts +14 -0
- package/src/codex-protocol/v2/ThreadSettingsUpdateParams.ts +61 -0
- package/src/codex-protocol/v2/ThreadSettingsUpdateResponse.ts +5 -0
- package/src/codex-protocol/v2/ThreadSettingsUpdatedNotification.ts +6 -0
- package/src/codex-protocol/v2/ThreadShellCommandParams.ts +12 -0
- package/src/codex-protocol/v2/ThreadShellCommandResponse.ts +5 -0
- package/src/codex-protocol/v2/ThreadSortKey.ts +5 -0
- package/src/codex-protocol/v2/ThreadSource.ts +5 -0
- package/src/codex-protocol/v2/ThreadSourceKind.ts +5 -0
- package/src/codex-protocol/v2/ThreadStartParams.ts +57 -0
- package/src/codex-protocol/v2/ThreadStartResponse.ts +35 -0
- package/src/codex-protocol/v2/ThreadStartSource.ts +5 -0
- package/src/codex-protocol/v2/ThreadStartedNotification.ts +6 -0
- package/src/codex-protocol/v2/ThreadStatus.ts +6 -0
- package/src/codex-protocol/v2/ThreadStatusChangedNotification.ts +6 -0
- package/src/codex-protocol/v2/ThreadTokenUsage.ts +6 -0
- package/src/codex-protocol/v2/ThreadTokenUsageUpdatedNotification.ts +6 -0
- package/src/codex-protocol/v2/ThreadTurnsItemsListParams.ts +18 -0
- package/src/codex-protocol/v2/ThreadTurnsItemsListResponse.ts +16 -0
- package/src/codex-protocol/v2/ThreadTurnsListParams.ts +23 -0
- package/src/codex-protocol/v2/ThreadTurnsListResponse.ts +18 -0
- package/src/codex-protocol/v2/ThreadUnarchiveParams.ts +5 -0
- package/src/codex-protocol/v2/ThreadUnarchiveResponse.ts +6 -0
- package/src/codex-protocol/v2/ThreadUnarchivedNotification.ts +5 -0
- package/src/codex-protocol/v2/ThreadUnsubscribeParams.ts +5 -0
- package/src/codex-protocol/v2/ThreadUnsubscribeResponse.ts +6 -0
- package/src/codex-protocol/v2/ThreadUnsubscribeStatus.ts +5 -0
- package/src/codex-protocol/v2/TokenUsageBreakdown.ts +5 -0
- package/src/codex-protocol/v2/ToolRequestUserInputAnswer.ts +8 -0
- package/src/codex-protocol/v2/ToolRequestUserInputOption.ts +8 -0
- package/src/codex-protocol/v2/ToolRequestUserInputParams.ts +9 -0
- package/src/codex-protocol/v2/ToolRequestUserInputQuestion.ts +9 -0
- package/src/codex-protocol/v2/ToolRequestUserInputResponse.ts +9 -0
- package/src/codex-protocol/v2/ToolsV2.ts +6 -0
- package/src/codex-protocol/v2/Turn.ts +33 -0
- package/src/codex-protocol/v2/TurnCompletedNotification.ts +6 -0
- package/src/codex-protocol/v2/TurnDiffUpdatedNotification.ts +9 -0
- package/src/codex-protocol/v2/TurnEnvironmentParams.ts +6 -0
- package/src/codex-protocol/v2/TurnError.ts +6 -0
- package/src/codex-protocol/v2/TurnInterruptParams.ts +5 -0
- package/src/codex-protocol/v2/TurnInterruptResponse.ts +5 -0
- package/src/codex-protocol/v2/TurnItemsView.ts +5 -0
- package/src/codex-protocol/v2/TurnPlanStep.ts +6 -0
- package/src/codex-protocol/v2/TurnPlanStepStatus.ts +5 -0
- package/src/codex-protocol/v2/TurnPlanUpdatedNotification.ts +6 -0
- package/src/codex-protocol/v2/TurnStartParams.ts +88 -0
- package/src/codex-protocol/v2/TurnStartResponse.ts +6 -0
- package/src/codex-protocol/v2/TurnStartedNotification.ts +6 -0
- package/src/codex-protocol/v2/TurnStatus.ts +5 -0
- package/src/codex-protocol/v2/TurnSteerParams.ts +15 -0
- package/src/codex-protocol/v2/TurnSteerResponse.ts +5 -0
- package/src/codex-protocol/v2/UserInput.ts +11 -0
- package/src/codex-protocol/v2/WarningNotification.ts +13 -0
- package/src/codex-protocol/v2/WebSearchAction.ts +5 -0
- package/src/codex-protocol/v2/WindowsSandboxReadiness.ts +5 -0
- package/src/codex-protocol/v2/WindowsSandboxReadinessResponse.ts +6 -0
- package/src/codex-protocol/v2/WindowsSandboxSetupCompletedNotification.ts +6 -0
- package/src/codex-protocol/v2/WindowsSandboxSetupMode.ts +5 -0
- package/src/codex-protocol/v2/WindowsSandboxSetupStartParams.ts +7 -0
- package/src/codex-protocol/v2/WindowsSandboxSetupStartResponse.ts +5 -0
- package/src/codex-protocol/v2/WindowsWorldWritableWarningNotification.ts +5 -0
- package/src/codex-protocol/v2/WriteStatus.ts +5 -0
- package/src/codex-protocol/v2/index.ts +503 -0
- package/src/column.ts +44 -0
- package/src/engines/claude/claude-engine.ts +769 -0
- package/src/engines/claude/clock.ts +48 -0
- package/src/engines/claude/compact.ts +107 -0
- package/src/engines/claude/ctx.ts +239 -0
- package/src/engines/claude/doctor.ts +202 -0
- package/src/engines/claude/env.ts +16 -0
- package/src/engines/claude/history.ts +504 -0
- package/src/engines/claude/identifiers.ts +25 -0
- package/src/engines/claude/identity-migration.ts +16 -0
- package/src/engines/claude/idle.ts +91 -0
- package/src/engines/claude/keys.ts +163 -0
- package/src/engines/claude/last.ts +52 -0
- package/src/engines/claude/mem.ts +124 -0
- package/src/engines/claude/persistence.ts +41 -0
- package/src/engines/claude/post-turn.ts +45 -0
- package/src/engines/claude/reload.ts +53 -0
- package/src/engines/claude/repo-fs.ts +63 -0
- package/src/engines/claude/resume.ts +145 -0
- package/src/engines/claude/send.ts +86 -0
- package/src/engines/claude/spawn.ts +435 -0
- package/src/engines/claude/state.ts +124 -0
- package/src/engines/claude/tmux.ts +99 -0
- package/src/engines/claude/wait-signals.ts +128 -0
- package/src/engines/claude/wait.ts +59 -0
- package/src/engines/codex/ask.ts +69 -0
- package/src/engines/codex/engine.ts +1261 -0
- package/src/engines/codex/events.ts +106 -0
- package/src/engines/codex/history.ts +385 -0
- package/src/engines/codex/identity-migration.ts +14 -0
- package/src/engines/codex/ipc-bridge-process.ts +14 -0
- package/src/engines/codex/ipc-bridge.ts +844 -0
- package/src/engines/codex/persistence.ts +236 -0
- package/src/engines/codex/rollout.ts +384 -0
- package/src/engines/codex/rpc.ts +311 -0
- package/src/engines/codex/supervisor.ts +648 -0
- package/src/engines/codex/ui-ipc.ts +374 -0
- package/src/engines/codex/verb-common.ts +34 -0
- package/src/engines/codex/verb-lifecycle.ts +94 -0
- package/src/engines/codex/verb-state.ts +19 -0
- package/src/engines/codex/verb-turns.ts +49 -0
- package/src/engines/codex/verbs.ts +15 -0
- package/src/engines/engine.ts +91 -0
- package/src/engines/git-worktree.ts +137 -0
- package/src/engines/production.ts +19 -0
- package/src/engines/registry.ts +70 -0
- package/src/engines/teammate-record.ts +113 -0
- package/src/engines/types.ts +334 -0
- package/src/env.ts +29 -0
- package/src/grep.ts +39 -0
- package/src/help.ts +433 -0
- package/src/identity/name.ts +58 -0
- package/src/identity/router.ts +80 -0
- package/src/identity/uuid-prefix.ts +40 -0
- package/src/main.ts +39 -0
- package/src/persistence/atomic-file.ts +74 -0
- package/src/persistence/identity-store.ts +294 -0
- package/src/persistence/identity-writer.ts +28 -0
- package/src/persistence/paths.ts +138 -0
- package/src/plugin-root.ts +26 -0
- package/src/proc.ts +66 -0
- package/src/shared/verb-args.ts +331 -0
- package/src/tm.ts +54 -0
- package/src/tmux.ts +57 -0
- package/src/verbs/archive.ts +211 -0
- package/src/verbs/ask.ts +29 -0
- package/src/verbs/compact.ts +25 -0
- package/src/verbs/context.ts +68 -0
- package/src/verbs/ctx.ts +21 -0
- package/src/verbs/format.ts +213 -0
- package/src/verbs/history.ts +190 -0
- package/src/verbs/kill.ts +61 -0
- package/src/verbs/last.ts +34 -0
- package/src/verbs/ls.ts +27 -0
- package/src/verbs/mem.ts +40 -0
- package/src/verbs/poll.ts +61 -0
- package/src/verbs/reload.ts +17 -0
- package/src/verbs/resolve.ts +14 -0
- package/src/verbs/resume.ts +170 -0
- package/src/verbs/send.ts +36 -0
- package/src/verbs/spawn.ts +81 -0
- package/src/verbs/states.ts +74 -0
- package/src/verbs/status.ts +26 -0
- package/src/verbs/wait.ts +40 -0
- package/src/verbs.ts +56 -0
- package/src/ws-types.d.ts +9 -0
- package/third_party/ws/LICENSE +20 -0
- package/third_party/ws/README.md +548 -0
- package/third_party/ws/UPSTREAM.md +55 -0
- package/third_party/ws/browser.js +8 -0
- package/third_party/ws/index.js +22 -0
- package/third_party/ws/lib/buffer-util.js +131 -0
- package/third_party/ws/lib/constants.js +19 -0
- package/third_party/ws/lib/event-target.js +292 -0
- package/third_party/ws/lib/extension.js +203 -0
- package/third_party/ws/lib/limiter.js +55 -0
- package/third_party/ws/lib/permessage-deflate.js +528 -0
- package/third_party/ws/lib/receiver.js +760 -0
- package/third_party/ws/lib/sender.js +607 -0
- package/third_party/ws/lib/stream.js +161 -0
- package/third_party/ws/lib/subprotocol.js +62 -0
- package/third_party/ws/lib/validation.js +152 -0
- package/third_party/ws/lib/websocket-server.js +562 -0
- package/third_party/ws/lib/websocket.js +1407 -0
- package/third_party/ws/package.json +13 -0
- package/third_party/ws/wrapper.mjs +21 -0
|
@@ -0,0 +1,648 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Process supervision for the codex app-server daemons.
|
|
3
|
+
*
|
|
4
|
+
* Decision node-cli-orchestrator §5 puts daemon lifecycle on claudemux: the codex
|
|
5
|
+
* `app-server` is a long-lived process that outlives any single `tm`
|
|
6
|
+
* invocation, and with no resident core to hold it, `tm` owns spawning,
|
|
7
|
+
* liveness checking, and reaping. The state lives on the filesystem under
|
|
8
|
+
* `/tmp/teammate-codex/<name>/` — the path builders are in
|
|
9
|
+
* [`persistence.ts`](./persistence.ts), this module is the *operations* on top.
|
|
10
|
+
*
|
|
11
|
+
* What this module does **not** do:
|
|
12
|
+
*
|
|
13
|
+
* - It does not talk the protocol. The WebSocket client lives in
|
|
14
|
+
* [`rpc.ts`](./rpc.ts); a verb opens a connection to
|
|
15
|
+
* `codexSocketPath(name)` after the supervisor has reconciled the
|
|
16
|
+
* daemon. Lifecycle and traffic are kept on separate layers so a
|
|
17
|
+
* verb that fails to deliver a turn does not get confused for a
|
|
18
|
+
* verb whose daemon was never up.
|
|
19
|
+
* - It does not know about teammate semantics (one daemon per repo,
|
|
20
|
+
* ask-mode pool, etc.). The `name` is opaque here — the verb code
|
|
21
|
+
* decides what name to spawn under.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import {
|
|
25
|
+
spawn as spawnChild,
|
|
26
|
+
type ChildProcess,
|
|
27
|
+
type SpawnOptions,
|
|
28
|
+
} from 'node:child_process'
|
|
29
|
+
import { dirname, join } from 'node:path'
|
|
30
|
+
import { fileURLToPath } from 'node:url'
|
|
31
|
+
import {
|
|
32
|
+
closeSync,
|
|
33
|
+
existsSync,
|
|
34
|
+
mkdirSync,
|
|
35
|
+
openSync,
|
|
36
|
+
readFileSync,
|
|
37
|
+
readdirSync,
|
|
38
|
+
renameSync,
|
|
39
|
+
rmdirSync,
|
|
40
|
+
rmSync,
|
|
41
|
+
statSync,
|
|
42
|
+
writeFileSync,
|
|
43
|
+
writeSync,
|
|
44
|
+
} from 'node:fs'
|
|
45
|
+
|
|
46
|
+
import {
|
|
47
|
+
codexBorrowLockFile,
|
|
48
|
+
codexIpcBridgePidFile,
|
|
49
|
+
codexIpcBridgeStderrLogFile,
|
|
50
|
+
codexIpcBridgeStdoutLogFile,
|
|
51
|
+
codexLastSeenFile,
|
|
52
|
+
codexMetaFile,
|
|
53
|
+
codexPidFile,
|
|
54
|
+
codexRegistryRoot,
|
|
55
|
+
codexSocketPath,
|
|
56
|
+
codexStartedAtFile,
|
|
57
|
+
codexStderrLogFile,
|
|
58
|
+
codexTeammateDir,
|
|
59
|
+
codexThreadFile,
|
|
60
|
+
codexStdoutLogFile,
|
|
61
|
+
} from './persistence.js'
|
|
62
|
+
import { validateTeammateName } from '../../identity/name.js'
|
|
63
|
+
|
|
64
|
+
/** Snapshot of one daemon's on-disk state. `null` for a missing entry. */
|
|
65
|
+
export interface DaemonState {
|
|
66
|
+
name: string
|
|
67
|
+
pid: number
|
|
68
|
+
startedAt: number
|
|
69
|
+
socketPath: string
|
|
70
|
+
threadId: string | null
|
|
71
|
+
lastSeen: number | null
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export class CodexDaemonSpawnInProgressError extends Error {
|
|
75
|
+
constructor(name: string) {
|
|
76
|
+
super(`codex daemon '${name}' is already being spawned`)
|
|
77
|
+
this.name = 'CodexDaemonSpawnInProgressError'
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export class CodexDaemonAlreadyAliveError extends Error {
|
|
82
|
+
constructor(name: string, pid: number | string) {
|
|
83
|
+
super(`codex daemon '${name}' is already alive (pid ${pid}); reap it first with tm doctor / tm kill`)
|
|
84
|
+
this.name = 'CodexDaemonAlreadyAliveError'
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export interface SpawnDaemonOptions {
|
|
89
|
+
/** The teammate name (the registry subdirectory name). */
|
|
90
|
+
name: string
|
|
91
|
+
/**
|
|
92
|
+
* The codex executable. Default `'codex'` — relies on `PATH`. Tests
|
|
93
|
+
* pass an absolute path to a fake binary; the live integration suite
|
|
94
|
+
* relies on the user's installed `codex`.
|
|
95
|
+
*/
|
|
96
|
+
binPath?: string
|
|
97
|
+
/**
|
|
98
|
+
* Extra args to append after `app-server --listen unix://<socket>`.
|
|
99
|
+
* The supervisor itself sets `--listen`; everything else (model,
|
|
100
|
+
* approval policy, sandbox) is the caller's choice.
|
|
101
|
+
*/
|
|
102
|
+
extraArgs?: string[]
|
|
103
|
+
/** Working directory for the spawned daemon. Default `process.cwd()`. */
|
|
104
|
+
cwd?: string
|
|
105
|
+
/** Environment for the spawned daemon. Default `process.env`. */
|
|
106
|
+
env?: NodeJS.ProcessEnv
|
|
107
|
+
/**
|
|
108
|
+
* Ready-probe timeout in milliseconds — how long the supervisor will
|
|
109
|
+
* wait for the daemon to bind its listen socket before treating spawn
|
|
110
|
+
* as a failure. Default 10000ms.
|
|
111
|
+
*/
|
|
112
|
+
readyTimeoutMs?: number
|
|
113
|
+
/**
|
|
114
|
+
* JSON-serializable spawn-time configuration (model, reasoning effort,
|
|
115
|
+
* approval policy, …). Persisted to `meta.json` so `tm doctor` and a
|
|
116
|
+
* future `tm resume` can read it back. Pass `null` to skip writing.
|
|
117
|
+
*/
|
|
118
|
+
meta?: unknown
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/** Atomic write: write to a sibling .tmp file and rename into place. */
|
|
122
|
+
function atomicWrite(path: string, content: string): void {
|
|
123
|
+
const tmpPath = `${path}.tmp`
|
|
124
|
+
const fd = openSync(tmpPath, 'w', 0o600)
|
|
125
|
+
try {
|
|
126
|
+
writeSync(fd, content)
|
|
127
|
+
} finally {
|
|
128
|
+
closeSync(fd)
|
|
129
|
+
}
|
|
130
|
+
renameSync(tmpPath, path)
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function readIntFile(path: string): number | null {
|
|
134
|
+
try {
|
|
135
|
+
const txt = readFileSync(path, 'utf8').trim()
|
|
136
|
+
if (txt === '') return null
|
|
137
|
+
const n = Number.parseInt(txt, 10)
|
|
138
|
+
return Number.isFinite(n) ? n : null
|
|
139
|
+
} catch {
|
|
140
|
+
return null
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function readTextFile(path: string): string | null {
|
|
145
|
+
try {
|
|
146
|
+
return readFileSync(path, 'utf8').trim() || null
|
|
147
|
+
} catch {
|
|
148
|
+
return null
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function codexIpcBridgeDisabled(env: NodeJS.ProcessEnv): boolean {
|
|
153
|
+
return env['CLAUDEMUX_CODEX_IPC_BRIDGE'] === '0' || env['VITEST'] !== undefined
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const CODEX_IPC_BRIDGE_PID_RESERVATION_STALE_MS = 10000
|
|
157
|
+
|
|
158
|
+
function ipcBridgePidFileIsBusy(name: string): boolean {
|
|
159
|
+
const pidPath = codexIpcBridgePidFile(name)
|
|
160
|
+
const existingPid = readIntFile(pidPath)
|
|
161
|
+
if (existingPid !== null) {
|
|
162
|
+
if (isProcessAlive(existingPid)) return true
|
|
163
|
+
rmSync(pidPath, { force: true })
|
|
164
|
+
return false
|
|
165
|
+
}
|
|
166
|
+
if (!existsSync(pidPath)) return false
|
|
167
|
+
try {
|
|
168
|
+
const ageMs = Date.now() - statSync(pidPath).mtimeMs
|
|
169
|
+
if (ageMs < CODEX_IPC_BRIDGE_PID_RESERVATION_STALE_MS) return true
|
|
170
|
+
} catch {
|
|
171
|
+
return true
|
|
172
|
+
}
|
|
173
|
+
rmSync(pidPath, { force: true })
|
|
174
|
+
return false
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function clearStaleBorrowLock(name: string): void {
|
|
178
|
+
const lockPath = codexBorrowLockFile(name)
|
|
179
|
+
const pid = readIntFile(lockPath)
|
|
180
|
+
if (pid === null) return
|
|
181
|
+
if (!isProcessAlive(pid)) rmSync(lockPath, { force: true })
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function codexSpawnLockFile(name: string): string {
|
|
185
|
+
return `${codexTeammateDir(name)}.spawn.lock`
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function nowSec(): number {
|
|
189
|
+
return Math.floor(Date.now() / 1000)
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/** `true` if `pid` names a live process this uid can signal. */
|
|
193
|
+
export function isProcessAlive(pid: number): boolean {
|
|
194
|
+
if (!Number.isFinite(pid) || pid <= 0) return false
|
|
195
|
+
try {
|
|
196
|
+
// The 0 signal probes for the process without delivering anything;
|
|
197
|
+
// throws ESRCH if there is no such pid, EPERM if it exists but is
|
|
198
|
+
// owned by another uid (which we count as "alive but we cannot reap"
|
|
199
|
+
// — still a live process). The other errnos are pathological and
|
|
200
|
+
// counted as "not alive" to keep the caller moving.
|
|
201
|
+
process.kill(pid, 0)
|
|
202
|
+
return true
|
|
203
|
+
} catch (e) {
|
|
204
|
+
const errno = (e as NodeJS.ErrnoException).code
|
|
205
|
+
if (errno === 'EPERM') return true
|
|
206
|
+
return false
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Send `signal` to every process in the group led by `pgid`.
|
|
212
|
+
*
|
|
213
|
+
* The codex CLI is a node wrapper that `spawn`s the real rust binary
|
|
214
|
+
* as a child, so a spawned daemon is two pids: the wrapper (PPID == us,
|
|
215
|
+
* which we record) and the rust process (PPID == wrapper). Both land
|
|
216
|
+
* in the same process group, with the wrapper as the group leader —
|
|
217
|
+
* `child_process.spawn({ detached: true })` arranges this on POSIX,
|
|
218
|
+
* no explicit `setpgid` needed.
|
|
219
|
+
*
|
|
220
|
+
* Killing only the leader pid (the historical behaviour) left the
|
|
221
|
+
* child reparented to init and quietly consuming the unix socket;
|
|
222
|
+
* `tm doctor` would `rm -rf` the registry directory but the rust
|
|
223
|
+
* process would keep running until the box rebooted. The dispatcher
|
|
224
|
+
* found 11 leaked codex processes from a single afternoon of stage 4
|
|
225
|
+
* dogfooding this way.
|
|
226
|
+
*
|
|
227
|
+
* Posix `kill(-pgid, sig)` delivers to every process in the group,
|
|
228
|
+
* including the reparented child. Node's `process.kill` passes the
|
|
229
|
+
* negative pid through unchanged. ESRCH (empty group, every member
|
|
230
|
+
* has exited) is the expected idempotent case; EPERM (the caller's
|
|
231
|
+
* uid cannot signal the target — rare for processes we spawned, but
|
|
232
|
+
* possible if a process has setuid'd to a different uid post-spawn)
|
|
233
|
+
* is also swallowed as "nothing more we can do from here". Both
|
|
234
|
+
* count as success from this function's point of view.
|
|
235
|
+
*/
|
|
236
|
+
export function killProcessGroup(pgid: number, signal: NodeJS.Signals | number): void {
|
|
237
|
+
if (!Number.isFinite(pgid) || pgid <= 0) return
|
|
238
|
+
try {
|
|
239
|
+
process.kill(-pgid, signal)
|
|
240
|
+
} catch (e) {
|
|
241
|
+
const errno = (e as NodeJS.ErrnoException).code
|
|
242
|
+
if (errno === 'ESRCH' || errno === 'EPERM') return
|
|
243
|
+
// Anything else (EINVAL on an unsupported signal, etc) is the
|
|
244
|
+
// caller's bug, not a runtime condition — let it surface.
|
|
245
|
+
throw e
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/** Read the on-disk state for one daemon. `null` if no registry entry. */
|
|
250
|
+
export function readDaemonState(name: string): DaemonState | null {
|
|
251
|
+
const pid = readIntFile(codexPidFile(name))
|
|
252
|
+
const startedAt = readIntFile(codexStartedAtFile(name))
|
|
253
|
+
if (pid === null || startedAt === null) return null
|
|
254
|
+
return {
|
|
255
|
+
name,
|
|
256
|
+
pid,
|
|
257
|
+
startedAt,
|
|
258
|
+
socketPath: codexSocketPath(name),
|
|
259
|
+
threadId: readTextFile(codexThreadFile(name)),
|
|
260
|
+
lastSeen: readIntFile(codexLastSeenFile(name)),
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/** Is the daemon at `name` alive right now? */
|
|
265
|
+
export function daemonAlive(name: string): boolean {
|
|
266
|
+
const state = readDaemonState(name)
|
|
267
|
+
if (state === null) return false
|
|
268
|
+
return isProcessAlive(state.pid)
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/** Is a spawn currently reserving or starting this daemon? */
|
|
272
|
+
export function daemonSpawnInProgress(name: string): boolean {
|
|
273
|
+
const lockPath = codexSpawnLockFile(name)
|
|
274
|
+
const pid = readIntFile(lockPath)
|
|
275
|
+
if (pid === null) return existsSync(lockPath)
|
|
276
|
+
if (isProcessAlive(pid)) return true
|
|
277
|
+
rmSync(lockPath, { force: true })
|
|
278
|
+
return false
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/** Names of every registry entry, alive or stale. */
|
|
282
|
+
export function listDaemons(): string[] {
|
|
283
|
+
try {
|
|
284
|
+
const root = codexRegistryRoot()
|
|
285
|
+
const names: string[] = []
|
|
286
|
+
const walk = (dir: string, prefix: string): void => {
|
|
287
|
+
if (prefix.length > 0 && existsSync(join(dir, 'pid'))) names.push(prefix)
|
|
288
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
289
|
+
if (!entry.isDirectory()) continue
|
|
290
|
+
const childPrefix = prefix.length === 0 ? entry.name : `${prefix}/${entry.name}`
|
|
291
|
+
walk(join(dir, entry.name), childPrefix)
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
walk(root, '')
|
|
295
|
+
return names.filter((name) => validateTeammateName(name).kind === 'ok').sort()
|
|
296
|
+
} catch (e) {
|
|
297
|
+
if ((e as NodeJS.ErrnoException).code === 'ENOENT') return []
|
|
298
|
+
throw e
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/** Is a codex daemon currently borrowed by a direct turn (`send` / `ask`)? */
|
|
303
|
+
export function daemonBorrowed(name: string): boolean {
|
|
304
|
+
clearStaleBorrowLock(name)
|
|
305
|
+
return existsSync(codexBorrowLockFile(name))
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/** Try to borrow a daemon for one direct turn. Returns false when another caller holds it. */
|
|
309
|
+
export function tryBorrowDaemon(name: string): boolean {
|
|
310
|
+
clearStaleBorrowLock(name)
|
|
311
|
+
try {
|
|
312
|
+
const fd = openSync(codexBorrowLockFile(name), 'wx', 0o600)
|
|
313
|
+
try {
|
|
314
|
+
writeSync(fd, `${process.pid}\n`)
|
|
315
|
+
} finally {
|
|
316
|
+
closeSync(fd)
|
|
317
|
+
}
|
|
318
|
+
return true
|
|
319
|
+
} catch {
|
|
320
|
+
return false
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/** Release a daemon borrow lock. Idempotent. */
|
|
325
|
+
export function releaseDaemonBorrow(name: string): void {
|
|
326
|
+
rmSync(codexBorrowLockFile(name), { force: true })
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
function removeSelfRegistry(name: string): void {
|
|
330
|
+
for (const file of [
|
|
331
|
+
codexPidFile(name),
|
|
332
|
+
codexSocketPath(name),
|
|
333
|
+
codexStartedAtFile(name),
|
|
334
|
+
codexThreadFile(name),
|
|
335
|
+
codexLastSeenFile(name),
|
|
336
|
+
codexStdoutLogFile(name),
|
|
337
|
+
codexStderrLogFile(name),
|
|
338
|
+
codexIpcBridgePidFile(name),
|
|
339
|
+
codexIpcBridgeStdoutLogFile(name),
|
|
340
|
+
codexIpcBridgeStderrLogFile(name),
|
|
341
|
+
codexMetaFile(name),
|
|
342
|
+
codexBorrowLockFile(name),
|
|
343
|
+
]) {
|
|
344
|
+
rmSync(file, { force: true })
|
|
345
|
+
}
|
|
346
|
+
try {
|
|
347
|
+
rmdirSync(codexTeammateDir(name))
|
|
348
|
+
} catch (e) {
|
|
349
|
+
const code = (e as NodeJS.ErrnoException).code
|
|
350
|
+
if (code !== 'ENOENT' && code !== 'ENOTEMPTY' && code !== 'EEXIST') throw e
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
export function ensureCodexIpcBridge(
|
|
355
|
+
name: string,
|
|
356
|
+
opts: { readonly cwd?: string; readonly env?: NodeJS.ProcessEnv } = {},
|
|
357
|
+
): void {
|
|
358
|
+
const env = opts.env ?? process.env
|
|
359
|
+
if (codexIpcBridgeDisabled(env)) return
|
|
360
|
+
const pidPath = codexIpcBridgePidFile(name)
|
|
361
|
+
if (ipcBridgePidFileIsBusy(name)) return
|
|
362
|
+
mkdirSync(codexTeammateDir(name), { recursive: true })
|
|
363
|
+
|
|
364
|
+
let pidFd: number | null = null
|
|
365
|
+
let stdoutFd: number | null = null
|
|
366
|
+
let stderrFd: number | null = null
|
|
367
|
+
try {
|
|
368
|
+
pidFd = openSync(pidPath, 'wx', 0o600)
|
|
369
|
+
} catch {
|
|
370
|
+
return
|
|
371
|
+
}
|
|
372
|
+
try {
|
|
373
|
+
stdoutFd = openSync(codexIpcBridgeStdoutLogFile(name), 'a', 0o600)
|
|
374
|
+
stderrFd = openSync(codexIpcBridgeStderrLogFile(name), 'a', 0o600)
|
|
375
|
+
const scriptPath = fileURLToPath(new URL('./ipc-bridge-process.ts', import.meta.url))
|
|
376
|
+
const child = spawnChild(
|
|
377
|
+
process.execPath,
|
|
378
|
+
[...process.execArgv, scriptPath, name],
|
|
379
|
+
{
|
|
380
|
+
cwd: opts.cwd ?? process.cwd(),
|
|
381
|
+
env,
|
|
382
|
+
detached: true,
|
|
383
|
+
stdio: ['ignore', stdoutFd, stderrFd],
|
|
384
|
+
},
|
|
385
|
+
)
|
|
386
|
+
child.unref()
|
|
387
|
+
child.on('error', () => {
|
|
388
|
+
rmSync(pidPath, { force: true })
|
|
389
|
+
})
|
|
390
|
+
if (child.pid === undefined) throw new Error('codex IPC bridge spawned without a pid')
|
|
391
|
+
writeSync(pidFd, `${child.pid}\n`)
|
|
392
|
+
} catch {
|
|
393
|
+
rmSync(pidPath, { force: true })
|
|
394
|
+
} finally {
|
|
395
|
+
if (stdoutFd !== null) closeSync(stdoutFd)
|
|
396
|
+
if (stderrFd !== null) closeSync(stderrFd)
|
|
397
|
+
if (pidFd !== null) closeSync(pidFd)
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
function reapCodexIpcBridge(name: string): void {
|
|
402
|
+
const pid = readIntFile(codexIpcBridgePidFile(name))
|
|
403
|
+
if (pid === null) return
|
|
404
|
+
if (isProcessAlive(pid)) killProcessGroup(pid, 'SIGTERM')
|
|
405
|
+
killProcessGroup(pid, 'SIGKILL')
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/**
|
|
409
|
+
* Spawn one `codex app-server` daemon, detached so it outlives this `tm`
|
|
410
|
+
* invocation. Resolves once the listen socket exists on disk.
|
|
411
|
+
*
|
|
412
|
+
* On failure the daemon is killed (if it managed to start) and the
|
|
413
|
+
* registry entry torn back down — a half-spawned daemon is worse than
|
|
414
|
+
* none, because subsequent `tm` calls would mistake it for live.
|
|
415
|
+
*/
|
|
416
|
+
export async function spawnDaemon(opts: SpawnDaemonOptions): Promise<DaemonState> {
|
|
417
|
+
const { name } = opts
|
|
418
|
+
const dir = codexTeammateDir(name)
|
|
419
|
+
const socketPath = codexSocketPath(name)
|
|
420
|
+
const readyTimeoutMs = opts.readyTimeoutMs ?? 10000
|
|
421
|
+
const spawnLock = codexSpawnLockFile(name)
|
|
422
|
+
mkdirSync(dirname(spawnLock), { recursive: true })
|
|
423
|
+
let lockFd: number | null = null
|
|
424
|
+
try {
|
|
425
|
+
lockFd = openSync(spawnLock, 'wx', 0o600)
|
|
426
|
+
writeSync(lockFd, `${process.pid}\n`)
|
|
427
|
+
} catch {
|
|
428
|
+
throw new CodexDaemonSpawnInProgressError(name)
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
try {
|
|
432
|
+
if (daemonAlive(name)) {
|
|
433
|
+
throw new CodexDaemonAlreadyAliveError(name, readDaemonState(name)?.pid ?? '?')
|
|
434
|
+
}
|
|
435
|
+
// Stale entry — torn down first so we never carry a previous pid forward.
|
|
436
|
+
removeSelfRegistry(name)
|
|
437
|
+
mkdirSync(dir, { recursive: true })
|
|
438
|
+
|
|
439
|
+
const state = await spawnDaemonUnlocked(opts, socketPath, readyTimeoutMs)
|
|
440
|
+
return state
|
|
441
|
+
} finally {
|
|
442
|
+
if (lockFd !== null) closeSync(lockFd)
|
|
443
|
+
rmSync(spawnLock, { force: true })
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
async function spawnDaemonUnlocked(
|
|
448
|
+
opts: SpawnDaemonOptions,
|
|
449
|
+
socketPath: string,
|
|
450
|
+
readyTimeoutMs: number,
|
|
451
|
+
): Promise<DaemonState> {
|
|
452
|
+
const { name } = opts
|
|
453
|
+
// Precedence: explicit `opts.binPath` (tests) > `CLAUDEMUX_CODEX_BIN`
|
|
454
|
+
// env override (the integration-suite seam) > the default `'codex'`
|
|
455
|
+
// on PATH (production). The env hook lets the live-codex suite point
|
|
456
|
+
// at a non-default codex install without surgery on verb code.
|
|
457
|
+
//
|
|
458
|
+
// `||` not `??` for the env step: an empty string in the env is treated
|
|
459
|
+
// as "unset" (matching the bash `${VAR:-default}` convention this
|
|
460
|
+
// codebase chose elsewhere — see cli/context.ts). `opts.binPath` keeps
|
|
461
|
+
// `??` because an empty explicit option from a test would be a real
|
|
462
|
+
// intent to disable the binary, not a default-trigger.
|
|
463
|
+
const binPath =
|
|
464
|
+
opts.binPath ?? (process.env['CLAUDEMUX_CODEX_BIN'] || 'codex')
|
|
465
|
+
const args = ['app-server', '--listen', `unix://${socketPath}`, ...(opts.extraArgs ?? [])]
|
|
466
|
+
// Daemon stdio:
|
|
467
|
+
// stdin → /dev/null (ignored) — codex app-server is a pure socket server.
|
|
468
|
+
// stdout → `<dir>/stdout.log` — diagnostic; usually empty.
|
|
469
|
+
// stderr → `<dir>/stderr.log` — load-bearing. The codex protocol is
|
|
470
|
+
// `[experimental]`; when a request bounces or a turn aborts, codex
|
|
471
|
+
// writes its reason to stderr. Routing this to /dev/null hid the
|
|
472
|
+
// reason during stage 4 turn-roundtrip debugging — leave it on disk
|
|
473
|
+
// under the registry directory so `tail -f /tmp/teammate-codex/<n>/stderr.log`
|
|
474
|
+
// is one step away. The teammate's reap removes the directory and
|
|
475
|
+
// the log files with it.
|
|
476
|
+
const stdoutLog = codexStdoutLogFile(name)
|
|
477
|
+
const stderrLog = codexStderrLogFile(name)
|
|
478
|
+
const stdoutFd = openSync(stdoutLog, 'a', 0o600)
|
|
479
|
+
const stderrFd = openSync(stderrLog, 'a', 0o600)
|
|
480
|
+
const spawnOpts: SpawnOptions = {
|
|
481
|
+
cwd: opts.cwd ?? process.cwd(),
|
|
482
|
+
env: opts.env ?? process.env,
|
|
483
|
+
detached: true,
|
|
484
|
+
stdio: ['ignore', stdoutFd, stderrFd],
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
let child: ChildProcess
|
|
488
|
+
try {
|
|
489
|
+
child = await new Promise<ChildProcess>((resolve, reject) => {
|
|
490
|
+
let settled = false
|
|
491
|
+
const c = spawnChild(binPath, args, spawnOpts)
|
|
492
|
+
// Listening for `error` separately is mandatory — ENOENT (bad
|
|
493
|
+
// binPath) and EACCES (no exec bit) reach us as an `error` event,
|
|
494
|
+
// not a thrown exception from spawn(). Without this listener
|
|
495
|
+
// they become unhandled exceptions.
|
|
496
|
+
c.once('error', (e) => {
|
|
497
|
+
if (settled) return
|
|
498
|
+
settled = true
|
|
499
|
+
reject(e instanceof Error ? e : new Error(String(e)))
|
|
500
|
+
})
|
|
501
|
+
// `spawn` fires once the child has been spawned successfully —
|
|
502
|
+
// after this, we know the OS handed us a real pid.
|
|
503
|
+
c.once('spawn', () => {
|
|
504
|
+
if (settled) return
|
|
505
|
+
settled = true
|
|
506
|
+
resolve(c)
|
|
507
|
+
})
|
|
508
|
+
})
|
|
509
|
+
} catch (e) {
|
|
510
|
+
closeSync(stdoutFd)
|
|
511
|
+
closeSync(stderrFd)
|
|
512
|
+
removeSelfRegistry(name)
|
|
513
|
+
throw new Error(
|
|
514
|
+
`codex daemon '${name}' failed to spawn ${binPath}: ${(e as Error).message}`,
|
|
515
|
+
)
|
|
516
|
+
}
|
|
517
|
+
// The child holds its own duplicated fds for stdout/stderr after spawn;
|
|
518
|
+
// the parent's copies can be released so they don't leak across many
|
|
519
|
+
// spawn calls in long-running tests.
|
|
520
|
+
closeSync(stdoutFd)
|
|
521
|
+
closeSync(stderrFd)
|
|
522
|
+
// `unref` releases the parent's event loop from the child — the daemon
|
|
523
|
+
// keeps running after this Node process exits.
|
|
524
|
+
child.unref()
|
|
525
|
+
// Future `error` emissions (post-spawn) would still be unhandled. The
|
|
526
|
+
// child is detached and stdio-ignored, so the only thing left that
|
|
527
|
+
// could emit is a kill-signal handler failing; swallow it rather than
|
|
528
|
+
// crash the supervisor.
|
|
529
|
+
child.on('error', () => { /* daemon-side error, can no longer affect this invocation */ })
|
|
530
|
+
|
|
531
|
+
const pid = child.pid
|
|
532
|
+
if (pid === undefined) {
|
|
533
|
+
removeSelfRegistry(name)
|
|
534
|
+
throw new Error(`codex daemon '${name}' spawned without a pid`)
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
const startedAt = nowSec()
|
|
538
|
+
atomicWrite(codexPidFile(name), `${pid}\n`)
|
|
539
|
+
atomicWrite(codexStartedAtFile(name), `${startedAt}\n`)
|
|
540
|
+
if (opts.meta !== undefined && opts.meta !== null) {
|
|
541
|
+
atomicWrite(codexMetaFile(name), JSON.stringify(opts.meta, null, 2) + '\n')
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
try {
|
|
545
|
+
await waitForSocket(socketPath, pid, readyTimeoutMs)
|
|
546
|
+
} catch (e) {
|
|
547
|
+
// Daemon failed its readiness probe — kill it (if alive) and tear the
|
|
548
|
+
// registry entry back down. We do not want a half-spawned daemon
|
|
549
|
+
// lingering with a pid the next `tm` call would treat as healthy.
|
|
550
|
+
// Group-kill, not pid-kill — the codex node wrapper has already
|
|
551
|
+
// spawned the rust binary by the time `waitForSocket` times out
|
|
552
|
+
// in some failure modes, and a leader-only kill would orphan it.
|
|
553
|
+
killProcessGroup(pid, 'SIGKILL')
|
|
554
|
+
removeSelfRegistry(name)
|
|
555
|
+
throw e
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
return {
|
|
559
|
+
name,
|
|
560
|
+
pid,
|
|
561
|
+
startedAt,
|
|
562
|
+
socketPath,
|
|
563
|
+
threadId: null,
|
|
564
|
+
lastSeen: null,
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
/**
|
|
569
|
+
* Wait for `path` to exist on disk while `pid` stays alive. Returns when
|
|
570
|
+
* the socket appears, rejects when the process dies first or the deadline
|
|
571
|
+
* is reached. The poll interval is 25ms — fast enough that a healthy
|
|
572
|
+
* daemon (cold-start is a few hundred ms) clears the wait in a few ticks.
|
|
573
|
+
*/
|
|
574
|
+
async function waitForSocket(
|
|
575
|
+
path: string,
|
|
576
|
+
pid: number,
|
|
577
|
+
timeoutMs: number,
|
|
578
|
+
): Promise<void> {
|
|
579
|
+
const deadline = Date.now() + timeoutMs
|
|
580
|
+
while (Date.now() < deadline) {
|
|
581
|
+
if (existsSync(path)) {
|
|
582
|
+
// A socket node is `S_IFSOCK`; a stale regular file at the same
|
|
583
|
+
// path would also pass `existsSync`. Tighten the check so we only
|
|
584
|
+
// resolve when the daemon actually bound.
|
|
585
|
+
try {
|
|
586
|
+
const st = statSync(path)
|
|
587
|
+
if (st.isSocket()) return
|
|
588
|
+
} catch { /* race with daemon creating it — keep polling */ }
|
|
589
|
+
}
|
|
590
|
+
if (!isProcessAlive(pid)) {
|
|
591
|
+
throw new Error(
|
|
592
|
+
`codex daemon (pid ${pid}) exited before binding ${path}`,
|
|
593
|
+
)
|
|
594
|
+
}
|
|
595
|
+
await new Promise<void>((res) => setTimeout(res, 25))
|
|
596
|
+
}
|
|
597
|
+
throw new Error(
|
|
598
|
+
`codex daemon (pid ${pid}) did not bind ${path} within ${timeoutMs}ms`,
|
|
599
|
+
)
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
/**
|
|
603
|
+
* Tear a daemon down: SIGTERM the whole process group, give it 1s to
|
|
604
|
+
* exit cleanly, then SIGKILL the group, then remove this teammate's
|
|
605
|
+
* registry files. Idempotent — a missing entry, an already-dead leader,
|
|
606
|
+
* or a group that no longer has any members is not an error.
|
|
607
|
+
*
|
|
608
|
+
* Group-kill (`killProcessGroup`) rather than pid-kill is load-bearing:
|
|
609
|
+
* the codex node wrapper `spawn`s the rust binary as a child in its
|
|
610
|
+
* own process group; a SIGKILL to only the leader leaves the child
|
|
611
|
+
* reparented to init and still serving the unix socket. See the
|
|
612
|
+
* `killProcessGroup` docstring for the dispatcher-found orphan
|
|
613
|
+
* incident this fixes.
|
|
614
|
+
*
|
|
615
|
+
* The orphan-cleanup path matters even when the registry says the
|
|
616
|
+
* leader is dead — the group can still have a reparented member —
|
|
617
|
+
* so the SIGKILL fires unconditionally before registry cleanup.
|
|
618
|
+
*/
|
|
619
|
+
export async function reapDaemon(name: string): Promise<void> {
|
|
620
|
+
reapCodexIpcBridge(name)
|
|
621
|
+
const state = readDaemonState(name)
|
|
622
|
+
if (state !== null) {
|
|
623
|
+
if (isProcessAlive(state.pid)) {
|
|
624
|
+
killProcessGroup(state.pid, 'SIGTERM')
|
|
625
|
+
const deadline = Date.now() + 1000
|
|
626
|
+
while (Date.now() < deadline) {
|
|
627
|
+
if (!isProcessAlive(state.pid)) break
|
|
628
|
+
await new Promise<void>((res) => setTimeout(res, 25))
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
// Always SIGKILL the group, even if the leader is already dead —
|
|
632
|
+
// an orphan (the wrapper's child after the wrapper exited) shows
|
|
633
|
+
// up here as "leader gone, group still has members" and is the
|
|
634
|
+
// exact case we are guarding against.
|
|
635
|
+
killProcessGroup(state.pid, 'SIGKILL')
|
|
636
|
+
}
|
|
637
|
+
removeSelfRegistry(name)
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
/** Touch `last-seen` for `name` — call after a successful RPC. */
|
|
641
|
+
export function touchLastSeen(name: string): void {
|
|
642
|
+
writeFileSync(codexLastSeenFile(name), `${nowSec()}\n`)
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
/** Persist the daemon's current thread id (`tm send` writes this after `thread/start`). */
|
|
646
|
+
export function writeThreadId(name: string, threadId: string): void {
|
|
647
|
+
atomicWrite(codexThreadFile(name), `${threadId}\n`)
|
|
648
|
+
}
|