@grigoreo-dev/otask-mcp 1.2.1 → 1.4.0

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 (114) hide show
  1. package/README.md +49 -19
  2. package/dist/docs/parser.d.ts.map +1 -1
  3. package/dist/docs/parser.js +7 -5
  4. package/dist/docs/parser.js.map +1 -1
  5. package/dist/index.js +7 -5
  6. package/dist/index.js.map +1 -1
  7. package/dist/mcp-http.js +26 -10
  8. package/dist/mcp-http.js.map +1 -1
  9. package/dist/schemas/task.d.ts +27 -27
  10. package/dist/schemas/task.d.ts.map +1 -1
  11. package/dist/schemas/task.js +15 -32
  12. package/dist/schemas/task.js.map +1 -1
  13. package/dist/schemas/workspace.d.ts +48 -21
  14. package/dist/schemas/workspace.d.ts.map +1 -1
  15. package/dist/schemas/workspace.js +23 -8
  16. package/dist/schemas/workspace.js.map +1 -1
  17. package/dist/server.d.ts +2 -2
  18. package/dist/server.d.ts.map +1 -1
  19. package/dist/server.js +11 -4
  20. package/dist/server.js.map +1 -1
  21. package/dist/services/api.d.ts +3 -1
  22. package/dist/services/api.d.ts.map +1 -1
  23. package/dist/services/api.js +46 -2
  24. package/dist/services/api.js.map +1 -1
  25. package/dist/services/auth.d.ts.map +1 -1
  26. package/dist/services/auth.js +1 -3
  27. package/dist/services/auth.js.map +1 -1
  28. package/dist/services/client.d.ts +3 -1
  29. package/dist/services/client.d.ts.map +1 -1
  30. package/dist/services/client.js +3 -1
  31. package/dist/services/client.js.map +1 -1
  32. package/dist/services/due-filter.d.ts +27 -0
  33. package/dist/services/due-filter.d.ts.map +1 -0
  34. package/dist/services/due-filter.js +92 -0
  35. package/dist/services/due-filter.js.map +1 -0
  36. package/dist/services/me-cache.d.ts +14 -0
  37. package/dist/services/me-cache.d.ts.map +1 -0
  38. package/dist/services/me-cache.js +47 -0
  39. package/dist/services/me-cache.js.map +1 -0
  40. package/dist/services/project-guard.d.ts.map +1 -1
  41. package/dist/services/project-guard.js.map +1 -1
  42. package/dist/services/scope.d.ts +45 -0
  43. package/dist/services/scope.d.ts.map +1 -0
  44. package/dist/services/scope.js +146 -0
  45. package/dist/services/scope.js.map +1 -0
  46. package/dist/services/task-mapper.d.ts +4 -0
  47. package/dist/services/task-mapper.d.ts.map +1 -1
  48. package/dist/services/task-mapper.js +9 -0
  49. package/dist/services/task-mapper.js.map +1 -1
  50. package/dist/tools/add-comment.d.ts +1 -1
  51. package/dist/tools/add-comment.d.ts.map +1 -1
  52. package/dist/tools/add-comment.js +10 -9
  53. package/dist/tools/add-comment.js.map +1 -1
  54. package/dist/tools/archive-task.d.ts +1 -1
  55. package/dist/tools/archive-task.d.ts.map +1 -1
  56. package/dist/tools/archive-task.js +10 -9
  57. package/dist/tools/archive-task.js.map +1 -1
  58. package/dist/tools/create-task.d.ts +1 -1
  59. package/dist/tools/create-task.d.ts.map +1 -1
  60. package/dist/tools/create-task.js +8 -8
  61. package/dist/tools/create-task.js.map +1 -1
  62. package/dist/tools/get-task.d.ts +1 -1
  63. package/dist/tools/get-task.d.ts.map +1 -1
  64. package/dist/tools/get-task.js +6 -4
  65. package/dist/tools/get-task.js.map +1 -1
  66. package/dist/tools/list-board.d.ts +1 -1
  67. package/dist/tools/list-board.d.ts.map +1 -1
  68. package/dist/tools/list-board.js +14 -10
  69. package/dist/tools/list-board.js.map +1 -1
  70. package/dist/tools/list-comments.d.ts +1 -1
  71. package/dist/tools/list-comments.d.ts.map +1 -1
  72. package/dist/tools/list-comments.js +10 -9
  73. package/dist/tools/list-comments.js.map +1 -1
  74. package/dist/tools/list-members.d.ts +1 -1
  75. package/dist/tools/list-members.d.ts.map +1 -1
  76. package/dist/tools/list-members.js +6 -4
  77. package/dist/tools/list-members.js.map +1 -1
  78. package/dist/tools/list-project-tasks.d.ts +1 -1
  79. package/dist/tools/list-project-tasks.d.ts.map +1 -1
  80. package/dist/tools/list-project-tasks.js +8 -7
  81. package/dist/tools/list-project-tasks.js.map +1 -1
  82. package/dist/tools/list-projects.d.ts +1 -1
  83. package/dist/tools/list-projects.d.ts.map +1 -1
  84. package/dist/tools/list-projects.js +6 -4
  85. package/dist/tools/list-projects.js.map +1 -1
  86. package/dist/tools/list-tags.d.ts +1 -1
  87. package/dist/tools/list-tags.d.ts.map +1 -1
  88. package/dist/tools/list-tags.js +6 -4
  89. package/dist/tools/list-tags.js.map +1 -1
  90. package/dist/tools/list-tasks.d.ts +4 -0
  91. package/dist/tools/list-tasks.d.ts.map +1 -0
  92. package/dist/tools/list-tasks.js +113 -0
  93. package/dist/tools/list-tasks.js.map +1 -0
  94. package/dist/tools/me.d.ts +3 -0
  95. package/dist/tools/me.d.ts.map +1 -0
  96. package/dist/tools/me.js +36 -0
  97. package/dist/tools/me.js.map +1 -0
  98. package/dist/tools/move-task.d.ts +1 -1
  99. package/dist/tools/move-task.d.ts.map +1 -1
  100. package/dist/tools/move-task.js +11 -10
  101. package/dist/tools/move-task.js.map +1 -1
  102. package/dist/tools/registry.d.ts +3 -1
  103. package/dist/tools/registry.d.ts.map +1 -1
  104. package/dist/tools/registry.js +4 -0
  105. package/dist/tools/registry.js.map +1 -1
  106. package/dist/tools/types.d.ts +7 -0
  107. package/dist/tools/types.d.ts.map +1 -1
  108. package/dist/tools/update-task.d.ts +1 -1
  109. package/dist/tools/update-task.d.ts.map +1 -1
  110. package/dist/tools/update-task.js +20 -33
  111. package/dist/tools/update-task.js.map +1 -1
  112. package/dist/types.d.ts +16 -0
  113. package/dist/types.d.ts.map +1 -1
  114. package/package.json +5 -2
@@ -1 +1 @@
1
- {"version":3,"file":"list-board.d.ts","sourceRoot":"","sources":["../../src/tools/list-board.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EACpB,MAAM,yBAAyB,CAAC;AAIjC,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,mBAAmB,CAAC,EAClC,GAAG,EACH,KAAK,GACN,EAAE,QAAQ,GAAG,cAAc,CAAC,cAAc,CAAC,CA8D3C"}
1
+ {"version":3,"file":"list-board.d.ts","sourceRoot":"","sources":["../../src/tools/list-board.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAwB,MAAM,yBAAyB,CAAC;AAIpF,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,mBAAmB,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,QAAQ,GAAG,cAAc,CAAC,cAAc,CAAC,CA6D5F"}
@@ -1,8 +1,8 @@
1
- import { ListBoardInputSchema, } from "../schemas/workspace.js";
2
- import { assertProjectSlugAllowed } from "../services/project-guard.js";
1
+ import { ListBoardInputSchema } from "../schemas/workspace.js";
2
+ import { resolveProjectSlug, resolveWsSlug } from "../services/scope.js";
3
3
  import { compactBoard, compactColumn } from "../services/task-mapper.js";
4
4
  import { jsonToolResult, toolError } from "./helpers.js";
5
- export function createListBoardTool({ api, guard, }) {
5
+ export function createListBoardTool({ api, scope }) {
6
6
  return {
7
7
  name: "otask_list_board",
8
8
  config: {
@@ -10,10 +10,12 @@ export function createListBoardTool({ api, guard, }) {
10
10
  description: `List boards and columns for a project (statuses). Project must be on the allow-list when configured.
11
11
 
12
12
  Use before create/move to discover board_id and board_column_id.
13
+ API requires type=status (defaulted by this tool).
13
14
 
14
15
  Args:
15
- - ws_slug, project_slug: UUIDs from panel.otask.ru
16
- - type, board_slug: optional filters
16
+ - ws_slug, project_slug: optional if defaults set
17
+ - type: defaults to "status"
18
+ - board_slug: optional specific board
17
19
 
18
20
  Returns compact boards and columns (id, name, slug?, color?, board_id?).
19
21
 
@@ -28,11 +30,13 @@ Docs: https://api.otask.ru/docs`,
28
30
  },
29
31
  handler: async ({ ws_slug, project_slug, type, board_slug }) => {
30
32
  try {
31
- await assertProjectSlugAllowed(guard, () => api.listProjects(ws_slug), project_slug);
32
- const query = type !== undefined || board_slug !== undefined
33
- ? { type, board_slug }
34
- : undefined;
35
- const result = await api.listBoard(ws_slug, project_slug, query);
33
+ const ws = resolveWsSlug(ws_slug, scope);
34
+ const project = await resolveProjectSlug(project_slug, scope, () => api.listProjects(ws));
35
+ const query = {
36
+ type: type ?? "status",
37
+ ...(board_slug !== undefined ? { board_slug } : {}),
38
+ };
39
+ const result = await api.listBoard(ws, project, query);
36
40
  const boards = result.boards.map((b) => compactBoard(b));
37
41
  const columns = result.columns.map((c) => compactColumn(c));
38
42
  const payload = {
@@ -1 +1 @@
1
- {"version":3,"file":"list-board.js","sourceRoot":"","sources":["../../src/tools/list-board.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,GAErB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,mBAAmB,CAAC,EAClC,GAAG,EACH,KAAK,GACI;IACT,OAAO;QACL,IAAI,EAAE,kBAAkB;QACxB,MAAM,EAAE;YACN,KAAK,EAAE,mBAAmB;YAC1B,WAAW,EAAE;;;;;;;;;;gCAUa;YAC1B,WAAW,EAAE,oBAAoB;YACjC,WAAW,EAAE;gBACX,YAAY,EAAE,IAAI;gBAClB,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,IAAI;aACpB;SACF;QACD,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE;YAC7D,IAAI,CAAC;gBACH,MAAM,wBAAwB,CAC5B,KAAK,EACL,GAAG,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,EAC/B,YAAY,CACb,CAAC;gBACF,MAAM,KAAK,GACT,IAAI,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS;oBAC5C,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE;oBACtB,CAAC,CAAC,SAAS,CAAC;gBAChB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;gBACjE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACrC,YAAY,CAAC,CAAgE,CAAC,CAC/E,CAAC;gBACF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACvC,aAAa,CACX,CAMC,CACF,CACF,CAAC;gBACF,MAAM,OAAO,GAAG;oBACd,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,cAAc,OAAO,CAAC,MAAM,YAAY;oBACjE,MAAM;oBACN,OAAO;oBACP,IAAI,EAAE,IAAI;iBACX,CAAC;gBACF,OAAO,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC1C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"list-board.js","sourceRoot":"","sources":["../../src/tools/list-board.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACpF,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,mBAAmB,CAAC,EAAE,GAAG,EAAE,KAAK,EAAY;IAC1D,OAAO;QACL,IAAI,EAAE,kBAAkB;QACxB,MAAM,EAAE;YACN,KAAK,EAAE,mBAAmB;YAC1B,WAAW,EAAE;;;;;;;;;;;;gCAYa;YAC1B,WAAW,EAAE,oBAAoB;YACjC,WAAW,EAAE;gBACX,YAAY,EAAE,IAAI;gBAClB,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,IAAI;aACpB;SACF;QACD,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE;YAC7D,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBACzC,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,YAAY,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC1F,MAAM,KAAK,GAAG;oBACZ,IAAI,EAAE,IAAI,IAAI,QAAQ;oBACtB,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACpD,CAAC;gBACF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;gBACvD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACrC,YAAY,CAAC,CAAgE,CAAC,CAC/E,CAAC;gBACF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACvC,aAAa,CACX,CAMC,CACF,CACF,CAAC;gBACF,MAAM,OAAO,GAAG;oBACd,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,cAAc,OAAO,CAAC,MAAM,YAAY;oBACjE,MAAM;oBACN,OAAO;oBACP,IAAI,EAAE,IAAI;iBACX,CAAC;gBACF,OAAO,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC1C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1,4 +1,4 @@
1
1
  import { type ListCommentsInput } from "../schemas/task.js";
2
2
  import type { ToolDefinition, ToolDeps } from "./types.js";
3
- export declare function createListCommentsTool({ api, guard, }: ToolDeps): ToolDefinition<ListCommentsInput>;
3
+ export declare function createListCommentsTool({ api, guard, scope, }: ToolDeps): ToolDefinition<ListCommentsInput>;
4
4
  //# sourceMappingURL=list-comments.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"list-comments.d.ts","sourceRoot":"","sources":["../../src/tools/list-comments.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,sBAAsB,CAAC,EACrC,GAAG,EACH,KAAK,GACN,EAAE,QAAQ,GAAG,cAAc,CAAC,iBAAiB,CAAC,CAyC9C"}
1
+ {"version":3,"file":"list-comments.d.ts","sourceRoot":"","sources":["../../src/tools/list-comments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAA2B,MAAM,oBAAoB,CAAC;AAIrF,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,sBAAsB,CAAC,EACrC,GAAG,EACH,KAAK,EACL,KAAK,GACN,EAAE,QAAQ,GAAG,cAAc,CAAC,iBAAiB,CAAC,CAyC9C"}
@@ -1,7 +1,8 @@
1
- import { ListCommentsInputSchema, } from "../schemas/task.js";
1
+ import { ListCommentsInputSchema } from "../schemas/task.js";
2
2
  import { assertProjectIdAllowed } from "../services/project-guard.js";
3
+ import { resolveWsSlug } from "../services/scope.js";
3
4
  import { jsonToolResult, toolError } from "./helpers.js";
4
- export function createListCommentsTool({ api, guard, }) {
5
+ export function createListCommentsTool({ api, guard, scope, }) {
5
6
  return {
6
7
  name: "otask_list_comments",
7
8
  config: {
@@ -9,7 +10,8 @@ export function createListCommentsTool({ api, guard, }) {
9
10
  description: `List comments on a task. Fetches the task first to enforce project allow-list.
10
11
 
11
12
  Args:
12
- - ws_slug, task_slug: task identity
13
+ - ws_slug: optional if OTASK_DEFAULT_WS is set
14
+ - task_slug: task identity
13
15
 
14
16
  Returns API comments payload.
15
17
 
@@ -24,12 +26,11 @@ Docs: https://api.otask.ru/docs`,
24
26
  },
25
27
  handler: async ({ ws_slug, task_slug }) => {
26
28
  try {
27
- const current = await api.getTask(ws_slug, task_slug);
28
- const projectSlug = typeof current.project_slug === "string"
29
- ? current.project_slug
30
- : undefined;
31
- await assertProjectIdAllowed(guard, () => api.listProjects(ws_slug), current.project_id, projectSlug);
32
- const data = await api.listComments(ws_slug, task_slug);
29
+ const ws = resolveWsSlug(ws_slug, scope);
30
+ const current = await api.getTask(ws, task_slug);
31
+ const projectSlug = typeof current.project_slug === "string" ? current.project_slug : undefined;
32
+ await assertProjectIdAllowed(guard, () => api.listProjects(ws), current.project_id, projectSlug);
33
+ const data = await api.listComments(ws, task_slug);
33
34
  return jsonToolResult(data, data);
34
35
  }
35
36
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"list-comments.js","sourceRoot":"","sources":["../../src/tools/list-comments.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,GAExB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,sBAAsB,CAAC,EACrC,GAAG,EACH,KAAK,GACI;IACT,OAAO;QACL,IAAI,EAAE,qBAAqB;QAC3B,MAAM,EAAE;YACN,KAAK,EAAE,2BAA2B;YAClC,WAAW,EAAE;;;;;;;gCAOa;YAC1B,WAAW,EAAE,uBAAuB;YACpC,WAAW,EAAE;gBACX,YAAY,EAAE,IAAI;gBAClB,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,IAAI;aACpB;SACF;QACD,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;YACxC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;gBACtD,MAAM,WAAW,GACf,OAAO,OAAO,CAAC,YAAY,KAAK,QAAQ;oBACtC,CAAC,CAAC,OAAO,CAAC,YAAY;oBACtB,CAAC,CAAC,SAAS,CAAC;gBAChB,MAAM,sBAAsB,CAC1B,KAAK,EACL,GAAG,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,EAC/B,OAAO,CAAC,UAAU,EAClB,WAAW,CACZ,CAAC;gBACF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;gBACxD,OAAO,cAAc,CAAC,IAAI,EAAE,IAA+B,CAAC,CAAC;YAC/D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"list-comments.js","sourceRoot":"","sources":["../../src/tools/list-comments.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,sBAAsB,CAAC,EACrC,GAAG,EACH,KAAK,EACL,KAAK,GACI;IACT,OAAO;QACL,IAAI,EAAE,qBAAqB;QAC3B,MAAM,EAAE;YACN,KAAK,EAAE,2BAA2B;YAClC,WAAW,EAAE;;;;;;;;gCAQa;YAC1B,WAAW,EAAE,uBAAuB;YACpC,WAAW,EAAE;gBACX,YAAY,EAAE,IAAI;gBAClB,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,IAAI;aACpB;SACF;QACD,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;YACxC,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBACzC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;gBACjD,MAAM,WAAW,GACf,OAAO,OAAO,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC9E,MAAM,sBAAsB,CAC1B,KAAK,EACL,GAAG,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,EAC1B,OAAO,CAAC,UAAU,EAClB,WAAW,CACZ,CAAC;gBACF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;gBACnD,OAAO,cAAc,CAAC,IAAI,EAAE,IAA+B,CAAC,CAAC;YAC/D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1,4 +1,4 @@
1
1
  import { type WsSlugInput } from "../schemas/workspace.js";
2
2
  import type { ToolDefinition, ToolDeps } from "./types.js";
3
- export declare function createListMembersTool({ api, }: ToolDeps): ToolDefinition<WsSlugInput>;
3
+ export declare function createListMembersTool({ api, scope }: ToolDeps): ToolDefinition<WsSlugInput>;
4
4
  //# sourceMappingURL=list-members.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"list-members.d.ts","sourceRoot":"","sources":["../../src/tools/list-members.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,yBAAyB,CAAC;AAIjC,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,qBAAqB,CAAC,EACpC,GAAG,GACJ,EAAE,QAAQ,GAAG,cAAc,CAAC,WAAW,CAAC,CA0CxC"}
1
+ {"version":3,"file":"list-members.d.ts","sourceRoot":"","sources":["../../src/tools/list-members.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAgB,MAAM,yBAAyB,CAAC;AAKzE,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,qBAAqB,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,QAAQ,GAAG,cAAc,CAAC,WAAW,CAAC,CA2C3F"}
@@ -1,8 +1,9 @@
1
- import { WsSlugSchema, } from "../schemas/workspace.js";
1
+ import { WsSlugSchema } from "../schemas/workspace.js";
2
2
  import { agentListResult } from "../services/format.js";
3
+ import { resolveWsSlug } from "../services/scope.js";
3
4
  import { compactMember } from "../services/task-mapper.js";
4
5
  import { jsonToolResult, toolError } from "./helpers.js";
5
- export function createListMembersTool({ api, }) {
6
+ export function createListMembersTool({ api, scope }) {
6
7
  return {
7
8
  name: "otask_list_members",
8
9
  config: {
@@ -10,7 +11,7 @@ export function createListMembersTool({ api, }) {
10
11
  description: `List workspace members (performers for assignment).
11
12
 
12
13
  Args:
13
- - ws_slug: Workspace UUID from panel.otask.ru
14
+ - ws_slug: optional if OTASK_DEFAULT_WS is set
14
15
 
15
16
  Returns compact members: id, name, email, status_text.
16
17
 
@@ -25,7 +26,8 @@ Docs: https://api.otask.ru/docs`,
25
26
  },
26
27
  handler: async ({ ws_slug }) => {
27
28
  try {
28
- const members = await api.listMembers(ws_slug);
29
+ const ws = resolveWsSlug(ws_slug, scope);
30
+ const members = await api.listMembers(ws);
29
31
  const items = members.map((m) => compactMember((m ?? {})));
30
32
  const payload = agentListResult(`${items.length} member(s)`, items);
31
33
  return jsonToolResult(payload, payload);
@@ -1 +1 @@
1
- {"version":3,"file":"list-members.js","sourceRoot":"","sources":["../../src/tools/list-members.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,GAEb,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,qBAAqB,CAAC,EACpC,GAAG,GACM;IACT,OAAO;QACL,IAAI,EAAE,oBAAoB;QAC1B,MAAM,EAAE;YACN,KAAK,EAAE,qBAAqB;YAC5B,WAAW,EAAE;;;;;;;gCAOa;YAC1B,WAAW,EAAE,YAAY;YACzB,WAAW,EAAE;gBACX,YAAY,EAAE,IAAI;gBAClB,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,IAAI;aACpB;SACF;QACD,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YAC7B,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC9B,aAAa,CACX,CAAC,CAAC,IAAI,EAAE,CAMP,CACF,CACF,CAAC;gBACF,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,KAAK,CAAC,MAAM,YAAY,EAAE,KAAK,CAAC,CAAC;gBACpE,OAAO,cAAc,CAAC,OAAO,EAAE,OAA6C,CAAC,CAAC;YAChF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"list-members.js","sourceRoot":"","sources":["../../src/tools/list-members.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,qBAAqB,CAAC,EAAE,GAAG,EAAE,KAAK,EAAY;IAC5D,OAAO;QACL,IAAI,EAAE,oBAAoB;QAC1B,MAAM,EAAE;YACN,KAAK,EAAE,qBAAqB;YAC5B,WAAW,EAAE;;;;;;;gCAOa;YAC1B,WAAW,EAAE,YAAY;YACzB,WAAW,EAAE;gBACX,YAAY,EAAE,IAAI;gBAClB,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,IAAI;aACpB;SACF;QACD,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YAC7B,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBACzC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;gBAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC9B,aAAa,CACX,CAAC,CAAC,IAAI,EAAE,CAMP,CACF,CACF,CAAC;gBACF,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,KAAK,CAAC,MAAM,YAAY,EAAE,KAAK,CAAC,CAAC;gBACpE,OAAO,cAAc,CAAC,OAAO,EAAE,OAA6C,CAAC,CAAC;YAChF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1,4 +1,4 @@
1
1
  import { type ListProjectTasksInput } from "../schemas/workspace.js";
2
2
  import type { ToolDefinition, ToolDeps } from "./types.js";
3
- export declare function createListProjectTasksTool({ api, guard, }: ToolDeps): ToolDefinition<ListProjectTasksInput>;
3
+ export declare function createListProjectTasksTool({ api, scope, }: ToolDeps): ToolDefinition<ListProjectTasksInput>;
4
4
  //# sourceMappingURL=list-project-tasks.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"list-project-tasks.d.ts","sourceRoot":"","sources":["../../src/tools/list-project-tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,yBAAyB,CAAC;AAKjC,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,0BAA0B,CAAC,EACzC,GAAG,EACH,KAAK,GACN,EAAE,QAAQ,GAAG,cAAc,CAAC,qBAAqB,CAAC,CA2DlD"}
1
+ {"version":3,"file":"list-project-tasks.d.ts","sourceRoot":"","sources":["../../src/tools/list-project-tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,qBAAqB,EAA+B,MAAM,yBAAyB,CAAC;AAKlG,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,0BAA0B,CAAC,EACzC,GAAG,EACH,KAAK,GACN,EAAE,QAAQ,GAAG,cAAc,CAAC,qBAAqB,CAAC,CAyClD"}
@@ -1,9 +1,9 @@
1
- import { ListProjectTasksInputSchema, } from "../schemas/workspace.js";
1
+ import { ListProjectTasksInputSchema } from "../schemas/workspace.js";
2
2
  import { agentListResult } from "../services/format.js";
3
- import { assertProjectSlugAllowed } from "../services/project-guard.js";
3
+ import { resolveProjectSlug, resolveWsSlug } from "../services/scope.js";
4
4
  import { compactTask } from "../services/task-mapper.js";
5
5
  import { jsonToolResult, toolError } from "./helpers.js";
6
- export function createListProjectTasksTool({ api, guard, }) {
6
+ export function createListProjectTasksTool({ api, scope, }) {
7
7
  return {
8
8
  name: "otask_list_project_tasks",
9
9
  config: {
@@ -11,7 +11,7 @@ export function createListProjectTasksTool({ api, guard, }) {
11
11
  description: `List tasks in a project. Project must be on the allow-list when configured.
12
12
 
13
13
  Args:
14
- - ws_slug, project_slug: UUIDs from panel.otask.ru
14
+ - ws_slug, project_slug: optional if OTASK_DEFAULT_WS / OTASK_DEFAULT_PROJECT set
15
15
  - page, status_id, board_id, board_column_id: optional filters
16
16
 
17
17
  Returns compact tasks via agent list envelope.
@@ -25,9 +25,10 @@ Docs: https://api.otask.ru/docs`,
25
25
  openWorldHint: true,
26
26
  },
27
27
  },
28
- handler: async ({ ws_slug, project_slug, page, status_id, board_id, board_column_id, }) => {
28
+ handler: async ({ ws_slug, project_slug, page, status_id, board_id, board_column_id }) => {
29
29
  try {
30
- await assertProjectSlugAllowed(guard, () => api.listProjects(ws_slug), project_slug);
30
+ const ws = resolveWsSlug(ws_slug, scope);
31
+ const project = await resolveProjectSlug(project_slug, scope, () => api.listProjects(ws));
31
32
  const query = {};
32
33
  if (page !== undefined)
33
34
  query.page = page;
@@ -38,7 +39,7 @@ Docs: https://api.otask.ru/docs`,
38
39
  if (board_column_id !== undefined)
39
40
  query.board_column_id = board_column_id;
40
41
  const hasQuery = Object.keys(query).length > 0;
41
- const result = await api.listProjectTasks(ws_slug, project_slug, hasQuery ? query : undefined);
42
+ const result = await api.listProjectTasks(ws, project, hasQuery ? query : undefined);
42
43
  const items = result.tasks.map((t) => compactTask(t));
43
44
  const payload = agentListResult(`${items.length} task(s)`, items, result.meta);
44
45
  return jsonToolResult(payload, payload);
@@ -1 +1 @@
1
- {"version":3,"file":"list-project-tasks.js","sourceRoot":"","sources":["../../src/tools/list-project-tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,GAE5B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,0BAA0B,CAAC,EACzC,GAAG,EACH,KAAK,GACI;IACT,OAAO;QACL,IAAI,EAAE,0BAA0B;QAChC,MAAM,EAAE;YACN,KAAK,EAAE,2BAA2B;YAClC,WAAW,EAAE;;;;;;;;gCAQa;YAC1B,WAAW,EAAE,2BAA2B;YACxC,WAAW,EAAE;gBACX,YAAY,EAAE,IAAI;gBAClB,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,IAAI;aACpB;SACF;QACD,OAAO,EAAE,KAAK,EAAE,EACd,OAAO,EACP,YAAY,EACZ,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,eAAe,GAChB,EAAE,EAAE;YACH,IAAI,CAAC;gBACH,MAAM,wBAAwB,CAC5B,KAAK,EACL,GAAG,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,EAC/B,YAAY,CACb,CAAC;gBACF,MAAM,KAAK,GAAgD,EAAE,CAAC;gBAC9D,IAAI,IAAI,KAAK,SAAS;oBAAE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;gBAC1C,IAAI,SAAS,KAAK,SAAS;oBAAE,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;gBACzD,IAAI,QAAQ,KAAK,SAAS;oBAAE,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;gBACtD,IAAI,eAAe,KAAK,SAAS;oBAAE,KAAK,CAAC,eAAe,GAAG,eAAe,CAAC;gBAC3E,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC/C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,gBAAgB,CACvC,OAAO,EACP,YAAY,EACZ,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAC7B,CAAC;gBACF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtD,MAAM,OAAO,GAAG,eAAe,CAC7B,GAAG,KAAK,CAAC,MAAM,UAAU,EACzB,KAAK,EACL,MAAM,CAAC,IAAI,CACZ,CAAC;gBACF,OAAO,cAAc,CAAC,OAAO,EAAE,OAA6C,CAAC,CAAC;YAChF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"list-project-tasks.js","sourceRoot":"","sources":["../../src/tools/list-project-tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AAClG,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,0BAA0B,CAAC,EACzC,GAAG,EACH,KAAK,GACI;IACT,OAAO;QACL,IAAI,EAAE,0BAA0B;QAChC,MAAM,EAAE;YACN,KAAK,EAAE,2BAA2B;YAClC,WAAW,EAAE;;;;;;;;gCAQa;YAC1B,WAAW,EAAE,2BAA2B;YACxC,WAAW,EAAE;gBACX,YAAY,EAAE,IAAI;gBAClB,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,IAAI;aACpB;SACF;QACD,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,EAAE,EAAE;YACvF,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBACzC,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,YAAY,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC1F,MAAM,KAAK,GAAgD,EAAE,CAAC;gBAC9D,IAAI,IAAI,KAAK,SAAS;oBAAE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;gBAC1C,IAAI,SAAS,KAAK,SAAS;oBAAE,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;gBACzD,IAAI,QAAQ,KAAK,SAAS;oBAAE,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;gBACtD,IAAI,eAAe,KAAK,SAAS;oBAAE,KAAK,CAAC,eAAe,GAAG,eAAe,CAAC;gBAC3E,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC/C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,gBAAgB,CAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBACrF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtD,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,KAAK,CAAC,MAAM,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC/E,OAAO,cAAc,CAAC,OAAO,EAAE,OAA6C,CAAC,CAAC;YAChF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1,4 +1,4 @@
1
1
  import { type WsSlugInput } from "../schemas/workspace.js";
2
2
  import type { ToolDefinition, ToolDeps } from "./types.js";
3
- export declare function createListProjectsTool({ api, guard, }: ToolDeps): ToolDefinition<WsSlugInput>;
3
+ export declare function createListProjectsTool({ api, guard, scope, }: ToolDeps): ToolDefinition<WsSlugInput>;
4
4
  //# sourceMappingURL=list-projects.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"list-projects.d.ts","sourceRoot":"","sources":["../../src/tools/list-projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,yBAAyB,CAAC;AAIjC,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,sBAAsB,CAAC,EACrC,GAAG,EACH,KAAK,GACN,EAAE,QAAQ,GAAG,cAAc,CAAC,WAAW,CAAC,CAoCxC"}
1
+ {"version":3,"file":"list-projects.d.ts","sourceRoot":"","sources":["../../src/tools/list-projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAgB,MAAM,yBAAyB,CAAC;AAKzE,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,sBAAsB,CAAC,EACrC,GAAG,EACH,KAAK,EACL,KAAK,GACN,EAAE,QAAQ,GAAG,cAAc,CAAC,WAAW,CAAC,CAkCxC"}
@@ -1,8 +1,9 @@
1
- import { WsSlugSchema, } from "../schemas/workspace.js";
1
+ import { WsSlugSchema } from "../schemas/workspace.js";
2
2
  import { agentListResult } from "../services/format.js";
3
+ import { resolveWsSlug } from "../services/scope.js";
3
4
  import { compactProject } from "../services/task-mapper.js";
4
5
  import { jsonToolResult, toolError } from "./helpers.js";
5
- export function createListProjectsTool({ api, guard, }) {
6
+ export function createListProjectsTool({ api, guard, scope, }) {
6
7
  return {
7
8
  name: "otask_list_projects",
8
9
  config: {
@@ -10,7 +11,7 @@ export function createListProjectsTool({ api, guard, }) {
10
11
  description: `List projects in a workspace. Results are filtered by the project allow-list when configured.
11
12
 
12
13
  Args:
13
- - ws_slug: Workspace UUID from panel.otask.ru
14
+ - ws_slug: optional if OTASK_DEFAULT_WS is set
14
15
 
15
16
  Returns compact projects: id, slug, name, status_id.
16
17
 
@@ -25,7 +26,8 @@ Docs: https://api.otask.ru/docs`,
25
26
  },
26
27
  handler: async ({ ws_slug }) => {
27
28
  try {
28
- const projects = await api.listProjects(ws_slug);
29
+ const ws = resolveWsSlug(ws_slug, scope);
30
+ const projects = await api.listProjects(ws);
29
31
  const allowed = guard.filterProjects(projects);
30
32
  const items = allowed.map((p) => compactProject(p));
31
33
  const payload = agentListResult(`${items.length} project(s)`, items);
@@ -1 +1 @@
1
- {"version":3,"file":"list-projects.js","sourceRoot":"","sources":["../../src/tools/list-projects.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,GAEb,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,sBAAsB,CAAC,EACrC,GAAG,EACH,KAAK,GACI;IACT,OAAO;QACL,IAAI,EAAE,qBAAqB;QAC3B,MAAM,EAAE;YACN,KAAK,EAAE,sBAAsB;YAC7B,WAAW,EAAE;;;;;;;gCAOa;YAC1B,WAAW,EAAE,YAAY;YACzB,WAAW,EAAE;gBACX,YAAY,EAAE,IAAI;gBAClB,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,IAAI;aACpB;SACF;QACD,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YAC7B,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;gBACjD,MAAM,OAAO,GAAG,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;gBAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpD,MAAM,OAAO,GAAG,eAAe,CAC7B,GAAG,KAAK,CAAC,MAAM,aAAa,EAC5B,KAAK,CACN,CAAC;gBACF,OAAO,cAAc,CAAC,OAAO,EAAE,OAA6C,CAAC,CAAC;YAChF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"list-projects.js","sourceRoot":"","sources":["../../src/tools/list-projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,sBAAsB,CAAC,EACrC,GAAG,EACH,KAAK,EACL,KAAK,GACI;IACT,OAAO;QACL,IAAI,EAAE,qBAAqB;QAC3B,MAAM,EAAE;YACN,KAAK,EAAE,sBAAsB;YAC7B,WAAW,EAAE;;;;;;;gCAOa;YAC1B,WAAW,EAAE,YAAY;YACzB,WAAW,EAAE;gBACX,YAAY,EAAE,IAAI;gBAClB,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,IAAI;aACpB;SACF;QACD,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YAC7B,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBACzC,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;gBAC5C,MAAM,OAAO,GAAG,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;gBAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpD,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,KAAK,CAAC,MAAM,aAAa,EAAE,KAAK,CAAC,CAAC;gBACrE,OAAO,cAAc,CAAC,OAAO,EAAE,OAA6C,CAAC,CAAC;YAChF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1,4 +1,4 @@
1
1
  import { type WsSlugInput } from "../schemas/workspace.js";
2
2
  import type { ToolDefinition, ToolDeps } from "./types.js";
3
- export declare function createListTagsTool({ api, }: ToolDeps): ToolDefinition<WsSlugInput>;
3
+ export declare function createListTagsTool({ api, scope }: ToolDeps): ToolDefinition<WsSlugInput>;
4
4
  //# sourceMappingURL=list-tags.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"list-tags.d.ts","sourceRoot":"","sources":["../../src/tools/list-tags.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,yBAAyB,CAAC;AAIjC,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,kBAAkB,CAAC,EACjC,GAAG,GACJ,EAAE,QAAQ,GAAG,cAAc,CAAC,WAAW,CAAC,CAkCxC"}
1
+ {"version":3,"file":"list-tags.d.ts","sourceRoot":"","sources":["../../src/tools/list-tags.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAgB,MAAM,yBAAyB,CAAC;AAKzE,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,kBAAkB,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,QAAQ,GAAG,cAAc,CAAC,WAAW,CAAC,CAmCxF"}
@@ -1,8 +1,9 @@
1
- import { WsSlugSchema, } from "../schemas/workspace.js";
1
+ import { WsSlugSchema } from "../schemas/workspace.js";
2
2
  import { agentListResult } from "../services/format.js";
3
+ import { resolveWsSlug } from "../services/scope.js";
3
4
  import { compactTag } from "../services/task-mapper.js";
4
5
  import { jsonToolResult, toolError } from "./helpers.js";
5
- export function createListTagsTool({ api, }) {
6
+ export function createListTagsTool({ api, scope }) {
6
7
  return {
7
8
  name: "otask_list_tags",
8
9
  config: {
@@ -10,7 +11,7 @@ export function createListTagsTool({ api, }) {
10
11
  description: `List workspace tags for labeling tasks.
11
12
 
12
13
  Args:
13
- - ws_slug: Workspace UUID from panel.otask.ru
14
+ - ws_slug: optional if OTASK_DEFAULT_WS is set
14
15
 
15
16
  Returns compact tags (id, name, slug?, color?) as agent list envelope.
16
17
 
@@ -25,7 +26,8 @@ Docs: https://api.otask.ru/docs`,
25
26
  },
26
27
  handler: async ({ ws_slug }) => {
27
28
  try {
28
- const tags = await api.listTags(ws_slug);
29
+ const ws = resolveWsSlug(ws_slug, scope);
30
+ const tags = await api.listTags(ws);
29
31
  const items = tags.map((t) => compactTag(t));
30
32
  const payload = agentListResult(`${items.length} tag(s)`, items);
31
33
  return jsonToolResult(payload, payload);
@@ -1 +1 @@
1
- {"version":3,"file":"list-tags.js","sourceRoot":"","sources":["../../src/tools/list-tags.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,GAEb,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,kBAAkB,CAAC,EACjC,GAAG,GACM;IACT,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE;YACN,KAAK,EAAE,kBAAkB;YACzB,WAAW,EAAE;;;;;;;gCAOa;YAC1B,WAAW,EAAE,YAAY;YACzB,WAAW,EAAE;gBACX,YAAY,EAAE,IAAI;gBAClB,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,IAAI;aACpB;SACF;QACD,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YAC7B,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACzC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC3B,UAAU,CAAC,CAAgE,CAAC,CAC7E,CAAC;gBACF,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,KAAK,CAAC,MAAM,SAAS,EAAE,KAAK,CAAC,CAAC;gBACjE,OAAO,cAAc,CAAC,OAAO,EAAE,OAA6C,CAAC,CAAC;YAChF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"list-tags.js","sourceRoot":"","sources":["../../src/tools/list-tags.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,kBAAkB,CAAC,EAAE,GAAG,EAAE,KAAK,EAAY;IACzD,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE;YACN,KAAK,EAAE,kBAAkB;YACzB,WAAW,EAAE;;;;;;;gCAOa;YAC1B,WAAW,EAAE,YAAY;YACzB,WAAW,EAAE;gBACX,YAAY,EAAE,IAAI;gBAClB,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,IAAI;aACpB;SACF;QACD,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YAC7B,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBACzC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACpC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC3B,UAAU,CAAC,CAAgE,CAAC,CAC7E,CAAC;gBACF,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,KAAK,CAAC,MAAM,SAAS,EAAE,KAAK,CAAC,CAAC;gBACjE,OAAO,cAAc,CAAC,OAAO,EAAE,OAA6C,CAAC,CAAC;YAChF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type ListTasksInput } from "../schemas/workspace.js";
2
+ import type { ToolDefinition, ToolDeps } from "./types.js";
3
+ export declare function createListTasksTool({ api, guard, scope, meCache, }: ToolDeps): ToolDefinition<ListTasksInput>;
4
+ //# sourceMappingURL=list-tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-tasks.d.ts","sourceRoot":"","sources":["../../src/tools/list-tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAwB,MAAM,yBAAyB,CAAC;AAYpF,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,mBAAmB,CAAC,EAClC,GAAG,EACH,KAAK,EACL,KAAK,EACL,OAAO,GACR,EAAE,QAAQ,GAAG,cAAc,CAAC,cAAc,CAAC,CAsH3C"}
@@ -0,0 +1,113 @@
1
+ import { ListTasksInputSchema } from "../schemas/workspace.js";
2
+ import { collectTasksWithDueScan, DUE_SCAN_MAX_PAGES, } from "../services/due-filter.js";
3
+ import { agentListResult } from "../services/format.js";
4
+ import { createMeCache } from "../services/me-cache.js";
5
+ import { resolveWsSlug } from "../services/scope.js";
6
+ import { compactTask } from "../services/task-mapper.js";
7
+ import { jsonToolResult, toolError } from "./helpers.js";
8
+ export function createListTasksTool({ api, guard, scope, meCache, }) {
9
+ const cache = meCache ?? createMeCache(() => api.getMe());
10
+ return {
11
+ name: "otask_list_tasks",
12
+ config: {
13
+ title: "List O!task Workspace Tasks",
14
+ description: `List workspace tasks with optional mine / performer / project / priority / due filters.
15
+
16
+ Args:
17
+ - ws_slug: optional if OTASK_DEFAULT_WS is set
18
+ - page: API page (default 1)
19
+ - mine: default true — filter performer_ids to current user (ignored when performer_ids set)
20
+ - performer_ids, project_ids, priority_ids: optional API filters
21
+ - due: none|overdue|today|week — client-side filter; multi-page scan when not none
22
+
23
+ Returns compact tasks via agent list envelope. Meta in next.
24
+
25
+ Docs: https://api.otask.ru/docs`,
26
+ inputSchema: ListTasksInputSchema,
27
+ annotations: {
28
+ readOnlyHint: true,
29
+ destructiveHint: false,
30
+ idempotentHint: true,
31
+ openWorldHint: true,
32
+ },
33
+ },
34
+ handler: async (input) => {
35
+ try {
36
+ const ws = resolveWsSlug(input.ws_slug, scope);
37
+ const due = input.due ?? "none";
38
+ const page = input.page ?? 1;
39
+ let performer_ids;
40
+ let timeZone = "UTC";
41
+ let mineEffective = false;
42
+ if (input.performer_ids?.length) {
43
+ performer_ids = input.performer_ids;
44
+ if (due !== "none") {
45
+ const me = await cache.get();
46
+ timeZone = me.timezone;
47
+ }
48
+ }
49
+ else if (input.mine !== false) {
50
+ const me = await cache.get();
51
+ performer_ids = [me.id];
52
+ timeZone = me.timezone;
53
+ mineEffective = true;
54
+ }
55
+ else if (due !== "none") {
56
+ const me = await cache.get();
57
+ timeZone = me.timezone;
58
+ }
59
+ const baseQuery = { page };
60
+ if (performer_ids?.length)
61
+ baseQuery.performer_ids = performer_ids;
62
+ if (input.project_ids?.length)
63
+ baseQuery.project_ids = input.project_ids;
64
+ if (input.priority_ids?.length) {
65
+ baseQuery.priority_ids = input.priority_ids;
66
+ }
67
+ let idToSlug;
68
+ if (!guard.list.isEmpty) {
69
+ const projects = await api.listProjects(ws);
70
+ idToSlug = new Map(projects.map((p) => [p.id, p.slug]));
71
+ }
72
+ const allow = (projectId) => guard.allows({
73
+ id: projectId,
74
+ slug: idToSlug?.get(projectId),
75
+ });
76
+ if (due === "none") {
77
+ const result = await api.listWorkspaceTasks(ws, baseQuery);
78
+ const items = result.tasks.filter((t) => allow(t.project_id)).map((t) => compactTask(t));
79
+ const mineLabel = input.performer_ids?.length != null && input.performer_ids.length > 0
80
+ ? "performer_ids"
81
+ : `mine=${mineEffective}`;
82
+ const payload = agentListResult(`${items.length} task(s) (${mineLabel})`, items, result.meta);
83
+ return jsonToolResult(payload, payload);
84
+ }
85
+ const scanned = await collectTasksWithDueScan({
86
+ fetchPage: async (p) => {
87
+ const r = await api.listWorkspaceTasks(ws, {
88
+ ...baseQuery,
89
+ page: p,
90
+ });
91
+ return {
92
+ tasks: r.tasks,
93
+ meta: r.meta,
94
+ };
95
+ },
96
+ startPage: page,
97
+ due,
98
+ now: new Date(),
99
+ timeZone,
100
+ maxPages: DUE_SCAN_MAX_PAGES,
101
+ allow,
102
+ });
103
+ const items = scanned.tasks.map((t) => compactTask(t));
104
+ const payload = agentListResult(`${items.length} task(s) (due=${due}, scanned_pages=${scanned.meta.scanned_pages})`, items, scanned.meta);
105
+ return jsonToolResult(payload, payload);
106
+ }
107
+ catch (error) {
108
+ return toolError(error);
109
+ }
110
+ },
111
+ };
112
+ }
113
+ //# sourceMappingURL=list-tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-tasks.js","sourceRoot":"","sources":["../../src/tools/list-tasks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDefinition, ToolDeps } from "./types.js";
2
+ export declare function createMeTool({ api, meCache }: ToolDeps): ToolDefinition<Record<string, never>>;
3
+ //# sourceMappingURL=me.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"me.d.ts","sourceRoot":"","sources":["../../src/tools/me.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI3D,wBAAgB,YAAY,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CA6B9F"}
@@ -0,0 +1,36 @@
1
+ import { z } from "zod";
2
+ import { createMeCache } from "../services/me-cache.js";
3
+ import { jsonToolResult, toolError } from "./helpers.js";
4
+ const EmptySchema = z.object({}).strict();
5
+ export function createMeTool({ api, meCache }) {
6
+ const cache = meCache ?? createMeCache(() => api.getMe());
7
+ return {
8
+ name: "otask_me",
9
+ config: {
10
+ title: "Current O!task User",
11
+ description: `Return the authenticated O!task user (id, full_name, email, timezone).
12
+
13
+ Use before otask_list_tasks when you need the performer id explicitly.
14
+ No args.
15
+
16
+ Docs: https://api.otask.ru/docs`,
17
+ inputSchema: EmptySchema,
18
+ annotations: {
19
+ readOnlyHint: true,
20
+ destructiveHint: false,
21
+ idempotentHint: true,
22
+ openWorldHint: true,
23
+ },
24
+ },
25
+ handler: async () => {
26
+ try {
27
+ const me = await cache.get();
28
+ return jsonToolResult(me, me);
29
+ }
30
+ catch (error) {
31
+ return toolError(error);
32
+ }
33
+ },
34
+ };
35
+ }
36
+ //# sourceMappingURL=me.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"me.js","sourceRoot":"","sources":["../../src/tools/me.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAkB,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AAE1C,MAAM,UAAU,YAAY,CAAC,EAAE,GAAG,EAAE,OAAO,EAAY;IACrD,MAAM,KAAK,GAAG,OAAO,IAAI,aAAa,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;IAC1D,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE;YACN,KAAK,EAAE,qBAAqB;YAC5B,WAAW,EAAE;;;;;gCAKa;YAC1B,WAAW,EAAE,WAAW;YACxB,WAAW,EAAE;gBACX,YAAY,EAAE,IAAI;gBAClB,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,IAAI;aACpB;SACF;QACD,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,IAAI,CAAC;gBACH,MAAM,EAAE,GAAc,MAAM,KAAK,CAAC,GAAG,EAAE,CAAC;gBACxC,OAAO,cAAc,CAAC,EAAE,EAAE,EAAwC,CAAC,CAAC;YACtE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1,4 +1,4 @@
1
1
  import { type MoveTaskInput } from "../schemas/task.js";
2
2
  import type { ToolDefinition, ToolDeps } from "./types.js";
3
- export declare function createMoveTaskTool({ api, guard, }: ToolDeps): ToolDefinition<MoveTaskInput>;
3
+ export declare function createMoveTaskTool({ api, guard, scope }: ToolDeps): ToolDefinition<MoveTaskInput>;
4
4
  //# sourceMappingURL=move-task.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"move-task.d.ts","sourceRoot":"","sources":["../../src/tools/move-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,oBAAoB,CAAC;AAO5B,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,kBAAkB,CAAC,EACjC,GAAG,EACH,KAAK,GACN,EAAE,QAAQ,GAAG,cAAc,CAAC,aAAa,CAAC,CA6D1C"}
1
+ {"version":3,"file":"move-task.d.ts","sourceRoot":"","sources":["../../src/tools/move-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAuB,MAAM,oBAAoB,CAAC;AAK7E,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,kBAAkB,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,QAAQ,GAAG,cAAc,CAAC,aAAa,CAAC,CA6DjG"}
@@ -1,8 +1,9 @@
1
- import { MoveTaskInputSchema, } from "../schemas/task.js";
1
+ import { MoveTaskInputSchema } from "../schemas/task.js";
2
2
  import { assertProjectIdAllowed } from "../services/project-guard.js";
3
- import { buildUpdateBodyFromTask, compactTask, } from "../services/task-mapper.js";
3
+ import { resolveWsSlug } from "../services/scope.js";
4
+ import { buildUpdateBodyFromTask, compactTask } from "../services/task-mapper.js";
4
5
  import { jsonToolResult, toolError } from "./helpers.js";
5
- export function createMoveTaskTool({ api, guard, }) {
6
+ export function createMoveTaskTool({ api, guard, scope }) {
6
7
  return {
7
8
  name: "otask_move_task",
8
9
  config: {
@@ -12,7 +13,8 @@ export function createMoveTaskTool({ api, guard, }) {
12
13
  Discover column IDs via otask_list_board. Project must be allow-listed when configured.
13
14
 
14
15
  Args:
15
- - ws_slug, task_slug: task identity
16
+ - ws_slug: optional if OTASK_DEFAULT_WS is set
17
+ - task_slug: task identity
16
18
  - board_column_id: target column
17
19
  - board_id: optional if changing board
18
20
 
@@ -29,16 +31,15 @@ Docs: https://api.otask.ru/docs`,
29
31
  },
30
32
  handler: async ({ ws_slug, task_slug, board_column_id, board_id }) => {
31
33
  try {
32
- const current = await api.getTask(ws_slug, task_slug);
33
- const projectSlug = typeof current.project_slug === "string"
34
- ? current.project_slug
35
- : undefined;
36
- await assertProjectIdAllowed(guard, () => api.listProjects(ws_slug), current.project_id, projectSlug);
34
+ const ws = resolveWsSlug(ws_slug, scope);
35
+ const current = await api.getTask(ws, task_slug);
36
+ const projectSlug = typeof current.project_slug === "string" ? current.project_slug : undefined;
37
+ await assertProjectIdAllowed(guard, () => api.listProjects(ws), current.project_id, projectSlug);
37
38
  const body = buildUpdateBodyFromTask(current, {
38
39
  board_column_id,
39
40
  ...(board_id !== undefined ? { board_id } : {}),
40
41
  });
41
- const result = await api.updateTask(ws_slug, task_slug, body);
42
+ const result = await api.updateTask(ws, task_slug, body);
42
43
  const summary = compactTask(result.task);
43
44
  return jsonToolResult({
44
45
  success: result.success,
@@ -1 +1 @@
1
- {"version":3,"file":"move-task.js","sourceRoot":"","sources":["../../src/tools/move-task.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,GAEpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EACL,uBAAuB,EACvB,WAAW,GACZ,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,kBAAkB,CAAC,EACjC,GAAG,EACH,KAAK,GACI;IACT,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE;YACN,KAAK,EAAE,kBAAkB;YACzB,WAAW,EAAE;;;;;;;;;;;gCAWa;YAC1B,WAAW,EAAE,mBAAmB;YAChC,WAAW,EAAE;gBACX,YAAY,EAAE,KAAK;gBACnB,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,IAAI;aACpB;SACF;QACD,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,EAAE,EAAE,EAAE;YACnE,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;gBACtD,MAAM,WAAW,GACf,OAAO,OAAO,CAAC,YAAY,KAAK,QAAQ;oBACtC,CAAC,CAAC,OAAO,CAAC,YAAY;oBACtB,CAAC,CAAC,SAAS,CAAC;gBAChB,MAAM,sBAAsB,CAC1B,KAAK,EACL,GAAG,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,EAC/B,OAAO,CAAC,UAAU,EAClB,WAAW,CACZ,CAAC;gBACF,MAAM,IAAI,GAAG,uBAAuB,CAAC,OAAO,EAAE;oBAC5C,eAAe;oBACf,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAChD,CAAC,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;gBAC9D,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACzC,OAAO,cAAc,CACnB;oBACE,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,IAAI,EAAE,OAAO;iBACd,EACD;oBACE,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,IAAI,EAAE,OAAO;iBACd,CACF,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"move-task.js","sourceRoot":"","sources":["../../src/tools/move-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,kBAAkB,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAY;IAChE,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE;YACN,KAAK,EAAE,kBAAkB;YACzB,WAAW,EAAE;;;;;;;;;;;;gCAYa;YAC1B,WAAW,EAAE,mBAAmB;YAChC,WAAW,EAAE;gBACX,YAAY,EAAE,KAAK;gBACnB,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,IAAI;aACpB;SACF;QACD,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,EAAE,EAAE,EAAE;YACnE,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBACzC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;gBACjD,MAAM,WAAW,GACf,OAAO,OAAO,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC9E,MAAM,sBAAsB,CAC1B,KAAK,EACL,GAAG,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,EAC1B,OAAO,CAAC,UAAU,EAClB,WAAW,CACZ,CAAC;gBACF,MAAM,IAAI,GAAG,uBAAuB,CAAC,OAAO,EAAE;oBAC5C,eAAe;oBACf,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAChD,CAAC,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;gBACzD,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACzC,OAAO,cAAc,CACnB;oBACE,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,IAAI,EAAE,OAAO;iBACd,EACD;oBACE,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,IAAI,EAAE,OAAO;iBACd,CACF,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}