A new send-message module owns everything a dashboard sends: the PIN (switchable off in admin), the unlock tokens, the Send message and Quick replies tiles, the quick replies and the quick emojis. It opens no upstream connection of its own. It finds every module declaring provides: ["messaging"] through the shell's module list and hands each message to that module's POST /messaging/send over loopback, so Slack keeps its one Slack connection and ProdCom its one ProdCom connection. A provider checks the browser's unlock token with the module's GET /verify over loopback before touching its upstream, so no browser on the network can post as the location without having entered the PIN.
Slack 1.3.0 is view-only plus reactions. The Sending group, the PIN, the send tiles and the quick replies are gone. It serves the messaging descriptor (channels as recipients) and its reaction menu rides on the Send Message unlock; with the page locked or no Send message tile on it, the menu says so instead of reacting.
ProdCom 1.4.0 serves the descriptor as identities, offering only channels with typingEnabled, since typed text goes out as a channel, and posts with POST /api/v1/channels/{id}/send. Its tile is a click-to-target like Slack's (accent stripe along the bottom), and typed entries carry a keyboard mark.
The tiles. Click any Slack or ProdCom transcript to point sends there. A Send as menu, present only while an installed platform offers identities, picks the ProdCom channel to speak as; Slack channels are never in it. The choice is saved with the tile, so named layouts remember it. Wording follows the role: "Send message to #ops…" versus "Send message to ProdCom as FOH…". The PIN pad's dots ride on a real numeric input so a phone's keyboard appears. The outcome is an icon beside Send (check or blocked, five seconds, the sentence as tooltip). A pill on the text box's bottom edge trades box height for rows of quick-emoji keys, a row at a time; the single row scrolls sideways on a narrow tile with Send pinned in place.
Docs and mock. The module guide gains "Offering messaging to the Send Message module" (the provider contract, destinationRole, emptyMessage, token verification) and "Messaging on the page" (the window.proddashMessaging object and proddash:messaging:* events the tiles share). The README lists the new module and the Slack and ProdCom changes. tools/prodcom-mock.js gained the send route (!429 answers RATE_LIMITED, PRODCOM_MOCK_KEY demands a key).
No shell changes.
Tested against the mocks
Unlock, sends to both platforms, bound and unbound quick replies, reactions, lock, wrong-PIN lockout, one-send-per-second limit, and direct calls to a provider's send route without a token being refused.
Click-to-target between Slack and ProdCom with the stripe following, one PIN entry unlocking both tiles, reload keeping the saved destination, PIN off auto-unlocking, the Send as menu hiding when ProdCom is disabled and returning when re-enabled.
Killing the ProdCom mock turned the dots red with a clear message; restarting it recovered without a reload.
Narrow tile (emoji row scrolls, Send stays), smallest tile (one-line box plus two rows of keys), phone viewport (PIN input focus, numeric keyboard attributes).
AB and NA layouts hold Slack's old Send and Quick tiles; those now draw nothing. Delete them and add the two tiles from + under Send Message, then set the PIN under Send Message in admin (Slack's PIN config is gone).
On 2026-10-04 every ProdCom channel at AB reported typingEnabled: false, so the Send as menu there will show "No ProdCom channel accepts typed text" until typing is turned on for a channel in ProdCom. No real send to AB has been tried yet.
## What this does
A new **`send-message`** module owns everything a dashboard sends: the PIN (switchable off in admin), the unlock tokens, the **Send message** and **Quick replies** tiles, the quick replies and the quick emojis. It opens no upstream connection of its own. It finds every module declaring `provides: ["messaging"]` through the shell's module list and hands each message to that module's `POST /messaging/send` over loopback, so Slack keeps its one Slack connection and ProdCom its one ProdCom connection. A provider checks the browser's unlock token with the module's `GET /verify` over loopback before touching its upstream, so no browser on the network can post as the location without having entered the PIN.
- **Slack 1.3.0** is view-only plus reactions. The Sending group, the PIN, the send tiles and the quick replies are gone. It serves the messaging descriptor (channels as recipients) and its reaction menu rides on the Send Message unlock; with the page locked or no Send message tile on it, the menu says so instead of reacting.
- **ProdCom 1.4.0** serves the descriptor as identities, offering only channels with `typingEnabled`, since typed text goes out *as* a channel, and posts with `POST /api/v1/channels/{id}/send`. Its tile is a click-to-target like Slack's (accent stripe along the bottom), and typed entries carry a keyboard mark.
- **The tiles.** Click any Slack or ProdCom transcript to point sends there. A **Send as** menu, present only while an installed platform offers identities, picks the ProdCom channel to speak as; Slack channels are never in it. The choice is saved with the tile, so named layouts remember it. Wording follows the role: "Send message to #ops…" versus "Send message to ProdCom as FOH…". The PIN pad's dots ride on a real numeric input so a phone's keyboard appears. The outcome is an icon beside Send (check or blocked, five seconds, the sentence as tooltip). A pill on the text box's bottom edge trades box height for rows of quick-emoji keys, a row at a time; the single row scrolls sideways on a narrow tile with Send pinned in place.
- **Docs and mock.** The module guide gains "Offering messaging to the Send Message module" (the provider contract, `destinationRole`, `emptyMessage`, token verification) and "Messaging on the page" (the `window.proddashMessaging` object and `proddash:messaging:*` events the tiles share). The README lists the new module and the Slack and ProdCom changes. `tools/prodcom-mock.js` gained the send route (`!429` answers RATE_LIMITED, `PRODCOM_MOCK_KEY` demands a key).
No shell changes.
## Tested against the mocks
- Unlock, sends to both platforms, bound and unbound quick replies, reactions, lock, wrong-PIN lockout, one-send-per-second limit, and direct calls to a provider's send route without a token being refused.
- Click-to-target between Slack and ProdCom with the stripe following, one PIN entry unlocking both tiles, reload keeping the saved destination, PIN off auto-unlocking, the Send as menu hiding when ProdCom is disabled and returning when re-enabled.
- Killing the ProdCom mock turned the dots red with a clear message; restarting it recovered without a reload.
- Narrow tile (emoji row scrolls, Send stays), smallest tile (one-line box plus two rows of keys), phone viewport (PIN input focus, numeric keyboard attributes).
- `tools/layout-roundtrip.test.js`, `tools/unbundled.test.js`, `tools/update-check.test.js` pass.
## Rollout notes
- AB and NA layouts hold Slack's old Send and Quick tiles; those now draw nothing. Delete them and add the two tiles from + under Send Message, then set the PIN under Send Message in admin (Slack's PIN config is gone).
- On 2026-10-04 every ProdCom channel at AB reported `typingEnabled: false`, so the Send as menu there will show "No ProdCom channel accepts typed text" until typing is turned on for a channel in ProdCom. No real send to AB has been tried yet.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
A new send-message module owns everything a dashboard sends: the PIN
(switchable off in admin), the unlock tokens, the Send message and Quick
replies tiles, the quick replies and quick emojis. It opens no upstream
connection of its own — it finds every module declaring
provides: ["messaging"] through the shell's module list and hands each
message to that module's POST /messaging/send over loopback, so Slack keeps
its one Slack connection and ProdCom its one ProdCom connection. Providers
check the browser's unlock token with GET /verify over loopback before
touching their upstream, so no browser on the network can post as the
location without having entered the PIN here.
Slack 1.3.0 is view-only plus reactions: the Sending group, PIN, send tiles
and quick replies are gone; it serves the messaging descriptor (channels as
recipients) and its reactions ride on the Send Message unlock. A layout's
old Send message / Quick replies tiles draw nothing until removed.
ProdCom 1.4.0 serves the descriptor as identities — only channels with
typingEnabled, since typed text goes out *as* a channel — and posts with
POST /api/v1/channels/{id}/send. Its tile is a click-to-target like Slack's
(accent stripe along the bottom), and typed entries carry a keyboard mark.
The tiles: click any Slack or ProdCom transcript to point sends there; a
Send as menu (only for platforms with identities, hidden otherwise) picks
the ProdCom channel to speak as; the choice is saved with the tile so named
layouts remember it. Wording follows the role — "Send message to #ops…" /
"Send message to ProdCom as FOH…". The PIN pad's dots ride on a real
numeric input so a phone's keyboard appears. Outcome is an icon beside
Send (check / blocked, five seconds, sentence as tooltip). A pill on the
box's bottom edge trades box height for rows of quick-emoji keys, a row
at a time; the single row scrolls sideways on a narrow tile with Send
pinned in place.
The module guide documents the provider contract and the page bus
(window.proddashMessaging + proddash:messaging:* events) the tiles share;
the ProdCom mock gained the send route.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
michael
merged commit a3500f98b1 into main2026-10-05 14:13:19 -04:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
What this does
A new
send-messagemodule owns everything a dashboard sends: the PIN (switchable off in admin), the unlock tokens, the Send message and Quick replies tiles, the quick replies and the quick emojis. It opens no upstream connection of its own. It finds every module declaringprovides: ["messaging"]through the shell's module list and hands each message to that module'sPOST /messaging/sendover loopback, so Slack keeps its one Slack connection and ProdCom its one ProdCom connection. A provider checks the browser's unlock token with the module'sGET /verifyover loopback before touching its upstream, so no browser on the network can post as the location without having entered the PIN.typingEnabled, since typed text goes out as a channel, and posts withPOST /api/v1/channels/{id}/send. Its tile is a click-to-target like Slack's (accent stripe along the bottom), and typed entries carry a keyboard mark.destinationRole,emptyMessage, token verification) and "Messaging on the page" (thewindow.proddashMessagingobject andproddash:messaging:*events the tiles share). The README lists the new module and the Slack and ProdCom changes.tools/prodcom-mock.jsgained the send route (!429answers RATE_LIMITED,PRODCOM_MOCK_KEYdemands a key).No shell changes.
Tested against the mocks
tools/layout-roundtrip.test.js,tools/unbundled.test.js,tools/update-check.test.jspass.Rollout notes
typingEnabled: false, so the Send as menu there will show "No ProdCom channel accepts typed text" until typing is turned on for a channel in ProdCom. No real send to AB has been tried yet.🤖 Generated with Claude Code
A new send-message module owns everything a dashboard sends: the PIN (switchable off in admin), the unlock tokens, the Send message and Quick replies tiles, the quick replies and quick emojis. It opens no upstream connection of its own — it finds every module declaring provides: ["messaging"] through the shell's module list and hands each message to that module's POST /messaging/send over loopback, so Slack keeps its one Slack connection and ProdCom its one ProdCom connection. Providers check the browser's unlock token with GET /verify over loopback before touching their upstream, so no browser on the network can post as the location without having entered the PIN here. Slack 1.3.0 is view-only plus reactions: the Sending group, PIN, send tiles and quick replies are gone; it serves the messaging descriptor (channels as recipients) and its reactions ride on the Send Message unlock. A layout's old Send message / Quick replies tiles draw nothing until removed. ProdCom 1.4.0 serves the descriptor as identities — only channels with typingEnabled, since typed text goes out *as* a channel — and posts with POST /api/v1/channels/{id}/send. Its tile is a click-to-target like Slack's (accent stripe along the bottom), and typed entries carry a keyboard mark. The tiles: click any Slack or ProdCom transcript to point sends there; a Send as menu (only for platforms with identities, hidden otherwise) picks the ProdCom channel to speak as; the choice is saved with the tile so named layouts remember it. Wording follows the role — "Send message to #ops…" / "Send message to ProdCom as FOH…". The PIN pad's dots ride on a real numeric input so a phone's keyboard appears. Outcome is an icon beside Send (check / blocked, five seconds, sentence as tooltip). A pill on the box's bottom edge trades box height for rows of quick-emoji keys, a row at a time; the single row scrolls sideways on a narrow tile with Send pinned in place. The module guide documents the provider contract and the page bus (window.proddashMessaging + proddash:messaging:* events) the tiles share; the ProdCom mock gained the send route. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>