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.
Files changed (95) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +8 -8
  3. package/.next/build-manifest.json +2 -2
  4. package/.next/prerender-manifest.json +3 -3
  5. package/.next/required-server-files.js +2 -2
  6. package/.next/required-server-files.json +2 -2
  7. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  8. package/.next/server/app/_global-error.html +1 -1
  9. package/.next/server/app/_global-error.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  14. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  15. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  16. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  17. package/.next/server/app/_not-found.html +1 -1
  18. package/.next/server/app/_not-found.rsc +2 -2
  19. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  20. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  21. package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  22. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  23. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  24. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  25. package/.next/server/app/api/update-maintenance/route.js +9 -4
  26. package/.next/server/app/api/updates/route.js +1 -1
  27. package/.next/server/app/index.html +1 -1
  28. package/.next/server/app/index.rsc +4 -4
  29. package/.next/server/app/index.segments/__PAGE__.segment.rsc +3 -3
  30. package/.next/server/app/index.segments/_full.segment.rsc +4 -4
  31. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  32. package/.next/server/app/index.segments/_index.segment.rsc +2 -2
  33. package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  34. package/.next/server/app/office/page_client-reference-manifest.js +1 -1
  35. package/.next/server/app/office-preview/page_client-reference-manifest.js +1 -1
  36. package/.next/server/app/office-preview.html +1 -1
  37. package/.next/server/app/office-preview.rsc +2 -2
  38. package/.next/server/app/office-preview.segments/_full.segment.rsc +2 -2
  39. package/.next/server/app/office-preview.segments/_head.segment.rsc +1 -1
  40. package/.next/server/app/office-preview.segments/_index.segment.rsc +2 -2
  41. package/.next/server/app/office-preview.segments/_tree.segment.rsc +1 -1
  42. package/.next/server/app/office-preview.segments/office-preview/__PAGE__.segment.rsc +1 -1
  43. package/.next/server/app/office-preview.segments/office-preview.segment.rsc +1 -1
  44. package/.next/server/app/office.html +1 -1
  45. package/.next/server/app/office.rsc +4 -4
  46. package/.next/server/app/office.segments/_full.segment.rsc +4 -4
  47. package/.next/server/app/office.segments/_head.segment.rsc +1 -1
  48. package/.next/server/app/office.segments/_index.segment.rsc +2 -2
  49. package/.next/server/app/office.segments/_tree.segment.rsc +1 -1
  50. package/.next/server/app/office.segments/office/__PAGE__.segment.rsc +3 -3
  51. package/.next/server/app/office.segments/office.segment.rsc +1 -1
  52. package/.next/server/app/page_client-reference-manifest.js +1 -1
  53. package/.next/server/app/recover/page_client-reference-manifest.js +1 -1
  54. package/.next/server/app/recover.html +1 -1
  55. package/.next/server/app/recover.rsc +2 -2
  56. package/.next/server/app/recover.segments/_full.segment.rsc +2 -2
  57. package/.next/server/app/recover.segments/_head.segment.rsc +1 -1
  58. package/.next/server/app/recover.segments/_index.segment.rsc +2 -2
  59. package/.next/server/app/recover.segments/_tree.segment.rsc +1 -1
  60. package/.next/server/app/recover.segments/recover/__PAGE__.segment.rsc +1 -1
  61. package/.next/server/app/recover.segments/recover.segment.rsc +1 -1
  62. package/.next/server/app-paths-manifest.json +8 -8
  63. package/.next/server/chunks/5489.js +2 -2
  64. package/.next/server/middleware-build-manifest.js +1 -1
  65. package/.next/server/pages/404.html +1 -1
  66. package/.next/server/pages/500.html +1 -1
  67. package/.next/server/server-reference-manifest.json +1 -1
  68. package/.next/static/chunks/{9575-a48cda671c8b915d.js → 9575-6f450839544bc6b3.js} +2 -2
  69. package/.next/static/chunks/app/layout-d8c1b10303bcd958.js +1 -0
  70. package/.next/trace +108 -108
  71. package/.next/trace-build +1 -1
  72. package/README.md +2 -2
  73. package/Tools/CUELO_Setup/files/native-runtime-patch.js +3 -3
  74. package/Tools/OMP_Global_Config/agent/AGENTS.md +1 -1
  75. package/Tools/OMP_Global_Config/agent/RULES.md +2 -2
  76. package/Tools/OMP_Global_Config/agent/agents/maker.md +2 -2
  77. package/Tools/OMP_Global_Config/agent/extensions/command-guard/powershell-syntax.ts +63 -22
  78. package/Tools/OMP_Global_Config/agent/extensions/external-advice-check.ts +26 -129
  79. package/Tools/OMP_Global_Config/agent/extensions/jev-runtime.ts +206 -60
  80. package/Tools/OMP_Global_Config/agent/extensions/lib/maker-routing.ts +102 -64
  81. package/Tools/OMP_Global_Config/agent/extensions/todo-nudge.ts +43 -138
  82. package/Tools/OMP_Global_Config/agent/extensions/turn-end-guard.ts +7 -2
  83. package/Tools/OMP_Global_Config/agent/prompt-copies/AGENTS.en.md +2 -2
  84. package/Tools/OMP_Global_Config/agent/prompt-copies/RULES.en.md +3 -3
  85. package/Tools/OMP_Global_Config/agent/rules/harness-policy.json +41 -74
  86. package/Tools/OMP_Global_Config/agent/rules/meta-harness.md +2 -2
  87. package/Tools/OMP_Global_Config/agent/rules/omp-harness.md +4 -3
  88. package/Tools/OMP_Global_Config/agent/rules/subagent.md +55 -45
  89. package/Tools/OMP_Global_Config/agent/rules/task-guard.md +4 -3
  90. package/Tools/OMP_Global_Config/patches/apply-core-patch.mjs +270 -1
  91. package/package.json +7 -7
  92. package/public/sw.js +16 -6
  93. package/.next/static/chunks/app/layout-489bc5b73326436e.js +0 -1
  94. /package/.next/static/{pzZcPiD8nl6i7i_Ne9Ko- → MYIe6QFbh4yP3_wc_Fetr}/_buildManifest.js +0 -0
  95. /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.9.8",
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.6.3"
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.6.3",
93
- "@oh-my-pi/pi-ai": "18.6.3",
94
- "@oh-my-pi/pi-coding-agent": "18.6.3",
95
- "@oh-my-pi/pi-tui": "18.6.3",
96
- "@oh-my-pi/pi-utils": "18.6.3",
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()}]);