corkcrm-mcp 0.7.0 → 0.9.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.
package/dist/auth.d.ts CHANGED
@@ -11,3 +11,5 @@ export declare function getConvexUrl(): string;
11
11
  * Called once on first tool invocation.
12
12
  */
13
13
  export declare function ensureAuthenticated(testFn: () => Promise<unknown>): Promise<void>;
14
+ /** The folder a download goes to when the call names none: CORK_DOWNLOAD_DIR, else null (files.ts uses ~/Downloads). */
15
+ export declare function getDownloadDir(): string | null;
package/dist/auth.js CHANGED
@@ -37,4 +37,9 @@ export async function ensureAuthenticated(testFn) {
37
37
  throw new Error(`API key validation failed: ${msg}`);
38
38
  }
39
39
  }
40
+ /** The folder a download goes to when the call names none: CORK_DOWNLOAD_DIR, else null (files.ts uses ~/Downloads). */
41
+ export function getDownloadDir() {
42
+ const dir = process.env.CORK_DOWNLOAD_DIR?.trim();
43
+ return dir ? dir : null;
44
+ }
40
45
  //# sourceMappingURL=auth.js.map
package/dist/auth.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,IAAI,SAAS,GAAG,KAAK,CAAC;AAEtB,MAAM,UAAU,SAAS;IACvB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IACrC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,iDAAiD;YAC/C,gDAAgD,CACnD,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IACnC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,+CAA+C;YAC7C,mFAAmF,CACtF,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAA8B;IAE9B,IAAI,SAAS;QAAE,OAAO;IACtB,IAAI,CAAC;QACH,MAAM,MAAM,EAAE,CAAC;QACf,SAAS,GAAG,IAAI,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,EAAE,CAAC,CAAC;IACvD,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,IAAI,SAAS,GAAG,KAAK,CAAC;AAEtB,MAAM,UAAU,SAAS;IACvB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IACrC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,iDAAiD;YAC/C,gDAAgD,CACnD,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IACnC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,+CAA+C;YAC7C,mFAAmF,CACtF,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAA8B;IAE9B,IAAI,SAAS;QAAE,OAAO;IACtB,IAAI,CAAC;QACH,MAAM,MAAM,EAAE,CAAC;QACf,SAAS,GAAG,IAAI,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,EAAE,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED,wHAAwH;AACxH,MAAM,UAAU,cAAc;IAC5B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC;IAClD,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
2
+ type Args = Record<string, unknown>;
3
+ /** One file ready to upload: its name, the MIME type it is sent with, and its bytes. */
4
+ type Upload = {
5
+ name: string;
6
+ type: string;
7
+ size: number;
8
+ bytes: () => Promise<Uint8Array>;
9
+ };
10
+ /**
11
+ * The local checks for paths, in the design's order, so a bad call never uploads: the count, then each
12
+ * path: absolute, there, a file and not a folder, at most 25 MB, a type the app takes.
13
+ */
14
+ export declare function checkPaths(raw: unknown): Promise<Upload[]>;
15
+ /** The local checks for a text add: its length, then the name's extension, then its UTF-8 size. */
16
+ export declare function checkText(text: unknown, rawName: unknown): Upload;
17
+ /** POSTs one file's bytes to its upload URL with its MIME type; answers the storage ID. The URL never goes into an error. */
18
+ export declare function uploadBytes(url: string, file: {
19
+ name: string;
20
+ type: string;
21
+ }, bytes: Uint8Array): Promise<string>;
22
+ export declare function runChangeFiles(args: Args): Promise<CallToolResult>;
23
+ export {};
@@ -0,0 +1,239 @@
1
+ // The change_files tool's run path (Tool Design, "change_files"). add reads files from disk and uploads
2
+ // their bytes straight to Convex storage, so it runs here instead of through the shared callback in tools.ts.
3
+ // Backend actions: upload_start, add, discard, rename, move, copy, delete (write/files.ts).
4
+ import { readFile, stat } from "node:fs/promises";
5
+ import { homedir } from "node:os";
6
+ import { basename, isAbsolute, join } from "node:path";
7
+ import { callTool } from "./client.js";
8
+ import { FILES_PER_CALL, formatSize, isTextType, MAX_FILE_SIZE, TEXT_ADD_MAX, typeOfName, TYPES_SENTENCE, } from "./fileKinds.js";
9
+ import { formatChangeFiles, formatFilePreview, isFilePreview, } from "./formatChangeFiles.js";
10
+ import { errorResult, refuse, textResult, ToolRefusal } from "./result.js";
11
+ const TOOL = "change_files";
12
+ const NOTHING_CHANGED = "Nothing changed.";
13
+ const UPLOAD_TIMEOUT_MS = 120_000;
14
+ // The arguments each action takes; anything else is bad_argument, naming it (Tool Design, Arguments).
15
+ const TAKES = {
16
+ add: ["action", "task", "paths", "text", "name"],
17
+ rename: ["action", "task", "files", "name"],
18
+ move: ["action", "task", "files", "to"],
19
+ copy: ["action", "task", "files", "to"],
20
+ delete: ["action", "task", "files", "confirm_token"],
21
+ };
22
+ /** Every change_files refusal ends "Nothing changed." (write rule 7); a sentence may carry it already. */
23
+ const withNothingChanged = (m) => (m.includes(NOTHING_CHANGED) ? m : `${m.trimEnd()} ${NOTHING_CHANGED}`);
24
+ /** "That's 11 files, over the limit of 10 per call. ..." (W68 (b) for add; write/cap.ts). */
25
+ function checkPerCall(count, action) {
26
+ if (count <= FILES_PER_CALL)
27
+ return;
28
+ const split = action === "add" ? "Add them in two calls, or zip them." : `${action[0].toUpperCase()}${action.slice(1)} them in two calls.`;
29
+ refuse("over_limit", `That's ${count} files, over the limit of ${FILES_PER_CALL} per call. ${split}`);
30
+ }
31
+ function checkArgs(action, args) {
32
+ for (const key of Object.keys(args)) {
33
+ if (args[key] === undefined || TAKES[action].includes(key))
34
+ continue;
35
+ if (key === "confirm_token")
36
+ refuse("bad_argument", `${action} doesn't take confirm_token; only a delete's second call does.`);
37
+ refuse("bad_argument", `${action} doesn't take ${key}.`);
38
+ }
39
+ if (typeof args.task !== "string" || !args.task.trim()) {
40
+ refuse("bad_argument", "task is required: the alpha-ID of a milestone, task, or subtask.");
41
+ }
42
+ if (action !== "add") {
43
+ if (!Array.isArray(args.files))
44
+ refuse("bad_argument", `files is required: the names or IDs of the files to ${action}.`);
45
+ checkPerCall(args.files.length, action);
46
+ }
47
+ }
48
+ /** "~/Desktop/a.pdf" -> "/Users/me/Desktop/a.pdf". */
49
+ const expandHome = (p) => (p === "~" ? homedir() : p.startsWith("~/") ? join(homedir(), p.slice(2)) : p);
50
+ /**
51
+ * The local checks for paths, in the design's order, so a bad call never uploads: the count, then each
52
+ * path: absolute, there, a file and not a folder, at most 25 MB, a type the app takes.
53
+ */
54
+ export async function checkPaths(raw) {
55
+ const paths = raw;
56
+ checkPerCall(paths.length, "add");
57
+ const uploads = [];
58
+ for (const given of paths) {
59
+ const path = expandHome(given.trim());
60
+ if (!isAbsolute(path))
61
+ refuse("bad_argument", `paths must be absolute, like /Users/you/Desktop/spec.pdf. Got '${given}'.`);
62
+ let info;
63
+ try {
64
+ info = await stat(path);
65
+ }
66
+ catch {
67
+ return refuse("not_found", `No file at ${path}.`);
68
+ }
69
+ const name = basename(path);
70
+ if (info.isDirectory()) {
71
+ refuse("bad_argument", `'${name}' is a folder. Name the files, up to ${FILES_PER_CALL}, or zip the folder and add the zip.`);
72
+ }
73
+ if (!info.isFile())
74
+ refuse("bad_argument", `${path} isn't a regular file.`);
75
+ if (info.size > MAX_FILE_SIZE)
76
+ refuse("over_limit", `'${name}' is ${formatSize(info.size)}, over the app's 25 MB limit per file.`);
77
+ const type = typeOfName(name);
78
+ if (!type)
79
+ refuse("not_allowed", `'${name}' is a type the app doesn't take. ${TYPES_SENTENCE}`);
80
+ uploads.push({ name, type: type, size: info.size, bytes: async () => new Uint8Array(await readFile(path)) });
81
+ }
82
+ return uploads;
83
+ }
84
+ /** The local checks for a text add: its length, then the name's extension, then its UTF-8 size. */
85
+ export function checkText(text, rawName) {
86
+ const body = text;
87
+ if (body.length > TEXT_ADD_MAX) {
88
+ refuse("over_limit", `The text is ${body.length.toLocaleString("en-US")} characters, over the limit of ${TEXT_ADD_MAX.toLocaleString("en-US")} for a text add. Split it, or save it as a file and add the path.`);
89
+ }
90
+ if (typeof rawName !== "string" || !rawName.trim()) {
91
+ refuse("bad_argument", "add with text needs name: the file name with its extension, like notes.md.");
92
+ }
93
+ const name = rawName.trim();
94
+ const type = typeOfName(name);
95
+ if (!type || !isTextType(type)) {
96
+ refuse("bad_argument", `'${name}' needs a text extension: .md, .txt, .csv, .json, .html, .css, or .js.`);
97
+ }
98
+ const bytes = new TextEncoder().encode(body);
99
+ if (bytes.length > MAX_FILE_SIZE)
100
+ refuse("over_limit", `'${name}' is ${formatSize(bytes.length)}, over the app's 25 MB limit per file.`);
101
+ return { name, type: type, size: bytes.length, bytes: async () => bytes };
102
+ }
103
+ /** A backend call; a refusal comes back as a ToolRefusal with the backend's error. */
104
+ async function backend(args) {
105
+ const result = await callTool(TOOL, args);
106
+ if (!result.ok)
107
+ throw new ToolRefusal(result.error);
108
+ return result.data;
109
+ }
110
+ /** POSTs one file's bytes to its upload URL with its MIME type; answers the storage ID. The URL never goes into an error. */
111
+ export async function uploadBytes(url, file, bytes) {
112
+ let response;
113
+ try {
114
+ response = await fetch(url, {
115
+ method: "POST",
116
+ headers: { "Content-Type": file.type },
117
+ body: bytes, // Node takes any Uint8Array; the DOM types want an ArrayBuffer-backed one
118
+ signal: AbortSignal.timeout(UPLOAD_TIMEOUT_MS),
119
+ });
120
+ }
121
+ catch (e) {
122
+ const message = (e instanceof Error ? e.message : String(e)).split(url).join("the upload URL");
123
+ throw new Error(`Could not upload '${file.name}': ${message}.`);
124
+ }
125
+ if (!response.ok)
126
+ throw new Error(`Could not upload '${file.name}' (HTTP ${response.status}).`);
127
+ let storageId;
128
+ try {
129
+ storageId = (await response.json()).storageId;
130
+ }
131
+ catch {
132
+ storageId = undefined;
133
+ }
134
+ if (typeof storageId !== "string" || !storageId)
135
+ throw new Error(`Could not upload '${file.name}': no storage ID came back.`);
136
+ return storageId;
137
+ }
138
+ /** Deletes this call's uploads that have no file row. Best effort: its own failure never hides the first error. */
139
+ async function discard(storageIds) {
140
+ if (!storageIds.length)
141
+ return;
142
+ try {
143
+ await callTool(TOOL, { action: "discard", storage_ids: storageIds });
144
+ }
145
+ catch {
146
+ // The backend's add already discards on its own refusals; an upload left behind expires unused.
147
+ }
148
+ }
149
+ async function add(args) {
150
+ if (args.paths !== undefined && args.text !== undefined) {
151
+ refuse("bad_argument", "add takes paths or text, not both. Add the text file in its own call.");
152
+ }
153
+ if (args.paths !== undefined && args.name !== undefined) {
154
+ refuse("bad_argument", "add with paths doesn't take name; each file keeps its own name. Rename it after.");
155
+ }
156
+ if (args.paths === undefined && args.text === undefined) {
157
+ refuse("bad_argument", "add needs paths (absolute file paths) or text plus name.");
158
+ }
159
+ const uploads = args.paths !== undefined ? await checkPaths(args.paths) : [checkText(args.text, args.name)];
160
+ const task = args.task.trim();
161
+ // Nothing is written until add: upload_start checks the item, its count, and each declared size and type.
162
+ const start = await backend({
163
+ action: "upload_start",
164
+ task,
165
+ files: uploads.map((u) => ({ name: u.name, size: u.size, type: u.type })),
166
+ });
167
+ const stored = [];
168
+ try {
169
+ for (const [i, u] of uploads.entries())
170
+ stored.push(await uploadBytes(start.upload_urls[i], u, await u.bytes()));
171
+ return await backend({
172
+ action: "add",
173
+ task,
174
+ files: uploads.map((u, i) => ({ storage_id: stored[i], name: u.name })),
175
+ });
176
+ }
177
+ catch (e) {
178
+ await discard(stored);
179
+ throw e;
180
+ }
181
+ }
182
+ /** structuredContent: text first, then the change; never the backend's summary or a storage URL. */
183
+ function fieldsOf(r) {
184
+ const small = (f) => ({ id: f.id, name: f.name, kind: f.kind, size: f.size });
185
+ if (isFilePreview(r)) {
186
+ return {
187
+ action: "delete",
188
+ preview: true,
189
+ task: r.task,
190
+ files: r.files.map((f) => ({ ...small(f), added_by: f.added_by, added_at: f.added_at })),
191
+ count: r.count,
192
+ confirm_token: r.confirm_token,
193
+ expires_at: r.expires_at,
194
+ };
195
+ }
196
+ const out = { action: r.action, task: r.task };
197
+ if ("to" in r)
198
+ out.to = r.to;
199
+ out.files = r.files.map(small);
200
+ out.count = r.count;
201
+ if ("source_count" in r)
202
+ out.source_count = r.source_count;
203
+ if ("same_name" in r)
204
+ out.same_name = r.same_name.map((s) => ({ id: s.id, name: s.older_name, added_at: s.added_at }));
205
+ if ("unchanged" in r) {
206
+ out.old_name = r.old_name;
207
+ out.unchanged = r.unchanged;
208
+ }
209
+ return out;
210
+ }
211
+ /** A refusal: the sentence ending "Nothing changed.", and for a refused delete confirm, the fresh preview. */
212
+ function refusal(error) {
213
+ const message = withNothingChanged(error.message);
214
+ if (error.code === "confirm_required" && isFilePreview(error.details)) {
215
+ const text = `${message}\n${formatFilePreview(error.details)}`;
216
+ return { content: [{ type: "text", text }], structuredContent: { text, error: { ...error, message } }, isError: true };
217
+ }
218
+ // The ambiguous sentence already lists the files with dates, sizes, and IDs; don't print them twice.
219
+ const shown = error.code === "ambiguous" ? { ...error, message, candidates: undefined } : { ...error, message };
220
+ const result = errorResult(TOOL, shown);
221
+ return { ...result, structuredContent: { ...result.structuredContent, error: { ...error, message } } };
222
+ }
223
+ export async function runChangeFiles(args) {
224
+ try {
225
+ const action = args.action;
226
+ checkArgs(action, args);
227
+ const data = action === "add"
228
+ ? await add(args)
229
+ : await backend(Object.fromEntries(Object.entries(args).filter(([, v]) => v !== undefined)));
230
+ return textResult(formatChangeFiles(data), fieldsOf(data));
231
+ }
232
+ catch (e) {
233
+ if (e instanceof ToolRefusal)
234
+ return refusal(e.error);
235
+ const message = e instanceof Error ? e.message : String(e);
236
+ return refusal({ code: "internal", message });
237
+ }
238
+ }
239
+ //# sourceMappingURL=changeFiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changeFiles.js","sourceRoot":"","sources":["../src/changeFiles.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- export type ToolName = "find_tasks" | "get_task" | "count_tasks" | "list_views" | "list_projects" | "get_workspace_info" | "resolve" | "find_timecards" | "sum_time" | "find_comments" | "create_task" | "update_task" | "place_task" | "set_order" | "bulk_update_tasks" | "move_task" | "delete_task" | "add_comment" | "edit_comment" | "delete_comment" | "link_pull_request";
1
+ export type ToolName = "find_tasks" | "get_task" | "count_tasks" | "list_views" | "list_projects" | "get_workspace_info" | "resolve" | "find_timecards" | "sum_time" | "find_comments" | "files" | "change_files" | "create_task" | "update_task" | "place_task" | "set_order" | "bulk_update_tasks" | "move_task" | "delete_task" | "add_comment" | "edit_comment" | "delete_comment" | "link_pull_request" | "help";
2
2
  export declare const DESCRIPTIONS: Record<ToolName, {
3
3
  title: string;
4
4
  description: string;