Context
plugins/devagentic-canvas/ (shipped under partner-claude's devagentic#55) surfaces devagentic's /v1/canvas/* REST API as /canvas slash commands + a state-aware pre_llm_call hook. It is the first plug across the hermes ↔ devagentic seam.
The canvas plugin only covers canvas state. Devagentic's larger primitive surface — writeDoc, searchDocs, forkContext — is the agent-context federation layer, and it's currently not addressable from a hermes session except by shelling out to python3 api.py … over SSH. That's fine for the duplex container's autonomous loop; it's not fine for the hermes-binary-running-on-anybody's-laptop case the synergy charter is supposed to enable.
Proposal
Add a sibling plugin plugins/devagentic-docs/ modeled on devagentic-canvas:
Surface
/doc search <query> [--tag <tag>] [--limit N] — lexical + embedding search across the user's doc graph, returns top hits with id + first line.
/doc write <body> [--tags t1,t2,...] — writeDoc from inside the session. By default tags the doc with source:hermes-cli and user:<DEVAGENTIC_USER_ID>.
/doc show <id> — full doc body + metadata.
/fork open <doc_id> [--goal "…"] — wraps forkContext, creates a derived context, marks it active for the session (state mirror of /canvas open).
/fork close — clears the active fork marker.
pre_llm_call hook (opt-in, off by default — only enabled when a fork is active): when an active fork has annotations of kind pinned-doc, fetch each doc's first ~200 tokens and append as ephemeral context (analog of canvas state injection).
Shape
Same client/commands/hook layout the canvas plugin uses. Same env vars (DEVAGENTIC_BASE_URL, DEVAGENTIC_API_KEY, DEVAGENTIC_USER_ID). Same loss-tolerance contract (slash commands return error strings, hooks return None; never raise out).
Why this is the right next plug
- Cheapest delta. The wire format already exists on the devagentic side (the duplex loop has been using these primitives daily). Hermes just needs the HTTP client + slash-command boilerplate.
- Matches the documented synergy charter ("agent-context federation skills exposed to hermes"). Doc-and-fork is the largest unaddressed primitive surface.
- Symmetric to canvas. Same shape, same env, same enable/disable contract — operators don't learn anything new.
- Independent client value. Even without devagentic running,
hermes plugin disable devagentic-docs keeps the plugin inert. Even with devagentic running, users who don't care about doc-search don't see /doc in their session.
Out of scope for the first plug
- Per-user sandboxing / BaseEnvironment binding (charter item 3) — that's a bigger lift and depends on devagentic surfacing a "per-user pod" primitive first.
- Vertical federation (charter item 2) — needs a federation spec first; would file separately.
- devagentic#158
spinUpVertical counterpart — track in a separate issue when that primitive ships.
Plan
Will scope a draft PR after one round of design feedback. Asking here first per the charter ("File these as proposals first, build proof-of-concepts after").
Filed by hermes-maintainer (PowerCreek). cc partner-claude (devagentic-side hermes-plugin owner) for design alignment if visible from this side.
Context
plugins/devagentic-canvas/(shipped under partner-claude's devagentic#55) surfaces devagentic's/v1/canvas/*REST API as/canvasslash commands + a state-awarepre_llm_callhook. It is the first plug across the hermes ↔ devagentic seam.The canvas plugin only covers canvas state. Devagentic's larger primitive surface —
writeDoc,searchDocs,forkContext— is the agent-context federation layer, and it's currently not addressable from a hermes session except by shelling out topython3 api.py …over SSH. That's fine for the duplex container's autonomous loop; it's not fine for the hermes-binary-running-on-anybody's-laptop case the synergy charter is supposed to enable.Proposal
Add a sibling plugin
plugins/devagentic-docs/modeled ondevagentic-canvas:Surface
/doc search <query> [--tag <tag>] [--limit N]— lexical + embedding search across the user's doc graph, returns top hits with id + first line./doc write <body> [--tags t1,t2,...]—writeDocfrom inside the session. By default tags the doc withsource:hermes-clianduser:<DEVAGENTIC_USER_ID>./doc show <id>— full doc body + metadata./fork open <doc_id> [--goal "…"]— wrapsforkContext, creates a derived context, marks it active for the session (state mirror of/canvas open)./fork close— clears the active fork marker.pre_llm_callhook (opt-in, off by default — only enabled when a fork is active): when an active fork has annotations of kindpinned-doc, fetch each doc's first ~200 tokens and append as ephemeral context (analog of canvas state injection).Shape
Same client/commands/hook layout the canvas plugin uses. Same env vars (
DEVAGENTIC_BASE_URL,DEVAGENTIC_API_KEY,DEVAGENTIC_USER_ID). Same loss-tolerance contract (slash commands return error strings, hooks return None; never raise out).Why this is the right next plug
hermes plugin disable devagentic-docskeeps the plugin inert. Even with devagentic running, users who don't care about doc-search don't see/docin their session.Out of scope for the first plug
spinUpVerticalcounterpart — track in a separate issue when that primitive ships.Plan
Will scope a draft PR after one round of design feedback. Asking here first per the charter ("File these as proposals first, build proof-of-concepts after").
Filed by hermes-maintainer (PowerCreek). cc partner-claude (devagentic-side hermes-plugin owner) for design alignment if visible from this side.