[{"data":1,"prerenderedAt":1130},["ShallowReactive",2],{"content-vision\u002Ffile-system":3,"surround-\u002Fvision\u002Ffile-system":1121},{"id":4,"title":5,"body":6,"description":1113,"extension":1114,"meta":1115,"navigation":1116,"path":1117,"seo":1118,"stem":1119,"__hash__":1120},"content\u002F5.vision\u002F5.file-system.md","Semantic File System",{"type":7,"value":8,"toc":1101},"minimark",[9,14,18,23,26,49,52,63,67,72,75,198,202,205,286,289,293,296,401,405,408,431,440,444,447,453,456,482,489,493,1071,1075,1082,1089,1097],[10,11,13],"h1",{"id":12},"semantic-file-system-architecture","Semantic File System Architecture",[15,16,17],"p",{},"Owlat already stores media assets for email campaigns. The semantic file system extends this into a full organizational file layer — where every file gets embeddings, auto-tags, and conversation-linked provenance. Files become part of the agent's context, surfacing automatically when relevant.",[19,20,22],"h2",{"id":21},"how-it-works","How it works",[15,24,25],{},"Files enter the system through three channels:",[27,28,29,37,43],"ol",{},[30,31,32,36],"li",{},[33,34,35],"strong",{},"Direct upload"," — drag-and-drop in the dashboard (extends existing media library)",[30,38,39,42],{},[33,40,41],{},"Email attachment"," — inbound emails with attachments automatically index the files",[30,44,45,48],{},[33,46,47],{},"Agent-generated"," — agents produce artifacts (reports, visualizations, drafts) stored as files",[15,50,51],{},"Every file goes through the same processing pipeline:",[53,54,59],"pre",{"className":55,"code":57,"language":58},[56],"language-text","File uploaded \u002F received\n  → Store binary in Convex _storage (existing pattern)\n  → Extract text content:\n    - PDF: text extraction via pdf-lib (already in deps)\n    - Images: OCR via LLM vision (if available)\n    - Documents: text extraction\n  → Generate summary and auto-tags via AI SDK\n  → Generate embedding for semantic search\n  → Link to source (conversation, contact, uploader)\n  → Store metadata in semanticFiles table\n","text",[60,61,57],"code",{"__ignoreMap":62},"",[19,64,66],{"id":65},"retrieval","Retrieval",[68,69,71],"h3",{"id":70},"semantic-search","Semantic search",[15,73,74],{},"Natural language file retrieval using vector search:",[53,76,80],{"className":77,"code":78,"language":79,"meta":62,"style":62},"language-typescript shiki shiki-themes github-light github-dark-dimmed","\u002F\u002F \"Find the contract we signed with Acme Corp\"\nconst results = await ctx.vectorSearch('semanticFiles', 'vector_files', {\n  vector: await generateEmbedding(query),\n  limit: 10,\n  filter: (q) => q.eq('organizationId', orgId),\n})\n","typescript",[60,81,82,91,132,147,159,192],{"__ignoreMap":62},[83,84,87],"span",{"class":85,"line":86},"line",1,[83,88,90],{"class":89},"sDN9O","\u002F\u002F \"Find the contract we signed with Acme Corp\"\n",[83,92,94,98,102,105,108,112,116,119,123,126,129],{"class":85,"line":93},2,[83,95,97],{"class":96},"s7YZ4","const",[83,99,101],{"class":100},"sviXB"," results",[83,103,104],{"class":96}," =",[83,106,107],{"class":96}," await",[83,109,111],{"class":110},"sYgZi"," ctx.",[83,113,115],{"class":114},"sPO5f","vectorSearch",[83,117,118],{"class":110},"(",[83,120,122],{"class":121},"s-HuK","'semanticFiles'",[83,124,125],{"class":110},", ",[83,127,128],{"class":121},"'vector_files'",[83,130,131],{"class":110},", {\n",[83,133,135,138,141,144],{"class":85,"line":134},3,[83,136,137],{"class":110},"  vector: ",[83,139,140],{"class":96},"await",[83,142,143],{"class":114}," generateEmbedding",[83,145,146],{"class":110},"(query),\n",[83,148,150,153,156],{"class":85,"line":149},4,[83,151,152],{"class":110},"  limit: ",[83,154,155],{"class":100},"10",[83,157,158],{"class":110},",\n",[83,160,162,165,168,172,175,178,181,184,186,189],{"class":85,"line":161},5,[83,163,164],{"class":114},"  filter",[83,166,167],{"class":110},": (",[83,169,171],{"class":170},"stnAF","q",[83,173,174],{"class":110},") ",[83,176,177],{"class":96},"=>",[83,179,180],{"class":110}," q.",[83,182,183],{"class":114},"eq",[83,185,118],{"class":110},[83,187,188],{"class":121},"'organizationId'",[83,190,191],{"class":110},", orgId),\n",[83,193,195],{"class":85,"line":194},6,[83,196,197],{"class":110},"})\n",[68,199,201],{"id":200},"contextual-retrieval-for-agents","Contextual retrieval for agents",[15,203,204],{},"When the Agent Pipeline processes a message, the context retrieval step (Step 1) also searches relevant files:",[53,206,208],{"className":77,"code":207,"language":79,"meta":62,"style":62},"\u002F\u002F Agent handling a contract question from Acme Corp\nconst relevantFiles = await ctx.vectorSearch('semanticFiles', 'vector_files', {\n  vector: await generateEmbedding(messageContent),\n  limit: 5,\n  filter: (q) => q.eq('organizationId', orgId),\n})\n",[60,209,210,215,240,251,260,282],{"__ignoreMap":62},[83,211,212],{"class":85,"line":86},[83,213,214],{"class":89},"\u002F\u002F Agent handling a contract question from Acme Corp\n",[83,216,217,219,222,224,226,228,230,232,234,236,238],{"class":85,"line":93},[83,218,97],{"class":96},[83,220,221],{"class":100}," relevantFiles",[83,223,104],{"class":96},[83,225,107],{"class":96},[83,227,111],{"class":110},[83,229,115],{"class":114},[83,231,118],{"class":110},[83,233,122],{"class":121},[83,235,125],{"class":110},[83,237,128],{"class":121},[83,239,131],{"class":110},[83,241,242,244,246,248],{"class":85,"line":134},[83,243,137],{"class":110},[83,245,140],{"class":96},[83,247,143],{"class":114},[83,249,250],{"class":110},"(messageContent),\n",[83,252,253,255,258],{"class":85,"line":149},[83,254,152],{"class":110},[83,256,257],{"class":100},"5",[83,259,158],{"class":110},[83,261,262,264,266,268,270,272,274,276,278,280],{"class":85,"line":161},[83,263,164],{"class":114},[83,265,167],{"class":110},[83,267,171],{"class":170},[83,269,174],{"class":110},[83,271,177],{"class":96},[83,273,180],{"class":110},[83,275,183],{"class":114},[83,277,118],{"class":110},[83,279,188],{"class":121},[83,281,191],{"class":110},[83,283,284],{"class":85,"line":194},[83,285,197],{"class":110},[15,287,288],{},"The agent receives not just knowledge graph entries but the actual source documents — contracts, invoices, proposals. This grounds responses in real artifacts rather than summaries.",[68,290,292],{"id":291},"full-text-search","Full-text search",[15,294,295],{},"For keyword-based file search in the UI:",[53,297,299],{"className":77,"code":298,"language":79,"meta":62,"style":62},"const results = await ctx.db\n  .query('semanticFiles')\n  .withSearchIndex('search_files', (q) =>\n    q.search('searchableText', searchQuery)\n      .eq('organizationId', orgId)\n  )\n  .take(25)\n",[60,300,301,314,329,351,367,381,386],{"__ignoreMap":62},[83,302,303,305,307,309,311],{"class":85,"line":86},[83,304,97],{"class":96},[83,306,101],{"class":100},[83,308,104],{"class":96},[83,310,107],{"class":96},[83,312,313],{"class":110}," ctx.db\n",[83,315,316,319,322,324,326],{"class":85,"line":93},[83,317,318],{"class":110},"  .",[83,320,321],{"class":114},"query",[83,323,118],{"class":110},[83,325,122],{"class":121},[83,327,328],{"class":110},")\n",[83,330,331,333,336,338,341,344,346,348],{"class":85,"line":134},[83,332,318],{"class":110},[83,334,335],{"class":114},"withSearchIndex",[83,337,118],{"class":110},[83,339,340],{"class":121},"'search_files'",[83,342,343],{"class":110},", (",[83,345,171],{"class":170},[83,347,174],{"class":110},[83,349,350],{"class":96},"=>\n",[83,352,353,356,359,361,364],{"class":85,"line":149},[83,354,355],{"class":110},"    q.",[83,357,358],{"class":114},"search",[83,360,118],{"class":110},[83,362,363],{"class":121},"'searchableText'",[83,365,366],{"class":110},", searchQuery)\n",[83,368,369,372,374,376,378],{"class":85,"line":161},[83,370,371],{"class":110},"      .",[83,373,183],{"class":114},[83,375,118],{"class":110},[83,377,188],{"class":121},[83,379,380],{"class":110},", orgId)\n",[83,382,383],{"class":85,"line":194},[83,384,385],{"class":110},"  )\n",[83,387,389,391,394,396,399],{"class":85,"line":388},7,[83,390,318],{"class":110},[83,392,393],{"class":114},"take",[83,395,118],{"class":110},[83,397,398],{"class":100},"25",[83,400,328],{"class":110},[19,402,404],{"id":403},"auto-tagging","Auto-tagging",[15,406,407],{},"Every file gets two types of tags:",[409,410,411,425],"ul",{},[30,412,413,416,417,420,421,424],{},[33,414,415],{},"Auto-tags"," — generated by the AI from file content and the context in which it was shared. A PDF shared in a thread about \"Q3 financials\" with \"Acme Corp\" automatically inherits ",[60,418,419],{},"q3-financials"," and ",[60,422,423],{},"acme-corp"," tags.",[30,426,427,430],{},[33,428,429],{},"Manual tags"," — user-applied tags for custom organization.",[15,432,433,434,420,437,439],{},"Tags evolve as the organization's vocabulary evolves. The system tracks tag frequency and suggests merging similar tags (e.g., ",[60,435,436],{},"q3-finances",[60,438,419],{},").",[19,441,443],{"id":442},"version-tracking","Version tracking",[15,445,446],{},"Files are version-linked, not replaced:",[53,448,451],{"className":449,"code":450,"language":58},[56],"Contract v1 (shared Feb 10 by Alice in \"Acme negotiation\" thread)\n  → Contract v2 (shared Feb 18 by Bob in same thread, after legal review)\n    → Contract v3 (shared Feb 25 by Alice, final signed version)\n",[60,452,450],{"__ignoreMap":62},[15,454,455],{},"Each version records:",[409,457,458,464,470,476],{},[30,459,460,463],{},[33,461,462],{},"Who"," uploaded or shared it",[30,465,466,469],{},[33,467,468],{},"Where"," — which conversation thread",[30,471,472,475],{},[33,473,474],{},"Why"," — context from the surrounding messages",[30,477,478,481],{},[33,479,480],{},"What changed"," — diff summary (for text-based files)",[15,483,484,485,488],{},"The ",[60,486,487],{},"previousVersionId"," field creates a linked list of versions. The UI shows the full version history with conversation context for each revision.",[19,490,492],{"id":491},"schema","Schema",[53,494,496],{"className":77,"code":495,"language":79,"meta":62,"style":62},"semanticFiles: defineTable({\n  organizationId: v.string(),\n  storageId: v.id('_storage'),\n  filename: v.string(),\n  mimeType: v.string(),\n  fileSize: v.number(),\n  \u002F\u002F Semantic metadata\n  title: v.optional(v.string()),\n  summary: v.optional(v.string()),\n  extractedText: v.optional(v.string()),\n  tags: v.optional(v.array(v.string())),\n  autoTags: v.optional(v.array(v.string())),\n  \u002F\u002F Provenance\n  sourceType: v.union(\n    v.literal('upload'),\n    v.literal('email_attachment'),\n    v.literal('agent_generated')\n  ),\n  sourceMessageId: v.optional(v.string()),\n  uploadedBy: v.optional(v.string()),\n  \u002F\u002F Relationships\n  contactIds: v.optional(v.array(v.id('contacts'))),\n  threadId: v.optional(v.id('conversationThreads')),\n  \u002F\u002F Versioning\n  version: v.number(),\n  previousVersionId: v.optional(v.id('semanticFiles')),\n  \u002F\u002F Embedding for semantic search\n  embedding: v.array(v.float64()),\n  \u002F\u002F Full-text search\n  searchableText: v.optional(v.string()),\n  createdAt: v.number(),\n  updatedAt: v.number(),\n})\n  .index('by_organization', ['organizationId'])\n  .index('by_contact', ['contactIds'])\n  .index('by_thread', ['threadId'])\n  .index('by_previous_version', ['previousVersionId'])\n  .searchIndex('search_files', {\n    searchField: 'searchableText',\n    filterFields: ['organizationId'],\n  })\n  .vectorIndex('vector_files', {\n    vectorField: 'embedding',\n    dimensions: 1536,\n    filterFields: ['organizationId'],\n  })\n",[60,497,498,513,524,540,549,558,568,573,590,604,618,638,656,662,674,690,704,718,724,738,752,758,782,802,808,818,836,842,857,863,877,887,897,902,923,942,961,980,994,1004,1015,1021,1035,1046,1057,1066],{"__ignoreMap":62},[83,499,500,504,507,510],{"class":85,"line":86},[83,501,503],{"class":502},"sOLd2","semanticFiles",[83,505,506],{"class":110},": ",[83,508,509],{"class":114},"defineTable",[83,511,512],{"class":110},"({\n",[83,514,515,518,521],{"class":85,"line":93},[83,516,517],{"class":110},"  organizationId: v.",[83,519,520],{"class":114},"string",[83,522,523],{"class":110},"(),\n",[83,525,526,529,532,534,537],{"class":85,"line":134},[83,527,528],{"class":110},"  storageId: v.",[83,530,531],{"class":114},"id",[83,533,118],{"class":110},[83,535,536],{"class":121},"'_storage'",[83,538,539],{"class":110},"),\n",[83,541,542,545,547],{"class":85,"line":149},[83,543,544],{"class":110},"  filename: v.",[83,546,520],{"class":114},[83,548,523],{"class":110},[83,550,551,554,556],{"class":85,"line":161},[83,552,553],{"class":110},"  mimeType: v.",[83,555,520],{"class":114},[83,557,523],{"class":110},[83,559,560,563,566],{"class":85,"line":194},[83,561,562],{"class":110},"  fileSize: v.",[83,564,565],{"class":114},"number",[83,567,523],{"class":110},[83,569,570],{"class":85,"line":388},[83,571,572],{"class":89},"  \u002F\u002F Semantic metadata\n",[83,574,576,579,582,585,587],{"class":85,"line":575},8,[83,577,578],{"class":110},"  title: v.",[83,580,581],{"class":114},"optional",[83,583,584],{"class":110},"(v.",[83,586,520],{"class":114},[83,588,589],{"class":110},"()),\n",[83,591,593,596,598,600,602],{"class":85,"line":592},9,[83,594,595],{"class":110},"  summary: v.",[83,597,581],{"class":114},[83,599,584],{"class":110},[83,601,520],{"class":114},[83,603,589],{"class":110},[83,605,607,610,612,614,616],{"class":85,"line":606},10,[83,608,609],{"class":110},"  extractedText: v.",[83,611,581],{"class":114},[83,613,584],{"class":110},[83,615,520],{"class":114},[83,617,589],{"class":110},[83,619,621,624,626,628,631,633,635],{"class":85,"line":620},11,[83,622,623],{"class":110},"  tags: v.",[83,625,581],{"class":114},[83,627,584],{"class":110},[83,629,630],{"class":114},"array",[83,632,584],{"class":110},[83,634,520],{"class":114},[83,636,637],{"class":110},"())),\n",[83,639,641,644,646,648,650,652,654],{"class":85,"line":640},12,[83,642,643],{"class":110},"  autoTags: v.",[83,645,581],{"class":114},[83,647,584],{"class":110},[83,649,630],{"class":114},[83,651,584],{"class":110},[83,653,520],{"class":114},[83,655,637],{"class":110},[83,657,659],{"class":85,"line":658},13,[83,660,661],{"class":89},"  \u002F\u002F Provenance\n",[83,663,665,668,671],{"class":85,"line":664},14,[83,666,667],{"class":110},"  sourceType: v.",[83,669,670],{"class":114},"union",[83,672,673],{"class":110},"(\n",[83,675,677,680,683,685,688],{"class":85,"line":676},15,[83,678,679],{"class":110},"    v.",[83,681,682],{"class":114},"literal",[83,684,118],{"class":110},[83,686,687],{"class":121},"'upload'",[83,689,539],{"class":110},[83,691,693,695,697,699,702],{"class":85,"line":692},16,[83,694,679],{"class":110},[83,696,682],{"class":114},[83,698,118],{"class":110},[83,700,701],{"class":121},"'email_attachment'",[83,703,539],{"class":110},[83,705,707,709,711,713,716],{"class":85,"line":706},17,[83,708,679],{"class":110},[83,710,682],{"class":114},[83,712,118],{"class":110},[83,714,715],{"class":121},"'agent_generated'",[83,717,328],{"class":110},[83,719,721],{"class":85,"line":720},18,[83,722,723],{"class":110},"  ),\n",[83,725,727,730,732,734,736],{"class":85,"line":726},19,[83,728,729],{"class":110},"  sourceMessageId: v.",[83,731,581],{"class":114},[83,733,584],{"class":110},[83,735,520],{"class":114},[83,737,589],{"class":110},[83,739,741,744,746,748,750],{"class":85,"line":740},20,[83,742,743],{"class":110},"  uploadedBy: v.",[83,745,581],{"class":114},[83,747,584],{"class":110},[83,749,520],{"class":114},[83,751,589],{"class":110},[83,753,755],{"class":85,"line":754},21,[83,756,757],{"class":89},"  \u002F\u002F Relationships\n",[83,759,761,764,766,768,770,772,774,776,779],{"class":85,"line":760},22,[83,762,763],{"class":110},"  contactIds: v.",[83,765,581],{"class":114},[83,767,584],{"class":110},[83,769,630],{"class":114},[83,771,584],{"class":110},[83,773,531],{"class":114},[83,775,118],{"class":110},[83,777,778],{"class":121},"'contacts'",[83,780,781],{"class":110},"))),\n",[83,783,785,788,790,792,794,796,799],{"class":85,"line":784},23,[83,786,787],{"class":110},"  threadId: v.",[83,789,581],{"class":114},[83,791,584],{"class":110},[83,793,531],{"class":114},[83,795,118],{"class":110},[83,797,798],{"class":121},"'conversationThreads'",[83,800,801],{"class":110},")),\n",[83,803,805],{"class":85,"line":804},24,[83,806,807],{"class":89},"  \u002F\u002F Versioning\n",[83,809,811,814,816],{"class":85,"line":810},25,[83,812,813],{"class":110},"  version: v.",[83,815,565],{"class":114},[83,817,523],{"class":110},[83,819,821,824,826,828,830,832,834],{"class":85,"line":820},26,[83,822,823],{"class":110},"  previousVersionId: v.",[83,825,581],{"class":114},[83,827,584],{"class":110},[83,829,531],{"class":114},[83,831,118],{"class":110},[83,833,122],{"class":121},[83,835,801],{"class":110},[83,837,839],{"class":85,"line":838},27,[83,840,841],{"class":89},"  \u002F\u002F Embedding for semantic search\n",[83,843,845,848,850,852,855],{"class":85,"line":844},28,[83,846,847],{"class":110},"  embedding: v.",[83,849,630],{"class":114},[83,851,584],{"class":110},[83,853,854],{"class":114},"float64",[83,856,589],{"class":110},[83,858,860],{"class":85,"line":859},29,[83,861,862],{"class":89},"  \u002F\u002F Full-text search\n",[83,864,866,869,871,873,875],{"class":85,"line":865},30,[83,867,868],{"class":110},"  searchableText: v.",[83,870,581],{"class":114},[83,872,584],{"class":110},[83,874,520],{"class":114},[83,876,589],{"class":110},[83,878,880,883,885],{"class":85,"line":879},31,[83,881,882],{"class":110},"  createdAt: v.",[83,884,565],{"class":114},[83,886,523],{"class":110},[83,888,890,893,895],{"class":85,"line":889},32,[83,891,892],{"class":110},"  updatedAt: v.",[83,894,565],{"class":114},[83,896,523],{"class":110},[83,898,900],{"class":85,"line":899},33,[83,901,197],{"class":110},[83,903,905,907,910,912,915,918,920],{"class":85,"line":904},34,[83,906,318],{"class":110},[83,908,909],{"class":114},"index",[83,911,118],{"class":110},[83,913,914],{"class":121},"'by_organization'",[83,916,917],{"class":110},", [",[83,919,188],{"class":121},[83,921,922],{"class":110},"])\n",[83,924,926,928,930,932,935,937,940],{"class":85,"line":925},35,[83,927,318],{"class":110},[83,929,909],{"class":114},[83,931,118],{"class":110},[83,933,934],{"class":121},"'by_contact'",[83,936,917],{"class":110},[83,938,939],{"class":121},"'contactIds'",[83,941,922],{"class":110},[83,943,945,947,949,951,954,956,959],{"class":85,"line":944},36,[83,946,318],{"class":110},[83,948,909],{"class":114},[83,950,118],{"class":110},[83,952,953],{"class":121},"'by_thread'",[83,955,917],{"class":110},[83,957,958],{"class":121},"'threadId'",[83,960,922],{"class":110},[83,962,964,966,968,970,973,975,978],{"class":85,"line":963},37,[83,965,318],{"class":110},[83,967,909],{"class":114},[83,969,118],{"class":110},[83,971,972],{"class":121},"'by_previous_version'",[83,974,917],{"class":110},[83,976,977],{"class":121},"'previousVersionId'",[83,979,922],{"class":110},[83,981,983,985,988,990,992],{"class":85,"line":982},38,[83,984,318],{"class":110},[83,986,987],{"class":114},"searchIndex",[83,989,118],{"class":110},[83,991,340],{"class":121},[83,993,131],{"class":110},[83,995,997,1000,1002],{"class":85,"line":996},39,[83,998,999],{"class":110},"    searchField: ",[83,1001,363],{"class":121},[83,1003,158],{"class":110},[83,1005,1007,1010,1012],{"class":85,"line":1006},40,[83,1008,1009],{"class":110},"    filterFields: [",[83,1011,188],{"class":121},[83,1013,1014],{"class":110},"],\n",[83,1016,1018],{"class":85,"line":1017},41,[83,1019,1020],{"class":110},"  })\n",[83,1022,1024,1026,1029,1031,1033],{"class":85,"line":1023},42,[83,1025,318],{"class":110},[83,1027,1028],{"class":114},"vectorIndex",[83,1030,118],{"class":110},[83,1032,128],{"class":121},[83,1034,131],{"class":110},[83,1036,1038,1041,1044],{"class":85,"line":1037},43,[83,1039,1040],{"class":110},"    vectorField: ",[83,1042,1043],{"class":121},"'embedding'",[83,1045,158],{"class":110},[83,1047,1049,1052,1055],{"class":85,"line":1048},44,[83,1050,1051],{"class":110},"    dimensions: ",[83,1053,1054],{"class":100},"1536",[83,1056,158],{"class":110},[83,1058,1060,1062,1064],{"class":85,"line":1059},45,[83,1061,1009],{"class":110},[83,1063,188],{"class":121},[83,1065,1014],{"class":110},[83,1067,1069],{"class":85,"line":1068},46,[83,1070,1020],{"class":110},[19,1072,1074],{"id":1073},"integration-with-existing-systems","Integration with existing systems",[15,1076,1077,1078,1081],{},"The semantic file system does not replace the existing ",[60,1079,1080],{},"mediaAssets"," table. Media assets are purpose-built for the email builder (images, with width\u002Fheight, search, tagging). Semantic files are a broader layer for organizational documents.",[15,1083,1084,1085,1088],{},"However, both use Convex ",[60,1086,1087],{},"_storage"," for binary data. In the future, the media library UI can surface semantic files alongside media assets — searching across both with a unified query.",[1090,1091,1094],"callout",{"title":1092,"type":1093},"Files are not a separate product","info",[15,1095,1096],{},"The file system is a layer in the same architecture. Files are scoped to the organization, searchable through the same retrieval pipeline, governed by the same permissions model, and logged in the same audit trail.",[1098,1099,1100],"style",{},"html pre.shiki code .sDN9O, html code.shiki .sDN9O{--shiki-default:#6A737D;--shiki-dark:#768390}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 .sYgZi, html code.shiki .sYgZi{--shiki-default:#24292E;--shiki-dark:#ADBAC7}html pre.shiki code .sPO5f, html code.shiki .sPO5f{--shiki-default:#6F42C1;--shiki-dark:#DCBDFB}html pre.shiki code .s-HuK, html code.shiki .s-HuK{--shiki-default:#032F62;--shiki-dark:#96D0FF}html pre.shiki code .stnAF, html code.shiki .stnAF{--shiki-default:#E36209;--shiki-dark:#F69D50}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 .sOLd2, html code.shiki .sOLd2{--shiki-default:#6F42C1;--shiki-dark:#F69D50}",{"title":62,"searchDepth":93,"depth":93,"links":1102},[1103,1104,1109,1110,1111,1112],{"id":21,"depth":93,"text":22},{"id":65,"depth":93,"text":66,"children":1105},[1106,1107,1108],{"id":70,"depth":134,"text":71},{"id":200,"depth":134,"text":201},{"id":291,"depth":134,"text":292},{"id":403,"depth":93,"text":404},{"id":442,"depth":93,"text":443},{"id":491,"depth":93,"text":492},{"id":1073,"depth":93,"text":1074},"Technical architecture for Owlat's semantic file storage — embedding-based retrieval, auto-tagging, and version tracking with provenance.","md",{},true,"\u002Fvision\u002Ffile-system",{"title":5,"description":1113},"5.vision\u002F5.file-system","4VaWhRhzun2xVNSO7N6fnin8zEgquaRtXK7xEjFjRA0",[1122,1126],{"title":1123,"path":1124,"stem":1125,"children":-1},"Multi-Channel & CRM","\u002Fvision\u002Fmulti-channel","5.vision\u002F4.multi-channel",{"title":1127,"path":1128,"stem":1129,"children":-1},"Desktop App & Advanced Agents","\u002Fvision\u002Fdesktop-app","5.vision\u002F6.desktop-app",1774391045852]