@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
@@ -6,6 +6,7 @@ import { resolveStorageKeyPathInsideRoot } from '../utils/pathSafety.js';
6
6
  import { compareWorkspaceMutationOrdering } from './workspaceSyncSurface.js';
7
7
  import { relativePathWithinRoot } from '../utils/pathContainment.js';
8
8
  import { listReferencedAiProfileAvatarAssetPaths, } from './aiProfileAvatarSyncPaths.js';
9
+ import { WORKSPACE_CONTENT_MANIFEST_VERSION, createWorkspaceContentMetadataFingerprintV1, } from './workspaceContentManifest.js';
9
10
  function normalizeWorkspaceId(raw) {
10
11
  return String(raw || '').trim() || 'default';
11
12
  }
@@ -44,6 +45,14 @@ function collectFiles(dirPath, predicate) {
44
45
  visit(root);
45
46
  return output;
46
47
  }
48
+ function isStorageRootAccessible(basePath) {
49
+ try {
50
+ return fs.statSync(basePath).isDirectory();
51
+ }
52
+ catch {
53
+ return false;
54
+ }
55
+ }
47
56
  function readFileFingerprint(absolutePath) {
48
57
  try {
49
58
  const stat = fs.statSync(absolutePath);
@@ -102,6 +111,68 @@ function getPrimaryTaskId(store, assetId, workspaceId) {
102
111
  const links = store.listLinksForAsset(assetId, workspaceId, { includeDeleted: false });
103
112
  return links[0]?.taskId || null;
104
113
  }
114
+ function buildContentPullObligationInputForAsset(input) {
115
+ const links = input.store.listLinksForAsset(input.entry.assetId, input.workspaceId, { includeDeleted: false });
116
+ const primaryLink = links[0] || null;
117
+ // Mirrors resolveSyncLinkTarget (src/sync/contentSyncState.ts): a task link has no
118
+ // explicit targetType on the row (it's implied), so it must default to 'task' here
119
+ // rather than null — otherwise this fingerprint diverges from the one a real content
120
+ // manifest read (workspacePullFeed.ts) computes for the same task-linked asset, and
121
+ // the 'exact-version' obligation-resolution path can never match it.
122
+ const primaryLinkTargetId = String(primaryLink?.targetId || primaryLink?.taskId || '').trim();
123
+ const linkTargetType = primaryLinkTargetId
124
+ ? (primaryLink.targetType === 'initiative' || primaryLink.targetType === 'workstream' ? primaryLink.targetType : 'task')
125
+ : null;
126
+ const linkTargetId = linkTargetType ? primaryLinkTargetId : null;
127
+ const taskId = linkTargetType === 'task' ? linkTargetId : null;
128
+ const metadataFingerprint = input.kind === 'document'
129
+ ? createWorkspaceContentMetadataFingerprintV1({
130
+ kind: 'document',
131
+ metadata: {
132
+ assetId: input.entry.assetId,
133
+ documentId: input.entry.documentId,
134
+ referenceNumber: input.entry.referenceNumber,
135
+ version: input.entry.version,
136
+ taskId,
137
+ linkTargetType,
138
+ linkTargetId,
139
+ logicalName: input.entry.logicalName,
140
+ caption: null,
141
+ originalFilename: input.entry.originalFilename,
142
+ linkRole: primaryLink?.role === 'reference' ? 'reference' : 'attachment',
143
+ },
144
+ })
145
+ : createWorkspaceContentMetadataFingerprintV1({
146
+ kind: 'asset',
147
+ metadata: {
148
+ assetId: input.entry.assetId,
149
+ assetKind: input.entry.kind === 'image' ? 'image' : 'file',
150
+ mimeType: input.entry.mimeType,
151
+ referenceNumber: input.entry.referenceNumber,
152
+ taskId,
153
+ linkTargetType,
154
+ linkTargetId,
155
+ logicalName: input.entry.logicalName,
156
+ caption: null,
157
+ originalFilename: input.entry.originalFilename,
158
+ linkRole: primaryLink?.role || 'attachment',
159
+ },
160
+ });
161
+ const manifest = {
162
+ manifestVersion: WORKSPACE_CONTENT_MANIFEST_VERSION,
163
+ kind: input.kind,
164
+ path: input.path,
165
+ sha256: String(input.entry.contentSha256 || ''),
166
+ sizeBytes: Number(input.entry.sizeBytes || 0),
167
+ updatedAt: input.entry.updatedAt,
168
+ metadataFingerprint,
169
+ existsLocally: false,
170
+ };
171
+ return {
172
+ manifest,
173
+ sourceWatermark: input.entry.updatedAt,
174
+ };
175
+ }
105
176
  function decodePathSegment(raw) {
106
177
  try {
107
178
  return decodeURIComponent(raw);
@@ -145,6 +216,7 @@ function buildManifestEntriesFromMetadata(tenantId, workspaceId, store, basePath
145
216
  const assetDeletes = [];
146
217
  const protectedDocumentPaths = new Set();
147
218
  const protectedAssetPaths = new Set();
219
+ const storageRootAccessible = isStorageRootAccessible(basePath);
148
220
  const metadataEntries = store.listAllByWorkspace(workspaceId, { includeDeleted: true });
149
221
  for (const entry of metadataEntries) {
150
222
  const contentKind = entry.kind === 'document' ? 'document' : 'asset';
@@ -192,6 +264,7 @@ function buildManifestEntriesFromMetadata(tenantId, workspaceId, store, basePath
192
264
  ? resolveStorageKeyPathInsideRoot(basePath, published.physicalKey)
193
265
  : null;
194
266
  let existsLocally = false;
267
+ let contentCheckReliable = true;
195
268
  if (!supportsPublishedContent) {
196
269
  existsLocally = true;
197
270
  }
@@ -200,13 +273,23 @@ function buildManifestEntriesFromMetadata(tenantId, workspaceId, store, basePath
200
273
  existsLocally = true;
201
274
  }
202
275
  else if (physicalPath) {
203
- try {
204
- const stat = fs.statSync(physicalPath);
205
- existsLocally = stat.isFile()
206
- && (published.source !== 'versioned' || stat.size === published.sizeBytes);
207
- }
208
- catch {
276
+ if (!storageRootAccessible) {
277
+ // The storage root itself couldn't be verified (e.g. an unmounted volume or
278
+ // transient I/O failure) — every local file would look "missing" in that state,
279
+ // so don't let a whole-root outage masquerade as N individual deletions.
209
280
  existsLocally = false;
281
+ contentCheckReliable = false;
282
+ }
283
+ else {
284
+ try {
285
+ const stat = fs.statSync(physicalPath);
286
+ existsLocally = stat.isFile()
287
+ && (published.source !== 'versioned' || stat.size === published.sizeBytes);
288
+ }
289
+ catch (error) {
290
+ existsLocally = false;
291
+ contentCheckReliable = error?.code === 'ENOENT';
292
+ }
210
293
  }
211
294
  }
212
295
  }
@@ -231,6 +314,7 @@ function buildManifestEntriesFromMetadata(tenantId, workspaceId, store, basePath
231
314
  sha256: contentSha256,
232
315
  sizeBytes,
233
316
  existsLocally,
317
+ contentCheckReliable,
234
318
  source: 'metadata',
235
319
  publicationState,
236
320
  publicationError,
@@ -249,6 +333,7 @@ function buildManifestEntriesFromMetadata(tenantId, workspaceId, store, basePath
249
333
  sha256: contentSha256,
250
334
  sizeBytes,
251
335
  existsLocally,
336
+ contentCheckReliable,
252
337
  source: 'metadata',
253
338
  publicationState,
254
339
  publicationError,
@@ -307,6 +392,7 @@ export function buildWorkspaceRepairManifest(input) {
307
392
  sha256: fingerprint.sha256,
308
393
  sizeBytes: fingerprint.sizeBytes,
309
394
  existsLocally: true,
395
+ contentCheckReliable: true,
310
396
  source: 'filesystem',
311
397
  publicationState: 'legacy',
312
398
  publicationError: null,
@@ -337,6 +423,7 @@ export function buildWorkspaceRepairManifest(input) {
337
423
  sha256: fingerprint.sha256,
338
424
  sizeBytes: fingerprint.sizeBytes,
339
425
  existsLocally: true,
426
+ contentCheckReliable: true,
340
427
  source: 'filesystem',
341
428
  publicationState: 'legacy',
342
429
  publicationError: null,
@@ -466,6 +553,19 @@ export function scanWorkspaceRepair(input) {
466
553
  continue;
467
554
  }
468
555
  if (!document.existsLocally) {
556
+ if (!document.contentCheckReliable) {
557
+ issues.push({
558
+ code: 'document_content_unverified',
559
+ entityKind: 'document',
560
+ path: document.path,
561
+ assetId: document.assetId,
562
+ taskId: document.taskId,
563
+ repairable: false,
564
+ recommendedAction: 'retry-pull',
565
+ detail: 'Local document file could not be confirmed missing — the storage root was unreachable or the check was inconclusive. Skipped to avoid converting unavailable content into an authoritative deletion; queued for durable retry instead.'
566
+ });
567
+ continue;
568
+ }
469
569
  issues.push({
470
570
  code: 'missing_document_file',
471
571
  entityKind: 'document',
@@ -564,6 +664,19 @@ export function scanWorkspaceRepair(input) {
564
664
  if (!asset.existsLocally) {
565
665
  if (protectedAiAvatarAssetPaths.has(asset.path))
566
666
  continue;
667
+ if (!asset.contentCheckReliable) {
668
+ issues.push({
669
+ code: 'asset_content_unverified',
670
+ entityKind: 'asset',
671
+ path: asset.path,
672
+ assetId: asset.assetId,
673
+ taskId: asset.taskId,
674
+ repairable: false,
675
+ recommendedAction: 'retry-pull',
676
+ detail: 'Local asset file could not be confirmed missing — the storage root was unreachable or the check was inconclusive. Skipped to avoid converting unavailable content into an authoritative deletion; queued for durable retry instead.'
677
+ });
678
+ continue;
679
+ }
567
680
  issues.push({
568
681
  code: 'missing_asset_file',
569
682
  entityKind: 'asset',
@@ -721,6 +834,7 @@ export function applyWorkspaceRepair(input) {
721
834
  const actionsApplied = [];
722
835
  const workspaceId = normalizeWorkspaceId(input.workspaceId);
723
836
  const activeTaskIds = new Set((input.tasks || []).map((task) => String(task.id || '').trim()).filter(Boolean));
837
+ const nowIso = () => (input.now ? input.now() : new Date().toISOString());
724
838
  const deletedMetadataByPath = new Map();
725
839
  if (input.workspaceAssetStore) {
726
840
  for (const entry of input.workspaceAssetStore.listAllByWorkspace(workspaceId, { includeDeleted: true })) {
@@ -730,6 +844,69 @@ export function applyWorkspaceRepair(input) {
730
844
  }
731
845
  }
732
846
  for (const issue of scan.issues) {
847
+ if (issue.code === 'document_content_unverified' || issue.code === 'asset_content_unverified') {
848
+ if (!input.contentPullObligationStore || !input.workspaceAssetStore || !issue.assetId || !issue.path) {
849
+ actionsApplied.push({
850
+ code: issue.code,
851
+ path: issue.path,
852
+ assetId: issue.assetId,
853
+ taskId: issue.taskId,
854
+ action: issue.recommendedAction,
855
+ status: 'skipped',
856
+ detail: 'No durable content-pull obligation store is available in this runtime; content-availability uncertainty was reported but not queued for retry.'
857
+ });
858
+ continue;
859
+ }
860
+ try {
861
+ const assetEntry = input.workspaceAssetStore.get(issue.assetId, workspaceId);
862
+ if (!assetEntry) {
863
+ actionsApplied.push({
864
+ code: issue.code,
865
+ path: issue.path,
866
+ assetId: issue.assetId,
867
+ taskId: issue.taskId,
868
+ action: issue.recommendedAction,
869
+ status: 'skipped',
870
+ detail: 'Canonical metadata for this asset was no longer present; skipped queuing a recovery obligation.'
871
+ });
872
+ continue;
873
+ }
874
+ const obligationInput = buildContentPullObligationInputForAsset({
875
+ kind: issue.code === 'document_content_unverified' ? 'document' : 'asset',
876
+ path: issue.path,
877
+ entry: assetEntry,
878
+ store: input.workspaceAssetStore,
879
+ workspaceId,
880
+ });
881
+ input.contentPullObligationStore.upsertMany({
882
+ tenantId: input.tenantId,
883
+ workspaceId,
884
+ obligations: [obligationInput],
885
+ now: nowIso(),
886
+ });
887
+ actionsApplied.push({
888
+ code: issue.code,
889
+ path: issue.path,
890
+ assetId: issue.assetId,
891
+ taskId: issue.taskId,
892
+ action: issue.recommendedAction,
893
+ status: 'applied',
894
+ detail: 'Queued a durable content-pull recovery obligation instead of treating unavailable content as deleted.'
895
+ });
896
+ }
897
+ catch (error) {
898
+ actionsApplied.push({
899
+ code: issue.code,
900
+ path: issue.path,
901
+ assetId: issue.assetId,
902
+ taskId: issue.taskId,
903
+ action: issue.recommendedAction,
904
+ status: 'failed',
905
+ detail: String(error?.message || error || 'Failed to queue a recovery obligation.')
906
+ });
907
+ }
908
+ continue;
909
+ }
733
910
  if (!issue.repairable) {
734
911
  actionsApplied.push({
735
912
  code: issue.code,
@@ -791,6 +968,17 @@ export function applyWorkspaceRepair(input) {
791
968
  continue;
792
969
  }
793
970
  if ((issue.code === 'missing_document_file' || issue.code === 'missing_asset_file') && issue.assetId) {
971
+ if (input.repairMissingContentFiles !== true) {
972
+ actionsApplied.push({
973
+ code: issue.code,
974
+ path: issue.path,
975
+ assetId: issue.assetId,
976
+ action: issue.recommendedAction,
977
+ status: 'skipped',
978
+ detail: 'Missing content file repair requires explicit admin confirmation, since a single failed existence check can also mean the content is temporarily unavailable rather than deleted.'
979
+ });
980
+ continue;
981
+ }
794
982
  const updated = input.workspaceAssetStore.markDeleted(issue.assetId, workspaceId);
795
983
  actionsApplied.push({
796
984
  code: issue.code,
@@ -886,6 +1074,34 @@ export function applyWorkspaceRepair(input) {
886
1074
  });
887
1075
  }
888
1076
  }
1077
+ if (input.contentPullObligationStore) {
1078
+ const resolutionClaims = [
1079
+ ...scan.snapshot.documents
1080
+ .filter((entry) => entry.existsLocally && entry.assetId)
1081
+ .map((entry) => ({
1082
+ kind: 'document',
1083
+ path: entry.path,
1084
+ sourceWatermark: entry.updatedAt,
1085
+ resolution: 'at-or-before-watermark',
1086
+ })),
1087
+ ...scan.snapshot.assets
1088
+ .filter((entry) => entry.existsLocally && entry.assetId)
1089
+ .map((entry) => ({
1090
+ kind: 'asset',
1091
+ path: entry.path,
1092
+ sourceWatermark: entry.updatedAt,
1093
+ resolution: 'at-or-before-watermark',
1094
+ })),
1095
+ ];
1096
+ if (resolutionClaims.length > 0) {
1097
+ input.contentPullObligationStore.resolveMany({
1098
+ tenantId: input.tenantId,
1099
+ workspaceId,
1100
+ claims: resolutionClaims,
1101
+ now: nowIso(),
1102
+ });
1103
+ }
1104
+ }
889
1105
  const refreshed = scanWorkspaceRepair(input);
890
1106
  return {
891
1107
  ...refreshed,
@@ -229,6 +229,9 @@ export interface WorkspaceSyncInitiativeSnapshot {
229
229
  order?: number | null;
230
230
  attachments?: Array<string | AttachmentItem>;
231
231
  isArchived?: boolean;
232
+ icon?: PlanningIdentityIcon | null;
233
+ color?: PlanningIdentityColor | null;
234
+ identityUpdatedAt?: string | null;
232
235
  durableRevision?: WorkspaceSyncDurablePlanningRevision<'initiative'>;
233
236
  }
234
237
  export interface WorkspaceSyncWorkstreamSnapshot {
@@ -245,6 +248,9 @@ export interface WorkspaceSyncWorkstreamSnapshot {
245
248
  order?: number | null;
246
249
  attachments?: Array<string | AttachmentItem>;
247
250
  isArchived?: boolean;
251
+ icon?: PlanningIdentityIcon | null;
252
+ color?: PlanningIdentityColor | null;
253
+ identityUpdatedAt?: string | null;
248
254
  durableRevision?: WorkspaceSyncDurablePlanningRevision<'workstream'>;
249
255
  }
250
256
  export interface WorkspaceSyncPlanningIdentitySnapshot {
@@ -425,6 +431,7 @@ export interface WorkspaceSyncPayload {
425
431
  currentInitiativeWatermarks: Map<string, string>;
426
432
  currentWorkstreamIds: Set<string>;
427
433
  currentWorkstreamWatermarks: Map<string, string>;
434
+ currentPlanningIdentityWatermarks?: Map<string, string>;
428
435
  currentAiProfileIds: Set<string>;
429
436
  currentAiProfileWatermarks: Map<string, string>;
430
437
  currentAiProfileChangeKeys?: Map<string, string>;
@@ -472,6 +479,7 @@ export interface WorkspaceSyncDeltaDiagnostics {
472
479
  taskRelationships?: WorkspaceSyncDomainDeltaDiagnostics;
473
480
  initiatives: WorkspaceSyncDomainDeltaDiagnostics;
474
481
  workstreams: WorkspaceSyncDomainDeltaDiagnostics;
482
+ planningIdentities?: WorkspaceSyncDomainDeltaDiagnostics;
475
483
  aiProfiles: WorkspaceSyncDomainDeltaDiagnostics;
476
484
  documents: WorkspaceSyncDomainDeltaDiagnostics;
477
485
  assets: WorkspaceSyncDomainDeltaDiagnostics;
@@ -537,6 +545,18 @@ export declare function buildWorkspaceSyncPayloadModel(input: {
537
545
  assets?: WorkspaceSyncAssetSnapshot[];
538
546
  currentDocumentPaths?: Iterable<string>;
539
547
  currentAssetPaths?: Iterable<string>;
548
+ /**
549
+ * Positive completeness signal for the current-workspace document/asset
550
+ * snapshot used to compute deleteDocumentPaths/deleteAssetPaths. Explicit
551
+ * `false` means the snapshot is known failed, partial, stale, for the wrong
552
+ * workspace, or not yet hydrated — the delete-diff for that domain is
553
+ * suppressed entirely rather than trusted. Omitted/undefined defaults to
554
+ * `true` for callers (tests, other pure-function consumers) that don't model
555
+ * hydration state; the real browser sync orchestrator always passes the
556
+ * verified value.
557
+ */
558
+ documentsSnapshotComplete?: boolean;
559
+ assetsSnapshotComplete?: boolean;
540
560
  documentReviewSessions?: WorkspaceSyncDocumentReviewSessionSnapshot[];
541
561
  documentReviewComments?: WorkspaceSyncDocumentReviewCommentSnapshot[];
542
562
  annotatedAttachmentSessions?: WorkspaceSyncAnnotatedAttachmentSessionSnapshot[];
@@ -549,6 +569,7 @@ export declare function buildWorkspaceSyncPayloadModel(input: {
549
569
  lastPushedInitiativeWatermarks?: Map<string, string>;
550
570
  lastPushedWorkstreamIds?: Set<string>;
551
571
  lastPushedWorkstreamWatermarks?: Map<string, string>;
572
+ lastPushedPlanningIdentityWatermarks?: Map<string, string>;
552
573
  lastPushedAiProfileIds?: Set<string>;
553
574
  lastPushedAiProfileWatermarks?: Map<string, string>;
554
575
  lastPushedDocumentPaths?: Set<string>;
@@ -223,6 +223,8 @@ export function buildWorkspaceSyncPayloadModel(input) {
223
223
  return true;
224
224
  return previousWorkstreamWatermarks.get(change.workstream.id) !== change.workstream.updatedAt;
225
225
  });
226
+ const previousPlanningIdentityWatermarks = input.lastPushedPlanningIdentityWatermarks;
227
+ const currentPlanningIdentityWatermarks = new Map();
226
228
  const planningIdentityUpsertChanges = [
227
229
  ...(Array.isArray(input.initiatives) ? input.initiatives : []).map((initiative) => ({
228
230
  entityType: 'initiative',
@@ -240,7 +242,13 @@ export function buildWorkspaceSyncPayloadModel(input) {
240
242
  })),
241
243
  ]
242
244
  .filter((identity) => identity.entityId.length > 0 && Number.isFinite(Date.parse(identity.updatedAt)))
243
- .map((identity) => ({ op: 'planning-identity-upsert', identity }));
245
+ .map((identity) => {
246
+ const identityKey = `${identity.entityType}:${identity.entityId}`;
247
+ currentPlanningIdentityWatermarks.set(identityKey, identity.updatedAt);
248
+ return { op: 'planning-identity-upsert', identity, identityKey };
249
+ })
250
+ .filter((change) => previousPlanningIdentityWatermarks?.get(change.identityKey) !== change.identity.updatedAt)
251
+ .map(({ identityKey: _identityKey, ...change }) => change);
244
252
  const currentAiProfileIds = new Set((Array.isArray(input.aiProfiles) ? input.aiProfiles : [])
245
253
  .map((profile) => String(profile?.id || '').trim())
246
254
  .filter((profileId) => profileId.length > 0));
@@ -312,9 +320,18 @@ export function buildWorkspaceSyncPayloadModel(input) {
312
320
  });
313
321
  const currentDocumentPaths = normalizeWorkspaceSyncPathSet(input.currentDocumentPaths, (Array.isArray(input.documents) ? input.documents : [])
314
322
  .map((doc) => String(doc?.path || '').trim()));
315
- const deleteDocumentPaths = new Set(Array.from(input.lastPushedDocumentPaths || new Set())
316
- .map((docPath) => String(docPath || '').trim())
317
- .filter((docPath) => docPath.length > 0 && !currentDocumentPaths.has(docPath)));
323
+ // A raw set-difference against the previous push is only trustworthy when the
324
+ // current snapshot is a verified-complete, current-workspace read. A failed,
325
+ // partial, stale, or not-yet-hydrated snapshot must never be interpreted as
326
+ // deletion intent — so documentsSnapshotComplete === false suppresses the
327
+ // entire delete-diff for this cycle rather than trusting a plausible-looking
328
+ // but potentially wrong difference.
329
+ const documentsSnapshotComplete = input.documentsSnapshotComplete !== false;
330
+ const deleteDocumentPaths = documentsSnapshotComplete
331
+ ? new Set(Array.from(input.lastPushedDocumentPaths || new Set())
332
+ .map((docPath) => String(docPath || '').trim())
333
+ .filter((docPath) => docPath.length > 0 && !currentDocumentPaths.has(docPath)))
334
+ : new Set();
318
335
  const currentDocumentWatermarks = new Map((Array.isArray(input.documents) ? input.documents : [])
319
336
  .map((doc) => [String(doc?.path || '').trim(), String(doc?.updatedAt || '').trim()])
320
337
  .filter(([docPath]) => docPath.length > 0));
@@ -349,9 +366,14 @@ export function buildWorkspaceSyncPayloadModel(input) {
349
366
  });
350
367
  const currentAssetPaths = normalizeWorkspaceSyncPathSet(input.currentAssetPaths, (Array.isArray(input.assets) ? input.assets : [])
351
368
  .map((asset) => String(asset?.path || '').trim()));
352
- const deleteAssetPaths = new Set(Array.from(input.lastPushedAssetPaths || new Set())
353
- .map((assetPath) => String(assetPath || '').trim())
354
- .filter((assetPath) => assetPath.length > 0 && !currentAssetPaths.has(assetPath)));
369
+ // See documentsSnapshotComplete above the same admission boundary applies
370
+ // to assets.
371
+ const assetsSnapshotComplete = input.assetsSnapshotComplete !== false;
372
+ const deleteAssetPaths = assetsSnapshotComplete
373
+ ? new Set(Array.from(input.lastPushedAssetPaths || new Set())
374
+ .map((assetPath) => String(assetPath || '').trim())
375
+ .filter((assetPath) => assetPath.length > 0 && !currentAssetPaths.has(assetPath)))
376
+ : new Set();
355
377
  const currentAssetWatermarks = new Map((Array.isArray(input.assets) ? input.assets : [])
356
378
  .map((asset) => [String(asset?.path || '').trim(), String(asset?.updatedAt || '').trim()])
357
379
  .filter(([assetPath]) => assetPath.length > 0));
@@ -958,6 +980,7 @@ export function buildWorkspaceSyncPayloadModel(input) {
958
980
  currentInitiativeWatermarks,
959
981
  currentWorkstreamIds,
960
982
  currentWorkstreamWatermarks,
983
+ currentPlanningIdentityWatermarks,
961
984
  currentAiProfileIds,
962
985
  currentAiProfileWatermarks,
963
986
  currentAiProfileChangeKeys,
@@ -1012,6 +1035,11 @@ export function buildWorkspaceSyncPayloadModel(input) {
1012
1035
  baselineCount: previousWorkstreamWatermarks?.size || 0,
1013
1036
  upsertCount: workstreamUpsertChanges.length
1014
1037
  }),
1038
+ planningIdentities: resolveDomainDeltaDiagnostics({
1039
+ currentCount: currentPlanningIdentityWatermarks.size,
1040
+ baselineCount: previousPlanningIdentityWatermarks?.size || 0,
1041
+ upsertCount: planningIdentityUpsertChanges.length
1042
+ }),
1015
1043
  aiProfiles: resolveDomainDeltaDiagnostics({
1016
1044
  currentCount: currentAiProfileIds.size,
1017
1045
  baselineCount: previousAiProfileWatermarks?.size || 0,
@@ -11,6 +11,7 @@ export interface WorkspaceSyncPushBaselineSnapshot {
11
11
  taskRelationshipChangeKeys?: Array<[string, string]>;
12
12
  initiativeWatermarks: Array<[string, string]>;
13
13
  workstreamWatermarks: Array<[string, string]>;
14
+ planningIdentityWatermarks?: Array<[string, string]>;
14
15
  aiProfileWatermarks: Array<[string, string]>;
15
16
  aiProfileChangeKeys?: Array<[string, string]>;
16
17
  taskforceAgentWatermarks?: Array<[string, string]>;
@@ -19,6 +19,9 @@ export interface WorkspaceSyncV2SnapshotInput {
19
19
  assets?: readonly WorkspaceSyncAssetSnapshot[];
20
20
  currentDocumentPaths?: ReadonlySet<string>;
21
21
  currentAssetPaths?: ReadonlySet<string>;
22
+ /** See WorkspaceSyncPayloadModel's documentsSnapshotComplete/assetsSnapshotComplete. */
23
+ documentsSnapshotComplete?: boolean;
24
+ assetsSnapshotComplete?: boolean;
22
25
  documentReviewSessions?: readonly WorkspaceSyncDocumentReviewSessionSnapshot[];
23
26
  documentReviewComments?: readonly WorkspaceSyncDocumentReviewCommentSnapshot[];
24
27
  annotatedAttachmentSessions?: readonly WorkspaceSyncAnnotatedAttachmentSessionSnapshot[];
@@ -45,6 +48,8 @@ export interface WorkspaceSyncV2FrozenSnapshot {
45
48
  readonly assets: readonly WorkspaceSyncAssetSnapshot[];
46
49
  readonly currentDocumentPaths: ReadonlySet<string>;
47
50
  readonly currentAssetPaths: ReadonlySet<string>;
51
+ readonly documentsSnapshotComplete: boolean;
52
+ readonly assetsSnapshotComplete: boolean;
48
53
  readonly documentReviewSessions: readonly WorkspaceSyncDocumentReviewSessionSnapshot[];
49
54
  readonly documentReviewComments: readonly WorkspaceSyncDocumentReviewCommentSnapshot[];
50
55
  readonly annotatedAttachmentSessions: readonly WorkspaceSyncAnnotatedAttachmentSessionSnapshot[];
@@ -64,6 +69,7 @@ export interface WorkspaceSyncV2PushBaseline {
64
69
  readonly lastPushedInitiativeWatermarks: ReadonlyMap<string, string>;
65
70
  readonly lastPushedWorkstreamIds: ReadonlySet<string>;
66
71
  readonly lastPushedWorkstreamWatermarks: ReadonlyMap<string, string>;
72
+ readonly lastPushedPlanningIdentityWatermarks?: ReadonlyMap<string, string>;
67
73
  readonly lastPushedAiProfileIds: ReadonlySet<string>;
68
74
  readonly lastPushedAiProfileWatermarks: ReadonlyMap<string, string>;
69
75
  readonly lastPushedAiProfileChangeKeys: ReadonlyMap<string, string>;
@@ -62,6 +62,8 @@ export function createWorkspaceSyncV2FrozenSnapshot(input) {
62
62
  assets,
63
63
  currentDocumentPaths: stringSet(input.currentDocumentPaths, documents.map((entry) => entry.path)),
64
64
  currentAssetPaths: stringSet(input.currentAssetPaths, assets.map((entry) => entry.path)),
65
+ documentsSnapshotComplete: input.documentsSnapshotComplete !== false,
66
+ assetsSnapshotComplete: input.assetsSnapshotComplete !== false,
65
67
  documentReviewSessions: frozenArray(input.documentReviewSessions),
66
68
  documentReviewComments: frozenArray(input.documentReviewComments),
67
69
  annotatedAttachmentSessions: frozenArray(input.annotatedAttachmentSessions),
@@ -119,6 +121,7 @@ export function buildWorkspaceSyncV2Candidate(input) {
119
121
  lastPushedInitiativeWatermarks: mutableMap(baseline.lastPushedInitiativeWatermarks),
120
122
  lastPushedWorkstreamIds: mutableSet(baseline.lastPushedWorkstreamIds),
121
123
  lastPushedWorkstreamWatermarks: mutableMap(baseline.lastPushedWorkstreamWatermarks),
124
+ lastPushedPlanningIdentityWatermarks: mutableMap(baseline.lastPushedPlanningIdentityWatermarks || new Map()),
122
125
  aiProfiles: Array.from(snapshot.aiProfiles),
123
126
  lastPushedAiProfileIds: forceAllAiProfiles ? new Set() : mutableSet(baseline.lastPushedAiProfileIds),
124
127
  lastPushedAiProfileWatermarks: forceAllAiProfiles ? new Map() : mutableMap(baseline.lastPushedAiProfileWatermarks),
@@ -127,6 +130,8 @@ export function buildWorkspaceSyncV2Candidate(input) {
127
130
  assets: Array.from(snapshot.assets),
128
131
  currentDocumentPaths: snapshot.currentDocumentPaths,
129
132
  currentAssetPaths: snapshot.currentAssetPaths,
133
+ documentsSnapshotComplete: snapshot.documentsSnapshotComplete,
134
+ assetsSnapshotComplete: snapshot.assetsSnapshotComplete,
130
135
  documentReviewSessions: Array.from(snapshot.documentReviewSessions),
131
136
  documentReviewComments: Array.from(snapshot.documentReviewComments),
132
137
  annotatedAttachmentSessions: Array.from(snapshot.annotatedAttachmentSessions),
package/dist/types.d.ts CHANGED
@@ -8,6 +8,7 @@ export type { TaskActor } from './shared/taskActor.js';
8
8
  import type { TaskforceTheme } from './utils/theme';
9
9
  import type { TaskActor } from './shared/taskActor.js';
10
10
  import type { PlanningIdentityColor, PlanningIdentityIcon } from './shared/planningIdentity.js';
11
+ import type { ResolvedFeatureAccessMap } from './runtime/appGates.js';
11
12
  export interface Comment {
12
13
  id: string;
13
14
  author: 'user' | 'ai' | string;
@@ -68,6 +69,17 @@ export interface AuditActivityItem {
68
69
  event: TaskEvent;
69
70
  }
70
71
  export type TaskActivityItem = CommentActivityItem | AuditActivityItem;
72
+ export type TaskActivitySummaryItem = {
73
+ id: string;
74
+ type: 'comment';
75
+ timestamp: string;
76
+ comment: Pick<Comment, 'text' | 'author' | 'actor'>;
77
+ } | {
78
+ id: string;
79
+ type: 'event';
80
+ timestamp: string;
81
+ event: Pick<TaskEvent, 'action' | 'details' | 'actor' | 'actorType' | 'actorProfile'>;
82
+ };
71
83
  export interface EntityAuditActivityItem {
72
84
  id: string;
73
85
  type: 'event';
@@ -244,6 +256,7 @@ export interface TaskItem {
244
256
  taskEvents?: TaskEvent[];
245
257
  attachments?: Array<string | AttachmentItem>;
246
258
  cardCoverAssetId?: string | null;
259
+ cardCoverAttachment?: AttachmentItem | null;
247
260
  /** @deprecated Use status='cancelled'. Safe to remove after v0.4.x migration gate. */
248
261
  cancelled?: boolean;
249
262
  /** @deprecated Use status='done'. Safe to remove after v0.4.x migration gate. */
@@ -267,7 +280,27 @@ export interface TaskItem {
267
280
  workstreamOrder?: number | null;
268
281
  workstreamId?: string | null;
269
282
  checklistItems?: ChecklistItem[];
283
+ /** True when this object came from a collection read and omits the full task graph. */
284
+ isSummary?: boolean;
285
+ commentCount?: number;
286
+ checklistCount?: number;
287
+ completedChecklistCount?: number;
288
+ attachmentCount?: number;
289
+ relationshipCount?: number;
290
+ /** Compact newest comment or audit event carried by lightweight collection reads. */
291
+ latestActivity?: TaskActivitySummaryItem | null;
292
+ detailRevision?: string;
270
293
  }
294
+ export type TaskSummary = Omit<TaskItem, 'description' | 'comments' | 'activity' | 'taskEvents' | 'attachments' | 'checklistItems'> & {
295
+ isSummary: true;
296
+ commentCount: number;
297
+ checklistCount: number;
298
+ completedChecklistCount: number;
299
+ attachmentCount: number;
300
+ relationshipCount: number;
301
+ latestActivity: TaskActivitySummaryItem | null;
302
+ detailRevision: string;
303
+ };
271
304
  export interface CategoryConfig {
272
305
  value: string;
273
306
  label: string;
@@ -310,6 +343,8 @@ export interface TaskforceConfig {
310
343
  cloudMcpBaseUrl?: string;
311
344
  /** Optional absolute/relative base URL for Taskforce websocket (defaults to apiBaseUrl or current origin) */
312
345
  wsBaseUrl?: string;
346
+ /** Server-resolved feature availability for the active deployment environment. */
347
+ appGates?: ResolvedFeatureAccessMap;
313
348
  /** Button position on screen */
314
349
  position?: 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right';
315
350
  /** Vertical offset from edge (useful for stacking with other widgets) */
@@ -324,16 +359,27 @@ export interface TaskforceConfig {
324
359
  checklistDropdownEnabled?: boolean;
325
360
  /** Show status text labels in task card status controls */
326
361
  showTaskCardStatusLabel?: boolean;
362
+ /** Show task descriptions on task cards when the runtime provides them */
363
+ showTaskCardDescription?: boolean;
364
+ /** Show compact image and document attachment rows on task cards */
365
+ showTaskCardAttachments?: boolean;
366
+ /** Show checklist completion progress on task cards */
367
+ showTaskCardChecklistProgress?: boolean;
368
+ /** Show the latest activity summary on task cards */
369
+ showTaskCardLatestActivity?: boolean;
370
+ /** Tint the latest activity background with the actor's signature color */
371
+ tintTaskCardActivityBackground?: boolean;
327
372
  }
328
373
  export interface TaskforcePluginOptions {
329
374
  /** Path to store JSON files (relative to project root) */
330
375
  outputPath?: string;
331
376
  }
332
- export declare const DEFAULT_CONFIG: Required<Omit<TaskforceConfig, 'apiEndpoint' | 'apiBaseUrl' | 'cloudAuthBaseUrl' | 'cloudMcpBaseUrl' | 'wsBaseUrl' | 'taxonomies'>> & {
377
+ export declare const DEFAULT_CONFIG: Required<Omit<TaskforceConfig, 'apiEndpoint' | 'apiBaseUrl' | 'cloudAuthBaseUrl' | 'cloudMcpBaseUrl' | 'wsBaseUrl' | 'appGates' | 'taxonomies'>> & {
333
378
  apiEndpoint: string;
334
379
  apiBaseUrl?: string;
335
380
  cloudAuthBaseUrl?: string;
336
381
  cloudMcpBaseUrl?: string;
337
382
  wsBaseUrl?: string;
383
+ appGates?: ResolvedFeatureAccessMap;
338
384
  taxonomies: TaxonomyDefinition[];
339
385
  };
package/dist/types.js CHANGED
@@ -14,6 +14,7 @@ export const DEFAULT_CONFIG = {
14
14
  cloudAuthBaseUrl: undefined,
15
15
  cloudMcpBaseUrl: undefined,
16
16
  wsBaseUrl: undefined,
17
+ appGates: undefined,
17
18
  position: 'bottom-right',
18
19
  offsetY: 70,
19
20
  theme: 'dawn',
@@ -21,4 +22,9 @@ export const DEFAULT_CONFIG = {
21
22
  manualComplexityEnabled: false,
22
23
  checklistDropdownEnabled: true,
23
24
  showTaskCardStatusLabel: false,
25
+ showTaskCardDescription: true,
26
+ showTaskCardAttachments: true,
27
+ showTaskCardChecklistProgress: true,
28
+ showTaskCardLatestActivity: true,
29
+ tintTaskCardActivityBackground: false,
24
30
  };