@taskforcehq/taskforce 0.3.329 → 0.3.332

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (363) hide show
  1. package/README.md +7 -2
  2. package/dist/Taskforce.module.css +290 -45
  3. package/dist/components/features/AiProfilesModule.js +3 -5
  4. package/dist/components/features/TaskSettings.js +70 -14
  5. package/dist/components/features/TaskforceAgentsModule.d.ts +1 -2
  6. package/dist/components/features/TaskforceAgentsModule.js +586 -116
  7. package/dist/components/features/agentCapabilities/AgentCapabilitiesPrototype.d.ts +2 -2
  8. package/dist/components/features/agentCapabilities/AgentCapabilitiesPrototype.js +2 -2
  9. package/dist/components/features/agentConnections/AgentConnectionControl.d.ts +15 -0
  10. package/dist/components/features/agentConnections/AgentConnectionControl.js +125 -0
  11. package/dist/components/features/agentConnections/ModelConnectionsPanel.d.ts +18 -0
  12. package/dist/components/features/agentConnections/ModelConnectionsPanel.js +393 -0
  13. package/dist/components/features/agentConnections/modelConnectionsApi.d.ts +65 -0
  14. package/dist/components/features/agentConnections/modelConnectionsApi.js +129 -0
  15. package/dist/components/features/planning/PlanningModule.js +15 -3
  16. package/dist/components/features/planning/planningMetadata.d.ts +10 -0
  17. package/dist/components/features/planning/planningMetadata.js +8 -0
  18. package/dist/components/features/taskforceAgentAssignments/AgentBehaviorAssignments.js +15 -24
  19. package/dist/components/features/taskforceAgentEditorModel.d.ts +2 -1
  20. package/dist/components/features/taskforceAgentEditorModel.js +3 -1
  21. package/dist/components/features/workflowManager/workflowManagerApi.d.ts +1 -1
  22. package/dist/components/features/workflowManager/workflowManagerApi.js +3 -0
  23. package/dist/components/task/TaskWorkflowAssignmentField.js +68 -10
  24. package/dist/components/views/StandaloneLayout.js +62 -27
  25. package/dist/components/views/panels/PlanningDrawer.d.ts +2 -1
  26. package/dist/components/views/panels/PlanningDrawer.js +12 -8
  27. package/dist/components/views/standalone/modals/SyncStatusModal.d.ts +4 -3
  28. package/dist/components/views/standalone/modals/SyncStatusModal.js +33 -38
  29. package/dist/config/envSchema.js +55 -1
  30. package/dist/core/McpTokenService.d.ts +25 -1
  31. package/dist/core/McpTokenService.js +106 -15
  32. package/dist/core/TaskChecklistCommandService.d.ts +27 -0
  33. package/dist/core/TaskChecklistCommandService.js +83 -5
  34. package/dist/core/TaskLifecycleCommandService.d.ts +3 -1
  35. package/dist/core/TaskLifecycleCommandService.js +6 -2
  36. package/dist/core/Taskforce.d.ts +43 -3
  37. package/dist/core/Taskforce.js +158 -7
  38. package/dist/core/types.d.ts +9 -0
  39. package/dist/documentReviews/DocumentReviewCommentStore.d.ts +2 -0
  40. package/dist/documentReviews/DocumentReviewCommentStore.js +28 -9
  41. package/dist/documentReviews/commandService.d.ts +2 -1
  42. package/dist/documentReviews/commandService.js +6 -3
  43. package/dist/hooks/sync/orchestratorShared.d.ts +1 -0
  44. package/dist/hooks/sync/orchestratorShared.js +2 -0
  45. package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.d.ts +3 -0
  46. package/dist/hooks/sync/useLocalSyncCoordinatorSnapshot.js +85 -9
  47. package/dist/hooks/sync/useSyncStatusControls.d.ts +4 -1
  48. package/dist/hooks/sync/useSyncStatusControls.js +47 -11
  49. package/dist/hooks/useSyncOrchestrator.d.ts +3 -0
  50. package/dist/hooks/useSyncOrchestrator.js +111 -2
  51. package/dist/hooks/useTaskData.d.ts +31 -1
  52. package/dist/hooks/useTaskData.js +29 -7
  53. package/dist/hooks/useTaskMutations.d.ts +3 -1
  54. package/dist/hooks/useTaskMutations.js +46 -12
  55. package/dist/hooks/useTaskforce.d.ts +2 -0
  56. package/dist/hooks/useTaskforce.js +11 -2
  57. package/dist/mcp/clientRegistry.d.ts +2 -2
  58. package/dist/mcp/clientRegistry.js +1 -1
  59. package/dist/mcp/documentAssetRegistrar.js +9 -6
  60. package/dist/mcp/durableTaskMutationRouter.d.ts +4 -1
  61. package/dist/mcp/durableTaskMutationRouter.js +10 -0
  62. package/dist/mcp/durableTaskRelationshipMutationRouter.js +4 -0
  63. package/dist/mcp/httpProtocolRouting.d.ts +11 -0
  64. package/dist/mcp/httpProtocolRouting.js +22 -0
  65. package/dist/mcp/localCliHealth.d.ts +2 -2
  66. package/dist/mcp/localCliHealth.js +2 -2
  67. package/dist/mcp/localServiceProxy.d.ts +1 -0
  68. package/dist/mcp/localServiceProxy.js +530 -68
  69. package/dist/mcp/planningAttachmentCommandAdapter.d.ts +3 -1
  70. package/dist/mcp/planningAttachmentCommandAdapter.js +20 -2
  71. package/dist/mcp/runtime.d.ts +54 -79
  72. package/dist/mcp/runtime.js +408 -102
  73. package/dist/mcp/taskPlanningRegistrar.js +25 -6
  74. package/dist/mcp/toolProfiles.d.ts +2 -0
  75. package/dist/mcp/toolProfiles.js +11 -0
  76. package/dist/mcp/toolRegistry.d.ts +1 -0
  77. package/dist/mcp/toolRegistry.js +9 -8
  78. package/dist/mcp/workflowExecutionRegistrar.js +4 -4
  79. package/dist/migrations/taskSchemaMigrations.d.ts +5 -0
  80. package/dist/migrations/taskSchemaMigrations.js +415 -0
  81. package/dist/runtime/appGates.d.ts +2 -1
  82. package/dist/runtime/appGates.js +7 -0
  83. package/dist/server/buildInfo.d.ts +1 -0
  84. package/dist/server/buildInfo.js +5 -1
  85. package/dist/server/cloudMcpCapacityTelemetry.d.ts +68 -0
  86. package/dist/server/cloudMcpCapacityTelemetry.js +221 -0
  87. package/dist/server/index.d.ts +3 -0
  88. package/dist/server/index.js +108 -11
  89. package/dist/server/localDatabaseIdentity.js +4 -1
  90. package/dist/server/localServiceLease.js +2 -1
  91. package/dist/server/localServiceSessions.d.ts +14 -17
  92. package/dist/server/localServiceSessions.js +308 -94
  93. package/dist/server/localWorkspaceSyncServerRuntime.js +25 -19
  94. package/dist/server/routes/admin.d.ts +4 -0
  95. package/dist/server/routes/admin.js +126 -5
  96. package/dist/server/routes/agents.d.ts +7 -0
  97. package/dist/server/routes/agents.js +277 -24
  98. package/dist/server/routes/billing.js +5 -1
  99. package/dist/server/routes/durableTaskHttpRouters.d.ts +2 -0
  100. package/dist/server/routes/executorPhaseAApprovals.d.ts +19 -0
  101. package/dist/server/routes/executorPhaseAApprovals.js +140 -0
  102. package/dist/server/routes/executorPhaseAIssuerRedemptions.d.ts +11 -0
  103. package/dist/server/routes/executorPhaseAIssuerRedemptions.js +24 -0
  104. package/dist/server/routes/githubReviewEvidence.d.ts +19 -0
  105. package/dist/server/routes/githubReviewEvidence.js +116 -0
  106. package/dist/server/routes/localService.d.ts +15 -4
  107. package/dist/server/routes/localService.js +136 -40
  108. package/dist/server/routes/modelConnections.d.ts +24 -0
  109. package/dist/server/routes/modelConnections.js +205 -0
  110. package/dist/server/routes/shared.d.ts +22 -0
  111. package/dist/server/routes/shared.js +298 -182
  112. package/dist/server/routes/sync.js +1 -0
  113. package/dist/server/routes/syncAuxRoutes.js +5 -1
  114. package/dist/server/routes/syncPushRoutes.d.ts +1 -0
  115. package/dist/server/routes/syncPushRoutes.js +1 -0
  116. package/dist/server/routes/syncV3FeedRoutes.js +10 -1
  117. package/dist/server/routes/syncV3OperationRoutes.js +35 -9
  118. package/dist/server/routes/tasks.js +21 -2
  119. package/dist/server/routes/workflows.js +9 -1
  120. package/dist/server/routes.js +59 -0
  121. package/dist/service/localServiceCli.d.ts +2 -2
  122. package/dist/service/localServiceCli.js +4 -3
  123. package/dist/services/codexAppServerModelGateway.d.ts +54 -5
  124. package/dist/services/codexAppServerModelGateway.js +246 -21
  125. package/dist/services/codexDeviceCodeLoginManager.d.ts +39 -0
  126. package/dist/services/codexDeviceCodeLoginManager.js +265 -0
  127. package/dist/services/codexModelProviderConnectionLifecycle.d.ts +8 -0
  128. package/dist/services/codexModelProviderConnectionLifecycle.js +73 -0
  129. package/dist/services/executorPhaseAApprovalRuntime.d.ts +14 -0
  130. package/dist/services/executorPhaseAApprovalRuntime.js +24 -0
  131. package/dist/services/executorPhaseAApprovalService.d.ts +40 -0
  132. package/dist/services/executorPhaseAApprovalService.js +609 -0
  133. package/dist/services/executorPhaseADriftEvaluator.d.ts +78 -0
  134. package/dist/services/executorPhaseADriftEvaluator.js +93 -0
  135. package/dist/services/executorPhaseAIssuerCore.d.ts +139 -0
  136. package/dist/services/executorPhaseAIssuerCore.js +402 -0
  137. package/dist/services/executorPhaseAIssuerRedemptionService.d.ts +34 -0
  138. package/dist/services/executorPhaseAIssuerRedemptionService.js +158 -0
  139. package/dist/services/githubReviewEvidenceRuntime.d.ts +14 -0
  140. package/dist/services/githubReviewEvidenceRuntime.js +30 -0
  141. package/dist/services/githubReviewEvidenceService.d.ts +93 -0
  142. package/dist/services/githubReviewEvidenceService.js +336 -0
  143. package/dist/services/modelGateway.d.ts +7 -0
  144. package/dist/services/modelProviderConnectionService.d.ts +71 -0
  145. package/dist/services/modelProviderConnectionService.js +279 -0
  146. package/dist/services/modelProviderCredentialHome.d.ts +32 -0
  147. package/dist/services/modelProviderCredentialHome.js +271 -0
  148. package/dist/services/ownerScopedModelConnectionGateway.d.ts +12 -0
  149. package/dist/services/ownerScopedModelConnectionGateway.js +30 -0
  150. package/dist/services/taskforceAgentConnectionBindingService.d.ts +66 -0
  151. package/dist/services/taskforceAgentConnectionBindingService.js +185 -0
  152. package/dist/services/taskforceAgentMcpBridge.d.ts +2 -2
  153. package/dist/services/taskforceAgentMcpBridge.js +42 -29
  154. package/dist/shared/adminEdgeProxy.d.ts +5 -0
  155. package/dist/shared/adminEdgeProxy.js +94 -0
  156. package/dist/shared/adminProxySessionCookies.d.ts +16 -0
  157. package/dist/shared/adminProxySessionCookies.js +86 -0
  158. package/dist/shared/aiProfileColors.d.ts +31 -1
  159. package/dist/shared/aiProfileColors.js +14 -6
  160. package/dist/shared/executorPhaseAApprovalGoldenVector.json +269 -0
  161. package/dist/shared/executorPhaseAApprovalReceipt.d.ts +112 -0
  162. package/dist/shared/executorPhaseAApprovalReceipt.js +58 -0
  163. package/dist/shared/executorPhaseAApprovalTrustPolicy.json +10 -0
  164. package/dist/shared/executorPhaseADriftContracts.d.ts +37 -0
  165. package/dist/shared/executorPhaseADriftContracts.js +63 -0
  166. package/dist/shared/executorPhaseAIssuerContracts.d.ts +75 -0
  167. package/dist/shared/executorPhaseAIssuerContracts.js +90 -0
  168. package/dist/shared/executorPhaseARunAuthorization.d.ts +120 -0
  169. package/dist/shared/executorPhaseARunAuthorization.js +232 -0
  170. package/dist/shared/executorPhaseASchemaValidation.d.ts +7 -0
  171. package/dist/shared/executorPhaseASchemaValidation.js +53 -0
  172. package/dist/shared/executorPhaseASchemas/approval-receipt.schema.json +106 -0
  173. package/dist/shared/executorPhaseASchemas/drift-attestation.schema.json +54 -0
  174. package/dist/shared/executorPhaseASchemas/drift-request.schema.json +47 -0
  175. package/dist/shared/executorPhaseASchemas/foundation-manifest.schema.json +29 -0
  176. package/dist/shared/executorPhaseASchemas/issuer-audit-record.schema.json +24 -0
  177. package/dist/shared/executorPhaseASchemas/issuer-proof.schema.json +43 -0
  178. package/dist/shared/executorPhaseASchemas/issuer-redemption-request.schema.json +18 -0
  179. package/dist/shared/executorPhaseASchemas/issuer-redemption-response.schema.json +39 -0
  180. package/dist/shared/executorPhaseASchemas/logical-envelope.schema.json +149 -0
  181. package/dist/shared/executorPhaseASchemas/preflight-report.schema.json +216 -0
  182. package/dist/shared/executorPhaseASchemas/run-capability.schema.json +111 -0
  183. package/dist/shared/executorPhaseASchemas/sender-proof.schema.json +37 -0
  184. package/dist/shared/executorPhaseASchemas/workload-grant.schema.json +68 -0
  185. package/dist/shared/executorPhaseASchemas/workload-jwt-claims.schema.json +67 -0
  186. package/dist/shared/executorPhaseATiming.d.ts +1 -0
  187. package/dist/shared/executorPhaseATiming.js +1 -0
  188. package/dist/shared/planningIdentity.js +1 -1
  189. package/dist/shared/productLogoKeys.d.ts +2 -0
  190. package/dist/shared/productLogoKeys.js +18 -0
  191. package/dist/shared/taskforceAgentDefinition.d.ts +0 -1
  192. package/dist/shared/taskforceAgentDefinition.js +6 -9
  193. package/dist/shared/taskforceAgentModels.js +7 -3
  194. package/dist/shared/userFeatureGrants.d.ts +4 -0
  195. package/dist/shared/userFeatureGrants.js +7 -0
  196. package/dist/storage/executorPhaseAApprovalReceiptStore.d.ts +37 -0
  197. package/dist/storage/executorPhaseAApprovalReceiptStore.js +81 -0
  198. package/dist/storage/executorPhaseARunAuthorizationStore.d.ts +103 -0
  199. package/dist/storage/executorPhaseARunAuthorizationStore.js +492 -0
  200. package/dist/storage/githubReviewEvidenceInstallationStore.d.ts +26 -0
  201. package/dist/storage/githubReviewEvidenceInstallationStore.js +89 -0
  202. package/dist/storage/modelProviderConnectionStore.d.ts +99 -0
  203. package/dist/storage/modelProviderConnectionStore.js +446 -0
  204. package/dist/storage/postgresAdapter.d.ts +4 -0
  205. package/dist/storage/postgresAdapter.js +14 -1
  206. package/dist/storage/postgresRequestDiagnostics.d.ts +9 -1
  207. package/dist/storage/postgresRequestDiagnostics.js +15 -2
  208. package/dist/storage/postgresWorker.js +20 -2
  209. package/dist/storage/postgresWorkerProtocol.d.ts +7 -0
  210. package/dist/storage/taskforceAgentConnectionBindingStore.d.ts +31 -0
  211. package/dist/storage/taskforceAgentConnectionBindingStore.js +84 -0
  212. package/dist/storage/workflowStore.d.ts +2 -0
  213. package/dist/storage/workflowStore.js +39 -2
  214. package/dist/sync/cloudSyncApi.js +4 -2
  215. package/dist/sync/collaborationSyncState.js +5 -0
  216. package/dist/sync/coordinator/localSyncExecutionPermitStore.js +60 -29
  217. package/dist/sync/coordinator/localWorkspaceSyncPendingV2PushProgress.d.ts +10 -0
  218. package/dist/sync/coordinator/localWorkspaceSyncPendingV2PushProgress.js +29 -0
  219. package/dist/sync/coordinator/localWorkspaceSyncRunner.d.ts +3 -1
  220. package/dist/sync/coordinator/localWorkspaceSyncRunner.js +18 -0
  221. package/dist/sync/coordinator/localWorkspaceSyncRunnerState.d.ts +15 -1
  222. package/dist/sync/coordinator/localWorkspaceSyncRunnerState.js +99 -2
  223. package/dist/sync/coordinator/workspaceSyncCredentialBroker.d.ts +1 -0
  224. package/dist/sync/coordinator/workspaceSyncCredentialBroker.js +33 -4
  225. package/dist/sync/engine/workspaceSyncContentLifecycleAdapter.d.ts +2 -1
  226. package/dist/sync/engine/workspaceSyncContentVersionStore.d.ts +38 -0
  227. package/dist/sync/engine/workspaceSyncContentVersionStore.js +50 -1
  228. package/dist/sync/engine/workspaceSyncEngineLifecyclePolicy.js +6 -6
  229. package/dist/sync/engine/workspaceSyncEnginePushCompletion.d.ts +14 -0
  230. package/dist/sync/engine/workspaceSyncEnginePushCompletion.js +84 -0
  231. package/dist/sync/engine/workspaceSyncEngineRecovery.js +1 -0
  232. package/dist/sync/engine/workspaceSyncEngineRuntime.d.ts +1 -0
  233. package/dist/sync/engine/workspaceSyncEngineRuntime.js +1 -0
  234. package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.js +112 -38
  235. package/dist/sync/engine/workspaceSyncEngineServerSnapshotReader.js +6 -0
  236. package/dist/sync/engine/workspaceSyncEngineTransfers.js +3 -1
  237. package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.d.ts +1 -0
  238. package/dist/sync/engine/workspaceSyncV2ChangeDispatcher.js +31 -0
  239. package/dist/sync/syncApplyHandlers.d.ts +3 -0
  240. package/dist/sync/syncApplyHandlers.js +81 -15
  241. package/dist/sync/syncService.d.ts +15 -0
  242. package/dist/sync/syncService.js +83 -18
  243. package/dist/sync/taskforceAgentSyncAuthorization.d.ts +16 -0
  244. package/dist/sync/taskforceAgentSyncAuthorization.js +20 -0
  245. package/dist/sync/v3/combinedFeedCapability.js +4 -0
  246. package/dist/sync/v3/durableInitiativeMutationRouter.js +18 -10
  247. package/dist/sync/v3/durableOperationReplay.d.ts +14 -0
  248. package/dist/sync/v3/durableOperationReplay.js +18 -0
  249. package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.js +3 -0
  250. package/dist/sync/v3/durableTaskChecklistMutationRouter.d.ts +2 -1
  251. package/dist/sync/v3/durableTaskChecklistMutationRouter.js +58 -15
  252. package/dist/sync/v3/durableTaskCommentMutationRouter.js +3 -0
  253. package/dist/sync/v3/durableTaskHttpRootMutationRouter.d.ts +1 -1
  254. package/dist/sync/v3/durableTaskHttpRootMutationRouter.js +10 -0
  255. package/dist/sync/v3/durableTaxonomyMutationRouter.js +5 -0
  256. package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.d.ts +18 -7
  257. package/dist/sync/v3/durableWorkflowRuntimeMutationRouter.js +89 -23
  258. package/dist/sync/v3/durableWorkstreamMutationRouter.js +18 -10
  259. package/dist/sync/v3/durableWorkstreamTaskOrderMutationRouter.js +16 -5
  260. package/dist/sync/v3/localOutboxDispatchRuntime.js +2 -2
  261. package/dist/sync/v3/localOutboxRecoveryPreparationService.js +8 -2
  262. package/dist/sync/v3/localTaskChecklistOutboxHandler.js +16 -2
  263. package/dist/sync/v3/localTaskChecklistOutboxService.d.ts +4 -0
  264. package/dist/sync/v3/localTaskChecklistOutboxService.js +14 -1
  265. package/dist/sync/v3/localTaskCreateOutboxService.d.ts +3 -1
  266. package/dist/sync/v3/localTaskCreateOutboxService.js +6 -1
  267. package/dist/sync/v3/localTaskDeleteOutboxService.js +1 -0
  268. package/dist/sync/v3/localTaskLifecycleOutboxService.d.ts +2 -1
  269. package/dist/sync/v3/localTaskLifecycleOutboxService.js +5 -1
  270. package/dist/sync/v3/localTaskMetadataOutboxService.d.ts +2 -1
  271. package/dist/sync/v3/localTaskMetadataOutboxService.js +6 -2
  272. package/dist/sync/v3/localTaskStatusOutboxService.d.ts +10 -1
  273. package/dist/sync/v3/localTaskStatusOutboxService.js +238 -16
  274. package/dist/sync/v3/syncDurabilityStore.d.ts +36 -1
  275. package/dist/sync/v3/syncDurabilityStore.js +202 -8
  276. package/dist/sync/v3/taskChecklistMutationService.d.ts +11 -0
  277. package/dist/sync/v3/taskChecklistMutationService.js +44 -1
  278. package/dist/sync/v3/taskStatusMutationService.d.ts +29 -1
  279. package/dist/sync/v3/taskStatusMutationService.js +119 -3
  280. package/dist/sync/v3/workflowAssignmentSync.d.ts +5 -0
  281. package/dist/sync/v3/workflowAssignmentSync.js +27 -0
  282. package/dist/sync/v3/workflowRuntimeMutationService.d.ts +5 -0
  283. package/dist/sync/v3/workflowRuntimeMutationService.js +124 -71
  284. package/dist/sync/v3/workspaceSyncJournalReader.js +1 -1
  285. package/dist/sync/v3/workspaceSyncOperationRetentionService.d.ts +16 -0
  286. package/dist/sync/v3/workspaceSyncOperationRetentionService.js +83 -0
  287. package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.d.ts +1 -0
  288. package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.js +9 -2
  289. package/dist/sync/v3/workspaceSyncV3CombinedLocalApply.js +25 -3
  290. package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.d.ts +7 -0
  291. package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.js +44 -32
  292. package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.d.ts +9 -5
  293. package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.js +54 -38
  294. package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.d.ts +10 -0
  295. package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.js +70 -31
  296. package/dist/sync/v3/workspaceSyncV3CombinedWireContract.d.ts +2 -1
  297. package/dist/sync/v3/workspaceSyncV3CombinedWireContract.js +16 -0
  298. package/dist/sync/v3/workspaceSyncV3CoverageRegistry.js +6 -0
  299. package/dist/sync/v3/workspaceSyncV3Feed.d.ts +1 -0
  300. package/dist/sync/v3/workspaceSyncV3Feed.js +6 -1
  301. package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.d.ts +2 -0
  302. package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.js +49 -18
  303. package/dist/sync/v3/workspaceSyncV3OperationProtocol.d.ts +3 -0
  304. package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.d.ts +5 -0
  305. package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.js +36 -2
  306. package/dist/sync/v3/workspaceSyncV3RepairSnapshotRetentionService.d.ts +17 -0
  307. package/dist/sync/v3/workspaceSyncV3RepairSnapshotRetentionService.js +64 -0
  308. package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeApply.d.ts +1 -0
  309. package/dist/sync/v3/workspaceSyncV3WorkflowRuntimeApply.js +50 -5
  310. package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverCoverage.d.ts +7 -0
  311. package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverCoverage.js +33 -0
  312. package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverWireContract.d.ts +7 -0
  313. package/dist/sync/v3/workspaceSyncV3WorkflowTaskCoverWireContract.js +8 -0
  314. package/dist/sync/workspaceRepair.d.ts +5 -2
  315. package/dist/sync/workspaceRepair.js +161 -6
  316. package/dist/sync/workspaceSyncModel.d.ts +21 -0
  317. package/dist/sync/workspaceSyncModel.js +35 -7
  318. package/dist/sync/workspaceSyncState.d.ts +1 -0
  319. package/dist/sync/workspaceSyncV2SnapshotBuilder.d.ts +6 -0
  320. package/dist/sync/workspaceSyncV2SnapshotBuilder.js +5 -0
  321. package/dist/ui/assets/AiIdentityRosterCard-CDMPtnbC.js +1 -0
  322. package/dist/ui/assets/AiProfilesModule-Cww85C4E.js +1 -0
  323. package/dist/ui/assets/{AnnotatedAttachmentWorkspace-B68Wg-RV.js → AnnotatedAttachmentWorkspace-Dt9TKYSH.js} +1 -1
  324. package/dist/ui/assets/{AssetTraySortControl-C8Rztyal.js → AssetTraySortControl-CKgapnxu.js} +1 -1
  325. package/dist/ui/assets/{ContextAttachmentManager-Cj3c7X9y.js → ContextAttachmentManager-T-cEVcOZ.js} +2 -2
  326. package/dist/ui/assets/{DocumentWorkspace-B5uvzems.js → DocumentWorkspace-HD4MUjAZ.js} +1 -1
  327. package/dist/ui/assets/{EntityActivityTimeline-BVFvCB5R.js → EntityActivityTimeline-_V0zfMuh.js} +1 -1
  328. package/dist/ui/assets/PlanningModule-mTkBygsB.js +1 -0
  329. package/dist/ui/assets/{PlansPage-AY4cGWco.js → PlansPage-Btiq06VO.js} +1 -1
  330. package/dist/ui/assets/{TaskContextUpload-DZxTVesW.js → TaskContextUpload-C00NVUpn.js} +1 -1
  331. package/dist/ui/assets/TaskSettings-Cp-L-4xh.js +12 -0
  332. package/dist/ui/assets/TaskforceAgentsModule-Coq9-PUp.js +24 -0
  333. package/dist/ui/assets/TaskforceAgentsModule-b-8R25cJ.css +1 -0
  334. package/dist/ui/assets/{WorkflowManagerModule-DEr5di_r.js → WorkflowManagerModule-CuqRzMmM.js} +1 -1
  335. package/dist/ui/assets/index-BZ-hdZSk.css +1 -0
  336. package/dist/ui/assets/index-DSQINwt9.js +7 -0
  337. package/dist/ui/assets/{vendor-icons-D9Lpw-j4.js → vendor-icons-Bsq-mcEn.js} +1 -1
  338. package/dist/ui/branding/logos/letterhead_dark.png +0 -0
  339. package/dist/ui/branding/logos/letterhead_light.png +0 -0
  340. package/dist/ui/branding/logos/signature_dark.png +0 -0
  341. package/dist/ui/branding/logos/signature_light.png +0 -0
  342. package/dist/ui/index.html +3 -3
  343. package/dist/utils/aiProfileDefaultLogo.js +16 -48
  344. package/dist/utils/httpSetCookie.d.ts +1 -0
  345. package/dist/utils/httpSetCookie.js +4 -1
  346. package/dist/utils/localRuntimeUrl.d.ts +1 -0
  347. package/dist/utils/localRuntimeUrl.js +14 -0
  348. package/dist/utils/productLogoRegistry.d.ts +2 -0
  349. package/dist/utils/productLogoRegistry.js +36 -0
  350. package/dist/utils/syncStatusPresentation.d.ts +4 -0
  351. package/dist/utils/syncStatusPresentation.js +17 -0
  352. package/dist/utils/taskEvents.d.ts +2 -0
  353. package/dist/utils/workspaceSyncPresentation.d.ts +1 -1
  354. package/dist/utils/workspaceSyncPresentation.js +23 -17
  355. package/package.json +24 -4
  356. package/dist/ui/assets/AiIdentityRosterCard-BZM4aQnM.js +0 -1
  357. package/dist/ui/assets/AiProfilesModule-BbAEWtHH.js +0 -1
  358. package/dist/ui/assets/PlanningModule-B5DWQOGz.js +0 -1
  359. package/dist/ui/assets/TaskSettings-BeWAuyZj.js +0 -12
  360. package/dist/ui/assets/TaskforceAgentsModule-BifCYtjR.js +0 -21
  361. package/dist/ui/assets/TaskforceAgentsModule-D6IC0S7Q.css +0 -1
  362. package/dist/ui/assets/index-I5zhdtgt.js +0 -7
  363. package/dist/ui/assets/index-VRFsx3wz.css +0 -1
@@ -0,0 +1,279 @@
1
+ import { ModelProviderConnectionError } from '../storage/modelProviderConnectionStore.js';
2
+ function publicConnection(record) {
3
+ return {
4
+ id: record.id,
5
+ providerKey: record.providerKey,
6
+ authenticationType: record.authenticationType,
7
+ lifecycleStatus: record.lifecycleStatus,
8
+ displayMetadata: record.displayMetadata,
9
+ lastVerifiedAt: record.lastVerifiedAt,
10
+ lastRefreshedAt: record.lastRefreshedAt,
11
+ failureCode: record.failureCode,
12
+ createdAt: record.createdAt,
13
+ updatedAt: record.updatedAt,
14
+ };
15
+ }
16
+ function handlerKey(providerKey, authenticationType) {
17
+ return `${providerKey}\0${authenticationType}`;
18
+ }
19
+ const RECONNECT_REQUIRED_ERROR_CODES = new Set([
20
+ 'MODEL_CONNECTION_ACCOUNT_UNAVAILABLE',
21
+ 'MODEL_CONNECTION_PROVIDER_FAILURE',
22
+ ]);
23
+ export class ModelProviderConnectionService {
24
+ store;
25
+ credentialHomes;
26
+ hasGrant;
27
+ supportedConnectionTypes;
28
+ handlers = new Map();
29
+ constructor(store, credentialHomes, hasGrant, handlers = [], supportedConnectionTypes = [{ providerKey: 'openai', authenticationType: 'chatgpt_device_code' }]) {
30
+ this.store = store;
31
+ this.credentialHomes = credentialHomes;
32
+ this.hasGrant = hasGrant;
33
+ this.supportedConnectionTypes = supportedConnectionTypes;
34
+ for (const entry of handlers) {
35
+ this.handlers.set(handlerKey(entry.providerKey, entry.authenticationType), entry.lifecycle);
36
+ }
37
+ }
38
+ create(input) {
39
+ this.assertGranted(input.ownerUserId);
40
+ const key = handlerKey(input.providerKey, input.authenticationType);
41
+ const supported = this.supportedConnectionTypes.some((entry) => handlerKey(entry.providerKey, entry.authenticationType) === key) || this.handlers.has(key);
42
+ if (!supported) {
43
+ throw new ModelProviderConnectionError('This model connection type is not available.', 400, 'MODEL_CONNECTION_TYPE_UNAVAILABLE');
44
+ }
45
+ if (!this.credentialHomes.isConfigured()) {
46
+ throw new ModelProviderConnectionError('Model connection credential storage is unavailable.', 503, 'MODEL_CONNECTION_STORAGE_UNAVAILABLE');
47
+ }
48
+ this.credentialHomes.prepareStorage();
49
+ const connection = this.store.create(input);
50
+ try {
51
+ this.credentialHomes.provision(connection);
52
+ }
53
+ catch (error) {
54
+ this.store.deletePendingOwned(input.ownerUserId, connection.id);
55
+ this.credentialHomes.removeProvisioningFailure(connection.credentialHomeRef);
56
+ throw error;
57
+ }
58
+ return publicConnection(connection);
59
+ }
60
+ list(ownerUserId) {
61
+ this.assertOwner(ownerUserId);
62
+ return this.store.listOwned(ownerUserId).map(publicConnection);
63
+ }
64
+ get(ownerUserId, connectionId) {
65
+ this.assertOwner(ownerUserId);
66
+ return publicConnection(this.store.requireOwned(ownerUserId, connectionId));
67
+ }
68
+ rename(ownerUserId, connectionId, displayName) {
69
+ this.assertOwner(ownerUserId);
70
+ return publicConnection(this.store.renameOwned(ownerUserId, connectionId, displayName));
71
+ }
72
+ async verify(ownerUserId, connectionId) {
73
+ return this.runOperation(ownerUserId, connectionId, 'verify', (context, result) => (this.store.markVerified({
74
+ ownerUserId,
75
+ connectionId,
76
+ leaseToken: context.lease.token,
77
+ displayMetadata: result?.displayMetadata,
78
+ })));
79
+ }
80
+ async refresh(ownerUserId, connectionId) {
81
+ return this.runOperation(ownerUserId, connectionId, 'refresh', (context, result) => (this.store.markRefreshed({
82
+ ownerUserId,
83
+ connectionId,
84
+ leaseToken: context.lease.token,
85
+ displayMetadata: result?.displayMetadata,
86
+ })));
87
+ }
88
+ async disconnect(ownerUserId, connectionId) {
89
+ this.assertOwner(ownerUserId);
90
+ const current = this.store.requireOwned(ownerUserId, connectionId);
91
+ if (current.lifecycleStatus === 'disconnected')
92
+ return publicConnection(current);
93
+ return this.runOperation(ownerUserId, connectionId, 'disconnect', (context) => (this.store.markDisconnected({
94
+ ownerUserId,
95
+ connectionId,
96
+ leaseToken: context.lease.token,
97
+ })), false);
98
+ }
99
+ async cleanup(ownerUserId, connectionId) {
100
+ this.assertOwner(ownerUserId);
101
+ const connection = this.store.requireOwned(ownerUserId, connectionId);
102
+ if (connection.lifecycleStatus !== 'pending'
103
+ && connection.lifecycleStatus !== 'reconnect_required'
104
+ && connection.lifecycleStatus !== 'disconnected'
105
+ && connection.lifecycleStatus !== 'revoked') {
106
+ throw new ModelProviderConnectionError('Disconnect the model connection before removing its credential storage.', 409, 'MODEL_CONNECTION_DISCONNECT_REQUIRED');
107
+ }
108
+ return this.runWithConnectionLease({
109
+ ownerUserId,
110
+ connectionId,
111
+ operation: 'cleanup',
112
+ requireGrant: false,
113
+ }, async ({ connection: leasedConnection, lease }) => {
114
+ this.credentialHomes.removeCredentialHome(leasedConnection.credentialHomeRef);
115
+ if (!this.store.deleteCleanableUnderLease({
116
+ ownerUserId,
117
+ connectionId,
118
+ leaseToken: lease.token,
119
+ })) {
120
+ throw new ModelProviderConnectionError('Model connection cleanup could not be completed.', 409, 'MODEL_CONNECTION_CLEANUP_INCOMPLETE');
121
+ }
122
+ return { id: connectionId, deleted: true };
123
+ }, true);
124
+ }
125
+ async withConnectionLease(input, callback) {
126
+ return this.runWithConnectionLease(input, callback, false);
127
+ }
128
+ assertReady(ownerUserId, connectionId) {
129
+ this.assertGranted(ownerUserId);
130
+ const connection = this.store.requireOwned(ownerUserId, connectionId);
131
+ this.assertOperationAvailable(connection, 'invoke');
132
+ this.credentialHomes.assertStorageReady();
133
+ this.credentialHomes.assertReady(connection.credentialHomeRef, connection);
134
+ return connection;
135
+ }
136
+ async runWithConnectionLease(input, callback, callbackConsumesLease) {
137
+ if (input.requireGrant === false)
138
+ this.assertOwner(input.ownerUserId);
139
+ else
140
+ this.assertGranted(input.ownerUserId);
141
+ this.store.requireOwned(input.ownerUserId, input.connectionId);
142
+ this.credentialHomes.assertStorageReady();
143
+ const leaseDurationMs = Math.min(10 * 60_000, Math.max(3_000, input.leaseDurationMs ?? 120_000));
144
+ const lease = this.store.acquireLease({
145
+ ownerUserId: input.ownerUserId,
146
+ connectionId: input.connectionId,
147
+ operation: input.operation,
148
+ durationMs: leaseDurationMs,
149
+ });
150
+ let leaseCompleted = false;
151
+ const abortController = new AbortController();
152
+ const heartbeat = setInterval(() => {
153
+ try {
154
+ if (!this.store.renewLease(lease, leaseDurationMs))
155
+ abortController.abort();
156
+ }
157
+ catch {
158
+ abortController.abort();
159
+ }
160
+ }, Math.max(1_000, Math.floor(leaseDurationMs / 3)));
161
+ heartbeat.unref?.();
162
+ try {
163
+ const connection = this.store.requireOwnedUnderLease(input.ownerUserId, input.connectionId, lease.token);
164
+ this.assertOperationAvailable(connection, input.operation);
165
+ const homeExists = this.credentialHomes.hasCredentialHome(connection.credentialHomeRef);
166
+ if (input.operation !== 'cleanup') {
167
+ this.credentialHomes.assertReady(connection.credentialHomeRef, connection);
168
+ }
169
+ const result = await callback({
170
+ connection,
171
+ lease,
172
+ signal: abortController.signal,
173
+ environment: homeExists && input.operation !== 'cleanup'
174
+ ? this.credentialHomes.buildCodexEnvironment(connection.credentialHomeRef, process.env, connection)
175
+ : {},
176
+ });
177
+ if (input.operation !== 'cleanup') {
178
+ this.credentialHomes.assertReady(connection.credentialHomeRef, connection);
179
+ }
180
+ if (abortController.signal.aborted) {
181
+ throw new ModelProviderConnectionError('Model connection operation lease was lost.', 409, 'MODEL_CONNECTION_LEASE_LOST');
182
+ }
183
+ if (!callbackConsumesLease && !this.store.completeLease(lease)) {
184
+ throw new ModelProviderConnectionError('Model connection operation lease was lost.', 409, 'MODEL_CONNECTION_LEASE_LOST');
185
+ }
186
+ leaseCompleted = true;
187
+ return result;
188
+ }
189
+ finally {
190
+ clearInterval(heartbeat);
191
+ if (!leaseCompleted)
192
+ this.store.releaseLease(lease);
193
+ }
194
+ }
195
+ async runOperation(ownerUserId, connectionId, operation, finalize, requireGrant = true) {
196
+ if (requireGrant)
197
+ this.assertGranted(ownerUserId);
198
+ else
199
+ this.assertOwner(ownerUserId);
200
+ const connection = this.store.requireOwned(ownerUserId, connectionId);
201
+ if (connection.lifecycleStatus === 'revoked' || connection.lifecycleStatus === 'disconnected') {
202
+ throw new ModelProviderConnectionError('Model connection is unavailable.', 409, 'MODEL_CONNECTION_UNAVAILABLE');
203
+ }
204
+ const handler = this.handlers.get(handlerKey(connection.providerKey, connection.authenticationType))?.[operation];
205
+ if (!handler) {
206
+ throw new ModelProviderConnectionError('This model connection operation is not available.', 409, 'MODEL_CONNECTION_OPERATION_UNAVAILABLE');
207
+ }
208
+ try {
209
+ return await this.withConnectionLease({
210
+ ownerUserId,
211
+ connectionId,
212
+ operation,
213
+ requireGrant,
214
+ }, async (context) => {
215
+ try {
216
+ const result = await handler(context);
217
+ return publicConnection(finalize(context, result));
218
+ }
219
+ catch (error) {
220
+ if (!(error instanceof ModelProviderConnectionError)
221
+ || RECONNECT_REQUIRED_ERROR_CODES.has(error.code)) {
222
+ try {
223
+ this.store.markReconnectRequired({
224
+ ownerUserId,
225
+ connectionId,
226
+ leaseToken: context.lease.token,
227
+ failureCode: error instanceof ModelProviderConnectionError
228
+ ? error.code.toLowerCase()
229
+ : 'provider_operation_failed',
230
+ });
231
+ }
232
+ catch {
233
+ // The lease-loss path remains authoritative.
234
+ }
235
+ }
236
+ throw error;
237
+ }
238
+ });
239
+ }
240
+ catch (error) {
241
+ if (error instanceof ModelProviderConnectionError)
242
+ throw error;
243
+ throw new ModelProviderConnectionError('The model provider connection operation failed.', 502, 'MODEL_CONNECTION_PROVIDER_FAILURE');
244
+ }
245
+ }
246
+ assertGranted(userIdRaw) {
247
+ const userId = this.assertOwner(userIdRaw);
248
+ if (!this.hasGrant(userId)) {
249
+ throw new ModelProviderConnectionError('Subscription-backed model access is not enabled for this account.', 403, 'SUBSCRIPTION_MODEL_ACCESS_REQUIRED');
250
+ }
251
+ }
252
+ assertOperationAvailable(connection, operation) {
253
+ const status = connection.lifecycleStatus;
254
+ const available = operation === 'login'
255
+ ? status === 'pending' || status === 'reconnect_required' || status === 'disconnected'
256
+ : operation === 'invoke'
257
+ ? status === 'active'
258
+ : operation === 'cleanup'
259
+ ? status === 'pending'
260
+ || status === 'reconnect_required'
261
+ || status === 'disconnected'
262
+ || status === 'revoked'
263
+ : operation === 'verify' || operation === 'refresh'
264
+ ? status === 'pending' || status === 'reconnect_required' || status === 'active'
265
+ : operation === 'disconnect'
266
+ ? status === 'pending' || status === 'reconnect_required' || status === 'active'
267
+ : false;
268
+ if (!available) {
269
+ throw new ModelProviderConnectionError('Model connection is unavailable.', 409, 'MODEL_CONNECTION_UNAVAILABLE');
270
+ }
271
+ }
272
+ assertOwner(userIdRaw) {
273
+ const userId = String(userIdRaw || '').trim();
274
+ if (!userId) {
275
+ throw new ModelProviderConnectionError('Authentication is required.', 401, 'AUTH_REQUIRED');
276
+ }
277
+ return userId;
278
+ }
279
+ }
@@ -0,0 +1,32 @@
1
+ interface CredentialHomeConnectionType {
2
+ providerKey: string;
3
+ authenticationType: string;
4
+ }
5
+ export declare class ModelProviderCredentialHomeManager {
6
+ private readonly root;
7
+ private readonly homesRoot;
8
+ constructor(rootPath?: string | null | undefined);
9
+ isConfigured(): boolean;
10
+ prepareStorage(): void;
11
+ provision(input: {
12
+ credentialHomeRef: string;
13
+ providerKey: string;
14
+ authenticationType: string;
15
+ }): void;
16
+ assertReady(credentialHomeRef: string, connectionType?: CredentialHomeConnectionType): void;
17
+ assertStorageReady(): void;
18
+ buildCodexEnvironment(credentialHomeRef: string, source?: NodeJS.ProcessEnv, connectionType?: CredentialHomeConnectionType): NodeJS.ProcessEnv;
19
+ /** Internal-only path list for diagnostics redaction. Never serialize this value. */
20
+ credentialPathsForRedaction(credentialHomeRef: string): string[];
21
+ hasCredentialHome(credentialHomeRef: string): boolean;
22
+ removeCredentialHome(credentialHomeRef: string): void;
23
+ removeProvisioningFailure(credentialHomeRef: string): void;
24
+ private resolveHomePath;
25
+ private ensurePrivateDirectory;
26
+ private assertPrivateDirectory;
27
+ private assertPrivateHomeLayout;
28
+ private assertPrivateHomeRoot;
29
+ private assertPrivateFile;
30
+ private writePrivateFile;
31
+ }
32
+ export {};
@@ -0,0 +1,271 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { randomBytes } from 'node:crypto';
4
+ import { parse as parseToml } from '@iarna/toml';
5
+ import { ModelProviderConnectionError } from '../storage/modelProviderConnectionStore.js';
6
+ import { ensureWindowsUserOnlyDirectoryAcl } from '../server/localServiceWindowsAcl.js';
7
+ const CREDENTIAL_HOME_REF_PATTERN = /^home_[A-Za-z0-9_-]{24,64}$/;
8
+ const CODEX_FILE_AUTH_CONFIG = [
9
+ 'cli_auth_credentials_store = "file"',
10
+ 'forced_login_method = "chatgpt"',
11
+ '',
12
+ ].join('\n');
13
+ const PROCESS_ENV_ALLOWLIST = [
14
+ 'PATH',
15
+ 'SHELL',
16
+ 'USER',
17
+ 'LOGNAME',
18
+ 'LANG',
19
+ 'LC_ALL',
20
+ 'LC_CTYPE',
21
+ 'TERM',
22
+ 'COLORTERM',
23
+ 'NO_COLOR',
24
+ ];
25
+ function isInside(root, candidate) {
26
+ const relative = path.relative(root, candidate);
27
+ return relative !== '..' && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative);
28
+ }
29
+ function storageUnavailable() {
30
+ return new ModelProviderConnectionError('Model connection credential storage is unavailable.', 503, 'MODEL_CONNECTION_STORAGE_UNAVAILABLE');
31
+ }
32
+ export class ModelProviderCredentialHomeManager {
33
+ root;
34
+ homesRoot;
35
+ constructor(rootPath = process.env.TASKFORCE_MODEL_CONNECTION_STORAGE_PATH) {
36
+ const configured = String(rootPath || '').trim();
37
+ if (!configured || !path.isAbsolute(configured)) {
38
+ this.root = '';
39
+ this.homesRoot = '';
40
+ return;
41
+ }
42
+ this.root = path.resolve(configured);
43
+ this.homesRoot = path.join(this.root, 'connections');
44
+ }
45
+ isConfigured() {
46
+ return Boolean(this.root);
47
+ }
48
+ prepareStorage() {
49
+ if (!this.root)
50
+ throw storageUnavailable();
51
+ try {
52
+ this.ensurePrivateDirectory(this.root);
53
+ this.ensurePrivateDirectory(this.homesRoot);
54
+ }
55
+ catch (error) {
56
+ if (error instanceof ModelProviderConnectionError)
57
+ throw error;
58
+ throw storageUnavailable();
59
+ }
60
+ }
61
+ provision(input) {
62
+ const homePath = this.resolveHomePath(input.credentialHomeRef);
63
+ try {
64
+ this.prepareStorage();
65
+ this.ensurePrivateDirectory(homePath);
66
+ this.ensurePrivateDirectory(path.join(homePath, 'tmp'));
67
+ this.ensurePrivateDirectory(path.join(homePath, 'xdg-config'));
68
+ this.ensurePrivateDirectory(path.join(homePath, 'xdg-cache'));
69
+ this.ensurePrivateDirectory(path.join(homePath, 'xdg-data'));
70
+ if (input.providerKey === 'openai' && input.authenticationType === 'chatgpt_device_code') {
71
+ this.writePrivateFile(path.join(homePath, 'config.toml'), CODEX_FILE_AUTH_CONFIG);
72
+ }
73
+ }
74
+ catch (error) {
75
+ if (error instanceof ModelProviderConnectionError)
76
+ throw error;
77
+ throw storageUnavailable();
78
+ }
79
+ }
80
+ assertReady(credentialHomeRef, connectionType) {
81
+ const homePath = this.resolveHomePath(credentialHomeRef);
82
+ try {
83
+ this.assertPrivateHomeLayout(homePath);
84
+ if (connectionType?.providerKey === 'openai'
85
+ && connectionType.authenticationType === 'chatgpt_device_code') {
86
+ const configPath = path.join(homePath, 'config.toml');
87
+ this.assertPrivateFile(configPath, true);
88
+ this.assertPrivateFile(path.join(homePath, 'auth.json'), false);
89
+ const config = parseToml(fs.readFileSync(configPath, 'utf8'));
90
+ if (config.cli_auth_credentials_store !== 'file'
91
+ || config.forced_login_method !== 'chatgpt') {
92
+ throw storageUnavailable();
93
+ }
94
+ }
95
+ }
96
+ catch (error) {
97
+ if (error instanceof ModelProviderConnectionError)
98
+ throw error;
99
+ throw storageUnavailable();
100
+ }
101
+ }
102
+ assertStorageReady() {
103
+ if (!this.root)
104
+ throw storageUnavailable();
105
+ try {
106
+ this.assertPrivateDirectory(this.root);
107
+ this.assertPrivateDirectory(this.homesRoot);
108
+ }
109
+ catch (error) {
110
+ if (error instanceof ModelProviderConnectionError)
111
+ throw error;
112
+ throw storageUnavailable();
113
+ }
114
+ }
115
+ buildCodexEnvironment(credentialHomeRef, source = process.env, connectionType) {
116
+ this.assertReady(credentialHomeRef, connectionType);
117
+ const homePath = this.resolveHomePath(credentialHomeRef);
118
+ const environment = {};
119
+ for (const key of PROCESS_ENV_ALLOWLIST) {
120
+ const value = source[key];
121
+ if (typeof value === 'string' && value)
122
+ environment[key] = value;
123
+ }
124
+ return {
125
+ ...environment,
126
+ HOME: homePath,
127
+ CODEX_HOME: this.resolveHomePath(credentialHomeRef),
128
+ XDG_CONFIG_HOME: path.join(homePath, 'xdg-config'),
129
+ XDG_CACHE_HOME: path.join(homePath, 'xdg-cache'),
130
+ XDG_DATA_HOME: path.join(homePath, 'xdg-data'),
131
+ TMPDIR: path.join(homePath, 'tmp'),
132
+ TEMP: path.join(homePath, 'tmp'),
133
+ TMP: path.join(homePath, 'tmp'),
134
+ };
135
+ }
136
+ /** Internal-only path list for diagnostics redaction. Never serialize this value. */
137
+ credentialPathsForRedaction(credentialHomeRef) {
138
+ return [this.resolveHomePath(credentialHomeRef), this.root];
139
+ }
140
+ hasCredentialHome(credentialHomeRef) {
141
+ const homePath = this.resolveHomePath(credentialHomeRef);
142
+ return fs.existsSync(homePath);
143
+ }
144
+ removeCredentialHome(credentialHomeRef) {
145
+ this.assertStorageReady();
146
+ const homePath = this.resolveHomePath(credentialHomeRef);
147
+ let stat;
148
+ try {
149
+ stat = fs.lstatSync(homePath);
150
+ }
151
+ catch (error) {
152
+ if (error?.code === 'ENOENT')
153
+ return;
154
+ throw storageUnavailable();
155
+ }
156
+ try {
157
+ if (stat.isSymbolicLink()) {
158
+ fs.unlinkSync(homePath);
159
+ return;
160
+ }
161
+ if (!stat.isDirectory())
162
+ throw storageUnavailable();
163
+ this.assertPrivateHomeRoot(homePath);
164
+ fs.rmSync(homePath, { recursive: true, force: false });
165
+ }
166
+ catch {
167
+ throw storageUnavailable();
168
+ }
169
+ }
170
+ removeProvisioningFailure(credentialHomeRef) {
171
+ const homePath = this.resolveHomePath(credentialHomeRef);
172
+ try {
173
+ const stat = fs.lstatSync(homePath);
174
+ if (stat.isDirectory() && !stat.isSymbolicLink()) {
175
+ fs.rmSync(homePath, { recursive: true, force: false });
176
+ }
177
+ }
178
+ catch {
179
+ // Best-effort cleanup only; the failed home reference is never reused.
180
+ }
181
+ }
182
+ resolveHomePath(credentialHomeRefRaw) {
183
+ if (!this.root)
184
+ throw storageUnavailable();
185
+ const credentialHomeRef = String(credentialHomeRefRaw || '').trim();
186
+ if (!CREDENTIAL_HOME_REF_PATTERN.test(credentialHomeRef))
187
+ throw storageUnavailable();
188
+ const candidate = path.resolve(this.homesRoot, credentialHomeRef);
189
+ if (!isInside(this.homesRoot, candidate))
190
+ throw storageUnavailable();
191
+ return candidate;
192
+ }
193
+ ensurePrivateDirectory(directory) {
194
+ fs.mkdirSync(directory, { recursive: true, mode: 0o700 });
195
+ this.assertPrivateDirectory(directory);
196
+ }
197
+ assertPrivateDirectory(directory) {
198
+ const stat = fs.lstatSync(directory);
199
+ if (!stat.isDirectory() || stat.isSymbolicLink())
200
+ throw storageUnavailable();
201
+ if (process.platform === 'win32') {
202
+ ensureWindowsUserOnlyDirectoryAcl(directory);
203
+ return;
204
+ }
205
+ if (typeof process.getuid === 'function' && stat.uid !== process.getuid())
206
+ throw storageUnavailable();
207
+ fs.chmodSync(directory, 0o700);
208
+ if ((fs.statSync(directory).mode & 0o077) !== 0)
209
+ throw storageUnavailable();
210
+ }
211
+ assertPrivateHomeLayout(homePath) {
212
+ this.assertPrivateHomeRoot(homePath);
213
+ for (const directory of [
214
+ path.join(homePath, 'tmp'),
215
+ path.join(homePath, 'xdg-config'),
216
+ path.join(homePath, 'xdg-cache'),
217
+ path.join(homePath, 'xdg-data'),
218
+ ]) {
219
+ this.assertPrivateDirectory(directory);
220
+ }
221
+ }
222
+ assertPrivateHomeRoot(homePath) {
223
+ for (const directory of [this.root, this.homesRoot, homePath]) {
224
+ this.assertPrivateDirectory(directory);
225
+ }
226
+ const rootRealPath = fs.realpathSync(this.homesRoot);
227
+ const homeRealPath = fs.realpathSync(homePath);
228
+ if (!isInside(rootRealPath, homeRealPath))
229
+ throw storageUnavailable();
230
+ }
231
+ assertPrivateFile(filePath, required) {
232
+ let stat;
233
+ try {
234
+ stat = fs.lstatSync(filePath);
235
+ }
236
+ catch (error) {
237
+ if (!required && error?.code === 'ENOENT')
238
+ return;
239
+ throw storageUnavailable();
240
+ }
241
+ if (!stat.isFile() || stat.isSymbolicLink() || stat.nlink > 1)
242
+ throw storageUnavailable();
243
+ if (process.platform === 'win32')
244
+ return;
245
+ if (typeof process.getuid === 'function' && stat.uid !== process.getuid())
246
+ throw storageUnavailable();
247
+ fs.chmodSync(filePath, 0o600);
248
+ if ((fs.statSync(filePath).mode & 0o077) !== 0)
249
+ throw storageUnavailable();
250
+ }
251
+ writePrivateFile(filePath, content) {
252
+ const temporaryPath = `${filePath}.${randomBytes(8).toString('hex')}.tmp`;
253
+ try {
254
+ fs.writeFileSync(temporaryPath, content, { encoding: 'utf8', mode: 0o600, flag: 'wx' });
255
+ if (process.platform !== 'win32')
256
+ fs.chmodSync(temporaryPath, 0o600);
257
+ fs.renameSync(temporaryPath, filePath);
258
+ if (process.platform !== 'win32')
259
+ fs.chmodSync(filePath, 0o600);
260
+ }
261
+ finally {
262
+ try {
263
+ if (fs.existsSync(temporaryPath))
264
+ fs.unlinkSync(temporaryPath);
265
+ }
266
+ catch {
267
+ // Preserve the original storage failure.
268
+ }
269
+ }
270
+ }
271
+ }
@@ -0,0 +1,12 @@
1
+ import type { ModelGateway, ModelGatewayGenerateInput, ModelGatewayGenerateResult } from './modelGateway.js';
2
+ import type { ModelProviderConnectionOperationContext, ModelProviderConnectionService } from './modelProviderConnectionService.js';
3
+ type ConnectionService = Pick<ModelProviderConnectionService, 'withConnectionLease'>;
4
+ export declare class OwnerScopedModelConnectionGateway implements ModelGateway {
5
+ private readonly connectionService;
6
+ private readonly ownerUserId;
7
+ private readonly connectionId;
8
+ private readonly createGateway;
9
+ constructor(connectionService: ConnectionService, ownerUserId: string, connectionId: string, createGateway: (context: ModelProviderConnectionOperationContext) => ModelGateway);
10
+ generate(input: ModelGatewayGenerateInput): Promise<ModelGatewayGenerateResult>;
11
+ }
12
+ export {};
@@ -0,0 +1,30 @@
1
+ export class OwnerScopedModelConnectionGateway {
2
+ connectionService;
3
+ ownerUserId;
4
+ connectionId;
5
+ createGateway;
6
+ constructor(connectionService, ownerUserId, connectionId, createGateway) {
7
+ this.connectionService = connectionService;
8
+ this.ownerUserId = ownerUserId;
9
+ this.connectionId = connectionId;
10
+ this.createGateway = createGateway;
11
+ }
12
+ generate(input) {
13
+ return this.connectionService.withConnectionLease({
14
+ ownerUserId: this.ownerUserId,
15
+ connectionId: this.connectionId,
16
+ operation: 'invoke',
17
+ }, async (context) => {
18
+ const result = await this.createGateway(context).generate(input);
19
+ return {
20
+ ...result,
21
+ sourceMetadata: {
22
+ modelSource: 'subscription_dev',
23
+ connectionScope: 'personal',
24
+ providerKey: context.connection.providerKey,
25
+ billable: false,
26
+ },
27
+ };
28
+ });
29
+ }
30
+ }