@taskforcehq/taskforce 0.3.311 → 0.3.313
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +40 -2
- package/dist/TaskforceCore.js +1 -1
- package/dist/components/features/InitiativesModule.js +1 -1
- package/dist/components/features/TaskSettings.js +1 -1
- package/dist/components/views/StandaloneLayout.js +3 -6
- package/dist/components/views/standalone/modals/AccountHubModal.d.ts +1 -2
- package/dist/components/views/standalone/modals/AccountHubModal.js +2 -3
- package/dist/components/views/standalone/modals/HelpModal.js +15 -2
- package/dist/hooks/useFilterSort.js +1 -1
- package/dist/hooks/useTaskforce.js +2 -2
- package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.js +5 -2
- package/dist/ui/assets/{AgentsModule-D8u9P5dZ.js → AgentsModule-BULqIo8e.js} +1 -1
- package/dist/ui/assets/{AnnotatedAttachmentWorkspace-CsUauFA2.js → AnnotatedAttachmentWorkspace-DHr4rHK9.js} +1 -1
- package/dist/ui/assets/{ContextAttachmentManager-DbQvDHFz.js → ContextAttachmentManager-DoMe2OpY.js} +1 -1
- package/dist/ui/assets/{DocumentWorkspace-BmTkN1A8.js → DocumentWorkspace-DumBWhvb.js} +1 -1
- package/dist/ui/assets/{EntityActivityTimeline-BXHTM-Nh.js → EntityActivityTimeline-sHk8Nzbq.js} +1 -1
- package/dist/ui/assets/{InitiativesModule-D33RyXx0.js → InitiativesModule-3X9UNzHh.js} +1 -1
- package/dist/ui/assets/{PlansPage-D0RXlT9_.js → PlansPage-C3A3EYaV.js} +1 -1
- package/dist/ui/assets/{TaskContextUpload-Vsg67lpR.js → TaskContextUpload-C8G7pWkX.js} +1 -1
- package/dist/ui/assets/{TaskSettings-DshLw7_d.js → TaskSettings-DM1o9Wla.js} +2 -2
- package/dist/ui/assets/{WorkflowsModule-CLM-1BnF.js → WorkflowsModule-CW0crzvD.js} +1 -1
- package/dist/ui/assets/documentReferences-BZB3nMRb.js +1 -0
- package/dist/ui/assets/index-BWFQ9mGn.js +5 -0
- package/dist/ui/assets/{index-DOR9PRqt.css → index-DcK_8tuE.css} +1 -1
- package/dist/ui/index.html +2 -2
- package/package.json +12 -4
- package/scripts/postinstall.js +4 -3
- package/dist/TaskforceCore.CategoryFallback.test.d.ts +0 -1
- package/dist/TaskforceCore.CategoryFallback.test.js +0 -101
- package/dist/TaskforceCore.filter-persistence.test.d.ts +0 -1
- package/dist/TaskforceCore.filter-persistence.test.js +0 -402
- package/dist/TaskforceCore.routing.test.d.ts +0 -1
- package/dist/TaskforceCore.routing.test.js +0 -311
- package/dist/TaskforceCore.test.d.ts +0 -1
- package/dist/TaskforceCore.test.js +0 -7910
- package/dist/TaskforceWidget.test.d.ts +0 -1
- package/dist/TaskforceWidget.test.js +0 -92
- package/dist/UnsavedChangesRelaxed.test.d.ts +0 -1
- package/dist/UnsavedChangesRelaxed.test.js +0 -16
- package/dist/__tests__/localizationCatalogs.test.d.ts +0 -1
- package/dist/__tests__/localizationCatalogs.test.js +0 -54
- package/dist/__tests__/workflowSimulation.test.d.ts +0 -1
- package/dist/__tests__/workflowSimulation.test.js +0 -113
- package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.test.d.ts +0 -1
- package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.test.js +0 -278
- package/dist/annotatedAttachments/payload.test.d.ts +0 -1
- package/dist/annotatedAttachments/payload.test.js +0 -67
- package/dist/compat/workspaceSyncCompat.test.d.ts +0 -1
- package/dist/compat/workspaceSyncCompat.test.js +0 -124
- package/dist/components/features/AgentsModule.test.d.ts +0 -1
- package/dist/components/features/AgentsModule.test.js +0 -601
- package/dist/components/features/AnnotatedAttachmentWorkspace.test.d.ts +0 -1
- package/dist/components/features/AnnotatedAttachmentWorkspace.test.js +0 -2883
- package/dist/components/features/DocumentWorkspace.test.d.ts +0 -1
- package/dist/components/features/DocumentWorkspace.test.js +0 -1439
- package/dist/components/features/TaskSettings.test.d.ts +0 -1
- package/dist/components/features/TaskSettings.test.js +0 -1674
- package/dist/components/features/settings/TaxonomyLibraryManager.test.d.ts +0 -1
- package/dist/components/features/settings/TaxonomyLibraryManager.test.js +0 -141
- package/dist/components/task/TaskActionHeader.test.d.ts +0 -1
- package/dist/components/task/TaskActionHeader.test.js +0 -91
- package/dist/components/task/TaskCard.test.d.ts +0 -1
- package/dist/components/task/TaskCard.test.js +0 -513
- package/dist/components/task/TaskContextUpload.test.d.ts +0 -1
- package/dist/components/task/TaskContextUpload.test.js +0 -506
- package/dist/components/task/TaskForm.test.d.ts +0 -1
- package/dist/components/task/TaskForm.test.js +0 -946
- package/dist/components/task/TaskKanban.empty-column-drop.test.d.ts +0 -1
- package/dist/components/task/TaskKanban.empty-column-drop.test.js +0 -66
- package/dist/components/task/TaskKanban.planning-drop.test.d.ts +0 -1
- package/dist/components/task/TaskKanban.planning-drop.test.js +0 -93
- package/dist/components/task/TaskKanban.test.d.ts +0 -1
- package/dist/components/task/TaskKanban.test.js +0 -99
- package/dist/components/task/TaskList.test.d.ts +0 -1
- package/dist/components/task/TaskList.test.js +0 -473
- package/dist/components/task/TaskStatusActions.test.d.ts +0 -1
- package/dist/components/task/TaskStatusActions.test.js +0 -54
- package/dist/components/task/taskKanbanDropRules.test.d.ts +0 -1
- package/dist/components/task/taskKanbanDropRules.test.js +0 -114
- package/dist/components/ui/LevelSelector.test.d.ts +0 -1
- package/dist/components/ui/LevelSelector.test.js +0 -55
- package/dist/components/ui/Markdown.test.d.ts +0 -1
- package/dist/components/ui/Markdown.test.js +0 -38
- package/dist/components/ui/MultiSelectFilter.test.d.ts +0 -1
- package/dist/components/ui/MultiSelectFilter.test.js +0 -74
- package/dist/components/ui/TaxonomyDropdown.test.d.ts +0 -1
- package/dist/components/ui/TaxonomyDropdown.test.js +0 -130
- package/dist/components/ui/TopNoticeLayer.test.d.ts +0 -1
- package/dist/components/ui/TopNoticeLayer.test.js +0 -25
- package/dist/components/views/AppShellHeader.test.d.ts +0 -1
- package/dist/components/views/AppShellHeader.test.js +0 -42
- package/dist/components/views/PlanComparisonPage.test.d.ts +0 -1
- package/dist/components/views/PlanComparisonPage.test.js +0 -758
- package/dist/components/views/PlansPage.test.d.ts +0 -1
- package/dist/components/views/PlansPage.test.js +0 -710
- package/dist/components/views/chrome/WorkspaceChromeSections.test.d.ts +0 -1
- package/dist/components/views/chrome/WorkspaceChromeSections.test.js +0 -54
- package/dist/components/views/chrome/workspaceChrome.test.d.ts +0 -1
- package/dist/components/views/chrome/workspaceChrome.test.js +0 -52
- package/dist/components/views/panels/DocumentFilterToolbar.test.d.ts +0 -1
- package/dist/components/views/panels/DocumentFilterToolbar.test.js +0 -19
- package/dist/components/views/panels/FilterToolbar.test.d.ts +0 -1
- package/dist/components/views/panels/FilterToolbar.test.js +0 -47
- package/dist/components/views/panels/PlanningDrawer.test.d.ts +0 -1
- package/dist/components/views/panels/PlanningDrawer.test.js +0 -529
- package/dist/components/views/planningScope.test.d.ts +0 -1
- package/dist/components/views/planningScope.test.js +0 -60
- package/dist/components/views/standalone/modals/AccountHubModal.test.d.ts +0 -1
- package/dist/components/views/standalone/modals/AccountHubModal.test.js +0 -72
- package/dist/components/views/standalone/modals/HelpModal.test.d.ts +0 -1
- package/dist/components/views/standalone/modals/HelpModal.test.js +0 -23
- package/dist/components/views/standalone/modals/SyncEnableWarningModal.test.d.ts +0 -1
- package/dist/components/views/standalone/modals/SyncEnableWarningModal.test.js +0 -24
- package/dist/components/views/teamManagementAccess.test.d.ts +0 -1
- package/dist/components/views/teamManagementAccess.test.js +0 -44
- package/dist/config/deployment.test.d.ts +0 -1
- package/dist/config/deployment.test.js +0 -90
- package/dist/config/envSchema.test.d.ts +0 -1
- package/dist/config/envSchema.test.js +0 -125
- package/dist/core/AiProfileService.test.d.ts +0 -1
- package/dist/core/AiProfileService.test.js +0 -184
- package/dist/core/AiProfiles.test.d.ts +0 -1
- package/dist/core/AiProfiles.test.js +0 -1873
- package/dist/core/AuthTokenService.test.d.ts +0 -1
- package/dist/core/AuthTokenService.test.js +0 -78
- package/dist/core/BulkUpdateFieldsPreview.test.d.ts +0 -1
- package/dist/core/BulkUpdateFieldsPreview.test.js +0 -62
- package/dist/core/CompletedAt.test.d.ts +0 -1
- package/dist/core/CompletedAt.test.js +0 -44
- package/dist/core/CreatedBy.test.d.ts +0 -1
- package/dist/core/CreatedBy.test.js +0 -188
- package/dist/core/DeletedTaskTrash.test.d.ts +0 -1
- package/dist/core/DeletedTaskTrash.test.js +0 -104
- package/dist/core/EntitlementsPolicy.test.d.ts +0 -1
- package/dist/core/EntitlementsPolicy.test.js +0 -280
- package/dist/core/GlobalSettingsService.test.d.ts +0 -1
- package/dist/core/GlobalSettingsService.test.js +0 -45
- package/dist/core/JsonBackupRuntime.test.d.ts +0 -1
- package/dist/core/JsonBackupRuntime.test.js +0 -155
- package/dist/core/PlanFeatureCatalog.test.d.ts +0 -1
- package/dist/core/PlanFeatureCatalog.test.js +0 -139
- package/dist/core/PlanVersionPolicy.test.d.ts +0 -1
- package/dist/core/PlanVersionPolicy.test.js +0 -236
- package/dist/core/PlanningEntities.test.d.ts +0 -1
- package/dist/core/PlanningEntities.test.js +0 -509
- package/dist/core/ScheduleFields.test.d.ts +0 -1
- package/dist/core/ScheduleFields.test.js +0 -193
- package/dist/core/SetupState.test.d.ts +0 -1
- package/dist/core/SetupState.test.js +0 -113
- package/dist/core/SignupMonetizationSettings.test.d.ts +0 -1
- package/dist/core/SignupMonetizationSettings.test.js +0 -515
- package/dist/core/Stats.test.d.ts +0 -1
- package/dist/core/Stats.test.js +0 -36
- package/dist/core/SystemAdmin.test.d.ts +0 -1
- package/dist/core/SystemAdmin.test.js +0 -1106
- package/dist/core/TaskActivitySync.test.d.ts +0 -1
- package/dist/core/TaskActivitySync.test.js +0 -90
- package/dist/core/TaskAttachmentsCanonical.test.d.ts +0 -1
- package/dist/core/TaskAttachmentsCanonical.test.js +0 -356
- package/dist/core/TaskAuditTimeline.test.d.ts +0 -1
- package/dist/core/TaskAuditTimeline.test.js +0 -319
- package/dist/core/TaskTaxonomyValidation.test.d.ts +0 -1
- package/dist/core/TaskTaxonomyValidation.test.js +0 -440
- package/dist/core/Taskforce.ids.test.d.ts +0 -1
- package/dist/core/Taskforce.ids.test.js +0 -611
- package/dist/core/Taskforce.listTasksSlim.test.d.ts +0 -1
- package/dist/core/Taskforce.listTasksSlim.test.js +0 -91
- package/dist/core/Taskforce.mcpAuth.test.d.ts +0 -1
- package/dist/core/Taskforce.mcpAuth.test.js +0 -450
- package/dist/core/Taskforce.realtimeMutation.test.d.ts +0 -1
- package/dist/core/Taskforce.realtimeMutation.test.js +0 -131
- package/dist/core/UserProfileAvatarDrafts.test.d.ts +0 -1
- package/dist/core/UserProfileAvatarDrafts.test.js +0 -138
- package/dist/core/WorkspaceDelete.test.d.ts +0 -1
- package/dist/core/WorkspaceDelete.test.js +0 -159
- package/dist/core/WorkspacePermissions.test.d.ts +0 -1
- package/dist/core/WorkspacePermissions.test.js +0 -270
- package/dist/core/WorkspacePlanMode.test.d.ts +0 -1
- package/dist/core/WorkspacePlanMode.test.js +0 -383
- package/dist/core/WorkspaceSyncSettings.test.d.ts +0 -1
- package/dist/core/WorkspaceSyncSettings.test.js +0 -65
- package/dist/core/__tests__/TaskAttachmentsCanonical.test.d.ts +0 -1
- package/dist/core/__tests__/TaskAttachmentsCanonical.test.js +0 -212
- package/dist/documentReviews/DocumentReviewSessionStore.test.d.ts +0 -1
- package/dist/documentReviews/DocumentReviewSessionStore.test.js +0 -127
- package/dist/hooks/authGuardPolicy.test.d.ts +0 -1
- package/dist/hooks/authGuardPolicy.test.js +0 -76
- package/dist/hooks/bootstrapTimeouts.test.d.ts +0 -1
- package/dist/hooks/bootstrapTimeouts.test.js +0 -12
- package/dist/hooks/sync/controlPlane.test.d.ts +0 -1
- package/dist/hooks/sync/controlPlane.test.js +0 -121
- package/dist/hooks/sync/lifecyclePolicy.test.d.ts +0 -1
- package/dist/hooks/sync/lifecyclePolicy.test.js +0 -124
- package/dist/hooks/sync/orchestratorShared.test.d.ts +0 -1
- package/dist/hooks/sync/orchestratorShared.test.js +0 -98
- package/dist/hooks/sync/pullLifecycle.test.d.ts +0 -1
- package/dist/hooks/sync/pullLifecycle.test.js +0 -80
- package/dist/hooks/sync/recovery.test.d.ts +0 -1
- package/dist/hooks/sync/recovery.test.js +0 -292
- package/dist/hooks/sync/transfers.test.d.ts +0 -1
- package/dist/hooks/sync/transfers.test.js +0 -928
- package/dist/hooks/sync/useRecentSyncEvents.test.d.ts +0 -1
- package/dist/hooks/sync/useRecentSyncEvents.test.js +0 -124
- package/dist/hooks/sync/useSyncStatusActions.test.d.ts +0 -1
- package/dist/hooks/sync/useSyncStatusActions.test.js +0 -133
- package/dist/hooks/sync/useSyncStatusControls.test.d.ts +0 -1
- package/dist/hooks/sync/useSyncStatusControls.test.js +0 -88
- package/dist/hooks/useFilterSort.test.d.ts +0 -1
- package/dist/hooks/useFilterSort.test.js +0 -419
- package/dist/hooks/useRealtimeSync.test.d.ts +0 -1
- package/dist/hooks/useRealtimeSync.test.js +0 -311
- package/dist/hooks/useSyncOrchestrator.aiProfiles.test.d.ts +0 -1
- package/dist/hooks/useSyncOrchestrator.aiProfiles.test.js +0 -54
- package/dist/hooks/useSyncOrchestrator.context-assets.test.d.ts +0 -1
- package/dist/hooks/useSyncOrchestrator.context-assets.test.js +0 -228
- package/dist/hooks/useSyncOrchestrator.retry-closure.test.d.ts +0 -1
- package/dist/hooks/useSyncOrchestrator.retry-closure.test.js +0 -2027
- package/dist/hooks/useTaskData.test.d.ts +0 -1
- package/dist/hooks/useTaskData.test.js +0 -291
- package/dist/hooks/useTaskMutations.test.d.ts +0 -1
- package/dist/hooks/useTaskMutations.test.js +0 -256
- package/dist/hooks/useTaskforce.contract.test.d.ts +0 -1
- package/dist/hooks/useTaskforce.contract.test.js +0 -7
- package/dist/hooks/useTaskforce.priority-filters.test.d.ts +0 -1
- package/dist/hooks/useTaskforce.priority-filters.test.js +0 -28
- package/dist/hooks/useTaskforce.runtime-routing.test.d.ts +0 -1
- package/dist/hooks/useTaskforce.runtime-routing.test.js +0 -246
- package/dist/hooks/useTaskforce.sync-behavior.test.d.ts +0 -1
- package/dist/hooks/useTaskforce.sync-behavior.test.js +0 -3644
- package/dist/hooks/useWorkspaceSyncController.test.d.ts +0 -1
- package/dist/hooks/useWorkspaceSyncController.test.js +0 -192
- package/dist/hooks/workspace/useTaskforceApiRouting.test.d.ts +0 -1
- package/dist/hooks/workspace/useTaskforceApiRouting.test.js +0 -77
- package/dist/hooks/workspace/workspaceLocalState.test.d.ts +0 -1
- package/dist/hooks/workspace/workspaceLocalState.test.js +0 -59
- package/dist/localization/localizationCatalogs.test.d.ts +0 -1
- package/dist/localization/localizationCatalogs.test.js +0 -37
- package/dist/mcp/aiProfileBootstrap.test.d.ts +0 -1
- package/dist/mcp/aiProfileBootstrap.test.js +0 -68
- package/dist/mcp/canonicalAssetHelpers.test.d.ts +0 -1
- package/dist/mcp/canonicalAssetHelpers.test.js +0 -67
- package/dist/mcp/clientIntegrations.test.d.ts +0 -1
- package/dist/mcp/clientIntegrations.test.js +0 -219
- package/dist/mcp/optionResolution.test.d.ts +0 -1
- package/dist/mcp/optionResolution.test.js +0 -43
- package/dist/mcp/runtime.test.d.ts +0 -1
- package/dist/mcp/runtime.test.js +0 -5211
- package/dist/mcp/structuredCommentValidation.test.d.ts +0 -1
- package/dist/mcp/structuredCommentValidation.test.js +0 -31
- package/dist/mcp/structuredDocValidation.test.d.ts +0 -1
- package/dist/mcp/structuredDocValidation.test.js +0 -35
- package/dist/mcp/toolRegistry.test.d.ts +0 -1
- package/dist/mcp/toolRegistry.test.js +0 -34
- package/dist/migrations/billingSchemaParity.test.d.ts +0 -1
- package/dist/migrations/billingSchemaParity.test.js +0 -160
- package/dist/migrations/taskSchemaMigrations.test.d.ts +0 -1
- package/dist/migrations/taskSchemaMigrations.test.js +0 -225
- package/dist/qaOpen.test.d.ts +0 -1
- package/dist/qaOpen.test.js +0 -56
- package/dist/releaseVersion.test.d.ts +0 -1
- package/dist/releaseVersion.test.js +0 -32
- package/dist/runtime/appGates.test.d.ts +0 -1
- package/dist/runtime/appGates.test.js +0 -42
- package/dist/server/aiProfileAvatarAssets.test.d.ts +0 -1
- package/dist/server/aiProfileAvatarAssets.test.js +0 -213
- package/dist/server/annotatedAttachmentsRoutes.test.d.ts +0 -1
- package/dist/server/annotatedAttachmentsRoutes.test.js +0 -532
- package/dist/server/auth.test.d.ts +0 -1
- package/dist/server/auth.test.js +0 -131
- package/dist/server/buildInfo.test.d.ts +0 -1
- package/dist/server/buildInfo.test.js +0 -29
- package/dist/server/cors.test.d.ts +0 -1
- package/dist/server/cors.test.js +0 -77
- package/dist/server/documentReviewRoutes.test.d.ts +0 -1
- package/dist/server/documentReviewRoutes.test.js +0 -190
- package/dist/server/email.test.d.ts +0 -1
- package/dist/server/email.test.js +0 -113
- package/dist/server/index.cookieProxy.test.d.ts +0 -1
- package/dist/server/index.cookieProxy.test.js +0 -67
- package/dist/server/index.rateLimit.test.d.ts +0 -1
- package/dist/server/index.rateLimit.test.js +0 -22
- package/dist/server/index.test.d.ts +0 -1
- package/dist/server/index.test.js +0 -283
- package/dist/server/rateLimit.test.d.ts +0 -1
- package/dist/server/rateLimit.test.js +0 -107
- package/dist/server/realtimeSync.auth.test.d.ts +0 -1
- package/dist/server/realtimeSync.auth.test.js +0 -62
- package/dist/server/realtimeSync.replay.test.d.ts +0 -1
- package/dist/server/realtimeSync.replay.test.js +0 -192
- package/dist/server/realtimeSync.workspaceIsolation.test.d.ts +0 -1
- package/dist/server/realtimeSync.workspaceIsolation.test.js +0 -101
- package/dist/server/routes/billing.test.d.ts +0 -1
- package/dist/server/routes/billing.test.js +0 -3515
- package/dist/server/routes/shared.test.d.ts +0 -1
- package/dist/server/routes/shared.test.js +0 -32
- package/dist/server/routes/sync.integration.test.d.ts +0 -1
- package/dist/server/routes/sync.integration.test.js +0 -2932
- package/dist/server/routes/syncAuxRoutes.test.d.ts +0 -1
- package/dist/server/routes/syncAuxRoutes.test.js +0 -158
- package/dist/server/routes/syncRouteGuards.test.d.ts +0 -1
- package/dist/server/routes/syncRouteGuards.test.js +0 -94
- package/dist/server/routes.test.d.ts +0 -1
- package/dist/server/routes.test.js +0 -15612
- package/dist/server/runtimeMode.test.d.ts +0 -1
- package/dist/server/runtimeMode.test.js +0 -26
- package/dist/server/securityHeaders.test.d.ts +0 -1
- package/dist/server/securityHeaders.test.js +0 -70
- package/dist/services/templateEngine.test.d.ts +0 -1
- package/dist/services/templateEngine.test.js +0 -150
- package/dist/services/templates.test.d.ts +0 -1
- package/dist/services/templates.test.js +0 -45
- package/dist/services/workflowDocumentFixtures.test.d.ts +0 -1
- package/dist/services/workflowDocumentFixtures.test.js +0 -78
- package/dist/services/workflowExportMatrix.test.d.ts +0 -1
- package/dist/services/workflowExportMatrix.test.js +0 -113
- package/dist/services/workflowExportSnapshots.test.d.ts +0 -1
- package/dist/services/workflowExportSnapshots.test.js +0 -30
- package/dist/services/workflowGeneration.test.d.ts +0 -1
- package/dist/services/workflowGeneration.test.js +0 -12
- package/dist/services/workflowSimulation.test.d.ts +0 -1
- package/dist/services/workflowSimulation.test.js +0 -113
- package/dist/services/workflowV2Policy.test.d.ts +0 -1
- package/dist/services/workflowV2Policy.test.js +0 -80
- package/dist/shared/customTaxonomyLibrary.test.d.ts +0 -1
- package/dist/shared/customTaxonomyLibrary.test.js +0 -20
- package/dist/shared/passwordPolicy.test.d.ts +0 -1
- package/dist/shared/passwordPolicy.test.js +0 -34
- package/dist/shared/runtimeContract.test.d.ts +0 -1
- package/dist/shared/runtimeContract.test.js +0 -23
- package/dist/shared/taxonomyLibrary.test.d.ts +0 -1
- package/dist/shared/taxonomyLibrary.test.js +0 -26
- package/dist/shared/taxonomyState.test.d.ts +0 -1
- package/dist/shared/taxonomyState.test.js +0 -71
- package/dist/soak/preflight.cli.d.ts +0 -1
- package/dist/soak/preflight.cli.js +0 -28
- package/dist/soak/preflight.d.ts +0 -26
- package/dist/soak/preflight.js +0 -113
- package/dist/soak/preflight.test.d.ts +0 -1
- package/dist/soak/preflight.test.js +0 -39
- package/dist/storage/objectStorageClient.test.d.ts +0 -1
- package/dist/storage/objectStorageClient.test.js +0 -82
- package/dist/storage/objectStorageConfig.test.d.ts +0 -1
- package/dist/storage/objectStorageConfig.test.js +0 -50
- package/dist/storage/postgresAdapter.test.d.ts +0 -1
- package/dist/storage/postgresAdapter.test.js +0 -29
- package/dist/storage/workspaceAssetStore.test.d.ts +0 -1
- package/dist/storage/workspaceAssetStore.test.js +0 -588
- package/dist/sync/cloudSyncApi.test.d.ts +0 -1
- package/dist/sync/cloudSyncApi.test.js +0 -111
- package/dist/sync/collaborationSyncPayload.test.d.ts +0 -1
- package/dist/sync/collaborationSyncPayload.test.js +0 -125
- package/dist/sync/contentSyncPayload.test.d.ts +0 -1
- package/dist/sync/contentSyncPayload.test.js +0 -143
- package/dist/sync/encryptionService.test.d.ts +0 -1
- package/dist/sync/encryptionService.test.js +0 -52
- package/dist/sync/planningSyncPayload.test.d.ts +0 -1
- package/dist/sync/planningSyncPayload.test.js +0 -92
- package/dist/sync/realtimeFeature.test.d.ts +0 -1
- package/dist/sync/realtimeFeature.test.js +0 -30
- package/dist/sync/realtimeReconcile.test.d.ts +0 -1
- package/dist/sync/realtimeReconcile.test.js +0 -43
- package/dist/sync/syncApplyHandlers.test.d.ts +0 -1
- package/dist/sync/syncApplyHandlers.test.js +0 -626
- package/dist/sync/syncService.test.d.ts +0 -1
- package/dist/sync/syncService.test.js +0 -903
- package/dist/sync/taskSyncPayload.test.d.ts +0 -1
- package/dist/sync/taskSyncPayload.test.js +0 -54
- package/dist/sync/workspacePullFeed.test.d.ts +0 -1
- package/dist/sync/workspacePullFeed.test.js +0 -438
- package/dist/sync/workspaceSyncModel.test.d.ts +0 -1
- package/dist/sync/workspaceSyncModel.test.js +0 -1442
- package/dist/test/setup.d.ts +0 -1
- package/dist/test/setup.js +0 -15
- package/dist/ui/assets/documentReferences-BPWp6ce0.js +0 -1
- package/dist/ui/assets/index-zvbo2Jse.js +0 -5
- package/dist/utils/accountProfileSummaryCache.test.d.ts +0 -1
- package/dist/utils/accountProfileSummaryCache.test.js +0 -63
- package/dist/utils/annotatedAttachments.test.d.ts +0 -1
- package/dist/utils/annotatedAttachments.test.js +0 -108
- package/dist/utils/assignees.test.d.ts +0 -1
- package/dist/utils/assignees.test.js +0 -25
- package/dist/utils/avatarUpload.test.d.ts +0 -1
- package/dist/utils/avatarUpload.test.js +0 -40
- package/dist/utils/canonicalAssetKind.test.d.ts +0 -1
- package/dist/utils/canonicalAssetKind.test.js +0 -24
- package/dist/utils/coalescedRefresh.test.d.ts +0 -1
- package/dist/utils/coalescedRefresh.test.js +0 -30
- package/dist/utils/constants.icons.test.d.ts +0 -1
- package/dist/utils/constants.icons.test.js +0 -41
- package/dist/utils/planParser.test.d.ts +0 -1
- package/dist/utils/planParser.test.js +0 -183
- package/dist/utils/planningReferences.test.d.ts +0 -1
- package/dist/utils/planningReferences.test.js +0 -17
- package/dist/utils/supportContact.test.d.ts +0 -1
- package/dist/utils/supportContact.test.js +0 -19
- package/dist/utils/syncEventDetails.test.d.ts +0 -1
- package/dist/utils/syncEventDetails.test.js +0 -23
- package/dist/utils/syncEventPresentation.test.d.ts +0 -1
- package/dist/utils/syncEventPresentation.test.js +0 -64
- package/dist/utils/syncStatusPresentation.test.d.ts +0 -1
- package/dist/utils/syncStatusPresentation.test.js +0 -164
- package/dist/utils/taskActivity.test.d.ts +0 -1
- package/dist/utils/taskActivity.test.js +0 -218
- package/dist/utils/taskDraftDefaults.test.d.ts +0 -1
- package/dist/utils/taskDraftDefaults.test.js +0 -34
- package/dist/utils/taskDragZones.test.d.ts +0 -1
- package/dist/utils/taskDragZones.test.js +0 -14
- package/dist/utils/taskNormalization.test.d.ts +0 -1
- package/dist/utils/taskNormalization.test.js +0 -158
- package/dist/utils/taskSearch.test.d.ts +0 -1
- package/dist/utils/taskSearch.test.js +0 -69
- package/dist/utils/taskUtils.test.d.ts +0 -1
- package/dist/utils/taskUtils.test.js +0 -19
- package/dist/utils/taskforceApiClient.test.d.ts +0 -1
- package/dist/utils/taskforceApiClient.test.js +0 -44
- package/dist/utils/taxonomyFormDefaults.test.d.ts +0 -1
- package/dist/utils/taxonomyFormDefaults.test.js +0 -63
- package/dist/utils/uiNotice.test.d.ts +0 -1
- package/dist/utils/uiNotice.test.js +0 -18
- package/dist/utils/workspaceIdentity.test.d.ts +0 -1
- package/dist/utils/workspaceIdentity.test.js +0 -61
- package/dist/utils/workspaceLifecycle.test.d.ts +0 -1
- package/dist/utils/workspaceLifecycle.test.js +0 -64
- package/dist/utils/workspaceSyncPresentation.test.d.ts +0 -1
- package/dist/utils/workspaceSyncPresentation.test.js +0 -71
- package/scripts/bootstrap-playwright-auth.mjs +0 -155
- package/scripts/check-cloud-mcp.mjs +0 -83
- package/scripts/check-compat-boundaries.mjs +0 -41
- package/scripts/check-env.ts +0 -31
- package/scripts/check-localization-strings.mjs +0 -49
- package/scripts/check-runtime-boundaries.mjs +0 -44
- package/scripts/debug-global.mjs +0 -34
- package/scripts/debug-login.mjs +0 -32
- package/scripts/debug-server.mjs +0 -36
- package/scripts/deploy-prod.sh +0 -41
- package/scripts/deploy-staging.sh +0 -23
- package/scripts/export-sqlite-to-postgres.mjs +0 -123
- package/scripts/generate-env-example.ts +0 -8
- package/scripts/mcp-stdio-adapter.mjs +0 -160
- package/scripts/migrate-task-data-assets.mjs +0 -408
- package/scripts/playwright-auth.sh +0 -19
- package/scripts/qa-open-lib.mjs +0 -175
- package/scripts/qa-open-lib.mjs.d.ts +0 -49
- package/scripts/qa-open.mjs +0 -352
- package/scripts/release-version-lib.mjs +0 -88
- package/scripts/release-version.mjs +0 -72
- package/scripts/run-billing-performance-smoke.sh +0 -24
- package/scripts/run-dev-proxy.sh +0 -51
- package/scripts/run-e2e-realtime.sh +0 -30
- package/scripts/run-smoke.sh +0 -35
- package/scripts/run-soak.sh +0 -41
- package/scripts/test-global.js +0 -143
- package/scripts/update-homebrew-formula.sh +0 -108
- package/scripts/with-esbuild.sh +0 -11
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { normalizeTaskReferenceToken, normalizeTaskSearchQuery, taskMatchesSearch, } from './taskSearch';
|
|
3
|
-
function makeTask(overrides = {}) {
|
|
4
|
-
return {
|
|
5
|
-
id: overrides.id || 'task-1',
|
|
6
|
-
title: overrides.title || 'Task',
|
|
7
|
-
description: overrides.description ?? null,
|
|
8
|
-
status: overrides.status || 'task',
|
|
9
|
-
priority: overrides.priority ?? 2,
|
|
10
|
-
complexity: overrides.complexity ?? 3,
|
|
11
|
-
type: overrides.type || 'feature',
|
|
12
|
-
category: overrides.category || 'default',
|
|
13
|
-
createdAt: overrides.createdAt || '2026-03-23T00:00:00.000Z',
|
|
14
|
-
updatedAt: overrides.updatedAt || null,
|
|
15
|
-
completedAt: overrides.completedAt || null,
|
|
16
|
-
assignee: overrides.assignee || 'unassigned',
|
|
17
|
-
comments: [],
|
|
18
|
-
attachments: [],
|
|
19
|
-
activity: [],
|
|
20
|
-
taskEvents: [],
|
|
21
|
-
referenceLabel: overrides.referenceLabel,
|
|
22
|
-
taxonomies: overrides.taxonomies || {}
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
describe('taskSearch', () => {
|
|
26
|
-
it('normalizes common pasted task reference formats', () => {
|
|
27
|
-
expect(normalizeTaskReferenceToken(' T-123 ')).toBe('t-123');
|
|
28
|
-
expect(normalizeTaskReferenceToken('T - 123')).toBe('t-123');
|
|
29
|
-
expect(normalizeTaskReferenceToken('T 123')).toBe('t-123');
|
|
30
|
-
expect(normalizeTaskReferenceToken('t–123')).toBe('t-123');
|
|
31
|
-
expect(normalizeTaskReferenceToken('LT - 45')).toBe('lt-45');
|
|
32
|
-
});
|
|
33
|
-
it('matches canonicalized task references', () => {
|
|
34
|
-
const task = makeTask({ referenceLabel: 'T-123' });
|
|
35
|
-
expect(taskMatchesSearch(task, normalizeTaskSearchQuery('T - 123'))).toBe(true);
|
|
36
|
-
expect(taskMatchesSearch(task, normalizeTaskSearchQuery('t–123'))).toBe(true);
|
|
37
|
-
});
|
|
38
|
-
it('matches all query tokens across task text', () => {
|
|
39
|
-
const task = makeTask({ title: 'Billing cleanup', description: 'Audit the API handlers' });
|
|
40
|
-
expect(taskMatchesSearch(task, 'api billing')).toBe(true);
|
|
41
|
-
expect(taskMatchesSearch(task, 'api invoices')).toBe(false);
|
|
42
|
-
});
|
|
43
|
-
it('matches task metadata labels', () => {
|
|
44
|
-
const task = makeTask({
|
|
45
|
-
category: 'ops',
|
|
46
|
-
type: 'bug',
|
|
47
|
-
priority: 3,
|
|
48
|
-
assignee: 'member-1',
|
|
49
|
-
taxonomies: { track: 'platform' }
|
|
50
|
-
});
|
|
51
|
-
const context = {
|
|
52
|
-
categories: [{ value: 'ops', label: 'Operations', disabled: false }],
|
|
53
|
-
types: [{ value: 'bug', label: 'Bug' }],
|
|
54
|
-
priorities: [{ value: 3, label: 'High' }],
|
|
55
|
-
assigneeOptions: [{ value: 'member-1', label: 'Member One', icon: 'User', color: '#22c55e', kind: 'member' }],
|
|
56
|
-
taxonomies: [{
|
|
57
|
-
id: 'track',
|
|
58
|
-
label: 'Track',
|
|
59
|
-
options: [{ value: 'platform', label: 'Platform' }],
|
|
60
|
-
widgetType: 'select',
|
|
61
|
-
isSystem: false,
|
|
62
|
-
multiSelect: false
|
|
63
|
-
}]
|
|
64
|
-
};
|
|
65
|
-
expect(taskMatchesSearch(task, 'operations', context)).toBe(true);
|
|
66
|
-
expect(taskMatchesSearch(task, 'member one', context)).toBe(true);
|
|
67
|
-
expect(taskMatchesSearch(task, 'track platform', context)).toBe(true);
|
|
68
|
-
});
|
|
69
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { render } from '@testing-library/react';
|
|
3
|
-
import { describe, expect, it } from 'vitest';
|
|
4
|
-
import { renderHighlighted } from './taskUtils';
|
|
5
|
-
describe('renderHighlighted', () => {
|
|
6
|
-
it('highlights matches when the query has surrounding spaces', () => {
|
|
7
|
-
const { container } = render(_jsx("p", { children: renderHighlighted('T-123', ' T-123 ') }));
|
|
8
|
-
expect(container.querySelector('mark')?.textContent).toBe('T-123');
|
|
9
|
-
});
|
|
10
|
-
it('highlights task references when the query has pasted formatting', () => {
|
|
11
|
-
const { container } = render(_jsx("p", { children: renderHighlighted('T-123', ' T - 123 ') }));
|
|
12
|
-
expect(container.querySelector('mark')?.textContent).toBe('T-123');
|
|
13
|
-
});
|
|
14
|
-
it('treats whitespace-only queries as empty', () => {
|
|
15
|
-
const { container } = render(_jsx("p", { children: renderHighlighted('T-123', ' ') }));
|
|
16
|
-
expect(container.querySelector('mark')).toBeNull();
|
|
17
|
-
expect(container.textContent).toBe('T-123');
|
|
18
|
-
});
|
|
19
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
-
import { fetchTaskforceApi, persistLocalMutationActorUserId, readLocalMutationActorUserId, } from './taskforceApiClient';
|
|
3
|
-
describe('taskforceApiClient local mutation actor header', () => {
|
|
4
|
-
beforeEach(() => {
|
|
5
|
-
vi.restoreAllMocks();
|
|
6
|
-
persistLocalMutationActorUserId(null);
|
|
7
|
-
window.history.replaceState({}, '', '/');
|
|
8
|
-
});
|
|
9
|
-
afterEach(() => {
|
|
10
|
-
persistLocalMutationActorUserId(null);
|
|
11
|
-
});
|
|
12
|
-
it('adds the local mutation actor header on same-origin taskforce api requests', async () => {
|
|
13
|
-
const fetchMock = vi.fn().mockResolvedValue(new Response('{}', { status: 200 }));
|
|
14
|
-
vi.stubGlobal('fetch', fetchMock);
|
|
15
|
-
persistLocalMutationActorUserId('user-test-06');
|
|
16
|
-
await fetchTaskforceApi('/api/taskforce/annotated-attachments/sessions', {
|
|
17
|
-
method: 'POST',
|
|
18
|
-
headers: { 'Content-Type': 'application/json' },
|
|
19
|
-
body: '{}',
|
|
20
|
-
});
|
|
21
|
-
expect(readLocalMutationActorUserId()).toBe('user-test-06');
|
|
22
|
-
expect(fetchMock).toHaveBeenCalledTimes(1);
|
|
23
|
-
const [, init] = fetchMock.mock.calls[0];
|
|
24
|
-
const headers = new Headers(init.headers);
|
|
25
|
-
expect(headers.get('x-taskforce-user-id')).toBe('user-test-06');
|
|
26
|
-
expect(headers.get('content-type')).toBe('application/json');
|
|
27
|
-
});
|
|
28
|
-
it('does not override an explicit user id header', async () => {
|
|
29
|
-
const fetchMock = vi.fn().mockResolvedValue(new Response('{}', { status: 200 }));
|
|
30
|
-
vi.stubGlobal('fetch', fetchMock);
|
|
31
|
-
persistLocalMutationActorUserId('user-test-06');
|
|
32
|
-
await fetchTaskforceApi('/api/taskforce/annotated-attachments/sessions', {
|
|
33
|
-
method: 'POST',
|
|
34
|
-
headers: {
|
|
35
|
-
'Content-Type': 'application/json',
|
|
36
|
-
'x-taskforce-user-id': 'user-explicit',
|
|
37
|
-
},
|
|
38
|
-
body: '{}',
|
|
39
|
-
});
|
|
40
|
-
const [, init] = fetchMock.mock.calls[0];
|
|
41
|
-
const headers = new Headers(init.headers);
|
|
42
|
-
expect(headers.get('x-taskforce-user-id')).toBe('user-explicit');
|
|
43
|
-
});
|
|
44
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { buildDefaultFormTaxonomies, getVisibleTaskFormTaxonomies } from './taxonomyFormDefaults';
|
|
3
|
-
describe('taxonomy form defaults', () => {
|
|
4
|
-
it('builds default form values from configured taxonomy defaults', () => {
|
|
5
|
-
const taxonomies = [
|
|
6
|
-
{
|
|
7
|
-
id: 'review-status',
|
|
8
|
-
label: 'Review Status',
|
|
9
|
-
widgetType: 'select',
|
|
10
|
-
isSystem: false,
|
|
11
|
-
multiSelect: false,
|
|
12
|
-
defaultValue: 'pending',
|
|
13
|
-
options: [{ value: 'pending', label: 'Pending', status: 'active' }]
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
id: 'channels',
|
|
17
|
-
label: 'Channels',
|
|
18
|
-
widgetType: 'select',
|
|
19
|
-
isSystem: false,
|
|
20
|
-
multiSelect: true,
|
|
21
|
-
defaultValue: ['email', 'web'],
|
|
22
|
-
options: [
|
|
23
|
-
{ value: 'email', label: 'Email', status: 'active' },
|
|
24
|
-
{ value: 'web', label: 'Web', status: 'active' }
|
|
25
|
-
]
|
|
26
|
-
}
|
|
27
|
-
];
|
|
28
|
-
expect(buildDefaultFormTaxonomies(taxonomies)).toEqual({
|
|
29
|
-
'review-status': 'pending',
|
|
30
|
-
channels: ['email', 'web']
|
|
31
|
-
});
|
|
32
|
-
});
|
|
33
|
-
it('shows hidden taxonomies when they are required or already selected', () => {
|
|
34
|
-
const taxonomies = [
|
|
35
|
-
{
|
|
36
|
-
id: 'hidden-taxonomy',
|
|
37
|
-
label: 'Hidden Taxonomy',
|
|
38
|
-
formEnabled: false,
|
|
39
|
-
widgetType: 'select',
|
|
40
|
-
isSystem: false,
|
|
41
|
-
multiSelect: false,
|
|
42
|
-
options: [{ value: 'value-a', label: 'Value A', status: 'active' }]
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
id: 'required-taxonomy',
|
|
46
|
-
label: 'Required Taxonomy',
|
|
47
|
-
formEnabled: false,
|
|
48
|
-
isRequired: true,
|
|
49
|
-
widgetType: 'select',
|
|
50
|
-
isSystem: false,
|
|
51
|
-
multiSelect: false,
|
|
52
|
-
options: [{ value: 'value-b', label: 'Value B', status: 'active' }]
|
|
53
|
-
}
|
|
54
|
-
];
|
|
55
|
-
expect(getVisibleTaskFormTaxonomies(taxonomies, {})).toEqual([
|
|
56
|
-
expect.objectContaining({ id: 'required-taxonomy' })
|
|
57
|
-
]);
|
|
58
|
-
expect(getVisibleTaskFormTaxonomies(taxonomies, { 'hidden-taxonomy': 'value-a' })).toEqual([
|
|
59
|
-
expect.objectContaining({ id: 'hidden-taxonomy' }),
|
|
60
|
-
expect.objectContaining({ id: 'required-taxonomy' })
|
|
61
|
-
]);
|
|
62
|
-
});
|
|
63
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { resolveUiNoticeTtl } from './uiNotice';
|
|
3
|
-
describe('resolveUiNoticeTtl', () => {
|
|
4
|
-
it('uses default ttl for success/info notices', () => {
|
|
5
|
-
expect(resolveUiNoticeTtl('success')).toBe(2600);
|
|
6
|
-
expect(resolveUiNoticeTtl('info')).toBe(2600);
|
|
7
|
-
});
|
|
8
|
-
it('uses default ttl for error notices', () => {
|
|
9
|
-
expect(resolveUiNoticeTtl('error')).toBe(3600);
|
|
10
|
-
});
|
|
11
|
-
it('accepts an explicit positive ttl', () => {
|
|
12
|
-
expect(resolveUiNoticeTtl('success', 1500)).toBe(1500);
|
|
13
|
-
});
|
|
14
|
-
it('ignores invalid ttl values', () => {
|
|
15
|
-
expect(resolveUiNoticeTtl('success', 0)).toBe(2600);
|
|
16
|
-
expect(resolveUiNoticeTtl('error', -1)).toBe(3600);
|
|
17
|
-
});
|
|
18
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { RESERVED_WORKSPACE_ID, WORKSPACE_BOOTSTRAP_SCOPE, generateWorkspaceId, isReservedWorkspaceId, isUsableWorkspaceId, normalizeWorkspaceStorageScopeLegacy, normalizeWorkspaceStorageScope, resolveWorkspaceSelectionScopeForRuntime, resolveWorkspaceStorageScopeForRuntime, resolveWorkspaceUiStateScopeForRuntime, resolveWorkspaceStorageScopeFromProjectRoot } from './workspaceIdentity';
|
|
3
|
-
describe('workspace identity invariants', () => {
|
|
4
|
-
it('uses bootstrap scope when project root is unavailable', () => {
|
|
5
|
-
expect(resolveWorkspaceStorageScopeFromProjectRoot('')).toBe(WORKSPACE_BOOTSTRAP_SCOPE);
|
|
6
|
-
expect(normalizeWorkspaceStorageScope('')).toBe(WORKSPACE_BOOTSTRAP_SCOPE);
|
|
7
|
-
});
|
|
8
|
-
it('normalizes project-root-derived scope with stable hash suffix', () => {
|
|
9
|
-
const scope = resolveWorkspaceStorageScopeFromProjectRoot('/Users/ross/My Project');
|
|
10
|
-
expect(scope.startsWith('users-ross-my-project-')).toBe(true);
|
|
11
|
-
expect(scope.length).toBeGreaterThan('users-ross-my-project-'.length);
|
|
12
|
-
});
|
|
13
|
-
it('uses workspace-specific scope for cloud workspaces', () => {
|
|
14
|
-
const scope = resolveWorkspaceUiStateScopeForRuntime({
|
|
15
|
-
runtimeMode: 'cloud',
|
|
16
|
-
workspaceId: 'workspace-cloud-123'
|
|
17
|
-
});
|
|
18
|
-
expect(scope.startsWith('cloud-workspace-workspace-cloud-123-')).toBe(true);
|
|
19
|
-
expect(scope).not.toBe(WORKSPACE_BOOTSTRAP_SCOPE);
|
|
20
|
-
});
|
|
21
|
-
it('falls back to bootstrap scope for default cloud workspace id', () => {
|
|
22
|
-
expect(resolveWorkspaceUiStateScopeForRuntime({
|
|
23
|
-
runtimeMode: 'cloud',
|
|
24
|
-
workspaceId: 'default'
|
|
25
|
-
})).toBe(WORKSPACE_BOOTSTRAP_SCOPE);
|
|
26
|
-
});
|
|
27
|
-
it('uses bootstrap scope as the stable selection scope in cloud mode', () => {
|
|
28
|
-
expect(resolveWorkspaceSelectionScopeForRuntime({
|
|
29
|
-
runtimeMode: 'cloud',
|
|
30
|
-
projectRoot: '/Users/ross/My Project'
|
|
31
|
-
})).toBe(WORKSPACE_BOOTSTRAP_SCOPE);
|
|
32
|
-
});
|
|
33
|
-
it('keeps storage-scope compatibility helper aligned with ui state scope resolution', () => {
|
|
34
|
-
expect(resolveWorkspaceStorageScopeForRuntime({
|
|
35
|
-
runtimeMode: 'cloud',
|
|
36
|
-
workspaceId: 'workspace-cloud-123'
|
|
37
|
-
})).toBe(resolveWorkspaceUiStateScopeForRuntime({
|
|
38
|
-
runtimeMode: 'cloud',
|
|
39
|
-
workspaceId: 'workspace-cloud-123'
|
|
40
|
-
}));
|
|
41
|
-
});
|
|
42
|
-
it('keeps legacy scope normalization for migration fallback', () => {
|
|
43
|
-
expect(normalizeWorkspaceStorageScopeLegacy('/Users/ross/My Project')).toBe('users-ross-my-project');
|
|
44
|
-
});
|
|
45
|
-
it('avoids collisions for similarly normalized path variants', () => {
|
|
46
|
-
const a = normalizeWorkspaceStorageScope('/Users/ross/Maple Valley Group');
|
|
47
|
-
const b = normalizeWorkspaceStorageScope('/Users/ross/Maple-Valley-Group');
|
|
48
|
-
expect(a).not.toBe(b);
|
|
49
|
-
});
|
|
50
|
-
it('never treats default as usable workspace id', () => {
|
|
51
|
-
expect(isReservedWorkspaceId(RESERVED_WORKSPACE_ID)).toBe(true);
|
|
52
|
-
expect(isReservedWorkspaceId(' Default ')).toBe(true);
|
|
53
|
-
expect(isUsableWorkspaceId('default')).toBe(false);
|
|
54
|
-
expect(isUsableWorkspaceId('workspace-123')).toBe(true);
|
|
55
|
-
});
|
|
56
|
-
it('generates non-default workspace ids with workspace- prefix', () => {
|
|
57
|
-
const id = generateWorkspaceId();
|
|
58
|
-
expect(id.startsWith('workspace-')).toBe(true);
|
|
59
|
-
expect(id.toLowerCase()).not.toBe(RESERVED_WORKSPACE_ID);
|
|
60
|
-
});
|
|
61
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { resolveWorkspaceLifecycleState } from './workspaceLifecycle';
|
|
3
|
-
function makeSetupState(partial) {
|
|
4
|
-
return {
|
|
5
|
-
globalSetupState: 'present',
|
|
6
|
-
workspaceSetupState: 'present',
|
|
7
|
-
runtimeMode: 'local',
|
|
8
|
-
workspaceId: 'workspace-1',
|
|
9
|
-
mode: 'core',
|
|
10
|
-
forceSetup: false,
|
|
11
|
-
forceGlobalSetup: false,
|
|
12
|
-
forceWorkspaceSetup: false,
|
|
13
|
-
...partial
|
|
14
|
-
};
|
|
15
|
-
}
|
|
16
|
-
describe('workspace lifecycle state resolver', () => {
|
|
17
|
-
it('returns ready when setup state is not available', () => {
|
|
18
|
-
const resolved = resolveWorkspaceLifecycleState({
|
|
19
|
-
setupState: null,
|
|
20
|
-
runtimeMode: 'local',
|
|
21
|
-
isAuthenticated: false
|
|
22
|
-
});
|
|
23
|
-
expect(resolved.phase).toBe('ready');
|
|
24
|
-
expect(resolved.setupGateActive).toBe(false);
|
|
25
|
-
});
|
|
26
|
-
it('requires workspace setup for local missing workspace', () => {
|
|
27
|
-
const resolved = resolveWorkspaceLifecycleState({
|
|
28
|
-
setupState: makeSetupState({ workspaceSetupState: 'missing' }),
|
|
29
|
-
runtimeMode: 'local',
|
|
30
|
-
isAuthenticated: false
|
|
31
|
-
});
|
|
32
|
-
expect(resolved.setupGateActive).toBe(true);
|
|
33
|
-
expect(resolved.needsWorkspaceSetup).toBe(true);
|
|
34
|
-
expect(resolved.phase).toBe('needs-workspace-setup');
|
|
35
|
-
});
|
|
36
|
-
it('requires workspace setup in cloud only when authenticated', () => {
|
|
37
|
-
const unauthenticated = resolveWorkspaceLifecycleState({
|
|
38
|
-
setupState: makeSetupState({ workspaceSetupState: 'missing' }),
|
|
39
|
-
runtimeMode: 'cloud',
|
|
40
|
-
isAuthenticated: false
|
|
41
|
-
});
|
|
42
|
-
expect(unauthenticated.setupGateActive).toBe(false);
|
|
43
|
-
expect(unauthenticated.phase).toBe('ready');
|
|
44
|
-
const authenticated = resolveWorkspaceLifecycleState({
|
|
45
|
-
setupState: makeSetupState({ workspaceSetupState: 'missing' }),
|
|
46
|
-
runtimeMode: 'cloud',
|
|
47
|
-
isAuthenticated: true
|
|
48
|
-
});
|
|
49
|
-
expect(authenticated.setupGateActive).toBe(true);
|
|
50
|
-
expect(authenticated.needsWorkspaceSetup).toBe(true);
|
|
51
|
-
});
|
|
52
|
-
it('prioritizes unreadable setup state as setup-read-error', () => {
|
|
53
|
-
const resolved = resolveWorkspaceLifecycleState({
|
|
54
|
-
setupState: makeSetupState({
|
|
55
|
-
globalSetupState: 'unreadable',
|
|
56
|
-
forceGlobalSetup: true
|
|
57
|
-
}),
|
|
58
|
-
runtimeMode: 'local',
|
|
59
|
-
isAuthenticated: false
|
|
60
|
-
});
|
|
61
|
-
expect(resolved.hasSetupReadError).toBe(true);
|
|
62
|
-
expect(resolved.phase).toBe('setup-read-error');
|
|
63
|
-
});
|
|
64
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { resolveHeaderWorkspaceSyncPresentation } from './workspaceSyncPresentation';
|
|
3
|
-
describe('resolveHeaderWorkspaceSyncPresentation', () => {
|
|
4
|
-
it('forces the header sync badge off when the local runtime is signed out', () => {
|
|
5
|
-
const result = resolveHeaderWorkspaceSyncPresentation({
|
|
6
|
-
runtimeMode: 'local',
|
|
7
|
-
isAuthenticated: false,
|
|
8
|
-
workspaceSyncStatus: 'healthy',
|
|
9
|
-
workspaceCloudSyncEnabled: true,
|
|
10
|
-
workspaceSyncSummary: 'Sync is healthy.',
|
|
11
|
-
workspaceSyncRecommendedAction: 'No action needed.',
|
|
12
|
-
workspaceSyncError: 'None'
|
|
13
|
-
});
|
|
14
|
-
expect(result.actionable).toBe(false);
|
|
15
|
-
expect(result.status).toBe('off');
|
|
16
|
-
expect(result.syncEnabledLabel).toBe('no');
|
|
17
|
-
expect(result.summary).toContain('Sign in');
|
|
18
|
-
expect(result.recommendedAction).toContain('Sign in');
|
|
19
|
-
});
|
|
20
|
-
it('keeps the current sync status when sync is actionable', () => {
|
|
21
|
-
const result = resolveHeaderWorkspaceSyncPresentation({
|
|
22
|
-
runtimeMode: 'local',
|
|
23
|
-
isAuthenticated: true,
|
|
24
|
-
workspaceSyncStatus: 'attention',
|
|
25
|
-
workspaceCloudSyncEnabled: true,
|
|
26
|
-
workspaceSyncSummary: 'Sync needs attention before it can continue.',
|
|
27
|
-
workspaceSyncRecommendedAction: 'Press Sync to retry.',
|
|
28
|
-
workspaceSyncError: 'Retry later',
|
|
29
|
-
pushBlockedReason: null,
|
|
30
|
-
pullBlockedReason: null,
|
|
31
|
-
retryBlockedReason: null
|
|
32
|
-
});
|
|
33
|
-
expect(result.actionable).toBe(true);
|
|
34
|
-
expect(result.status).toBe('attention');
|
|
35
|
-
expect(result.syncEnabledLabel).toBe('yes');
|
|
36
|
-
expect(result.summary).toBe('Sync needs attention before it can continue.');
|
|
37
|
-
expect(result.lastError).toBe('Retry later');
|
|
38
|
-
});
|
|
39
|
-
it('surfaces the highest-priority blocked sync reason in the visible summary', () => {
|
|
40
|
-
const result = resolveHeaderWorkspaceSyncPresentation({
|
|
41
|
-
runtimeMode: 'local',
|
|
42
|
-
isAuthenticated: true,
|
|
43
|
-
workspaceSyncStatus: 'attention',
|
|
44
|
-
workspaceCloudSyncEnabled: true,
|
|
45
|
-
workspaceSyncSummary: 'Sync needs attention before it can continue.',
|
|
46
|
-
workspaceSyncRecommendedAction: 'Press Sync to retry.',
|
|
47
|
-
workspaceSyncError: 'Retry later',
|
|
48
|
-
pushBlockedReason: 'attach-cloud',
|
|
49
|
-
pullBlockedReason: 'retry-pending',
|
|
50
|
-
retryBlockedReason: 'auth-required'
|
|
51
|
-
});
|
|
52
|
-
expect(result.summary).toBe('Sync is paused until you sign in again.');
|
|
53
|
-
expect(result.recommendedAction).toBe('Sign in, then press Sync to retry.');
|
|
54
|
-
});
|
|
55
|
-
it('explains when another local window holds the sync lease', () => {
|
|
56
|
-
const result = resolveHeaderWorkspaceSyncPresentation({
|
|
57
|
-
runtimeMode: 'local',
|
|
58
|
-
isAuthenticated: true,
|
|
59
|
-
workspaceSyncStatus: 'attention',
|
|
60
|
-
workspaceCloudSyncEnabled: true,
|
|
61
|
-
workspaceSyncSummary: 'Sync needs attention before it can continue.',
|
|
62
|
-
workspaceSyncRecommendedAction: 'Press Sync to retry.',
|
|
63
|
-
workspaceSyncError: 'Retry later',
|
|
64
|
-
pushBlockedReason: 'lease-held',
|
|
65
|
-
pullBlockedReason: null,
|
|
66
|
-
retryBlockedReason: null
|
|
67
|
-
});
|
|
68
|
-
expect(result.summary).toBe('Another local window is already syncing this workspace.');
|
|
69
|
-
expect(result.recommendedAction).toBe('Use a single local window for sync, or close the other syncing window.');
|
|
70
|
-
});
|
|
71
|
-
});
|
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
import { chromium } from '@playwright/test';
|
|
2
|
-
import fs from 'node:fs/promises';
|
|
3
|
-
import os from 'node:os';
|
|
4
|
-
import path from 'node:path';
|
|
5
|
-
|
|
6
|
-
function asNonEmpty(value) {
|
|
7
|
-
return String(value || '').trim();
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
function resolveBaseUrl() {
|
|
11
|
-
const raw = asNonEmpty(process.env.TASKFORCE_PLAYWRIGHT_CLOUD_BASE_URL)
|
|
12
|
-
|| asNonEmpty(process.env.SYNC_SOAK_CLOUD_BASE_URL)
|
|
13
|
-
|| 'https://app.taskforcehq.ai';
|
|
14
|
-
return raw.replace(/\/+$/, '');
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
function resolveStorageStatePath() {
|
|
18
|
-
return asNonEmpty(process.env.TASKFORCE_PLAYWRIGHT_STORAGE_STATE)
|
|
19
|
-
|| path.join(os.homedir(), '.codex', 'playwright', 'taskforce-cloud-auth.json');
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
function resolveCredentials() {
|
|
23
|
-
const email = asNonEmpty(process.env.TASKFORCE_E2E_EMAIL) || asNonEmpty(process.env.SYNC_SOAK_EMAIL);
|
|
24
|
-
const password = asNonEmpty(process.env.TASKFORCE_E2E_PASSWORD) || asNonEmpty(process.env.SYNC_SOAK_PASSWORD);
|
|
25
|
-
if (!email || !password) {
|
|
26
|
-
throw new Error(
|
|
27
|
-
'Missing credentials. Set TASKFORCE_E2E_EMAIL/TASKFORCE_E2E_PASSWORD or SYNC_SOAK_EMAIL/SYNC_SOAK_PASSWORD.'
|
|
28
|
-
);
|
|
29
|
-
}
|
|
30
|
-
return { email, password };
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
async function ensureParentDir(filePath) {
|
|
34
|
-
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
async function readSessionAuthenticated(page, baseUrl) {
|
|
38
|
-
return await page.evaluate(async (origin) => {
|
|
39
|
-
const candidates = [
|
|
40
|
-
`${origin}/api/taskforce/auth/session`,
|
|
41
|
-
`${origin}/taskforce/api/taskforce/auth/session`
|
|
42
|
-
];
|
|
43
|
-
for (const url of candidates) {
|
|
44
|
-
try {
|
|
45
|
-
const response = await fetch(url, {
|
|
46
|
-
method: 'GET',
|
|
47
|
-
credentials: 'include',
|
|
48
|
-
headers: { Accept: 'application/json' }
|
|
49
|
-
});
|
|
50
|
-
if (!response.ok) continue;
|
|
51
|
-
const payload = await response.json().catch(() => ({}));
|
|
52
|
-
if (payload && typeof payload === 'object' && 'authenticated' in payload) {
|
|
53
|
-
return Boolean(payload.authenticated);
|
|
54
|
-
}
|
|
55
|
-
} catch {
|
|
56
|
-
// ignore endpoint miss or cross-origin fetch issues
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
return false;
|
|
60
|
-
}, baseUrl);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
async function sessionLooksValid(context, baseUrl) {
|
|
64
|
-
const page = await context.newPage();
|
|
65
|
-
try {
|
|
66
|
-
await page.goto(`${baseUrl}/taskforce/`, { waitUntil: 'domcontentloaded', timeout: 60000 });
|
|
67
|
-
await page.waitForTimeout(500);
|
|
68
|
-
if (!/(?:\/taskforce)?\/login(?:\?|$)/i.test(page.url())) {
|
|
69
|
-
return true;
|
|
70
|
-
}
|
|
71
|
-
return await readSessionAuthenticated(page, baseUrl);
|
|
72
|
-
} catch {
|
|
73
|
-
return false;
|
|
74
|
-
} finally {
|
|
75
|
-
await page.close().catch(() => undefined);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
async function performLogin(context, baseUrl, email, password) {
|
|
80
|
-
const page = await context.newPage();
|
|
81
|
-
await page.goto(`${baseUrl}/login?mode=login&next=${encodeURIComponent('/taskforce/')}`, {
|
|
82
|
-
waitUntil: 'domcontentloaded',
|
|
83
|
-
timeout: 60000
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
const emailField = page.locator('input[type="email"]').first();
|
|
87
|
-
const passwordField = page.locator('input[type="password"]').first();
|
|
88
|
-
const signInButton = page.getByRole('button', { name: /^sign in$/i }).first();
|
|
89
|
-
|
|
90
|
-
await emailField.waitFor({ state: 'visible', timeout: 20000 });
|
|
91
|
-
await passwordField.waitFor({ state: 'visible', timeout: 20000 });
|
|
92
|
-
|
|
93
|
-
await emailField.fill(email);
|
|
94
|
-
await passwordField.fill(password);
|
|
95
|
-
|
|
96
|
-
await Promise.all([
|
|
97
|
-
signInButton.click(),
|
|
98
|
-
page.waitForLoadState('domcontentloaded').catch(() => undefined)
|
|
99
|
-
]);
|
|
100
|
-
|
|
101
|
-
await page.waitForFunction(
|
|
102
|
-
() => !/(?:\/taskforce)?\/login(?:\?|$)/i.test(window.location.pathname + window.location.search),
|
|
103
|
-
undefined,
|
|
104
|
-
{ timeout: 30000 }
|
|
105
|
-
).catch(() => undefined);
|
|
106
|
-
|
|
107
|
-
const authenticated = await readSessionAuthenticated(page, baseUrl);
|
|
108
|
-
if (!authenticated) {
|
|
109
|
-
const feedback = await page.locator('[class*="loginError"], [data-testid*="login-error"]').first().textContent().catch(() => '');
|
|
110
|
-
throw new Error(`Login did not produce an authenticated session. url=${page.url()} feedback=${String(feedback || '').trim()}`);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
await page.goto(`${baseUrl}/taskforce/`, { waitUntil: 'domcontentloaded', timeout: 60000 });
|
|
114
|
-
await page.close();
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
async function main() {
|
|
118
|
-
const baseUrl = resolveBaseUrl();
|
|
119
|
-
const storageStatePath = resolveStorageStatePath();
|
|
120
|
-
const { email, password } = resolveCredentials();
|
|
121
|
-
const forceLogin = /^(1|true|yes)$/i.test(asNonEmpty(process.env.TASKFORCE_PLAYWRIGHT_FORCE_LOGIN));
|
|
122
|
-
|
|
123
|
-
await ensureParentDir(storageStatePath);
|
|
124
|
-
|
|
125
|
-
const browser = await chromium.launch({ headless: true });
|
|
126
|
-
try {
|
|
127
|
-
if (!forceLogin) {
|
|
128
|
-
try {
|
|
129
|
-
await fs.access(storageStatePath);
|
|
130
|
-
const existingContext = await browser.newContext({ storageState: storageStatePath });
|
|
131
|
-
const existingSessionValid = await sessionLooksValid(existingContext, baseUrl);
|
|
132
|
-
await existingContext.close();
|
|
133
|
-
if (existingSessionValid) {
|
|
134
|
-
console.log(`Playwright auth session already valid at ${storageStatePath}`);
|
|
135
|
-
return;
|
|
136
|
-
}
|
|
137
|
-
} catch {
|
|
138
|
-
// Missing or stale session file; refresh below.
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
const freshContext = await browser.newContext();
|
|
143
|
-
await performLogin(freshContext, baseUrl, email, password);
|
|
144
|
-
await freshContext.storageState({ path: storageStatePath });
|
|
145
|
-
await freshContext.close();
|
|
146
|
-
console.log(`Saved Playwright auth session to ${storageStatePath}`);
|
|
147
|
-
} finally {
|
|
148
|
-
await browser.close();
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
main().catch((error) => {
|
|
153
|
-
console.error(error instanceof Error ? error.message : String(error));
|
|
154
|
-
process.exitCode = 1;
|
|
155
|
-
});
|