[{"data":1,"prerenderedAt":2437},["ShallowReactive",2],{"content-vision\u002Fknowledge-graph":3,"surround-\u002Fvision\u002Fknowledge-graph":2430},{"id":4,"title":5,"body":6,"description":2422,"extension":2423,"meta":2424,"navigation":2425,"path":2426,"seo":2427,"stem":2428,"__hash__":2429},"content\u002F5.vision\u002F3.knowledge-graph.md","Knowledge Graph",{"type":7,"value":8,"toc":2393},"minimark",[9,14,18,31,36,39,44,47,149,152,192,196,199,273,276,280,289,299,303,306,567,571,574,599,603,606,610,613,718,721,725,728,830,834,837,916,920,923,927,930,1188,1192,1195,1377,1381,1388,1415,1418,1422,1425,1448,1452,1455,1459,1469,1502,1506,1604,1608,1612,2181,2185,2389],[10,11,13],"h1",{"id":12},"knowledge-graph-architecture","Knowledge Graph Architecture",[15,16,17],"p",{},"Every organization accumulates knowledge through communication: customer preferences, internal decisions, project context, relationship history. The Knowledge Graph captures this knowledge as typed, searchable, decaying entries — not a write-only log, but a living system that stays accurate as the organization evolves.",[19,20,23],"callout",{"title":21,"type":22},"Data isolation is non-negotiable","warning",[15,24,25,26,30],{},"Each organization's knowledge graph is completely isolated. Agent context windows never mix data from different organizations. Every query, every vector search, every knowledge retrieval is scoped by ",[27,28,29],"code",{},"organizationId",". This extends the same multi-tenancy model Owlat uses today.",[32,33,35],"h2",{"id":34},"storage-model","Storage model",[15,37,38],{},"The Knowledge Graph is built on Convex tables — not a separate graph database. Convex's native vector indexes enable semantic search, and indexed joins handle relationship traversal. This keeps the self-hosted stack simple: no Neo4j, no Pinecone, no additional services.",[40,41,43],"h3",{"id":42},"knowledge-entries","Knowledge entries",[15,45,46],{},"Every piece of organizational knowledge is a typed entry:",[48,49,50,66],"table",{},[51,52,53],"thead",{},[54,55,56,60,63],"tr",{},[57,58,59],"th",{},"Type",[57,61,62],{},"Description",[57,64,65],{},"Example",[67,68,69,84,97,110,123,136],"tbody",{},[54,70,71,78,81],{},[72,73,74],"td",{},[75,76,77],"strong",{},"Fact",[72,79,80],{},"Verifiable information about an entity",[72,82,83],{},"\"Acme Corp uses our Enterprise plan\"",[54,85,86,91,94],{},[72,87,88],{},[75,89,90],{},"Decision",[72,92,93],{},"A choice that was made with reasoning",[72,95,96],{},"\"Decided to extend Acme's trial by 2 weeks (approved by Sarah)\"",[54,98,99,104,107],{},[72,100,101],{},[75,102,103],{},"Event",[72,105,106],{},"Something that happened at a point in time",[72,108,109],{},"\"Met Acme's CTO at SaaStr conference on March 5\"",[54,111,112,117,120],{},[72,113,114],{},[75,115,116],{},"Preference",[72,118,119],{},"How someone likes things done",[72,121,122],{},"\"Acme prefers email over phone for support\"",[54,124,125,130,133],{},[72,126,127],{},[75,128,129],{},"Goal",[72,131,132],{},"An objective someone is working toward",[72,134,135],{},"\"Acme wants to launch their email program by September\"",[54,137,138,143,146],{},[72,139,140],{},[75,141,142],{},"Relationship",[72,144,145],{},"A connection between entities",[72,147,148],{},"\"Alice at Acme reports to Bob\"",[15,150,151],{},"Each entry has:",[153,154,155,162,168,174,180,186],"ul",{},[156,157,158,161],"li",{},[75,159,160],{},"Content"," — the knowledge itself (title + detailed content)",[156,163,164,167],{},[75,165,166],{},"Source attribution"," — where this knowledge came from (email, chat, manual entry, file, agent-extracted)",[156,169,170,173],{},[75,171,172],{},"Entity links"," — connections to contacts, conversation threads, and other entries",[156,175,176,179],{},[75,177,178],{},"Embedding"," — vector representation for semantic search",[156,181,182,185],{},[75,183,184],{},"Confidence score"," — how reliable this knowledge is (0–1)",[156,187,188,191],{},[75,189,190],{},"Expiration"," — optional TTL for time-sensitive facts",[40,193,195],{"id":194},"knowledge-relations","Knowledge relations",[15,197,198],{},"Entries connect to each other through typed edges:",[48,200,201,211],{},[51,202,203],{},[54,204,205,208],{},[57,206,207],{},"Relation",[57,209,210],{},"Meaning",[67,212,213,223,233,243,253,263],{},[54,214,215,220],{},[72,216,217],{},[27,218,219],{},"supports",[72,221,222],{},"One entry provides evidence for another",[54,224,225,230],{},[72,226,227],{},[27,228,229],{},"contradicts",[72,231,232],{},"One entry conflicts with another (triggers resolution)",[54,234,235,240],{},[72,236,237],{},[27,238,239],{},"supersedes",[72,241,242],{},"One entry replaces another (newer information)",[54,244,245,250],{},[72,246,247],{},[27,248,249],{},"relates_to",[72,251,252],{},"General association",[54,254,255,260],{},[72,256,257],{},[27,258,259],{},"causes",[72,261,262],{},"Causal relationship",[54,264,265,270],{},[72,266,267],{},[27,268,269],{},"blocks",[72,271,272],{},"One entry prevents another",[15,274,275],{},"Relations enable traversal: when the agent retrieves knowledge about a customer, it follows relations to find supporting context, flag contradictions, and surface the most recent information.",[32,277,279],{"id":278},"extraction-pipeline","Extraction pipeline",[15,281,282,283,288],{},"Knowledge extraction runs automatically after each inbound message is processed by the ",[284,285,287],"a",{"href":286},"\u002Fvision\u002Fagent-pipeline","Agent Pipeline",":",[290,291,296],"pre",{"className":292,"code":294,"language":295},[293],"language-text","Inbound message processed\n  → Knowledge extractor (Convex internalAction)\n    1. Entity extraction: people, organizations, dates, amounts\n    2. Fact extraction: structured output via AI SDK generateObject()\n    3. Deduplication: vector search for similar existing entries\n    4. Contradiction check: find entries that conflict with new knowledge\n    5. Store entries with embeddings and entity links\n    6. Create relations (supports, contradicts, supersedes)\n","text",[27,297,294],{"__ignoreMap":298},"",[40,300,302],{"id":301},"entity-extraction","Entity extraction",[15,304,305],{},"Uses AI SDK structured output to extract entities:",[290,307,311],{"className":308,"code":309,"language":310,"meta":298,"style":298},"language-typescript shiki shiki-themes github-light github-dark-dimmed","const entities = await generateObject({\n  model: getLLMProvider(),\n  schema: z.object({\n    people: z.array(z.object({\n      name: z.string(),\n      role: z.string().optional(),\n      email: z.string().optional(),\n    })),\n    organizations: z.array(z.string()),\n    dates: z.array(z.object({\n      date: z.string(),\n      context: z.string(),\n    })),\n    amounts: z.array(z.object({\n      value: z.number(),\n      currency: z.string(),\n      context: z.string(),\n    })),\n  }),\n  prompt: `Extract entities from this message...\\n\\n${messageContent}`,\n})\n","typescript",[27,312,313,340,352,363,379,390,406,420,426,441,455,465,475,480,494,505,515,524,529,535,561],{"__ignoreMap":298},[314,315,318,322,326,329,332,336],"span",{"class":316,"line":317},"line",1,[314,319,321],{"class":320},"s7YZ4","const",[314,323,325],{"class":324},"sviXB"," entities",[314,327,328],{"class":320}," =",[314,330,331],{"class":320}," await",[314,333,335],{"class":334},"sPO5f"," generateObject",[314,337,339],{"class":338},"sYgZi","({\n",[314,341,343,346,349],{"class":316,"line":342},2,[314,344,345],{"class":338},"  model: ",[314,347,348],{"class":334},"getLLMProvider",[314,350,351],{"class":338},"(),\n",[314,353,355,358,361],{"class":316,"line":354},3,[314,356,357],{"class":338},"  schema: z.",[314,359,360],{"class":334},"object",[314,362,339],{"class":338},[314,364,366,369,372,375,377],{"class":316,"line":365},4,[314,367,368],{"class":338},"    people: z.",[314,370,371],{"class":334},"array",[314,373,374],{"class":338},"(z.",[314,376,360],{"class":334},[314,378,339],{"class":338},[314,380,382,385,388],{"class":316,"line":381},5,[314,383,384],{"class":338},"      name: z.",[314,386,387],{"class":334},"string",[314,389,351],{"class":338},[314,391,393,396,398,401,404],{"class":316,"line":392},6,[314,394,395],{"class":338},"      role: z.",[314,397,387],{"class":334},[314,399,400],{"class":338},"().",[314,402,403],{"class":334},"optional",[314,405,351],{"class":338},[314,407,409,412,414,416,418],{"class":316,"line":408},7,[314,410,411],{"class":338},"      email: z.",[314,413,387],{"class":334},[314,415,400],{"class":338},[314,417,403],{"class":334},[314,419,351],{"class":338},[314,421,423],{"class":316,"line":422},8,[314,424,425],{"class":338},"    })),\n",[314,427,429,432,434,436,438],{"class":316,"line":428},9,[314,430,431],{"class":338},"    organizations: z.",[314,433,371],{"class":334},[314,435,374],{"class":338},[314,437,387],{"class":334},[314,439,440],{"class":338},"()),\n",[314,442,444,447,449,451,453],{"class":316,"line":443},10,[314,445,446],{"class":338},"    dates: z.",[314,448,371],{"class":334},[314,450,374],{"class":338},[314,452,360],{"class":334},[314,454,339],{"class":338},[314,456,458,461,463],{"class":316,"line":457},11,[314,459,460],{"class":338},"      date: z.",[314,462,387],{"class":334},[314,464,351],{"class":338},[314,466,468,471,473],{"class":316,"line":467},12,[314,469,470],{"class":338},"      context: z.",[314,472,387],{"class":334},[314,474,351],{"class":338},[314,476,478],{"class":316,"line":477},13,[314,479,425],{"class":338},[314,481,483,486,488,490,492],{"class":316,"line":482},14,[314,484,485],{"class":338},"    amounts: z.",[314,487,371],{"class":334},[314,489,374],{"class":338},[314,491,360],{"class":334},[314,493,339],{"class":338},[314,495,497,500,503],{"class":316,"line":496},15,[314,498,499],{"class":338},"      value: z.",[314,501,502],{"class":334},"number",[314,504,351],{"class":338},[314,506,508,511,513],{"class":316,"line":507},16,[314,509,510],{"class":338},"      currency: z.",[314,512,387],{"class":334},[314,514,351],{"class":338},[314,516,518,520,522],{"class":316,"line":517},17,[314,519,470],{"class":338},[314,521,387],{"class":334},[314,523,351],{"class":338},[314,525,527],{"class":316,"line":526},18,[314,528,425],{"class":338},[314,530,532],{"class":316,"line":531},19,[314,533,534],{"class":338},"  }),\n",[314,536,538,541,545,549,552,555,558],{"class":316,"line":537},20,[314,539,540],{"class":338},"  prompt: ",[314,542,544],{"class":543},"s-HuK","`Extract entities from this message...",[314,546,548],{"class":547},"s74oq","\\n\\n",[314,550,551],{"class":543},"${",[314,553,554],{"class":338},"messageContent",[314,556,557],{"class":543},"}`",[314,559,560],{"class":338},",\n",[314,562,564],{"class":316,"line":563},21,[314,565,566],{"class":338},"})\n",[40,568,570],{"id":569},"deduplication","Deduplication",[15,572,573],{},"Before storing a new entry, the pipeline runs a vector search against existing entries for the same organization. If a semantically similar entry exists (cosine similarity > 0.92), the pipeline either:",[153,575,576,582,591],{},[156,577,578,581],{},[75,579,580],{},"Merges"," — combines content, updates confidence, keeps the more recent timestamp",[156,583,584,587,588,590],{},[75,585,586],{},"Links"," — creates a ",[27,589,219],{}," relation if the entries are complementary",[156,592,593,587,596,598],{},[75,594,595],{},"Supersedes",[27,597,239],{}," relation if the new entry is a clear update",[32,600,602],{"id":601},"retrieval","Retrieval",[15,604,605],{},"The Knowledge Graph serves two retrieval patterns:",[40,607,609],{"id":608},"semantic-search-vector","Semantic search (vector)",[15,611,612],{},"Used by the Agent Pipeline's context retrieval step:",[290,614,616],{"className":308,"code":615,"language":310,"meta":298,"style":298},"\u002F\u002F Find knowledge relevant to an inbound message\nconst results = await ctx.vectorSearch('knowledgeEntries', 'vector_knowledge', {\n  vector: await generateEmbedding(messageContent),\n  limit: 20,\n  filter: (q) =>\n    q.eq('organizationId', orgId),\n})\n",[27,617,618,624,656,670,680,698,714],{"__ignoreMap":298},[314,619,620],{"class":316,"line":317},[314,621,623],{"class":622},"sDN9O","\u002F\u002F Find knowledge relevant to an inbound message\n",[314,625,626,628,631,633,635,638,641,644,647,650,653],{"class":316,"line":342},[314,627,321],{"class":320},[314,629,630],{"class":324}," results",[314,632,328],{"class":320},[314,634,331],{"class":320},[314,636,637],{"class":338}," ctx.",[314,639,640],{"class":334},"vectorSearch",[314,642,643],{"class":338},"(",[314,645,646],{"class":543},"'knowledgeEntries'",[314,648,649],{"class":338},", ",[314,651,652],{"class":543},"'vector_knowledge'",[314,654,655],{"class":338},", {\n",[314,657,658,661,664,667],{"class":316,"line":354},[314,659,660],{"class":338},"  vector: ",[314,662,663],{"class":320},"await",[314,665,666],{"class":334}," generateEmbedding",[314,668,669],{"class":338},"(messageContent),\n",[314,671,672,675,678],{"class":316,"line":365},[314,673,674],{"class":338},"  limit: ",[314,676,677],{"class":324},"20",[314,679,560],{"class":338},[314,681,682,685,688,692,695],{"class":316,"line":381},[314,683,684],{"class":334},"  filter",[314,686,687],{"class":338},": (",[314,689,691],{"class":690},"stnAF","q",[314,693,694],{"class":338},") ",[314,696,697],{"class":320},"=>\n",[314,699,700,703,706,708,711],{"class":316,"line":392},[314,701,702],{"class":338},"    q.",[314,704,705],{"class":334},"eq",[314,707,643],{"class":338},[314,709,710],{"class":543},"'organizationId'",[314,712,713],{"class":338},", orgId),\n",[314,715,716],{"class":316,"line":408},[314,717,566],{"class":338},[15,719,720],{},"Returns the most semantically relevant entries regardless of keyword matches. The agent uses these to build its context briefing.",[40,722,724],{"id":723},"full-text-search","Full-text search",[15,726,727],{},"Used by the UI for manual knowledge browsing:",[290,729,731],{"className":308,"code":730,"language":310,"meta":298,"style":298},"const results = await ctx.db\n  .query('knowledgeEntries')\n  .withSearchIndex('search_knowledge', (q) =>\n    q.search('searchableText', searchQuery)\n      .eq('organizationId', orgId)\n  )\n  .take(25)\n",[27,732,733,746,761,782,797,811,816],{"__ignoreMap":298},[314,734,735,737,739,741,743],{"class":316,"line":317},[314,736,321],{"class":320},[314,738,630],{"class":324},[314,740,328],{"class":320},[314,742,331],{"class":320},[314,744,745],{"class":338}," ctx.db\n",[314,747,748,751,754,756,758],{"class":316,"line":342},[314,749,750],{"class":338},"  .",[314,752,753],{"class":334},"query",[314,755,643],{"class":338},[314,757,646],{"class":543},[314,759,760],{"class":338},")\n",[314,762,763,765,768,770,773,776,778,780],{"class":316,"line":354},[314,764,750],{"class":338},[314,766,767],{"class":334},"withSearchIndex",[314,769,643],{"class":338},[314,771,772],{"class":543},"'search_knowledge'",[314,774,775],{"class":338},", (",[314,777,691],{"class":690},[314,779,694],{"class":338},[314,781,697],{"class":320},[314,783,784,786,789,791,794],{"class":316,"line":365},[314,785,702],{"class":338},[314,787,788],{"class":334},"search",[314,790,643],{"class":338},[314,792,793],{"class":543},"'searchableText'",[314,795,796],{"class":338},", searchQuery)\n",[314,798,799,802,804,806,808],{"class":316,"line":381},[314,800,801],{"class":338},"      .",[314,803,705],{"class":334},[314,805,643],{"class":338},[314,807,710],{"class":543},[314,809,810],{"class":338},", orgId)\n",[314,812,813],{"class":316,"line":392},[314,814,815],{"class":338},"  )\n",[314,817,818,820,823,825,828],{"class":316,"line":408},[314,819,750],{"class":338},[314,821,822],{"class":334},"take",[314,824,643],{"class":338},[314,826,827],{"class":324},"25",[314,829,760],{"class":338},[40,831,833],{"id":832},"contact-scoped-retrieval","Contact-scoped retrieval",[15,835,836],{},"When preparing context for a specific contact interaction:",[290,838,840],{"className":308,"code":839,"language":310,"meta":298,"style":298},"\u002F\u002F All knowledge linked to this contact\nconst contactKnowledge = await ctx.db\n  .query('knowledgeEntries')\n  .withIndex('by_contact', (q) => q.eq('contactIds', contactId))\n  .collect()\n",[27,841,842,847,860,872,906],{"__ignoreMap":298},[314,843,844],{"class":316,"line":317},[314,845,846],{"class":622},"\u002F\u002F All knowledge linked to this contact\n",[314,848,849,851,854,856,858],{"class":316,"line":342},[314,850,321],{"class":320},[314,852,853],{"class":324}," contactKnowledge",[314,855,328],{"class":320},[314,857,331],{"class":320},[314,859,745],{"class":338},[314,861,862,864,866,868,870],{"class":316,"line":354},[314,863,750],{"class":338},[314,865,753],{"class":334},[314,867,643],{"class":338},[314,869,646],{"class":543},[314,871,760],{"class":338},[314,873,874,876,879,881,884,886,888,890,893,896,898,900,903],{"class":316,"line":365},[314,875,750],{"class":338},[314,877,878],{"class":334},"withIndex",[314,880,643],{"class":338},[314,882,883],{"class":543},"'by_contact'",[314,885,775],{"class":338},[314,887,691],{"class":690},[314,889,694],{"class":338},[314,891,892],{"class":320},"=>",[314,894,895],{"class":338}," q.",[314,897,705],{"class":334},[314,899,643],{"class":338},[314,901,902],{"class":543},"'contactIds'",[314,904,905],{"class":338},", contactId))\n",[314,907,908,910,913],{"class":316,"line":381},[314,909,750],{"class":338},[314,911,912],{"class":334},"collect",[314,914,915],{"class":338},"()\n",[32,917,919],{"id":918},"memory-as-tools","Memory as tools",[15,921,922],{},"The extraction pipeline described above is passive — it runs after the agent pipeline processes a message. But agents also need to actively save and recall knowledge during pipeline execution. The Knowledge Graph exposes tool definitions that the agent can call during the action planning step (Step 3).",[40,924,926],{"id":925},"active-save","Active save",[15,928,929],{},"When the agent discovers something important during a conversation — a new fact, an updated preference, a commitment — it can persist it immediately:",[290,931,933],{"className":308,"code":932,"language":310,"meta":298,"style":298},"\u002F\u002F Tool definition available to the action planning step\nconst saveKnowledge = tool({\n  description: 'Save a piece of organizational knowledge discovered during this conversation',\n  parameters: z.object({\n    type: z.enum(['fact', 'decision', 'event', 'preference', 'goal', 'relationship', 'action_item']),\n    title: z.string(),\n    content: z.string(),\n    contactId: z.string().optional(),\n    confidence: z.number().min(0).max(1),\n    expiresInDays: z.number().optional(),\n  }),\n  execute: async ({ type, title, content, contactId, confidence, expiresInDays }) => {\n    \u002F\u002F Runs deduplication + contradiction check before storing\n    return await ctx.runMutation(internal.knowledgeGraph.saveEntry, {\n      organizationId, type, title, content, contactId, confidence, expiresInDays,\n    })\n  },\n})\n",[27,934,935,940,954,964,973,1020,1029,1038,1051,1082,1095,1099,1149,1154,1169,1174,1179,1184],{"__ignoreMap":298},[314,936,937],{"class":316,"line":317},[314,938,939],{"class":622},"\u002F\u002F Tool definition available to the action planning step\n",[314,941,942,944,947,949,952],{"class":316,"line":342},[314,943,321],{"class":320},[314,945,946],{"class":324}," saveKnowledge",[314,948,328],{"class":320},[314,950,951],{"class":334}," tool",[314,953,339],{"class":338},[314,955,956,959,962],{"class":316,"line":354},[314,957,958],{"class":338},"  description: ",[314,960,961],{"class":543},"'Save a piece of organizational knowledge discovered during this conversation'",[314,963,560],{"class":338},[314,965,966,969,971],{"class":316,"line":365},[314,967,968],{"class":338},"  parameters: z.",[314,970,360],{"class":334},[314,972,339],{"class":338},[314,974,975,978,981,984,987,989,992,994,997,999,1002,1004,1007,1009,1012,1014,1017],{"class":316,"line":381},[314,976,977],{"class":338},"    type: z.",[314,979,980],{"class":334},"enum",[314,982,983],{"class":338},"([",[314,985,986],{"class":543},"'fact'",[314,988,649],{"class":338},[314,990,991],{"class":543},"'decision'",[314,993,649],{"class":338},[314,995,996],{"class":543},"'event'",[314,998,649],{"class":338},[314,1000,1001],{"class":543},"'preference'",[314,1003,649],{"class":338},[314,1005,1006],{"class":543},"'goal'",[314,1008,649],{"class":338},[314,1010,1011],{"class":543},"'relationship'",[314,1013,649],{"class":338},[314,1015,1016],{"class":543},"'action_item'",[314,1018,1019],{"class":338},"]),\n",[314,1021,1022,1025,1027],{"class":316,"line":392},[314,1023,1024],{"class":338},"    title: z.",[314,1026,387],{"class":334},[314,1028,351],{"class":338},[314,1030,1031,1034,1036],{"class":316,"line":408},[314,1032,1033],{"class":338},"    content: z.",[314,1035,387],{"class":334},[314,1037,351],{"class":338},[314,1039,1040,1043,1045,1047,1049],{"class":316,"line":422},[314,1041,1042],{"class":338},"    contactId: z.",[314,1044,387],{"class":334},[314,1046,400],{"class":338},[314,1048,403],{"class":334},[314,1050,351],{"class":338},[314,1052,1053,1056,1058,1060,1063,1065,1068,1071,1074,1076,1079],{"class":316,"line":428},[314,1054,1055],{"class":338},"    confidence: z.",[314,1057,502],{"class":334},[314,1059,400],{"class":338},[314,1061,1062],{"class":334},"min",[314,1064,643],{"class":338},[314,1066,1067],{"class":324},"0",[314,1069,1070],{"class":338},").",[314,1072,1073],{"class":334},"max",[314,1075,643],{"class":338},[314,1077,1078],{"class":324},"1",[314,1080,1081],{"class":338},"),\n",[314,1083,1084,1087,1089,1091,1093],{"class":316,"line":443},[314,1085,1086],{"class":338},"    expiresInDays: z.",[314,1088,502],{"class":334},[314,1090,400],{"class":338},[314,1092,403],{"class":334},[314,1094,351],{"class":338},[314,1096,1097],{"class":316,"line":457},[314,1098,534],{"class":338},[314,1100,1101,1104,1107,1110,1113,1116,1118,1121,1123,1126,1128,1131,1133,1136,1138,1141,1144,1146],{"class":316,"line":467},[314,1102,1103],{"class":334},"  execute",[314,1105,1106],{"class":338},": ",[314,1108,1109],{"class":320},"async",[314,1111,1112],{"class":338}," ({ ",[314,1114,1115],{"class":690},"type",[314,1117,649],{"class":338},[314,1119,1120],{"class":690},"title",[314,1122,649],{"class":338},[314,1124,1125],{"class":690},"content",[314,1127,649],{"class":338},[314,1129,1130],{"class":690},"contactId",[314,1132,649],{"class":338},[314,1134,1135],{"class":690},"confidence",[314,1137,649],{"class":338},[314,1139,1140],{"class":690},"expiresInDays",[314,1142,1143],{"class":338}," }) ",[314,1145,892],{"class":320},[314,1147,1148],{"class":338}," {\n",[314,1150,1151],{"class":316,"line":477},[314,1152,1153],{"class":622},"    \u002F\u002F Runs deduplication + contradiction check before storing\n",[314,1155,1156,1159,1161,1163,1166],{"class":316,"line":482},[314,1157,1158],{"class":320},"    return",[314,1160,331],{"class":320},[314,1162,637],{"class":338},[314,1164,1165],{"class":334},"runMutation",[314,1167,1168],{"class":338},"(internal.knowledgeGraph.saveEntry, {\n",[314,1170,1171],{"class":316,"line":496},[314,1172,1173],{"class":338},"      organizationId, type, title, content, contactId, confidence, expiresInDays,\n",[314,1175,1176],{"class":316,"line":507},[314,1177,1178],{"class":338},"    })\n",[314,1180,1181],{"class":316,"line":517},[314,1182,1183],{"class":338},"  },\n",[314,1185,1186],{"class":316,"line":526},[314,1187,566],{"class":338},[40,1189,1191],{"id":1190},"active-recall","Active recall",[15,1193,1194],{},"During draft generation (Step 4), the agent can explicitly query the Knowledge Graph for relevant context beyond what was retrieved in Step 1:",[290,1196,1198],{"className":308,"code":1197,"language":310,"meta":298,"style":298},"const recallKnowledge = tool({\n  description: 'Search organizational knowledge for information relevant to the current task',\n  parameters: z.object({\n    query: z.string(),\n    contactId: z.string().optional(),\n    type: z.enum(['fact', 'decision', 'event', 'preference', 'goal', 'relationship', 'action_item']).optional(),\n    limit: z.number().default(5),\n  }),\n  execute: async ({ query, contactId, type, limit }) => {\n    return await ctx.runAction(internal.knowledgeGraph.semanticSearch, {\n      organizationId, query, contactId, type, limit,\n    })\n  },\n})\n",[27,1199,1200,1213,1222,1230,1239,1251,1292,1311,1315,1346,1360,1365,1369,1373],{"__ignoreMap":298},[314,1201,1202,1204,1207,1209,1211],{"class":316,"line":317},[314,1203,321],{"class":320},[314,1205,1206],{"class":324}," recallKnowledge",[314,1208,328],{"class":320},[314,1210,951],{"class":334},[314,1212,339],{"class":338},[314,1214,1215,1217,1220],{"class":316,"line":342},[314,1216,958],{"class":338},[314,1218,1219],{"class":543},"'Search organizational knowledge for information relevant to the current task'",[314,1221,560],{"class":338},[314,1223,1224,1226,1228],{"class":316,"line":354},[314,1225,968],{"class":338},[314,1227,360],{"class":334},[314,1229,339],{"class":338},[314,1231,1232,1235,1237],{"class":316,"line":365},[314,1233,1234],{"class":338},"    query: z.",[314,1236,387],{"class":334},[314,1238,351],{"class":338},[314,1240,1241,1243,1245,1247,1249],{"class":316,"line":381},[314,1242,1042],{"class":338},[314,1244,387],{"class":334},[314,1246,400],{"class":338},[314,1248,403],{"class":334},[314,1250,351],{"class":338},[314,1252,1253,1255,1257,1259,1261,1263,1265,1267,1269,1271,1273,1275,1277,1279,1281,1283,1285,1288,1290],{"class":316,"line":392},[314,1254,977],{"class":338},[314,1256,980],{"class":334},[314,1258,983],{"class":338},[314,1260,986],{"class":543},[314,1262,649],{"class":338},[314,1264,991],{"class":543},[314,1266,649],{"class":338},[314,1268,996],{"class":543},[314,1270,649],{"class":338},[314,1272,1001],{"class":543},[314,1274,649],{"class":338},[314,1276,1006],{"class":543},[314,1278,649],{"class":338},[314,1280,1011],{"class":543},[314,1282,649],{"class":338},[314,1284,1016],{"class":543},[314,1286,1287],{"class":338},"]).",[314,1289,403],{"class":334},[314,1291,351],{"class":338},[314,1293,1294,1297,1299,1301,1304,1306,1309],{"class":316,"line":408},[314,1295,1296],{"class":338},"    limit: z.",[314,1298,502],{"class":334},[314,1300,400],{"class":338},[314,1302,1303],{"class":334},"default",[314,1305,643],{"class":338},[314,1307,1308],{"class":324},"5",[314,1310,1081],{"class":338},[314,1312,1313],{"class":316,"line":422},[314,1314,534],{"class":338},[314,1316,1317,1319,1321,1323,1325,1327,1329,1331,1333,1335,1337,1340,1342,1344],{"class":316,"line":428},[314,1318,1103],{"class":334},[314,1320,1106],{"class":338},[314,1322,1109],{"class":320},[314,1324,1112],{"class":338},[314,1326,753],{"class":690},[314,1328,649],{"class":338},[314,1330,1130],{"class":690},[314,1332,649],{"class":338},[314,1334,1115],{"class":690},[314,1336,649],{"class":338},[314,1338,1339],{"class":690},"limit",[314,1341,1143],{"class":338},[314,1343,892],{"class":320},[314,1345,1148],{"class":338},[314,1347,1348,1350,1352,1354,1357],{"class":316,"line":443},[314,1349,1158],{"class":320},[314,1351,331],{"class":320},[314,1353,637],{"class":338},[314,1355,1356],{"class":334},"runAction",[314,1358,1359],{"class":338},"(internal.knowledgeGraph.semanticSearch, {\n",[314,1361,1362],{"class":316,"line":457},[314,1363,1364],{"class":338},"      organizationId, query, contactId, type, limit,\n",[314,1366,1367],{"class":316,"line":467},[314,1368,1178],{"class":338},[314,1370,1371],{"class":316,"line":477},[314,1372,1183],{"class":338},[314,1374,1375],{"class":316,"line":482},[314,1376,566],{"class":338},[40,1378,1380],{"id":1379},"action-items","Action items",[15,1382,1383,1384,1387],{},"A new knowledge type — ",[27,1385,1386],{},"action_item"," — captures commitments and tasks extracted from conversations:",[48,1389,1390,1400],{},[51,1391,1392],{},[54,1393,1394,1396,1398],{},[57,1395,59],{},[57,1397,62],{},[57,1399,65],{},[67,1401,1402],{},[54,1403,1404,1409,1412],{},[72,1405,1406],{},[75,1407,1408],{},"Action Item",[72,1410,1411],{},"A commitment or task identified in conversation",[72,1413,1414],{},"\"Send Acme the updated proposal by Friday\"",[15,1416,1417],{},"Action items have fast decay (like goals) and can trigger reminders when their deadline approaches. The agent extracts them during pipeline processing and also when a human explicitly mentions a commitment in conversation.",[40,1419,1421],{"id":1420},"scoped-isolation","Scoped isolation",[15,1423,1424],{},"Knowledge tool access is scoped to prevent cross-contamination:",[153,1426,1427,1436,1442],{},[156,1428,1429,1432,1433,1435],{},[75,1430,1431],{},"Organization boundary"," — tools can only read\u002Fwrite knowledge within the current organization (enforced by ",[27,1434,29],{}," filtering on every query)",[156,1437,1438,1441],{},[75,1439,1440],{},"Contact scope"," — when processing a message from Contact A, the agent can access organization-wide knowledge and Contact A's specific knowledge, but queries are weighted toward the relevant contact",[156,1443,1444,1447],{},[75,1445,1446],{},"Branch isolation"," — when the pipeline forks for multi-intent messages, each branch has an isolated view of newly saved knowledge until the branches merge. This prevents one branch's speculative saves from affecting another branch's reasoning",[32,1449,1451],{"id":1450},"decay-and-maintenance","Decay and maintenance",[15,1453,1454],{},"The Knowledge Graph is not append-only. Stale knowledge degrades over time:",[40,1456,1458],{"id":1457},"confidence-decay","Confidence decay",[15,1460,1461,1462,1464,1465,1468],{},"Every entry has a ",[27,1463,1135],{}," score (0–1) and a ",[27,1466,1467],{},"lastValidatedAt"," timestamp. A scheduled Convex cron job runs daily:",[1470,1471,1472,1478,1487,1496],"ol",{},[156,1473,1474,1477],{},[75,1475,1476],{},"Time decay"," — reduce confidence by a small factor for entries not validated recently",[156,1479,1480,1483,1484,1486],{},[75,1481,1482],{},"Contradiction resolution"," — when two entries have a ",[27,1485,229],{}," relation, flag the older one for review",[156,1488,1489,1491,1492,1495],{},[75,1490,190],{}," — delete entries past their ",[27,1493,1494],{},"expiresAt"," timestamp",[156,1497,1498,1501],{},[75,1499,1500],{},"Validation boost"," — when an agent retrieves and uses an entry successfully (the human approves the draft), boost the entry's confidence",[40,1503,1505],{"id":1504},"knowledge-types-decay-at-different-rates","Knowledge types decay at different rates",[48,1507,1508,1520],{},[51,1509,1510],{},[54,1511,1512,1514,1517],{},[57,1513,59],{},[57,1515,1516],{},"Decay rate",[57,1518,1519],{},"Rationale",[67,1521,1522,1534,1546,1558,1570,1582,1593],{},[54,1523,1524,1528,1531],{},[72,1525,1526],{},[75,1527,77],{},[72,1529,1530],{},"Slow",[72,1532,1533],{},"Facts like \"customer's plan\" change infrequently",[54,1535,1536,1540,1543],{},[72,1537,1538],{},[75,1539,90],{},[72,1541,1542],{},"Very slow",[72,1544,1545],{},"Decisions persist unless explicitly reversed",[54,1547,1548,1552,1555],{},[72,1549,1550],{},[75,1551,103],{},[72,1553,1554],{},"None (historical)",[72,1556,1557],{},"Events don't become less true over time",[54,1559,1560,1564,1567],{},[72,1561,1562],{},[75,1563,116],{},[72,1565,1566],{},"Medium",[72,1568,1569],{},"Preferences evolve as relationships develop",[54,1571,1572,1576,1579],{},[72,1573,1574],{},[75,1575,129],{},[72,1577,1578],{},"Fast",[72,1580,1581],{},"Goals have deadlines and shift frequently",[54,1583,1584,1588,1590],{},[72,1585,1586],{},[75,1587,142],{},[72,1589,1566],{},[72,1591,1592],{},"Org structures change",[54,1594,1595,1599,1601],{},[72,1596,1597],{},[75,1598,1408],{},[72,1600,1578],{},[72,1602,1603],{},"Commitments have deadlines and resolve quickly",[32,1605,1607],{"id":1606},"schema","Schema",[40,1609,1611],{"id":1610},"knowledgeentries","knowledgeEntries",[290,1613,1615],{"className":308,"code":1614,"language":310,"meta":298,"style":298},"knowledgeEntries: defineTable({\n  organizationId: v.string(),\n  entryType: v.union(\n    v.literal('fact'),\n    v.literal('decision'),\n    v.literal('event'),\n    v.literal('preference'),\n    v.literal('goal'),\n    v.literal('relationship'),\n    v.literal('action_item')\n  ),\n  title: v.string(),\n  content: v.string(),\n  sourceType: v.union(\n    v.literal('email'),\n    v.literal('chat'),\n    v.literal('manual'),\n    v.literal('file'),\n    v.literal('agent_extracted')\n  ),\n  sourceId: v.optional(v.string()),\n  contactIds: v.optional(v.array(v.id('contacts'))),\n  threadId: v.optional(v.id('conversationThreads')),\n  embedding: v.array(v.float64()),\n  confidence: v.number(),\n  lastValidatedAt: v.number(),\n  expiresAt: v.optional(v.number()),\n  tags: v.optional(v.array(v.string())),\n  searchableText: v.optional(v.string()),\n  createdAt: v.number(),\n  updatedAt: v.number(),\n})\n  .index('by_organization', ['organizationId'])\n  .index('by_organization_and_type', ['organizationId', 'entryType'])\n  .index('by_contact', ['contactIds'])\n  .index('by_thread', ['threadId'])\n  .searchIndex('search_knowledge', {\n    searchField: 'searchableText',\n    filterFields: ['organizationId', 'entryType'],\n  })\n  .vectorIndex('vector_knowledge', {\n    vectorField: 'embedding',\n    dimensions: 1536,\n    filterFields: ['organizationId', 'entryType'],\n  })\n",[27,1616,1617,1629,1638,1649,1663,1675,1687,1699,1711,1723,1735,1740,1749,1758,1767,1780,1793,1806,1819,1832,1836,1850,1875,1895,1910,1920,1930,1944,1963,1977,1987,1997,2002,2023,2046,2063,2082,2096,2106,2121,2127,2141,2152,2163,2176],{"__ignoreMap":298},[314,1618,1619,1622,1624,1627],{"class":316,"line":317},[314,1620,1611],{"class":1621},"sOLd2",[314,1623,1106],{"class":338},[314,1625,1626],{"class":334},"defineTable",[314,1628,339],{"class":338},[314,1630,1631,1634,1636],{"class":316,"line":342},[314,1632,1633],{"class":338},"  organizationId: v.",[314,1635,387],{"class":334},[314,1637,351],{"class":338},[314,1639,1640,1643,1646],{"class":316,"line":354},[314,1641,1642],{"class":338},"  entryType: v.",[314,1644,1645],{"class":334},"union",[314,1647,1648],{"class":338},"(\n",[314,1650,1651,1654,1657,1659,1661],{"class":316,"line":365},[314,1652,1653],{"class":338},"    v.",[314,1655,1656],{"class":334},"literal",[314,1658,643],{"class":338},[314,1660,986],{"class":543},[314,1662,1081],{"class":338},[314,1664,1665,1667,1669,1671,1673],{"class":316,"line":381},[314,1666,1653],{"class":338},[314,1668,1656],{"class":334},[314,1670,643],{"class":338},[314,1672,991],{"class":543},[314,1674,1081],{"class":338},[314,1676,1677,1679,1681,1683,1685],{"class":316,"line":392},[314,1678,1653],{"class":338},[314,1680,1656],{"class":334},[314,1682,643],{"class":338},[314,1684,996],{"class":543},[314,1686,1081],{"class":338},[314,1688,1689,1691,1693,1695,1697],{"class":316,"line":408},[314,1690,1653],{"class":338},[314,1692,1656],{"class":334},[314,1694,643],{"class":338},[314,1696,1001],{"class":543},[314,1698,1081],{"class":338},[314,1700,1701,1703,1705,1707,1709],{"class":316,"line":422},[314,1702,1653],{"class":338},[314,1704,1656],{"class":334},[314,1706,643],{"class":338},[314,1708,1006],{"class":543},[314,1710,1081],{"class":338},[314,1712,1713,1715,1717,1719,1721],{"class":316,"line":428},[314,1714,1653],{"class":338},[314,1716,1656],{"class":334},[314,1718,643],{"class":338},[314,1720,1011],{"class":543},[314,1722,1081],{"class":338},[314,1724,1725,1727,1729,1731,1733],{"class":316,"line":443},[314,1726,1653],{"class":338},[314,1728,1656],{"class":334},[314,1730,643],{"class":338},[314,1732,1016],{"class":543},[314,1734,760],{"class":338},[314,1736,1737],{"class":316,"line":457},[314,1738,1739],{"class":338},"  ),\n",[314,1741,1742,1745,1747],{"class":316,"line":467},[314,1743,1744],{"class":338},"  title: v.",[314,1746,387],{"class":334},[314,1748,351],{"class":338},[314,1750,1751,1754,1756],{"class":316,"line":477},[314,1752,1753],{"class":338},"  content: v.",[314,1755,387],{"class":334},[314,1757,351],{"class":338},[314,1759,1760,1763,1765],{"class":316,"line":482},[314,1761,1762],{"class":338},"  sourceType: v.",[314,1764,1645],{"class":334},[314,1766,1648],{"class":338},[314,1768,1769,1771,1773,1775,1778],{"class":316,"line":496},[314,1770,1653],{"class":338},[314,1772,1656],{"class":334},[314,1774,643],{"class":338},[314,1776,1777],{"class":543},"'email'",[314,1779,1081],{"class":338},[314,1781,1782,1784,1786,1788,1791],{"class":316,"line":507},[314,1783,1653],{"class":338},[314,1785,1656],{"class":334},[314,1787,643],{"class":338},[314,1789,1790],{"class":543},"'chat'",[314,1792,1081],{"class":338},[314,1794,1795,1797,1799,1801,1804],{"class":316,"line":517},[314,1796,1653],{"class":338},[314,1798,1656],{"class":334},[314,1800,643],{"class":338},[314,1802,1803],{"class":543},"'manual'",[314,1805,1081],{"class":338},[314,1807,1808,1810,1812,1814,1817],{"class":316,"line":526},[314,1809,1653],{"class":338},[314,1811,1656],{"class":334},[314,1813,643],{"class":338},[314,1815,1816],{"class":543},"'file'",[314,1818,1081],{"class":338},[314,1820,1821,1823,1825,1827,1830],{"class":316,"line":531},[314,1822,1653],{"class":338},[314,1824,1656],{"class":334},[314,1826,643],{"class":338},[314,1828,1829],{"class":543},"'agent_extracted'",[314,1831,760],{"class":338},[314,1833,1834],{"class":316,"line":537},[314,1835,1739],{"class":338},[314,1837,1838,1841,1843,1846,1848],{"class":316,"line":563},[314,1839,1840],{"class":338},"  sourceId: v.",[314,1842,403],{"class":334},[314,1844,1845],{"class":338},"(v.",[314,1847,387],{"class":334},[314,1849,440],{"class":338},[314,1851,1853,1856,1858,1860,1862,1864,1867,1869,1872],{"class":316,"line":1852},22,[314,1854,1855],{"class":338},"  contactIds: v.",[314,1857,403],{"class":334},[314,1859,1845],{"class":338},[314,1861,371],{"class":334},[314,1863,1845],{"class":338},[314,1865,1866],{"class":334},"id",[314,1868,643],{"class":338},[314,1870,1871],{"class":543},"'contacts'",[314,1873,1874],{"class":338},"))),\n",[314,1876,1878,1881,1883,1885,1887,1889,1892],{"class":316,"line":1877},23,[314,1879,1880],{"class":338},"  threadId: v.",[314,1882,403],{"class":334},[314,1884,1845],{"class":338},[314,1886,1866],{"class":334},[314,1888,643],{"class":338},[314,1890,1891],{"class":543},"'conversationThreads'",[314,1893,1894],{"class":338},")),\n",[314,1896,1898,1901,1903,1905,1908],{"class":316,"line":1897},24,[314,1899,1900],{"class":338},"  embedding: v.",[314,1902,371],{"class":334},[314,1904,1845],{"class":338},[314,1906,1907],{"class":334},"float64",[314,1909,440],{"class":338},[314,1911,1913,1916,1918],{"class":316,"line":1912},25,[314,1914,1915],{"class":338},"  confidence: v.",[314,1917,502],{"class":334},[314,1919,351],{"class":338},[314,1921,1923,1926,1928],{"class":316,"line":1922},26,[314,1924,1925],{"class":338},"  lastValidatedAt: v.",[314,1927,502],{"class":334},[314,1929,351],{"class":338},[314,1931,1933,1936,1938,1940,1942],{"class":316,"line":1932},27,[314,1934,1935],{"class":338},"  expiresAt: v.",[314,1937,403],{"class":334},[314,1939,1845],{"class":338},[314,1941,502],{"class":334},[314,1943,440],{"class":338},[314,1945,1947,1950,1952,1954,1956,1958,1960],{"class":316,"line":1946},28,[314,1948,1949],{"class":338},"  tags: v.",[314,1951,403],{"class":334},[314,1953,1845],{"class":338},[314,1955,371],{"class":334},[314,1957,1845],{"class":338},[314,1959,387],{"class":334},[314,1961,1962],{"class":338},"())),\n",[314,1964,1966,1969,1971,1973,1975],{"class":316,"line":1965},29,[314,1967,1968],{"class":338},"  searchableText: v.",[314,1970,403],{"class":334},[314,1972,1845],{"class":338},[314,1974,387],{"class":334},[314,1976,440],{"class":338},[314,1978,1980,1983,1985],{"class":316,"line":1979},30,[314,1981,1982],{"class":338},"  createdAt: v.",[314,1984,502],{"class":334},[314,1986,351],{"class":338},[314,1988,1990,1993,1995],{"class":316,"line":1989},31,[314,1991,1992],{"class":338},"  updatedAt: v.",[314,1994,502],{"class":334},[314,1996,351],{"class":338},[314,1998,2000],{"class":316,"line":1999},32,[314,2001,566],{"class":338},[314,2003,2005,2007,2010,2012,2015,2018,2020],{"class":316,"line":2004},33,[314,2006,750],{"class":338},[314,2008,2009],{"class":334},"index",[314,2011,643],{"class":338},[314,2013,2014],{"class":543},"'by_organization'",[314,2016,2017],{"class":338},", [",[314,2019,710],{"class":543},[314,2021,2022],{"class":338},"])\n",[314,2024,2026,2028,2030,2032,2035,2037,2039,2041,2044],{"class":316,"line":2025},34,[314,2027,750],{"class":338},[314,2029,2009],{"class":334},[314,2031,643],{"class":338},[314,2033,2034],{"class":543},"'by_organization_and_type'",[314,2036,2017],{"class":338},[314,2038,710],{"class":543},[314,2040,649],{"class":338},[314,2042,2043],{"class":543},"'entryType'",[314,2045,2022],{"class":338},[314,2047,2049,2051,2053,2055,2057,2059,2061],{"class":316,"line":2048},35,[314,2050,750],{"class":338},[314,2052,2009],{"class":334},[314,2054,643],{"class":338},[314,2056,883],{"class":543},[314,2058,2017],{"class":338},[314,2060,902],{"class":543},[314,2062,2022],{"class":338},[314,2064,2066,2068,2070,2072,2075,2077,2080],{"class":316,"line":2065},36,[314,2067,750],{"class":338},[314,2069,2009],{"class":334},[314,2071,643],{"class":338},[314,2073,2074],{"class":543},"'by_thread'",[314,2076,2017],{"class":338},[314,2078,2079],{"class":543},"'threadId'",[314,2081,2022],{"class":338},[314,2083,2085,2087,2090,2092,2094],{"class":316,"line":2084},37,[314,2086,750],{"class":338},[314,2088,2089],{"class":334},"searchIndex",[314,2091,643],{"class":338},[314,2093,772],{"class":543},[314,2095,655],{"class":338},[314,2097,2099,2102,2104],{"class":316,"line":2098},38,[314,2100,2101],{"class":338},"    searchField: ",[314,2103,793],{"class":543},[314,2105,560],{"class":338},[314,2107,2109,2112,2114,2116,2118],{"class":316,"line":2108},39,[314,2110,2111],{"class":338},"    filterFields: [",[314,2113,710],{"class":543},[314,2115,649],{"class":338},[314,2117,2043],{"class":543},[314,2119,2120],{"class":338},"],\n",[314,2122,2124],{"class":316,"line":2123},40,[314,2125,2126],{"class":338},"  })\n",[314,2128,2130,2132,2135,2137,2139],{"class":316,"line":2129},41,[314,2131,750],{"class":338},[314,2133,2134],{"class":334},"vectorIndex",[314,2136,643],{"class":338},[314,2138,652],{"class":543},[314,2140,655],{"class":338},[314,2142,2144,2147,2150],{"class":316,"line":2143},42,[314,2145,2146],{"class":338},"    vectorField: ",[314,2148,2149],{"class":543},"'embedding'",[314,2151,560],{"class":338},[314,2153,2155,2158,2161],{"class":316,"line":2154},43,[314,2156,2157],{"class":338},"    dimensions: ",[314,2159,2160],{"class":324},"1536",[314,2162,560],{"class":338},[314,2164,2166,2168,2170,2172,2174],{"class":316,"line":2165},44,[314,2167,2111],{"class":338},[314,2169,710],{"class":543},[314,2171,649],{"class":338},[314,2173,2043],{"class":543},[314,2175,2120],{"class":338},[314,2177,2179],{"class":316,"line":2178},45,[314,2180,2126],{"class":338},[40,2182,2184],{"id":2183},"knowledgerelations","knowledgeRelations",[290,2186,2188],{"className":308,"code":2187,"language":310,"meta":298,"style":298},"knowledgeRelations: defineTable({\n  organizationId: v.string(),\n  fromEntryId: v.id('knowledgeEntries'),\n  toEntryId: v.id('knowledgeEntries'),\n  relationType: v.union(\n    v.literal('supports'),\n    v.literal('contradicts'),\n    v.literal('supersedes'),\n    v.literal('relates_to'),\n    v.literal('causes'),\n    v.literal('blocks')\n  ),\n  createdAt: v.number(),\n})\n  .index('by_from', ['fromEntryId'])\n  .index('by_to', ['toEntryId'])\n  .index('by_organization', ['organizationId'])\n",[27,2189,2190,2200,2208,2221,2234,2243,2256,2269,2282,2295,2308,2321,2325,2333,2337,2355,2373],{"__ignoreMap":298},[314,2191,2192,2194,2196,2198],{"class":316,"line":317},[314,2193,2184],{"class":1621},[314,2195,1106],{"class":338},[314,2197,1626],{"class":334},[314,2199,339],{"class":338},[314,2201,2202,2204,2206],{"class":316,"line":342},[314,2203,1633],{"class":338},[314,2205,387],{"class":334},[314,2207,351],{"class":338},[314,2209,2210,2213,2215,2217,2219],{"class":316,"line":354},[314,2211,2212],{"class":338},"  fromEntryId: v.",[314,2214,1866],{"class":334},[314,2216,643],{"class":338},[314,2218,646],{"class":543},[314,2220,1081],{"class":338},[314,2222,2223,2226,2228,2230,2232],{"class":316,"line":365},[314,2224,2225],{"class":338},"  toEntryId: v.",[314,2227,1866],{"class":334},[314,2229,643],{"class":338},[314,2231,646],{"class":543},[314,2233,1081],{"class":338},[314,2235,2236,2239,2241],{"class":316,"line":381},[314,2237,2238],{"class":338},"  relationType: v.",[314,2240,1645],{"class":334},[314,2242,1648],{"class":338},[314,2244,2245,2247,2249,2251,2254],{"class":316,"line":392},[314,2246,1653],{"class":338},[314,2248,1656],{"class":334},[314,2250,643],{"class":338},[314,2252,2253],{"class":543},"'supports'",[314,2255,1081],{"class":338},[314,2257,2258,2260,2262,2264,2267],{"class":316,"line":408},[314,2259,1653],{"class":338},[314,2261,1656],{"class":334},[314,2263,643],{"class":338},[314,2265,2266],{"class":543},"'contradicts'",[314,2268,1081],{"class":338},[314,2270,2271,2273,2275,2277,2280],{"class":316,"line":422},[314,2272,1653],{"class":338},[314,2274,1656],{"class":334},[314,2276,643],{"class":338},[314,2278,2279],{"class":543},"'supersedes'",[314,2281,1081],{"class":338},[314,2283,2284,2286,2288,2290,2293],{"class":316,"line":428},[314,2285,1653],{"class":338},[314,2287,1656],{"class":334},[314,2289,643],{"class":338},[314,2291,2292],{"class":543},"'relates_to'",[314,2294,1081],{"class":338},[314,2296,2297,2299,2301,2303,2306],{"class":316,"line":443},[314,2298,1653],{"class":338},[314,2300,1656],{"class":334},[314,2302,643],{"class":338},[314,2304,2305],{"class":543},"'causes'",[314,2307,1081],{"class":338},[314,2309,2310,2312,2314,2316,2319],{"class":316,"line":457},[314,2311,1653],{"class":338},[314,2313,1656],{"class":334},[314,2315,643],{"class":338},[314,2317,2318],{"class":543},"'blocks'",[314,2320,760],{"class":338},[314,2322,2323],{"class":316,"line":467},[314,2324,1739],{"class":338},[314,2326,2327,2329,2331],{"class":316,"line":477},[314,2328,1982],{"class":338},[314,2330,502],{"class":334},[314,2332,351],{"class":338},[314,2334,2335],{"class":316,"line":482},[314,2336,566],{"class":338},[314,2338,2339,2341,2343,2345,2348,2350,2353],{"class":316,"line":496},[314,2340,750],{"class":338},[314,2342,2009],{"class":334},[314,2344,643],{"class":338},[314,2346,2347],{"class":543},"'by_from'",[314,2349,2017],{"class":338},[314,2351,2352],{"class":543},"'fromEntryId'",[314,2354,2022],{"class":338},[314,2356,2357,2359,2361,2363,2366,2368,2371],{"class":316,"line":507},[314,2358,750],{"class":338},[314,2360,2009],{"class":334},[314,2362,643],{"class":338},[314,2364,2365],{"class":543},"'by_to'",[314,2367,2017],{"class":338},[314,2369,2370],{"class":543},"'toEntryId'",[314,2372,2022],{"class":338},[314,2374,2375,2377,2379,2381,2383,2385,2387],{"class":316,"line":517},[314,2376,750],{"class":338},[314,2378,2009],{"class":334},[314,2380,643],{"class":338},[314,2382,2014],{"class":543},[314,2384,2017],{"class":338},[314,2386,710],{"class":543},[314,2388,2022],{"class":338},[2390,2391,2392],"style",{},"html pre.shiki code .s7YZ4, html code.shiki .s7YZ4{--shiki-default:#D73A49;--shiki-dark:#F47067}html pre.shiki code .sviXB, html code.shiki .sviXB{--shiki-default:#005CC5;--shiki-dark:#6CB6FF}html pre.shiki code .sPO5f, html code.shiki .sPO5f{--shiki-default:#6F42C1;--shiki-dark:#DCBDFB}html pre.shiki code .sYgZi, html code.shiki .sYgZi{--shiki-default:#24292E;--shiki-dark:#ADBAC7}html pre.shiki code .s-HuK, html code.shiki .s-HuK{--shiki-default:#032F62;--shiki-dark:#96D0FF}html pre.shiki code .s74oq, html code.shiki .s74oq{--shiki-default:#005CC5;--shiki-dark:#F47067}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sDN9O, html code.shiki .sDN9O{--shiki-default:#6A737D;--shiki-dark:#768390}html pre.shiki code .stnAF, html code.shiki .stnAF{--shiki-default:#E36209;--shiki-dark:#F69D50}html pre.shiki code .sOLd2, html code.shiki .sOLd2{--shiki-default:#6F42C1;--shiki-dark:#F69D50}",{"title":298,"searchDepth":342,"depth":342,"links":2394},[2395,2399,2403,2408,2414,2418],{"id":34,"depth":342,"text":35,"children":2396},[2397,2398],{"id":42,"depth":354,"text":43},{"id":194,"depth":354,"text":195},{"id":278,"depth":342,"text":279,"children":2400},[2401,2402],{"id":301,"depth":354,"text":302},{"id":569,"depth":354,"text":570},{"id":601,"depth":342,"text":602,"children":2404},[2405,2406,2407],{"id":608,"depth":354,"text":609},{"id":723,"depth":354,"text":724},{"id":832,"depth":354,"text":833},{"id":918,"depth":342,"text":919,"children":2409},[2410,2411,2412,2413],{"id":925,"depth":354,"text":926},{"id":1190,"depth":354,"text":1191},{"id":1379,"depth":354,"text":1380},{"id":1420,"depth":354,"text":1421},{"id":1450,"depth":342,"text":1451,"children":2415},[2416,2417],{"id":1457,"depth":354,"text":1458},{"id":1504,"depth":354,"text":1505},{"id":1606,"depth":342,"text":1607,"children":2419},[2420,2421],{"id":1610,"depth":354,"text":1611},{"id":2183,"depth":354,"text":2184},"Technical architecture for Owlat's typed knowledge storage — how organizational knowledge is extracted, stored, searched, and maintained.","md",{},true,"\u002Fvision\u002Fknowledge-graph",{"title":5,"description":2422},"5.vision\u002F3.knowledge-graph","TfQpkgGctF4A0CVF3Nigy5r8Y0NRcVcpokuYywDrjjE",[2431,2433],{"title":287,"path":286,"stem":2432,"children":-1},"5.vision\u002F2.agent-pipeline",{"title":2434,"path":2435,"stem":2436,"children":-1},"Multi-Channel & CRM","\u002Fvision\u002Fmulti-channel","5.vision\u002F4.multi-channel",1774391045708]