@tangle-network/agent-knowledge 1.10.0 → 1.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +250 -74
- package/dist/benchmarks/index.d.ts +5 -0
- package/dist/benchmarks/index.js +52 -0
- package/dist/chunk-DQ3PDMDP.js +115 -0
- package/dist/chunk-DQ3PDMDP.js.map +1 -0
- package/dist/chunk-ULXZI235.js +1855 -0
- package/dist/chunk-ULXZI235.js.map +1 -0
- package/dist/{chunk-U6KQ4FS3.js → chunk-VN2OGUUP.js} +306 -40
- package/dist/chunk-VN2OGUUP.js.map +1 -0
- package/dist/{chunk-WWY5FTKQ.js → chunk-W6VWYTNH.js} +10 -115
- package/dist/chunk-W6VWYTNH.js.map +1 -0
- package/dist/chunk-XVU5FFQA.js +49 -0
- package/dist/chunk-XVU5FFQA.js.map +1 -0
- package/dist/cli.js +4 -2
- package/dist/cli.js.map +1 -1
- package/dist/index-Cj5jRXOz.d.ts +426 -0
- package/dist/index.d.ts +1036 -169
- package/dist/index.js +3372 -558
- package/dist/index.js.map +1 -1
- package/dist/memory/index.d.ts +5 -70
- package/dist/memory/index.js +20 -4
- package/dist/types-CjqPcTTK.d.ts +319 -0
- package/docs/architecture.md +7 -5
- package/docs/eval/investment-material-facts.md +252 -0
- package/docs/eval/rag-eval-roadmap.md +119 -0
- package/docs/results/investment-thesis.md +306 -0
- package/docs/results/research-driving.md +265 -0
- package/docs/two-agent-research-ab.md +121 -10
- package/package.json +8 -9
- package/dist/chunk-MU5CEOGE.js +0 -387
- package/dist/chunk-MU5CEOGE.js.map +0 -1
- package/dist/chunk-U6KQ4FS3.js.map +0 -1
- package/dist/chunk-WWY5FTKQ.js.map +0 -1
- package/dist/profiles/index.d.ts +0 -194
- package/dist/profiles/index.js +0 -11
- package/docs/recursive-research-leaf.md +0 -86
- package/docs/supervisor-profiles.md +0 -295
- /package/dist/{profiles → benchmarks}/index.js.map +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/profiles/researcher.ts"],"sourcesContent":["/**\n * @experimental\n *\n * `researcherProfile` — opinionated preset for source-grounded research\n * tasks. The agent is told to:\n * - bound its work to a single `knowledgeNamespace`\n * - emit `items[]` carrying provenance + confidence\n * - emit `citations[]` linking quotes back to source urls\n * - emit `proposedWrites[]` — never call materialize itself\n * - describe `gaps` it could not answer\n *\n * The profile is stateless and agent-agnostic. `harness` selects the\n * sandbox-SDK backend. For heterogeneous fanout, use\n * `multiHarnessResearcherFanout`.\n *\n * Propose-don't-apply: the profile NEVER writes to the knowledge base.\n * It produces `proposedWrites: KnowledgeUpdate[]` in the output. The\n * caller (gtm-agent, journey-eval, user) decides whether to feed those\n * updates through `applyKnowledgeWriteBlocks` / a KbStore put.\n *\n * Namespace isolation: every `KnowledgeItem` + `KnowledgeUpdate` in the\n * output carries `namespace`. The validator hard-fails when any item\n * touches a namespace other than `task.knowledgeNamespace`.\n */\n\nimport type {\n AgentProfile,\n AgentRunSpec,\n DefaultVerdict,\n Driver,\n OutputAdapter,\n SandboxEvent,\n Validator,\n} from '@tangle-network/agent-runtime/loops'\n\n/** @experimental */\nexport type ResearchSource = 'web' | 'corpus' | 'twitter' | 'github' | 'docs'\n\n/** @experimental */\nexport interface ResearchTask {\n /** The research question to answer. */\n question: string\n /** Bound: e.g. \"audience for cpg-founder ICP\". */\n scope?: string\n /** Multi-tenant scope (customer-id, workspace-id). Validator enforces. */\n knowledgeNamespace: string\n sources?: ResearchSource[]\n recencyWindow?: { since?: Date; until?: Date }\n maxItems?: number\n /** Per-item minimum confidence in [0, 1]. Validator scores recall vs this. */\n minConfidence?: number\n}\n\n/**\n * Knowledge item emitted by the researcher.\n *\n * Profile-local type. When agent-knowledge promotes `KnowledgeClaim` →\n * top-level `KnowledgeItem` substrate-wide, these fields collapse 1:1.\n *\n * @experimental\n */\nexport interface KnowledgeItem {\n id: string\n /** Multi-tenant scope. MUST equal `task.knowledgeNamespace`. */\n namespace: string\n /** The factual claim, in the researcher's words. */\n claim: string\n /** Provenance — at least one entry required. */\n evidence: Array<{ source: string; quote?: string; url?: string; capturedAt: number }>\n /** Researcher's self-reported confidence in [0, 1]. */\n confidence: number\n /** Prior item ids this supersedes (chain). */\n supersedes?: string[]\n /** Set if the agent is retracting an earlier item. Unix ms. */\n retractedAt?: number\n authoredBy: { kind: 'human' | 'agent'; id: string }\n}\n\n/**\n * A proposed write to the knowledge base. The profile does NOT apply\n * these — the caller decides.\n *\n * @experimental\n */\nexport type KnowledgeUpdate =\n | { kind: 'insert'; namespace: string; item: KnowledgeItem }\n | { kind: 'supersede'; namespace: string; previousId: string; item: KnowledgeItem }\n | { kind: 'retract'; namespace: string; itemId: string; reason: string }\n\n/**\n * Researcher output. Required fields are typed; optional fields preserve\n * the agent's free-form intelligence (`notes`, `raw`). The validator\n * enforces the typed minimum.\n *\n * @experimental\n */\nexport interface ResearchOutput {\n items: KnowledgeItem[]\n citations: Array<{ url: string; quote: string; confidence: number }>\n proposedWrites: KnowledgeUpdate[]\n gaps?: string[]\n notes?: string\n /** Anything the agent emitted beyond the typed fields. */\n raw?: unknown\n}\n\n/** @experimental */\nexport interface ResearcherProfileOptions {\n /** Sandbox-SDK backend.type. Default `'opencode/zai-coding-plan/glm-5.1'`. */\n harness?: string\n /** Default model id passed in `AgentProfile.model.default`. */\n model?: string\n /** Custom system prompt replacement. Default = built-in researcher preset. */\n systemPrompt?: string\n /** Stable name for `AgentRunSpec.name`. Default = `researcher-${harness}`. */\n name?: string\n /**\n * Default 0.7. Minimum (citations with quote) / items ratio for `valid=true`.\n * Below this floor, citation_density scores < 1 and the item set is gated.\n */\n citationDensityMin?: number\n}\n\nconst DEFAULT_HARNESS = 'opencode/zai-coding-plan/glm-5.1'\nconst DEFAULT_CITATION_DENSITY_MIN = 0.7\n\n/** @experimental */\nexport function researcherProfile(\n options: ResearcherProfileOptions & { task?: ResearchTask } = {},\n): {\n profile: AgentProfile\n taskToPrompt: (task: ResearchTask) => string\n output: OutputAdapter<ResearchOutput>\n validator: Validator<ResearchOutput>\n agentRunSpec: AgentRunSpec<ResearchTask>\n} {\n const harness = options.harness ?? DEFAULT_HARNESS\n const name = options.name ?? `researcher-${harness}`\n const systemPrompt = options.systemPrompt ?? DEFAULT_RESEARCHER_SYSTEM_PROMPT\n const citationDensityMin = options.citationDensityMin ?? DEFAULT_CITATION_DENSITY_MIN\n const profile: AgentProfile = {\n name,\n description: \"Source-grounded research agent. Propose-don't-apply.\",\n prompt: { systemPrompt },\n model: options.model ? { default: options.model } : undefined,\n tools: { web_search: true, fs: true, shell: true },\n metadata: { backendType: harness, role: 'researcher' },\n }\n const output: OutputAdapter<ResearchOutput> = { parse: parseResearcherEvents }\n const validator: Validator<ResearchOutput> = options.task\n ? createResearcherValidator(options.task, { citationDensityMin })\n : createResearcherValidator(\n { question: '', knowledgeNamespace: '' },\n { citationDensityMin, namespaceCheck: false },\n )\n const agentRunSpec: AgentRunSpec<ResearchTask> = {\n name,\n profile,\n taskToPrompt: formatResearcherPrompt,\n }\n return { profile, taskToPrompt: formatResearcherPrompt, output, validator, agentRunSpec }\n}\n\n/** @experimental */\nexport interface MultiHarnessResearcherFanoutOptions {\n /** Backend.type identifiers, one per parallel agent. */\n harnesses?: string[]\n /** Optional per-harness model override. Indexed parallel to `harnesses`. */\n models?: (string | undefined)[]\n /** Default citation density floor for the shared validator. */\n citationDensityMin?: number\n /** Optional task — narrows the validator's namespace check. */\n task?: ResearchTask\n}\n\n/**\n * Build a fanout topology over multiple harnesses. The kernel round-robins\n * `agentRuns` across the N parallel iterations and the `FanoutVote` driver\n * picks the highest-scoring valid output.\n *\n * @experimental\n */\nexport function multiHarnessResearcherFanout(options: MultiHarnessResearcherFanoutOptions = {}): {\n agentRuns: AgentRunSpec<ResearchTask>[]\n output: OutputAdapter<ResearchOutput>\n validator: Validator<ResearchOutput>\n driver: Driver<ResearchTask, ResearchOutput, 'done'>\n} {\n const harnesses =\n options.harnesses && options.harnesses.length > 0\n ? options.harnesses\n : ['opencode/zai-coding-plan/glm-5.1', 'claude-code', 'codex']\n const models = options.models ?? []\n const agentRuns = harnesses.map((harness, i) => {\n const { agentRunSpec } = researcherProfile({ harness, model: models[i] })\n return agentRunSpec\n })\n const { output, validator } = researcherProfile({\n citationDensityMin: options.citationDensityMin,\n task: options.task,\n })\n // Single fanout round across the N harnesses, then stop: the kernel\n // round-robins `agentRuns` over the N branches and selects the winner\n // (best valid score) across all iterations via `defaultSelectWinner`.\n const driver: Driver<ResearchTask, ResearchOutput, 'done'> = {\n name: 'researcher-fanout',\n async plan(task, history) {\n return history.length === 0 ? Array.from({ length: harnesses.length }, () => task) : []\n },\n // 'done' is a terminal decision in the kernel; the loop finalizes after\n // the single fanout round and selects the winner via `defaultSelectWinner`.\n decide() {\n return 'done'\n },\n describePlan() {\n return { kind: 'fanout' }\n },\n }\n return { agentRuns, output, validator, driver }\n}\n\n/**\n * Build a validator that closes over a specific `ResearchTask`'s constraints.\n *\n * Checks in order:\n * 1. Items must be non-empty.\n * 2. Every item carries `evidence.length >= 1`.\n * 3. Every item + proposedWrite is scoped to `task.knowledgeNamespace`\n * (hard-fail on any namespace mismatch — defence in depth for the\n * multi-tenant invariant).\n * 4. Citation density (citations with quote / items) >= floor.\n *\n * Aggregate score:\n * 0.4 · citation_density\n * + 0.2 · source_diversity (distinct sources / max(items, 1))\n * + 0.2 · recency_match (mean fraction within `recencyWindow`)\n * + 0.2 · (1 − gaps/maxGaps), maxGaps = max(items, 1)\n *\n * @experimental\n */\nexport function createResearcherValidator(\n task: ResearchTask,\n config: { citationDensityMin?: number; namespaceCheck?: boolean } = {},\n): Validator<ResearchOutput> {\n const citationDensityMin = config.citationDensityMin ?? DEFAULT_CITATION_DENSITY_MIN\n const namespaceCheck = config.namespaceCheck ?? true\n return {\n async validate(output) {\n const notes: string[] = []\n const scores: Record<string, number> = {}\n let pass = true\n\n if (!Array.isArray(output.items) || output.items.length === 0) {\n pass = false\n notes.push('no items')\n scores.items = 0\n } else {\n scores.items = 1\n }\n\n const missingEvidence = (output.items ?? []).filter(\n (item) => !Array.isArray(item.evidence) || item.evidence.length === 0,\n )\n if (missingEvidence.length > 0) {\n pass = false\n notes.push(`${missingEvidence.length} item(s) without evidence`)\n scores.provenance = 0\n } else {\n scores.provenance = 1\n }\n\n if (namespaceCheck) {\n const foreignItems = (output.items ?? []).filter(\n (item) => item.namespace !== task.knowledgeNamespace,\n )\n const foreignWrites = (output.proposedWrites ?? []).filter(\n (write) => write.namespace !== task.knowledgeNamespace,\n )\n if (foreignItems.length > 0 || foreignWrites.length > 0) {\n pass = false\n notes.push(\n `namespace violation: ${foreignItems.length} item(s) + ${foreignWrites.length} write(s) ` +\n `outside ${task.knowledgeNamespace}`,\n )\n scores.namespace = 0\n } else {\n scores.namespace = 1\n }\n }\n\n const itemCount = Math.max(output.items?.length ?? 0, 1)\n const citationsWithQuote = (output.citations ?? []).filter(\n (citation) => typeof citation.quote === 'string' && citation.quote.length > 0,\n ).length\n const citationDensity = Math.min(1, citationsWithQuote / itemCount)\n if (citationDensity < citationDensityMin) {\n pass = false\n notes.push(\n `citation density ${citationDensity.toFixed(2)} below floor ${citationDensityMin.toFixed(2)}`,\n )\n }\n scores.citation_density = citationDensity\n\n const sourceSet = new Set<string>()\n for (const item of output.items ?? []) {\n for (const evidence of item.evidence ?? []) {\n if (evidence.source) sourceSet.add(evidence.source)\n }\n }\n scores.source_diversity = Math.min(1, sourceSet.size / itemCount)\n\n scores.recency_match = recencyMatchScore(output.items ?? [], task.recencyWindow)\n\n const maxGaps = itemCount\n const gapCount = output.gaps?.length ?? 0\n scores.gap_coverage = Math.max(0, 1 - gapCount / maxGaps)\n\n const score =\n 0.4 * scores.citation_density +\n 0.2 * scores.source_diversity +\n 0.2 * scores.recency_match +\n 0.2 * scores.gap_coverage\n\n const verdict: DefaultVerdict = {\n valid: pass,\n score: Number.isFinite(score) ? score : 0,\n scores,\n }\n if (notes.length > 0) verdict.notes = notes.join('; ')\n return verdict\n },\n }\n}\n\nfunction recencyMatchScore(items: KnowledgeItem[], window: ResearchTask['recencyWindow']): number {\n if (!window || (window.since === undefined && window.until === undefined)) return 1\n if (items.length === 0) return 0\n const sinceMs = window.since?.getTime() ?? Number.NEGATIVE_INFINITY\n const untilMs = window.until?.getTime() ?? Number.POSITIVE_INFINITY\n let hits = 0\n let total = 0\n for (const item of items) {\n for (const evidence of item.evidence ?? []) {\n if (typeof evidence.capturedAt !== 'number') continue\n total += 1\n if (evidence.capturedAt >= sinceMs && evidence.capturedAt <= untilMs) hits += 1\n }\n }\n return total === 0 ? 0 : hits / total\n}\n\nconst DEFAULT_RESEARCHER_SYSTEM_PROMPT = [\n 'You are a research agent. Your job is to answer a research question with',\n 'source-grounded knowledge items that the caller will choose whether to',\n 'persist to a multi-tenant knowledge base.',\n '',\n 'Hard rules:',\n \" 1. Every item you emit MUST carry the task's knowledgeNamespace exactly.\",\n ' Never write to a different namespace.',\n ' 2. Every item MUST carry at least one evidence entry with a source.',\n ' A quote + url is strongly preferred; capturedAt is unix ms.',\n ' 3. You propose writes — you do NOT apply them. The caller decides.',\n ' 4. Self-report confidence honestly in [0, 1]. Do not inflate.',\n ' 5. List what you could not answer in `gaps`. Better to admit a gap',\n ' than fabricate.',\n '',\n 'When you finish, emit a single final structured message of the shape:',\n ' ```json',\n ' { \"items\": [{ \"id\": \"...\", \"namespace\": \"...\", \"claim\": \"...\",',\n ' \"evidence\": [{ \"source\": \"...\", \"quote\": \"...\",',\n ' \"url\": \"...\", \"capturedAt\": 0 }],',\n ' \"confidence\": 0.0,',\n ' \"authoredBy\": { \"kind\": \"agent\", \"id\": \"...\" } }],',\n ' \"citations\": [{ \"url\": \"...\", \"quote\": \"...\", \"confidence\": 0.0 }],',\n ' \"proposedWrites\": [{ \"kind\": \"insert\", \"namespace\": \"...\",',\n ' \"item\": { /* same shape as items[] */ } }],',\n ' \"gaps\": [\"...\"],',\n ' \"notes\": \"free-form commentary\" }',\n ' ```',\n].join('\\n')\n\nfunction formatResearcherPrompt(task: ResearchTask): string {\n const sources = task.sources?.length ? task.sources.join(', ') : '(no preference)'\n const window = formatRecencyWindow(task.recencyWindow)\n return [\n `Question: ${task.question}`,\n `Knowledge namespace (DO NOT cross): ${task.knowledgeNamespace}`,\n `Scope: ${task.scope ?? '(unspecified)'}`,\n `Preferred sources: ${sources}`,\n `Recency window: ${window}`,\n `Max items: ${task.maxItems ?? '(no cap)'}`,\n `Per-item minimum confidence: ${task.minConfidence ?? '(no floor)'}`,\n '',\n 'Produce knowledge items with provenance + citations + proposed writes.',\n 'List gaps for anything you could not answer. Emit the final JSON',\n 'result block exactly as instructed.',\n ].join('\\n')\n}\n\nfunction formatRecencyWindow(window: ResearchTask['recencyWindow']): string {\n if (!window) return '(none)'\n const since = window.since ? window.since.toISOString() : '-∞'\n const until = window.until ? window.until.toISOString() : 'now'\n return `${since} .. ${until}`\n}\n\n/**\n * Walk the event stream and return the last structured `research.result`\n * payload. Falls back to scanning text deltas for a fenced JSON block.\n */\nfunction parseResearcherEvents(events: SandboxEvent[]): ResearchOutput {\n for (let i = events.length - 1; i >= 0; i -= 1) {\n const event = events[i]\n if (!event) continue\n const type = String(event.type ?? '')\n const data = isRecord(event.data) ? event.data : {}\n if (type === 'result' || type === 'final' || type === 'research.result') {\n const direct = coerceResearchOutput(data.result ?? data.output ?? data)\n // opencode reports the agent's terminal answer in `finalText` (not result/output).\n // Parse it too, and prefer it when `direct` is an all-empty shape — otherwise an\n // event carrying both `{items:[],citations:[],proposedWrites:[]}` and a rich\n // finalText would silently drop the real answer.\n const finalText = pickString(data.finalText)\n const fenced = finalText ? extractFencedJson(finalText) : undefined\n const fromFinalText = fenced ? coerceResearchOutput(fenced) : undefined\n if (direct && !isEmptyOutput(direct)) return direct\n if (fromFinalText) return fromFinalText\n if (direct) return direct\n }\n }\n for (let i = events.length - 1; i >= 0; i -= 1) {\n const event = events[i]\n if (!event) continue\n const data = isRecord(event.data) ? event.data : {}\n const text = pickString(data.text) ?? pickString(data.delta) ?? pickString(data.finalText)\n if (!text) continue\n const fenced = extractFencedJson(text)\n if (!fenced) continue\n const coerced = coerceResearchOutput(fenced)\n if (coerced) return coerced\n }\n return { items: [], citations: [], proposedWrites: [] }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\n/** A coerced output that carries no items, citations, or proposed writes. */\nfunction isEmptyOutput(o: ResearchOutput): boolean {\n return o.items.length === 0 && o.citations.length === 0 && o.proposedWrites.length === 0\n}\n\nfunction pickString(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined\n}\n\nfunction extractFencedJson(text: string): unknown | undefined {\n const match = text.match(/```(?:json)?\\s*([\\s\\S]*?)```/i)\n if (!match) return undefined\n const body = (match[1] ?? '').trim()\n if (!body) return undefined\n try {\n return JSON.parse(body)\n } catch {\n return undefined\n }\n}\n\nfunction coerceResearchOutput(value: unknown): ResearchOutput | undefined {\n if (!isRecord(value)) return undefined\n const items = coerceItems(value.items)\n const citations = coerceCitations(value.citations)\n const proposedWrites = coerceProposedWrites(value.proposedWrites)\n // Reject completely empty payloads — those signal \"no result block\",\n // not \"a valid empty result\".\n if (items === undefined && citations === undefined && proposedWrites === undefined) {\n return undefined\n }\n const output: ResearchOutput = {\n items: items ?? [],\n citations: citations ?? [],\n proposedWrites: proposedWrites ?? [],\n }\n if (Array.isArray(value.gaps)) {\n output.gaps = value.gaps.filter((entry): entry is string => typeof entry === 'string')\n }\n const notes = pickString(value.notes)\n if (notes) output.notes = notes\n // Preserve any extra fields the agent emitted that don't fit the typed\n // surface — callers can inspect `raw` without forcing them through the\n // typed coercion. We only include `raw` when the agent emitted fields\n // beyond the known set.\n const known = new Set(['items', 'citations', 'proposedWrites', 'gaps', 'notes'])\n const extras: Record<string, unknown> = {}\n let extrasCount = 0\n for (const [key, val] of Object.entries(value)) {\n if (known.has(key)) continue\n extras[key] = val\n extrasCount += 1\n }\n if (extrasCount > 0) output.raw = extras\n return output\n}\n\nfunction coerceItems(value: unknown): KnowledgeItem[] | undefined {\n if (!Array.isArray(value)) return undefined\n const out: KnowledgeItem[] = []\n for (const entry of value) {\n if (!isRecord(entry)) continue\n const id = pickString(entry.id)\n const namespace = pickString(entry.namespace)\n const claim = pickString(entry.claim)\n const evidence = coerceEvidence(entry.evidence)\n const confidence = toFiniteNumber(entry.confidence)\n const authoredBy = coerceAuthoredBy(entry.authoredBy)\n if (!id || !namespace || !claim || !authoredBy) continue\n const item: KnowledgeItem = {\n id,\n namespace,\n claim,\n evidence,\n confidence: clamp01(confidence),\n authoredBy,\n }\n if (Array.isArray(entry.supersedes)) {\n item.supersedes = entry.supersedes.filter((s): s is string => typeof s === 'string')\n }\n const retractedAt = toFiniteNumber(entry.retractedAt)\n if (retractedAt > 0) item.retractedAt = retractedAt\n out.push(item)\n }\n return out\n}\n\nfunction coerceEvidence(value: unknown): KnowledgeItem['evidence'] {\n if (!Array.isArray(value)) return []\n const out: KnowledgeItem['evidence'] = []\n for (const entry of value) {\n if (!isRecord(entry)) continue\n const source = pickString(entry.source)\n if (!source) continue\n const item: KnowledgeItem['evidence'][number] = {\n source,\n capturedAt: toFiniteNumber(entry.capturedAt),\n }\n const quote = pickString(entry.quote)\n if (quote) item.quote = quote\n const url = pickString(entry.url)\n if (url) item.url = url\n out.push(item)\n }\n return out\n}\n\nfunction coerceAuthoredBy(value: unknown): KnowledgeItem['authoredBy'] | undefined {\n if (!isRecord(value)) return undefined\n const kind = value.kind === 'human' || value.kind === 'agent' ? value.kind : undefined\n const id = pickString(value.id)\n if (!kind || !id) return undefined\n return { kind, id }\n}\n\nfunction coerceCitations(value: unknown): ResearchOutput['citations'] | undefined {\n if (!Array.isArray(value)) return undefined\n const out: ResearchOutput['citations'] = []\n for (const entry of value) {\n if (!isRecord(entry)) continue\n const url = pickString(entry.url)\n const quote = pickString(entry.quote)\n if (!url || !quote) continue\n out.push({ url, quote, confidence: clamp01(toFiniteNumber(entry.confidence)) })\n }\n return out\n}\n\nfunction coerceProposedWrites(value: unknown): KnowledgeUpdate[] | undefined {\n if (!Array.isArray(value)) return undefined\n const out: KnowledgeUpdate[] = []\n for (const entry of value) {\n if (!isRecord(entry)) continue\n const namespace = pickString(entry.namespace)\n if (!namespace) continue\n if (entry.kind === 'insert') {\n const items = coerceItems([entry.item])\n const item = items?.[0]\n if (!item) continue\n out.push({ kind: 'insert', namespace, item })\n } else if (entry.kind === 'supersede') {\n const previousId = pickString(entry.previousId)\n const items = coerceItems([entry.item])\n const item = items?.[0]\n if (!previousId || !item) continue\n out.push({ kind: 'supersede', namespace, previousId, item })\n } else if (entry.kind === 'retract') {\n const itemId = pickString(entry.itemId)\n const reason = pickString(entry.reason)\n if (!itemId || !reason) continue\n out.push({ kind: 'retract', namespace, itemId, reason })\n }\n }\n return out\n}\n\nfunction toFiniteNumber(value: unknown): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : 0\n}\n\nfunction clamp01(value: number): number {\n if (!Number.isFinite(value)) return 0\n if (value < 0) return 0\n if (value > 1) return 1\n return value\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/memory/source-record.ts","../src/memory/adapter.ts","../src/memory/neo4j.ts","../src/memory/schemas.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","import { 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 return {\n query,\n hits,\n sourceRecords: hits.map((hit) => memoryHitToSourceRecord(hit, { scope: options.scope })),\n text: renderMemoryContext(hits),\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 { memoryHitToSourceRecord, memoryWriteResultToSourceRecord } from './source-record'\nimport type {\n AgentMemoryAdapter,\n AgentMemoryHit,\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 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 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\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 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/adapters.ts","../src/search.ts","../src/frontmatter.ts","../src/wikilinks.ts","../src/graph.ts","../src/store.ts","../src/sources.ts","../src/indexer.ts","../src/lint.ts","../src/metadata.ts","../src/inspect.ts","../src/write-protocol.ts","../src/proposals.ts","../src/schemas.ts","../src/validate.ts"],"sourcesContent":["import type { SourceRecord } from './types'\n\nexport interface SourceAdapterInput {\n uri: string\n bytes?: Uint8Array\n text?: string\n metadata?: Record<string, unknown>\n}\n\nexport interface SourceAdapterOutput {\n title?: string\n mediaType?: string\n text?: string\n anchors?: SourceRecord['anchors']\n metadata?: Record<string, unknown>\n}\n\nexport interface SourceAdapter {\n id: string\n canLoad(input: SourceAdapterInput): boolean\n load(input: SourceAdapterInput): Promise<SourceAdapterOutput> | SourceAdapterOutput\n}\n\nexport const textSourceAdapter: SourceAdapter = {\n id: 'text',\n canLoad: (input) => Boolean(input.text) || /\\.(md|txt|json|csv)$/i.test(input.uri),\n load: (input) => ({\n title: input.uri.split('/').pop(),\n mediaType: mediaTypeFor(input.uri),\n text: decodeText(input),\n anchors: anchorsForText(input.uri, decodeText(input)),\n metadata: input.metadata,\n }),\n}\n\nexport function mediaTypeFor(uri: string): string {\n const lower = uri.toLowerCase()\n if (lower.endsWith('.md')) return 'text/markdown'\n if (lower.endsWith('.txt')) return 'text/plain'\n if (lower.endsWith('.json')) return 'application/json'\n if (lower.endsWith('.csv')) return 'text/csv'\n if (lower.endsWith('.pdf')) return 'application/pdf'\n return 'application/octet-stream'\n}\n\nfunction decodeText(input: SourceAdapterInput): string | undefined {\n return (\n input.text ??\n (input.bytes ? new TextDecoder().decode(input.bytes).slice(0, 200_000) : undefined)\n )\n}\n\nfunction anchorsForText(uri: string, text: string | undefined): SourceAdapterOutput['anchors'] {\n if (!text) return []\n const lines = text.split('\\n')\n const anchors: NonNullable<SourceAdapterOutput['anchors']> = [\n { id: 'all', sourceId: '', label: 'Full source', lineStart: 1, lineEnd: lines.length },\n ]\n for (let i = 0; i < lines.length; i += 50) {\n anchors.push({\n id: `l${i + 1}`,\n sourceId: '',\n label: `${uri}:${i + 1}`,\n lineStart: i + 1,\n lineEnd: Math.min(lines.length, i + 50),\n })\n }\n return anchors\n}\n","import type { KnowledgeIndex, KnowledgePage, KnowledgeSearchResult } from './types'\n\nconst RRF_K = 60\nconst STOP_WORDS = new Set([\n 'the',\n 'is',\n 'a',\n 'an',\n 'what',\n 'how',\n 'are',\n 'was',\n 'were',\n 'to',\n 'for',\n 'of',\n 'with',\n 'by',\n 'in',\n 'on',\n 'and',\n])\n\nexport function searchKnowledge(\n index: KnowledgeIndex,\n query: string,\n limit = 10,\n): KnowledgeSearchResult[] {\n const trimmed = query.trim()\n if (trimmed === '') return []\n const tokenRanked = rankByTokens(index.pages, trimmed)\n const graphRanked = rankByGraph(index.pages, tokenRanked)\n const scores = reciprocalRankFusion([tokenRanked.map((p) => p.id), graphRanked.map((p) => p.id)])\n const byId = new Map(index.pages.map((page) => [page.id, page]))\n\n const ranked = [...scores.entries()]\n .map(([id, score]) => ({ page: byId.get(id), score }))\n .filter((item): item is { page: KnowledgePage; score: number } => Boolean(item.page))\n .sort((a, b) => b.score - a.score || a.page.path.localeCompare(b.page.path))\n .slice(0, limit)\n\n // Normalize against the top hit so callers can compare against natural\n // [0, 1] thresholds. Raw RRF values are typically ~0.016, which reads as\n // \"no relevance\" to humans even when the result is the best available.\n // The top hit becomes 1 by definition; lower-ranked hits scale linearly.\n const topScore = ranked[0]?.score ?? 0\n\n return ranked.map((item, i) => ({\n page: item.page,\n score: item.score,\n rrfScore: item.score,\n normalizedScore: topScore > 0 ? item.score / topScore : 0,\n rank: i + 1,\n snippet: buildSnippet(item.page.text, trimmed),\n reasons: reasonsFor(item.page, trimmed),\n }))\n}\n\nexport function tokenizeQuery(query: string): string[] {\n const raw = query\n .toLowerCase()\n .split(/[\\s,,。!?、;:\"\"''()()\\-_/\\\\·~~…]+/)\n .filter((token) => token.length > 1 && !STOP_WORDS.has(token))\n const tokens: string[] = []\n for (const token of raw) {\n if (/[\\u4e00-\\u9fff\\u3400-\\u4dbf]/.test(token) && token.length > 2) {\n const chars = [...token]\n for (let i = 0; i < chars.length - 1; i++) tokens.push(chars[i]! + chars[i + 1]!)\n tokens.push(...chars)\n }\n tokens.push(token)\n }\n return [...new Set(tokens)]\n}\n\nexport function reciprocalRankFusion(rankLists: string[][], k = RRF_K): Map<string, number> {\n const scores = new Map<string, number>()\n for (const list of rankLists) {\n list.forEach((id, idx) => {\n scores.set(id, (scores.get(id) ?? 0) + 1 / (k + idx + 1))\n })\n }\n return scores\n}\n\nfunction rankByTokens(pages: KnowledgePage[], query: string): KnowledgePage[] {\n const tokens = tokenizeQuery(query)\n const effective = tokens.length > 0 ? tokens : [query.toLowerCase()]\n return pages\n .map((page) => ({ page, score: tokenScore(page, query, effective) }))\n .filter((item) => item.score > 0)\n .sort((a, b) => b.score - a.score || a.page.path.localeCompare(b.page.path))\n .map((item) => item.page)\n}\n\nfunction rankByGraph(pages: KnowledgePage[], tokenRanked: KnowledgePage[]): KnowledgePage[] {\n if (tokenRanked.length === 0) return []\n const seeds = new Set(tokenRanked.slice(0, 5).map((page) => page.id))\n return pages\n .map((page) => ({\n page,\n score:\n page.outLinks.filter((link) => seeds.has(link)).length +\n page.sourceIds.filter((source) =>\n tokenRanked.some((seed) => seed.sourceIds.includes(source)),\n ).length,\n }))\n .filter((item) => item.score > 0)\n .sort((a, b) => b.score - a.score || a.page.path.localeCompare(b.page.path))\n .map((item) => item.page)\n}\n\nfunction tokenScore(page: KnowledgePage, query: string, tokens: string[]): number {\n const title = page.title.toLowerCase()\n const path = page.path.toLowerCase()\n const body = page.text.toLowerCase()\n const phrase = query.toLowerCase()\n let score = 0\n if (path.endsWith(`${phrase}.md`) || title === phrase) score += 200\n if (title.includes(phrase)) score += 50\n if (body.includes(phrase)) score += 20\n for (const token of tokens) {\n if (title.includes(token)) score += 5\n if (body.includes(token)) score += 1\n if (path.includes(token)) score += 3\n }\n return score\n}\n\nfunction buildSnippet(text: string, query: string): string {\n const compact = text.replace(/\\s+/g, ' ').trim()\n const idx = compact.toLowerCase().indexOf(query.toLowerCase())\n if (idx < 0) return compact.slice(0, 180)\n return compact.slice(Math.max(0, idx - 80), Math.min(compact.length, idx + query.length + 100))\n}\n\nfunction reasonsFor(page: KnowledgePage, query: string): string[] {\n const lower = `${page.title}\\n${page.text}`.toLowerCase()\n const reasons: string[] = []\n if (lower.includes(query.toLowerCase())) reasons.push('phrase')\n if (page.sourceIds.length > 0) reasons.push('sourced')\n if (page.outLinks.length > 0) reasons.push('linked')\n return reasons\n}\n","export interface ParsedFrontmatter {\n frontmatter: Record<string, unknown>\n body: string\n}\n\nexport function parseFrontmatter(content: string): ParsedFrontmatter {\n const normalized = content.replace(/\\r\\n/g, '\\n')\n if (!normalized.startsWith('---\\n')) return { frontmatter: {}, body: normalized }\n const end = normalized.indexOf('\\n---', 4)\n if (end < 0) return { frontmatter: {}, body: normalized }\n const raw = normalized.slice(4, end)\n const after = normalized.slice(end).replace(/^\\n---\\s*\\n?/, '')\n return { frontmatter: parseSimpleYaml(raw), body: after }\n}\n\nexport function formatFrontmatter(frontmatter: Record<string, unknown>, body: string): string {\n const lines = Object.entries(frontmatter)\n .filter(([, value]) => value !== undefined)\n .flatMap(([key, value]) => formatYamlField(key, value))\n if (lines.length === 0) return body\n return `---\\n${lines.join('\\n')}\\n---\\n${body.replace(/^\\n+/, '')}`\n}\n\nfunction parseSimpleYaml(raw: string): Record<string, unknown> {\n const out: Record<string, unknown> = {}\n const lines = raw.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!\n const scalar = /^([A-Za-z0-9_-]+):\\s*(.*)$/.exec(line)\n if (!scalar) continue\n const key = scalar[1]!\n const rest = scalar[2]!.trim()\n if (rest === '') {\n const items: string[] = []\n while (i + 1 < lines.length) {\n const item = /^\\s*-\\s*(.+?)\\s*$/.exec(lines[i + 1]!)\n if (!item) break\n items.push(unquote(item[1]!))\n i++\n }\n out[key] = items\n continue\n }\n if (rest.startsWith('[') && rest.endsWith(']')) {\n out[key] = rest\n .slice(1, -1)\n .split(',')\n .map((part) => unquote(part.trim()))\n .filter(Boolean)\n } else if (rest === 'true' || rest === 'false') {\n out[key] = rest === 'true'\n } else if (/^-?\\d+(?:\\.\\d+)?$/.test(rest)) {\n out[key] = Number(rest)\n } else {\n out[key] = unquote(rest)\n }\n }\n return out\n}\n\nfunction formatYamlField(key: string, value: unknown): string[] {\n if (Array.isArray(value)) {\n return [`${key}:`, ...value.map((item) => ` - ${String(item)}`)]\n }\n if (typeof value === 'string') return [`${key}: ${value}`]\n if (typeof value === 'number' || typeof value === 'boolean') return [`${key}: ${String(value)}`]\n return [`${key}: ${JSON.stringify(value)}`]\n}\n\nfunction unquote(value: string): string {\n return value.replace(/^['\"]|['\"]$/g, '')\n}\n","export const WIKILINK_REGEX = /\\[\\[([^\\]|]+?)(?:\\|[^\\]]+?)?\\]\\]/g\n\nexport function extractWikilinks(content: string): string[] {\n const links: string[] = []\n const regex = new RegExp(WIKILINK_REGEX.source, 'g')\n let match: RegExpExecArray | null\n while ((match = regex.exec(content)) !== null) {\n links.push(match[1]!.trim())\n }\n return [...new Set(links)]\n}\n\nexport function normalizeLinkTarget(target: string): string {\n return target.trim().replace(/\\.md$/i, '').toLowerCase().replace(/\\s+/g, '-')\n}\n","import type { KnowledgeGraph, KnowledgeGraphEdge, KnowledgeGraphNode, KnowledgePage } from './types'\nimport { normalizeLinkTarget } from './wikilinks'\n\nexport function buildKnowledgeGraph(pages: KnowledgePage[]): KnowledgeGraph {\n const byId = new Map<string, KnowledgePage>()\n const bySlug = new Map<string, KnowledgePage>()\n for (const page of pages) {\n byId.set(page.id, page)\n bySlug.set(normalizeLinkTarget(page.id), page)\n bySlug.set(normalizeLinkTarget(page.title), page)\n bySlug.set(normalizeLinkTarget(page.path.split('/').pop()!.replace(/\\.md$/, '')), page)\n }\n\n const incoming = new Map<string, number>()\n const outgoing = new Map<string, number>()\n const edgesByKey = new Map<string, KnowledgeGraphEdge>()\n for (const page of pages) {\n outgoing.set(page.id, 0)\n incoming.set(page.id, 0)\n }\n\n for (const page of pages) {\n for (const raw of page.outLinks) {\n const target = bySlug.get(normalizeLinkTarget(raw))\n if (!target || target.id === page.id) continue\n const key = `${page.id}->${target.id}`\n const edge = edgesByKey.get(key)\n if (edge) edge.weight += 1\n else\n edgesByKey.set(key, {\n source: page.id,\n target: target.id,\n weight: 1,\n reasons: ['wikilink'],\n })\n outgoing.set(page.id, (outgoing.get(page.id) ?? 0) + 1)\n incoming.set(target.id, (incoming.get(target.id) ?? 0) + 1)\n }\n }\n\n addSourceOverlapEdges(pages, edgesByKey)\n\n const nodes: KnowledgeGraphNode[] = pages.map((page) => ({\n id: page.id,\n title: page.title,\n path: page.path,\n tags: page.tags,\n sourceIds: page.sourceIds,\n outDegree: outgoing.get(page.id) ?? 0,\n inDegree: incoming.get(page.id) ?? 0,\n }))\n return { nodes, edges: [...edgesByKey.values()].sort((a, b) => b.weight - a.weight) }\n}\n\nfunction addSourceOverlapEdges(\n pages: KnowledgePage[],\n edges: Map<string, KnowledgeGraphEdge>,\n): void {\n for (let i = 0; i < pages.length; i++) {\n for (let j = i + 1; j < pages.length; j++) {\n const a = pages[i]!\n const b = pages[j]!\n const overlap = a.sourceIds.filter((source) => b.sourceIds.includes(source))\n if (overlap.length === 0) continue\n const key = `${a.id}->${b.id}`\n const edge = edges.get(key)\n if (edge) {\n edge.weight += overlap.length * 0.5\n edge.reasons.push('shared-source')\n } else {\n edges.set(key, {\n source: a.id,\n target: b.id,\n weight: overlap.length * 0.5,\n reasons: ['shared-source'],\n })\n }\n }\n }\n}\n","import { mkdir, readdir, readFile, stat, writeFile } from 'node:fs/promises'\nimport { dirname, join, relative } from 'node:path'\nimport { parseFrontmatter } from './frontmatter'\nimport { slugify } from './ids'\nimport type { KnowledgePage } from './types'\nimport { extractWikilinks, normalizeLinkTarget } from './wikilinks'\n\nexport interface KnowledgeLayout {\n root: string\n knowledgeDir: string\n rawSourcesDir: string\n sourceRegistryPath: string\n indexPath: string\n logPath: string\n cacheDir: string\n}\n\nexport function layoutFor(root: string): KnowledgeLayout {\n return {\n root,\n knowledgeDir: join(root, 'knowledge'),\n rawSourcesDir: join(root, 'raw', 'sources'),\n sourceRegistryPath: join(root, '.agent-knowledge', 'sources.json'),\n indexPath: join(root, 'knowledge', 'index.md'),\n logPath: join(root, 'knowledge', 'log.md'),\n cacheDir: join(root, '.agent-knowledge'),\n }\n}\n\n/**\n * Filenames that `initKnowledgeBase` writes as human-navigation scaffolding.\n * These are excluded from the page index — they exist on disk so authors can\n * curate their vault, but they are not searchable content.\n *\n * Add new scaffold filenames here (and only here) to keep lint, validate, viz,\n * and the indexer consistent.\n */\nexport const SCAFFOLD_PAGE_BASENAMES: readonly string[] = ['index.md', 'log.md']\n\n/**\n * True when a knowledge-relative path points at a scaffold file rather than\n * authored content. Accepts both repo-relative paths (`knowledge/index.md`)\n * and any nested `<dir>/index.md` or `<dir>/log.md` (for example\n * `knowledge/concepts/index.md`) so subdirectory README-style scaffolds are\n * also excluded.\n */\nexport function isScaffoldPath(path: string): boolean {\n const normalized = path.replace(/\\\\/g, '/')\n for (const basename of SCAFFOLD_PAGE_BASENAMES) {\n if (normalized === `knowledge/${basename}`) return true\n if (normalized.endsWith(`/${basename}`)) return true\n }\n return false\n}\n\nexport async function initKnowledgeBase(root: string): Promise<KnowledgeLayout> {\n const layout = layoutFor(root)\n await mkdir(layout.knowledgeDir, { recursive: true })\n await mkdir(layout.rawSourcesDir, { recursive: true })\n await mkdir(layout.cacheDir, { recursive: true })\n await writeIfMissing(layout.indexPath, '# Knowledge Index\\n\\n')\n await writeIfMissing(layout.logPath, '# Knowledge Log\\n\\n')\n await writeIfMissing(\n layout.sourceRegistryPath,\n '{\\n \"generatedAt\": \"1970-01-01T00:00:00.000Z\",\\n \"sources\": []\\n}\\n',\n )\n return layout\n}\n\nexport async function loadKnowledgePages(root: string): Promise<KnowledgePage[]> {\n const layout = layoutFor(root)\n const files = await listMarkdownFiles(layout.knowledgeDir)\n const pages: KnowledgePage[] = []\n for (const file of files) {\n const rel = relative(root, file).replace(/\\\\/g, '/')\n if (isScaffoldPath(rel)) continue\n const content = await readFile(file, 'utf8')\n const { frontmatter, body } = parseFrontmatter(content)\n const title =\n stringField(frontmatter.title) ??\n firstHeading(body) ??\n rel.split('/').pop()!.replace(/\\.md$/, '')\n const sourceIds = arrayField(frontmatter.sources)\n const tags = arrayField(frontmatter.tags)\n pages.push({\n id:\n stringField(frontmatter.id) ??\n slugify(rel.replace(/^knowledge\\//, '').replace(/\\.md$/, '')),\n path: rel,\n title,\n text: body,\n frontmatter,\n sourceIds,\n tags,\n outLinks: extractWikilinks(body).map(normalizeLinkTarget),\n })\n }\n pages.sort((a, b) => a.path.localeCompare(b.path))\n return pages\n}\n\nexport async function writeJson(path: string, value: unknown): Promise<void> {\n await mkdir(dirname(path), { recursive: true })\n await writeFile(path, `${JSON.stringify(value, null, 2)}\\n`, 'utf8')\n}\n\nasync function writeIfMissing(path: string, content: string): Promise<void> {\n try {\n await stat(path)\n } catch {\n await mkdir(dirname(path), { recursive: true })\n await writeFile(path, content, 'utf8')\n }\n}\n\nasync function listMarkdownFiles(root: string): Promise<string[]> {\n try {\n const entries = await readdir(root, { withFileTypes: true })\n const out: string[] = []\n for (const entry of entries) {\n const full = join(root, entry.name)\n if (entry.isDirectory()) out.push(...(await listMarkdownFiles(full)))\n else if (entry.isFile() && entry.name.endsWith('.md')) out.push(full)\n }\n return out\n } catch {\n return []\n }\n}\n\nfunction stringField(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() !== '' ? value.trim() : undefined\n}\n\nfunction arrayField(value: unknown): string[] {\n return Array.isArray(value)\n ? value.filter((item): item is string => typeof item === 'string')\n : []\n}\n\nfunction firstHeading(body: string): string | undefined {\n return /^#\\s+(.+)$/m.exec(body)?.[1]?.trim()\n}\n","import { copyFile, mkdir, readdir, readFile, stat, writeFile } from 'node:fs/promises'\nimport { basename, dirname, join, relative } from 'node:path'\nimport { type SourceAdapter, textSourceAdapter } from './adapters'\nimport { sha256, slugify, stableId } from './ids'\nimport { layoutFor } from './store'\nimport type { SourceRecord, SourceRegistry } from './types'\n\nexport interface AddSourceOptions {\n copyIntoRaw?: boolean\n adapters?: SourceAdapter[]\n now?: () => Date\n}\n\nexport interface AddSourceTextInput {\n uri: string\n text: string\n title?: string\n mediaType?: string\n validUntil?: string\n lastVerifiedAt?: string\n metadata?: Record<string, unknown>\n}\n\nexport async function loadSourceRegistry(root: string): Promise<SourceRegistry> {\n const path = sourceRegistryPath(root)\n try {\n const parsed = JSON.parse(await readFile(path, 'utf8')) as SourceRegistry\n return {\n generatedAt:\n typeof parsed.generatedAt === 'string' ? parsed.generatedAt : new Date(0).toISOString(),\n sources: Array.isArray(parsed.sources) ? parsed.sources : [],\n }\n } catch {\n return { generatedAt: new Date(0).toISOString(), sources: [] }\n }\n}\n\nexport async function writeSourceRegistry(root: string, registry: SourceRegistry): Promise<void> {\n const path = sourceRegistryPath(root)\n await mkdir(dirname(path), { recursive: true })\n await writeFile(path, `${JSON.stringify(registry, null, 2)}\\n`, 'utf8')\n}\n\nexport async function addSourcePath(\n root: string,\n sourcePath: string,\n options: AddSourceOptions = {},\n): Promise<SourceRecord[]> {\n const s = await stat(sourcePath)\n if (s.isDirectory()) {\n const out: SourceRecord[] = []\n for (const file of await listFiles(sourcePath)) {\n out.push(...(await addSourcePath(root, file, options)))\n }\n return out\n }\n\n const layout = layoutFor(root)\n await mkdir(layout.rawSourcesDir, { recursive: true })\n const bytes = await readFile(sourcePath)\n const contentHash = sha256(bytes.toString('base64'))\n const fileName = basename(sourcePath)\n const adapters = options.adapters ?? [textSourceAdapter]\n const adapter = adapters.find((candidate) => candidate.canLoad({ uri: sourcePath, bytes }))\n const loaded = adapter ? await adapter.load({ uri: sourcePath, bytes }) : {}\n const id = stableId('src', `${contentHash}:${fileName}`)\n const targetRel = join(\n 'raw',\n 'sources',\n `${slugify(fileName.replace(/\\.[^.]+$/, ''))}-${contentHash.slice(0, 8)}${ext(fileName)}`,\n ).replace(/\\\\/g, '/')\n const targetAbs = join(root, targetRel)\n\n if (options.copyIntoRaw ?? true) {\n await mkdir(dirname(targetAbs), { recursive: true })\n await copyFile(sourcePath, targetAbs)\n }\n\n const existing = await loadSourceRegistry(root)\n const record: SourceRecord = {\n id,\n uri: targetRel,\n title: loaded.title ?? fileName,\n mediaType: loaded.mediaType ?? mediaTypeFor(fileName),\n contentHash,\n text: loaded.text ?? textPreview(fileName, bytes),\n anchors: (loaded.anchors ?? []).map((anchor) => ({ ...anchor, sourceId: id })),\n createdAt: (options.now ?? (() => new Date()))().toISOString(),\n metadata: {\n ...(loaded.metadata ?? {}),\n originalPath: sourcePath,\n sizeBytes: bytes.length,\n projectRelativePath: relative(root, sourcePath).replace(/\\\\/g, '/'),\n },\n }\n const next: SourceRegistry = {\n generatedAt: new Date().toISOString(),\n sources: [record, ...existing.sources.filter((source) => source.id !== id)],\n }\n await writeSourceRegistry(root, next)\n return [record]\n}\n\nexport async function addSourceText(\n root: string,\n input: AddSourceTextInput,\n options: Pick<AddSourceOptions, 'adapters' | 'now'> = {},\n): Promise<SourceRecord> {\n const text = input.text\n const contentHash = sha256(text)\n const fileName = basename(input.uri) || `${slugify(input.title ?? input.uri)}.txt`\n const adapterInput = { uri: input.uri, text, metadata: input.metadata }\n const adapter = (options.adapters ?? [textSourceAdapter]).find((candidate) =>\n candidate.canLoad(adapterInput),\n )\n const loaded = adapter ? await adapter.load(adapterInput) : {}\n const id = stableId('src', `${contentHash}:${input.uri}`)\n const targetRel = join(\n 'raw',\n 'sources',\n `${slugify(fileName.replace(/\\.[^.]+$/, ''))}-${contentHash.slice(0, 8)}.txt`,\n ).replace(/\\\\/g, '/')\n const targetAbs = join(root, targetRel)\n await mkdir(dirname(targetAbs), { recursive: true })\n await writeFile(targetAbs, text.endsWith('\\n') ? text : `${text}\\n`, 'utf8')\n\n const existing = await loadSourceRegistry(root)\n const record: SourceRecord = {\n id,\n uri: targetRel,\n title: input.title ?? loaded.title ?? fileName,\n mediaType: input.mediaType ?? loaded.mediaType ?? 'text/plain',\n contentHash,\n text: loaded.text ?? text.slice(0, 200_000),\n anchors: (loaded.anchors ?? []).map((anchor) => ({ ...anchor, sourceId: id })),\n validUntil: input.validUntil,\n lastVerifiedAt: input.lastVerifiedAt,\n createdAt: (options.now ?? (() => new Date()))().toISOString(),\n metadata: {\n ...(loaded.metadata ?? {}),\n ...(input.metadata ?? {}),\n originalUri: input.uri,\n sizeBytes: Buffer.byteLength(text, 'utf8'),\n },\n }\n await writeSourceRegistry(root, {\n generatedAt: new Date().toISOString(),\n sources: [record, ...existing.sources.filter((source) => source.id !== id)],\n })\n return record\n}\n\nexport function sourceRegistryPath(root: string): string {\n return join(layoutFor(root).cacheDir, 'sources.json')\n}\n\nasync function listFiles(root: string): Promise<string[]> {\n const entries = await readdir(root, { withFileTypes: true })\n const out: string[] = []\n for (const entry of entries) {\n const full = join(root, entry.name)\n if (entry.isDirectory()) out.push(...(await listFiles(full)))\n else if (entry.isFile()) out.push(full)\n }\n return out\n}\n\nfunction ext(fileName: string): string {\n const idx = fileName.lastIndexOf('.')\n return idx >= 0 ? fileName.slice(idx) : ''\n}\n\nfunction mediaTypeFor(fileName: string): string {\n const lower = fileName.toLowerCase()\n if (lower.endsWith('.md')) return 'text/markdown'\n if (lower.endsWith('.txt')) return 'text/plain'\n if (lower.endsWith('.json')) return 'application/json'\n if (lower.endsWith('.csv')) return 'text/csv'\n if (lower.endsWith('.pdf')) return 'application/pdf'\n return 'application/octet-stream'\n}\n\nfunction textPreview(fileName: string, bytes: Buffer): string | undefined {\n const mediaType = mediaTypeFor(fileName)\n if (!mediaType.startsWith('text/') && mediaType !== 'application/json') return undefined\n return bytes.toString('utf8').slice(0, 200_000)\n}\n","import { join } from 'node:path'\nimport { buildKnowledgeGraph } from './graph'\nimport { loadSourceRegistry } from './sources'\nimport { layoutFor, loadKnowledgePages, writeJson } from './store'\nimport type { KnowledgeIndex } from './types'\n\nexport async function buildKnowledgeIndex(root: string): Promise<KnowledgeIndex> {\n const [pages, sourceRegistry] = await Promise.all([\n loadKnowledgePages(root),\n loadSourceRegistry(root),\n ])\n const index: KnowledgeIndex = {\n root,\n generatedAt: new Date().toISOString(),\n sources: sourceRegistry.sources,\n pages,\n graph: buildKnowledgeGraph(pages),\n }\n return index\n}\n\nexport async function writeKnowledgeIndex(root: string): Promise<KnowledgeIndex> {\n const index = await buildKnowledgeIndex(root)\n await writeJson(join(layoutFor(root).cacheDir, 'index.json'), index)\n return index\n}\n","import { isScaffoldPath } from './store'\nimport type { KnowledgeIndex, KnowledgeLintFinding } from './types'\nimport { normalizeLinkTarget } from './wikilinks'\n\nexport function lintKnowledgeIndex(index: KnowledgeIndex): KnowledgeLintFinding[] {\n const findings: KnowledgeLintFinding[] = []\n const byTarget = new Set<string>()\n const titles = new Map<string, string[]>()\n const sourceIds = new Set(index.sources.map((source) => source.id))\n const anchorIds = new Map(\n index.sources.map((source) => [\n source.id,\n new Set((source.anchors ?? []).map((anchor) => anchor.id)),\n ]),\n )\n const pageIds = new Map<string, string[]>()\n const sourceHashes = new Map<string, string[]>()\n for (const page of index.pages) {\n pageIds.set(page.id, [...(pageIds.get(page.id) ?? []), page.path])\n byTarget.add(normalizeLinkTarget(page.id))\n byTarget.add(normalizeLinkTarget(page.title))\n byTarget.add(normalizeLinkTarget(page.path.split('/').pop()!.replace(/\\.md$/, '')))\n const titleKey = page.title.toLowerCase()\n titles.set(titleKey, [...(titles.get(titleKey) ?? []), page.path])\n }\n for (const source of index.sources) {\n sourceHashes.set(source.contentHash, [\n ...(sourceHashes.get(source.contentHash) ?? []),\n source.id,\n ])\n }\n\n const inbound = new Map<string, number>()\n for (const page of index.pages) inbound.set(page.id, 0)\n for (const page of index.pages) {\n if (page.outLinks.length === 0 && !isScaffoldPath(page.path)) {\n findings.push({\n type: 'no-outlinks',\n severity: 'info',\n page: page.path,\n message: 'Page has no wikilinks to other knowledge pages.',\n })\n }\n for (const link of page.outLinks) {\n if (!byTarget.has(normalizeLinkTarget(link))) {\n findings.push({\n type: 'broken-link',\n severity: 'warning',\n page: page.path,\n message: `Broken wikilink [[${link}]].`,\n })\n }\n }\n }\n\n for (const edge of index.graph.edges)\n inbound.set(edge.target, (inbound.get(edge.target) ?? 0) + 1)\n for (const page of index.pages) {\n if (!isScaffoldPath(page.path) && (inbound.get(page.id) ?? 0) === 0) {\n findings.push({\n type: 'orphan',\n severity: 'info',\n page: page.path,\n message: 'No other page links to this page.',\n })\n }\n if (/\\bclaim\\b/i.test(page.text) && page.sourceIds.length === 0) {\n findings.push({\n type: 'uncited-claim',\n severity: 'warning',\n page: page.path,\n message: 'Page appears to contain claims but has no sources frontmatter.',\n })\n }\n for (const sourceId of page.sourceIds) {\n if (!sourceIds.has(sourceId)) {\n findings.push({\n type: 'missing-source',\n severity: 'error',\n page: page.path,\n message: `Page cites unknown source \"${sourceId}\".`,\n metadata: { sourceId },\n })\n }\n }\n for (const ref of extractSourceRefs(page.text)) {\n if (!sourceIds.has(ref.sourceId)) {\n findings.push({\n type: 'missing-source',\n severity: 'error',\n page: page.path,\n message: `Page cites unknown source \"${ref.sourceId}\".`,\n metadata: ref,\n })\n } else if (ref.anchorId && !anchorIds.get(ref.sourceId)?.has(ref.anchorId)) {\n findings.push({\n type: 'missing-source',\n severity: 'error',\n page: page.path,\n message: `Page cites unknown source anchor \"${ref.sourceId}#${ref.anchorId}\".`,\n metadata: ref,\n })\n }\n }\n }\n\n for (const [title, paths] of titles) {\n if (title && paths.length > 1) {\n findings.push({\n type: 'duplicate-title',\n severity: 'warning',\n message: `Duplicate title \"${title}\" in ${paths.join(', ')}.`,\n metadata: { paths },\n })\n }\n }\n for (const [id, paths] of pageIds) {\n if (id && paths.length > 1) {\n findings.push({\n type: 'duplicate-page-id',\n severity: 'error',\n message: `Duplicate page id \"${id}\" in ${paths.join(', ')}.`,\n metadata: { paths },\n })\n }\n }\n for (const [hash, ids] of sourceHashes) {\n if (hash && ids.length > 1) {\n findings.push({\n type: 'duplicate-source-hash',\n severity: 'warning',\n message: `Duplicate source content hash across ${ids.join(', ')}.`,\n metadata: { sourceIds: ids },\n })\n }\n }\n return findings\n}\n\nfunction extractSourceRefs(text: string): Array<{ sourceId: string; anchorId?: string }> {\n const refs: Array<{ sourceId: string; anchorId?: string }> = []\n const regex = /\\[\\^([A-Za-z0-9_-]+)(?:#([A-Za-z0-9_.:-]+))?\\]/g\n let match: RegExpExecArray | null\n while ((match = regex.exec(text)) !== null) {\n refs.push({ sourceId: match[1]!, anchorId: match[2] })\n }\n return refs\n}\n","/**\n * Read a string value from an optional metadata bag, returning `undefined`\n * when the key is absent or holds a non-string value. Shared by the readiness\n * and inspection paths so the \"string field of an untyped record\" coercion is\n * single-sourced.\n *\n * Internal — not re-exported through the package barrel.\n */\nexport function stringMetadata(\n metadata: Record<string, unknown> | undefined,\n key: string,\n): string | undefined {\n const value = metadata?.[key]\n return typeof value === 'string' ? value : undefined\n}\n","import { lintKnowledgeIndex } from './lint'\nimport { stringMetadata } from './metadata'\nimport { searchKnowledge } from './search'\nimport type { KnowledgeIndex, KnowledgeLintFinding, KnowledgePage } from './types'\n\nexport interface KnowledgeInspection {\n pageCount: number\n sourceCount: number\n expiredSourceCount: number\n staleSourceCount: number\n edgeCount: number\n findingCount: number\n blockingFindingCount: number\n topPages: Array<{ path: string; title: string; degree: number; sources: number }>\n sourceFreshness: SourceFreshnessInspection[]\n findings: KnowledgeLintFinding[]\n}\n\nexport interface SourceFreshnessInspection {\n id: string\n title?: string\n uri: string\n status: 'fresh' | 'expired' | 'unknown'\n validUntil?: string\n lastVerifiedAt?: string\n}\n\nexport function inspectKnowledgeIndex(\n index: KnowledgeIndex,\n options: { now?: Date } = {},\n): KnowledgeInspection {\n const now = options.now ?? new Date()\n const findings = lintKnowledgeIndex(index)\n const degree = new Map(index.graph.nodes.map((node) => [node.id, node.inDegree + node.outDegree]))\n const sourceFreshness = index.sources.map((source) => inspectSourceFreshness(source, now))\n return {\n pageCount: index.pages.length,\n sourceCount: index.sources.length,\n expiredSourceCount: sourceFreshness.filter((source) => source.status === 'expired').length,\n staleSourceCount: sourceFreshness.filter((source) => source.status !== 'fresh').length,\n edgeCount: index.graph.edges.length,\n findingCount: findings.length,\n blockingFindingCount: findings.filter((finding) => finding.severity === 'error').length,\n topPages: [...index.pages]\n .sort((a, b) => (degree.get(b.id) ?? 0) - (degree.get(a.id) ?? 0))\n .slice(0, 10)\n .map((page) => ({\n path: page.path,\n title: page.title,\n degree: degree.get(page.id) ?? 0,\n sources: page.sourceIds.length,\n })),\n sourceFreshness,\n findings,\n }\n}\n\nfunction inspectSourceFreshness(\n source: KnowledgeIndex['sources'][number],\n now: Date,\n): SourceFreshnessInspection {\n const validUntil =\n source.validUntil ??\n stringMetadata(source.metadata, 'validUntil') ??\n stringMetadata(source.metadata, 'expiresAt')\n const lastVerifiedAt = source.lastVerifiedAt ?? stringMetadata(source.metadata, 'lastVerifiedAt')\n const status =\n validUntil && Number.isFinite(Date.parse(validUntil))\n ? Date.parse(validUntil) <= now.getTime()\n ? 'expired'\n : 'fresh'\n : 'unknown'\n return { id: source.id, title: source.title, uri: source.uri, status, validUntil, lastVerifiedAt }\n}\n\nexport interface KnowledgeExplanation {\n target: string\n page?: KnowledgePage\n sources: Array<{ id: string; title?: string; uri: string }>\n links: string[]\n inbound: string[]\n related: Array<{ path: string; title: string; score: number }>\n}\n\nexport function explainKnowledgeTarget(\n index: KnowledgeIndex,\n target: string,\n): KnowledgeExplanation {\n const page = index.pages.find(\n (candidate) =>\n candidate.path === target ||\n candidate.id === target ||\n candidate.title.toLowerCase() === target.toLowerCase(),\n )\n const inbound = page\n ? index.graph.edges\n .filter((edge) => edge.target === page.id)\n .map(\n (edge) =>\n index.pages.find((candidate) => candidate.id === edge.source)?.path ?? edge.source,\n )\n : []\n const related = page\n ? searchKnowledge(index, `${page.title} ${page.tags.join(' ')}`, 6)\n .filter((result) => result.page.id !== page.id)\n .map((result) => ({\n path: result.page.path,\n title: result.page.title,\n score: result.score,\n }))\n : searchKnowledge(index, target, 6).map((result) => ({\n path: result.page.path,\n title: result.page.title,\n score: result.score,\n }))\n return {\n target,\n page,\n sources: page\n ? index.sources\n .filter((source) => page.sourceIds.includes(source.id))\n .map((source) => ({ id: source.id, title: source.title, uri: source.uri }))\n : [],\n links: page?.outLinks ?? [],\n inbound,\n related,\n }\n}\n","import type { KnowledgeWriteParseResult } from './types'\n\nconst OPENER_LINE = /^---\\s*FILE:\\s*(.+?)\\s*---\\s*$/i\nconst CLOSER_LINE = /^---\\s*END\\s+FILE\\s*---\\s*$/i\nconst FENCE_LINE = /^\\s{0,3}(```+|~~~+)/\n\nexport function isSafeKnowledgePath(path: string, allowedPrefixes = ['knowledge/']): boolean {\n if (typeof path !== 'string' || path.trim() === '') return false\n // Path-safety validation must reject any control character that could be used\n // in path-traversal / encoding attacks. Built via String.fromCharCode rather\n // than inline `\\xNN` escapes to keep biome's regex-control-char rule happy.\n const controlRangeRegex = new RegExp(`[${String.fromCharCode(0)}-${String.fromCharCode(0x1f)}]`)\n if (controlRangeRegex.test(path)) return false\n if (path.startsWith('/') || path.startsWith('\\\\')) return false\n if (/^[a-zA-Z]:/.test(path)) return false\n const normalized = path.replace(/\\\\/g, '/')\n if (normalized.split('/').some((part) => part === '..')) return false\n return allowedPrefixes.some((prefix) => normalized.startsWith(prefix))\n}\n\nexport function parseKnowledgeWriteBlocks(\n text: string,\n allowedPrefixes = ['knowledge/'],\n): KnowledgeWriteParseResult {\n const lines = text.replace(/\\r\\n/g, '\\n').split('\\n')\n const blocks: KnowledgeWriteParseResult['blocks'] = []\n const warnings: string[] = []\n let i = 0\n\n while (i < lines.length) {\n const opener = OPENER_LINE.exec(lines[i]!)\n if (!opener) {\n i++\n continue\n }\n const path = opener[1]!.trim()\n i++\n const contentLines: string[] = []\n let fenceMarker: string | null = null\n let fenceLen = 0\n let closed = false\n\n while (i < lines.length) {\n const line = lines[i]!\n const fence = FENCE_LINE.exec(line)\n if (fence) {\n const run = fence[1]!\n const char = run[0]!\n if (fenceMarker === null) {\n fenceMarker = char\n fenceLen = run.length\n } else if (char === fenceMarker && run.length >= fenceLen) {\n fenceMarker = null\n fenceLen = 0\n }\n contentLines.push(line)\n i++\n continue\n }\n if (fenceMarker === null && CLOSER_LINE.test(line)) {\n closed = true\n i++\n break\n }\n contentLines.push(line)\n i++\n }\n\n if (!closed) {\n warnings.push(`FILE block \"${path || '(empty)'}\" was not closed before end of stream.`)\n continue\n }\n if (!isSafeKnowledgePath(path, allowedPrefixes)) {\n warnings.push(`FILE block with unsafe path \"${path}\" rejected.`)\n continue\n }\n blocks.push({ path, content: contentLines.join('\\n') })\n }\n\n return { blocks, warnings }\n}\n","import { mkdir, readFile, writeFile } from 'node:fs/promises'\nimport { dirname, join } from 'node:path'\nimport { parseKnowledgeWriteBlocks } from './write-protocol'\n\nexport interface ApplyWriteBlocksResult {\n written: string[]\n warnings: string[]\n}\n\nexport async function applyKnowledgeWriteBlocks(\n root: string,\n proposalText: string,\n): Promise<ApplyWriteBlocksResult> {\n const parsed = parseKnowledgeWriteBlocks(proposalText)\n const written: string[] = []\n for (const block of parsed.blocks) {\n const path = join(root, block.path)\n await mkdir(dirname(path), { recursive: true })\n await writeFile(\n path,\n block.content.endsWith('\\n') ? block.content : `${block.content}\\n`,\n 'utf8',\n )\n written.push(block.path)\n }\n return { written, warnings: parsed.warnings }\n}\n\nexport async function applyKnowledgeWriteBlocksFile(\n root: string,\n proposalPath: string,\n): Promise<ApplyWriteBlocksResult> {\n return applyKnowledgeWriteBlocks(root, await readFile(proposalPath, 'utf8'))\n}\n","import { z } from 'zod'\n\nexport const SourceAnchorSchema = z.object({\n id: z.string().min(1),\n sourceId: z.string().min(1),\n label: z.string().optional(),\n page: z.number().int().positive().optional(),\n lineStart: z.number().int().positive().optional(),\n lineEnd: z.number().int().positive().optional(),\n charStart: z.number().int().nonnegative().optional(),\n charEnd: z.number().int().nonnegative().optional(),\n timestampMs: z.number().nonnegative().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n})\n\nexport const SourceRecordSchema = z.object({\n id: z.string().min(1),\n uri: z.string().min(1),\n title: z.string().optional(),\n mediaType: z.string().optional(),\n contentHash: z.string().min(16),\n text: z.string().optional(),\n anchors: z.array(SourceAnchorSchema).optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n createdAt: z.string().min(1),\n})\n\nexport const KnowledgePageSchema = z.object({\n id: z.string().min(1),\n path: z.string().min(1),\n title: z.string().min(1),\n text: z.string(),\n frontmatter: z.record(z.string(), z.unknown()),\n sourceIds: z.array(z.string()),\n tags: z.array(z.string()),\n outLinks: z.array(z.string()),\n})\n\nexport const KnowledgeGraphNodeSchema = z.object({\n id: z.string(),\n title: z.string(),\n path: z.string(),\n tags: z.array(z.string()),\n sourceIds: z.array(z.string()),\n outDegree: z.number().int().nonnegative(),\n inDegree: z.number().int().nonnegative(),\n})\n\nexport const KnowledgeGraphEdgeSchema = z.object({\n source: z.string(),\n target: z.string(),\n weight: z.number(),\n reasons: z.array(z.string()),\n})\n\nexport const KnowledgeIndexSchema = z.object({\n root: z.string(),\n generatedAt: z.string(),\n sources: z.array(SourceRecordSchema),\n pages: z.array(KnowledgePageSchema),\n graph: z.object({\n nodes: z.array(KnowledgeGraphNodeSchema),\n edges: z.array(KnowledgeGraphEdgeSchema),\n }),\n})\n\nexport const KnowledgeEventSchema = z.object({\n id: z.string().min(1),\n type: z.enum([\n 'source.added',\n 'proposal.applied',\n 'index.built',\n 'lint.run',\n 'optimization.run',\n 'release.promoted',\n 'release.rejected',\n ]),\n createdAt: z.string().min(1),\n actor: z.string().optional(),\n target: z.string().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n})\n\nexport const KnowledgeBaseCandidateSchema = z.object({\n id: z.string().min(1),\n units: z.array(\n z.object({\n id: z.string().min(1),\n title: z.string().min(1),\n text: z.string(),\n claims: z\n .array(\n z.object({\n id: z.string().min(1),\n text: z.string().min(1),\n refs: z.array(\n z.object({\n sourceId: z.string().min(1),\n anchorId: z.string().optional(),\n quote: z.string().optional(),\n }),\n ),\n confidence: z.number().min(0).max(1).optional(),\n status: z.enum(['draft', 'active', 'superseded', 'rejected']).optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n }),\n )\n .optional(),\n relations: z\n .array(\n z.object({\n sourceId: z.string(),\n targetId: z.string(),\n predicate: z.string(),\n weight: z.number().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n }),\n )\n .optional(),\n sourceIds: z.array(z.string()).optional(),\n tags: z.array(z.string()).optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n updatedAt: z.string().optional(),\n }),\n ),\n retrievalPolicy: z.string().optional(),\n synthesisPolicy: z.string().optional(),\n questionPolicy: z.string().optional(),\n updatePolicy: z.string().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n})\n","import { lintKnowledgeIndex } from './lint'\nimport { KnowledgeIndexSchema } from './schemas'\nimport { isScaffoldPath } from './store'\nimport type { KnowledgeIndex, KnowledgeLintFinding } from './types'\n\nexport interface ValidateKnowledgeOptions {\n strict?: boolean\n}\n\nexport interface ValidateKnowledgeResult {\n ok: boolean\n findings: KnowledgeLintFinding[]\n}\n\nexport function validateKnowledgeIndex(\n index: KnowledgeIndex,\n options: ValidateKnowledgeOptions = {},\n): ValidateKnowledgeResult {\n const findings = [...lintKnowledgeIndex(index)]\n const parsed = KnowledgeIndexSchema.safeParse(index)\n if (!parsed.success) {\n findings.push({\n type: 'missing-frontmatter',\n severity: 'error',\n message: parsed.error.issues\n .map((issue) => `${issue.path.join('.')}: ${issue.message}`)\n .join('; '),\n })\n }\n if (options.strict) {\n for (const page of index.pages) {\n if (isScaffoldPath(page.path)) continue\n if (!page.frontmatter.id || !page.frontmatter.title) {\n findings.push({\n type: 'missing-frontmatter',\n severity: 'error',\n page: page.path,\n message: 'Strict mode requires id and title frontmatter.',\n })\n }\n }\n }\n return { ok: !findings.some((finding) => finding.severity === 'error'), findings }\n}\n"],"mappings":"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","names":["basename","mkdir","readdir","readFile","stat","writeFile","dirname","join","relative","readFile","mkdir","dirname","writeFile","stat","join","mediaTypeFor","relative","readdir","join","join","mkdir","readFile","writeFile","dirname","join","join","mkdir","dirname","writeFile","readFile"]}
|
package/dist/profiles/index.d.ts
DELETED
|
@@ -1,194 +0,0 @@
|
|
|
1
|
-
import { Validator, AgentRunSpec, OutputAdapter, Driver, AgentProfile } from '@tangle-network/agent-runtime/loops';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @experimental
|
|
5
|
-
*
|
|
6
|
-
* `researcherProfile` — opinionated preset for source-grounded research
|
|
7
|
-
* tasks. The agent is told to:
|
|
8
|
-
* - bound its work to a single `knowledgeNamespace`
|
|
9
|
-
* - emit `items[]` carrying provenance + confidence
|
|
10
|
-
* - emit `citations[]` linking quotes back to source urls
|
|
11
|
-
* - emit `proposedWrites[]` — never call materialize itself
|
|
12
|
-
* - describe `gaps` it could not answer
|
|
13
|
-
*
|
|
14
|
-
* The profile is stateless and agent-agnostic. `harness` selects the
|
|
15
|
-
* sandbox-SDK backend. For heterogeneous fanout, use
|
|
16
|
-
* `multiHarnessResearcherFanout`.
|
|
17
|
-
*
|
|
18
|
-
* Propose-don't-apply: the profile NEVER writes to the knowledge base.
|
|
19
|
-
* It produces `proposedWrites: KnowledgeUpdate[]` in the output. The
|
|
20
|
-
* caller (gtm-agent, journey-eval, user) decides whether to feed those
|
|
21
|
-
* updates through `applyKnowledgeWriteBlocks` / a KbStore put.
|
|
22
|
-
*
|
|
23
|
-
* Namespace isolation: every `KnowledgeItem` + `KnowledgeUpdate` in the
|
|
24
|
-
* output carries `namespace`. The validator hard-fails when any item
|
|
25
|
-
* touches a namespace other than `task.knowledgeNamespace`.
|
|
26
|
-
*/
|
|
27
|
-
|
|
28
|
-
/** @experimental */
|
|
29
|
-
type ResearchSource = 'web' | 'corpus' | 'twitter' | 'github' | 'docs';
|
|
30
|
-
/** @experimental */
|
|
31
|
-
interface ResearchTask {
|
|
32
|
-
/** The research question to answer. */
|
|
33
|
-
question: string;
|
|
34
|
-
/** Bound: e.g. "audience for cpg-founder ICP". */
|
|
35
|
-
scope?: string;
|
|
36
|
-
/** Multi-tenant scope (customer-id, workspace-id). Validator enforces. */
|
|
37
|
-
knowledgeNamespace: string;
|
|
38
|
-
sources?: ResearchSource[];
|
|
39
|
-
recencyWindow?: {
|
|
40
|
-
since?: Date;
|
|
41
|
-
until?: Date;
|
|
42
|
-
};
|
|
43
|
-
maxItems?: number;
|
|
44
|
-
/** Per-item minimum confidence in [0, 1]. Validator scores recall vs this. */
|
|
45
|
-
minConfidence?: number;
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Knowledge item emitted by the researcher.
|
|
49
|
-
*
|
|
50
|
-
* Profile-local type. When agent-knowledge promotes `KnowledgeClaim` →
|
|
51
|
-
* top-level `KnowledgeItem` substrate-wide, these fields collapse 1:1.
|
|
52
|
-
*
|
|
53
|
-
* @experimental
|
|
54
|
-
*/
|
|
55
|
-
interface KnowledgeItem {
|
|
56
|
-
id: string;
|
|
57
|
-
/** Multi-tenant scope. MUST equal `task.knowledgeNamespace`. */
|
|
58
|
-
namespace: string;
|
|
59
|
-
/** The factual claim, in the researcher's words. */
|
|
60
|
-
claim: string;
|
|
61
|
-
/** Provenance — at least one entry required. */
|
|
62
|
-
evidence: Array<{
|
|
63
|
-
source: string;
|
|
64
|
-
quote?: string;
|
|
65
|
-
url?: string;
|
|
66
|
-
capturedAt: number;
|
|
67
|
-
}>;
|
|
68
|
-
/** Researcher's self-reported confidence in [0, 1]. */
|
|
69
|
-
confidence: number;
|
|
70
|
-
/** Prior item ids this supersedes (chain). */
|
|
71
|
-
supersedes?: string[];
|
|
72
|
-
/** Set if the agent is retracting an earlier item. Unix ms. */
|
|
73
|
-
retractedAt?: number;
|
|
74
|
-
authoredBy: {
|
|
75
|
-
kind: 'human' | 'agent';
|
|
76
|
-
id: string;
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* A proposed write to the knowledge base. The profile does NOT apply
|
|
81
|
-
* these — the caller decides.
|
|
82
|
-
*
|
|
83
|
-
* @experimental
|
|
84
|
-
*/
|
|
85
|
-
type KnowledgeUpdate = {
|
|
86
|
-
kind: 'insert';
|
|
87
|
-
namespace: string;
|
|
88
|
-
item: KnowledgeItem;
|
|
89
|
-
} | {
|
|
90
|
-
kind: 'supersede';
|
|
91
|
-
namespace: string;
|
|
92
|
-
previousId: string;
|
|
93
|
-
item: KnowledgeItem;
|
|
94
|
-
} | {
|
|
95
|
-
kind: 'retract';
|
|
96
|
-
namespace: string;
|
|
97
|
-
itemId: string;
|
|
98
|
-
reason: string;
|
|
99
|
-
};
|
|
100
|
-
/**
|
|
101
|
-
* Researcher output. Required fields are typed; optional fields preserve
|
|
102
|
-
* the agent's free-form intelligence (`notes`, `raw`). The validator
|
|
103
|
-
* enforces the typed minimum.
|
|
104
|
-
*
|
|
105
|
-
* @experimental
|
|
106
|
-
*/
|
|
107
|
-
interface ResearchOutput {
|
|
108
|
-
items: KnowledgeItem[];
|
|
109
|
-
citations: Array<{
|
|
110
|
-
url: string;
|
|
111
|
-
quote: string;
|
|
112
|
-
confidence: number;
|
|
113
|
-
}>;
|
|
114
|
-
proposedWrites: KnowledgeUpdate[];
|
|
115
|
-
gaps?: string[];
|
|
116
|
-
notes?: string;
|
|
117
|
-
/** Anything the agent emitted beyond the typed fields. */
|
|
118
|
-
raw?: unknown;
|
|
119
|
-
}
|
|
120
|
-
/** @experimental */
|
|
121
|
-
interface ResearcherProfileOptions {
|
|
122
|
-
/** Sandbox-SDK backend.type. Default `'opencode/zai-coding-plan/glm-5.1'`. */
|
|
123
|
-
harness?: string;
|
|
124
|
-
/** Default model id passed in `AgentProfile.model.default`. */
|
|
125
|
-
model?: string;
|
|
126
|
-
/** Custom system prompt replacement. Default = built-in researcher preset. */
|
|
127
|
-
systemPrompt?: string;
|
|
128
|
-
/** Stable name for `AgentRunSpec.name`. Default = `researcher-${harness}`. */
|
|
129
|
-
name?: string;
|
|
130
|
-
/**
|
|
131
|
-
* Default 0.7. Minimum (citations with quote) / items ratio for `valid=true`.
|
|
132
|
-
* Below this floor, citation_density scores < 1 and the item set is gated.
|
|
133
|
-
*/
|
|
134
|
-
citationDensityMin?: number;
|
|
135
|
-
}
|
|
136
|
-
/** @experimental */
|
|
137
|
-
declare function researcherProfile(options?: ResearcherProfileOptions & {
|
|
138
|
-
task?: ResearchTask;
|
|
139
|
-
}): {
|
|
140
|
-
profile: AgentProfile;
|
|
141
|
-
taskToPrompt: (task: ResearchTask) => string;
|
|
142
|
-
output: OutputAdapter<ResearchOutput>;
|
|
143
|
-
validator: Validator<ResearchOutput>;
|
|
144
|
-
agentRunSpec: AgentRunSpec<ResearchTask>;
|
|
145
|
-
};
|
|
146
|
-
/** @experimental */
|
|
147
|
-
interface MultiHarnessResearcherFanoutOptions {
|
|
148
|
-
/** Backend.type identifiers, one per parallel agent. */
|
|
149
|
-
harnesses?: string[];
|
|
150
|
-
/** Optional per-harness model override. Indexed parallel to `harnesses`. */
|
|
151
|
-
models?: (string | undefined)[];
|
|
152
|
-
/** Default citation density floor for the shared validator. */
|
|
153
|
-
citationDensityMin?: number;
|
|
154
|
-
/** Optional task — narrows the validator's namespace check. */
|
|
155
|
-
task?: ResearchTask;
|
|
156
|
-
}
|
|
157
|
-
/**
|
|
158
|
-
* Build a fanout topology over multiple harnesses. The kernel round-robins
|
|
159
|
-
* `agentRuns` across the N parallel iterations and the `FanoutVote` driver
|
|
160
|
-
* picks the highest-scoring valid output.
|
|
161
|
-
*
|
|
162
|
-
* @experimental
|
|
163
|
-
*/
|
|
164
|
-
declare function multiHarnessResearcherFanout(options?: MultiHarnessResearcherFanoutOptions): {
|
|
165
|
-
agentRuns: AgentRunSpec<ResearchTask>[];
|
|
166
|
-
output: OutputAdapter<ResearchOutput>;
|
|
167
|
-
validator: Validator<ResearchOutput>;
|
|
168
|
-
driver: Driver<ResearchTask, ResearchOutput, 'done'>;
|
|
169
|
-
};
|
|
170
|
-
/**
|
|
171
|
-
* Build a validator that closes over a specific `ResearchTask`'s constraints.
|
|
172
|
-
*
|
|
173
|
-
* Checks in order:
|
|
174
|
-
* 1. Items must be non-empty.
|
|
175
|
-
* 2. Every item carries `evidence.length >= 1`.
|
|
176
|
-
* 3. Every item + proposedWrite is scoped to `task.knowledgeNamespace`
|
|
177
|
-
* (hard-fail on any namespace mismatch — defence in depth for the
|
|
178
|
-
* multi-tenant invariant).
|
|
179
|
-
* 4. Citation density (citations with quote / items) >= floor.
|
|
180
|
-
*
|
|
181
|
-
* Aggregate score:
|
|
182
|
-
* 0.4 · citation_density
|
|
183
|
-
* + 0.2 · source_diversity (distinct sources / max(items, 1))
|
|
184
|
-
* + 0.2 · recency_match (mean fraction within `recencyWindow`)
|
|
185
|
-
* + 0.2 · (1 − gaps/maxGaps), maxGaps = max(items, 1)
|
|
186
|
-
*
|
|
187
|
-
* @experimental
|
|
188
|
-
*/
|
|
189
|
-
declare function createResearcherValidator(task: ResearchTask, config?: {
|
|
190
|
-
citationDensityMin?: number;
|
|
191
|
-
namespaceCheck?: boolean;
|
|
192
|
-
}): Validator<ResearchOutput>;
|
|
193
|
-
|
|
194
|
-
export { type KnowledgeItem, type KnowledgeUpdate, type MultiHarnessResearcherFanoutOptions, type ResearchOutput, type ResearchSource, type ResearchTask, type ResearcherProfileOptions, createResearcherValidator, multiHarnessResearcherFanout, researcherProfile };
|
package/dist/profiles/index.js
DELETED