@wolpertingerlabs/drawlatch 1.0.0-alpha.2 → 1.0.0-alpha.29

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 (119) hide show
  1. package/CONNECTIONS.md +3 -0
  2. package/README.md +395 -465
  3. package/bin/drawlatch.js +1018 -49
  4. package/dist/auth/auth.d.ts +10 -0
  5. package/dist/auth/auth.js +146 -0
  6. package/dist/auth/env-writer.d.ts +6 -0
  7. package/dist/auth/env-writer.js +52 -0
  8. package/dist/auth/password.d.ts +8 -0
  9. package/dist/auth/password.js +28 -0
  10. package/dist/auth/sessions.d.ts +13 -0
  11. package/dist/auth/sessions.js +85 -0
  12. package/dist/cli/generate-keys.d.ts +4 -4
  13. package/dist/cli/generate-keys.js +30 -25
  14. package/dist/connections/{anthropic.json → ai/anthropic.json} +19 -1
  15. package/dist/connections/{devin.json → ai/devin.json} +7 -1
  16. package/dist/connections/{google-ai.json → ai/google-ai.json} +7 -1
  17. package/dist/connections/{openai.json → ai/openai.json} +7 -1
  18. package/dist/connections/{openrouter.json → ai/openrouter.json} +7 -1
  19. package/dist/connections/developer-tools/github.json +138 -0
  20. package/dist/connections/{hex.json → developer-tools/hex.json} +7 -1
  21. package/dist/connections/developer-tools/linear.json +75 -0
  22. package/dist/connections/{lichess.json → gaming/lichess.json} +7 -1
  23. package/dist/connections/messaging/agentmail.json +21 -0
  24. package/dist/connections/messaging/discord-bot.json +114 -0
  25. package/dist/connections/{discord-oauth.json → messaging/discord-oauth.json} +7 -1
  26. package/dist/connections/messaging/slack.json +75 -0
  27. package/dist/connections/messaging/telegram.json +66 -0
  28. package/dist/connections/{google.json → productivity/google.json} +7 -1
  29. package/dist/connections/productivity/notion.json +75 -0
  30. package/dist/connections/productivity/stripe.json +74 -0
  31. package/dist/connections/productivity/trello.json +113 -0
  32. package/dist/connections/{bluesky.json → social-media/bluesky.json} +41 -0
  33. package/dist/connections/social-media/mastodon.json +65 -0
  34. package/dist/connections/social-media/reddit.json +80 -0
  35. package/dist/connections/{twitch.json → social-media/twitch.json} +40 -0
  36. package/dist/connections/social-media/x.json +67 -0
  37. package/dist/mcp/server.js +544 -31
  38. package/dist/remote/admin-mutations.d.ts +37 -0
  39. package/dist/remote/admin-mutations.js +251 -0
  40. package/dist/remote/admin-types.d.ts +149 -0
  41. package/dist/remote/admin-types.js +11 -0
  42. package/dist/remote/admin.d.ts +37 -0
  43. package/dist/remote/admin.js +316 -0
  44. package/dist/remote/caller-bootstrap.d.ts +71 -0
  45. package/dist/remote/caller-bootstrap.js +141 -0
  46. package/dist/remote/ingestors/base-ingestor.d.ts +19 -3
  47. package/dist/remote/ingestors/base-ingestor.js +27 -6
  48. package/dist/remote/ingestors/discord/discord-gateway.d.ts +2 -2
  49. package/dist/remote/ingestors/discord/discord-gateway.js +29 -6
  50. package/dist/remote/ingestors/e2e/setup.d.ts +69 -0
  51. package/dist/remote/ingestors/e2e/setup.js +147 -0
  52. package/dist/remote/ingestors/manager.d.ts +110 -10
  53. package/dist/remote/ingestors/manager.js +449 -42
  54. package/dist/remote/ingestors/poll/poll-ingestor.d.ts +4 -2
  55. package/dist/remote/ingestors/poll/poll-ingestor.js +26 -5
  56. package/dist/remote/ingestors/registry.d.ts +2 -2
  57. package/dist/remote/ingestors/registry.js +2 -2
  58. package/dist/remote/ingestors/slack/socket-mode.d.ts +2 -2
  59. package/dist/remote/ingestors/slack/socket-mode.js +28 -6
  60. package/dist/remote/ingestors/types.d.ts +25 -0
  61. package/dist/remote/ingestors/webhook/base-webhook-ingestor.d.ts +46 -7
  62. package/dist/remote/ingestors/webhook/base-webhook-ingestor.js +115 -10
  63. package/dist/remote/ingestors/webhook/github-webhook-ingestor.d.ts +30 -0
  64. package/dist/remote/ingestors/webhook/github-webhook-ingestor.js +73 -2
  65. package/dist/remote/ingestors/webhook/lifecycle-types.d.ts +63 -0
  66. package/dist/remote/ingestors/webhook/lifecycle-types.js +12 -0
  67. package/dist/remote/ingestors/webhook/stripe-webhook-ingestor.js +2 -2
  68. package/dist/remote/ingestors/webhook/trello-webhook-ingestor.d.ts +17 -5
  69. package/dist/remote/ingestors/webhook/trello-webhook-ingestor.js +32 -26
  70. package/dist/remote/ingestors/webhook/webhook-lifecycle-manager.d.ts +46 -0
  71. package/dist/remote/ingestors/webhook/webhook-lifecycle-manager.js +261 -0
  72. package/dist/remote/server.d.ts +25 -33
  73. package/dist/remote/server.js +681 -195
  74. package/dist/remote/tool-dispatch.d.ts +84 -0
  75. package/dist/remote/tool-dispatch.js +910 -0
  76. package/dist/remote/triggers/rule-engine.d.ts +40 -0
  77. package/dist/remote/triggers/rule-engine.js +228 -0
  78. package/dist/remote/triggers/types.d.ts +69 -0
  79. package/dist/remote/triggers/types.js +10 -0
  80. package/dist/remote/tunnel-state.d.ts +14 -0
  81. package/dist/remote/tunnel-state.js +20 -0
  82. package/dist/remote/tunnel.d.ts +53 -0
  83. package/dist/remote/tunnel.js +149 -0
  84. package/dist/shared/config.d.ts +97 -25
  85. package/dist/shared/config.js +48 -35
  86. package/dist/shared/connections.d.ts +21 -5
  87. package/dist/shared/connections.js +56 -14
  88. package/dist/shared/crypto/index.d.ts +1 -0
  89. package/dist/shared/crypto/index.js +1 -0
  90. package/dist/shared/crypto/key-manager.d.ts +67 -0
  91. package/dist/shared/crypto/key-manager.js +152 -0
  92. package/dist/shared/env-utils.d.ts +42 -0
  93. package/dist/shared/env-utils.js +150 -0
  94. package/dist/shared/listener-config.d.ts +157 -0
  95. package/dist/shared/listener-config.js +10 -0
  96. package/dist/shared/migrations.d.ts +40 -0
  97. package/dist/shared/migrations.js +122 -0
  98. package/dist/shared/protocol/handshake.js +14 -1
  99. package/dist/shared/protocol/index.d.ts +2 -0
  100. package/dist/shared/protocol/index.js +2 -0
  101. package/dist/shared/protocol/sync-client.d.ts +52 -0
  102. package/dist/shared/protocol/sync-client.js +99 -0
  103. package/dist/shared/protocol/sync.d.ts +71 -0
  104. package/dist/shared/protocol/sync.js +176 -0
  105. package/frontend/dist/assets/index-D4k5QKBP.css +1 -0
  106. package/frontend/dist/assets/index-IzwnSOmu.js +267 -0
  107. package/frontend/dist/index.html +15 -0
  108. package/package.json +66 -13
  109. package/dist/connections/discord-bot.json +0 -24
  110. package/dist/connections/github.json +0 -25
  111. package/dist/connections/linear.json +0 -29
  112. package/dist/connections/mastodon.json +0 -25
  113. package/dist/connections/notion.json +0 -33
  114. package/dist/connections/reddit.json +0 -28
  115. package/dist/connections/slack.json +0 -23
  116. package/dist/connections/stripe.json +0 -25
  117. package/dist/connections/telegram.json +0 -26
  118. package/dist/connections/trello.json +0 -25
  119. package/dist/connections/x.json +0 -27
@@ -0,0 +1,74 @@
1
+ {
2
+ "name": "Stripe API",
3
+ "stability": "beta",
4
+ "category": "productivity",
5
+ "description": "Stripe payments API — customers, charges, payment intents, subscriptions, invoices, and more. Auth is handled automatically via the STRIPE_SECRET_KEY environment variable. Includes a webhook ingestor for real-time events (payment_intent.succeeded, invoice.paid, etc.) — set STRIPE_WEBHOOK_SECRET and use poll_events to retrieve them. Note: Stripe uses application/x-www-form-urlencoded for request bodies, not JSON.",
6
+ "docsUrl": "https://docs.stripe.com/api",
7
+ "openApiUrl": "https://raw.githubusercontent.com/stripe/openapi/master/openapi/spec3.json",
8
+ "headers": {
9
+ "Authorization": "Bearer ${STRIPE_SECRET_KEY}"
10
+ },
11
+ "secrets": {
12
+ "STRIPE_SECRET_KEY": "${STRIPE_SECRET_KEY}",
13
+ "STRIPE_WEBHOOK_SECRET": "${STRIPE_WEBHOOK_SECRET}"
14
+ },
15
+ "allowedEndpoints": [
16
+ "https://api.stripe.com/**"
17
+ ],
18
+ "ingestor": {
19
+ "type": "webhook",
20
+ "webhook": {
21
+ "path": "stripe",
22
+ "protocol": "stripe",
23
+ "signatureHeader": "Stripe-Signature",
24
+ "signatureSecret": "STRIPE_WEBHOOK_SECRET"
25
+ }
26
+ },
27
+ "testIngestor": {
28
+ "description": "Verifies that the Stripe webhook secret is configured",
29
+ "strategy": "webhook_verify",
30
+ "requireSecrets": ["STRIPE_WEBHOOK_SECRET"]
31
+ },
32
+ "listenerConfig": {
33
+ "name": "Stripe Webhook Listener",
34
+ "description": "Receives real-time events from Stripe via webhooks.",
35
+ "fields": [
36
+ {
37
+ "key": "eventFilter",
38
+ "label": "Event Types",
39
+ "description": "Which Stripe event types to capture. Leave empty for all.",
40
+ "type": "multiselect",
41
+ "default": [],
42
+ "options": [
43
+ {"value": "payment_intent.succeeded", "label": "Payment Succeeded"},
44
+ {"value": "payment_intent.payment_failed", "label": "Payment Failed"},
45
+ {"value": "charge.succeeded", "label": "Charge Succeeded"},
46
+ {"value": "charge.refunded", "label": "Charge Refunded"},
47
+ {"value": "invoice.paid", "label": "Invoice Paid"},
48
+ {"value": "invoice.payment_failed", "label": "Invoice Payment Failed"},
49
+ {"value": "customer.created", "label": "Customer Created"},
50
+ {"value": "customer.updated", "label": "Customer Updated"},
51
+ {"value": "subscription.created", "label": "Subscription Created"},
52
+ {"value": "subscription.updated", "label": "Subscription Updated"},
53
+ {"value": "subscription.deleted", "label": "Subscription Deleted"},
54
+ {"value": "checkout.session.completed", "label": "Checkout Completed"}
55
+ ],
56
+ "group": "Filtering"
57
+ },
58
+ {
59
+ "key": "bufferSize",
60
+ "label": "Buffer Size",
61
+ "description": "Maximum number of events to keep in memory.",
62
+ "type": "number",
63
+ "default": 200,
64
+ "min": 10,
65
+ "max": 1000,
66
+ "group": "Advanced"
67
+ }
68
+ ]
69
+ },
70
+ "testConnection": {
71
+ "url": "https://api.stripe.com/v1/balance",
72
+ "description": "Fetches the account balance (read-only)"
73
+ }
74
+ }
@@ -0,0 +1,113 @@
1
+ {
2
+ "name": "Trello API",
3
+ "stability": "stable",
4
+ "category": "productivity",
5
+ "description": "Trello boards, lists, and cards API. Authentication uses query parameters — include ?key=${TRELLO_API_KEY}&token=${TRELLO_TOKEN} in your request URLs. The placeholders are resolved automatically from the route's secrets. Includes a webhook ingestor for real-time events (card updates, list changes, board activity, etc.) — set TRELLO_API_SECRET and TRELLO_CALLBACK_URL, then use poll_events to retrieve them.",
6
+ "docsUrl": "https://developer.atlassian.com/cloud/trello/rest/",
7
+ "headers": {},
8
+ "secrets": {
9
+ "TRELLO_API_KEY": "${TRELLO_API_KEY}",
10
+ "TRELLO_TOKEN": "${TRELLO_TOKEN}",
11
+ "TRELLO_API_SECRET": "${TRELLO_API_SECRET}",
12
+ "TRELLO_CALLBACK_URL": "${TRELLO_CALLBACK_URL}"
13
+ },
14
+ "allowedEndpoints": [
15
+ "https://api.trello.com/**"
16
+ ],
17
+ "ingestor": {
18
+ "type": "webhook",
19
+ "webhook": {
20
+ "path": "trello",
21
+ "protocol": "trello",
22
+ "signatureHeader": "X-Trello-Webhook",
23
+ "signatureSecret": "TRELLO_API_SECRET",
24
+ "callbackUrl": "${TRELLO_CALLBACK_URL}",
25
+ "lifecycle": {
26
+ "list": {
27
+ "method": "GET",
28
+ "url": "https://api.trello.com/1/tokens/${TRELLO_TOKEN}/webhooks?key=${TRELLO_API_KEY}",
29
+ "callbackUrlField": "callbackURL",
30
+ "idField": "id",
31
+ "modelIdField": "idModel"
32
+ },
33
+ "register": {
34
+ "method": "POST",
35
+ "url": "https://api.trello.com/1/tokens/${TRELLO_TOKEN}/webhooks?key=${TRELLO_API_KEY}",
36
+ "headers": { "Content-Type": "application/json" },
37
+ "body": {
38
+ "callbackURL": "${TRELLO_CALLBACK_URL}",
39
+ "idModel": "${boardId}",
40
+ "description": "Drawlatch webhook"
41
+ },
42
+ "idField": "id"
43
+ },
44
+ "unregister": {
45
+ "method": "DELETE",
46
+ "url": "https://api.trello.com/1/tokens/${TRELLO_TOKEN}/webhooks/${_webhookId}?key=${TRELLO_API_KEY}"
47
+ }
48
+ }
49
+ }
50
+ },
51
+ "testIngestor": {
52
+ "description": "Lists existing Trello webhooks to verify credentials",
53
+ "strategy": "http_request",
54
+ "request": {
55
+ "url": "https://api.trello.com/1/tokens/${TRELLO_TOKEN}/webhooks?key=${TRELLO_API_KEY}",
56
+ "expectedStatus": [200]
57
+ }
58
+ },
59
+ "listenerConfig": {
60
+ "name": "Trello Webhook Listener",
61
+ "description": "Receives real-time events from Trello boards via webhooks. Supports multiple concurrent instances to watch different boards simultaneously.",
62
+ "supportsMultiInstance": true,
63
+ "fields": [
64
+ {
65
+ "key": "boardId",
66
+ "label": "Board ID",
67
+ "description": "The Trello board to watch. Required for webhook registration.",
68
+ "type": "text",
69
+ "required": true,
70
+ "instanceKey": true,
71
+ "placeholder": "e.g., 5a1b2c3d4e5f6g7h8i9j0k",
72
+ "dynamicOptions": {
73
+ "url": "https://api.trello.com/1/members/me/boards?fields=name,id&key=${TRELLO_API_KEY}&token=${TRELLO_TOKEN}",
74
+ "labelField": "name",
75
+ "valueField": "id"
76
+ },
77
+ "group": "Connection"
78
+ },
79
+ {
80
+ "key": "eventFilter",
81
+ "label": "Event Types",
82
+ "description": "Which Trello action types to capture. Leave empty for all.",
83
+ "type": "multiselect",
84
+ "default": [],
85
+ "options": [
86
+ {"value": "createCard", "label": "Card Created"},
87
+ {"value": "updateCard", "label": "Card Updated"},
88
+ {"value": "deleteCard", "label": "Card Deleted"},
89
+ {"value": "addMemberToCard", "label": "Member Added to Card"},
90
+ {"value": "commentCard", "label": "Comment on Card"},
91
+ {"value": "createList", "label": "List Created"},
92
+ {"value": "updateList", "label": "List Updated"},
93
+ {"value": "moveCardToBoard", "label": "Card Moved to Board"}
94
+ ],
95
+ "group": "Filtering"
96
+ },
97
+ {
98
+ "key": "bufferSize",
99
+ "label": "Buffer Size",
100
+ "description": "Maximum number of events to keep in memory.",
101
+ "type": "number",
102
+ "default": 200,
103
+ "min": 10,
104
+ "max": 1000,
105
+ "group": "Advanced"
106
+ }
107
+ ]
108
+ },
109
+ "testConnection": {
110
+ "url": "https://api.trello.com/1/members/me?key=${TRELLO_API_KEY}&token=${TRELLO_TOKEN}",
111
+ "description": "Fetches the authenticated Trello member"
112
+ }
113
+ }
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "Bluesky API (AT Protocol)",
3
+ "stability": "beta",
4
+ "category": "social-media",
3
5
  "description": "Bluesky API via the AT Protocol — posts, feeds, profiles, notifications, social graph, and more. Auth is handled automatically via the BLUESKY_ACCESS_TOKEN environment variable (JWT Bearer token). Obtain a token by POSTing to com.atproto.server.createSession with your handle and an App Password. Tokens expire after ~2 hours — rotate externally using the refresh token. Both bsky.social (authenticated PDS) and public.api.bsky.app (public read-only API) are allowlisted. For self-hosted PDS instances, override with a custom connector. Includes a poll ingestor that fetches notifications — use poll_events to retrieve them.",
4
6
  "docsUrl": "https://docs.bsky.app/",
5
7
  "headers": {
@@ -22,5 +24,44 @@
22
24
  "deduplicateBy": "uri",
23
25
  "eventType": "notification"
24
26
  }
27
+ },
28
+ "testIngestor": {
29
+ "description": "Fetches notifications to verify Bluesky access token",
30
+ "strategy": "poll_once",
31
+ "request": {
32
+ "url": "https://bsky.social/xrpc/app.bsky.notification.listNotifications?limit=1",
33
+ "expectedStatus": [200]
34
+ }
35
+ },
36
+ "listenerConfig": {
37
+ "name": "Bluesky Poll Listener",
38
+ "description": "Polls Bluesky notifications at a configurable interval.",
39
+ "fields": [
40
+ {
41
+ "key": "intervalMs",
42
+ "label": "Poll Interval (ms)",
43
+ "description": "How often to check for new notifications, in milliseconds.",
44
+ "type": "number",
45
+ "default": 60000,
46
+ "min": 10000,
47
+ "max": 3600000,
48
+ "group": "Connection"
49
+ },
50
+ {
51
+ "key": "bufferSize",
52
+ "label": "Buffer Size",
53
+ "description": "Maximum number of events to keep in memory.",
54
+ "type": "number",
55
+ "default": 200,
56
+ "min": 10,
57
+ "max": 1000,
58
+ "group": "Advanced"
59
+ }
60
+ ]
61
+ },
62
+ "testConnection": {
63
+ "url": "https://bsky.social/xrpc/app.bsky.actor.getProfile?actor=did:self",
64
+ "description": "Fetches the authenticated user's profile",
65
+ "expectedStatus": [200, 400]
25
66
  }
26
67
  }
@@ -0,0 +1,65 @@
1
+ {
2
+ "name": "Mastodon API",
3
+ "stability": "beta",
4
+ "category": "social-media",
5
+ "description": "Mastodon API — statuses (toots), timelines, notifications, accounts, search, and more. Auth is handled automatically via the MASTODON_ACCESS_TOKEN environment variable (OAuth2 Bearer token from your instance's Development settings). This template targets mastodon.social — for other instances, override with a custom connector using the same auth pattern but different allowedEndpoints. Includes a poll ingestor that fetches the home timeline — use poll_events to retrieve them.",
6
+ "docsUrl": "https://docs.joinmastodon.org/api/",
7
+ "headers": {
8
+ "Authorization": "Bearer ${MASTODON_ACCESS_TOKEN}"
9
+ },
10
+ "secrets": {
11
+ "MASTODON_ACCESS_TOKEN": "${MASTODON_ACCESS_TOKEN}"
12
+ },
13
+ "allowedEndpoints": [
14
+ "https://mastodon.social/api/v1/**",
15
+ "https://mastodon.social/api/v2/**"
16
+ ],
17
+ "ingestor": {
18
+ "type": "poll",
19
+ "poll": {
20
+ "url": "https://mastodon.social/api/v1/timelines/home?limit=20",
21
+ "intervalMs": 60000,
22
+ "method": "GET",
23
+ "deduplicateBy": "id",
24
+ "eventType": "status"
25
+ }
26
+ },
27
+ "testIngestor": {
28
+ "description": "Verifies Mastodon credentials by checking account",
29
+ "strategy": "poll_once",
30
+ "request": {
31
+ "url": "https://mastodon.social/api/v1/accounts/verify_credentials",
32
+ "expectedStatus": [200]
33
+ }
34
+ },
35
+ "listenerConfig": {
36
+ "name": "Mastodon Poll Listener",
37
+ "description": "Polls the Mastodon home timeline at a configurable interval.",
38
+ "fields": [
39
+ {
40
+ "key": "intervalMs",
41
+ "label": "Poll Interval (ms)",
42
+ "description": "How often to check for new statuses, in milliseconds.",
43
+ "type": "number",
44
+ "default": 60000,
45
+ "min": 10000,
46
+ "max": 3600000,
47
+ "group": "Connection"
48
+ },
49
+ {
50
+ "key": "bufferSize",
51
+ "label": "Buffer Size",
52
+ "description": "Maximum number of events to keep in memory.",
53
+ "type": "number",
54
+ "default": 200,
55
+ "min": 10,
56
+ "max": 1000,
57
+ "group": "Advanced"
58
+ }
59
+ ]
60
+ },
61
+ "testConnection": {
62
+ "url": "https://mastodon.social/api/v1/accounts/verify_credentials",
63
+ "description": "Verifies Mastodon account credentials"
64
+ }
65
+ }
@@ -0,0 +1,80 @@
1
+ {
2
+ "name": "Reddit API",
3
+ "stability": "beta",
4
+ "category": "social-media",
5
+ "description": "Reddit API — subreddits, posts, comments, users, search, and more. Auth is handled automatically via the REDDIT_ACCESS_TOKEN environment variable (OAuth2 Bearer token). A User-Agent header is required by Reddit and set via REDDIT_USER_AGENT. Obtain an OAuth2 token by registering a 'script' app at https://www.reddit.com/prefs/apps and using the client credentials grant. Tokens expire after 1 hour — rotate externally. Includes a poll ingestor that fetches new posts from a configurable subreddit — set REDDIT_SUBREDDIT and use poll_events to retrieve them.",
6
+ "docsUrl": "https://www.reddit.com/dev/api/",
7
+ "headers": {
8
+ "Authorization": "Bearer ${REDDIT_ACCESS_TOKEN}",
9
+ "User-Agent": "${REDDIT_USER_AGENT}"
10
+ },
11
+ "secrets": {
12
+ "REDDIT_ACCESS_TOKEN": "${REDDIT_ACCESS_TOKEN}",
13
+ "REDDIT_USER_AGENT": "${REDDIT_USER_AGENT}",
14
+ "REDDIT_SUBREDDIT": "${REDDIT_SUBREDDIT}"
15
+ },
16
+ "allowedEndpoints": [
17
+ "https://oauth.reddit.com/**"
18
+ ],
19
+ "ingestor": {
20
+ "type": "poll",
21
+ "poll": {
22
+ "url": "https://oauth.reddit.com/r/${REDDIT_SUBREDDIT}/new?limit=25",
23
+ "intervalMs": 60000,
24
+ "method": "GET",
25
+ "responsePath": "data.children",
26
+ "deduplicateBy": "data.name",
27
+ "eventType": "new_post"
28
+ }
29
+ },
30
+ "testIngestor": {
31
+ "description": "Fetches the authenticated user to verify Reddit API access",
32
+ "strategy": "poll_once",
33
+ "request": {
34
+ "url": "https://oauth.reddit.com/api/v1/me",
35
+ "expectedStatus": [200]
36
+ }
37
+ },
38
+ "listenerConfig": {
39
+ "name": "Reddit Poll Listener",
40
+ "description": "Polls a subreddit for new posts at a configurable interval. Supports multiple concurrent instances to watch different subreddits simultaneously.",
41
+ "supportsMultiInstance": true,
42
+ "fields": [
43
+ {
44
+ "key": "subreddit",
45
+ "label": "Subreddit",
46
+ "description": "The subreddit to watch for new posts (without the r/ prefix).",
47
+ "type": "text",
48
+ "required": true,
49
+ "instanceKey": true,
50
+ "overrideKey": "REDDIT_SUBREDDIT",
51
+ "placeholder": "e.g., rust",
52
+ "group": "Connection"
53
+ },
54
+ {
55
+ "key": "intervalMs",
56
+ "label": "Poll Interval (ms)",
57
+ "description": "How often to check for new posts, in milliseconds.",
58
+ "type": "number",
59
+ "default": 60000,
60
+ "min": 10000,
61
+ "max": 3600000,
62
+ "group": "Connection"
63
+ },
64
+ {
65
+ "key": "bufferSize",
66
+ "label": "Buffer Size",
67
+ "description": "Maximum number of events to keep in memory.",
68
+ "type": "number",
69
+ "default": 200,
70
+ "min": 10,
71
+ "max": 1000,
72
+ "group": "Advanced"
73
+ }
74
+ ]
75
+ },
76
+ "testConnection": {
77
+ "url": "https://oauth.reddit.com/api/v1/me",
78
+ "description": "Fetches the authenticated Reddit user"
79
+ }
80
+ }
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "Twitch API",
3
+ "stability": "beta",
4
+ "category": "social-media",
3
5
  "description": "Twitch Helix API — streams, users, channels, clips, videos, chat, and more. Auth requires both a Bearer token and Client-Id header, handled automatically via TWITCH_ACCESS_TOKEN and TWITCH_CLIENT_ID environment variables. Register an application at https://dev.twitch.tv/console/apps to obtain credentials. Includes a poll ingestor that fetches followed live streams — set TWITCH_USER_ID and use poll_events to retrieve them.",
4
6
  "docsUrl": "https://dev.twitch.tv/docs/api/reference/",
5
7
  "headers": {
@@ -24,5 +26,43 @@
24
26
  "deduplicateBy": "id",
25
27
  "eventType": "stream_online"
26
28
  }
29
+ },
30
+ "testIngestor": {
31
+ "description": "Fetches the authenticated Twitch user to verify API access",
32
+ "strategy": "poll_once",
33
+ "request": {
34
+ "url": "https://api.twitch.tv/helix/users",
35
+ "expectedStatus": [200]
36
+ }
37
+ },
38
+ "listenerConfig": {
39
+ "name": "Twitch Poll Listener",
40
+ "description": "Polls Twitch for followed live streams at a configurable interval.",
41
+ "fields": [
42
+ {
43
+ "key": "intervalMs",
44
+ "label": "Poll Interval (ms)",
45
+ "description": "How often to check for live streams, in milliseconds.",
46
+ "type": "number",
47
+ "default": 60000,
48
+ "min": 10000,
49
+ "max": 3600000,
50
+ "group": "Connection"
51
+ },
52
+ {
53
+ "key": "bufferSize",
54
+ "label": "Buffer Size",
55
+ "description": "Maximum number of events to keep in memory.",
56
+ "type": "number",
57
+ "default": 200,
58
+ "min": 10,
59
+ "max": 1000,
60
+ "group": "Advanced"
61
+ }
62
+ ]
63
+ },
64
+ "testConnection": {
65
+ "url": "https://api.twitch.tv/helix/users",
66
+ "description": "Fetches the authenticated Twitch user"
27
67
  }
28
68
  }
@@ -0,0 +1,67 @@
1
+ {
2
+ "name": "X (Twitter) API",
3
+ "stability": "beta",
4
+ "category": "social-media",
5
+ "description": "X (formerly Twitter) API v2 — tweets, users, spaces, lists, and more. Auth is handled automatically via the X_BEARER_TOKEN environment variable (App-only Bearer token from the X Developer Portal). Both api.x.com and api.twitter.com domains are allowlisted. Includes a poll ingestor that searches recent tweets matching a configurable query — set X_SEARCH_QUERY and use poll_events to retrieve them.",
6
+ "docsUrl": "https://developer.x.com/en/docs/x-api",
7
+ "headers": {
8
+ "Authorization": "Bearer ${X_BEARER_TOKEN}"
9
+ },
10
+ "secrets": {
11
+ "X_BEARER_TOKEN": "${X_BEARER_TOKEN}",
12
+ "X_SEARCH_QUERY": "${X_SEARCH_QUERY}"
13
+ },
14
+ "allowedEndpoints": [
15
+ "https://api.x.com/**",
16
+ "https://api.twitter.com/**"
17
+ ],
18
+ "ingestor": {
19
+ "type": "poll",
20
+ "poll": {
21
+ "url": "https://api.x.com/2/tweets/search/recent?query=${X_SEARCH_QUERY}&max_results=25&tweet.fields=created_at,author_id,public_metrics",
22
+ "intervalMs": 60000,
23
+ "method": "GET",
24
+ "responsePath": "data",
25
+ "deduplicateBy": "id",
26
+ "eventType": "tweet"
27
+ }
28
+ },
29
+ "testIngestor": {
30
+ "description": "Fetches the authenticated user to verify X API access",
31
+ "strategy": "poll_once",
32
+ "request": {
33
+ "url": "https://api.x.com/2/users/me",
34
+ "expectedStatus": [200]
35
+ }
36
+ },
37
+ "listenerConfig": {
38
+ "name": "X (Twitter) Poll Listener",
39
+ "description": "Polls X for recent tweets matching a search query at a configurable interval.",
40
+ "fields": [
41
+ {
42
+ "key": "intervalMs",
43
+ "label": "Poll Interval (ms)",
44
+ "description": "How often to check for new tweets, in milliseconds.",
45
+ "type": "number",
46
+ "default": 60000,
47
+ "min": 10000,
48
+ "max": 3600000,
49
+ "group": "Connection"
50
+ },
51
+ {
52
+ "key": "bufferSize",
53
+ "label": "Buffer Size",
54
+ "description": "Maximum number of events to keep in memory.",
55
+ "type": "number",
56
+ "default": 200,
57
+ "min": 10,
58
+ "max": 1000,
59
+ "group": "Advanced"
60
+ }
61
+ ]
62
+ },
63
+ "testConnection": {
64
+ "url": "https://api.x.com/2/users/me",
65
+ "description": "Fetches the authenticated X/Twitter user"
66
+ }
67
+ }