@taskforcehq/taskforce 0.3.328 → 0.3.329

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 (264) hide show
  1. package/dist/Taskforce.module.css +233 -34
  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/AnnotatedAttachmentWorkspace.js +24 -8
  8. package/dist/components/features/TaskSettings.d.ts +12 -1
  9. package/dist/components/features/TaskSettings.js +147 -40
  10. package/dist/components/features/agentCapabilities/AgentCapabilitiesPrototype.d.ts +1 -1
  11. package/dist/components/features/planning/PlanningModule.js +2 -5
  12. package/dist/components/features/planning/PlanningTaskOrderList.d.ts +1 -1
  13. package/dist/components/features/planning/PlanningTaskOrderList.js +17 -6
  14. package/dist/components/features/planning/planningTaskArrangement.d.ts +1 -0
  15. package/dist/components/features/planning/planningTaskArrangement.js +5 -5
  16. package/dist/components/features/taskforceAgentEditorModel.js +3 -1
  17. package/dist/components/task/TaskCard.d.ts +5 -0
  18. package/dist/components/task/TaskCard.js +65 -10
  19. package/dist/components/task/TaskImageReviews.js +14 -5
  20. package/dist/components/task/TaskKanban.d.ts +6 -1
  21. package/dist/components/task/TaskKanban.js +152 -6
  22. package/dist/components/task/TaskList.d.ts +5 -0
  23. package/dist/components/task/TaskList.js +3 -3
  24. package/dist/components/ui/PasswordInput.d.ts +6 -0
  25. package/dist/components/ui/PasswordInput.js +11 -0
  26. package/dist/components/ui/TopNoticeLayer.js +1 -1
  27. package/dist/components/views/AppShellHeader.js +32 -11
  28. package/dist/components/views/PlanComparisonPage.js +12 -0
  29. package/dist/components/views/StandaloneLayout.js +7 -31
  30. package/dist/components/views/WidgetView.js +3 -3
  31. package/dist/components/views/panels/PlanningDrawer.js +5 -12
  32. package/dist/components/views/standalone/modals/AccountSettingsModal.js +26 -17
  33. package/dist/config/envSchema.js +12 -0
  34. package/dist/config/localServiceRuntimeContract.d.ts +13 -0
  35. package/dist/config/localServiceRuntimeContract.js +135 -0
  36. package/dist/core/AiProfileService.js +46 -8
  37. package/dist/core/DeletedTaskLifecycleService.d.ts +1 -0
  38. package/dist/core/DeletedTaskLifecycleService.js +37 -6
  39. package/dist/core/TaskAttachmentLinksDurableMutationService.d.ts +3 -2
  40. package/dist/core/TaskAttachmentLinksDurableMutationService.js +33 -9
  41. package/dist/core/Taskforce.d.ts +62 -2
  42. package/dist/core/Taskforce.js +635 -32
  43. package/dist/core/types.d.ts +6 -0
  44. package/dist/hooks/sync/useDurableLocalOutboxDrain.d.ts +1 -1
  45. package/dist/hooks/sync/useDurableTaskCreateMutation.js +1 -1
  46. package/dist/hooks/sync/useDurableTaskMetadataMutation.d.ts +1 -0
  47. package/dist/hooks/sync/useDurableTaskMetadataMutation.js +1 -0
  48. package/dist/hooks/sync/useDurableTaskStatusMutation.d.ts +1 -0
  49. package/dist/hooks/tasks/taskHttpMutation.js +1 -0
  50. package/dist/hooks/tasks/useCloudTaskSearch.d.ts +12 -0
  51. package/dist/hooks/tasks/useCloudTaskSearch.js +71 -0
  52. package/dist/hooks/tasks/useTaskDescriptionImageDraftRecovery.d.ts +16 -0
  53. package/dist/hooks/tasks/useTaskDescriptionImageDraftRecovery.js +197 -0
  54. package/dist/hooks/tasks/useTaskEditorNavigation.d.ts +16 -3
  55. package/dist/hooks/tasks/useTaskEditorNavigation.js +72 -13
  56. package/dist/hooks/tasks/useTaskFormActions.d.ts +6 -0
  57. package/dist/hooks/tasks/useTaskFormActions.js +65 -12
  58. package/dist/hooks/ui/useSettingsModel.d.ts +24 -2
  59. package/dist/hooks/ui/useSettingsModel.js +13 -2
  60. package/dist/hooks/ui/useSettingsPersistence.d.ts +12 -1
  61. package/dist/hooks/ui/useSettingsPersistence.js +74 -47
  62. package/dist/hooks/useFilterSort.d.ts +7 -3
  63. package/dist/hooks/useFilterSort.js +15 -5
  64. package/dist/hooks/useTaskData.d.ts +10 -1
  65. package/dist/hooks/useTaskData.js +216 -7
  66. package/dist/hooks/useTaskMutations.d.ts +10 -2
  67. package/dist/hooks/useTaskMutations.js +223 -43
  68. package/dist/hooks/useTaskforce.d.ts +37 -9
  69. package/dist/hooks/useTaskforce.js +349 -39
  70. package/dist/hooks/useUiNotice.d.ts +4 -0
  71. package/dist/hooks/useUiNotice.js +4 -0
  72. package/dist/mcp/adminWorkspaceRegistrar.js +3 -3
  73. package/dist/mcp/documentAssetRegistrar.js +44 -35
  74. package/dist/mcp/documentHelpers.d.ts +1 -0
  75. package/dist/mcp/documentHelpers.js +7 -3
  76. package/dist/mcp/runtime.js +172 -42
  77. package/dist/mcp/taskPlanningRegistrar.js +41 -38
  78. package/dist/mcp/toolCallCompatibility.js +38 -1
  79. package/dist/mcp/toolCatalog.d.ts +1 -0
  80. package/dist/migrations/taskSchemaMigrations.js +12 -0
  81. package/dist/runtime/appGateDefinitions.d.ts +30 -6
  82. package/dist/runtime/appGateDefinitions.js +6 -6
  83. package/dist/runtime/appGates.d.ts +12 -13
  84. package/dist/runtime/appGates.js +29 -13
  85. package/dist/runtime/nodeAppGates.d.ts +8 -0
  86. package/dist/runtime/nodeAppGates.js +27 -0
  87. package/dist/server/cloudCollectionRead.d.ts +1 -1
  88. package/dist/server/cloudCollectionRead.js +2 -2
  89. package/dist/server/index.d.ts +3 -0
  90. package/dist/server/index.js +15 -3
  91. package/dist/server/localServiceLease.d.ts +3 -0
  92. package/dist/server/localServiceLease.js +9 -1
  93. package/dist/server/localWorkspaceSyncServerRuntime.js +10 -3
  94. package/dist/server/rateLimit.d.ts +1 -0
  95. package/dist/server/rateLimit.js +4 -0
  96. package/dist/server/realtimeSyncWs.js +36 -12
  97. package/dist/server/routes/admin.js +1 -0
  98. package/dist/server/routes/agentRoles.js +3 -2
  99. package/dist/server/routes/agentSkills.js +3 -2
  100. package/dist/server/routes/agents.js +118 -16
  101. package/dist/server/routes/annotatedAttachments.js +3 -2
  102. package/dist/server/routes/auth.js +3 -1
  103. package/dist/server/routes/durableTaskHttpRouters.d.ts +9 -2
  104. package/dist/server/routes/localService.js +2 -0
  105. package/dist/server/routes/primitives.d.ts +2 -0
  106. package/dist/server/routes/syncAuxRoutes.js +5 -2
  107. package/dist/server/routes/syncPullApplyRoutes.js +23 -4
  108. package/dist/server/routes/syncV3FeedRoutes.js +18 -16
  109. package/dist/server/routes/syncV3LocalCaptureRoutes.js +28 -2
  110. package/dist/server/routes/syncV3LocalFeedApplyRoutes.d.ts +1 -0
  111. package/dist/server/routes/syncV3LocalFeedApplyRoutes.js +26 -0
  112. package/dist/server/routes/syncV3OperationRoutes.js +10 -0
  113. package/dist/server/routes/tasks.js +103 -11
  114. package/dist/server/routes/workspaces.js +43 -1
  115. package/dist/server/workspaceDeletionAdmission.d.ts +23 -0
  116. package/dist/server/workspaceDeletionAdmission.js +50 -0
  117. package/dist/service/localServiceCli.js +16 -0
  118. package/dist/service/localServiceClientLifecycle.js +36 -10
  119. package/dist/services/codexAppServerModelGateway.d.ts +112 -0
  120. package/dist/services/codexAppServerModelGateway.js +438 -0
  121. package/dist/services/taskforceAgentMcpBridge.d.ts +7 -1
  122. package/dist/services/taskforceAgentMcpBridge.js +23 -3
  123. package/dist/shared/taskforceAgentDefinition.js +7 -1
  124. package/dist/shared/taskforceAgentModels.d.ts +1 -0
  125. package/dist/shared/taskforceAgentModels.js +30 -1
  126. package/dist/storage/postgresAdapter.d.ts +20 -3
  127. package/dist/storage/postgresAdapter.js +106 -14
  128. package/dist/storage/postgresWorker.js +13 -4
  129. package/dist/storage/postgresWorkerProtocol.d.ts +29 -0
  130. package/dist/storage/postgresWorkerProtocol.js +30 -0
  131. package/dist/sync/cloudSyncApi.d.ts +4 -1
  132. package/dist/sync/cloudSyncApi.js +7 -2
  133. package/dist/sync/contentSyncState.d.ts +1 -1
  134. package/dist/sync/coordinator/localSyncExecutionPermitStore.d.ts +1 -0
  135. package/dist/sync/coordinator/localSyncExecutionPermitStore.js +7 -1
  136. package/dist/sync/coordinator/localWorkspaceSyncRunner.js +6 -2
  137. package/dist/sync/engine/workspaceSyncEngineBrowserGatewayRemoteServices.js +20 -2
  138. package/dist/sync/engine/workspaceSyncEngineLocalServices.d.ts +4 -0
  139. package/dist/sync/engine/workspaceSyncEngineLocalServices.js +11 -0
  140. package/dist/sync/engine/workspaceSyncEngineRemoteServices.d.ts +11 -0
  141. package/dist/sync/engine/workspaceSyncEngineRemoteServices.js +2 -1
  142. package/dist/sync/engine/workspaceSyncEngineServerRemoteServices.js +31 -4
  143. package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.d.ts +3 -1
  144. package/dist/sync/engine/workspaceSyncEngineServerRunnerOperations.js +25 -8
  145. package/dist/sync/engine/workspaceSyncEngineTransfers.d.ts +1 -1
  146. package/dist/sync/engine/workspaceSyncEngineTransfers.js +8 -3
  147. package/dist/sync/syncService.d.ts +2 -0
  148. package/dist/sync/syncService.js +4 -1
  149. package/dist/sync/v3/combinedFeedCapability.js +4 -0
  150. package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.d.ts +2 -0
  151. package/dist/sync/v3/durableTaskAttachmentLinksMutationRouter.js +11 -1
  152. package/dist/sync/v3/durableTaskChecklistMutationRouter.d.ts +2 -0
  153. package/dist/sync/v3/durableTaskChecklistMutationRouter.js +4 -0
  154. package/dist/sync/v3/durableTaskHttpBulkMutationRouter.d.ts +1 -0
  155. package/dist/sync/v3/durableTaskHttpBulkMutationRouter.js +30 -8
  156. package/dist/sync/v3/durableTaskHttpRootMutationRouter.d.ts +5 -3
  157. package/dist/sync/v3/durableTaskHttpRootMutationRouter.js +27 -2
  158. package/dist/sync/v3/localTaskAttachmentLinksOutboxService.d.ts +2 -0
  159. package/dist/sync/v3/localTaskAttachmentLinksOutboxService.js +47 -7
  160. package/dist/sync/v3/localTaskCreateOutboxService.js +15 -6
  161. package/dist/sync/v3/localTaskMetadataClient.d.ts +1 -0
  162. package/dist/sync/v3/localTaskMetadataClient.js +1 -0
  163. package/dist/sync/v3/localTaskMetadataOutboxHandler.js +5 -1
  164. package/dist/sync/v3/localTaskMetadataOutboxService.d.ts +2 -0
  165. package/dist/sync/v3/localTaskMetadataOutboxService.js +7 -0
  166. package/dist/sync/v3/localTaskRestoreOutboxService.js +14 -6
  167. package/dist/sync/v3/localTaskStatusClient.d.ts +1 -0
  168. package/dist/sync/v3/localTaskStatusClient.js +6 -1
  169. package/dist/sync/v3/localTaskStatusOutboxService.d.ts +2 -0
  170. package/dist/sync/v3/localTaskStatusOutboxService.js +54 -13
  171. package/dist/sync/v3/syncDurabilityStore.d.ts +7 -0
  172. package/dist/sync/v3/syncDurabilityStore.js +31 -11
  173. package/dist/sync/v3/taskAttachmentLinksMutationService.d.ts +6 -4
  174. package/dist/sync/v3/taskAttachmentLinksMutationService.js +19 -10
  175. package/dist/sync/v3/taskChecklistMutationService.d.ts +4 -2
  176. package/dist/sync/v3/taskChecklistMutationService.js +4 -0
  177. package/dist/sync/v3/taskCreateMutationService.d.ts +2 -2
  178. package/dist/sync/v3/taskCreateMutationService.js +7 -4
  179. package/dist/sync/v3/taskMetadataMutationService.d.ts +3 -0
  180. package/dist/sync/v3/taskMetadataMutationService.js +4 -0
  181. package/dist/sync/v3/taskRestoreMutationService.d.ts +2 -2
  182. package/dist/sync/v3/taskRestoreMutationService.js +7 -4
  183. package/dist/sync/v3/taskStatusMutationService.d.ts +2 -0
  184. package/dist/sync/v3/taskStatusMutationService.js +4 -0
  185. package/dist/sync/v3/workflowAssignmentSync.d.ts +1 -0
  186. package/dist/sync/v3/workflowAssignmentSync.js +3 -0
  187. package/dist/sync/v3/workspaceSyncV2ProjectionExclusions.d.ts +1 -1
  188. package/dist/sync/v3/workspaceSyncV2ProjectionExclusions.js +13 -3
  189. package/dist/sync/v3/workspaceSyncV3AttachmentApplyObligationStore.d.ts +11 -0
  190. package/dist/sync/v3/workspaceSyncV3AttachmentApplyObligationStore.js +27 -10
  191. package/dist/sync/v3/workspaceSyncV3AttachmentAssetHydration.d.ts +2 -1
  192. package/dist/sync/v3/workspaceSyncV3AttachmentAssetHydration.js +52 -10
  193. package/dist/sync/v3/workspaceSyncV3CloudOperationHandler.js +9 -1
  194. package/dist/sync/v3/workspaceSyncV3CombinedFeedOrchestrator.js +8 -3
  195. package/dist/sync/v3/workspaceSyncV3CombinedLocalApply.js +51 -10
  196. package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.d.ts +7 -0
  197. package/dist/sync/v3/workspaceSyncV3CombinedRepairBaseline.js +30 -18
  198. package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.d.ts +9 -4
  199. package/dist/sync/v3/workspaceSyncV3CombinedRepairMaterialization.js +98 -47
  200. package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.d.ts +10 -0
  201. package/dist/sync/v3/workspaceSyncV3CombinedRepairSnapshot.js +58 -21
  202. package/dist/sync/v3/workspaceSyncV3CombinedWireContract.d.ts +3 -1
  203. package/dist/sync/v3/workspaceSyncV3CombinedWireContract.js +18 -0
  204. package/dist/sync/v3/workspaceSyncV3CoverageRegistry.js +6 -0
  205. package/dist/sync/v3/workspaceSyncV3FeedProfile.d.ts +1 -1
  206. package/dist/sync/v3/workspaceSyncV3LegacyBoundaryAttestation.d.ts +1 -0
  207. package/dist/sync/v3/workspaceSyncV3LegacyBoundaryAttestation.js +23 -10
  208. package/dist/sync/v3/workspaceSyncV3NestedTaskApply.d.ts +3 -0
  209. package/dist/sync/v3/workspaceSyncV3NestedTaskApply.js +64 -13
  210. package/dist/sync/v3/workspaceSyncV3NestedTaskCodecs.d.ts +9 -0
  211. package/dist/sync/v3/workspaceSyncV3NestedTaskCodecs.js +26 -0
  212. package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.d.ts +15 -5
  213. package/dist/sync/v3/workspaceSyncV3NestedTaskProjection.js +50 -14
  214. package/dist/sync/v3/workspaceSyncV3NestedTaskRepairSnapshot.d.ts +2 -1
  215. package/dist/sync/v3/workspaceSyncV3NestedTaskRepairSnapshot.js +11 -3
  216. package/dist/sync/v3/workspaceSyncV3OperationProtocol.d.ts +2 -0
  217. package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.d.ts +2 -0
  218. package/dist/sync/v3/workspaceSyncV3OperatorDiagnostics.js +19 -7
  219. package/dist/sync/v3/workspaceSyncV3TaskCommentAudit.js +9 -2
  220. package/dist/sync/v3/workspaceSyncV3TaskCoverCoverage.d.ts +7 -0
  221. package/dist/sync/v3/workspaceSyncV3TaskCoverCoverage.js +37 -0
  222. package/dist/sync/v3/workspaceSyncV3TaskCoverWireContract.d.ts +6 -0
  223. package/dist/sync/v3/workspaceSyncV3TaskCoverWireContract.js +9 -0
  224. package/dist/sync/workspacePullFeed.js +2 -1
  225. package/dist/sync/workspaceRepair.d.ts +3 -0
  226. package/dist/sync/workspaceRepair.js +67 -6
  227. package/dist/types.d.ts +47 -1
  228. package/dist/types.js +6 -0
  229. package/dist/ui/assets/{AiIdentityRosterCard-MZs7lVED.js → AiIdentityRosterCard-BZM4aQnM.js} +1 -1
  230. package/dist/ui/assets/AiProfilesModule-BbAEWtHH.js +1 -0
  231. package/dist/ui/assets/AnnotatedAttachmentWorkspace-B68Wg-RV.js +3 -0
  232. package/dist/ui/assets/AnnotatedAttachmentWorkspace-TzYu7pkG.css +1 -0
  233. package/dist/ui/assets/{AssetTraySortControl-Kf1pelSy.js → AssetTraySortControl-C8Rztyal.js} +1 -1
  234. package/dist/ui/assets/{ContextAttachmentManager-B8boOs6Q.js → ContextAttachmentManager-Cj3c7X9y.js} +2 -2
  235. package/dist/ui/assets/{DocumentWorkspace-DXH4XUsB.js → DocumentWorkspace-B5uvzems.js} +1 -1
  236. package/dist/ui/assets/{EntityActivityTimeline-BtSTq0ON.js → EntityActivityTimeline-BVFvCB5R.js} +1 -1
  237. package/dist/ui/assets/PlanningModule-B5DWQOGz.js +1 -0
  238. package/dist/ui/assets/PlansPage-AY4cGWco.js +1 -0
  239. package/dist/ui/assets/TaskContextUpload-DZxTVesW.js +1 -0
  240. package/dist/ui/assets/TaskSettings-BeWAuyZj.js +12 -0
  241. package/dist/ui/assets/{TaskforceAgentsModule-BazdUwxZ.js → TaskforceAgentsModule-BifCYtjR.js} +6 -6
  242. package/dist/ui/assets/{WorkflowManagerModule-DWFspC-o.js → WorkflowManagerModule-DEr5di_r.js} +1 -1
  243. package/dist/ui/assets/index-I5zhdtgt.js +7 -0
  244. package/dist/ui/assets/index-VRFsx3wz.css +1 -0
  245. package/dist/ui/assets/{vendor-icons-BkFLXavV.js → vendor-icons-D9Lpw-j4.js} +1 -1
  246. package/dist/ui/index.html +3 -3
  247. package/dist/utils/taskActivity.d.ts +3 -2
  248. package/dist/utils/taskActivity.js +19 -2
  249. package/dist/utils/taskEditorReconciliation.d.ts +40 -0
  250. package/dist/utils/taskEditorReconciliation.js +217 -0
  251. package/dist/utils/taskNormalization.d.ts +1 -0
  252. package/dist/utils/taskNormalization.js +39 -0
  253. package/dist/utils/taskSearch.js +2 -2
  254. package/dist/utils/uiNotice.d.ts +4 -0
  255. package/package.json +16 -4
  256. package/dist/ui/assets/AiProfilesModule-C3i0LOxe.js +0 -1
  257. package/dist/ui/assets/AnnotatedAttachmentWorkspace-CBRZ8rca.css +0 -1
  258. package/dist/ui/assets/AnnotatedAttachmentWorkspace-DVZk5Tln.js +0 -3
  259. package/dist/ui/assets/PlanningModule-BPVyEa-f.js +0 -1
  260. package/dist/ui/assets/PlansPage-ChqgxALc.js +0 -1
  261. package/dist/ui/assets/TaskContextUpload-CB3ol0sN.js +0 -1
  262. package/dist/ui/assets/TaskSettings-g4ECKNOz.js +0 -12
  263. package/dist/ui/assets/index-BUplSsv_.js +0 -7
  264. package/dist/ui/assets/index-gz2EXuoK.css +0 -1
@@ -0,0 +1,438 @@
1
+ import { spawn } from 'child_process';
2
+ import { tmpdir } from 'os';
3
+ import readline from 'readline';
4
+ import { ModelGatewayConfigurationError } from './modelGateway.js';
5
+ import { TASKFORCE_AGENT_MODEL_OPTIONS, isTaskforceAgentSubscriptionDevModelsEnabled } from '../shared/taskforceAgentModels.js';
6
+ const CODEX_APP_SERVER_STDERR_LIMIT = 4_096;
7
+ export const DEFAULT_CODEX_APP_SERVER_MODEL_KEY_IDS = {
8
+ ...Object.fromEntries(TASKFORCE_AGENT_MODEL_OPTIONS
9
+ .filter((model) => model.runtime === 'subscription-dev' && model.providerKey === 'openai')
10
+ .map((model) => [model.key, model.runtimeModelId])),
11
+ };
12
+ const CODEX_APP_SERVER_ENV_ALLOWLIST = [
13
+ 'HOME',
14
+ 'USER',
15
+ 'LOGNAME',
16
+ 'PATH',
17
+ 'SHELL',
18
+ 'TMPDIR',
19
+ 'TEMP',
20
+ 'TMP',
21
+ 'LANG',
22
+ 'LC_ALL',
23
+ 'LC_CTYPE',
24
+ 'TERM',
25
+ 'COLORTERM',
26
+ 'NO_COLOR',
27
+ 'CODEX_HOME',
28
+ 'XDG_CONFIG_HOME',
29
+ 'XDG_CACHE_HOME',
30
+ 'XDG_DATA_HOME',
31
+ ];
32
+ export function buildCodexAppServerEnv(source = process.env) {
33
+ const env = {};
34
+ for (const key of CODEX_APP_SERVER_ENV_ALLOWLIST) {
35
+ const value = source[key];
36
+ if (typeof value === 'string' && value.length > 0)
37
+ env[key] = value;
38
+ }
39
+ return env;
40
+ }
41
+ export function sanitizeCodexAppServerStderr(value) {
42
+ return String(value || '')
43
+ .replace(/((?:api[_-]?key|access[_-]?token|refresh[_-]?token|client[_-]?secret)\s*[:=]\s*)[^\s]+/gi, '$1[redacted]')
44
+ .replace(/sk-[A-Za-z0-9_-]{8,}/g, '[redacted OpenAI credential]')
45
+ .replace(/(Bearer\s+)[^\s]+/gi, '$1[redacted]')
46
+ .replace(/[^\x09\x0A\x0D\x20-\x7E]/g, '?');
47
+ }
48
+ export function collectCodexAppServerStderr(current, chunk) {
49
+ return (current + String(chunk || '')).slice(-CODEX_APP_SERVER_STDERR_LIMIT);
50
+ }
51
+ export function assertCodexChatGptSubscriptionAccount(result) {
52
+ const accountType = readStringPath(result, ['account', 'type']);
53
+ if (accountType !== 'chatgpt') {
54
+ throw new ModelGatewayConfigurationError('Codex is not signed in with a ChatGPT subscription. Run codex login on this machine and choose Sign in with ChatGPT.', 'MODEL_SOURCE_UNAVAILABLE');
55
+ }
56
+ }
57
+ export function isCodexSubscriptionDevRuntimeAllowed(source = process.env) {
58
+ const runtimeMode = String(source.TASKFORCE_RUNTIME_MODE || '').trim().toLowerCase();
59
+ return runtimeMode === 'local';
60
+ }
61
+ function resolveCodexAppServerCwd(cwd) {
62
+ return String(cwd || process.env.TASKFORCE_CODEX_APP_SERVER_CWD || tmpdir()).trim() || tmpdir();
63
+ }
64
+ function buildCodexAppServerRuntimePolicy(cwd) {
65
+ return {
66
+ cwd,
67
+ approvalPolicy: 'never',
68
+ sandbox: 'read-only',
69
+ sandboxPolicy: {
70
+ type: 'readOnly',
71
+ networkAccess: false,
72
+ },
73
+ };
74
+ }
75
+ export function extractCodexTurnCompletion(messages) {
76
+ const jsonMessages = messages;
77
+ const completed = jsonMessages.find((message) => message.method === 'turn/completed');
78
+ if (!completed)
79
+ return null;
80
+ const stopReason = readStringPath(completed.params, ['turn', 'status'])
81
+ || readStringPath(completed.params, ['status'])
82
+ || 'completed';
83
+ if (stopReason !== 'completed') {
84
+ const errorMessage = readStringPath(completed.params, ['turn', 'error', 'message'])
85
+ || readStringPath(completed.params, ['error', 'message'])
86
+ || `Codex app-server turn ended with status ${stopReason}.`;
87
+ throw new Error(errorMessage);
88
+ }
89
+ return {
90
+ text: extractAgentText(jsonMessages),
91
+ stopReason,
92
+ };
93
+ }
94
+ export class CodexAppServerJsonRpcClient {
95
+ process;
96
+ pending = new Map();
97
+ notifications = [];
98
+ nextId = 1;
99
+ initialized = false;
100
+ lineReader;
101
+ requestTimeoutMs;
102
+ turnRejectors = new Set();
103
+ terminalError = null;
104
+ stderrTail = '';
105
+ constructor(options = {}) {
106
+ const command = options.command || process.env.TASKFORCE_CODEX_APP_SERVER_COMMAND || 'codex';
107
+ const args = options.args || ['app-server', '--listen', 'stdio://'];
108
+ const cwd = resolveCodexAppServerCwd(options.cwd);
109
+ this.requestTimeoutMs = options.requestTimeoutMs ?? 30_000;
110
+ this.process = spawn(command, args, {
111
+ stdio: ['pipe', 'pipe', 'pipe'],
112
+ env: options.env || buildCodexAppServerEnv(),
113
+ cwd,
114
+ });
115
+ this.lineReader = readline.createInterface({ input: this.process.stdout });
116
+ this.lineReader.on('line', (line) => this.handleLine(line));
117
+ this.process.on('error', (error) => {
118
+ this.fail(new Error(`Codex app-server failed to start: ${error.message}`));
119
+ });
120
+ this.process.on('exit', (code, signal) => {
121
+ const reason = signal ? `signal ${signal}` : `exit code ${code ?? 'unknown'}`;
122
+ const details = sanitizeCodexAppServerStderr(this.stderrTail).trim();
123
+ this.fail(new Error(`Codex app-server stopped before completing the request (${reason}).${details ? ` ${details}` : ''}`));
124
+ });
125
+ this.process.stderr.on('data', (chunk) => {
126
+ this.stderrTail = collectCodexAppServerStderr(this.stderrTail, chunk);
127
+ });
128
+ }
129
+ async initialize() {
130
+ if (this.initialized)
131
+ return;
132
+ await this.request('initialize', {
133
+ clientInfo: {
134
+ name: 'taskforce_dev',
135
+ title: 'Taskforce Dev',
136
+ version: '0.1.0',
137
+ },
138
+ });
139
+ this.sendNotification('initialized', {});
140
+ this.initialized = true;
141
+ }
142
+ async assertChatGptSubscriptionAuth() {
143
+ const result = await this.request('account/read', { refreshToken: false });
144
+ assertCodexChatGptSubscriptionAccount(result);
145
+ }
146
+ async startThread(input) {
147
+ const result = await this.request('thread/start', {
148
+ model: input.model,
149
+ cwd: input.cwd,
150
+ approvalPolicy: input.approvalPolicy,
151
+ sandbox: input.sandbox,
152
+ serviceName: 'taskforce_agent_manager_dev',
153
+ ...(input.developerInstructions
154
+ ? { developerInstructions: input.developerInstructions }
155
+ : {}),
156
+ });
157
+ const threadId = readStringPath(result, ['thread', 'id']) || readStringPath(result, ['id']);
158
+ if (!threadId)
159
+ throw new Error('Codex app-server did not return a thread id.');
160
+ return { threadId };
161
+ }
162
+ async startTurnAndCollectText(input) {
163
+ const startedAt = this.notifications.length;
164
+ await this.request('turn/start', {
165
+ threadId: input.threadId,
166
+ input: [{ type: 'text', text: input.prompt }],
167
+ cwd: input.cwd,
168
+ approvalPolicy: input.approvalPolicy,
169
+ sandboxPolicy: input.sandboxPolicy,
170
+ model: input.model,
171
+ });
172
+ return this.waitForTurnCompletion(startedAt, input.timeoutMs);
173
+ }
174
+ close() {
175
+ this.lineReader.close();
176
+ this.process.kill();
177
+ }
178
+ request(method, params) {
179
+ const id = this.nextId++;
180
+ const message = { jsonrpc: '2.0', id, method, params };
181
+ return new Promise((resolve, reject) => {
182
+ const timeout = setTimeout(() => {
183
+ this.pending.delete(id);
184
+ reject(new Error(`Timed out waiting for Codex app-server ${method} response.`));
185
+ }, this.requestTimeoutMs);
186
+ this.pending.set(id, {
187
+ resolve: (value) => {
188
+ clearTimeout(timeout);
189
+ resolve(value);
190
+ },
191
+ reject: (error) => {
192
+ clearTimeout(timeout);
193
+ reject(error);
194
+ },
195
+ });
196
+ this.process.stdin.write(JSON.stringify(message) + '\n', (error) => {
197
+ if (error) {
198
+ const pending = this.pending.get(id);
199
+ if (!pending)
200
+ return;
201
+ this.pending.delete(id);
202
+ pending.reject(error);
203
+ }
204
+ });
205
+ });
206
+ }
207
+ sendNotification(method, params) {
208
+ this.process.stdin.write(JSON.stringify({ jsonrpc: '2.0', method, params }) + '\n');
209
+ }
210
+ handleLine(line) {
211
+ const trimmed = line.trim();
212
+ if (!trimmed)
213
+ return;
214
+ let message;
215
+ try {
216
+ message = JSON.parse(trimmed);
217
+ }
218
+ catch {
219
+ return;
220
+ }
221
+ if (typeof message.id === 'number') {
222
+ const pending = this.pending.get(message.id);
223
+ if (!pending) {
224
+ if (message.method) {
225
+ this.sendResponseError(message.id, -32601, `Taskforce does not support Codex app-server request ${message.method}.`);
226
+ }
227
+ return;
228
+ }
229
+ this.pending.delete(message.id);
230
+ if (message.error) {
231
+ pending.reject(new Error(message.error.message || 'Codex app-server request failed.'));
232
+ }
233
+ else {
234
+ pending.resolve(message.result);
235
+ }
236
+ return;
237
+ }
238
+ if (message.method)
239
+ this.notifications.push(message);
240
+ }
241
+ sendResponseError(id, code, message) {
242
+ this.process.stdin.write(JSON.stringify({
243
+ jsonrpc: '2.0',
244
+ id,
245
+ error: { code, message },
246
+ }) + '\n');
247
+ }
248
+ waitForTurnCompletion(startIndex, timeoutMs) {
249
+ const startedAt = Date.now();
250
+ return new Promise((resolve, reject) => {
251
+ let settled = false;
252
+ const rejectTurn = (error) => {
253
+ if (settled)
254
+ return;
255
+ settled = true;
256
+ this.turnRejectors.delete(rejectTurn);
257
+ reject(error);
258
+ };
259
+ const resolveTurn = (value) => {
260
+ if (settled)
261
+ return;
262
+ settled = true;
263
+ this.turnRejectors.delete(rejectTurn);
264
+ resolve(value);
265
+ };
266
+ this.turnRejectors.add(rejectTurn);
267
+ if (this.terminalError) {
268
+ rejectTurn(this.terminalError);
269
+ return;
270
+ }
271
+ const poll = () => {
272
+ if (settled)
273
+ return;
274
+ const messages = this.notifications.slice(startIndex);
275
+ try {
276
+ const completion = extractCodexTurnCompletion(messages);
277
+ if (completion) {
278
+ resolveTurn(completion);
279
+ return;
280
+ }
281
+ }
282
+ catch (error) {
283
+ rejectTurn(error instanceof Error ? error : new Error(String(error)));
284
+ return;
285
+ }
286
+ if (Date.now() - startedAt > timeoutMs) {
287
+ rejectTurn(new Error('Timed out waiting for Codex app-server turn completion.'));
288
+ return;
289
+ }
290
+ setTimeout(poll, 50);
291
+ };
292
+ poll();
293
+ });
294
+ }
295
+ rejectAll(error) {
296
+ for (const pending of this.pending.values())
297
+ pending.reject(error);
298
+ this.pending.clear();
299
+ }
300
+ fail(error) {
301
+ if (!this.terminalError)
302
+ this.terminalError = error;
303
+ this.rejectAll(this.terminalError);
304
+ for (const rejectTurn of [...this.turnRejectors])
305
+ rejectTurn(this.terminalError);
306
+ }
307
+ }
308
+ export class CodexAppServerModelGateway {
309
+ client;
310
+ clientFactory;
311
+ modelKeyIds;
312
+ timeoutMs;
313
+ cwd;
314
+ constructor(options = {}) {
315
+ this.client = options.client;
316
+ this.cwd = resolveCodexAppServerCwd(options.cwd);
317
+ this.clientFactory = options.clientFactory || (() => new CodexAppServerJsonRpcClient({
318
+ command: options.command,
319
+ args: options.args,
320
+ cwd: this.cwd,
321
+ env: options.env,
322
+ requestTimeoutMs: options.requestTimeoutMs,
323
+ }));
324
+ this.modelKeyIds = {
325
+ ...DEFAULT_CODEX_APP_SERVER_MODEL_KEY_IDS,
326
+ ...(options.modelKeyIds ?? {}),
327
+ };
328
+ this.timeoutMs = options.timeoutMs ?? 120_000;
329
+ }
330
+ async generate(input) {
331
+ if (!isTaskforceAgentSubscriptionDevModelsEnabled()) {
332
+ throw new ModelGatewayConfigurationError('OpenAI Codex subscription-dev models are disabled. Set TASKFORCE_AGENT_SUBSCRIPTION_DEV_MODELS=true for this development runtime.', 'MODEL_SOURCE_UNAVAILABLE');
333
+ }
334
+ if (!isCodexSubscriptionDevRuntimeAllowed()) {
335
+ throw new ModelGatewayConfigurationError('OpenAI Codex subscription-dev models are only available in the local Taskforce runtime.', 'MODEL_SOURCE_UNAVAILABLE');
336
+ }
337
+ const modelId = this.resolveModelId(input);
338
+ const client = this.client || this.clientFactory();
339
+ const shouldClose = !this.client;
340
+ const runtimePolicy = buildCodexAppServerRuntimePolicy(this.cwd);
341
+ const startedAt = Date.now();
342
+ try {
343
+ await client.initialize();
344
+ await client.assertChatGptSubscriptionAuth();
345
+ const thread = await client.startThread({
346
+ model: modelId,
347
+ developerInstructions: input.system,
348
+ ...runtimePolicy,
349
+ });
350
+ const result = await client.startTurnAndCollectText({
351
+ threadId: thread.threadId,
352
+ prompt: this.formatMessages(input),
353
+ model: modelId,
354
+ timeoutMs: this.timeoutMs,
355
+ ...runtimePolicy,
356
+ });
357
+ return {
358
+ text: result.text.trim(),
359
+ provider: 'openai-codex-subscription-dev',
360
+ modelId,
361
+ stopReason: result.stopReason,
362
+ latencyMs: Date.now() - startedAt,
363
+ };
364
+ }
365
+ finally {
366
+ if (shouldClose)
367
+ client.close();
368
+ }
369
+ }
370
+ resolveModelId(input) {
371
+ const modelKey = String(input.modelKey || '').trim();
372
+ if (!modelKey)
373
+ throw new Error('No OpenAI Codex subscription-dev model selected.');
374
+ const modelId = this.modelKeyIds[modelKey];
375
+ if (!modelId)
376
+ throw new Error('No OpenAI Codex subscription-dev model configured for the selected model.');
377
+ return modelId;
378
+ }
379
+ formatMessages(input) {
380
+ return input.messages
381
+ .map((message) => `${message.role === 'assistant' ? 'Assistant' : 'User'}: ${message.content}`)
382
+ .join('\n\n');
383
+ }
384
+ }
385
+ function readStringPath(value, path) {
386
+ let cursor = value;
387
+ for (const segment of path) {
388
+ if (!cursor || typeof cursor !== 'object')
389
+ return '';
390
+ cursor = cursor[segment];
391
+ }
392
+ return typeof cursor === 'string' ? cursor.trim() : '';
393
+ }
394
+ function readTextPath(value, path) {
395
+ let cursor = value;
396
+ for (const segment of path) {
397
+ if (!cursor || typeof cursor !== 'object')
398
+ return '';
399
+ cursor = cursor[segment];
400
+ }
401
+ return typeof cursor === 'string' ? cursor : '';
402
+ }
403
+ function extractAgentText(messages) {
404
+ const deltaTextParts = [];
405
+ const finalAnswerTextParts = [];
406
+ const legacyCompletedTextParts = [];
407
+ for (const message of messages) {
408
+ if (message.method === 'item/agentMessage/delta') {
409
+ const text = readTextPath(message.params, ['delta'])
410
+ || readTextPath(message.params, ['text'])
411
+ || readTextPath(message.params, ['message', 'delta']);
412
+ if (text)
413
+ deltaTextParts.push(text);
414
+ }
415
+ if (message.method === 'item/completed') {
416
+ const itemType = readStringPath(message.params, ['item', 'type']);
417
+ if (itemType && itemType !== 'agentMessage')
418
+ continue;
419
+ const phase = readStringPath(message.params, ['item', 'phase']);
420
+ if (phase === 'commentary')
421
+ continue;
422
+ const text = readTextPath(message.params, ['item', 'text'])
423
+ || readTextPath(message.params, ['item', 'content', 'text']);
424
+ if (!text)
425
+ continue;
426
+ if (phase === 'final_answer')
427
+ finalAnswerTextParts.push(text);
428
+ else
429
+ legacyCompletedTextParts.push(text);
430
+ }
431
+ }
432
+ const textParts = finalAnswerTextParts.length > 0
433
+ ? finalAnswerTextParts
434
+ : legacyCompletedTextParts.length > 0
435
+ ? legacyCompletedTextParts
436
+ : deltaTextParts;
437
+ return textParts.join('').trim();
438
+ }
@@ -1,4 +1,5 @@
1
1
  import { type TaskforceCore } from '../core/Taskforce.js';
2
+ import { createTaskforceMcpServer } from '../mcp/runtime.js';
2
3
  import { type ManagedAgentMcpToolProfile } from '../mcp/toolProfiles.js';
3
4
  import { type McpToolName } from '../mcp/toolRegistry.js';
4
5
  import type { AgentToolPolicy } from '../shared/taskforceAgentDefinition.js';
@@ -33,8 +34,12 @@ export type PrepareTaskforceAgentMcpBridgeInput = {
33
34
  readOnly?: boolean;
34
35
  toolProfile?: ManagedAgentMcpToolProfile;
35
36
  toolPolicy?: AgentToolPolicy;
37
+ executionRequestId: string;
36
38
  system: string;
37
39
  };
40
+ type PrepareTaskforceAgentMcpBridgeDependencies = {
41
+ createMcpServer?: typeof createTaskforceMcpServer;
42
+ };
38
43
  export declare const MANAGED_AGENT_LIST_TASKS_DEFAULT_LIMIT = 25;
39
44
  export declare const MANAGED_AGENT_LIST_TASKS_MAX_LIMIT = 50;
40
45
  export declare const MANAGED_AGENT_TOOL_RESULT_MAX_BYTES: number;
@@ -50,6 +55,7 @@ type McpToolDescriptor = {
50
55
  export declare function hashTaskforceAgentMcpToolContract(tools: McpToolDescriptor[]): string;
51
56
  export declare function isTaskforceAgentMutationToolName(name: string): boolean;
52
57
  export declare function taskforceAgentMutationCallKey(name: string, argumentsValue: Record<string, unknown>): string | null;
58
+ export declare function taskforceAgentMcpRequestId(call: TaskforceAgentMcpToolCall): string;
53
59
  declare const MANAGED_AGENT_CAPABILITY_TOOLS: Readonly<{
54
60
  readonly tasks: readonly ["add_comment", "add_task_checklist_item", "complete_workflow_step", "get_schedule_board", "get_stats", "get_task", "get_task_attachments", "get_task_checklist", "get_task_workflow", "list_task_relationships", "list_tasks", "replace_task_checklist", "search_tasks"];
55
61
  readonly planning: readonly ["add_initiative_comment", "add_workstream_comment", "get_initiative", "get_workstream", "list_initiatives", "list_workstreams"];
@@ -72,6 +78,6 @@ type BoundedManagedAgentToolResult = {
72
78
  rejected: boolean;
73
79
  };
74
80
  export declare function boundManagedAgentMcpToolResult(toolName: string, text: string): BoundedManagedAgentToolResult;
75
- export declare function prepareTaskforceAgentMcpBridge(input: PrepareTaskforceAgentMcpBridgeInput): Promise<PreparedTaskforceAgentMcpBridge | null>;
81
+ export declare function prepareTaskforceAgentMcpBridge(input: PrepareTaskforceAgentMcpBridgeInput, dependencies?: PrepareTaskforceAgentMcpBridgeDependencies): Promise<PreparedTaskforceAgentMcpBridge | null>;
76
82
  export declare function serializeTaskforceAgentMcpToolResult(result: TaskforceAgentMcpToolResult): Record<string, unknown>;
77
83
  export {};
@@ -31,6 +31,15 @@ export function taskforceAgentMutationCallKey(name, argumentsValue) {
31
31
  return null;
32
32
  return `${normalizedName}:${serializeCanonicalJson(argumentsValue || {})}`;
33
33
  }
34
+ export function taskforceAgentMcpRequestId(call) {
35
+ return `managed-agent-${createHash('sha256')
36
+ .update(serializeCanonicalJson({
37
+ name: String(call.name || '').trim(),
38
+ arguments: call.arguments || {},
39
+ }))
40
+ .digest('hex')
41
+ .slice(0, 32)}`;
42
+ }
34
43
  const TASK_SCOPED_MUTATION_TOOL_NAMES = new Set([
35
44
  'add_comment',
36
45
  'add_task_checklist_item',
@@ -284,6 +293,14 @@ function utf8ByteLength(value) {
284
293
  return Buffer.byteLength(value, 'utf8');
285
294
  }
286
295
  export function normalizeManagedAgentMcpToolCall(call) {
296
+ if (call.name === 'get_task_workflow' || call.name === 'complete_workflow_step') {
297
+ const args = { ...call.arguments };
298
+ if (!String(args.taskId || '').trim() && String(args.id || '').trim()) {
299
+ args.taskId = args.id;
300
+ }
301
+ delete args.id;
302
+ return { name: call.name, arguments: args };
303
+ }
287
304
  if (call.name !== 'list_tasks')
288
305
  return call;
289
306
  const args = { ...call.arguments };
@@ -438,7 +455,7 @@ function buildManagedAgentToolResultMessage(result, workflowReminder) {
438
455
  'Use a narrower Taskforce read before answering the user.',
439
456
  ].join('\n');
440
457
  }
441
- export async function prepareTaskforceAgentMcpBridge(input) {
458
+ export async function prepareTaskforceAgentMcpBridge(input, dependencies = {}) {
442
459
  if (!input.core)
443
460
  return null;
444
461
  if (input.runtimeMode !== 'cloud') {
@@ -454,7 +471,7 @@ export async function prepareTaskforceAgentMcpBridge(input) {
454
471
  }
455
472
  if (!input.agentProfileId)
456
473
  managedToolNames.delete('complete_workflow_step');
457
- const runtime = createTaskforceMcpServer({
474
+ const runtime = (dependencies.createMcpServer || createTaskforceMcpServer)({
458
475
  core: input.core,
459
476
  workspaceId: input.workspaceId,
460
477
  runtimeMode: input.runtimeMode,
@@ -469,6 +486,7 @@ export async function prepareTaskforceAgentMcpBridge(input) {
469
486
  aiProfileProvider: input.providerKey || 'taskforce_hq',
470
487
  aiProfileModel: input.modelKey || null,
471
488
  aiProfileSurfaceType: 'agent',
489
+ requestId: input.executionRequestId,
472
490
  },
473
491
  });
474
492
  const tools = (await listRuntimeTools(runtime))
@@ -499,7 +517,9 @@ export async function prepareTaskforceAgentMcpBridge(input) {
499
517
  name: effectiveCall.name,
500
518
  arguments: effectiveCall.arguments,
501
519
  },
502
- }, {});
520
+ }, {
521
+ requestId: taskforceAgentMcpRequestId(effectiveCall),
522
+ });
503
523
  const bounded = boundManagedAgentMcpToolResult(effectiveCall.name, extractToolResultText(result));
504
524
  return {
505
525
  name: effectiveCall.name,
@@ -1,4 +1,4 @@
1
- import { getTaskforceAgentModel, isTaskforceAgentModelSource, normalizeTaskforceAgentConnectionScope, normalizeTaskforceAgentModelSource, } from './taskforceAgentModels.js';
1
+ import { getTaskforceAgentModel, isTaskforceAgentModelVisible, isTaskforceAgentModelSource, normalizeTaskforceAgentConnectionScope, normalizeTaskforceAgentModelSource, } from './taskforceAgentModels.js';
2
2
  export const AGENT_DEFINITION_SCHEMA_VERSION = 1;
3
3
  const FIELD_LIMITS = {
4
4
  name: 80,
@@ -305,6 +305,12 @@ export function inspectAgentDefinition(value) {
305
305
  if (value.model.connectionScope !== undefined && !connectionScope) {
306
306
  issue(issues, 'invalid_model_connection_scope', 'model.connectionScope', 'Must be taskforce, workspace, personal, or local_dev when provided.');
307
307
  }
308
+ if (catalogModel && !isTaskforceAgentModelVisible(catalogModel)) {
309
+ issue(issues, 'model_unavailable', 'model.modelKey', 'The selected model is not available in this runtime.');
310
+ }
311
+ if (modelSource === 'subscription_dev' && connectionScope !== 'local_dev') {
312
+ issue(issues, 'invalid_subscription_dev_connection_scope', 'model.connectionScope', 'Subscription-dev models require local_dev connection scope.');
313
+ }
308
314
  const connectionId = readOptionalString(value.model.connectionId, 'model.connectionId', FIELD_LIMITS.referenceId, issues);
309
315
  if (catalogModel && catalogModel.providerKey === providerKey && modelSource === catalogModel.source && MODEL_TIERS.has(value.model.tier)) {
310
316
  model = {
@@ -36,6 +36,7 @@ export declare const DEFAULT_TASKFORCE_AGENT_MODEL_KEY = "anthropic.claude-sonne
36
36
  export declare const TASKFORCE_AGENT_MODEL_SOURCES: TaskforceAgentModelSource[];
37
37
  export declare const TASKFORCE_AGENT_PROVIDER_OPTIONS: TaskforceAgentProviderOption[];
38
38
  export declare const TASKFORCE_AGENT_MODEL_OPTIONS: TaskforceAgentModelOption[];
39
+ export declare function isTaskforceAgentSubscriptionDevModelsEnabled(): boolean;
39
40
  export declare function isTaskforceAgentModelVisible(model: TaskforceAgentModelOption): boolean;
40
41
  export declare function getTaskforceAgentModel(modelKey: unknown): TaskforceAgentModelOption | null;
41
42
  export declare function normalizeTaskforceAgentModelSource(value: unknown, fallback?: TaskforceAgentModelSource): TaskforceAgentModelSource;
@@ -214,6 +214,20 @@ export const TASKFORCE_AGENT_MODEL_OPTIONS = [
214
214
  supportsTemperature: true,
215
215
  defaultMaxTokens: 512,
216
216
  },
217
+ {
218
+ key: 'openai.codex-gpt-5-6-sol',
219
+ providerKey: 'openai',
220
+ label: 'Codex GPT-5.6 Sol',
221
+ source: 'subscription_dev',
222
+ runtime: 'subscription-dev',
223
+ defaultTier: 'advanced',
224
+ runtimeModelId: 'gpt-5.6-sol',
225
+ availability: 'configured',
226
+ visible: true,
227
+ supportsTemperature: false,
228
+ defaultMaxTokens: 1024,
229
+ devOnly: true,
230
+ },
217
231
  {
218
232
  key: 'openai.gpt-5-4',
219
233
  providerKey: 'openai',
@@ -228,8 +242,20 @@ export const TASKFORCE_AGENT_MODEL_OPTIONS = [
228
242
  defaultMaxTokens: 1024,
229
243
  },
230
244
  ];
245
+ function isTruthy(value) {
246
+ const normalized = String(value || '').trim().toLowerCase();
247
+ return normalized === '1' || normalized === 'true' || normalized === 'yes' || normalized === 'on';
248
+ }
249
+ export function isTaskforceAgentSubscriptionDevModelsEnabled() {
250
+ const globals = globalThis;
251
+ return (typeof __TASKFORCE_AGENT_SUBSCRIPTION_DEV_MODELS__ !== 'undefined' && __TASKFORCE_AGENT_SUBSCRIPTION_DEV_MODELS__)
252
+ || isTruthy(globals.__TASKFORCE_AGENT_SUBSCRIPTION_DEV_MODELS__)
253
+ || isTruthy(globals.process?.env?.TASKFORCE_AGENT_SUBSCRIPTION_DEV_MODELS);
254
+ }
231
255
  export function isTaskforceAgentModelVisible(model) {
232
- return model.visible && model.availability !== 'account_unavailable';
256
+ return model.visible
257
+ && model.availability !== 'account_unavailable'
258
+ && (!model.devOnly || isTaskforceAgentSubscriptionDevModelsEnabled());
233
259
  }
234
260
  export function getTaskforceAgentModel(modelKey) {
235
261
  const key = String(modelKey || '').trim();
@@ -292,6 +318,9 @@ export function normalizeTaskforceAgentModelSelection(input) {
292
318
  && !connectionScope) {
293
319
  return null;
294
320
  }
321
+ if (modelSource === 'subscription_dev' && connectionScope !== 'local_dev') {
322
+ return null;
323
+ }
295
324
  const connectionId = String(input.connectionId || '').trim();
296
325
  return {
297
326
  providerKey: model.providerKey,
@@ -1,4 +1,14 @@
1
1
  import { type DatabaseAdapter, type DatabaseStatement } from './databaseAdapter.js';
2
+ import { type PostgresAdapterDeadlineOptions, type PostgresWorkerOperation } from './postgresWorkerProtocol.js';
3
+ export declare class PostgresWorkerOutcomeUnknownError extends Error {
4
+ readonly code = "POSTGRES_WORKER_OUTCOME_UNKNOWN";
5
+ readonly operation: PostgresWorkerOperation;
6
+ constructor(operation: PostgresWorkerOperation, detail?: string);
7
+ }
8
+ export declare class PostgresWorkerUnavailableError extends Error {
9
+ readonly code = "POSTGRES_WORKER_UNAVAILABLE";
10
+ constructor();
11
+ }
2
12
  export declare function replaceQMarkParams(sql: string, params: unknown[]): {
3
13
  text: string;
4
14
  values: unknown[];
@@ -6,13 +16,20 @@ export declare function replaceQMarkParams(sql: string, params: unknown[]): {
6
16
  export declare function translateInsertOrReplace(sql: string): string;
7
17
  export declare class PostgresAdapter implements DatabaseAdapter {
8
18
  readonly provider: "postgres";
9
- readonly open = true;
10
- private readonly worker;
19
+ private worker;
20
+ private readonly connectionString;
21
+ private readonly deadlines;
22
+ private readonly retiringWorkers;
23
+ private consecutiveUnexpectedExits;
24
+ private closed;
11
25
  private readonly encoder;
12
26
  private readonly decoder;
13
27
  private txId;
14
28
  private savepointCounter;
15
- constructor(connectionString?: string);
29
+ constructor(connectionString?: string, deadlineOptions?: PostgresAdapterDeadlineOptions);
30
+ get open(): boolean;
31
+ private createWorker;
32
+ private quarantineWorker;
16
33
  private callWorker;
17
34
  private query;
18
35
  private bindParams;