@taskforcehq/taskforce 0.3.304 → 0.3.306

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 (383) hide show
  1. package/README.md +140 -247
  2. package/dist/Taskforce.module.css +295 -89
  3. package/dist/TaskforceCore.js +378 -111
  4. package/dist/TaskforceCore.test.js +1221 -107
  5. package/dist/assets/fonts/CourierPrime-Bold.woff2 +0 -0
  6. package/dist/assets/fonts/CourierPrime-BoldItalic.woff2 +0 -0
  7. package/dist/assets/fonts/CourierPrime-Italic.woff2 +0 -0
  8. package/dist/assets/fonts/CourierPrime-Regular.woff2 +0 -0
  9. package/dist/assets/fonts/Noir_medium.woff2 +0 -0
  10. package/dist/assets/fonts/Noir_regular.woff2 +0 -0
  11. package/dist/assets/fonts/RussoOne-Regular.woff2 +0 -0
  12. package/dist/assets/fonts/SpecialElite-Regular.woff2 +0 -0
  13. package/dist/compat/workspaceSyncCompat.js +52 -2
  14. package/dist/compat/workspaceSyncCompat.test.js +38 -1
  15. package/dist/components/context/ContextAttachmentManager.d.ts +14 -0
  16. package/dist/components/context/ContextAttachmentManager.js +549 -0
  17. package/dist/components/features/AgentsModule.d.ts +10 -1
  18. package/dist/components/features/AgentsModule.js +260 -15
  19. package/dist/components/features/AgentsModule.test.js +255 -5
  20. package/dist/components/features/DocumentIndex.d.ts +1 -1
  21. package/dist/components/features/DocumentIndex.js +1 -1
  22. package/dist/components/features/DocumentViewer.d.ts +6 -2
  23. package/dist/components/features/DocumentViewer.js +90 -10
  24. package/dist/components/features/DocumentWorkspace.d.ts +5 -22
  25. package/dist/components/features/DocumentWorkspace.js +12 -155
  26. package/dist/components/features/DocumentWorkspace.test.js +226 -6
  27. package/dist/components/features/TaskSettings.js +29 -3
  28. package/dist/components/features/TaskSettings.test.js +42 -1
  29. package/dist/components/features/documentWorkspaceModel.d.ts +24 -0
  30. package/dist/components/features/documentWorkspaceModel.js +57 -0
  31. package/dist/components/features/useDocumentWorkspaceController.d.ts +34 -0
  32. package/dist/components/features/useDocumentWorkspaceController.js +113 -0
  33. package/dist/components/task/TaskCard.js +19 -28
  34. package/dist/components/task/TaskCard.test.js +38 -3
  35. package/dist/components/task/TaskContextUpload.js +4 -526
  36. package/dist/components/task/TaskForm.d.ts +8 -8
  37. package/dist/components/task/TaskForm.js +362 -230
  38. package/dist/components/task/TaskForm.test.js +558 -381
  39. package/dist/components/task/TaskKanban.d.ts +2 -1
  40. package/dist/components/task/TaskKanban.js +96 -14
  41. package/dist/components/task/TaskKanban.test.js +36 -0
  42. package/dist/components/ui/EditableAvatarButton.d.ts +18 -0
  43. package/dist/components/ui/EditableAvatarButton.js +18 -0
  44. package/dist/components/views/PlanComparisonPage.d.ts +9 -1
  45. package/dist/components/views/PlanComparisonPage.js +70 -17
  46. package/dist/components/views/PlanComparisonPage.test.js +289 -41
  47. package/dist/components/views/PlansPage.js +239 -106
  48. package/dist/components/views/PlansPage.test.js +593 -42
  49. package/dist/components/views/StandaloneLayout.js +310 -554
  50. package/dist/components/views/panels/FilterToolbar.test.js +6 -4
  51. package/dist/components/views/panels/PlanningDrawer.d.ts +8 -1
  52. package/dist/components/views/panels/PlanningDrawer.js +18 -11
  53. package/dist/components/views/panels/PlanningDrawer.test.d.ts +1 -0
  54. package/dist/components/views/panels/PlanningDrawer.test.js +141 -0
  55. package/dist/components/views/planningScope.d.ts +20 -0
  56. package/dist/components/views/planningScope.js +25 -0
  57. package/dist/components/views/planningScope.test.d.ts +1 -0
  58. package/dist/components/views/planningScope.test.js +60 -0
  59. package/dist/components/views/standalone/modals/AccountHubModal.d.ts +27 -14
  60. package/dist/components/views/standalone/modals/AccountHubModal.js +87 -15
  61. package/dist/components/views/standalone/modals/AccountHubModal.test.js +42 -2
  62. package/dist/components/views/standalone/modals/AvatarImageManagerModal.d.ts +20 -0
  63. package/dist/components/views/standalone/modals/AvatarImageManagerModal.js +127 -0
  64. package/dist/components/views/standalone/modals/EditProfileModal.d.ts +2 -9
  65. package/dist/components/views/standalone/modals/EditProfileModal.js +3 -2
  66. package/dist/components/views/standalone/modals/SyncEnableWarningModal.d.ts +9 -0
  67. package/dist/components/views/standalone/modals/SyncEnableWarningModal.js +6 -0
  68. package/dist/components/views/standalone/modals/SyncEnableWarningModal.test.d.ts +1 -0
  69. package/dist/components/views/standalone/modals/SyncEnableWarningModal.test.js +24 -0
  70. package/dist/components/views/standalone/modals/SyncStatusModal.d.ts +2 -1
  71. package/dist/components/views/standalone/modals/SyncStatusModal.js +2 -2
  72. package/dist/config/envSchema.js +1 -1
  73. package/dist/core/AiProfileService.d.ts +45 -3
  74. package/dist/core/AiProfileService.js +774 -63
  75. package/dist/core/AiProfileService.test.js +22 -2
  76. package/dist/core/AiProfiles.test.js +761 -2
  77. package/dist/core/AttachmentLinkService.js +57 -15
  78. package/dist/core/AuthIdentityService.d.ts +107 -0
  79. package/dist/core/AuthIdentityService.js +284 -0
  80. package/dist/core/AuthTokenService.d.ts +4 -0
  81. package/dist/core/AuthTokenService.js +34 -6
  82. package/dist/core/AuthTokenService.test.d.ts +1 -0
  83. package/dist/core/AuthTokenService.test.js +78 -0
  84. package/dist/core/EntitlementsPolicy.test.js +77 -15
  85. package/dist/core/GlobalSettingsService.js +115 -6
  86. package/dist/core/PlanEntitlementService.d.ts +30 -3
  87. package/dist/core/PlanEntitlementService.js +454 -93
  88. package/dist/core/PlanFeatureCatalog.test.d.ts +1 -0
  89. package/dist/core/PlanFeatureCatalog.test.js +84 -0
  90. package/dist/core/PlanVersionPolicy.test.js +54 -28
  91. package/dist/core/PlanningEntities.test.js +52 -0
  92. package/dist/core/SignupMonetizationSettings.test.js +241 -44
  93. package/dist/core/SyncReconciliationService.js +2 -65
  94. package/dist/core/SystemAdmin.test.js +244 -88
  95. package/dist/core/TaskAttachmentsCanonical.test.js +51 -1
  96. package/dist/core/TaskTaxonomyValidation.test.js +53 -0
  97. package/dist/core/Taskforce.d.ts +228 -14
  98. package/dist/core/Taskforce.js +814 -201
  99. package/dist/core/Taskforce.listTasksSlim.test.d.ts +1 -0
  100. package/dist/core/Taskforce.listTasksSlim.test.js +91 -0
  101. package/dist/core/UserProfileAvatarDrafts.test.js +30 -3
  102. package/dist/core/WorkspaceLifecycleService.js +0 -5
  103. package/dist/core/WorkspacePermissions.test.js +25 -1
  104. package/dist/core/WorkspacePlanMode.test.js +128 -27
  105. package/dist/core/shared.d.ts +3 -1
  106. package/dist/core/shared.js +16 -1
  107. package/dist/core/types.d.ts +68 -2
  108. package/dist/hooks/auth/useTaskforceAuthBootstrap.js +26 -1
  109. package/dist/hooks/sync/auth.js +3 -1
  110. package/dist/hooks/sync/bootstrap.js +2 -0
  111. package/dist/hooks/sync/controlPlane.d.ts +37 -0
  112. package/dist/hooks/sync/controlPlane.js +78 -0
  113. package/dist/hooks/sync/controlPlane.test.d.ts +1 -0
  114. package/dist/hooks/sync/controlPlane.test.js +121 -0
  115. package/dist/hooks/sync/lifecyclePolicy.d.ts +45 -0
  116. package/dist/hooks/sync/lifecyclePolicy.js +93 -0
  117. package/dist/hooks/sync/lifecyclePolicy.test.d.ts +1 -0
  118. package/dist/hooks/sync/lifecyclePolicy.test.js +124 -0
  119. package/dist/hooks/sync/orchestratorShared.d.ts +10 -1
  120. package/dist/hooks/sync/orchestratorShared.js +68 -47
  121. package/dist/hooks/sync/orchestratorShared.test.js +50 -1
  122. package/dist/hooks/sync/pullLifecycle.d.ts +31 -0
  123. package/dist/hooks/sync/pullLifecycle.js +24 -0
  124. package/dist/hooks/sync/pullLifecycle.test.d.ts +1 -0
  125. package/dist/hooks/sync/pullLifecycle.test.js +80 -0
  126. package/dist/hooks/sync/recovery.d.ts +16 -2
  127. package/dist/hooks/sync/recovery.js +171 -53
  128. package/dist/hooks/sync/recovery.test.d.ts +1 -0
  129. package/dist/hooks/sync/recovery.test.js +292 -0
  130. package/dist/hooks/sync/transfers.d.ts +16 -3
  131. package/dist/hooks/sync/transfers.js +186 -65
  132. package/dist/hooks/sync/transfers.test.d.ts +1 -0
  133. package/dist/hooks/sync/transfers.test.js +396 -0
  134. package/dist/hooks/sync/useRecentSyncEvents.d.ts +21 -0
  135. package/dist/hooks/sync/useRecentSyncEvents.js +92 -0
  136. package/dist/hooks/sync/useRecentSyncEvents.test.d.ts +1 -0
  137. package/dist/hooks/sync/useRecentSyncEvents.test.js +124 -0
  138. package/dist/hooks/sync/useSyncStatusActions.d.ts +30 -0
  139. package/dist/hooks/sync/useSyncStatusActions.js +88 -0
  140. package/dist/hooks/sync/useSyncStatusActions.test.d.ts +1 -0
  141. package/dist/hooks/sync/useSyncStatusActions.test.js +133 -0
  142. package/dist/hooks/sync/useSyncStatusControls.d.ts +25 -0
  143. package/dist/hooks/sync/useSyncStatusControls.js +60 -0
  144. package/dist/hooks/sync/useSyncStatusControls.test.d.ts +1 -0
  145. package/dist/hooks/sync/useSyncStatusControls.test.js +88 -0
  146. package/dist/hooks/useSyncOrchestrator.aiProfiles.test.js +12 -0
  147. package/dist/hooks/useSyncOrchestrator.d.ts +16 -6
  148. package/dist/hooks/useSyncOrchestrator.js +424 -175
  149. package/dist/hooks/useSyncOrchestrator.retry-closure.test.js +487 -10
  150. package/dist/hooks/useTaskData.js +8 -3
  151. package/dist/hooks/useTaskData.test.js +45 -0
  152. package/dist/hooks/useTaskMutations.d.ts +2 -1
  153. package/dist/hooks/useTaskMutations.js +12 -1
  154. package/dist/hooks/useTaskMutations.test.js +30 -1
  155. package/dist/hooks/useTaskforce.d.ts +65 -4
  156. package/dist/hooks/useTaskforce.js +564 -243
  157. package/dist/hooks/useTaskforce.runtime-routing.test.d.ts +1 -0
  158. package/dist/hooks/useTaskforce.runtime-routing.test.js +152 -0
  159. package/dist/hooks/useTaskforce.sync-behavior.test.js +2454 -208
  160. package/dist/hooks/useWorkspaceSyncController.d.ts +4 -1
  161. package/dist/hooks/useWorkspaceSyncController.js +17 -2
  162. package/dist/hooks/useWorkspaceSyncController.test.js +1 -0
  163. package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.d.ts +16 -0
  164. package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.js +316 -35
  165. package/dist/localization/locales/en-US.d.ts +0 -1
  166. package/dist/localization/locales/en-US.js +0 -1
  167. package/dist/localization/locales/es-419.js +0 -1
  168. package/dist/localization/locales/pt-BR.js +0 -1
  169. package/dist/mcp/adminWorkspaceRegistrar.d.ts +2 -0
  170. package/dist/mcp/adminWorkspaceRegistrar.js +154 -0
  171. package/dist/mcp/collaborationRegistrar.d.ts +2 -0
  172. package/dist/mcp/collaborationRegistrar.js +71 -0
  173. package/dist/mcp/documentAssetRegistrar.d.ts +2 -0
  174. package/dist/mcp/documentAssetRegistrar.js +346 -0
  175. package/dist/mcp/runtime.d.ts +2 -0
  176. package/dist/mcp/runtime.js +2433 -3534
  177. package/dist/mcp/runtime.test.js +440 -2
  178. package/dist/mcp/taskPlanningRegistrar.d.ts +2 -0
  179. package/dist/mcp/taskPlanningRegistrar.js +418 -0
  180. package/dist/mcp/toolCatalog.d.ts +35 -0
  181. package/dist/mcp/toolCatalog.js +3 -0
  182. package/dist/migrations/taskSchemaMigrations.d.ts +1 -1
  183. package/dist/migrations/taskSchemaMigrations.js +171 -61
  184. package/dist/migrations/taskSchemaMigrations.test.js +15 -0
  185. package/dist/resources/templates/workflow-sources/workflowDocs.mjs +6 -6
  186. package/dist/resources/templates/workflows/collaborate.yaml +1 -1
  187. package/dist/resources/templates/workflows/evaluate.yaml +2 -2
  188. package/dist/resources/templates/workflows/plan.yaml +1 -1
  189. package/dist/resources/templates/workflows/review.yaml +2 -2
  190. package/dist/server/annotatedAttachmentsRoutes.test.js +3 -3
  191. package/dist/server/auth/providers/apple.d.ts +33 -0
  192. package/dist/server/auth/providers/apple.js +82 -0
  193. package/dist/server/auth/providers/appleClientSecret.d.ts +37 -0
  194. package/dist/server/auth/providers/appleClientSecret.js +65 -0
  195. package/dist/server/auth/providers/github.d.ts +26 -0
  196. package/dist/server/auth/providers/github.js +86 -0
  197. package/dist/server/auth/providers/google.d.ts +21 -0
  198. package/dist/server/auth/providers/google.js +56 -0
  199. package/dist/server/auth/providers/types.d.ts +21 -0
  200. package/dist/server/auth/providers/types.js +1 -0
  201. package/dist/server/auth.d.ts +2 -0
  202. package/dist/server/auth.js +6 -3
  203. package/dist/server/documentReviewRoutes.test.js +36 -3
  204. package/dist/server/index.cookieProxy.test.js +1 -0
  205. package/dist/server/index.d.ts +12 -0
  206. package/dist/server/index.js +120 -9
  207. package/dist/server/index.rateLimit.test.js +3 -0
  208. package/dist/server/index.test.js +106 -3
  209. package/dist/server/routes/admin.d.ts +4 -5
  210. package/dist/server/routes/admin.js +410 -80
  211. package/dist/server/routes/annotatedAttachments.d.ts +1 -1
  212. package/dist/server/routes/annotatedAttachments.js +1 -1
  213. package/dist/server/routes/auth.d.ts +16 -6
  214. package/dist/server/routes/auth.js +1015 -118
  215. package/dist/server/routes/authSupport.d.ts +30 -0
  216. package/dist/server/routes/authSupport.js +81 -0
  217. package/dist/server/routes/billing.d.ts +1 -1
  218. package/dist/server/routes/billing.js +276 -34
  219. package/dist/server/routes/billing.test.js +760 -52
  220. package/dist/server/routes/documentReviews.d.ts +1 -1
  221. package/dist/server/routes/documentReviews.js +1 -1
  222. package/dist/server/routes/documents.d.ts +5 -2
  223. package/dist/server/routes/documents.js +242 -74
  224. package/dist/server/routes/primitives.d.ts +11 -0
  225. package/dist/server/routes/primitives.js +73 -0
  226. package/dist/server/routes/resources.d.ts +1 -1
  227. package/dist/server/routes/resources.js +1 -1
  228. package/dist/server/routes/shared.d.ts +29 -3
  229. package/dist/server/routes/shared.js +69 -4
  230. package/dist/server/routes/sync.d.ts +1 -1
  231. package/dist/server/routes/sync.integration.test.js +437 -39
  232. package/dist/server/routes/sync.js +62 -606
  233. package/dist/server/routes/syncAuxRoutes.d.ts +15 -0
  234. package/dist/server/routes/syncAuxRoutes.js +91 -0
  235. package/dist/server/routes/syncAuxRoutes.test.d.ts +1 -0
  236. package/dist/server/routes/syncAuxRoutes.test.js +158 -0
  237. package/dist/server/routes/syncPullApplyRoutes.d.ts +36 -0
  238. package/dist/server/routes/syncPullApplyRoutes.js +204 -0
  239. package/dist/server/routes/syncPushRoutes.d.ts +24 -0
  240. package/dist/server/routes/syncPushRoutes.js +212 -0
  241. package/dist/server/routes/syncRouteGuards.d.ts +36 -0
  242. package/dist/server/routes/syncRouteGuards.js +67 -0
  243. package/dist/server/routes/syncRouteGuards.test.d.ts +1 -0
  244. package/dist/server/routes/syncRouteGuards.test.js +94 -0
  245. package/dist/server/routes/syncRouteTypes.d.ts +13 -0
  246. package/dist/server/routes/syncRouteTypes.js +1 -0
  247. package/dist/server/routes/syncSnapshotRoutes.d.ts +66 -0
  248. package/dist/server/routes/syncSnapshotRoutes.js +180 -0
  249. package/dist/server/routes/tasks.d.ts +1 -1
  250. package/dist/server/routes/tasks.js +44 -2
  251. package/dist/server/routes/workspaces.d.ts +1 -1
  252. package/dist/server/routes/workspaces.js +37 -6
  253. package/dist/server/routes.d.ts +2 -9
  254. package/dist/server/routes.js +136 -165
  255. package/dist/server/routes.test.js +2457 -162
  256. package/dist/services/workflowExportSnapshots.test.js +2 -0
  257. package/dist/shared/aiProfileSeatScope.d.ts +5 -0
  258. package/dist/shared/aiProfileSeatScope.js +21 -0
  259. package/dist/shared/passwordPolicy.d.ts +13 -0
  260. package/dist/shared/passwordPolicy.js +84 -0
  261. package/dist/shared/passwordPolicy.test.d.ts +1 -0
  262. package/dist/shared/passwordPolicy.test.js +34 -0
  263. package/dist/storage/workspaceAssetStore.d.ts +15 -3
  264. package/dist/storage/workspaceAssetStore.js +132 -44
  265. package/dist/storage/workspaceAssetStore.test.js +93 -6
  266. package/dist/styles/fonts.css +70 -0
  267. package/dist/sync/collaborationSyncPayload.d.ts +6 -1
  268. package/dist/sync/collaborationSyncPayload.js +17 -11
  269. package/dist/sync/collaborationSyncPayload.test.js +13 -1
  270. package/dist/sync/contentSyncState.d.ts +4 -8
  271. package/dist/sync/contentSyncState.js +33 -77
  272. package/dist/sync/syncApplyHandlers.d.ts +7 -0
  273. package/dist/sync/syncApplyHandlers.js +28 -13
  274. package/dist/sync/syncApplyHandlers.test.js +72 -3
  275. package/dist/sync/syncFieldSemantics.d.ts +12 -0
  276. package/dist/sync/syncFieldSemantics.js +55 -0
  277. package/dist/sync/syncResourceAdapters.d.ts +44 -0
  278. package/dist/sync/syncResourceAdapters.js +77 -0
  279. package/dist/sync/syncService.d.ts +6 -0
  280. package/dist/sync/syncService.js +60 -0
  281. package/dist/sync/syncService.test.js +71 -3
  282. package/dist/sync/taskSyncChangeKey.d.ts +2 -0
  283. package/dist/sync/taskSyncChangeKey.js +143 -0
  284. package/dist/sync/taskSyncPayload.js +3 -8
  285. package/dist/sync/workspacePullFeed.js +4 -3
  286. package/dist/sync/workspacePullFeed.test.js +43 -0
  287. package/dist/sync/workspaceRepair.js +5 -2
  288. package/dist/sync/workspaceSyncModel.d.ts +48 -0
  289. package/dist/sync/workspaceSyncModel.js +195 -31
  290. package/dist/sync/workspaceSyncModel.test.js +325 -12
  291. package/dist/sync/workspaceSyncState.d.ts +19 -0
  292. package/dist/sync/workspaceSyncState.js +3 -1
  293. package/dist/sync/workspaceSyncSurface.js +3 -8
  294. package/dist/types.d.ts +17 -0
  295. package/dist/ui/assets/AgentsModule-DrLawwNl.js +1 -0
  296. package/dist/ui/assets/{AnnotatedAttachmentWorkspace-BlS-cqnl.js → AnnotatedAttachmentWorkspace-Z9_whf7F.js} +1 -1
  297. package/dist/ui/assets/CourierPrime-Bold-BuLj_dpw.woff2 +0 -0
  298. package/dist/ui/assets/CourierPrime-BoldItalic-BrK2pUkZ.woff2 +0 -0
  299. package/dist/ui/assets/CourierPrime-Italic-DFUZK5Ey.woff2 +0 -0
  300. package/dist/ui/assets/CourierPrime-Regular-BsKphzVf.woff2 +0 -0
  301. package/dist/ui/assets/DocumentWorkspace-B03MaSkw.js +252 -0
  302. package/dist/ui/assets/DocumentWorkspace-Dhdso07p.css +1 -0
  303. package/dist/ui/assets/{InitiativesModule-BjR6iBf9.js → InitiativesModule-9E6ParrY.js} +1 -1
  304. package/dist/ui/assets/Noir_medium-bxQwKGzB.woff2 +0 -0
  305. package/dist/ui/assets/Noir_regular-ojf2kxlG.woff2 +0 -0
  306. package/dist/ui/assets/PlansPage-CvfnMiWq.css +1 -0
  307. package/dist/ui/assets/PlansPage-DRXscYxH.js +1 -0
  308. package/dist/ui/assets/RussoOne-Regular-Cu_qq_qC.woff2 +0 -0
  309. package/dist/ui/assets/SpecialElite-Regular-Di6gSvAS.woff2 +0 -0
  310. package/dist/ui/assets/TaskSettings-DZX4jk7e.js +9 -0
  311. package/dist/ui/assets/{WorkflowsModule-DnFqdUME.js → WorkflowsModule-BA7jcEpH.js} +1 -1
  312. package/dist/ui/assets/index-9eT8e0Lu.css +1 -0
  313. package/dist/ui/assets/index-C6k75jr8.js +6 -0
  314. package/dist/ui/assets/{vendor-icons-I7ZwG1z_.js → vendor-icons-DuEd_65c.js} +1 -1
  315. package/dist/ui/fonts/CourierPrime-Bold.ttf +0 -0
  316. package/dist/ui/fonts/CourierPrime-Bold.woff2 +0 -0
  317. package/dist/ui/fonts/CourierPrime-BoldItalic.ttf +0 -0
  318. package/dist/ui/fonts/CourierPrime-BoldItalic.woff2 +0 -0
  319. package/dist/ui/fonts/CourierPrime-Italic.ttf +0 -0
  320. package/dist/ui/fonts/CourierPrime-Italic.woff2 +0 -0
  321. package/dist/ui/fonts/CourierPrime-Regular.ttf +0 -0
  322. package/dist/ui/fonts/CourierPrime-Regular.woff2 +0 -0
  323. package/dist/ui/fonts/Noir_medium.otf +0 -0
  324. package/dist/ui/fonts/Noir_medium.woff2 +0 -0
  325. package/dist/ui/fonts/Noir_regular.otf +0 -0
  326. package/dist/ui/fonts/Noir_regular.woff2 +0 -0
  327. package/dist/ui/fonts/RussoOne-Regular.woff2 +0 -0
  328. package/dist/ui/fonts/SpecialElite-Regular.ttf +0 -0
  329. package/dist/ui/fonts/SpecialElite-Regular.woff2 +0 -0
  330. package/dist/ui/index.html +3 -3
  331. package/dist/utils/accountProfileSummaryCache.d.ts +5 -0
  332. package/dist/utils/assignees.d.ts +2 -0
  333. package/dist/utils/assignees.js +2 -0
  334. package/dist/utils/avatarUpload.d.ts +27 -0
  335. package/dist/utils/avatarUpload.js +132 -0
  336. package/dist/utils/avatarUpload.test.d.ts +1 -0
  337. package/dist/utils/avatarUpload.test.js +40 -0
  338. package/dist/utils/bootstrapTrace.d.ts +7 -0
  339. package/dist/utils/bootstrapTrace.js +29 -0
  340. package/dist/utils/commercialLifecyclePresentation.d.ts +19 -0
  341. package/dist/utils/commercialLifecyclePresentation.js +199 -0
  342. package/dist/utils/contextAssetEvents.d.ts +2 -0
  343. package/dist/utils/syncEventDetails.d.ts +3 -0
  344. package/dist/utils/syncEventDetails.js +64 -0
  345. package/dist/utils/syncEventDetails.test.d.ts +1 -0
  346. package/dist/utils/syncEventDetails.test.js +23 -0
  347. package/dist/utils/syncEventPresentation.d.ts +15 -0
  348. package/dist/utils/syncEventPresentation.js +129 -0
  349. package/dist/utils/syncEventPresentation.test.d.ts +1 -0
  350. package/dist/utils/syncEventPresentation.test.js +64 -0
  351. package/dist/utils/syncStatusPresentation.d.ts +72 -0
  352. package/dist/utils/syncStatusPresentation.js +217 -0
  353. package/dist/utils/syncStatusPresentation.test.d.ts +1 -0
  354. package/dist/utils/syncStatusPresentation.test.js +164 -0
  355. package/dist/utils/taskActivity.d.ts +2 -0
  356. package/dist/utils/taskActivity.js +228 -22
  357. package/dist/utils/taskActivity.test.js +119 -8
  358. package/dist/utils/workspaceSyncPresentation.d.ts +4 -0
  359. package/dist/utils/workspaceSyncPresentation.js +68 -2
  360. package/dist/utils/workspaceSyncPresentation.test.js +36 -1
  361. package/package.json +10 -2
  362. package/scripts/check-cloud-mcp.mjs +83 -0
  363. package/scripts/export-sqlite-to-postgres.mjs +7 -9
  364. package/scripts/playwright-auth.sh +5 -1
  365. package/scripts/run-billing-performance-smoke.sh +24 -0
  366. package/scripts/run-e2e-realtime.sh +17 -3
  367. package/scripts/run-smoke.sh +17 -5
  368. package/scripts/run-soak.sh +17 -5
  369. package/src/resources/templates/workflow-sources/workflowDocs.mjs +6 -6
  370. package/src/resources/templates/workflows/collaborate.yaml +1 -1
  371. package/src/resources/templates/workflows/evaluate.yaml +2 -2
  372. package/src/resources/templates/workflows/plan.yaml +1 -1
  373. package/src/resources/templates/workflows/review.yaml +2 -2
  374. package/dist/ui/assets/AgentsModule-BLWVbuKP.js +0 -1
  375. package/dist/ui/assets/DocumentWorkspace-BH_6DF6x.js +0 -250
  376. package/dist/ui/assets/DocumentWorkspace-C_8T8oz-.css +0 -1
  377. package/dist/ui/assets/PlansPage-C2dd2n1X.css +0 -1
  378. package/dist/ui/assets/PlansPage-CSDQ4sLa.js +0 -1
  379. package/dist/ui/assets/RussoOne-Regular-C3BxZIj7.ttf +0 -0
  380. package/dist/ui/assets/TaskSettings-CEDy34Jo.js +0 -9
  381. package/dist/ui/assets/index-DXUdtH1B.js +0 -6
  382. package/dist/ui/assets/index-Ii0B0rTO.css +0 -1
  383. package/scripts/migrate-planning-model.ts +0 -233
@@ -0,0 +1,154 @@
1
+ import { bindDomainTool } from './toolCatalog.js';
2
+ function stringProperty(description, enumValues) {
3
+ return enumValues ? { type: 'string', description, enum: enumValues } : { type: 'string', description };
4
+ }
5
+ function numberProperty(description) {
6
+ return { type: 'number', description };
7
+ }
8
+ function booleanProperty(description) {
9
+ return { type: 'boolean', description };
10
+ }
11
+ function arrayProperty(description, items) {
12
+ return { type: 'array', description, items };
13
+ }
14
+ export function registerAdminWorkspaceTools(registerTool, executeTool) {
15
+ const register = (name, buildDescriptor) => {
16
+ registerTool({
17
+ name,
18
+ buildDescriptor: (context) => {
19
+ const descriptor = buildDescriptor(context);
20
+ return {
21
+ name,
22
+ description: descriptor.description,
23
+ inputSchema: {
24
+ type: 'object',
25
+ properties: descriptor.inputSchema.properties,
26
+ ...(descriptor.inputSchema.required ? { required: descriptor.inputSchema.required } : {}),
27
+ },
28
+ };
29
+ },
30
+ handler: bindDomainTool(executeTool, name),
31
+ });
32
+ };
33
+ register('get_config', (context) => ({
34
+ description: context.describeTool('Get the active workspace taxonomy and planning configuration. Call this at the start of a session or before create_task/update_task when you need valid category, type, priority, approach, status, or complexity values.'),
35
+ inputSchema: { properties: {} },
36
+ }));
37
+ register('update_categories', (context) => ({
38
+ description: context.describeTool('Replace the workspace category taxonomy. This is session-only and updates the active categories used by task fields and validation.'),
39
+ inputSchema: {
40
+ properties: {
41
+ categories: arrayProperty('Ordered category definitions to save.', {
42
+ type: 'object',
43
+ properties: {
44
+ value: { type: 'string' },
45
+ label: { type: 'string' },
46
+ aliases: { type: 'array', items: { type: 'string' } },
47
+ },
48
+ }),
49
+ },
50
+ required: ['categories'],
51
+ },
52
+ }));
53
+ register('update_types', (context) => ({
54
+ description: context.describeTool('Replace the workspace task type taxonomy. This is session-only and updates the active task type definitions used by validation and task editing flows.'),
55
+ inputSchema: {
56
+ properties: {
57
+ types: arrayProperty('Ordered task type definitions to save.', {
58
+ type: 'object',
59
+ properties: {
60
+ value: { type: 'string' },
61
+ label: { type: 'string' },
62
+ aliases: { type: 'array', items: { type: 'string' } },
63
+ },
64
+ }),
65
+ },
66
+ required: ['types'],
67
+ },
68
+ }));
69
+ register('bulk_update_type', (context) => ({
70
+ description: context.describeTool('Bulk-update tasks from one task type to another. Use get_config first to confirm the current valid type values.'),
71
+ inputSchema: {
72
+ properties: {
73
+ fromType: stringProperty('Current task type value to replace.', context.typeEnum),
74
+ toType: stringProperty('Replacement task type value.', context.typeEnum),
75
+ },
76
+ required: ['fromType', 'toType'],
77
+ },
78
+ }));
79
+ register('bulk_update_fields', (context) => ({
80
+ description: context.describeTool('Apply field updates to multiple tasks in one request. Use get_config first to confirm valid taxonomy values before calling this tool.'),
81
+ inputSchema: {
82
+ properties: {
83
+ updates: arrayProperty('List of per-task field updates.', {
84
+ type: 'object',
85
+ properties: {
86
+ id: { type: 'string', description: 'Task ID or task reference such as T-123.' },
87
+ title: { type: 'string' },
88
+ description: { type: 'string' },
89
+ category: { type: 'string' },
90
+ type: { type: 'string' },
91
+ priority: { type: 'number', description: context.priorityDesc },
92
+ approach: { type: 'string', enum: context.approachEnum },
93
+ assignee: { type: 'string', description: `${context.assigneeHint} Call list_assignees to inspect the current eligible IDs.` },
94
+ owner: { type: 'string', description: `${context.assigneeHint} Alias for assignee.` },
95
+ status: { type: 'string', enum: ['task', 'on-hold', 'in-progress', 'review', 'done', 'cancelled'] },
96
+ complexity: { type: 'number', description: context.complexityDesc },
97
+ },
98
+ required: ['id'],
99
+ }),
100
+ },
101
+ required: ['updates'],
102
+ },
103
+ }));
104
+ register('export_resources', (context) => ({
105
+ description: context.describeTool('Export Taskforce resources to files on disk. Local-only utility for generating external artifacts from workspace data.'),
106
+ inputSchema: {
107
+ properties: {
108
+ type: stringProperty('Resource export type.'),
109
+ path: stringProperty('Destination path for the export output.'),
110
+ variables: { type: 'object', description: 'Optional template variables for the export job.' },
111
+ environment: stringProperty('Optional environment name to include in the export context.'),
112
+ },
113
+ required: ['type', 'path'],
114
+ },
115
+ }));
116
+ register('get_paths', (context) => ({
117
+ description: context.describeTool('Get project and Taskforce storage paths. Local-only utility for discovering the project root, Taskforce data root, and related filesystem locations.'),
118
+ inputSchema: { properties: {} },
119
+ }));
120
+ register('update_priorities', (context) => ({
121
+ description: context.describeTool('Replace the workspace priority options. This is session-only and updates the valid priority taxonomy used by task editing flows.'),
122
+ inputSchema: {
123
+ properties: {
124
+ priorities: arrayProperty('Ordered priority definitions to save.', {
125
+ type: 'object',
126
+ properties: {
127
+ value: { type: 'number' },
128
+ label: { type: 'string' },
129
+ },
130
+ }),
131
+ },
132
+ required: ['priorities'],
133
+ },
134
+ }));
135
+ register('update_approaches', (context) => ({
136
+ description: context.describeTool('Replace the active approach options. This is session-only and updates the valid approach taxonomy used by task editing flows.'),
137
+ inputSchema: {
138
+ properties: {
139
+ approaches: arrayProperty('Ordered approach definitions to save.', {
140
+ type: 'object',
141
+ properties: {
142
+ value: { type: 'string' },
143
+ label: { type: 'string' },
144
+ },
145
+ }),
146
+ },
147
+ required: ['approaches'],
148
+ },
149
+ }));
150
+ register('get_stats', (context) => ({
151
+ description: context.describeTool('Get task counts by status and priority for situational awareness. Call this at the start of a session to understand the current workload before listing or modifying tasks. Returns active totals (by status and priority) and archived totals.'),
152
+ inputSchema: { properties: {} },
153
+ }));
154
+ }
@@ -0,0 +1,2 @@
1
+ import type { DomainToolExecutor, RegisterMcpTool } from './toolCatalog.js';
2
+ export declare function registerCollaborationTools(registerTool: RegisterMcpTool, executeTool: DomainToolExecutor): void;
@@ -0,0 +1,71 @@
1
+ import { AI_PROFILE_SURFACE_TYPES } from '../shared/aiProfileSurfaceType.js';
2
+ import { bindDomainTool } from './toolCatalog.js';
3
+ function stringProperty(description) {
4
+ return { type: 'string', description };
5
+ }
6
+ export function registerCollaborationTools(registerTool, executeTool) {
7
+ const register = (name, buildDescriptor) => {
8
+ registerTool({
9
+ name,
10
+ buildDescriptor: (context) => {
11
+ const descriptor = buildDescriptor(context);
12
+ return {
13
+ name,
14
+ description: descriptor.description,
15
+ inputSchema: {
16
+ type: 'object',
17
+ properties: descriptor.inputSchema.properties,
18
+ ...(descriptor.inputSchema.required ? { required: descriptor.inputSchema.required } : {}),
19
+ },
20
+ };
21
+ },
22
+ handler: bindDomainTool(executeTool, name),
23
+ });
24
+ };
25
+ register('list_assignees', (context) => ({
26
+ description: context.describeTool('List eligible assignees for the active workspace. Returns human workspace members and AI profiles that can own tasks. Use this before create_task, update_task, assign_task, or bulk_assign_tasks when you need a valid assignee ID.'),
27
+ inputSchema: { properties: {} },
28
+ }));
29
+ register('get_current_profile', (context) => ({
30
+ description: context.describeTool('Inspect the effective AI profile for this session. Use this when an agent needs to know its current profile id before filtering for tasks assigned to itself. If no profile is currently bound, this tool explains how to bootstrap with resolve_profile. You may also pass profileToken to inspect a stateless AI profile without mutating session state. The response includes the profileToken so automations can persist it after first bootstrap.'),
31
+ inputSchema: {
32
+ properties: {
33
+ profileToken: stringProperty('Optional AI profile token to inspect when no profile is currently bound in session state.'),
34
+ },
35
+ },
36
+ }));
37
+ register('resolve_profile', (context) => ({
38
+ description: context.describeTool('Resolve or create the current AI collaborator profile for this workspace. On first bootstrap, omit profileToken and Taskforce will create a named AI profile, issue a stable profileToken, and return the profile id to use in assignee, createdBy, and comment author fields on later calls. When a valid profileToken is provided, Taskforce resolves the existing profile and updates any supplied presentation fields such as name, icon, color, description, role, provider, model, and surfaceType. Update semantics: omitted optional fields leave existing stored values unchanged. For description, role, provider, and model, empty strings are ignored rather than clearing. For surfaceType, null or an empty string clears the stored value; valid enum values replace it.'),
39
+ inputSchema: {
40
+ properties: {
41
+ name: stringProperty('Display name for the AI collaborator.'),
42
+ icon: stringProperty('Optional icon name or emoji saved with the AI profile. Omit to leave unchanged when profileToken is provided.'),
43
+ color: stringProperty('Optional profile color saved with the AI profile. Omit to leave unchanged when profileToken is provided.'),
44
+ description: stringProperty('Optional short description stored on the AI profile. Omit to leave unchanged when profileToken is provided.'),
45
+ role: stringProperty('Optional role label stored on the AI profile. Omit to leave unchanged when profileToken is provided.'),
46
+ provider: stringProperty('Optional provider name stored as secondary diagnostic metadata on the AI profile. Omit to leave unchanged when profileToken is provided.'),
47
+ model: stringProperty('Optional model name stored as secondary diagnostic metadata on the AI profile. Omit to leave unchanged when profileToken is provided.'),
48
+ surfaceType: {
49
+ anyOf: [
50
+ { type: 'string', enum: [...AI_PROFILE_SURFACE_TYPES] },
51
+ { type: 'null' },
52
+ ],
53
+ description: 'Optional self-declared AI surface type. Use agent for a persistent named AI collaborator in Taskforce, coding_tool for the coding surface or terminal tool itself, chat_app for a conversational app identity, ide for an IDE-native copilot identity, and other only when none of those fit. If you are unsure and you are registering a named collaborator such as a teammate-style AI persona, choose agent. Omit to leave unchanged; pass null or an empty string to clear.',
54
+ },
55
+ profileToken: stringProperty('Previously issued Taskforce profile token. When provided, Taskforce resolves the existing profile instead of creating a new one, and applies any supplied presentation field updates to that profile.'),
56
+ },
57
+ required: ['name'],
58
+ },
59
+ }));
60
+ register('add_comment', (context) => ({
61
+ description: context.describeTool('Add a comment to a task. Use this for agent progress notes, handoff summaries, decision logs, and audit trails. Comments are visible in the task timeline.'),
62
+ inputSchema: {
63
+ properties: {
64
+ id: stringProperty('Task ID or task reference such as T-123.'),
65
+ text: stringProperty('Comment text.'),
66
+ author: stringProperty('Comment author identity. Use your AI profile id from resolve_profile, or use user for human-authored comments.'),
67
+ },
68
+ required: ['id', 'text', 'author'],
69
+ },
70
+ }));
71
+ }
@@ -0,0 +1,2 @@
1
+ import type { DomainToolExecutor, RegisterMcpTool } from './toolCatalog.js';
2
+ export declare function registerDocumentAssetTools(registerTool: RegisterMcpTool, executeTool: DomainToolExecutor): void;
@@ -0,0 +1,346 @@
1
+ import { bindDomainTool } from './toolCatalog.js';
2
+ function stringProperty(description, enumValues) {
3
+ return enumValues ? { type: 'string', description, enum: enumValues } : { type: 'string', description };
4
+ }
5
+ function numberProperty(description) {
6
+ return { type: 'number', description };
7
+ }
8
+ function booleanProperty(description) {
9
+ return { type: 'boolean', description };
10
+ }
11
+ function arrayProperty(description, items) {
12
+ return { type: 'array', description, items };
13
+ }
14
+ export function registerDocumentAssetTools(registerTool, executeTool) {
15
+ const register = (name, buildDescriptor) => {
16
+ registerTool({
17
+ name,
18
+ buildDescriptor: (context) => {
19
+ const descriptor = buildDescriptor(context);
20
+ return {
21
+ name,
22
+ description: descriptor.description,
23
+ inputSchema: {
24
+ type: 'object',
25
+ properties: descriptor.inputSchema.properties,
26
+ ...(descriptor.inputSchema.required ? { required: descriptor.inputSchema.required } : {}),
27
+ },
28
+ };
29
+ },
30
+ handler: bindDomainTool(executeTool, name),
31
+ });
32
+ };
33
+ register('get_task_attachments', (context) => ({
34
+ description: context.describeTool('List attachment descriptors for one task. This returns metadata only; use read_task_attachment for file contents. For canonical documents, prefer get_document and read_document_content for the document-focused workflow.'),
35
+ inputSchema: {
36
+ properties: {
37
+ taskId: stringProperty('Task ID or task reference such as T-123.'),
38
+ },
39
+ required: ['taskId'],
40
+ },
41
+ }));
42
+ register('read_task_attachment', (context) => ({
43
+ description: context.describeTool('Read one task attachment by attachmentId. Prefer this tool over opening attachment path URLs directly. For a canonical document attachment, this response also points toward the document-specific workflow.'),
44
+ inputSchema: {
45
+ properties: {
46
+ taskId: stringProperty('Task ID or task reference such as T-123.'),
47
+ attachmentId: stringProperty('Attachment descriptor id from get_task_attachments.'),
48
+ maxChars: numberProperty('Optional max inline character count for readable text attachments.'),
49
+ },
50
+ required: ['taskId', 'attachmentId'],
51
+ },
52
+ }));
53
+ register('search_images', (context) => ({
54
+ description: context.describeTool('Search image assets by keyword, title, filename, caption, or I-123 reference. Use this before get_image when you only know a rough identifier.'),
55
+ inputSchema: {
56
+ properties: {
57
+ query: stringProperty('Search term for image lookup, including I-123 references.'),
58
+ limit: numberProperty('Max images to return.'),
59
+ },
60
+ required: ['query'],
61
+ },
62
+ }));
63
+ register('get_image', (context) => ({
64
+ description: context.describeTool('Get a single image by asset id or image reference such as I-123. Use this first when the user references an image, then use get_annotated_attachment_sessions and read_annotated_attachment_payload for annotation details. When the image is being used for UI, placement, or visual correction feedback, read the saved annotation payload before making changes.'),
65
+ inputSchema: {
66
+ properties: {
67
+ id: stringProperty('Image asset id or image reference such as I-123.'),
68
+ },
69
+ required: ['id'],
70
+ },
71
+ }));
72
+ register('search_documents', (context) => ({
73
+ description: context.describeTool('Search document assets by keyword, title, filename, caption, or D-123 reference. Use this before get_document when you only know a rough identifier. Search results guide the next step into get_document and read_document_content.'),
74
+ inputSchema: {
75
+ properties: {
76
+ query: stringProperty('Search term for document lookup, including D-123 references.'),
77
+ limit: numberProperty('Max documents to return.'),
78
+ },
79
+ required: ['query'],
80
+ },
81
+ }));
82
+ register('get_document', (context) => ({
83
+ description: context.describeTool('Get a single canonical document by asset id or document reference such as D-123. Use this first when the user references a document, then call read_document_content to inspect what it is reviewing.'),
84
+ inputSchema: {
85
+ properties: {
86
+ id: stringProperty('Document asset id or document reference such as D-123.'),
87
+ },
88
+ required: ['id'],
89
+ },
90
+ }));
91
+ register('read_document_content', (context) => ({
92
+ description: context.describeTool('Read the canonical document body for one document. Use this when an AI needs to inspect what it is reviewing before adding review comments.'),
93
+ inputSchema: {
94
+ properties: {
95
+ documentId: stringProperty('Document asset id or document reference such as D-123.'),
96
+ maxChars: numberProperty('Optional max inline character count for readable documents.'),
97
+ },
98
+ required: ['documentId'],
99
+ },
100
+ }));
101
+ register('get_annotated_attachment_sessions', (context) => ({
102
+ description: context.describeTool('List saved annotation sessions for one image. Use this after get_image when you need the saved annotation sessions before opening one payload. If the user is pointing at a visual target in I-123, do not stop at the screenshot alone; inspect the saved session payload next.'),
103
+ inputSchema: {
104
+ properties: {
105
+ imageId: stringProperty('Image asset id or image reference such as I-123.'),
106
+ },
107
+ required: ['imageId'],
108
+ },
109
+ }));
110
+ register('read_annotated_attachment_payload', (context) => ({
111
+ description: context.describeTool('Read the structured payload for one annotated attachment session, including markers, geometry, and derived crop hints. Use this as the authoritative instruction source when I-123 is being used for UI placement or visual change requests.'),
112
+ inputSchema: {
113
+ properties: {
114
+ sessionId: stringProperty('Annotated attachment session id.'),
115
+ },
116
+ required: ['sessionId'],
117
+ },
118
+ }));
119
+ register('create_annotated_attachment_session', (context) => ({
120
+ description: context.describeTool('Create a new annotation session for one image. Use this before adding markers when no saved session exists yet.'),
121
+ inputSchema: {
122
+ properties: {
123
+ imageId: stringProperty('Image asset id or image reference such as I-123.'),
124
+ title: stringProperty('Optional session title.'),
125
+ },
126
+ required: ['imageId'],
127
+ },
128
+ }));
129
+ register('update_annotated_attachment_session', (context) => ({
130
+ description: context.describeTool('Update an existing annotation session without changing its marker list directly.'),
131
+ inputSchema: {
132
+ properties: {
133
+ sessionId: stringProperty('Annotated attachment session id.'),
134
+ title: stringProperty('Updated session title.'),
135
+ },
136
+ required: ['sessionId'],
137
+ },
138
+ }));
139
+ register('delete_annotated_attachment_session', (context) => ({
140
+ description: context.describeTool('Delete an annotated attachment session when the whole session was created by mistake, rather than deleting markers one by one.'),
141
+ inputSchema: {
142
+ properties: {
143
+ sessionId: stringProperty('Annotated attachment session id.'),
144
+ },
145
+ required: ['sessionId'],
146
+ },
147
+ }));
148
+ register('review_image', (context) => ({
149
+ description: context.describeTool('Run a first-pass visual review workflow for one image and save the result into an annotation session when appropriate.'),
150
+ inputSchema: {
151
+ properties: {
152
+ imageId: stringProperty('Image asset id or image reference such as I-123.'),
153
+ prompt: stringProperty('Review instructions or focus areas for the first-pass review.'),
154
+ },
155
+ required: ['imageId', 'prompt'],
156
+ },
157
+ }));
158
+ register('add_annotated_attachment_marker', (context) => ({
159
+ description: context.describeTool('Add one marker to an annotation session using normalized 0..1 coordinates.'),
160
+ inputSchema: {
161
+ properties: {
162
+ sessionId: stringProperty('Annotated attachment session id.'),
163
+ type: stringProperty('Marker type.'),
164
+ x: numberProperty('Normalized x coordinate in the 0..1 range.'),
165
+ y: numberProperty('Normalized y coordinate in the 0..1 range.'),
166
+ width: numberProperty('Optional normalized width in the 0..1 range.'),
167
+ height: numberProperty('Optional normalized height in the 0..1 range.'),
168
+ text: stringProperty('Optional marker text or note.'),
169
+ },
170
+ required: ['sessionId', 'type', 'x', 'y'],
171
+ },
172
+ }));
173
+ register('bulk_add_annotated_attachment_markers', (context) => ({
174
+ description: context.describeTool('Add multiple markers to one annotation session in a single request. Useful for batch import after a first-pass review.'),
175
+ inputSchema: {
176
+ properties: {
177
+ sessionId: stringProperty('Annotated attachment session id.'),
178
+ markers: arrayProperty('Marker definitions to add.', {
179
+ type: 'object',
180
+ properties: {
181
+ type: { type: 'string' },
182
+ x: { type: 'number' },
183
+ y: { type: 'number' },
184
+ width: { type: 'number' },
185
+ height: { type: 'number' },
186
+ text: { type: 'string' },
187
+ },
188
+ required: ['type', 'x', 'y'],
189
+ }),
190
+ },
191
+ required: ['sessionId', 'markers'],
192
+ },
193
+ }));
194
+ register('update_annotated_attachment_marker', (context) => ({
195
+ description: context.describeTool('Update one existing annotation marker without recreating it.'),
196
+ inputSchema: {
197
+ properties: {
198
+ sessionId: stringProperty('Annotated attachment session id.'),
199
+ markerId: stringProperty('Marker id within the session.'),
200
+ type: stringProperty('Updated marker type.'),
201
+ x: numberProperty('Updated normalized x coordinate.'),
202
+ y: numberProperty('Updated normalized y coordinate.'),
203
+ width: numberProperty('Updated normalized width.'),
204
+ height: numberProperty('Updated normalized height.'),
205
+ text: stringProperty('Updated marker text.'),
206
+ },
207
+ required: ['sessionId', 'markerId'],
208
+ },
209
+ }));
210
+ register('reorder_annotated_attachment_marker', (context) => ({
211
+ description: context.describeTool('Move one marker within the session review order.'),
212
+ inputSchema: {
213
+ properties: {
214
+ sessionId: stringProperty('Annotated attachment session id.'),
215
+ markerId: stringProperty('Marker id within the session.'),
216
+ order: numberProperty('Target zero-based review order.'),
217
+ },
218
+ required: ['sessionId', 'markerId', 'order'],
219
+ },
220
+ }));
221
+ register('delete_annotated_attachment_marker', (context) => ({
222
+ description: context.describeTool('Delete one marker from an annotation session.'),
223
+ inputSchema: {
224
+ properties: {
225
+ sessionId: stringProperty('Annotated attachment session id.'),
226
+ markerId: stringProperty('Marker id within the session.'),
227
+ },
228
+ required: ['sessionId', 'markerId'],
229
+ },
230
+ }));
231
+ register('get_document_review_sessions', (context) => ({
232
+ description: context.describeTool('List review sessions for one document such as D-123. Use read_document_content first when you need to inspect the document body before choosing a session.'),
233
+ inputSchema: {
234
+ properties: {
235
+ documentId: stringProperty('Document asset id or document reference such as D-123.'),
236
+ },
237
+ required: ['documentId'],
238
+ },
239
+ }));
240
+ register('get_document_review_session', (context) => ({
241
+ description: context.describeTool('Get one document review session with its comments and summary state.'),
242
+ inputSchema: {
243
+ properties: {
244
+ sessionId: stringProperty('Document review session id.'),
245
+ },
246
+ required: ['sessionId'],
247
+ },
248
+ }));
249
+ register('create_document_review_session', (context) => ({
250
+ description: context.describeTool('Create a new document review session. Requires AI identity via resolve_profile before write operations.'),
251
+ inputSchema: {
252
+ properties: {
253
+ documentId: stringProperty('Document asset id or document reference such as D-123.'),
254
+ title: stringProperty('Optional review session title.'),
255
+ },
256
+ required: ['documentId'],
257
+ },
258
+ }));
259
+ register('update_document_review_session', (context) => ({
260
+ description: context.describeTool('Update a document review session title, status, or summary fields without creating a new session. Requires AI identity via resolve_profile before write operations.'),
261
+ inputSchema: {
262
+ properties: {
263
+ sessionId: stringProperty('Document review session id.'),
264
+ title: stringProperty('Updated review session title.'),
265
+ status: stringProperty('Updated review status.'),
266
+ summary: stringProperty('Updated review summary.'),
267
+ },
268
+ required: ['sessionId'],
269
+ },
270
+ }));
271
+ register('review_document', (context) => ({
272
+ description: context.describeTool('Run the lower-friction document review path for one document. This helper creates or updates the review workflow while preserving a lower-friction document review path than manual session management. Requires AI identity via resolve_profile before write operations.'),
273
+ inputSchema: {
274
+ properties: {
275
+ documentId: stringProperty('Document asset id or document reference such as D-123.'),
276
+ prompt: stringProperty('Review instructions or focus areas.'),
277
+ },
278
+ required: ['documentId', 'prompt'],
279
+ },
280
+ }));
281
+ register('add_document_review_comment', (context) => ({
282
+ description: context.describeTool('Add a comment to a document review session. Use this for review feedback that should stay attached to the document rather than the task. Requires AI identity via resolve_profile before write operations.'),
283
+ inputSchema: {
284
+ properties: {
285
+ sessionId: stringProperty('Document review session id.'),
286
+ body: stringProperty('Comment text.'),
287
+ anchor: { type: 'object', description: 'Optional anchor object such as a quote or line-range reference.' },
288
+ },
289
+ required: ['sessionId', 'body'],
290
+ },
291
+ }));
292
+ register('update_document_review_comment', (context) => ({
293
+ description: context.describeTool('Update an existing document review comment without creating a new comment.'),
294
+ inputSchema: {
295
+ properties: {
296
+ commentId: stringProperty('Document review comment id.'),
297
+ body: stringProperty('Updated comment text.'),
298
+ },
299
+ required: ['commentId', 'body'],
300
+ },
301
+ }));
302
+ register('delete_document_review_comment', (context) => ({
303
+ description: context.describeTool('Delete an existing document review comment when it should be removed entirely.'),
304
+ inputSchema: {
305
+ properties: {
306
+ commentId: stringProperty('Document review comment id.'),
307
+ },
308
+ required: ['commentId'],
309
+ },
310
+ }));
311
+ register('link_task_context', (context) => ({
312
+ description: context.describeTool('Attach an external http(s) URL as task context. link_task_context only supports an external http(s) URL; use save_task_attachment for files or generated content.'),
313
+ inputSchema: {
314
+ properties: {
315
+ id: stringProperty('Task ID or task reference such as T-123.'),
316
+ path: stringProperty('External http(s) URL to attach.'),
317
+ caption: stringProperty('Optional caption for the linked context entry.'),
318
+ },
319
+ required: ['id', 'path'],
320
+ },
321
+ }));
322
+ register('save_task_attachment', (context) => ({
323
+ description: context.describeTool('Save a file and attach it to a task. Use this for generated content or existing files from disk. Set overwrite=true to replace an existing canonical attachment with the same filename. For AI-authored markdown/text, use inline content for AI-authored markdown/text rather than writing an external temp file first.'),
324
+ inputSchema: {
325
+ properties: {
326
+ id: stringProperty('Task ID or task reference such as T-123.'),
327
+ filename: stringProperty('Destination filename for the attachment.'),
328
+ content: stringProperty('Inline file content; use this for AI-authored markdown/text attachments.'),
329
+ sourcePath: stringProperty('Path to an existing source file. Must be within project root, a Taskforce-managed attachment source, or an approved agent workspace root.'),
330
+ caption: stringProperty('Optional attachment caption.'),
331
+ overwrite: booleanProperty('When true, overwrite an existing canonical task attachment with the same filename instead of creating a new one.'),
332
+ },
333
+ required: ['id', 'filename'],
334
+ },
335
+ }));
336
+ register('delete_task_attachment', (context) => ({
337
+ description: context.describeTool('Delete one task attachment. Use get_task_attachments first to inspect attachment ids before removing one.'),
338
+ inputSchema: {
339
+ properties: {
340
+ taskId: stringProperty('Task ID or task reference such as T-123.'),
341
+ attachmentId: stringProperty('Attachment descriptor id from get_task_attachments.'),
342
+ },
343
+ required: ['taskId', 'attachmentId'],
344
+ },
345
+ }));
346
+ }
@@ -2,6 +2,7 @@ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
2
2
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
3
  import { McpAccessTokenScope, TaskforceCore } from '../core/Taskforce.js';
4
4
  import { type AiProfileBootstrapConfig } from './aiProfileBootstrap.js';
5
+ import { type AiProfileSeatScope } from '../shared/aiProfileSeatScope.js';
5
6
  export interface TaskforceMcpServerOptions {
6
7
  projectRoot?: string;
7
8
  tenantId?: string;
@@ -23,6 +24,7 @@ export interface TaskforceMcpServerOptions {
23
24
  aiProfileProvider?: AiProfileBootstrapConfig['aiProfileProvider'];
24
25
  aiProfileModel?: AiProfileBootstrapConfig['aiProfileModel'];
25
26
  aiProfileSurfaceType?: AiProfileBootstrapConfig['aiProfileSurfaceType'];
27
+ aiProfileSeatScope?: AiProfileSeatScope | null;
26
28
  actorType?: 'local' | 'user' | 'token' | 'oauth';
27
29
  requestId?: string | null;
28
30
  ip?: string | null;