@taskforcehq/taskforce 0.3.327 → 0.3.329

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 (360) hide show
  1. package/dist/Taskforce.module.css +257 -87
  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/activity/EntityActivityTimeline.js +15 -5
  8. package/dist/components/context/AttachmentPreviewHost.js +1 -1
  9. package/dist/components/context/ContextAttachmentManager.d.ts +3 -0
  10. package/dist/components/context/ContextAttachmentManager.js +116 -20
  11. package/dist/components/features/AnnotatedAttachmentWorkspace.js +24 -8
  12. package/dist/components/features/TaskSettings.d.ts +12 -1
  13. package/dist/components/features/TaskSettings.js +147 -40
  14. package/dist/components/features/agentCapabilities/AgentCapabilitiesPrototype.d.ts +1 -1
  15. package/dist/components/features/planning/PlanningEntitySummary.d.ts +3 -1
  16. package/dist/components/features/planning/PlanningEntitySummary.js +3 -2
  17. package/dist/components/features/planning/PlanningLinkPicker.d.ts +3 -1
  18. package/dist/components/features/planning/PlanningLinkPicker.js +5 -3
  19. package/dist/components/features/planning/PlanningModule.js +28 -14
  20. package/dist/components/features/planning/PlanningTaskOrderList.d.ts +1 -1
  21. package/dist/components/features/planning/PlanningTaskOrderList.js +17 -6
  22. package/dist/components/features/planning/PlanningVisualIdentity.d.ts +14 -0
  23. package/dist/components/features/planning/PlanningVisualIdentity.js +106 -0
  24. package/dist/components/features/planning/planningTaskArrangement.d.ts +1 -0
  25. package/dist/components/features/planning/planningTaskArrangement.js +5 -5
  26. package/dist/components/features/planning/planningWorkspaceModel.d.ts +11 -0
  27. package/dist/components/features/taskforceAgentEditorModel.js +3 -1
  28. package/dist/components/task/TaskActionHeader.d.ts +2 -1
  29. package/dist/components/task/TaskActionHeader.js +2 -2
  30. package/dist/components/task/TaskCard.d.ts +5 -0
  31. package/dist/components/task/TaskCard.js +101 -13
  32. package/dist/components/task/TaskContextUpload.d.ts +3 -0
  33. package/dist/components/task/TaskContextUpload.js +2 -2
  34. package/dist/components/task/TaskForm.d.ts +4 -0
  35. package/dist/components/task/TaskForm.js +32 -7
  36. package/dist/components/task/TaskImageReviews.js +28 -19
  37. package/dist/components/task/TaskKanban.d.ts +6 -1
  38. package/dist/components/task/TaskKanban.js +152 -6
  39. package/dist/components/task/TaskList.d.ts +5 -0
  40. package/dist/components/task/TaskList.js +3 -3
  41. package/dist/components/task/TaskStatusActions.js +11 -2
  42. package/dist/components/task/TaskWorkstreamPicker.js +2 -1
  43. package/dist/components/ui/DocumentTypeIcon.d.ts +7 -0
  44. package/dist/components/ui/DocumentTypeIcon.js +8 -0
  45. package/dist/components/ui/PasswordInput.d.ts +6 -0
  46. package/dist/components/ui/PasswordInput.js +11 -0
  47. package/dist/components/ui/TaxonomyDropdown.d.ts +9 -1
  48. package/dist/components/ui/TaxonomyDropdown.js +30 -3
  49. package/dist/components/ui/TopNoticeLayer.js +1 -1
  50. package/dist/components/views/AppShellHeader.js +32 -11
  51. package/dist/components/views/PlanComparisonPage.js +12 -0
  52. package/dist/components/views/StandaloneLayout.js +68 -39
  53. package/dist/components/views/WidgetView.js +10 -7
  54. package/dist/components/views/panels/PlanningDrawer.d.ts +7 -1
  55. package/dist/components/views/panels/PlanningDrawer.js +51 -54
  56. package/dist/components/views/standalone/modals/AccountSettingsModal.js +26 -17
  57. package/dist/config/envSchema.js +13 -0
  58. package/dist/config/localServiceCloudTarget.d.ts +10 -0
  59. package/dist/config/localServiceCloudTarget.js +76 -0
  60. package/dist/config/localServiceRuntimeContract.d.ts +13 -0
  61. package/dist/config/localServiceRuntimeContract.js +135 -0
  62. package/dist/core/AiProfileService.d.ts +1 -0
  63. package/dist/core/AiProfileService.js +48 -9
  64. package/dist/core/AttachmentLinkService.js +7 -4
  65. package/dist/core/DeletedTaskLifecycleService.d.ts +5 -0
  66. package/dist/core/DeletedTaskLifecycleService.js +55 -3
  67. package/dist/core/McpTokenService.d.ts +4 -0
  68. package/dist/core/McpTokenService.js +52 -0
  69. package/dist/core/TaskAttachmentLinksDurableMutationService.d.ts +8 -2
  70. package/dist/core/TaskAttachmentLinksDurableMutationService.js +51 -18
  71. package/dist/core/Taskforce.d.ts +124 -2
  72. package/dist/core/Taskforce.js +1175 -87
  73. package/dist/core/types.d.ts +8 -1
  74. package/dist/documentReviews/DocumentReviewCommentStore.d.ts +11 -0
  75. package/dist/documentReviews/DocumentReviewCommentStore.js +35 -2
  76. package/dist/documentReviews/service.d.ts +4 -0
  77. package/dist/documentReviews/service.js +141 -46
  78. package/dist/hooks/sync/useDurableLocalOutboxDrain.d.ts +1 -1
  79. package/dist/hooks/sync/useDurableTaskCreateMutation.js +1 -1
  80. package/dist/hooks/sync/useDurableTaskMetadataMutation.d.ts +1 -0
  81. package/dist/hooks/sync/useDurableTaskMetadataMutation.js +1 -0
  82. package/dist/hooks/sync/useDurableTaskStatusMutation.d.ts +1 -0
  83. package/dist/hooks/tasks/taskHttpMutation.js +1 -0
  84. package/dist/hooks/tasks/useCloudTaskSearch.d.ts +12 -0
  85. package/dist/hooks/tasks/useCloudTaskSearch.js +71 -0
  86. package/dist/hooks/tasks/useTaskDescriptionImageDraftRecovery.d.ts +16 -0
  87. package/dist/hooks/tasks/useTaskDescriptionImageDraftRecovery.js +197 -0
  88. package/dist/hooks/tasks/useTaskEditorNavigation.d.ts +16 -3
  89. package/dist/hooks/tasks/useTaskEditorNavigation.js +72 -13
  90. package/dist/hooks/tasks/useTaskFormActions.d.ts +9 -0
  91. package/dist/hooks/tasks/useTaskFormActions.js +96 -17
  92. package/dist/hooks/ui/useSettingsModel.d.ts +24 -2
  93. package/dist/hooks/ui/useSettingsModel.js +13 -2
  94. package/dist/hooks/ui/useSettingsPersistence.d.ts +12 -1
  95. package/dist/hooks/ui/useSettingsPersistence.js +74 -47
  96. package/dist/hooks/useFilterSort.d.ts +7 -3
  97. package/dist/hooks/useFilterSort.js +15 -5
  98. package/dist/hooks/useTaskData.d.ts +10 -1
  99. package/dist/hooks/useTaskData.js +216 -7
  100. package/dist/hooks/useTaskMutations.d.ts +10 -2
  101. package/dist/hooks/useTaskMutations.js +223 -43
  102. package/dist/hooks/useTaskforce.d.ts +94 -57
  103. package/dist/hooks/useTaskforce.js +428 -16
  104. package/dist/hooks/useUiNotice.d.ts +4 -0
  105. package/dist/hooks/useUiNotice.js +4 -0
  106. package/dist/mcp/adminWorkspaceRegistrar.js +3 -3
  107. package/dist/mcp/canonicalAssetHelpers.d.ts +13 -0
  108. package/dist/mcp/canonicalAssetHelpers.js +39 -5
  109. package/dist/mcp/collaborationRegistrar.js +15 -13
  110. package/dist/mcp/documentAssetRegistrar.js +60 -44
  111. package/dist/mcp/documentHelpers.d.ts +1 -0
  112. package/dist/mcp/documentHelpers.js +7 -3
  113. package/dist/mcp/localServiceProxy.js +4 -1
  114. package/dist/mcp/runtime.d.ts +16 -0
  115. package/dist/mcp/runtime.js +735 -210
  116. package/dist/mcp/taskAttachmentCommandAdapter.d.ts +2 -0
  117. package/dist/mcp/taskAttachmentCommandAdapter.js +14 -8
  118. package/dist/mcp/taskPlanningRegistrar.js +78 -67
  119. package/dist/mcp/toolCallCompatibility.js +38 -1
  120. package/dist/mcp/toolCatalog.d.ts +1 -0
  121. package/dist/mcp/toolRegistry.js +2 -2
  122. package/dist/migrations/taskSchemaMigrations.js +47 -0
  123. package/dist/runtime/appGateDefinitions.d.ts +30 -6
  124. package/dist/runtime/appGateDefinitions.js +6 -6
  125. package/dist/runtime/appGates.d.ts +12 -13
  126. package/dist/runtime/appGates.js +29 -13
  127. package/dist/runtime/nodeAppGates.d.ts +8 -0
  128. package/dist/runtime/nodeAppGates.js +27 -0
  129. package/dist/server/appAccess.d.ts +12 -0
  130. package/dist/server/appAccess.js +21 -0
  131. package/dist/server/authorizedWorkspaceAccess.d.ts +12 -0
  132. package/dist/server/authorizedWorkspaceAccess.js +40 -0
  133. package/dist/server/cloudCollectionRead.d.ts +25 -0
  134. package/dist/server/cloudCollectionRead.js +120 -0
  135. package/dist/server/cloudCollectionReadPool.d.ts +52 -0
  136. package/dist/server/cloudCollectionReadPool.js +140 -0
  137. package/dist/server/cloudCollectionReadWorker.d.ts +1 -0
  138. package/dist/server/cloudCollectionReadWorker.js +36 -0
  139. package/dist/server/index.d.ts +6 -11
  140. package/dist/server/index.js +67 -42
  141. package/dist/server/localServiceLease.d.ts +6 -0
  142. package/dist/server/localServiceLease.js +17 -1
  143. package/dist/server/localWorkspaceSyncServerRuntime.js +10 -3
  144. package/dist/server/rateLimit.d.ts +1 -0
  145. package/dist/server/rateLimit.js +4 -0
  146. package/dist/server/realtimeSyncWs.js +36 -12
  147. package/dist/server/routes/admin.js +1 -0
  148. package/dist/server/routes/agentRoles.js +3 -2
  149. package/dist/server/routes/agentSkills.js +3 -2
  150. package/dist/server/routes/agents.js +118 -16
  151. package/dist/server/routes/annotatedAttachments.js +3 -2
  152. package/dist/server/routes/auth.js +3 -1
  153. package/dist/server/routes/documents.d.ts +5 -2
  154. package/dist/server/routes/documents.js +160 -13
  155. package/dist/server/routes/durableTaskHttpRouters.d.ts +11 -2
  156. package/dist/server/routes/durableTaskHttpRouters.js +2 -2
  157. package/dist/server/routes/localService.js +4 -0
  158. package/dist/server/routes/primitives.d.ts +4 -0
  159. package/dist/server/routes/shared.d.ts +24 -0
  160. package/dist/server/routes/shared.js +114 -18
  161. package/dist/server/routes/sync.js +22 -0
  162. package/dist/server/routes/syncAuxRoutes.js +5 -2
  163. package/dist/server/routes/syncPullApplyRoutes.js +23 -4
  164. package/dist/server/routes/syncV3FeedRoutes.js +22 -18
  165. package/dist/server/routes/syncV3LocalCaptureRoutes.js +48 -4
  166. package/dist/server/routes/syncV3LocalFeedApplyRoutes.d.ts +1 -0
  167. package/dist/server/routes/syncV3LocalFeedApplyRoutes.js +26 -0
  168. package/dist/server/routes/syncV3OperationRoutes.js +27 -2
  169. package/dist/server/routes/tasks.js +299 -97
  170. package/dist/server/routes/workspaces.js +43 -1
  171. package/dist/server/routes.js +35 -7
  172. package/dist/server/workspaceDeletionAdmission.d.ts +23 -0
  173. package/dist/server/workspaceDeletionAdmission.js +50 -0
  174. package/dist/service/localServiceCli.js +52 -25
  175. package/dist/service/localServiceClientLifecycle.js +93 -6
  176. package/dist/services/codexAppServerModelGateway.d.ts +112 -0
  177. package/dist/services/codexAppServerModelGateway.js +438 -0
  178. package/dist/services/taskforceAgentMcpBridge.d.ts +7 -1
  179. package/dist/services/taskforceAgentMcpBridge.js +23 -3
  180. package/dist/shared/planningIdentity.d.ts +20 -0
  181. package/dist/shared/planningIdentity.js +79 -0
  182. package/dist/shared/taskforceAgentDefinition.js +7 -1
  183. package/dist/shared/taskforceAgentModels.d.ts +1 -0
  184. package/dist/shared/taskforceAgentModels.js +30 -1
  185. package/dist/storage/postgresAdapter.d.ts +20 -3
  186. package/dist/storage/postgresAdapter.js +110 -14
  187. package/dist/storage/postgresRequestDiagnostics.d.ts +8 -0
  188. package/dist/storage/postgresRequestDiagnostics.js +24 -0
  189. package/dist/storage/postgresWorker.js +13 -4
  190. package/dist/storage/postgresWorkerProtocol.d.ts +29 -0
  191. package/dist/storage/postgresWorkerProtocol.js +30 -0
  192. package/dist/storage/workspaceAssetStore.d.ts +32 -0
  193. package/dist/storage/workspaceAssetStore.js +70 -0
  194. package/dist/sync/cloudSyncApi.d.ts +4 -1
  195. package/dist/sync/cloudSyncApi.js +7 -2
  196. package/dist/sync/contentSyncState.d.ts +1 -1
  197. package/dist/sync/coordinator/localSyncExecutionPermitStore.d.ts +17 -0
  198. package/dist/sync/coordinator/localSyncExecutionPermitStore.js +77 -23
  199. package/dist/sync/coordinator/localWorkspaceSyncRunner.js +6 -2
  200. package/dist/sync/coordinator/workspaceSyncTransportGateway.js +4 -2
  201. package/dist/sync/engine/workspaceSyncEngineBrowserGatewayRemoteServices.js +20 -2
  202. package/dist/sync/engine/workspaceSyncEngineLocalServices.d.ts +4 -0
  203. package/dist/sync/engine/workspaceSyncEngineLocalServices.js +11 -0
  204. package/dist/sync/engine/workspaceSyncEngineRemoteServices.d.ts +16 -0
  205. package/dist/sync/engine/workspaceSyncEngineRemoteServices.js +2 -1
  206. package/dist/sync/engine/workspaceSyncEngineServerRemoteServices.d.ts +1 -1
  207. package/dist/sync/engine/workspaceSyncEngineServerRemoteServices.js +46 -4
  208. package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.d.ts +3 -1
  209. package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.js +51 -11
  210. package/dist/sync/engine/workspaceSyncEngineTransfers.d.ts +1 -1
  211. package/dist/sync/engine/workspaceSyncEngineTransfers.js +8 -3
  212. package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.js +2 -0
  213. package/dist/sync/syncApplyHandlers.d.ts +3 -1
  214. package/dist/sync/syncApplyHandlers.js +29 -0
  215. package/dist/sync/syncService.d.ts +2 -0
  216. package/dist/sync/syncService.js +13 -1
  217. package/dist/sync/taskSyncPayload.d.ts +1 -0
  218. package/dist/sync/taskSyncPayload.js +6 -0
  219. package/dist/sync/v3/combinedFeedCapability.js +4 -0
  220. package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.d.ts +3 -0
  221. package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.js +31 -3
  222. package/dist/sync/v3/durableTaskChecklistMutationRouter.d.ts +2 -0
  223. package/dist/sync/v3/durableTaskChecklistMutationRouter.js +4 -0
  224. package/dist/sync/v3/durableTaskHttpBulkMutationRouter.d.ts +1 -0
  225. package/dist/sync/v3/durableTaskHttpBulkMutationRouter.js +47 -12
  226. package/dist/sync/v3/durableTaskHttpRootMutationRouter.d.ts +5 -3
  227. package/dist/sync/v3/durableTaskHttpRootMutationRouter.js +27 -2
  228. package/dist/sync/v3/localInitiativeOutboxService.js +4 -2
  229. package/dist/sync/v3/localOutboxDispatcher.js +5 -1
  230. package/dist/sync/v3/localTaskAttachmentLinksOutboxHandler.js +12 -2
  231. package/dist/sync/v3/localTaskAttachmentLinksOutboxService.d.ts +3 -0
  232. package/dist/sync/v3/localTaskAttachmentLinksOutboxService.js +62 -10
  233. package/dist/sync/v3/localTaskCreateOutboxService.js +15 -6
  234. package/dist/sync/v3/localTaskMetadataClient.d.ts +1 -0
  235. package/dist/sync/v3/localTaskMetadataClient.js +1 -0
  236. package/dist/sync/v3/localTaskMetadataOutboxHandler.js +5 -1
  237. package/dist/sync/v3/localTaskMetadataOutboxService.d.ts +2 -0
  238. package/dist/sync/v3/localTaskMetadataOutboxService.js +7 -0
  239. package/dist/sync/v3/localTaskRestoreOutboxService.js +14 -6
  240. package/dist/sync/v3/localTaskStatusClient.d.ts +1 -0
  241. package/dist/sync/v3/localTaskStatusClient.js +6 -1
  242. package/dist/sync/v3/localTaskStatusOutboxService.d.ts +2 -0
  243. package/dist/sync/v3/localTaskStatusOutboxService.js +54 -13
  244. package/dist/sync/v3/localWorkstreamOutboxService.js +4 -2
  245. package/dist/sync/v3/syncDurabilityStore.d.ts +15 -0
  246. package/dist/sync/v3/syncDurabilityStore.js +201 -43
  247. package/dist/sync/v3/taskAttachmentLinksMutationService.d.ts +7 -4
  248. package/dist/sync/v3/taskAttachmentLinksMutationService.js +37 -12
  249. package/dist/sync/v3/taskChecklistMutationService.d.ts +4 -2
  250. package/dist/sync/v3/taskChecklistMutationService.js +4 -0
  251. package/dist/sync/v3/taskCreateMutationService.d.ts +2 -2
  252. package/dist/sync/v3/taskCreateMutationService.js +7 -4
  253. package/dist/sync/v3/taskMetadataCoexistence.js +4 -0
  254. package/dist/sync/v3/taskMetadataMutationService.d.ts +3 -0
  255. package/dist/sync/v3/taskMetadataMutationService.js +4 -0
  256. package/dist/sync/v3/taskRestoreMutationService.d.ts +2 -2
  257. package/dist/sync/v3/taskRestoreMutationService.js +7 -4
  258. package/dist/sync/v3/taskStatusMutationService.d.ts +2 -0
  259. package/dist/sync/v3/taskStatusMutationService.js +4 -0
  260. package/dist/sync/v3/workflowAssignmentSync.d.ts +1 -0
  261. package/dist/sync/v3/workflowAssignmentSync.js +3 -0
  262. package/dist/sync/v3/workspaceSyncV2ProjectionExclusions.d.ts +1 -1
  263. package/dist/sync/v3/workspaceSyncV2ProjectionExclusions.js +14 -12
  264. package/dist/sync/v3/workspaceSyncV3AttachmentApplyObligationStore.d.ts +11 -0
  265. package/dist/sync/v3/workspaceSyncV3AttachmentApplyObligationStore.js +27 -10
  266. package/dist/sync/v3/workspaceSyncV3AttachmentAssetHydration.d.ts +2 -1
  267. package/dist/sync/v3/workspaceSyncV3AttachmentAssetHydration.js +52 -10
  268. package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.js +10 -1
  269. package/dist/sync/v3/workspaceSyncV3CombinedFeedOrchestrator.js +15 -4
  270. package/dist/sync/v3/workspaceSyncV3CombinedLocalApply.js +66 -13
  271. package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.d.ts +11 -0
  272. package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.js +57 -22
  273. package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.d.ts +10 -4
  274. package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.js +124 -51
  275. package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.d.ts +10 -0
  276. package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.js +120 -28
  277. package/dist/sync/v3/workspaceSyncV3CombinedWireContract.d.ts +3 -1
  278. package/dist/sync/v3/workspaceSyncV3CombinedWireContract.js +18 -0
  279. package/dist/sync/v3/workspaceSyncV3CoverageRegistry.js +6 -0
  280. package/dist/sync/v3/workspaceSyncV3FeedProfile.d.ts +1 -1
  281. package/dist/sync/v3/workspaceSyncV3LegacyBoundaryAttestation.d.ts +1 -0
  282. package/dist/sync/v3/workspaceSyncV3LegacyBoundaryAttestation.js +23 -10
  283. package/dist/sync/v3/workspaceSyncV3NestedTaskApply.d.ts +3 -0
  284. package/dist/sync/v3/workspaceSyncV3NestedTaskApply.js +64 -13
  285. package/dist/sync/v3/workspaceSyncV3NestedTaskCodecs.d.ts +9 -0
  286. package/dist/sync/v3/workspaceSyncV3NestedTaskCodecs.js +26 -0
  287. package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.d.ts +15 -5
  288. package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.js +50 -14
  289. package/dist/sync/v3/workspaceSyncV3NestedTaskRepairSnapshot.d.ts +2 -1
  290. package/dist/sync/v3/workspaceSyncV3NestedTaskRepairSnapshot.js +11 -3
  291. package/dist/sync/v3/workspaceSyncV3OperationProtocol.d.ts +3 -0
  292. package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.d.ts +2 -0
  293. package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.js +19 -7
  294. package/dist/sync/v3/workspaceSyncV3RepairSqlBatching.d.ts +2 -0
  295. package/dist/sync/v3/workspaceSyncV3RepairSqlBatching.js +10 -0
  296. package/dist/sync/v3/workspaceSyncV3TaskCommentAudit.js +9 -2
  297. package/dist/sync/v3/workspaceSyncV3TaskCoverCoverage.d.ts +7 -0
  298. package/dist/sync/v3/workspaceSyncV3TaskCoverCoverage.js +37 -0
  299. package/dist/sync/v3/workspaceSyncV3TaskCoverWireContract.d.ts +6 -0
  300. package/dist/sync/v3/workspaceSyncV3TaskCoverWireContract.js +9 -0
  301. package/dist/sync/v3/workspaceSyncV3TaskRootProjection.d.ts +1 -1
  302. package/dist/sync/v3/workspaceSyncV3TaskRootProjection.js +1 -1
  303. package/dist/sync/workspacePullFeed.d.ts +6 -1
  304. package/dist/sync/workspacePullFeed.js +174 -162
  305. package/dist/sync/workspaceRepair.d.ts +3 -0
  306. package/dist/sync/workspaceRepair.js +67 -6
  307. package/dist/sync/workspaceSyncModel.d.ts +11 -0
  308. package/dist/sync/workspaceSyncModel.js +27 -2
  309. package/dist/types.d.ts +55 -1
  310. package/dist/types.js +6 -0
  311. package/dist/ui/assets/{AiIdentityRosterCard-DB1BLO_j.js → AiIdentityRosterCard-BZM4aQnM.js} +1 -1
  312. package/dist/ui/assets/AiProfilesModule-BbAEWtHH.js +1 -0
  313. package/dist/ui/assets/AnnotatedAttachmentWorkspace-B68Wg-RV.js +3 -0
  314. package/dist/ui/assets/AnnotatedAttachmentWorkspace-TzYu7pkG.css +1 -0
  315. package/dist/ui/assets/AssetTraySortControl-C8Rztyal.js +1 -0
  316. package/dist/ui/assets/ContextAttachmentManager-Cj3c7X9y.js +3 -0
  317. package/dist/ui/assets/{DocumentWorkspace-BC7sy5TG.js → DocumentWorkspace-B5uvzems.js} +4 -4
  318. package/dist/ui/assets/EntityActivityTimeline-BVFvCB5R.js +1 -0
  319. package/dist/ui/assets/PlanningModule-B5DWQOGz.js +1 -0
  320. package/dist/ui/assets/PlanningModule-CoIR9hbV.css +1 -0
  321. package/dist/ui/assets/PlansPage-AY4cGWco.js +1 -0
  322. package/dist/ui/assets/TaskContextUpload-DZxTVesW.js +1 -0
  323. package/dist/ui/assets/TaskContextUpload-qmBeUw3u.css +1 -0
  324. package/dist/ui/assets/TaskSettings-BeWAuyZj.js +12 -0
  325. package/dist/ui/assets/{TaskforceAgentsModule-CkAxW19K.js → TaskforceAgentsModule-BifCYtjR.js} +6 -6
  326. package/dist/ui/assets/WorkflowManagerModule-DEr5di_r.js +1 -0
  327. package/dist/ui/assets/index-I5zhdtgt.js +7 -0
  328. package/dist/ui/assets/index-VRFsx3wz.css +1 -0
  329. package/dist/ui/assets/{vendor-icons-B8ZNsH1g.js → vendor-icons-D9Lpw-j4.js} +1 -1
  330. package/dist/ui/index.html +3 -3
  331. package/dist/utils/constants.d.ts +2 -2
  332. package/dist/utils/constants.js +1 -1
  333. package/dist/utils/contextAttachmentUpload.d.ts +2 -0
  334. package/dist/utils/contextAttachmentUpload.js +7 -0
  335. package/dist/utils/contextFiles.d.ts +1 -1
  336. package/dist/utils/contextFiles.js +4 -4
  337. package/dist/utils/taskActivity.d.ts +3 -2
  338. package/dist/utils/taskActivity.js +19 -2
  339. package/dist/utils/taskEditorReconciliation.d.ts +40 -0
  340. package/dist/utils/taskEditorReconciliation.js +217 -0
  341. package/dist/utils/taskNormalization.d.ts +1 -0
  342. package/dist/utils/taskNormalization.js +39 -0
  343. package/dist/utils/taskSearch.js +2 -2
  344. package/dist/utils/uiNotice.d.ts +4 -0
  345. package/package.json +21 -4
  346. package/dist/ui/assets/AiProfilesModule-DPxQeF9N.js +0 -1
  347. package/dist/ui/assets/AnnotatedAttachmentWorkspace-CBRZ8rca.css +0 -1
  348. package/dist/ui/assets/AnnotatedAttachmentWorkspace-DHNYaNg6.js +0 -3
  349. package/dist/ui/assets/AssetTraySortControl-DphbyHVc.js +0 -1
  350. package/dist/ui/assets/ContextAttachmentManager-CMxSzHqc.js +0 -3
  351. package/dist/ui/assets/EntityActivityTimeline-pJ2ZjZ-k.js +0 -1
  352. package/dist/ui/assets/PlanningModule-CeTqXMMz.css +0 -1
  353. package/dist/ui/assets/PlanningModule-t5GbvVR9.js +0 -1
  354. package/dist/ui/assets/PlansPage-BVH_NfgT.js +0 -1
  355. package/dist/ui/assets/TaskContextUpload-Ds4LnDzV.css +0 -1
  356. package/dist/ui/assets/TaskContextUpload-bl4fOOUz.js +0 -1
  357. package/dist/ui/assets/TaskSettings-xVsxSa0g.js +0 -12
  358. package/dist/ui/assets/WorkflowManagerModule-BKqIGVnF.js +0 -1
  359. package/dist/ui/assets/index-BzJlVnNS.css +0 -1
  360. package/dist/ui/assets/index-Cx7vZJHL.js +0 -7
@@ -214,6 +214,20 @@ export const TASKFORCE_AGENT_MODEL_OPTIONS = [
214
214
  supportsTemperature: true,
215
215
  defaultMaxTokens: 512,
216
216
  },
217
+ {
218
+ key: 'openai.codex-gpt-5-6-sol',
219
+ providerKey: 'openai',
220
+ label: 'Codex GPT-5.6 Sol',
221
+ source: 'subscription_dev',
222
+ runtime: 'subscription-dev',
223
+ defaultTier: 'advanced',
224
+ runtimeModelId: 'gpt-5.6-sol',
225
+ availability: 'configured',
226
+ visible: true,
227
+ supportsTemperature: false,
228
+ defaultMaxTokens: 1024,
229
+ devOnly: true,
230
+ },
217
231
  {
218
232
  key: 'openai.gpt-5-4',
219
233
  providerKey: 'openai',
@@ -228,8 +242,20 @@ export const TASKFORCE_AGENT_MODEL_OPTIONS = [
228
242
  defaultMaxTokens: 1024,
229
243
  },
230
244
  ];
245
+ function isTruthy(value) {
246
+ const normalized = String(value || '').trim().toLowerCase();
247
+ return normalized === '1' || normalized === 'true' || normalized === 'yes' || normalized === 'on';
248
+ }
249
+ export function isTaskforceAgentSubscriptionDevModelsEnabled() {
250
+ const globals = globalThis;
251
+ return (typeof __TASKFORCE_AGENT_SUBSCRIPTION_DEV_MODELS__ !== 'undefined' && __TASKFORCE_AGENT_SUBSCRIPTION_DEV_MODELS__)
252
+ || isTruthy(globals.__TASKFORCE_AGENT_SUBSCRIPTION_DEV_MODELS__)
253
+ || isTruthy(globals.process?.env?.TASKFORCE_AGENT_SUBSCRIPTION_DEV_MODELS);
254
+ }
231
255
  export function isTaskforceAgentModelVisible(model) {
232
- return model.visible && model.availability !== 'account_unavailable';
256
+ return model.visible
257
+ && model.availability !== 'account_unavailable'
258
+ && (!model.devOnly || isTaskforceAgentSubscriptionDevModelsEnabled());
233
259
  }
234
260
  export function getTaskforceAgentModel(modelKey) {
235
261
  const key = String(modelKey || '').trim();
@@ -292,6 +318,9 @@ export function normalizeTaskforceAgentModelSelection(input) {
292
318
  && !connectionScope) {
293
319
  return null;
294
320
  }
321
+ if (modelSource === 'subscription_dev' && connectionScope !== 'local_dev') {
322
+ return null;
323
+ }
295
324
  const connectionId = String(input.connectionId || '').trim();
296
325
  return {
297
326
  providerKey: model.providerKey,
@@ -1,4 +1,14 @@
1
1
  import { type DatabaseAdapter, type DatabaseStatement } from './databaseAdapter.js';
2
+ import { type PostgresAdapterDeadlineOptions, type PostgresWorkerOperation } from './postgresWorkerProtocol.js';
3
+ export declare class PostgresWorkerOutcomeUnknownError extends Error {
4
+ readonly code = "POSTGRES_WORKER_OUTCOME_UNKNOWN";
5
+ readonly operation: PostgresWorkerOperation;
6
+ constructor(operation: PostgresWorkerOperation, detail?: string);
7
+ }
8
+ export declare class PostgresWorkerUnavailableError extends Error {
9
+ readonly code = "POSTGRES_WORKER_UNAVAILABLE";
10
+ constructor();
11
+ }
2
12
  export declare function replaceQMarkParams(sql: string, params: unknown[]): {
3
13
  text: string;
4
14
  values: unknown[];
@@ -6,13 +16,20 @@ export declare function replaceQMarkParams(sql: string, params: unknown[]): {
6
16
  export declare function translateInsertOrReplace(sql: string): string;
7
17
  export declare class PostgresAdapter implements DatabaseAdapter {
8
18
  readonly provider: "postgres";
9
- readonly open = true;
10
- private readonly worker;
19
+ private worker;
20
+ private readonly connectionString;
21
+ private readonly deadlines;
22
+ private readonly retiringWorkers;
23
+ private consecutiveUnexpectedExits;
24
+ private closed;
11
25
  private readonly encoder;
12
26
  private readonly decoder;
13
27
  private txId;
14
28
  private savepointCounter;
15
- constructor(connectionString?: string);
29
+ constructor(connectionString?: string, deadlineOptions?: PostgresAdapterDeadlineOptions);
30
+ get open(): boolean;
31
+ private createWorker;
32
+ private quarantineWorker;
16
33
  private callWorker;
17
34
  private query;
18
35
  private bindParams;
@@ -1,13 +1,32 @@
1
1
  import { TextDecoder, TextEncoder } from 'util';
2
2
  import { Worker } from 'worker_threads';
3
+ import { performance } from 'node:perf_hooks';
3
4
  import { assertSynchronousTransactionResult, } from './databaseAdapter.js';
5
+ import { recordPostgresWorkerWait } from './postgresRequestDiagnostics.js';
6
+ import { resolvePostgresWorkerDeadlines, } from './postgresWorkerProtocol.js';
4
7
  const RESPONSE_STATUS_INDEX = 0;
5
8
  const RESPONSE_LENGTH_INDEX = 1;
6
9
  const RESPONSE_READY = 1;
7
10
  const RESPONSE_INITIAL = 0;
8
- const RESPONSE_TIMEOUT_MS = 20_000;
9
11
  const RESPONSE_BUFFER_BYTES = 2 * 1024 * 1024;
10
12
  const MAX_RESPONSE_BUFFER_BYTES = 64 * 1024 * 1024;
13
+ export class PostgresWorkerOutcomeUnknownError extends Error {
14
+ code = 'POSTGRES_WORKER_OUTCOME_UNKNOWN';
15
+ operation;
16
+ constructor(operation, detail = 'response deadline exceeded') {
17
+ super(`[Taskforce] Postgres worker ${operation} outcome is unknown (${detail}). `
18
+ + 'Do not retry a write without the same idempotency identity.');
19
+ this.name = 'PostgresWorkerOutcomeUnknownError';
20
+ this.operation = operation;
21
+ }
22
+ }
23
+ export class PostgresWorkerUnavailableError extends Error {
24
+ code = 'POSTGRES_WORKER_UNAVAILABLE';
25
+ constructor() {
26
+ super('[Taskforce] Postgres worker is recovering after a failed operation.');
27
+ this.name = 'PostgresWorkerUnavailableError';
28
+ }
29
+ }
11
30
  function isPlainObject(value) {
12
31
  return !!value && typeof value === 'object' && !Array.isArray(value);
13
32
  }
@@ -60,37 +79,102 @@ function toRowCount(result) {
60
79
  }
61
80
  export class PostgresAdapter {
62
81
  provider = 'postgres';
63
- open = true;
64
- worker;
82
+ worker = null;
83
+ connectionString;
84
+ deadlines;
85
+ retiringWorkers = new WeakSet();
86
+ consecutiveUnexpectedExits = 0;
87
+ closed = false;
65
88
  encoder = new TextEncoder();
66
89
  decoder = new TextDecoder();
67
90
  txId = null;
68
91
  savepointCounter = 0;
69
- constructor(connectionString) {
92
+ constructor(connectionString, deadlineOptions = {}) {
70
93
  if (!connectionString || !connectionString.trim()) {
71
94
  throw new Error('[Taskforce] Postgres adapter requires a non-empty connection string.');
72
95
  }
73
- this.worker = new Worker(new URL('./postgresWorker.js', import.meta.url), {
96
+ this.connectionString = connectionString;
97
+ this.deadlines = resolvePostgresWorkerDeadlines(deadlineOptions);
98
+ this.worker = this.createWorker();
99
+ }
100
+ get open() {
101
+ return !this.closed;
102
+ }
103
+ createWorker() {
104
+ const worker = new Worker(new URL('./postgresWorker.js', import.meta.url), {
74
105
  workerData: {
75
- connectionString
106
+ connectionString: this.connectionString,
107
+ deadlines: this.deadlines,
108
+ }
109
+ });
110
+ worker.on('error', () => {
111
+ // The exit handler replaces an unexpectedly failed worker. Keeping an error
112
+ // listener here also prevents Worker from escalating it as an uncaught error.
113
+ });
114
+ worker.on('exit', () => {
115
+ if (this.closed || this.retiringWorkers.has(worker) || this.worker !== worker)
116
+ return;
117
+ this.worker = null;
118
+ if (this.consecutiveUnexpectedExits >= 1)
119
+ return;
120
+ this.consecutiveUnexpectedExits += 1;
121
+ try {
122
+ this.worker = this.createWorker();
123
+ }
124
+ catch {
125
+ // Leave the adapter unavailable instead of creating an unbounded restart loop.
126
+ }
127
+ });
128
+ return worker;
129
+ }
130
+ quarantineWorker(worker) {
131
+ if (this.worker === worker)
132
+ this.worker = null;
133
+ this.txId = null;
134
+ this.retiringWorkers.add(worker);
135
+ void worker.terminate()
136
+ .catch(() => undefined)
137
+ .finally(() => {
138
+ if (this.closed || this.worker)
139
+ return;
140
+ try {
141
+ this.worker = this.createWorker();
142
+ }
143
+ catch {
144
+ // A later process-level health check can restart a persistently broken runtime.
76
145
  }
77
146
  });
78
147
  }
79
148
  callWorker(payload, responseBufferBytes = RESPONSE_BUFFER_BYTES) {
149
+ if (this.closed)
150
+ throw new Error('[Taskforce] Postgres adapter is closed.');
151
+ const worker = this.worker;
152
+ if (!worker)
153
+ throw new PostgresWorkerUnavailableError();
80
154
  const statusBuffer = new SharedArrayBuffer(8);
81
155
  const status = new Int32Array(statusBuffer);
82
156
  status[RESPONSE_STATUS_INDEX] = RESPONSE_INITIAL;
83
157
  status[RESPONSE_LENGTH_INDEX] = 0;
84
158
  const responseBuffer = new SharedArrayBuffer(responseBufferBytes);
85
159
  const responseBytes = new Uint8Array(responseBuffer);
86
- this.worker.postMessage({
87
- payload,
88
- statusBuffer,
89
- responseBuffer
90
- });
91
- const waitResult = Atomics.wait(status, RESPONSE_STATUS_INDEX, RESPONSE_INITIAL, RESPONSE_TIMEOUT_MS);
160
+ try {
161
+ worker.postMessage({
162
+ payload,
163
+ statusBuffer,
164
+ responseBuffer
165
+ });
166
+ }
167
+ catch (error) {
168
+ this.quarantineWorker(worker);
169
+ const detail = error instanceof Error ? error.message : 'worker transport failed';
170
+ throw new PostgresWorkerOutcomeUnknownError(payload.op, detail);
171
+ }
172
+ const waitStartedAt = performance.now();
173
+ const waitResult = Atomics.wait(status, RESPONSE_STATUS_INDEX, RESPONSE_INITIAL, this.deadlines.responseTimeoutMs);
174
+ recordPostgresWorkerWait(payload.op, performance.now() - waitStartedAt);
92
175
  if (waitResult === 'timed-out') {
93
- throw new Error('[Taskforce] Postgres worker timed out.');
176
+ this.quarantineWorker(worker);
177
+ throw new PostgresWorkerOutcomeUnknownError(payload.op);
94
178
  }
95
179
  const responseLength = status[RESPONSE_LENGTH_INDEX];
96
180
  if (!Number.isFinite(responseLength) || responseLength <= 0 || responseLength > responseBufferBytes) {
@@ -98,6 +182,7 @@ export class PostgresAdapter {
98
182
  }
99
183
  const body = this.decoder.decode(responseBytes.subarray(0, responseLength));
100
184
  const parsed = JSON.parse(body);
185
+ this.consecutiveUnexpectedExits = 0;
101
186
  if (!parsed.ok && parsed.errorCode === 'RESPONSE_BUFFER_TOO_SMALL') {
102
187
  const requiredBytes = Number(parsed.requiredBytes);
103
188
  const responseToken = String(parsed.responseToken || '').trim();
@@ -226,11 +311,22 @@ export class PostgresAdapter {
226
311
  return options?.simple ? null : [];
227
312
  }
228
313
  close() {
314
+ if (this.closed)
315
+ return;
316
+ const worker = this.worker;
317
+ if (!worker) {
318
+ this.closed = true;
319
+ return;
320
+ }
229
321
  try {
230
322
  this.callWorker({ op: 'close' });
231
323
  }
232
324
  finally {
233
- this.worker.terminate();
325
+ this.closed = true;
326
+ if (this.worker === worker)
327
+ this.worker = null;
328
+ this.retiringWorkers.add(worker);
329
+ void worker.terminate();
234
330
  }
235
331
  }
236
332
  }
@@ -0,0 +1,8 @@
1
+ export type RequestPerformanceDiagnostics = {
2
+ postgresQueryCount: number;
3
+ postgresWorkerCallCount: number;
4
+ postgresWorkerWaitMs: number;
5
+ };
6
+ export declare function runWithRequestPerformanceDiagnostics<T>(enabled: boolean, callback: () => T): T;
7
+ export declare function recordPostgresWorkerWait(operation: string, durationMs: number): void;
8
+ export declare function getRequestPerformanceDiagnostics(): RequestPerformanceDiagnostics | null;
@@ -0,0 +1,24 @@
1
+ import { AsyncLocalStorage } from 'node:async_hooks';
2
+ const requestPerformanceStorage = new AsyncLocalStorage();
3
+ export function runWithRequestPerformanceDiagnostics(enabled, callback) {
4
+ if (!enabled)
5
+ return callback();
6
+ return requestPerformanceStorage.run({
7
+ postgresQueryCount: 0,
8
+ postgresWorkerCallCount: 0,
9
+ postgresWorkerWaitMs: 0,
10
+ }, callback);
11
+ }
12
+ export function recordPostgresWorkerWait(operation, durationMs) {
13
+ const diagnostics = requestPerformanceStorage.getStore();
14
+ if (!diagnostics)
15
+ return;
16
+ diagnostics.postgresWorkerCallCount += 1;
17
+ if (operation === 'query')
18
+ diagnostics.postgresQueryCount += 1;
19
+ diagnostics.postgresWorkerWaitMs += Math.max(0, durationMs);
20
+ }
21
+ export function getRequestPerformanceDiagnostics() {
22
+ const diagnostics = requestPerformanceStorage.getStore();
23
+ return diagnostics ? { ...diagnostics } : null;
24
+ }
@@ -14,11 +14,16 @@ function pruneRetainedResponses(now = Date.now()) {
14
14
  retainedResponses.delete(token);
15
15
  }
16
16
  }
17
- function createPool(connectionString) {
17
+ function createPool(connectionString, deadlines) {
18
18
  const require = createRequire(import.meta.url);
19
19
  try {
20
20
  const pg = require('pg');
21
- return new pg.Pool({ connectionString });
21
+ return new pg.Pool({
22
+ connectionString,
23
+ connectionTimeoutMillis: deadlines.connectionTimeoutMs,
24
+ statement_timeout: deadlines.statementTimeoutMs,
25
+ idle_in_transaction_session_timeout: deadlines.idleTransactionTimeoutMs,
26
+ });
22
27
  }
23
28
  catch (error) {
24
29
  const detail = error instanceof Error ? ` (${error.message})` : '';
@@ -96,11 +101,15 @@ function writeRetainedResponse(statusBuffer, responseBuffer, responseToken) {
96
101
  Atomics.store(status, RESPONSE_STATUS_INDEX, RESPONSE_READY);
97
102
  Atomics.notify(status, RESPONSE_STATUS_INDEX, 1);
98
103
  }
99
- const connectionString = String(workerData?.connectionString || '').trim();
104
+ const runtimeOptions = workerData;
105
+ const connectionString = String(runtimeOptions?.connectionString || '').trim();
100
106
  if (!connectionString) {
101
107
  throw new Error('[Taskforce] Postgres worker requires connection string.');
102
108
  }
103
- const pool = createPool(connectionString);
109
+ if (!runtimeOptions.deadlines) {
110
+ throw new Error('[Taskforce] Postgres worker requires deadline configuration.');
111
+ }
112
+ const pool = createPool(connectionString, runtimeOptions.deadlines);
104
113
  const txClients = new Map();
105
114
  async function handleMessage(message) {
106
115
  const { payload } = message;
@@ -0,0 +1,29 @@
1
+ export type PostgresWorkerOperation = 'query' | 'begin' | 'commit' | 'rollback' | 'close' | 'read-response';
2
+ export type PostgresWorkerRequestPayload = {
3
+ op: PostgresWorkerOperation;
4
+ sql?: string;
5
+ values?: unknown[];
6
+ txId?: string;
7
+ responseToken?: string;
8
+ };
9
+ export type PostgresWorkerQueryResult = {
10
+ rows: Record<string, unknown>[];
11
+ rowCount?: number;
12
+ };
13
+ export type PostgresWorkerResponsePayload = {
14
+ ok: boolean;
15
+ result?: PostgresWorkerQueryResult;
16
+ error?: string;
17
+ errorCode?: 'RESPONSE_BUFFER_TOO_SMALL';
18
+ requiredBytes?: number;
19
+ responseToken?: string;
20
+ };
21
+ export type PostgresWorkerDeadlines = {
22
+ responseTimeoutMs: number;
23
+ statementTimeoutMs: number;
24
+ connectionTimeoutMs: number;
25
+ idleTransactionTimeoutMs: number;
26
+ };
27
+ export type PostgresAdapterDeadlineOptions = Partial<PostgresWorkerDeadlines>;
28
+ export declare const DEFAULT_POSTGRES_WORKER_DEADLINES: PostgresWorkerDeadlines;
29
+ export declare function resolvePostgresWorkerDeadlines(options?: PostgresAdapterDeadlineOptions): PostgresWorkerDeadlines;
@@ -0,0 +1,30 @@
1
+ export const DEFAULT_POSTGRES_WORKER_DEADLINES = {
2
+ responseTimeoutMs: 20_000,
3
+ statementTimeoutMs: 15_000,
4
+ connectionTimeoutMs: 3_000,
5
+ idleTransactionTimeoutMs: 60_000,
6
+ };
7
+ const MIN_RESPONSE_MARGIN_MS = 100;
8
+ function positiveInteger(value, name) {
9
+ const parsed = Number(value);
10
+ if (!Number.isSafeInteger(parsed) || parsed <= 0) {
11
+ throw new Error(`[Taskforce] ${name} must be a positive integer.`);
12
+ }
13
+ return parsed;
14
+ }
15
+ export function resolvePostgresWorkerDeadlines(options = {}) {
16
+ const deadlines = {
17
+ responseTimeoutMs: positiveInteger(options.responseTimeoutMs ?? DEFAULT_POSTGRES_WORKER_DEADLINES.responseTimeoutMs, 'Postgres worker response timeout'),
18
+ statementTimeoutMs: positiveInteger(options.statementTimeoutMs ?? DEFAULT_POSTGRES_WORKER_DEADLINES.statementTimeoutMs, 'Postgres statement timeout'),
19
+ connectionTimeoutMs: positiveInteger(options.connectionTimeoutMs ?? DEFAULT_POSTGRES_WORKER_DEADLINES.connectionTimeoutMs, 'Postgres connection timeout'),
20
+ idleTransactionTimeoutMs: positiveInteger(options.idleTransactionTimeoutMs ?? DEFAULT_POSTGRES_WORKER_DEADLINES.idleTransactionTimeoutMs, 'Postgres idle transaction timeout'),
21
+ };
22
+ if (deadlines.connectionTimeoutMs
23
+ + deadlines.statementTimeoutMs
24
+ + MIN_RESPONSE_MARGIN_MS
25
+ > deadlines.responseTimeoutMs) {
26
+ throw new Error('[Taskforce] Postgres connection and statement timeouts must together leave at least '
27
+ + `${MIN_RESPONSE_MARGIN_MS}ms before the worker response timeout.`);
28
+ }
29
+ return deadlines;
30
+ }
@@ -67,11 +67,43 @@ export interface WorkspaceAssetLinkEntry {
67
67
  updatedAt: string;
68
68
  deletedAt: string | null;
69
69
  }
70
+ export interface WorkspaceAssetUploadDraftEntry {
71
+ workspaceId: string;
72
+ draftId: string;
73
+ assetId: string;
74
+ storageKey: string;
75
+ purpose: string;
76
+ createdByUserId: string;
77
+ createdAt: string;
78
+ retiredAt: string | null;
79
+ }
70
80
  export declare class WorkspaceAssetStore {
71
81
  private readonly db;
72
82
  private readonly tenantId;
73
83
  private supportsTargetTypeCache;
74
84
  constructor(db: DatabaseAdapter, tenantId: string);
85
+ recordUploadDraft(input: {
86
+ workspaceId: string;
87
+ draftId: string;
88
+ assetId: string;
89
+ storageKey: string;
90
+ purpose: string;
91
+ createdByUserId: string;
92
+ createdAt?: string;
93
+ }): WorkspaceAssetUploadDraftEntry;
94
+ listUploadDrafts(input: {
95
+ workspaceId: string;
96
+ draftId?: string;
97
+ createdByUserId?: string;
98
+ createdBefore?: string;
99
+ includeRetired?: boolean;
100
+ }): WorkspaceAssetUploadDraftEntry[];
101
+ retireUploadDraft(input: {
102
+ workspaceId: string;
103
+ draftId: string;
104
+ assetId: string;
105
+ retiredAt?: string;
106
+ }): boolean;
75
107
  private isPlanningTargetDurablyOwned;
76
108
  assertAssetDeletionAllowed(assetIdRaw: string, workspaceIdRaw: string): void;
77
109
  private runDurableAssetMutation;
@@ -114,6 +114,76 @@ export class WorkspaceAssetStore {
114
114
  this.db = db;
115
115
  this.tenantId = tenantId;
116
116
  }
117
+ recordUploadDraft(input) {
118
+ const workspaceId = normalizeWorkspaceId(input.workspaceId);
119
+ const draftId = normalizeId(input.draftId);
120
+ const assetId = normalizeId(input.assetId);
121
+ const storageKey = normalizeId(input.storageKey);
122
+ const purpose = normalizeId(input.purpose);
123
+ const createdByUserId = normalizeId(input.createdByUserId, 'anonymous');
124
+ const createdAt = normalizeId(input.createdAt, new Date().toISOString());
125
+ if (!draftId || !assetId || !storageKey || !purpose) {
126
+ throw new Error('Draft upload identity, asset, storage key, and purpose are required.');
127
+ }
128
+ this.db.prepare(`
129
+ INSERT INTO workspace_asset_upload_drafts (
130
+ tenant_id, workspace_id, draft_id, asset_id, storage_key,
131
+ purpose, created_by_user_id, created_at, retired_at
132
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, NULL)
133
+ ON CONFLICT (tenant_id, workspace_id, draft_id, asset_id) DO UPDATE SET
134
+ storage_key = EXCLUDED.storage_key,
135
+ purpose = EXCLUDED.purpose,
136
+ created_by_user_id = EXCLUDED.created_by_user_id
137
+ `).run(this.tenantId, workspaceId, draftId, assetId, storageKey, purpose, createdByUserId, createdAt);
138
+ return {
139
+ workspaceId, draftId, assetId, storageKey, purpose,
140
+ createdByUserId, createdAt, retiredAt: null,
141
+ };
142
+ }
143
+ listUploadDrafts(input) {
144
+ const workspaceId = normalizeWorkspaceId(input.workspaceId);
145
+ const clauses = ['tenant_id = ?', 'workspace_id = ?'];
146
+ const values = [this.tenantId, workspaceId];
147
+ if (input.draftId) {
148
+ clauses.push('draft_id = ?');
149
+ values.push(normalizeId(input.draftId));
150
+ }
151
+ if (input.createdByUserId) {
152
+ clauses.push('created_by_user_id = ?');
153
+ values.push(normalizeId(input.createdByUserId));
154
+ }
155
+ if (input.createdBefore) {
156
+ clauses.push('created_at <= ?');
157
+ values.push(normalizeId(input.createdBefore));
158
+ }
159
+ if (!input.includeRetired)
160
+ clauses.push('retired_at IS NULL');
161
+ const rows = this.db.prepare(`
162
+ SELECT workspace_id, draft_id, asset_id, storage_key, purpose,
163
+ created_by_user_id, created_at, retired_at
164
+ FROM workspace_asset_upload_drafts
165
+ WHERE ${clauses.join(' AND ')}
166
+ ORDER BY created_at ASC, asset_id ASC
167
+ `).all(...values);
168
+ return rows.map((row) => ({
169
+ workspaceId: String(row.workspace_id || ''),
170
+ draftId: String(row.draft_id || ''),
171
+ assetId: String(row.asset_id || ''),
172
+ storageKey: String(row.storage_key || ''),
173
+ purpose: String(row.purpose || ''),
174
+ createdByUserId: String(row.created_by_user_id || ''),
175
+ createdAt: String(row.created_at || ''),
176
+ retiredAt: row.retired_at == null ? null : String(row.retired_at),
177
+ }));
178
+ }
179
+ retireUploadDraft(input) {
180
+ const result = this.db.prepare(`
181
+ UPDATE workspace_asset_upload_drafts
182
+ SET retired_at = COALESCE(retired_at, ?)
183
+ WHERE tenant_id = ? AND workspace_id = ? AND draft_id = ? AND asset_id = ?
184
+ `).run(normalizeId(input.retiredAt, new Date().toISOString()), this.tenantId, normalizeWorkspaceId(input.workspaceId), normalizeId(input.draftId), normalizeId(input.assetId));
185
+ return Number(result.changes || 0) > 0;
186
+ }
117
187
  isPlanningTargetDurablyOwned(workspaceId, targetType, targetId) {
118
188
  if (targetType !== 'initiative' && targetType !== 'workstream')
119
189
  return false;
@@ -23,10 +23,13 @@ export type WorkspaceContentRequest = Pick<WorkspaceContentManifestEntry, 'kind'
23
23
  kind: 'asset';
24
24
  assetId: string;
25
25
  };
26
+ export type WorkspaceContentMissingRequest = WorkspaceContentRequest & {
27
+ disposition?: 'retryable' | 'terminal-unavailable';
28
+ };
26
29
  export interface WorkspaceContentPullResponse {
27
30
  success?: boolean;
28
31
  changes?: WorkspaceSyncChange[];
29
- missing?: WorkspaceContentRequest[];
32
+ missing?: WorkspaceContentMissingRequest[];
30
33
  remaining?: WorkspaceContentRequest[];
31
34
  contentMetadata?: Array<{
32
35
  kind: 'document' | 'asset';
@@ -1,4 +1,4 @@
1
- import { partitionWorkspaceSyncV2LegacyChanges } from './v3/workspaceSyncV2ProjectionExclusions.js';
1
+ import { normalizeWorkspaceSyncV2ProjectionExclusions, partitionWorkspaceSyncV2LegacyChanges, } from './v3/workspaceSyncV2ProjectionExclusions.js';
2
2
  import { validateWorkspaceSyncEngineTransferCompletionGroup, } from './engine/workspaceSyncEngineTransferCompletion.js';
3
3
  import { WORKSPACE_SYNC_V3_COMBINED_COVERAGE_SELECTOR, resolveWorkspaceSyncV3CombinedCoverageForExclusions, resolveWorkspaceSyncV3CombinedWireContract } from './v3/workspaceSyncV3CombinedWireContract.js';
4
4
  const WORKSPACE_PULL_TIMEOUT_MS = 45_000;
@@ -696,12 +696,17 @@ export async function bootstrapPushWorkspaceSnapshot(resolveCloudAuthUrl, input)
696
696
  }));
697
697
  }
698
698
  export async function applyLocalWorkspaceChanges(workspaceId, changes, options) {
699
+ const excludedProjections = normalizeWorkspaceSyncV2ProjectionExclusions(options?.excludedProjections || []);
700
+ const combinedCoverage = excludedProjections.length
701
+ ? resolveWorkspaceSyncV3CombinedCoverageForExclusions(excludedProjections)
702
+ : null;
699
703
  const applyPayload = JSON.stringify({
700
704
  workspaceId,
701
705
  changes,
702
706
  workspaceMembers: Array.isArray(options?.workspaceMembers) ? options.workspaceMembers : undefined,
703
707
  ...(options?.repairMode === true ? { repair: true } : {}),
704
- excludedProjections: options?.excludedProjections,
708
+ excludedProjections,
709
+ ...(combinedCoverage ? { combinedCoverage } : {}),
705
710
  contentPullObligations: options?.contentPullObligations,
706
711
  contentPullResolutionClaims: options?.contentPullResolutionClaims,
707
712
  ...localBrowserApplyPermitContext(workspaceId, options),
@@ -130,7 +130,7 @@ export declare function createContentSyncState(deps: ContentSyncStateDeps): {
130
130
  activeLinks: WorkspaceAssetLinkEntry[];
131
131
  effectiveUpdatedAt: string;
132
132
  };
133
- getCanonicalSyncDocumentMetadata: (relativePath: string, workspaceId: string) => Omit<DocumentSyncPayload, "path" | "updatedAt" | "content">;
133
+ getCanonicalSyncDocumentMetadata: (relativePath: string, workspaceId: string) => Omit<DocumentSyncPayload, "updatedAt" | "path" | "content">;
134
134
  hasDocumentSyncMetadataDrift: (workspaceId: string, doc: DocumentSyncPayload, _options?: {
135
135
  allowReferenceNumberReassignment?: boolean;
136
136
  }) => boolean;
@@ -4,6 +4,8 @@ import type { WorkspaceSyncEngineV2PushBoundary } from '../engine/workspaceSyncE
4
4
  import { type LocalSyncExecutionPermitCleanAbandonResult, type LocalSyncExecutionPermitDrainSnapshot, type LocalSyncExecutionPermit, type LocalSyncExecutionPermitOwnerMode, type LocalSyncExecutionPermitState, type LocalSyncGatewayOperationClass, type LocalSyncRecoveryObligation, type LocalSyncUpstreamDisposition } from './localSyncExecutionPermitTypes.js';
5
5
  export declare const LOCAL_SYNC_PERMIT_RETENTION_MIN_AGE_MS: number;
6
6
  export declare const LOCAL_SYNC_PERMIT_RETENTION_SOFT_LIMIT = 1000;
7
+ export declare const LOCAL_SYNC_PERMIT_RETENTION_HARD_LIMIT = 10000;
8
+ export declare const LOCAL_SYNC_OBLIGATION_RETENTION_HARD_LIMIT = 2000;
7
9
  export declare const LOCAL_SYNC_PERMIT_RETENTION_DELETE_BATCH = 250;
8
10
  export declare const LOCAL_SYNC_PERMIT_RETENTION_SWEEP_LIMIT = 5000;
9
11
  type LocalSyncPermitCompletionGroupFence = {
@@ -60,6 +62,12 @@ export declare class LocalSyncExecutionPermitStore {
60
62
  byState: Partial<Record<LocalSyncExecutionPermitState, number>>;
61
63
  recoveryObligations: number;
62
64
  localCommitInvariantViolation: boolean;
65
+ history: {
66
+ terminalPermits: number;
67
+ oldestTerminalPermitAt: string | null;
68
+ resolvedRecoveryObligations: number;
69
+ oldestResolvedRecoveryObligationAt: string | null;
70
+ };
63
71
  };
64
72
  inspectGenerationDrain(input: {
65
73
  workspaceId: string;
@@ -110,6 +118,14 @@ export declare class LocalSyncExecutionPermitStore {
110
118
  ownerMode: LocalSyncExecutionPermitOwnerMode;
111
119
  serverInstanceId: string;
112
120
  }): LocalSyncExecutionPermit;
121
+ renewAcceptedApplyCompletion(input: {
122
+ permitId: string;
123
+ workspaceId: string;
124
+ coordinatorGeneration: number;
125
+ serverInstanceId: string;
126
+ ownerMode: LocalSyncExecutionPermitOwnerMode;
127
+ deadlineAt: string;
128
+ }): LocalSyncExecutionPermit;
113
129
  completeAcceptedV3Dispatch<T>(input: {
114
130
  permitId: string;
115
131
  workspaceId: string;
@@ -136,6 +152,7 @@ export declare class LocalSyncExecutionPermitStore {
136
152
  coordinatorGeneration: number;
137
153
  serverInstanceId: string;
138
154
  errorCode?: string;
155
+ readResponseUnavailableBeforeApply?: boolean;
139
156
  }): LocalSyncExecutionPermit;
140
157
  recoverExpiredPermits(input: {
141
158
  currentServerInstanceId: string;