@tangle-network/agent-knowledge 3.2.1 → 4.0.1

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.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/memory/holdout.ts","../src/memory/adapter.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 { stableId } from '../ids'\nimport { defaultGetMemoryContext } from './adapter'\nimport { emitRetrievalHoldoutBypass } from './holdout'\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: Record<string, unknown>\n id?: string\n}\n\nexport function createNeo4jAgentMemoryAdapter(\n options: Neo4jAgentMemoryAdapterOptions,\n): AgentMemoryAdapter {\n const client = options.client\n const id = options.id ?? 'neo4j-agent-memory'\n return {\n id,\n async search(query, searchOptions = {}) {\n const sdkHits = await searchNeo4jMemory(client, query, searchOptions, id)\n if (sdkHits.length > 0) return sdkHits\n\n const result = await callOptional(\n client,\n ['search', 'memory_search'],\n [query, neo4jOptions(searchOptions)],\n )\n if (result !== undefined) return normalizeHits(result, searchOptions, id)\n\n const context = await callOptional(\n client,\n ['getContext', 'get_context'],\n [query, neo4jOptions(searchOptions)],\n )\n if (context !== undefined) return normalizeHits(context, searchOptions, id)\n return []\n },\n async getContext(query, searchOptions = {}) {\n const shortTerm = nested(client, ['shortTerm', 'short_term'], {})\n const sessionId = searchOptions.scope?.sessionId\n if (sessionId) {\n const conversationContext = await callOptional(\n shortTerm,\n ['getContext', 'get_context'],\n [sessionId],\n )\n if (conversationContext !== undefined) {\n const hits = normalizeConversationContextHits(conversationContext, searchOptions, id)\n const text =\n textFromConversationContext(conversationContext) ??\n (typeof conversationContext === 'string'\n ? conversationContext\n : hits.length > 0\n ? renderHits(hits)\n : '')\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\n const result = await callOptional(\n client,\n ['getContext', 'get_context'],\n [query, neo4jOptions(searchOptions)],\n )\n if (result === undefined) {\n return defaultGetMemoryContext(\n {\n search: async () => {\n const sdkHits = await searchNeo4jMemory(client, query, searchOptions, id)\n if (sdkHits.length > 0) return sdkHits\n const searchResult = await callOptional(\n client,\n ['search', 'memory_search'],\n [query, neo4jOptions(searchOptions)],\n )\n return normalizeHits(searchResult, searchOptions, id)\n },\n },\n query,\n searchOptions,\n )\n }\n if (typeof result === 'string') {\n const hit: AgentMemoryHit = {\n id: stableId('mem', `${id}:${query}:${result}`),\n uri: `memory://${id}/context/${stableId('ctx', query)}`,\n kind: 'fact',\n text: result,\n title: 'Memory context',\n normalizedScore: 1,\n }\n if (searchOptions.holdout) {\n emitRetrievalHoldoutBypass(\n [hit],\n searchOptions.holdout,\n holdoutBypassContext(query, searchOptions),\n 'raw-string-context',\n )\n }\n return {\n query,\n text: result,\n hits: [hit],\n sourceRecords: [memoryHitToSourceRecord(hit, { scope: searchOptions.scope })],\n metadata: { adapter: id },\n }\n }\n const hits = normalizeHits(result, searchOptions, id)\n if (hits.length > 0)\n return defaultGetMemoryContext({ search: async () => hits }, query, searchOptions)\n return defaultGetMemoryContext({ search: async () => [] }, query, searchOptions)\n },\n async write(input) {\n const result = await writeNeo4jMemory(client, input, id)\n return {\n ...result,\n sourceRecord: memoryWriteResultToSourceRecord(result, input.text, { scope: input.scope }),\n }\n },\n }\n}\n\nasync function writeNeo4jMemory(\n client: Record<string, unknown>,\n input: AgentMemoryWriteInput,\n adapterId: string,\n): Promise<AgentMemoryWriteResult> {\n const scope = input.scope ?? {}\n const sessionId = scope.sessionId ?? input.metadata?.sessionId\n let result: unknown\n if (input.kind === 'message') {\n const shortTerm = nested(client, ['shortTerm', 'short_term'], client)\n result = await callOptional(\n shortTerm,\n ['addMessage'],\n [\n sessionId,\n input.role ?? 'user',\n input.text,\n {\n metadata: input.metadata,\n conversationId: sessionId,\n userId: scope.userId,\n },\n ],\n )\n if (result === undefined) {\n result = await callRequired(\n shortTerm,\n ['add_message'],\n [\n {\n session_id: sessionId,\n sessionId,\n role: input.role ?? 'user',\n content: input.text,\n user_identifier: scope.userId,\n userIdentifier: scope.userId,\n metadata: input.metadata,\n },\n ],\n )\n }\n } else if (input.kind === 'entity') {\n const longTerm = nested(client, ['longTerm', 'long_term'], client)\n result = await callOptional(\n longTerm,\n ['addEntity'],\n [\n input.entityName ?? input.title ?? input.text,\n input.entityType ?? 'ENTITY',\n neo4jEntityOptions(input),\n ],\n )\n if (result === undefined) {\n result = await callRequired(\n longTerm,\n ['add_entity'],\n [\n input.entityName ?? input.title ?? input.text,\n input.entityType ?? 'ENTITY',\n neo4jWriteOptions(input),\n ],\n )\n }\n } else if (input.kind === 'preference') {\n const longTerm = nested(client, ['longTerm', 'long_term'], client)\n result = await callOptional(\n longTerm,\n ['addPreference'],\n [input.category ?? 'general', input.text, neo4jPreferenceOptions(input)],\n )\n if (result === undefined) {\n result = await callRequired(\n longTerm,\n ['add_preference'],\n [input.category ?? 'general', input.text, neo4jWriteOptions(input)],\n )\n }\n } else {\n result = await callRequired(\n nested(client, ['longTerm', 'long_term'], client),\n ['addFact', 'add_fact'],\n [\n input.subject ?? input.title ?? input.kind,\n input.predicate ?? 'states',\n input.object ?? input.text,\n ],\n )\n }\n\n const id = idFromResult(result) ?? input.id ?? stableId('mem', `${input.kind}:${input.text}`)\n return {\n accepted: true,\n id,\n uri: `memory://${adapterId}/${encodeURIComponent(id)}`,\n kind: input.kind,\n metadata: { rawResult: result },\n }\n}\n\nasync function searchNeo4jMemory(\n client: Record<string, unknown>,\n query: string,\n options: AgentMemorySearchOptions,\n adapterId: string,\n): Promise<AgentMemoryHit[]> {\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\n if (includeKind('message')) {\n searches.push(\n callOptional(\n shortTerm,\n ['searchMessages', 'search_messages'],\n [query, searchMessagesOptions(options)],\n ).then((result) => normalizeHits(result, { ...options, kinds: ['message'] }, adapterId)),\n )\n }\n\n if (includeKind('entity')) {\n searches.push(\n callOptional(\n longTerm,\n ['searchEntities', 'search_entities'],\n [query, searchEntitiesOptions(options)],\n ).then((result) => normalizeHits(result, { ...options, kinds: ['entity'] }, adapterId)),\n )\n }\n\n if (includeKind('preference')) {\n searches.push(\n callOptional(\n longTerm,\n ['searchPreferences', 'search_preferences'],\n [query, searchPreferencesOptions(options)],\n ).then((result) => normalizeHits(result, { ...options, kinds: ['preference'] }, adapterId)),\n )\n }\n\n if (includeKind('reasoning-trace')) {\n searches.push(\n callOptional(\n reasoning,\n ['getSimilarTraces', 'get_similar_traces'],\n [query, similarTracesOptions(options)],\n ).then((result) =>\n normalizeHits(result, { ...options, kinds: ['reasoning-trace'] }, adapterId),\n ),\n )\n }\n\n const hits = (await Promise.all(searches)).flat()\n return hits\n .sort((a, b) => (b.normalizedScore ?? b.score ?? 0) - (a.normalizedScore ?? a.score ?? 0))\n .slice(0, options.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 neo4jOptions(options: AgentMemorySearchOptions): Record<string, unknown> {\n return {\n limit: options.limit,\n k: options.limit,\n min_score: options.minScore,\n minScore: options.minScore,\n user_identifier: options.scope?.userId,\n userIdentifier: options.scope?.userId,\n session_id: options.scope?.sessionId,\n sessionId: options.scope?.sessionId,\n namespace: options.scope?.namespace,\n tenant_id: options.scope?.tenantId,\n tenantId: options.scope?.tenantId,\n kinds: options.kinds,\n metadata: options.metadata,\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 metadata: options.metadata,\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 sessionId: options.scope?.sessionId,\n successOnly: options.metadata?.successOnly,\n }\n}\n\nfunction neo4jWriteOptions(input: AgentMemoryWriteInput): Record<string, unknown> {\n return {\n user_identifier: input.scope?.userId,\n userIdentifier: input.scope?.userId,\n session_id: input.scope?.sessionId,\n sessionId: input.scope?.sessionId,\n namespace: input.scope?.namespace,\n confidence: input.confidence,\n metadata: input.metadata,\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 const result = await callOptional(target, names, args)\n if (result !== undefined) return result\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)\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 kind = memoryKind(stringField(obj, ['kind', 'type', 'label']), obj)\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 textFromConversationContext(value: unknown): string | undefined {\n const obj = record(value)\n if (!obj) return undefined\n const parts = [\n ...rawHitsFrom(obj.reflections).map((hit) => normalizeContextPart(hit)),\n ...rawHitsFrom(obj.observations).map((hit) => normalizeContextPart(hit)),\n ...rawHitsFrom(obj.recentMessages).map((hit) => normalizeContextPart(hit)),\n ].filter(Boolean)\n return parts.length > 0 ? parts.join('\\n\\n') : 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 normalizeContextPart(value: unknown): string | undefined {\n if (typeof value === 'string') return value\n const obj = record(value)\n return obj\n ? textFromHitObject(obj, memoryKind(stringField(obj, ['kind', 'type', 'label']), obj))\n : undefined\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","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 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":["hits"]}
@@ -1,49 +0,0 @@
1
- import {
2
- sha256,
3
- stableId
4
- } from "./chunk-YMKHCTS2.js";
5
-
6
- // src/memory/source-record.ts
7
- function memoryHitToSourceRecord(hit, options = {}) {
8
- const contentHash = sha256(`${hit.uri}
9
- ${hit.text}`);
10
- return {
11
- id: stableId("src", `${hit.uri}:${contentHash}`),
12
- uri: hit.uri,
13
- title: hit.title ?? `${hit.kind}:${hit.id}`,
14
- mediaType: "text/plain",
15
- contentHash,
16
- text: hit.text,
17
- validUntil: hit.validUntil,
18
- lastVerifiedAt: hit.lastVerifiedAt,
19
- createdAt: (options.now ?? (() => /* @__PURE__ */ new Date()))().toISOString(),
20
- metadata: {
21
- ...hit.metadata ?? {},
22
- source: "agent-memory",
23
- memoryId: hit.id,
24
- memoryKind: hit.kind,
25
- score: hit.score,
26
- normalizedScore: hit.normalizedScore,
27
- confidence: hit.confidence,
28
- scope: options.scope
29
- }
30
- };
31
- }
32
- function memoryWriteResultToSourceRecord(result, text, options = {}) {
33
- return memoryHitToSourceRecord(
34
- {
35
- id: result.id,
36
- uri: result.uri,
37
- kind: result.kind,
38
- text,
39
- metadata: result.metadata
40
- },
41
- options
42
- );
43
- }
44
-
45
- export {
46
- memoryHitToSourceRecord,
47
- memoryWriteResultToSourceRecord
48
- };
49
- //# sourceMappingURL=chunk-XVU5FFQA.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/memory/source-record.ts"],"sourcesContent":["import { sha256, stableId } from '../ids'\nimport type { SourceRecord } from '../types'\nimport type { AgentMemoryHit, AgentMemoryScope, AgentMemoryWriteResult } from './types'\n\nexport function memoryHitToSourceRecord(\n hit: AgentMemoryHit,\n options: { now?: () => Date; scope?: AgentMemoryScope } = {},\n): SourceRecord {\n const contentHash = sha256(`${hit.uri}\\n${hit.text}`)\n return {\n id: stableId('src', `${hit.uri}:${contentHash}`),\n uri: hit.uri,\n title: hit.title ?? `${hit.kind}:${hit.id}`,\n mediaType: 'text/plain',\n contentHash,\n text: hit.text,\n validUntil: hit.validUntil,\n lastVerifiedAt: hit.lastVerifiedAt,\n createdAt: (options.now ?? (() => new Date()))().toISOString(),\n metadata: {\n ...(hit.metadata ?? {}),\n source: 'agent-memory',\n memoryId: hit.id,\n memoryKind: hit.kind,\n score: hit.score,\n normalizedScore: hit.normalizedScore,\n confidence: hit.confidence,\n scope: options.scope,\n },\n }\n}\n\nexport function memoryWriteResultToSourceRecord(\n result: AgentMemoryWriteResult,\n text: string,\n options: { now?: () => Date; scope?: AgentMemoryScope } = {},\n): SourceRecord {\n return memoryHitToSourceRecord(\n {\n id: result.id,\n uri: result.uri,\n kind: result.kind,\n text,\n metadata: result.metadata,\n },\n options,\n )\n}\n"],"mappings":";;;;;;AAIO,SAAS,wBACd,KACA,UAA0D,CAAC,GAC7C;AACd,QAAM,cAAc,OAAO,GAAG,IAAI,GAAG;AAAA,EAAK,IAAI,IAAI,EAAE;AACpD,SAAO;AAAA,IACL,IAAI,SAAS,OAAO,GAAG,IAAI,GAAG,IAAI,WAAW,EAAE;AAAA,IAC/C,KAAK,IAAI;AAAA,IACT,OAAO,IAAI,SAAS,GAAG,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA,IACzC,WAAW;AAAA,IACX;AAAA,IACA,MAAM,IAAI;AAAA,IACV,YAAY,IAAI;AAAA,IAChB,gBAAgB,IAAI;AAAA,IACpB,YAAY,QAAQ,QAAQ,MAAM,oBAAI,KAAK,IAAI,EAAE,YAAY;AAAA,IAC7D,UAAU;AAAA,MACR,GAAI,IAAI,YAAY,CAAC;AAAA,MACrB,QAAQ;AAAA,MACR,UAAU,IAAI;AAAA,MACd,YAAY,IAAI;AAAA,MAChB,OAAO,IAAI;AAAA,MACX,iBAAiB,IAAI;AAAA,MACrB,YAAY,IAAI;AAAA,MAChB,OAAO,QAAQ;AAAA,IACjB;AAAA,EACF;AACF;AAEO,SAAS,gCACd,QACA,MACA,UAA0D,CAAC,GAC7C;AACd,SAAO;AAAA,IACL;AAAA,MACE,IAAI,OAAO;AAAA,MACX,KAAK,OAAO;AAAA,MACZ,MAAM,OAAO;AAAA,MACb;AAAA,MACA,UAAU,OAAO;AAAA,IACnB;AAAA,IACA;AAAA,EACF;AACF;","names":[]}