Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions src/agent-harness/memory-text.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,15 @@ describe("memoryToolText", () => {
expect(text).toContain('resultCount="0"')
expect(text).not.toContain("<item ")
})

it("formats a search failure as a warning", () => {
const text = memoryToolText.formatWarning({
operation: "search",
message: "MEMENTO_BASE_URL is required.",
})

expect(text).toContain('<memory operation="search" status="warning">')
expect(text).toContain("MEMENTO_BASE_URL is required.")
expect(text).not.toContain('status="error"')
})
})
27 changes: 19 additions & 8 deletions src/agent-harness/memory-text.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,28 @@ export const memoryToolText = {
},

formatError(input: ErrorTextInput): string {
return [
formatOpenTag("memory", {
operation: input.operation,
status: "error",
}),
formatTextTag("message", input.message),
"</memory>",
].join("\n")
return formatStatusBlock(input, "error")
},

formatWarning(input: ErrorTextInput): string {
return formatStatusBlock(input, "warning")
},
} as const

function formatStatusBlock(
input: ErrorTextInput,
status: "error" | "warning",
): string {
return [
formatOpenTag("memory", {
operation: input.operation,
status,
}),
formatTextTag("message", input.message),
"</memory>",
].join("\n")
}

function formatMemoryItems(response: MemorySearchResponse): string {
if (response.items.length === 0) return ""

Expand Down
20 changes: 20 additions & 0 deletions src/agent-harness/runtime.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -576,6 +576,26 @@ describe("agent harness runtime", () => {
})
})

it("returns a warning when memory_search cannot reach memory", async () => {
const search = vi
.fn<MemoryToolRuntime["search"]>()
.mockRejectedValue(new Error("MEMENTO_BASE_URL is required."))
const tools = createHarnessTools({
state: {},
ledger: createEvidenceLedger(),
memoryTools: makeMemoryTools(search),
knowhereTools: makeKnowhereTools(),
recentTurns: [],
})

const searchText = await executeTool(tools.memory_search, {
query: "毛利率",
})
expect(searchText).toContain('<memory operation="search" status="warning">')
expect(searchText).toContain("MEMENTO_BASE_URL is required.")
expect(searchText).not.toContain('status="error"')
})

it("exposes full prior-turn content through policy-approved readPriorTurn", async () => {
const state: {
contextPolicy?: ContextPolicy
Expand Down
9 changes: 8 additions & 1 deletion src/agent-harness/runtime.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import {
} from "ai"
import { z } from "zod"

import { logger } from "@/lib/logger"

import { composeAnswerContext, type ReadTableHtml } from "./answer-context"
import { createEvidenceLedger } from "./ledger"
import { knowhereToolText } from "./knowhere-text"
Expand Down Expand Up @@ -904,7 +906,12 @@ async function executeMemorySearch(input: {
accumulateMemoryItems(input.state, response.items)
return memoryToolText.formatSearch(response)
} catch (error) {
return memoryToolText.formatError({
// TODO: Memento 未部署时搜索会失败,先只记警告;部署并对上地址后应能搜到。
logger.warn("chat: failed to search memory", {
query: input.request.query,
error: formatUnknownError(error),
})
return memoryToolText.formatWarning({
operation: "search",
message: formatUnknownError(error),
})
Expand Down
1 change: 1 addition & 0 deletions src/integrations/memento/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ export async function captureMemoryTurn(
try {
await postJson("/turns/capture", input)
} catch (error) {
// TODO: Memento 未部署时发送会失败,先只记警告;部署并对上地址后应能发到。
logger.warn("chat: failed to capture memory turn", {
workspaceId: input.workspaceId,
error: summarizeUnknownError(error),
Expand Down
Loading