@taskforcehq/taskforce 0.3.329 → 0.3.332
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 +7 -2
- package/dist/Taskforce.module.css +290 -45
- package/dist/components/features/AiProfilesModule.js +3 -5
- package/dist/components/features/TaskSettings.js +70 -14
- package/dist/components/features/TaskforceAgentsModule.d.ts +1 -2
- package/dist/components/features/TaskforceAgentsModule.js +586 -116
- package/dist/components/features/agentCapabilities/AgentCapabilitiesPrototype.d.ts +2 -2
- package/dist/components/features/agentCapabilities/AgentCapabilitiesPrototype.js +2 -2
- package/dist/components/features/agentConnections/AgentConnectionControl.d.ts +15 -0
- package/dist/components/features/agentConnections/AgentConnectionControl.js +125 -0
- package/dist/components/features/agentConnections/ModelConnectionsPanel.d.ts +18 -0
- package/dist/components/features/agentConnections/ModelConnectionsPanel.js +393 -0
- package/dist/components/features/agentConnections/modelConnectionsApi.d.ts +65 -0
- package/dist/components/features/agentConnections/modelConnectionsApi.js +129 -0
- package/dist/components/features/planning/PlanningModule.js +15 -3
- package/dist/components/features/planning/planningMetadata.d.ts +10 -0
- package/dist/components/features/planning/planningMetadata.js +8 -0
- package/dist/components/features/taskforceAgentAssignments/AgentBehaviorAssignments.js +15 -24
- package/dist/components/features/taskforceAgentEditorModel.d.ts +2 -1
- package/dist/components/features/taskforceAgentEditorModel.js +3 -1
- package/dist/components/features/workflowManager/workflowManagerApi.d.ts +1 -1
- package/dist/components/features/workflowManager/workflowManagerApi.js +3 -0
- package/dist/components/task/TaskWorkflowAssignmentField.js +68 -10
- package/dist/components/views/StandaloneLayout.js +62 -27
- package/dist/components/views/panels/PlanningDrawer.d.ts +2 -1
- package/dist/components/views/panels/PlanningDrawer.js +12 -8
- package/dist/components/views/standalone/modals/SyncStatusModal.d.ts +4 -3
- package/dist/components/views/standalone/modals/SyncStatusModal.js +33 -38
- package/dist/config/envSchema.js +55 -1
- package/dist/core/McpTokenService.d.ts +25 -1
- package/dist/core/McpTokenService.js +106 -15
- package/dist/core/TaskChecklistCommandService.d.ts +27 -0
- package/dist/core/TaskChecklistCommandService.js +83 -5
- package/dist/core/TaskLifecycleCommandService.d.ts +3 -1
- package/dist/core/TaskLifecycleCommandService.js +6 -2
- package/dist/core/Taskforce.d.ts +43 -3
- package/dist/core/Taskforce.js +158 -7
- package/dist/core/types.d.ts +9 -0
- package/dist/documentReviews/DocumentReviewCommentStore.d.ts +2 -0
- package/dist/documentReviews/DocumentReviewCommentStore.js +28 -9
- package/dist/documentReviews/commandService.d.ts +2 -1
- package/dist/documentReviews/commandService.js +6 -3
- package/dist/hooks/sync/orchestratorShared.d.ts +1 -0
- package/dist/hooks/sync/orchestratorShared.js +2 -0
- package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.d.ts +3 -0
- package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.js +85 -9
- package/dist/hooks/sync/useSyncStatusControls.d.ts +4 -1
- package/dist/hooks/sync/useSyncStatusControls.js +47 -11
- package/dist/hooks/useSyncOrchestrator.d.ts +3 -0
- package/dist/hooks/useSyncOrchestrator.js +111 -2
- package/dist/hooks/useTaskData.d.ts +31 -1
- package/dist/hooks/useTaskData.js +29 -7
- package/dist/hooks/useTaskMutations.d.ts +3 -1
- package/dist/hooks/useTaskMutations.js +46 -12
- package/dist/hooks/useTaskforce.d.ts +2 -0
- package/dist/hooks/useTaskforce.js +11 -2
- package/dist/mcp/clientRegistry.d.ts +2 -2
- package/dist/mcp/clientRegistry.js +1 -1
- package/dist/mcp/documentAssetRegistrar.js +9 -6
- package/dist/mcp/durableTaskMutationRouter.d.ts +4 -1
- package/dist/mcp/durableTaskMutationRouter.js +10 -0
- package/dist/mcp/durableTaskRelationshipMutationRouter.js +4 -0
- package/dist/mcp/httpProtocolRouting.d.ts +11 -0
- package/dist/mcp/httpProtocolRouting.js +22 -0
- package/dist/mcp/localCliHealth.d.ts +2 -2
- package/dist/mcp/localCliHealth.js +2 -2
- package/dist/mcp/localServiceProxy.d.ts +1 -0
- package/dist/mcp/localServiceProxy.js +530 -68
- package/dist/mcp/planningAttachmentCommandAdapter.d.ts +3 -1
- package/dist/mcp/planningAttachmentCommandAdapter.js +20 -2
- package/dist/mcp/runtime.d.ts +54 -79
- package/dist/mcp/runtime.js +408 -102
- package/dist/mcp/taskPlanningRegistrar.js +25 -6
- package/dist/mcp/toolProfiles.d.ts +2 -0
- package/dist/mcp/toolProfiles.js +11 -0
- package/dist/mcp/toolRegistry.d.ts +1 -0
- package/dist/mcp/toolRegistry.js +9 -8
- package/dist/mcp/workflowExecutionRegistrar.js +4 -4
- package/dist/migrations/taskSchemaMigrations.d.ts +5 -0
- package/dist/migrations/taskSchemaMigrations.js +415 -0
- package/dist/runtime/appGates.d.ts +2 -1
- package/dist/runtime/appGates.js +7 -0
- package/dist/server/buildInfo.d.ts +1 -0
- package/dist/server/buildInfo.js +5 -1
- package/dist/server/cloudMcpCapacityTelemetry.d.ts +68 -0
- package/dist/server/cloudMcpCapacityTelemetry.js +221 -0
- package/dist/server/index.d.ts +3 -0
- package/dist/server/index.js +108 -11
- package/dist/server/localDatabaseIdentity.js +4 -1
- package/dist/server/localServiceLease.js +2 -1
- package/dist/server/localServiceSessions.d.ts +14 -17
- package/dist/server/localServiceSessions.js +308 -94
- package/dist/server/localWorkspaceSyncServerRuntime.js +25 -19
- package/dist/server/routes/admin.d.ts +4 -0
- package/dist/server/routes/admin.js +126 -5
- package/dist/server/routes/agents.d.ts +7 -0
- package/dist/server/routes/agents.js +277 -24
- package/dist/server/routes/billing.js +5 -1
- package/dist/server/routes/durableTaskHttpRouters.d.ts +2 -0
- package/dist/server/routes/executorPhaseAApprovals.d.ts +19 -0
- package/dist/server/routes/executorPhaseAApprovals.js +140 -0
- package/dist/server/routes/executorPhaseAIssuerRedemptions.d.ts +11 -0
- package/dist/server/routes/executorPhaseAIssuerRedemptions.js +24 -0
- package/dist/server/routes/githubReviewEvidence.d.ts +19 -0
- package/dist/server/routes/githubReviewEvidence.js +116 -0
- package/dist/server/routes/localService.d.ts +15 -4
- package/dist/server/routes/localService.js +136 -40
- package/dist/server/routes/modelConnections.d.ts +24 -0
- package/dist/server/routes/modelConnections.js +205 -0
- package/dist/server/routes/shared.d.ts +22 -0
- package/dist/server/routes/shared.js +298 -182
- package/dist/server/routes/sync.js +1 -0
- package/dist/server/routes/syncAuxRoutes.js +5 -1
- package/dist/server/routes/syncPushRoutes.d.ts +1 -0
- package/dist/server/routes/syncPushRoutes.js +1 -0
- package/dist/server/routes/syncV3FeedRoutes.js +10 -1
- package/dist/server/routes/syncV3OperationRoutes.js +35 -9
- package/dist/server/routes/tasks.js +21 -2
- package/dist/server/routes/workflows.js +9 -1
- package/dist/server/routes.js +59 -0
- package/dist/service/localServiceCli.d.ts +2 -2
- package/dist/service/localServiceCli.js +4 -3
- package/dist/services/codexAppServerModelGateway.d.ts +54 -5
- package/dist/services/codexAppServerModelGateway.js +246 -21
- package/dist/services/codexDeviceCodeLoginManager.d.ts +39 -0
- package/dist/services/codexDeviceCodeLoginManager.js +265 -0
- package/dist/services/codexModelProviderConnectionLifecycle.d.ts +8 -0
- package/dist/services/codexModelProviderConnectionLifecycle.js +73 -0
- package/dist/services/executorPhaseAApprovalRuntime.d.ts +14 -0
- package/dist/services/executorPhaseAApprovalRuntime.js +24 -0
- package/dist/services/executorPhaseAApprovalService.d.ts +40 -0
- package/dist/services/executorPhaseAApprovalService.js +609 -0
- package/dist/services/executorPhaseADriftEvaluator.d.ts +78 -0
- package/dist/services/executorPhaseADriftEvaluator.js +93 -0
- package/dist/services/executorPhaseAIssuerCore.d.ts +139 -0
- package/dist/services/executorPhaseAIssuerCore.js +402 -0
- package/dist/services/executorPhaseAIssuerRedemptionService.d.ts +34 -0
- package/dist/services/executorPhaseAIssuerRedemptionService.js +158 -0
- package/dist/services/githubReviewEvidenceRuntime.d.ts +14 -0
- package/dist/services/githubReviewEvidenceRuntime.js +30 -0
- package/dist/services/githubReviewEvidenceService.d.ts +93 -0
- package/dist/services/githubReviewEvidenceService.js +336 -0
- package/dist/services/modelGateway.d.ts +7 -0
- package/dist/services/modelProviderConnectionService.d.ts +71 -0
- package/dist/services/modelProviderConnectionService.js +279 -0
- package/dist/services/modelProviderCredentialHome.d.ts +32 -0
- package/dist/services/modelProviderCredentialHome.js +271 -0
- package/dist/services/ownerScopedModelConnectionGateway.d.ts +12 -0
- package/dist/services/ownerScopedModelConnectionGateway.js +30 -0
- package/dist/services/taskforceAgentConnectionBindingService.d.ts +66 -0
- package/dist/services/taskforceAgentConnectionBindingService.js +185 -0
- package/dist/services/taskforceAgentMcpBridge.d.ts +2 -2
- package/dist/services/taskforceAgentMcpBridge.js +42 -29
- package/dist/shared/adminEdgeProxy.d.ts +5 -0
- package/dist/shared/adminEdgeProxy.js +94 -0
- package/dist/shared/adminProxySessionCookies.d.ts +16 -0
- package/dist/shared/adminProxySessionCookies.js +86 -0
- package/dist/shared/aiProfileColors.d.ts +31 -1
- package/dist/shared/aiProfileColors.js +14 -6
- package/dist/shared/executorPhaseAApprovalGoldenVector.json +269 -0
- package/dist/shared/executorPhaseAApprovalReceipt.d.ts +112 -0
- package/dist/shared/executorPhaseAApprovalReceipt.js +58 -0
- package/dist/shared/executorPhaseAApprovalTrustPolicy.json +10 -0
- package/dist/shared/executorPhaseADriftContracts.d.ts +37 -0
- package/dist/shared/executorPhaseADriftContracts.js +63 -0
- package/dist/shared/executorPhaseAIssuerContracts.d.ts +75 -0
- package/dist/shared/executorPhaseAIssuerContracts.js +90 -0
- package/dist/shared/executorPhaseARunAuthorization.d.ts +120 -0
- package/dist/shared/executorPhaseARunAuthorization.js +232 -0
- package/dist/shared/executorPhaseASchemaValidation.d.ts +7 -0
- package/dist/shared/executorPhaseASchemaValidation.js +53 -0
- package/dist/shared/executorPhaseASchemas/approval-receipt.schema.json +106 -0
- package/dist/shared/executorPhaseASchemas/drift-attestation.schema.json +54 -0
- package/dist/shared/executorPhaseASchemas/drift-request.schema.json +47 -0
- package/dist/shared/executorPhaseASchemas/foundation-manifest.schema.json +29 -0
- package/dist/shared/executorPhaseASchemas/issuer-audit-record.schema.json +24 -0
- package/dist/shared/executorPhaseASchemas/issuer-proof.schema.json +43 -0
- package/dist/shared/executorPhaseASchemas/issuer-redemption-request.schema.json +18 -0
- package/dist/shared/executorPhaseASchemas/issuer-redemption-response.schema.json +39 -0
- package/dist/shared/executorPhaseASchemas/logical-envelope.schema.json +149 -0
- package/dist/shared/executorPhaseASchemas/preflight-report.schema.json +216 -0
- package/dist/shared/executorPhaseASchemas/run-capability.schema.json +111 -0
- package/dist/shared/executorPhaseASchemas/sender-proof.schema.json +37 -0
- package/dist/shared/executorPhaseASchemas/workload-grant.schema.json +68 -0
- package/dist/shared/executorPhaseASchemas/workload-jwt-claims.schema.json +67 -0
- package/dist/shared/executorPhaseATiming.d.ts +1 -0
- package/dist/shared/executorPhaseATiming.js +1 -0
- package/dist/shared/planningIdentity.js +1 -1
- package/dist/shared/productLogoKeys.d.ts +2 -0
- package/dist/shared/productLogoKeys.js +18 -0
- package/dist/shared/taskforceAgentDefinition.d.ts +0 -1
- package/dist/shared/taskforceAgentDefinition.js +6 -9
- package/dist/shared/taskforceAgentModels.js +7 -3
- package/dist/shared/userFeatureGrants.d.ts +4 -0
- package/dist/shared/userFeatureGrants.js +7 -0
- package/dist/storage/executorPhaseAApprovalReceiptStore.d.ts +37 -0
- package/dist/storage/executorPhaseAApprovalReceiptStore.js +81 -0
- package/dist/storage/executorPhaseARunAuthorizationStore.d.ts +103 -0
- package/dist/storage/executorPhaseARunAuthorizationStore.js +492 -0
- package/dist/storage/githubReviewEvidenceInstallationStore.d.ts +26 -0
- package/dist/storage/githubReviewEvidenceInstallationStore.js +89 -0
- package/dist/storage/modelProviderConnectionStore.d.ts +99 -0
- package/dist/storage/modelProviderConnectionStore.js +446 -0
- package/dist/storage/postgresAdapter.d.ts +4 -0
- package/dist/storage/postgresAdapter.js +14 -1
- package/dist/storage/postgresRequestDiagnostics.d.ts +9 -1
- package/dist/storage/postgresRequestDiagnostics.js +15 -2
- package/dist/storage/postgresWorker.js +20 -2
- package/dist/storage/postgresWorkerProtocol.d.ts +7 -0
- package/dist/storage/taskforceAgentConnectionBindingStore.d.ts +31 -0
- package/dist/storage/taskforceAgentConnectionBindingStore.js +84 -0
- package/dist/storage/workflowStore.d.ts +2 -0
- package/dist/storage/workflowStore.js +39 -2
- package/dist/sync/cloudSyncApi.js +4 -2
- package/dist/sync/collaborationSyncState.js +5 -0
- package/dist/sync/coordinator/localSyncExecutionPermitStore.js +60 -29
- package/dist/sync/coordinator/localWorkspaceSyncPendingV2PushProgress.d.ts +10 -0
- package/dist/sync/coordinator/localWorkspaceSyncPendingV2PushProgress.js +29 -0
- package/dist/sync/coordinator/localWorkspaceSyncRunner.d.ts +3 -1
- package/dist/sync/coordinator/localWorkspaceSyncRunner.js +18 -0
- package/dist/sync/coordinator/localWorkspaceSyncRunnerState.d.ts +15 -1
- package/dist/sync/coordinator/localWorkspaceSyncRunnerState.js +99 -2
- package/dist/sync/coordinator/workspaceSyncCredentialBroker.d.ts +1 -0
- package/dist/sync/coordinator/workspaceSyncCredentialBroker.js +33 -4
- package/dist/sync/engine/workspaceSyncContentLifecycleAdapter.d.ts +2 -1
- package/dist/sync/engine/workspaceSyncContentVersionStore.d.ts +38 -0
- package/dist/sync/engine/workspaceSyncContentVersionStore.js +50 -1
- package/dist/sync/engine/workspaceSyncEngineLifecyclePolicy.js +6 -6
- package/dist/sync/engine/workspaceSyncEnginePushCompletion.d.ts +14 -0
- package/dist/sync/engine/workspaceSyncEnginePushCompletion.js +84 -0
- package/dist/sync/engine/workspaceSyncEngineRecovery.js +1 -0
- package/dist/sync/engine/workspaceSyncEngineRuntime.d.ts +1 -0
- package/dist/sync/engine/workspaceSyncEngineRuntime.js +1 -0
- package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.js +112 -38
- package/dist/sync/engine/workspaceSyncEngineServerSnapshotReader.js +6 -0
- package/dist/sync/engine/workspaceSyncEngineTransfers.js +3 -1
- package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.d.ts +1 -0
- package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.js +31 -0
- package/dist/sync/syncApplyHandlers.d.ts +3 -0
- package/dist/sync/syncApplyHandlers.js +81 -15
- package/dist/sync/syncService.d.ts +15 -0
- package/dist/sync/syncService.js +83 -18
- package/dist/sync/taskforceAgentSyncAuthorization.d.ts +16 -0
- package/dist/sync/taskforceAgentSyncAuthorization.js +20 -0
- package/dist/sync/v3/combinedFeedCapability.js +4 -0
- package/dist/sync/v3/durableInitiativeMutationRouter.js +18 -10
- package/dist/sync/v3/durableOperationReplay.d.ts +14 -0
- package/dist/sync/v3/durableOperationReplay.js +18 -0
- package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.js +3 -0
- package/dist/sync/v3/durableTaskChecklistMutationRouter.d.ts +2 -1
- package/dist/sync/v3/durableTaskChecklistMutationRouter.js +58 -15
- package/dist/sync/v3/durableTaskCommentMutationRouter.js +3 -0
- package/dist/sync/v3/durableTaskHttpRootMutationRouter.d.ts +1 -1
- package/dist/sync/v3/durableTaskHttpRootMutationRouter.js +10 -0
- package/dist/sync/v3/durableTaxonomyMutationRouter.js +5 -0
- package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.d.ts +18 -7
- package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.js +89 -23
- package/dist/sync/v3/durableWorkstreamMutationRouter.js +18 -10
- package/dist/sync/v3/durableWorkstreamTaskOrderMutationRouter.js +16 -5
- package/dist/sync/v3/localOutboxDispatchRuntime.js +2 -2
- package/dist/sync/v3/localOutboxRecoveryPreparationService.js +8 -2
- package/dist/sync/v3/localTaskChecklistOutboxHandler.js +16 -2
- package/dist/sync/v3/localTaskChecklistOutboxService.d.ts +4 -0
- package/dist/sync/v3/localTaskChecklistOutboxService.js +14 -1
- package/dist/sync/v3/localTaskCreateOutboxService.d.ts +3 -1
- package/dist/sync/v3/localTaskCreateOutboxService.js +6 -1
- package/dist/sync/v3/localTaskDeleteOutboxService.js +1 -0
- package/dist/sync/v3/localTaskLifecycleOutboxService.d.ts +2 -1
- package/dist/sync/v3/localTaskLifecycleOutboxService.js +5 -1
- package/dist/sync/v3/localTaskMetadataOutboxService.d.ts +2 -1
- package/dist/sync/v3/localTaskMetadataOutboxService.js +6 -2
- package/dist/sync/v3/localTaskStatusOutboxService.d.ts +10 -1
- package/dist/sync/v3/localTaskStatusOutboxService.js +238 -16
- package/dist/sync/v3/syncDurabilityStore.d.ts +36 -1
- package/dist/sync/v3/syncDurabilityStore.js +202 -8
- package/dist/sync/v3/taskChecklistMutationService.d.ts +11 -0
- package/dist/sync/v3/taskChecklistMutationService.js +44 -1
- package/dist/sync/v3/taskStatusMutationService.d.ts +29 -1
- package/dist/sync/v3/taskStatusMutationService.js +119 -3
- package/dist/sync/v3/workflowAssignmentSync.d.ts +5 -0
- package/dist/sync/v3/workflowAssignmentSync.js +27 -0
- package/dist/sync/v3/workflowRuntimeMutationService.d.ts +5 -0
- package/dist/sync/v3/workflowRuntimeMutationService.js +124 -71
- package/dist/sync/v3/workspaceSyncJournalReader.js +1 -1
- package/dist/sync/v3/workspaceSyncOperationRetentionService.d.ts +16 -0
- package/dist/sync/v3/workspaceSyncOperationRetentionService.js +83 -0
- package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.d.ts +1 -0
- package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.js +9 -2
- package/dist/sync/v3/workspaceSyncV3CombinedLocalApply.js +25 -3
- package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.d.ts +7 -0
- package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.js +44 -32
- package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.d.ts +9 -5
- package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.js +54 -38
- package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.d.ts +10 -0
- package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.js +70 -31
- package/dist/sync/v3/workspaceSyncV3CombinedWireContract.d.ts +2 -1
- package/dist/sync/v3/workspaceSyncV3CombinedWireContract.js +16 -0
- package/dist/sync/v3/workspaceSyncV3CoverageRegistry.js +6 -0
- package/dist/sync/v3/workspaceSyncV3Feed.d.ts +1 -0
- package/dist/sync/v3/workspaceSyncV3Feed.js +6 -1
- package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.d.ts +2 -0
- package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.js +49 -18
- package/dist/sync/v3/workspaceSyncV3OperationProtocol.d.ts +3 -0
- package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.d.ts +5 -0
- package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.js +36 -2
- package/dist/sync/v3/workspaceSyncV3RepairSnapshotRetentionService.d.ts +17 -0
- package/dist/sync/v3/workspaceSyncV3RepairSnapshotRetentionService.js +64 -0
- package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeApply.d.ts +1 -0
- package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeApply.js +50 -5
- package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverCoverage.d.ts +7 -0
- package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverCoverage.js +33 -0
- package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverWireContract.d.ts +7 -0
- package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverWireContract.js +8 -0
- package/dist/sync/workspaceRepair.d.ts +5 -2
- package/dist/sync/workspaceRepair.js +161 -6
- package/dist/sync/workspaceSyncModel.d.ts +21 -0
- package/dist/sync/workspaceSyncModel.js +35 -7
- package/dist/sync/workspaceSyncState.d.ts +1 -0
- package/dist/sync/workspaceSyncV2SnapshotBuilder.d.ts +6 -0
- package/dist/sync/workspaceSyncV2SnapshotBuilder.js +5 -0
- package/dist/ui/assets/AiIdentityRosterCard-CDMPtnbC.js +1 -0
- package/dist/ui/assets/AiProfilesModule-Cww85C4E.js +1 -0
- package/dist/ui/assets/{AnnotatedAttachmentWorkspace-B68Wg-RV.js → AnnotatedAttachmentWorkspace-Dt9TKYSH.js} +1 -1
- package/dist/ui/assets/{AssetTraySortControl-C8Rztyal.js → AssetTraySortControl-CKgapnxu.js} +1 -1
- package/dist/ui/assets/{ContextAttachmentManager-Cj3c7X9y.js → ContextAttachmentManager-T-cEVcOZ.js} +2 -2
- package/dist/ui/assets/{DocumentWorkspace-B5uvzems.js → DocumentWorkspace-HD4MUjAZ.js} +1 -1
- package/dist/ui/assets/{EntityActivityTimeline-BVFvCB5R.js → EntityActivityTimeline-_V0zfMuh.js} +1 -1
- package/dist/ui/assets/PlanningModule-mTkBygsB.js +1 -0
- package/dist/ui/assets/{PlansPage-AY4cGWco.js → PlansPage-Btiq06VO.js} +1 -1
- package/dist/ui/assets/{TaskContextUpload-DZxTVesW.js → TaskContextUpload-C00NVUpn.js} +1 -1
- package/dist/ui/assets/TaskSettings-Cp-L-4xh.js +12 -0
- package/dist/ui/assets/TaskforceAgentsModule-Coq9-PUp.js +24 -0
- package/dist/ui/assets/TaskforceAgentsModule-b-8R25cJ.css +1 -0
- package/dist/ui/assets/{WorkflowManagerModule-DEr5di_r.js → WorkflowManagerModule-CuqRzMmM.js} +1 -1
- package/dist/ui/assets/index-BZ-hdZSk.css +1 -0
- package/dist/ui/assets/index-DSQINwt9.js +7 -0
- package/dist/ui/assets/{vendor-icons-D9Lpw-j4.js → vendor-icons-Bsq-mcEn.js} +1 -1
- package/dist/ui/branding/logos/letterhead_dark.png +0 -0
- package/dist/ui/branding/logos/letterhead_light.png +0 -0
- package/dist/ui/branding/logos/signature_dark.png +0 -0
- package/dist/ui/branding/logos/signature_light.png +0 -0
- package/dist/ui/index.html +3 -3
- package/dist/utils/aiProfileDefaultLogo.js +16 -48
- package/dist/utils/httpSetCookie.d.ts +1 -0
- package/dist/utils/httpSetCookie.js +4 -1
- package/dist/utils/localRuntimeUrl.d.ts +1 -0
- package/dist/utils/localRuntimeUrl.js +14 -0
- package/dist/utils/productLogoRegistry.d.ts +2 -0
- package/dist/utils/productLogoRegistry.js +36 -0
- package/dist/utils/syncStatusPresentation.d.ts +4 -0
- package/dist/utils/syncStatusPresentation.js +17 -0
- package/dist/utils/taskEvents.d.ts +2 -0
- package/dist/utils/workspaceSyncPresentation.d.ts +1 -1
- package/dist/utils/workspaceSyncPresentation.js +23 -17
- package/package.json +24 -4
- package/dist/ui/assets/AiIdentityRosterCard-BZM4aQnM.js +0 -1
- package/dist/ui/assets/AiProfilesModule-BbAEWtHH.js +0 -1
- package/dist/ui/assets/PlanningModule-B5DWQOGz.js +0 -1
- package/dist/ui/assets/TaskSettings-BeWAuyZj.js +0 -12
- package/dist/ui/assets/TaskforceAgentsModule-BifCYtjR.js +0 -21
- package/dist/ui/assets/TaskforceAgentsModule-D6IC0S7Q.css +0 -1
- package/dist/ui/assets/index-I5zhdtgt.js +0 -7
- package/dist/ui/assets/index-VRFsx3wz.css +0 -1
|
@@ -1,9 +1,85 @@
|
|
|
1
1
|
import { spawn } from 'child_process';
|
|
2
|
+
import { existsSync, realpathSync } from 'fs';
|
|
2
3
|
import { tmpdir } from 'os';
|
|
4
|
+
import { dirname, isAbsolute, join, resolve } from 'path';
|
|
5
|
+
import { createRequire } from 'module';
|
|
3
6
|
import readline from 'readline';
|
|
4
7
|
import { ModelGatewayConfigurationError } from './modelGateway.js';
|
|
5
8
|
import { TASKFORCE_AGENT_MODEL_OPTIONS, isTaskforceAgentSubscriptionDevModelsEnabled } from '../shared/taskforceAgentModels.js';
|
|
6
9
|
const CODEX_APP_SERVER_STDERR_LIMIT = 4_096;
|
|
10
|
+
export const PINNED_CODEX_APP_SERVER_VERSION = '0.148.0-alpha.9';
|
|
11
|
+
const require = createRequire(import.meta.url);
|
|
12
|
+
export class CodexAppServerCompatibilityError extends Error {
|
|
13
|
+
reason;
|
|
14
|
+
constructor(reason, message) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.reason = reason;
|
|
17
|
+
this.name = 'CodexAppServerCompatibilityError';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function resolveBundledCodexCommand() {
|
|
21
|
+
try {
|
|
22
|
+
const packageVersion = String(require('@openai/codex/package.json')?.version || '');
|
|
23
|
+
if (packageVersion !== PINNED_CODEX_APP_SERVER_VERSION)
|
|
24
|
+
throw new Error('version mismatch');
|
|
25
|
+
const target = (() => {
|
|
26
|
+
if (process.platform === 'linux' && process.arch === 'x64') {
|
|
27
|
+
return ['@openai/codex-linux-x64', 'x86_64-unknown-linux-musl'];
|
|
28
|
+
}
|
|
29
|
+
if (process.platform === 'linux' && process.arch === 'arm64') {
|
|
30
|
+
return ['@openai/codex-linux-arm64', 'aarch64-unknown-linux-musl'];
|
|
31
|
+
}
|
|
32
|
+
if (process.platform === 'darwin' && process.arch === 'x64') {
|
|
33
|
+
return ['@openai/codex-darwin-x64', 'x86_64-apple-darwin'];
|
|
34
|
+
}
|
|
35
|
+
if (process.platform === 'darwin' && process.arch === 'arm64') {
|
|
36
|
+
return ['@openai/codex-darwin-arm64', 'aarch64-apple-darwin'];
|
|
37
|
+
}
|
|
38
|
+
if (process.platform === 'win32' && process.arch === 'x64') {
|
|
39
|
+
return ['@openai/codex-win32-x64', 'x86_64-pc-windows-msvc'];
|
|
40
|
+
}
|
|
41
|
+
if (process.platform === 'win32' && process.arch === 'arm64') {
|
|
42
|
+
return ['@openai/codex-win32-arm64', 'aarch64-pc-windows-msvc'];
|
|
43
|
+
}
|
|
44
|
+
throw new Error('unsupported platform');
|
|
45
|
+
})();
|
|
46
|
+
const platformPackageJson = require.resolve(`${target[0]}/package.json`);
|
|
47
|
+
const platformVersion = String(require(platformPackageJson)?.version || '');
|
|
48
|
+
const expectedPlatformVersion = `${PINNED_CODEX_APP_SERVER_VERSION}-${target[0].slice('@openai/codex-'.length)}`;
|
|
49
|
+
if (platformVersion !== expectedPlatformVersion)
|
|
50
|
+
throw new Error('platform version mismatch');
|
|
51
|
+
const executable = join(dirname(platformPackageJson), 'vendor', target[1], 'bin', process.platform === 'win32' ? 'codex.exe' : 'codex');
|
|
52
|
+
if (!existsSync(executable))
|
|
53
|
+
throw new Error('binary missing');
|
|
54
|
+
return executable;
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
throw new CodexAppServerCompatibilityError('version', `Unsupported Codex app-server version; Taskforce requires ${PINNED_CODEX_APP_SERVER_VERSION}.`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function normalizedPath(value) {
|
|
61
|
+
try {
|
|
62
|
+
return realpathSync(value);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return resolve(value);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export function assertCodexAppServerCompatibility(result, expectedCodexHome) {
|
|
69
|
+
const userAgent = readStringPath(result, ['userAgent']);
|
|
70
|
+
const codexHome = readStringPath(result, ['codexHome']);
|
|
71
|
+
const version = userAgent.match(/\/([0-9]+\.[0-9]+\.[0-9]+(?:-[A-Za-z0-9.-]+)?)(?:\s|\()/)?.[1];
|
|
72
|
+
if (version !== PINNED_CODEX_APP_SERVER_VERSION) {
|
|
73
|
+
throw new CodexAppServerCompatibilityError('version', `Unsupported Codex app-server version; Taskforce requires ${PINNED_CODEX_APP_SERVER_VERSION}.`);
|
|
74
|
+
}
|
|
75
|
+
if (!codexHome || !isAbsolute(codexHome)) {
|
|
76
|
+
throw new CodexAppServerCompatibilityError('credential_home', 'Unsupported Codex app-server credential home response.');
|
|
77
|
+
}
|
|
78
|
+
const expected = String(expectedCodexHome || '').trim();
|
|
79
|
+
if (expected && normalizedPath(codexHome) !== normalizedPath(expected)) {
|
|
80
|
+
throw new CodexAppServerCompatibilityError('credential_home', 'Unsupported Codex app-server credential home response.');
|
|
81
|
+
}
|
|
82
|
+
}
|
|
7
83
|
export const DEFAULT_CODEX_APP_SERVER_MODEL_KEY_IDS = {
|
|
8
84
|
...Object.fromEntries(TASKFORCE_AGENT_MODEL_OPTIONS
|
|
9
85
|
.filter((model) => model.runtime === 'subscription-dev' && model.providerKey === 'openai')
|
|
@@ -38,12 +114,21 @@ export function buildCodexAppServerEnv(source = process.env) {
|
|
|
38
114
|
}
|
|
39
115
|
return env;
|
|
40
116
|
}
|
|
41
|
-
export function sanitizeCodexAppServerStderr(value) {
|
|
42
|
-
|
|
43
|
-
.replace(
|
|
117
|
+
export function sanitizeCodexAppServerStderr(value, credentialPaths = []) {
|
|
118
|
+
let sanitized = String(value || '')
|
|
119
|
+
.replace(/\\+(?=["'])/g, '')
|
|
120
|
+
.replace(/(["']?(?:api[_-]?key|access[_-]?token|refresh[_-]?token|id[_-]?token|client[_-]?secret)["']?\s*[:=]\s*)(["'])[^"'\r\n]*\2/gi, '$1$2[redacted]$2')
|
|
121
|
+
.replace(/((?:api[_-]?key|access[_-]?token|refresh[_-]?token|id[_-]?token|client[_-]?secret)\s*[:=]\s*)[^\s,}\]]+/gi, '$1[redacted]')
|
|
44
122
|
.replace(/sk-[A-Za-z0-9_-]{8,}/g, '[redacted OpenAI credential]')
|
|
45
123
|
.replace(/(Bearer\s+)[^\s]+/gi, '$1[redacted]')
|
|
124
|
+
.replace(/\beyJ[A-Za-z0-9_-]{5,}\.[A-Za-z0-9_-]{5,}\.[A-Za-z0-9_-]{5,}\b/g, '[redacted JWT]')
|
|
46
125
|
.replace(/[^\x09\x0A\x0D\x20-\x7E]/g, '?');
|
|
126
|
+
for (const credentialPath of credentialPaths) {
|
|
127
|
+
const normalized = String(credentialPath || '').trim();
|
|
128
|
+
if (normalized)
|
|
129
|
+
sanitized = sanitized.split(normalized).join('[redacted credential path]');
|
|
130
|
+
}
|
|
131
|
+
return sanitized.slice(0, CODEX_APP_SERVER_STDERR_LIMIT);
|
|
47
132
|
}
|
|
48
133
|
export function collectCodexAppServerStderr(current, chunk) {
|
|
49
134
|
return (current + String(chunk || '')).slice(-CODEX_APP_SERVER_STDERR_LIMIT);
|
|
@@ -54,6 +139,24 @@ export function assertCodexChatGptSubscriptionAccount(result) {
|
|
|
54
139
|
throw new ModelGatewayConfigurationError('Codex is not signed in with a ChatGPT subscription. Run codex login on this machine and choose Sign in with ChatGPT.', 'MODEL_SOURCE_UNAVAILABLE');
|
|
55
140
|
}
|
|
56
141
|
}
|
|
142
|
+
export function extractCodexAccountLoginCompletion(messages, loginId, credentialPaths = []) {
|
|
143
|
+
for (const message of messages) {
|
|
144
|
+
if (message.method !== 'account/login/completed')
|
|
145
|
+
continue;
|
|
146
|
+
const completedLoginId = readStringPath(message.params, ['loginId']);
|
|
147
|
+
if (completedLoginId !== loginId)
|
|
148
|
+
continue;
|
|
149
|
+
const params = message.params;
|
|
150
|
+
const success = params?.success === true;
|
|
151
|
+
const error = sanitizeCodexAppServerStderr(params?.error, credentialPaths).trim();
|
|
152
|
+
return {
|
|
153
|
+
loginId,
|
|
154
|
+
success,
|
|
155
|
+
...(error ? { error } : {}),
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
57
160
|
export function isCodexSubscriptionDevRuntimeAllowed(source = process.env) {
|
|
58
161
|
const runtimeMode = String(source.TASKFORCE_RUNTIME_MODE || '').trim().toLowerCase();
|
|
59
162
|
return runtimeMode === 'local';
|
|
@@ -72,7 +175,7 @@ function buildCodexAppServerRuntimePolicy(cwd) {
|
|
|
72
175
|
},
|
|
73
176
|
};
|
|
74
177
|
}
|
|
75
|
-
export function extractCodexTurnCompletion(messages) {
|
|
178
|
+
export function extractCodexTurnCompletion(messages, credentialPaths = []) {
|
|
76
179
|
const jsonMessages = messages;
|
|
77
180
|
const completed = jsonMessages.find((message) => message.method === 'turn/completed');
|
|
78
181
|
if (!completed)
|
|
@@ -84,7 +187,7 @@ export function extractCodexTurnCompletion(messages) {
|
|
|
84
187
|
const errorMessage = readStringPath(completed.params, ['turn', 'error', 'message'])
|
|
85
188
|
|| readStringPath(completed.params, ['error', 'message'])
|
|
86
189
|
|| `Codex app-server turn ended with status ${stopReason}.`;
|
|
87
|
-
throw new Error(errorMessage);
|
|
190
|
+
throw new Error(sanitizeCodexAppServerStderr(errorMessage, credentialPaths));
|
|
88
191
|
}
|
|
89
192
|
return {
|
|
90
193
|
text: extractAgentText(jsonMessages),
|
|
@@ -99,19 +202,40 @@ export class CodexAppServerJsonRpcClient {
|
|
|
99
202
|
initialized = false;
|
|
100
203
|
lineReader;
|
|
101
204
|
requestTimeoutMs;
|
|
102
|
-
|
|
205
|
+
terminalRejectors = new Set();
|
|
206
|
+
loginNotificationStart = new Map();
|
|
103
207
|
terminalError = null;
|
|
104
208
|
stderrTail = '';
|
|
209
|
+
credentialPaths;
|
|
210
|
+
expectedCodexHome;
|
|
211
|
+
processExited;
|
|
212
|
+
closePromise = null;
|
|
105
213
|
constructor(options = {}) {
|
|
106
|
-
const command = options.command
|
|
214
|
+
const command = options.command
|
|
215
|
+
|| process.env.TASKFORCE_CODEX_APP_SERVER_COMMAND
|
|
216
|
+
|| resolveBundledCodexCommand();
|
|
107
217
|
const args = options.args || ['app-server', '--listen', 'stdio://'];
|
|
108
218
|
const cwd = resolveCodexAppServerCwd(options.cwd);
|
|
109
219
|
this.requestTimeoutMs = options.requestTimeoutMs ?? 30_000;
|
|
220
|
+
this.credentialPaths = options.credentialPaths || [];
|
|
221
|
+
const childEnvironment = options.env || buildCodexAppServerEnv();
|
|
222
|
+
this.expectedCodexHome = String(childEnvironment.CODEX_HOME || '').trim();
|
|
110
223
|
this.process = spawn(command, args, {
|
|
111
224
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
112
|
-
env:
|
|
225
|
+
env: childEnvironment,
|
|
113
226
|
cwd,
|
|
114
227
|
});
|
|
228
|
+
this.processExited = new Promise((resolveExit) => {
|
|
229
|
+
let settled = false;
|
|
230
|
+
const finish = () => {
|
|
231
|
+
if (settled)
|
|
232
|
+
return;
|
|
233
|
+
settled = true;
|
|
234
|
+
resolveExit();
|
|
235
|
+
};
|
|
236
|
+
this.process.once('exit', finish);
|
|
237
|
+
this.process.once('error', finish);
|
|
238
|
+
});
|
|
115
239
|
this.lineReader = readline.createInterface({ input: this.process.stdout });
|
|
116
240
|
this.lineReader.on('line', (line) => this.handleLine(line));
|
|
117
241
|
this.process.on('error', (error) => {
|
|
@@ -119,7 +243,7 @@ export class CodexAppServerJsonRpcClient {
|
|
|
119
243
|
});
|
|
120
244
|
this.process.on('exit', (code, signal) => {
|
|
121
245
|
const reason = signal ? `signal ${signal}` : `exit code ${code ?? 'unknown'}`;
|
|
122
|
-
const details = sanitizeCodexAppServerStderr(this.stderrTail).trim();
|
|
246
|
+
const details = sanitizeCodexAppServerStderr(this.stderrTail, this.credentialPaths).trim();
|
|
123
247
|
this.fail(new Error(`Codex app-server stopped before completing the request (${reason}).${details ? ` ${details}` : ''}`));
|
|
124
248
|
});
|
|
125
249
|
this.process.stderr.on('data', (chunk) => {
|
|
@@ -129,13 +253,18 @@ export class CodexAppServerJsonRpcClient {
|
|
|
129
253
|
async initialize() {
|
|
130
254
|
if (this.initialized)
|
|
131
255
|
return;
|
|
132
|
-
await this.request('initialize', {
|
|
256
|
+
const result = await this.request('initialize', {
|
|
133
257
|
clientInfo: {
|
|
134
258
|
name: 'taskforce_dev',
|
|
135
259
|
title: 'Taskforce Dev',
|
|
136
260
|
version: '0.1.0',
|
|
137
261
|
},
|
|
262
|
+
capabilities: {
|
|
263
|
+
experimentalApi: true,
|
|
264
|
+
requestAttestation: false,
|
|
265
|
+
},
|
|
138
266
|
});
|
|
267
|
+
assertCodexAppServerCompatibility(result, this.expectedCodexHome);
|
|
139
268
|
this.sendNotification('initialized', {});
|
|
140
269
|
this.initialized = true;
|
|
141
270
|
}
|
|
@@ -143,6 +272,45 @@ export class CodexAppServerJsonRpcClient {
|
|
|
143
272
|
const result = await this.request('account/read', { refreshToken: false });
|
|
144
273
|
assertCodexChatGptSubscriptionAccount(result);
|
|
145
274
|
}
|
|
275
|
+
async startChatGptDeviceCodeLogin() {
|
|
276
|
+
const notificationStart = this.notifications.length;
|
|
277
|
+
const result = await this.request('account/login/start', { type: 'chatgptDeviceCode' });
|
|
278
|
+
const type = readStringPath(result, ['type']);
|
|
279
|
+
const loginId = readStringPath(result, ['loginId']);
|
|
280
|
+
const userCode = readStringPath(result, ['userCode']);
|
|
281
|
+
const verificationUrl = readStringPath(result, ['verificationUrl']);
|
|
282
|
+
if (type !== 'chatgptDeviceCode' || !loginId || !userCode || !verificationUrl) {
|
|
283
|
+
throw new Error('Codex app-server returned an invalid device-code login response.');
|
|
284
|
+
}
|
|
285
|
+
this.loginNotificationStart.set(loginId, notificationStart);
|
|
286
|
+
return { loginId, userCode, verificationUrl };
|
|
287
|
+
}
|
|
288
|
+
async waitForAccountLoginCompleted(input) {
|
|
289
|
+
const startIndex = this.loginNotificationStart.get(input.loginId) ?? 0;
|
|
290
|
+
try {
|
|
291
|
+
return await this.waitForNotification(() => extractCodexAccountLoginCompletion(this.notifications.slice(startIndex), input.loginId, this.credentialPaths), input.timeoutMs, 'Timed out waiting for Codex device-code authorization.', input.signal);
|
|
292
|
+
}
|
|
293
|
+
finally {
|
|
294
|
+
this.loginNotificationStart.delete(input.loginId);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
async cancelAccountLogin(loginId) {
|
|
298
|
+
const result = await this.request('account/login/cancel', { loginId });
|
|
299
|
+
const status = readStringPath(result, ['status']);
|
|
300
|
+
return status === 'canceled' ? 'canceled' : 'notFound';
|
|
301
|
+
}
|
|
302
|
+
async readAccount(refreshToken = false) {
|
|
303
|
+
const result = await this.request('account/read', { refreshToken });
|
|
304
|
+
const type = readStringPath(result, ['account', 'type']);
|
|
305
|
+
if (!type)
|
|
306
|
+
return null;
|
|
307
|
+
const email = readStringPath(result, ['account', 'email']);
|
|
308
|
+
const planType = readStringPath(result, ['account', 'planType']);
|
|
309
|
+
return { type, ...(email ? { email } : {}), ...(planType ? { planType } : {}) };
|
|
310
|
+
}
|
|
311
|
+
async logoutAccount() {
|
|
312
|
+
await this.request('account/logout', {});
|
|
313
|
+
}
|
|
146
314
|
async startThread(input) {
|
|
147
315
|
const result = await this.request('thread/start', {
|
|
148
316
|
model: input.model,
|
|
@@ -171,9 +339,32 @@ export class CodexAppServerJsonRpcClient {
|
|
|
171
339
|
});
|
|
172
340
|
return this.waitForTurnCompletion(startedAt, input.timeoutMs);
|
|
173
341
|
}
|
|
174
|
-
close() {
|
|
175
|
-
this.
|
|
176
|
-
|
|
342
|
+
async close() {
|
|
343
|
+
if (this.closePromise)
|
|
344
|
+
return this.closePromise;
|
|
345
|
+
this.closePromise = (async () => {
|
|
346
|
+
this.lineReader.close();
|
|
347
|
+
if (this.process.exitCode !== null || this.process.signalCode !== null) {
|
|
348
|
+
await this.processExited;
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
351
|
+
this.process.kill('SIGTERM');
|
|
352
|
+
let timeout;
|
|
353
|
+
const exitedGracefully = await Promise.race([
|
|
354
|
+
this.processExited.then(() => true),
|
|
355
|
+
new Promise((resolveTimeout) => {
|
|
356
|
+
timeout = setTimeout(() => resolveTimeout(false), 2_000);
|
|
357
|
+
timeout.unref?.();
|
|
358
|
+
}),
|
|
359
|
+
]);
|
|
360
|
+
if (timeout)
|
|
361
|
+
clearTimeout(timeout);
|
|
362
|
+
if (!exitedGracefully && this.process.exitCode === null && this.process.signalCode === null) {
|
|
363
|
+
this.process.kill('SIGKILL');
|
|
364
|
+
await this.processExited;
|
|
365
|
+
}
|
|
366
|
+
})();
|
|
367
|
+
return this.closePromise;
|
|
177
368
|
}
|
|
178
369
|
request(method, params) {
|
|
179
370
|
const id = this.nextId++;
|
|
@@ -228,7 +419,7 @@ export class CodexAppServerJsonRpcClient {
|
|
|
228
419
|
}
|
|
229
420
|
this.pending.delete(message.id);
|
|
230
421
|
if (message.error) {
|
|
231
|
-
pending.reject(new Error(message.error.message || 'Codex app-server request failed.'));
|
|
422
|
+
pending.reject(new Error(sanitizeCodexAppServerStderr(message.error.message || 'Codex app-server request failed.', this.credentialPaths)));
|
|
232
423
|
}
|
|
233
424
|
else {
|
|
234
425
|
pending.resolve(message.result);
|
|
@@ -253,17 +444,17 @@ export class CodexAppServerJsonRpcClient {
|
|
|
253
444
|
if (settled)
|
|
254
445
|
return;
|
|
255
446
|
settled = true;
|
|
256
|
-
this.
|
|
447
|
+
this.terminalRejectors.delete(rejectTurn);
|
|
257
448
|
reject(error);
|
|
258
449
|
};
|
|
259
450
|
const resolveTurn = (value) => {
|
|
260
451
|
if (settled)
|
|
261
452
|
return;
|
|
262
453
|
settled = true;
|
|
263
|
-
this.
|
|
454
|
+
this.terminalRejectors.delete(rejectTurn);
|
|
264
455
|
resolve(value);
|
|
265
456
|
};
|
|
266
|
-
this.
|
|
457
|
+
this.terminalRejectors.add(rejectTurn);
|
|
267
458
|
if (this.terminalError) {
|
|
268
459
|
rejectTurn(this.terminalError);
|
|
269
460
|
return;
|
|
@@ -273,7 +464,7 @@ export class CodexAppServerJsonRpcClient {
|
|
|
273
464
|
return;
|
|
274
465
|
const messages = this.notifications.slice(startIndex);
|
|
275
466
|
try {
|
|
276
|
-
const completion = extractCodexTurnCompletion(messages);
|
|
467
|
+
const completion = extractCodexTurnCompletion(messages, this.credentialPaths);
|
|
277
468
|
if (completion) {
|
|
278
469
|
resolveTurn(completion);
|
|
279
470
|
return;
|
|
@@ -292,6 +483,39 @@ export class CodexAppServerJsonRpcClient {
|
|
|
292
483
|
poll();
|
|
293
484
|
});
|
|
294
485
|
}
|
|
486
|
+
waitForNotification(readValue, timeoutMs, timeoutMessage, signal) {
|
|
487
|
+
const startedAt = Date.now();
|
|
488
|
+
return new Promise((resolve, reject) => {
|
|
489
|
+
let settled = false;
|
|
490
|
+
const finish = (callback) => {
|
|
491
|
+
if (settled)
|
|
492
|
+
return;
|
|
493
|
+
settled = true;
|
|
494
|
+
this.terminalRejectors.delete(rejectWaiter);
|
|
495
|
+
signal?.removeEventListener('abort', abortWaiter);
|
|
496
|
+
callback();
|
|
497
|
+
};
|
|
498
|
+
const rejectWaiter = (error) => finish(() => reject(error));
|
|
499
|
+
const abortWaiter = () => rejectWaiter(new Error('Codex device-code authorization was cancelled.'));
|
|
500
|
+
this.terminalRejectors.add(rejectWaiter);
|
|
501
|
+
signal?.addEventListener('abort', abortWaiter, { once: true });
|
|
502
|
+
if (signal?.aborted)
|
|
503
|
+
return abortWaiter();
|
|
504
|
+
if (this.terminalError)
|
|
505
|
+
return rejectWaiter(this.terminalError);
|
|
506
|
+
const poll = () => {
|
|
507
|
+
if (settled)
|
|
508
|
+
return;
|
|
509
|
+
const value = readValue();
|
|
510
|
+
if (value !== null)
|
|
511
|
+
return finish(() => resolve(value));
|
|
512
|
+
if (Date.now() - startedAt > timeoutMs)
|
|
513
|
+
return rejectWaiter(new Error(timeoutMessage));
|
|
514
|
+
setTimeout(poll, 50);
|
|
515
|
+
};
|
|
516
|
+
poll();
|
|
517
|
+
});
|
|
518
|
+
}
|
|
295
519
|
rejectAll(error) {
|
|
296
520
|
for (const pending of this.pending.values())
|
|
297
521
|
pending.reject(error);
|
|
@@ -301,8 +525,8 @@ export class CodexAppServerJsonRpcClient {
|
|
|
301
525
|
if (!this.terminalError)
|
|
302
526
|
this.terminalError = error;
|
|
303
527
|
this.rejectAll(this.terminalError);
|
|
304
|
-
for (const
|
|
305
|
-
|
|
528
|
+
for (const rejectWaiter of [...this.terminalRejectors])
|
|
529
|
+
rejectWaiter(this.terminalError);
|
|
306
530
|
}
|
|
307
531
|
}
|
|
308
532
|
export class CodexAppServerModelGateway {
|
|
@@ -320,6 +544,7 @@ export class CodexAppServerModelGateway {
|
|
|
320
544
|
cwd: this.cwd,
|
|
321
545
|
env: options.env,
|
|
322
546
|
requestTimeoutMs: options.requestTimeoutMs,
|
|
547
|
+
credentialPaths: options.credentialPaths,
|
|
323
548
|
}));
|
|
324
549
|
this.modelKeyIds = {
|
|
325
550
|
...DEFAULT_CODEX_APP_SERVER_MODEL_KEY_IDS,
|
|
@@ -364,7 +589,7 @@ export class CodexAppServerModelGateway {
|
|
|
364
589
|
}
|
|
365
590
|
finally {
|
|
366
591
|
if (shouldClose)
|
|
367
|
-
client.close();
|
|
592
|
+
await client.close();
|
|
368
593
|
}
|
|
369
594
|
}
|
|
370
595
|
resolveModelId(input) {
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type CodexAppServerClient } from './codexAppServerModelGateway.js';
|
|
2
|
+
import { ModelProviderConnectionService } from './modelProviderConnectionService.js';
|
|
3
|
+
import { ModelProviderConnectionStore } from '../storage/modelProviderConnectionStore.js';
|
|
4
|
+
export type CodexDeviceCodeLoginStatus = 'pending' | 'active' | 'failed' | 'cancelled' | 'expired';
|
|
5
|
+
export interface PublicCodexDeviceCodeLoginSession {
|
|
6
|
+
id: string;
|
|
7
|
+
connectionId: string;
|
|
8
|
+
status: CodexDeviceCodeLoginStatus;
|
|
9
|
+
userCode: string;
|
|
10
|
+
verificationUrl: string;
|
|
11
|
+
expiresAt: string;
|
|
12
|
+
failureCode?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface CodexDeviceCodeLoginManagerOptions {
|
|
15
|
+
clientFactory?: (environment: NodeJS.ProcessEnv) => CodexAppServerClient;
|
|
16
|
+
ttlMs?: number;
|
|
17
|
+
now?: () => Date;
|
|
18
|
+
maxPendingPerOwner?: number;
|
|
19
|
+
maxPendingTotal?: number;
|
|
20
|
+
}
|
|
21
|
+
export declare class CodexDeviceCodeLoginManager {
|
|
22
|
+
private readonly connections;
|
|
23
|
+
private readonly store;
|
|
24
|
+
private readonly sessions;
|
|
25
|
+
private readonly sessionByConnection;
|
|
26
|
+
private readonly startingConnections;
|
|
27
|
+
private readonly clientFactory;
|
|
28
|
+
private readonly ttlMs;
|
|
29
|
+
private readonly now;
|
|
30
|
+
private readonly maxPendingPerOwner;
|
|
31
|
+
private readonly maxPendingTotal;
|
|
32
|
+
constructor(connections: ModelProviderConnectionService, store: ModelProviderConnectionStore, options?: CodexDeviceCodeLoginManagerOptions);
|
|
33
|
+
start(ownerUserId: string, connectionId: string): Promise<PublicCodexDeviceCodeLoginSession>;
|
|
34
|
+
get(ownerUserId: string, connectionId: string, sessionId: string): PublicCodexDeviceCodeLoginSession;
|
|
35
|
+
cancel(ownerUserId: string, connectionId: string, sessionId: string): Promise<PublicCodexDeviceCodeLoginSession>;
|
|
36
|
+
private requireOwned;
|
|
37
|
+
private pendingCount;
|
|
38
|
+
private scheduleRemoval;
|
|
39
|
+
}
|