@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
@@ -1,3 +1,4 @@
1
+ import { parseTaskforceCloudEnvironment, } from '../config/cloudEnvironment.js';
1
2
  import { APP_GATE_DEFINITIONS as APP_GATE_CONFIG } from './appGateDefinitions.js';
2
3
  export const ANNOTATED_ATTACHMENTS_WORKSPACE_FEATURE_KEY = 'annotated_attachments.workspace_access';
3
4
  export const DOCUMENT_WORKSPACE_FEATURE_KEY = 'documents.workspace_access';
@@ -5,16 +6,17 @@ export const WORKFLOW_MANAGER_WORKSPACE_FEATURE_KEY = 'workflow_manager.workspac
5
6
  export const TASKFORCE_AGENTS_WORKSPACE_FEATURE_KEY = 'taskforce_agents.workspace_access';
6
7
  export const AI_PROFILES_WORKSPACE_FEATURE_KEY = 'ai_profiles.workspace_access';
7
8
  export const PLANNING_WORKSPACE_FEATURE_KEY = 'planning.workspace_access';
8
- export const APP_GATE_DEFINITIONS = Object.entries(APP_GATE_CONFIG).reduce((acc, [key, definition]) => {
9
- acc[key] = {
9
+ const appGateDefinitions = Object.fromEntries(Object.entries(APP_GATE_CONFIG).map(([key, definition]) => [
10
+ key,
11
+ Object.freeze({
10
12
  key: key,
11
- enabled: Boolean(definition.enabled),
12
- description: String(definition.description || ''),
13
- owner: String(definition.owner || ''),
14
- removalMilestone: String(definition.removalMilestone || '')
15
- };
16
- return acc;
17
- }, {});
13
+ enabledByEnvironment: Object.freeze({ ...definition.enabledByEnvironment }),
14
+ description: definition.description,
15
+ owner: definition.owner,
16
+ removalMilestone: definition.removalMilestone,
17
+ }),
18
+ ]));
19
+ export const APP_GATE_DEFINITIONS = Object.freeze(appGateDefinitions);
18
20
  export function listAppGateDefinitions() {
19
21
  return Object.values(APP_GATE_DEFINITIONS);
20
22
  }
@@ -24,7 +26,7 @@ export function getAppGateDefinition(featureKey) {
24
26
  return null;
25
27
  return APP_GATE_DEFINITIONS[normalizedKey] || null;
26
28
  }
27
- export function resolveAppGateAccess(featureKey) {
29
+ export function resolveAppGateAccess(featureKey, environment) {
28
30
  const gate = getAppGateDefinition(featureKey);
29
31
  if (!gate) {
30
32
  return {
@@ -34,7 +36,7 @@ export function resolveAppGateAccess(featureKey) {
34
36
  code: 'OK'
35
37
  };
36
38
  }
37
- if (!gate.enabled) {
39
+ if (!gate.enabledByEnvironment[environment]) {
38
40
  return {
39
41
  featureKey,
40
42
  allowed: false,
@@ -49,6 +51,27 @@ export function resolveAppGateAccess(featureKey) {
49
51
  code: 'OK'
50
52
  };
51
53
  }
52
- export function resolveFeatureAccess(input) {
53
- return resolveAppGateAccess(input.featureKey);
54
+ export function resolveAppGateAccessMap(environment) {
55
+ return Object.fromEntries(listAppGateDefinitions().map(({ key }) => [key, resolveAppGateAccess(key, environment)]));
56
+ }
57
+ export function resolveClientAppGateAccessMap(accessMap, cloudEnvironment) {
58
+ if (accessMap && isResolvedFeatureAccessMap(accessMap))
59
+ return accessMap;
60
+ const environment = parseTaskforceCloudEnvironment(String(cloudEnvironment || '')) || 'production';
61
+ return resolveAppGateAccessMap(environment);
62
+ }
63
+ export function isResolvedFeatureAccessMap(value) {
64
+ if (!value || typeof value !== 'object' || Array.isArray(value))
65
+ return false;
66
+ const candidate = value;
67
+ return listAppGateDefinitions().every(({ key }) => {
68
+ const access = candidate[key];
69
+ if (!access || typeof access !== 'object' || Array.isArray(access))
70
+ return false;
71
+ const resolved = access;
72
+ return resolved.featureKey === key
73
+ && typeof resolved.allowed === 'boolean'
74
+ && (resolved.source === 'app_gate' || resolved.source === 'cloud_entitlement' || resolved.source === 'none')
75
+ && typeof resolved.code === 'string';
76
+ });
54
77
  }
@@ -0,0 +1,8 @@
1
+ import type { TaskforceCloudEnvironment } from '../config/cloudEnvironment.js';
2
+ import { type ResolvedFeatureAccess, type ResolvedFeatureAccessMap } from './appGates.js';
3
+ export interface NodeAppGateResolutionOptions {
4
+ onWarning?: (message: string) => void;
5
+ }
6
+ export declare function resolveNodeAppGateEnvironment(env?: NodeJS.ProcessEnv, options?: NodeAppGateResolutionOptions): TaskforceCloudEnvironment;
7
+ export declare function resolveNodeAppGateAccess(featureKey: string, env?: NodeJS.ProcessEnv, options?: NodeAppGateResolutionOptions): ResolvedFeatureAccess;
8
+ export declare function resolveNodeAppGateAccessMap(env?: NodeJS.ProcessEnv, options?: NodeAppGateResolutionOptions): ResolvedFeatureAccessMap;
@@ -0,0 +1,27 @@
1
+ import { resolveDeploymentConfig } from '../config/deployment.js';
2
+ import { resolveAppGateAccess, resolveAppGateAccessMap, } from './appGates.js';
3
+ const warnedEnvironmentSignatures = new WeakMap();
4
+ export function resolveNodeAppGateEnvironment(env = process.env, options = {}) {
5
+ const deployment = resolveDeploymentConfig(env);
6
+ const warnings = [...deployment.warnings];
7
+ if (!deployment.cloudEnvironment) {
8
+ warnings.push('TASKFORCE_CLOUD_ENVIRONMENT could not be resolved; using the production App Gate profile.');
9
+ }
10
+ const warningSignature = warnings.join('\n');
11
+ if (warnings.length === 0) {
12
+ warnedEnvironmentSignatures.delete(env);
13
+ }
14
+ else if (warnedEnvironmentSignatures.get(env) !== warningSignature) {
15
+ const onWarning = options.onWarning || ((message) => console.warn(`[Taskforce App Gates] ${message}`));
16
+ for (const warning of warnings)
17
+ onWarning(warning);
18
+ warnedEnvironmentSignatures.set(env, warningSignature);
19
+ }
20
+ return deployment.cloudEnvironment || 'production';
21
+ }
22
+ export function resolveNodeAppGateAccess(featureKey, env = process.env, options = {}) {
23
+ return resolveAppGateAccess(featureKey, resolveNodeAppGateEnvironment(env, options));
24
+ }
25
+ export function resolveNodeAppGateAccessMap(env = process.env, options = {}) {
26
+ return resolveAppGateAccessMap(resolveNodeAppGateEnvironment(env, options));
27
+ }
@@ -18,7 +18,7 @@ export interface CloudCollectionReadResponse {
18
18
  details: Record<string, number>;
19
19
  };
20
20
  }
21
- type CloudCollectionReadCore = Pick<TaskforceCore, 'resolveUserAccess' | 'getSystemRole' | 'getAccountAccessStatus' | 'listTasks' | 'listArchive' | 'listDeletedTasksReadOnly' | 'listPlanningBootstrap'>;
21
+ type CloudCollectionReadCore = Pick<TaskforceCore, 'resolveUserAccess' | 'getSystemRole' | 'getAccountAccessStatus' | 'listActiveTaskSummaries' | 'listArchiveSummaries' | 'listDeletedTasksReadOnly' | 'listPlanningBootstrap'>;
22
22
  export declare function resolveCloudCollectionReadOperation(method: string | undefined, pathname: string): CloudCollectionReadOperation | null;
23
23
  export declare function executeCloudCollectionRead(core: CloudCollectionReadCore, request: CloudCollectionReadRequest): CloudCollectionReadResponse;
24
24
  export declare function cloudCollectionReadRoute(operation: CloudCollectionReadOperation): string;
@@ -63,9 +63,9 @@ export function executeCloudCollectionRead(core, request) {
63
63
  let data;
64
64
  const planningDiagnostics = {};
65
65
  if (request.operation === 'tasks')
66
- data = core.listTasks(workspaceId);
66
+ data = core.listActiveTaskSummaries(workspaceId);
67
67
  else if (request.operation === 'archive')
68
- data = core.listArchive(workspaceId);
68
+ data = core.listArchiveSummaries(workspaceId);
69
69
  else if (request.operation === 'deleted')
70
70
  data = core.listDeletedTasksReadOnly(workspaceId);
71
71
  else
@@ -8,6 +8,8 @@ import * as http from 'http';
8
8
  import { WebSocketServer } from 'ws';
9
9
  export { resolveAuthorizedWorkspaceAccess, resolveDisabledAccessError, isWorkspaceAccessRecoveryRoute, } from './authorizedWorkspaceAccess.js';
10
10
  import type { LocalServiceCloudTarget } from '../config/localServiceCloudTarget.js';
11
+ import type { LocalServiceRuntimeContract } from '../config/localServiceRuntimeContract.js';
12
+ import { type TaskforceCloudEnvironment } from '../config/cloudEnvironment.js';
11
13
  import type { LocalSyncCoordinatorHost } from '../sync/coordinator/localSyncCoordinatorHost.js';
12
14
  import type { LocalSyncProcessLock } from '../sync/coordinator/localSyncProcessLock.js';
13
15
  import type { LocalDataOwnerPermit } from './localDataOwnerPermit.js';
@@ -26,6 +28,7 @@ export interface StandaloneServerOptions {
26
28
  bootstrapCapability: string;
27
29
  ownershipKey: string;
28
30
  cloudTarget: LocalServiceCloudTarget;
31
+ runtimeContract: LocalServiceRuntimeContract;
29
32
  };
30
33
  }
31
34
  export interface TaskforceStandaloneServer extends http.Server {
@@ -46,6 +49,7 @@ export declare const TASKFORCE_PROXY_ORIGIN_PROTO_HEADER = "x-taskforce-origin-p
46
49
  export declare const TASKFORCE_PROXY_ORIGIN_BASE_URL_HEADER = "x-taskforce-origin-base-url";
47
50
  export declare const TASKFORCE_PROXY_ORIGIN_RUNTIME_HEADER = "x-taskforce-origin-runtime";
48
51
  export declare const TASKFORCE_PROXY_CLOUD_ENVIRONMENT_HEADER = "x-taskforce-cloud-environment";
52
+ export declare function sanitizeQaRunIdHeader(raw: unknown): string;
49
53
  export declare function shouldProxyCloudPath(pathname: string): boolean;
50
54
  export declare function shouldProxyCloudRequest(url: Pick<URL, 'pathname' | 'searchParams'>, env?: NodeJS.ProcessEnv): boolean;
51
55
  export declare function resolveCloudProxyUpstreamBaseUrl(req: http.IncomingMessage, fallbackBaseUrl: string): string;
@@ -57,6 +61,8 @@ export declare function writeJsonErrorIfPossible(res: http.ServerResponse, statu
57
61
  export declare function applyCloudProxyForwardedHeaders(headers: Headers, req: http.IncomingMessage): void;
58
62
  export declare function rewriteProxySetCookieForLocalHost(cookie: string): string;
59
63
  export declare function shouldRewriteProxySetCookieDomain(cookie: string, hostHeader: string | undefined): boolean;
64
+ export declare function applyAdminProxyRequestSession(headers: Headers, environment: TaskforceCloudEnvironment, env?: NodeJS.ProcessEnv): void;
65
+ export declare function rewriteAdminProxyResponseCookies(setCookies: string[], environment: TaskforceCloudEnvironment, requestHost: string | undefined, env?: NodeJS.ProcessEnv): string[];
60
66
  export declare function shouldForwardCloudProxyResponseHeader(name: string): boolean;
61
67
  export declare function shouldApplyAuthRateLimitForPath(pathname: string): boolean;
62
68
  export declare function resolveCloudProxyBaseUrl(env?: NodeJS.ProcessEnv): string;
@@ -16,7 +16,7 @@ import { createRoutes, matchRoute } from './routes.js';
16
16
  import { formatApiErrorResponse } from './routes/primitives.js';
17
17
  import { logSlowBootstrapRoute } from './routes/shared.js';
18
18
  import { applyCorsHeaders, getAllowedOriginsFromEnv } from './cors.js';
19
- import { applyPrefixedRateLimitHeaders, applyRateLimitHeaders, InMemoryRateLimiter, resolveRateLimitKey } from './rateLimit.js';
19
+ import { applyPrefixedRateLimitHeaders, applyRateLimitHeaders, InMemoryRateLimiter, isWorkspaceSyncFeedRead, resolveRateLimitKey, } from './rateLimit.js';
20
20
  import { isRequestAuthorized, resolveAuthConfigFromEnv, resolveRequestAccess } from './auth.js';
21
21
  import { resolveAuthorizedWorkspaceAccess, resolveDisabledAccessError, } from './authorizedWorkspaceAccess.js';
22
22
  export { resolveAuthorizedWorkspaceAccess, resolveDisabledAccessError, isWorkspaceAccessRecoveryRoute, } from './authorizedWorkspaceAccess.js';
@@ -31,14 +31,17 @@ import { TaskAssetStore } from '../storage/taskAssetStore.js';
31
31
  import { validateEnvironment } from '../config/envSchema.js';
32
32
  import { createRealtimeSyncWsManager } from './realtimeSyncWs.js';
33
33
  import { resolveDeploymentConfig } from '../config/deployment.js';
34
- import { TASKFORCE_CLOUD_ENVIRONMENTS, parseTaskforceCloudEnvironment } from '../config/cloudEnvironment.js';
35
- import { resolveWorkflowRuntimeMutationCapability } from '../sync/v3/durableWorkflowRuntimeMutationRouter.js';
34
+ import { TASKFORCE_CLOUD_ENVIRONMENTS, parseTaskforceCloudEnvironment, } from '../config/cloudEnvironment.js';
35
+ import { resolveAllAdminProxyUpstreamSessionCookieNames, resolveAdminProxyUpstreamSessionCookieName, rewriteAdminProxyRequestCookieHeader, rewriteAdminProxyResponseSetCookie, } from '../shared/adminProxySessionCookies.js';
36
+ import { areWorkflowRuntimeMutationsFenced, resolveWorkflowRuntimeMutationCapability, } from '../sync/v3/durableWorkflowRuntimeMutationRouter.js';
36
37
  import { createWorkspaceSyncCloudCredentialValidator } from '../sync/coordinator/workspaceSyncCloudCredentialValidator.js';
37
38
  import { bootstrapVerifiedWorkspaceSyncAccess } from '../sync/coordinator/workspaceSyncLocalAccessBootstrap.js';
38
39
  import { rewriteSetCookieForLocalHost } from '../utils/httpSetCookie.js';
39
40
  import { createWorkspaceSyncServerComposition, shutdownWorkspaceSyncServerComposition, } from './localWorkspaceSyncServerComposition.js';
40
41
  import { LocalServiceSessionManager } from './localServiceSessions.js';
41
42
  import { LocalSyncIdentityStore } from '../sync/v3/localSyncIdentityStore.js';
43
+ import { pruneExpiredWorkspaceSyncRepairSnapshots, resolveWorkspaceSyncRepairSnapshotRetentionPolicy, } from '../sync/v3/workspaceSyncV3RepairSnapshotRetentionService.js';
44
+ import { pruneRetainedWorkspaceSyncOperations, WORKSPACE_SYNC_OPERATION_RETENTION_INTERVAL_MS, } from '../sync/v3/workspaceSyncOperationRetentionService.js';
42
45
  import { shouldBroadcastLocalFileInvalidation } from './localRealtimeFileInvalidation.js';
43
46
  import { resolveCloudCollectionReadOperation, } from './cloudCollectionRead.js';
44
47
  import { CloudCollectionReadPool, resolveCloudCollectionReadPoolSize, shouldUseCloudCollectionReadPool, } from './cloudCollectionReadPool.js';
@@ -178,6 +181,12 @@ export const TASKFORCE_PROXY_ORIGIN_PROTO_HEADER = 'x-taskforce-origin-proto';
178
181
  export const TASKFORCE_PROXY_ORIGIN_BASE_URL_HEADER = 'x-taskforce-origin-base-url';
179
182
  export const TASKFORCE_PROXY_ORIGIN_RUNTIME_HEADER = 'x-taskforce-origin-runtime';
180
183
  export const TASKFORCE_PROXY_CLOUD_ENVIRONMENT_HEADER = 'x-taskforce-cloud-environment';
184
+ export function sanitizeQaRunIdHeader(raw) {
185
+ const normalized = String(Array.isArray(raw) ? raw[0] : raw || '')
186
+ .trim()
187
+ .replace(/[^A-Za-z0-9._-]+/g, '-');
188
+ return normalized.slice(0, 128) || '-';
189
+ }
181
190
  function shouldLogRefreshDiagnostic(pathname) {
182
191
  return REFRESH_DIAGNOSTIC_PATH_PREFIXES.some((prefix) => pathname === prefix || pathname.startsWith(prefix));
183
192
  }
@@ -255,7 +264,11 @@ export function shouldProxyCloudPath(pathname) {
255
264
  || pathname.startsWith('/api/taskforce/admin/')
256
265
  || pathname.startsWith('/api/taskforce/billing/')
257
266
  || pathname.startsWith('/api/taskforce/auth/')
267
+ || pathname === '/api/taskforce/model-connections'
268
+ || pathname.startsWith('/api/taskforce/model-connections/')
269
+ || pathname === '/api/taskforce/agents/model-catalog'
258
270
  || pathname === '/api/taskforce/agents/model-gateway/test'
271
+ || /^\/api\/taskforce\/agents\/[^/]+\/connection-binding$/i.test(pathname)
259
272
  || isCloudOwnedUserAvatarContextPath(pathname)
260
273
  || isTaskforceAgentAvatarGenerationPath(pathname)
261
274
  || pathname.startsWith('/api/taskforce/settings/mcp/')
@@ -276,6 +289,8 @@ export function shouldProxyCloudRequest(url, env = process.env) {
276
289
  if (isWorkspaceAiProfileAvatarContextPath(url.pathname))
277
290
  return true;
278
291
  if (/^\/api\/taskforce\/workflow-executions\/[^/]+\/complete-step$/.test(url.pathname)) {
292
+ if (areWorkflowRuntimeMutationsFenced(env))
293
+ return false;
279
294
  return !resolveWorkflowRuntimeMutationCapability({
280
295
  runtimeMode: 'local',
281
296
  surface: 'http',
@@ -404,6 +419,26 @@ export function shouldRewriteProxySetCookieDomain(cookie, hostHeader) {
404
419
  return false;
405
420
  return !requestHost.endsWith(`.${cookieDomain}`);
406
421
  }
422
+ export function applyAdminProxyRequestSession(headers, environment, env = process.env) {
423
+ const upstreamSessionCookieName = resolveAdminProxyUpstreamSessionCookieName(environment, env);
424
+ const rewrittenCookie = rewriteAdminProxyRequestCookieHeader(headers.get('cookie'), environment, upstreamSessionCookieName, resolveAllAdminProxyUpstreamSessionCookieNames(env));
425
+ if (rewrittenCookie)
426
+ headers.set('cookie', rewrittenCookie);
427
+ else
428
+ headers.delete('cookie');
429
+ }
430
+ export function rewriteAdminProxyResponseCookies(setCookies, environment, requestHost, env = process.env) {
431
+ const upstreamSessionCookieName = resolveAdminProxyUpstreamSessionCookieName(environment, env);
432
+ return setCookies.map((cookie) => {
433
+ const environmentScopedCookie = rewriteAdminProxyResponseSetCookie(cookie, environment, upstreamSessionCookieName);
434
+ if (shouldRewriteSetCookieForLocalDevHost(requestHost)) {
435
+ return rewriteProxySetCookieForLocalHost(environmentScopedCookie);
436
+ }
437
+ return shouldRewriteProxySetCookieDomain(environmentScopedCookie, requestHost)
438
+ ? rewriteProxySetCookieForLocalHost(environmentScopedCookie)
439
+ : environmentScopedCookie;
440
+ });
441
+ }
407
442
  export function shouldForwardCloudProxyResponseHeader(name) {
408
443
  const normalizedName = String(name || '').trim().toLowerCase();
409
444
  if (!normalizedName)
@@ -606,7 +641,7 @@ export function createStandaloneServer(options) {
606
641
  }
607
642
  let localServiceServer = null;
608
643
  const localServiceSessions = options.localService
609
- ? new LocalServiceSessionManager(options.localService.generation)
644
+ ? new LocalServiceSessionManager(options.localService.generation, core.getDatabaseAdapter(), core.getTenantId(), options.localService.runtimeContract)
610
645
  : null;
611
646
  const routes = createRoutes(core, {
612
647
  authConfig,
@@ -658,10 +693,13 @@ export function createStandaloneServer(options) {
658
693
  : (runtimeMode === 'cloud');
659
694
  const rateLimitLimit = Number.parseInt(process.env.TASKFORCE_API_RATE_LIMIT_MAX_REQUESTS || '', 10) || 120;
660
695
  const rateLimitWindowMs = Number.parseInt(process.env.TASKFORCE_API_RATE_LIMIT_WINDOW_MS || '', 10) || 60_000;
696
+ const syncFeedRateLimit = Number.parseInt(process.env.TASKFORCE_SYNC_FEED_RATE_LIMIT_MAX_REQUESTS || '', 10) || 600;
697
+ const syncFeedRateLimitWindowMs = Number.parseInt(process.env.TASKFORCE_SYNC_FEED_RATE_LIMIT_WINDOW_MS || '', 10) || 60_000;
661
698
  const webhookRateLimitMaxRequests = Number.parseInt(process.env.TASKFORCE_STRIPE_WEBHOOK_RATE_LIMIT_MAX_REQUESTS || '', 10) || 600;
662
699
  const webhookRateLimitWindowMs = Number.parseInt(process.env.TASKFORCE_STRIPE_WEBHOOK_RATE_LIMIT_WINDOW_MS || '', 10) || 60_000;
663
700
  const maxPayloadBytes = Number.parseInt(process.env.TASKFORCE_MAX_PAYLOAD_BYTES || '', 10) || 1_048_576;
664
701
  const rateLimiter = new InMemoryRateLimiter(rateLimitLimit, rateLimitWindowMs);
702
+ const syncFeedRateLimiter = new InMemoryRateLimiter(syncFeedRateLimit, syncFeedRateLimitWindowMs);
665
703
  const webhookRateLimiter = new InMemoryRateLimiter(webhookRateLimitMaxRequests, webhookRateLimitWindowMs);
666
704
  const resolveAuthRateLimitSettings = () => {
667
705
  const auth = core.getGlobalSettings().auth || {};
@@ -765,7 +803,8 @@ export function createStandaloneServer(options) {
765
803
  const requestId = String(req.headers['x-request-id'] || req.headers['x-railway-request-id'] || '').trim() || '-';
766
804
  const workspaceId = String(req.headers['x-taskforce-workspace-id'] || '').trim() || '-';
767
805
  const userId = String(req.headers['x-taskforce-user-id'] || '').trim() || '-';
768
- console.info(`[Taskforce RefreshDiag] method=${method} path=${pathname} status=${statusCode} durationMs=${durationMs} requestId=${requestId} workspaceId=${workspaceId} userId=${userId}`);
806
+ const qaRunId = sanitizeQaRunIdHeader(req.headers['x-taskforce-qa-run-id']);
807
+ console.info(`[Taskforce RefreshDiag] method=${method} path=${pathname} status=${statusCode} durationMs=${durationMs} requestId=${requestId} workspaceId=${workspaceId} userId=${userId} qaRunId=${qaRunId}`);
769
808
  };
770
809
  // Resolve static files directory at runtime
771
810
  // Standalone UI source now lives in apps/app and builds to dist/ui.
@@ -825,6 +864,9 @@ export function createStandaloneServer(options) {
825
864
  const adminAuditRetentionEnabled = runtimeMode === 'cloud'
826
865
  && process.env.TASKFORCE_ADMIN_AUDIT_RETENTION_ENABLED !== 'false';
827
866
  const adminAuditRetentionIntervalMinutes = readPositiveInteger(process.env.TASKFORCE_ADMIN_AUDIT_RETENTION_INTERVAL_MINUTES, 15);
867
+ const repairSnapshotRetentionEnabled = runtimeMode === 'cloud'
868
+ && process.env.TASKFORCE_SYNC_REPAIR_SNAPSHOT_RETENTION_ENABLED !== 'false';
869
+ const repairSnapshotRetentionIntervalMinutes = readPositiveInteger(process.env.TASKFORCE_SYNC_REPAIR_SNAPSHOT_RETENTION_INTERVAL_MINUTES, 1);
828
870
  const server = http.createServer(async (req, res) => {
829
871
  const requestStartedAt = getRequestTimingNow();
830
872
  if (!distUiPath) {
@@ -877,6 +919,7 @@ export function createStandaloneServer(options) {
877
919
  }
878
920
  try {
879
921
  const method = String(req.method || 'GET').toUpperCase();
922
+ const adminProxyEnvironment = parseTaskforceCloudEnvironment(req.headers[TASKFORCE_PROXY_CLOUD_ENVIRONMENT_HEADER]);
880
923
  const upstreamBaseUrl = resolveCloudProxyUpstreamBaseUrl(req, cloudProxyBaseUrl);
881
924
  const upstreamUrl = `${upstreamBaseUrl}${url.pathname}${url.search || ''}`;
882
925
  const headers = new Headers();
@@ -894,6 +937,9 @@ export function createStandaloneServer(options) {
894
937
  continue;
895
938
  headers.set(key, serialized);
896
939
  }
940
+ if (adminProxyEnvironment) {
941
+ applyAdminProxyRequestSession(headers, adminProxyEnvironment);
942
+ }
897
943
  applyCloudProxyForwardedHeaders(headers, req);
898
944
  if (cloudProxyClientId && cloudProxyClientSecret) {
899
945
  headers.set('CF-Access-Client-Id', cloudProxyClientId);
@@ -915,17 +961,22 @@ export function createStandaloneServer(options) {
915
961
  continue;
916
962
  outgoingHeaders[key] = value;
917
963
  }
964
+ if (adminProxyEnvironment) {
965
+ outgoingHeaders['cache-control'] = 'no-store';
966
+ }
918
967
  const setCookies = upstream.headers.getSetCookie?.();
919
968
  if (Array.isArray(setCookies) && setCookies.length > 0) {
920
969
  const requestHost = String(req.headers.host || '').trim();
921
- const normalizedSetCookies = setCookies.map((cookie) => {
922
- if (shouldRewriteSetCookieForLocalDevHost(requestHost)) {
923
- return rewriteProxySetCookieForLocalHost(cookie);
924
- }
925
- return shouldRewriteProxySetCookieDomain(cookie, requestHost)
926
- ? rewriteProxySetCookieForLocalHost(cookie)
927
- : cookie;
928
- });
970
+ const normalizedSetCookies = adminProxyEnvironment
971
+ ? rewriteAdminProxyResponseCookies(setCookies, adminProxyEnvironment, requestHost)
972
+ : setCookies.map((cookie) => {
973
+ if (shouldRewriteSetCookieForLocalDevHost(requestHost)) {
974
+ return rewriteProxySetCookieForLocalHost(cookie);
975
+ }
976
+ return shouldRewriteProxySetCookieDomain(cookie, requestHost)
977
+ ? rewriteProxySetCookieForLocalHost(cookie)
978
+ : cookie;
979
+ });
929
980
  res.setHeader('Set-Cookie', normalizedSetCookies);
930
981
  }
931
982
  res.writeHead(upstream.status, outgoingHeaders);
@@ -992,7 +1043,9 @@ export function createStandaloneServer(options) {
992
1043
  });
993
1044
  const rateLimitResult = isBillingWebhook
994
1045
  ? webhookRateLimiter.check(key)
995
- : rateLimiter.check(key);
1046
+ : isWorkspaceSyncFeedRead(req.method, url.pathname)
1047
+ ? syncFeedRateLimiter.check(key)
1048
+ : rateLimiter.check(key);
996
1049
  if (isBillingWebhook) {
997
1050
  applyPrefixedRateLimitHeaders(res, rateLimitResult, 'X-Webhook-RateLimit');
998
1051
  }
@@ -1168,6 +1221,8 @@ export function createStandaloneServer(options) {
1168
1221
  let purgeTimer = null;
1169
1222
  let integrityScheduleTimer = null;
1170
1223
  let adminAuditRetentionTimer = null;
1224
+ let repairSnapshotRetentionTimer = null;
1225
+ let operationRetentionTimer = null;
1171
1226
  let watcher = null;
1172
1227
  let shutdownPromise = null;
1173
1228
  Object.defineProperty(server, 'localSyncCoordinatorHost', {
@@ -1192,6 +1247,14 @@ export function createStandaloneServer(options) {
1192
1247
  clearInterval(adminAuditRetentionTimer);
1193
1248
  adminAuditRetentionTimer = null;
1194
1249
  }
1250
+ if (repairSnapshotRetentionTimer) {
1251
+ clearInterval(repairSnapshotRetentionTimer);
1252
+ repairSnapshotRetentionTimer = null;
1253
+ }
1254
+ if (operationRetentionTimer) {
1255
+ clearInterval(operationRetentionTimer);
1256
+ operationRetentionTimer = null;
1257
+ }
1195
1258
  if (localSyncPermitRecoveryTimer) {
1196
1259
  clearInterval(localSyncPermitRecoveryTimer);
1197
1260
  localSyncPermitRecoveryTimer = null;
@@ -1245,6 +1308,52 @@ export function createStandaloneServer(options) {
1245
1308
  adminAuditRetentionTimer = setInterval(runAdminAuditRetention, adminAuditRetentionIntervalMinutes * 60_000);
1246
1309
  adminAuditRetentionTimer.unref?.();
1247
1310
  }
1311
+ const runRepairSnapshotRetention = () => {
1312
+ try {
1313
+ const result = pruneExpiredWorkspaceSyncRepairSnapshots({
1314
+ db: core.getDatabaseAdapter(),
1315
+ tenantId: core.getTenantId(),
1316
+ policy: resolveWorkspaceSyncRepairSnapshotRetentionPolicy(),
1317
+ });
1318
+ if (result.deletedEntries > 0
1319
+ || result.deletedSnapshots > 0
1320
+ || result.remainingExpiredSnapshots > 0) {
1321
+ console.log('[Taskforce] Sync repair snapshot retention: '
1322
+ + `deletedEntries=${result.deletedEntries} `
1323
+ + `deletedSnapshots=${result.deletedSnapshots} `
1324
+ + `remainingExpiredSnapshots=${result.remainingExpiredSnapshots}`);
1325
+ }
1326
+ }
1327
+ catch (error) {
1328
+ console.warn(`[Taskforce] Sync repair snapshot retention failed: ${String(error?.message || error)}`);
1329
+ }
1330
+ };
1331
+ if (repairSnapshotRetentionEnabled) {
1332
+ runRepairSnapshotRetention();
1333
+ repairSnapshotRetentionTimer = setInterval(runRepairSnapshotRetention, repairSnapshotRetentionIntervalMinutes * 60_000);
1334
+ repairSnapshotRetentionTimer.unref?.();
1335
+ }
1336
+ const runOperationRetention = () => {
1337
+ try {
1338
+ const result = pruneRetainedWorkspaceSyncOperations({
1339
+ db: core.getDatabaseAdapter(),
1340
+ tenantId: core.getTenantId(),
1341
+ });
1342
+ if (result.deletedOutbox > 0 || result.deletedResults > 0 || result.remainingEligible > 0) {
1343
+ console.log('[Taskforce] Sync operation retention: '
1344
+ + `deletedOutbox=${result.deletedOutbox} `
1345
+ + `deletedResults=${result.deletedResults} `
1346
+ + `remainingEligible=${result.remainingEligible} `
1347
+ + `workspacesProcessed=${result.workspacesProcessed}`);
1348
+ }
1349
+ }
1350
+ catch (error) {
1351
+ console.warn(`[Taskforce] Sync operation retention failed: ${String(error?.message || error)}`);
1352
+ }
1353
+ };
1354
+ runOperationRetention();
1355
+ operationRetentionTimer = setInterval(runOperationRetention, WORKSPACE_SYNC_OPERATION_RETENTION_INTERVAL_MS);
1356
+ operationRetentionTimer.unref?.();
1248
1357
  const appendDocumentPurgeHistory = (summary) => {
1249
1358
  const settings = core.getGlobalSettings();
1250
1359
  const existing = Array.isArray(settings?.documentPurgeHistory)
@@ -3,6 +3,9 @@ import * as fs from 'fs';
3
3
  import * as os from 'os';
4
4
  import * as path from 'path';
5
5
  const SAFE_POSIX_SOCKET_PATH_BYTES = 100;
6
+ function defaultTemporaryDirectory(platform) {
7
+ return platform === 'darwin' ? '/tmp' : os.tmpdir();
8
+ }
6
9
  function canonicalizePath(value) {
7
10
  const resolved = path.resolve(value);
8
11
  const missingSegments = [];
@@ -39,7 +42,7 @@ export function resolveLocalSyncProcessLockIdentity(input) {
39
42
  };
40
43
  }
41
44
  const socketName = `taskforce-sync-${shortKey}.sock`;
42
- const requestedEndpoint = path.join(input.tempDirectory || os.tmpdir(), socketName);
45
+ const requestedEndpoint = path.join(input.tempDirectory || defaultTemporaryDirectory(platform), socketName);
43
46
  const endpoint = Buffer.byteLength(requestedEndpoint) <= SAFE_POSIX_SOCKET_PATH_BYTES
44
47
  ? requestedEndpoint
45
48
  : path.join('/tmp', socketName);
@@ -1,4 +1,5 @@
1
1
  import { type LocalServiceCloudTarget } from '../config/localServiceCloudTarget.js';
2
+ import { type LocalServiceRuntimeContract } from '../config/localServiceRuntimeContract.js';
2
3
  import { type WindowsAclCommandRunner } from './localServiceWindowsAcl.js';
3
4
  export interface LocalServiceDescriptor {
4
5
  schemaVersion: 1;
@@ -11,6 +12,7 @@ export interface LocalServiceDescriptor {
11
12
  bootstrapCapability: string;
12
13
  publishedAt: string;
13
14
  cloudTarget?: LocalServiceCloudTarget | null;
15
+ runtimeContract?: LocalServiceRuntimeContract | null;
14
16
  }
15
17
  export interface LocalServiceLeaseIdentityInput {
16
18
  projectRoot: string;
@@ -30,6 +32,7 @@ export interface LocalServiceDescriptorPublication {
30
32
  protocolVersion: string;
31
33
  appVersion: string;
32
34
  cloudTarget: LocalServiceCloudTarget;
35
+ runtimeContract: LocalServiceRuntimeContract;
33
36
  }
34
37
  export interface LocalServiceLease {
35
38
  readonly identity: LocalServiceLeaseIdentity;
@@ -4,6 +4,7 @@ import * as net from 'net';
4
4
  import * as os from 'os';
5
5
  import * as path from 'path';
6
6
  import { parseLocalServiceCloudTarget, } from '../config/localServiceCloudTarget.js';
7
+ import { parseLocalServiceRuntimeContract, } from '../config/localServiceRuntimeContract.js';
7
8
  import { resolveLocalSyncProcessLockIdentity } from './localDatabaseIdentity.js';
8
9
  import { ensureWindowsUserOnlyDirectoryAcl, } from './localServiceWindowsAcl.js';
9
10
  const DESCRIPTOR_SCHEMA_VERSION = 1;
@@ -20,7 +21,8 @@ function defaultRuntimeDirectory(platform) {
20
21
  const userKey = typeof process.getuid === 'function'
21
22
  ? String(process.getuid())
22
23
  : createHash('sha256').update(os.userInfo().username).digest('hex').slice(0, 16);
23
- return path.join(os.tmpdir(), `taskforce-${userKey}`, 'local-services');
24
+ const temporaryDirectory = platform === 'darwin' ? '/tmp' : os.tmpdir();
25
+ return path.join(temporaryDirectory, `taskforce-${userKey}`, 'local-services');
24
26
  }
25
27
  export function resolveLocalServiceLeaseIdentity(input) {
26
28
  const ownershipKey = resolveLocalSyncProcessLockIdentity(input).ownershipKey;
@@ -168,8 +170,14 @@ function parseDescriptor(value, ownershipKey) {
168
170
  if (value.cloudTarget != null && !cloudTarget) {
169
171
  throw new Error('Local service descriptor cloud target is invalid.');
170
172
  }
173
+ const runtimeContract = value.runtimeContract == null
174
+ ? null
175
+ : parseLocalServiceRuntimeContract(value.runtimeContract);
176
+ if (value.runtimeContract != null && !runtimeContract) {
177
+ throw new Error('Local service descriptor runtime contract is invalid.');
178
+ }
171
179
  assertLoopbackEndpoint(value.endpoint);
172
- return { ...value, cloudTarget };
180
+ return { ...value, cloudTarget, runtimeContract };
173
181
  }
174
182
  function readOptionalDescriptor(identity) {
175
183
  try {
@@ -371,6 +379,7 @@ export async function acquireLocalServiceLease(input, dependencies = {}) {
371
379
  bootstrapCapability,
372
380
  publishedAt: (dependencies.now?.() || new Date()).toISOString(),
373
381
  cloudTarget: publication.cloudTarget,
382
+ runtimeContract: publication.runtimeContract,
374
383
  };
375
384
  publishJsonFileAtomically(identity.descriptorPath, descriptor, platform);
376
385
  return descriptor;
@@ -1,9 +1,10 @@
1
1
  import type { McpAccessTokenScope } from '../core/Taskforce.js';
2
+ import type { LocalServiceRuntimeContract } from '../config/localServiceRuntimeContract.js';
2
3
  import type { McpClientId } from '../mcp/clientRegistry.js';
3
4
  import type { McpToolProfile } from '../mcp/toolRegistry.js';
5
+ import type { DatabaseAdapter } from '../storage/databaseAdapter.js';
4
6
  export declare const LOCAL_SERVICE_SESSION_IDLE_TTL_MS: number;
5
7
  export declare const LOCAL_SERVICE_SESSION_CAP = 256;
6
- export declare const LOCAL_SERVICE_OPERATION_BINDING_CAP = 4096;
7
8
  export declare const LOCAL_SERVICE_CANCELLATION_BINDING_CAP = 1024;
8
9
  export declare const LOCAL_SERVICE_CANCELLATION_TOMBSTONE_TTL_MS = 60000;
9
10
  export interface LocalServiceSessionRegistration {
@@ -17,34 +18,35 @@ export interface LocalServiceSessionRegistration {
17
18
  }
18
19
  export interface LocalServiceSession extends LocalServiceSessionRegistration {
19
20
  id: string;
21
+ runtimeContract: LocalServiceRuntimeContract;
20
22
  createdAt: string;
21
23
  lastUsedAt: string;
24
+ expiresAt: string;
25
+ revokedAt: string | null;
22
26
  aiProfileId: string | null;
23
27
  }
24
28
  export type LocalServiceLifecycleState = 'accepting' | 'draining' | 'forcing';
25
- export interface LocalServiceOperationBinding {
26
- sessionId: string;
27
- operationId: string;
28
- mutationKind: string;
29
- payloadFingerprint: string;
30
- recordedAt: string;
31
- }
32
29
  export declare class LocalServiceSessionError extends Error {
33
30
  readonly statusCode: number;
34
31
  readonly code: string;
35
32
  constructor(message: string, statusCode: number, code: string);
36
33
  }
34
+ export declare function ensureLocalServiceCredentialSchema(db: DatabaseAdapter): void;
37
35
  export declare class LocalServiceSessionManager {
38
36
  readonly generation: string;
37
+ private readonly db;
38
+ private readonly tenantId;
39
+ readonly runtimeContract: LocalServiceRuntimeContract;
39
40
  private readonly options;
40
- private readonly sessions;
41
41
  private readonly inFlightBySession;
42
- private readonly operationBindings;
43
42
  private readonly cancellationBindings;
44
43
  private readonly cancellationTombstones;
45
44
  private readonly drainWaiters;
46
45
  private lifecycleState;
47
- constructor(generation: string, options?: {
46
+ private readonly runtimeContractJson;
47
+ private readonly authenticateStatement;
48
+ private readonly touchStatement;
49
+ constructor(generation: string, db: DatabaseAdapter, tenantId: string, runtimeContract: LocalServiceRuntimeContract, options?: {
48
50
  nowMs?: () => number;
49
51
  randomId?: () => string;
50
52
  randomSecret?: () => string;
@@ -63,6 +65,7 @@ export declare class LocalServiceSessionManager {
63
65
  touch?: boolean;
64
66
  }): LocalServiceSession | null;
65
67
  revoke(id: string): boolean;
68
+ private hasActiveCredential;
66
69
  beginRequest(id: string): void;
67
70
  endRequest(id: string): void;
68
71
  inFlightCount(): number;
@@ -73,12 +76,6 @@ export declare class LocalServiceSessionManager {
73
76
  revokeAll(): void;
74
77
  registerCancellation(sessionId: string, correlationId: string, cancel: () => void): () => void;
75
78
  cancelRequest(sessionId: string, correlationId: string): boolean;
76
- recordOperation(input: Omit<LocalServiceOperationBinding, 'recordedAt'>): LocalServiceOperationBinding;
77
- getOperationBinding(sessionId: string, operationId: string, expected?: {
78
- mutationKind?: string | null;
79
- payloadFingerprint?: string | null;
80
- }): LocalServiceOperationBinding | null;
81
- private removeOperationBindings;
82
79
  private removeCancellationBindings;
83
80
  private pruneCancellationTombstones;
84
81
  bindAiProfile(id: string, profileId: string): LocalServiceSession;