@opentabs-dev/opentabs-plugin-asana 0.0.74

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 (113) hide show
  1. package/README.md +159 -0
  2. package/dist/adapter.iife.js +15297 -0
  3. package/dist/adapter.iife.js.map +7 -0
  4. package/dist/asana-api.d.ts +8 -0
  5. package/dist/asana-api.d.ts.map +1 -0
  6. package/dist/asana-api.js +86 -0
  7. package/dist/asana-api.js.map +1 -0
  8. package/dist/index.d.ts +14 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +78 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/tools/add-followers.d.ts +33 -0
  13. package/dist/tools/add-followers.d.ts.map +1 -0
  14. package/dist/tools/add-followers.js +28 -0
  15. package/dist/tools/add-followers.js.map +1 -0
  16. package/dist/tools/add-task-to-section.d.ts +8 -0
  17. package/dist/tools/add-task-to-section.d.ts.map +1 -0
  18. package/dist/tools/add-task-to-section.js +26 -0
  19. package/dist/tools/add-task-to-section.js.map +1 -0
  20. package/dist/tools/create-project.d.ts +30 -0
  21. package/dist/tools/create-project.d.ts.map +1 -0
  22. package/dist/tools/create-project.js +50 -0
  23. package/dist/tools/create-project.js.map +1 -0
  24. package/dist/tools/create-section.d.ts +13 -0
  25. package/dist/tools/create-section.d.ts.map +1 -0
  26. package/dist/tools/create-section.js +28 -0
  27. package/dist/tools/create-section.js.map +1 -0
  28. package/dist/tools/create-story.d.ts +16 -0
  29. package/dist/tools/create-story.d.ts.map +1 -0
  30. package/dist/tools/create-story.js +28 -0
  31. package/dist/tools/create-story.js.map +1 -0
  32. package/dist/tools/create-task.d.ts +40 -0
  33. package/dist/tools/create-task.d.ts.map +1 -0
  34. package/dist/tools/create-task.js +53 -0
  35. package/dist/tools/create-task.js.map +1 -0
  36. package/dist/tools/delete-task.d.ts +7 -0
  37. package/dist/tools/delete-task.d.ts.map +1 -0
  38. package/dist/tools/delete-task.js +24 -0
  39. package/dist/tools/delete-task.js.map +1 -0
  40. package/dist/tools/get-current-user.d.ts +13 -0
  41. package/dist/tools/get-current-user.d.ts.map +1 -0
  42. package/dist/tools/get-current-user.js +30 -0
  43. package/dist/tools/get-current-user.js.map +1 -0
  44. package/dist/tools/get-project.d.ts +23 -0
  45. package/dist/tools/get-project.d.ts.map +1 -0
  46. package/dist/tools/get-project.js +25 -0
  47. package/dist/tools/get-project.js.map +1 -0
  48. package/dist/tools/get-stories-for-task.d.ts +18 -0
  49. package/dist/tools/get-stories-for-task.d.ts.map +1 -0
  50. package/dist/tools/get-stories-for-task.js +41 -0
  51. package/dist/tools/get-stories-for-task.js.map +1 -0
  52. package/dist/tools/get-subtasks.d.ts +35 -0
  53. package/dist/tools/get-subtasks.d.ts.map +1 -0
  54. package/dist/tools/get-subtasks.js +41 -0
  55. package/dist/tools/get-subtasks.js.map +1 -0
  56. package/dist/tools/get-task.d.ts +33 -0
  57. package/dist/tools/get-task.d.ts.map +1 -0
  58. package/dist/tools/get-task.js +29 -0
  59. package/dist/tools/get-task.js.map +1 -0
  60. package/dist/tools/get-tasks-for-project.d.ts +35 -0
  61. package/dist/tools/get-tasks-for-project.d.ts.map +1 -0
  62. package/dist/tools/get-tasks-for-project.js +41 -0
  63. package/dist/tools/get-tasks-for-project.js.map +1 -0
  64. package/dist/tools/get-tasks-for-section.d.ts +35 -0
  65. package/dist/tools/get-tasks-for-section.d.ts.map +1 -0
  66. package/dist/tools/get-tasks-for-section.js +41 -0
  67. package/dist/tools/get-tasks-for-section.js.map +1 -0
  68. package/dist/tools/get-user.d.ts +11 -0
  69. package/dist/tools/get-user.d.ts.map +1 -0
  70. package/dist/tools/get-user.js +25 -0
  71. package/dist/tools/get-user.js.map +1 -0
  72. package/dist/tools/list-projects.d.ts +27 -0
  73. package/dist/tools/list-projects.d.ts.map +1 -0
  74. package/dist/tools/list-projects.js +38 -0
  75. package/dist/tools/list-projects.js.map +1 -0
  76. package/dist/tools/list-sections.d.ts +12 -0
  77. package/dist/tools/list-sections.d.ts.map +1 -0
  78. package/dist/tools/list-sections.js +27 -0
  79. package/dist/tools/list-sections.js.map +1 -0
  80. package/dist/tools/list-tags.d.ts +14 -0
  81. package/dist/tools/list-tags.d.ts.map +1 -0
  82. package/dist/tools/list-tags.js +41 -0
  83. package/dist/tools/list-tags.js.map +1 -0
  84. package/dist/tools/list-teams.d.ts +14 -0
  85. package/dist/tools/list-teams.d.ts.map +1 -0
  86. package/dist/tools/list-teams.js +41 -0
  87. package/dist/tools/list-teams.js.map +1 -0
  88. package/dist/tools/list-users-for-workspace.d.ts +14 -0
  89. package/dist/tools/list-users-for-workspace.d.ts.map +1 -0
  90. package/dist/tools/list-users-for-workspace.js +41 -0
  91. package/dist/tools/list-users-for-workspace.js.map +1 -0
  92. package/dist/tools/list-workspaces.d.ts +8 -0
  93. package/dist/tools/list-workspaces.d.ts.map +1 -0
  94. package/dist/tools/list-workspaces.js +23 -0
  95. package/dist/tools/list-workspaces.js.map +1 -0
  96. package/dist/tools/schemas.d.ts +189 -0
  97. package/dist/tools/schemas.d.ts.map +1 -0
  98. package/dist/tools/schemas.js +222 -0
  99. package/dist/tools/schemas.js.map +1 -0
  100. package/dist/tools/search-tasks.d.ts +39 -0
  101. package/dist/tools/search-tasks.d.ts.map +1 -0
  102. package/dist/tools/search-tasks.js +52 -0
  103. package/dist/tools/search-tasks.js.map +1 -0
  104. package/dist/tools/update-project.d.ts +30 -0
  105. package/dist/tools/update-project.d.ts.map +1 -0
  106. package/dist/tools/update-project.js +49 -0
  107. package/dist/tools/update-project.js.map +1 -0
  108. package/dist/tools/update-task.d.ts +39 -0
  109. package/dist/tools/update-task.d.ts.map +1 -0
  110. package/dist/tools/update-task.js +49 -0
  111. package/dist/tools/update-task.js.map +1 -0
  112. package/dist/tools.json +2865 -0
  113. package/package.json +55 -0
@@ -0,0 +1,8 @@
1
+ export declare const isAuthenticated: () => boolean;
2
+ export declare const waitForAuth: () => Promise<boolean>;
3
+ export declare const api: <T>(endpoint: string, options?: {
4
+ method?: string;
5
+ body?: Record<string, unknown>;
6
+ query?: Record<string, string | number | boolean | undefined>;
7
+ }) => Promise<T>;
8
+ //# sourceMappingURL=asana-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asana-api.d.ts","sourceRoot":"","sources":["../src/asana-api.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,eAAe,QAAO,OAA+B,CAAC;AAEnE,eAAO,MAAM,WAAW,QAAO,OAAO,CAAC,OAAO,CAI3C,CAAC;AAIJ,eAAO,MAAM,GAAG,GAAU,CAAC,EACzB,UAAU,MAAM,EAChB,UAAS;IACP,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;CAC1D,KACL,OAAO,CAAC,CAAC,CAmEX,CAAC"}
@@ -0,0 +1,86 @@
1
+ import { ToolError, getPageGlobal, parseRetryAfterMs, waitUntil } from '@opentabs-dev/plugin-sdk';
2
+ const API_BASE = 'https://app.asana.com/api/1.0';
3
+ // --- Auth detection ---
4
+ // Asana uses HttpOnly cookies (auth_token) that aren't accessible via JS.
5
+ // Auth is detected via window.env._user_id, a numeric global that Asana
6
+ // injects on every page for logged-in users. The actual API auth uses
7
+ // session cookies sent automatically via credentials: 'include'.
8
+ const getUserId = () => {
9
+ const envUserId = getPageGlobal('env._user_id');
10
+ if (typeof envUserId === 'number')
11
+ return envUserId;
12
+ const globalUserId = getPageGlobal('page_load_globals.user_id');
13
+ if (typeof globalUserId === 'number')
14
+ return globalUserId;
15
+ return null;
16
+ };
17
+ export const isAuthenticated = () => getUserId() !== null;
18
+ export const waitForAuth = () => waitUntil(() => isAuthenticated(), { interval: 500, timeout: 5000 }).then(() => true, () => false);
19
+ // --- API caller ---
20
+ export const api = async (endpoint, options = {}) => {
21
+ if (!isAuthenticated())
22
+ throw ToolError.auth('Not authenticated — please log in to Asana.');
23
+ const method = options.method ?? 'GET';
24
+ let url = `${API_BASE}${endpoint}`;
25
+ if (options.query) {
26
+ const params = new URLSearchParams();
27
+ for (const [key, value] of Object.entries(options.query)) {
28
+ if (value !== undefined)
29
+ params.append(key, String(value));
30
+ }
31
+ const qs = params.toString();
32
+ if (qs)
33
+ url += `?${qs}`;
34
+ }
35
+ const headers = {
36
+ Accept: 'application/json',
37
+ };
38
+ // POST/PUT/DELETE requests require this header for write auth
39
+ if (method !== 'GET') {
40
+ headers['X-Allow-Asana-Client'] = '1';
41
+ }
42
+ let fetchBody;
43
+ if (options.body) {
44
+ headers['Content-Type'] = 'application/json';
45
+ fetchBody = JSON.stringify(options.body);
46
+ }
47
+ let response;
48
+ try {
49
+ response = await fetch(url, {
50
+ method,
51
+ headers,
52
+ body: fetchBody,
53
+ credentials: 'include',
54
+ signal: AbortSignal.timeout(30_000),
55
+ });
56
+ }
57
+ catch (err) {
58
+ if (err instanceof DOMException && err.name === 'TimeoutError')
59
+ throw ToolError.timeout(`API request timed out: ${endpoint}`);
60
+ if (err instanceof DOMException && err.name === 'AbortError')
61
+ throw new ToolError('Request was aborted', 'aborted');
62
+ throw new ToolError(`Network error: ${err instanceof Error ? err.message : String(err)}`, 'network_error', {
63
+ category: 'internal',
64
+ retryable: true,
65
+ });
66
+ }
67
+ if (!response.ok) {
68
+ const errorBody = (await response.text().catch(() => '')).substring(0, 512);
69
+ if (response.status === 429) {
70
+ const retryAfter = response.headers.get('Retry-After');
71
+ const retryMs = retryAfter !== null ? parseRetryAfterMs(retryAfter) : undefined;
72
+ throw ToolError.rateLimited(`Rate limited: ${endpoint} — ${errorBody}`, retryMs);
73
+ }
74
+ if (response.status === 401 || response.status === 403)
75
+ throw ToolError.auth(`Auth error (${response.status}): ${errorBody}`);
76
+ if (response.status === 404)
77
+ throw ToolError.notFound(`Not found: ${endpoint} — ${errorBody}`);
78
+ if (response.status === 400 || response.status === 422)
79
+ throw ToolError.validation(`Validation error: ${endpoint} — ${errorBody}`);
80
+ throw ToolError.internal(`API error (${response.status}): ${endpoint} — ${errorBody}`);
81
+ }
82
+ if (response.status === 204)
83
+ return {};
84
+ return (await response.json());
85
+ };
86
+ //# sourceMappingURL=asana-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asana-api.js","sourceRoot":"","sources":["../src/asana-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { OpenTabsPlugin } from '@opentabs-dev/plugin-sdk';
2
+ import type { ToolDefinition } from '@opentabs-dev/plugin-sdk';
3
+ declare class AsanaPlugin extends OpenTabsPlugin {
4
+ readonly name = "asana";
5
+ readonly description = "OpenTabs plugin for Asana";
6
+ readonly displayName = "Asana";
7
+ readonly urlPatterns: string[];
8
+ readonly homepage = "https://asana.com";
9
+ readonly tools: ToolDefinition[];
10
+ isReady(): Promise<boolean>;
11
+ }
12
+ declare const _default: AsanaPlugin;
13
+ export default _default;
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAuC/D,cAAM,WAAY,SAAQ,cAAc;IACtC,QAAQ,CAAC,IAAI,WAAW;IACxB,QAAQ,CAAC,WAAW,+BAA+B;IACnD,SAAkB,WAAW,WAAW;IACxC,QAAQ,CAAC,WAAW,WAA2B;IAC/C,SAAkB,QAAQ,uBAAuB;IACjD,QAAQ,CAAC,KAAK,EAAE,cAAc,EAAE,CAoC9B;IAEI,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;CAIlC;;AAED,wBAAiC"}
package/dist/index.js ADDED
@@ -0,0 +1,78 @@
1
+ import { OpenTabsPlugin } from '@opentabs-dev/plugin-sdk';
2
+ import { isAuthenticated, waitForAuth } from './asana-api.js';
3
+ // Tasks
4
+ import { getTask } from './tools/get-task.js';
5
+ import { createTask } from './tools/create-task.js';
6
+ import { updateTask } from './tools/update-task.js';
7
+ import { deleteTask } from './tools/delete-task.js';
8
+ import { searchTasks } from './tools/search-tasks.js';
9
+ import { getTasksForProject } from './tools/get-tasks-for-project.js';
10
+ import { getTasksForSection } from './tools/get-tasks-for-section.js';
11
+ import { getSubtasks } from './tools/get-subtasks.js';
12
+ import { addFollowers } from './tools/add-followers.js';
13
+ // Projects
14
+ import { listProjects } from './tools/list-projects.js';
15
+ import { getProject } from './tools/get-project.js';
16
+ import { createProject } from './tools/create-project.js';
17
+ import { updateProject } from './tools/update-project.js';
18
+ // Sections
19
+ import { listSections } from './tools/list-sections.js';
20
+ import { createSection } from './tools/create-section.js';
21
+ import { addTaskToSection } from './tools/add-task-to-section.js';
22
+ // Stories (comments)
23
+ import { getStoriesForTask } from './tools/get-stories-for-task.js';
24
+ import { createStory } from './tools/create-story.js';
25
+ // Users
26
+ import { getCurrentUser } from './tools/get-current-user.js';
27
+ import { getUser } from './tools/get-user.js';
28
+ import { listUsersForWorkspace } from './tools/list-users-for-workspace.js';
29
+ // Workspaces, Tags, Teams
30
+ import { listWorkspaces } from './tools/list-workspaces.js';
31
+ import { listTags } from './tools/list-tags.js';
32
+ import { listTeams } from './tools/list-teams.js';
33
+ class AsanaPlugin extends OpenTabsPlugin {
34
+ name = 'asana';
35
+ description = 'OpenTabs plugin for Asana';
36
+ displayName = 'Asana';
37
+ urlPatterns = ['*://app.asana.com/*'];
38
+ homepage = 'https://asana.com';
39
+ tools = [
40
+ // Tasks
41
+ getTask,
42
+ createTask,
43
+ updateTask,
44
+ deleteTask,
45
+ searchTasks,
46
+ getTasksForProject,
47
+ getTasksForSection,
48
+ getSubtasks,
49
+ addFollowers,
50
+ // Projects
51
+ listProjects,
52
+ getProject,
53
+ createProject,
54
+ updateProject,
55
+ // Sections
56
+ listSections,
57
+ createSection,
58
+ addTaskToSection,
59
+ // Stories (comments)
60
+ getStoriesForTask,
61
+ createStory,
62
+ // Users
63
+ getCurrentUser,
64
+ getUser,
65
+ listUsersForWorkspace,
66
+ // Workspaces, Tags, Teams
67
+ listWorkspaces,
68
+ listTags,
69
+ listTeams,
70
+ ];
71
+ async isReady() {
72
+ if (isAuthenticated())
73
+ return true;
74
+ return waitForAuth();
75
+ }
76
+ }
77
+ export default new AsanaPlugin();
78
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE9D,QAAQ;AACR,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,WAAW;AACX,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,WAAW;AACX,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAElE,qBAAqB;AACrB,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,QAAQ;AACR,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAE5E,0BAA0B;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,MAAM,WAAY,SAAQ,cAAc;IAC7B,IAAI,GAAG,OAAO,CAAC;IACf,WAAW,GAAG,2BAA2B,CAAC;IACjC,WAAW,GAAG,OAAO,CAAC;IAC/B,WAAW,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAC7B,QAAQ,GAAG,mBAAmB,CAAC;IACxC,KAAK,GAAqB;QACjC,QAAQ;QACR,OAAO;QACP,UAAU;QACV,UAAU;QACV,UAAU;QACV,WAAW;QACX,kBAAkB;QAClB,kBAAkB;QAClB,WAAW;QACX,YAAY;QAEZ,WAAW;QACX,YAAY;QACZ,UAAU;QACV,aAAa;QACb,aAAa;QAEb,WAAW;QACX,YAAY;QACZ,aAAa;QACb,gBAAgB;QAEhB,qBAAqB;QACrB,iBAAiB;QACjB,WAAW;QAEX,QAAQ;QACR,cAAc;QACd,OAAO;QACP,qBAAqB;QAErB,0BAA0B;QAC1B,cAAc;QACd,QAAQ;QACR,SAAS;KACV,CAAC;IAEF,KAAK,CAAC,OAAO;QACX,IAAI,eAAe,EAAE;YAAE,OAAO,IAAI,CAAC;QACnC,OAAO,WAAW,EAAE,CAAC;IACvB,CAAC;CACF;AAED,eAAe,IAAI,WAAW,EAAE,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { z } from 'zod';
2
+ export declare const addFollowers: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
3
+ task_gid: z.ZodString;
4
+ followers: z.ZodArray<z.ZodString>;
5
+ }, z.core.$strip>, z.ZodObject<{
6
+ task: z.ZodObject<{
7
+ gid: z.ZodString;
8
+ name: z.ZodString;
9
+ completed: z.ZodBoolean;
10
+ assignee_gid: z.ZodString;
11
+ assignee_name: z.ZodString;
12
+ due_on: z.ZodString;
13
+ due_at: z.ZodString;
14
+ start_on: z.ZodString;
15
+ notes: z.ZodString;
16
+ html_notes: z.ZodString;
17
+ projects: z.ZodArray<z.ZodObject<{
18
+ gid: z.ZodString;
19
+ name: z.ZodString;
20
+ }, z.core.$strip>>;
21
+ tags: z.ZodArray<z.ZodObject<{
22
+ gid: z.ZodString;
23
+ name: z.ZodString;
24
+ }, z.core.$strip>>;
25
+ parent_gid: z.ZodString;
26
+ num_subtasks: z.ZodNumber;
27
+ created_at: z.ZodString;
28
+ modified_at: z.ZodString;
29
+ permalink_url: z.ZodString;
30
+ resource_subtype: z.ZodString;
31
+ }, z.core.$strip>;
32
+ }, z.core.$strip>>;
33
+ //# sourceMappingURL=add-followers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-followers.d.ts","sourceRoot":"","sources":["../../src/tools/add-followers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAsBvB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { defineTool } from '@opentabs-dev/plugin-sdk';
2
+ import { z } from 'zod';
3
+ import { api } from '../asana-api.js';
4
+ import { TASK_OPT_FIELDS, mapTask, taskSchema } from './schemas.js';
5
+ export const addFollowers = defineTool({
6
+ name: 'add_followers',
7
+ displayName: 'Add Followers',
8
+ description: 'Add followers to a task. Followers receive notifications about task activity.',
9
+ summary: 'Add followers to a task',
10
+ icon: 'user-plus',
11
+ group: 'Tasks',
12
+ input: z.object({
13
+ task_gid: z.string().min(1).describe('Task GID to add followers to'),
14
+ followers: z.array(z.string().min(1)).min(1).describe('Array of user GIDs to add as followers'),
15
+ }),
16
+ output: z.object({
17
+ task: taskSchema.describe('The updated task'),
18
+ }),
19
+ handle: async (params) => {
20
+ const data = await api(`/tasks/${params.task_gid}/addFollowers`, {
21
+ method: 'POST',
22
+ body: { data: { followers: params.followers } },
23
+ query: { opt_fields: TASK_OPT_FIELDS },
24
+ });
25
+ return { task: mapTask(data.data) };
26
+ },
27
+ });
28
+ //# sourceMappingURL=add-followers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-followers.js","sourceRoot":"","sources":["../../src/tools/add-followers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAoC,eAAe,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEtG,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAC;IACrC,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE,eAAe;IAC5B,WAAW,EAAE,+EAA+E;IAC5F,OAAO,EAAE,yBAAyB;IAClC,IAAI,EAAE,WAAW;IACjB,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QACpE,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,wCAAwC,CAAC;KAChG,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,kBAAkB,CAAC;KAC9C,CAAC;IACF,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAyB,UAAU,MAAM,CAAC,QAAQ,eAAe,EAAE;YACvF,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,EAAE;YAC/C,KAAK,EAAE,EAAE,UAAU,EAAE,eAAe,EAAE;SACvC,CAAC,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACtC,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { z } from 'zod';
2
+ export declare const addTaskToSection: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
3
+ section_gid: z.ZodString;
4
+ task_gid: z.ZodString;
5
+ }, z.core.$strip>, z.ZodObject<{
6
+ success: z.ZodBoolean;
7
+ }, z.core.$strip>>;
8
+ //# sourceMappingURL=add-task-to-section.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-task-to-section.d.ts","sourceRoot":"","sources":["../../src/tools/add-task-to-section.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,gBAAgB;;;;;kBAsB3B,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { defineTool } from '@opentabs-dev/plugin-sdk';
2
+ import { z } from 'zod';
3
+ import { api } from '../asana-api.js';
4
+ export const addTaskToSection = defineTool({
5
+ name: 'add_task_to_section',
6
+ displayName: 'Add Task to Section',
7
+ description: 'Add a task to a specific section. The task will appear at the top of the section. A task can only be in one section of a given project at a time.',
8
+ summary: 'Move a task into a section',
9
+ icon: 'arrow-right',
10
+ group: 'Sections',
11
+ input: z.object({
12
+ section_gid: z.string().min(1).describe('Section GID to add the task to'),
13
+ task_gid: z.string().min(1).describe('Task GID to add to the section'),
14
+ }),
15
+ output: z.object({
16
+ success: z.boolean().describe('Whether the task was successfully added to the section'),
17
+ }),
18
+ handle: async (params) => {
19
+ await api(`/sections/${params.section_gid}/addTask`, {
20
+ method: 'POST',
21
+ body: { data: { task: params.task_gid } },
22
+ });
23
+ return { success: true };
24
+ },
25
+ });
26
+ //# sourceMappingURL=add-task-to-section.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-task-to-section.js","sourceRoot":"","sources":["../../src/tools/add-task-to-section.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAEtC,MAAM,CAAC,MAAM,gBAAgB,GAAG,UAAU,CAAC;IACzC,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EAAE,qBAAqB;IAClC,WAAW,EACT,mJAAmJ;IACrJ,OAAO,EAAE,4BAA4B;IACrC,IAAI,EAAE,aAAa;IACnB,KAAK,EAAE,UAAU;IACjB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,gCAAgC,CAAC;QACzE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,gCAAgC,CAAC;KACvE,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;KACxF,CAAC;IACF,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,GAAG,CAA0B,aAAa,MAAM,CAAC,WAAW,UAAU,EAAE;YAC5E,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE;SAC1C,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { z } from 'zod';
2
+ export declare const createProject: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
3
+ workspace_gid: z.ZodString;
4
+ name: z.ZodString;
5
+ notes: z.ZodOptional<z.ZodString>;
6
+ color: z.ZodOptional<z.ZodString>;
7
+ team: z.ZodOptional<z.ZodString>;
8
+ due_on: z.ZodOptional<z.ZodString>;
9
+ start_on: z.ZodOptional<z.ZodString>;
10
+ public: z.ZodOptional<z.ZodBoolean>;
11
+ }, z.core.$strip>, z.ZodObject<{
12
+ project: z.ZodObject<{
13
+ gid: z.ZodString;
14
+ name: z.ZodString;
15
+ archived: z.ZodBoolean;
16
+ color: z.ZodString;
17
+ notes: z.ZodString;
18
+ owner_gid: z.ZodString;
19
+ owner_name: z.ZodString;
20
+ team_gid: z.ZodString;
21
+ team_name: z.ZodString;
22
+ created_at: z.ZodString;
23
+ modified_at: z.ZodString;
24
+ due_on: z.ZodString;
25
+ start_on: z.ZodString;
26
+ permalink_url: z.ZodString;
27
+ public: z.ZodBoolean;
28
+ }, z.core.$strip>;
29
+ }, z.core.$strip>>;
30
+ //# sourceMappingURL=create-project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-project.d.ts","sourceRoot":"","sources":["../../src/tools/create-project.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAwCxB,CAAC"}
@@ -0,0 +1,50 @@
1
+ import { defineTool } from '@opentabs-dev/plugin-sdk';
2
+ import { z } from 'zod';
3
+ import { api } from '../asana-api.js';
4
+ import { PROJECT_OPT_FIELDS, mapProject, projectSchema } from './schemas.js';
5
+ export const createProject = defineTool({
6
+ name: 'create_project',
7
+ displayName: 'Create Project',
8
+ description: 'Create a new project in a workspace. Requires a workspace GID and project name. Optionally set notes, color, team, dates, and visibility.',
9
+ summary: 'Create a new project in a workspace',
10
+ icon: 'folder-plus',
11
+ group: 'Projects',
12
+ input: z.object({
13
+ workspace_gid: z.string().min(1).describe('Workspace GID to create the project in'),
14
+ name: z.string().min(1).describe('Project name'),
15
+ notes: z.string().optional().describe('Plain-text project description'),
16
+ color: z.string().optional().describe('Project color name (e.g. "light-green", "dark-blue")'),
17
+ team: z.string().optional().describe('Team GID to associate with the project'),
18
+ due_on: z.string().optional().describe('Project due date in YYYY-MM-DD format'),
19
+ start_on: z.string().optional().describe('Project start date in YYYY-MM-DD format'),
20
+ public: z.boolean().optional().describe('Whether the project is public to the workspace'),
21
+ }),
22
+ output: z.object({
23
+ project: projectSchema.describe('The created project'),
24
+ }),
25
+ handle: async (params) => {
26
+ const fields = {
27
+ workspace: params.workspace_gid,
28
+ name: params.name,
29
+ };
30
+ if (params.notes !== undefined)
31
+ fields.notes = params.notes;
32
+ if (params.color !== undefined)
33
+ fields.color = params.color;
34
+ if (params.team !== undefined)
35
+ fields.team = params.team;
36
+ if (params.due_on !== undefined)
37
+ fields.due_on = params.due_on;
38
+ if (params.start_on !== undefined)
39
+ fields.start_on = params.start_on;
40
+ if (params.public !== undefined)
41
+ fields.public = params.public;
42
+ const data = await api('/projects', {
43
+ method: 'POST',
44
+ body: { data: fields },
45
+ query: { opt_fields: PROJECT_OPT_FIELDS },
46
+ });
47
+ return { project: mapProject(data.data) };
48
+ },
49
+ });
50
+ //# sourceMappingURL=create-project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-project.js","sourceRoot":"","sources":["../../src/tools/create-project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { z } from 'zod';
2
+ export declare const createSection: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
3
+ project_gid: z.ZodString;
4
+ name: z.ZodString;
5
+ }, z.core.$strip>, z.ZodObject<{
6
+ section: z.ZodObject<{
7
+ gid: z.ZodString;
8
+ name: z.ZodString;
9
+ created_at: z.ZodString;
10
+ project_gid: z.ZodString;
11
+ }, z.core.$strip>;
12
+ }, z.core.$strip>>;
13
+ //# sourceMappingURL=create-section.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-section.d.ts","sourceRoot":"","sources":["../../src/tools/create-section.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,aAAa;;;;;;;;;;kBAsBxB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { defineTool } from '@opentabs-dev/plugin-sdk';
2
+ import { z } from 'zod';
3
+ import { api } from '../asana-api.js';
4
+ import { SECTION_OPT_FIELDS, mapSection, sectionSchema } from './schemas.js';
5
+ export const createSection = defineTool({
6
+ name: 'create_section',
7
+ displayName: 'Create Section',
8
+ description: 'Create a new section in a project. Sections organize tasks into groups.',
9
+ summary: 'Create a new section in a project',
10
+ icon: 'plus',
11
+ group: 'Sections',
12
+ input: z.object({
13
+ project_gid: z.string().min(1).describe('Project GID to create the section in'),
14
+ name: z.string().min(1).describe('Section name'),
15
+ }),
16
+ output: z.object({
17
+ section: sectionSchema.describe('The created section'),
18
+ }),
19
+ handle: async (params) => {
20
+ const data = await api(`/projects/${params.project_gid}/sections`, {
21
+ method: 'POST',
22
+ body: { data: { name: params.name } },
23
+ query: { opt_fields: SECTION_OPT_FIELDS },
24
+ });
25
+ return { section: mapSection(data.data) };
26
+ },
27
+ });
28
+ //# sourceMappingURL=create-section.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-section.js","sourceRoot":"","sources":["../../src/tools/create-section.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAuC,kBAAkB,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElH,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC;IACtC,IAAI,EAAE,gBAAgB;IACtB,WAAW,EAAE,gBAAgB;IAC7B,WAAW,EAAE,yEAAyE;IACtF,OAAO,EAAE,mCAAmC;IAC5C,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,UAAU;IACjB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,sCAAsC,CAAC;QAC/E,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC;KACjD,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,qBAAqB,CAAC;KACvD,CAAC;IACF,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,IAAI,GAAG,MAAM,GAAG,CAA4B,aAAa,MAAM,CAAC,WAAW,WAAW,EAAE;YAC5F,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE;YACrC,KAAK,EAAE,EAAE,UAAU,EAAE,kBAAkB,EAAE;SAC1C,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAC5C,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { z } from 'zod';
2
+ export declare const createStory: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
3
+ task_gid: z.ZodString;
4
+ text: z.ZodString;
5
+ }, z.core.$strip>, z.ZodObject<{
6
+ story: z.ZodObject<{
7
+ gid: z.ZodString;
8
+ text: z.ZodString;
9
+ created_by_gid: z.ZodString;
10
+ created_by_name: z.ZodString;
11
+ created_at: z.ZodString;
12
+ resource_subtype: z.ZodString;
13
+ type: z.ZodString;
14
+ }, z.core.$strip>;
15
+ }, z.core.$strip>>;
16
+ //# sourceMappingURL=create-story.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-story.d.ts","sourceRoot":"","sources":["../../src/tools/create-story.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,WAAW;;;;;;;;;;;;;kBAsBtB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { defineTool } from '@opentabs-dev/plugin-sdk';
2
+ import { z } from 'zod';
3
+ import { api } from '../asana-api.js';
4
+ import { STORY_OPT_FIELDS, mapStory, storySchema } from './schemas.js';
5
+ export const createStory = defineTool({
6
+ name: 'create_story',
7
+ displayName: 'Create Story',
8
+ description: 'Add a comment to a task.',
9
+ summary: 'Add a comment to a task',
10
+ icon: 'message-square-plus',
11
+ group: 'Stories',
12
+ input: z.object({
13
+ task_gid: z.string().min(1).describe('Task GID to add the comment to'),
14
+ text: z.string().min(1).describe('Comment text to post on the task'),
15
+ }),
16
+ output: z.object({
17
+ story: storySchema.describe('The created story'),
18
+ }),
19
+ handle: async (params) => {
20
+ const data = await api(`/tasks/${params.task_gid}/stories`, {
21
+ method: 'POST',
22
+ body: { data: { text: params.text } },
23
+ query: { opt_fields: STORY_OPT_FIELDS },
24
+ });
25
+ return { story: mapStory(data.data) };
26
+ },
27
+ });
28
+ //# sourceMappingURL=create-story.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-story.js","sourceRoot":"","sources":["../../src/tools/create-story.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAqC,gBAAgB,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE1G,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC;IACpC,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,cAAc;IAC3B,WAAW,EAAE,0BAA0B;IACvC,OAAO,EAAE,yBAAyB;IAClC,IAAI,EAAE,qBAAqB;IAC3B,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,gCAAgC,CAAC;QACtE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,kCAAkC,CAAC;KACrE,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,mBAAmB,CAAC;KACjD,CAAC;IACF,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,IAAI,GAAG,MAAM,GAAG,CAA0B,UAAU,MAAM,CAAC,QAAQ,UAAU,EAAE;YACnF,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE;YACrC,KAAK,EAAE,EAAE,UAAU,EAAE,gBAAgB,EAAE;SACxC,CAAC,CAAC;QACH,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACxC,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { z } from 'zod';
2
+ export declare const createTask: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
3
+ name: z.ZodString;
4
+ workspace: z.ZodString;
5
+ projects: z.ZodOptional<z.ZodArray<z.ZodString>>;
6
+ assignee: z.ZodOptional<z.ZodString>;
7
+ due_on: z.ZodOptional<z.ZodString>;
8
+ due_at: z.ZodOptional<z.ZodString>;
9
+ start_on: z.ZodOptional<z.ZodString>;
10
+ notes: z.ZodOptional<z.ZodString>;
11
+ parent: z.ZodOptional<z.ZodString>;
12
+ }, z.core.$strip>, z.ZodObject<{
13
+ task: z.ZodObject<{
14
+ gid: z.ZodString;
15
+ name: z.ZodString;
16
+ completed: z.ZodBoolean;
17
+ assignee_gid: z.ZodString;
18
+ assignee_name: z.ZodString;
19
+ due_on: z.ZodString;
20
+ due_at: z.ZodString;
21
+ start_on: z.ZodString;
22
+ notes: z.ZodString;
23
+ html_notes: z.ZodString;
24
+ projects: z.ZodArray<z.ZodObject<{
25
+ gid: z.ZodString;
26
+ name: z.ZodString;
27
+ }, z.core.$strip>>;
28
+ tags: z.ZodArray<z.ZodObject<{
29
+ gid: z.ZodString;
30
+ name: z.ZodString;
31
+ }, z.core.$strip>>;
32
+ parent_gid: z.ZodString;
33
+ num_subtasks: z.ZodNumber;
34
+ created_at: z.ZodString;
35
+ modified_at: z.ZodString;
36
+ permalink_url: z.ZodString;
37
+ resource_subtype: z.ZodString;
38
+ }, z.core.$strip>;
39
+ }, z.core.$strip>>;
40
+ //# sourceMappingURL=create-task.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-task.d.ts","sourceRoot":"","sources":["../../src/tools/create-task.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAyCrB,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { defineTool } from '@opentabs-dev/plugin-sdk';
2
+ import { z } from 'zod';
3
+ import { api } from '../asana-api.js';
4
+ import { TASK_OPT_FIELDS, mapTask, taskSchema } from './schemas.js';
5
+ export const createTask = defineTool({
6
+ name: 'create_task',
7
+ displayName: 'Create Task',
8
+ description: 'Create a new task in a workspace. Optionally assign to a project, user, or parent task.',
9
+ summary: 'Create a new task',
10
+ icon: 'plus',
11
+ group: 'Tasks',
12
+ input: z.object({
13
+ name: z.string().min(1).describe('Task name'),
14
+ workspace: z.string().min(1).describe('Workspace GID to create the task in'),
15
+ projects: z.array(z.string()).optional().describe('Project GIDs to add the task to'),
16
+ assignee: z.string().optional().describe('Assignee user GID'),
17
+ due_on: z.string().optional().describe('Due date in YYYY-MM-DD format'),
18
+ due_at: z.string().optional().describe('Due datetime in ISO 8601 format'),
19
+ start_on: z.string().optional().describe('Start date in YYYY-MM-DD format'),
20
+ notes: z.string().optional().describe('Plain-text task description'),
21
+ parent: z.string().optional().describe('Parent task GID to create as a subtask'),
22
+ }),
23
+ output: z.object({
24
+ task: taskSchema.describe('The created task'),
25
+ }),
26
+ handle: async (params) => {
27
+ const fields = {
28
+ name: params.name,
29
+ workspace: params.workspace,
30
+ };
31
+ if (params.projects !== undefined)
32
+ fields.projects = params.projects;
33
+ if (params.assignee !== undefined)
34
+ fields.assignee = params.assignee;
35
+ if (params.due_on !== undefined)
36
+ fields.due_on = params.due_on;
37
+ if (params.due_at !== undefined)
38
+ fields.due_at = params.due_at;
39
+ if (params.start_on !== undefined)
40
+ fields.start_on = params.start_on;
41
+ if (params.notes !== undefined)
42
+ fields.notes = params.notes;
43
+ if (params.parent !== undefined)
44
+ fields.parent = params.parent;
45
+ const data = await api('/tasks', {
46
+ method: 'POST',
47
+ body: { data: fields },
48
+ query: { opt_fields: TASK_OPT_FIELDS },
49
+ });
50
+ return { task: mapTask(data.data) };
51
+ },
52
+ });
53
+ //# sourceMappingURL=create-task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-task.js","sourceRoot":"","sources":["../../src/tools/create-task.ts"],"names":[],"mappings":"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"}