@taskforcehq/taskforce 0.3.329 → 0.3.330

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (321) hide show
  1. package/dist/Taskforce.module.css +290 -45
  2. package/dist/components/features/AiProfilesModule.js +3 -5
  3. package/dist/components/features/TaskSettings.js +70 -14
  4. package/dist/components/features/TaskforceAgentsModule.d.ts +1 -2
  5. package/dist/components/features/TaskforceAgentsModule.js +586 -116
  6. package/dist/components/features/agentConnections/AgentConnectionControl.d.ts +15 -0
  7. package/dist/components/features/agentConnections/AgentConnectionControl.js +125 -0
  8. package/dist/components/features/agentConnections/ModelConnectionsPanel.d.ts +18 -0
  9. package/dist/components/features/agentConnections/ModelConnectionsPanel.js +393 -0
  10. package/dist/components/features/agentConnections/modelConnectionsApi.d.ts +65 -0
  11. package/dist/components/features/agentConnections/modelConnectionsApi.js +129 -0
  12. package/dist/components/features/taskforceAgentAssignments/AgentBehaviorAssignments.js +15 -24
  13. package/dist/components/features/taskforceAgentEditorModel.d.ts +2 -1
  14. package/dist/components/features/taskforceAgentEditorModel.js +3 -1
  15. package/dist/components/features/workflowManager/workflowManagerApi.d.ts +1 -1
  16. package/dist/components/features/workflowManager/workflowManagerApi.js +3 -0
  17. package/dist/components/task/TaskWorkflowAssignmentField.js +68 -10
  18. package/dist/components/views/StandaloneLayout.js +27 -26
  19. package/dist/components/views/standalone/modals/SyncStatusModal.d.ts +4 -3
  20. package/dist/components/views/standalone/modals/SyncStatusModal.js +33 -38
  21. package/dist/config/envSchema.js +48 -1
  22. package/dist/core/McpTokenService.d.ts +23 -1
  23. package/dist/core/McpTokenService.js +93 -10
  24. package/dist/core/TaskChecklistCommandService.d.ts +27 -0
  25. package/dist/core/TaskChecklistCommandService.js +83 -5
  26. package/dist/core/TaskLifecycleCommandService.d.ts +3 -1
  27. package/dist/core/TaskLifecycleCommandService.js +6 -2
  28. package/dist/core/Taskforce.d.ts +32 -0
  29. package/dist/core/Taskforce.js +125 -4
  30. package/dist/core/types.d.ts +8 -0
  31. package/dist/documentReviews/commandService.d.ts +2 -1
  32. package/dist/documentReviews/commandService.js +6 -3
  33. package/dist/hooks/sync/orchestratorShared.d.ts +1 -0
  34. package/dist/hooks/sync/orchestratorShared.js +2 -0
  35. package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.d.ts +3 -0
  36. package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.js +85 -9
  37. package/dist/hooks/sync/useSyncStatusControls.d.ts +4 -1
  38. package/dist/hooks/sync/useSyncStatusControls.js +47 -11
  39. package/dist/hooks/useSyncOrchestrator.d.ts +3 -0
  40. package/dist/hooks/useSyncOrchestrator.js +111 -2
  41. package/dist/hooks/useTaskData.d.ts +31 -1
  42. package/dist/hooks/useTaskData.js +29 -7
  43. package/dist/hooks/useTaskMutations.d.ts +3 -1
  44. package/dist/hooks/useTaskMutations.js +46 -12
  45. package/dist/hooks/useTaskforce.d.ts +2 -0
  46. package/dist/hooks/useTaskforce.js +11 -2
  47. package/dist/mcp/clientRegistry.d.ts +2 -2
  48. package/dist/mcp/clientRegistry.js +1 -1
  49. package/dist/mcp/documentAssetRegistrar.js +9 -6
  50. package/dist/mcp/durableTaskMutationRouter.d.ts +4 -1
  51. package/dist/mcp/durableTaskMutationRouter.js +10 -0
  52. package/dist/mcp/durableTaskRelationshipMutationRouter.js +4 -0
  53. package/dist/mcp/httpProtocolRouting.d.ts +10 -0
  54. package/dist/mcp/httpProtocolRouting.js +19 -0
  55. package/dist/mcp/localCliHealth.d.ts +2 -2
  56. package/dist/mcp/localCliHealth.js +2 -2
  57. package/dist/mcp/localServiceProxy.d.ts +1 -0
  58. package/dist/mcp/localServiceProxy.js +530 -68
  59. package/dist/mcp/planningAttachmentCommandAdapter.d.ts +3 -1
  60. package/dist/mcp/planningAttachmentCommandAdapter.js +20 -2
  61. package/dist/mcp/runtime.d.ts +54 -79
  62. package/dist/mcp/runtime.js +384 -97
  63. package/dist/mcp/taskPlanningRegistrar.js +23 -4
  64. package/dist/mcp/toolProfiles.d.ts +2 -0
  65. package/dist/mcp/toolProfiles.js +10 -0
  66. package/dist/mcp/toolRegistry.d.ts +1 -0
  67. package/dist/mcp/toolRegistry.js +1 -0
  68. package/dist/mcp/workflowExecutionRegistrar.js +4 -4
  69. package/dist/migrations/taskSchemaMigrations.d.ts +5 -0
  70. package/dist/migrations/taskSchemaMigrations.js +415 -0
  71. package/dist/runtime/appGates.d.ts +2 -1
  72. package/dist/runtime/appGates.js +7 -0
  73. package/dist/server/index.d.ts +3 -0
  74. package/dist/server/index.js +108 -11
  75. package/dist/server/localDatabaseIdentity.js +4 -1
  76. package/dist/server/localServiceLease.js +2 -1
  77. package/dist/server/localServiceSessions.d.ts +14 -17
  78. package/dist/server/localServiceSessions.js +308 -94
  79. package/dist/server/localWorkspaceSyncServerRuntime.js +12 -14
  80. package/dist/server/routes/admin.d.ts +4 -0
  81. package/dist/server/routes/admin.js +112 -3
  82. package/dist/server/routes/agents.d.ts +7 -0
  83. package/dist/server/routes/agents.js +277 -24
  84. package/dist/server/routes/billing.js +5 -1
  85. package/dist/server/routes/durableTaskHttpRouters.d.ts +2 -0
  86. package/dist/server/routes/executorPhaseAApprovals.d.ts +19 -0
  87. package/dist/server/routes/executorPhaseAApprovals.js +140 -0
  88. package/dist/server/routes/executorPhaseAIssuerRedemptions.d.ts +11 -0
  89. package/dist/server/routes/executorPhaseAIssuerRedemptions.js +24 -0
  90. package/dist/server/routes/githubReviewEvidence.d.ts +19 -0
  91. package/dist/server/routes/githubReviewEvidence.js +116 -0
  92. package/dist/server/routes/localService.d.ts +15 -4
  93. package/dist/server/routes/localService.js +136 -40
  94. package/dist/server/routes/modelConnections.d.ts +24 -0
  95. package/dist/server/routes/modelConnections.js +205 -0
  96. package/dist/server/routes/shared.d.ts +19 -0
  97. package/dist/server/routes/shared.js +95 -19
  98. package/dist/server/routes/sync.js +1 -0
  99. package/dist/server/routes/syncAuxRoutes.js +5 -1
  100. package/dist/server/routes/syncPushRoutes.d.ts +1 -0
  101. package/dist/server/routes/syncPushRoutes.js +1 -0
  102. package/dist/server/routes/syncV3FeedRoutes.js +10 -1
  103. package/dist/server/routes/syncV3OperationRoutes.js +35 -9
  104. package/dist/server/routes/tasks.js +21 -2
  105. package/dist/server/routes/workflows.js +9 -1
  106. package/dist/server/routes.js +59 -0
  107. package/dist/services/codexAppServerModelGateway.d.ts +54 -5
  108. package/dist/services/codexAppServerModelGateway.js +246 -21
  109. package/dist/services/codexDeviceCodeLoginManager.d.ts +39 -0
  110. package/dist/services/codexDeviceCodeLoginManager.js +265 -0
  111. package/dist/services/codexModelProviderConnectionLifecycle.d.ts +8 -0
  112. package/dist/services/codexModelProviderConnectionLifecycle.js +73 -0
  113. package/dist/services/executorPhaseAApprovalRuntime.d.ts +14 -0
  114. package/dist/services/executorPhaseAApprovalRuntime.js +24 -0
  115. package/dist/services/executorPhaseAApprovalService.d.ts +40 -0
  116. package/dist/services/executorPhaseAApprovalService.js +609 -0
  117. package/dist/services/executorPhaseADriftEvaluator.d.ts +78 -0
  118. package/dist/services/executorPhaseADriftEvaluator.js +93 -0
  119. package/dist/services/executorPhaseAIssuerCore.d.ts +126 -0
  120. package/dist/services/executorPhaseAIssuerCore.js +295 -0
  121. package/dist/services/executorPhaseAIssuerRedemptionService.d.ts +34 -0
  122. package/dist/services/executorPhaseAIssuerRedemptionService.js +158 -0
  123. package/dist/services/githubReviewEvidenceRuntime.d.ts +14 -0
  124. package/dist/services/githubReviewEvidenceRuntime.js +30 -0
  125. package/dist/services/githubReviewEvidenceService.d.ts +93 -0
  126. package/dist/services/githubReviewEvidenceService.js +336 -0
  127. package/dist/services/modelGateway.d.ts +7 -0
  128. package/dist/services/modelProviderConnectionService.d.ts +71 -0
  129. package/dist/services/modelProviderConnectionService.js +279 -0
  130. package/dist/services/modelProviderCredentialHome.d.ts +32 -0
  131. package/dist/services/modelProviderCredentialHome.js +271 -0
  132. package/dist/services/ownerScopedModelConnectionGateway.d.ts +12 -0
  133. package/dist/services/ownerScopedModelConnectionGateway.js +30 -0
  134. package/dist/services/taskforceAgentConnectionBindingService.d.ts +66 -0
  135. package/dist/services/taskforceAgentConnectionBindingService.js +185 -0
  136. package/dist/services/taskforceAgentMcpBridge.d.ts +1 -1
  137. package/dist/services/taskforceAgentMcpBridge.js +7 -24
  138. package/dist/shared/adminEdgeProxy.d.ts +5 -0
  139. package/dist/shared/adminEdgeProxy.js +94 -0
  140. package/dist/shared/adminProxySessionCookies.d.ts +16 -0
  141. package/dist/shared/adminProxySessionCookies.js +86 -0
  142. package/dist/shared/aiProfileColors.d.ts +31 -1
  143. package/dist/shared/aiProfileColors.js +14 -6
  144. package/dist/shared/executorPhaseAApprovalGoldenVector.json +269 -0
  145. package/dist/shared/executorPhaseAApprovalReceipt.d.ts +112 -0
  146. package/dist/shared/executorPhaseAApprovalReceipt.js +58 -0
  147. package/dist/shared/executorPhaseAApprovalTrustPolicy.json +10 -0
  148. package/dist/shared/executorPhaseADriftContracts.d.ts +37 -0
  149. package/dist/shared/executorPhaseADriftContracts.js +63 -0
  150. package/dist/shared/executorPhaseAIssuerContracts.d.ts +75 -0
  151. package/dist/shared/executorPhaseAIssuerContracts.js +90 -0
  152. package/dist/shared/executorPhaseARunAuthorization.d.ts +120 -0
  153. package/dist/shared/executorPhaseARunAuthorization.js +232 -0
  154. package/dist/shared/executorPhaseASchemaValidation.d.ts +7 -0
  155. package/dist/shared/executorPhaseASchemaValidation.js +53 -0
  156. package/dist/shared/executorPhaseASchemas/approval-receipt.schema.json +106 -0
  157. package/dist/shared/executorPhaseASchemas/drift-attestation.schema.json +54 -0
  158. package/dist/shared/executorPhaseASchemas/drift-request.schema.json +47 -0
  159. package/dist/shared/executorPhaseASchemas/foundation-manifest.schema.json +29 -0
  160. package/dist/shared/executorPhaseASchemas/issuer-audit-record.schema.json +24 -0
  161. package/dist/shared/executorPhaseASchemas/issuer-proof.schema.json +43 -0
  162. package/dist/shared/executorPhaseASchemas/issuer-redemption-request.schema.json +18 -0
  163. package/dist/shared/executorPhaseASchemas/issuer-redemption-response.schema.json +39 -0
  164. package/dist/shared/executorPhaseASchemas/logical-envelope.schema.json +149 -0
  165. package/dist/shared/executorPhaseASchemas/preflight-report.schema.json +216 -0
  166. package/dist/shared/executorPhaseASchemas/run-capability.schema.json +111 -0
  167. package/dist/shared/executorPhaseASchemas/sender-proof.schema.json +37 -0
  168. package/dist/shared/executorPhaseASchemas/workload-grant.schema.json +68 -0
  169. package/dist/shared/executorPhaseASchemas/workload-jwt-claims.schema.json +67 -0
  170. package/dist/shared/executorPhaseATiming.d.ts +1 -0
  171. package/dist/shared/executorPhaseATiming.js +1 -0
  172. package/dist/shared/planningIdentity.js +1 -1
  173. package/dist/shared/productLogoKeys.d.ts +2 -0
  174. package/dist/shared/productLogoKeys.js +18 -0
  175. package/dist/shared/taskforceAgentDefinition.d.ts +0 -1
  176. package/dist/shared/taskforceAgentDefinition.js +6 -9
  177. package/dist/shared/taskforceAgentModels.js +7 -3
  178. package/dist/shared/userFeatureGrants.d.ts +4 -0
  179. package/dist/shared/userFeatureGrants.js +7 -0
  180. package/dist/storage/executorPhaseAApprovalReceiptStore.d.ts +37 -0
  181. package/dist/storage/executorPhaseAApprovalReceiptStore.js +81 -0
  182. package/dist/storage/executorPhaseARunAuthorizationStore.d.ts +103 -0
  183. package/dist/storage/executorPhaseARunAuthorizationStore.js +492 -0
  184. package/dist/storage/githubReviewEvidenceInstallationStore.d.ts +26 -0
  185. package/dist/storage/githubReviewEvidenceInstallationStore.js +89 -0
  186. package/dist/storage/modelProviderConnectionStore.d.ts +99 -0
  187. package/dist/storage/modelProviderConnectionStore.js +446 -0
  188. package/dist/storage/postgresAdapter.d.ts +4 -0
  189. package/dist/storage/postgresAdapter.js +11 -0
  190. package/dist/storage/postgresWorker.js +9 -1
  191. package/dist/storage/postgresWorkerProtocol.d.ts +1 -0
  192. package/dist/storage/taskforceAgentConnectionBindingStore.d.ts +31 -0
  193. package/dist/storage/taskforceAgentConnectionBindingStore.js +84 -0
  194. package/dist/sync/coordinator/localSyncExecutionPermitStore.js +60 -29
  195. package/dist/sync/coordinator/localWorkspaceSyncPendingV2PushProgress.d.ts +10 -0
  196. package/dist/sync/coordinator/localWorkspaceSyncPendingV2PushProgress.js +29 -0
  197. package/dist/sync/coordinator/localWorkspaceSyncRunnerState.d.ts +15 -1
  198. package/dist/sync/coordinator/localWorkspaceSyncRunnerState.js +99 -2
  199. package/dist/sync/coordinator/workspaceSyncCredentialBroker.d.ts +1 -0
  200. package/dist/sync/coordinator/workspaceSyncCredentialBroker.js +33 -4
  201. package/dist/sync/engine/workspaceSyncContentLifecycleAdapter.d.ts +2 -1
  202. package/dist/sync/engine/workspaceSyncContentVersionStore.d.ts +38 -0
  203. package/dist/sync/engine/workspaceSyncContentVersionStore.js +50 -1
  204. package/dist/sync/engine/workspaceSyncEngineLifecyclePolicy.js +6 -6
  205. package/dist/sync/engine/workspaceSyncEnginePushCompletion.d.ts +14 -0
  206. package/dist/sync/engine/workspaceSyncEnginePushCompletion.js +84 -0
  207. package/dist/sync/engine/workspaceSyncEngineRecovery.js +1 -0
  208. package/dist/sync/engine/workspaceSyncEngineRuntime.d.ts +1 -0
  209. package/dist/sync/engine/workspaceSyncEngineRuntime.js +1 -0
  210. package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.js +112 -38
  211. package/dist/sync/engine/workspaceSyncEngineServerSnapshotReader.js +6 -0
  212. package/dist/sync/engine/workspaceSyncEngineTransfers.js +3 -1
  213. package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.d.ts +1 -0
  214. package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.js +29 -0
  215. package/dist/sync/syncApplyHandlers.d.ts +2 -0
  216. package/dist/sync/syncApplyHandlers.js +10 -1
  217. package/dist/sync/syncService.d.ts +15 -0
  218. package/dist/sync/syncService.js +83 -18
  219. package/dist/sync/taskforceAgentSyncAuthorization.d.ts +16 -0
  220. package/dist/sync/taskforceAgentSyncAuthorization.js +20 -0
  221. package/dist/sync/v3/combinedFeedCapability.js +4 -0
  222. package/dist/sync/v3/durableInitiativeMutationRouter.js +18 -10
  223. package/dist/sync/v3/durableOperationReplay.d.ts +14 -0
  224. package/dist/sync/v3/durableOperationReplay.js +18 -0
  225. package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.js +3 -0
  226. package/dist/sync/v3/durableTaskChecklistMutationRouter.d.ts +2 -1
  227. package/dist/sync/v3/durableTaskChecklistMutationRouter.js +58 -15
  228. package/dist/sync/v3/durableTaskCommentMutationRouter.js +3 -0
  229. package/dist/sync/v3/durableTaskHttpRootMutationRouter.d.ts +1 -1
  230. package/dist/sync/v3/durableTaskHttpRootMutationRouter.js +10 -0
  231. package/dist/sync/v3/durableTaxonomyMutationRouter.js +5 -0
  232. package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.d.ts +11 -0
  233. package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.js +39 -10
  234. package/dist/sync/v3/durableWorkstreamMutationRouter.js +18 -10
  235. package/dist/sync/v3/durableWorkstreamTaskOrderMutationRouter.js +16 -5
  236. package/dist/sync/v3/localOutboxDispatchRuntime.js +2 -2
  237. package/dist/sync/v3/localTaskChecklistOutboxHandler.js +16 -2
  238. package/dist/sync/v3/localTaskChecklistOutboxService.d.ts +4 -0
  239. package/dist/sync/v3/localTaskChecklistOutboxService.js +14 -1
  240. package/dist/sync/v3/localTaskStatusOutboxService.d.ts +8 -0
  241. package/dist/sync/v3/localTaskStatusOutboxService.js +219 -12
  242. package/dist/sync/v3/syncDurabilityStore.d.ts +34 -0
  243. package/dist/sync/v3/syncDurabilityStore.js +168 -2
  244. package/dist/sync/v3/taskChecklistMutationService.d.ts +11 -0
  245. package/dist/sync/v3/taskChecklistMutationService.js +44 -1
  246. package/dist/sync/v3/taskStatusMutationService.d.ts +29 -1
  247. package/dist/sync/v3/taskStatusMutationService.js +119 -3
  248. package/dist/sync/v3/workflowAssignmentSync.d.ts +5 -0
  249. package/dist/sync/v3/workflowAssignmentSync.js +27 -0
  250. package/dist/sync/v3/workspaceSyncJournalReader.js +1 -1
  251. package/dist/sync/v3/workspaceSyncOperationRetentionService.d.ts +16 -0
  252. package/dist/sync/v3/workspaceSyncOperationRetentionService.js +83 -0
  253. package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.d.ts +1 -0
  254. package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.js +9 -2
  255. package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.d.ts +7 -0
  256. package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.js +44 -32
  257. package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.d.ts +9 -5
  258. package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.js +54 -38
  259. package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.d.ts +10 -0
  260. package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.js +70 -31
  261. package/dist/sync/v3/workspaceSyncV3CombinedWireContract.d.ts +2 -1
  262. package/dist/sync/v3/workspaceSyncV3CombinedWireContract.js +16 -0
  263. package/dist/sync/v3/workspaceSyncV3CoverageRegistry.js +6 -0
  264. package/dist/sync/v3/workspaceSyncV3OperationProtocol.d.ts +3 -0
  265. package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.d.ts +5 -0
  266. package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.js +36 -2
  267. package/dist/sync/v3/workspaceSyncV3RepairSnapshotRetentionService.d.ts +17 -0
  268. package/dist/sync/v3/workspaceSyncV3RepairSnapshotRetentionService.js +64 -0
  269. package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverCoverage.d.ts +7 -0
  270. package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverCoverage.js +33 -0
  271. package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverWireContract.d.ts +7 -0
  272. package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverWireContract.js +8 -0
  273. package/dist/sync/workspaceRepair.d.ts +5 -2
  274. package/dist/sync/workspaceRepair.js +161 -6
  275. package/dist/sync/workspaceSyncModel.d.ts +21 -0
  276. package/dist/sync/workspaceSyncModel.js +35 -7
  277. package/dist/sync/workspaceSyncState.d.ts +1 -0
  278. package/dist/sync/workspaceSyncV2SnapshotBuilder.d.ts +6 -0
  279. package/dist/sync/workspaceSyncV2SnapshotBuilder.js +5 -0
  280. package/dist/ui/assets/AiIdentityRosterCard-OcSz1PkK.js +1 -0
  281. package/dist/ui/assets/AiProfilesModule-ByhYW5Xi.js +1 -0
  282. package/dist/ui/assets/{AnnotatedAttachmentWorkspace-B68Wg-RV.js → AnnotatedAttachmentWorkspace-BTM6nIg_.js} +1 -1
  283. package/dist/ui/assets/{AssetTraySortControl-C8Rztyal.js → AssetTraySortControl-DabEG8L4.js} +1 -1
  284. package/dist/ui/assets/{ContextAttachmentManager-Cj3c7X9y.js → ContextAttachmentManager-Coa8yVGM.js} +1 -1
  285. package/dist/ui/assets/{DocumentWorkspace-B5uvzems.js → DocumentWorkspace-BB0qhdix.js} +1 -1
  286. package/dist/ui/assets/{EntityActivityTimeline-BVFvCB5R.js → EntityActivityTimeline-CZ8x4UJE.js} +1 -1
  287. package/dist/ui/assets/{PlanningModule-B5DWQOGz.js → PlanningModule-pRPjR7v5.js} +1 -1
  288. package/dist/ui/assets/{PlansPage-AY4cGWco.js → PlansPage-D86pZSSl.js} +1 -1
  289. package/dist/ui/assets/{TaskContextUpload-DZxTVesW.js → TaskContextUpload-BVIkU9yT.js} +1 -1
  290. package/dist/ui/assets/TaskSettings-Cv1mNhv_.js +12 -0
  291. package/dist/ui/assets/TaskforceAgentsModule-b-8R25cJ.css +1 -0
  292. package/dist/ui/assets/TaskforceAgentsModule-gmH-PD2q.js +24 -0
  293. package/dist/ui/assets/{WorkflowManagerModule-DEr5di_r.js → WorkflowManagerModule-DbfnHJ-f.js} +1 -1
  294. package/dist/ui/assets/index-BZ-hdZSk.css +1 -0
  295. package/dist/ui/assets/index-CTsDBaef.js +7 -0
  296. package/dist/ui/assets/{vendor-icons-D9Lpw-j4.js → vendor-icons-Bsq-mcEn.js} +1 -1
  297. package/dist/ui/branding/logos/letterhead_dark.png +0 -0
  298. package/dist/ui/branding/logos/letterhead_light.png +0 -0
  299. package/dist/ui/branding/logos/signature_dark.png +0 -0
  300. package/dist/ui/branding/logos/signature_light.png +0 -0
  301. package/dist/ui/index.html +3 -3
  302. package/dist/utils/aiProfileDefaultLogo.js +16 -48
  303. package/dist/utils/httpSetCookie.d.ts +1 -0
  304. package/dist/utils/httpSetCookie.js +4 -1
  305. package/dist/utils/localRuntimeUrl.d.ts +1 -0
  306. package/dist/utils/localRuntimeUrl.js +14 -0
  307. package/dist/utils/productLogoRegistry.d.ts +2 -0
  308. package/dist/utils/productLogoRegistry.js +36 -0
  309. package/dist/utils/syncStatusPresentation.d.ts +4 -0
  310. package/dist/utils/syncStatusPresentation.js +17 -0
  311. package/dist/utils/taskEvents.d.ts +2 -0
  312. package/dist/utils/workspaceSyncPresentation.d.ts +1 -1
  313. package/dist/utils/workspaceSyncPresentation.js +23 -17
  314. package/package.json +22 -4
  315. package/dist/ui/assets/AiIdentityRosterCard-BZM4aQnM.js +0 -1
  316. package/dist/ui/assets/AiProfilesModule-BbAEWtHH.js +0 -1
  317. package/dist/ui/assets/TaskSettings-BeWAuyZj.js +0 -12
  318. package/dist/ui/assets/TaskforceAgentsModule-BifCYtjR.js +0 -21
  319. package/dist/ui/assets/TaskforceAgentsModule-D6IC0S7Q.css +0 -1
  320. package/dist/ui/assets/index-I5zhdtgt.js +0 -7
  321. package/dist/ui/assets/index-VRFsx3wz.css +0 -1
@@ -414,7 +414,7 @@ export function registerTaskPlanningTools(registerTool, executeTool) {
414
414
  },
415
415
  }));
416
416
  register('get_task_checklist', (context) => ({
417
- description: context.describeTool('Read the structured checklist items for one task. Returns stored checklist items, not markdown parsing.'),
417
+ description: context.describeTool('Read the structured checklist items for one task. Returns stored checklist items plus detailRevision for optimistic concurrency; it does not parse markdown.'),
418
418
  inputSchema: {
419
419
  properties: {
420
420
  taskId: stringProperty('Task ID or task reference such as T-123.'),
@@ -433,6 +433,24 @@ export function registerTaskPlanningTools(registerTool, executeTool) {
433
433
  required: ['taskId', 'text'],
434
434
  },
435
435
  }));
436
+ register('update_task_checklist_item', (context) => ({
437
+ description: context.describeTool('Update one existing checklist item without replacing the full checklist. Read get_task_checklist first and pass expectedDetailRevision to reject concurrent changes. Pass idempotencyKey only when retrying an ambiguous outcome; reuse it only with the exact same task, item, patch, and revision.'),
438
+ inputSchema: {
439
+ properties: {
440
+ taskId: stringProperty('Task ID or task reference such as T-123.'),
441
+ itemId: stringProperty('Stable checklist item ID returned by get_task_checklist.'),
442
+ text: stringProperty('Optional replacement checklist text. Must be descriptive and non-empty.'),
443
+ done: booleanProperty('Optional completion state.'),
444
+ order: integerProperty('Optional non-negative display order. Sibling items are not renumbered.', 0),
445
+ expectedDetailRevision: stringProperty('Optional task detailRevision from get_task_checklist. A stale value rejects the update without mutation.'),
446
+ idempotencyKey: {
447
+ type: 'string', minLength: 1, maxLength: 128,
448
+ description: 'Optional opaque retry key scoped to the active workspace, actor, and tool.',
449
+ },
450
+ },
451
+ required: ['taskId', 'itemId'],
452
+ },
453
+ }));
436
454
  register('replace_task_checklist', (context) => ({
437
455
  description: context.describeTool('Replace the structured checklist items for one task with a new ordered list. Use this when a user explicitly asks to create, update, or replace a task checklist; do not just draft checklist text.'),
438
456
  inputSchema: {
@@ -567,7 +585,7 @@ export function registerTaskPlanningTools(registerTool, executeTool) {
567
585
  },
568
586
  }));
569
587
  register('update_task', (context) => ({
570
- description: context.describeTool('Update an existing task. Current taxonomy values are included in this tool schema; call get_config only for richer metadata or after a validation mismatch. Use start_task when beginning active work on a tracked task, and prefer finish_task for the final completion or review handoff.'),
588
+ description: context.describeTool('Update task fields. Use start_task to begin tracked work. Review transitions are rejected; use finish_task so its required handoff comment, status, and reviewer commit atomically.'),
571
589
  inputSchema: {
572
590
  properties: {
573
591
  id: stringProperty('Task ID or task reference such as T-123.'),
@@ -587,12 +605,13 @@ export function registerTaskPlanningTools(registerTool, executeTool) {
587
605
  },
588
606
  }));
589
607
  register('finish_task', (context) => ({
590
- description: context.describeTool('Default end-of-task handoff. Use outcome=\'done\' for completed work or outcome=\'review\' for validation. Both remain active and unarchived; use archive_task for history. Archived tasks require reopen_task first.'),
608
+ description: context.describeTool('Finish active work as done or review without archiving. Review atomically commits its required handoff comment and reviewer. Pass a human or AI reviewer ID unless an eligible human is already assigned. No Git or PR required.'),
591
609
  inputSchema: {
592
610
  properties: {
593
611
  id: stringProperty('Task ID or task reference such as T-123.'),
594
612
  outcome: stringProperty('Completion outcome.', ['review', 'done']),
595
- comment: stringProperty('Optional completion note returned in the handoff response.'),
613
+ comment: stringProperty('Required for review and persisted atomically with the transition; optional for done.'),
614
+ reviewer: stringProperty('Reviewer assignee ID. Required for review unless an eligible human is already assigned.'),
596
615
  },
597
616
  required: ['id', 'outcome'],
598
617
  },
@@ -5,11 +5,13 @@ type McpScopedPermission = Extract<McpPermission, {
5
5
  kind: 'scope';
6
6
  }>;
7
7
  type McpScope = McpScopedPermission['scope'];
8
+ export type CloudMcpToolProfile = Extract<McpToolProfile, 'default' | 'extended'>;
8
9
  export declare function normalizeMcpToolProfile(value: unknown, fallback: McpToolProfile): McpToolProfile;
9
10
  export declare function getDefaultMcpToolProfile(runtimeMode: 'local' | 'cloud'): McpToolProfile;
10
11
  export declare function isMcpToolVisibleInProfile(name: string, profile: McpToolProfile): boolean;
11
12
  export declare function getMcpToolRequiredProfiles(name: string): McpToolProfile[];
12
13
  export declare function getMcpToolProfileMembership(profile: McpToolProfile): McpToolName[];
14
+ export declare function getCloudMcpToolProfileMembership(profile: CloudMcpToolProfile, scopes?: readonly McpScope[]): McpToolName[];
13
15
  export declare function getManagedAgentMcpRuntimeProfile(_profile?: ManagedAgentMcpToolProfile): McpToolProfile;
14
16
  export declare function getManagedAgentMcpToolProfileMembership(profile?: ManagedAgentMcpToolProfile): McpToolName[];
15
17
  export declare function getManagedAgentMcpToolScopes(profile?: ManagedAgentMcpToolProfile): McpScope[];
@@ -14,6 +14,7 @@ const MANAGED_AGENT_ALLOWED_MUTATING_TOOLS = new Set([
14
14
  'add_comment',
15
15
  'add_initiative_comment',
16
16
  'add_task_checklist_item',
17
+ 'update_task_checklist_item',
17
18
  'add_workstream_comment',
18
19
  'complete_workflow_step',
19
20
  'replace_task_checklist',
@@ -45,6 +46,15 @@ export function getMcpToolProfileMembership(profile) {
45
46
  .map(([name]) => name)
46
47
  .sort((left, right) => left.localeCompare(right));
47
48
  }
49
+ export function getCloudMcpToolProfileMembership(profile, scopes) {
50
+ const allowedScopes = scopes ? new Set(scopes) : null;
51
+ return getMcpToolProfileMembership(profile).filter((name) => {
52
+ const permission = MCP_TOOL_REGISTRY[name].permission;
53
+ if (permission.kind === 'local-only' || permission.kind === 'session-only')
54
+ return false;
55
+ return permission.kind === 'public' || !allowedScopes || allowedScopes.has(permission.scope);
56
+ });
57
+ }
48
58
  export function getManagedAgentMcpRuntimeProfile(_profile = MCP_MANAGED_AGENT_DEFAULT_PROFILE) {
49
59
  return 'default';
50
60
  }
@@ -51,6 +51,7 @@ export declare const MCP_TOOL_REGISTRY: Readonly<{
51
51
  readonly update_workstream_initiative: McpToolRegistryEntry;
52
52
  readonly get_task_checklist: McpToolRegistryEntry;
53
53
  readonly add_task_checklist_item: McpToolRegistryEntry;
54
+ readonly update_task_checklist_item: McpToolRegistryEntry;
54
55
  readonly replace_task_checklist: McpToolRegistryEntry;
55
56
  readonly get_task_attachments: McpToolRegistryEntry;
56
57
  readonly get_workstream_attachments: McpToolRegistryEntry;
@@ -49,6 +49,7 @@ export const MCP_TOOL_REGISTRY = Object.freeze({
49
49
  update_workstream_initiative: defaultTool({ kind: 'scope', scope: 'tasks:write' }, true),
50
50
  get_task_checklist: defaultTool({ kind: 'scope', scope: 'tasks:read' }, false),
51
51
  add_task_checklist_item: defaultTool({ kind: 'scope', scope: 'tasks:write' }, true),
52
+ update_task_checklist_item: defaultTool({ kind: 'scope', scope: 'tasks:write' }, true),
52
53
  replace_task_checklist: defaultTool({ kind: 'scope', scope: 'tasks:write' }, true),
53
54
  get_task_attachments: defaultTool({ kind: 'scope', scope: 'tasks:read' }, false),
54
55
  get_workstream_attachments: extendedTool({ kind: 'scope', scope: 'tasks:read' }, false),
@@ -32,16 +32,16 @@ export function registerWorkflowExecutionTools(registerTool, executeTool) {
32
32
  },
33
33
  }));
34
34
  register('complete_workflow_step', (context) => ({
35
- description: context.describeTool('Complete the current workflow step when the active AI profile owns it. If the step requires a task comment, add the comment first and pass its returned commentId as evidence. Advances and reassigns the task automatically.'),
35
+ description: context.describeTool('Complete the current workflow step when the active AI profile owns it. Call get_task_workflow first for the same task and reuse its completionCall arguments exactly; never invent or reuse workflow IDs. If the step requires a task comment, add the comment first and pass its returned commentId as evidence. Advances and reassigns the task automatically.'),
36
36
  annotations: { idempotentHint: true },
37
37
  inputSchema: {
38
38
  additionalProperties: false,
39
39
  properties: {
40
40
  taskId: { type: 'string', description: 'Task UUID or reference label such as T-123.' },
41
- executionId: { type: 'string', description: 'Workflow execution ID returned by get_task_workflow.' },
42
- stepId: { type: 'string', description: 'Current workflow step ID returned by get_task_workflow.' },
41
+ executionId: { type: 'string', description: 'Exact executionId from the same-task get_task_workflow completionCall; never invent or reuse it.' },
42
+ stepId: { type: 'string', description: 'Exact stepId from the same-task get_task_workflow completionCall; never invent or reuse it.' },
43
43
  evidenceCommentId: {
44
- type: 'string',
44
+ anyOf: [{ type: 'string' }, { type: 'null' }],
45
45
  description: 'Exact commentId returned by add_comment when the current step requires task-comment evidence.',
46
46
  },
47
47
  },
@@ -44,6 +44,11 @@ export declare function ensureLocalSyncCoordinatorSchema(db: DatabaseAdapter): v
44
44
  export declare function ensureWorkspaceDocumentsSchema(db: DatabaseAdapter): void;
45
45
  export declare function ensureAnnotatedAttachmentSessionsSchema(db: DatabaseAdapter): void;
46
46
  export declare function ensureTaskforceAgentsSchema(db: DatabaseAdapter): void;
47
+ export declare function ensureModelProviderConnectionsSchema(db: DatabaseAdapter): void;
48
+ export declare function ensureTaskforceAgentConnectionBindingsSchema(db: DatabaseAdapter): void;
49
+ export declare function ensureGitHubReviewEvidenceInstallationBindingsSchema(db: DatabaseAdapter): void;
50
+ export declare function ensureExecutorPhaseAApprovalReceiptsSchema(db: DatabaseAdapter): void;
51
+ export declare function ensureExecutorPhaseARunAuthorizationsSchema(db: DatabaseAdapter): void;
47
52
  export declare function ensureAgentRolesSchema(db: DatabaseAdapter): void;
48
53
  export declare function ensureTaskforceAgentSkillsSchema(db: DatabaseAdapter): void;
49
54
  export declare function ensureWorkflowSchema(db: DatabaseAdapter): void;
@@ -534,6 +534,7 @@ export function ensureWorkspaceSchema(db) {
534
534
  user_id TEXT NOT NULL,
535
535
  name TEXT NOT NULL,
536
536
  scopes_json TEXT NOT NULL,
537
+ tool_profile TEXT NOT NULL DEFAULT 'default',
537
538
  token_prefix TEXT NOT NULL,
538
539
  token_hash TEXT NOT NULL,
539
540
  status TEXT NOT NULL DEFAULT 'active',
@@ -654,6 +655,7 @@ export function ensureWorkspaceSchema(db) {
654
655
  { name: 'user_id', sql: `ALTER TABLE mcp_access_tokens ADD COLUMN user_id TEXT NOT NULL DEFAULT ''` },
655
656
  { name: 'name', sql: `ALTER TABLE mcp_access_tokens ADD COLUMN name TEXT NOT NULL DEFAULT ''` },
656
657
  { name: 'scopes_json', sql: `ALTER TABLE mcp_access_tokens ADD COLUMN scopes_json TEXT NOT NULL DEFAULT '[]'` },
658
+ { name: 'tool_profile', sql: `ALTER TABLE mcp_access_tokens ADD COLUMN tool_profile TEXT NOT NULL DEFAULT 'default'` },
657
659
  { name: 'token_prefix', sql: `ALTER TABLE mcp_access_tokens ADD COLUMN token_prefix TEXT NOT NULL DEFAULT ''` },
658
660
  { name: 'token_hash', sql: `ALTER TABLE mcp_access_tokens ADD COLUMN token_hash TEXT NOT NULL DEFAULT ''` },
659
661
  { name: 'status', sql: `ALTER TABLE mcp_access_tokens ADD COLUMN status TEXT NOT NULL DEFAULT 'active'` },
@@ -1688,6 +1690,9 @@ export function buildWorkspaceSyncDurabilitySchemaSql(provider) {
1688
1690
  CREATE INDEX IF NOT EXISTS idx_workspace_sync_repair_snapshots_expiry
1689
1691
  ON workspace_sync_repair_snapshots(tenant_id, workspace_id, expires_at);
1690
1692
 
1693
+ CREATE INDEX IF NOT EXISTS idx_workspace_sync_repair_snapshots_global_expiry
1694
+ ON workspace_sync_repair_snapshots(tenant_id, expires_at, workspace_id, snapshot_id);
1695
+
1691
1696
  CREATE INDEX IF NOT EXISTS idx_workspace_sync_repair_snapshots_created
1692
1697
  ON workspace_sync_repair_snapshots(tenant_id, workspace_id, created_at);
1693
1698
 
@@ -1730,6 +1735,60 @@ export function buildWorkspaceSyncDurabilitySchemaSql(provider) {
1730
1735
  }
1731
1736
  export function ensureWorkspaceSyncDurabilitySchema(db) {
1732
1737
  db.exec(buildWorkspaceSyncDurabilitySchemaSql(db.provider));
1738
+ db.exec(`
1739
+ CREATE TABLE IF NOT EXISTS workspace_sync_content_tombstone_provenance (
1740
+ id TEXT PRIMARY KEY,
1741
+ tenant_id TEXT NOT NULL,
1742
+ workspace_id TEXT NOT NULL,
1743
+ kind TEXT NOT NULL,
1744
+ logical_path TEXT NOT NULL,
1745
+ source TEXT NOT NULL,
1746
+ operation_id TEXT,
1747
+ actor_id TEXT,
1748
+ source_runtime TEXT,
1749
+ source_updated_at TEXT NOT NULL,
1750
+ repair_involved INTEGER NOT NULL DEFAULT 0,
1751
+ recorded_at TEXT NOT NULL
1752
+ );
1753
+ CREATE INDEX IF NOT EXISTS idx_workspace_sync_content_tombstone_provenance_path
1754
+ ON workspace_sync_content_tombstone_provenance(
1755
+ tenant_id, workspace_id, kind, logical_path, recorded_at
1756
+ );
1757
+ CREATE INDEX IF NOT EXISTS idx_workspace_sync_content_tombstone_provenance_recorded
1758
+ ON workspace_sync_content_tombstone_provenance(tenant_id, workspace_id, recorded_at);
1759
+ `);
1760
+ // workspace_sync_content_pull_obligations (T-1607) is normally created by
1761
+ // ensureLocalSyncCoordinatorSchema, but that function only runs for
1762
+ // runtimeMode === 'local' (see core/Taskforce.ts). Cloud/Postgres deployments
1763
+ // otherwise depended solely on the static migrations/postgres/001_init.sql
1764
+ // bootstrap, which only benefits brand-new databases — an existing cloud
1765
+ // deployment provisioned before that table existed would never self-heal.
1766
+ // ensureWorkspaceSyncDurabilitySchema runs unconditionally on every startup
1767
+ // for both runtimes, so creating it here too (idempotently) closes that gap
1768
+ // for already-provisioned cloud deployments as well.
1769
+ db.exec(`
1770
+ CREATE TABLE IF NOT EXISTS workspace_sync_content_pull_obligations (
1771
+ tenant_id TEXT NOT NULL,
1772
+ workspace_id TEXT NOT NULL,
1773
+ kind TEXT NOT NULL,
1774
+ path TEXT NOT NULL,
1775
+ source_watermark TEXT NOT NULL,
1776
+ metadata_fingerprint TEXT NOT NULL,
1777
+ expected_sha256 TEXT NOT NULL,
1778
+ expected_size_bytes INTEGER NOT NULL,
1779
+ manifest_updated_at TEXT NOT NULL,
1780
+ attempts INTEGER NOT NULL DEFAULT 0,
1781
+ last_error TEXT,
1782
+ created_at TEXT NOT NULL,
1783
+ updated_at TEXT NOT NULL,
1784
+ resolved_at TEXT,
1785
+ PRIMARY KEY (tenant_id, workspace_id, kind, path)
1786
+ );
1787
+ CREATE INDEX IF NOT EXISTS idx_workspace_sync_content_pull_obligations_open
1788
+ ON workspace_sync_content_pull_obligations(
1789
+ tenant_id, workspace_id, resolved_at, updated_at, kind, path
1790
+ );
1791
+ `);
1733
1792
  if (db.provider === 'sqlite' && hasTable(db, 'tasks')) {
1734
1793
  db.exec(`
1735
1794
  CREATE TRIGGER IF NOT EXISTS trg_tasks_v3_create_fence
@@ -2076,6 +2135,7 @@ export function ensureLocalSyncCoordinatorSchema(db) {
2076
2135
  upstream_disposition TEXT NOT NULL,
2077
2136
  last_committed_cursor_json TEXT,
2078
2137
  required_action TEXT NOT NULL,
2138
+ coalescing_key TEXT,
2079
2139
  created_at TEXT NOT NULL,
2080
2140
  resolved_at TEXT,
2081
2141
  resolved_boundary_json TEXT
@@ -2292,6 +2352,17 @@ export function ensureLocalSyncCoordinatorSchema(db) {
2292
2352
  ADD COLUMN resolved_boundary_json TEXT
2293
2353
  `);
2294
2354
  }
2355
+ if (!recoveryObligationColumns.has('coalescing_key')) {
2356
+ db.exec(`
2357
+ ALTER TABLE local_sync_recovery_obligations
2358
+ ADD COLUMN coalescing_key TEXT
2359
+ `);
2360
+ }
2361
+ db.exec(`
2362
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_local_sync_recovery_obligations_open_key
2363
+ ON local_sync_recovery_obligations(coalescing_key)
2364
+ WHERE coalescing_key IS NOT NULL AND resolved_at IS NULL
2365
+ `);
2295
2366
  }
2296
2367
  export function ensureWorkspaceDocumentsSchema(db) {
2297
2368
  db.exec(`
@@ -2425,6 +2496,350 @@ export function ensureTaskforceAgentsSchema(db) {
2425
2496
  : `ALTER TABLE agent_conversations ADD COLUMN task_id TEXT`);
2426
2497
  }
2427
2498
  }
2499
+ export function ensureModelProviderConnectionsSchema(db) {
2500
+ db.exec(`
2501
+ CREATE TABLE IF NOT EXISTS model_provider_connections (
2502
+ id TEXT PRIMARY KEY,
2503
+ tenant_id TEXT NOT NULL DEFAULT 'default',
2504
+ owner_user_id TEXT NOT NULL,
2505
+ provider_key TEXT NOT NULL,
2506
+ authentication_type TEXT NOT NULL,
2507
+ lifecycle_status TEXT NOT NULL DEFAULT 'pending',
2508
+ display_metadata_json TEXT NOT NULL DEFAULT '{}',
2509
+ credential_home_ref TEXT NOT NULL,
2510
+ last_verified_at TEXT,
2511
+ last_refreshed_at TEXT,
2512
+ last_failure_at TEXT,
2513
+ failure_code TEXT,
2514
+ disconnected_at TEXT,
2515
+ revoked_at TEXT,
2516
+ revoked_by_user_id TEXT,
2517
+ created_at TEXT NOT NULL,
2518
+ updated_at TEXT NOT NULL,
2519
+ UNIQUE (tenant_id, credential_home_ref),
2520
+ FOREIGN KEY (owner_user_id) REFERENCES users(id)
2521
+ );
2522
+
2523
+ CREATE INDEX IF NOT EXISTS idx_model_provider_connections_owner
2524
+ ON model_provider_connections(tenant_id, owner_user_id, lifecycle_status, updated_at);
2525
+
2526
+ CREATE TABLE IF NOT EXISTS model_provider_connection_leases (
2527
+ tenant_id TEXT NOT NULL DEFAULT 'default',
2528
+ connection_id TEXT NOT NULL,
2529
+ lease_token TEXT NOT NULL,
2530
+ operation TEXT NOT NULL,
2531
+ acquired_at TEXT NOT NULL,
2532
+ expires_at TEXT NOT NULL,
2533
+ updated_at TEXT NOT NULL,
2534
+ PRIMARY KEY (tenant_id, connection_id),
2535
+ FOREIGN KEY (connection_id) REFERENCES model_provider_connections(id) ON DELETE CASCADE
2536
+ );
2537
+
2538
+ CREATE INDEX IF NOT EXISTS idx_model_provider_connection_leases_expiry
2539
+ ON model_provider_connection_leases(tenant_id, expires_at);
2540
+
2541
+ CREATE TABLE IF NOT EXISTS model_provider_connection_events (
2542
+ id TEXT PRIMARY KEY,
2543
+ tenant_id TEXT NOT NULL DEFAULT 'default',
2544
+ connection_id TEXT NOT NULL,
2545
+ owner_user_id TEXT NOT NULL,
2546
+ actor_user_id TEXT NOT NULL,
2547
+ event_type TEXT NOT NULL,
2548
+ outcome TEXT NOT NULL,
2549
+ reason_code TEXT,
2550
+ created_at TEXT NOT NULL
2551
+ );
2552
+
2553
+ CREATE INDEX IF NOT EXISTS idx_model_provider_connection_events_connection
2554
+ ON model_provider_connection_events(tenant_id, connection_id, created_at);
2555
+ `);
2556
+ }
2557
+ export function ensureTaskforceAgentConnectionBindingsSchema(db) {
2558
+ db.exec(`
2559
+ CREATE TABLE IF NOT EXISTS taskforce_agent_connection_bindings (
2560
+ tenant_id TEXT NOT NULL DEFAULT 'default',
2561
+ workspace_id TEXT NOT NULL DEFAULT 'default',
2562
+ agent_id TEXT NOT NULL,
2563
+ connection_id TEXT NOT NULL,
2564
+ owner_user_id TEXT NOT NULL,
2565
+ provider_key TEXT NOT NULL,
2566
+ model_source TEXT NOT NULL,
2567
+ created_by_user_id TEXT NOT NULL,
2568
+ updated_by_user_id TEXT NOT NULL,
2569
+ created_at TEXT NOT NULL,
2570
+ updated_at TEXT NOT NULL,
2571
+ PRIMARY KEY (tenant_id, workspace_id, agent_id),
2572
+ FOREIGN KEY (agent_id) REFERENCES taskforce_agents(id) ON DELETE CASCADE,
2573
+ FOREIGN KEY (connection_id) REFERENCES model_provider_connections(id) ON DELETE CASCADE
2574
+ );
2575
+
2576
+ CREATE INDEX IF NOT EXISTS idx_taskforce_agent_connection_bindings_owner
2577
+ ON taskforce_agent_connection_bindings(
2578
+ tenant_id, workspace_id, owner_user_id, updated_at
2579
+ );
2580
+
2581
+ CREATE INDEX IF NOT EXISTS idx_taskforce_agent_connection_bindings_connection
2582
+ ON taskforce_agent_connection_bindings(tenant_id, connection_id);
2583
+ `);
2584
+ }
2585
+ export function ensureGitHubReviewEvidenceInstallationBindingsSchema(db) {
2586
+ db.exec(`
2587
+ CREATE TABLE IF NOT EXISTS github_review_evidence_installation_bindings (
2588
+ tenant_id TEXT NOT NULL DEFAULT 'default',
2589
+ workspace_id TEXT NOT NULL,
2590
+ installation_id TEXT NOT NULL,
2591
+ account_id TEXT NOT NULL,
2592
+ account_login TEXT NOT NULL,
2593
+ account_type TEXT NOT NULL,
2594
+ repository_selection TEXT NOT NULL,
2595
+ bound_by_user_id TEXT NOT NULL,
2596
+ created_at TEXT NOT NULL,
2597
+ updated_at TEXT NOT NULL,
2598
+ PRIMARY KEY (tenant_id, workspace_id),
2599
+ UNIQUE (installation_id),
2600
+ FOREIGN KEY (workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE
2601
+ );
2602
+
2603
+ CREATE INDEX IF NOT EXISTS idx_github_review_evidence_installation
2604
+ ON github_review_evidence_installation_bindings(tenant_id, installation_id);
2605
+ `);
2606
+ }
2607
+ export function ensureExecutorPhaseAApprovalReceiptsSchema(db) {
2608
+ const bytesType = db.provider === 'postgres' ? 'BYTEA' : 'BLOB';
2609
+ if (hasTable(db, 'executor_phase_a_approval_receipts')) {
2610
+ if (db.provider === 'postgres') {
2611
+ db.exec(`
2612
+ ALTER TABLE executor_phase_a_approval_receipts
2613
+ ADD COLUMN IF NOT EXISTS receipt_kind TEXT,
2614
+ ADD COLUMN IF NOT EXISTS original_capability_id TEXT,
2615
+ ADD COLUMN IF NOT EXISTS residual_inventory_sha256 TEXT;
2616
+ UPDATE executor_phase_a_approval_receipts
2617
+ SET receipt_kind = 'main'
2618
+ WHERE receipt_kind IS NULL;
2619
+ ALTER TABLE executor_phase_a_approval_receipts
2620
+ ALTER COLUMN receipt_kind SET NOT NULL;
2621
+ DO $$
2622
+ BEGIN
2623
+ IF NOT EXISTS (
2624
+ SELECT 1 FROM pg_constraint
2625
+ WHERE conrelid = 'executor_phase_a_approval_receipts'::regclass
2626
+ AND conname = 'executor_phase_a_approval_receipts_kind_check'
2627
+ ) THEN
2628
+ ALTER TABLE executor_phase_a_approval_receipts
2629
+ ADD CONSTRAINT executor_phase_a_approval_receipts_kind_check
2630
+ CHECK (receipt_kind IN ('main', 'cleanup-only'));
2631
+ END IF;
2632
+ END $$;
2633
+ `);
2634
+ const legacyConstraints = db.prepare(`
2635
+ SELECT constraint_name AS name
2636
+ FROM information_schema.table_constraints
2637
+ WHERE table_schema = current_schema()
2638
+ AND table_name = 'executor_phase_a_approval_receipts'
2639
+ AND constraint_type = 'UNIQUE'
2640
+ `).all();
2641
+ for (const constraint of legacyConstraints) {
2642
+ const name = String(constraint.name || '');
2643
+ if (!/^[A-Za-z0-9_]+$/.test(name))
2644
+ continue;
2645
+ const columns = db.prepare(`
2646
+ SELECT column_name AS name
2647
+ FROM information_schema.key_column_usage
2648
+ WHERE table_schema = current_schema()
2649
+ AND table_name = 'executor_phase_a_approval_receipts'
2650
+ AND constraint_name = ?
2651
+ ORDER BY ordinal_position
2652
+ `).all(name);
2653
+ if (columns.map((column) => column.name).join(',') === 'tenant_id,workspace_id,task_id,run_id') {
2654
+ db.exec(`ALTER TABLE executor_phase_a_approval_receipts DROP CONSTRAINT "${name}"`);
2655
+ }
2656
+ }
2657
+ }
2658
+ else {
2659
+ const columns = db.prepare(`PRAGMA table_info(executor_phase_a_approval_receipts)`).all();
2660
+ if (!columns.some((column) => column.name === 'receipt_kind')) {
2661
+ db.transaction(() => db.exec(`
2662
+ ALTER TABLE executor_phase_a_approval_receipts RENAME TO executor_phase_a_approval_receipts_v1;
2663
+ CREATE TABLE executor_phase_a_approval_receipts (
2664
+ receipt_id TEXT PRIMARY KEY,
2665
+ tenant_id TEXT NOT NULL DEFAULT 'default',
2666
+ workspace_id TEXT NOT NULL,
2667
+ task_id TEXT NOT NULL,
2668
+ task_reference TEXT NOT NULL,
2669
+ run_id TEXT NOT NULL,
2670
+ receipt_kind TEXT NOT NULL CHECK (receipt_kind IN ('main', 'cleanup-only')),
2671
+ original_capability_id TEXT,
2672
+ residual_inventory_sha256 TEXT,
2673
+ actor_user_id TEXT NOT NULL,
2674
+ preflight_sha256 TEXT NOT NULL,
2675
+ logical_envelope_sha256 TEXT NOT NULL,
2676
+ canonical_preflight_bytes BLOB NOT NULL,
2677
+ canonical_receipt_bytes BLOB NOT NULL,
2678
+ receipt_sha256 TEXT NOT NULL,
2679
+ key_id TEXT NOT NULL,
2680
+ approved_at TEXT NOT NULL,
2681
+ expires_at TEXT NOT NULL,
2682
+ created_at TEXT NOT NULL,
2683
+ UNIQUE (tenant_id, workspace_id, task_id, run_id, receipt_kind)
2684
+ );
2685
+ INSERT INTO executor_phase_a_approval_receipts (
2686
+ receipt_id, tenant_id, workspace_id, task_id, task_reference, run_id,
2687
+ receipt_kind, original_capability_id, residual_inventory_sha256,
2688
+ actor_user_id, preflight_sha256, logical_envelope_sha256,
2689
+ canonical_preflight_bytes, canonical_receipt_bytes, receipt_sha256,
2690
+ key_id, approved_at, expires_at, created_at
2691
+ )
2692
+ SELECT receipt_id, tenant_id, workspace_id, task_id, task_reference, run_id,
2693
+ 'main', NULL, NULL, actor_user_id, preflight_sha256, logical_envelope_sha256,
2694
+ canonical_preflight_bytes, canonical_receipt_bytes, receipt_sha256,
2695
+ key_id, approved_at, expires_at, created_at
2696
+ FROM executor_phase_a_approval_receipts_v1;
2697
+ DROP TABLE executor_phase_a_approval_receipts_v1;
2698
+ `))();
2699
+ }
2700
+ }
2701
+ }
2702
+ db.exec(`
2703
+ CREATE TABLE IF NOT EXISTS executor_phase_a_approval_receipts (
2704
+ receipt_id TEXT PRIMARY KEY,
2705
+ tenant_id TEXT NOT NULL DEFAULT 'default',
2706
+ workspace_id TEXT NOT NULL,
2707
+ task_id TEXT NOT NULL,
2708
+ task_reference TEXT NOT NULL,
2709
+ run_id TEXT NOT NULL,
2710
+ receipt_kind TEXT NOT NULL CHECK (receipt_kind IN ('main', 'cleanup-only')),
2711
+ original_capability_id TEXT,
2712
+ residual_inventory_sha256 TEXT,
2713
+ actor_user_id TEXT NOT NULL,
2714
+ preflight_sha256 TEXT NOT NULL,
2715
+ logical_envelope_sha256 TEXT NOT NULL,
2716
+ canonical_preflight_bytes ${bytesType} NOT NULL,
2717
+ canonical_receipt_bytes ${bytesType} NOT NULL,
2718
+ receipt_sha256 TEXT NOT NULL,
2719
+ key_id TEXT NOT NULL,
2720
+ approved_at TEXT NOT NULL,
2721
+ expires_at TEXT NOT NULL,
2722
+ created_at TEXT NOT NULL,
2723
+ UNIQUE (tenant_id, workspace_id, task_id, run_id, receipt_kind)
2724
+ );
2725
+
2726
+ CREATE INDEX IF NOT EXISTS idx_executor_phase_a_receipts_scope
2727
+ ON executor_phase_a_approval_receipts(tenant_id, workspace_id, task_id, approved_at);
2728
+
2729
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_executor_phase_a_receipts_run_kind
2730
+ ON executor_phase_a_approval_receipts(tenant_id, workspace_id, task_id, run_id, receipt_kind);
2731
+ `);
2732
+ }
2733
+ export function ensureExecutorPhaseARunAuthorizationsSchema(db) {
2734
+ db.exec(`
2735
+ CREATE TABLE IF NOT EXISTS executor_phase_a_run_capabilities (
2736
+ capability_id TEXT PRIMARY KEY,
2737
+ tenant_id TEXT NOT NULL DEFAULT 'default',
2738
+ workspace_id TEXT NOT NULL,
2739
+ task_id TEXT NOT NULL,
2740
+ run_id TEXT NOT NULL,
2741
+ receipt_id TEXT NOT NULL,
2742
+ receipt_sha256 TEXT NOT NULL,
2743
+ capability_kind TEXT NOT NULL CHECK (capability_kind IN ('main', 'cleanup-only')),
2744
+ original_capability_id TEXT,
2745
+ residual_inventory_sha256 TEXT,
2746
+ actor_user_id TEXT NOT NULL,
2747
+ account_id TEXT NOT NULL,
2748
+ region TEXT NOT NULL,
2749
+ availability_zone TEXT NOT NULL,
2750
+ read_principal_arn TEXT NOT NULL,
2751
+ broker_key_fingerprint TEXT NOT NULL,
2752
+ capability_sha256 TEXT NOT NULL,
2753
+ preflight_sha256 TEXT NOT NULL,
2754
+ logical_envelope_sha256 TEXT NOT NULL,
2755
+ source_commit TEXT NOT NULL,
2756
+ role_map_sha256 TEXT NOT NULL,
2757
+ oidc_audience_sha256 TEXT NOT NULL,
2758
+ issued_at TEXT NOT NULL,
2759
+ expires_at TEXT NOT NULL,
2760
+ mutation_deadline TEXT NOT NULL,
2761
+ cleanup_deadline TEXT NOT NULL,
2762
+ status TEXT NOT NULL CHECK (status IN (
2763
+ 'active', 'awaiting-cleanup-approval', 'completed', 'cleanup-failed', 'expired'
2764
+ )),
2765
+ hard_stopped_at TEXT,
2766
+ created_at TEXT NOT NULL,
2767
+ updated_at TEXT NOT NULL,
2768
+ UNIQUE (tenant_id, workspace_id, task_id, run_id, receipt_id, broker_key_fingerprint),
2769
+ UNIQUE (tenant_id, receipt_id),
2770
+ UNIQUE (tenant_id, original_capability_id)
2771
+ );
2772
+
2773
+ CREATE INDEX IF NOT EXISTS idx_executor_phase_a_run_capabilities_scope
2774
+ ON executor_phase_a_run_capabilities(tenant_id, workspace_id, task_id, run_id, status);
2775
+
2776
+ CREATE TABLE IF NOT EXISTS executor_phase_a_sender_nonces (
2777
+ nonce_id TEXT PRIMARY KEY,
2778
+ tenant_id TEXT NOT NULL DEFAULT 'default',
2779
+ capability_id TEXT NOT NULL,
2780
+ request_sha256 TEXT NOT NULL,
2781
+ phase TEXT NOT NULL CHECK (phase IN ('bootstrap', 'ami-build', 'provenance', 'runtime', 'cleanup')),
2782
+ issued_at TEXT NOT NULL,
2783
+ expires_at TEXT NOT NULL,
2784
+ consumed_at TEXT,
2785
+ status TEXT NOT NULL CHECK (status IN ('issued', 'consumed', 'revoked', 'expired')),
2786
+ created_at TEXT NOT NULL,
2787
+ updated_at TEXT NOT NULL,
2788
+ UNIQUE (tenant_id, capability_id, nonce_id),
2789
+ FOREIGN KEY (capability_id) REFERENCES executor_phase_a_run_capabilities(capability_id) ON DELETE RESTRICT
2790
+ );
2791
+
2792
+ CREATE TABLE IF NOT EXISTS executor_phase_a_workload_grants (
2793
+ grant_id TEXT PRIMARY KEY,
2794
+ tenant_id TEXT NOT NULL DEFAULT 'default',
2795
+ capability_id TEXT NOT NULL,
2796
+ workspace_id TEXT NOT NULL,
2797
+ task_id TEXT NOT NULL,
2798
+ run_id TEXT NOT NULL,
2799
+ receipt_id TEXT NOT NULL,
2800
+ phase TEXT NOT NULL CHECK (phase IN ('bootstrap', 'ami-build', 'provenance', 'runtime', 'cleanup')),
2801
+ role_arn TEXT NOT NULL,
2802
+ grant_sha256 TEXT NOT NULL,
2803
+ token_id TEXT NOT NULL,
2804
+ nonce_id TEXT NOT NULL,
2805
+ sender_proof_sha256 TEXT NOT NULL,
2806
+ broker_key_fingerprint TEXT NOT NULL,
2807
+ source_identity TEXT NOT NULL,
2808
+ session_tags_sha256 TEXT NOT NULL,
2809
+ policy_sha256 TEXT NOT NULL,
2810
+ issued_at TEXT NOT NULL,
2811
+ expires_at TEXT NOT NULL,
2812
+ used_at TEXT,
2813
+ status TEXT NOT NULL CHECK (status IN ('issued', 'used', 'revoked', 'rejected', 'expired')),
2814
+ created_at TEXT NOT NULL,
2815
+ updated_at TEXT NOT NULL,
2816
+ UNIQUE (tenant_id, token_id),
2817
+ UNIQUE (tenant_id, capability_id, nonce_id),
2818
+ UNIQUE (tenant_id, capability_id, sender_proof_sha256),
2819
+ FOREIGN KEY (capability_id) REFERENCES executor_phase_a_run_capabilities(capability_id) ON DELETE RESTRICT
2820
+ );
2821
+
2822
+ CREATE INDEX IF NOT EXISTS idx_executor_phase_a_workload_grants_scope
2823
+ ON executor_phase_a_workload_grants(tenant_id, capability_id, phase, status, issued_at);
2824
+
2825
+ CREATE TABLE IF NOT EXISTS executor_phase_a_issuer_redemptions (
2826
+ request_id TEXT PRIMARY KEY,
2827
+ tenant_id TEXT NOT NULL DEFAULT 'default',
2828
+ grant_id TEXT NOT NULL,
2829
+ grant_sha256 TEXT NOT NULL,
2830
+ sender_proof_sha256 TEXT NOT NULL,
2831
+ request_sha256 TEXT NOT NULL,
2832
+ canonical_response_bytes ${db.provider === 'postgres' ? 'BYTEA' : 'BLOB'} NOT NULL,
2833
+ response_sha256 TEXT NOT NULL,
2834
+ redeemed_at TEXT NOT NULL,
2835
+ UNIQUE (tenant_id, grant_id),
2836
+ FOREIGN KEY (grant_id) REFERENCES executor_phase_a_workload_grants(grant_id) ON DELETE RESTRICT
2837
+ );
2838
+
2839
+ CREATE INDEX IF NOT EXISTS idx_executor_phase_a_issuer_redemptions_grant
2840
+ ON executor_phase_a_issuer_redemptions(tenant_id, grant_id, redeemed_at);
2841
+ `);
2842
+ }
2428
2843
  export function ensureAgentRolesSchema(db) {
2429
2844
  db.exec(`
2430
2845
  CREATE TABLE IF NOT EXISTS agent_roles (
@@ -1,4 +1,4 @@
1
- import type { TaskforceCloudEnvironment } from '../config/cloudEnvironment.js';
1
+ import { type TaskforceCloudEnvironment } from '../config/cloudEnvironment.js';
2
2
  import { APP_GATE_DEFINITIONS as APP_GATE_CONFIG } from './appGateDefinitions.js';
3
3
  export declare const ANNOTATED_ATTACHMENTS_WORKSPACE_FEATURE_KEY: "annotated_attachments.workspace_access";
4
4
  export declare const DOCUMENT_WORKSPACE_FEATURE_KEY: "documents.workspace_access";
@@ -26,4 +26,5 @@ export declare function listAppGateDefinitions(): AppGateDefinition[];
26
26
  export declare function getAppGateDefinition(featureKey: string): AppGateDefinition | null;
27
27
  export declare function resolveAppGateAccess(featureKey: string, environment: TaskforceCloudEnvironment): ResolvedFeatureAccess;
28
28
  export declare function resolveAppGateAccessMap(environment: TaskforceCloudEnvironment): ResolvedFeatureAccessMap;
29
+ export declare function resolveClientAppGateAccessMap(accessMap: ResolvedFeatureAccessMap | null | undefined, cloudEnvironment: unknown): ResolvedFeatureAccessMap;
29
30
  export declare function isResolvedFeatureAccessMap(value: unknown): value is ResolvedFeatureAccessMap;
@@ -1,3 +1,4 @@
1
+ import { parseTaskforceCloudEnvironment, } from '../config/cloudEnvironment.js';
1
2
  import { APP_GATE_DEFINITIONS as APP_GATE_CONFIG } from './appGateDefinitions.js';
2
3
  export const ANNOTATED_ATTACHMENTS_WORKSPACE_FEATURE_KEY = 'annotated_attachments.workspace_access';
3
4
  export const DOCUMENT_WORKSPACE_FEATURE_KEY = 'documents.workspace_access';
@@ -53,6 +54,12 @@ export function resolveAppGateAccess(featureKey, environment) {
53
54
  export function resolveAppGateAccessMap(environment) {
54
55
  return Object.fromEntries(listAppGateDefinitions().map(({ key }) => [key, resolveAppGateAccess(key, environment)]));
55
56
  }
57
+ export function resolveClientAppGateAccessMap(accessMap, cloudEnvironment) {
58
+ if (accessMap && isResolvedFeatureAccessMap(accessMap))
59
+ return accessMap;
60
+ const environment = parseTaskforceCloudEnvironment(String(cloudEnvironment || '')) || 'production';
61
+ return resolveAppGateAccessMap(environment);
62
+ }
56
63
  export function isResolvedFeatureAccessMap(value) {
57
64
  if (!value || typeof value !== 'object' || Array.isArray(value))
58
65
  return false;