@lanes-sh/link 0.6.10 → 0.7.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 (202) hide show
  1. package/.gcloudignore +25 -15
  2. package/README.md +62 -45
  3. package/instructions/skills/lanes-link/SKILL.md +25 -0
  4. package/package.json +3 -2
  5. package/src/audit/conformance.ts +1 -1
  6. package/src/cli/argv.ts +14 -1
  7. package/src/cli/commands/connect/acquire.ts +100 -0
  8. package/src/cli/commands/connect/custom/index.ts +1 -1
  9. package/src/cli/commands/connect/declare.ts +19 -0
  10. package/src/cli/commands/connect/index.ts +54 -56
  11. package/src/cli/commands/connect/requirements.ts +23 -1
  12. package/src/cli/commands/connect/setup.ts +1 -1
  13. package/src/cli/commands/connect/variables.ts +220 -0
  14. package/src/cli/commands/knowledge/index.ts +22 -4
  15. package/src/cli/commands/knowledge/migrate.ts +61 -43
  16. package/src/cli/commands/operate/tools.ts +1 -1
  17. package/src/cli/commands/owner/entities.ts +244 -0
  18. package/src/cli/commands/owner/shared.ts +14 -0
  19. package/src/cli/commands/owner/vault.ts +2 -2
  20. package/src/cli/commands/owner.ts +13 -3
  21. package/src/cli/commands/setup.ts +12 -0
  22. package/src/cli/config-edit.ts +16 -6
  23. package/src/cli/config-repair.ts +10 -0
  24. package/src/cli/dispatch-owner.ts +30 -1
  25. package/src/cli/main.ts +2 -1
  26. package/src/cli/runtime/open.ts +14 -7
  27. package/src/cli/runtime/registry.ts +6 -1
  28. package/src/cli/selection.ts +11 -0
  29. package/src/cli/usage.ts +13 -2
  30. package/src/connectivity/auth/strategy/index.ts +1 -1
  31. package/src/connectivity/capability.ts +1 -1
  32. package/src/connectivity/context.ts +1 -1
  33. package/src/connectivity/index.ts +1 -1
  34. package/src/connectivity/mail/attachments.ts +42 -73
  35. package/src/connectivity/mail/content-type.ts +71 -0
  36. package/src/connectivity/mail/index.ts +1 -1
  37. package/src/connectivity/manifest/provider.ts +50 -0
  38. package/src/connectivity/manifest/variables.ts +173 -0
  39. package/src/connectivity/transports/factory.ts +74 -1
  40. package/src/connectivity/transports/http/index.ts +8 -2
  41. package/src/connectivity/transports/http/keys.ts +83 -0
  42. package/src/connectivity/transports/imap/attachment.ts +53 -10
  43. package/src/connectivity/transports/imap/capabilities.ts +28 -0
  44. package/src/connectivity/transports/imap/download.ts +111 -0
  45. package/src/connectivity/transports/imap/index.ts +13 -0
  46. package/src/connectivity/transports/imap/operations.ts +1 -0
  47. package/src/deployments/adapters/s3.ts +1 -1
  48. package/src/deployments/gcp/provision.ts +1 -1
  49. package/src/deployments/knowledge.ts +44 -18
  50. package/src/deployments/prepare.ts +1 -1
  51. package/src/deployments/serving.ts +1 -1
  52. package/src/dispatch/dispatch.ts +17 -10
  53. package/src/dispatch/staging.ts +76 -1
  54. package/src/profile/knowledge.ts +19 -11
  55. package/src/profile/schema.ts +2 -2
  56. package/src/providers/README.md +189 -0
  57. package/src/providers/airtable/index.ts +10 -0
  58. package/src/providers/algolia/index.ts +10 -0
  59. package/src/providers/amplitude/index.ts +10 -0
  60. package/src/providers/apify/index.ts +10 -0
  61. package/src/providers/asana/index.ts +10 -0
  62. package/src/providers/assets/provider.ts +11 -4
  63. package/src/providers/atlassian/index.ts +19 -0
  64. package/src/providers/attio/index.ts +10 -0
  65. package/src/providers/betterstack/index.ts +10 -0
  66. package/src/providers/box/index.ts +64 -0
  67. package/src/providers/brightdata/index.ts +10 -0
  68. package/src/providers/buildkite/index.ts +10 -0
  69. package/src/providers/bunq/index.ts +2 -2
  70. package/src/providers/calendly/index.ts +10 -0
  71. package/src/providers/canva/index.ts +10 -0
  72. package/src/providers/circleci/index.ts +10 -0
  73. package/src/providers/clickup/index.ts +10 -0
  74. package/src/providers/close/index.ts +10 -0
  75. package/src/providers/cloudflare_bindings/index.ts +14 -0
  76. package/src/providers/cloudflare_observability/index.ts +10 -0
  77. package/src/providers/contentful/index.ts +10 -0
  78. package/src/providers/custom/load.ts +1 -1
  79. package/src/providers/datadog/index.ts +10 -0
  80. package/src/providers/discord/index.ts +1 -1
  81. package/src/providers/discord/specs/discord.v10.json +0 -88
  82. package/src/providers/discord/specs/vendor.ts +1 -1
  83. package/src/providers/dropbox/index.ts +10 -0
  84. package/src/providers/entities/catalogue.ts +366 -0
  85. package/src/providers/entities/find.ts +279 -0
  86. package/src/providers/entities/provider.ts +334 -0
  87. package/src/providers/entities/render.ts +142 -0
  88. package/src/providers/entities/store.ts +276 -0
  89. package/src/providers/entities/writes.ts +279 -0
  90. package/src/providers/example/provider.ts +1 -1
  91. package/src/providers/expensify/index.ts +10 -0
  92. package/src/providers/fastmail/calendar/index.ts +21 -0
  93. package/src/providers/fastmail/contacts/index.ts +17 -0
  94. package/src/providers/fastmail/index.ts +4 -0
  95. package/src/providers/fastmail/mail/index.ts +38 -0
  96. package/src/providers/fastmail/shared/setup.ts +52 -0
  97. package/src/providers/figma/index.ts +10 -0
  98. package/src/providers/fireflies/index.ts +10 -0
  99. package/src/providers/flagsmith/index.ts +10 -0
  100. package/src/providers/gamma/index.ts +10 -0
  101. package/src/providers/github/index.ts +2 -2
  102. package/src/providers/google/gmail/attachment.ts +16 -1
  103. package/src/providers/google/gmail-imap/index.ts +7 -2
  104. package/src/providers/google/shared/oauth.ts +1 -1
  105. package/src/providers/google/shared/service-account.ts +1 -1
  106. package/src/providers/google/shared/setup.ts +1 -1
  107. package/src/providers/google/specs/calendar.v3.json +0 -32
  108. package/src/providers/google/specs/docs.v1.json +0 -76
  109. package/src/providers/google/specs/drive.v3.json +0 -32
  110. package/src/providers/google/specs/gmail.v1.json +0 -76
  111. package/src/providers/google/specs/people.v1.json +0 -77
  112. package/src/providers/google/specs/sheets.v4.json +0 -76
  113. package/src/providers/google/specs/tasks.v1.json +0 -76
  114. package/src/providers/grafana/index.ts +10 -0
  115. package/src/providers/heroku/index.ts +10 -0
  116. package/src/providers/hubspot/index.ts +75 -0
  117. package/src/providers/hygraph/index.ts +10 -0
  118. package/src/providers/icloud/mail/index.ts +5 -0
  119. package/src/providers/icloud/shared/setup.ts +1 -1
  120. package/src/providers/index.ts +255 -0
  121. package/src/providers/insightly/index.ts +10 -0
  122. package/src/providers/jam/index.ts +10 -0
  123. package/src/providers/klaviyo/index.ts +10 -0
  124. package/src/providers/mailbox/index.ts +87 -0
  125. package/src/providers/memory/provider.ts +3 -8
  126. package/src/providers/mercury/index.ts +10 -0
  127. package/src/providers/microsoft/calendar/index.ts +49 -0
  128. package/src/providers/microsoft/contacts/index.ts +50 -0
  129. package/src/providers/microsoft/drive/index.ts +62 -0
  130. package/src/providers/microsoft/index.ts +12 -0
  131. package/src/providers/microsoft/mail/index.ts +76 -0
  132. package/src/providers/microsoft/shared/oauth.ts +58 -0
  133. package/src/providers/microsoft/shared/scopes.ts +56 -0
  134. package/src/providers/microsoft/shared/setup.ts +45 -0
  135. package/src/providers/microsoft/specs/microsoft-todo.v1.json +755 -0
  136. package/src/providers/microsoft/specs/onedrive.v1.json +993 -0
  137. package/src/providers/microsoft/specs/outlook-calendar.v1.json +1743 -0
  138. package/src/providers/microsoft/specs/outlook-contacts.v1.json +430 -0
  139. package/src/providers/microsoft/specs/outlook-mail.v1.json +901 -0
  140. package/src/providers/microsoft/specs/vendor.ts +232 -0
  141. package/src/providers/microsoft/todo/index.ts +54 -0
  142. package/src/providers/miro/index.ts +10 -0
  143. package/src/providers/mixpanel/index.ts +10 -0
  144. package/src/providers/monday/index.ts +10 -0
  145. package/src/providers/mux/index.ts +10 -0
  146. package/src/providers/navan/index.ts +10 -0
  147. package/src/providers/neon/index.ts +10 -0
  148. package/src/providers/netlify/index.ts +10 -0
  149. package/src/providers/nextcloud/calendar/index.ts +28 -0
  150. package/src/providers/nextcloud/contacts/index.ts +18 -0
  151. package/src/providers/nextcloud/index.ts +3 -0
  152. package/src/providers/nextcloud/shared/setup.ts +59 -0
  153. package/src/providers/owner.ts +15 -3
  154. package/src/providers/paddle/index.ts +10 -0
  155. package/src/providers/paypal/index.ts +10 -0
  156. package/src/providers/posthog/index.ts +10 -0
  157. package/src/providers/prisma/index.ts +10 -0
  158. package/src/providers/ramp/index.ts +10 -0
  159. package/src/providers/recurly/index.ts +10 -0
  160. package/src/providers/reddit/index.ts +1 -1
  161. package/src/providers/remote/index.ts +10 -0
  162. package/src/providers/render/index.ts +35 -0
  163. package/src/providers/replicate/index.ts +10 -0
  164. package/src/providers/resend/index.ts +10 -0
  165. package/src/providers/riverside/index.ts +10 -0
  166. package/src/providers/rootly/index.ts +10 -0
  167. package/src/providers/rudderstack/index.ts +10 -0
  168. package/src/providers/salesloft/index.ts +10 -0
  169. package/src/providers/sanity/index.ts +10 -0
  170. package/src/providers/scopes.ts +2 -0
  171. package/src/providers/sentry/index.ts +10 -0
  172. package/src/providers/setup/plan.ts +11 -0
  173. package/src/providers/setup/provider.ts +12 -0
  174. package/src/providers/shared/openapi.ts +70 -0
  175. package/src/providers/shared/slug.ts +28 -0
  176. package/src/providers/shared/vendor-operations.ts +43 -1
  177. package/src/providers/shared/vendor-spec.ts +98 -17
  178. package/src/providers/shortcut/index.ts +10 -0
  179. package/src/providers/slack/index.ts +2 -2
  180. package/src/providers/square/index.ts +10 -0
  181. package/src/providers/storyblok/index.ts +10 -0
  182. package/src/providers/stripe/index.ts +10 -0
  183. package/src/providers/supabase/index.ts +10 -0
  184. package/src/providers/tasks/store.ts +2 -7
  185. package/src/providers/tavily/index.ts +10 -0
  186. package/src/providers/todoist/index.ts +10 -0
  187. package/src/providers/untested.ts +105 -0
  188. package/src/providers/vault/provider.ts +1 -1
  189. package/src/providers/vercel/index.ts +10 -0
  190. package/src/providers/vimeo/index.ts +10 -0
  191. package/src/providers/webflow/index.ts +10 -0
  192. package/src/providers/whimsical/index.ts +10 -0
  193. package/src/providers/wix/index.ts +10 -0
  194. package/src/providers/workable/index.ts +10 -0
  195. package/src/providers/yahoo_mail/index.ts +73 -0
  196. package/src/providers/zapier/index.ts +10 -0
  197. package/src/providers/zoho_mail/index.ts +79 -0
  198. package/src/secrets/document.ts +1 -1
  199. package/src/server/attachments.ts +129 -5
  200. package/src/server/index.ts +3 -3
  201. package/src/server/mcp/instructions.ts +88 -18
  202. package/src/server/stdio.ts +1 -1
@@ -16,10 +16,94 @@ import { icloudCalendar } from './icloud/calendar/index.ts';
16
16
  import { icloudContacts } from './icloud/contacts/index.ts';
17
17
  import { icloudDrive } from './icloud/drive/index.ts';
18
18
  import { icloudMail } from './icloud/mail/index.ts';
19
+ import { microsoftTodo } from './microsoft/todo/index.ts';
20
+ import { onedrive } from './microsoft/drive/index.ts';
21
+ import { outlookCalendar } from './microsoft/calendar/index.ts';
22
+ import { outlookContacts } from './microsoft/contacts/index.ts';
23
+ import { outlookMail } from './microsoft/mail/index.ts';
24
+ import { fastmailCalendar } from './fastmail/calendar/index.ts';
25
+ import { fastmailContacts } from './fastmail/contacts/index.ts';
26
+ import { fastmailMail } from './fastmail/mail/index.ts';
27
+ import { yahooMail } from './yahoo_mail/index.ts';
28
+ import { zohoMail } from './zoho_mail/index.ts';
29
+ import { mailbox } from './mailbox/index.ts';
30
+ import { nextcloudCalendar } from './nextcloud/calendar/index.ts';
31
+ import { nextcloudContacts } from './nextcloud/contacts/index.ts';
19
32
  import { linear } from './linear/index.ts';
20
33
  import { notion } from './notion/index.ts';
21
34
  import { reddit } from './reddit/index.ts';
22
35
  import { slack } from './slack/index.ts';
36
+ import { asana } from './asana/index.ts';
37
+ import { stripe } from './stripe/index.ts';
38
+ import { sentry } from './sentry/index.ts';
39
+ import { figma } from './figma/index.ts';
40
+ import { canva } from './canva/index.ts';
41
+ import { dropbox } from './dropbox/index.ts';
42
+ import { todoist } from './todoist/index.ts';
43
+ import { clickup } from './clickup/index.ts';
44
+ import { monday } from './monday/index.ts';
45
+ import { airtable } from './airtable/index.ts';
46
+ import { miro } from './miro/index.ts';
47
+ import { calendly } from './calendly/index.ts';
48
+ import { close } from './close/index.ts';
49
+ import { zapier } from './zapier/index.ts';
50
+ import { paypal } from './paypal/index.ts';
51
+ import { square } from './square/index.ts';
52
+ import { mercury } from './mercury/index.ts';
53
+ import { vercel } from './vercel/index.ts';
54
+ import { netlify } from './netlify/index.ts';
55
+ import { supabase } from './supabase/index.ts';
56
+ import { neon } from './neon/index.ts';
57
+ import { prisma } from './prisma/index.ts';
58
+ import { sanity } from './sanity/index.ts';
59
+ import { webflow } from './webflow/index.ts';
60
+ import { wix } from './wix/index.ts';
61
+ import { datadog } from './datadog/index.ts';
62
+ import { grafana } from './grafana/index.ts';
63
+ import { fireflies } from './fireflies/index.ts';
64
+ import { gamma } from './gamma/index.ts';
65
+ import { jam } from './jam/index.ts';
66
+ import { cloudflareObservability } from './cloudflare_observability/index.ts';
67
+ import { cloudflareBindings } from './cloudflare_bindings/index.ts';
68
+ import { atlassian } from './atlassian/index.ts';
69
+ import { hubspot } from './hubspot/index.ts';
70
+ import { box } from './box/index.ts';
71
+ import { render } from './render/index.ts';
72
+ import { algolia } from './algolia/index.ts';
73
+ import { amplitude } from './amplitude/index.ts';
74
+ import { apify } from './apify/index.ts';
75
+ import { attio } from './attio/index.ts';
76
+ import { betterstack } from './betterstack/index.ts';
77
+ import { brightdata } from './brightdata/index.ts';
78
+ import { buildkite } from './buildkite/index.ts';
79
+ import { circleci } from './circleci/index.ts';
80
+ import { contentful } from './contentful/index.ts';
81
+ import { expensify } from './expensify/index.ts';
82
+ import { flagsmith } from './flagsmith/index.ts';
83
+ import { heroku } from './heroku/index.ts';
84
+ import { hygraph } from './hygraph/index.ts';
85
+ import { insightly } from './insightly/index.ts';
86
+ import { klaviyo } from './klaviyo/index.ts';
87
+ import { mixpanel } from './mixpanel/index.ts';
88
+ import { mux } from './mux/index.ts';
89
+ import { navan } from './navan/index.ts';
90
+ import { paddle } from './paddle/index.ts';
91
+ import { posthog } from './posthog/index.ts';
92
+ import { ramp } from './ramp/index.ts';
93
+ import { recurly } from './recurly/index.ts';
94
+ import { remote } from './remote/index.ts';
95
+ import { replicate } from './replicate/index.ts';
96
+ import { resend } from './resend/index.ts';
97
+ import { riverside } from './riverside/index.ts';
98
+ import { rootly } from './rootly/index.ts';
99
+ import { rudderstack } from './rudderstack/index.ts';
100
+ import { salesloft } from './salesloft/index.ts';
101
+ import { shortcut } from './shortcut/index.ts';
102
+ import { storyblok } from './storyblok/index.ts';
103
+ import { tavily } from './tavily/index.ts';
104
+ import { vimeo } from './vimeo/index.ts';
105
+ import { whimsical } from './whimsical/index.ts';
106
+ import { workable } from './workable/index.ts';
23
107
 
24
108
  /**
25
109
  * Every provider, in one list.
@@ -72,7 +156,94 @@ export const PROVIDERS: readonly (ProviderManifest | ProviderDefinition)[] = [
72
156
  icloudCalendar,
73
157
  icloudContacts,
74
158
  icloudDrive,
159
+ outlookMail,
160
+ outlookCalendar,
161
+ outlookContacts,
162
+ onedrive,
163
+ microsoftTodo,
164
+ fastmailMail,
165
+ fastmailCalendar,
166
+ fastmailContacts,
167
+ zohoMail,
168
+ yahooMail,
169
+ nextcloudCalendar,
170
+ nextcloudContacts,
171
+ mailbox,
75
172
  bunq,
173
+
174
+ // Vendors running an official MCP server that offers Dynamic Client
175
+ // Registration. Each is a declaration and nothing else; see the header above.
176
+ asana,
177
+ stripe,
178
+ sentry,
179
+ figma,
180
+ canva,
181
+ dropbox,
182
+ todoist,
183
+ clickup,
184
+ monday,
185
+ airtable,
186
+ miro,
187
+ calendly,
188
+ close,
189
+ zapier,
190
+ paypal,
191
+ square,
192
+ mercury,
193
+ vercel,
194
+ netlify,
195
+ supabase,
196
+ neon,
197
+ prisma,
198
+ sanity,
199
+ webflow,
200
+ wix,
201
+ datadog,
202
+ grafana,
203
+ fireflies,
204
+ gamma,
205
+ jam,
206
+ cloudflareObservability,
207
+ cloudflareBindings,
208
+ atlassian,
209
+ hubspot,
210
+ box,
211
+ render,
212
+ algolia,
213
+ amplitude,
214
+ apify,
215
+ attio,
216
+ betterstack,
217
+ brightdata,
218
+ buildkite,
219
+ circleci,
220
+ contentful,
221
+ expensify,
222
+ flagsmith,
223
+ heroku,
224
+ hygraph,
225
+ insightly,
226
+ klaviyo,
227
+ mixpanel,
228
+ mux,
229
+ navan,
230
+ paddle,
231
+ posthog,
232
+ ramp,
233
+ recurly,
234
+ remote,
235
+ replicate,
236
+ resend,
237
+ riverside,
238
+ rootly,
239
+ rudderstack,
240
+ salesloft,
241
+ shortcut,
242
+ storyblok,
243
+ tavily,
244
+ vimeo,
245
+ whimsical,
246
+ workable,
76
247
  ];
77
248
 
78
249
  /** The manifest half of an entry, whichever shape it arrived in. */
@@ -101,6 +272,18 @@ export {
101
272
  sheets,
102
273
  } from './google/index.ts';
103
274
  export { icloudCalendar, icloudContacts, icloudDrive, icloudMail } from './icloud/index.ts';
275
+ export {
276
+ microsoftTodo,
277
+ onedrive,
278
+ outlookCalendar,
279
+ outlookContacts,
280
+ outlookMail,
281
+ } from './microsoft/index.ts';
282
+ export { fastmailCalendar, fastmailContacts, fastmailMail } from './fastmail/index.ts';
283
+ export { yahooMail } from './yahoo_mail/index.ts';
284
+ export { zohoMail } from './zoho_mail/index.ts';
285
+ export { nextcloudCalendar, nextcloudContacts } from './nextcloud/index.ts';
286
+ export { mailbox } from './mailbox/index.ts';
104
287
  export { bunq } from './bunq/index.ts';
105
288
  export { discord } from './discord/index.ts';
106
289
  export { github } from './github/index.ts';
@@ -108,4 +291,76 @@ export { linear } from './linear/index.ts';
108
291
  export { notion } from './notion/index.ts';
109
292
  export { reddit } from './reddit/index.ts';
110
293
  export { slack } from './slack/index.ts';
294
+ export { asana } from './asana/index.ts';
295
+ export { stripe } from './stripe/index.ts';
296
+ export { sentry } from './sentry/index.ts';
297
+ export { figma } from './figma/index.ts';
298
+ export { canva } from './canva/index.ts';
299
+ export { dropbox } from './dropbox/index.ts';
300
+ export { todoist } from './todoist/index.ts';
301
+ export { clickup } from './clickup/index.ts';
302
+ export { monday } from './monday/index.ts';
303
+ export { airtable } from './airtable/index.ts';
304
+ export { miro } from './miro/index.ts';
305
+ export { calendly } from './calendly/index.ts';
306
+ export { close } from './close/index.ts';
307
+ export { zapier } from './zapier/index.ts';
308
+ export { paypal } from './paypal/index.ts';
309
+ export { square } from './square/index.ts';
310
+ export { mercury } from './mercury/index.ts';
311
+ export { vercel } from './vercel/index.ts';
312
+ export { netlify } from './netlify/index.ts';
313
+ export { supabase } from './supabase/index.ts';
314
+ export { neon } from './neon/index.ts';
315
+ export { prisma } from './prisma/index.ts';
316
+ export { sanity } from './sanity/index.ts';
317
+ export { webflow } from './webflow/index.ts';
318
+ export { wix } from './wix/index.ts';
319
+ export { datadog } from './datadog/index.ts';
320
+ export { grafana } from './grafana/index.ts';
321
+ export { fireflies } from './fireflies/index.ts';
322
+ export { gamma } from './gamma/index.ts';
323
+ export { jam } from './jam/index.ts';
324
+ export { cloudflareObservability } from './cloudflare_observability/index.ts';
325
+ export { cloudflareBindings } from './cloudflare_bindings/index.ts';
326
+ export { atlassian } from './atlassian/index.ts';
327
+ export { hubspot } from './hubspot/index.ts';
328
+ export { box } from './box/index.ts';
329
+ export { render } from './render/index.ts';
330
+ export { algolia } from './algolia/index.ts';
331
+ export { amplitude } from './amplitude/index.ts';
332
+ export { apify } from './apify/index.ts';
333
+ export { attio } from './attio/index.ts';
334
+ export { betterstack } from './betterstack/index.ts';
335
+ export { brightdata } from './brightdata/index.ts';
336
+ export { buildkite } from './buildkite/index.ts';
337
+ export { circleci } from './circleci/index.ts';
338
+ export { contentful } from './contentful/index.ts';
339
+ export { expensify } from './expensify/index.ts';
340
+ export { flagsmith } from './flagsmith/index.ts';
341
+ export { heroku } from './heroku/index.ts';
342
+ export { hygraph } from './hygraph/index.ts';
343
+ export { insightly } from './insightly/index.ts';
344
+ export { klaviyo } from './klaviyo/index.ts';
345
+ export { mixpanel } from './mixpanel/index.ts';
346
+ export { mux } from './mux/index.ts';
347
+ export { navan } from './navan/index.ts';
348
+ export { paddle } from './paddle/index.ts';
349
+ export { posthog } from './posthog/index.ts';
350
+ export { ramp } from './ramp/index.ts';
351
+ export { recurly } from './recurly/index.ts';
352
+ export { remote } from './remote/index.ts';
353
+ export { replicate } from './replicate/index.ts';
354
+ export { resend } from './resend/index.ts';
355
+ export { riverside } from './riverside/index.ts';
356
+ export { rootly } from './rootly/index.ts';
357
+ export { rudderstack } from './rudderstack/index.ts';
358
+ export { salesloft } from './salesloft/index.ts';
359
+ export { shortcut } from './shortcut/index.ts';
360
+ export { storyblok } from './storyblok/index.ts';
361
+ export { tavily } from './tavily/index.ts';
362
+ export { vimeo } from './vimeo/index.ts';
363
+ export { whimsical } from './whimsical/index.ts';
364
+ export { workable } from './workable/index.ts';
111
365
  export { SCOPE_MEANINGS, type ScopeMeaning } from './scopes.ts';
366
+ export { UNTESTED_PROVIDERS } from './untested.ts';
@@ -0,0 +1,10 @@
1
+ import { defineProvider } from '#connectivity';
2
+
3
+ /** Insightly registers us at connect time — nothing for an operator to set up. */
4
+ export const insightly = defineProvider({
5
+ id: 'insightly',
6
+ name: 'Insightly',
7
+ description: 'Contacts, organisations, opportunities, and projects, via Insightly\'s official MCP server.',
8
+ connector: { kind: 'mcp', endpoint: 'https://mcp.insightly.com/mcp' },
9
+ auth: { kind: 'oauth', registration: 'dynamic' },
10
+ });
@@ -0,0 +1,10 @@
1
+ import { defineProvider } from '#connectivity';
2
+
3
+ /** Jam registers us at connect time — nothing for an operator to set up. */
4
+ export const jam = defineProvider({
5
+ id: 'jam',
6
+ name: 'Jam',
7
+ description: 'Bug reports, with their console logs, network calls, and repro steps, via Jam\'s official MCP server.',
8
+ connector: { kind: 'mcp', endpoint: 'https://mcp.jam.dev/mcp' },
9
+ auth: { kind: 'oauth', registration: 'dynamic' },
10
+ });
@@ -0,0 +1,10 @@
1
+ import { defineProvider } from '#connectivity';
2
+
3
+ /** Klaviyo registers us at connect time — nothing for an operator to set up. */
4
+ export const klaviyo = defineProvider({
5
+ id: 'klaviyo',
6
+ name: 'Klaviyo',
7
+ description: 'Profiles, lists, segments, campaigns, and flows, via Klaviyo\'s official MCP server.',
8
+ connector: { kind: 'mcp', endpoint: 'https://mcp.klaviyo.com/mcp' },
9
+ auth: { kind: 'oauth', registration: 'dynamic' },
10
+ });
@@ -0,0 +1,87 @@
1
+ import { defineProvider } from '#connectivity';
2
+ import { HOSTNAME } from '../nextcloud/shared/setup.ts';
3
+
4
+ /**
5
+ * Any mailbox, over IMAP and SMTP.
6
+ *
7
+ * The generic one, and the reason connection variables were worth building. Every
8
+ * other mail provider here is the same twenty lines with a different pair of
9
+ * hostnames — `icloud_mail`, `gmail_imap`, `fastmail_mail`, `zoho_mail`,
10
+ * `yahoo_mail` — and each exists because a manifest could hold exactly one
11
+ * address. A named provider is still better where there is one: it can carry the
12
+ * vendor's own setup walkthrough, its message-size limit, and the sentence about
13
+ * app passwords that a generic one cannot. This is for everything else — a
14
+ * company Dovecot, a Migadu, a Mailcow, a host nobody has written a manifest for.
15
+ *
16
+ * Two variables rather than one, because the two hosts genuinely differ:
17
+ * submission is conventionally `smtp.` where retrieval is `imap.`, and plenty of
18
+ * servers do neither.
19
+ */
20
+ export const mailbox = defineProvider({
21
+ id: 'mailbox',
22
+ name: 'Mailbox (any IMAP server)',
23
+ description:
24
+ 'Read, search, and send mail in any IMAP mailbox — a company server, or a host with no provider of its own.',
25
+ connector: {
26
+ kind: 'imap',
27
+ host: '{imap_host}',
28
+ port: 993,
29
+ smtp: { host: '{smtp_host}', port: 587, starttls: true },
30
+ },
31
+ auth: { kind: 'basic' },
32
+ identity: { kind: 'connector' },
33
+ variables: [
34
+ {
35
+ key: 'imap_host',
36
+ label: 'IMAP server',
37
+ description: 'Where mail is read from. Usually imap.<your domain>, on port 993.',
38
+ example: 'imap.example.com',
39
+ pattern: HOSTNAME,
40
+ },
41
+ {
42
+ key: 'smtp_host',
43
+ label: 'SMTP server',
44
+ description: 'Where mail is sent from. Often the same host, often smtp.<your domain>.',
45
+ example: 'smtp.example.com',
46
+ pattern: HOSTNAME,
47
+ },
48
+ ],
49
+ setup: {
50
+ summary:
51
+ 'A mailbox on a server this program has no manifest for. It asks for the two hostnames and the ' +
52
+ 'login; TLS is required on both, and the ports are the standard 993 and 587. Where your provider ' +
53
+ 'has a named entry here — iCloud, Fastmail, Gmail, Zoho, Yahoo — use that instead: it carries the ' +
54
+ 'setup steps and the limits this one cannot know.',
55
+ steps: [
56
+ 'Find your provider\'s IMAP and SMTP hostnames. They are usually in a page called "IMAP settings" or "Mail client setup".',
57
+ 'If the account has two-factor authentication, create an app password for it. Most servers refuse the account password over IMAP once 2FA is on.',
58
+ 'This provider assumes IMAP on 993 and SMTP submission on 587 with STARTTLS, which is what almost every host uses. A server on 465, or on a non-standard port, needs a manifest of its own in providers.d/ — see docs/detailed/creating-a-provider.md.',
59
+ ],
60
+ troubleshooting:
61
+ 'A connection refused is usually the wrong hostname or a server that wants port 465 rather than 587. ' +
62
+ 'A rejected login on the right host is usually an account password where an app password belongs.',
63
+ prompts: [
64
+ {
65
+ key: 'username',
66
+ label: 'Username (usually the full email address)',
67
+ secret: false,
68
+ scope: 'connection' as const,
69
+ field: 'username' as const,
70
+ },
71
+ {
72
+ key: 'password',
73
+ label: 'Password or app password',
74
+ secret: true,
75
+ scope: 'connection' as const,
76
+ field: 'password' as const,
77
+ },
78
+ ],
79
+ },
80
+ redact: {
81
+ search_messages: ['mailbox', 'limit', 'unseen', 'flagged'],
82
+ get_message: ['mailbox', 'uid', 'include_body'],
83
+ mark_messages: ['mailbox', 'add_flags', 'remove_flags'],
84
+ move_messages: ['mailbox', 'destination', 'destination_flag'],
85
+ send_message: [],
86
+ },
87
+ });
@@ -1,5 +1,6 @@
1
1
  import { z } from 'zod';
2
2
  import { splitOptionalFrontmatter, stringList, withFrontmatter } from '#providers/shared/frontmatter.ts';
3
+ import { slugify as slugifyText } from '#providers/shared/slug.ts';
3
4
  import {
4
5
  defineLocalProvider,
5
6
  keepKeys,
@@ -11,7 +12,7 @@ import {
11
12
  * `memory` — the owner's accumulated knowledge.
12
13
  *
13
14
  * **Reading and writing are separate capabilities**, and that separation is the
14
- * whole security argument for this provider (ADR-012 §2, `docs/detailed/security.md`).
15
+ * whole security argument for this provider (ADR-012 §2, `https://lanes.sh/docs/link/security`).
15
16
  * Upstream content is already treated as potentially prompt-injecting and passed
16
17
  * through unscreened; memory an agent can *write to* changes the shape of that
17
18
  * risk rather than its size, because an injected instruction is stored once and
@@ -167,13 +168,7 @@ async function allEntries(storage: BlobStore): Promise<Entry[]> {
167
168
 
168
169
  /** A stable id from a title, so writing does not demand one be invented. */
169
170
  function slugify(title: string): string {
170
- const slug = title
171
- .toLowerCase()
172
- .replace(/[^a-z0-9]+/g, '-')
173
- .replace(/^-+|-+$/g, '')
174
- .slice(0, 60);
175
-
176
- return slug.length > 0 ? slug : `entry-${title.length}`;
171
+ return slugifyText(title, 'entry');
177
172
  }
178
173
 
179
174
  export const memoryProvider: ProviderDefinition = defineLocalProvider({
@@ -0,0 +1,10 @@
1
+ import { defineProvider } from '#connectivity';
2
+
3
+ /** Mercury registers us at connect time — nothing for an operator to set up. */
4
+ export const mercury = defineProvider({
5
+ id: 'mercury',
6
+ name: 'Mercury',
7
+ description: 'Accounts, balances, transactions, and cards, via Mercury\'s official MCP server.',
8
+ connector: { kind: 'mcp', endpoint: 'https://mcp.mercury.com/mcp' },
9
+ auth: { kind: 'oauth', registration: 'dynamic' },
10
+ });
@@ -0,0 +1,49 @@
1
+ import { defineProvider } from '#connectivity';
2
+ import {
3
+ CALENDAR_SCOPES,
4
+ CONTACTS_SCOPES,
5
+ FILES_SCOPES,
6
+ GRAPH_BASE_URL,
7
+ MAIL_SCOPES,
8
+ MICROSOFT_APP,
9
+ MICROSOFT_AUTHORIZE_URL,
10
+ MICROSOFT_IDENTITY,
11
+ MICROSOFT_TOKEN_URL,
12
+ TODO_SCOPES,
13
+ specPath,
14
+ } from '../shared/oauth.ts';
15
+ import { microsoftSetup } from '../shared/setup.ts';
16
+
17
+ export const outlookCalendar = defineProvider({
18
+ id: 'outlook_calendar',
19
+ name: 'Outlook Calendar',
20
+ description:
21
+ 'Read and write events in Outlook calendars — list, search, create, reschedule, and cancel — via Microsoft Graph.',
22
+ connector: { kind: 'http', base_url: GRAPH_BASE_URL, openapi: specPath('outlook-calendar.v1.json') },
23
+ auth: {
24
+ kind: 'oauth',
25
+ registration: 'manual',
26
+ app: MICROSOFT_APP,
27
+ // Declared rather than discovered. An `http` connector has no metadata
28
+ // document to read — a REST API does not announce where its authorization
29
+ // server lives — so the two endpoints are part of the manifest.
30
+ authorize_url: MICROSOFT_AUTHORIZE_URL,
31
+ token_url: MICROSOFT_TOKEN_URL,
32
+ scopes: CALENDAR_SCOPES,
33
+ revoke_url: 'https://account.live.com/consent/Manage',
34
+ },
35
+ identity: MICROSOFT_IDENTITY,
36
+ setup: microsoftSetup('Outlook Calendar', CALENDAR_SCOPES),
37
+ redact: {
38
+ 'me.ListCalendars': ['top', 'orderby', 'select'],
39
+ 'me.ListEvents': ['top', 'orderby', 'select'],
40
+ // The window is not content; what is in it is.
41
+ 'me.ListCalendarView': ['startDateTime', 'endDateTime', 'top', 'orderby', 'select'],
42
+ 'me.GetEvents': ['event-id', 'select'],
43
+ // The id says *which* event changed, which is what makes the log worth
44
+ // having; the subject, the location, and the attendees are the content of it.
45
+ 'me.CreateEvents': ['isAllDay', 'showAs'],
46
+ 'me.UpdateEvents': ['event-id', 'isAllDay', 'showAs'],
47
+ 'me.DeleteEvents': ['event-id'],
48
+ },
49
+ });
@@ -0,0 +1,50 @@
1
+ import { defineProvider } from '#connectivity';
2
+ import {
3
+ CALENDAR_SCOPES,
4
+ CONTACTS_SCOPES,
5
+ FILES_SCOPES,
6
+ GRAPH_BASE_URL,
7
+ MAIL_SCOPES,
8
+ MICROSOFT_APP,
9
+ MICROSOFT_AUTHORIZE_URL,
10
+ MICROSOFT_IDENTITY,
11
+ MICROSOFT_TOKEN_URL,
12
+ TODO_SCOPES,
13
+ specPath,
14
+ } from '../shared/oauth.ts';
15
+ import { microsoftSetup } from '../shared/setup.ts';
16
+
17
+ /**
18
+ * Read-only, deliberately, and the same call as Google's contacts provider.
19
+ *
20
+ * Graph would allow writes and the vendored spec could carry them. What an
21
+ * address book is for here is making "email Bob" resolve, and `Contacts.Read`
22
+ * is a materially smaller grant than `Contacts.ReadWrite` for a surface nobody
23
+ * has asked to write.
24
+ */
25
+ export const outlookContacts = defineProvider({
26
+ id: 'outlook_contacts',
27
+ name: 'Outlook Contacts',
28
+ description: 'Look up an address in Outlook contacts, so "email Bob" resolves. Read-only.',
29
+ connector: { kind: 'http', base_url: GRAPH_BASE_URL, openapi: specPath('outlook-contacts.v1.json') },
30
+ auth: {
31
+ kind: 'oauth',
32
+ registration: 'manual',
33
+ app: MICROSOFT_APP,
34
+ // Declared rather than discovered. An `http` connector has no metadata
35
+ // document to read — a REST API does not announce where its authorization
36
+ // server lives — so the two endpoints are part of the manifest.
37
+ authorize_url: MICROSOFT_AUTHORIZE_URL,
38
+ token_url: MICROSOFT_TOKEN_URL,
39
+ scopes: CONTACTS_SCOPES,
40
+ revoke_url: 'https://account.live.com/consent/Manage',
41
+ },
42
+ identity: MICROSOFT_IDENTITY,
43
+ setup: microsoftSetup('Outlook Contacts', CONTACTS_SCOPES),
44
+ redact: {
45
+ // Not `search`: a name is content.
46
+ 'me.ListContacts': ['top', 'orderby', 'select'],
47
+ 'me.GetContacts': ['contact-id', 'select'],
48
+ 'me.ListContactFolders': ['top', 'orderby', 'select'],
49
+ },
50
+ });
@@ -0,0 +1,62 @@
1
+ import { defineProvider } from '#connectivity';
2
+ import {
3
+ CALENDAR_SCOPES,
4
+ CONTACTS_SCOPES,
5
+ FILES_SCOPES,
6
+ GRAPH_BASE_URL,
7
+ MAIL_SCOPES,
8
+ MICROSOFT_APP,
9
+ MICROSOFT_AUTHORIZE_URL,
10
+ MICROSOFT_IDENTITY,
11
+ MICROSOFT_TOKEN_URL,
12
+ TODO_SCOPES,
13
+ specPath,
14
+ } from '../shared/oauth.ts';
15
+ import { microsoftSetup } from '../shared/setup.ts';
16
+
17
+ /**
18
+ * OneDrive, through Graph — a drive reached over HTTPS rather than a folder on
19
+ * this machine.
20
+ *
21
+ * The counterpart to `icloud_drive` and the opposite shape: Apple publishes no
22
+ * protocol, so iCloud Drive is the synced folder on a Mac and nothing else;
23
+ * Microsoft publishes an API, so this works from a deployed endpoint that has no
24
+ * filesystem of the operator's at all.
25
+ *
26
+ * Every item operation names a drive, which `me.GetDrive` reports. That is one
27
+ * extra call before the first read and it is Graph's shape rather than a choice
28
+ * here — the `/me/drive/...` shorthand exists but is not in the published
29
+ * OpenAPI as addressable operations.
30
+ */
31
+ export const onedrive = defineProvider({
32
+ id: 'onedrive',
33
+ name: 'OneDrive',
34
+ description: 'Browse, search, read, and organise files in OneDrive, via Microsoft Graph.',
35
+ connector: { kind: 'http', base_url: GRAPH_BASE_URL, openapi: specPath('onedrive.v1.json') },
36
+ auth: {
37
+ kind: 'oauth',
38
+ registration: 'manual',
39
+ app: MICROSOFT_APP,
40
+ // Declared rather than discovered. An `http` connector has no metadata
41
+ // document to read — a REST API does not announce where its authorization
42
+ // server lives — so the two endpoints are part of the manifest.
43
+ authorize_url: MICROSOFT_AUTHORIZE_URL,
44
+ token_url: MICROSOFT_TOKEN_URL,
45
+ scopes: FILES_SCOPES,
46
+ revoke_url: 'https://account.live.com/consent/Manage',
47
+ },
48
+ identity: MICROSOFT_IDENTITY,
49
+ setup: microsoftSetup('OneDrive', FILES_SCOPES),
50
+ redact: {
51
+ 'me.GetDrive': ['select'],
52
+ 'drives.GetRoot': ['drive-id', 'select'],
53
+ 'drives.GetItems': ['drive-id', 'driveItem-id', 'select'],
54
+ 'drives.items.ListChildren': ['drive-id', 'driveItem-id', 'top', 'orderby', 'select'],
55
+ 'drives.GetItemsContent': ['drive-id', 'driveItem-id'],
56
+ // Where a file was created, never what it is called — a filename is content,
57
+ // and "Divorce settlement draft.docx" is the whole document.
58
+ 'drives.items.CreateChildren': ['drive-id', 'driveItem-id'],
59
+ // Not `q` or `search`: what someone searched their own drive for is content.
60
+ 'drives.drive.items.driveItem.search': ['drive-id', 'driveItem-id', 'top', 'orderby', 'select'],
61
+ },
62
+ });
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Microsoft's five providers, sharing one Entra app registration.
3
+ *
4
+ * One API behind all of them, so unlike Google there is one client and one
5
+ * consent screen shape — but the tokens still land per provider, so connecting
6
+ * Outlook mail does not grant OneDrive.
7
+ */
8
+ export { microsoftTodo } from './todo/index.ts';
9
+ export { onedrive } from './drive/index.ts';
10
+ export { outlookCalendar } from './calendar/index.ts';
11
+ export { outlookContacts } from './contacts/index.ts';
12
+ export { outlookMail } from './mail/index.ts';