@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
@@ -0,0 +1,39 @@
1
+ import { type CodexAppServerClient } from './codexAppServerModelGateway.js';
2
+ import { ModelProviderConnectionService } from './modelProviderConnectionService.js';
3
+ import { ModelProviderConnectionStore } from '../storage/modelProviderConnectionStore.js';
4
+ export type CodexDeviceCodeLoginStatus = 'pending' | 'active' | 'failed' | 'cancelled' | 'expired';
5
+ export interface PublicCodexDeviceCodeLoginSession {
6
+ id: string;
7
+ connectionId: string;
8
+ status: CodexDeviceCodeLoginStatus;
9
+ userCode: string;
10
+ verificationUrl: string;
11
+ expiresAt: string;
12
+ failureCode?: string;
13
+ }
14
+ export interface CodexDeviceCodeLoginManagerOptions {
15
+ clientFactory?: (environment: NodeJS.ProcessEnv) => CodexAppServerClient;
16
+ ttlMs?: number;
17
+ now?: () => Date;
18
+ maxPendingPerOwner?: number;
19
+ maxPendingTotal?: number;
20
+ }
21
+ export declare class CodexDeviceCodeLoginManager {
22
+ private readonly connections;
23
+ private readonly store;
24
+ private readonly sessions;
25
+ private readonly sessionByConnection;
26
+ private readonly startingConnections;
27
+ private readonly clientFactory;
28
+ private readonly ttlMs;
29
+ private readonly now;
30
+ private readonly maxPendingPerOwner;
31
+ private readonly maxPendingTotal;
32
+ constructor(connections: ModelProviderConnectionService, store: ModelProviderConnectionStore, options?: CodexDeviceCodeLoginManagerOptions);
33
+ start(ownerUserId: string, connectionId: string): Promise<PublicCodexDeviceCodeLoginSession>;
34
+ get(ownerUserId: string, connectionId: string, sessionId: string): PublicCodexDeviceCodeLoginSession;
35
+ cancel(ownerUserId: string, connectionId: string, sessionId: string): Promise<PublicCodexDeviceCodeLoginSession>;
36
+ private requireOwned;
37
+ private pendingCount;
38
+ private scheduleRemoval;
39
+ }
@@ -0,0 +1,265 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import { CodexAppServerJsonRpcClient, } from './codexAppServerModelGateway.js';
3
+ import { classifyCodexModelProviderError } from './codexModelProviderConnectionLifecycle.js';
4
+ import { ModelProviderConnectionError, } from '../storage/modelProviderConnectionStore.js';
5
+ function opaqueSessionId() {
6
+ return `mpl_${randomBytes(24).toString('base64url')}`;
7
+ }
8
+ function publicSession(session) {
9
+ const { id, connectionId, status, userCode, verificationUrl, expiresAt, failureCode } = session;
10
+ return { id, connectionId, status, userCode, verificationUrl, expiresAt, ...(failureCode ? { failureCode } : {}) };
11
+ }
12
+ function safeVerificationUrl(value) {
13
+ try {
14
+ const url = new URL(value);
15
+ const serialized = url.toString();
16
+ if (url.protocol !== 'https:'
17
+ || url.username
18
+ || url.password
19
+ || url.search
20
+ || url.hash
21
+ || serialized.length > 2_048)
22
+ throw new Error('invalid device authorization URL');
23
+ return serialized;
24
+ }
25
+ catch {
26
+ throw new ModelProviderConnectionError('Codex returned an invalid device authorization URL.', 502, 'MODEL_CONNECTION_PROVIDER_FAILURE');
27
+ }
28
+ }
29
+ function safeUserCode(value) {
30
+ const userCode = String(value || '').trim();
31
+ if (!/^[A-Za-z0-9_-]{4,64}$/.test(userCode)) {
32
+ throw new ModelProviderConnectionError('Codex returned an invalid device authorization code.', 502, 'MODEL_CONNECTION_PROVIDER_FAILURE');
33
+ }
34
+ return userCode;
35
+ }
36
+ export class CodexDeviceCodeLoginManager {
37
+ connections;
38
+ store;
39
+ sessions = new Map();
40
+ sessionByConnection = new Map();
41
+ startingConnections = new Map();
42
+ clientFactory;
43
+ ttlMs;
44
+ now;
45
+ maxPendingPerOwner;
46
+ maxPendingTotal;
47
+ constructor(connections, store, options = {}) {
48
+ this.connections = connections;
49
+ this.store = store;
50
+ this.clientFactory = options.clientFactory || ((environment) => new CodexAppServerJsonRpcClient({
51
+ env: environment,
52
+ credentialPaths: [String(environment.CODEX_HOME || '')].filter(Boolean),
53
+ }));
54
+ this.ttlMs = Math.min(10 * 60_000, Math.max(30_000, options.ttlMs ?? 8 * 60_000));
55
+ this.now = options.now || (() => new Date());
56
+ this.maxPendingPerOwner = Math.min(8, Math.max(1, options.maxPendingPerOwner ?? 2));
57
+ this.maxPendingTotal = Math.min(64, Math.max(1, options.maxPendingTotal ?? 16));
58
+ }
59
+ async start(ownerUserId, connectionId) {
60
+ this.store.requireOwned(ownerUserId, connectionId);
61
+ const existingId = this.sessionByConnection.get(connectionId);
62
+ const existing = existingId ? this.sessions.get(existingId) : null;
63
+ if ((existing && !existing.settled) || this.startingConnections.has(connectionId)) {
64
+ throw new ModelProviderConnectionError('A device authorization is already pending for this connection.', 409, 'MODEL_CONNECTION_LOGIN_PENDING');
65
+ }
66
+ if (this.pendingCount(ownerUserId) >= this.maxPendingPerOwner) {
67
+ throw new ModelProviderConnectionError('Too many device authorizations are already pending for this account.', 429, 'MODEL_CONNECTION_LOGIN_LIMIT_REACHED');
68
+ }
69
+ if (this.pendingCount() >= this.maxPendingTotal) {
70
+ throw new ModelProviderConnectionError('Device authorization capacity is temporarily unavailable.', 503, 'MODEL_CONNECTION_LOGIN_CAPACITY_REACHED');
71
+ }
72
+ this.startingConnections.set(connectionId, ownerUserId);
73
+ let resolveStarted;
74
+ let rejectStarted;
75
+ let started = false;
76
+ const startedPromise = new Promise((resolve, reject) => {
77
+ resolveStarted = resolve;
78
+ rejectStarted = reject;
79
+ });
80
+ let session = null;
81
+ let lifecyclePromise;
82
+ lifecyclePromise = this.connections.withConnectionLease({
83
+ ownerUserId,
84
+ connectionId,
85
+ operation: 'login',
86
+ leaseDurationMs: this.ttlMs,
87
+ }, async (context) => {
88
+ if (context.connection.providerKey !== 'openai'
89
+ || context.connection.authenticationType !== 'chatgpt_device_code') {
90
+ throw new ModelProviderConnectionError('This model connection does not support ChatGPT device authorization.', 400, 'MODEL_CONNECTION_TYPE_UNAVAILABLE');
91
+ }
92
+ const client = this.clientFactory(context.environment);
93
+ const cancellation = new AbortController();
94
+ let leaseLost = false;
95
+ const abortForLeaseLoss = () => {
96
+ leaseLost = true;
97
+ cancellation.abort();
98
+ };
99
+ context.signal.addEventListener('abort', abortForLeaseLoss, { once: true });
100
+ try {
101
+ await client.initialize();
102
+ const provider = await client.startChatGptDeviceCodeLogin();
103
+ const expiresAt = new Date(this.now().getTime() + this.ttlMs).toISOString();
104
+ session = {
105
+ id: opaqueSessionId(),
106
+ ownerUserId,
107
+ connectionId,
108
+ providerLoginId: provider.loginId,
109
+ status: 'pending',
110
+ userCode: safeUserCode(provider.userCode),
111
+ verificationUrl: safeVerificationUrl(provider.verificationUrl),
112
+ expiresAt,
113
+ client,
114
+ cancellation,
115
+ cancelRequested: false,
116
+ completion: Promise.resolve(),
117
+ settled: false,
118
+ };
119
+ this.startingConnections.delete(connectionId);
120
+ session.completion = lifecyclePromise;
121
+ this.sessions.set(session.id, session);
122
+ this.sessionByConnection.set(connectionId, session.id);
123
+ started = true;
124
+ resolveStarted(publicSession(session));
125
+ const completion = await client.waitForAccountLoginCompleted({
126
+ loginId: provider.loginId,
127
+ timeoutMs: this.ttlMs,
128
+ signal: cancellation.signal,
129
+ });
130
+ if (!completion.success) {
131
+ throw classifyCodexModelProviderError(completion.error || 'ChatGPT device authorization did not complete.');
132
+ }
133
+ if (session.cancelRequested || cancellation.signal.aborted) {
134
+ throw new ModelProviderConnectionError('ChatGPT device authorization was cancelled.', 409, 'MODEL_CONNECTION_LOGIN_CANCELLED');
135
+ }
136
+ const account = await client.readAccount(false);
137
+ if (account?.type !== 'chatgpt') {
138
+ throw new ModelProviderConnectionError('The authorized Codex account is not a ChatGPT subscription account.', 409, 'MODEL_CONNECTION_ACCOUNT_UNAVAILABLE');
139
+ }
140
+ if (session.cancelRequested || cancellation.signal.aborted) {
141
+ throw new ModelProviderConnectionError('ChatGPT device authorization was cancelled.', 409, 'MODEL_CONNECTION_LOGIN_CANCELLED');
142
+ }
143
+ this.store.markVerified({
144
+ ownerUserId,
145
+ connectionId,
146
+ leaseToken: context.lease.token,
147
+ displayMetadata: {
148
+ accountEmail: account.email,
149
+ accountLabel: account.email,
150
+ planLabel: account.planType,
151
+ },
152
+ });
153
+ }
154
+ catch (error) {
155
+ const classifiedError = classifyCodexModelProviderError(error);
156
+ if (session) {
157
+ session.terminalStatus = session.cancelRequested
158
+ ? 'cancelled'
159
+ : leaseLost
160
+ ? 'failed'
161
+ : (this.now().toISOString() >= session.expiresAt ? 'expired' : 'failed');
162
+ session.terminalFailureCode = session.cancelRequested
163
+ ? 'MODEL_CONNECTION_LOGIN_CANCELLED'
164
+ : leaseLost
165
+ ? 'MODEL_CONNECTION_LEASE_LOST'
166
+ : session.terminalStatus === 'expired'
167
+ ? 'MODEL_CONNECTION_LOGIN_EXPIRED'
168
+ : classifiedError.code;
169
+ try {
170
+ this.store.markReconnectRequired({
171
+ ownerUserId,
172
+ connectionId,
173
+ leaseToken: context.lease.token,
174
+ failureCode: session.terminalFailureCode.toLowerCase(),
175
+ });
176
+ }
177
+ catch {
178
+ // Lease loss remains authoritative.
179
+ }
180
+ }
181
+ throw classifiedError;
182
+ }
183
+ finally {
184
+ context.signal.removeEventListener('abort', abortForLeaseLoss);
185
+ await client.close();
186
+ if (session)
187
+ this.scheduleRemoval(session);
188
+ }
189
+ }).then(() => {
190
+ if (session?.status === 'pending')
191
+ session.status = 'active';
192
+ if (session)
193
+ session.settled = true;
194
+ }, (error) => {
195
+ const classifiedError = classifyCodexModelProviderError(error);
196
+ this.startingConnections.delete(connectionId);
197
+ if (!started) {
198
+ rejectStarted(classifiedError);
199
+ return;
200
+ }
201
+ if (session?.status === 'pending') {
202
+ session.status = session.terminalStatus || 'failed';
203
+ session.failureCode = session.terminalFailureCode || classifiedError.code;
204
+ }
205
+ if (session)
206
+ session.settled = true;
207
+ });
208
+ return startedPromise;
209
+ }
210
+ get(ownerUserId, connectionId, sessionId) {
211
+ return publicSession(this.requireOwned(ownerUserId, connectionId, sessionId));
212
+ }
213
+ async cancel(ownerUserId, connectionId, sessionId) {
214
+ const session = this.requireOwned(ownerUserId, connectionId, sessionId);
215
+ if (session.status !== 'pending') {
216
+ await session.completion;
217
+ return publicSession(session);
218
+ }
219
+ if (session.cancelRequested) {
220
+ await session.completion;
221
+ return publicSession(session);
222
+ }
223
+ session.cancelRequested = true;
224
+ session.terminalStatus = 'cancelled';
225
+ session.terminalFailureCode = 'MODEL_CONNECTION_LOGIN_CANCELLED';
226
+ session.cancellation.abort();
227
+ try {
228
+ await session.client.cancelAccountLogin(session.providerLoginId);
229
+ }
230
+ catch {
231
+ // Closing the process-local client remains sufficient to end this ceremony.
232
+ }
233
+ await session.completion;
234
+ return publicSession(session);
235
+ }
236
+ requireOwned(ownerUserId, connectionId, sessionId) {
237
+ const session = this.sessions.get(String(sessionId || '').trim());
238
+ if (!session || session.ownerUserId !== ownerUserId || session.connectionId !== connectionId) {
239
+ throw new ModelProviderConnectionError('Device authorization session was not found or no longer exists. Start a new authorization.', 404, 'MODEL_CONNECTION_LOGIN_SESSION_NOT_FOUND');
240
+ }
241
+ return session;
242
+ }
243
+ pendingCount(ownerUserId) {
244
+ let count = 0;
245
+ for (const session of this.sessions.values()) {
246
+ if (!session.settled && (!ownerUserId || session.ownerUserId === ownerUserId))
247
+ count += 1;
248
+ }
249
+ for (const startingOwnerUserId of this.startingConnections.values()) {
250
+ if (!ownerUserId || startingOwnerUserId === ownerUserId)
251
+ count += 1;
252
+ }
253
+ return count;
254
+ }
255
+ scheduleRemoval(session) {
256
+ const timeout = setTimeout(() => {
257
+ if (this.sessions.get(session.id) === session)
258
+ this.sessions.delete(session.id);
259
+ if (this.sessionByConnection.get(session.connectionId) === session.id) {
260
+ this.sessionByConnection.delete(session.connectionId);
261
+ }
262
+ }, 5 * 60_000);
263
+ timeout.unref?.();
264
+ }
265
+ }
@@ -0,0 +1,8 @@
1
+ import { type CodexAppServerClient } from './codexAppServerModelGateway.js';
2
+ import type { ModelProviderConnectionLifecycleHandlers } from './modelProviderConnectionService.js';
3
+ import { ModelProviderConnectionError } from '../storage/modelProviderConnectionStore.js';
4
+ export interface CodexModelProviderConnectionLifecycleOptions {
5
+ clientFactory?: (environment: NodeJS.ProcessEnv) => CodexAppServerClient;
6
+ }
7
+ export declare function classifyCodexModelProviderError(error: unknown): ModelProviderConnectionError;
8
+ export declare function createCodexModelProviderConnectionLifecycleHandlers(options?: CodexModelProviderConnectionLifecycleOptions): ModelProviderConnectionLifecycleHandlers;
@@ -0,0 +1,73 @@
1
+ import { CodexAppServerCompatibilityError, CodexAppServerJsonRpcClient, } from './codexAppServerModelGateway.js';
2
+ import { ModelProviderConnectionError } from '../storage/modelProviderConnectionStore.js';
3
+ export function classifyCodexModelProviderError(error) {
4
+ if (error instanceof ModelProviderConnectionError)
5
+ return error;
6
+ if (error instanceof CodexAppServerCompatibilityError) {
7
+ return error.reason === 'version'
8
+ ? new ModelProviderConnectionError('The installed Codex app-server version is not supported.', 503, 'MODEL_CONNECTION_CODEX_VERSION_UNSUPPORTED')
9
+ : new ModelProviderConnectionError('Codex did not use the isolated credential home for this connection.', 502, 'MODEL_CONNECTION_CREDENTIAL_HOME_MISMATCH');
10
+ }
11
+ const message = String(error?.message || error || '').toLowerCase();
12
+ if (/\b429\b|rate.?limit|too many requests/.test(message)) {
13
+ return new ModelProviderConnectionError('The ChatGPT connection is temporarily rate limited.', 429, 'MODEL_CONNECTION_RATE_LIMITED');
14
+ }
15
+ if (/device.?code/.test(message) && /(disabled|not enabled|unavailable|unsupported)/.test(message)) {
16
+ return new ModelProviderConnectionError('ChatGPT device authorization is unavailable for this account.', 409, 'MODEL_CONNECTION_DEVICE_CODE_UNAVAILABLE');
17
+ }
18
+ if (/(unsupported|incompatible).*(codex|version)|(codex|version).*(unsupported|incompatible)/.test(message)) {
19
+ return new ModelProviderConnectionError('The installed Codex app-server version is not supported.', 503, 'MODEL_CONNECTION_CODEX_VERSION_UNSUPPORTED');
20
+ }
21
+ return new ModelProviderConnectionError('The model provider connection operation failed.', 502, 'MODEL_CONNECTION_PROVIDER_FAILURE');
22
+ }
23
+ function accountMetadata(account) {
24
+ return {
25
+ ...(account.email ? { accountEmail: account.email, accountLabel: account.email } : {}),
26
+ ...(account.planType ? { planLabel: account.planType } : {}),
27
+ };
28
+ }
29
+ async function withCodexClient(context, clientFactory, callback) {
30
+ let client = null;
31
+ let closeForLeaseLoss = null;
32
+ try {
33
+ client = clientFactory(context.environment);
34
+ const activeClient = client;
35
+ closeForLeaseLoss = () => { void activeClient.close(); };
36
+ context.signal.addEventListener('abort', closeForLeaseLoss, { once: true });
37
+ await client.initialize();
38
+ return await callback(client);
39
+ }
40
+ catch (error) {
41
+ throw classifyCodexModelProviderError(error);
42
+ }
43
+ finally {
44
+ if (closeForLeaseLoss)
45
+ context.signal.removeEventListener('abort', closeForLeaseLoss);
46
+ if (client)
47
+ await client.close();
48
+ }
49
+ }
50
+ async function requireChatGptAccount(client, refreshToken) {
51
+ const account = await client.readAccount(refreshToken);
52
+ if (account?.type !== 'chatgpt') {
53
+ throw new ModelProviderConnectionError('The Codex credential home is not authorized with a ChatGPT subscription account.', 409, 'MODEL_CONNECTION_ACCOUNT_UNAVAILABLE');
54
+ }
55
+ return account;
56
+ }
57
+ export function createCodexModelProviderConnectionLifecycleHandlers(options = {}) {
58
+ const clientFactory = options.clientFactory || ((environment) => new CodexAppServerJsonRpcClient({
59
+ env: environment,
60
+ credentialPaths: [String(environment.CODEX_HOME || '')].filter(Boolean),
61
+ }));
62
+ return {
63
+ verify: async (context) => withCodexClient(context, clientFactory, async (client) => ({
64
+ displayMetadata: accountMetadata(await requireChatGptAccount(client, false)),
65
+ })),
66
+ refresh: async (context) => withCodexClient(context, clientFactory, async (client) => ({
67
+ displayMetadata: accountMetadata(await requireChatGptAccount(client, true)),
68
+ })),
69
+ disconnect: async (context) => withCodexClient(context, clientFactory, async (client) => {
70
+ await client.logoutAccount();
71
+ }),
72
+ };
73
+ }
@@ -0,0 +1,14 @@
1
+ import type { TaskforceCore } from '../core/Taskforce.js';
2
+ import type { ExecutorPhaseAApprovalTrustPolicy } from '../shared/executorPhaseAApprovalReceipt.js';
3
+ import { ExecutorPhaseAApprovalReceiptStore } from '../storage/executorPhaseAApprovalReceiptStore.js';
4
+ import { ExecutorPhaseAApprovalService, type ExecutorPhaseAApprovalSigningConfig } from './executorPhaseAApprovalService.js';
5
+ export declare function createExecutorPhaseAApprovalRuntime(core: TaskforceCore, options?: {
6
+ policy?: ExecutorPhaseAApprovalTrustPolicy;
7
+ signing?: ExecutorPhaseAApprovalSigningConfig | null;
8
+ now?: () => Date;
9
+ randomId?: () => string;
10
+ }): {
11
+ policy: ExecutorPhaseAApprovalTrustPolicy;
12
+ store: ExecutorPhaseAApprovalReceiptStore;
13
+ service: ExecutorPhaseAApprovalService | null;
14
+ };
@@ -0,0 +1,24 @@
1
+ import trustPolicyJson from '../shared/executorPhaseAApprovalTrustPolicy.json' with { type: 'json' };
2
+ import { ExecutorPhaseAApprovalReceiptStore } from '../storage/executorPhaseAApprovalReceiptStore.js';
3
+ import { ExecutorPhaseARunAuthorizationStore } from '../storage/executorPhaseARunAuthorizationStore.js';
4
+ import { ExecutorPhaseAApprovalService, resolveExecutorPhaseAApprovalSigningConfig, } from './executorPhaseAApprovalService.js';
5
+ export function createExecutorPhaseAApprovalRuntime(core, options = {}) {
6
+ const policy = options.policy || trustPolicyJson;
7
+ const signing = options.signing === undefined
8
+ ? resolveExecutorPhaseAApprovalSigningConfig(process.env, policy)
9
+ : options.signing;
10
+ const store = new ExecutorPhaseAApprovalReceiptStore(core.getDatabaseAdapter(), core.getTenantId());
11
+ const runAuthorizationStore = new ExecutorPhaseARunAuthorizationStore(core.getDatabaseAdapter(), core.getTenantId());
12
+ return {
13
+ policy,
14
+ store,
15
+ service: signing ? new ExecutorPhaseAApprovalService({
16
+ store,
17
+ runAuthorizationStore,
18
+ signing,
19
+ policy,
20
+ now: options.now,
21
+ randomId: options.randomId,
22
+ }) : null,
23
+ };
24
+ }
@@ -0,0 +1,40 @@
1
+ import { type KeyObject } from 'crypto';
2
+ import { type ExecutorPhaseAApprovalTrustPolicy, type ExecutorPhaseAPreflight } from '../shared/executorPhaseAApprovalReceipt.js';
3
+ import type { ExecutorPhaseAApprovalReceiptStore } from '../storage/executorPhaseAApprovalReceiptStore.js';
4
+ import type { ExecutorPhaseARunAuthorizationStore } from '../storage/executorPhaseARunAuthorizationStore.js';
5
+ export declare class ExecutorPhaseAApprovalError extends Error {
6
+ readonly statusCode: number;
7
+ readonly code: string;
8
+ constructor(message: string, statusCode?: number, code?: string);
9
+ }
10
+ export interface ExecutorPhaseAApprovalSigningConfig {
11
+ keyId: string;
12
+ privateKey: KeyObject;
13
+ }
14
+ export declare function assertExecutorPhaseAApprovalTrustPolicy(policy: ExecutorPhaseAApprovalTrustPolicy): void;
15
+ export declare function resolveExecutorPhaseAApprovalTrustKey(policy: ExecutorPhaseAApprovalTrustPolicy, keyId: string, signedAt: string, usage: 'sign' | 'verify'): import("../shared/executorPhaseAApprovalReceipt.js").ExecutorPhaseAApprovalTrustKey | null;
16
+ export declare function parseCanonicalExecutorPhaseAPreflight(bytes: Buffer, policy: ExecutorPhaseAApprovalTrustPolicy, now?: Date): ExecutorPhaseAPreflight;
17
+ export declare function resolveExecutorPhaseAApprovalSigningConfig(env?: NodeJS.ProcessEnv, policy?: ExecutorPhaseAApprovalTrustPolicy): ExecutorPhaseAApprovalSigningConfig | null;
18
+ export declare class ExecutorPhaseAApprovalService {
19
+ private readonly options;
20
+ constructor(options: {
21
+ store: ExecutorPhaseAApprovalReceiptStore;
22
+ runAuthorizationStore?: ExecutorPhaseARunAuthorizationStore;
23
+ signing: ExecutorPhaseAApprovalSigningConfig;
24
+ policy?: ExecutorPhaseAApprovalTrustPolicy;
25
+ now?: () => Date;
26
+ randomId?: () => string;
27
+ });
28
+ issue(canonicalPreflightBytes: Buffer, actorUserId: string): {
29
+ bytes: Buffer;
30
+ receiptId: string;
31
+ digest: string;
32
+ created: boolean;
33
+ };
34
+ issueCleanup(originalCapabilityId: string, residualInventorySha256: string, actorUserId: string): {
35
+ bytes: Buffer;
36
+ receiptId: string;
37
+ digest: string;
38
+ created: boolean;
39
+ };
40
+ }