@taskforcehq/taskforce 0.3.306 → 0.3.307
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.
- package/README.md +0 -2
- package/dist/Taskforce.module.css +317 -27
- package/dist/TaskforceCore.js +1 -0
- package/dist/TaskforceCore.test.js +178 -0
- package/dist/components/activity/EntityActivityTimeline.d.ts +34 -0
- package/dist/components/activity/EntityActivityTimeline.js +81 -0
- package/dist/components/context/ContextAttachmentManager.js +15 -3
- package/dist/components/features/AgentsModule.d.ts +5 -1
- package/dist/components/features/AgentsModule.js +142 -39
- package/dist/components/features/AgentsModule.test.js +260 -11
- package/dist/components/features/AnnotatedAttachmentWorkspace.d.ts +3 -1
- package/dist/components/features/AnnotatedAttachmentWorkspace.js +118 -4
- package/dist/components/features/AnnotatedAttachmentWorkspace.test.js +52 -0
- package/dist/components/features/DocumentIndex.d.ts +2 -2
- package/dist/components/features/DocumentIndex.js +3 -4
- package/dist/components/features/DocumentViewer.d.ts +3 -1
- package/dist/components/features/DocumentViewer.js +6 -5
- package/dist/components/features/DocumentWorkspace.d.ts +10 -2
- package/dist/components/features/DocumentWorkspace.js +15 -4
- package/dist/components/features/DocumentWorkspace.test.js +20 -3
- package/dist/components/features/TaskSettings.d.ts +2 -0
- package/dist/components/features/TaskSettings.js +83 -78
- package/dist/components/features/TaskSettings.test.js +171 -82
- package/dist/components/task/TaskActionHeader.js +11 -5
- package/dist/components/task/TaskActionHeader.test.js +10 -0
- package/dist/components/task/TaskCard.js +6 -2
- package/dist/components/task/TaskContextUpload.test.js +3 -3
- package/dist/components/task/TaskForm.js +14 -64
- package/dist/components/task/TaskKanban.js +0 -8
- package/dist/components/task/TaskList.js +5 -1
- package/dist/components/task/TaskList.test.js +4 -0
- package/dist/components/ui/HierarchyActionBadge.d.ts +10 -0
- package/dist/components/ui/HierarchyActionBadge.js +5 -0
- package/dist/components/views/AppShellHeader.d.ts +3 -1
- package/dist/components/views/AppShellHeader.js +27 -11
- package/dist/components/views/AppShellHeader.test.js +18 -1
- package/dist/components/views/PlanComparisonPage.js +9 -1
- package/dist/components/views/PlanComparisonPage.test.js +19 -0
- package/dist/components/views/PlansPage.js +1 -1
- package/dist/components/views/StandaloneLayout.js +256 -69
- package/dist/components/views/WidgetView.js +10 -8
- package/dist/components/views/panels/PlanningDrawer.d.ts +19 -6
- package/dist/components/views/panels/PlanningDrawer.js +259 -51
- package/dist/components/views/panels/PlanningDrawer.test.js +392 -4
- package/dist/config/envSchema.js +1 -0
- package/dist/core/AiProfileService.d.ts +7 -0
- package/dist/core/AiProfileService.js +460 -35
- package/dist/core/AiProfiles.test.js +648 -2
- package/dist/core/AttachmentLinkService.d.ts +3 -0
- package/dist/core/AttachmentLinkService.js +58 -13
- package/dist/core/GlobalSettingsService.js +12 -0
- package/dist/core/McpTokenService.d.ts +12 -0
- package/dist/core/McpTokenService.js +44 -1
- package/dist/core/PlanningEntities.test.js +366 -4
- package/dist/core/TaskActivityService.d.ts +28 -1
- package/dist/core/TaskActivityService.js +227 -46
- package/dist/core/TaskActivitySync.test.d.ts +1 -0
- package/dist/core/TaskActivitySync.test.js +90 -0
- package/dist/core/TaskAuditTimeline.test.js +96 -0
- package/dist/core/Taskforce.d.ts +190 -26
- package/dist/core/Taskforce.ids.test.js +58 -0
- package/dist/core/Taskforce.js +775 -71
- package/dist/core/Taskforce.mcpAuth.test.js +109 -0
- package/dist/core/types.d.ts +7 -0
- package/dist/hooks/auth/useTaskforceAuthBootstrap.js +2 -1
- package/dist/hooks/bootstrapTimeouts.d.ts +4 -0
- package/dist/hooks/bootstrapTimeouts.js +8 -0
- package/dist/hooks/bootstrapTimeouts.test.d.ts +1 -0
- package/dist/hooks/bootstrapTimeouts.test.js +12 -0
- package/dist/hooks/sync/orchestratorShared.d.ts +3 -3
- package/dist/hooks/sync/orchestratorShared.js +61 -1
- package/dist/hooks/sync/recovery.js +8 -0
- package/dist/hooks/sync/recovery.test.js +5 -5
- package/dist/hooks/sync/transfers.d.ts +2 -1
- package/dist/hooks/sync/transfers.js +36 -9
- package/dist/hooks/sync/transfers.test.js +534 -2
- package/dist/hooks/useFilterSort.js +13 -13
- package/dist/hooks/useFilterSort.test.js +87 -1
- package/dist/hooks/useSyncOrchestrator.js +50 -5
- package/dist/hooks/useTaskforce.d.ts +85 -50
- package/dist/hooks/useTaskforce.js +44 -14
- package/dist/hooks/useTaskforce.runtime-routing.test.js +94 -0
- package/dist/hooks/useTaskforce.sync-behavior.test.js +99 -0
- package/dist/hooks/useWorkspaceSyncController.js +7 -1
- package/dist/hooks/useWorkspaceSyncController.test.js +48 -0
- package/dist/hooks/workspace/useTaskforceWorkspaceBootstrap.js +14 -7
- package/dist/mcp/canonicalAssetHelpers.d.ts +16 -4
- package/dist/mcp/canonicalAssetHelpers.js +18 -10
- package/dist/mcp/canonicalAssetHelpers.test.d.ts +1 -0
- package/dist/mcp/canonicalAssetHelpers.test.js +67 -0
- package/dist/mcp/clientIntegrations.d.ts +1 -0
- package/dist/mcp/clientIntegrations.js +25 -0
- package/dist/mcp/clientIntegrations.test.js +14 -3
- package/dist/mcp/clientProfileDefaults.js +3 -3
- package/dist/mcp/collaborationRegistrar.js +7 -7
- package/dist/mcp/documentAssetRegistrar.js +113 -7
- package/dist/mcp/runtime.d.ts +1 -0
- package/dist/mcp/runtime.js +969 -122
- package/dist/mcp/runtime.test.js +1083 -11
- package/dist/mcp/taskAttachmentTypes.d.ts +1 -1
- package/dist/mcp/taskPlanningRegistrar.js +48 -0
- package/dist/mcp/toolRegistry.d.ts +56 -0
- package/dist/mcp/toolRegistry.js +8 -0
- package/dist/mcp/toolRegistry.test.js +4 -0
- package/dist/migrations/taskSchemaMigrations.js +21 -0
- package/dist/server/aiProfileAvatarAssets.d.ts +49 -0
- package/dist/server/aiProfileAvatarAssets.js +319 -0
- package/dist/server/aiProfileAvatarAssets.test.d.ts +1 -0
- package/dist/server/aiProfileAvatarAssets.test.js +213 -0
- package/dist/server/annotatedAttachmentsRoutes.test.js +66 -7
- package/dist/server/index.js +4 -0
- package/dist/server/index.test.js +6 -1
- package/dist/server/routes/admin.js +187 -9
- package/dist/server/routes/annotatedAttachments.js +51 -0
- package/dist/server/routes/auth.d.ts +11 -0
- package/dist/server/routes/auth.js +189 -27
- package/dist/server/routes/authSupport.d.ts +4 -0
- package/dist/server/routes/authSupport.js +12 -1
- package/dist/server/routes/billing.js +11 -0
- package/dist/server/routes/billing.test.js +3 -0
- package/dist/server/routes/documents.js +10 -0
- package/dist/server/routes/shared.js +0 -10
- package/dist/server/routes/sync.integration.test.js +221 -0
- package/dist/server/routes/sync.js +13 -3
- package/dist/server/routes/syncSnapshotRoutes.js +2 -0
- package/dist/server/routes/tasks.js +12 -9
- package/dist/server/routes.js +87 -8
- package/dist/server/routes.test.js +890 -22
- package/dist/shared/aiProfileSurfaceType.d.ts +1 -1
- package/dist/shared/aiProfileSurfaceType.js +10 -8
- package/dist/storage/objectStorage.d.ts +1 -0
- package/dist/storage/objectStorage.js +2 -1
- package/dist/storage/objectStorageClient.d.ts +1 -0
- package/dist/storage/objectStorageClient.js +41 -8
- package/dist/storage/objectStorageClient.test.js +26 -1
- package/dist/storage/objectStorageConfig.js +3 -1
- package/dist/storage/objectStorageConfig.test.js +13 -1
- package/dist/sync/collaborationSyncPayload.js +2 -0
- package/dist/sync/collaborationSyncPayload.test.js +1 -0
- package/dist/sync/collaborationSyncState.d.ts +3 -3
- package/dist/sync/collaborationSyncState.js +19 -12
- package/dist/sync/contentSyncPayload.d.ts +5 -1
- package/dist/sync/contentSyncPayload.js +9 -0
- package/dist/sync/contentSyncPayload.test.js +39 -0
- package/dist/sync/contentSyncState.d.ts +5 -1
- package/dist/sync/contentSyncState.js +231 -37
- package/dist/sync/planningSyncPayload.js +5 -0
- package/dist/sync/planningSyncPayload.test.js +24 -0
- package/dist/sync/syncApplyHandlers.d.ts +4 -4
- package/dist/sync/syncApplyHandlers.js +89 -31
- package/dist/sync/syncApplyHandlers.test.js +184 -4
- package/dist/sync/syncResourceAdapters.d.ts +2 -0
- package/dist/sync/syncResourceAdapters.js +2 -0
- package/dist/sync/syncService.d.ts +1 -0
- package/dist/sync/syncService.js +13 -1
- package/dist/sync/syncService.test.js +39 -0
- package/dist/sync/workspacePullFeed.d.ts +4 -0
- package/dist/sync/workspacePullFeed.js +129 -70
- package/dist/sync/workspacePullFeed.test.js +49 -0
- package/dist/sync/workspaceSyncModel.d.ts +28 -6
- package/dist/sync/workspaceSyncModel.js +159 -45
- package/dist/sync/workspaceSyncModel.test.js +269 -3
- package/dist/types.d.ts +33 -2
- package/dist/ui/assets/AgentsModule-2y82_3DO.js +1 -0
- package/dist/ui/assets/AnnotatedAttachmentWorkspace-BTLZZCiQ.js +3 -0
- package/dist/ui/assets/AnnotatedAttachmentWorkspace-BVKew-mH.css +1 -0
- package/dist/ui/assets/ContextAttachmentManager-D2epuNnG.js +3 -0
- package/dist/ui/assets/DocumentWorkspace-D4rJKXzd.css +1 -0
- package/dist/ui/assets/DocumentWorkspace-sVa-3Do6.js +252 -0
- package/dist/ui/assets/EntityActivityTimeline-DyqvvhuF.css +1 -0
- package/dist/ui/assets/EntityActivityTimeline-Zods27y_.js +1 -0
- package/dist/ui/assets/{InitiativesModule-9E6ParrY.js → InitiativesModule-D4XseTwW.js} +1 -1
- package/dist/ui/assets/PlansPage-D5AcbO0L.js +1 -0
- package/dist/ui/assets/PlansPage-Dvqsz5zc.css +1 -0
- package/dist/ui/assets/TaskContextUpload-uC5qx4Bv.js +1 -0
- package/dist/ui/assets/TaskSettings-CqvPAsTv.js +9 -0
- package/dist/ui/assets/{WorkflowsModule-BA7jcEpH.js → WorkflowsModule-oOA9bcdK.js} +4 -4
- package/dist/ui/assets/documentReferences-DPZuTgHh.js +1 -0
- package/dist/ui/assets/index-607WPo_X.js +4 -0
- package/dist/ui/assets/index-CYyodXsg.css +1 -0
- package/dist/ui/assets/{vendor-icons-DuEd_65c.js → vendor-icons-B32hGuF2.js} +1 -1
- package/dist/ui/index.html +3 -3
- package/dist/ui/product/agent manager.png +0 -0
- package/dist/ui/product/agent_manager_02.png +0 -0
- package/dist/utils/aiProfileEvents.d.ts +7 -0
- package/dist/utils/aiProfileEvents.js +6 -0
- package/dist/utils/assignees.d.ts +6 -0
- package/dist/utils/assignees.js +8 -1
- package/dist/utils/assignees.test.d.ts +1 -0
- package/dist/utils/assignees.test.js +25 -0
- package/dist/utils/avatarDisplay.d.ts +1 -0
- package/dist/utils/avatarDisplay.js +15 -0
- package/dist/utils/contextFiles.d.ts +3 -1
- package/dist/utils/contextFiles.js +2 -1
- package/dist/utils/taskActivity.d.ts +7 -1
- package/dist/utils/taskActivity.js +63 -1
- package/dist/utils/taskActivity.test.js +23 -1
- package/dist/utils/taskSearch.d.ts +22 -0
- package/dist/utils/taskSearch.js +87 -0
- package/dist/utils/taskSearch.test.d.ts +1 -0
- package/dist/utils/taskSearch.test.js +69 -0
- package/dist/utils/taskUtils.js +10 -3
- package/dist/utils/taskUtils.test.d.ts +1 -0
- package/dist/utils/taskUtils.test.js +19 -0
- package/package.json +1 -1
- package/dist/ui/assets/AgentsModule-DrLawwNl.js +0 -1
- package/dist/ui/assets/AnnotatedAttachmentWorkspace-BaS2VwIr.css +0 -1
- package/dist/ui/assets/AnnotatedAttachmentWorkspace-Z9_whf7F.js +0 -3
- package/dist/ui/assets/DocumentWorkspace-B03MaSkw.js +0 -252
- package/dist/ui/assets/DocumentWorkspace-Dhdso07p.css +0 -1
- package/dist/ui/assets/PlansPage-CvfnMiWq.css +0 -1
- package/dist/ui/assets/PlansPage-DRXscYxH.js +0 -1
- package/dist/ui/assets/TaskSettings-DZX4jk7e.js +0 -9
- package/dist/ui/assets/index-9eT8e0Lu.css +0 -1
- package/dist/ui/assets/index-C6k75jr8.js +0 -6
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { MCP_CLIENT_OPTIONS, buildCloudMcpClientIntegration, buildLocalMcpClientIntegration, buildCloudMcpServerId, } from './clientIntegrations';
|
|
2
|
+
import { MCP_CLIENT_OPTIONS, buildCloudMcpClientIntegration, buildLocalMcpClientIntegration, buildCloudMcpServerId, buildLocalAiProfileEnv, } from './clientIntegrations';
|
|
3
3
|
describe('clientIntegrations', () => {
|
|
4
4
|
it('builds a readable cloud MCP server id from workspace name', () => {
|
|
5
5
|
expect(buildCloudMcpServerId('Workspace Alpha', null)).toBe('taskforce-workspace-alpha');
|
|
@@ -78,7 +78,7 @@ describe('clientIntegrations', () => {
|
|
|
78
78
|
aiProfileRole: 'Coding Agent',
|
|
79
79
|
aiProfileProvider: 'OpenAI',
|
|
80
80
|
aiProfileModel: 'Codex',
|
|
81
|
-
aiProfileSurfaceType: '
|
|
81
|
+
aiProfileSurfaceType: 'cli',
|
|
82
82
|
});
|
|
83
83
|
const vscode = buildCloudMcpClientIntegration({
|
|
84
84
|
clientId: 'vscode',
|
|
@@ -98,7 +98,7 @@ describe('clientIntegrations', () => {
|
|
|
98
98
|
expect(codex.renderedText).toContain('X-Taskforce-AI-Role = "Coding Agent"');
|
|
99
99
|
expect(codex.renderedText).toContain('X-Taskforce-AI-Provider = "OpenAI"');
|
|
100
100
|
expect(codex.renderedText).toContain('X-Taskforce-AI-Model = "Codex"');
|
|
101
|
-
expect(codex.renderedText).toContain('X-Taskforce-AI-Surface-Type = "
|
|
101
|
+
expect(codex.renderedText).toContain('X-Taskforce-AI-Surface-Type = "cli"');
|
|
102
102
|
expect(codex.instructionText).toContain('Use the generated config exactly as shown.');
|
|
103
103
|
expect(codex.instructionText).toContain('generated AI bootstrap headers');
|
|
104
104
|
expect(vscode.serverConfig).toEqual({
|
|
@@ -180,6 +180,17 @@ describe('clientIntegrations', () => {
|
|
|
180
180
|
expect(integration.renderedText).toContain('TASKFORCE_TENANT_ID = "tenant-alpha"');
|
|
181
181
|
expect(integration.renderedText).not.toContain('Authorization');
|
|
182
182
|
});
|
|
183
|
+
it('builds non-secret local AI profile env metadata for stdio clients', () => {
|
|
184
|
+
expect(buildLocalAiProfileEnv('codex')).toEqual({
|
|
185
|
+
TASKFORCE_AI_NAME: 'Codex',
|
|
186
|
+
TASKFORCE_AI_ICON: 'Bot',
|
|
187
|
+
TASKFORCE_AI_ROLE: 'Coding agent',
|
|
188
|
+
TASKFORCE_AI_PROVIDER: 'OpenAI',
|
|
189
|
+
TASKFORCE_AI_MODEL: 'Codex',
|
|
190
|
+
TASKFORCE_AI_SURFACE_TYPE: 'cli',
|
|
191
|
+
});
|
|
192
|
+
expect(buildLocalAiProfileEnv('codex')).not.toHaveProperty('TASKFORCE_AI_PROFILE_TOKEN');
|
|
193
|
+
});
|
|
183
194
|
it('builds local VS Code config with stdio transport', () => {
|
|
184
195
|
const integration = buildLocalMcpClientIntegration({
|
|
185
196
|
clientId: 'vscode',
|
|
@@ -7,15 +7,15 @@ const CLIENT_LABELS = {
|
|
|
7
7
|
export function getDefaultAiProfileMetadataForClient(clientId) {
|
|
8
8
|
switch (clientId) {
|
|
9
9
|
case 'codex':
|
|
10
|
-
return { icon: 'Code2', color: '#10a37f', description: 'OpenAI Codex coding agent connected through MCP.', role: 'Coding Agent', provider: 'OpenAI', model: 'Codex', surfaceType: '
|
|
10
|
+
return { icon: 'Code2', color: '#10a37f', description: 'OpenAI Codex CLI coding agent connected through MCP.', role: 'CLI Coding Agent', provider: 'OpenAI', model: 'Codex', surfaceType: 'cli' };
|
|
11
11
|
case 'chatgpt-desktop':
|
|
12
12
|
return { icon: 'MessageSquare', color: '#10a37f', description: 'ChatGPT desktop app connected through the Taskforce MCP connector.', role: 'AI Assistant', provider: 'OpenAI', model: 'ChatGPT', surfaceType: 'chat_app' };
|
|
13
13
|
case 'claude-code':
|
|
14
|
-
return { icon: 'Sparkles', color: '#d97706', description: 'Claude Code coding agent connected through MCP.', role: 'Coding Agent', provider: 'Anthropic', model: 'Claude Code', surfaceType: '
|
|
14
|
+
return { icon: 'Sparkles', color: '#d97706', description: 'Claude Code CLI coding agent connected through MCP.', role: 'CLI Coding Agent', provider: 'Anthropic', model: 'Claude Code', surfaceType: 'cli' };
|
|
15
15
|
case 'claude-desktop':
|
|
16
16
|
return { icon: 'MessageSquareMore', color: '#d97706', description: 'Claude Desktop connected through the Taskforce MCP connector.', role: 'AI Assistant', provider: 'Anthropic', model: 'Claude', surfaceType: 'chat_app' };
|
|
17
17
|
case 'gemini-cli':
|
|
18
|
-
return { icon: 'Gem', color: '#2563eb', description: 'Gemini CLI coding agent connected through MCP.', role: 'Coding Agent', provider: 'Google', model: 'Gemini', surfaceType: '
|
|
18
|
+
return { icon: 'Gem', color: '#2563eb', description: 'Gemini CLI coding agent connected through MCP.', role: 'CLI Coding Agent', provider: 'Google', model: 'Gemini', surfaceType: 'cli' };
|
|
19
19
|
case 'vscode':
|
|
20
20
|
return { icon: 'Code2', color: '#2563eb', description: 'VS Code MCP-connected coding agent.', role: 'Coding Agent', provider: null, model: null, surfaceType: 'ide' };
|
|
21
21
|
case 'cline':
|
|
@@ -27,15 +27,15 @@ export function registerCollaborationTools(registerTool, executeTool) {
|
|
|
27
27
|
inputSchema: { properties: {} },
|
|
28
28
|
}));
|
|
29
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
|
|
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 your own profileToken to inspect a stateless AI profile without mutating session state. The response includes your profileToken only for private agent/client storage; do not write it to repos, task comments, task attachments, logs, generated docs, or shared output.'),
|
|
31
31
|
inputSchema: {
|
|
32
32
|
properties: {
|
|
33
|
-
profileToken: stringProperty('Optional AI profile token to inspect when no profile is currently bound in session state.'),
|
|
33
|
+
profileToken: stringProperty('Optional AI profile token to inspect when no profile is currently bound in session state. Pass only a token previously issued to this AI identity.'),
|
|
34
34
|
},
|
|
35
35
|
},
|
|
36
36
|
}));
|
|
37
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.'),
|
|
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. Store the returned profileToken only in private agent/client state and include it on future mutating calls when your MCP client does not preserve session identity. Never write profileToken values to repos, task comments, task attachments, logs, generated docs, or shared output. 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
39
|
inputSchema: {
|
|
40
40
|
properties: {
|
|
41
41
|
name: stringProperty('Display name for the AI collaborator.'),
|
|
@@ -50,9 +50,9 @@ export function registerCollaborationTools(registerTool, executeTool) {
|
|
|
50
50
|
{ type: 'string', enum: [...AI_PROFILE_SURFACE_TYPES] },
|
|
51
51
|
{ type: 'null' },
|
|
52
52
|
],
|
|
53
|
-
description: 'Optional self-declared AI surface type. Use agent for a persistent named AI collaborator in Taskforce,
|
|
53
|
+
description: 'Optional self-declared AI surface type. Use agent for a persistent named AI collaborator in Taskforce, cli for terminal-native coding agents, coding_tool for coding surfaces that are not specifically CLI or IDE-native, chat_app for a conversational app identity, and ide for an IDE-native copilot identity. If you are unsure or none of those fit, choose agent. Omit to leave unchanged; pass null or an empty string to clear.',
|
|
54
54
|
},
|
|
55
|
-
profileToken: stringProperty('Previously issued Taskforce profile token.
|
|
55
|
+
profileToken: stringProperty('Previously issued Taskforce profile token for this AI identity. Keep it in private agent/client state; when provided, Taskforce resolves the existing profile instead of creating a new one, and applies any supplied presentation field updates to that profile.'),
|
|
56
56
|
},
|
|
57
57
|
required: ['name'],
|
|
58
58
|
},
|
|
@@ -63,9 +63,9 @@ export function registerCollaborationTools(registerTool, executeTool) {
|
|
|
63
63
|
properties: {
|
|
64
64
|
id: stringProperty('Task ID or task reference such as T-123.'),
|
|
65
65
|
text: stringProperty('Comment text.'),
|
|
66
|
-
author: stringProperty('
|
|
66
|
+
author: stringProperty('Optional comment author identity. Defaults to your resolved AI profile. Prefer stable actor IDs for overrides (`ai-profile-*`, workspace user IDs, `user`, `system`). Display names are not authoritative and may be canonicalized back to the bound actor; use `user` only for human-authored comments.'),
|
|
67
67
|
},
|
|
68
|
-
required: ['id', 'text'
|
|
68
|
+
required: ['id', 'text'],
|
|
69
69
|
},
|
|
70
70
|
}));
|
|
71
71
|
}
|
|
@@ -35,8 +35,8 @@ export function registerDocumentAssetTools(registerTool, executeTool) {
|
|
|
35
35
|
inputSchema: {
|
|
36
36
|
properties: {
|
|
37
37
|
taskId: stringProperty('Task ID or task reference such as T-123.'),
|
|
38
|
+
id: stringProperty('Alias for taskId. Task ID or task reference such as T-123.'),
|
|
38
39
|
},
|
|
39
|
-
required: ['taskId'],
|
|
40
40
|
},
|
|
41
41
|
}));
|
|
42
42
|
register('read_task_attachment', (context) => ({
|
|
@@ -50,6 +50,96 @@ export function registerDocumentAssetTools(registerTool, executeTool) {
|
|
|
50
50
|
required: ['taskId', 'attachmentId'],
|
|
51
51
|
},
|
|
52
52
|
}));
|
|
53
|
+
register('get_workstream_attachments', (context) => ({
|
|
54
|
+
description: context.describeTool('List attachment descriptors for one workstream. This returns metadata only; use read_workstream_attachment for file contents.'),
|
|
55
|
+
inputSchema: {
|
|
56
|
+
properties: {
|
|
57
|
+
id: stringProperty('Workstream ID or workstream reference such as WS-123.'),
|
|
58
|
+
},
|
|
59
|
+
required: ['id'],
|
|
60
|
+
},
|
|
61
|
+
}));
|
|
62
|
+
register('read_workstream_attachment', (context) => ({
|
|
63
|
+
description: context.describeTool('Read one workstream attachment by attachmentId. Prefer this tool over opening attachment path URLs directly.'),
|
|
64
|
+
inputSchema: {
|
|
65
|
+
properties: {
|
|
66
|
+
workstreamId: stringProperty('Workstream ID or workstream reference such as WS-123.'),
|
|
67
|
+
attachmentId: stringProperty('Attachment descriptor id from get_workstream_attachments.'),
|
|
68
|
+
format: stringProperty('Read format. Use metadata for descriptors or download for a download URL.', ['text', 'metadata', 'download']),
|
|
69
|
+
maxChars: numberProperty('Optional max inline character count for readable text attachments.'),
|
|
70
|
+
},
|
|
71
|
+
required: ['workstreamId', 'attachmentId'],
|
|
72
|
+
},
|
|
73
|
+
}));
|
|
74
|
+
register('save_workstream_attachment', (context) => ({
|
|
75
|
+
description: context.describeTool('Save a file and attach it to a workstream. Use this for generated content or existing files from disk. Set overwrite=true to replace an existing canonical attachment with the same filename.'),
|
|
76
|
+
inputSchema: {
|
|
77
|
+
properties: {
|
|
78
|
+
id: stringProperty('Workstream ID or workstream reference such as WS-123.'),
|
|
79
|
+
filename: stringProperty('Destination filename for the attachment.'),
|
|
80
|
+
content: stringProperty('Inline file content; use this for AI-authored markdown/text attachments.'),
|
|
81
|
+
sourcePath: stringProperty('Path to an existing source file. Must be within project root, a Taskforce-managed attachment source, or an approved agent workspace root.'),
|
|
82
|
+
caption: stringProperty('Optional attachment caption.'),
|
|
83
|
+
overwrite: booleanProperty('When true, overwrite an existing canonical workstream attachment with the same filename instead of creating a new one.'),
|
|
84
|
+
},
|
|
85
|
+
required: ['id', 'filename'],
|
|
86
|
+
},
|
|
87
|
+
}));
|
|
88
|
+
register('delete_workstream_attachment', (context) => ({
|
|
89
|
+
description: context.describeTool('Delete one workstream attachment. Use get_workstream_attachments first to inspect attachment ids before removing one.'),
|
|
90
|
+
inputSchema: {
|
|
91
|
+
properties: {
|
|
92
|
+
workstreamId: stringProperty('Workstream ID or workstream reference such as WS-123.'),
|
|
93
|
+
attachmentId: stringProperty('Attachment descriptor id from get_workstream_attachments.'),
|
|
94
|
+
},
|
|
95
|
+
required: ['workstreamId', 'attachmentId'],
|
|
96
|
+
},
|
|
97
|
+
}));
|
|
98
|
+
register('get_initiative_attachments', (context) => ({
|
|
99
|
+
description: context.describeTool('List attachment descriptors for one initiative. This returns metadata only; use read_initiative_attachment for file contents.'),
|
|
100
|
+
inputSchema: {
|
|
101
|
+
properties: {
|
|
102
|
+
id: stringProperty('Initiative ID or initiative reference such as IN-123.'),
|
|
103
|
+
},
|
|
104
|
+
required: ['id'],
|
|
105
|
+
},
|
|
106
|
+
}));
|
|
107
|
+
register('read_initiative_attachment', (context) => ({
|
|
108
|
+
description: context.describeTool('Read one initiative attachment by attachmentId. Prefer this tool over opening attachment path URLs directly.'),
|
|
109
|
+
inputSchema: {
|
|
110
|
+
properties: {
|
|
111
|
+
initiativeId: stringProperty('Initiative ID or initiative reference such as IN-123.'),
|
|
112
|
+
attachmentId: stringProperty('Attachment descriptor id from get_initiative_attachments.'),
|
|
113
|
+
format: stringProperty('Read format. Use metadata for descriptors or download for a download URL.', ['text', 'metadata', 'download']),
|
|
114
|
+
maxChars: numberProperty('Optional max inline character count for readable text attachments.'),
|
|
115
|
+
},
|
|
116
|
+
required: ['initiativeId', 'attachmentId'],
|
|
117
|
+
},
|
|
118
|
+
}));
|
|
119
|
+
register('save_initiative_attachment', (context) => ({
|
|
120
|
+
description: context.describeTool('Save a file and attach it to an initiative. Use this for generated content or existing files from disk. Set overwrite=true to replace an existing canonical attachment with the same filename.'),
|
|
121
|
+
inputSchema: {
|
|
122
|
+
properties: {
|
|
123
|
+
id: stringProperty('Initiative ID or initiative reference such as IN-123.'),
|
|
124
|
+
filename: stringProperty('Destination filename for the attachment.'),
|
|
125
|
+
content: stringProperty('Inline file content; use this for AI-authored markdown/text attachments.'),
|
|
126
|
+
sourcePath: stringProperty('Path to an existing source file. Must be within project root, a Taskforce-managed attachment source, or an approved agent workspace root.'),
|
|
127
|
+
caption: stringProperty('Optional attachment caption.'),
|
|
128
|
+
overwrite: booleanProperty('When true, overwrite an existing canonical initiative attachment with the same filename instead of creating a new one.'),
|
|
129
|
+
},
|
|
130
|
+
required: ['id', 'filename'],
|
|
131
|
+
},
|
|
132
|
+
}));
|
|
133
|
+
register('delete_initiative_attachment', (context) => ({
|
|
134
|
+
description: context.describeTool('Delete one initiative attachment. Use get_initiative_attachments first to inspect attachment ids before removing one.'),
|
|
135
|
+
inputSchema: {
|
|
136
|
+
properties: {
|
|
137
|
+
initiativeId: stringProperty('Initiative ID or initiative reference such as IN-123.'),
|
|
138
|
+
attachmentId: stringProperty('Attachment descriptor id from get_initiative_attachments.'),
|
|
139
|
+
},
|
|
140
|
+
required: ['initiativeId', 'attachmentId'],
|
|
141
|
+
},
|
|
142
|
+
}));
|
|
53
143
|
register('search_images', (context) => ({
|
|
54
144
|
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
145
|
inputSchema: {
|
|
@@ -65,8 +155,8 @@ export function registerDocumentAssetTools(registerTool, executeTool) {
|
|
|
65
155
|
inputSchema: {
|
|
66
156
|
properties: {
|
|
67
157
|
id: stringProperty('Image asset id or image reference such as I-123.'),
|
|
158
|
+
imageId: stringProperty('Alias for id. Image asset id or image reference such as I-123.'),
|
|
68
159
|
},
|
|
69
|
-
required: ['id'],
|
|
70
160
|
},
|
|
71
161
|
}));
|
|
72
162
|
register('search_documents', (context) => ({
|
|
@@ -84,8 +174,8 @@ export function registerDocumentAssetTools(registerTool, executeTool) {
|
|
|
84
174
|
inputSchema: {
|
|
85
175
|
properties: {
|
|
86
176
|
id: stringProperty('Document asset id or document reference such as D-123.'),
|
|
177
|
+
documentId: stringProperty('Alias for id. Document asset id or document reference such as D-123.'),
|
|
87
178
|
},
|
|
88
|
-
required: ['id'],
|
|
89
179
|
},
|
|
90
180
|
}));
|
|
91
181
|
register('read_document_content', (context) => ({
|
|
@@ -161,13 +251,14 @@ export function registerDocumentAssetTools(registerTool, executeTool) {
|
|
|
161
251
|
properties: {
|
|
162
252
|
sessionId: stringProperty('Annotated attachment session id.'),
|
|
163
253
|
type: stringProperty('Marker type.'),
|
|
254
|
+
kind: stringProperty('Alias for type. Marker kind: pin, box, arrow, or text-note.'),
|
|
164
255
|
x: numberProperty('Normalized x coordinate in the 0..1 range.'),
|
|
165
256
|
y: numberProperty('Normalized y coordinate in the 0..1 range.'),
|
|
166
257
|
width: numberProperty('Optional normalized width in the 0..1 range.'),
|
|
167
258
|
height: numberProperty('Optional normalized height in the 0..1 range.'),
|
|
168
259
|
text: stringProperty('Optional marker text or note.'),
|
|
260
|
+
instruction: stringProperty('Alias for text. Marker instruction or note.'),
|
|
169
261
|
},
|
|
170
|
-
required: ['sessionId', 'type', 'x', 'y'],
|
|
171
262
|
},
|
|
172
263
|
}));
|
|
173
264
|
register('bulk_add_annotated_attachment_markers', (context) => ({
|
|
@@ -179,13 +270,14 @@ export function registerDocumentAssetTools(registerTool, executeTool) {
|
|
|
179
270
|
type: 'object',
|
|
180
271
|
properties: {
|
|
181
272
|
type: { type: 'string' },
|
|
273
|
+
kind: { type: 'string' },
|
|
182
274
|
x: { type: 'number' },
|
|
183
275
|
y: { type: 'number' },
|
|
184
276
|
width: { type: 'number' },
|
|
185
277
|
height: { type: 'number' },
|
|
186
278
|
text: { type: 'string' },
|
|
279
|
+
instruction: { type: 'string' },
|
|
187
280
|
},
|
|
188
|
-
required: ['type', 'x', 'y'],
|
|
189
281
|
}),
|
|
190
282
|
},
|
|
191
283
|
required: ['sessionId', 'markers'],
|
|
@@ -273,9 +365,19 @@ export function registerDocumentAssetTools(registerTool, executeTool) {
|
|
|
273
365
|
inputSchema: {
|
|
274
366
|
properties: {
|
|
275
367
|
documentId: stringProperty('Document asset id or document reference such as D-123.'),
|
|
368
|
+
id: stringProperty('Alias for documentId. Document asset id or document reference such as D-123.'),
|
|
369
|
+
sessionId: stringProperty('Optional existing review session id.'),
|
|
370
|
+
title: stringProperty('Optional review session title when a new session is created.'),
|
|
276
371
|
prompt: stringProperty('Review instructions or focus areas.'),
|
|
372
|
+
comments: arrayProperty('Explicit review comments to add. When omitted, prompt is saved as a single review comment.', {
|
|
373
|
+
type: 'object',
|
|
374
|
+
properties: {
|
|
375
|
+
body: { type: 'string' },
|
|
376
|
+
anchor: { type: 'object' },
|
|
377
|
+
},
|
|
378
|
+
required: ['body'],
|
|
379
|
+
}),
|
|
277
380
|
},
|
|
278
|
-
required: ['documentId', 'prompt'],
|
|
279
381
|
},
|
|
280
382
|
}));
|
|
281
383
|
register('add_document_review_comment', (context) => ({
|
|
@@ -320,13 +422,17 @@ export function registerDocumentAssetTools(registerTool, executeTool) {
|
|
|
320
422
|
},
|
|
321
423
|
}));
|
|
322
424
|
register('save_task_attachment', (context) => ({
|
|
323
|
-
description: context.describeTool('Save a file and attach it to a task. Use this for generated content
|
|
425
|
+
description: context.describeTool('Save a file and attach it to a task. Use this for generated content, existing files from disk, or staged remote uploads for binary files in cloud MCP. 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
426
|
inputSchema: {
|
|
325
427
|
properties: {
|
|
326
428
|
id: stringProperty('Task ID or task reference such as T-123.'),
|
|
327
429
|
filename: stringProperty('Destination filename for the attachment.'),
|
|
328
430
|
content: stringProperty('Inline file content; use this for AI-authored markdown/text attachments.'),
|
|
329
431
|
sourcePath: stringProperty('Path to an existing source file. Must be within project root, a Taskforce-managed attachment source, or an approved agent workspace root.'),
|
|
432
|
+
uploadedPath: stringProperty('Finalize a previously staged remote upload by passing the uploaded Taskforce storage path returned by save_task_attachment init mode.'),
|
|
433
|
+
uploadDraftId: stringProperty('Finalize a previously staged remote upload by passing the uploadDraftId returned by save_task_attachment init mode.'),
|
|
434
|
+
mimeType: stringProperty('Mime type for staged remote uploads such as image/png or image/jpeg. Provide this with sizeBytes to start a staged upload.'),
|
|
435
|
+
sizeBytes: numberProperty('File size in bytes for staged remote uploads. Provide this with mimeType to start a staged upload.'),
|
|
330
436
|
caption: stringProperty('Optional attachment caption.'),
|
|
331
437
|
overwrite: booleanProperty('When true, overwrite an existing canonical task attachment with the same filename instead of creating a new one.'),
|
|
332
438
|
},
|