fuli-context 0.7.4-beta.1 → 0.7.4-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
1
  const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/OverviewPage-CHE6XhdS.js","assets/i18n-CWfd8Dtt.js","assets/console-DMvHxKf9.js","assets/vue-router-DN8x6iY1.js","assets/useApi-CROJJdhE-BLQiPVw0.js","assets/paths-CDREouhi.js","assets/PersonalProfilePage-CXXiabUy.js","assets/_plugin-vue_export-helper-BDNMzG2s.js","assets/SearchableSelect-C5RiB5F8.js","assets/KnowledgeEditDialog-wotVahvr.js","assets/identity-C9mLdR8L.js","assets/model-CsYAR8O3.js","assets/KnowledgeEditDialog-DWUV_NPp.css","assets/KnowledgeInspector-BzkW0mVs.js","assets/conversation-launcher-settings-Dnlcw7Rj.js","assets/KnowledgeInspector--1NujtXW.css","assets/PersonalProfilePage-B7T09bow.css","assets/WritingTastePage-B9BCYIwQ.js","assets/WritingTastePage-DSgvTH6x.css","assets/PersonalProjectsPage-d2wYGW8n.js","assets/KnowledgeWorkspace-1pHJ0MNZ.js","assets/KnowledgeOrganizerPage-BebUDiHt.js","assets/KnowledgeOrganizerPage-Cx1w1jb2.css","assets/PublicProjectsPage-hxLShtnZ.js","assets/KnowledgePage-OUT07aKH.js","assets/ReviewPage-DUeyu7E8.js","assets/ConnectionsPage-D5J91x6d.js","assets/ConnectionsPage-CBHAdZXT.css","assets/SettingsPage-BMuASSzQ.js","assets/SettingsPage-CAfz4qiV.css","assets/AboutPage-CftRexSY.js","assets/fuli-logo-Bu9WBuQe.js","assets/AboutPage-DXh7Fwxt.css"])))=>i.map(i=>d[i]);
2
- import{$ as e,D as t,I as n,L as r,N as i,O as a,Q as o,_ as s,a as c,b as l,d as u,f as d,g as f,h as p,i as m,j as h,k as g,m as _,n as v,o as y,p as b,q as x,r as S,t as C,tt as w,x as T}from"./i18n-CWfd8Dtt.js";import{s as E,t as D}from"./console-DMvHxKf9.js";import{m as ee}from"./useApi-CROJJdhE-BLQiPVw0.js";import{i as O,n as k,r as A,t as j}from"./vue-router-DN8x6iY1.js";import{t as M}from"./fuli-logo-Bu9WBuQe.js";import{t as te}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{n as ne,t as re}from"./paths-CDREouhi.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var N={name:`fuli-context`,version:`0.7.4-beta.1`,description:`Local-first collaboration relationship graph for AI agents.`,type:`module`,files:[`README.zh-CN.md`,`npm-shrinkwrap.json`,`src/`,`dist/web/`,`docs/external-knowledge-architecture.md`,`examples/external-knowledge/markdown-folder.mjs`,`graph-provider/Dockerfile`,`graph-provider/pyproject.toml`,`graph-provider/fuli_graph/*.py`,`graph-provider/fuli_graph/**/*.py`,`skills/`,`compose.graphiti.yml`],bin:{fl:`src/cli.js`,fuli:`src/cli.js`},keywords:[`ai-agent`,`mcp`,`context`,`knowledge-graph`,`local-first`,`codex`,`claude-code`],scripts:{mcp:`node src/mcp-server.js`,dev:`run-p dev:server dev:web`,"dev:server":`node src/server.js`,"dev:web":`vite`,build:`run-s typecheck:web build:web`,"build:web":`vite build`,"typecheck:web":`vue-tsc --noEmit -p tsconfig.app.json`,"test:node":`node --test`,"test:web":`vitest run --config vitest.config.ts`,"test:package":`node scripts/package-smoke.js`,"test:knowledge:live":`node acceptance/knowledge-live.js`,"test:external-knowledge:live":`node scripts/validate-external-knowledge-live.js`,start:`node src/server.js`,"graph:setup":`node src/graphiti/setup.js`,"graph:up":`docker compose -f compose.graphiti.yml up -d --build`,"graph:down":`docker compose -f compose.graphiti.yml down`,"test:structure":`node --test test/source-structure.test.js`,pretest:`npm run build:web`,test:`run-s typecheck:web test:node test:web`,prepack:`npm run build`,prepublishOnly:`npm test`},engines:{node:`>=24.12`},repository:{type:`git`,url:`git+https://github.com/JevonsCode/fuli.git`},homepage:`https://github.com/JevonsCode/fuli#readme`,bugs:{url:`https://github.com/JevonsCode/fuli/issues`},publishConfig:{access:`public`},license:`Apache-2.0`,dependencies:{"@hono/node-server":`2.0.12`,"@modelcontextprotocol/sdk":`^1.29.0`,zod:`^4.4.3`},devDependencies:{"@types/d3":`^7.4.3`,"@types/node":`^24.13.3`,"@vitejs/plugin-vue":`^6.0.8`,"@vue/test-utils":`^2.4.11`,"brace-expansion":`5.0.9`,d3:`^7.9.0`,gsap:`^3.15.0`,jsdom:`^29.1.1`,linkedom:`^0.18.12`,"npm-run-all2":`^9.0.2`,pinia:`^4.0.2`,typescript:`~6.0.0`,vite:`^8.1.5`,vitest:`^4.1.10`,vue:`^3.5.40`,"vue-i18n":`^11.4.8`,"vue-router":`^5.2.0`,"vue-tsc":`^3.3.8`},overrides:{"@modelcontextprotocol/sdk":{"@hono/node-server":`2.0.12`},"brace-expansion":`$brace-expansion`,"fast-uri":`3.1.5`}}.version,ie=[`aria-label`],ae={class:`brand-mark-wrap`},P=[`src`],F={class:`brand-copy`},I={class:`brand-title-row`},L={class:`brand-name`},R={class:`brand-version`},z={class:`brand-title-row`},B={class:`brand-name`},V={class:`brand-version`},H=te(T({__name:`BrandEasterEgg`,setup(n){let r=x(0),i=x(!1),l=x(!1),d=!1;function p(){r.value+=1,i.value=!0}function m(){i.value=!1}function h(){d=!1,l.value=!1}function v(e){e.key===`Tab`&&(d=!0)}function y(){l.value=d}function b(){l.value=!1}return a(()=>{window.addEventListener(`pointerdown`,h,!0),window.addEventListener(`keydown`,v,!0)}),t(()=>{window.removeEventListener(`pointerdown`,h,!0),window.removeEventListener(`keydown`,v,!0)}),(t,n)=>(g(),s(`button`,{class:e([`brand-block`,{"is-sparkling":i.value,"is-keyboard-focused":l.value}]),type:`button`,"aria-label":o(c)(`console.brandEffect.aria`),onClick:p,onFocus:y,onBlur:b},[_(`span`,ae,[_(`img`,{class:`brand-mark`,src:o(M),alt:``,"aria-hidden":`true`},null,8,P),i.value?(g(),s(`span`,{key:`orbit-${r.value}`,class:`brand-orbit`,"aria-hidden":`true`})):f(``,!0)]),_(`span`,F,[_(`span`,I,[_(`span`,L,w(o(c)(`common.brand`)),1),_(`span`,R,`v`+w(o(N)),1)]),n[0]||=_(`span`,{class:`brand-subtitle`},`Context Graph`,-1),i.value?(g(),s(`span`,{key:`copy-reflection-${r.value}`,class:`brand-copy-reflection`,"aria-hidden":`true`,onAnimationend:u(m,[`self`])},[_(`span`,z,[_(`span`,B,w(o(c)(`common.brand`)),1),_(`span`,V,`v`+w(o(N)),1)])],32)):f(``,!0)])],42,ie))}}),[[`__scopeId`,`data-v-efd904c7`]]),U=[`aria-label`],W=[`lang`,`aria-label`,`aria-pressed`,`onClick`],G=T({__name:`LocaleSwitcher`,setup(e){let t=b(()=>v()),n={"zh-CN":`中`,"en-US":`EN`};function r(e){e!==t.value&&m(e)}return(e,i)=>(g(),s(`div`,{class:`locale-switcher`,role:`group`,"aria-label":o(c)(`common.language.label`)},[(g(!0),s(d,null,h(o(C),e=>(g(),s(`button`,{key:e,type:`button`,lang:e,"aria-label":o(c)(e===`zh-CN`?`common.language.chinese`:`common.language.english`),"aria-pressed":t.value===e,onClick:t=>r(e)},w(n[e]),9,W))),128))],8,U))}}),K=[`routes.`,`common.`];function q(e,t=``){let n=typeof e==`string`&&e?e:t;return K.some(e=>n.startsWith(e))?c(n):n}function J(e){if(typeof document>`u`)return;let t=q(e,`routes.overview.title`);document.title=`${t} · ${c(`common.brand`)}`}var oe={class:`app-shell`},se={class:`sidebar`},ce=[`aria-label`],le={class:`nav-section-label`},ue={class:`nav-label`},de={class:`nav-section-label nav-space-label`},fe={class:`nav-copy`},pe={class:`nav-copy`},me={class:`nav-copy`},he={class:`nav-section-label nav-public-label`},ge={class:`nav-copy`},_e={class:`nav-section-label nav-tool-label`},ve={class:`nav-label`},ye={class:`nav-label`},be={class:`nav-label`},xe={class:`nav-section-label nav-about-label`},Se={class:`nav-label`},Ce={class:`nav-label`},we={class:`sidebar-foot`},Te=[`aria-label`],Ee={class:`runtime-status`},De={class:`runtime-status`},Oe={class:`workspace`},ke={class:`topbar`},Ae={class:`topbar-heading`},je={key:0,class:`eyebrow`},Y={key:1,class:`topbar-description`},Me={class:`topbar-actions`},Ne={key:0,class:`mode-chip`},Pe={key:1,class:`settings-save-button`,form:`settings-form`,type:`submit`},Fe=T({__name:`ConsoleLayout`,setup(t){let u=D(),m=ee(),h=b(()=>u.activePersonalSpace?.id??`current`),v=b(()=>ne(h.value,`graph`)),y=b(()=>re(`personal`,h.value,`directory`)),x=b(()=>q(m.meta.title,`routes.overview.title`)),S=b(()=>String(m.meta.eyebrow??`LOCAL + FEDERATED`)),C=b(()=>q(m.meta.description)),T=b(()=>u.publicRuntimeStatus===`ready`),E=b(()=>u.publicRuntimeStatus===`ready`?c(`console.services.publicReady`):u.publicRuntimeStatus===`error`?c(`console.services.publicError`):c(`console.services.publicOffline`)),O=b(()=>u.publicRuntimeStatus===`ready`?c(`console.services.publicAvailable`):u.publicRuntimeStatus===`error`?c(`console.services.localUnaffected`):c(`console.services.localOnly`)),A=b(()=>u.state?.capabilities?.browsePublicProjects!==!1),M=b(()=>{let e=u.state?.capabilities;return e?.submitKnowledge!==!1||e?.reviewProposals===!0});return a(()=>{u.runtimeStatus===`idle`&&u.refresh()}),n(()=>{J(m.meta.title)}),(t,n)=>(g(),s(`div`,oe,[_(`aside`,se,[l(H),_(`nav`,{class:`primary-nav`,"aria-label":o(c)(`console.navigation.aria`)},[_(`p`,le,w(o(c)(`console.navigation.workspace`)),1),l(o(j),{to:`/`,"exact-active-class":`is-active`},{default:r(()=>[n[2]||=_(`span`,{class:`nav-icon nav-icon-overview`,"aria-hidden":`true`},null,-1),_(`span`,ue,w(o(c)(`console.navigation.overview`)),1)]),_:1}),_(`p`,de,w(o(c)(`console.navigation.personalSpace`)),1),l(o(j),{class:`space-nav-button personal-profile-button`,to:`/preferences`,"active-class":`is-active`},{default:r(()=>[n[3]||=_(`span`,{class:`nav-icon nav-icon-personal-profile`,"aria-hidden":`true`},null,-1),_(`span`,fe,[_(`strong`,null,w(o(c)(`console.navigation.preferences`)),1),_(`small`,null,w(o(c)(`console.navigation.preferencesMeta`)),1)])]),_:1}),l(o(j),{class:`space-nav-button knowledge-organizer-button`,to:`/organize`,"active-class":`is-active`},{default:r(()=>[n[4]||=_(`span`,{class:`nav-icon nav-icon-knowledge-organizer`,"aria-hidden":`true`},null,-1),_(`span`,pe,[_(`strong`,null,w(o(c)(`console.navigation.organizer`)),1),_(`small`,null,w(o(c)(`console.navigation.organizerMeta`)),1)])]),_:1}),l(o(j),{class:`space-nav-button personal-space-button`,to:v.value,"active-class":`is-active`},{default:r(()=>[n[5]||=_(`span`,{class:`nav-icon nav-icon-personal-project`,"aria-hidden":`true`},null,-1),_(`span`,me,[_(`strong`,null,w(o(c)(`console.navigation.personalProjects`)),1),_(`small`,null,w(o(c)(`console.navigation.personalProjectsMeta`)),1)])]),_:1},8,[`to`]),A.value?(g(),s(d,{key:0},[_(`p`,he,w(o(c)(`console.navigation.publicSpace`)),1),l(o(j),{class:`space-nav-button public-space-button`,to:`/public-projects`,"active-class":`is-active`},{default:r(()=>[n[6]||=_(`span`,{class:`nav-icon nav-icon-public-project`,"aria-hidden":`true`},null,-1),_(`span`,ge,[_(`strong`,null,w(o(c)(`console.navigation.publicProjects`)),1),_(`small`,null,w(o(c)(`console.navigation.publicProjectsMeta`)),1)])]),_:1})],64)):f(``,!0),_(`p`,_e,w(o(c)(`console.navigation.governance`)),1),l(o(j),{to:y.value,"active-class":`is-active`},{default:r(()=>[n[7]||=_(`span`,{class:`nav-icon nav-icon-knowledge-graph`,"aria-hidden":`true`},null,-1),_(`span`,ve,w(o(c)(`console.navigation.knowledge`)),1)]),_:1},8,[`to`]),M.value?(g(),p(o(j),{key:1,to:`/review`,"active-class":`is-active`},{default:r(()=>[n[8]||=_(`span`,{class:`nav-icon nav-icon-review`,"aria-hidden":`true`},null,-1),_(`span`,ye,w(o(c)(`console.navigation.review`)),1)]),_:1})):f(``,!0),l(o(j),{to:`/connections`,"active-class":`is-active`},{default:r(()=>[n[9]||=_(`span`,{class:`nav-icon nav-icon-connections`,"aria-hidden":`true`},null,-1),_(`span`,be,w(o(c)(`console.navigation.connections`)),1)]),_:1}),_(`p`,xe,w(o(c)(`console.navigation.aboutSection`)),1),l(o(j),{to:`/settings`,"active-class":`is-active`},{default:r(()=>[n[10]||=_(`span`,{class:`nav-icon nav-icon-settings`,"aria-hidden":`true`},null,-1),_(`span`,Se,w(o(c)(`console.navigation.settings`)),1)]),_:1}),l(o(j),{to:`/about`,"active-class":`is-active`},{default:r(()=>[n[11]||=_(`span`,{class:`nav-icon nav-icon-about`,"aria-hidden":`true`},null,-1),_(`span`,Ce,w(o(c)(`console.navigation.about`)),1)]),_:1})],8,ce),_(`div`,we,[_(`div`,{class:`service-runtime-list`,"aria-label":o(c)(`console.services.aria`)},[_(`div`,Ee,[_(`span`,{class:e([`status-dot`,o(u).runtimeStatus])},null,2),_(`div`,null,[_(`strong`,null,w(o(u).runtimeStatus===`ready`?o(c)(`console.services.localReady`):o(u).runtimeStatus===`error`?o(c)(`console.services.localError`):o(c)(`console.services.localConnecting`)),1),n[12]||=_(`small`,null,`Graphiti / Neo4j`,-1)])]),_(`div`,De,[_(`span`,{class:e([`status-dot`,o(u).publicRuntimeStatus])},null,2),_(`div`,null,[_(`strong`,null,w(E.value),1),_(`small`,null,w(O.value),1)])])],8,Te)])]),_(`main`,Oe,[_(`header`,ke,[_(`div`,Ae,[S.value?(g(),s(`p`,je,w(S.value),1)):f(``,!0),_(`h2`,null,w(x.value),1),C.value?(g(),s(`p`,Y,w(C.value),1)):f(``,!0)]),_(`div`,Me,[T.value?(g(),s(`span`,Ne,w(o(c)(`console.publicReady`)),1)):f(``,!0),o(m).name===`settings`?(g(),s(`button`,Pe,w(o(c)(`settings.save`)),1)):f(``,!0),l(G),_(`button`,{class:`quiet-button`,type:`button`,onClick:n[0]||=(...e)=>o(u).refresh&&o(u).refresh(...e)},w(o(c)(`common.actions.refresh`)),1)])]),o(u).feedback?(g(),s(`button`,{key:0,class:e([`feedback feedback-button`,{success:o(u).feedback.tone===`success`}]),type:`button`,"aria-live":`polite`,onClick:n[1]||=(...e)=>o(u).clearFeedback&&o(u).clearFeedback(...e)},w(o(u).feedback.message),3)):f(``,!0),l(o(k),null,{default:r(({Component:e})=>[(g(),p(i(e)))]),_:1})])]))}}),Ie=T({__name:`App`,setup(e){return(e,t)=>(g(),p(Fe))}}),Le=`modulepreload`,Re=function(e){return`/`+e},X={},Z=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}r=o(t.map(t=>{if(t=Re(t,n),t=s(t),t in X)return;X[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:Le,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})};function ze(e){let t=e.match(/^#\/knowledge\/([^/?#]+)\/([^/?#]+)\/(entity|relationship)\/([^/?#]+)(?:\?([^#]*))?$/);if(!t)return null;let[,n,r,i,a,o]=t;return`/knowledge/${n}/${r}/directory/${i}/${a}${o?`?${o}`:``}`}var Q=A({history:O(`/`),routes:[{path:`/`,name:`overview`,component:()=>Z(()=>import(`./OverviewPage-CHE6XhdS.js`),__vite__mapDeps([0,1,2,3,4,5])),meta:{eyebrow:``,title:`routes.overview.title`}},{path:`/preferences`,name:`personal-profile`,component:()=>Z(()=>import(`./PersonalProfilePage-CXXiabUy.js`),__vite__mapDeps([6,1,2,3,4,7,8,9,10,11,12,13,14,15,16])),meta:{eyebrow:`PERSONAL LENS`,title:`routes.preferences.title`,description:`routes.preferences.description`}},{path:`/preferences/writing`,name:`writing-taste`,component:()=>Z(()=>import(`./WritingTastePage-B9BCYIwQ.js`),__vite__mapDeps([17,1,2,3,4,7,9,8,10,11,12,18])),meta:{eyebrow:``,title:`routes.writingTaste.title`}},{path:`/personal/:spaceId/projects/:projectId/:mode/:itemKind/:itemId`,name:`personal-project-item`,component:()=>Z(()=>import(`./PersonalProjectsPage-d2wYGW8n.js`),__vite__mapDeps([19,1,20,2,4,3,5,8,10,9,7,11,12,13,14,15])),meta:{eyebrow:`PERSONAL PROJECT`,title:`routes.personalProjects.title`}},{path:`/personal/:spaceId/projects/:mode/:itemKind/:itemId`,name:`personal-projects-item`,component:()=>Z(()=>import(`./PersonalProjectsPage-d2wYGW8n.js`),__vite__mapDeps([19,1,20,2,4,3,5,8,10,9,7,11,12,13,14,15])),meta:{eyebrow:`PERSONAL PROJECTS`,title:`routes.personalProjects.title`,description:`routes.personalProjects.description`}},{path:`/personal/:spaceId/projects/:mode`,name:`personal-projects`,component:()=>Z(()=>import(`./PersonalProjectsPage-d2wYGW8n.js`),__vite__mapDeps([19,1,20,2,4,3,5,8,10,9,7,11,12,13,14,15])),meta:{eyebrow:`PERSONAL PROJECTS`,title:`routes.personalProjects.title`,description:`routes.personalProjects.description`}},{path:`/personal/:spaceId/projects/:projectId/:mode`,name:`personal-project`,component:()=>Z(()=>import(`./PersonalProjectsPage-d2wYGW8n.js`),__vite__mapDeps([19,1,20,2,4,3,5,8,10,9,7,11,12,13,14,15])),meta:{eyebrow:`PERSONAL PROJECT`,title:`routes.personalProjects.title`}},{path:`/organize`,name:`knowledge-organizer`,component:()=>Z(()=>import(`./KnowledgeOrganizerPage-BebUDiHt.js`),__vite__mapDeps([21,1,2,7,8,10,9,11,12,13,14,15,22])),meta:{eyebrow:`KNOWLEDGE CLASSIFICATION`,title:`routes.organizer.title`}},{path:`/public-projects`,name:`public-projects`,component:()=>Z(()=>import(`./PublicProjectsPage-hxLShtnZ.js`),__vite__mapDeps([23,1,2,4,5,8,10])),meta:{eyebrow:`PUBLIC PROJECTS`,title:`routes.publicProjects.title`,description:`routes.publicProjects.description`}},{path:`/knowledge`,name:`knowledge-default`,component:()=>Z(()=>import(`./KnowledgePage-OUT07aKH.js`),__vite__mapDeps([24,1,20,2,4,3,5,8,10,9,7,11,12,13,14,15])),meta:{eyebrow:`KNOWLEDGE BASE`,title:`routes.knowledge.title`}},{path:`/knowledge/:scope/:spaceId/:projectId/:mode/:itemKind/:itemId`,name:`project-knowledge-item`,component:()=>Z(()=>import(`./KnowledgePage-OUT07aKH.js`),__vite__mapDeps([24,1,20,2,4,3,5,8,10,9,7,11,12,13,14,15])),meta:{eyebrow:`KNOWLEDGE BASE`,title:`routes.knowledge.title`}},{path:`/knowledge/:scope/:spaceId/:mode/:itemKind/:itemId`,name:`knowledge-item`,component:()=>Z(()=>import(`./KnowledgePage-OUT07aKH.js`),__vite__mapDeps([24,1,20,2,4,3,5,8,10,9,7,11,12,13,14,15])),meta:{eyebrow:`KNOWLEDGE BASE`,title:`routes.knowledge.title`}},{path:`/knowledge/:scope/:spaceId/:projectId/:mode`,name:`project-knowledge`,component:()=>Z(()=>import(`./KnowledgePage-OUT07aKH.js`),__vite__mapDeps([24,1,20,2,4,3,5,8,10,9,7,11,12,13,14,15])),meta:{eyebrow:`KNOWLEDGE BASE`,title:`routes.knowledge.title`}},{path:`/knowledge/:scope/:spaceId/:mode`,name:`knowledge`,component:()=>Z(()=>import(`./KnowledgePage-OUT07aKH.js`),__vite__mapDeps([24,1,20,2,4,3,5,8,10,9,7,11,12,13,14,15])),meta:{eyebrow:`KNOWLEDGE BASE`,title:`routes.knowledge.title`}},{path:`/review`,name:`review`,component:()=>Z(()=>import(`./ReviewPage-DUeyu7E8.js`),__vite__mapDeps([25,1,2,8,10,11])),meta:{eyebrow:`REVIEW WORKSPACE`,title:`routes.review.title`,description:`routes.review.description`}},{path:`/connections`,name:`connections`,component:()=>Z(()=>import(`./ConnectionsPage-D5J91x6d.js`),__vite__mapDeps([26,1,2,7,8,10,27])),meta:{eyebrow:`SERVICE CONNECTIONS`,title:`routes.connections.title`,description:`routes.connections.description`}},{path:`/settings`,name:`settings`,component:()=>Z(()=>import(`./SettingsPage-BMuASSzQ.js`),__vite__mapDeps([28,1,2,7,8,14,29])),meta:{eyebrow:``,title:`routes.settings.title`}},{path:`/about`,name:`about`,component:()=>Z(()=>import(`./AboutPage-CftRexSY.js`),__vite__mapDeps([30,1,31,7,32])),meta:{eyebrow:`FULI`,title:`routes.about.title`}},{path:`/:pathMatch(.*)*`,redirect:`/`}],scrollBehavior:()=>({top:0})});Q.beforeEach(e=>e.path!==`/`||typeof window>`u`?!0:ze(window.location.hash)??!0),Q.afterEach(e=>{J(e.meta.title)});var $=y(Ie);$.use(E()),$.use(S),$.use(Q),await Q.isReady(),$.mount(`#app`);
2
+ import{$ as e,D as t,I as n,L as r,N as i,O as a,Q as o,_ as s,a as c,b as l,d as u,f as d,g as f,h as p,i as m,j as h,k as g,m as _,n as v,o as y,p as b,q as x,r as S,t as C,tt as w,x as T}from"./i18n-CWfd8Dtt.js";import{s as E,t as D}from"./console-DMvHxKf9.js";import{m as ee}from"./useApi-CROJJdhE-BLQiPVw0.js";import{i as O,n as k,r as A,t as j}from"./vue-router-DN8x6iY1.js";import{t as M}from"./fuli-logo-Bu9WBuQe.js";import{t as te}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{n as ne,t as re}from"./paths-CDREouhi.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var N={name:`fuli-context`,version:`0.7.4-beta.2`,description:`Local-first collaboration relationship graph for AI agents.`,type:`module`,files:[`README.zh-CN.md`,`npm-shrinkwrap.json`,`src/`,`dist/web/`,`docs/external-knowledge-architecture.md`,`examples/external-knowledge/markdown-folder.mjs`,`graph-provider/Dockerfile`,`graph-provider/pyproject.toml`,`graph-provider/fuli_graph/*.py`,`graph-provider/fuli_graph/**/*.py`,`skills/`,`compose.graphiti.yml`],bin:{fl:`src/cli.js`,fuli:`src/cli.js`},keywords:[`ai-agent`,`mcp`,`context`,`knowledge-graph`,`local-first`,`codex`,`claude-code`],scripts:{mcp:`node src/mcp-server.js`,dev:`run-p dev:server dev:web`,"dev:server":`node src/server.js`,"dev:web":`vite`,build:`run-s typecheck:web build:web`,"build:web":`vite build`,"typecheck:web":`vue-tsc --noEmit -p tsconfig.app.json`,"test:node":`node --test`,"test:web":`vitest run --config vitest.config.ts`,"test:package":`node scripts/package-smoke.js`,"test:knowledge:live":`node acceptance/knowledge-live.js`,"test:external-knowledge:live":`node scripts/validate-external-knowledge-live.js`,start:`node src/server.js`,"graph:setup":`node src/graphiti/setup.js`,"graph:up":`docker compose -f compose.graphiti.yml up -d --build`,"graph:down":`docker compose -f compose.graphiti.yml down`,"test:structure":`node --test test/source-structure.test.js`,pretest:`npm run build:web`,test:`run-s typecheck:web test:node test:web`,prepack:`npm run build`,prepublishOnly:`npm test`},engines:{node:`>=24.12`},repository:{type:`git`,url:`git+https://github.com/JevonsCode/fuli.git`},homepage:`https://github.com/JevonsCode/fuli#readme`,bugs:{url:`https://github.com/JevonsCode/fuli/issues`},publishConfig:{access:`public`},license:`Apache-2.0`,dependencies:{"@hono/node-server":`2.0.12`,"@modelcontextprotocol/sdk":`^1.29.0`,zod:`^4.4.3`},devDependencies:{"@types/d3":`^7.4.3`,"@types/node":`^24.13.3`,"@vitejs/plugin-vue":`^6.0.8`,"@vue/test-utils":`^2.4.11`,"brace-expansion":`5.0.9`,d3:`^7.9.0`,gsap:`^3.15.0`,jsdom:`^29.1.1`,linkedom:`^0.18.12`,"npm-run-all2":`^9.0.2`,pinia:`^4.0.2`,typescript:`~6.0.0`,vite:`^8.1.5`,vitest:`^4.1.10`,vue:`^3.5.40`,"vue-i18n":`^11.4.8`,"vue-router":`^5.2.0`,"vue-tsc":`^3.3.8`},overrides:{"@modelcontextprotocol/sdk":{"@hono/node-server":`2.0.12`},"brace-expansion":`$brace-expansion`,"fast-uri":`3.1.5`}}.version,ie=[`aria-label`],ae={class:`brand-mark-wrap`},P=[`src`],F={class:`brand-copy`},I={class:`brand-title-row`},L={class:`brand-name`},R={class:`brand-version`},z={class:`brand-title-row`},B={class:`brand-name`},V={class:`brand-version`},H=te(T({__name:`BrandEasterEgg`,setup(n){let r=x(0),i=x(!1),l=x(!1),d=!1;function p(){r.value+=1,i.value=!0}function m(){i.value=!1}function h(){d=!1,l.value=!1}function v(e){e.key===`Tab`&&(d=!0)}function y(){l.value=d}function b(){l.value=!1}return a(()=>{window.addEventListener(`pointerdown`,h,!0),window.addEventListener(`keydown`,v,!0)}),t(()=>{window.removeEventListener(`pointerdown`,h,!0),window.removeEventListener(`keydown`,v,!0)}),(t,n)=>(g(),s(`button`,{class:e([`brand-block`,{"is-sparkling":i.value,"is-keyboard-focused":l.value}]),type:`button`,"aria-label":o(c)(`console.brandEffect.aria`),onClick:p,onFocus:y,onBlur:b},[_(`span`,ae,[_(`img`,{class:`brand-mark`,src:o(M),alt:``,"aria-hidden":`true`},null,8,P),i.value?(g(),s(`span`,{key:`orbit-${r.value}`,class:`brand-orbit`,"aria-hidden":`true`})):f(``,!0)]),_(`span`,F,[_(`span`,I,[_(`span`,L,w(o(c)(`common.brand`)),1),_(`span`,R,`v`+w(o(N)),1)]),n[0]||=_(`span`,{class:`brand-subtitle`},`Context Graph`,-1),i.value?(g(),s(`span`,{key:`copy-reflection-${r.value}`,class:`brand-copy-reflection`,"aria-hidden":`true`,onAnimationend:u(m,[`self`])},[_(`span`,z,[_(`span`,B,w(o(c)(`common.brand`)),1),_(`span`,V,`v`+w(o(N)),1)])],32)):f(``,!0)])],42,ie))}}),[[`__scopeId`,`data-v-efd904c7`]]),U=[`aria-label`],W=[`lang`,`aria-label`,`aria-pressed`,`onClick`],G=T({__name:`LocaleSwitcher`,setup(e){let t=b(()=>v()),n={"zh-CN":`中`,"en-US":`EN`};function r(e){e!==t.value&&m(e)}return(e,i)=>(g(),s(`div`,{class:`locale-switcher`,role:`group`,"aria-label":o(c)(`common.language.label`)},[(g(!0),s(d,null,h(o(C),e=>(g(),s(`button`,{key:e,type:`button`,lang:e,"aria-label":o(c)(e===`zh-CN`?`common.language.chinese`:`common.language.english`),"aria-pressed":t.value===e,onClick:t=>r(e)},w(n[e]),9,W))),128))],8,U))}}),K=[`routes.`,`common.`];function q(e,t=``){let n=typeof e==`string`&&e?e:t;return K.some(e=>n.startsWith(e))?c(n):n}function J(e){if(typeof document>`u`)return;let t=q(e,`routes.overview.title`);document.title=`${t} · ${c(`common.brand`)}`}var oe={class:`app-shell`},se={class:`sidebar`},ce=[`aria-label`],le={class:`nav-section-label`},ue={class:`nav-label`},de={class:`nav-section-label nav-space-label`},fe={class:`nav-copy`},pe={class:`nav-copy`},me={class:`nav-copy`},he={class:`nav-section-label nav-public-label`},ge={class:`nav-copy`},_e={class:`nav-section-label nav-tool-label`},ve={class:`nav-label`},ye={class:`nav-label`},be={class:`nav-label`},xe={class:`nav-section-label nav-about-label`},Se={class:`nav-label`},Ce={class:`nav-label`},we={class:`sidebar-foot`},Te=[`aria-label`],Ee={class:`runtime-status`},De={class:`runtime-status`},Oe={class:`workspace`},ke={class:`topbar`},Ae={class:`topbar-heading`},je={key:0,class:`eyebrow`},Y={key:1,class:`topbar-description`},Me={class:`topbar-actions`},Ne={key:0,class:`mode-chip`},Pe={key:1,class:`settings-save-button`,form:`settings-form`,type:`submit`},Fe=T({__name:`ConsoleLayout`,setup(t){let u=D(),m=ee(),h=b(()=>u.activePersonalSpace?.id??`current`),v=b(()=>ne(h.value,`graph`)),y=b(()=>re(`personal`,h.value,`directory`)),x=b(()=>q(m.meta.title,`routes.overview.title`)),S=b(()=>String(m.meta.eyebrow??`LOCAL + FEDERATED`)),C=b(()=>q(m.meta.description)),T=b(()=>u.publicRuntimeStatus===`ready`),E=b(()=>u.publicRuntimeStatus===`ready`?c(`console.services.publicReady`):u.publicRuntimeStatus===`error`?c(`console.services.publicError`):c(`console.services.publicOffline`)),O=b(()=>u.publicRuntimeStatus===`ready`?c(`console.services.publicAvailable`):u.publicRuntimeStatus===`error`?c(`console.services.localUnaffected`):c(`console.services.localOnly`)),A=b(()=>u.state?.capabilities?.browsePublicProjects!==!1),M=b(()=>{let e=u.state?.capabilities;return e?.submitKnowledge!==!1||e?.reviewProposals===!0});return a(()=>{u.runtimeStatus===`idle`&&u.refresh()}),n(()=>{J(m.meta.title)}),(t,n)=>(g(),s(`div`,oe,[_(`aside`,se,[l(H),_(`nav`,{class:`primary-nav`,"aria-label":o(c)(`console.navigation.aria`)},[_(`p`,le,w(o(c)(`console.navigation.workspace`)),1),l(o(j),{to:`/`,"exact-active-class":`is-active`},{default:r(()=>[n[2]||=_(`span`,{class:`nav-icon nav-icon-overview`,"aria-hidden":`true`},null,-1),_(`span`,ue,w(o(c)(`console.navigation.overview`)),1)]),_:1}),_(`p`,de,w(o(c)(`console.navigation.personalSpace`)),1),l(o(j),{class:`space-nav-button personal-profile-button`,to:`/preferences`,"active-class":`is-active`},{default:r(()=>[n[3]||=_(`span`,{class:`nav-icon nav-icon-personal-profile`,"aria-hidden":`true`},null,-1),_(`span`,fe,[_(`strong`,null,w(o(c)(`console.navigation.preferences`)),1),_(`small`,null,w(o(c)(`console.navigation.preferencesMeta`)),1)])]),_:1}),l(o(j),{class:`space-nav-button knowledge-organizer-button`,to:`/organize`,"active-class":`is-active`},{default:r(()=>[n[4]||=_(`span`,{class:`nav-icon nav-icon-knowledge-organizer`,"aria-hidden":`true`},null,-1),_(`span`,pe,[_(`strong`,null,w(o(c)(`console.navigation.organizer`)),1),_(`small`,null,w(o(c)(`console.navigation.organizerMeta`)),1)])]),_:1}),l(o(j),{class:`space-nav-button personal-space-button`,to:v.value,"active-class":`is-active`},{default:r(()=>[n[5]||=_(`span`,{class:`nav-icon nav-icon-personal-project`,"aria-hidden":`true`},null,-1),_(`span`,me,[_(`strong`,null,w(o(c)(`console.navigation.personalProjects`)),1),_(`small`,null,w(o(c)(`console.navigation.personalProjectsMeta`)),1)])]),_:1},8,[`to`]),A.value?(g(),s(d,{key:0},[_(`p`,he,w(o(c)(`console.navigation.publicSpace`)),1),l(o(j),{class:`space-nav-button public-space-button`,to:`/public-projects`,"active-class":`is-active`},{default:r(()=>[n[6]||=_(`span`,{class:`nav-icon nav-icon-public-project`,"aria-hidden":`true`},null,-1),_(`span`,ge,[_(`strong`,null,w(o(c)(`console.navigation.publicProjects`)),1),_(`small`,null,w(o(c)(`console.navigation.publicProjectsMeta`)),1)])]),_:1})],64)):f(``,!0),_(`p`,_e,w(o(c)(`console.navigation.governance`)),1),l(o(j),{to:y.value,"active-class":`is-active`},{default:r(()=>[n[7]||=_(`span`,{class:`nav-icon nav-icon-knowledge-graph`,"aria-hidden":`true`},null,-1),_(`span`,ve,w(o(c)(`console.navigation.knowledge`)),1)]),_:1},8,[`to`]),M.value?(g(),p(o(j),{key:1,to:`/review`,"active-class":`is-active`},{default:r(()=>[n[8]||=_(`span`,{class:`nav-icon nav-icon-review`,"aria-hidden":`true`},null,-1),_(`span`,ye,w(o(c)(`console.navigation.review`)),1)]),_:1})):f(``,!0),l(o(j),{to:`/connections`,"active-class":`is-active`},{default:r(()=>[n[9]||=_(`span`,{class:`nav-icon nav-icon-connections`,"aria-hidden":`true`},null,-1),_(`span`,be,w(o(c)(`console.navigation.connections`)),1)]),_:1}),_(`p`,xe,w(o(c)(`console.navigation.aboutSection`)),1),l(o(j),{to:`/settings`,"active-class":`is-active`},{default:r(()=>[n[10]||=_(`span`,{class:`nav-icon nav-icon-settings`,"aria-hidden":`true`},null,-1),_(`span`,Se,w(o(c)(`console.navigation.settings`)),1)]),_:1}),l(o(j),{to:`/about`,"active-class":`is-active`},{default:r(()=>[n[11]||=_(`span`,{class:`nav-icon nav-icon-about`,"aria-hidden":`true`},null,-1),_(`span`,Ce,w(o(c)(`console.navigation.about`)),1)]),_:1})],8,ce),_(`div`,we,[_(`div`,{class:`service-runtime-list`,"aria-label":o(c)(`console.services.aria`)},[_(`div`,Ee,[_(`span`,{class:e([`status-dot`,o(u).runtimeStatus])},null,2),_(`div`,null,[_(`strong`,null,w(o(u).runtimeStatus===`ready`?o(c)(`console.services.localReady`):o(u).runtimeStatus===`error`?o(c)(`console.services.localError`):o(c)(`console.services.localConnecting`)),1),n[12]||=_(`small`,null,`Graphiti / Neo4j`,-1)])]),_(`div`,De,[_(`span`,{class:e([`status-dot`,o(u).publicRuntimeStatus])},null,2),_(`div`,null,[_(`strong`,null,w(E.value),1),_(`small`,null,w(O.value),1)])])],8,Te)])]),_(`main`,Oe,[_(`header`,ke,[_(`div`,Ae,[S.value?(g(),s(`p`,je,w(S.value),1)):f(``,!0),_(`h2`,null,w(x.value),1),C.value?(g(),s(`p`,Y,w(C.value),1)):f(``,!0)]),_(`div`,Me,[T.value?(g(),s(`span`,Ne,w(o(c)(`console.publicReady`)),1)):f(``,!0),o(m).name===`settings`?(g(),s(`button`,Pe,w(o(c)(`settings.save`)),1)):f(``,!0),l(G),_(`button`,{class:`quiet-button`,type:`button`,onClick:n[0]||=(...e)=>o(u).refresh&&o(u).refresh(...e)},w(o(c)(`common.actions.refresh`)),1)])]),o(u).feedback?(g(),s(`button`,{key:0,class:e([`feedback feedback-button`,{success:o(u).feedback.tone===`success`}]),type:`button`,"aria-live":`polite`,onClick:n[1]||=(...e)=>o(u).clearFeedback&&o(u).clearFeedback(...e)},w(o(u).feedback.message),3)):f(``,!0),l(o(k),null,{default:r(({Component:e})=>[(g(),p(i(e)))]),_:1})])]))}}),Ie=T({__name:`App`,setup(e){return(e,t)=>(g(),p(Fe))}}),Le=`modulepreload`,Re=function(e){return`/`+e},X={},Z=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}r=o(t.map(t=>{if(t=Re(t,n),t=s(t),t in X)return;X[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:Le,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})};function ze(e){let t=e.match(/^#\/knowledge\/([^/?#]+)\/([^/?#]+)\/(entity|relationship)\/([^/?#]+)(?:\?([^#]*))?$/);if(!t)return null;let[,n,r,i,a,o]=t;return`/knowledge/${n}/${r}/directory/${i}/${a}${o?`?${o}`:``}`}var Q=A({history:O(`/`),routes:[{path:`/`,name:`overview`,component:()=>Z(()=>import(`./OverviewPage-CHE6XhdS.js`),__vite__mapDeps([0,1,2,3,4,5])),meta:{eyebrow:``,title:`routes.overview.title`}},{path:`/preferences`,name:`personal-profile`,component:()=>Z(()=>import(`./PersonalProfilePage-CXXiabUy.js`),__vite__mapDeps([6,1,2,3,4,7,8,9,10,11,12,13,14,15,16])),meta:{eyebrow:`PERSONAL LENS`,title:`routes.preferences.title`,description:`routes.preferences.description`}},{path:`/preferences/writing`,name:`writing-taste`,component:()=>Z(()=>import(`./WritingTastePage-B9BCYIwQ.js`),__vite__mapDeps([17,1,2,3,4,7,9,8,10,11,12,18])),meta:{eyebrow:``,title:`routes.writingTaste.title`}},{path:`/personal/:spaceId/projects/:projectId/:mode/:itemKind/:itemId`,name:`personal-project-item`,component:()=>Z(()=>import(`./PersonalProjectsPage-d2wYGW8n.js`),__vite__mapDeps([19,1,20,2,4,3,5,8,10,9,7,11,12,13,14,15])),meta:{eyebrow:`PERSONAL PROJECT`,title:`routes.personalProjects.title`}},{path:`/personal/:spaceId/projects/:mode/:itemKind/:itemId`,name:`personal-projects-item`,component:()=>Z(()=>import(`./PersonalProjectsPage-d2wYGW8n.js`),__vite__mapDeps([19,1,20,2,4,3,5,8,10,9,7,11,12,13,14,15])),meta:{eyebrow:`PERSONAL PROJECTS`,title:`routes.personalProjects.title`,description:`routes.personalProjects.description`}},{path:`/personal/:spaceId/projects/:mode`,name:`personal-projects`,component:()=>Z(()=>import(`./PersonalProjectsPage-d2wYGW8n.js`),__vite__mapDeps([19,1,20,2,4,3,5,8,10,9,7,11,12,13,14,15])),meta:{eyebrow:`PERSONAL PROJECTS`,title:`routes.personalProjects.title`,description:`routes.personalProjects.description`}},{path:`/personal/:spaceId/projects/:projectId/:mode`,name:`personal-project`,component:()=>Z(()=>import(`./PersonalProjectsPage-d2wYGW8n.js`),__vite__mapDeps([19,1,20,2,4,3,5,8,10,9,7,11,12,13,14,15])),meta:{eyebrow:`PERSONAL PROJECT`,title:`routes.personalProjects.title`}},{path:`/organize`,name:`knowledge-organizer`,component:()=>Z(()=>import(`./KnowledgeOrganizerPage-BebUDiHt.js`),__vite__mapDeps([21,1,2,7,8,10,9,11,12,13,14,15,22])),meta:{eyebrow:`KNOWLEDGE CLASSIFICATION`,title:`routes.organizer.title`}},{path:`/public-projects`,name:`public-projects`,component:()=>Z(()=>import(`./PublicProjectsPage-hxLShtnZ.js`),__vite__mapDeps([23,1,2,4,5,8,10])),meta:{eyebrow:`PUBLIC PROJECTS`,title:`routes.publicProjects.title`,description:`routes.publicProjects.description`}},{path:`/knowledge`,name:`knowledge-default`,component:()=>Z(()=>import(`./KnowledgePage-OUT07aKH.js`),__vite__mapDeps([24,1,20,2,4,3,5,8,10,9,7,11,12,13,14,15])),meta:{eyebrow:`KNOWLEDGE BASE`,title:`routes.knowledge.title`}},{path:`/knowledge/:scope/:spaceId/:projectId/:mode/:itemKind/:itemId`,name:`project-knowledge-item`,component:()=>Z(()=>import(`./KnowledgePage-OUT07aKH.js`),__vite__mapDeps([24,1,20,2,4,3,5,8,10,9,7,11,12,13,14,15])),meta:{eyebrow:`KNOWLEDGE BASE`,title:`routes.knowledge.title`}},{path:`/knowledge/:scope/:spaceId/:mode/:itemKind/:itemId`,name:`knowledge-item`,component:()=>Z(()=>import(`./KnowledgePage-OUT07aKH.js`),__vite__mapDeps([24,1,20,2,4,3,5,8,10,9,7,11,12,13,14,15])),meta:{eyebrow:`KNOWLEDGE BASE`,title:`routes.knowledge.title`}},{path:`/knowledge/:scope/:spaceId/:projectId/:mode`,name:`project-knowledge`,component:()=>Z(()=>import(`./KnowledgePage-OUT07aKH.js`),__vite__mapDeps([24,1,20,2,4,3,5,8,10,9,7,11,12,13,14,15])),meta:{eyebrow:`KNOWLEDGE BASE`,title:`routes.knowledge.title`}},{path:`/knowledge/:scope/:spaceId/:mode`,name:`knowledge`,component:()=>Z(()=>import(`./KnowledgePage-OUT07aKH.js`),__vite__mapDeps([24,1,20,2,4,3,5,8,10,9,7,11,12,13,14,15])),meta:{eyebrow:`KNOWLEDGE BASE`,title:`routes.knowledge.title`}},{path:`/review`,name:`review`,component:()=>Z(()=>import(`./ReviewPage-DUeyu7E8.js`),__vite__mapDeps([25,1,2,8,10,11])),meta:{eyebrow:`REVIEW WORKSPACE`,title:`routes.review.title`,description:`routes.review.description`}},{path:`/connections`,name:`connections`,component:()=>Z(()=>import(`./ConnectionsPage-D5J91x6d.js`),__vite__mapDeps([26,1,2,7,8,10,27])),meta:{eyebrow:`SERVICE CONNECTIONS`,title:`routes.connections.title`,description:`routes.connections.description`}},{path:`/settings`,name:`settings`,component:()=>Z(()=>import(`./SettingsPage-BMuASSzQ.js`),__vite__mapDeps([28,1,2,7,8,14,29])),meta:{eyebrow:``,title:`routes.settings.title`}},{path:`/about`,name:`about`,component:()=>Z(()=>import(`./AboutPage-CftRexSY.js`),__vite__mapDeps([30,1,31,7,32])),meta:{eyebrow:`FULI`,title:`routes.about.title`}},{path:`/:pathMatch(.*)*`,redirect:`/`}],scrollBehavior:()=>({top:0})});Q.beforeEach(e=>e.path!==`/`||typeof window>`u`?!0:ze(window.location.hash)??!0),Q.afterEach(e=>{J(e.meta.title)});var $=y(Ie);$.use(E()),$.use(S),$.use(Q),await Q.isReady(),$.mount(`#app`);
@@ -9,7 +9,7 @@
9
9
  />
10
10
  <link rel="icon" type="image/png" href="/assets/fuli-logo-ER1wQ8Kk.png" />
11
11
  <title>复利 · Context Graph</title>
12
- <script type="module" crossorigin src="/assets/index-F5e2sQ7p.js"></script>
12
+ <script type="module" crossorigin src="/assets/index-nP5p5OaY.js"></script>
13
13
  <link rel="modulepreload" crossorigin href="/assets/i18n-CWfd8Dtt.js">
14
14
  <link rel="modulepreload" crossorigin href="/assets/console-DMvHxKf9.js">
15
15
  <link rel="modulepreload" crossorigin href="/assets/useApi-CROJJdhE-BLQiPVw0.js">
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "fuli-context",
3
- "version": "0.7.4-beta.1",
3
+ "version": "0.7.4-beta.2",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "fuli-context",
9
- "version": "0.7.4-beta.1",
9
+ "version": "0.7.4-beta.2",
10
10
  "license": "Apache-2.0",
11
11
  "dependencies": {
12
12
  "@hono/node-server": "2.0.12",
@@ -3969,9 +3969,9 @@
3969
3969
  "license": "MIT"
3970
3970
  },
3971
3971
  "node_modules/nanoid": {
3972
- "version": "3.3.16",
3973
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz",
3974
- "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==",
3972
+ "version": "3.3.18",
3973
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz",
3974
+ "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==",
3975
3975
  "dev": true,
3976
3976
  "funding": [
3977
3977
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fuli-context",
3
- "version": "0.7.4-beta.1",
3
+ "version": "0.7.4-beta.2",
4
4
  "description": "Local-first collaboration relationship graph for AI agents.",
5
5
  "type": "module",
6
6
  "files": [
@@ -32,7 +32,7 @@ const RECALL_INTENTS = Object.freeze([
32
32
  },
33
33
  {
34
34
  category: 'runbook_method',
35
- pattern: /(?:方法|方式|流程|步骤|怎么做|如何做|runbook|workflow|procedure|how to)/iu,
35
+ pattern: /(?:怎么(?:做|办|处理|操作|走)?|如何(?:做|处理|操作|进行)?|怎样(?:做|处理|操作)?|(?:什么|哪(?:个|种)|有没有|是否有|给我|提供|使用|采用|遵循|按照|沿用|走).{0,16}(?:方法|方式|流程|步骤)|(?:方法|方式|流程|步骤).{0,16}(?:是什么|有哪些|怎么|如何|怎样|吗|呢|?|\?)|\brunbook\b|\bprocedure\b|\bhow\s+to\b|(?:what|which|show|give|use|follow|existing|documented).{0,24}\bworkflow\b)/iu,
36
36
  queries: ['方法 方式 流程 步骤 runbook workflow procedure']
37
37
  },
38
38
  {
@@ -48,7 +48,9 @@ export const TASK_KNOWLEDGE_RETRIEVAL_GUIDANCE = Object.freeze({
48
48
  focused_queries:
49
49
  'Use one to four focused action, artifact, target-system, or identifier queries; never use the full conversational request as the only query.',
50
50
  scope:
51
- 'Search only the exact active personal project, its explicitly inheritable knowledge, and the bounded personal-global profile.'
51
+ 'Search only the exact active personal project, its explicitly inheritable knowledge, and the bounded personal-global profile.',
52
+ candidate_selection:
53
+ 'Treat automatic matches as candidates. Cite only items that materially support the task; if all are irrelevant, use noMatchSourceMarker.'
52
54
  });
53
55
 
54
56
  export function planTaskKnowledgeRecall(taskPrompt) {
@@ -67,9 +69,9 @@ export function planTaskKnowledgeRecall(taskPrompt) {
67
69
  if (!matched.length) {
68
70
  return { status: 'not_needed', trigger_categories: [], queries: [] };
69
71
  }
70
- const queries = unique(matched.flatMap(({ queries: values }) => values));
71
- const distinctive = distinctivePromptQuery(prompt);
72
- if (distinctive) queries.push(distinctive);
72
+ const focus = distinctivePromptTerms(prompt).join(' ').slice(0, 180);
73
+ const queries = unique(matched.flatMap(({ queries: values }) => values)
74
+ .map((query) => focus ? `${focus} ${query}` : query));
73
75
  return {
74
76
  status: 'planned',
75
77
  trigger_categories: matched.map(({ category }) => category),
@@ -85,7 +87,7 @@ export async function recallTaskKnowledge(application, resolution, taskPrompt) {
85
87
  status: 'project_unresolved',
86
88
  trigger_categories: plan.trigger_categories,
87
89
  query_count: plan.queries.length,
88
- guidance: TASK_KNOWLEDGE_RETRIEVAL_GUIDANCE,
90
+ guidance: taskKnowledgeRetrievalGuidance(),
89
91
  facts: [],
90
92
  entities: []
91
93
  };
@@ -107,12 +109,19 @@ export async function recallTaskKnowledge(application, resolution, taskPrompt) {
107
109
  .filter(({ status }) => status === 'fulfilled')
108
110
  .map(({ value }) => value);
109
111
  const failedQueryCount = settlements.length - results.length;
112
+ const focusTerms = distinctivePromptTerms(singleLine(taskPrompt).slice(0, 8192));
110
113
  const facts = rankedUnique(
111
- results.flatMap(({ facts = [] }) => facts),
114
+ filterRecallCandidates(
115
+ results.flatMap(({ facts = [] }) => facts),
116
+ focusTerms
117
+ ),
112
118
  'relationship'
113
119
  ).slice(0, MAX_ITEMS_PER_KIND).map(compactFact);
114
120
  const entities = rankedUnique(
115
- results.flatMap(({ entities = [] }) => entities),
121
+ filterRecallCandidates(
122
+ results.flatMap(({ entities = [] }) => entities),
123
+ focusTerms
124
+ ),
116
125
  'entity'
117
126
  ).slice(0, MAX_ITEMS_PER_KIND).map(compactEntity);
118
127
  const sourceMarker = createFuliSourceMarker({
@@ -130,7 +139,7 @@ export async function recallTaskKnowledge(application, resolution, taskPrompt) {
130
139
  failed_query_count: failedQueryCount,
131
140
  trigger_categories: plan.trigger_categories,
132
141
  query_count: plan.queries.length,
133
- guidance: TASK_KNOWLEDGE_RETRIEVAL_GUIDANCE,
142
+ guidance: taskKnowledgeRetrievalGuidance(),
134
143
  ...(searched ? {
135
144
  sourceMarker,
136
145
  noMatchSourceMarker: createFuliSourceMarker({
@@ -147,12 +156,16 @@ function recallWithoutSearch(status, plan) {
147
156
  status,
148
157
  trigger_categories: plan.trigger_categories,
149
158
  query_count: plan.queries.length,
150
- guidance: TASK_KNOWLEDGE_RETRIEVAL_GUIDANCE,
159
+ guidance: taskKnowledgeRetrievalGuidance(),
151
160
  facts: [],
152
161
  entities: []
153
162
  };
154
163
  }
155
164
 
165
+ function taskKnowledgeRetrievalGuidance() {
166
+ return { ...TASK_KNOWLEDGE_RETRIEVAL_GUIDANCE };
167
+ }
168
+
156
169
  function rankedUnique(items, itemKind) {
157
170
  const selected = new Map();
158
171
  for (const item of items) {
@@ -209,9 +222,13 @@ function compactItem(item, content) {
209
222
  };
210
223
  }
211
224
 
212
- function distinctivePromptQuery(prompt) {
225
+ function distinctivePromptTerms(prompt) {
213
226
  const quoted = [...prompt.matchAll(/[“”"']([^“”"']{2,80})[“”"']/gu)]
214
227
  .map((match) => match[1]);
228
+ const productPhrases = prompt.match(
229
+ /\b[A-Z][A-Za-z0-9]*(?:[ \t]+[A-Z][A-Za-z0-9]*){1,5}\b/gu
230
+ ) ?? [];
231
+ const acronyms = prompt.match(/\b[A-Z]{2,}[A-Z0-9]*\b/gu) ?? [];
215
232
  const versions = prompt.match(
216
233
  /\bv?\d+\.\d+(?:\.\d+)?(?:-[0-9A-Za-z.-]+)?\b/gu
217
234
  ) ?? [];
@@ -221,10 +238,44 @@ function distinctivePromptQuery(prompt) {
221
238
  const urls = [...prompt.matchAll(/https?:\/\/[^\s<>()]+/gu)]
222
239
  .map((match) => safeUrlSearchTerm(match[0]))
223
240
  .filter(Boolean);
224
- return unique([...quoted, ...versions, ...identifiers, ...urls])
225
- .slice(0, 4)
226
- .join(' ')
227
- .slice(0, 180);
241
+ return unique([
242
+ ...quoted,
243
+ ...productPhrases,
244
+ ...acronyms,
245
+ ...identifiers,
246
+ ...urls,
247
+ ...versions
248
+ ]).slice(0, 4);
249
+ }
250
+
251
+ function filterRecallCandidates(items, focusTerms) {
252
+ const focusTokens = recallFocusTokens(focusTerms);
253
+ if (!focusTokens.length) return items;
254
+ return items.filter((item) =>
255
+ Boolean(item?.defined_project_id) || recallItemMatchesFocus(item, focusTokens));
256
+ }
257
+
258
+ function recallItemMatchesFocus(item, focusTokens) {
259
+ const text = singleLine([
260
+ item?.key,
261
+ item?.source_entity,
262
+ item?.target_entity,
263
+ item?.relationship,
264
+ item?.fact,
265
+ item?.name,
266
+ item?.type,
267
+ item?.summary,
268
+ ...(Array.isArray(item?.source_uris) ? item.source_uris : [])
269
+ ].filter(Boolean).join(' ')).toLocaleLowerCase('en-US');
270
+ return focusTokens.some((token) => text.includes(token));
271
+ }
272
+
273
+ function recallFocusTokens(terms) {
274
+ return unique(terms.flatMap((term) => [
275
+ ...(term.match(/[\p{Script=Han}]{2,}/gu) ?? []),
276
+ ...(term.match(/[A-Za-z][A-Za-z0-9_-]{2,}/gu) ?? [])
277
+ ]).map((term) => term.toLocaleLowerCase('en-US'))
278
+ .filter((term) => !['http', 'https', 'www', 'version'].includes(term)));
228
279
  }
229
280
 
230
281
  function safeUrlSearchTerm(value) {
@@ -3,5 +3,5 @@ export const MCP_INSTRUCTIONS = [
3
3
  'Before asking user to repeat a stable project fact or method, inspect task_knowledge_recall. On miss call search_current_project_knowledge with focused action, artifact, target-system, or identifier queries; never use the whole conversational request as the only query. Search active child first, then inheritable parent via authorized PART_OF/USES_KNOWLEDGE_FROM, 2 hops; parent prefs need descendants/selected_projects; local_only/RELATED_TO never inherit; authority > distance > weight; equal conflicts defer.',
4
4
  'Before saying unknown, call search_knowledge_graph. Use exact IDs for extra projects. RELATED_TO suggests; ask first. Use all_local_confirmed only after consent, then rg only in safe current repo/workspace; never scan outside it. Live state: monitoring/Git MCP. External/public: search_connected_knowledge; agent_decide is response-only.',
5
5
  'Use record_decision_trace; record_knowledge_feedback on rejected/outdated/failed items. Batch durable confirmed knowledge with capture_session_knowledge; no secrets/guesses. Finish with checkpoint_task_knowledge: capture_candidates or retain_nothing. Then record_knowledge_usage.',
6
- 'Terminal-safe Markdown. Final MUST begin with sourceMarker.leadMarkdown and append sourceMarker.markdown unchanged on match. On miss use noMatchSourceMarker leadMarkdown only (empty markdown); never wrap markers in HTML.'
6
+ 'Terminal-safe Markdown. A match is a candidate only. If it supports the answer, MUST begin with sourceMarker.leadMarkdown and append sourceMarker.markdown; otherwise use noMatchSourceMarker (empty). Keep unchanged; never wrap in HTML.'
7
7
  ].join(' ');