Skip to content

feat(chat): action→operator, freeform ask→concierge, answered in-thread via chat-mirror (v0.295.0) - #541

Merged
vikasprogrammer merged 1 commit into
mainfrom
feat/chat-operator
Aug 3, 2026
Merged

feat(chat): action→operator, freeform ask→concierge, answered in-thread via chat-mirror (v0.295.0)#541
vikasprogrammer merged 1 commit into
mainfrom
feat/chat-operator

Conversation

@vikasprogrammer

Copy link
Copy Markdown
Owner

Uses the existing agent-comms primitive (the chat-mirror "poke the thread") for the Cockpit concierge/operator in Slack/Discord, instead of the bespoke web spawn-and-poll — per the design discussion.

What changed

The chat front door (routeUnmatched, behind fireSlack/fireDiscord/fireClickup) now runs the full intent layer:

Intent Behavior in Discord/Slack
ask answered inline (state lookup → direct Claude); if there's no fast inline answer, the concierge (a Claude session with the OS tools) answers in-thread
action ("schedule the churn report every morning", "create a task to…") the governed operator does it — task_create (filed) / automation_propose (a draft an owner approves) — and confirms in-thread
work routes to the best-fit teammate (unchanged)

The concierge/operator are spawned as thread-bound chat sessions and reply through the same chat-mirror primitive every chat agent already uses — the "poke the thread." No new polling mechanism; it reuses agent-os's existing comms path. Previously action and an unanswered ask just fell through to a generic work agent.

Personas updated to call slack_reply/discord_reply when a reply tool is present (i.e. they're in a thread), so the in-thread confirmation is reliable.

Verification

  • typecheck + build clean; test:governance159/159 + tier-A 18/18 + capability 18/18
  • The engines are already verified end-to-end earlier: answerAsk (state/LLM), the operator creating a task via task_create, and chooseAgent routing. This wires them into the chat front door via the existing thread-bound spawn.

Testing note

I can't inject a Discord/Slack message myself (the bot ignores its own posts; I can't impersonate a user). After deploy I'll watch the live audit while you send a few Discord messages to the instapods bot — the one part only a real thread exercises is the operator/concierge's discord_reply post-back.

src/edge/automations.ts, src/edge/concierge.ts.

🤖 Generated with Claude Code

…ad via chat-mirror (v0.295.0)

The chat front door (routeUnmatched, behind fireSlack/fireDiscord/fireClickup)
now runs the full intent layer:
- ask   → inline answer (state/direct Claude); if no fast answer, the concierge
          (a Claude session with the OS tools) answers in-thread
- action → the governed operator (task_create filed / automation_propose = a
          draft an owner approves) does it and confirms in-thread
- work  → routes to the best-fit teammate (unchanged)

The concierge/operator are spawned as THREAD-BOUND chat sessions and reply
in-thread through the same chat-mirror primitive every chat agent uses — reusing
agent-os's existing agent-comms path (the "poke the thread") instead of the
bespoke web spawn-and-poll. Personas updated to call slack_reply/discord_reply
when in a thread. Previously action/unanswered-ask fell through to a generic
work agent.

Verified: typecheck + build clean; test:governance 159/159 + tier-A + capability.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@vikasprogrammer
vikasprogrammer merged commit 2e68bd0 into main Aug 3, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant