digital-tools 2.1.1 → 2.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 (293) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +2 -0
  3. package/dist/client.d.ts +109 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +69 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/define.d.ts +2 -2
  8. package/dist/define.d.ts.map +1 -1
  9. package/dist/define.js +22 -20
  10. package/dist/define.js.map +1 -1
  11. package/dist/function-ref.d.ts +229 -0
  12. package/dist/function-ref.d.ts.map +1 -0
  13. package/dist/function-ref.js +28 -0
  14. package/dist/function-ref.js.map +1 -0
  15. package/dist/function-sugar.d.ts +57 -0
  16. package/dist/function-sugar.d.ts.map +1 -0
  17. package/dist/function-sugar.js +79 -0
  18. package/dist/function-sugar.js.map +1 -0
  19. package/dist/index.d.ts +10 -3
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +24 -4
  22. package/dist/index.js.map +1 -1
  23. package/dist/providers/analytics/mixpanel.d.ts.map +1 -1
  24. package/dist/providers/analytics/mixpanel.js +21 -18
  25. package/dist/providers/analytics/mixpanel.js.map +1 -1
  26. package/dist/providers/calendar/cal-com.d.ts.map +1 -1
  27. package/dist/providers/calendar/cal-com.js +10 -10
  28. package/dist/providers/calendar/cal-com.js.map +1 -1
  29. package/dist/providers/calendar/google-calendar.d.ts.map +1 -1
  30. package/dist/providers/calendar/google-calendar.js +4 -4
  31. package/dist/providers/calendar/google-calendar.js.map +1 -1
  32. package/dist/providers/crm/hubspot.d.ts.map +1 -1
  33. package/dist/providers/crm/hubspot.js +107 -85
  34. package/dist/providers/crm/hubspot.js.map +1 -1
  35. package/dist/providers/development/github.d.ts.map +1 -1
  36. package/dist/providers/development/github.js +40 -43
  37. package/dist/providers/development/github.js.map +1 -1
  38. package/dist/providers/ecommerce/shopify.d.ts.map +1 -1
  39. package/dist/providers/ecommerce/shopify.js +79 -62
  40. package/dist/providers/ecommerce/shopify.js.map +1 -1
  41. package/dist/providers/email/resend.d.ts.map +1 -1
  42. package/dist/providers/email/resend.js +20 -16
  43. package/dist/providers/email/resend.js.map +1 -1
  44. package/dist/providers/email/sendgrid.d.ts.map +1 -1
  45. package/dist/providers/email/sendgrid.js +12 -9
  46. package/dist/providers/email/sendgrid.js.map +1 -1
  47. package/dist/providers/finance/stripe.d.ts.map +1 -1
  48. package/dist/providers/finance/stripe.js +44 -42
  49. package/dist/providers/finance/stripe.js.map +1 -1
  50. package/dist/providers/forms/typeform.d.ts.map +1 -1
  51. package/dist/providers/forms/typeform.js +68 -58
  52. package/dist/providers/forms/typeform.js.map +1 -1
  53. package/dist/providers/knowledge/notion.d.ts.map +1 -1
  54. package/dist/providers/knowledge/notion.js +75 -41
  55. package/dist/providers/knowledge/notion.js.map +1 -1
  56. package/dist/providers/marketing/mailchimp.d.ts.map +1 -1
  57. package/dist/providers/marketing/mailchimp.js +74 -61
  58. package/dist/providers/marketing/mailchimp.js.map +1 -1
  59. package/dist/providers/media/cloudinary.d.ts.map +1 -1
  60. package/dist/providers/media/cloudinary.js +30 -28
  61. package/dist/providers/media/cloudinary.js.map +1 -1
  62. package/dist/providers/messaging/slack.d.ts.map +1 -1
  63. package/dist/providers/messaging/slack.js +75 -58
  64. package/dist/providers/messaging/slack.js.map +1 -1
  65. package/dist/providers/messaging/twilio-sms.d.ts.map +1 -1
  66. package/dist/providers/messaging/twilio-sms.js +33 -15
  67. package/dist/providers/messaging/twilio-sms.js.map +1 -1
  68. package/dist/providers/project-management/linear.d.ts.map +1 -1
  69. package/dist/providers/project-management/linear.js +31 -27
  70. package/dist/providers/project-management/linear.js.map +1 -1
  71. package/dist/providers/spreadsheet/google-sheets.d.ts.map +1 -1
  72. package/dist/providers/spreadsheet/google-sheets.js +21 -18
  73. package/dist/providers/spreadsheet/google-sheets.js.map +1 -1
  74. package/dist/providers/spreadsheet/xlsx.d.ts.map +1 -1
  75. package/dist/providers/spreadsheet/xlsx.js +4 -4
  76. package/dist/providers/spreadsheet/xlsx.js.map +1 -1
  77. package/dist/providers/storage/index.js +1 -0
  78. package/dist/providers/storage/index.js.map +1 -1
  79. package/dist/providers/storage/s3.d.ts.map +1 -1
  80. package/dist/providers/storage/s3.js +36 -27
  81. package/dist/providers/storage/s3.js.map +1 -1
  82. package/dist/providers/support/zendesk.d.ts.map +1 -1
  83. package/dist/providers/support/zendesk.js +24 -25
  84. package/dist/providers/support/zendesk.js.map +1 -1
  85. package/dist/providers/tasks/todoist.d.ts.map +1 -1
  86. package/dist/providers/tasks/todoist.js +18 -18
  87. package/dist/providers/tasks/todoist.js.map +1 -1
  88. package/dist/providers/video-conferencing/google-meet.d.ts.map +1 -1
  89. package/dist/providers/video-conferencing/google-meet.js +11 -11
  90. package/dist/providers/video-conferencing/google-meet.js.map +1 -1
  91. package/dist/providers/video-conferencing/jitsi.js +14 -14
  92. package/dist/providers/video-conferencing/jitsi.js.map +1 -1
  93. package/dist/providers/video-conferencing/teams.d.ts.map +1 -1
  94. package/dist/providers/video-conferencing/teams.js +9 -7
  95. package/dist/providers/video-conferencing/teams.js.map +1 -1
  96. package/dist/providers/video-conferencing/zoom.d.ts.map +1 -1
  97. package/dist/providers/video-conferencing/zoom.js +26 -24
  98. package/dist/providers/video-conferencing/zoom.js.map +1 -1
  99. package/dist/tools/data.d.ts.map +1 -1
  100. package/dist/tools/data.js +5 -12
  101. package/dist/tools/data.js.map +1 -1
  102. package/dist/tools/index.d.ts +1 -0
  103. package/dist/tools/index.d.ts.map +1 -1
  104. package/dist/tools/index.js +1 -0
  105. package/dist/tools/index.js.map +1 -1
  106. package/dist/tools/system.d.ts +289 -0
  107. package/dist/tools/system.d.ts.map +1 -0
  108. package/dist/tools/system.js +752 -0
  109. package/dist/tools/system.js.map +1 -0
  110. package/dist/tools/web.d.ts.map +1 -1
  111. package/dist/tools/web.js +22 -10
  112. package/dist/tools/web.js.map +1 -1
  113. package/dist/track-record.d.ts +101 -0
  114. package/dist/track-record.d.ts.map +1 -0
  115. package/dist/track-record.js +17 -0
  116. package/dist/track-record.js.map +1 -0
  117. package/dist/types.d.ts +210 -9
  118. package/dist/types.d.ts.map +1 -1
  119. package/dist/verb-registration.d.ts +122 -0
  120. package/dist/verb-registration.d.ts.map +1 -0
  121. package/dist/verb-registration.js +176 -0
  122. package/dist/verb-registration.js.map +1 -0
  123. package/dist/worker.d.ts +93 -0
  124. package/dist/worker.d.ts.map +1 -0
  125. package/dist/worker.js +315 -0
  126. package/dist/worker.js.map +1 -0
  127. package/dist/wrap.d.ts +89 -0
  128. package/dist/wrap.d.ts.map +1 -0
  129. package/dist/wrap.js +225 -0
  130. package/dist/wrap.js.map +1 -0
  131. package/package.json +21 -4
  132. package/src/client.ts +136 -0
  133. package/src/define.ts +31 -37
  134. package/src/function-ref.ts +264 -0
  135. package/src/function-sugar.ts +134 -0
  136. package/src/index.ts +132 -10
  137. package/src/providers/analytics/mixpanel.ts +19 -18
  138. package/src/providers/calendar/cal-com.ts +29 -18
  139. package/src/providers/calendar/google-calendar.ts +20 -14
  140. package/src/providers/crm/hubspot.ts +225 -99
  141. package/src/providers/development/github.ts +206 -135
  142. package/src/providers/ecommerce/shopify.ts +250 -89
  143. package/src/providers/email/resend.ts +101 -28
  144. package/src/providers/email/sendgrid.ts +12 -9
  145. package/src/providers/finance/stripe.ts +128 -49
  146. package/src/providers/forms/typeform.ts +74 -58
  147. package/src/providers/knowledge/notion.ts +340 -88
  148. package/src/providers/marketing/mailchimp.ts +86 -70
  149. package/src/providers/media/cloudinary.ts +99 -41
  150. package/src/providers/messaging/slack.ts +283 -85
  151. package/src/providers/messaging/twilio-sms.ts +35 -15
  152. package/src/providers/project-management/linear.ts +143 -55
  153. package/src/providers/spreadsheet/google-sheets.ts +222 -56
  154. package/src/providers/spreadsheet/xlsx.ts +47 -16
  155. package/src/providers/storage/s3.ts +119 -47
  156. package/src/providers/support/zendesk.ts +196 -46
  157. package/src/providers/tasks/todoist.ts +20 -26
  158. package/src/providers/video-conferencing/google-meet.ts +17 -20
  159. package/src/providers/video-conferencing/jitsi.ts +14 -14
  160. package/src/providers/video-conferencing/teams.ts +14 -13
  161. package/src/providers/video-conferencing/zoom.ts +54 -49
  162. package/src/tools/data.ts +6 -16
  163. package/src/tools/index.ts +1 -0
  164. package/src/tools/system.ts +887 -0
  165. package/src/tools/web.ts +22 -10
  166. package/src/track-record.ts +106 -0
  167. package/src/types.ts +241 -13
  168. package/src/verb-registration.ts +197 -0
  169. package/src/worker.ts +370 -0
  170. package/src/wrap.ts +260 -0
  171. package/test/client.test.ts +146 -0
  172. package/test/communication-tools-extended.test.ts +734 -0
  173. package/test/data-tools-extended.test.ts +743 -0
  174. package/test/define-extended.test.ts +819 -0
  175. package/test/define.test.ts +150 -41
  176. package/test/entities.test.ts +623 -0
  177. package/test/extended-entities.test.ts +1228 -0
  178. package/test/provider-implementations.test.ts +725 -0
  179. package/test/provider-registry-extended.test.ts +583 -0
  180. package/test/providers/google-sheets.test.ts +851 -0
  181. package/test/providers/helpers.ts +554 -0
  182. package/test/providers/hubspot.test.ts +576 -0
  183. package/test/providers/slack.test.ts +932 -0
  184. package/test/providers/stripe.test.ts +701 -0
  185. package/test/providers.test.ts +578 -0
  186. package/test/system-tools-extended.test.ts +632 -0
  187. package/test/system.test.ts +673 -0
  188. package/test/tools.test.ts +15 -11
  189. package/test/types.test.ts +402 -0
  190. package/test/verb-registration.test.ts +395 -0
  191. package/test/web-tools.test.ts +553 -0
  192. package/test/worker-extended.test.ts +699 -0
  193. package/test/worker.test.ts +576 -0
  194. package/test/wrap.test.ts +366 -0
  195. package/tsconfig.json +3 -13
  196. package/vitest.config.ts +37 -0
  197. package/wrangler.jsonc +9 -0
  198. package/.turbo/turbo-build.log +0 -5
  199. package/dist/providers/voice/vapi.d.ts +0 -27
  200. package/dist/providers/voice/vapi.d.ts.map +0 -1
  201. package/dist/providers/voice/vapi.js +0 -440
  202. package/dist/providers/voice/vapi.js.map +0 -1
  203. package/src/define.js +0 -267
  204. package/src/entities/advertising.js +0 -999
  205. package/src/entities/ai.js +0 -756
  206. package/src/entities/analytics.js +0 -1588
  207. package/src/entities/automation.js +0 -601
  208. package/src/entities/communication.js +0 -1150
  209. package/src/entities/crm.js +0 -1386
  210. package/src/entities/design.js +0 -546
  211. package/src/entities/development.js +0 -2212
  212. package/src/entities/document.js +0 -874
  213. package/src/entities/ecommerce.js +0 -1429
  214. package/src/entities/experiment.js +0 -1039
  215. package/src/entities/finance.js +0 -3478
  216. package/src/entities/forms.js +0 -1892
  217. package/src/entities/hr.js +0 -661
  218. package/src/entities/identity.js +0 -997
  219. package/src/entities/index.js +0 -282
  220. package/src/entities/infrastructure.js +0 -1153
  221. package/src/entities/knowledge.js +0 -1438
  222. package/src/entities/marketing.js +0 -1610
  223. package/src/entities/media.js +0 -1634
  224. package/src/entities/notification.js +0 -1199
  225. package/src/entities/presentation.js +0 -1274
  226. package/src/entities/productivity.js +0 -1317
  227. package/src/entities/project-management.js +0 -1136
  228. package/src/entities/recruiting.js +0 -736
  229. package/src/entities/shipping.js +0 -509
  230. package/src/entities/signature.js +0 -1102
  231. package/src/entities/site.js +0 -222
  232. package/src/entities/spreadsheet.js +0 -1341
  233. package/src/entities/storage.js +0 -1198
  234. package/src/entities/support.js +0 -1166
  235. package/src/entities/video-conferencing.js +0 -1750
  236. package/src/entities/video.js +0 -950
  237. package/src/entities.js +0 -1663
  238. package/src/index.js +0 -74
  239. package/src/providers/analytics/index.js +0 -17
  240. package/src/providers/analytics/mixpanel.js +0 -255
  241. package/src/providers/calendar/cal-com.js +0 -303
  242. package/src/providers/calendar/google-calendar.js +0 -335
  243. package/src/providers/calendar/index.js +0 -20
  244. package/src/providers/crm/hubspot.js +0 -566
  245. package/src/providers/crm/index.js +0 -17
  246. package/src/providers/development/github.js +0 -472
  247. package/src/providers/development/index.js +0 -17
  248. package/src/providers/ecommerce/index.js +0 -17
  249. package/src/providers/ecommerce/shopify.js +0 -378
  250. package/src/providers/email/index.js +0 -20
  251. package/src/providers/email/resend.js +0 -258
  252. package/src/providers/email/sendgrid.js +0 -161
  253. package/src/providers/finance/index.js +0 -17
  254. package/src/providers/finance/stripe.js +0 -549
  255. package/src/providers/forms/index.js +0 -17
  256. package/src/providers/forms/typeform.js +0 -500
  257. package/src/providers/index.js +0 -123
  258. package/src/providers/knowledge/index.js +0 -17
  259. package/src/providers/knowledge/notion.js +0 -389
  260. package/src/providers/marketing/index.js +0 -17
  261. package/src/providers/marketing/mailchimp.js +0 -443
  262. package/src/providers/media/cloudinary.js +0 -318
  263. package/src/providers/media/index.js +0 -17
  264. package/src/providers/messaging/index.js +0 -20
  265. package/src/providers/messaging/slack.js +0 -393
  266. package/src/providers/messaging/twilio-sms.js +0 -249
  267. package/src/providers/project-management/index.js +0 -17
  268. package/src/providers/project-management/linear.js +0 -575
  269. package/src/providers/registry.js +0 -86
  270. package/src/providers/spreadsheet/google-sheets.js +0 -375
  271. package/src/providers/spreadsheet/index.js +0 -20
  272. package/src/providers/spreadsheet/xlsx.js +0 -423
  273. package/src/providers/storage/index.js +0 -24
  274. package/src/providers/storage/s3.js +0 -419
  275. package/src/providers/support/index.js +0 -17
  276. package/src/providers/support/zendesk.js +0 -373
  277. package/src/providers/tasks/index.js +0 -17
  278. package/src/providers/tasks/todoist.js +0 -286
  279. package/src/providers/types.js +0 -9
  280. package/src/providers/video-conferencing/google-meet.js +0 -286
  281. package/src/providers/video-conferencing/index.js +0 -31
  282. package/src/providers/video-conferencing/jitsi.js +0 -254
  283. package/src/providers/video-conferencing/teams.js +0 -270
  284. package/src/providers/video-conferencing/zoom.js +0 -332
  285. package/src/registry.js +0 -128
  286. package/src/tools/communication.js +0 -184
  287. package/src/tools/data.js +0 -205
  288. package/src/tools/index.js +0 -11
  289. package/src/tools/web.js +0 -137
  290. package/src/types.js +0 -10
  291. package/test/define.test.js +0 -306
  292. package/test/registry.test.js +0 -357
  293. package/test/tools.test.js +0 -363
package/dist/worker.js ADDED
@@ -0,0 +1,315 @@
1
+ /**
2
+ * Tool Worker - provides tool service via RPC
3
+ *
4
+ * This worker can be deployed to Cloudflare Workers or run locally via Miniflare.
5
+ * It exposes tool registration, discovery, execution, and MCP conversion via Workers RPC.
6
+ *
7
+ * Uses Cloudflare Workers RPC (WorkerEntrypoint, RpcTarget) for communication.
8
+ */
9
+ import { WorkerEntrypoint, RpcTarget } from 'cloudflare:workers';
10
+ /**
11
+ * Core tool service - extends RpcTarget so it can be passed over RPC
12
+ *
13
+ * Contains all tool functionality: registration, discovery, execution, and MCP conversion
14
+ */
15
+ export class ToolServiceCore extends RpcTarget {
16
+ tools = new Map();
17
+ constructor() {
18
+ super();
19
+ // Register built-in tools
20
+ this.registerBuiltins();
21
+ }
22
+ /**
23
+ * Register built-in tools
24
+ */
25
+ registerBuiltins() {
26
+ // data.json.parse
27
+ this.register({
28
+ id: 'data.json.parse',
29
+ name: 'Parse JSON',
30
+ description: 'Parse a JSON string into an object',
31
+ category: 'data',
32
+ subcategory: 'transform',
33
+ parameters: [
34
+ {
35
+ name: 'text',
36
+ description: 'JSON string to parse',
37
+ schema: { type: 'string' },
38
+ required: true,
39
+ },
40
+ ],
41
+ handler: async (input) => {
42
+ try {
43
+ const data = JSON.parse(input.text);
44
+ return { data, valid: true };
45
+ }
46
+ catch (e) {
47
+ return {
48
+ data: null,
49
+ valid: false,
50
+ error: e instanceof Error ? e.message : 'Invalid JSON',
51
+ };
52
+ }
53
+ },
54
+ tags: ['json', 'parse', 'transform'],
55
+ });
56
+ // data.csv.parse
57
+ this.register({
58
+ id: 'data.csv.parse',
59
+ name: 'Parse CSV',
60
+ description: 'Parse CSV text into an array of objects',
61
+ category: 'data',
62
+ subcategory: 'transform',
63
+ parameters: [
64
+ {
65
+ name: 'text',
66
+ description: 'CSV text to parse',
67
+ schema: { type: 'string' },
68
+ required: true,
69
+ },
70
+ {
71
+ name: 'delimiter',
72
+ description: 'Column delimiter (default: comma)',
73
+ schema: { type: 'string' },
74
+ required: false,
75
+ },
76
+ {
77
+ name: 'hasHeaders',
78
+ description: 'First row is headers (default: true)',
79
+ schema: { type: 'boolean' },
80
+ required: false,
81
+ },
82
+ ],
83
+ handler: async (input) => {
84
+ const delimiter = input.delimiter || ',';
85
+ const hasHeaders = input.hasHeaders !== false;
86
+ const lines = input.text.split('\n').filter((line) => line.trim());
87
+ if (lines.length === 0) {
88
+ return { rows: [], headers: [], rowCount: 0 };
89
+ }
90
+ const firstLine = lines[0];
91
+ const headers = hasHeaders
92
+ ? firstLine.split(delimiter).map((h) => h.trim())
93
+ : firstLine.split(delimiter).map((_, i) => `column${i + 1}`);
94
+ const dataLines = hasHeaders ? lines.slice(1) : lines;
95
+ const rows = dataLines.map((line) => {
96
+ const values = line.split(delimiter).map((v) => v.trim());
97
+ const row = {};
98
+ headers.forEach((header, i) => {
99
+ row[header] = values[i] || '';
100
+ });
101
+ return row;
102
+ });
103
+ return { rows, headers, rowCount: rows.length };
104
+ },
105
+ tags: ['csv', 'parse', 'transform'],
106
+ });
107
+ // data.transform
108
+ this.register({
109
+ id: 'data.transform',
110
+ name: 'Transform Data',
111
+ description: 'Transform data by mapping fields to new structure',
112
+ category: 'data',
113
+ subcategory: 'transform',
114
+ parameters: [
115
+ {
116
+ name: 'data',
117
+ description: 'Source data to transform',
118
+ schema: {},
119
+ required: true,
120
+ },
121
+ {
122
+ name: 'transform',
123
+ description: 'Mapping of output fields to input paths',
124
+ schema: { type: 'object' },
125
+ required: true,
126
+ },
127
+ ],
128
+ handler: async (input) => {
129
+ const result = {};
130
+ for (const [outputKey, inputPath] of Object.entries(input.transform)) {
131
+ const pathParts = inputPath.split('.');
132
+ let value = input.data;
133
+ for (const part of pathParts) {
134
+ if (value && typeof value === 'object' && part in value) {
135
+ value = value[part];
136
+ }
137
+ else {
138
+ value = undefined;
139
+ break;
140
+ }
141
+ }
142
+ result[outputKey] = value;
143
+ }
144
+ return { result };
145
+ },
146
+ tags: ['transform', 'map', 'extract'],
147
+ });
148
+ }
149
+ /**
150
+ * Register a tool in the service registry
151
+ */
152
+ register(tool) {
153
+ this.tools.set(tool.id, tool);
154
+ }
155
+ /**
156
+ * Unregister a tool
157
+ */
158
+ unregister(id) {
159
+ return this.tools.delete(id);
160
+ }
161
+ /**
162
+ * Get a tool by ID
163
+ */
164
+ get(id) {
165
+ return this.tools.get(id);
166
+ }
167
+ /**
168
+ * Check if a tool exists
169
+ */
170
+ has(id) {
171
+ return this.tools.has(id);
172
+ }
173
+ /**
174
+ * List all tool IDs
175
+ */
176
+ list() {
177
+ return Array.from(this.tools.keys());
178
+ }
179
+ /**
180
+ * Query tools with filtering
181
+ */
182
+ query(options) {
183
+ let results = Array.from(this.tools.values());
184
+ // Filter by category
185
+ if (options.category) {
186
+ results = results.filter((t) => t.category === options.category);
187
+ }
188
+ // Filter by subcategory
189
+ if (options.subcategory) {
190
+ results = results.filter((t) => t.subcategory === options.subcategory);
191
+ }
192
+ // Filter by tags
193
+ if (options.tags && options.tags.length > 0) {
194
+ results = results.filter((t) => t.tags && options.tags.some((tag) => t.tags.includes(tag)));
195
+ }
196
+ // Filter by audience
197
+ if (options.audience) {
198
+ results = results.filter((t) => t.audience === options.audience || t.audience === 'both' || !t.audience);
199
+ }
200
+ // Text search
201
+ if (options.search) {
202
+ const search = options.search.toLowerCase();
203
+ results = results.filter((t) => t.name.toLowerCase().includes(search) ||
204
+ t.description.toLowerCase().includes(search) ||
205
+ t.id.toLowerCase().includes(search));
206
+ }
207
+ // Pagination
208
+ const offset = options.offset ?? 0;
209
+ const limit = options.limit ?? results.length;
210
+ results = results.slice(offset, offset + limit);
211
+ return results;
212
+ }
213
+ /**
214
+ * Get tools by category
215
+ */
216
+ byCategory(category) {
217
+ return this.query({ category });
218
+ }
219
+ /**
220
+ * Execute a tool by ID
221
+ */
222
+ async executeTool(id, input) {
223
+ const tool = this.tools.get(id);
224
+ if (!tool) {
225
+ throw new Error(`Tool "${id}" not found`);
226
+ }
227
+ return tool.handler(input);
228
+ }
229
+ /**
230
+ * Convert a Tool to MCP format
231
+ */
232
+ toMCP(tool) {
233
+ return {
234
+ name: tool.id,
235
+ description: tool.description,
236
+ inputSchema: {
237
+ type: 'object',
238
+ properties: Object.fromEntries(tool.parameters.map((p) => [
239
+ p.name,
240
+ typeof p.schema === 'object' && 'type' in p.schema
241
+ ? { ...p.schema, description: p.description }
242
+ : { description: p.description },
243
+ ])),
244
+ required: tool.parameters.filter((p) => p.required).map((p) => p.name),
245
+ },
246
+ };
247
+ }
248
+ /**
249
+ * Convert all registered tools to MCP format
250
+ */
251
+ listMCPTools() {
252
+ return this.list().map((id) => this.toMCP(this.get(id)));
253
+ }
254
+ /**
255
+ * Import a tool from MCP format
256
+ */
257
+ fromMCP(mcpTool, handler, options) {
258
+ const inputSchema = mcpTool.inputSchema;
259
+ const properties = inputSchema.properties || {};
260
+ const required = inputSchema.required || [];
261
+ const parameters = Object.entries(properties).map(([name, schema]) => ({
262
+ name,
263
+ description: schema.description || `Parameter: ${name}`,
264
+ schema: schema,
265
+ required: required.includes(name),
266
+ }));
267
+ const tool = {
268
+ id: mcpTool.name,
269
+ name: mcpTool.name,
270
+ description: mcpTool.description,
271
+ category: options?.category || 'integration',
272
+ ...(options?.subcategory !== undefined && { subcategory: options.subcategory }),
273
+ ...(options?.tags !== undefined && { tags: options.tags }),
274
+ parameters,
275
+ handler,
276
+ };
277
+ return tool;
278
+ }
279
+ /**
280
+ * Clear all tools (except built-ins if keepBuiltins is true)
281
+ */
282
+ clear(keepBuiltins = false) {
283
+ if (keepBuiltins) {
284
+ const builtinIds = ['data.json.parse', 'data.csv.parse', 'data.transform'];
285
+ const builtins = builtinIds.map((id) => this.tools.get(id)).filter(Boolean);
286
+ this.tools.clear();
287
+ builtins.forEach((tool) => this.tools.set(tool.id, tool));
288
+ }
289
+ else {
290
+ this.tools.clear();
291
+ }
292
+ }
293
+ }
294
+ /**
295
+ * Main tool service exposed via RPC as WorkerEntrypoint
296
+ *
297
+ * Usage:
298
+ * const tools = await env.TOOLS.connect()
299
+ * tools.register({ id: 'my.tool', ... })
300
+ * tools.list()
301
+ * const result = await tools.executeTool('data.json.parse', { text: '{}' })
302
+ */
303
+ export class ToolService extends WorkerEntrypoint {
304
+ /**
305
+ * Get a tool service instance - returns an RpcTarget that can be used directly
306
+ */
307
+ connect() {
308
+ return new ToolServiceCore();
309
+ }
310
+ }
311
+ // Export as default for WorkerEntrypoint pattern
312
+ export default ToolService;
313
+ // Export aliases
314
+ export { ToolService as ToolWorker };
315
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"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"}
package/dist/wrap.d.ts ADDED
@@ -0,0 +1,89 @@
1
+ /**
2
+ * `wrapTool()` — bridge from a `Tool` definition to an HTTP-shaped handler
3
+ * gated by `id.org.ai` brokers.
4
+ *
5
+ * Mirrors id.org.ai's `wrap()` shape but is specific to digital-tools:
6
+ *
7
+ * 1. Calls `AuthBroker.gate(req, need)` to authenticate the caller.
8
+ * `need` is derived from the tool's `auth` declaration.
9
+ * On rejection, returns the broker's pre-baked `denialResponse(...)`.
10
+ *
11
+ * 2. When the tool declares `pricing`, calls
12
+ * `PaymentBroker.settle(req, identity, required)`. On rejection,
13
+ * returns the broker's pre-baked 402 (`PaymentRejection.response`).
14
+ * `required` is translated from our local MDXLD `PaymentRequired`
15
+ * shape into id.org.ai's discriminated `PaymentRequired` (`charge`
16
+ * intent — `session` intent is not yet supported in 0.3.0 and we
17
+ * throw a clear error if a tool requests it).
18
+ *
19
+ * 3. Reads `application/json` body, calls `tool.handler(input, ctx)`
20
+ * with `ctx.identity = Identity` and (when paid) `ctx.paymentReceipt
21
+ * = PaymentReceipt`. The receipt's `responseHeader` (e.g.
22
+ * `PAYMENT-RESPONSE` for x402 or `Payment-Receipt` for MPP) is
23
+ * stamped onto the success response.
24
+ *
25
+ * 4. Tools without `auth` and without `pricing` pass through directly;
26
+ * the handler is invoked with `ctx.identity` undefined-cast (we set
27
+ * it to a synthetic anonymous ref) so the handler signature stays
28
+ * consistent.
29
+ *
30
+ * Tests should pass structural fakes for `AuthBroker` and `PaymentBroker`
31
+ * — both are interfaces in id.org.ai. We intentionally do NOT depend on
32
+ * `AuthBrokerImpl` / `PaymentBrokerImpl` so this module is portable into
33
+ * Workers without pulling concrete adapters.
34
+ *
35
+ * @packageDocumentation
36
+ */
37
+ import type { AuthBroker, AuthRequirement as IdAuthRequirement, PaymentBroker, PaymentRequired as IdPaymentRequired } from 'id.org.ai';
38
+ import type { AuthRequirement, PaymentRequired, Tool } from './types.js';
39
+ /**
40
+ * Translate the local MDXLD-shaped `AuthRequirement` (scopes + required
41
+ * mechanism) into id.org.ai's typed `AuthRequirement`. We always emit
42
+ * `minLevel: 1` for `oauth`/`apiKey` (a credential must be presented) and
43
+ * `minLevel: 0` for `none` (anonymous OK). Scopes flow through unchanged.
44
+ */
45
+ declare function toIdAuthRequirement(req: AuthRequirement): IdAuthRequirement;
46
+ /**
47
+ * Translate the local MDXLD-shaped `PaymentRequired` (single amount +
48
+ * accepted protocols) into id.org.ai's discriminated `PaymentRequired`
49
+ * (`charge` intent with explicit `RailQuote[]`). Each `accepts` entry
50
+ * fans out into `(method)` quotes — we use `exact` for x402 and `tempo`
51
+ * for MPP per phase-1 of `PaymentBrokerImpl`.
52
+ *
53
+ * Throws on `intent: 'session'` style requests — our local
54
+ * `PaymentRequired` doesn't currently model session intent, but if a
55
+ * caller mutates it to add one we surface the limitation early.
56
+ */
57
+ declare function toIdPaymentRequired(pricing: PaymentRequired): IdPaymentRequired;
58
+ /**
59
+ * Wrap a Tool with broker-aware HTTP handling.
60
+ *
61
+ * @param broker AuthBroker (id.org.ai). Required when the tool has `auth`.
62
+ * @param paymentBroker PaymentBroker (id.org.ai). Required when the tool has `pricing`.
63
+ * @param tool The tool definition.
64
+ * @returns A function `(req: Request) => Promise<Response>` honoring the
65
+ * tool's `auth` and `pricing` declarations.
66
+ *
67
+ * @example
68
+ * ```ts
69
+ * const handler = wrapTool(authBroker, paymentBroker, sendEmailTool)
70
+ * // Use as a Worker fetch handler:
71
+ * export default { fetch: handler }
72
+ * ```
73
+ *
74
+ * Tools without `auth` / `pricing` pass through with no broker calls.
75
+ * In that case the broker arguments may still be provided but are unused.
76
+ */
77
+ export declare function wrapTool<TInput, TOutput>(broker: AuthBroker | undefined, paymentBroker: PaymentBroker | undefined, tool: Tool<TInput, TOutput>): (req: Request) => Promise<Response>;
78
+ /**
79
+ * Internal: exported only for tests. Turn a local MDXLD `PaymentRequired`
80
+ * into id.org.ai's `PaymentRequired`. Throws on session intent.
81
+ */
82
+ export declare const __toIdPaymentRequired: typeof toIdPaymentRequired;
83
+ /**
84
+ * Internal: exported only for tests. Turn a local `AuthRequirement`
85
+ * into id.org.ai's `AuthRequirement`.
86
+ */
87
+ export declare const __toIdAuthRequirement: typeof toIdAuthRequirement;
88
+ export {};
89
+ //# sourceMappingURL=wrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrap.d.ts","sourceRoot":"","sources":["../src/wrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,eAAe,IAAI,iBAAiB,EAEpC,aAAa,EACb,eAAe,IAAI,iBAAiB,EAGrC,MAAM,WAAW,CAAA;AAElB,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,IAAI,EAAsB,MAAM,YAAY,CAAA;AAE5F;;;;;GAKG;AACH,iBAAS,mBAAmB,CAAC,GAAG,EAAE,eAAe,GAAG,iBAAiB,CAMpE;AAED;;;;;;;;;;GAUG;AACH,iBAAS,mBAAmB,CAAC,OAAO,EAAE,eAAe,GAAG,iBAAiB,CAgCxE;AA0CD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,OAAO,EACtC,MAAM,EAAE,UAAU,GAAG,SAAS,EAC9B,aAAa,EAAE,aAAa,GAAG,SAAS,EACxC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,GAC1B,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CA4ErC;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,4BAAsB,CAAA;AAExD;;;GAGG;AACH,eAAO,MAAM,qBAAqB,4BAAsB,CAAA"}
package/dist/wrap.js ADDED
@@ -0,0 +1,225 @@
1
+ /**
2
+ * `wrapTool()` — bridge from a `Tool` definition to an HTTP-shaped handler
3
+ * gated by `id.org.ai` brokers.
4
+ *
5
+ * Mirrors id.org.ai's `wrap()` shape but is specific to digital-tools:
6
+ *
7
+ * 1. Calls `AuthBroker.gate(req, need)` to authenticate the caller.
8
+ * `need` is derived from the tool's `auth` declaration.
9
+ * On rejection, returns the broker's pre-baked `denialResponse(...)`.
10
+ *
11
+ * 2. When the tool declares `pricing`, calls
12
+ * `PaymentBroker.settle(req, identity, required)`. On rejection,
13
+ * returns the broker's pre-baked 402 (`PaymentRejection.response`).
14
+ * `required` is translated from our local MDXLD `PaymentRequired`
15
+ * shape into id.org.ai's discriminated `PaymentRequired` (`charge`
16
+ * intent — `session` intent is not yet supported in 0.3.0 and we
17
+ * throw a clear error if a tool requests it).
18
+ *
19
+ * 3. Reads `application/json` body, calls `tool.handler(input, ctx)`
20
+ * with `ctx.identity = Identity` and (when paid) `ctx.paymentReceipt
21
+ * = PaymentReceipt`. The receipt's `responseHeader` (e.g.
22
+ * `PAYMENT-RESPONSE` for x402 or `Payment-Receipt` for MPP) is
23
+ * stamped onto the success response.
24
+ *
25
+ * 4. Tools without `auth` and without `pricing` pass through directly;
26
+ * the handler is invoked with `ctx.identity` undefined-cast (we set
27
+ * it to a synthetic anonymous ref) so the handler signature stays
28
+ * consistent.
29
+ *
30
+ * Tests should pass structural fakes for `AuthBroker` and `PaymentBroker`
31
+ * — both are interfaces in id.org.ai. We intentionally do NOT depend on
32
+ * `AuthBrokerImpl` / `PaymentBrokerImpl` so this module is portable into
33
+ * Workers without pulling concrete adapters.
34
+ *
35
+ * @packageDocumentation
36
+ */
37
+ import { denialResponse } from 'id.org.ai';
38
+ /**
39
+ * Translate the local MDXLD-shaped `AuthRequirement` (scopes + required
40
+ * mechanism) into id.org.ai's typed `AuthRequirement`. We always emit
41
+ * `minLevel: 1` for `oauth`/`apiKey` (a credential must be presented) and
42
+ * `minLevel: 0` for `none` (anonymous OK). Scopes flow through unchanged.
43
+ */
44
+ function toIdAuthRequirement(req) {
45
+ const minLevel = req.required === 'none' ? 0 : 1;
46
+ return {
47
+ minLevel,
48
+ ...(req.scopes.length > 0 && { scopes: req.scopes }),
49
+ };
50
+ }
51
+ /**
52
+ * Translate the local MDXLD-shaped `PaymentRequired` (single amount +
53
+ * accepted protocols) into id.org.ai's discriminated `PaymentRequired`
54
+ * (`charge` intent with explicit `RailQuote[]`). Each `accepts` entry
55
+ * fans out into `(method)` quotes — we use `exact` for x402 and `tempo`
56
+ * for MPP per phase-1 of `PaymentBrokerImpl`.
57
+ *
58
+ * Throws on `intent: 'session'` style requests — our local
59
+ * `PaymentRequired` doesn't currently model session intent, but if a
60
+ * caller mutates it to add one we surface the limitation early.
61
+ */
62
+ function toIdPaymentRequired(pricing) {
63
+ // Local `PaymentRequired` doesn't carry an `intent` discriminator;
64
+ // any future widening that does should fail fast here.
65
+ if (pricing.intent === 'session') {
66
+ throw new Error("wrapTool: 'session' intent pricing is not yet supported (id.org.ai PaymentBroker.session() is not implemented in 0.3.0). " +
67
+ "Use 'charge' intent or wait for the next id.org.ai release.");
68
+ }
69
+ const accepts = pricing.accepts.map((protocol) => {
70
+ if (protocol === 'x402') {
71
+ return {
72
+ rail: { protocol: 'x402', method: 'exact', asset: pricing.currency },
73
+ amount: pricing.amount,
74
+ asset: pricing.currency,
75
+ payTo: pricing.recipient,
76
+ };
77
+ }
78
+ // protocol === 'mpp'
79
+ return {
80
+ rail: { protocol: 'mpp', method: 'tempo', asset: pricing.currency },
81
+ amount: pricing.amount,
82
+ asset: pricing.currency,
83
+ payTo: pricing.recipient,
84
+ };
85
+ });
86
+ return {
87
+ intent: 'charge',
88
+ accepts,
89
+ };
90
+ }
91
+ /**
92
+ * Read the request body as JSON. Returns `undefined` for empty bodies
93
+ * and non-JSON content types so tools with no input still work.
94
+ */
95
+ async function readJsonBody(req) {
96
+ const ct = req.headers.get('content-type') ?? '';
97
+ if (!ct.toLowerCase().includes('application/json'))
98
+ return undefined;
99
+ const text = await req.text();
100
+ if (!text)
101
+ return undefined;
102
+ try {
103
+ return JSON.parse(text);
104
+ }
105
+ catch {
106
+ return undefined;
107
+ }
108
+ }
109
+ /**
110
+ * Build a JSON `Response` for a successful tool invocation. Stamps the
111
+ * payment receipt's `responseHeader` (e.g. `PAYMENT-RESPONSE` for x402
112
+ * or `Payment-Receipt` for MPP) when present.
113
+ */
114
+ function jsonOk(body, receipt) {
115
+ const headers = { 'content-type': 'application/json' };
116
+ if (receipt?.responseHeader) {
117
+ const [name, value] = receipt.responseHeader;
118
+ headers[name] = value;
119
+ }
120
+ return new Response(JSON.stringify(body), { status: 200, headers });
121
+ }
122
+ /**
123
+ * Build a JSON error `Response`.
124
+ */
125
+ function jsonError(status, code, message) {
126
+ return new Response(JSON.stringify({ error: code, error_description: message }), {
127
+ status,
128
+ headers: { 'content-type': 'application/json' },
129
+ });
130
+ }
131
+ /**
132
+ * Wrap a Tool with broker-aware HTTP handling.
133
+ *
134
+ * @param broker AuthBroker (id.org.ai). Required when the tool has `auth`.
135
+ * @param paymentBroker PaymentBroker (id.org.ai). Required when the tool has `pricing`.
136
+ * @param tool The tool definition.
137
+ * @returns A function `(req: Request) => Promise<Response>` honoring the
138
+ * tool's `auth` and `pricing` declarations.
139
+ *
140
+ * @example
141
+ * ```ts
142
+ * const handler = wrapTool(authBroker, paymentBroker, sendEmailTool)
143
+ * // Use as a Worker fetch handler:
144
+ * export default { fetch: handler }
145
+ * ```
146
+ *
147
+ * Tools without `auth` / `pricing` pass through with no broker calls.
148
+ * In that case the broker arguments may still be provided but are unused.
149
+ */
150
+ export function wrapTool(broker, paymentBroker, tool) {
151
+ // Pre-translate auth/pricing once so per-request work stays minimal,
152
+ // and so a `session`-intent pricing fails at wrap-time rather than at
153
+ // first request — easier to debug.
154
+ const idAuth = tool.auth ? toIdAuthRequirement(tool.auth) : null;
155
+ const idPricing = tool.pricing ? toIdPaymentRequired(tool.pricing) : null;
156
+ return async function wrappedTool(req) {
157
+ let identity;
158
+ let receipt;
159
+ // --- Auth gate ----------------------------------------------------
160
+ if (idAuth) {
161
+ if (!broker) {
162
+ return jsonError(500, 'configuration_error', `Tool "${tool.id}" declares auth but no AuthBroker was provided to wrapTool()`);
163
+ }
164
+ const decision = await broker.gate(req, idAuth);
165
+ if (!decision.ok) {
166
+ return denialResponse(decision);
167
+ }
168
+ identity = decision.identity;
169
+ }
170
+ // --- Payment settle ----------------------------------------------
171
+ if (idPricing) {
172
+ if (!paymentBroker) {
173
+ return jsonError(500, 'configuration_error', `Tool "${tool.id}" declares pricing but no PaymentBroker was provided to wrapTool()`);
174
+ }
175
+ // Auth is required for paid tools so we have an Identity to settle
176
+ // against. If a tool has pricing without auth we fall back to a
177
+ // synthetic anonymous identity — the broker still accepts it but
178
+ // rail negotiation will fail unless the request carries proof.
179
+ const settleIdentity = identity ?? {
180
+ id: 'anonymous',
181
+ type: 'agent',
182
+ name: 'anonymous',
183
+ verified: false,
184
+ level: 0,
185
+ claimStatus: 'unclaimed',
186
+ };
187
+ const outcome = await paymentBroker.settle(req, settleIdentity, idPricing);
188
+ if (!outcome.ok) {
189
+ return outcome.response;
190
+ }
191
+ receipt = outcome;
192
+ }
193
+ // --- Invoke handler -----------------------------------------------
194
+ let input;
195
+ try {
196
+ input = (await readJsonBody(req));
197
+ }
198
+ catch {
199
+ return jsonError(400, 'invalid_request', 'Could not parse request body as JSON');
200
+ }
201
+ const ctx = {
202
+ identity: identity ?? 'anonymous',
203
+ ...(receipt && { paymentReceipt: receipt }),
204
+ };
205
+ try {
206
+ const result = await tool.handler(input, ctx);
207
+ return jsonOk(result, receipt);
208
+ }
209
+ catch (err) {
210
+ const message = err instanceof Error ? err.message : String(err);
211
+ return jsonError(500, 'execution_error', message);
212
+ }
213
+ };
214
+ }
215
+ /**
216
+ * Internal: exported only for tests. Turn a local MDXLD `PaymentRequired`
217
+ * into id.org.ai's `PaymentRequired`. Throws on session intent.
218
+ */
219
+ export const __toIdPaymentRequired = toIdPaymentRequired;
220
+ /**
221
+ * Internal: exported only for tests. Turn a local `AuthRequirement`
222
+ * into id.org.ai's `AuthRequirement`.
223
+ */
224
+ export const __toIdAuthRequirement = toIdAuthRequirement;
225
+ //# sourceMappingURL=wrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrap.js","sourceRoot":"","sources":["../src/wrap.ts"],"names":[],"mappings":"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"}