@taskforcehq/taskforce 0.3.329 → 0.3.332

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 (363) hide show
  1. package/README.md +7 -2
  2. package/dist/Taskforce.module.css +290 -45
  3. package/dist/components/features/AiProfilesModule.js +3 -5
  4. package/dist/components/features/TaskSettings.js +70 -14
  5. package/dist/components/features/TaskforceAgentsModule.d.ts +1 -2
  6. package/dist/components/features/TaskforceAgentsModule.js +586 -116
  7. package/dist/components/features/agentCapabilities/AgentCapabilitiesPrototype.d.ts +2 -2
  8. package/dist/components/features/agentCapabilities/AgentCapabilitiesPrototype.js +2 -2
  9. package/dist/components/features/agentConnections/AgentConnectionControl.d.ts +15 -0
  10. package/dist/components/features/agentConnections/AgentConnectionControl.js +125 -0
  11. package/dist/components/features/agentConnections/ModelConnectionsPanel.d.ts +18 -0
  12. package/dist/components/features/agentConnections/ModelConnectionsPanel.js +393 -0
  13. package/dist/components/features/agentConnections/modelConnectionsApi.d.ts +65 -0
  14. package/dist/components/features/agentConnections/modelConnectionsApi.js +129 -0
  15. package/dist/components/features/planning/PlanningModule.js +15 -3
  16. package/dist/components/features/planning/planningMetadata.d.ts +10 -0
  17. package/dist/components/features/planning/planningMetadata.js +8 -0
  18. package/dist/components/features/taskforceAgentAssignments/AgentBehaviorAssignments.js +15 -24
  19. package/dist/components/features/taskforceAgentEditorModel.d.ts +2 -1
  20. package/dist/components/features/taskforceAgentEditorModel.js +3 -1
  21. package/dist/components/features/workflowManager/workflowManagerApi.d.ts +1 -1
  22. package/dist/components/features/workflowManager/workflowManagerApi.js +3 -0
  23. package/dist/components/task/TaskWorkflowAssignmentField.js +68 -10
  24. package/dist/components/views/StandaloneLayout.js +62 -27
  25. package/dist/components/views/panels/PlanningDrawer.d.ts +2 -1
  26. package/dist/components/views/panels/PlanningDrawer.js +12 -8
  27. package/dist/components/views/standalone/modals/SyncStatusModal.d.ts +4 -3
  28. package/dist/components/views/standalone/modals/SyncStatusModal.js +33 -38
  29. package/dist/config/envSchema.js +55 -1
  30. package/dist/core/McpTokenService.d.ts +25 -1
  31. package/dist/core/McpTokenService.js +106 -15
  32. package/dist/core/TaskChecklistCommandService.d.ts +27 -0
  33. package/dist/core/TaskChecklistCommandService.js +83 -5
  34. package/dist/core/TaskLifecycleCommandService.d.ts +3 -1
  35. package/dist/core/TaskLifecycleCommandService.js +6 -2
  36. package/dist/core/Taskforce.d.ts +43 -3
  37. package/dist/core/Taskforce.js +158 -7
  38. package/dist/core/types.d.ts +9 -0
  39. package/dist/documentReviews/DocumentReviewCommentStore.d.ts +2 -0
  40. package/dist/documentReviews/DocumentReviewCommentStore.js +28 -9
  41. package/dist/documentReviews/commandService.d.ts +2 -1
  42. package/dist/documentReviews/commandService.js +6 -3
  43. package/dist/hooks/sync/orchestratorShared.d.ts +1 -0
  44. package/dist/hooks/sync/orchestratorShared.js +2 -0
  45. package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.d.ts +3 -0
  46. package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.js +85 -9
  47. package/dist/hooks/sync/useSyncStatusControls.d.ts +4 -1
  48. package/dist/hooks/sync/useSyncStatusControls.js +47 -11
  49. package/dist/hooks/useSyncOrchestrator.d.ts +3 -0
  50. package/dist/hooks/useSyncOrchestrator.js +111 -2
  51. package/dist/hooks/useTaskData.d.ts +31 -1
  52. package/dist/hooks/useTaskData.js +29 -7
  53. package/dist/hooks/useTaskMutations.d.ts +3 -1
  54. package/dist/hooks/useTaskMutations.js +46 -12
  55. package/dist/hooks/useTaskforce.d.ts +2 -0
  56. package/dist/hooks/useTaskforce.js +11 -2
  57. package/dist/mcp/clientRegistry.d.ts +2 -2
  58. package/dist/mcp/clientRegistry.js +1 -1
  59. package/dist/mcp/documentAssetRegistrar.js +9 -6
  60. package/dist/mcp/durableTaskMutationRouter.d.ts +4 -1
  61. package/dist/mcp/durableTaskMutationRouter.js +10 -0
  62. package/dist/mcp/durableTaskRelationshipMutationRouter.js +4 -0
  63. package/dist/mcp/httpProtocolRouting.d.ts +11 -0
  64. package/dist/mcp/httpProtocolRouting.js +22 -0
  65. package/dist/mcp/localCliHealth.d.ts +2 -2
  66. package/dist/mcp/localCliHealth.js +2 -2
  67. package/dist/mcp/localServiceProxy.d.ts +1 -0
  68. package/dist/mcp/localServiceProxy.js +530 -68
  69. package/dist/mcp/planningAttachmentCommandAdapter.d.ts +3 -1
  70. package/dist/mcp/planningAttachmentCommandAdapter.js +20 -2
  71. package/dist/mcp/runtime.d.ts +54 -79
  72. package/dist/mcp/runtime.js +408 -102
  73. package/dist/mcp/taskPlanningRegistrar.js +25 -6
  74. package/dist/mcp/toolProfiles.d.ts +2 -0
  75. package/dist/mcp/toolProfiles.js +11 -0
  76. package/dist/mcp/toolRegistry.d.ts +1 -0
  77. package/dist/mcp/toolRegistry.js +9 -8
  78. package/dist/mcp/workflowExecutionRegistrar.js +4 -4
  79. package/dist/migrations/taskSchemaMigrations.d.ts +5 -0
  80. package/dist/migrations/taskSchemaMigrations.js +415 -0
  81. package/dist/runtime/appGates.d.ts +2 -1
  82. package/dist/runtime/appGates.js +7 -0
  83. package/dist/server/buildInfo.d.ts +1 -0
  84. package/dist/server/buildInfo.js +5 -1
  85. package/dist/server/cloudMcpCapacityTelemetry.d.ts +68 -0
  86. package/dist/server/cloudMcpCapacityTelemetry.js +221 -0
  87. package/dist/server/index.d.ts +3 -0
  88. package/dist/server/index.js +108 -11
  89. package/dist/server/localDatabaseIdentity.js +4 -1
  90. package/dist/server/localServiceLease.js +2 -1
  91. package/dist/server/localServiceSessions.d.ts +14 -17
  92. package/dist/server/localServiceSessions.js +308 -94
  93. package/dist/server/localWorkspaceSyncServerRuntime.js +25 -19
  94. package/dist/server/routes/admin.d.ts +4 -0
  95. package/dist/server/routes/admin.js +126 -5
  96. package/dist/server/routes/agents.d.ts +7 -0
  97. package/dist/server/routes/agents.js +277 -24
  98. package/dist/server/routes/billing.js +5 -1
  99. package/dist/server/routes/durableTaskHttpRouters.d.ts +2 -0
  100. package/dist/server/routes/executorPhaseAApprovals.d.ts +19 -0
  101. package/dist/server/routes/executorPhaseAApprovals.js +140 -0
  102. package/dist/server/routes/executorPhaseAIssuerRedemptions.d.ts +11 -0
  103. package/dist/server/routes/executorPhaseAIssuerRedemptions.js +24 -0
  104. package/dist/server/routes/githubReviewEvidence.d.ts +19 -0
  105. package/dist/server/routes/githubReviewEvidence.js +116 -0
  106. package/dist/server/routes/localService.d.ts +15 -4
  107. package/dist/server/routes/localService.js +136 -40
  108. package/dist/server/routes/modelConnections.d.ts +24 -0
  109. package/dist/server/routes/modelConnections.js +205 -0
  110. package/dist/server/routes/shared.d.ts +22 -0
  111. package/dist/server/routes/shared.js +298 -182
  112. package/dist/server/routes/sync.js +1 -0
  113. package/dist/server/routes/syncAuxRoutes.js +5 -1
  114. package/dist/server/routes/syncPushRoutes.d.ts +1 -0
  115. package/dist/server/routes/syncPushRoutes.js +1 -0
  116. package/dist/server/routes/syncV3FeedRoutes.js +10 -1
  117. package/dist/server/routes/syncV3OperationRoutes.js +35 -9
  118. package/dist/server/routes/tasks.js +21 -2
  119. package/dist/server/routes/workflows.js +9 -1
  120. package/dist/server/routes.js +59 -0
  121. package/dist/service/localServiceCli.d.ts +2 -2
  122. package/dist/service/localServiceCli.js +4 -3
  123. package/dist/services/codexAppServerModelGateway.d.ts +54 -5
  124. package/dist/services/codexAppServerModelGateway.js +246 -21
  125. package/dist/services/codexDeviceCodeLoginManager.d.ts +39 -0
  126. package/dist/services/codexDeviceCodeLoginManager.js +265 -0
  127. package/dist/services/codexModelProviderConnectionLifecycle.d.ts +8 -0
  128. package/dist/services/codexModelProviderConnectionLifecycle.js +73 -0
  129. package/dist/services/executorPhaseAApprovalRuntime.d.ts +14 -0
  130. package/dist/services/executorPhaseAApprovalRuntime.js +24 -0
  131. package/dist/services/executorPhaseAApprovalService.d.ts +40 -0
  132. package/dist/services/executorPhaseAApprovalService.js +609 -0
  133. package/dist/services/executorPhaseADriftEvaluator.d.ts +78 -0
  134. package/dist/services/executorPhaseADriftEvaluator.js +93 -0
  135. package/dist/services/executorPhaseAIssuerCore.d.ts +139 -0
  136. package/dist/services/executorPhaseAIssuerCore.js +402 -0
  137. package/dist/services/executorPhaseAIssuerRedemptionService.d.ts +34 -0
  138. package/dist/services/executorPhaseAIssuerRedemptionService.js +158 -0
  139. package/dist/services/githubReviewEvidenceRuntime.d.ts +14 -0
  140. package/dist/services/githubReviewEvidenceRuntime.js +30 -0
  141. package/dist/services/githubReviewEvidenceService.d.ts +93 -0
  142. package/dist/services/githubReviewEvidenceService.js +336 -0
  143. package/dist/services/modelGateway.d.ts +7 -0
  144. package/dist/services/modelProviderConnectionService.d.ts +71 -0
  145. package/dist/services/modelProviderConnectionService.js +279 -0
  146. package/dist/services/modelProviderCredentialHome.d.ts +32 -0
  147. package/dist/services/modelProviderCredentialHome.js +271 -0
  148. package/dist/services/ownerScopedModelConnectionGateway.d.ts +12 -0
  149. package/dist/services/ownerScopedModelConnectionGateway.js +30 -0
  150. package/dist/services/taskforceAgentConnectionBindingService.d.ts +66 -0
  151. package/dist/services/taskforceAgentConnectionBindingService.js +185 -0
  152. package/dist/services/taskforceAgentMcpBridge.d.ts +2 -2
  153. package/dist/services/taskforceAgentMcpBridge.js +42 -29
  154. package/dist/shared/adminEdgeProxy.d.ts +5 -0
  155. package/dist/shared/adminEdgeProxy.js +94 -0
  156. package/dist/shared/adminProxySessionCookies.d.ts +16 -0
  157. package/dist/shared/adminProxySessionCookies.js +86 -0
  158. package/dist/shared/aiProfileColors.d.ts +31 -1
  159. package/dist/shared/aiProfileColors.js +14 -6
  160. package/dist/shared/executorPhaseAApprovalGoldenVector.json +269 -0
  161. package/dist/shared/executorPhaseAApprovalReceipt.d.ts +112 -0
  162. package/dist/shared/executorPhaseAApprovalReceipt.js +58 -0
  163. package/dist/shared/executorPhaseAApprovalTrustPolicy.json +10 -0
  164. package/dist/shared/executorPhaseADriftContracts.d.ts +37 -0
  165. package/dist/shared/executorPhaseADriftContracts.js +63 -0
  166. package/dist/shared/executorPhaseAIssuerContracts.d.ts +75 -0
  167. package/dist/shared/executorPhaseAIssuerContracts.js +90 -0
  168. package/dist/shared/executorPhaseARunAuthorization.d.ts +120 -0
  169. package/dist/shared/executorPhaseARunAuthorization.js +232 -0
  170. package/dist/shared/executorPhaseASchemaValidation.d.ts +7 -0
  171. package/dist/shared/executorPhaseASchemaValidation.js +53 -0
  172. package/dist/shared/executorPhaseASchemas/approval-receipt.schema.json +106 -0
  173. package/dist/shared/executorPhaseASchemas/drift-attestation.schema.json +54 -0
  174. package/dist/shared/executorPhaseASchemas/drift-request.schema.json +47 -0
  175. package/dist/shared/executorPhaseASchemas/foundation-manifest.schema.json +29 -0
  176. package/dist/shared/executorPhaseASchemas/issuer-audit-record.schema.json +24 -0
  177. package/dist/shared/executorPhaseASchemas/issuer-proof.schema.json +43 -0
  178. package/dist/shared/executorPhaseASchemas/issuer-redemption-request.schema.json +18 -0
  179. package/dist/shared/executorPhaseASchemas/issuer-redemption-response.schema.json +39 -0
  180. package/dist/shared/executorPhaseASchemas/logical-envelope.schema.json +149 -0
  181. package/dist/shared/executorPhaseASchemas/preflight-report.schema.json +216 -0
  182. package/dist/shared/executorPhaseASchemas/run-capability.schema.json +111 -0
  183. package/dist/shared/executorPhaseASchemas/sender-proof.schema.json +37 -0
  184. package/dist/shared/executorPhaseASchemas/workload-grant.schema.json +68 -0
  185. package/dist/shared/executorPhaseASchemas/workload-jwt-claims.schema.json +67 -0
  186. package/dist/shared/executorPhaseATiming.d.ts +1 -0
  187. package/dist/shared/executorPhaseATiming.js +1 -0
  188. package/dist/shared/planningIdentity.js +1 -1
  189. package/dist/shared/productLogoKeys.d.ts +2 -0
  190. package/dist/shared/productLogoKeys.js +18 -0
  191. package/dist/shared/taskforceAgentDefinition.d.ts +0 -1
  192. package/dist/shared/taskforceAgentDefinition.js +6 -9
  193. package/dist/shared/taskforceAgentModels.js +7 -3
  194. package/dist/shared/userFeatureGrants.d.ts +4 -0
  195. package/dist/shared/userFeatureGrants.js +7 -0
  196. package/dist/storage/executorPhaseAApprovalReceiptStore.d.ts +37 -0
  197. package/dist/storage/executorPhaseAApprovalReceiptStore.js +81 -0
  198. package/dist/storage/executorPhaseARunAuthorizationStore.d.ts +103 -0
  199. package/dist/storage/executorPhaseARunAuthorizationStore.js +492 -0
  200. package/dist/storage/githubReviewEvidenceInstallationStore.d.ts +26 -0
  201. package/dist/storage/githubReviewEvidenceInstallationStore.js +89 -0
  202. package/dist/storage/modelProviderConnectionStore.d.ts +99 -0
  203. package/dist/storage/modelProviderConnectionStore.js +446 -0
  204. package/dist/storage/postgresAdapter.d.ts +4 -0
  205. package/dist/storage/postgresAdapter.js +14 -1
  206. package/dist/storage/postgresRequestDiagnostics.d.ts +9 -1
  207. package/dist/storage/postgresRequestDiagnostics.js +15 -2
  208. package/dist/storage/postgresWorker.js +20 -2
  209. package/dist/storage/postgresWorkerProtocol.d.ts +7 -0
  210. package/dist/storage/taskforceAgentConnectionBindingStore.d.ts +31 -0
  211. package/dist/storage/taskforceAgentConnectionBindingStore.js +84 -0
  212. package/dist/storage/workflowStore.d.ts +2 -0
  213. package/dist/storage/workflowStore.js +39 -2
  214. package/dist/sync/cloudSyncApi.js +4 -2
  215. package/dist/sync/collaborationSyncState.js +5 -0
  216. package/dist/sync/coordinator/localSyncExecutionPermitStore.js +60 -29
  217. package/dist/sync/coordinator/localWorkspaceSyncPendingV2PushProgress.d.ts +10 -0
  218. package/dist/sync/coordinator/localWorkspaceSyncPendingV2PushProgress.js +29 -0
  219. package/dist/sync/coordinator/localWorkspaceSyncRunner.d.ts +3 -1
  220. package/dist/sync/coordinator/localWorkspaceSyncRunner.js +18 -0
  221. package/dist/sync/coordinator/localWorkspaceSyncRunnerState.d.ts +15 -1
  222. package/dist/sync/coordinator/localWorkspaceSyncRunnerState.js +99 -2
  223. package/dist/sync/coordinator/workspaceSyncCredentialBroker.d.ts +1 -0
  224. package/dist/sync/coordinator/workspaceSyncCredentialBroker.js +33 -4
  225. package/dist/sync/engine/workspaceSyncContentLifecycleAdapter.d.ts +2 -1
  226. package/dist/sync/engine/workspaceSyncContentVersionStore.d.ts +38 -0
  227. package/dist/sync/engine/workspaceSyncContentVersionStore.js +50 -1
  228. package/dist/sync/engine/workspaceSyncEngineLifecyclePolicy.js +6 -6
  229. package/dist/sync/engine/workspaceSyncEnginePushCompletion.d.ts +14 -0
  230. package/dist/sync/engine/workspaceSyncEnginePushCompletion.js +84 -0
  231. package/dist/sync/engine/workspaceSyncEngineRecovery.js +1 -0
  232. package/dist/sync/engine/workspaceSyncEngineRuntime.d.ts +1 -0
  233. package/dist/sync/engine/workspaceSyncEngineRuntime.js +1 -0
  234. package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.js +112 -38
  235. package/dist/sync/engine/workspaceSyncEngineServerSnapshotReader.js +6 -0
  236. package/dist/sync/engine/workspaceSyncEngineTransfers.js +3 -1
  237. package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.d.ts +1 -0
  238. package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.js +31 -0
  239. package/dist/sync/syncApplyHandlers.d.ts +3 -0
  240. package/dist/sync/syncApplyHandlers.js +81 -15
  241. package/dist/sync/syncService.d.ts +15 -0
  242. package/dist/sync/syncService.js +83 -18
  243. package/dist/sync/taskforceAgentSyncAuthorization.d.ts +16 -0
  244. package/dist/sync/taskforceAgentSyncAuthorization.js +20 -0
  245. package/dist/sync/v3/combinedFeedCapability.js +4 -0
  246. package/dist/sync/v3/durableInitiativeMutationRouter.js +18 -10
  247. package/dist/sync/v3/durableOperationReplay.d.ts +14 -0
  248. package/dist/sync/v3/durableOperationReplay.js +18 -0
  249. package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.js +3 -0
  250. package/dist/sync/v3/durableTaskChecklistMutationRouter.d.ts +2 -1
  251. package/dist/sync/v3/durableTaskChecklistMutationRouter.js +58 -15
  252. package/dist/sync/v3/durableTaskCommentMutationRouter.js +3 -0
  253. package/dist/sync/v3/durableTaskHttpRootMutationRouter.d.ts +1 -1
  254. package/dist/sync/v3/durableTaskHttpRootMutationRouter.js +10 -0
  255. package/dist/sync/v3/durableTaxonomyMutationRouter.js +5 -0
  256. package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.d.ts +18 -7
  257. package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.js +89 -23
  258. package/dist/sync/v3/durableWorkstreamMutationRouter.js +18 -10
  259. package/dist/sync/v3/durableWorkstreamTaskOrderMutationRouter.js +16 -5
  260. package/dist/sync/v3/localOutboxDispatchRuntime.js +2 -2
  261. package/dist/sync/v3/localOutboxRecoveryPreparationService.js +8 -2
  262. package/dist/sync/v3/localTaskChecklistOutboxHandler.js +16 -2
  263. package/dist/sync/v3/localTaskChecklistOutboxService.d.ts +4 -0
  264. package/dist/sync/v3/localTaskChecklistOutboxService.js +14 -1
  265. package/dist/sync/v3/localTaskCreateOutboxService.d.ts +3 -1
  266. package/dist/sync/v3/localTaskCreateOutboxService.js +6 -1
  267. package/dist/sync/v3/localTaskDeleteOutboxService.js +1 -0
  268. package/dist/sync/v3/localTaskLifecycleOutboxService.d.ts +2 -1
  269. package/dist/sync/v3/localTaskLifecycleOutboxService.js +5 -1
  270. package/dist/sync/v3/localTaskMetadataOutboxService.d.ts +2 -1
  271. package/dist/sync/v3/localTaskMetadataOutboxService.js +6 -2
  272. package/dist/sync/v3/localTaskStatusOutboxService.d.ts +10 -1
  273. package/dist/sync/v3/localTaskStatusOutboxService.js +238 -16
  274. package/dist/sync/v3/syncDurabilityStore.d.ts +36 -1
  275. package/dist/sync/v3/syncDurabilityStore.js +202 -8
  276. package/dist/sync/v3/taskChecklistMutationService.d.ts +11 -0
  277. package/dist/sync/v3/taskChecklistMutationService.js +44 -1
  278. package/dist/sync/v3/taskStatusMutationService.d.ts +29 -1
  279. package/dist/sync/v3/taskStatusMutationService.js +119 -3
  280. package/dist/sync/v3/workflowAssignmentSync.d.ts +5 -0
  281. package/dist/sync/v3/workflowAssignmentSync.js +27 -0
  282. package/dist/sync/v3/workflowRuntimeMutationService.d.ts +5 -0
  283. package/dist/sync/v3/workflowRuntimeMutationService.js +124 -71
  284. package/dist/sync/v3/workspaceSyncJournalReader.js +1 -1
  285. package/dist/sync/v3/workspaceSyncOperationRetentionService.d.ts +16 -0
  286. package/dist/sync/v3/workspaceSyncOperationRetentionService.js +83 -0
  287. package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.d.ts +1 -0
  288. package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.js +9 -2
  289. package/dist/sync/v3/workspaceSyncV3CombinedLocalApply.js +25 -3
  290. package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.d.ts +7 -0
  291. package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.js +44 -32
  292. package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.d.ts +9 -5
  293. package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.js +54 -38
  294. package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.d.ts +10 -0
  295. package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.js +70 -31
  296. package/dist/sync/v3/workspaceSyncV3CombinedWireContract.d.ts +2 -1
  297. package/dist/sync/v3/workspaceSyncV3CombinedWireContract.js +16 -0
  298. package/dist/sync/v3/workspaceSyncV3CoverageRegistry.js +6 -0
  299. package/dist/sync/v3/workspaceSyncV3Feed.d.ts +1 -0
  300. package/dist/sync/v3/workspaceSyncV3Feed.js +6 -1
  301. package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.d.ts +2 -0
  302. package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.js +49 -18
  303. package/dist/sync/v3/workspaceSyncV3OperationProtocol.d.ts +3 -0
  304. package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.d.ts +5 -0
  305. package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.js +36 -2
  306. package/dist/sync/v3/workspaceSyncV3RepairSnapshotRetentionService.d.ts +17 -0
  307. package/dist/sync/v3/workspaceSyncV3RepairSnapshotRetentionService.js +64 -0
  308. package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeApply.d.ts +1 -0
  309. package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeApply.js +50 -5
  310. package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverCoverage.d.ts +7 -0
  311. package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverCoverage.js +33 -0
  312. package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverWireContract.d.ts +7 -0
  313. package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverWireContract.js +8 -0
  314. package/dist/sync/workspaceRepair.d.ts +5 -2
  315. package/dist/sync/workspaceRepair.js +161 -6
  316. package/dist/sync/workspaceSyncModel.d.ts +21 -0
  317. package/dist/sync/workspaceSyncModel.js +35 -7
  318. package/dist/sync/workspaceSyncState.d.ts +1 -0
  319. package/dist/sync/workspaceSyncV2SnapshotBuilder.d.ts +6 -0
  320. package/dist/sync/workspaceSyncV2SnapshotBuilder.js +5 -0
  321. package/dist/ui/assets/AiIdentityRosterCard-CDMPtnbC.js +1 -0
  322. package/dist/ui/assets/AiProfilesModule-Cww85C4E.js +1 -0
  323. package/dist/ui/assets/{AnnotatedAttachmentWorkspace-B68Wg-RV.js → AnnotatedAttachmentWorkspace-Dt9TKYSH.js} +1 -1
  324. package/dist/ui/assets/{AssetTraySortControl-C8Rztyal.js → AssetTraySortControl-CKgapnxu.js} +1 -1
  325. package/dist/ui/assets/{ContextAttachmentManager-Cj3c7X9y.js → ContextAttachmentManager-T-cEVcOZ.js} +2 -2
  326. package/dist/ui/assets/{DocumentWorkspace-B5uvzems.js → DocumentWorkspace-HD4MUjAZ.js} +1 -1
  327. package/dist/ui/assets/{EntityActivityTimeline-BVFvCB5R.js → EntityActivityTimeline-_V0zfMuh.js} +1 -1
  328. package/dist/ui/assets/PlanningModule-mTkBygsB.js +1 -0
  329. package/dist/ui/assets/{PlansPage-AY4cGWco.js → PlansPage-Btiq06VO.js} +1 -1
  330. package/dist/ui/assets/{TaskContextUpload-DZxTVesW.js → TaskContextUpload-C00NVUpn.js} +1 -1
  331. package/dist/ui/assets/TaskSettings-Cp-L-4xh.js +12 -0
  332. package/dist/ui/assets/TaskforceAgentsModule-Coq9-PUp.js +24 -0
  333. package/dist/ui/assets/TaskforceAgentsModule-b-8R25cJ.css +1 -0
  334. package/dist/ui/assets/{WorkflowManagerModule-DEr5di_r.js → WorkflowManagerModule-CuqRzMmM.js} +1 -1
  335. package/dist/ui/assets/index-BZ-hdZSk.css +1 -0
  336. package/dist/ui/assets/index-DSQINwt9.js +7 -0
  337. package/dist/ui/assets/{vendor-icons-D9Lpw-j4.js → vendor-icons-Bsq-mcEn.js} +1 -1
  338. package/dist/ui/branding/logos/letterhead_dark.png +0 -0
  339. package/dist/ui/branding/logos/letterhead_light.png +0 -0
  340. package/dist/ui/branding/logos/signature_dark.png +0 -0
  341. package/dist/ui/branding/logos/signature_light.png +0 -0
  342. package/dist/ui/index.html +3 -3
  343. package/dist/utils/aiProfileDefaultLogo.js +16 -48
  344. package/dist/utils/httpSetCookie.d.ts +1 -0
  345. package/dist/utils/httpSetCookie.js +4 -1
  346. package/dist/utils/localRuntimeUrl.d.ts +1 -0
  347. package/dist/utils/localRuntimeUrl.js +14 -0
  348. package/dist/utils/productLogoRegistry.d.ts +2 -0
  349. package/dist/utils/productLogoRegistry.js +36 -0
  350. package/dist/utils/syncStatusPresentation.d.ts +4 -0
  351. package/dist/utils/syncStatusPresentation.js +17 -0
  352. package/dist/utils/taskEvents.d.ts +2 -0
  353. package/dist/utils/workspaceSyncPresentation.d.ts +1 -1
  354. package/dist/utils/workspaceSyncPresentation.js +23 -17
  355. package/package.json +24 -4
  356. package/dist/ui/assets/AiIdentityRosterCard-BZM4aQnM.js +0 -1
  357. package/dist/ui/assets/AiProfilesModule-BbAEWtHH.js +0 -1
  358. package/dist/ui/assets/PlanningModule-B5DWQOGz.js +0 -1
  359. package/dist/ui/assets/TaskSettings-BeWAuyZj.js +0 -12
  360. package/dist/ui/assets/TaskforceAgentsModule-BifCYtjR.js +0 -21
  361. package/dist/ui/assets/TaskforceAgentsModule-D6IC0S7Q.css +0 -1
  362. package/dist/ui/assets/index-I5zhdtgt.js +0 -7
  363. package/dist/ui/assets/index-VRFsx3wz.css +0 -1
@@ -0,0 +1,221 @@
1
+ import { monitorEventLoopDelay, performance } from 'node:perf_hooks';
2
+ export const TASKFORCE_CAPACITY_TRACE_HEADER = 'x-taskforce-capacity-trace';
3
+ function finite(value) {
4
+ return Number.isFinite(value) ? Math.max(0, value) : 0;
5
+ }
6
+ function millisecondsFromNanoseconds(value) {
7
+ return finite(value) / 1_000_000;
8
+ }
9
+ function percentile(values, rank) {
10
+ if (values.length === 0)
11
+ return 0;
12
+ const sorted = [...values].sort((a, b) => a - b);
13
+ const index = Math.min(sorted.length - 1, Math.max(0, Math.ceil((rank / 100) * sorted.length) - 1));
14
+ return finite(sorted[index]);
15
+ }
16
+ function classifyOutcome(statusCode, aborted) {
17
+ if (aborted)
18
+ return 'timeout_or_abort';
19
+ if (statusCode >= 500)
20
+ return 'server_error';
21
+ if (statusCode === 401 || statusCode === 403 || statusCode === 405 || statusCode === 415 || statusCode === 429) {
22
+ return 'rejected';
23
+ }
24
+ if (statusCode >= 400)
25
+ return 'client_error';
26
+ return 'success';
27
+ }
28
+ function classifyRejection(statusCode) {
29
+ if (statusCode === 429)
30
+ return 'rate_limited';
31
+ if (statusCode === 401 || statusCode === 403)
32
+ return 'auth_or_scope';
33
+ if (statusCode === 405 || statusCode === 415)
34
+ return 'protocol';
35
+ return statusCode >= 400 && statusCode < 500 ? 'other_client' : null;
36
+ }
37
+ function classifyStatus(statusCode) {
38
+ if (statusCode >= 200 && statusCode < 300)
39
+ return '2xx';
40
+ if (statusCode >= 300 && statusCode < 400)
41
+ return '3xx';
42
+ if (statusCode >= 400 && statusCode < 500)
43
+ return '4xx';
44
+ if (statusCode >= 500 && statusCode < 600)
45
+ return '5xx';
46
+ return 'other';
47
+ }
48
+ export class CloudMcpCapacityTelemetry {
49
+ emit;
50
+ eventLoop;
51
+ now;
52
+ cpuUsage;
53
+ memoryUsage;
54
+ windowMs;
55
+ maxSamples;
56
+ activeRequests = 0;
57
+ maxActiveRequests = 0;
58
+ samples = [];
59
+ completedRequests = 0;
60
+ requestClassCounts = {};
61
+ outcomeCounts = {};
62
+ rejectionCounts = {};
63
+ statusClassCounts = {};
64
+ windowStartedAt;
65
+ windowCpuStartedAt;
66
+ flushTimer;
67
+ constructor(options = {}) {
68
+ this.emit = options.emit || ((payload) => console.info(`[Taskforce MCP] ${JSON.stringify(payload)}`));
69
+ this.eventLoop = options.eventLoop || monitorEventLoopDelay({ resolution: 20 });
70
+ this.now = options.now || (() => performance.now());
71
+ this.cpuUsage = options.cpuUsage || process.cpuUsage.bind(process);
72
+ this.memoryUsage = options.memoryUsage || process.memoryUsage.bind(process);
73
+ this.windowMs = Math.max(1_000, options.windowMs || 60_000);
74
+ this.maxSamples = Math.max(10, options.maxSamples || 2_048);
75
+ this.windowStartedAt = this.now();
76
+ this.windowCpuStartedAt = this.cpuUsage();
77
+ this.eventLoop.enable();
78
+ this.flushTimer = setInterval(() => this.flush(), this.windowMs);
79
+ this.flushTimer.unref?.();
80
+ }
81
+ begin(requestClass = 'other') {
82
+ const startedAt = this.now();
83
+ let settled = false;
84
+ let currentClass = requestClass;
85
+ this.activeRequests += 1;
86
+ this.maxActiveRequests = Math.max(this.maxActiveRequests, this.activeRequests);
87
+ return {
88
+ classify: (nextClass) => {
89
+ currentClass = nextClass;
90
+ },
91
+ setTraceHeaders: (res, postgres) => {
92
+ if (res.headersSent)
93
+ return;
94
+ const memory = this.memoryUsage();
95
+ res.setHeader('X-Taskforce-MCP-Active-Requests', String(this.activeRequests));
96
+ res.setHeader('X-Taskforce-MCP-Max-Active-Requests', String(this.maxActiveRequests));
97
+ res.setHeader('X-Taskforce-Event-Loop-P95-Ms', millisecondsFromNanoseconds(this.eventLoop.percentile(95)).toFixed(2));
98
+ res.setHeader('X-Taskforce-Event-Loop-Max-Ms', millisecondsFromNanoseconds(this.eventLoop.max).toFixed(2));
99
+ res.setHeader('X-Taskforce-Process-RSS-Bytes', String(memory.rss));
100
+ res.setHeader('X-Taskforce-Process-Heap-Used-Bytes', String(memory.heapUsed));
101
+ if (postgres) {
102
+ res.setHeader('X-Taskforce-Postgres-Worker-Wait-Ms', postgres.postgresWorkerWaitMs.toFixed(2));
103
+ res.setHeader('X-Taskforce-Postgres-Worker-Wait-Max-Ms', postgres.postgresWorkerWaitMaxMs.toFixed(2));
104
+ res.setHeader('X-Taskforce-Postgres-Pool-Waiting-Max', String(postgres.postgresPoolWaitingMax));
105
+ res.setHeader('X-Taskforce-Postgres-Pool-Total-Max', String(postgres.postgresPoolTotalMax));
106
+ if (postgres.postgresPoolIdleMin !== null) {
107
+ res.setHeader('X-Taskforce-Postgres-Pool-Idle-Min', String(postgres.postgresPoolIdleMin));
108
+ }
109
+ }
110
+ },
111
+ finish: (input) => {
112
+ if (settled)
113
+ return;
114
+ settled = true;
115
+ this.activeRequests = Math.max(0, this.activeRequests - 1);
116
+ const outcome = classifyOutcome(input.statusCode, input.aborted === true);
117
+ this.completedRequests += 1;
118
+ this.requestClassCounts[currentClass] = (this.requestClassCounts[currentClass] || 0) + 1;
119
+ this.outcomeCounts[outcome] = (this.outcomeCounts[outcome] || 0) + 1;
120
+ const rejection = classifyRejection(input.statusCode);
121
+ if (rejection)
122
+ this.rejectionCounts[rejection] = (this.rejectionCounts[rejection] || 0) + 1;
123
+ const statusClass = classifyStatus(input.statusCode);
124
+ this.statusClassCounts[statusClass] = (this.statusClassCounts[statusClass] || 0) + 1;
125
+ this.samples.push({
126
+ requestClass: currentClass,
127
+ outcome,
128
+ durationMs: finite(this.now() - startedAt),
129
+ postgres: input.postgres,
130
+ });
131
+ if (this.samples.length > this.maxSamples)
132
+ this.samples.splice(0, this.samples.length - this.maxSamples);
133
+ this.flushIfDue();
134
+ },
135
+ };
136
+ }
137
+ snapshot() {
138
+ const memory = this.memoryUsage();
139
+ const durations = this.samples.map((sample) => sample.durationMs);
140
+ const workerWaits = this.samples.map((sample) => sample.postgres?.postgresWorkerWaitMs || 0);
141
+ const cpu = this.cpuUsage(this.windowCpuStartedAt);
142
+ return {
143
+ event: 'cloud_mcp_capacity_window',
144
+ windowMs: Math.max(0, Math.round(this.now() - this.windowStartedAt)),
145
+ requests: this.completedRequests,
146
+ activeRequests: this.activeRequests,
147
+ maxActiveRequests: this.maxActiveRequests,
148
+ requestClasses: { ...this.requestClassCounts },
149
+ outcomes: { ...this.outcomeCounts },
150
+ rejections: { ...this.rejectionCounts },
151
+ statusClasses: { ...this.statusClassCounts },
152
+ durationMs: { p50: percentile(durations, 50), p95: percentile(durations, 95), p99: percentile(durations, 99) },
153
+ eventLoopDelayMs: {
154
+ p50: millisecondsFromNanoseconds(this.eventLoop.percentile(50)),
155
+ p95: millisecondsFromNanoseconds(this.eventLoop.percentile(95)),
156
+ p99: millisecondsFromNanoseconds(this.eventLoop.percentile(99)),
157
+ max: millisecondsFromNanoseconds(this.eventLoop.max),
158
+ },
159
+ process: {
160
+ cpuUserMs: finite(cpu.user / 1_000),
161
+ cpuSystemMs: finite(cpu.system / 1_000),
162
+ rssBytes: memory.rss,
163
+ heapUsedBytes: memory.heapUsed,
164
+ heapTotalBytes: memory.heapTotal,
165
+ externalBytes: memory.external,
166
+ },
167
+ postgres: {
168
+ workerWaitMsP95: percentile(workerWaits, 95),
169
+ maxPoolWaiting: Math.max(0, ...this.samples.map((sample) => sample.postgres?.postgresPoolWaitingMax || 0)),
170
+ maxPoolTotal: Math.max(0, ...this.samples.map((sample) => sample.postgres?.postgresPoolTotalMax || 0)),
171
+ minPoolIdle: this.minimumPoolIdle(),
172
+ },
173
+ };
174
+ }
175
+ flush() {
176
+ if (this.completedRequests === 0 && this.activeRequests === 0)
177
+ return null;
178
+ const payload = this.snapshot();
179
+ this.emit(payload);
180
+ this.samples = [];
181
+ this.completedRequests = 0;
182
+ this.requestClassCounts = {};
183
+ this.outcomeCounts = {};
184
+ this.rejectionCounts = {};
185
+ this.statusClassCounts = {};
186
+ this.maxActiveRequests = this.activeRequests;
187
+ this.windowStartedAt = this.now();
188
+ this.windowCpuStartedAt = this.cpuUsage();
189
+ this.eventLoop.reset();
190
+ return payload;
191
+ }
192
+ shutdown() {
193
+ clearInterval(this.flushTimer);
194
+ this.eventLoop.disable?.();
195
+ }
196
+ flushIfDue() {
197
+ if (this.now() - this.windowStartedAt >= this.windowMs)
198
+ this.flush();
199
+ }
200
+ minimumPoolIdle() {
201
+ const values = this.samples
202
+ .map((sample) => sample.postgres?.postgresPoolIdleMin)
203
+ .filter((value) => typeof value === 'number');
204
+ return values.length > 0 ? Math.min(...values) : null;
205
+ }
206
+ }
207
+ let defaultTelemetry = null;
208
+ export function isCloudMcpCapacityTelemetryEnabled() {
209
+ return process.env.TASKFORCE_CLOUD_MCP_CAPACITY_TELEMETRY !== '0';
210
+ }
211
+ export function beginCloudMcpCapacityRequest(requestClass = 'other') {
212
+ if (!isCloudMcpCapacityTelemetryEnabled()) {
213
+ return {
214
+ classify: (_nextClass) => undefined,
215
+ setTraceHeaders: (_res, _postgres) => undefined,
216
+ finish: (_input) => undefined,
217
+ };
218
+ }
219
+ defaultTelemetry ||= new CloudMcpCapacityTelemetry();
220
+ return defaultTelemetry.begin(requestClass);
221
+ }
@@ -9,6 +9,7 @@ import { WebSocketServer } from 'ws';
9
9
  export { resolveAuthorizedWorkspaceAccess, resolveDisabledAccessError, isWorkspaceAccessRecoveryRoute, } from './authorizedWorkspaceAccess.js';
10
10
  import type { LocalServiceCloudTarget } from '../config/localServiceCloudTarget.js';
11
11
  import type { LocalServiceRuntimeContract } from '../config/localServiceRuntimeContract.js';
12
+ import { type TaskforceCloudEnvironment } from '../config/cloudEnvironment.js';
12
13
  import type { LocalSyncCoordinatorHost } from '../sync/coordinator/localSyncCoordinatorHost.js';
13
14
  import type { LocalSyncProcessLock } from '../sync/coordinator/localSyncProcessLock.js';
14
15
  import type { LocalDataOwnerPermit } from './localDataOwnerPermit.js';
@@ -60,6 +61,8 @@ export declare function writeJsonErrorIfPossible(res: http.ServerResponse, statu
60
61
  export declare function applyCloudProxyForwardedHeaders(headers: Headers, req: http.IncomingMessage): void;
61
62
  export declare function rewriteProxySetCookieForLocalHost(cookie: string): string;
62
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[];
63
66
  export declare function shouldForwardCloudProxyResponseHeader(name: string): boolean;
64
67
  export declare function shouldApplyAuthRateLimitForPath(pathname: string): boolean;
65
68
  export declare function resolveCloudProxyBaseUrl(env?: NodeJS.ProcessEnv): string;
@@ -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';
@@ -261,7 +264,11 @@ export function shouldProxyCloudPath(pathname) {
261
264
  || pathname.startsWith('/api/taskforce/admin/')
262
265
  || pathname.startsWith('/api/taskforce/billing/')
263
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'
264
270
  || pathname === '/api/taskforce/agents/model-gateway/test'
271
+ || /^\/api\/taskforce\/agents\/[^/]+\/connection-binding$/i.test(pathname)
265
272
  || isCloudOwnedUserAvatarContextPath(pathname)
266
273
  || isTaskforceAgentAvatarGenerationPath(pathname)
267
274
  || pathname.startsWith('/api/taskforce/settings/mcp/')
@@ -282,6 +289,8 @@ export function shouldProxyCloudRequest(url, env = process.env) {
282
289
  if (isWorkspaceAiProfileAvatarContextPath(url.pathname))
283
290
  return true;
284
291
  if (/^\/api\/taskforce\/workflow-executions\/[^/]+\/complete-step$/.test(url.pathname)) {
292
+ if (areWorkflowRuntimeMutationsFenced(env))
293
+ return false;
285
294
  return !resolveWorkflowRuntimeMutationCapability({
286
295
  runtimeMode: 'local',
287
296
  surface: 'http',
@@ -410,6 +419,26 @@ export function shouldRewriteProxySetCookieDomain(cookie, hostHeader) {
410
419
  return false;
411
420
  return !requestHost.endsWith(`.${cookieDomain}`);
412
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
+ }
413
442
  export function shouldForwardCloudProxyResponseHeader(name) {
414
443
  const normalizedName = String(name || '').trim().toLowerCase();
415
444
  if (!normalizedName)
@@ -612,7 +641,7 @@ export function createStandaloneServer(options) {
612
641
  }
613
642
  let localServiceServer = null;
614
643
  const localServiceSessions = options.localService
615
- ? new LocalServiceSessionManager(options.localService.generation)
644
+ ? new LocalServiceSessionManager(options.localService.generation, core.getDatabaseAdapter(), core.getTenantId(), options.localService.runtimeContract)
616
645
  : null;
617
646
  const routes = createRoutes(core, {
618
647
  authConfig,
@@ -835,6 +864,9 @@ export function createStandaloneServer(options) {
835
864
  const adminAuditRetentionEnabled = runtimeMode === 'cloud'
836
865
  && process.env.TASKFORCE_ADMIN_AUDIT_RETENTION_ENABLED !== 'false';
837
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);
838
870
  const server = http.createServer(async (req, res) => {
839
871
  const requestStartedAt = getRequestTimingNow();
840
872
  if (!distUiPath) {
@@ -887,6 +919,7 @@ export function createStandaloneServer(options) {
887
919
  }
888
920
  try {
889
921
  const method = String(req.method || 'GET').toUpperCase();
922
+ const adminProxyEnvironment = parseTaskforceCloudEnvironment(req.headers[TASKFORCE_PROXY_CLOUD_ENVIRONMENT_HEADER]);
890
923
  const upstreamBaseUrl = resolveCloudProxyUpstreamBaseUrl(req, cloudProxyBaseUrl);
891
924
  const upstreamUrl = `${upstreamBaseUrl}${url.pathname}${url.search || ''}`;
892
925
  const headers = new Headers();
@@ -904,6 +937,9 @@ export function createStandaloneServer(options) {
904
937
  continue;
905
938
  headers.set(key, serialized);
906
939
  }
940
+ if (adminProxyEnvironment) {
941
+ applyAdminProxyRequestSession(headers, adminProxyEnvironment);
942
+ }
907
943
  applyCloudProxyForwardedHeaders(headers, req);
908
944
  if (cloudProxyClientId && cloudProxyClientSecret) {
909
945
  headers.set('CF-Access-Client-Id', cloudProxyClientId);
@@ -925,17 +961,22 @@ export function createStandaloneServer(options) {
925
961
  continue;
926
962
  outgoingHeaders[key] = value;
927
963
  }
964
+ if (adminProxyEnvironment) {
965
+ outgoingHeaders['cache-control'] = 'no-store';
966
+ }
928
967
  const setCookies = upstream.headers.getSetCookie?.();
929
968
  if (Array.isArray(setCookies) && setCookies.length > 0) {
930
969
  const requestHost = String(req.headers.host || '').trim();
931
- const normalizedSetCookies = setCookies.map((cookie) => {
932
- if (shouldRewriteSetCookieForLocalDevHost(requestHost)) {
933
- return rewriteProxySetCookieForLocalHost(cookie);
934
- }
935
- return shouldRewriteProxySetCookieDomain(cookie, requestHost)
936
- ? rewriteProxySetCookieForLocalHost(cookie)
937
- : cookie;
938
- });
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
+ });
939
980
  res.setHeader('Set-Cookie', normalizedSetCookies);
940
981
  }
941
982
  res.writeHead(upstream.status, outgoingHeaders);
@@ -1180,6 +1221,8 @@ export function createStandaloneServer(options) {
1180
1221
  let purgeTimer = null;
1181
1222
  let integrityScheduleTimer = null;
1182
1223
  let adminAuditRetentionTimer = null;
1224
+ let repairSnapshotRetentionTimer = null;
1225
+ let operationRetentionTimer = null;
1183
1226
  let watcher = null;
1184
1227
  let shutdownPromise = null;
1185
1228
  Object.defineProperty(server, 'localSyncCoordinatorHost', {
@@ -1204,6 +1247,14 @@ export function createStandaloneServer(options) {
1204
1247
  clearInterval(adminAuditRetentionTimer);
1205
1248
  adminAuditRetentionTimer = null;
1206
1249
  }
1250
+ if (repairSnapshotRetentionTimer) {
1251
+ clearInterval(repairSnapshotRetentionTimer);
1252
+ repairSnapshotRetentionTimer = null;
1253
+ }
1254
+ if (operationRetentionTimer) {
1255
+ clearInterval(operationRetentionTimer);
1256
+ operationRetentionTimer = null;
1257
+ }
1207
1258
  if (localSyncPermitRecoveryTimer) {
1208
1259
  clearInterval(localSyncPermitRecoveryTimer);
1209
1260
  localSyncPermitRecoveryTimer = null;
@@ -1257,6 +1308,52 @@ export function createStandaloneServer(options) {
1257
1308
  adminAuditRetentionTimer = setInterval(runAdminAuditRetention, adminAuditRetentionIntervalMinutes * 60_000);
1258
1309
  adminAuditRetentionTimer.unref?.();
1259
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?.();
1260
1357
  const appendDocumentPurgeHistory = (summary) => {
1261
1358
  const settings = core.getGlobalSettings();
1262
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);
@@ -21,7 +21,8 @@ function defaultRuntimeDirectory(platform) {
21
21
  const userKey = typeof process.getuid === 'function'
22
22
  ? String(process.getuid())
23
23
  : createHash('sha256').update(os.userInfo().username).digest('hex').slice(0, 16);
24
- 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');
25
26
  }
26
27
  export function resolveLocalServiceLeaseIdentity(input) {
27
28
  const ownershipKey = resolveLocalSyncProcessLockIdentity(input).ownershipKey;
@@ -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;