@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
@@ -21,6 +21,7 @@
21
21
  * GET /api/taskforce/admin/collaboration-telemetry
22
22
  * PATCH /api/taskforce/admin/system-users/:id/disable
23
23
  * PATCH /api/taskforce/admin/system-users/:id/beta-access
24
+ * PATCH /api/taskforce/admin/system-users/:id/feature-grants/:featureKey
24
25
  * PATCH /api/taskforce/admin/system-users/:id/verify-email
25
26
  * GET/POST /api/taskforce/admin/email-settings
26
27
  * GET /api/taskforce/admin/email-settings/health
@@ -48,14 +49,17 @@
48
49
  * GET/POST /oauth/mcp/authorize
49
50
  * POST /oauth/mcp/token
50
51
  * GET/POST /api/taskforce/settings/mcp/tokens (+ revoke, regenerate)
52
+ * PATCH /api/taskforce/settings/mcp/tokens/:id/tool-profile
51
53
  * GET /api/taskforce/settings/mcp/connectors
52
54
  * POST /api/taskforce/settings/mcp/connectors/:id/disconnect
55
+ * PATCH /api/taskforce/settings/mcp/connectors/:id/tool-profile
53
56
  * POST /api/taskforce/settings/mcp/test-connection
54
57
  */
55
58
  import * as fs from 'fs';
56
59
  import * as path from 'path';
57
60
  import { TaskforceRuleError } from '../../core/Taskforce.js';
58
61
  import { classifyMcpOAuthClientProduct } from '../../mcp/clientRegistry.js';
62
+ import { getCloudMcpToolProfileMembership } from '../../mcp/toolProfiles.js';
59
63
  import { escapeHtml, formatApiErrorResponse, parseFormBody, parseJsonBody } from './primitives.js';
60
64
  import { resolveRequestAccess } from '../auth.js';
61
65
  import { sendEmail } from '../email.js';
@@ -70,19 +74,27 @@ import { randomUUID } from 'crypto';
70
74
  import { resolveDeploymentConfig } from '../../config/deployment.js';
71
75
  import { getTaskforceCloudEnvironmentConfig, resolveTaskforceCloudEnvironmentFromBaseUrl, resolveTaskforceMcpBaseUrlFromBaseUrl } from '../../config/cloudEnvironment.js';
72
76
  import { makeHandleCloudMcpRequest, resolveErrorStatusCode } from './shared.js';
77
+ import * as mcpRuntime from '../../mcp/runtime.js';
73
78
  import { buildAuthBehavior, buildSiteBehavior, getRouteEmailConfig, resolvePublicAuthBaseUrl, resolveRuntimeConfigBaseUrl, } from './authSupport.js';
74
79
  import { applyWorkspaceRepair, scanWorkspaceRepair } from '../../sync/workspaceRepair.js';
75
80
  import { testMintAppleClientSecret } from '../auth/providers/appleClientSecret.js';
76
81
  import { isAiProfileAvatarStorageKey } from '../../utils/aiProfileAvatarPaths.js';
82
+ import { WorkspaceSyncContentPullObligationStore } from '../../sync/engine/workspaceSyncContentPullObligationStore.js';
83
+ import { isSupportedInternalUserFeatureKey } from '../../shared/userFeatureGrants.js';
77
84
  const PRICING_PAGE_DESCRIPTION_MAX_LENGTH = 2000;
78
85
  const OPENAI_APPS_CHALLENGE_TOKEN = 'o9iBeJDuKPMtnKm5-B8OROga3bWDkJS6PBIg6JT9Izs';
79
86
  // === SECTION: Registration ===
80
87
  export function registerAdminRoutes(deps) {
81
- const { addRoute, core, context, requestWorkspaceId, requestUserId, requestRole, ensureAppAccess, ensureAdminRole, ensureCloudPlanData, requireCloudRuntime, resolveAuthenticatedUserId, resolveAdminRequestActor, auditAdminAction, resolveEffectiveObjectStorageConfig, getObjectStorageClient, taskAssetStore, publishedContentResolver, normalizeDocumentPathInput, ensureWithinDir, getAssetMetadata, markAssetDeleted, clearAssetDeleted, removeAssetMetadata, getStorageTelemetry, appendStorageTelemetry, getStorageIntegrityHistory, appendStorageIntegrityHistory, getDocumentPurgeHistory, appendDocumentPurgeHistory, getCollaborationTelemetry, isCollaborationPolicyEnabled, normalizeMcpOauthScopeString, MCP_TOKEN_SCOPE_VALUES, MCP_WRITE_RATE_LIMIT_ENABLED, MCP_WRITE_RATE_LIMIT_ACTOR_MAX_REQUESTS, MCP_WRITE_RATE_LIMIT_WORKSPACE_MAX_REQUESTS, MCP_WRITE_RATE_LIMIT_WINDOW_MS, } = deps;
88
+ const { addRoute, core, context, requestWorkspaceId, requestUserId, requestRole, ensureAppAccess, ensureAdminRole, ensureWorkspaceAdminRole, ensureCloudPlanData, requireCloudRuntime, resolveAuthenticatedUserId, resolveAdminRequestActor, auditAdminAction, resolveEffectiveObjectStorageConfig, getObjectStorageClient, taskAssetStore, publishedContentResolver, normalizeDocumentPathInput, ensureWithinDir, getAssetMetadata, markAssetDeleted, clearAssetDeleted, removeAssetMetadata, getStorageTelemetry, appendStorageTelemetry, getStorageIntegrityHistory, appendStorageIntegrityHistory, getDocumentPurgeHistory, appendDocumentPurgeHistory, getCollaborationTelemetry, isCollaborationPolicyEnabled, normalizeMcpOauthScopeString, MCP_TOKEN_SCOPE_VALUES, MCP_WRITE_RATE_LIMIT_ENABLED, MCP_WRITE_RATE_LIMIT_ACTOR_MAX_REQUESTS, MCP_WRITE_RATE_LIMIT_WORKSPACE_MAX_REQUESTS, MCP_WRITE_RATE_LIMIT_WINDOW_MS, } = deps;
82
89
  const baseVirusScanConfig = resolveVirusScanConfigFromEnv(process.env);
83
90
  const workspaceAssetStore = typeof core.getDatabaseAdapter === 'function' && typeof core.getTenantId === 'function'
84
91
  ? new WorkspaceAssetStore(core.getDatabaseAdapter(), core.getTenantId())
85
92
  : null;
93
+ const mcpToolProfileOptions = ['default', 'extended'].map((id) => ({
94
+ id,
95
+ label: id === 'extended' ? 'All cloud tools' : 'Standard',
96
+ toolCount: getCloudMcpToolProfileMembership(id).length,
97
+ }));
86
98
  const listReferencedAiProfileAvatarStorageKeys = (workspaceId) => {
87
99
  const referenced = new Set();
88
100
  const profiles = typeof core.listAiProfiles === 'function'
@@ -334,6 +346,8 @@ export function registerAdminRoutes(deps) {
334
346
  const handleCloudMcpRequest = makeHandleCloudMcpRequest(core, {
335
347
  ensureAppAccess,
336
348
  resolveAuthenticatedUserId,
349
+ // Keep the production factory unchanged while preserving the route-test injection seam.
350
+ createMcpServer: (options) => mcpRuntime.createTaskforceMcpServer(options),
337
351
  writeRateLimit: {
338
352
  enabled: MCP_WRITE_RATE_LIMIT_ENABLED,
339
353
  actorMaxRequests: MCP_WRITE_RATE_LIMIT_ACTOR_MAX_REQUESTS,
@@ -1039,6 +1053,42 @@ export function registerAdminRoutes(deps) {
1039
1053
  res.writeHead(200, { 'Content-Type': 'application/json' });
1040
1054
  res.end(JSON.stringify({ success: true }));
1041
1055
  });
1056
+ // PATCH /api/taskforce/admin/system-users/:id/feature-grants/:featureKey - Grant/revoke an internal user feature
1057
+ addRoute('PATCH', '/api/taskforce/admin/system-users/:id/feature-grants/:featureKey', async (req, res, params) => {
1058
+ if (!ensureAdminRole(req)) {
1059
+ res.writeHead(403, { 'Content-Type': 'application/json' });
1060
+ res.end(JSON.stringify({ error: 'Forbidden: system admin role required.' }));
1061
+ return;
1062
+ }
1063
+ if (!requireCloudRuntime(res, 'Internal user feature grants'))
1064
+ return;
1065
+ const featureKey = String(params.featureKey || '').trim();
1066
+ if (!isSupportedInternalUserFeatureKey(featureKey)) {
1067
+ res.writeHead(400, { 'Content-Type': 'application/json' });
1068
+ res.end(JSON.stringify({ error: 'Unsupported internal feature key.' }));
1069
+ return;
1070
+ }
1071
+ const body = await parseJsonBody(req);
1072
+ if (typeof body?.enabled !== 'boolean') {
1073
+ res.writeHead(400, { 'Content-Type': 'application/json' });
1074
+ res.end(JSON.stringify({ error: 'enabled must be a boolean.' }));
1075
+ return;
1076
+ }
1077
+ const actor = resolveAdminRequestActor(req);
1078
+ const success = core.setUserFeatureGrant(params.id, featureKey, body.enabled, actor.userId);
1079
+ if (!success) {
1080
+ res.writeHead(404, { 'Content-Type': 'application/json' });
1081
+ res.end(JSON.stringify({ error: 'User not found' }));
1082
+ return;
1083
+ }
1084
+ auditAdminAction(req, 'set-user-feature-grant', {
1085
+ targetUserId: params.id,
1086
+ featureKey,
1087
+ enabled: body.enabled,
1088
+ });
1089
+ res.writeHead(200, { 'Content-Type': 'application/json' });
1090
+ res.end(JSON.stringify({ success: true, featureKey, enabled: body.enabled }));
1091
+ });
1042
1092
  // PATCH /api/taskforce/admin/system-users/:id/verify-email - Mark a user's email as verified
1043
1093
  addRoute('PATCH', '/api/taskforce/admin/system-users/:id/verify-email', async (req, res, params) => {
1044
1094
  if (!ensureAdminRole(req)) {
@@ -1954,6 +2004,7 @@ export function registerAdminRoutes(deps) {
1954
2004
  publishedContentResolver,
1955
2005
  repairMissingAssetLinks: true,
1956
2006
  repairMissingContentFiles: body?.repairMissingContentFiles === true,
2007
+ contentPullObligationStore: new WorkspaceSyncContentPullObligationStore(core.getDatabaseAdapter()),
1957
2008
  aiProfiles: typeof core.listAiProfiles === 'function'
1958
2009
  ? core.listAiProfiles(workspaceId, { includeArchived: true }) || []
1959
2010
  : [],
@@ -2381,7 +2432,7 @@ export function registerAdminRoutes(deps) {
2381
2432
  addRoute('OPTIONS', '/mcp', async (_req, res) => {
2382
2433
  res.writeHead(204, {
2383
2434
  'Access-Control-Allow-Origin': '*',
2384
- 'Access-Control-Allow-Headers': 'authorization, content-type, accept, last-event-id, mcp-protocol-version, mcp-session-id, x-taskforce-workspace-id, x-taskforce-mcp-client-id, x-taskforce-ai-profile-token, x-taskforce-ai-name, x-taskforce-ai-icon, x-taskforce-ai-color, x-taskforce-ai-description, x-taskforce-ai-role, x-taskforce-ai-provider, x-taskforce-ai-model, x-taskforce-ai-surface-type',
2435
+ 'Access-Control-Allow-Headers': 'authorization, content-type, accept, mcp-protocol-version, mcp-method, mcp-name, x-taskforce-workspace-id, x-taskforce-mcp-client-id, x-taskforce-ai-profile-token, x-taskforce-ai-name, x-taskforce-ai-icon, x-taskforce-ai-color, x-taskforce-ai-description, x-taskforce-ai-role, x-taskforce-ai-provider, x-taskforce-ai-model, x-taskforce-ai-surface-type',
2385
2436
  'Access-Control-Allow-Methods': 'GET, HEAD, POST, DELETE, OPTIONS'
2386
2437
  });
2387
2438
  res.end();
@@ -2389,7 +2440,7 @@ export function registerAdminRoutes(deps) {
2389
2440
  addRoute('OPTIONS', '/mcp/', async (_req, res) => {
2390
2441
  res.writeHead(204, {
2391
2442
  'Access-Control-Allow-Origin': '*',
2392
- 'Access-Control-Allow-Headers': 'authorization, content-type, accept, last-event-id, mcp-protocol-version, mcp-session-id, x-taskforce-workspace-id, x-taskforce-mcp-client-id, x-taskforce-ai-profile-token, x-taskforce-ai-name, x-taskforce-ai-icon, x-taskforce-ai-color, x-taskforce-ai-description, x-taskforce-ai-role, x-taskforce-ai-provider, x-taskforce-ai-model, x-taskforce-ai-surface-type',
2443
+ 'Access-Control-Allow-Headers': 'authorization, content-type, accept, mcp-protocol-version, mcp-method, mcp-name, x-taskforce-workspace-id, x-taskforce-mcp-client-id, x-taskforce-ai-profile-token, x-taskforce-ai-name, x-taskforce-ai-icon, x-taskforce-ai-color, x-taskforce-ai-description, x-taskforce-ai-role, x-taskforce-ai-provider, x-taskforce-ai-model, x-taskforce-ai-surface-type',
2393
2444
  'Access-Control-Allow-Methods': 'GET, HEAD, POST, DELETE, OPTIONS'
2394
2445
  });
2395
2446
  res.end();
@@ -2423,6 +2474,7 @@ export function registerAdminRoutes(deps) {
2423
2474
  token_endpoint_auth_methods_supported: ['none'],
2424
2475
  code_challenge_methods_supported: ['S256'],
2425
2476
  scopes_supported: ['tasks:read', 'tasks:write', 'workspace:read'],
2477
+ authorization_response_iss_parameter_supported: true,
2426
2478
  }));
2427
2479
  });
2428
2480
  addRoute('HEAD', '/.well-known/oauth-authorization-server', async (req, res) => {
@@ -2438,6 +2490,7 @@ export function registerAdminRoutes(deps) {
2438
2490
  token_endpoint_auth_methods_supported: ['none'],
2439
2491
  code_challenge_methods_supported: ['S256'],
2440
2492
  scopes_supported: ['tasks:read', 'tasks:write', 'workspace:read'],
2493
+ authorization_response_iss_parameter_supported: true,
2441
2494
  }));
2442
2495
  });
2443
2496
  addRoute('GET', '/.well-known/oauth-protected-resource', async (req, res) => {
@@ -2465,6 +2518,12 @@ export function registerAdminRoutes(deps) {
2465
2518
  return;
2466
2519
  const body = await parseJsonBody(req);
2467
2520
  try {
2521
+ const applicationType = (() => {
2522
+ const value = String(body?.application_type || 'web').trim().toLowerCase();
2523
+ if (value === 'native' || value === 'web')
2524
+ return value;
2525
+ throw new TaskforceRuleError('application_type must be native or web', 400, 'MCP_OAUTH_APPLICATION_TYPE_INVALID');
2526
+ })();
2468
2527
  const provider = (() => {
2469
2528
  const explicit = String(body?.provider || '').trim().toLowerCase();
2470
2529
  if (explicit === 'chatgpt' || explicit === 'claude' || explicit === 'grok' || explicit === 'gemini' || explicit === 'mistral' || explicit === 'perplexity')
@@ -2494,6 +2553,7 @@ export function registerAdminRoutes(deps) {
2494
2553
  provider,
2495
2554
  clientName: body?.client_name,
2496
2555
  redirectUris: body?.redirect_uris,
2556
+ applicationType,
2497
2557
  productClientId: classifyMcpOAuthClientProduct({
2498
2558
  provider,
2499
2559
  clientName: body?.client_name,
@@ -2508,6 +2568,7 @@ export function registerAdminRoutes(deps) {
2508
2568
  grant_types: ['authorization_code'],
2509
2569
  response_types: ['code'],
2510
2570
  token_endpoint_auth_method: 'none',
2571
+ application_type: client.applicationType,
2511
2572
  scope: 'tasks:read tasks:write workspace:read',
2512
2573
  }));
2513
2574
  }
@@ -2664,6 +2725,7 @@ export function registerAdminRoutes(deps) {
2664
2725
  denyTarget.searchParams.set('error', 'access_denied');
2665
2726
  if (state)
2666
2727
  denyTarget.searchParams.set('state', state);
2728
+ denyTarget.searchParams.set('iss', resolveMcpOauthIssuer(req));
2667
2729
  res.writeHead(302, { Location: denyTarget.toString() });
2668
2730
  res.end();
2669
2731
  return;
@@ -2694,6 +2756,7 @@ export function registerAdminRoutes(deps) {
2694
2756
  approveTarget.searchParams.set('code', issued.code);
2695
2757
  if (state)
2696
2758
  approveTarget.searchParams.set('state', state);
2759
+ approveTarget.searchParams.set('iss', resolveMcpOauthIssuer(req));
2697
2760
  res.writeHead(302, { Location: approveTarget.toString() });
2698
2761
  res.end();
2699
2762
  }
@@ -2751,7 +2814,7 @@ export function registerAdminRoutes(deps) {
2751
2814
  try {
2752
2815
  const result = core.listMcpAccessTokens({ userId, workspaceId: requestWorkspaceId(req), page, pageSize });
2753
2816
  res.writeHead(200, { 'Content-Type': 'application/json' });
2754
- res.end(JSON.stringify({ success: true, ...result }));
2817
+ res.end(JSON.stringify({ success: true, ...result, profileOptions: mcpToolProfileOptions }));
2755
2818
  }
2756
2819
  catch (error) {
2757
2820
  const statusCode = resolveErrorStatusCode(error);
@@ -2773,7 +2836,7 @@ export function registerAdminRoutes(deps) {
2773
2836
  try {
2774
2837
  const items = core.listMcpOAuthConnectorGrants({ userId, workspaceId: requestWorkspaceId(req), provider: provider || null });
2775
2838
  res.writeHead(200, { 'Content-Type': 'application/json' });
2776
- res.end(JSON.stringify({ success: true, items }));
2839
+ res.end(JSON.stringify({ success: true, items, profileOptions: mcpToolProfileOptions }));
2777
2840
  }
2778
2841
  catch (error) {
2779
2842
  const statusCode = resolveErrorStatusCode(error);
@@ -2803,6 +2866,34 @@ export function registerAdminRoutes(deps) {
2803
2866
  res.end(JSON.stringify({ success: false, error: error.message, code: error?.code || 'MCP_CONNECTOR_DISCONNECT_FAILED' }));
2804
2867
  }
2805
2868
  });
2869
+ addRoute('PATCH', '/api/taskforce/settings/mcp/connectors/:id/tool-profile', async (req, res, params) => {
2870
+ if (!ensureAppAccess(req, res))
2871
+ return;
2872
+ const userId = resolveAuthenticatedUserId(req);
2873
+ if (!userId || userId === 'anonymous') {
2874
+ res.writeHead(401, { 'Content-Type': 'application/json' });
2875
+ res.end(JSON.stringify({ success: false, error: 'Authentication required.' }));
2876
+ return;
2877
+ }
2878
+ const wid = requestWorkspaceId(req);
2879
+ if (!ensureWorkspaceAdminRole(req, wid)) {
2880
+ res.writeHead(403, { 'Content-Type': 'application/json' });
2881
+ res.end(JSON.stringify({ success: false, error: 'Workspace owner or admin access is required.', code: 'MCP_TOOL_PROFILE_ADMIN_REQUIRED' }));
2882
+ return;
2883
+ }
2884
+ const body = await parseJsonBody(req);
2885
+ try {
2886
+ const updated = core.updateMcpOAuthConnectorGrantToolProfile({ actorUserId: userId, workspaceId: wid, grantId: params.id, toolProfile: body?.toolProfile });
2887
+ core.addAdminAuditLog({ action: 'mcp.connector.tool_profile.update', actorUserId: userId, actorRole: requestRole(req), workspaceId: wid, details: { grantId: updated.record.id, provider: updated.record.provider, clientId: updated.record.clientId, previousToolProfile: updated.previousToolProfile, toolProfile: updated.record.toolProfile } });
2888
+ res.writeHead(200, { 'Content-Type': 'application/json' });
2889
+ res.end(JSON.stringify({ success: true, record: updated.record }));
2890
+ }
2891
+ catch (error) {
2892
+ const statusCode = resolveErrorStatusCode(error);
2893
+ res.writeHead(statusCode, { 'Content-Type': 'application/json' });
2894
+ res.end(JSON.stringify({ success: false, error: error.message, code: error?.code || 'MCP_CONNECTOR_TOOL_PROFILE_UPDATE_FAILED' }));
2895
+ }
2896
+ });
2806
2897
  addRoute('POST', '/api/taskforce/settings/mcp/tokens', async (req, res) => {
2807
2898
  if (!ensureAppAccess(req, res))
2808
2899
  return;
@@ -2884,6 +2975,34 @@ export function registerAdminRoutes(deps) {
2884
2975
  res.end(JSON.stringify({ success: false, error: error.message, code: error?.code || 'MCP_TOKEN_REGENERATE_FAILED' }));
2885
2976
  }
2886
2977
  });
2978
+ addRoute('PATCH', '/api/taskforce/settings/mcp/tokens/:id/tool-profile', async (req, res, params) => {
2979
+ if (!ensureAppAccess(req, res))
2980
+ return;
2981
+ const userId = resolveAuthenticatedUserId(req);
2982
+ if (!userId || userId === 'anonymous') {
2983
+ res.writeHead(401, { 'Content-Type': 'application/json' });
2984
+ res.end(JSON.stringify({ success: false, error: 'Authentication required.' }));
2985
+ return;
2986
+ }
2987
+ const wid = requestWorkspaceId(req);
2988
+ if (!ensureWorkspaceAdminRole(req, wid)) {
2989
+ res.writeHead(403, { 'Content-Type': 'application/json' });
2990
+ res.end(JSON.stringify({ success: false, error: 'Workspace owner or admin access is required.', code: 'MCP_TOOL_PROFILE_ADMIN_REQUIRED' }));
2991
+ return;
2992
+ }
2993
+ const body = await parseJsonBody(req);
2994
+ try {
2995
+ const updated = core.updateMcpAccessTokenToolProfile({ actorUserId: userId, workspaceId: wid, tokenId: params.id, toolProfile: body?.toolProfile });
2996
+ core.addAdminAuditLog({ action: 'mcp.token.tool_profile.update', actorUserId: userId, actorRole: requestRole(req), workspaceId: wid, details: { tokenId: updated.record.id, previousToolProfile: updated.previousToolProfile, toolProfile: updated.record.toolProfile } });
2997
+ res.writeHead(200, { 'Content-Type': 'application/json' });
2998
+ res.end(JSON.stringify({ success: true, record: updated.record }));
2999
+ }
3000
+ catch (error) {
3001
+ const statusCode = resolveErrorStatusCode(error);
3002
+ res.writeHead(statusCode, { 'Content-Type': 'application/json' });
3003
+ res.end(JSON.stringify({ success: false, error: error.message, code: error?.code || 'MCP_TOKEN_TOOL_PROFILE_UPDATE_FAILED' }));
3004
+ }
3005
+ });
2887
3006
  addRoute('POST', '/api/taskforce/settings/mcp/test-connection', async (req, res) => {
2888
3007
  if (!ensureAppAccess(req, res))
2889
3008
  return;
@@ -2949,6 +3068,8 @@ export function registerAdminRoutes(deps) {
2949
3068
  workspaceId: wid,
2950
3069
  workspaceName: String(workspace?.name || wid),
2951
3070
  scopes: inspection.scopes,
3071
+ toolProfile: inspection.toolProfile,
3072
+ toolCount: getCloudMcpToolProfileMembership(inspection.toolProfile, inspection.scopes).length,
2952
3073
  requiredScopes,
2953
3074
  endpoint: probe.endpoint,
2954
3075
  serverName: probe.serverName,
@@ -6,6 +6,9 @@
6
6
  * POST /api/taskforce/agents
7
7
  * PATCH /api/taskforce/agents/:agentId
8
8
  * DELETE /api/taskforce/agents/:agentId
9
+ * GET /api/taskforce/agents/:agentId/connection-binding
10
+ * PUT /api/taskforce/agents/:agentId/connection-binding
11
+ * DELETE /api/taskforce/agents/:agentId/connection-binding
9
12
  * GET /api/taskforce/agents/:agentId/conversations
10
13
  * POST /api/taskforce/agents/:agentId/conversation/new
11
14
  * POST /api/taskforce/agents/model-gateway/test
@@ -13,6 +16,7 @@
13
16
  */
14
17
  import type { IncomingMessage, ServerResponse } from 'http';
15
18
  import type { TaskforceCore } from '../../core/Taskforce.js';
19
+ import { ModelProviderConnectionService } from '../../services/modelProviderConnectionService.js';
16
20
  import { saveAiProfileAvatarAssets, type AiProfileAvatarAssetDeps } from '../aiProfileAvatarAssets.js';
17
21
  import type { ModelGateway, ModelGatewaySelection } from '../../services/modelGateway.js';
18
22
  import { type TaskforceAgentAvatarImageProvider } from '../../services/taskforceAgentAvatarImageProvider.js';
@@ -20,6 +24,7 @@ import { type PreparedTaskforceAgentMcpBridge, type PrepareTaskforceAgentMcpBrid
20
24
  import { TaskforceAgentConversationStore } from '../../storage/taskforceAgentConversationStore.js';
21
25
  import { TaskforceAgentStore } from '../../storage/taskforceAgentStore.js';
22
26
  import { TaskforceAgentSkillStore } from '../../storage/taskforceAgentSkillStore.js';
27
+ import { TaskforceAgentConnectionBindingService } from '../../services/taskforceAgentConnectionBindingService.js';
23
28
  import { type TaskforceAgentRuntimeReferenceResolvers } from '../../shared/taskforceAgentRuntimeResolution.js';
24
29
  import { type RouteHandler } from './primitives.js';
25
30
  type SaveAiProfileAvatarAssets = typeof saveAiProfileAvatarAssets;
@@ -35,6 +40,8 @@ export interface AgentsRouteDependencies {
35
40
  agentStore?: TaskforceAgentStore;
36
41
  skillStore?: TaskforceAgentSkillStore;
37
42
  conversationStore?: TaskforceAgentConversationStore;
43
+ connectionBindingService?: Pick<TaskforceAgentConnectionBindingService, 'inspect' | 'bind' | 'clear' | 'resolveSaved' | 'resolveDraft'>;
44
+ modelConnectionService?: Pick<ModelProviderConnectionService, 'assertReady' | 'withConnectionLease'>;
38
45
  createModelGateway?: (selection?: ModelGatewaySelection) => ModelGateway;
39
46
  prepareMcpBridge?: (input: PrepareTaskforceAgentMcpBridgeInput) => Promise<PreparedTaskforceAgentMcpBridge | null>;
40
47
  agentRuntimeReferenceResolvers?: TaskforceAgentRuntimeReferenceResolvers;