fix(messages): company channel fans out to every active agent

"Company" channel fell through to `listTopLevelAgentIds`, so a
broadcast on the most ambient-sounding channel in the product only
reached agents with `reports_to IS NULL`. The label said company;
the semantics said board-only. The rest of the org never knew a
message existed.

Add `listCompanyBroadcastAgentIds` — returns every non-terminated,
non-paused, non-pending agent for the company — and wire it through
the `company` case in `resolveMessageWakeTargets`. Board-only
fan-outs are still reachable: the `incident` channel keeps the
broader pingable set (paused-by-budget included) and direct DMs to
top-level agents work as before.

The prompt doc catches up to the runtime: company is explicitly
framed as all-hands, with board-only guidance redirected to DMs or
incidents. The message-dispatch unit test asserts the new fan-out.
This commit is contained in:
ZacharyZhang-NY committed 2026-04-19 01:21:26 -04:00
1 parent 0a40c55b3c
commit d47e637a45
5 files changed
+28 -7

No files matched your search

+17 -2
View File
@@ -286,8 +286,8 @@ export function buildAgentHierarchyMethods(
/**
* Returns ids of non-terminated agents that have no manager (top of the
* reporting tree). Used by `resolveMessageWakeTargets` for "company"
* channel broadcast.
* reporting tree). Used for board-only fan-outs where only top-level
* leadership should be notified.
*/
listTopLevelAgentIds(companyId: string): string[] {
return readAll<{ id: string }>(
@@ -296,6 +296,21 @@ export function buildAgentHierarchyMethods(
).map((row) => row.id);
},
/**
* Returns ids of every agent that is eligible to receive a routine
* company-wide broadcast. Paused, pending-approval, and terminated
* agents are excluded — they should not be woken by normal chatter;
* only incidents reach the broader pingable set. Used by
* `resolveMessageWakeTargets` for the "company" channel so the
* semantic matches Slack (all-hands) rather than board-only.
*/
listCompanyBroadcastAgentIds(companyId: string): string[] {
return readAll<{ id: string }>(
"select id from agents where company_id = ? and status not in ('terminated', 'paused', 'pending_approval')",
companyId,
).map((row) => row.id);
},
/**
* Returns ids of agents that can receive incident pings: everybody not
* terminated or still pending approval.