@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,75 @@
1
+ import { type KeyObject } from 'node:crypto';
2
+ import { type ExecutorPhaseAApprovalReceipt } from './executorPhaseAApprovalReceipt.js';
3
+ import { type ExecutorPhaseARunCapability, type ExecutorPhaseASenderProof, type ExecutorPhaseAWorkloadGrant } from './executorPhaseARunAuthorization.js';
4
+ export declare const EXECUTOR_PHASE_A_ISSUER_REDEMPTION_PATH: "/api/taskforce/internal/executor/phase-a/redemptions";
5
+ export declare const EXECUTOR_PHASE_A_ISSUER_REDEMPTION_REQUEST_SCHEMA: "taskforce.executor-phase-a-issuer-redemption-request/v1";
6
+ export declare const EXECUTOR_PHASE_A_ISSUER_PROOF_PAYLOAD_SCHEMA: "taskforce.executor-phase-a-issuer-proof-payload/v1";
7
+ export declare const EXECUTOR_PHASE_A_ISSUER_PROOF_SCHEMA: "taskforce.executor-phase-a-issuer-proof/v1";
8
+ export declare const EXECUTOR_PHASE_A_ISSUER_PROOF_TYPE: "TF-ISSUER-PROOF";
9
+ export declare const EXECUTOR_PHASE_A_ISSUER_REDEMPTION_RESPONSE_PAYLOAD_SCHEMA: "taskforce.executor-phase-a-issuer-redemption-response-payload/v1";
10
+ export declare const EXECUTOR_PHASE_A_ISSUER_PROOF_DOMAIN: Buffer<ArrayBuffer>;
11
+ export declare const EXECUTOR_PHASE_A_ISSUER_PROOF_TTL_MS = 60000;
12
+ export interface ExecutorPhaseAIssuerProofPayload {
13
+ schema: typeof EXECUTOR_PHASE_A_ISSUER_PROOF_PAYLOAD_SCHEMA;
14
+ method: 'POST';
15
+ path: typeof EXECUTOR_PHASE_A_ISSUER_REDEMPTION_PATH;
16
+ requestSha256: string;
17
+ grantId: string;
18
+ grantSha256: string;
19
+ senderProofSha256: string;
20
+ requestId: string;
21
+ issuedAt: string;
22
+ expiresAt: string;
23
+ }
24
+ export interface ExecutorPhaseAIssuerProof {
25
+ payload: ExecutorPhaseAIssuerProofPayload;
26
+ envelope: {
27
+ schema: typeof EXECUTOR_PHASE_A_ISSUER_PROOF_SCHEMA;
28
+ typ: typeof EXECUTOR_PHASE_A_ISSUER_PROOF_TYPE;
29
+ algorithm: 'RS256';
30
+ keyId: string;
31
+ payloadSha256: string;
32
+ signature: string;
33
+ };
34
+ }
35
+ export interface ExecutorPhaseAIssuerRedemptionRequest {
36
+ schema: typeof EXECUTOR_PHASE_A_ISSUER_REDEMPTION_REQUEST_SCHEMA;
37
+ requestId: string;
38
+ approvalReceipt: ExecutorPhaseAApprovalReceipt;
39
+ runCapability: ExecutorPhaseARunCapability;
40
+ workloadGrant: ExecutorPhaseAWorkloadGrant;
41
+ senderProof: ExecutorPhaseASenderProof;
42
+ brokerRequestSha256: string;
43
+ expectedPolicySha256: string;
44
+ issuerProof: ExecutorPhaseAIssuerProof;
45
+ }
46
+ export interface ExecutorPhaseAIssuerRedemptionResponsePayload {
47
+ schema: typeof EXECUTOR_PHASE_A_ISSUER_REDEMPTION_RESPONSE_PAYLOAD_SCHEMA;
48
+ decision: 'redeemed';
49
+ requestId: string;
50
+ grantId: string;
51
+ grantSha256: string;
52
+ senderProofSha256: string;
53
+ auditSha256: string;
54
+ redeemedAt: string;
55
+ }
56
+ export interface ExecutorPhaseAIssuerRedemptionResponse {
57
+ payload: ExecutorPhaseAIssuerRedemptionResponsePayload;
58
+ envelope: {
59
+ algorithm: 'Ed25519';
60
+ keyId: string;
61
+ payloadSha256: string;
62
+ signature: string;
63
+ };
64
+ }
65
+ export interface ExecutorPhaseAIssuerProofTrustKey {
66
+ keyId: string;
67
+ publicKeySpkiBase64: string;
68
+ status: 'active' | 'retiring' | 'disabled';
69
+ validFrom: string;
70
+ validUntil: string;
71
+ }
72
+ export declare function executorPhaseAIssuerRedemptionIntentSha256(request: Pick<ExecutorPhaseAIssuerRedemptionRequest, 'requestId' | 'approvalReceipt' | 'runCapability' | 'workloadGrant' | 'senderProof' | 'brokerRequestSha256' | 'expectedPolicySha256'>): string;
73
+ export declare function executorPhaseAIssuerProofSignedBytes(payload: ExecutorPhaseAIssuerProofPayload): Buffer;
74
+ export declare function verifyExecutorPhaseAIssuerProof(request: ExecutorPhaseAIssuerRedemptionRequest, trustedKeys: readonly ExecutorPhaseAIssuerProofTrustKey[], now?: Date): KeyObject;
75
+ export declare function executorPhaseAIssuerRedemptionAuditSha256(payload: Omit<ExecutorPhaseAIssuerRedemptionResponsePayload, 'schema' | 'decision' | 'auditSha256'>): string;
@@ -0,0 +1,90 @@
1
+ import { createHash, createPublicKey, verify } from 'node:crypto';
2
+ import { canonicalizeExecutorPhaseAJson, } from './executorPhaseAApprovalReceipt.js';
3
+ import { assertExecutorPhaseASchema } from './executorPhaseASchemaValidation.js';
4
+ import { EXECUTOR_PHASE_A_CROSS_SERVICE_CLOCK_SKEW_MS } from './executorPhaseATiming.js';
5
+ export const EXECUTOR_PHASE_A_ISSUER_REDEMPTION_PATH = '/api/taskforce/internal/executor/phase-a/redemptions';
6
+ export const EXECUTOR_PHASE_A_ISSUER_REDEMPTION_REQUEST_SCHEMA = 'taskforce.executor-phase-a-issuer-redemption-request/v1';
7
+ export const EXECUTOR_PHASE_A_ISSUER_PROOF_PAYLOAD_SCHEMA = 'taskforce.executor-phase-a-issuer-proof-payload/v1';
8
+ export const EXECUTOR_PHASE_A_ISSUER_PROOF_SCHEMA = 'taskforce.executor-phase-a-issuer-proof/v1';
9
+ export const EXECUTOR_PHASE_A_ISSUER_PROOF_TYPE = 'TF-ISSUER-PROOF';
10
+ export const EXECUTOR_PHASE_A_ISSUER_REDEMPTION_RESPONSE_PAYLOAD_SCHEMA = 'taskforce.executor-phase-a-issuer-redemption-response-payload/v1';
11
+ export const EXECUTOR_PHASE_A_ISSUER_PROOF_DOMAIN = Buffer.from('taskforce.phase-a.issuer-proof.v1\n', 'ascii');
12
+ export const EXECUTOR_PHASE_A_ISSUER_PROOF_TTL_MS = 60_000;
13
+ function artifactSha256(value) {
14
+ return createHash('sha256').update(canonicalizeExecutorPhaseAJson(value)).digest('hex');
15
+ }
16
+ function timestamp(value, field) {
17
+ const parsed = Date.parse(value);
18
+ if (!Number.isFinite(parsed))
19
+ throw new TypeError(`${field} is invalid.`);
20
+ return parsed;
21
+ }
22
+ export function executorPhaseAIssuerRedemptionIntentSha256(request) {
23
+ return artifactSha256({
24
+ schema: 'taskforce.executor-phase-a-issuer-redemption-intent/v1',
25
+ requestId: request.requestId,
26
+ receiptSha256: artifactSha256(request.approvalReceipt),
27
+ capabilityId: request.runCapability.payload.capabilityId,
28
+ capabilitySha256: artifactSha256(request.runCapability),
29
+ grantId: request.workloadGrant.payload.grantId,
30
+ grantSha256: artifactSha256(request.workloadGrant),
31
+ senderProofSha256: artifactSha256(request.senderProof),
32
+ brokerRequestSha256: request.brokerRequestSha256,
33
+ phase: request.workloadGrant.payload.phase,
34
+ policySha256: request.expectedPolicySha256,
35
+ });
36
+ }
37
+ export function executorPhaseAIssuerProofSignedBytes(payload) {
38
+ return Buffer.concat([EXECUTOR_PHASE_A_ISSUER_PROOF_DOMAIN, canonicalizeExecutorPhaseAJson(payload)]);
39
+ }
40
+ export function verifyExecutorPhaseAIssuerProof(request, trustedKeys, now = new Date()) {
41
+ assertExecutorPhaseASchema('issuerRedemptionRequest', request);
42
+ const proof = request.issuerProof;
43
+ const key = trustedKeys.find((candidate) => candidate.keyId === proof.envelope.keyId);
44
+ const nowMs = now.getTime();
45
+ if (!key || key.status === 'disabled' || nowMs < timestamp(key.validFrom, 'key.validFrom')
46
+ || nowMs >= timestamp(key.validUntil, 'key.validUntil')) {
47
+ throw new TypeError('The issuer proof key is not trusted at redemption time.');
48
+ }
49
+ const publicKeyDer = Buffer.from(key.publicKeySpkiBase64, 'base64');
50
+ if (publicKeyDer.toString('base64') !== key.publicKeySpkiBase64) {
51
+ throw new TypeError('The issuer proof key must use canonical base64 SPKI.');
52
+ }
53
+ const publicKey = createPublicKey({
54
+ key: publicKeyDer,
55
+ format: 'der',
56
+ type: 'spki',
57
+ });
58
+ if (publicKey.asymmetricKeyType !== 'rsa' || publicKey.asymmetricKeyDetails?.modulusLength !== 2048) {
59
+ throw new TypeError('The issuer proof key must be RSA-2048.');
60
+ }
61
+ const signedBytes = executorPhaseAIssuerProofSignedBytes(proof.payload);
62
+ const signature = Buffer.from(proof.envelope.signature, 'base64url');
63
+ const issuedAt = timestamp(proof.payload.issuedAt, 'issuerProof.issuedAt');
64
+ const expiresAt = timestamp(proof.payload.expiresAt, 'issuerProof.expiresAt');
65
+ const requestSha256 = executorPhaseAIssuerRedemptionIntentSha256(request);
66
+ const grantSha256 = artifactSha256(request.workloadGrant);
67
+ const senderProofSha256 = artifactSha256(request.senderProof);
68
+ if (proof.payload.requestId !== request.requestId
69
+ || proof.payload.requestSha256 !== requestSha256
70
+ || proof.payload.grantId !== request.workloadGrant.payload.grantId
71
+ || proof.payload.grantSha256 !== grantSha256
72
+ || proof.payload.senderProofSha256 !== senderProofSha256
73
+ || request.senderProof.payload.requestSha256 !== request.brokerRequestSha256
74
+ || proof.envelope.payloadSha256 !== createHash('sha256').update(signedBytes).digest('hex')
75
+ || signature.length !== 256 || signature.toString('base64url') !== proof.envelope.signature
76
+ || issuedAt > nowMs + EXECUTOR_PHASE_A_CROSS_SERVICE_CLOCK_SKEW_MS
77
+ || nowMs >= expiresAt + EXECUTOR_PHASE_A_CROSS_SERVICE_CLOCK_SKEW_MS
78
+ || expiresAt <= issuedAt
79
+ || expiresAt - issuedAt > EXECUTOR_PHASE_A_ISSUER_PROOF_TTL_MS
80
+ || !verify('RSA-SHA256', signedBytes, publicKey, signature)) {
81
+ throw new TypeError('The issuer proof is stale, forged, replay-shaped, or bound to different redemption bytes.');
82
+ }
83
+ return publicKey;
84
+ }
85
+ export function executorPhaseAIssuerRedemptionAuditSha256(payload) {
86
+ return artifactSha256({
87
+ schema: 'taskforce.executor-phase-a-issuer-redemption-audit/v1',
88
+ ...payload,
89
+ });
90
+ }
@@ -0,0 +1,120 @@
1
+ import { type KeyObject } from 'crypto';
2
+ import { type ExecutorPhaseAApprovalReceipt, type ExecutorPhaseAPhase, type ExecutorPhaseARoleMap } from './executorPhaseAApprovalReceipt.js';
3
+ export declare const EXECUTOR_PHASE_A_RUN_CAPABILITY_PAYLOAD_SCHEMA: "taskforce.executor-phase-a-run-capability-payload/v1";
4
+ export declare const EXECUTOR_PHASE_A_SENDER_PROOF_PAYLOAD_SCHEMA: "taskforce.executor-phase-a-sender-proof-payload/v1";
5
+ export declare const EXECUTOR_PHASE_A_WORKLOAD_GRANT_PAYLOAD_SCHEMA: "taskforce.executor-phase-a-workload-grant-payload/v1";
6
+ export declare const EXECUTOR_PHASE_A_MAIN_CAPABILITY_TTL_MS: number;
7
+ export declare const EXECUTOR_PHASE_A_CLEANUP_CAPABILITY_TTL_MS: number;
8
+ export declare const EXECUTOR_PHASE_A_SENDER_PROOF_TTL_MS: number;
9
+ export declare const EXECUTOR_PHASE_A_WORKLOAD_GRANT_TTL_MS: number;
10
+ export type ExecutorPhaseARunCapabilityKind = 'main' | 'cleanup-only';
11
+ export type ExecutorPhaseARunAuthorizationStatus = 'active' | 'awaiting-cleanup-approval' | 'completed' | 'cleanup-failed' | 'expired';
12
+ export interface ExecutorPhaseASignatureEnvelope {
13
+ algorithm: 'Ed25519';
14
+ keyId: string;
15
+ payloadSha256: string;
16
+ signature: string;
17
+ }
18
+ export interface ExecutorPhaseARunCapabilityPayload {
19
+ schema: typeof EXECUTOR_PHASE_A_RUN_CAPABILITY_PAYLOAD_SCHEMA;
20
+ capabilityId: string;
21
+ capabilityKind: ExecutorPhaseARunCapabilityKind;
22
+ originalCapabilityId: string | null;
23
+ residualInventorySha256: string | null;
24
+ receiptId: string;
25
+ receiptSha256: string;
26
+ workspaceId: string;
27
+ taskId: string;
28
+ actorUserId: string;
29
+ runId: string;
30
+ accountId: string;
31
+ region: 'us-west-2';
32
+ availabilityZone: string;
33
+ sourceCommit: string;
34
+ preflightSha256: string;
35
+ logicalEnvelopeSha256: string;
36
+ budgetsSha256: string;
37
+ readPrincipalArn: string;
38
+ mutationRoles: ExecutorPhaseARoleMap;
39
+ roleMapSha256: string;
40
+ oidcIssuer: string;
41
+ oidcAudience: string;
42
+ brokerPublicKeySpkiBase64: string;
43
+ brokerKeyFingerprint: string;
44
+ allowedPhases: ExecutorPhaseAPhase[];
45
+ issuedAt: string;
46
+ expiresAt: string;
47
+ mutationDeadline: string;
48
+ cleanupDeadline: string;
49
+ }
50
+ export interface ExecutorPhaseARunCapability {
51
+ payload: ExecutorPhaseARunCapabilityPayload;
52
+ envelope: ExecutorPhaseASignatureEnvelope;
53
+ }
54
+ export interface ExecutorPhaseASenderProofPayload {
55
+ schema: typeof EXECUTOR_PHASE_A_SENDER_PROOF_PAYLOAD_SCHEMA;
56
+ capabilityId: string;
57
+ nonceId: string;
58
+ requestSha256: string;
59
+ phase: ExecutorPhaseAPhase;
60
+ createdAt: string;
61
+ expiresAt: string;
62
+ }
63
+ export interface ExecutorPhaseASenderProof {
64
+ payload: ExecutorPhaseASenderProofPayload;
65
+ envelope: ExecutorPhaseASignatureEnvelope & {
66
+ brokerKeyFingerprint: string;
67
+ };
68
+ }
69
+ export interface ExecutorPhaseAWorkloadGrantPayload {
70
+ schema: typeof EXECUTOR_PHASE_A_WORKLOAD_GRANT_PAYLOAD_SCHEMA;
71
+ grantId: string;
72
+ capabilityId: string;
73
+ capabilitySha256: string;
74
+ receiptId: string;
75
+ receiptSha256: string;
76
+ workspaceId: string;
77
+ taskId: string;
78
+ actorUserId: string;
79
+ runId: string;
80
+ phase: ExecutorPhaseAPhase;
81
+ roleArn: string;
82
+ accountId: string;
83
+ region: 'us-west-2';
84
+ sourceIdentity: string;
85
+ sessionTags: Record<'TaskforceRun' | 'TaskforceReceipt' | 'TaskforcePhase' | 'TaskforceWorkspaceHash' | 'TaskforceSource', string>;
86
+ brokerKeyFingerprint: string;
87
+ nonceId: string;
88
+ senderProofSha256: string;
89
+ policySha256: string;
90
+ issuedAt: string;
91
+ expiresAt: string;
92
+ }
93
+ export interface ExecutorPhaseAWorkloadGrant {
94
+ payload: ExecutorPhaseAWorkloadGrantPayload;
95
+ envelope: ExecutorPhaseASignatureEnvelope;
96
+ }
97
+ declare const verifiedRunCapabilityBrand: unique symbol;
98
+ declare const verifiedWorkloadGrantBundleBrand: unique symbol;
99
+ export type VerifiedExecutorPhaseARunCapability = ExecutorPhaseARunCapability & {
100
+ readonly [verifiedRunCapabilityBrand]: true;
101
+ };
102
+ export interface VerifiedExecutorPhaseAWorkloadGrantBundle {
103
+ readonly capability: VerifiedExecutorPhaseARunCapability;
104
+ readonly grant: ExecutorPhaseAWorkloadGrant;
105
+ readonly senderProof: ExecutorPhaseASenderProof;
106
+ readonly grantSha256: string;
107
+ readonly senderProofSha256: string;
108
+ readonly [verifiedWorkloadGrantBundleBrand]: true;
109
+ }
110
+ export declare function executorPhaseARoleMapSha256(roleMap: ExecutorPhaseARoleMap): string;
111
+ export declare function executorPhaseABrokerKeyFingerprint(publicKeySpkiBase64: string): string;
112
+ export declare function executorPhaseASourceIdentity(runId: string, phase: ExecutorPhaseAPhase): string;
113
+ export declare function assertExecutorPhaseARoleMap(roleMap: ExecutorPhaseARoleMap): void;
114
+ export declare function assertExecutorPhaseAAccountAuthorities(accountId: string, readPrincipalArn: string, roleMap: ExecutorPhaseARoleMap): void;
115
+ export declare function assertExecutorPhaseARunCapabilitySemantics(payload: ExecutorPhaseARunCapabilityPayload, receipt: ExecutorPhaseAApprovalReceipt): void;
116
+ export declare function assertExecutorPhaseASenderProofSemantics(payload: ExecutorPhaseASenderProofPayload, now: Date): void;
117
+ export declare function assertExecutorPhaseAWorkloadGrantSemantics(payload: ExecutorPhaseAWorkloadGrantPayload, capabilityArtifact: ExecutorPhaseARunCapability, senderProof: ExecutorPhaseASenderProof, expectedRequestSha256: string, expectedPolicySha256: string, cloudPublicKey: KeyObject, brokerPublicKey: KeyObject): void;
118
+ export declare function verifyExecutorPhaseARunCapabilityArtifact(artifact: ExecutorPhaseARunCapability, receipt: ExecutorPhaseAApprovalReceipt, cloudPublicKey: KeyObject, now?: Date): VerifiedExecutorPhaseARunCapability;
119
+ export declare function verifyExecutorPhaseAWorkloadGrantBundle(grant: ExecutorPhaseAWorkloadGrant, capability: VerifiedExecutorPhaseARunCapability, senderProof: ExecutorPhaseASenderProof, expectedRequestSha256: string, expectedPolicySha256: string, cloudPublicKey: KeyObject, brokerPublicKey: KeyObject, now?: Date): VerifiedExecutorPhaseAWorkloadGrantBundle;
120
+ export {};
@@ -0,0 +1,232 @@
1
+ import { createHash, createPublicKey, verify } from 'crypto';
2
+ import { EXECUTOR_PHASE_A_PHASES, canonicalizeExecutorPhaseAJson, } from './executorPhaseAApprovalReceipt.js';
3
+ import { assertExecutorPhaseASchema } from './executorPhaseASchemaValidation.js';
4
+ import { EXECUTOR_PHASE_A_CROSS_SERVICE_CLOCK_SKEW_MS } from './executorPhaseATiming.js';
5
+ export const EXECUTOR_PHASE_A_RUN_CAPABILITY_PAYLOAD_SCHEMA = 'taskforce.executor-phase-a-run-capability-payload/v1';
6
+ export const EXECUTOR_PHASE_A_SENDER_PROOF_PAYLOAD_SCHEMA = 'taskforce.executor-phase-a-sender-proof-payload/v1';
7
+ export const EXECUTOR_PHASE_A_WORKLOAD_GRANT_PAYLOAD_SCHEMA = 'taskforce.executor-phase-a-workload-grant-payload/v1';
8
+ export const EXECUTOR_PHASE_A_MAIN_CAPABILITY_TTL_MS = 10 * 60 * 60 * 1000;
9
+ export const EXECUTOR_PHASE_A_CLEANUP_CAPABILITY_TTL_MS = 2 * 60 * 60 * 1000;
10
+ export const EXECUTOR_PHASE_A_SENDER_PROOF_TTL_MS = 2 * 60 * 1000;
11
+ export const EXECUTOR_PHASE_A_WORKLOAD_GRANT_TTL_MS = 2 * 60 * 1000;
12
+ const verifiedRunCapabilityBrand = Symbol('verifiedExecutorPhaseARunCapability');
13
+ const verifiedWorkloadGrantBundleBrand = Symbol('verifiedExecutorPhaseAWorkloadGrantBundle');
14
+ export function executorPhaseARoleMapSha256(roleMap) {
15
+ return createHash('sha256').update(canonicalizeExecutorPhaseAJson(roleMap)).digest('hex');
16
+ }
17
+ export function executorPhaseABrokerKeyFingerprint(publicKeySpkiBase64) {
18
+ const der = Buffer.from(publicKeySpkiBase64, 'base64');
19
+ if (!/^[A-Za-z0-9+/]+={0,2}$/.test(publicKeySpkiBase64) || der.toString('base64') !== publicKeySpkiBase64) {
20
+ throw new TypeError('The broker public key must be canonical base64-encoded SPKI.');
21
+ }
22
+ const key = createPublicKey({ key: der, format: 'der', type: 'spki' });
23
+ if (key.asymmetricKeyType !== 'ed25519' || der.length !== 44) {
24
+ throw new TypeError('The broker public key must be Ed25519 SPKI.');
25
+ }
26
+ return createHash('sha256').update(der).digest('hex');
27
+ }
28
+ export function executorPhaseASourceIdentity(runId, phase) {
29
+ if (!/^phase-a-[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$/.test(runId)
30
+ || !EXECUTOR_PHASE_A_PHASES.includes(phase)) {
31
+ throw new TypeError('The Phase A SourceIdentity inputs are invalid.');
32
+ }
33
+ const runDigest = createHash('sha256').update(runId, 'utf8').digest('base64url');
34
+ const sourceIdentity = `tfr.${runDigest}.${phase}`;
35
+ if (sourceIdentity.length > 64 || !/^[\w+=,.@-]+$/.test(sourceIdentity)) {
36
+ throw new TypeError('The Phase A SourceIdentity is not accepted by AWS STS.');
37
+ }
38
+ return sourceIdentity;
39
+ }
40
+ export function assertExecutorPhaseARoleMap(roleMap) {
41
+ const keys = Object.keys(roleMap).sort();
42
+ if (keys.length !== EXECUTOR_PHASE_A_PHASES.length
43
+ || !EXECUTOR_PHASE_A_PHASES.every((phase) => keys.includes(phase))) {
44
+ throw new TypeError('The Phase A role map must contain every fixed phase exactly once.');
45
+ }
46
+ for (const [phase, arn] of Object.entries(roleMap)) {
47
+ if (!/^arn:aws:iam::[0-9]{12}:role\/[A-Za-z0-9+=,.@_/-]{1,512}$/.test(arn)) {
48
+ throw new TypeError(`The ${phase} Phase A role ARN is invalid.`);
49
+ }
50
+ }
51
+ }
52
+ function arnAccountId(arn) {
53
+ return /^arn:aws:(?:iam|sts)::([0-9]{12}):/.exec(arn)?.[1] ?? null;
54
+ }
55
+ export function assertExecutorPhaseAAccountAuthorities(accountId, readPrincipalArn, roleMap) {
56
+ assertExecutorPhaseARoleMap(roleMap);
57
+ if (arnAccountId(readPrincipalArn) !== accountId
58
+ || Object.values(roleMap).some((roleArn) => arnAccountId(roleArn) !== accountId)) {
59
+ throw new TypeError('Every Phase A authority must belong to the approved AWS account.');
60
+ }
61
+ }
62
+ function exactTimestamp(value, field) {
63
+ const parsed = Date.parse(value);
64
+ if (!Number.isFinite(parsed))
65
+ throw new TypeError(`${field} is invalid.`);
66
+ return parsed;
67
+ }
68
+ function assertExecutorPhaseAEd25519Artifact(artifact, publicKey) {
69
+ if (publicKey.asymmetricKeyType !== 'ed25519' || artifact.envelope.algorithm !== 'Ed25519') {
70
+ throw new TypeError('The signed authorization artifact uses an untrusted algorithm or key type.');
71
+ }
72
+ const payloadBytes = canonicalizeExecutorPhaseAJson(artifact.payload);
73
+ const signature = Buffer.from(artifact.envelope.signature, 'base64url');
74
+ if (artifact.envelope.payloadSha256 !== createHash('sha256').update(payloadBytes).digest('hex')
75
+ || signature.length !== 64 || signature.toString('base64url') !== artifact.envelope.signature
76
+ || !verify(null, payloadBytes, publicKey, signature)) {
77
+ throw new TypeError('The signed authorization artifact is not authentic.');
78
+ }
79
+ }
80
+ export function assertExecutorPhaseARunCapabilitySemantics(payload, receipt) {
81
+ assertExecutorPhaseAAccountAuthorities(payload.accountId, payload.readPrincipalArn, payload.mutationRoles);
82
+ if (executorPhaseARoleMapSha256(payload.mutationRoles) !== payload.roleMapSha256
83
+ || executorPhaseABrokerKeyFingerprint(payload.brokerPublicKeySpkiBase64) !== payload.brokerKeyFingerprint) {
84
+ throw new TypeError('The run capability role map or broker-key digest is invalid.');
85
+ }
86
+ const issuedAt = exactTimestamp(payload.issuedAt, 'issuedAt');
87
+ const expiresAt = exactTimestamp(payload.expiresAt, 'expiresAt');
88
+ const mutationDeadline = exactTimestamp(payload.mutationDeadline, 'mutationDeadline');
89
+ const cleanupDeadline = exactTimestamp(payload.cleanupDeadline, 'cleanupDeadline');
90
+ const approvedAt = exactTimestamp(receipt.payload.approvedAt, 'receipt.approvedAt');
91
+ const receiptExpiresAt = exactTimestamp(receipt.payload.expiresAt, 'receipt.expiresAt');
92
+ const receiptSha256 = createHash('sha256').update(canonicalizeExecutorPhaseAJson(receipt)).digest('hex');
93
+ const budgetsSha256 = createHash('sha256').update(canonicalizeExecutorPhaseAJson(receipt.payload.budgets)).digest('hex');
94
+ if (payload.receiptId !== receipt.payload.receiptId || payload.receiptSha256 !== receiptSha256
95
+ || payload.capabilityKind !== receipt.payload.receiptKind
96
+ || payload.originalCapabilityId !== receipt.payload.originalCapabilityId
97
+ || payload.residualInventorySha256 !== receipt.payload.residualInventorySha256
98
+ || payload.workspaceId !== receipt.payload.workspaceId || payload.taskId !== receipt.payload.taskId
99
+ || payload.actorUserId !== receipt.payload.actorUserId || payload.runId !== receipt.payload.runId
100
+ || payload.accountId !== receipt.payload.accountId || payload.region !== receipt.payload.region
101
+ || payload.availabilityZone !== receipt.payload.availabilityZone
102
+ || payload.sourceCommit !== receipt.payload.sourceCommit
103
+ || payload.preflightSha256 !== receipt.payload.preflightSha256
104
+ || payload.logicalEnvelopeSha256 !== receipt.payload.logicalEnvelopeSha256
105
+ || payload.budgetsSha256 !== budgetsSha256
106
+ || payload.readPrincipalArn !== receipt.payload.readPrincipalArn
107
+ || payload.roleMapSha256 !== receipt.payload.roleMapSha256
108
+ || payload.oidcIssuer !== receipt.payload.oidcIssuer || payload.oidcAudience !== receipt.payload.oidcAudience
109
+ || payload.brokerPublicKeySpkiBase64 !== receipt.payload.brokerPublicKeySpkiBase64
110
+ || payload.brokerKeyFingerprint !== receipt.payload.brokerKeyFingerprint
111
+ || mutationDeadline !== exactTimestamp(receipt.payload.mutationDeadline, 'receipt.mutationDeadline')
112
+ || cleanupDeadline !== exactTimestamp(receipt.payload.cleanupDeadline, 'receipt.cleanupDeadline')
113
+ || issuedAt < approvedAt || issuedAt >= receiptExpiresAt || issuedAt >= cleanupDeadline) {
114
+ throw new TypeError('The run capability is not bound to the exact signed approval receipt.');
115
+ }
116
+ if (payload.capabilityKind === 'main') {
117
+ if (payload.originalCapabilityId !== null
118
+ || payload.residualInventorySha256 !== null
119
+ || mutationDeadline !== approvedAt + 8 * 60 * 60 * 1000
120
+ || cleanupDeadline !== approvedAt + EXECUTOR_PHASE_A_MAIN_CAPABILITY_TTL_MS
121
+ || expiresAt !== cleanupDeadline
122
+ || payload.allowedPhases.length !== EXECUTOR_PHASE_A_PHASES.length
123
+ || !EXECUTOR_PHASE_A_PHASES.every((phase) => payload.allowedPhases.includes(phase))) {
124
+ throw new TypeError('The main run capability lifetime, ancestry, or phase set is invalid.');
125
+ }
126
+ return;
127
+ }
128
+ if (!payload.originalCapabilityId || !payload.residualInventorySha256
129
+ || !/^[a-f0-9]{64}$/.test(payload.residualInventorySha256)
130
+ || payload.allowedPhases.length !== 1 || payload.allowedPhases[0] !== 'cleanup'
131
+ || mutationDeadline !== approvedAt || expiresAt !== cleanupDeadline
132
+ || cleanupDeadline !== approvedAt + EXECUTOR_PHASE_A_CLEANUP_CAPABILITY_TTL_MS) {
133
+ throw new TypeError('The cleanup-only run capability lifetime, ancestry, or phase set is invalid.');
134
+ }
135
+ }
136
+ export function assertExecutorPhaseASenderProofSemantics(payload, now) {
137
+ const createdAt = exactTimestamp(payload.createdAt, 'createdAt');
138
+ const expiresAt = exactTimestamp(payload.expiresAt, 'expiresAt');
139
+ const nowMs = now.getTime();
140
+ if (createdAt > nowMs + EXECUTOR_PHASE_A_CROSS_SERVICE_CLOCK_SKEW_MS
141
+ || nowMs >= expiresAt + EXECUTOR_PHASE_A_CROSS_SERVICE_CLOCK_SKEW_MS
142
+ || expiresAt <= createdAt
143
+ || expiresAt - createdAt > EXECUTOR_PHASE_A_SENDER_PROOF_TTL_MS) {
144
+ throw new TypeError('The sender proof is future-dated, expired, or exceeds two minutes.');
145
+ }
146
+ }
147
+ export function assertExecutorPhaseAWorkloadGrantSemantics(payload, capabilityArtifact, senderProof, expectedRequestSha256, expectedPolicySha256, cloudPublicKey, brokerPublicKey) {
148
+ const capability = capabilityArtifact.payload;
149
+ assertExecutorPhaseAEd25519Artifact(capabilityArtifact, cloudPublicKey);
150
+ assertExecutorPhaseAEd25519Artifact(senderProof, brokerPublicKey);
151
+ const brokerDer = brokerPublicKey.export({ format: 'der', type: 'spki' });
152
+ if (createHash('sha256').update(brokerDer).digest('hex') !== capability.brokerKeyFingerprint) {
153
+ throw new TypeError('The sender-proof key differs from the capability broker key.');
154
+ }
155
+ const issuedAt = exactTimestamp(payload.issuedAt, 'issuedAt');
156
+ const expiresAt = exactTimestamp(payload.expiresAt, 'expiresAt');
157
+ const capabilitySha256 = createHash('sha256').update(canonicalizeExecutorPhaseAJson(capabilityArtifact)).digest('hex');
158
+ const senderProofSha256 = createHash('sha256').update(canonicalizeExecutorPhaseAJson(senderProof)).digest('hex');
159
+ if (expiresAt <= issuedAt || expiresAt - issuedAt > EXECUTOR_PHASE_A_WORKLOAD_GRANT_TTL_MS
160
+ || payload.capabilityId !== capability.capabilityId
161
+ || payload.capabilitySha256 !== capabilitySha256
162
+ || payload.receiptId !== capability.receiptId || payload.receiptSha256 !== capability.receiptSha256
163
+ || payload.workspaceId !== capability.workspaceId || payload.taskId !== capability.taskId
164
+ || payload.actorUserId !== capability.actorUserId || payload.runId !== capability.runId
165
+ || payload.accountId !== capability.accountId || payload.region !== capability.region
166
+ || payload.brokerKeyFingerprint !== capability.brokerKeyFingerprint
167
+ || payload.roleArn !== capability.mutationRoles[payload.phase]
168
+ || !capability.allowedPhases.includes(payload.phase)
169
+ || payload.nonceId !== senderProof.payload.nonceId
170
+ || payload.senderProofSha256 !== senderProofSha256
171
+ || senderProof.payload.capabilityId !== capability.capabilityId
172
+ || senderProof.payload.phase !== payload.phase
173
+ || senderProof.payload.requestSha256 !== expectedRequestSha256
174
+ || senderProof.envelope.brokerKeyFingerprint !== capability.brokerKeyFingerprint
175
+ || payload.policySha256 !== expectedPolicySha256
176
+ || payload.sourceIdentity !== executorPhaseASourceIdentity(capability.runId, payload.phase)
177
+ || payload.sessionTags.TaskforceRun !== capability.runId
178
+ || payload.sessionTags.TaskforceReceipt !== capability.receiptId
179
+ || payload.sessionTags.TaskforcePhase !== payload.phase
180
+ || payload.sessionTags.TaskforceWorkspaceHash !== createHash('sha256')
181
+ .update(canonicalizeExecutorPhaseAJson(capability.workspaceId)).digest('hex')
182
+ || payload.sessionTags.TaskforceSource !== capability.sourceCommit) {
183
+ throw new TypeError('The workload grant lifetime or capability binding is invalid.');
184
+ }
185
+ assertExecutorPhaseASenderProofSemantics(senderProof.payload, new Date(issuedAt));
186
+ const deadline = exactTimestamp(payload.phase === 'cleanup' ? capability.cleanupDeadline : capability.mutationDeadline, payload.phase === 'cleanup' ? 'cleanupDeadline' : 'mutationDeadline');
187
+ if (issuedAt >= deadline || expiresAt > deadline) {
188
+ throw new TypeError('The workload grant exceeds its approved phase deadline.');
189
+ }
190
+ }
191
+ export function verifyExecutorPhaseARunCapabilityArtifact(artifact, receipt, cloudPublicKey, now = new Date()) {
192
+ assertExecutorPhaseASchema('approvalReceipt', receipt);
193
+ assertExecutorPhaseASchema('runCapability', artifact);
194
+ if (receipt.envelope.keyId !== artifact.envelope.keyId) {
195
+ throw new TypeError('The receipt and run capability use different Cloud trust keys.');
196
+ }
197
+ assertExecutorPhaseAEd25519Artifact(receipt, cloudPublicKey);
198
+ assertExecutorPhaseAEd25519Artifact(artifact, cloudPublicKey);
199
+ assertExecutorPhaseARunCapabilitySemantics(artifact.payload, receipt);
200
+ const nowMs = now.getTime();
201
+ const issuedAt = exactTimestamp(artifact.payload.issuedAt, 'issuedAt');
202
+ const expiresAt = exactTimestamp(artifact.payload.expiresAt, 'expiresAt');
203
+ if (nowMs + EXECUTOR_PHASE_A_CROSS_SERVICE_CLOCK_SKEW_MS < issuedAt
204
+ || nowMs >= expiresAt + EXECUTOR_PHASE_A_CROSS_SERVICE_CLOCK_SKEW_MS) {
205
+ throw new TypeError('The run capability is future-dated or expired.');
206
+ }
207
+ return Object.assign(structuredClone(artifact), { [verifiedRunCapabilityBrand]: true });
208
+ }
209
+ export function verifyExecutorPhaseAWorkloadGrantBundle(grant, capability, senderProof, expectedRequestSha256, expectedPolicySha256, cloudPublicKey, brokerPublicKey, now = new Date()) {
210
+ assertExecutorPhaseASchema('workloadGrant', grant);
211
+ assertExecutorPhaseASchema('senderProof', senderProof);
212
+ if (grant.envelope.keyId !== capability.envelope.keyId) {
213
+ throw new TypeError('The workload grant and run capability use different Cloud trust keys.');
214
+ }
215
+ assertExecutorPhaseAEd25519Artifact(grant, cloudPublicKey);
216
+ assertExecutorPhaseAWorkloadGrantSemantics(grant.payload, capability, senderProof, expectedRequestSha256, expectedPolicySha256, cloudPublicKey, brokerPublicKey);
217
+ const nowMs = now.getTime();
218
+ if (nowMs + EXECUTOR_PHASE_A_CROSS_SERVICE_CLOCK_SKEW_MS < exactTimestamp(grant.payload.issuedAt, 'grant.issuedAt')
219
+ || nowMs >= exactTimestamp(grant.payload.expiresAt, 'grant.expiresAt')
220
+ + EXECUTOR_PHASE_A_CROSS_SERVICE_CLOCK_SKEW_MS) {
221
+ throw new TypeError('The workload grant is future-dated or expired.');
222
+ }
223
+ assertExecutorPhaseASenderProofSemantics(senderProof.payload, now);
224
+ return {
225
+ capability,
226
+ grant: structuredClone(grant),
227
+ senderProof: structuredClone(senderProof),
228
+ grantSha256: createHash('sha256').update(canonicalizeExecutorPhaseAJson(grant)).digest('hex'),
229
+ senderProofSha256: createHash('sha256').update(canonicalizeExecutorPhaseAJson(senderProof)).digest('hex'),
230
+ [verifiedWorkloadGrantBundleBrand]: true,
231
+ };
232
+ }
@@ -0,0 +1,7 @@
1
+ import { type ErrorObject } from 'ajv/dist/2020.js';
2
+ export type ExecutorPhaseASchemaName = 'approvalReceipt' | 'driftAttestation' | 'driftRequest' | 'foundationManifest' | 'issuerAuditRecord' | 'issuerProof' | 'issuerRedemptionRequest' | 'issuerRedemptionResponse' | 'report' | 'runCapability' | 'senderProof' | 'workloadGrant' | 'workloadJwtClaims';
3
+ export declare class ExecutorPhaseASchemaValidationError extends TypeError {
4
+ readonly schemaName: ExecutorPhaseASchemaName;
5
+ constructor(schemaName: ExecutorPhaseASchemaName, errors: ErrorObject[] | null | undefined);
6
+ }
7
+ export declare function assertExecutorPhaseASchema(name: ExecutorPhaseASchemaName, value: unknown): void;
@@ -0,0 +1,53 @@
1
+ import { Ajv2020 } from 'ajv/dist/2020.js';
2
+ import approvalReceiptSchema from './executorPhaseASchemas/approval-receipt.schema.json' with { type: 'json' };
3
+ import driftAttestationSchema from './executorPhaseASchemas/drift-attestation.schema.json' with { type: 'json' };
4
+ import driftRequestSchema from './executorPhaseASchemas/drift-request.schema.json' with { type: 'json' };
5
+ import foundationManifestSchema from './executorPhaseASchemas/foundation-manifest.schema.json' with { type: 'json' };
6
+ import issuerAuditRecordSchema from './executorPhaseASchemas/issuer-audit-record.schema.json' with { type: 'json' };
7
+ import issuerProofSchema from './executorPhaseASchemas/issuer-proof.schema.json' with { type: 'json' };
8
+ import issuerRedemptionRequestSchema from './executorPhaseASchemas/issuer-redemption-request.schema.json' with { type: 'json' };
9
+ import issuerRedemptionResponseSchema from './executorPhaseASchemas/issuer-redemption-response.schema.json' with { type: 'json' };
10
+ import logicalEnvelopeSchema from './executorPhaseASchemas/logical-envelope.schema.json' with { type: 'json' };
11
+ import preflightReportSchema from './executorPhaseASchemas/preflight-report.schema.json' with { type: 'json' };
12
+ import runCapabilitySchema from './executorPhaseASchemas/run-capability.schema.json' with { type: 'json' };
13
+ import senderProofSchema from './executorPhaseASchemas/sender-proof.schema.json' with { type: 'json' };
14
+ import workloadGrantSchema from './executorPhaseASchemas/workload-grant.schema.json' with { type: 'json' };
15
+ import workloadJwtClaimsSchema from './executorPhaseASchemas/workload-jwt-claims.schema.json' with { type: 'json' };
16
+ const ajv = new Ajv2020({ strict: true, strictRequired: false, allErrors: true });
17
+ ajv.addSchema(logicalEnvelopeSchema);
18
+ ajv.addSchema(approvalReceiptSchema);
19
+ ajv.addSchema(runCapabilitySchema);
20
+ ajv.addSchema(senderProofSchema);
21
+ ajv.addSchema(workloadGrantSchema);
22
+ ajv.addSchema(issuerProofSchema);
23
+ const validators = {
24
+ approvalReceipt: ajv.getSchema(approvalReceiptSchema.$id),
25
+ driftAttestation: ajv.compile(driftAttestationSchema),
26
+ driftRequest: ajv.compile(driftRequestSchema),
27
+ foundationManifest: ajv.compile(foundationManifestSchema),
28
+ issuerAuditRecord: ajv.compile(issuerAuditRecordSchema),
29
+ issuerProof: ajv.getSchema(issuerProofSchema.$id),
30
+ issuerRedemptionRequest: ajv.compile(issuerRedemptionRequestSchema),
31
+ issuerRedemptionResponse: ajv.compile(issuerRedemptionResponseSchema),
32
+ report: ajv.compile(preflightReportSchema),
33
+ runCapability: ajv.getSchema(runCapabilitySchema.$id),
34
+ senderProof: ajv.getSchema(senderProofSchema.$id),
35
+ workloadGrant: ajv.getSchema(workloadGrantSchema.$id),
36
+ workloadJwtClaims: ajv.compile(workloadJwtClaimsSchema),
37
+ };
38
+ function formatErrors(errors) {
39
+ return ajv.errorsText(errors, { separator: '; ' });
40
+ }
41
+ export class ExecutorPhaseASchemaValidationError extends TypeError {
42
+ schemaName;
43
+ constructor(schemaName, errors) {
44
+ super(`${schemaName} schema validation failed: ${formatErrors(errors)}`);
45
+ this.schemaName = schemaName;
46
+ this.name = 'ExecutorPhaseASchemaValidationError';
47
+ }
48
+ }
49
+ export function assertExecutorPhaseASchema(name, value) {
50
+ const validator = validators[name];
51
+ if (!validator(value))
52
+ throw new ExecutorPhaseASchemaValidationError(name, validator.errors);
53
+ }