@taskforcehq/taskforce 0.3.305 → 0.3.307
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 +0 -2
- package/dist/Taskforce.module.css +603 -107
- package/dist/TaskforceCore.js +216 -43
- package/dist/TaskforceCore.test.js +611 -28
- package/dist/assets/fonts/CourierPrime-Bold.woff2 +0 -0
- package/dist/assets/fonts/CourierPrime-BoldItalic.woff2 +0 -0
- package/dist/assets/fonts/CourierPrime-Italic.woff2 +0 -0
- package/dist/assets/fonts/CourierPrime-Regular.woff2 +0 -0
- package/dist/assets/fonts/Noir_medium.woff2 +0 -0
- package/dist/assets/fonts/Noir_regular.woff2 +0 -0
- package/dist/assets/fonts/RussoOne-Regular.woff2 +0 -0
- package/dist/assets/fonts/SpecialElite-Regular.woff2 +0 -0
- package/dist/compat/workspaceSyncCompat.js +46 -2
- package/dist/compat/workspaceSyncCompat.test.js +38 -1
- package/dist/components/activity/EntityActivityTimeline.d.ts +34 -0
- package/dist/components/activity/EntityActivityTimeline.js +81 -0
- package/dist/components/context/ContextAttachmentManager.d.ts +14 -0
- package/dist/components/context/ContextAttachmentManager.js +561 -0
- package/dist/components/features/AgentsModule.d.ts +14 -1
- package/dist/components/features/AgentsModule.js +366 -18
- package/dist/components/features/AgentsModule.test.js +507 -8
- package/dist/components/features/AnnotatedAttachmentWorkspace.d.ts +3 -1
- package/dist/components/features/AnnotatedAttachmentWorkspace.js +118 -4
- package/dist/components/features/AnnotatedAttachmentWorkspace.test.js +52 -0
- package/dist/components/features/DocumentIndex.d.ts +2 -2
- package/dist/components/features/DocumentIndex.js +3 -4
- package/dist/components/features/DocumentViewer.d.ts +7 -1
- package/dist/components/features/DocumentViewer.js +62 -4
- package/dist/components/features/DocumentWorkspace.d.ts +10 -2
- package/dist/components/features/DocumentWorkspace.js +15 -4
- package/dist/components/features/DocumentWorkspace.test.js +51 -1
- package/dist/components/features/TaskSettings.d.ts +2 -0
- package/dist/components/features/TaskSettings.js +83 -78
- package/dist/components/features/TaskSettings.test.js +171 -82
- package/dist/components/features/documentWorkspaceModel.d.ts +1 -1
- package/dist/components/task/TaskActionHeader.js +11 -5
- package/dist/components/task/TaskActionHeader.test.js +10 -0
- package/dist/components/task/TaskCard.js +24 -29
- package/dist/components/task/TaskCard.test.js +38 -3
- package/dist/components/task/TaskContextUpload.js +4 -526
- package/dist/components/task/TaskContextUpload.test.js +3 -3
- package/dist/components/task/TaskForm.js +61 -116
- package/dist/components/task/TaskForm.test.js +110 -8
- package/dist/components/task/TaskKanban.d.ts +2 -1
- package/dist/components/task/TaskKanban.js +94 -21
- package/dist/components/task/TaskKanban.test.js +36 -0
- package/dist/components/task/TaskList.js +5 -1
- package/dist/components/task/TaskList.test.js +4 -0
- package/dist/components/ui/EditableAvatarButton.d.ts +18 -0
- package/dist/components/ui/EditableAvatarButton.js +18 -0
- package/dist/components/ui/HierarchyActionBadge.d.ts +10 -0
- package/dist/components/ui/HierarchyActionBadge.js +5 -0
- package/dist/components/views/AppShellHeader.d.ts +3 -1
- package/dist/components/views/AppShellHeader.js +27 -11
- package/dist/components/views/AppShellHeader.test.js +18 -1
- package/dist/components/views/PlanComparisonPage.d.ts +9 -1
- package/dist/components/views/PlanComparisonPage.js +78 -14
- package/dist/components/views/PlanComparisonPage.test.js +257 -0
- package/dist/components/views/PlansPage.js +127 -36
- package/dist/components/views/PlansPage.test.js +294 -12
- package/dist/components/views/StandaloneLayout.js +529 -592
- package/dist/components/views/WidgetView.js +10 -8
- package/dist/components/views/panels/PlanningDrawer.d.ts +25 -5
- package/dist/components/views/panels/PlanningDrawer.js +270 -55
- package/dist/components/views/panels/PlanningDrawer.test.d.ts +1 -0
- package/dist/components/views/panels/PlanningDrawer.test.js +529 -0
- package/dist/components/views/planningScope.d.ts +20 -0
- package/dist/components/views/planningScope.js +25 -0
- package/dist/components/views/planningScope.test.d.ts +1 -0
- package/dist/components/views/planningScope.test.js +60 -0
- package/dist/components/views/standalone/modals/AccountHubModal.d.ts +26 -1
- package/dist/components/views/standalone/modals/AccountHubModal.js +76 -2
- package/dist/components/views/standalone/modals/AccountHubModal.test.js +20 -3
- package/dist/components/views/standalone/modals/AvatarImageManagerModal.d.ts +20 -0
- package/dist/components/views/standalone/modals/AvatarImageManagerModal.js +127 -0
- package/dist/components/views/standalone/modals/EditProfileModal.d.ts +2 -9
- package/dist/components/views/standalone/modals/EditProfileModal.js +3 -2
- package/dist/components/views/standalone/modals/SyncEnableWarningModal.d.ts +9 -0
- package/dist/components/views/standalone/modals/SyncEnableWarningModal.js +6 -0
- package/dist/components/views/standalone/modals/SyncEnableWarningModal.test.d.ts +1 -0
- package/dist/components/views/standalone/modals/SyncEnableWarningModal.test.js +24 -0
- package/dist/components/views/standalone/modals/SyncStatusModal.d.ts +2 -1
- package/dist/components/views/standalone/modals/SyncStatusModal.js +2 -2
- package/dist/config/envSchema.js +1 -0
- package/dist/core/AiProfileService.d.ts +46 -2
- package/dist/core/AiProfileService.js +1073 -82
- package/dist/core/AiProfileService.test.js +19 -1
- package/dist/core/AiProfiles.test.js +1249 -44
- package/dist/core/AttachmentLinkService.d.ts +3 -0
- package/dist/core/AttachmentLinkService.js +110 -23
- package/dist/core/AuthIdentityService.d.ts +107 -0
- package/dist/core/AuthIdentityService.js +284 -0
- package/dist/core/AuthTokenService.d.ts +4 -0
- package/dist/core/AuthTokenService.js +34 -6
- package/dist/core/AuthTokenService.test.js +3 -3
- package/dist/core/EntitlementsPolicy.test.js +2 -2
- package/dist/core/GlobalSettingsService.js +127 -6
- package/dist/core/McpTokenService.d.ts +12 -0
- package/dist/core/McpTokenService.js +44 -1
- package/dist/core/PlanEntitlementService.d.ts +23 -2
- package/dist/core/PlanEntitlementService.js +343 -57
- package/dist/core/PlanFeatureCatalog.test.d.ts +1 -0
- package/dist/core/PlanFeatureCatalog.test.js +84 -0
- package/dist/core/PlanVersionPolicy.test.js +35 -2
- package/dist/core/PlanningEntities.test.js +418 -4
- package/dist/core/SignupMonetizationSettings.test.js +199 -27
- package/dist/core/SyncReconciliationService.js +2 -65
- package/dist/core/SystemAdmin.test.js +42 -42
- package/dist/core/TaskActivityService.d.ts +28 -1
- package/dist/core/TaskActivityService.js +227 -46
- package/dist/core/TaskActivitySync.test.d.ts +1 -0
- package/dist/core/TaskActivitySync.test.js +90 -0
- package/dist/core/TaskAttachmentsCanonical.test.js +51 -1
- package/dist/core/TaskAuditTimeline.test.js +96 -0
- package/dist/core/Taskforce.d.ts +415 -40
- package/dist/core/Taskforce.ids.test.js +58 -0
- package/dist/core/Taskforce.js +1543 -266
- package/dist/core/Taskforce.listTasksSlim.test.d.ts +1 -0
- package/dist/core/Taskforce.listTasksSlim.test.js +91 -0
- package/dist/core/Taskforce.mcpAuth.test.js +109 -0
- package/dist/core/UserProfileAvatarDrafts.test.js +30 -3
- package/dist/core/WorkspaceLifecycleService.js +0 -5
- package/dist/core/WorkspacePermissions.test.js +25 -1
- package/dist/core/WorkspacePlanMode.test.js +117 -16
- package/dist/core/shared.d.ts +1 -1
- package/dist/core/shared.js +5 -1
- package/dist/core/types.d.ts +75 -2
- package/dist/hooks/auth/useTaskforceAuthBootstrap.js +28 -2
- package/dist/hooks/bootstrapTimeouts.d.ts +4 -0
- package/dist/hooks/bootstrapTimeouts.js +8 -0
- package/dist/hooks/bootstrapTimeouts.test.d.ts +1 -0
- package/dist/hooks/bootstrapTimeouts.test.js +12 -0
- package/dist/hooks/sync/bootstrap.js +2 -0
- package/dist/hooks/sync/controlPlane.d.ts +37 -0
- package/dist/hooks/sync/controlPlane.js +78 -0
- package/dist/hooks/sync/controlPlane.test.d.ts +1 -0
- package/dist/hooks/sync/controlPlane.test.js +121 -0
- package/dist/hooks/sync/lifecyclePolicy.d.ts +45 -0
- package/dist/hooks/sync/lifecyclePolicy.js +93 -0
- package/dist/hooks/sync/lifecyclePolicy.test.d.ts +1 -0
- package/dist/hooks/sync/lifecyclePolicy.test.js +124 -0
- package/dist/hooks/sync/orchestratorShared.d.ts +13 -4
- package/dist/hooks/sync/orchestratorShared.js +129 -48
- package/dist/hooks/sync/orchestratorShared.test.js +50 -1
- package/dist/hooks/sync/pullLifecycle.d.ts +31 -0
- package/dist/hooks/sync/pullLifecycle.js +24 -0
- package/dist/hooks/sync/pullLifecycle.test.d.ts +1 -0
- package/dist/hooks/sync/pullLifecycle.test.js +80 -0
- package/dist/hooks/sync/recovery.d.ts +16 -2
- package/dist/hooks/sync/recovery.js +179 -53
- package/dist/hooks/sync/recovery.test.d.ts +1 -0
- package/dist/hooks/sync/recovery.test.js +292 -0
- package/dist/hooks/sync/transfers.d.ts +16 -3
- package/dist/hooks/sync/transfers.js +210 -66
- package/dist/hooks/sync/transfers.test.d.ts +1 -0
- package/dist/hooks/sync/transfers.test.js +928 -0
- package/dist/hooks/sync/useRecentSyncEvents.d.ts +21 -0
- package/dist/hooks/sync/useRecentSyncEvents.js +92 -0
- package/dist/hooks/sync/useRecentSyncEvents.test.d.ts +1 -0
- package/dist/hooks/sync/useRecentSyncEvents.test.js +124 -0
- package/dist/hooks/sync/useSyncStatusActions.d.ts +30 -0
- package/dist/hooks/sync/useSyncStatusActions.js +88 -0
- package/dist/hooks/sync/useSyncStatusActions.test.d.ts +1 -0
- package/dist/hooks/sync/useSyncStatusActions.test.js +133 -0
- package/dist/hooks/sync/useSyncStatusControls.d.ts +25 -0
- package/dist/hooks/sync/useSyncStatusControls.js +60 -0
- package/dist/hooks/sync/useSyncStatusControls.test.d.ts +1 -0
- package/dist/hooks/sync/useSyncStatusControls.test.js +88 -0
- package/dist/hooks/useFilterSort.js +13 -13
- package/dist/hooks/useFilterSort.test.js +87 -1
- package/dist/hooks/useSyncOrchestrator.aiProfiles.test.js +12 -0
- package/dist/hooks/useSyncOrchestrator.d.ts +9 -2
- package/dist/hooks/useSyncOrchestrator.js +409 -183
- package/dist/hooks/useSyncOrchestrator.retry-closure.test.js +407 -0
- package/dist/hooks/useTaskData.js +8 -3
- package/dist/hooks/useTaskData.test.js +45 -0
- package/dist/hooks/useTaskforce.d.ts +145 -52
- package/dist/hooks/useTaskforce.js +592 -253
- package/dist/hooks/useTaskforce.runtime-routing.test.d.ts +1 -0
- package/dist/hooks/useTaskforce.runtime-routing.test.js +246 -0
- package/dist/hooks/useTaskforce.sync-behavior.test.js +2468 -201
- package/dist/hooks/useWorkspaceSyncController.d.ts +1 -0
- package/dist/hooks/useWorkspaceSyncController.js +13 -2
- package/dist/hooks/useWorkspaceSyncController.test.js +48 -0
- package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.d.ts +16 -0
- package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.js +328 -40
- package/dist/localization/locales/en-US.d.ts +0 -1
- package/dist/localization/locales/en-US.js +0 -1
- package/dist/localization/locales/es-419.js +0 -1
- package/dist/localization/locales/pt-BR.js +0 -1
- package/dist/mcp/canonicalAssetHelpers.d.ts +16 -4
- package/dist/mcp/canonicalAssetHelpers.js +18 -10
- package/dist/mcp/canonicalAssetHelpers.test.d.ts +1 -0
- package/dist/mcp/canonicalAssetHelpers.test.js +67 -0
- package/dist/mcp/clientIntegrations.d.ts +1 -0
- package/dist/mcp/clientIntegrations.js +25 -0
- package/dist/mcp/clientIntegrations.test.js +14 -3
- package/dist/mcp/clientProfileDefaults.js +3 -3
- package/dist/mcp/collaborationRegistrar.js +7 -7
- package/dist/mcp/documentAssetRegistrar.js +116 -10
- package/dist/mcp/runtime.d.ts +3 -0
- package/dist/mcp/runtime.js +1099 -185
- package/dist/mcp/runtime.test.js +1491 -140
- package/dist/mcp/taskAttachmentTypes.d.ts +1 -1
- package/dist/mcp/taskPlanningRegistrar.js +48 -0
- package/dist/mcp/toolRegistry.d.ts +56 -0
- package/dist/mcp/toolRegistry.js +8 -0
- package/dist/mcp/toolRegistry.test.js +4 -0
- package/dist/migrations/taskSchemaMigrations.d.ts +1 -1
- package/dist/migrations/taskSchemaMigrations.js +192 -61
- package/dist/migrations/taskSchemaMigrations.test.js +15 -0
- package/dist/resources/templates/workflow-sources/workflowDocs.mjs +6 -6
- package/dist/resources/templates/workflows/collaborate.yaml +1 -1
- package/dist/resources/templates/workflows/evaluate.yaml +2 -2
- package/dist/resources/templates/workflows/plan.yaml +1 -1
- package/dist/resources/templates/workflows/review.yaml +2 -2
- package/dist/server/aiProfileAvatarAssets.d.ts +49 -0
- package/dist/server/aiProfileAvatarAssets.js +319 -0
- package/dist/server/aiProfileAvatarAssets.test.d.ts +1 -0
- package/dist/server/aiProfileAvatarAssets.test.js +213 -0
- package/dist/server/annotatedAttachmentsRoutes.test.js +69 -10
- package/dist/server/auth/providers/apple.d.ts +33 -0
- package/dist/server/auth/providers/apple.js +82 -0
- package/dist/server/auth/providers/appleClientSecret.d.ts +37 -0
- package/dist/server/auth/providers/appleClientSecret.js +65 -0
- package/dist/server/auth/providers/github.d.ts +26 -0
- package/dist/server/auth/providers/github.js +86 -0
- package/dist/server/auth/providers/google.d.ts +21 -0
- package/dist/server/auth/providers/google.js +56 -0
- package/dist/server/auth/providers/types.d.ts +21 -0
- package/dist/server/auth/providers/types.js +1 -0
- package/dist/server/auth.d.ts +2 -0
- package/dist/server/auth.js +6 -3
- package/dist/server/documentReviewRoutes.test.js +36 -3
- package/dist/server/index.cookieProxy.test.js +1 -0
- package/dist/server/index.d.ts +12 -0
- package/dist/server/index.js +124 -9
- package/dist/server/index.rateLimit.test.js +3 -0
- package/dist/server/index.test.js +111 -3
- package/dist/server/routes/admin.d.ts +3 -0
- package/dist/server/routes/admin.js +459 -28
- package/dist/server/routes/annotatedAttachments.js +51 -0
- package/dist/server/routes/auth.d.ts +26 -2
- package/dist/server/routes/auth.js +1170 -71
- package/dist/server/routes/authSupport.d.ts +5 -1
- package/dist/server/routes/authSupport.js +13 -2
- package/dist/server/routes/billing.js +372 -35
- package/dist/server/routes/billing.test.js +595 -12
- package/dist/server/routes/documents.d.ts +1 -0
- package/dist/server/routes/documents.js +182 -70
- package/dist/server/routes/shared.d.ts +28 -2
- package/dist/server/routes/shared.js +69 -14
- package/dist/server/routes/sync.integration.test.js +658 -39
- package/dist/server/routes/sync.js +74 -608
- package/dist/server/routes/syncAuxRoutes.d.ts +15 -0
- package/dist/server/routes/syncAuxRoutes.js +91 -0
- package/dist/server/routes/syncAuxRoutes.test.d.ts +1 -0
- package/dist/server/routes/syncAuxRoutes.test.js +158 -0
- package/dist/server/routes/syncPullApplyRoutes.d.ts +36 -0
- package/dist/server/routes/syncPullApplyRoutes.js +204 -0
- package/dist/server/routes/syncPushRoutes.d.ts +24 -0
- package/dist/server/routes/syncPushRoutes.js +212 -0
- package/dist/server/routes/syncRouteGuards.d.ts +36 -0
- package/dist/server/routes/syncRouteGuards.js +67 -0
- package/dist/server/routes/syncRouteGuards.test.d.ts +1 -0
- package/dist/server/routes/syncRouteGuards.test.js +94 -0
- package/dist/server/routes/syncRouteTypes.d.ts +13 -0
- package/dist/server/routes/syncRouteTypes.js +1 -0
- package/dist/server/routes/syncSnapshotRoutes.d.ts +66 -0
- package/dist/server/routes/syncSnapshotRoutes.js +182 -0
- package/dist/server/routes/tasks.js +55 -10
- package/dist/server/routes/workspaces.js +36 -5
- package/dist/server/routes.js +147 -11
- package/dist/server/routes.test.js +2704 -183
- package/dist/services/workflowExportSnapshots.test.js +2 -0
- package/dist/shared/aiProfileSeatScope.d.ts +5 -0
- package/dist/shared/aiProfileSeatScope.js +21 -0
- package/dist/shared/aiProfileSurfaceType.d.ts +1 -1
- package/dist/shared/aiProfileSurfaceType.js +10 -8
- package/dist/shared/passwordPolicy.d.ts +13 -0
- package/dist/shared/passwordPolicy.js +84 -0
- package/dist/shared/passwordPolicy.test.d.ts +1 -0
- package/dist/shared/passwordPolicy.test.js +34 -0
- package/dist/storage/objectStorage.d.ts +1 -0
- package/dist/storage/objectStorage.js +2 -1
- package/dist/storage/objectStorageClient.d.ts +1 -0
- package/dist/storage/objectStorageClient.js +41 -8
- package/dist/storage/objectStorageClient.test.js +26 -1
- package/dist/storage/objectStorageConfig.js +3 -1
- package/dist/storage/objectStorageConfig.test.js +13 -1
- package/dist/storage/workspaceAssetStore.d.ts +15 -3
- package/dist/storage/workspaceAssetStore.js +132 -44
- package/dist/storage/workspaceAssetStore.test.js +93 -6
- package/dist/styles/fonts.css +70 -0
- package/dist/sync/collaborationSyncPayload.d.ts +6 -1
- package/dist/sync/collaborationSyncPayload.js +19 -11
- package/dist/sync/collaborationSyncPayload.test.js +14 -1
- package/dist/sync/collaborationSyncState.d.ts +3 -3
- package/dist/sync/collaborationSyncState.js +19 -12
- package/dist/sync/contentSyncPayload.d.ts +5 -1
- package/dist/sync/contentSyncPayload.js +9 -0
- package/dist/sync/contentSyncPayload.test.js +39 -0
- package/dist/sync/contentSyncState.d.ts +9 -9
- package/dist/sync/contentSyncState.js +248 -107
- package/dist/sync/planningSyncPayload.js +5 -0
- package/dist/sync/planningSyncPayload.test.js +24 -0
- package/dist/sync/syncApplyHandlers.d.ts +11 -4
- package/dist/sync/syncApplyHandlers.js +115 -42
- package/dist/sync/syncApplyHandlers.test.js +251 -4
- package/dist/sync/syncFieldSemantics.d.ts +12 -0
- package/dist/sync/syncFieldSemantics.js +55 -0
- package/dist/sync/syncResourceAdapters.d.ts +46 -0
- package/dist/sync/syncResourceAdapters.js +79 -0
- package/dist/sync/syncService.d.ts +6 -0
- package/dist/sync/syncService.js +65 -1
- package/dist/sync/syncService.test.js +96 -3
- package/dist/sync/taskSyncChangeKey.d.ts +2 -0
- package/dist/sync/taskSyncChangeKey.js +143 -0
- package/dist/sync/taskSyncPayload.js +3 -8
- package/dist/sync/workspacePullFeed.d.ts +4 -0
- package/dist/sync/workspacePullFeed.js +132 -72
- package/dist/sync/workspacePullFeed.test.js +92 -0
- package/dist/sync/workspaceRepair.js +5 -2
- package/dist/sync/workspaceSyncModel.d.ts +73 -6
- package/dist/sync/workspaceSyncModel.js +342 -73
- package/dist/sync/workspaceSyncModel.test.js +559 -14
- package/dist/sync/workspaceSyncState.d.ts +17 -0
- package/dist/sync/workspaceSyncState.js +2 -1
- package/dist/sync/workspaceSyncSurface.js +3 -8
- package/dist/types.d.ts +50 -2
- package/dist/ui/assets/AgentsModule-2y82_3DO.js +1 -0
- package/dist/ui/assets/AnnotatedAttachmentWorkspace-BTLZZCiQ.js +3 -0
- package/dist/ui/assets/AnnotatedAttachmentWorkspace-BVKew-mH.css +1 -0
- package/dist/ui/assets/ContextAttachmentManager-D2epuNnG.js +3 -0
- package/dist/ui/assets/CourierPrime-Bold-BuLj_dpw.woff2 +0 -0
- package/dist/ui/assets/CourierPrime-BoldItalic-BrK2pUkZ.woff2 +0 -0
- package/dist/ui/assets/CourierPrime-Italic-DFUZK5Ey.woff2 +0 -0
- package/dist/ui/assets/CourierPrime-Regular-BsKphzVf.woff2 +0 -0
- package/dist/ui/assets/DocumentWorkspace-D4rJKXzd.css +1 -0
- package/dist/ui/assets/DocumentWorkspace-sVa-3Do6.js +252 -0
- package/dist/ui/assets/EntityActivityTimeline-DyqvvhuF.css +1 -0
- package/dist/ui/assets/EntityActivityTimeline-Zods27y_.js +1 -0
- package/dist/ui/assets/{InitiativesModule-Dhm7M8e7.js → InitiativesModule-D4XseTwW.js} +1 -1
- package/dist/ui/assets/Noir_medium-bxQwKGzB.woff2 +0 -0
- package/dist/ui/assets/Noir_regular-ojf2kxlG.woff2 +0 -0
- package/dist/ui/assets/PlansPage-D5AcbO0L.js +1 -0
- package/dist/ui/assets/PlansPage-Dvqsz5zc.css +1 -0
- package/dist/ui/assets/RussoOne-Regular-Cu_qq_qC.woff2 +0 -0
- package/dist/ui/assets/SpecialElite-Regular-Di6gSvAS.woff2 +0 -0
- package/dist/ui/assets/TaskContextUpload-uC5qx4Bv.js +1 -0
- package/dist/ui/assets/TaskSettings-CqvPAsTv.js +9 -0
- package/dist/ui/assets/{WorkflowsModule-BcS4afRn.js → WorkflowsModule-oOA9bcdK.js} +4 -4
- package/dist/ui/assets/documentReferences-DPZuTgHh.js +1 -0
- package/dist/ui/assets/index-607WPo_X.js +4 -0
- package/dist/ui/assets/index-CYyodXsg.css +1 -0
- package/dist/ui/assets/{vendor-icons-BSUaRwF8.js → vendor-icons-B32hGuF2.js} +1 -1
- package/dist/ui/fonts/CourierPrime-Bold.ttf +0 -0
- package/dist/ui/fonts/CourierPrime-Bold.woff2 +0 -0
- package/dist/ui/fonts/CourierPrime-BoldItalic.ttf +0 -0
- package/dist/ui/fonts/CourierPrime-BoldItalic.woff2 +0 -0
- package/dist/ui/fonts/CourierPrime-Italic.ttf +0 -0
- package/dist/ui/fonts/CourierPrime-Italic.woff2 +0 -0
- package/dist/ui/fonts/CourierPrime-Regular.ttf +0 -0
- package/dist/ui/fonts/CourierPrime-Regular.woff2 +0 -0
- package/dist/ui/fonts/Noir_medium.otf +0 -0
- package/dist/ui/fonts/Noir_medium.woff2 +0 -0
- package/dist/ui/fonts/Noir_regular.otf +0 -0
- package/dist/ui/fonts/Noir_regular.woff2 +0 -0
- package/dist/ui/fonts/RussoOne-Regular.woff2 +0 -0
- package/dist/ui/fonts/SpecialElite-Regular.ttf +0 -0
- package/dist/ui/fonts/SpecialElite-Regular.woff2 +0 -0
- package/dist/ui/index.html +3 -3
- package/dist/ui/product/agent manager.png +0 -0
- package/dist/ui/product/agent_manager_02.png +0 -0
- package/dist/utils/accountProfileSummaryCache.d.ts +5 -0
- package/dist/utils/aiProfileEvents.d.ts +7 -0
- package/dist/utils/aiProfileEvents.js +6 -0
- package/dist/utils/assignees.d.ts +8 -0
- package/dist/utils/assignees.js +10 -1
- package/dist/utils/assignees.test.d.ts +1 -0
- package/dist/utils/assignees.test.js +25 -0
- package/dist/utils/avatarDisplay.d.ts +1 -0
- package/dist/utils/avatarDisplay.js +15 -0
- package/dist/utils/avatarUpload.d.ts +27 -0
- package/dist/utils/avatarUpload.js +132 -0
- package/dist/utils/avatarUpload.test.d.ts +1 -0
- package/dist/utils/avatarUpload.test.js +40 -0
- package/dist/utils/bootstrapTrace.d.ts +7 -0
- package/dist/utils/bootstrapTrace.js +29 -0
- package/dist/utils/commercialLifecyclePresentation.js +3 -0
- package/dist/utils/contextAssetEvents.d.ts +2 -0
- package/dist/utils/contextFiles.d.ts +3 -1
- package/dist/utils/contextFiles.js +2 -1
- package/dist/utils/syncEventDetails.d.ts +3 -0
- package/dist/utils/syncEventDetails.js +64 -0
- package/dist/utils/syncEventDetails.test.d.ts +1 -0
- package/dist/utils/syncEventDetails.test.js +23 -0
- package/dist/utils/syncEventPresentation.d.ts +15 -0
- package/dist/utils/syncEventPresentation.js +129 -0
- package/dist/utils/syncEventPresentation.test.d.ts +1 -0
- package/dist/utils/syncEventPresentation.test.js +64 -0
- package/dist/utils/syncStatusPresentation.d.ts +72 -0
- package/dist/utils/syncStatusPresentation.js +217 -0
- package/dist/utils/syncStatusPresentation.test.d.ts +1 -0
- package/dist/utils/syncStatusPresentation.test.js +164 -0
- package/dist/utils/taskActivity.d.ts +9 -1
- package/dist/utils/taskActivity.js +290 -22
- package/dist/utils/taskActivity.test.js +141 -8
- package/dist/utils/taskSearch.d.ts +22 -0
- package/dist/utils/taskSearch.js +87 -0
- package/dist/utils/taskSearch.test.d.ts +1 -0
- package/dist/utils/taskSearch.test.js +69 -0
- package/dist/utils/taskUtils.js +10 -3
- package/dist/utils/taskUtils.test.d.ts +1 -0
- package/dist/utils/taskUtils.test.js +19 -0
- package/dist/utils/workspaceSyncPresentation.d.ts +4 -0
- package/dist/utils/workspaceSyncPresentation.js +68 -2
- package/dist/utils/workspaceSyncPresentation.test.js +36 -1
- package/package.json +3 -2
- package/scripts/export-sqlite-to-postgres.mjs +7 -9
- package/scripts/run-e2e-realtime.sh +17 -3
- package/scripts/run-smoke.sh +17 -5
- package/scripts/run-soak.sh +17 -5
- package/src/resources/templates/workflow-sources/workflowDocs.mjs +6 -6
- package/src/resources/templates/workflows/collaborate.yaml +1 -1
- package/src/resources/templates/workflows/evaluate.yaml +2 -2
- package/src/resources/templates/workflows/plan.yaml +1 -1
- package/src/resources/templates/workflows/review.yaml +2 -2
- package/dist/ui/assets/AgentsModule-N2MnQBZk.js +0 -1
- package/dist/ui/assets/AnnotatedAttachmentWorkspace-BG6P_GVW.js +0 -3
- package/dist/ui/assets/AnnotatedAttachmentWorkspace-BaS2VwIr.css +0 -1
- package/dist/ui/assets/DocumentWorkspace-B3nV_Gc5.css +0 -1
- package/dist/ui/assets/DocumentWorkspace-DRbDMwh8.js +0 -252
- package/dist/ui/assets/PlansPage-C2dd2n1X.css +0 -1
- package/dist/ui/assets/PlansPage-Cq0zXj3I.js +0 -1
- package/dist/ui/assets/RussoOne-Regular-C3BxZIj7.ttf +0 -0
- package/dist/ui/assets/TaskSettings-ln0aF7xc.js +0 -9
- package/dist/ui/assets/index-C2-OXZV7.css +0 -1
- package/dist/ui/assets/index-DcSI5F86.js +0 -6
- package/scripts/migrate-planning-model.ts +0 -233
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{j as t,r as a,R as qt}from"./vendor-react-CKJs5o3c.js";import{R as xs,f as Ce,e as Ct,g as vs,t as Bn,M as Jt}from"./index-DcSI5F86.js";import{q as _s,n as js,c as Zt,T as Tn,s as ks,a3 as ws,h as An,ak as Cs,R as Is,al as Ss,am as Ns,an as $s,ao as tn,C as nn,ap as Rs,aq as Dn,ar as zn,as as Un,at as Gn,g as Ps,f as Bs,b as sn}from"./vendor-icons-BSUaRwF8.js";import"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";import"./vendor-router-BbWMxlnO.js";function Ts({copied:o,disabled:l=!1,label:m,onClick:g,title:w="Copy image reference",ariaLabel:y,className:M=""}){return t.jsx(xs,{copied:o,disabled:l,label:"",onClick:g,title:w,ariaLabel:y,className:M,children:m})}const As="_shell_sf7jc_1",Es="_panel_sf7jc_16",Ms="_sessionPanel_sf7jc_22",Ls="_detailPanel_sf7jc_23",Fs="_sessionContextBar_sf7jc_29",Hs="_sessionContextLeft_sf7jc_40",Os="_sessionContextRight_sf7jc_41",Ds="_sessionContextLabel_sf7jc_56",zs="_sessionContextSpacer_sf7jc_62",Us="_canvasPanel_sf7jc_67",Gs="_canvasWorkspace_sf7jc_74",Ys="_canvasMain_sf7jc_81",Ks="_panelHeader_sf7jc_88",Ws="_panelHeaderText_sf7jc_97",Xs="_panelTitle_sf7jc_101",Vs="_canvasHeading_sf7jc_105",qs="_sessionActions_sf7jc_109",Js="_sessionList_sf7jc_117",Zs="_annotationList_sf7jc_118",Qs="_markerHelpModalBody_sf7jc_133",ea="_openImageModalBody_sf7jc_139",ta="_openImageField_sf7jc_145",na="_openImageActions_sf7jc_149",sa="_markerHelpItem_sf7jc_155",aa="_markerHelpHeader_sf7jc_163",oa="_markerHelpExample_sf7jc_175",ra="_sessionCard_sf7jc_179",ia="_annotationCard_sf7jc_180",la="_sessionEmptyState_sf7jc_197",ca="_sessionCardButton_sf7jc_204",da="_annotationCardButton_sf7jc_214",ua="_sessionCardBody_sf7jc_224",fa="_sessionCardActive_sf7jc_230",ma="_annotationCardActive_sf7jc_231",pa="_annotationMeta_sf7jc_241",ha="_annotationInstructionPreview_sf7jc_248",ba="_annotationPreviewFooter_sf7jc_256",ga="_annotationInstructionEditor_sf7jc_263",ya="_annotationTypeField_sf7jc_269",xa="_annotationInstructionButton_sf7jc_275",va="_annotationInstructionField_sf7jc_284",_a="_sessionMeta_sf7jc_288",ja="_sessionTitle_sf7jc_295",ka="_annotationTitle_sf7jc_296",wa="_sessionTimestamp_sf7jc_302",Ca="_annotationKind_sf7jc_303",Ia="_annotationInstructionTypeIcon_sf7jc_307",Sa="_sessionInstructionPreview_sf7jc_313",Na="_sessionInstructionEditor_sf7jc_321",$a="_sessionCardFooter_sf7jc_327",Ra="_toolRail_sf7jc_334",Pa="_canvasToolRail_sf7jc_343",Ba="_toolbarCluster_sf7jc_364",Ta="_toolbarViewportCluster_sf7jc_371",Aa="_toolbarSeparator_sf7jc_375",Ea="_toolBtn_sf7jc_381",Ma="_toolRailButton_sf7jc_385",La="_toolbarButton_sf7jc_395",Fa="_toolBtnActive_sf7jc_400",Ha="_toolbarActions_sf7jc_407",Oa="_toolbarSelectionActions_sf7jc_416",Da="_toolbarColorPicker_sf7jc_424",za="_colorPickerButton_sf7jc_428",Ua="_colorPickerSwatch_sf7jc_433",Ga="_colorPickerPopover_sf7jc_441",Ya="_colorOption_sf7jc_456",Ka="_colorOptionActive_sf7jc_466",Wa="_toolbarUtilities_sf7jc_473",Xa="_toolbarGeometryFields_sf7jc_481",Va="_toolbarGeometryField_sf7jc_481",qa="_toolbarGeometryLabel_sf7jc_494",Ja="_toolbarGeometryInput_sf7jc_500",Za="_iconButton_sf7jc_505",Qa="_ghostBtn_sf7jc_510",eo="_payloadBtn_sf7jc_511",to="_backToTaskBtn_sf7jc_512",no="_canvasScroller_sf7jc_532",so="_canvasFrame_sf7jc_548",ao="_canvasMedia_sf7jc_555",oo="_canvasStatusOverlay_sf7jc_563",ro="_canvasStatusCard_sf7jc_575",io="_canvasImage_sf7jc_588",lo="_overlay_sf7jc_595",co="_overlaySelect_sf7jc_601",uo="_overlayPan_sf7jc_605",fo="_overlaySvg_sf7jc_609",mo="_overlayHitLayer_sf7jc_618",po="_arrowHitArea_sf7jc_627",ho="_canvasHandleHit_sf7jc_634",bo="_canvasResizeHandleHit_sf7jc_641",go="_canvasHandleVisible_sf7jc_645",yo="_pin_sf7jc_662",xo="_note_sf7jc_663",vo="_annotationNumberBadge_sf7jc_680",_o="_box_sf7jc_705",jo="_boxNumberBadge_sf7jc_714",ko="_arrowNumberBadge_sf7jc_720",wo="_boxSurface_sf7jc_724",Co="_selected_sf7jc_737",Io="_textInput_sf7jc_754",So="_textArea_sf7jc_755",No="_select_sf7jc_737",$o="_sessionTitleInput_sf7jc_762",Ro="_sessionInstructionField_sf7jc_767",Po="_detailEmpty_sf7jc_776",Bo="_emptyState_sf7jc_777",To="_payloadModalBody_sf7jc_789",Ao="_payloadModalToolbar_sf7jc_796",Eo="_payloadViewToggle_sf7jc_803",Mo="_payloadModalActions_sf7jc_804",Lo="_payloadModalPreview_sf7jc_811",Fo="_statusBar_sf7jc_826",Ho="_annotationSummary_sf7jc_838",s={shell:As,panel:Es,sessionPanel:Ms,detailPanel:Ls,sessionContextBar:Fs,sessionContextLeft:Hs,sessionContextRight:Os,sessionContextLabel:Ds,sessionContextSpacer:zs,canvasPanel:Us,canvasWorkspace:Gs,canvasMain:Ys,panelHeader:Ks,panelHeaderText:Ws,panelTitle:Xs,canvasHeading:Vs,sessionActions:qs,sessionList:Js,annotationList:Zs,markerHelpModalBody:Qs,openImageModalBody:ea,openImageField:ta,openImageActions:na,markerHelpItem:sa,markerHelpHeader:aa,markerHelpExample:oa,sessionCard:ra,annotationCard:ia,sessionEmptyState:la,sessionCardButton:ca,annotationCardButton:da,sessionCardBody:ua,sessionCardActive:fa,annotationCardActive:ma,annotationMeta:pa,annotationInstructionPreview:ha,annotationPreviewFooter:ba,annotationInstructionEditor:ga,annotationTypeField:ya,annotationInstructionButton:xa,annotationInstructionField:va,sessionMeta:_a,sessionTitle:ja,annotationTitle:ka,sessionTimestamp:wa,annotationKind:Ca,annotationInstructionTypeIcon:Ia,sessionInstructionPreview:Sa,sessionInstructionEditor:Na,sessionCardFooter:$a,toolRail:Ra,canvasToolRail:Pa,toolbarCluster:Ba,toolbarViewportCluster:Ta,toolbarSeparator:Aa,toolBtn:Ea,toolRailButton:Ma,toolbarButton:La,toolBtnActive:Fa,toolbarActions:Ha,toolbarSelectionActions:Oa,toolbarColorPicker:Da,colorPickerButton:za,colorPickerSwatch:Ua,colorPickerPopover:Ga,colorOption:Ya,colorOptionActive:Ka,toolbarUtilities:Wa,toolbarGeometryFields:Xa,toolbarGeometryField:Va,toolbarGeometryLabel:qa,toolbarGeometryInput:Ja,iconButton:Za,ghostBtn:Qa,payloadBtn:eo,backToTaskBtn:to,canvasScroller:no,canvasFrame:so,canvasMedia:ao,canvasStatusOverlay:oo,canvasStatusCard:ro,canvasImage:io,overlay:lo,overlaySelect:co,overlayPan:uo,overlaySvg:fo,overlayHitLayer:mo,arrowHitArea:po,canvasHandleHit:ho,canvasResizeHandleHit:bo,canvasHandleVisible:go,pin:yo,note:xo,annotationNumberBadge:vo,box:_o,boxNumberBadge:jo,arrowNumberBadge:ko,boxSurface:wo,selected:Co,textInput:Io,textArea:So,select:No,sessionTitleInput:$o,sessionInstructionField:Ro,detailEmpty:Po,emptyState:Bo,payloadModalBody:To,payloadModalToolbar:Ao,payloadViewToggle:Eo,payloadModalActions:Mo,payloadModalPreview:Lo,statusBar:Fo,annotationSummary:Ho},En=[{value:"review",label:"Review"},{value:"change",label:"Change"},{value:"question",label:"Question"}],Mn=[{value:"select",label:"Select",icon:Rs},{value:"pin",label:"Pin",icon:Dn},{value:"box",label:"Box",icon:zn},{value:"arrow",label:"Arrow",icon:Un},{value:"text-note",label:"Note",icon:Gn}],Oo={pin:Dn,box:zn,arrow:Un,"text-note":Gn},Do={pin:"Pin",box:"Box",arrow:"Arrow","text-note":"Note"},zo={review:tn,change:sn,question:nn,issue:nn,idea:tn},It={select:{short:"Select and edit existing markers.",detail:"Use Select to click, drag, reorder, resize, and update markers that are already on the image.",example:"Example: move an existing marker after the screenshot changes."},pin:{short:"Mark a precise spot.",detail:"Use Pin when feedback points to one exact location instead of a broader area.",example:'Example: "This icon is misaligned by 2px."'},box:{short:"Mark an area or component.",detail:"Use Box when the feedback applies to a whole region, card, panel, or bounded UI block.",example:'Example: "This whole card needs tighter padding and a stronger border."'},arrow:{short:"Show direction or relationship.",detail:"Use Arrow when you need to show movement, attachment, flow, or source-to-target intent.",example:'Example: "This tooltip should anchor to this button, not the panel."'},"text-note":{short:"Add a comment-style point marker.",detail:"Use Note when you want a point marker that reads more like a comment or open question.",example:'Example: "Ask design whether this badge should stay."'}},it={question:"#0f766e",change:"#2563eb",issue:"#dc2626",idea:"#d97706",review:"#7c3aed"},Uo=["#7c3aed","#2563eb","#0f766e","#dc2626","#d97706","#111827"],re="review";function ze(o){const l=String(o.displayName||"").trim();return l?`${l} review`:"Annotated session"}function Yn(){return`annotation-${Math.random().toString(36).slice(2,10)}`}function _(o){return!Number.isFinite(o)||o<=0?0:o>=1?1:o}function Se(o){return _(Math.max(.02,o))}function rt(o){return o?[String(o.taskId||"").trim(),String(o.assetId||"").trim(),String(o.path||"").trim()].join("::"):""}function Go(o){if(!(o instanceof HTMLElement))return!1;const l=o.tagName.toLowerCase();return o.isContentEditable?!0:l==="input"||l==="textarea"||l==="select"}function Ie(o){return o.map((l,m)=>({...l,order:m}))}function Qt(o){if(!o)return"Unsaved";const l=new Date(o);return Number.isNaN(l.getTime())?"Unsaved":l.toLocaleString()}function St(o){const l=String(o.createdByActor?.label||"").trim();return l||null}function Yo(o){const l=String(o||"").trim().replace(/\s+/g," ");return l?l.length>110?`${l.slice(0,107)}...`:l:""}function Ln(o,l,m,g=it[re]){const w={id:Yn(),order:0,instruction:"",markerType:re,color:g};if(o==="pin")return{...w,kind:o,x:l.x,y:l.y};if(o==="text-note")return{...w,kind:o,x:l.x,y:l.y};if(o==="box"){const M=m||l;return{...w,kind:o,x:_(Math.min(l.x,M.x)),y:_(Math.min(l.y,M.y)),width:Se(Math.abs(M.x-l.x)),height:Se(Math.abs(M.y-l.y))}}const y=m||l;return{...w,kind:"arrow",x:l.x,y:l.y,x2:y.x,y2:y.y}}function en(o){return o.color?o.color:it[o.markerType||re]}function Ko(o,l){const m=Math.max(l.width,1),g=Math.max(l.height,1),w=o.x*m,y=o.y*g,M=o.x2*m,ne=o.y2*g,Ue=M-w,Ge=ne-y,me=Math.hypot(Ue,Ge)||1,ie=Ue/me,Ye=Ge/me,Ne=Math.max(10,Math.min(16,me-2)),T=Ne*.62,Ke=M-ie*Ne,pe=ne-Ye*Ne,he=-Ye,se=ie;return{shaftX1:w,shaftY1:y,shaftX2:Ke,shaftY2:pe,headPoints:[`${M},${ne}`,`${Ke+he*T},${pe+se*T}`,`${Ke-he*T},${pe-se*T}`].join(" ")}}function Wo(o,l){return{...o,markerType:l,color:o.color||it[l]}}function Xo(o,l){return{...o,id:Yn(),order:l}}function Vo(o,l){const m=String(o||"").trim()||(l?ze(l):"Annotated session");return/\bcopy$/i.test(m)?`${m} 2`:`${m} copy`}function qo(o,l,m){if(l===m||l<0||m<0||l>=o.length||m>=o.length)return o;const g=[...o],[w]=g.splice(l,1);return w?(g.splice(m,0,w),Ie(g)):o}function te(o){return String(Math.round(_(o)*1e3)/10)}function Jo(o){const l=Number.parseFloat(o);return Number.isFinite(l)?_(l/100):null}function Zo(o,l,m){return o.kind==="pin"||o.kind==="text-note"?l==="x"||l==="y"?{...o,[l]:_(m)}:o:o.kind==="box"?l==="x"||l==="y"?{...o,[l]:_(m)}:l==="width"||l==="height"?{...o,[l]:Se(m)}:o:l==="x"||l==="y"||l==="x2"||l==="y2"?{...o,[l]:_(m)}:o}function Qo(o){return o.kind==="pin"||o.kind==="text-note"?[{key:"x",label:"X",value:te(o.x)},{key:"y",label:"Y",value:te(o.y)}]:o.kind==="box"?[{key:"x",label:"X",value:te(o.x)},{key:"y",label:"Y",value:te(o.y)},{key:"width",label:"Width",value:te(o.width)},{key:"height",label:"Height",value:te(o.height)}]:[{key:"x",label:"Start X",value:te(o.x)},{key:"y",label:"Start Y",value:te(o.y)},{key:"x2",label:"End X",value:te(o.x2)},{key:"y2",label:"End Y",value:te(o.y2)}]}function er(o){if(!o)return null;const l=Math.round(o.x*100),m=Math.round(o.y*100),g=Math.round(o.width*100),w=Math.round(o.height*100);return`crop ${l}%, ${m}% size ${g}% x ${w}%`}function tr(o){return Number.isFinite(o)?Math.min(4,Math.max(.25,Number(o.toFixed(2)))):1}function Fn(o){const l=[`Annotated attachment: ${o.title||o.image.displayName}`,`Image: ${o.image.displayName}`,`Image Reference: ${o.image.referenceLabel||o.image.assetId}`,`Task ID: ${o.taskId}`,o.globalInstruction?`Global instruction: ${o.globalInstruction}`:"Global instruction: None provided.","Markers:"];return o.annotations.length===0?(l.push("0. No markers."),l.join(`
|
|
2
|
-
`)):(o.annotations.forEach((m,g)=>{const w=m.markerType||re,y=er(m.cropHint);l.push(`${g+1}. ${m.kind} (${w})`),l.push(`Instruction: ${m.instruction||"No marker instruction."}`),y&&l.push(`Region: ${y}`)}),l.join(`
|
|
3
|
-
`))}function Nt(o){return{title:o.title,globalInstruction:o.globalInstruction,annotations:Ie(o.annotations)}}function Hn(o){return JSON.stringify(Nt(o))}function On(o){const l=JSON.parse(o);return Nt({title:String(l?.title||""),globalInstruction:String(l?.globalInstruction||""),annotations:Array.isArray(l?.annotations)?l.annotations:[]})}function nr(o,l){return Nt({title:o?.title||l,globalInstruction:o?.globalInstruction||"",annotations:o?.annotations||[]})}function dr({runtimeMode:o="local",apiBaseUrl:l="",cloudAuthBaseUrl:m="",workspaceId:g="default",sessionLoadReady:w=!0,requestedTarget:y=null,requestedSessionId:M=null,requestedOpenVersion:ne=0,resolveTaskReferenceLabel:Ue,resolveImageReferenceLabel:Ge,onRequestedTargetHandled:me,onOpenTarget:ie,onContextChange:Ye,onBackToTask:Ne}){const T=o==="cloud"&&(m||l)||"",[Ke,pe]=a.useState(y),[he,se]=a.useState([]),[x,$e]=a.useState(null),[$t,We]=a.useState(!1),[Re,Xe]=a.useState(""),[Pe,Ve]=a.useState(""),[N,ae]=a.useState([]),[C,L]=a.useState(null),[lt,an]=a.useState(it[re]),[ct,dt]=a.useState(!1),[$,Be]=a.useState("select"),[Kn,be]=a.useState(!1),[ut,on]=a.useState(!1),[W,X]=a.useState(!1),[rn,h]=a.useState(null),[U,R]=a.useState("saved"),[sr,D]=a.useState(null),[ft,ln]=a.useState(!1),[oe,Rt]=a.useState(null),[le,Pt]=a.useState(!1),[Wn,Bt]=a.useState(!1),[Tt,cn]=a.useState("json"),[mt,At]=a.useState(!1),[pt,Et]=a.useState(!1),[Xn,dn]=a.useState(!1),[Vn,ht]=a.useState(!1),[Mt,bt]=a.useState(""),[qe,un]=a.useState(!1),[ce,Je]=a.useState(!1),[Lt,Ze]=a.useState(!1),[P,Ft]=a.useState(1),[G,Qe]=a.useState(!1),[gt,fn]=a.useState(!1),[yt,et]=a.useState({width:0,height:0}),mn=a.useRef(null),Te=a.useRef(null),Ht=a.useRef(null),pn=a.useRef(null),ge=a.useRef(M),ye=a.useRef(""),xt=a.useRef(0),Ot=a.useRef(""),xe=a.useRef(0),vt=a.useRef(null),hn=a.useRef(0),de=a.useRef(!1),tt=a.useRef(null),Dt=a.useRef(null),ve=a.useRef(null),F=a.useRef(""),A=a.useRef(""),_t=a.useRef(null),V=a.useRef(null),Ae=a.useRef(!1),jt=a.useRef(null),nt=a.useRef(null),st=a.useRef(null),_e=a.useRef(null),Ee=a.useRef(null),Me=a.useRef(null),Le=a.useRef(null),ue=a.useRef(null),q=a.useRef(null),bn=a.useRef(null),gn=a.useRef(null),B=a.useMemo(()=>he.find(e=>e.id===x)||null,[x,he]),J=a.useMemo(()=>`workspaceId=${encodeURIComponent(String(g||"default").trim()||"default")}`,[g]),E=a.useMemo(()=>({"x-taskforce-workspace-id":String(g||"default").trim()||"default"}),[g]),z=a.useMemo(()=>N.find(e=>e.id===C)||null,[N,C]),Z=a.useMemo(()=>rt(y),[y]),je=typeof ie=="function",d=je?y:Ke,kt=a.useMemo(()=>{const e=String(d?.taskId||"").trim();if(!e)return"";const n=Ue?.(e).trim()||"";if(n)return n;const r=String(d?.taskReferenceLabel||"").trim();return r&&r!==e?r:n||e},[d?.taskId,d?.taskReferenceLabel,Ue]),at=a.useMemo(()=>{const e=String(d?.assetId||"").trim();if(!e)return"";const n=Ge?.(e).trim()||"";return n||String(d?.imageReferenceLabel||"").trim()},[d?.assetId,d?.imageReferenceLabel,Ge]),zt=a.useMemo(()=>N.findIndex(e=>e.id===C),[N,C]),Ut=z?.color||lt,yn=a.useMemo(()=>Nt({title:Re,globalInstruction:Pe,annotations:N}),[N,Pe,Re]),Fe=a.useMemo(()=>Hn(yn),[yn]),xn=Fe!==A.current,b=a.useMemo(()=>({width:Math.max(yt.width*P,0),height:Math.max(yt.height*P,0)}),[yt.height,yt.width,P]),He=a.useMemo(()=>({visibleRadius:7,hitRadius:11}),[]),Gt=a.useMemo(()=>`0 0 ${Math.max(b.width,1)} ${Math.max(b.height,1)}`,[b.height,b.width]),ke=a.useMemo(()=>{const e=Te.current;return e?P>1||b.width>e.clientWidth+1||b.height>e.clientHeight+1:P>1},[b.height,b.width,P]),Yt=`${Math.round(P*100)}%`,Kt=a.useMemo(()=>{const e=new Map;return N.forEach((n,r)=>{e.set(n.id,r+1)}),e},[N]);a.useEffect(()=>{ge.current=M},[M]),a.useEffect(()=>{const e=pn.current;if(!e||!C)return;e.focus();const n=e.value.length;e.setSelectionRange(n,n)},[C]),a.useEffect(()=>{ve.current=x},[x]),a.useEffect(()=>{We(!1)},[x]),a.useEffect(()=>{if(!z){dt(!1);return}an(z.color||it[z.markerType||re])},[z]);const wt=a.useCallback(async e=>{const n=typeof performance<"u"?performance.now():Date.now(),r=await Ce(`/api/taskforce/annotated-attachments/sessions?${J}`,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json",...E},body:JSON.stringify({taskId:e.taskId,baseImageAssetId:e.assetId,title:ze(e),globalInstruction:"",annotations:[]})},T),i=await r.json().catch(()=>({}));if(!r.ok)throw new Error(String(i?.error||"Failed to create session."));const c=i?.session;if(!c?.id)throw new Error("Failed to create session.");return Ct("annotated_session_create_completed",{assetId:e.assetId,taskId:e.taskId||null,sessionId:c.id,durationMs:Math.round((typeof performance<"u"?performance.now():Date.now())-n),debugTimings:i?.debugTimings||null,serverTiming:typeof r.headers?.get=="function"&&r.headers.get("server-timing")||null}),c},[E,T,J]),vn=a.useCallback(e=>new Promise((n,r)=>{const i=new FileReader;i.onload=()=>n(typeof i.result=="string"?i.result:""),i.onerror=()=>r(i.error||new Error("Failed to read clipboard image.")),i.readAsDataURL(e)}),[]),I=a.useCallback(()=>{tt.current!==null&&(window.clearTimeout(tt.current),tt.current=null),st.current!==null&&(window.clearTimeout(st.current),st.current=null)},[]),Oe=a.useCallback(e=>{Xe(e.title),Ve(e.globalInstruction),ae(e.annotations),L(n=>n&&e.annotations.some(r=>r.id===n)?n:e.annotations[0]?.id||null)},[]),fe=a.useCallback((e,n)=>{const r=ze(n||d||{assetId:e.baseImageAssetId,displayName:"Annotated session"}),i=nr(e,r),c=Hn(i);de.current=!0,I(),Oe(i),A.current=c,F.current=c,_t.current=null,Ae.current=!1,jt.current=null,nt.current=null,D(null),R("saved"),X(!1)},[d,Oe,I]),Wt=a.useCallback(e=>{de.current=!0,I(),se([]),$e(null),be(!1),We(!1),Xe(ze(e)),Ve(""),ae([]),L(null),A.current="",F.current="",_t.current=null,Ae.current=!1,jt.current=null,nt.current=null,Rt(null),Bt(!1),D(null),R("saved"),X(!1)},[I]),we=a.useCallback(async(e,n,r)=>{const i=ve.current;if(!i)return!0;if(e===A.current)return V.current||(D(null),R("saved")),!0;if(V.current){if(Ae.current=!0,!r?.waitForInFlight||!await V.current)return!1;const f=F.current;return f===A.current?!0:we(f,n,r)}I();const c=On(e);jt.current=i,_t.current=e,X(!0),h(null),D(null),R("saving");const p=(async()=>{try{const u=await Ce(`/api/taskforce/annotated-attachments/sessions/${encodeURIComponent(i)}?${J}`,{method:"PATCH",credentials:"include",headers:{"Content-Type":"application/json",...E},body:JSON.stringify(c)},T),f=await u.json().catch(()=>({}));if(!u.ok)throw new Error(String(f?.error||"Failed to save session."));const v=f?.session;if(!v?.id)throw new Error("Failed to save session.");se(Vt=>{const Rn=Vt.findIndex(ys=>ys.id===v.id);if(Rn===-1)return[v,...Vt];const Pn=[...Vt];return Pn[Rn]=v,Pn}),A.current=e,nt.current=null,D(null);const k=ve.current===v.id,S=F.current,K=S!==e,ot=Ae.current||K;return Ae.current=!1,k&&!ot?(de.current=!0,Oe(c),R("saved")):!ot&&S===A.current?R("saved"):R("pending"),!0}catch(u){const f=u instanceof Error?u.message:"Failed to save session.";return h(f),D(f),R("error"),nt.current!==e&&ve.current===i&&F.current===e&&(nt.current=e,st.current=window.setTimeout(()=>{st.current=null,!(ve.current!==i||F.current!==e)&&we(e,n,{waitForInFlight:!0})},1500)),!1}finally{_t.current=null,V.current=null,jt.current=null,X(!1)}})();V.current=p;const j=await p;if(j){const u=F.current;if(u!==A.current)return we(u,n,r)}return j},[Oe,I,E,T,J]),_n=a.useCallback(e=>{if(ve.current){if(F.current===A.current){D(null),V.current||R("saved");return}U!=="saving"&&R("pending"),I(),tt.current=window.setTimeout(()=>{tt.current=null,we(F.current,"structure")},e)}},[I,we,U]),Y=a.useCallback(e=>{Dt.current=e},[]),H=a.useCallback(async e=>{I();const n=F.current;return!ve.current||n===A.current?(D(null),V.current||R("saved"),!0):we(n,e,{waitForInFlight:!0})},[I,we]),qn=a.useCallback(()=>{const e=A.current;e&&(I(),de.current=!0,Oe(On(e)),D(null),R("saved"),h(null))},[Oe,I]),Q=a.useCallback(async(e,n)=>{const r=typeof performance<"u"?performance.now():Date.now(),i=JSON.stringify({targetKey:rt(e),requestedSessionId:n?.requestedSessionId??null,autoCreateIfEmpty:n?.autoCreateIfEmpty===!0});if(vt.current===i)return;const c=xe.current+1;xe.current=c,vt.current=i,on(!0),h(null);try{const p=new URLSearchParams;g&&p.set("workspaceId",g),e.taskId&&p.set("taskId",e.taskId),p.set("imageAssetId",e.assetId);const j=await Ce(`/api/taskforce/annotated-attachments/sessions?${p.toString()}`,{credentials:"include",headers:E,cache:"no-store"},T),u=await j.json().catch(()=>({}));if(!j.ok)throw new Error(String(u?.error||"Failed to load annotated attachment sessions."));const f=Array.isArray(u?.sessions)?u.sessions:[];if(Ct("annotated_sessions_loaded",{assetId:e.assetId,taskId:e.taskId||null,requestedSessionId:n?.requestedSessionId??null,autoCreateIfEmpty:n?.autoCreateIfEmpty===!0,sessionCount:f.length,durationMs:Math.round((typeof performance<"u"?performance.now():Date.now())-r),serverTiming:typeof j.headers?.get=="function"&&j.headers.get("server-timing")||null}),f.length===0&&n?.autoCreateIfEmpty&&String(e.assetId||"").trim()){const S=n?.requestedSessionId??ge.current;if(ge.current=null,S&&h("The previously selected annotation session could not be restored."),xe.current!==c)return;const K=await wt(e);if(Ct("annotated_sessions_auto_created_after_empty_load",{assetId:e.assetId,taskId:e.taskId||null,sessionId:K.id,totalDurationMs:Math.round((typeof performance<"u"?performance.now():Date.now())-r)}),xe.current!==c)return;se([K]),$e(K.id),be(!1),fe(K,e);return}if(xe.current!==c)return;se(f),be(f.length===0);const v=n?.requestedSessionId??ge.current;ge.current=null;const k=f.find(S=>S.id===v)||f[0]||null;v&&!k&&h("The previously selected annotation session could not be restored."),$e(k?.id||null),k?fe(k,e):(de.current=!0,I(),Xe(ze(e)),Ve(""),ae([]),L(null),A.current="",F.current="",D(null),R("saved"))}catch(p){if(xe.current!==c)return;h(p instanceof Error?p.message:"Failed to load sessions.")}finally{vt.current===i&&(vt.current=null),xe.current===c&&on(!1)}},[I,wt,E,T,fe,g]),Jn=a.useCallback(async()=>{if(typeof navigator>"u"||!navigator.clipboard||typeof navigator.clipboard.read!="function"){h("Clipboard image paste is not supported in this environment.");return}fn(!0),h(null),hn.current=Date.now()+2e3;try{const n=(await navigator.clipboard.read()).find(v=>v.types.some(k=>k.startsWith("image/"))),r=n?.types.find(v=>v.startsWith("image/"))||"";if(!n||!r)throw new Error("No image found on the clipboard.");const i=await n.getType(r),c=await vn(i);if(!c)throw new Error("Failed to read clipboard image.");const p=r==="image/jpeg"?"jpg":r==="image/webp"?"webp":r==="image/gif"?"gif":"png",j=await fetch("/api/taskforce/context-upload",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json",...E},body:JSON.stringify({file:c,originalName:`pasted-image.${p}`,workspaceId:String(g||"default").trim()||"default"})}),u=await j.json().catch(()=>({}));if(!j.ok||!u?.success||typeof u?.assetId!="string"||typeof u?.path!="string")throw new Error(String(u?.error||"Failed to paste image into Image Notes."));const f={assetId:u.assetId,imageReferenceLabel:typeof u?.referenceLabel=="string"?u.referenceLabel:void 0,path:u.path,displayName:typeof u?.displayName=="string"&&u.displayName.trim().length>0?u.displayName.trim():"Pasted image"};ge.current=null,je?(ye.current="",ie?.(f,{sessionId:null})):(pe(f),ye.current=rt(f),Q(f,{autoCreateIfEmpty:!0}))}catch(e){h(e instanceof Error?e.message:"Failed to paste image.")}finally{fn(!1)}},[je,Q,ie,vn,E,g]),Zn=a.useCallback(async()=>{const e=Mt.trim();if(!e){h("Enter an image reference to open.");return}un(!0),h(null);try{const n=new URLSearchParams({workspaceId:String(g||"default").trim()||"default"}),r=await Ce(`/api/taskforce/annotated-attachments/images/${encodeURIComponent(e)}?${n.toString()}`,{method:"GET",credentials:"include",headers:E}),i=await r.json().catch(()=>({}));if(!r.ok||!i?.target||typeof i.target.assetId!="string"||typeof i.target.path!="string")throw new Error(String(i?.error||"Failed to open image reference."));const c={assetId:i.target.assetId,path:i.target.path,displayName:typeof i.target.displayName=="string"&&i.target.displayName.trim().length>0?i.target.displayName.trim():"Image attachment",taskId:typeof i.target.taskId=="string"&&i.target.taskId.trim().length>0?i.target.taskId.trim():void 0,taskReferenceLabel:typeof i.target.taskReferenceLabel=="string"&&i.target.taskReferenceLabel.trim().length>0?i.target.taskReferenceLabel.trim():void 0,imageReferenceLabel:typeof i.target.imageReferenceLabel=="string"&&i.target.imageReferenceLabel.trim().length>0?i.target.imageReferenceLabel.trim():void 0};ge.current=null,ht(!1),bt(""),je?(ye.current="",ie?.(c,{sessionId:null})):(pe(c),ye.current=rt(c),Q(c,{autoCreateIfEmpty:!0}))}catch(n){h(n instanceof Error?n.message:"Failed to open image reference.")}finally{un(!1)}},[je,Q,ie,Mt,E,g]),jn=a.useCallback(e=>{se(n=>{const r=n.findIndex(c=>c.id===e.id);if(r===-1)return[e,...n];const i=[...n];return i[r]=e,i}),$e(e.id),fe(e,d)},[d,fe]),kn=a.useCallback(e=>{se(n=>{const r=n.filter(c=>c.id!==e),i=r[0]||null;return $e(i?.id||null),i?fe(i,d):(de.current=!0,I(),Xe(ze(d||{displayName:"Annotated session"})),Ve(""),ae([]),L(null),A.current="",F.current="",D(null),R("saved")),r})},[d,I,fe]);a.useEffect(()=>{if(!y)return;if(je||pe(n=>n&&rt(n)===Z&&n.taskReferenceLabel===y.taskReferenceLabel&&n.imageReferenceLabel===y.imageReferenceLabel&&n.displayName===y.displayName?n:y),!w){Z&&(Z!==ye.current||ne!==xt.current)&&Z!==Ot.current&&(Wt(y),Ot.current=Z,xt.current=ne,Ct("annotated_sessions_load_deferred",{assetId:y.assetId,taskId:y.taskId||null,requestedTargetKey:Z})),me?.();return}Z&&(Z!==ye.current||ne!==xt.current)&&(Wt(y),ye.current=Z,xt.current=ne,Ot.current="",Q(y,{autoCreateIfEmpty:!0})),me?.()},[je,Q,me,ne,y,Z,Wt,M,w]),a.useEffect(()=>{d&&Ye?.({target:d,sessionId:x})},[d,Ye,x]),a.useEffect(()=>{if(!d||typeof document>"u"||!w)return;const e=()=>{Date.now()<hn.current||F.current!==A.current||W||ut||Q(d,{requestedSessionId:x})},n=()=>{document.visibilityState==="visible"&&e()};return document.addEventListener("visibilitychange",n),()=>{document.removeEventListener("visibilitychange",n)}},[d,Q,ut,W,x,w]),a.useEffect(()=>{if(!d?.path){Je(!1),Ze(!1),et({width:0,height:0});return}Je(!0),Ze(!1),et({width:0,height:0}),Ft(1),Qe(!1)},[d?.path]),a.useEffect(()=>{if(!ce)return;const e=Ht.current;!e||!e.complete||e.naturalWidth<=0||e.naturalHeight<=0||(et({width:e.naturalWidth,height:e.naturalHeight}),Je(!1),Ze(!1))},[d?.path,ce]),a.useEffect(()=>{ke||Qe(!1)},[ke]),a.useEffect(()=>{Rt(null)},[x]),a.useEffect(()=>{if(F.current=Fe,de.current){de.current=!1;return}if(!x){I(),D(null),R("saved");return}if(Fe===A.current){I(),V.current||(D(null),R("saved"));return}const e=Dt.current;if(Dt.current=null,U==="error"&&e===null)return;const n=e??600;if(V.current){Ae.current=!0,R("pending");return}_n(n)},[I,Fe,U,_n,x]),a.useEffect(()=>{x&&(V.current||Fe===A.current&&U!=="error"&&U!=="saved"&&(D(null),R("saved")))},[Fe,U,x]),a.useEffect(()=>{if(typeof window>"u")return;const e=n=>{F.current!==A.current&&(n.preventDefault(),n.returnValue="")};return window.addEventListener("beforeunload",e),()=>window.removeEventListener("beforeunload",e)},[]),a.useEffect(()=>{if(typeof document>"u")return;const e=()=>{document.visibilityState==="hidden"&&H("visibility-hidden")};return document.addEventListener("visibilitychange",e),()=>document.removeEventListener("visibilitychange",e)},[H]),a.useEffect(()=>{if(!ct||typeof document>"u")return;const e=n=>{const r=n.target;r instanceof Node&&(bn.current?.contains(r)||dt(!1))};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[ct]),a.useEffect(()=>{if(!$t||typeof document>"u")return;const e=n=>{const r=n.target;r instanceof Node&&(gn.current?.contains(r)||We(!1))};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[$t]),a.useEffect(()=>()=>{I()},[I]),a.useEffect(()=>{if(!le)return;const e=window.setTimeout(()=>Pt(!1),2e3);return()=>window.clearTimeout(e)},[le]),a.useEffect(()=>{if(!mt)return;const e=window.setTimeout(()=>At(!1),2e3);return()=>window.clearTimeout(e)},[mt]),a.useEffect(()=>{if(!pt)return;const e=window.setTimeout(()=>Et(!1),2e3);return()=>window.clearTimeout(e)},[pt]);const ee=a.useCallback((e,n,r=300)=>{ae(i=>Ie(i.map(c=>c.id===e?n(c):c))),Y(r)},[Y]),Qn=a.useCallback(e=>{z&&(ee(z.id,n=>({...n,color:e})),an(e),dt(!1))},[z,ee]),wn=a.useCallback(async()=>{if(!(!d||!await H("session-switch"))){X(!0),h(null);try{const n=await wt(d);be(!1),await Q(d,{requestedSessionId:n.id,autoCreateIfEmpty:!1}),Be("select")}catch(n){h(n instanceof Error?n.message:"Failed to create session."),be(!0)}finally{X(!1)}}},[d,wt,H,Q]),es=a.useCallback(e=>{if(e!=="select"&&!B){Qe(!1),h("No session exists for this image yet."),be(!0);return}h(null),be(!1),Qe(!1),Be(e)},[B]),ts=a.useCallback(async()=>{if(!(!d||!B||!await H("duplicate"))){X(!0),h(null);try{const n=Ie(N.map((p,j)=>Xo(p,j))),r=await Ce(`/api/taskforce/annotated-attachments/sessions?${J}`,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json",...E},body:JSON.stringify({taskId:d.taskId,baseImageAssetId:d.assetId,title:Vo(Re||B.title,d),globalInstruction:Pe,annotations:n})},T),i=await r.json().catch(()=>({}));if(!r.ok)throw new Error(String(i?.error||"Failed to duplicate session."));const c=i?.session;if(!c?.id)throw new Error("Failed to duplicate session.");jn(c),Be("select")}catch(n){h(n instanceof Error?n.message:"Failed to duplicate session.")}finally{X(!1)}}},[d,N,Pe,Re,jn,H,E,T,B,J]),ns=a.useCallback(async()=>H("manual"),[H]),Cn=a.useCallback(async()=>{if(x){ln(!0),h(null);try{const e=await Ce(`/api/taskforce/annotated-attachments/sessions/${encodeURIComponent(x)}/payload?${J}`,{credentials:"include",headers:E},T),n=await e.json().catch(()=>({}));if(!e.ok)throw new Error(String(n?.error||"Failed to load payload preview."));Rt(n?.payload||null)}catch(e){h(e instanceof Error?e.message:"Failed to load payload preview.")}finally{ln(!1)}}},[E,T,x,J]),ss=a.useCallback(()=>{x&&H("payload-preview").then(e=>{e&&(Bt(!0),Cn())})},[H,Cn,x]),In=a.useCallback(async e=>{if(!oe||!navigator.clipboard||typeof navigator.clipboard.writeText!="function"){h("Clipboard copy is not available in this browser.");return}try{const n=e==="json"?JSON.stringify(oe,null,2):Fn(oe);await navigator.clipboard.writeText(n),Pt(e)}catch(n){h(n instanceof Error?n.message:"Failed to copy payload content."),Pt(!1)}},[oe]),as=a.useCallback(async()=>{if(!kt||!navigator.clipboard||typeof navigator.clipboard.writeText!="function"){h("Clipboard copy is not available in this browser.");return}try{await navigator.clipboard.writeText(kt),At(!0)}catch(e){h(e instanceof Error?e.message:"Failed to copy task id."),At(!1)}},[kt]),os=a.useCallback(async()=>{if(!at||!navigator.clipboard||typeof navigator.clipboard.writeText!="function"){h("Clipboard copy is not available in this browser.");return}try{await navigator.clipboard.writeText(at),Et(!0)}catch(e){h(e instanceof Error?e.message:"Failed to copy image reference."),Et(!1)}},[at]),rs=a.useCallback(async()=>{if(!x||!await H("delete-session"))return;const n=(B?.title||"Untitled session").trim()||"Untitled session";if(window.confirm(`Delete the annotated attachment session "${n}"?`)){X(!0),h(null);try{const r=await Ce(`/api/taskforce/annotated-attachments/sessions/${encodeURIComponent(x)}?${J}`,{method:"DELETE",credentials:"include",headers:E},T),i=await r.json().catch(()=>({}));if(!r.ok)throw new Error(String(i?.error||"Failed to delete session."));kn(x),Be("select")}catch(r){h(r instanceof Error?r.message:"Failed to delete session.")}finally{X(!1)}}},[H,kn,E,T,B,x,J]),Xt=a.useCallback(()=>{C&&(ae(e=>Ie(e.filter(n=>n.id!==C))),L(null),Y(300))},[Y,C]),De=a.useCallback(e=>{const n=tr(e),r=Te.current;if(!r||n===P){Ft(n);return}const i=(r.scrollLeft+r.clientWidth/2)*(n/P)-r.clientWidth/2,c=(r.scrollTop+r.clientHeight/2)*(n/P)-r.clientHeight/2;Ft(n),window.requestAnimationFrame(()=>{r.scrollLeft=Math.max(0,i),r.scrollTop=Math.max(0,c)})},[P]),is=a.useCallback(()=>{De(P+.25)},[De,P]),ls=a.useCallback(()=>{De(P-.25)},[De,P]),cs=a.useCallback(()=>{De(1);const e=Te.current;e&&window.requestAnimationFrame(()=>{e.scrollLeft=0,e.scrollTop=0})},[De]),Sn=a.useCallback(e=>{C&&ae(n=>{const r=n.findIndex(c=>c.id===C);if(r===-1)return n;const i=e==="up"?r-1:r+1;return i<0||i>=n.length?n:(Y(300),qo(n,r,i))})},[Y,C]);a.useEffect(()=>{if(!C)return;const e=n=>{n.key==="Delete"&&(Go(n.target)||(n.preventDefault(),Xt()))};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[Xt,C]);const O=a.useCallback(e=>{const n=mn.current?.getBoundingClientRect();return!n||n.width<=0||n.height<=0?null:{x:_((e.clientX-n.left)/n.width),y:_((e.clientY-n.top)/n.height)}},[]),ds=a.useCallback(e=>{if(G&&ke){const i=Te.current;if(!i)return;q.current={pointerId:e.pointerId,startX:e.clientX,startY:e.clientY,scrollLeft:i.scrollLeft,scrollTop:i.scrollTop},e.currentTarget.setPointerCapture(e.pointerId),e.preventDefault();return}if(!x)return;if($==="select"){L(null);return}const n=O(e);if(!n)return;if($==="pin"||$==="text-note"){const i=Ln($,n,n,lt);ae(c=>Ie([...c,i])),L(i.id),Y(300),Be("select");return}_e.current=n;const r=Ln($,n,n,lt);ue.current={annotationId:r.id,kind:$},e.currentTarget.setPointerCapture?.(e.pointerId),ae(i=>Ie([...i,r])),L(r.id),Y(300)},[ke,lt,Y,G,O,x,$]),us=a.useCallback(e=>{if(q.current?.pointerId===e.pointerId){e.currentTarget.releasePointerCapture?.(e.pointerId);return}if(!_e.current||!ue.current||$!=="box"&&$!=="arrow")return;const n=O(e);_e.current=null,ue.current=null,e.currentTarget.releasePointerCapture?.(e.pointerId),n&&Be("select")},[O,$]),Nn=a.useCallback((e,n)=>{if($!=="select"||G)return;const r=O(e);r&&(Ee.current={annotationId:n.id,originPointer:r,originAnnotation:n},L(n.id),e.stopPropagation())},[G,O,$]),fs=a.useCallback(e=>{if(q.current?.pointerId===e.pointerId){const u=Te.current;if(!u)return;const f=e.clientX-q.current.startX,v=e.clientY-q.current.startY;u.scrollLeft=q.current.scrollLeft-f,u.scrollTop=q.current.scrollTop-v;return}if(ue.current&&_e.current){const u=O(e);if(!u)return;const{annotationId:f,kind:v}=ue.current,k=_e.current;ee(f,S=>v==="box"&&S.kind==="box"?{...S,x:_(Math.min(k.x,u.x)),y:_(Math.min(k.y,u.y)),width:Se(Math.abs(u.x-k.x)),height:Se(Math.abs(u.y-k.y))}:v==="arrow"&&S.kind==="arrow"?{...S,x:k.x,y:k.y,x2:u.x,y2:u.y}:S);return}if(Me.current){const u=O(e);if(!u)return;const{annotationId:f,originPointer:v,originAnnotation:k}=Me.current,S=u.x-v.x,K=u.y-v.y;ee(f,()=>({...k,width:Se(k.width+S),height:Se(k.height+K)}));return}if(Le.current){const u=O(e);if(!u)return;const{annotationId:f,endpoint:v,originPointer:k,originAnnotation:S}=Le.current,K=u.x-k.x,ot=u.y-k.y;ee(f,()=>v==="tail"?{...S,x:_(S.x+K),y:_(S.y+ot)}:{...S,x2:_(S.x2+K),y2:_(S.y2+ot)});return}if(!Ee.current)return;const n=O(e);if(!n)return;const{annotationId:r,originPointer:i,originAnnotation:c}=Ee.current,p=n.x-i.x,j=n.y-i.y;ee(r,()=>c.kind==="pin"||c.kind==="text-note"?{...c,x:_(c.x+p),y:_(c.y+j)}:c.kind==="box"?{...c,x:_(c.x+p),y:_(c.y+j)}:{...c,x:_(c.x+p),y:_(c.y+j),x2:_(c.x2+p),y2:_(c.y2+j)})},[O,ee]),ms=a.useCallback(()=>{_e.current=null,Ee.current=null,Me.current=null,Le.current=null,ue.current=null,q.current=null},[]),ps=a.useCallback(()=>{_e.current=null,Ee.current=null,Me.current=null,Le.current=null,ue.current=null,q.current=null},[]),hs=a.useCallback(()=>{Ee.current=null,Me.current=null,Le.current=null,ue.current=null,q.current=null},[]),bs=a.useCallback((e,n)=>{if($!=="select"||G)return;const r=O(e);r&&(Me.current={annotationId:n.id,originPointer:r,originAnnotation:n},L(n.id),e.stopPropagation())},[G,O,$]),$n=a.useCallback((e,n,r)=>{if($!=="select"||G)return;const i=O(e);i&&(Le.current={annotationId:n.id,originPointer:i,originAnnotation:n,endpoint:r},L(n.id),e.stopPropagation())},[G,O,$]),gs=B?.updatedAt?Qt(B.updatedAt):"Not saved yet";return t.jsxs("div",{className:s.shell,children:[t.jsxs("section",{className:`tf-surface-panel ${s.panel} ${s.sessionPanel}`,children:[t.jsx("div",{className:s.sessionContextBar,children:d?.taskId?t.jsxs(t.Fragment,{children:[t.jsx("div",{className:s.sessionContextLeft,children:Ne?t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${s.ghostBtn} ${s.backToTaskBtn}`,onClick:()=>{H("back-to-task").then(e=>{e&&d.taskId&&Ne(d.taskId)})},"aria-label":"Back to task",title:"Back to task",children:t.jsx(_s,{size:16})}):t.jsx("div",{className:s.sessionContextSpacer,"aria-hidden":"true"})}),t.jsx("div",{className:s.sessionContextRight,children:t.jsx(vs,{copied:mt,onClick:()=>{as()},title:"Copy task id",ariaLabel:mt?"Copied task id":"Copy task id",label:kt})})]}):t.jsxs(t.Fragment,{children:[t.jsx("div",{className:s.sessionContextLeft,children:t.jsx("span",{className:`tf-label-micro ${s.sessionContextLabel}`,children:"Unattached Image"})}),t.jsx("div",{className:s.sessionContextRight,children:t.jsx("div",{className:s.sessionContextSpacer,"aria-hidden":"true"})})]})}),t.jsxs("div",{className:s.panelHeader,children:[t.jsxs("div",{className:s.panelHeaderText,children:[t.jsx("div",{className:`tf-heading-card ${s.panelTitle}`,children:"Sessions"}),d?null:t.jsx("div",{className:"tf-text-secondary",children:"Open an image attachment to begin"})]}),t.jsx("div",{className:s.sessionActions,children:t.jsx("button",{type:"button",className:`tf-control-icon ${s.iconButton}`,onClick:()=>{wn()},disabled:!d||W,"aria-label":"Create session",title:"Create session",children:t.jsx(js,{size:16})})})]}),d?ut?t.jsx("div",{className:s.emptyState,children:t.jsx("p",{className:"tf-empty-copy",children:"Loading sessions…"})}):t.jsx("div",{className:`tf-scrollbar ${s.sessionList}`,children:he.length===0?t.jsxs("div",{className:s.sessionEmptyState,children:[t.jsx("div",{className:`tf-heading-card ${s.sessionTitle}`,children:"No sessions yet"}),t.jsx("div",{className:`tf-text-secondary ${s.annotationSummary}`,children:"Create the first annotation session for this image."})]}):he.map(e=>{const n=x===e.id,r=n&&$t,i=Yo(n?Pe:e.globalInstruction),c=(n?Re:e.title)||"Untitled session";return t.jsxs("div",{className:`tf-surface-elevated ${s.sessionCard} ${n?s.sessionCardActive:""}`,ref:n?gn:void 0,onBlur:r?p=>{const j=p.relatedTarget;j instanceof Node&&p.currentTarget.contains(j)||We(!1)}:void 0,children:[r?t.jsxs("div",{className:s.sessionCardBody,children:[t.jsxs("div",{className:s.sessionMeta,children:[t.jsx("label",{className:"tf-field-label",htmlFor:"annotated-session-title",children:"Session title"}),t.jsx("input",{id:"annotated-session-title",className:`tf-field-shell ${s.textInput} ${s.sessionTitleInput}`,value:Re,onChange:p=>{Xe(p.target.value),Y(600)},placeholder:"Session title"}),t.jsx("span",{className:`tf-text-meta ${s.sessionTimestamp}`,children:Qt(e.updatedAt)})]}),St(e)?t.jsxs("div",{className:`tf-text-secondary ${s.sessionCreator}`,children:["Created by ",St(e)]}):null,t.jsxs("div",{className:s.sessionInstructionEditor,children:[t.jsx("label",{className:"tf-field-label",htmlFor:"annotated-session-instruction",children:"Session instruction"}),t.jsx("textarea",{id:"annotated-session-instruction",className:`tf-field-shell ${s.textArea} ${s.sessionInstructionField}`,value:Pe,onChange:p=>{Ve(p.target.value),Y(600)},placeholder:"Add overall instructions, context, or framing for this session."})]}),t.jsxs("div",{className:`tf-text-secondary ${s.annotationSummary}`,children:[e.annotations.length," annotation",e.annotations.length===1?"":"s"]})]}):t.jsxs("button",{type:"button",className:s.sessionCardButton,onClick:()=>{if(n){We(!0);return}H("session-switch").then(p=>{p&&($e(e.id),fe(e,d))})},"aria-pressed":n,children:[t.jsxs("div",{className:s.sessionMeta,children:[t.jsx("span",{className:`tf-heading-card ${s.sessionTitle}`,children:c}),t.jsx("span",{className:`tf-text-meta ${s.sessionTimestamp}`,children:Qt(e.updatedAt)})]}),St(e)?t.jsxs("div",{className:`tf-text-secondary ${s.sessionCreator}`,children:["Created by ",St(e)]}):null,i?t.jsx("div",{className:`tf-text-secondary ${s.sessionInstructionPreview}`,children:i}):null,t.jsxs("div",{className:`tf-text-secondary ${s.annotationSummary}`,children:[e.annotations.length," annotation",e.annotations.length===1?"":"s"]})]}),n?t.jsx("div",{className:s.sessionCardFooter,children:t.jsxs(t.Fragment,{children:[t.jsx("button",{type:"button",className:`tf-button-ghost ${s.toolRailButton} ${s.iconButton}`,onClick:()=>{ts()},disabled:W,"aria-label":"Duplicate session",title:`Duplicate session "${c}"`,children:t.jsx(Zt,{size:16})}),t.jsx("button",{type:"button",className:`tf-button-ghost ${s.toolRailButton} ${s.iconButton}`,onClick:()=>{rs()},disabled:W,"aria-label":"Delete session",title:`Delete session "${c}"`,children:t.jsx(Tn,{size:16})})]})}):null]},e.id)})}):t.jsxs("div",{className:s.emptyState,children:[t.jsx("strong",{className:"tf-empty-title",children:"No image selected"}),t.jsx("p",{className:"tf-empty-copy",children:"Open an image attachment from a task to start an annotated session."})]})]}),t.jsxs("section",{className:`tf-surface-panel ${s.panel} ${s.canvasPanel}`,children:[t.jsxs("div",{className:s.panelHeader,children:[t.jsxs("div",{className:s.canvasHeading,children:[t.jsx("div",{className:"tf-heading-card",children:d?.displayName||"Annotated attachment"}),t.jsx("div",{className:"tf-text-secondary",children:B?`${N.length} markers · ${gs}`:"Pick or create a session"})]}),at?t.jsx(Ts,{copied:pt,onClick:()=>{os()},title:"Copy image reference",ariaLabel:pt?"Copied image reference":"Copy image reference",label:at}):null]}),t.jsxs("div",{className:s.toolRail,children:[t.jsxs("div",{className:`${s.toolbarCluster} ${s.toolbarViewportCluster}`,children:[t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${s.ghostBtn} ${s.toolbarButton}`,onClick:()=>{ns()},disabled:!B||W||!xn&&U!=="error","aria-label":W?"Saving session":"Save session",title:W?"Saving session":"Save session",children:t.jsx(ks,{size:18})}),t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${s.ghostBtn} ${s.toolbarButton}`,onClick:()=>ht(!0),disabled:qe,"aria-label":"Open image",title:"Open image",children:t.jsx(ws,{size:18})}),t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${s.ghostBtn} ${s.toolbarButton}`,onClick:()=>{Jn()},disabled:gt,"aria-label":gt?"Pasting image":"Paste image",title:gt?"Pasting image":"Paste image",children:gt?t.jsx(An,{size:18,className:Bn.spin}):t.jsx(Cs,{size:18})}),t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${s.ghostBtn} ${s.toolbarButton}`,onClick:()=>{B&&qn()},disabled:!B||!xn,"aria-label":"Reset unsaved changes",title:"Reset unsaved changes",children:t.jsx(Is,{size:18})}),t.jsx("button",{type:"button",className:`tf-button-ghost ${s.toolRailButton} ${s.iconButton}`,onClick:ls,disabled:!d||ce||P<=.25,"aria-label":"Zoom out",children:t.jsx(Ss,{size:18})}),t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${s.ghostBtn} ${s.toolbarButton}`,onClick:cs,disabled:!d||ce||P===1,"aria-label":`Reset zoom to 100 percent (currently ${Yt})`,title:`Reset zoom to 100% (currently ${Yt})`,children:t.jsx("span",{children:Yt})}),t.jsx("button",{type:"button",className:`tf-button-ghost ${s.toolRailButton} ${s.iconButton}`,onClick:is,disabled:!d||ce||P>=4,"aria-label":"Zoom in",children:t.jsx(Ns,{size:18})}),t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${s.toolBtn} ${s.toolbarButton} ${G?s.toolBtnActive:""}`,onClick:()=>Qe(e=>!e),disabled:!d||ce||!ke,"aria-label":"Pan canvas",title:"Pan canvas",children:t.jsx($s,{size:18})})]}),t.jsx("span",{className:s.toolbarSeparator,"aria-hidden":"true"}),t.jsxs("div",{className:s.toolbarActions,children:[t.jsx("div",{className:s.toolbarSelectionActions,children:z?t.jsxs(t.Fragment,{children:[t.jsxs("div",{ref:bn,className:s.toolbarColorPicker,children:[t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${s.ghostBtn} ${s.toolbarButton} ${s.colorPickerButton}`,onClick:()=>dt(e=>!e),"aria-label":"Marker color","aria-expanded":ct,title:"Marker color",children:t.jsx("span",{className:s.colorPickerSwatch,style:{backgroundColor:Ut},"aria-hidden":"true"})}),ct?t.jsx("div",{className:s.colorPickerPopover,role:"menu","aria-label":"Marker color options",children:Uo.map(e=>t.jsx("button",{type:"button",className:`${s.colorOption} ${Ut===e?s.colorOptionActive:""}`,style:{backgroundColor:e},onClick:()=>Qn(e),"aria-label":`Use marker color ${e}`,"aria-pressed":Ut===e},e))}):null]}),t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${s.ghostBtn} ${s.toolbarButton}`,onClick:Xt,"aria-label":"Delete marker",title:"Delete selected marker",children:t.jsx(Tn,{size:18})}),t.jsx("div",{className:s.toolbarGeometryFields,"aria-label":"Marker geometry percent controls",children:Qo(z).map(e=>t.jsxs("label",{className:s.toolbarGeometryField,children:[t.jsx("span",{className:`tf-text-meta ${s.toolbarGeometryLabel}`,children:e.label}),t.jsx("input",{className:`tf-field-shell ${s.toolbarGeometryInput}`,type:"number",min:0,max:100,step:.1,value:e.value,onChange:n=>{const r=Jo(n.target.value);r!==null&&ee(z.id,i=>Zo(i,e.key,r))},"aria-label":`${e.label} percent`})]},e.key))})]}):null}),t.jsxs("div",{className:s.toolbarUtilities,children:[t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${s.ghostBtn} ${s.payloadBtn} ${s.toolbarButton}`,onClick:ss,disabled:!B||ft,"aria-label":ft?"Loading payload preview":"Preview payload",title:ft?"Loading payload preview":"Preview payload",children:t.jsx(tn,{size:18})}),t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${s.ghostBtn} ${s.toolbarButton}`,onClick:()=>dn(!0),"aria-label":"How to use marker tools",title:"How to use marker tools",children:t.jsx(nn,{size:18})})]})]})]}),t.jsxs("div",{className:s.canvasWorkspace,children:[t.jsx("div",{className:s.canvasToolRail,"aria-label":"Annotation tools",children:Mn.map(e=>{const n=e.icon;return t.jsx("button",{type:"button",className:`tf-button-ghost ${s.toolRailButton} ${$===e.value?s.toolBtnActive:""}`,onClick:()=>es(e.value),disabled:!d,title:e.label,"aria-label":`${e.label} tool. ${It[e.value].short}`,children:t.jsx(n,{size:18})},e.value)})}),t.jsx("div",{className:s.canvasMain,children:t.jsx("div",{ref:Te,className:`tf-scrollbar ${s.canvasScroller}`,children:d?t.jsxs(t.Fragment,{children:[ce&&!Lt?t.jsx("div",{className:s.canvasStatusOverlay,"aria-live":"polite",children:t.jsxs("div",{className:s.canvasStatusCard,children:[t.jsx(An,{size:20,className:Bn.spinner}),t.jsx("span",{children:"Loading image…"})]})}):null,Lt?t.jsx("div",{className:s.canvasStatusOverlay,"aria-live":"polite",children:t.jsx("div",{className:s.canvasStatusCard,children:t.jsx("span",{children:"Image failed to load."})})}):null,t.jsx("div",{className:s.canvasFrame,children:t.jsxs("div",{className:s.canvasMedia,style:{width:b.width?`${b.width}px`:void 0,height:b.height?`${b.height}px`:void 0},children:[t.jsx("img",{ref:Ht,src:d.path,alt:d.displayName,className:s.canvasImage,onLoad:()=>{const e=Ht.current;et({width:e?.naturalWidth||0,height:e?.naturalHeight||0}),Je(!1),Ze(!1)},onError:()=>{et({width:0,height:0}),Je(!1),Ze(!0)}}),!ce&&!Lt&&B?t.jsxs("div",{ref:mn,className:`${s.overlay} ${$==="select"?s.overlaySelect:""} ${G&&ke?s.overlayPan:""}`,onPointerDown:ds,onPointerMove:fs,onPointerUp:e=>{us(e),hs()},"data-testid":"annotated-attachment-overlay",onPointerLeave:ms,onPointerCancel:ps,children:[t.jsx("svg",{className:s.overlaySvg,viewBox:Gt,preserveAspectRatio:"none","aria-hidden":"true",children:N.filter(e=>e.kind==="arrow").map(e=>{const n=Ko(e,b),r=en(e),i=C===e.id;return t.jsxs(qt.Fragment,{children:[i?t.jsxs(t.Fragment,{children:[t.jsx("line",{x1:n.shaftX1,y1:n.shaftY1,x2:n.shaftX2,y2:n.shaftY2,stroke:"color-mix(in srgb, var(--surface-elevated) 92%, transparent)",strokeWidth:14,strokeLinecap:"round"}),t.jsx("polygon",{points:n.headPoints,fill:r,stroke:"color-mix(in srgb, var(--surface-elevated) 92%, transparent)",strokeWidth:4,strokeLinejoin:"round"})]}):null,t.jsx("line",{x1:n.shaftX1,y1:n.shaftY1,x2:n.shaftX2,y2:n.shaftY2,stroke:r,strokeWidth:i?10:6,strokeLinecap:"round"}),t.jsx("polygon",{points:n.headPoints,fill:r})]},e.id)})}),t.jsx("svg",{className:s.overlayHitLayer,viewBox:Gt,preserveAspectRatio:"none",children:N.filter(e=>e.kind==="arrow").map(e=>t.jsxs(qt.Fragment,{children:[t.jsx("line",{x1:e.x*b.width,y1:e.y*b.height,x2:e.x2*b.width,y2:e.y2*b.height,className:s.arrowHitArea,"data-testid":`annotated-arrow-hit-${e.id}`,"aria-label":`Arrow marker ${Kt.get(e.id)||0}`,onPointerDown:n=>Nn(n,e),onClick:n=>{n.stopPropagation(),L(e.id)}}),C===e.id?t.jsxs(t.Fragment,{children:[t.jsx("circle",{cx:e.x*b.width,cy:e.y*b.height,r:He.hitRadius,className:s.canvasHandleHit,role:"button",tabIndex:0,"aria-label":"Move arrow tail",onPointerDown:n=>$n(n,e,"tail")}),t.jsx("circle",{cx:e.x*b.width,cy:e.y*b.height,r:He.visibleRadius,className:s.canvasHandleVisible,"aria-hidden":"true"}),t.jsx("circle",{cx:e.x2*b.width,cy:e.y2*b.height,r:He.hitRadius,className:s.canvasHandleHit,role:"button",tabIndex:0,"aria-label":"Move arrow tip",onPointerDown:n=>$n(n,e,"tip")}),t.jsx("circle",{cx:e.x2*b.width,cy:e.y2*b.height,r:He.visibleRadius,className:s.canvasHandleVisible,"aria-hidden":"true"})]}):null]},`hit-${e.id}`))}),N.filter(e=>e.kind==="arrow").map(e=>t.jsx("div",{className:`${s.annotationNumberBadge} ${s.arrowNumberBadge}`,style:{left:`${(e.x+e.x2)/2*100}%`,top:`${(e.y+e.y2)/2*100}%`,backgroundColor:en(e)},"aria-hidden":"true",children:Kt.get(e.id)||0},`arrow-number-${e.id}`)),N.filter(e=>e.kind!=="arrow").map(e=>{const n=en(e),r=Kt.get(e.id)||0,i={onPointerDown:c=>Nn(c,e),onClick:c=>{c.stopPropagation(),L(e.id)}};return e.kind==="pin"?t.jsx("button",{type:"button",...i,className:`${s.pin} ${C===e.id?s.selected:""}`,style:{left:`${e.x*100}%`,top:`${e.y*100}%`,backgroundColor:n},children:r},e.id):e.kind==="text-note"?t.jsx("button",{type:"button",...i,className:`${s.note} ${C===e.id?s.selected:""}`,style:{left:`${e.x*100}%`,top:`${e.y*100}%`,backgroundColor:n},children:r},e.id):t.jsxs("div",{className:`${s.box} ${C===e.id?s.selected:""}`,style:{left:`${e.x*100}%`,top:`${e.y*100}%`,width:`${e.width*100}%`,height:`${e.height*100}%`,borderColor:n},children:[t.jsx("span",{className:`${s.annotationNumberBadge} ${s.boxNumberBadge}`,style:{backgroundColor:n},"aria-hidden":"true",children:r}),t.jsx("button",{type:"button",...i,className:s.boxSurface,"aria-label":`Box marker ${r}`})]},e.id)}),t.jsx("svg",{className:s.overlaySvg,viewBox:Gt,preserveAspectRatio:"none",children:N.filter(e=>e.kind==="box"&&C===e.id).map(e=>t.jsxs(qt.Fragment,{children:[t.jsx("circle",{cx:(e.x+e.width)*b.width,cy:(e.y+e.height)*b.height,r:He.hitRadius,className:`${s.canvasHandleHit} ${s.canvasResizeHandleHit}`,role:"button",tabIndex:0,"aria-label":"Resize box marker",onPointerDown:n=>bs(n,e)}),t.jsx("circle",{cx:(e.x+e.width)*b.width,cy:(e.y+e.height)*b.height,r:He.visibleRadius,className:s.canvasHandleVisible,"aria-hidden":"true"})]},`box-handle-${e.id}`))})]}):null]})})]}):t.jsx("div",{className:s.emptyState,children:t.jsx("p",{className:"tf-empty-copy",children:"Select an image attachment to annotate."})})})})]}),t.jsxs("div",{className:s.statusBar,children:[t.jsx("span",{children:U==="error"?"Save failed. Retry now.":U==="saving"||U==="pending"?"Saving…":"Saved"}),rn?t.jsx("span",{children:rn}):t.jsx("span",{children:B?G&&ke?"Drag on the image to pan.":$==="select"?"Select a marker to edit it.":`Click on the image to place a ${$}.`:"Create a session to begin placing markers on this image."}),d&&!B&&Kn?t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${s.ghostBtn} ${s.toolbarButton}`,onClick:()=>{wn()},disabled:W||ut,children:W?"Creating…":"Create one now"}):null]})]}),t.jsx("section",{className:`tf-surface-panel ${s.panel} ${s.detailPanel}`,children:B?t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:s.panelHeader,children:[t.jsxs("div",{className:s.panelHeaderText,children:[t.jsx("div",{className:`tf-heading-card ${s.panelTitle}`,children:"Markers"}),t.jsxs("div",{className:"tf-text-secondary",children:[N.length," in this session"]})]}),t.jsxs("div",{className:s.sessionActions,children:[t.jsx("button",{type:"button",className:`tf-control-icon ${s.iconButton}`,onClick:()=>Sn("up"),disabled:!z||zt<=0,"aria-label":"Move marker up",children:t.jsx(Ps,{size:16})}),t.jsx("button",{type:"button",className:`tf-control-icon ${s.iconButton}`,onClick:()=>Sn("down"),disabled:!z||zt===-1||zt>=N.length-1,"aria-label":"Move marker down",children:t.jsx(Bs,{size:16})})]})]}),t.jsx("div",{className:`tf-scrollbar ${s.annotationList}`,children:N.length===0?t.jsx("div",{className:s.detailEmpty,children:t.jsx("p",{className:"tf-empty-copy",children:"Add a marker on the image to begin."})}):N.map((e,n)=>{const r=Oo[e.kind],i=Do[e.kind],c=`${i} ${n+1}`,p=zo[e.markerType||re],j=En.find(f=>f.value===(e.markerType||re))?.label||"Review",u=C===e.id;return t.jsxs("div",{className:`tf-surface-elevated ${s.annotationCard} ${u?s.annotationCardActive:""}`,children:[t.jsx("button",{type:"button",className:s.annotationCardButton,onClick:()=>L(e.id),"aria-label":i,children:t.jsxs("div",{className:s.annotationMeta,children:[t.jsx("span",{className:`tf-heading-card ${s.annotationTitle}`,children:c}),t.jsx("span",{className:`tf-text-meta ${s.annotationKind}`,"aria-hidden":"true",children:t.jsx(r,{size:16})})]})}),u?t.jsxs("div",{className:s.annotationInstructionEditor,children:[t.jsx("label",{className:"tf-field-label",htmlFor:"annotated-marker-instruction",children:"Marker instruction"}),t.jsx("textarea",{id:"annotated-marker-instruction",ref:u?pn:null,className:`tf-field-shell ${s.textArea} ${s.annotationInstructionField}`,value:e.instruction,onChange:f=>{ee(e.id,v=>({...v,instruction:f.target.value}),600)},onBlur:()=>{H("text")},placeholder:"What should the AI focus on for this marker?"}),t.jsxs("div",{className:s.annotationTypeField,children:[t.jsx("label",{className:"tf-field-label",htmlFor:"annotated-marker-type",children:"Instruction type"}),t.jsx("select",{id:"annotated-marker-type",className:`tf-field-shell ${s.select}`,value:e.markerType||re,onChange:f=>{ee(e.id,v=>Wo(v,f.target.value))},children:En.map(f=>t.jsx("option",{value:f.value,children:f.label},f.value))})]})]}):t.jsx("button",{type:"button",className:s.annotationInstructionButton,onClick:()=>L(e.id),"aria-label":`Edit ${i} instruction`,children:t.jsxs("div",{className:s.annotationInstructionEditor,children:[t.jsx("div",{className:`tf-text-secondary ${s.annotationInstructionPreview}`,children:e.instruction.trim()||"No marker instruction yet."}),t.jsx("div",{className:s.annotationPreviewFooter,children:t.jsx("span",{className:`tf-text-meta ${s.annotationInstructionTypeIcon}`,"aria-label":`Instruction type: ${j}`,title:j,children:t.jsx(p,{size:16})})})]})})]},e.id)})})]}):t.jsxs("div",{className:s.emptyState,children:[t.jsx("strong",{className:"tf-empty-title",children:"No active session"}),t.jsx("p",{className:"tf-empty-copy",children:"Create or select a session to edit annotations."})]})}),t.jsx(Jt,{isOpen:Vn,onClose:()=>{qe||(ht(!1),bt(""))},title:"Open Image",size:"sm",children:t.jsxs("form",{className:s.openImageModalBody,onSubmit:e=>{e.preventDefault(),Zn()},children:[t.jsx("label",{className:"tf-field-label",htmlFor:"annotated-open-image-reference",children:"Image reference number"}),t.jsx("input",{id:"annotated-open-image-reference",className:`tf-field-shell ${s.textInput} ${s.openImageField}`,value:Mt,onChange:e=>bt(e.target.value),placeholder:"I-24",autoFocus:!0}),t.jsxs("div",{className:s.openImageActions,children:[t.jsx("button",{type:"button",className:"tf-button-ghost tf-button-compact",onClick:()=>{ht(!1),bt("")},disabled:qe,children:"Cancel"}),t.jsx("button",{type:"submit",className:"tf-button-primary tf-button-compact",disabled:qe,children:qe?"Opening…":"Open"})]})]})}),t.jsx(Jt,{isOpen:Xn,onClose:()=>dn(!1),title:"How To Use Markers",size:"md",children:t.jsx("div",{className:s.markerHelpModalBody,children:Mn.filter(e=>e.value!=="select").map(e=>t.jsxs("div",{className:`tf-surface-inset ${s.markerHelpItem}`,children:[t.jsxs("div",{className:s.markerHelpHeader,children:[t.jsx("strong",{className:"tf-heading-card",children:e.label}),t.jsx("span",{className:"tf-text-meta",children:It[e.value].short})]}),t.jsx("p",{className:"tf-text-secondary",children:It[e.value].detail}),t.jsx("p",{className:`tf-text-body ${s.markerHelpExample}`,children:It[e.value].example})]},e.value))})}),t.jsx(Jt,{isOpen:Wn,onClose:()=>Bt(!1),title:"AI Payload",size:"lg",children:t.jsxs("div",{className:s.payloadModalBody,children:[t.jsxs("div",{className:s.payloadModalToolbar,children:[t.jsxs("div",{className:s.payloadViewToggle,children:[t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${s.toolBtn} ${Tt==="json"?s.toolBtnActive:""}`,onClick:()=>cn("json"),children:"JSON"}),t.jsx("button",{type:"button",className:`tf-button-ghost tf-button-compact ${s.toolBtn} ${Tt==="brief"?s.toolBtnActive:""}`,onClick:()=>cn("brief"),children:"AI Brief"})]}),t.jsxs("div",{className:s.payloadModalActions,children:[t.jsxs("button",{type:"button",className:`tf-button-ghost tf-button-compact ${s.ghostBtn}`,onClick:()=>{In("json")},disabled:!oe,"aria-label":le==="json"?"Copied JSON":"Copy JSON",title:le==="json"?"Copied JSON":"Copy JSON",children:[le==="json"?t.jsx(sn,{size:16}):t.jsx(Zt,{size:16}),t.jsx("span",{children:"JSON"})]}),t.jsxs("button",{type:"button",className:`tf-button-ghost tf-button-compact ${s.ghostBtn}`,onClick:()=>{In("brief")},disabled:!oe,"aria-label":le==="brief"?"Copied AI Brief":"Copy AI Brief",title:le==="brief"?"Copied AI Brief":"Copy AI Brief",children:[le==="brief"?t.jsx(sn,{size:16}):t.jsx(Zt,{size:16}),t.jsx("span",{children:"AI Brief"})]})]})]}),ft?t.jsx("div",{className:s.detailEmpty,children:t.jsx("p",{className:"tf-empty-copy",children:"Loading payload…"})}):oe?t.jsx("pre",{className:`tf-surface-inset tf-scrollbar ${s.payloadModalPreview}`,children:Tt==="json"?JSON.stringify(oe,null,2):Fn(oe)}):t.jsx("div",{className:s.detailEmpty,children:t.jsx("p",{className:"tf-empty-copy",children:"Load a payload preview to inspect the current session contract."})})]})})]})}export{dr as AnnotatedAttachmentWorkspaceShell};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
._shell_sf7jc_1{align-self:stretch;width:100%;box-sizing:border-box;display:grid;grid-template-columns:minmax(220px,280px) minmax(0,1fr) minmax(280px,340px);gap:16px;height:100%;min-height:0;padding:16px;background:radial-gradient(circle at top left,color-mix(in srgb,var(--brand-primary) 8%,transparent),transparent 26%),linear-gradient(180deg,color-mix(in srgb,var(--surface-page) 84%,var(--surface-panel)) 0%,var(--surface-page) 100%)}._panel_sf7jc_16{min-height:0;border-radius:18px;box-shadow:0 18px 38px #0f172a14}._sessionPanel_sf7jc_22,._detailPanel_sf7jc_23{display:flex;flex-direction:column;overflow:hidden}._sessionContextBar_sf7jc_29{display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:58px;padding:12px 16px;border-bottom:1px solid var(--border-default);background:color-mix(in srgb,var(--surface-inset) 88%,transparent)}._sessionContextLeft_sf7jc_40,._sessionContextRight_sf7jc_41{display:flex;align-items:center;min-width:0}._sessionContextLeft_sf7jc_40{flex:1}._sessionContextRight_sf7jc_41{justify-content:flex-end;min-width:118px}._sessionContextLabel_sf7jc_56{font-size:.84rem;font-weight:600;color:var(--text-secondary)}._sessionContextSpacer_sf7jc_62{width:118px;height:32px}._canvasPanel_sf7jc_67{display:flex;flex-direction:column;min-height:0;overflow:hidden}._canvasWorkspace_sf7jc_74{display:grid;grid-template-columns:auto minmax(0,1fr);min-height:0;flex:1}._canvasMain_sf7jc_81{display:flex;flex-direction:column;min-width:0;min-height:0}._panelHeader_sf7jc_88{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:16px;border-bottom:1px solid var(--border-default)}._panelHeaderText_sf7jc_97{min-width:0}._panelTitle_sf7jc_101{font-size:1rem}._canvasHeading_sf7jc_105{min-width:0}._sessionActions_sf7jc_109{display:inline-flex;align-items:center;gap:8px;margin-left:auto;flex-shrink:0}._sessionList_sf7jc_117,._annotationList_sf7jc_118{display:flex;flex:1 1 auto;flex-direction:column;gap:10px;min-height:0;padding:14px;overflow:auto;scrollbar-gutter:stable}._annotationList_sf7jc_118{gap:12px}._markerHelpModalBody_sf7jc_133{display:flex;flex-direction:column;gap:14px}._openImageModalBody_sf7jc_139{display:flex;flex-direction:column;gap:12px}._openImageField_sf7jc_145{width:100%}._openImageActions_sf7jc_149{display:flex;justify-content:flex-end;gap:8px}._markerHelpItem_sf7jc_155{display:flex;flex-direction:column;gap:6px;padding:12px 14px;border-radius:14px}._markerHelpHeader_sf7jc_163{display:flex;align-items:baseline;justify-content:space-between;gap:12px}._markerHelpItem_sf7jc_155 p{margin:0;line-height:1.45}._markerHelpExample_sf7jc_175{font-weight:600}._sessionCard_sf7jc_179,._annotationCard_sf7jc_180{display:flex;flex-direction:column;gap:8px;padding:12px;border-radius:14px;text-align:left;transition:border-color var(--transition-base),box-shadow var(--transition-base),transform var(--transition-base)}._sessionCard_sf7jc_179{gap:10px}._sessionEmptyState_sf7jc_197{display:flex;flex-direction:column;gap:8px;padding:8px 2px 0}._sessionCardButton_sf7jc_204,._annotationCardButton_sf7jc_214{display:flex;flex-direction:column;gap:8px;padding:0;border:0;background:transparent;text-align:left}._sessionCardBody_sf7jc_224{display:flex;flex-direction:column;gap:8px}._sessionCardActive_sf7jc_230,._annotationCardActive_sf7jc_231{border-color:var(--button-tile-active-border);box-shadow:0 0 0 1px transparent,0 12px 28px var(--brand-primary-glow-soft)}._sessionCard_sf7jc_179:hover,._annotationCard_sf7jc_180:hover{transform:translateY(-1px)}._annotationMeta_sf7jc_241{display:flex;align-items:center;justify-content:space-between;gap:8px}._annotationInstructionPreview_sf7jc_248{display:-webkit-box;overflow:hidden;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-height:1.45}._annotationPreviewFooter_sf7jc_256{display:flex;align-items:center;justify-content:flex-start;min-height:16px}._annotationInstructionEditor_sf7jc_263,._annotationTypeField_sf7jc_269{display:flex;flex-direction:column;gap:8px}._annotationInstructionButton_sf7jc_275{display:block;width:100%;padding:0;border:0;background:transparent;text-align:left}._annotationInstructionField_sf7jc_284{min-height:92px}._sessionMeta_sf7jc_288{display:flex;flex-direction:column;align-items:flex-start;gap:4px}._sessionTitle_sf7jc_295,._annotationTitle_sf7jc_296{font-size:.98rem;font-weight:700;color:var(--text-primary)}._sessionTimestamp_sf7jc_302,._annotationKind_sf7jc_303{text-transform:capitalize}._annotationInstructionTypeIcon_sf7jc_307{display:inline-flex;align-items:center;justify-content:center}._sessionInstructionPreview_sf7jc_313{line-height:1.45;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden}._sessionInstructionEditor_sf7jc_321{display:flex;flex-direction:column;gap:8px}._sessionCardFooter_sf7jc_327{display:flex;align-items:center;justify-content:flex-end;gap:8px}._toolRail_sf7jc_334{display:flex;flex-wrap:wrap;gap:8px;padding:0;border-bottom:1px solid var(--border-default);background:color-mix(in srgb,var(--surface-inset) 92%,transparent)}._canvasToolRail_sf7jc_343{display:flex;flex-direction:column;align-items:center;gap:8px;padding:0;border-right:1px solid var(--border-default);background:color-mix(in srgb,var(--surface-inset) 94%,transparent)}._toolGroup_sf7jc_353{display:inline-flex;flex-wrap:wrap;gap:8px;align-items:center;padding:4px;border:1px solid var(--border-default);border-radius:16px;background:var(--surface-panel)}._toolbarCluster_sf7jc_364{display:inline-flex;flex-wrap:wrap;gap:8px;align-items:center}._toolbarViewportCluster_sf7jc_371{margin-left:44px}._toolbarSeparator_sf7jc_375{width:1px;align-self:stretch;background:var(--border-default)}._toolBtn_sf7jc_381{white-space:nowrap}._toolRailButton_sf7jc_385{display:inline-flex;align-items:center;justify-content:center;width:44px;height:44px;padding:0;border-radius:14px}._toolbarButton_sf7jc_395{min-height:44px;border-radius:14px}._toolBtnActive_sf7jc_400{background:var(--button-tile-active-bg);border-color:var(--button-tile-active-border);color:var(--button-tile-active-text);box-shadow:0 0 0 1px transparent,0 8px 24px var(--brand-primary-glow-soft)}._toolbarActions_sf7jc_407{display:inline-flex;flex-wrap:wrap;align-items:center;gap:8px;flex:1 1 auto;min-width:0}._toolbarSelectionActions_sf7jc_416{display:inline-flex;align-items:center;gap:8px;min-width:44px;flex-wrap:wrap}._toolbarColorPicker_sf7jc_424{position:relative}._colorPickerButton_sf7jc_428{min-width:44px;padding:0}._colorPickerSwatch_sf7jc_433{width:24px;height:24px;border-radius:var(--radius-sm);border:2px solid color-mix(in srgb,var(--surface-panel) 88%,transparent);box-shadow:inset 0 0 0 1px #0f172a1f}._colorPickerPopover_sf7jc_441{position:absolute;top:calc(100% + 8px);left:0;z-index:3;display:grid;grid-template-columns:repeat(3,1fr);gap:8px;padding:10px;border:1px solid var(--border-default);border-radius:var(--radius-md);background:var(--surface-panel);box-shadow:0 18px 32px #0f172a24}._colorOption_sf7jc_456{width:24px;height:24px;padding:0;border:2px solid transparent;border-radius:var(--radius-sm);cursor:pointer;box-shadow:inset 0 0 0 1px #0f172a24}._colorOptionActive_sf7jc_466{border-color:color-mix(in srgb,var(--surface-panel) 78%,var(--brand-primary));box-shadow:inset 0 0 0 1px #0f172a24,0 0 0 2px color-mix(in srgb,var(--brand-primary) 24%,transparent)}._toolbarUtilities_sf7jc_473{margin-left:auto;display:inline-flex;flex-wrap:wrap;align-items:center;gap:8px}._toolbarGeometryFields_sf7jc_481{display:inline-flex;align-items:center;gap:8px;flex-wrap:wrap}._toolbarGeometryField_sf7jc_481{display:inline-flex;align-items:center;gap:6px}._toolbarGeometryLabel_sf7jc_494{margin:0;text-transform:uppercase;white-space:nowrap}._toolbarGeometryInput_sf7jc_500{width:68px;text-align:right}._iconButton_sf7jc_505{flex-shrink:0}._primaryBtn_sf7jc_509,._ghostBtn_sf7jc_510,._payloadBtn_sf7jc_511,._backToTaskBtn_sf7jc_512{white-space:nowrap}._backToTaskBtn_sf7jc_512{padding:7px 10px;color:var(--text-secondary);font-size:.88rem;font-weight:600}._backToTaskBtn_sf7jc_512:hover,._backToTaskBtn_sf7jc_512:focus-visible{color:var(--text-primary)}._payloadBtn_sf7jc_511{font-weight:700}._canvasScroller_sf7jc_532{position:relative;flex:1;min-height:0;overflow:auto;display:block;scrollbar-gutter:stable;background:linear-gradient(45deg,color-mix(in srgb,var(--surface-inset) 66%,var(--border-default)) 25%,transparent 25%),linear-gradient(-45deg,color-mix(in srgb,var(--surface-inset) 66%,var(--border-default)) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,color-mix(in srgb,var(--surface-inset) 66%,var(--border-default)) 75%),linear-gradient(-45deg,transparent 75%,color-mix(in srgb,var(--surface-inset) 66%,var(--border-default)) 75%);background-size:22px 22px;background-position:0 0,0 11px,11px -11px,-11px 0}._canvasFrame_sf7jc_548{position:relative;display:block;width:max-content;min-width:100%}._canvasMedia_sf7jc_555{position:relative;display:block;flex-shrink:0;margin:0 auto;overflow:hidden}._canvasStatusOverlay_sf7jc_563{position:absolute;inset:0;z-index:2;display:flex;align-items:center;justify-content:center;padding:24px;background:color-mix(in srgb,var(--surface-scrim) 68%,transparent);pointer-events:none}._canvasStatusCard_sf7jc_575{display:inline-flex;align-items:center;gap:10px;padding:12px 16px;border:1px solid color-mix(in srgb,var(--border-strong) 44%,white);border-radius:14px;background:#0f172ac7;color:#fff;box-shadow:0 18px 30px #0f172a38;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}._canvasImage_sf7jc_588{display:block;width:100%;height:100%;-webkit-user-select:none;user-select:none}._overlay_sf7jc_595{position:absolute;inset:0;cursor:crosshair}._overlaySelect_sf7jc_601{cursor:default}._overlayPan_sf7jc_605{cursor:grab}._overlaySvg_sf7jc_609{position:absolute;inset:0;display:block;width:100%;height:100%;pointer-events:none}._overlayHitLayer_sf7jc_618{position:absolute;inset:0;display:block;width:100%;height:100%;pointer-events:auto}._arrowHitArea_sf7jc_627{stroke:transparent;stroke-width:24;pointer-events:stroke;cursor:move}._canvasHandleHit_sf7jc_634{fill:transparent;pointer-events:all;cursor:grab;outline:none}._canvasResizeHandleHit_sf7jc_641{cursor:nwse-resize}._canvasHandleVisible_sf7jc_645{--canvas-handle-fill: var(--brand-primary);--canvas-handle-outline: var(--surface-elevated);--canvas-handle-shadow: 0 6px 12px rgba(15, 23, 42, .18);fill:var(--canvas-handle-fill);stroke:var(--canvas-handle-outline);stroke-width:3;vector-effect:non-scaling-stroke;filter:drop-shadow(var(--canvas-handle-shadow));pointer-events:none}._canvasHandleHit_sf7jc_634:focus-visible+._canvasHandleVisible_sf7jc_645{stroke:color-mix(in srgb,var(--brand-primary) 72%,var(--surface-elevated));stroke-width:4}._pin_sf7jc_662,._note_sf7jc_663{position:absolute;transform:translate(-50%,-50%);display:inline-flex;align-items:center;justify-content:center;min-width:28px;min-height:28px;border:2px solid var(--surface-elevated);border-radius:999px;box-shadow:0 8px 18px #0f172a38;color:#fff;font-size:.74rem;font-weight:800;pointer-events:auto}._annotationNumberBadge_sf7jc_680{position:absolute;display:inline-flex;align-items:center;justify-content:center;min-width:28px;min-height:28px;padding:0 8px;border:2px solid var(--surface-elevated);border-radius:999px;box-shadow:0 8px 18px #0f172a38;color:#fff;font-size:.74rem;font-weight:800;line-height:1;pointer-events:none;z-index:2}._note_sf7jc_663{min-width:38px;padding:0 10px;border-radius:999px}._box_sf7jc_705{position:absolute;border:2px solid;border-radius:var(--radius-sm);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--surface-elevated) 34%,transparent);background:color-mix(in srgb,var(--surface-elevated) 10%,transparent);pointer-events:auto}._boxNumberBadge_sf7jc_714{top:0;left:0;transform:translate(-28%,-36%)}._arrowNumberBadge_sf7jc_720{transform:translate(-50%,-50%)}._boxSurface_sf7jc_724{position:absolute;inset:0;border:0;background:transparent;cursor:move}._boxSurface_sf7jc_724:focus-visible{outline:2px solid color-mix(in srgb,var(--brand-primary) 34%,var(--surface-elevated));outline-offset:2px}._selected_sf7jc_737{outline:3px solid color-mix(in srgb,var(--surface-elevated) 92%,transparent);outline-offset:1px}._fieldGroup_sf7jc_742{display:flex;flex-direction:column;gap:8px;padding:14px 16px}._detailPanel_sf7jc_23 ._fieldGroup_sf7jc_742{padding-top:12px;padding-bottom:12px}._textInput_sf7jc_754,._textArea_sf7jc_755,._select_sf7jc_737{width:100%;box-sizing:border-box;font:inherit}._sessionTitleInput_sf7jc_762{font-size:1rem;font-weight:600}._sessionInstructionField_sf7jc_767{min-height:112px}._textArea_sf7jc_755{min-height:110px;resize:vertical}._detailEmpty_sf7jc_776,._emptyState_sf7jc_777,._errorState_sf7jc_778{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;min-height:240px;padding:24px;text-align:center}._payloadModalBody_sf7jc_789{display:flex;flex-direction:column;gap:12px;min-height:0}._payloadModalToolbar_sf7jc_796{display:flex;align-items:center;justify-content:space-between;gap:12px}._payloadViewToggle_sf7jc_803,._payloadModalActions_sf7jc_804{display:inline-flex;flex-wrap:wrap;align-items:center;gap:8px}._payloadModalPreview_sf7jc_811{margin:0;min-height:360px;max-height:min(70vh,720px);padding:16px;overflow:auto;scrollbar-gutter:stable;white-space:pre-wrap;word-break:break-word;font-size:.78rem;line-height:1.55;border-radius:14px;color:var(--text-body)}._statusBar_sf7jc_826{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 16px;border-top:1px solid var(--border-default);color:var(--text-secondary);font-size:.82rem;background:color-mix(in srgb,var(--surface-panel) 88%,var(--surface-inset))}._annotationSummary_sf7jc_838{font-size:.82rem;line-height:1.5}@media(max-width:1180px){._shell_sf7jc_1{grid-template-columns:minmax(0,1fr);grid-template-rows:auto minmax(320px,1fr) auto;gap:12px;padding:12px}._sessionContextBar_sf7jc_29,._panelHeader_sf7jc_88,._toolRail_sf7jc_334,._statusBar_sf7jc_826,._payloadModalToolbar_sf7jc_796,._markerHelpHeader_sf7jc_163{flex-wrap:wrap}._sessionContextRight_sf7jc_41,._sessionContextLeft_sf7jc_40,._canvasHeading_sf7jc_105{min-width:0}._sessionContextRight_sf7jc_41{width:100%;justify-content:flex-start}._toolbarActions_sf7jc_407{width:100%;margin-left:0}._toolbarUtilities_sf7jc_473{margin-left:0}._toolGroup_sf7jc_353{max-width:100%}._canvasWorkspace_sf7jc_74{grid-template-columns:minmax(0,1fr);grid-template-rows:auto minmax(0,1fr)}._toolbarViewportCluster_sf7jc_371{margin-left:0}._canvasToolRail_sf7jc_343{flex-direction:row;justify-content:flex-start;overflow-x:auto;padding:0;border-right:0;border-bottom:1px solid var(--border-default)}._statusBar_sf7jc_826{align-items:flex-start}._detailEmpty_sf7jc_776,._emptyState_sf7jc_777,._errorState_sf7jc_778{min-height:180px}}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
._index_18mna_1{display:flex;flex-direction:column;height:100%;min-height:0}._header_18mna_8{display:flex;align-items:center;justify-content:space-between;padding:14px 12px 10px;border-bottom:1px solid var(--border-subtle);flex-shrink:0}._title_18mna_17{display:flex;align-items:center;gap:6px;font-size:13px;font-weight:600;color:var(--text-primary)}._refreshBtn_18mna_26{background:transparent;border:none;color:var(--text-muted);cursor:pointer;padding:4px;border-radius:4px;display:flex;align-items:center;transition:color .15s,background .15s}._refreshBtn_18mna_26:hover{color:var(--text-primary);background:var(--bg-hover)}._refreshBtn_18mna_26:disabled{opacity:.5;cursor:not-allowed}._search_18mna_48{position:relative;padding:8px 10px;flex-shrink:0}._searchIcon_18mna_54{position:absolute;left:18px;top:50%;transform:translateY(-50%);color:var(--text-muted);pointer-events:none}._searchInput_18mna_63{width:100%;padding:6px 8px 6px 28px;background:var(--bg-primary);border:1px solid var(--border-subtle);border-radius:6px;color:var(--text-primary);font-size:12px;font-family:inherit;outline:none;box-sizing:border-box}._searchInput_18mna_63:focus{border-color:var(--brand-primary)}._list_18mna_80{flex:1;overflow-y:auto;min-height:0;padding:4px 0;scrollbar-width:thin;scrollbar-color:var(--scrollbar-thumb) var(--scrollbar-track)}._state_18mna_89{padding:24px 16px;font-size:12px;color:var(--text-muted);text-align:center;line-height:1.5}._stateError_18mna_97{padding:16px;font-size:12px;color:var(--status-error);text-align:center}._item_18mna_104{width:100%;display:flex;align-items:flex-start;gap:8px;padding:8px 12px;background:transparent;border:none;cursor:pointer;text-align:left;transition:background .12s;font-family:inherit;color:var(--text-primary);min-width:0}._item_18mna_104:hover{background:var(--bg-hover, rgba(255, 255, 255, .04))}._itemActive_18mna_124{background:var(--brand-primary-soft)}._itemActive_18mna_124:hover{background:color-mix(in srgb,var(--brand-primary) 18%,transparent)}._itemIcon_18mna_132{color:var(--text-muted);padding-top:1px;flex-shrink:0}._itemActive_18mna_124 ._itemIcon_18mna_132{color:var(--brand-primary-strong)}._itemBody_18mna_142{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}._itemTitle_18mna_150{display:block;max-width:100%;font-size:12px;font-weight:500;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-transform:capitalize}._itemTask_18mna_162{display:block;max-width:100%;font-size:11px;color:var(--text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._itemBadge_18mna_172{display:inline-flex;align-items:center;width:fit-content;padding:2px 6px;border-radius:999px;border:1px solid color-mix(in srgb,var(--status-warning) 28%,transparent);background:color-mix(in srgb,var(--status-warning) 12%,transparent);color:color-mix(in srgb,var(--status-warning) 70%,white);font-size:10px;font-weight:600}._itemMeta_18mna_185{display:flex;align-items:center;justify-content:space-between;gap:8px;width:100%;font-size:10px;color:var(--text-muted)}._itemMetaDetails_18mna_195{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._itemMetaReference_18mna_202{flex-shrink:0;font-size:10px;font-weight:600;color:var(--text-secondary)}._viewer_9t0y6_1{flex:1;display:flex;flex-direction:column;overflow:hidden;min-height:0;height:100%}._viewerMonochrome_9t0y6_10 ._metaDocumentName_9t0y6_10{color:#111!important}._viewerEditMode_9t0y6_14{background:var(--bg-primary)}._meta_9t0y6_10{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 20px;border-bottom:1px solid var(--border-subtle);background:var(--bg-secondary);flex-shrink:0;flex-wrap:wrap}._metaLeft_9t0y6_30{display:flex;align-items:center;gap:12px;flex-wrap:wrap}._metaDocumentName_9t0y6_10{font-size:14px;font-weight:700;color:var(--text-primary);max-width:min(26ch,100%);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;letter-spacing:-.015em;cursor:text}._metaRenameRow_9t0y6_49{display:inline-flex;align-items:center;gap:8px;min-width:min(420px,100%)}._typeBadge_9t0y6_56{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:999px;font-size:10px;font-weight:600;background:var(--brand-primary-soft);color:var(--brand-primary-strong);border:1px solid color-mix(in srgb,var(--brand-primary) 25%,transparent);text-transform:uppercase;letter-spacing:.3px}._typeBadgeImplementationPlan_9t0y6_71{background:color-mix(in srgb,var(--status-info) 15%,transparent);color:color-mix(in srgb,var(--status-info) 55%,white);border-color:color-mix(in srgb,var(--status-info) 25%,transparent)}._typeBadgeReview_9t0y6_77{background:color-mix(in srgb,var(--status-warning) 15%,transparent);color:color-mix(in srgb,var(--status-warning) 68%,white);border-color:color-mix(in srgb,var(--status-warning) 25%,transparent)}._typeBadgeWalkthrough_9t0y6_83{background:color-mix(in srgb,var(--status-success) 15%,transparent);color:color-mix(in srgb,var(--status-success) 60%,white);border-color:color-mix(in srgb,var(--status-success) 25%,transparent)}._metaTaskName_9t0y6_89{font-size:11px;color:var(--text-secondary);max-width:180px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._statusBadge_9t0y6_98{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:999px;border:1px solid color-mix(in srgb,var(--status-warning) 28%,transparent);background:color-mix(in srgb,var(--status-warning) 12%,transparent);color:color-mix(in srgb,var(--status-warning) 68%,white);font-size:10px;font-weight:600;letter-spacing:.2px;text-transform:uppercase}._metaDate_9t0y6_113,._metaSize_9t0y6_114{display:inline-flex;align-items:center;gap:4px;font-size:11px;color:var(--text-muted)}._actions_9t0y6_122{display:flex;align-items:center;gap:6px;flex-shrink:0}._actionBtn_9t0y6_129{display:inline-flex;align-items:center;gap:5px;padding:5px 10px;border-radius:6px;border:1px solid var(--border-subtle);background:transparent;color:var(--text-secondary);font-size:11px;font-family:inherit;cursor:pointer;transition:all .15s;white-space:nowrap}._actionBtn_9t0y6_129:hover{background:var(--bg-hover);color:var(--text-primary);border-color:var(--border-primary)}._actionBtn_9t0y6_129:disabled{opacity:.6;cursor:not-allowed}._dangerBtn_9t0y6_156{border-color:color-mix(in srgb,var(--status-error) 35%,transparent)!important;color:color-mix(in srgb,var(--status-error) 45%,white)!important}._dangerBtn_9t0y6_156:hover:not(:disabled){background:color-mix(in srgb,var(--status-error) 12%,transparent)!important;border-color:color-mix(in srgb,var(--status-error) 50%,transparent)!important;color:color-mix(in srgb,var(--status-error) 30%,white)!important}._generateBtn_9t0y6_167{background:var(--brand-primary-soft)!important;border-color:var(--brand-primary-border)!important;color:var(--brand-primary-strong)!important}._generateBtn_9t0y6_167:hover{background:color-mix(in srgb,var(--brand-primary) 24%,transparent)!important;color:color-mix(in srgb,var(--brand-primary-strong) 72%,white)!important}._editBtn_9t0y6_178{color:var(--text-primary)!important;border-color:var(--border-primary)!important}._editBtn_9t0y6_178:hover{background:color-mix(in srgb,var(--brand-primary) 10%,transparent)!important;border-color:var(--brand-primary-border)!important;color:var(--brand-primary-strong)!important}._saveBtn_9t0y6_189{background:color-mix(in srgb,var(--brand-primary) 15%,transparent)!important;border-color:var(--brand-primary-border)!important;color:var(--brand-primary-strong)!important}._saveBtn_9t0y6_189:hover:not(:disabled){background:color-mix(in srgb,var(--brand-primary) 25%,transparent)!important;color:color-mix(in srgb,var(--brand-primary-strong) 72%,white)!important}._saveBtn_9t0y6_189:disabled{opacity:.4!important;cursor:not-allowed!important}._layoutToggle_9t0y6_205{display:flex;background:var(--bg-primary);border:1px solid var(--border-subtle);border-radius:6px;overflow:hidden}._layoutBtn_9t0y6_213{padding:5px 8px;background:transparent;border:none;color:var(--text-muted);cursor:pointer;display:flex;align-items:center;transition:all .12s}._layoutBtn_9t0y6_213:hover{color:var(--text-primary);background:var(--bg-hover)}._layoutBtnActive_9t0y6_229{color:var(--brand-primary-strong);background:var(--brand-primary-soft)}._saveStatus_9t0y6_234{display:inline-flex;align-items:center;gap:4px;font-size:11px}._saveStatusSaved_9t0y6_241{color:var(--status-success)}._saveStatusError_9t0y6_245{color:var(--status-error);cursor:help}._unsaved_9t0y6_250{font-size:11px;color:color-mix(in srgb,var(--status-warning) 70%,white);font-style:italic}._viewerContent_9t0y6_256{flex:1;overflow-y:auto;padding:16px 24px 40px;min-height:0;scrollbar-width:thin;scrollbar-color:var(--scrollbar-thumb) var(--scrollbar-track)}._viewerBody_9t0y6_265{flex:1;min-height:0;display:grid;grid-template-columns:minmax(0,1fr) 360px;align-items:stretch}._viewerBodyFullWidth_9t0y6_273{grid-template-columns:minmax(0,1fr)}._viewerMain_9t0y6_277{border-right:1px solid var(--border-subtle)}._viewerBodyFullWidth_9t0y6_273 ._viewerMain_9t0y6_277{border-right:none}._reviewRail_9t0y6_285{min-height:0;overflow:hidden;background:color-mix(in srgb,var(--bg-secondary) 78%,transparent)}._printHint_9t0y6_291{padding:0 24px 18px;color:var(--text-muted);font-size:11px;line-height:1.45}._reviewSection_9t0y6_298{height:100%;min-height:0;padding:18px 18px 18px 16px;display:flex;flex-direction:column;gap:12px}._reviewHeader_9t0y6_307{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;flex-wrap:wrap}._reviewTitle_9t0y6_315{display:inline-flex;align-items:center;gap:8px;font-size:13px;font-weight:700;color:var(--text-primary)}._reviewSubtitle_9t0y6_324{margin:4px 0 0;color:var(--text-muted);font-size:11px;line-height:1.45}._reviewControls_9t0y6_331{display:flex;align-items:center;gap:8px;flex-wrap:wrap}._reviewSelect_9t0y6_338{min-width:180px}._reviewSessionMeta_9t0y6_342{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:11px}._reviewStatusResolved_9t0y6_350{border-color:color-mix(in srgb,var(--status-success) 30%,transparent);background:color-mix(in srgb,var(--status-success) 12%,transparent);color:color-mix(in srgb,var(--status-success) 66%,white)}._reviewSessionLabel_9t0y6_356{color:var(--text-secondary);font-weight:600}._reviewTitleEditRow_9t0y6_361{display:inline-flex;align-items:center;gap:8px;flex-wrap:wrap}._reviewSessionTimestamp_9t0y6_368{color:var(--text-muted)}._reviewAnchorLabel_9t0y6_372{color:var(--text-muted);font-size:11px;padding:0 4px}._reviewComposer_9t0y6_378{flex:1;display:flex;flex-direction:column;gap:8px}._reviewAnchorChip_9t0y6_385{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:8px 10px;border:1px solid var(--border-subtle);border-radius:10px;background:var(--bg-secondary);color:var(--text-secondary);font-size:11px}._reviewAnchorSnippet_9t0y6_398{color:var(--text-primary);font-style:italic}._reviewAnchorClear_9t0y6_403{border:none;background:transparent;color:var(--brand-primary-strong);font:inherit;cursor:pointer;padding:0}._reviewAnchorClear_9t0y6_403:hover{text-decoration:underline}._reviewCommentActions_9t0y6_416{display:inline-flex;align-items:center;gap:6px;margin-left:auto}._reviewCommentAction_9t0y6_416{border:none;background:transparent;color:var(--text-muted);font:inherit;cursor:pointer;padding:0}._reviewCommentAction_9t0y6_416:hover{color:var(--text-primary);text-decoration:underline}._reviewCommentEditor_9t0y6_437{display:flex;flex-direction:column;gap:8px}._viewerState_9t0y6_443{padding:40px;text-align:center;color:var(--text-muted);font-size:13px}._viewerStateError_9t0y6_450{padding:40px;text-align:center;color:var(--status-error);font-size:13px}._editorArea_9t0y6_457{flex:1;display:flex;min-height:0;overflow:hidden}._editorPane_9t0y6_464{flex:1;display:flex;flex-direction:column;min-width:0;border-right:1px solid var(--border-subtle)}._editorLayoutSplit_9t0y6_472 ._editorPane_9t0y6_464,._editorLayoutSplit_9t0y6_472 ._previewPane_9t0y6_473,._editorLayoutEditor_9t0y6_477 ._editorPane_9t0y6_464,._editorLayoutPreview_9t0y6_478 ._previewPane_9t0y6_473{flex:1}._editorPaneLabel_9t0y6_482{padding:6px 12px;font-size:10px;font-weight:600;color:var(--text-muted);text-transform:uppercase;letter-spacing:.5px;border-bottom:1px solid var(--border-subtle);background:var(--bg-secondary);flex-shrink:0}._editorTextarea_9t0y6_494{flex:1;width:100%;resize:none;background:var(--bg-primary);color:var(--text-primary);border:none;outline:none;padding:16px;font-family:Fira Code,Cascadia Code,JetBrains Mono,monospace;font-size:13px;line-height:1.65;tab-size:2;caret-color:var(--brand-primary-strong);scrollbar-width:thin;scrollbar-color:var(--scrollbar-thumb) var(--scrollbar-track);min-height:0;box-sizing:border-box}._editorTextarea_9t0y6_494::selection{background:color-mix(in srgb,var(--brand-primary) 30%,transparent)}._previewPane_9t0y6_473{flex:1;display:flex;flex-direction:column;min-width:0;overflow:hidden}._previewPane_9t0y6_473 .docMarkdown{flex:1;overflow-y:auto;padding:16px 24px 40px;min-height:0;max-width:none;scrollbar-width:thin;scrollbar-color:var(--scrollbar-thumb) var(--scrollbar-track)}._markdownSurface_9t0y6_536{color:var(--text-body);font-size:14px;line-height:1.7;max-width:800px}._markdownSurface_9t0y6_536 h1,._markdownSurface_9t0y6_536 h2,._markdownSurface_9t0y6_536 h3,._markdownSurface_9t0y6_536 h4{color:var(--text-primary);font-weight:700;margin:1.5em 0 .5em;line-height:1.3}._markdownSurface_9t0y6_536 h1{font-size:1.6em}._markdownSurface_9t0y6_536 h2{font-size:1.25em;border-bottom:1px solid var(--border-subtle);padding-bottom:.3em}._markdownSurface_9t0y6_536 h3{font-size:1.1em}._markdownSurface_9t0y6_536 p{margin:.8em 0}._markdownSurface_9t0y6_536 a{color:var(--brand-primary-strong);text-decoration:underline;text-underline-offset:2px}._markdownSurface_9t0y6_536 a:hover{color:color-mix(in srgb,var(--brand-primary-strong) 72%,white)}._markdownSurface_9t0y6_536 code{font-family:Fira Code,Cascadia Code,monospace;font-size:.875em;background:var(--brand-primary-soft);padding:2px 5px;border-radius:4px;color:var(--code-inline-text, var(--brand-primary-strong))}._markdownSurface_9t0y6_536 pre{background:var(--bg-primary);border:1px solid var(--border-subtle);border-radius:8px;padding:16px;overflow-x:auto;margin:1em 0}._markdownSurface_9t0y6_536 pre code{background:none;padding:0;font-size:13px;color:var(--code-block-text, var(--text-body))}._markdownSurface_9t0y6_536 blockquote{border-left:3px solid color-mix(in srgb,var(--brand-primary) 50%,transparent);padding-left:16px;margin:1em 0;color:var(--text-secondary);font-style:italic}._markdownSurface_9t0y6_536 table{border-collapse:collapse;width:100%;margin:1em 0;font-size:13px}._markdownSurface_9t0y6_536 th,._markdownSurface_9t0y6_536 td{border:1px solid var(--border-subtle);padding:8px 12px;text-align:left}._markdownSurface_9t0y6_536 th{background:var(--bg-secondary);font-weight:600;color:var(--text-secondary);font-size:11px;text-transform:uppercase;letter-spacing:.4px}._markdownSurface_9t0y6_536 ul,._markdownSurface_9t0y6_536 ol{padding-left:1.5em;margin:.5em 0}._markdownSurface_9t0y6_536 li{margin:.3em 0}._markdownSurface_9t0y6_536 li._task-list-item_9t0y6_647,._markdownSurface_9t0y6_536 li[data-task-item=true]{list-style:none}._markdownSurface_9t0y6_536 li:has(input[type=checkbox]){list-style:none!important;list-style-type:none!important}._markdownSurface_9t0y6_536 ul._contains-task-list_9t0y6_657,._markdownSurface_9t0y6_536 ol._contains-task-list_9t0y6_657{padding-left:.25em}._markdownSurface_9t0y6_536 ul:has(li input[type=checkbox]),._markdownSurface_9t0y6_536 ol:has(li input[type=checkbox]){padding-left:1.25em!important}._markdownSurface_9t0y6_536 li._task-list-item_9t0y6_647>input[type=checkbox],._markdownSurface_9t0y6_536 li[data-task-item=true]>input[type=checkbox]{margin-right:.45em;cursor:pointer;accent-color:var(--brand-primary-strong)}._markdownSurface_9t0y6_536 hr{border:none;border-top:1px solid var(--border-subtle);margin:1.5em 0}._markdownSurface_9t0y6_536 img{max-width:100%;border-radius:8px}._viewerMonochrome_9t0y6_10 ._viewerContent_9t0y6_256,._viewerMonochrome_9t0y6_10 ._markdownSurface_9t0y6_536{background:#fff!important}@media(max-width:1100px){._viewerBody_9t0y6_265{grid-template-columns:minmax(0,1fr)}._viewerMain_9t0y6_277{border-right:none;border-bottom:1px solid var(--border-subtle)}._reviewRail_9t0y6_285{max-height:480px}._reviewSection_9t0y6_298{padding:16px 24px 18px}}._viewerMonochrome_9t0y6_10 ._markdownSurface_9t0y6_536,._viewerMonochrome_9t0y6_10 ._markdownSurface_9t0y6_536 h1,._viewerMonochrome_9t0y6_10 ._markdownSurface_9t0y6_536 h2,._viewerMonochrome_9t0y6_10 ._markdownSurface_9t0y6_536 h3,._viewerMonochrome_9t0y6_10 ._markdownSurface_9t0y6_536 h4,._viewerMonochrome_9t0y6_10 ._markdownSurface_9t0y6_536 p,._viewerMonochrome_9t0y6_10 ._markdownSurface_9t0y6_536 li,._viewerMonochrome_9t0y6_10 ._markdownSurface_9t0y6_536 blockquote,._viewerMonochrome_9t0y6_10 ._markdownSurface_9t0y6_536 th,._viewerMonochrome_9t0y6_10 ._markdownSurface_9t0y6_536 td,._viewerMonochrome_9t0y6_10 ._markdownSurface_9t0y6_536 a{color:#111!important}._viewerMonochrome_9t0y6_10 ._markdownSurface_9t0y6_536 code{color:#111!important;background:#f2f2f2!important}._viewerMonochrome_9t0y6_10 ._markdownSurface_9t0y6_536 pre{background:#f7f7f7!important;border-color:#d7d7d7!important}._viewerMonochrome_9t0y6_10 ._markdownSurface_9t0y6_536 pre code,._viewerMonochrome_9t0y6_10 ._markdownSurface_9t0y6_536 code,._viewerMonochrome_9t0y6_10 ._markdownSurface_9t0y6_536 a,._viewerMonochrome_9t0y6_10 ._metaTaskName_9t0y6_89,._viewerMonochrome_9t0y6_10 ._metaDate_9t0y6_113,._viewerMonochrome_9t0y6_10 ._metaSize_9t0y6_114{color:#111!important}._overlay_1unik_1{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:#0000008c;z-index:2000;padding:1rem}._modal_1unik_12{width:min(720px,100%)}._header_1unik_16{align-items:flex-start}._title_1unik_20{font-size:1rem}._docName_1unik_24{font-size:.75rem;color:var(--text-secondary);max-width:14rem;text-align:right;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._body_1unik_34{padding:.75rem 1rem 1rem;display:flex;flex-direction:column;gap:.75rem}._state_1unik_41{min-height:10rem;display:flex;align-items:center;justify-content:center;gap:.5rem;font-size:.875rem;color:var(--text-secondary);text-align:center}._stateError_1unik_52{min-height:10rem;display:flex;align-items:center;justify-content:center;gap:.5rem;font-size:.875rem;color:var(--status-error);text-align:center}._stateDone_1unik_63{min-height:10rem;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.5rem;text-align:center}._stateDone_1unik_63 strong{color:var(--text-primary);font-size:1rem}._stateDone_1unik_63 p{margin:0;font-size:.8125rem;color:var(--text-secondary)}._toolbar_1unik_84{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:.625rem .75rem;border:1px solid var(--border-default);border-radius:var(--radius-md);background:var(--surface-inset)}._toolbarCount_1unik_95{font-size:.75rem;color:var(--text-secondary)}._toolbarActions_1unik_100{display:flex;gap:.5rem}._tree_1unik_105{display:flex;flex-direction:column;gap:.125rem;max-height:22rem;overflow-y:auto}._taskRow_1unik_113{display:flex;align-items:center;gap:.375rem;padding:.4375rem .75rem;min-height:2.125rem;transition:background .1s}._taskRow_1unik_113:hover{background:#ffffff08}._taskRowDimmed_1unik_126{opacity:.4}._taskCheck_1unik_130{background:transparent;border:none;cursor:pointer;display:flex;padding:0;flex-shrink:0}._taskExpandBtn_1unik_139{background:transparent;border:none;color:var(--text-muted);cursor:pointer;display:flex;align-items:center;padding:0;flex-shrink:0;transition:color .1s}._taskExpandBtn_1unik_139:hover{color:var(--text-primary)}._taskExpandSpacer_1unik_155{width:12px;flex-shrink:0}._taskTitle_1unik_160{flex:1;font-size:.8125rem;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._taskBadge_1unik_169{font-size:.625rem;padding:.125rem .375rem;border-radius:var(--radius-sm);border:1px solid currentColor;opacity:.85;white-space:nowrap;flex-shrink:0}._footer_1unik_179{display:flex;align-items:center;justify-content:flex-end;gap:.625rem;padding:0 1rem 1rem}
|
|
@@ -1,252 +0,0 @@
|
|
|
1
|
-
import{j as e,r,s as Wt,R as Oe}from"./vendor-react-CKJs5o3c.js";import{h as Te,t as M,f as I,i as lt,j as ct,k as Gt,m as Ut,R as Kt,n as B,o as dt,q as Jt,s as Vt}from"./index-DcSI5F86.js";import{r as Qt,t as Yt,u as qt,l as Xt,au as Zt,av as We,m as en,Z as Ge,X as yt,aw as ut,e as gt,ax as xt,ay as tn,az as nn,a as sn,i as an,aA as rn,aB as on,aC as ln,aD as Se,aE as cn,s as dn,at as He,aF as un,D as mn,aG as hn,T as fn,R as pn,aH as vn,B as wn,U as yn,S as gn}from"./vendor-icons-BSUaRwF8.js";import{s as xn,M as Ce,r as je}from"./vendor-markdown-BUxTU7dS.js";import"./vendor-dnd-DRzYolkg.js";import"./vendor-router-BbWMxlnO.js";const _n="_index_18mna_1",kn="_header_18mna_8",bn="_title_18mna_17",Sn="_refreshBtn_18mna_26",Cn="_search_18mna_48",jn="_searchIcon_18mna_54",Nn="_searchInput_18mna_63",Tn="_list_18mna_80",En="_state_18mna_89",Rn="_stateError_18mna_97",An="_item_18mna_104",Dn="_itemActive_18mna_124",$n="_itemIcon_18mna_132",Bn="_itemBody_18mna_142",In="_itemTitle_18mna_150",Ln="_itemTask_18mna_162",Pn="_itemBadge_18mna_172",Mn="_itemMeta_18mna_185",zn="_itemMetaDetails_18mna_195",Fn="_itemMetaReference_18mna_202",E={index:_n,header:kn,title:bn,refreshBtn:Sn,search:Cn,searchIcon:jn,searchInput:Nn,list:Tn,state:En,stateError:Rn,item:An,itemActive:Dn,itemIcon:$n,itemBody:Bn,itemTitle:In,itemTask:Ln,itemBadge:Pn,itemMeta:Mn,itemMetaDetails:zn,itemMetaReference:Fn};function Ue(t){let c=t;try{c=decodeURIComponent(t)}catch{c=t}return c.trim().replace(/\\/g,"/").replace(/^\/+/,"").replace(/^\.\//,"").replace(/^\.taskforce\//,"")}function On(t,c){return!!(t===c||t.endsWith(`/${c}`)||c.endsWith(`/${t}`))}function mt(t){const c=Ue(String(t||""));if(!c)return null;const o=c.match(/(^|\/)(asset-[a-f0-9]{32})(?=[^/]*$)/i);return o?.[2]?o[2].toLowerCase():null}function Je(t){return t.attachmentState==="attached"||t.attachmentState==="unattached"?t.attachmentState:(typeof t.attachmentCount=="number"&&Number.isFinite(t.attachmentCount)?t.attachmentCount:0)>0||t.taskId?"attached":"unattached"}function Hn(t,c,o,i){const u=c.trim().toLowerCase();return t.filter(m=>{const y=`${Te(m)} ${m.originalFilename||""}`.toLowerCase(),g=u.length===0||y.includes(u),w=o.length===0||o.includes(m.docType),h=Je(m),_=i.length===0||i.includes(h);return g&&w&&_})}function Wn({docType:t}){switch(t){case"implementation-plan":return e.jsx(en,{size:13});case"review":return e.jsx(We,{size:13});case"walkthrough":return e.jsx(Zt,{size:13});default:return e.jsx(Xt,{size:13})}}function Gn(t){return t<1024?`${t}B`:t<1024*1024?`${(t/1024).toFixed(1)}KB`:`${(t/(1024*1024)).toFixed(1)}MB`}function Un(t){if(!t)return"";const c=new Date(t),i=new Date().getTime()-c.getTime(),u=Math.floor(i/(1e3*60*60*24));return u===0?"Today":u===1?"Yesterday":u<7?`${u}d ago`:u<30?`${Math.floor(u/7)}w ago`:c.toLocaleDateString()}function Kn(t,c){t.key!=="Enter"&&t.key!==" "||(t.preventDefault(),c())}function Jn({documents:t,selectedDocId:c,loading:o,error:i,searchQuery:u,taskById:m,onSearchChange:v,onSelect:y,onRefresh:g,hasActiveFilters:w}){return e.jsxs("div",{className:E.index,children:[e.jsxs("div",{className:E.header,children:[e.jsxs("span",{className:E.title,children:[e.jsx(Qt,{size:14}),"Documents"]}),e.jsx("button",{className:E.refreshBtn,onClick:g,title:"Refresh document list",disabled:o,children:e.jsx(Yt,{size:13,className:o?M.docSpinning:void 0})})]}),e.jsxs("div",{className:E.search,children:[e.jsx(qt,{size:12,className:E.searchIcon}),e.jsx("input",{type:"text",placeholder:"Search documents…",value:u,onChange:h=>v(h.target.value),className:E.searchInput})]}),e.jsxs("div",{className:`${E.list} tf-scrollbar`,children:[o&&e.jsx("div",{className:E.state,children:"Loading documents…"}),!o&&i&&e.jsx("div",{className:E.stateError,children:i}),!o&&!i&&t.length===0&&e.jsx("div",{className:E.state,children:w?"No documents match your filters.":"No documents found. Documents added as task attachments will appear here."}),!o&&t.map(h=>{const _=h.taskId?m.get(h.taskId):null,N=h.id===c,R=Te(h),A=Je(h),z=typeof h.attachmentCount=="number"&&Number.isFinite(h.attachmentCount)?h.attachmentCount:h.taskId?1:0,D=z>1?`${z} tasks linked`:z===1?_?.title||"1 task linked":null;return e.jsxs("div",{role:"button",tabIndex:0,className:`${E.item} ${N?E.itemActive:""}`,onClick:()=>y(h),onKeyDown:L=>Kn(L,()=>y(h)),children:[e.jsx("div",{className:E.itemIcon,children:e.jsx(Wn,{docType:h.docType})}),e.jsxs("div",{className:E.itemBody,children:[e.jsx("span",{className:E.itemTitle,title:R,children:R}),A==="unattached"&&e.jsx("span",{className:E.itemBadge,children:"Unattached"}),D&&e.jsx("span",{className:E.itemTask,title:D,children:D}),e.jsxs("span",{className:E.itemMeta,children:[e.jsxs("span",{className:E.itemMetaDetails,children:[Gn(h.sizeBytes),h.updatedAt&&e.jsxs(e.Fragment,{children:[" · ",Un(h.updatedAt)]})]}),h.referenceLabel&&e.jsx("span",{className:E.itemMetaReference,children:h.referenceLabel})]})]})]},h.id)})]})]})}function Ne(t){return function(c){return xn(c,t)}}const Vn="_viewer_9t0y6_1",Qn="_viewerMonochrome_9t0y6_10",Yn="_metaDocumentName_9t0y6_10",qn="_viewerEditMode_9t0y6_14",Xn="_meta_9t0y6_10",Zn="_metaLeft_9t0y6_30",es="_metaRenameRow_9t0y6_49",ts="_typeBadge_9t0y6_56",ns="_typeBadgeImplementationPlan_9t0y6_71",ss="_typeBadgeReview_9t0y6_77",as="_typeBadgeWalkthrough_9t0y6_83",rs="_metaTaskName_9t0y6_89",is="_statusBadge_9t0y6_98",os="_metaDate_9t0y6_113",ls="_metaSize_9t0y6_114",cs="_actions_9t0y6_122",ds="_actionBtn_9t0y6_129",us="_dangerBtn_9t0y6_156",ms="_generateBtn_9t0y6_167",hs="_editBtn_9t0y6_178",fs="_saveBtn_9t0y6_189",ps="_layoutToggle_9t0y6_205",vs="_layoutBtn_9t0y6_213",ws="_layoutBtnActive_9t0y6_229",ys="_saveStatus_9t0y6_234",gs="_saveStatusSaved_9t0y6_241",xs="_saveStatusError_9t0y6_245",_s="_unsaved_9t0y6_250",ks="_viewerContent_9t0y6_256",bs="_viewerBody_9t0y6_265",Ss="_viewerBodyFullWidth_9t0y6_273",Cs="_viewerMain_9t0y6_277",js="_reviewRail_9t0y6_285",Ns="_printHint_9t0y6_291",Ts="_reviewSection_9t0y6_298",Es="_reviewHeader_9t0y6_307",Rs="_reviewTitle_9t0y6_315",As="_reviewSubtitle_9t0y6_324",Ds="_reviewControls_9t0y6_331",$s="_reviewSelect_9t0y6_338",Bs="_reviewSessionMeta_9t0y6_342",Is="_reviewStatusResolved_9t0y6_350",Ls="_reviewSessionLabel_9t0y6_356",Ps="_reviewTitleEditRow_9t0y6_361",Ms="_reviewSessionTimestamp_9t0y6_368",zs="_reviewAnchorLabel_9t0y6_372",Fs="_reviewComposer_9t0y6_378",Os="_reviewAnchorChip_9t0y6_385",Hs="_reviewAnchorSnippet_9t0y6_398",Ws="_reviewAnchorClear_9t0y6_403",Gs="_reviewCommentActions_9t0y6_416",Us="_reviewCommentAction_9t0y6_416",Ks="_reviewCommentEditor_9t0y6_437",Js="_viewerState_9t0y6_443",Vs="_viewerStateError_9t0y6_450",Qs="_editorArea_9t0y6_457",Ys="_editorPane_9t0y6_464",qs="_editorLayoutSplit_9t0y6_472",Xs="_previewPane_9t0y6_473",Zs="_editorLayoutEditor_9t0y6_477",ea="_editorLayoutPreview_9t0y6_478",ta="_editorPaneLabel_9t0y6_482",na="_editorTextarea_9t0y6_494",sa="_markdownSurface_9t0y6_536",a={viewer:Vn,viewerMonochrome:Qn,metaDocumentName:Yn,viewerEditMode:qn,meta:Xn,metaLeft:Zn,metaRenameRow:es,typeBadge:ts,typeBadgeImplementationPlan:ns,typeBadgeReview:ss,typeBadgeWalkthrough:as,metaTaskName:rs,statusBadge:is,metaDate:os,metaSize:ls,actions:cs,actionBtn:ds,dangerBtn:us,generateBtn:ms,editBtn:hs,saveBtn:fs,layoutToggle:ps,layoutBtn:vs,layoutBtnActive:ws,saveStatus:ys,saveStatusSaved:gs,saveStatusError:xs,unsaved:_s,viewerContent:ks,viewerBody:bs,viewerBodyFullWidth:Ss,viewerMain:Cs,reviewRail:js,printHint:Ns,reviewSection:Ts,reviewHeader:Es,reviewTitle:Rs,reviewSubtitle:As,reviewControls:Ds,reviewSelect:$s,reviewSessionMeta:Bs,reviewStatusResolved:Is,reviewSessionLabel:Ls,reviewTitleEditRow:Ps,reviewSessionTimestamp:Ms,reviewAnchorLabel:zs,reviewComposer:Fs,reviewAnchorChip:Os,reviewAnchorSnippet:Hs,reviewAnchorClear:Ws,reviewCommentActions:Gs,reviewCommentAction:Us,reviewCommentEditor:Ks,viewerState:Js,viewerStateError:Vs,editorArea:Qs,editorPane:Ys,editorLayoutSplit:qs,previewPane:Xs,editorLayoutEditor:Zs,editorLayoutPreview:ea,editorPaneLabel:ta,editorTextarea:na,markdownSurface:sa},aa="_overlay_1unik_1",ra="_modal_1unik_12",ia="_header_1unik_16",oa="_title_1unik_20",la="_docName_1unik_24",ca="_body_1unik_34",da="_state_1unik_41",ua="_stateError_1unik_52",ma="_stateDone_1unik_63",ha="_toolbar_1unik_84",fa="_toolbarCount_1unik_95",pa="_toolbarActions_1unik_100",va="_tree_1unik_105",wa="_taskRow_1unik_113",ya="_taskRowDimmed_1unik_126",ga="_taskCheck_1unik_130",xa="_taskExpandBtn_1unik_139",_a="_taskExpandSpacer_1unik_155",ka="_taskTitle_1unik_160",ba="_taskBadge_1unik_169",Sa="_footer_1unik_179",j={overlay:aa,modal:ra,header:ia,title:oa,docName:la,body:ca,state:da,stateError:ua,stateDone:ma,toolbar:ha,toolbarCount:fa,toolbarActions:pa,tree:va,taskRow:wa,taskRowDimmed:ya,taskCheck:ga,taskExpandBtn:xa,taskExpandSpacer:_a,taskTitle:ka,taskBadge:ba,footer:Sa},Ca={1:"Low",2:"Medium",3:"High"};function ve(t,c){return t.map(o=>({...o,selected:c,children:ve(o.children,c)}))}function _t(t,c,o){return t.map(i=>i.idempotencyKey===c?{...i,selected:o,children:ve(i.children,o)}:{...i,children:_t(i.children,c,o)})}function Ke(t){let c=0;for(const o of t)o.selected&&c++,c+=Ke(o.children);return c}function kt({node:t,depth:c,onToggle:o}){const[i,u]=r.useState(!0),m=t.children.length>0,v=c*20;return e.jsxs("div",{children:[e.jsxs("div",{className:`${j.taskRow} ${t.selected?"":j.taskRowDimmed}`,style:{paddingLeft:`${12+v}px`},children:[e.jsx("button",{className:j.taskCheck,onClick:()=>o(t.idempotencyKey,!t.selected),title:t.selected?"Deselect":"Select",children:t.selected?e.jsx(tn,{size:14,style:{color:"var(--brand-primary-strong)"}}):e.jsx(nn,{size:14,style:{color:"var(--text-muted)"}})}),m?e.jsx("button",{className:j.taskExpandBtn,onClick:()=>u(y=>!y),children:i?e.jsx(sn,{size:12}):e.jsx(an,{size:12})}):e.jsx("span",{className:j.taskExpandSpacer}),e.jsx("span",{className:j.taskTitle,title:t.description||void 0,children:t.title}),e.jsx("span",{className:j.taskBadge,style:{color:lt(t.type),borderColor:lt(t.type)},children:t.type}),e.jsx("span",{className:j.taskBadge,style:{color:ct(t.priority),borderColor:ct(t.priority)},children:Ca[t.priority]})]}),m&&i&&e.jsx("div",{children:t.children.map(y=>e.jsx(kt,{node:y,depth:c+1,onToggle:o},y.idempotencyKey))})]})}function ja({content:t,docTitle:c,apiBaseUrl:o="",onClose:i,onGenerated:u}){const[m,v]=r.useState("preview"),[y,g]=r.useState(null),[w,h]=r.useState([]),[_,N]=r.useState(!0),[R,A]=r.useState(0),[z,D]=r.useState(null);r.useEffect(()=>{let x=!1;return N(!0),g(null),I("/api/taskforce/documents/generate-tasks/preview",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:t})},o).then(S=>S.json()).then(S=>{if(!x){if(S.error)throw new Error(S.error);h(S.tasks||[]),v("preview")}}).catch(S=>{x||(g(S?.message||"Failed to parse plan"),v("error"))}).finally(()=>{x||N(!1)}),()=>{x=!0}},[t,o]);const L=r.useCallback((x,S)=>{h(W=>_t(W,x,S))},[]),K=()=>h(x=>ve(x,!0)),Q=()=>h(x=>ve(x,!1)),J=Ke(w),Y=async()=>{v("generating"),D(null);try{const x=await I("/api/taskforce/documents/generate-tasks/commit",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({tasks:w})},o),S=await x.json().catch(()=>({}));if(!x.ok)throw new Error(S.error||`Generation failed (${x.status})`);A(S.created??0),v("done"),u(S.created??0)}catch(x){D(x?.message||"Generation failed"),v("error")}};return e.jsx("div",{className:j.overlay,onClick:x=>{x.target===x.currentTarget&&i()},children:e.jsxs("div",{className:`tf-surface-modal tf-modal-shell ${j.modal}`,children:[e.jsxs("div",{className:`tf-modal-header ${j.header}`,children:[e.jsxs("div",{className:`tf-modal-title ${j.title}`,children:[e.jsx(Ge,{size:16,style:{color:"var(--brand-primary-strong)"}}),"Generate Tasks from Plan"]}),e.jsx("span",{className:j.docName,children:c}),e.jsx("button",{className:"tf-control-icon",onClick:i,title:"Close",children:e.jsx(yt,{size:16})})]}),e.jsxs("div",{className:j.body,children:[_&&e.jsxs("div",{className:j.state,children:[e.jsx(ut,{size:20,className:M.docSpinning}),"Parsing plan…"]}),!_&&m==="error"&&e.jsxs("div",{className:j.stateError,children:[e.jsx(gt,{size:16}),y||z||"An error occurred"]}),!_&&m==="done"&&e.jsxs("div",{className:j.stateDone,children:[e.jsx(xt,{size:24,style:{color:"var(--status-success)"}}),e.jsxs("strong",{children:[R," task",R!==1?"s":""," created"]}),e.jsx("p",{children:"Tasks are now in your board. Switch to the Kanban or Hierarchy view to see them."})]}),!_&&(m==="preview"||m==="confirm"||m==="generating")&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:j.toolbar,children:[e.jsxs("span",{className:j.toolbarCount,children:[J," of ",Ke(ve(w,!0))," tasks selected"]}),e.jsxs("div",{className:j.toolbarActions,children:[e.jsx("button",{className:"tf-control-icon",onClick:K,children:"Select all"}),e.jsx("button",{className:"tf-control-icon",onClick:Q,children:"Deselect all"})]})]}),w.length===0?e.jsx("div",{className:j.state,children:"No tasks could be parsed from this document. Make sure the document uses ## H2 headings for phases and bullet points for tasks."}):e.jsx("div",{className:`${j.tree} tf-scrollbar`,children:w.map(x=>e.jsx(kt,{node:x,depth:0,onToggle:L},x.idempotencyKey))})]})]}),!_&&m!=="done"&&m!=="error"&&e.jsxs("div",{className:j.footer,children:[e.jsx("button",{className:"tf-button-secondary",onClick:i,children:"Cancel"}),e.jsx("button",{className:"tf-button-primary",onClick:Y,disabled:J===0||m==="generating",children:m==="generating"?e.jsxs(e.Fragment,{children:[e.jsx(ut,{size:13,className:M.docSpinning})," Generating…"]}):e.jsxs(e.Fragment,{children:[e.jsx(Ge,{size:13})," Generate ",J," task",J!==1?"s":""]})})]}),!_&&m==="done"&&e.jsx("div",{className:j.footer,children:e.jsx("button",{className:"tf-button-primary",onClick:i,children:"Done"})})]})})}const Na={"implementation-plan":"Implementation Plan",review:"Review",walkthrough:"Walkthrough",planning:"Planning",other:"Document"},Ta={"implementation-plan":a.typeBadgeImplementationPlan,review:a.typeBadgeReview,walkthrough:a.typeBadgeWalkthrough,planning:void 0,other:void 0},Ea={editor:a.editorLayoutEditor,split:a.editorLayoutSplit,preview:a.editorLayoutPreview},Ra=1500,Aa=`
|
|
2
|
-
@page {
|
|
3
|
-
margin: 0.94in 1.02in 1in;
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
html,
|
|
7
|
-
body {
|
|
8
|
-
margin: 0;
|
|
9
|
-
padding: 0;
|
|
10
|
-
background: #fff;
|
|
11
|
-
color: #111;
|
|
12
|
-
-webkit-print-color-adjust: exact;
|
|
13
|
-
print-color-adjust: exact;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
body {
|
|
17
|
-
font: 12.15pt/1.66 Georgia, "Times New Roman", Times, serif;
|
|
18
|
-
letter-spacing: 0;
|
|
19
|
-
text-rendering: optimizeLegibility;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
.tf-print-document {
|
|
23
|
-
max-width: 5.95in;
|
|
24
|
-
margin: 0 auto;
|
|
25
|
-
overflow: visible;
|
|
26
|
-
color: #171717;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
.tf-print-document > :first-child {
|
|
30
|
-
margin-top: 0;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
.tf-print-document > :last-child {
|
|
34
|
-
margin-bottom: 0;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
.tf-print-document h1,
|
|
38
|
-
.tf-print-document h2,
|
|
39
|
-
.tf-print-document h3,
|
|
40
|
-
.tf-print-document h4 {
|
|
41
|
-
font-family: "Helvetica Neue", "Arial Nova", Arial, sans-serif;
|
|
42
|
-
color: #101010;
|
|
43
|
-
font-weight: 700;
|
|
44
|
-
line-height: 1.08;
|
|
45
|
-
letter-spacing: -0.03em;
|
|
46
|
-
break-after: avoid-page;
|
|
47
|
-
page-break-after: avoid;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
.tf-print-document h1 {
|
|
51
|
-
font-size: 32pt;
|
|
52
|
-
font-weight: 800;
|
|
53
|
-
line-height: 0.98;
|
|
54
|
-
letter-spacing: -0.055em;
|
|
55
|
-
margin: 0 0 1.18em;
|
|
56
|
-
padding: 0 0 0.38em;
|
|
57
|
-
border-bottom: 2px solid #d8d8d8;
|
|
58
|
-
max-width: 84%;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
.tf-print-document h1 + p,
|
|
62
|
-
.tf-print-document h1 + ul,
|
|
63
|
-
.tf-print-document h1 + ol {
|
|
64
|
-
margin-top: 0.4em;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
.tf-print-document h2,
|
|
68
|
-
.tf-print-document h3,
|
|
69
|
-
.tf-print-document h4 {
|
|
70
|
-
margin-bottom: 0.28em;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
.tf-print-document h2 {
|
|
74
|
-
font-size: 16.5pt;
|
|
75
|
-
font-weight: 750;
|
|
76
|
-
margin-top: 2.2em;
|
|
77
|
-
padding-bottom: 0.22em;
|
|
78
|
-
border-bottom: 1px solid #dfdfdf;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
.tf-print-document h3 {
|
|
82
|
-
font-size: 13.3pt;
|
|
83
|
-
font-weight: 700;
|
|
84
|
-
margin-top: 1.48em;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
.tf-print-document h4 {
|
|
88
|
-
font-size: 11.2pt;
|
|
89
|
-
font-weight: 700;
|
|
90
|
-
margin-top: 1.14em;
|
|
91
|
-
text-transform: uppercase;
|
|
92
|
-
letter-spacing: 0.08em;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
.tf-print-document p,
|
|
96
|
-
.tf-print-document ul,
|
|
97
|
-
.tf-print-document ol,
|
|
98
|
-
.tf-print-document blockquote,
|
|
99
|
-
.tf-print-document table,
|
|
100
|
-
.tf-print-document pre,
|
|
101
|
-
.tf-print-document hr {
|
|
102
|
-
margin: 0.78em 0;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
.tf-print-document ul,
|
|
106
|
-
.tf-print-document ol {
|
|
107
|
-
padding-left: 1.1em;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
.tf-print-document li {
|
|
111
|
-
margin: 0.24em 0;
|
|
112
|
-
padding-left: 0.1em;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
.tf-print-document li > ul,
|
|
116
|
-
.tf-print-document li > ol {
|
|
117
|
-
margin-top: 0.34em;
|
|
118
|
-
margin-bottom: 0.2em;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
.tf-print-document a {
|
|
122
|
-
color: #121212;
|
|
123
|
-
text-decoration: underline;
|
|
124
|
-
text-underline-offset: 2px;
|
|
125
|
-
text-decoration-thickness: 0.65px;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
.tf-print-document code {
|
|
129
|
-
font-family: "SFMono-Regular", "SF Mono", Consolas, "Liberation Mono", monospace;
|
|
130
|
-
font-size: 0.78em;
|
|
131
|
-
background: transparent;
|
|
132
|
-
color: #4a4a4a;
|
|
133
|
-
border: 0;
|
|
134
|
-
padding: 0;
|
|
135
|
-
border-radius: 0;
|
|
136
|
-
overflow-wrap: anywhere;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
.tf-print-section-label {
|
|
140
|
-
font-family: "Helvetica Neue", "Arial Nova", Arial, sans-serif;
|
|
141
|
-
font-size: 10.7pt;
|
|
142
|
-
font-weight: 700;
|
|
143
|
-
line-height: 1.18;
|
|
144
|
-
letter-spacing: 0.12em;
|
|
145
|
-
text-transform: uppercase;
|
|
146
|
-
color: #191919;
|
|
147
|
-
margin-top: 2.2em;
|
|
148
|
-
margin-bottom: 0.58em;
|
|
149
|
-
padding-bottom: 0;
|
|
150
|
-
border-bottom: 0;
|
|
151
|
-
break-after: avoid-page;
|
|
152
|
-
page-break-after: avoid;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
.tf-print-section-label strong {
|
|
156
|
-
font-weight: inherit;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
.tf-print-document pre {
|
|
160
|
-
background: #fafafa;
|
|
161
|
-
border: 1px solid #e1e1e1;
|
|
162
|
-
border-radius: 6px;
|
|
163
|
-
padding: 10pt 11pt;
|
|
164
|
-
overflow: visible;
|
|
165
|
-
white-space: pre-wrap;
|
|
166
|
-
word-break: break-word;
|
|
167
|
-
break-inside: avoid-page;
|
|
168
|
-
page-break-inside: avoid;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
.tf-print-document pre code {
|
|
172
|
-
background: transparent;
|
|
173
|
-
padding: 0;
|
|
174
|
-
border-radius: 0;
|
|
175
|
-
white-space: inherit;
|
|
176
|
-
word-break: inherit;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
.tf-print-document blockquote {
|
|
180
|
-
border-left: 2px solid #9f9f9f;
|
|
181
|
-
color: #434343;
|
|
182
|
-
margin-left: 0;
|
|
183
|
-
padding-left: 9pt;
|
|
184
|
-
font-style: italic;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
.tf-print-document table {
|
|
188
|
-
width: 100%;
|
|
189
|
-
border-collapse: collapse;
|
|
190
|
-
table-layout: fixed;
|
|
191
|
-
break-inside: auto;
|
|
192
|
-
page-break-inside: auto;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
.tf-print-document thead {
|
|
196
|
-
display: table-header-group;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
.tf-print-document tr {
|
|
200
|
-
break-inside: avoid-page;
|
|
201
|
-
page-break-inside: avoid;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
.tf-print-document th,
|
|
205
|
-
.tf-print-document td {
|
|
206
|
-
border: 1px solid #dbdbdb;
|
|
207
|
-
padding: 6.5pt 7.5pt;
|
|
208
|
-
text-align: left;
|
|
209
|
-
vertical-align: top;
|
|
210
|
-
word-break: break-word;
|
|
211
|
-
background: #fff;
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
.tf-print-document th {
|
|
215
|
-
background: #f7f7f7;
|
|
216
|
-
color: #1e1e1e;
|
|
217
|
-
font-size: 9.4pt;
|
|
218
|
-
font-weight: 680;
|
|
219
|
-
letter-spacing: 0.018em;
|
|
220
|
-
text-transform: uppercase;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
.tf-print-document hr {
|
|
224
|
-
border: 0;
|
|
225
|
-
border-top: 1px solid #e1e1e1;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
.tf-print-document img {
|
|
229
|
-
max-width: 100%;
|
|
230
|
-
height: auto;
|
|
231
|
-
break-inside: avoid-page;
|
|
232
|
-
page-break-inside: avoid;
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
.tf-print-document input[type="checkbox"] {
|
|
236
|
-
accent-color: #111;
|
|
237
|
-
margin-right: 0.45em;
|
|
238
|
-
}
|
|
239
|
-
`;function Da(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}function ht(t){return t?new Date(t).toLocaleString():"—"}function $a(){const t=i=>!i||!Array.isArray(i.children)?!1:i.children.some(u=>u?u.type==="element"&&u.tagName==="input"&&u.properties?.type==="checkbox"?!0:t(u):!1),c=i=>!i||!Array.isArray(i.children)?!1:i.children.some(u=>typeof u?.checked=="boolean"?!0:t(u)),o=i=>{const u=Oe.Children.toArray(i).filter(g=>typeof g!="string"?!0:g.trim().length>0);if(u.length!==1)return null;const m=u[0];if(!Oe.isValidElement(m)||m.type!=="strong")return null;const v=m.props,y=Oe.Children.toArray(v.children).join("").trim();return y||null};return{input({type:i,checked:u,...m}){return i!=="checkbox"?e.jsx("input",{type:i,checked:u,...m}):e.jsx("input",{...m,type:"checkbox",checked:!!u,disabled:!0,readOnly:!0})},ul({children:i,node:u,...m}){const v=c(u);return e.jsx("ul",{...m,style:v?{paddingLeft:"1.2em"}:void 0,children:i})},ol({children:i,node:u,...m}){const v=c(u);return e.jsx("ol",{...m,style:v?{paddingLeft:"1.2em"}:void 0,children:i})},li({children:i,node:u,...m}){const v=typeof u?.checked=="boolean"||t(u);return e.jsx("li",{...m,style:v?{listStyleType:"none",listStyle:"none",marginLeft:0}:void 0,children:i})},p({children:i,...u}){const m=o(i);return m?e.jsx("p",{...u,className:"tf-print-section-label",children:m}):e.jsx("p",{...u,children:i})}}}function Ba(t){const c=Wt.renderToStaticMarkup(e.jsx("div",{className:"tf-print-document",children:e.jsx(Ce,{remarkPlugins:[je],rehypePlugins:[Ne],components:$a(),children:t})}));return`<!doctype html>
|
|
240
|
-
<html lang="en">
|
|
241
|
-
<head>
|
|
242
|
-
<meta charset="utf-8" />
|
|
243
|
-
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
244
|
-
<title>Taskforce print document</title>
|
|
245
|
-
<style>${Aa}</style>
|
|
246
|
-
</head>
|
|
247
|
-
<body>${c}</body>
|
|
248
|
-
</html>`}async function Ia(t,c){try{await c.fonts?.ready}catch{}await new Promise(o=>{const i=t.requestAnimationFrame?.bind(t)??(u=>window.setTimeout(()=>u(0),0));i(()=>i(()=>o()))})}function La(t){return window.setTimeout(t,Ra)}function ft(t){try{return new Date(t).toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return t}}function pt(t){return t?t.kind==="document"?"Entire document":t.kind==="quote"?t.quote?`Quote: "${t.quote}"`:"Quoted text":t.kind==="line-range"?t.startLine===t.endLine?`Line ${t.startLine}`:`Lines ${t.startLine}-${t.endLine}`:null:null}function Pa(t){return t.authorActor?.label?t.authorActor.label:t.authorActorId==="user"||t.authorActorId==="human"?"You":t.authorActorId?t.authorActorId:"Reviewer"}function vt(t){return t.replace(/\s+/g," ").trim()}function Ma(t,c){if(!c)return 0;let o=0,i=0;for(;i>=0&&(i=t.indexOf(c,i),!(i<0));)o+=1,i+=c.length;return o}function za(t,c,o){const i=document.createTreeWalker(t,NodeFilter.SHOW_TEXT);let u=i.nextNode(),m=0;for(;u;){const v=u.textContent||"";if(u===c)return m+Math.max(0,Math.min(o,v.length));m+=v.length,u=i.nextNode()}return null}function Fa(t,c,o){const i=o.replace(/\s+/g," ").trim();if(!i)return null;const u=t.textContent||"",m=vt(u),v=[];let y=m.indexOf(i);for(;y>=0;)v.push(y),y=m.indexOf(i,y+i.length);let g=null;const w=za(t,c.startContainer,c.startOffset);if(w!==null){const A=vt(u.slice(0,w));g=Ma(A,i)}const h=g!==null&&g>=0&&g<v.length?g:v.length===1?0:null,_=h!==null?v[h]:v[0]??-1;if(_<0)return{kind:"quote",quote:i,occurrenceIndex:g};const N=m.slice(Math.max(0,_-40),_).trim()||null,R=m.slice(_+i.length,_+i.length+40).trim()||null;return{kind:"quote",quote:i,occurrenceIndex:h,prefix:N,suffix:R}}function Oa(t,c,o){if(c<0)return t;const i=t.split(`
|
|
249
|
-
`);let u=-1;const m=/^(\s*(?:[-*+]|\d+\.)\s+)\[( |x|X)\](.*)$/,v=o?"x":" ";return i.map(g=>{const w=g.match(m);return!w||(u+=1,u!==c)?g:`${w[1]}[${v}]${w[3]}`}).join(`
|
|
250
|
-
`)}function Ha({doc:t,taskTitle:c,apiBaseUrl:o="",onSaved:i,onDeleted:u,enableTaskGeneration:m=!1}){const v=Te(t),[y,g]=r.useState(v),w=y,h=Gt({...t,displayName:y}),_=Ut(t),[N,R]=r.useState(null),[A,z]=r.useState(!1),[D,L]=r.useState(null),[K,Q]=r.useState(!1),[J,Y]=r.useState(!1),[x,S]=r.useState([]),[W,ne]=r.useState(!1),[se,$]=r.useState(null),[Ee,F]=r.useState(null),[V,q]=r.useState(""),[C,P]=r.useState(!1),[k,G]=r.useState(null),[Z,ee]=r.useState(!1),[oe,Re]=r.useState(""),[le,fe]=r.useState(null),[we,ce]=r.useState(""),[ae,bt]=r.useState(!0),[T,ye]=r.useState(!1),[O,de]=r.useState(""),[H,Ae]=r.useState("split"),[X,U]=r.useState({type:"idle"}),[St,De]=r.useState(!1),[Ve,Ct]=r.useState(!1),[ge,Qe]=r.useState(!1),[xe,re]=r.useState(!1),[$e,ue]=r.useState(w),me=t.editable!==!1,pe=Je(t),jt=!!t.assetId,Be=T&&O!==(N??""),Ie=r.useRef(null),Le=r.useRef(null),Ye=r.useRef(null),he=r.useRef(null),_e=r.useRef(null),qe=r.useRef(null),Xe=r.useRef(null),p=x.find(n=>n.id===Ee)||x[0]||null,Ze=r.useCallback(async()=>{z(!0),L(null),R(null);try{const n=await I(t.apiUrl,{credentials:"same-origin"},o);if(!n.ok)throw new Error(`Failed to load document (${n.status})`);const s=await n.text();R(s),de(s)}catch(n){L(n?.message||"Failed to load document")}finally{z(!1)}},[o,t.apiUrl]),ke=r.useCallback(async n=>{if(!t.assetId){S([]),F(null),$(null);return}const s=n?.silent===!0;s||(ne(!0),$(null));try{const l=await I(`/api/taskforce/document-reviews/sessions?assetId=${encodeURIComponent(t.assetId)}`,{credentials:"include"},o),d=await l.json().catch(()=>({}));if(!l.ok)throw new Error(d.error||`Failed to load reviews (${l.status})`);const f=Array.isArray(d.sessions)?d.sessions:[];S(f),F(b=>b&&f.some(te=>te.id===b)?b:f[0]?.id??null)}catch(l){s||($(l?.message||"Failed to load reviews"),S([]),F(null))}finally{s||ne(!1)}},[o,t.assetId]),Pe=r.useCallback(async()=>{if(!t.assetId||C)return null;P(!0),$(null);try{const n=await I("/api/taskforce/document-reviews/sessions",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({assetId:t.assetId,title:`Review ${x.length+1}`})},o),s=await n.json().catch(()=>({}));if(!n.ok)throw new Error(s.error||`Failed to create review (${n.status})`);const l=s.session||null;if(!l)throw new Error("Review session payload missing.");return S(d=>[l,...d.filter(f=>f.id!==l.id)]),F(l.id),l}catch(n){return $(n?.message||"Failed to create review"),null}finally{P(!1)}},[o,t.assetId,C,x.length]);r.useEffect(()=>{Ze(),ke(),ye(!1),U({type:"idle"}),re(!1);const n=Te(t);g(n),ue(n),Q(!1),Y(!1),q(""),G(null),ee(!1),Re(""),fe(null),ce("")},[t,Ze,ke]),r.useEffect(()=>{if(!p)return;const n=qe.current;typeof n?.scrollIntoView=="function"&&n.scrollIntoView({block:"end"})},[p?.comments.length,p?.id]),r.useEffect(()=>{Re(p?.title?.trim()||""),ee(!1)},[p?.id,p?.title]),r.useEffect(()=>{xe&&window.setTimeout(()=>{Le.current?.focus(),Le.current?.select()},0)},[xe]),r.useEffect(()=>{if(!t.assetId||T)return;const n=()=>{document.visibilityState==="visible"&&ke({silent:!0})},s=window.setInterval(n,15e3);return window.addEventListener("focus",n),document.addEventListener("visibilitychange",n),()=>{window.clearInterval(s),window.removeEventListener("focus",n),document.removeEventListener("visibilitychange",n)}},[t.assetId,T,ke]),r.useEffect(()=>{if(!T)return;const n=s=>{(s.metaKey||s.ctrlKey)&&s.key==="s"&&(s.preventDefault(),et())};return window.addEventListener("keydown",n),()=>window.removeEventListener("keydown",n)},[T,O]);const ie=r.useCallback(()=>{_e.current!==null&&(window.clearTimeout(_e.current),_e.current=null),he.current&&(he.current.remove(),he.current=null)},[]);r.useEffect(()=>()=>{ie()},[ie]);const be=r.useCallback(n=>{if(!T||H!=="split")return;const s=Ie.current,l=Ye.current;if(!s||!l)return;const d=n==="editor"?s:l,f=n==="editor"?l:s,b=Math.max(d.scrollHeight-d.clientHeight,0),te=Math.max(f.scrollHeight-f.clientHeight,0),Fe=b<=0?0:d.scrollTop/b,ot=te*Fe;Math.abs(f.scrollTop-ot)<=1||(f.scrollTop=ot)},[T,H]);r.useEffect(()=>{!T||H!=="split"||be("editor")},[O,T,H,be]);const Nt=()=>{me&&(de(N??""),U({type:"idle"}),ye(!0),setTimeout(()=>Ie.current?.focus(),50))},Tt=()=>{Be&&!window.confirm("Discard unsaved changes?")||(ye(!1),de(N??""),U({type:"idle"}))},et=r.useCallback(async()=>{if(me&&X.type!=="saving"){U({type:"saving"});try{const n=await I("/api/taskforce/documents/save",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({fsPath:t.fsPath,content:O})},o),s=await n.json().catch(()=>({}));if(!n.ok)throw new Error(s.error||`Save failed (${n.status})`);const l=s.updatedAt||new Date().toISOString();R(O),U({type:"saved",savedAt:l}),i?.(l),ye(!1)}catch(n){U({type:"error",message:n?.message||"Save failed"})}}},[o,t.fsPath,O,X.type,i,me]),Et=r.useCallback(()=>{const n=T?O:N??"";if(!n.trim())return;ie();const s=document.createElement("iframe");s.setAttribute("aria-hidden","true"),s.tabIndex=-1,s.style.position="fixed",s.style.right="0",s.style.bottom="0",s.style.width="0",s.style.height="0",s.style.border="0",s.style.opacity="0",s.style.pointerEvents="none",document.body.appendChild(s),he.current=s;const l=s.contentWindow,d=s.contentDocument;if(!l||!d){ie();return}d.open(),d.write(Ba(n)),d.close();let f=!1;const b=async()=>{f||he.current!==s||(f=!0,await Ia(l,d),he.current===s&&(l.focus(),l.print(),_e.current=La(ie)))};l.addEventListener("afterprint",ie,{once:!0}),b()},[ie,N,O,T]),Rt=async()=>{const n=t.apiUrl,s=new URL(dt(n,o),window.location.origin).toString();try{await navigator.clipboard.writeText(s)}catch{const l=document.createElement("textarea");l.value=s,document.body.appendChild(l),l.select(),document.execCommand("copy"),document.body.removeChild(l)}Q(!0),setTimeout(()=>Q(!1),2e3)},At=r.useCallback(async()=>{if(_){try{await navigator.clipboard.writeText(_)}catch{const n=document.createElement("textarea");n.value=_,document.body.appendChild(n),n.select(),document.execCommand("copy"),document.body.removeChild(n)}Y(!0),setTimeout(()=>Y(!1),2e3)}},[_]),Dt=()=>{const n=t.apiUrl.includes("?")?"&":"?",s=dt(`${t.apiUrl}${n}download=1&filename=${encodeURIComponent(h)}`,o),l=document.createElement("a");l.href=s,l.click()},Me=r.useCallback(async()=>{if(!t.assetId)return;const n=$e.trim();if(!n){ue(w),re(!1);return}if(n===w){re(!1);return}const s=await I(`/api/taskforce/documents/${encodeURIComponent(t.assetId)}`,{method:"PATCH",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({displayName:n})},o),l=await s.json().catch(()=>({}));if(!s.ok){window.alert(l.error||`Rename failed (${s.status})`);return}g(n),ue(n),re(!1),i?.(l.updatedAt||new Date().toISOString())},[o,t.assetId,i,w,$e]),$t=r.useCallback(n=>{if(n.key==="Enter"){n.preventDefault(),Me();return}n.key==="Escape"&&(n.preventDefault(),ue(w),re(!1))},[Me,w]),Bt=r.useCallback(async()=>{if(!t.assetId||ge)return;const n=pe==="attached",s=Math.max(0,Number(t.attachmentCount||0)),l=n?`Delete "${w}" everywhere?
|
|
251
|
-
|
|
252
|
-
This will remove it from ${s} linked task${s===1?"":"s"} and soft-delete the document across sync.`:`Permanently delete "${w}" from storage?`;if(window.confirm(l)){Qe(!0);try{const d=await I(`/api/taskforce/documents/${encodeURIComponent(t.assetId)}`,{method:"DELETE",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify(n?{forceDetach:!0}:{})},o),f=await d.json().catch(()=>({}));if(!d.ok)throw new Error(f.error||`Delete failed (${d.status})`);u?.()}catch(d){window.alert(d?.message||"Delete failed")}finally{Qe(!1)}}},[o,pe,ge,t.assetId,t.attachmentCount,u,w]),It=r.useCallback(async()=>{if(!(!p||C)){P(!0),$(null);try{const n=p.status==="resolved"?"open":"resolved",s=await I(`/api/taskforce/document-reviews/sessions/${encodeURIComponent(p.id)}`,{method:"PATCH",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({status:n})},o),l=await s.json().catch(()=>({}));if(!s.ok)throw new Error(l.error||`Failed to update review (${s.status})`);const d=l.session||null;if(!d)throw new Error("Review session payload missing.");S(f=>f.map(b=>b.id===d.id?d:b))}catch(n){$(n?.message||"Failed to update review")}finally{P(!1)}}},[p,o,C]),Lt=r.useCallback(async()=>{if(!p||C)return;const n=oe.trim();P(!0),$(null);try{const s=await I(`/api/taskforce/document-reviews/sessions/${encodeURIComponent(p.id)}`,{method:"PATCH",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({title:n||null})},o),l=await s.json().catch(()=>({}));if(!s.ok)throw new Error(l.error||`Failed to update review (${s.status})`);const d=l.session||null;if(!d)throw new Error("Review session payload missing.");S(f=>f.map(b=>b.id===d.id?d:b)),ee(!1)}catch(s){$(s?.message||"Failed to update review")}finally{P(!1)}},[p,o,C,oe]),tt=T?O:N??"",Pt=r.useCallback(()=>{if(T||!ae)return;const n=typeof window.getSelection=="function"?window.getSelection():null,s=n?.toString().replace(/\s+/g," ").trim()||"";if(!n||!s)return;const l=n.rangeCount>0?n.getRangeAt(0):null,d=Xe.current;if(!l||!d)return;const f=l.commonAncestorContainer,b=f.nodeType===Node.TEXT_NODE?f.parentNode:f;if(!(b instanceof Node)||!d.contains(b))return;const te=Fa(d,l,s);te&&G(te)},[T,ae]),Mt=r.useCallback(()=>{bt(n=>{const s=!n;return s||G(null),s})},[]),nt=r.useCallback(async()=>{const n=V.trim();if(!n||C)return;let s=p;if(s||(s=await Pe()),!!s){P(!0),$(null);try{const l=await I(`/api/taskforce/document-reviews/sessions/${encodeURIComponent(s.id)}/comments`,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({body:n,anchor:k||{kind:"document"}})},o),d=await l.json().catch(()=>({}));if(!l.ok)throw new Error(d.error||`Failed to add comment (${l.status})`);const f=d.session||null;if(!f)throw new Error("Review session payload missing.");S(b=>{const te=b.filter(Fe=>Fe.id!==f.id);return[f,...te]}),F(f.id),q(""),G(null)}catch(l){$(l?.message||"Failed to add comment")}finally{P(!1)}}},[p,o,Pe,k,C,V]),zt=r.useCallback((n,s)=>{fe(n),ce(s)},[]),Ft=r.useCallback(async()=>{if(!p||!le||C)return;const n=we.trim();if(n){P(!0),$(null);try{const s=await I(`/api/taskforce/document-reviews/sessions/${encodeURIComponent(p.id)}/comments/${encodeURIComponent(le)}`,{method:"PATCH",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({body:n})},o),l=await s.json().catch(()=>({}));if(!s.ok)throw new Error(l.error||`Failed to update comment (${s.status})`);const d=l.session||null;if(!d)throw new Error("Review session payload missing.");S(f=>f.map(b=>b.id===d.id?d:b)),fe(null),ce("")}catch(s){$(s?.message||"Failed to update comment")}finally{P(!1)}}},[p,o,we,le,C]),Ot=r.useCallback(async n=>{if(!(!p||C)&&window.confirm("Delete this review comment?")){P(!0),$(null);try{const s=await I(`/api/taskforce/document-reviews/sessions/${encodeURIComponent(p.id)}/comments/${encodeURIComponent(n)}`,{method:"DELETE",credentials:"include"},o),l=await s.json().catch(()=>({}));if(!s.ok)throw new Error(l.error||`Failed to delete comment (${s.status})`);const d=l.session||null;if(!d)throw new Error("Review session payload missing.");S(f=>f.map(b=>b.id===d.id?d:b)),le===n&&(fe(null),ce(""))}catch(s){$(s?.message||"Failed to delete comment")}finally{P(!1)}}},[p,o,le,C]),st=r.useCallback(async n=>{if(!me)return!1;U({type:"saving"});try{const s=await I("/api/taskforce/documents/save",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({fsPath:t.fsPath,content:n})},o),l=await s.json().catch(()=>({}));if(!s.ok)throw new Error(l.error||`Save failed (${s.status})`);const d=l.updatedAt||new Date().toISOString();return R(n),de(n),U({type:"saved",savedAt:d}),i?.(d),!0}catch(s){return U({type:"error",message:s?.message||"Save failed"}),!1}},[o,t.fsPath,i,me]),Ht=r.useCallback((n,s)=>{const l=T?O:N??"",d=Oa(l,n,s);if(d!==l){if(T){de(d),U(f=>f.type==="saving"?f:{type:"idle"});return}st(d)}},[N,O,T,st]);let at=-1;const ze=n=>!n||!Array.isArray(n.children)?!1:n.children.some(s=>s?s.type==="element"&&s.tagName==="input"&&s.properties?.type==="checkbox"?!0:ze(s):!1),rt=n=>!n||!Array.isArray(n.children)?!1:n.children.some(s=>typeof s?.checked=="boolean"?!0:ze(s)),it={input({type:n,checked:s,...l}){if(n!=="checkbox")return e.jsx("input",{type:n,checked:s,...l});at+=1;const d=at;return e.jsx("input",{...l,type:"checkbox",checked:!!s,disabled:!1,onClick:f=>f.stopPropagation(),onChange:f=>Ht(d,f.currentTarget.checked)})},ul({children:n,node:s,...l}){const d=rt(s);return e.jsx("ul",{...l,style:d?{paddingLeft:"1.25em"}:void 0,"data-task-list":d?"true":void 0,children:n})},ol({children:n,node:s,...l}){const d=rt(s);return e.jsx("ol",{...l,style:d?{paddingLeft:"1.25em"}:void 0,"data-task-list":d?"true":void 0,children:n})},li({children:n,node:s,...l}){const d=typeof s?.checked=="boolean"||ze(s);return e.jsx("li",{...l,style:d?{listStyleType:"none",listStyle:"none",marginLeft:0}:void 0,"data-task-item":d?"true":void 0,children:n})}};return e.jsxs("div",{className:`${a.viewer} ${T?a.viewerEditMode:""} ${Ve?a.viewerMonochrome:""}`,children:[e.jsxs("div",{className:a.meta,children:[e.jsxs("div",{className:a.metaLeft,children:[e.jsxs("span",{className:`${a.typeBadge} ${Ta[t.docType]??""}`,children:[e.jsx(rn,{size:10}),Na[t.docType]]}),xe?e.jsx("div",{className:a.metaRenameRow,children:e.jsx("input",{ref:Le,type:"text",className:M.input,value:$e,onChange:n=>ue(n.target.value),onBlur:()=>{Me()},onKeyDown:$t})}):e.jsx("span",{className:a.metaDocumentName,title:w,onDoubleClick:()=>{t.assetId&&(ue(w),re(!0))},children:w}),c&&e.jsx("span",{className:a.metaTaskName,title:`From task: ${c}`,children:c}),pe==="unattached"&&e.jsx("span",{className:a.statusBadge,children:"Unattached"}),t.updatedAt&&e.jsxs("span",{className:a.metaDate,title:ht(t.updatedAt),children:[e.jsx(on,{size:11}),ht(t.updatedAt)]}),e.jsxs("span",{className:a.metaSize,children:[e.jsx(ln,{size:11}),Da(t.sizeBytes)]}),_&&e.jsx(Kt,{label:_,copied:J,onClick:()=>{At()},title:"Copy document reference"}),X.type==="saved"&&e.jsxs("span",{className:`${a.saveStatus} ${a.saveStatusSaved}`,children:[e.jsx(xt,{size:11}),"Saved"]}),X.type==="error"&&e.jsxs("span",{className:`${a.saveStatus} ${a.saveStatusError}`,title:X.message,children:[e.jsx(gt,{size:11}),X.message||"Save failed"]}),Be&&X.type!=="saving"&&e.jsx("span",{className:a.unsaved,children:"Unsaved changes"})]}),e.jsx("div",{className:a.actions,children:T?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:a.layoutToggle,children:[e.jsx("button",{className:`${a.layoutBtn} ${H==="editor"?a.layoutBtnActive:""}`,onClick:()=>Ae("editor"),title:"Editor only",children:e.jsx(Se,{size:12})}),e.jsx("button",{className:`${a.layoutBtn} ${H==="split"?a.layoutBtnActive:""}`,onClick:()=>Ae("split"),title:"Split view",children:e.jsx(cn,{size:12})}),e.jsx("button",{className:`${a.layoutBtn} ${H==="preview"?a.layoutBtnActive:""}`,onClick:()=>Ae("preview"),title:"Preview only",children:e.jsx(We,{size:12})})]}),e.jsxs("button",{className:a.actionBtn,onClick:Tt,title:"Discard changes",children:[e.jsx(yt,{size:13}),"Cancel"]}),e.jsxs("button",{className:`${a.actionBtn} ${a.saveBtn}`,onClick:et,disabled:X.type==="saving"||!Be,title:"Save (Ctrl+S)",children:[e.jsx(dn,{size:13}),X.type==="saving"?"Saving…":"Save"]})]}):e.jsxs(e.Fragment,{children:[t.assetId&&e.jsxs("button",{className:a.actionBtn,onClick:()=>re(n=>!n),title:"Rename document",children:[e.jsx(Se,{size:13}),xe?"Close Rename":"Rename"]}),me&&e.jsxs("button",{className:`${a.actionBtn} ${a.editBtn}`,onClick:Nt,title:"Edit document",children:[e.jsx(Se,{size:13}),"Edit"]}),e.jsxs("button",{className:a.actionBtn,onClick:Mt,title:ae?"Hide review and comments":"Show review and comments",children:[e.jsx(He,{size:13}),ae?"Hide Review":"Show Review"]}),e.jsxs("button",{className:a.actionBtn,onClick:Rt,title:"Copy link",children:[e.jsx(un,{size:13}),K?"Copied!":"Copy link"]}),e.jsxs("button",{className:a.actionBtn,onClick:Dt,title:"Download .md",children:[e.jsx(mn,{size:13}),"Download"]}),e.jsxs("button",{className:a.actionBtn,onClick:Et,title:"Print",children:[e.jsx(hn,{size:13}),"Print"]}),e.jsxs("button",{className:a.actionBtn,onClick:()=>Ct(n=>!n),title:"Toggle black and white style",children:[e.jsx(We,{size:13}),Ve?"Color":"B/W"]}),m&&t.docType==="implementation-plan"&&!T&&e.jsxs("button",{className:`${a.actionBtn} ${a.generateBtn}`,onClick:()=>De(!0),title:"Generate tasks from this plan",children:[e.jsx(Ge,{size:13}),"Generate Tasks"]}),jt&&e.jsxs("button",{className:`${a.actionBtn} ${a.dangerBtn}`,onClick:()=>{Bt()},disabled:ge,title:pe==="attached"?"Remove this document from linked tasks and delete it":"Permanently delete this unattached document",children:[e.jsx(fn,{size:13}),ge?"Deleting…":pe==="attached"?"Delete & Unlink":"Delete Permanently"]})]})})]}),A&&e.jsx("div",{className:a.viewerState,children:"Loading…"}),!A&&D&&e.jsx("div",{className:a.viewerStateError,children:D}),!A&&!D&&(T?e.jsxs("div",{className:`${a.editorArea} ${Ea[H]}`,children:[(H==="editor"||H==="split")&&e.jsxs("div",{className:a.editorPane,children:[e.jsx("div",{className:a.editorPaneLabel,children:"Markdown"}),e.jsx("textarea",{ref:Ie,className:`${a.editorTextarea} tf-scrollbar`,value:O,onScroll:()=>be("editor"),onChange:n=>{de(n.target.value),U(s=>s.type==="saving"?s:{type:"idle"})},spellCheck:!0,placeholder:"Write markdown here…"})]}),(H==="preview"||H==="split")&&e.jsxs("div",{className:a.previewPane,children:[e.jsx("div",{className:a.editorPaneLabel,children:"Preview"}),e.jsx("div",{ref:Ye,className:`${M.docMarkdown} ${a.markdownSurface}`,"data-testid":"doc-preview-scroll",onScroll:()=>be("preview"),children:e.jsx(Ce,{remarkPlugins:[je],rehypePlugins:[Ne],components:it,children:tt})})]})]}):e.jsxs("div",{className:`${a.viewerBody} ${ae?"":a.viewerBodyFullWidth}`,children:[e.jsx("div",{className:`${a.viewerContent} ${a.viewerMain} tf-scrollbar`,children:e.jsx("div",{ref:Xe,className:`${M.docMarkdown} ${a.markdownSurface}`,onMouseUp:ae?Pt:void 0,children:e.jsx(Ce,{remarkPlugins:[je],rehypePlugins:[Ne],components:it,children:tt})})}),ae&&e.jsx("aside",{className:a.reviewRail,children:e.jsxs("section",{className:a.reviewSection,"aria-label":"Review and comments",children:[e.jsxs("div",{className:a.reviewHeader,children:[e.jsxs("div",{children:[e.jsxs("div",{className:a.reviewTitle,children:[e.jsx(He,{size:14}),"Review & Comments"]}),e.jsx("p",{className:a.reviewSubtitle,children:"Comments stay attached to this document review session."})]}),e.jsxs("div",{className:a.reviewControls,children:[x.length>1&&e.jsx("select",{className:`${M.select} ${a.reviewSelect}`,value:p?.id||"",onChange:n=>F(n.target.value||null),"aria-label":"Select review session",children:x.map(n=>e.jsx("option",{value:n.id,children:n.title?.trim()||"Untitled review"},n.id))}),e.jsxs("button",{type:"button",className:a.actionBtn,onClick:()=>{Pe()},disabled:C||!t.assetId,children:[e.jsx(He,{size:13}),"Start Review"]}),p&&e.jsxs("button",{type:"button",className:a.actionBtn,onClick:()=>{It()},disabled:C,children:[p.status==="resolved"?e.jsx(pn,{size:13}):e.jsx(vn,{size:13}),p.status==="resolved"?"Reopen":"Resolve"]})]})]}),p&&e.jsxs("div",{className:a.reviewSessionMeta,children:[e.jsx("span",{className:`${a.statusBadge} ${p.status==="resolved"?a.reviewStatusResolved:""}`,children:p.status==="resolved"?"Resolved":"Open"}),Z?e.jsxs("div",{className:a.reviewTitleEditRow,children:[e.jsx("input",{type:"text",className:M.input,value:oe,onChange:n=>Re(n.target.value),placeholder:"Untitled review"}),e.jsx("button",{type:"button",className:M.secondaryHeaderBtn,onClick:()=>{Lt()},disabled:C,children:"Save Title"})]}):e.jsx("span",{className:a.reviewSessionLabel,children:p.title?.trim()||"Untitled review"}),e.jsxs("span",{className:a.reviewSessionTimestamp,children:["Updated ",ft(p.updatedAt)]}),!Z&&e.jsxs("button",{type:"button",className:a.actionBtn,onClick:()=>ee(!0),disabled:C,children:[e.jsx(Se,{size:13}),"Rename Review"]})]}),se&&e.jsx("div",{className:a.viewerStateError,children:se}),e.jsxs("div",{className:B.commentPanel,children:[e.jsxs("div",{className:B.commentThread,children:[W&&e.jsx("div",{className:B.emptyComments,children:"Loading review comments…"}),!W&&!p&&e.jsx("div",{className:B.emptyComments,children:"Start a review to collect comments for this document."}),!W&&p&&p.comments.length===0&&e.jsx("div",{className:B.emptyComments,children:"No comments yet. Add the first review note for this document."}),!W&&p&&p.comments.map(n=>{const s=n.authorActor?.kind==="ai",l=pt(n.anchor),d=s?wn:yn,f=le===n.id;return e.jsxs("div",{className:`${B.comment} ${s?B.commentAi:B.commentUser}`,children:[e.jsxs("div",{className:B.commentHeader,children:[e.jsxs("span",{className:B.commentAuthor,style:n.authorActor?.color?{color:n.authorActor.color}:void 0,children:[e.jsx(d,{size:12,strokeWidth:1.5}),Pa(n)]}),e.jsx("span",{className:B.commentTime,children:ft(n.updatedAt)}),e.jsxs("span",{className:a.reviewCommentActions,children:[!f&&e.jsx("button",{type:"button",className:a.reviewCommentAction,onClick:()=>zt(n.id,n.body),disabled:C,children:"Edit"}),f&&e.jsx("button",{type:"button",className:a.reviewCommentAction,onClick:()=>{fe(null),ce("")},disabled:C,children:"Cancel"}),e.jsx("button",{type:"button",className:a.reviewCommentAction,onClick:()=>{Ot(n.id)},disabled:C,children:"Delete"})]})]}),l&&e.jsx("span",{className:a.reviewAnchorLabel,children:l}),e.jsx("div",{className:B.commentText,children:f?e.jsxs("div",{className:a.reviewCommentEditor,children:[e.jsx("textarea",{className:B.commentInput,value:we,onChange:b=>ce(b.target.value),disabled:C}),e.jsx("button",{type:"button",className:M.secondaryHeaderBtn,onClick:()=>{Ft()},disabled:C||!we.trim(),children:"Save Comment"})]}):e.jsx(Ce,{remarkPlugins:[je],rehypePlugins:[Ne],children:n.body})})]},n.id)}),e.jsx("div",{ref:qe})]}),e.jsxs("div",{className:B.commentInputArea,children:[e.jsxs("div",{className:a.reviewComposer,children:[k&&e.jsxs("div",{className:a.reviewAnchorChip,children:[e.jsx("span",{children:pt(k)||"Selected text"}),"quote"in k&&k.quote&&e.jsxs("span",{className:a.reviewAnchorSnippet,children:['"',k.quote,'"']}),e.jsx("button",{type:"button",className:a.reviewAnchorClear,onClick:()=>G(null),children:"Clear"})]}),e.jsx("textarea",{className:B.commentInput,placeholder:p?.status==="resolved"?"Reopen this review to add more comments…":k?"Add a comment for the selected text…":"Add a comment for this document review…",value:V,onChange:n=>q(n.target.value),disabled:C||p?.status==="resolved",onKeyDown:n=>{n.key==="Enter"&&!n.shiftKey&&(n.preventDefault(),nt())}})]}),e.jsx("button",{type:"button",className:B.sendCommentBtn,onClick:()=>{nt()},disabled:C||!V.trim()||p?.status==="resolved","aria-label":"Send review comment",title:"Send review comment",children:e.jsx(gn,{size:15})})]})]})]})})]})),m&&St&&N!==null&&e.jsx(ja,{content:N,docTitle:t.title,apiBaseUrl:o,onClose:()=>De(!1),onGenerated:n=>De(!1)}),!T&&e.jsx("div",{className:a.printHint,children:"For the cleanest output, disable browser Headers and footers in the print dialog."})]})}function wt(t){return typeof t=="string"?t.trim().replace(/\/+$/,""):""}function Wa(t){return t.runtimeMode==="local"?"":wt(t.apiBaseUrl)||wt(t.cloudAuthBaseUrl)||""}function Ga({runtimeMode:t="local",apiBaseUrl:c="",cloudAuthBaseUrl:o="",typeFilters:i,attachmentFilters:u,onTypeFiltersChange:m,onAttachmentFiltersChange:v,requestedDocPath:y=null,requestedDocAssetId:g=null,onRequestedDocHandled:w}){const[h,_]=r.useState([]),[N,R]=r.useState(!0),[A,z]=r.useState(null),[D,L]=r.useState(null),[K,Q]=r.useState(""),[J,Y]=r.useState(()=>Jt.map(k=>k.value)),[x,S]=r.useState(()=>Vt.map(k=>k.value)),W=Wa({runtimeMode:t,apiBaseUrl:c,cloudAuthBaseUrl:o}),ne=i??J,se=u??x,$=m??Y,Ee=v??S,F=r.useCallback(async()=>{R(!0),z(null);try{const k=await I("/api/taskforce/documents",{credentials:"include"},W);if(!k.ok)throw new Error(`Failed to load documents (${k.status})`);const G=await k.json(),Z=Array.isArray(G.documents)?G.documents:[];Z.length,_(Z)}catch(k){z(k?.message||"Failed to load documents"),k?.message}finally{R(!1)}},[W,t]);r.useEffect(()=>{F()},[F]);const V=r.useMemo(()=>Hn(h,K,ne,se),[se,h,K,ne]),q=r.useMemo(()=>D?h.find(k=>k.id===D)??null:null,[h,D]);r.useEffect(()=>{if(!y&&!g||h.length===0)return;const k=y?Ue(y):"",G=String(g||"").trim().toLowerCase()||mt(y),Z=h.find(ee=>{const oe=mt(ee.fsPath)||String(ee.assetId||"").trim().toLowerCase()||null;return G&&oe&&oe===G?!0:k?On(Ue(ee.fsPath),k):!1});Z&&(L(Z.id),w?.())},[h,w,g,y]),r.useEffect(()=>{if(!((y||g)&&!q)){if(V.length===0){D!==null&&L(null);return}q&&V.some(k=>k.id===q.id)||L(V[0].id)}},[V,g,y,q,D]);const C=r.useCallback(async()=>{L(null),await F()},[F]),P=K.trim().length>0||ne.length>0||se.length>0;return{documentApiBaseUrl:W,documents:h,filteredDocs:V,loading:N,error:A,selectedDoc:q,searchQuery:K,typeFilters:ne,attachmentFilters:se,hasActiveFilters:P,setSearchQuery:Q,handleTypeFiltersChange:$,handleAttachmentFiltersChange:Ee,fetchDocuments:F,selectDoc:k=>L(k?.id??null),handleDeleteSelected:C}}function Ua({tasks:t,apiBaseUrl:c="",documents:o,loading:i,error:u,selectedDoc:m,searchQuery:v,hasActiveFilters:y,onSearchChange:g,onSelectDoc:w,onRefresh:h,onDeleteSelected:_,enableTaskGeneration:N=!1}){const R=new Map(t.map(A=>[A.id,A]));return e.jsxs("div",{className:M.docWorkspace,children:[e.jsx("div",{className:M.docIndexPanel,children:e.jsx(Jn,{documents:o,selectedDocId:m?.id??null,loading:i,error:u,searchQuery:v,onSearchChange:g,onSelect:A=>w(A),onRefresh:h,taskById:R,hasActiveFilters:y})}),e.jsx("div",{className:M.docViewerPanel,children:m?e.jsx(Ha,{doc:m,taskTitle:m.taskId?R.get(m.taskId)?.title??null:null,apiBaseUrl:c,onSaved:A=>h(),onDeleted:()=>{_()},enableTaskGeneration:N}):!i&&e.jsx("div",{className:M.docViewerEmpty,children:e.jsx("p",{className:"tf-empty-copy",children:o.length===0?"No documents match your current filters.":"Select a document to view it."})})})]})}function Xa({tasks:t,runtimeMode:c="local",apiBaseUrl:o="",cloudAuthBaseUrl:i="",typeFilters:u,attachmentFilters:m,onTypeFiltersChange:v,onAttachmentFiltersChange:y,requestedDocPath:g=null,requestedDocAssetId:w=null,onRequestedDocHandled:h,enableTaskGeneration:_=!1}){const{documentApiBaseUrl:N,filteredDocs:R,loading:A,error:z,selectedDoc:D,searchQuery:L,hasActiveFilters:K,setSearchQuery:Q,fetchDocuments:J,selectDoc:Y,handleDeleteSelected:x}=Ga({runtimeMode:c,apiBaseUrl:o,cloudAuthBaseUrl:i,typeFilters:u,attachmentFilters:m,onTypeFiltersChange:v,onAttachmentFiltersChange:y,requestedDocPath:g,requestedDocAssetId:w,onRequestedDocHandled:h});return e.jsx(Ua,{tasks:t,apiBaseUrl:N,documents:R,loading:A,error:z,selectedDoc:D,searchQuery:L,hasActiveFilters:K,onSearchChange:Q,onSelectDoc:Y,onRefresh:J,onDeleteSelected:x,enableTaskGeneration:_})}export{Vt as DOCUMENT_ATTACHMENT_FILTER_OPTIONS,Jt as DOCUMENT_TYPE_FILTER_OPTIONS,Ua as DocumentWorkspace,Xa as DocumentWorkspaceShell};
|