@divyacon/piece-google-docs 0.0.0-stage → 0.1.1

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 (243) hide show
  1. package/LICENSE.MIT-AP +24 -0
  2. package/dist/index.d.ts +6 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +128 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/lib/actions/append-text.d.ts +8 -0
  7. package/dist/lib/actions/append-text.d.ts.map +1 -0
  8. package/dist/lib/actions/append-text.js +40 -0
  9. package/dist/lib/actions/append-text.js.map +1 -0
  10. package/dist/lib/actions/batch-update.action.d.ts +8 -0
  11. package/dist/lib/actions/batch-update.action.d.ts.map +1 -0
  12. package/dist/lib/actions/batch-update.action.js +63 -0
  13. package/dist/lib/actions/batch-update.action.js.map +1 -0
  14. package/dist/lib/actions/copy-document.action.d.ts +12 -0
  15. package/dist/lib/actions/copy-document.action.d.ts.map +1 -0
  16. package/dist/lib/actions/copy-document.action.js +72 -0
  17. package/dist/lib/actions/copy-document.action.js.map +1 -0
  18. package/dist/lib/actions/create-and-populate-table.action.d.ts +8 -0
  19. package/dist/lib/actions/create-and-populate-table.action.d.ts.map +1 -0
  20. package/dist/lib/actions/create-and-populate-table.action.js +138 -0
  21. package/dist/lib/actions/create-and-populate-table.action.js.map +1 -0
  22. package/dist/lib/actions/create-document-based-on-template.action.d.ts +10 -0
  23. package/dist/lib/actions/create-document-based-on-template.action.d.ts.map +1 -0
  24. package/dist/lib/actions/create-document-based-on-template.action.js +107 -0
  25. package/dist/lib/actions/create-document-based-on-template.action.js.map +1 -0
  26. package/dist/lib/actions/create-document-from-markdown.action.d.ts +8 -0
  27. package/dist/lib/actions/create-document-from-markdown.action.d.ts.map +1 -0
  28. package/dist/lib/actions/create-document-from-markdown.action.js +69 -0
  29. package/dist/lib/actions/create-document-from-markdown.action.js.map +1 -0
  30. package/dist/lib/actions/create-document.d.ts +8 -0
  31. package/dist/lib/actions/create-document.d.ts.map +1 -0
  32. package/dist/lib/actions/create-document.js +35 -0
  33. package/dist/lib/actions/create-document.js.map +1 -0
  34. package/dist/lib/actions/create-footer.action.d.ts +8 -0
  35. package/dist/lib/actions/create-footer.action.d.ts.map +1 -0
  36. package/dist/lib/actions/create-footer.action.js +66 -0
  37. package/dist/lib/actions/create-footer.action.js.map +1 -0
  38. package/dist/lib/actions/create-footnote.action.d.ts +8 -0
  39. package/dist/lib/actions/create-footnote.action.d.ts.map +1 -0
  40. package/dist/lib/actions/create-footnote.action.js +58 -0
  41. package/dist/lib/actions/create-footnote.action.js.map +1 -0
  42. package/dist/lib/actions/create-header.action.d.ts +8 -0
  43. package/dist/lib/actions/create-header.action.d.ts.map +1 -0
  44. package/dist/lib/actions/create-header.action.js +66 -0
  45. package/dist/lib/actions/create-header.action.js.map +1 -0
  46. package/dist/lib/actions/create-named-range.action.d.ts +10 -0
  47. package/dist/lib/actions/create-named-range.action.d.ts.map +1 -0
  48. package/dist/lib/actions/create-named-range.action.js +74 -0
  49. package/dist/lib/actions/create-named-range.action.js.map +1 -0
  50. package/dist/lib/actions/create-paragraph-bullets.action.d.ts +10 -0
  51. package/dist/lib/actions/create-paragraph-bullets.action.d.ts.map +1 -0
  52. package/dist/lib/actions/create-paragraph-bullets.action.js +98 -0
  53. package/dist/lib/actions/create-paragraph-bullets.action.js.map +1 -0
  54. package/dist/lib/actions/create-text-document.action.d.ts +8 -0
  55. package/dist/lib/actions/create-text-document.action.d.ts.map +1 -0
  56. package/dist/lib/actions/create-text-document.action.js +42 -0
  57. package/dist/lib/actions/create-text-document.action.js.map +1 -0
  58. package/dist/lib/actions/delete-content-range.action.d.ts +9 -0
  59. package/dist/lib/actions/delete-content-range.action.d.ts.map +1 -0
  60. package/dist/lib/actions/delete-content-range.action.js +64 -0
  61. package/dist/lib/actions/delete-content-range.action.js.map +1 -0
  62. package/dist/lib/actions/delete-footer.action.d.ts +8 -0
  63. package/dist/lib/actions/delete-footer.action.d.ts.map +1 -0
  64. package/dist/lib/actions/delete-footer.action.js +56 -0
  65. package/dist/lib/actions/delete-footer.action.js.map +1 -0
  66. package/dist/lib/actions/delete-header.action.d.ts +8 -0
  67. package/dist/lib/actions/delete-header.action.d.ts.map +1 -0
  68. package/dist/lib/actions/delete-header.action.js +56 -0
  69. package/dist/lib/actions/delete-header.action.js.map +1 -0
  70. package/dist/lib/actions/delete-named-range.action.d.ts +9 -0
  71. package/dist/lib/actions/delete-named-range.action.d.ts.map +1 -0
  72. package/dist/lib/actions/delete-named-range.action.js +69 -0
  73. package/dist/lib/actions/delete-named-range.action.js.map +1 -0
  74. package/dist/lib/actions/delete-paragraph-bullets.action.d.ts +9 -0
  75. package/dist/lib/actions/delete-paragraph-bullets.action.d.ts.map +1 -0
  76. package/dist/lib/actions/delete-paragraph-bullets.action.js +66 -0
  77. package/dist/lib/actions/delete-paragraph-bullets.action.js.map +1 -0
  78. package/dist/lib/actions/delete-table-column.action.d.ts +10 -0
  79. package/dist/lib/actions/delete-table-column.action.d.ts.map +1 -0
  80. package/dist/lib/actions/delete-table-column.action.js +72 -0
  81. package/dist/lib/actions/delete-table-column.action.js.map +1 -0
  82. package/dist/lib/actions/delete-table-row.action.d.ts +10 -0
  83. package/dist/lib/actions/delete-table-row.action.d.ts.map +1 -0
  84. package/dist/lib/actions/delete-table-row.action.js +72 -0
  85. package/dist/lib/actions/delete-table-row.action.js.map +1 -0
  86. package/dist/lib/actions/export-as-pdf.action.d.ts +7 -0
  87. package/dist/lib/actions/export-as-pdf.action.d.ts.map +1 -0
  88. package/dist/lib/actions/export-as-pdf.action.js +61 -0
  89. package/dist/lib/actions/export-as-pdf.action.js.map +1 -0
  90. package/dist/lib/actions/find-document.d.ts +16 -0
  91. package/dist/lib/actions/find-document.d.ts.map +1 -0
  92. package/dist/lib/actions/find-document.js +127 -0
  93. package/dist/lib/actions/find-document.js.map +1 -0
  94. package/dist/lib/actions/get-document-end-index.action.d.ts +7 -0
  95. package/dist/lib/actions/get-document-end-index.action.d.ts.map +1 -0
  96. package/dist/lib/actions/get-document-end-index.action.js +54 -0
  97. package/dist/lib/actions/get-document-end-index.action.js.map +1 -0
  98. package/dist/lib/actions/get-document-plaintext.action.d.ts +7 -0
  99. package/dist/lib/actions/get-document-plaintext.action.d.ts.map +1 -0
  100. package/dist/lib/actions/get-document-plaintext.action.js +76 -0
  101. package/dist/lib/actions/get-document-plaintext.action.js.map +1 -0
  102. package/dist/lib/actions/get-document.action.d.ts +7 -0
  103. package/dist/lib/actions/get-document.action.d.ts.map +1 -0
  104. package/dist/lib/actions/get-document.action.js +45 -0
  105. package/dist/lib/actions/get-document.action.js.map +1 -0
  106. package/dist/lib/actions/insert-image-in-table-cell.action.d.ts +13 -0
  107. package/dist/lib/actions/insert-image-in-table-cell.action.d.ts.map +1 -0
  108. package/dist/lib/actions/insert-image-in-table-cell.action.js +128 -0
  109. package/dist/lib/actions/insert-image-in-table-cell.action.js.map +1 -0
  110. package/dist/lib/actions/insert-inline-image.action.d.ts +11 -0
  111. package/dist/lib/actions/insert-inline-image.action.d.ts.map +1 -0
  112. package/dist/lib/actions/insert-inline-image.action.js +84 -0
  113. package/dist/lib/actions/insert-inline-image.action.js.map +1 -0
  114. package/dist/lib/actions/insert-page-break.action.d.ts +8 -0
  115. package/dist/lib/actions/insert-page-break.action.d.ts.map +1 -0
  116. package/dist/lib/actions/insert-page-break.action.js +60 -0
  117. package/dist/lib/actions/insert-page-break.action.js.map +1 -0
  118. package/dist/lib/actions/insert-table-column.action.d.ts +11 -0
  119. package/dist/lib/actions/insert-table-column.action.d.ts.map +1 -0
  120. package/dist/lib/actions/insert-table-column.action.js +86 -0
  121. package/dist/lib/actions/insert-table-column.action.js.map +1 -0
  122. package/dist/lib/actions/insert-table-row.action.d.ts +11 -0
  123. package/dist/lib/actions/insert-table-row.action.d.ts.map +1 -0
  124. package/dist/lib/actions/insert-table-row.action.js +86 -0
  125. package/dist/lib/actions/insert-table-row.action.js.map +1 -0
  126. package/dist/lib/actions/insert-table.action.d.ts +10 -0
  127. package/dist/lib/actions/insert-table.action.d.ts.map +1 -0
  128. package/dist/lib/actions/insert-table.action.js +72 -0
  129. package/dist/lib/actions/insert-table.action.js.map +1 -0
  130. package/dist/lib/actions/insert-text-in-table-cell.action.d.ts +11 -0
  131. package/dist/lib/actions/insert-text-in-table-cell.action.d.ts.map +1 -0
  132. package/dist/lib/actions/insert-text-in-table-cell.action.js +115 -0
  133. package/dist/lib/actions/insert-text-in-table-cell.action.js.map +1 -0
  134. package/dist/lib/actions/insert-text.action.d.ts +9 -0
  135. package/dist/lib/actions/insert-text.action.d.ts.map +1 -0
  136. package/dist/lib/actions/insert-text.action.js +66 -0
  137. package/dist/lib/actions/insert-text.action.js.map +1 -0
  138. package/dist/lib/actions/read-document.action.d.ts +7 -0
  139. package/dist/lib/actions/read-document.action.d.ts.map +1 -0
  140. package/dist/lib/actions/read-document.action.js +44 -0
  141. package/dist/lib/actions/read-document.action.js.map +1 -0
  142. package/dist/lib/actions/replace-all-text.action.d.ts +10 -0
  143. package/dist/lib/actions/replace-all-text.action.d.ts.map +1 -0
  144. package/dist/lib/actions/replace-all-text.action.js +92 -0
  145. package/dist/lib/actions/replace-all-text.action.js.map +1 -0
  146. package/dist/lib/actions/replace-body-with-markdown.action.d.ts +8 -0
  147. package/dist/lib/actions/replace-body-with-markdown.action.d.ts.map +1 -0
  148. package/dist/lib/actions/replace-body-with-markdown.action.js +79 -0
  149. package/dist/lib/actions/replace-body-with-markdown.action.js.map +1 -0
  150. package/dist/lib/actions/replace-image.action.d.ts +9 -0
  151. package/dist/lib/actions/replace-image.action.d.ts.map +1 -0
  152. package/dist/lib/actions/replace-image.action.js +65 -0
  153. package/dist/lib/actions/replace-image.action.js.map +1 -0
  154. package/dist/lib/actions/replace-section-with-markdown.action.d.ts +10 -0
  155. package/dist/lib/actions/replace-section-with-markdown.action.d.ts.map +1 -0
  156. package/dist/lib/actions/replace-section-with-markdown.action.js +106 -0
  157. package/dist/lib/actions/replace-section-with-markdown.action.js.map +1 -0
  158. package/dist/lib/actions/search-documents.action.d.ts +11 -0
  159. package/dist/lib/actions/search-documents.action.d.ts.map +1 -0
  160. package/dist/lib/actions/search-documents.action.js +121 -0
  161. package/dist/lib/actions/search-documents.action.js.map +1 -0
  162. package/dist/lib/actions/unmerge-table-cells.action.d.ts +12 -0
  163. package/dist/lib/actions/unmerge-table-cells.action.d.ts.map +1 -0
  164. package/dist/lib/actions/unmerge-table-cells.action.js +94 -0
  165. package/dist/lib/actions/unmerge-table-cells.action.js.map +1 -0
  166. package/dist/lib/actions/update-document-style.action.d.ts +11 -0
  167. package/dist/lib/actions/update-document-style.action.d.ts.map +1 -0
  168. package/dist/lib/actions/update-document-style.action.js +95 -0
  169. package/dist/lib/actions/update-document-style.action.js.map +1 -0
  170. package/dist/lib/actions/update-table-row-style.action.d.ts +10 -0
  171. package/dist/lib/actions/update-table-row-style.action.d.ts.map +1 -0
  172. package/dist/lib/actions/update-table-row-style.action.js +78 -0
  173. package/dist/lib/actions/update-table-row-style.action.js.map +1 -0
  174. package/dist/lib/auth.d.ts +11 -0
  175. package/dist/lib/auth.d.ts.map +1 -0
  176. package/dist/lib/auth.js +92 -0
  177. package/dist/lib/auth.js.map +1 -0
  178. package/dist/lib/common/index.d.ts +11 -0
  179. package/dist/lib/common/index.d.ts.map +1 -0
  180. package/dist/lib/common/index.js +124 -0
  181. package/dist/lib/common/index.js.map +1 -0
  182. package/dist/lib/common/props.d.ts +5 -0
  183. package/dist/lib/common/props.d.ts.map +1 -0
  184. package/dist/lib/common/props.js +53 -0
  185. package/dist/lib/common/props.js.map +1 -0
  186. package/dist/lib/output-schemas.d.ts +43 -0
  187. package/dist/lib/output-schemas.d.ts.map +1 -0
  188. package/dist/lib/output-schemas.js +554 -0
  189. package/dist/lib/output-schemas.js.map +1 -0
  190. package/dist/lib/triggers/new-document.d.ts +35 -0
  191. package/dist/lib/triggers/new-document.d.ts.map +1 -0
  192. package/dist/lib/triggers/new-document.js +104 -0
  193. package/dist/lib/triggers/new-document.js.map +1 -0
  194. package/package.json +48 -4
  195. package/src/index.ts +120 -0
  196. package/src/lib/actions/append-text.ts +37 -0
  197. package/src/lib/actions/batch-update.action.ts +58 -0
  198. package/src/lib/actions/copy-document.action.ts +74 -0
  199. package/src/lib/actions/create-and-populate-table.action.ts +141 -0
  200. package/src/lib/actions/create-document-based-on-template.action.ts +110 -0
  201. package/src/lib/actions/create-document-from-markdown.action.ts +63 -0
  202. package/src/lib/actions/create-document.ts +36 -0
  203. package/src/lib/actions/create-footer.action.ts +59 -0
  204. package/src/lib/actions/create-footnote.action.ts +53 -0
  205. package/src/lib/actions/create-header.action.ts +59 -0
  206. package/src/lib/actions/create-named-range.action.ts +70 -0
  207. package/src/lib/actions/create-paragraph-bullets.action.ts +95 -0
  208. package/src/lib/actions/create-text-document.action.ts +35 -0
  209. package/src/lib/actions/delete-content-range.action.ts +59 -0
  210. package/src/lib/actions/delete-footer.action.ts +51 -0
  211. package/src/lib/actions/delete-header.action.ts +51 -0
  212. package/src/lib/actions/delete-named-range.action.ts +65 -0
  213. package/src/lib/actions/delete-paragraph-bullets.action.ts +62 -0
  214. package/src/lib/actions/delete-table-column.action.ts +67 -0
  215. package/src/lib/actions/delete-table-row.action.ts +67 -0
  216. package/src/lib/actions/export-as-pdf.action.ts +59 -0
  217. package/src/lib/actions/find-document.ts +136 -0
  218. package/src/lib/actions/get-document-end-index.action.ts +47 -0
  219. package/src/lib/actions/get-document-plaintext.action.ts +74 -0
  220. package/src/lib/actions/get-document.action.ts +37 -0
  221. package/src/lib/actions/insert-image-in-table-cell.action.ts +139 -0
  222. package/src/lib/actions/insert-inline-image.action.ts +83 -0
  223. package/src/lib/actions/insert-page-break.action.ts +56 -0
  224. package/src/lib/actions/insert-table-column.action.ts +80 -0
  225. package/src/lib/actions/insert-table-row.action.ts +80 -0
  226. package/src/lib/actions/insert-table.action.ts +68 -0
  227. package/src/lib/actions/insert-text-in-table-cell.action.ts +120 -0
  228. package/src/lib/actions/insert-text.action.ts +62 -0
  229. package/src/lib/actions/read-document.action.ts +40 -0
  230. package/src/lib/actions/replace-all-text.action.ts +95 -0
  231. package/src/lib/actions/replace-body-with-markdown.action.ts +76 -0
  232. package/src/lib/actions/replace-image.action.ts +60 -0
  233. package/src/lib/actions/replace-section-with-markdown.action.ts +104 -0
  234. package/src/lib/actions/search-documents.action.ts +131 -0
  235. package/src/lib/actions/unmerge-table-cells.action.ts +88 -0
  236. package/src/lib/actions/update-document-style.action.ts +93 -0
  237. package/src/lib/actions/update-table-row-style.action.ts +73 -0
  238. package/src/lib/auth.ts +84 -0
  239. package/src/lib/common/index.ts +126 -0
  240. package/src/lib/common/props.ts +55 -0
  241. package/src/lib/output-schemas.ts +593 -0
  242. package/src/lib/triggers/new-document.ts +108 -0
  243. package/README.md +0 -3
@@ -0,0 +1,93 @@
1
+ import { googleDocsAuth, createGoogleClient } from '../auth';
2
+ import { docsCommon } from '../common';
3
+ import { Property, createAction } from '@agnocon/pieces-framework';
4
+ import { docs as googleDocs, docs_v1 } from '@googleapis/docs';
5
+ import { updateDocumentStyleActionOutputSchema } from '../output-schemas';
6
+
7
+ export const updateDocumentStyle = createAction({
8
+ auth: googleDocsAuth,
9
+ name: 'update_document_style',
10
+ displayName: 'Update Document Style',
11
+ description: 'Update the page margins or other document-level style properties of a Google Docs document.',
12
+ audience: 'ai',
13
+ aiMetadata: {
14
+ description:
15
+ 'Updates document-level style properties such as page margins. Only the properties you provide are changed — leave any margin empty to leave it unchanged. Re-applying the same values leaves the document in the same state, so it is idempotent. Use this to set consistent page margins before exporting or sharing a document.',
16
+ idempotent: true,
17
+ },
18
+ outputSchema: updateDocumentStyleActionOutputSchema,
19
+ props: {
20
+ documentId: Property.ShortText({
21
+ displayName: 'Document ID',
22
+ description: 'The ID of the document whose style to update.',
23
+ required: true,
24
+ }),
25
+ marginTopPt: Property.Number({
26
+ displayName: 'Top Margin (pt)',
27
+ description: 'Top page margin in points. Leave empty to keep the current value.',
28
+ required: false,
29
+ }),
30
+ marginBottomPt: Property.Number({
31
+ displayName: 'Bottom Margin (pt)',
32
+ description: 'Bottom page margin in points. Leave empty to keep the current value.',
33
+ required: false,
34
+ }),
35
+ marginLeftPt: Property.Number({
36
+ displayName: 'Left Margin (pt)',
37
+ description: 'Left page margin in points. Leave empty to keep the current value.',
38
+ required: false,
39
+ }),
40
+ marginRightPt: Property.Number({
41
+ displayName: 'Right Margin (pt)',
42
+ description: 'Right page margin in points. Leave empty to keep the current value.',
43
+ required: false,
44
+ }),
45
+ },
46
+ async run(context) {
47
+ const { documentId, marginTopPt, marginBottomPt, marginLeftPt, marginRightPt } = context.propsValue;
48
+
49
+ const documentStyle: docs_v1.Schema$DocumentStyle = {};
50
+ const fieldPaths: string[] = [];
51
+
52
+ if (marginTopPt !== undefined && marginTopPt !== null) {
53
+ documentStyle.marginTop = { magnitude: marginTopPt, unit: 'PT' };
54
+ fieldPaths.push('marginTop');
55
+ }
56
+ if (marginBottomPt !== undefined && marginBottomPt !== null) {
57
+ documentStyle.marginBottom = { magnitude: marginBottomPt, unit: 'PT' };
58
+ fieldPaths.push('marginBottom');
59
+ }
60
+ if (marginLeftPt !== undefined && marginLeftPt !== null) {
61
+ documentStyle.marginLeft = { magnitude: marginLeftPt, unit: 'PT' };
62
+ fieldPaths.push('marginLeft');
63
+ }
64
+ if (marginRightPt !== undefined && marginRightPt !== null) {
65
+ documentStyle.marginRight = { magnitude: marginRightPt, unit: 'PT' };
66
+ fieldPaths.push('marginRight');
67
+ }
68
+
69
+ if (fieldPaths.length === 0) {
70
+ throw new Error('At least one style property must be provided.');
71
+ }
72
+
73
+ const request: docs_v1.Schema$Request = {
74
+ updateDocumentStyle: {
75
+ documentStyle,
76
+ fields: fieldPaths.join(','),
77
+ },
78
+ };
79
+
80
+ const authClient = await createGoogleClient(context.auth);
81
+ const docs = googleDocs({ version: 'v1', auth: authClient });
82
+
83
+ try {
84
+ await docs.documents.batchUpdate({
85
+ documentId,
86
+ requestBody: { requests: [request] },
87
+ });
88
+ return { success: true, documentId, updatedFields: fieldPaths };
89
+ } catch (error) {
90
+ throw new Error(docsCommon.formatError(error, 'update the style of'));
91
+ }
92
+ },
93
+ });
@@ -0,0 +1,73 @@
1
+ import { googleDocsAuth, createGoogleClient } from '../auth';
2
+ import { docsCommon } from '../common';
3
+ import { Property, createAction } from '@agnocon/pieces-framework';
4
+ import { docs as googleDocs, docs_v1 } from '@googleapis/docs';
5
+ import { updateTableRowStyleActionOutputSchema } from '../output-schemas';
6
+
7
+ export const updateTableRowStyle = createAction({
8
+ auth: googleDocsAuth,
9
+ name: 'update_table_row_style',
10
+ displayName: 'Update Table Row Style',
11
+ description: 'Update style properties of one or more rows in a Google Docs table',
12
+ audience: 'ai',
13
+ aiMetadata: {
14
+ description:
15
+ 'Updates the minimum height of one or more rows in a Google Docs table. Requires the table start index from Read Document — cannot be guessed. (Google Docs does not support toggling a header row via this request.) Idempotent: applying the same height again is a no-op.',
16
+ idempotent: true,
17
+ },
18
+ outputSchema: updateTableRowStyleActionOutputSchema,
19
+ props: {
20
+ documentId: Property.ShortText({
21
+ displayName: 'Document ID',
22
+ description: 'The ID of the document containing the table.',
23
+ required: true,
24
+ }),
25
+ tableStartIndex: Property.Number({
26
+ displayName: 'Table Start Index',
27
+ description: 'Obtain the table start index from Read Document — cannot be guessed.',
28
+ required: true,
29
+ }),
30
+ rowIndices: Property.Array({
31
+ displayName: 'Row Indices',
32
+ description: 'Zero-based indices of the rows to update (e.g. [0, 1] to update the first two rows).',
33
+ required: true,
34
+ }),
35
+ minRowHeightPt: Property.Number({
36
+ displayName: 'Minimum Row Height (points)',
37
+ description: 'Minimum height of each selected row, in points.',
38
+ required: true,
39
+ }),
40
+ },
41
+ async run(context) {
42
+ const { documentId, tableStartIndex, rowIndices, minRowHeightPt } = context.propsValue;
43
+ const authClient = await createGoogleClient(context.auth);
44
+ const docs = googleDocs({ version: 'v1', auth: authClient });
45
+
46
+ const rowIndexNumbers = (rowIndices as unknown[]).map((v) => Number(v));
47
+
48
+ const request: docs_v1.Schema$Request = {
49
+ updateTableRowStyle: {
50
+ tableStartLocation: { index: tableStartIndex },
51
+ rowIndices: rowIndexNumbers,
52
+ tableRowStyle: { minRowHeight: { magnitude: minRowHeightPt, unit: 'PT' } },
53
+ fields: 'minRowHeight',
54
+ },
55
+ };
56
+
57
+ try {
58
+ await docs.documents.batchUpdate({
59
+ documentId,
60
+ requestBody: { requests: [request] },
61
+ });
62
+ return {
63
+ success: true,
64
+ documentId,
65
+ tableStartIndex,
66
+ rowIndices: rowIndexNumbers,
67
+ updatedFields: ['minRowHeight'],
68
+ };
69
+ } catch (error) {
70
+ throw new Error(docsCommon.formatError(error, 'update table row style in'));
71
+ }
72
+ },
73
+ });
@@ -0,0 +1,84 @@
1
+ import { AppConnectionValueForAuthProperty, PieceAuth, Property } from '@agnocon/pieces-framework';
2
+ import { AppConnectionType } from '@agnocon/pieces-framework';
3
+ import { JWT, OAuth2Client } from 'google-auth-library';
4
+
5
+ export const googleDocsScopes = [
6
+ 'https://www.googleapis.com/auth/documents',
7
+ 'https://www.googleapis.com/auth/drive.readonly',
8
+ 'https://www.googleapis.com/auth/drive',
9
+ 'email',
10
+ ];
11
+
12
+ export const googleDocsAuth = [PieceAuth.OAuth2({
13
+ description: '',
14
+ authUrl: 'https://accounts.google.com/o/oauth2/auth',
15
+ tokenUrl: 'https://oauth2.googleapis.com/token',
16
+ required: true,
17
+ scope: googleDocsScopes,
18
+ }), PieceAuth.CustomAuth({
19
+ displayName: 'Service Account (Advanced)',
20
+ description: 'Authenticate via service account from https://console.cloud.google.com/ > IAM & Admin > Service Accounts > Create Service Account > Keys > Add key. <br> <br> You can optionally use domain-wide delegation (https://support.google.com/a/answer/162106?hl=en#zippy=%2Cset-up-domain-wide-delegation-for-a-client) to access documents without adding the service account to each one. <br> <br> **Note:** Without a user email, the service account only has access to files/folders you explicitly share with it.',
21
+ required: true,
22
+ props: {
23
+ serviceAccount: Property.LongText({
24
+ displayName: 'Service Account JSON Key',
25
+ required: true,
26
+ }),
27
+ userEmail: Property.ShortText({
28
+ displayName: 'User Email',
29
+ required: false,
30
+ description: 'Email address of the user to impersonate for domain-wide delegation.',
31
+ }),
32
+ },
33
+ validate: async ({ auth }) => {
34
+ try {
35
+ await getAccessToken({
36
+ type: AppConnectionType.CUSTOM_AUTH,
37
+ props: { ...auth },
38
+ });
39
+ } catch (e) {
40
+ return {
41
+ valid: false,
42
+ error: (e as Error).message,
43
+ };
44
+ }
45
+ return {
46
+ valid: true,
47
+ };
48
+ },
49
+ })];
50
+
51
+ export type GoogleDocsAuthValue = AppConnectionValueForAuthProperty<typeof googleDocsAuth>;
52
+
53
+ export async function createGoogleClient(auth: GoogleDocsAuthValue): Promise<OAuth2Client> {
54
+ if (auth.type === AppConnectionType.CUSTOM_AUTH) {
55
+ let serviceAccount;
56
+ try {
57
+ serviceAccount = JSON.parse(auth.props.serviceAccount);
58
+ } catch {
59
+ throw new Error('Invalid Service Account JSON Key. Please provide a valid JSON string.');
60
+ }
61
+ return new JWT({
62
+ email: serviceAccount.client_email,
63
+ key: serviceAccount.private_key,
64
+ scopes: googleDocsScopes,
65
+ subject: auth.props.userEmail,
66
+ });
67
+ }
68
+ const authClient = new OAuth2Client();
69
+ authClient.setCredentials(auth);
70
+ return authClient;
71
+ }
72
+
73
+ export const getAccessToken = async (auth: GoogleDocsAuthValue): Promise<string> => {
74
+ if (auth.type === AppConnectionType.CUSTOM_AUTH) {
75
+ const googleClient = await createGoogleClient(auth);
76
+ const response = await googleClient.getAccessToken();
77
+ if (response.token) {
78
+ return response.token;
79
+ } else {
80
+ throw new Error('Could not retrieve access token from service account json');
81
+ }
82
+ }
83
+ return auth.access_token;
84
+ };
@@ -0,0 +1,126 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import { Property } from '@agnocon/pieces-framework';
3
+ import { HttpMethod, httpClient, AuthenticationType } from '@agnocon/pieces-common';
4
+ import { docs_v1 } from '@googleapis/docs';
5
+
6
+ export const docsCommon = {
7
+ baseUrl: 'https://docs.googleapis.com/v1',
8
+ title: Property.ShortText({
9
+ displayName: 'Document Title',
10
+ required: true,
11
+ }),
12
+ body: Property.LongText({
13
+ displayName: 'Document Content',
14
+ required: true,
15
+ }),
16
+
17
+ // Creates an empty document with the title provided
18
+ createDocument: async (title: string, accessToken: string) => {
19
+ const createRequest = await httpClient.sendRequest({
20
+ url: `${docsCommon.baseUrl}/documents`,
21
+ method: HttpMethod.POST,
22
+ authentication: {
23
+ type: AuthenticationType.BEARER_TOKEN,
24
+ token: accessToken,
25
+ },
26
+ body: {
27
+ title: title,
28
+ },
29
+ });
30
+
31
+ return createRequest.body;
32
+ },
33
+
34
+ // Writes provided content to the end of an existing document
35
+ writeToDocument: async (documentId: string, body: string, accessToken: string) => {
36
+ const writeRequest = await httpClient.sendRequest({
37
+ url: `${docsCommon.baseUrl}/documents/${documentId}:batchUpdate`,
38
+ method: HttpMethod.POST,
39
+ authentication: {
40
+ type: AuthenticationType.BEARER_TOKEN,
41
+ token: accessToken,
42
+ },
43
+ body: {
44
+ requests: [
45
+ {
46
+ insertText: {
47
+ text: body,
48
+ endOfSegmentLocation: {},
49
+ },
50
+ },
51
+ ],
52
+ },
53
+ });
54
+
55
+ return writeRequest.body;
56
+ },
57
+
58
+ // Converts block-level Markdown into Google Docs batchUpdate requests.
59
+ // Inserts each line left-to-right at a running cursor (starting at baseIndex)
60
+ // so every index references the document state after the prior inserts in the
61
+ // same batch (indices stay stable because each insert is at the prior insert's
62
+ // end). Block-level only: headings and bullets; inline marks are left as literal
63
+ // text. baseIndex defaults to 1 (start of body); pass a section start index to
64
+ // insert markdown into a freshly-emptied range mid-document.
65
+ markdownToBatchRequests: (markdown: string, baseIndex = 1): docs_v1.Schema$Request[] => {
66
+ const lines = markdown.replace(/\r\n/g, '\n').split('\n');
67
+ const requests: docs_v1.Schema$Request[] = [];
68
+ const bulletRanges: Array<{ startIndex: number; endIndex: number }> = [];
69
+ let cursor = baseIndex;
70
+
71
+ for (const line of lines) {
72
+ const headingMatch = /^(#{1,3})\s+(.*)$/.exec(line);
73
+ const bulletMatch = /^\s*[-*+]\s+(.*)$/.exec(line);
74
+
75
+ let textToInsert = line;
76
+ let headingLevel = 0;
77
+ let isBullet = false;
78
+ if (headingMatch) {
79
+ headingLevel = headingMatch[1].length;
80
+ textToInsert = headingMatch[2];
81
+ } else if (bulletMatch) {
82
+ isBullet = true;
83
+ textToInsert = bulletMatch[1];
84
+ }
85
+
86
+ requests.push({ insertText: { text: textToInsert + '\n', location: { index: cursor } } });
87
+ const paragraphStart = cursor;
88
+ const paragraphEnd = cursor + textToInsert.length + 1;
89
+
90
+ if (headingLevel > 0) {
91
+ requests.push({
92
+ updateParagraphStyle: {
93
+ range: { startIndex: paragraphStart, endIndex: paragraphEnd },
94
+ paragraphStyle: { namedStyleType: `HEADING_${headingLevel}` },
95
+ fields: 'namedStyleType',
96
+ },
97
+ });
98
+ }
99
+ if (isBullet) {
100
+ bulletRanges.push({ startIndex: paragraphStart, endIndex: paragraphEnd });
101
+ }
102
+
103
+ cursor = paragraphEnd;
104
+ }
105
+
106
+ for (const range of bulletRanges) {
107
+ requests.push({
108
+ createParagraphBullets: { range, bulletPreset: 'BULLET_DISC_CIRCLE_SQUARE' },
109
+ });
110
+ }
111
+
112
+ return requests;
113
+ },
114
+
115
+ // Maps a Google API (Gaxios) error to a concise, agent-readable message.
116
+ formatError: (error: any, action: string): string => {
117
+ const status = error?.response?.status ?? error?.code;
118
+ const apiMessage = error?.response?.data?.error?.message ?? error?.message;
119
+ const suffix = apiMessage ? ` ${apiMessage}` : '';
120
+ if (status === 400) return `Invalid request trying to ${action} the document (400) — often a bad index or range.${suffix}`;
121
+ if (status === 403) return `Permission denied trying to ${action} the document (403) — check the connection has access.${suffix}`;
122
+ if (status === 404) return `Document not found trying to ${action} (404) — verify the document ID.${suffix}`;
123
+ if (status === 429) return `Rate limit exceeded trying to ${action} the document (429) — retry later.${suffix}`;
124
+ return `Failed to ${action} the document${status ? ` (${status})` : ''}:${suffix || ' unknown error'}`;
125
+ },
126
+ };
@@ -0,0 +1,55 @@
1
+ import { googleDocsAuth, createGoogleClient, GoogleDocsAuthValue } from '../auth';
2
+ import { DropdownOption, Property } from '@agnocon/pieces-framework';
3
+ import { drive as googleDrive, drive_v3 } from '@googleapis/drive';
4
+
5
+ export const folderIdProp = Property.Dropdown({
6
+ displayName: 'Folder',
7
+ refreshers: [],
8
+ auth: googleDocsAuth,
9
+ required: false,
10
+ options: async ({ auth }) => {
11
+ if (!auth) {
12
+ return {
13
+ disabled: true,
14
+ placeholder: 'Please connect to your Google Drive account.',
15
+ options: [],
16
+ };
17
+ }
18
+ const authValue = auth as GoogleDocsAuthValue;
19
+
20
+ const authClient = await createGoogleClient(authValue);
21
+
22
+ const drive = googleDrive({ version: 'v3', auth: authClient });
23
+
24
+ const options: DropdownOption<string>[] = [];
25
+
26
+ let nextPageToken;
27
+
28
+ do {
29
+ const response: any = await drive.files.list({
30
+ q: "mimeType='application/vnd.google-apps.folder' and trashed = false",
31
+ supportsAllDrives: true,
32
+ orderBy:'createdTime desc',
33
+ includeItemsFromAllDrives: true,
34
+ corpora: 'allDrives',
35
+ pageToken: nextPageToken,
36
+ });
37
+
38
+ const fileList: drive_v3.Schema$FileList = response.data;
39
+
40
+ if (fileList.files) {
41
+ for (const file of fileList.files)
42
+ options.push({
43
+ label: file.name!,
44
+ value: file.id!,
45
+ });
46
+ }
47
+ nextPageToken = response.data.nextPageToken;
48
+ } while (nextPageToken);
49
+
50
+ return {
51
+ disabled: false,
52
+ options,
53
+ };
54
+ },
55
+ });