@evalops/maestro 0.10.11 → 0.10.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/transport/tool-execution-bridge.d.ts.map +1 -1
- package/dist/agent/transport/tool-execution-bridge.js +4 -0
- package/dist/agent/transport/tool-execution-bridge.js.map +1 -1
- package/dist/audit/logger.d.ts +1 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +5 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/commands/config.d.ts.map +1 -1
- package/dist/cli/commands/config.js +3 -2
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/evalops.d.ts +2 -1
- package/dist/cli/commands/evalops.d.ts.map +1 -1
- package/dist/cli/commands/evalops.js +9 -29
- package/dist/cli/commands/evalops.js.map +1 -1
- package/dist/cli/commands/init.d.ts +3 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +61 -21
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/status.d.ts +2 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +11 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +3 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli-tui/tui-renderer/attachment-controller.d.ts.map +1 -1
- package/dist/cli-tui/tui-renderer/attachment-controller.js +18 -1
- package/dist/cli-tui/tui-renderer/attachment-controller.js.map +1 -1
- package/dist/cli.js +2316 -1716
- package/dist/evalops/agent-bootstrap.d.ts +9 -0
- package/dist/evalops/agent-bootstrap.d.ts.map +1 -1
- package/dist/evalops/agent-bootstrap.js +254 -36
- package/dist/evalops/agent-bootstrap.js.map +1 -1
- package/dist/evalops/managed-context.d.ts +34 -0
- package/dist/evalops/managed-context.d.ts.map +1 -0
- package/dist/evalops/managed-context.js +183 -0
- package/dist/evalops/managed-context.js.map +1 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +6 -1
- package/dist/main.js.map +1 -1
- package/dist/memory/auto-extraction.d.ts.map +1 -1
- package/dist/memory/auto-extraction.js +58 -0
- package/dist/memory/auto-extraction.js.map +1 -1
- package/dist/memory/backend.d.ts +1 -0
- package/dist/memory/backend.d.ts.map +1 -1
- package/dist/memory/backend.js.map +1 -1
- package/dist/memory/service-client.d.ts +1 -0
- package/dist/memory/service-client.d.ts.map +1 -1
- package/dist/memory/service-client.js +32 -8
- package/dist/memory/service-client.js.map +1 -1
- package/dist/models/builtin.d.ts.map +1 -1
- package/dist/models/builtin.js +2 -3
- package/dist/models/builtin.js.map +1 -1
- package/dist/oauth/evalops.d.ts.map +1 -1
- package/dist/oauth/evalops.js +2 -1
- package/dist/oauth/evalops.js.map +1 -1
- package/dist/oauth/storage.d.ts +1 -0
- package/dist/oauth/storage.d.ts.map +1 -1
- package/dist/oauth/storage.js +6 -0
- package/dist/oauth/storage.js.map +1 -1
- package/dist/platform/client.d.ts.map +1 -1
- package/dist/platform/client.js +3 -0
- package/dist/platform/client.js.map +1 -1
- package/dist/platform/core-services.d.ts +1 -0
- package/dist/platform/core-services.d.ts.map +1 -1
- package/dist/platform/core-services.js +1 -0
- package/dist/platform/core-services.js.map +1 -1
- package/dist/platform/tool-execution-client.d.ts.map +1 -1
- package/dist/platform/tool-execution-client.js +3 -0
- package/dist/platform/tool-execution-client.js.map +1 -1
- package/dist/providers/auth.d.ts +1 -1
- package/dist/providers/auth.d.ts.map +1 -1
- package/dist/providers/auth.js +30 -2
- package/dist/providers/auth.js.map +1 -1
- package/dist/providers/evalops-managed.d.ts +1 -0
- package/dist/providers/evalops-managed.d.ts.map +1 -1
- package/dist/providers/evalops-managed.js +1 -0
- package/dist/providers/evalops-managed.js.map +1 -1
- package/dist/telemetry/maestro-event-bus.d.ts.map +1 -1
- package/dist/telemetry/maestro-event-bus.js +16 -47
- package/dist/telemetry/maestro-event-bus.js.map +1 -1
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +98 -2
- package/dist/telemetry.js.map +1 -1
- package/dist/version.json +2 -2
- package/node_modules/@evalops/contracts/package.json +1 -1
- package/node_modules/@evalops/tui/package.json +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-extraction.js","sourceRoot":"","sources":["../../src/memory/auto-extraction.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { getLastAssistantMessage } from \"../agent/index.js\";\nimport type { Agent, Api, Model, TextContent } from \"../agent/index.js\";\nimport { buildSessionMemoryContent } from \"../session/session-memory.js\";\nimport { safeJsonParse } from \"../utils/json.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport { getDurableMemoryBackend } from \"./backend.js\";\nimport { upsertDurableMemory } from \"./store.js\";\n\nconst logger = createLogger(\"memory:auto-extraction\");\n\nconst EXTRACTION_DEBOUNCE_MS =\n\tNumber.parseInt(\n\t\tprocess.env.MAESTRO_MEMORY_EXTRACTION_DEBOUNCE_MS || \"1500\",\n\t\t10,\n\t) || 1500;\nconst MIN_ASSISTANT_TURNS =\n\tNumber.parseInt(\n\t\tprocess.env.MAESTRO_MEMORY_EXTRACTION_MIN_ASSISTANT_TURNS || \"1\",\n\t\t10,\n\t) || 1;\nconst MIN_CONTENT_CHARS =\n\tNumber.parseInt(\n\t\tprocess.env.MAESTRO_MEMORY_EXTRACTION_MIN_CONTENT_CHARS || \"220\",\n\t\t10,\n\t) || 220;\nconst MAX_EXTRACTED_MEMORIES =\n\tNumber.parseInt(process.env.MAESTRO_MEMORY_EXTRACTION_MAX_ITEMS || \"8\", 10) ||\n\t8;\n\nconst MEMORY_EXTRACTION_SYSTEM_PROMPT = `\nYou extract durable cross-session memory from a session summary.\n\nOnly keep information that is likely to matter in future sessions:\n- stable user or project preferences\n- durable conventions, constraints, or workflows\n- ongoing project state that will still matter later\n- recurring setup facts that are expensive to rediscover\n\nDo not keep:\n- transient next steps\n- one-off debugging output\n- temporary status updates\n- generic facts already obvious from the repository\n\nOutput ONLY valid JSON with this shape:\n{\"memories\":[{\"topic\":\"lowercase-topic\",\"content\":\"concise standalone sentence\",\"tags\":[\"tag\"]}]}\n\nRules:\n- Return {\"memories\":[]} when nothing qualifies.\n- Use lowercase kebab-case topics.\n- Keep content concise and specific.\n- Do not duplicate the same idea with different wording.\n- Do not wrap the JSON in Markdown.\n`.trim();\n\ninterface ExtractedMemoryCandidate {\n\ttopic: string;\n\tcontent: string;\n\ttags?: string[];\n}\n\ninterface ExtractionPayload {\n\tmemories: ExtractedMemoryCandidate[];\n}\n\nexport interface AutomaticMemoryExtractionCoordinator {\n\tschedule(sessionPath?: string | null): void;\n\tflush(): Promise<void>;\n}\n\ninterface AutomaticMemoryExtractionOptions {\n\tcreateAgent: () => Promise<Agent>;\n\tgetModel: () => Model<Api>;\n\tonProcessed?: () => void;\n\tsessionManager: {\n\t\tgetSessionFile(): string | null | undefined;\n\t\tflush(): Promise<void>;\n\t\tsaveSessionMemoryExtractionHash(hash: string, sessionPath?: string): void;\n\t};\n}\n\nfunction buildExtractionPrompt(sessionMemory: string): string {\n\treturn [\n\t\t\"Extract durable cross-session memories from this session snapshot.\",\n\t\t`Return at most ${MAX_EXTRACTED_MEMORIES} memories.`,\n\t\t\"\",\n\t\t\"Session snapshot:\",\n\t\t\"```text\",\n\t\tsessionMemory,\n\t\t\"```\",\n\t].join(\"\\n\");\n}\n\nfunction hashSessionMemory(content: string): string {\n\tconst stableContent = content\n\t\t.split(\"\\n\")\n\t\t.filter((line) => !line.startsWith(\"- Updated: \"))\n\t\t.join(\"\\n\");\n\treturn createHash(\"sha256\").update(stableContent).digest(\"hex\");\n}\n\nfunction stripCodeFence(text: string): string {\n\tconst trimmed = text.trim();\n\tif (!trimmed.startsWith(\"```\")) {\n\t\treturn trimmed;\n\t}\n\treturn trimmed\n\t\t.replace(/^```(?:json)?\\s*/i, \"\")\n\t\t.replace(/\\s*```$/, \"\")\n\t\t.trim();\n}\n\nfunction extractJsonDocument(text: string): string {\n\tconst stripped = stripCodeFence(text);\n\tif (stripped.startsWith(\"{\") && stripped.endsWith(\"}\")) {\n\t\treturn stripped;\n\t}\n\tconst start = stripped.indexOf(\"{\");\n\tconst end = stripped.lastIndexOf(\"}\");\n\tif (start >= 0 && end > start) {\n\t\treturn stripped.slice(start, end + 1);\n\t}\n\treturn stripped;\n}\n\nfunction isExtractedMemoryCandidate(\n\tvalue: unknown,\n): value is ExtractedMemoryCandidate {\n\tif (!value || typeof value !== \"object\") {\n\t\treturn false;\n\t}\n\tconst candidate = value as Record<string, unknown>;\n\treturn (\n\t\ttypeof candidate.topic === \"string\" &&\n\t\ttypeof candidate.content === \"string\" &&\n\t\t(candidate.tags === undefined ||\n\t\t\t(Array.isArray(candidate.tags) &&\n\t\t\t\tcandidate.tags.every((tag) => typeof tag === \"string\")))\n\t);\n}\n\nfunction isExtractionPayload(value: unknown): value is ExtractionPayload {\n\tif (!value || typeof value !== \"object\") {\n\t\treturn false;\n\t}\n\tconst payload = value as Record<string, unknown>;\n\treturn (\n\t\tArray.isArray(payload.memories) &&\n\t\tpayload.memories.every((candidate) => isExtractedMemoryCandidate(candidate))\n\t);\n}\n\nfunction normalizeCandidate(\n\tcandidate: ExtractedMemoryCandidate,\n): ExtractedMemoryCandidate | null {\n\tconst topic = candidate.topic.trim().toLowerCase();\n\tconst content = candidate.content.replace(/\\s+/g, \" \").trim();\n\tconst tags = candidate.tags\n\t\t?.map((tag) => tag.trim().toLowerCase())\n\t\t.filter(Boolean);\n\tif (!topic || !content) {\n\t\treturn null;\n\t}\n\treturn {\n\t\ttopic,\n\t\tcontent,\n\t\ttags: tags?.length ? Array.from(new Set(tags)).sort() : undefined,\n\t};\n}\n\nfunction dedupeCandidates(\n\tcandidates: ExtractedMemoryCandidate[],\n): ExtractedMemoryCandidate[] {\n\tconst seen = new Set<string>();\n\tconst deduped: ExtractedMemoryCandidate[] = [];\n\tfor (const candidate of candidates) {\n\t\tconst normalized = normalizeCandidate(candidate);\n\t\tif (!normalized) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst key = `${normalized.topic}\\u0000${normalized.content.toLowerCase()}`;\n\t\tif (seen.has(key)) {\n\t\t\tcontinue;\n\t\t}\n\t\tseen.add(key);\n\t\tdeduped.push(normalized);\n\t\tif (deduped.length >= MAX_EXTRACTED_MEMORIES) {\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn deduped;\n}\n\nfunction extractAssistantText(agent: Agent): string {\n\tconst assistant = getLastAssistantMessage(agent.state.messages);\n\tif (!assistant) {\n\t\treturn \"\";\n\t}\n\treturn assistant.content\n\t\t.filter((block): block is TextContent => block.type === \"text\")\n\t\t.map((block) => block.text)\n\t\t.join(\"\\n\")\n\t\t.trim();\n}\n\nasync function extractDurableMemories(params: {\n\tcreateAgent: () => Promise<Agent>;\n\tsessionMemory: string;\n}): Promise<ExtractedMemoryCandidate[]> {\n\tconst agent = await params.createAgent();\n\tconst prompt = buildExtractionPrompt(params.sessionMemory);\n\tawait agent.prompt(prompt);\n\n\tconst raw = extractAssistantText(agent);\n\tif (!raw) {\n\t\tthrow new Error(\"Memory extractor returned no assistant text\");\n\t}\n\tconst parsed = safeJsonParse<unknown>(\n\t\textractJsonDocument(raw),\n\t\t\"automatic durable memory extraction\",\n\t);\n\tif (!parsed.success || !isExtractionPayload(parsed.data)) {\n\t\tthrow new Error(\"Memory extractor returned invalid JSON payload\");\n\t}\n\treturn dedupeCandidates(parsed.data.memories);\n}\n\nexport function createAutomaticMemoryExtractionCoordinator(\n\toptions: AutomaticMemoryExtractionOptions,\n): AutomaticMemoryExtractionCoordinator {\n\tlet timer: ReturnType<typeof setTimeout> | null = null;\n\tlet queuedSessionPath: string | null = null;\n\tlet running: Promise<void> | null = null;\n\n\tconst runPending = async (): Promise<void> => {\n\t\tif (running) {\n\t\t\treturn running;\n\t\t}\n\t\trunning = (async () => {\n\t\t\twhile (queuedSessionPath) {\n\t\t\t\tconst sessionPath = queuedSessionPath;\n\t\t\t\tqueuedSessionPath = null;\n\t\t\t\ttry {\n\t\t\t\t\tawait options.sessionManager.flush();\n\t\t\t\t\tconst snapshot = buildSessionMemoryContent(sessionPath);\n\t\t\t\t\tif (!snapshot) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (snapshot.assistantTurnCount < MIN_ASSISTANT_TURNS) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (snapshot.content.length < MIN_CONTENT_CHARS) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst extractionHash = hashSessionMemory(snapshot.content);\n\t\t\t\t\tif (snapshot.memoryExtractionHash === extractionHash) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tconst memories = await extractDurableMemories({\n\t\t\t\t\t\tcreateAgent: options.createAgent,\n\t\t\t\t\t\tsessionMemory: snapshot.content,\n\t\t\t\t\t});\n\t\t\t\t\tlet added = 0;\n\t\t\t\t\tlet updated = 0;\n\t\t\t\t\tlet remoteAdded = 0;\n\t\t\t\t\tlet remoteUpdated = 0;\n\t\t\t\t\tconst durableMemoryBackend = getDurableMemoryBackend();\n\t\t\t\t\tfor (const memory of memories) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst remoteResult =\n\t\t\t\t\t\t\t\tawait durableMemoryBackend.upsertDurableMemory(\n\t\t\t\t\t\t\t\t\tmemory.topic,\n\t\t\t\t\t\t\t\t\tmemory.content,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttags: [\"auto\", \"durable\", ...(memory.tags ?? [])],\n\t\t\t\t\t\t\t\t\t\tcwd: snapshot.cwd,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (remoteResult?.created) {\n\t\t\t\t\t\t\t\tremoteAdded += 1;\n\t\t\t\t\t\t\t} else if (remoteResult?.updated) {\n\t\t\t\t\t\t\t\tremoteUpdated += 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tlogger.warn(\"Failed to mirror durable memory to remote service\", {\n\t\t\t\t\t\t\t\tsessionId: snapshot.sessionId,\n\t\t\t\t\t\t\t\ttopic: memory.topic,\n\t\t\t\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst result = upsertDurableMemory(memory.topic, memory.content, {\n\t\t\t\t\t\t\ttags: [\"auto\", \"durable\", ...(memory.tags ?? [])],\n\t\t\t\t\t\t\tcwd: snapshot.cwd,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (result.created) {\n\t\t\t\t\t\t\tadded += 1;\n\t\t\t\t\t\t} else if (result.updated) {\n\t\t\t\t\t\t\tupdated += 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\toptions.sessionManager.saveSessionMemoryExtractionHash(\n\t\t\t\t\t\textractionHash,\n\t\t\t\t\t\tsessionPath,\n\t\t\t\t\t);\n\t\t\t\t\toptions.onProcessed?.();\n\t\t\t\t\tlogger.info(\"Updated durable memories from session\", {\n\t\t\t\t\t\tsessionId: snapshot.sessionId,\n\t\t\t\t\t\tmodel: options.getModel().id,\n\t\t\t\t\t\tadded,\n\t\t\t\t\t\tupdated,\n\t\t\t\t\t\textracted: memories.length,\n\t\t\t\t\t\tremoteAdded,\n\t\t\t\t\t\tremoteUpdated,\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger.warn(\"Automatic durable memory extraction failed\", {\n\t\t\t\t\t\tsessionPath,\n\t\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t})().finally(() => {\n\t\t\trunning = null;\n\t\t});\n\t\treturn running;\n\t};\n\n\tconst schedule = (sessionPath?: string | null): void => {\n\t\tconst target = sessionPath ?? options.sessionManager.getSessionFile();\n\t\tif (!target) {\n\t\t\treturn;\n\t\t}\n\t\tqueuedSessionPath = target;\n\t\tif (timer) {\n\t\t\tclearTimeout(timer);\n\t\t}\n\t\ttimer = setTimeout(() => {\n\t\t\ttimer = null;\n\t\t\tvoid runPending();\n\t\t}, EXTRACTION_DEBOUNCE_MS);\n\t\tif (process.env.VITEST === \"true\" || process.env.NODE_ENV === \"test\") {\n\t\t\ttimer.unref();\n\t\t}\n\t};\n\n\tconst flush = async (): Promise<void> => {\n\t\tif (timer) {\n\t\t\tclearTimeout(timer);\n\t\t\ttimer = null;\n\t\t}\n\t\tif (queuedSessionPath) {\n\t\t\tawait runPending();\n\t\t} else if (running) {\n\t\t\tawait running;\n\t\t}\n\t};\n\n\treturn { schedule, flush };\n}\n\nexport function getMemoryExtractionSystemPrompt(): string {\n\treturn MEMORY_EXTRACTION_SYSTEM_PROMPT;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"auto-extraction.js","sourceRoot":"","sources":["../../src/memory/auto-extraction.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { getLastAssistantMessage } from \"../agent/index.js\";\nimport type { Agent, Api, Model, TextContent } from \"../agent/index.js\";\nimport { buildSessionMemoryContent } from \"../session/session-memory.js\";\nimport { recordMaestroLearnedContext } from \"../telemetry/maestro-event-bus.js\";\nimport { safeJsonParse } from \"../utils/json.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport { getDurableMemoryBackend } from \"./backend.js\";\nimport { upsertDurableMemory } from \"./store.js\";\nimport { getMemoryProjectScope } from \"./team-memory.js\";\n\nconst logger = createLogger(\"memory:auto-extraction\");\n\nconst EXTRACTION_DEBOUNCE_MS =\n\tNumber.parseInt(\n\t\tprocess.env.MAESTRO_MEMORY_EXTRACTION_DEBOUNCE_MS || \"1500\",\n\t\t10,\n\t) || 1500;\nconst MIN_ASSISTANT_TURNS =\n\tNumber.parseInt(\n\t\tprocess.env.MAESTRO_MEMORY_EXTRACTION_MIN_ASSISTANT_TURNS || \"1\",\n\t\t10,\n\t) || 1;\nconst MIN_CONTENT_CHARS =\n\tNumber.parseInt(\n\t\tprocess.env.MAESTRO_MEMORY_EXTRACTION_MIN_CONTENT_CHARS || \"220\",\n\t\t10,\n\t) || 220;\nconst MAX_EXTRACTED_MEMORIES =\n\tNumber.parseInt(process.env.MAESTRO_MEMORY_EXTRACTION_MAX_ITEMS || \"8\", 10) ||\n\t8;\n\nconst MEMORY_EXTRACTION_SYSTEM_PROMPT = `\nYou extract durable cross-session memory from a session summary.\n\nOnly keep information that is likely to matter in future sessions:\n- stable user or project preferences\n- durable conventions, constraints, or workflows\n- ongoing project state that will still matter later\n- recurring setup facts that are expensive to rediscover\n\nDo not keep:\n- transient next steps\n- one-off debugging output\n- temporary status updates\n- generic facts already obvious from the repository\n\nOutput ONLY valid JSON with this shape:\n{\"memories\":[{\"topic\":\"lowercase-topic\",\"content\":\"concise standalone sentence\",\"tags\":[\"tag\"]}]}\n\nRules:\n- Return {\"memories\":[]} when nothing qualifies.\n- Use lowercase kebab-case topics.\n- Keep content concise and specific.\n- Do not duplicate the same idea with different wording.\n- Do not wrap the JSON in Markdown.\n`.trim();\n\ninterface ExtractedMemoryCandidate {\n\ttopic: string;\n\tcontent: string;\n\ttags?: string[];\n}\n\ninterface ExtractionPayload {\n\tmemories: ExtractedMemoryCandidate[];\n}\n\nexport interface AutomaticMemoryExtractionCoordinator {\n\tschedule(sessionPath?: string | null): void;\n\tflush(): Promise<void>;\n}\n\ninterface AutomaticMemoryExtractionOptions {\n\tcreateAgent: () => Promise<Agent>;\n\tgetModel: () => Model<Api>;\n\tonProcessed?: () => void;\n\tsessionManager: {\n\t\tgetSessionFile(): string | null | undefined;\n\t\tflush(): Promise<void>;\n\t\tsaveSessionMemoryExtractionHash(hash: string, sessionPath?: string): void;\n\t};\n}\n\nfunction buildExtractionPrompt(sessionMemory: string): string {\n\treturn [\n\t\t\"Extract durable cross-session memories from this session snapshot.\",\n\t\t`Return at most ${MAX_EXTRACTED_MEMORIES} memories.`,\n\t\t\"\",\n\t\t\"Session snapshot:\",\n\t\t\"```text\",\n\t\tsessionMemory,\n\t\t\"```\",\n\t].join(\"\\n\");\n}\n\nfunction hashSessionMemory(content: string): string {\n\tconst stableContent = content\n\t\t.split(\"\\n\")\n\t\t.filter((line) => !line.startsWith(\"- Updated: \"))\n\t\t.join(\"\\n\");\n\treturn createHash(\"sha256\").update(stableContent).digest(\"hex\");\n}\n\nfunction learnedContextID(\n\tsessionId: string,\n\ttopic: string,\n\tcontent: string,\n): string {\n\tconst hash = createHash(\"sha256\")\n\t\t.update(`${sessionId}\\u0000${topic}\\u0000${content}`)\n\t\t.digest(\"hex\")\n\t\t.slice(0, 16);\n\tconst topicPart =\n\t\ttopic\n\t\t\t.trim()\n\t\t\t.toLowerCase()\n\t\t\t.replace(/[^a-z0-9]+/g, \"-\")\n\t\t\t.replace(/^-+|-+$/g, \"\") || \"memory\";\n\treturn `${sessionId}-${topicPart}-${hash}`;\n}\n\nfunction learnedContextDimension(topic: string): string {\n\tconst topicPart =\n\t\ttopic\n\t\t\t.trim()\n\t\t\t.toLowerCase()\n\t\t\t.replace(/[^a-z0-9]+/g, \"_\")\n\t\t\t.replace(/^_+|_+$/g, \"\") || \"memory\";\n\treturn `memory.${topicPart}`;\n}\n\nfunction learnedContextSubjectKey(cwd: string | undefined): string | undefined {\n\tif (!cwd) {\n\t\treturn undefined;\n\t}\n\tconst scope = getMemoryProjectScope(cwd);\n\treturn scope?.projectId ? `repo:${scope.projectId}` : undefined;\n}\n\nfunction publishLearnedContext(params: {\n\tcontent: string;\n\tcwd?: string;\n\tsessionId: string;\n\ttopic: string;\n}): void {\n\trecordMaestroLearnedContext({\n\t\tlearning_id: learnedContextID(\n\t\t\tparams.sessionId,\n\t\t\tparams.topic,\n\t\t\tparams.content,\n\t\t),\n\t\tsubject_key: learnedContextSubjectKey(params.cwd),\n\t\tstatement: params.content,\n\t\tdimension: learnedContextDimension(params.topic),\n\t\tconfidence_score: 0.78,\n\t\tconfidence_reason:\n\t\t\t\"Automatic durable memory extraction from a Maestro session summary.\",\n\t\tevidence: [\n\t\t\t{\n\t\t\t\tsource: \"maestro-session\",\n\t\t\t\tsource_id: params.sessionId,\n\t\t\t\turi: `maestro://sessions/${params.sessionId}`,\n\t\t\t\texcerpt: params.content,\n\t\t\t},\n\t\t],\n\t\tcorrelation: {\n\t\t\tsession_id: params.sessionId,\n\t\t\tagent_id: \"maestro\",\n\t\t},\n\t});\n}\n\nfunction stripCodeFence(text: string): string {\n\tconst trimmed = text.trim();\n\tif (!trimmed.startsWith(\"```\")) {\n\t\treturn trimmed;\n\t}\n\treturn trimmed\n\t\t.replace(/^```(?:json)?\\s*/i, \"\")\n\t\t.replace(/\\s*```$/, \"\")\n\t\t.trim();\n}\n\nfunction extractJsonDocument(text: string): string {\n\tconst stripped = stripCodeFence(text);\n\tif (stripped.startsWith(\"{\") && stripped.endsWith(\"}\")) {\n\t\treturn stripped;\n\t}\n\tconst start = stripped.indexOf(\"{\");\n\tconst end = stripped.lastIndexOf(\"}\");\n\tif (start >= 0 && end > start) {\n\t\treturn stripped.slice(start, end + 1);\n\t}\n\treturn stripped;\n}\n\nfunction isExtractedMemoryCandidate(\n\tvalue: unknown,\n): value is ExtractedMemoryCandidate {\n\tif (!value || typeof value !== \"object\") {\n\t\treturn false;\n\t}\n\tconst candidate = value as Record<string, unknown>;\n\treturn (\n\t\ttypeof candidate.topic === \"string\" &&\n\t\ttypeof candidate.content === \"string\" &&\n\t\t(candidate.tags === undefined ||\n\t\t\t(Array.isArray(candidate.tags) &&\n\t\t\t\tcandidate.tags.every((tag) => typeof tag === \"string\")))\n\t);\n}\n\nfunction isExtractionPayload(value: unknown): value is ExtractionPayload {\n\tif (!value || typeof value !== \"object\") {\n\t\treturn false;\n\t}\n\tconst payload = value as Record<string, unknown>;\n\treturn (\n\t\tArray.isArray(payload.memories) &&\n\t\tpayload.memories.every((candidate) => isExtractedMemoryCandidate(candidate))\n\t);\n}\n\nfunction normalizeCandidate(\n\tcandidate: ExtractedMemoryCandidate,\n): ExtractedMemoryCandidate | null {\n\tconst topic = candidate.topic.trim().toLowerCase();\n\tconst content = candidate.content.replace(/\\s+/g, \" \").trim();\n\tconst tags = candidate.tags\n\t\t?.map((tag) => tag.trim().toLowerCase())\n\t\t.filter(Boolean);\n\tif (!topic || !content) {\n\t\treturn null;\n\t}\n\treturn {\n\t\ttopic,\n\t\tcontent,\n\t\ttags: tags?.length ? Array.from(new Set(tags)).sort() : undefined,\n\t};\n}\n\nfunction dedupeCandidates(\n\tcandidates: ExtractedMemoryCandidate[],\n): ExtractedMemoryCandidate[] {\n\tconst seen = new Set<string>();\n\tconst deduped: ExtractedMemoryCandidate[] = [];\n\tfor (const candidate of candidates) {\n\t\tconst normalized = normalizeCandidate(candidate);\n\t\tif (!normalized) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst key = `${normalized.topic}\\u0000${normalized.content.toLowerCase()}`;\n\t\tif (seen.has(key)) {\n\t\t\tcontinue;\n\t\t}\n\t\tseen.add(key);\n\t\tdeduped.push(normalized);\n\t\tif (deduped.length >= MAX_EXTRACTED_MEMORIES) {\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn deduped;\n}\n\nfunction extractAssistantText(agent: Agent): string {\n\tconst assistant = getLastAssistantMessage(agent.state.messages);\n\tif (!assistant) {\n\t\treturn \"\";\n\t}\n\treturn assistant.content\n\t\t.filter((block): block is TextContent => block.type === \"text\")\n\t\t.map((block) => block.text)\n\t\t.join(\"\\n\")\n\t\t.trim();\n}\n\nasync function extractDurableMemories(params: {\n\tcreateAgent: () => Promise<Agent>;\n\tsessionMemory: string;\n}): Promise<ExtractedMemoryCandidate[]> {\n\tconst agent = await params.createAgent();\n\tconst prompt = buildExtractionPrompt(params.sessionMemory);\n\tawait agent.prompt(prompt);\n\n\tconst raw = extractAssistantText(agent);\n\tif (!raw) {\n\t\tthrow new Error(\"Memory extractor returned no assistant text\");\n\t}\n\tconst parsed = safeJsonParse<unknown>(\n\t\textractJsonDocument(raw),\n\t\t\"automatic durable memory extraction\",\n\t);\n\tif (!parsed.success || !isExtractionPayload(parsed.data)) {\n\t\tthrow new Error(\"Memory extractor returned invalid JSON payload\");\n\t}\n\treturn dedupeCandidates(parsed.data.memories);\n}\n\nexport function createAutomaticMemoryExtractionCoordinator(\n\toptions: AutomaticMemoryExtractionOptions,\n): AutomaticMemoryExtractionCoordinator {\n\tlet timer: ReturnType<typeof setTimeout> | null = null;\n\tlet queuedSessionPath: string | null = null;\n\tlet running: Promise<void> | null = null;\n\n\tconst runPending = async (): Promise<void> => {\n\t\tif (running) {\n\t\t\treturn running;\n\t\t}\n\t\trunning = (async () => {\n\t\t\twhile (queuedSessionPath) {\n\t\t\t\tconst sessionPath = queuedSessionPath;\n\t\t\t\tqueuedSessionPath = null;\n\t\t\t\ttry {\n\t\t\t\t\tawait options.sessionManager.flush();\n\t\t\t\t\tconst snapshot = buildSessionMemoryContent(sessionPath);\n\t\t\t\t\tif (!snapshot) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (snapshot.assistantTurnCount < MIN_ASSISTANT_TURNS) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (snapshot.content.length < MIN_CONTENT_CHARS) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst extractionHash = hashSessionMemory(snapshot.content);\n\t\t\t\t\tif (snapshot.memoryExtractionHash === extractionHash) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tconst memories = await extractDurableMemories({\n\t\t\t\t\t\tcreateAgent: options.createAgent,\n\t\t\t\t\t\tsessionMemory: snapshot.content,\n\t\t\t\t\t});\n\t\t\t\t\tlet added = 0;\n\t\t\t\t\tlet updated = 0;\n\t\t\t\t\tlet remoteAdded = 0;\n\t\t\t\t\tlet remoteUpdated = 0;\n\t\t\t\t\tconst durableMemoryBackend = getDurableMemoryBackend();\n\t\t\t\t\tfor (const memory of memories) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst remoteResult =\n\t\t\t\t\t\t\t\tawait durableMemoryBackend.upsertDurableMemory(\n\t\t\t\t\t\t\t\t\tmemory.topic,\n\t\t\t\t\t\t\t\t\tmemory.content,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttags: [\"auto\", \"durable\", ...(memory.tags ?? [])],\n\t\t\t\t\t\t\t\t\t\tcwd: snapshot.cwd,\n\t\t\t\t\t\t\t\t\t\tsessionId: snapshot.sessionId,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (remoteResult?.created) {\n\t\t\t\t\t\t\t\tremoteAdded += 1;\n\t\t\t\t\t\t\t} else if (remoteResult?.updated) {\n\t\t\t\t\t\t\t\tremoteUpdated += 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tlogger.warn(\"Failed to mirror durable memory to remote service\", {\n\t\t\t\t\t\t\t\tsessionId: snapshot.sessionId,\n\t\t\t\t\t\t\t\ttopic: memory.topic,\n\t\t\t\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst result = upsertDurableMemory(memory.topic, memory.content, {\n\t\t\t\t\t\t\ttags: [\"auto\", \"durable\", ...(memory.tags ?? [])],\n\t\t\t\t\t\t\tcwd: snapshot.cwd,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (result.created) {\n\t\t\t\t\t\t\tadded += 1;\n\t\t\t\t\t\t} else if (result.updated) {\n\t\t\t\t\t\t\tupdated += 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpublishLearnedContext({\n\t\t\t\t\t\t\tcontent: memory.content,\n\t\t\t\t\t\t\tcwd: snapshot.cwd,\n\t\t\t\t\t\t\tsessionId: snapshot.sessionId,\n\t\t\t\t\t\t\ttopic: memory.topic,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\toptions.sessionManager.saveSessionMemoryExtractionHash(\n\t\t\t\t\t\textractionHash,\n\t\t\t\t\t\tsessionPath,\n\t\t\t\t\t);\n\t\t\t\t\toptions.onProcessed?.();\n\t\t\t\t\tlogger.info(\"Updated durable memories from session\", {\n\t\t\t\t\t\tsessionId: snapshot.sessionId,\n\t\t\t\t\t\tmodel: options.getModel().id,\n\t\t\t\t\t\tadded,\n\t\t\t\t\t\tupdated,\n\t\t\t\t\t\textracted: memories.length,\n\t\t\t\t\t\tremoteAdded,\n\t\t\t\t\t\tremoteUpdated,\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger.warn(\"Automatic durable memory extraction failed\", {\n\t\t\t\t\t\tsessionPath,\n\t\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t})().finally(() => {\n\t\t\trunning = null;\n\t\t});\n\t\treturn running;\n\t};\n\n\tconst schedule = (sessionPath?: string | null): void => {\n\t\tconst target = sessionPath ?? options.sessionManager.getSessionFile();\n\t\tif (!target) {\n\t\t\treturn;\n\t\t}\n\t\tqueuedSessionPath = target;\n\t\tif (timer) {\n\t\t\tclearTimeout(timer);\n\t\t}\n\t\ttimer = setTimeout(() => {\n\t\t\ttimer = null;\n\t\t\tvoid runPending();\n\t\t}, EXTRACTION_DEBOUNCE_MS);\n\t\tif (process.env.VITEST === \"true\" || process.env.NODE_ENV === \"test\") {\n\t\t\ttimer.unref();\n\t\t}\n\t};\n\n\tconst flush = async (): Promise<void> => {\n\t\tif (timer) {\n\t\t\tclearTimeout(timer);\n\t\t\ttimer = null;\n\t\t}\n\t\tif (queuedSessionPath) {\n\t\t\tawait runPending();\n\t\t} else if (running) {\n\t\t\tawait running;\n\t\t}\n\t};\n\n\treturn { schedule, flush };\n}\n\nexport function getMemoryExtractionSystemPrompt(): string {\n\treturn MEMORY_EXTRACTION_SYSTEM_PROMPT;\n}\n"]}
|
package/dist/memory/backend.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/memory/backend.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAElE,MAAM,WAAW,yBAAyB;IACzC,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,gCAAgC;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gCAAgC;IAChD,OAAO,CAAC,EAAE;QACT,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,aAAa,EAAE,WAAW,EAAE,CAAC;IAC7B,OAAO,EAAE,KAAK,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;CACH;AAED,MAAM,WAAW,oBAAoB;IACpC,mBAAmB,CAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QACT,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;KAChB,GACC,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAAC;IAC7C,qBAAqB,CACpB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QACT,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;KACf,GACC,OAAO,CAAC,kBAAkB,EAAE,GAAG,IAAI,CAAC,CAAC;IACxC,4BAA4B,CAC3B,MAAM,EAAE,gCAAgC,GACtC,OAAO,CAAC,gCAAgC,GAAG,IAAI,CAAC,CAAC;CACpD;
|
|
1
|
+
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/memory/backend.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAElE,MAAM,WAAW,yBAAyB;IACzC,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,gCAAgC;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gCAAgC;IAChD,OAAO,CAAC,EAAE;QACT,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,aAAa,EAAE,WAAW,EAAE,CAAC;IAC7B,OAAO,EAAE,KAAK,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;CACH;AAED,MAAM,WAAW,oBAAoB;IACpC,mBAAmB,CAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QACT,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;KAChB,GACC,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAAC;IAC7C,qBAAqB,CACpB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QACT,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;KACf,GACC,OAAO,CAAC,kBAAkB,EAAE,GAAG,IAAI,CAAC,CAAC;IACxC,4BAA4B,CAC3B,MAAM,EAAE,gCAAgC,GACtC,OAAO,CAAC,gCAAgC,GAAG,IAAI,CAAC,CAAC;CACpD;AAoCD,wBAAgB,uBAAuB,IAAI,oBAAoB,CAE9D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend.js","sourceRoot":"","sources":["../../src/memory/backend.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,kCAAkC,EAClC,2BAA2B,EAC3B,yBAAyB,GACzB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"backend.js","sourceRoot":"","sources":["../../src/memory/backend.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,kCAAkC,EAClC,2BAA2B,EAC3B,yBAAyB,GACzB,MAAM,qBAAqB,CAAC;AAqD7B,MAAM,iCAAiC;IACtC,mBAAmB,CAClB,KAAa,EACb,OAAe,EACf,OAMC;QAED,OAAO,yBAAyB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC3D,CAAC;IAED,qBAAqB,CACpB,KAAa,EACb,OAGC;QAED,OAAO,2BAA2B,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAED,4BAA4B,CAC3B,MAAwC;QAExC,OAAO,kCAAkC,CAAC,MAAM,CAAC,CAAC;IACnD,CAAC;CACD;AAED,MAAM,2BAA2B,GAAG,IAAI,iCAAiC,EAAE,CAAC;AAE5E,MAAM,UAAU,uBAAuB;IACtC,OAAO,2BAA2B,CAAC;AACpC,CAAC","sourcesContent":["import {\n\tapplyRemoteAutoMemoryConsolidation,\n\trecallRemoteDurableMemories,\n\tupsertRemoteDurableMemory,\n} from \"./service-client.js\";\nimport type { MemoryEntry, MemorySearchResult } from \"./types.js\";\n\nexport interface DurableMemoryUpsertResult {\n\tentry: MemoryEntry;\n\tcreated: boolean;\n\tupdated: boolean;\n}\n\nexport interface DurableMemoryConsolidationResult {\n\tremoved: number;\n\tadded: number;\n\tupdated: number;\n}\n\nexport interface DurableMemoryConsolidationParams {\n\toptions?: {\n\t\tcwd?: string;\n\t\tprojectId?: string;\n\t\tprojectName?: string;\n\t};\n\tremoveEntries: MemoryEntry[];\n\tupserts: Array<{\n\t\tcontent: string;\n\t\ttags?: string[];\n\t\ttopic: string;\n\t}>;\n}\n\nexport interface DurableMemoryBackend {\n\tupsertDurableMemory(\n\t\ttopic: string,\n\t\tcontent: string,\n\t\toptions?: {\n\t\t\tcwd?: string;\n\t\t\tprojectId?: string;\n\t\t\tprojectName?: string;\n\t\t\tsessionId?: string;\n\t\t\ttags?: string[];\n\t\t},\n\t): Promise<DurableMemoryUpsertResult | null>;\n\trecallDurableMemories(\n\t\tquery: string,\n\t\toptions?: {\n\t\t\tcwd?: string;\n\t\t\tlimit?: number;\n\t\t},\n\t): Promise<MemorySearchResult[] | null>;\n\tapplyAutoMemoryConsolidation(\n\t\tparams: DurableMemoryConsolidationParams,\n\t): Promise<DurableMemoryConsolidationResult | null>;\n}\n\nclass ServiceClientDurableMemoryBackend implements DurableMemoryBackend {\n\tupsertDurableMemory(\n\t\ttopic: string,\n\t\tcontent: string,\n\t\toptions?: {\n\t\t\tcwd?: string;\n\t\t\tprojectId?: string;\n\t\t\tprojectName?: string;\n\t\t\tsessionId?: string;\n\t\t\ttags?: string[];\n\t\t},\n\t): Promise<DurableMemoryUpsertResult | null> {\n\t\treturn upsertRemoteDurableMemory(topic, content, options);\n\t}\n\n\trecallDurableMemories(\n\t\tquery: string,\n\t\toptions?: {\n\t\t\tcwd?: string;\n\t\t\tlimit?: number;\n\t\t},\n\t): Promise<MemorySearchResult[] | null> {\n\t\treturn recallRemoteDurableMemories(query, options);\n\t}\n\n\tapplyAutoMemoryConsolidation(\n\t\tparams: DurableMemoryConsolidationParams,\n\t): Promise<DurableMemoryConsolidationResult | null> {\n\t\treturn applyRemoteAutoMemoryConsolidation(params);\n\t}\n}\n\nconst defaultDurableMemoryBackend = new ServiceClientDurableMemoryBackend();\n\nexport function getDurableMemoryBackend(): DurableMemoryBackend {\n\treturn defaultDurableMemoryBackend;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-client.d.ts","sourceRoot":"","sources":["../../src/memory/service-client.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"service-client.d.ts","sourceRoot":"","sources":["../../src/memory/service-client.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AA8blE,wBAAsB,yBAAyB,CAC9C,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IACT,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CAChB,GACC,OAAO,CAAC;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAAC,CAa5E;AAED,wBAAsB,2BAA2B,CAChD,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;IACT,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CACf,GACC,OAAO,CAAC,kBAAkB,EAAE,GAAG,IAAI,CAAC,CAiCtC;AAED,wBAAsB,kCAAkC,CAAC,MAAM,EAAE;IAChE,OAAO,CAAC,EAAE;QACT,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,aAAa,EAAE,WAAW,EAAE,CAAC;IAC7B,OAAO,EAAE,KAAK,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;CACH,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CA4CtE"}
|
|
@@ -8,6 +8,7 @@ const DURABLE_MEMORY_TAG = "maestro-kind:durable-memory";
|
|
|
8
8
|
const SOURCE_TAG = "source:maestro";
|
|
9
9
|
const TOPIC_TAG_PREFIX = "maestro-topic:";
|
|
10
10
|
const PROJECT_NAME_TAG_PREFIX = "maestro-project-name:";
|
|
11
|
+
const SESSION_TAG_PREFIX = "maestro-session:";
|
|
11
12
|
function normalizeTopic(topic) {
|
|
12
13
|
return topic.toLowerCase().trim();
|
|
13
14
|
}
|
|
@@ -103,7 +104,7 @@ function resolveRemoteScope(options) {
|
|
|
103
104
|
repository: scope.projectId,
|
|
104
105
|
};
|
|
105
106
|
}
|
|
106
|
-
function buildRemoteMemoryTags(topic, tags, projectName) {
|
|
107
|
+
function buildRemoteMemoryTags(topic, tags, projectName, sessionId) {
|
|
107
108
|
return (mergeTags([
|
|
108
109
|
SOURCE_TAG,
|
|
109
110
|
DURABLE_MEMORY_TAG,
|
|
@@ -111,10 +112,11 @@ function buildRemoteMemoryTags(topic, tags, projectName) {
|
|
|
111
112
|
...(projectName
|
|
112
113
|
? [`${PROJECT_NAME_TAG_PREFIX}${projectName.trim().toLowerCase()}`]
|
|
113
114
|
: []),
|
|
115
|
+
...(sessionId ? [`${SESSION_TAG_PREFIX}${sessionId.trim()}`] : []),
|
|
114
116
|
], tags) ?? []);
|
|
115
117
|
}
|
|
116
|
-
function buildSourceReferences(topic, scope) {
|
|
117
|
-
|
|
118
|
+
function buildSourceReferences(topic, scope, options) {
|
|
119
|
+
const references = [
|
|
118
120
|
{
|
|
119
121
|
uri: scope.repository
|
|
120
122
|
? `repo:${scope.repository}`
|
|
@@ -130,6 +132,23 @@ function buildSourceReferences(topic, scope) {
|
|
|
130
132
|
},
|
|
131
133
|
},
|
|
132
134
|
];
|
|
135
|
+
const sessionId = options?.sessionId?.trim();
|
|
136
|
+
if (sessionId) {
|
|
137
|
+
references.push({
|
|
138
|
+
uri: `maestro://sessions/${sessionId}`,
|
|
139
|
+
title: `Maestro session ${sessionId}`,
|
|
140
|
+
type: "maestro-session",
|
|
141
|
+
metadata: {
|
|
142
|
+
source: "maestro",
|
|
143
|
+
sessionId,
|
|
144
|
+
topic: normalizeTopic(topic),
|
|
145
|
+
...(scope.projectId ? { projectId: scope.projectId } : {}),
|
|
146
|
+
...(scope.projectName ? { projectName: scope.projectName } : {}),
|
|
147
|
+
...(scope.repository ? { repository: scope.repository } : {}),
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
return references;
|
|
133
152
|
}
|
|
134
153
|
function extractTopicFromTags(tags) {
|
|
135
154
|
return tags
|
|
@@ -173,7 +192,8 @@ function toLocalMemoryEntry(record, scope) {
|
|
|
173
192
|
.filter((tag) => tag !== SOURCE_TAG &&
|
|
174
193
|
tag !== DURABLE_MEMORY_TAG &&
|
|
175
194
|
!tag.startsWith(TOPIC_TAG_PREFIX) &&
|
|
176
|
-
!tag.startsWith(PROJECT_NAME_TAG_PREFIX)
|
|
195
|
+
!tag.startsWith(PROJECT_NAME_TAG_PREFIX) &&
|
|
196
|
+
!tag.startsWith(SESSION_TAG_PREFIX));
|
|
177
197
|
return {
|
|
178
198
|
id: record.id,
|
|
179
199
|
topic: extractTopicFromTags(record.tags) ?? "memory",
|
|
@@ -211,7 +231,7 @@ function findMatchingRemoteRecord(records, topic, content) {
|
|
|
211
231
|
}
|
|
212
232
|
async function upsertRemoteDurableMemoryWithConfig(config, scope, topic, content, options) {
|
|
213
233
|
const nextContent = normalizeContent(content);
|
|
214
|
-
const nextTags = buildRemoteMemoryTags(topic, options?.tags, scope.projectName);
|
|
234
|
+
const nextTags = buildRemoteMemoryTags(topic, options?.tags, scope.projectName, options?.sessionId);
|
|
215
235
|
const existingRecords = options?.existingRecords ??
|
|
216
236
|
(await listRemoteRecordsForScope(config, scope));
|
|
217
237
|
const existing = findMatchingRemoteRecord(existingRecords, topic, nextContent);
|
|
@@ -225,7 +245,9 @@ async function upsertRemoteDurableMemoryWithConfig(config, scope, topic, content
|
|
|
225
245
|
agentId: config.agentId,
|
|
226
246
|
tags: nextTags,
|
|
227
247
|
reviewStatus: "approved",
|
|
228
|
-
sourceReferences: buildSourceReferences(topic, scope
|
|
248
|
+
sourceReferences: buildSourceReferences(topic, scope, {
|
|
249
|
+
sessionId: options?.sessionId,
|
|
250
|
+
}),
|
|
229
251
|
};
|
|
230
252
|
const created = requireMemory((await config.client.store(request)).memory, "store memory");
|
|
231
253
|
return {
|
|
@@ -250,7 +272,9 @@ async function upsertRemoteDurableMemoryWithConfig(config, scope, topic, content
|
|
|
250
272
|
id: existing.id,
|
|
251
273
|
content: nextContent,
|
|
252
274
|
reviewStatus: "approved",
|
|
253
|
-
sourceReferences: buildSourceReferences(topic, scope
|
|
275
|
+
sourceReferences: buildSourceReferences(topic, scope, {
|
|
276
|
+
sessionId: options?.sessionId,
|
|
277
|
+
}),
|
|
254
278
|
tags: mergedTags ?? [],
|
|
255
279
|
})).memory, "update memory");
|
|
256
280
|
return {
|
|
@@ -264,7 +288,7 @@ export async function upsertRemoteDurableMemory(topic, content, options) {
|
|
|
264
288
|
if (!config) {
|
|
265
289
|
return null;
|
|
266
290
|
}
|
|
267
|
-
return upsertRemoteDurableMemoryWithConfig(config, resolveRemoteScope(options), topic, content, { tags: options?.tags });
|
|
291
|
+
return upsertRemoteDurableMemoryWithConfig(config, resolveRemoteScope(options), topic, content, { sessionId: options?.sessionId, tags: options?.tags });
|
|
268
292
|
}
|
|
269
293
|
export async function recallRemoteDurableMemories(query, options) {
|
|
270
294
|
const config = await resolveRemoteMemoryConfig();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-client.js","sourceRoot":"","sources":["../../src/memory/service-client.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,WAAW,EACX,qBAAqB,EACrB,oBAAoB,EACpB,aAAa,GACb,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAGzD,MAAM,MAAM,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;AAE9C,MAAM,aAAa,GAAG,SAAS,CAAC;AAChC,MAAM,kBAAkB,GAAG,6BAA6B,CAAC;AACzD,MAAM,UAAU,GAAG,gBAAgB,CAAC;AACpC,MAAM,gBAAgB,GAAG,gBAAgB,CAAC;AAC1C,MAAM,uBAAuB,GAAG,uBAAuB,CAAC;AA8CxD,SAAS,cAAc,CAAC,KAAa;IACpC,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;AACnC,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe;IACxC,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC5C,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAChC,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACjC,CAAC;AAED,SAAS,SAAS,CACjB,OAA2B,EAC3B,IAAwB;IAExB,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;SAClD,GAAG,CAAC,YAAY,CAAC;SACjB,MAAM,CAAC,OAAO,CAAC,CAAC;IAClB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC3C,CAAC;AAED,SAAS,mBAAmB,CAC3B,GAAG,MAAiC;IAEpC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1D,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;QACrB,CAAC;IACF,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,oBAAoB;IAC5B,OAAO,CACN,WAAW,CAAC,CAAC,yBAAyB,EAAE,kBAAkB,CAAC,CAAC;QAC5D,aAAa,CACb,CAAC;AACH,CAAC;AAED,KAAK,UAAU,yBAAyB;IACvC,MAAM,OAAO,GAAG,WAAW,CAAC;QAC3B,qBAAqB;QACrB,4BAA4B;QAC5B,2BAA2B;QAC3B,0BAA0B;QAC1B,kBAAkB;KAClB,CAAC,CAAC;IACH,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,cAAc,GAAG,qBAAqB,CAAC;QAC5C,gCAAgC;QAChC,wBAAwB;QACxB,yBAAyB;QACzB,2BAA2B;KAC3B,CAAC,CAAC;IACH,IAAI,CAAC,cAAc,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CACV,sFAAsF,CACtF,CAAC;QACF,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC;QACxC,6BAA6B;QAC7B,8BAA8B;QAC9B,eAAe;KACf,CAAC,CAAC;IACH,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,MAAM,CAAC,IAAI,CACV,mFAAmF,CACnF,CAAC;QACF,OAAO,IAAI,CAAC;IACb,CAAC;IAED,OAAO;QACN,OAAO,EAAE,oBAAoB,EAAE;QAC/B,MAAM,EAAE,IAAI,YAAY,CAAC;YACxB,OAAO;YACP,WAAW,EAAE,KAAK;YAClB,cAAc;SACd,CAAC;QACF,MAAM,EAAE,aAAa,CAAC;YACrB,wBAAwB;YACxB,yBAAyB;YACzB,6BAA6B;SAC7B,CAAC;KACF,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,OAI3B;IACA,IAAI,OAAO,EAAE,SAAS,KAAK,SAAS,EAAE,CAAC;QACtC,OAAO;YACN,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,UAAU,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;QACnB,OAAO,EAAE,CAAC;IACX,CAAC;IAED,MAAM,KAAK,GAAG,qBAAqB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjD,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,OAAO,EAAE,CAAC;IACX,CAAC;IAED,OAAO;QACN,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,UAAU,EAAE,KAAK,CAAC,SAAS;KAC3B,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAC7B,KAAa,EACb,IAAwB,EACxB,WAAoB;IAEpB,OAAO,CACN,SAAS,CACR;QACC,UAAU;QACV,kBAAkB;QAClB,GAAG,gBAAgB,GAAG,cAAc,CAAC,KAAK,CAAC,EAAE;QAC7C,GAAG,CAAC,WAAW;YACd,CAAC,CAAC,CAAC,GAAG,uBAAuB,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;YACnE,CAAC,CAAC,EAAE,CAAC;KACN,EACD,IAAI,CACJ,IAAI,EAAE,CACP,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAC7B,KAAa,EACb,KAAwB;IAExB,OAAO;QACN;YACC,GAAG,EAAE,KAAK,CAAC,UAAU;gBACpB,CAAC,CAAC,QAAQ,KAAK,CAAC,UAAU,EAAE;gBAC5B,CAAC,CAAC,0BAA0B;YAC7B,KAAK,EAAE,2BAA2B,cAAc,CAAC,KAAK,CAAC,EAAE;YACzD,IAAI,EAAE,wBAAwB;YAC9B,QAAQ,EAAE;gBACT,MAAM,EAAE,SAAS;gBACjB,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC;gBAC5B,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1D,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChE,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC7D;SACD;KACD,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAwB;IACrD,OAAO,IAAI;QACV,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;QAC/D,EAAE,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC;SAC/B,IAAI,EAAE,CAAC;AACV,CAAC;AAED,SAAS,0BAA0B,CAClC,IAAwB;IAExB,OAAO,IAAI;QACV,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC;QACtE,EAAE,KAAK,CAAC,uBAAuB,CAAC,MAAM,CAAC;SACtC,IAAI,EAAE,CAAC;AACV,CAAC;AAED,SAAS,sBAAsB,CAAC,MAAoB;IACnD,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAgC;IAC1D,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC;IACnB,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACvC,IAAI,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACrD,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC;QACnB,CAAC;QACD,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;SAAM,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC9C,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IACzB,CAAC;SAAM,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC9C,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC;IAC9D,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;AACpE,CAAC;AAED,SAAS,kBAAkB,CAC1B,MAAoB,EACpB,KAAwB;IAExB,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;SAC9B,GAAG,CAAC,YAAY,CAAC;SACjB,MAAM,CACN,CAAC,GAAG,EAAE,EAAE,CACP,GAAG,KAAK,UAAU;QAClB,GAAG,KAAK,kBAAkB;QAC1B,CAAC,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC;QACjC,CAAC,GAAG,CAAC,UAAU,CAAC,uBAAuB,CAAC,CACzC,CAAC;IAEH,OAAO;QACN,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,KAAK,EAAE,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,QAAQ;QACpD,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,IAAI,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;QACxC,SAAS,EAAE,mBAAmB,CAC7B,KAAK,CAAC,SAAS,EACf,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,UAAU,CACjB;QACD,WAAW,EAAE,mBAAmB,CAC/B,KAAK,CAAC,WAAW,EACjB,0BAA0B,CAAC,MAAM,CAAC,IAAI,CAAC,CACvC;QACD,SAAS,EAAE,iBAAiB,CAAC,MAAM,CAAC,SAAsC,CAAC;QAC3E,SAAS,EAAE,iBAAiB,CAAC,MAAM,CAAC,SAAsC,CAAC;KAC3E,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CACrB,KAA+B,EAC/B,SAAiB;IAEjB,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,GAAG,SAAS,6BAA6B,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,KAAK,UAAU,yBAAyB,CACvC,MAA0B,EAC1B,KAAwB;IAExB,MAAM,OAAO,GAAsB;QAClC,IAAI,EAAE,UAAU,CAAC,OAAO;QACxB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,KAAK,EAAE,aAAa;QACpB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,YAAY,EAAE,UAAU;KACxB,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnD,OAAO,CAAC,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,wBAAwB,CAChC,OAAuB,EACvB,KAAa,EACb,OAAe;IAEf,MAAM,eAAe,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IAClE,OAAO,OAAO,CAAC,IAAI,CAClB,CAAC,MAAM,EAAE,EAAE,CACV,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,eAAe;QACrD,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,KAAK,iBAAiB,CACrE,CAAC;AACH,CAAC;AAED,KAAK,UAAU,mCAAmC,CACjD,MAA0B,EAC1B,KAAwB,EACxB,KAAa,EACb,OAAe,EACf,OAGC;IAED,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,qBAAqB,CACrC,KAAK,EACL,OAAO,EAAE,IAAI,EACb,KAAK,CAAC,WAAW,CACjB,CAAC;IACF,MAAM,eAAe,GACpB,OAAO,EAAE,eAAe;QACxB,CAAC,MAAM,yBAAyB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,wBAAwB,CACxC,eAAe,EACf,KAAK,EACL,WAAW,CACX,CAAC;IAEF,IAAI,CAAC,QAAQ,EAAE,CAAC;QACf,MAAM,OAAO,GAAuB;YACnC,IAAI,EAAE,UAAU,CAAC,OAAO;YACxB,OAAO,EAAE,WAAW;YACpB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,KAAK,EAAE,aAAa;YACpB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,IAAI,EAAE,QAAQ;YACd,YAAY,EAAE,UAAU;YACxB,gBAAgB,EAAE,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC;SACrD,CAAC;QACF,MAAM,OAAO,GAAG,aAAa,CAC5B,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAC3C,cAAc,CACd,CAAC;QACF,OAAO;YACN,KAAK,EAAE,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC;YACzC,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,KAAK;SACd,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACtD,MAAM,cAAc,GAAG,UAAU,IAAI,EAAE,CAAC;IACxC,MAAM,iBAAiB,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACzD,MAAM,WAAW,GAChB,cAAc,CAAC,MAAM,KAAK,iBAAiB,CAAC,MAAM;QAClD,cAAc,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;IACvE,IAAI,CAAC,WAAW,IAAI,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,WAAW,EAAE,CAAC;QACxE,OAAO;YACN,KAAK,EAAE,kBAAkB,CAAC,QAAQ,EAAE,KAAK,CAAC;YAC1C,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,KAAK;SACd,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,aAAa,CAC5B,CACC,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;QAC1B,EAAE,EAAE,QAAQ,CAAC,EAAE;QACf,OAAO,EAAE,WAAW;QACpB,YAAY,EAAE,UAAU;QACxB,gBAAgB,EAAE,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC;QACrD,IAAI,EAAE,UAAU,IAAI,EAAE;KACtB,CAAC,CACF,CAAC,MAAM,EACR,eAAe,CACf,CAAC;IACF,OAAO;QACN,KAAK,EAAE,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC;QACzC,OAAO,EAAE,KAAK;QACd,OAAO,EAAE,IAAI;KACb,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC9C,KAAa,EACb,OAAe,EACf,OAKC;IAED,MAAM,MAAM,GAAG,MAAM,yBAAyB,EAAE,CAAC;IACjD,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACb,CAAC;IAED,OAAO,mCAAmC,CACzC,MAAM,EACN,kBAAkB,CAAC,OAAO,CAAC,EAC3B,KAAK,EACL,OAAO,EACP,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CACvB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAChD,KAAa,EACb,OAGC;IAED,MAAM,MAAM,GAAG,MAAM,yBAAyB,EAAE,CAAC;IACjD,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,KAAK,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,CAAC;QACJ,MAAM,OAAO,GAAwB;YACpC,KAAK;YACL,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE;YAC3B,IAAI,EAAE,UAAU,CAAC,OAAO;YACxB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,KAAK,EAAE,aAAa;YACpB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,YAAY,EAAE,UAAU;SACxB,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACrD,OAAO,CAAC,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC;aAC9B,MAAM,CAAC,sBAAsB,CAAC;aAC9B,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACjB,KAAK,EAAE,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC;YACxC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;YAChC,SAAS,EAAE,SAAkB;SAC7B,CAAC,CAAC,CAAC;IACN,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,mDAAmD,EAAE;YAChE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;YAC7D,SAAS,EAAE,KAAK,CAAC,SAAS;SAC1B,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kCAAkC,CAAC,MAYxD;IACA,MAAM,MAAM,GAAG,MAAM,yBAAyB,EAAE,CAAC;IACjD,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,eAAe,GAAG,MAAM,yBAAyB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAEvE,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,wBAAwB,CACxC,eAAe,EACf,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,OAAO,CACb,CAAC;QACF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACf,SAAS;QACV,CAAC;QACD,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,CAAC;IACd,CAAC;IAED,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,MAAM,mCAAmC,CACvD,MAAM,EACN,KAAK,EACL,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,OAAO,EACd;YACC,IAAI,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YACjE,eAAe;SACf,CACD,CAAC;QACF,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,KAAK,IAAI,CAAC,CAAC;QACZ,CAAC;aAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC,CAAC;QACd,CAAC;IACF,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AACpC,CAAC","sourcesContent":["import {\n\tgetEnvValue,\n\tresolveOrganizationId,\n\tresolvePlatformToken,\n\tresolveTeamId,\n} from \"../platform/client.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport { MemoryClient, MemoryType } from \"./platform-memory-client.js\";\nimport { getMemoryProjectScope } from \"./team-memory.js\";\nimport type { MemoryEntry, MemorySearchResult } from \"./types.js\";\n\nconst logger = createLogger(\"memory:service\");\n\nconst MAESTRO_AGENT = \"maestro\";\nconst DURABLE_MEMORY_TAG = \"maestro-kind:durable-memory\";\nconst SOURCE_TAG = \"source:maestro\";\nconst TOPIC_TAG_PREFIX = \"maestro-topic:\";\nconst PROJECT_NAME_TAG_PREFIX = \"maestro-project-name:\";\n\ntype RemoteMemoryConfig = {\n\tagentId: string;\n\tclient: MemoryClient;\n\tteamId?: string;\n};\n\ntype RemoteMemoryScope = {\n\tprojectId?: string;\n\tprojectName?: string;\n\trepository?: string;\n};\n\ntype ClientMemory = Awaited<\n\tReturnType<MemoryClient[\"list\"]>\n>[\"memories\"][number];\n\ntype TimestampLike = {\n\tnanos?: number;\n\tseconds?: bigint | number | string;\n};\n\ntype MemorySourceReference = {\n\turi: string;\n\ttitle: string;\n\ttype: string;\n\tmetadata?: Record<string, string>;\n};\n\ntype RemoteStoreRequest = Parameters<MemoryClient[\"store\"]>[0] & {\n\tagentId?: string;\n\treviewStatus?: string;\n\tsourceReferences?: MemorySourceReference[];\n};\n\ntype RemoteListRequest = Parameters<MemoryClient[\"list\"]>[0] & {\n\tagentId?: string;\n\treviewStatus?: string;\n};\n\ntype RemoteRecallRequest = Parameters<MemoryClient[\"recall\"]>[0] & {\n\tagentId?: string;\n\treviewStatus?: string;\n};\n\nfunction normalizeTopic(topic: string): string {\n\treturn topic.toLowerCase().trim();\n}\n\nfunction normalizeContent(content: string): string {\n\treturn content.replace(/\\s+/g, \" \").trim();\n}\n\nfunction normalizeTag(tag: string): string {\n\treturn tag.trim().toLowerCase();\n}\n\nfunction mergeTags(\n\tcurrent?: readonly string[],\n\tnext?: readonly string[],\n): string[] | undefined {\n\tconst values = [...(current ?? []), ...(next ?? [])]\n\t\t.map(normalizeTag)\n\t\t.filter(Boolean);\n\tif (values.length === 0) {\n\t\treturn undefined;\n\t}\n\treturn Array.from(new Set(values)).sort();\n}\n\nfunction firstNonEmptyString(\n\t...values: Array<string | undefined>\n): string | undefined {\n\tfor (const value of values) {\n\t\tif (typeof value === \"string\" && value.trim().length > 0) {\n\t\t\treturn value.trim();\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction resolveMemoryAgentId(): string {\n\treturn (\n\t\tgetEnvValue([\"MAESTRO_MEMORY_AGENT_ID\", \"MAESTRO_AGENT_ID\"]) ??\n\t\tMAESTRO_AGENT\n\t);\n}\n\nasync function resolveRemoteMemoryConfig(): Promise<RemoteMemoryConfig | null> {\n\tconst baseUrl = getEnvValue([\n\t\t\"MAESTRO_MEMORY_BASE\",\n\t\t\"MAESTRO_MEMORY_SERVICE_URL\",\n\t\t\"MAESTRO_PLATFORM_BASE_URL\",\n\t\t\"MAESTRO_EVALOPS_BASE_URL\",\n\t\t\"EVALOPS_BASE_URL\",\n\t]);\n\tif (!baseUrl) {\n\t\treturn null;\n\t}\n\n\tconst organizationId = resolveOrganizationId([\n\t\t\"MAESTRO_MEMORY_ORGANIZATION_ID\",\n\t\t\"MAESTRO_EVALOPS_ORG_ID\",\n\t\t\"EVALOPS_ORGANIZATION_ID\",\n\t\t\"MAESTRO_ENTERPRISE_ORG_ID\",\n\t]);\n\tif (!organizationId) {\n\t\tlogger.warn(\n\t\t\t\"Remote memory configured without organization id; falling back to local memory store\",\n\t\t);\n\t\treturn null;\n\t}\n\n\tconst token = await resolvePlatformToken([\n\t\t\"MAESTRO_MEMORY_ACCESS_TOKEN\",\n\t\t\"MAESTRO_EVALOPS_ACCESS_TOKEN\",\n\t\t\"EVALOPS_TOKEN\",\n\t]);\n\tif (!token) {\n\t\tlogger.warn(\n\t\t\t\"Remote memory configured without access token; falling back to local memory store\",\n\t\t);\n\t\treturn null;\n\t}\n\n\treturn {\n\t\tagentId: resolveMemoryAgentId(),\n\t\tclient: new MemoryClient({\n\t\t\tbaseUrl,\n\t\t\taccessToken: token,\n\t\t\torganizationId,\n\t\t}),\n\t\tteamId: resolveTeamId([\n\t\t\t\"MAESTRO_MEMORY_TEAM_ID\",\n\t\t\t\"MAESTRO_EVALOPS_TEAM_ID\",\n\t\t\t\"MAESTRO_LLM_GATEWAY_TEAM_ID\",\n\t\t]),\n\t};\n}\n\nfunction resolveRemoteScope(options?: {\n\tcwd?: string;\n\tprojectId?: string;\n\tprojectName?: string;\n}): RemoteMemoryScope {\n\tif (options?.projectId !== undefined) {\n\t\treturn {\n\t\t\tprojectId: options.projectId,\n\t\t\tprojectName: options.projectName,\n\t\t\trepository: options.projectId,\n\t\t};\n\t}\n\n\tif (!options?.cwd) {\n\t\treturn {};\n\t}\n\n\tconst scope = getMemoryProjectScope(options.cwd);\n\tif (!scope) {\n\t\treturn {};\n\t}\n\n\treturn {\n\t\tprojectId: scope.projectId,\n\t\tprojectName: scope.projectName,\n\t\trepository: scope.projectId,\n\t};\n}\n\nfunction buildRemoteMemoryTags(\n\ttopic: string,\n\ttags?: readonly string[],\n\tprojectName?: string,\n): string[] {\n\treturn (\n\t\tmergeTags(\n\t\t\t[\n\t\t\t\tSOURCE_TAG,\n\t\t\t\tDURABLE_MEMORY_TAG,\n\t\t\t\t`${TOPIC_TAG_PREFIX}${normalizeTopic(topic)}`,\n\t\t\t\t...(projectName\n\t\t\t\t\t? [`${PROJECT_NAME_TAG_PREFIX}${projectName.trim().toLowerCase()}`]\n\t\t\t\t\t: []),\n\t\t\t],\n\t\t\ttags,\n\t\t) ?? []\n\t);\n}\n\nfunction buildSourceReferences(\n\ttopic: string,\n\tscope: RemoteMemoryScope,\n): MemorySourceReference[] {\n\treturn [\n\t\t{\n\t\t\turi: scope.repository\n\t\t\t\t? `repo:${scope.repository}`\n\t\t\t\t: \"maestro://durable-memory\",\n\t\t\ttitle: `Maestro durable memory: ${normalizeTopic(topic)}`,\n\t\t\ttype: \"maestro-durable-memory\",\n\t\t\tmetadata: {\n\t\t\t\tsource: \"maestro\",\n\t\t\t\ttopic: normalizeTopic(topic),\n\t\t\t\t...(scope.projectId ? { projectId: scope.projectId } : {}),\n\t\t\t\t...(scope.projectName ? { projectName: scope.projectName } : {}),\n\t\t\t\t...(scope.repository ? { repository: scope.repository } : {}),\n\t\t\t},\n\t\t},\n\t];\n}\n\nfunction extractTopicFromTags(tags?: readonly string[]): string | undefined {\n\treturn tags\n\t\t?.find((tag) => normalizeTag(tag).startsWith(TOPIC_TAG_PREFIX))\n\t\t?.slice(TOPIC_TAG_PREFIX.length)\n\t\t.trim();\n}\n\nfunction extractProjectNameFromTags(\n\ttags?: readonly string[],\n): string | undefined {\n\treturn tags\n\t\t?.find((tag) => normalizeTag(tag).startsWith(PROJECT_NAME_TAG_PREFIX))\n\t\t?.slice(PROJECT_NAME_TAG_PREFIX.length)\n\t\t.trim();\n}\n\nfunction isManagedDurableMemory(record: ClientMemory): boolean {\n\treturn (record.tags ?? []).map(normalizeTag).includes(DURABLE_MEMORY_TAG);\n}\n\nfunction timestampToMillis(value: TimestampLike | undefined): number {\n\tif (!value) {\n\t\treturn Date.now();\n\t}\n\n\tlet seconds = 0;\n\tif (typeof value.seconds === \"bigint\") {\n\t\tif (value.seconds > BigInt(Number.MAX_SAFE_INTEGER)) {\n\t\t\treturn Date.now();\n\t\t}\n\t\tseconds = Number(value.seconds);\n\t} else if (typeof value.seconds === \"number\") {\n\t\tseconds = value.seconds;\n\t} else if (typeof value.seconds === \"string\") {\n\t\tseconds = Number.parseInt(value.seconds, 10);\n\t}\n\n\tconst nanos = typeof value.nanos === \"number\" ? value.nanos : 0;\n\tconst millis = seconds * 1000 + Math.floor(nanos / 1_000_000);\n\treturn Number.isFinite(millis) && millis > 0 ? millis : Date.now();\n}\n\nfunction toLocalMemoryEntry(\n\trecord: ClientMemory,\n\tscope: RemoteMemoryScope,\n): MemoryEntry {\n\tconst tags = (record.tags ?? [])\n\t\t.map(normalizeTag)\n\t\t.filter(\n\t\t\t(tag) =>\n\t\t\t\ttag !== SOURCE_TAG &&\n\t\t\t\ttag !== DURABLE_MEMORY_TAG &&\n\t\t\t\t!tag.startsWith(TOPIC_TAG_PREFIX) &&\n\t\t\t\t!tag.startsWith(PROJECT_NAME_TAG_PREFIX),\n\t\t);\n\n\treturn {\n\t\tid: record.id,\n\t\ttopic: extractTopicFromTags(record.tags) ?? \"memory\",\n\t\tcontent: record.content,\n\t\ttags: tags.length > 0 ? tags : undefined,\n\t\tprojectId: firstNonEmptyString(\n\t\t\tscope.projectId,\n\t\t\trecord.projectId,\n\t\t\trecord.repository,\n\t\t),\n\t\tprojectName: firstNonEmptyString(\n\t\t\tscope.projectName,\n\t\t\textractProjectNameFromTags(record.tags),\n\t\t),\n\t\tcreatedAt: timestampToMillis(record.createdAt as TimestampLike | undefined),\n\t\tupdatedAt: timestampToMillis(record.updatedAt as TimestampLike | undefined),\n\t};\n}\n\nfunction requireMemory(\n\tvalue: ClientMemory | undefined,\n\toperation: string,\n): ClientMemory {\n\tif (!value) {\n\t\tthrow new Error(`${operation} returned no memory payload`);\n\t}\n\treturn value;\n}\n\nasync function listRemoteRecordsForScope(\n\tconfig: RemoteMemoryConfig,\n\tscope: RemoteMemoryScope,\n): Promise<ClientMemory[]> {\n\tconst request: RemoteListRequest = {\n\t\ttype: MemoryType.PROJECT,\n\t\tteamId: config.teamId,\n\t\trepository: scope.repository,\n\t\tagent: MAESTRO_AGENT,\n\t\tagentId: config.agentId,\n\t\treviewStatus: \"approved\",\n\t};\n\tconst response = await config.client.list(request);\n\treturn (response.memories ?? []).filter(isManagedDurableMemory);\n}\n\nfunction findMatchingRemoteRecord(\n\trecords: ClientMemory[],\n\ttopic: string,\n\tcontent: string,\n): ClientMemory | undefined {\n\tconst normalizedTopic = normalizeTopic(topic);\n\tconst normalizedContent = normalizeContent(content).toLowerCase();\n\treturn records.find(\n\t\t(record) =>\n\t\t\textractTopicFromTags(record.tags) === normalizedTopic &&\n\t\t\tnormalizeContent(record.content).toLowerCase() === normalizedContent,\n\t);\n}\n\nasync function upsertRemoteDurableMemoryWithConfig(\n\tconfig: RemoteMemoryConfig,\n\tscope: RemoteMemoryScope,\n\ttopic: string,\n\tcontent: string,\n\toptions?: {\n\t\texistingRecords?: ClientMemory[];\n\t\ttags?: string[];\n\t},\n): Promise<{ entry: MemoryEntry; created: boolean; updated: boolean }> {\n\tconst nextContent = normalizeContent(content);\n\tconst nextTags = buildRemoteMemoryTags(\n\t\ttopic,\n\t\toptions?.tags,\n\t\tscope.projectName,\n\t);\n\tconst existingRecords =\n\t\toptions?.existingRecords ??\n\t\t(await listRemoteRecordsForScope(config, scope));\n\tconst existing = findMatchingRemoteRecord(\n\t\texistingRecords,\n\t\ttopic,\n\t\tnextContent,\n\t);\n\n\tif (!existing) {\n\t\tconst request: RemoteStoreRequest = {\n\t\t\ttype: MemoryType.PROJECT,\n\t\t\tcontent: nextContent,\n\t\t\tteamId: config.teamId,\n\t\t\trepository: scope.repository,\n\t\t\tagent: MAESTRO_AGENT,\n\t\t\tagentId: config.agentId,\n\t\t\ttags: nextTags,\n\t\t\treviewStatus: \"approved\",\n\t\t\tsourceReferences: buildSourceReferences(topic, scope),\n\t\t};\n\t\tconst created = requireMemory(\n\t\t\t(await config.client.store(request)).memory,\n\t\t\t\"store memory\",\n\t\t);\n\t\treturn {\n\t\t\tentry: toLocalMemoryEntry(created, scope),\n\t\t\tcreated: true,\n\t\t\tupdated: false,\n\t\t};\n\t}\n\n\tconst mergedTags = mergeTags(existing.tags, nextTags);\n\tconst nextTagsStable = mergedTags ?? [];\n\tconst currentTagsStable = mergeTags(existing.tags) ?? [];\n\tconst tagsChanged =\n\t\tnextTagsStable.length !== currentTagsStable.length ||\n\t\tnextTagsStable.some((tag, index) => currentTagsStable[index] !== tag);\n\tif (!tagsChanged && normalizeContent(existing.content) === nextContent) {\n\t\treturn {\n\t\t\tentry: toLocalMemoryEntry(existing, scope),\n\t\t\tcreated: false,\n\t\t\tupdated: false,\n\t\t};\n\t}\n\n\tconst updated = requireMemory(\n\t\t(\n\t\t\tawait config.client.update({\n\t\t\t\tid: existing.id,\n\t\t\t\tcontent: nextContent,\n\t\t\t\treviewStatus: \"approved\",\n\t\t\t\tsourceReferences: buildSourceReferences(topic, scope),\n\t\t\t\ttags: mergedTags ?? [],\n\t\t\t})\n\t\t).memory,\n\t\t\"update memory\",\n\t);\n\treturn {\n\t\tentry: toLocalMemoryEntry(updated, scope),\n\t\tcreated: false,\n\t\tupdated: true,\n\t};\n}\n\nexport async function upsertRemoteDurableMemory(\n\ttopic: string,\n\tcontent: string,\n\toptions?: {\n\t\tcwd?: string;\n\t\tprojectId?: string;\n\t\tprojectName?: string;\n\t\ttags?: string[];\n\t},\n): Promise<{ entry: MemoryEntry; created: boolean; updated: boolean } | null> {\n\tconst config = await resolveRemoteMemoryConfig();\n\tif (!config) {\n\t\treturn null;\n\t}\n\n\treturn upsertRemoteDurableMemoryWithConfig(\n\t\tconfig,\n\t\tresolveRemoteScope(options),\n\t\ttopic,\n\t\tcontent,\n\t\t{ tags: options?.tags },\n\t);\n}\n\nexport async function recallRemoteDurableMemories(\n\tquery: string,\n\toptions?: {\n\t\tcwd?: string;\n\t\tlimit?: number;\n\t},\n): Promise<MemorySearchResult[] | null> {\n\tconst config = await resolveRemoteMemoryConfig();\n\tif (!config) {\n\t\treturn null;\n\t}\n\n\tconst scope = resolveRemoteScope(options);\n\ttry {\n\t\tconst request: RemoteRecallRequest = {\n\t\t\tquery,\n\t\t\tlimit: options?.limit ?? 10,\n\t\t\ttype: MemoryType.PROJECT,\n\t\t\tteamId: config.teamId,\n\t\t\trepository: scope.repository,\n\t\t\tagent: MAESTRO_AGENT,\n\t\t\tagentId: config.agentId,\n\t\t\treviewStatus: \"approved\",\n\t\t};\n\t\tconst response = await config.client.recall(request);\n\t\treturn (response.memories ?? [])\n\t\t\t.filter(isManagedDurableMemory)\n\t\t\t.map((memory) => ({\n\t\t\t\tentry: toLocalMemoryEntry(memory, scope),\n\t\t\t\tscore: Number(memory.score ?? 0),\n\t\t\t\tmatchedOn: \"content\" as const,\n\t\t\t}));\n\t} catch (error) {\n\t\tlogger.warn(\"Remote memory recall failed; using local fallback\", {\n\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\tprojectId: scope.projectId,\n\t\t});\n\t\treturn null;\n\t}\n}\n\nexport async function applyRemoteAutoMemoryConsolidation(params: {\n\toptions?: {\n\t\tcwd?: string;\n\t\tprojectId?: string;\n\t\tprojectName?: string;\n\t};\n\tremoveEntries: MemoryEntry[];\n\tupserts: Array<{\n\t\tcontent: string;\n\t\ttags?: string[];\n\t\ttopic: string;\n\t}>;\n}): Promise<{ removed: number; added: number; updated: number } | null> {\n\tconst config = await resolveRemoteMemoryConfig();\n\tif (!config) {\n\t\treturn null;\n\t}\n\n\tconst scope = resolveRemoteScope(params.options);\n\tconst existingRecords = await listRemoteRecordsForScope(config, scope);\n\n\tlet removed = 0;\n\tfor (const entry of params.removeEntries) {\n\t\tconst existing = findMatchingRemoteRecord(\n\t\t\texistingRecords,\n\t\t\tentry.topic,\n\t\t\tentry.content,\n\t\t);\n\t\tif (!existing) {\n\t\t\tcontinue;\n\t\t}\n\t\tawait config.client.delete({ id: existing.id });\n\t\tremoved += 1;\n\t}\n\n\tlet added = 0;\n\tlet updated = 0;\n\tfor (const upsert of params.upserts) {\n\t\tconst result = await upsertRemoteDurableMemoryWithConfig(\n\t\t\tconfig,\n\t\t\tscope,\n\t\t\tupsert.topic,\n\t\t\tupsert.content,\n\t\t\t{\n\t\t\t\ttags: [\"auto\", \"durable\", \"consolidated\", ...(upsert.tags ?? [])],\n\t\t\t\texistingRecords,\n\t\t\t},\n\t\t);\n\t\tif (result.created) {\n\t\t\tadded += 1;\n\t\t} else if (result.updated) {\n\t\t\tupdated += 1;\n\t\t}\n\t}\n\n\treturn { removed, added, updated };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"service-client.js","sourceRoot":"","sources":["../../src/memory/service-client.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tgetEnvValue,\n\tresolveOrganizationId,\n\tresolvePlatformToken,\n\tresolveTeamId,\n} from \"../platform/client.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport { MemoryClient, MemoryType } from \"./platform-memory-client.js\";\nimport { getMemoryProjectScope } from \"./team-memory.js\";\nimport type { MemoryEntry, MemorySearchResult } from \"./types.js\";\n\nconst logger = createLogger(\"memory:service\");\n\nconst MAESTRO_AGENT = \"maestro\";\nconst DURABLE_MEMORY_TAG = \"maestro-kind:durable-memory\";\nconst SOURCE_TAG = \"source:maestro\";\nconst TOPIC_TAG_PREFIX = \"maestro-topic:\";\nconst PROJECT_NAME_TAG_PREFIX = \"maestro-project-name:\";\nconst SESSION_TAG_PREFIX = \"maestro-session:\";\n\ntype RemoteMemoryConfig = {\n\tagentId: string;\n\tclient: MemoryClient;\n\tteamId?: string;\n};\n\ntype RemoteMemoryScope = {\n\tprojectId?: string;\n\tprojectName?: string;\n\trepository?: string;\n};\n\ntype ClientMemory = Awaited<\n\tReturnType<MemoryClient[\"list\"]>\n>[\"memories\"][number];\n\ntype TimestampLike = {\n\tnanos?: number;\n\tseconds?: bigint | number | string;\n};\n\ntype MemorySourceReference = {\n\turi: string;\n\ttitle: string;\n\ttype: string;\n\tmetadata?: Record<string, string>;\n};\n\ntype RemoteStoreRequest = Parameters<MemoryClient[\"store\"]>[0] & {\n\tagentId?: string;\n\treviewStatus?: string;\n\tsourceReferences?: MemorySourceReference[];\n};\n\ntype RemoteListRequest = Parameters<MemoryClient[\"list\"]>[0] & {\n\tagentId?: string;\n\treviewStatus?: string;\n};\n\ntype RemoteRecallRequest = Parameters<MemoryClient[\"recall\"]>[0] & {\n\tagentId?: string;\n\treviewStatus?: string;\n};\n\nfunction normalizeTopic(topic: string): string {\n\treturn topic.toLowerCase().trim();\n}\n\nfunction normalizeContent(content: string): string {\n\treturn content.replace(/\\s+/g, \" \").trim();\n}\n\nfunction normalizeTag(tag: string): string {\n\treturn tag.trim().toLowerCase();\n}\n\nfunction mergeTags(\n\tcurrent?: readonly string[],\n\tnext?: readonly string[],\n): string[] | undefined {\n\tconst values = [...(current ?? []), ...(next ?? [])]\n\t\t.map(normalizeTag)\n\t\t.filter(Boolean);\n\tif (values.length === 0) {\n\t\treturn undefined;\n\t}\n\treturn Array.from(new Set(values)).sort();\n}\n\nfunction firstNonEmptyString(\n\t...values: Array<string | undefined>\n): string | undefined {\n\tfor (const value of values) {\n\t\tif (typeof value === \"string\" && value.trim().length > 0) {\n\t\t\treturn value.trim();\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction resolveMemoryAgentId(): string {\n\treturn (\n\t\tgetEnvValue([\"MAESTRO_MEMORY_AGENT_ID\", \"MAESTRO_AGENT_ID\"]) ??\n\t\tMAESTRO_AGENT\n\t);\n}\n\nasync function resolveRemoteMemoryConfig(): Promise<RemoteMemoryConfig | null> {\n\tconst baseUrl = getEnvValue([\n\t\t\"MAESTRO_MEMORY_BASE\",\n\t\t\"MAESTRO_MEMORY_SERVICE_URL\",\n\t\t\"MAESTRO_PLATFORM_BASE_URL\",\n\t\t\"MAESTRO_EVALOPS_BASE_URL\",\n\t\t\"EVALOPS_BASE_URL\",\n\t]);\n\tif (!baseUrl) {\n\t\treturn null;\n\t}\n\n\tconst organizationId = resolveOrganizationId([\n\t\t\"MAESTRO_MEMORY_ORGANIZATION_ID\",\n\t\t\"MAESTRO_EVALOPS_ORG_ID\",\n\t\t\"EVALOPS_ORGANIZATION_ID\",\n\t\t\"MAESTRO_ENTERPRISE_ORG_ID\",\n\t]);\n\tif (!organizationId) {\n\t\tlogger.warn(\n\t\t\t\"Remote memory configured without organization id; falling back to local memory store\",\n\t\t);\n\t\treturn null;\n\t}\n\n\tconst token = await resolvePlatformToken([\n\t\t\"MAESTRO_MEMORY_ACCESS_TOKEN\",\n\t\t\"MAESTRO_EVALOPS_ACCESS_TOKEN\",\n\t\t\"EVALOPS_TOKEN\",\n\t]);\n\tif (!token) {\n\t\tlogger.warn(\n\t\t\t\"Remote memory configured without access token; falling back to local memory store\",\n\t\t);\n\t\treturn null;\n\t}\n\n\treturn {\n\t\tagentId: resolveMemoryAgentId(),\n\t\tclient: new MemoryClient({\n\t\t\tbaseUrl,\n\t\t\taccessToken: token,\n\t\t\torganizationId,\n\t\t}),\n\t\tteamId: resolveTeamId([\n\t\t\t\"MAESTRO_MEMORY_TEAM_ID\",\n\t\t\t\"MAESTRO_EVALOPS_TEAM_ID\",\n\t\t\t\"MAESTRO_LLM_GATEWAY_TEAM_ID\",\n\t\t]),\n\t};\n}\n\nfunction resolveRemoteScope(options?: {\n\tcwd?: string;\n\tprojectId?: string;\n\tprojectName?: string;\n}): RemoteMemoryScope {\n\tif (options?.projectId !== undefined) {\n\t\treturn {\n\t\t\tprojectId: options.projectId,\n\t\t\tprojectName: options.projectName,\n\t\t\trepository: options.projectId,\n\t\t};\n\t}\n\n\tif (!options?.cwd) {\n\t\treturn {};\n\t}\n\n\tconst scope = getMemoryProjectScope(options.cwd);\n\tif (!scope) {\n\t\treturn {};\n\t}\n\n\treturn {\n\t\tprojectId: scope.projectId,\n\t\tprojectName: scope.projectName,\n\t\trepository: scope.projectId,\n\t};\n}\n\nfunction buildRemoteMemoryTags(\n\ttopic: string,\n\ttags?: readonly string[],\n\tprojectName?: string,\n\tsessionId?: string,\n): string[] {\n\treturn (\n\t\tmergeTags(\n\t\t\t[\n\t\t\t\tSOURCE_TAG,\n\t\t\t\tDURABLE_MEMORY_TAG,\n\t\t\t\t`${TOPIC_TAG_PREFIX}${normalizeTopic(topic)}`,\n\t\t\t\t...(projectName\n\t\t\t\t\t? [`${PROJECT_NAME_TAG_PREFIX}${projectName.trim().toLowerCase()}`]\n\t\t\t\t\t: []),\n\t\t\t\t...(sessionId ? [`${SESSION_TAG_PREFIX}${sessionId.trim()}`] : []),\n\t\t\t],\n\t\t\ttags,\n\t\t) ?? []\n\t);\n}\n\nfunction buildSourceReferences(\n\ttopic: string,\n\tscope: RemoteMemoryScope,\n\toptions?: {\n\t\tsessionId?: string;\n\t},\n): MemorySourceReference[] {\n\tconst references: MemorySourceReference[] = [\n\t\t{\n\t\t\turi: scope.repository\n\t\t\t\t? `repo:${scope.repository}`\n\t\t\t\t: \"maestro://durable-memory\",\n\t\t\ttitle: `Maestro durable memory: ${normalizeTopic(topic)}`,\n\t\t\ttype: \"maestro-durable-memory\",\n\t\t\tmetadata: {\n\t\t\t\tsource: \"maestro\",\n\t\t\t\ttopic: normalizeTopic(topic),\n\t\t\t\t...(scope.projectId ? { projectId: scope.projectId } : {}),\n\t\t\t\t...(scope.projectName ? { projectName: scope.projectName } : {}),\n\t\t\t\t...(scope.repository ? { repository: scope.repository } : {}),\n\t\t\t},\n\t\t},\n\t];\n\tconst sessionId = options?.sessionId?.trim();\n\tif (sessionId) {\n\t\treferences.push({\n\t\t\turi: `maestro://sessions/${sessionId}`,\n\t\t\ttitle: `Maestro session ${sessionId}`,\n\t\t\ttype: \"maestro-session\",\n\t\t\tmetadata: {\n\t\t\t\tsource: \"maestro\",\n\t\t\t\tsessionId,\n\t\t\t\ttopic: normalizeTopic(topic),\n\t\t\t\t...(scope.projectId ? { projectId: scope.projectId } : {}),\n\t\t\t\t...(scope.projectName ? { projectName: scope.projectName } : {}),\n\t\t\t\t...(scope.repository ? { repository: scope.repository } : {}),\n\t\t\t},\n\t\t});\n\t}\n\treturn references;\n}\n\nfunction extractTopicFromTags(tags?: readonly string[]): string | undefined {\n\treturn tags\n\t\t?.find((tag) => normalizeTag(tag).startsWith(TOPIC_TAG_PREFIX))\n\t\t?.slice(TOPIC_TAG_PREFIX.length)\n\t\t.trim();\n}\n\nfunction extractProjectNameFromTags(\n\ttags?: readonly string[],\n): string | undefined {\n\treturn tags\n\t\t?.find((tag) => normalizeTag(tag).startsWith(PROJECT_NAME_TAG_PREFIX))\n\t\t?.slice(PROJECT_NAME_TAG_PREFIX.length)\n\t\t.trim();\n}\n\nfunction isManagedDurableMemory(record: ClientMemory): boolean {\n\treturn (record.tags ?? []).map(normalizeTag).includes(DURABLE_MEMORY_TAG);\n}\n\nfunction timestampToMillis(value: TimestampLike | undefined): number {\n\tif (!value) {\n\t\treturn Date.now();\n\t}\n\n\tlet seconds = 0;\n\tif (typeof value.seconds === \"bigint\") {\n\t\tif (value.seconds > BigInt(Number.MAX_SAFE_INTEGER)) {\n\t\t\treturn Date.now();\n\t\t}\n\t\tseconds = Number(value.seconds);\n\t} else if (typeof value.seconds === \"number\") {\n\t\tseconds = value.seconds;\n\t} else if (typeof value.seconds === \"string\") {\n\t\tseconds = Number.parseInt(value.seconds, 10);\n\t}\n\n\tconst nanos = typeof value.nanos === \"number\" ? value.nanos : 0;\n\tconst millis = seconds * 1000 + Math.floor(nanos / 1_000_000);\n\treturn Number.isFinite(millis) && millis > 0 ? millis : Date.now();\n}\n\nfunction toLocalMemoryEntry(\n\trecord: ClientMemory,\n\tscope: RemoteMemoryScope,\n): MemoryEntry {\n\tconst tags = (record.tags ?? [])\n\t\t.map(normalizeTag)\n\t\t.filter(\n\t\t\t(tag) =>\n\t\t\t\ttag !== SOURCE_TAG &&\n\t\t\t\ttag !== DURABLE_MEMORY_TAG &&\n\t\t\t\t!tag.startsWith(TOPIC_TAG_PREFIX) &&\n\t\t\t\t!tag.startsWith(PROJECT_NAME_TAG_PREFIX) &&\n\t\t\t\t!tag.startsWith(SESSION_TAG_PREFIX),\n\t\t);\n\n\treturn {\n\t\tid: record.id,\n\t\ttopic: extractTopicFromTags(record.tags) ?? \"memory\",\n\t\tcontent: record.content,\n\t\ttags: tags.length > 0 ? tags : undefined,\n\t\tprojectId: firstNonEmptyString(\n\t\t\tscope.projectId,\n\t\t\trecord.projectId,\n\t\t\trecord.repository,\n\t\t),\n\t\tprojectName: firstNonEmptyString(\n\t\t\tscope.projectName,\n\t\t\textractProjectNameFromTags(record.tags),\n\t\t),\n\t\tcreatedAt: timestampToMillis(record.createdAt as TimestampLike | undefined),\n\t\tupdatedAt: timestampToMillis(record.updatedAt as TimestampLike | undefined),\n\t};\n}\n\nfunction requireMemory(\n\tvalue: ClientMemory | undefined,\n\toperation: string,\n): ClientMemory {\n\tif (!value) {\n\t\tthrow new Error(`${operation} returned no memory payload`);\n\t}\n\treturn value;\n}\n\nasync function listRemoteRecordsForScope(\n\tconfig: RemoteMemoryConfig,\n\tscope: RemoteMemoryScope,\n): Promise<ClientMemory[]> {\n\tconst request: RemoteListRequest = {\n\t\ttype: MemoryType.PROJECT,\n\t\tteamId: config.teamId,\n\t\trepository: scope.repository,\n\t\tagent: MAESTRO_AGENT,\n\t\tagentId: config.agentId,\n\t\treviewStatus: \"approved\",\n\t};\n\tconst response = await config.client.list(request);\n\treturn (response.memories ?? []).filter(isManagedDurableMemory);\n}\n\nfunction findMatchingRemoteRecord(\n\trecords: ClientMemory[],\n\ttopic: string,\n\tcontent: string,\n): ClientMemory | undefined {\n\tconst normalizedTopic = normalizeTopic(topic);\n\tconst normalizedContent = normalizeContent(content).toLowerCase();\n\treturn records.find(\n\t\t(record) =>\n\t\t\textractTopicFromTags(record.tags) === normalizedTopic &&\n\t\t\tnormalizeContent(record.content).toLowerCase() === normalizedContent,\n\t);\n}\n\nasync function upsertRemoteDurableMemoryWithConfig(\n\tconfig: RemoteMemoryConfig,\n\tscope: RemoteMemoryScope,\n\ttopic: string,\n\tcontent: string,\n\toptions?: {\n\t\texistingRecords?: ClientMemory[];\n\t\tsessionId?: string;\n\t\ttags?: string[];\n\t},\n): Promise<{ entry: MemoryEntry; created: boolean; updated: boolean }> {\n\tconst nextContent = normalizeContent(content);\n\tconst nextTags = buildRemoteMemoryTags(\n\t\ttopic,\n\t\toptions?.tags,\n\t\tscope.projectName,\n\t\toptions?.sessionId,\n\t);\n\tconst existingRecords =\n\t\toptions?.existingRecords ??\n\t\t(await listRemoteRecordsForScope(config, scope));\n\tconst existing = findMatchingRemoteRecord(\n\t\texistingRecords,\n\t\ttopic,\n\t\tnextContent,\n\t);\n\n\tif (!existing) {\n\t\tconst request: RemoteStoreRequest = {\n\t\t\ttype: MemoryType.PROJECT,\n\t\t\tcontent: nextContent,\n\t\t\tteamId: config.teamId,\n\t\t\trepository: scope.repository,\n\t\t\tagent: MAESTRO_AGENT,\n\t\t\tagentId: config.agentId,\n\t\t\ttags: nextTags,\n\t\t\treviewStatus: \"approved\",\n\t\t\tsourceReferences: buildSourceReferences(topic, scope, {\n\t\t\t\tsessionId: options?.sessionId,\n\t\t\t}),\n\t\t};\n\t\tconst created = requireMemory(\n\t\t\t(await config.client.store(request)).memory,\n\t\t\t\"store memory\",\n\t\t);\n\t\treturn {\n\t\t\tentry: toLocalMemoryEntry(created, scope),\n\t\t\tcreated: true,\n\t\t\tupdated: false,\n\t\t};\n\t}\n\n\tconst mergedTags = mergeTags(existing.tags, nextTags);\n\tconst nextTagsStable = mergedTags ?? [];\n\tconst currentTagsStable = mergeTags(existing.tags) ?? [];\n\tconst tagsChanged =\n\t\tnextTagsStable.length !== currentTagsStable.length ||\n\t\tnextTagsStable.some((tag, index) => currentTagsStable[index] !== tag);\n\tif (!tagsChanged && normalizeContent(existing.content) === nextContent) {\n\t\treturn {\n\t\t\tentry: toLocalMemoryEntry(existing, scope),\n\t\t\tcreated: false,\n\t\t\tupdated: false,\n\t\t};\n\t}\n\n\tconst updated = requireMemory(\n\t\t(\n\t\t\tawait config.client.update({\n\t\t\t\tid: existing.id,\n\t\t\t\tcontent: nextContent,\n\t\t\t\treviewStatus: \"approved\",\n\t\t\t\tsourceReferences: buildSourceReferences(topic, scope, {\n\t\t\t\t\tsessionId: options?.sessionId,\n\t\t\t\t}),\n\t\t\t\ttags: mergedTags ?? [],\n\t\t\t})\n\t\t).memory,\n\t\t\"update memory\",\n\t);\n\treturn {\n\t\tentry: toLocalMemoryEntry(updated, scope),\n\t\tcreated: false,\n\t\tupdated: true,\n\t};\n}\n\nexport async function upsertRemoteDurableMemory(\n\ttopic: string,\n\tcontent: string,\n\toptions?: {\n\t\tcwd?: string;\n\t\tprojectId?: string;\n\t\tprojectName?: string;\n\t\tsessionId?: string;\n\t\ttags?: string[];\n\t},\n): Promise<{ entry: MemoryEntry; created: boolean; updated: boolean } | null> {\n\tconst config = await resolveRemoteMemoryConfig();\n\tif (!config) {\n\t\treturn null;\n\t}\n\n\treturn upsertRemoteDurableMemoryWithConfig(\n\t\tconfig,\n\t\tresolveRemoteScope(options),\n\t\ttopic,\n\t\tcontent,\n\t\t{ sessionId: options?.sessionId, tags: options?.tags },\n\t);\n}\n\nexport async function recallRemoteDurableMemories(\n\tquery: string,\n\toptions?: {\n\t\tcwd?: string;\n\t\tlimit?: number;\n\t},\n): Promise<MemorySearchResult[] | null> {\n\tconst config = await resolveRemoteMemoryConfig();\n\tif (!config) {\n\t\treturn null;\n\t}\n\n\tconst scope = resolveRemoteScope(options);\n\ttry {\n\t\tconst request: RemoteRecallRequest = {\n\t\t\tquery,\n\t\t\tlimit: options?.limit ?? 10,\n\t\t\ttype: MemoryType.PROJECT,\n\t\t\tteamId: config.teamId,\n\t\t\trepository: scope.repository,\n\t\t\tagent: MAESTRO_AGENT,\n\t\t\tagentId: config.agentId,\n\t\t\treviewStatus: \"approved\",\n\t\t};\n\t\tconst response = await config.client.recall(request);\n\t\treturn (response.memories ?? [])\n\t\t\t.filter(isManagedDurableMemory)\n\t\t\t.map((memory) => ({\n\t\t\t\tentry: toLocalMemoryEntry(memory, scope),\n\t\t\t\tscore: Number(memory.score ?? 0),\n\t\t\t\tmatchedOn: \"content\" as const,\n\t\t\t}));\n\t} catch (error) {\n\t\tlogger.warn(\"Remote memory recall failed; using local fallback\", {\n\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\tprojectId: scope.projectId,\n\t\t});\n\t\treturn null;\n\t}\n}\n\nexport async function applyRemoteAutoMemoryConsolidation(params: {\n\toptions?: {\n\t\tcwd?: string;\n\t\tprojectId?: string;\n\t\tprojectName?: string;\n\t};\n\tremoveEntries: MemoryEntry[];\n\tupserts: Array<{\n\t\tcontent: string;\n\t\ttags?: string[];\n\t\ttopic: string;\n\t}>;\n}): Promise<{ removed: number; added: number; updated: number } | null> {\n\tconst config = await resolveRemoteMemoryConfig();\n\tif (!config) {\n\t\treturn null;\n\t}\n\n\tconst scope = resolveRemoteScope(params.options);\n\tconst existingRecords = await listRemoteRecordsForScope(config, scope);\n\n\tlet removed = 0;\n\tfor (const entry of params.removeEntries) {\n\t\tconst existing = findMatchingRemoteRecord(\n\t\t\texistingRecords,\n\t\t\tentry.topic,\n\t\t\tentry.content,\n\t\t);\n\t\tif (!existing) {\n\t\t\tcontinue;\n\t\t}\n\t\tawait config.client.delete({ id: existing.id });\n\t\tremoved += 1;\n\t}\n\n\tlet added = 0;\n\tlet updated = 0;\n\tfor (const upsert of params.upserts) {\n\t\tconst result = await upsertRemoteDurableMemoryWithConfig(\n\t\t\tconfig,\n\t\t\tscope,\n\t\t\tupsert.topic,\n\t\t\tupsert.content,\n\t\t\t{\n\t\t\t\ttags: [\"auto\", \"durable\", \"consolidated\", ...(upsert.tags ?? [])],\n\t\t\t\texistingRecords,\n\t\t\t},\n\t\t);\n\t\tif (result.created) {\n\t\t\tadded += 1;\n\t\t} else if (result.updated) {\n\t\t\tupdated += 1;\n\t\t}\n\t}\n\n\treturn { removed, added, updated };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builtin.d.ts","sourceRoot":"","sources":["../../src/models/builtin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"builtin.d.ts","sourceRoot":"","sources":["../../src/models/builtin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAm1DpD;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAIxD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAiBD,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAEvC;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAExD;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAG7E"}
|
package/dist/models/builtin.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import { getEvalOpsManagedProviderDefinitions, isEvalOpsManagedGatewayEnabled, } from "../providers/evalops-managed.js";
|
|
1
|
+
import { DEFAULT_EVALOPS_MANAGED_GATEWAY_BASE_URL, getEvalOpsManagedProviderDefinitions, isEvalOpsManagedGatewayEnabled, } from "../providers/evalops-managed.js";
|
|
2
2
|
import { MODELS as GENERATED_MODELS } from "./models.generated.js";
|
|
3
3
|
import { normalizeModelBaseUrl } from "./url-normalize.js";
|
|
4
|
-
const DEFAULT_MANAGED_GATEWAY_BASE_URL = "http://127.0.0.1:8081/v1";
|
|
5
4
|
function getManagedGatewayBaseUrl() {
|
|
6
5
|
const configured = process.env.MAESTRO_LLM_GATEWAY_URL?.trim();
|
|
7
|
-
return configured ||
|
|
6
|
+
return configured || DEFAULT_EVALOPS_MANAGED_GATEWAY_BASE_URL;
|
|
8
7
|
}
|
|
9
8
|
function getManagedGatewayBaseUrlForApi(api) {
|
|
10
9
|
const managedBaseUrl = getManagedGatewayBaseUrl();
|