cuelo 0.9.1 → 0.9.3
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/.next/BUILD_ID +1 -1
- package/.next/app-path-routes-manifest.json +6 -6
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +3 -3
- package/.next/required-server-files.js +1 -1
- package/.next/required-server-files.json +1 -1
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +2 -2
- package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/api/updates/route.js +1 -1
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +4 -4
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +3 -3
- package/.next/server/app/index.segments/_full.segment.rsc +4 -4
- package/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/office/page_client-reference-manifest.js +1 -1
- package/.next/server/app/office-preview/page_client-reference-manifest.js +1 -1
- package/.next/server/app/office-preview.html +1 -1
- package/.next/server/app/office-preview.rsc +2 -2
- package/.next/server/app/office-preview.segments/_full.segment.rsc +2 -2
- package/.next/server/app/office-preview.segments/_head.segment.rsc +1 -1
- package/.next/server/app/office-preview.segments/_index.segment.rsc +2 -2
- package/.next/server/app/office-preview.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/office-preview.segments/office-preview/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/office-preview.segments/office-preview.segment.rsc +1 -1
- package/.next/server/app/office.html +1 -1
- package/.next/server/app/office.rsc +4 -4
- package/.next/server/app/office.segments/_full.segment.rsc +4 -4
- package/.next/server/app/office.segments/_head.segment.rsc +1 -1
- package/.next/server/app/office.segments/_index.segment.rsc +2 -2
- package/.next/server/app/office.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/office.segments/office/__PAGE__.segment.rsc +3 -3
- package/.next/server/app/office.segments/office.segment.rsc +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/recover/page_client-reference-manifest.js +1 -1
- package/.next/server/app/recover.html +1 -1
- package/.next/server/app/recover.rsc +2 -2
- package/.next/server/app/recover.segments/_full.segment.rsc +2 -2
- package/.next/server/app/recover.segments/_head.segment.rsc +1 -1
- package/.next/server/app/recover.segments/_index.segment.rsc +2 -2
- package/.next/server/app/recover.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/recover.segments/recover/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/recover.segments/recover.segment.rsc +1 -1
- package/.next/server/app-paths-manifest.json +6 -6
- package/.next/server/chunks/5489.js +3 -3
- package/.next/server/chunks/6429.js +3 -3
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{9575-916cd5a97ceda30f.js → 9575-0a61510a174f6087.js} +8 -8
- package/.next/static/chunks/app/{layout-eb09a412f4f55812.js → layout-db3a3e6c0fb3dfb8.js} +1 -1
- package/.next/trace +108 -107
- package/.next/trace-build +1 -1
- package/Tools/CUELO_Setup/files/native-runtime-patch.js +1 -1
- package/Tools/OMP_Global_Config/agent/RULES.md +2 -2
- package/Tools/OMP_Global_Config/agent/extensions/gitnexus-autosync.ts +333 -0
- package/Tools/OMP_Global_Config/agent/extensions/image-question-router.ts +25 -17
- package/Tools/OMP_Global_Config/agent/extensions/lib/maker-routing.ts +1 -1
- package/Tools/OMP_Global_Config/agent/prompt-copies/RULES.en.md +2 -2
- package/Tools/OMP_Global_Config/agent/rules/subagent.md +5 -5
- package/Tools/OMP_Global_Config/patches/apply-core-patch.mjs +204 -0
- package/package.json +1 -1
- /package/.next/static/{A-KXZPM3YkTqPPzKrND64 → 2K1doMCGVHZR9NtZw8xYc}/_buildManifest.js +0 -0
- /package/.next/static/{A-KXZPM3YkTqPPzKrND64 → 2K1doMCGVHZR9NtZw8xYc}/_ssgManifest.js +0 -0
|
@@ -85,6 +85,37 @@ const OPUS55_ROW_18410 = {
|
|
|
85
85
|
*/
|
|
86
86
|
const OPUS55_ROW_1851 = OPUS55_ROW_1846.patched.replace('"tps":95.2,', '"tps":93,');
|
|
87
87
|
|
|
88
|
+
/**
|
|
89
|
+
* 기억 임베딩 (6) 항목의 본문. 0.9.3 은 recall 이 e5 여부로 dense 하한을 고르게 `usesE5Prefix` 를 export 한다.
|
|
90
|
+
* 0.9.2 적용본(export 없음)은 legacyPatched 로 남겨 같은 항목이 새 판으로 바꾼다.
|
|
91
|
+
*/
|
|
92
|
+
const e5EmbeddingBlock = (exportUsesE5Prefix) => `// HANSE: local embedding fingerprint and e5 prefixes
|
|
93
|
+
const E5_PREFIX_STAMP = "e5-prefix-v1";
|
|
94
|
+
|
|
95
|
+
/** The local fastembed model in use (no injected provider, not an API model), or null. */
|
|
96
|
+
function localEmbeddingModel(): string | null {
|
|
97
|
+
if (resolveEmbeddingProvider(activeEmbeddingOptions()?.provider) !== undefined || providerOverride !== null) return null;
|
|
98
|
+
const model = defaultModel();
|
|
99
|
+
return isApiModel(model) ? null : model;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
${exportUsesE5Prefix ? "export " : ""}function usesE5Prefix(): boolean {
|
|
103
|
+
const model = localEmbeddingModel();
|
|
104
|
+
return model !== null && /(^|[/_-])e5([-_]|$)/i.test(model);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/** Adds the e5 retrieval prefix for local e5 models; other models embed the text as-is. */
|
|
108
|
+
export function e5Prefixed(kind: "query" | "passage", texts: readonly string[]): readonly string[] {
|
|
109
|
+
return usesE5Prefix() ? texts.map(text => \`\${kind}: \${text}\`) : texts;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export function currentEmbeddingModel(): string {
|
|
113
|
+
const model = localEmbeddingModel();
|
|
114
|
+
if (model === null) return defaultModel();
|
|
115
|
+
return \`\${model}#\${fastembedRuntimeInstallPlan().versionKey}\${usesE5Prefix() ? \`#\${E5_PREFIX_STAMP}\` : ""}\`;
|
|
116
|
+
}
|
|
117
|
+
`;
|
|
118
|
+
|
|
88
119
|
/** 각 항목: 원본 앵커를 찾아 patched 로 바꾼다. marker 가 있으면 이미 적용된 것으로 본다. */
|
|
89
120
|
const EDITS = [
|
|
90
121
|
{
|
|
@@ -3040,6 +3071,25 @@ import { isUnexpectedSocketCloseMessage } from "@oh-my-pi/pi-utils/fetch-retry";
|
|
|
3040
3071
|
if (AgentLifecycleManager.#global === this) AgentLifecycleManager.#global = undefined;
|
|
3041
3072
|
}`,
|
|
3042
3073
|
},
|
|
3074
|
+
{
|
|
3075
|
+
// 2026-10-04 실측: Maker 가 측정 job(bash async)을 띄우고 턴을 끝낸 지 task.agentIdleTtlMs(기본 420000ms)
|
|
3076
|
+
// 뒤 park() 가 세션을 dispose 했다. park 는 대기 중인 async 작업을 보지 않아 job 완료 알림이 전달되지 않고
|
|
3077
|
+
// 남은 작업도 끊겼다(upstream 18.6.0 도 같다). 커밋 직전 재확인에서 작업이 남아 있으면 dispose 하지 않고
|
|
3078
|
+
// idle 타이머를 다시 건다. job 은 실행 한도, 남은 전달·yield 큐는 idle flush 로 끝나므로 영구 잔류는 없다.
|
|
3079
|
+
file: "src/registry/agent-lifecycle.ts",
|
|
3080
|
+
marker: "// HANSE: keep sessions with pending async work",
|
|
3081
|
+
anchor: ` if (this.#adopted.get(id)?.ref !== ref) return;
|
|
3082
|
+
|
|
3083
|
+
// Commit: detach + parked *before* dispose`,
|
|
3084
|
+
patched: ` if (this.#adopted.get(id)?.ref !== ref) return;
|
|
3085
|
+
// HANSE: keep sessions with pending async work
|
|
3086
|
+
if (session.hasPendingAsyncWork()) {
|
|
3087
|
+
this.#armTimer(id, adopted);
|
|
3088
|
+
return;
|
|
3089
|
+
}
|
|
3090
|
+
|
|
3091
|
+
// Commit: detach + parked *before* dispose`,
|
|
3092
|
+
},
|
|
3043
3093
|
{
|
|
3044
3094
|
file: "src/sdk.ts",
|
|
3045
3095
|
marker: "lifecycle.dispose(undefined, registeredAgentRef)",
|
|
@@ -5868,6 +5918,15 @@ export class LearnTool implements AgentTool<LearnSchema> {`,
|
|
|
5868
5918
|
patched: "unique name; ready requires name; no async/timeout. env adds variables (exported before the command); pty defaults true.",
|
|
5869
5919
|
}],
|
|
5870
5920
|
},
|
|
5921
|
+
{
|
|
5922
|
+
// 2026-10-04 집계: bash 안의 `powershell -Command "...$x..."` 가 command-guard 에 막힌 일이 14일 14건(10-02 이후 12)이다.
|
|
5923
|
+
// 규칙은 RULES·skill 에 있지만 실수는 bash 호출 자리에서 나므로, Windows 에서만 도구 설명에 우회 경로를 적는다.
|
|
5924
|
+
// patched 에 달러 기호를 넣지 않는다: 문자열 replace 가 달러+백틱을 '일치 앞 전체' 로 해석해 파일을 망가뜨렸다.
|
|
5925
|
+
file: "src/prompts/tools/bash.md",
|
|
5926
|
+
marker: "{{#if isWindows}}PowerShell logic:",
|
|
5927
|
+
anchor: "Internal URIs work as paths for builtins/coreutils, redirects, globs.\n",
|
|
5928
|
+
patched: "Internal URIs work as paths for builtins/coreutils, redirects, globs.\n{{#if isWindows}}PowerShell logic: `write` a `.ps1`, then `powershell.exe -NoProfile -ExecutionPolicy Bypass -File C:/abs/path.ps1`; never `-Command` with PowerShell variables (this shell rewrites them). Windows paths: forward slashes.{{/if}}\n",
|
|
5929
|
+
},
|
|
5871
5930
|
{
|
|
5872
5931
|
// 같은 집계: `todo` append 에 phase 를 빠뜨리면 거절됐다(사흘간 9건). phase 가 없으면 아직 안 끝난
|
|
5873
5932
|
// 일이 있는 첫 phase, 없으면 마지막 phase, phase 가 없으면 init 기본 이름에 붙인다.
|
|
@@ -6048,6 +6107,151 @@ function koreanStem(token: string): string {
|
|
|
6048
6107
|
anchor: "\ttool: 0.5,\n\tfalse: 0,\n",
|
|
6049
6108
|
patched: "\t// HANSE: deliberate learn/retain weight\n\ttool: 1.0,\n\tfalse: 0,\n",
|
|
6050
6109
|
},
|
|
6110
|
+
{
|
|
6111
|
+
// (4) 2026-10-04 2차 측정(재임베딩 복사본, 190문항): queryTime 이 없는 일반 회상에서 72시간 반감 recency 배율
|
|
6112
|
+
// (0.7~1.0)이 기본 점수 차이보다 커서, 1위를 놓친 정답 101건 중 89건이 더 최근의 덜 관련된 교훈에 밀렸다(질문
|
|
6113
|
+
// hit@1 21.1%). 일반 질의는 배율을 쓰지 않는다(53.3%, 영어 fixture MRR 0.878). 시간 질의(queryTime 이 있는
|
|
6114
|
+
// temporalBoost 경로)와 recency_score 필드 값은 그대로다. 교훈 갱신은 learn topic 이 같은 행을 고쳐 쓰고,
|
|
6115
|
+
// invalidate·superseded 행은 buildWhere 가 이미 빼므로 옛 판이 새 판을 앞서지 않는다.
|
|
6116
|
+
file: "../pi-mnemopi/src/core/beam/recall.ts",
|
|
6117
|
+
marker: "// HANSE: no recency multiplier for plain recall",
|
|
6118
|
+
anchor: "\tlet score = baseScore * (0.7 + 0.3 * decay);\n",
|
|
6119
|
+
patched: "\t// HANSE: no recency multiplier for plain recall\n\tlet score = options.queryTime == null ? baseScore : baseScore * (0.7 + 0.3 * decay);\n",
|
|
6120
|
+
},
|
|
6121
|
+
{
|
|
6122
|
+
// (5) working 기억의 dense 가중이 0.2 로 고정돼(MNEMOPI_VEC_WEIGHT 는 episodic 분기만 쓴다) 어휘 점수가 순위를
|
|
6123
|
+
// 거의 정했다. 재임베딩 복사본 190문항에서 0.8 이 질문 MRR 0.565→0.644, 작업 hit@8 61.1→67.8(접두 포함)로
|
|
6124
|
+
// 가장 고르게 올랐다(1.0 은 질문만 오르고 작업 hit@8 이 58.9 로 떨어졌다).
|
|
6125
|
+
file: "../pi-mnemopi/src/core/beam/recall.ts",
|
|
6126
|
+
marker: "// HANSE: working dense weight 0.8",
|
|
6127
|
+
anchor: "\t\tif (candidate.signals.dense > 0) baseScore = baseScore * 0.8 + candidate.signals.dense * 0.2;\n",
|
|
6128
|
+
patched: "\t\t// HANSE: working dense weight 0.8\n\t\tif (candidate.signals.dense > 0) baseScore = baseScore * 0.2 + candidate.signals.dense * 0.8;\n",
|
|
6129
|
+
},
|
|
6130
|
+
{
|
|
6131
|
+
// (6) 2026-10-04 실측: fastembed 3.0.0 업그레이드(18.5.1) 뒤 같은 이름의 multilingual-e5-large 가 다른 벡터를
|
|
6132
|
+
// 냈다(옛 저장 벡터와 새 벡터 코사인 0.85~0.90, 저장 벡터 순위 hit@1 5.6%). stamp 가 모델 이름뿐이라
|
|
6133
|
+
// reconcileEmbeddingModel 이 재구축하지 않았다. 로컬 fastembed 모델의 stamp 에 runtime versionKey 와 e5 접두
|
|
6134
|
+
// 방식을 붙여, 둘 중 하나가 바뀌면 기존 wipe→재구축 경로가 돈다. 주입 provider·API 모델 stamp 는 그대로다.
|
|
6135
|
+
// e5 는 query:/passage: 접두를 전제로 학습됐다(접두+dense 0.8: 질문 58.9/77.8, 작업 hit@8 67.8).
|
|
6136
|
+
file: "../pi-mnemopi/src/core/embeddings.ts",
|
|
6137
|
+
marker: "// HANSE: local embedding fingerprint and e5 prefixes",
|
|
6138
|
+
anchor: "export function currentEmbeddingModel(): string {\n\treturn defaultModel();\n}\n",
|
|
6139
|
+
patched: e5EmbeddingBlock(true),
|
|
6140
|
+
legacyPatched: e5EmbeddingBlock(false),
|
|
6141
|
+
},
|
|
6142
|
+
{
|
|
6143
|
+
file: "../pi-mnemopi/src/core/embeddings.ts",
|
|
6144
|
+
marker: "import { fastembedRuntimeInstallPlan, loadFastembed } from",
|
|
6145
|
+
anchor: 'import { loadFastembed } from "./fastembed-runtime";\n',
|
|
6146
|
+
patched: 'import { fastembedRuntimeInstallPlan, loadFastembed } from "./fastembed-runtime";\n',
|
|
6147
|
+
},
|
|
6148
|
+
{
|
|
6149
|
+
file: "../pi-mnemopi/src/core/embeddings.ts",
|
|
6150
|
+
marker: 'await embed(e5Prefixed("query", [text]))',
|
|
6151
|
+
anchor: "\tconst vectors = await embed([text]);\n",
|
|
6152
|
+
patched: '\tconst vectors = await embed(e5Prefixed("query", [text]));\n',
|
|
6153
|
+
},
|
|
6154
|
+
{
|
|
6155
|
+
file: "../pi-mnemopi/src/core/beam/helpers.ts",
|
|
6156
|
+
marker: 'await embed(e5Prefixed("passage",',
|
|
6157
|
+
anchor: "\t\tconst matrix = await embed(items.map(item => item.content));\n",
|
|
6158
|
+
patched: '\t\tconst matrix = await embed(e5Prefixed("passage", items.map(item => item.content)));\n',
|
|
6159
|
+
},
|
|
6160
|
+
{
|
|
6161
|
+
file: "../pi-mnemopi/src/core/beam/helpers.ts",
|
|
6162
|
+
marker: "import { currentEmbeddingModel, e5Prefixed, embed } from",
|
|
6163
|
+
anchor: 'import { currentEmbeddingModel, embed } from "../embeddings";\n',
|
|
6164
|
+
patched: 'import { currentEmbeddingModel, e5Prefixed, embed } from "../embeddings";\n',
|
|
6165
|
+
},
|
|
6166
|
+
{
|
|
6167
|
+
// (7) SHMR(core/shmr.ts)도 같은 e5 공간을 쓴다. harmonize 는 memory_embeddings 의 저장 벡터(passage: 접두)와
|
|
6168
|
+
// embedBatch 가 새로 만든 벡터를 한 코사인 군집에서 섞는데, embedBatch 만 접두 없이 임베딩해 두 공간이 갈렸다.
|
|
6169
|
+
// 기억·belief 텍스트는 passage: 로, recallBeliefs 의 질의만 query: 로 임베딩한다. 한 호출 안에서 접두를 정해
|
|
6170
|
+
// 실패 시 hash fallback 이 묶음 전체에 걸리는 기존 계약은 그대로다. 이 벡터는 저장하지 않아 stamp 는 그대로다.
|
|
6171
|
+
file: "../pi-mnemopi/src/core/shmr.ts",
|
|
6172
|
+
marker: "// HANSE: shmr e5 prefixes",
|
|
6173
|
+
anchor: "export async function embedBatch(texts: readonly string[]): Promise<Vector[]> {\n\tif (texts.length === 0) return [];\n\tlet matrix: embeddings.EmbeddingMatrix | null = null;\n\ttry {\n\t\tmatrix = await embeddings.embed(texts);\n",
|
|
6174
|
+
patched: `// HANSE: shmr e5 prefixes
|
|
6175
|
+
export async function embedBatch(
|
|
6176
|
+
texts: readonly string[],
|
|
6177
|
+
providerTexts: readonly string[] = embeddings.e5Prefixed("passage", texts),
|
|
6178
|
+
): Promise<Vector[]> {
|
|
6179
|
+
if (texts.length === 0) return [];
|
|
6180
|
+
let matrix: embeddings.EmbeddingMatrix | null = null;
|
|
6181
|
+
try {
|
|
6182
|
+
matrix = await embeddings.embed(providerTexts);
|
|
6183
|
+
`,
|
|
6184
|
+
},
|
|
6185
|
+
{
|
|
6186
|
+
file: "../pi-mnemopi/src/core/shmr.ts",
|
|
6187
|
+
marker: 'embeddings.e5Prefixed("query", [query])',
|
|
6188
|
+
anchor: "\tconst vectors = await embedBatch([query, ...rows.map(row => row.object)]);\n",
|
|
6189
|
+
patched: ` const objects = rows.map(row => row.object);
|
|
6190
|
+
const vectors = await embedBatch(
|
|
6191
|
+
[query, ...objects],
|
|
6192
|
+
[...embeddings.e5Prefixed("query", [query]), ...embeddings.e5Prefixed("passage", objects)],
|
|
6193
|
+
);
|
|
6194
|
+
`,
|
|
6195
|
+
},
|
|
6196
|
+
{
|
|
6197
|
+
// (8) 2026-10-05 후속 측정(재임베딩 복사본, 190문항 + 교차 44 + 대조 70): 한국어 질의에 영어로 저장한 교훈은
|
|
6198
|
+
// dense 점수가 1위와 거의 같은데 어휘 점수가 0.034 대 0.277 로 밀려 hit@8 14.3% 였다. 질의와 기억의 주 문자
|
|
6199
|
+
// (한글/라틴)가 다르면 어휘 겹침이 구조적으로 0 에 가까우므로 working 기억의 어휘 점수에 하한 0.3 을 둔다.
|
|
6200
|
+
// e5 코사인은 0.6~0.9 에 몰려 기존 dense 하한 0.65 가 거의 거르지 못해 e5 일 때만 0.82 로 올린다.
|
|
6201
|
+
// 둘을 함께 쓰면 질문 h1/h8/MRR 58.9/77.8/0.644→64.4/83.3/0.722, 작업 h8 67.8→73.3, 한→영 질문 h8 14.3→47.6.
|
|
6202
|
+
// 무관 질의에도 상위 기억을 채우는 동작은 남는다: 점수 컷은 대조 주입률 1.4% 에서 정답 hit@8 이 77→65 로 떨어져 넣지 않았다.
|
|
6203
|
+
file: "../pi-mnemopi/src/core/beam/recall.ts",
|
|
6204
|
+
marker: "import { embedQuery, usesE5Prefix } from",
|
|
6205
|
+
anchor: 'import { embedQuery } from "../embeddings";\n',
|
|
6206
|
+
patched: 'import { embedQuery, usesE5Prefix } from "../embeddings";\n',
|
|
6207
|
+
},
|
|
6208
|
+
{
|
|
6209
|
+
file: "../pi-mnemopi/src/core/beam/recall.ts",
|
|
6210
|
+
marker: "\t__queryHangulMajority?: boolean;\n",
|
|
6211
|
+
anchor: "\tupdateRecallCounts?: boolean;\n};\n",
|
|
6212
|
+
patched: "\tupdateRecallCounts?: boolean;\n\t// HANSE: cross-script recall (recall() 이 정해 scoreCandidate 에 넘긴다)\n\t__queryHangulMajority?: boolean;\n\t__denseFloor?: number;\n};\n",
|
|
6213
|
+
},
|
|
6214
|
+
{
|
|
6215
|
+
file: "../pi-mnemopi/src/core/beam/recall.ts",
|
|
6216
|
+
marker: "const CROSS_SCRIPT_LEXICAL_FLOOR = 0.3;",
|
|
6217
|
+
anchor: "function scoreCandidate(\n\tcandidate: MemoryCandidate,\n",
|
|
6218
|
+
patched: `// HANSE: cross-script recall
|
|
6219
|
+
const CROSS_SCRIPT_LEXICAL_FLOOR = 0.3;
|
|
6220
|
+
const E5_DENSE_FLOOR = 0.82;
|
|
6221
|
+
|
|
6222
|
+
/** 한글과 라틴 글자 중 한글이 절반 이상이면 true. 둘 다 없으면 false. */
|
|
6223
|
+
function hangulMajority(text: string): boolean {
|
|
6224
|
+
const hangul = text.match(/[\\uac00-\\ud7af]/g)?.length ?? 0;
|
|
6225
|
+
const latin = text.match(/[A-Za-z]/g)?.length ?? 0;
|
|
6226
|
+
return hangul + latin > 0 && hangul / (hangul + latin) >= 0.5;
|
|
6227
|
+
}
|
|
6228
|
+
|
|
6229
|
+
function scoreCandidate(
|
|
6230
|
+
candidate: MemoryCandidate,
|
|
6231
|
+
`,
|
|
6232
|
+
},
|
|
6233
|
+
{
|
|
6234
|
+
file: "../pi-mnemopi/src/core/beam/recall.ts",
|
|
6235
|
+
marker: "// HANSE: cross-script lexical floor and e5 dense floor",
|
|
6236
|
+
anchor: "\tconst lexical = lexicalGroupRelevance(queryGroups, searchableContent);\n\tconst minRel = minimumRelevance(queryTokens);\n\tif (lexical < minRel && candidate.signals.dense < 0.65) return null;\n",
|
|
6237
|
+
patched: ` // HANSE: cross-script lexical floor and e5 dense floor
|
|
6238
|
+
let lexical = lexicalGroupRelevance(queryGroups, searchableContent);
|
|
6239
|
+
if (
|
|
6240
|
+
candidate.tierLabel === "working" &&
|
|
6241
|
+
options.__queryHangulMajority !== undefined &&
|
|
6242
|
+
options.__queryHangulMajority !== hangulMajority(searchableContent)
|
|
6243
|
+
)
|
|
6244
|
+
lexical = Math.max(lexical, CROSS_SCRIPT_LEXICAL_FLOOR);
|
|
6245
|
+
const minRel = minimumRelevance(queryTokens);
|
|
6246
|
+
if (lexical < minRel && candidate.signals.dense < (options.__denseFloor ?? 0.65)) return null;
|
|
6247
|
+
`,
|
|
6248
|
+
},
|
|
6249
|
+
{
|
|
6250
|
+
file: "../pi-mnemopi/src/core/beam/recall.ts",
|
|
6251
|
+
marker: "temporalOptions.__denseFloor = usesE5Prefix()",
|
|
6252
|
+
anchor: "\tconst tokenGroups = expandedTokenGroups(query, useSynonyms);\n\tconst candidates = collectMemoryCandidates(beam, query, topK, temporalOptions);\n",
|
|
6253
|
+
patched: "\tconst tokenGroups = expandedTokenGroups(query, useSynonyms);\n\ttemporalOptions.__queryHangulMajority = hangulMajority(query);\n\ttemporalOptions.__denseFloor = usesE5Prefix() ? E5_DENSE_FLOOR : 0.65;\n\tconst candidates = collectMemoryCandidates(beam, query, topK, temporalOptions);\n",
|
|
6254
|
+
},
|
|
6051
6255
|
{
|
|
6052
6256
|
// 2026-09-29 실측: 기억 임베딩 재구축(모델 변경·중단 뒤 재개)이 128건 묶음을 한꺼번에 worker 에
|
|
6053
6257
|
// 올렸다. worker 는 요청을 하나씩 처리하는데 요청마다 120초 타이머가 보낸 순간부터 흘러,
|
package/package.json
CHANGED
|
File without changes
|
|
File without changes
|