cuelo 0.9.8 → 0.10.0
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 +8 -8
- 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/update-maintenance/route.js +9 -4
- 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 +8 -8
- 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-a48cda671c8b915d.js → 9575-6f450839544bc6b3.js} +2 -2
- package/.next/static/chunks/app/layout-d8c1b10303bcd958.js +1 -0
- package/.next/trace +108 -108
- package/.next/trace-build +1 -1
- package/README.md +2 -2
- package/Tools/CUELO_Setup/files/native-runtime-patch.js +3 -3
- package/Tools/OMP_Global_Config/agent/AGENTS.md +1 -1
- package/Tools/OMP_Global_Config/agent/RULES.md +2 -2
- package/Tools/OMP_Global_Config/agent/agents/maker.md +2 -2
- package/Tools/OMP_Global_Config/agent/extensions/command-guard/powershell-syntax.ts +63 -22
- package/Tools/OMP_Global_Config/agent/extensions/external-advice-check.ts +26 -129
- package/Tools/OMP_Global_Config/agent/extensions/jev-runtime.ts +206 -60
- package/Tools/OMP_Global_Config/agent/extensions/lib/maker-routing.ts +102 -64
- package/Tools/OMP_Global_Config/agent/extensions/todo-nudge.ts +43 -138
- package/Tools/OMP_Global_Config/agent/extensions/turn-end-guard.ts +7 -2
- package/Tools/OMP_Global_Config/agent/prompt-copies/AGENTS.en.md +2 -2
- package/Tools/OMP_Global_Config/agent/prompt-copies/RULES.en.md +3 -3
- package/Tools/OMP_Global_Config/agent/rules/harness-policy.json +41 -74
- package/Tools/OMP_Global_Config/agent/rules/meta-harness.md +2 -2
- package/Tools/OMP_Global_Config/agent/rules/omp-harness.md +4 -3
- package/Tools/OMP_Global_Config/agent/rules/subagent.md +55 -45
- package/Tools/OMP_Global_Config/agent/rules/task-guard.md +4 -3
- package/Tools/OMP_Global_Config/patches/apply-core-patch.mjs +270 -1
- package/package.json +7 -7
- package/public/sw.js +16 -6
- package/.next/static/chunks/app/layout-489bc5b73326436e.js +0 -1
- /package/.next/static/{pzZcPiD8nl6i7i_Ne9Ko- → MYIe6QFbh4yP3_wc_Fetr}/_buildManifest.js +0 -0
- /package/.next/static/{pzZcPiD8nl6i7i_Ne9Ko- → MYIe6QFbh4yP3_wc_Fetr}/_ssgManifest.js +0 -0
|
@@ -85,6 +85,18 @@ 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
|
+
* #310의 18.7.0 no-op 후보(RETIRE 유지). upstream이 같은 행의 tps만 93→97로 바꿨고 prefixBinding·binding controls는 그대로다.
|
|
90
|
+
*/
|
|
91
|
+
const OPUS55_ROW_1870 = OPUS55_ROW_1846.patched.replace('"tps":95.2,', '"tps":97,');
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* 18.4.6 후보의 성립 조건: 행 시작부터 `"tps":95.2,`까지. 18.4.6 anchor와 patched가 모두 이 머리로 시작하므로 그 후보가
|
|
95
|
+
* 원래 성립하던 상태(순정 18.4.6·적용본)에서는 늘 참이다. tps 뒤 조각인 marker만 맞는 다른 판의 행(18.7.0 tps 97)을
|
|
96
|
+
* 18.4.6 적용본으로 잘못 읽어 --revert가 없는 patched를 찾다 실패하는 일을 막는다. tps가 다시 바뀌어도 같다.
|
|
97
|
+
*/
|
|
98
|
+
const OPUS55_HEAD_1846 = OPUS55_ROW_1846.anchor.slice(0, OPUS55_ROW_1846.anchor.indexOf('"tps":95.2,') + '"tps":95.2,'.length);
|
|
99
|
+
|
|
88
100
|
/**
|
|
89
101
|
* learn topic upsert 적용본. 갱신 때 metadata 의 session_id/cwd 는 최초 저장자로 남고,
|
|
90
102
|
* updated_session_id/updated_cwd/updated_at 이 최신 정정자·시점이며 context 는 최신 이유다.
|
|
@@ -3588,6 +3600,8 @@ export function revivedTaskDepth(ref: { parentId?: string }, registry: AgentRegi
|
|
|
3588
3600
|
},
|
|
3589
3601
|
{
|
|
3590
3602
|
file: "../pi-ai/src/auth/affinity.ts",
|
|
3603
|
+
// 18.8.0 적용본도 같은 marker 를 가지므로 그 판의 provider 별 LRU 기록 줄로 가른다(아래 alternate).
|
|
3604
|
+
excludes: "persistedSessions.set(sessionId, {",
|
|
3591
3605
|
marker: "\t\t\tpersisted.exactLabel === keptExactLabel &&\n",
|
|
3592
3606
|
anchor: ` persisted.explicit === isExplicit &&
|
|
3593
3607
|
Math.abs(nowMs - persisted.lastUsedAtMs) < SESSION_STICKY_PERSIST_INTERVAL_MS
|
|
@@ -3622,6 +3636,40 @@ export function revivedTaskDepth(ref: { parentId?: string }, registry: AgentRegi
|
|
|
3622
3636
|
marker: "\t\t\t\t// Expires in 30 days\n\t\t\t\tconst expiresAtSec = Math.floor(nowMs / 1000) + 30 * 24 * 60 * 60;\n\t\t\t\tthis.#store.setCache(cacheKey, JSON.stringify(sessionCredential), expiresAtSec);\n",
|
|
3623
3637
|
anchor: "\t\t\t\t// Expires in 30 days\n\t\t\t\tconst expiresAtSec = Math.floor(nowMs / 1000) + 30 * 24 * 60 * 60;\n\t\t\t\tthis.#store.setCache(cacheKey, JSON.stringify(sessionCredential), expiresAtSec);\n",
|
|
3624
3638
|
patched: "\t\t\t\t// Expires in 30 days\n\t\t\t\tconst expiresAtSec = Math.floor(nowMs / 1000) + 30 * 24 * 60 * 60;\n\t\t\t\tthis.#store.setCache(cacheKey, JSON.stringify(sessionCredential), expiresAtSec);\n",
|
|
3639
|
+
}, {
|
|
3640
|
+
// 18.8.0 은 persisted row 를 provider 별 LRU(sessionId 키, SESSION_AFFINITY_MAX_SESSIONS_PER_PROVIDER)로 옮겼다.
|
|
3641
|
+
// 같은 비교·기록에 exactLabel 을 넣는 의미는 그대로다.
|
|
3642
|
+
file: "../pi-ai/src/auth/affinity.ts",
|
|
3643
|
+
requires: "persistedSessions.set(sessionId, {",
|
|
3644
|
+
marker: "\t\t\tpersisted.exactLabel === keptExactLabel &&\n",
|
|
3645
|
+
anchor: ` persisted.explicit === isExplicit &&
|
|
3646
|
+
Math.abs(nowMs - persisted.lastUsedAtMs) < SESSION_STICKY_PERSIST_INTERVAL_MS
|
|
3647
|
+
) {
|
|
3648
|
+
return;
|
|
3649
|
+
}
|
|
3650
|
+
try {
|
|
3651
|
+
this.#store.setCache(cacheKey, JSON.stringify(sessionCredential), expiresAtSec);
|
|
3652
|
+
persistedSessions.set(sessionId, {
|
|
3653
|
+
type,
|
|
3654
|
+
credentialId,
|
|
3655
|
+
explicit: isExplicit,
|
|
3656
|
+
lastUsedAtMs: nowMs,
|
|
3657
|
+
});`,
|
|
3658
|
+
patched: ` persisted.explicit === isExplicit &&
|
|
3659
|
+
persisted.exactLabel === keptExactLabel &&
|
|
3660
|
+
Math.abs(nowMs - persisted.lastUsedAtMs) < SESSION_STICKY_PERSIST_INTERVAL_MS
|
|
3661
|
+
) {
|
|
3662
|
+
return;
|
|
3663
|
+
}
|
|
3664
|
+
try {
|
|
3665
|
+
this.#store.setCache(cacheKey, JSON.stringify(sessionCredential), expiresAtSec);
|
|
3666
|
+
persistedSessions.set(sessionId, {
|
|
3667
|
+
type,
|
|
3668
|
+
credentialId,
|
|
3669
|
+
explicit: isExplicit,
|
|
3670
|
+
lastUsedAtMs: nowMs,
|
|
3671
|
+
exactLabel: keptExactLabel,
|
|
3672
|
+
});`,
|
|
3625
3673
|
}],
|
|
3626
3674
|
},
|
|
3627
3675
|
{
|
|
@@ -4145,6 +4193,10 @@ import { resolveUsedFraction } from "../usage";`,
|
|
|
4145
4193
|
}],
|
|
4146
4194
|
},
|
|
4147
4195
|
{
|
|
4196
|
+
// 18.7.0: upstream 이 `if (!currentModel) return false;` 바로 뒤에 reserve 승인 범위용 `sessionId` 줄을 넣어
|
|
4197
|
+
// (#usageReserveApproval) 원 앵커가 깨졌다. 두 판 적용본의 marker 가 같으므로 그 두 줄 묶음으로 후보를 가른다.
|
|
4198
|
+
// 18.7.0 후보는 CUELO 블록을 sessionId 줄 뒤에 둬서 가르는 문자열이 적용 뒤에도 남는다(upstream 줄은 그대로).
|
|
4199
|
+
excludes: "\t\tif (!currentModel) return false;\n\t\tconst sessionId = this.#host.sessionManager.getSessionId();\n",
|
|
4148
4200
|
file: "src/session/turn-recovery.ts",
|
|
4149
4201
|
marker: `// Usage preflight for an exact summon evaluates only its selected identity.`,
|
|
4150
4202
|
anchor: ` const currentModel = this.#host.model();
|
|
@@ -4160,6 +4212,26 @@ import { resolveUsedFraction } from "../usage";`,
|
|
|
4160
4212
|
);
|
|
4161
4213
|
const currentSelector = formatRetryFallbackSelector(currentModel, this.#host.thinkingLevel());
|
|
4162
4214
|
let health: ModelUsageHealth;`,
|
|
4215
|
+
alternates: [{
|
|
4216
|
+
file: "src/session/turn-recovery.ts",
|
|
4217
|
+
requires: "\t\tif (!currentModel) return false;\n\t\tconst sessionId = this.#host.sessionManager.getSessionId();\n",
|
|
4218
|
+
marker: `// Usage preflight for an exact summon evaluates only its selected identity.`,
|
|
4219
|
+
anchor: ` const currentModel = this.#host.model();
|
|
4220
|
+
if (!currentModel) return false;
|
|
4221
|
+
const sessionId = this.#host.sessionManager.getSessionId();
|
|
4222
|
+
const currentSelector = formatRetryFallbackSelector(currentModel, this.#host.thinkingLevel());
|
|
4223
|
+
let health: ModelUsageHealth;`,
|
|
4224
|
+
patched: ` const currentModel = this.#host.model();
|
|
4225
|
+
if (!currentModel) return false;
|
|
4226
|
+
const sessionId = this.#host.sessionManager.getSessionId();
|
|
4227
|
+
// Usage preflight for an exact summon evaluates only its selected identity.
|
|
4228
|
+
const exactAccountLabel = this.#host.modelRegistry.authStorage.sessions.exactLabel(
|
|
4229
|
+
currentModel.provider,
|
|
4230
|
+
this.#host.sessionId(),
|
|
4231
|
+
);
|
|
4232
|
+
const currentSelector = formatRetryFallbackSelector(currentModel, this.#host.thinkingLevel());
|
|
4233
|
+
let health: ModelUsageHealth;`,
|
|
4234
|
+
}],
|
|
4163
4235
|
},
|
|
4164
4236
|
{
|
|
4165
4237
|
file: "src/session/turn-recovery.ts",
|
|
@@ -5142,9 +5214,19 @@ function resolveExactWeb6Candidate(session: ToolSession): CompletionCandidate[]
|
|
|
5142
5214
|
// completed pending/blocked todos, bypassing terminal validation and the
|
|
5143
5215
|
// canonical todo tool receipt.
|
|
5144
5216
|
file: "src/modes/interactive-mode.ts",
|
|
5217
|
+
// 18.8.0 은 이 flag 를 lifecycle(전체 HUD 동기화)·progress(subagent key 가 바뀔 때만 다시 그림) 구분에 쓴다.
|
|
5218
|
+
// 그 판에서는 필드를 남기고(아래 no-op alternate) reconcile 호출만 #185 의 18.8.0 후보가 걷어낸다.
|
|
5219
|
+
excludes: "#todoHudSubagentKey",
|
|
5145
5220
|
marker: "Subagent lifecycle is review evidence only; it never accepts TODO completion.",
|
|
5146
5221
|
anchor: ` #observerUiSyncNeedsTodoReconcile = false;`,
|
|
5147
5222
|
patched: ` // Subagent lifecycle is review evidence only; it never accepts TODO completion.`,
|
|
5223
|
+
alternates: [{
|
|
5224
|
+
file: "src/modes/interactive-mode.ts",
|
|
5225
|
+
requires: "#todoHudSubagentKey",
|
|
5226
|
+
marker: "\t#observerUiSyncNeedsTodoReconcile = false;\n\t/** Active subagent descriptions the todo HUD last rendered with (joined); see #flushObserverUiSync. */\n",
|
|
5227
|
+
anchor: "\t#observerUiSyncNeedsTodoReconcile = false;\n\t/** Active subagent descriptions the todo HUD last rendered with (joined); see #flushObserverUiSync. */\n",
|
|
5228
|
+
patched: "\t#observerUiSyncNeedsTodoReconcile = false;\n\t/** Active subagent descriptions the todo HUD last rendered with (joined); see #flushObserverUiSync. */\n",
|
|
5229
|
+
}],
|
|
5148
5230
|
},
|
|
5149
5231
|
{
|
|
5150
5232
|
// 18.2.10 은 이 메서드의 `appendCustomEntry` 호출만 여러 줄로 재정렬했다(의미 변화 없음).
|
|
@@ -5338,6 +5420,24 @@ function resolveExactWeb6Candidate(session: ToolSession): CompletionCandidate[]
|
|
|
5338
5420
|
}
|
|
5339
5421
|
this.#cancelSubagentPreviewTick();
|
|
5340
5422
|
}`,
|
|
5423
|
+
}, {
|
|
5424
|
+
// 18.8.0 은 flush 를 lifecycle 변화(reconcile·HUD 동기화·다시 그림)와 progress tick(subagent key 가 바뀔 때만
|
|
5425
|
+
// 다시 그림)으로 갈랐다(upstream auto-clear 수정). 그 구분은 그대로 두고 lifecycle 분기의 reconcile 호출만 뺀다.
|
|
5426
|
+
file: "src/modes/interactive-mode.ts",
|
|
5427
|
+
marker: "\t\t\t// Lifecycle changes only refresh observer and TODO presentation. They do\n",
|
|
5428
|
+
anchor: ` #flushObserverUiSync(): void {
|
|
5429
|
+
this.syncRunningSubagentBadge({ requestRender: false });
|
|
5430
|
+
if (this.#observerUiSyncNeedsTodoReconcile) {
|
|
5431
|
+
this.#observerUiSyncNeedsTodoReconcile = false;
|
|
5432
|
+
this.#reconcileTodosWithSubagents();
|
|
5433
|
+
this.#syncTodoHudState(this.#todoPhasesOwner ?? this.session);`,
|
|
5434
|
+
patched: ` #flushObserverUiSync(): void {
|
|
5435
|
+
this.syncRunningSubagentBadge({ requestRender: false });
|
|
5436
|
+
if (this.#observerUiSyncNeedsTodoReconcile) {
|
|
5437
|
+
// Lifecycle changes only refresh observer and TODO presentation. They do
|
|
5438
|
+
// not constitute Main acceptance and therefore never change TodoTracker.
|
|
5439
|
+
this.#observerUiSyncNeedsTodoReconcile = false;
|
|
5440
|
+
this.#syncTodoHudState(this.#todoPhasesOwner ?? this.session);`,
|
|
5341
5441
|
}],
|
|
5342
5442
|
},
|
|
5343
5443
|
{
|
|
@@ -6773,6 +6873,23 @@ function raiseToAutoThinkingFloor(model: Model, level: Effort | undefined, setti
|
|
|
6773
6873
|
this.#thinkingLevelCeiling,
|
|
6774
6874
|
);`,
|
|
6775
6875
|
},
|
|
6876
|
+
{
|
|
6877
|
+
// Maker auto 범위(2026-10-08 사용자 결정): child 의 auto 는 정책 하한·상한 없이 그 모델 최대(Opus max)까지 고른다.
|
|
6878
|
+
// Main 의 medium~xhigh 는 그대로 둔다. 모델이 없는 단계는 분류기 ceiling(지원 effort 확인)과 clamp 가 떨어뜨리고,
|
|
6879
|
+
// concrete effort 로 띄운 child 는 auto 가 아니라 영향이 없다. per-spawn overrides 가 뒤에 펼쳐지므로 여전히 이긴다.
|
|
6880
|
+
// 검증: core-agent-thinking-test.ts [child-range].
|
|
6881
|
+
file: "src/task/executor.ts",
|
|
6882
|
+
marker: "\t\t\"providers.autoThinkingMaxEffort\": \"max\",\n",
|
|
6883
|
+
anchor: ` defaultThinkingLevel: cfgDefaultThinkingLevel.get(baseSettings),
|
|
6884
|
+
`,
|
|
6885
|
+
patched: ` defaultThinkingLevel: cfgDefaultThinkingLevel.get(baseSettings),
|
|
6886
|
+
// CUELO: a child's \`auto\` has no policy floor or cap - from the lowest auto level up to the
|
|
6887
|
+
// model's maximum. The classifier ceiling and clamp still drop levels the model lacks; the
|
|
6888
|
+
// parent keeps its own configured range.
|
|
6889
|
+
"providers.autoThinkingMinEffort": "low",
|
|
6890
|
+
"providers.autoThinkingMaxEffort": "max",
|
|
6891
|
+
`,
|
|
6892
|
+
},
|
|
6776
6893
|
{
|
|
6777
6894
|
// 2026-09-28 도구 오류 집계: `computer.window(65822)`처럼 숫자 id를 넘기면 필터 객체로 해석돼
|
|
6778
6895
|
// 조건이 하나도 걸리지 않아 모든 창이 일치했고("multiple windows match 65822"), `title: /정규식/`은
|
|
@@ -9957,10 +10074,12 @@ function parentSubagentServiceTiers(
|
|
|
9957
10074
|
anchor: OPUS55_ROW_18410.anchor.replace(OPUS55_TPS_18410, OPUS55_TPS_18412),
|
|
9958
10075
|
patched: OPUS55_ROW_18410.patched.replace(OPUS55_TPS_18410, OPUS55_TPS_18412),
|
|
9959
10076
|
// 18.5.1: 위 OPUS55_ROW_1851 no-op(RETIRE). 18.4.6 후보는 그 행이 있으면 성립하지 않는다.
|
|
10077
|
+
// 18.7.0: OPUS55_ROW_1870 no-op(RETIRE 유지). 18.4.6 후보는 자기 행 머리(OPUS55_HEAD_1846)가 있을 때만 성립한다.
|
|
9960
10078
|
alternates: [
|
|
9961
10079
|
OPUS55_ROW_18410,
|
|
9962
|
-
{ ...OPUS55_ROW_1846, excludes: OPUS55_ROW_1851 },
|
|
10080
|
+
{ ...OPUS55_ROW_1846, excludes: OPUS55_ROW_1851, requires: OPUS55_HEAD_1846 },
|
|
9963
10081
|
{ file: "../pi-catalog/src/models.json", marker: OPUS55_ROW_1851, anchor: OPUS55_ROW_1851, patched: OPUS55_ROW_1851 },
|
|
10082
|
+
{ file: "../pi-catalog/src/models.json", marker: OPUS55_ROW_1870, anchor: OPUS55_ROW_1870, patched: OPUS55_ROW_1870 },
|
|
9964
10083
|
],
|
|
9965
10084
|
},
|
|
9966
10085
|
{
|
|
@@ -10153,7 +10272,12 @@ function parentSubagentServiceTiers(
|
|
|
10153
10272
|
this.#autoResolvedLevel = effort;`,
|
|
10154
10273
|
},
|
|
10155
10274
|
{
|
|
10275
|
+
// 18.7.0: upstream 이 setThinkingLevel·cycleThinkingLevel 앞에 `this.#prewalk.releaseHandoff();` 를 넣어(명시 선택이
|
|
10276
|
+
// prewalk handoff 를 소유한다) 원 앵커가 깨졌다. upstream 본문은 그대로 두고 같은 자리에 상한 setter/getter 를 붙인다.
|
|
10277
|
+
// 상한은 선택이 아니라 경계이고 재기동 복원(record:false)도 이 setter 를 타므로 여기에는 releaseHandoff 를 넣지 않는다.
|
|
10278
|
+
// 두 판 적용본의 marker 가 같으므로 upstream 의 두 줄 묶음으로 후보를 가른다.
|
|
10156
10279
|
file: "src/session/agent-session.ts",
|
|
10280
|
+
excludes: "\t\tthis.#prewalk.releaseHandoff();\n\t\tthis.#models.setThinkingLevel(level, persist);",
|
|
10157
10281
|
marker: "\tsetThinkingLevelCeiling(ceiling: Effort | undefined, record: boolean = true): void {\n\t\tthis.#models.setThinkingLevelCeiling(ceiling, record);",
|
|
10158
10282
|
anchor: ` /** Selects the session thinking level and optionally persists it as the default. */
|
|
10159
10283
|
setThinkingLevel(level: ConfiguredThinkingLevel | undefined, persist: boolean = false): void {
|
|
@@ -10175,6 +10299,33 @@ function parentSubagentServiceTiers(
|
|
|
10175
10299
|
return this.#models.thinkingLevelCeiling;
|
|
10176
10300
|
}
|
|
10177
10301
|
`,
|
|
10302
|
+
alternates: [{
|
|
10303
|
+
file: "src/session/agent-session.ts",
|
|
10304
|
+
requires: "\t\tthis.#prewalk.releaseHandoff();\n\t\tthis.#models.setThinkingLevel(level, persist);",
|
|
10305
|
+
marker: "\tsetThinkingLevelCeiling(ceiling: Effort | undefined, record: boolean = true): void {\n\t\tthis.#models.setThinkingLevelCeiling(ceiling, record);",
|
|
10306
|
+
anchor: ` /** Selects the session thinking level and optionally persists it as the default. */
|
|
10307
|
+
setThinkingLevel(level: ConfiguredThinkingLevel | undefined, persist: boolean = false): void {
|
|
10308
|
+
this.#prewalk.releaseHandoff();
|
|
10309
|
+
this.#models.setThinkingLevel(level, persist);
|
|
10310
|
+
}
|
|
10311
|
+
`,
|
|
10312
|
+
patched: ` /** Selects the session thinking level and optionally persists it as the default. */
|
|
10313
|
+
setThinkingLevel(level: ConfiguredThinkingLevel | undefined, persist: boolean = false): void {
|
|
10314
|
+
this.#prewalk.releaseHandoff();
|
|
10315
|
+
this.#models.setThinkingLevel(level, persist);
|
|
10316
|
+
}
|
|
10317
|
+
|
|
10318
|
+
/** CUELO: replaces the user effort ceiling ("auto, but at most X"); a spawn ceiling still bounds it. */
|
|
10319
|
+
setThinkingLevelCeiling(ceiling: Effort | undefined, record: boolean = true): void {
|
|
10320
|
+
this.#models.setThinkingLevelCeiling(ceiling, record);
|
|
10321
|
+
}
|
|
10322
|
+
|
|
10323
|
+
/** CUELO: effective effort ceiling, the lower of the spawn ceiling and the user ceiling. */
|
|
10324
|
+
get thinkingLevelCeiling(): Effort | undefined {
|
|
10325
|
+
return this.#models.thinkingLevelCeiling;
|
|
10326
|
+
}
|
|
10327
|
+
`,
|
|
10328
|
+
}],
|
|
10178
10329
|
},
|
|
10179
10330
|
// HTML export(세션 안 `/export`, CLI `--export`, CUELO 웹 `app/api/sessions/[id]/export`)는 세션 폴더의 `*.jsonl`을
|
|
10180
10331
|
// 전부 subagent 기록으로 싣는다. advisor는 같은 폴더에 `__advisor.jsonl`·`__advisor.<slug>.jsonl`(subagent advisor는
|
|
@@ -10246,6 +10397,18 @@ function parentSubagentServiceTiers(
|
|
|
10246
10397
|
marker: 'if(!i.endsWith(".jsonl")||i.includes(".bak")||ZRe(i))continue;let a=i.slice(0,-6),',
|
|
10247
10398
|
anchor: 'if(!i.endsWith(".jsonl")||i.includes(".bak")||ZRe(i))continue;let a=i.slice(0,-6),',
|
|
10248
10399
|
patched: 'if(!i.endsWith(".jsonl")||i.includes(".bak")||ZRe(i))continue;let a=i.slice(0,-6),',
|
|
10400
|
+
}, {
|
|
10401
|
+
// 18.7.0 번들의 같은 upstream 조건(MCe = isAdvisorTranscriptName) no-op. 이름만 바뀌었다.
|
|
10402
|
+
file: "dist/cli.js",
|
|
10403
|
+
marker: 'if(!i.endsWith(".jsonl")||i.includes(".bak")||MCe(i))continue;let a=i.slice(0,-6),',
|
|
10404
|
+
anchor: 'if(!i.endsWith(".jsonl")||i.includes(".bak")||MCe(i))continue;let a=i.slice(0,-6),',
|
|
10405
|
+
patched: 'if(!i.endsWith(".jsonl")||i.includes(".bak")||MCe(i))continue;let a=i.slice(0,-6),',
|
|
10406
|
+
}, {
|
|
10407
|
+
// 18.8.0 번들의 같은 upstream 조건(oCe = isAdvisorTranscriptName) no-op. 이름만 바뀌었다.
|
|
10408
|
+
file: "dist/cli.js",
|
|
10409
|
+
marker: 'if(!i.endsWith(".jsonl")||i.includes(".bak")||oCe(i))continue;let a=i.slice(0,-6),',
|
|
10410
|
+
anchor: 'if(!i.endsWith(".jsonl")||i.includes(".bak")||oCe(i))continue;let a=i.slice(0,-6),',
|
|
10411
|
+
patched: 'if(!i.endsWith(".jsonl")||i.includes(".bak")||oCe(i))continue;let a=i.slice(0,-6),',
|
|
10249
10412
|
}],
|
|
10250
10413
|
},
|
|
10251
10414
|
// 18.4.5 는 /ratchet 을 새로 넣으면서 `src/ratchet/prelude.ts`(코드)와 `prelude.js`(eval 텍스트 자산)를 같은 stem 으로
|
|
@@ -10487,6 +10650,62 @@ class HarmonyLeakInterruption extends Error {`,
|
|
|
10487
10650
|
// The request finished on its own; steering now waits for the normal boundary.
|
|
10488
10651
|
steerRestartClosed = true;`,
|
|
10489
10652
|
},
|
|
10653
|
+
{
|
|
10654
|
+
// CUELO P55 r4(2026-10-08, Codex 스티어링 오류 노출): native lane 은 실행 중 응답에 보낸 response.steer 를
|
|
10655
|
+
// unsupported_native_inflight_message 로 거절하면서 그 응답을 버린다. P55 는 tool call 이 보인 요청을 선제 취소하지
|
|
10656
|
+
// 않고 정상 경계를 기다리는데 그 경계가 오지 않는다: 인자 스트리밍 중이던 tool call 은 미완성으로 버려지고 text 만
|
|
10657
|
+
// 남은 error 가 provider 재생(text 스트리밍됨)·세션 재시도(커밋된 text) 양쪽에서 거부돼 사용자 오류로 끝났다.
|
|
10658
|
+
// 거절된 claim 이 있고 완성된 tool call 이 없을 때만 이 끝을 steering 재시작으로 처리한다. P55 항목의 restart
|
|
10659
|
+
// helper·steerChannel 을 쓰므로 그 뒤에 둔다(anchor 는 순정본에도 그대로 있어 preflight 가 성립한다).
|
|
10660
|
+
file: "../pi-agent-core/src/agent-loop.ts",
|
|
10661
|
+
marker: "AIError.isCodexSteerRejection(event.error)",
|
|
10662
|
+
anchor: ` const event = next.value;
|
|
10663
|
+
if (event.type === "done" || event.type === "error") {
|
|
10664
|
+
`,
|
|
10665
|
+
patched: ` const event = next.value;
|
|
10666
|
+
// CUELO P55: Codex native lane rejected our live steer and dropped this response, so
|
|
10667
|
+
// the boundary the tool-call guard waits for never comes. Restart for the steering as a
|
|
10668
|
+
// requested restart would: visible text is committed, a tool call still streaming its
|
|
10669
|
+
// arguments never completed or ran and is dropped, and the rejected steering is
|
|
10670
|
+
// delivered once in this run. A completed tool call keeps the normal boundary.
|
|
10671
|
+
if (
|
|
10672
|
+
event.type === "error" &&
|
|
10673
|
+
steerRestartController &&
|
|
10674
|
+
!steerRestartClosed &&
|
|
10675
|
+
!requestSignal?.aborted &&
|
|
10676
|
+
completedToolCallIds.size === 0 &&
|
|
10677
|
+
(steerChannel?.deferred.length ?? 0) > 0 &&
|
|
10678
|
+
AIError.isCodexSteerRejection(event.error)
|
|
10679
|
+
) {
|
|
10680
|
+
// Without visible text only the dropped tool call reached listeners: discard the partial.
|
|
10681
|
+
if (!partialMessage?.content.some(block => block.type === "text" && block.text.trim().length > 0)) {
|
|
10682
|
+
partialMessage = null;
|
|
10683
|
+
}
|
|
10684
|
+
return await restartForSteering();
|
|
10685
|
+
}
|
|
10686
|
+
if (event.type === "done" || event.type === "error") {
|
|
10687
|
+
`,
|
|
10688
|
+
},
|
|
10689
|
+
{
|
|
10690
|
+
// CUELO P55 r4: 같은 거절이 완성된 tool call 뒤에 오면 재시작하지 않는다(P55 가드: tool 결과가 먼저). 응답은 서버가
|
|
10691
|
+
// 버렸으므로 upstream 의 transient stream 오류(#13847)와 같이 완성된 tool call 만 남긴 tool turn 으로 되살린다. 그러면
|
|
10692
|
+
// tool 이 실행되고 거절된 steer 는 그 결과 뒤 정상 경계에서 실린다. 이 처리가 없으면 완성된 tool call 을 든 error 로 끝났다.
|
|
10693
|
+
file: "../pi-agent-core/src/agent-loop.ts",
|
|
10694
|
+
marker: "!AIError.isCodexSteerRejection(message)",
|
|
10695
|
+
anchor: ` !AIError.isTransientStreamParseError(message.stopDetails?.explanation)
|
|
10696
|
+
)
|
|
10697
|
+
return message;
|
|
10698
|
+
return {
|
|
10699
|
+
...message,
|
|
10700
|
+
stopReason: "toolUse",`,
|
|
10701
|
+
patched: ` !AIError.isTransientStreamParseError(message.stopDetails?.explanation) &&
|
|
10702
|
+
!AIError.isCodexSteerRejection(message)
|
|
10703
|
+
)
|
|
10704
|
+
return message;
|
|
10705
|
+
return {
|
|
10706
|
+
...message,
|
|
10707
|
+
stopReason: "toolUse",`,
|
|
10708
|
+
},
|
|
10490
10709
|
{
|
|
10491
10710
|
file: "../pi-agent-core/src/agent-loop.ts",
|
|
10492
10711
|
marker: " detachSteerRestart();\n",
|
|
@@ -10777,6 +10996,56 @@ class HarmonyLeakInterruption extends Error {`,
|
|
|
10777
10996
|
anchor: "\t\tconst attribution = options?.attribution ?? \"user\";\n",
|
|
10778
10997
|
patched: "\t\tconst attribution = options?.attribution ?? \"user\";\n\t\tif (mode !== \"aside\") this.#raiseAutoThinkingForQueuedInput(text, attribution);\n",
|
|
10779
10998
|
},
|
|
10999
|
+
// child auto 재분류(2026-10-08 사용자 결정): Main 이 사용자 턴마다 다시 분류되듯, SubAgent 는 부모(Main)의 IRC 메시지를
|
|
11000
|
+
// 받을 때마다 auto 강도를 다시 분류한다. 입력은 최초 과제(#autoThinkingTurnText)에 그 메시지를 이어 붙인 것이고(짧은
|
|
11001
|
+
// "승인" 답이 강도를 무너뜨리지 않게), 결과는 그 child 의 auto 범위 안에서 오르내린다(raise-only 아님). peer 메시지·
|
|
11002
|
+
// wake relay·job 결과·시스템 알림은 이 경로를 타지 않는다. 검증: core-steer-auto-thinking-test.ts [4].
|
|
11003
|
+
{
|
|
11004
|
+
file: "src/session/irc-bridge.ts",
|
|
11005
|
+
marker: "\treclassifyAutoThinkingForParent(message: string): void;\n",
|
|
11006
|
+
anchor: "\twakeForIrc(records: AgentMessage[]): void;\n",
|
|
11007
|
+
patched: ` /** CUELO: a parent message re-classifies this subagent's \`auto\` effort (assignment + parent messages). */
|
|
11008
|
+
reclassifyAutoThinkingForParent(message: string): void;
|
|
11009
|
+
wakeForIrc(records: AgentMessage[]): void;
|
|
11010
|
+
`,
|
|
11011
|
+
},
|
|
11012
|
+
{
|
|
11013
|
+
file: "src/session/irc-bridge.ts",
|
|
11014
|
+
marker: "if (fromParent && msg.wakeRelay !== true) this.#host.reclassifyAutoThinkingForParent(msg.body);",
|
|
11015
|
+
anchor: ` void this.#host.emitSessionEvent({ type: "irc_message", message: record });
|
|
11016
|
+
if (streaming) {
|
|
11017
|
+
`,
|
|
11018
|
+
patched: ` void this.#host.emitSessionEvent({ type: "irc_message", message: record });
|
|
11019
|
+
// CUELO: only the parent's own instructions re-classify; peers and wake relays never do.
|
|
11020
|
+
if (fromParent && msg.wakeRelay !== true) this.#host.reclassifyAutoThinkingForParent(msg.body);
|
|
11021
|
+
if (streaming) {
|
|
11022
|
+
`,
|
|
11023
|
+
},
|
|
11024
|
+
{
|
|
11025
|
+
file: "src/session/agent-session.ts",
|
|
11026
|
+
marker: "reclassifyAutoThinkingForParent: message => this.#reclassifyAutoThinkingForParent(message),",
|
|
11027
|
+
anchor: "\t\t\twakeForIrc: records => this.#wakeForIrc(records),\n",
|
|
11028
|
+
patched: "\t\t\treclassifyAutoThinkingForParent: message => this.#reclassifyAutoThinkingForParent(message),\n\t\t\twakeForIrc: records => this.#wakeForIrc(records),\n",
|
|
11029
|
+
},
|
|
11030
|
+
{
|
|
11031
|
+
file: "src/session/agent-session.ts",
|
|
11032
|
+
marker: "\t#reclassifyAutoThinkingForParent(text: string): void {\n",
|
|
11033
|
+
anchor: "\tasync #queueUserMessage(\n",
|
|
11034
|
+
patched: `\t/**
|
|
11035
|
+
* CUELO: SubAgent 가 부모 메시지를 받을 때마다 auto 강도를 다시 분류한다(Main 의 사용자 턴마다 분류와 같은 자리).
|
|
11036
|
+
* 최초 과제에 지금까지의 부모 메시지를 이어 붙여 분류하므로 짧은 답이 강도를 무너뜨리지 않고, 결과는 오르내린다.
|
|
11037
|
+
* 분류를 기다리지 않아 메시지 전달은 늦어지지 않고, 결과는 다음 모델 요청부터 쓴다. 분류 실패는 현재 강도를 둔다.
|
|
11038
|
+
*/
|
|
11039
|
+
#reclassifyAutoThinkingForParent(text: string): void {
|
|
11040
|
+
if (!this.isAutoThinking || !text.trim()) return;
|
|
11041
|
+
const request = this.#autoThinkingTurnText ? \`\${this.#autoThinkingTurnText}\\n\\n\${text}\` : text;
|
|
11042
|
+
this.#autoThinkingTurnText = request;
|
|
11043
|
+
void this.#models.applyAutoThinkingLevel(request, this.#promptGeneration);
|
|
11044
|
+
}
|
|
11045
|
+
|
|
11046
|
+
\tasync #queueUserMessage(
|
|
11047
|
+
`,
|
|
11048
|
+
},
|
|
10780
11049
|
// CUELO 계정 자리(2026-10-04). upstream oauth.accounts()의 position은 활성 credential 배열 index라서,
|
|
10781
11050
|
// 한 계정이 인증 실패로 비활성화되면 뒤 계정이 앞 자리로 당겨진다(RIN 자리 0이 비면 MIO 계정이 RIN이 된다).
|
|
10782
11051
|
// 재로그인도 새 행을 만들고 tombstone을 지우므로 [11, 12]처럼 순서가 뒤집힌다. 자리 = (활성 OAuth id ∪
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cuelo",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
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.
|
|
33
|
+
"coreVersion": "18.8.0"
|
|
34
34
|
},
|
|
35
35
|
"engines": {
|
|
36
36
|
"node": ">=22.19.0",
|
|
@@ -89,11 +89,11 @@
|
|
|
89
89
|
"test:coverage": "bun test --coverage ./app ./components ./hooks ./lib ./public ./bin ./install.test.mjs"
|
|
90
90
|
},
|
|
91
91
|
"dependencies": {
|
|
92
|
-
"@oh-my-pi/pi-agent-core": "18.
|
|
93
|
-
"@oh-my-pi/pi-ai": "18.
|
|
94
|
-
"@oh-my-pi/pi-coding-agent": "18.
|
|
95
|
-
"@oh-my-pi/pi-tui": "18.
|
|
96
|
-
"@oh-my-pi/pi-utils": "18.
|
|
92
|
+
"@oh-my-pi/pi-agent-core": "18.8.0",
|
|
93
|
+
"@oh-my-pi/pi-ai": "18.8.0",
|
|
94
|
+
"@oh-my-pi/pi-coding-agent": "18.8.0",
|
|
95
|
+
"@oh-my-pi/pi-tui": "18.8.0",
|
|
96
|
+
"@oh-my-pi/pi-utils": "18.8.0",
|
|
97
97
|
"@seed-design/css": "2.8.0",
|
|
98
98
|
"@seed-design/react": "2.4.1",
|
|
99
99
|
"@seed-design/tailwind4-theme": "2.4.0",
|
package/public/sw.js
CHANGED
|
@@ -16,6 +16,10 @@ const PRECACHE_URLS = [
|
|
|
16
16
|
"/icons/icon-512.png",
|
|
17
17
|
"/icons/apple-touch-icon.png",
|
|
18
18
|
];
|
|
19
|
+
// A proxy in front of CUELO (Tailscale serve) answers a navigation with 502 or 504 while the
|
|
20
|
+
// server is restarting, e.g. during an update. CUELO itself never sends these, so they get the
|
|
21
|
+
// recovery page. Its own 503 carries an actionable message and passes through.
|
|
22
|
+
const GATEWAY_ERROR_STATUSES = new Set([502, 504]);
|
|
19
23
|
|
|
20
24
|
self.addEventListener("install", (event) => {
|
|
21
25
|
event.waitUntil(
|
|
@@ -52,12 +56,7 @@ self.addEventListener("fetch", (event) => {
|
|
|
52
56
|
if (url.pathname.startsWith("/api/") || url.pathname === "/sw.js") return;
|
|
53
57
|
|
|
54
58
|
if (request.mode === "navigate") {
|
|
55
|
-
event.respondWith(
|
|
56
|
-
fetch(request).catch(async () => {
|
|
57
|
-
const fallback = await caches.match(OFFLINE_URL);
|
|
58
|
-
return fallback ?? Response.error();
|
|
59
|
-
}),
|
|
60
|
-
);
|
|
59
|
+
event.respondWith(navigateWithRecovery(request));
|
|
61
60
|
return;
|
|
62
61
|
}
|
|
63
62
|
|
|
@@ -112,6 +111,17 @@ async function focusOrOpenWindow(targetUrl) {
|
|
|
112
111
|
await self.clients.openWindow(targetUrl);
|
|
113
112
|
}
|
|
114
113
|
|
|
114
|
+
async function navigateWithRecovery(request) {
|
|
115
|
+
let response;
|
|
116
|
+
try {
|
|
117
|
+
response = await fetch(request);
|
|
118
|
+
} catch {
|
|
119
|
+
return (await caches.match(OFFLINE_URL)) ?? Response.error();
|
|
120
|
+
}
|
|
121
|
+
if (!GATEWAY_ERROR_STATUSES.has(response.status)) return response;
|
|
122
|
+
return (await caches.match(OFFLINE_URL)) ?? response;
|
|
123
|
+
}
|
|
124
|
+
|
|
115
125
|
async function cacheFirst(request) {
|
|
116
126
|
const cached = await caches.match(request);
|
|
117
127
|
if (cached) return cached;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7177],{17594:(e,r,t)=>{Promise.resolve().then(t.bind(t,57788)),Promise.resolve().then(t.t.bind(t,84559,23)),Promise.resolve().then(t.t.bind(t,66872,23))},57788:(e,r,t)=>{"use strict";t.d(r,{PwaRegistration:()=>o});var n=t(12115);function o(){return(0,n.useEffect)(()=>{if(!("serviceWorker"in navigator))return;let e=()=>{let e=`/sw.js?v=${encodeURIComponent("0.9.8")}`;navigator.serviceWorker.register(e,{scope:"/",updateViaCache:"none"}).catch(e=>{console.error("Failed to register the CUELO service worker:",e)})};return"complete"===document.readyState?void e():(window.addEventListener("load",e,{once:!0}),()=>window.removeEventListener("load",e))},[]),null}},66872:()=>{},84559:()=>{}},e=>{e.O(0,[5846,7513,8441,3794,7358],()=>e(e.s=17594)),_N_E=e.O()}]);
|
|
File without changes
|
|
File without changes
|