feat(hooks): fabric-chat-injector — suggest chat workflow on channel turns

New before_prompt_build hook that appends a "next action: workflow_start
chat" hint to the system prompt whenever the agent's turn was triggered
by a message in a fabric channel.

If Meridian (`globalThis.__meridian.getChatJournalForChannel`) reports
an existing chat journal for this (agentId, channelId), the hint
includes `from="<journal-id>"` so the agent resumes the conversation
file instead of starting a fresh one each turn.

Activation:
  - ctx.agentId AND ctx.channelId present
  - ctx.messageProvider in {fabric, '' (empty/omitted by gateway)}

TODO(phase-2): once Fabric exposes per-channel type info (DM / group /
triage) via a cross-plugin API, narrow this to xType === 'dm' only.
Today we fire on any fabric channel — chat workflow is a no-op outside
DMs, so the false positives are just prompt-text noise.

Dedup via WeakSet keyed on the event object (same pattern as the
existing before-prompt-build hook) so each turn injects at most once
even when multiple harness call sites trigger the hook.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
h z
2026-05-25 09:46:34 +01:00
parent f3e2e74d36
commit 33fcd17746
2 changed files with 87 additions and 0 deletions

View File

@@ -2,6 +2,7 @@ import path from "node:path";
import { loadRouters } from "./core/router-loader.js";
import { initRuleStore } from "./core/rule-store.js";
import { registerBeforePromptBuild } from "./hooks/before-prompt-build.js";
import { registerFabricChatInjector } from "./hooks/fabric-chat-injector.js";
import { registerPromptRulesTool } from "./tools/prompt-rules.js";
interface PluginConfig {
@@ -57,6 +58,7 @@ export default {
// Agent session hooks: register every time (dedup inside handler)
registerBeforePromptBuild(api);
registerFabricChatInjector(api);
// Tools
registerPromptRulesTool(api, routersDir);