feat: let agents read supervisor story graphs

Expose saved decisions, timelines and source evidence through read-only Story Graph tools across Model, Harness and local/remote OpenCode and Continue. Supervisor enablement and runtime assignments govern discovery and calls; reads do not invoke models or modify stored evidence. Remote use requires matching Desktop and Agent changes.

Make Continue discussion show the complete editable message with a separated destination and shared action layout. Sending uses the visible draft without reattaching removed context.

Validation: existing focused MCP, runtime, controlled Linux Host, discussion component and Electron layout checks plus typechecks; staged diff check passed. Cross-scope fact reuse, historical reconstruction and full package acceptance remain deferred.

Release note: Agents can consult saved supervisor decisions and their sources when continuing work. Continue discussion now lets you review and edit the complete message before sending.
This commit is contained in:
mesalogo
2026-09-28 12:38:00 +08:00
parent 83a3ea261e
commit 66f77b83c2
61 changed files with 1527 additions and 150 deletions
@@ -1015,6 +1015,7 @@ describe('ModelToolProvider', () => {
listLibraries: vi.fn(() => []),
search: vi.fn(async () => []),
searchMagicNotes: vi.fn(() => []),
isStoryGraphAvailable: vi.fn(async () => true),
getAvailableToolNames: vi.fn(() => [...scopedDataToolByName.keys()])
} as unknown as KnowledgeMcpGateway
const context = {
@@ -1072,6 +1073,7 @@ describe('ModelToolProvider', () => {
it('rechecks cached and refreshed MCP catalogs against each request scope without shrinking the cache', async () => {
const gateway = {
isStoryGraphAvailable: vi.fn(async () => true),
getAvailableToolNames: vi.fn(() => [...scopedDataToolByName.keys()])
} as unknown as KnowledgeMcpGateway
const provider = new ModelToolProvider(await createWorkspace(), [createMcpServer(true)],
@@ -1117,6 +1119,7 @@ describe('ModelToolProvider', () => {
it('enforces the aggregate MCP limit when a cached catalog gains scoped tools', async () => {
const gateway = {
isStoryGraphAvailable: vi.fn(async () => true),
getAvailableToolNames: vi.fn(() => [...scopedDataToolByName.keys()])
} as unknown as KnowledgeMcpGateway
mocks.client.listTools.mockResolvedValue({ tools: Array.from({ length: 40 }, (_, index) => ({