Commit Graph
25 Commits
Author SHA1 Message Date
ZacharyZhang-NY bb24a444f4 Wake thread participants when a human replies without @mentions
When a human or board member posts in a thread where agents have
previously participated, those agents are now woken even without
explicit @mentions. This matches the old version's behavior where
any message in a conversation could wake the recipient, enabling
natural back-and-forth between humans and agents.
2026-06-30 21:51:32 -04:00
ZacharyZhang-NY 77644121db Record @mention wake failures instead of silently swallowing them
The catch block in wakeAgentMentions now records wake_state on each
mention (woken/failed) instead of silently discarding the error. Failed
mentions render with a strikethrough and muted color so the user sees
which agents could not be reached, with a tooltip on hover. Migration
044 adds the wake_state column to chat_mentions.
2026-06-30 21:38:19 -04:00
ZacharyZhang-NY 8923a2bf0a Clarify agent mention reply readiness 2026-06-26 19:41:56 -04:00
ZacharyZhang-NY bd63d42aa7 Extract slash-command routing out of ChatService
ChatService was 542 lines, mixing message delivery with the dispatch of
nine slash commands. Move the command cluster — /board, /approve, /deny,
/agent, /skill, /file, /runbook, /handoff, /escalate — into a
ChatSlashRouter that owns the approval and board-intervention services it
needs. ChatService keeps message delivery and delegates two calls.
Behaviour identical: chat-service 376 lines, router 196, full suite and
e2e green; the slash-routing governance test exercises every branch.
2026-06-26 18:25:14 -04:00
ZacharyZhang-NY c8de72c810 Bound autonomous agent-to-agent chat wake loops per thread
An @mention by an agent wakes the mentioned teammate by creating a task
run, and the woken agent's reply can mention back, an unbounded A->B->A
loop whose only backstop was the per-provider monthly request cap (which,
once tripped, fails every agent on that provider). Before enriching agent
conversation this had to be made safe.

Cap the agent-authored messages a thread may accumulate since its last
human/board message; past the cap, agent-triggered wakes pause until a
person re-engages. A human message always wakes mentions and resets the
budget. Counted from chat_messages, so no schema change.
2026-06-26 17:28:13 -04:00
ZacharyZhang-NY 44f31b49fb Wake agents on @mention in chat messages
Agents were deaf to @mentions — only /agent slash commands triggered a
task_run. Now ChatService.sendMessage auto-wakes every mentioned agent
(skipping self-mentions and /agent which already handles it) by creating
a queued task_run through ChatAgentWakeService.wakeFromMention.
2026-06-07 17:20:58 -04:00
ZacharyZhang-NY 8eec454927 Queue agent runs from chat mentions 2026-06-07 13:34:27 -04:00
ZacharyZhang-NY ae5e08869f Extract chat-service internals into a module
chat-service.ts exceeded 500 lines. Move the row-shape interfaces, slash-command
parsing/validation and the small standalone helpers into chat-service-internal.ts
and import them back. Pure relocation with no behaviour change; the chat
governance suite (82 tests) and e2e remain green.
2026-05-28 20:21:51 -04:00
ZacharyZhang-NY b4056502ec Support the full set of chat space types
The PRD calls for company, division, department, project, pod and ad-hoc
spaces, but only company, department, project and direct were accepted. Add
division, pod and ad_hoc to the command contract, the service whitelist and the
new-space dialog. The space_type column is free text, so no migration is
needed.
2026-05-28 19:47:16 -04:00
ZacharyZhang-NY 43e1626f77 Restrict board interventions to board-authority principals
Any employee in the org could send a message as the board (freeze, takeover,
force-approval), because requireSender only checked that the board sender was a
valid employee. Enforce the approval_decider role (org_admin inherits it) via
IdentityAccessService, which also records an access decision for denied
attempts, and only render the thread board-control form for principals who hold
that authority — others get a read-only view of past interventions.
2026-05-28 19:44:35 -04:00
ZacharyZhang-NY c43f29299f Route collaboration slash commands 2026-05-23 23:21:00 -04:00
ZacharyZhang-NY ee5eff7725 Execute approval decisions from chat slash commands 2026-05-23 22:08:38 -04:00
ZacharyZhang-NY e78e9a8aa0 Audit chat message mutations 2026-05-23 21:59:16 -04:00
ZacharyZhang-NY c59be97b79 Gate task execution on approval source refs 2026-05-23 21:52:52 -04:00
ZacharyZhang-NY 4dbd8997c0 Add file handoff audit records 2026-05-23 21:45:49 -04:00
ZacharyZhang-NY 18e0c6338e Add structured chat delivery records 2026-05-23 21:04:59 -04:00
ZacharyZhang-NY 78dbcbe7ce Add board thread interventions 2026-05-23 17:14:09 -04:00
ZacharyZhang-NY eba83ef794 Secure file handoff grants 2026-05-23 16:03:08 -04:00
ZacharyZhang-NY d24cf6b289 Create approvals from chat escalations 2026-05-23 15:46:32 -04:00
ZacharyZhang-NY 0b19a152e6 Implement typed chat mention resolution 2026-05-23 15:32:17 -04:00
ZacharyZhang-NY 3a0f80d9a7 feat(new): enforce chat membership integrity 2026-05-23 13:54:57 -04:00
ZacharyZhang-NY 1f78ae6f2e Track per-employee chat read state and surface real unread counts
Adds chat_read_state migration (employee_id + space_id, last read
message + timestamp) wired through ChatService.markSpaceRead, IPC
markChatSpaceRead, and an effect in ChatPage that flushes the active
space whenever the latest message id changes.

Shell.computeBadges now derives the Messages badge from
(message.createdAt > read_state.last_read_at) minus messages the viewer
sent, so the sidebar shows true unread instead of total throughput.
2026-05-21 20:25:07 -04:00
ZacharyZhang-NY 83a51c6881 Wire real page actions to persisted data 2026-05-21 08:54:58 -04:00
ZacharyZhang-NY c694b7fc2c Add provider gateway and collaboration records 2026-05-20 23:35:30 -04:00
ZacharyZhang-NY fcf6d90731 Rebuild AgentCompany Electron app 2026-05-20 23:27:00 -04:00