@taskforcehq/taskforce 0.3.328 → 0.3.330

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (485) hide show
  1. package/dist/Taskforce.module.css +523 -79
  2. package/dist/TaskforceCore.js +237 -230
  3. package/dist/annotatedAttachments/AnnotatedAttachmentSessionStore.js +1 -1
  4. package/dist/cli.js +34 -0
  5. package/dist/cliCloudTargetGuard.d.ts +5 -0
  6. package/dist/cliCloudTargetGuard.js +11 -0
  7. package/dist/components/features/AiProfilesModule.js +3 -5
  8. package/dist/components/features/AnnotatedAttachmentWorkspace.js +24 -8
  9. package/dist/components/features/TaskSettings.d.ts +12 -1
  10. package/dist/components/features/TaskSettings.js +217 -54
  11. package/dist/components/features/TaskforceAgentsModule.d.ts +1 -2
  12. package/dist/components/features/TaskforceAgentsModule.js +586 -116
  13. package/dist/components/features/agentCapabilities/AgentCapabilitiesPrototype.d.ts +1 -1
  14. package/dist/components/features/agentConnections/AgentConnectionControl.d.ts +15 -0
  15. package/dist/components/features/agentConnections/AgentConnectionControl.js +125 -0
  16. package/dist/components/features/agentConnections/ModelConnectionsPanel.d.ts +18 -0
  17. package/dist/components/features/agentConnections/ModelConnectionsPanel.js +393 -0
  18. package/dist/components/features/agentConnections/modelConnectionsApi.d.ts +65 -0
  19. package/dist/components/features/agentConnections/modelConnectionsApi.js +129 -0
  20. package/dist/components/features/planning/PlanningModule.js +2 -5
  21. package/dist/components/features/planning/PlanningTaskOrderList.d.ts +1 -1
  22. package/dist/components/features/planning/PlanningTaskOrderList.js +17 -6
  23. package/dist/components/features/planning/planningTaskArrangement.d.ts +1 -0
  24. package/dist/components/features/planning/planningTaskArrangement.js +5 -5
  25. package/dist/components/features/taskforceAgentAssignments/AgentBehaviorAssignments.js +15 -24
  26. package/dist/components/features/taskforceAgentEditorModel.d.ts +2 -1
  27. package/dist/components/features/taskforceAgentEditorModel.js +5 -1
  28. package/dist/components/features/workflowManager/workflowManagerApi.d.ts +1 -1
  29. package/dist/components/features/workflowManager/workflowManagerApi.js +3 -0
  30. package/dist/components/task/TaskCard.d.ts +5 -0
  31. package/dist/components/task/TaskCard.js +65 -10
  32. package/dist/components/task/TaskImageReviews.js +14 -5
  33. package/dist/components/task/TaskKanban.d.ts +6 -1
  34. package/dist/components/task/TaskKanban.js +152 -6
  35. package/dist/components/task/TaskList.d.ts +5 -0
  36. package/dist/components/task/TaskList.js +3 -3
  37. package/dist/components/task/TaskWorkflowAssignmentField.js +68 -10
  38. package/dist/components/ui/PasswordInput.d.ts +6 -0
  39. package/dist/components/ui/PasswordInput.js +11 -0
  40. package/dist/components/ui/TopNoticeLayer.js +1 -1
  41. package/dist/components/views/AppShellHeader.js +32 -11
  42. package/dist/components/views/PlanComparisonPage.js +12 -0
  43. package/dist/components/views/StandaloneLayout.js +32 -55
  44. package/dist/components/views/WidgetView.js +3 -3
  45. package/dist/components/views/panels/PlanningDrawer.js +5 -12
  46. package/dist/components/views/standalone/modals/AccountSettingsModal.js +26 -17
  47. package/dist/components/views/standalone/modals/SyncStatusModal.d.ts +4 -3
  48. package/dist/components/views/standalone/modals/SyncStatusModal.js +33 -38
  49. package/dist/config/envSchema.js +60 -1
  50. package/dist/config/localServiceRuntimeContract.d.ts +13 -0
  51. package/dist/config/localServiceRuntimeContract.js +135 -0
  52. package/dist/core/AiProfileService.js +46 -8
  53. package/dist/core/DeletedTaskLifecycleService.d.ts +1 -0
  54. package/dist/core/DeletedTaskLifecycleService.js +37 -6
  55. package/dist/core/McpTokenService.d.ts +23 -1
  56. package/dist/core/McpTokenService.js +93 -10
  57. package/dist/core/TaskAttachmentLinksDurableMutationService.d.ts +3 -2
  58. package/dist/core/TaskAttachmentLinksDurableMutationService.js +33 -9
  59. package/dist/core/TaskChecklistCommandService.d.ts +27 -0
  60. package/dist/core/TaskChecklistCommandService.js +83 -5
  61. package/dist/core/TaskLifecycleCommandService.d.ts +3 -1
  62. package/dist/core/TaskLifecycleCommandService.js +6 -2
  63. package/dist/core/Taskforce.d.ts +94 -2
  64. package/dist/core/Taskforce.js +760 -36
  65. package/dist/core/types.d.ts +14 -0
  66. package/dist/documentReviews/commandService.d.ts +2 -1
  67. package/dist/documentReviews/commandService.js +6 -3
  68. package/dist/hooks/sync/orchestratorShared.d.ts +1 -0
  69. package/dist/hooks/sync/orchestratorShared.js +2 -0
  70. package/dist/hooks/sync/useDurableLocalOutboxDrain.d.ts +1 -1
  71. package/dist/hooks/sync/useDurableTaskCreateMutation.js +1 -1
  72. package/dist/hooks/sync/useDurableTaskMetadataMutation.d.ts +1 -0
  73. package/dist/hooks/sync/useDurableTaskMetadataMutation.js +1 -0
  74. package/dist/hooks/sync/useDurableTaskStatusMutation.d.ts +1 -0
  75. package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.d.ts +3 -0
  76. package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.js +85 -9
  77. package/dist/hooks/sync/useSyncStatusControls.d.ts +4 -1
  78. package/dist/hooks/sync/useSyncStatusControls.js +47 -11
  79. package/dist/hooks/tasks/taskHttpMutation.js +1 -0
  80. package/dist/hooks/tasks/useCloudTaskSearch.d.ts +12 -0
  81. package/dist/hooks/tasks/useCloudTaskSearch.js +71 -0
  82. package/dist/hooks/tasks/useTaskDescriptionImageDraftRecovery.d.ts +16 -0
  83. package/dist/hooks/tasks/useTaskDescriptionImageDraftRecovery.js +197 -0
  84. package/dist/hooks/tasks/useTaskEditorNavigation.d.ts +16 -3
  85. package/dist/hooks/tasks/useTaskEditorNavigation.js +72 -13
  86. package/dist/hooks/tasks/useTaskFormActions.d.ts +6 -0
  87. package/dist/hooks/tasks/useTaskFormActions.js +65 -12
  88. package/dist/hooks/ui/useSettingsModel.d.ts +24 -2
  89. package/dist/hooks/ui/useSettingsModel.js +13 -2
  90. package/dist/hooks/ui/useSettingsPersistence.d.ts +12 -1
  91. package/dist/hooks/ui/useSettingsPersistence.js +74 -47
  92. package/dist/hooks/useFilterSort.d.ts +7 -3
  93. package/dist/hooks/useFilterSort.js +15 -5
  94. package/dist/hooks/useSyncOrchestrator.d.ts +3 -0
  95. package/dist/hooks/useSyncOrchestrator.js +111 -2
  96. package/dist/hooks/useTaskData.d.ts +40 -1
  97. package/dist/hooks/useTaskData.js +240 -9
  98. package/dist/hooks/useTaskMutations.d.ts +12 -2
  99. package/dist/hooks/useTaskMutations.js +266 -52
  100. package/dist/hooks/useTaskforce.d.ts +39 -9
  101. package/dist/hooks/useTaskforce.js +359 -40
  102. package/dist/hooks/useUiNotice.d.ts +4 -0
  103. package/dist/hooks/useUiNotice.js +4 -0
  104. package/dist/mcp/adminWorkspaceRegistrar.js +3 -3
  105. package/dist/mcp/clientRegistry.d.ts +2 -2
  106. package/dist/mcp/clientRegistry.js +1 -1
  107. package/dist/mcp/documentAssetRegistrar.js +53 -41
  108. package/dist/mcp/documentHelpers.d.ts +1 -0
  109. package/dist/mcp/documentHelpers.js +7 -3
  110. package/dist/mcp/durableTaskMutationRouter.d.ts +4 -1
  111. package/dist/mcp/durableTaskMutationRouter.js +10 -0
  112. package/dist/mcp/durableTaskRelationshipMutationRouter.js +4 -0
  113. package/dist/mcp/httpProtocolRouting.d.ts +10 -0
  114. package/dist/mcp/httpProtocolRouting.js +19 -0
  115. package/dist/mcp/localCliHealth.d.ts +2 -2
  116. package/dist/mcp/localCliHealth.js +2 -2
  117. package/dist/mcp/localServiceProxy.d.ts +1 -0
  118. package/dist/mcp/localServiceProxy.js +530 -68
  119. package/dist/mcp/planningAttachmentCommandAdapter.d.ts +3 -1
  120. package/dist/mcp/planningAttachmentCommandAdapter.js +20 -2
  121. package/dist/mcp/runtime.d.ts +54 -79
  122. package/dist/mcp/runtime.js +556 -139
  123. package/dist/mcp/taskPlanningRegistrar.js +64 -42
  124. package/dist/mcp/toolCallCompatibility.js +38 -1
  125. package/dist/mcp/toolCatalog.d.ts +1 -0
  126. package/dist/mcp/toolProfiles.d.ts +2 -0
  127. package/dist/mcp/toolProfiles.js +10 -0
  128. package/dist/mcp/toolRegistry.d.ts +1 -0
  129. package/dist/mcp/toolRegistry.js +1 -0
  130. package/dist/mcp/workflowExecutionRegistrar.js +4 -4
  131. package/dist/migrations/taskSchemaMigrations.d.ts +5 -0
  132. package/dist/migrations/taskSchemaMigrations.js +427 -0
  133. package/dist/runtime/appGateDefinitions.d.ts +30 -6
  134. package/dist/runtime/appGateDefinitions.js +6 -6
  135. package/dist/runtime/appGates.d.ts +13 -13
  136. package/dist/runtime/appGates.js +36 -13
  137. package/dist/runtime/nodeAppGates.d.ts +8 -0
  138. package/dist/runtime/nodeAppGates.js +27 -0
  139. package/dist/server/cloudCollectionRead.d.ts +1 -1
  140. package/dist/server/cloudCollectionRead.js +2 -2
  141. package/dist/server/index.d.ts +6 -0
  142. package/dist/server/index.js +123 -14
  143. package/dist/server/localDatabaseIdentity.js +4 -1
  144. package/dist/server/localServiceLease.d.ts +3 -0
  145. package/dist/server/localServiceLease.js +11 -2
  146. package/dist/server/localServiceSessions.d.ts +14 -17
  147. package/dist/server/localServiceSessions.js +308 -94
  148. package/dist/server/localWorkspaceSyncServerRuntime.js +12 -7
  149. package/dist/server/rateLimit.d.ts +1 -0
  150. package/dist/server/rateLimit.js +4 -0
  151. package/dist/server/realtimeSyncWs.js +36 -12
  152. package/dist/server/routes/admin.d.ts +4 -0
  153. package/dist/server/routes/admin.js +113 -3
  154. package/dist/server/routes/agentRoles.js +3 -2
  155. package/dist/server/routes/agentSkills.js +3 -2
  156. package/dist/server/routes/agents.d.ts +7 -0
  157. package/dist/server/routes/agents.js +394 -39
  158. package/dist/server/routes/annotatedAttachments.js +3 -2
  159. package/dist/server/routes/auth.js +3 -1
  160. package/dist/server/routes/billing.js +5 -1
  161. package/dist/server/routes/durableTaskHttpRouters.d.ts +11 -2
  162. package/dist/server/routes/executorPhaseAApprovals.d.ts +19 -0
  163. package/dist/server/routes/executorPhaseAApprovals.js +140 -0
  164. package/dist/server/routes/executorPhaseAIssuerRedemptions.d.ts +11 -0
  165. package/dist/server/routes/executorPhaseAIssuerRedemptions.js +24 -0
  166. package/dist/server/routes/githubReviewEvidence.d.ts +19 -0
  167. package/dist/server/routes/githubReviewEvidence.js +116 -0
  168. package/dist/server/routes/localService.d.ts +15 -4
  169. package/dist/server/routes/localService.js +138 -40
  170. package/dist/server/routes/modelConnections.d.ts +24 -0
  171. package/dist/server/routes/modelConnections.js +205 -0
  172. package/dist/server/routes/primitives.d.ts +2 -0
  173. package/dist/server/routes/shared.d.ts +19 -0
  174. package/dist/server/routes/shared.js +95 -19
  175. package/dist/server/routes/sync.js +1 -0
  176. package/dist/server/routes/syncAuxRoutes.js +9 -2
  177. package/dist/server/routes/syncPullApplyRoutes.js +23 -4
  178. package/dist/server/routes/syncPushRoutes.d.ts +1 -0
  179. package/dist/server/routes/syncPushRoutes.js +1 -0
  180. package/dist/server/routes/syncV3FeedRoutes.js +27 -16
  181. package/dist/server/routes/syncV3LocalCaptureRoutes.js +28 -2
  182. package/dist/server/routes/syncV3LocalFeedApplyRoutes.d.ts +1 -0
  183. package/dist/server/routes/syncV3LocalFeedApplyRoutes.js +26 -0
  184. package/dist/server/routes/syncV3OperationRoutes.js +45 -9
  185. package/dist/server/routes/tasks.js +124 -13
  186. package/dist/server/routes/workflows.js +9 -1
  187. package/dist/server/routes/workspaces.js +43 -1
  188. package/dist/server/routes.js +59 -0
  189. package/dist/server/workspaceDeletionAdmission.d.ts +23 -0
  190. package/dist/server/workspaceDeletionAdmission.js +50 -0
  191. package/dist/service/localServiceCli.js +16 -0
  192. package/dist/service/localServiceClientLifecycle.js +36 -10
  193. package/dist/services/codexAppServerModelGateway.d.ts +161 -0
  194. package/dist/services/codexAppServerModelGateway.js +663 -0
  195. package/dist/services/codexDeviceCodeLoginManager.d.ts +39 -0
  196. package/dist/services/codexDeviceCodeLoginManager.js +265 -0
  197. package/dist/services/codexModelProviderConnectionLifecycle.d.ts +8 -0
  198. package/dist/services/codexModelProviderConnectionLifecycle.js +73 -0
  199. package/dist/services/executorPhaseAApprovalRuntime.d.ts +14 -0
  200. package/dist/services/executorPhaseAApprovalRuntime.js +24 -0
  201. package/dist/services/executorPhaseAApprovalService.d.ts +40 -0
  202. package/dist/services/executorPhaseAApprovalService.js +609 -0
  203. package/dist/services/executorPhaseADriftEvaluator.d.ts +78 -0
  204. package/dist/services/executorPhaseADriftEvaluator.js +93 -0
  205. package/dist/services/executorPhaseAIssuerCore.d.ts +126 -0
  206. package/dist/services/executorPhaseAIssuerCore.js +295 -0
  207. package/dist/services/executorPhaseAIssuerRedemptionService.d.ts +34 -0
  208. package/dist/services/executorPhaseAIssuerRedemptionService.js +158 -0
  209. package/dist/services/githubReviewEvidenceRuntime.d.ts +14 -0
  210. package/dist/services/githubReviewEvidenceRuntime.js +30 -0
  211. package/dist/services/githubReviewEvidenceService.d.ts +93 -0
  212. package/dist/services/githubReviewEvidenceService.js +336 -0
  213. package/dist/services/modelGateway.d.ts +7 -0
  214. package/dist/services/modelProviderConnectionService.d.ts +71 -0
  215. package/dist/services/modelProviderConnectionService.js +279 -0
  216. package/dist/services/modelProviderCredentialHome.d.ts +32 -0
  217. package/dist/services/modelProviderCredentialHome.js +271 -0
  218. package/dist/services/ownerScopedModelConnectionGateway.d.ts +12 -0
  219. package/dist/services/ownerScopedModelConnectionGateway.js +30 -0
  220. package/dist/services/taskforceAgentConnectionBindingService.d.ts +66 -0
  221. package/dist/services/taskforceAgentConnectionBindingService.js +185 -0
  222. package/dist/services/taskforceAgentMcpBridge.d.ts +8 -2
  223. package/dist/services/taskforceAgentMcpBridge.js +30 -27
  224. package/dist/shared/adminEdgeProxy.d.ts +5 -0
  225. package/dist/shared/adminEdgeProxy.js +94 -0
  226. package/dist/shared/adminProxySessionCookies.d.ts +16 -0
  227. package/dist/shared/adminProxySessionCookies.js +86 -0
  228. package/dist/shared/aiProfileColors.d.ts +31 -1
  229. package/dist/shared/aiProfileColors.js +14 -6
  230. package/dist/shared/executorPhaseAApprovalGoldenVector.json +269 -0
  231. package/dist/shared/executorPhaseAApprovalReceipt.d.ts +112 -0
  232. package/dist/shared/executorPhaseAApprovalReceipt.js +58 -0
  233. package/dist/shared/executorPhaseAApprovalTrustPolicy.json +10 -0
  234. package/dist/shared/executorPhaseADriftContracts.d.ts +37 -0
  235. package/dist/shared/executorPhaseADriftContracts.js +63 -0
  236. package/dist/shared/executorPhaseAIssuerContracts.d.ts +75 -0
  237. package/dist/shared/executorPhaseAIssuerContracts.js +90 -0
  238. package/dist/shared/executorPhaseARunAuthorization.d.ts +120 -0
  239. package/dist/shared/executorPhaseARunAuthorization.js +232 -0
  240. package/dist/shared/executorPhaseASchemaValidation.d.ts +7 -0
  241. package/dist/shared/executorPhaseASchemaValidation.js +53 -0
  242. package/dist/shared/executorPhaseASchemas/approval-receipt.schema.json +106 -0
  243. package/dist/shared/executorPhaseASchemas/drift-attestation.schema.json +54 -0
  244. package/dist/shared/executorPhaseASchemas/drift-request.schema.json +47 -0
  245. package/dist/shared/executorPhaseASchemas/foundation-manifest.schema.json +29 -0
  246. package/dist/shared/executorPhaseASchemas/issuer-audit-record.schema.json +24 -0
  247. package/dist/shared/executorPhaseASchemas/issuer-proof.schema.json +43 -0
  248. package/dist/shared/executorPhaseASchemas/issuer-redemption-request.schema.json +18 -0
  249. package/dist/shared/executorPhaseASchemas/issuer-redemption-response.schema.json +39 -0
  250. package/dist/shared/executorPhaseASchemas/logical-envelope.schema.json +149 -0
  251. package/dist/shared/executorPhaseASchemas/preflight-report.schema.json +216 -0
  252. package/dist/shared/executorPhaseASchemas/run-capability.schema.json +111 -0
  253. package/dist/shared/executorPhaseASchemas/sender-proof.schema.json +37 -0
  254. package/dist/shared/executorPhaseASchemas/workload-grant.schema.json +68 -0
  255. package/dist/shared/executorPhaseASchemas/workload-jwt-claims.schema.json +67 -0
  256. package/dist/shared/executorPhaseATiming.d.ts +1 -0
  257. package/dist/shared/executorPhaseATiming.js +1 -0
  258. package/dist/shared/planningIdentity.js +1 -1
  259. package/dist/shared/productLogoKeys.d.ts +2 -0
  260. package/dist/shared/productLogoKeys.js +18 -0
  261. package/dist/shared/taskforceAgentDefinition.d.ts +0 -1
  262. package/dist/shared/taskforceAgentDefinition.js +6 -3
  263. package/dist/shared/taskforceAgentModels.d.ts +1 -0
  264. package/dist/shared/taskforceAgentModels.js +36 -3
  265. package/dist/shared/userFeatureGrants.d.ts +4 -0
  266. package/dist/shared/userFeatureGrants.js +7 -0
  267. package/dist/storage/executorPhaseAApprovalReceiptStore.d.ts +37 -0
  268. package/dist/storage/executorPhaseAApprovalReceiptStore.js +81 -0
  269. package/dist/storage/executorPhaseARunAuthorizationStore.d.ts +103 -0
  270. package/dist/storage/executorPhaseARunAuthorizationStore.js +492 -0
  271. package/dist/storage/githubReviewEvidenceInstallationStore.d.ts +26 -0
  272. package/dist/storage/githubReviewEvidenceInstallationStore.js +89 -0
  273. package/dist/storage/modelProviderConnectionStore.d.ts +99 -0
  274. package/dist/storage/modelProviderConnectionStore.js +446 -0
  275. package/dist/storage/postgresAdapter.d.ts +24 -3
  276. package/dist/storage/postgresAdapter.js +117 -14
  277. package/dist/storage/postgresWorker.js +22 -5
  278. package/dist/storage/postgresWorkerProtocol.d.ts +30 -0
  279. package/dist/storage/postgresWorkerProtocol.js +30 -0
  280. package/dist/storage/taskforceAgentConnectionBindingStore.d.ts +31 -0
  281. package/dist/storage/taskforceAgentConnectionBindingStore.js +84 -0
  282. package/dist/sync/cloudSyncApi.d.ts +4 -1
  283. package/dist/sync/cloudSyncApi.js +7 -2
  284. package/dist/sync/contentSyncState.d.ts +1 -1
  285. package/dist/sync/coordinator/localSyncExecutionPermitStore.d.ts +1 -0
  286. package/dist/sync/coordinator/localSyncExecutionPermitStore.js +67 -30
  287. package/dist/sync/coordinator/localWorkspaceSyncPendingV2PushProgress.d.ts +10 -0
  288. package/dist/sync/coordinator/localWorkspaceSyncPendingV2PushProgress.js +29 -0
  289. package/dist/sync/coordinator/localWorkspaceSyncRunner.js +6 -2
  290. package/dist/sync/coordinator/localWorkspaceSyncRunnerState.d.ts +15 -1
  291. package/dist/sync/coordinator/localWorkspaceSyncRunnerState.js +99 -2
  292. package/dist/sync/coordinator/workspaceSyncCredentialBroker.d.ts +1 -0
  293. package/dist/sync/coordinator/workspaceSyncCredentialBroker.js +33 -4
  294. package/dist/sync/engine/workspaceSyncContentLifecycleAdapter.d.ts +2 -1
  295. package/dist/sync/engine/workspaceSyncContentVersionStore.d.ts +38 -0
  296. package/dist/sync/engine/workspaceSyncContentVersionStore.js +50 -1
  297. package/dist/sync/engine/workspaceSyncEngineBrowserGatewayRemoteServices.js +20 -2
  298. package/dist/sync/engine/workspaceSyncEngineLifecyclePolicy.js +6 -6
  299. package/dist/sync/engine/workspaceSyncEngineLocalServices.d.ts +4 -0
  300. package/dist/sync/engine/workspaceSyncEngineLocalServices.js +11 -0
  301. package/dist/sync/engine/workspaceSyncEnginePushCompletion.d.ts +14 -0
  302. package/dist/sync/engine/workspaceSyncEnginePushCompletion.js +84 -0
  303. package/dist/sync/engine/workspaceSyncEngineRecovery.js +1 -0
  304. package/dist/sync/engine/workspaceSyncEngineRemoteServices.d.ts +11 -0
  305. package/dist/sync/engine/workspaceSyncEngineRemoteServices.js +2 -1
  306. package/dist/sync/engine/workspaceSyncEngineRuntime.d.ts +1 -0
  307. package/dist/sync/engine/workspaceSyncEngineRuntime.js +1 -0
  308. package/dist/sync/engine/workspaceSyncEngineServerRemoteServices.js +31 -4
  309. package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.d.ts +3 -1
  310. package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.js +134 -43
  311. package/dist/sync/engine/workspaceSyncEngineServerSnapshotReader.js +6 -0
  312. package/dist/sync/engine/workspaceSyncEngineTransfers.d.ts +1 -1
  313. package/dist/sync/engine/workspaceSyncEngineTransfers.js +11 -4
  314. package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.d.ts +1 -0
  315. package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.js +29 -0
  316. package/dist/sync/syncApplyHandlers.d.ts +2 -0
  317. package/dist/sync/syncApplyHandlers.js +10 -1
  318. package/dist/sync/syncService.d.ts +17 -0
  319. package/dist/sync/syncService.js +87 -19
  320. package/dist/sync/taskforceAgentSyncAuthorization.d.ts +16 -0
  321. package/dist/sync/taskforceAgentSyncAuthorization.js +20 -0
  322. package/dist/sync/v3/combinedFeedCapability.js +8 -0
  323. package/dist/sync/v3/durableInitiativeMutationRouter.js +18 -10
  324. package/dist/sync/v3/durableOperationReplay.d.ts +14 -0
  325. package/dist/sync/v3/durableOperationReplay.js +18 -0
  326. package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.d.ts +2 -0
  327. package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.js +14 -1
  328. package/dist/sync/v3/durableTaskChecklistMutationRouter.d.ts +4 -1
  329. package/dist/sync/v3/durableTaskChecklistMutationRouter.js +62 -15
  330. package/dist/sync/v3/durableTaskCommentMutationRouter.js +3 -0
  331. package/dist/sync/v3/durableTaskHttpBulkMutationRouter.d.ts +1 -0
  332. package/dist/sync/v3/durableTaskHttpBulkMutationRouter.js +30 -8
  333. package/dist/sync/v3/durableTaskHttpRootMutationRouter.d.ts +5 -3
  334. package/dist/sync/v3/durableTaskHttpRootMutationRouter.js +37 -2
  335. package/dist/sync/v3/durableTaxonomyMutationRouter.js +5 -0
  336. package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.d.ts +11 -0
  337. package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.js +39 -10
  338. package/dist/sync/v3/durableWorkstreamMutationRouter.js +18 -10
  339. package/dist/sync/v3/durableWorkstreamTaskOrderMutationRouter.js +16 -5
  340. package/dist/sync/v3/localOutboxDispatchRuntime.js +2 -2
  341. package/dist/sync/v3/localTaskAttachmentLinksOutboxService.d.ts +2 -0
  342. package/dist/sync/v3/localTaskAttachmentLinksOutboxService.js +47 -7
  343. package/dist/sync/v3/localTaskChecklistOutboxHandler.js +16 -2
  344. package/dist/sync/v3/localTaskChecklistOutboxService.d.ts +4 -0
  345. package/dist/sync/v3/localTaskChecklistOutboxService.js +14 -1
  346. package/dist/sync/v3/localTaskCreateOutboxService.js +15 -6
  347. package/dist/sync/v3/localTaskMetadataClient.d.ts +1 -0
  348. package/dist/sync/v3/localTaskMetadataClient.js +1 -0
  349. package/dist/sync/v3/localTaskMetadataOutboxHandler.js +5 -1
  350. package/dist/sync/v3/localTaskMetadataOutboxService.d.ts +2 -0
  351. package/dist/sync/v3/localTaskMetadataOutboxService.js +7 -0
  352. package/dist/sync/v3/localTaskRestoreOutboxService.js +14 -6
  353. package/dist/sync/v3/localTaskStatusClient.d.ts +1 -0
  354. package/dist/sync/v3/localTaskStatusClient.js +6 -1
  355. package/dist/sync/v3/localTaskStatusOutboxService.d.ts +10 -0
  356. package/dist/sync/v3/localTaskStatusOutboxService.js +272 -24
  357. package/dist/sync/v3/syncDurabilityStore.d.ts +41 -0
  358. package/dist/sync/v3/syncDurabilityStore.js +199 -13
  359. package/dist/sync/v3/taskAttachmentLinksMutationService.d.ts +6 -4
  360. package/dist/sync/v3/taskAttachmentLinksMutationService.js +19 -10
  361. package/dist/sync/v3/taskChecklistMutationService.d.ts +15 -2
  362. package/dist/sync/v3/taskChecklistMutationService.js +48 -1
  363. package/dist/sync/v3/taskCreateMutationService.d.ts +2 -2
  364. package/dist/sync/v3/taskCreateMutationService.js +7 -4
  365. package/dist/sync/v3/taskMetadataMutationService.d.ts +3 -0
  366. package/dist/sync/v3/taskMetadataMutationService.js +4 -0
  367. package/dist/sync/v3/taskRestoreMutationService.d.ts +2 -2
  368. package/dist/sync/v3/taskRestoreMutationService.js +7 -4
  369. package/dist/sync/v3/taskStatusMutationService.d.ts +31 -1
  370. package/dist/sync/v3/taskStatusMutationService.js +123 -3
  371. package/dist/sync/v3/workflowAssignmentSync.d.ts +6 -0
  372. package/dist/sync/v3/workflowAssignmentSync.js +30 -0
  373. package/dist/sync/v3/workspaceSyncJournalReader.js +1 -1
  374. package/dist/sync/v3/workspaceSyncOperationRetentionService.d.ts +16 -0
  375. package/dist/sync/v3/workspaceSyncOperationRetentionService.js +83 -0
  376. package/dist/sync/v3/workspaceSyncV2ProjectionExclusions.d.ts +1 -1
  377. package/dist/sync/v3/workspaceSyncV2ProjectionExclusions.js +13 -3
  378. package/dist/sync/v3/workspaceSyncV3AttachmentApplyObligationStore.d.ts +11 -0
  379. package/dist/sync/v3/workspaceSyncV3AttachmentApplyObligationStore.js +27 -10
  380. package/dist/sync/v3/workspaceSyncV3AttachmentAssetHydration.d.ts +2 -1
  381. package/dist/sync/v3/workspaceSyncV3AttachmentAssetHydration.js +52 -10
  382. package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.d.ts +1 -0
  383. package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.js +18 -3
  384. package/dist/sync/v3/workspaceSyncV3CombinedFeedOrchestrator.js +8 -3
  385. package/dist/sync/v3/workspaceSyncV3CombinedLocalApply.js +51 -10
  386. package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.d.ts +14 -0
  387. package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.js +49 -25
  388. package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.d.ts +13 -4
  389. package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.js +124 -57
  390. package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.d.ts +20 -0
  391. package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.js +106 -30
  392. package/dist/sync/v3/workspaceSyncV3CombinedWireContract.d.ts +4 -1
  393. package/dist/sync/v3/workspaceSyncV3CombinedWireContract.js +34 -0
  394. package/dist/sync/v3/workspaceSyncV3CoverageRegistry.js +12 -0
  395. package/dist/sync/v3/workspaceSyncV3FeedProfile.d.ts +1 -1
  396. package/dist/sync/v3/workspaceSyncV3LegacyBoundaryAttestation.d.ts +1 -0
  397. package/dist/sync/v3/workspaceSyncV3LegacyBoundaryAttestation.js +23 -10
  398. package/dist/sync/v3/workspaceSyncV3NestedTaskApply.d.ts +3 -0
  399. package/dist/sync/v3/workspaceSyncV3NestedTaskApply.js +64 -13
  400. package/dist/sync/v3/workspaceSyncV3NestedTaskCodecs.d.ts +9 -0
  401. package/dist/sync/v3/workspaceSyncV3NestedTaskCodecs.js +26 -0
  402. package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.d.ts +15 -5
  403. package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.js +50 -14
  404. package/dist/sync/v3/workspaceSyncV3NestedTaskRepairSnapshot.d.ts +2 -1
  405. package/dist/sync/v3/workspaceSyncV3NestedTaskRepairSnapshot.js +11 -3
  406. package/dist/sync/v3/workspaceSyncV3OperationProtocol.d.ts +5 -0
  407. package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.d.ts +7 -0
  408. package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.js +55 -9
  409. package/dist/sync/v3/workspaceSyncV3RepairSnapshotRetentionService.d.ts +17 -0
  410. package/dist/sync/v3/workspaceSyncV3RepairSnapshotRetentionService.js +64 -0
  411. package/dist/sync/v3/workspaceSyncV3TaskCommentAudit.js +9 -2
  412. package/dist/sync/v3/workspaceSyncV3TaskCoverCoverage.d.ts +7 -0
  413. package/dist/sync/v3/workspaceSyncV3TaskCoverCoverage.js +37 -0
  414. package/dist/sync/v3/workspaceSyncV3TaskCoverWireContract.d.ts +6 -0
  415. package/dist/sync/v3/workspaceSyncV3TaskCoverWireContract.js +9 -0
  416. package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverCoverage.d.ts +7 -0
  417. package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverCoverage.js +33 -0
  418. package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverWireContract.d.ts +7 -0
  419. package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverWireContract.js +8 -0
  420. package/dist/sync/workspacePullFeed.js +2 -1
  421. package/dist/sync/workspaceRepair.d.ts +8 -2
  422. package/dist/sync/workspaceRepair.js +222 -6
  423. package/dist/sync/workspaceSyncModel.d.ts +21 -0
  424. package/dist/sync/workspaceSyncModel.js +35 -7
  425. package/dist/sync/workspaceSyncState.d.ts +1 -0
  426. package/dist/sync/workspaceSyncV2SnapshotBuilder.d.ts +6 -0
  427. package/dist/sync/workspaceSyncV2SnapshotBuilder.js +5 -0
  428. package/dist/types.d.ts +47 -1
  429. package/dist/types.js +6 -0
  430. package/dist/ui/assets/AiIdentityRosterCard-OcSz1PkK.js +1 -0
  431. package/dist/ui/assets/AiProfilesModule-ByhYW5Xi.js +1 -0
  432. package/dist/ui/assets/AnnotatedAttachmentWorkspace-BTM6nIg_.js +3 -0
  433. package/dist/ui/assets/AnnotatedAttachmentWorkspace-TzYu7pkG.css +1 -0
  434. package/dist/ui/assets/{AssetTraySortControl-Kf1pelSy.js → AssetTraySortControl-DabEG8L4.js} +1 -1
  435. package/dist/ui/assets/{ContextAttachmentManager-B8boOs6Q.js → ContextAttachmentManager-Coa8yVGM.js} +2 -2
  436. package/dist/ui/assets/{DocumentWorkspace-DXH4XUsB.js → DocumentWorkspace-BB0qhdix.js} +1 -1
  437. package/dist/ui/assets/{EntityActivityTimeline-BtSTq0ON.js → EntityActivityTimeline-CZ8x4UJE.js} +1 -1
  438. package/dist/ui/assets/PlanningModule-pRPjR7v5.js +1 -0
  439. package/dist/ui/assets/PlansPage-D86pZSSl.js +1 -0
  440. package/dist/ui/assets/TaskContextUpload-BVIkU9yT.js +1 -0
  441. package/dist/ui/assets/TaskSettings-Cv1mNhv_.js +12 -0
  442. package/dist/ui/assets/TaskforceAgentsModule-b-8R25cJ.css +1 -0
  443. package/dist/ui/assets/TaskforceAgentsModule-gmH-PD2q.js +24 -0
  444. package/dist/ui/assets/{WorkflowManagerModule-DWFspC-o.js → WorkflowManagerModule-DbfnHJ-f.js} +1 -1
  445. package/dist/ui/assets/index-BZ-hdZSk.css +1 -0
  446. package/dist/ui/assets/index-CTsDBaef.js +7 -0
  447. package/dist/ui/assets/{vendor-icons-BkFLXavV.js → vendor-icons-Bsq-mcEn.js} +1 -1
  448. package/dist/ui/branding/logos/letterhead_dark.png +0 -0
  449. package/dist/ui/branding/logos/letterhead_light.png +0 -0
  450. package/dist/ui/branding/logos/signature_dark.png +0 -0
  451. package/dist/ui/branding/logos/signature_light.png +0 -0
  452. package/dist/ui/index.html +3 -3
  453. package/dist/utils/aiProfileDefaultLogo.js +16 -48
  454. package/dist/utils/httpSetCookie.d.ts +1 -0
  455. package/dist/utils/httpSetCookie.js +4 -1
  456. package/dist/utils/localRuntimeUrl.d.ts +1 -0
  457. package/dist/utils/localRuntimeUrl.js +14 -0
  458. package/dist/utils/productLogoRegistry.d.ts +2 -0
  459. package/dist/utils/productLogoRegistry.js +36 -0
  460. package/dist/utils/syncStatusPresentation.d.ts +4 -0
  461. package/dist/utils/syncStatusPresentation.js +17 -0
  462. package/dist/utils/taskActivity.d.ts +3 -2
  463. package/dist/utils/taskActivity.js +19 -2
  464. package/dist/utils/taskEditorReconciliation.d.ts +40 -0
  465. package/dist/utils/taskEditorReconciliation.js +217 -0
  466. package/dist/utils/taskEvents.d.ts +2 -0
  467. package/dist/utils/taskNormalization.d.ts +1 -0
  468. package/dist/utils/taskNormalization.js +39 -0
  469. package/dist/utils/taskSearch.js +2 -2
  470. package/dist/utils/uiNotice.d.ts +4 -0
  471. package/dist/utils/workspaceSyncPresentation.d.ts +1 -1
  472. package/dist/utils/workspaceSyncPresentation.js +23 -17
  473. package/package.json +36 -6
  474. package/dist/ui/assets/AiIdentityRosterCard-MZs7lVED.js +0 -1
  475. package/dist/ui/assets/AiProfilesModule-C3i0LOxe.js +0 -1
  476. package/dist/ui/assets/AnnotatedAttachmentWorkspace-CBRZ8rca.css +0 -1
  477. package/dist/ui/assets/AnnotatedAttachmentWorkspace-DVZk5Tln.js +0 -3
  478. package/dist/ui/assets/PlanningModule-BPVyEa-f.js +0 -1
  479. package/dist/ui/assets/PlansPage-ChqgxALc.js +0 -1
  480. package/dist/ui/assets/TaskContextUpload-CB3ol0sN.js +0 -1
  481. package/dist/ui/assets/TaskSettings-g4ECKNOz.js +0 -12
  482. package/dist/ui/assets/TaskforceAgentsModule-BazdUwxZ.js +0 -21
  483. package/dist/ui/assets/TaskforceAgentsModule-D6IC0S7Q.css +0 -1
  484. package/dist/ui/assets/index-BUplSsv_.js +0 -7
  485. package/dist/ui/assets/index-gz2EXuoK.css +0 -1
@@ -11,7 +11,8 @@
11
11
  * DELETE /api/taskforce/annotated-attachments/sessions/:id
12
12
  * GET /api/taskforce/annotated-attachments/sessions/:id/payload
13
13
  */
14
- import { ANNOTATED_ATTACHMENTS_WORKSPACE_FEATURE_KEY, resolveAppGateAccess, } from '../../runtime/appGates.js';
14
+ import { ANNOTATED_ATTACHMENTS_WORKSPACE_FEATURE_KEY, } from '../../runtime/appGates.js';
15
+ import { resolveNodeAppGateAccess } from '../../runtime/nodeAppGates.js';
15
16
  import { parseJsonBody } from './primitives.js';
16
17
  import { resolveErrorStatusCode } from './shared.js';
17
18
  import { getImageReferenceLabel, parseImageReference } from '../../utils/imageReferences.js';
@@ -37,7 +38,7 @@ export function registerAnnotatedAttachmentRoutes(deps) {
37
38
  const ensureAnnotatedAttachmentAccess = (req, res, workspaceId) => {
38
39
  if (!ensureAppAccess(req, res))
39
40
  return false;
40
- const gate = resolveAppGateAccess(ANNOTATED_ATTACHMENTS_WORKSPACE_FEATURE_KEY);
41
+ const gate = resolveNodeAppGateAccess(ANNOTATED_ATTACHMENTS_WORKSPACE_FEATURE_KEY);
41
42
  if (gate.allowed)
42
43
  return true;
43
44
  writeJson(res, 403, {
@@ -60,6 +60,7 @@ import { buildGithubAuthUrl, exchangeGithubCode } from '../auth/providers/github
60
60
  import { hasValidSession, createClearSessionCookie, createSessionTokenCookie, resolveRequestAccess, resolveSessionCookieAttributesForRequest, } from '../auth.js';
61
61
  import { sendEmail } from '../email.js';
62
62
  import { resolveDeploymentConfig } from '../../config/deployment.js';
63
+ import { resolveNodeAppGateAccessMap } from '../../runtime/nodeAppGates.js';
63
64
  import { resolveTaskMetadataActivationCapability } from '../../sync/v3/taskMetadataActivation.js';
64
65
  import { resolveTaskCreateActivationCapability } from '../../sync/v3/taskCreateActivation.js';
65
66
  import { resolveTaskStatusActivationCapability } from '../../sync/v3/taskStatusActivation.js';
@@ -401,7 +402,7 @@ export function registerAuthRoutes(deps) {
401
402
  : 'Reset your Taskforce password';
402
403
  const text = kind === 'verify-email'
403
404
  ? `Welcome to Taskforce.\n\nYou're almost in. Enter this verification token on the verification screen to activate your account:\n\n${token}\n\nPrefer the faster route? Open the link below to verify your email automatically:\n${link}\n\nIf you didn't create a Taskforce account, you can safely ignore this email.`
404
- : `Reset your Taskforce password using this link:\n${link}\n\nIf you did not request this reset, you can ignore this message.`;
405
+ : `Enter this password reset token on the reset screen:\n\n${token}\n\nOr reset your Taskforce password using this link:\n${link}\n\nIf you did not request this reset, you can ignore this message.`;
405
406
  const result = await sendEmail({
406
407
  to: email,
407
408
  subject,
@@ -470,6 +471,7 @@ export function registerAuthRoutes(deps) {
470
471
  authSource: runtimeContract.authSource,
471
472
  workspaceMode: runtimeContract.workspaceMode,
472
473
  workspaceSwitchingEnabled: runtimeContract.workspaceSwitchingEnabled,
474
+ appGates: resolveNodeAppGateAccessMap(process.env),
473
475
  syncV3
474
476
  }
475
477
  }));
@@ -1857,7 +1857,11 @@ export function registerBillingRoutes(deps) {
1857
1857
  const userIdentity = core.resolveUserIdentity(userId);
1858
1858
  const normalizedUserEmail = normalizeEmail(userIdentity?.email);
1859
1859
  if (pricing.pricingType === 'free') {
1860
- if (currentEntitlement?.plan_version_id && String(currentEntitlement.plan_version_id).trim() === planVersionId) {
1860
+ const currentEntitlementPlanVersionId = String(currentEntitlement?.plan_version_id || '').trim();
1861
+ const currentEntitlementState = String(currentEntitlement?.entitlement_state || '').trim();
1862
+ if (currentEntitlementPlanVersionId
1863
+ && currentEntitlementPlanVersionId === planVersionId
1864
+ && isCommercialStateAppAccessible(currentEntitlementState)) {
1861
1865
  res.writeHead(200, { 'Content-Type': 'application/json' });
1862
1866
  res.end(JSON.stringify({
1863
1867
  checkoutState: 'already_current_plan',
@@ -10,8 +10,9 @@ export declare function createTaskHttpDurableRouters(input: {
10
10
  actorRef: string;
11
11
  root: {
12
12
  enabled: boolean;
13
+ hasCommittedOperation(): boolean;
13
14
  create(candidate: unknown): import("../../core/Taskforce.js").TaskItem;
14
- update(taskIdInput: string, candidate: unknown, saveSource: "manual" | "autosave", activityAction?: "task-updated" | "task-schedule-changed"): import("../../core/Taskforce.js").TaskItem;
15
+ update(taskIdInput: string, candidate: unknown, saveSource: "manual" | "autosave", activityAction?: "task-updated" | "task-schedule-changed", expectedDetailRevision?: string): import("../../core/Taskforce.js").TaskItem;
15
16
  runBatch<T>(routeInput: string, request: unknown, apply: (context: {
16
17
  runChild<R>(mutation: () => R): R;
17
18
  deferPostCommitNotification(notify: () => void): void;
@@ -41,6 +42,8 @@ export declare function createTaskHttpDurableRouters(input: {
41
42
  replace(args: {
42
43
  taskId: string;
43
44
  items: readonly Partial<import("../../core/Taskforce.js").ChecklistItem>[];
45
+ expectedDetailRevision?: string;
46
+ itemUpdateIntent?: import("../../sync/v3/taskChecklistMutationService.js").TaskChecklistItemUpdateIntent;
44
47
  }): {
45
48
  state: "pending" | "committed";
46
49
  route: "local-outbox" | "cloud-acceptance";
@@ -54,6 +57,7 @@ export declare function createTaskHttpDurableRouters(input: {
54
57
  taskId: string;
55
58
  links: readonly import("../../sync/v3/workspaceSyncV3NestedTaskCodecs.js").WorkspaceSyncV3TaskAttachmentLink[];
56
59
  cardCoverAssetId?: string | null;
60
+ expectedDetailRevision?: string;
57
61
  }): {
58
62
  state: "pending" | "committed";
59
63
  route: "local-outbox" | "cloud-acceptance";
@@ -66,6 +70,8 @@ export declare function createTaskHttpDurableRouters(input: {
66
70
  replace(args: {
67
71
  taskId: string;
68
72
  items: readonly Partial<import("../../core/Taskforce.js").ChecklistItem>[];
73
+ expectedDetailRevision?: string;
74
+ itemUpdateIntent?: import("../../sync/v3/taskChecklistMutationService.js").TaskChecklistItemUpdateIntent;
69
75
  }): {
70
76
  state: "pending" | "committed";
71
77
  route: "local-outbox" | "cloud-acceptance";
@@ -79,6 +85,7 @@ export declare function createTaskHttpDurableRouters(input: {
79
85
  taskId: string;
80
86
  links: readonly import("../../sync/v3/workspaceSyncV3NestedTaskCodecs.js").WorkspaceSyncV3TaskAttachmentLink[];
81
87
  cardCoverAssetId?: string | null;
88
+ expectedDetailRevision?: string;
82
89
  }): {
83
90
  state: "pending" | "committed";
84
91
  route: "local-outbox" | "cloud-acceptance";
@@ -134,6 +141,7 @@ export declare function createTaskHttpDurableRouters(input: {
134
141
  }>, options?: {
135
142
  saveSource?: "manual" | "autosave";
136
143
  atomicItemFailures?: boolean;
144
+ expectedDetailRevision?: string;
137
145
  }): {
138
146
  preview: import("../../core/Taskforce.js").BulkUpdateFieldsPreview;
139
147
  results: import("../../core/Taskforce.js").TaskItem[];
@@ -149,8 +157,9 @@ export declare function createTaskHttpDurableRouters(input: {
149
157
  };
150
158
  createRootRouter: (operationId?: string, deferPostCommitNotification?: (notify: () => void) => void) => {
151
159
  enabled: boolean;
160
+ hasCommittedOperation(): boolean;
152
161
  create(candidate: unknown): import("../../core/Taskforce.js").TaskItem;
153
- update(taskIdInput: string, candidate: unknown, saveSource: "manual" | "autosave", activityAction?: "task-updated" | "task-schedule-changed"): import("../../core/Taskforce.js").TaskItem;
162
+ update(taskIdInput: string, candidate: unknown, saveSource: "manual" | "autosave", activityAction?: "task-updated" | "task-schedule-changed", expectedDetailRevision?: string): import("../../core/Taskforce.js").TaskItem;
154
163
  runBatch<T>(routeInput: string, request: unknown, apply: (context: {
155
164
  runChild<R>(mutation: () => R): R;
156
165
  deferPostCommitNotification(notify: () => void): void;
@@ -0,0 +1,19 @@
1
+ import type { IncomingMessage, ServerResponse } from 'http';
2
+ import type { ExecutorPhaseAApprovalService } from '../../services/executorPhaseAApprovalService.js';
3
+ import { type RouteHandler } from './primitives.js';
4
+ export declare const EXECUTOR_PHASE_A_APPROVAL_PAGE_PATH = "/taskforce/admin/executor/phase-a-approval";
5
+ export declare const EXECUTOR_PHASE_A_APPROVAL_PAGE_SCRIPT_PATH = "/taskforce/admin/executor/phase-a-approval.js";
6
+ export declare const EXECUTOR_PHASE_A_APPROVAL_ISSUE_PATH = "/api/taskforce/admin/executor/phase-a-approval-receipts";
7
+ export interface ExecutorPhaseAApprovalRouteDependencies {
8
+ addRoute: (method: string, path: string, handler: RouteHandler) => void;
9
+ service: ExecutorPhaseAApprovalService | null;
10
+ requireCloudRuntime: (res: ServerResponse, feature: string) => boolean;
11
+ ensureAppAccess: (req: IncomingMessage, res: ServerResponse) => boolean;
12
+ resolveHumanSystemAdminActor: (req: IncomingMessage) => string | null;
13
+ hasActiveWorkspaceMembership: (workspaceId: string, userId: string) => boolean;
14
+ auditAuthAction: (req: IncomingMessage, action: string, details: Record<string, unknown>, workspaceIdOverride?: string | null) => void;
15
+ workspaceId: string;
16
+ allowedOrigin: string;
17
+ performanceEnvironment: boolean;
18
+ }
19
+ export declare function registerExecutorPhaseAApprovalRoutes(deps: ExecutorPhaseAApprovalRouteDependencies): void;
@@ -0,0 +1,140 @@
1
+ import { ExecutorPhaseAApprovalError } from '../../services/executorPhaseAApprovalService.js';
2
+ import { ExecutorPhaseAApprovalConflictError } from '../../storage/executorPhaseAApprovalReceiptStore.js';
3
+ import { EXECUTOR_PHASE_A_ISSUANCE_REQUEST_SCHEMA, EXECUTOR_PHASE_A_MAX_PREFLIGHT_BYTES } from '../../shared/executorPhaseAApprovalReceipt.js';
4
+ import { parseJsonBody } from './primitives.js';
5
+ export const EXECUTOR_PHASE_A_APPROVAL_PAGE_PATH = '/taskforce/admin/executor/phase-a-approval';
6
+ export const EXECUTOR_PHASE_A_APPROVAL_PAGE_SCRIPT_PATH = '/taskforce/admin/executor/phase-a-approval.js';
7
+ export const EXECUTOR_PHASE_A_APPROVAL_ISSUE_PATH = '/api/taskforce/admin/executor/phase-a-approval-receipts';
8
+ function writeJson(res, statusCode, body) {
9
+ res.writeHead(statusCode, { 'Content-Type': 'application/json' });
10
+ res.end(JSON.stringify(body));
11
+ }
12
+ function isSameOriginJson(req, allowedOrigin) {
13
+ const contentType = String(req.headers['content-type'] || '').split(';')[0].trim().toLowerCase();
14
+ if (contentType !== 'application/json')
15
+ return false;
16
+ const origin = String(req.headers.origin || '').trim();
17
+ if (!origin || origin === 'null')
18
+ return false;
19
+ if (String(req.headers['sec-fetch-site'] || '').trim().toLowerCase() === 'cross-site')
20
+ return false;
21
+ try {
22
+ return origin === allowedOrigin && new URL(origin).origin === allowedOrigin;
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ }
28
+ function renderPage(issuePath) {
29
+ return `<!doctype html>
30
+ <html lang="en">
31
+ <head>
32
+ <meta charset="utf-8" />
33
+ <meta name="viewport" content="width=device-width,initial-scale=1" />
34
+ <title>Phase A Approval</title>
35
+ <style>
36
+ body{margin:0;background:#f5f6f8;color:#17191d;font:15px system-ui,sans-serif}.bar{height:56px;background:#fff;border-bottom:1px solid #dfe2e7;display:flex;align-items:center;padding:0 24px;font-weight:700}.main{max-width:760px;margin:40px auto;padding:0 24px}.panel{background:#fff;border:1px solid #dfe2e7;border-radius:8px;padding:24px}h1{font-size:24px;margin:0 0 24px}label{display:block;font-weight:650;margin-bottom:8px}input{width:100%;box-sizing:border-box;border:1px solid #aeb4bd;padding:12px;border-radius:6px}button{margin-top:20px;background:#176b4d;color:#fff;border:0;border-radius:6px;padding:11px 16px;font-weight:700;cursor:pointer}button:disabled{opacity:.45;cursor:not-allowed}pre{white-space:pre-wrap;background:#f7f8fa;border:1px solid #e2e5e9;padding:12px;min-height:48px;max-height:280px;overflow:auto}
37
+ </style>
38
+ </head>
39
+ <body><div class="bar">Taskforce System Administration</div><main class="main" data-issue-path="${issuePath}" data-request-schema="${EXECUTOR_PHASE_A_ISSUANCE_REQUEST_SCHEMA}"><section class="panel">
40
+ <h1>Phase A Approval</h1>
41
+ <label for="preflight">Canonical preflight JSON</label><input id="preflight" type="file" accept="application/json,.json" />
42
+ <pre id="summary">No preflight selected.</pre><button id="approve" type="button" disabled>Approve and download receipt</button>
43
+ </section></main><script src="${EXECUTOR_PHASE_A_APPROVAL_PAGE_SCRIPT_PATH}" defer></script></body></html>`;
44
+ }
45
+ function renderPageScript() {
46
+ return `const root=document.querySelector('main[data-issue-path]'),file=document.getElementById('preflight'),button=document.getElementById('approve'),summary=document.getElementById('summary');let encoded='';
47
+ file.addEventListener('change',async()=>{button.disabled=true;encoded='';const selected=file.files[0];if(!selected)return;const bytes=new Uint8Array(await selected.arrayBuffer());let binary='';for(const value of bytes)binary+=String.fromCharCode(value);encoded=btoa(binary).replace(/\\+/g,'-').replace(/\\//g,'_').replace(/=+$/,'');try{const value=JSON.parse(new TextDecoder().decode(bytes));summary.textContent=JSON.stringify({runId:value.runId,status:value.status,failures:value.failures,authority:value.approvalContext,target:value.target,source:value.source,budgets:value.budgets,pricing:value.pricing,cleanupInventory:value.logicalEnvelope?.cleanupInventory,collectedAt:value.collectedAt,expiresAt:value.expiresAt},null,2);button.disabled=false}catch{summary.textContent='Invalid JSON.'}});
48
+ button.addEventListener('click',async()=>{button.disabled=true;const response=await fetch(root.dataset.issuePath,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({schema:root.dataset.requestSchema,preflightBase64Url:encoded})});if(!response.ok){let message='Approval failed.';try{message=(await response.json()).error||message}catch{}summary.textContent=message;button.disabled=false;return}const blob=await response.blob(),link=document.createElement('a');link.href=URL.createObjectURL(blob);link.download='taskforce-phase-a-approval-receipt.json';link.click();URL.revokeObjectURL(link.href);summary.textContent='Approval receipt issued.'});`;
49
+ }
50
+ export function registerExecutorPhaseAApprovalRoutes(deps) {
51
+ const authorize = (req, res) => {
52
+ if (!deps.requireCloudRuntime(res, 'Executor Phase A approvals'))
53
+ return null;
54
+ if (!deps.performanceEnvironment) {
55
+ writeJson(res, 404, { error: 'Executor Phase A approvals are available only in the performance environment.' });
56
+ return null;
57
+ }
58
+ if (!deps.ensureAppAccess(req, res))
59
+ return null;
60
+ const actorUserId = String(deps.resolveHumanSystemAdminActor(req) || '').trim();
61
+ if (!actorUserId) {
62
+ deps.auditAuthAction(req, 'executor.phase-a.approval.denied', { code: 'human_system_admin_required' }, deps.workspaceId);
63
+ writeJson(res, 403, { error: 'Human system administrator access is required.' });
64
+ return null;
65
+ }
66
+ if (!deps.hasActiveWorkspaceMembership(deps.workspaceId, actorUserId)) {
67
+ deps.auditAuthAction(req, 'executor.phase-a.approval.denied', { code: 'active_workspace_membership_required' }, deps.workspaceId);
68
+ writeJson(res, 403, { error: 'Active membership in the Phase A workspace is required.' });
69
+ return null;
70
+ }
71
+ return actorUserId;
72
+ };
73
+ deps.addRoute('GET', EXECUTOR_PHASE_A_APPROVAL_PAGE_PATH, async (req, res) => {
74
+ if (!authorize(req, res))
75
+ return;
76
+ res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8', 'Cache-Control': 'no-store' });
77
+ res.end(renderPage(EXECUTOR_PHASE_A_APPROVAL_ISSUE_PATH));
78
+ });
79
+ deps.addRoute('GET', EXECUTOR_PHASE_A_APPROVAL_PAGE_SCRIPT_PATH, async (req, res) => {
80
+ if (!authorize(req, res))
81
+ return;
82
+ res.writeHead(200, { 'Content-Type': 'application/javascript; charset=utf-8', 'Cache-Control': 'no-store' });
83
+ res.end(renderPageScript());
84
+ });
85
+ deps.addRoute('POST', EXECUTOR_PHASE_A_APPROVAL_ISSUE_PATH, async (req, res) => {
86
+ const actorUserId = authorize(req, res);
87
+ if (!actorUserId)
88
+ return;
89
+ if (!isSameOriginJson(req, deps.allowedOrigin)) {
90
+ deps.auditAuthAction(req, 'executor.phase-a.approval.denied', { code: 'same_origin_json_required' }, deps.workspaceId);
91
+ writeJson(res, 403, { error: 'Same-origin application/json submission is required.' });
92
+ return;
93
+ }
94
+ if (!deps.service) {
95
+ deps.auditAuthAction(req, 'executor.phase-a.approval.denied', { code: 'issuer_not_configured' }, deps.workspaceId);
96
+ writeJson(res, 503, { error: 'Phase A approval receipt signing is not configured.' });
97
+ return;
98
+ }
99
+ try {
100
+ const body = await parseJsonBody(req, Math.ceil(EXECUTOR_PHASE_A_MAX_PREFLIGHT_BYTES * 1.4));
101
+ if (!body || typeof body !== 'object' || Array.isArray(body) || Object.keys(body).length !== 2
102
+ || body.schema !== EXECUTOR_PHASE_A_ISSUANCE_REQUEST_SCHEMA || typeof body.preflightBase64Url !== 'string') {
103
+ throw new ExecutorPhaseAApprovalError('Request does not match the Phase A issuance request schema.');
104
+ }
105
+ const encoded = body.preflightBase64Url;
106
+ if (!/^[A-Za-z0-9_-]+$/.test(encoded)) {
107
+ throw new ExecutorPhaseAApprovalError('preflightBase64Url must be unpadded base64url.');
108
+ }
109
+ const preflightBytes = Buffer.from(encoded, 'base64url');
110
+ if (preflightBytes.toString('base64url') !== encoded) {
111
+ throw new ExecutorPhaseAApprovalError('preflightBase64Url is not canonical base64url.');
112
+ }
113
+ const result = deps.service.issue(preflightBytes, actorUserId);
114
+ deps.auditAuthAction(req, result.created ? 'executor.phase-a.approval.issued' : 'executor.phase-a.approval.retried', {
115
+ receiptId: result.receiptId,
116
+ receiptSha256: result.digest,
117
+ }, deps.workspaceId);
118
+ res.writeHead(result.created ? 201 : 200, {
119
+ 'Content-Type': 'application/json',
120
+ 'Content-Disposition': 'attachment; filename="taskforce-phase-a-approval-receipt.json"',
121
+ 'Cache-Control': 'no-store',
122
+ 'X-Taskforce-Receipt-Sha256': result.digest,
123
+ });
124
+ res.end(result.bytes);
125
+ }
126
+ catch (error) {
127
+ const statusCode = error instanceof ExecutorPhaseAApprovalError || error instanceof ExecutorPhaseAApprovalConflictError
128
+ ? error.statusCode
129
+ : Number(error?.statusCode) || 500;
130
+ const code = error instanceof ExecutorPhaseAApprovalError || error instanceof ExecutorPhaseAApprovalConflictError
131
+ ? error.code
132
+ : 'internal_error';
133
+ deps.auditAuthAction(req, 'executor.phase-a.approval.denied', { code }, deps.workspaceId);
134
+ writeJson(res, statusCode, {
135
+ error: statusCode >= 500 ? 'Internal server error.' : String(error?.message || 'Approval failed.'),
136
+ code,
137
+ });
138
+ }
139
+ });
140
+ }
@@ -0,0 +1,11 @@
1
+ import type { IncomingMessage, ServerResponse } from 'node:http';
2
+ import type { RouteHandler } from './primitives.js';
3
+ export interface ExecutorPhaseAIssuerRedemptionRouteDependencies {
4
+ addRoute: (method: string, path: string, handler: RouteHandler) => void;
5
+ requireCloudRuntime: (res: ServerResponse, feature: string) => boolean;
6
+ performanceEnvironment: boolean;
7
+ featureEnabled: boolean;
8
+ auditAuthAction: (req: IncomingMessage, action: string, details: Record<string, unknown>, workspaceIdOverride?: string | null) => void;
9
+ workspaceId: string;
10
+ }
11
+ export declare function registerExecutorPhaseAIssuerRedemptionRoutes(deps: ExecutorPhaseAIssuerRedemptionRouteDependencies): void;
@@ -0,0 +1,24 @@
1
+ import { EXECUTOR_PHASE_A_ISSUER_REDEMPTION_PATH } from '../../shared/executorPhaseAIssuerContracts.js';
2
+ function writeJson(res, statusCode, body) {
3
+ res.writeHead(statusCode, { 'Content-Type': 'application/json', 'Cache-Control': 'no-store' });
4
+ res.end(JSON.stringify(body));
5
+ }
6
+ export function registerExecutorPhaseAIssuerRedemptionRoutes(deps) {
7
+ deps.addRoute('POST', EXECUTOR_PHASE_A_ISSUER_REDEMPTION_PATH, async (req, res) => {
8
+ if (!deps.requireCloudRuntime(res, 'Executor Phase A issuer redemption'))
9
+ return;
10
+ if (!deps.performanceEnvironment || !deps.featureEnabled) {
11
+ writeJson(res, 404, { error: 'Not found.' });
12
+ return;
13
+ }
14
+ // Package 1 deliberately has no integration path. Package 2 must install the
15
+ // independently reviewed pre-Lambda machine-authentication gate first.
16
+ deps.auditAuthAction(req, 'executor.phase-a.issuer-redemption.denied', {
17
+ code: 'broker_preintegration_authentication_not_configured',
18
+ }, deps.workspaceId);
19
+ writeJson(res, 503, {
20
+ error: 'Phase A broker authentication is not configured.',
21
+ code: 'broker_preintegration_authentication_not_configured',
22
+ });
23
+ });
24
+ }
@@ -0,0 +1,19 @@
1
+ import type { IncomingMessage, ServerResponse } from 'http';
2
+ import { type GitHubReviewEvidenceInstallationStore } from '../../storage/githubReviewEvidenceInstallationStore.js';
3
+ import type { GitHubInstallationInspection } from '../../services/githubReviewEvidenceService.js';
4
+ import { type RouteHandler } from './primitives.js';
5
+ export interface GitHubReviewEvidenceRouteDependencies {
6
+ addRoute: (method: string, path: string, handler: RouteHandler) => void;
7
+ store: GitHubReviewEvidenceInstallationStore;
8
+ configured: boolean;
9
+ inspectInstallation: (installationId: string) => Promise<GitHubInstallationInspection>;
10
+ requestWorkspaceId: (req: IncomingMessage) => string;
11
+ requestRole: (req: IncomingMessage) => string;
12
+ resolveAuthenticatedUserId: (req: IncomingMessage) => string;
13
+ ensureAppAccess: (req: IncomingMessage, res: ServerResponse) => boolean;
14
+ ensureWorkspaceAdminRole: (req: IncomingMessage, workspaceIdOverride?: string | null) => boolean;
15
+ ensureAdminRole: (req: IncomingMessage) => boolean;
16
+ requireCloudRuntime: (res: ServerResponse, feature: string) => boolean;
17
+ auditAuthAction: (req: IncomingMessage, action: string, details: Record<string, unknown>, workspaceIdOverride?: string | null) => void;
18
+ }
19
+ export declare function registerGitHubReviewEvidenceRoutes(deps: GitHubReviewEvidenceRouteDependencies): void;
@@ -0,0 +1,116 @@
1
+ import { GitHubReviewEvidenceInstallationConflictError, } from '../../storage/githubReviewEvidenceInstallationStore.js';
2
+ import { GitHubReviewEvidenceError } from '../../services/githubReviewEvidenceService.js';
3
+ import { parseJsonBody } from './primitives.js';
4
+ const SETTINGS_PATH = '/api/taskforce/settings/github-review-evidence/installation';
5
+ function writeJson(res, statusCode, body) {
6
+ res.writeHead(statusCode, { 'Content-Type': 'application/json' });
7
+ res.end(JSON.stringify(body));
8
+ }
9
+ function publicBinding(binding) {
10
+ if (!binding)
11
+ return null;
12
+ return {
13
+ installationId: binding.installationId,
14
+ accountId: binding.accountId,
15
+ accountLogin: binding.accountLogin,
16
+ accountType: binding.accountType,
17
+ repositorySelection: binding.repositorySelection,
18
+ createdAt: binding.createdAt,
19
+ updatedAt: binding.updatedAt,
20
+ };
21
+ }
22
+ function writeProviderError(res, error) {
23
+ if (error instanceof GitHubReviewEvidenceError) {
24
+ if (error.retryAfterSeconds)
25
+ res.setHeader('Retry-After', String(error.retryAfterSeconds));
26
+ writeJson(res, error.statusCode, { error: error.message, code: error.code });
27
+ return;
28
+ }
29
+ if (error instanceof GitHubReviewEvidenceInstallationConflictError) {
30
+ writeJson(res, error.statusCode, { error: error.message, code: error.code });
31
+ return;
32
+ }
33
+ writeJson(res, 500, { error: 'Internal server error.' });
34
+ }
35
+ export function registerGitHubReviewEvidenceRoutes(deps) {
36
+ const { addRoute, store, configured, inspectInstallation, requestWorkspaceId, requestRole, resolveAuthenticatedUserId, ensureAppAccess, ensureWorkspaceAdminRole, ensureAdminRole, requireCloudRuntime, auditAuthAction, } = deps;
37
+ const authorize = (req, res, systemAdminRequired = false) => {
38
+ if (!ensureAppAccess(req, res))
39
+ return null;
40
+ if (!requireCloudRuntime(res, 'GitHub review evidence'))
41
+ return null;
42
+ const workspaceId = String(requestWorkspaceId(req) || '').trim();
43
+ if (!workspaceId) {
44
+ writeJson(res, 400, { error: 'Workspace ID is required.' });
45
+ return null;
46
+ }
47
+ const actorUserId = String(resolveAuthenticatedUserId(req) || '').trim();
48
+ if (!actorUserId || actorUserId === 'anonymous') {
49
+ writeJson(res, 401, { error: 'Authentication is required.' });
50
+ return null;
51
+ }
52
+ if (systemAdminRequired ? !ensureAdminRole(req) : !ensureWorkspaceAdminRole(req, workspaceId)) {
53
+ writeJson(res, 403, {
54
+ error: systemAdminRequired
55
+ ? 'System administrator access is required.'
56
+ : 'Workspace owner or admin access is required.',
57
+ });
58
+ return null;
59
+ }
60
+ return workspaceId;
61
+ };
62
+ addRoute('GET', SETTINGS_PATH, async (req, res) => {
63
+ const workspaceId = authorize(req, res);
64
+ if (!workspaceId)
65
+ return;
66
+ writeJson(res, 200, { configured, installation: publicBinding(store.get(workspaceId)) });
67
+ });
68
+ addRoute('PUT', SETTINGS_PATH, async (req, res) => {
69
+ const workspaceId = authorize(req, res, true);
70
+ if (!workspaceId)
71
+ return;
72
+ try {
73
+ const body = await parseJsonBody(req, 16 * 1024);
74
+ const installation = await inspectInstallation(String(body?.installationId || '').trim());
75
+ const actorUserId = String(resolveAuthenticatedUserId(req) || '').trim();
76
+ const binding = store.put({
77
+ workspaceId,
78
+ installationId: installation.installationId,
79
+ accountId: installation.accountId,
80
+ accountLogin: installation.accountLogin,
81
+ accountType: installation.accountType,
82
+ repositorySelection: installation.repositorySelection,
83
+ boundByUserId: actorUserId,
84
+ });
85
+ auditAuthAction(req, 'github.review-evidence.installation.bound', {
86
+ installationId: binding.installationId,
87
+ accountId: binding.accountId,
88
+ accountLogin: binding.accountLogin,
89
+ repositorySelection: binding.repositorySelection,
90
+ }, workspaceId);
91
+ writeJson(res, 200, { success: true, installation: publicBinding(binding) });
92
+ }
93
+ catch (error) {
94
+ auditAuthAction(req, 'github.review-evidence.installation.bind-failed', {
95
+ code: error instanceof GitHubReviewEvidenceError || error instanceof GitHubReviewEvidenceInstallationConflictError
96
+ ? error.code
97
+ : 'internal_error',
98
+ }, workspaceId);
99
+ writeProviderError(res, error);
100
+ }
101
+ });
102
+ addRoute('DELETE', SETTINGS_PATH, async (req, res) => {
103
+ const workspaceId = authorize(req, res);
104
+ if (!workspaceId)
105
+ return;
106
+ const existing = store.get(workspaceId);
107
+ const removed = store.delete(workspaceId);
108
+ auditAuthAction(req, 'github.review-evidence.installation.unbound', {
109
+ installationId: existing?.installationId || null,
110
+ accountId: existing?.accountId || null,
111
+ removed,
112
+ actorRole: requestRole(req),
113
+ }, workspaceId);
114
+ writeJson(res, 200, { success: true, removed });
115
+ });
116
+ }
@@ -1,13 +1,24 @@
1
- import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
1
+ import type { IncomingMessage } from 'http';
2
+ import { NodeStreamableHTTPServerTransport } from '@modelcontextprotocol/node';
2
3
  import type { TaskforceCore } from '../../core/Taskforce.js';
3
- import { createTaskforceMcpServer } from '../../mcp/runtime.js';
4
+ import { type McpRuntimeFactory, type TaskforceMcpServerOptions } from '../../mcp/runtime.js';
4
5
  import { type LocalServiceRouteContext, type RouteHandler } from './primitives.js';
6
+ export interface LocalMcpRuntimeLease {
7
+ runtime: ReturnType<McpRuntimeFactory>;
8
+ transport: NodeStreamableHTTPServerTransport;
9
+ release(): Promise<void>;
10
+ }
11
+ export type AcquireLocalMcpRuntime = (input: {
12
+ req: IncomingMessage;
13
+ options: TaskforceMcpServerOptions;
14
+ }) => Promise<LocalMcpRuntimeLease>;
5
15
  interface LocalServiceRouteDependencies {
6
16
  addRoute: (method: string, path: string, handler: RouteHandler) => void;
7
17
  core: TaskforceCore;
8
18
  context: LocalServiceRouteContext | undefined;
9
- createMcpServer?: typeof createTaskforceMcpServer;
10
- createMcpTransport?: () => StreamableHTTPServerTransport;
19
+ createMcpServer?: McpRuntimeFactory;
20
+ createMcpTransport?: () => NodeStreamableHTTPServerTransport;
21
+ acquireMcpRuntime?: AcquireLocalMcpRuntime;
11
22
  }
12
23
  export declare function registerLocalServiceRoutes(deps: LocalServiceRouteDependencies): void;
13
24
  export {};