@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.
- package/dist/index.js +38 -3
- package/package.json +2 -2
- package/payload/platform/lib/graph-search/dist/index.d.ts +22 -1
- package/payload/platform/lib/graph-search/dist/index.d.ts.map +1 -1
- package/payload/platform/lib/graph-search/dist/index.js +69 -39
- package/payload/platform/lib/graph-search/dist/index.js.map +1 -1
- package/payload/platform/lib/graph-search/src/__tests__/bm25-label-gate.test.ts +88 -0
- package/payload/platform/lib/graph-search/src/__tests__/expand-batch.test.ts +206 -0
- package/payload/platform/lib/graph-search/src/index.ts +100 -43
- package/payload/platform/plugins/docs/references/platform.md +3 -1
- package/payload/platform/plugins/linkedin-import/PLUGIN.md +1 -0
- package/payload/platform/plugins/linkedin-import/skills/linkedin-import/SKILL.md +26 -5
- package/payload/platform/plugins/linkedin-import/skills/linkedin-import/references/connections.md +53 -82
- package/payload/platform/plugins/linkedin-import/skills/linkedin-import/references/profile.md +42 -49
- package/payload/platform/plugins/memory/PLUGIN.md +1 -0
- package/payload/platform/plugins/memory/mcp/dist/index.js +48 -0
- package/payload/platform/plugins/memory/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.d.ts +33 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.js +229 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.js.map +1 -0
- package/payload/platform/scripts/check-sdk-oauth.mjs +178 -0
- package/payload/platform/scripts/redact-install-logs.sh +85 -0
- package/payload/platform/scripts/setup.sh +20 -3
- package/payload/platform/scripts/verify-skill-tool-surface.sh +255 -0
- package/payload/platform/templates/specialists/agents/database-operator.md +6 -2
- package/payload/server/chunk-U5JPRUYZ.js +12298 -0
- package/payload/server/maxy-edge.js +1 -1
- package/payload/server/public/assets/{Checkbox-CjbS9JcG.js → Checkbox-Dr9MqNdk.js} +1 -1
- package/payload/server/public/assets/{admin-Ce9DbUuu.js → admin-CZ1QdDIj.js} +1 -1
- package/payload/server/public/assets/{data-C-SxjLC9.js → data-KcxxS-x3.js} +1 -1
- package/payload/server/public/assets/{file-D4cbAAuo.js → file-KlvYstdJ.js} +1 -1
- package/payload/server/public/assets/{graph-BRD96pKD.js → graph-BjGlgDDX.js} +8 -8
- package/payload/server/public/assets/{house-CYsVygEQ.js → house-CyE0Xd3r.js} +1 -1
- package/payload/server/public/assets/{jsx-runtime-DPXE45W9.css → jsx-runtime-CPtXdEwZ.css} +1 -1
- package/payload/server/public/assets/{public-BTOF98iO.js → public-C1gnzTxk.js} +1 -1
- package/payload/server/public/assets/{share-2-B-sbkB36.js → share-2-Q9lo8ZrW.js} +1 -1
- package/payload/server/public/assets/{useVoiceRecorder-DLVFx3ms.js → useVoiceRecorder-BH8HP7l_.js} +1 -1
- package/payload/server/public/assets/{x-BNidzSAn.js → x-BwY4lg-U.js} +1 -1
- package/payload/server/public/data.html +6 -6
- package/payload/server/public/graph.html +7 -7
- package/payload/server/public/index.html +8 -8
- package/payload/server/public/public.html +5 -5
- package/payload/server/server.js +118 -75
- /package/payload/server/public/assets/{jsx-runtime-BUs3sHtV.js → jsx-runtime-BKpb2FvO.js} +0 -0
package/payload/server/public/assets/{useVoiceRecorder-DLVFx3ms.js → useVoiceRecorder-BH8HP7l_.js}
RENAMED
|
@@ -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-
|
|
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-
|
|
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-
|
|
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-
|
|
11
|
-
<link rel="modulepreload" crossorigin href="/assets/share-2-
|
|
12
|
-
<link rel="modulepreload" crossorigin href="/assets/file-
|
|
13
|
-
<link rel="modulepreload" crossorigin href="/assets/house-
|
|
14
|
-
<link rel="stylesheet" crossorigin href="/assets/jsx-runtime-
|
|
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-
|
|
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-
|
|
11
|
-
<link rel="modulepreload" crossorigin href="/assets/Checkbox-
|
|
12
|
-
<link rel="modulepreload" crossorigin href="/assets/share-2-
|
|
13
|
-
<link rel="modulepreload" crossorigin href="/assets/house-
|
|
14
|
-
<link rel="modulepreload" crossorigin href="/assets/x-
|
|
15
|
-
<link rel="stylesheet" crossorigin href="/assets/jsx-runtime-
|
|
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-
|
|
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-
|
|
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-
|
|
13
|
-
<link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-
|
|
14
|
-
<link rel="modulepreload" crossorigin href="/assets/share-2-
|
|
15
|
-
<link rel="modulepreload" crossorigin href="/assets/file-
|
|
16
|
-
<link rel="modulepreload" crossorigin href="/assets/x-
|
|
17
|
-
<link rel="stylesheet" crossorigin href="/assets/jsx-runtime-
|
|
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-
|
|
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-
|
|
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-
|
|
13
|
-
<link rel="modulepreload" crossorigin href="/assets/useVoiceRecorder-
|
|
14
|
-
<link rel="stylesheet" crossorigin href="/assets/jsx-runtime-
|
|
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>
|
package/payload/server/server.js
CHANGED
|
@@ -98,7 +98,7 @@ import {
|
|
|
98
98
|
vncLog,
|
|
99
99
|
waitForExit,
|
|
100
100
|
writeChromiumWrapper
|
|
101
|
-
} from "./chunk-
|
|
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
|
-
|
|
10359
|
-
|
|
10360
|
-
|
|
10361
|
-
|
|
10362
|
-
|
|
10363
|
-
|
|
10364
|
-
|
|
10365
|
-
|
|
10366
|
-
|
|
10367
|
-
|
|
10368
|
-
|
|
10369
|
-
|
|
10370
|
-
|
|
10371
|
-
|
|
10372
|
-
|
|
10373
|
-
|
|
10374
|
-
|
|
10375
|
-
|
|
10376
|
-
|
|
10377
|
-
|
|
10378
|
-
|
|
10379
|
-
|
|
10380
|
-
|
|
10381
|
-
|
|
10382
|
-
|
|
10383
|
-
|
|
10384
|
-
|
|
10385
|
-
|
|
10386
|
-
|
|
10387
|
-
|
|
10388
|
-
|
|
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 =
|
|
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
|
|
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(
|
|
10453
|
-
|
|
10454
|
-
|
|
10455
|
-
|
|
10456
|
-
|
|
10457
|
-
|
|
10458
|
-
|
|
10459
|
-
|
|
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
|
|
10583
|
+
var FILTER_TOP_LEVEL_LABELS = Object.freeze(
|
|
10562
10584
|
/* @__PURE__ */ new Set([
|
|
10563
|
-
"
|
|
10564
|
-
"
|
|
10565
|
-
"
|
|
10566
|
-
"
|
|
10567
|
-
"
|
|
10568
|
-
"
|
|
10569
|
-
"
|
|
10570
|
-
"
|
|
10571
|
-
"
|
|
10572
|
-
"
|
|
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
|
|
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)
|
|
11107
|
+
for (const label of AGENT_ACTION_LABELS) allowedSet.add(label);
|
|
11072
11108
|
}
|
|
11073
|
-
const
|
|
11109
|
+
const allowed = [...allowedSet];
|
|
11074
11110
|
const result = await session.executeRead(async (tx) => {
|
|
11075
|
-
return await tx.run(LABELS_IN_GRAPH_CYPHER, { accountId,
|
|
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
|
|
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 (
|
|
11230
|
-
return {
|
|
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
|
}
|
|
File without changes
|