@tangle-network/agent-knowledge 5.0.3 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/README.md +2 -2
- package/dist/benchmarks/index.js +1 -1
- package/dist/{chunk-LMR53POQ.js → chunk-46YPZHAX.js} +9 -3
- package/dist/chunk-46YPZHAX.js.map +1 -0
- package/dist/{chunk-EYIA5PLQ.js → chunk-PVCSESAF.js} +2 -2
- package/dist/{chunk-EYIA5PLQ.js.map → chunk-PVCSESAF.js.map} +1 -1
- package/dist/{index-Cf7txrYP.d.ts → index-C--N5wQV.d.ts} +8 -2
- package/dist/index.d.ts +3 -11
- package/dist/index.js +4 -6
- package/dist/index.js.map +1 -1
- package/dist/memory/index.d.ts +1 -1
- package/dist/memory/index.js +2 -2
- package/docs/results/investment-thesis.md +1 -1
- package/docs/results/research-driving.md +1 -1
- package/docs/{two-agent-research-ab.md → verified-research-ab.md} +2 -2
- package/package.json +3 -3
- package/dist/chunk-LMR53POQ.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/memory/holdout.ts","../src/memory/adapter.ts","../src/memory/branch.ts","../src/memory/rank.ts","../src/memory/experiment/validation.ts","../src/memory/experiment/cases.ts","../src/memory/experiment/run.ts","../src/memory/experiment/cell.ts","../src/memory/experiment/cost.ts","../src/memory/experiment/execution-context.ts","../src/memory/experiment/metrics.ts","../src/memory/experiment/recovery.ts","../src/memory/experiment/runtime.ts","../src/memory/graphiti.ts","../src/memory/improvement/run.ts","../src/optimization.ts","../src/immutable-ref.ts","../src/memory/improvement/activation.ts","../src/memory/improvement/evaluation.ts","../src/memory/improvement/candidate.ts","../src/memory/improvement/identity.ts","../src/memory/improvement/promotion.ts","../src/memory/improvement/types.ts","../src/memory/improvement/output.ts","../src/memory/improvement/validation.ts","../src/memory/mem0.ts","../src/memory/neo4j.ts","../src/memory/schemas.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto'\n\nimport { mulberry32 } from '@tangle-network/agent-eval'\n\nimport type { OffPolicyTrajectory } from '@tangle-network/agent-eval/rl'\n\nimport { sha256 } from '../ids'\n\nimport type {\n AgentMemoryHit,\n RetrievalHoldoutBypassReason,\n RetrievalHoldoutCallContext,\n RetrievalHoldoutConfig,\n RetrievalHoldoutEvent,\n RetrievalHoldoutResult,\n RetrievalHoldoutSessionState,\n} from './types'\n\nexport type {\n RetrievalHoldoutBypassReason,\n RetrievalHoldoutCallContext,\n RetrievalHoldoutConfig,\n RetrievalHoldoutEligibleItem,\n RetrievalHoldoutEvent,\n RetrievalHoldoutResult,\n RetrievalHoldoutSessionState,\n} from './types'\n\n/**\n * Deterministic uniform [0,1) for assignment draws. The sha256 key derivation is ours — it makes\n * every draw replayable from the logged keys alone (design rule D5) — while the generator core is\n * the substrate's `mulberry32` (@tangle-network/agent-eval statistics vocabulary), seeded with the\n * top 32 bits of the digest, so the statistical machinery is reused rather than forked.\n */\nexport function deterministicRng(key: string): number {\n return mulberry32(Number.parseInt(sha256(key).slice(0, 8), 16))()\n}\n\n// Deterministic serialization for hashing: keys sorted, undefined-valued entries stripped, so\n// the same logical scope/config always produces the same hash regardless of construction order.\n// Known limitation: NaN and Infinity serialize as null (JSON.stringify semantics) — acceptable\n// for hashing because it is deterministic; bigint has no JSON form at all, so it fails loud.\nfunction canonicalJson(value: unknown): string {\n if (typeof value === 'bigint') {\n throw new TypeError('canonicalJson: bigint values are not supported in holdout hashing')\n }\n if (value === undefined) return 'null'\n if (Array.isArray(value)) return `[${value.map(canonicalJson).join(',')}]`\n if (value !== null && typeof value === 'object') {\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([, v]) => v !== undefined)\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([k, v]) => `${JSON.stringify(k)}:${canonicalJson(v)}`)\n return `{${entries.join(',')}}`\n }\n return JSON.stringify(value)\n}\n\n/**\n * Value-hash of the knobs that DEFINE the experiment (epsilon + watchlist, order-independent).\n * Everything else on the config (callbacks, attribution stamps, privacy flags) does not change\n * which assignments are drawn, so it stays out of the hash.\n */\nexport function retrievalHoldoutConfigHash(\n config: Pick<RetrievalHoldoutConfig, 'epsilon' | 'watchlist'>,\n): string {\n return sha256(\n canonicalJson({ epsilon: config.epsilon, watchlist: [...(config.watchlist ?? [])].sort() }),\n ).slice(0, 16)\n}\n\n// Malformed knobs silently corrupt propensities (epsilon>1 forces holdout with dropPropensity>1;\n// epsilon<0 disables it while still logging a control-arm-shaped stream), so fail loud instead.\nfunction assertValidHoldoutConfig(config: RetrievalHoldoutConfig): void {\n const { epsilon, watchlist } = config\n if (typeof epsilon !== 'number' || !Number.isFinite(epsilon) || epsilon < 0 || epsilon > 1) {\n throw new Error(`retrieval holdout epsilon must be a number in [0, 1], got ${String(epsilon)}`)\n }\n if (\n watchlist !== undefined &&\n (!Array.isArray(watchlist) || watchlist.some((id) => typeof id !== 'string'))\n ) {\n throw new Error('retrieval holdout watchlist must be an array of item-id strings')\n }\n}\n\n// Observability must never break retrieval: a throwing onEvent sink is logged and swallowed,\n// deliberately identical on the randomized and bypass paths. The cost is a lost event — a hole\n// the analysis can see as a callIndex gap — never a lost or altered retrieval result.\nfunction safeEmit(config: RetrievalHoldoutConfig, event: RetrievalHoldoutEvent): void {\n try {\n config.onEvent(event)\n } catch (error) {\n console.error(\n '[agent-knowledge] retrieval holdout onEvent sink threw; retrieval continues',\n error,\n )\n }\n}\n\n/**\n * Pure per-call holdout: takes post-filter hits, returns delivered hits plus the log event\n * and the next session state. Suppression only removes items (no backfill), and it happens\n * before rendering so a drop session's context is byte-identical to a natural smaller retrieval.\n */\nexport function applyRetrievalHoldout(\n hits: AgentMemoryHit[],\n config: RetrievalHoldoutConfig,\n ctx: RetrievalHoldoutCallContext = {},\n): RetrievalHoldoutResult {\n assertValidHoldoutConfig(config)\n const rng = config.rng ?? deterministicRng\n const sessionId = ctx.sessionId ?? ctx.scope?.sessionId\n const holdoutEligible = typeof sessionId === 'string' && sessionId.length > 0\n const base = holdoutEventBase(hits, config, ctx)\n\n let session: RetrievalHoldoutSessionState | undefined\n if (holdoutEligible) {\n const prior = ctx.session?.sessionId === sessionId ? ctx.session : undefined\n session = prior ?? {\n sessionId,\n callCount: 0,\n // The epsilon coin depends only on sessionId, so assignment is independent of task\n // features by construction and exactly replayable (design rules D1 + D5).\n sessionHoldout: rng(`${sessionId}#holdout`) < config.epsilon,\n targetId: null,\n pickPropensity: null,\n }\n session = { ...session, callCount: session.callCount + 1 }\n }\n\n const watchlistEligible = base.watchlistEligible\n\n if (session?.sessionHoldout && session.targetId === null && watchlistEligible.length > 0) {\n // Draw once, uniformly over watchlist ∩ E at the first intersecting call, then stay sticky.\n // Candidates are sorted by id so the draw does not depend on retrieval ordering.\n const candidates = [...watchlistEligible].sort()\n const index = Math.min(\n Math.floor(rng(`${session.sessionId}#pick`) * candidates.length),\n candidates.length - 1,\n )\n const picked = candidates[index]\n if (picked !== undefined) {\n session = { ...session, targetId: picked, pickPropensity: 1 / candidates.length }\n }\n }\n\n const targetId = session?.sessionHoldout ? (session.targetId ?? null) : null\n const droppedId = targetId !== null && hits.some((hit) => hit.id === targetId) ? targetId : null\n const delivered = droppedId === null ? hits : hits.filter((hit) => hit.id !== droppedId)\n\n const pickPropensity = session?.sessionHoldout ? (session.pickPropensity ?? null) : null\n const event: RetrievalHoldoutEvent = {\n ...base,\n callIndex: session?.callCount ?? 0,\n holdoutEligible,\n sessionHoldout: session?.sessionHoldout ?? false,\n sessionTargetId: targetId,\n droppedId,\n pickPropensity,\n dropPropensity: pickPropensity !== null ? config.epsilon * pickPropensity : null,\n deliveredIds: delivered.map((hit) => hit.id),\n }\n safeEmit(config, event)\n\n return droppedId === null\n ? { delivered: hits, event, ...(session !== undefined ? { session } : {}) }\n : { delivered, event, ...(session !== undefined ? { session } : {}) }\n}\n\n/** Fields shared by randomized and bypass events: identity, attribution, config echo, eligibility. */\nfunction holdoutEventBase(\n hits: AgentMemoryHit[],\n config: RetrievalHoldoutConfig,\n ctx: Omit<RetrievalHoldoutCallContext, 'session'>,\n) {\n const sessionId = ctx.sessionId ?? ctx.scope?.sessionId\n const watchlist = config.watchlist ?? []\n const watchlistSet = new Set(watchlist)\n const plaintext = config.includePlaintextIdentifiers === true\n return {\n v: 1 as const,\n eventId: randomUUID(),\n ts: new Date().toISOString(),\n ...(config.adapterId !== undefined ? { adapterId: config.adapterId } : {}),\n ...(plaintext && sessionId !== undefined ? { sessionId } : {}),\n ...(ctx.taskId !== undefined ? { taskId: ctx.taskId } : {}),\n ...(sessionId !== undefined ? { sessionIdHash: sha256(sessionId).slice(0, 16) } : {}),\n ...(ctx.query !== undefined ? { queryHash: sha256(ctx.query).slice(0, 16) } : {}),\n ...(plaintext && ctx.scope !== undefined ? { scope: ctx.scope } : {}),\n ...(ctx.scope !== undefined\n ? { scopeHash: sha256(canonicalJson(ctx.scope)).slice(0, 16) }\n : {}),\n config: {\n epsilon: config.epsilon,\n watchlist: [...watchlist],\n ...(config.configVersion !== undefined ? { configVersion: config.configVersion } : {}),\n },\n configHash: retrievalHoldoutConfigHash(config),\n eligible: hits.map((hit, index) => ({\n id: hit.id,\n rank: index + 1,\n ...(typeof (hit.normalizedScore ?? hit.score) === 'number'\n ? { score: hit.normalizedScore ?? hit.score }\n : {}),\n kind: hit.kind,\n contentHash: sha256(hit.text).slice(0, 16),\n })),\n watchlistEligible: hits.filter((hit) => watchlistSet.has(hit.id)).map((hit) => hit.id),\n ...(config.corpusVersion !== undefined ? { corpusVersion: config.corpusVersion } : {}),\n }\n}\n\n/**\n * Logs a holdout event for adapter context paths that answer WITHOUT going through the\n * search→render seam (Neo4j short-term conversation context, raw-string getContext results),\n * so a consumer with a holdout configured still sees every call and the fraction-under-experiment\n * denominator stays honest instead of silently losing these calls. No suppression is applied:\n * dropping is only meaningful for retrieved memory hits, never for conversation context.\n */\nexport function emitRetrievalHoldoutBypass(\n hits: AgentMemoryHit[],\n config: RetrievalHoldoutConfig,\n ctx: Omit<RetrievalHoldoutCallContext, 'session'>,\n bypassReason: RetrievalHoldoutBypassReason,\n): RetrievalHoldoutEvent {\n assertValidHoldoutConfig(config)\n const event: RetrievalHoldoutEvent = {\n ...holdoutEventBase(hits, config, ctx),\n callIndex: 0,\n holdoutEligible: false,\n sessionHoldout: false,\n sessionTargetId: null,\n droppedId: null,\n pickPropensity: null,\n dropPropensity: null,\n deliveredIds: hits.map((hit) => hit.id),\n bypassReason,\n }\n safeEmit(config, event)\n return event\n}\n\n// Session states are tiny (5 scalar fields); the cap only guards unbounded long-lived processes.\n// Evicting a live session degrades detectably, not silently: a re-drawn target that differs\n// shows up in the log as a mixed-exposure session (same sessionIdHash, different sessionTargetId,\n// callIndex restarting at 1), which analysis excludes and counts.\nconst DEFAULT_MAX_TRACKED_SESSIONS = 10_000\n\n// Keyed by configHash VALUE, not config object identity: callers building options inline pass a\n// fresh config object per call (the natural adapter pattern), and identity-keying would silently\n// reset callIndex and re-draw the \"sticky\" target mid-session — one session logged as\n// under-treatment for two different items, invalidating the per-item estimate. The outer map is\n// bounded by the number of distinct experiment configs, in practice a handful.\nconst sessionRegistry = new Map<string, Map<string, RetrievalHoldoutSessionState>>()\n\n/**\n * Clears all sticky-session state. For test isolation and experiment-epoch boundaries;\n * sessions in flight afterwards re-draw deterministically (same rng keys), so with the default\n * rng a reset is invisible in the logs unless eligibility sets changed in between.\n */\nexport function resetRetrievalHoldoutRegistry(): void {\n sessionRegistry.clear()\n}\n\n/**\n * Convenience wrapper that threads session state internally, keyed by the VALUE of the\n * experiment-defining knobs (configHash = epsilon + sorted watchlist) plus sessionId, so a fresh\n * config object per call — the natural pattern when options are built inline — keeps full\n * stickiness. Distinct experiments never share session state; two config objects with the same\n * epsilon/watchlist are the same experiment by definition.\n */\nexport function applySessionStickyRetrievalHoldout(\n hits: AgentMemoryHit[],\n config: RetrievalHoldoutConfig,\n ctx: Omit<RetrievalHoldoutCallContext, 'session'> = {},\n): RetrievalHoldoutResult {\n assertValidHoldoutConfig(config)\n const sessionId = ctx.sessionId ?? ctx.scope?.sessionId\n const configHash = retrievalHoldoutConfigHash(config)\n let sessions = sessionRegistry.get(configHash)\n if (!sessions) {\n sessions = new Map()\n sessionRegistry.set(configHash, sessions)\n }\n const prior = sessionId !== undefined ? sessions.get(sessionId) : undefined\n const result = applyRetrievalHoldout(hits, config, {\n ...ctx,\n ...(prior ? { session: prior } : {}),\n })\n if (sessionId !== undefined && result.session) {\n const cap = config.maxTrackedSessions ?? DEFAULT_MAX_TRACKED_SESSIONS\n if (!sessions.has(sessionId) && sessions.size >= cap) {\n // Oldest-inserted-first: Map preserves insertion order and updates keep position.\n const oldest = sessions.keys().next().value\n if (oldest !== undefined) sessions.delete(oldest)\n }\n sessions.set(sessionId, result.session)\n }\n return result\n}\n\n/** Aggregated view of one session's holdout exposure — the randomization unit of this design. */\nexport interface RetrievalHoldoutSessionSummary {\n /** `${configHash}:${sessionIdHash}` — the trajectory's runId. */\n runId: string\n configHash: string\n sessionIdHash: string\n sessionHoldout: boolean\n sessionTargetId: string | null\n /** Item actually suppressed in this session (equals sessionTargetId when a drop occurred). */\n droppedId: string | null\n /** |watchlist ∩ E| at the session's first intersecting randomized call; 0 when never intersecting. */\n firstCandidateCount: number\n /** Randomized retrieval calls observed for this session. */\n callCount: number\n /** Adapter bypass calls observed for this session (logged, never randomized). */\n bypassCallCount: number\n /** Session-level probability of the OBSERVED assignment under the behavior policy. */\n behaviorProb: number\n /** True when the session's events disagree on arm or target (e.g. registry eviction re-draw). */\n mixedExposure: boolean\n /** Present only on sessions surfaced in `excluded` rather than converted. */\n exclusionReason?: 'mixed-exposure' | 'no-randomized-calls'\n}\n\nexport interface RetrievalHoldoutOffPolicyOptions {\n /**\n * Realized outcome PER SESSION, keyed by sessionIdHash — the session is the randomization\n * unit, so rewards are per session, never per call. A missing entry for an included session\n * throws: silently dropping unscored sessions would corrupt the estimator's denominator, so\n * filter events to scored sessions upstream instead.\n */\n rewards: Record<string, number>\n /**\n * Target-policy probability of the session's observed assignment. Default models the\n * always-deliver-in-full policy: 1 for full-delivery sessions, 0 for drop sessions.\n */\n targetProb?: (session: RetrievalHoldoutSessionSummary) => number\n /**\n * Reward-model prediction for the observed assignment. Supply this together\n * with `vHatTarget`; both estimates must come from evaluation data outside\n * this session.\n */\n qHatChosen?: (session: RetrievalHoldoutSessionSummary) => number | null\n /** Expected reward-model value under the target policy. */\n vHatTarget?: (session: RetrievalHoldoutSessionSummary) => number | null\n}\n\nexport interface RetrievalHoldoutOffPolicyResult {\n /** One trajectory per (configHash, sessionIdHash), never per call. */\n trajectories: OffPolicyTrajectory[]\n /** 1:1 with `trajectories` (same order): the diagnostic view of each converted session. */\n sessions: RetrievalHoldoutSessionSummary[]\n /** Sessions not converted because exposure was mixed or retrieval was bypassed. */\n excluded: RetrievalHoldoutSessionSummary[]\n /** Events with no sessionIdHash: outside session randomization, cannot join a reward. */\n unattributableEvents: number\n}\n\n/**\n * Maps retrieval-dropout events onto one `OffPolicyTrajectory` per session for use with\n * `inverseProbabilityWeighting`, `selfNormalizedImportanceWeighting`, or `doublyRobust`.\n * Randomization occurs once per session: the arm is selected with P(dropout) = epsilon and\n * the sticky target is drawn once,\n * uniformly over watchlist ∩ E at the session's first intersecting call.\n *\n * Session-level action space and behavior probabilities (they sum to 1 by construction):\n * - full delivery: `1 - epsilon`;\n * - drop candidate i of k = |watchlist ∩ E_first|: `epsilon / k` each (the draw event's logged\n * `dropPropensity`);\n * - sessions whose eligibility sets never intersect the watchlist: probability 1, because full\n * delivery was certain in either arm.\n *\n * Per-call events are repeated observations WITHIN one session-level randomization; per-call\n * IPW is statistically invalid for this design (per-call \"propensities\" imply an action\n * distribution summing to more than 1 and bias IPS downward). Calls where the sticky target is\n * absent from E, and adapter bypass calls, fold into the session summary (callCount /\n * bypassCallCount) instead of generating independent propensities.\n *\n * Join contract: `rewards` is keyed by `sessionIdHash` (sha256(sessionId) first 16 hex; compute\n * the same prefix over the outcome table's session ids, or log with\n * `includePlaintextIdentifiers: true` and join on raw ids upstream). Events are grouped per\n * (configHash, sessionIdHash) so different experiment configs are never pooled. Mixed-exposure\n * sessions (arm or target disagreement, e.g. after registry eviction) are excluded from the\n * trajectories and surfaced in `excluded` for analysis.\n */\nexport function toOffPolicyTrajectory(\n events: RetrievalHoldoutEvent[],\n options: RetrievalHoldoutOffPolicyOptions,\n): RetrievalHoldoutOffPolicyResult {\n if ((options.qHatChosen === undefined) !== (options.vHatTarget === undefined)) {\n throw new Error('qHatChosen and vHatTarget must be supplied together')\n }\n const groups = new Map<string, RetrievalHoldoutEvent[]>()\n let unattributableEvents = 0\n for (const event of events) {\n if (event.sessionIdHash === undefined) {\n unattributableEvents += 1\n continue\n }\n const key = `${event.configHash}:${event.sessionIdHash}`\n const group = groups.get(key)\n if (group) group.push(event)\n else groups.set(key, [event])\n }\n\n const trajectories: OffPolicyTrajectory[] = []\n const sessions: RetrievalHoldoutSessionSummary[] = []\n const excluded: RetrievalHoldoutSessionSummary[] = []\n\n for (const [runId, group] of groups) {\n const ordered = [...group].sort((a, b) => a.callIndex - b.callIndex || a.ts.localeCompare(b.ts))\n const randomized = ordered.filter((event) => event.holdoutEligible)\n const firstEvent = ordered[0]\n if (firstEvent?.sessionIdHash === undefined) continue\n const base = {\n runId,\n configHash: firstEvent.configHash,\n sessionIdHash: firstEvent.sessionIdHash,\n callCount: randomized.length,\n bypassCallCount: ordered.length - randomized.length,\n }\n const first = randomized[0]\n if (first === undefined) {\n excluded.push({\n ...base,\n sessionHoldout: false,\n sessionTargetId: null,\n droppedId: null,\n firstCandidateCount: 0,\n behaviorProb: 1,\n mixedExposure: false,\n exclusionReason: 'no-randomized-calls',\n })\n continue\n }\n\n const targets = new Set(\n randomized\n .map((event) => event.sessionTargetId)\n .filter((target): target is string => target !== null),\n )\n const arms = new Set(randomized.map((event) => event.sessionHoldout))\n const mixedExposure = targets.size > 1 || arms.size > 1\n const dropEvent = randomized.find((event) => event.droppedId !== null)\n const firstIntersecting = randomized.find((event) => event.watchlistEligible.length > 0)\n const sessionTargetId = dropEvent?.sessionTargetId ?? [...targets][0] ?? null\n\n let behaviorProb: number\n if (dropEvent !== undefined) {\n if (dropEvent.dropPropensity === null) {\n throw new Error(`holdout event ${dropEvent.eventId} recorded a drop without dropPropensity`)\n }\n // epsilon / |watchlist ∩ E_first|, logged at draw time.\n behaviorProb = dropEvent.dropPropensity\n } else if (!mixedExposure && sessionTargetId !== null) {\n // A drawn target implies its draw call dropped it, so a target with no drop event means\n // the batch is missing that session's calls. Weighting partial sessions biases the\n // estimate, so fail loud instead.\n throw new Error(\n `holdout session ${base.sessionIdHash} has a drawn target but no drop event: ` +\n 'the event batch is missing this session draw call',\n )\n } else if (firstIntersecting === undefined) {\n // No call could ever drop anything: full delivery was certain in either arm.\n behaviorProb = 1\n } else {\n // Control arm observed with a drop possible: the session-level assignment probability\n // is 1 − epsilon (NOT 1 − epsilon·pick, which is a per-item survival probability and\n // makes the implied action distribution sum past 1).\n behaviorProb = 1 - first.config.epsilon\n }\n\n const summary: RetrievalHoldoutSessionSummary = {\n ...base,\n sessionHoldout: first.sessionHoldout,\n sessionTargetId,\n droppedId: dropEvent?.droppedId ?? null,\n firstCandidateCount: firstIntersecting\n ? new Set(firstIntersecting.watchlistEligible).size\n : 0,\n behaviorProb,\n mixedExposure,\n ...(mixedExposure ? { exclusionReason: 'mixed-exposure' as const } : {}),\n }\n if (mixedExposure) {\n excluded.push(summary)\n continue\n }\n\n const reward = options.rewards[summary.sessionIdHash]\n if (reward === undefined) {\n throw new Error(\n `no reward for session ${summary.sessionIdHash}: ` +\n 'filter events to scored sessions before converting',\n )\n }\n const qHatChosen = options.qHatChosen?.(summary)\n const vHatTarget = options.vHatTarget?.(summary)\n trajectories.push({\n runId,\n reward,\n behaviorProb,\n targetProb: options.targetProb?.(summary) ?? (summary.droppedId === null ? 1 : 0),\n ...(options.qHatChosen === undefined ? {} : { qHatChosen: qHatChosen ?? null }),\n ...(options.vHatTarget === undefined ? {} : { vHatTarget: vHatTarget ?? null }),\n })\n sessions.push(summary)\n }\n\n return { trajectories, sessions, excluded, unattributableEvents }\n}\n","import { applySessionStickyRetrievalHoldout } from './holdout'\nimport { memoryHitToSourceRecord } from './source-record'\nimport type {\n AgentMemoryAdapter,\n AgentMemoryContext,\n AgentMemoryHit,\n AgentMemorySearchOptions,\n} from './types'\n\nexport async function defaultGetMemoryContext(\n adapter: Pick<AgentMemoryAdapter, 'search'>,\n query: string,\n options: AgentMemorySearchOptions = {},\n): Promise<AgentMemoryContext> {\n const hits = await adapter.search(query, options)\n // The holdout applies between search (eligibility set) and render (delivered set), and only\n // when explicitly configured: the unconfigured path must stay byte-identical, including\n // hit-array identity, so default behavior cannot drift.\n const delivered = options.holdout\n ? applySessionStickyRetrievalHoldout(hits, options.holdout, {\n query,\n ...(options.scope !== undefined ? { scope: options.scope } : {}),\n ...(options.scope?.tags?.taskId !== undefined ? { taskId: options.scope.tags.taskId } : {}),\n }).delivered\n : hits\n return {\n query,\n hits: delivered,\n sourceRecords: delivered.map((hit) => memoryHitToSourceRecord(hit, { scope: options.scope })),\n text: renderMemoryContext(delivered),\n }\n}\n\nexport function renderMemoryContext(hits: AgentMemoryHit[]): string {\n return hits\n .map((hit, index) => {\n const label = hit.title ?? `${hit.kind}:${hit.id}`\n const score =\n typeof hit.normalizedScore === 'number' ? ` score=${hit.normalizedScore.toFixed(3)}` : ''\n return [`[${index + 1}] ${label}${score}`, hit.text].join('\\n')\n })\n .join('\\n\\n')\n}\n","import { canonicalJson } from '@tangle-network/agent-eval'\nimport { sha256, stableId } from '../ids'\nimport { defaultGetMemoryContext } from './adapter'\nimport { mergeRankedMemoryHits } from './rank'\nimport type {\n AgentMemoryAdapter,\n AgentMemoryScope,\n AgentMemoryWriteInput,\n AgentMemoryWriteResult,\n} from './types'\n\nexport type AgentMemoryVisibility = 'private' | 'team' | 'shared'\nexport type AgentMemoryBranchLifetime = 'resumable' | 'attempt'\n\nexport interface AgentMemorySharingPolicy {\n read: readonly AgentMemoryVisibility[]\n write: AgentMemoryVisibility\n}\n\nexport interface AgentMemoryJournalEntry {\n sequence: number\n input: AgentMemoryWriteInput\n result: AgentMemoryWriteResult\n}\n\nexport interface AgentMemoryBranchSnapshot {\n branchId: string\n lifetime: AgentMemoryBranchLifetime\n parentBranchId?: string\n adapterId: string\n policy: AgentMemorySharingPolicy\n baseScope: AgentMemoryScope\n journal: readonly AgentMemoryJournalEntry[]\n digest: `sha256:${string}`\n}\n\nexport interface AgentMemoryBranch extends AgentMemoryAdapter {\n readonly branchId: string\n readonly lifetime: AgentMemoryBranchLifetime\n readonly parentBranchId?: string\n readonly policy: AgentMemorySharingPolicy\n snapshot(): Promise<AgentMemoryBranchSnapshot>\n fork(options: {\n branchId: string\n adapter?: AgentMemoryAdapter\n policy?: AgentMemorySharingPolicy\n baseScope?: AgentMemoryScope\n lifetime?: AgentMemoryBranchLifetime\n }): Promise<AgentMemoryBranch>\n}\n\nexport interface CreateAgentMemoryBranchOptions {\n adapter: AgentMemoryAdapter\n branchId: string\n parentBranchId?: string\n policy?: AgentMemorySharingPolicy\n baseScope?: AgentMemoryScope\n /** Attempt branches use a new ID after a process restart and cannot bind persisted state. */\n lifetime?: AgentMemoryBranchLifetime\n /** Rebind a persisted branch whose external memory is still present. */\n snapshot?: AgentMemoryBranchSnapshot\n /** Optional exact logical scopes allowed to write, used by crash-safe experiments. */\n allowedWriteScopes?: readonly AgentMemoryScope[]\n}\n\nexport interface ForkAgentMemoryBranchSnapshotOptions {\n snapshot: AgentMemoryBranchSnapshot\n adapter: AgentMemoryAdapter\n branchId: string\n policy?: AgentMemorySharingPolicy\n baseScope?: AgentMemoryScope\n lifetime?: AgentMemoryBranchLifetime\n}\n\nconst DEFAULT_POLICY: AgentMemorySharingPolicy = {\n read: ['private'],\n write: 'private',\n}\n\ninterface AdapterLeaseState {\n references: number\n closed: boolean\n activeBranchIds: Set<string>\n closePromise?: Promise<void>\n}\n\nconst adapterLeases = new WeakMap<AgentMemoryAdapter, AdapterLeaseState>()\n\n/**\n * Isolates one candidate branch and records accepted writes for durable resume\n * or replay into a child branch, including a child backed by another provider.\n */\nexport function createAgentMemoryBranch(\n options: CreateAgentMemoryBranchOptions,\n): AgentMemoryBranch {\n if (typeof options.branchId !== 'string' || !options.branchId.trim()) {\n throw new Error('memory branchId must be a non-empty string')\n }\n const snapshot = options.snapshot\n if (snapshot && snapshot.branchId !== options.branchId) {\n throw new Error(\n `memory branch snapshot belongs to ${snapshot.branchId}, not ${options.branchId}`,\n )\n }\n if (snapshot && snapshot.adapterId !== options.adapter.id) {\n throw new Error(\n `memory branch snapshot uses ${snapshot.adapterId}, not ${options.adapter.id}; fork it to replay into another adapter`,\n )\n }\n if (snapshot?.lifetime === 'attempt') {\n throw new Error(\n 'memory branch attempt snapshots cannot be resumed; replay them into a fresh branch instead',\n )\n }\n if (options.lifetime !== undefined && !['resumable', 'attempt'].includes(options.lifetime)) {\n throw new Error('memory branch lifetime must be resumable or attempt')\n }\n if (snapshot) {\n assertDurableValue(snapshot, `${options.branchId}: branch snapshot`)\n assertSnapshotDigest(snapshot)\n }\n if (\n snapshot &&\n options.policy &&\n canonicalJson(stripUndefined(options.policy)) !== canonicalJson(stripUndefined(snapshot.policy))\n ) {\n throw new Error('memory branch snapshot policy cannot change during resume; fork it instead')\n }\n if (\n snapshot &&\n options.baseScope &&\n canonicalJson(stripUndefined(options.baseScope)) !==\n canonicalJson(stripUndefined(snapshot.baseScope))\n ) {\n throw new Error('memory branch snapshot scope cannot change during resume; fork it instead')\n }\n if (snapshot && options.lifetime && options.lifetime !== snapshot.lifetime) {\n throw new Error('memory branch snapshot lifetime cannot change during resume; fork it instead')\n }\n\n const branchId = options.branchId\n const parentBranchId = options.parentBranchId ?? snapshot?.parentBranchId\n const lifetime = options.lifetime ?? snapshot?.lifetime ?? 'resumable'\n const policy = normalizePolicy(options.policy ?? snapshot?.policy ?? DEFAULT_POLICY)\n assertBranchIsolation(options.adapter, branchId, policy, lifetime)\n const mergedBaseScope = mergeScopes(undefined, snapshot?.baseScope ?? options.baseScope)\n assertDurableValue(mergedBaseScope, `${branchId}: base scope`)\n const baseScope = cloneDurableValue(mergedBaseScope)\n const allowedWriteScopeKeys = options.allowedWriteScopes\n ? new Set(\n options.allowedWriteScopes.map((scope) =>\n canonicalJson(stripUndefined(mergeScopes(baseScope, scope))),\n ),\n )\n : undefined\n const journal = [...(snapshot?.journal ?? [])].map(cloneJournalEntry)\n let nextSequence = journal.reduce((max, entry) => Math.max(max, entry.sequence + 1), 0)\n const queues = new Map<string, Promise<void>>()\n const pending = new Set<Promise<unknown>>()\n const reads = new Set<Promise<unknown>>()\n const active = new Set<Promise<unknown>>()\n const touchedScopes = new Map<string, AgentMemoryScope>()\n for (const entry of journal) {\n const scope = mergeScopes(baseScope, entry.input.scope)\n touchedScopes.set(canonicalJson(stripUndefined(scope)), scope)\n }\n let mutationBarrier = Promise.resolve()\n const releaseAdapter = retainAdapter(options.adapter, branchId)\n let lifecycle: 'open' | 'closing' | 'closed' = 'open'\n let closePromise: Promise<void> | undefined\n\n const assertOpen = (operation: string): void => {\n if (lifecycle !== 'open') throw new Error(`${branchId}: cannot ${operation} a closed branch`)\n }\n const track = <T>(operation: Promise<T>): Promise<T> => {\n active.add(operation)\n void operation.then(\n () => active.delete(operation),\n () => active.delete(operation),\n )\n return operation\n }\n const trackRead = <T>(operation: Promise<T>): Promise<T> => {\n reads.add(operation)\n void operation.then(\n () => reads.delete(operation),\n () => reads.delete(operation),\n )\n return track(operation)\n }\n const flushWrites = async (): Promise<void> => {\n const results = await Promise.allSettled([...pending])\n const failures = results.flatMap((result) =>\n result.status === 'rejected' ? [result.reason] : [],\n )\n if (failures.length === 1) throw failures[0]\n if (failures.length > 1) {\n throw new AggregateError(failures, `${branchId}: pending memory writes failed`)\n }\n }\n const flushAll = async (): Promise<void> => {\n await flushWrites()\n await options.adapter.flush?.()\n }\n const runExclusive = async <T>(\n operation: () => Promise<T>,\n exclusiveOptions: { failOnOperationError?: boolean; flushAdapter?: boolean } = {},\n ): Promise<T> => {\n const precedingBarrier = mutationBarrier\n const precedingWrites = [...pending]\n const precedingReads = [...reads]\n let releaseBarrier!: () => void\n const ownBarrier = new Promise<void>((resolve) => {\n releaseBarrier = resolve\n })\n mutationBarrier = precedingBarrier.then(() => ownBarrier)\n await precedingBarrier\n const settled = await Promise.allSettled([...precedingWrites, ...precedingReads])\n const failures = settled.flatMap((result) =>\n result.status === 'rejected' ? [result.reason] : [],\n )\n try {\n if ((exclusiveOptions.failOnOperationError ?? true) && failures.length > 0) {\n if (failures.length === 1) throw failures[0]\n throw new AggregateError(failures, `${branchId}: pending memory operations failed`)\n }\n if (exclusiveOptions.flushAdapter ?? true) await options.adapter.flush?.()\n return await operation()\n } finally {\n releaseBarrier()\n }\n }\n\n const branch: AgentMemoryBranch = {\n id: `${options.adapter.id}:branch:${stableId('branch', branchId)}`,\n branchId,\n lifetime,\n ...(parentBranchId !== undefined ? { parentBranchId } : {}),\n policy,\n async search(query, searchOptions = {}) {\n assertOpen('search')\n const precedingBarrier = mutationBarrier\n return trackRead(\n (async () => {\n await precedingBarrier\n const logicalScope = mergeScopes(baseScope, searchOptions.scope)\n const scopes = policy.read.map((visibility) =>\n physicalScope(branchId, logicalScope, visibility),\n )\n const groups = await Promise.all(\n scopes.map(async (scope) => {\n const hits = await options.adapter.search(query, {\n ...searchOptions,\n scope,\n holdout: undefined,\n })\n return hits.map((hit) => ({\n ...hit,\n metadata: {\n ...hit.metadata,\n memoryBranchId: branchId,\n memoryVisibility: scope.tags?.memoryVisibility,\n },\n }))\n }),\n )\n return mergeRankedMemoryHits(groups, searchOptions.limit)\n })(),\n )\n },\n async getContext(query, searchOptions = {}) {\n assertOpen('read context from')\n return track(defaultGetMemoryContext(branch, query, searchOptions))\n },\n async write(input) {\n assertOpen('write to')\n const sequence = nextSequence\n nextSequence += 1\n assertDurableValue(input, `${branch.id}: write input`)\n const logicalInput = cloneWriteInput(input)\n logicalInput.id ??= stableId('memory_write', `${branchId}:${sequence}`)\n const logicalScope = mergeScopes(baseScope, logicalInput.scope)\n if (\n allowedWriteScopeKeys &&\n !allowedWriteScopeKeys.has(canonicalJson(stripUndefined(logicalScope)))\n ) {\n throw new Error(\n `${branch.id}: write scope was not declared in the experiment sequence cleanupScopes`,\n )\n }\n const scope = physicalScope(branchId, logicalScope, policy.write)\n const queueKey = writeQueueKey(branchId, logicalScope, policy.write)\n touchedScopes.set(canonicalJson(stripUndefined(logicalScope)), logicalScope)\n const previous = queues.get(queueKey) ?? Promise.resolve()\n const precedingBarrier = mutationBarrier\n let resultPromise: Promise<AgentMemoryWriteResult>\n const queued = Promise.all([previous.catch(() => undefined), precedingBarrier]).then(\n async () => {\n const result = await options.adapter.write({ ...logicalInput, scope })\n if (result.accepted) {\n assertDurableValue(result, `${branch.id}: write result`)\n journal.push({\n sequence,\n input: logicalInput,\n result: cloneWriteResult(result),\n })\n }\n return result\n },\n )\n resultPromise = queued\n const tail = queued.then(\n () => undefined,\n () => undefined,\n )\n queues.set(queueKey, tail)\n pending.add(resultPromise)\n void resultPromise.then(\n () => {\n pending.delete(resultPromise)\n if (queues.get(queueKey) === tail) queues.delete(queueKey)\n },\n () => {\n pending.delete(resultPromise)\n if (queues.get(queueKey) === tail) queues.delete(queueKey)\n },\n )\n return track(resultPromise)\n },\n async clear(scope) {\n assertOpen('clear')\n return track(\n runExclusive(\n async () => {\n if (!options.adapter.clear) {\n throw new Error(`${options.adapter.id}: adapter does not support scoped clear`)\n }\n const flushErrors: unknown[] = []\n try {\n await options.adapter.flush?.()\n } catch (error) {\n flushErrors.push(error)\n }\n const requestedScope = scope ? mergeScopes(baseScope, scope) : undefined\n const logicalScopes = new Map<string, AgentMemoryScope>()\n if (requestedScope) {\n logicalScopes.set(canonicalJson(stripUndefined(requestedScope)), requestedScope)\n for (const touched of touchedScopes.values()) {\n if (scopeMatches(touched, requestedScope)) {\n logicalScopes.set(canonicalJson(stripUndefined(touched)), touched)\n }\n }\n } else if (touchedScopes.size > 0) {\n for (const [key, touched] of touchedScopes) logicalScopes.set(key, touched)\n } else {\n logicalScopes.set(canonicalJson(stripUndefined(baseScope)), baseScope)\n }\n const visibilities = new Set([...policy.read, policy.write])\n const physicalScopes = new Map<string, AgentMemoryScope>()\n for (const logicalScope of logicalScopes.values()) {\n for (const visibility of visibilities) {\n const physical = physicalScope(branchId, logicalScope, visibility)\n physicalScopes.set(canonicalJson(stripUndefined(physical)), physical)\n }\n }\n const clearErrors: unknown[] = []\n const clearedPhysicalScopes = new Set<string>()\n for (const [key, physical] of physicalScopes) {\n try {\n await options.adapter.clear(physical)\n clearedPhysicalScopes.add(key)\n } catch (error) {\n clearErrors.push(error)\n }\n }\n if (clearedPhysicalScopes.size > 0) {\n for (let index = journal.length - 1; index >= 0; index -= 1) {\n const logical = mergeScopes(baseScope, journal[index]!.input.scope)\n const physical = physicalScope(branchId, logical, policy.write)\n if (clearedPhysicalScopes.has(canonicalJson(stripUndefined(physical)))) {\n journal.splice(index, 1)\n }\n }\n for (const [key, touched] of touchedScopes) {\n const physical = physicalScope(branchId, touched, policy.write)\n if (clearedPhysicalScopes.has(canonicalJson(stripUndefined(physical)))) {\n touchedScopes.delete(key)\n }\n }\n }\n const failures = [...flushErrors, ...clearErrors]\n if (failures.length === 1) throw failures[0]\n if (failures.length > 1) {\n throw new AggregateError(failures, `${branchId}: memory clear failed`)\n }\n },\n { failOnOperationError: false, flushAdapter: false },\n ),\n )\n },\n async flush() {\n assertOpen('flush')\n return track(runExclusive(async () => undefined))\n },\n close() {\n if (closePromise) return closePromise\n lifecycle = 'closing'\n closePromise = (async () => {\n const errors: unknown[] = []\n const operations = await Promise.allSettled([...active])\n for (const result of operations) {\n if (result.status === 'rejected') errors.push(result.reason)\n }\n try {\n await flushAll()\n } catch (error) {\n errors.push(error)\n }\n try {\n await releaseAdapter()\n } catch (error) {\n errors.push(error)\n }\n lifecycle = 'closed'\n if (errors.length === 1) throw errors[0]\n if (errors.length > 1) throw new AggregateError(errors, `${branch.id}: close failed`)\n })()\n return closePromise\n },\n async snapshot() {\n assertOpen('snapshot')\n return track(\n runExclusive(async () => {\n return createSnapshot({\n branchId,\n lifetime,\n adapterId: options.adapter.id,\n policy,\n baseScope,\n journal,\n ...(parentBranchId !== undefined ? { parentBranchId } : {}),\n })\n }),\n )\n },\n async fork(forkOptions) {\n assertOpen('fork')\n if (forkOptions.branchId === branchId) {\n throw new Error(`memory branch ${branchId}: child branchId must differ from its parent`)\n }\n return track(\n (async () =>\n forkAgentMemoryBranchSnapshot({\n snapshot: await branch.snapshot(),\n adapter: forkOptions.adapter ?? options.adapter,\n branchId: forkOptions.branchId,\n policy: forkOptions.policy,\n baseScope: forkOptions.baseScope,\n lifetime: forkOptions.lifetime,\n }))(),\n )\n },\n }\n return branch\n}\n\n/** Replays a durable journal into a fresh provider branch. */\nexport async function forkAgentMemoryBranchSnapshot(\n options: ForkAgentMemoryBranchSnapshotOptions,\n): Promise<AgentMemoryBranch> {\n assertDurableValue(options.snapshot, `${options.snapshot.branchId}: branch snapshot`)\n assertSnapshotDigest(options.snapshot)\n if (options.branchId === options.snapshot.branchId) {\n throw new Error(`memory branch ${options.branchId}: child branchId must differ from its parent`)\n }\n const child = createAgentMemoryBranch({\n adapter: options.adapter,\n branchId: options.branchId,\n parentBranchId: options.snapshot.branchId,\n policy: options.policy ?? options.snapshot.policy,\n baseScope: mergeScopes(options.snapshot.baseScope, options.baseScope),\n lifetime: options.lifetime ?? options.snapshot.lifetime,\n })\n try {\n for (const entry of options.snapshot.journal) {\n const result = await child.write(entry.input)\n if (!result.accepted) {\n throw new Error(\n `memory branch ${options.branchId}: adapter rejected replay of journal entry ${entry.sequence}`,\n )\n }\n }\n await child.flush?.()\n return child\n } catch (error) {\n const cleanupErrors: unknown[] = []\n try {\n await child.clear?.()\n } catch (cleanupError) {\n cleanupErrors.push(cleanupError)\n }\n try {\n await child.close?.()\n } catch (cleanupError) {\n cleanupErrors.push(cleanupError)\n }\n if (cleanupErrors.length > 0) {\n throw new AggregateError(\n [error, ...cleanupErrors],\n `memory branch ${options.branchId}: replay and cleanup failed`,\n )\n }\n throw error\n }\n}\n\nfunction assertBranchIsolation(\n adapter: AgentMemoryAdapter,\n branchId: string,\n policy: AgentMemorySharingPolicy,\n lifetime: AgentMemoryBranchLifetime,\n): void {\n const isolation = adapter.branchIsolation\n if (!isolation) {\n throw new Error(\n `${adapter.id}: cannot isolate memory branch '${branchId}': adapter must declare branchIsolation`,\n )\n }\n if (isolation.mode === 'unsupported') {\n throw new Error(\n `${adapter.id}: cannot isolate memory branch '${branchId}': ${isolation.reason}`,\n )\n }\n if (\n isolation.mode === 'scoped' &&\n isolation.processExitSafe === false &&\n lifetime !== 'attempt'\n ) {\n throw new Error(\n `${adapter.id}: memory branch '${branchId}' must use lifetime='attempt' because provider writes can outlive the worker process`,\n )\n }\n if (\n isolation.mode === 'scoped' &&\n isolation.processExitSafe === false &&\n (!Number.isSafeInteger(isolation.recoveryDelayMs) || isolation.recoveryDelayMs! <= 0)\n ) {\n throw new Error(`${adapter.id}: processExitSafe=false requires a positive recoveryDelayMs`)\n }\n if (isolation.mode === 'instance' && isolation.branchId !== branchId) {\n throw new Error(\n `${adapter.id}: adapter instance belongs to branch '${isolation.branchId}', not '${branchId}'`,\n )\n }\n if (\n isolation.mode === 'instance' &&\n isolation.supportsLogicalScopes !== true &&\n (policy.write !== 'shared' || policy.read.length !== 1 || policy.read[0] !== 'shared')\n ) {\n throw new Error(\n `${adapter.id}: dedicated branch instances without logical scope isolation support only shared memory policy`,\n )\n }\n}\n\nfunction retainAdapter(adapter: AgentMemoryAdapter, branchId: string): () => Promise<void> {\n const existing = adapterLeases.get(adapter)\n if (existing?.closed) throw new Error(`${adapter.id}: adapter is already closed`)\n const state = existing ?? { references: 0, closed: false, activeBranchIds: new Set<string>() }\n if (state.activeBranchIds.has(branchId)) {\n throw new Error(`${adapter.id}: memory branch '${branchId}' already has an open handle`)\n }\n state.activeBranchIds.add(branchId)\n state.references += 1\n adapterLeases.set(adapter, state)\n let released = false\n return async () => {\n if (released) return\n released = true\n state.activeBranchIds.delete(branchId)\n state.references -= 1\n if (state.references > 0) return\n if (!adapter.close) {\n adapterLeases.delete(adapter)\n return\n }\n state.closed = true\n state.closePromise ??= adapter.close()\n await state.closePromise\n }\n}\n\nfunction physicalScope(\n branchId: string,\n logical: AgentMemoryScope,\n visibility: AgentMemoryVisibility,\n): AgentMemoryScope {\n if (visibility === 'private' && !logical.agentId) {\n throw new Error('private memory requires scope.agentId')\n }\n if (visibility === 'team' && !logical.teamId) {\n throw new Error('team memory requires scope.teamId')\n }\n const principal =\n visibility === 'private' ? logical.agentId! : visibility === 'team' ? logical.teamId! : 'all'\n const namespace = [\n logical.namespace ?? 'default',\n stableId('branch', branchId),\n visibility,\n stableId('principal', principal),\n ].join('/')\n const physical: AgentMemoryScope = {\n ...logical,\n namespace,\n tags: {\n ...(logical.tags ?? {}),\n memoryBranchId: branchId,\n memoryVisibility: visibility,\n logicalNamespace: logical.namespace ?? 'default',\n },\n }\n if (visibility === 'shared') {\n delete physical.agentId\n delete physical.teamId\n } else if (visibility === 'team') {\n delete physical.agentId\n }\n return physical\n}\n\nfunction writeQueueKey(\n branchId: string,\n logical: AgentMemoryScope,\n visibility: AgentMemoryVisibility,\n): string {\n return canonicalJson(\n stripUndefined({\n branchId,\n visibility,\n tenantId: logical.tenantId,\n userId: logical.userId,\n agentId: logical.agentId,\n fallbackTeamId: logical.agentId === undefined ? logical.teamId : undefined,\n fallbackPrincipal:\n logical.agentId === undefined && logical.teamId === undefined ? 'unattributed' : undefined,\n }),\n )\n}\n\nfunction normalizePolicy(policy: AgentMemorySharingPolicy): AgentMemorySharingPolicy {\n const allowed = new Set<AgentMemoryVisibility>(['private', 'team', 'shared'])\n if (!allowed.has(policy.write) || policy.read.some((visibility) => !allowed.has(visibility))) {\n throw new Error('memory sharing policy contains an unsupported visibility')\n }\n const read = [...new Set(policy.read)]\n if (read.length === 0) throw new Error('memory sharing policy must read at least one visibility')\n return { read, write: policy.write }\n}\n\nfunction createSnapshot(\n input: Omit<AgentMemoryBranchSnapshot, 'digest'>,\n): AgentMemoryBranchSnapshot {\n const payload = cloneDurableValue({\n ...input,\n journal: [...input.journal].sort((a, b) => a.sequence - b.sequence),\n })\n assertDurableValue(payload, `${input.branchId}: branch snapshot`)\n return {\n ...payload,\n digest: `sha256:${sha256(canonicalJson(stripUndefined(payload)))}`,\n }\n}\n\nfunction assertSnapshotDigest(snapshot: AgentMemoryBranchSnapshot): void {\n const { digest, ...payload } = snapshot\n const actual = `sha256:${sha256(canonicalJson(stripUndefined(payload)))}`\n if (actual !== digest)\n throw new Error(`memory branch snapshot digest mismatch: ${digest} != ${actual}`)\n}\n\nfunction mergeScopes(base?: AgentMemoryScope, extra?: AgentMemoryScope): AgentMemoryScope {\n return {\n ...(base ?? {}),\n ...(extra ?? {}),\n tags: { ...(base?.tags ?? {}), ...(extra?.tags ?? {}) },\n }\n}\n\nfunction scopeMatches(actual: AgentMemoryScope, requested: AgentMemoryScope): boolean {\n for (const key of [\n 'tenantId',\n 'userId',\n 'agentId',\n 'teamId',\n 'runId',\n 'sessionId',\n 'namespace',\n ] as const) {\n if (requested[key] !== undefined && actual[key] !== requested[key]) return false\n }\n for (const [key, value] of Object.entries(requested.tags ?? {})) {\n if (actual.tags?.[key] !== value) return false\n }\n return true\n}\n\nfunction stripUndefined(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(stripUndefined)\n if (typeof value !== 'object' || value === null) return value\n return Object.fromEntries(\n Object.entries(value)\n .filter(([, child]) => child !== undefined)\n .map(([key, child]) => [key, stripUndefined(child)]),\n )\n}\n\nfunction cloneWriteInput(input: AgentMemoryWriteInput): AgentMemoryWriteInput {\n return cloneDurableValue(input)\n}\n\nfunction cloneWriteResult(result: AgentMemoryWriteResult): AgentMemoryWriteResult {\n return cloneDurableValue(result)\n}\n\nfunction cloneJournalEntry(entry: AgentMemoryJournalEntry): AgentMemoryJournalEntry {\n return {\n sequence: entry.sequence,\n input: cloneWriteInput(entry.input),\n result: cloneWriteResult(entry.result),\n }\n}\n\nfunction assertDurableValue(value: unknown, label: string, seen = new WeakSet<object>()): void {\n if (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'boolean' ||\n (typeof value === 'number' && Number.isFinite(value))\n ) {\n return\n }\n if (value === undefined) return\n if (typeof value !== 'object') {\n throw new Error(`${label} must contain only JSON-compatible values`)\n }\n if (seen.has(value)) throw new Error(`${label} must not contain cycles`)\n seen.add(value)\n if (Array.isArray(value)) {\n for (const child of value) {\n if (child === undefined) {\n throw new Error(`${label} arrays must not contain undefined values`)\n }\n assertDurableValue(child, label, seen)\n }\n } else {\n const prototype = Object.getPrototypeOf(value)\n if (prototype !== Object.prototype && prototype !== null) {\n throw new Error(`${label} must contain only plain objects`)\n }\n for (const child of Object.values(value)) assertDurableValue(child, label, seen)\n }\n seen.delete(value)\n}\n\nfunction cloneDurableValue<T>(value: T): T {\n if (Array.isArray(value)) return value.map((child) => cloneDurableValue(child)) as T\n if (typeof value !== 'object' || value === null) return value\n return Object.fromEntries(\n Object.entries(value).map(([key, child]) => [key, cloneDurableValue(child)]),\n ) as T\n}\n","import type { AgentMemoryHit } from './types'\n\n/** Merges independently ranked memory lists without letting the first unscored list dominate. */\nexport function mergeRankedMemoryHits(\n groups: readonly (readonly AgentMemoryHit[])[],\n limit?: number,\n): AgentMemoryHit[] {\n const byIdentity = new Map<\n string,\n {\n hit: AgentMemoryHit\n score?: number\n reciprocalRank: number\n bestRank: number\n firstGroup: number\n encounter: number\n }\n >()\n let encounter = 0\n for (const [groupIndex, group] of groups.entries()) {\n for (const [rank, hit] of group.entries()) {\n const key = JSON.stringify([hit.uri, hit.text])\n const score = memoryHitScore(hit)\n const prior = byIdentity.get(key)\n if (!prior) {\n byIdentity.set(key, {\n hit,\n score,\n reciprocalRank: 1 / (60 + rank + 1),\n bestRank: rank,\n firstGroup: groupIndex,\n encounter,\n })\n } else {\n prior.reciprocalRank += 1 / (60 + rank + 1)\n prior.bestRank = Math.min(prior.bestRank, rank)\n if (score !== undefined && (prior.score === undefined || score > prior.score)) {\n prior.hit = hit\n prior.score = score\n }\n }\n encounter += 1\n }\n }\n return [...byIdentity.values()]\n .sort(\n (left, right) =>\n right.reciprocalRank - left.reciprocalRank ||\n Number(right.score !== undefined) - Number(left.score !== undefined) ||\n (right.score ?? 0) - (left.score ?? 0) ||\n left.bestRank - right.bestRank ||\n left.firstGroup - right.firstGroup ||\n left.encounter - right.encounter,\n )\n .map(({ hit }) => hit)\n .slice(0, limit ?? Number.POSITIVE_INFINITY)\n}\n\nfunction memoryHitScore(hit: AgentMemoryHit): number | undefined {\n const score = hit.normalizedScore ?? hit.score\n return score !== undefined && Number.isFinite(score) ? score : undefined\n}\n","import type { KnowledgeMemoryFactMatcher } from '../../benchmarks/index'\nimport type { AgentMemoryScope } from '../types'\nimport type { AgentMemorySequence } from './types'\n\nexport function assertMemorySequences(sequences: readonly AgentMemorySequence[]): void {\n for (const sequence of sequences) {\n assertNonEmptyString(sequence.family, `memory experiment sequence ${sequence.id} family`)\n if (sequence.steps.length === 0) {\n throw new Error(`memory experiment sequence ${sequence.id} has no steps`)\n }\n assertUnique(\n sequence.steps.map((step) => step.id),\n `step in sequence ${sequence.id}`,\n )\n let probeCount = 0\n for (const step of sequence.steps) {\n for (const write of step.writes ?? []) {\n assertNonEmptyString(write.text, `memory experiment write in ${sequence.id}/${step.id}`)\n if (write.id !== undefined) {\n assertNonEmptyString(write.id, `memory experiment write id in ${sequence.id}/${step.id}`)\n }\n }\n assertUnique(\n (step.probes ?? []).map((probe) => probe.id),\n `probe in sequence ${sequence.id} step ${step.id}`,\n )\n for (const probe of step.probes ?? []) {\n probeCount += 1\n assertNonEmptyString(\n probe.query,\n `memory experiment probe query ${sequence.id}/${step.id}/${probe.id}`,\n )\n if (probe.limit !== undefined && (!Number.isSafeInteger(probe.limit) || probe.limit <= 0)) {\n throw new Error(\n `memory experiment probe limit ${sequence.id}/${step.id}/${probe.id} must be a positive safe integer`,\n )\n }\n assertMemoryFactMatchers(\n probe.requiredFacts ?? [],\n `${sequence.id}/${step.id}/${probe.id} requiredFacts`,\n )\n assertMemoryFactMatchers(\n probe.forbiddenFacts ?? [],\n `${sequence.id}/${step.id}/${probe.id} forbiddenFacts`,\n )\n assertStringList(probe.expectedEventIds, `${sequence.id}/${step.id}/${probe.id} event ids`)\n assertStringList(probe.expectedActorIds, `${sequence.id}/${step.id}/${probe.id} actor ids`)\n if (probe.referenceAnswer !== undefined) {\n assertNonEmptyString(\n probe.referenceAnswer,\n `memory experiment reference answer ${sequence.id}/${step.id}/${probe.id}`,\n )\n }\n const hasTarget =\n (probe.requiredFacts?.length ?? 0) > 0 ||\n (probe.forbiddenFacts?.length ?? 0) > 0 ||\n (probe.expectedEventIds?.length ?? 0) > 0 ||\n (probe.expectedActorIds?.length ?? 0) > 0 ||\n Boolean(probe.referenceAnswer?.trim())\n if (!hasTarget) {\n throw new Error(\n `memory experiment probe ${sequence.id}/${step.id}/${probe.id} has no measurable target`,\n )\n }\n }\n }\n if (probeCount === 0) {\n throw new Error(`memory experiment sequence ${sequence.id} has no probes`)\n }\n }\n}\n\nexport function normalizeCleanupScope(scope: AgentMemoryScope): AgentMemoryScope {\n const normalized = compactScope(scope)\n if (normalized.tags && Object.keys(normalized.tags).length === 0) {\n delete normalized.tags\n }\n return normalized\n}\n\nexport function compactScope(scope: AgentMemoryScope): AgentMemoryScope {\n return Object.fromEntries(\n Object.entries(scope).filter(([, value]) => value !== undefined),\n ) as AgentMemoryScope\n}\n\nexport function compactRecord(record: Record<string, unknown>): Record<string, unknown> {\n return Object.fromEntries(Object.entries(record).filter(([, value]) => value !== undefined))\n}\n\nexport function uniqueStrings(values: readonly unknown[]): string[] {\n return [...new Set(values.filter((value): value is string => typeof value === 'string'))]\n}\n\nexport function stringArray(value: unknown): string[] {\n return Array.isArray(value)\n ? value.filter((entry): entry is string => typeof entry === 'string')\n : []\n}\n\nexport function assertUnique(values: readonly string[], label: string): void {\n const seen = new Set<string>()\n for (const value of values) {\n assertNonEmptyString(value, `memory experiment ${label} id`)\n if (seen.has(value)) throw new Error(`duplicate memory experiment ${label} id: ${value}`)\n seen.add(value)\n }\n}\n\nfunction assertMemoryFactMatchers(\n matchers: readonly KnowledgeMemoryFactMatcher[],\n label: string,\n): void {\n assertUnique(\n matchers.map((matcher) => matcher.id),\n `${label} matcher`,\n )\n for (const matcher of matchers) {\n if (matcher.anyOf.length === 0) {\n throw new Error(`memory experiment ${label} matcher ${matcher.id} requires anyOf`)\n }\n assertStringList(matcher.anyOf, `${label} matcher ${matcher.id} anyOf`)\n assertStringList(matcher.sourceEventIds, `${label} matcher ${matcher.id} source event ids`)\n if (matcher.weight !== undefined && (!Number.isFinite(matcher.weight) || matcher.weight <= 0)) {\n throw new Error(\n `memory experiment ${label} matcher ${matcher.id} weight must be a positive finite number`,\n )\n }\n }\n}\n\nfunction assertStringList(values: readonly string[] | undefined, label: string): void {\n if (values === undefined) return\n assertUnique(values, label)\n}\n\nexport function assertNonEmptyString(value: unknown, label: string): asserts value is string {\n if (typeof value !== 'string' || value.trim().length === 0) {\n throw new Error(`${label} must be a non-empty string`)\n }\n}\n","/** Converts existing ordered memory benchmark cases into executable histories. */\nimport type { JudgeConfig, Scenario } from '@tangle-network/agent-eval/campaign'\nimport type { KnowledgeMemoryBenchmarkCase } from '../../benchmarks/index'\nimport { stableId } from '../../ids'\nimport type {\n AgentMemoryExperimentCandidate,\n AgentMemorySequence,\n AgentMemorySequenceArtifact,\n AgentMemorySequenceScenario,\n BuildAgentMemorySequencesFromBenchmarkCasesOptions,\n} from './types'\nimport { compactRecord, compactScope } from './validation'\n\nexport function buildAgentMemorySequencesFromBenchmarkCases(\n cases: readonly KnowledgeMemoryBenchmarkCase[],\n options: BuildAgentMemorySequencesFromBenchmarkCasesOptions = {},\n): AgentMemorySequence[] {\n const memoryAgentId = options.memoryAgentId ?? 'benchmark-agent'\n return cases.map((testCase) => ({\n id: testCase.id,\n family: testCase.family,\n ...(testCase.split !== undefined ? { split: testCase.split } : {}),\n ...(testCase.tags !== undefined ? { tags: testCase.tags } : {}),\n metadata: compactRecord({\n ...(testCase.metadata ?? {}),\n taskKind: testCase.taskKind,\n source: testCase.source,\n }),\n steps: [\n ...testCase.events.map((event, eventIndex) => ({\n id: `event:${event.id}`,\n scope: compactScope(\n options.eventScope?.({ event, case: testCase, eventIndex }) ?? {\n agentId: memoryAgentId,\n sessionId: testCase.id,\n },\n ),\n writes: [\n {\n id: event.id,\n kind: 'observation' as const,\n text: event.text,\n metadata: compactRecord({\n ...(event.metadata ?? {}),\n eventId: event.id,\n actorId: event.actorId,\n sessionId: event.sessionId,\n timestamp: event.timestamp,\n }),\n },\n ],\n metadata: { eventIndex },\n })),\n {\n id: 'probe',\n scope: compactScope(\n options.probeScope?.(testCase) ?? {\n agentId: memoryAgentId,\n sessionId: testCase.id,\n },\n ),\n probes: [\n {\n id: 'answer',\n query: testCase.prompt,\n taskKind: testCase.taskKind,\n ...(testCase.requiredFacts !== undefined\n ? { requiredFacts: testCase.requiredFacts }\n : {}),\n ...(testCase.forbiddenFacts !== undefined\n ? { forbiddenFacts: testCase.forbiddenFacts }\n : {}),\n ...(testCase.expectedEventIds !== undefined\n ? { expectedEventIds: testCase.expectedEventIds }\n : {}),\n ...(testCase.expectedActorIds !== undefined\n ? { expectedActorIds: testCase.expectedActorIds }\n : {}),\n ...(testCase.referenceAnswer !== undefined\n ? { referenceAnswer: testCase.referenceAnswer }\n : {}),\n },\n ],\n },\n ],\n }))\n}\n\nexport function buildAgentMemorySequenceScenarios(\n sequences: readonly AgentMemorySequence[],\n candidates: readonly Pick<AgentMemoryExperimentCandidate, 'id'>[],\n): AgentMemorySequenceScenario[] {\n return candidates.flatMap((candidate) =>\n sequences.map((sequence) => ({\n id: `${stableId('candidate', candidate.id)}:${sequence.id}`,\n kind: 'agent-memory-sequence' as const,\n candidateId: candidate.id,\n sequenceId: sequence.id,\n sequence,\n seedGroup: sequence.id,\n tags: [...new Set([sequence.split ?? 'dev', ...(sequence.tags ?? []), candidate.id])],\n })),\n )\n}\n\nexport function agentMemorySequenceJudge<\n TScenario extends Scenario = AgentMemorySequenceScenario,\n>(): JudgeConfig<AgentMemorySequenceArtifact, TScenario> {\n return {\n name: 'agent-memory-sequence',\n judgeVersion: 'agent-knowledge:memory-sequence:v2',\n dimensions: [\n { key: 'score', description: 'mean memory probe score' },\n { key: 'passed', description: '1 when every memory probe passes' },\n { key: 'memory_fact_recall', description: 'current memory fact coverage' },\n { key: 'memory_event_recall', description: 'memory source event coverage' },\n { key: 'memory_actor_recall', description: 'memory actor attribution coverage' },\n { key: 'memory_stale_safe', description: '1 when obsolete memory is not reused' },\n ],\n score({ artifact }) {\n return {\n composite: artifact.score,\n dimensions: {\n score: artifact.score,\n passed: artifact.passed ? 1 : 0,\n ...artifact.dimensions,\n },\n notes: `${artifact.probes.filter((probe) => probe.passed).length}/${artifact.probes.length} probes passed`,\n }\n },\n }\n}\n","import { join } from 'node:path'\nimport { canonicalJson } from '@tangle-network/agent-eval'\nimport {\n type CampaignResult,\n type CampaignStorage,\n createRunCostLedger,\n fsCampaignStorage,\n resolveRunDir,\n runCampaign,\n} from '@tangle-network/agent-eval/campaign'\nimport { stableId } from '../../ids'\nimport { DEFAULT_MEMORY_RECOVERY_RETRIES_PER_ATTEMPT } from '../attempt-log'\nimport { createMemoryExecutionPool, resolveMemoryCleanupTimeoutMs } from '../lifecycle'\nimport { acquireAgentMemoryRunLease } from '../run-control'\nimport { agentMemorySequenceJudge, buildAgentMemorySequenceScenarios } from './cases'\nimport { runSequenceCell } from './cell'\nimport {\n memoryExperimentCostByCandidate,\n normalizeUsd,\n rankAgentMemoryExperiment,\n renderAgentMemoryExperimentRanking,\n} from './metrics'\nimport { recoverAbandonedMemoryAttempts } from './recovery'\nimport { AgentMemoryCleanupError } from './runtime'\nimport type {\n AgentMemorySequenceArtifact,\n AgentMemorySequenceScenario,\n OwnedMemoryExperimentRunLease,\n RunAgentMemoryExperimentOptions,\n RunAgentMemoryExperimentResult,\n} from './types'\nimport { assertMemorySequences, assertNonEmptyString, assertUnique } from './validation'\n\nconst MEMORY_EXPERIMENT_IMPLEMENTATION_REF = 'agent-knowledge:memory-experiment:v6'\n\n/** Runs ordered, branch-isolated memory histories across candidate systems. */\nexport async function runAgentMemoryExperiment(\n options: RunAgentMemoryExperimentOptions,\n): Promise<RunAgentMemoryExperimentResult> {\n assertNonEmptyString(options.experimentId, 'memory experiment experimentId')\n assertNonEmptyString(options.runDir, 'memory experiment runDir')\n if (options.experimentRunId !== undefined) {\n assertNonEmptyString(options.experimentRunId, 'memory experiment experimentRunId')\n }\n if (options.sequences.length === 0) throw new Error('memory experiment requires sequences')\n if (options.candidates.length === 0) throw new Error('memory experiment requires candidates')\n if (options.executeStep && !options.executeStepRef) {\n throw new Error('memory experiment executeStepRef is required when executeStep is configured')\n }\n assertUnique(\n options.sequences.map((sequence) => sequence.id),\n 'sequence',\n )\n assertUnique(\n [...options.candidates, ...(options.recoveryCandidates ?? [])].map((candidate) => candidate.id),\n 'candidate',\n )\n assertMemorySequences(options.sequences)\n for (const candidate of [...options.candidates, ...(options.recoveryCandidates ?? [])]) {\n if (options.cleanupBranches === false && !candidate.disposeAdapter) {\n throw new Error(\n `${candidate.id}: cleanupBranches=false requires disposeAdapter to delete isolated external state`,\n )\n }\n if (\n candidate.externalCostUsdPerSequence !== undefined &&\n (!Number.isFinite(candidate.externalCostUsdPerSequence) ||\n candidate.externalCostUsdPerSequence < 0)\n ) {\n throw new Error(\n `${candidate.id}: externalCostUsdPerSequence must be a non-negative finite number`,\n )\n }\n if (\n candidate.externalRecoveryCostUsdPerAttempt !== undefined &&\n (!Number.isFinite(candidate.externalRecoveryCostUsdPerAttempt) ||\n candidate.externalRecoveryCostUsdPerAttempt < 0)\n ) {\n throw new Error(\n `${candidate.id}: externalRecoveryCostUsdPerAttempt must be a non-negative finite number`,\n )\n }\n if (\n candidate.externalCostAccounting !== undefined &&\n candidate.externalCostAccounting !== 'exact'\n ) {\n throw new Error(`${candidate.id}: externalCostAccounting must be 'exact'`)\n }\n if (\n ((candidate.externalCostUsdPerSequence ?? 0) > 0 ||\n (candidate.externalRecoveryCostUsdPerAttempt ?? 0) > 0) &&\n candidate.externalCostAccounting !== 'exact'\n ) {\n throw new Error(`${candidate.id}: positive external charges require exact cost accounting`)\n }\n assertNonEmptyString(candidate.ref, `${candidate.id} ref`)\n }\n\n const storage = options.storage ?? fsCampaignStorage()\n const runDir = resolveRunDir(options.runDir, options.repo)\n if (!storage.append) {\n throw new Error('memory experiment requires CampaignStorage.append for durable attempt state')\n }\n resolveMemoryCleanupTimeoutMs(options.cleanupTimeoutMs, 'memory experiment')\n const maxRecoveryAttempts = options.maxRecoveryAttempts ?? 1_000\n if (!Number.isSafeInteger(maxRecoveryAttempts) || maxRecoveryAttempts <= 0) {\n throw new Error('memory experiment maxRecoveryAttempts must be a positive safe integer')\n }\n const maxRecoveryRetriesPerAttempt =\n options.maxRecoveryRetriesPerAttempt ?? DEFAULT_MEMORY_RECOVERY_RETRIES_PER_ATTEMPT\n if (!Number.isSafeInteger(maxRecoveryRetriesPerAttempt) || maxRecoveryRetriesPerAttempt <= 0) {\n throw new Error(\n 'memory experiment maxRecoveryRetriesPerAttempt must be a positive safe integer',\n )\n }\n storage.ensureDir(runDir)\n const lease = await acquireAgentMemoryRunLease({\n experimentId: options.experimentId,\n runDir,\n storage,\n customStorage: options.storage !== undefined,\n lockFileName: 'memory-experiment.lock',\n label: 'memory experiment',\n controllerMode: options.controllerMode,\n acquireRunLease: options.acquireRunLease,\n })\n let result: RunAgentMemoryExperimentResult | undefined\n let primaryError: unknown\n try {\n await lease.assertOwned()\n result = await runOwnedAgentMemoryExperiment(options, storage, runDir, lease)\n } catch (error) {\n primaryError = error\n }\n let releaseError: unknown\n try {\n await lease.release()\n } catch (error) {\n releaseError = error\n }\n if (primaryError && releaseError) {\n throw new AggregateError(\n [primaryError, releaseError],\n 'memory experiment failed and its controller lease could not be released',\n )\n }\n if (primaryError) throw primaryError\n if (releaseError) throw releaseError\n if (!result) throw new Error('memory experiment produced no result')\n return result\n}\n\nasync function runOwnedAgentMemoryExperiment(\n options: RunAgentMemoryExperimentOptions,\n storage: CampaignStorage,\n runDir: string,\n lease: OwnedMemoryExperimentRunLease,\n): Promise<RunAgentMemoryExperimentResult> {\n const runIdentity = stableId(\n 'memory_run',\n canonicalJson({\n experimentId: options.experimentId,\n experimentRunId: options.experimentRunId ?? runDir,\n }),\n )\n const maxConcurrency = options.maxConcurrency ?? 2\n if (!Number.isSafeInteger(maxConcurrency) || maxConcurrency <= 0) {\n throw new Error('memory experiment maxConcurrency must be a positive safe integer')\n }\n const executionPool = createMemoryExecutionPool(maxConcurrency)\n const dispatchedExecutions: Promise<AgentMemorySequenceArtifact>[] = []\n const candidateById = new Map(options.candidates.map((candidate) => [candidate.id, candidate]))\n const recoveryCandidateById = new Map(\n [...options.candidates, ...(options.recoveryCandidates ?? [])].map((candidate) => [\n candidate.id,\n candidate,\n ]),\n )\n const sequenceById = new Map(options.sequences.map((sequence) => [sequence.id, sequence]))\n const scenarios = buildAgentMemorySequenceScenarios(options.sequences, options.candidates)\n const attemptLogPath = join(runDir, 'memory-attempts.jsonl')\n const recoveryLogPath = join(runDir, 'memory-recovery-attempts.jsonl')\n const costCeiling = options.costCeiling ?? options.costLedger?.costCeilingUsd ?? 0\n const costLedger =\n options.costLedger ??\n createRunCostLedger({\n storage,\n runDir,\n costCeilingUsd: costCeiling,\n })\n if (costLedger.costCeilingUsd !== costCeiling) {\n throw new Error('memory experiment costCeiling must match the shared cost ledger ceiling')\n }\n storage.ensureDir(runDir)\n await recoverAbandonedMemoryAttempts({\n options,\n storage,\n runDir,\n attemptLogPath,\n candidateById: recoveryCandidateById,\n sequenceById,\n lease,\n maxConcurrency,\n costLedger,\n maxRecoveryAttempts: options.maxRecoveryAttempts ?? 1_000,\n recoveryLogPath,\n maxRecoveryRetriesPerAttempt:\n options.maxRecoveryRetriesPerAttempt ?? DEFAULT_MEMORY_RECOVERY_RETRIES_PER_ATTEMPT,\n })\n await lease.assertOwned()\n let campaign: CampaignResult<AgentMemorySequenceArtifact, AgentMemorySequenceScenario> | undefined\n let campaignError: unknown\n let settledExecutions: PromiseSettledResult<AgentMemorySequenceArtifact>[] = []\n try {\n campaign = await runCampaign<AgentMemorySequenceScenario, AgentMemorySequenceArtifact>({\n scenarios,\n dispatch: (scenario, context) => {\n const candidate = candidateById.get(scenario.candidateId)\n if (!candidate) throw new Error(`unknown memory candidate ${scenario.candidateId}`)\n const operation = executionPool.run(() =>\n runSequenceCell({\n options,\n candidate,\n scenario,\n context,\n runIdentity,\n storage,\n attemptLogPath,\n lease,\n }),\n )\n dispatchedExecutions.push(operation)\n return operation\n },\n dispatchRef: memoryExperimentDispatchRef(options),\n judges: [agentMemorySequenceJudge()],\n runDir,\n storage,\n seed: options.seed,\n reps: options.reps,\n resumable: options.resumable,\n costCeiling,\n costLedger,\n costPhase: options.costPhase,\n maxConcurrency,\n dispatchTimeoutMs: options.dispatchTimeoutMs,\n expectUsage: 'off',\n now: options.now,\n })\n } catch (error) {\n campaignError = error\n } finally {\n settledExecutions = await Promise.allSettled(dispatchedExecutions)\n }\n const cleanupFailures = settledExecutions.flatMap((settled) =>\n settled.status === 'rejected' && settled.reason instanceof AgentMemoryCleanupError\n ? [settled.reason]\n : [],\n )\n if (campaignError && cleanupFailures.length > 0) {\n throw new AggregateError(\n [campaignError, ...cleanupFailures],\n 'memory experiment failed and provider cleanup also failed',\n )\n }\n if (campaignError) throw campaignError\n if (cleanupFailures.length > 0) {\n throw new AggregateError(cleanupFailures, 'memory experiment cleanup failed after dispatch')\n }\n if (!campaign) throw new Error('memory experiment produced no campaign result')\n await lease.assertOwned()\n const costByCandidate = memoryExperimentCostByCandidate(\n costLedger,\n campaign.runDir,\n scenarios,\n [...options.candidates, ...(options.recoveryCandidates ?? [])].map((candidate) => candidate.id),\n )\n const unrankedRecoveryCostUsd = normalizeUsd(\n (options.recoveryCandidates ?? []).reduce(\n (sum, candidate) => sum + (costByCandidate.get(candidate.id) ?? 0),\n 0,\n ),\n )\n const totalCostUsd = normalizeUsd(\n [...costByCandidate.values()].reduce((sum, cost) => sum + cost, 0),\n )\n const rows = rankAgentMemoryExperiment(options.candidates, scenarios, campaign, costByCandidate)\n const rankingJsonPath = join(campaign.runDir, 'memory-experiment-ranking.json')\n const rankingMarkdownPath = join(campaign.runDir, 'memory-experiment-ranking.md')\n storage.write(\n rankingJsonPath,\n `${JSON.stringify(\n { experimentId: options.experimentId, totalCostUsd, unrankedRecoveryCostUsd, rows },\n null,\n 2,\n )}\\n`,\n )\n storage.write(\n rankingMarkdownPath,\n renderAgentMemoryExperimentRanking(rows, totalCostUsd, unrankedRecoveryCostUsd),\n )\n return {\n campaign,\n rows,\n totalCostUsd,\n unrankedRecoveryCostUsd,\n leaderCandidateId: rows.find((row) => row.cellsFailed === 0)?.candidateId,\n rankingJsonPath,\n rankingMarkdownPath,\n attemptLogPath,\n recoveryLogPath,\n }\n}\n\nfunction memoryExperimentDispatchRef(options: RunAgentMemoryExperimentOptions): string {\n return stableId(\n 'memory_experiment',\n canonicalJson({\n implementationRef: MEMORY_EXPERIMENT_IMPLEMENTATION_REF,\n experimentId: options.experimentId,\n experimentRunId: options.experimentRunId ?? null,\n executeStepRef: options.executeStepRef ?? 'fixtures',\n cleanupBranches: options.cleanupBranches ?? true,\n candidates: options.candidates\n .map((candidate) => ({\n id: candidate.id,\n ref: candidate.ref,\n policy: candidate.policy ?? null,\n baseScope: candidate.baseScope ?? null,\n externalCostUsdPerSequence: candidate.externalCostUsdPerSequence ?? 0,\n externalRecoveryCostUsdPerAttempt: candidate.externalRecoveryCostUsdPerAttempt ?? 0,\n externalCostAccounting: candidate.externalCostAccounting ?? 'exact',\n }))\n .sort((a, b) => a.id.localeCompare(b.id)),\n }),\n )\n}\n","import { randomUUID } from 'node:crypto'\nimport type { CampaignStorage, DispatchContext } from '@tangle-network/agent-eval/campaign'\nimport { scoreMemoryBenchmarkArtifact } from '../../benchmarks/index'\nimport { stableId } from '../../ids'\nimport { type AgentMemoryBranch, createAgentMemoryBranch } from '../branch'\nimport { resolveMemoryCleanupTimeoutMs, runBoundedMemoryLifecycle } from '../lifecycle'\nimport type { AgentMemoryAdapter } from '../types'\nimport { createAgentMemoryCostRecorder } from './cost'\nimport { createAgentMemoryExecutionContext } from './execution-context'\nimport { countDimensions, mean, meanDimensions } from './metrics'\nimport { appendMemoryAttemptEvent, memoryAttemptCostCallId, memoryAttemptEvent } from './recovery'\nimport {\n AgentMemoryCleanupError,\n clearSequenceScopes,\n memoryExperimentBaseScope,\n mergeScopes,\n sequenceCleanupScopes,\n trackExternalMemoryCalls,\n} from './runtime'\nimport type {\n AgentMemoryExecutionStep,\n AgentMemoryExperimentCandidate,\n AgentMemorySequence,\n AgentMemorySequenceArtifact,\n AgentMemorySequenceProbe,\n AgentMemorySequenceProbeResult,\n AgentMemorySequenceScenario,\n AgentMemorySequenceStep,\n OwnedMemoryExperimentRunLease,\n RunAgentMemoryExperimentOptions,\n} from './types'\nimport { stringArray, uniqueStrings } from './validation'\n\nexport async function runSequenceCell(input: {\n options: RunAgentMemoryExperimentOptions\n candidate: AgentMemoryExperimentCandidate\n scenario: AgentMemorySequenceScenario\n context: DispatchContext\n runIdentity: string\n storage: CampaignStorage\n attemptLogPath: string\n lease: OwnedMemoryExperimentRunLease\n}): Promise<AgentMemorySequenceArtifact> {\n const { options, candidate, scenario, context, runIdentity, storage, attemptLogPath, lease } =\n input\n const cleanupBranches = options.cleanupBranches ?? true\n const costUsd = candidate.externalCostUsdPerSequence ?? 0\n if (!Number.isFinite(costUsd) || costUsd < 0) {\n throw new Error(\n `${candidate.id}: externalCostUsdPerSequence must be a non-negative finite number`,\n )\n }\n if (!cleanupBranches && !candidate.disposeAdapter) {\n throw new Error(\n `${candidate.id}: cleanupBranches=false requires disposeAdapter to delete isolated external state`,\n )\n }\n const cleanupTimeoutMs = resolveMemoryCleanupTimeoutMs(\n options.cleanupTimeoutMs,\n `${candidate.id}: memory sequence`,\n )\n\n context.signal.throwIfAborted()\n await lease.assertOwned()\n const startedAt = Date.now()\n const branchId = stableId(\n 'memory_branch',\n `${runIdentity}:${context.cellId}:${context.seed}:${randomUUID()}`,\n )\n const attempt = memoryAttemptEvent({\n status: 'started',\n branchId,\n candidate,\n sequence: scenario.sequence,\n rep: context.rep,\n seed: context.seed,\n recovery: false,\n cleanupBranches,\n now: options.now,\n })\n appendMemoryAttemptEvent(storage, attemptLogPath, attempt)\n\n let externalCallAttempted = false\n const costRecorder = createAgentMemoryCostRecorder({\n candidateRef: candidate.ref,\n maximumCostUsd: costUsd,\n operation: `${candidate.id}: memory sequence`,\n })\n const appendCleanedAttempt = (priorError?: unknown): void => {\n try {\n appendMemoryAttemptEvent(storage, attemptLogPath, {\n ...attempt,\n status: 'cleaned',\n recordedAt: (options.now ?? (() => new Date()))().toISOString(),\n })\n } catch (error) {\n throw new AgentMemoryCleanupError(\n [...(priorError ? [priorError] : []), error],\n `${candidate.id}: memory branch cleanup could not be recorded`,\n )\n }\n }\n const execute = async (): Promise<AgentMemorySequenceArtifact> => {\n context.signal.throwIfAborted()\n await lease.assertOwned()\n let rawAdapter: AgentMemoryAdapter | undefined\n let adapter: AgentMemoryAdapter | undefined\n let memory: AgentMemoryBranch | undefined\n let primaryError: unknown\n let completedArtifact: AgentMemorySequenceArtifact | undefined\n let finalClearStarted = false\n let finalClearCompleted = false\n try {\n const created = await candidate.createAdapter({\n branchId,\n purpose: 'execute',\n signal: context.signal,\n maximumCostUsd: costUsd,\n markExternalCall: () => {\n externalCallAttempted = true\n },\n recordExternalCost: (actualCostUsd) => {\n externalCallAttempted = true\n costRecorder.record(actualCostUsd)\n },\n })\n if (!created) throw new Error(`${candidate.id}: createAdapter returned no execution adapter`)\n rawAdapter = created\n adapter = trackExternalMemoryCalls(created, () => {\n externalCallAttempted = true\n })\n await lease.assertOwned()\n context.signal.throwIfAborted()\n if (cleanupBranches && !adapter.clear) {\n throw new Error(\n `${candidate.id}: cleanupBranches requires an adapter with scoped clear support`,\n )\n }\n memory = createAgentMemoryBranch({\n adapter,\n branchId,\n lifetime: 'attempt',\n policy: candidate.policy,\n allowedWriteScopes: sequenceCleanupScopes(scenario.sequence),\n baseScope: memoryExperimentBaseScope(options, candidate, scenario.sequenceId),\n })\n const probes: AgentMemorySequenceProbeResult[] = []\n for (const [ordinal, step] of scenario.sequence.steps.entries()) {\n context.signal.throwIfAborted()\n await lease.assertOwned()\n await writeStep(memory, step)\n await lease.assertOwned()\n if (options.executeStep) {\n const execution = createAgentMemoryExecutionContext(context, scenario.sequence)\n try {\n await options.executeStep({\n memory,\n candidateId: candidate.id,\n step: executionStep(step, ordinal),\n context: execution.context,\n })\n } finally {\n execution.dispose()\n }\n }\n context.signal.throwIfAborted()\n await lease.assertOwned()\n const stepProbes = await probeStep(memory, scenario.sequence, step)\n await lease.assertOwned()\n probes.push(...stepProbes)\n }\n const snapshot = await memory.snapshot()\n await lease.assertOwned()\n await options.onBranchSnapshot?.({\n candidateId: candidate.id,\n sequenceId: scenario.sequenceId,\n cellId: context.cellId,\n snapshot,\n })\n await lease.assertOwned()\n const dimensions = meanDimensions(probes.map((probe) => probe.dimensions))\n const dimensionSampleCounts = countDimensions(\n probes.map((probe) => probe.applicableDimensions),\n )\n const artifact: AgentMemorySequenceArtifact = {\n candidateId: candidate.id,\n sequenceId: scenario.sequenceId,\n score: mean(probes.map((probe) => probe.score)),\n passed: probes.length > 0 && probes.every((probe) => probe.passed),\n dimensions,\n dimensionSampleCounts,\n probes,\n branchDigest: snapshot.digest,\n journalEntries: snapshot.journal.length,\n durationMs: Math.max(0, Date.now() - startedAt),\n }\n if (cleanupBranches) {\n finalClearStarted = true\n await runBoundedMemoryLifecycle({\n operation: `${candidate.id}: final branch cleanup`,\n timeoutMs: cleanupTimeoutMs,\n resource: adapter,\n run: () => clearSequenceScopes(memory!, scenario.sequence),\n })\n finalClearCompleted = true\n await lease.assertOwned()\n }\n completedArtifact = artifact\n } catch (error) {\n primaryError = error\n }\n const cleanupErrors: unknown[] = []\n let cleanupOwned = true\n let ownershipError: unknown\n try {\n await lease.assertOwned()\n } catch (error) {\n cleanupOwned = false\n ownershipError = error\n }\n if (finalClearStarted && !finalClearCompleted && primaryError) {\n cleanupErrors.push(primaryError)\n }\n if (\n primaryError &&\n cleanupOwned &&\n !finalClearStarted &&\n memory &&\n cleanupBranches &&\n adapter?.clear\n ) {\n try {\n await runBoundedMemoryLifecycle({\n operation: `${candidate.id}: failed branch cleanup`,\n timeoutMs: cleanupTimeoutMs,\n resource: adapter,\n run: () => clearSequenceScopes(memory!, scenario.sequence),\n })\n } catch (error) {\n cleanupErrors.push(error)\n }\n }\n if (adapter) {\n try {\n await runBoundedMemoryLifecycle({\n operation: `${candidate.id}: adapter close`,\n timeoutMs: cleanupTimeoutMs,\n resource: adapter,\n run: async () => {\n if (memory && cleanupOwned) await memory.close?.()\n else {\n if (cleanupOwned) await adapter!.flush?.()\n await adapter!.close?.()\n }\n },\n })\n } catch (error) {\n cleanupErrors.push(error)\n }\n if (cleanupOwned) {\n try {\n await runBoundedMemoryLifecycle({\n operation: `${candidate.id}: adapter disposal`,\n timeoutMs: cleanupTimeoutMs,\n resource: adapter,\n run: () => {\n if (candidate.disposeAdapter) externalCallAttempted = true\n return candidate.disposeAdapter?.(rawAdapter!)\n },\n })\n } catch (error) {\n cleanupErrors.push(error)\n }\n }\n } else {\n cleanupErrors.push(\n new Error(`${candidate.id}: adapter creation failed before cleanup could be confirmed`),\n )\n }\n if (cleanupOwned && cleanupErrors.length === 0) appendCleanedAttempt(primaryError)\n if (!cleanupOwned && cleanupErrors.length === 0) {\n if (primaryError) throw primaryError\n throw ownershipError\n }\n if (cleanupErrors.length > 0) {\n const primaryMessage =\n primaryError instanceof Error ? primaryError.message : String(primaryError ?? '')\n throw new AgentMemoryCleanupError(\n [\n ...(primaryError && !cleanupErrors.includes(primaryError) ? [primaryError] : []),\n ...(ownershipError ? [ownershipError] : []),\n ...cleanupErrors,\n ],\n `${candidate.id}: memory branch cleanup failed${primaryMessage ? ` after: ${primaryMessage}` : ''}`,\n )\n }\n if (primaryError) throw primaryError\n if (!completedArtifact) throw new Error(`${candidate.id}: memory sequence produced no result`)\n return completedArtifact\n }\n\n if (costUsd === 0) {\n let artifact: AgentMemorySequenceArtifact | undefined\n let error: unknown\n try {\n artifact = await execute()\n } catch (caught) {\n error = caught\n }\n if (error) throw error\n if (!artifact) throw new Error(`${candidate.id}: memory sequence produced no result`)\n return artifact\n }\n const paid = await context.cost.runPaidCall({\n callId: memoryAttemptCostCallId(attempt, 'execute', 0),\n actor: `agent-knowledge:memory-experiment:${candidate.id}`,\n model: candidate.ref,\n maximumCharge: { externallyEnforcedMaximumUsd: costUsd },\n execute,\n receipt: () => costRecorder.receipt(externalCallAttempted),\n receiptFromError: () => costRecorder.receipt(externalCallAttempted),\n })\n if (!paid.succeeded) throw paid.error\n return paid.value\n}\n\nfunction executionStep(step: AgentMemorySequenceStep, ordinal: number): AgentMemoryExecutionStep {\n return {\n ordinal,\n ...(step.instruction !== undefined ? { instruction: step.instruction } : {}),\n ...(step.scope !== undefined ? { scope: structuredClone(step.scope) } : {}),\n }\n}\n\nasync function writeStep(memory: AgentMemoryBranch, step: AgentMemorySequenceStep): Promise<void> {\n const writes = (step.writes ?? []).map((write) => ({\n ...write,\n scope: mergeScopes(step.scope, write.scope),\n }))\n if (step.parallelWrites) {\n await Promise.all(writes.map((write) => memory.write(write)))\n return\n }\n for (const write of writes) await memory.write(write)\n}\n\nasync function probeStep(\n memory: AgentMemoryBranch,\n sequence: AgentMemorySequence,\n step: AgentMemorySequenceStep,\n): Promise<AgentMemorySequenceProbeResult[]> {\n const run = async (probe: AgentMemorySequenceProbe): Promise<AgentMemorySequenceProbeResult> => {\n const scope = mergeScopes(step.scope, probe.scope)\n const context = await memory.getContext(probe.query, { scope, limit: probe.limit })\n const artifact = {\n answer: context.text,\n rememberedFacts: context.hits.map((hit) => hit.text),\n citedEventIds: uniqueStrings([\n ...context.hits.map((hit) => hit.metadata?.eventId),\n ...context.hits.flatMap((hit) => stringArray(hit.metadata?.eventIds)),\n ]),\n usedMemoryIds: context.hits.map((hit) => hit.id),\n actorIds: uniqueStrings([\n ...context.hits.map((hit) => hit.metadata?.actorId),\n ...context.hits.flatMap((hit) => stringArray(hit.metadata?.actorIds)),\n ]),\n }\n const evaluation = scoreMemoryBenchmarkArtifact(\n {\n id: `${sequence.id}:${step.id}:${probe.id}`,\n family: sequence.family,\n taskKind: probe.taskKind ?? 'memory-recall',\n split: sequence.split,\n events: [],\n prompt: probe.query,\n requiredFacts:\n probe.requiredFacts && probe.requiredFacts.length > 0\n ? probe.requiredFacts\n : probe.referenceAnswer\n ? [{ id: `${probe.id}:reference`, anyOf: [probe.referenceAnswer] }]\n : undefined,\n forbiddenFacts: probe.forbiddenFacts,\n expectedEventIds: probe.expectedEventIds,\n expectedActorIds: probe.expectedActorIds,\n referenceAnswer: probe.referenceAnswer,\n },\n artifact,\n )\n return {\n id: probe.id,\n stepId: step.id,\n query: probe.query,\n score: evaluation.score,\n passed: evaluation.passed,\n dimensions: evaluation.dimensions,\n applicableDimensions: evaluation.applicableDimensions ?? Object.keys(evaluation.dimensions),\n notes: evaluation.notes,\n hitIds: context.hits.map((hit) => hit.id),\n }\n }\n if (step.parallelProbes === false) {\n const results: AgentMemorySequenceProbeResult[] = []\n for (const probe of step.probes ?? []) results.push(await run(probe))\n return results\n }\n return Promise.all((step.probes ?? []).map(run))\n}\n","export interface AgentMemoryCostReceipt {\n model: string\n inputTokens: 0\n outputTokens: 0\n actualCostUsd?: number\n costUnknown?: boolean\n}\n\nexport interface AgentMemoryCostRecorder {\n record(actualCostUsd: number): void\n receipt(externalCallAttempted: boolean): AgentMemoryCostReceipt\n}\n\nexport function createAgentMemoryCostRecorder(input: {\n candidateRef: string\n maximumCostUsd: number\n operation: string\n}): AgentMemoryCostRecorder {\n let observedCostUsd = 0\n let receiptCount = 0\n\n return {\n record(actualCostUsd) {\n if (!Number.isFinite(actualCostUsd) || actualCostUsd < 0) {\n throw new Error(\n `${input.operation}: observed external cost must be non-negative and finite`,\n )\n }\n const next = observedCostUsd + actualCostUsd\n if (exceedsMaximum(next, input.maximumCostUsd)) {\n throw new Error(\n `${input.operation}: observed external cost ${next} exceeds declared maximum ${input.maximumCostUsd}`,\n )\n }\n observedCostUsd = next\n receiptCount += 1\n },\n receipt(externalCallAttempted) {\n const base = {\n model: input.candidateRef,\n inputTokens: 0 as const,\n outputTokens: 0 as const,\n }\n if (input.maximumCostUsd === 0 || !externalCallAttempted) {\n return { ...base, actualCostUsd: 0 }\n }\n if (receiptCount === 0) {\n return { ...base, costUnknown: true }\n }\n return { ...base, actualCostUsd: observedCostUsd }\n },\n }\n}\n\nfunction exceedsMaximum(actual: number, maximum: number): boolean {\n const tolerance = Number.EPSILON * Math.max(1, Math.abs(actual), Math.abs(maximum)) * 8\n return actual - maximum > tolerance\n}\n","import type { CostReceipt, PaidCallResult } from '@tangle-network/agent-eval'\nimport type { DispatchContext } from '@tangle-network/agent-eval/campaign'\nimport type {\n AgentMemoryExecutionContext,\n AgentMemoryExecutionCostMeter,\n AgentMemoryExecutionCostReceipt,\n AgentMemoryExecutionPaidCallInput,\n AgentMemoryExecutionPaidCallResult,\n AgentMemorySequence,\n} from './types'\n\nexport interface OwnedAgentMemoryExecutionContext {\n context: AgentMemoryExecutionContext\n dispose(): void\n}\n\nexport function createAgentMemoryExecutionContext(\n dispatch: DispatchContext,\n sequence: AgentMemorySequence,\n): OwnedAgentMemoryExecutionContext {\n const privateValues = memoryEvaluationPrivateValues(dispatch.cellId, sequence)\n const signal = relayAbortWithoutReason(dispatch.signal)\n const cost: AgentMemoryExecutionCostMeter = Object.freeze({\n async runPaidCall<T>(\n input: AgentMemoryExecutionPaidCallInput<T>,\n ): Promise<AgentMemoryExecutionPaidCallResult<T>> {\n const result = await dispatch.cost.runPaidCall({\n ...input,\n execute: (sourceSignal, callId) =>\n withRedactedAbortSignal(sourceSignal, (redactedSignal) =>\n input.execute(redactedSignal, callId),\n ),\n })\n return sanitizePaidCallResult(result, privateValues)\n },\n })\n return {\n context: Object.freeze({ signal: signal.signal, cost }),\n dispose: signal.dispose,\n }\n}\n\nfunction sanitizePaidCallResult<T>(\n result: PaidCallResult<T>,\n privateValues: readonly string[],\n): AgentMemoryExecutionPaidCallResult<T> {\n if (result.succeeded) {\n return Object.freeze({\n succeeded: true,\n callId: result.callId,\n value: result.value,\n receipt: sanitizeCostReceipt(result.receipt, privateValues),\n })\n }\n return Object.freeze({\n succeeded: false,\n ...(result.callId === undefined ? {} : { callId: result.callId }),\n error: sanitizeError(result.error, privateValues),\n ...(result.receipt === undefined\n ? {}\n : { receipt: sanitizeCostReceipt(result.receipt, privateValues) }),\n })\n}\n\nfunction sanitizeCostReceipt(\n receipt: CostReceipt,\n privateValues: readonly string[],\n): AgentMemoryExecutionCostReceipt {\n const { tags: _tags, phase: _phase, error, ...visible } = receipt\n return Object.freeze({\n ...visible,\n ...(error === undefined ? {} : { error: redactPrivateValues(error, privateValues) }),\n })\n}\n\nfunction sanitizeError(error: Error, privateValues: readonly string[]): Error {\n const sanitized = new Error(redactPrivateValues(error.message, privateValues))\n sanitized.name = redactPrivateValues(error.name, privateValues)\n return sanitized\n}\n\nasync function withRedactedAbortSignal<T>(\n source: AbortSignal,\n run: (signal: AbortSignal) => Promise<T>,\n): Promise<T> {\n const relay = relayAbortWithoutReason(source)\n try {\n return await run(relay.signal)\n } finally {\n relay.dispose()\n }\n}\n\nfunction relayAbortWithoutReason(source: AbortSignal): {\n signal: AbortSignal\n dispose(): void\n} {\n const controller = new AbortController()\n const abort = () => controller.abort(memoryExecutionAbortError())\n if (source.aborted) abort()\n else source.addEventListener('abort', abort, { once: true })\n return {\n signal: controller.signal,\n dispose() {\n source.removeEventListener('abort', abort)\n },\n }\n}\n\nfunction memoryExecutionAbortError(): Error {\n const error = new Error('memory execution aborted')\n error.name = 'AbortError'\n return error\n}\n\nfunction memoryEvaluationPrivateValues(\n cellId: string,\n sequence: AgentMemorySequence,\n): readonly string[] {\n const values = new Set<string>([cellId, sequence.id])\n collectUnknownStrings(sequence.metadata, values)\n for (const step of sequence.steps) {\n values.add(step.id)\n collectUnknownStrings(step.metadata, values)\n for (const probe of step.probes ?? []) {\n values.add(probe.id)\n values.add(probe.query)\n if (probe.referenceAnswer !== undefined) values.add(probe.referenceAnswer)\n for (const matcher of [...(probe.requiredFacts ?? []), ...(probe.forbiddenFacts ?? [])]) {\n values.add(matcher.id)\n for (const expected of matcher.anyOf) values.add(expected)\n }\n for (const expected of probe.expectedEventIds ?? []) values.add(expected)\n for (const expected of probe.expectedActorIds ?? []) values.add(expected)\n }\n }\n return [...values].filter(Boolean).sort((left, right) => right.length - left.length)\n}\n\nfunction collectUnknownStrings(\n value: unknown,\n output: Set<string>,\n seen = new WeakSet<object>(),\n): void {\n if (typeof value === 'string') {\n output.add(value)\n return\n }\n if (!value || typeof value !== 'object' || seen.has(value)) return\n seen.add(value)\n if (Array.isArray(value)) {\n for (const item of value) collectUnknownStrings(item, output, seen)\n return\n }\n for (const [key, item] of Object.entries(value)) {\n output.add(key)\n collectUnknownStrings(item, output, seen)\n }\n}\n\nfunction redactPrivateValues(value: string, privateValues: readonly string[]): string {\n let redacted = value\n for (const privateValue of privateValues) {\n redacted = redacted.split(privateValue).join('[redacted]')\n }\n return redacted\n}\n","import type { CampaignResult, CostLedgerHandle } from '@tangle-network/agent-eval/campaign'\nimport type {\n AgentMemoryExperimentCandidate,\n AgentMemoryExperimentRankingRow,\n AgentMemorySequenceArtifact,\n AgentMemorySequenceScenario,\n} from './types'\n\nexport function rankAgentMemoryExperiment(\n candidates: readonly AgentMemoryExperimentCandidate[],\n scenarios: readonly AgentMemorySequenceScenario[],\n campaign: CampaignResult<AgentMemorySequenceArtifact, AgentMemorySequenceScenario>,\n costByCandidate: ReadonlyMap<string, number>,\n): AgentMemoryExperimentRankingRow[] {\n const scenarioById = new Map(scenarios.map((scenario) => [scenario.id, scenario]))\n const rows = candidates.map((candidate): AgentMemoryExperimentRankingRow => {\n const candidateScenarios = scenarios.filter((scenario) => scenario.candidateId === candidate.id)\n const cells = campaign.cells.filter(\n (cell) => scenarioById.get(cell.scenarioId)?.candidateId === candidate.id,\n )\n const successful = cells.filter((cell) => !cell.error && cell.artifact)\n const dimensionRows = successful.map((cell) => cell.artifact.dimensions)\n return {\n rank: 0,\n candidateId: candidate.id,\n label: candidate.label ?? candidate.id,\n scoreMean: mean(\n cells.map((cell) => (!cell.error && cell.artifact ? cell.artifact.score : 0)),\n ),\n passRate: mean(cells.map((cell) => (!cell.error && cell.artifact?.passed ? 1 : 0))),\n totalSequences: candidateScenarios.length,\n totalCells: cells.length,\n totalProbes: successful.reduce((sum, cell) => sum + cell.artifact.probes.length, 0),\n cellsFailed: cells.filter((cell) => Boolean(cell.error)).length,\n totalCostUsd: normalizeUsd(costByCandidate.get(candidate.id) ?? 0),\n durationMs: cells.reduce((sum, cell) => sum + cell.durationMs, 0),\n dimensions: meanDimensions(dimensionRows),\n }\n })\n return rows\n .sort(\n (a, b) =>\n Number(a.cellsFailed > 0) - Number(b.cellsFailed > 0) ||\n b.scoreMean - a.scoreMean ||\n b.passRate - a.passRate ||\n a.totalCostUsd - b.totalCostUsd ||\n a.candidateId.localeCompare(b.candidateId),\n )\n .map((row, index) => ({ ...row, rank: index + 1 }))\n}\n\nexport function memoryExperimentCostByCandidate(\n costLedger: CostLedgerHandle,\n runDir: string,\n scenarios: readonly AgentMemorySequenceScenario[],\n candidateIdsInput: readonly string[],\n): ReadonlyMap<string, number> {\n const candidateByScenario = new Map(\n scenarios.map((scenario) => [scenario.id, scenario.candidateId]),\n )\n const candidateIds = new Set(candidateIdsInput)\n const totals = new Map<string, number>()\n for (const receipt of costLedger.list()) {\n if (receipt.tags?.runDir !== runDir) continue\n const scenarioCandidate = receipt.tags.scenarioId\n ? candidateByScenario.get(receipt.tags.scenarioId)\n : undefined\n const recoveryCandidate =\n receipt.tags.memoryRecovery === 'attempt' && receipt.tags.candidateId\n ? receipt.tags.candidateId\n : undefined\n const candidateId = scenarioCandidate ?? recoveryCandidate\n if (!candidateId || !candidateIds.has(candidateId)) continue\n totals.set(candidateId, (totals.get(candidateId) ?? 0) + receipt.costUsd)\n }\n return totals\n}\n\nexport function renderAgentMemoryExperimentRanking(\n rows: readonly AgentMemoryExperimentRankingRow[],\n totalCostUsd: number,\n unrankedRecoveryCostUsd: number,\n): string {\n return [\n '# Agent Memory Experiment',\n '',\n `- total cost: $${format(totalCostUsd)}`,\n `- retired-candidate recovery cost: $${format(unrankedRecoveryCostUsd)}`,\n '',\n '| rank | candidate | sequences | cells | probes | failed | score | pass rate | cost | duration ms |',\n '| ---: | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |',\n ...rows.map(\n (row) =>\n `| ${row.rank} | ${row.label} | ${row.totalSequences} | ${row.totalCells} | ${row.totalProbes} | ${row.cellsFailed} | ${format(row.scoreMean)} | ${format(row.passRate)} | $${format(row.totalCostUsd)} | ${format(row.durationMs)} |`,\n ),\n '',\n ].join('\\n')\n}\n\nexport function meanDimensions(rows: readonly Record<string, number>[]): Record<string, number> {\n const values = new Map<string, number[]>()\n for (const row of rows) {\n for (const [key, value] of Object.entries(row)) {\n if (!Number.isFinite(value)) continue\n const bucket = values.get(key) ?? []\n bucket.push(value)\n values.set(key, bucket)\n }\n }\n return Object.fromEntries([...values].map(([key, bucket]) => [key, mean(bucket)]))\n}\n\nexport function countDimensions(rows: readonly (readonly string[])[]): Record<string, number> {\n const counts = new Map<string, number>()\n for (const row of rows) {\n for (const key of new Set(row)) counts.set(key, (counts.get(key) ?? 0) + 1)\n }\n return Object.fromEntries(counts)\n}\n\nexport function mean(values: readonly number[]): number {\n return values.length === 0 ? 0 : values.reduce((sum, value) => sum + value, 0) / values.length\n}\n\nfunction format(value: number): string {\n return Number.isFinite(value) ? value.toFixed(4) : '0.0000'\n}\n\nexport function normalizeUsd(value: number): number {\n return Number(value.toFixed(12))\n}\n","import { canonicalJson } from '@tangle-network/agent-eval'\nimport type { CampaignStorage, CostLedgerHandle } from '@tangle-network/agent-eval/campaign'\nimport { stableId } from '../../ids'\nimport {\n appendAttemptJournalEvent,\n assertNoInterruptedPaidCalls,\n hasSettledPaidCall,\n readActiveAttemptJournal,\n reconcileInterruptedMemoryPaidCalls,\n reserveRecoveryAttempts,\n} from '../attempt-log'\nimport { type AgentMemoryBranch, createAgentMemoryBranch } from '../branch'\nimport {\n createMemoryExecutionPool,\n memoryRecoveryDelayMs,\n releaseMemoryAdapterCreatedAfterAbort,\n resolveMemoryCleanupTimeoutMs,\n runBoundedMemoryLifecycle,\n sleepForMemoryRecovery,\n} from '../lifecycle'\nimport type { AgentMemoryAdapter } from '../types'\nimport { createAgentMemoryCostRecorder } from './cost'\nimport {\n AgentMemoryCleanupError,\n clearSequenceScopes,\n memoryExperimentBaseScope,\n sequenceCleanupScopes,\n trackExternalMemoryCalls,\n} from './runtime'\nimport type {\n AgentMemoryAttemptEvent,\n AgentMemoryExperimentCandidate,\n AgentMemorySequence,\n OwnedMemoryExperimentRunLease,\n RunAgentMemoryExperimentOptions,\n} from './types'\n\nexport async function recoverAbandonedMemoryAttempts(input: {\n options: RunAgentMemoryExperimentOptions\n storage: CampaignStorage\n runDir: string\n attemptLogPath: string\n candidateById: ReadonlyMap<string, AgentMemoryExperimentCandidate>\n sequenceById: ReadonlyMap<string, AgentMemorySequence>\n lease: OwnedMemoryExperimentRunLease\n maxConcurrency: number\n costLedger: CostLedgerHandle\n maxRecoveryAttempts: number\n recoveryLogPath: string\n maxRecoveryRetriesPerAttempt: number\n}): Promise<void> {\n let attempts = readActiveMemoryAttempts(input.storage, input.attemptLogPath)\n if (attempts.length > input.maxRecoveryAttempts) {\n throw new Error(\n `memory experiment has ${attempts.length} unfinished attempts; maxRecoveryAttempts is ${input.maxRecoveryAttempts}`,\n )\n }\n for (const attempt of attempts) {\n const candidate = input.candidateById.get(attempt.candidateId)\n if (!candidate) {\n throw new Error(\n `cannot recover memory branch '${attempt.branchId}': candidate '${attempt.candidateId}' is missing; pass it in recoveryCandidates`,\n )\n }\n assertMemoryAttemptCandidateMatches(attempt, candidate)\n if (!input.sequenceById.has(attempt.sequenceId)) {\n throw new Error(\n `cannot recover memory branch '${attempt.branchId}': sequence '${attempt.sequenceId}' is missing`,\n )\n }\n if ((input.options.cleanupBranches ?? true) !== attempt.cleanupBranches) {\n throw new Error(`cannot recover memory branch '${attempt.branchId}': cleanupBranches changed`)\n }\n }\n\n reconcileInterruptedMemoryPaidCalls(input.costLedger)\n assertNoInterruptedPaidCalls(input.costLedger, 'memory experiment recovery')\n\n for (const attempt of attempts) {\n const candidate = input.candidateById.get(attempt.candidateId)!\n const executionCostUsd = candidate.externalCostUsdPerSequence ?? 0\n if (\n executionCostUsd > 0 &&\n !hasSettledPaidCall(input.costLedger, memoryAttemptCostCallId(attempt, 'execute', 0))\n ) {\n appendMemoryAttemptEvent(input.storage, input.attemptLogPath, {\n ...attempt,\n status: 'cleaned',\n recovery: true,\n recordedAt: (input.options.now ?? (() => new Date()))().toISOString(),\n })\n }\n }\n attempts = readActiveMemoryAttempts(input.storage, input.attemptLogPath)\n const recoveryGenerations = reserveRecoveryAttempts({\n storage: input.storage,\n path: input.recoveryLogPath,\n attemptIds: attempts.map((attempt) => attempt.branchId),\n maxRetriesPerAttempt: input.maxRecoveryRetriesPerAttempt,\n label: 'memory recovery attempt log',\n now: input.options.now,\n })\n const pool = createMemoryExecutionPool(input.maxConcurrency)\n const settled = await Promise.allSettled(\n attempts\n .sort((left, right) => left.branchId.localeCompare(right.branchId))\n .map((attempt) =>\n pool.run(async () => {\n await input.lease.assertOwned()\n const candidate = input.candidateById.get(attempt.candidateId)\n if (!candidate) {\n throw new Error(\n `cannot recover memory branch '${attempt.branchId}': candidate '${attempt.candidateId}' is missing; pass it in recoveryCandidates`,\n )\n }\n assertMemoryAttemptCandidateMatches(attempt, candidate)\n const sequence = input.sequenceById.get(attempt.sequenceId)\n if (!sequence) {\n throw new Error(\n `cannot recover memory branch '${attempt.branchId}': sequence '${attempt.sequenceId}' is missing`,\n )\n }\n if ((input.options.cleanupBranches ?? true) !== attempt.cleanupBranches) {\n throw new Error(\n `cannot recover memory branch '${attempt.branchId}': cleanupBranches changed`,\n )\n }\n const recoveryCostUsd = candidate.externalRecoveryCostUsdPerAttempt ?? 0\n const recoveryGeneration = recoveryGenerations.get(attempt.branchId)\n if (recoveryGeneration === undefined) {\n throw new Error(`missing recovery generation for memory branch '${attempt.branchId}'`)\n }\n let externalRecoveryAttempted = false\n const costRecorder = createAgentMemoryCostRecorder({\n candidateRef: candidate.ref,\n maximumCostUsd: recoveryCostUsd,\n operation: `${candidate.id}: memory recovery`,\n })\n const recover = async (): Promise<void> => {\n await recoverMemoryAttempt({\n options: input.options,\n candidate,\n sequence,\n attempt,\n lease: input.lease,\n onExternalCall: () => {\n externalRecoveryAttempted = true\n },\n recordExternalCost: (actualCostUsd) => {\n externalRecoveryAttempted = true\n costRecorder.record(actualCostUsd)\n },\n })\n appendMemoryAttemptEvent(input.storage, input.attemptLogPath, {\n ...attempt,\n status: 'cleaned',\n recovery: true,\n recordedAt: (input.options.now ?? (() => new Date()))().toISOString(),\n })\n }\n if (recoveryCostUsd === 0) {\n await recover()\n } else {\n const tags = memoryRecoveryCostTags(input.runDir, candidate.id, attempt.branchId)\n const paid = await input.costLedger.runPaidCall({\n callId: memoryAttemptCostCallId(attempt, 'recovery', recoveryGeneration),\n channel: 'driver',\n phase: `${input.options.costPhase ?? 'memory.experiment'}.recovery`,\n actor: `agent-knowledge:memory-recovery:${candidate.id}`,\n model: candidate.ref,\n tags,\n maximumCharge: { externallyEnforcedMaximumUsd: recoveryCostUsd },\n execute: recover,\n receipt: () => costRecorder.receipt(externalRecoveryAttempted),\n receiptFromError: () => costRecorder.receipt(externalRecoveryAttempted),\n })\n if (!paid.succeeded) throw paid.error\n }\n }),\n ),\n )\n const failures = settled.flatMap((result) =>\n result.status === 'rejected' ? [result.reason] : [],\n )\n if (failures.length === 1) throw failures[0]\n if (failures.length > 1) {\n throw new AggregateError(failures, 'multiple abandoned memory branches failed recovery')\n }\n}\n\nasync function recoverMemoryAttempt(input: {\n options: RunAgentMemoryExperimentOptions\n candidate: AgentMemoryExperimentCandidate\n sequence: AgentMemorySequence\n attempt: AgentMemoryAttemptEvent\n lease: OwnedMemoryExperimentRunLease\n onExternalCall(): void\n recordExternalCost(actualCostUsd: number): void\n}): Promise<void> {\n const { options, candidate, sequence, attempt, lease, onExternalCall, recordExternalCost } = input\n const cleanupBranches = attempt.cleanupBranches\n const cleanupTimeoutMs = resolveMemoryCleanupTimeoutMs(\n options.cleanupTimeoutMs,\n `${candidate.id}: abandoned branch recovery`,\n )\n let rawAdapter: AgentMemoryAdapter | undefined\n let adapter: AgentMemoryAdapter | undefined\n let memory: AgentMemoryBranch | undefined\n let primaryError: unknown\n try {\n const abortController = new AbortController()\n const creation = Promise.resolve().then(() =>\n candidate.createAdapter({\n branchId: attempt.branchId,\n purpose: 'recovery',\n signal: abortController.signal,\n maximumCostUsd: candidate.externalRecoveryCostUsdPerAttempt ?? 0,\n markExternalCall: onExternalCall,\n recordExternalCost,\n }),\n )\n releaseMemoryAdapterCreatedAfterAbort({\n creation,\n signal: abortController.signal,\n dispose: candidate.disposeAdapter\n ? async (created) => {\n onExternalCall()\n await candidate.disposeAdapter?.(created)\n }\n : undefined,\n })\n const recovered = await runBoundedMemoryLifecycle({\n operation: `${candidate.id}: recovery adapter creation`,\n timeoutMs: cleanupTimeoutMs,\n abortController,\n run: () => creation,\n })\n await lease.assertOwned()\n if (recovered === null) return\n rawAdapter = recovered\n adapter = trackExternalMemoryCalls(recovered, onExternalCall)\n const recoveryDelayMs = memoryRecoveryDelayMs(adapter)\n await sleepForMemoryRecovery(\n recoveryDelayMs,\n () => lease.assertOwned(),\n cleanupTimeoutMs,\n `${candidate.id}: abandoned branch recovery visibility wait`,\n )\n if (cleanupBranches) {\n if (!adapter.clear) {\n throw new Error(\n `${candidate.id}: abandoned branch recovery requires an adapter with scoped clear support`,\n )\n }\n memory = createAgentMemoryBranch({\n adapter,\n branchId: attempt.branchId,\n lifetime: 'attempt',\n policy: candidate.policy,\n allowedWriteScopes: sequenceCleanupScopes(sequence),\n baseScope: memoryExperimentBaseScope(options, candidate, sequence.id),\n })\n await runBoundedMemoryLifecycle({\n operation: `${candidate.id}: abandoned branch cleanup`,\n timeoutMs: cleanupTimeoutMs,\n resource: adapter,\n run: () => clearSequenceScopes(memory!, sequence),\n })\n await lease.assertOwned()\n }\n } catch (error) {\n primaryError = error\n }\n\n const cleanupErrors: unknown[] = []\n let cleanupOwned = true\n try {\n await lease.assertOwned()\n } catch (error) {\n cleanupOwned = false\n cleanupErrors.push(error)\n }\n if (adapter) {\n try {\n await runBoundedMemoryLifecycle({\n operation: `${candidate.id}: recovery adapter close`,\n timeoutMs: cleanupTimeoutMs,\n resource: adapter,\n run: async () => {\n if (memory && cleanupOwned) {\n await memory.close?.()\n } else {\n if (cleanupOwned && adapter!.flush) {\n await adapter!.flush()\n }\n await adapter!.close?.()\n }\n },\n })\n } catch (error) {\n cleanupErrors.push(error)\n }\n if (cleanupOwned) {\n try {\n if (candidate.disposeAdapter) onExternalCall()\n await runBoundedMemoryLifecycle({\n operation: `${candidate.id}: recovery adapter disposal`,\n timeoutMs: cleanupTimeoutMs,\n resource: adapter,\n run: () => candidate.disposeAdapter?.(rawAdapter!),\n })\n } catch (error) {\n cleanupErrors.push(error)\n }\n }\n } else {\n cleanupErrors.push(\n new Error(\n `${candidate.id}: recovery adapter creation failed before cleanup could be confirmed`,\n ),\n )\n }\n if (!cleanupOwned || primaryError || cleanupErrors.length > 0) {\n throw new AgentMemoryCleanupError(\n [...(primaryError ? [primaryError] : []), ...cleanupErrors],\n `${candidate.id}: abandoned memory branch '${attempt.branchId}' recovery failed`,\n )\n }\n}\n\nexport function memoryAttemptCostCallId(\n attempt: AgentMemoryAttemptEvent,\n purpose: 'execute' | 'recovery',\n generation: number,\n): string {\n return stableId(\n 'memory_cost_call',\n canonicalJson({\n purpose,\n generation,\n branchId: attempt.branchId,\n candidateId: attempt.candidateId,\n candidateRef: attempt.candidateRef,\n externalCostUsdPerSequence: attempt.externalCostUsdPerSequence,\n externalRecoveryCostUsdPerAttempt: attempt.externalRecoveryCostUsdPerAttempt,\n sequenceId: attempt.sequenceId,\n rep: attempt.rep,\n seed: attempt.seed,\n }),\n )\n}\n\nfunction memoryRecoveryCostTags(\n runDir: string,\n candidateId: string,\n branchId: string,\n): Record<string, string> {\n return {\n runDir,\n candidateId,\n branchId,\n memoryRecovery: 'attempt',\n }\n}\n\nexport function memoryAttemptEvent(input: {\n status: AgentMemoryAttemptEvent['status']\n branchId: string\n candidate: AgentMemoryExperimentCandidate\n sequence: AgentMemorySequence\n rep: number\n seed: number\n recovery: boolean\n cleanupBranches?: boolean\n now?: () => Date\n}): AgentMemoryAttemptEvent {\n return {\n status: input.status,\n branchId: input.branchId,\n candidateId: input.candidate.id,\n candidateRef: input.candidate.ref,\n sequenceId: input.sequence.id,\n rep: input.rep,\n seed: input.seed,\n cleanupBranches: input.cleanupBranches ?? true,\n externalCostUsdPerSequence: input.candidate.externalCostUsdPerSequence ?? 0,\n externalRecoveryCostUsdPerAttempt: input.candidate.externalRecoveryCostUsdPerAttempt ?? 0,\n recordedAt: (input.now ?? (() => new Date()))().toISOString(),\n recovery: input.recovery,\n }\n}\n\nexport function appendMemoryAttemptEvent(\n storage: CampaignStorage,\n path: string,\n event: AgentMemoryAttemptEvent,\n): void {\n appendAttemptJournalEvent({\n storage,\n path,\n event,\n label: 'memory attempt log',\n })\n}\n\nfunction readActiveMemoryAttempts(\n storage: CampaignStorage,\n path: string,\n): AgentMemoryAttemptEvent[] {\n return readActiveAttemptJournal({\n storage,\n path,\n label: 'memory attempt log',\n parse: parseMemoryAttemptEvent,\n id: (event) => event.branchId,\n sameAttempt: sameMemoryAttempt,\n })\n}\n\nfunction parseMemoryAttemptEvent(\n value: unknown,\n path: string,\n line: number,\n): AgentMemoryAttemptEvent {\n const event = value as Partial<AgentMemoryAttemptEvent> | null\n const valid =\n typeof event === 'object' &&\n event !== null &&\n (event.status === 'started' || event.status === 'cleaned') &&\n typeof event.branchId === 'string' &&\n event.branchId.length > 0 &&\n typeof event.candidateId === 'string' &&\n event.candidateId.length > 0 &&\n typeof event.candidateRef === 'string' &&\n event.candidateRef.length > 0 &&\n typeof event.sequenceId === 'string' &&\n event.sequenceId.length > 0 &&\n Number.isSafeInteger(event.rep) &&\n Number.isSafeInteger(event.seed) &&\n typeof event.cleanupBranches === 'boolean' &&\n typeof event.externalCostUsdPerSequence === 'number' &&\n Number.isFinite(event.externalCostUsdPerSequence) &&\n event.externalCostUsdPerSequence >= 0 &&\n typeof event.externalRecoveryCostUsdPerAttempt === 'number' &&\n Number.isFinite(event.externalRecoveryCostUsdPerAttempt) &&\n event.externalRecoveryCostUsdPerAttempt >= 0 &&\n typeof event.recordedAt === 'string' &&\n !Number.isNaN(Date.parse(event.recordedAt)) &&\n typeof event.recovery === 'boolean'\n if (!valid) throw new Error(`invalid memory attempt event in '${path}' line ${line}`)\n return value as AgentMemoryAttemptEvent\n}\n\nfunction sameMemoryAttempt(left: AgentMemoryAttemptEvent, right: AgentMemoryAttemptEvent): boolean {\n return (\n left.branchId === right.branchId &&\n left.candidateId === right.candidateId &&\n left.candidateRef === right.candidateRef &&\n left.sequenceId === right.sequenceId &&\n left.rep === right.rep &&\n left.seed === right.seed &&\n left.cleanupBranches === right.cleanupBranches &&\n left.externalCostUsdPerSequence === right.externalCostUsdPerSequence &&\n left.externalRecoveryCostUsdPerAttempt === right.externalRecoveryCostUsdPerAttempt\n )\n}\n\nfunction assertMemoryAttemptCandidateMatches(\n attempt: AgentMemoryAttemptEvent,\n candidate: AgentMemoryExperimentCandidate,\n): void {\n if (candidate.ref !== attempt.candidateRef) {\n throw new Error(\n `cannot recover memory branch '${attempt.branchId}': candidate ref changed from '${attempt.candidateRef}' to '${candidate.ref}'`,\n )\n }\n const executionCost = candidate.externalCostUsdPerSequence ?? 0\n const recoveryCost = candidate.externalRecoveryCostUsdPerAttempt ?? 0\n if (\n executionCost !== attempt.externalCostUsdPerSequence ||\n recoveryCost !== attempt.externalRecoveryCostUsdPerAttempt\n ) {\n throw new Error(\n `cannot recover memory branch '${attempt.branchId}': candidate cost settings changed; start a new run or restore the recorded costs`,\n )\n }\n}\n","import type { AgentMemoryBranch } from '../branch'\nimport type { AgentMemoryAdapter, AgentMemoryScope } from '../types'\nimport type {\n AgentMemoryExperimentCandidate,\n AgentMemorySequence,\n RunAgentMemoryExperimentOptions,\n} from './types'\nimport { normalizeCleanupScope } from './validation'\n\nexport class AgentMemoryCleanupError extends AggregateError {\n constructor(errors: Iterable<unknown>, message: string) {\n super(errors, message)\n this.name = 'AgentMemoryCleanupError'\n }\n}\n\nexport function trackExternalMemoryCalls(\n adapter: AgentMemoryAdapter,\n onExternalCall: () => void,\n): AgentMemoryAdapter {\n return {\n id: adapter.id,\n branchIsolation: adapter.branchIsolation,\n search(query, options) {\n onExternalCall()\n return adapter.search.call(adapter, query, options)\n },\n getContext(query, options) {\n onExternalCall()\n return adapter.getContext.call(adapter, query, options)\n },\n write(input) {\n onExternalCall()\n return adapter.write.call(adapter, input)\n },\n ...(adapter.clear\n ? {\n clear(scope?: AgentMemoryScope) {\n onExternalCall()\n return adapter.clear!.call(adapter, scope)\n },\n }\n : {}),\n ...(adapter.flush\n ? {\n flush() {\n onExternalCall()\n return adapter.flush!.call(adapter)\n },\n }\n : {}),\n ...(adapter.close\n ? {\n close() {\n onExternalCall()\n return adapter.close!.call(adapter)\n },\n }\n : {}),\n }\n}\n\nexport function mergeScopes(base?: AgentMemoryScope, extra?: AgentMemoryScope): AgentMemoryScope {\n return {\n ...(base ?? {}),\n ...(extra ?? {}),\n tags: { ...(base?.tags ?? {}), ...(extra?.tags ?? {}) },\n }\n}\n\nexport function memoryExperimentBaseScope(\n options: Pick<RunAgentMemoryExperimentOptions, 'experimentId'>,\n candidate: Pick<AgentMemoryExperimentCandidate, 'id' | 'baseScope'>,\n sequenceId: string,\n): AgentMemoryScope {\n return mergeScopes(candidate.baseScope, {\n tags: {\n memoryExperimentId: options.experimentId,\n memoryCandidateId: candidate.id,\n memorySequenceId: sequenceId,\n },\n })\n}\n\nexport function sequenceCleanupScopes(sequence: AgentMemorySequence): AgentMemoryScope[] {\n const scopes = new Map<string, AgentMemoryScope>()\n for (const scope of sequence.cleanupScopes ?? []) {\n const normalized = normalizeCleanupScope(scope)\n scopes.set(JSON.stringify(normalized), normalized)\n }\n for (const step of sequence.steps) {\n const candidates = [\n ...(step.scope ? [step.scope] : []),\n ...(step.writes ?? []).map((write) => mergeScopes(step.scope, write.scope)),\n ...(step.probes ?? []).map((probe) => mergeScopes(step.scope, probe.scope)),\n ]\n for (const scope of candidates) {\n const normalized = normalizeCleanupScope(scope)\n scopes.set(JSON.stringify(normalized), normalized)\n }\n }\n return [...scopes.values()]\n}\n\nexport async function clearSequenceScopes(\n memory: AgentMemoryBranch,\n sequence: AgentMemorySequence,\n): Promise<void> {\n for (const scope of sequenceCleanupScopes(sequence)) await memory.clear?.(scope)\n}\n","import { randomUUID } from 'node:crypto'\nimport { canonicalJson } from '@tangle-network/agent-eval'\nimport { sha256, stableId } from '../ids'\nimport { defaultGetMemoryContext } from './adapter'\nimport { mergeRankedMemoryHits } from './rank'\nimport { memoryWriteResultToSourceRecord } from './source-record'\nimport type { AgentMemoryAdapter, AgentMemoryHit, AgentMemoryScope } from './types'\n\nexport interface GraphitiMcpClientLike {\n callTool(request: { name: string; arguments?: Record<string, unknown> }): Promise<unknown>\n}\n\nexport interface GraphitiMemoryAdapterOptions {\n client: GraphitiMcpClientLike\n id?: string\n /** Stable server/deployment identity for cache-key helpers. Never put credentials here. */\n backendRef?: string\n defaultScope?: AgentMemoryScope\n consistency?: 'queued' | 'visible'\n ingestionTimeoutMs?: number\n pollIntervalMs?: number\n /** Maximum episodes inspected to prove a queued write became visible. */\n episodeScanLimit?: number\n provenanceEpisodeLimit?: number\n search?: readonly ('facts' | 'nodes')[]\n toolNames?: Partial<GraphitiToolNames>\n}\n\nexport interface GraphitiToolNames {\n addMemory: string\n searchFacts: string\n searchNodes: string\n getEpisodes: string\n clearGraph: string\n}\n\ninterface GraphitiEpisode {\n uuid: string\n name?: string\n content?: string\n source_description?: string\n group_id?: string\n}\n\nconst DEFAULT_GRAPHITI_INGESTION_TIMEOUT_MS = 120_000\n\n/** Connects the official Graphiti MCP server without coupling to its Python internals. */\nexport function createGraphitiMemoryAdapter(\n options: GraphitiMemoryAdapterOptions,\n): AgentMemoryAdapter {\n assertGraphitiOptions(options)\n const id = options.id ?? 'graphiti'\n const consistency = options.consistency ?? 'visible'\n const tools = graphitiToolNames(options)\n const queued = new Map<string, { groupId: string; name: string }>()\n\n const adapter: AgentMemoryAdapter = {\n id,\n branchIsolation:\n consistency === 'visible'\n ? {\n mode: 'scoped',\n processExitSafe: false,\n recoveryDelayMs: options.ingestionTimeoutMs ?? DEFAULT_GRAPHITI_INGESTION_TIMEOUT_MS,\n }\n : {\n mode: 'unsupported',\n reason:\n 'queued Graphiti writes can become visible after a process restart; use consistency=\"visible\" for branch experiments',\n },\n async search(query, searchOptions = {}) {\n if (searchOptions.minScore !== undefined && !Number.isFinite(searchOptions.minScore)) {\n throw new Error(`${id}: minScore must be finite`)\n }\n const scope = mergeScopes(options.defaultScope, searchOptions.scope)\n const groupId = graphitiGroupId(id, scope)\n const modes = new Set(options.search ?? ['facts', 'nodes'])\n const kinds =\n searchOptions.kinds && searchOptions.kinds.length > 0 ? new Set(searchOptions.kinds) : null\n const searchFacts = modes.has('facts') && (!kinds || kinds.has('fact'))\n const searchNodes = modes.has('nodes') && (!kinds || kinds.has('entity'))\n const limit = searchOptions.limit ?? 10\n if (!Number.isSafeInteger(limit) || limit < 0) {\n throw new Error(`${id}: search limit must be a non-negative safe integer`)\n }\n if (limit === 0) return []\n const [factPayload, nodePayload] = await Promise.all([\n searchFacts\n ? callGraphiti(options.client, tools.searchFacts, {\n query,\n group_ids: [groupId],\n max_facts: limit,\n })\n : undefined,\n searchNodes\n ? callGraphiti(options.client, tools.searchNodes, {\n query,\n group_ids: [groupId],\n max_nodes: limit,\n ...(searchOptions.metadata?.entityTypes\n ? { entity_types: searchOptions.metadata.entityTypes }\n : {}),\n })\n : undefined,\n ])\n const hits = mergeRankedMemoryHits(\n [normalizeGraphitiFacts(factPayload, id), normalizeGraphitiNodes(nodePayload, id)].map(\n (group) =>\n group.filter((hit) => {\n if (searchOptions.minScore === undefined) return true\n const score = hit.normalizedScore ?? hit.score\n return score !== undefined && score >= searchOptions.minScore\n }),\n ),\n limit,\n )\n await enrichGraphitiProvenance(options, groupId, hits)\n return hits\n },\n async getContext(query, searchOptions = {}) {\n return defaultGetMemoryContext(adapter, query, searchOptions)\n },\n async write(input) {\n const scope = mergeScopes(options.defaultScope, input.scope)\n const groupId = graphitiGroupId(id, scope)\n const eventKey = canonicalJson(\n stripUndefined({\n id: input.id,\n kind: input.kind,\n text: input.text,\n title: input.title,\n role: input.role,\n metadata: input.metadata,\n }),\n )\n const episodeUuid =\n input.id === undefined ? randomUUID() : deterministicUuid(`${id}:${groupId}:${eventKey}`)\n const name = input.title ?? `${input.kind}:${input.id ?? stableId('event', eventKey)}`\n const sourceDescription = canonicalJson(\n stripUndefined({\n adapter: 'agent-knowledge',\n memoryKind: input.kind,\n eventId: input.id,\n actorId: input.metadata?.actorId,\n sessionId: scope.sessionId,\n role: input.role,\n scope,\n metadata: input.metadata ?? {},\n }),\n )\n await callGraphiti(options.client, tools.addMemory, {\n name,\n episode_body: input.text,\n group_id: groupId,\n source: input.kind === 'message' ? 'message' : 'text',\n source_description: sourceDescription,\n uuid: episodeUuid,\n ...(typeof input.metadata?.timestamp === 'string'\n ? { reference_time: input.metadata.timestamp }\n : {}),\n })\n queued.set(episodeUuid, { groupId, name })\n if (consistency === 'visible') {\n await waitForGraphitiEpisode(options, groupId, episodeUuid)\n queued.delete(episodeUuid)\n }\n const result = {\n accepted: true,\n id: episodeUuid,\n uri: `memory://${id}/${episodeUuid}`,\n kind: input.kind,\n metadata: {\n provider: 'graphiti',\n groupId,\n consistency,\n queued: consistency === 'queued',\n },\n } as const\n return {\n ...result,\n sourceRecord: memoryWriteResultToSourceRecord(result, input.text, { scope }),\n }\n },\n async clear(scope) {\n const groupId = graphitiGroupId(id, mergeScopes(options.defaultScope, scope))\n for (const [episodeUuid, pending] of queued) {\n if (pending.groupId !== groupId) continue\n await waitForGraphitiEpisode(options, groupId, episodeUuid)\n queued.delete(episodeUuid)\n }\n await callGraphiti(options.client, tools.clearGraph, { group_ids: [groupId] })\n },\n async flush() {\n for (const [episodeUuid, pending] of queued) {\n await waitForGraphitiEpisode(options, pending.groupId, episodeUuid)\n queued.delete(episodeUuid)\n }\n },\n }\n return adapter\n}\n\nasync function callGraphiti(\n client: GraphitiMcpClientLike,\n name: string,\n args: Record<string, unknown>,\n): Promise<unknown> {\n const raw = await client.callTool({ name, arguments: args })\n const payload = graphitiPayload(raw)\n if (isRecord(payload) && typeof payload.error === 'string') {\n throw new Error(`Graphiti ${name}: ${payload.error}`)\n }\n return payload\n}\n\nfunction graphitiPayload(raw: unknown): unknown {\n if (!isRecord(raw)) return raw\n if (raw.isError === true) throw new Error(`Graphiti MCP: ${toolText(raw) || 'tool call failed'}`)\n if (isRecord(raw.structuredContent)) return unwrapResult(raw.structuredContent)\n const text = toolText(raw)\n if (text) {\n try {\n return unwrapResult(JSON.parse(text))\n } catch {\n return { message: text }\n }\n }\n return unwrapResult(raw)\n}\n\nfunction unwrapResult(value: unknown): unknown {\n if (isRecord(value) && Object.keys(value).length === 1 && 'result' in value) {\n return value.result\n }\n return value\n}\n\nfunction toolText(raw: Record<string, unknown>): string {\n if (!Array.isArray(raw.content)) return ''\n return raw.content\n .filter(isRecord)\n .map((part) => (typeof part.text === 'string' ? part.text : ''))\n .filter(Boolean)\n .join('\\n')\n}\n\nfunction normalizeGraphitiFacts(raw: unknown, adapterId: string): AgentMemoryHit[] {\n const facts = isRecord(raw) && Array.isArray(raw.facts) ? raw.facts.filter(isRecord) : []\n return facts.flatMap((fact) => {\n const text = stringField(fact, ['fact', 'text'])\n if (!text) return []\n const factId =\n stringField(fact, ['uuid', 'id']) ??\n stableId('fact', canonicalJson(stripUndefined({ adapterId, text, fact })))\n const episodeUuids = stringArray(fact.episodes ?? fact.episode_uuids)\n const score = numberField(fact, ['score', 'relevance_score'])\n const normalizedScore = normalizedScoreOf(score)\n return [\n {\n id: factId,\n uri: `memory://${adapterId}/fact/${factId}`,\n kind: 'fact' as const,\n text,\n ...(stringField(fact, ['name']) ? { title: stringField(fact, ['name']) } : {}),\n ...(stringField(fact, ['created_at'])\n ? { createdAt: stringField(fact, ['created_at']) }\n : {}),\n ...(stringField(fact, ['invalid_at'])\n ? { validUntil: stringField(fact, ['invalid_at']) }\n : stringField(fact, ['expired_at'])\n ? { validUntil: stringField(fact, ['expired_at']) }\n : {}),\n ...(score !== undefined ? { score } : {}),\n ...(normalizedScore !== undefined ? { normalizedScore } : {}),\n metadata: {\n provider: 'graphiti',\n groupId: fact.group_id,\n sourceNodeUuid: fact.source_node_uuid,\n targetNodeUuid: fact.target_node_uuid,\n validAt: fact.valid_at,\n invalidAt: fact.invalid_at,\n episodeUuids,\n attributes: fact.attributes,\n },\n },\n ]\n })\n}\n\nfunction normalizeGraphitiNodes(raw: unknown, adapterId: string): AgentMemoryHit[] {\n const nodes = isRecord(raw) && Array.isArray(raw.nodes) ? raw.nodes.filter(isRecord) : []\n return nodes.flatMap((node) => {\n const name = stringField(node, ['name'])\n const summary = stringField(node, ['summary'])\n const text = summary ?? name\n if (!text) return []\n const nodeId =\n stringField(node, ['uuid', 'id']) ??\n stableId('node', canonicalJson(stripUndefined({ adapterId, text, node })))\n const score = numberField(node, ['score', 'relevance_score'])\n const normalizedScore = normalizedScoreOf(score)\n return [\n {\n id: nodeId,\n uri: `memory://${adapterId}/entity/${nodeId}`,\n kind: 'entity' as const,\n text,\n ...(name ? { title: name } : {}),\n ...(stringField(node, ['created_at'])\n ? { createdAt: stringField(node, ['created_at']) }\n : {}),\n ...(score !== undefined ? { score } : {}),\n ...(normalizedScore !== undefined ? { normalizedScore } : {}),\n metadata: {\n provider: 'graphiti',\n groupId: node.group_id,\n labels: node.labels,\n attributes: node.attributes,\n },\n },\n ]\n })\n}\n\nasync function enrichGraphitiProvenance(\n options: GraphitiMemoryAdapterOptions,\n groupId: string,\n hits: AgentMemoryHit[],\n): Promise<void> {\n const wanted = new Set(hits.flatMap((hit) => stringArray(hit.metadata?.episodeUuids)))\n if (wanted.size === 0) return\n const scan = await scanGraphitiEpisodes(\n options,\n groupId,\n wanted,\n options.provenanceEpisodeLimit ?? options.episodeScanLimit ?? 10_000,\n )\n const episodes = scan.episodes\n const byId = new Map(episodes.map((episode) => [episode.uuid, episode]))\n for (const hit of hits) {\n const episodeUuids = stringArray(hit.metadata?.episodeUuids)\n const sourceEpisodes = episodeUuids\n .map((uuid) => byId.get(uuid))\n .filter((episode): episode is GraphitiEpisode => episode !== undefined)\n const provenanceIncomplete = episodeUuids.some((uuid) => !byId.has(uuid))\n if (sourceEpisodes.length === 0) {\n if (provenanceIncomplete) {\n hit.metadata = { ...hit.metadata, provenanceIncomplete: true }\n }\n continue\n }\n const descriptions = sourceEpisodes\n .map((episode) => parseDescription(episode.source_description))\n .filter(isRecord)\n const first = descriptions[0]\n hit.metadata = {\n ...hit.metadata,\n sourceEpisodes,\n ...(provenanceIncomplete || !scan.complete ? { provenanceIncomplete: true } : {}),\n ...(first ?? {}),\n eventIds: uniqueStrings(descriptions.map((value) => value.eventId)),\n actorIds: uniqueStrings(descriptions.map((value) => value.actorId)),\n ...(typeof first?.eventId === 'string' ? { eventId: first.eventId } : {}),\n ...(typeof first?.actorId === 'string' ? { actorId: first.actorId } : {}),\n }\n }\n}\n\nasync function getGraphitiEpisodes(\n options: GraphitiMemoryAdapterOptions,\n groupId: string,\n limit: number,\n): Promise<GraphitiEpisode[]> {\n const raw = await callGraphiti(options.client, graphitiToolNames(options).getEpisodes, {\n group_ids: [groupId],\n max_episodes: limit,\n })\n if (!isRecord(raw) || !Array.isArray(raw.episodes)) return []\n return raw.episodes.filter(isRecord).flatMap((episode) => {\n const uuid = stringField(episode, ['uuid', 'id'])\n return uuid ? [{ ...episode, uuid } as GraphitiEpisode] : []\n })\n}\n\nasync function scanGraphitiEpisodes(\n options: GraphitiMemoryAdapterOptions,\n groupId: string,\n wanted: ReadonlySet<string>,\n maximum: number,\n): Promise<{ episodes: GraphitiEpisode[]; complete: boolean }> {\n let limit = Math.min(100, maximum)\n for (;;) {\n const episodes = await getGraphitiEpisodes(options, groupId, limit)\n const foundAll = [...wanted].every((uuid) => episodes.some((episode) => episode.uuid === uuid))\n if (foundAll || episodes.length < limit) return { episodes, complete: foundAll }\n if (limit === maximum) return { episodes, complete: false }\n limit = Math.min(maximum, limit * 2)\n }\n}\n\nasync function waitForGraphitiEpisode(\n options: GraphitiMemoryAdapterOptions,\n groupId: string,\n episodeUuid: string,\n): Promise<void> {\n const timeoutMs = options.ingestionTimeoutMs ?? DEFAULT_GRAPHITI_INGESTION_TIMEOUT_MS\n const pollIntervalMs = options.pollIntervalMs ?? 500\n const maximum = options.episodeScanLimit ?? 10_000\n const deadline = Date.now() + timeoutMs\n let scanLimitReached = false\n for (;;) {\n const scan = await scanGraphitiEpisodes(options, groupId, new Set([episodeUuid]), maximum)\n if (scan.complete) return\n scanLimitReached ||= scan.episodes.length >= maximum\n const remainingMs = deadline - Date.now()\n if (remainingMs <= 0) break\n await new Promise((resolve) => setTimeout(resolve, Math.min(pollIntervalMs, remainingMs)))\n }\n if (scanLimitReached) {\n throw new Error(\n `Graphiti episode ${episodeUuid} is outside episodeScanLimit=${maximum}; raise the limit or use a smaller group`,\n )\n }\n throw new Error(`Graphiti episode ${episodeUuid} was not visible after ${timeoutMs}ms`)\n}\n\nfunction graphitiGroupId(adapterId: string, scope: AgentMemoryScope): string {\n return `ak_${sha256(\n canonicalJson(\n stripUndefined({\n adapterId,\n tenantId: scope.tenantId,\n userId: scope.userId,\n agentId: scope.agentId,\n teamId: scope.teamId,\n runId: scope.runId,\n sessionId: scope.sessionId,\n namespace: scope.namespace,\n tags: scope.tags,\n }),\n ),\n ).slice(0, 32)}`\n}\n\nfunction graphitiToolNames(options: GraphitiMemoryAdapterOptions): GraphitiToolNames {\n return {\n addMemory: options.toolNames?.addMemory ?? 'add_memory',\n searchFacts: options.toolNames?.searchFacts ?? 'search_memory_facts',\n searchNodes: options.toolNames?.searchNodes ?? 'search_nodes',\n getEpisodes: options.toolNames?.getEpisodes ?? 'get_episodes',\n clearGraph: options.toolNames?.clearGraph ?? 'clear_graph',\n }\n}\n\nfunction assertGraphitiOptions(options: GraphitiMemoryAdapterOptions): void {\n if (options.id !== undefined && (typeof options.id !== 'string' || !options.id.trim())) {\n throw new Error('Graphiti id must be a non-empty string')\n }\n if (\n options.backendRef !== undefined &&\n (typeof options.backendRef !== 'string' || !options.backendRef.trim())\n ) {\n throw new Error('Graphiti backendRef must be a non-empty string')\n }\n if (options.consistency !== undefined && !['queued', 'visible'].includes(options.consistency)) {\n throw new Error('Graphiti consistency must be queued or visible')\n }\n for (const [name, value] of [\n ['ingestionTimeoutMs', options.ingestionTimeoutMs],\n ['pollIntervalMs', options.pollIntervalMs],\n ['episodeScanLimit', options.episodeScanLimit],\n ['provenanceEpisodeLimit', options.provenanceEpisodeLimit],\n ] as const) {\n if (value !== undefined && (!Number.isSafeInteger(value) || value <= 0)) {\n throw new Error(`Graphiti ${name} must be a positive safe integer`)\n }\n }\n for (const [name, value] of Object.entries(options.toolNames ?? {})) {\n if (typeof value !== 'string' || value.trim().length === 0) {\n throw new Error(`Graphiti toolNames.${name} must be a non-empty string`)\n }\n }\n}\n\nfunction deterministicUuid(value: string): string {\n const hex = sha256(value)\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-5${hex.slice(13, 16)}-a${hex.slice(17, 20)}-${hex.slice(20, 32)}`\n}\n\nfunction parseDescription(value: string | undefined): unknown {\n if (!value) return undefined\n try {\n return JSON.parse(value)\n } catch {\n return undefined\n }\n}\n\nfunction mergeScopes(base?: AgentMemoryScope, extra?: AgentMemoryScope): AgentMemoryScope {\n return {\n ...(base ?? {}),\n ...(extra ?? {}),\n tags: { ...(base?.tags ?? {}), ...(extra?.tags ?? {}) },\n }\n}\n\nfunction uniqueStrings(values: unknown[]): string[] {\n return [...new Set(values.filter((value): value is string => typeof value === 'string'))]\n}\n\nfunction stringArray(value: unknown): string[] {\n return Array.isArray(value)\n ? value.filter((entry): entry is string => typeof entry === 'string')\n : []\n}\n\nfunction stringField(value: Record<string, unknown>, keys: readonly string[]): string | undefined {\n for (const key of keys) {\n const field = value[key]\n if (typeof field === 'string' && field.length > 0) return field\n }\n return undefined\n}\n\nfunction numberField(value: Record<string, unknown>, keys: readonly string[]): number | undefined {\n for (const key of keys) {\n const field = value[key]\n if (typeof field === 'number' && Number.isFinite(field)) return field\n }\n return undefined\n}\n\nfunction normalizedScoreOf(score: number | undefined): number | undefined {\n return score !== undefined && score >= 0 && score <= 1 ? score : undefined\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction stripUndefined(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(stripUndefined)\n if (!isRecord(value)) return value\n return Object.fromEntries(\n Object.entries(value)\n .filter(([, child]) => child !== undefined)\n .map(([key, child]) => [key, stripUndefined(child)]),\n )\n}\n\nexport function graphitiMemoryAdapterIdentity(\n options: Pick<\n GraphitiMemoryAdapterOptions,\n | 'id'\n | 'consistency'\n | 'ingestionTimeoutMs'\n | 'pollIntervalMs'\n | 'episodeScanLimit'\n | 'provenanceEpisodeLimit'\n | 'search'\n | 'toolNames'\n | 'defaultScope'\n > & { backendRef: string },\n): string {\n if (typeof options.backendRef !== 'string' || !options.backendRef.trim()) {\n throw new Error('Graphiti backendRef must be a non-empty string')\n }\n return `sha256:${sha256(canonicalJson(stripUndefined(options)))}`\n}\n","import { join } from 'node:path'\nimport { canonicalJson } from '@tangle-network/agent-eval'\nimport {\n type CampaignStorage,\n fsCampaignStorage,\n resolveRunDir,\n surfaceHash,\n} from '@tangle-network/agent-eval/campaign'\nimport type { AgentCandidateJsonValue as JsonValue } from '@tangle-network/agent-interface'\nimport { runSerializedKnowledgeOptimization } from '../../optimization'\nimport {\n type AgentMemoryExperimentCandidate,\n type AgentMemorySequenceArtifact,\n agentMemorySequenceJudge,\n} from '../experiment'\nimport { acquireAgentMemoryRunLease } from '../run-control'\nimport {\n activateMemoryWinner,\n assertActivatedMemoryWinner,\n readMemoryActivationJournal,\n} from './activation'\nimport { buildRegisteredCandidate } from './candidate'\nimport {\n evaluateMemoryCandidate,\n loadFinalEvaluation,\n memoryArtifactPath,\n memoryConfigCodec,\n memoryConfigScenarios,\n} from './evaluation'\nimport {\n assertMemoryConfigRoundTrip,\n assertMemoryImprovementIdentity,\n memorySequenceFingerprint,\n} from './identity'\nimport { writeMemoryImprovementResult } from './output'\nimport { decidePromotion, normalizedPromotionPolicy } from './promotion'\nimport type {\n AgentMemoryActivation,\n MemoryConfigScenario,\n OwnedRunLease,\n RunAgentMemoryImprovementOptions,\n RunAgentMemoryImprovementResult,\n} from './types'\nimport { assertMemoryImprovementOptions } from './validation'\n\n/** Optimizes memory configuration with an external method and activates only a fresh final win. */\nexport async function runAgentMemoryImprovement<TConfig extends JsonValue>(\n options: RunAgentMemoryImprovementOptions<TConfig>,\n): Promise<RunAgentMemoryImprovementResult<TConfig>> {\n assertMemoryImprovementOptions(options)\n const storage = options.storage ?? fsCampaignStorage()\n const runDir = resolveRunDir(options.runDir, options.repo)\n storage.ensureDir(runDir)\n const lease = await acquireAgentMemoryRunLease({\n experimentId: options.experimentId,\n runDir,\n storage,\n customStorage: options.storage !== undefined,\n lockFileName: 'memory-improvement.lock',\n label: 'memory improvement',\n controllerMode: options.controllerMode,\n acquireRunLease: options.acquireRunLease,\n })\n let result: RunAgentMemoryImprovementResult<TConfig> | undefined\n let primaryError: unknown\n try {\n result = await runAgentMemoryImprovementOwned(options, storage, runDir, lease)\n } catch (error) {\n primaryError = error\n }\n let releaseError: unknown\n try {\n await lease.release()\n } catch (error) {\n releaseError = error\n }\n if (primaryError && releaseError) {\n throw new AggregateError(\n [primaryError, releaseError],\n 'memory improvement failed and its controller lease could not be released',\n )\n }\n if (primaryError) throw primaryError\n if (releaseError) throw releaseError\n if (!result) throw new Error('memory improvement produced no result')\n return result\n}\n\nasync function runAgentMemoryImprovementOwned<TConfig extends JsonValue>(\n options: RunAgentMemoryImprovementOptions<TConfig>,\n storage: CampaignStorage,\n runDir: string,\n lease: OwnedRunLease,\n): Promise<RunAgentMemoryImprovementResult<TConfig>> {\n await lease.assertOwned()\n const codec = memoryConfigCodec(options)\n assertMemoryConfigRoundTrip(options.baselineConfig, codec.serialize, codec.parse)\n if (options.activation && !storage.append) {\n throw new Error('memory activation requires CampaignStorage.append')\n }\n assertMemoryImprovementIdentity(options, storage, runDir, codec.serialize)\n\n const trainScenarios = memoryConfigScenarios(options.trainSequences)\n const selectionScenarios = memoryConfigScenarios(options.selectionSequences)\n const finalScenarios = memoryConfigScenarios(options.finalSequences)\n const finalScenarioIds = new Set(finalScenarios.map((scenario) => scenario.id))\n const pending = new Map<string, Promise<AgentMemorySequenceArtifact>>()\n const candidates = new Map<string, Promise<AgentMemoryExperimentCandidate>>()\n const candidateFor = (config: TConfig, hash: string) => {\n let candidate = candidates.get(hash)\n if (!candidate) {\n candidate = buildRegisteredCandidate(options, storage, runDir, config, hash)\n candidates.set(hash, candidate)\n void candidate.catch(() => candidates.delete(hash))\n }\n return candidate\n }\n const optimizationRunOptions = {\n ...(options.optimizationRunOptions ?? {}),\n storage,\n ...(options.reps !== undefined ? { reps: options.reps } : {}),\n ...(options.resumable !== undefined ? { resumable: options.resumable } : {}),\n ...(options.sequenceConcurrency !== undefined\n ? { maxConcurrency: options.sequenceConcurrency }\n : {}),\n ...(options.dispatchTimeoutMs !== undefined\n ? { dispatchTimeoutMs: options.dispatchTimeoutMs }\n : {}),\n expectUsage: 'off' as const,\n }\n const optimization = await runSerializedKnowledgeOptimization({\n executionRef: options.implementationRef,\n baseline: options.baselineConfig,\n method: options.method,\n trainScenarios,\n selectionScenarios,\n finalScenarios,\n codec,\n scenarioFingerprint: (scenario) => memorySequenceFingerprint(scenario.sequence),\n dispatchCandidate: async ({ candidate, candidateSurfaceHash, scenario, context }) => {\n const key = memoryArtifactPath(\n runDir,\n candidateSurfaceHash,\n scenario,\n context.rep,\n context.seed,\n )\n let operation = pending.get(key)\n if (!operation) {\n operation = candidateFor(candidate, candidateSurfaceHash).then((builtCandidate) =>\n evaluateMemoryCandidate({\n options,\n storage,\n runDir,\n lease,\n candidate: builtCandidate,\n surfaceHash: candidateSurfaceHash,\n scenario,\n rep: context.rep,\n seed: context.seed,\n final: finalScenarioIds.has(scenario.id),\n cost: context.cost,\n signal: context.signal,\n }),\n )\n pending.set(key, operation)\n void operation.catch(() => pending.delete(key))\n }\n return operation\n },\n judges: [agentMemorySequenceJudge<MemoryConfigScenario>()],\n runDir,\n repo: options.repo,\n storage,\n seed: options.seed,\n reps: options.reps,\n resumable: options.resumable,\n costCeiling: options.maxTotalCostUsd ?? 0,\n maxConcurrency: options.sequenceConcurrency,\n dispatchTimeoutMs: options.dispatchTimeoutMs,\n expectUsage: 'off',\n optimizationRunOptions,\n now: options.now,\n })\n await lease.assertOwned()\n const [baselineCandidate, winnerCandidate] = await Promise.all([\n candidateFor(optimization.baseline.value, optimization.baseline.surfaceHash),\n candidateFor(optimization.winner.value, optimization.winner.surfaceHash),\n ])\n\n const finalEvaluation = loadFinalEvaluation({\n options,\n storage,\n runDir,\n baselineSurfaceHash: optimization.baseline.surfaceHash,\n baselineCandidateRef: baselineCandidate.ref,\n winnerSurfaceHash: optimization.winner.surfaceHash,\n winnerCandidateRef: winnerCandidate.ref,\n })\n const unchanged = optimization.baseline.surfaceHash === optimization.winner.surfaceHash\n const decision = decidePromotion({ options, optimization, finalEvaluation, unchanged })\n const resultJsonPath = join(runDir, 'memory-improvement-result.json')\n const activationRef = options.activation?.ref ?? 'not-configured'\n const activationId = `memory-activation-${surfaceHash(\n canonicalJson({\n experimentId: options.experimentId,\n implementationRef: options.implementationRef,\n method: optimization.methodName,\n activationRef,\n baselineSurfaceHash: optimization.baseline.surfaceHash,\n winnerSurfaceHash: optimization.winner.surfaceHash,\n finalEvaluationHash: finalEvaluation.manifestHash,\n promotionPolicy: normalizedPromotionPolicy(options),\n }),\n )}`\n const activationJournalDir = join(runDir, 'activations')\n const activationJournalPath = join(activationJournalDir, `${activationId}.jsonl`)\n const activationEligible = decision.status === 'promote'\n const activationEventIdentity = {\n activationId,\n experimentId: options.experimentId,\n activationRef,\n baselineSurfaceHash: optimization.baseline.surfaceHash,\n winnerSurfaceHash: optimization.winner.surfaceHash,\n finalEvaluationHash: finalEvaluation.manifestHash,\n }\n const activationJournal = activationEligible\n ? readMemoryActivationJournal(storage, activationJournalPath, activationEventIdentity)\n : { prepared: false }\n const activation: AgentMemoryActivation = {\n id: activationId,\n status: !activationEligible\n ? 'not-eligible'\n : activationJournal.activated\n ? 'already-activated'\n : options.activation\n ? 'pending'\n : 'not-configured',\n journalPath: activationJournalPath,\n }\n const result = {\n optimization,\n baselineConfig: optimization.baseline.value,\n winnerConfig: optimization.winner.value,\n baselineSurface: optimization.baseline.surface,\n winnerSurface: optimization.winner.surface,\n baselineSurfaceHash: optimization.baseline.surfaceHash,\n winnerSurfaceHash: optimization.winner.surfaceHash,\n decision,\n finalEvaluation,\n activation,\n totalCostUsd: optimization.comparison.totalCost.totalCostUsd,\n resultJsonPath,\n } satisfies RunAgentMemoryImprovementResult<TConfig>\n await lease.assertOwned()\n if (activationJournal.activated) {\n await assertActivatedMemoryWinner({ options, lease, result })\n }\n writeMemoryImprovementResult(storage, options.experimentId, result)\n\n if (activationEligible && !activationJournal.activated && options.activation) {\n await activateMemoryWinner({\n options,\n storage,\n lease,\n result,\n activationEventIdentity,\n activationJournalDir,\n activationJournalPath,\n hadPreparedEvent: activationJournal.prepared,\n })\n writeMemoryImprovementResult(storage, options.experimentId, result)\n }\n return result\n}\n","import { canonicalJson } from '@tangle-network/agent-eval'\nimport {\n type CompareOptimizationMethodsOptions,\n compareOptimizationMethods,\n type DispatchContext,\n type MutableSurface,\n type OptimizationMethod,\n type OptimizationMethodComparison,\n type OptimizationMethodRunOptions,\n type Scenario,\n surfaceHash,\n} from '@tangle-network/agent-eval/campaign'\nimport type { AgentCandidateJsonValue as JsonValue } from '@tangle-network/agent-interface'\nimport { assertImmutableRef } from './immutable-ref'\n\nexport interface SerializedCandidateCodec<TCandidate extends JsonValue> {\n serialize(candidate: TCandidate): string\n parse(surface: string): TCandidate\n}\n\nexport interface SerializedCandidate<TCandidate extends JsonValue> {\n value: TCandidate\n surface: string\n surfaceHash: string\n}\n\ntype ComparisonOptions<TScenario extends Scenario, TArtifact> = Omit<\n CompareOptimizationMethodsOptions<TScenario, TArtifact>,\n | 'methods'\n | 'baselineSurface'\n | 'trainScenarios'\n | 'selectionScenarios'\n | 'testScenarios'\n | 'dispatchWithSurface'\n | 'dispatchRef'\n | 'optimizationRunOptions'\n>\n\nexport interface RunSerializedKnowledgeOptimizationOptions<\n TCandidate extends JsonValue,\n TScenario extends Scenario,\n TArtifact,\n> extends ComparisonOptions<TScenario, TArtifact> {\n /** Immutable identity for candidate execution, judges, models, indexes, and external settings. */\n executionRef: string\n baseline: TCandidate\n method: OptimizationMethod<TScenario, TArtifact>\n trainScenarios: readonly TScenario[]\n selectionScenarios: readonly TScenario[]\n finalScenarios: readonly TScenario[]\n dispatchCandidate(input: {\n candidate: TCandidate\n candidateSurface: string\n candidateSurfaceHash: string\n scenario: TScenario\n context: DispatchContext\n }): Promise<TArtifact>\n codec?: SerializedCandidateCodec<TCandidate>\n /** Detects duplicated cases whose IDs differ within or across data partitions. */\n scenarioFingerprint?: (scenario: TScenario) => string\n optimizationRunOptions?: Omit<OptimizationMethodRunOptions<TScenario, TArtifact>, 'dispatchRef'>\n}\n\nexport interface RunSerializedKnowledgeOptimizationResult<TCandidate extends JsonValue> {\n methodName: string\n baseline: SerializedCandidate<TCandidate>\n winner: SerializedCandidate<TCandidate>\n comparison: OptimizationMethodComparison\n}\n\n/**\n * Runs one complete agent-eval method over a serialized knowledge candidate.\n * The method receives train and selection data; agent-eval owns final scoring.\n */\nexport async function runSerializedKnowledgeOptimization<\n TCandidate extends JsonValue,\n TScenario extends Scenario,\n TArtifact,\n>(\n options: RunSerializedKnowledgeOptimizationOptions<TCandidate, TScenario, TArtifact>,\n): Promise<RunSerializedKnowledgeOptimizationResult<TCandidate>> {\n assertCompleteOptimizationMethod(options.method)\n assertImmutableRef(options.executionRef, 'knowledge optimization executionRef')\n const codec = options.codec ?? jsonCandidateCodec<TCandidate>()\n const baseline = normalizeCandidate(options.baseline, codec, 'baseline')\n const dispatchRef = [\n 'knowledge-optimization',\n options.executionRef,\n baseline.surfaceHash,\n surfaceHash(options.method.name),\n ].join(':')\n assertPartitionContent(\n options.trainScenarios,\n options.selectionScenarios,\n options.finalScenarios,\n options.scenarioFingerprint ?? scenarioContentFingerprint,\n )\n\n const method = canonicalCandidateMethod(options.method, codec)\n const {\n baseline: _baseline,\n method: _method,\n trainScenarios,\n selectionScenarios,\n finalScenarios,\n dispatchCandidate,\n executionRef: _executionRef,\n codec: _codec,\n scenarioFingerprint: _scenarioFingerprint,\n ...comparisonOptions\n } = options\n const optimizationRunOptions = {\n ...(comparisonOptions.reps !== undefined ? { reps: comparisonOptions.reps } : {}),\n ...(comparisonOptions.resumable !== undefined\n ? { resumable: comparisonOptions.resumable }\n : {}),\n ...(comparisonOptions.labeledStore !== undefined\n ? { labeledStore: comparisonOptions.labeledStore }\n : {}),\n ...(comparisonOptions.captureSource !== undefined\n ? { captureSource: comparisonOptions.captureSource }\n : {}),\n ...(comparisonOptions.captureSourceVersionHash !== undefined\n ? { captureSourceVersionHash: comparisonOptions.captureSourceVersionHash }\n : {}),\n ...(comparisonOptions.maxConcurrency !== undefined\n ? { maxConcurrency: comparisonOptions.maxConcurrency }\n : {}),\n ...(comparisonOptions.dispatchTimeoutMs !== undefined\n ? { dispatchTimeoutMs: comparisonOptions.dispatchTimeoutMs }\n : {}),\n ...(comparisonOptions.repo !== undefined ? { repo: comparisonOptions.repo } : {}),\n ...(comparisonOptions.tracing !== undefined ? { tracing: comparisonOptions.tracing } : {}),\n ...(comparisonOptions.expectUsage !== undefined\n ? { expectUsage: comparisonOptions.expectUsage }\n : {}),\n ...(comparisonOptions.now !== undefined ? { now: comparisonOptions.now } : {}),\n ...(comparisonOptions.buildTraceWriter !== undefined\n ? { buildTraceWriter: comparisonOptions.buildTraceWriter }\n : {}),\n ...(comparisonOptions.storage !== undefined ? { storage: comparisonOptions.storage } : {}),\n ...(comparisonOptions.cellPlacement !== undefined\n ? { cellPlacement: comparisonOptions.cellPlacement }\n : {}),\n ...(comparisonOptions.optimizationRunOptions ?? {}),\n dispatchRef,\n }\n const comparison = await compareOptimizationMethods<TScenario, TArtifact>({\n ...comparisonOptions,\n dispatchRef,\n optimizationRunOptions,\n methods: [method],\n baselineSurface: baseline.surface,\n trainScenarios: trainScenarios.map((scenario) => structuredClone(scenario)),\n selectionScenarios: selectionScenarios.map((scenario) => structuredClone(scenario)),\n testScenarios: finalScenarios.map((scenario) => structuredClone(scenario)),\n dispatchWithSurface: async (surface, scenario, context) => {\n const candidate = normalizeSurface(surface, codec, 'candidate')\n return dispatchCandidate({\n candidate: structuredClone(candidate.value),\n candidateSurface: candidate.surface,\n candidateSurfaceHash: candidate.surfaceHash,\n scenario,\n context,\n })\n },\n })\n const winner = normalizeSurface(comparison.best.winnerSurface, codec, 'winner')\n return {\n methodName: options.method.name,\n baseline,\n winner,\n comparison,\n }\n}\n\nfunction assertCompleteOptimizationMethod(method: unknown): void {\n const candidate = method as { name?: unknown; optimize?: unknown } | null | undefined\n if (\n !candidate ||\n typeof candidate.name !== 'string' ||\n candidate.name.trim().length === 0 ||\n typeof candidate.optimize !== 'function'\n ) {\n throw new Error(\n 'knowledge optimization requires a complete OptimizationMethod with a non-empty name and optimize()',\n )\n }\n}\n\nexport function jsonCandidateCodec<\n TCandidate extends JsonValue,\n>(): SerializedCandidateCodec<TCandidate> {\n return {\n serialize: (candidate) => canonicalJson(candidate),\n parse(surface) {\n let parsed: unknown\n try {\n parsed = JSON.parse(surface)\n } catch (error) {\n throw new Error('serialized knowledge candidate is not valid JSON', { cause: error })\n }\n return parsed as TCandidate\n },\n }\n}\n\nexport function jsonObjectCandidateCodec<\n TCandidate extends Record<string, JsonValue>,\n>(): SerializedCandidateCodec<TCandidate> {\n const codec = jsonCandidateCodec<TCandidate>()\n return {\n serialize: codec.serialize,\n parse(surface) {\n const candidate = codec.parse(surface)\n if (!candidate || typeof candidate !== 'object' || Array.isArray(candidate)) {\n throw new Error('serialized knowledge candidate must be a JSON object')\n }\n return candidate\n },\n }\n}\n\nexport function scenarioContentFingerprint(scenario: Scenario): string {\n const {\n id: _id,\n tags: _tags,\n split: _split,\n splitTag: _splitTag,\n ...content\n } = scenario as Scenario & { split?: unknown; splitTag?: unknown }\n return surfaceHash(canonicalJson(content as JsonValue))\n}\n\nfunction canonicalCandidateMethod<\n TCandidate extends JsonValue,\n TScenario extends Scenario,\n TArtifact,\n>(\n method: OptimizationMethod<TScenario, TArtifact>,\n codec: SerializedCandidateCodec<TCandidate>,\n): OptimizationMethod<TScenario, TArtifact> {\n return {\n name: method.name,\n async optimize(input) {\n const result = await method.optimize(input)\n const winner = normalizeSurface(result.winnerSurface, codec, `${method.name} winner`)\n return {\n ...result,\n winnerSurface: winner.surface,\n }\n },\n }\n}\n\nfunction normalizeCandidate<TCandidate extends JsonValue>(\n candidate: TCandidate,\n codec: SerializedCandidateCodec<TCandidate>,\n label: string,\n): SerializedCandidate<TCandidate> {\n let surface: string\n try {\n surface = codec.serialize(candidate)\n } catch (error) {\n throw new Error(`${label} serializer failed`, { cause: error })\n }\n return normalizeSurface(surface, codec, label)\n}\n\nfunction normalizeSurface<TCandidate extends JsonValue>(\n surface: MutableSurface,\n codec: SerializedCandidateCodec<TCandidate>,\n label: string,\n): SerializedCandidate<TCandidate> {\n if (typeof surface !== 'string' || surface.trim().length === 0) {\n throw new Error(`${label} must be a non-empty serialized string`)\n }\n let value: TCandidate\n try {\n value = codec.parse(surface)\n } catch (error) {\n const detail = error instanceof Error ? `: ${error.message}` : ''\n throw new Error(`${label} parser failed${detail}`, { cause: error })\n }\n let canonicalSurface: string\n try {\n canonicalSurface = codec.serialize(value)\n } catch (error) {\n throw new Error(`${label} serializer failed after parsing`, { cause: error })\n }\n if (typeof canonicalSurface !== 'string' || canonicalSurface.trim().length === 0) {\n throw new Error(`${label} serializer must return a non-empty string`)\n }\n const roundTrip = codec.serialize(codec.parse(canonicalSurface))\n if (roundTrip !== canonicalSurface) {\n throw new Error(`${label} codec must round-trip to one canonical surface`)\n }\n return {\n value: structuredClone(value),\n surface: canonicalSurface,\n surfaceHash: surfaceHash(canonicalSurface),\n }\n}\n\nfunction assertPartitionContent<TScenario extends Scenario>(\n train: readonly TScenario[],\n selection: readonly TScenario[],\n final: readonly TScenario[],\n fingerprint: ((scenario: TScenario) => string) | undefined,\n): void {\n if (!fingerprint) return\n const owner = new Map<string, { partition: string; scenarioId: string }>()\n for (const [name, scenarios] of [\n ['train', train],\n ['selection', selection],\n ['final', final],\n ] as const) {\n for (const scenario of scenarios) {\n const identity = fingerprint(scenario)\n if (typeof identity !== 'string' || identity.trim().length === 0) {\n throw new Error(`scenarioFingerprint returned no identity for '${scenario.id}'`)\n }\n const prior = owner.get(identity)\n if (prior) {\n const scope =\n prior.partition === name\n ? `${name} partition duplicates`\n : `${prior.partition}/${name} partitions duplicate`\n throw new Error(\n `serialized knowledge optimization ${scope} scenario content at '${prior.scenarioId}'/'${scenario.id}'`,\n )\n }\n owner.set(identity, { partition: name, scenarioId: scenario.id })\n }\n }\n}\n","const SHA256_REF = /^sha256:[a-f0-9]{64}$/\nconst GIT_REF = /^git:[a-f0-9]{40}$/\n\nexport function assertImmutableRef(value: unknown, label: string): asserts value is string {\n if (typeof value !== 'string' || (!SHA256_REF.test(value) && !GIT_REF.test(value))) {\n throw new Error(`${label} must be lowercase sha256:<64 hex> or git:<40 hex>`)\n }\n}\n","import { type CampaignStorage, surfaceHash } from '@tangle-network/agent-eval/campaign'\nimport type { AgentCandidateJsonValue as JsonValue } from '@tangle-network/agent-interface'\nimport { appendDurableJournalEvent } from '../attempt-log'\nimport { runBoundedMemoryLifecycle } from '../lifecycle'\nimport { memoryConfigCodec } from './evaluation'\nimport type {\n AgentMemoryActivationEvent,\n AgentMemoryActivationJournalState,\n OwnedRunLease,\n RunAgentMemoryImprovementOptions,\n RunAgentMemoryImprovementResult,\n} from './types'\n\nexport function appendMemoryActivationEvent(\n storage: CampaignStorage,\n path: string,\n event: AgentMemoryActivationEvent,\n): void {\n appendDurableJournalEvent({\n storage,\n path,\n event,\n label: 'memory activation journal',\n })\n}\n\nexport function readMemoryActivationJournal(\n storage: CampaignStorage,\n path: string,\n expected: Omit<AgentMemoryActivationEvent, 'status' | 'recordedAt' | 'outcome'>,\n): AgentMemoryActivationJournalState {\n const stored = storage.read(path)\n if (stored === undefined) {\n if (storage.exists(path)) throw new Error(`cannot read memory activation journal '${path}'`)\n return { prepared: false }\n }\n let prepared = false\n let activated: AgentMemoryActivationEvent | undefined\n for (const [index, line] of stored.split('\\n').entries()) {\n if (!line) continue\n let raw: unknown\n try {\n raw = JSON.parse(line)\n } catch (error) {\n throw new Error(`invalid memory activation journal '${path}' line ${index + 1}`, {\n cause: error,\n })\n }\n const event = parseMemoryActivationEvent(raw, path, index + 1, expected)\n if (event.status === 'prepared') {\n if (prepared || activated) {\n throw new Error(`memory activation journal '${path}' repeats its prepared event`)\n }\n prepared = true\n continue\n }\n if (!prepared || activated) {\n throw new Error(`memory activation journal '${path}' has an out-of-order activated event`)\n }\n activated = event\n }\n return { prepared, ...(activated ? { activated } : {}) }\n}\n\nexport async function assertActivatedMemoryWinner<TConfig extends JsonValue>(input: {\n options: RunAgentMemoryImprovementOptions<TConfig>\n lease: OwnedRunLease\n result: Pick<RunAgentMemoryImprovementResult<TConfig>, 'winnerSurfaceHash'>\n}): Promise<void> {\n const activationDriver = input.options.activation\n if (!activationDriver) {\n throw new Error('an activated memory journal requires its activation driver')\n }\n await input.lease.assertOwned()\n const currentConfig = await runBoundedMemoryLifecycle({\n operation: `${activationDriver.ref}: confirm active memory configuration`,\n timeoutMs: input.options.activationTimeoutMs ?? 60_000,\n run: () => activationDriver.readCurrent(),\n })\n await input.lease.assertOwned()\n const currentHash = surfaceHash(memoryConfigCodec(input.options).serialize(currentConfig))\n if (currentHash !== input.result.winnerSurfaceHash) {\n throw new Error(\n `memory activation target '${activationDriver.ref}' drifted from measured winner '${input.result.winnerSurfaceHash}' to '${currentHash}'`,\n )\n }\n}\n\nexport async function activateMemoryWinner<TConfig extends JsonValue>(input: {\n options: RunAgentMemoryImprovementOptions<TConfig>\n storage: CampaignStorage\n lease: OwnedRunLease\n result: RunAgentMemoryImprovementResult<TConfig>\n activationEventIdentity: Omit<AgentMemoryActivationEvent, 'status' | 'recordedAt' | 'outcome'>\n activationJournalDir: string\n activationJournalPath: string\n hadPreparedEvent: boolean\n}): Promise<void> {\n const activationDriver = input.options.activation!\n const activationTimeoutMs = input.options.activationTimeoutMs ?? 60_000\n if (!input.hadPreparedEvent) {\n await input.lease.assertOwned()\n input.storage.ensureDir(input.activationJournalDir)\n appendMemoryActivationEvent(input.storage, input.activationJournalPath, {\n ...input.activationEventIdentity,\n status: 'prepared',\n recordedAt: (input.options.now ?? (() => new Date()))().toISOString(),\n })\n }\n\n await input.lease.assertOwned()\n const currentConfig = await runBoundedMemoryLifecycle({\n operation: `${activationDriver.ref}: read current memory configuration`,\n timeoutMs: activationTimeoutMs,\n run: () => activationDriver.readCurrent(),\n })\n await input.lease.assertOwned()\n const codec = memoryConfigCodec(input.options)\n const currentHash = surfaceHash(codec.serialize(currentConfig))\n if (\n currentHash !== input.result.baselineSurfaceHash &&\n currentHash !== input.result.winnerSurfaceHash\n ) {\n throw new Error(\n `memory activation target '${activationDriver.ref}' changed concurrently; expected '${input.result.baselineSurfaceHash}' or '${input.result.winnerSurfaceHash}', found '${currentHash}'`,\n )\n }\n\n let outcome: NonNullable<AgentMemoryActivationEvent['outcome']>\n if (currentHash === input.result.winnerSurfaceHash) {\n outcome = input.hadPreparedEvent ? 'recovered' : 'already-current'\n input.result.activation.status = 'recovered'\n } else {\n let compareError: unknown\n try {\n await runBoundedMemoryLifecycle({\n operation: `${activationDriver.ref}: activate memory configuration`,\n timeoutMs: activationTimeoutMs,\n run: () =>\n activationDriver.compareAndSet({\n activationId: input.result.activation.id,\n expectedConfig: input.result.baselineConfig,\n expectedSurfaceHash: input.result.baselineSurfaceHash,\n config: input.result.winnerConfig,\n surfaceHash: input.result.winnerSurfaceHash,\n decision: input.result.decision,\n optimization: input.result.optimization,\n finalEvaluation: input.result.finalEvaluation,\n }),\n })\n } catch (error) {\n compareError = error\n }\n await input.lease.assertOwned()\n\n let observedConfig: TConfig\n try {\n observedConfig = await runBoundedMemoryLifecycle({\n operation: `${activationDriver.ref}: confirm memory configuration`,\n timeoutMs: activationTimeoutMs,\n run: () => activationDriver.readCurrent(),\n })\n } catch (error) {\n if (compareError) {\n throw new AggregateError(\n [compareError, error],\n `memory activation '${input.result.activation.id}' failed and its live state could not be confirmed`,\n )\n }\n throw error\n }\n await input.lease.assertOwned()\n const observedHash = surfaceHash(codec.serialize(observedConfig))\n if (observedHash !== input.result.winnerSurfaceHash) {\n const mismatch = new Error(\n `memory activation '${input.result.activation.id}' did not install the measured winner; found '${observedHash}'`,\n )\n if (compareError) {\n throw new AggregateError(\n [compareError, mismatch],\n `memory activation '${input.result.activation.id}' failed without applying the measured winner`,\n )\n }\n throw mismatch\n }\n outcome = compareError ? 'recovered' : 'applied'\n input.result.activation.status = compareError ? 'recovered' : 'activated'\n }\n\n await input.lease.assertOwned()\n appendMemoryActivationEvent(input.storage, input.activationJournalPath, {\n ...input.activationEventIdentity,\n status: 'activated',\n outcome,\n recordedAt: (input.options.now ?? (() => new Date()))().toISOString(),\n })\n}\n\nfunction parseMemoryActivationEvent(\n value: unknown,\n path: string,\n line: number,\n expected: Omit<AgentMemoryActivationEvent, 'status' | 'recordedAt' | 'outcome'>,\n): AgentMemoryActivationEvent {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(`invalid memory activation journal '${path}' line ${line}`)\n }\n const event = value as Record<string, unknown>\n for (const [key, expectedValue] of Object.entries(expected)) {\n if (event[key] !== expectedValue) {\n throw new Error(\n `memory activation journal '${path}' line ${line} does not match the measured winner`,\n )\n }\n }\n if (event.status !== 'prepared' && event.status !== 'activated') {\n throw new Error(`invalid memory activation journal '${path}' line ${line} status`)\n }\n const expectedKeys = [\n ...Object.keys(expected),\n 'status',\n 'recordedAt',\n ...(event.status === 'activated' ? ['outcome'] : []),\n ]\n const actualKeys = Object.keys(event)\n if (\n actualKeys.length !== expectedKeys.length ||\n actualKeys.some((key) => !expectedKeys.includes(key))\n ) {\n throw new Error(`invalid memory activation journal '${path}' line ${line} fields`)\n }\n if (typeof event.recordedAt !== 'string' || !Number.isFinite(Date.parse(event.recordedAt))) {\n throw new Error(`invalid memory activation journal '${path}' line ${line} recordedAt`)\n }\n if (\n event.status === 'activated' &&\n event.outcome !== 'applied' &&\n event.outcome !== 'recovered' &&\n event.outcome !== 'already-current'\n ) {\n throw new Error(`invalid memory activation journal '${path}' line ${line} outcome`)\n }\n if (event.status === 'prepared' && event.outcome !== undefined) {\n throw new Error(`invalid memory activation journal '${path}' line ${line} prepared outcome`)\n }\n return value as AgentMemoryActivationEvent\n}\n","import { dirname, join } from 'node:path'\nimport { canonicalJson } from '@tangle-network/agent-eval'\nimport {\n type CampaignCostMeter,\n type CampaignStorage,\n surfaceHash,\n} from '@tangle-network/agent-eval/campaign'\nimport type { AgentCandidateJsonValue as JsonValue } from '@tangle-network/agent-interface'\nimport { stableId } from '../../ids'\nimport type { SerializedCandidateCodec } from '../../optimization'\nimport {\n type AgentMemoryExperimentCandidate,\n type AgentMemorySequence,\n type AgentMemorySequenceArtifact,\n runAgentMemoryExperiment,\n} from '../experiment'\nimport { experimentOptions } from './candidate'\nimport { memorySequenceFingerprint, parseMemoryConfig, serializeMemoryConfig } from './identity'\nimport type {\n AgentMemoryFinalEvaluation,\n AgentMemoryFinalPair,\n MemoryConfigScenario,\n OwnedRunLease,\n RunAgentMemoryImprovementOptions,\n} from './types'\n\ninterface StoredMemoryArtifact {\n surfaceHash: string\n candidateRef: string\n sequenceFingerprint: string\n sequenceId: string\n rep: number\n seed: number\n artifact: AgentMemorySequenceArtifact\n}\n\nexport function memoryConfigCodec<TConfig extends JsonValue>(\n options: RunAgentMemoryImprovementOptions<TConfig>,\n): SerializedCandidateCodec<TConfig> {\n const serializeRaw = options.serializeConfig ?? ((config: TConfig) => canonicalJson(config))\n const parseRaw = options.parseConfig ?? ((surface: string) => JSON.parse(surface) as TConfig)\n return {\n serialize: (config) => serializeMemoryConfig(serializeRaw, config),\n parse: (surface) => parseMemoryConfig(parseRaw, surface),\n }\n}\n\nexport function memoryConfigScenarios(\n sequences: readonly AgentMemorySequence[],\n): MemoryConfigScenario[] {\n return sequences.map(memoryConfigScenario)\n}\n\nexport async function evaluateMemoryCandidate<TConfig extends JsonValue>(input: {\n options: RunAgentMemoryImprovementOptions<TConfig>\n storage: CampaignStorage\n runDir: string\n lease: OwnedRunLease\n candidate: AgentMemoryExperimentCandidate\n surfaceHash: string\n scenario: MemoryConfigScenario\n rep: number\n seed: number\n final: boolean\n cost: CampaignCostMeter\n signal: AbortSignal\n}): Promise<AgentMemorySequenceArtifact> {\n await input.lease.assertOwned()\n const artifactPath = memoryArtifactPath(\n input.runDir,\n input.surfaceHash,\n input.scenario,\n input.rep,\n input.seed,\n )\n const stored = readStoredMemoryArtifact(input.storage, artifactPath, {\n surfaceHash: input.surfaceHash,\n candidateRef: input.candidate.ref,\n scenario: input.scenario,\n rep: input.rep,\n seed: input.seed,\n })\n if (stored) {\n if (input.final) {\n writeStoredMemoryArtifact(\n input.storage,\n memoryFinalArtifactPath(input.runDir, input.surfaceHash, input.scenario, input.rep),\n storedMemoryArtifactRecord(input, stored),\n )\n }\n return stored\n }\n\n const evaluationCostLimit = input.options.maximumEvaluationCostUsd ?? 0\n const evaluationId = stableId(\n 'memory_eval',\n canonicalJson({\n surfaceHash: input.surfaceHash,\n sequence: memorySequenceFingerprint(input.scenario.sequence),\n rep: input.rep,\n seed: input.seed,\n }),\n )\n const paid = await input.cost.runPaidCall({\n actor: 'agent-knowledge:memory-config-evaluation',\n model: input.candidate.ref,\n signal: input.signal,\n maximumCharge: {\n externallyEnforcedMaximumUsd: evaluationCostLimit,\n },\n execute: async () => {\n const experiment = await runAgentMemoryExperiment({\n ...experimentOptions(input.options, input.storage, input.lease),\n experimentId: `${input.options.experimentId}:${evaluationId}`,\n experimentRunId: evaluationId,\n sequences: [input.scenario.sequence],\n candidates: [input.candidate],\n runDir: join(input.runDir, 'evaluations', evaluationId),\n seed: input.seed,\n reps: 1,\n maxConcurrency: 1,\n costCeiling: evaluationCostLimit,\n costPhase: `memory.config.${input.surfaceHash}`,\n })\n const cell = experiment.campaign.cells[0]\n if (!cell || cell.error || cell.artifact.candidateId !== input.candidate.id) {\n throw new Error(\n `${input.surfaceHash}/${input.scenario.sequenceId}: memory config evaluation did not complete`,\n )\n }\n const cost = experiment.campaign.aggregates.cost\n return {\n artifact: cell.artifact,\n costUsd: cell.cached ? 0 : experiment.totalCostUsd,\n cost,\n }\n },\n receipt: (value) => ({\n model: input.candidate.ref,\n inputTokens: value.cost.inputTokens,\n outputTokens: value.cost.outputTokens,\n ...(value.cost.reasoningTokens !== undefined\n ? { reasoningTokens: value.cost.reasoningTokens }\n : {}),\n cachedTokens: value.cost.cachedTokens,\n ...(value.cost.cacheWriteTokens !== undefined\n ? { cacheWriteTokens: value.cost.cacheWriteTokens }\n : {}),\n actualCostUsd: value.costUsd,\n costUnknown: !value.cost.accountingComplete,\n usageUnknown: !value.cost.usageComplete,\n }),\n })\n if (!paid.succeeded) throw paid.error\n await input.lease.assertOwned()\n const record = storedMemoryArtifactRecord(input, paid.value.artifact)\n writeStoredMemoryArtifact(input.storage, artifactPath, record)\n if (input.final) {\n writeStoredMemoryArtifact(\n input.storage,\n memoryFinalArtifactPath(input.runDir, input.surfaceHash, input.scenario, input.rep),\n record,\n )\n }\n return paid.value.artifact\n}\n\nexport function loadFinalEvaluation<TConfig extends JsonValue>(input: {\n options: RunAgentMemoryImprovementOptions<TConfig>\n storage: CampaignStorage\n runDir: string\n baselineSurfaceHash: string\n baselineCandidateRef: string\n winnerSurfaceHash: string\n winnerCandidateRef: string\n}): AgentMemoryFinalEvaluation {\n const pairs: AgentMemoryFinalPair[] = []\n const reps = input.options.reps ?? 1\n for (const sequence of input.options.finalSequences) {\n const scenario = memoryConfigScenario(sequence)\n for (let rep = 0; rep < reps; rep += 1) {\n const baseline = readStoredMemoryArtifact(\n input.storage,\n memoryFinalArtifactPath(input.runDir, input.baselineSurfaceHash, scenario, rep),\n {\n surfaceHash: input.baselineSurfaceHash,\n candidateRef: input.baselineCandidateRef,\n scenario,\n rep,\n },\n )\n const winner = readStoredMemoryArtifact(\n input.storage,\n memoryFinalArtifactPath(input.runDir, input.winnerSurfaceHash, scenario, rep),\n {\n surfaceHash: input.winnerSurfaceHash,\n candidateRef: input.winnerCandidateRef,\n scenario,\n rep,\n },\n )\n if (!baseline || !winner) {\n throw new Error(\n `memory final artifact is missing for sequence '${sequence.id}' repetition ${rep}`,\n )\n }\n pairs.push({ sequenceId: sequence.id, rep, baseline, winner })\n }\n }\n return {\n manifestHash: surfaceHash(\n canonicalJson({\n baselineSurfaceHash: input.baselineSurfaceHash,\n baselineCandidateRef: input.baselineCandidateRef,\n winnerSurfaceHash: input.winnerSurfaceHash,\n winnerCandidateRef: input.winnerCandidateRef,\n pairs,\n }),\n ),\n baselineCandidateRef: input.baselineCandidateRef,\n winnerCandidateRef: input.winnerCandidateRef,\n pairs,\n }\n}\n\nexport function memoryArtifactPath(\n runDir: string,\n candidateSurfaceHash: string,\n scenario: MemoryConfigScenario,\n rep: number,\n seed: number,\n): string {\n return join(\n runDir,\n 'memory-config-artifacts',\n candidateSurfaceHash,\n stableId('sequence', scenario.sequenceId),\n `rep-${rep}-${stableId('seed', String(seed))}.json`,\n )\n}\n\nfunction memoryFinalArtifactPath(\n runDir: string,\n candidateSurfaceHash: string,\n scenario: MemoryConfigScenario,\n rep: number,\n): string {\n return join(\n runDir,\n 'memory-final-artifacts',\n candidateSurfaceHash,\n stableId('sequence', scenario.sequenceId),\n `rep-${rep}.json`,\n )\n}\n\nfunction memoryConfigScenario(sequence: AgentMemorySequence): MemoryConfigScenario {\n return {\n id: sequence.id,\n kind: 'agent-memory-config-search',\n sequenceId: sequence.id,\n sequence,\n }\n}\n\nfunction readStoredMemoryArtifact(\n storage: CampaignStorage,\n path: string,\n expected: {\n surfaceHash: string\n candidateRef: string\n scenario: MemoryConfigScenario\n rep: number\n seed?: number\n },\n): AgentMemorySequenceArtifact | undefined {\n const stored = storage.read(path)\n if (stored === undefined) {\n if (storage.exists(path)) throw new Error(`cannot read memory config artifact '${path}'`)\n return undefined\n }\n let record: unknown\n try {\n record = JSON.parse(stored)\n } catch (error) {\n throw new Error(`invalid memory config artifact '${path}'`, { cause: error })\n }\n if (!record || typeof record !== 'object' || Array.isArray(record)) {\n throw new Error(`invalid memory config artifact '${path}'`)\n }\n const value = record as Partial<StoredMemoryArtifact>\n if (\n !hasExactKeys(record, [\n 'surfaceHash',\n 'candidateRef',\n 'sequenceFingerprint',\n 'sequenceId',\n 'rep',\n 'seed',\n 'artifact',\n ]) ||\n value.surfaceHash !== expected.surfaceHash ||\n value.candidateRef !== expected.candidateRef ||\n value.sequenceFingerprint !== memorySequenceFingerprint(expected.scenario.sequence) ||\n value.sequenceId !== expected.scenario.sequenceId ||\n value.rep !== expected.rep ||\n !Number.isSafeInteger(value.seed) ||\n (expected.seed !== undefined && value.seed !== expected.seed)\n ) {\n throw new Error(`memory config artifact '${path}' does not match its evaluation cell`)\n }\n return parseMemoryArtifact(\n value.artifact,\n `memory-config-${expected.surfaceHash}`,\n expected.scenario.sequenceId,\n path,\n )\n}\n\nfunction writeStoredMemoryArtifact(\n storage: CampaignStorage,\n path: string,\n record: StoredMemoryArtifact,\n): void {\n const serialized = `${JSON.stringify(record, null, 2)}\\n`\n const existing = storage.read(path)\n if (existing !== undefined) {\n if (canonicalJson(JSON.parse(existing)) !== canonicalJson(record)) {\n throw new Error(`memory config artifact '${path}' conflicts with durable content`)\n }\n return\n }\n if (storage.exists(path)) throw new Error(`cannot read memory config artifact '${path}'`)\n storage.ensureDir(dirname(path))\n storage.write(path, serialized)\n}\n\nfunction storedMemoryArtifactRecord(\n input: {\n surfaceHash: string\n candidate: AgentMemoryExperimentCandidate\n scenario: MemoryConfigScenario\n rep: number\n seed: number\n },\n artifact: AgentMemorySequenceArtifact,\n): StoredMemoryArtifact {\n return {\n surfaceHash: input.surfaceHash,\n candidateRef: input.candidate.ref,\n sequenceFingerprint: memorySequenceFingerprint(input.scenario.sequence),\n sequenceId: input.scenario.sequenceId,\n rep: input.rep,\n seed: input.seed,\n artifact,\n }\n}\n\nfunction parseMemoryArtifact(\n value: unknown,\n candidateId: string,\n sequenceId: string,\n path: string,\n): AgentMemorySequenceArtifact {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(`memory config artifact '${path}' has no artifact`)\n }\n const artifact = value as Partial<AgentMemorySequenceArtifact>\n if (\n artifact.candidateId !== candidateId ||\n artifact.sequenceId !== sequenceId ||\n typeof artifact.score !== 'number' ||\n !Number.isFinite(artifact.score) ||\n artifact.score < 0 ||\n artifact.score > 1 ||\n typeof artifact.passed !== 'boolean' ||\n !isFiniteNumberRecord(artifact.dimensions) ||\n !isNonnegativeIntegerRecord(artifact.dimensionSampleCounts) ||\n !Array.isArray(artifact.probes) ||\n typeof artifact.branchDigest !== 'string' ||\n !artifact.branchDigest ||\n typeof artifact.journalEntries !== 'number' ||\n !Number.isSafeInteger(artifact.journalEntries) ||\n artifact.journalEntries < 0 ||\n typeof artifact.durationMs !== 'number' ||\n !Number.isFinite(artifact.durationMs) ||\n artifact.durationMs < 0\n ) {\n throw new Error(`memory config artifact '${path}' is malformed`)\n }\n return artifact as AgentMemorySequenceArtifact\n}\n\nfunction isFiniteNumberRecord(value: unknown): value is Record<string, number> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return false\n return Object.values(value).every((entry) => typeof entry === 'number' && Number.isFinite(entry))\n}\n\nfunction isNonnegativeIntegerRecord(value: unknown): value is Record<string, number> {\n return (\n isFiniteNumberRecord(value) &&\n Object.values(value).every((entry) => Number.isSafeInteger(entry) && entry >= 0)\n )\n}\n\nfunction hasExactKeys(value: object, expected: readonly string[]): boolean {\n const keys = Object.keys(value)\n return keys.length === expected.length && keys.every((key) => expected.includes(key))\n}\n","import { dirname, join } from 'node:path'\nimport { canonicalJson } from '@tangle-network/agent-eval'\nimport type { CampaignStorage } from '@tangle-network/agent-eval/campaign'\nimport type { AgentCandidateJsonValue as JsonValue } from '@tangle-network/agent-interface'\nimport { assertImmutableRef } from '../../immutable-ref'\nimport type { AgentMemoryExperimentCandidate, RunAgentMemoryExperimentOptions } from '../experiment'\nimport type { OwnedRunLease, RunAgentMemoryImprovementOptions } from './types'\n\nexport async function buildCandidate<TConfig extends JsonValue>(\n options: RunAgentMemoryImprovementOptions<TConfig>,\n config: TConfig,\n hash: string,\n): Promise<AgentMemoryExperimentCandidate> {\n const id = `memory-config-${hash}`\n const built = await options.createCandidate({\n config,\n candidateId: id,\n surfaceHash: hash,\n })\n assertImmutableRef(built.ref, `${id}: ref`)\n assertDeclaredCost(built.externalCostUsdPerSequence, `${id}: externalCostUsdPerSequence`)\n assertDeclaredCost(\n built.externalRecoveryCostUsdPerAttempt,\n `${id}: externalRecoveryCostUsdPerAttempt`,\n )\n if (built.externalCostAccounting !== 'exact') {\n throw new Error(`${id}: memory improvement requires exact external cost accounting`)\n }\n return {\n ...built,\n id,\n ref: built.ref,\n }\n}\n\nexport async function buildRegisteredCandidate<TConfig extends JsonValue>(\n options: RunAgentMemoryImprovementOptions<TConfig>,\n storage: CampaignStorage,\n runDir: string,\n config: TConfig,\n hash: string,\n): Promise<AgentMemoryExperimentCandidate> {\n const candidate = await buildCandidate(options, config, hash)\n const path = join(runDir, 'memory-candidate-identities', `${hash}.json`)\n const record = { surfaceHash: hash, candidateRef: candidate.ref }\n const stored = storage.read(path)\n if (stored !== undefined) {\n let parsed: unknown\n try {\n parsed = JSON.parse(stored)\n } catch (error) {\n throw new Error(`invalid memory candidate identity '${path}'`, { cause: error })\n }\n if (canonicalJson(parsed as JsonValue) !== canonicalJson(record)) {\n throw new Error(\n `memory config '${hash}' changed candidate identity within the same improvement run`,\n )\n }\n return candidate\n }\n if (storage.exists(path)) throw new Error(`cannot read memory candidate identity '${path}'`)\n storage.ensureDir(dirname(path))\n storage.write(path, `${JSON.stringify(record, null, 2)}\\n`)\n return candidate\n}\n\nfunction assertDeclaredCost(value: unknown, label: string): asserts value is number {\n if (typeof value !== 'number' || !Number.isFinite(value) || value < 0) {\n throw new Error(`${label} must be a declared non-negative finite number`)\n }\n}\n\nexport function experimentOptions<TConfig extends JsonValue>(\n options: RunAgentMemoryImprovementOptions<TConfig>,\n storage: CampaignStorage,\n lease: OwnedRunLease,\n): Pick<\n RunAgentMemoryExperimentOptions,\n | 'storage'\n | 'resumable'\n | 'dispatchTimeoutMs'\n | 'cleanupTimeoutMs'\n | 'maxRecoveryAttempts'\n | 'maxRecoveryRetriesPerAttempt'\n | 'executeStep'\n | 'executeStepRef'\n | 'onBranchSnapshot'\n | 'cleanupBranches'\n | 'acquireRunLease'\n | 'now'\n> {\n return {\n storage,\n resumable: options.resumable,\n dispatchTimeoutMs: options.dispatchTimeoutMs,\n cleanupTimeoutMs: options.cleanupTimeoutMs,\n maxRecoveryAttempts: options.maxRecoveryAttempts,\n maxRecoveryRetriesPerAttempt: options.maxRecoveryRetriesPerAttempt,\n executeStep: options.executeStep,\n executeStepRef: options.executeStepRef,\n onBranchSnapshot: options.onBranchSnapshot,\n cleanupBranches: options.cleanupBranches ?? true,\n acquireRunLease: async () => ({\n assertOwned: () => lease.assertOwned(),\n release() {},\n }),\n now: options.now,\n }\n}\n","import { join } from 'node:path'\nimport { canonicalJson } from '@tangle-network/agent-eval'\nimport { type CampaignStorage, surfaceHash } from '@tangle-network/agent-eval/campaign'\nimport type { AgentCandidateJsonValue as JsonValue } from '@tangle-network/agent-interface'\nimport type { AgentMemorySequence } from '../experiment'\nimport { normalizedPromotionPolicy } from './promotion'\nimport type { RunAgentMemoryImprovementOptions } from './types'\n\nexport function assertMemoryImprovementIdentity<TConfig extends JsonValue>(\n options: RunAgentMemoryImprovementOptions<TConfig>,\n storage: CampaignStorage,\n runDir: string,\n serialize: (config: TConfig) => string,\n): void {\n const path = join(runDir, 'memory-improvement-manifest.json')\n const identity = {\n experimentId: options.experimentId,\n implementationRef: options.implementationRef,\n method: options.method.name,\n activationRef: options.activation?.ref ?? null,\n baselineConfig: serialize(options.baselineConfig),\n executeStepRef: options.executeStepRef ?? null,\n cleanupBranches: options.cleanupBranches ?? true,\n promotionPolicy: normalizedPromotionPolicy(options),\n seed: options.seed ?? 42,\n reps: options.reps ?? 1,\n maxTotalCostUsd: options.maxTotalCostUsd ?? null,\n maximumEvaluationCostUsd: options.maximumEvaluationCostUsd ?? null,\n allowIncompleteCostAccounting: options.allowIncompleteCostAccounting ?? false,\n trainSequences: options.trainSequences,\n selectionSequences: options.selectionSequences,\n finalSequences: options.finalSequences,\n }\n const identityHash = surfaceHash(canonicalJson(identity))\n const stored = storage.read(path)\n if (stored === undefined) {\n if (storage.exists(path)) throw new Error(`cannot read memory improvement manifest '${path}'`)\n if (storage.exists(join(runDir, 'memory-improvement-result.json'))) {\n throw new Error(`memory improvement run '${runDir}' has state without an identity manifest`)\n }\n storage.write(path, `${JSON.stringify({ identityHash, identity }, null, 2)}\\n`)\n return\n }\n let manifest: unknown\n try {\n manifest = JSON.parse(stored)\n } catch (error) {\n throw new Error(`invalid memory improvement manifest '${path}'`, { cause: error })\n }\n if (\n !manifest ||\n typeof manifest !== 'object' ||\n (manifest as Record<string, unknown>).identityHash !== identityHash ||\n canonicalJson((manifest as Record<string, unknown>).identity) !== canonicalJson(identity)\n ) {\n throw new Error(\n `memory improvement run '${runDir}' does not match its persisted inputs or implementation`,\n )\n }\n}\n\nexport function serializeMemoryConfig<TConfig extends JsonValue>(\n serialize: (config: TConfig) => string,\n config: TConfig,\n): string {\n let surface: unknown\n try {\n surface = serialize(config)\n } catch (error) {\n throw new Error('memory config serializer failed', { cause: error })\n }\n if (typeof surface !== 'string' || surface.trim().length === 0) {\n throw new Error('memory config serializer must return a non-empty string')\n }\n return surface\n}\n\nexport function parseMemoryConfig<TConfig extends JsonValue>(\n parse: (surface: string) => TConfig,\n surface: string,\n): TConfig {\n try {\n const config = parse(surface)\n if (config === undefined) throw new Error('parser returned undefined')\n return config\n } catch (error) {\n throw new Error('memory config surface could not be parsed', { cause: error })\n }\n}\n\nexport function assertMemoryConfigRoundTrip<TConfig extends JsonValue>(\n config: TConfig,\n serialize: (config: TConfig) => string,\n parse: (surface: string) => TConfig,\n): void {\n const first = serialize(config)\n const second = serialize(parse(first))\n if (first !== second) {\n throw new Error('memory config serializer and parser must round-trip exactly')\n }\n}\n\nexport function memorySequenceFingerprint(sequence: AgentMemorySequence): string {\n const { id: _id, split: _split, tags: _tags, ...content } = sequence\n return surfaceHash(canonicalJson(content))\n}\n","import type { PairedHoldout } from '@tangle-network/agent-eval/campaign'\nimport { heldoutSignificance } from '@tangle-network/agent-eval/campaign'\nimport type { AgentCandidateJsonValue as JsonValue } from '@tangle-network/agent-interface'\nimport type { RunSerializedKnowledgeOptimizationResult } from '../../optimization'\nimport type { AgentMemorySequence, AgentMemorySequenceProbe } from '../experiment'\nimport {\n type AgentMemoryFinalEvaluation,\n type AgentMemoryPromotionDecision,\n DEFAULT_CRITICAL_DIMENSIONS,\n type RunAgentMemoryImprovementOptions,\n} from './types'\n\nexport function decidePromotion<TConfig extends JsonValue>(input: {\n options: RunAgentMemoryImprovementOptions<TConfig>\n optimization: RunSerializedKnowledgeOptimizationResult<TConfig>\n finalEvaluation: AgentMemoryFinalEvaluation\n unchanged: boolean\n}): AgentMemoryPromotionDecision {\n const { options, finalEvaluation } = input\n const baselineScores = finalEvaluation.pairs.map((pair) => pair.baseline.score)\n const winnerScores = finalEvaluation.pairs.map((pair) => pair.winner.score)\n const baselineScore = mean(baselineScores)\n const winnerScore = mean(winnerScores)\n if (input.unchanged) {\n return {\n status: 'no-change',\n reasons: ['optimization selected the baseline configuration'],\n baselineScore,\n winnerScore,\n lift: 0,\n criticalDimensions: [],\n }\n }\n\n const significance = heldoutSignificance(\n {\n before: baselineScores,\n after: winnerScores,\n cellIds: finalEvaluation.pairs.map((pair) => `${pair.sequenceId}:${pair.rep}`),\n },\n options.significance,\n )\n const tolerance = options.criticalDimensionTolerance ?? 0.05\n const criticalDimensions = (options.criticalDimensions ?? DEFAULT_CRITICAL_DIMENSIONS).map(\n (dimension) => {\n const expectedN =\n applicableSequenceCount(options.finalSequences, dimension) * (options.reps ?? 1)\n const pairs = pairedDimension(finalEvaluation, dimension)\n const comparison = heldoutSignificance(pairs, {\n ...options.significance,\n deltaThreshold: 0,\n })\n return {\n dimension,\n n: comparison.n,\n expectedN,\n measured: expectedN > 0 && comparison.n === expectedN,\n meanDelta: comparison.bootstrap.mean,\n low: comparison.bootstrap.low,\n high: comparison.bootstrap.high,\n tolerance,\n regressed:\n expectedN > 0 && comparison.n === expectedN && comparison.bootstrap.low < -tolerance,\n }\n },\n )\n const reasons: string[] = []\n const totalCost = input.optimization.comparison.totalCost\n if (\n !input.optimization.comparison.totalCost.accountingComplete &&\n !options.allowIncompleteCostAccounting\n ) {\n reasons.push('optimization or final cost accounting is incomplete')\n }\n const optimizerSource = input.optimization.comparison.best.provenance?.source\n if (optimizerSource && optimizerSource.evidence !== 'observed') {\n reasons.push('external optimizer package identity was not observed')\n }\n if (totalCost.totalCostUsd > (options.maxTotalCostUsd ?? 0)) {\n reasons.push(\n `total cost ${totalCost.totalCostUsd} exceeds the configured limit ${options.maxTotalCostUsd ?? 0}`,\n )\n }\n if (!significance.significant) {\n reasons.push(\n significance.fewRuns\n ? `only ${significance.n} paired final cells; more are required`\n : 'final lift is not confidently above the promotion threshold',\n )\n }\n if (winnerScore < (options.minFinalScore ?? 0)) {\n reasons.push(`winner final score ${winnerScore} is below the required minimum`)\n }\n for (const dimension of criticalDimensions) {\n if (!dimension.measured) {\n reasons.push(\n dimension.expectedN === 0\n ? `critical dimension ${dimension.dimension} has no applicable final histories`\n : `critical dimension ${dimension.dimension} was measured on ${dimension.n}/${dimension.expectedN} applicable paired final cells`,\n )\n } else if (dimension.regressed) {\n reasons.push(`${dimension.dimension} may regress beyond ${tolerance}`)\n }\n }\n return {\n status: reasons.length === 0 ? 'promote' : 'hold',\n reasons,\n baselineScore,\n winnerScore,\n lift: winnerScore - baselineScore,\n significance,\n criticalDimensions,\n }\n}\n\nexport function normalizedPromotionPolicy<TConfig extends JsonValue>(\n options: RunAgentMemoryImprovementOptions<TConfig>,\n): Record<string, unknown> {\n return {\n significance: {\n deltaThreshold: options.significance?.deltaThreshold ?? 0,\n minProductiveRuns: options.significance?.minProductiveRuns ?? 3,\n confidence: options.significance?.confidence ?? 0.95,\n resamples: options.significance?.resamples ?? 2000,\n seed: options.significance?.seed ?? 1337,\n statistic: options.significance?.statistic ?? 'mean',\n },\n criticalDimensions: [...(options.criticalDimensions ?? DEFAULT_CRITICAL_DIMENSIONS)],\n criticalDimensionTolerance: options.criticalDimensionTolerance ?? 0.05,\n minFinalScore: options.minFinalScore ?? 0,\n maxTotalCostUsd: options.maxTotalCostUsd ?? 0,\n allowIncompleteCostAccounting: options.allowIncompleteCostAccounting ?? false,\n }\n}\n\nfunction pairedDimension(result: AgentMemoryFinalEvaluation, dimension: string): PairedHoldout {\n const applicable = result.pairs.filter(\n (pair) =>\n (pair.baseline.dimensionSampleCounts[dimension] ?? 0) > 0 &&\n (pair.winner.dimensionSampleCounts[dimension] ?? 0) > 0,\n )\n return {\n before: applicable.map((pair) => pair.baseline.dimensions[dimension]!),\n after: applicable.map((pair) => pair.winner.dimensions[dimension]!),\n cellIds: applicable.map((pair) => `${pair.sequenceId}:${pair.rep}`),\n }\n}\n\nfunction applicableSequenceCount(\n sequences: readonly AgentMemorySequence[],\n dimension: string,\n): number {\n return sequences.filter((sequence) =>\n sequence.steps.some((step) =>\n (step.probes ?? []).some((probe) => probeAppliesToDimension(probe, dimension)),\n ),\n ).length\n}\n\nfunction probeAppliesToDimension(probe: AgentMemorySequenceProbe, dimension: string): boolean {\n switch (dimension) {\n case 'memory_fact_recall':\n case 'memory_required_fact_count':\n case 'memory_matched_fact_count':\n return Boolean(\n (probe.requiredFacts && probe.requiredFacts.length > 0) || probe.referenceAnswer,\n )\n case 'memory_event_recall':\n return Boolean(probe.expectedEventIds && probe.expectedEventIds.length > 0)\n case 'memory_actor_recall':\n return Boolean(probe.expectedActorIds && probe.expectedActorIds.length > 0)\n case 'memory_stale_safe':\n case 'memory_stale_rate':\n case 'memory_forbidden_fact_count':\n case 'memory_matched_forbidden_fact_count':\n return Boolean(probe.forbiddenFacts && probe.forbiddenFacts.length > 0)\n default:\n return true\n }\n}\n\nfunction mean(values: readonly number[]): number {\n return values.reduce((sum, value) => sum + value, 0) / values.length\n}\n","import type {\n CampaignStorage,\n HeldoutSignificance,\n HeldoutSignificanceOptions,\n OptimizationMethod,\n OptimizationMethodRunOptions,\n Scenario,\n} from '@tangle-network/agent-eval/campaign'\nimport type { AgentCandidateJsonValue as JsonValue } from '@tangle-network/agent-interface'\nimport type { RunSerializedKnowledgeOptimizationResult } from '../../optimization'\nimport type {\n AgentMemoryExperimentCandidate,\n AgentMemorySequence,\n AgentMemorySequenceArtifact,\n RunAgentMemoryExperimentOptions,\n} from '../experiment'\nimport type {\n AgentMemoryAcquireRunLease,\n AgentMemoryControllerMode,\n AgentMemoryRunLease,\n OwnedAgentMemoryRunLease,\n} from '../run-control'\n\nexport interface AgentMemoryDimensionComparison {\n dimension: string\n n: number\n expectedN: number\n measured: boolean\n meanDelta: number\n low: number\n high: number\n tolerance: number\n regressed: boolean\n}\n\nexport interface AgentMemoryPromotionDecision {\n status: 'promote' | 'hold' | 'no-change'\n reasons: readonly string[]\n baselineScore: number\n winnerScore: number\n lift: number\n significance?: HeldoutSignificance\n criticalDimensions: readonly AgentMemoryDimensionComparison[]\n}\n\nexport interface AgentMemoryFinalPair {\n sequenceId: string\n rep: number\n baseline: AgentMemorySequenceArtifact\n winner: AgentMemorySequenceArtifact\n}\n\nexport interface AgentMemoryFinalEvaluation {\n manifestHash: string\n baselineCandidateRef: string\n winnerCandidateRef: string\n pairs: readonly AgentMemoryFinalPair[]\n}\n\nexport interface AgentMemoryActivation {\n id: string\n status:\n | 'not-eligible'\n | 'not-configured'\n | 'pending'\n | 'activated'\n | 'recovered'\n | 'already-activated'\n journalPath: string\n}\n\nexport interface AgentMemoryActivationDriver<TConfig extends JsonValue> {\n /** Change whenever activation behavior or the external target changes. */\n ref: string\n /** Return the exact currently active configuration. */\n readCurrent(): Promise<TConfig>\n /** Atomically replace expectedConfig with config, or fail on a concurrent change. */\n compareAndSet(input: {\n activationId: string\n expectedConfig: TConfig\n expectedSurfaceHash: string\n config: TConfig\n surfaceHash: string\n decision: AgentMemoryPromotionDecision\n optimization: RunSerializedKnowledgeOptimizationResult<TConfig>\n finalEvaluation: AgentMemoryFinalEvaluation\n }): Promise<void>\n}\n\nexport interface AgentMemoryActivationEvent {\n status: 'prepared' | 'activated'\n activationId: string\n experimentId: string\n activationRef: string\n baselineSurfaceHash: string\n winnerSurfaceHash: string\n finalEvaluationHash: string\n recordedAt: string\n outcome?: 'applied' | 'recovered' | 'already-current'\n}\n\nexport interface AgentMemoryActivationJournalState {\n prepared: boolean\n activated?: AgentMemoryActivationEvent\n}\n\nexport type AgentMemoryImprovementRunLease = AgentMemoryRunLease\n\nexport type AgentMemoryImprovementCandidate = Omit<\n AgentMemoryExperimentCandidate,\n | 'id'\n | 'externalCostUsdPerSequence'\n | 'externalRecoveryCostUsdPerAttempt'\n | 'externalCostAccounting'\n> &\n Required<\n Pick<\n AgentMemoryExperimentCandidate,\n 'externalCostUsdPerSequence' | 'externalRecoveryCostUsdPerAttempt'\n >\n > & {\n externalCostAccounting: 'exact'\n }\n\nexport interface RunAgentMemoryImprovementOptions<TConfig extends JsonValue> {\n experimentId: string\n baselineConfig: TConfig\n method: OptimizationMethod<MemoryConfigScenario, AgentMemorySequenceArtifact>\n trainSequences: readonly AgentMemorySequence[]\n selectionSequences: readonly AgentMemorySequence[]\n finalSequences: readonly AgentMemorySequence[]\n createCandidate(input: {\n config: TConfig\n candidateId: string\n surfaceHash: string\n }): AgentMemoryImprovementCandidate | Promise<AgentMemoryImprovementCandidate>\n /**\n * Immutable digest covering the installed implementation, method config,\n * candidate construction, execution behavior, and external settings.\n */\n implementationRef: string\n runDir: string\n repo?: string\n storage?: CampaignStorage\n /** Required with custom storage when all controllers are confined to one process. */\n controllerMode?: AgentMemoryControllerMode\n /** Required for distributed controllers using custom storage. */\n acquireRunLease?: AgentMemoryAcquireRunLease\n seed?: number\n reps?: number\n resumable?: boolean\n sequenceConcurrency?: number\n dispatchTimeoutMs?: number\n cleanupTimeoutMs?: number\n maxRecoveryAttempts?: number\n maxRecoveryRetriesPerAttempt?: number\n /** Total spend limit across method search and final comparison. Default 0. */\n maxTotalCostUsd?: number\n /** Enforced maximum for one config and one sequence. Required with either spend limit. */\n maximumEvaluationCostUsd?: number\n /** Allow activation when a method cannot fully account for cost. Default false. */\n allowIncompleteCostAccounting?: boolean\n optimizationRunOptions?: OptimizationMethodRunOptions<\n MemoryConfigScenario,\n AgentMemorySequenceArtifact\n >\n executeStep?: RunAgentMemoryExperimentOptions['executeStep']\n executeStepRef?: string\n onBranchSnapshot?: RunAgentMemoryExperimentOptions['onBranchSnapshot']\n cleanupBranches?: boolean\n serializeConfig?: (config: TConfig) => string\n parseConfig?: (surface: string) => TConfig\n significance?: HeldoutSignificanceOptions\n criticalDimensions?: readonly string[]\n criticalDimensionTolerance?: number\n minFinalScore?: number\n activation?: AgentMemoryActivationDriver<TConfig>\n activationTimeoutMs?: number\n now?: () => Date\n}\n\nexport interface RunAgentMemoryImprovementResult<TConfig extends JsonValue> {\n optimization: RunSerializedKnowledgeOptimizationResult<TConfig>\n baselineConfig: TConfig\n winnerConfig: TConfig\n baselineSurface: string\n winnerSurface: string\n baselineSurfaceHash: string\n winnerSurfaceHash: string\n decision: AgentMemoryPromotionDecision\n finalEvaluation: AgentMemoryFinalEvaluation\n activation: AgentMemoryActivation\n totalCostUsd: number\n resultJsonPath: string\n}\n\nexport interface MemoryConfigScenario extends Scenario {\n kind: 'agent-memory-config-search'\n sequenceId: string\n sequence: AgentMemorySequence\n}\n\nexport const DEFAULT_CRITICAL_DIMENSIONS = [\n 'memory_stale_safe',\n 'memory_actor_recall',\n 'memory_event_recall',\n] as const\n\nexport type OwnedRunLease = OwnedAgentMemoryRunLease\n","import type { CampaignStorage } from '@tangle-network/agent-eval/campaign'\nimport type { AgentCandidateJsonValue as JsonValue } from '@tangle-network/agent-interface'\nimport type { RunAgentMemoryImprovementResult } from './types'\n\nexport function writeMemoryImprovementResult<TConfig extends JsonValue>(\n storage: CampaignStorage,\n experimentId: string,\n result: RunAgentMemoryImprovementResult<TConfig>,\n): void {\n storage.write(\n result.resultJsonPath,\n `${JSON.stringify(\n {\n experimentId,\n baselineSurfaceHash: result.baselineSurfaceHash,\n winnerSurfaceHash: result.winnerSurfaceHash,\n baselineSurface: result.baselineSurface,\n winnerSurface: result.winnerSurface,\n decision: result.decision,\n method: result.optimization.methodName,\n comparison: result.optimization.comparison,\n finalEvaluation: result.finalEvaluation,\n activation: result.activation,\n totalCostUsd: result.totalCostUsd,\n },\n null,\n 2,\n )}\\n`,\n )\n}\n","import type { AgentCandidateJsonValue as JsonValue } from '@tangle-network/agent-interface'\nimport { assertImmutableRef } from '../../immutable-ref'\nimport type { AgentMemorySequence } from '../experiment'\nimport { memorySequenceFingerprint } from './identity'\nimport { DEFAULT_CRITICAL_DIMENSIONS, type RunAgentMemoryImprovementOptions } from './types'\n\nexport function assertMemoryImprovementOptions<TConfig extends JsonValue>(\n options: RunAgentMemoryImprovementOptions<TConfig>,\n): void {\n for (const [name, value] of [\n ['experimentId', options.experimentId],\n ['runDir', options.runDir],\n ] as const) {\n if (typeof value !== 'string' || !value.trim()) {\n throw new Error(`memory improvement ${name} must be a non-empty string`)\n }\n }\n assertImmutableRef(options.implementationRef, 'memory improvement implementationRef')\n if (\n !options.method ||\n typeof options.method.name !== 'string' ||\n !options.method.name.trim() ||\n typeof options.method.optimize !== 'function'\n ) {\n throw new Error('memory improvement method must be a complete OptimizationMethod')\n }\n if (typeof options.createCandidate !== 'function') {\n throw new Error('memory improvement createCandidate must be a function')\n }\n if (options.activation !== undefined) {\n assertImmutableRef(options.activation.ref, 'memory improvement activation.ref')\n if (typeof options.activation.readCurrent !== 'function') {\n throw new Error('memory improvement activation.readCurrent must be a function')\n }\n if (typeof options.activation.compareAndSet !== 'function') {\n throw new Error('memory improvement activation.compareAndSet must be a function')\n }\n }\n if (options.executeStep) {\n assertImmutableRef(options.executeStepRef, 'memory improvement executeStepRef')\n }\n if (options.serializeConfig !== undefined && typeof options.serializeConfig !== 'function') {\n throw new Error('memory improvement serializeConfig must be a function')\n }\n if (options.parseConfig !== undefined && typeof options.parseConfig !== 'function') {\n throw new Error('memory improvement parseConfig must be a function')\n }\n for (const [name, value] of [\n ['sequenceConcurrency', options.sequenceConcurrency],\n ['reps', options.reps],\n ['maxRecoveryAttempts', options.maxRecoveryAttempts],\n ['maxRecoveryRetriesPerAttempt', options.maxRecoveryRetriesPerAttempt],\n ] as const) {\n if (value !== undefined && (!Number.isSafeInteger(value) || value <= 0)) {\n throw new Error(`memory improvement ${name} must be a positive safe integer`)\n }\n }\n for (const [name, value] of [['maxTotalCostUsd', options.maxTotalCostUsd]] as const) {\n if (value !== undefined && (!Number.isFinite(value) || value < 0)) {\n throw new Error(`memory improvement ${name} must be a non-negative finite number`)\n }\n }\n if (\n options.maximumEvaluationCostUsd !== undefined &&\n (!Number.isFinite(options.maximumEvaluationCostUsd) || options.maximumEvaluationCostUsd <= 0)\n ) {\n throw new Error('memory improvement maximumEvaluationCostUsd must be a positive finite number')\n }\n if ((options.maxTotalCostUsd ?? 0) > 0 && options.maximumEvaluationCostUsd === undefined) {\n throw new Error(\n 'memory improvement maximumEvaluationCostUsd is required when a spend limit is configured',\n )\n }\n if (\n options.allowIncompleteCostAccounting !== undefined &&\n typeof options.allowIncompleteCostAccounting !== 'boolean'\n ) {\n throw new Error('memory improvement allowIncompleteCostAccounting must be boolean')\n }\n if (\n options.activationTimeoutMs !== undefined &&\n (!Number.isSafeInteger(options.activationTimeoutMs) || options.activationTimeoutMs <= 0)\n ) {\n throw new Error('memory improvement activationTimeoutMs must be a positive safe integer')\n }\n const tolerance = options.criticalDimensionTolerance\n if (tolerance !== undefined && (!Number.isFinite(tolerance) || tolerance < 0 || tolerance > 1)) {\n throw new Error('memory improvement criticalDimensionTolerance must be between 0 and 1')\n }\n const minimum = options.minFinalScore\n if (minimum !== undefined && (!Number.isFinite(minimum) || minimum < 0 || minimum > 1)) {\n throw new Error('memory improvement minFinalScore must be between 0 and 1')\n }\n const dimensions = options.criticalDimensions ?? DEFAULT_CRITICAL_DIMENSIONS\n if (dimensions.some((dimension) => typeof dimension !== 'string' || !dimension.trim())) {\n throw new Error('memory improvement criticalDimensions must contain non-empty names')\n }\n if (new Set(dimensions).size !== dimensions.length) {\n throw new Error('memory improvement criticalDimensions must be unique')\n }\n assertIndependentSequences(\n options.trainSequences,\n options.selectionSequences,\n options.finalSequences,\n )\n}\n\nfunction assertIndependentSequences(\n train: readonly AgentMemorySequence[],\n selection: readonly AgentMemorySequence[],\n final: readonly AgentMemorySequence[],\n): void {\n if (train.length === 0) throw new Error('memory improvement requires training sequences')\n if (selection.length === 0) throw new Error('memory improvement requires selection sequences')\n if (final.length < 2) {\n throw new Error('memory improvement requires at least 2 final sequences')\n }\n const ids = new Map<string, string>()\n const content = new Map<string, { split: string; sequenceId: string }>()\n for (const [split, sequences] of [\n ['train', train],\n ['selection', selection],\n ['final', final],\n ] as const) {\n for (const sequence of sequences) {\n const priorId = ids.get(sequence.id)\n if (priorId) {\n throw new Error(\n `memory improvement ${priorId}/${split} sequences share id '${sequence.id}'`,\n )\n }\n ids.set(sequence.id, split)\n const fingerprint = memorySequenceFingerprint(sequence)\n const priorContent = content.get(fingerprint)\n if (priorContent) {\n throw new Error(\n `memory improvement ${priorContent.split}/${split} histories duplicate content at '${priorContent.sequenceId}'/'${sequence.id}'`,\n )\n }\n content.set(fingerprint, { split, sequenceId: sequence.id })\n }\n }\n}\n","import { randomUUID } from 'node:crypto'\nimport { canonicalJson } from '@tangle-network/agent-eval'\nimport { sha256, stableId } from '../ids'\nimport { defaultGetMemoryContext } from './adapter'\nimport { memoryWriteResultToSourceRecord } from './source-record'\nimport type {\n AgentMemoryAdapter,\n AgentMemoryHit,\n AgentMemoryKind,\n AgentMemoryScope,\n AgentMemorySearchOptions,\n AgentMemoryWriteInput,\n} from './types'\n\nexport type Mem0ClientMode = 'hosted' | 'oss'\n\nexport interface Mem0ClientLike {\n add(\n messages: Array<{ role: string; content: string }>,\n options?: Record<string, unknown>,\n ): Promise<unknown>\n search(query: string, options?: Record<string, unknown>): Promise<unknown>\n getAll?(options?: Record<string, unknown>): Promise<unknown>\n delete?(memoryId: string, options?: Record<string, unknown>): Promise<unknown>\n}\n\nexport interface Mem0MemoryAdapterOptions {\n client: Mem0ClientLike\n mode: Mem0ClientMode\n id?: string\n appId?: string\n infer?: boolean\n rerank?: boolean\n latestOnly?: boolean\n /** Bounds delayed-delete visibility checks and abandoned hosted-write recovery waits. */\n ingestionTimeoutMs?: number\n pollIntervalMs?: number\n /** Stable deployment/account identity for cache-key helpers. Never put credentials here. */\n backendRef?: string\n defaultScope?: AgentMemoryScope\n}\n\ninterface Mem0PendingWriteProbe {\n text: string\n providerIds: Set<string>\n filters: Record<string, unknown>\n expiresAt: number\n}\n\n/** Connects both the hosted Mem0 client and the open-source `Memory` class. */\nexport function createMem0MemoryAdapter(options: Mem0MemoryAdapterOptions): AgentMemoryAdapter {\n assertMem0Options(options)\n const id = options.id ?? `mem0-${options.mode}`\n const pendingWrites = new Set<Mem0PendingWriteProbe>()\n\n const adapter: AgentMemoryAdapter = {\n id,\n branchIsolation:\n options.mode === 'oss'\n ? { mode: 'scoped' }\n : {\n mode: 'scoped',\n processExitSafe: false,\n recoveryDelayMs: options.ingestionTimeoutMs ?? 30_000,\n },\n async search(query, searchOptions = {}) {\n assertMem0SearchOptions(searchOptions, id)\n if (searchOptions.limit === 0) return []\n const scope = mergeScopes(options.defaultScope, searchOptions.scope)\n assertMem0ProviderScope(scope, options.mode, id, 'search')\n const requestedKinds = [...new Set(searchOptions.kinds ?? [])]\n const kindQueries = requestedKinds.length > 0 ? requestedKinds : [undefined]\n const payloads = await Promise.all(\n kindQueries.map((kind) =>\n options.client.search(query, {\n filters: mem0Filters(scope, options.appId, kind),\n topK: searchOptions.limit,\n threshold: searchOptions.minScore,\n ...(options.rerank !== undefined ? { rerank: options.rerank } : {}),\n ...(options.mode === 'hosted' && options.latestOnly !== undefined\n ? { latestOnly: options.latestOnly }\n : {}),\n }),\n ),\n )\n return mergeMem0Hits(\n payloads.flatMap((raw) => normalizeMem0Hits(raw, id, searchOptions)),\n searchOptions.limit,\n )\n },\n async getContext(query, searchOptions = {}) {\n return defaultGetMemoryContext(adapter, query, searchOptions)\n },\n async write(input) {\n const scope = mergeScopes(options.defaultScope, input.scope)\n assertMem0ProviderScope(scope, options.mode, id, 'write')\n pruneExpiredMem0PendingWrites(pendingWrites)\n const writeId = input.id ?? randomUUID()\n const writeFilters = mem0Filters(scope, options.appId)\n const pendingProbe: Mem0PendingWriteProbe = {\n text: input.text,\n providerIds: new Set(),\n filters: writeFilters,\n expiresAt: Number.POSITIVE_INFINITY,\n }\n pendingWrites.add(pendingProbe)\n const scopeMetadata = mem0ScopeMetadata(scope, options.appId)\n const metadata = compactRecord({\n ...input.metadata,\n agentKnowledgeWriteId: writeId,\n memoryKind: input.kind,\n memoryTitle: input.title,\n entityName: input.entityName,\n entityType: input.entityType,\n category: input.category,\n predicate: input.predicate,\n subject: input.subject,\n object: input.object,\n confidence: input.confidence,\n originalRole: input.role,\n ...scopeMetadata,\n })\n const entity = mem0Entity(scope, options.appId)\n let raw: unknown\n try {\n raw = await options.client.add([{ role: mem0Role(input.role), content: input.text }], {\n ...entity,\n metadata,\n infer: options.infer ?? true,\n ...(options.mode === 'oss' ? { filters: writeFilters } : {}),\n })\n } finally {\n pendingProbe.expiresAt = Date.now() + (options.ingestionTimeoutMs ?? 30_000)\n }\n if (options.mode === 'hosted' && !Array.isArray(raw)) {\n throw new Error(\n `${id}: hosted Mem0 add returned an unsupported response; mem0ai 3.x must return a memory array`,\n )\n }\n const items = extractMem0Items(raw)\n const mutations = items.filter((candidate) => mem0Event(candidate) !== 'NOOP')\n const durableMutations = mutations.filter((candidate) => mem0Event(candidate) !== 'DELETE')\n for (const candidate of durableMutations) {\n const providerId = stringField(candidate, ['id'])\n if (providerId) pendingProbe.providerIds.add(providerId)\n }\n if (durableMutations.length === 0) {\n pendingWrites.delete(pendingProbe)\n }\n const item = mutations[0] ?? items[0]\n const itemId = stringField(item, ['id']) ?? writeId\n const event = mem0Event(item)\n const events = [...new Set(mutations.map(mem0Event).filter(Boolean))]\n const result = {\n accepted: mutations.length > 0,\n id: itemId,\n uri: `memory://${id}/${encodeURIComponent(itemId)}`,\n kind: input.kind,\n metadata: {\n provider: 'mem0',\n mode: options.mode,\n ...(event ? { event } : {}),\n ...(events.length > 1 ? { events } : {}),\n },\n } as const\n return {\n ...result,\n sourceRecord: memoryWriteResultToSourceRecord(result, input.text, { scope }),\n }\n },\n async clear(scope) {\n const mergedScope = mergeScopes(options.defaultScope, scope)\n assertMem0ProviderScope(mergedScope, options.mode, id, 'clear')\n pruneExpiredMem0PendingWrites(pendingWrites)\n const clearFilters = mem0Filters(mergedScope, options.appId)\n if (Object.keys(clearFilters).length === 0) {\n throw new Error(`${id}: refusing an unscoped Mem0 clear`)\n }\n if (options.client.getAll && options.client.delete) {\n const pendingForClear = [...pendingWrites].filter((pending) =>\n mem0FiltersInclude(pending.filters, clearFilters),\n )\n const deletedIds = new Set<string>()\n const searchProbes = new Map<string, Set<string>>()\n const observedPending = new Set<Mem0PendingWriteProbe>()\n for (const pending of pendingForClear) {\n const ids = searchProbes.get(pending.text) ?? new Set<string>()\n for (const providerId of pending.providerIds) ids.add(providerId)\n searchProbes.set(pending.text, ids)\n if (pending.providerIds.size > 0) observedPending.add(pending)\n }\n for (const pending of pendingForClear) {\n for (const providerId of pending.providerIds) {\n if (deletedIds.has(providerId)) continue\n await options.client.delete(providerId)\n deletedIds.add(providerId)\n }\n }\n const visibilityTimeoutMs = options.ingestionTimeoutMs ?? 30_000\n const pollIntervalMs = options.pollIntervalMs ?? 250\n let visibilityDeadline = Date.now() + visibilityTimeoutMs\n for (let batch = 0; batch < 100; ) {\n const raw = await options.client.getAll(\n options.mode === 'hosted'\n ? {\n filters: mem0Filters(mergedScope, options.appId),\n page: 1,\n pageSize: 100,\n latestOnly: false,\n showExpired: true,\n }\n : {\n filters: mem0Filters(mergedScope, options.appId),\n topK: 100,\n showExpired: true,\n },\n )\n const items = extractMem0Items(raw)\n if (items.length === 0) {\n const searchableByQuery = await searchableMem0IdsForCleanup(\n options,\n clearFilters,\n searchProbes,\n )\n const searchableIds = new Set(\n [...searchableByQuery.values()].flatMap((ids) => [...ids]),\n )\n const unseenSearchIds = [...searchableIds].filter(\n (memoryId) => !deletedIds.has(memoryId),\n )\n for (const [query, ids] of searchableByQuery) {\n const known = searchProbes.get(query) ?? new Set<string>()\n for (const memoryId of ids) known.add(memoryId)\n searchProbes.set(query, known)\n if (ids.size > 0) {\n for (const pending of pendingForClear) {\n if (pending.text === query) observedPending.add(pending)\n }\n }\n }\n if (unseenSearchIds.length > 0) {\n for (const memoryId of unseenSearchIds) {\n await options.client.delete(memoryId)\n deletedIds.add(memoryId)\n }\n batch += 1\n visibilityDeadline = Date.now() + visibilityTimeoutMs\n continue\n }\n const unresolvedPending = pendingForClear.some(\n (pending) => !observedPending.has(pending),\n )\n const needsQuietWindow = pendingForClear.some(\n (pending) => pending.providerIds.size === 0,\n )\n const remainingMs = visibilityDeadline - Date.now()\n if (remainingMs <= 0) {\n if (!unresolvedPending && searchableIds.size === 0) {\n removeMem0PendingWrites(pendingWrites, pendingForClear)\n return\n }\n if (searchableIds.size > 0) {\n throw new Error(\n `${id}: deleted Mem0 memories remained searchable after ${visibilityTimeoutMs}ms`,\n )\n }\n throw new Error(\n `${id}: a Mem0 write never became visible for exact cleanup within ${visibilityTimeoutMs}ms`,\n )\n }\n if (!unresolvedPending && searchableIds.size === 0 && !needsQuietWindow) {\n removeMem0PendingWrites(pendingWrites, pendingForClear)\n return\n }\n await sleep(Math.min(pollIntervalMs, remainingMs))\n continue\n }\n const rawIds = items.map((item) => stringField(item, ['id']))\n if (!rawIds.every((memoryId): memoryId is string => memoryId !== undefined)) {\n throw new Error(`${id}: Mem0 returned memories without ids during scoped clear`)\n }\n const ids = [...new Set(rawIds)]\n for (const item of items) {\n const memoryId = stringField(item, ['id'])!\n const text =\n stringField(item, ['memory', 'text', 'content']) ??\n stringField(recordField(item, 'data'), ['memory', 'text', 'content'])\n if (!text) continue\n const idsForText = searchProbes.get(text) ?? new Set<string>()\n idsForText.add(memoryId)\n searchProbes.set(text, idsForText)\n for (const pending of pendingForClear) {\n if (pending.text === text || pending.providerIds.has(memoryId)) {\n observedPending.add(pending)\n }\n }\n }\n const unseenIds = ids.filter((memoryId) => !deletedIds.has(memoryId))\n if (unseenIds.length === 0) {\n const remainingMs = visibilityDeadline - Date.now()\n if (remainingMs <= 0) {\n throw new Error(\n `${id}: deleted Mem0 memories remained visible after ${visibilityTimeoutMs}ms`,\n )\n }\n await sleep(Math.min(pollIntervalMs, remainingMs))\n continue\n }\n for (const memoryId of unseenIds) {\n await options.client.delete(memoryId)\n deletedIds.add(memoryId)\n }\n batch += 1\n visibilityDeadline = Date.now() + visibilityTimeoutMs\n }\n throw new Error(\n `${id}: refused to clear more than ${deletedIds.size} Mem0 memories in one call`,\n )\n }\n throw new Error(`${id}: exact scoped clear requires Mem0 getAll plus per-memory delete`)\n },\n }\n return adapter\n}\n\nfunction assertMem0Options(options: Mem0MemoryAdapterOptions): void {\n if (options.id !== undefined && (typeof options.id !== 'string' || !options.id.trim())) {\n throw new Error('Mem0 id must be a non-empty string')\n }\n if (options.appId !== undefined && (typeof options.appId !== 'string' || !options.appId.trim())) {\n throw new Error('Mem0 appId must be a non-empty string')\n }\n if (\n options.backendRef !== undefined &&\n (typeof options.backendRef !== 'string' || !options.backendRef.trim())\n ) {\n throw new Error('Mem0 backendRef must be a non-empty string')\n }\n for (const [name, value] of [\n ['ingestionTimeoutMs', options.ingestionTimeoutMs],\n ['pollIntervalMs', options.pollIntervalMs],\n ] as const) {\n if (value !== undefined && (!Number.isSafeInteger(value) || value <= 0)) {\n throw new Error(`Mem0 ${name} must be a positive safe integer`)\n }\n }\n}\n\nfunction assertMem0SearchOptions(options: AgentMemorySearchOptions, adapterId: string): void {\n if (options.limit !== undefined && (!Number.isSafeInteger(options.limit) || options.limit < 0)) {\n throw new Error(`${adapterId}: search limit must be a non-negative safe integer`)\n }\n if (options.minScore !== undefined && !Number.isFinite(options.minScore)) {\n throw new Error(`${adapterId}: minScore must be finite`)\n }\n}\n\nfunction assertMem0ProviderScope(\n scope: AgentMemoryScope,\n mode: Mem0ClientMode,\n adapterId: string,\n operation: 'search' | 'write' | 'clear',\n): void {\n if (scope.userId || scope.agentId || scope.runId || scope.namespace) return\n if (operation === 'clear') {\n throw new Error(\n `${adapterId}: refusing an unscoped Mem0 clear; provide scope.userId, scope.agentId, scope.runId, or scope.namespace`,\n )\n }\n throw new Error(\n `${adapterId}: Mem0 ${mode} ${operation} requires scope.userId, scope.agentId, scope.runId, or scope.namespace`,\n )\n}\n\nfunction normalizeMem0Hits(\n raw: unknown,\n adapterId: string,\n options: AgentMemorySearchOptions,\n): AgentMemoryHit[] {\n const limit = options.limit ?? Number.POSITIVE_INFINITY\n const kinds = options.kinds && options.kinds.length > 0 ? new Set(options.kinds) : null\n return extractMem0Items(raw)\n .map((item): AgentMemoryHit | undefined => {\n const text =\n stringField(item, ['memory', 'text', 'content']) ??\n stringField(recordField(item, 'data'), ['memory', 'text', 'content'])\n if (!text) return undefined\n const metadata = recordField(item, 'metadata')\n const kind = mem0Kind(metadata?.memoryKind ?? item?.memoryType)\n if (kinds && !kinds.has(kind)) return undefined\n const score = numberField(item, ['rerankScore', 'rerank_score', 'score'])\n if (options.minScore !== undefined && (score === undefined || score < options.minScore)) {\n return undefined\n }\n const memoryId =\n stringField(item, ['id']) ??\n stableId('mem', canonicalJson(compactRecord({ adapterId, text, metadata, item })))\n const normalizedScore = score !== undefined && score >= 0 && score <= 1 ? score : undefined\n return {\n id: memoryId,\n uri: `memory://${adapterId}/${encodeURIComponent(memoryId)}`,\n kind,\n text,\n ...(stringField(metadata, ['memoryTitle']) ? { title: String(metadata!.memoryTitle) } : {}),\n ...(score !== undefined ? { score } : {}),\n ...(normalizedScore !== undefined ? { normalizedScore } : {}),\n ...(dateField(item, ['createdAt', 'created_at'])\n ? { createdAt: dateField(item, ['createdAt', 'created_at']) }\n : {}),\n ...(dateField(item, ['expirationDate', 'expiration_date'])\n ? { validUntil: dateField(item, ['expirationDate', 'expiration_date']) }\n : {}),\n metadata: compactRecord({\n provider: 'mem0',\n ...metadata,\n categories: item?.categories,\n owner: item?.owner,\n runId: item?.runId,\n agentId: item?.agentId,\n userId: item?.userId,\n }),\n }\n })\n .filter((hit): hit is AgentMemoryHit => hit !== undefined)\n .slice(0, limit)\n}\n\nfunction mergeMem0Hits(hits: readonly AgentMemoryHit[], limit?: number): AgentMemoryHit[] {\n const unique = new Map<string, { hit: AgentMemoryHit; index: number; score?: number }>()\n for (const [index, hit] of hits.entries()) {\n const key = JSON.stringify([hit.uri, hit.text])\n const score = hit.normalizedScore ?? hit.score\n const finiteScore = score !== undefined && Number.isFinite(score) ? score : undefined\n const prior = unique.get(key)\n if (!prior) {\n unique.set(key, { hit, index, score: finiteScore })\n } else if (\n finiteScore !== undefined &&\n (prior.score === undefined || finiteScore > prior.score)\n ) {\n unique.set(key, { hit, index: prior.index, score: finiteScore })\n }\n }\n return [...unique.values()]\n .sort(\n (left, right) =>\n Number(right.score !== undefined) - Number(left.score !== undefined) ||\n (right.score ?? 0) - (left.score ?? 0) ||\n left.index - right.index,\n )\n .map(({ hit }) => hit)\n .slice(0, limit ?? Number.POSITIVE_INFINITY)\n}\n\nfunction extractMem0Items(raw: unknown): Array<Record<string, unknown>> {\n if (Array.isArray(raw)) return raw.filter(isRecord)\n if (!isRecord(raw)) return []\n for (const key of ['results', 'memories', 'data']) {\n if (Array.isArray(raw[key])) return raw[key].filter(isRecord)\n }\n return [raw]\n}\n\nfunction mem0Event(item: Record<string, unknown> | undefined): string | undefined {\n return (\n stringField(item, ['event']) ?? stringField(recordField(item, 'metadata'), ['event'])\n )?.toUpperCase()\n}\n\nfunction mem0Entity(scope: AgentMemoryScope, appId?: string): Record<string, string> {\n return compactStringRecord({\n userId: scope.userId,\n agentId: scope.agentId,\n appId,\n runId: scope.namespace ?? scope.runId,\n })\n}\n\nfunction mem0Filters(\n scope: AgentMemoryScope,\n appId: string | undefined,\n kind?: AgentMemoryKind,\n): Record<string, unknown> {\n const entity = mem0EntityFilters(scope, appId)\n const customMetadata = compactRecord({\n ...mem0CustomScopeMetadata(scope),\n memoryKind: kind,\n })\n return compactRecord({ ...entity, ...customMetadata })\n}\n\nfunction mem0ScopeMetadata(scope: AgentMemoryScope, appId?: string): Record<string, string> {\n return { ...mem0EntityFilters(scope, appId), ...mem0CustomScopeMetadata(scope) }\n}\n\nfunction mem0EntityFilters(scope: AgentMemoryScope, appId?: string): Record<string, string> {\n return compactStringRecord({\n user_id: scope.userId,\n agent_id: scope.agentId,\n run_id: scope.namespace ?? scope.runId,\n app_id: appId,\n })\n}\n\nfunction mem0CustomScopeMetadata(scope: AgentMemoryScope): Record<string, string> {\n const metadata = compactStringRecord({\n logical_run_id: scope.namespace ? scope.runId : undefined,\n tenant_id: scope.tenantId,\n team_id: scope.teamId,\n session_id: scope.sessionId,\n })\n for (const [key, value] of Object.entries(scope.tags ?? {})) {\n metadata[`tag_${key}`] = value\n }\n return metadata\n}\n\nasync function searchableMem0IdsForCleanup(\n options: Mem0MemoryAdapterOptions,\n filters: Record<string, unknown>,\n probes: ReadonlyMap<string, ReadonlySet<string>>,\n): Promise<ReadonlyMap<string, ReadonlySet<string>>> {\n const searchable = new Map<string, ReadonlySet<string>>()\n const entries = [...probes]\n for (let offset = 0; offset < entries.length; offset += 8) {\n const results = await Promise.all(\n entries.slice(offset, offset + 8).map(async ([query, expectedIds]) => {\n const raw = await options.client.search(query, {\n filters,\n topK: Math.min(100, Math.max(10, expectedIds.size)),\n ...(options.mode === 'hosted' ? { latestOnly: false, showExpired: true } : {}),\n })\n return extractMem0Items(raw).map((item) => {\n const memoryId = stringField(item, ['id'])\n if (!memoryId) {\n throw new Error(\n `${options.id ?? `mem0-${options.mode}`}: Mem0 search returned a memory without an id during clear verification`,\n )\n }\n return memoryId\n })\n }),\n )\n for (const [index, ids] of results.entries()) {\n const query = entries[offset + index]![0]\n searchable.set(query, new Set(ids))\n }\n }\n return searchable\n}\n\nfunction mem0FiltersInclude(\n candidate: Readonly<Record<string, unknown>>,\n requested: Readonly<Record<string, unknown>>,\n): boolean {\n return Object.entries(requested).every(([key, value]) => Object.is(candidate[key], value))\n}\n\nfunction removeMem0PendingWrites(\n pendingWrites: Set<Mem0PendingWriteProbe>,\n removed: readonly Mem0PendingWriteProbe[],\n): void {\n for (const pending of removed) pendingWrites.delete(pending)\n}\n\nfunction pruneExpiredMem0PendingWrites(pendingWrites: Set<Mem0PendingWriteProbe>): void {\n const now = Date.now()\n for (const pending of pendingWrites) {\n if (pending.expiresAt <= now) pendingWrites.delete(pending)\n }\n}\n\nfunction mem0Role(role: AgentMemoryWriteInput['role']): 'user' | 'assistant' {\n return role === 'assistant' || role === 'tool' ? 'assistant' : 'user'\n}\n\nfunction mem0Kind(value: unknown): AgentMemoryKind {\n switch (value) {\n case 'message':\n case 'entity':\n case 'fact':\n case 'preference':\n case 'observation':\n case 'reasoning-trace':\n return value\n default:\n return 'fact'\n }\n}\n\nfunction mergeScopes(base?: AgentMemoryScope, extra?: AgentMemoryScope): AgentMemoryScope {\n return {\n ...(base ?? {}),\n ...(extra ?? {}),\n tags: { ...(base?.tags ?? {}), ...(extra?.tags ?? {}) },\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nfunction compactRecord(input: Record<string, unknown>): Record<string, unknown> {\n return Object.fromEntries(Object.entries(input).filter(([, value]) => value !== undefined))\n}\n\nfunction compactStringRecord(input: Record<string, string | undefined>): Record<string, string> {\n return Object.fromEntries(\n Object.entries(input).filter((entry): entry is [string, string] => entry[1] !== undefined),\n )\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction recordField(\n value: Record<string, unknown> | undefined,\n key: string,\n): Record<string, unknown> | undefined {\n const field = value?.[key]\n return isRecord(field) ? field : undefined\n}\n\nfunction stringField(\n value: Record<string, unknown> | undefined,\n keys: readonly string[],\n): string | undefined {\n for (const key of keys) {\n const field = value?.[key]\n if (typeof field === 'string' && field.length > 0) return field\n }\n return undefined\n}\n\nfunction numberField(\n value: Record<string, unknown> | undefined,\n keys: readonly string[],\n): number | undefined {\n for (const key of keys) {\n const field = value?.[key]\n if (typeof field === 'number' && Number.isFinite(field)) return field\n }\n return undefined\n}\n\nfunction dateField(\n value: Record<string, unknown> | undefined,\n keys: readonly string[],\n): string | undefined {\n for (const key of keys) {\n const field = value?.[key]\n if (typeof field === 'string' && field.length > 0) return field\n if (field instanceof Date && !Number.isNaN(field.valueOf())) return field.toISOString()\n }\n return undefined\n}\n\n/** Stable identity useful for dispatch/cache keys without exposing client credentials. */\nexport function mem0MemoryAdapterIdentity(\n options: Pick<\n Mem0MemoryAdapterOptions,\n | 'mode'\n | 'id'\n | 'appId'\n | 'infer'\n | 'rerank'\n | 'latestOnly'\n | 'ingestionTimeoutMs'\n | 'pollIntervalMs'\n | 'defaultScope'\n > & { backendRef: string },\n): string {\n if (typeof options.backendRef !== 'string' || !options.backendRef.trim()) {\n throw new Error('Mem0 backendRef must be a non-empty string')\n }\n return `sha256:${sha256(canonicalJson(compactRecord(options)))}`\n}\n","import { canonicalJson } from '@tangle-network/agent-eval'\nimport { stableId } from '../ids'\nimport { defaultGetMemoryContext } from './adapter'\nimport { emitRetrievalHoldoutBypass } from './holdout'\nimport { mergeRankedMemoryHits } from './rank'\nimport { memoryHitToSourceRecord, memoryWriteResultToSourceRecord } from './source-record'\nimport type {\n AgentMemoryAdapter,\n AgentMemoryHit,\n AgentMemoryScope,\n AgentMemorySearchOptions,\n AgentMemoryWriteInput,\n AgentMemoryWriteResult,\n} from './types'\n\nexport interface Neo4jAgentMemoryAdapterOptions {\n client: object\n /** Match the transport passed to the official MemoryClient. */\n transport: 'rest' | 'bridge'\n /** Use Neo4j's whole-conversation context instead of query-based search. */\n contextMode?: 'search' | 'native'\n id?: string\n /** Assert that the client owns disposable external state for this exact branch. */\n branchId?: string\n}\n\nexport function createNeo4jAgentMemoryAdapter(\n options: Neo4jAgentMemoryAdapterOptions,\n): AgentMemoryAdapter {\n assertNeo4jOptions(options)\n const client = options.client as Record<string, unknown>\n const id = options.id ?? 'neo4j-agent-memory'\n const isolatedInstance = options.branchId !== undefined\n const adapter: AgentMemoryAdapter = {\n id,\n branchIsolation: options.branchId\n ? { mode: 'instance', branchId: options.branchId, supportsLogicalScopes: false }\n : {\n mode: 'unsupported',\n reason: 'create a separate MemoryClient namespace per branch and pass branchId',\n },\n async search(query, searchOptions = {}) {\n assertNeo4jSearchOptions(searchOptions, id)\n return searchNeo4jMemory(\n client,\n query,\n searchOptions,\n id,\n options.transport,\n isolatedInstance,\n )\n },\n async getContext(query, searchOptions = {}) {\n assertNeo4jSearchOptions(searchOptions, id)\n assertNeo4jSearchKinds(searchOptions.kinds, options.transport, id)\n const shortTerm = nested(client, ['shortTerm', 'short_term'], {})\n const sessionId = searchOptions.scope?.sessionId\n if (options.contextMode === 'native' && options.transport !== 'rest') {\n throw new Error(`${id}: Neo4j native context requires transport=\"rest\"`)\n }\n if (options.contextMode === 'native' && !sessionId) {\n throw new Error(`${id}: Neo4j native context requires scope.sessionId`)\n }\n if (\n options.contextMode === 'native' &&\n searchOptions.kinds?.some((kind) => kind !== 'message' && kind !== 'observation')\n ) {\n throw new Error(\n `${id}: Neo4j native context only returns message and observation memory kinds`,\n )\n }\n if (options.contextMode === 'native' && options.transport === 'rest' && sessionId) {\n assertNeo4jScopeSupported(\n searchOptions.scope,\n ['sessionId'],\n id,\n 'native context read',\n isolatedInstance,\n )\n const conversationContext = await callRequired(shortTerm, ['getContext'], [sessionId])\n const hits = normalizeConversationContextHits(conversationContext, searchOptions, id)\n const text = renderHits(hits)\n if (searchOptions.holdout) {\n emitRetrievalHoldoutBypass(\n hits,\n searchOptions.holdout,\n holdoutBypassContext(query, searchOptions),\n 'short-term-context',\n )\n }\n return {\n query,\n text,\n hits,\n sourceRecords: hits.map((hit) =>\n memoryHitToSourceRecord(hit, { scope: searchOptions.scope }),\n ),\n metadata: { adapter: id, rawContext: conversationContext },\n }\n }\n\n return defaultGetMemoryContext(adapter, query, searchOptions)\n },\n async write(input) {\n const result = await writeNeo4jMemory(client, input, id, options.transport, isolatedInstance)\n return {\n ...result,\n sourceRecord: memoryWriteResultToSourceRecord(result, input.text, { scope: input.scope }),\n }\n },\n async close() {\n await callOptional(client, ['close'], [])\n },\n }\n return adapter\n}\n\nfunction assertNeo4jOptions(options: Neo4jAgentMemoryAdapterOptions): void {\n if (typeof options.client !== 'object' || options.client === null) {\n throw new Error('Neo4j agent-memory client must be an object')\n }\n if (options.id !== undefined && (typeof options.id !== 'string' || !options.id.trim())) {\n throw new Error('Neo4j agent-memory id must be a non-empty string')\n }\n if (\n options.branchId !== undefined &&\n (typeof options.branchId !== 'string' || !options.branchId.trim())\n ) {\n throw new Error('Neo4j agent-memory branchId must be a non-empty string')\n }\n if (options.contextMode !== undefined && !['search', 'native'].includes(options.contextMode)) {\n throw new Error('Neo4j agent-memory contextMode must be search or native')\n }\n}\n\nfunction assertNeo4jSearchOptions(options: AgentMemorySearchOptions, adapterId: string): void {\n if (options.limit !== undefined && (!Number.isSafeInteger(options.limit) || options.limit < 0)) {\n throw new Error(`${adapterId}: search limit must be a non-negative safe integer`)\n }\n if (options.minScore !== undefined && !Number.isFinite(options.minScore)) {\n throw new Error(`${adapterId}: minScore must be finite`)\n }\n}\n\nfunction assertNeo4jSearchKinds(\n kinds: AgentMemorySearchOptions['kinds'],\n transport: 'rest' | 'bridge',\n adapterId: string,\n): void {\n if (!kinds?.length) return\n const supported = new Set<AgentMemoryHit['kind']>(\n transport === 'rest'\n ? ['message', 'observation', 'entity']\n : ['message', 'observation', 'entity', 'preference', 'reasoning-trace'],\n )\n const unsupported = [...new Set(kinds.filter((kind) => !supported.has(kind)))]\n if (unsupported.length > 0) {\n throw new Error(\n `${adapterId}: Neo4j ${transport} cannot search memory kinds: ${unsupported.join(', ')}`,\n )\n }\n}\n\nfunction assertNeo4jBridgeCapability(\n transport: 'rest' | 'bridge',\n kind: AgentMemoryWriteInput['kind'],\n adapterId: string,\n): void {\n if (transport === 'bridge') return\n throw new Error(\n `${adapterId}: Neo4j REST cannot write ${kind}; use transport=\"bridge\" or map it to an entity/message`,\n )\n}\n\nasync function writeNeo4jMemory(\n client: Record<string, unknown>,\n input: AgentMemoryWriteInput,\n adapterId: string,\n transport: 'rest' | 'bridge',\n isolatedInstance: boolean,\n): Promise<AgentMemoryWriteResult> {\n const scope = input.scope ?? {}\n const sessionId = scope.sessionId ?? input.metadata?.sessionId\n assertNeo4jScopeSupported(\n input.scope,\n input.kind === 'message' || input.kind === 'observation'\n ? ['sessionId']\n : input.kind === 'reasoning-trace'\n ? ['sessionId', 'runId']\n : [],\n adapterId,\n `${input.kind} write`,\n isolatedInstance,\n )\n if (\n !isolatedInstance &&\n input.kind === 'reasoning-trace' &&\n scope.sessionId !== undefined &&\n scope.runId !== undefined\n ) {\n throw new Error(\n `${adapterId}: Neo4j reasoning write cannot enforce both sessionId and runId; provide one`,\n )\n }\n let result: unknown\n if (input.kind === 'message' || input.kind === 'observation') {\n if (transport === 'rest' && typeof sessionId !== 'string') {\n throw new Error(\n `${adapterId}: Neo4j REST message writes require scope.sessionId as the conversation id`,\n )\n }\n const shortTerm = nested(client, ['shortTerm', 'short_term'], client)\n const metadata = { ...input.metadata, agentKnowledgeKind: input.kind }\n result = await callRequired(\n shortTerm,\n ['addMessage'],\n [\n sessionId,\n neo4jMessageRole(input.role),\n input.text,\n { metadata, conversationId: sessionId },\n ],\n )\n } else if (input.kind === 'entity') {\n const longTerm = nested(client, ['longTerm', 'long_term'], client)\n result = await callRequired(\n longTerm,\n ['addEntity'],\n [\n input.entityName ?? input.title ?? input.text,\n input.entityType ?? 'custom',\n neo4jEntityOptions(input),\n ],\n )\n } else if (input.kind === 'preference') {\n assertNeo4jBridgeCapability(transport, input.kind, adapterId)\n const longTerm = nested(client, ['longTerm', 'long_term'], client)\n result = await callRequired(\n longTerm,\n ['addPreference'],\n [input.category ?? 'general', input.text, neo4jPreferenceOptions(input)],\n )\n } else if (input.kind === 'reasoning-trace') {\n const reasoning = nested(client, ['reasoning'], client)\n const conversationId = sessionId ?? scope.runId\n if (transport === 'rest') {\n if (typeof conversationId !== 'string') {\n throw new Error(\n `${adapterId}: Neo4j REST reasoning writes require scope.sessionId or scope.runId`,\n )\n }\n result = await callRequired(\n reasoning,\n ['recordStep'],\n [\n {\n conversationId,\n reasoning: input.text,\n actionTaken: stringMetadata(input.metadata, 'action') ?? input.title ?? 'memory',\n result:\n stringMetadata(input.metadata, 'result') ??\n stringMetadata(input.metadata, 'observation') ??\n stringMetadata(input.metadata, 'outcome'),\n },\n ],\n )\n } else {\n const trace = await callRequired(\n reasoning,\n ['startTrace'],\n [\n conversationId ?? stableId('session', input.text),\n stringMetadata(input.metadata, 'task') ?? input.title ?? input.text,\n ],\n )\n assertNeo4jWriteSucceeded(trace, adapterId, 'startTrace')\n const traceId = idFromResult(trace)\n if (!traceId) throw new Error(`${adapterId}: Neo4j startTrace returned no trace id`)\n try {\n const step = await callRequired(\n reasoning,\n ['addStep'],\n [\n traceId,\n {\n thought: input.text,\n observation: stringMetadata(input.metadata, 'observation'),\n action: stringMetadata(input.metadata, 'action'),\n },\n ],\n )\n assertNeo4jWriteSucceeded(step, adapterId, 'addStep')\n } catch (error) {\n try {\n await callRequired(\n reasoning,\n ['completeTrace'],\n [traceId, { outcome: 'agent-knowledge addStep failed', success: false }],\n )\n } catch (cleanupError) {\n throw new AggregateError(\n [error, cleanupError],\n `${adapterId}: Neo4j reasoning step and trace cleanup failed`,\n )\n }\n throw error\n }\n result = await callRequired(\n reasoning,\n ['completeTrace'],\n [\n traceId,\n {\n outcome: stringMetadata(input.metadata, 'outcome'),\n success:\n typeof input.metadata?.success === 'boolean' ? input.metadata.success : undefined,\n },\n ],\n )\n }\n } else {\n assertNeo4jBridgeCapability(transport, input.kind, adapterId)\n result = await callRequired(\n nested(client, ['longTerm', 'long_term'], client),\n ['addFact'],\n [\n input.subject ?? input.title ?? input.kind,\n input.predicate ?? 'states',\n input.object ?? input.text,\n ],\n )\n }\n\n assertNeo4jWriteSucceeded(result, adapterId, input.kind)\n\n const id =\n idFromResult(result) ??\n input.id ??\n stableId(\n 'mem',\n canonicalJson({ adapterId, kind: input.kind, text: input.text, scope: input.scope ?? {} }),\n )\n return {\n accepted: true,\n id,\n uri: `memory://${adapterId}/${encodeURIComponent(id)}`,\n kind: input.kind,\n metadata: { provider: 'neo4j-agent-memory', transport },\n }\n}\n\nfunction assertNeo4jWriteSucceeded(value: unknown, adapterId: string, operation: string): void {\n const response = record(value)\n if (!response) return\n const status = stringField(response, ['status'])?.toLowerCase()\n if (\n response.success === false ||\n response.ok === false ||\n response.isError === true ||\n status === 'failed' ||\n status === 'error'\n ) {\n const nestedError = record(response.error)\n const detail =\n stringField(response, ['error', 'message', 'detail']) ??\n (nestedError ? stringField(nestedError, ['message', 'detail']) : undefined)\n throw new Error(`${adapterId}: Neo4j ${operation} failed${detail ? `: ${detail}` : ''}`)\n }\n}\n\nasync function searchNeo4jMemory(\n client: Record<string, unknown>,\n query: string,\n options: AgentMemorySearchOptions,\n adapterId: string,\n transport: 'rest' | 'bridge',\n isolatedInstance: boolean,\n): Promise<AgentMemoryHit[]> {\n const limit = options.limit ?? 10\n if (limit === 0) return []\n assertNeo4jSearchKinds(options.kinds, transport, adapterId)\n const onlyConversationKinds =\n options.kinds !== undefined &&\n options.kinds.length > 0 &&\n options.kinds.every((kind) => kind === 'message' || kind === 'observation')\n assertNeo4jScopeSupported(\n options.scope,\n onlyConversationKinds ? ['sessionId'] : [],\n adapterId,\n 'search',\n isolatedInstance,\n )\n const searches: Promise<AgentMemoryHit[]>[] = []\n const kinds = options.kinds\n const includeKind = (kind: AgentMemoryHit['kind']) => !kinds?.length || kinds.includes(kind)\n const shortTerm = nested(client, ['shortTerm', 'short_term'], {})\n const longTerm = nested(client, ['longTerm', 'long_term'], {})\n const reasoning = nested(client, ['reasoning'], {})\n const wantsMessages = includeKind('message') || includeKind('observation')\n const hasConversation = typeof options.scope?.sessionId === 'string'\n\n if (\n transport === 'rest' &&\n wantsMessages &&\n !hasConversation &&\n options.kinds?.some((kind) => kind === 'message' || kind === 'observation')\n ) {\n throw new Error(\n `${adapterId}: Neo4j REST message search requires scope.sessionId as the conversation id`,\n )\n }\n\n if (wantsMessages && (transport === 'bridge' || hasConversation)) {\n const messageKinds = options.kinds?.filter(\n (kind) => kind === 'message' || kind === 'observation',\n ) ?? ['message', 'observation']\n searches.push(\n callRequired(shortTerm, ['searchMessages'], [query, searchMessagesOptions(options)]).then(\n (result) => normalizeHits(result, { ...options, kinds: messageKinds }, adapterId),\n ),\n )\n }\n\n if (includeKind('entity')) {\n searches.push(\n callRequired(longTerm, ['searchEntities'], [query, searchEntitiesOptions(options)]).then(\n (result) => normalizeHits(result, { ...options, kinds: ['entity'] }, adapterId),\n ),\n )\n }\n\n if (transport === 'bridge' && includeKind('preference')) {\n searches.push(\n callRequired(\n longTerm,\n ['searchPreferences'],\n [query, searchPreferencesOptions(options)],\n ).then((result) => normalizeHits(result, { ...options, kinds: ['preference'] }, adapterId)),\n )\n }\n\n if (transport === 'bridge' && includeKind('reasoning-trace')) {\n searches.push(\n callRequired(reasoning, ['getSimilarTraces'], [query, similarTracesOptions(options)]).then(\n (result) => normalizeHits(result, { ...options, kinds: ['reasoning-trace'] }, adapterId),\n ),\n )\n }\n\n return mergeRankedMemoryHits(await Promise.all(searches), limit)\n}\n\n// Mirrors defaultGetMemoryContext's holdout call context so bypass events join the same log stream.\nfunction holdoutBypassContext(\n query: string,\n options: AgentMemorySearchOptions,\n): { query: string; scope?: AgentMemoryScope; taskId?: string } {\n return {\n query,\n ...(options.scope !== undefined ? { scope: options.scope } : {}),\n ...(options.scope?.tags?.taskId !== undefined ? { taskId: options.scope.tags.taskId } : {}),\n }\n}\n\nfunction searchMessagesOptions(options: AgentMemorySearchOptions): Record<string, unknown> {\n return {\n limit: options.limit,\n sessionId: options.scope?.sessionId,\n conversationId: options.scope?.sessionId,\n threshold: options.minScore,\n }\n}\n\nfunction searchEntitiesOptions(options: AgentMemorySearchOptions): Record<string, unknown> {\n return {\n limit: options.limit,\n type: options.metadata?.type,\n }\n}\n\nfunction searchPreferencesOptions(options: AgentMemorySearchOptions): Record<string, unknown> {\n return {\n limit: options.limit,\n category: options.metadata?.category,\n }\n}\n\nfunction similarTracesOptions(options: AgentMemorySearchOptions): Record<string, unknown> {\n return {\n limit: options.limit,\n successOnly: options.metadata?.successOnly,\n }\n}\n\nfunction assertNeo4jScopeSupported(\n scope: AgentMemoryScope | undefined,\n allowedKeys: readonly (keyof AgentMemoryScope)[],\n adapterId: string,\n operation: string,\n isolatedInstance: boolean,\n): void {\n if (isolatedInstance || !scope) return\n const allowed = new Set<keyof AgentMemoryScope>(allowedKeys)\n const scopeKeys: readonly (keyof AgentMemoryScope)[] = [\n 'tenantId',\n 'userId',\n 'agentId',\n 'teamId',\n 'runId',\n 'sessionId',\n 'namespace',\n ]\n const supplied = scopeKeys.filter((key) => scope[key] !== undefined)\n if (scope.tags && Object.keys(scope.tags).length > 0) supplied.push('tags')\n const unsupported = supplied.filter((key) => !allowed.has(key))\n if (unsupported.length === 0) return\n throw new Error(\n `${adapterId}: Neo4j ${operation} cannot enforce scope fields: ${unsupported.join(', ')}; create a dedicated client and pass branchId`,\n )\n}\n\nfunction neo4jEntityOptions(input: AgentMemoryWriteInput): Record<string, unknown> {\n return {\n description: input.metadata?.description ?? input.title,\n }\n}\n\nfunction neo4jPreferenceOptions(input: AgentMemoryWriteInput): Record<string, unknown> {\n return {\n context: input.metadata?.context ?? input.title,\n }\n}\n\nasync function callOptional(\n target: Record<string, unknown>,\n names: string[],\n args: unknown[],\n): Promise<unknown> {\n for (const name of names) {\n const fn = target[name]\n if (typeof fn === 'function') return await fn.apply(target, args)\n }\n return undefined\n}\n\nasync function callRequired(\n target: Record<string, unknown>,\n names: string[],\n args: unknown[],\n): Promise<unknown> {\n for (const name of names) {\n const fn = target[name]\n if (typeof fn === 'function') return await fn.apply(target, args)\n }\n throw new Error(`Neo4j agent-memory client is missing method ${names.join(' or ')}`)\n}\n\nfunction nested(\n target: Record<string, unknown>,\n names: string[],\n fallback: Record<string, unknown>,\n): Record<string, unknown> {\n for (const name of names) {\n const value = target[name]\n if (value && typeof value === 'object') return value as Record<string, unknown>\n }\n return fallback\n}\n\nfunction normalizeHits(\n value: unknown,\n options: AgentMemorySearchOptions,\n adapterId: string,\n): AgentMemoryHit[] {\n const rawHits = rawHitsFrom(value)\n return rawHits\n .map((hit, index) => normalizeHit(hit, index, adapterId))\n .filter((hit): hit is AgentMemoryHit => hit !== null)\n .filter((hit) =>\n options.minScore === undefined\n ? true\n : (hit.normalizedScore ?? hit.score ?? 0) >= options.minScore!,\n )\n .filter((hit) => (options.kinds?.length ? options.kinds.includes(hit.kind) : true))\n .slice(0, options.limit ?? 10)\n}\n\nfunction normalizeHit(value: unknown, index: number, adapterId: string): AgentMemoryHit | null {\n if (typeof value === 'string') {\n return {\n id: stableId('mem', value),\n uri: `memory://${adapterId}/${stableId('mem', value)}`,\n kind: 'fact',\n text: value,\n normalizedScore: index === 0 ? 1 : undefined,\n }\n }\n const obj = record(value)\n if (!obj) return null\n const metadata = record(obj.metadata) ?? {}\n const kind = memoryKind(\n stringField(metadata, ['agentKnowledgeKind']) ?? stringField(obj, ['kind', 'type', 'label']),\n obj,\n )\n const text = textFromHitObject(obj, kind)\n if (!text) return null\n const id = stringField(obj, ['id', 'memoryId', 'uuid']) ?? stableId('mem', text)\n return {\n id,\n uri: stringField(obj, ['uri']) ?? `memory://${adapterId}/${encodeURIComponent(id)}`,\n kind,\n text,\n title: stringField(obj, ['title', 'name', 'task', 'subject']),\n score: numberField(obj, ['score']),\n normalizedScore: numberField(obj, ['normalizedScore', 'normalized_score']),\n confidence: numberField(obj, ['confidence']),\n createdAt: stringField(obj, ['createdAt', 'created_at']),\n validUntil: stringField(obj, ['validUntil', 'valid_until']),\n lastVerifiedAt: stringField(obj, ['lastVerifiedAt', 'last_verified_at']),\n metadata: obj,\n }\n}\n\nfunction memoryKind(\n value: string | undefined,\n obj: Record<string, unknown> = {},\n): AgentMemoryHit['kind'] {\n if (\n value === 'message' ||\n value === 'entity' ||\n value === 'fact' ||\n value === 'preference' ||\n value === 'observation' ||\n value === 'reasoning-trace'\n ) {\n return value\n }\n if ('role' in obj && 'content' in obj) return 'message'\n if ('name' in obj && ('type' in obj || 'entityType' in obj)) return 'entity'\n if ('preference' in obj && 'category' in obj) return 'preference'\n if ('task' in obj && 'steps' in obj) return 'reasoning-trace'\n return 'fact'\n}\n\nfunction rawHitsFrom(value: unknown): unknown[] {\n if (Array.isArray(value)) return value\n const obj = record(value)\n if (!obj) return typeof value === 'string' ? [value] : []\n if (Array.isArray(obj.hits)) return obj.hits\n if (Array.isArray(obj.results)) return obj.results\n if (Array.isArray(obj.messages)) return obj.messages\n if (Array.isArray(obj.recentMessages)) return obj.recentMessages\n if (Array.isArray(obj.observations)) return obj.observations\n if (Array.isArray(obj.reflections)) return obj.reflections\n if (typeof obj.content === 'string' || typeof obj.text === 'string') return [obj]\n return []\n}\n\nfunction textFromHitObject(\n obj: Record<string, unknown>,\n kind: AgentMemoryHit['kind'],\n): string | undefined {\n const direct = stringField(obj, [\n 'text',\n 'content',\n 'body',\n 'summary',\n 'preference',\n 'description',\n ])\n if (direct) return direct\n if (kind === 'entity') return stringField(obj, ['name'])\n if (kind === 'fact') {\n const subject = stringField(obj, ['subject'])\n const predicate = stringField(obj, ['predicate'])\n const object = stringField(obj, ['object', 'obj'])\n if (subject && predicate && object) return `${subject} ${predicate} ${object}`\n }\n if (kind === 'reasoning-trace') {\n const task = stringField(obj, ['task'])\n const outcome = stringField(obj, ['outcome'])\n return [task, outcome].filter(Boolean).join('\\n') || undefined\n }\n return undefined\n}\n\nfunction normalizeConversationContextHits(\n value: unknown,\n options: AgentMemorySearchOptions,\n adapterId: string,\n): AgentMemoryHit[] {\n const obj = record(value)\n if (!obj) return normalizeHits(value, options, adapterId)\n const raw = [\n ...rawHitsFrom(obj.reflections).map((hit) => tagContextHit(hit, 'observation', 'Reflection')),\n ...rawHitsFrom(obj.observations).map((hit) => tagContextHit(hit, 'observation', 'Observation')),\n ...rawHitsFrom(obj.recentMessages).map((hit) => tagContextHit(hit, 'message')),\n ]\n return raw.length > 0\n ? normalizeHits(raw, options, adapterId)\n : normalizeHits(value, options, adapterId)\n}\n\nfunction tagContextHit(\n value: unknown,\n kind: AgentMemoryHit['kind'],\n title?: string,\n): Record<string, unknown> {\n return value && typeof value === 'object' && !Array.isArray(value)\n ? { kind, title, ...(value as Record<string, unknown>) }\n : { kind, title, content: value }\n}\n\nfunction renderHits(hits: AgentMemoryHit[]): string {\n return hits.map((hit) => hit.text).join('\\n\\n')\n}\n\nfunction idFromResult(value: unknown): string | undefined {\n const obj = record(value)\n return obj ? stringField(obj, ['id', 'memoryId', 'uuid']) : undefined\n}\n\nfunction record(value: unknown): Record<string, unknown> | null {\n return value && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null\n}\n\nfunction stringField(obj: Record<string, unknown>, names: string[]): string | undefined {\n for (const name of names) {\n const value = obj[name]\n if (typeof value === 'string' && value.length > 0) return value\n }\n return undefined\n}\n\nfunction numberField(obj: Record<string, unknown>, names: string[]): number | undefined {\n for (const name of names) {\n const value = obj[name]\n if (typeof value === 'number' && Number.isFinite(value)) return value\n }\n return undefined\n}\n\nfunction neo4jMessageRole(role: AgentMemoryWriteInput['role']): 'system' | 'user' | 'assistant' {\n return role === 'tool' ? 'assistant' : (role ?? 'user')\n}\n\nfunction stringMetadata(\n metadata: Record<string, unknown> | undefined,\n key: string,\n): string | undefined {\n const value = metadata?.[key]\n return typeof value === 'string' && value.length > 0 ? value : undefined\n}\n","import { z } from 'zod'\n\nexport const AgentMemoryKindSchema = z.enum([\n 'message',\n 'entity',\n 'fact',\n 'preference',\n 'observation',\n 'reasoning-trace',\n])\n\nexport const AgentMemoryScopeSchema = z.object({\n tenantId: z.string().optional(),\n userId: z.string().optional(),\n agentId: z.string().optional(),\n teamId: z.string().optional(),\n runId: z.string().optional(),\n sessionId: z.string().optional(),\n namespace: z.string().optional(),\n tags: z.record(z.string(), z.string()).optional(),\n})\n\nexport const AgentMemoryHitSchema = z.object({\n id: z.string().min(1),\n uri: z.string().min(1),\n kind: AgentMemoryKindSchema,\n text: z.string().min(1),\n title: z.string().optional(),\n score: z.number().optional(),\n normalizedScore: z.number().optional(),\n confidence: z.number().optional(),\n createdAt: z.string().optional(),\n validUntil: z.string().optional(),\n lastVerifiedAt: z.string().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n})\n\nexport const AgentMemoryWriteInputSchema = z.object({\n kind: AgentMemoryKindSchema,\n text: z.string().min(1),\n id: z.string().optional(),\n title: z.string().optional(),\n role: z.enum(['system', 'user', 'assistant', 'tool']).optional(),\n entityName: z.string().optional(),\n entityType: z.string().optional(),\n category: z.string().optional(),\n predicate: z.string().optional(),\n subject: z.string().optional(),\n object: z.string().optional(),\n confidence: z.number().min(0).max(1).optional(),\n scope: AgentMemoryScopeSchema.optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n})\n"],"mappings":"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","names":["canonicalJson","canonicalJson","record","canonicalJson","randomUUID","canonicalJson","mergeScopes","canonicalJson","randomUUID","mergeScopes","canonicalJson","randomUUID","canonicalJson","mergeScopes","canonicalJson","stripUndefined","randomUUID","stringArray","uniqueStrings","join","canonicalJson","fsCampaignStorage","resolveRunDir","surfaceHash","canonicalJson","canonicalJson","surfaceHash","dirname","join","canonicalJson","surfaceHash","join","canonicalJson","join","record","canonicalJson","join","canonicalJson","surfaceHash","mean","join","surfaceHash","canonicalJson","canonicalJson","join","record","surfaceHash","dirname","surfaceHash","fsCampaignStorage","resolveRunDir","join","surfaceHash","canonicalJson","randomUUID","canonicalJson","mergeScopes","randomUUID","compactRecord","stringField","ids","numberField","canonicalJson","isRecord","canonicalJson","canonicalJson","stringField","numberField"]}
|