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,70 +0,0 @@
|
|
|
1
|
-
import { normalizeMattermostBaseUrl, type MattermostUser } from "./client.js";
|
|
2
|
-
|
|
3
|
-
export type MattermostProbe = {
|
|
4
|
-
ok: boolean;
|
|
5
|
-
status?: number | null;
|
|
6
|
-
error?: string | null;
|
|
7
|
-
elapsedMs?: number | null;
|
|
8
|
-
bot?: MattermostUser;
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
async function readMattermostError(res: Response): Promise<string> {
|
|
12
|
-
const contentType = res.headers.get("content-type") ?? "";
|
|
13
|
-
if (contentType.includes("application/json")) {
|
|
14
|
-
const data = (await res.json()) as { message?: string } | undefined;
|
|
15
|
-
if (data?.message) return data.message;
|
|
16
|
-
return JSON.stringify(data);
|
|
17
|
-
}
|
|
18
|
-
return await res.text();
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export async function probeMattermost(
|
|
22
|
-
baseUrl: string,
|
|
23
|
-
botToken: string,
|
|
24
|
-
timeoutMs = 2500,
|
|
25
|
-
): Promise<MattermostProbe> {
|
|
26
|
-
const normalized = normalizeMattermostBaseUrl(baseUrl);
|
|
27
|
-
if (!normalized) {
|
|
28
|
-
return { ok: false, error: "baseUrl missing" };
|
|
29
|
-
}
|
|
30
|
-
const url = `${normalized}/api/v4/users/me`;
|
|
31
|
-
const start = Date.now();
|
|
32
|
-
const controller = timeoutMs > 0 ? new AbortController() : undefined;
|
|
33
|
-
let timer: NodeJS.Timeout | null = null;
|
|
34
|
-
if (controller) {
|
|
35
|
-
timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
36
|
-
}
|
|
37
|
-
try {
|
|
38
|
-
const res = await fetch(url, {
|
|
39
|
-
headers: { Authorization: `Bearer ${botToken}` },
|
|
40
|
-
signal: controller?.signal,
|
|
41
|
-
});
|
|
42
|
-
const elapsedMs = Date.now() - start;
|
|
43
|
-
if (!res.ok) {
|
|
44
|
-
const detail = await readMattermostError(res);
|
|
45
|
-
return {
|
|
46
|
-
ok: false,
|
|
47
|
-
status: res.status,
|
|
48
|
-
error: detail || res.statusText,
|
|
49
|
-
elapsedMs,
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
const bot = (await res.json()) as MattermostUser;
|
|
53
|
-
return {
|
|
54
|
-
ok: true,
|
|
55
|
-
status: res.status,
|
|
56
|
-
elapsedMs,
|
|
57
|
-
bot,
|
|
58
|
-
};
|
|
59
|
-
} catch (err) {
|
|
60
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
61
|
-
return {
|
|
62
|
-
ok: false,
|
|
63
|
-
status: null,
|
|
64
|
-
error: message,
|
|
65
|
-
elapsedMs: Date.now() - start,
|
|
66
|
-
};
|
|
67
|
-
} finally {
|
|
68
|
-
if (timer) clearTimeout(timer);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
@@ -1,217 +0,0 @@
|
|
|
1
|
-
import { getMattermostRuntime } from "../runtime.js";
|
|
2
|
-
import { resolveMattermostAccount } from "./accounts.js";
|
|
3
|
-
import {
|
|
4
|
-
createMattermostClient,
|
|
5
|
-
createMattermostDirectChannel,
|
|
6
|
-
createMattermostPost,
|
|
7
|
-
fetchMattermostMe,
|
|
8
|
-
fetchMattermostUserByUsername,
|
|
9
|
-
normalizeMattermostBaseUrl,
|
|
10
|
-
uploadMattermostFile,
|
|
11
|
-
type MattermostUser,
|
|
12
|
-
} from "./client.js";
|
|
13
|
-
|
|
14
|
-
export type MattermostSendOpts = {
|
|
15
|
-
botToken?: string;
|
|
16
|
-
baseUrl?: string;
|
|
17
|
-
accountId?: string;
|
|
18
|
-
mediaUrl?: string;
|
|
19
|
-
replyToId?: string;
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
export type MattermostSendResult = {
|
|
23
|
-
messageId: string;
|
|
24
|
-
channelId: string;
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
type MattermostTarget =
|
|
28
|
-
| { kind: "channel"; id: string }
|
|
29
|
-
| { kind: "user"; id?: string; username?: string };
|
|
30
|
-
|
|
31
|
-
const botUserCache = new Map<string, MattermostUser>();
|
|
32
|
-
const userByNameCache = new Map<string, MattermostUser>();
|
|
33
|
-
|
|
34
|
-
const getCore = () => getMattermostRuntime();
|
|
35
|
-
|
|
36
|
-
function cacheKey(baseUrl: string, token: string): string {
|
|
37
|
-
return `${baseUrl}::${token}`;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
function normalizeMessage(text: string, mediaUrl?: string): string {
|
|
41
|
-
const trimmed = text.trim();
|
|
42
|
-
const media = mediaUrl?.trim();
|
|
43
|
-
return [trimmed, media].filter(Boolean).join("\n");
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
function isHttpUrl(value: string): boolean {
|
|
47
|
-
return /^https?:\/\//i.test(value);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
function parseMattermostTarget(raw: string): MattermostTarget {
|
|
51
|
-
const trimmed = raw.trim();
|
|
52
|
-
if (!trimmed) throw new Error("Recipient is required for Mattermost sends");
|
|
53
|
-
const lower = trimmed.toLowerCase();
|
|
54
|
-
if (lower.startsWith("channel:")) {
|
|
55
|
-
const id = trimmed.slice("channel:".length).trim();
|
|
56
|
-
if (!id) throw new Error("Channel id is required for Mattermost sends");
|
|
57
|
-
return { kind: "channel", id };
|
|
58
|
-
}
|
|
59
|
-
if (lower.startsWith("user:")) {
|
|
60
|
-
const id = trimmed.slice("user:".length).trim();
|
|
61
|
-
if (!id) throw new Error("User id is required for Mattermost sends");
|
|
62
|
-
return { kind: "user", id };
|
|
63
|
-
}
|
|
64
|
-
if (lower.startsWith("mattermost:")) {
|
|
65
|
-
const id = trimmed.slice("mattermost:".length).trim();
|
|
66
|
-
if (!id) throw new Error("User id is required for Mattermost sends");
|
|
67
|
-
return { kind: "user", id };
|
|
68
|
-
}
|
|
69
|
-
if (trimmed.startsWith("@")) {
|
|
70
|
-
const username = trimmed.slice(1).trim();
|
|
71
|
-
if (!username) {
|
|
72
|
-
throw new Error("Username is required for Mattermost sends");
|
|
73
|
-
}
|
|
74
|
-
return { kind: "user", username };
|
|
75
|
-
}
|
|
76
|
-
return { kind: "channel", id: trimmed };
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
async function resolveBotUser(baseUrl: string, token: string): Promise<MattermostUser> {
|
|
80
|
-
const key = cacheKey(baseUrl, token);
|
|
81
|
-
const cached = botUserCache.get(key);
|
|
82
|
-
if (cached) return cached;
|
|
83
|
-
const client = createMattermostClient({ baseUrl, botToken: token });
|
|
84
|
-
const user = await fetchMattermostMe(client);
|
|
85
|
-
botUserCache.set(key, user);
|
|
86
|
-
return user;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
async function resolveUserIdByUsername(params: {
|
|
90
|
-
baseUrl: string;
|
|
91
|
-
token: string;
|
|
92
|
-
username: string;
|
|
93
|
-
}): Promise<string> {
|
|
94
|
-
const { baseUrl, token, username } = params;
|
|
95
|
-
const key = `${cacheKey(baseUrl, token)}::${username.toLowerCase()}`;
|
|
96
|
-
const cached = userByNameCache.get(key);
|
|
97
|
-
if (cached?.id) return cached.id;
|
|
98
|
-
const client = createMattermostClient({ baseUrl, botToken: token });
|
|
99
|
-
const user = await fetchMattermostUserByUsername(client, username);
|
|
100
|
-
userByNameCache.set(key, user);
|
|
101
|
-
return user.id;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
async function resolveTargetChannelId(params: {
|
|
105
|
-
target: MattermostTarget;
|
|
106
|
-
baseUrl: string;
|
|
107
|
-
token: string;
|
|
108
|
-
}): Promise<string> {
|
|
109
|
-
if (params.target.kind === "channel") return params.target.id;
|
|
110
|
-
const userId = params.target.id
|
|
111
|
-
? params.target.id
|
|
112
|
-
: await resolveUserIdByUsername({
|
|
113
|
-
baseUrl: params.baseUrl,
|
|
114
|
-
token: params.token,
|
|
115
|
-
username: params.target.username ?? "",
|
|
116
|
-
});
|
|
117
|
-
const botUser = await resolveBotUser(params.baseUrl, params.token);
|
|
118
|
-
const client = createMattermostClient({
|
|
119
|
-
baseUrl: params.baseUrl,
|
|
120
|
-
botToken: params.token,
|
|
121
|
-
});
|
|
122
|
-
const channel = await createMattermostDirectChannel(client, [botUser.id, userId]);
|
|
123
|
-
return channel.id;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
export async function sendMessageMattermost(
|
|
127
|
-
to: string,
|
|
128
|
-
text: string,
|
|
129
|
-
opts: MattermostSendOpts = {},
|
|
130
|
-
): Promise<MattermostSendResult> {
|
|
131
|
-
const core = getCore();
|
|
132
|
-
const logger = core.logging.getChildLogger({ module: "mattermost" });
|
|
133
|
-
const cfg = core.config.loadConfig();
|
|
134
|
-
const account = resolveMattermostAccount({
|
|
135
|
-
cfg,
|
|
136
|
-
accountId: opts.accountId,
|
|
137
|
-
});
|
|
138
|
-
const token = opts.botToken?.trim() || account.botToken?.trim();
|
|
139
|
-
if (!token) {
|
|
140
|
-
throw new Error(
|
|
141
|
-
`Mattermost bot token missing for account "${account.accountId}" (set channels.mattermost.accounts.${account.accountId}.botToken or MATTERMOST_BOT_TOKEN for default).`,
|
|
142
|
-
);
|
|
143
|
-
}
|
|
144
|
-
const baseUrl = normalizeMattermostBaseUrl(opts.baseUrl ?? account.baseUrl);
|
|
145
|
-
if (!baseUrl) {
|
|
146
|
-
throw new Error(
|
|
147
|
-
`Mattermost baseUrl missing for account "${account.accountId}" (set channels.mattermost.accounts.${account.accountId}.baseUrl or MATTERMOST_URL for default).`,
|
|
148
|
-
);
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
const target = parseMattermostTarget(to);
|
|
152
|
-
const channelId = await resolveTargetChannelId({
|
|
153
|
-
target,
|
|
154
|
-
baseUrl,
|
|
155
|
-
token,
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
const client = createMattermostClient({ baseUrl, botToken: token });
|
|
159
|
-
let message = text?.trim() ?? "";
|
|
160
|
-
let fileIds: string[] | undefined;
|
|
161
|
-
let uploadError: Error | undefined;
|
|
162
|
-
const mediaUrl = opts.mediaUrl?.trim();
|
|
163
|
-
if (mediaUrl) {
|
|
164
|
-
try {
|
|
165
|
-
const media = await core.media.loadWebMedia(mediaUrl);
|
|
166
|
-
const fileInfo = await uploadMattermostFile(client, {
|
|
167
|
-
channelId,
|
|
168
|
-
buffer: media.buffer,
|
|
169
|
-
fileName: media.fileName ?? "upload",
|
|
170
|
-
contentType: media.contentType ?? undefined,
|
|
171
|
-
});
|
|
172
|
-
fileIds = [fileInfo.id];
|
|
173
|
-
} catch (err) {
|
|
174
|
-
uploadError = err instanceof Error ? err : new Error(String(err));
|
|
175
|
-
if (core.logging.shouldLogVerbose()) {
|
|
176
|
-
logger.debug?.(
|
|
177
|
-
`mattermost send: media upload failed, falling back to URL text: ${String(err)}`,
|
|
178
|
-
);
|
|
179
|
-
}
|
|
180
|
-
message = normalizeMessage(message, isHttpUrl(mediaUrl) ? mediaUrl : "");
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
if (message) {
|
|
185
|
-
const tableMode = core.channel.text.resolveMarkdownTableMode({
|
|
186
|
-
cfg,
|
|
187
|
-
channel: "mattermost",
|
|
188
|
-
accountId: account.accountId,
|
|
189
|
-
});
|
|
190
|
-
message = core.channel.text.convertMarkdownTables(message, tableMode);
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
if (!message && (!fileIds || fileIds.length === 0)) {
|
|
194
|
-
if (uploadError) {
|
|
195
|
-
throw new Error(`Mattermost media upload failed: ${uploadError.message}`);
|
|
196
|
-
}
|
|
197
|
-
throw new Error("Mattermost message is empty");
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
const post = await createMattermostPost(client, {
|
|
201
|
-
channelId,
|
|
202
|
-
message,
|
|
203
|
-
rootId: opts.replyToId,
|
|
204
|
-
fileIds,
|
|
205
|
-
});
|
|
206
|
-
|
|
207
|
-
core.channel.activity.record({
|
|
208
|
-
channel: "mattermost",
|
|
209
|
-
accountId: account.accountId,
|
|
210
|
-
direction: "outbound",
|
|
211
|
-
});
|
|
212
|
-
|
|
213
|
-
return {
|
|
214
|
-
messageId: post.id ?? "unknown",
|
|
215
|
-
channelId,
|
|
216
|
-
};
|
|
217
|
-
}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
export function normalizeMattermostMessagingTarget(raw: string): string | undefined {
|
|
2
|
-
const trimmed = raw.trim();
|
|
3
|
-
if (!trimmed) return undefined;
|
|
4
|
-
const lower = trimmed.toLowerCase();
|
|
5
|
-
if (lower.startsWith("channel:")) {
|
|
6
|
-
const id = trimmed.slice("channel:".length).trim();
|
|
7
|
-
return id ? `channel:${id}` : undefined;
|
|
8
|
-
}
|
|
9
|
-
if (lower.startsWith("group:")) {
|
|
10
|
-
const id = trimmed.slice("group:".length).trim();
|
|
11
|
-
return id ? `channel:${id}` : undefined;
|
|
12
|
-
}
|
|
13
|
-
if (lower.startsWith("user:")) {
|
|
14
|
-
const id = trimmed.slice("user:".length).trim();
|
|
15
|
-
return id ? `user:${id}` : undefined;
|
|
16
|
-
}
|
|
17
|
-
if (lower.startsWith("mattermost:")) {
|
|
18
|
-
const id = trimmed.slice("mattermost:".length).trim();
|
|
19
|
-
return id ? `user:${id}` : undefined;
|
|
20
|
-
}
|
|
21
|
-
if (trimmed.startsWith("@")) {
|
|
22
|
-
const id = trimmed.slice(1).trim();
|
|
23
|
-
return id ? `@${id}` : undefined;
|
|
24
|
-
}
|
|
25
|
-
if (trimmed.startsWith("#")) {
|
|
26
|
-
const id = trimmed.slice(1).trim();
|
|
27
|
-
return id ? `channel:${id}` : undefined;
|
|
28
|
-
}
|
|
29
|
-
return `channel:${trimmed}`;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export function looksLikeMattermostTargetId(raw: string): boolean {
|
|
33
|
-
const trimmed = raw.trim();
|
|
34
|
-
if (!trimmed) return false;
|
|
35
|
-
if (/^(user|channel|group|mattermost):/i.test(trimmed)) return true;
|
|
36
|
-
if (/^[@#]/.test(trimmed)) return true;
|
|
37
|
-
return /^[a-z0-9]{8,}$/i.test(trimmed);
|
|
38
|
-
}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import type { ClawdbotConfig, WizardPrompter } from "clawdbot/plugin-sdk";
|
|
2
|
-
import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "clawdbot/plugin-sdk";
|
|
3
|
-
|
|
4
|
-
type PromptAccountIdParams = {
|
|
5
|
-
cfg: ClawdbotConfig;
|
|
6
|
-
prompter: WizardPrompter;
|
|
7
|
-
label: string;
|
|
8
|
-
currentId?: string;
|
|
9
|
-
listAccountIds: (cfg: ClawdbotConfig) => string[];
|
|
10
|
-
defaultAccountId: string;
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
export async function promptAccountId(params: PromptAccountIdParams): Promise<string> {
|
|
14
|
-
const existingIds = params.listAccountIds(params.cfg);
|
|
15
|
-
const initial = params.currentId?.trim() || params.defaultAccountId || DEFAULT_ACCOUNT_ID;
|
|
16
|
-
const choice = (await params.prompter.select({
|
|
17
|
-
message: `${params.label} account`,
|
|
18
|
-
options: [
|
|
19
|
-
...existingIds.map((id) => ({
|
|
20
|
-
value: id,
|
|
21
|
-
label: id === DEFAULT_ACCOUNT_ID ? "default (primary)" : id,
|
|
22
|
-
})),
|
|
23
|
-
{ value: "__new__", label: "Add a new account" },
|
|
24
|
-
],
|
|
25
|
-
initialValue: initial,
|
|
26
|
-
})) as string;
|
|
27
|
-
|
|
28
|
-
if (choice !== "__new__") return normalizeAccountId(choice);
|
|
29
|
-
|
|
30
|
-
const entered = await params.prompter.text({
|
|
31
|
-
message: `New ${params.label} account id`,
|
|
32
|
-
validate: (value) => (value?.trim() ? undefined : "Required"),
|
|
33
|
-
});
|
|
34
|
-
const normalized = normalizeAccountId(String(entered));
|
|
35
|
-
if (String(entered).trim() !== normalized) {
|
|
36
|
-
await params.prompter.note(
|
|
37
|
-
`Normalized account id to "${normalized}".`,
|
|
38
|
-
`${params.label} account`,
|
|
39
|
-
);
|
|
40
|
-
}
|
|
41
|
-
return normalized;
|
|
42
|
-
}
|
|
@@ -1,187 +0,0 @@
|
|
|
1
|
-
import type { ChannelOnboardingAdapter, ClawdbotConfig, WizardPrompter } from "clawdbot/plugin-sdk";
|
|
2
|
-
import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "clawdbot/plugin-sdk";
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
listMattermostAccountIds,
|
|
6
|
-
resolveDefaultMattermostAccountId,
|
|
7
|
-
resolveMattermostAccount,
|
|
8
|
-
} from "./mattermost/accounts.js";
|
|
9
|
-
import { promptAccountId } from "./onboarding-helpers.js";
|
|
10
|
-
|
|
11
|
-
const channel = "mattermost" as const;
|
|
12
|
-
|
|
13
|
-
async function noteMattermostSetup(prompter: WizardPrompter): Promise<void> {
|
|
14
|
-
await prompter.note(
|
|
15
|
-
[
|
|
16
|
-
"1) Mattermost System Console -> Integrations -> Bot Accounts",
|
|
17
|
-
"2) Create a bot + copy its token",
|
|
18
|
-
"3) Use your server base URL (e.g., https://chat.example.com)",
|
|
19
|
-
"Tip: the bot must be a member of any channel you want it to monitor.",
|
|
20
|
-
"Docs: https://docs.clawd.bot/channels/mattermost",
|
|
21
|
-
].join("\n"),
|
|
22
|
-
"Mattermost bot token",
|
|
23
|
-
);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export const mattermostOnboardingAdapter: ChannelOnboardingAdapter = {
|
|
27
|
-
channel,
|
|
28
|
-
getStatus: async ({ cfg }) => {
|
|
29
|
-
const configured = listMattermostAccountIds(cfg).some((accountId) => {
|
|
30
|
-
const account = resolveMattermostAccount({ cfg, accountId });
|
|
31
|
-
return Boolean(account.botToken && account.baseUrl);
|
|
32
|
-
});
|
|
33
|
-
return {
|
|
34
|
-
channel,
|
|
35
|
-
configured,
|
|
36
|
-
statusLines: [`Mattermost: ${configured ? "configured" : "needs token + url"}`],
|
|
37
|
-
selectionHint: configured ? "configured" : "needs setup",
|
|
38
|
-
quickstartScore: configured ? 2 : 1,
|
|
39
|
-
};
|
|
40
|
-
},
|
|
41
|
-
configure: async ({ cfg, prompter, accountOverrides, shouldPromptAccountIds }) => {
|
|
42
|
-
const override = accountOverrides.mattermost?.trim();
|
|
43
|
-
const defaultAccountId = resolveDefaultMattermostAccountId(cfg);
|
|
44
|
-
let accountId = override ? normalizeAccountId(override) : defaultAccountId;
|
|
45
|
-
if (shouldPromptAccountIds && !override) {
|
|
46
|
-
accountId = await promptAccountId({
|
|
47
|
-
cfg,
|
|
48
|
-
prompter,
|
|
49
|
-
label: "Mattermost",
|
|
50
|
-
currentId: accountId,
|
|
51
|
-
listAccountIds: listMattermostAccountIds,
|
|
52
|
-
defaultAccountId,
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
let next = cfg;
|
|
57
|
-
const resolvedAccount = resolveMattermostAccount({
|
|
58
|
-
cfg: next,
|
|
59
|
-
accountId,
|
|
60
|
-
});
|
|
61
|
-
const accountConfigured = Boolean(resolvedAccount.botToken && resolvedAccount.baseUrl);
|
|
62
|
-
const allowEnv = accountId === DEFAULT_ACCOUNT_ID;
|
|
63
|
-
const canUseEnv =
|
|
64
|
-
allowEnv &&
|
|
65
|
-
Boolean(process.env.MATTERMOST_BOT_TOKEN?.trim()) &&
|
|
66
|
-
Boolean(process.env.MATTERMOST_URL?.trim());
|
|
67
|
-
const hasConfigValues =
|
|
68
|
-
Boolean(resolvedAccount.config.botToken) || Boolean(resolvedAccount.config.baseUrl);
|
|
69
|
-
|
|
70
|
-
let botToken: string | null = null;
|
|
71
|
-
let baseUrl: string | null = null;
|
|
72
|
-
|
|
73
|
-
if (!accountConfigured) {
|
|
74
|
-
await noteMattermostSetup(prompter);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
if (canUseEnv && !hasConfigValues) {
|
|
78
|
-
const keepEnv = await prompter.confirm({
|
|
79
|
-
message: "MATTERMOST_BOT_TOKEN + MATTERMOST_URL detected. Use env vars?",
|
|
80
|
-
initialValue: true,
|
|
81
|
-
});
|
|
82
|
-
if (keepEnv) {
|
|
83
|
-
next = {
|
|
84
|
-
...next,
|
|
85
|
-
channels: {
|
|
86
|
-
...next.channels,
|
|
87
|
-
mattermost: {
|
|
88
|
-
...next.channels?.mattermost,
|
|
89
|
-
enabled: true,
|
|
90
|
-
},
|
|
91
|
-
},
|
|
92
|
-
};
|
|
93
|
-
} else {
|
|
94
|
-
botToken = String(
|
|
95
|
-
await prompter.text({
|
|
96
|
-
message: "Enter Mattermost bot token",
|
|
97
|
-
validate: (value) => (value?.trim() ? undefined : "Required"),
|
|
98
|
-
}),
|
|
99
|
-
).trim();
|
|
100
|
-
baseUrl = String(
|
|
101
|
-
await prompter.text({
|
|
102
|
-
message: "Enter Mattermost base URL",
|
|
103
|
-
validate: (value) => (value?.trim() ? undefined : "Required"),
|
|
104
|
-
}),
|
|
105
|
-
).trim();
|
|
106
|
-
}
|
|
107
|
-
} else if (accountConfigured) {
|
|
108
|
-
const keep = await prompter.confirm({
|
|
109
|
-
message: "Mattermost credentials already configured. Keep them?",
|
|
110
|
-
initialValue: true,
|
|
111
|
-
});
|
|
112
|
-
if (!keep) {
|
|
113
|
-
botToken = String(
|
|
114
|
-
await prompter.text({
|
|
115
|
-
message: "Enter Mattermost bot token",
|
|
116
|
-
validate: (value) => (value?.trim() ? undefined : "Required"),
|
|
117
|
-
}),
|
|
118
|
-
).trim();
|
|
119
|
-
baseUrl = String(
|
|
120
|
-
await prompter.text({
|
|
121
|
-
message: "Enter Mattermost base URL",
|
|
122
|
-
validate: (value) => (value?.trim() ? undefined : "Required"),
|
|
123
|
-
}),
|
|
124
|
-
).trim();
|
|
125
|
-
}
|
|
126
|
-
} else {
|
|
127
|
-
botToken = String(
|
|
128
|
-
await prompter.text({
|
|
129
|
-
message: "Enter Mattermost bot token",
|
|
130
|
-
validate: (value) => (value?.trim() ? undefined : "Required"),
|
|
131
|
-
}),
|
|
132
|
-
).trim();
|
|
133
|
-
baseUrl = String(
|
|
134
|
-
await prompter.text({
|
|
135
|
-
message: "Enter Mattermost base URL",
|
|
136
|
-
validate: (value) => (value?.trim() ? undefined : "Required"),
|
|
137
|
-
}),
|
|
138
|
-
).trim();
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
if (botToken || baseUrl) {
|
|
142
|
-
if (accountId === DEFAULT_ACCOUNT_ID) {
|
|
143
|
-
next = {
|
|
144
|
-
...next,
|
|
145
|
-
channels: {
|
|
146
|
-
...next.channels,
|
|
147
|
-
mattermost: {
|
|
148
|
-
...next.channels?.mattermost,
|
|
149
|
-
enabled: true,
|
|
150
|
-
...(botToken ? { botToken } : {}),
|
|
151
|
-
...(baseUrl ? { baseUrl } : {}),
|
|
152
|
-
},
|
|
153
|
-
},
|
|
154
|
-
};
|
|
155
|
-
} else {
|
|
156
|
-
next = {
|
|
157
|
-
...next,
|
|
158
|
-
channels: {
|
|
159
|
-
...next.channels,
|
|
160
|
-
mattermost: {
|
|
161
|
-
...next.channels?.mattermost,
|
|
162
|
-
enabled: true,
|
|
163
|
-
accounts: {
|
|
164
|
-
...next.channels?.mattermost?.accounts,
|
|
165
|
-
[accountId]: {
|
|
166
|
-
...next.channels?.mattermost?.accounts?.[accountId],
|
|
167
|
-
enabled: next.channels?.mattermost?.accounts?.[accountId]?.enabled ?? true,
|
|
168
|
-
...(botToken ? { botToken } : {}),
|
|
169
|
-
...(baseUrl ? { baseUrl } : {}),
|
|
170
|
-
},
|
|
171
|
-
},
|
|
172
|
-
},
|
|
173
|
-
},
|
|
174
|
-
};
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
return { cfg: next, accountId };
|
|
179
|
-
},
|
|
180
|
-
disable: (cfg: ClawdbotConfig) => ({
|
|
181
|
-
...cfg,
|
|
182
|
-
channels: {
|
|
183
|
-
...cfg.channels,
|
|
184
|
-
mattermost: { ...cfg.channels?.mattermost, enabled: false },
|
|
185
|
-
},
|
|
186
|
-
}),
|
|
187
|
-
};
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { PluginRuntime } from "clawdbot/plugin-sdk";
|
|
2
|
-
|
|
3
|
-
let runtime: PluginRuntime | null = null;
|
|
4
|
-
|
|
5
|
-
export function setMattermostRuntime(next: PluginRuntime) {
|
|
6
|
-
runtime = next;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export function getMattermostRuntime(): PluginRuntime {
|
|
10
|
-
if (!runtime) {
|
|
11
|
-
throw new Error("Mattermost runtime not initialized");
|
|
12
|
-
}
|
|
13
|
-
return runtime;
|
|
14
|
-
}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import type { BlockStreamingCoalesceConfig, DmPolicy, GroupPolicy } from "clawdbot/plugin-sdk";
|
|
2
|
-
|
|
3
|
-
export type MattermostChatMode = "oncall" | "onmessage" | "onchar";
|
|
4
|
-
|
|
5
|
-
export type MattermostAccountConfig = {
|
|
6
|
-
/** Optional display name for this account (used in CLI/UI lists). */
|
|
7
|
-
name?: string;
|
|
8
|
-
/** Optional provider capability tags used for agent/runtime guidance. */
|
|
9
|
-
capabilities?: string[];
|
|
10
|
-
/** Allow channel-initiated config writes (default: true). */
|
|
11
|
-
configWrites?: boolean;
|
|
12
|
-
/** If false, do not start this Mattermost account. Default: true. */
|
|
13
|
-
enabled?: boolean;
|
|
14
|
-
/** Bot token for Mattermost. */
|
|
15
|
-
botToken?: string;
|
|
16
|
-
/** Base URL for the Mattermost server (e.g., https://chat.example.com). */
|
|
17
|
-
baseUrl?: string;
|
|
18
|
-
/**
|
|
19
|
-
* Controls when channel messages trigger replies.
|
|
20
|
-
* - "oncall": only respond when mentioned
|
|
21
|
-
* - "onmessage": respond to every channel message
|
|
22
|
-
* - "onchar": respond when a trigger character prefixes the message
|
|
23
|
-
*/
|
|
24
|
-
chatmode?: MattermostChatMode;
|
|
25
|
-
/** Prefix characters that trigger onchar mode (default: [">", "!"]). */
|
|
26
|
-
oncharPrefixes?: string[];
|
|
27
|
-
/** Require @mention to respond in channels. Default: true. */
|
|
28
|
-
requireMention?: boolean;
|
|
29
|
-
/** Direct message policy (pairing/allowlist/open/disabled). */
|
|
30
|
-
dmPolicy?: DmPolicy;
|
|
31
|
-
/** Allowlist for direct messages (user ids or @usernames). */
|
|
32
|
-
allowFrom?: Array<string | number>;
|
|
33
|
-
/** Allowlist for group messages (user ids or @usernames). */
|
|
34
|
-
groupAllowFrom?: Array<string | number>;
|
|
35
|
-
/** Group message policy (allowlist/open/disabled). */
|
|
36
|
-
groupPolicy?: GroupPolicy;
|
|
37
|
-
/** Outbound text chunk size (chars). Default: 4000. */
|
|
38
|
-
textChunkLimit?: number;
|
|
39
|
-
/** Chunking mode: "length" (default) splits by size; "newline" splits on every newline. */
|
|
40
|
-
chunkMode?: "length" | "newline";
|
|
41
|
-
/** Disable block streaming for this account. */
|
|
42
|
-
blockStreaming?: boolean;
|
|
43
|
-
/** Merge streamed block replies before sending. */
|
|
44
|
-
blockStreamingCoalesce?: BlockStreamingCoalesceConfig;
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
export type MattermostConfig = {
|
|
48
|
-
/** Optional per-account Mattermost configuration (multi-account). */
|
|
49
|
-
accounts?: Record<string, MattermostAccountConfig>;
|
|
50
|
-
} & MattermostAccountConfig;
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
## 2026.1.23
|
|
4
|
-
|
|
5
|
-
### Changes
|
|
6
|
-
- Version alignment with core Clawdbot release numbers.
|
|
7
|
-
|
|
8
|
-
## 2026.1.22
|
|
9
|
-
|
|
10
|
-
### Changes
|
|
11
|
-
- Version alignment with core Clawdbot release numbers.
|
|
12
|
-
|
|
13
|
-
## 2026.1.21
|
|
14
|
-
|
|
15
|
-
### Changes
|
|
16
|
-
- Version alignment with core Clawdbot release numbers.
|
|
17
|
-
|
|
18
|
-
## 2026.1.20
|
|
19
|
-
|
|
20
|
-
### Changes
|
|
21
|
-
- Version alignment with core Clawdbot release numbers.
|
|
22
|
-
|
|
23
|
-
## 2026.1.17-1
|
|
24
|
-
|
|
25
|
-
### Changes
|
|
26
|
-
- Version alignment with core Clawdbot release numbers.
|
|
27
|
-
|
|
28
|
-
## 2026.1.17
|
|
29
|
-
|
|
30
|
-
### Changes
|
|
31
|
-
- Version alignment with core Clawdbot release numbers.
|
|
32
|
-
|
|
33
|
-
## 2026.1.16
|
|
34
|
-
|
|
35
|
-
### Changes
|
|
36
|
-
- Version alignment with core Clawdbot release numbers.
|
|
37
|
-
|
|
38
|
-
## 2026.1.15
|
|
39
|
-
|
|
40
|
-
### Features
|
|
41
|
-
- Bot Framework gateway monitor (Express + JWT auth) with configurable webhook path/port and `/api/messages` fallback.
|
|
42
|
-
- Onboarding flow for Azure Bot credentials (config + env var detection) and DM policy setup.
|
|
43
|
-
- Channel capabilities: DMs, group chats, channels, threads, media, polls, and `teams` alias.
|
|
44
|
-
- DM pairing/allowlist enforcement plus group policies with per-team/channel overrides and mention gating.
|
|
45
|
-
- Inbound debounce + history context for room/group chats; mention tag stripping and timestamp parsing.
|
|
46
|
-
- Proactive messaging via stored conversation references (file store with TTL/size pruning).
|
|
47
|
-
- Outbound text/media send with markdown chunking, 4k limit, split/inline media handling.
|
|
48
|
-
- Adaptive Card polls: build cards, parse votes, and persist poll state with vote tracking.
|
|
49
|
-
- Attachment processing: placeholders + HTML summaries, inline image extraction (including data: URLs).
|
|
50
|
-
- Media downloads with host allowlist, auth scope fallback, and Graph hostedContents/attachments fallback.
|
|
51
|
-
- Retry/backoff on transient/throttled sends with classified errors + helpful hints.
|