digital-tools 2.1.3 → 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 (294) hide show
  1. package/CHANGELOG.md +9 -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 +21 -11
  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 +31 -14
  132. package/src/client.ts +136 -0
  133. package/src/define.ts +30 -24
  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 -4
  199. package/LICENSE +0 -21
  200. package/dist/providers/voice/vapi.d.ts +0 -27
  201. package/dist/providers/voice/vapi.d.ts.map +0 -1
  202. package/dist/providers/voice/vapi.js +0 -440
  203. package/dist/providers/voice/vapi.js.map +0 -1
  204. package/src/define.js +0 -259
  205. package/src/entities/advertising.js +0 -999
  206. package/src/entities/ai.js +0 -756
  207. package/src/entities/analytics.js +0 -1588
  208. package/src/entities/automation.js +0 -601
  209. package/src/entities/communication.js +0 -1150
  210. package/src/entities/crm.js +0 -1386
  211. package/src/entities/design.js +0 -546
  212. package/src/entities/development.js +0 -2212
  213. package/src/entities/document.js +0 -874
  214. package/src/entities/ecommerce.js +0 -1429
  215. package/src/entities/experiment.js +0 -1039
  216. package/src/entities/finance.js +0 -3478
  217. package/src/entities/forms.js +0 -1892
  218. package/src/entities/hr.js +0 -661
  219. package/src/entities/identity.js +0 -997
  220. package/src/entities/index.js +0 -282
  221. package/src/entities/infrastructure.js +0 -1153
  222. package/src/entities/knowledge.js +0 -1438
  223. package/src/entities/marketing.js +0 -1610
  224. package/src/entities/media.js +0 -1634
  225. package/src/entities/notification.js +0 -1199
  226. package/src/entities/presentation.js +0 -1274
  227. package/src/entities/productivity.js +0 -1317
  228. package/src/entities/project-management.js +0 -1136
  229. package/src/entities/recruiting.js +0 -736
  230. package/src/entities/shipping.js +0 -509
  231. package/src/entities/signature.js +0 -1102
  232. package/src/entities/site.js +0 -222
  233. package/src/entities/spreadsheet.js +0 -1341
  234. package/src/entities/storage.js +0 -1198
  235. package/src/entities/support.js +0 -1166
  236. package/src/entities/video-conferencing.js +0 -1750
  237. package/src/entities/video.js +0 -950
  238. package/src/entities.js +0 -1663
  239. package/src/index.js +0 -74
  240. package/src/providers/analytics/index.js +0 -17
  241. package/src/providers/analytics/mixpanel.js +0 -255
  242. package/src/providers/calendar/cal-com.js +0 -303
  243. package/src/providers/calendar/google-calendar.js +0 -335
  244. package/src/providers/calendar/index.js +0 -20
  245. package/src/providers/crm/hubspot.js +0 -566
  246. package/src/providers/crm/index.js +0 -17
  247. package/src/providers/development/github.js +0 -472
  248. package/src/providers/development/index.js +0 -17
  249. package/src/providers/ecommerce/index.js +0 -17
  250. package/src/providers/ecommerce/shopify.js +0 -378
  251. package/src/providers/email/index.js +0 -20
  252. package/src/providers/email/resend.js +0 -258
  253. package/src/providers/email/sendgrid.js +0 -161
  254. package/src/providers/finance/index.js +0 -17
  255. package/src/providers/finance/stripe.js +0 -549
  256. package/src/providers/forms/index.js +0 -17
  257. package/src/providers/forms/typeform.js +0 -500
  258. package/src/providers/index.js +0 -123
  259. package/src/providers/knowledge/index.js +0 -17
  260. package/src/providers/knowledge/notion.js +0 -389
  261. package/src/providers/marketing/index.js +0 -17
  262. package/src/providers/marketing/mailchimp.js +0 -443
  263. package/src/providers/media/cloudinary.js +0 -318
  264. package/src/providers/media/index.js +0 -17
  265. package/src/providers/messaging/index.js +0 -20
  266. package/src/providers/messaging/slack.js +0 -393
  267. package/src/providers/messaging/twilio-sms.js +0 -249
  268. package/src/providers/project-management/index.js +0 -17
  269. package/src/providers/project-management/linear.js +0 -575
  270. package/src/providers/registry.js +0 -86
  271. package/src/providers/spreadsheet/google-sheets.js +0 -375
  272. package/src/providers/spreadsheet/index.js +0 -20
  273. package/src/providers/spreadsheet/xlsx.js +0 -423
  274. package/src/providers/storage/index.js +0 -24
  275. package/src/providers/storage/s3.js +0 -419
  276. package/src/providers/support/index.js +0 -17
  277. package/src/providers/support/zendesk.js +0 -373
  278. package/src/providers/tasks/index.js +0 -17
  279. package/src/providers/tasks/todoist.js +0 -286
  280. package/src/providers/types.js +0 -9
  281. package/src/providers/video-conferencing/google-meet.js +0 -286
  282. package/src/providers/video-conferencing/index.js +0 -31
  283. package/src/providers/video-conferencing/jitsi.js +0 -254
  284. package/src/providers/video-conferencing/teams.js +0 -270
  285. package/src/providers/video-conferencing/zoom.js +0 -332
  286. package/src/registry.js +0 -128
  287. package/src/tools/communication.js +0 -184
  288. package/src/tools/data.js +0 -205
  289. package/src/tools/index.js +0 -11
  290. package/src/tools/web.js +0 -137
  291. package/src/types.js +0 -10
  292. package/test/define.test.js +0 -306
  293. package/test/registry.test.js +0 -357
  294. 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":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAGhE;;;;GAIG;AACH,MAAM,OAAO,eAAgB,SAAQ,SAAS;IACpC,KAAK,GAAyB,IAAI,GAAG,EAAE,CAAA;IAE/C;QACE,KAAK,EAAE,CAAA;QACP,0BAA0B;QAC1B,IAAI,CAAC,gBAAgB,EAAE,CAAA;IACzB,CAAC;IAED;;OAEG;IACK,gBAAgB;QACtB,kBAAkB;QAClB,IAAI,CAAC,QAAQ,CAAC;YACZ,EAAE,EAAE,iBAAiB;YACrB,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,oCAAoC;YACjD,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE,WAAW;YACxB,UAAU,EAAE;gBACV;oBACE,IAAI,EAAE,MAAM;oBACZ,WAAW,EAAE,sBAAsB;oBACnC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC1B,QAAQ,EAAE,IAAI;iBACf;aACF;YACD,OAAO,EAAE,KAAK,EAAE,KAAuB,EAAE,EAAE;gBACzC,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;oBACnC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;gBAC9B,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,OAAO;wBACL,IAAI,EAAE,IAAI;wBACV,KAAK,EAAE,KAAK;wBACZ,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc;qBACvD,CAAA;gBACH,CAAC;YACH,CAAC;YACD,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC;SACrC,CAAC,CAAA;QAEF,iBAAiB;QACjB,IAAI,CAAC,QAAQ,CAAC;YACZ,EAAE,EAAE,gBAAgB;YACpB,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,yCAAyC;YACtD,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE,WAAW;YACxB,UAAU,EAAE;gBACV;oBACE,IAAI,EAAE,MAAM;oBACZ,WAAW,EAAE,mBAAmB;oBAChC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC1B,QAAQ,EAAE,IAAI;iBACf;gBACD;oBACE,IAAI,EAAE,WAAW;oBACjB,WAAW,EAAE,mCAAmC;oBAChD,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC1B,QAAQ,EAAE,KAAK;iBAChB;gBACD;oBACE,IAAI,EAAE,YAAY;oBAClB,WAAW,EAAE,sCAAsC;oBACnD,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;oBAC3B,QAAQ,EAAE,KAAK;iBAChB;aACF;YACD,OAAO,EAAE,KAAK,EAAE,KAAiE,EAAE,EAAE;gBACnF,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,GAAG,CAAA;gBACxC,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,KAAK,KAAK,CAAA;gBAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;gBAElE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACvB,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAA;gBAC/C,CAAC;gBAED,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAE,CAAA;gBAC3B,MAAM,OAAO,GAAG,UAAU;oBACxB,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBACjD,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;gBAE9D,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;gBAErD,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;oBAClC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;oBACzD,MAAM,GAAG,GAA2B,EAAE,CAAA;oBACtC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;wBAC5B,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;oBAC/B,CAAC,CAAC,CAAA;oBACF,OAAO,GAAG,CAAA;gBACZ,CAAC,CAAC,CAAA;gBAEF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,CAAA;YACjD,CAAC;YACD,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,CAAC;SACpC,CAAC,CAAA;QAEF,iBAAiB;QACjB,IAAI,CAAC,QAAQ,CAAC;YACZ,EAAE,EAAE,gBAAgB;YACpB,IAAI,EAAE,gBAAgB;YACtB,WAAW,EAAE,mDAAmD;YAChE,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE,WAAW;YACxB,UAAU,EAAE;gBACV;oBACE,IAAI,EAAE,MAAM;oBACZ,WAAW,EAAE,0BAA0B;oBACvC,MAAM,EAAE,EAAE;oBACV,QAAQ,EAAE,IAAI;iBACf;gBACD;oBACE,IAAI,EAAE,WAAW;oBACjB,WAAW,EAAE,yCAAyC;oBACtD,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC1B,QAAQ,EAAE,IAAI;iBACf;aACF;YACD,OAAO,EAAE,KAAK,EAAE,KAA2D,EAAE,EAAE;gBAC7E,MAAM,MAAM,GAA4B,EAAE,CAAA;gBAE1C,KAAK,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;oBACrE,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;oBACtC,IAAI,KAAK,GAAY,KAAK,CAAC,IAAI,CAAA;oBAE/B,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;wBAC7B,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,IAAI,IAAK,KAAiC,EAAE,CAAC;4BACrF,KAAK,GAAI,KAAiC,CAAC,IAAI,CAAC,CAAA;wBAClD,CAAC;6BAAM,CAAC;4BACN,KAAK,GAAG,SAAS,CAAA;4BACjB,MAAK;wBACP,CAAC;oBACH,CAAC;oBAED,MAAM,CAAC,SAAS,CAAC,GAAG,KAAK,CAAA;gBAC3B,CAAC;gBAED,OAAO,EAAE,MAAM,EAAE,CAAA;YACnB,CAAC;YACD,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,SAAS,CAAC;SACtC,CAAC,CAAA;IACJ,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,IAAa;QACpB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;IAC/B,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,EAAU;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IAC9B,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAC3B,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAC3B,CAAC;IAED;;OAEG;IACH,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;IACtC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAkB;QACtB,IAAI,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAA;QAE7C,qBAAqB;QACrB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;QAClE,CAAC;QAED,wBAAwB;QACxB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,OAAO,CAAC,WAAW,CAAC,CAAA;QACxE,CAAC;QAED,iBAAiB;QACjB,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,IAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,IAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAC/F,CAAC;QAED,qBAAqB;QACrB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,OAAO,GAAG,OAAO,CAAC,MAAM,CACtB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC,QAAQ,CAC/E,CAAA;QACH,CAAC;QAED,cAAc;QACd,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,CAAA;YAC3C,OAAO,GAAG,OAAO,CAAC,MAAM,CACtB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACrC,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAC5C,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CACtC,CAAA;QACH,CAAC;QAED,aAAa;QACb,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAAA;QAClC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAA;QAC7C,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,CAAA;QAE/C,OAAO,OAAO,CAAA;IAChB,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,QAAsB;QAC/B,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAA;IACjC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CACf,EAAU,EACV,KAAa;QAEb,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,SAAS,EAAE,aAAa,CAAC,CAAA;QAC3C,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAqB,CAAA;IAChD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAa;QACjB,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,EAAE;YACb,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,MAAM,CAAC,WAAW,CAC5B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;oBACzB,CAAC,CAAC,IAAI;oBACN,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,IAAI,CAAC,CAAC,MAAM;wBAChD,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE;wBAC7C,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE;iBACnC,CAAC,CACH;gBACD,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aACvE;SACF,CAAA;IACH,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC,CAAC,CAAA;IAC3D,CAAC;IAED;;OAEG;IACH,OAAO,CACL,OAAgB,EAChB,OAAuD,EACvD,OAIC;QAED,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAA;QACvC,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,IAAI,EAAE,CAAA;QAC/C,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,IAAI,EAAE,CAAA;QAE3C,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;YACrE,IAAI;YACJ,WAAW,EAAG,MAAmC,CAAC,WAAW,IAAI,cAAc,IAAI,EAAE;YACrF,MAAM,EAAE,MAA2B;YACnC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;SAClC,CAAC,CAAC,CAAA;QAEH,MAAM,IAAI,GAAY;YACpB,EAAE,EAAE,OAAO,CAAC,IAAI;YAChB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,aAAa;YAC5C,GAAG,CAAC,OAAO,EAAE,WAAW,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC;YAC/E,GAAG,CAAC,OAAO,EAAE,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;YAC1D,UAAU;YACV,OAAO;SACR,CAAA;QAED,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAwB,KAAK;QACjC,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,UAAU,GAAG,CAAC,iBAAiB,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,CAAA;YAC1E,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAc,CAAA;YACxF,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;YAClB,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAA;QAC3D,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;QACpB,CAAC;IACH,CAAC;CACF;AAED;;;;;;;;GAQG;AACH,MAAM,OAAO,WAAY,SAAQ,gBAAgB;IAC/C;;OAEG;IACH,OAAO;QACL,OAAO,IAAI,eAAe,EAAE,CAAA;IAC9B,CAAC;CACF;AAED,iDAAiD;AACjD,eAAe,WAAW,CAAA;AAE1B,iBAAiB;AACjB,OAAO,EAAE,WAAW,IAAI,UAAU,EAAE,CAAA"}
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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"}