@taskforcehq/taskforce 0.3.328 → 0.3.330

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.
Files changed (485) hide show
  1. package/dist/Taskforce.module.css +523 -79
  2. package/dist/TaskforceCore.js +237 -230
  3. package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.js +1 -1
  4. package/dist/cli.js +34 -0
  5. package/dist/cliCloudTargetGuard.d.ts +5 -0
  6. package/dist/cliCloudTargetGuard.js +11 -0
  7. package/dist/components/features/AiProfilesModule.js +3 -5
  8. package/dist/components/features/AnnotatedAttachmentWorkspace.js +24 -8
  9. package/dist/components/features/TaskSettings.d.ts +12 -1
  10. package/dist/components/features/TaskSettings.js +217 -54
  11. package/dist/components/features/TaskforceAgentsModule.d.ts +1 -2
  12. package/dist/components/features/TaskforceAgentsModule.js +586 -116
  13. package/dist/components/features/agentCapabilities/AgentCapabilitiesPrototype.d.ts +1 -1
  14. package/dist/components/features/agentConnections/AgentConnectionControl.d.ts +15 -0
  15. package/dist/components/features/agentConnections/AgentConnectionControl.js +125 -0
  16. package/dist/components/features/agentConnections/ModelConnectionsPanel.d.ts +18 -0
  17. package/dist/components/features/agentConnections/ModelConnectionsPanel.js +393 -0
  18. package/dist/components/features/agentConnections/modelConnectionsApi.d.ts +65 -0
  19. package/dist/components/features/agentConnections/modelConnectionsApi.js +129 -0
  20. package/dist/components/features/planning/PlanningModule.js +2 -5
  21. package/dist/components/features/planning/PlanningTaskOrderList.d.ts +1 -1
  22. package/dist/components/features/planning/PlanningTaskOrderList.js +17 -6
  23. package/dist/components/features/planning/planningTaskArrangement.d.ts +1 -0
  24. package/dist/components/features/planning/planningTaskArrangement.js +5 -5
  25. package/dist/components/features/taskforceAgentAssignments/AgentBehaviorAssignments.js +15 -24
  26. package/dist/components/features/taskforceAgentEditorModel.d.ts +2 -1
  27. package/dist/components/features/taskforceAgentEditorModel.js +5 -1
  28. package/dist/components/features/workflowManager/workflowManagerApi.d.ts +1 -1
  29. package/dist/components/features/workflowManager/workflowManagerApi.js +3 -0
  30. package/dist/components/task/TaskCard.d.ts +5 -0
  31. package/dist/components/task/TaskCard.js +65 -10
  32. package/dist/components/task/TaskImageReviews.js +14 -5
  33. package/dist/components/task/TaskKanban.d.ts +6 -1
  34. package/dist/components/task/TaskKanban.js +152 -6
  35. package/dist/components/task/TaskList.d.ts +5 -0
  36. package/dist/components/task/TaskList.js +3 -3
  37. package/dist/components/task/TaskWorkflowAssignmentField.js +68 -10
  38. package/dist/components/ui/PasswordInput.d.ts +6 -0
  39. package/dist/components/ui/PasswordInput.js +11 -0
  40. package/dist/components/ui/TopNoticeLayer.js +1 -1
  41. package/dist/components/views/AppShellHeader.js +32 -11
  42. package/dist/components/views/PlanComparisonPage.js +12 -0
  43. package/dist/components/views/StandaloneLayout.js +32 -55
  44. package/dist/components/views/WidgetView.js +3 -3
  45. package/dist/components/views/panels/PlanningDrawer.js +5 -12
  46. package/dist/components/views/standalone/modals/AccountSettingsModal.js +26 -17
  47. package/dist/components/views/standalone/modals/SyncStatusModal.d.ts +4 -3
  48. package/dist/components/views/standalone/modals/SyncStatusModal.js +33 -38
  49. package/dist/config/envSchema.js +60 -1
  50. package/dist/config/localServiceRuntimeContract.d.ts +13 -0
  51. package/dist/config/localServiceRuntimeContract.js +135 -0
  52. package/dist/core/AiProfileService.js +46 -8
  53. package/dist/core/DeletedTaskLifecycleService.d.ts +1 -0
  54. package/dist/core/DeletedTaskLifecycleService.js +37 -6
  55. package/dist/core/McpTokenService.d.ts +23 -1
  56. package/dist/core/McpTokenService.js +93 -10
  57. package/dist/core/TaskAttachmentLinksDurableMutationService.d.ts +3 -2
  58. package/dist/core/TaskAttachmentLinksDurableMutationService.js +33 -9
  59. package/dist/core/TaskChecklistCommandService.d.ts +27 -0
  60. package/dist/core/TaskChecklistCommandService.js +83 -5
  61. package/dist/core/TaskLifecycleCommandService.d.ts +3 -1
  62. package/dist/core/TaskLifecycleCommandService.js +6 -2
  63. package/dist/core/Taskforce.d.ts +94 -2
  64. package/dist/core/Taskforce.js +760 -36
  65. package/dist/core/types.d.ts +14 -0
  66. package/dist/documentReviews/commandService.d.ts +2 -1
  67. package/dist/documentReviews/commandService.js +6 -3
  68. package/dist/hooks/sync/orchestratorShared.d.ts +1 -0
  69. package/dist/hooks/sync/orchestratorShared.js +2 -0
  70. package/dist/hooks/sync/useDurableLocalOutboxDrain.d.ts +1 -1
  71. package/dist/hooks/sync/useDurableTaskCreateMutation.js +1 -1
  72. package/dist/hooks/sync/useDurableTaskMetadataMutation.d.ts +1 -0
  73. package/dist/hooks/sync/useDurableTaskMetadataMutation.js +1 -0
  74. package/dist/hooks/sync/useDurableTaskStatusMutation.d.ts +1 -0
  75. package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.d.ts +3 -0
  76. package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.js +85 -9
  77. package/dist/hooks/sync/useSyncStatusControls.d.ts +4 -1
  78. package/dist/hooks/sync/useSyncStatusControls.js +47 -11
  79. package/dist/hooks/tasks/taskHttpMutation.js +1 -0
  80. package/dist/hooks/tasks/useCloudTaskSearch.d.ts +12 -0
  81. package/dist/hooks/tasks/useCloudTaskSearch.js +71 -0
  82. package/dist/hooks/tasks/useTaskDescriptionImageDraftRecovery.d.ts +16 -0
  83. package/dist/hooks/tasks/useTaskDescriptionImageDraftRecovery.js +197 -0
  84. package/dist/hooks/tasks/useTaskEditorNavigation.d.ts +16 -3
  85. package/dist/hooks/tasks/useTaskEditorNavigation.js +72 -13
  86. package/dist/hooks/tasks/useTaskFormActions.d.ts +6 -0
  87. package/dist/hooks/tasks/useTaskFormActions.js +65 -12
  88. package/dist/hooks/ui/useSettingsModel.d.ts +24 -2
  89. package/dist/hooks/ui/useSettingsModel.js +13 -2
  90. package/dist/hooks/ui/useSettingsPersistence.d.ts +12 -1
  91. package/dist/hooks/ui/useSettingsPersistence.js +74 -47
  92. package/dist/hooks/useFilterSort.d.ts +7 -3
  93. package/dist/hooks/useFilterSort.js +15 -5
  94. package/dist/hooks/useSyncOrchestrator.d.ts +3 -0
  95. package/dist/hooks/useSyncOrchestrator.js +111 -2
  96. package/dist/hooks/useTaskData.d.ts +40 -1
  97. package/dist/hooks/useTaskData.js +240 -9
  98. package/dist/hooks/useTaskMutations.d.ts +12 -2
  99. package/dist/hooks/useTaskMutations.js +266 -52
  100. package/dist/hooks/useTaskforce.d.ts +39 -9
  101. package/dist/hooks/useTaskforce.js +359 -40
  102. package/dist/hooks/useUiNotice.d.ts +4 -0
  103. package/dist/hooks/useUiNotice.js +4 -0
  104. package/dist/mcp/adminWorkspaceRegistrar.js +3 -3
  105. package/dist/mcp/clientRegistry.d.ts +2 -2
  106. package/dist/mcp/clientRegistry.js +1 -1
  107. package/dist/mcp/documentAssetRegistrar.js +53 -41
  108. package/dist/mcp/documentHelpers.d.ts +1 -0
  109. package/dist/mcp/documentHelpers.js +7 -3
  110. package/dist/mcp/durableTaskMutationRouter.d.ts +4 -1
  111. package/dist/mcp/durableTaskMutationRouter.js +10 -0
  112. package/dist/mcp/durableTaskRelationshipMutationRouter.js +4 -0
  113. package/dist/mcp/httpProtocolRouting.d.ts +10 -0
  114. package/dist/mcp/httpProtocolRouting.js +19 -0
  115. package/dist/mcp/localCliHealth.d.ts +2 -2
  116. package/dist/mcp/localCliHealth.js +2 -2
  117. package/dist/mcp/localServiceProxy.d.ts +1 -0
  118. package/dist/mcp/localServiceProxy.js +530 -68
  119. package/dist/mcp/planningAttachmentCommandAdapter.d.ts +3 -1
  120. package/dist/mcp/planningAttachmentCommandAdapter.js +20 -2
  121. package/dist/mcp/runtime.d.ts +54 -79
  122. package/dist/mcp/runtime.js +556 -139
  123. package/dist/mcp/taskPlanningRegistrar.js +64 -42
  124. package/dist/mcp/toolCallCompatibility.js +38 -1
  125. package/dist/mcp/toolCatalog.d.ts +1 -0
  126. package/dist/mcp/toolProfiles.d.ts +2 -0
  127. package/dist/mcp/toolProfiles.js +10 -0
  128. package/dist/mcp/toolRegistry.d.ts +1 -0
  129. package/dist/mcp/toolRegistry.js +1 -0
  130. package/dist/mcp/workflowExecutionRegistrar.js +4 -4
  131. package/dist/migrations/taskSchemaMigrations.d.ts +5 -0
  132. package/dist/migrations/taskSchemaMigrations.js +427 -0
  133. package/dist/runtime/appGateDefinitions.d.ts +30 -6
  134. package/dist/runtime/appGateDefinitions.js +6 -6
  135. package/dist/runtime/appGates.d.ts +13 -13
  136. package/dist/runtime/appGates.js +36 -13
  137. package/dist/runtime/nodeAppGates.d.ts +8 -0
  138. package/dist/runtime/nodeAppGates.js +27 -0
  139. package/dist/server/cloudCollectionRead.d.ts +1 -1
  140. package/dist/server/cloudCollectionRead.js +2 -2
  141. package/dist/server/index.d.ts +6 -0
  142. package/dist/server/index.js +123 -14
  143. package/dist/server/localDatabaseIdentity.js +4 -1
  144. package/dist/server/localServiceLease.d.ts +3 -0
  145. package/dist/server/localServiceLease.js +11 -2
  146. package/dist/server/localServiceSessions.d.ts +14 -17
  147. package/dist/server/localServiceSessions.js +308 -94
  148. package/dist/server/localWorkspaceSyncServerRuntime.js +12 -7
  149. package/dist/server/rateLimit.d.ts +1 -0
  150. package/dist/server/rateLimit.js +4 -0
  151. package/dist/server/realtimeSyncWs.js +36 -12
  152. package/dist/server/routes/admin.d.ts +4 -0
  153. package/dist/server/routes/admin.js +113 -3
  154. package/dist/server/routes/agentRoles.js +3 -2
  155. package/dist/server/routes/agentSkills.js +3 -2
  156. package/dist/server/routes/agents.d.ts +7 -0
  157. package/dist/server/routes/agents.js +394 -39
  158. package/dist/server/routes/annotatedAttachments.js +3 -2
  159. package/dist/server/routes/auth.js +3 -1
  160. package/dist/server/routes/billing.js +5 -1
  161. package/dist/server/routes/durableTaskHttpRouters.d.ts +11 -2
  162. package/dist/server/routes/executorPhaseAApprovals.d.ts +19 -0
  163. package/dist/server/routes/executorPhaseAApprovals.js +140 -0
  164. package/dist/server/routes/executorPhaseAIssuerRedemptions.d.ts +11 -0
  165. package/dist/server/routes/executorPhaseAIssuerRedemptions.js +24 -0
  166. package/dist/server/routes/githubReviewEvidence.d.ts +19 -0
  167. package/dist/server/routes/githubReviewEvidence.js +116 -0
  168. package/dist/server/routes/localService.d.ts +15 -4
  169. package/dist/server/routes/localService.js +138 -40
  170. package/dist/server/routes/modelConnections.d.ts +24 -0
  171. package/dist/server/routes/modelConnections.js +205 -0
  172. package/dist/server/routes/primitives.d.ts +2 -0
  173. package/dist/server/routes/shared.d.ts +19 -0
  174. package/dist/server/routes/shared.js +95 -19
  175. package/dist/server/routes/sync.js +1 -0
  176. package/dist/server/routes/syncAuxRoutes.js +9 -2
  177. package/dist/server/routes/syncPullApplyRoutes.js +23 -4
  178. package/dist/server/routes/syncPushRoutes.d.ts +1 -0
  179. package/dist/server/routes/syncPushRoutes.js +1 -0
  180. package/dist/server/routes/syncV3FeedRoutes.js +27 -16
  181. package/dist/server/routes/syncV3LocalCaptureRoutes.js +28 -2
  182. package/dist/server/routes/syncV3LocalFeedApplyRoutes.d.ts +1 -0
  183. package/dist/server/routes/syncV3LocalFeedApplyRoutes.js +26 -0
  184. package/dist/server/routes/syncV3OperationRoutes.js +45 -9
  185. package/dist/server/routes/tasks.js +124 -13
  186. package/dist/server/routes/workflows.js +9 -1
  187. package/dist/server/routes/workspaces.js +43 -1
  188. package/dist/server/routes.js +59 -0
  189. package/dist/server/workspaceDeletionAdmission.d.ts +23 -0
  190. package/dist/server/workspaceDeletionAdmission.js +50 -0
  191. package/dist/service/localServiceCli.js +16 -0
  192. package/dist/service/localServiceClientLifecycle.js +36 -10
  193. package/dist/services/codexAppServerModelGateway.d.ts +161 -0
  194. package/dist/services/codexAppServerModelGateway.js +663 -0
  195. package/dist/services/codexDeviceCodeLoginManager.d.ts +39 -0
  196. package/dist/services/codexDeviceCodeLoginManager.js +265 -0
  197. package/dist/services/codexModelProviderConnectionLifecycle.d.ts +8 -0
  198. package/dist/services/codexModelProviderConnectionLifecycle.js +73 -0
  199. package/dist/services/executorPhaseAApprovalRuntime.d.ts +14 -0
  200. package/dist/services/executorPhaseAApprovalRuntime.js +24 -0
  201. package/dist/services/executorPhaseAApprovalService.d.ts +40 -0
  202. package/dist/services/executorPhaseAApprovalService.js +609 -0
  203. package/dist/services/executorPhaseADriftEvaluator.d.ts +78 -0
  204. package/dist/services/executorPhaseADriftEvaluator.js +93 -0
  205. package/dist/services/executorPhaseAIssuerCore.d.ts +126 -0
  206. package/dist/services/executorPhaseAIssuerCore.js +295 -0
  207. package/dist/services/executorPhaseAIssuerRedemptionService.d.ts +34 -0
  208. package/dist/services/executorPhaseAIssuerRedemptionService.js +158 -0
  209. package/dist/services/githubReviewEvidenceRuntime.d.ts +14 -0
  210. package/dist/services/githubReviewEvidenceRuntime.js +30 -0
  211. package/dist/services/githubReviewEvidenceService.d.ts +93 -0
  212. package/dist/services/githubReviewEvidenceService.js +336 -0
  213. package/dist/services/modelGateway.d.ts +7 -0
  214. package/dist/services/modelProviderConnectionService.d.ts +71 -0
  215. package/dist/services/modelProviderConnectionService.js +279 -0
  216. package/dist/services/modelProviderCredentialHome.d.ts +32 -0
  217. package/dist/services/modelProviderCredentialHome.js +271 -0
  218. package/dist/services/ownerScopedModelConnectionGateway.d.ts +12 -0
  219. package/dist/services/ownerScopedModelConnectionGateway.js +30 -0
  220. package/dist/services/taskforceAgentConnectionBindingService.d.ts +66 -0
  221. package/dist/services/taskforceAgentConnectionBindingService.js +185 -0
  222. package/dist/services/taskforceAgentMcpBridge.d.ts +8 -2
  223. package/dist/services/taskforceAgentMcpBridge.js +30 -27
  224. package/dist/shared/adminEdgeProxy.d.ts +5 -0
  225. package/dist/shared/adminEdgeProxy.js +94 -0
  226. package/dist/shared/adminProxySessionCookies.d.ts +16 -0
  227. package/dist/shared/adminProxySessionCookies.js +86 -0
  228. package/dist/shared/aiProfileColors.d.ts +31 -1
  229. package/dist/shared/aiProfileColors.js +14 -6
  230. package/dist/shared/executorPhaseAApprovalGoldenVector.json +269 -0
  231. package/dist/shared/executorPhaseAApprovalReceipt.d.ts +112 -0
  232. package/dist/shared/executorPhaseAApprovalReceipt.js +58 -0
  233. package/dist/shared/executorPhaseAApprovalTrustPolicy.json +10 -0
  234. package/dist/shared/executorPhaseADriftContracts.d.ts +37 -0
  235. package/dist/shared/executorPhaseADriftContracts.js +63 -0
  236. package/dist/shared/executorPhaseAIssuerContracts.d.ts +75 -0
  237. package/dist/shared/executorPhaseAIssuerContracts.js +90 -0
  238. package/dist/shared/executorPhaseARunAuthorization.d.ts +120 -0
  239. package/dist/shared/executorPhaseARunAuthorization.js +232 -0
  240. package/dist/shared/executorPhaseASchemaValidation.d.ts +7 -0
  241. package/dist/shared/executorPhaseASchemaValidation.js +53 -0
  242. package/dist/shared/executorPhaseASchemas/approval-receipt.schema.json +106 -0
  243. package/dist/shared/executorPhaseASchemas/drift-attestation.schema.json +54 -0
  244. package/dist/shared/executorPhaseASchemas/drift-request.schema.json +47 -0
  245. package/dist/shared/executorPhaseASchemas/foundation-manifest.schema.json +29 -0
  246. package/dist/shared/executorPhaseASchemas/issuer-audit-record.schema.json +24 -0
  247. package/dist/shared/executorPhaseASchemas/issuer-proof.schema.json +43 -0
  248. package/dist/shared/executorPhaseASchemas/issuer-redemption-request.schema.json +18 -0
  249. package/dist/shared/executorPhaseASchemas/issuer-redemption-response.schema.json +39 -0
  250. package/dist/shared/executorPhaseASchemas/logical-envelope.schema.json +149 -0
  251. package/dist/shared/executorPhaseASchemas/preflight-report.schema.json +216 -0
  252. package/dist/shared/executorPhaseASchemas/run-capability.schema.json +111 -0
  253. package/dist/shared/executorPhaseASchemas/sender-proof.schema.json +37 -0
  254. package/dist/shared/executorPhaseASchemas/workload-grant.schema.json +68 -0
  255. package/dist/shared/executorPhaseASchemas/workload-jwt-claims.schema.json +67 -0
  256. package/dist/shared/executorPhaseATiming.d.ts +1 -0
  257. package/dist/shared/executorPhaseATiming.js +1 -0
  258. package/dist/shared/planningIdentity.js +1 -1
  259. package/dist/shared/productLogoKeys.d.ts +2 -0
  260. package/dist/shared/productLogoKeys.js +18 -0
  261. package/dist/shared/taskforceAgentDefinition.d.ts +0 -1
  262. package/dist/shared/taskforceAgentDefinition.js +6 -3
  263. package/dist/shared/taskforceAgentModels.d.ts +1 -0
  264. package/dist/shared/taskforceAgentModels.js +36 -3
  265. package/dist/shared/userFeatureGrants.d.ts +4 -0
  266. package/dist/shared/userFeatureGrants.js +7 -0
  267. package/dist/storage/executorPhaseAApprovalReceiptStore.d.ts +37 -0
  268. package/dist/storage/executorPhaseAApprovalReceiptStore.js +81 -0
  269. package/dist/storage/executorPhaseARunAuthorizationStore.d.ts +103 -0
  270. package/dist/storage/executorPhaseARunAuthorizationStore.js +492 -0
  271. package/dist/storage/githubReviewEvidenceInstallationStore.d.ts +26 -0
  272. package/dist/storage/githubReviewEvidenceInstallationStore.js +89 -0
  273. package/dist/storage/modelProviderConnectionStore.d.ts +99 -0
  274. package/dist/storage/modelProviderConnectionStore.js +446 -0
  275. package/dist/storage/postgresAdapter.d.ts +24 -3
  276. package/dist/storage/postgresAdapter.js +117 -14
  277. package/dist/storage/postgresWorker.js +22 -5
  278. package/dist/storage/postgresWorkerProtocol.d.ts +30 -0
  279. package/dist/storage/postgresWorkerProtocol.js +30 -0
  280. package/dist/storage/taskforceAgentConnectionBindingStore.d.ts +31 -0
  281. package/dist/storage/taskforceAgentConnectionBindingStore.js +84 -0
  282. package/dist/sync/cloudSyncApi.d.ts +4 -1
  283. package/dist/sync/cloudSyncApi.js +7 -2
  284. package/dist/sync/contentSyncState.d.ts +1 -1
  285. package/dist/sync/coordinator/localSyncExecutionPermitStore.d.ts +1 -0
  286. package/dist/sync/coordinator/localSyncExecutionPermitStore.js +67 -30
  287. package/dist/sync/coordinator/localWorkspaceSyncPendingV2PushProgress.d.ts +10 -0
  288. package/dist/sync/coordinator/localWorkspaceSyncPendingV2PushProgress.js +29 -0
  289. package/dist/sync/coordinator/localWorkspaceSyncRunner.js +6 -2
  290. package/dist/sync/coordinator/localWorkspaceSyncRunnerState.d.ts +15 -1
  291. package/dist/sync/coordinator/localWorkspaceSyncRunnerState.js +99 -2
  292. package/dist/sync/coordinator/workspaceSyncCredentialBroker.d.ts +1 -0
  293. package/dist/sync/coordinator/workspaceSyncCredentialBroker.js +33 -4
  294. package/dist/sync/engine/workspaceSyncContentLifecycleAdapter.d.ts +2 -1
  295. package/dist/sync/engine/workspaceSyncContentVersionStore.d.ts +38 -0
  296. package/dist/sync/engine/workspaceSyncContentVersionStore.js +50 -1
  297. package/dist/sync/engine/workspaceSyncEngineBrowserGatewayRemoteServices.js +20 -2
  298. package/dist/sync/engine/workspaceSyncEngineLifecyclePolicy.js +6 -6
  299. package/dist/sync/engine/workspaceSyncEngineLocalServices.d.ts +4 -0
  300. package/dist/sync/engine/workspaceSyncEngineLocalServices.js +11 -0
  301. package/dist/sync/engine/workspaceSyncEnginePushCompletion.d.ts +14 -0
  302. package/dist/sync/engine/workspaceSyncEnginePushCompletion.js +84 -0
  303. package/dist/sync/engine/workspaceSyncEngineRecovery.js +1 -0
  304. package/dist/sync/engine/workspaceSyncEngineRemoteServices.d.ts +11 -0
  305. package/dist/sync/engine/workspaceSyncEngineRemoteServices.js +2 -1
  306. package/dist/sync/engine/workspaceSyncEngineRuntime.d.ts +1 -0
  307. package/dist/sync/engine/workspaceSyncEngineRuntime.js +1 -0
  308. package/dist/sync/engine/workspaceSyncEngineServerRemoteServices.js +31 -4
  309. package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.d.ts +3 -1
  310. package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.js +134 -43
  311. package/dist/sync/engine/workspaceSyncEngineServerSnapshotReader.js +6 -0
  312. package/dist/sync/engine/workspaceSyncEngineTransfers.d.ts +1 -1
  313. package/dist/sync/engine/workspaceSyncEngineTransfers.js +11 -4
  314. package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.d.ts +1 -0
  315. package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.js +29 -0
  316. package/dist/sync/syncApplyHandlers.d.ts +2 -0
  317. package/dist/sync/syncApplyHandlers.js +10 -1
  318. package/dist/sync/syncService.d.ts +17 -0
  319. package/dist/sync/syncService.js +87 -19
  320. package/dist/sync/taskforceAgentSyncAuthorization.d.ts +16 -0
  321. package/dist/sync/taskforceAgentSyncAuthorization.js +20 -0
  322. package/dist/sync/v3/combinedFeedCapability.js +8 -0
  323. package/dist/sync/v3/durableInitiativeMutationRouter.js +18 -10
  324. package/dist/sync/v3/durableOperationReplay.d.ts +14 -0
  325. package/dist/sync/v3/durableOperationReplay.js +18 -0
  326. package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.d.ts +2 -0
  327. package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.js +14 -1
  328. package/dist/sync/v3/durableTaskChecklistMutationRouter.d.ts +4 -1
  329. package/dist/sync/v3/durableTaskChecklistMutationRouter.js +62 -15
  330. package/dist/sync/v3/durableTaskCommentMutationRouter.js +3 -0
  331. package/dist/sync/v3/durableTaskHttpBulkMutationRouter.d.ts +1 -0
  332. package/dist/sync/v3/durableTaskHttpBulkMutationRouter.js +30 -8
  333. package/dist/sync/v3/durableTaskHttpRootMutationRouter.d.ts +5 -3
  334. package/dist/sync/v3/durableTaskHttpRootMutationRouter.js +37 -2
  335. package/dist/sync/v3/durableTaxonomyMutationRouter.js +5 -0
  336. package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.d.ts +11 -0
  337. package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.js +39 -10
  338. package/dist/sync/v3/durableWorkstreamMutationRouter.js +18 -10
  339. package/dist/sync/v3/durableWorkstreamTaskOrderMutationRouter.js +16 -5
  340. package/dist/sync/v3/localOutboxDispatchRuntime.js +2 -2
  341. package/dist/sync/v3/localTaskAttachmentLinksOutboxService.d.ts +2 -0
  342. package/dist/sync/v3/localTaskAttachmentLinksOutboxService.js +47 -7
  343. package/dist/sync/v3/localTaskChecklistOutboxHandler.js +16 -2
  344. package/dist/sync/v3/localTaskChecklistOutboxService.d.ts +4 -0
  345. package/dist/sync/v3/localTaskChecklistOutboxService.js +14 -1
  346. package/dist/sync/v3/localTaskCreateOutboxService.js +15 -6
  347. package/dist/sync/v3/localTaskMetadataClient.d.ts +1 -0
  348. package/dist/sync/v3/localTaskMetadataClient.js +1 -0
  349. package/dist/sync/v3/localTaskMetadataOutboxHandler.js +5 -1
  350. package/dist/sync/v3/localTaskMetadataOutboxService.d.ts +2 -0
  351. package/dist/sync/v3/localTaskMetadataOutboxService.js +7 -0
  352. package/dist/sync/v3/localTaskRestoreOutboxService.js +14 -6
  353. package/dist/sync/v3/localTaskStatusClient.d.ts +1 -0
  354. package/dist/sync/v3/localTaskStatusClient.js +6 -1
  355. package/dist/sync/v3/localTaskStatusOutboxService.d.ts +10 -0
  356. package/dist/sync/v3/localTaskStatusOutboxService.js +272 -24
  357. package/dist/sync/v3/syncDurabilityStore.d.ts +41 -0
  358. package/dist/sync/v3/syncDurabilityStore.js +199 -13
  359. package/dist/sync/v3/taskAttachmentLinksMutationService.d.ts +6 -4
  360. package/dist/sync/v3/taskAttachmentLinksMutationService.js +19 -10
  361. package/dist/sync/v3/taskChecklistMutationService.d.ts +15 -2
  362. package/dist/sync/v3/taskChecklistMutationService.js +48 -1
  363. package/dist/sync/v3/taskCreateMutationService.d.ts +2 -2
  364. package/dist/sync/v3/taskCreateMutationService.js +7 -4
  365. package/dist/sync/v3/taskMetadataMutationService.d.ts +3 -0
  366. package/dist/sync/v3/taskMetadataMutationService.js +4 -0
  367. package/dist/sync/v3/taskRestoreMutationService.d.ts +2 -2
  368. package/dist/sync/v3/taskRestoreMutationService.js +7 -4
  369. package/dist/sync/v3/taskStatusMutationService.d.ts +31 -1
  370. package/dist/sync/v3/taskStatusMutationService.js +123 -3
  371. package/dist/sync/v3/workflowAssignmentSync.d.ts +6 -0
  372. package/dist/sync/v3/workflowAssignmentSync.js +30 -0
  373. package/dist/sync/v3/workspaceSyncJournalReader.js +1 -1
  374. package/dist/sync/v3/workspaceSyncOperationRetentionService.d.ts +16 -0
  375. package/dist/sync/v3/workspaceSyncOperationRetentionService.js +83 -0
  376. package/dist/sync/v3/workspaceSyncV2ProjectionExclusions.d.ts +1 -1
  377. package/dist/sync/v3/workspaceSyncV2ProjectionExclusions.js +13 -3
  378. package/dist/sync/v3/workspaceSyncV3AttachmentApplyObligationStore.d.ts +11 -0
  379. package/dist/sync/v3/workspaceSyncV3AttachmentApplyObligationStore.js +27 -10
  380. package/dist/sync/v3/workspaceSyncV3AttachmentAssetHydration.d.ts +2 -1
  381. package/dist/sync/v3/workspaceSyncV3AttachmentAssetHydration.js +52 -10
  382. package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.d.ts +1 -0
  383. package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.js +18 -3
  384. package/dist/sync/v3/workspaceSyncV3CombinedFeedOrchestrator.js +8 -3
  385. package/dist/sync/v3/workspaceSyncV3CombinedLocalApply.js +51 -10
  386. package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.d.ts +14 -0
  387. package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.js +49 -25
  388. package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.d.ts +13 -4
  389. package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.js +124 -57
  390. package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.d.ts +20 -0
  391. package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.js +106 -30
  392. package/dist/sync/v3/workspaceSyncV3CombinedWireContract.d.ts +4 -1
  393. package/dist/sync/v3/workspaceSyncV3CombinedWireContract.js +34 -0
  394. package/dist/sync/v3/workspaceSyncV3CoverageRegistry.js +12 -0
  395. package/dist/sync/v3/workspaceSyncV3FeedProfile.d.ts +1 -1
  396. package/dist/sync/v3/workspaceSyncV3LegacyBoundaryAttestation.d.ts +1 -0
  397. package/dist/sync/v3/workspaceSyncV3LegacyBoundaryAttestation.js +23 -10
  398. package/dist/sync/v3/workspaceSyncV3NestedTaskApply.d.ts +3 -0
  399. package/dist/sync/v3/workspaceSyncV3NestedTaskApply.js +64 -13
  400. package/dist/sync/v3/workspaceSyncV3NestedTaskCodecs.d.ts +9 -0
  401. package/dist/sync/v3/workspaceSyncV3NestedTaskCodecs.js +26 -0
  402. package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.d.ts +15 -5
  403. package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.js +50 -14
  404. package/dist/sync/v3/workspaceSyncV3NestedTaskRepairSnapshot.d.ts +2 -1
  405. package/dist/sync/v3/workspaceSyncV3NestedTaskRepairSnapshot.js +11 -3
  406. package/dist/sync/v3/workspaceSyncV3OperationProtocol.d.ts +5 -0
  407. package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.d.ts +7 -0
  408. package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.js +55 -9
  409. package/dist/sync/v3/workspaceSyncV3RepairSnapshotRetentionService.d.ts +17 -0
  410. package/dist/sync/v3/workspaceSyncV3RepairSnapshotRetentionService.js +64 -0
  411. package/dist/sync/v3/workspaceSyncV3TaskCommentAudit.js +9 -2
  412. package/dist/sync/v3/workspaceSyncV3TaskCoverCoverage.d.ts +7 -0
  413. package/dist/sync/v3/workspaceSyncV3TaskCoverCoverage.js +37 -0
  414. package/dist/sync/v3/workspaceSyncV3TaskCoverWireContract.d.ts +6 -0
  415. package/dist/sync/v3/workspaceSyncV3TaskCoverWireContract.js +9 -0
  416. package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverCoverage.d.ts +7 -0
  417. package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverCoverage.js +33 -0
  418. package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverWireContract.d.ts +7 -0
  419. package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverWireContract.js +8 -0
  420. package/dist/sync/workspacePullFeed.js +2 -1
  421. package/dist/sync/workspaceRepair.d.ts +8 -2
  422. package/dist/sync/workspaceRepair.js +222 -6
  423. package/dist/sync/workspaceSyncModel.d.ts +21 -0
  424. package/dist/sync/workspaceSyncModel.js +35 -7
  425. package/dist/sync/workspaceSyncState.d.ts +1 -0
  426. package/dist/sync/workspaceSyncV2SnapshotBuilder.d.ts +6 -0
  427. package/dist/sync/workspaceSyncV2SnapshotBuilder.js +5 -0
  428. package/dist/types.d.ts +47 -1
  429. package/dist/types.js +6 -0
  430. package/dist/ui/assets/AiIdentityRosterCard-OcSz1PkK.js +1 -0
  431. package/dist/ui/assets/AiProfilesModule-ByhYW5Xi.js +1 -0
  432. package/dist/ui/assets/AnnotatedAttachmentWorkspace-BTM6nIg_.js +3 -0
  433. package/dist/ui/assets/AnnotatedAttachmentWorkspace-TzYu7pkG.css +1 -0
  434. package/dist/ui/assets/{AssetTraySortControl-Kf1pelSy.js → AssetTraySortControl-DabEG8L4.js} +1 -1
  435. package/dist/ui/assets/{ContextAttachmentManager-B8boOs6Q.js → ContextAttachmentManager-Coa8yVGM.js} +2 -2
  436. package/dist/ui/assets/{DocumentWorkspace-DXH4XUsB.js → DocumentWorkspace-BB0qhdix.js} +1 -1
  437. package/dist/ui/assets/{EntityActivityTimeline-BtSTq0ON.js → EntityActivityTimeline-CZ8x4UJE.js} +1 -1
  438. package/dist/ui/assets/PlanningModule-pRPjR7v5.js +1 -0
  439. package/dist/ui/assets/PlansPage-D86pZSSl.js +1 -0
  440. package/dist/ui/assets/TaskContextUpload-BVIkU9yT.js +1 -0
  441. package/dist/ui/assets/TaskSettings-Cv1mNhv_.js +12 -0
  442. package/dist/ui/assets/TaskforceAgentsModule-b-8R25cJ.css +1 -0
  443. package/dist/ui/assets/TaskforceAgentsModule-gmH-PD2q.js +24 -0
  444. package/dist/ui/assets/{WorkflowManagerModule-DWFspC-o.js → WorkflowManagerModule-DbfnHJ-f.js} +1 -1
  445. package/dist/ui/assets/index-BZ-hdZSk.css +1 -0
  446. package/dist/ui/assets/index-CTsDBaef.js +7 -0
  447. package/dist/ui/assets/{vendor-icons-BkFLXavV.js → vendor-icons-Bsq-mcEn.js} +1 -1
  448. package/dist/ui/branding/logos/letterhead_dark.png +0 -0
  449. package/dist/ui/branding/logos/letterhead_light.png +0 -0
  450. package/dist/ui/branding/logos/signature_dark.png +0 -0
  451. package/dist/ui/branding/logos/signature_light.png +0 -0
  452. package/dist/ui/index.html +3 -3
  453. package/dist/utils/aiProfileDefaultLogo.js +16 -48
  454. package/dist/utils/httpSetCookie.d.ts +1 -0
  455. package/dist/utils/httpSetCookie.js +4 -1
  456. package/dist/utils/localRuntimeUrl.d.ts +1 -0
  457. package/dist/utils/localRuntimeUrl.js +14 -0
  458. package/dist/utils/productLogoRegistry.d.ts +2 -0
  459. package/dist/utils/productLogoRegistry.js +36 -0
  460. package/dist/utils/syncStatusPresentation.d.ts +4 -0
  461. package/dist/utils/syncStatusPresentation.js +17 -0
  462. package/dist/utils/taskActivity.d.ts +3 -2
  463. package/dist/utils/taskActivity.js +19 -2
  464. package/dist/utils/taskEditorReconciliation.d.ts +40 -0
  465. package/dist/utils/taskEditorReconciliation.js +217 -0
  466. package/dist/utils/taskEvents.d.ts +2 -0
  467. package/dist/utils/taskNormalization.d.ts +1 -0
  468. package/dist/utils/taskNormalization.js +39 -0
  469. package/dist/utils/taskSearch.js +2 -2
  470. package/dist/utils/uiNotice.d.ts +4 -0
  471. package/dist/utils/workspaceSyncPresentation.d.ts +1 -1
  472. package/dist/utils/workspaceSyncPresentation.js +23 -17
  473. package/package.json +36 -6
  474. package/dist/ui/assets/AiIdentityRosterCard-MZs7lVED.js +0 -1
  475. package/dist/ui/assets/AiProfilesModule-C3i0LOxe.js +0 -1
  476. package/dist/ui/assets/AnnotatedAttachmentWorkspace-CBRZ8rca.css +0 -1
  477. package/dist/ui/assets/AnnotatedAttachmentWorkspace-DVZk5Tln.js +0 -3
  478. package/dist/ui/assets/PlanningModule-BPVyEa-f.js +0 -1
  479. package/dist/ui/assets/PlansPage-ChqgxALc.js +0 -1
  480. package/dist/ui/assets/TaskContextUpload-CB3ol0sN.js +0 -1
  481. package/dist/ui/assets/TaskSettings-g4ECKNOz.js +0 -12
  482. package/dist/ui/assets/TaskforceAgentsModule-BazdUwxZ.js +0 -21
  483. package/dist/ui/assets/TaskforceAgentsModule-D6IC0S7Q.css +0 -1
  484. package/dist/ui/assets/index-BUplSsv_.js +0 -7
  485. package/dist/ui/assets/index-gz2EXuoK.css +0 -1
@@ -8,13 +8,13 @@
8
8
  <link rel="icon" type="image/png" sizes="16x16" href="/favicon/favicon-16x16.png" />
9
9
  <link rel="apple-touch-icon" href="/taskforce/favicon/apple-touch-icon.png" />
10
10
  <title>Taskforce</title>
11
- <script type="module" crossorigin src="/taskforce/assets/index-BUplSsv_.js"></script>
11
+ <script type="module" crossorigin src="/taskforce/assets/index-CTsDBaef.js"></script>
12
12
  <link rel="modulepreload" crossorigin href="/taskforce/assets/vendor-react-CKJs5o3c.js">
13
- <link rel="modulepreload" crossorigin href="/taskforce/assets/vendor-icons-BkFLXavV.js">
13
+ <link rel="modulepreload" crossorigin href="/taskforce/assets/vendor-icons-Bsq-mcEn.js">
14
14
  <link rel="modulepreload" crossorigin href="/taskforce/assets/vendor-markdown-_lhNCyq-.js">
15
15
  <link rel="modulepreload" crossorigin href="/taskforce/assets/vendor-dnd-CJ-AjP-Y.js">
16
16
  <link rel="modulepreload" crossorigin href="/taskforce/assets/vendor-router-AqJMU8Lz.js">
17
- <link rel="stylesheet" crossorigin href="/taskforce/assets/index-gz2EXuoK.css">
17
+ <link rel="stylesheet" crossorigin href="/taskforce/assets/index-BZ-hdZSk.css">
18
18
  </head>
19
19
  <body>
20
20
  <div id="root"></div>
@@ -1,38 +1,6 @@
1
- import antigravityLogo from '../assets/ai-profile-clients/antigravity.png';
2
- import chatgptLogo from '../assets/ai-profile-clients/chatgpt.svg';
3
- import claudeChatLogo from '../assets/ai-profile-clients/claude-chat.svg';
4
- import claudeCodeLogo from '../assets/ai-profile-clients/claude-code.svg';
5
- import clineLogo from '../assets/ai-profile-clients/cline.svg';
6
- import codexLogo from '../assets/ai-profile-clients/codex.svg';
7
- import cursorLogo from '../assets/ai-profile-clients/cursor.svg';
8
- import geminiLogo from '../assets/ai-profile-clients/gemini-cli-icon.png';
9
- import geminiChatLogo from '../assets/ai-profile-clients/gemini.svg';
10
- import grokLogo from '../assets/ai-profile-clients/grok.svg';
11
- import kiroLogo from '../assets/ai-profile-clients/kiro.svg';
12
- import mistralLogo from '../assets/ai-profile-clients/mistral.svg';
13
- import perplexityLogo from '../assets/ai-profile-clients/perplexity.svg';
14
- import vscodeLogo from '../assets/ai-profile-clients/vscode.svg';
15
- import windsurfLogo from '../assets/ai-profile-clients/windsurf.svg';
16
1
  import { getMcpClientRegistryEntry } from '../mcp/clientRegistry.js';
17
2
  import { isTaskforceManagedAiProfile } from '../shared/aiProfileAvatarEligibility.js';
18
- const LOGO_URLS = {
19
- antigravity: antigravityLogo,
20
- 'chatgpt-desktop': chatgptLogo,
21
- 'claude-code': claudeCodeLogo,
22
- 'claude-chat': claudeChatLogo,
23
- 'grok-chat': grokLogo,
24
- 'gemini-chat': geminiChatLogo,
25
- 'mistral-chat': mistralLogo,
26
- 'perplexity-chat': perplexityLogo,
27
- cline: clineLogo,
28
- codex: codexLogo,
29
- cursor: cursorLogo,
30
- 'gemini-cli': geminiLogo,
31
- grok: grokLogo,
32
- kiro: kiroLogo,
33
- vscode: vscodeLogo,
34
- windsurf: windsurfLogo,
35
- };
3
+ import { getProductLogoUrl } from './productLogoRegistry.js';
36
4
  export function getAiProfileDefaultLogoUrl(profile) {
37
5
  if (!profile || isTaskforceManagedAiProfile(profile))
38
6
  return '';
@@ -42,7 +10,7 @@ export function getAiProfileDefaultLogoUrl(profile) {
42
10
  : null;
43
11
  const registryEntry = getMcpClientRegistryEntry(clientId);
44
12
  if (registryEntry?.logoKey)
45
- return LOGO_URLS[registryEntry.logoKey];
13
+ return getProductLogoUrl(registryEntry.logoKey);
46
14
  if (!['chat_app', 'ide', 'cli', 'coding_tool'].includes(String(profile.surfaceType || '')))
47
15
  return '';
48
16
  const identity = [profile.username, profile.name]
@@ -53,32 +21,32 @@ export function getAiProfileDefaultLogoUrl(profile) {
53
21
  if (identity.includes('openclaw') || identity.includes('hermes agent'))
54
22
  return '';
55
23
  if (identity.includes('chatgpt'))
56
- return chatgptLogo;
24
+ return getProductLogoUrl('chatgpt');
57
25
  if (identity.includes('claude code'))
58
- return claudeCodeLogo;
26
+ return getProductLogoUrl('claude-code');
59
27
  if (identity.includes('claude desktop'))
60
- return claudeChatLogo;
28
+ return getProductLogoUrl('claude-chat');
61
29
  if (identity.includes('cline'))
62
- return clineLogo;
30
+ return getProductLogoUrl('cline');
63
31
  if (identity.includes('codex'))
64
- return codexLogo;
32
+ return getProductLogoUrl('codex');
65
33
  if (identity.includes('cursor'))
66
- return cursorLogo;
34
+ return getProductLogoUrl('cursor');
67
35
  if (identity.includes('cascade') || identity.includes('windsurf'))
68
- return windsurfLogo;
36
+ return getProductLogoUrl('windsurf');
69
37
  if (identity.includes('antigravity'))
70
- return antigravityLogo;
38
+ return getProductLogoUrl('antigravity');
71
39
  if (identity.includes('gemini'))
72
- return geminiLogo;
40
+ return getProductLogoUrl('gemini-cli');
73
41
  if (identity.includes('grok'))
74
- return grokLogo;
42
+ return getProductLogoUrl('grok');
75
43
  if (identity.includes('mistral') || identity.includes('le chat'))
76
- return mistralLogo;
44
+ return getProductLogoUrl('mistral-chat');
77
45
  if (identity.includes('perplexity'))
78
- return perplexityLogo;
46
+ return getProductLogoUrl('perplexity-chat');
79
47
  if (identity.includes('kiro'))
80
- return kiroLogo;
48
+ return getProductLogoUrl('kiro');
81
49
  if (identity.includes('visual studio code') || identity.includes('vs code') || identity.includes('vscode'))
82
- return vscodeLogo;
50
+ return getProductLogoUrl('vscode');
83
51
  return '';
84
52
  }
@@ -1,3 +1,4 @@
1
+ export declare function stripSetCookieDomainAttribute(cookie: string): string;
1
2
  export declare function rewriteSetCookieForLocalHost(cookie: string): string;
2
3
  export declare function readSetCookieHeaders(headers: Headers): string[];
3
4
  export declare function findSetCookieHeader(headers: readonly string[], cookieName: string): string | null;
@@ -1,4 +1,4 @@
1
- export function rewriteSetCookieForLocalHost(cookie) {
1
+ export function stripSetCookieDomainAttribute(cookie) {
2
2
  const parts = String(cookie || '').split(';').map((part) => part.trim()).filter(Boolean);
3
3
  if (parts.length === 0)
4
4
  return cookie;
@@ -6,6 +6,9 @@ export function rewriteSetCookieForLocalHost(cookie) {
6
6
  const filteredAttrs = attrs.filter((attr) => !attr.toLowerCase().startsWith('domain='));
7
7
  return [nameValue, ...filteredAttrs].join('; ');
8
8
  }
9
+ export function rewriteSetCookieForLocalHost(cookie) {
10
+ return stripSetCookieDomainAttribute(cookie);
11
+ }
9
12
  export function readSetCookieHeaders(headers) {
10
13
  const values = headers.getSetCookie?.();
11
14
  if (Array.isArray(values) && values.length > 0)
@@ -0,0 +1 @@
1
+ export declare function retargetRestartedLocalUrl(currentUrl: string, previousPort: number, restartedPort: number): string | null;
@@ -0,0 +1,14 @@
1
+ export function retargetRestartedLocalUrl(currentUrl, previousPort, restartedPort) {
2
+ if (previousPort === restartedPort)
3
+ return null;
4
+ try {
5
+ const target = new URL(currentUrl);
6
+ if (target.origin !== `http://localhost:${previousPort}`)
7
+ return null;
8
+ target.port = String(restartedPort);
9
+ return target.toString();
10
+ }
11
+ catch {
12
+ return null;
13
+ }
14
+ }
@@ -0,0 +1,2 @@
1
+ import type { ProductLogoKey } from '../shared/productLogoKeys.js';
2
+ export declare function getProductLogoUrl(key: ProductLogoKey | null | undefined): string;
@@ -0,0 +1,36 @@
1
+ import antigravityLogo from '../assets/ai-profile-clients/antigravity.png';
2
+ import chatgptLogo from '../assets/ai-profile-clients/chatgpt.svg';
3
+ import claudeChatLogo from '../assets/ai-profile-clients/claude-chat.svg';
4
+ import claudeCodeLogo from '../assets/ai-profile-clients/claude-code.svg';
5
+ import clineLogo from '../assets/ai-profile-clients/cline.svg';
6
+ import codexLogo from '../assets/ai-profile-clients/codex.svg';
7
+ import cursorLogo from '../assets/ai-profile-clients/cursor.svg';
8
+ import geminiLogo from '../assets/ai-profile-clients/gemini-cli-icon.png';
9
+ import geminiChatLogo from '../assets/ai-profile-clients/gemini.svg';
10
+ import grokLogo from '../assets/ai-profile-clients/grok.svg';
11
+ import kiroLogo from '../assets/ai-profile-clients/kiro.svg';
12
+ import mistralLogo from '../assets/ai-profile-clients/mistral.svg';
13
+ import perplexityLogo from '../assets/ai-profile-clients/perplexity.svg';
14
+ import vscodeLogo from '../assets/ai-profile-clients/vscode.svg';
15
+ import windsurfLogo from '../assets/ai-profile-clients/windsurf.svg';
16
+ const PRODUCT_LOGO_URLS = {
17
+ antigravity: antigravityLogo,
18
+ chatgpt: chatgptLogo,
19
+ 'claude-chat': claudeChatLogo,
20
+ 'claude-code': claudeCodeLogo,
21
+ cline: clineLogo,
22
+ codex: codexLogo,
23
+ cursor: cursorLogo,
24
+ 'gemini-chat': geminiChatLogo,
25
+ 'gemini-cli': geminiLogo,
26
+ grok: grokLogo,
27
+ 'grok-chat': grokLogo,
28
+ kiro: kiroLogo,
29
+ 'mistral-chat': mistralLogo,
30
+ 'perplexity-chat': perplexityLogo,
31
+ vscode: vscodeLogo,
32
+ windsurf: windsurfLogo,
33
+ };
34
+ export function getProductLogoUrl(key) {
35
+ return key ? PRODUCT_LOGO_URLS[key] : '';
36
+ }
@@ -65,6 +65,10 @@ export interface WorkspaceSyncDiagnosticsPresentation {
65
65
  } | null;
66
66
  coordinatorRecoveryObligations?: number;
67
67
  }
68
+ export declare function resolveEffectiveWorkspaceSyncDiagnostics(browserDiagnostics: WorkspaceSyncDiagnosticsPresentation, coordinator: {
69
+ recoveryObligations: number;
70
+ outbox: WorkspaceSyncDiagnosticsPresentation['durableOutbox'];
71
+ } | null): WorkspaceSyncDiagnosticsPresentation;
68
72
  interface BuildSyncEventRowsInput {
69
73
  syncRecentEvents: SyncEventRecord[];
70
74
  syncRecentEventsError: string | null;
@@ -22,6 +22,15 @@ function getCollapsibleEventSignature(event) {
22
22
  stableStringifySyncEventDetails(event.details),
23
23
  ].join('|');
24
24
  }
25
+ export function resolveEffectiveWorkspaceSyncDiagnostics(browserDiagnostics, coordinator) {
26
+ if (!coordinator)
27
+ return browserDiagnostics;
28
+ return {
29
+ ...browserDiagnostics,
30
+ durableOutbox: coordinator.outbox,
31
+ coordinatorRecoveryObligations: coordinator.recoveryObligations,
32
+ };
33
+ }
25
34
  function formatDiagnosticsTimestamp(value) {
26
35
  if (!value)
27
36
  return 'Never';
@@ -48,6 +57,14 @@ export function resolveSyncStatusMeta(status) {
48
57
  border: 'rgba(96, 165, 250, 0.35)',
49
58
  background: 'rgba(59, 130, 246, 0.12)',
50
59
  };
60
+ case 'checking':
61
+ return {
62
+ label: 'Checking',
63
+ icon: 'cloud',
64
+ color: '#94a3b8',
65
+ border: 'rgba(148, 163, 184, 0.35)',
66
+ background: 'rgba(148, 163, 184, 0.12)',
67
+ };
51
68
  case 'attention':
52
69
  return {
53
70
  label: 'Needs Attention',
@@ -1,4 +1,4 @@
1
- import type { EntityActivityItem, EntityEvent, TaskActivityItem, TaskEvent, TaskItem } from '../types';
1
+ import type { EntityActivityItem, EntityEvent, TaskActivityItem, TaskActivitySummaryItem, TaskEvent, TaskItem } from '../types';
2
2
  export type TaskEventValueFormatter = (field: string, value: unknown) => string | undefined;
3
3
  type AttachmentChange = {
4
4
  from?: unknown;
@@ -11,6 +11,7 @@ type AttachmentChange = {
11
11
  };
12
12
  export declare function summarizeTaskChange(field: string, change: AttachmentChange | undefined, formatter?: TaskEventValueFormatter): string;
13
13
  export declare function summarizeTaskEvent(event: TaskEvent, formatter?: TaskEventValueFormatter): string;
14
+ export declare function summarizeTaskEvent(event: Pick<TaskEvent, 'action' | 'details'>, formatter?: TaskEventValueFormatter): string;
14
15
  export declare function summarizeEntityEvent(event: EntityEvent, formatter?: TaskEventValueFormatter): string;
15
16
  export declare function getTaskEventPrimaryChangeField(event: TaskEvent): string | null;
16
17
  export declare function getEntityEventPrimaryChangeField(event: EntityEvent): string | null;
@@ -20,5 +21,5 @@ export declare function getEntityActivityItems(task: {
20
21
  }): EntityActivityItem[];
21
22
  export declare function getTaskActivityItems(task: Pick<TaskItem, 'activity' | 'comments'>): TaskActivityItem[];
22
23
  export declare function getLatestTaskActivity(task: Pick<TaskItem, 'activity' | 'comments'>): TaskActivityItem | null;
23
- export declare function summarizeTaskActivity(item: TaskActivityItem | null, formatter?: TaskEventValueFormatter): string;
24
+ export declare function summarizeTaskActivity(item: TaskActivityItem | TaskActivitySummaryItem | null, formatter?: TaskEventValueFormatter): string;
24
25
  export {};
@@ -5,8 +5,6 @@ function getActivityFieldLabel(field) {
5
5
  return 'Title';
6
6
  if (field === 'description')
7
7
  return 'Description';
8
- if (field === 'assignee')
9
- return 'Assigned to';
10
8
  if (field === 'ownerId')
11
9
  return 'Owner';
12
10
  if (field === 'status')
@@ -21,6 +19,14 @@ function getActivityFieldLabel(field) {
21
19
  return 'Initiative';
22
20
  return field;
23
21
  }
22
+ function isUnassignedActivityValue(value) {
23
+ const normalized = String(value ?? '').trim().toLowerCase();
24
+ return !normalized
25
+ || normalized === 'none'
26
+ || normalized === 'null'
27
+ || normalized === 'unassigned'
28
+ || normalized === 'user';
29
+ }
24
30
  function formatStatusValue(value) {
25
31
  if (value === 'task')
26
32
  return 'Task';
@@ -277,6 +283,17 @@ export function summarizeTaskChange(field, change, formatter) {
277
283
  if (field === 'attachments') {
278
284
  return summarizeAttachmentChange(change);
279
285
  }
286
+ if (field === 'assignee') {
287
+ const previousAssignee = formatValue(change?.from, field, formatter);
288
+ const nextAssignee = formatValue(change?.to, field, formatter);
289
+ if (isUnassignedActivityValue(change?.from) && !isUnassignedActivityValue(change?.to)) {
290
+ return `Assigned to ${nextAssignee}`;
291
+ }
292
+ if (!isUnassignedActivityValue(change?.from) && isUnassignedActivityValue(change?.to)) {
293
+ return `Unassigned from ${previousAssignee}`;
294
+ }
295
+ return `Reassigned: ${previousAssignee} → ${nextAssignee}`;
296
+ }
280
297
  const label = getActivityFieldLabel(field);
281
298
  if (field === 'title') {
282
299
  return `${label}: updated`;
@@ -0,0 +1,40 @@
1
+ import type { AttachmentItem, ChecklistItem, TaskAssignee, TaskItem, TaskStatus } from '../types';
2
+ export interface TaskEditorDraft {
3
+ title: string;
4
+ description: string;
5
+ category: string;
6
+ type: string;
7
+ priority: number | string;
8
+ complexity: number;
9
+ status: TaskStatus;
10
+ assignee: TaskAssignee;
11
+ scheduledDate: string;
12
+ dueDate: string;
13
+ workstreamId: string;
14
+ taxonomies: Record<string, string | number | string[] | number[]>;
15
+ checklistItems: ChecklistItem[];
16
+ attachments: Array<string | AttachmentItem>;
17
+ }
18
+ export type TaskEditorScalarField = Exclude<keyof TaskEditorDraft, 'taxonomies' | 'checklistItems' | 'attachments'>;
19
+ export type TaskEditorConflict = {
20
+ field: TaskEditorScalarField;
21
+ } | {
22
+ field: 'taxonomies';
23
+ key: string;
24
+ } | {
25
+ field: 'checklistItems' | 'attachments';
26
+ key: string;
27
+ };
28
+ export interface TaskEditorReconciliation {
29
+ merged: TaskEditorDraft;
30
+ conflicts: TaskEditorConflict[];
31
+ remoteChangedFields: string[];
32
+ }
33
+ export declare function taskToEditorDraft(task: TaskItem): TaskEditorDraft;
34
+ export declare function applyEditorDraftToTask(task: TaskItem, draft: TaskEditorDraft): TaskItem;
35
+ export declare function reconcileTaskEditorDraft(base: TaskEditorDraft, local: TaskEditorDraft, remote: TaskEditorDraft): TaskEditorReconciliation;
36
+ export declare function resolveTaskEditorConflicts(reconciliation: TaskEditorReconciliation, remote: TaskEditorDraft, resolution: 'latest' | 'local', current?: TaskEditorDraft): TaskEditorDraft;
37
+ export declare function isTaskEditorConflictAligned(conflict: TaskEditorConflict, local: TaskEditorDraft, remote: TaskEditorDraft): boolean;
38
+ export declare function taskEditorConflictKey(conflict: TaskEditorConflict): string;
39
+ export declare function preserveUnresolvedTaskEditorConflicts(existing: TaskEditorConflict[], next: TaskEditorConflict[], local: TaskEditorDraft, remote: TaskEditorDraft): TaskEditorConflict[];
40
+ export declare function formatTaskEditorConflictFields(conflicts: TaskEditorConflict[]): string[];
@@ -0,0 +1,217 @@
1
+ import { canonicalWorkspaceSyncJson } from '../sync/v3/canonicalWorkspaceSyncJson.js';
2
+ const SCALAR_FIELDS = [
3
+ 'title',
4
+ 'description',
5
+ 'category',
6
+ 'type',
7
+ 'priority',
8
+ 'complexity',
9
+ 'status',
10
+ 'assignee',
11
+ 'scheduledDate',
12
+ 'dueDate',
13
+ 'workstreamId',
14
+ ];
15
+ export function taskToEditorDraft(task) {
16
+ return {
17
+ title: task.title || '',
18
+ description: task.description || '',
19
+ category: task.category || '',
20
+ type: task.type || '',
21
+ priority: task.priority,
22
+ complexity: Number(task.complexity) || 3,
23
+ status: task.status || 'task',
24
+ assignee: task.assignee || 'unassigned',
25
+ scheduledDate: task.scheduledDate || '',
26
+ dueDate: task.dueDate || '',
27
+ workstreamId: task.workstreamId || '',
28
+ taxonomies: { ...(task.taxonomies || {}) },
29
+ checklistItems: [...(task.checklistItems || [])],
30
+ attachments: [...(task.attachments || [])],
31
+ };
32
+ }
33
+ export function applyEditorDraftToTask(task, draft) {
34
+ return {
35
+ ...task,
36
+ title: draft.title,
37
+ description: draft.description || null,
38
+ category: draft.category,
39
+ type: draft.type,
40
+ priority: draft.priority,
41
+ complexity: draft.complexity,
42
+ status: draft.status,
43
+ assignee: draft.assignee,
44
+ scheduledDate: draft.scheduledDate || null,
45
+ dueDate: draft.dueDate || null,
46
+ workstreamId: draft.workstreamId || null,
47
+ taxonomies: draft.taxonomies,
48
+ checklistItems: draft.checklistItems,
49
+ attachments: draft.attachments,
50
+ };
51
+ }
52
+ function equal(left, right) {
53
+ return canonicalWorkspaceSyncJson(left ?? null) === canonicalWorkspaceSyncJson(right ?? null);
54
+ }
55
+ function mergeValue(base, local, remote) {
56
+ const localChanged = !equal(local, base);
57
+ const remoteChanged = !equal(remote, base);
58
+ if (!localChanged)
59
+ return { value: remote, conflict: false, remoteChanged };
60
+ if (!remoteChanged || equal(local, remote))
61
+ return { value: local, conflict: false, remoteChanged };
62
+ return { value: local, conflict: true, remoteChanged };
63
+ }
64
+ function attachmentKey(attachment) {
65
+ if (typeof attachment === 'string')
66
+ return `path:${attachment}`;
67
+ if (attachment.assetId)
68
+ return `asset:${attachment.assetId}`;
69
+ if (attachment.referenceLabel)
70
+ return `reference:${attachment.referenceLabel}`;
71
+ if (attachment.referenceNumber != null)
72
+ return `number:${attachment.referenceNumber}`;
73
+ return `path:${attachment.path || attachment.fsPath || canonicalWorkspaceSyncJson(attachment)}`;
74
+ }
75
+ function mergeKeyedCollection(baseItems, localItems, remoteItems, getKey) {
76
+ const base = new Map(baseItems.map((item) => [getKey(item), item]));
77
+ const local = new Map(localItems.map((item) => [getKey(item), item]));
78
+ const remote = new Map(remoteItems.map((item) => [getKey(item), item]));
79
+ const keys = new Set([...base.keys(), ...remote.keys(), ...local.keys()]);
80
+ const merged = new Map();
81
+ const conflictKeys = [];
82
+ for (const key of keys) {
83
+ const baseItem = base.get(key);
84
+ const localItem = local.get(key);
85
+ const remoteItem = remote.get(key);
86
+ const result = mergeValue(baseItem, localItem, remoteItem);
87
+ if (result.value !== undefined)
88
+ merged.set(key, result.value);
89
+ if (result.conflict)
90
+ conflictKeys.push(key);
91
+ }
92
+ const orderedKeys = [
93
+ ...remoteItems.map(getKey),
94
+ ...localItems.map(getKey).filter((key) => !remote.has(key)),
95
+ ].filter((key, index, all) => all.indexOf(key) === index && merged.has(key));
96
+ return {
97
+ items: orderedKeys.map((key) => merged.get(key)),
98
+ conflictKeys,
99
+ remoteChanged: !equal(baseItems, remoteItems),
100
+ };
101
+ }
102
+ export function reconcileTaskEditorDraft(base, local, remote) {
103
+ const merged = { ...remote };
104
+ const conflicts = [];
105
+ const remoteChangedFields = new Set();
106
+ for (const field of SCALAR_FIELDS) {
107
+ const result = mergeValue(base[field], local[field], remote[field]);
108
+ merged[field] = result.value;
109
+ if (result.conflict)
110
+ conflicts.push({ field });
111
+ if (result.remoteChanged)
112
+ remoteChangedFields.add(field);
113
+ }
114
+ const taxonomyKeys = new Set([
115
+ ...Object.keys(base.taxonomies),
116
+ ...Object.keys(local.taxonomies),
117
+ ...Object.keys(remote.taxonomies),
118
+ ]);
119
+ const mergedTaxonomies = {};
120
+ for (const key of taxonomyKeys) {
121
+ const result = mergeValue(base.taxonomies[key], local.taxonomies[key], remote.taxonomies[key]);
122
+ if (result.value !== undefined)
123
+ mergedTaxonomies[key] = result.value;
124
+ if (result.conflict)
125
+ conflicts.push({ field: 'taxonomies', key });
126
+ if (result.remoteChanged)
127
+ remoteChangedFields.add(`taxonomies.${key}`);
128
+ }
129
+ merged.taxonomies = mergedTaxonomies;
130
+ const checklist = mergeKeyedCollection(base.checklistItems, local.checklistItems, remote.checklistItems, (item) => item.id);
131
+ merged.checklistItems = checklist.items;
132
+ checklist.conflictKeys.forEach((key) => conflicts.push({ field: 'checklistItems', key }));
133
+ if (checklist.remoteChanged)
134
+ remoteChangedFields.add('checklistItems');
135
+ const attachments = mergeKeyedCollection(base.attachments, local.attachments, remote.attachments, attachmentKey);
136
+ merged.attachments = attachments.items;
137
+ attachments.conflictKeys.forEach((key) => conflicts.push({ field: 'attachments', key }));
138
+ if (attachments.remoteChanged)
139
+ remoteChangedFields.add('attachments');
140
+ return { merged, conflicts, remoteChangedFields: [...remoteChangedFields] };
141
+ }
142
+ export function resolveTaskEditorConflicts(reconciliation, remote, resolution, current = reconciliation.merged) {
143
+ if (resolution === 'local')
144
+ return current;
145
+ const resolved = {
146
+ ...current,
147
+ taxonomies: { ...current.taxonomies },
148
+ checklistItems: [...current.checklistItems],
149
+ attachments: [...current.attachments],
150
+ };
151
+ for (const conflict of reconciliation.conflicts) {
152
+ if (conflict.field === 'taxonomies') {
153
+ const value = remote.taxonomies[conflict.key];
154
+ if (value === undefined)
155
+ delete resolved.taxonomies[conflict.key];
156
+ else
157
+ resolved.taxonomies[conflict.key] = value;
158
+ continue;
159
+ }
160
+ if (conflict.field === 'checklistItems' || conflict.field === 'attachments') {
161
+ const getKey = conflict.field === 'checklistItems'
162
+ ? (item) => item.id
163
+ : (item) => attachmentKey(item);
164
+ const current = resolved[conflict.field];
165
+ const latest = remote[conflict.field];
166
+ const latestItem = latest.find((item) => getKey(item) === conflict.key);
167
+ const withoutConflict = current.filter((item) => getKey(item) !== conflict.key);
168
+ resolved[conflict.field] = latestItem
169
+ ? [...withoutConflict, latestItem]
170
+ : withoutConflict;
171
+ continue;
172
+ }
173
+ resolved[conflict.field] = remote[conflict.field];
174
+ }
175
+ return resolved;
176
+ }
177
+ export function isTaskEditorConflictAligned(conflict, local, remote) {
178
+ if (conflict.field === 'taxonomies') {
179
+ return equal(local.taxonomies[conflict.key], remote.taxonomies[conflict.key]);
180
+ }
181
+ if (conflict.field === 'checklistItems') {
182
+ return equal(local.checklistItems.find((item) => item.id === conflict.key), remote.checklistItems.find((item) => item.id === conflict.key));
183
+ }
184
+ if (conflict.field === 'attachments') {
185
+ return equal(local.attachments.find((item) => attachmentKey(item) === conflict.key), remote.attachments.find((item) => attachmentKey(item) === conflict.key));
186
+ }
187
+ return equal(local[conflict.field], remote[conflict.field]);
188
+ }
189
+ export function taskEditorConflictKey(conflict) {
190
+ return 'key' in conflict ? `${conflict.field}:${conflict.key}` : conflict.field;
191
+ }
192
+ export function preserveUnresolvedTaskEditorConflicts(existing, next, local, remote) {
193
+ const conflictsByKey = new Map([
194
+ ...existing.filter((conflict) => !isTaskEditorConflictAligned(conflict, local, remote)),
195
+ ...next,
196
+ ].map((conflict) => [taskEditorConflictKey(conflict), conflict]));
197
+ return [...conflictsByKey.values()];
198
+ }
199
+ export function formatTaskEditorConflictFields(conflicts) {
200
+ const labels = {
201
+ title: 'title',
202
+ description: 'description',
203
+ category: 'category',
204
+ type: 'type',
205
+ priority: 'priority',
206
+ complexity: 'complexity',
207
+ status: 'status',
208
+ assignee: 'assignee',
209
+ scheduledDate: 'scheduled date',
210
+ dueDate: 'due date',
211
+ workstreamId: 'workstream',
212
+ taxonomies: 'taxonomy',
213
+ checklistItems: 'checklist',
214
+ attachments: 'attachments',
215
+ };
216
+ return [...new Set(conflicts.map((conflict) => labels[conflict.field] || String(conflict.field)))];
217
+ }
@@ -1,4 +1,5 @@
1
1
  import type { TaskItem } from '../types.js';
2
+ import type { WorkflowAssignmentDetails } from '../components/features/workflowManager/types.js';
2
3
  import type { TaskCollection } from './taskInvalidation.js';
3
4
  export declare const TASKFORCE_TASKS_MUTATED_EVENT = "taskforce:tasks-mutated";
4
5
  export interface TaskforceTasksMutatedDetail {
@@ -6,6 +7,7 @@ export interface TaskforceTasksMutatedDetail {
6
7
  taskId?: string | null;
7
8
  reason?: 'agent-comment' | 'agent-checklist' | 'workflow-step';
8
9
  authoritativeTask?: TaskItem | null;
10
+ authoritativeWorkflowAssignment?: WorkflowAssignmentDetails | null;
9
11
  affectedCollections?: TaskCollection[];
10
12
  }
11
13
  export declare function dispatchTaskforceTasksMutated(detail: TaskforceTasksMutatedDetail): void;
@@ -13,6 +13,7 @@ export declare function normalizePriorityDefinitions(priorities: PriorityDefinit
13
13
  changed: boolean;
14
14
  };
15
15
  export declare function normalizeTaskFromApi(task: any): TaskItem;
16
+ export declare function toTaskCollectionSummary(task: TaskItem): TaskItem;
16
17
  export declare function getTaskContentRevision(task: TaskItem): string;
17
18
  export declare function reconcileTaskCollection(previous: TaskItem[], incoming: TaskItem[]): TaskItem[];
18
19
  export declare function mergeNormalizedTaskIntoCollections(task: unknown, tasks: TaskItem[], archivedTasks: TaskItem[]): {
@@ -1,5 +1,6 @@
1
1
  import { cloneDefaultPriorityDefinitions } from '../shared/taxonomyDefaults.js';
2
2
  import { formatLocalTaskReference, formatTaskReference } from './taskReferences.js';
3
+ import { getLatestTaskActivity } from './taskActivity.js';
3
4
  export const DEFAULT_PRIORITY_DEFINITIONS = cloneDefaultPriorityDefinitions();
4
5
  const PRIORITY_VALUE_BY_LABEL = {
5
6
  low: 1,
@@ -96,6 +97,44 @@ export function normalizeTaskFromApi(task) {
96
97
  status: normalizeTaskStatus(task.status)
97
98
  };
98
99
  }
100
+ export function toTaskCollectionSummary(task) {
101
+ const { description: _description, comments, activity: _activity, taskEvents: _taskEvents, attachments, checklistItems, createdByActor: _createdByActor, assigneeActor: _assigneeActor, ...summary } = task;
102
+ const latestRevision = (values) => values.reduce((latest, value) => String(value || '') > latest ? String(value || '') : latest, '');
103
+ const commentCount = task.commentCount ?? comments?.length ?? 0;
104
+ const checklistCount = task.checklistCount ?? checklistItems?.length ?? 0;
105
+ const completedChecklistCount = task.completedChecklistCount
106
+ ?? checklistItems?.filter((item) => item.isCompleted).length
107
+ ?? 0;
108
+ const attachmentCount = task.attachmentCount ?? attachments?.length ?? 0;
109
+ const relationshipCount = task.relationshipCount ?? 0;
110
+ const latestActivity = task.latestActivity ?? getLatestTaskActivity(task);
111
+ return {
112
+ ...summary,
113
+ cardCoverAttachment: task.cardCoverAttachment ?? (task.cardCoverAssetId
114
+ ? attachments?.find((attachment) => (typeof attachment !== 'string' && attachment.assetId === task.cardCoverAssetId)) || null
115
+ : null),
116
+ isSummary: true,
117
+ commentCount,
118
+ checklistCount,
119
+ completedChecklistCount,
120
+ attachmentCount,
121
+ relationshipCount,
122
+ latestActivity,
123
+ detailRevision: task.detailRevision || JSON.stringify([
124
+ String(task.updatedAt || task.createdAt || ''),
125
+ commentCount,
126
+ latestRevision(comments?.map((comment) => comment.timestamp) || []),
127
+ checklistCount,
128
+ completedChecklistCount,
129
+ latestRevision(checklistItems?.map((item) => item.updatedAt || item.createdAt) || []),
130
+ attachmentCount,
131
+ latestRevision(attachments?.map((attachment) => typeof attachment === 'string' ? '' : attachment.timestamp) || []),
132
+ relationshipCount,
133
+ latestActivity?.timestamp || '',
134
+ latestActivity?.id || '',
135
+ ]),
136
+ };
137
+ }
99
138
  export function getTaskContentRevision(task) {
100
139
  // Use the complete normalized snapshot: some task changes can arrive without a
101
140
  // distinct updatedAt value, so a timestamp-only key could retain stale UI data.
@@ -1,5 +1,5 @@
1
- import { STATUS_OPTIONS } from './constants';
2
- import { getTaskReferenceLabel } from './taskReferences';
1
+ import { STATUS_OPTIONS } from './constants.js';
2
+ import { getTaskReferenceLabel } from './taskReferences.js';
3
3
  const DASH_LIKE_PATTERN = /[\u2010-\u2015\u2212]/g;
4
4
  export function normalizeSearchText(value) {
5
5
  return String(value ?? '')