loudmouth-ai 0.1.0 → 0.2.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.
- package/README.md +148 -77
- package/dist/build-info.json +3 -3
- package/extensions/package.json +6 -0
- package/package.json +1 -1
- package/skills/autopilot/SKILL.md +179 -0
- package/skills/goals/SKILL.md +189 -0
- package/skills/wordpress/SKILL.md +232 -0
- package/extensions/bluebubbles/clawdbot.plugin.json +0 -11
- package/extensions/bluebubbles/index.ts +0 -20
- package/extensions/bluebubbles/package.json +0 -33
- package/extensions/bluebubbles/src/accounts.ts +0 -80
- package/extensions/bluebubbles/src/actions.test.ts +0 -651
- package/extensions/bluebubbles/src/actions.ts +0 -403
- package/extensions/bluebubbles/src/attachments.test.ts +0 -346
- package/extensions/bluebubbles/src/attachments.ts +0 -282
- package/extensions/bluebubbles/src/channel.ts +0 -399
- package/extensions/bluebubbles/src/chat.test.ts +0 -462
- package/extensions/bluebubbles/src/chat.ts +0 -354
- package/extensions/bluebubbles/src/config-schema.ts +0 -51
- package/extensions/bluebubbles/src/media-send.ts +0 -168
- package/extensions/bluebubbles/src/monitor.test.ts +0 -2140
- package/extensions/bluebubbles/src/monitor.ts +0 -2101
- package/extensions/bluebubbles/src/onboarding.ts +0 -340
- package/extensions/bluebubbles/src/probe.ts +0 -127
- package/extensions/bluebubbles/src/reactions.test.ts +0 -393
- package/extensions/bluebubbles/src/reactions.ts +0 -183
- package/extensions/bluebubbles/src/runtime.ts +0 -14
- package/extensions/bluebubbles/src/send.test.ts +0 -809
- package/extensions/bluebubbles/src/send.ts +0 -418
- package/extensions/bluebubbles/src/targets.test.ts +0 -184
- package/extensions/bluebubbles/src/targets.ts +0 -323
- package/extensions/bluebubbles/src/types.ts +0 -127
- package/extensions/copilot-proxy/README.md +0 -24
- package/extensions/copilot-proxy/clawdbot.plugin.json +0 -11
- package/extensions/copilot-proxy/index.ts +0 -142
- package/extensions/copilot-proxy/package.json +0 -11
- package/extensions/google-antigravity-auth/README.md +0 -24
- package/extensions/google-antigravity-auth/clawdbot.plugin.json +0 -11
- package/extensions/google-antigravity-auth/index.ts +0 -437
- package/extensions/google-antigravity-auth/package.json +0 -11
- package/extensions/google-gemini-cli-auth/README.md +0 -35
- package/extensions/google-gemini-cli-auth/clawdbot.plugin.json +0 -11
- package/extensions/google-gemini-cli-auth/index.ts +0 -91
- package/extensions/google-gemini-cli-auth/oauth.test.ts +0 -228
- package/extensions/google-gemini-cli-auth/oauth.ts +0 -580
- package/extensions/google-gemini-cli-auth/package.json +0 -11
- package/extensions/googlechat/clawdbot.plugin.json +0 -11
- package/extensions/googlechat/index.ts +0 -20
- package/extensions/googlechat/package.json +0 -39
- package/extensions/googlechat/src/accounts.ts +0 -133
- package/extensions/googlechat/src/actions.ts +0 -162
- package/extensions/googlechat/src/api.test.ts +0 -62
- package/extensions/googlechat/src/api.ts +0 -259
- package/extensions/googlechat/src/auth.ts +0 -113
- package/extensions/googlechat/src/channel.ts +0 -580
- package/extensions/googlechat/src/monitor.test.ts +0 -27
- package/extensions/googlechat/src/monitor.ts +0 -900
- package/extensions/googlechat/src/onboarding.ts +0 -278
- package/extensions/googlechat/src/runtime.ts +0 -14
- package/extensions/googlechat/src/targets.test.ts +0 -35
- package/extensions/googlechat/src/targets.ts +0 -55
- package/extensions/googlechat/src/types.config.ts +0 -3
- package/extensions/googlechat/src/types.ts +0 -73
- package/extensions/imessage/clawdbot.plugin.json +0 -11
- package/extensions/imessage/index.ts +0 -18
- package/extensions/imessage/package.json +0 -11
- package/extensions/imessage/src/channel.ts +0 -294
- package/extensions/imessage/src/runtime.ts +0 -14
- package/extensions/line/clawdbot.plugin.json +0 -11
- package/extensions/line/index.ts +0 -20
- package/extensions/line/package.json +0 -29
- package/extensions/line/src/card-command.ts +0 -338
- package/extensions/line/src/channel.logout.test.ts +0 -96
- package/extensions/line/src/channel.sendPayload.test.ts +0 -308
- package/extensions/line/src/channel.ts +0 -773
- package/extensions/line/src/runtime.ts +0 -14
- package/extensions/matrix/CHANGELOG.md +0 -54
- package/extensions/matrix/clawdbot.plugin.json +0 -11
- package/extensions/matrix/index.ts +0 -18
- package/extensions/matrix/package.json +0 -36
- package/extensions/matrix/src/actions.ts +0 -185
- package/extensions/matrix/src/channel.directory.test.ts +0 -56
- package/extensions/matrix/src/channel.ts +0 -417
- package/extensions/matrix/src/config-schema.ts +0 -62
- package/extensions/matrix/src/directory-live.ts +0 -175
- package/extensions/matrix/src/group-mentions.ts +0 -61
- package/extensions/matrix/src/matrix/accounts.test.ts +0 -83
- package/extensions/matrix/src/matrix/accounts.ts +0 -63
- package/extensions/matrix/src/matrix/actions/client.ts +0 -53
- package/extensions/matrix/src/matrix/actions/messages.ts +0 -120
- package/extensions/matrix/src/matrix/actions/pins.ts +0 -70
- package/extensions/matrix/src/matrix/actions/reactions.ts +0 -84
- package/extensions/matrix/src/matrix/actions/room.ts +0 -88
- package/extensions/matrix/src/matrix/actions/summary.ts +0 -77
- package/extensions/matrix/src/matrix/actions/types.ts +0 -84
- package/extensions/matrix/src/matrix/actions.ts +0 -15
- package/extensions/matrix/src/matrix/active-client.ts +0 -11
- package/extensions/matrix/src/matrix/client/config.ts +0 -165
- package/extensions/matrix/src/matrix/client/create-client.ts +0 -127
- package/extensions/matrix/src/matrix/client/logging.ts +0 -35
- package/extensions/matrix/src/matrix/client/runtime.ts +0 -4
- package/extensions/matrix/src/matrix/client/shared.ts +0 -169
- package/extensions/matrix/src/matrix/client/storage.ts +0 -131
- package/extensions/matrix/src/matrix/client/types.ts +0 -34
- package/extensions/matrix/src/matrix/client.test.ts +0 -57
- package/extensions/matrix/src/matrix/client.ts +0 -9
- package/extensions/matrix/src/matrix/credentials.ts +0 -103
- package/extensions/matrix/src/matrix/deps.ts +0 -57
- package/extensions/matrix/src/matrix/format.test.ts +0 -34
- package/extensions/matrix/src/matrix/format.ts +0 -22
- package/extensions/matrix/src/matrix/index.ts +0 -11
- package/extensions/matrix/src/matrix/monitor/allowlist.ts +0 -58
- package/extensions/matrix/src/matrix/monitor/auto-join.ts +0 -68
- package/extensions/matrix/src/matrix/monitor/direct.ts +0 -105
- package/extensions/matrix/src/matrix/monitor/events.ts +0 -103
- package/extensions/matrix/src/matrix/monitor/handler.ts +0 -645
- package/extensions/matrix/src/matrix/monitor/index.ts +0 -279
- package/extensions/matrix/src/matrix/monitor/location.ts +0 -83
- package/extensions/matrix/src/matrix/monitor/media.test.ts +0 -103
- package/extensions/matrix/src/matrix/monitor/media.ts +0 -113
- package/extensions/matrix/src/matrix/monitor/mentions.ts +0 -31
- package/extensions/matrix/src/matrix/monitor/replies.ts +0 -96
- package/extensions/matrix/src/matrix/monitor/room-info.ts +0 -58
- package/extensions/matrix/src/matrix/monitor/rooms.ts +0 -43
- package/extensions/matrix/src/matrix/monitor/threads.ts +0 -64
- package/extensions/matrix/src/matrix/monitor/types.ts +0 -39
- package/extensions/matrix/src/matrix/poll-types.test.ts +0 -22
- package/extensions/matrix/src/matrix/poll-types.ts +0 -157
- package/extensions/matrix/src/matrix/probe.ts +0 -70
- package/extensions/matrix/src/matrix/send/client.ts +0 -63
- package/extensions/matrix/src/matrix/send/formatting.ts +0 -92
- package/extensions/matrix/src/matrix/send/media.ts +0 -220
- package/extensions/matrix/src/matrix/send/targets.test.ts +0 -102
- package/extensions/matrix/src/matrix/send/targets.ts +0 -144
- package/extensions/matrix/src/matrix/send/types.ts +0 -109
- package/extensions/matrix/src/matrix/send.test.ts +0 -172
- package/extensions/matrix/src/matrix/send.ts +0 -255
- package/extensions/matrix/src/onboarding.ts +0 -432
- package/extensions/matrix/src/outbound.ts +0 -53
- package/extensions/matrix/src/resolve-targets.ts +0 -89
- package/extensions/matrix/src/runtime.ts +0 -14
- package/extensions/matrix/src/tool-actions.ts +0 -160
- package/extensions/matrix/src/types.ts +0 -95
- package/extensions/mattermost/clawdbot.plugin.json +0 -11
- package/extensions/mattermost/index.ts +0 -18
- package/extensions/mattermost/package.json +0 -25
- package/extensions/mattermost/src/channel.test.ts +0 -43
- package/extensions/mattermost/src/channel.ts +0 -339
- package/extensions/mattermost/src/config-schema.ts +0 -56
- package/extensions/mattermost/src/group-mentions.ts +0 -14
- package/extensions/mattermost/src/mattermost/accounts.ts +0 -115
- package/extensions/mattermost/src/mattermost/client.ts +0 -208
- package/extensions/mattermost/src/mattermost/index.ts +0 -9
- package/extensions/mattermost/src/mattermost/monitor-helpers.ts +0 -150
- package/extensions/mattermost/src/mattermost/monitor.ts +0 -921
- package/extensions/mattermost/src/mattermost/probe.ts +0 -70
- package/extensions/mattermost/src/mattermost/send.ts +0 -217
- package/extensions/mattermost/src/normalize.ts +0 -38
- package/extensions/mattermost/src/onboarding-helpers.ts +0 -42
- package/extensions/mattermost/src/onboarding.ts +0 -187
- package/extensions/mattermost/src/runtime.ts +0 -14
- package/extensions/mattermost/src/types.ts +0 -50
- package/extensions/msteams/CHANGELOG.md +0 -51
- package/extensions/msteams/clawdbot.plugin.json +0 -11
- package/extensions/msteams/index.ts +0 -18
- package/extensions/msteams/package.json +0 -36
- package/extensions/msteams/src/attachments/download.ts +0 -206
- package/extensions/msteams/src/attachments/graph.ts +0 -319
- package/extensions/msteams/src/attachments/html.ts +0 -76
- package/extensions/msteams/src/attachments/payload.ts +0 -22
- package/extensions/msteams/src/attachments/shared.ts +0 -235
- package/extensions/msteams/src/attachments/types.ts +0 -37
- package/extensions/msteams/src/attachments.test.ts +0 -424
- package/extensions/msteams/src/attachments.ts +0 -18
- package/extensions/msteams/src/channel.directory.test.ts +0 -46
- package/extensions/msteams/src/channel.ts +0 -436
- package/extensions/msteams/src/conversation-store-fs.test.ts +0 -88
- package/extensions/msteams/src/conversation-store-fs.ts +0 -155
- package/extensions/msteams/src/conversation-store-memory.ts +0 -45
- package/extensions/msteams/src/conversation-store.ts +0 -41
- package/extensions/msteams/src/directory-live.ts +0 -179
- package/extensions/msteams/src/errors.test.ts +0 -46
- package/extensions/msteams/src/errors.ts +0 -158
- package/extensions/msteams/src/file-consent-helpers.test.ts +0 -234
- package/extensions/msteams/src/file-consent-helpers.ts +0 -73
- package/extensions/msteams/src/file-consent.ts +0 -122
- package/extensions/msteams/src/graph-chat.ts +0 -52
- package/extensions/msteams/src/graph-upload.ts +0 -445
- package/extensions/msteams/src/inbound.test.ts +0 -67
- package/extensions/msteams/src/inbound.ts +0 -38
- package/extensions/msteams/src/index.ts +0 -4
- package/extensions/msteams/src/media-helpers.test.ts +0 -186
- package/extensions/msteams/src/media-helpers.ts +0 -77
- package/extensions/msteams/src/messenger.test.ts +0 -245
- package/extensions/msteams/src/messenger.ts +0 -460
- package/extensions/msteams/src/monitor-handler/inbound-media.ts +0 -123
- package/extensions/msteams/src/monitor-handler/message-handler.ts +0 -629
- package/extensions/msteams/src/monitor-handler.ts +0 -166
- package/extensions/msteams/src/monitor-types.ts +0 -5
- package/extensions/msteams/src/monitor.ts +0 -290
- package/extensions/msteams/src/onboarding.ts +0 -432
- package/extensions/msteams/src/outbound.ts +0 -47
- package/extensions/msteams/src/pending-uploads.ts +0 -87
- package/extensions/msteams/src/policy.test.ts +0 -210
- package/extensions/msteams/src/policy.ts +0 -202
- package/extensions/msteams/src/polls-store-memory.ts +0 -30
- package/extensions/msteams/src/polls-store.test.ts +0 -40
- package/extensions/msteams/src/polls.test.ts +0 -72
- package/extensions/msteams/src/polls.ts +0 -299
- package/extensions/msteams/src/probe.test.ts +0 -57
- package/extensions/msteams/src/probe.ts +0 -99
- package/extensions/msteams/src/reply-dispatcher.ts +0 -128
- package/extensions/msteams/src/resolve-allowlist.ts +0 -277
- package/extensions/msteams/src/runtime.ts +0 -14
- package/extensions/msteams/src/sdk-types.ts +0 -19
- package/extensions/msteams/src/sdk.ts +0 -33
- package/extensions/msteams/src/send-context.ts +0 -156
- package/extensions/msteams/src/send.ts +0 -489
- package/extensions/msteams/src/sent-message-cache.test.ts +0 -16
- package/extensions/msteams/src/sent-message-cache.ts +0 -41
- package/extensions/msteams/src/storage.ts +0 -22
- package/extensions/msteams/src/store-fs.ts +0 -80
- package/extensions/msteams/src/token.ts +0 -19
- package/extensions/nextcloud-talk/clawdbot.plugin.json +0 -11
- package/extensions/nextcloud-talk/index.ts +0 -18
- package/extensions/nextcloud-talk/package.json +0 -30
- package/extensions/nextcloud-talk/src/accounts.ts +0 -154
- package/extensions/nextcloud-talk/src/channel.ts +0 -404
- package/extensions/nextcloud-talk/src/config-schema.ts +0 -78
- package/extensions/nextcloud-talk/src/format.ts +0 -79
- package/extensions/nextcloud-talk/src/inbound.ts +0 -336
- package/extensions/nextcloud-talk/src/monitor.ts +0 -246
- package/extensions/nextcloud-talk/src/normalize.ts +0 -31
- package/extensions/nextcloud-talk/src/onboarding.ts +0 -341
- package/extensions/nextcloud-talk/src/policy.ts +0 -175
- package/extensions/nextcloud-talk/src/room-info.ts +0 -111
- package/extensions/nextcloud-talk/src/runtime.ts +0 -14
- package/extensions/nextcloud-talk/src/send.ts +0 -206
- package/extensions/nextcloud-talk/src/signature.ts +0 -67
- package/extensions/nextcloud-talk/src/types.ts +0 -179
- package/extensions/nostr/CHANGELOG.md +0 -46
- package/extensions/nostr/README.md +0 -136
- package/extensions/nostr/clawdbot.plugin.json +0 -11
- package/extensions/nostr/index.ts +0 -69
- package/extensions/nostr/package.json +0 -31
- package/extensions/nostr/src/channel.test.ts +0 -141
- package/extensions/nostr/src/channel.ts +0 -342
- package/extensions/nostr/src/config-schema.ts +0 -90
- package/extensions/nostr/src/metrics.ts +0 -464
- package/extensions/nostr/src/nostr-bus.fuzz.test.ts +0 -544
- package/extensions/nostr/src/nostr-bus.integration.test.ts +0 -452
- package/extensions/nostr/src/nostr-bus.test.ts +0 -199
- package/extensions/nostr/src/nostr-bus.ts +0 -741
- package/extensions/nostr/src/nostr-profile-http.test.ts +0 -378
- package/extensions/nostr/src/nostr-profile-http.ts +0 -500
- package/extensions/nostr/src/nostr-profile-import.test.ts +0 -120
- package/extensions/nostr/src/nostr-profile-import.ts +0 -259
- package/extensions/nostr/src/nostr-profile.fuzz.test.ts +0 -479
- package/extensions/nostr/src/nostr-profile.test.ts +0 -410
- package/extensions/nostr/src/nostr-profile.ts +0 -242
- package/extensions/nostr/src/nostr-state-store.test.ts +0 -128
- package/extensions/nostr/src/nostr-state-store.ts +0 -226
- package/extensions/nostr/src/runtime.ts +0 -14
- package/extensions/nostr/src/seen-tracker.ts +0 -271
- package/extensions/nostr/src/types.test.ts +0 -161
- package/extensions/nostr/src/types.ts +0 -99
- package/extensions/nostr/test/setup.ts +0 -5
- package/extensions/open-prose/README.md +0 -25
- package/extensions/open-prose/clawdbot.plugin.json +0 -11
- package/extensions/open-prose/index.ts +0 -5
- package/extensions/open-prose/package.json +0 -11
- package/extensions/open-prose/skills/prose/LICENSE +0 -21
- package/extensions/open-prose/skills/prose/SKILL.md +0 -318
- package/extensions/open-prose/skills/prose/alt-borges.md +0 -141
- package/extensions/open-prose/skills/prose/alts/arabian-nights.md +0 -358
- package/extensions/open-prose/skills/prose/alts/borges.md +0 -360
- package/extensions/open-prose/skills/prose/alts/folk.md +0 -322
- package/extensions/open-prose/skills/prose/alts/homer.md +0 -346
- package/extensions/open-prose/skills/prose/alts/kafka.md +0 -373
- package/extensions/open-prose/skills/prose/compiler.md +0 -2967
- package/extensions/open-prose/skills/prose/examples/01-hello-world.prose +0 -4
- package/extensions/open-prose/skills/prose/examples/02-research-and-summarize.prose +0 -6
- package/extensions/open-prose/skills/prose/examples/03-code-review.prose +0 -17
- package/extensions/open-prose/skills/prose/examples/04-write-and-refine.prose +0 -14
- package/extensions/open-prose/skills/prose/examples/05-debug-issue.prose +0 -20
- package/extensions/open-prose/skills/prose/examples/06-explain-codebase.prose +0 -17
- package/extensions/open-prose/skills/prose/examples/07-refactor.prose +0 -20
- package/extensions/open-prose/skills/prose/examples/08-blog-post.prose +0 -20
- package/extensions/open-prose/skills/prose/examples/09-research-with-agents.prose +0 -25
- package/extensions/open-prose/skills/prose/examples/10-code-review-agents.prose +0 -32
- package/extensions/open-prose/skills/prose/examples/11-skills-and-imports.prose +0 -27
- package/extensions/open-prose/skills/prose/examples/12-secure-agent-permissions.prose +0 -43
- package/extensions/open-prose/skills/prose/examples/13-variables-and-context.prose +0 -51
- package/extensions/open-prose/skills/prose/examples/14-composition-blocks.prose +0 -48
- package/extensions/open-prose/skills/prose/examples/15-inline-sequences.prose +0 -23
- package/extensions/open-prose/skills/prose/examples/16-parallel-reviews.prose +0 -19
- package/extensions/open-prose/skills/prose/examples/17-parallel-research.prose +0 -19
- package/extensions/open-prose/skills/prose/examples/18-mixed-parallel-sequential.prose +0 -36
- package/extensions/open-prose/skills/prose/examples/19-advanced-parallel.prose +0 -71
- package/extensions/open-prose/skills/prose/examples/20-fixed-loops.prose +0 -20
- package/extensions/open-prose/skills/prose/examples/21-pipeline-operations.prose +0 -35
- package/extensions/open-prose/skills/prose/examples/22-error-handling.prose +0 -51
- package/extensions/open-prose/skills/prose/examples/23-retry-with-backoff.prose +0 -63
- package/extensions/open-prose/skills/prose/examples/24-choice-blocks.prose +0 -86
- package/extensions/open-prose/skills/prose/examples/25-conditionals.prose +0 -114
- package/extensions/open-prose/skills/prose/examples/26-parameterized-blocks.prose +0 -100
- package/extensions/open-prose/skills/prose/examples/27-string-interpolation.prose +0 -105
- package/extensions/open-prose/skills/prose/examples/28-automated-pr-review.prose +0 -37
- package/extensions/open-prose/skills/prose/examples/28-gas-town.prose +0 -1572
- package/extensions/open-prose/skills/prose/examples/29-captains-chair.prose +0 -218
- package/extensions/open-prose/skills/prose/examples/30-captains-chair-simple.prose +0 -42
- package/extensions/open-prose/skills/prose/examples/31-captains-chair-with-memory.prose +0 -145
- package/extensions/open-prose/skills/prose/examples/33-pr-review-autofix.prose +0 -168
- package/extensions/open-prose/skills/prose/examples/34-content-pipeline.prose +0 -204
- package/extensions/open-prose/skills/prose/examples/35-feature-factory.prose +0 -296
- package/extensions/open-prose/skills/prose/examples/36-bug-hunter.prose +0 -237
- package/extensions/open-prose/skills/prose/examples/37-the-forge.prose +0 -1474
- package/extensions/open-prose/skills/prose/examples/38-skill-scan.prose +0 -455
- package/extensions/open-prose/skills/prose/examples/39-architect-by-simulation.prose +0 -277
- package/extensions/open-prose/skills/prose/examples/40-rlm-self-refine.prose +0 -32
- package/extensions/open-prose/skills/prose/examples/41-rlm-divide-conquer.prose +0 -38
- package/extensions/open-prose/skills/prose/examples/42-rlm-filter-recurse.prose +0 -46
- package/extensions/open-prose/skills/prose/examples/43-rlm-pairwise.prose +0 -50
- package/extensions/open-prose/skills/prose/examples/44-run-endpoint-ux-test.prose +0 -261
- package/extensions/open-prose/skills/prose/examples/45-plugin-release.prose +0 -159
- package/extensions/open-prose/skills/prose/examples/45-run-endpoint-ux-test-with-remediation.prose +0 -637
- package/extensions/open-prose/skills/prose/examples/46-run-endpoint-ux-test-fast.prose +0 -148
- package/extensions/open-prose/skills/prose/examples/46-workflow-crystallizer.prose +0 -225
- package/extensions/open-prose/skills/prose/examples/47-language-self-improvement.prose +0 -356
- package/extensions/open-prose/skills/prose/examples/48-habit-miner.prose +0 -445
- package/extensions/open-prose/skills/prose/examples/49-prose-run-retrospective.prose +0 -210
- package/extensions/open-prose/skills/prose/examples/README.md +0 -391
- package/extensions/open-prose/skills/prose/examples/roadmap/README.md +0 -22
- package/extensions/open-prose/skills/prose/examples/roadmap/iterative-refinement.prose +0 -20
- package/extensions/open-prose/skills/prose/examples/roadmap/parallel-review.prose +0 -18
- package/extensions/open-prose/skills/prose/examples/roadmap/simple-pipeline.prose +0 -17
- package/extensions/open-prose/skills/prose/examples/roadmap/syntax/open-prose-syntax.prose +0 -223
- package/extensions/open-prose/skills/prose/guidance/antipatterns.md +0 -951
- package/extensions/open-prose/skills/prose/guidance/patterns.md +0 -700
- package/extensions/open-prose/skills/prose/guidance/system-prompt.md +0 -180
- package/extensions/open-prose/skills/prose/help.md +0 -143
- package/extensions/open-prose/skills/prose/lib/README.md +0 -105
- package/extensions/open-prose/skills/prose/lib/calibrator.prose +0 -215
- package/extensions/open-prose/skills/prose/lib/cost-analyzer.prose +0 -174
- package/extensions/open-prose/skills/prose/lib/error-forensics.prose +0 -250
- package/extensions/open-prose/skills/prose/lib/inspector.prose +0 -196
- package/extensions/open-prose/skills/prose/lib/profiler.prose +0 -460
- package/extensions/open-prose/skills/prose/lib/program-improver.prose +0 -275
- package/extensions/open-prose/skills/prose/lib/project-memory.prose +0 -118
- package/extensions/open-prose/skills/prose/lib/user-memory.prose +0 -93
- package/extensions/open-prose/skills/prose/lib/vm-improver.prose +0 -243
- package/extensions/open-prose/skills/prose/primitives/session.md +0 -587
- package/extensions/open-prose/skills/prose/prose.md +0 -1235
- package/extensions/open-prose/skills/prose/state/filesystem.md +0 -478
- package/extensions/open-prose/skills/prose/state/in-context.md +0 -380
- package/extensions/open-prose/skills/prose/state/postgres.md +0 -875
- package/extensions/open-prose/skills/prose/state/sqlite.md +0 -572
- package/extensions/qwen-portal-auth/README.md +0 -24
- package/extensions/qwen-portal-auth/clawdbot.plugin.json +0 -11
- package/extensions/qwen-portal-auth/index.ts +0 -127
- package/extensions/qwen-portal-auth/oauth.ts +0 -190
- package/extensions/signal/clawdbot.plugin.json +0 -11
- package/extensions/signal/index.ts +0 -18
- package/extensions/signal/package.json +0 -11
- package/extensions/signal/src/channel.ts +0 -312
- package/extensions/signal/src/runtime.ts +0 -14
- package/extensions/telegram/clawdbot.plugin.json +0 -11
- package/extensions/telegram/index.ts +0 -18
- package/extensions/telegram/package.json +0 -11
- package/extensions/telegram/src/channel.ts +0 -478
- package/extensions/telegram/src/runtime.ts +0 -14
- package/extensions/tlon/README.md +0 -5
- package/extensions/tlon/clawdbot.plugin.json +0 -11
- package/extensions/tlon/index.ts +0 -18
- package/extensions/tlon/package.json +0 -30
- package/extensions/tlon/src/channel.ts +0 -379
- package/extensions/tlon/src/config-schema.test.ts +0 -32
- package/extensions/tlon/src/config-schema.ts +0 -43
- package/extensions/tlon/src/monitor/discovery.ts +0 -71
- package/extensions/tlon/src/monitor/history.ts +0 -87
- package/extensions/tlon/src/monitor/index.ts +0 -501
- package/extensions/tlon/src/monitor/processed-messages.test.ts +0 -24
- package/extensions/tlon/src/monitor/processed-messages.ts +0 -38
- package/extensions/tlon/src/monitor/utils.ts +0 -83
- package/extensions/tlon/src/onboarding.ts +0 -213
- package/extensions/tlon/src/runtime.ts +0 -14
- package/extensions/tlon/src/targets.ts +0 -79
- package/extensions/tlon/src/types.ts +0 -85
- package/extensions/tlon/src/urbit/auth.ts +0 -18
- package/extensions/tlon/src/urbit/http-api.ts +0 -36
- package/extensions/tlon/src/urbit/send.test.ts +0 -38
- package/extensions/tlon/src/urbit/send.ts +0 -127
- package/extensions/tlon/src/urbit/sse-client.test.ts +0 -41
- package/extensions/tlon/src/urbit/sse-client.ts +0 -367
- package/extensions/twitch/CHANGELOG.md +0 -21
- package/extensions/twitch/README.md +0 -89
- package/extensions/twitch/clawdbot.plugin.json +0 -9
- package/extensions/twitch/index.ts +0 -20
- package/extensions/twitch/package.json +0 -20
- package/extensions/twitch/src/access-control.test.ts +0 -489
- package/extensions/twitch/src/access-control.ts +0 -154
- package/extensions/twitch/src/actions.ts +0 -173
- package/extensions/twitch/src/client-manager-registry.ts +0 -115
- package/extensions/twitch/src/config-schema.ts +0 -82
- package/extensions/twitch/src/config.test.ts +0 -88
- package/extensions/twitch/src/config.ts +0 -116
- package/extensions/twitch/src/monitor.ts +0 -257
- package/extensions/twitch/src/onboarding.test.ts +0 -311
- package/extensions/twitch/src/onboarding.ts +0 -411
- package/extensions/twitch/src/outbound.test.ts +0 -373
- package/extensions/twitch/src/outbound.ts +0 -186
- package/extensions/twitch/src/plugin.test.ts +0 -39
- package/extensions/twitch/src/plugin.ts +0 -274
- package/extensions/twitch/src/probe.test.ts +0 -198
- package/extensions/twitch/src/probe.ts +0 -118
- package/extensions/twitch/src/resolver.ts +0 -137
- package/extensions/twitch/src/runtime.ts +0 -14
- package/extensions/twitch/src/send.test.ts +0 -289
- package/extensions/twitch/src/send.ts +0 -136
- package/extensions/twitch/src/status.test.ts +0 -270
- package/extensions/twitch/src/status.ts +0 -176
- package/extensions/twitch/src/token.test.ts +0 -171
- package/extensions/twitch/src/token.ts +0 -87
- package/extensions/twitch/src/twitch-client.test.ts +0 -574
- package/extensions/twitch/src/twitch-client.ts +0 -277
- package/extensions/twitch/src/types.ts +0 -141
- package/extensions/twitch/src/utils/markdown.ts +0 -92
- package/extensions/twitch/src/utils/twitch.ts +0 -78
- package/extensions/twitch/test/setup.ts +0 -7
- package/extensions/voice-call/CHANGELOG.md +0 -72
- package/extensions/voice-call/README.md +0 -134
- package/extensions/voice-call/clawdbot.plugin.json +0 -601
- package/extensions/voice-call/index.ts +0 -497
- package/extensions/voice-call/package.json +0 -16
- package/extensions/voice-call/src/cli.ts +0 -300
- package/extensions/voice-call/src/config.test.ts +0 -204
- package/extensions/voice-call/src/config.ts +0 -493
- package/extensions/voice-call/src/core-bridge.ts +0 -196
- package/extensions/voice-call/src/manager/context.ts +0 -21
- package/extensions/voice-call/src/manager/events.ts +0 -177
- package/extensions/voice-call/src/manager/lookup.ts +0 -33
- package/extensions/voice-call/src/manager/outbound.ts +0 -248
- package/extensions/voice-call/src/manager/state.ts +0 -50
- package/extensions/voice-call/src/manager/store.ts +0 -88
- package/extensions/voice-call/src/manager/timers.ts +0 -86
- package/extensions/voice-call/src/manager/twiml.ts +0 -9
- package/extensions/voice-call/src/manager.test.ts +0 -108
- package/extensions/voice-call/src/manager.ts +0 -876
- package/extensions/voice-call/src/media-stream.test.ts +0 -97
- package/extensions/voice-call/src/media-stream.ts +0 -393
- package/extensions/voice-call/src/providers/base.ts +0 -67
- package/extensions/voice-call/src/providers/index.ts +0 -10
- package/extensions/voice-call/src/providers/mock.ts +0 -168
- package/extensions/voice-call/src/providers/plivo.test.ts +0 -28
- package/extensions/voice-call/src/providers/plivo.ts +0 -504
- package/extensions/voice-call/src/providers/stt-openai-realtime.ts +0 -311
- package/extensions/voice-call/src/providers/telnyx.ts +0 -364
- package/extensions/voice-call/src/providers/tts-openai.ts +0 -264
- package/extensions/voice-call/src/providers/twilio/api.ts +0 -45
- package/extensions/voice-call/src/providers/twilio/webhook.ts +0 -29
- package/extensions/voice-call/src/providers/twilio.test.ts +0 -64
- package/extensions/voice-call/src/providers/twilio.ts +0 -595
- package/extensions/voice-call/src/response-generator.ts +0 -171
- package/extensions/voice-call/src/runtime.ts +0 -205
- package/extensions/voice-call/src/telephony-audio.ts +0 -88
- package/extensions/voice-call/src/telephony-tts.ts +0 -95
- package/extensions/voice-call/src/tunnel.ts +0 -331
- package/extensions/voice-call/src/types.ts +0 -272
- package/extensions/voice-call/src/utils.ts +0 -12
- package/extensions/voice-call/src/voice-mapping.ts +0 -65
- package/extensions/voice-call/src/webhook-security.test.ts +0 -233
- package/extensions/voice-call/src/webhook-security.ts +0 -446
- package/extensions/voice-call/src/webhook.ts +0 -490
- package/extensions/whatsapp/clawdbot.plugin.json +0 -11
- package/extensions/whatsapp/index.ts +0 -18
- package/extensions/whatsapp/package.json +0 -11
- package/extensions/whatsapp/src/channel.ts +0 -500
- package/extensions/whatsapp/src/runtime.ts +0 -14
- package/extensions/zalo/CHANGELOG.md +0 -55
- package/extensions/zalo/README.md +0 -50
- package/extensions/zalo/clawdbot.plugin.json +0 -11
- package/extensions/zalo/index.ts +0 -20
- package/extensions/zalo/package.json +0 -33
- package/extensions/zalo/src/accounts.ts +0 -71
- package/extensions/zalo/src/actions.ts +0 -62
- package/extensions/zalo/src/api.ts +0 -206
- package/extensions/zalo/src/channel.directory.test.ts +0 -35
- package/extensions/zalo/src/channel.ts +0 -394
- package/extensions/zalo/src/config-schema.ts +0 -24
- package/extensions/zalo/src/monitor.ts +0 -760
- package/extensions/zalo/src/monitor.webhook.test.ts +0 -70
- package/extensions/zalo/src/onboarding.ts +0 -405
- package/extensions/zalo/src/probe.ts +0 -46
- package/extensions/zalo/src/proxy.ts +0 -18
- package/extensions/zalo/src/runtime.ts +0 -14
- package/extensions/zalo/src/send.ts +0 -117
- package/extensions/zalo/src/status-issues.ts +0 -50
- package/extensions/zalo/src/token.ts +0 -55
- package/extensions/zalo/src/types.ts +0 -42
- package/extensions/zalouser/CHANGELOG.md +0 -33
- package/extensions/zalouser/README.md +0 -221
- package/extensions/zalouser/clawdbot.plugin.json +0 -11
- package/extensions/zalouser/index.ts +0 -32
- package/extensions/zalouser/package.json +0 -33
- package/extensions/zalouser/src/accounts.ts +0 -117
- package/extensions/zalouser/src/channel.test.ts +0 -17
- package/extensions/zalouser/src/channel.ts +0 -641
- package/extensions/zalouser/src/config-schema.ts +0 -27
- package/extensions/zalouser/src/monitor.ts +0 -574
- package/extensions/zalouser/src/onboarding.ts +0 -488
- package/extensions/zalouser/src/probe.ts +0 -28
- package/extensions/zalouser/src/runtime.ts +0 -14
- package/extensions/zalouser/src/send.ts +0 -150
- package/extensions/zalouser/src/status-issues.test.ts +0 -58
- package/extensions/zalouser/src/status-issues.ts +0 -81
- package/extensions/zalouser/src/tool.ts +0 -156
- package/extensions/zalouser/src/types.ts +0 -102
- package/extensions/zalouser/src/zca.ts +0 -208
- package/skills/1password/SKILL.md +0 -53
- package/skills/1password/references/cli-examples.md +0 -29
- package/skills/1password/references/get-started.md +0 -17
- package/skills/apple-notes/SKILL.md +0 -50
- package/skills/apple-reminders/SKILL.md +0 -67
- package/skills/bear-notes/SKILL.md +0 -79
- package/skills/bird/SKILL.md +0 -197
- package/skills/blogwatcher/SKILL.md +0 -46
- package/skills/blucli/SKILL.md +0 -27
- package/skills/bluebubbles/SKILL.md +0 -39
- package/skills/camsnap/SKILL.md +0 -25
- package/skills/canvas/SKILL.md +0 -189
- package/skills/clawdhub/SKILL.md +0 -53
- package/skills/coding-agent/SKILL.md +0 -278
- package/skills/discord/SKILL.md +0 -475
- package/skills/eightctl/SKILL.md +0 -29
- package/skills/food-order/SKILL.md +0 -41
- package/skills/gemini/SKILL.md +0 -23
- package/skills/gifgrep/SKILL.md +0 -47
- package/skills/github/SKILL.md +0 -48
- package/skills/gog/SKILL.md +0 -92
- package/skills/goplaces/SKILL.md +0 -30
- package/skills/himalaya/SKILL.md +0 -217
- package/skills/himalaya/references/configuration.md +0 -174
- package/skills/himalaya/references/message-composition.md +0 -182
- package/skills/imsg/SKILL.md +0 -25
- package/skills/local-places/SERVER_README.md +0 -101
- package/skills/local-places/SKILL.md +0 -91
- package/skills/local-places/pyproject.toml +0 -27
- package/skills/local-places/src/local_places/__init__.py +0 -2
- package/skills/local-places/src/local_places/google_places.py +0 -314
- package/skills/local-places/src/local_places/main.py +0 -65
- package/skills/local-places/src/local_places/schemas.py +0 -107
- package/skills/mcporter/SKILL.md +0 -38
- package/skills/model-usage/SKILL.md +0 -45
- package/skills/model-usage/references/codexbar-cli.md +0 -28
- package/skills/model-usage/scripts/model_usage.py +0 -310
- package/skills/nano-banana-pro/SKILL.md +0 -30
- package/skills/nano-banana-pro/scripts/generate_image.py +0 -169
- package/skills/nano-pdf/SKILL.md +0 -20
- package/skills/notion/SKILL.md +0 -156
- package/skills/obsidian/SKILL.md +0 -55
- package/skills/openai-image-gen/SKILL.md +0 -71
- package/skills/openai-image-gen/scripts/gen.py +0 -240
- package/skills/openai-whisper/SKILL.md +0 -19
- package/skills/openai-whisper-api/SKILL.md +0 -43
- package/skills/openai-whisper-api/scripts/transcribe.sh +0 -85
- package/skills/openhue/SKILL.md +0 -30
- package/skills/oracle/SKILL.md +0 -105
- package/skills/ordercli/SKILL.md +0 -47
- package/skills/peekaboo/SKILL.md +0 -153
- package/skills/sag/SKILL.md +0 -62
- package/skills/session-logs/SKILL.md +0 -105
- package/skills/sherpa-onnx-tts/SKILL.md +0 -49
- package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +0 -178
- package/skills/skill-creator/SKILL.md +0 -371
- package/skills/skill-creator/license.txt +0 -202
- package/skills/skill-creator/scripts/init_skill.py +0 -378
- package/skills/skill-creator/scripts/package_skill.py +0 -111
- package/skills/skill-creator/scripts/quick_validate.py +0 -101
- package/skills/slack/SKILL.md +0 -144
- package/skills/songsee/SKILL.md +0 -29
- package/skills/sonoscli/SKILL.md +0 -26
- package/skills/spotify-player/SKILL.md +0 -34
- package/skills/summarize/SKILL.md +0 -67
- package/skills/things-mac/SKILL.md +0 -61
- package/skills/tmux/SKILL.md +0 -121
- package/skills/tmux/scripts/find-sessions.sh +0 -112
- package/skills/tmux/scripts/wait-for-text.sh +0 -83
- package/skills/trello/SKILL.md +0 -84
- package/skills/video-frames/SKILL.md +0 -29
- package/skills/video-frames/scripts/frame.sh +0 -81
- package/skills/voice-call/SKILL.md +0 -35
- package/skills/wacli/SKILL.md +0 -42
- package/skills/weather/SKILL.md +0 -49
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Twitch message actions adapter.
|
|
3
|
-
*
|
|
4
|
-
* Handles tool-based actions for Twitch, such as sending messages.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { DEFAULT_ACCOUNT_ID, getAccountConfig } from "./config.js";
|
|
8
|
-
import { twitchOutbound } from "./outbound.js";
|
|
9
|
-
import type { ChannelMessageActionAdapter, ChannelMessageActionContext } from "./types.js";
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Create a tool result with error content.
|
|
13
|
-
*/
|
|
14
|
-
function errorResponse(error: string) {
|
|
15
|
-
return {
|
|
16
|
-
content: [
|
|
17
|
-
{
|
|
18
|
-
type: "text",
|
|
19
|
-
text: JSON.stringify({ ok: false, error }),
|
|
20
|
-
},
|
|
21
|
-
],
|
|
22
|
-
details: { ok: false },
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Read a string parameter from action arguments.
|
|
28
|
-
*
|
|
29
|
-
* @param args - Action arguments
|
|
30
|
-
* @param key - Parameter key
|
|
31
|
-
* @param options - Options for reading the parameter
|
|
32
|
-
* @returns The parameter value or undefined if not found
|
|
33
|
-
*/
|
|
34
|
-
function readStringParam(
|
|
35
|
-
args: Record<string, unknown>,
|
|
36
|
-
key: string,
|
|
37
|
-
options: { required?: boolean; trim?: boolean } = {},
|
|
38
|
-
): string | undefined {
|
|
39
|
-
const value = args[key];
|
|
40
|
-
if (value === undefined || value === null) {
|
|
41
|
-
if (options.required) {
|
|
42
|
-
throw new Error(`Missing required parameter: ${key}`);
|
|
43
|
-
}
|
|
44
|
-
return undefined;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// Convert value to string safely
|
|
48
|
-
if (typeof value === "string") {
|
|
49
|
-
return options.trim !== false ? value.trim() : value;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
if (typeof value === "number" || typeof value === "boolean") {
|
|
53
|
-
const str = String(value);
|
|
54
|
-
return options.trim !== false ? str.trim() : str;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
throw new Error(`Parameter ${key} must be a string, number, or boolean`);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/** Supported Twitch actions */
|
|
61
|
-
const TWITCH_ACTIONS = new Set(["send" as const]);
|
|
62
|
-
type TwitchAction = typeof TWITCH_ACTIONS extends Set<infer U> ? U : never;
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Twitch message actions adapter.
|
|
66
|
-
*/
|
|
67
|
-
export const twitchMessageActions: ChannelMessageActionAdapter = {
|
|
68
|
-
/**
|
|
69
|
-
* List available actions for this channel.
|
|
70
|
-
*/
|
|
71
|
-
listActions: () => [...TWITCH_ACTIONS],
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Check if an action is supported.
|
|
75
|
-
*/
|
|
76
|
-
supportsAction: ({ action }) => TWITCH_ACTIONS.has(action as TwitchAction),
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Extract tool send parameters from action arguments.
|
|
80
|
-
*
|
|
81
|
-
* Parses and validates the "to" and "message" parameters for sending.
|
|
82
|
-
*
|
|
83
|
-
* @param params - Arguments from the tool call
|
|
84
|
-
* @returns Parsed send parameters or null if invalid
|
|
85
|
-
*
|
|
86
|
-
* @example
|
|
87
|
-
* const result = twitchMessageActions.extractToolSend!({
|
|
88
|
-
* args: { to: "#mychannel", message: "Hello!" }
|
|
89
|
-
* });
|
|
90
|
-
* // Returns: { to: "#mychannel", message: "Hello!" }
|
|
91
|
-
*/
|
|
92
|
-
extractToolSend: ({ args }) => {
|
|
93
|
-
try {
|
|
94
|
-
const to = readStringParam(args, "to", { required: true });
|
|
95
|
-
const message = readStringParam(args, "message", { required: true });
|
|
96
|
-
|
|
97
|
-
if (!to || !message) {
|
|
98
|
-
return null;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
return { to, message };
|
|
102
|
-
} catch {
|
|
103
|
-
return null;
|
|
104
|
-
}
|
|
105
|
-
},
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Handle an action execution.
|
|
109
|
-
*
|
|
110
|
-
* Processes the "send" action to send messages to Twitch.
|
|
111
|
-
*
|
|
112
|
-
* @param ctx - Action context including action type, parameters, and config
|
|
113
|
-
* @returns Tool result with content or null if action not supported
|
|
114
|
-
*
|
|
115
|
-
* @example
|
|
116
|
-
* const result = await twitchMessageActions.handleAction!({
|
|
117
|
-
* action: "send",
|
|
118
|
-
* params: { message: "Hello Twitch!", to: "#mychannel" },
|
|
119
|
-
* cfg: clawdbotConfig,
|
|
120
|
-
* accountId: "default",
|
|
121
|
-
* });
|
|
122
|
-
*/
|
|
123
|
-
handleAction: async (
|
|
124
|
-
ctx: ChannelMessageActionContext,
|
|
125
|
-
): Promise<{ content: Array<{ type: string; text: string }> } | null> => {
|
|
126
|
-
if (ctx.action !== "send") {
|
|
127
|
-
return null;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
const message = readStringParam(ctx.params, "message", { required: true });
|
|
131
|
-
const to = readStringParam(ctx.params, "to", { required: false });
|
|
132
|
-
const accountId = ctx.accountId ?? DEFAULT_ACCOUNT_ID;
|
|
133
|
-
|
|
134
|
-
const account = getAccountConfig(ctx.cfg, accountId);
|
|
135
|
-
if (!account) {
|
|
136
|
-
return errorResponse(
|
|
137
|
-
`Account not found: ${accountId}. Available accounts: ${Object.keys(ctx.cfg.channels?.twitch?.accounts ?? {}).join(", ") || "none"}`,
|
|
138
|
-
);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
// Use the channel from account config (or override with `to` parameter)
|
|
142
|
-
const targetChannel = to || account.channel;
|
|
143
|
-
if (!targetChannel) {
|
|
144
|
-
return errorResponse("No channel specified and no default channel in account config");
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
if (!twitchOutbound.sendText) {
|
|
148
|
-
return errorResponse("sendText not implemented");
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
try {
|
|
152
|
-
const result = await twitchOutbound.sendText({
|
|
153
|
-
cfg: ctx.cfg,
|
|
154
|
-
to: targetChannel,
|
|
155
|
-
text: message ?? "",
|
|
156
|
-
accountId,
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
return {
|
|
160
|
-
content: [
|
|
161
|
-
{
|
|
162
|
-
type: "text",
|
|
163
|
-
text: JSON.stringify(result),
|
|
164
|
-
},
|
|
165
|
-
],
|
|
166
|
-
details: { ok: true },
|
|
167
|
-
};
|
|
168
|
-
} catch (error) {
|
|
169
|
-
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
170
|
-
return errorResponse(errorMsg);
|
|
171
|
-
}
|
|
172
|
-
},
|
|
173
|
-
};
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Client manager registry for Twitch plugin.
|
|
3
|
-
*
|
|
4
|
-
* Manages the lifecycle of TwitchClientManager instances across the plugin,
|
|
5
|
-
* ensuring proper cleanup when accounts are stopped or reconfigured.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { TwitchClientManager } from "./twitch-client.js";
|
|
9
|
-
import type { ChannelLogSink } from "./types.js";
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Registry entry tracking a client manager and its associated account.
|
|
13
|
-
*/
|
|
14
|
-
type RegistryEntry = {
|
|
15
|
-
/** The client manager instance */
|
|
16
|
-
manager: TwitchClientManager;
|
|
17
|
-
/** The account ID this manager is for */
|
|
18
|
-
accountId: string;
|
|
19
|
-
/** Logger for this entry */
|
|
20
|
-
logger: ChannelLogSink;
|
|
21
|
-
/** When this entry was created */
|
|
22
|
-
createdAt: number;
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Global registry of client managers.
|
|
27
|
-
* Keyed by account ID.
|
|
28
|
-
*/
|
|
29
|
-
const registry = new Map<string, RegistryEntry>();
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Get or create a client manager for an account.
|
|
33
|
-
*
|
|
34
|
-
* @param accountId - The account ID
|
|
35
|
-
* @param logger - Logger instance
|
|
36
|
-
* @returns The client manager
|
|
37
|
-
*/
|
|
38
|
-
export function getOrCreateClientManager(
|
|
39
|
-
accountId: string,
|
|
40
|
-
logger: ChannelLogSink,
|
|
41
|
-
): TwitchClientManager {
|
|
42
|
-
const existing = registry.get(accountId);
|
|
43
|
-
if (existing) {
|
|
44
|
-
return existing.manager;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
const manager = new TwitchClientManager(logger);
|
|
48
|
-
registry.set(accountId, {
|
|
49
|
-
manager,
|
|
50
|
-
accountId,
|
|
51
|
-
logger,
|
|
52
|
-
createdAt: Date.now(),
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
logger.info(`Registered client manager for account: ${accountId}`);
|
|
56
|
-
return manager;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Get an existing client manager for an account.
|
|
61
|
-
*
|
|
62
|
-
* @param accountId - The account ID
|
|
63
|
-
* @returns The client manager, or undefined if not registered
|
|
64
|
-
*/
|
|
65
|
-
export function getClientManager(accountId: string): TwitchClientManager | undefined {
|
|
66
|
-
return registry.get(accountId)?.manager;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* Disconnect and remove a client manager from the registry.
|
|
71
|
-
*
|
|
72
|
-
* @param accountId - The account ID
|
|
73
|
-
* @returns Promise that resolves when cleanup is complete
|
|
74
|
-
*/
|
|
75
|
-
export async function removeClientManager(accountId: string): Promise<void> {
|
|
76
|
-
const entry = registry.get(accountId);
|
|
77
|
-
if (!entry) {
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// Disconnect the client manager
|
|
82
|
-
await entry.manager.disconnectAll();
|
|
83
|
-
|
|
84
|
-
// Remove from registry
|
|
85
|
-
registry.delete(accountId);
|
|
86
|
-
entry.logger.info(`Unregistered client manager for account: ${accountId}`);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Disconnect and remove all client managers from the registry.
|
|
91
|
-
*
|
|
92
|
-
* @returns Promise that resolves when all cleanup is complete
|
|
93
|
-
*/
|
|
94
|
-
export async function removeAllClientManagers(): Promise<void> {
|
|
95
|
-
const promises = [...registry.keys()].map((accountId) => removeClientManager(accountId));
|
|
96
|
-
await Promise.all(promises);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* Get the number of registered client managers.
|
|
101
|
-
*
|
|
102
|
-
* @returns The count of registered managers
|
|
103
|
-
*/
|
|
104
|
-
export function getRegisteredClientManagerCount(): number {
|
|
105
|
-
return registry.size;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* Clear all client managers without disconnecting.
|
|
110
|
-
*
|
|
111
|
-
* This is primarily for testing purposes.
|
|
112
|
-
*/
|
|
113
|
-
export function _clearAllClientManagersForTest(): void {
|
|
114
|
-
registry.clear();
|
|
115
|
-
}
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { MarkdownConfigSchema } from "clawdbot/plugin-sdk";
|
|
2
|
-
import { z } from "zod";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Twitch user roles that can be allowed to interact with the bot
|
|
6
|
-
*/
|
|
7
|
-
const TwitchRoleSchema = z.enum(["moderator", "owner", "vip", "subscriber", "all"]);
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Twitch account configuration schema
|
|
11
|
-
*/
|
|
12
|
-
const TwitchAccountSchema = z.object({
|
|
13
|
-
/** Twitch username */
|
|
14
|
-
username: z.string(),
|
|
15
|
-
/** Twitch OAuth access token (requires chat:read and chat:write scopes) */
|
|
16
|
-
accessToken: z.string(),
|
|
17
|
-
/** Twitch client ID (from Twitch Developer Portal or twitchtokengenerator.com) */
|
|
18
|
-
clientId: z.string().optional(),
|
|
19
|
-
/** Channel name to join */
|
|
20
|
-
channel: z.string().min(1),
|
|
21
|
-
/** Enable this account */
|
|
22
|
-
enabled: z.boolean().optional(),
|
|
23
|
-
/** Allowlist of Twitch user IDs who can interact with the bot (use IDs for safety, not usernames) */
|
|
24
|
-
allowFrom: z.array(z.string()).optional(),
|
|
25
|
-
/** Roles allowed to interact with the bot (e.g., ["moderator", "vip", "subscriber"]) */
|
|
26
|
-
allowedRoles: z.array(TwitchRoleSchema).optional(),
|
|
27
|
-
/** Require @mention to trigger bot responses */
|
|
28
|
-
requireMention: z.boolean().optional(),
|
|
29
|
-
/** Twitch client secret (required for token refresh via RefreshingAuthProvider) */
|
|
30
|
-
clientSecret: z.string().optional(),
|
|
31
|
-
/** Refresh token (required for automatic token refresh) */
|
|
32
|
-
refreshToken: z.string().optional(),
|
|
33
|
-
/** Token expiry time in seconds (optional, for token refresh tracking) */
|
|
34
|
-
expiresIn: z.number().nullable().optional(),
|
|
35
|
-
/** Timestamp when token was obtained (optional, for token refresh tracking) */
|
|
36
|
-
obtainmentTimestamp: z.number().optional(),
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Base configuration properties shared by both single and multi-account modes
|
|
41
|
-
*/
|
|
42
|
-
const TwitchConfigBaseSchema = z.object({
|
|
43
|
-
name: z.string().optional(),
|
|
44
|
-
enabled: z.boolean().optional(),
|
|
45
|
-
markdown: MarkdownConfigSchema.optional(),
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Simplified single-account configuration schema
|
|
50
|
-
*
|
|
51
|
-
* Use this for single-account setups. Properties are at the top level,
|
|
52
|
-
* creating an implicit "default" account.
|
|
53
|
-
*/
|
|
54
|
-
const SimplifiedSchema = z.intersection(TwitchConfigBaseSchema, TwitchAccountSchema);
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Multi-account configuration schema
|
|
58
|
-
*
|
|
59
|
-
* Use this for multi-account setups. Each key is an account ID (e.g., "default", "secondary").
|
|
60
|
-
*/
|
|
61
|
-
const MultiAccountSchema = z.intersection(
|
|
62
|
-
TwitchConfigBaseSchema,
|
|
63
|
-
z
|
|
64
|
-
.object({
|
|
65
|
-
/** Per-account configuration (for multi-account setups) */
|
|
66
|
-
accounts: z.record(z.string(), TwitchAccountSchema),
|
|
67
|
-
})
|
|
68
|
-
.refine((val) => Object.keys(val.accounts || {}).length > 0, {
|
|
69
|
-
message: "accounts must contain at least one entry",
|
|
70
|
-
}),
|
|
71
|
-
);
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Twitch plugin configuration schema
|
|
75
|
-
*
|
|
76
|
-
* Supports two mutually exclusive patterns:
|
|
77
|
-
* 1. Simplified single-account: username, accessToken, clientId, channel at top level
|
|
78
|
-
* 2. Multi-account: accounts object with named account configs
|
|
79
|
-
*
|
|
80
|
-
* The union ensures clear discrimination between the two modes.
|
|
81
|
-
*/
|
|
82
|
-
export const TwitchConfigSchema = z.union([SimplifiedSchema, MultiAccountSchema]);
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
|
2
|
-
|
|
3
|
-
import { getAccountConfig } from "./config.js";
|
|
4
|
-
|
|
5
|
-
describe("getAccountConfig", () => {
|
|
6
|
-
const mockMultiAccountConfig = {
|
|
7
|
-
channels: {
|
|
8
|
-
twitch: {
|
|
9
|
-
accounts: {
|
|
10
|
-
default: {
|
|
11
|
-
username: "testbot",
|
|
12
|
-
accessToken: "oauth:test123",
|
|
13
|
-
},
|
|
14
|
-
secondary: {
|
|
15
|
-
username: "secondbot",
|
|
16
|
-
accessToken: "oauth:secondary",
|
|
17
|
-
},
|
|
18
|
-
},
|
|
19
|
-
},
|
|
20
|
-
},
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
const mockSimplifiedConfig = {
|
|
24
|
-
channels: {
|
|
25
|
-
twitch: {
|
|
26
|
-
username: "testbot",
|
|
27
|
-
accessToken: "oauth:test123",
|
|
28
|
-
},
|
|
29
|
-
},
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
it("returns account config for valid account ID (multi-account)", () => {
|
|
33
|
-
const result = getAccountConfig(mockMultiAccountConfig, "default");
|
|
34
|
-
|
|
35
|
-
expect(result).not.toBeNull();
|
|
36
|
-
expect(result?.username).toBe("testbot");
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
it("returns account config for default account (simplified config)", () => {
|
|
40
|
-
const result = getAccountConfig(mockSimplifiedConfig, "default");
|
|
41
|
-
|
|
42
|
-
expect(result).not.toBeNull();
|
|
43
|
-
expect(result?.username).toBe("testbot");
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
it("returns non-default account from multi-account config", () => {
|
|
47
|
-
const result = getAccountConfig(mockMultiAccountConfig, "secondary");
|
|
48
|
-
|
|
49
|
-
expect(result).not.toBeNull();
|
|
50
|
-
expect(result?.username).toBe("secondbot");
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
it("returns null for non-existent account ID", () => {
|
|
54
|
-
const result = getAccountConfig(mockMultiAccountConfig, "nonexistent");
|
|
55
|
-
|
|
56
|
-
expect(result).toBeNull();
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
it("returns null when core config is null", () => {
|
|
60
|
-
const result = getAccountConfig(null, "default");
|
|
61
|
-
|
|
62
|
-
expect(result).toBeNull();
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
it("returns null when core config is undefined", () => {
|
|
66
|
-
const result = getAccountConfig(undefined, "default");
|
|
67
|
-
|
|
68
|
-
expect(result).toBeNull();
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
it("returns null when channels are not defined", () => {
|
|
72
|
-
const result = getAccountConfig({}, "default");
|
|
73
|
-
|
|
74
|
-
expect(result).toBeNull();
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
it("returns null when twitch is not defined", () => {
|
|
78
|
-
const result = getAccountConfig({ channels: {} }, "default");
|
|
79
|
-
|
|
80
|
-
expect(result).toBeNull();
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
it("returns null when accounts are not defined", () => {
|
|
84
|
-
const result = getAccountConfig({ channels: { twitch: {} } }, "default");
|
|
85
|
-
|
|
86
|
-
expect(result).toBeNull();
|
|
87
|
-
});
|
|
88
|
-
});
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
import type { ClawdbotConfig } from "clawdbot/plugin-sdk";
|
|
2
|
-
import type { TwitchAccountConfig } from "./types.js";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Default account ID for Twitch
|
|
6
|
-
*/
|
|
7
|
-
export const DEFAULT_ACCOUNT_ID = "default";
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Get account config from core config
|
|
11
|
-
*
|
|
12
|
-
* Handles two patterns:
|
|
13
|
-
* 1. Simplified single-account: base-level properties create implicit "default" account
|
|
14
|
-
* 2. Multi-account: explicit accounts object
|
|
15
|
-
*
|
|
16
|
-
* For "default" account, base-level properties take precedence over accounts.default
|
|
17
|
-
* For other accounts, only the accounts object is checked
|
|
18
|
-
*/
|
|
19
|
-
export function getAccountConfig(
|
|
20
|
-
coreConfig: unknown,
|
|
21
|
-
accountId: string,
|
|
22
|
-
): TwitchAccountConfig | null {
|
|
23
|
-
if (!coreConfig || typeof coreConfig !== "object") {
|
|
24
|
-
return null;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const cfg = coreConfig as ClawdbotConfig;
|
|
28
|
-
const twitch = cfg.channels?.twitch;
|
|
29
|
-
// Access accounts via unknown to handle union type (single-account vs multi-account)
|
|
30
|
-
const twitchRaw = twitch as Record<string, unknown> | undefined;
|
|
31
|
-
const accounts = twitchRaw?.accounts as Record<string, TwitchAccountConfig> | undefined;
|
|
32
|
-
|
|
33
|
-
// For default account, check base-level config first
|
|
34
|
-
if (accountId === DEFAULT_ACCOUNT_ID) {
|
|
35
|
-
const accountFromAccounts = accounts?.[DEFAULT_ACCOUNT_ID];
|
|
36
|
-
|
|
37
|
-
// Base-level properties that can form an implicit default account
|
|
38
|
-
const baseLevel = {
|
|
39
|
-
username: typeof twitchRaw?.username === "string" ? twitchRaw.username : undefined,
|
|
40
|
-
accessToken: typeof twitchRaw?.accessToken === "string" ? twitchRaw.accessToken : undefined,
|
|
41
|
-
clientId: typeof twitchRaw?.clientId === "string" ? twitchRaw.clientId : undefined,
|
|
42
|
-
channel: typeof twitchRaw?.channel === "string" ? twitchRaw.channel : undefined,
|
|
43
|
-
enabled: typeof twitchRaw?.enabled === "boolean" ? twitchRaw.enabled : undefined,
|
|
44
|
-
allowFrom: Array.isArray(twitchRaw?.allowFrom) ? twitchRaw.allowFrom : undefined,
|
|
45
|
-
allowedRoles: Array.isArray(twitchRaw?.allowedRoles) ? twitchRaw.allowedRoles : undefined,
|
|
46
|
-
requireMention:
|
|
47
|
-
typeof twitchRaw?.requireMention === "boolean" ? twitchRaw.requireMention : undefined,
|
|
48
|
-
clientSecret:
|
|
49
|
-
typeof twitchRaw?.clientSecret === "string" ? twitchRaw.clientSecret : undefined,
|
|
50
|
-
refreshToken:
|
|
51
|
-
typeof twitchRaw?.refreshToken === "string" ? twitchRaw.refreshToken : undefined,
|
|
52
|
-
expiresIn: typeof twitchRaw?.expiresIn === "number" ? twitchRaw.expiresIn : undefined,
|
|
53
|
-
obtainmentTimestamp:
|
|
54
|
-
typeof twitchRaw?.obtainmentTimestamp === "number"
|
|
55
|
-
? twitchRaw.obtainmentTimestamp
|
|
56
|
-
: undefined,
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
// Merge: base-level takes precedence over accounts.default
|
|
60
|
-
const merged: Partial<TwitchAccountConfig> = {
|
|
61
|
-
...accountFromAccounts,
|
|
62
|
-
...baseLevel,
|
|
63
|
-
} as Partial<TwitchAccountConfig>;
|
|
64
|
-
|
|
65
|
-
// Only return if we have at least username
|
|
66
|
-
if (merged.username) {
|
|
67
|
-
return merged as TwitchAccountConfig;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// Fall through to accounts.default if no base-level username
|
|
71
|
-
if (accountFromAccounts) {
|
|
72
|
-
return accountFromAccounts;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
return null;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
// For non-default accounts, only check accounts object
|
|
79
|
-
if (!accounts || !accounts[accountId]) {
|
|
80
|
-
return null;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
return accounts[accountId] as TwitchAccountConfig | null;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* List all configured account IDs
|
|
88
|
-
*
|
|
89
|
-
* Includes both explicit accounts and implicit "default" from base-level config
|
|
90
|
-
*/
|
|
91
|
-
export function listAccountIds(cfg: ClawdbotConfig): string[] {
|
|
92
|
-
const twitch = cfg.channels?.twitch;
|
|
93
|
-
// Access accounts via unknown to handle union type (single-account vs multi-account)
|
|
94
|
-
const twitchRaw = twitch as Record<string, unknown> | undefined;
|
|
95
|
-
const accountMap = twitchRaw?.accounts as Record<string, unknown> | undefined;
|
|
96
|
-
|
|
97
|
-
const ids: string[] = [];
|
|
98
|
-
|
|
99
|
-
// Add explicit accounts
|
|
100
|
-
if (accountMap) {
|
|
101
|
-
ids.push(...Object.keys(accountMap));
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// Add implicit "default" if base-level config exists and "default" not already present
|
|
105
|
-
const hasBaseLevelConfig =
|
|
106
|
-
twitchRaw &&
|
|
107
|
-
(typeof twitchRaw.username === "string" ||
|
|
108
|
-
typeof twitchRaw.accessToken === "string" ||
|
|
109
|
-
typeof twitchRaw.channel === "string");
|
|
110
|
-
|
|
111
|
-
if (hasBaseLevelConfig && !ids.includes(DEFAULT_ACCOUNT_ID)) {
|
|
112
|
-
ids.push(DEFAULT_ACCOUNT_ID);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
return ids;
|
|
116
|
-
}
|