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,270 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for status.ts module
|
|
3
|
-
*
|
|
4
|
-
* Tests cover:
|
|
5
|
-
* - Detection of unconfigured accounts
|
|
6
|
-
* - Detection of disabled accounts
|
|
7
|
-
* - Detection of missing clientId
|
|
8
|
-
* - Token format warnings
|
|
9
|
-
* - Access control warnings
|
|
10
|
-
* - Runtime error detection
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import { describe, expect, it } from "vitest";
|
|
14
|
-
import { collectTwitchStatusIssues } from "./status.js";
|
|
15
|
-
import type { ChannelAccountSnapshot } from "./types.js";
|
|
16
|
-
|
|
17
|
-
describe("status", () => {
|
|
18
|
-
describe("collectTwitchStatusIssues", () => {
|
|
19
|
-
it("should detect unconfigured accounts", () => {
|
|
20
|
-
const snapshots: ChannelAccountSnapshot[] = [
|
|
21
|
-
{
|
|
22
|
-
accountId: "default",
|
|
23
|
-
configured: false,
|
|
24
|
-
enabled: true,
|
|
25
|
-
running: false,
|
|
26
|
-
},
|
|
27
|
-
];
|
|
28
|
-
|
|
29
|
-
const issues = collectTwitchStatusIssues(snapshots);
|
|
30
|
-
|
|
31
|
-
expect(issues.length).toBeGreaterThan(0);
|
|
32
|
-
expect(issues[0]?.kind).toBe("config");
|
|
33
|
-
expect(issues[0]?.message).toContain("not properly configured");
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
it("should detect disabled accounts", () => {
|
|
37
|
-
const snapshots: ChannelAccountSnapshot[] = [
|
|
38
|
-
{
|
|
39
|
-
accountId: "default",
|
|
40
|
-
configured: true,
|
|
41
|
-
enabled: false,
|
|
42
|
-
running: false,
|
|
43
|
-
},
|
|
44
|
-
];
|
|
45
|
-
|
|
46
|
-
const issues = collectTwitchStatusIssues(snapshots);
|
|
47
|
-
|
|
48
|
-
expect(issues.length).toBeGreaterThan(0);
|
|
49
|
-
const disabledIssue = issues.find((i) => i.message.includes("disabled"));
|
|
50
|
-
expect(disabledIssue).toBeDefined();
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
it("should detect missing clientId when account configured (simplified config)", () => {
|
|
54
|
-
const snapshots: ChannelAccountSnapshot[] = [
|
|
55
|
-
{
|
|
56
|
-
accountId: "default",
|
|
57
|
-
configured: true,
|
|
58
|
-
enabled: true,
|
|
59
|
-
running: false,
|
|
60
|
-
},
|
|
61
|
-
];
|
|
62
|
-
|
|
63
|
-
const mockCfg = {
|
|
64
|
-
channels: {
|
|
65
|
-
twitch: {
|
|
66
|
-
username: "testbot",
|
|
67
|
-
accessToken: "oauth:test123",
|
|
68
|
-
// clientId missing
|
|
69
|
-
},
|
|
70
|
-
},
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
const issues = collectTwitchStatusIssues(snapshots, () => mockCfg as never);
|
|
74
|
-
|
|
75
|
-
const clientIdIssue = issues.find((i) => i.message.includes("client ID"));
|
|
76
|
-
expect(clientIdIssue).toBeDefined();
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
it("should warn about oauth: prefix in token (simplified config)", () => {
|
|
80
|
-
const snapshots: ChannelAccountSnapshot[] = [
|
|
81
|
-
{
|
|
82
|
-
accountId: "default",
|
|
83
|
-
configured: true,
|
|
84
|
-
enabled: true,
|
|
85
|
-
running: false,
|
|
86
|
-
},
|
|
87
|
-
];
|
|
88
|
-
|
|
89
|
-
const mockCfg = {
|
|
90
|
-
channels: {
|
|
91
|
-
twitch: {
|
|
92
|
-
username: "testbot",
|
|
93
|
-
accessToken: "oauth:test123", // has prefix
|
|
94
|
-
clientId: "test-id",
|
|
95
|
-
},
|
|
96
|
-
},
|
|
97
|
-
};
|
|
98
|
-
|
|
99
|
-
const issues = collectTwitchStatusIssues(snapshots, () => mockCfg as never);
|
|
100
|
-
|
|
101
|
-
const prefixIssue = issues.find((i) => i.message.includes("oauth:"));
|
|
102
|
-
expect(prefixIssue).toBeDefined();
|
|
103
|
-
expect(prefixIssue?.kind).toBe("config");
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
it("should detect clientSecret without refreshToken (simplified config)", () => {
|
|
107
|
-
const snapshots: ChannelAccountSnapshot[] = [
|
|
108
|
-
{
|
|
109
|
-
accountId: "default",
|
|
110
|
-
configured: true,
|
|
111
|
-
enabled: true,
|
|
112
|
-
running: false,
|
|
113
|
-
},
|
|
114
|
-
];
|
|
115
|
-
|
|
116
|
-
const mockCfg = {
|
|
117
|
-
channels: {
|
|
118
|
-
twitch: {
|
|
119
|
-
username: "testbot",
|
|
120
|
-
accessToken: "oauth:test123",
|
|
121
|
-
clientId: "test-id",
|
|
122
|
-
clientSecret: "secret123",
|
|
123
|
-
// refreshToken missing
|
|
124
|
-
},
|
|
125
|
-
},
|
|
126
|
-
};
|
|
127
|
-
|
|
128
|
-
const issues = collectTwitchStatusIssues(snapshots, () => mockCfg as never);
|
|
129
|
-
|
|
130
|
-
const secretIssue = issues.find((i) => i.message.includes("clientSecret"));
|
|
131
|
-
expect(secretIssue).toBeDefined();
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
it("should detect empty allowFrom array (simplified config)", () => {
|
|
135
|
-
const snapshots: ChannelAccountSnapshot[] = [
|
|
136
|
-
{
|
|
137
|
-
accountId: "default",
|
|
138
|
-
configured: true,
|
|
139
|
-
enabled: true,
|
|
140
|
-
running: false,
|
|
141
|
-
},
|
|
142
|
-
];
|
|
143
|
-
|
|
144
|
-
const mockCfg = {
|
|
145
|
-
channels: {
|
|
146
|
-
twitch: {
|
|
147
|
-
username: "testbot",
|
|
148
|
-
accessToken: "test123",
|
|
149
|
-
clientId: "test-id",
|
|
150
|
-
allowFrom: [], // empty array
|
|
151
|
-
},
|
|
152
|
-
},
|
|
153
|
-
};
|
|
154
|
-
|
|
155
|
-
const issues = collectTwitchStatusIssues(snapshots, () => mockCfg as never);
|
|
156
|
-
|
|
157
|
-
const allowFromIssue = issues.find((i) => i.message.includes("allowFrom"));
|
|
158
|
-
expect(allowFromIssue).toBeDefined();
|
|
159
|
-
});
|
|
160
|
-
|
|
161
|
-
it("should detect allowedRoles 'all' with allowFrom conflict (simplified config)", () => {
|
|
162
|
-
const snapshots: ChannelAccountSnapshot[] = [
|
|
163
|
-
{
|
|
164
|
-
accountId: "default",
|
|
165
|
-
configured: true,
|
|
166
|
-
enabled: true,
|
|
167
|
-
running: false,
|
|
168
|
-
},
|
|
169
|
-
];
|
|
170
|
-
|
|
171
|
-
const mockCfg = {
|
|
172
|
-
channels: {
|
|
173
|
-
twitch: {
|
|
174
|
-
username: "testbot",
|
|
175
|
-
accessToken: "test123",
|
|
176
|
-
clientId: "test-id",
|
|
177
|
-
allowedRoles: ["all"],
|
|
178
|
-
allowFrom: ["123456"], // conflict!
|
|
179
|
-
},
|
|
180
|
-
},
|
|
181
|
-
};
|
|
182
|
-
|
|
183
|
-
const issues = collectTwitchStatusIssues(snapshots, () => mockCfg as never);
|
|
184
|
-
|
|
185
|
-
const conflictIssue = issues.find((i) => i.kind === "intent");
|
|
186
|
-
expect(conflictIssue).toBeDefined();
|
|
187
|
-
expect(conflictIssue?.message).toContain("allowedRoles is set to 'all'");
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
it("should detect runtime errors", () => {
|
|
191
|
-
const snapshots: ChannelAccountSnapshot[] = [
|
|
192
|
-
{
|
|
193
|
-
accountId: "default",
|
|
194
|
-
configured: true,
|
|
195
|
-
enabled: true,
|
|
196
|
-
running: false,
|
|
197
|
-
lastError: "Connection timeout",
|
|
198
|
-
},
|
|
199
|
-
];
|
|
200
|
-
|
|
201
|
-
const issues = collectTwitchStatusIssues(snapshots);
|
|
202
|
-
|
|
203
|
-
const runtimeIssue = issues.find((i) => i.kind === "runtime");
|
|
204
|
-
expect(runtimeIssue).toBeDefined();
|
|
205
|
-
expect(runtimeIssue?.message).toContain("Connection timeout");
|
|
206
|
-
});
|
|
207
|
-
|
|
208
|
-
it("should detect accounts that never connected", () => {
|
|
209
|
-
const snapshots: ChannelAccountSnapshot[] = [
|
|
210
|
-
{
|
|
211
|
-
accountId: "default",
|
|
212
|
-
configured: true,
|
|
213
|
-
enabled: true,
|
|
214
|
-
running: false,
|
|
215
|
-
lastStartAt: undefined,
|
|
216
|
-
lastInboundAt: undefined,
|
|
217
|
-
lastOutboundAt: undefined,
|
|
218
|
-
},
|
|
219
|
-
];
|
|
220
|
-
|
|
221
|
-
const issues = collectTwitchStatusIssues(snapshots);
|
|
222
|
-
|
|
223
|
-
const neverConnectedIssue = issues.find((i) =>
|
|
224
|
-
i.message.includes("never connected successfully"),
|
|
225
|
-
);
|
|
226
|
-
expect(neverConnectedIssue).toBeDefined();
|
|
227
|
-
});
|
|
228
|
-
|
|
229
|
-
it("should detect long-running connections", () => {
|
|
230
|
-
const oldDate = Date.now() - 8 * 24 * 60 * 60 * 1000; // 8 days ago
|
|
231
|
-
|
|
232
|
-
const snapshots: ChannelAccountSnapshot[] = [
|
|
233
|
-
{
|
|
234
|
-
accountId: "default",
|
|
235
|
-
configured: true,
|
|
236
|
-
enabled: true,
|
|
237
|
-
running: true,
|
|
238
|
-
lastStartAt: oldDate,
|
|
239
|
-
},
|
|
240
|
-
];
|
|
241
|
-
|
|
242
|
-
const issues = collectTwitchStatusIssues(snapshots);
|
|
243
|
-
|
|
244
|
-
const uptimeIssue = issues.find((i) => i.message.includes("running for"));
|
|
245
|
-
expect(uptimeIssue).toBeDefined();
|
|
246
|
-
});
|
|
247
|
-
|
|
248
|
-
it("should handle empty snapshots array", () => {
|
|
249
|
-
const issues = collectTwitchStatusIssues([]);
|
|
250
|
-
|
|
251
|
-
expect(issues).toEqual([]);
|
|
252
|
-
});
|
|
253
|
-
|
|
254
|
-
it("should skip non-Twitch accounts gracefully", () => {
|
|
255
|
-
const snapshots: ChannelAccountSnapshot[] = [
|
|
256
|
-
{
|
|
257
|
-
accountId: undefined,
|
|
258
|
-
configured: false,
|
|
259
|
-
enabled: true,
|
|
260
|
-
running: false,
|
|
261
|
-
},
|
|
262
|
-
];
|
|
263
|
-
|
|
264
|
-
const issues = collectTwitchStatusIssues(snapshots);
|
|
265
|
-
|
|
266
|
-
// Should not crash, may return empty or minimal issues
|
|
267
|
-
expect(Array.isArray(issues)).toBe(true);
|
|
268
|
-
});
|
|
269
|
-
});
|
|
270
|
-
});
|
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Twitch status issues collector.
|
|
3
|
-
*
|
|
4
|
-
* Detects and reports configuration issues for Twitch accounts.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { getAccountConfig } from "./config.js";
|
|
8
|
-
import type { ChannelAccountSnapshot, ChannelStatusIssue } from "./types.js";
|
|
9
|
-
import { resolveTwitchToken } from "./token.js";
|
|
10
|
-
import { isAccountConfigured } from "./utils/twitch.js";
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Collect status issues for Twitch accounts.
|
|
14
|
-
*
|
|
15
|
-
* Analyzes account snapshots and detects configuration problems,
|
|
16
|
-
* authentication issues, and other potential problems.
|
|
17
|
-
*
|
|
18
|
-
* @param accounts - Array of account snapshots to analyze
|
|
19
|
-
* @param getCfg - Optional function to get full config for additional checks
|
|
20
|
-
* @returns Array of detected status issues
|
|
21
|
-
*
|
|
22
|
-
* @example
|
|
23
|
-
* const issues = collectTwitchStatusIssues(accountSnapshots);
|
|
24
|
-
* if (issues.length > 0) {
|
|
25
|
-
* console.warn("Twitch configuration issues detected:");
|
|
26
|
-
* issues.forEach(issue => console.warn(`- ${issue.message}`));
|
|
27
|
-
* }
|
|
28
|
-
*/
|
|
29
|
-
export function collectTwitchStatusIssues(
|
|
30
|
-
accounts: ChannelAccountSnapshot[],
|
|
31
|
-
getCfg?: () => unknown,
|
|
32
|
-
): ChannelStatusIssue[] {
|
|
33
|
-
const issues: ChannelStatusIssue[] = [];
|
|
34
|
-
|
|
35
|
-
for (const entry of accounts) {
|
|
36
|
-
const accountId = entry.accountId;
|
|
37
|
-
|
|
38
|
-
if (!accountId) continue;
|
|
39
|
-
|
|
40
|
-
let account: ReturnType<typeof getAccountConfig> | null = null;
|
|
41
|
-
let cfg: Parameters<typeof resolveTwitchToken>[0] | undefined;
|
|
42
|
-
if (getCfg) {
|
|
43
|
-
try {
|
|
44
|
-
cfg = getCfg() as {
|
|
45
|
-
channels?: { twitch?: { accounts?: Record<string, unknown> } };
|
|
46
|
-
};
|
|
47
|
-
account = getAccountConfig(cfg, accountId);
|
|
48
|
-
} catch {
|
|
49
|
-
// Ignore config access errors
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
if (!entry.configured) {
|
|
54
|
-
issues.push({
|
|
55
|
-
channel: "twitch",
|
|
56
|
-
accountId,
|
|
57
|
-
kind: "config",
|
|
58
|
-
message: "Twitch account is not properly configured",
|
|
59
|
-
fix: "Add required fields: username, accessToken, and clientId to your account configuration",
|
|
60
|
-
});
|
|
61
|
-
continue;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
if (entry.enabled === false) {
|
|
65
|
-
issues.push({
|
|
66
|
-
channel: "twitch",
|
|
67
|
-
accountId,
|
|
68
|
-
kind: "config",
|
|
69
|
-
message: "Twitch account is disabled",
|
|
70
|
-
fix: "Set enabled: true in your account configuration to enable this account",
|
|
71
|
-
});
|
|
72
|
-
continue;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
if (account && account.username && account.accessToken && !account.clientId) {
|
|
76
|
-
issues.push({
|
|
77
|
-
channel: "twitch",
|
|
78
|
-
accountId,
|
|
79
|
-
kind: "config",
|
|
80
|
-
message: "Twitch client ID is required",
|
|
81
|
-
fix: "Add clientId to your Twitch account configuration (from Twitch Developer Portal)",
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
const tokenResolution = cfg
|
|
86
|
-
? resolveTwitchToken(cfg as Parameters<typeof resolveTwitchToken>[0], { accountId })
|
|
87
|
-
: { token: "", source: "none" };
|
|
88
|
-
if (account && isAccountConfigured(account, tokenResolution.token)) {
|
|
89
|
-
if (account.accessToken?.startsWith("oauth:")) {
|
|
90
|
-
issues.push({
|
|
91
|
-
channel: "twitch",
|
|
92
|
-
accountId,
|
|
93
|
-
kind: "config",
|
|
94
|
-
message: "Token contains 'oauth:' prefix (will be stripped)",
|
|
95
|
-
fix: "The 'oauth:' prefix is optional. You can use just the token value, or keep it as-is (it will be normalized automatically).",
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
if (account.clientSecret && !account.refreshToken) {
|
|
100
|
-
issues.push({
|
|
101
|
-
channel: "twitch",
|
|
102
|
-
accountId,
|
|
103
|
-
kind: "config",
|
|
104
|
-
message: "clientSecret provided without refreshToken",
|
|
105
|
-
fix: "For automatic token refresh, provide both clientSecret and refreshToken. Otherwise, clientSecret is not needed.",
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
if (account.allowFrom && account.allowFrom.length === 0) {
|
|
110
|
-
issues.push({
|
|
111
|
-
channel: "twitch",
|
|
112
|
-
accountId,
|
|
113
|
-
kind: "config",
|
|
114
|
-
message: "allowFrom is configured but empty",
|
|
115
|
-
fix: "Either add user IDs to allowFrom, remove the allowFrom field, or use allowedRoles instead.",
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
if (
|
|
120
|
-
account.allowedRoles?.includes("all") &&
|
|
121
|
-
account.allowFrom &&
|
|
122
|
-
account.allowFrom.length > 0
|
|
123
|
-
) {
|
|
124
|
-
issues.push({
|
|
125
|
-
channel: "twitch",
|
|
126
|
-
accountId,
|
|
127
|
-
kind: "intent",
|
|
128
|
-
message: "allowedRoles is set to 'all' but allowFrom is also configured",
|
|
129
|
-
fix: "When allowedRoles is 'all', the allowFrom list is not needed. Remove allowFrom or set allowedRoles to specific roles.",
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
if (entry.lastError) {
|
|
135
|
-
issues.push({
|
|
136
|
-
channel: "twitch",
|
|
137
|
-
accountId,
|
|
138
|
-
kind: "runtime",
|
|
139
|
-
message: `Last error: ${entry.lastError}`,
|
|
140
|
-
fix: "Check your token validity and network connection. Ensure the bot has the required OAuth scopes.",
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
if (
|
|
145
|
-
entry.configured &&
|
|
146
|
-
!entry.running &&
|
|
147
|
-
!entry.lastStartAt &&
|
|
148
|
-
!entry.lastInboundAt &&
|
|
149
|
-
!entry.lastOutboundAt
|
|
150
|
-
) {
|
|
151
|
-
issues.push({
|
|
152
|
-
channel: "twitch",
|
|
153
|
-
accountId,
|
|
154
|
-
kind: "runtime",
|
|
155
|
-
message: "Account has never connected successfully",
|
|
156
|
-
fix: "Start the Twitch gateway to begin receiving messages. Check logs for connection errors.",
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
if (entry.running && entry.lastStartAt) {
|
|
161
|
-
const uptime = Date.now() - entry.lastStartAt;
|
|
162
|
-
const daysSinceStart = uptime / (1000 * 60 * 60 * 24);
|
|
163
|
-
if (daysSinceStart > 7) {
|
|
164
|
-
issues.push({
|
|
165
|
-
channel: "twitch",
|
|
166
|
-
accountId,
|
|
167
|
-
kind: "runtime",
|
|
168
|
-
message: `Connection has been running for ${Math.floor(daysSinceStart)} days`,
|
|
169
|
-
fix: "Consider restarting the connection periodically to refresh the connection. Twitch tokens may expire after long periods.",
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
return issues;
|
|
176
|
-
}
|
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for token.ts module
|
|
3
|
-
*
|
|
4
|
-
* Tests cover:
|
|
5
|
-
* - Token resolution from config
|
|
6
|
-
* - Token resolution from environment variable
|
|
7
|
-
* - Fallback behavior when token not found
|
|
8
|
-
* - Account ID normalization
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
12
|
-
import { resolveTwitchToken, type TwitchTokenSource } from "./token.js";
|
|
13
|
-
import type { ClawdbotConfig } from "clawdbot/plugin-sdk";
|
|
14
|
-
|
|
15
|
-
describe("token", () => {
|
|
16
|
-
// Multi-account config for testing non-default accounts
|
|
17
|
-
const mockMultiAccountConfig = {
|
|
18
|
-
channels: {
|
|
19
|
-
twitch: {
|
|
20
|
-
accounts: {
|
|
21
|
-
default: {
|
|
22
|
-
username: "testbot",
|
|
23
|
-
accessToken: "oauth:config-token",
|
|
24
|
-
},
|
|
25
|
-
other: {
|
|
26
|
-
username: "otherbot",
|
|
27
|
-
accessToken: "oauth:other-token",
|
|
28
|
-
},
|
|
29
|
-
},
|
|
30
|
-
},
|
|
31
|
-
},
|
|
32
|
-
} as unknown as ClawdbotConfig;
|
|
33
|
-
|
|
34
|
-
// Simplified single-account config
|
|
35
|
-
const mockSimplifiedConfig = {
|
|
36
|
-
channels: {
|
|
37
|
-
twitch: {
|
|
38
|
-
username: "testbot",
|
|
39
|
-
accessToken: "oauth:config-token",
|
|
40
|
-
},
|
|
41
|
-
},
|
|
42
|
-
} as unknown as ClawdbotConfig;
|
|
43
|
-
|
|
44
|
-
beforeEach(() => {
|
|
45
|
-
vi.clearAllMocks();
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
afterEach(() => {
|
|
49
|
-
vi.restoreAllMocks();
|
|
50
|
-
delete process.env.CLAWDBOT_TWITCH_ACCESS_TOKEN;
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
describe("resolveTwitchToken", () => {
|
|
54
|
-
it("should resolve token from simplified config for default account", () => {
|
|
55
|
-
const result = resolveTwitchToken(mockSimplifiedConfig, { accountId: "default" });
|
|
56
|
-
|
|
57
|
-
expect(result.token).toBe("oauth:config-token");
|
|
58
|
-
expect(result.source).toBe("config");
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
it("should resolve token from config for non-default account (multi-account)", () => {
|
|
62
|
-
const result = resolveTwitchToken(mockMultiAccountConfig, { accountId: "other" });
|
|
63
|
-
|
|
64
|
-
expect(result.token).toBe("oauth:other-token");
|
|
65
|
-
expect(result.source).toBe("config");
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
it("should prioritize config token over env var (simplified config)", () => {
|
|
69
|
-
process.env.CLAWDBOT_TWITCH_ACCESS_TOKEN = "oauth:env-token";
|
|
70
|
-
|
|
71
|
-
const result = resolveTwitchToken(mockSimplifiedConfig, { accountId: "default" });
|
|
72
|
-
|
|
73
|
-
// Config token should be used even if env var exists
|
|
74
|
-
expect(result.token).toBe("oauth:config-token");
|
|
75
|
-
expect(result.source).toBe("config");
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
it("should use env var when config token is empty (simplified config)", () => {
|
|
79
|
-
process.env.CLAWDBOT_TWITCH_ACCESS_TOKEN = "oauth:env-token";
|
|
80
|
-
|
|
81
|
-
const configWithEmptyToken = {
|
|
82
|
-
channels: {
|
|
83
|
-
twitch: {
|
|
84
|
-
username: "testbot",
|
|
85
|
-
accessToken: "",
|
|
86
|
-
},
|
|
87
|
-
},
|
|
88
|
-
} as unknown as ClawdbotConfig;
|
|
89
|
-
|
|
90
|
-
const result = resolveTwitchToken(configWithEmptyToken, { accountId: "default" });
|
|
91
|
-
|
|
92
|
-
expect(result.token).toBe("oauth:env-token");
|
|
93
|
-
expect(result.source).toBe("env");
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
it("should return empty token when neither config nor env has token (simplified config)", () => {
|
|
97
|
-
const configWithoutToken = {
|
|
98
|
-
channels: {
|
|
99
|
-
twitch: {
|
|
100
|
-
username: "testbot",
|
|
101
|
-
accessToken: "",
|
|
102
|
-
},
|
|
103
|
-
},
|
|
104
|
-
} as unknown as ClawdbotConfig;
|
|
105
|
-
|
|
106
|
-
const result = resolveTwitchToken(configWithoutToken, { accountId: "default" });
|
|
107
|
-
|
|
108
|
-
expect(result.token).toBe("");
|
|
109
|
-
expect(result.source).toBe("none");
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
it("should not use env var for non-default accounts (multi-account)", () => {
|
|
113
|
-
process.env.CLAWDBOT_TWITCH_ACCESS_TOKEN = "oauth:env-token";
|
|
114
|
-
|
|
115
|
-
const configWithoutToken = {
|
|
116
|
-
channels: {
|
|
117
|
-
twitch: {
|
|
118
|
-
accounts: {
|
|
119
|
-
secondary: {
|
|
120
|
-
username: "secondary",
|
|
121
|
-
accessToken: "",
|
|
122
|
-
},
|
|
123
|
-
},
|
|
124
|
-
},
|
|
125
|
-
},
|
|
126
|
-
} as unknown as ClawdbotConfig;
|
|
127
|
-
|
|
128
|
-
const result = resolveTwitchToken(configWithoutToken, { accountId: "secondary" });
|
|
129
|
-
|
|
130
|
-
// Non-default accounts shouldn't use env var
|
|
131
|
-
expect(result.token).toBe("");
|
|
132
|
-
expect(result.source).toBe("none");
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
it("should handle missing account gracefully", () => {
|
|
136
|
-
const configWithoutAccount = {
|
|
137
|
-
channels: {
|
|
138
|
-
twitch: {
|
|
139
|
-
accounts: {},
|
|
140
|
-
},
|
|
141
|
-
},
|
|
142
|
-
} as unknown as ClawdbotConfig;
|
|
143
|
-
|
|
144
|
-
const result = resolveTwitchToken(configWithoutAccount, { accountId: "nonexistent" });
|
|
145
|
-
|
|
146
|
-
expect(result.token).toBe("");
|
|
147
|
-
expect(result.source).toBe("none");
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
it("should handle missing Twitch config section", () => {
|
|
151
|
-
const configWithoutSection = {
|
|
152
|
-
channels: {},
|
|
153
|
-
} as unknown as ClawdbotConfig;
|
|
154
|
-
|
|
155
|
-
const result = resolveTwitchToken(configWithoutSection, { accountId: "default" });
|
|
156
|
-
|
|
157
|
-
expect(result.token).toBe("");
|
|
158
|
-
expect(result.source).toBe("none");
|
|
159
|
-
});
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
describe("TwitchTokenSource type", () => {
|
|
163
|
-
it("should have correct values", () => {
|
|
164
|
-
const sources: TwitchTokenSource[] = ["env", "config", "none"];
|
|
165
|
-
|
|
166
|
-
expect(sources).toContain("env");
|
|
167
|
-
expect(sources).toContain("config");
|
|
168
|
-
expect(sources).toContain("none");
|
|
169
|
-
});
|
|
170
|
-
});
|
|
171
|
-
});
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Twitch access token resolution with environment variable support.
|
|
3
|
-
*
|
|
4
|
-
* Supports reading Twitch OAuth access tokens from config or environment variable.
|
|
5
|
-
* The CLAWDBOT_TWITCH_ACCESS_TOKEN env var is only used for the default account.
|
|
6
|
-
*
|
|
7
|
-
* Token resolution priority:
|
|
8
|
-
* 1. Account access token from merged config (accounts.{id} or base-level for default)
|
|
9
|
-
* 2. Environment variable: CLAWDBOT_TWITCH_ACCESS_TOKEN (default account only)
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import type { ClawdbotConfig } from "../../../src/config/config.js";
|
|
13
|
-
import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "../../../src/routing/session-key.js";
|
|
14
|
-
|
|
15
|
-
export type TwitchTokenSource = "env" | "config" | "none";
|
|
16
|
-
|
|
17
|
-
export type TwitchTokenResolution = {
|
|
18
|
-
token: string;
|
|
19
|
-
source: TwitchTokenSource;
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Normalize a Twitch OAuth token - ensure it has the oauth: prefix
|
|
24
|
-
*/
|
|
25
|
-
function normalizeTwitchToken(raw?: string | null): string | undefined {
|
|
26
|
-
if (!raw) return undefined;
|
|
27
|
-
const trimmed = raw.trim();
|
|
28
|
-
if (!trimmed) return undefined;
|
|
29
|
-
// Twitch tokens should have oauth: prefix
|
|
30
|
-
return trimmed.startsWith("oauth:") ? trimmed : `oauth:${trimmed}`;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Resolve Twitch access token from config or environment variable.
|
|
35
|
-
*
|
|
36
|
-
* Priority:
|
|
37
|
-
* 1. Account access token (from merged config - base-level for default, or accounts.{accountId})
|
|
38
|
-
* 2. Environment variable: CLAWDBOT_TWITCH_ACCESS_TOKEN (default account only)
|
|
39
|
-
*
|
|
40
|
-
* The getAccountConfig function handles merging base-level config with accounts.default,
|
|
41
|
-
* so this logic works for both simplified and multi-account patterns.
|
|
42
|
-
*
|
|
43
|
-
* @param cfg - Clawdbot config
|
|
44
|
-
* @param opts - Options including accountId and optional envToken override
|
|
45
|
-
* @returns Token resolution with source
|
|
46
|
-
*/
|
|
47
|
-
export function resolveTwitchToken(
|
|
48
|
-
cfg?: ClawdbotConfig,
|
|
49
|
-
opts: { accountId?: string | null; envToken?: string | null } = {},
|
|
50
|
-
): TwitchTokenResolution {
|
|
51
|
-
const accountId = normalizeAccountId(opts.accountId);
|
|
52
|
-
|
|
53
|
-
// Get merged account config (handles both simplified and multi-account patterns)
|
|
54
|
-
const twitchCfg = cfg?.channels?.twitch;
|
|
55
|
-
const accountCfg =
|
|
56
|
-
accountId === DEFAULT_ACCOUNT_ID
|
|
57
|
-
? (twitchCfg?.accounts?.[DEFAULT_ACCOUNT_ID] as Record<string, unknown> | undefined)
|
|
58
|
-
: (twitchCfg?.accounts?.[accountId as string] as Record<string, unknown> | undefined);
|
|
59
|
-
|
|
60
|
-
// For default account, also check base-level config
|
|
61
|
-
let token: string | undefined;
|
|
62
|
-
if (accountId === DEFAULT_ACCOUNT_ID) {
|
|
63
|
-
// Base-level config takes precedence
|
|
64
|
-
token = normalizeTwitchToken(
|
|
65
|
-
(typeof twitchCfg?.accessToken === "string" ? twitchCfg.accessToken : undefined) ||
|
|
66
|
-
(accountCfg?.accessToken as string | undefined),
|
|
67
|
-
);
|
|
68
|
-
} else {
|
|
69
|
-
// Non-default accounts only use accounts object
|
|
70
|
-
token = normalizeTwitchToken(accountCfg?.accessToken as string | undefined);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
if (token) {
|
|
74
|
-
return { token, source: "config" };
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// Environment variable (default account only)
|
|
78
|
-
const allowEnv = accountId === DEFAULT_ACCOUNT_ID;
|
|
79
|
-
const envToken = allowEnv
|
|
80
|
-
? normalizeTwitchToken(opts.envToken ?? process.env.CLAWDBOT_TWITCH_ACCESS_TOKEN)
|
|
81
|
-
: undefined;
|
|
82
|
-
if (envToken) {
|
|
83
|
-
return { token: envToken, source: "env" };
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
return { token: "", source: "none" };
|
|
87
|
-
}
|