@rubytech/create-realagent 1.0.710 → 1.0.713

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.
Files changed (45) hide show
  1. package/dist/index.js +38 -3
  2. package/package.json +2 -2
  3. package/payload/platform/lib/graph-search/dist/index.d.ts +22 -1
  4. package/payload/platform/lib/graph-search/dist/index.d.ts.map +1 -1
  5. package/payload/platform/lib/graph-search/dist/index.js +69 -39
  6. package/payload/platform/lib/graph-search/dist/index.js.map +1 -1
  7. package/payload/platform/lib/graph-search/src/__tests__/bm25-label-gate.test.ts +88 -0
  8. package/payload/platform/lib/graph-search/src/__tests__/expand-batch.test.ts +206 -0
  9. package/payload/platform/lib/graph-search/src/index.ts +100 -43
  10. package/payload/platform/plugins/docs/references/platform.md +3 -1
  11. package/payload/platform/plugins/linkedin-import/PLUGIN.md +1 -0
  12. package/payload/platform/plugins/linkedin-import/skills/linkedin-import/SKILL.md +26 -5
  13. package/payload/platform/plugins/linkedin-import/skills/linkedin-import/references/connections.md +53 -82
  14. package/payload/platform/plugins/linkedin-import/skills/linkedin-import/references/profile.md +42 -49
  15. package/payload/platform/plugins/memory/PLUGIN.md +1 -0
  16. package/payload/platform/plugins/memory/mcp/dist/index.js +48 -0
  17. package/payload/platform/plugins/memory/mcp/dist/index.js.map +1 -1
  18. package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.d.ts +33 -0
  19. package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.d.ts.map +1 -0
  20. package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.js +229 -0
  21. package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.js.map +1 -0
  22. package/payload/platform/scripts/check-sdk-oauth.mjs +178 -0
  23. package/payload/platform/scripts/redact-install-logs.sh +85 -0
  24. package/payload/platform/scripts/setup.sh +20 -3
  25. package/payload/platform/scripts/verify-skill-tool-surface.sh +255 -0
  26. package/payload/platform/templates/specialists/agents/database-operator.md +6 -2
  27. package/payload/server/chunk-U5JPRUYZ.js +12298 -0
  28. package/payload/server/maxy-edge.js +1 -1
  29. package/payload/server/public/assets/{Checkbox-CjbS9JcG.js → Checkbox-Dr9MqNdk.js} +1 -1
  30. package/payload/server/public/assets/{admin-Ce9DbUuu.js → admin-CZ1QdDIj.js} +1 -1
  31. package/payload/server/public/assets/{data-C-SxjLC9.js → data-KcxxS-x3.js} +1 -1
  32. package/payload/server/public/assets/{file-D4cbAAuo.js → file-KlvYstdJ.js} +1 -1
  33. package/payload/server/public/assets/{graph-BRD96pKD.js → graph-BjGlgDDX.js} +8 -8
  34. package/payload/server/public/assets/{house-CYsVygEQ.js → house-CyE0Xd3r.js} +1 -1
  35. package/payload/server/public/assets/{jsx-runtime-DPXE45W9.css → jsx-runtime-CPtXdEwZ.css} +1 -1
  36. package/payload/server/public/assets/{public-BTOF98iO.js → public-C1gnzTxk.js} +1 -1
  37. package/payload/server/public/assets/{share-2-B-sbkB36.js → share-2-Q9lo8ZrW.js} +1 -1
  38. package/payload/server/public/assets/{useVoiceRecorder-DLVFx3ms.js → useVoiceRecorder-BH8HP7l_.js} +1 -1
  39. package/payload/server/public/assets/{x-BNidzSAn.js → x-BwY4lg-U.js} +1 -1
  40. package/payload/server/public/data.html +6 -6
  41. package/payload/server/public/graph.html +7 -7
  42. package/payload/server/public/index.html +8 -8
  43. package/payload/server/public/public.html +5 -5
  44. package/payload/server/server.js +118 -75
  45. /package/payload/server/public/assets/{jsx-runtime-BUs3sHtV.js → jsx-runtime-BKpb2FvO.js} +0 -0
@@ -1,5 +1,5 @@
1
1
  const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/mermaid.core-C3TZA9fX.js","assets/preload-helper-BEFjQwLd.js","assets/dist-BKbAaes5.js","assets/chunk-DD-I1_y5.js","assets/chunk-U2HBQHQK-BLgNHWFf.js","assets/src-BvrHnOMG.js","assets/chunk-5PVQY5BW-CLNppenz.js","assets/chunk-ICPOFSXX-DEZT2XyQ.js","assets/_baseFor-WfS9pKAn.js","assets/isEmpty-C3Vxk1It.js","assets/chunk-336JU56O-Dszn2qEY.js","assets/chunk-5FUZZQ4R-CXZykYh_.js","assets/chunk-X2U36JSP-DHYLiYqc.js","assets/chunk-ZZ45TVLE-B5dCmOpH.js","assets/rough.esm-HAx67Hnb.js","assets/chunk-ENJZ2VHE-CuXW3Isg.js","assets/line-BhOwLD_o.js","assets/path-YdFzr2W6.js","assets/array-HeX70jSN.js","assets/chunk-BSJP7CBP-Cd9H-V61.js","assets/chunk-426QAEUC-tWQOa3-I.js","assets/chunk-XPW4576I-DBdiQ3Zy.js"])))=>i.map(i=>d[i]);
2
- import{o as e,r as t,t as n}from"./chunk-DD-I1_y5.js";import{n as r,o as i,r as a,t as o}from"./jsx-runtime-BUs3sHtV.js";import{t as s}from"./Checkbox-CjbS9JcG.js";import{t as c}from"./preload-helper-BEFjQwLd.js";var l=a(`check`,[[`path`,{d:`M20 6 9 17l-5-5`,key:`1gmf2c`}]]),u=a(`chevron-down`,[[`path`,{d:`m6 9 6 6 6-6`,key:`qrunsl`}]]),d=a(`copy`,[[`rect`,{width:`14`,height:`14`,x:`8`,y:`8`,rx:`2`,ry:`2`,key:`17jyea`}],[`path`,{d:`M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2`,key:`zix9uf`}]]),f=a(`file-code`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M10 12.5 8 15l2 2.5`,key:`1tg20x`}],[`path`,{d:`m14 12.5 2 2.5-2 2.5`,key:`yinavb`}]]),p=a(`file-text`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M10 9H8`,key:`b1mrlr`}],[`path`,{d:`M16 13H8`,key:`t4e002`}],[`path`,{d:`M16 17H8`,key:`z1uh3a`}]]),m=a(`globe`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20`,key:`13o1zl`}],[`path`,{d:`M2 12h20`,key:`9i4pu4`}]]),h=a(`mic`,[[`path`,{d:`M12 19v3`,key:`npa21l`}],[`path`,{d:`M19 10v2a7 7 0 0 1-14 0v-2`,key:`1vc78b`}],[`rect`,{x:`9`,y:`2`,width:`6`,height:`13`,rx:`3`,key:`s6n7sd`}]]),g=a(`paperclip`,[[`path`,{d:`m16 6-8.414 8.586a2 2 0 0 0 2.829 2.829l8.414-8.586a4 4 0 1 0-5.657-5.657l-8.379 8.551a6 6 0 1 0 8.485 8.485l8.379-8.551`,key:`1miecu`}]]),_=a(`pause`,[[`rect`,{x:`14`,y:`3`,width:`5`,height:`18`,rx:`1`,key:`kaeet6`}],[`rect`,{x:`5`,y:`3`,width:`5`,height:`18`,rx:`1`,key:`1wsw3u`}]]),v=a(`play`,[[`path`,{d:`M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z`,key:`10ikf1`}]]),y=a(`square-check-big`,[[`path`,{d:`M21 10.656V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h12.344`,key:`2acyp4`}],[`path`,{d:`m9 11 3 3L22 4`,key:`1pflzl`}]]),b=a(`triangle-alert`,[[`path`,{d:`m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3`,key:`wmoenq`}],[`path`,{d:`M12 9v4`,key:`juzpu7`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}]]),x=e(i(),1);async function S(e){if(navigator.clipboard)try{return await navigator.clipboard.writeText(e),!0}catch{}try{let t=document.createElement(`textarea`);t.value=e,t.style.position=`fixed`,t.style.opacity=`0`,document.body.appendChild(t),t.select();let n=document.execCommand(`copy`);return document.body.removeChild(t),n}catch{return!1}}function C(){let[e,t]=(0,x.useState)(!1),[n,r]=(0,x.useState)(new Set),[i,a]=(0,x.useState)(!1),o=(0,x.useRef)(null);(0,x.useEffect)(()=>()=>{o.current!==null&&clearTimeout(o.current)},[]);let s=(0,x.useCallback)(()=>{t(!0),r(new Set)},[]),c=(0,x.useCallback)(()=>{t(!1),r(new Set)},[]),l=(0,x.useCallback)(e=>{r(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),u=(0,x.useCallback)(e=>{e.length!==0&&r(t=>e.every(e=>t.has(e))?new Set:new Set(e))},[]),d=(0,x.useCallback)(()=>{o.current!==null&&(clearTimeout(o.current),o.current=null)},[]),f=(0,x.useCallback)(e=>({onPointerDown:()=>{o.current=setTimeout(()=>{t(!0),r(new Set([e])),o.current=null},500)},onPointerUp:d,onPointerLeave:d,onPointerCancel:d}),[d]),p=(0,x.useCallback)(e=>{a(e?`copied`:`failed`),setTimeout(()=>a(!1),1500)},[]);return{selectionMode:e,selectedItems:n,copyToast:i,longPressProps:f,enterSelection:s,exitSelection:c,toggleSelectItem:l,selectAll:u,copySelected:(0,x.useCallback)(async(e,t)=>{let r=[...n].sort(t).map(t=>e(t)).filter(Boolean);r.length>0&&p(await S(r.join(`
2
+ import{o as e,r as t,t as n}from"./chunk-DD-I1_y5.js";import{n as r,o as i,r as a,t as o}from"./jsx-runtime-BKpb2FvO.js";import{t as s}from"./Checkbox-Dr9MqNdk.js";import{t as c}from"./preload-helper-BEFjQwLd.js";var l=a(`check`,[[`path`,{d:`M20 6 9 17l-5-5`,key:`1gmf2c`}]]),u=a(`chevron-down`,[[`path`,{d:`m6 9 6 6 6-6`,key:`qrunsl`}]]),d=a(`copy`,[[`rect`,{width:`14`,height:`14`,x:`8`,y:`8`,rx:`2`,ry:`2`,key:`17jyea`}],[`path`,{d:`M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2`,key:`zix9uf`}]]),f=a(`file-code`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M10 12.5 8 15l2 2.5`,key:`1tg20x`}],[`path`,{d:`m14 12.5 2 2.5-2 2.5`,key:`yinavb`}]]),p=a(`file-text`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M10 9H8`,key:`b1mrlr`}],[`path`,{d:`M16 13H8`,key:`t4e002`}],[`path`,{d:`M16 17H8`,key:`z1uh3a`}]]),m=a(`globe`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20`,key:`13o1zl`}],[`path`,{d:`M2 12h20`,key:`9i4pu4`}]]),h=a(`mic`,[[`path`,{d:`M12 19v3`,key:`npa21l`}],[`path`,{d:`M19 10v2a7 7 0 0 1-14 0v-2`,key:`1vc78b`}],[`rect`,{x:`9`,y:`2`,width:`6`,height:`13`,rx:`3`,key:`s6n7sd`}]]),g=a(`paperclip`,[[`path`,{d:`m16 6-8.414 8.586a2 2 0 0 0 2.829 2.829l8.414-8.586a4 4 0 1 0-5.657-5.657l-8.379 8.551a6 6 0 1 0 8.485 8.485l8.379-8.551`,key:`1miecu`}]]),_=a(`pause`,[[`rect`,{x:`14`,y:`3`,width:`5`,height:`18`,rx:`1`,key:`kaeet6`}],[`rect`,{x:`5`,y:`3`,width:`5`,height:`18`,rx:`1`,key:`1wsw3u`}]]),v=a(`play`,[[`path`,{d:`M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z`,key:`10ikf1`}]]),y=a(`square-check-big`,[[`path`,{d:`M21 10.656V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h12.344`,key:`2acyp4`}],[`path`,{d:`m9 11 3 3L22 4`,key:`1pflzl`}]]),b=a(`triangle-alert`,[[`path`,{d:`m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3`,key:`wmoenq`}],[`path`,{d:`M12 9v4`,key:`juzpu7`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}]]),x=e(i(),1);async function S(e){if(navigator.clipboard)try{return await navigator.clipboard.writeText(e),!0}catch{}try{let t=document.createElement(`textarea`);t.value=e,t.style.position=`fixed`,t.style.opacity=`0`,document.body.appendChild(t),t.select();let n=document.execCommand(`copy`);return document.body.removeChild(t),n}catch{return!1}}function C(){let[e,t]=(0,x.useState)(!1),[n,r]=(0,x.useState)(new Set),[i,a]=(0,x.useState)(!1),o=(0,x.useRef)(null);(0,x.useEffect)(()=>()=>{o.current!==null&&clearTimeout(o.current)},[]);let s=(0,x.useCallback)(()=>{t(!0),r(new Set)},[]),c=(0,x.useCallback)(()=>{t(!1),r(new Set)},[]),l=(0,x.useCallback)(e=>{r(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),u=(0,x.useCallback)(e=>{e.length!==0&&r(t=>e.every(e=>t.has(e))?new Set:new Set(e))},[]),d=(0,x.useCallback)(()=>{o.current!==null&&(clearTimeout(o.current),o.current=null)},[]),f=(0,x.useCallback)(e=>({onPointerDown:()=>{o.current=setTimeout(()=>{t(!0),r(new Set([e])),o.current=null},500)},onPointerUp:d,onPointerLeave:d,onPointerCancel:d}),[d]),p=(0,x.useCallback)(e=>{a(e?`copied`:`failed`),setTimeout(()=>a(!1),1500)},[]);return{selectionMode:e,selectedItems:n,copyToast:i,longPressProps:f,enterSelection:s,exitSelection:c,toggleSelectItem:l,selectAll:u,copySelected:(0,x.useCallback)(async(e,t)=>{let r=[...n].sort(t).map(t=>e(t)).filter(Boolean);r.length>0&&p(await S(r.join(`
3
3
 
4
4
  ---
5
5
 
@@ -1 +1 @@
1
- import{r as e}from"./jsx-runtime-BUs3sHtV.js";var t=e(`rotate-ccw`,[[`path`,{d:`M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`,key:`1357e3`}],[`path`,{d:`M3 3v5h5`,key:`1xhq8a`}]]),n=e(`x`,[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]);export{t as n,n as t};
1
+ import{r as e}from"./jsx-runtime-BKpb2FvO.js";var t=e(`rotate-ccw`,[[`path`,{d:`M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`,key:`1357e3`}],[`path`,{d:`M3 3v5h5`,key:`1xhq8a`}]]),n=e(`x`,[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]);export{t as n,n as t};
@@ -5,13 +5,13 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Data — Maxy</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/data-C-SxjLC9.js"></script>
8
+ <script type="module" crossorigin src="/assets/data-KcxxS-x3.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-DD-I1_y5.js">
10
- <link rel="modulepreload" crossorigin href="/assets/jsx-runtime-BUs3sHtV.js">
11
- <link rel="modulepreload" crossorigin href="/assets/share-2-B-sbkB36.js">
12
- <link rel="modulepreload" crossorigin href="/assets/file-D4cbAAuo.js">
13
- <link rel="modulepreload" crossorigin href="/assets/house-CYsVygEQ.js">
14
- <link rel="stylesheet" crossorigin href="/assets/jsx-runtime-DPXE45W9.css">
10
+ <link rel="modulepreload" crossorigin href="/assets/jsx-runtime-BKpb2FvO.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/share-2-Q9lo8ZrW.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/file-KlvYstdJ.js">
13
+ <link rel="modulepreload" crossorigin href="/assets/house-CyE0Xd3r.js">
14
+ <link rel="stylesheet" crossorigin href="/assets/jsx-runtime-CPtXdEwZ.css">
15
15
  </head>
16
16
  <body>
17
17
  <div id="root"></div>
@@ -5,14 +5,14 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Graph — Maxy</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/graph-BRD96pKD.js"></script>
8
+ <script type="module" crossorigin src="/assets/graph-BjGlgDDX.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-DD-I1_y5.js">
10
- <link rel="modulepreload" crossorigin href="/assets/jsx-runtime-BUs3sHtV.js">
11
- <link rel="modulepreload" crossorigin href="/assets/Checkbox-CjbS9JcG.js">
12
- <link rel="modulepreload" crossorigin href="/assets/share-2-B-sbkB36.js">
13
- <link rel="modulepreload" crossorigin href="/assets/house-CYsVygEQ.js">
14
- <link rel="modulepreload" crossorigin href="/assets/x-BNidzSAn.js">
15
- <link rel="stylesheet" crossorigin href="/assets/jsx-runtime-DPXE45W9.css">
10
+ <link rel="modulepreload" crossorigin href="/assets/jsx-runtime-BKpb2FvO.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/Checkbox-Dr9MqNdk.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/share-2-Q9lo8ZrW.js">
13
+ <link rel="modulepreload" crossorigin href="/assets/house-CyE0Xd3r.js">
14
+ <link rel="modulepreload" crossorigin href="/assets/x-BwY4lg-U.js">
15
+ <link rel="stylesheet" crossorigin href="/assets/jsx-runtime-CPtXdEwZ.css">
16
16
  </head>
17
17
  <body>
18
18
  <div id="root"></div>
@@ -5,16 +5,16 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Real Agent</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/admin-Ce9DbUuu.js"></script>
8
+ <script type="module" crossorigin src="/assets/admin-CZ1QdDIj.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-DD-I1_y5.js">
10
- <link rel="modulepreload" crossorigin href="/assets/jsx-runtime-BUs3sHtV.js">
10
+ <link rel="modulepreload" crossorigin href="/assets/jsx-runtime-BKpb2FvO.js">
11
11
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-BEFjQwLd.js">
12
- <link rel="modulepreload" crossorigin href="/assets/Checkbox-CjbS9JcG.js">
13
- <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-DLVFx3ms.js">
14
- <link rel="modulepreload" crossorigin href="/assets/share-2-B-sbkB36.js">
15
- <link rel="modulepreload" crossorigin href="/assets/file-D4cbAAuo.js">
16
- <link rel="modulepreload" crossorigin href="/assets/x-BNidzSAn.js">
17
- <link rel="stylesheet" crossorigin href="/assets/jsx-runtime-DPXE45W9.css">
12
+ <link rel="modulepreload" crossorigin href="/assets/Checkbox-Dr9MqNdk.js">
13
+ <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-BH8HP7l_.js">
14
+ <link rel="modulepreload" crossorigin href="/assets/share-2-Q9lo8ZrW.js">
15
+ <link rel="modulepreload" crossorigin href="/assets/file-KlvYstdJ.js">
16
+ <link rel="modulepreload" crossorigin href="/assets/x-BwY4lg-U.js">
17
+ <link rel="stylesheet" crossorigin href="/assets/jsx-runtime-CPtXdEwZ.css">
18
18
  <link rel="stylesheet" href="/brand-defaults.css">
19
19
  </head>
20
20
  <body>
@@ -5,13 +5,13 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Real Agent</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/public-BTOF98iO.js"></script>
8
+ <script type="module" crossorigin src="/assets/public-C1gnzTxk.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-DD-I1_y5.js">
10
- <link rel="modulepreload" crossorigin href="/assets/jsx-runtime-BUs3sHtV.js">
10
+ <link rel="modulepreload" crossorigin href="/assets/jsx-runtime-BKpb2FvO.js">
11
11
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-BEFjQwLd.js">
12
- <link rel="modulepreload" crossorigin href="/assets/Checkbox-CjbS9JcG.js">
13
- <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-DLVFx3ms.js">
14
- <link rel="stylesheet" crossorigin href="/assets/jsx-runtime-DPXE45W9.css">
12
+ <link rel="modulepreload" crossorigin href="/assets/Checkbox-Dr9MqNdk.js">
13
+ <link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-BH8HP7l_.js">
14
+ <link rel="stylesheet" crossorigin href="/assets/jsx-runtime-CPtXdEwZ.css">
15
15
  <link rel="stylesheet" href="/brand-defaults.css">
16
16
  </head>
17
17
  <body>
@@ -98,7 +98,7 @@ import {
98
98
  vncLog,
99
99
  waitForExit,
100
100
  writeChromiumWrapper
101
- } from "./chunk-A5K3CFMI.js";
101
+ } from "./chunk-U5JPRUYZ.js";
102
102
 
103
103
  // ../lib/graph-trash/dist/index.js
104
104
  var require_dist = __commonJS({
@@ -10163,9 +10163,10 @@ function buildKeywordFilter(keywords, keywordMatch = "any") {
10163
10163
  };
10164
10164
  }
10165
10165
  async function bm25Only(session, params) {
10166
- const { query, accountId, limit, allowedScopes, agentSlug, keywords, keywordMatch } = params;
10166
+ const { query, accountId, limit, allowedScopes, agentSlug, keywords, keywordMatch, labels } = params;
10167
10167
  const scopeClause = allowedScopes ? "AND (node.scope IS NULL OR node.scope IN $allowedScopes)" : "";
10168
10168
  const agentClause = agentSlug ? "AND node.agents IS NOT NULL AND $agentSlug IN node.agents" : "";
10169
+ const labelClause = labels && labels.length > 0 ? "AND any(l IN labels(node) WHERE l IN $labels)" : "";
10169
10170
  const keywordFilter = buildKeywordFilter(keywords, keywordMatch);
10170
10171
  const kwClause = keywordFilter?.clause ?? "";
10171
10172
  const escaped = escapeLucene(query);
@@ -10176,6 +10177,7 @@ async function bm25Only(session, params) {
10176
10177
  WHERE node.accountId = $accountId
10177
10178
  ${scopeClause}
10178
10179
  ${agentClause}
10180
+ ${labelClause}
10179
10181
  AND ${(0, import_dist.notTrashed)("node")}
10180
10182
  ${kwClause}
10181
10183
  RETURN node, score, labels(node) AS nodeLabels, elementId(node) AS nodeId
@@ -10188,6 +10190,7 @@ async function bm25Only(session, params) {
10188
10190
  limit: int(limit),
10189
10191
  ...allowedScopes ? { allowedScopes } : {},
10190
10192
  ...agentSlug ? { agentSlug } : {},
10193
+ ...labels && labels.length > 0 ? { labels } : {},
10191
10194
  ...keywordFilter?.params ?? {}
10192
10195
  }
10193
10196
  );
@@ -10232,7 +10235,7 @@ async function hybrid(session, embed2, params) {
10232
10235
  const msg = err instanceof Error ? err.message : String(err);
10233
10236
  const bm25Hits2 = await bm25Only(session, params);
10234
10237
  const results2 = bm25Hits2.map((h) => ({ ...h, related: [] }));
10235
- return { mode: "bm25", results: results2, embedError: msg };
10238
+ return { mode: "bm25", results: results2, embedError: msg, expandMs: 0 };
10236
10239
  }
10237
10240
  const labelToIndex = await discoverIndexes(session);
10238
10241
  const keywordFilter = buildKeywordFilter(keywords, keywordMatch);
@@ -10243,7 +10246,7 @@ async function hybrid(session, embed2, params) {
10243
10246
  if (labels && labels.length > 0) {
10244
10247
  indexesToQuery = labels.map((l) => labelToIndex.get(l)).filter((idx) => idx !== void 0);
10245
10248
  if (indexesToQuery.length === 0) {
10246
- return { mode: "hybrid", results: [] };
10249
+ return { mode: "hybrid", results: [], expandMs: 0 };
10247
10250
  }
10248
10251
  } else {
10249
10252
  indexesToQuery = [...new Set(labelToIndex.values())];
@@ -10354,44 +10357,55 @@ async function hybrid(session, embed2, params) {
10354
10357
  ...node,
10355
10358
  combinedScore: VECTOR_WEIGHT * node.vectorScore + BM25_WEIGHT * node.bm25Score
10356
10359
  })).sort((a, b) => b.combinedScore - a.combinedScore).slice(0, limit);
10357
- const results = [];
10358
- for (const node of merged) {
10359
- const result = {
10360
- nodeId: node.nodeId,
10361
- labels: node.labels,
10362
- properties: node.properties,
10363
- score: node.combinedScore,
10364
- related: []
10365
- };
10366
- if (expandHops > 0) {
10367
- const expandScopeClause = allowedScopes ? "AND (related.scope IS NULL OR related.scope IN $allowedScopes)" : "";
10368
- const expandAgentClause = agentSlug ? "AND (related.agents IS NULL OR $agentSlug IN related.agents)" : "";
10369
- const expandResult = await session.run(
10370
- `MATCH (n)-[r]-(related)
10371
- WHERE elementId(n) = $nodeId
10372
- AND ${(0, import_dist.notTrashed)("related")}
10373
- ${expandScopeClause}
10374
- ${expandAgentClause}
10375
- RETURN type(r) AS relType,
10376
- CASE WHEN startNode(r) = n THEN 'outgoing' ELSE 'incoming' END AS direction,
10377
- labels(related) AS relatedLabels,
10378
- related
10379
- LIMIT 20`,
10380
- { nodeId: node.nodeId, ...scopeParams, ...agentParams }
10381
- );
10382
- for (const rec of expandResult.records) {
10383
- const related = rec.get("related");
10384
- result.related.push({
10385
- relationship: rec.get("relType"),
10386
- direction: rec.get("direction"),
10387
- labels: rec.get("relatedLabels"),
10388
- properties: plainProperties(related.properties)
10360
+ const results = merged.map((node) => ({
10361
+ nodeId: node.nodeId,
10362
+ labels: node.labels,
10363
+ properties: node.properties,
10364
+ score: node.combinedScore,
10365
+ related: []
10366
+ }));
10367
+ let expandMs = 0;
10368
+ if (expandHops > 0 && results.length > 0) {
10369
+ const expandScopeClause = allowedScopes ? "AND (related.scope IS NULL OR related.scope IN $allowedScopes)" : "";
10370
+ const expandAgentClause = agentSlug ? "AND (related.agents IS NULL OR $agentSlug IN related.agents)" : "";
10371
+ const expandStart = Date.now();
10372
+ const expandResult = await session.run(
10373
+ `UNWIND $nodeIds AS nid
10374
+ MATCH (n)-[r]-(related)
10375
+ WHERE elementId(n) = nid
10376
+ AND ${(0, import_dist.notTrashed)("related")}
10377
+ ${expandScopeClause}
10378
+ ${expandAgentClause}
10379
+ WITH nid, n, r, related
10380
+ WITH nid, collect({
10381
+ relType: type(r),
10382
+ direction: CASE WHEN startNode(r) = n THEN 'outgoing' ELSE 'incoming' END,
10383
+ relatedNodeId: elementId(related),
10384
+ relatedLabels: labels(related),
10385
+ related: related
10386
+ })[0..20] AS items
10387
+ RETURN nid, items`,
10388
+ { nodeIds: results.map((r) => r.nodeId), ...scopeParams, ...agentParams }
10389
+ );
10390
+ expandMs = Date.now() - expandStart;
10391
+ const byNodeId = new Map(results.map((r) => [r.nodeId, r]));
10392
+ for (const rec of expandResult.records) {
10393
+ const nid = rec.get("nid");
10394
+ const target = byNodeId.get(nid);
10395
+ if (!target) continue;
10396
+ const items = rec.get("items");
10397
+ for (const item of items) {
10398
+ target.related.push({
10399
+ nodeId: item.relatedNodeId,
10400
+ relationship: item.relType,
10401
+ direction: item.direction,
10402
+ labels: item.relatedLabels,
10403
+ properties: plainProperties(item.related.properties)
10389
10404
  });
10390
10405
  }
10391
10406
  }
10392
- results.push(result);
10393
10407
  }
10394
- return { mode: "hybrid", results };
10408
+ return { mode: "hybrid", results, expandMs };
10395
10409
  }
10396
10410
  function mergeBm25Hit(map, hit, normalisedScore) {
10397
10411
  const existing = map.get(hit.nodeId);
@@ -10422,18 +10436,23 @@ function plainProperties(properties) {
10422
10436
 
10423
10437
  // server/routes/admin/graph-search.ts
10424
10438
  var DEFAULT_LIMIT = 20;
10425
- var MAX_LIMIT = 100;
10439
+ var MAX_LIMIT = 2e3;
10426
10440
  var app24 = new Hono();
10427
10441
  app24.get("/", requireAdminSession, async (c) => {
10428
10442
  const sessionKey = c.var.sessionKey;
10429
10443
  const q = (c.req.query("q") ?? "").trim();
10430
10444
  const rawLimit = c.req.query("limit");
10445
+ const rawLabels = c.req.query("labels");
10431
10446
  const accountId = getAccountIdForSession(sessionKey);
10432
10447
  if (!accountId) {
10433
10448
  console.error(`[graph-search] auth-rejected endpoint="/api/admin/graph-search" reason="no account for session"`);
10434
10449
  return c.json({ error: "Account not found for session" }, 401);
10435
10450
  }
10436
10451
  if (!q) return c.json({ error: "q (search query) required" }, 400);
10452
+ const labels = rawLabels ? rawLabels.split(",").map((s) => s.trim()).filter((s) => s.length > 0) : [];
10453
+ if (labels.length === 0) {
10454
+ return c.json({ error: "Select at least one filter chip before searching." }, 400);
10455
+ }
10437
10456
  const parsedLimit = rawLimit ? parseInt(rawLimit, 10) : DEFAULT_LIMIT;
10438
10457
  const limit = Number.isFinite(parsedLimit) && parsedLimit > 0 ? Math.min(parsedLimit, MAX_LIMIT) : DEFAULT_LIMIT;
10439
10458
  const started = Date.now();
@@ -10442,21 +10461,24 @@ app24.get("/", requireAdminSession, async (c) => {
10442
10461
  const res = await hybrid(session, embed, {
10443
10462
  query: q,
10444
10463
  accountId,
10464
+ labels,
10445
10465
  limit,
10446
10466
  degradeOnEmbedFailure: true
10447
10467
  });
10448
- const elapsed = Date.now() - started;
10468
+ const total = Date.now() - started;
10449
10469
  if (res.embedError) {
10450
10470
  console.error(`[graph-search] embed-unavailable err="${res.embedError}" \u2014 bm25-only`);
10471
+ console.error(`[graph-search] embed-degraded query="${q}" results=${res.results.length}`);
10451
10472
  }
10452
- console.error(`[graph-search] query="${q}" mode=${res.mode} results=${res.results.length} ms=${elapsed}`);
10453
- const results = res.results.map((r) => ({
10454
- nodeId: r.nodeId,
10455
- labels: r.labels,
10456
- properties: r.properties,
10457
- score: r.score
10458
- }));
10459
- return c.json({ results, elapsedMs: elapsed });
10473
+ console.error(
10474
+ `[graph-search] query="${q}" labels=${labels.join(",")} limit=${limit} mode=${res.mode} results=${res.results.length} expand-ms=${res.expandMs} total-ms=${total}`
10475
+ );
10476
+ return c.json({
10477
+ results: res.results,
10478
+ mode: res.mode,
10479
+ embedError: res.embedError,
10480
+ elapsedMs: total
10481
+ });
10460
10482
  } catch (err) {
10461
10483
  const elapsed = Date.now() - started;
10462
10484
  const message = err instanceof Error ? err.message : String(err);
@@ -10558,18 +10580,35 @@ var ALL_GRAPH_LABELS = Object.freeze(
10558
10580
  var HIDDEN_BY_DEFAULT_LABELS = Object.freeze(
10559
10581
  /* @__PURE__ */ new Set(["Chunk", "GraphPreference"])
10560
10582
  );
10561
- var FILTER_EXCLUDED_LABELS = Object.freeze(
10583
+ var FILTER_TOP_LEVEL_LABELS = Object.freeze(
10562
10584
  /* @__PURE__ */ new Set([
10563
- "Message",
10564
- "UserMessage",
10565
- "AssistantMessage",
10566
- "Conversation",
10567
- "Section",
10568
- "ToolCall",
10569
- "WorkflowRun",
10570
- "WorkflowStep",
10571
- "StepResult",
10572
- "ReviewAlert"
10585
+ "LocalBusiness",
10586
+ "Service",
10587
+ "PriceSpecification",
10588
+ "OpeningHoursSpecification",
10589
+ "Organization",
10590
+ "Person",
10591
+ "UserProfile",
10592
+ "Preference",
10593
+ "AdminUser",
10594
+ "AccessGrant",
10595
+ "KnowledgeDocument",
10596
+ "DigitalDocument",
10597
+ "CreativeWork",
10598
+ "Question",
10599
+ "FAQPage",
10600
+ "DefinedTerm",
10601
+ "Review",
10602
+ "ImageObject",
10603
+ "AdminConversation",
10604
+ "PublicConversation",
10605
+ "Task",
10606
+ "Project",
10607
+ "Event",
10608
+ "Workflow",
10609
+ "OnboardingState",
10610
+ "Email",
10611
+ "EmailAccount"
10573
10612
  ])
10574
10613
  );
10575
10614
  var AGENT_ACTION_LABELS = Object.freeze(
@@ -11063,16 +11102,13 @@ app28.get("/", requireAdminSession, async (c) => {
11063
11102
  const started = Date.now();
11064
11103
  const session = getSession();
11065
11104
  try {
11066
- const excludedSet = /* @__PURE__ */ new Set([
11067
- ...HIDDEN_BY_DEFAULT_LABELS,
11068
- ...FILTER_EXCLUDED_LABELS
11069
- ]);
11105
+ const allowedSet = new Set(FILTER_TOP_LEVEL_LABELS);
11070
11106
  if (includeAgentActions) {
11071
- for (const label of AGENT_ACTION_LABELS) excludedSet.delete(label);
11107
+ for (const label of AGENT_ACTION_LABELS) allowedSet.add(label);
11072
11108
  }
11073
- const excluded = [...excludedSet];
11109
+ const allowed = [...allowedSet];
11074
11110
  const result = await session.executeRead(async (tx) => {
11075
- return await tx.run(LABELS_IN_GRAPH_CYPHER, { accountId, excluded });
11111
+ return await tx.run(LABELS_IN_GRAPH_CYPHER, { accountId, allowed });
11076
11112
  });
11077
11113
  const labels = result.records.map((r) => ({
11078
11114
  label: String(r.get("label")),
@@ -11113,7 +11149,7 @@ var LABELS_IN_GRAPH_CYPHER = `
11113
11149
  AND NOT n:Trashed
11114
11150
  AND n.deletedAt IS NULL
11115
11151
  WITH n,
11116
- [l IN labels(n) WHERE NOT l IN $excluded] AS keptLabels,
11152
+ [l IN labels(n) WHERE l IN $allowed] AS keptLabels,
11117
11153
  size([(n)--() | 1]) AS halfEdges
11118
11154
  UNWIND keptLabels AS label
11119
11155
  WITH label,
@@ -11180,6 +11216,11 @@ app29.put("/", requireAdminSession, async (c) => {
11180
11216
  console.error(
11181
11217
  `[graph-page] default-view-rejected op=save account=${accountId} reason="${validation.reason}"`
11182
11218
  );
11219
+ if (validation.code === "not-eligible-chip") {
11220
+ console.error(
11221
+ `[graph-page] default-view-save-rejected reason=not-eligible-chip label="${validation.label}" account=${accountId}`
11222
+ );
11223
+ }
11183
11224
  return c.json({ error: validation.reason }, 400);
11184
11225
  }
11185
11226
  const { labels, includeTrashed } = validation;
@@ -11213,21 +11254,23 @@ app29.put("/", requireAdminSession, async (c) => {
11213
11254
  });
11214
11255
  function validateBody2(body) {
11215
11256
  if (!Array.isArray(body.labels)) {
11216
- return { ok: false, reason: "labels must be an array of strings" };
11257
+ return { ok: false, code: "shape", reason: "labels must be an array of strings" };
11217
11258
  }
11218
11259
  if (typeof body.includeTrashed !== "boolean") {
11219
- return { ok: false, reason: "includeTrashed must be a boolean" };
11260
+ return { ok: false, code: "shape", reason: "includeTrashed must be a boolean" };
11220
11261
  }
11221
11262
  const seen = /* @__PURE__ */ new Set();
11222
11263
  for (const lbl of body.labels) {
11223
11264
  if (typeof lbl !== "string") {
11224
- return { ok: false, reason: "labels must be an array of strings" };
11225
- }
11226
- if (!isKnownLabel(lbl)) {
11227
- return { ok: false, reason: `unknown label "${lbl}" \u2014 not registered in graph-labels.ts` };
11265
+ return { ok: false, code: "shape", reason: "labels must be an array of strings" };
11228
11266
  }
11229
- if (isHiddenByDefault(lbl)) {
11230
- return { ok: false, reason: `label "${lbl}" is hidden by default and cannot be a default view selection` };
11267
+ if (!FILTER_TOP_LEVEL_LABELS.has(lbl)) {
11268
+ return {
11269
+ ok: false,
11270
+ code: "not-eligible-chip",
11271
+ label: lbl,
11272
+ reason: `label "${lbl}" is not eligible for default view \u2014 outside the chip allowlist (FILTER_TOP_LEVEL_LABELS, Task 753)`
11273
+ };
11231
11274
  }
11232
11275
  seen.add(lbl);
11233
11276
  }