cuelo 0.9.2 → 0.9.4
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 +7 -7
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +3 -3
- package/.next/required-server-files.js +2 -2
- package/.next/required-server-files.json +2 -2
- 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 +7 -7
- package/.next/server/chunks/5489.js +2 -2
- 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-2bfc351b31f30a41.js → 9575-08609cfc6c1cf3e1.js} +2 -2
- package/.next/static/chunks/app/{layout-8ee6fa0157a0b288.js → layout-76b01721b96d2c1a.js} +1 -1
- package/.next/trace +108 -108
- package/.next/trace-build +1 -1
- package/README.md +1 -1
- package/Tools/CUELO_Setup/files/btw-server.js +3 -0
- package/Tools/CUELO_Setup/files/native-runtime-patch.js +3 -3
- 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 +182 -29
- package/package.json +7 -7
- /package/.next/static/{ZY07mKbniJf7UEsQUdUMV → 6tGLEaiCe3Wa8PkWKUhB4}/_buildManifest.js +0 -0
- /package/.next/static/{ZY07mKbniJf7UEsQUdUMV → 6tGLEaiCe3Wa8PkWKUhB4}/_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
|
{
|
|
@@ -1130,11 +1161,16 @@ export interface IrcBridgeHost {
|
|
|
1130
1161
|
* \`suppressRelay\` lets the session finalize a bracketed turn without
|
|
1131
1162
|
* claiming it answered the parent (see #adoptParentSteerForRunningTurn).
|
|
1132
1163
|
* \`adoptedRecords\` carries steers that landed after the bracket opened and
|
|
1133
|
-
* that this same turn consumed: one finalization answers every source.
|
|
1164
|
+
* that this same turn consumed: one finalization answers every source.
|
|
1165
|
+
* \`bracket.runningTurn\` marks a bracket opened over a turn that was ALREADY
|
|
1166
|
+
* running (the parent's steer did not wake it), so the monitor must not
|
|
1167
|
+
* treat it as parent-woken work: whether it owns the answer is only known
|
|
1168
|
+
* at settle. */
|
|
1134
1169
|
setIrcWakeTurnObserver(
|
|
1135
1170
|
observer:
|
|
1136
1171
|
| ((
|
|
1137
1172
|
records: AgentMessage[],
|
|
1173
|
+
bracket?: { runningTurn?: boolean },
|
|
1138
1174
|
) =>
|
|
1139
1175
|
| ((error?: unknown, suppressRelay?: boolean, adoptedRecords?: AgentMessage[]) => void | Promise<void>)
|
|
1140
1176
|
| undefined)
|
|
@@ -1199,7 +1235,9 @@ export interface IrcBridgeHost {
|
|
|
1199
1235
|
| ((error?: unknown, suppressRelay?: boolean, adoptedRecords?: AgentMessage[]) => void | Promise<void>)
|
|
1200
1236
|
| undefined;
|
|
1201
1237
|
try {
|
|
1202
|
-
|
|
1238
|
+
// The parent's steer did not wake this turn, and it may still strand:
|
|
1239
|
+
// the monitor must not claim the parent's answer up front.
|
|
1240
|
+
finish = observer(entries.map(entry => entry.record), { runningTurn: true });
|
|
1203
1241
|
} catch (error) {
|
|
1204
1242
|
logger.warn("IRC steer continuation observer failed to start", { error: String(error) });
|
|
1205
1243
|
return;
|
|
@@ -1477,6 +1515,7 @@ export interface IrcBridgeHost {
|
|
|
1477
1515
|
patched: ` #ircWakeTurnObserver:
|
|
1478
1516
|
| ((
|
|
1479
1517
|
records: AgentMessage[],
|
|
1518
|
+
bracket?: { runningTurn?: boolean },
|
|
1480
1519
|
) =>
|
|
1481
1520
|
| ((error?: unknown, suppressRelay?: boolean, adoptedRecords?: AgentMessage[]) => void | Promise<void>)
|
|
1482
1521
|
| undefined)
|
|
@@ -1626,6 +1665,40 @@ export interface IrcBridgeHost {
|
|
|
1626
1665
|
patched: ` return async (turnError: unknown, suppressRelay?: boolean, adoptedRecords?: AgentMessage[]) => {
|
|
1627
1666
|
unsubscribeTurn();`,
|
|
1628
1667
|
},
|
|
1668
|
+
{
|
|
1669
|
+
// 18.6.1 의 executor.ts attachIrcWakeTurnMonitor 는 부모 레코드가 있는 bracket 이면 job 을 turn 시작에
|
|
1670
|
+
// 미리 등록하고, yield 없이 끝난 turn 도 그 job 을 relay 본문으로 정산한다(부모 wait 가 그 turn 을 기다리게).
|
|
1671
|
+
// 우리 #adoptParentSteerForRunningTurn 은 이미 돌던 turn 에 부모 steer 레코드로 bracket 을 열고, steer 가
|
|
1672
|
+
// 큐에 남으면(stranded) 침묵한다. 선등록이 그 bracket 에도 걸리면 stranded turn 이 job 으로 부모에게 답하고
|
|
1673
|
+
// 이어받은 continuation 이 또 답해 부모가 2건을 받는다. 그래서 관찰자에 입양 표시를 넘기고(아래 두 항목)
|
|
1674
|
+
// 입양 bracket 만 선등록을 건너뛴다: yield 시점 등록과 relay 는 18.6.0 과 같다. 부모가 깨운 wake·continuation
|
|
1675
|
+
// bracket 의 job 전달은 upstream 그대로다(ADAPT). 회귀: core-relay-regression-test.ts [1]·[2].
|
|
1676
|
+
// 이 헤더는 18.6.0 에서도 같은 줄이라 두 판 모두 적용된다(18.6.0 에서 bracket 은 쓰이지 않는다).
|
|
1677
|
+
file: "src/task/executor.ts",
|
|
1678
|
+
marker: "session.setIrcWakeTurnObserver((records, bracket) => {",
|
|
1679
|
+
anchor: "\tsession.setIrcWakeTurnObserver(records => {",
|
|
1680
|
+
patched: "\tsession.setIrcWakeTurnObserver((records, bracket) => {",
|
|
1681
|
+
},
|
|
1682
|
+
{
|
|
1683
|
+
file: "src/task/executor.ts",
|
|
1684
|
+
marker: "if (bracket?.runningTurn !== true && wakeSources(records, id).some(source => source.from === ownerId)) {",
|
|
1685
|
+
anchor: "\t\tif (wakeSources(records, id).some(source => source.from === ownerId)) registerWakeJob();",
|
|
1686
|
+
patched: ` // A bracket opened over a turn that was already running (a parent steer
|
|
1687
|
+
// adopted mid-turn) is not parent-woken work: that turn may leave the steer
|
|
1688
|
+
// queued, and the continuation that consumes it owns the answer. Keep the
|
|
1689
|
+
// yield-time registration for it so a stranded turn stays silent.
|
|
1690
|
+
if (bracket?.runningTurn !== true && wakeSources(records, id).some(source => source.from === ownerId)) {
|
|
1691
|
+
registerWakeJob();
|
|
1692
|
+
}`,
|
|
1693
|
+
// 18.6.0 에는 선등록이 없다(job 은 yield 시점에만). 그 판의 no-op.
|
|
1694
|
+
alternates: [{
|
|
1695
|
+
file: "src/task/executor.ts",
|
|
1696
|
+
excludes: "wakeSources(records, id).some(source => source.from === ownerId)",
|
|
1697
|
+
marker: "\t\t\tonYieldAccepted: registerWakeJob,",
|
|
1698
|
+
anchor: "\t\t\tonYieldAccepted: registerWakeJob,",
|
|
1699
|
+
patched: "\t\t\tonYieldAccepted: registerWakeJob,",
|
|
1700
|
+
}],
|
|
1701
|
+
},
|
|
1629
1702
|
// relay 본문의 실패/취소 분기는 18.2.1에서 upstream이 가져갔다. `relayWakeTurnOutput`이
|
|
1630
1703
|
// `error/aborted/abortReason/finalizeError`를 받고 `buildWakeRelayBody`가 성공·실패·취소를
|
|
1631
1704
|
// 각각의 본문으로 만들며, 호출 자체도 `finally`에서 무조건 일어난다(예전에는
|
|
@@ -3043,7 +3116,7 @@ import { isUnexpectedSocketCloseMessage } from "@oh-my-pi/pi-utils/fetch-retry";
|
|
|
3043
3116
|
{
|
|
3044
3117
|
// 2026-10-04 실측: Maker 가 측정 job(bash async)을 띄우고 턴을 끝낸 지 task.agentIdleTtlMs(기본 420000ms)
|
|
3045
3118
|
// 뒤 park() 가 세션을 dispose 했다. park 는 대기 중인 async 작업을 보지 않아 job 완료 알림이 전달되지 않고
|
|
3046
|
-
// 남은 작업도 끊겼다(upstream 18.6.0 도 같다). 커밋 직전 재확인에서 작업이 남아 있으면 dispose 하지 않고
|
|
3119
|
+
// 남은 작업도 끊겼다(upstream 18.6.0·18.6.1 도 같다). 커밋 직전 재확인에서 작업이 남아 있으면 dispose 하지 않고
|
|
3047
3120
|
// idle 타이머를 다시 건다. job 은 실행 한도, 남은 전달·yield 큐는 idle flush 로 끝나므로 영구 잔류는 없다.
|
|
3048
3121
|
file: "src/registry/agent-lifecycle.ts",
|
|
3049
3122
|
marker: "// HANSE: keep sessions with pending async work",
|
|
@@ -5887,6 +5960,15 @@ export class LearnTool implements AgentTool<LearnSchema> {`,
|
|
|
5887
5960
|
patched: "unique name; ready requires name; no async/timeout. env adds variables (exported before the command); pty defaults true.",
|
|
5888
5961
|
}],
|
|
5889
5962
|
},
|
|
5963
|
+
{
|
|
5964
|
+
// 2026-10-04 집계: bash 안의 `powershell -Command "...$x..."` 가 command-guard 에 막힌 일이 14일 14건(10-02 이후 12)이다.
|
|
5965
|
+
// 규칙은 RULES·skill 에 있지만 실수는 bash 호출 자리에서 나므로, Windows 에서만 도구 설명에 우회 경로를 적는다.
|
|
5966
|
+
// patched 에 달러 기호를 넣지 않는다: 문자열 replace 가 달러+백틱을 '일치 앞 전체' 로 해석해 파일을 망가뜨렸다.
|
|
5967
|
+
file: "src/prompts/tools/bash.md",
|
|
5968
|
+
marker: "{{#if isWindows}}PowerShell logic:",
|
|
5969
|
+
anchor: "Internal URIs work as paths for builtins/coreutils, redirects, globs.\n",
|
|
5970
|
+
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",
|
|
5971
|
+
},
|
|
5890
5972
|
{
|
|
5891
5973
|
// 같은 집계: `todo` append 에 phase 를 빠뜨리면 거절됐다(사흘간 9건). phase 가 없으면 아직 안 끝난
|
|
5892
5974
|
// 일이 있는 첫 phase, 없으면 마지막 phase, phase 가 없으면 init 기본 이름에 붙인다.
|
|
@@ -6096,32 +6178,8 @@ function koreanStem(token: string): string {
|
|
|
6096
6178
|
file: "../pi-mnemopi/src/core/embeddings.ts",
|
|
6097
6179
|
marker: "// HANSE: local embedding fingerprint and e5 prefixes",
|
|
6098
6180
|
anchor: "export function currentEmbeddingModel(): string {\n\treturn defaultModel();\n}\n",
|
|
6099
|
-
patched:
|
|
6100
|
-
|
|
6101
|
-
|
|
6102
|
-
/** The local fastembed model in use (no injected provider, not an API model), or null. */
|
|
6103
|
-
function localEmbeddingModel(): string | null {
|
|
6104
|
-
if (resolveEmbeddingProvider(activeEmbeddingOptions()?.provider) !== undefined || providerOverride !== null) return null;
|
|
6105
|
-
const model = defaultModel();
|
|
6106
|
-
return isApiModel(model) ? null : model;
|
|
6107
|
-
}
|
|
6108
|
-
|
|
6109
|
-
function usesE5Prefix(): boolean {
|
|
6110
|
-
const model = localEmbeddingModel();
|
|
6111
|
-
return model !== null && /(^|[/_-])e5([-_]|$)/i.test(model);
|
|
6112
|
-
}
|
|
6113
|
-
|
|
6114
|
-
/** Adds the e5 retrieval prefix for local e5 models; other models embed the text as-is. */
|
|
6115
|
-
export function e5Prefixed(kind: "query" | "passage", texts: readonly string[]): readonly string[] {
|
|
6116
|
-
return usesE5Prefix() ? texts.map(text => \`\${kind}: \${text}\`) : texts;
|
|
6117
|
-
}
|
|
6118
|
-
|
|
6119
|
-
export function currentEmbeddingModel(): string {
|
|
6120
|
-
const model = localEmbeddingModel();
|
|
6121
|
-
if (model === null) return defaultModel();
|
|
6122
|
-
return \`\${model}#\${fastembedRuntimeInstallPlan().versionKey}\${usesE5Prefix() ? \`#\${E5_PREFIX_STAMP}\` : ""}\`;
|
|
6123
|
-
}
|
|
6124
|
-
`,
|
|
6181
|
+
patched: e5EmbeddingBlock(true),
|
|
6182
|
+
legacyPatched: e5EmbeddingBlock(false),
|
|
6125
6183
|
},
|
|
6126
6184
|
{
|
|
6127
6185
|
file: "../pi-mnemopi/src/core/embeddings.ts",
|
|
@@ -6147,6 +6205,95 @@ export function currentEmbeddingModel(): string {
|
|
|
6147
6205
|
anchor: 'import { currentEmbeddingModel, embed } from "../embeddings";\n',
|
|
6148
6206
|
patched: 'import { currentEmbeddingModel, e5Prefixed, embed } from "../embeddings";\n',
|
|
6149
6207
|
},
|
|
6208
|
+
{
|
|
6209
|
+
// (7) SHMR(core/shmr.ts)도 같은 e5 공간을 쓴다. harmonize 는 memory_embeddings 의 저장 벡터(passage: 접두)와
|
|
6210
|
+
// embedBatch 가 새로 만든 벡터를 한 코사인 군집에서 섞는데, embedBatch 만 접두 없이 임베딩해 두 공간이 갈렸다.
|
|
6211
|
+
// 기억·belief 텍스트는 passage: 로, recallBeliefs 의 질의만 query: 로 임베딩한다. 한 호출 안에서 접두를 정해
|
|
6212
|
+
// 실패 시 hash fallback 이 묶음 전체에 걸리는 기존 계약은 그대로다. 이 벡터는 저장하지 않아 stamp 는 그대로다.
|
|
6213
|
+
file: "../pi-mnemopi/src/core/shmr.ts",
|
|
6214
|
+
marker: "// HANSE: shmr e5 prefixes",
|
|
6215
|
+
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",
|
|
6216
|
+
patched: `// HANSE: shmr e5 prefixes
|
|
6217
|
+
export async function embedBatch(
|
|
6218
|
+
texts: readonly string[],
|
|
6219
|
+
providerTexts: readonly string[] = embeddings.e5Prefixed("passage", texts),
|
|
6220
|
+
): Promise<Vector[]> {
|
|
6221
|
+
if (texts.length === 0) return [];
|
|
6222
|
+
let matrix: embeddings.EmbeddingMatrix | null = null;
|
|
6223
|
+
try {
|
|
6224
|
+
matrix = await embeddings.embed(providerTexts);
|
|
6225
|
+
`,
|
|
6226
|
+
},
|
|
6227
|
+
{
|
|
6228
|
+
file: "../pi-mnemopi/src/core/shmr.ts",
|
|
6229
|
+
marker: 'embeddings.e5Prefixed("query", [query])',
|
|
6230
|
+
anchor: "\tconst vectors = await embedBatch([query, ...rows.map(row => row.object)]);\n",
|
|
6231
|
+
patched: ` const objects = rows.map(row => row.object);
|
|
6232
|
+
const vectors = await embedBatch(
|
|
6233
|
+
[query, ...objects],
|
|
6234
|
+
[...embeddings.e5Prefixed("query", [query]), ...embeddings.e5Prefixed("passage", objects)],
|
|
6235
|
+
);
|
|
6236
|
+
`,
|
|
6237
|
+
},
|
|
6238
|
+
{
|
|
6239
|
+
// (8) 2026-10-05 후속 측정(재임베딩 복사본, 190문항 + 교차 44 + 대조 70): 한국어 질의에 영어로 저장한 교훈은
|
|
6240
|
+
// dense 점수가 1위와 거의 같은데 어휘 점수가 0.034 대 0.277 로 밀려 hit@8 14.3% 였다. 질의와 기억의 주 문자
|
|
6241
|
+
// (한글/라틴)가 다르면 어휘 겹침이 구조적으로 0 에 가까우므로 working 기억의 어휘 점수에 하한 0.3 을 둔다.
|
|
6242
|
+
// e5 코사인은 0.6~0.9 에 몰려 기존 dense 하한 0.65 가 거의 거르지 못해 e5 일 때만 0.82 로 올린다.
|
|
6243
|
+
// 둘을 함께 쓰면 질문 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.
|
|
6244
|
+
// 무관 질의에도 상위 기억을 채우는 동작은 남는다: 점수 컷은 대조 주입률 1.4% 에서 정답 hit@8 이 77→65 로 떨어져 넣지 않았다.
|
|
6245
|
+
file: "../pi-mnemopi/src/core/beam/recall.ts",
|
|
6246
|
+
marker: "import { embedQuery, usesE5Prefix } from",
|
|
6247
|
+
anchor: 'import { embedQuery } from "../embeddings";\n',
|
|
6248
|
+
patched: 'import { embedQuery, usesE5Prefix } from "../embeddings";\n',
|
|
6249
|
+
},
|
|
6250
|
+
{
|
|
6251
|
+
file: "../pi-mnemopi/src/core/beam/recall.ts",
|
|
6252
|
+
marker: "\t__queryHangulMajority?: boolean;\n",
|
|
6253
|
+
anchor: "\tupdateRecallCounts?: boolean;\n};\n",
|
|
6254
|
+
patched: "\tupdateRecallCounts?: boolean;\n\t// HANSE: cross-script recall (recall() 이 정해 scoreCandidate 에 넘긴다)\n\t__queryHangulMajority?: boolean;\n\t__denseFloor?: number;\n};\n",
|
|
6255
|
+
},
|
|
6256
|
+
{
|
|
6257
|
+
file: "../pi-mnemopi/src/core/beam/recall.ts",
|
|
6258
|
+
marker: "const CROSS_SCRIPT_LEXICAL_FLOOR = 0.3;",
|
|
6259
|
+
anchor: "function scoreCandidate(\n\tcandidate: MemoryCandidate,\n",
|
|
6260
|
+
patched: `// HANSE: cross-script recall
|
|
6261
|
+
const CROSS_SCRIPT_LEXICAL_FLOOR = 0.3;
|
|
6262
|
+
const E5_DENSE_FLOOR = 0.82;
|
|
6263
|
+
|
|
6264
|
+
/** 한글과 라틴 글자 중 한글이 절반 이상이면 true. 둘 다 없으면 false. */
|
|
6265
|
+
function hangulMajority(text: string): boolean {
|
|
6266
|
+
const hangul = text.match(/[\\uac00-\\ud7af]/g)?.length ?? 0;
|
|
6267
|
+
const latin = text.match(/[A-Za-z]/g)?.length ?? 0;
|
|
6268
|
+
return hangul + latin > 0 && hangul / (hangul + latin) >= 0.5;
|
|
6269
|
+
}
|
|
6270
|
+
|
|
6271
|
+
function scoreCandidate(
|
|
6272
|
+
candidate: MemoryCandidate,
|
|
6273
|
+
`,
|
|
6274
|
+
},
|
|
6275
|
+
{
|
|
6276
|
+
file: "../pi-mnemopi/src/core/beam/recall.ts",
|
|
6277
|
+
marker: "// HANSE: cross-script lexical floor and e5 dense floor",
|
|
6278
|
+
anchor: "\tconst lexical = lexicalGroupRelevance(queryGroups, searchableContent);\n\tconst minRel = minimumRelevance(queryTokens);\n\tif (lexical < minRel && candidate.signals.dense < 0.65) return null;\n",
|
|
6279
|
+
patched: ` // HANSE: cross-script lexical floor and e5 dense floor
|
|
6280
|
+
let lexical = lexicalGroupRelevance(queryGroups, searchableContent);
|
|
6281
|
+
if (
|
|
6282
|
+
candidate.tierLabel === "working" &&
|
|
6283
|
+
options.__queryHangulMajority !== undefined &&
|
|
6284
|
+
options.__queryHangulMajority !== hangulMajority(searchableContent)
|
|
6285
|
+
)
|
|
6286
|
+
lexical = Math.max(lexical, CROSS_SCRIPT_LEXICAL_FLOOR);
|
|
6287
|
+
const minRel = minimumRelevance(queryTokens);
|
|
6288
|
+
if (lexical < minRel && candidate.signals.dense < (options.__denseFloor ?? 0.65)) return null;
|
|
6289
|
+
`,
|
|
6290
|
+
},
|
|
6291
|
+
{
|
|
6292
|
+
file: "../pi-mnemopi/src/core/beam/recall.ts",
|
|
6293
|
+
marker: "temporalOptions.__denseFloor = usesE5Prefix()",
|
|
6294
|
+
anchor: "\tconst tokenGroups = expandedTokenGroups(query, useSynonyms);\n\tconst candidates = collectMemoryCandidates(beam, query, topK, temporalOptions);\n",
|
|
6295
|
+
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",
|
|
6296
|
+
},
|
|
6150
6297
|
{
|
|
6151
6298
|
// 2026-09-29 실측: 기억 임베딩 재구축(모델 변경·중단 뒤 재개)이 128건 묶음을 한꺼번에 worker 에
|
|
6152
6299
|
// 올렸다. worker 는 요청을 하나씩 처리하는데 요청마다 120초 타이머가 보낸 순간부터 흘러,
|
|
@@ -8996,6 +9143,12 @@ function parentSubagentServiceTiers(
|
|
|
8996
9143
|
marker: 'if(!i.endsWith(".jsonl")||i.includes(".bak")||_Re(i))continue;let a=i.slice(0,-6),',
|
|
8997
9144
|
anchor: 'if(!i.endsWith(".jsonl")||i.includes(".bak")||_Re(i))continue;let a=i.slice(0,-6),',
|
|
8998
9145
|
patched: 'if(!i.endsWith(".jsonl")||i.includes(".bak")||_Re(i))continue;let a=i.slice(0,-6),',
|
|
9146
|
+
}, {
|
|
9147
|
+
// 18.6.1 번들의 같은 upstream 조건(NRe = isAdvisorTranscriptName) no-op. 이름만 바뀌었다.
|
|
9148
|
+
file: "dist/cli.js",
|
|
9149
|
+
marker: 'if(!i.endsWith(".jsonl")||i.includes(".bak")||NRe(i))continue;let a=i.slice(0,-6),',
|
|
9150
|
+
anchor: 'if(!i.endsWith(".jsonl")||i.includes(".bak")||NRe(i))continue;let a=i.slice(0,-6),',
|
|
9151
|
+
patched: 'if(!i.endsWith(".jsonl")||i.includes(".bak")||NRe(i))continue;let a=i.slice(0,-6),',
|
|
8999
9152
|
}],
|
|
9000
9153
|
},
|
|
9001
9154
|
// 18.4.5 는 /ratchet 을 새로 넣으면서 `src/ratchet/prelude.ts`(코드)와 `prelude.js`(eval 텍스트 자산)를 같은 stem 으로
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cuelo",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.4",
|
|
4
4
|
"description": "CUELO — open-source AI coding agent workspace and harness for omp (oh-my-pi)",
|
|
5
5
|
"homepage": "https://github.com/gim47656-ship-it/CUELO#readme",
|
|
6
6
|
"repository": {
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"license": "MIT",
|
|
31
31
|
"cueloBuild": {
|
|
32
32
|
"distribution": "cuelo",
|
|
33
|
-
"coreVersion": "18.6.
|
|
33
|
+
"coreVersion": "18.6.1"
|
|
34
34
|
},
|
|
35
35
|
"engines": {
|
|
36
36
|
"node": ">=22.19.0",
|
|
@@ -88,11 +88,11 @@
|
|
|
88
88
|
"test:coverage": "bun test --coverage ./app ./components ./hooks ./lib ./public ./bin ./install.test.mjs"
|
|
89
89
|
},
|
|
90
90
|
"dependencies": {
|
|
91
|
-
"@oh-my-pi/pi-agent-core": "18.6.
|
|
92
|
-
"@oh-my-pi/pi-ai": "18.6.
|
|
93
|
-
"@oh-my-pi/pi-coding-agent": "18.6.
|
|
94
|
-
"@oh-my-pi/pi-tui": "18.6.
|
|
95
|
-
"@oh-my-pi/pi-utils": "18.6.
|
|
91
|
+
"@oh-my-pi/pi-agent-core": "18.6.1",
|
|
92
|
+
"@oh-my-pi/pi-ai": "18.6.1",
|
|
93
|
+
"@oh-my-pi/pi-coding-agent": "18.6.1",
|
|
94
|
+
"@oh-my-pi/pi-tui": "18.6.1",
|
|
95
|
+
"@oh-my-pi/pi-utils": "18.6.1",
|
|
96
96
|
"@seed-design/css": "2.8.0",
|
|
97
97
|
"@seed-design/react": "2.4.1",
|
|
98
98
|
"@seed-design/tailwind4-theme": "2.4.0",
|
|
File without changes
|
|
File without changes
|