@taskforcehq/taskforce 0.3.329 → 0.3.332

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (363) hide show
  1. package/README.md +7 -2
  2. package/dist/Taskforce.module.css +290 -45
  3. package/dist/components/features/AiProfilesModule.js +3 -5
  4. package/dist/components/features/TaskSettings.js +70 -14
  5. package/dist/components/features/TaskforceAgentsModule.d.ts +1 -2
  6. package/dist/components/features/TaskforceAgentsModule.js +586 -116
  7. package/dist/components/features/agentCapabilities/AgentCapabilitiesPrototype.d.ts +2 -2
  8. package/dist/components/features/agentCapabilities/AgentCapabilitiesPrototype.js +2 -2
  9. package/dist/components/features/agentConnections/AgentConnectionControl.d.ts +15 -0
  10. package/dist/components/features/agentConnections/AgentConnectionControl.js +125 -0
  11. package/dist/components/features/agentConnections/ModelConnectionsPanel.d.ts +18 -0
  12. package/dist/components/features/agentConnections/ModelConnectionsPanel.js +393 -0
  13. package/dist/components/features/agentConnections/modelConnectionsApi.d.ts +65 -0
  14. package/dist/components/features/agentConnections/modelConnectionsApi.js +129 -0
  15. package/dist/components/features/planning/PlanningModule.js +15 -3
  16. package/dist/components/features/planning/planningMetadata.d.ts +10 -0
  17. package/dist/components/features/planning/planningMetadata.js +8 -0
  18. package/dist/components/features/taskforceAgentAssignments/AgentBehaviorAssignments.js +15 -24
  19. package/dist/components/features/taskforceAgentEditorModel.d.ts +2 -1
  20. package/dist/components/features/taskforceAgentEditorModel.js +3 -1
  21. package/dist/components/features/workflowManager/workflowManagerApi.d.ts +1 -1
  22. package/dist/components/features/workflowManager/workflowManagerApi.js +3 -0
  23. package/dist/components/task/TaskWorkflowAssignmentField.js +68 -10
  24. package/dist/components/views/StandaloneLayout.js +62 -27
  25. package/dist/components/views/panels/PlanningDrawer.d.ts +2 -1
  26. package/dist/components/views/panels/PlanningDrawer.js +12 -8
  27. package/dist/components/views/standalone/modals/SyncStatusModal.d.ts +4 -3
  28. package/dist/components/views/standalone/modals/SyncStatusModal.js +33 -38
  29. package/dist/config/envSchema.js +55 -1
  30. package/dist/core/McpTokenService.d.ts +25 -1
  31. package/dist/core/McpTokenService.js +106 -15
  32. package/dist/core/TaskChecklistCommandService.d.ts +27 -0
  33. package/dist/core/TaskChecklistCommandService.js +83 -5
  34. package/dist/core/TaskLifecycleCommandService.d.ts +3 -1
  35. package/dist/core/TaskLifecycleCommandService.js +6 -2
  36. package/dist/core/Taskforce.d.ts +43 -3
  37. package/dist/core/Taskforce.js +158 -7
  38. package/dist/core/types.d.ts +9 -0
  39. package/dist/documentReviews/DocumentReviewCommentStore.d.ts +2 -0
  40. package/dist/documentReviews/DocumentReviewCommentStore.js +28 -9
  41. package/dist/documentReviews/commandService.d.ts +2 -1
  42. package/dist/documentReviews/commandService.js +6 -3
  43. package/dist/hooks/sync/orchestratorShared.d.ts +1 -0
  44. package/dist/hooks/sync/orchestratorShared.js +2 -0
  45. package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.d.ts +3 -0
  46. package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.js +85 -9
  47. package/dist/hooks/sync/useSyncStatusControls.d.ts +4 -1
  48. package/dist/hooks/sync/useSyncStatusControls.js +47 -11
  49. package/dist/hooks/useSyncOrchestrator.d.ts +3 -0
  50. package/dist/hooks/useSyncOrchestrator.js +111 -2
  51. package/dist/hooks/useTaskData.d.ts +31 -1
  52. package/dist/hooks/useTaskData.js +29 -7
  53. package/dist/hooks/useTaskMutations.d.ts +3 -1
  54. package/dist/hooks/useTaskMutations.js +46 -12
  55. package/dist/hooks/useTaskforce.d.ts +2 -0
  56. package/dist/hooks/useTaskforce.js +11 -2
  57. package/dist/mcp/clientRegistry.d.ts +2 -2
  58. package/dist/mcp/clientRegistry.js +1 -1
  59. package/dist/mcp/documentAssetRegistrar.js +9 -6
  60. package/dist/mcp/durableTaskMutationRouter.d.ts +4 -1
  61. package/dist/mcp/durableTaskMutationRouter.js +10 -0
  62. package/dist/mcp/durableTaskRelationshipMutationRouter.js +4 -0
  63. package/dist/mcp/httpProtocolRouting.d.ts +11 -0
  64. package/dist/mcp/httpProtocolRouting.js +22 -0
  65. package/dist/mcp/localCliHealth.d.ts +2 -2
  66. package/dist/mcp/localCliHealth.js +2 -2
  67. package/dist/mcp/localServiceProxy.d.ts +1 -0
  68. package/dist/mcp/localServiceProxy.js +530 -68
  69. package/dist/mcp/planningAttachmentCommandAdapter.d.ts +3 -1
  70. package/dist/mcp/planningAttachmentCommandAdapter.js +20 -2
  71. package/dist/mcp/runtime.d.ts +54 -79
  72. package/dist/mcp/runtime.js +408 -102
  73. package/dist/mcp/taskPlanningRegistrar.js +25 -6
  74. package/dist/mcp/toolProfiles.d.ts +2 -0
  75. package/dist/mcp/toolProfiles.js +11 -0
  76. package/dist/mcp/toolRegistry.d.ts +1 -0
  77. package/dist/mcp/toolRegistry.js +9 -8
  78. package/dist/mcp/workflowExecutionRegistrar.js +4 -4
  79. package/dist/migrations/taskSchemaMigrations.d.ts +5 -0
  80. package/dist/migrations/taskSchemaMigrations.js +415 -0
  81. package/dist/runtime/appGates.d.ts +2 -1
  82. package/dist/runtime/appGates.js +7 -0
  83. package/dist/server/buildInfo.d.ts +1 -0
  84. package/dist/server/buildInfo.js +5 -1
  85. package/dist/server/cloudMcpCapacityTelemetry.d.ts +68 -0
  86. package/dist/server/cloudMcpCapacityTelemetry.js +221 -0
  87. package/dist/server/index.d.ts +3 -0
  88. package/dist/server/index.js +108 -11
  89. package/dist/server/localDatabaseIdentity.js +4 -1
  90. package/dist/server/localServiceLease.js +2 -1
  91. package/dist/server/localServiceSessions.d.ts +14 -17
  92. package/dist/server/localServiceSessions.js +308 -94
  93. package/dist/server/localWorkspaceSyncServerRuntime.js +25 -19
  94. package/dist/server/routes/admin.d.ts +4 -0
  95. package/dist/server/routes/admin.js +126 -5
  96. package/dist/server/routes/agents.d.ts +7 -0
  97. package/dist/server/routes/agents.js +277 -24
  98. package/dist/server/routes/billing.js +5 -1
  99. package/dist/server/routes/durableTaskHttpRouters.d.ts +2 -0
  100. package/dist/server/routes/executorPhaseAApprovals.d.ts +19 -0
  101. package/dist/server/routes/executorPhaseAApprovals.js +140 -0
  102. package/dist/server/routes/executorPhaseAIssuerRedemptions.d.ts +11 -0
  103. package/dist/server/routes/executorPhaseAIssuerRedemptions.js +24 -0
  104. package/dist/server/routes/githubReviewEvidence.d.ts +19 -0
  105. package/dist/server/routes/githubReviewEvidence.js +116 -0
  106. package/dist/server/routes/localService.d.ts +15 -4
  107. package/dist/server/routes/localService.js +136 -40
  108. package/dist/server/routes/modelConnections.d.ts +24 -0
  109. package/dist/server/routes/modelConnections.js +205 -0
  110. package/dist/server/routes/shared.d.ts +22 -0
  111. package/dist/server/routes/shared.js +298 -182
  112. package/dist/server/routes/sync.js +1 -0
  113. package/dist/server/routes/syncAuxRoutes.js +5 -1
  114. package/dist/server/routes/syncPushRoutes.d.ts +1 -0
  115. package/dist/server/routes/syncPushRoutes.js +1 -0
  116. package/dist/server/routes/syncV3FeedRoutes.js +10 -1
  117. package/dist/server/routes/syncV3OperationRoutes.js +35 -9
  118. package/dist/server/routes/tasks.js +21 -2
  119. package/dist/server/routes/workflows.js +9 -1
  120. package/dist/server/routes.js +59 -0
  121. package/dist/service/localServiceCli.d.ts +2 -2
  122. package/dist/service/localServiceCli.js +4 -3
  123. package/dist/services/codexAppServerModelGateway.d.ts +54 -5
  124. package/dist/services/codexAppServerModelGateway.js +246 -21
  125. package/dist/services/codexDeviceCodeLoginManager.d.ts +39 -0
  126. package/dist/services/codexDeviceCodeLoginManager.js +265 -0
  127. package/dist/services/codexModelProviderConnectionLifecycle.d.ts +8 -0
  128. package/dist/services/codexModelProviderConnectionLifecycle.js +73 -0
  129. package/dist/services/executorPhaseAApprovalRuntime.d.ts +14 -0
  130. package/dist/services/executorPhaseAApprovalRuntime.js +24 -0
  131. package/dist/services/executorPhaseAApprovalService.d.ts +40 -0
  132. package/dist/services/executorPhaseAApprovalService.js +609 -0
  133. package/dist/services/executorPhaseADriftEvaluator.d.ts +78 -0
  134. package/dist/services/executorPhaseADriftEvaluator.js +93 -0
  135. package/dist/services/executorPhaseAIssuerCore.d.ts +139 -0
  136. package/dist/services/executorPhaseAIssuerCore.js +402 -0
  137. package/dist/services/executorPhaseAIssuerRedemptionService.d.ts +34 -0
  138. package/dist/services/executorPhaseAIssuerRedemptionService.js +158 -0
  139. package/dist/services/githubReviewEvidenceRuntime.d.ts +14 -0
  140. package/dist/services/githubReviewEvidenceRuntime.js +30 -0
  141. package/dist/services/githubReviewEvidenceService.d.ts +93 -0
  142. package/dist/services/githubReviewEvidenceService.js +336 -0
  143. package/dist/services/modelGateway.d.ts +7 -0
  144. package/dist/services/modelProviderConnectionService.d.ts +71 -0
  145. package/dist/services/modelProviderConnectionService.js +279 -0
  146. package/dist/services/modelProviderCredentialHome.d.ts +32 -0
  147. package/dist/services/modelProviderCredentialHome.js +271 -0
  148. package/dist/services/ownerScopedModelConnectionGateway.d.ts +12 -0
  149. package/dist/services/ownerScopedModelConnectionGateway.js +30 -0
  150. package/dist/services/taskforceAgentConnectionBindingService.d.ts +66 -0
  151. package/dist/services/taskforceAgentConnectionBindingService.js +185 -0
  152. package/dist/services/taskforceAgentMcpBridge.d.ts +2 -2
  153. package/dist/services/taskforceAgentMcpBridge.js +42 -29
  154. package/dist/shared/adminEdgeProxy.d.ts +5 -0
  155. package/dist/shared/adminEdgeProxy.js +94 -0
  156. package/dist/shared/adminProxySessionCookies.d.ts +16 -0
  157. package/dist/shared/adminProxySessionCookies.js +86 -0
  158. package/dist/shared/aiProfileColors.d.ts +31 -1
  159. package/dist/shared/aiProfileColors.js +14 -6
  160. package/dist/shared/executorPhaseAApprovalGoldenVector.json +269 -0
  161. package/dist/shared/executorPhaseAApprovalReceipt.d.ts +112 -0
  162. package/dist/shared/executorPhaseAApprovalReceipt.js +58 -0
  163. package/dist/shared/executorPhaseAApprovalTrustPolicy.json +10 -0
  164. package/dist/shared/executorPhaseADriftContracts.d.ts +37 -0
  165. package/dist/shared/executorPhaseADriftContracts.js +63 -0
  166. package/dist/shared/executorPhaseAIssuerContracts.d.ts +75 -0
  167. package/dist/shared/executorPhaseAIssuerContracts.js +90 -0
  168. package/dist/shared/executorPhaseARunAuthorization.d.ts +120 -0
  169. package/dist/shared/executorPhaseARunAuthorization.js +232 -0
  170. package/dist/shared/executorPhaseASchemaValidation.d.ts +7 -0
  171. package/dist/shared/executorPhaseASchemaValidation.js +53 -0
  172. package/dist/shared/executorPhaseASchemas/approval-receipt.schema.json +106 -0
  173. package/dist/shared/executorPhaseASchemas/drift-attestation.schema.json +54 -0
  174. package/dist/shared/executorPhaseASchemas/drift-request.schema.json +47 -0
  175. package/dist/shared/executorPhaseASchemas/foundation-manifest.schema.json +29 -0
  176. package/dist/shared/executorPhaseASchemas/issuer-audit-record.schema.json +24 -0
  177. package/dist/shared/executorPhaseASchemas/issuer-proof.schema.json +43 -0
  178. package/dist/shared/executorPhaseASchemas/issuer-redemption-request.schema.json +18 -0
  179. package/dist/shared/executorPhaseASchemas/issuer-redemption-response.schema.json +39 -0
  180. package/dist/shared/executorPhaseASchemas/logical-envelope.schema.json +149 -0
  181. package/dist/shared/executorPhaseASchemas/preflight-report.schema.json +216 -0
  182. package/dist/shared/executorPhaseASchemas/run-capability.schema.json +111 -0
  183. package/dist/shared/executorPhaseASchemas/sender-proof.schema.json +37 -0
  184. package/dist/shared/executorPhaseASchemas/workload-grant.schema.json +68 -0
  185. package/dist/shared/executorPhaseASchemas/workload-jwt-claims.schema.json +67 -0
  186. package/dist/shared/executorPhaseATiming.d.ts +1 -0
  187. package/dist/shared/executorPhaseATiming.js +1 -0
  188. package/dist/shared/planningIdentity.js +1 -1
  189. package/dist/shared/productLogoKeys.d.ts +2 -0
  190. package/dist/shared/productLogoKeys.js +18 -0
  191. package/dist/shared/taskforceAgentDefinition.d.ts +0 -1
  192. package/dist/shared/taskforceAgentDefinition.js +6 -9
  193. package/dist/shared/taskforceAgentModels.js +7 -3
  194. package/dist/shared/userFeatureGrants.d.ts +4 -0
  195. package/dist/shared/userFeatureGrants.js +7 -0
  196. package/dist/storage/executorPhaseAApprovalReceiptStore.d.ts +37 -0
  197. package/dist/storage/executorPhaseAApprovalReceiptStore.js +81 -0
  198. package/dist/storage/executorPhaseARunAuthorizationStore.d.ts +103 -0
  199. package/dist/storage/executorPhaseARunAuthorizationStore.js +492 -0
  200. package/dist/storage/githubReviewEvidenceInstallationStore.d.ts +26 -0
  201. package/dist/storage/githubReviewEvidenceInstallationStore.js +89 -0
  202. package/dist/storage/modelProviderConnectionStore.d.ts +99 -0
  203. package/dist/storage/modelProviderConnectionStore.js +446 -0
  204. package/dist/storage/postgresAdapter.d.ts +4 -0
  205. package/dist/storage/postgresAdapter.js +14 -1
  206. package/dist/storage/postgresRequestDiagnostics.d.ts +9 -1
  207. package/dist/storage/postgresRequestDiagnostics.js +15 -2
  208. package/dist/storage/postgresWorker.js +20 -2
  209. package/dist/storage/postgresWorkerProtocol.d.ts +7 -0
  210. package/dist/storage/taskforceAgentConnectionBindingStore.d.ts +31 -0
  211. package/dist/storage/taskforceAgentConnectionBindingStore.js +84 -0
  212. package/dist/storage/workflowStore.d.ts +2 -0
  213. package/dist/storage/workflowStore.js +39 -2
  214. package/dist/sync/cloudSyncApi.js +4 -2
  215. package/dist/sync/collaborationSyncState.js +5 -0
  216. package/dist/sync/coordinator/localSyncExecutionPermitStore.js +60 -29
  217. package/dist/sync/coordinator/localWorkspaceSyncPendingV2PushProgress.d.ts +10 -0
  218. package/dist/sync/coordinator/localWorkspaceSyncPendingV2PushProgress.js +29 -0
  219. package/dist/sync/coordinator/localWorkspaceSyncRunner.d.ts +3 -1
  220. package/dist/sync/coordinator/localWorkspaceSyncRunner.js +18 -0
  221. package/dist/sync/coordinator/localWorkspaceSyncRunnerState.d.ts +15 -1
  222. package/dist/sync/coordinator/localWorkspaceSyncRunnerState.js +99 -2
  223. package/dist/sync/coordinator/workspaceSyncCredentialBroker.d.ts +1 -0
  224. package/dist/sync/coordinator/workspaceSyncCredentialBroker.js +33 -4
  225. package/dist/sync/engine/workspaceSyncContentLifecycleAdapter.d.ts +2 -1
  226. package/dist/sync/engine/workspaceSyncContentVersionStore.d.ts +38 -0
  227. package/dist/sync/engine/workspaceSyncContentVersionStore.js +50 -1
  228. package/dist/sync/engine/workspaceSyncEngineLifecyclePolicy.js +6 -6
  229. package/dist/sync/engine/workspaceSyncEnginePushCompletion.d.ts +14 -0
  230. package/dist/sync/engine/workspaceSyncEnginePushCompletion.js +84 -0
  231. package/dist/sync/engine/workspaceSyncEngineRecovery.js +1 -0
  232. package/dist/sync/engine/workspaceSyncEngineRuntime.d.ts +1 -0
  233. package/dist/sync/engine/workspaceSyncEngineRuntime.js +1 -0
  234. package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.js +112 -38
  235. package/dist/sync/engine/workspaceSyncEngineServerSnapshotReader.js +6 -0
  236. package/dist/sync/engine/workspaceSyncEngineTransfers.js +3 -1
  237. package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.d.ts +1 -0
  238. package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.js +31 -0
  239. package/dist/sync/syncApplyHandlers.d.ts +3 -0
  240. package/dist/sync/syncApplyHandlers.js +81 -15
  241. package/dist/sync/syncService.d.ts +15 -0
  242. package/dist/sync/syncService.js +83 -18
  243. package/dist/sync/taskforceAgentSyncAuthorization.d.ts +16 -0
  244. package/dist/sync/taskforceAgentSyncAuthorization.js +20 -0
  245. package/dist/sync/v3/combinedFeedCapability.js +4 -0
  246. package/dist/sync/v3/durableInitiativeMutationRouter.js +18 -10
  247. package/dist/sync/v3/durableOperationReplay.d.ts +14 -0
  248. package/dist/sync/v3/durableOperationReplay.js +18 -0
  249. package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.js +3 -0
  250. package/dist/sync/v3/durableTaskChecklistMutationRouter.d.ts +2 -1
  251. package/dist/sync/v3/durableTaskChecklistMutationRouter.js +58 -15
  252. package/dist/sync/v3/durableTaskCommentMutationRouter.js +3 -0
  253. package/dist/sync/v3/durableTaskHttpRootMutationRouter.d.ts +1 -1
  254. package/dist/sync/v3/durableTaskHttpRootMutationRouter.js +10 -0
  255. package/dist/sync/v3/durableTaxonomyMutationRouter.js +5 -0
  256. package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.d.ts +18 -7
  257. package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.js +89 -23
  258. package/dist/sync/v3/durableWorkstreamMutationRouter.js +18 -10
  259. package/dist/sync/v3/durableWorkstreamTaskOrderMutationRouter.js +16 -5
  260. package/dist/sync/v3/localOutboxDispatchRuntime.js +2 -2
  261. package/dist/sync/v3/localOutboxRecoveryPreparationService.js +8 -2
  262. package/dist/sync/v3/localTaskChecklistOutboxHandler.js +16 -2
  263. package/dist/sync/v3/localTaskChecklistOutboxService.d.ts +4 -0
  264. package/dist/sync/v3/localTaskChecklistOutboxService.js +14 -1
  265. package/dist/sync/v3/localTaskCreateOutboxService.d.ts +3 -1
  266. package/dist/sync/v3/localTaskCreateOutboxService.js +6 -1
  267. package/dist/sync/v3/localTaskDeleteOutboxService.js +1 -0
  268. package/dist/sync/v3/localTaskLifecycleOutboxService.d.ts +2 -1
  269. package/dist/sync/v3/localTaskLifecycleOutboxService.js +5 -1
  270. package/dist/sync/v3/localTaskMetadataOutboxService.d.ts +2 -1
  271. package/dist/sync/v3/localTaskMetadataOutboxService.js +6 -2
  272. package/dist/sync/v3/localTaskStatusOutboxService.d.ts +10 -1
  273. package/dist/sync/v3/localTaskStatusOutboxService.js +238 -16
  274. package/dist/sync/v3/syncDurabilityStore.d.ts +36 -1
  275. package/dist/sync/v3/syncDurabilityStore.js +202 -8
  276. package/dist/sync/v3/taskChecklistMutationService.d.ts +11 -0
  277. package/dist/sync/v3/taskChecklistMutationService.js +44 -1
  278. package/dist/sync/v3/taskStatusMutationService.d.ts +29 -1
  279. package/dist/sync/v3/taskStatusMutationService.js +119 -3
  280. package/dist/sync/v3/workflowAssignmentSync.d.ts +5 -0
  281. package/dist/sync/v3/workflowAssignmentSync.js +27 -0
  282. package/dist/sync/v3/workflowRuntimeMutationService.d.ts +5 -0
  283. package/dist/sync/v3/workflowRuntimeMutationService.js +124 -71
  284. package/dist/sync/v3/workspaceSyncJournalReader.js +1 -1
  285. package/dist/sync/v3/workspaceSyncOperationRetentionService.d.ts +16 -0
  286. package/dist/sync/v3/workspaceSyncOperationRetentionService.js +83 -0
  287. package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.d.ts +1 -0
  288. package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.js +9 -2
  289. package/dist/sync/v3/workspaceSyncV3CombinedLocalApply.js +25 -3
  290. package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.d.ts +7 -0
  291. package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.js +44 -32
  292. package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.d.ts +9 -5
  293. package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.js +54 -38
  294. package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.d.ts +10 -0
  295. package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.js +70 -31
  296. package/dist/sync/v3/workspaceSyncV3CombinedWireContract.d.ts +2 -1
  297. package/dist/sync/v3/workspaceSyncV3CombinedWireContract.js +16 -0
  298. package/dist/sync/v3/workspaceSyncV3CoverageRegistry.js +6 -0
  299. package/dist/sync/v3/workspaceSyncV3Feed.d.ts +1 -0
  300. package/dist/sync/v3/workspaceSyncV3Feed.js +6 -1
  301. package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.d.ts +2 -0
  302. package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.js +49 -18
  303. package/dist/sync/v3/workspaceSyncV3OperationProtocol.d.ts +3 -0
  304. package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.d.ts +5 -0
  305. package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.js +36 -2
  306. package/dist/sync/v3/workspaceSyncV3RepairSnapshotRetentionService.d.ts +17 -0
  307. package/dist/sync/v3/workspaceSyncV3RepairSnapshotRetentionService.js +64 -0
  308. package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeApply.d.ts +1 -0
  309. package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeApply.js +50 -5
  310. package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverCoverage.d.ts +7 -0
  311. package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverCoverage.js +33 -0
  312. package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverWireContract.d.ts +7 -0
  313. package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverWireContract.js +8 -0
  314. package/dist/sync/workspaceRepair.d.ts +5 -2
  315. package/dist/sync/workspaceRepair.js +161 -6
  316. package/dist/sync/workspaceSyncModel.d.ts +21 -0
  317. package/dist/sync/workspaceSyncModel.js +35 -7
  318. package/dist/sync/workspaceSyncState.d.ts +1 -0
  319. package/dist/sync/workspaceSyncV2SnapshotBuilder.d.ts +6 -0
  320. package/dist/sync/workspaceSyncV2SnapshotBuilder.js +5 -0
  321. package/dist/ui/assets/AiIdentityRosterCard-CDMPtnbC.js +1 -0
  322. package/dist/ui/assets/AiProfilesModule-Cww85C4E.js +1 -0
  323. package/dist/ui/assets/{AnnotatedAttachmentWorkspace-B68Wg-RV.js → AnnotatedAttachmentWorkspace-Dt9TKYSH.js} +1 -1
  324. package/dist/ui/assets/{AssetTraySortControl-C8Rztyal.js → AssetTraySortControl-CKgapnxu.js} +1 -1
  325. package/dist/ui/assets/{ContextAttachmentManager-Cj3c7X9y.js → ContextAttachmentManager-T-cEVcOZ.js} +2 -2
  326. package/dist/ui/assets/{DocumentWorkspace-B5uvzems.js → DocumentWorkspace-HD4MUjAZ.js} +1 -1
  327. package/dist/ui/assets/{EntityActivityTimeline-BVFvCB5R.js → EntityActivityTimeline-_V0zfMuh.js} +1 -1
  328. package/dist/ui/assets/PlanningModule-mTkBygsB.js +1 -0
  329. package/dist/ui/assets/{PlansPage-AY4cGWco.js → PlansPage-Btiq06VO.js} +1 -1
  330. package/dist/ui/assets/{TaskContextUpload-DZxTVesW.js → TaskContextUpload-C00NVUpn.js} +1 -1
  331. package/dist/ui/assets/TaskSettings-Cp-L-4xh.js +12 -0
  332. package/dist/ui/assets/TaskforceAgentsModule-Coq9-PUp.js +24 -0
  333. package/dist/ui/assets/TaskforceAgentsModule-b-8R25cJ.css +1 -0
  334. package/dist/ui/assets/{WorkflowManagerModule-DEr5di_r.js → WorkflowManagerModule-CuqRzMmM.js} +1 -1
  335. package/dist/ui/assets/index-BZ-hdZSk.css +1 -0
  336. package/dist/ui/assets/index-DSQINwt9.js +7 -0
  337. package/dist/ui/assets/{vendor-icons-D9Lpw-j4.js → vendor-icons-Bsq-mcEn.js} +1 -1
  338. package/dist/ui/branding/logos/letterhead_dark.png +0 -0
  339. package/dist/ui/branding/logos/letterhead_light.png +0 -0
  340. package/dist/ui/branding/logos/signature_dark.png +0 -0
  341. package/dist/ui/branding/logos/signature_light.png +0 -0
  342. package/dist/ui/index.html +3 -3
  343. package/dist/utils/aiProfileDefaultLogo.js +16 -48
  344. package/dist/utils/httpSetCookie.d.ts +1 -0
  345. package/dist/utils/httpSetCookie.js +4 -1
  346. package/dist/utils/localRuntimeUrl.d.ts +1 -0
  347. package/dist/utils/localRuntimeUrl.js +14 -0
  348. package/dist/utils/productLogoRegistry.d.ts +2 -0
  349. package/dist/utils/productLogoRegistry.js +36 -0
  350. package/dist/utils/syncStatusPresentation.d.ts +4 -0
  351. package/dist/utils/syncStatusPresentation.js +17 -0
  352. package/dist/utils/taskEvents.d.ts +2 -0
  353. package/dist/utils/workspaceSyncPresentation.d.ts +1 -1
  354. package/dist/utils/workspaceSyncPresentation.js +23 -17
  355. package/package.json +24 -4
  356. package/dist/ui/assets/AiIdentityRosterCard-BZM4aQnM.js +0 -1
  357. package/dist/ui/assets/AiProfilesModule-BbAEWtHH.js +0 -1
  358. package/dist/ui/assets/PlanningModule-B5DWQOGz.js +0 -1
  359. package/dist/ui/assets/TaskSettings-BeWAuyZj.js +0 -12
  360. package/dist/ui/assets/TaskforceAgentsModule-BifCYtjR.js +0 -21
  361. package/dist/ui/assets/TaskforceAgentsModule-D6IC0S7Q.css +0 -1
  362. package/dist/ui/assets/index-I5zhdtgt.js +0 -7
  363. package/dist/ui/assets/index-VRFsx3wz.css +0 -1
@@ -0,0 +1,93 @@
1
+ import type { GitHubReviewEvidenceInstallationBinding } from '../storage/githubReviewEvidenceInstallationStore.js';
2
+ export type GitHubReviewEvidenceErrorCode = 'github_app_not_configured' | 'github_installation_not_bound' | 'github_installation_unavailable' | 'github_installation_revoked' | 'github_permission_denied' | 'github_rate_limited' | 'github_repository_unavailable' | 'github_evidence_mismatch' | 'github_pull_request_not_reviewable' | 'github_request_timed_out';
3
+ export declare class GitHubReviewEvidenceError extends Error {
4
+ readonly code: GitHubReviewEvidenceErrorCode;
5
+ readonly statusCode: number;
6
+ readonly retryAfterSeconds: number | null;
7
+ constructor(message: string, code: GitHubReviewEvidenceErrorCode, statusCode: number, retryAfterSeconds?: number | null);
8
+ }
9
+ export interface GitHubReviewAppConfig {
10
+ appId: string;
11
+ privateKey: string;
12
+ }
13
+ export interface GitHubInstallationInspection {
14
+ installationId: string;
15
+ accountId: string;
16
+ accountLogin: string;
17
+ accountType: string;
18
+ repositorySelection: string;
19
+ }
20
+ export interface GitHubReviewEvidenceRequest {
21
+ workspaceId: string;
22
+ repositoryFullName: string;
23
+ commitSha: string;
24
+ pullRequestNumber: number;
25
+ expectedBaseRef?: string | null;
26
+ expectedHeadRef?: string | null;
27
+ integrationBranch?: string | null;
28
+ }
29
+ export interface VerifiedGitHubReviewEvidence {
30
+ repository: {
31
+ id: string;
32
+ fullName: string;
33
+ private: boolean;
34
+ defaultBranch: string;
35
+ };
36
+ commit: {
37
+ sha: string;
38
+ };
39
+ pullRequest: {
40
+ number: number;
41
+ state: string;
42
+ merged: boolean;
43
+ mergeCommitSha: string | null;
44
+ head: {
45
+ ref: string;
46
+ sha: string;
47
+ };
48
+ base: {
49
+ ref: string;
50
+ sha: string;
51
+ };
52
+ };
53
+ integration: {
54
+ branch: string;
55
+ comparisonStatus: 'ahead' | 'identical';
56
+ containsCommit: true;
57
+ } | null;
58
+ verifiedAt: string;
59
+ }
60
+ export interface GitHubReviewEvidenceVerifier {
61
+ verify(request: GitHubReviewEvidenceRequest): Promise<VerifiedGitHubReviewEvidence>;
62
+ }
63
+ interface GitHubReviewEvidenceServiceOptions {
64
+ config: GitHubReviewAppConfig | null;
65
+ getBinding: (workspaceId: string) => GitHubReviewEvidenceInstallationBinding | null;
66
+ fetchImpl?: typeof fetch;
67
+ apiBaseUrl?: string;
68
+ timeoutMs?: number;
69
+ now?: () => Date;
70
+ audit?: (event: {
71
+ action: 'github.review-evidence.verify.succeeded' | 'github.review-evidence.verify.failed';
72
+ workspaceId: string;
73
+ repositoryFullName: string;
74
+ commitSha: string;
75
+ pullRequestNumber: number;
76
+ code?: GitHubReviewEvidenceErrorCode;
77
+ }) => void;
78
+ }
79
+ export declare function resolveGitHubReviewAppConfig(env?: NodeJS.ProcessEnv): GitHubReviewAppConfig | null;
80
+ export declare class GitHubReviewEvidenceService implements GitHubReviewEvidenceVerifier {
81
+ private readonly options;
82
+ private readonly fetchImpl;
83
+ private readonly apiBaseUrl;
84
+ private readonly timeoutMs;
85
+ private readonly now;
86
+ constructor(options: GitHubReviewEvidenceServiceOptions);
87
+ private requireConfig;
88
+ private requestJson;
89
+ inspectInstallation(installationId: string): Promise<GitHubInstallationInspection>;
90
+ private mintRepositoryToken;
91
+ verify(request: GitHubReviewEvidenceRequest): Promise<VerifiedGitHubReviewEvidence>;
92
+ }
93
+ export {};
@@ -0,0 +1,336 @@
1
+ import { sign } from 'crypto';
2
+ const DEFAULT_API_BASE_URL = 'https://api.github.com';
3
+ const API_VERSION = '2026-03-10';
4
+ const DEFAULT_TIMEOUT_MS = 10_000;
5
+ const MAX_GITHUB_RESPONSE_BYTES = 2 * 1024 * 1024;
6
+ export class GitHubReviewEvidenceError extends Error {
7
+ code;
8
+ statusCode;
9
+ retryAfterSeconds;
10
+ constructor(message, code, statusCode, retryAfterSeconds = null) {
11
+ super(message);
12
+ this.code = code;
13
+ this.statusCode = statusCode;
14
+ this.retryAfterSeconds = retryAfterSeconds;
15
+ this.name = 'GitHubReviewEvidenceError';
16
+ }
17
+ }
18
+ export function resolveGitHubReviewAppConfig(env = process.env) {
19
+ const appId = String(env.TASKFORCE_GITHUB_REVIEW_APP_ID || '').trim();
20
+ const encodedPrivateKey = String(env.TASKFORCE_GITHUB_REVIEW_APP_PRIVATE_KEY_BASE64 || '').trim();
21
+ const privateKey = encodedPrivateKey ? Buffer.from(encodedPrivateKey, 'base64').toString('utf8') : '';
22
+ return appId && privateKey ? { appId, privateKey } : null;
23
+ }
24
+ function createAppJwt(config, now) {
25
+ const issuedAt = Math.floor(now.getTime() / 1_000) - 60;
26
+ const header = Buffer.from(JSON.stringify({ alg: 'RS256', typ: 'JWT' })).toString('base64url');
27
+ const payload = Buffer.from(JSON.stringify({
28
+ iat: issuedAt,
29
+ exp: issuedAt + 9 * 60,
30
+ iss: config.appId,
31
+ })).toString('base64url');
32
+ const signingInput = `${header}.${payload}`;
33
+ try {
34
+ const signature = sign('RSA-SHA256', Buffer.from(signingInput), config.privateKey).toString('base64url');
35
+ return `${signingInput}.${signature}`;
36
+ }
37
+ catch {
38
+ throw new GitHubReviewEvidenceError('GitHub review verification is not configured correctly.', 'github_app_not_configured', 503);
39
+ }
40
+ }
41
+ function requiredString(value, label, maxLength = 255) {
42
+ const normalized = String(value || '').trim();
43
+ if (!normalized || normalized.length > maxLength || /[\u0000-\u001f\u007f]/.test(normalized)) {
44
+ throw new GitHubReviewEvidenceError(`${label} is invalid.`, 'github_evidence_mismatch', 400);
45
+ }
46
+ return normalized;
47
+ }
48
+ function normalizeRepositoryFullName(value) {
49
+ const fullName = requiredString(value, 'repositoryFullName', 201);
50
+ const parts = fullName.split('/');
51
+ if (parts.length !== 2 || !/^[A-Za-z0-9](?:[A-Za-z0-9-]{0,38})$/.test(parts[0]) || !/^[A-Za-z0-9._-]{1,100}$/.test(parts[1])) {
52
+ throw new GitHubReviewEvidenceError('repositoryFullName is invalid.', 'github_evidence_mismatch', 400);
53
+ }
54
+ return { owner: parts[0], name: parts[1], fullName };
55
+ }
56
+ function normalizeSha(value) {
57
+ const sha = String(value || '').trim().toLowerCase();
58
+ if (!/^[0-9a-f]{40}$/.test(sha)) {
59
+ throw new GitHubReviewEvidenceError('commitSha must be a full 40-character SHA.', 'github_evidence_mismatch', 400);
60
+ }
61
+ return sha;
62
+ }
63
+ function retryAfterSeconds(response) {
64
+ const raw = Number(response.headers.get('retry-after'));
65
+ if (Number.isFinite(raw) && raw > 0)
66
+ return Math.ceil(raw);
67
+ const reset = Number(response.headers.get('x-ratelimit-reset'));
68
+ if (Number.isFinite(reset) && reset > 0)
69
+ return Math.max(1, Math.ceil(reset - Date.now() / 1_000));
70
+ return null;
71
+ }
72
+ function mapGitHubHttpError(response, installationRequest) {
73
+ if (response.status === 401) {
74
+ return new GitHubReviewEvidenceError('The GitHub App installation is no longer authorized.', 'github_installation_revoked', 503);
75
+ }
76
+ if (response.status === 429
77
+ || (response.status === 403 && (response.headers.get('x-ratelimit-remaining') === '0'
78
+ || response.headers.has('retry-after')))) {
79
+ return new GitHubReviewEvidenceError('GitHub verification is temporarily rate limited.', 'github_rate_limited', 503, retryAfterSeconds(response));
80
+ }
81
+ if (response.status === 403) {
82
+ return new GitHubReviewEvidenceError('The GitHub App installation lacks a required read permission.', 'github_permission_denied', 503);
83
+ }
84
+ if (response.status === 404) {
85
+ if (installationRequest) {
86
+ return new GitHubReviewEvidenceError('The GitHub App installation is no longer authorized.', 'github_installation_revoked', 503);
87
+ }
88
+ return new GitHubReviewEvidenceError('The repository or evidence is unavailable to this GitHub App installation.', 'github_repository_unavailable', 422);
89
+ }
90
+ if (response.status === 422) {
91
+ return new GitHubReviewEvidenceError('The repository or evidence is unavailable to this GitHub App installation.', 'github_repository_unavailable', 422);
92
+ }
93
+ return new GitHubReviewEvidenceError('GitHub verification is temporarily unavailable.', 'github_installation_unavailable', 503);
94
+ }
95
+ async function readBoundedJson(response) {
96
+ const contentLength = Number(response.headers.get('content-length'));
97
+ if (Number.isFinite(contentLength) && contentLength > MAX_GITHUB_RESPONSE_BYTES) {
98
+ throw new GitHubReviewEvidenceError('GitHub returned an invalid verification response.', 'github_installation_unavailable', 503);
99
+ }
100
+ if (!response.body) {
101
+ throw new GitHubReviewEvidenceError('GitHub returned an invalid verification response.', 'github_installation_unavailable', 503);
102
+ }
103
+ const reader = response.body.getReader();
104
+ const chunks = [];
105
+ let size = 0;
106
+ try {
107
+ while (true) {
108
+ const { value, done } = await reader.read();
109
+ if (done)
110
+ break;
111
+ if (!value)
112
+ continue;
113
+ size += value.byteLength;
114
+ if (size > MAX_GITHUB_RESPONSE_BYTES) {
115
+ await reader.cancel();
116
+ throw new GitHubReviewEvidenceError('GitHub returned an invalid verification response.', 'github_installation_unavailable', 503);
117
+ }
118
+ chunks.push(value);
119
+ }
120
+ const body = Buffer.concat(chunks.map((chunk) => Buffer.from(chunk))).toString('utf8');
121
+ return JSON.parse(body);
122
+ }
123
+ catch (error) {
124
+ if (error instanceof GitHubReviewEvidenceError)
125
+ throw error;
126
+ throw new GitHubReviewEvidenceError('GitHub returned an invalid verification response.', 'github_installation_unavailable', 503);
127
+ }
128
+ finally {
129
+ reader.releaseLock();
130
+ }
131
+ }
132
+ export class GitHubReviewEvidenceService {
133
+ options;
134
+ fetchImpl;
135
+ apiBaseUrl;
136
+ timeoutMs;
137
+ now;
138
+ constructor(options) {
139
+ this.options = options;
140
+ this.fetchImpl = options.fetchImpl || fetch;
141
+ this.apiBaseUrl = String(options.apiBaseUrl || DEFAULT_API_BASE_URL).replace(/\/$/, '');
142
+ this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
143
+ this.now = options.now || (() => new Date());
144
+ }
145
+ requireConfig() {
146
+ if (!this.options.config) {
147
+ throw new GitHubReviewEvidenceError('GitHub review verification is not configured.', 'github_app_not_configured', 503);
148
+ }
149
+ return this.options.config;
150
+ }
151
+ async requestJson(path, init, installationRequest = false) {
152
+ const controller = new AbortController();
153
+ const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
154
+ try {
155
+ const response = await this.fetchImpl(`${this.apiBaseUrl}${path}`, {
156
+ ...init,
157
+ signal: controller.signal,
158
+ headers: {
159
+ Accept: 'application/vnd.github+json',
160
+ 'X-GitHub-Api-Version': API_VERSION,
161
+ 'User-Agent': 'taskforce-review-evidence',
162
+ ...(init.headers || {}),
163
+ },
164
+ });
165
+ if (!response.ok)
166
+ throw mapGitHubHttpError(response, installationRequest);
167
+ return await readBoundedJson(response);
168
+ }
169
+ catch (error) {
170
+ if (error instanceof GitHubReviewEvidenceError)
171
+ throw error;
172
+ if (error?.name === 'AbortError') {
173
+ throw new GitHubReviewEvidenceError('GitHub verification timed out.', 'github_request_timed_out', 503);
174
+ }
175
+ throw new GitHubReviewEvidenceError('GitHub verification is temporarily unavailable.', 'github_installation_unavailable', 503);
176
+ }
177
+ finally {
178
+ clearTimeout(timeout);
179
+ }
180
+ }
181
+ async inspectInstallation(installationId) {
182
+ const config = this.requireConfig();
183
+ const normalizedInstallationId = String(installationId || '').trim();
184
+ if (!/^\d+$/.test(normalizedInstallationId)) {
185
+ throw new GitHubReviewEvidenceError('installationId must be a numeric GitHub installation ID.', 'github_evidence_mismatch', 400);
186
+ }
187
+ const response = await this.requestJson(`/app/installations/${normalizedInstallationId}`, {
188
+ method: 'GET',
189
+ headers: { Authorization: `Bearer ${createAppJwt(config, this.now())}` },
190
+ }, true);
191
+ if (response.suspended_at) {
192
+ throw new GitHubReviewEvidenceError('The GitHub App installation is suspended.', 'github_installation_revoked', 503);
193
+ }
194
+ const permissions = response.permissions || {};
195
+ if (permissions.contents !== 'read' || permissions.pull_requests !== 'read' || permissions.metadata !== 'read') {
196
+ throw new GitHubReviewEvidenceError('The GitHub App installation lacks required read permissions.', 'github_permission_denied', 503);
197
+ }
198
+ const accountId = String(response.account?.id || '').trim();
199
+ const accountLogin = String(response.account?.login || '').trim();
200
+ if (!accountId || !accountLogin) {
201
+ throw new GitHubReviewEvidenceError('The GitHub App installation metadata is incomplete.', 'github_installation_unavailable', 503);
202
+ }
203
+ return {
204
+ installationId: String(response.id || normalizedInstallationId),
205
+ accountId,
206
+ accountLogin,
207
+ accountType: String(response.account?.type || 'unknown'),
208
+ repositorySelection: String(response.repository_selection || 'selected'),
209
+ };
210
+ }
211
+ async mintRepositoryToken(binding, repositoryName) {
212
+ const config = this.requireConfig();
213
+ const response = await this.requestJson(`/app/installations/${binding.installationId}/access_tokens`, {
214
+ method: 'POST',
215
+ headers: {
216
+ Authorization: `Bearer ${createAppJwt(config, this.now())}`,
217
+ 'Content-Type': 'application/json',
218
+ },
219
+ body: JSON.stringify({
220
+ repositories: [repositoryName],
221
+ permissions: { metadata: 'read', contents: 'read', pull_requests: 'read' },
222
+ }),
223
+ }, true);
224
+ const token = String(response.token || '').trim();
225
+ if (!token) {
226
+ throw new GitHubReviewEvidenceError('GitHub did not issue an installation token.', 'github_installation_unavailable', 503);
227
+ }
228
+ return token;
229
+ }
230
+ async verify(request) {
231
+ const workspaceId = requiredString(request.workspaceId, 'workspaceId');
232
+ const repository = normalizeRepositoryFullName(request.repositoryFullName);
233
+ const commitSha = normalizeSha(request.commitSha);
234
+ const pullRequestNumber = Number(request.pullRequestNumber);
235
+ if (!Number.isSafeInteger(pullRequestNumber) || pullRequestNumber < 1) {
236
+ throw new GitHubReviewEvidenceError('pullRequestNumber must be a positive integer.', 'github_evidence_mismatch', 400);
237
+ }
238
+ try {
239
+ const binding = this.options.getBinding(workspaceId);
240
+ if (!binding) {
241
+ throw new GitHubReviewEvidenceError('This workspace has no GitHub App installation binding.', 'github_installation_not_bound', 409);
242
+ }
243
+ const token = await this.mintRepositoryToken(binding, repository.name);
244
+ const authorization = { Authorization: `Bearer ${token}` };
245
+ const repoPath = `/repos/${encodeURIComponent(repository.owner)}/${encodeURIComponent(repository.name)}`;
246
+ const [repo, commit, pullRequest] = await Promise.all([
247
+ this.requestJson(repoPath, { method: 'GET', headers: authorization }),
248
+ this.requestJson(`${repoPath}/commits/${commitSha}`, { method: 'GET', headers: authorization }),
249
+ this.requestJson(`${repoPath}/pulls/${pullRequestNumber}`, { method: 'GET', headers: authorization }),
250
+ ]);
251
+ const actualRepo = String(repo.full_name || '').trim();
252
+ const actualCommitSha = String(commit.sha || '').trim().toLowerCase();
253
+ const headSha = String(pullRequest.head?.sha || '').trim().toLowerCase();
254
+ const headRef = String(pullRequest.head?.ref || '').trim();
255
+ const baseRef = String(pullRequest.base?.ref || '').trim();
256
+ const baseSha = String(pullRequest.base?.sha || '').trim().toLowerCase();
257
+ const headRepo = String(pullRequest.head?.repo?.full_name || '').trim();
258
+ const baseRepo = String(pullRequest.base?.repo?.full_name || '').trim();
259
+ if (actualRepo.toLowerCase() !== repository.fullName.toLowerCase()
260
+ || actualCommitSha !== commitSha
261
+ || Number(pullRequest.number) !== pullRequestNumber
262
+ || headSha !== commitSha
263
+ || headRepo.toLowerCase() !== repository.fullName.toLowerCase()
264
+ || baseRepo.toLowerCase() !== repository.fullName.toLowerCase()
265
+ || !/^[0-9a-f]{40}$/.test(baseSha)) {
266
+ throw new GitHubReviewEvidenceError('GitHub repository, commit, or pull-request evidence does not match the requested immutable identity.', 'github_evidence_mismatch', 422);
267
+ }
268
+ if (request.expectedHeadRef && headRef !== requiredString(request.expectedHeadRef, 'expectedHeadRef')) {
269
+ throw new GitHubReviewEvidenceError('The pull-request head branch does not match the expected branch.', 'github_evidence_mismatch', 422);
270
+ }
271
+ if (request.expectedBaseRef && baseRef !== requiredString(request.expectedBaseRef, 'expectedBaseRef')) {
272
+ throw new GitHubReviewEvidenceError('The pull-request base branch does not match the expected branch.', 'github_evidence_mismatch', 422);
273
+ }
274
+ const state = String(pullRequest.state || '').trim().toLowerCase();
275
+ const merged = pullRequest.merged === true;
276
+ if (state === 'closed' && !merged) {
277
+ throw new GitHubReviewEvidenceError('A closed, unmerged pull request is not valid review evidence.', 'github_pull_request_not_reviewable', 422);
278
+ }
279
+ let integration = null;
280
+ if (request.integrationBranch) {
281
+ const branch = requiredString(request.integrationBranch, 'integrationBranch');
282
+ const comparison = await this.requestJson(`${repoPath}/compare/${commitSha}...${encodeURIComponent(branch)}`, { method: 'GET', headers: authorization });
283
+ const comparisonStatus = String(comparison.status || '').trim().toLowerCase();
284
+ if (comparisonStatus !== 'ahead' && comparisonStatus !== 'identical') {
285
+ throw new GitHubReviewEvidenceError('The requested commit is not reachable from the integration branch.', 'github_evidence_mismatch', 422);
286
+ }
287
+ integration = {
288
+ branch,
289
+ comparisonStatus,
290
+ containsCommit: true,
291
+ };
292
+ }
293
+ const result = {
294
+ repository: {
295
+ id: String(repo.id || ''),
296
+ fullName: actualRepo,
297
+ private: repo.private === true,
298
+ defaultBranch: String(repo.default_branch || ''),
299
+ },
300
+ commit: { sha: actualCommitSha },
301
+ pullRequest: {
302
+ number: Number(pullRequest.number || pullRequestNumber),
303
+ state,
304
+ merged,
305
+ mergeCommitSha: pullRequest.merge_commit_sha ? String(pullRequest.merge_commit_sha).toLowerCase() : null,
306
+ head: { ref: headRef, sha: headSha },
307
+ base: { ref: baseRef, sha: baseSha },
308
+ },
309
+ integration,
310
+ verifiedAt: this.now().toISOString(),
311
+ };
312
+ this.options.audit?.({
313
+ action: 'github.review-evidence.verify.succeeded',
314
+ workspaceId,
315
+ repositoryFullName: repository.fullName,
316
+ commitSha,
317
+ pullRequestNumber,
318
+ });
319
+ return result;
320
+ }
321
+ catch (error) {
322
+ const normalized = error instanceof GitHubReviewEvidenceError
323
+ ? error
324
+ : new GitHubReviewEvidenceError('GitHub verification is temporarily unavailable.', 'github_installation_unavailable', 503);
325
+ this.options.audit?.({
326
+ action: 'github.review-evidence.verify.failed',
327
+ workspaceId,
328
+ repositoryFullName: repository.fullName,
329
+ commitSha,
330
+ pullRequestNumber,
331
+ code: normalized.code,
332
+ });
333
+ throw normalized;
334
+ }
335
+ }
336
+ }
@@ -11,6 +11,7 @@ export interface ModelGatewaySelection {
11
11
  actorUserId?: string | null;
12
12
  connectionScope?: TaskforceAgentConnectionScope;
13
13
  connectionId?: string | null;
14
+ connectionOwnerUserId?: string | null;
14
15
  }
15
16
  export interface ModelProviderCredentialResolution {
16
17
  source: TaskforceAgentModelSource;
@@ -76,6 +77,12 @@ export interface ModelGatewayGenerateResult {
76
77
  stopReason?: string;
77
78
  usage?: ModelGatewayUsage;
78
79
  latencyMs?: number;
80
+ sourceMetadata?: {
81
+ modelSource: TaskforceAgentModelSource;
82
+ connectionScope?: TaskforceAgentConnectionScope;
83
+ providerKey: string;
84
+ billable: boolean;
85
+ };
79
86
  }
80
87
  export interface ModelGateway {
81
88
  generate(input: ModelGatewayGenerateInput): Promise<ModelGatewayGenerateResult>;
@@ -0,0 +1,71 @@
1
+ import type { ModelProviderConnectionDisplayMetadata, ModelProviderConnectionRecord, ModelProviderConnectionLease, ModelProviderConnectionStore } from '../storage/modelProviderConnectionStore.js';
2
+ import type { ModelProviderCredentialHomeManager } from './modelProviderCredentialHome.js';
3
+ export interface PublicModelProviderConnection {
4
+ id: string;
5
+ providerKey: string;
6
+ authenticationType: string;
7
+ lifecycleStatus: ModelProviderConnectionRecord['lifecycleStatus'];
8
+ displayMetadata: ModelProviderConnectionDisplayMetadata;
9
+ lastVerifiedAt: string | null;
10
+ lastRefreshedAt: string | null;
11
+ failureCode: string | null;
12
+ createdAt: string;
13
+ updatedAt: string;
14
+ }
15
+ export interface ModelProviderConnectionOperationContext {
16
+ connection: ModelProviderConnectionRecord;
17
+ environment: NodeJS.ProcessEnv;
18
+ lease: ModelProviderConnectionLease;
19
+ signal: AbortSignal;
20
+ }
21
+ export type ModelProviderConnectionOperation = (context: ModelProviderConnectionOperationContext) => Promise<{
22
+ displayMetadata?: unknown;
23
+ } | void>;
24
+ export interface ModelProviderConnectionLifecycleHandlers {
25
+ verify?: ModelProviderConnectionOperation;
26
+ refresh?: ModelProviderConnectionOperation;
27
+ disconnect?: ModelProviderConnectionOperation;
28
+ }
29
+ export declare class ModelProviderConnectionService {
30
+ private readonly store;
31
+ private readonly credentialHomes;
32
+ private readonly hasGrant;
33
+ private readonly supportedConnectionTypes;
34
+ private readonly handlers;
35
+ constructor(store: ModelProviderConnectionStore, credentialHomes: ModelProviderCredentialHomeManager, hasGrant: (userId: string) => boolean, handlers?: Array<{
36
+ providerKey: string;
37
+ authenticationType: string;
38
+ lifecycle: ModelProviderConnectionLifecycleHandlers;
39
+ }>, supportedConnectionTypes?: Array<{
40
+ providerKey: string;
41
+ authenticationType: string;
42
+ }>);
43
+ create(input: {
44
+ ownerUserId: string;
45
+ providerKey: string;
46
+ authenticationType: string;
47
+ }): PublicModelProviderConnection;
48
+ list(ownerUserId: string): PublicModelProviderConnection[];
49
+ get(ownerUserId: string, connectionId: string): PublicModelProviderConnection;
50
+ rename(ownerUserId: string, connectionId: string, displayName: unknown): PublicModelProviderConnection;
51
+ verify(ownerUserId: string, connectionId: string): Promise<PublicModelProviderConnection>;
52
+ refresh(ownerUserId: string, connectionId: string): Promise<PublicModelProviderConnection>;
53
+ disconnect(ownerUserId: string, connectionId: string): Promise<PublicModelProviderConnection>;
54
+ cleanup(ownerUserId: string, connectionId: string): Promise<{
55
+ id: string;
56
+ deleted: true;
57
+ }>;
58
+ withConnectionLease<T>(input: {
59
+ ownerUserId: string;
60
+ connectionId: string;
61
+ operation: 'login' | 'verify' | 'refresh' | 'invoke' | 'disconnect';
62
+ requireGrant?: boolean;
63
+ leaseDurationMs?: number;
64
+ }, callback: (context: ModelProviderConnectionOperationContext) => Promise<T>): Promise<T>;
65
+ assertReady(ownerUserId: string, connectionId: string): ModelProviderConnectionRecord;
66
+ private runWithConnectionLease;
67
+ private runOperation;
68
+ private assertGranted;
69
+ private assertOperationAvailable;
70
+ private assertOwner;
71
+ }