@opentabs-dev/opentabs-plugin-microsoft-word 0.0.74

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/README.md +159 -0
  2. package/dist/adapter.iife.js +15874 -0
  3. package/dist/adapter.iife.js.map +7 -0
  4. package/dist/docx-utils.d.ts +63 -0
  5. package/dist/docx-utils.d.ts.map +1 -0
  6. package/dist/docx-utils.js +370 -0
  7. package/dist/docx-utils.js.map +1 -0
  8. package/dist/index.d.ts +14 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +78 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/microsoft-word-api.d.ts +17 -0
  13. package/dist/microsoft-word-api.d.ts.map +1 -0
  14. package/dist/microsoft-word-api.js +142 -0
  15. package/dist/microsoft-word-api.js.map +1 -0
  16. package/dist/tools/append-to-document.d.ts +8 -0
  17. package/dist/tools/append-to-document.d.ts.map +1 -0
  18. package/dist/tools/append-to-document.js +26 -0
  19. package/dist/tools/append-to-document.js.map +1 -0
  20. package/dist/tools/copy-item.d.ts +9 -0
  21. package/dist/tools/copy-item.d.ts.map +1 -0
  22. package/dist/tools/copy-item.js +69 -0
  23. package/dist/tools/copy-item.js.map +1 -0
  24. package/dist/tools/create-document.d.ts +20 -0
  25. package/dist/tools/create-document.d.ts.map +1 -0
  26. package/dist/tools/create-document.js +73 -0
  27. package/dist/tools/create-document.js.map +1 -0
  28. package/dist/tools/create-folder.d.ts +20 -0
  29. package/dist/tools/create-folder.d.ts.map +1 -0
  30. package/dist/tools/create-folder.js +30 -0
  31. package/dist/tools/create-folder.js.map +1 -0
  32. package/dist/tools/create-sharing-link.d.ts +22 -0
  33. package/dist/tools/create-sharing-link.d.ts.map +1 -0
  34. package/dist/tools/create-sharing-link.js +31 -0
  35. package/dist/tools/create-sharing-link.js.map +1 -0
  36. package/dist/tools/delete-item.d.ts +7 -0
  37. package/dist/tools/delete-item.d.ts.map +1 -0
  38. package/dist/tools/delete-item.js +24 -0
  39. package/dist/tools/delete-item.js.map +1 -0
  40. package/dist/tools/delete-permission.d.ts +8 -0
  41. package/dist/tools/delete-permission.d.ts.map +1 -0
  42. package/dist/tools/delete-permission.js +23 -0
  43. package/dist/tools/delete-permission.js.map +1 -0
  44. package/dist/tools/docx-edit-helpers.d.ts +10 -0
  45. package/dist/tools/docx-edit-helpers.d.ts.map +1 -0
  46. package/dist/tools/docx-edit-helpers.js +103 -0
  47. package/dist/tools/docx-edit-helpers.js.map +1 -0
  48. package/dist/tools/get-active-document.d.ts +18 -0
  49. package/dist/tools/get-active-document.d.ts.map +1 -0
  50. package/dist/tools/get-active-document.js +50 -0
  51. package/dist/tools/get-active-document.js.map +1 -0
  52. package/dist/tools/get-current-user.d.ts +9 -0
  53. package/dist/tools/get-current-user.d.ts.map +1 -0
  54. package/dist/tools/get-current-user.js +23 -0
  55. package/dist/tools/get-current-user.js.map +1 -0
  56. package/dist/tools/get-document-text.d.ts +8 -0
  57. package/dist/tools/get-document-text.d.ts.map +1 -0
  58. package/dist/tools/get-document-text.js +87 -0
  59. package/dist/tools/get-document-text.js.map +1 -0
  60. package/dist/tools/get-drive.d.ts +15 -0
  61. package/dist/tools/get-drive.d.ts.map +1 -0
  62. package/dist/tools/get-drive.js +19 -0
  63. package/dist/tools/get-drive.js.map +1 -0
  64. package/dist/tools/get-file-content.d.ts +8 -0
  65. package/dist/tools/get-file-content.d.ts.map +1 -0
  66. package/dist/tools/get-file-content.js +74 -0
  67. package/dist/tools/get-file-content.js.map +1 -0
  68. package/dist/tools/get-item.d.ts +19 -0
  69. package/dist/tools/get-item.d.ts.map +1 -0
  70. package/dist/tools/get-item.js +25 -0
  71. package/dist/tools/get-item.js.map +1 -0
  72. package/dist/tools/get-preview-url.d.ts +7 -0
  73. package/dist/tools/get-preview-url.d.ts.map +1 -0
  74. package/dist/tools/get-preview-url.js +22 -0
  75. package/dist/tools/get-preview-url.js.map +1 -0
  76. package/dist/tools/list-children.d.ts +21 -0
  77. package/dist/tools/list-children.d.ts.map +1 -0
  78. package/dist/tools/list-children.js +33 -0
  79. package/dist/tools/list-children.js.map +1 -0
  80. package/dist/tools/list-permissions.d.ts +13 -0
  81. package/dist/tools/list-permissions.d.ts.map +1 -0
  82. package/dist/tools/list-permissions.js +23 -0
  83. package/dist/tools/list-permissions.js.map +1 -0
  84. package/dist/tools/list-recent-documents.d.ts +19 -0
  85. package/dist/tools/list-recent-documents.d.ts.map +1 -0
  86. package/dist/tools/list-recent-documents.js +27 -0
  87. package/dist/tools/list-recent-documents.js.map +1 -0
  88. package/dist/tools/list-shared-with-me.d.ts +19 -0
  89. package/dist/tools/list-shared-with-me.d.ts.map +1 -0
  90. package/dist/tools/list-shared-with-me.js +28 -0
  91. package/dist/tools/list-shared-with-me.js.map +1 -0
  92. package/dist/tools/list-versions.d.ts +11 -0
  93. package/dist/tools/list-versions.d.ts.map +1 -0
  94. package/dist/tools/list-versions.js +23 -0
  95. package/dist/tools/list-versions.js.map +1 -0
  96. package/dist/tools/move-item.d.ts +20 -0
  97. package/dist/tools/move-item.d.ts.map +1 -0
  98. package/dist/tools/move-item.js +27 -0
  99. package/dist/tools/move-item.js.map +1 -0
  100. package/dist/tools/rename-item.d.ts +20 -0
  101. package/dist/tools/rename-item.d.ts.map +1 -0
  102. package/dist/tools/rename-item.js +27 -0
  103. package/dist/tools/rename-item.js.map +1 -0
  104. package/dist/tools/replace-text-in-document.d.ts +10 -0
  105. package/dist/tools/replace-text-in-document.d.ts.map +1 -0
  106. package/dist/tools/replace-text-in-document.js +31 -0
  107. package/dist/tools/replace-text-in-document.js.map +1 -0
  108. package/dist/tools/restore-version.d.ts +8 -0
  109. package/dist/tools/restore-version.d.ts.map +1 -0
  110. package/dist/tools/restore-version.js +23 -0
  111. package/dist/tools/restore-version.js.map +1 -0
  112. package/dist/tools/schemas.d.ts +155 -0
  113. package/dist/tools/schemas.d.ts.map +1 -0
  114. package/dist/tools/schemas.js +90 -0
  115. package/dist/tools/schemas.js.map +1 -0
  116. package/dist/tools/search-files.d.ts +20 -0
  117. package/dist/tools/search-files.d.ts.map +1 -0
  118. package/dist/tools/search-files.js +29 -0
  119. package/dist/tools/search-files.js.map +1 -0
  120. package/dist/tools/update-document.d.ts +8 -0
  121. package/dist/tools/update-document.d.ts.map +1 -0
  122. package/dist/tools/update-document.js +26 -0
  123. package/dist/tools/update-document.js.map +1 -0
  124. package/dist/tools/update-file-content.d.ts +21 -0
  125. package/dist/tools/update-file-content.d.ts.map +1 -0
  126. package/dist/tools/update-file-content.js +66 -0
  127. package/dist/tools/update-file-content.js.map +1 -0
  128. package/dist/tools/upload-file.d.ts +21 -0
  129. package/dist/tools/upload-file.d.ts.map +1 -0
  130. package/dist/tools/upload-file.js +64 -0
  131. package/dist/tools/upload-file.js.map +1 -0
  132. package/dist/tools.json +1940 -0
  133. package/package.json +55 -0
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Shared helpers for tools that download, modify, and re-upload .docx files.
3
+ */
4
+ import { ToolError, clearAuthCache } from '@opentabs-dev/plugin-sdk';
5
+ import { extractAllZipEntries, rebuildZip } from '../docx-utils.js';
6
+ import { getGraphToken } from '../microsoft-word-api.js';
7
+ const GRAPH_API_BASE = 'https://graph.microsoft.com/v1.0';
8
+ const DOCX_MIME = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
9
+ /** Download a .docx file and return all ZIP entries plus the document.xml as text. */
10
+ export async function downloadDocxEntries(itemId) {
11
+ const token = getGraphToken();
12
+ // Get the pre-authenticated download URL
13
+ const metaResp = await fetchWithErrorHandling(`${GRAPH_API_BASE}/me/drive/items/${itemId}`, {
14
+ headers: { Authorization: `Bearer ${token}` },
15
+ credentials: 'omit',
16
+ });
17
+ const meta = (await metaResp.json());
18
+ if (!meta['@microsoft.graph.downloadUrl']) {
19
+ throw ToolError.internal('No download URL available for this item.');
20
+ }
21
+ const mimeType = meta.file?.mimeType ?? '';
22
+ if (mimeType && !mimeType.includes('wordprocessingml') && !mimeType.includes('msword')) {
23
+ throw ToolError.validation(`This file is not a Word document (${mimeType}). Only .docx files can be edited.`);
24
+ }
25
+ // Download the binary
26
+ const docResp = await fetchWithErrorHandling(meta['@microsoft.graph.downloadUrl'], {});
27
+ const docBytes = new Uint8Array(await docResp.arrayBuffer());
28
+ // Extract all ZIP entries
29
+ const entries = await extractAllZipEntries(docBytes);
30
+ const docIndex = entries.findIndex(e => e.name === 'word/document.xml');
31
+ if (docIndex === -1) {
32
+ throw ToolError.internal('Could not find word/document.xml in the .docx archive.');
33
+ }
34
+ const entry = entries[docIndex];
35
+ if (!entry) {
36
+ throw ToolError.internal('Could not read word/document.xml from the .docx archive.');
37
+ }
38
+ const documentXml = new TextDecoder().decode(entry.data);
39
+ return { entries, documentXml, documentXmlIndex: docIndex };
40
+ }
41
+ /** Replace the document.xml in entries and re-upload the .docx to OneDrive. */
42
+ export async function uploadModifiedDocx(itemId, entries, documentXmlIndex, newDocumentXml) {
43
+ const token = getGraphToken();
44
+ const encoder = new TextEncoder();
45
+ // Replace document.xml content
46
+ entries[documentXmlIndex] = {
47
+ name: 'word/document.xml',
48
+ data: encoder.encode(newDocumentXml),
49
+ };
50
+ // Rebuild the ZIP
51
+ const zipBytes = rebuildZip(entries);
52
+ // Upload back — PUT to /content endpoint
53
+ const body = new ArrayBuffer(zipBytes.byteLength);
54
+ new Uint8Array(body).set(zipBytes);
55
+ const resp = await fetchWithErrorHandling(`${GRAPH_API_BASE}/me/drive/items/${itemId}/content`, {
56
+ method: 'PUT',
57
+ credentials: 'omit',
58
+ headers: {
59
+ Authorization: `Bearer ${token}`,
60
+ 'Content-Type': DOCX_MIME,
61
+ },
62
+ body,
63
+ });
64
+ // Consume the response to avoid leaking
65
+ await resp.json();
66
+ }
67
+ /** Wrapper around fetch with standard error handling for Graph API calls. */
68
+ async function fetchWithErrorHandling(url, init) {
69
+ let response;
70
+ try {
71
+ response = await fetch(url, {
72
+ ...init,
73
+ signal: AbortSignal.timeout(30_000),
74
+ });
75
+ }
76
+ catch (err) {
77
+ if (err instanceof DOMException && err.name === 'TimeoutError') {
78
+ throw ToolError.timeout('Microsoft Graph API request timed out.');
79
+ }
80
+ throw ToolError.internal(`Network error: ${err instanceof Error ? err.message : 'unknown'}`);
81
+ }
82
+ if (response.status === 401 || response.status === 403) {
83
+ clearAuthCache('microsoft-word');
84
+ throw ToolError.auth('Authentication expired — please refresh the page.');
85
+ }
86
+ if (response.status === 404) {
87
+ throw ToolError.notFound('Document not found.');
88
+ }
89
+ if (!response.ok) {
90
+ let errorMsg = `Microsoft Graph API error (${response.status})`;
91
+ try {
92
+ const errBody = (await response.json());
93
+ if (errBody.error?.message)
94
+ errorMsg = errBody.error.message;
95
+ }
96
+ catch {
97
+ // ignore parse errors
98
+ }
99
+ throw ToolError.internal(errorMsg);
100
+ }
101
+ return response;
102
+ }
103
+ //# sourceMappingURL=docx-edit-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docx-edit-helpers.js","sourceRoot":"","sources":["../../src/tools/docx-edit-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { z } from 'zod';
2
+ export declare const getActiveDocument: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{}, z.core.$strip>, z.ZodObject<{
3
+ item: z.ZodObject<{
4
+ id: z.ZodString;
5
+ name: z.ZodString;
6
+ size: z.ZodNumber;
7
+ is_folder: z.ZodBoolean;
8
+ mime_type: z.ZodString;
9
+ web_url: z.ZodString;
10
+ created_at: z.ZodString;
11
+ last_modified_at: z.ZodString;
12
+ parent_path: z.ZodString;
13
+ parent_id: z.ZodString;
14
+ description: z.ZodString;
15
+ }, z.core.$strip>;
16
+ drive_id: z.ZodString;
17
+ }, z.core.$strip>>;
18
+ //# sourceMappingURL=get-active-document.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-active-document.d.ts","sourceRoot":"","sources":["../../src/tools/get-active-document.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;kBAgD5B,CAAC"}
@@ -0,0 +1,50 @@
1
+ import { defineTool, getCurrentUrl, getPageTitle } from '@opentabs-dev/plugin-sdk';
2
+ import { z } from 'zod';
3
+ import { api } from '../microsoft-word-api.js';
4
+ import { driveItemSchema, mapDriveItem } from './schemas.js';
5
+ export const getActiveDocument = defineTool({
6
+ name: 'get_active_document',
7
+ displayName: 'Get Active Document',
8
+ description: 'Get information about the document currently open in the Word Online editor. Returns the document ID, name, and metadata. The document ID can then be used with get_document_text, update_document, append_to_document, replace_text_in_document, and other tools. This is the recommended first step — call this to discover the active document before reading or editing it.',
9
+ summary: 'Get the currently open document',
10
+ icon: 'file',
11
+ group: 'Documents',
12
+ input: z.object({}),
13
+ output: z.object({
14
+ item: driveItemSchema.describe('The currently open document'),
15
+ drive_id: z.string().describe('Drive ID (needed for some advanced operations)'),
16
+ }),
17
+ handle: async () => {
18
+ const url = getCurrentUrl();
19
+ const parsed = new URL(url);
20
+ const docId = parsed.searchParams.get('docId');
21
+ const driveId = parsed.searchParams.get('driveId');
22
+ if (!docId || !driveId) {
23
+ // Not on a document page — try to get info from page title
24
+ const title = getPageTitle();
25
+ return {
26
+ item: {
27
+ id: '',
28
+ name: title || 'Unknown',
29
+ size: 0,
30
+ is_folder: false,
31
+ mime_type: '',
32
+ web_url: url,
33
+ created_at: '',
34
+ last_modified_at: '',
35
+ parent_path: '',
36
+ parent_id: '',
37
+ description: '',
38
+ },
39
+ drive_id: '',
40
+ };
41
+ }
42
+ // Fetch full metadata using the docId from the URL
43
+ const data = await api(`/drives/${driveId}/items/${docId}`);
44
+ return {
45
+ item: mapDriveItem(data),
46
+ drive_id: driveId,
47
+ };
48
+ },
49
+ });
50
+ //# sourceMappingURL=get-active-document.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-active-document.js","sourceRoot":"","sources":["../../src/tools/get-active-document.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACnF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAC/C,OAAO,EAAqB,eAAe,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEhF,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAAU,CAAC;IAC1C,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EAAE,qBAAqB;IAClC,WAAW,EACT,iXAAiX;IACnX,OAAO,EAAE,iCAAiC;IAC1C,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,WAAW;IAClB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACnB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,IAAI,EAAE,eAAe,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QAC7D,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;KAChF,CAAC;IACF,MAAM,EAAE,KAAK,IAAI,EAAE;QACjB,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAEnD,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;YACvB,2DAA2D;YAC3D,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;YAC7B,OAAO;gBACL,IAAI,EAAE;oBACJ,EAAE,EAAE,EAAE;oBACN,IAAI,EAAE,KAAK,IAAI,SAAS;oBACxB,IAAI,EAAE,CAAC;oBACP,SAAS,EAAE,KAAK;oBAChB,SAAS,EAAE,EAAE;oBACb,OAAO,EAAE,GAAG;oBACZ,UAAU,EAAE,EAAE;oBACd,gBAAgB,EAAE,EAAE;oBACpB,WAAW,EAAE,EAAE;oBACf,SAAS,EAAE,EAAE;oBACb,WAAW,EAAE,EAAE;iBAChB;gBACD,QAAQ,EAAE,EAAE;aACb,CAAC;QACJ,CAAC;QAED,mDAAmD;QACnD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAe,WAAW,OAAO,UAAU,KAAK,EAAE,CAAC,CAAC;QAE1E,OAAO;YACL,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC;YACxB,QAAQ,EAAE,OAAO;SAClB,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { z } from 'zod';
2
+ export declare const getCurrentUser: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{}, z.core.$strip>, z.ZodObject<{
3
+ user: z.ZodObject<{
4
+ id: z.ZodString;
5
+ display_name: z.ZodString;
6
+ email: z.ZodString;
7
+ }, z.core.$strip>;
8
+ }, z.core.$strip>>;
9
+ //# sourceMappingURL=get-current-user.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-current-user.d.ts","sourceRoot":"","sources":["../../src/tools/get-current-user.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,cAAc;;;;;;kBAiBzB,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { defineTool } from '@opentabs-dev/plugin-sdk';
2
+ import { z } from 'zod';
3
+ import { api } from '../microsoft-word-api.js';
4
+ import { mapUser, userSchema } from './schemas.js';
5
+ export const getCurrentUser = defineTool({
6
+ name: 'get_current_user',
7
+ displayName: 'Get Current User',
8
+ description: 'Get the profile of the currently authenticated Microsoft 365 user including name and email.',
9
+ summary: 'Get the current user profile',
10
+ icon: 'user',
11
+ group: 'Account',
12
+ input: z.object({}),
13
+ output: z.object({ user: userSchema }),
14
+ handle: async () => {
15
+ const data = await api('/me', {
16
+ query: {
17
+ $select: 'id,displayName,mail,userPrincipalName',
18
+ },
19
+ });
20
+ return { user: mapUser(data) };
21
+ },
22
+ });
23
+ //# sourceMappingURL=get-current-user.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-current-user.js","sourceRoot":"","sources":["../../src/tools/get-current-user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAC/C,OAAO,EAAgB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEjE,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;IACvC,IAAI,EAAE,kBAAkB;IACxB,WAAW,EAAE,kBAAkB;IAC/B,WAAW,EAAE,6FAA6F;IAC1G,OAAO,EAAE,8BAA8B;IACvC,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACnB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IACtC,MAAM,EAAE,KAAK,IAAI,EAAE;QACjB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAU,KAAK,EAAE;YACrC,KAAK,EAAE;gBACL,OAAO,EAAE,uCAAuC;aACjD;SACF,CAAC,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;IACjC,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { z } from 'zod';
2
+ export declare const getDocumentText: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
3
+ item_id: z.ZodString;
4
+ }, z.core.$strip>, z.ZodObject<{
5
+ paragraphs: z.ZodArray<z.ZodString>;
6
+ text: z.ZodString;
7
+ }, z.core.$strip>>;
8
+ //# sourceMappingURL=get-document-text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-document-text.d.ts","sourceRoot":"","sources":["../../src/tools/get-document-text.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,eAAe;;;;;kBA2F1B,CAAC"}
@@ -0,0 +1,87 @@
1
+ import { ToolError, clearAuthCache, defineTool } from '@opentabs-dev/plugin-sdk';
2
+ import { z } from 'zod';
3
+ import { extractTextFromDocumentXml, extractZipEntry } from '../docx-utils.js';
4
+ import { getGraphToken } from '../microsoft-word-api.js';
5
+ const GRAPH_API_BASE = 'https://graph.microsoft.com/v1.0';
6
+ export const getDocumentText = defineTool({
7
+ name: 'get_document_text',
8
+ displayName: 'Get Document Text',
9
+ description: 'Extract plain text content from a Word document (.docx). Downloads the binary file, decompresses the OOXML archive, and extracts text from all paragraphs. Returns paragraphs as an array of strings.',
10
+ summary: 'Extract text from a Word document',
11
+ icon: 'file-text',
12
+ group: 'Documents',
13
+ input: z.object({
14
+ item_id: z.string().describe('File ID of the .docx document (from list_children or search_files)'),
15
+ }),
16
+ output: z.object({
17
+ paragraphs: z.array(z.string()).describe('Text paragraphs extracted from the document'),
18
+ text: z.string().describe('Full document text with paragraphs joined by newlines'),
19
+ }),
20
+ handle: async (params) => {
21
+ const token = getGraphToken();
22
+ // Get the pre-authenticated download URL from item metadata
23
+ let downloadUrl;
24
+ try {
25
+ const metaResp = await fetch(`${GRAPH_API_BASE}/me/drive/items/${params.item_id}`, {
26
+ headers: { Authorization: `Bearer ${token}` },
27
+ credentials: 'omit',
28
+ signal: AbortSignal.timeout(15_000),
29
+ });
30
+ if (metaResp.status === 401 || metaResp.status === 403) {
31
+ clearAuthCache('microsoft-word');
32
+ throw ToolError.auth('Authentication expired — please refresh the page.');
33
+ }
34
+ if (metaResp.status === 404) {
35
+ throw ToolError.notFound('Document not found.');
36
+ }
37
+ if (!metaResp.ok) {
38
+ throw ToolError.internal(`Failed to get document metadata (${metaResp.status})`);
39
+ }
40
+ const meta = (await metaResp.json());
41
+ if (!meta['@microsoft.graph.downloadUrl']) {
42
+ throw ToolError.internal('No download URL available for this item.');
43
+ }
44
+ // Verify it's a .docx file
45
+ const mimeType = meta.file?.mimeType ?? '';
46
+ if (mimeType && !mimeType.includes('wordprocessingml') && !mimeType.includes('msword')) {
47
+ throw ToolError.validation(`This file is not a Word document (${mimeType}). Use get_file_content for text-based files.`);
48
+ }
49
+ downloadUrl = meta['@microsoft.graph.downloadUrl'];
50
+ }
51
+ catch (err) {
52
+ if (err instanceof ToolError)
53
+ throw err;
54
+ if (err instanceof DOMException && err.name === 'TimeoutError') {
55
+ throw ToolError.timeout('Request timed out.');
56
+ }
57
+ throw ToolError.internal(`Failed to get document: ${err instanceof Error ? err.message : 'unknown'}`);
58
+ }
59
+ // Download the .docx binary
60
+ let docBytes;
61
+ try {
62
+ const docResp = await fetch(downloadUrl, {
63
+ signal: AbortSignal.timeout(30_000),
64
+ });
65
+ if (!docResp.ok) {
66
+ throw ToolError.internal(`Failed to download document (${docResp.status})`);
67
+ }
68
+ docBytes = new Uint8Array(await docResp.arrayBuffer());
69
+ }
70
+ catch (err) {
71
+ if (err instanceof ToolError)
72
+ throw err;
73
+ throw ToolError.internal(`Failed to download: ${err instanceof Error ? err.message : 'unknown'}`);
74
+ }
75
+ // Extract word/document.xml from the ZIP archive
76
+ const xml = await extractZipEntry(docBytes, 'word/document.xml');
77
+ if (!xml) {
78
+ throw ToolError.internal('Could not find word/document.xml in the .docx archive.');
79
+ }
80
+ const paragraphs = extractTextFromDocumentXml(xml);
81
+ return {
82
+ paragraphs,
83
+ text: paragraphs.join('\n'),
84
+ };
85
+ },
86
+ });
87
+ //# sourceMappingURL=get-document-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-document-text.js","sourceRoot":"","sources":["../../src/tools/get-document-text.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { z } from 'zod';
2
+ export declare const getDrive: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{}, z.core.$strip>, z.ZodObject<{
3
+ drive: z.ZodObject<{
4
+ id: z.ZodString;
5
+ name: z.ZodString;
6
+ drive_type: z.ZodString;
7
+ quota: z.ZodObject<{
8
+ total: z.ZodNumber;
9
+ used: z.ZodNumber;
10
+ remaining: z.ZodNumber;
11
+ state: z.ZodString;
12
+ }, z.core.$strip>;
13
+ }, z.core.$strip>;
14
+ }, z.core.$strip>>;
15
+ //# sourceMappingURL=get-drive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-drive.d.ts","sourceRoot":"","sources":["../../src/tools/get-drive.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,QAAQ;;;;;;;;;;;;kBAanB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { defineTool } from '@opentabs-dev/plugin-sdk';
2
+ import { z } from 'zod';
3
+ import { api } from '../microsoft-word-api.js';
4
+ import { driveSchema, mapDrive } from './schemas.js';
5
+ export const getDrive = defineTool({
6
+ name: 'get_drive',
7
+ displayName: 'Get Drive',
8
+ description: "Get the current user's OneDrive information including storage quota and drive type.",
9
+ summary: 'Get OneDrive details',
10
+ icon: 'hard-drive',
11
+ group: 'Drive',
12
+ input: z.object({}),
13
+ output: z.object({ drive: driveSchema }),
14
+ handle: async () => {
15
+ const data = await api('/me/drive');
16
+ return { drive: mapDrive(data) };
17
+ },
18
+ });
19
+ //# sourceMappingURL=get-drive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-drive.js","sourceRoot":"","sources":["../../src/tools/get-drive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAC/C,OAAO,EAAiB,WAAW,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAEpE,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAC;IACjC,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,WAAW;IACxB,WAAW,EAAE,qFAAqF;IAClG,OAAO,EAAE,sBAAsB;IAC/B,IAAI,EAAE,YAAY;IAClB,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACnB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IACxC,MAAM,EAAE,KAAK,IAAI,EAAE;QACjB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAW,WAAW,CAAC,CAAC;QAC9C,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACnC,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { z } from 'zod';
2
+ export declare const getFileContent: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
3
+ item_id: z.ZodString;
4
+ }, z.core.$strip>, z.ZodObject<{
5
+ content: z.ZodString;
6
+ size: z.ZodNumber;
7
+ }, z.core.$strip>>;
8
+ //# sourceMappingURL=get-file-content.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-file-content.d.ts","sourceRoot":"","sources":["../../src/tools/get-file-content.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,cAAc;;;;;kBAyEzB,CAAC"}
@@ -0,0 +1,74 @@
1
+ import { ToolError, clearAuthCache, defineTool } from '@opentabs-dev/plugin-sdk';
2
+ import { z } from 'zod';
3
+ import { getGraphToken } from '../microsoft-word-api.js';
4
+ const GRAPH_API_BASE = 'https://graph.microsoft.com/v1.0';
5
+ export const getFileContent = defineTool({
6
+ name: 'get_file_content',
7
+ displayName: 'Get File Content',
8
+ description: 'Read text content of a file by its ID. Works with text-based files (.txt, .md, .csv, .html, .json, .xml, .yaml, .log, etc.). For Word documents (.docx), use get_document_text instead.',
9
+ summary: 'Read text content of a file',
10
+ icon: 'file-code',
11
+ group: 'Files',
12
+ input: z.object({
13
+ item_id: z.string().describe('File ID'),
14
+ }),
15
+ output: z.object({
16
+ content: z.string().describe('File text content'),
17
+ size: z.number().describe('Content size in bytes'),
18
+ }),
19
+ handle: async (params) => {
20
+ const token = getGraphToken();
21
+ // Get the pre-authenticated download URL from item metadata
22
+ let downloadUrl;
23
+ try {
24
+ const metaResp = await fetch(`${GRAPH_API_BASE}/me/drive/items/${params.item_id}`, {
25
+ headers: { Authorization: `Bearer ${token}` },
26
+ credentials: 'omit',
27
+ signal: AbortSignal.timeout(15_000),
28
+ });
29
+ if (metaResp.status === 401 || metaResp.status === 403) {
30
+ clearAuthCache('microsoft-word');
31
+ throw ToolError.auth('Authentication expired — please refresh the page.');
32
+ }
33
+ if (metaResp.status === 404) {
34
+ throw ToolError.notFound('File not found.');
35
+ }
36
+ if (!metaResp.ok) {
37
+ throw ToolError.internal(`Failed to get file metadata (${metaResp.status})`);
38
+ }
39
+ const meta = (await metaResp.json());
40
+ if (!meta['@microsoft.graph.downloadUrl']) {
41
+ throw ToolError.internal('No download URL available for this file.');
42
+ }
43
+ downloadUrl = meta['@microsoft.graph.downloadUrl'];
44
+ }
45
+ catch (err) {
46
+ if (err instanceof ToolError)
47
+ throw err;
48
+ if (err instanceof DOMException && err.name === 'TimeoutError') {
49
+ throw ToolError.timeout('Request timed out.');
50
+ }
51
+ throw ToolError.internal(`Failed to get file: ${err instanceof Error ? err.message : 'unknown'}`);
52
+ }
53
+ // Download and read as text
54
+ try {
55
+ const resp = await fetch(downloadUrl, {
56
+ signal: AbortSignal.timeout(30_000),
57
+ });
58
+ if (!resp.ok) {
59
+ throw ToolError.internal(`Failed to download file (${resp.status})`);
60
+ }
61
+ const content = await resp.text();
62
+ return {
63
+ content,
64
+ size: content.length,
65
+ };
66
+ }
67
+ catch (err) {
68
+ if (err instanceof ToolError)
69
+ throw err;
70
+ throw ToolError.internal(`Failed to read file: ${err instanceof Error ? err.message : 'unknown'}`);
71
+ }
72
+ },
73
+ });
74
+ //# sourceMappingURL=get-file-content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-file-content.js","sourceRoot":"","sources":["../../src/tools/get-file-content.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { z } from 'zod';
2
+ export declare const getItem: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
3
+ item_id: z.ZodString;
4
+ }, z.core.$strip>, z.ZodObject<{
5
+ item: z.ZodObject<{
6
+ id: z.ZodString;
7
+ name: z.ZodString;
8
+ size: z.ZodNumber;
9
+ is_folder: z.ZodBoolean;
10
+ mime_type: z.ZodString;
11
+ web_url: z.ZodString;
12
+ created_at: z.ZodString;
13
+ last_modified_at: z.ZodString;
14
+ parent_path: z.ZodString;
15
+ parent_id: z.ZodString;
16
+ description: z.ZodString;
17
+ }, z.core.$strip>;
18
+ }, z.core.$strip>>;
19
+ //# sourceMappingURL=get-item.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-item.d.ts","sourceRoot":"","sources":["../../src/tools/get-item.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;kBAmBlB,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { defineTool } from '@opentabs-dev/plugin-sdk';
2
+ import { z } from 'zod';
3
+ import { api } from '../microsoft-word-api.js';
4
+ import { driveItemSchema, mapDriveItem } from './schemas.js';
5
+ export const getItem = defineTool({
6
+ name: 'get_item',
7
+ displayName: 'Get Item',
8
+ description: 'Get metadata for a file or folder by its ID.',
9
+ summary: 'Get file or folder details',
10
+ icon: 'file',
11
+ group: 'Files',
12
+ input: z.object({
13
+ item_id: z.string().describe('File or folder ID'),
14
+ }),
15
+ output: z.object({ item: driveItemSchema }),
16
+ handle: async (params) => {
17
+ const data = await api(`/me/drive/items/${params.item_id}`, {
18
+ query: {
19
+ $select: 'id,name,folder,file,size,lastModifiedDateTime,webUrl,parentReference,createdDateTime,description',
20
+ },
21
+ });
22
+ return { item: mapDriveItem(data) };
23
+ },
24
+ });
25
+ //# sourceMappingURL=get-item.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-item.js","sourceRoot":"","sources":["../../src/tools/get-item.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAC/C,OAAO,EAAqB,eAAe,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEhF,MAAM,CAAC,MAAM,OAAO,GAAG,UAAU,CAAC;IAChC,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE,UAAU;IACvB,WAAW,EAAE,8CAA8C;IAC3D,OAAO,EAAE,4BAA4B;IACrC,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;KAClD,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;IAC3C,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAe,mBAAmB,MAAM,CAAC,OAAO,EAAE,EAAE;YACxE,KAAK,EAAE;gBACL,OAAO,EAAE,kGAAkG;aAC5G;SACF,CAAC,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;IACtC,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { z } from 'zod';
2
+ export declare const getPreviewUrl: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
3
+ item_id: z.ZodString;
4
+ }, z.core.$strip>, z.ZodObject<{
5
+ url: z.ZodString;
6
+ }, z.core.$strip>>;
7
+ //# sourceMappingURL=get-preview-url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-preview-url.d.ts","sourceRoot":"","sources":["../../src/tools/get-preview-url.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,aAAa;;;;kBAiBxB,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { defineTool } from '@opentabs-dev/plugin-sdk';
2
+ import { z } from 'zod';
3
+ import { api } from '../microsoft-word-api.js';
4
+ export const getPreviewUrl = defineTool({
5
+ name: 'get_preview_url',
6
+ displayName: 'Get Preview URL',
7
+ description: 'Get an embeddable preview URL for a document. Useful for generating view-only links.',
8
+ summary: 'Get a document preview URL',
9
+ icon: 'eye',
10
+ group: 'Files',
11
+ input: z.object({
12
+ item_id: z.string().describe('File ID'),
13
+ }),
14
+ output: z.object({
15
+ url: z.string().describe('Embeddable preview URL'),
16
+ }),
17
+ handle: async ({ item_id }) => {
18
+ const data = await api(`/me/drive/items/${item_id}/preview`, { method: 'POST', body: {} });
19
+ return { url: data.getUrl };
20
+ },
21
+ });
22
+ //# sourceMappingURL=get-preview-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-preview-url.js","sourceRoot":"","sources":["../../src/tools/get-preview-url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAE/C,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC;IACtC,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,iBAAiB;IAC9B,WAAW,EAAE,sFAAsF;IACnG,OAAO,EAAE,4BAA4B;IACrC,IAAI,EAAE,KAAK;IACX,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;KACxC,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;KACnD,CAAC;IACF,MAAM,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QAC5B,MAAM,IAAI,GAAG,MAAM,GAAG,CAAqB,mBAAmB,OAAO,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/G,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IAC9B,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { z } from 'zod';
2
+ export declare const listChildren: import("@opentabs-dev/plugin-sdk").ToolDefinition<z.ZodObject<{
3
+ item_id: z.ZodOptional<z.ZodString>;
4
+ top: z.ZodOptional<z.ZodNumber>;
5
+ order_by: z.ZodOptional<z.ZodString>;
6
+ }, z.core.$strip>, z.ZodObject<{
7
+ items: z.ZodArray<z.ZodObject<{
8
+ id: z.ZodString;
9
+ name: z.ZodString;
10
+ size: z.ZodNumber;
11
+ is_folder: z.ZodBoolean;
12
+ mime_type: z.ZodString;
13
+ web_url: z.ZodString;
14
+ created_at: z.ZodString;
15
+ last_modified_at: z.ZodString;
16
+ parent_path: z.ZodString;
17
+ parent_id: z.ZodString;
18
+ description: z.ZodString;
19
+ }, z.core.$strip>>;
20
+ }, z.core.$strip>>;
21
+ //# sourceMappingURL=list-children.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-children.d.ts","sourceRoot":"","sources":["../../src/tools/list-children.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;kBA2BvB,CAAC"}