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
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Sugar factories for the Four Functions (v3 §6).
3
+ *
4
+ * Top-level named exports `Code` / `Generative` / `Agentic` / `Human` mint a
5
+ * typed {@link FunctionRef} from a kind-specific spec. The factory fills in
6
+ * the discriminator (`kind`) and a deterministic `$id` derived from `name`,
7
+ * so callers write the minimum possible at the call site:
8
+ *
9
+ * ```ts
10
+ * import { Code, Generative, Agentic, Human } from 'digital-tools'
11
+ *
12
+ * const summarize = Generative({ name: 'summarize', modelHint: 'claude-opus-4' })
13
+ * const reviewer = Agentic({ name: 'security-review', mode: 'supervised', persona: 'persona:skeptic' })
14
+ * const signOff = Human({ name: 'controller-sign-off', rationale: 'regulatory',
15
+ * expirationPolicy: { whenAccuracyExceeds: 0.99, whenSamplesExceed: 500 } })
16
+ * const compute = Code({ name: 'compute-vat', handler: (x: { net: number }) => x.net * 0.2 })
17
+ * ```
18
+ *
19
+ * @packageDocumentation
20
+ */
21
+
22
+ import type {
23
+ AgenticFunctionRef,
24
+ CodeFunctionRef,
25
+ FunctionRef,
26
+ GenerativeFunctionRef,
27
+ HumanFunctionRef,
28
+ } from './function-ref.js'
29
+
30
+ /**
31
+ * Reduce an arbitrary name to a stable, lowercase, hyphen-joined slug.
32
+ * Non-ASCII alphanumerics collapse to `-`; leading/trailing `-` are trimmed.
33
+ */
34
+ function slug(name: string): string {
35
+ return name
36
+ .toLowerCase()
37
+ .replace(/[^a-z0-9]+/g, '-')
38
+ .replace(/^-+|-+$/g, '')
39
+ }
40
+
41
+ /**
42
+ * Mint a deterministic `fn:<kind>:<slug>` MDXLD `$id`.
43
+ */
44
+ function mintId(kind: FunctionRef['kind'], name: string): string {
45
+ return `fn:${kind}:${slug(name)}`
46
+ }
47
+
48
+ // ============================================================================
49
+ // Code
50
+ // ============================================================================
51
+
52
+ /**
53
+ * Spec accepted by the {@link Code} sugar factory. Omits the auto-derived
54
+ * `$id` and the discriminator `kind`.
55
+ */
56
+ export type CodeFunctionSpec<TInput = unknown, TOutput = unknown> = Omit<
57
+ CodeFunctionRef<TInput, TOutput>,
58
+ '$id' | 'kind'
59
+ >
60
+
61
+ /**
62
+ * Mint a {@link CodeFunctionRef}. The `handler` may be an inline function or
63
+ * an `ActionRef` string into `digital-objects`.
64
+ */
65
+ export function Code<TInput = unknown, TOutput = unknown>(
66
+ spec: CodeFunctionSpec<TInput, TOutput>
67
+ ): CodeFunctionRef<TInput, TOutput> {
68
+ return {
69
+ $id: mintId('code', spec.name),
70
+ kind: 'code',
71
+ ...spec,
72
+ }
73
+ }
74
+
75
+ // ============================================================================
76
+ // Generative
77
+ // ============================================================================
78
+
79
+ /**
80
+ * Spec accepted by the {@link Generative} sugar factory.
81
+ */
82
+ export type GenerativeFunctionSpec = Omit<GenerativeFunctionRef, '$id' | 'kind'>
83
+
84
+ /**
85
+ * Mint a {@link GenerativeFunctionRef} — single-shot LLM call.
86
+ */
87
+ export function Generative(spec: GenerativeFunctionSpec): GenerativeFunctionRef {
88
+ return {
89
+ $id: mintId('generative', spec.name),
90
+ kind: 'generative',
91
+ ...spec,
92
+ }
93
+ }
94
+
95
+ // ============================================================================
96
+ // Agentic
97
+ // ============================================================================
98
+
99
+ /**
100
+ * Spec accepted by the {@link Agentic} sugar factory.
101
+ */
102
+ export type AgenticFunctionSpec = Omit<AgenticFunctionRef, '$id' | 'kind'>
103
+
104
+ /**
105
+ * Mint an {@link AgenticFunctionRef} — looping, tool-using AI worker.
106
+ */
107
+ export function Agentic(spec: AgenticFunctionSpec): AgenticFunctionRef {
108
+ return {
109
+ $id: mintId('agentic', spec.name),
110
+ kind: 'agentic',
111
+ ...spec,
112
+ }
113
+ }
114
+
115
+ // ============================================================================
116
+ // Human
117
+ // ============================================================================
118
+
119
+ /**
120
+ * Spec accepted by the {@link Human} sugar factory.
121
+ */
122
+ export type HumanFunctionSpec = Omit<HumanFunctionRef, '$id' | 'kind'>
123
+
124
+ /**
125
+ * Mint a {@link HumanFunctionRef} — work performed by a person, with a
126
+ * declared rationale and migration policy.
127
+ */
128
+ export function Human(spec: HumanFunctionSpec): HumanFunctionRef {
129
+ return {
130
+ $id: mintId('human', spec.name),
131
+ kind: 'human',
132
+ ...spec,
133
+ }
134
+ }
package/src/index.ts CHANGED
@@ -12,11 +12,47 @@
12
12
  * @packageDocumentation
13
13
  */
14
14
 
15
- // Export all types
15
+ // Export all types from types.ts
16
16
  export type * from './types.js'
17
17
 
18
- // Re-export AnyTool as a convenience value export
19
- export type { AnyTool, Tool, ToolCategory, ToolSubcategory, ToolRegistry } from './types.js'
18
+ // Re-export commonly used types explicitly for better discoverability
19
+ // Core types
20
+ export type {
21
+ Tool,
22
+ AnyTool,
23
+ ToolCategory,
24
+ ToolSubcategory,
25
+ // Execution types
26
+ ToolResult,
27
+ ToolContext,
28
+ // Configuration types
29
+ ToolParameter,
30
+ ToolOutput,
31
+ ToolPermission,
32
+ ToolAudience,
33
+ // Registry types
34
+ ToolRegistry,
35
+ ToolQuery,
36
+ // Builder types
37
+ DefineToolOptions,
38
+ // SVO co-design (aip-oejp): verb / frame / auth / pricing / handler ctx
39
+ Frame,
40
+ ActionRef,
41
+ IdentityRef,
42
+ PaymentRail,
43
+ PaymentRequired,
44
+ AuthRequirement,
45
+ ToolHandlerContext,
46
+ // id.org.ai canonical types re-exported via types.ts so consumers
47
+ // don't need a second import. Populated on `ToolHandlerContext` by
48
+ // `wrapTool()` (aip-lbtr).
49
+ Identity,
50
+ PaymentReceipt,
51
+ // MCP compatibility
52
+ MCPTool,
53
+ MCPToolCall,
54
+ MCPToolResult,
55
+ } from './types.js'
20
56
 
21
57
  // Export entity type definitions (Nouns for digital tools)
22
58
  export {
@@ -72,12 +108,64 @@ export {
72
108
  } from './registry.js'
73
109
 
74
110
  // Export tool definition helpers
111
+ export { defineTool, defineAndRegister, createToolExecutor, toolBuilder } from './define.js'
112
+
113
+ // Export broker-aware HTTP wrapper (aip-lbtr) — bridges Tool definitions
114
+ // to id.org.ai's AuthBroker + PaymentBroker so paid/auth-gated tools work
115
+ // declaratively without callers manually wiring brokers.
116
+ export { wrapTool } from './wrap.js'
117
+
118
+ // Export Verb auto-registration helpers (aip-47tm) — explicit, idempotent
119
+ // bridge from `defineTool({ verb, frame })` to `digital-objects`'
120
+ // provider-mediated `defineVerb()`. Callers wire this at startup
121
+ // (`registerToolVerbs`) or lazily per dispatch (`registerToolVerb`).
75
122
  export {
76
- defineTool,
77
- defineAndRegister,
78
- createToolExecutor,
79
- toolBuilder,
80
- } from './define.js'
123
+ registerToolVerb,
124
+ registerToolVerbs,
125
+ bootstrapTools,
126
+ VerbRegistrationConflictError,
127
+ } from './verb-registration.js'
128
+ export type { VerbRegistrationProvider } from './verb-registration.js'
129
+
130
+ // FunctionRef discriminated union (v3 §6) — the Four Functions promoted to
131
+ // a typed primitive. Additive alongside the legacy `Tool` interface; no
132
+ // existing tools are migrated.
133
+ export type {
134
+ RewardSignal,
135
+ PersonaRef,
136
+ SignOffMode,
137
+ OversightPolicy,
138
+ BaseFunctionRef,
139
+ CodeFunctionRef,
140
+ GenerativeFunctionRef,
141
+ AgenticFunctionRef,
142
+ HumanFunctionRef,
143
+ HumanRationale,
144
+ HumanExpirationPolicy,
145
+ HumanChannel,
146
+ FunctionRef,
147
+ FunctionKind,
148
+ } from './function-ref.js'
149
+
150
+ // Track-record + autonomy ladder primitives (shared with digital-workers
151
+ // once that package re-exports them).
152
+ export type {
153
+ AgentMode,
154
+ TrendDirection,
155
+ TrackRecord,
156
+ PromotionRule,
157
+ PromotionPolicy,
158
+ } from './track-record.js'
159
+
160
+ // Sugar factories — top-level named exports per v3 §6 import style:
161
+ // import { Code, Generative, Agentic, Human } from 'digital-tools'
162
+ export type {
163
+ CodeFunctionSpec,
164
+ GenerativeFunctionSpec,
165
+ AgenticFunctionSpec,
166
+ HumanFunctionSpec,
167
+ } from './function-sugar.js'
168
+ export { Code, Generative, Agentic, Human } from './function-sugar.js'
81
169
 
82
170
  // Export pre-built tools
83
171
  export {
@@ -101,6 +189,39 @@ export {
101
189
  sendNotification,
102
190
  sendSms,
103
191
  communicationTools,
192
+
193
+ // System tools (fsx.do, gitx.do, bashx.do integration)
194
+ // Filesystem (fsx.do)
195
+ fsRead,
196
+ fsWrite,
197
+ fsList,
198
+ fsDelete,
199
+ fsGlob,
200
+ fsGrep,
201
+ fsxTools,
202
+
203
+ // Git (gitx.do)
204
+ gitInit,
205
+ gitClone,
206
+ gitStatus,
207
+ gitAdd,
208
+ gitCommit,
209
+ gitLog,
210
+ gitDiff,
211
+ gitCheckout,
212
+ gitPush,
213
+ gitPull,
214
+ gitxTools,
215
+
216
+ // Bash (bashx.do)
217
+ bashExec,
218
+ bashAnalyze,
219
+ bashScript,
220
+ bashEnv,
221
+ bashxTools,
222
+
223
+ // All system tools
224
+ systemTools,
104
225
  } from './tools/index.js'
105
226
 
106
227
  // Export providers (concrete implementations using third-party APIs)
@@ -158,12 +279,13 @@ import { registry } from './registry.js'
158
279
  import { webTools } from './tools/web.js'
159
280
  import { dataTools } from './tools/data.js'
160
281
  import { communicationTools } from './tools/communication.js'
282
+ import { systemTools } from './tools/system.js'
161
283
 
162
284
  /**
163
285
  * Register all built-in tools in the global registry
164
286
  */
165
287
  export function registerBuiltinTools(): void {
166
- for (const tool of [...webTools, ...dataTools, ...communicationTools]) {
288
+ for (const tool of [...webTools, ...dataTools, ...communicationTools, ...systemTools]) {
167
289
  registry.register(tool)
168
290
  }
169
291
  }
@@ -172,5 +294,5 @@ export function registerBuiltinTools(): void {
172
294
  * Get all built-in tools
173
295
  */
174
296
  export function getBuiltinTools() {
175
- return [...webTools, ...dataTools, ...communicationTools]
297
+ return [...webTools, ...dataTools, ...communicationTools, ...systemTools]
176
298
  }
@@ -47,8 +47,8 @@ export function createMixpanelProvider(config: ProviderConfig): AnalyticsProvide
47
47
  info: mixpanelInfo,
48
48
 
49
49
  async initialize(cfg: ProviderConfig): Promise<void> {
50
- projectToken = cfg.projectToken as string
51
- apiSecret = cfg.apiSecret as string | undefined
50
+ projectToken = cfg['projectToken'] as string
51
+ apiSecret = cfg['apiSecret'] as string | undefined
52
52
 
53
53
  if (!projectToken) {
54
54
  throw new Error('Mixpanel project token is required')
@@ -76,7 +76,7 @@ export function createMixpanelProvider(config: ProviderConfig): AnalyticsProvide
76
76
  body: JSON.stringify([testEvent]),
77
77
  })
78
78
 
79
- const result = await response.json() as { status: number }
79
+ const result = (await response.json()) as { status: number }
80
80
 
81
81
  return {
82
82
  healthy: response.ok && result.status === 1,
@@ -105,7 +105,9 @@ export function createMixpanelProvider(config: ProviderConfig): AnalyticsProvide
105
105
  properties: {
106
106
  token: projectToken,
107
107
  distinct_id: event.userId || event.anonymousId || 'unknown',
108
- time: event.timestamp ? Math.floor(event.timestamp.getTime() / 1000) : Math.floor(Date.now() / 1000),
108
+ time: event.timestamp
109
+ ? Math.floor(event.timestamp.getTime() / 1000)
110
+ : Math.floor(Date.now() / 1000),
109
111
  $insert_id: `${event.event}_${Date.now()}_${Math.random().toString(36).substring(7)}`,
110
112
  ...event.properties,
111
113
  },
@@ -119,7 +121,7 @@ export function createMixpanelProvider(config: ProviderConfig): AnalyticsProvide
119
121
  body: JSON.stringify([eventData]),
120
122
  })
121
123
 
122
- const result = await response.json() as { status: number }
124
+ const result = (await response.json()) as { status: number }
123
125
  return response.ok && result.status === 1
124
126
  } catch (error) {
125
127
  console.error('Mixpanel track error:', error)
@@ -143,7 +145,7 @@ export function createMixpanelProvider(config: ProviderConfig): AnalyticsProvide
143
145
  body: JSON.stringify([engageData]),
144
146
  })
145
147
 
146
- const result = await response.json() as { status: number }
148
+ const result = (await response.json()) as { status: number }
147
149
  return response.ok && result.status === 1
148
150
  } catch (error) {
149
151
  console.error('Mixpanel identify error:', error)
@@ -180,7 +182,7 @@ export function createMixpanelProvider(config: ProviderConfig): AnalyticsProvide
180
182
  body: JSON.stringify([aliasEvent]),
181
183
  })
182
184
 
183
- const result = await response.json() as { status: number }
185
+ const result = (await response.json()) as { status: number }
184
186
  return response.ok && result.status === 1
185
187
  } catch (error) {
186
188
  console.error('Mixpanel alias error:', error)
@@ -205,7 +207,7 @@ export function createMixpanelProvider(config: ProviderConfig): AnalyticsProvide
205
207
  return null
206
208
  }
207
209
 
208
- const data = await response.json() as {
210
+ const data = (await response.json()) as {
209
211
  name?: string
210
212
  description?: string
211
213
  query?: AnalyticsQueryOptions
@@ -216,9 +218,9 @@ export function createMixpanelProvider(config: ProviderConfig): AnalyticsProvide
216
218
  return {
217
219
  id: reportId,
218
220
  name: data.name || reportId,
219
- description: data.description,
221
+ ...(data.description !== undefined && { description: data.description }),
220
222
  query: data.query || { metrics: [], dateRange: { start: new Date(), end: new Date() } },
221
- result: data.result,
223
+ ...(data.result !== undefined && { result: data.result }),
222
224
  createdAt: data.created ? new Date(data.created) : new Date(),
223
225
  updatedAt: data.updated ? new Date(data.updated) : new Date(),
224
226
  }
@@ -237,10 +239,11 @@ export function createMixpanelProvider(config: ProviderConfig): AnalyticsProvide
237
239
  const auth = Buffer.from(`${apiSecret}:`).toString('base64')
238
240
 
239
241
  // Construct query parameters
240
- const params = new URLSearchParams({
241
- from_date: query.dateRange.start.toISOString().split('T')[0],
242
- to_date: query.dateRange.end.toISOString().split('T')[0],
243
- })
242
+ const params = new URLSearchParams()
243
+ const fromDate = query.dateRange.start.toISOString().split('T')[0]
244
+ const toDate = query.dateRange.end.toISOString().split('T')[0]
245
+ if (fromDate) params.append('from_date', fromDate)
246
+ if (toDate) params.append('to_date', toDate)
244
247
 
245
248
  if (query.metrics.length > 0) {
246
249
  params.append('event', query.metrics.join(','))
@@ -251,9 +254,7 @@ export function createMixpanelProvider(config: ProviderConfig): AnalyticsProvide
251
254
  }
252
255
 
253
256
  // Use the segmentation endpoint for queries
254
- const endpoint = query.dimensions && query.dimensions.length > 0
255
- ? 'segmentation'
256
- : 'events'
257
+ const endpoint = query.dimensions && query.dimensions.length > 0 ? 'segmentation' : 'events'
257
258
 
258
259
  const response = await fetch(`${MIXPANEL_QUERY_URL}/${endpoint}?${params.toString()}`, {
259
260
  headers: {
@@ -265,7 +266,7 @@ export function createMixpanelProvider(config: ProviderConfig): AnalyticsProvide
265
266
  throw new Error(`Query failed: ${response.statusText}`)
266
267
  }
267
268
 
268
- const data = await response.json() as {
269
+ const data = (await response.json()) as {
269
270
  data?: Record<string, Record<string, number>>
270
271
  }
271
272
 
@@ -30,7 +30,8 @@ const DEFAULT_BASE_URL = 'https://api.cal.com/v1'
30
30
  export const calComInfo: ProviderInfo = {
31
31
  id: 'calendar.cal-com',
32
32
  name: 'Cal.com',
33
- description: 'Cal.com API for scheduling and calendar management (open-source Calendly alternative)',
33
+ description:
34
+ 'Cal.com API for scheduling and calendar management (open-source Calendly alternative)',
34
35
  category: 'calendar',
35
36
  website: 'https://cal.com',
36
37
  docsUrl: 'https://cal.com/docs/api-reference',
@@ -179,7 +180,7 @@ export function createCalComProvider(config: ProviderConfig): CalendarProvider {
179
180
  .map((et) => ({
180
181
  id: String(et.id),
181
182
  name: et.title,
182
- description: et.description,
183
+ ...(et.description !== undefined && { description: et.description }),
183
184
  timeZone: 'UTC', // Cal.com handles timezone per user
184
185
  primary: et.position === 0,
185
186
  accessRole: 'owner' as const,
@@ -204,7 +205,7 @@ export function createCalComProvider(config: ProviderConfig): CalendarProvider {
204
205
  return {
205
206
  id: String(et.id),
206
207
  name: et.title,
207
- description: et.description,
208
+ ...(et.description !== undefined && { description: et.description }),
208
209
  timeZone: 'UTC',
209
210
  primary: et.position === 0,
210
211
  accessRole: 'owner',
@@ -244,15 +245,18 @@ export function createCalComProvider(config: ProviderConfig): CalendarProvider {
244
245
  id: booking.uid,
245
246
  calendarId,
246
247
  summary: booking.title,
247
- description: booking.description,
248
- location: booking.location,
248
+ ...(booking.description !== undefined && { description: booking.description }),
249
+ ...(booking.location !== undefined && { location: booking.location }),
249
250
  start: new Date(booking.startTime),
250
251
  end: new Date(booking.endTime),
251
252
  attendees: booking.attendees.map((a) => ({
252
253
  email: a.email,
253
254
  responseStatus: booking.status === 'ACCEPTED' ? 'accepted' : 'needsAction',
254
255
  })),
255
- status: (booking.status === 'CANCELLED' ? 'cancelled' : 'confirmed') as 'confirmed' | 'tentative' | 'cancelled',
256
+ status: (booking.status === 'CANCELLED' ? 'cancelled' : 'confirmed') as
257
+ | 'confirmed'
258
+ | 'tentative'
259
+ | 'cancelled',
256
260
  htmlLink: `${baseUrl.replace('/v1', '')}/booking/${booking.uid}`,
257
261
  }
258
262
  },
@@ -271,15 +275,18 @@ export function createCalComProvider(config: ProviderConfig): CalendarProvider {
271
275
  id: booking.uid,
272
276
  calendarId: String(booking.eventTypeId),
273
277
  summary: booking.title,
274
- description: booking.description,
275
- location: booking.location,
278
+ ...(booking.description !== undefined && { description: booking.description }),
279
+ ...(booking.location !== undefined && { location: booking.location }),
276
280
  start: new Date(booking.startTime),
277
281
  end: new Date(booking.endTime),
278
282
  attendees: booking.attendees.map((a) => ({
279
283
  email: a.email,
280
284
  responseStatus: booking.status === 'ACCEPTED' ? 'accepted' : 'needsAction',
281
285
  })),
282
- status: (booking.status === 'CANCELLED' ? 'cancelled' : 'confirmed') as 'confirmed' | 'tentative' | 'cancelled',
286
+ status: (booking.status === 'CANCELLED' ? 'cancelled' : 'confirmed') as
287
+ | 'confirmed'
288
+ | 'tentative'
289
+ | 'cancelled',
283
290
  htmlLink: `${baseUrl.replace('/v1', '')}/booking/${booking.uid}`,
284
291
  }
285
292
  },
@@ -321,15 +328,18 @@ export function createCalComProvider(config: ProviderConfig): CalendarProvider {
321
328
  id: booking.uid,
322
329
  calendarId: String(booking.eventTypeId),
323
330
  summary: booking.title,
324
- description: booking.description,
325
- location: booking.location,
331
+ ...(booking.description !== undefined && { description: booking.description }),
332
+ ...(booking.location !== undefined && { location: booking.location }),
326
333
  start: new Date(booking.startTime),
327
334
  end: new Date(booking.endTime),
328
335
  attendees: booking.attendees.map((a) => ({
329
336
  email: a.email,
330
337
  responseStatus: booking.status === 'ACCEPTED' ? 'accepted' : 'needsAction',
331
338
  })),
332
- status: (booking.status === 'CANCELLED' ? 'cancelled' : 'confirmed') as 'confirmed' | 'tentative' | 'cancelled',
339
+ status: (booking.status === 'CANCELLED' ? 'cancelled' : 'confirmed') as
340
+ | 'confirmed'
341
+ | 'tentative'
342
+ | 'cancelled',
333
343
  htmlLink: `${baseUrl.replace('/v1', '')}/booking/${booking.uid}`,
334
344
  }
335
345
  },
@@ -370,15 +380,18 @@ export function createCalComProvider(config: ProviderConfig): CalendarProvider {
370
380
  id: booking.uid,
371
381
  calendarId: String(booking.eventTypeId),
372
382
  summary: booking.title,
373
- description: booking.description,
374
- location: booking.location,
383
+ ...(booking.description !== undefined && { description: booking.description }),
384
+ ...(booking.location !== undefined && { location: booking.location }),
375
385
  start: new Date(booking.startTime),
376
386
  end: new Date(booking.endTime),
377
387
  attendees: booking.attendees.map((a) => ({
378
388
  email: a.email,
379
389
  responseStatus: booking.status === 'ACCEPTED' ? 'accepted' : 'needsAction',
380
390
  })),
381
- status: (booking.status === 'CANCELLED' ? 'cancelled' : 'confirmed') as 'confirmed' | 'tentative' | 'cancelled',
391
+ status: (booking.status === 'CANCELLED' ? 'cancelled' : 'confirmed') as
392
+ | 'confirmed'
393
+ | 'tentative'
394
+ | 'cancelled',
382
395
  htmlLink: `${baseUrl.replace('/v1', '')}/booking/${booking.uid}`,
383
396
  }))
384
397
 
@@ -402,9 +415,7 @@ export function createCalComProvider(config: ProviderConfig): CalendarProvider {
402
415
  params.append('dateFrom', timeMin.toISOString())
403
416
  params.append('dateTo', timeMax.toISOString())
404
417
 
405
- const result = await apiRequest<CalComAvailability>(
406
- `/availability?${params}`
407
- )
418
+ const result = await apiRequest<CalComAvailability>(`/availability?${params}`)
408
419
 
409
420
  if (result.ok && result.data) {
410
421
  results.push({
@@ -85,8 +85,8 @@ export function createGoogleCalendarProvider(config: ProviderConfig): CalendarPr
85
85
  info: googleCalendarInfo,
86
86
 
87
87
  async initialize(cfg: ProviderConfig): Promise<void> {
88
- accessToken = cfg.accessToken as string
89
- defaultCalendarId = cfg.calendarId as string | undefined
88
+ accessToken = cfg['accessToken'] as string
89
+ defaultCalendarId = cfg['calendarId'] as string | undefined
90
90
 
91
91
  if (!accessToken) {
92
92
  throw new Error('Google Calendar access token is required')
@@ -135,7 +135,7 @@ export function createGoogleCalendarProvider(config: ProviderConfig): CalendarPr
135
135
  return {
136
136
  items,
137
137
  hasMore: !!result.data.nextPageToken,
138
- nextCursor: result.data.nextPageToken,
138
+ ...(result.data.nextPageToken !== undefined && { nextCursor: result.data.nextPageToken }),
139
139
  }
140
140
  },
141
141
 
@@ -183,7 +183,8 @@ export function createGoogleCalendarProvider(config: ProviderConfig): CalendarPr
183
183
  createRequest: {
184
184
  requestId: `${Date.now()}-${Math.random()}`,
185
185
  conferenceSolutionKey: {
186
- type: event.conferenceData.type === 'hangoutsMeet' ? 'hangoutsMeet' : 'hangoutsMeet',
186
+ type:
187
+ event.conferenceData.type === 'hangoutsMeet' ? 'hangoutsMeet' : 'hangoutsMeet',
187
188
  },
188
189
  },
189
190
  }
@@ -191,10 +192,13 @@ export function createGoogleCalendarProvider(config: ProviderConfig): CalendarPr
191
192
  }
192
193
 
193
194
  const params = event.conferenceData ? '?conferenceDataVersion=1' : ''
194
- const result = await apiRequest<any>(`/calendars/${encodeURIComponent(calendarId)}/events${params}`, {
195
- method: 'POST',
196
- body: JSON.stringify(body),
197
- })
195
+ const result = await apiRequest<any>(
196
+ `/calendars/${encodeURIComponent(calendarId)}/events${params}`,
197
+ {
198
+ method: 'POST',
199
+ body: JSON.stringify(body),
200
+ }
201
+ )
198
202
 
199
203
  if (!result.ok || !result.data) {
200
204
  throw new Error(result.error || 'Failed to create event')
@@ -332,7 +336,8 @@ export function createGoogleCalendarProvider(config: ProviderConfig): CalendarPr
332
336
  if (options?.cursor) params.append('pageToken', options.cursor)
333
337
  if (options?.timeMin) params.append('timeMin', options.timeMin.toISOString())
334
338
  if (options?.timeMax) params.append('timeMax', options.timeMax.toISOString())
335
- if (options?.singleEvents !== undefined) params.append('singleEvents', String(options.singleEvents))
339
+ if (options?.singleEvents !== undefined)
340
+ params.append('singleEvents', String(options.singleEvents))
336
341
  if (options?.orderBy) params.append('orderBy', options.orderBy)
337
342
 
338
343
  const result = await apiRequest<{
@@ -364,7 +369,7 @@ export function createGoogleCalendarProvider(config: ProviderConfig): CalendarPr
364
369
  return {
365
370
  items,
366
371
  hasMore: !!result.data.nextPageToken,
367
- nextCursor: result.data.nextPageToken,
372
+ ...(result.data.nextPageToken !== undefined && { nextCursor: result.data.nextPageToken }),
368
373
  }
369
374
  },
370
375
 
@@ -394,10 +399,11 @@ export function createGoogleCalendarProvider(config: ProviderConfig): CalendarPr
394
399
  const calendar = result.data!.calendars[calendarId]
395
400
  return {
396
401
  calendarId,
397
- busy: calendar?.busy?.map((slot) => ({
398
- start: new Date(slot.start),
399
- end: new Date(slot.end),
400
- })) || [],
402
+ busy:
403
+ calendar?.busy?.map((slot) => ({
404
+ start: new Date(slot.start),
405
+ end: new Date(slot.end),
406
+ })) || [],
401
407
  }
402
408
  })
403
409
  },