@evalops/maestro 0.10.12 → 0.10.14

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.
Files changed (67) hide show
  1. package/dist/agent/transport/tool-execution-bridge.d.ts.map +1 -1
  2. package/dist/agent/transport/tool-execution-bridge.js +4 -0
  3. package/dist/agent/transport/tool-execution-bridge.js.map +1 -1
  4. package/dist/audit/logger.d.ts +1 -1
  5. package/dist/cli/args.d.ts.map +1 -1
  6. package/dist/cli/args.js +1 -0
  7. package/dist/cli/args.js.map +1 -1
  8. package/dist/cli/commands/evalops.d.ts +1 -0
  9. package/dist/cli/commands/evalops.d.ts.map +1 -1
  10. package/dist/cli/commands/evalops.js +6 -47
  11. package/dist/cli/commands/evalops.js.map +1 -1
  12. package/dist/cli/commands/init.d.ts +2 -1
  13. package/dist/cli/commands/init.d.ts.map +1 -1
  14. package/dist/cli/commands/init.js +33 -19
  15. package/dist/cli/commands/init.js.map +1 -1
  16. package/dist/cli/commands/status.d.ts +2 -0
  17. package/dist/cli/commands/status.d.ts.map +1 -0
  18. package/dist/cli/commands/status.js +11 -0
  19. package/dist/cli/commands/status.js.map +1 -0
  20. package/dist/cli/help.d.ts.map +1 -1
  21. package/dist/cli/help.js +3 -0
  22. package/dist/cli/help.js.map +1 -1
  23. package/dist/cli-tui/tui-renderer/attachment-controller.d.ts.map +1 -1
  24. package/dist/cli-tui/tui-renderer/attachment-controller.js +18 -1
  25. package/dist/cli-tui/tui-renderer/attachment-controller.js.map +1 -1
  26. package/dist/cli.js +2165 -1711
  27. package/dist/evalops/agent-bootstrap.d.ts +9 -0
  28. package/dist/evalops/agent-bootstrap.d.ts.map +1 -1
  29. package/dist/evalops/agent-bootstrap.js +137 -16
  30. package/dist/evalops/agent-bootstrap.js.map +1 -1
  31. package/dist/evalops/managed-context.d.ts +34 -0
  32. package/dist/evalops/managed-context.d.ts.map +1 -0
  33. package/dist/evalops/managed-context.js +183 -0
  34. package/dist/evalops/managed-context.js.map +1 -0
  35. package/dist/main.d.ts.map +1 -1
  36. package/dist/main.js +5 -0
  37. package/dist/main.js.map +1 -1
  38. package/dist/memory/auto-extraction.d.ts.map +1 -1
  39. package/dist/memory/auto-extraction.js +58 -0
  40. package/dist/memory/auto-extraction.js.map +1 -1
  41. package/dist/memory/backend.d.ts +1 -0
  42. package/dist/memory/backend.d.ts.map +1 -1
  43. package/dist/memory/backend.js.map +1 -1
  44. package/dist/memory/service-client.d.ts +1 -0
  45. package/dist/memory/service-client.d.ts.map +1 -1
  46. package/dist/memory/service-client.js +32 -8
  47. package/dist/memory/service-client.js.map +1 -1
  48. package/dist/oauth/storage.d.ts +1 -0
  49. package/dist/oauth/storage.d.ts.map +1 -1
  50. package/dist/oauth/storage.js +6 -0
  51. package/dist/oauth/storage.js.map +1 -1
  52. package/dist/platform/client.d.ts.map +1 -1
  53. package/dist/platform/client.js +3 -0
  54. package/dist/platform/client.js.map +1 -1
  55. package/dist/platform/tool-execution-client.d.ts.map +1 -1
  56. package/dist/platform/tool-execution-client.js +3 -0
  57. package/dist/platform/tool-execution-client.js.map +1 -1
  58. package/dist/telemetry/maestro-event-bus.d.ts.map +1 -1
  59. package/dist/telemetry/maestro-event-bus.js +16 -47
  60. package/dist/telemetry/maestro-event-bus.js.map +1 -1
  61. package/dist/telemetry.d.ts.map +1 -1
  62. package/dist/telemetry.js +98 -2
  63. package/dist/telemetry.js.map +1 -1
  64. package/dist/version.json +2 -2
  65. package/node_modules/@evalops/contracts/package.json +1 -1
  66. package/node_modules/@evalops/tui/package.json +1 -1
  67. 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"]}
@@ -27,6 +27,7 @@ export interface DurableMemoryBackend {
27
27
  cwd?: string;
28
28
  projectId?: string;
29
29
  projectName?: string;
30
+ sessionId?: string;
30
31
  tags?: string[];
31
32
  }): Promise<DurableMemoryUpsertResult | null>;
32
33
  recallDurableMemories(query: string, options?: {
@@ -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;AAmCD,wBAAgB,uBAAuB,IAAI,oBAAoB,CAE9D"}
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;AAoD7B,MAAM,iCAAiC;IACtC,mBAAmB,CAClB,KAAa,EACb,OAAe,EACf,OAKC;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\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\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
+ {"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"]}
@@ -3,6 +3,7 @@ export declare function upsertRemoteDurableMemory(topic: string, content: string
3
3
  cwd?: string;
4
4
  projectId?: string;
5
5
  projectName?: string;
6
+ sessionId?: string;
6
7
  tags?: string[];
7
8
  }): Promise<{
8
9
  entry: MemoryEntry;
@@ -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;AAgalE,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,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"}
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
- return [
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":"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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:\";\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"]}
@@ -5,6 +5,7 @@ export interface OAuthCredentials {
5
5
  expires: number;
6
6
  metadata?: Record<string, unknown>;
7
7
  }
8
+ export declare function getOAuthStorageRevision(): number;
8
9
  /**
9
10
  * Load OAuth credentials for a specific provider
10
11
  */
@@ -1 +1 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/oauth/storage.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAyDD;;GAEG;AACH,wBAAgB,oBAAoB,CACnC,QAAQ,EAAE,MAAM,GACd,gBAAgB,GAAG,IAAI,CAGzB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CACnC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,gBAAgB,GACrB,IAAI,CAIN;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAI7D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAG7C"}
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/oauth/storage.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAQD,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAqDD;;GAEG;AACH,wBAAgB,oBAAoB,CACnC,QAAQ,EAAE,MAAM,GACd,gBAAgB,GAAG,IAAI,CAGzB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CACnC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,gBAAgB,GACrB,IAAI,CAKN;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAK7D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAG7C"}
@@ -3,6 +3,10 @@ import { join } from "node:path";
3
3
  import { getAgentDir } from "../config/constants.js";
4
4
  import { createLogger } from "../utils/logger.js";
5
5
  const logger = createLogger("oauth:storage");
6
+ let oauthStorageRevision = 0;
7
+ export function getOAuthStorageRevision() {
8
+ return oauthStorageRevision;
9
+ }
6
10
  /**
7
11
  * Get path to oauth.json
8
12
  */
@@ -64,6 +68,7 @@ export function saveOAuthCredentials(provider, creds) {
64
68
  const storage = loadStorage();
65
69
  storage[provider] = creds;
66
70
  saveStorage(storage);
71
+ oauthStorageRevision += 1;
67
72
  }
68
73
  /**
69
74
  * Remove OAuth credentials for a specific provider
@@ -72,6 +77,7 @@ export function removeOAuthCredentials(provider) {
72
77
  const storage = loadStorage();
73
78
  delete storage[provider];
74
79
  saveStorage(storage);
80
+ oauthStorageRevision += 1;
75
81
  }
76
82
  /**
77
83
  * List all providers with OAuth credentials
@@ -1 +1 @@
1
- {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/oauth/storage.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tchmodSync,\n\texistsSync,\n\tmkdirSync,\n\treadFileSync,\n\twriteFileSync,\n} from \"node:fs\";\nimport { join } from \"node:path\";\nimport { getAgentDir } from \"../config/constants.js\";\nimport { createLogger } from \"../utils/logger.js\";\n\nconst logger = createLogger(\"oauth:storage\");\n\nexport interface OAuthCredentials {\n\ttype: \"oauth\";\n\trefresh: string;\n\taccess: string;\n\texpires: number;\n\tmetadata?: Record<string, unknown>;\n}\n\ninterface OAuthStorageFormat {\n\t[provider: string]: OAuthCredentials;\n}\n\n/**\n * Get path to oauth.json\n */\nfunction getOAuthFilePath(): string {\n\tconst configDir = join(getAgentDir(), \"..\");\n\treturn join(configDir, \"oauth.json\");\n}\n\n/**\n * Ensure the config directory exists\n */\nfunction ensureConfigDir(): void {\n\tconst filePath = getOAuthFilePath();\n\tconst configDir = join(filePath, \"..\");\n\tif (!existsSync(configDir)) {\n\t\tmkdirSync(configDir, { recursive: true, mode: 0o700 });\n\t}\n}\n\n/**\n * Load all OAuth credentials from oauth.json\n */\nfunction loadStorage(): OAuthStorageFormat {\n\tconst filePath = getOAuthFilePath();\n\tif (!existsSync(filePath)) {\n\t\treturn {};\n\t}\n\n\ttry {\n\t\tconst content = readFileSync(filePath, \"utf-8\");\n\t\treturn JSON.parse(content);\n\t} catch (error) {\n\t\tlogger.warn(\"Failed to load OAuth credentials; ignoring stored file\", {\n\t\t\tfilePath,\n\t\t\terrorType: error instanceof Error ? error.name : \"unknown\",\n\t\t});\n\t\treturn {};\n\t}\n}\n\n/**\n * Save all OAuth credentials to oauth.json\n */\nfunction saveStorage(storage: OAuthStorageFormat): void {\n\tensureConfigDir();\n\tconst filePath = getOAuthFilePath();\n\twriteFileSync(filePath, JSON.stringify(storage, null, 2), \"utf-8\");\n\t// Set permissions to owner read/write only\n\tchmodSync(filePath, 0o600);\n}\n\n/**\n * Load OAuth credentials for a specific provider\n */\nexport function loadOAuthCredentials(\n\tprovider: string,\n): OAuthCredentials | null {\n\tconst storage = loadStorage();\n\treturn storage[provider] || null;\n}\n\n/**\n * Save OAuth credentials for a specific provider\n */\nexport function saveOAuthCredentials(\n\tprovider: string,\n\tcreds: OAuthCredentials,\n): void {\n\tconst storage = loadStorage();\n\tstorage[provider] = creds;\n\tsaveStorage(storage);\n}\n\n/**\n * Remove OAuth credentials for a specific provider\n */\nexport function removeOAuthCredentials(provider: string): void {\n\tconst storage = loadStorage();\n\tdelete storage[provider];\n\tsaveStorage(storage);\n}\n\n/**\n * List all providers with OAuth credentials\n */\nexport function listOAuthProviders(): string[] {\n\tconst storage = loadStorage();\n\treturn Object.keys(storage);\n}\n"]}
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/oauth/storage.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,SAAS,EACT,UAAU,EACV,SAAS,EACT,YAAY,EACZ,aAAa,GACb,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,MAAM,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;AAc7C,IAAI,oBAAoB,GAAG,CAAC,CAAC;AAE7B,MAAM,UAAU,uBAAuB;IACtC,OAAO,oBAAoB,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB;IACxB,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,CAAC;IAC5C,OAAO,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,SAAS,eAAe;IACvB,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;IACpC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5B,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,CAAC;AACF,CAAC;AAED;;GAEG;AACH,SAAS,WAAW;IACnB,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;IACpC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACX,CAAC;IAED,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,wDAAwD,EAAE;YACrE,QAAQ;YACR,SAAS,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;SAC1D,CAAC,CAAC;QACH,OAAO,EAAE,CAAC;IACX,CAAC;AACF,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,OAA2B;IAC/C,eAAe,EAAE,CAAC;IAClB,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;IACpC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACnE,2CAA2C;IAC3C,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CACnC,QAAgB;IAEhB,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAC9B,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CACnC,QAAgB,EAChB,KAAuB;IAEvB,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAC9B,OAAO,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;IAC1B,WAAW,CAAC,OAAO,CAAC,CAAC;IACrB,oBAAoB,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAgB;IACtD,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAC9B,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzB,WAAW,CAAC,OAAO,CAAC,CAAC;IACrB,oBAAoB,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IACjC,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAC9B,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC","sourcesContent":["import {\n\tchmodSync,\n\texistsSync,\n\tmkdirSync,\n\treadFileSync,\n\twriteFileSync,\n} from \"node:fs\";\nimport { join } from \"node:path\";\nimport { getAgentDir } from \"../config/constants.js\";\nimport { createLogger } from \"../utils/logger.js\";\n\nconst logger = createLogger(\"oauth:storage\");\n\nexport interface OAuthCredentials {\n\ttype: \"oauth\";\n\trefresh: string;\n\taccess: string;\n\texpires: number;\n\tmetadata?: Record<string, unknown>;\n}\n\ninterface OAuthStorageFormat {\n\t[provider: string]: OAuthCredentials;\n}\n\nlet oauthStorageRevision = 0;\n\nexport function getOAuthStorageRevision(): number {\n\treturn oauthStorageRevision;\n}\n\n/**\n * Get path to oauth.json\n */\nfunction getOAuthFilePath(): string {\n\tconst configDir = join(getAgentDir(), \"..\");\n\treturn join(configDir, \"oauth.json\");\n}\n\n/**\n * Ensure the config directory exists\n */\nfunction ensureConfigDir(): void {\n\tconst filePath = getOAuthFilePath();\n\tconst configDir = join(filePath, \"..\");\n\tif (!existsSync(configDir)) {\n\t\tmkdirSync(configDir, { recursive: true, mode: 0o700 });\n\t}\n}\n\n/**\n * Load all OAuth credentials from oauth.json\n */\nfunction loadStorage(): OAuthStorageFormat {\n\tconst filePath = getOAuthFilePath();\n\tif (!existsSync(filePath)) {\n\t\treturn {};\n\t}\n\n\ttry {\n\t\tconst content = readFileSync(filePath, \"utf-8\");\n\t\treturn JSON.parse(content);\n\t} catch (error) {\n\t\tlogger.warn(\"Failed to load OAuth credentials; ignoring stored file\", {\n\t\t\tfilePath,\n\t\t\terrorType: error instanceof Error ? error.name : \"unknown\",\n\t\t});\n\t\treturn {};\n\t}\n}\n\n/**\n * Save all OAuth credentials to oauth.json\n */\nfunction saveStorage(storage: OAuthStorageFormat): void {\n\tensureConfigDir();\n\tconst filePath = getOAuthFilePath();\n\twriteFileSync(filePath, JSON.stringify(storage, null, 2), \"utf-8\");\n\t// Set permissions to owner read/write only\n\tchmodSync(filePath, 0o600);\n}\n\n/**\n * Load OAuth credentials for a specific provider\n */\nexport function loadOAuthCredentials(\n\tprovider: string,\n): OAuthCredentials | null {\n\tconst storage = loadStorage();\n\treturn storage[provider] || null;\n}\n\n/**\n * Save OAuth credentials for a specific provider\n */\nexport function saveOAuthCredentials(\n\tprovider: string,\n\tcreds: OAuthCredentials,\n): void {\n\tconst storage = loadStorage();\n\tstorage[provider] = creds;\n\tsaveStorage(storage);\n\toauthStorageRevision += 1;\n}\n\n/**\n * Remove OAuth credentials for a specific provider\n */\nexport function removeOAuthCredentials(provider: string): void {\n\tconst storage = loadStorage();\n\tdelete storage[provider];\n\tsaveStorage(storage);\n\toauthStorageRevision += 1;\n}\n\n/**\n * List all providers with OAuth credentials\n */\nexport function listOAuthProviders(): string[] {\n\tconst storage = loadStorage();\n\treturn Object.keys(storage);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/platform/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/platform/client.ts"],"names":[],"mappings":"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"}
@@ -16,7 +16,10 @@ const DEFAULT_TOKEN_ENV_VARS = [
16
16
  const DEFAULT_ORGANIZATION_ENV_VARS = [
17
17
  "MAESTRO_EVALOPS_ORG_ID",
18
18
  "EVALOPS_ORGANIZATION_ID",
19
+ "EVALOPS_ORG_ID",
19
20
  "MAESTRO_ENTERPRISE_ORG_ID",
21
+ "MAESTRO_LLM_GATEWAY_ORG_ID",
22
+ "MAESTRO_REMOTE_RUNNER_ORG_ID",
20
23
  ];
21
24
  const DEFAULT_TEAM_ENV_VARS = [
22
25
  "MAESTRO_EVALOPS_TEAM_ID",
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/platform/client.ts"],"names":[],"mappings":"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","sourcesContent":["import { getOAuthToken } from \"../oauth/index.js\";\nimport { loadOAuthCredentials } from \"../oauth/storage.js\";\nimport {\n\ttype DownstreamFailureMode,\n\tfetchDownstream,\n} from \"../utils/downstream-http.js\";\n\nexport const CONNECT_PROTOCOL_VERSION = \"1\";\nexport const DEFAULT_PLATFORM_TIMEOUT_MS = 2_000;\nexport const DEFAULT_PLATFORM_MAX_ATTEMPTS = 2;\n\nexport interface PlatformServiceConfig {\n\tbaseUrl: string;\n\ttoken?: string;\n\torganizationId?: string;\n\tteamId?: string;\n\tworkspaceId?: string;\n\ttimeoutMs: number;\n\tmaxAttempts: number;\n}\n\nexport interface ResolvePlatformServiceConfigOptions {\n\tbaseUrlEnvVars: readonly string[];\n\ttokenEnvVars?: readonly string[];\n\torganizationEnvVars?: readonly string[];\n\tteamEnvVars?: readonly string[];\n\tworkspaceEnvVars?: readonly string[];\n\ttimeoutEnvVars?: readonly string[];\n\tmaxAttemptsEnvVars?: readonly string[];\n\tbaseUrlSuffixes?: readonly string[];\n\tdefaultTimeoutMs?: number;\n\tdefaultMaxAttempts?: number;\n\trequireBaseUrl?: boolean;\n\trequireOrganizationId?: boolean;\n\trequireToken?: boolean;\n}\n\nexport interface PlatformRequestOptions {\n\tserviceName: string;\n\tfailureMode: DownstreamFailureMode;\n\ttimeoutMs: number;\n\tmaxAttempts?: number;\n\tsignal?: AbortSignal;\n}\n\nconst SHARED_PLATFORM_BASE_URL_ENV_VARS = [\n\t\"MAESTRO_PLATFORM_BASE_URL\",\n\t\"MAESTRO_EVALOPS_BASE_URL\",\n\t\"EVALOPS_BASE_URL\",\n] as const;\n\nconst DEFAULT_TOKEN_ENV_VARS = [\n\t\"MAESTRO_EVALOPS_ACCESS_TOKEN\",\n\t\"EVALOPS_TOKEN\",\n] as const;\n\nconst DEFAULT_ORGANIZATION_ENV_VARS = [\n\t\"MAESTRO_EVALOPS_ORG_ID\",\n\t\"EVALOPS_ORGANIZATION_ID\",\n\t\"MAESTRO_ENTERPRISE_ORG_ID\",\n] as const;\n\nconst DEFAULT_TEAM_ENV_VARS = [\n\t\"MAESTRO_EVALOPS_TEAM_ID\",\n\t\"MAESTRO_LLM_GATEWAY_TEAM_ID\",\n] as const;\n\nexport function trimString(value: string | undefined): string | undefined {\n\tconst trimmed = value?.trim();\n\treturn trimmed ? trimmed : undefined;\n}\n\nexport function getEnvValue(names: readonly string[]): string | undefined {\n\tfor (const name of names) {\n\t\tconst value = trimString(process.env[name]);\n\t\tif (value) {\n\t\t\treturn value;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nexport function parsePositiveInt(\n\tvalue: string | undefined,\n\tfallback: number,\n): number {\n\tconst parsed = Number.parseInt(value ?? \"\", 10);\n\treturn Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;\n}\n\nexport function normalizeBaseUrl(\n\tbaseUrl: string,\n\tsuffixes: readonly string[] = [],\n): string {\n\tlet normalized = baseUrl.trim().replace(/\\/+$/u, \"\");\n\tfor (const suffix of suffixes) {\n\t\tif (normalized.endsWith(suffix)) {\n\t\t\tnormalized = normalized.slice(0, -suffix.length).replace(/\\/+$/u, \"\");\n\t\t}\n\t}\n\treturn normalized;\n}\n\nexport function resolveOrganizationId(\n\tenvVars: readonly string[] = DEFAULT_ORGANIZATION_ENV_VARS,\n): string | undefined {\n\tconst envOrgId = getEnvValue(envVars);\n\tif (envOrgId) {\n\t\treturn envOrgId;\n\t}\n\tconst stored = loadOAuthCredentials(\"evalops\")?.metadata?.organizationId;\n\treturn typeof stored === \"string\" ? trimString(stored) : undefined;\n}\n\nexport function resolveTeamId(\n\tenvVars: readonly string[] = DEFAULT_TEAM_ENV_VARS,\n): string | undefined {\n\treturn getEnvValue(envVars);\n}\n\nexport function resolveWorkspaceId(\n\tenvVars: readonly string[] = DEFAULT_ORGANIZATION_ENV_VARS,\n): string | undefined {\n\treturn getEnvValue(envVars) ?? resolveOrganizationId();\n}\n\nexport function resolveConfiguredToken(\n\tenvVars: readonly string[] = DEFAULT_TOKEN_ENV_VARS,\n): string | undefined {\n\tconst envToken = getEnvValue(envVars);\n\tif (envToken) {\n\t\treturn envToken;\n\t}\n\tconst stored = loadOAuthCredentials(\"evalops\")?.access;\n\treturn typeof stored === \"string\" ? trimString(stored) : undefined;\n}\n\nexport async function resolvePlatformToken(\n\tenvVars: readonly string[] = DEFAULT_TOKEN_ENV_VARS,\n): Promise<string | undefined> {\n\treturn getEnvValue(envVars) ?? (await getOAuthToken(\"evalops\")) ?? undefined;\n}\n\nexport async function resolvePlatformServiceConfig(\n\toptions: ResolvePlatformServiceConfigOptions,\n): Promise<PlatformServiceConfig | null> {\n\tconst baseUrl = getEnvValue([\n\t\t...options.baseUrlEnvVars,\n\t\t...SHARED_PLATFORM_BASE_URL_ENV_VARS,\n\t]);\n\tif (!baseUrl && options.requireBaseUrl !== false) {\n\t\treturn null;\n\t}\n\n\tconst organizationId = resolveOrganizationId(options.organizationEnvVars);\n\tif (!organizationId && options.requireOrganizationId !== false) {\n\t\treturn null;\n\t}\n\n\tconst token = await resolvePlatformToken(options.tokenEnvVars);\n\tif (!token && options.requireToken !== false) {\n\t\treturn null;\n\t}\n\n\tconst workspaceId = options.workspaceEnvVars\n\t\t? resolveWorkspaceId(options.workspaceEnvVars)\n\t\t: organizationId;\n\n\treturn {\n\t\tbaseUrl: normalizeBaseUrl(baseUrl ?? \"\", options.baseUrlSuffixes),\n\t\t...(token ? { token } : {}),\n\t\t...(organizationId ? { organizationId } : {}),\n\t\tteamId: resolveTeamId(options.teamEnvVars),\n\t\t...(workspaceId ? { workspaceId } : {}),\n\t\ttimeoutMs: parsePositiveInt(\n\t\t\tgetEnvValue(options.timeoutEnvVars ?? []),\n\t\t\toptions.defaultTimeoutMs ?? DEFAULT_PLATFORM_TIMEOUT_MS,\n\t\t),\n\t\tmaxAttempts: parsePositiveInt(\n\t\t\tgetEnvValue(options.maxAttemptsEnvVars ?? []),\n\t\t\toptions.defaultMaxAttempts ?? DEFAULT_PLATFORM_MAX_ATTEMPTS,\n\t\t),\n\t};\n}\n\nfunction buildPlatformJsonHeaders(\n\tconfig: Pick<PlatformServiceConfig, \"organizationId\" | \"token\">,\n\textraHeaders?: Record<string, string | undefined>,\n): Record<string, string> {\n\treturn Object.fromEntries(\n\t\tObject.entries({\n\t\t\t...(config.token ? { Authorization: `Bearer ${config.token}` } : {}),\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t...(config.organizationId\n\t\t\t\t? { \"X-Organization-ID\": config.organizationId }\n\t\t\t\t: {}),\n\t\t\t...(extraHeaders ?? {}),\n\t\t}).filter(\n\t\t\t(entry): entry is [string, string] =>\n\t\t\t\ttypeof entry[1] === \"string\" && entry[1].trim().length > 0,\n\t\t),\n\t);\n}\n\nexport function buildPlatformConnectHeaders(\n\tconfig: Pick<PlatformServiceConfig, \"organizationId\" | \"token\">,\n\textraHeaders?: Record<string, string | undefined>,\n): Record<string, string> {\n\treturn buildPlatformJsonHeaders(config, {\n\t\t\"Connect-Protocol-Version\": CONNECT_PROTOCOL_VERSION,\n\t\t...(extraHeaders ?? {}),\n\t});\n}\n\nexport async function postPlatformConnect(\n\tconfig: PlatformServiceConfig,\n\tpath: string,\n\tbody: Record<string, unknown>,\n\toptions: PlatformRequestOptions,\n\theaders?: Record<string, string | undefined>,\n): Promise<Response> {\n\treturn fetchDownstream(\n\t\t`${config.baseUrl}${path}`,\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t\theaders: buildPlatformConnectHeaders(config, headers),\n\t\t\tbody: JSON.stringify(body),\n\t\t\tsignal: options.signal,\n\t\t},\n\t\t{\n\t\t\tserviceName: options.serviceName,\n\t\t\tfailureMode: options.failureMode,\n\t\t\ttimeoutMs: options.timeoutMs,\n\t\t\tmaxAttempts: options.maxAttempts,\n\t\t},\n\t);\n}\n"]}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/platform/client.ts"],"names":[],"mappings":"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","sourcesContent":["import { getOAuthToken } from \"../oauth/index.js\";\nimport { loadOAuthCredentials } from \"../oauth/storage.js\";\nimport {\n\ttype DownstreamFailureMode,\n\tfetchDownstream,\n} from \"../utils/downstream-http.js\";\n\nexport const CONNECT_PROTOCOL_VERSION = \"1\";\nexport const DEFAULT_PLATFORM_TIMEOUT_MS = 2_000;\nexport const DEFAULT_PLATFORM_MAX_ATTEMPTS = 2;\n\nexport interface PlatformServiceConfig {\n\tbaseUrl: string;\n\ttoken?: string;\n\torganizationId?: string;\n\tteamId?: string;\n\tworkspaceId?: string;\n\ttimeoutMs: number;\n\tmaxAttempts: number;\n}\n\nexport interface ResolvePlatformServiceConfigOptions {\n\tbaseUrlEnvVars: readonly string[];\n\ttokenEnvVars?: readonly string[];\n\torganizationEnvVars?: readonly string[];\n\tteamEnvVars?: readonly string[];\n\tworkspaceEnvVars?: readonly string[];\n\ttimeoutEnvVars?: readonly string[];\n\tmaxAttemptsEnvVars?: readonly string[];\n\tbaseUrlSuffixes?: readonly string[];\n\tdefaultTimeoutMs?: number;\n\tdefaultMaxAttempts?: number;\n\trequireBaseUrl?: boolean;\n\trequireOrganizationId?: boolean;\n\trequireToken?: boolean;\n}\n\nexport interface PlatformRequestOptions {\n\tserviceName: string;\n\tfailureMode: DownstreamFailureMode;\n\ttimeoutMs: number;\n\tmaxAttempts?: number;\n\tsignal?: AbortSignal;\n}\n\nconst SHARED_PLATFORM_BASE_URL_ENV_VARS = [\n\t\"MAESTRO_PLATFORM_BASE_URL\",\n\t\"MAESTRO_EVALOPS_BASE_URL\",\n\t\"EVALOPS_BASE_URL\",\n] as const;\n\nconst DEFAULT_TOKEN_ENV_VARS = [\n\t\"MAESTRO_EVALOPS_ACCESS_TOKEN\",\n\t\"EVALOPS_TOKEN\",\n] as const;\n\nconst DEFAULT_ORGANIZATION_ENV_VARS = [\n\t\"MAESTRO_EVALOPS_ORG_ID\",\n\t\"EVALOPS_ORGANIZATION_ID\",\n\t\"EVALOPS_ORG_ID\",\n\t\"MAESTRO_ENTERPRISE_ORG_ID\",\n\t\"MAESTRO_LLM_GATEWAY_ORG_ID\",\n\t\"MAESTRO_REMOTE_RUNNER_ORG_ID\",\n] as const;\n\nconst DEFAULT_TEAM_ENV_VARS = [\n\t\"MAESTRO_EVALOPS_TEAM_ID\",\n\t\"MAESTRO_LLM_GATEWAY_TEAM_ID\",\n] as const;\n\nexport function trimString(value: string | undefined): string | undefined {\n\tconst trimmed = value?.trim();\n\treturn trimmed ? trimmed : undefined;\n}\n\nexport function getEnvValue(names: readonly string[]): string | undefined {\n\tfor (const name of names) {\n\t\tconst value = trimString(process.env[name]);\n\t\tif (value) {\n\t\t\treturn value;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nexport function parsePositiveInt(\n\tvalue: string | undefined,\n\tfallback: number,\n): number {\n\tconst parsed = Number.parseInt(value ?? \"\", 10);\n\treturn Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;\n}\n\nexport function normalizeBaseUrl(\n\tbaseUrl: string,\n\tsuffixes: readonly string[] = [],\n): string {\n\tlet normalized = baseUrl.trim().replace(/\\/+$/u, \"\");\n\tfor (const suffix of suffixes) {\n\t\tif (normalized.endsWith(suffix)) {\n\t\t\tnormalized = normalized.slice(0, -suffix.length).replace(/\\/+$/u, \"\");\n\t\t}\n\t}\n\treturn normalized;\n}\n\nexport function resolveOrganizationId(\n\tenvVars: readonly string[] = DEFAULT_ORGANIZATION_ENV_VARS,\n): string | undefined {\n\tconst envOrgId = getEnvValue(envVars);\n\tif (envOrgId) {\n\t\treturn envOrgId;\n\t}\n\tconst stored = loadOAuthCredentials(\"evalops\")?.metadata?.organizationId;\n\treturn typeof stored === \"string\" ? trimString(stored) : undefined;\n}\n\nexport function resolveTeamId(\n\tenvVars: readonly string[] = DEFAULT_TEAM_ENV_VARS,\n): string | undefined {\n\treturn getEnvValue(envVars);\n}\n\nexport function resolveWorkspaceId(\n\tenvVars: readonly string[] = DEFAULT_ORGANIZATION_ENV_VARS,\n): string | undefined {\n\treturn getEnvValue(envVars) ?? resolveOrganizationId();\n}\n\nexport function resolveConfiguredToken(\n\tenvVars: readonly string[] = DEFAULT_TOKEN_ENV_VARS,\n): string | undefined {\n\tconst envToken = getEnvValue(envVars);\n\tif (envToken) {\n\t\treturn envToken;\n\t}\n\tconst stored = loadOAuthCredentials(\"evalops\")?.access;\n\treturn typeof stored === \"string\" ? trimString(stored) : undefined;\n}\n\nexport async function resolvePlatformToken(\n\tenvVars: readonly string[] = DEFAULT_TOKEN_ENV_VARS,\n): Promise<string | undefined> {\n\treturn getEnvValue(envVars) ?? (await getOAuthToken(\"evalops\")) ?? undefined;\n}\n\nexport async function resolvePlatformServiceConfig(\n\toptions: ResolvePlatformServiceConfigOptions,\n): Promise<PlatformServiceConfig | null> {\n\tconst baseUrl = getEnvValue([\n\t\t...options.baseUrlEnvVars,\n\t\t...SHARED_PLATFORM_BASE_URL_ENV_VARS,\n\t]);\n\tif (!baseUrl && options.requireBaseUrl !== false) {\n\t\treturn null;\n\t}\n\n\tconst organizationId = resolveOrganizationId(options.organizationEnvVars);\n\tif (!organizationId && options.requireOrganizationId !== false) {\n\t\treturn null;\n\t}\n\n\tconst token = await resolvePlatformToken(options.tokenEnvVars);\n\tif (!token && options.requireToken !== false) {\n\t\treturn null;\n\t}\n\n\tconst workspaceId = options.workspaceEnvVars\n\t\t? resolveWorkspaceId(options.workspaceEnvVars)\n\t\t: organizationId;\n\n\treturn {\n\t\tbaseUrl: normalizeBaseUrl(baseUrl ?? \"\", options.baseUrlSuffixes),\n\t\t...(token ? { token } : {}),\n\t\t...(organizationId ? { organizationId } : {}),\n\t\tteamId: resolveTeamId(options.teamEnvVars),\n\t\t...(workspaceId ? { workspaceId } : {}),\n\t\ttimeoutMs: parsePositiveInt(\n\t\t\tgetEnvValue(options.timeoutEnvVars ?? []),\n\t\t\toptions.defaultTimeoutMs ?? DEFAULT_PLATFORM_TIMEOUT_MS,\n\t\t),\n\t\tmaxAttempts: parsePositiveInt(\n\t\t\tgetEnvValue(options.maxAttemptsEnvVars ?? []),\n\t\t\toptions.defaultMaxAttempts ?? DEFAULT_PLATFORM_MAX_ATTEMPTS,\n\t\t),\n\t};\n}\n\nfunction buildPlatformJsonHeaders(\n\tconfig: Pick<PlatformServiceConfig, \"organizationId\" | \"token\">,\n\textraHeaders?: Record<string, string | undefined>,\n): Record<string, string> {\n\treturn Object.fromEntries(\n\t\tObject.entries({\n\t\t\t...(config.token ? { Authorization: `Bearer ${config.token}` } : {}),\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t...(config.organizationId\n\t\t\t\t? { \"X-Organization-ID\": config.organizationId }\n\t\t\t\t: {}),\n\t\t\t...(extraHeaders ?? {}),\n\t\t}).filter(\n\t\t\t(entry): entry is [string, string] =>\n\t\t\t\ttypeof entry[1] === \"string\" && entry[1].trim().length > 0,\n\t\t),\n\t);\n}\n\nexport function buildPlatformConnectHeaders(\n\tconfig: Pick<PlatformServiceConfig, \"organizationId\" | \"token\">,\n\textraHeaders?: Record<string, string | undefined>,\n): Record<string, string> {\n\treturn buildPlatformJsonHeaders(config, {\n\t\t\"Connect-Protocol-Version\": CONNECT_PROTOCOL_VERSION,\n\t\t...(extraHeaders ?? {}),\n\t});\n}\n\nexport async function postPlatformConnect(\n\tconfig: PlatformServiceConfig,\n\tpath: string,\n\tbody: Record<string, unknown>,\n\toptions: PlatformRequestOptions,\n\theaders?: Record<string, string | undefined>,\n): Promise<Response> {\n\treturn fetchDownstream(\n\t\t`${config.baseUrl}${path}`,\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t\theaders: buildPlatformConnectHeaders(config, headers),\n\t\t\tbody: JSON.stringify(body),\n\t\t\tsignal: options.signal,\n\t\t},\n\t\t{\n\t\t\tserviceName: options.serviceName,\n\t\t\tfailureMode: options.failureMode,\n\t\t\ttimeoutMs: options.timeoutMs,\n\t\t\tmaxAttempts: options.maxAttempts,\n\t\t},\n\t);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"tool-execution-client.d.ts","sourceRoot":"","sources":["../../src/platform/tool-execution-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tool-execution-client.d.ts","sourceRoot":"","sources":["../../src/platform/tool-execution-client.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,qBAAqB,EAK1B,MAAM,aAAa,CAAC;AAiErB,MAAM,MAAM,sBAAsB,GAC/B,wBAAwB,GACxB,gBAAgB,GAChB,mBAAmB,GACnB,iBAAiB,GACjB,qBAAqB,CAAC;AAEzB,MAAM,MAAM,kBAAkB,GAC3B,kCAAkC,GAClC,+BAA+B,GAC/B,wCAAwC,GACxC,uCAAuC,GACvC,8BAA8B,GAC9B,gCAAgC,GAChC,6BAA6B,GAC7B,6BAA6B,GAC7B,gCAAgC,CAAC;AAEpC,MAAM,WAAW,oBAAoB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,uBAAuB;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uBAAuB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,MAAM,WAAW,0BAA0B;IAC1C,OAAO,EAAE,oBAAoB,CAAC;IAC9B,IAAI,EAAE,eAAe,CAAC;IACtB,SAAS,CAAC,EAAE,oBAAoB,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,SAAS,CAAC,EAAE,sBAAsB,CAAC;IACnC,WAAW,CAAC,EAAE,uBAAuB,CAAC;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,kCAAkC;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,0BAA0B;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,2BAA2B;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,SAAS,CAAC,EAAE,0BAA0B,EAAE,CAAC;IACzC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,wCAAwC;IACxD,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,2BAA2B,CAAC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,oBAAoB;IACpC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,2BAA2B;IAC3C,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,oBAAoB,CAAC;CACpC;AAED,MAAM,WAAW,2BAA2B;IAC3C,SAAS,EAAE,2BAA2B,CAAC;IACvC,gBAAgB,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,mCAAmC;IACnD,SAAS,EAAE,2BAA2B,CAAC;CACvC;AAED,MAAM,WAAW,yCAAyC;IACzD,SAAS,EAAE,2BAA2B,CAAC;CACvC;AAED,MAAM,WAAW,0BAA2B,SAAQ,qBAAqB;CAAG;AAuB5E,wBAAsB,iCAAiC,CACtD,SAAS,GAAE,OAAO,CAAC,0BAA0B,CAAM,GACjD,OAAO,CAAC,0BAA0B,GAAG,IAAI,CAAC,CAyC5C;AAwLD,wBAAsB,uBAAuB,CAC5C,MAAM,EAAE,0BAA0B,EAClC,OAAO,EAAE,0BAA0B,EACnC,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,2BAA2B,CAAC,CAmBtC;AAED,wBAAsB,+BAA+B,CACpD,MAAM,EAAE,0BAA0B,EAClC,OAAO,EAAE,kCAAkC,EAC3C,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,mCAAmC,CAAC,CAwB9C;AAED,wBAAsB,qCAAqC,CAC1D,MAAM,EAAE,0BAA0B,EAClC,OAAO,EAAE,wCAAwC,EACjD,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,yCAAyC,CAAC,CAqBpD"}
@@ -20,7 +20,10 @@ const TOOL_EXECUTION_ORGANIZATION_ENV_VARS = [
20
20
  "MAESTRO_TOOL_EXECUTION_ORGANIZATION_ID",
21
21
  "MAESTRO_EVALOPS_ORG_ID",
22
22
  "EVALOPS_ORGANIZATION_ID",
23
+ "EVALOPS_ORG_ID",
23
24
  "MAESTRO_ENTERPRISE_ORG_ID",
25
+ "MAESTRO_LLM_GATEWAY_ORG_ID",
26
+ "MAESTRO_REMOTE_RUNNER_ORG_ID",
24
27
  ];
25
28
  const TOOL_EXECUTION_WORKSPACE_ENV_VARS = [
26
29
  "TOOL_EXECUTION_SERVICE_WORKSPACE_ID",