Add outline import feature; drop Dto naming, map entities at the API boundary

Services now return entities; endpoints (and the agent toolsets) map to
*Response records instead of services building wire DTOs themselves.
Also brings in the outline-import agent, MCP tool, ledger and web dialog
that were already in progress on disk.
This commit is contained in:
James Wampler
2026-08-06 18:36:40 -07:00
parent 40f93e40a8
commit 189ebf3237
66 changed files with 3310 additions and 364 deletions
@@ -31,7 +31,7 @@ public class NovelAgentServiceTests : ServiceTestFixture
var turn = await agent.SendMessageAsync(projectId, new SendAgentMessageRequest("Where do I start?"));
Assert.That(turn.Message.Content, Is.EqualTo("Tell me about the ending."));
Assert.That(turn.Content, Is.EqualTo("Tell me about the ending."));
var conversation = (await agent.GetConversationAsync(turn.ConversationId))!;
@@ -62,9 +62,9 @@ public class NovelAgentServiceTests : ServiceTestFixture
{
Assert.That(characters, Has.Count.EqualTo(1));
Assert.That(characters[0].Name, Is.EqualTo("Ines"));
Assert.That(turn.Message.Content, Is.EqualTo("Added Ines as the protagonist."));
Assert.That(turn.Message.ToolCalls, Has.Count.EqualTo(1));
Assert.That(turn.Message.ToolCalls[0].Name, Is.EqualTo("create_character"));
Assert.That(turn.Content, Is.EqualTo("Added Ines as the protagonist."));
Assert.That(turn.ToResponse().ToolCalls, Has.Count.EqualTo(1));
Assert.That(turn.ToResponse().ToolCalls[0].Name, Is.EqualTo("create_character"));
});
}
@@ -113,7 +113,7 @@ public class NovelAgentServiceTests : ServiceTestFixture
{
Assert.That(errorResult.IsError, Is.True);
Assert.That(errorResult.Content, Does.Contain("was not found"));
Assert.That(turn.Message.Content, Does.Contain("does not exist yet"));
Assert.That(turn.Content, Does.Contain("does not exist yet"));
});
}
@@ -154,7 +154,7 @@ public class NovelAgentServiceTests : ServiceTestFixture
Assert.Multiple(() =>
{
Assert.That(model.Transcripts, Has.Count.EqualTo(4));
Assert.That(turn.Message.Content, Does.Contain("tool-call limit"));
Assert.That(turn.Content, Does.Contain("tool-call limit"));
});
}