@tangle-network/agent-knowledge 4.0.0 → 4.1.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.
Files changed (35) hide show
  1. package/AGENTS.md +32 -18
  2. package/CHANGELOG.md +32 -0
  3. package/README.md +31 -19
  4. package/dist/benchmarks/index.d.ts +51 -3
  5. package/dist/benchmarks/index.js +1 -1
  6. package/dist/{chunk-EUAXSBMH.js → chunk-AKYJG2MR.js} +224 -224
  7. package/dist/chunk-AKYJG2MR.js.map +1 -0
  8. package/dist/{chunk-DW6APRTX.js → chunk-BBCIB4UL.js} +2486 -2457
  9. package/dist/chunk-BBCIB4UL.js.map +1 -0
  10. package/dist/{chunk-UWOTQNBI.js → chunk-CPMLJYA3.js} +1886 -1842
  11. package/dist/chunk-CPMLJYA3.js.map +1 -0
  12. package/dist/{chunk-WCYW2GDA.js → chunk-MYFM6LKH.js} +2 -2
  13. package/dist/chunk-MYFM6LKH.js.map +1 -0
  14. package/dist/cli.js +1 -1
  15. package/dist/index.d.ts +48 -52
  16. package/dist/index.js +2906 -2874
  17. package/dist/index.js.map +1 -1
  18. package/dist/memory/index.d.ts +129 -6
  19. package/dist/memory/index.js +2 -2
  20. package/dist/sources/index.d.ts +17 -33
  21. package/dist/sources/index.js +1 -1
  22. package/dist/{index-Bqg1mBPt.d.ts → types-DP38encz.d.ts} +127 -284
  23. package/docs/eval/investment-material-facts.md +28 -29
  24. package/docs/eval/rag-eval-roadmap.md +6 -5
  25. package/docs/results/adaptive.md +13 -13
  26. package/docs/results/claim-grounding.md +11 -11
  27. package/docs/results/cost-quality.md +4 -4
  28. package/docs/results/investment-thesis.md +56 -56
  29. package/docs/results/research-driving.md +54 -54
  30. package/docs/two-agent-research-ab.md +94 -94
  31. package/package.json +4 -7
  32. package/dist/chunk-DW6APRTX.js.map +0 -1
  33. package/dist/chunk-EUAXSBMH.js.map +0 -1
  34. package/dist/chunk-UWOTQNBI.js.map +0 -1
  35. package/dist/chunk-WCYW2GDA.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/memory/holdout.ts","../src/memory/adapter.ts","../src/memory/branch.ts","../src/memory/rank.ts","../src/memory/experiment.ts","../src/memory/graphiti.ts","../src/memory/improvement.ts","../src/memory/mem0.ts","../src/memory/neo4j.ts","../src/memory/schemas.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto'\nimport { mulberry32 } from '@tangle-network/agent-eval'\nimport type { OffPolicyTrajectory } from '@tangle-network/agent-eval/rl'\nimport { sha256 } from '../ids'\nimport type { AgentMemoryHit, AgentMemoryScope } from './types'\n\n// Randomized retrieval holdout (epsilon-dropout) for per-item treatment-effect logging.\n// Default-off: nothing in this module runs unless a consumer passes a RetrievalHoldoutConfig.\n// The library never does I/O here; persistence is the consumer's job via onEvent.\n// Design + estimator + sample-size analysis: research repo,\n// projects/probabilistic-agent-optimization/notes/2026-07-03-DRAFT-o3-holdout-design.md (O3 / EXP-007).\n\nexport interface RetrievalHoldoutConfig {\n /** Per-session probability that one eligible watchlist item is suppressed. 0 logs the full schema without ever dropping. */\n epsilon: number\n /** Item ids eligible for suppression. Empty or absent means no item can ever be dropped. */\n watchlist?: string[]\n /** Ties every event to the exact epsilon/watchlist in force, for audit and replay. */\n configVersion?: string\n /** Copied onto every event so multi-adapter logs stay attributable. */\n adapterId?: string\n /** Corpus/store version stamp; an edited item under the same id is a different treatment. */\n corpusVersion?: string\n /**\n * Emit plaintext sessionId and scope on events. Default false: events carry only\n * sessionIdHash/scopeHash, so PII-bearing identifiers (tenantId/userId/tags) never reach a\n * consumer-controlled sink unless the consumer explicitly owns that decision. Note that\n * replaying assignment draws from logs alone needs the plaintext sessionId, so\n * privacy-default logs require the consumer's own sessionId mapping for replay audits.\n */\n includePlaintextIdentifiers?: boolean\n /**\n * Cap on tracked sessions per experiment config in the sticky wrapper's registry.\n * Exists so tests can exercise eviction; production should keep the default (10,000).\n */\n maxTrackedSessions?: number\n /**\n * Uniform-[0,1) generator keyed by a string. Defaults to a sha256-derived deterministic\n * generator so every assignment is replayable from the logged keys alone (design rule D5).\n */\n rng?: (key: string) => number\n /** Receives one event per retrieval call, INCLUDING no-drop calls: control-arm membership is half the data. */\n onEvent: (event: RetrievalHoldoutEvent) => void\n}\n\nexport interface RetrievalHoldoutEligibleItem {\n id: string\n /** 1-based position in the post-filter hit list. */\n rank: number\n score?: number\n kind: string\n /** sha256(hit.text) prefix; effects are estimated per (id, contentHash) pair. */\n contentHash: string\n}\n\nexport interface RetrievalHoldoutEvent {\n v: 1\n eventId: string\n ts: string\n adapterId?: string\n /** Plaintext session id — emitted ONLY when config.includePlaintextIdentifiers is true. */\n sessionId?: string\n /** Consumer-supplied experiment/outcome join id (scope.tags.taskId); deliberately plaintext. */\n taskId?: string\n /** 1-based call counter within the session; 0 when the call is outside session randomization. */\n callIndex: number\n /**\n * sha256(sessionId) prefix — the default privacy-preserving session join key AND the seed-key\n * reference for the assignment draws (previously named rngKey; identical derivation, deduped).\n */\n sessionIdHash?: string\n queryHash?: string\n /** Verbatim scope — emitted ONLY when config.includePlaintextIdentifiers is true (PII risk). */\n scope?: AgentMemoryScope\n /** sha256 prefix of the canonical-JSON scope (keys sorted, undefined stripped). */\n scopeHash?: string\n config: { epsilon: number; watchlist: string[]; configVersion?: string }\n /**\n * Value-hash of the experiment-defining knobs, sha256({epsilon, sorted watchlist}) prefix.\n * The estimator groups events by it; the sticky-session registry is keyed by it.\n */\n configHash: string\n /**\n * False when no sessionId is available or the adapter answered without retrieval\n * (see bypassReason), so the fraction-under-experiment denominator stays honest.\n */\n holdoutEligible: boolean\n /** Present only on adapter paths that bypassed retrieval, where no suppression could apply. */\n bypassReason?: RetrievalHoldoutBypassReason\n /** The full post-filter eligibility set E, logged on every call (control arm + interference probes). */\n eligible: RetrievalHoldoutEligibleItem[]\n /** Ids in watchlist ∩ E, in eligibility order. */\n watchlistEligible: string[]\n sessionHoldout: boolean\n /** The session's sticky drop target once drawn; distinguishes \"target absent from E\" from \"not yet drawn\". */\n sessionTargetId: string | null\n /** The item suppressed in THIS call, or null. */\n droppedId: string | null\n /** 1/|watchlist ∩ E| recorded at draw time; the exact inverse-propensity weight input. */\n pickPropensity: number | null\n /** epsilon * pickPropensity, recorded at draw time so analysis never re-derives assignment probabilities. */\n dropPropensity: number | null\n deliveredIds: string[]\n corpusVersion?: string\n}\n\nexport interface RetrievalHoldoutSessionState {\n sessionId: string\n /** Calls observed so far in this session. */\n callCount: number\n sessionHoldout: boolean\n /** Sticky drop target; drawn once at the first call whose eligibility set intersects the watchlist. */\n targetId: string | null\n pickPropensity: number | null\n}\n\nexport interface RetrievalHoldoutCallContext {\n sessionId?: string\n taskId?: string\n /** Raw query; only its sha256 prefix is logged. */\n query?: string\n scope?: AgentMemoryScope\n /** State returned by the previous call of this session; threading it is what makes suppression sticky. */\n session?: RetrievalHoldoutSessionState\n}\n\nexport interface RetrievalHoldoutResult {\n delivered: AgentMemoryHit[]\n event: RetrievalHoldoutEvent\n session?: RetrievalHoldoutSessionState\n}\n\n/** Adapter context paths that answer without retrieval, so no holdout draw can happen. */\nexport type RetrievalHoldoutBypassReason = 'short-term-context' | 'raw-string-context'\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// 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 /** Per-session reward-model prediction enabling `doublyRobust`; when absent, qHat is null. */\n qHat?: (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 surfaced but NOT converted (mixed exposure, bypass-only) — counted, never hidden. */\n excluded: RetrievalHoldoutSessionSummary[]\n /** Events with no sessionIdHash: outside session randomization, cannot join a reward. */\n unattributableEvents: number\n}\n\n/**\n * Maps holdout logs onto agent-eval's `OffPolicyTrajectory`, ONE TRAJECTORY PER SESSION, so\n * EXP-007's analysis consumes the substrate's `inverseProbabilityWeighting` /\n * `selfNormalizedImportanceWeighting` / `doublyRobust` estimators directly. This matches the\n * PREREG estimator (session-sticky self-normalized IPW): the design randomizes per SESSION —\n * the arm coin is flipped once (P(holdout) = epsilon) and 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 (control arm observed): `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 — 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 the analysis to count.\n * Pre-registration for EXP-007 stays in the research repo by design; the manifest vocabulary for\n * it is agent-eval's `HypothesisManifest` / `signManifest` / `evaluateHypothesis` exports.\n */\nexport function toOffPolicyTrajectory(\n events: RetrievalHoldoutEvent[],\n options: RetrievalHoldoutOffPolicyOptions,\n): RetrievalHoldoutOffPolicyResult {\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 trajectories.push({\n runId,\n reward,\n behaviorProb,\n targetProb: options.targetProb?.(summary) ?? (summary.droppedId === null ? 1 : 0),\n qHat: options.qHat?.(summary) ?? 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 { randomUUID } from 'node:crypto'\nimport { join } from 'node:path'\nimport { canonicalJson } from '@tangle-network/agent-eval'\nimport {\n type CampaignResult,\n type CampaignStorage,\n type CostLedgerHandle,\n createRunCostLedger,\n type DispatchContext,\n fsCampaignStorage,\n type JudgeConfig,\n resolveRunDir,\n runCampaign,\n type Scenario,\n} from '@tangle-network/agent-eval/campaign'\nimport {\n type KnowledgeBenchmarkFamily,\n type KnowledgeBenchmarkSplit,\n type KnowledgeMemoryBenchmarkCase,\n type KnowledgeMemoryBenchmarkTaskKind,\n type KnowledgeMemoryEvent,\n type KnowledgeMemoryFactMatcher,\n scoreMemoryBenchmarkArtifact,\n} from '../benchmarks/index'\nimport { stableId } from '../ids'\nimport {\n appendAttemptJournalEvent,\n assertNoInterruptedPaidCalls,\n DEFAULT_MEMORY_RECOVERY_RETRIES_PER_ATTEMPT,\n hasSettledPaidCall,\n readActiveAttemptJournal,\n reconcileInterruptedMemoryPaidCalls,\n reserveRecoveryAttempts,\n} from './attempt-log'\nimport {\n type AgentMemoryBranch,\n type AgentMemoryBranchSnapshot,\n type AgentMemorySharingPolicy,\n createAgentMemoryBranch,\n} from './branch'\nimport {\n createMemoryExecutionPool,\n memoryRecoveryDelayMs,\n releaseMemoryAdapterCreatedAfterAbort,\n resolveMemoryCleanupTimeoutMs,\n runBoundedMemoryLifecycle,\n sleepForMemoryRecovery,\n} from './lifecycle'\nimport {\n type AgentMemoryAcquireRunLease,\n type AgentMemoryControllerMode,\n type AgentMemoryRunLease,\n acquireAgentMemoryRunLease,\n type OwnedAgentMemoryRunLease,\n} from './run-control'\nimport type { AgentMemoryAdapter, AgentMemoryScope, AgentMemoryWriteInput } from './types'\n\nconst MEMORY_EXPERIMENT_IMPLEMENTATION_REF = 'agent-knowledge:memory-experiment:v6'\n\nexport interface AgentMemorySequenceProbe {\n id: string\n query: string\n scope?: AgentMemoryScope\n limit?: number\n taskKind?: KnowledgeMemoryBenchmarkTaskKind\n requiredFacts?: readonly KnowledgeMemoryFactMatcher[]\n forbiddenFacts?: readonly KnowledgeMemoryFactMatcher[]\n expectedEventIds?: readonly string[]\n expectedActorIds?: readonly string[]\n referenceAnswer?: string\n}\n\nexport interface AgentMemorySequenceStep {\n id: string\n instruction?: string\n scope?: AgentMemoryScope\n writes?: readonly AgentMemoryWriteInput[]\n parallelWrites?: boolean\n probes?: readonly AgentMemorySequenceProbe[]\n parallelProbes?: boolean\n metadata?: Record<string, unknown>\n}\n\nexport interface AgentMemorySequence {\n id: string\n family: KnowledgeBenchmarkFamily | string\n split?: KnowledgeBenchmarkSplit\n steps: readonly AgentMemorySequenceStep[]\n /** Exact scopes a runtime callback may write beyond scopes declared by steps. */\n cleanupScopes?: readonly AgentMemoryScope[]\n tags?: readonly string[]\n metadata?: Record<string, unknown>\n}\n\nexport interface BuildAgentMemorySequencesFromBenchmarkCasesOptions {\n memoryAgentId?: string\n eventScope?: (input: {\n event: KnowledgeMemoryEvent\n case: KnowledgeMemoryBenchmarkCase\n eventIndex: number\n }) => AgentMemoryScope\n probeScope?: (testCase: KnowledgeMemoryBenchmarkCase) => AgentMemoryScope\n}\n\nexport interface AgentMemoryExperimentCandidate {\n id: string\n label?: string\n /** Change when provider configuration changes so cached cells cannot be reused. */\n ref: string\n /** Local construction is free; call markExternalCall before billable provisioning or reconnects. */\n createAdapter(input: {\n branchId: string\n sequence: AgentMemorySequence\n rep: number\n seed: number\n purpose: 'execute' | 'recovery'\n signal: AbortSignal\n markExternalCall(): void\n }): AgentMemoryAdapter | null | Promise<AgentMemoryAdapter | null>\n policy?: AgentMemorySharingPolicy\n baseScope?: AgentMemoryScope\n /** Conservative external provider charge for one complete history. */\n externalCostUsdPerSequence?: number\n /** Conservative extra provider charge when recovering one interrupted history. */\n externalRecoveryCostUsdPerAttempt?: number\n /** Release resources and, when cleanupBranches is false, delete the isolated state. */\n disposeAdapter?(adapter: AgentMemoryAdapter): Promise<void>\n}\n\nexport interface AgentMemorySequenceProbeResult {\n id: string\n stepId: string\n query: string\n score: number\n passed: boolean\n dimensions: Record<string, number>\n applicableDimensions: readonly string[]\n notes: string\n hitIds: readonly string[]\n}\n\nexport interface AgentMemorySequenceArtifact {\n candidateId: string\n sequenceId: string\n score: number\n passed: boolean\n dimensions: Record<string, number>\n dimensionSampleCounts: Record<string, number>\n probes: readonly AgentMemorySequenceProbeResult[]\n branchDigest: string\n journalEntries: number\n durationMs: number\n}\n\nexport interface AgentMemorySequenceScenario extends Scenario {\n kind: 'agent-memory-sequence'\n candidateId: string\n sequenceId: string\n sequence: AgentMemorySequence\n seedGroup: string\n}\n\nexport interface AgentMemoryExperimentRankingRow {\n rank: number\n candidateId: string\n label: string\n scoreMean: number\n passRate: number\n totalSequences: number\n totalCells: number\n totalProbes: number\n cellsFailed: number\n totalCostUsd: number\n durationMs: number\n dimensions: Record<string, number>\n}\n\nexport interface RunAgentMemoryExperimentOptions {\n experimentId: string\n /** Stable external branch namespace; distributed workers must use the same value. */\n experimentRunId?: string\n sequences: readonly AgentMemorySequence[]\n candidates: readonly AgentMemoryExperimentCandidate[]\n /** Retired candidates retained only so interrupted branches can be cleaned on resume. */\n recoveryCandidates?: readonly AgentMemoryExperimentCandidate[]\n runDir: string\n executeStep?: (input: {\n memory: AgentMemoryBranch\n candidateId: string\n sequence: AgentMemorySequence\n step: AgentMemorySequenceStep\n context: DispatchContext\n }) => Promise<void>\n /** Required with executeStep; identify the runtime/profile behavior in cache keys. */\n executeStepRef?: string\n onBranchSnapshot?: (input: {\n candidateId: string\n sequenceId: string\n cellId: string\n snapshot: AgentMemoryBranchSnapshot\n }) => Promise<void> | void\n cleanupBranches?: boolean\n storage?: CampaignStorage\n repo?: string\n seed?: number\n reps?: number\n resumable?: boolean\n costCeiling?: number\n /** Shared across nested experiments when an outer improvement run owns spend. */\n costLedger?: CostLedgerHandle\n costPhase?: string\n maxConcurrency?: number\n dispatchTimeoutMs?: number\n /** Total deadline for each provider cleanup, close, or recovery operation. */\n cleanupTimeoutMs?: number\n /** Refuse a damaged run with more unfinished attempts than this. Default 1000. */\n maxRecoveryAttempts?: number\n /** Bound repeated provider cleanup after process crashes. Default 3 per attempt. */\n maxRecoveryRetriesPerAttempt?: number\n now?: () => Date\n /** Required with custom storage when all controllers are confined to one process. */\n controllerMode?: AgentMemoryControllerMode\n /** Required for distributed controllers that share custom storage. */\n acquireRunLease?: AgentMemoryAcquireRunLease\n}\n\nexport type AgentMemoryExperimentRunLease = AgentMemoryRunLease\n\nexport interface AgentMemoryAttemptEvent {\n schema: 2\n status: 'started' | 'cleaned'\n branchId: string\n candidateId: string\n candidateRef: string\n sequenceId: string\n rep: number\n seed: number\n cleanupBranches: boolean\n externalCostUsdPerSequence: number\n externalRecoveryCostUsdPerAttempt: number\n recordedAt: string\n recovery: boolean\n}\n\nexport interface RunAgentMemoryExperimentResult {\n campaign: CampaignResult<AgentMemorySequenceArtifact, AgentMemorySequenceScenario>\n rows: readonly AgentMemoryExperimentRankingRow[]\n totalCostUsd: number\n /** Recovery spend for retired candidates, excluded from ranking rows but included in totalCostUsd. */\n unrankedRecoveryCostUsd: number\n leaderCandidateId?: string\n rankingJsonPath: string\n rankingMarkdownPath: string\n attemptLogPath: string\n recoveryLogPath: string\n}\n\nclass AgentMemoryCleanupError extends AggregateError {\n constructor(errors: Iterable<unknown>, message: string) {\n super(errors, message)\n this.name = 'AgentMemoryCleanupError'\n }\n}\n\ntype OwnedMemoryExperimentRunLease = OwnedAgentMemoryRunLease\n\n/** Converts existing ordered memory benchmark cases into executable histories. */\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\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 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\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(): JudgeConfig<\n AgentMemorySequenceArtifact,\n AgentMemorySequenceScenario\n> {\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\nasync 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 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 sequence: scenario.sequence,\n rep: context.rep,\n seed: context.seed,\n purpose: 'execute',\n signal: context.signal,\n markExternalCall: () => {\n externalCallAttempted = true\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 step of scenario.sequence.steps) {\n context.signal.throwIfAborted()\n await lease.assertOwned()\n await writeStep(memory, step)\n await lease.assertOwned()\n await options.executeStep?.({\n memory,\n candidateId: candidate.id,\n sequence: scenario.sequence,\n step,\n context,\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 receipt = {\n model: candidate.id,\n inputTokens: 0,\n outputTokens: 0,\n actualCostUsd: costUsd,\n } as const\n const paid = await context.cost.runPaidCall({\n callId: memoryAttemptCostCallId(attempt, 'execute', 0),\n actor: `agent-knowledge:memory-experiment:${candidate.id}`,\n model: candidate.id,\n maximumCharge: { externallyEnforcedMaximumUsd: costUsd },\n execute,\n receipt: () => receipt,\n receiptFromError: () => ({\n ...receipt,\n actualCostUsd: externalCallAttempted ? costUsd : 0,\n }),\n })\n if (!paid.succeeded) throw paid.error\n return paid.value\n}\n\nfunction 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\nasync 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 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 })\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 receipt = {\n model: candidate.id,\n inputTokens: 0,\n outputTokens: 0,\n actualCostUsd: recoveryCostUsd,\n } as const\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.id,\n tags,\n maximumCharge: { externallyEnforcedMaximumUsd: recoveryCostUsd },\n execute: recover,\n receipt: () => ({\n ...receipt,\n actualCostUsd: externalRecoveryAttempted ? recoveryCostUsd : 0,\n }),\n receiptFromError: () => ({\n ...receipt,\n actualCostUsd: externalRecoveryAttempted ? recoveryCostUsd : 0,\n }),\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}): Promise<void> {\n const { options, candidate, sequence, attempt, lease, onExternalCall } = 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 sequence,\n rep: attempt.rep,\n seed: attempt.seed,\n purpose: 'recovery',\n signal: abortController.signal,\n markExternalCall: onExternalCall,\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\nfunction 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\nfunction 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 schema: 2,\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\nfunction 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.schema === 2 &&\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\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\nfunction 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\nfunction 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\nfunction 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\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 }))\n .sort((a, b) => a.id.localeCompare(b.id)),\n }),\n )\n}\n\nfunction 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\nfunction 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\nfunction mean(values: readonly number[]): number {\n return values.length === 0 ? 0 : values.reduce((sum, value) => sum + value, 0) / values.length\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 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\nfunction 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\nasync function clearSequenceScopes(\n memory: AgentMemoryBranch,\n sequence: AgentMemorySequence,\n): Promise<void> {\n for (const scope of sequenceCleanupScopes(sequence)) await memory.clear?.(scope)\n}\n\nfunction 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\nfunction 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\nfunction compactScope(scope: AgentMemoryScope): AgentMemoryScope {\n return Object.fromEntries(\n Object.entries(scope).filter(([, value]) => value !== undefined),\n ) as AgentMemoryScope\n}\n\nfunction compactRecord(record: Record<string, unknown>): Record<string, unknown> {\n return Object.fromEntries(Object.entries(record).filter(([, value]) => value !== undefined))\n}\n\nfunction uniqueStrings(values: readonly 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 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\nfunction 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\nfunction format(value: number): string {\n return Number.isFinite(value) ? value.toFixed(4) : '0.0000'\n}\n\nfunction normalizeUsd(value: number): number {\n return Number(value.toFixed(12))\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 stableId('graphiti', canonicalJson(stripUndefined(options)))\n}\n","import { join } from 'node:path'\nimport { canonicalJson } from '@tangle-network/agent-eval'\nimport {\n type CampaignStorage,\n type CostLedgerHandle,\n campaignLineageStore,\n createRunCostLedger,\n fsCampaignStorage,\n type Governor,\n type GovernorContext,\n type GovernorOp,\n type HeldoutSignificance,\n type HeldoutSignificanceOptions,\n heldoutSignificance,\n type Lineage,\n type LineageStore,\n type MutableSurface,\n memLineageStore,\n type PairedHoldout,\n resolveRunDir,\n runLineageLoop,\n type Scenario,\n type SurfaceProposer,\n surfaceHash,\n} from '@tangle-network/agent-eval/campaign'\nimport {\n appendDurableJournalEvent,\n assertNoInterruptedPaidCalls,\n reconcileInterruptedRunPaidCalls,\n} from './attempt-log'\nimport type {\n AgentMemoryExperimentCandidate,\n AgentMemorySequence,\n AgentMemorySequenceArtifact,\n AgentMemorySequenceProbe,\n RunAgentMemoryExperimentOptions,\n RunAgentMemoryExperimentResult,\n} from './experiment'\nimport { runAgentMemoryExperiment } from './experiment'\nimport { runBoundedMemoryLifecycle } from './lifecycle'\nimport {\n type AgentMemoryAcquireRunLease,\n type AgentMemoryControllerMode,\n type AgentMemoryRunLease,\n acquireAgentMemoryRunLease,\n type OwnedAgentMemoryRunLease,\n} from './run-control'\n\nexport interface AgentMemoryImprovementSeed<TConfig> {\n config: TConfig\n track: string\n vision?: string\n proposer: string\n}\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 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> {\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 lineage: Lineage\n holdout: RunAgentMemoryExperimentResult\n }): Promise<void>\n}\n\ninterface AgentMemoryActivationEvent {\n schema: 1\n status: 'prepared' | 'activated'\n activationId: string\n experimentId: string\n activationRef: string\n baselineSurfaceHash: string\n winnerSurfaceHash: string\n holdoutManifestHash: string\n recordedAt: string\n outcome?: 'applied' | 'recovered' | 'already-current'\n}\n\ninterface AgentMemoryActivationJournalState {\n prepared: boolean\n activated?: AgentMemoryActivationEvent\n}\n\nexport type AgentMemoryImprovementRunLease = AgentMemoryRunLease\n\nexport interface AgentMemoryGovernor {\n decide(\n context: GovernorContext & {\n costLedger: CostLedgerHandle\n costPhase: string\n },\n ): GovernorOp | Promise<GovernorOp>\n}\n\nexport interface RunAgentMemoryImprovementOptions<TConfig> {\n experimentId: string\n trainSequences: readonly AgentMemorySequence[]\n holdoutSequences: readonly AgentMemorySequence[]\n /** First entry is the current baseline; remaining entries seed independent search tracks. */\n seeds: readonly AgentMemoryImprovementSeed<TConfig>[]\n createCandidate(input: {\n config: TConfig\n candidateId: string\n surfaceHash: string\n }):\n | Omit<AgentMemoryExperimentCandidate, 'id'>\n | Promise<Omit<AgentMemoryExperimentCandidate, 'id'>>\n proposer: SurfaceProposer\n /** Optional proposer implementations keyed by seed and branch proposer labels. */\n proposers?: Readonly<Record<string, SurfaceProposer>>\n /** Stable version or commit for the candidate factory, proposer, and governor. */\n improvementRef: string\n governor?: AgentMemoryGovernor\n budget: { maxSteps: number }\n populationSize?: number\n candidateConcurrency?: number\n sequenceConcurrency?: number\n runDir: string\n repo?: string\n storage?: CampaignStorage\n lineageStore?: LineageStore\n /** Required with custom storage when all controllers are confined to one process. */\n controllerMode?: AgentMemoryControllerMode\n /** Required for distributed controllers using custom storage. Worker concurrency is independent. */\n acquireRunLease?: AgentMemoryAcquireRunLease\n seed?: number\n reps?: number\n resumable?: boolean\n dispatchTimeoutMs?: number\n cleanupTimeoutMs?: number\n maxRecoveryAttempts?: number\n maxRecoveryRetriesPerAttempt?: number\n maxTotalCostUsd?: number\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 minHoldoutScore?: number\n activation?: AgentMemoryActivationDriver<TConfig>\n activationTimeoutMs?: number\n now?: () => Date\n}\n\nexport interface RunAgentMemoryImprovementResult<TConfig> {\n lineage: Lineage\n baselineConfig: TConfig\n winnerConfig: TConfig\n baselineSurface: string\n winnerSurface: string\n baselineSurfaceHash: string\n winnerSurfaceHash: string\n decision: AgentMemoryPromotionDecision\n activation: AgentMemoryActivation\n holdout?: RunAgentMemoryExperimentResult\n totalCostUsd: number\n resultJsonPath: string\n}\n\ninterface MemoryConfigScenario extends Scenario {\n kind: 'agent-memory-config-search'\n sequenceId: string\n}\n\nconst DEFAULT_CRITICAL_DIMENSIONS = [\n 'memory_stale_safe',\n 'memory_actor_recall',\n 'memory_event_recall',\n] as const\nconst MEMORY_IMPROVEMENT_IMPLEMENTATION_REF = 'agent-knowledge:memory-improvement:v2'\n\n/** Searches branchable memory configurations and activates only a fresh holdout win. */\nexport async function runAgentMemoryImprovement<TConfig>(\n options: RunAgentMemoryImprovementOptions<TConfig>,\n): Promise<RunAgentMemoryImprovementResult<TConfig>> {\n if ('onPromote' in options) {\n throw new Error(\n 'memory improvement onPromote was removed; use activation.readCurrent and activation.compareAndSet',\n )\n }\n if (options.seeds.length === 0) throw new Error('memory improvement requires seed configs')\n if (options.trainSequences.length === 0) {\n throw new Error('memory improvement requires training sequences')\n }\n if (options.holdoutSequences.length === 0) {\n throw new Error('memory improvement requires holdout sequences')\n }\n const trainIds = new Set(options.trainSequences.map((sequence) => sequence.id))\n const overlap = options.holdoutSequences\n .map((sequence) => sequence.id)\n .filter((id) => trainIds.has(id))\n if (overlap.length > 0) {\n throw new Error(`memory improvement train/holdout overlap: ${overlap.join(', ')}`)\n }\n const trainFingerprints = new Map(\n options.trainSequences.map((sequence) => [memorySequenceFingerprint(sequence), sequence.id]),\n )\n const duplicateHistories = options.holdoutSequences.flatMap((sequence) => {\n const trainId = trainFingerprints.get(memorySequenceFingerprint(sequence))\n return trainId ? [`${trainId}/${sequence.id}`] : []\n })\n if (duplicateHistories.length > 0) {\n throw new Error(\n `memory improvement train/holdout histories duplicate content: ${duplicateHistories.join(', ')}`,\n )\n }\n if (typeof options.improvementRef !== 'string' || !options.improvementRef.trim()) {\n throw new Error('memory improvement improvementRef must be a non-empty string')\n }\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>(\n options: RunAgentMemoryImprovementOptions<TConfig>,\n storage: CampaignStorage,\n runDir: string,\n lease: OwnedRunLease,\n): Promise<RunAgentMemoryImprovementResult<TConfig>> {\n await lease.assertOwned()\n const serializeRaw = options.serializeConfig ?? ((config: TConfig) => canonicalJson(config))\n const parseRaw = options.parseConfig ?? ((surface: string) => JSON.parse(surface) as TConfig)\n const serialize = (config: TConfig): string => serializeMemoryConfig(serializeRaw, config)\n const parse = (surface: string): TConfig => parseMemoryConfig(parseRaw, surface)\n for (const seed of options.seeds) assertMemoryConfigRoundTrip(seed.config, serialize, parse)\n if (options.activation && !storage.append) {\n throw new Error('memory activation requires CampaignStorage.append')\n }\n if (options.resumable !== false && !options.lineageStore && !storage.append) {\n throw new Error('resumable memory improvement requires CampaignStorage.append')\n }\n assertMemoryImprovementIdentity(options, storage, runDir, serialize)\n const costLedger = createRunCostLedger({\n storage,\n runDir,\n costCeilingUsd: options.maxTotalCostUsd ?? 0,\n })\n reconcileInterruptedRunPaidCalls(costLedger, 'memory improvement run')\n assertNoInterruptedPaidCalls(costLedger, 'memory improvement recovery')\n const trainScenarios: MemoryConfigScenario[] = options.trainSequences.map((sequence) => ({\n id: sequence.id,\n kind: 'agent-memory-config-search',\n sequenceId: sequence.id,\n }))\n const evaluations = new Map<string, Promise<RunAgentMemoryExperimentResult>>()\n\n const evaluateSurface = async (\n surface: MutableSurface,\n ): Promise<{ score: number; scoreVector: number[] }> => {\n await lease.assertOwned()\n const text = requireStringSurface(surface)\n const config = parse(text)\n const canonicalSurface = serialize(config)\n const hash = surfaceHash(canonicalSurface)\n let pending = evaluations.get(hash)\n if (!pending) {\n pending = (async () => {\n const candidate = await buildCandidate(options, config, hash, `search-${hash}`)\n await lease.assertOwned()\n const experiment = await runAgentMemoryExperiment({\n ...experimentOptions(options, costLedger, storage, lease),\n experimentId: `${options.experimentId}:search:${hash}`,\n sequences: options.trainSequences,\n candidates: [candidate],\n runDir: join(runDir, 'search', hash),\n costPhase: `memory.search.${hash}`,\n })\n await lease.assertOwned()\n return experiment\n })()\n evaluations.set(hash, pending)\n void pending.catch(() => evaluations.delete(hash))\n }\n const result = await pending\n await lease.assertOwned()\n const row = result.rows[0]\n if (!row || row.cellsFailed > 0) {\n throw new Error(`${hash}: memory candidate did not complete every training cell`)\n }\n return {\n score: row.scoreMean,\n scoreVector: sequenceScores(result, options.trainSequences, row.candidateId),\n }\n }\n\n const lineageStore =\n options.lineageStore ??\n (options.resumable === false\n ? memLineageStore()\n : campaignLineageStore(storage, join(runDir, 'lineage.jsonl')))\n const lineageOptions = {\n seeds: options.seeds.map((seed) => ({\n surface: serialize(seed.config),\n track: seed.track,\n proposer: seed.proposer,\n ...(seed.vision !== undefined ? { vision: seed.vision } : {}),\n })),\n scenarios: trainScenarios,\n proposer: withCostContext(options.proposer, costLedger, lease, 'default'),\n proposers: options.proposers\n ? Object.fromEntries(\n Object.entries(options.proposers).map(([name, proposer]) => [\n name,\n withCostContext(proposer, costLedger, lease, name),\n ]),\n )\n : undefined,\n scoreSurface: evaluateSurface,\n governor: options.governor\n ? withGovernorCostContext(options.governor, costLedger, lease)\n : undefined,\n budget: {\n ...options.budget,\n maxNodes: options.seeds.length + options.budget.maxSteps,\n },\n store: lineageStore,\n populationSize: options.populationSize,\n candidateConcurrency: options.candidateConcurrency,\n }\n const search = await runLineageLoop<MemoryConfigScenario, unknown>(lineageOptions)\n await lease.assertOwned()\n const best = search.best\n if (!best) throw new Error('memory improvement produced no measured config')\n\n const baselineSurface = serialize(options.seeds[0]!.config)\n const baselineHash = surfaceHash(baselineSurface)\n const winnerConfig = parse(requireStringSurface(best.surface))\n const winnerSurface = serialize(winnerConfig)\n const winnerHash = surfaceHash(winnerSurface)\n const baselineConfig = parse(baselineSurface)\n\n let holdout: RunAgentMemoryExperimentResult | undefined\n let decision: AgentMemoryPromotionDecision\n if (winnerHash === baselineHash) {\n const baselineMeasurement = await evaluateSurface(baselineSurface)\n decision = {\n status: 'no-change',\n reasons: ['search did not find a config better than the baseline'],\n baselineScore: baselineMeasurement.score,\n winnerScore: baselineMeasurement.score,\n lift: 0,\n criticalDimensions: [],\n }\n } else {\n await lease.assertOwned()\n const [baselineCandidate, winnerCandidate] = await Promise.all([\n buildCandidate(options, baselineConfig, baselineHash, 'baseline'),\n buildCandidate(options, winnerConfig, winnerHash, 'winner'),\n ])\n await lease.assertOwned()\n holdout = await runAgentMemoryExperiment({\n ...experimentOptions(options, costLedger, storage, lease),\n experimentId: `${options.experimentId}:holdout`,\n sequences: options.holdoutSequences,\n candidates: [baselineCandidate, winnerCandidate],\n runDir: join(runDir, 'holdout'),\n costPhase: 'memory.holdout',\n })\n decision = decidePromotion({\n options,\n result: holdout,\n baselineId: baselineCandidate.id,\n winnerId: winnerCandidate.id,\n })\n }\n\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 improvementRef: options.improvementRef,\n activationRef,\n baselineSurfaceHash: baselineHash,\n winnerSurfaceHash: winnerHash,\n holdoutManifestHash: holdout?.campaign.manifestHash ?? null,\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' && holdout !== undefined\n const activationEventIdentity = holdout\n ? {\n schema: 1 as const,\n activationId,\n experimentId: options.experimentId,\n activationRef,\n baselineSurfaceHash: baselineHash,\n winnerSurfaceHash: winnerHash,\n holdoutManifestHash: holdout.campaign.manifestHash,\n }\n : undefined\n const activationJournal =\n activationEligible && activationEventIdentity\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 lineage: search.lineage,\n baselineConfig,\n winnerConfig,\n baselineSurface,\n winnerSurface,\n baselineSurfaceHash: baselineHash,\n winnerSurfaceHash: winnerHash,\n decision,\n activation,\n ...(holdout ? { holdout } : {}),\n totalCostUsd: costLedger.summary().totalCostUsd,\n resultJsonPath,\n } satisfies RunAgentMemoryImprovementResult<TConfig>\n await lease.assertOwned()\n writeMemoryImprovementResult(storage, options.experimentId, result)\n if (\n activationEligible &&\n !activationJournal.activated &&\n activationEventIdentity &&\n holdout &&\n options.activation\n ) {\n const activationDriver = options.activation\n const activationTimeoutMs = options.activationTimeoutMs ?? 60_000\n const hadPreparedEvent = activationJournal.prepared\n if (!hadPreparedEvent) {\n await lease.assertOwned()\n storage.ensureDir(activationJournalDir)\n appendMemoryActivationEvent(storage, activationJournalPath, {\n ...activationEventIdentity,\n status: 'prepared',\n recordedAt: (options.now ?? (() => new Date()))().toISOString(),\n })\n }\n\n await 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 lease.assertOwned()\n const currentHash = surfaceHash(serialize(currentConfig))\n if (currentHash !== baselineHash && currentHash !== winnerHash) {\n throw new Error(\n `memory activation target '${activationDriver.ref}' changed concurrently; expected '${baselineHash}' or '${winnerHash}', found '${currentHash}'`,\n )\n }\n\n let outcome: NonNullable<AgentMemoryActivationEvent['outcome']>\n if (currentHash === winnerHash) {\n outcome = hadPreparedEvent ? 'recovered' : 'already-current'\n 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,\n expectedConfig: baselineConfig,\n expectedSurfaceHash: baselineHash,\n config: winnerConfig,\n surfaceHash: winnerHash,\n decision,\n lineage: search.lineage,\n holdout,\n }),\n })\n } catch (error) {\n compareError = error\n }\n await 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 '${activationId}' failed and its live state could not be confirmed`,\n )\n }\n throw error\n }\n await lease.assertOwned()\n const observedHash = surfaceHash(serialize(observedConfig))\n if (observedHash !== winnerHash) {\n const mismatch = new Error(\n `memory activation '${activationId}' did not install the measured winner; found '${observedHash}'`,\n )\n if (compareError) {\n throw new AggregateError(\n [compareError, mismatch],\n `memory activation '${activationId}' failed without applying the measured winner`,\n )\n }\n throw mismatch\n }\n outcome = compareError ? 'recovered' : 'applied'\n activation.status = compareError ? 'recovered' : 'activated'\n }\n\n await lease.assertOwned()\n appendMemoryActivationEvent(storage, activationJournalPath, {\n ...activationEventIdentity,\n status: 'activated',\n outcome,\n recordedAt: (options.now ?? (() => new Date()))().toISOString(),\n })\n writeMemoryImprovementResult(storage, options.experimentId, result)\n }\n return result\n}\n\nfunction withCostContext(\n proposer: SurfaceProposer,\n costLedger: CostLedgerHandle,\n lease: OwnedRunLease,\n label: string,\n): SurfaceProposer {\n return {\n kind: proposer.kind,\n async propose(context) {\n await lease.assertOwned()\n const proposal = await proposer.propose({\n ...context,\n costLedger,\n costPhase: `memory.proposal.${context.track?.id ?? label}`,\n })\n await lease.assertOwned()\n return proposal\n },\n ...(proposer.decide ? { decide: (input) => proposer.decide!(input) } : {}),\n }\n}\n\nfunction withGovernorCostContext(\n governor: AgentMemoryGovernor,\n costLedger: CostLedgerHandle,\n lease: OwnedRunLease,\n): Governor {\n return {\n async decide(context) {\n await lease.assertOwned()\n const decision = await governor.decide({\n ...context,\n costLedger,\n costPhase: 'memory.governor',\n })\n await lease.assertOwned()\n return decision\n },\n }\n}\n\nasync function buildCandidate<TConfig>(\n options: RunAgentMemoryImprovementOptions<TConfig>,\n config: TConfig,\n hash: string,\n role: string,\n): Promise<AgentMemoryExperimentCandidate> {\n const built = await options.createCandidate({\n config,\n candidateId: `${role}-${hash}`,\n surfaceHash: hash,\n })\n return {\n ...built,\n id: `${role}-${hash}`,\n ref: built.ref,\n }\n}\n\nfunction experimentOptions<TConfig>(\n options: RunAgentMemoryImprovementOptions<TConfig>,\n costLedger: ReturnType<typeof createRunCostLedger>,\n storage: CampaignStorage,\n lease: OwnedRunLease,\n): Pick<\n RunAgentMemoryExperimentOptions,\n | 'storage'\n | 'seed'\n | 'reps'\n | 'resumable'\n | 'maxConcurrency'\n | 'dispatchTimeoutMs'\n | 'cleanupTimeoutMs'\n | 'maxRecoveryAttempts'\n | 'maxRecoveryRetriesPerAttempt'\n | 'executeStep'\n | 'executeStepRef'\n | 'onBranchSnapshot'\n | 'cleanupBranches'\n | 'costLedger'\n | 'acquireRunLease'\n | 'now'\n> {\n return {\n storage,\n seed: options.seed,\n reps: options.reps,\n resumable: options.resumable,\n maxConcurrency: options.sequenceConcurrency,\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 costLedger,\n acquireRunLease: async () => ({\n assertOwned: () => lease.assertOwned(),\n release() {},\n }),\n now: options.now,\n }\n}\n\ntype OwnedRunLease = OwnedAgentMemoryRunLease\n\nfunction assertMemoryImprovementIdentity<TConfig>(\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 schema: 6,\n implementationRef: MEMORY_IMPROVEMENT_IMPLEMENTATION_REF,\n experimentId: options.experimentId,\n improvementRef: options.improvementRef,\n activationRef: options.activation?.ref ?? null,\n proposerKind: options.proposer.kind,\n proposerKinds: Object.fromEntries(\n Object.entries(options.proposers ?? {})\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([name, proposer]) => [name, proposer.kind]),\n ),\n populationSize: options.populationSize ?? 4,\n budget: { maxSteps: options.budget.maxSteps },\n executeStepRef: options.executeStepRef ?? null,\n cleanupBranches: options.cleanupBranches ?? true,\n promotionPolicy: normalizedPromotionPolicy(options),\n seed: options.seed ?? null,\n reps: options.reps ?? 1,\n seeds: options.seeds.map((entry) => ({\n config: serialize(entry.config),\n track: entry.track,\n vision: entry.vision ?? null,\n proposer: entry.proposer,\n })),\n trainSequences: options.trainSequences,\n holdoutSequences: options.holdoutSequences,\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 (\n storage.exists(join(runDir, 'lineage.jsonl')) ||\n storage.exists(join(runDir, 'memory-improvement-result.json'))\n ) {\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 implementationRef`,\n )\n }\n}\n\nfunction 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\nfunction 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\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 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\nfunction writeMemoryImprovementResult<TConfig>(\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 activation: result.activation,\n totalCostUsd: result.totalCostUsd,\n lineage: result.lineage.toGraph(),\n },\n null,\n 2,\n )}\\n`,\n )\n}\n\nfunction decidePromotion<TConfig>(input: {\n options: RunAgentMemoryImprovementOptions<TConfig>\n result: RunAgentMemoryExperimentResult\n baselineId: string\n winnerId: string\n}): AgentMemoryPromotionDecision {\n const { options, result, baselineId, winnerId } = input\n const baselineRow = result.rows.find((row) => row.candidateId === baselineId)\n const winnerRow = result.rows.find((row) => row.candidateId === winnerId)\n if (!baselineRow || !winnerRow) throw new Error('holdout result is missing a comparison arm')\n const paired = pairedArtifacts(result, baselineId, winnerId, (artifact) => artifact.score)\n const significance = heldoutSignificance(paired, options.significance)\n const tolerance = options.criticalDimensionTolerance ?? 0.05\n const criticalDimensions = (options.criticalDimensions ?? DEFAULT_CRITICAL_DIMENSIONS).map(\n (dimension) => {\n const expectedN =\n applicableSequenceCount(options.holdoutSequences, dimension) * (options.reps ?? 1)\n const dimensionPairs = pairedArtifacts(result, baselineId, winnerId, (artifact) =>\n (artifact.dimensionSampleCounts?.[dimension] ?? 0) > 0\n ? artifact.dimensions[dimension]\n : undefined,\n )\n const comparison = heldoutSignificance(dimensionPairs, {\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 if (baselineRow.cellsFailed > 0 || winnerRow.cellsFailed > 0) {\n reasons.push('at least one holdout cell failed')\n }\n if (!significance.significant) {\n reasons.push(\n significance.fewRuns\n ? `only ${significance.n} paired holdout cells; more are required`\n : 'holdout lift is not confidently above the promotion threshold',\n )\n }\n if (winnerRow.scoreMean < (options.minHoldoutScore ?? 0)) {\n reasons.push(`winner holdout score ${winnerRow.scoreMean} 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 holdout histories`\n : `critical dimension ${dimension.dimension} was measured on ${dimension.n}/${dimension.expectedN} applicable paired holdout 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: baselineRow.scoreMean,\n winnerScore: winnerRow.scoreMean,\n lift: winnerRow.scoreMean - baselineRow.scoreMean,\n significance,\n criticalDimensions,\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 normalizedPromotionPolicy<TConfig>(\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 minHoldoutScore: options.minHoldoutScore ?? 0,\n }\n}\n\nfunction pairedArtifacts(\n result: RunAgentMemoryExperimentResult,\n baselineId: string,\n winnerId: string,\n select: (artifact: AgentMemorySequenceArtifact) => number | undefined,\n): PairedHoldout {\n const baseline = artifactValues(result, baselineId, select)\n const winner = artifactValues(result, winnerId, select)\n const keys = [...baseline.keys()].filter((key) => winner.has(key)).sort()\n return {\n before: keys.map((key) => baseline.get(key)!),\n after: keys.map((key) => winner.get(key)!),\n cellIds: keys,\n }\n}\n\nfunction artifactValues(\n result: RunAgentMemoryExperimentResult,\n candidateId: string,\n select: (artifact: AgentMemorySequenceArtifact) => number | undefined,\n): Map<string, number> {\n const values = new Map<string, number>()\n for (const cell of result.campaign.cells) {\n if (cell.error || cell.artifact.candidateId !== candidateId) continue\n const value = select(cell.artifact)\n if (value === undefined || !Number.isFinite(value)) continue\n values.set(`${cell.artifact.sequenceId}:${cell.rep}`, value)\n }\n return values\n}\n\nfunction sequenceScores(\n result: RunAgentMemoryExperimentResult,\n sequences: readonly AgentMemorySequence[],\n candidateId: string,\n): number[] {\n const bySequence = new Map<string, number[]>()\n for (const cell of result.campaign.cells) {\n if (cell.error || cell.artifact.candidateId !== candidateId) continue\n const bucket = bySequence.get(cell.artifact.sequenceId) ?? []\n bucket.push(cell.artifact.score)\n bySequence.set(cell.artifact.sequenceId, bucket)\n }\n return sequences.map((sequence) => mean(bySequence.get(sequence.id) ?? []))\n}\n\nfunction requireStringSurface(surface: MutableSurface): string {\n if (typeof surface !== 'string' || surface.trim().length === 0) {\n throw new Error('memory config proposer must return a JSON string surface')\n }\n return surface\n}\n\nfunction serializeMemoryConfig<TConfig>(\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\nfunction parseMemoryConfig<TConfig>(parse: (surface: string) => TConfig, surface: string): 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\nfunction assertMemoryConfigRoundTrip<TConfig>(\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 seed configs exactly')\n }\n}\n\nfunction memorySequenceFingerprint(sequence: AgentMemorySequence): string {\n const { id: _id, split: _split, tags: _tags, ...content } = sequence\n return surfaceHash(canonicalJson(content))\n}\n\nfunction assertMemoryImprovementOptions<TConfig>(\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 if (typeof options.proposer?.kind !== 'string' || !options.proposer.kind.trim()) {\n throw new Error('memory improvement proposer.kind must be a non-empty string')\n }\n if (typeof options.proposer?.propose !== 'function') {\n throw new Error('memory improvement proposer.propose must be a function')\n }\n if (options.governor !== undefined && typeof options.governor.decide !== 'function') {\n throw new Error('memory improvement governor.decide must be a function')\n }\n if (options.activation !== undefined) {\n if (typeof options.activation.ref !== 'string' || !options.activation.ref.trim()) {\n throw new Error('memory improvement activation.ref must be a non-empty string')\n }\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 for (const [name, proposer] of Object.entries(options.proposers ?? {})) {\n if (!name.trim()) throw new Error('memory improvement proposer labels must be non-empty')\n if (\n !proposer ||\n typeof proposer.kind !== 'string' ||\n !proposer.kind.trim() ||\n typeof proposer.propose !== 'function'\n ) {\n throw new Error(`memory improvement proposer '${name}' is invalid`)\n }\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 if (!Number.isSafeInteger(options.budget.maxSteps) || options.budget.maxSteps < 0) {\n throw new Error('memory improvement budget.maxSteps must be a non-negative safe integer')\n }\n for (const [name, value] of [\n ['populationSize', options.populationSize],\n ['candidateConcurrency', options.candidateConcurrency],\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 if (\n options.maxTotalCostUsd !== undefined &&\n (!Number.isFinite(options.maxTotalCostUsd) || options.maxTotalCostUsd < 0)\n ) {\n throw new Error('memory improvement maxTotalCostUsd must be a non-negative finite number')\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.minHoldoutScore\n if (minimum !== undefined && (!Number.isFinite(minimum) || minimum < 0 || minimum > 1)) {\n throw new Error('memory improvement minHoldoutScore must be between 0 and 1')\n }\n for (const seed of options.seeds) {\n if (\n typeof seed.track !== 'string' ||\n !seed.track.trim() ||\n typeof seed.proposer !== 'string' ||\n !seed.proposer.trim()\n ) {\n throw new Error('memory improvement seeds require non-empty track and proposer values')\n }\n if (seed.vision !== undefined && (typeof seed.vision !== 'string' || !seed.vision.trim())) {\n throw new Error('memory improvement seed vision must be a non-empty string when provided')\n }\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 assertDistinctSequenceContent(options.trainSequences, 'train')\n assertDistinctSequenceContent(options.holdoutSequences, 'holdout')\n}\n\nfunction assertDistinctSequenceContent(\n sequences: readonly AgentMemorySequence[],\n split: string,\n): void {\n const idsByFingerprint = new Map<string, string>()\n for (const sequence of sequences) {\n const fingerprint = memorySequenceFingerprint(sequence)\n const prior = idsByFingerprint.get(fingerprint)\n if (prior) {\n throw new Error(\n `memory improvement ${split} histories duplicate content: ${prior}/${sequence.id}`,\n )\n }\n idsByFingerprint.set(fingerprint, sequence.id)\n }\n}\n\nfunction mean(values: readonly number[]): number {\n return values.length === 0 ? 0 : values.reduce((sum, value) => sum + value, 0) / values.length\n}\n","import { randomUUID } from 'node:crypto'\nimport { canonicalJson } from '@tangle-network/agent-eval'\nimport { 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 stableId('mem0', 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","randomUUID","canonicalJson","canonicalJson","randomUUID","mergeScopes","record","randomUUID","canonicalJson","mergeScopes","canonicalJson","stripUndefined","randomUUID","stringArray","uniqueStrings","join","canonicalJson","createRunCostLedger","fsCampaignStorage","resolveRunDir","fsCampaignStorage","resolveRunDir","canonicalJson","createRunCostLedger","join","result","mean","randomUUID","canonicalJson","mergeScopes","randomUUID","compactRecord","stringField","ids","numberField","canonicalJson","isRecord","canonicalJson","canonicalJson","stringField","numberField"]}