@taskforcehq/taskforce 0.3.309 → 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 +89 -127
- package/dist/TaskforceCore.js +1 -1
- package/dist/components/context/ContextAttachmentManager.js +4 -3
- package/dist/components/features/InitiativesModule.js +1 -1
- package/dist/components/features/TaskSettings.js +1 -1
- package/dist/components/ui/DisclosureSectionHeader.d.ts +12 -0
- package/dist/components/ui/DisclosureSectionHeader.js +8 -0
- package/dist/components/views/PlanComparisonPage.js +1 -1
- package/dist/components/views/StandaloneLayout.js +18 -4
- package/dist/components/views/panels/PlanningDrawer.js +2 -1
- package/dist/components/views/standalone/modals/AccountHubModal.js +1 -1
- package/dist/components/views/standalone/modals/HelpModal.d.ts +3 -1
- package/dist/components/views/standalone/modals/HelpModal.js +17 -2
- package/dist/core/PlanEntitlementService.d.ts +2 -0
- package/dist/core/PlanEntitlementService.js +57 -4
- package/dist/hooks/useFilterSort.js +1 -1
- package/dist/hooks/useTaskforce.js +2 -2
- package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.js +5 -2
- package/dist/localization/locales/en-US.js +1 -1
- package/dist/localization/locales/es-419.js +1 -1
- package/dist/localization/locales/pt-BR.js +1 -1
- package/dist/mcp/runtime.js +49 -14
- package/dist/server/routes/billing.js +0 -1
- package/dist/ui/assets/AgentsModule-BULqIo8e.js +1 -0
- package/dist/ui/assets/{AnnotatedAttachmentWorkspace-CCckzWYZ.js → AnnotatedAttachmentWorkspace-DHr4rHK9.js} +1 -1
- package/dist/ui/assets/ContextAttachmentManager-DoMe2OpY.js +3 -0
- package/dist/ui/assets/{DocumentWorkspace-BVaWPA25.js → DocumentWorkspace-DumBWhvb.js} +1 -1
- package/dist/ui/assets/{EntityActivityTimeline-DSj0ThaK.js → EntityActivityTimeline-sHk8Nzbq.js} +1 -1
- package/dist/ui/assets/{InitiativesModule-AxMkWtxH.js → InitiativesModule-3X9UNzHh.js} +1 -1
- package/dist/ui/assets/PlansPage-C3A3EYaV.js +1 -0
- package/dist/ui/assets/PlansPage-DeAzWYTb.css +1 -0
- package/dist/ui/assets/{TaskContextUpload-Dw4rTF4i.js → TaskContextUpload-C8G7pWkX.js} +1 -1
- package/dist/ui/assets/{TaskSettings-f2ga42_V.js → TaskSettings-DM1o9Wla.js} +2 -2
- package/dist/ui/assets/{WorkflowsModule-E4UL3mov.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-BvAbqx5Q.css → index-DcK_8tuE.css} +1 -1
- package/dist/ui/assets/{vendor-icons-B32hGuF2.js → vendor-icons-CLnehDTw.js} +1 -1
- package/dist/ui/index.html +3 -3
- package/dist/utils/supportContact.d.ts +9 -0
- package/dist/utils/supportContact.js +32 -0
- 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 -757
- 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 -66
- 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 -204
- 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 -5120
- 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 -3455
- 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/AgentsModule-BS4Pi_nC.js +0 -1
- package/dist/ui/assets/ContextAttachmentManager-CfG_ER7C.js +0 -3
- package/dist/ui/assets/PlansPage-B_z-D6Nh.css +0 -1
- package/dist/ui/assets/PlansPage-Ndt7mYfo.js +0 -1
- package/dist/ui/assets/documentReferences-BOUcJm6-.js +0 -1
- package/dist/ui/assets/index-MAHKvFqp.js +0 -4
- 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/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
package/README.md
CHANGED
|
@@ -1,182 +1,144 @@
|
|
|
1
1
|
# Taskforce
|
|
2
2
|
|
|
3
|
-
Taskforce is a task
|
|
3
|
+
Taskforce is a shared task and planning workspace for humans collaborating with AI.
|
|
4
4
|
|
|
5
|
-
It
|
|
5
|
+
It brings tasks, planning, document review, image review, and AI access into one place so people and AI collaborators can work from the same source of truth.
|
|
6
6
|
|
|
7
7
|
Taskforce is currently in beta and under active development.
|
|
8
8
|
|
|
9
|
-
##
|
|
9
|
+
## Install Taskforce
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
- Tasks with title, description, status, priority, type, category, assignee, due date, scheduled date, and checklist support
|
|
13
|
-
- Custom workspace taxonomy for categories, types, priorities, approaches, and complexity
|
|
14
|
-
- Task comments and task attachments
|
|
15
|
-
- Schedule board for planning work by day
|
|
16
|
-
- Archive and restore flows for completed or cancelled work
|
|
11
|
+
Install Taskforce once, then run it from any folder, workspace, or project:
|
|
17
12
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
- Initiative templates for reusable planning structures such as launch, migration, or incident work
|
|
13
|
+
```bash
|
|
14
|
+
npm install --global @taskforcehq/taskforce
|
|
15
|
+
```
|
|
22
16
|
|
|
23
|
-
|
|
24
|
-
- Built-in MCP support for local and cloud usage
|
|
25
|
-
- AI profile resolution and task ownership for agent collaborators
|
|
26
|
-
- MCP tools for reading and updating tasks, planning entities, documents, image reviews, schedules, and attachments
|
|
27
|
-
- Local MCP configuration for local clients such as Codex, Claude Code CLI, and Gemini CLI
|
|
28
|
-
- Cloud MCP token flow for remote clients
|
|
17
|
+
Then open Taskforce from the folder, workspace, or project you want to manage:
|
|
29
18
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
- Image Notes for visual review with saved annotation sessions and markers
|
|
33
|
-
- MCP helper flows for document review and image review
|
|
34
|
-
|
|
35
|
-
### Runtime and deployment model
|
|
36
|
-
- Local runtime and cloud runtime support
|
|
37
|
-
- Separate app, site, and admin surfaces in the repo
|
|
38
|
-
- Auth, billing, and account flows for the hosted product
|
|
39
|
-
- Workspace sync and cloud/local runtime routing infrastructure
|
|
40
|
-
|
|
41
|
-
## What is intentionally not part of the product right now
|
|
42
|
-
|
|
43
|
-
These exist in the codebase in some form, but should not be treated as current product surface area.
|
|
44
|
-
|
|
45
|
-
- **Workflow editor**: currently disabled and should not be presented as an active feature
|
|
46
|
-
- **Embedded widget/in-app overlay version**: not part of the product right now, not tested recently, and likely to be deprecated
|
|
47
|
-
|
|
48
|
-
## Product surfaces
|
|
49
|
-
|
|
50
|
-
- `apps/app` - the main Taskforce application
|
|
51
|
-
- `apps/site` - the public website / marketing surface
|
|
52
|
-
- `apps/admin` - the admin surface
|
|
53
|
-
|
|
54
|
-
## Repository structure
|
|
55
|
-
|
|
56
|
-
```text
|
|
57
|
-
apps/
|
|
58
|
-
app/ Main product app
|
|
59
|
-
site/ Public website
|
|
60
|
-
admin/ Admin surface
|
|
61
|
-
src/
|
|
62
|
-
components/ UI components and product modules
|
|
63
|
-
core/ Core application logic
|
|
64
|
-
server/ Server routes and runtime logic
|
|
65
|
-
mcp/ MCP runtime and tool registry
|
|
66
|
-
sync/ Sync model and transfer logic
|
|
67
|
-
storage/ Persistence and asset storage
|
|
68
|
-
tests/
|
|
69
|
-
e2e/ Playwright realtime and interactive browser scenarios
|
|
70
|
-
soak/ Playwright soak and endurance scenarios
|
|
19
|
+
```bash
|
|
20
|
+
taskforce open
|
|
71
21
|
```
|
|
72
22
|
|
|
73
|
-
|
|
23
|
+
You can also install with Homebrew:
|
|
74
24
|
|
|
75
|
-
|
|
25
|
+
```bash
|
|
26
|
+
brew tap taskforcehq/tap
|
|
27
|
+
brew install taskforce
|
|
28
|
+
```
|
|
76
29
|
|
|
77
|
-
|
|
78
|
-
- Node.js 20+
|
|
79
|
-
- npm
|
|
30
|
+
The npm package page may show `npm i @taskforcehq/taskforce`, but most users should include `--global` so the `taskforce` command is available from the terminal.
|
|
80
31
|
|
|
81
|
-
|
|
32
|
+
## Update Taskforce
|
|
33
|
+
|
|
34
|
+
If you installed with npm:
|
|
82
35
|
|
|
83
36
|
```bash
|
|
84
|
-
npm
|
|
37
|
+
npm update --global @taskforcehq/taskforce
|
|
85
38
|
```
|
|
86
39
|
|
|
87
|
-
|
|
40
|
+
If you installed with Homebrew:
|
|
88
41
|
|
|
89
42
|
```bash
|
|
90
|
-
|
|
43
|
+
brew upgrade taskforce
|
|
91
44
|
```
|
|
92
45
|
|
|
93
|
-
|
|
46
|
+
## Get Started
|
|
94
47
|
|
|
95
|
-
|
|
48
|
+
Go to the folder you want Taskforce to manage, then run:
|
|
96
49
|
|
|
97
50
|
```bash
|
|
98
|
-
|
|
51
|
+
taskforce open
|
|
99
52
|
```
|
|
100
53
|
|
|
101
|
-
|
|
54
|
+
Taskforce opens in your browser and stores workspace data in that folder, under `.taskforce/`.
|
|
102
55
|
|
|
103
|
-
|
|
56
|
+
Updating or uninstalling Taskforce does not remove your workspace data.
|
|
104
57
|
|
|
105
|
-
|
|
106
|
-
Use Local MCP for local stdio-based clients. This is the intended path for tools such as:
|
|
107
|
-
- Codex
|
|
108
|
-
- Claude Code CLI
|
|
109
|
-
- Gemini CLI
|
|
58
|
+
To confirm which workspace Taskforce is using:
|
|
110
59
|
|
|
111
|
-
|
|
60
|
+
```bash
|
|
61
|
+
taskforce status
|
|
62
|
+
```
|
|
112
63
|
|
|
113
|
-
|
|
114
|
-
Use Cloud MCP for hosted remote clients. Cloud MCP uses token-based access and the hosted MCP endpoint.
|
|
64
|
+
To connect a local AI client through MCP, start the MCP server from the same workspace:
|
|
115
65
|
|
|
116
|
-
|
|
66
|
+
```bash
|
|
67
|
+
taskforce mcp
|
|
68
|
+
```
|
|
117
69
|
|
|
118
|
-
|
|
119
|
-
Taskforce is designed so people and AI agents can work from the same task graph, rather than forcing humans to maintain one system and agents to operate from another.
|
|
70
|
+
## What Taskforce Includes
|
|
120
71
|
|
|
121
|
-
###
|
|
122
|
-
Taskforce supports a planning hierarchy that can represent real work:
|
|
123
|
-
- Initiative
|
|
124
|
-
- Workstream
|
|
125
|
-
- Task
|
|
126
|
-
- Checklist
|
|
72
|
+
### Task Management
|
|
127
73
|
|
|
128
|
-
|
|
74
|
+
- Tasks with title, description, status, priority, type, category, assignee, due date, scheduled date, and checklist support
|
|
75
|
+
- Custom workspace taxonomy for categories, types, priorities, approaches, and complexity
|
|
76
|
+
- Task comments and task attachments
|
|
77
|
+
- Schedule board for planning work by day
|
|
78
|
+
- Archive and restore flows for completed or cancelled work
|
|
79
|
+
|
|
80
|
+
### Planning
|
|
81
|
+
|
|
82
|
+
- Initiatives, workstreams, tasks, and checklists
|
|
83
|
+
- Workstream and initiative assignment for tasks
|
|
84
|
+
- Initiative templates for reusable planning structures such as launches, migrations, and incident response
|
|
85
|
+
|
|
86
|
+
### AI Collaboration
|
|
87
|
+
|
|
88
|
+
- Built-in MCP access for AI clients
|
|
89
|
+
- AI profiles and task ownership for agent collaborators
|
|
90
|
+
- Tools for agents to read and update tasks, planning entities, documents, image reviews, schedules, and attachments
|
|
91
|
+
- Local MCP support for clients such as Codex, Claude Code CLI, and Gemini CLI
|
|
92
|
+
- Cloud MCP access for hosted remote clients
|
|
129
93
|
|
|
130
|
-
###
|
|
131
|
-
Taskforce includes first-class review surfaces for:
|
|
132
|
-
- documents, via document review sessions and comments
|
|
133
|
-
- images, via Image Notes sessions and markers
|
|
94
|
+
### Document And Image Review
|
|
134
95
|
|
|
135
|
-
|
|
96
|
+
- Document review sessions with threaded comments
|
|
97
|
+
- Image Notes for visual review with saved annotation sessions and markers
|
|
98
|
+
- AI-assisted document and image review workflows
|
|
99
|
+
|
|
100
|
+
### Sync And Hosted Workspaces
|
|
136
101
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
-
|
|
140
|
-
-
|
|
141
|
-
- create and comment on review sessions
|
|
142
|
-
- work with schedules and attachments
|
|
102
|
+
- Local workspace data for private, machine-local use
|
|
103
|
+
- Hosted workspaces for cloud-backed collaboration
|
|
104
|
+
- Workspace sync between local and cloud environments
|
|
105
|
+
- Account, auth, and billing flows for hosted usage
|
|
143
106
|
|
|
144
|
-
##
|
|
107
|
+
## MCP
|
|
145
108
|
|
|
146
|
-
|
|
147
|
-
- a production-ready embedded widget product
|
|
148
|
-
- a workflow editor product
|
|
149
|
-
- a generic developer overlay tool
|
|
150
|
-
- something centered only on AI-developer pairs
|
|
109
|
+
Taskforce includes built-in MCP support so AI clients can work directly with your workspace.
|
|
151
110
|
|
|
152
|
-
|
|
111
|
+
Local MCP is for AI clients running on the same machine as your workspace. It does not require a cloud token.
|
|
153
112
|
|
|
154
|
-
|
|
113
|
+
Cloud MCP is for hosted remote clients and uses token-based access.
|
|
155
114
|
|
|
156
|
-
|
|
115
|
+
## Uninstall Taskforce
|
|
157
116
|
|
|
158
|
-
|
|
117
|
+
If you installed with npm:
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
npm uninstall --global @taskforcehq/taskforce
|
|
121
|
+
```
|
|
159
122
|
|
|
160
|
-
|
|
161
|
-
Useful local checks include:
|
|
123
|
+
If you installed with Homebrew:
|
|
162
124
|
|
|
163
125
|
```bash
|
|
164
|
-
|
|
165
|
-
npm run test
|
|
126
|
+
brew uninstall taskforce
|
|
166
127
|
```
|
|
167
128
|
|
|
168
|
-
|
|
129
|
+
Your workspace data remains in each workspace's `.taskforce/` directory.
|
|
130
|
+
|
|
131
|
+
## Requirements
|
|
132
|
+
|
|
133
|
+
- Node.js 20+
|
|
134
|
+
- npm, or Homebrew on macOS
|
|
135
|
+
|
|
136
|
+
## Support
|
|
169
137
|
|
|
170
|
-
|
|
171
|
-
- `docs/runbooks/sync-soak-runbook.md`
|
|
172
|
-
- `docs/reference/operations/external-qa-workflow.md`
|
|
138
|
+
Taskforce is in beta. For issues and feedback, use GitHub Issues:
|
|
173
139
|
|
|
174
|
-
|
|
175
|
-
- `docs/reference/engineering/test-infrastructure.md`
|
|
176
|
-
- `docs/reference/platform/runtime-modes-contract.md`
|
|
177
|
-
- `docs/reference/operations/external-qa-workflow.md`
|
|
178
|
-
- `docs/runbooks/sync-soak-runbook.md`
|
|
140
|
+
https://github.com/taskforcehq/taskforce/issues
|
|
179
141
|
|
|
180
142
|
## Status
|
|
181
143
|
|
|
182
|
-
Taskforce is in active beta development.
|
|
144
|
+
Taskforce is in active beta development. This README describes the user-facing capabilities that are ready to try today.
|
package/dist/TaskforceCore.js
CHANGED
|
@@ -1367,7 +1367,7 @@ function TaskforceCoreWithRouter({ config = {}, initialTaskId, onTaskCountChange
|
|
|
1367
1367
|
if (shellRenderState === 'coming-soon') {
|
|
1368
1368
|
return (_jsx("div", { className: shellStyles.standaloneWrapper, "data-theme": currentTheme, children: _jsx("div", { className: authStyles.loginView, style: {
|
|
1369
1369
|
backgroundImage: `linear-gradient(rgba(15, 15, 26, 0.88), rgba(15, 15, 26, 0.9)), url(${taskforceBg})`
|
|
1370
|
-
}, children: _jsxs("div", { className: authStyles.loginCard, children: [_jsxs("div", { className: authStyles.authBrandRow, children: [_jsx("img", { src: authBrandLogo, alt: "Taskforce", className: authStyles.loginLogo }), _jsx("h1", { className: authStyles.loginTitle, children: "
|
|
1370
|
+
}, children: _jsxs("div", { className: authStyles.loginCard, children: [_jsxs("div", { className: authStyles.authBrandRow, children: [_jsx("img", { src: authBrandLogo, alt: "Taskforce", className: authStyles.loginLogo }), _jsx("h1", { className: authStyles.loginTitle, children: "Beta Access" })] }), _jsx("p", { className: authStyles.loginSubtitle, children: "You are signed in, but your account does not have beta access yet." }), _jsx("p", { className: authStyles.loginSubtitle, children: "You will see the full app as soon as beta access is enabled." }), _jsx("button", { className: styles.cancelBtn, onClick: async () => { await taskforceState.logout(); navigate('/login', { replace: true }); }, children: "Sign Out" })] }) }) }));
|
|
1371
1371
|
}
|
|
1372
1372
|
if (shellRenderState === 'guided-setup') {
|
|
1373
1373
|
const isError = !isCreateWorkspaceIntent && (hasSetupReadError || setupStep === 'error');
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { useEffect, useMemo, useRef, useState } from 'react';
|
|
3
|
-
import { AlertTriangle, Copy, Download, File, FileUp, Loader2, PencilLine, Trash2
|
|
3
|
+
import { AlertTriangle, Copy, Download, File, FileUp, Loader2, PencilLine, Trash2 } from 'lucide-react';
|
|
4
4
|
import styles from '../../Taskforce.module.css';
|
|
5
|
+
import { DisclosureSectionHeader } from '../ui/DisclosureSectionHeader';
|
|
5
6
|
import { dispatchOpenMarkdownDocument } from '../../utils/contextFiles';
|
|
6
7
|
import { canOpenAnnotatedAttachment, dispatchOpenAnnotatedAttachment } from '../../utils/annotatedAttachments';
|
|
7
8
|
import { dispatchTaskforceContextAssetsMutated } from '../../utils/contextAssetEvents';
|
|
@@ -460,7 +461,7 @@ export function ContextAttachmentManager(props) {
|
|
|
460
461
|
const path = typeof item === 'string' ? item : item.path;
|
|
461
462
|
return !isImagePath(path);
|
|
462
463
|
});
|
|
463
|
-
return (_jsxs("div", { className: styles.specialistSection, children: [
|
|
464
|
+
return (_jsxs("div", { className: styles.specialistSection, children: [_jsx(DisclosureSectionHeader, { label: "Context Documents", count: attachments.length, expanded: showContextUpload, expandedTitle: "Hide context documents", collapsedTitle: "Show context documents", onToggle: () => setShowContextUpload(!showContextUpload) }), showContextUpload && (_jsxs(_Fragment, { children: [_jsxs("p", { className: styles.settingsHint, children: ["Upload files into ", ownerTypeLabel, " context storage, or add an external http(s) URL."] }), _jsxs("div", { className: styles.contextUploadPanel, children: [_jsxs("div", { className: styles.contextUploadActions, children: [_jsxs("button", { type: "button", className: styles.secondaryHeaderBtn, onClick: () => inputRef.current?.click(), disabled: uploading, children: [uploading ? _jsx(Loader2, { size: 12, className: styles.spinner }) : _jsx(FileUp, { size: 12 }), uploading ? 'Uploading...' : 'Upload File'] }), _jsxs("button", { type: "button", className: styles.secondaryHeaderBtn, onClick: () => {
|
|
464
465
|
void handlePasteImage();
|
|
465
466
|
}, disabled: uploading, children: [_jsx(Copy, { size: 12 }), "Paste Image from Clipboard"] })] }), _jsx("input", { ref: inputRef, type: "file", accept: ACCEPTED_CONTEXT_FILE_TYPES, multiple: true, className: styles.hiddenInput, onChange: (e) => {
|
|
466
467
|
void handleFilesSelected(e.target.files);
|
|
@@ -16,7 +16,7 @@ export function InitiativesModule({ initiativeTemplates, onRefreshInitiativeTemp
|
|
|
16
16
|
return (_jsx("div", { className: `${styles.standalonePage} ${styles.standaloneContent}`, style: { overflow: 'auto' }, children: _jsx("div", { className: styles.settingsContent, style: { maxWidth: 900, margin: '0 auto', width: '100%' }, children: _jsxs("div", { className: styles.settingGroup, children: [_jsxs("div", { className: styles.settingTitleRow, children: [_jsx("h2", { className: styles.settingTitle, children: "Initiatives" }), _jsx("button", { className: styles.copyBtn, onClick: () => { void onRefreshInitiativeTemplates?.(); }, children: "Refresh" })] }), _jsx("p", { className: `${styles.settingsHint} ${styles.marginBottom12}`, children: "Create initiative-ready planning structures from reusable templates." }), _jsxs("div", { className: styles.exportItem, children: [_jsx("label", { className: styles.label, children: "Template" }), _jsx("select", { className: styles.input, value: selectedInitiativeTemplateId, onChange: (event) => {
|
|
17
17
|
const nextId = event.target.value;
|
|
18
18
|
setSelectedInitiativeTemplateId(nextId);
|
|
19
|
-
}, children: initiativeTemplates.map((template) => (_jsx("option", { value: template.id, children: template.name }, template.id))) })] }), _jsxs("div", { className: `${styles.exportItem} ${styles.marginTop12}`, children: [_jsx("label", { className: styles.label, children: "Initiative Title" }), _jsx("input", { className: styles.input, placeholder: "e.g. Taskforce
|
|
19
|
+
}, children: initiativeTemplates.map((template) => (_jsx("option", { value: template.id, children: template.name }, template.id))) })] }), _jsxs("div", { className: `${styles.exportItem} ${styles.marginTop12}`, children: [_jsx("label", { className: styles.label, children: "Initiative Title" }), _jsx("input", { className: styles.input, placeholder: "e.g. Taskforce Public Beta Launch", value: initiativeTitle, onChange: (event) => setInitiativeTitle(event.target.value) })] }), _jsxs("button", { className: `${styles.secondaryHeaderBtn} ${styles.marginTop12}`, disabled: isCreatingInitiative || !selectedInitiativeTemplateId || !initiativeTitle.trim() || !onCreateInitiativeFromTemplate, onClick: async () => {
|
|
20
20
|
if (!onCreateInitiativeFromTemplate)
|
|
21
21
|
return;
|
|
22
22
|
setIsCreatingInitiative(true);
|
|
@@ -875,7 +875,7 @@ export function TaskSettings(props) {
|
|
|
875
875
|
}, disabled: !onShowTaskCardStatusLabelChange }), _jsx("span", { children: "Show status label" })] })] })), activeTab === 'appearanceTaskForms' && renderTaskFormsControls(), activeTab === 'commands' && (_jsx(_Fragment, { children: _jsxs("div", { className: styles.settingGroup, children: [_jsx("div", { className: styles.settingTitleRow, children: _jsx("h3", { className: styles.settingTitle, children: "Command Workflows" }) }), _jsx("p", { className: `${styles.settingsHint} ${styles.marginBottom12}`, children: "Export standard workflows to your project to verify and commit them." }), _jsxs("div", { className: `${styles.exportRow} ${styles.exportRowGrid}`, children: [_jsxs("div", { className: styles.settingGroup, children: [_jsx("h4", { className: `${styles.settingSubtitle} ${styles.settingSubtitleCustom}`, children: "Target Environment" }), _jsx("div", { className: styles.buttonGrid, children: availableEnvironments.map(env => (_jsxs("button", { onClick: () => onExportEnvironmentChange(env.id), className: `${styles.themeBtn} ${exportEnvironment === env.id ? styles.activeTheme : ''} ${styles.capitalize}`, children: [getIconComponent(env.icon), env.name] }, env.id))) })] }), _jsxs("div", { className: styles.exportItem, children: [_jsxs("div", { className: styles.labelGroupFlex, children: [_jsx("label", { className: styles.label, children: "Workflows" }), _jsxs("span", { className: styles.settingDescription, children: ["Destination: ", _jsx("code", { className: styles.code, children: exportWorkflowsPath })] })] }), _jsxs("div", { className: styles.workflowList, children: [_jsxs("div", { className: styles.workflowActions, children: [_jsx("button", { onClick: handleSelectAllWorkflows, className: styles.textBtn, children: "All" }), _jsx("button", { onClick: handleDeselectAllWorkflows, className: styles.textBtn, children: "None" })] }), _jsx("div", { className: styles.workflowGrid, children: availableWorkflows.length === 0 ? (_jsxs("div", { className: styles.emptyState, children: ["No workflow templates found.", _jsx("button", { onClick: () => onRefreshWorkflows?.(true), className: styles.secondaryBtn, style: { marginTop: '8px' }, children: "Retry Fetch" })] })) : availableWorkflows.map(wf => (_jsxs("label", { className: styles.checkboxLabel, children: [_jsx("input", { type: "checkbox", checked: selectedWorkflows.includes(wf), onChange: () => handleToggleWorkflow(wf) }), wf] }, wf))) })] }), _jsxs("button", { className: `${styles.secondaryHeaderBtn} ${styles.marginTop12}`, onClick: () => onExportWorkflows?.(exportEnvironment, selectedWorkflows), disabled: exportingResource === 'workflows' || selectedWorkflows.length === 0, children: [exportingResource === 'workflows' ? _jsx(Loader2, { size: 14, className: styles.spinner }) : _jsx(FileText, { size: 14 }), "Export Selected (", selectedWorkflows.length, ")"] })] })] }), exportResult && (_jsxs("div", { className: `${exportResult.type === 'success' ? styles.successMessage : styles.errorMessage} ${styles.marginTop12}`, children: [exportResult.type === 'success' ? _jsx(Check, { size: 14 }) : _jsx(AlertTriangle, { size: 14 }), exportResult.message] }))] }) })), activeTab === 'initiatives' && (_jsxs("div", { className: styles.settingGroup, children: [_jsxs("div", { className: styles.settingTitleRow, children: [_jsx("h3", { className: styles.settingTitle, children: "Initiative Templates" }), _jsx("button", { className: styles.copyBtn, onClick: () => { void onRefreshInitiativeTemplates?.(); }, children: "Refresh" })] }), _jsx("p", { className: `${styles.settingsHint} ${styles.marginBottom12}`, children: "Create launch, migration, or incident initiatives from reusable templates." }), _jsxs("div", { className: styles.exportItem, children: [_jsx("label", { className: styles.label, children: "Template" }), _jsx("select", { className: styles.input, value: selectedInitiativeTemplateId, onChange: (e) => {
|
|
876
876
|
const nextId = e.target.value;
|
|
877
877
|
setSelectedInitiativeTemplateId(nextId);
|
|
878
|
-
}, children: initiativeTemplates.map(template => (_jsx("option", { value: template.id, children: template.name }, template.id))) })] }), _jsxs("div", { className: `${styles.exportItem} ${styles.marginTop12}`, children: [_jsx("label", { className: styles.label, children: "Initiative Title" }), _jsx("input", { className: styles.input, placeholder: "e.g. Taskforce
|
|
878
|
+
}, children: initiativeTemplates.map(template => (_jsx("option", { value: template.id, children: template.name }, template.id))) })] }), _jsxs("div", { className: `${styles.exportItem} ${styles.marginTop12}`, children: [_jsx("label", { className: styles.label, children: "Initiative Title" }), _jsx("input", { className: styles.input, placeholder: "e.g. Taskforce Public Beta Launch", value: initiativeTitle, onChange: (e) => setInitiativeTitle(e.target.value) })] }), _jsxs("button", { className: `${styles.secondaryHeaderBtn} ${styles.marginTop12}`, disabled: isCreatingInitiative || !selectedInitiativeTemplateId || !initiativeTitle.trim() || !onCreateInitiativeFromTemplate, onClick: async () => {
|
|
879
879
|
if (!onCreateInitiativeFromTemplate)
|
|
880
880
|
return;
|
|
881
881
|
setIsCreatingInitiative(true);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
interface DisclosureSectionHeaderProps {
|
|
2
|
+
label: string;
|
|
3
|
+
count?: number;
|
|
4
|
+
showZeroCount?: boolean;
|
|
5
|
+
expanded: boolean;
|
|
6
|
+
expandedTitle: string;
|
|
7
|
+
collapsedTitle: string;
|
|
8
|
+
onToggle: () => void;
|
|
9
|
+
className?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function DisclosureSectionHeader({ label, count, showZeroCount, expanded, expandedTitle, collapsedTitle, onToggle, className, }: DisclosureSectionHeaderProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { ChevronDown, ChevronRight } from 'lucide-react';
|
|
3
|
+
import styles from './DisclosureSectionHeader.module.css';
|
|
4
|
+
export function DisclosureSectionHeader({ label, count, showZeroCount = false, expanded, expandedTitle, collapsedTitle, onToggle, className = '', }) {
|
|
5
|
+
const shouldShowCount = typeof count === 'number' && (showZeroCount || count > 0);
|
|
6
|
+
const Icon = expanded ? ChevronDown : ChevronRight;
|
|
7
|
+
return (_jsxs("button", { type: "button", className: `${styles.header} ${className}`.trim(), onClick: onToggle, "aria-expanded": expanded, title: expanded ? expandedTitle : collapsedTitle, children: [_jsxs("span", { className: styles.title, children: [label, shouldShowCount ? ` (${count})` : ''] }), _jsx(Icon, { className: styles.icon, size: 14, "aria-hidden": "true" })] }));
|
|
8
|
+
}
|
|
@@ -386,5 +386,5 @@ export function PlanComparisonPage({ heading, subtitle, variant = 'app', theme =
|
|
|
386
386
|
isCurrentPlan: false
|
|
387
387
|
});
|
|
388
388
|
}, disabled: !planVersionId || !planSelectionEnabled, children: hasMultipleBillingOptions ? 'Start Yearly' : 'Get Started' })) : null] }))] }, plan.planId));
|
|
389
|
-
}) }), _jsxs("div", { className: styles.pricingNotes, children: [_jsx("p", { children: "Prices are listed in USD. Taxes may apply." }), _jsx("p", { children: "Local install is free on every plan. Cloud limits apply only to hosted workspaces." })] }), _jsxs("section", { className: `${styles.foundingBeta} ${styles.cloudCapacityNote}`, "aria-labelledby": "cloud-capacity-heading", children: [_jsx("h2", { id: "cloud-capacity-heading", children: "Need more cloud capacity?" }), _jsx("p", { children: "Pro users can request expanded limits for cloud workspaces, AI agents, and storage." })] }), _jsxs("div", { className: `${styles.planCard} ${styles.planNoticeCard} ${styles.teamComingSoonCard}`, children: [_jsx("h2", { className: styles.planName, children: "Team workspaces are coming soon." }), _jsx("p", { className: styles.planDescription, children: "Shared workspaces, collaborators, team agent rosters, admin controls, and larger cloud limits are in development." })] })] }))] }) }) }));
|
|
389
|
+
}) }), _jsxs("div", { className: styles.pricingNotes, children: [_jsx("p", { children: "Prices are listed in USD. Taxes may apply." }), _jsx("p", { children: "Local install is free on every plan. Cloud limits apply only to hosted workspaces." })] }), _jsxs("section", { className: `${styles.foundingBeta} ${styles.cloudCapacityNote}`, "aria-labelledby": "cloud-capacity-heading", children: [_jsx("h2", { id: "cloud-capacity-heading", children: "Need more cloud capacity?" }), _jsx("p", { children: "Pro users can request expanded limits for cloud workspaces, AI agents, and storage." }), _jsxs("p", { children: ["Contact ", _jsx("a", { href: "mailto:support@taskforcehq.ai", children: "support@taskforcehq.ai" }), " to discuss capacity needs."] })] }), _jsxs("div", { className: `${styles.planCard} ${styles.planNoticeCard} ${styles.teamComingSoonCard}`, children: [_jsx("h2", { className: styles.planName, children: "Team workspaces are coming soon." }), _jsx("p", { className: styles.planDescription, children: "Shared workspaces, collaborators, team agent rosters, admin controls, and larger cloud limits are in development." })] })] }))] }) }) }));
|
|
390
390
|
}
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
2
2
|
import React, { useMemo, useCallback, useState, useEffect, useRef, Suspense } from 'react';
|
|
3
3
|
import { createPortal } from 'react-dom';
|
|
4
4
|
import { useLocation, useNavigate } from 'react-router-dom';
|
|
5
|
-
import { Settings, Plus, Filter, Layers, User, Maximize2, Minimize2, Check, ChevronLeft, ArrowUp, ArrowDown, ArrowUpDown, AlertTriangle, Save, Loader2, Folder, FileText, LogOut, NotebookTabs, ClipboardCheck, Cloud, CloudOff, Users, ClockAlert, ChevronsUp, ChevronsDown, EyeOff, Zap, HelpCircle, Bot, Image, Workflow, Plug } from 'lucide-react';
|
|
5
|
+
import { Settings, Plus, Filter, Layers, User, Maximize2, Minimize2, Check, ChevronLeft, ArrowUp, ArrowDown, ArrowUpDown, AlertTriangle, Save, Loader2, Folder, FileText, LogOut, NotebookTabs, ClipboardCheck, Cloud, CloudOff, Users, ClockAlert, Mail, ChevronsUp, ChevronsDown, EyeOff, Zap, HelpCircle, Bot, Image, Workflow, Plug } from 'lucide-react';
|
|
6
6
|
import { STATUS_OPTIONS, getStatusDefinition } from '../../utils/constants';
|
|
7
7
|
import styles from '../../Taskforce.module.css';
|
|
8
8
|
import shellStyles from './WorkspaceShell.module.css';
|
|
@@ -41,6 +41,7 @@ import { resolveAnnotatedAttachmentDetail } from '../../utils/annotatedAttachmen
|
|
|
41
41
|
import { ACCOUNT_PROFILE_SUMMARY_PATH, invalidateAccountProfileSummaryCache, loadAccountProfileSummaryCached } from '../../utils/accountProfileSummaryCache';
|
|
42
42
|
import { prepareAvatarUploadFile } from '../../utils/avatarUpload';
|
|
43
43
|
import { resolveCommercialLifecyclePresentation } from '../../utils/commercialLifecyclePresentation';
|
|
44
|
+
import { buildSupportMailtoHref } from '../../utils/supportContact';
|
|
44
45
|
import { AppShellHeader } from './AppShellHeader';
|
|
45
46
|
import { getTaskforceCloudEnvironmentConfig, parseTaskforceCloudEnvironment, resolveTaskforceCloudEnvironmentFromBaseUrl } from '../../config/cloudEnvironment';
|
|
46
47
|
import { logBootstrapDebug, persistRemoteUiState } from '../../hooks/workspace/workspaceLocalState';
|
|
@@ -1382,6 +1383,12 @@ export function StandaloneLayout(props) {
|
|
|
1382
1383
|
const authIdentityLabel = authDisplayName || authEmailLabel;
|
|
1383
1384
|
const hasAuthIdentity = authIdentityLabel.length > 0;
|
|
1384
1385
|
const hasAuthEmail = authEmailLabel.length > 0;
|
|
1386
|
+
const supportMailtoHref = useMemo(() => buildSupportMailtoHref({
|
|
1387
|
+
workspaceName: currentWorkspaceLabel,
|
|
1388
|
+
workspaceId: currentWorkspaceId,
|
|
1389
|
+
accountLabel: authIdentityLabel || authEmailLabel,
|
|
1390
|
+
runtimeMode
|
|
1391
|
+
}), [authEmailLabel, authIdentityLabel, currentWorkspaceId, currentWorkspaceLabel, runtimeMode]);
|
|
1385
1392
|
const accountBadgeLabel = (authIdentityLabel || authEmailLabel || '').trim();
|
|
1386
1393
|
const shouldShowResolvedAccountInitial = isAuthenticated && authSessionResolved && accountBadgeLabel.length > 0;
|
|
1387
1394
|
const accountBadgeInitial = shouldShowResolvedAccountInitial ? accountBadgeLabel.charAt(0).toUpperCase() : '';
|
|
@@ -2428,7 +2435,10 @@ export function StandaloneLayout(props) {
|
|
|
2428
2435
|
}, role: "menuitem", children: [_jsx(User, { size: 15 }), "Account Hub"] }), _jsxs("button", { className: accountStyles.accountMenuItem, onClick: () => {
|
|
2429
2436
|
setShowAccountMenu(false);
|
|
2430
2437
|
setShowHelpModal(true);
|
|
2431
|
-
}, role: "menuitem", children: [_jsx(HelpCircle, { size: 15 }), "Help &
|
|
2438
|
+
}, role: "menuitem", children: [_jsx(HelpCircle, { size: 15 }), "Help & Support"] }), _jsxs("button", { className: accountStyles.accountMenuItem, onClick: () => {
|
|
2439
|
+
setShowAccountMenu(false);
|
|
2440
|
+
setShowHelpModal(true);
|
|
2441
|
+
}, role: "menuitem", children: [_jsx(Mail, { size: 15 }), "Contact Support"] }), runtimeMode === 'local' && !isAuthenticated && !isAuthBootstrapPending && (_jsxs("button", { className: accountStyles.accountMenuItem, onClick: () => {
|
|
2432
2442
|
openSharedLoginRoute('login');
|
|
2433
2443
|
}, role: "menuitem", children: [_jsx(User, { size: 15 }), "Sign In / Register"] })), isAuthenticated && (_jsxs("button", { className: accountStyles.accountMenuItem, onClick: async () => {
|
|
2434
2444
|
setShowAccountMenu(false);
|
|
@@ -2944,12 +2954,12 @@ export function StandaloneLayout(props) {
|
|
|
2944
2954
|
...buildCustomTaxonomySortOptions(taxonomies, [...props.searchAgnosticTasks, ...archivedScopeAllTasks])
|
|
2945
2955
|
], [archivedScopeAllTasks, props.searchAgnosticTasks, taxonomies]);
|
|
2946
2956
|
const groupingOptions = useMemo(() => [
|
|
2957
|
+
{ value: 'status', label: t('standalone.groupStatus') },
|
|
2947
2958
|
{ value: 'category', label: t('standalone.groupCategory') },
|
|
2948
2959
|
{ value: 'type', label: t('standalone.groupType') },
|
|
2949
2960
|
{ value: 'priority', label: t('standalone.groupPriority') },
|
|
2950
2961
|
{ value: 'complexity', label: t('standalone.groupComplexity') },
|
|
2951
2962
|
{ value: 'assignee', label: t('standalone.groupAssignee') },
|
|
2952
|
-
{ value: 'status', label: t('standalone.groupStatus') },
|
|
2953
2963
|
{ value: 'schedule', label: t('standalone.groupSchedule') },
|
|
2954
2964
|
], []);
|
|
2955
2965
|
const workspaceToolModules = useMemo(() => workspaceModules.filter((module) => module.enabled), [workspaceModules]);
|
|
@@ -3315,10 +3325,14 @@ export function StandaloneLayout(props) {
|
|
|
3315
3325
|
}, currentTask: currentTask })] }), _jsx(Modal, { isOpen: activeTab === 'settings', onClose: handleCloseModal, title: "Settings", size: "xl", theme: currentTheme, draggable: true, isSettings: true, closeOnOverlayClick: false, children: _jsx(Suspense, { fallback: _jsx("div", { style: { display: 'flex', alignItems: 'center', justifyContent: 'center', padding: '2rem' }, children: _jsx(Loader2, { size: 20, className: styles.spinner }) }), children: _jsx(TaskSettings, { settingsModel: {
|
|
3316
3326
|
...settingsModel,
|
|
3317
3327
|
onOpenCloudAuth: openSharedLoginRoute
|
|
3318
|
-
}, onSectionChange: setSettingsSection }) }) }), _jsx(ScheduleWarningModal, { prompt: scheduleWarningPrompt, theme: currentTheme, onClose: cancelScheduleWarning, onConfirm: confirmScheduleWarning }), _jsx(SyncEnableWarningModal, { isOpen: showSyncEnableWarning, theme: currentTheme, onClose: cancelSyncEnableWarning, onConfirm: confirmSyncEnableWarning }), _jsx(HelpModal, { isOpen: showHelpModal, theme: currentTheme, onClose: () => setShowHelpModal(false), onOpenSettings: () => {
|
|
3328
|
+
}, onSectionChange: setSettingsSection }) }) }), _jsx(ScheduleWarningModal, { prompt: scheduleWarningPrompt, theme: currentTheme, onClose: cancelScheduleWarning, onConfirm: confirmScheduleWarning }), _jsx(SyncEnableWarningModal, { isOpen: showSyncEnableWarning, theme: currentTheme, onClose: cancelSyncEnableWarning, onConfirm: confirmSyncEnableWarning }), _jsx(HelpModal, { isOpen: showHelpModal, theme: currentTheme, onClose: () => setShowHelpModal(false), supportMailtoHref: supportMailtoHref, onOpenSettings: () => {
|
|
3319
3329
|
setShowHelpModal(false);
|
|
3320
3330
|
setActiveTab('settings');
|
|
3321
3331
|
setSettingsSection('general');
|
|
3332
|
+
}, onOpenAccountHub: () => {
|
|
3333
|
+
setShowHelpModal(false);
|
|
3334
|
+
startAccountSurfaceTiming('account_hub');
|
|
3335
|
+
setShowAccountHub(true);
|
|
3322
3336
|
} }), _jsx(EditProfileModal, { isOpen: showEditProfileModal, theme: currentTheme, onClose: closeEditProfileModal, onSave: () => { void handleSaveProfile(); }, displayName: profileDisplayNameDraft, email: authEmailLabel, avatarDisplayUrl: profileAvatarDisplayUrl, accountBadgeInitial: accountBadgeInitial, saveBusy: profileSaveBusy, avatarBusy: profileAvatarBusy, saveError: profileSaveError, saveNotice: profileSaveNotice, onDisplayNameChange: setProfileDisplayNameDraft, onOpenAvatarManager: () => {
|
|
3323
3337
|
setProfileSaveError(null);
|
|
3324
3338
|
setProfileSaveNotice(null);
|
|
@@ -7,6 +7,7 @@ import styles from '../../../Taskforce.module.css';
|
|
|
7
7
|
import panelStyles from './PlanningDrawer.module.css';
|
|
8
8
|
import { ReferenceBadgeButton } from '../../ui/ReferenceBadgeButton';
|
|
9
9
|
import { HierarchyActionBadge } from '../../ui/HierarchyActionBadge';
|
|
10
|
+
import { DisclosureSectionHeader } from '../../ui/DisclosureSectionHeader';
|
|
10
11
|
import { IconMap, getStatusDefinition, resolveColor } from '../../../utils/constants';
|
|
11
12
|
import { formatInitiativeReference, formatWorkstreamReference, } from '../../../utils/planningReferences.js';
|
|
12
13
|
import { getEntityActivityItems } from '../../../utils/taskActivity';
|
|
@@ -363,7 +364,7 @@ function PlanningDrawerDetailView({ detail, currentWorkspaceId, onOpenNestedWork
|
|
|
363
364
|
event.preventDefault();
|
|
364
365
|
handleOpenTask();
|
|
365
366
|
}, children: [_jsx("span", { className: panelStyles.listItemTitle, children: task.title }), _jsx("span", { className: panelStyles.listItemMeta, children: taskMeta })] })] }) }, task.id));
|
|
366
|
-
}) : (_jsxs("div", { className: panelStyles.sectionNote, children: ["No tasks are linked to this workstream yet. Use the ", _jsx("code", { children: "+" }), " action above to add the first one."] })))] }), _jsx("div", { className: panelStyles.listCard, children: _jsx(React.Suspense, { fallback: _jsx(DeferredPlanningPanelFallback, {}), children: _jsx(DeferredContextAttachmentManager, { ownerType: detail.type, ownerId: detail.item.id, ownerReferenceLabel: detailReferenceLabel, workspaceId: currentWorkspaceId, attachments: detail.item.attachments || [], onAddAttachment: (file) => onAddPlanningContextFile?.(detail.type, detail.item.id, file), onRemoveAttachment: (index) => onRemovePlanningContextFile?.(detail.type, detail.item.id, index), onUpdateAttachmentCaption: (index, caption) => (onUpdatePlanningContextCaption?.(detail.type, detail.item.id, index, caption)) }) }) }), _jsxs("div", { className: panelStyles.listCard, children: [
|
|
367
|
+
}) : (_jsxs("div", { className: panelStyles.sectionNote, children: ["No tasks are linked to this workstream yet. Use the ", _jsx("code", { children: "+" }), " action above to add the first one."] })))] }), _jsx("div", { className: panelStyles.listCard, children: _jsx(React.Suspense, { fallback: _jsx(DeferredPlanningPanelFallback, {}), children: _jsx(DeferredContextAttachmentManager, { ownerType: detail.type, ownerId: detail.item.id, ownerReferenceLabel: detailReferenceLabel, workspaceId: currentWorkspaceId, attachments: detail.item.attachments || [], onAddAttachment: (file) => onAddPlanningContextFile?.(detail.type, detail.item.id, file), onRemoveAttachment: (index) => onRemovePlanningContextFile?.(detail.type, detail.item.id, index), onUpdateAttachmentCaption: (index, caption) => (onUpdatePlanningContextCaption?.(detail.type, detail.item.id, index, caption)) }) }) }), _jsxs("div", { className: panelStyles.listCard, children: [_jsx(DisclosureSectionHeader, { label: "Recent Activity", count: activityCount, showZeroCount: true, expanded: showRecentActivity, expandedTitle: "Hide recent activity", collapsedTitle: "Show recent activity", onToggle: () => setShowRecentActivity((current) => !current) }), showRecentActivity ? (_jsx(React.Suspense, { fallback: _jsx(DeferredPlanningPanelFallback, {}), children: _jsx(DeferredEntityActivityTimeline, { activity: detail.item.activity, comments: detail.item.comments, formatFieldValue: formatActivityFieldValue, resolveActorPresentation: resolveActivityActorPresentation, onOpenTaskById: onOpenTaskById, emptyMessage: `No ${detail.type} activity yet.`, listClassName: panelStyles.activityTimelineList, emptyClassName: panelStyles.activityTimelineEmpty }) })) : null] })] }));
|
|
367
368
|
}
|
|
368
369
|
function PlanningDrawerEditor({ editor, draftTitle, draftDescription, draftOwner, draftInitiativeId, assigneeOptions, draftInitiativeSummary, onChangeDraftTitle, onChangeDraftDescription, onChangeDraftOwner, onChangeDraftInitiativeId, onCancel, onSubmit, isSubmitting, onAssignInitiativeToWorkstream, }) {
|
|
369
370
|
const entityLabel = editor.entityType === 'initiative' ? 'Initiative' : 'Workstream';
|
|
@@ -104,5 +104,5 @@ export function AccountHubModal({ isOpen, theme, runtimeMode, authRequiredForApi
|
|
|
104
104
|
? (workspaceCloudSyncEnabled
|
|
105
105
|
? `Enabled · ${syncStatusLabel}`
|
|
106
106
|
: 'Disabled')
|
|
107
|
-
: 'Sign in to cloud account to enable workspace sync.' }), workspaceSyncError && (_jsx("p", { className: `${authStyles.loginError} ${managementStyles.errorText}`, children: workspaceSyncError })), _jsx("div", { className: managementStyles.actionRowEnd, children: _jsx("button", { className: styles.cancelBtn, disabled: !canManageWorkspaceSync || syncControlBusy, onClick: () => onToggleWorkspaceSync(!workspaceCloudSyncEnabled), children: workspaceCloudSyncEnabled ? 'Disable Sync' : 'Enable Sync' }) })] }), _jsxs("div", { className: `${modalStyles.formActions} ${managementStyles.modalActionsEnd}`, children: [_jsx("button", { className: styles.cancelBtn, onClick: onOpenHelp, children: "Help &
|
|
107
|
+
: 'Sign in to cloud account to enable workspace sync.' }), workspaceSyncError && (_jsx("p", { className: `${authStyles.loginError} ${managementStyles.errorText}`, children: workspaceSyncError })), _jsx("div", { className: managementStyles.actionRowEnd, children: _jsx("button", { className: styles.cancelBtn, disabled: !canManageWorkspaceSync || syncControlBusy, onClick: () => onToggleWorkspaceSync(!workspaceCloudSyncEnabled), children: workspaceCloudSyncEnabled ? 'Disable Sync' : 'Enable Sync' }) })] }), _jsxs("div", { className: `${modalStyles.formActions} ${managementStyles.modalActionsEnd}`, children: [_jsx("button", { className: styles.cancelBtn, onClick: onOpenHelp, children: "Help & Support" }), _jsx("button", { className: styles.submitBtn, onClick: onClose, children: "Close" })] })] }) }));
|
|
108
108
|
}
|
|
@@ -4,6 +4,8 @@ interface HelpModalProps {
|
|
|
4
4
|
theme: ModalThemeName;
|
|
5
5
|
onClose: () => void;
|
|
6
6
|
onOpenSettings: () => void;
|
|
7
|
+
onOpenAccountHub?: () => void;
|
|
8
|
+
supportMailtoHref: string;
|
|
7
9
|
}
|
|
8
|
-
export declare function HelpModal({ isOpen, theme, onClose, onOpenSettings, }: HelpModalProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export declare function HelpModal({ isOpen, theme, onClose, onOpenSettings, onOpenAccountHub, supportMailtoHref, }: HelpModalProps): import("react/jsx-runtime").JSX.Element;
|
|
9
11
|
export {};
|
|
@@ -1,8 +1,23 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { Check, Copy, Mail, Settings, UserCircle, Wrench } from 'lucide-react';
|
|
2
4
|
import { Modal } from '../../../ui/Modal';
|
|
3
5
|
import modalStyles from '../../../ui/Modal.module.css';
|
|
4
6
|
import managementStyles from '../../StandaloneManagement.module.css';
|
|
5
7
|
import styles from '../../../../Taskforce.module.css';
|
|
6
|
-
|
|
7
|
-
|
|
8
|
+
import { TASKFORCE_SUPPORT_EMAIL } from '../../../../utils/supportContact';
|
|
9
|
+
export function HelpModal({ isOpen, theme, onClose, onOpenSettings, onOpenAccountHub, supportMailtoHref, }) {
|
|
10
|
+
const [copyStatus, setCopyStatus] = useState('idle');
|
|
11
|
+
const handleCopyEmail = async () => {
|
|
12
|
+
try {
|
|
13
|
+
await navigator.clipboard.writeText(TASKFORCE_SUPPORT_EMAIL);
|
|
14
|
+
setCopyStatus('copied');
|
|
15
|
+
window.setTimeout(() => setCopyStatus('idle'), 1600);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
setCopyStatus('failed');
|
|
19
|
+
window.setTimeout(() => setCopyStatus('idle'), 2200);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
return (_jsx(Modal, { isOpen: isOpen, onClose: onClose, title: "Help & Support", size: "md", theme: theme, draggable: true, children: _jsxs("div", { className: `${modalStyles.form} ${managementStyles.modalBody}`, children: [_jsxs("div", { className: managementStyles.helpIntro, children: [_jsx("p", { className: "tf-text-body", children: "Need a hand with Taskforce? Send us what you were trying to do, what happened, and any workspace context that would help us reproduce it." }), _jsxs("div", { className: managementStyles.supportEmailRow, children: [_jsx("code", { className: managementStyles.supportEmailAddress, children: TASKFORCE_SUPPORT_EMAIL }), _jsxs("button", { className: `${styles.submitBtn} ${managementStyles.supportEmailBtn}`, onClick: () => { void handleCopyEmail(); }, type: "button", children: [copyStatus === 'copied' ? _jsx(Check, { size: 16 }) : _jsx(Copy, { size: 16 }), copyStatus === 'copied' ? 'Copied' : copyStatus === 'failed' ? 'Copy Failed' : 'Copy Email'] })] }), _jsxs("a", { className: `${styles.cancelBtn} ${managementStyles.supportEmailBtn}`, href: supportMailtoHref, children: [_jsx(Mail, { size: 16 }), "Open Email App"] })] }), _jsxs("div", { className: `${managementStyles.supportPanel} tf-surface-panel`, children: [_jsxs("div", { className: managementStyles.supportPanelHeader, children: [_jsx(Wrench, { size: 16 }), _jsxs("div", { children: [_jsx("h3", { className: "tf-heading-card", children: "Before you email" }), _jsx("p", { className: "tf-text-secondary", children: "These are the fastest places to check for common workspace, account, and setup issues." })] })] }), _jsxs("div", { className: managementStyles.supportRouteList, children: [_jsxs("button", { className: `${styles.cancelBtn} ${managementStyles.supportRouteBtn}`, onClick: onOpenSettings, children: [_jsx(Settings, { size: 15 }), "Open Settings"] }), onOpenAccountHub && (_jsxs("button", { className: `${styles.cancelBtn} ${managementStyles.supportRouteBtn}`, onClick: onOpenAccountHub, children: [_jsx(UserCircle, { size: 15 }), "Open Account Hub"] }))] })] }), _jsx("div", { className: `${modalStyles.formActions} ${managementStyles.modalActionsEnd}`, children: _jsx("button", { className: styles.cancelBtn, onClick: onClose, children: "Close" }) })] }) }));
|
|
8
23
|
}
|
|
@@ -36,6 +36,7 @@ export declare class PlanEntitlementService {
|
|
|
36
36
|
private readPlanVersionTrialDays;
|
|
37
37
|
private applyPlanVersionTrialDaysMetadata;
|
|
38
38
|
private sanitizePlanFeatureConfig;
|
|
39
|
+
private hydratePlanFeatureConfig;
|
|
39
40
|
private isEntitlementStateAllowed;
|
|
40
41
|
private isIsoTimestampExpired;
|
|
41
42
|
private readAccountEntitlementRow;
|
|
@@ -50,6 +51,7 @@ export declare class PlanEntitlementService {
|
|
|
50
51
|
normalizeLegacyPlanDataIfNeeded(): void;
|
|
51
52
|
private renameLegacyWorkspacesFeatureKey;
|
|
52
53
|
private removeLegacyPlanFeatureRows;
|
|
54
|
+
private hydrateMissingPlanFeatureTemplateConfigs;
|
|
53
55
|
private migrateLegacySeatLimitFeatureConfigToVersionSeatLimit;
|
|
54
56
|
private normalizeLegacyBillingMirrorRows;
|
|
55
57
|
backfillAccountEntitlements(): void;
|