@grigoreo-dev/otask-mcp 1.2.0 → 1.3.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 (88) hide show
  1. package/README.md +33 -19
  2. package/dist/index.js +6 -4
  3. package/dist/index.js.map +1 -1
  4. package/dist/mcp-http.js +30 -10
  5. package/dist/mcp-http.js.map +1 -1
  6. package/dist/schemas/task.d.ts +27 -27
  7. package/dist/schemas/task.d.ts.map +1 -1
  8. package/dist/schemas/task.js +9 -3
  9. package/dist/schemas/task.js.map +1 -1
  10. package/dist/schemas/workspace.d.ts +21 -21
  11. package/dist/schemas/workspace.d.ts.map +1 -1
  12. package/dist/schemas/workspace.js +8 -3
  13. package/dist/schemas/workspace.js.map +1 -1
  14. package/dist/server.d.ts +2 -2
  15. package/dist/server.d.ts.map +1 -1
  16. package/dist/server.js +8 -4
  17. package/dist/server.js.map +1 -1
  18. package/dist/services/scope.d.ts +45 -0
  19. package/dist/services/scope.d.ts.map +1 -0
  20. package/dist/services/scope.js +147 -0
  21. package/dist/services/scope.js.map +1 -0
  22. package/dist/tools/add-comment.d.ts +1 -1
  23. package/dist/tools/add-comment.d.ts.map +1 -1
  24. package/dist/tools/add-comment.js +8 -5
  25. package/dist/tools/add-comment.js.map +1 -1
  26. package/dist/tools/archive-task.d.ts +1 -1
  27. package/dist/tools/archive-task.d.ts.map +1 -1
  28. package/dist/tools/archive-task.js +8 -5
  29. package/dist/tools/archive-task.js.map +1 -1
  30. package/dist/tools/create-task.d.ts +1 -1
  31. package/dist/tools/create-task.d.ts.map +1 -1
  32. package/dist/tools/create-task.js +7 -7
  33. package/dist/tools/create-task.js.map +1 -1
  34. package/dist/tools/get-task.d.ts +1 -1
  35. package/dist/tools/get-task.d.ts.map +1 -1
  36. package/dist/tools/get-task.js +6 -4
  37. package/dist/tools/get-task.js.map +1 -1
  38. package/dist/tools/list-board.d.ts +1 -1
  39. package/dist/tools/list-board.d.ts.map +1 -1
  40. package/dist/tools/list-board.js +13 -9
  41. package/dist/tools/list-board.js.map +1 -1
  42. package/dist/tools/list-comments.d.ts +1 -1
  43. package/dist/tools/list-comments.d.ts.map +1 -1
  44. package/dist/tools/list-comments.js +8 -5
  45. package/dist/tools/list-comments.js.map +1 -1
  46. package/dist/tools/list-members.d.ts +1 -1
  47. package/dist/tools/list-members.d.ts.map +1 -1
  48. package/dist/tools/list-members.js +5 -3
  49. package/dist/tools/list-members.js.map +1 -1
  50. package/dist/tools/list-project-tasks.d.ts +1 -1
  51. package/dist/tools/list-project-tasks.d.ts.map +1 -1
  52. package/dist/tools/list-project-tasks.js +6 -5
  53. package/dist/tools/list-project-tasks.js.map +1 -1
  54. package/dist/tools/list-projects.d.ts +1 -1
  55. package/dist/tools/list-projects.d.ts.map +1 -1
  56. package/dist/tools/list-projects.js +5 -3
  57. package/dist/tools/list-projects.js.map +1 -1
  58. package/dist/tools/list-tags.d.ts +1 -1
  59. package/dist/tools/list-tags.d.ts.map +1 -1
  60. package/dist/tools/list-tags.js +5 -3
  61. package/dist/tools/list-tags.js.map +1 -1
  62. package/dist/tools/move-task.d.ts +1 -1
  63. package/dist/tools/move-task.d.ts.map +1 -1
  64. package/dist/tools/move-task.js +8 -5
  65. package/dist/tools/move-task.js.map +1 -1
  66. package/dist/tools/types.d.ts +2 -0
  67. package/dist/tools/types.d.ts.map +1 -1
  68. package/dist/tools/update-task.d.ts +1 -1
  69. package/dist/tools/update-task.d.ts.map +1 -1
  70. package/dist/tools/update-task.js +10 -7
  71. package/dist/tools/update-task.js.map +1 -1
  72. package/package.json +2 -2
  73. package/dist/http-server.d.ts +0 -3
  74. package/dist/http-server.d.ts.map +0 -1
  75. package/dist/http-server.js +0 -92
  76. package/dist/http-server.js.map +0 -1
  77. package/dist/proxy/headers.d.ts +0 -3
  78. package/dist/proxy/headers.d.ts.map +0 -1
  79. package/dist/proxy/headers.js +0 -37
  80. package/dist/proxy/headers.js.map +0 -1
  81. package/dist/proxy/read-body.d.ts +0 -3
  82. package/dist/proxy/read-body.d.ts.map +0 -1
  83. package/dist/proxy/read-body.js +0 -18
  84. package/dist/proxy/read-body.js.map +0 -1
  85. package/dist/services/http-auth-context.d.ts +0 -7
  86. package/dist/services/http-auth-context.d.ts.map +0 -1
  87. package/dist/services/http-auth-context.js +0 -9
  88. package/dist/services/http-auth-context.js.map +0 -1
package/dist/server.js CHANGED
@@ -1,13 +1,17 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
2
  import { createOtaskClient } from "./services/client.js";
3
- import { createProjectGuard, parseProjectAllowList, } from "./services/project-guard.js";
3
+ import { scopeFromEnv, } from "./services/scope.js";
4
4
  import { registerAllTools } from "./tools/register.js";
5
- export function createMcpServer(auth, guard = createProjectGuard(parseProjectAllowList(undefined))) {
5
+ export function createMcpServer(auth, scope = scopeFromEnv({})) {
6
6
  const server = new McpServer({
7
7
  name: "otask-mcp-server",
8
- version: "1.2.0",
8
+ version: "1.3.0",
9
+ });
10
+ registerAllTools(server, {
11
+ api: createOtaskClient(auth),
12
+ guard: scope.projectGuard,
13
+ scope,
9
14
  });
10
- registerAllTools(server, { api: createOtaskClient(auth), guard });
11
15
  return server;
12
16
  }
13
17
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EACL,kBAAkB,EAClB,qBAAqB,GAEtB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,UAAU,eAAe,CAC7B,IAAuB,EACvB,QAAsB,kBAAkB,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;IAE1E,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,kBAAkB;QACxB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,gBAAgB,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,iBAAiB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAElE,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EACL,YAAY,GAEb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,UAAU,eAAe,CAC7B,IAAuB,EACvB,QAAsB,YAAY,CAAC,EAAE,CAAC;IAEtC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,kBAAkB;QACxB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,gBAAgB,CAAC,MAAM,EAAE;QACvB,GAAG,EAAE,iBAAiB,CAAC,IAAI,CAAC;QAC5B,KAAK,EAAE,KAAK,CAAC,YAAY;QACzB,KAAK;KACN,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { type ProjectGuard } from "./project-guard.js";
2
+ export interface WsAllowList {
3
+ slugs: Set<string>;
4
+ isEmpty: boolean;
5
+ }
6
+ export interface WsGuard {
7
+ allows(slug: string): boolean;
8
+ assertAllowed(slug: string): void;
9
+ readonly list: WsAllowList;
10
+ }
11
+ export interface ScopeContext {
12
+ defaultWs?: string;
13
+ defaultProject?: string;
14
+ wsGuard: WsGuard;
15
+ projectGuard: ProjectGuard;
16
+ }
17
+ export declare function parseWsAllowList(raw: string | undefined | null): WsAllowList;
18
+ export declare function createWsGuard(list: WsAllowList): WsGuard;
19
+ export declare function resolveWsSlug(ws_slug: string | undefined, scope: ScopeContext): string;
20
+ export declare function resolveProjectSlug(project_slug: string | undefined, scope: ScopeContext, listProjects: () => Promise<Array<{
21
+ id: number;
22
+ slug: string;
23
+ }>>): Promise<string>;
24
+ export declare function resolveProjectId(project_id: number | undefined, scope: ScopeContext, listProjects: () => Promise<Array<{
25
+ id: number;
26
+ slug: string;
27
+ }>>): Promise<number>;
28
+ export declare function assertDefaultsAllowed(scope: ScopeContext): void;
29
+ export declare function scopeFromEnv(env?: NodeJS.ProcessEnv): ScopeContext;
30
+ export declare function resolveHttpScope(opts: {
31
+ authMode: "gateway" | "passthrough";
32
+ env: NodeJS.ProcessEnv;
33
+ headers: {
34
+ [k: string]: string | string[] | undefined;
35
+ };
36
+ }): ScopeContext;
37
+ export declare function scopeGuardModes(scope: ScopeContext): {
38
+ wsGuard: "env" | "header" | "off";
39
+ projectGuard: "env" | "header" | "off";
40
+ defaults: {
41
+ ws: boolean;
42
+ project: boolean;
43
+ };
44
+ };
45
+ //# sourceMappingURL=scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/services/scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,YAAY,EAClB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,OAAO;IACtB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9B,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAC7B,WAAW,CAUb;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAaxD;AAiBD,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,KAAK,EAAE,YAAY,GAClB,MAAM,CASR;AAED,wBAAsB,kBAAkB,CACtC,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,KAAK,EAAE,YAAY,EACnB,YAAY,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,GAC/D,OAAO,CAAC,MAAM,CAAC,CA8BjB;AAED,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,KAAK,EAAE,YAAY,EACnB,YAAY,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,GAC/D,OAAO,CAAC,MAAM,CAAC,CA0BjB;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAoB/D;AAED,wBAAgB,YAAY,CAC1B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,YAAY,CASd;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IACrC,QAAQ,EAAE,SAAS,GAAG,aAAa,CAAC;IACpC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,OAAO,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAA;KAAE,CAAC;CACzD,GAAG,YAAY,CAyBf;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG;IACpD,OAAO,EAAE,KAAK,GAAG,QAAQ,GAAG,KAAK,CAAC;IAClC,YAAY,EAAE,KAAK,GAAG,QAAQ,GAAG,KAAK,CAAC;IACvC,QAAQ,EAAE;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;CAC7C,CASA"}
@@ -0,0 +1,147 @@
1
+ import { assertProjectIdAllowed, assertProjectSlugAllowed, createProjectGuard, parseProjectAllowList, } from "./project-guard.js";
2
+ export function parseWsAllowList(raw) {
3
+ const slugs = new Set();
4
+ if (!raw?.trim()) {
5
+ return { slugs, isEmpty: true };
6
+ }
7
+ for (const part of raw.split(",")) {
8
+ const token = part.trim();
9
+ if (token)
10
+ slugs.add(token);
11
+ }
12
+ return { slugs, isEmpty: slugs.size === 0 };
13
+ }
14
+ export function createWsGuard(list) {
15
+ return {
16
+ list,
17
+ allows(slug) {
18
+ if (list.isEmpty)
19
+ return true;
20
+ return list.slugs.has(slug);
21
+ },
22
+ assertAllowed(slug) {
23
+ if (!this.allows(slug)) {
24
+ throw new Error(`Workspace not allowed: ${slug}`);
25
+ }
26
+ },
27
+ };
28
+ }
29
+ function headerValue(headers, name) {
30
+ const raw = headers[name];
31
+ if (typeof raw === "string")
32
+ return raw;
33
+ if (Array.isArray(raw) && typeof raw[0] === "string")
34
+ return raw[0];
35
+ return undefined;
36
+ }
37
+ function trimOrUndef(v) {
38
+ const t = v?.trim();
39
+ return t ? t : undefined;
40
+ }
41
+ export function resolveWsSlug(ws_slug, scope) {
42
+ const ws = trimOrUndef(ws_slug) ?? scope.defaultWs;
43
+ if (!ws) {
44
+ throw new Error("ws_slug is required (pass arg or set OTASK_DEFAULT_WS / X-Otask-Default-Ws)");
45
+ }
46
+ scope.wsGuard.assertAllowed(ws);
47
+ return ws;
48
+ }
49
+ export async function resolveProjectSlug(project_slug, scope, listProjects) {
50
+ const explicit = trimOrUndef(project_slug);
51
+ if (explicit) {
52
+ await assertProjectSlugAllowed(scope.projectGuard, listProjects, explicit);
53
+ return explicit;
54
+ }
55
+ const def = scope.defaultProject;
56
+ if (!def) {
57
+ throw new Error("project_slug is required (pass arg or set OTASK_DEFAULT_PROJECT / X-Otask-Default-Project)");
58
+ }
59
+ if (/^\d+$/.test(def)) {
60
+ const id = Number(def);
61
+ const projects = await listProjects();
62
+ const project = projects.find((p) => p.id === id);
63
+ if (!project) {
64
+ throw new Error(`Default project id not found: ${id}`);
65
+ }
66
+ scope.projectGuard.assertAllowed({
67
+ id: project.id,
68
+ slug: project.slug,
69
+ });
70
+ return project.slug;
71
+ }
72
+ await assertProjectSlugAllowed(scope.projectGuard, listProjects, def);
73
+ return def;
74
+ }
75
+ export async function resolveProjectId(project_id, scope, listProjects) {
76
+ if (project_id != null) {
77
+ await assertProjectIdAllowed(scope.projectGuard, listProjects, project_id);
78
+ return project_id;
79
+ }
80
+ const def = scope.defaultProject;
81
+ if (!def) {
82
+ throw new Error("project_id is required (pass arg or set OTASK_DEFAULT_PROJECT / X-Otask-Default-Project)");
83
+ }
84
+ if (/^\d+$/.test(def)) {
85
+ const id = Number(def);
86
+ await assertProjectIdAllowed(scope.projectGuard, listProjects, id);
87
+ return id;
88
+ }
89
+ const projects = await listProjects();
90
+ const project = projects.find((p) => p.slug === def);
91
+ if (!project) {
92
+ throw new Error(`Default project slug not found: ${def}`);
93
+ }
94
+ scope.projectGuard.assertAllowed({ id: project.id, slug: project.slug });
95
+ return project.id;
96
+ }
97
+ export function assertDefaultsAllowed(scope) {
98
+ if (scope.defaultWs && !scope.wsGuard.list.isEmpty) {
99
+ if (!scope.wsGuard.allows(scope.defaultWs)) {
100
+ throw new Error(`OTASK_DEFAULT_WS "${scope.defaultWs}" is not in OTASK_ALLOWED_WS`);
101
+ }
102
+ }
103
+ if (scope.defaultProject && !scope.projectGuard.list.isEmpty) {
104
+ const def = scope.defaultProject;
105
+ const asId = /^\d+$/.test(def) ? Number(def) : null;
106
+ const allowed = scope.projectGuard.allows({ slug: def }) ||
107
+ (asId != null && scope.projectGuard.allows({ id: asId }));
108
+ if (!allowed) {
109
+ throw new Error(`OTASK_DEFAULT_PROJECT "${def}" is not in OTASK_ALLOWED_PROJECTS`);
110
+ }
111
+ }
112
+ }
113
+ export function scopeFromEnv(env = process.env) {
114
+ return {
115
+ defaultWs: trimOrUndef(env.OTASK_DEFAULT_WS),
116
+ defaultProject: trimOrUndef(env.OTASK_DEFAULT_PROJECT),
117
+ wsGuard: createWsGuard(parseWsAllowList(env.OTASK_ALLOWED_WS)),
118
+ projectGuard: createProjectGuard(parseProjectAllowList(env.OTASK_ALLOWED_PROJECTS)),
119
+ };
120
+ }
121
+ export function resolveHttpScope(opts) {
122
+ if (opts.authMode === "gateway") {
123
+ return scopeFromEnv(opts.env);
124
+ }
125
+ const headerWsAllow = headerValue(opts.headers, "x-otask-allowed-ws");
126
+ const headerProjectAllow = headerValue(opts.headers, "x-otask-allowed-projects");
127
+ const headerDefaultWs = headerValue(opts.headers, "x-otask-default-ws");
128
+ const headerDefaultProject = headerValue(opts.headers, "x-otask-default-project");
129
+ return {
130
+ defaultWs: trimOrUndef(headerDefaultWs) ?? trimOrUndef(opts.env.OTASK_DEFAULT_WS),
131
+ defaultProject: trimOrUndef(headerDefaultProject) ??
132
+ trimOrUndef(opts.env.OTASK_DEFAULT_PROJECT),
133
+ wsGuard: createWsGuard(parseWsAllowList(headerWsAllow)),
134
+ projectGuard: createProjectGuard(parseProjectAllowList(headerProjectAllow)),
135
+ };
136
+ }
137
+ export function scopeGuardModes(scope) {
138
+ return {
139
+ wsGuard: scope.wsGuard.list.isEmpty ? "off" : "env",
140
+ projectGuard: scope.projectGuard.list.isEmpty ? "off" : "env",
141
+ defaults: {
142
+ ws: Boolean(scope.defaultWs),
143
+ project: Boolean(scope.defaultProject),
144
+ },
145
+ };
146
+ }
147
+ //# sourceMappingURL=scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.js","sourceRoot":"","sources":["../../src/services/scope.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  import { type AddCommentInput } from "../schemas/task.js";
2
2
  import type { ToolDefinition, ToolDeps } from "./types.js";
3
- export declare function createAddCommentTool({ api, guard, }: ToolDeps): ToolDefinition<AddCommentInput>;
3
+ export declare function createAddCommentTool({ api, guard, scope, }: ToolDeps): ToolDefinition<AddCommentInput>;
4
4
  //# sourceMappingURL=add-comment.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"add-comment.d.ts","sourceRoot":"","sources":["../../src/tools/add-comment.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,oBAAoB,CAAC,EACnC,GAAG,EACH,KAAK,GACN,EAAE,QAAQ,GAAG,cAAc,CAAC,eAAe,CAAC,CAgD5C"}
1
+ {"version":3,"file":"add-comment.d.ts","sourceRoot":"","sources":["../../src/tools/add-comment.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,oBAAoB,CAAC,EACnC,GAAG,EACH,KAAK,EACL,KAAK,GACN,EAAE,QAAQ,GAAG,cAAc,CAAC,eAAe,CAAC,CAkD5C"}
@@ -1,7 +1,8 @@
1
1
  import { AddCommentInputSchema, } 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 createAddCommentTool({ api, guard, }) {
5
+ export function createAddCommentTool({ api, guard, scope, }) {
5
6
  return {
6
7
  name: "otask_add_comment",
7
8
  config: {
@@ -9,7 +10,8 @@ export function createAddCommentTool({ api, guard, }) {
9
10
  description: `Add a comment on a task (optional parent_id for replies). 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
  - comment: comment body
14
16
  - parent_id: optional parent comment ID
15
17
 
@@ -26,12 +28,13 @@ Docs: https://api.otask.ru/docs`,
26
28
  },
27
29
  handler: async ({ ws_slug, task_slug, comment, parent_id }) => {
28
30
  try {
29
- const current = await api.getTask(ws_slug, task_slug);
31
+ const ws = resolveWsSlug(ws_slug, scope);
32
+ const current = await api.getTask(ws, task_slug);
30
33
  const projectSlug = typeof current.project_slug === "string"
31
34
  ? current.project_slug
32
35
  : undefined;
33
- await assertProjectIdAllowed(guard, () => api.listProjects(ws_slug), current.project_id, projectSlug);
34
- const data = await api.addComment(ws_slug, task_slug, comment, parent_id);
36
+ await assertProjectIdAllowed(guard, () => api.listProjects(ws), current.project_id, projectSlug);
37
+ const data = await api.addComment(ws, task_slug, comment, parent_id);
35
38
  return jsonToolResult(data, data);
36
39
  }
37
40
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"add-comment.js","sourceRoot":"","sources":["../../src/tools/add-comment.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,GAEtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,oBAAoB,CAAC,EACnC,GAAG,EACH,KAAK,GACI;IACT,OAAO;QACL,IAAI,EAAE,mBAAmB;QACzB,MAAM,EAAE;YACN,KAAK,EAAE,yBAAyB;YAChC,WAAW,EAAE;;;;;;;;;gCASa;YAC1B,WAAW,EAAE,qBAAqB;YAClC,WAAW,EAAE;gBACX,YAAY,EAAE,KAAK;gBACnB,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,KAAK;gBACrB,aAAa,EAAE,IAAI;aACpB;SACF;QACD,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;YAC5D,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,UAAU,CAC/B,OAAO,EACP,SAAS,EACT,OAAO,EACP,SAAS,CACV,CAAC;gBACF,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":"add-comment.js","sourceRoot":"","sources":["../../src/tools/add-comment.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,GAEtB,MAAM,oBAAoB,CAAC;AAC5B,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,oBAAoB,CAAC,EACnC,GAAG,EACH,KAAK,EACL,KAAK,GACI;IACT,OAAO;QACL,IAAI,EAAE,mBAAmB;QACzB,MAAM,EAAE;YACN,KAAK,EAAE,yBAAyB;YAChC,WAAW,EAAE;;;;;;;;;;gCAUa;YAC1B,WAAW,EAAE,qBAAqB;YAClC,WAAW,EAAE;gBACX,YAAY,EAAE,KAAK;gBACnB,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,KAAK;gBACrB,aAAa,EAAE,IAAI;aACpB;SACF;QACD,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;YAC5D,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;oBACtC,CAAC,CAAC,OAAO,CAAC,YAAY;oBACtB,CAAC,CAAC,SAAS,CAAC;gBAChB,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,UAAU,CAC/B,EAAE,EACF,SAAS,EACT,OAAO,EACP,SAAS,CACV,CAAC;gBACF,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 ArchiveTaskInput } from "../schemas/task.js";
2
2
  import type { ToolDefinition, ToolDeps } from "./types.js";
3
- export declare function createArchiveTaskTool({ api, guard, }: ToolDeps): ToolDefinition<ArchiveTaskInput>;
3
+ export declare function createArchiveTaskTool({ api, guard, scope, }: ToolDeps): ToolDefinition<ArchiveTaskInput>;
4
4
  //# sourceMappingURL=archive-task.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"archive-task.d.ts","sourceRoot":"","sources":["../../src/tools/archive-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,qBAAqB,CAAC,EACpC,GAAG,EACH,KAAK,GACN,EAAE,QAAQ,GAAG,cAAc,CAAC,gBAAgB,CAAC,CA0C7C"}
1
+ {"version":3,"file":"archive-task.d.ts","sourceRoot":"","sources":["../../src/tools/archive-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,oBAAoB,CAAC;AAK5B,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,qBAAqB,CAAC,EACpC,GAAG,EACH,KAAK,EACL,KAAK,GACN,EAAE,QAAQ,GAAG,cAAc,CAAC,gBAAgB,CAAC,CA4C7C"}
@@ -1,8 +1,9 @@
1
1
  import { ArchiveTaskInputSchema, } from "../schemas/task.js";
2
2
  import { assertProjectIdAllowed } from "../services/project-guard.js";
3
+ import { resolveWsSlug } from "../services/scope.js";
3
4
  import { compactTask } from "../services/task-mapper.js";
4
5
  import { jsonToolResult, toolError } from "./helpers.js";
5
- export function createArchiveTaskTool({ api, guard, }) {
6
+ export function createArchiveTaskTool({ api, guard, scope, }) {
6
7
  return {
7
8
  name: "otask_archive_task",
8
9
  config: {
@@ -10,7 +11,8 @@ export function createArchiveTaskTool({ api, guard, }) {
10
11
  description: `Archive a task (POST .../in-archive). Fetches the task first to enforce project allow-list.
11
12
 
12
13
  Args:
13
- - ws_slug, task_slug: task identity
14
+ - ws_slug: optional if OTASK_DEFAULT_WS is set
15
+ - task_slug: task identity
14
16
 
15
17
  Returns archived compact task.
16
18
 
@@ -25,12 +27,13 @@ Docs: https://api.otask.ru/docs`,
25
27
  },
26
28
  handler: async ({ ws_slug, task_slug }) => {
27
29
  try {
28
- const current = await api.getTask(ws_slug, task_slug);
30
+ const ws = resolveWsSlug(ws_slug, scope);
31
+ const current = await api.getTask(ws, task_slug);
29
32
  const projectSlug = typeof current.project_slug === "string"
30
33
  ? current.project_slug
31
34
  : undefined;
32
- await assertProjectIdAllowed(guard, () => api.listProjects(ws_slug), current.project_id, projectSlug);
33
- const task = await api.archiveTask(ws_slug, task_slug);
35
+ await assertProjectIdAllowed(guard, () => api.listProjects(ws), current.project_id, projectSlug);
36
+ const task = await api.archiveTask(ws, task_slug);
34
37
  const summary = compactTask(task);
35
38
  return jsonToolResult(summary, { task: summary });
36
39
  }
@@ -1 +1 @@
1
- {"version":3,"file":"archive-task.js","sourceRoot":"","sources":["../../src/tools/archive-task.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,GAEvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,qBAAqB,CAAC,EACpC,GAAG,EACH,KAAK,GACI;IACT,OAAO;QACL,IAAI,EAAE,oBAAoB;QAC1B,MAAM,EAAE;YACN,KAAK,EAAE,qBAAqB;YAC5B,WAAW,EAAE;;;;;;;gCAOa;YAC1B,WAAW,EAAE,sBAAsB;YACnC,WAAW,EAAE;gBACX,YAAY,EAAE,KAAK;gBACnB,eAAe,EAAE,IAAI;gBACrB,cAAc,EAAE,KAAK;gBACrB,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,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;gBACvD,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;gBAClC,OAAO,cAAc,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACpD,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":"archive-task.js","sourceRoot":"","sources":["../../src/tools/archive-task.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,GAEvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,qBAAqB,CAAC,EACpC,GAAG,EACH,KAAK,EACL,KAAK,GACI;IACT,OAAO;QACL,IAAI,EAAE,oBAAoB;QAC1B,MAAM,EAAE;YACN,KAAK,EAAE,qBAAqB;YAC5B,WAAW,EAAE;;;;;;;;gCAQa;YAC1B,WAAW,EAAE,sBAAsB;YACnC,WAAW,EAAE;gBACX,YAAY,EAAE,KAAK;gBACnB,eAAe,EAAE,IAAI;gBACrB,cAAc,EAAE,KAAK;gBACrB,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;oBACtC,CAAC,CAAC,OAAO,CAAC,YAAY;oBACtB,CAAC,CAAC,SAAS,CAAC;gBAChB,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,WAAW,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;gBAClD,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;gBAClC,OAAO,cAAc,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACpD,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 CreateTaskInput } from "../schemas/task.js";
2
2
  import type { ToolDefinition, ToolDeps } from "./types.js";
3
- export declare function createCreateTaskTool({ api, guard, }: ToolDeps): ToolDefinition<CreateTaskInput>;
3
+ export declare function createCreateTaskTool({ api, scope, }: ToolDeps): ToolDefinition<CreateTaskInput>;
4
4
  //# sourceMappingURL=create-task.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-task.d.ts","sourceRoot":"","sources":["../../src/tools/create-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,oBAAoB,CAAC,EACnC,GAAG,EACH,KAAK,GACN,EAAE,QAAQ,GAAG,cAAc,CAAC,eAAe,CAAC,CA0C5C"}
1
+ {"version":3,"file":"create-task.d.ts","sourceRoot":"","sources":["../../src/tools/create-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,oBAAoB,CAAC;AAO5B,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,oBAAoB,CAAC,EACnC,GAAG,EACH,KAAK,GACN,EAAE,QAAQ,GAAG,cAAc,CAAC,eAAe,CAAC,CA0C5C"}
@@ -1,8 +1,8 @@
1
1
  import { CreateTaskInputSchema, } from "../schemas/task.js";
2
- import { assertProjectIdAllowed } from "../services/project-guard.js";
2
+ import { resolveProjectId, resolveWsSlug, } from "../services/scope.js";
3
3
  import { compactTask } from "../services/task-mapper.js";
4
4
  import { jsonToolResult, toolError } from "./helpers.js";
5
- export function createCreateTaskTool({ api, guard, }) {
5
+ export function createCreateTaskTool({ api, scope, }) {
6
6
  return {
7
7
  name: "otask_create_task",
8
8
  config: {
@@ -12,8 +12,7 @@ export function createCreateTaskTool({ api, guard, }) {
12
12
  You must supply board_id and board_column_id (discover via otask_list_board for the project).
13
13
 
14
14
  Args:
15
- - ws_slug: Workspace UUID
16
- - project_id: Project numeric ID
15
+ - ws_slug, project_id: optional if OTASK_DEFAULT_WS / OTASK_DEFAULT_PROJECT set
17
16
  - name, board_id, board_column_id, end_at: required
18
17
  - description, comment, priority_id, performers, tags: optional
19
18
 
@@ -30,9 +29,10 @@ Docs: https://api.otask.ru/docs`,
30
29
  },
31
30
  handler: async (params) => {
32
31
  try {
33
- const { ws_slug, ...body } = params;
34
- await assertProjectIdAllowed(guard, () => api.listProjects(ws_slug), body.project_id);
35
- const task = await api.createTask(ws_slug, body);
32
+ const { ws_slug, project_id: projectIdArg, ...rest } = params;
33
+ const ws = resolveWsSlug(ws_slug, scope);
34
+ const project_id = await resolveProjectId(projectIdArg, scope, () => api.listProjects(ws));
35
+ const task = await api.createTask(ws, { ...rest, project_id });
36
36
  const summary = compactTask(task);
37
37
  return jsonToolResult(summary, { task: summary });
38
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"create-task.js","sourceRoot":"","sources":["../../src/tools/create-task.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,GAEtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,oBAAoB,CAAC,EACnC,GAAG,EACH,KAAK,GACI;IACT,OAAO;QACL,IAAI,EAAE,mBAAmB;QACzB,MAAM,EAAE;YACN,KAAK,EAAE,oBAAoB;YAC3B,WAAW,EAAE;;;;;;;;;;;;gCAYa;YAC1B,WAAW,EAAE,qBAAqB;YAClC,WAAW,EAAE;gBACX,YAAY,EAAE,KAAK;gBACnB,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,KAAK;gBACrB,aAAa,EAAE,IAAI;aACpB;SACF;QACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACxB,IAAI,CAAC;gBACH,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;gBACpC,MAAM,sBAAsB,CAC1B,KAAK,EACL,GAAG,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,EAC/B,IAAI,CAAC,UAAU,CAChB,CAAC;gBACF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBACjD,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;gBAClC,OAAO,cAAc,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACpD,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":"create-task.js","sourceRoot":"","sources":["../../src/tools/create-task.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,GAEtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,gBAAgB,EAChB,aAAa,GACd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,oBAAoB,CAAC,EACnC,GAAG,EACH,KAAK,GACI;IACT,OAAO;QACL,IAAI,EAAE,mBAAmB;QACzB,MAAM,EAAE;YACN,KAAK,EAAE,oBAAoB;YAC3B,WAAW,EAAE;;;;;;;;;;;gCAWa;YAC1B,WAAW,EAAE,qBAAqB;YAClC,WAAW,EAAE;gBACX,YAAY,EAAE,KAAK;gBACnB,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,KAAK;gBACrB,aAAa,EAAE,IAAI;aACpB;SACF;QACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACxB,IAAI,CAAC;gBACH,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;gBAC9D,MAAM,EAAE,GAAG,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBACzC,MAAM,UAAU,GAAG,MAAM,gBAAgB,CACvC,YAAY,EACZ,KAAK,EACL,GAAG,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAC3B,CAAC;gBACF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;gBAC/D,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;gBAClC,OAAO,cAAc,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACpD,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 GetTaskInput } from "../schemas/task.js";
2
2
  import type { ToolDefinition, ToolDeps } from "./types.js";
3
- export declare function createGetTaskTool({ api, guard, }: ToolDeps): ToolDefinition<GetTaskInput>;
3
+ export declare function createGetTaskTool({ api, guard, scope, }: ToolDeps): ToolDefinition<GetTaskInput>;
4
4
  //# sourceMappingURL=get-task.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-task.d.ts","sourceRoot":"","sources":["../../src/tools/get-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAI3E,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,iBAAiB,CAAC,EAChC,GAAG,EACH,KAAK,GACN,EAAE,QAAQ,GAAG,cAAc,CAAC,YAAY,CAAC,CA2CzC"}
1
+ {"version":3,"file":"get-task.d.ts","sourceRoot":"","sources":["../../src/tools/get-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAK3E,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,iBAAiB,CAAC,EAChC,GAAG,EACH,KAAK,EACL,KAAK,GACN,EAAE,QAAQ,GAAG,cAAc,CAAC,YAAY,CAAC,CA4CzC"}
@@ -1,8 +1,9 @@
1
1
  import { GetTaskInputSchema } from "../schemas/task.js";
2
2
  import { assertProjectIdAllowed } from "../services/project-guard.js";
3
+ import { resolveWsSlug } from "../services/scope.js";
3
4
  import { compactTask } from "../services/task-mapper.js";
4
5
  import { jsonToolResult, toolError } from "./helpers.js";
5
- export function createGetTaskTool({ api, guard, }) {
6
+ export function createGetTaskTool({ api, guard, scope, }) {
6
7
  return {
7
8
  name: "otask_get_task",
8
9
  config: {
@@ -13,7 +14,7 @@ Use before otask_update_task to inspect current field values (board_id, performe
13
14
  Project must be on the allow-list when configured (checked via task.project_id).
14
15
 
15
16
  Args:
16
- - ws_slug: Workspace UUID from panel.otask.ru URL (/ws/{ws_slug}/...)
17
+ - ws_slug: optional if OTASK_DEFAULT_WS is set
17
18
  - task_slug: Task UUID from URL (.../tasks/{task_slug})
18
19
 
19
20
  Returns JSON with key task fields: id, slug, name, description, end_at, board_id, board_column_id, priority_id, project_id, performers, tags.
@@ -29,9 +30,10 @@ Docs: https://api.otask.ru/docs#zadaci-GETapi-v1-ws--ws_slug--tasks--task_slug`,
29
30
  },
30
31
  handler: async ({ ws_slug, task_slug }) => {
31
32
  try {
32
- const task = await api.getTask(ws_slug, task_slug);
33
+ const ws = resolveWsSlug(ws_slug, scope);
34
+ const task = await api.getTask(ws, task_slug);
33
35
  const projectSlug = typeof task.project_slug === "string" ? task.project_slug : undefined;
34
- await assertProjectIdAllowed(guard, () => api.listProjects(ws_slug), task.project_id, projectSlug);
36
+ await assertProjectIdAllowed(guard, () => api.listProjects(ws), task.project_id, projectSlug);
35
37
  const summary = compactTask(task);
36
38
  return jsonToolResult(summary, { task: summary });
37
39
  }
@@ -1 +1 @@
1
- {"version":3,"file":"get-task.js","sourceRoot":"","sources":["../../src/tools/get-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAqB,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,iBAAiB,CAAC,EAChC,GAAG,EACH,KAAK,GACI;IACT,OAAO;QACL,IAAI,EAAE,gBAAgB;QACtB,MAAM,EAAE;YACN,KAAK,EAAE,iBAAiB;YACxB,WAAW,EAAE;;;;;;;;;;;+EAW4D;YACzE,WAAW,EAAE,kBAAkB;YAC/B,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,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;gBACnD,MAAM,WAAW,GACf,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;gBACxE,MAAM,sBAAsB,CAC1B,KAAK,EACL,GAAG,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,EAC/B,IAAI,CAAC,UAAU,EACf,WAAW,CACZ,CAAC;gBACF,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;gBAClC,OAAO,cAAc,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACpD,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":"get-task.js","sourceRoot":"","sources":["../../src/tools/get-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAqB,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,iBAAiB,CAAC,EAChC,GAAG,EACH,KAAK,EACL,KAAK,GACI;IACT,OAAO;QACL,IAAI,EAAE,gBAAgB;QACtB,MAAM,EAAE;YACN,KAAK,EAAE,iBAAiB;YACxB,WAAW,EAAE;;;;;;;;;;;+EAW4D;YACzE,WAAW,EAAE,kBAAkB;YAC/B,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,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;gBAC9C,MAAM,WAAW,GACf,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;gBACxE,MAAM,sBAAsB,CAC1B,KAAK,EACL,GAAG,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,EAC1B,IAAI,CAAC,UAAU,EACf,WAAW,CACZ,CAAC;gBACF,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;gBAClC,OAAO,cAAc,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACpD,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 ListBoardInput } from "../schemas/workspace.js";
2
2
  import type { ToolDefinition, ToolDeps } from "./types.js";
3
- export declare function createListBoardTool({ api, guard, }: ToolDeps): ToolDefinition<ListBoardInput>;
3
+ export declare function createListBoardTool({ api, scope, }: ToolDeps): ToolDefinition<ListBoardInput>;
4
4
  //# sourceMappingURL=list-board.d.ts.map
@@ -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,EAEL,KAAK,cAAc,EACpB,MAAM,yBAAyB,CAAC;AAOjC,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,CAiE3C"}
@@ -1,8 +1,8 @@
1
1
  import { ListBoardInputSchema, } from "../schemas/workspace.js";
2
- import { assertProjectSlugAllowed } from "../services/project-guard.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,EACL,oBAAoB,GAErB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,kBAAkB,EAClB,aAAa,GACd,MAAM,sBAAsB,CAAC;AAC9B,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;;;;;;;;;;;;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,CACtC,YAAY,EACZ,KAAK,EACL,GAAG,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAC3B,CAAC;gBACF,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,EAEL,KAAK,iBAAiB,EACvB,MAAM,oBAAoB,CAAC;AAI5B,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,CA2C9C"}
@@ -1,7 +1,8 @@
1
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,13 @@ 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);
29
+ const ws = resolveWsSlug(ws_slug, scope);
30
+ const current = await api.getTask(ws, task_slug);
28
31
  const projectSlug = typeof current.project_slug === "string"
29
32
  ? current.project_slug
30
33
  : undefined;
31
- await assertProjectIdAllowed(guard, () => api.listProjects(ws_slug), current.project_id, projectSlug);
32
- const data = await api.listComments(ws_slug, task_slug);
34
+ await assertProjectIdAllowed(guard, () => api.listProjects(ws), current.project_id, projectSlug);
35
+ const data = await api.listComments(ws, task_slug);
33
36
  return jsonToolResult(data, data);
34
37
  }
35
38
  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,EACL,uBAAuB,GAExB,MAAM,oBAAoB,CAAC;AAC5B,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;oBACtC,CAAC,CAAC,OAAO,CAAC,YAAY;oBACtB,CAAC,CAAC,SAAS,CAAC;gBAChB,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,EAEL,KAAK,WAAW,EACjB,MAAM,yBAAyB,CAAC;AAKjC,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,qBAAqB,CAAC,EACpC,GAAG,EACH,KAAK,GACN,EAAE,QAAQ,GAAG,cAAc,CAAC,WAAW,CAAC,CA2CxC"}