@taskforcehq/taskforce 0.3.327 → 0.3.329
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Taskforce.module.css +257 -87
- package/dist/TaskforceCore.js +237 -230
- package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.js +1 -1
- package/dist/cli.js +34 -0
- package/dist/cliCloudTargetGuard.d.ts +5 -0
- package/dist/cliCloudTargetGuard.js +11 -0
- package/dist/components/activity/EntityActivityTimeline.js +15 -5
- package/dist/components/context/AttachmentPreviewHost.js +1 -1
- package/dist/components/context/ContextAttachmentManager.d.ts +3 -0
- package/dist/components/context/ContextAttachmentManager.js +116 -20
- package/dist/components/features/AnnotatedAttachmentWorkspace.js +24 -8
- package/dist/components/features/TaskSettings.d.ts +12 -1
- package/dist/components/features/TaskSettings.js +147 -40
- package/dist/components/features/agentCapabilities/AgentCapabilitiesPrototype.d.ts +1 -1
- package/dist/components/features/planning/PlanningEntitySummary.d.ts +3 -1
- package/dist/components/features/planning/PlanningEntitySummary.js +3 -2
- package/dist/components/features/planning/PlanningLinkPicker.d.ts +3 -1
- package/dist/components/features/planning/PlanningLinkPicker.js +5 -3
- package/dist/components/features/planning/PlanningModule.js +28 -14
- package/dist/components/features/planning/PlanningTaskOrderList.d.ts +1 -1
- package/dist/components/features/planning/PlanningTaskOrderList.js +17 -6
- package/dist/components/features/planning/PlanningVisualIdentity.d.ts +14 -0
- package/dist/components/features/planning/PlanningVisualIdentity.js +106 -0
- package/dist/components/features/planning/planningTaskArrangement.d.ts +1 -0
- package/dist/components/features/planning/planningTaskArrangement.js +5 -5
- package/dist/components/features/planning/planningWorkspaceModel.d.ts +11 -0
- package/dist/components/features/taskforceAgentEditorModel.js +3 -1
- package/dist/components/task/TaskActionHeader.d.ts +2 -1
- package/dist/components/task/TaskActionHeader.js +2 -2
- package/dist/components/task/TaskCard.d.ts +5 -0
- package/dist/components/task/TaskCard.js +101 -13
- package/dist/components/task/TaskContextUpload.d.ts +3 -0
- package/dist/components/task/TaskContextUpload.js +2 -2
- package/dist/components/task/TaskForm.d.ts +4 -0
- package/dist/components/task/TaskForm.js +32 -7
- package/dist/components/task/TaskImageReviews.js +28 -19
- package/dist/components/task/TaskKanban.d.ts +6 -1
- package/dist/components/task/TaskKanban.js +152 -6
- package/dist/components/task/TaskList.d.ts +5 -0
- package/dist/components/task/TaskList.js +3 -3
- package/dist/components/task/TaskStatusActions.js +11 -2
- package/dist/components/task/TaskWorkstreamPicker.js +2 -1
- package/dist/components/ui/DocumentTypeIcon.d.ts +7 -0
- package/dist/components/ui/DocumentTypeIcon.js +8 -0
- package/dist/components/ui/PasswordInput.d.ts +6 -0
- package/dist/components/ui/PasswordInput.js +11 -0
- package/dist/components/ui/TaxonomyDropdown.d.ts +9 -1
- package/dist/components/ui/TaxonomyDropdown.js +30 -3
- package/dist/components/ui/TopNoticeLayer.js +1 -1
- package/dist/components/views/AppShellHeader.js +32 -11
- package/dist/components/views/PlanComparisonPage.js +12 -0
- package/dist/components/views/StandaloneLayout.js +68 -39
- package/dist/components/views/WidgetView.js +10 -7
- package/dist/components/views/panels/PlanningDrawer.d.ts +7 -1
- package/dist/components/views/panels/PlanningDrawer.js +51 -54
- package/dist/components/views/standalone/modals/AccountSettingsModal.js +26 -17
- package/dist/config/envSchema.js +13 -0
- package/dist/config/localServiceCloudTarget.d.ts +10 -0
- package/dist/config/localServiceCloudTarget.js +76 -0
- package/dist/config/localServiceRuntimeContract.d.ts +13 -0
- package/dist/config/localServiceRuntimeContract.js +135 -0
- package/dist/core/AiProfileService.d.ts +1 -0
- package/dist/core/AiProfileService.js +48 -9
- package/dist/core/AttachmentLinkService.js +7 -4
- package/dist/core/DeletedTaskLifecycleService.d.ts +5 -0
- package/dist/core/DeletedTaskLifecycleService.js +55 -3
- package/dist/core/McpTokenService.d.ts +4 -0
- package/dist/core/McpTokenService.js +52 -0
- package/dist/core/TaskAttachmentLinksDurableMutationService.d.ts +8 -2
- package/dist/core/TaskAttachmentLinksDurableMutationService.js +51 -18
- package/dist/core/Taskforce.d.ts +124 -2
- package/dist/core/Taskforce.js +1175 -87
- package/dist/core/types.d.ts +8 -1
- package/dist/documentReviews/DocumentReviewCommentStore.d.ts +11 -0
- package/dist/documentReviews/DocumentReviewCommentStore.js +35 -2
- package/dist/documentReviews/service.d.ts +4 -0
- package/dist/documentReviews/service.js +141 -46
- package/dist/hooks/sync/useDurableLocalOutboxDrain.d.ts +1 -1
- package/dist/hooks/sync/useDurableTaskCreateMutation.js +1 -1
- package/dist/hooks/sync/useDurableTaskMetadataMutation.d.ts +1 -0
- package/dist/hooks/sync/useDurableTaskMetadataMutation.js +1 -0
- package/dist/hooks/sync/useDurableTaskStatusMutation.d.ts +1 -0
- package/dist/hooks/tasks/taskHttpMutation.js +1 -0
- package/dist/hooks/tasks/useCloudTaskSearch.d.ts +12 -0
- package/dist/hooks/tasks/useCloudTaskSearch.js +71 -0
- package/dist/hooks/tasks/useTaskDescriptionImageDraftRecovery.d.ts +16 -0
- package/dist/hooks/tasks/useTaskDescriptionImageDraftRecovery.js +197 -0
- package/dist/hooks/tasks/useTaskEditorNavigation.d.ts +16 -3
- package/dist/hooks/tasks/useTaskEditorNavigation.js +72 -13
- package/dist/hooks/tasks/useTaskFormActions.d.ts +9 -0
- package/dist/hooks/tasks/useTaskFormActions.js +96 -17
- package/dist/hooks/ui/useSettingsModel.d.ts +24 -2
- package/dist/hooks/ui/useSettingsModel.js +13 -2
- package/dist/hooks/ui/useSettingsPersistence.d.ts +12 -1
- package/dist/hooks/ui/useSettingsPersistence.js +74 -47
- package/dist/hooks/useFilterSort.d.ts +7 -3
- package/dist/hooks/useFilterSort.js +15 -5
- package/dist/hooks/useTaskData.d.ts +10 -1
- package/dist/hooks/useTaskData.js +216 -7
- package/dist/hooks/useTaskMutations.d.ts +10 -2
- package/dist/hooks/useTaskMutations.js +223 -43
- package/dist/hooks/useTaskforce.d.ts +94 -57
- package/dist/hooks/useTaskforce.js +428 -16
- package/dist/hooks/useUiNotice.d.ts +4 -0
- package/dist/hooks/useUiNotice.js +4 -0
- package/dist/mcp/adminWorkspaceRegistrar.js +3 -3
- package/dist/mcp/canonicalAssetHelpers.d.ts +13 -0
- package/dist/mcp/canonicalAssetHelpers.js +39 -5
- package/dist/mcp/collaborationRegistrar.js +15 -13
- package/dist/mcp/documentAssetRegistrar.js +60 -44
- package/dist/mcp/documentHelpers.d.ts +1 -0
- package/dist/mcp/documentHelpers.js +7 -3
- package/dist/mcp/localServiceProxy.js +4 -1
- package/dist/mcp/runtime.d.ts +16 -0
- package/dist/mcp/runtime.js +735 -210
- package/dist/mcp/taskAttachmentCommandAdapter.d.ts +2 -0
- package/dist/mcp/taskAttachmentCommandAdapter.js +14 -8
- package/dist/mcp/taskPlanningRegistrar.js +78 -67
- package/dist/mcp/toolCallCompatibility.js +38 -1
- package/dist/mcp/toolCatalog.d.ts +1 -0
- package/dist/mcp/toolRegistry.js +2 -2
- package/dist/migrations/taskSchemaMigrations.js +47 -0
- package/dist/runtime/appGateDefinitions.d.ts +30 -6
- package/dist/runtime/appGateDefinitions.js +6 -6
- package/dist/runtime/appGates.d.ts +12 -13
- package/dist/runtime/appGates.js +29 -13
- package/dist/runtime/nodeAppGates.d.ts +8 -0
- package/dist/runtime/nodeAppGates.js +27 -0
- package/dist/server/appAccess.d.ts +12 -0
- package/dist/server/appAccess.js +21 -0
- package/dist/server/authorizedWorkspaceAccess.d.ts +12 -0
- package/dist/server/authorizedWorkspaceAccess.js +40 -0
- package/dist/server/cloudCollectionRead.d.ts +25 -0
- package/dist/server/cloudCollectionRead.js +120 -0
- package/dist/server/cloudCollectionReadPool.d.ts +52 -0
- package/dist/server/cloudCollectionReadPool.js +140 -0
- package/dist/server/cloudCollectionReadWorker.d.ts +1 -0
- package/dist/server/cloudCollectionReadWorker.js +36 -0
- package/dist/server/index.d.ts +6 -11
- package/dist/server/index.js +67 -42
- package/dist/server/localServiceLease.d.ts +6 -0
- package/dist/server/localServiceLease.js +17 -1
- package/dist/server/localWorkspaceSyncServerRuntime.js +10 -3
- package/dist/server/rateLimit.d.ts +1 -0
- package/dist/server/rateLimit.js +4 -0
- package/dist/server/realtimeSyncWs.js +36 -12
- package/dist/server/routes/admin.js +1 -0
- package/dist/server/routes/agentRoles.js +3 -2
- package/dist/server/routes/agentSkills.js +3 -2
- package/dist/server/routes/agents.js +118 -16
- package/dist/server/routes/annotatedAttachments.js +3 -2
- package/dist/server/routes/auth.js +3 -1
- package/dist/server/routes/documents.d.ts +5 -2
- package/dist/server/routes/documents.js +160 -13
- package/dist/server/routes/durableTaskHttpRouters.d.ts +11 -2
- package/dist/server/routes/durableTaskHttpRouters.js +2 -2
- package/dist/server/routes/localService.js +4 -0
- package/dist/server/routes/primitives.d.ts +4 -0
- package/dist/server/routes/shared.d.ts +24 -0
- package/dist/server/routes/shared.js +114 -18
- package/dist/server/routes/sync.js +22 -0
- package/dist/server/routes/syncAuxRoutes.js +5 -2
- package/dist/server/routes/syncPullApplyRoutes.js +23 -4
- package/dist/server/routes/syncV3FeedRoutes.js +22 -18
- package/dist/server/routes/syncV3LocalCaptureRoutes.js +48 -4
- package/dist/server/routes/syncV3LocalFeedApplyRoutes.d.ts +1 -0
- package/dist/server/routes/syncV3LocalFeedApplyRoutes.js +26 -0
- package/dist/server/routes/syncV3OperationRoutes.js +27 -2
- package/dist/server/routes/tasks.js +299 -97
- package/dist/server/routes/workspaces.js +43 -1
- package/dist/server/routes.js +35 -7
- package/dist/server/workspaceDeletionAdmission.d.ts +23 -0
- package/dist/server/workspaceDeletionAdmission.js +50 -0
- package/dist/service/localServiceCli.js +52 -25
- package/dist/service/localServiceClientLifecycle.js +93 -6
- package/dist/services/codexAppServerModelGateway.d.ts +112 -0
- package/dist/services/codexAppServerModelGateway.js +438 -0
- package/dist/services/taskforceAgentMcpBridge.d.ts +7 -1
- package/dist/services/taskforceAgentMcpBridge.js +23 -3
- package/dist/shared/planningIdentity.d.ts +20 -0
- package/dist/shared/planningIdentity.js +79 -0
- package/dist/shared/taskforceAgentDefinition.js +7 -1
- package/dist/shared/taskforceAgentModels.d.ts +1 -0
- package/dist/shared/taskforceAgentModels.js +30 -1
- package/dist/storage/postgresAdapter.d.ts +20 -3
- package/dist/storage/postgresAdapter.js +110 -14
- package/dist/storage/postgresRequestDiagnostics.d.ts +8 -0
- package/dist/storage/postgresRequestDiagnostics.js +24 -0
- package/dist/storage/postgresWorker.js +13 -4
- package/dist/storage/postgresWorkerProtocol.d.ts +29 -0
- package/dist/storage/postgresWorkerProtocol.js +30 -0
- package/dist/storage/workspaceAssetStore.d.ts +32 -0
- package/dist/storage/workspaceAssetStore.js +70 -0
- package/dist/sync/cloudSyncApi.d.ts +4 -1
- package/dist/sync/cloudSyncApi.js +7 -2
- package/dist/sync/contentSyncState.d.ts +1 -1
- package/dist/sync/coordinator/localSyncExecutionPermitStore.d.ts +17 -0
- package/dist/sync/coordinator/localSyncExecutionPermitStore.js +77 -23
- package/dist/sync/coordinator/localWorkspaceSyncRunner.js +6 -2
- package/dist/sync/coordinator/workspaceSyncTransportGateway.js +4 -2
- package/dist/sync/engine/workspaceSyncEngineBrowserGatewayRemoteServices.js +20 -2
- package/dist/sync/engine/workspaceSyncEngineLocalServices.d.ts +4 -0
- package/dist/sync/engine/workspaceSyncEngineLocalServices.js +11 -0
- package/dist/sync/engine/workspaceSyncEngineRemoteServices.d.ts +16 -0
- package/dist/sync/engine/workspaceSyncEngineRemoteServices.js +2 -1
- package/dist/sync/engine/workspaceSyncEngineServerRemoteServices.d.ts +1 -1
- package/dist/sync/engine/workspaceSyncEngineServerRemoteServices.js +46 -4
- package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.d.ts +3 -1
- package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.js +51 -11
- package/dist/sync/engine/workspaceSyncEngineTransfers.d.ts +1 -1
- package/dist/sync/engine/workspaceSyncEngineTransfers.js +8 -3
- package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.js +2 -0
- package/dist/sync/syncApplyHandlers.d.ts +3 -1
- package/dist/sync/syncApplyHandlers.js +29 -0
- package/dist/sync/syncService.d.ts +2 -0
- package/dist/sync/syncService.js +13 -1
- package/dist/sync/taskSyncPayload.d.ts +1 -0
- package/dist/sync/taskSyncPayload.js +6 -0
- package/dist/sync/v3/combinedFeedCapability.js +4 -0
- package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.d.ts +3 -0
- package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.js +31 -3
- package/dist/sync/v3/durableTaskChecklistMutationRouter.d.ts +2 -0
- package/dist/sync/v3/durableTaskChecklistMutationRouter.js +4 -0
- package/dist/sync/v3/durableTaskHttpBulkMutationRouter.d.ts +1 -0
- package/dist/sync/v3/durableTaskHttpBulkMutationRouter.js +47 -12
- package/dist/sync/v3/durableTaskHttpRootMutationRouter.d.ts +5 -3
- package/dist/sync/v3/durableTaskHttpRootMutationRouter.js +27 -2
- package/dist/sync/v3/localInitiativeOutboxService.js +4 -2
- package/dist/sync/v3/localOutboxDispatcher.js +5 -1
- package/dist/sync/v3/localTaskAttachmentLinksOutboxHandler.js +12 -2
- package/dist/sync/v3/localTaskAttachmentLinksOutboxService.d.ts +3 -0
- package/dist/sync/v3/localTaskAttachmentLinksOutboxService.js +62 -10
- package/dist/sync/v3/localTaskCreateOutboxService.js +15 -6
- package/dist/sync/v3/localTaskMetadataClient.d.ts +1 -0
- package/dist/sync/v3/localTaskMetadataClient.js +1 -0
- package/dist/sync/v3/localTaskMetadataOutboxHandler.js +5 -1
- package/dist/sync/v3/localTaskMetadataOutboxService.d.ts +2 -0
- package/dist/sync/v3/localTaskMetadataOutboxService.js +7 -0
- package/dist/sync/v3/localTaskRestoreOutboxService.js +14 -6
- package/dist/sync/v3/localTaskStatusClient.d.ts +1 -0
- package/dist/sync/v3/localTaskStatusClient.js +6 -1
- package/dist/sync/v3/localTaskStatusOutboxService.d.ts +2 -0
- package/dist/sync/v3/localTaskStatusOutboxService.js +54 -13
- package/dist/sync/v3/localWorkstreamOutboxService.js +4 -2
- package/dist/sync/v3/syncDurabilityStore.d.ts +15 -0
- package/dist/sync/v3/syncDurabilityStore.js +201 -43
- package/dist/sync/v3/taskAttachmentLinksMutationService.d.ts +7 -4
- package/dist/sync/v3/taskAttachmentLinksMutationService.js +37 -12
- package/dist/sync/v3/taskChecklistMutationService.d.ts +4 -2
- package/dist/sync/v3/taskChecklistMutationService.js +4 -0
- package/dist/sync/v3/taskCreateMutationService.d.ts +2 -2
- package/dist/sync/v3/taskCreateMutationService.js +7 -4
- package/dist/sync/v3/taskMetadataCoexistence.js +4 -0
- package/dist/sync/v3/taskMetadataMutationService.d.ts +3 -0
- package/dist/sync/v3/taskMetadataMutationService.js +4 -0
- package/dist/sync/v3/taskRestoreMutationService.d.ts +2 -2
- package/dist/sync/v3/taskRestoreMutationService.js +7 -4
- package/dist/sync/v3/taskStatusMutationService.d.ts +2 -0
- package/dist/sync/v3/taskStatusMutationService.js +4 -0
- package/dist/sync/v3/workflowAssignmentSync.d.ts +1 -0
- package/dist/sync/v3/workflowAssignmentSync.js +3 -0
- package/dist/sync/v3/workspaceSyncV2ProjectionExclusions.d.ts +1 -1
- package/dist/sync/v3/workspaceSyncV2ProjectionExclusions.js +14 -12
- package/dist/sync/v3/workspaceSyncV3AttachmentApplyObligationStore.d.ts +11 -0
- package/dist/sync/v3/workspaceSyncV3AttachmentApplyObligationStore.js +27 -10
- package/dist/sync/v3/workspaceSyncV3AttachmentAssetHydration.d.ts +2 -1
- package/dist/sync/v3/workspaceSyncV3AttachmentAssetHydration.js +52 -10
- package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.js +10 -1
- package/dist/sync/v3/workspaceSyncV3CombinedFeedOrchestrator.js +15 -4
- package/dist/sync/v3/workspaceSyncV3CombinedLocalApply.js +66 -13
- package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.d.ts +11 -0
- package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.js +57 -22
- package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.d.ts +10 -4
- package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.js +124 -51
- package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.d.ts +10 -0
- package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.js +120 -28
- package/dist/sync/v3/workspaceSyncV3CombinedWireContract.d.ts +3 -1
- package/dist/sync/v3/workspaceSyncV3CombinedWireContract.js +18 -0
- package/dist/sync/v3/workspaceSyncV3CoverageRegistry.js +6 -0
- package/dist/sync/v3/workspaceSyncV3FeedProfile.d.ts +1 -1
- package/dist/sync/v3/workspaceSyncV3LegacyBoundaryAttestation.d.ts +1 -0
- package/dist/sync/v3/workspaceSyncV3LegacyBoundaryAttestation.js +23 -10
- package/dist/sync/v3/workspaceSyncV3NestedTaskApply.d.ts +3 -0
- package/dist/sync/v3/workspaceSyncV3NestedTaskApply.js +64 -13
- package/dist/sync/v3/workspaceSyncV3NestedTaskCodecs.d.ts +9 -0
- package/dist/sync/v3/workspaceSyncV3NestedTaskCodecs.js +26 -0
- package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.d.ts +15 -5
- package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.js +50 -14
- package/dist/sync/v3/workspaceSyncV3NestedTaskRepairSnapshot.d.ts +2 -1
- package/dist/sync/v3/workspaceSyncV3NestedTaskRepairSnapshot.js +11 -3
- package/dist/sync/v3/workspaceSyncV3OperationProtocol.d.ts +3 -0
- package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.d.ts +2 -0
- package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.js +19 -7
- package/dist/sync/v3/workspaceSyncV3RepairSqlBatching.d.ts +2 -0
- package/dist/sync/v3/workspaceSyncV3RepairSqlBatching.js +10 -0
- package/dist/sync/v3/workspaceSyncV3TaskCommentAudit.js +9 -2
- package/dist/sync/v3/workspaceSyncV3TaskCoverCoverage.d.ts +7 -0
- package/dist/sync/v3/workspaceSyncV3TaskCoverCoverage.js +37 -0
- package/dist/sync/v3/workspaceSyncV3TaskCoverWireContract.d.ts +6 -0
- package/dist/sync/v3/workspaceSyncV3TaskCoverWireContract.js +9 -0
- package/dist/sync/v3/workspaceSyncV3TaskRootProjection.d.ts +1 -1
- package/dist/sync/v3/workspaceSyncV3TaskRootProjection.js +1 -1
- package/dist/sync/workspacePullFeed.d.ts +6 -1
- package/dist/sync/workspacePullFeed.js +174 -162
- package/dist/sync/workspaceRepair.d.ts +3 -0
- package/dist/sync/workspaceRepair.js +67 -6
- package/dist/sync/workspaceSyncModel.d.ts +11 -0
- package/dist/sync/workspaceSyncModel.js +27 -2
- package/dist/types.d.ts +55 -1
- package/dist/types.js +6 -0
- package/dist/ui/assets/{AiIdentityRosterCard-DB1BLO_j.js → AiIdentityRosterCard-BZM4aQnM.js} +1 -1
- package/dist/ui/assets/AiProfilesModule-BbAEWtHH.js +1 -0
- package/dist/ui/assets/AnnotatedAttachmentWorkspace-B68Wg-RV.js +3 -0
- package/dist/ui/assets/AnnotatedAttachmentWorkspace-TzYu7pkG.css +1 -0
- package/dist/ui/assets/AssetTraySortControl-C8Rztyal.js +1 -0
- package/dist/ui/assets/ContextAttachmentManager-Cj3c7X9y.js +3 -0
- package/dist/ui/assets/{DocumentWorkspace-BC7sy5TG.js → DocumentWorkspace-B5uvzems.js} +4 -4
- package/dist/ui/assets/EntityActivityTimeline-BVFvCB5R.js +1 -0
- package/dist/ui/assets/PlanningModule-B5DWQOGz.js +1 -0
- package/dist/ui/assets/PlanningModule-CoIR9hbV.css +1 -0
- package/dist/ui/assets/PlansPage-AY4cGWco.js +1 -0
- package/dist/ui/assets/TaskContextUpload-DZxTVesW.js +1 -0
- package/dist/ui/assets/TaskContextUpload-qmBeUw3u.css +1 -0
- package/dist/ui/assets/TaskSettings-BeWAuyZj.js +12 -0
- package/dist/ui/assets/{TaskforceAgentsModule-CkAxW19K.js → TaskforceAgentsModule-BifCYtjR.js} +6 -6
- package/dist/ui/assets/WorkflowManagerModule-DEr5di_r.js +1 -0
- package/dist/ui/assets/index-I5zhdtgt.js +7 -0
- package/dist/ui/assets/index-VRFsx3wz.css +1 -0
- package/dist/ui/assets/{vendor-icons-B8ZNsH1g.js → vendor-icons-D9Lpw-j4.js} +1 -1
- package/dist/ui/index.html +3 -3
- package/dist/utils/constants.d.ts +2 -2
- package/dist/utils/constants.js +1 -1
- package/dist/utils/contextAttachmentUpload.d.ts +2 -0
- package/dist/utils/contextAttachmentUpload.js +7 -0
- package/dist/utils/contextFiles.d.ts +1 -1
- package/dist/utils/contextFiles.js +4 -4
- package/dist/utils/taskActivity.d.ts +3 -2
- package/dist/utils/taskActivity.js +19 -2
- package/dist/utils/taskEditorReconciliation.d.ts +40 -0
- package/dist/utils/taskEditorReconciliation.js +217 -0
- package/dist/utils/taskNormalization.d.ts +1 -0
- package/dist/utils/taskNormalization.js +39 -0
- package/dist/utils/taskSearch.js +2 -2
- package/dist/utils/uiNotice.d.ts +4 -0
- package/package.json +21 -4
- package/dist/ui/assets/AiProfilesModule-DPxQeF9N.js +0 -1
- package/dist/ui/assets/AnnotatedAttachmentWorkspace-CBRZ8rca.css +0 -1
- package/dist/ui/assets/AnnotatedAttachmentWorkspace-DHNYaNg6.js +0 -3
- package/dist/ui/assets/AssetTraySortControl-DphbyHVc.js +0 -1
- package/dist/ui/assets/ContextAttachmentManager-CMxSzHqc.js +0 -3
- package/dist/ui/assets/EntityActivityTimeline-pJ2ZjZ-k.js +0 -1
- package/dist/ui/assets/PlanningModule-CeTqXMMz.css +0 -1
- package/dist/ui/assets/PlanningModule-t5GbvVR9.js +0 -1
- package/dist/ui/assets/PlansPage-BVH_NfgT.js +0 -1
- package/dist/ui/assets/TaskContextUpload-Ds4LnDzV.css +0 -1
- package/dist/ui/assets/TaskContextUpload-bl4fOOUz.js +0 -1
- package/dist/ui/assets/TaskSettings-xVsxSa0g.js +0 -12
- package/dist/ui/assets/WorkflowManagerModule-BKqIGVnF.js +0 -1
- package/dist/ui/assets/index-BzJlVnNS.css +0 -1
- package/dist/ui/assets/index-Cx7vZJHL.js +0 -7
|
@@ -214,6 +214,20 @@ export const TASKFORCE_AGENT_MODEL_OPTIONS = [
|
|
|
214
214
|
supportsTemperature: true,
|
|
215
215
|
defaultMaxTokens: 512,
|
|
216
216
|
},
|
|
217
|
+
{
|
|
218
|
+
key: 'openai.codex-gpt-5-6-sol',
|
|
219
|
+
providerKey: 'openai',
|
|
220
|
+
label: 'Codex GPT-5.6 Sol',
|
|
221
|
+
source: 'subscription_dev',
|
|
222
|
+
runtime: 'subscription-dev',
|
|
223
|
+
defaultTier: 'advanced',
|
|
224
|
+
runtimeModelId: 'gpt-5.6-sol',
|
|
225
|
+
availability: 'configured',
|
|
226
|
+
visible: true,
|
|
227
|
+
supportsTemperature: false,
|
|
228
|
+
defaultMaxTokens: 1024,
|
|
229
|
+
devOnly: true,
|
|
230
|
+
},
|
|
217
231
|
{
|
|
218
232
|
key: 'openai.gpt-5-4',
|
|
219
233
|
providerKey: 'openai',
|
|
@@ -228,8 +242,20 @@ export const TASKFORCE_AGENT_MODEL_OPTIONS = [
|
|
|
228
242
|
defaultMaxTokens: 1024,
|
|
229
243
|
},
|
|
230
244
|
];
|
|
245
|
+
function isTruthy(value) {
|
|
246
|
+
const normalized = String(value || '').trim().toLowerCase();
|
|
247
|
+
return normalized === '1' || normalized === 'true' || normalized === 'yes' || normalized === 'on';
|
|
248
|
+
}
|
|
249
|
+
export function isTaskforceAgentSubscriptionDevModelsEnabled() {
|
|
250
|
+
const globals = globalThis;
|
|
251
|
+
return (typeof __TASKFORCE_AGENT_SUBSCRIPTION_DEV_MODELS__ !== 'undefined' && __TASKFORCE_AGENT_SUBSCRIPTION_DEV_MODELS__)
|
|
252
|
+
|| isTruthy(globals.__TASKFORCE_AGENT_SUBSCRIPTION_DEV_MODELS__)
|
|
253
|
+
|| isTruthy(globals.process?.env?.TASKFORCE_AGENT_SUBSCRIPTION_DEV_MODELS);
|
|
254
|
+
}
|
|
231
255
|
export function isTaskforceAgentModelVisible(model) {
|
|
232
|
-
return model.visible
|
|
256
|
+
return model.visible
|
|
257
|
+
&& model.availability !== 'account_unavailable'
|
|
258
|
+
&& (!model.devOnly || isTaskforceAgentSubscriptionDevModelsEnabled());
|
|
233
259
|
}
|
|
234
260
|
export function getTaskforceAgentModel(modelKey) {
|
|
235
261
|
const key = String(modelKey || '').trim();
|
|
@@ -292,6 +318,9 @@ export function normalizeTaskforceAgentModelSelection(input) {
|
|
|
292
318
|
&& !connectionScope) {
|
|
293
319
|
return null;
|
|
294
320
|
}
|
|
321
|
+
if (modelSource === 'subscription_dev' && connectionScope !== 'local_dev') {
|
|
322
|
+
return null;
|
|
323
|
+
}
|
|
295
324
|
const connectionId = String(input.connectionId || '').trim();
|
|
296
325
|
return {
|
|
297
326
|
providerKey: model.providerKey,
|
|
@@ -1,4 +1,14 @@
|
|
|
1
1
|
import { type DatabaseAdapter, type DatabaseStatement } from './databaseAdapter.js';
|
|
2
|
+
import { type PostgresAdapterDeadlineOptions, type PostgresWorkerOperation } from './postgresWorkerProtocol.js';
|
|
3
|
+
export declare class PostgresWorkerOutcomeUnknownError extends Error {
|
|
4
|
+
readonly code = "POSTGRES_WORKER_OUTCOME_UNKNOWN";
|
|
5
|
+
readonly operation: PostgresWorkerOperation;
|
|
6
|
+
constructor(operation: PostgresWorkerOperation, detail?: string);
|
|
7
|
+
}
|
|
8
|
+
export declare class PostgresWorkerUnavailableError extends Error {
|
|
9
|
+
readonly code = "POSTGRES_WORKER_UNAVAILABLE";
|
|
10
|
+
constructor();
|
|
11
|
+
}
|
|
2
12
|
export declare function replaceQMarkParams(sql: string, params: unknown[]): {
|
|
3
13
|
text: string;
|
|
4
14
|
values: unknown[];
|
|
@@ -6,13 +16,20 @@ export declare function replaceQMarkParams(sql: string, params: unknown[]): {
|
|
|
6
16
|
export declare function translateInsertOrReplace(sql: string): string;
|
|
7
17
|
export declare class PostgresAdapter implements DatabaseAdapter {
|
|
8
18
|
readonly provider: "postgres";
|
|
9
|
-
|
|
10
|
-
private readonly
|
|
19
|
+
private worker;
|
|
20
|
+
private readonly connectionString;
|
|
21
|
+
private readonly deadlines;
|
|
22
|
+
private readonly retiringWorkers;
|
|
23
|
+
private consecutiveUnexpectedExits;
|
|
24
|
+
private closed;
|
|
11
25
|
private readonly encoder;
|
|
12
26
|
private readonly decoder;
|
|
13
27
|
private txId;
|
|
14
28
|
private savepointCounter;
|
|
15
|
-
constructor(connectionString?: string);
|
|
29
|
+
constructor(connectionString?: string, deadlineOptions?: PostgresAdapterDeadlineOptions);
|
|
30
|
+
get open(): boolean;
|
|
31
|
+
private createWorker;
|
|
32
|
+
private quarantineWorker;
|
|
16
33
|
private callWorker;
|
|
17
34
|
private query;
|
|
18
35
|
private bindParams;
|
|
@@ -1,13 +1,32 @@
|
|
|
1
1
|
import { TextDecoder, TextEncoder } from 'util';
|
|
2
2
|
import { Worker } from 'worker_threads';
|
|
3
|
+
import { performance } from 'node:perf_hooks';
|
|
3
4
|
import { assertSynchronousTransactionResult, } from './databaseAdapter.js';
|
|
5
|
+
import { recordPostgresWorkerWait } from './postgresRequestDiagnostics.js';
|
|
6
|
+
import { resolvePostgresWorkerDeadlines, } from './postgresWorkerProtocol.js';
|
|
4
7
|
const RESPONSE_STATUS_INDEX = 0;
|
|
5
8
|
const RESPONSE_LENGTH_INDEX = 1;
|
|
6
9
|
const RESPONSE_READY = 1;
|
|
7
10
|
const RESPONSE_INITIAL = 0;
|
|
8
|
-
const RESPONSE_TIMEOUT_MS = 20_000;
|
|
9
11
|
const RESPONSE_BUFFER_BYTES = 2 * 1024 * 1024;
|
|
10
12
|
const MAX_RESPONSE_BUFFER_BYTES = 64 * 1024 * 1024;
|
|
13
|
+
export class PostgresWorkerOutcomeUnknownError extends Error {
|
|
14
|
+
code = 'POSTGRES_WORKER_OUTCOME_UNKNOWN';
|
|
15
|
+
operation;
|
|
16
|
+
constructor(operation, detail = 'response deadline exceeded') {
|
|
17
|
+
super(`[Taskforce] Postgres worker ${operation} outcome is unknown (${detail}). `
|
|
18
|
+
+ 'Do not retry a write without the same idempotency identity.');
|
|
19
|
+
this.name = 'PostgresWorkerOutcomeUnknownError';
|
|
20
|
+
this.operation = operation;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export class PostgresWorkerUnavailableError extends Error {
|
|
24
|
+
code = 'POSTGRES_WORKER_UNAVAILABLE';
|
|
25
|
+
constructor() {
|
|
26
|
+
super('[Taskforce] Postgres worker is recovering after a failed operation.');
|
|
27
|
+
this.name = 'PostgresWorkerUnavailableError';
|
|
28
|
+
}
|
|
29
|
+
}
|
|
11
30
|
function isPlainObject(value) {
|
|
12
31
|
return !!value && typeof value === 'object' && !Array.isArray(value);
|
|
13
32
|
}
|
|
@@ -60,37 +79,102 @@ function toRowCount(result) {
|
|
|
60
79
|
}
|
|
61
80
|
export class PostgresAdapter {
|
|
62
81
|
provider = 'postgres';
|
|
63
|
-
|
|
64
|
-
|
|
82
|
+
worker = null;
|
|
83
|
+
connectionString;
|
|
84
|
+
deadlines;
|
|
85
|
+
retiringWorkers = new WeakSet();
|
|
86
|
+
consecutiveUnexpectedExits = 0;
|
|
87
|
+
closed = false;
|
|
65
88
|
encoder = new TextEncoder();
|
|
66
89
|
decoder = new TextDecoder();
|
|
67
90
|
txId = null;
|
|
68
91
|
savepointCounter = 0;
|
|
69
|
-
constructor(connectionString) {
|
|
92
|
+
constructor(connectionString, deadlineOptions = {}) {
|
|
70
93
|
if (!connectionString || !connectionString.trim()) {
|
|
71
94
|
throw new Error('[Taskforce] Postgres adapter requires a non-empty connection string.');
|
|
72
95
|
}
|
|
73
|
-
this.
|
|
96
|
+
this.connectionString = connectionString;
|
|
97
|
+
this.deadlines = resolvePostgresWorkerDeadlines(deadlineOptions);
|
|
98
|
+
this.worker = this.createWorker();
|
|
99
|
+
}
|
|
100
|
+
get open() {
|
|
101
|
+
return !this.closed;
|
|
102
|
+
}
|
|
103
|
+
createWorker() {
|
|
104
|
+
const worker = new Worker(new URL('./postgresWorker.js', import.meta.url), {
|
|
74
105
|
workerData: {
|
|
75
|
-
connectionString
|
|
106
|
+
connectionString: this.connectionString,
|
|
107
|
+
deadlines: this.deadlines,
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
worker.on('error', () => {
|
|
111
|
+
// The exit handler replaces an unexpectedly failed worker. Keeping an error
|
|
112
|
+
// listener here also prevents Worker from escalating it as an uncaught error.
|
|
113
|
+
});
|
|
114
|
+
worker.on('exit', () => {
|
|
115
|
+
if (this.closed || this.retiringWorkers.has(worker) || this.worker !== worker)
|
|
116
|
+
return;
|
|
117
|
+
this.worker = null;
|
|
118
|
+
if (this.consecutiveUnexpectedExits >= 1)
|
|
119
|
+
return;
|
|
120
|
+
this.consecutiveUnexpectedExits += 1;
|
|
121
|
+
try {
|
|
122
|
+
this.worker = this.createWorker();
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
// Leave the adapter unavailable instead of creating an unbounded restart loop.
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
return worker;
|
|
129
|
+
}
|
|
130
|
+
quarantineWorker(worker) {
|
|
131
|
+
if (this.worker === worker)
|
|
132
|
+
this.worker = null;
|
|
133
|
+
this.txId = null;
|
|
134
|
+
this.retiringWorkers.add(worker);
|
|
135
|
+
void worker.terminate()
|
|
136
|
+
.catch(() => undefined)
|
|
137
|
+
.finally(() => {
|
|
138
|
+
if (this.closed || this.worker)
|
|
139
|
+
return;
|
|
140
|
+
try {
|
|
141
|
+
this.worker = this.createWorker();
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
// A later process-level health check can restart a persistently broken runtime.
|
|
76
145
|
}
|
|
77
146
|
});
|
|
78
147
|
}
|
|
79
148
|
callWorker(payload, responseBufferBytes = RESPONSE_BUFFER_BYTES) {
|
|
149
|
+
if (this.closed)
|
|
150
|
+
throw new Error('[Taskforce] Postgres adapter is closed.');
|
|
151
|
+
const worker = this.worker;
|
|
152
|
+
if (!worker)
|
|
153
|
+
throw new PostgresWorkerUnavailableError();
|
|
80
154
|
const statusBuffer = new SharedArrayBuffer(8);
|
|
81
155
|
const status = new Int32Array(statusBuffer);
|
|
82
156
|
status[RESPONSE_STATUS_INDEX] = RESPONSE_INITIAL;
|
|
83
157
|
status[RESPONSE_LENGTH_INDEX] = 0;
|
|
84
158
|
const responseBuffer = new SharedArrayBuffer(responseBufferBytes);
|
|
85
159
|
const responseBytes = new Uint8Array(responseBuffer);
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
160
|
+
try {
|
|
161
|
+
worker.postMessage({
|
|
162
|
+
payload,
|
|
163
|
+
statusBuffer,
|
|
164
|
+
responseBuffer
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
this.quarantineWorker(worker);
|
|
169
|
+
const detail = error instanceof Error ? error.message : 'worker transport failed';
|
|
170
|
+
throw new PostgresWorkerOutcomeUnknownError(payload.op, detail);
|
|
171
|
+
}
|
|
172
|
+
const waitStartedAt = performance.now();
|
|
173
|
+
const waitResult = Atomics.wait(status, RESPONSE_STATUS_INDEX, RESPONSE_INITIAL, this.deadlines.responseTimeoutMs);
|
|
174
|
+
recordPostgresWorkerWait(payload.op, performance.now() - waitStartedAt);
|
|
92
175
|
if (waitResult === 'timed-out') {
|
|
93
|
-
|
|
176
|
+
this.quarantineWorker(worker);
|
|
177
|
+
throw new PostgresWorkerOutcomeUnknownError(payload.op);
|
|
94
178
|
}
|
|
95
179
|
const responseLength = status[RESPONSE_LENGTH_INDEX];
|
|
96
180
|
if (!Number.isFinite(responseLength) || responseLength <= 0 || responseLength > responseBufferBytes) {
|
|
@@ -98,6 +182,7 @@ export class PostgresAdapter {
|
|
|
98
182
|
}
|
|
99
183
|
const body = this.decoder.decode(responseBytes.subarray(0, responseLength));
|
|
100
184
|
const parsed = JSON.parse(body);
|
|
185
|
+
this.consecutiveUnexpectedExits = 0;
|
|
101
186
|
if (!parsed.ok && parsed.errorCode === 'RESPONSE_BUFFER_TOO_SMALL') {
|
|
102
187
|
const requiredBytes = Number(parsed.requiredBytes);
|
|
103
188
|
const responseToken = String(parsed.responseToken || '').trim();
|
|
@@ -226,11 +311,22 @@ export class PostgresAdapter {
|
|
|
226
311
|
return options?.simple ? null : [];
|
|
227
312
|
}
|
|
228
313
|
close() {
|
|
314
|
+
if (this.closed)
|
|
315
|
+
return;
|
|
316
|
+
const worker = this.worker;
|
|
317
|
+
if (!worker) {
|
|
318
|
+
this.closed = true;
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
229
321
|
try {
|
|
230
322
|
this.callWorker({ op: 'close' });
|
|
231
323
|
}
|
|
232
324
|
finally {
|
|
233
|
-
this.
|
|
325
|
+
this.closed = true;
|
|
326
|
+
if (this.worker === worker)
|
|
327
|
+
this.worker = null;
|
|
328
|
+
this.retiringWorkers.add(worker);
|
|
329
|
+
void worker.terminate();
|
|
234
330
|
}
|
|
235
331
|
}
|
|
236
332
|
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type RequestPerformanceDiagnostics = {
|
|
2
|
+
postgresQueryCount: number;
|
|
3
|
+
postgresWorkerCallCount: number;
|
|
4
|
+
postgresWorkerWaitMs: number;
|
|
5
|
+
};
|
|
6
|
+
export declare function runWithRequestPerformanceDiagnostics<T>(enabled: boolean, callback: () => T): T;
|
|
7
|
+
export declare function recordPostgresWorkerWait(operation: string, durationMs: number): void;
|
|
8
|
+
export declare function getRequestPerformanceDiagnostics(): RequestPerformanceDiagnostics | null;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
|
+
const requestPerformanceStorage = new AsyncLocalStorage();
|
|
3
|
+
export function runWithRequestPerformanceDiagnostics(enabled, callback) {
|
|
4
|
+
if (!enabled)
|
|
5
|
+
return callback();
|
|
6
|
+
return requestPerformanceStorage.run({
|
|
7
|
+
postgresQueryCount: 0,
|
|
8
|
+
postgresWorkerCallCount: 0,
|
|
9
|
+
postgresWorkerWaitMs: 0,
|
|
10
|
+
}, callback);
|
|
11
|
+
}
|
|
12
|
+
export function recordPostgresWorkerWait(operation, durationMs) {
|
|
13
|
+
const diagnostics = requestPerformanceStorage.getStore();
|
|
14
|
+
if (!diagnostics)
|
|
15
|
+
return;
|
|
16
|
+
diagnostics.postgresWorkerCallCount += 1;
|
|
17
|
+
if (operation === 'query')
|
|
18
|
+
diagnostics.postgresQueryCount += 1;
|
|
19
|
+
diagnostics.postgresWorkerWaitMs += Math.max(0, durationMs);
|
|
20
|
+
}
|
|
21
|
+
export function getRequestPerformanceDiagnostics() {
|
|
22
|
+
const diagnostics = requestPerformanceStorage.getStore();
|
|
23
|
+
return diagnostics ? { ...diagnostics } : null;
|
|
24
|
+
}
|
|
@@ -14,11 +14,16 @@ function pruneRetainedResponses(now = Date.now()) {
|
|
|
14
14
|
retainedResponses.delete(token);
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
|
-
function createPool(connectionString) {
|
|
17
|
+
function createPool(connectionString, deadlines) {
|
|
18
18
|
const require = createRequire(import.meta.url);
|
|
19
19
|
try {
|
|
20
20
|
const pg = require('pg');
|
|
21
|
-
return new pg.Pool({
|
|
21
|
+
return new pg.Pool({
|
|
22
|
+
connectionString,
|
|
23
|
+
connectionTimeoutMillis: deadlines.connectionTimeoutMs,
|
|
24
|
+
statement_timeout: deadlines.statementTimeoutMs,
|
|
25
|
+
idle_in_transaction_session_timeout: deadlines.idleTransactionTimeoutMs,
|
|
26
|
+
});
|
|
22
27
|
}
|
|
23
28
|
catch (error) {
|
|
24
29
|
const detail = error instanceof Error ? ` (${error.message})` : '';
|
|
@@ -96,11 +101,15 @@ function writeRetainedResponse(statusBuffer, responseBuffer, responseToken) {
|
|
|
96
101
|
Atomics.store(status, RESPONSE_STATUS_INDEX, RESPONSE_READY);
|
|
97
102
|
Atomics.notify(status, RESPONSE_STATUS_INDEX, 1);
|
|
98
103
|
}
|
|
99
|
-
const
|
|
104
|
+
const runtimeOptions = workerData;
|
|
105
|
+
const connectionString = String(runtimeOptions?.connectionString || '').trim();
|
|
100
106
|
if (!connectionString) {
|
|
101
107
|
throw new Error('[Taskforce] Postgres worker requires connection string.');
|
|
102
108
|
}
|
|
103
|
-
|
|
109
|
+
if (!runtimeOptions.deadlines) {
|
|
110
|
+
throw new Error('[Taskforce] Postgres worker requires deadline configuration.');
|
|
111
|
+
}
|
|
112
|
+
const pool = createPool(connectionString, runtimeOptions.deadlines);
|
|
104
113
|
const txClients = new Map();
|
|
105
114
|
async function handleMessage(message) {
|
|
106
115
|
const { payload } = message;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export type PostgresWorkerOperation = 'query' | 'begin' | 'commit' | 'rollback' | 'close' | 'read-response';
|
|
2
|
+
export type PostgresWorkerRequestPayload = {
|
|
3
|
+
op: PostgresWorkerOperation;
|
|
4
|
+
sql?: string;
|
|
5
|
+
values?: unknown[];
|
|
6
|
+
txId?: string;
|
|
7
|
+
responseToken?: string;
|
|
8
|
+
};
|
|
9
|
+
export type PostgresWorkerQueryResult = {
|
|
10
|
+
rows: Record<string, unknown>[];
|
|
11
|
+
rowCount?: number;
|
|
12
|
+
};
|
|
13
|
+
export type PostgresWorkerResponsePayload = {
|
|
14
|
+
ok: boolean;
|
|
15
|
+
result?: PostgresWorkerQueryResult;
|
|
16
|
+
error?: string;
|
|
17
|
+
errorCode?: 'RESPONSE_BUFFER_TOO_SMALL';
|
|
18
|
+
requiredBytes?: number;
|
|
19
|
+
responseToken?: string;
|
|
20
|
+
};
|
|
21
|
+
export type PostgresWorkerDeadlines = {
|
|
22
|
+
responseTimeoutMs: number;
|
|
23
|
+
statementTimeoutMs: number;
|
|
24
|
+
connectionTimeoutMs: number;
|
|
25
|
+
idleTransactionTimeoutMs: number;
|
|
26
|
+
};
|
|
27
|
+
export type PostgresAdapterDeadlineOptions = Partial<PostgresWorkerDeadlines>;
|
|
28
|
+
export declare const DEFAULT_POSTGRES_WORKER_DEADLINES: PostgresWorkerDeadlines;
|
|
29
|
+
export declare function resolvePostgresWorkerDeadlines(options?: PostgresAdapterDeadlineOptions): PostgresWorkerDeadlines;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export const DEFAULT_POSTGRES_WORKER_DEADLINES = {
|
|
2
|
+
responseTimeoutMs: 20_000,
|
|
3
|
+
statementTimeoutMs: 15_000,
|
|
4
|
+
connectionTimeoutMs: 3_000,
|
|
5
|
+
idleTransactionTimeoutMs: 60_000,
|
|
6
|
+
};
|
|
7
|
+
const MIN_RESPONSE_MARGIN_MS = 100;
|
|
8
|
+
function positiveInteger(value, name) {
|
|
9
|
+
const parsed = Number(value);
|
|
10
|
+
if (!Number.isSafeInteger(parsed) || parsed <= 0) {
|
|
11
|
+
throw new Error(`[Taskforce] ${name} must be a positive integer.`);
|
|
12
|
+
}
|
|
13
|
+
return parsed;
|
|
14
|
+
}
|
|
15
|
+
export function resolvePostgresWorkerDeadlines(options = {}) {
|
|
16
|
+
const deadlines = {
|
|
17
|
+
responseTimeoutMs: positiveInteger(options.responseTimeoutMs ?? DEFAULT_POSTGRES_WORKER_DEADLINES.responseTimeoutMs, 'Postgres worker response timeout'),
|
|
18
|
+
statementTimeoutMs: positiveInteger(options.statementTimeoutMs ?? DEFAULT_POSTGRES_WORKER_DEADLINES.statementTimeoutMs, 'Postgres statement timeout'),
|
|
19
|
+
connectionTimeoutMs: positiveInteger(options.connectionTimeoutMs ?? DEFAULT_POSTGRES_WORKER_DEADLINES.connectionTimeoutMs, 'Postgres connection timeout'),
|
|
20
|
+
idleTransactionTimeoutMs: positiveInteger(options.idleTransactionTimeoutMs ?? DEFAULT_POSTGRES_WORKER_DEADLINES.idleTransactionTimeoutMs, 'Postgres idle transaction timeout'),
|
|
21
|
+
};
|
|
22
|
+
if (deadlines.connectionTimeoutMs
|
|
23
|
+
+ deadlines.statementTimeoutMs
|
|
24
|
+
+ MIN_RESPONSE_MARGIN_MS
|
|
25
|
+
> deadlines.responseTimeoutMs) {
|
|
26
|
+
throw new Error('[Taskforce] Postgres connection and statement timeouts must together leave at least '
|
|
27
|
+
+ `${MIN_RESPONSE_MARGIN_MS}ms before the worker response timeout.`);
|
|
28
|
+
}
|
|
29
|
+
return deadlines;
|
|
30
|
+
}
|
|
@@ -67,11 +67,43 @@ export interface WorkspaceAssetLinkEntry {
|
|
|
67
67
|
updatedAt: string;
|
|
68
68
|
deletedAt: string | null;
|
|
69
69
|
}
|
|
70
|
+
export interface WorkspaceAssetUploadDraftEntry {
|
|
71
|
+
workspaceId: string;
|
|
72
|
+
draftId: string;
|
|
73
|
+
assetId: string;
|
|
74
|
+
storageKey: string;
|
|
75
|
+
purpose: string;
|
|
76
|
+
createdByUserId: string;
|
|
77
|
+
createdAt: string;
|
|
78
|
+
retiredAt: string | null;
|
|
79
|
+
}
|
|
70
80
|
export declare class WorkspaceAssetStore {
|
|
71
81
|
private readonly db;
|
|
72
82
|
private readonly tenantId;
|
|
73
83
|
private supportsTargetTypeCache;
|
|
74
84
|
constructor(db: DatabaseAdapter, tenantId: string);
|
|
85
|
+
recordUploadDraft(input: {
|
|
86
|
+
workspaceId: string;
|
|
87
|
+
draftId: string;
|
|
88
|
+
assetId: string;
|
|
89
|
+
storageKey: string;
|
|
90
|
+
purpose: string;
|
|
91
|
+
createdByUserId: string;
|
|
92
|
+
createdAt?: string;
|
|
93
|
+
}): WorkspaceAssetUploadDraftEntry;
|
|
94
|
+
listUploadDrafts(input: {
|
|
95
|
+
workspaceId: string;
|
|
96
|
+
draftId?: string;
|
|
97
|
+
createdByUserId?: string;
|
|
98
|
+
createdBefore?: string;
|
|
99
|
+
includeRetired?: boolean;
|
|
100
|
+
}): WorkspaceAssetUploadDraftEntry[];
|
|
101
|
+
retireUploadDraft(input: {
|
|
102
|
+
workspaceId: string;
|
|
103
|
+
draftId: string;
|
|
104
|
+
assetId: string;
|
|
105
|
+
retiredAt?: string;
|
|
106
|
+
}): boolean;
|
|
75
107
|
private isPlanningTargetDurablyOwned;
|
|
76
108
|
assertAssetDeletionAllowed(assetIdRaw: string, workspaceIdRaw: string): void;
|
|
77
109
|
private runDurableAssetMutation;
|
|
@@ -114,6 +114,76 @@ export class WorkspaceAssetStore {
|
|
|
114
114
|
this.db = db;
|
|
115
115
|
this.tenantId = tenantId;
|
|
116
116
|
}
|
|
117
|
+
recordUploadDraft(input) {
|
|
118
|
+
const workspaceId = normalizeWorkspaceId(input.workspaceId);
|
|
119
|
+
const draftId = normalizeId(input.draftId);
|
|
120
|
+
const assetId = normalizeId(input.assetId);
|
|
121
|
+
const storageKey = normalizeId(input.storageKey);
|
|
122
|
+
const purpose = normalizeId(input.purpose);
|
|
123
|
+
const createdByUserId = normalizeId(input.createdByUserId, 'anonymous');
|
|
124
|
+
const createdAt = normalizeId(input.createdAt, new Date().toISOString());
|
|
125
|
+
if (!draftId || !assetId || !storageKey || !purpose) {
|
|
126
|
+
throw new Error('Draft upload identity, asset, storage key, and purpose are required.');
|
|
127
|
+
}
|
|
128
|
+
this.db.prepare(`
|
|
129
|
+
INSERT INTO workspace_asset_upload_drafts (
|
|
130
|
+
tenant_id, workspace_id, draft_id, asset_id, storage_key,
|
|
131
|
+
purpose, created_by_user_id, created_at, retired_at
|
|
132
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, NULL)
|
|
133
|
+
ON CONFLICT (tenant_id, workspace_id, draft_id, asset_id) DO UPDATE SET
|
|
134
|
+
storage_key = EXCLUDED.storage_key,
|
|
135
|
+
purpose = EXCLUDED.purpose,
|
|
136
|
+
created_by_user_id = EXCLUDED.created_by_user_id
|
|
137
|
+
`).run(this.tenantId, workspaceId, draftId, assetId, storageKey, purpose, createdByUserId, createdAt);
|
|
138
|
+
return {
|
|
139
|
+
workspaceId, draftId, assetId, storageKey, purpose,
|
|
140
|
+
createdByUserId, createdAt, retiredAt: null,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
listUploadDrafts(input) {
|
|
144
|
+
const workspaceId = normalizeWorkspaceId(input.workspaceId);
|
|
145
|
+
const clauses = ['tenant_id = ?', 'workspace_id = ?'];
|
|
146
|
+
const values = [this.tenantId, workspaceId];
|
|
147
|
+
if (input.draftId) {
|
|
148
|
+
clauses.push('draft_id = ?');
|
|
149
|
+
values.push(normalizeId(input.draftId));
|
|
150
|
+
}
|
|
151
|
+
if (input.createdByUserId) {
|
|
152
|
+
clauses.push('created_by_user_id = ?');
|
|
153
|
+
values.push(normalizeId(input.createdByUserId));
|
|
154
|
+
}
|
|
155
|
+
if (input.createdBefore) {
|
|
156
|
+
clauses.push('created_at <= ?');
|
|
157
|
+
values.push(normalizeId(input.createdBefore));
|
|
158
|
+
}
|
|
159
|
+
if (!input.includeRetired)
|
|
160
|
+
clauses.push('retired_at IS NULL');
|
|
161
|
+
const rows = this.db.prepare(`
|
|
162
|
+
SELECT workspace_id, draft_id, asset_id, storage_key, purpose,
|
|
163
|
+
created_by_user_id, created_at, retired_at
|
|
164
|
+
FROM workspace_asset_upload_drafts
|
|
165
|
+
WHERE ${clauses.join(' AND ')}
|
|
166
|
+
ORDER BY created_at ASC, asset_id ASC
|
|
167
|
+
`).all(...values);
|
|
168
|
+
return rows.map((row) => ({
|
|
169
|
+
workspaceId: String(row.workspace_id || ''),
|
|
170
|
+
draftId: String(row.draft_id || ''),
|
|
171
|
+
assetId: String(row.asset_id || ''),
|
|
172
|
+
storageKey: String(row.storage_key || ''),
|
|
173
|
+
purpose: String(row.purpose || ''),
|
|
174
|
+
createdByUserId: String(row.created_by_user_id || ''),
|
|
175
|
+
createdAt: String(row.created_at || ''),
|
|
176
|
+
retiredAt: row.retired_at == null ? null : String(row.retired_at),
|
|
177
|
+
}));
|
|
178
|
+
}
|
|
179
|
+
retireUploadDraft(input) {
|
|
180
|
+
const result = this.db.prepare(`
|
|
181
|
+
UPDATE workspace_asset_upload_drafts
|
|
182
|
+
SET retired_at = COALESCE(retired_at, ?)
|
|
183
|
+
WHERE tenant_id = ? AND workspace_id = ? AND draft_id = ? AND asset_id = ?
|
|
184
|
+
`).run(normalizeId(input.retiredAt, new Date().toISOString()), this.tenantId, normalizeWorkspaceId(input.workspaceId), normalizeId(input.draftId), normalizeId(input.assetId));
|
|
185
|
+
return Number(result.changes || 0) > 0;
|
|
186
|
+
}
|
|
117
187
|
isPlanningTargetDurablyOwned(workspaceId, targetType, targetId) {
|
|
118
188
|
if (targetType !== 'initiative' && targetType !== 'workstream')
|
|
119
189
|
return false;
|
|
@@ -23,10 +23,13 @@ export type WorkspaceContentRequest = Pick<WorkspaceContentManifestEntry, 'kind'
|
|
|
23
23
|
kind: 'asset';
|
|
24
24
|
assetId: string;
|
|
25
25
|
};
|
|
26
|
+
export type WorkspaceContentMissingRequest = WorkspaceContentRequest & {
|
|
27
|
+
disposition?: 'retryable' | 'terminal-unavailable';
|
|
28
|
+
};
|
|
26
29
|
export interface WorkspaceContentPullResponse {
|
|
27
30
|
success?: boolean;
|
|
28
31
|
changes?: WorkspaceSyncChange[];
|
|
29
|
-
missing?:
|
|
32
|
+
missing?: WorkspaceContentMissingRequest[];
|
|
30
33
|
remaining?: WorkspaceContentRequest[];
|
|
31
34
|
contentMetadata?: Array<{
|
|
32
35
|
kind: 'document' | 'asset';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { partitionWorkspaceSyncV2LegacyChanges } from './v3/workspaceSyncV2ProjectionExclusions.js';
|
|
1
|
+
import { normalizeWorkspaceSyncV2ProjectionExclusions, partitionWorkspaceSyncV2LegacyChanges, } from './v3/workspaceSyncV2ProjectionExclusions.js';
|
|
2
2
|
import { validateWorkspaceSyncEngineTransferCompletionGroup, } from './engine/workspaceSyncEngineTransferCompletion.js';
|
|
3
3
|
import { WORKSPACE_SYNC_V3_COMBINED_COVERAGE_SELECTOR, resolveWorkspaceSyncV3CombinedCoverageForExclusions, resolveWorkspaceSyncV3CombinedWireContract } from './v3/workspaceSyncV3CombinedWireContract.js';
|
|
4
4
|
const WORKSPACE_PULL_TIMEOUT_MS = 45_000;
|
|
@@ -696,12 +696,17 @@ export async function bootstrapPushWorkspaceSnapshot(resolveCloudAuthUrl, input)
|
|
|
696
696
|
}));
|
|
697
697
|
}
|
|
698
698
|
export async function applyLocalWorkspaceChanges(workspaceId, changes, options) {
|
|
699
|
+
const excludedProjections = normalizeWorkspaceSyncV2ProjectionExclusions(options?.excludedProjections || []);
|
|
700
|
+
const combinedCoverage = excludedProjections.length
|
|
701
|
+
? resolveWorkspaceSyncV3CombinedCoverageForExclusions(excludedProjections)
|
|
702
|
+
: null;
|
|
699
703
|
const applyPayload = JSON.stringify({
|
|
700
704
|
workspaceId,
|
|
701
705
|
changes,
|
|
702
706
|
workspaceMembers: Array.isArray(options?.workspaceMembers) ? options.workspaceMembers : undefined,
|
|
703
707
|
...(options?.repairMode === true ? { repair: true } : {}),
|
|
704
|
-
excludedProjections
|
|
708
|
+
excludedProjections,
|
|
709
|
+
...(combinedCoverage ? { combinedCoverage } : {}),
|
|
705
710
|
contentPullObligations: options?.contentPullObligations,
|
|
706
711
|
contentPullResolutionClaims: options?.contentPullResolutionClaims,
|
|
707
712
|
...localBrowserApplyPermitContext(workspaceId, options),
|
|
@@ -130,7 +130,7 @@ export declare function createContentSyncState(deps: ContentSyncStateDeps): {
|
|
|
130
130
|
activeLinks: WorkspaceAssetLinkEntry[];
|
|
131
131
|
effectiveUpdatedAt: string;
|
|
132
132
|
};
|
|
133
|
-
getCanonicalSyncDocumentMetadata: (relativePath: string, workspaceId: string) => Omit<DocumentSyncPayload, "
|
|
133
|
+
getCanonicalSyncDocumentMetadata: (relativePath: string, workspaceId: string) => Omit<DocumentSyncPayload, "updatedAt" | "path" | "content">;
|
|
134
134
|
hasDocumentSyncMetadataDrift: (workspaceId: string, doc: DocumentSyncPayload, _options?: {
|
|
135
135
|
allowReferenceNumberReassignment?: boolean;
|
|
136
136
|
}) => boolean;
|
|
@@ -4,6 +4,8 @@ import type { WorkspaceSyncEngineV2PushBoundary } from '../engine/workspaceSyncE
|
|
|
4
4
|
import { type LocalSyncExecutionPermitCleanAbandonResult, type LocalSyncExecutionPermitDrainSnapshot, type LocalSyncExecutionPermit, type LocalSyncExecutionPermitOwnerMode, type LocalSyncExecutionPermitState, type LocalSyncGatewayOperationClass, type LocalSyncRecoveryObligation, type LocalSyncUpstreamDisposition } from './localSyncExecutionPermitTypes.js';
|
|
5
5
|
export declare const LOCAL_SYNC_PERMIT_RETENTION_MIN_AGE_MS: number;
|
|
6
6
|
export declare const LOCAL_SYNC_PERMIT_RETENTION_SOFT_LIMIT = 1000;
|
|
7
|
+
export declare const LOCAL_SYNC_PERMIT_RETENTION_HARD_LIMIT = 10000;
|
|
8
|
+
export declare const LOCAL_SYNC_OBLIGATION_RETENTION_HARD_LIMIT = 2000;
|
|
7
9
|
export declare const LOCAL_SYNC_PERMIT_RETENTION_DELETE_BATCH = 250;
|
|
8
10
|
export declare const LOCAL_SYNC_PERMIT_RETENTION_SWEEP_LIMIT = 5000;
|
|
9
11
|
type LocalSyncPermitCompletionGroupFence = {
|
|
@@ -60,6 +62,12 @@ export declare class LocalSyncExecutionPermitStore {
|
|
|
60
62
|
byState: Partial<Record<LocalSyncExecutionPermitState, number>>;
|
|
61
63
|
recoveryObligations: number;
|
|
62
64
|
localCommitInvariantViolation: boolean;
|
|
65
|
+
history: {
|
|
66
|
+
terminalPermits: number;
|
|
67
|
+
oldestTerminalPermitAt: string | null;
|
|
68
|
+
resolvedRecoveryObligations: number;
|
|
69
|
+
oldestResolvedRecoveryObligationAt: string | null;
|
|
70
|
+
};
|
|
63
71
|
};
|
|
64
72
|
inspectGenerationDrain(input: {
|
|
65
73
|
workspaceId: string;
|
|
@@ -110,6 +118,14 @@ export declare class LocalSyncExecutionPermitStore {
|
|
|
110
118
|
ownerMode: LocalSyncExecutionPermitOwnerMode;
|
|
111
119
|
serverInstanceId: string;
|
|
112
120
|
}): LocalSyncExecutionPermit;
|
|
121
|
+
renewAcceptedApplyCompletion(input: {
|
|
122
|
+
permitId: string;
|
|
123
|
+
workspaceId: string;
|
|
124
|
+
coordinatorGeneration: number;
|
|
125
|
+
serverInstanceId: string;
|
|
126
|
+
ownerMode: LocalSyncExecutionPermitOwnerMode;
|
|
127
|
+
deadlineAt: string;
|
|
128
|
+
}): LocalSyncExecutionPermit;
|
|
113
129
|
completeAcceptedV3Dispatch<T>(input: {
|
|
114
130
|
permitId: string;
|
|
115
131
|
workspaceId: string;
|
|
@@ -136,6 +152,7 @@ export declare class LocalSyncExecutionPermitStore {
|
|
|
136
152
|
coordinatorGeneration: number;
|
|
137
153
|
serverInstanceId: string;
|
|
138
154
|
errorCode?: string;
|
|
155
|
+
readResponseUnavailableBeforeApply?: boolean;
|
|
139
156
|
}): LocalSyncExecutionPermit;
|
|
140
157
|
recoverExpiredPermits(input: {
|
|
141
158
|
currentServerInstanceId: string;
|