cuelo 0.8.1 → 0.8.2
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 +3 -3
- package/.next/prerender-manifest.json +3 -3
- package/.next/react-loadable-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 +6 -6
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +5 -5
- package/.next/server/app/index.segments/_full.segment.rsc +6 -6
- 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 +3 -3
- package/.next/server/app/office-preview/page.js +1 -1
- package/.next/server/app/office-preview/page.js.nft.json +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 +3 -3
- package/.next/server/app/office-preview.segments/_full.segment.rsc +3 -3
- 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 +2 -2
- package/.next/server/app/office-preview.segments/office-preview/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/office-preview.segments/office-preview.segment.rsc +1 -1
- package/.next/server/app/page.js +16 -16
- package/.next/server/app/page.js.nft.json +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/1933.js +353 -0
- package/.next/server/chunks/2607.js +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-react-loadable-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/8637.5c189b15878e878b.js +1 -0
- package/.next/static/chunks/9703.36cc00cc10e10f45.js +1 -0
- package/.next/static/chunks/9889-4e472951b0a45120.js +1 -0
- package/.next/static/chunks/app/{layout-27cec017946e8765.js → layout-78440a2c8d3cd1c7.js} +1 -1
- package/.next/static/chunks/app/office-preview/page-68828399eb58177b.js +1 -0
- package/.next/static/chunks/app/page-a4c4acecc034872f.js +22 -0
- package/.next/static/chunks/webpack-aba44445f0ef2ed9.js +1 -0
- package/.next/static/css/aab5fc8ab1b53780.css +1 -0
- package/.next/static/css/d6462eb5a4d2cb8c.css +1 -0
- package/.next/trace +107 -106
- 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/patches/apply-core-patch.mjs +253 -18
- package/package.json +7 -7
- package/public/office3d/ASSETS.md +51 -4
- package/public/office3d/office-kit.glb +0 -0
- package/.next/server/chunks/3602.js +0 -353
- package/.next/static/chunks/1937.70e7ce89f87f1119.js +0 -1
- package/.next/static/chunks/2992.16b931bb2dfe8845.js +0 -1
- package/.next/static/chunks/9889-481b318dcf48ee30.js +0 -1
- package/.next/static/chunks/app/office-preview/page-5874dc1ab28d3b1d.js +0 -1
- package/.next/static/chunks/app/page-95261aed574d5860.js +0 -22
- package/.next/static/chunks/webpack-d2da69f7c8164141.js +0 -1
- package/.next/static/css/001d6e9d9d06b017.css +0 -1
- package/.next/static/css/abd3d00cca9457f7.css +0 -1
- /package/.next/static/{_VEUT2T9aZcGJdOeXmxhm → 3xAqEONTnox8I-4Te8HCx}/_buildManifest.js +0 -0
- /package/.next/static/{_VEUT2T9aZcGJdOeXmxhm → 3xAqEONTnox8I-4Te8HCx}/_ssgManifest.js +0 -0
package/.next/trace-build
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
[{"name":"run-webpack","duration":
|
|
1
|
+
[{"name":"run-webpack","duration":66095404,"timestamp":420381,"id":14,"parentId":1,"tags":{},"startTime":1791003262644,"traceId":"3780a7e7ab12c585"},{"name":"run-typescript","duration":11068205,"timestamp":66837194,"id":10900,"parentId":1,"tags":{},"startTime":1791003329062,"traceId":"3780a7e7ab12c585"},{"name":"static-check","duration":4000674,"timestamp":78364725,"id":10903,"parentId":1,"tags":{},"startTime":1791003340589,"traceId":"3780a7e7ab12c585"},{"name":"static-generation","duration":7120061,"timestamp":82448225,"id":11061,"parentId":1,"tags":{},"startTime":1791003344673,"traceId":"3780a7e7ab12c585"},{"name":"collect-build-traces","duration":14100154,"timestamp":82422233,"id":11058,"parentId":1,"tags":{},"startTime":1791003344647,"traceId":"3780a7e7ab12c585"},{"name":"telemetry-flush","duration":56,"timestamp":96525813,"id":11070,"parentId":1,"tags":{},"startTime":1791003358751,"traceId":"3780a7e7ab12c585"},{"name":"next-build","duration":96172966,"timestamp":353089,"id":1,"tags":{"buildMode":"default","version":"16.2.12","bundler":"webpack","has-custom-webpack-config":"true","use-build-worker":"false"},"startTime":1791003262577,"traceId":"3780a7e7ab12c585"}]
|
package/README.md
CHANGED
|
@@ -59,10 +59,10 @@ CUELO의 목적은 작업 중 확인한 실패와 막힘을 기억·작업 규
|
|
|
59
59
|
**여러 에이전트와 함께 일하기**
|
|
60
60
|
|
|
61
61
|
- SubAgent 아카이브: 진행 중·완료된 자식 에이전트의 기록을 열어 봅니다.
|
|
62
|
-
- 서브에이전트를 발주한 답변 안에 접힌 카드가 붙어, 맡긴 일마다 실행 상태와 Main의 검수 판정을 한 줄로 보여 줍니다. 펼치면 현재 단계·모델·판정 사유와 상세 패널 링크가 나옵니다. 실행이 끝났어도 Main이 판정을 남기지 않았으면 「검수 미기록」으로 표시하며, 끝난 것을 통과로 치지 않습니다.
|
|
62
|
+
- 서브에이전트를 발주한 답변 안에 접힌 카드가 붙어, 맡긴 일마다 실행 상태와 Main의 검수 판정을 한 줄로 보여 줍니다. 펼치면 현재 단계·모델·판정 사유와 상세 패널 링크가 나옵니다. 실행이 끝났어도 Main이 판정을 남기지 않았으면 「검수 미기록」으로 표시하며, 끝난 것을 통과로 치지 않습니다. 서브에이전트가 실행 중이거나 판정을 기다리는 동안에는 입력창 위에 한 줄 요약이 고정되고, 누르면 그 카드로 스크롤해 강조합니다.
|
|
63
63
|
- 끝난 턴의 마지막 답변 아래에 변경 파일·검사·실패·미확인 개수를 한 줄로 요약하고, 펼치면 파일과 검사 명령·결과를 봅니다.
|
|
64
64
|
- 실행 중에 보낸 입력은 「지금 지시」와 「완료 후 요청」으로 나뉘어, 접수·전달 대기·대화에 들어감 단계를 따로 보여 줍니다. 전달을 확인하지 못하면 그렇다고 표시합니다.
|
|
65
|
-
- 오피스 보기: 대화 보기와 전환하는 3D 사무실 화면입니다. Main과 참여한 Maker가 각자 캐릭터로 자리에 앉아 실제 실행 상태대로 일하거나 책상 곁에서 기다리고, 실행이 끝나면 쉬는 자리로 돌아갑니다. 실행 완료는 Main의 수용으로 표시하지 않습니다. 이 세션에 참여하지 않은 캐릭터는 휴게 구역에서
|
|
65
|
+
- 오피스 보기: 대화 보기와 전환하는 3D 사무실 화면입니다. Main과 참여한 Maker가 각자 캐릭터로 자리에 앉아 실제 실행 상태대로 일하거나 책상 곁에서 기다리고, 실행이 끝나면 쉬는 자리로 돌아갑니다. 실행 완료는 Main의 수용으로 표시하지 않습니다. 이 세션에 참여하지 않은 캐릭터는 휴게 구역에서 쉬며, 가리키면 「참여 안 함」이 보입니다. 참여자 캐릭터나 머리 위 말풍선, 아래 참여자 줄을 누르면 오른쪽에 그 대상의 대화나 작업 기록·파일이 열립니다. Maker 기록은 조회 전용이고 입력은 늘 Main에게 갑니다. 고르기만 해서는 모델·계정이 바뀌거나 메시지가 다른 대상으로 가지 않으며, 대화 보기로 돌아가도 작성 중인 초안이 그대로 남습니다. WebGL을 쓸 수 없거나 장면을 받지 못하면 자리 카드로 보여 주고 다시 시도할 수 있습니다. 캐릭터는 코드로 그리고, 방의 가구는 KayKit·Kenney의 CC0 모델을 오피스를 열 때만 받습니다. 가구를 받지 못하면 코드로 그린 방을 보여 줍니다([`public/office3d/ASSETS.md`](./public/office3d/ASSETS.md)).
|
|
66
66
|
- 자식 에이전트의 발화가 해당 턴 아래 대화 흐름에 끼어들어 누가 무슨 말을 했는지 이어서 읽힙니다.
|
|
67
67
|
- 공개 하네스는 시작을 기다리거나 재작업 중인 에이전트에게 같은 파일을 중복 배정하지 않도록 확인합니다. 완료 결과와 Main이 검수한 결과의 출처를 구분하고, 재작업 이력과 최종 수용을 따로 남깁니다. 적용 경계는 [하네스 안내](./docs/harness.md#발주와-검수-계약)를 따릅니다.
|
|
68
68
|
- 필요한 MCP 서버만 요청별로 연결하는 선택 모드를 지원합니다. 설치·인증·권한 변경은 먼저 승인을 받고 에이전트가 지원합니다. 설정과 적용 범위는 [요청별 MCP 선택 연결](./docs/harness.md#요청별-mcp-선택-연결)을 확인하세요.
|
|
@@ -9,9 +9,9 @@ const MEMORY_RE = /(const phase1Model = await resolveMemoryModel\(\{[^}]*?fallba
|
|
|
9
9
|
const MEMORY_DONE = /const phase1Model = await resolveMemoryModel\(\{[^}]*?fallbackRole: "smol"/;
|
|
10
10
|
const EXPECTED = {
|
|
11
11
|
name: 'cuelo',
|
|
12
|
-
version: '0.8.
|
|
12
|
+
version: '0.8.2',
|
|
13
13
|
distribution: 'cuelo',
|
|
14
|
-
coreVersion: '18.
|
|
14
|
+
coreVersion: '18.5.0',
|
|
15
15
|
};
|
|
16
16
|
|
|
17
17
|
// OMP core 18.4.12 `src/sdk.ts`: session-scoped AsyncJobManager for a process
|
|
@@ -177,7 +177,7 @@ function readNativePackage(target) {
|
|
|
177
177
|
throw new Error(`unexpected native package ${packageJson.name}@${packageJson.version}`);
|
|
178
178
|
}
|
|
179
179
|
if (!build || build.distribution !== EXPECTED.distribution || build.coreVersion !== EXPECTED.coreVersion) {
|
|
180
|
-
throw new Error('native cueloBuild metadata does not match cuelo / core 18.
|
|
180
|
+
throw new Error('native cueloBuild metadata does not match cuelo / core 18.5.0');
|
|
181
181
|
}
|
|
182
182
|
return packageJson;
|
|
183
183
|
}
|
|
@@ -2215,19 +2215,37 @@ function evalRejectionResult(error: unknown): AgentToolResult<EvalToolDetails |
|
|
|
2215
2215
|
// 인증/approved-fallback/재시도 체인·task-guard 상한은 건드리지 않는다.
|
|
2216
2216
|
// 잘못된 값은 기존 fall-through(다음 소스로 전이)를 따르므로, 엄격한 거부는
|
|
2217
2217
|
// 호출자(Arena 런타임의 사전 해석)가 맡는다.
|
|
2218
|
+
// 18.5.0 RETIRE: upstream 이 같은 per-call model selector 를 넣었다(string | string[], batch 최상위는 never,
|
|
2219
|
+
// 해석 실패 시 대체 금지; pi-tui task.ts:2156·2185, types.ts 각 schema, index.ts:306·330·820·1631). 아래 11항목은
|
|
2220
|
+
// 18.4.12 본 후보를 유지하고, 18.5.0 에는 upstream 줄 자체의 no-op 후보를 둔다. 본 후보 앵커는 18.5.0 이 바로 뒤에
|
|
2221
|
+
// 넣은 upstream 줄과 겹치지 않는 범위까지 넓혀 새 판 순정에서 성립하지 않게 한다. index.ts 의 preflight·launch 두
|
|
2222
|
+
// 줄은 18.5.0 순정과 18.4.12 적용본이 국소 문맥까지 같아 같은 파일의 18.5.0 전용 import(invalidModelSelectorReason)
|
|
2223
|
+
// 유무로 가른다. Maker 단일 모델은 maker-routing guard(`typeof item.model === "string"`)가 계속 막는다.
|
|
2218
2224
|
{
|
|
2219
2225
|
// 18.2.5: upstream 이 TaskItem 을 @oh-my-pi/pi-tui 로 옮기고 effort 타입을 인라인했다.
|
|
2220
2226
|
file: "../pi-tui/src/tools/task.ts",
|
|
2221
2227
|
marker: "Standard model selector for this spawn (item)",
|
|
2222
|
-
anchor: "\t/** Per-spawn thinking effort: lowest/middle/highest level the resolved model supports. Overrides the agent's default selector (e.g. `auto`). */\n\teffort?: \"lo\" | \"med\" | \"hi\";",
|
|
2223
|
-
patched: "\t/** Per-spawn thinking effort: lowest/middle/highest level the resolved model supports. Overrides the agent's default selector (e.g. `auto`). */\n\teffort?: \"lo\" | \"med\" | \"hi\";\n\t/**\n\t * Standard model selector for this spawn (item), e.g. \"provider/model-id:max\".\n\t * Forwards to the existing subagent model resolution (`requestModel` first,\n\t * then `task.agentModelOverrides`, then the agent definition); omitted\n\t * preserves existing behavior. Unresolvable values fall through to the next\n\t * source per existing precedence, so callers needing strictness must\n\t * pre-resolve. A `:level` suffix pins exact thinking effort unless\n\t * per-spawn `effort` overrides it.\n\t */\n\tmodel?: string;",
|
|
2228
|
+
anchor: "\t/** Per-spawn thinking effort: lowest/middle/highest level the resolved model supports. Overrides the agent's default selector (e.g. `auto`). */\n\teffort?: \"lo\" | \"med\" | \"hi\";\n\t/** Caller-provided output schema;",
|
|
2229
|
+
patched: "\t/** Per-spawn thinking effort: lowest/middle/highest level the resolved model supports. Overrides the agent's default selector (e.g. `auto`). */\n\teffort?: \"lo\" | \"med\" | \"hi\";\n\t/**\n\t * Standard model selector for this spawn (item), e.g. \"provider/model-id:max\".\n\t * Forwards to the existing subagent model resolution (`requestModel` first,\n\t * then `task.agentModelOverrides`, then the agent definition); omitted\n\t * preserves existing behavior. Unresolvable values fall through to the next\n\t * source per existing precedence, so callers needing strictness must\n\t * pre-resolve. A `:level` suffix pins exact thinking effort unless\n\t * per-spawn `effort` overrides it.\n\t */\n\tmodel?: string;\n\t/** Caller-provided output schema;",
|
|
2230
|
+
alternates: [{
|
|
2231
|
+
file: "../pi-tui/src/tools/task.ts",
|
|
2232
|
+
marker: "\t/** Per-spawn thinking effort: lowest/middle/highest level the resolved model supports. Overrides the agent's default selector (e.g. `auto`). */\n\teffort?: \"lo\" | \"med\" | \"hi\";\n\t/** Per-spawn model selector or ordered selector array; overrides agent and settings preferences. */\n\tmodel?: string | string[];",
|
|
2233
|
+
anchor: "\t/** Per-spawn thinking effort: lowest/middle/highest level the resolved model supports. Overrides the agent's default selector (e.g. `auto`). */\n\teffort?: \"lo\" | \"med\" | \"hi\";\n\t/** Per-spawn model selector or ordered selector array; overrides agent and settings preferences. */\n\tmodel?: string | string[];",
|
|
2234
|
+
patched: "\t/** Per-spawn thinking effort: lowest/middle/highest level the resolved model supports. Overrides the agent's default selector (e.g. `auto`). */\n\teffort?: \"lo\" | \"med\" | \"hi\";\n\t/** Per-spawn model selector or ordered selector array; overrides agent and settings preferences. */\n\tmodel?: string | string[];",
|
|
2235
|
+
}],
|
|
2224
2236
|
},
|
|
2225
2237
|
{
|
|
2226
2238
|
// 18.2.5: upstream 이 TaskParams 를 @oh-my-pi/pi-tui 로 옮기고 effort 타입을 인라인했다.
|
|
2227
2239
|
file: "../pi-tui/src/tools/task.ts",
|
|
2228
2240
|
marker: "Standard model selector for this spawn (flat form)",
|
|
2229
|
-
anchor: "\t/** Per-spawn thinking effort (flat form): lowest/middle/highest level the resolved model supports. */\n\teffort?: \"lo\" | \"med\" | \"hi\";",
|
|
2230
|
-
patched: "\t/** Per-spawn thinking effort (flat form): lowest/middle/highest level the resolved model supports. */\n\teffort?: \"lo\" | \"med\" | \"hi\";\n\t/**\n\t * Standard model selector for this spawn (flat form), e.g. \"provider/model-id:max\".\n\t * Same forwarding and fall-through semantics as the batch item field.\n\t */\n\tmodel?: string;",
|
|
2241
|
+
anchor: "\t/** Per-spawn thinking effort (flat form): lowest/middle/highest level the resolved model supports. */\n\teffort?: \"lo\" | \"med\" | \"hi\";\n\t/** Caller-provided output schema;",
|
|
2242
|
+
patched: "\t/** Per-spawn thinking effort (flat form): lowest/middle/highest level the resolved model supports. */\n\teffort?: \"lo\" | \"med\" | \"hi\";\n\t/**\n\t * Standard model selector for this spawn (flat form), e.g. \"provider/model-id:max\".\n\t * Same forwarding and fall-through semantics as the batch item field.\n\t */\n\tmodel?: string;\n\t/** Caller-provided output schema;",
|
|
2243
|
+
alternates: [{
|
|
2244
|
+
file: "../pi-tui/src/tools/task.ts",
|
|
2245
|
+
marker: "\t/** Per-spawn thinking effort (flat form): lowest/middle/highest level the resolved model supports. */\n\teffort?: \"lo\" | \"med\" | \"hi\";\n\t/** Per-spawn model selector or ordered selector array; overrides agent and settings preferences. */\n\tmodel?: string | string[];",
|
|
2246
|
+
anchor: "\t/** Per-spawn thinking effort (flat form): lowest/middle/highest level the resolved model supports. */\n\teffort?: \"lo\" | \"med\" | \"hi\";\n\t/** Per-spawn model selector or ordered selector array; overrides agent and settings preferences. */\n\tmodel?: string | string[];",
|
|
2247
|
+
patched: "\t/** Per-spawn thinking effort (flat form): lowest/middle/highest level the resolved model supports. */\n\teffort?: \"lo\" | \"med\" | \"hi\";\n\t/** Per-spawn model selector or ordered selector array; overrides agent and settings preferences. */\n\tmodel?: string | string[];",
|
|
2248
|
+
}],
|
|
2231
2249
|
},
|
|
2232
2250
|
{
|
|
2233
2251
|
// 18.3.4는 모든 task schema에 필수 `solutionSpace: "string"` 을 `task` 바로 뒤에 넣었다
|
|
@@ -2280,6 +2298,27 @@ const taskItemSchemaIsolated = type({
|
|
|
2280
2298
|
"isolated?": "boolean",
|
|
2281
2299
|
"+": "delete",
|
|
2282
2300
|
});`,
|
|
2301
|
+
alternates: [{
|
|
2302
|
+
file: "src/task/types.ts",
|
|
2303
|
+
marker: `export const taskItemSchema = type({
|
|
2304
|
+
"name?": "string",
|
|
2305
|
+
agent: "string = 'task'",
|
|
2306
|
+
task: "string",
|
|
2307
|
+
solutionSpace: "string",
|
|
2308
|
+
"model?": "string | string[]",`,
|
|
2309
|
+
anchor: `export const taskItemSchema = type({
|
|
2310
|
+
"name?": "string",
|
|
2311
|
+
agent: "string = 'task'",
|
|
2312
|
+
task: "string",
|
|
2313
|
+
solutionSpace: "string",
|
|
2314
|
+
"model?": "string | string[]",`,
|
|
2315
|
+
patched: `export const taskItemSchema = type({
|
|
2316
|
+
"name?": "string",
|
|
2317
|
+
agent: "string = 'task'",
|
|
2318
|
+
task: "string",
|
|
2319
|
+
solutionSpace: "string",
|
|
2320
|
+
"model?": "string | string[]",`,
|
|
2321
|
+
}],
|
|
2283
2322
|
},
|
|
2284
2323
|
{
|
|
2285
2324
|
file: "src/task/types.ts",
|
|
@@ -2302,6 +2341,27 @@ const taskItemSchemaIsolated = type({
|
|
|
2302
2341
|
solutionSpace: "string",
|
|
2303
2342
|
"model?": "string",
|
|
2304
2343
|
"outputSchema?": outputSchemaInputSchema,`,
|
|
2344
|
+
alternates: [{
|
|
2345
|
+
file: "src/task/types.ts",
|
|
2346
|
+
marker: `export const taskSchema = type({
|
|
2347
|
+
"name?": "string",
|
|
2348
|
+
agent: "string = 'task'",
|
|
2349
|
+
task: "string",
|
|
2350
|
+
solutionSpace: "string",
|
|
2351
|
+
"model?": "string | string[]",`,
|
|
2352
|
+
anchor: `export const taskSchema = type({
|
|
2353
|
+
"name?": "string",
|
|
2354
|
+
agent: "string = 'task'",
|
|
2355
|
+
task: "string",
|
|
2356
|
+
solutionSpace: "string",
|
|
2357
|
+
"model?": "string | string[]",`,
|
|
2358
|
+
patched: `export const taskSchema = type({
|
|
2359
|
+
"name?": "string",
|
|
2360
|
+
agent: "string = 'task'",
|
|
2361
|
+
task: "string",
|
|
2362
|
+
solutionSpace: "string",
|
|
2363
|
+
"model?": "string | string[]",`,
|
|
2364
|
+
}],
|
|
2305
2365
|
},
|
|
2306
2366
|
{
|
|
2307
2367
|
file: "src/task/types.ts",
|
|
@@ -2324,6 +2384,27 @@ const taskItemSchemaIsolated = type({
|
|
|
2324
2384
|
solutionSpace: "string",
|
|
2325
2385
|
"model?": "string",
|
|
2326
2386
|
"outputSchema?": outputSchemaInputSchema,`,
|
|
2387
|
+
alternates: [{
|
|
2388
|
+
file: "src/task/types.ts",
|
|
2389
|
+
marker: `const taskSchemaNoIsolation = type({
|
|
2390
|
+
"name?": "string",
|
|
2391
|
+
agent: "string = 'task'",
|
|
2392
|
+
task: "string",
|
|
2393
|
+
solutionSpace: "string",
|
|
2394
|
+
"model?": "string | string[]",`,
|
|
2395
|
+
anchor: `const taskSchemaNoIsolation = type({
|
|
2396
|
+
"name?": "string",
|
|
2397
|
+
agent: "string = 'task'",
|
|
2398
|
+
task: "string",
|
|
2399
|
+
solutionSpace: "string",
|
|
2400
|
+
"model?": "string | string[]",`,
|
|
2401
|
+
patched: `const taskSchemaNoIsolation = type({
|
|
2402
|
+
"name?": "string",
|
|
2403
|
+
agent: "string = 'task'",
|
|
2404
|
+
task: "string",
|
|
2405
|
+
solutionSpace: "string",
|
|
2406
|
+
"model?": "string | string[]",`,
|
|
2407
|
+
}],
|
|
2327
2408
|
},
|
|
2328
2409
|
{
|
|
2329
2410
|
file: "src/task/types.ts",
|
|
@@ -2362,6 +2443,18 @@ const taskItemSchemaIsolated = type({
|
|
|
2362
2443
|
"isolated?": "boolean",
|
|
2363
2444
|
"+": "delete",
|
|
2364
2445
|
});`,
|
|
2446
|
+
alternates: [{
|
|
2447
|
+
file: "src/task/types.ts",
|
|
2448
|
+
marker: ` solutionSpace: "string",
|
|
2449
|
+
...effortField,
|
|
2450
|
+
"model?": "string | string[]",`,
|
|
2451
|
+
anchor: ` solutionSpace: "string",
|
|
2452
|
+
...effortField,
|
|
2453
|
+
"model?": "string | string[]",`,
|
|
2454
|
+
patched: ` solutionSpace: "string",
|
|
2455
|
+
...effortField,
|
|
2456
|
+
"model?": "string | string[]",`,
|
|
2457
|
+
}],
|
|
2365
2458
|
},
|
|
2366
2459
|
{
|
|
2367
2460
|
file: "src/task/types.ts",
|
|
@@ -2395,23 +2488,92 @@ const taskItemSchemaIsolated = type({
|
|
|
2395
2488
|
...toolsField,
|
|
2396
2489
|
"+": "delete",
|
|
2397
2490
|
});`,
|
|
2491
|
+
alternates: [{
|
|
2492
|
+
file: "src/task/types.ts",
|
|
2493
|
+
marker: ` solutionSpace: "string",
|
|
2494
|
+
...effortField,
|
|
2495
|
+
"model?": "string | string[]",`,
|
|
2496
|
+
anchor: ` solutionSpace: "string",
|
|
2497
|
+
...effortField,
|
|
2498
|
+
"model?": "string | string[]",`,
|
|
2499
|
+
patched: ` solutionSpace: "string",
|
|
2500
|
+
...effortField,
|
|
2501
|
+
"model?": "string | string[]",`,
|
|
2502
|
+
}],
|
|
2398
2503
|
},
|
|
2399
2504
|
{
|
|
2400
2505
|
file: "src/task/index.ts",
|
|
2401
|
-
marker:
|
|
2402
|
-
anchor: ` const item: TaskItem = { name: params.name, agent: params.agent, task: params.task };`,
|
|
2403
|
-
patched: ` const item: TaskItem = { name: params.name, agent: params.agent, task: params.task };
|
|
2506
|
+
marker: ` const item: TaskItem = { name: params.name, agent: params.agent, task: params.task };
|
|
2404
2507
|
if ("model" in params) item.model = params.model;`,
|
|
2508
|
+
anchor: ` const item: TaskItem = { name: params.name, agent: params.agent, task: params.task };
|
|
2509
|
+
if ("solutionSpace" in params) item.solutionSpace = params.solutionSpace;
|
|
2510
|
+
if ("outputSchema" in params) item.outputSchema = params.outputSchema;
|
|
2511
|
+
if ("schemaMode" in params) item.schemaMode = params.schemaMode;
|
|
2512
|
+
if ("tools" in params) item.tools = params.tools;
|
|
2513
|
+
if ("effort" in params) item.effort = params.effort;
|
|
2514
|
+
if ("isolated" in params) item.isolated = params.isolated;`,
|
|
2515
|
+
patched: ` const item: TaskItem = { name: params.name, agent: params.agent, task: params.task };
|
|
2516
|
+
if ("model" in params) item.model = params.model;
|
|
2517
|
+
if ("solutionSpace" in params) item.solutionSpace = params.solutionSpace;
|
|
2518
|
+
if ("outputSchema" in params) item.outputSchema = params.outputSchema;
|
|
2519
|
+
if ("schemaMode" in params) item.schemaMode = params.schemaMode;
|
|
2520
|
+
if ("tools" in params) item.tools = params.tools;
|
|
2521
|
+
if ("effort" in params) item.effort = params.effort;
|
|
2522
|
+
if ("isolated" in params) item.isolated = params.isolated;`,
|
|
2523
|
+
alternates: [{
|
|
2524
|
+
file: "src/task/index.ts",
|
|
2525
|
+
marker: ` if ("effort" in params) item.effort = params.effort;
|
|
2526
|
+
if ("model" in params) item.model = params.model;
|
|
2527
|
+
if ("isolated" in params) item.isolated = params.isolated;`,
|
|
2528
|
+
anchor: ` if ("effort" in params) item.effort = params.effort;
|
|
2529
|
+
if ("model" in params) item.model = params.model;
|
|
2530
|
+
if ("isolated" in params) item.isolated = params.isolated;`,
|
|
2531
|
+
patched: ` if ("effort" in params) item.effort = params.effort;
|
|
2532
|
+
if ("model" in params) item.model = params.model;
|
|
2533
|
+
if ("isolated" in params) item.isolated = params.isolated;`,
|
|
2534
|
+
}],
|
|
2405
2535
|
},
|
|
2406
2536
|
{
|
|
2407
2537
|
file: "src/task/index.ts",
|
|
2408
|
-
marker:
|
|
2409
|
-
anchor: ` const spawn: TaskParams = { agent: item.agent?.trim() || defaultAgent };`,
|
|
2410
|
-
patched: ` const spawn: TaskParams = { agent: item.agent?.trim() || defaultAgent };
|
|
2538
|
+
marker: ` const spawn: TaskParams = { agent: item.agent?.trim() || defaultAgent };
|
|
2411
2539
|
if ("model" in item) spawn.model = item.model;`,
|
|
2540
|
+
anchor: ` const spawn: TaskParams = { agent: item.agent?.trim() || defaultAgent };
|
|
2541
|
+
if (item.name !== undefined) spawn.name = item.name;
|
|
2542
|
+
if (item.task !== undefined) spawn.task = item.task;
|
|
2543
|
+
if (item.solutionSpace !== undefined) spawn.solutionSpace = item.solutionSpace;
|
|
2544
|
+
if (params.context !== undefined) spawn.context = params.context;
|
|
2545
|
+
if ("outputSchema" in item) spawn.outputSchema = item.outputSchema;
|
|
2546
|
+
if ("schemaMode" in item) spawn.schemaMode = item.schemaMode;
|
|
2547
|
+
if ("tools" in item) spawn.tools = item.tools;
|
|
2548
|
+
if ("effort" in item) spawn.effort = item.effort;
|
|
2549
|
+
if (item.isolated !== undefined) {`,
|
|
2550
|
+
patched: ` const spawn: TaskParams = { agent: item.agent?.trim() || defaultAgent };
|
|
2551
|
+
if ("model" in item) spawn.model = item.model;
|
|
2552
|
+
if (item.name !== undefined) spawn.name = item.name;
|
|
2553
|
+
if (item.task !== undefined) spawn.task = item.task;
|
|
2554
|
+
if (item.solutionSpace !== undefined) spawn.solutionSpace = item.solutionSpace;
|
|
2555
|
+
if (params.context !== undefined) spawn.context = params.context;
|
|
2556
|
+
if ("outputSchema" in item) spawn.outputSchema = item.outputSchema;
|
|
2557
|
+
if ("schemaMode" in item) spawn.schemaMode = item.schemaMode;
|
|
2558
|
+
if ("tools" in item) spawn.tools = item.tools;
|
|
2559
|
+
if ("effort" in item) spawn.effort = item.effort;
|
|
2560
|
+
if (item.isolated !== undefined) {`,
|
|
2561
|
+
alternates: [{
|
|
2562
|
+
file: "src/task/index.ts",
|
|
2563
|
+
marker: ` if ("effort" in item) spawn.effort = item.effort;
|
|
2564
|
+
if ("model" in item) spawn.model = item.model;
|
|
2565
|
+
if (item.isolated !== undefined) {`,
|
|
2566
|
+
anchor: ` if ("effort" in item) spawn.effort = item.effort;
|
|
2567
|
+
if ("model" in item) spawn.model = item.model;
|
|
2568
|
+
if (item.isolated !== undefined) {`,
|
|
2569
|
+
patched: ` if ("effort" in item) spawn.effort = item.effort;
|
|
2570
|
+
if ("model" in item) spawn.model = item.model;
|
|
2571
|
+
if (item.isolated !== undefined) {`,
|
|
2572
|
+
}],
|
|
2412
2573
|
},
|
|
2413
2574
|
{
|
|
2414
2575
|
file: "src/task/index.ts",
|
|
2576
|
+
excludes: "invalidModelSelectorReason",
|
|
2415
2577
|
marker: `...(params.model !== undefined ? { model: params.model } : {}),
|
|
2416
2578
|
...("isolated" in params`,
|
|
2417
2579
|
anchor: ` ...(params.effort !== undefined ? { effort: params.effort } : {}),
|
|
@@ -2419,9 +2581,23 @@ const taskItemSchemaIsolated = type({
|
|
|
2419
2581
|
patched: ` ...(params.effort !== undefined ? { effort: params.effort } : {}),
|
|
2420
2582
|
...(params.model !== undefined ? { model: params.model } : {}),
|
|
2421
2583
|
...("isolated" in params ? { isolation: { requested: params.isolated } } : {}),`,
|
|
2584
|
+
alternates: [{
|
|
2585
|
+
file: "src/task/index.ts",
|
|
2586
|
+
requires: "invalidModelSelectorReason",
|
|
2587
|
+
marker: ` ...(params.effort !== undefined ? { effort: params.effort } : {}),
|
|
2588
|
+
...(params.model !== undefined ? { model: params.model } : {}),
|
|
2589
|
+
...("isolated" in params ? { isolation: { requested: params.isolated } } : {}),`,
|
|
2590
|
+
anchor: ` ...(params.effort !== undefined ? { effort: params.effort } : {}),
|
|
2591
|
+
...(params.model !== undefined ? { model: params.model } : {}),
|
|
2592
|
+
...("isolated" in params ? { isolation: { requested: params.isolated } } : {}),`,
|
|
2593
|
+
patched: ` ...(params.effort !== undefined ? { effort: params.effort } : {}),
|
|
2594
|
+
...(params.model !== undefined ? { model: params.model } : {}),
|
|
2595
|
+
...("isolated" in params ? { isolation: { requested: params.isolated } } : {}),`,
|
|
2596
|
+
}],
|
|
2422
2597
|
},
|
|
2423
2598
|
{
|
|
2424
2599
|
file: "src/task/index.ts",
|
|
2600
|
+
excludes: "invalidModelSelectorReason",
|
|
2425
2601
|
marker: `...(params.model !== undefined ? { model: params.model } : {}),
|
|
2426
2602
|
...(params.tools?.length`,
|
|
2427
2603
|
// 18.3.4는 effort 다음 줄에 `solutionSpace: params.solutionSpace,` 를 넣었다(index.ts:1506).
|
|
@@ -2432,6 +2608,19 @@ const taskItemSchemaIsolated = type({
|
|
|
2432
2608
|
solutionSpace: params.solutionSpace,
|
|
2433
2609
|
...(params.model !== undefined ? { model: params.model } : {}),
|
|
2434
2610
|
...(params.tools?.length`,
|
|
2611
|
+
alternates: [{
|
|
2612
|
+
file: "src/task/index.ts",
|
|
2613
|
+
requires: "invalidModelSelectorReason",
|
|
2614
|
+
marker: ` solutionSpace: params.solutionSpace,
|
|
2615
|
+
...(params.model !== undefined ? { model: params.model } : {}),
|
|
2616
|
+
...(params.tools?.length`,
|
|
2617
|
+
anchor: ` solutionSpace: params.solutionSpace,
|
|
2618
|
+
...(params.model !== undefined ? { model: params.model } : {}),
|
|
2619
|
+
...(params.tools?.length`,
|
|
2620
|
+
patched: ` solutionSpace: params.solutionSpace,
|
|
2621
|
+
...(params.model !== undefined ? { model: params.model } : {}),
|
|
2622
|
+
...(params.tools?.length`,
|
|
2623
|
+
}],
|
|
2435
2624
|
},
|
|
2436
2625
|
{
|
|
2437
2626
|
// 18.3.3 BLOCK: upstream 은 `task`·`bash` 를 가진 SubAgent 정의에 `wait` 를 자동으로 더한다
|
|
@@ -2507,7 +2696,8 @@ import { isUnexpectedSocketCloseMessage } from "@oh-my-pi/pi-utils/fetch-retry";
|
|
|
2507
2696
|
},
|
|
2508
2697
|
{
|
|
2509
2698
|
file: "src/session/turn-recovery.ts",
|
|
2510
|
-
marker: `!
|
|
2699
|
+
marker: `!(retryBudgetExhausted && classifierRefusal) &&
|
|
2700
|
+
!baiTransportSameModelRetry`,
|
|
2511
2701
|
anchor: ` if (
|
|
2512
2702
|
allowModelFallback &&
|
|
2513
2703
|
retrySettings.modelFallback &&
|
|
@@ -2525,6 +2715,23 @@ import { isUnexpectedSocketCloseMessage } from "@oh-my-pi/pi-utils/fetch-retry";
|
|
|
2525
2715
|
!baiTransportSameModelRetry
|
|
2526
2716
|
) {
|
|
2527
2717
|
`,
|
|
2718
|
+
// 18.5.0: upstream 이 같은 조건 끝에 첫 시도·스트리밍 진행이 있는 socket drop 의 같은 모델 1회 재시도를 넣었다
|
|
2719
|
+
// (turn-recovery.ts:1623-1636·2630). 합집합으로 둔다: upstream 조건은 그대로 두고 b-ai 전송 장애(2회차 이후,
|
|
2720
|
+
// 내용 없는 끊김, stream read 오류)만 뒤에 덧붙인다.
|
|
2721
|
+
alternates: [{
|
|
2722
|
+
file: "src/session/turn-recovery.ts",
|
|
2723
|
+
marker: `!this.#isFirstAttemptMidStreamSocketDrop(message, id, retryBudgetExhausted) &&
|
|
2724
|
+
!baiTransportSameModelRetry`,
|
|
2725
|
+
anchor: ` !(retryBudgetExhausted && classifierRefusal) &&
|
|
2726
|
+
!this.#isFirstAttemptMidStreamSocketDrop(message, id, retryBudgetExhausted)
|
|
2727
|
+
) {
|
|
2728
|
+
`,
|
|
2729
|
+
patched: ` !(retryBudgetExhausted && classifierRefusal) &&
|
|
2730
|
+
!this.#isFirstAttemptMidStreamSocketDrop(message, id, retryBudgetExhausted) &&
|
|
2731
|
+
!baiTransportSameModelRetry
|
|
2732
|
+
) {
|
|
2733
|
+
`,
|
|
2734
|
+
}],
|
|
2528
2735
|
},
|
|
2529
2736
|
{
|
|
2530
2737
|
file: "src/registry/agent-lifecycle.ts",
|
|
@@ -7395,10 +7602,10 @@ export interface MCPDeferredServer {
|
|
|
7395
7602
|
// MCP 선택 연결: 매 사용자 요청의 system prompt 전에 mcp_select를 보내 고른 deferred 서버만 연결하고 노출 subset을 적용한다. 실패는 새 연결 0.
|
|
7396
7603
|
file: "src/session/agent-session.ts",
|
|
7397
7604
|
marker: `import type { MCPManager } from "../mcp/manager";`,
|
|
7398
|
-
|
|
7399
|
-
import
|
|
7400
|
-
|
|
7401
|
-
import type { MCPManager } from "../mcp/manager";
|
|
7605
|
+
// 18.5.0: upstream 이 pi-utils import 블록 바로 뒤에 `@oh-my-pi/pi-utils/ar` import 를 넣어 두 줄 앵커가 끊겼다.
|
|
7606
|
+
// AdvisorConfig import 한 줄(두 판 모두 파일 안 1회)만 잡는다. 적용 결과 바이트는 18.4.12 와 같다.
|
|
7607
|
+
anchor: `import type { AdvisorConfig } from "@oh-my-pi/pi-tui/overlays/advisor-config";`,
|
|
7608
|
+
patched: `import type { MCPManager } from "../mcp/manager";
|
|
7402
7609
|
import type { AdvisorConfig } from "@oh-my-pi/pi-tui/overlays/advisor-config";`,
|
|
7403
7610
|
},
|
|
7404
7611
|
{
|
|
@@ -8296,23 +8503,45 @@ function parentSubagentServiceTiers(
|
|
|
8296
8503
|
// 파일은 읽기만 한다. 웹 route는 번들 `dist/cli.js --export`를 먼저 실행하므로 번들의 같은 함수에도 같은 조건을
|
|
8297
8504
|
// 넣는다(min 식별자까지 정확히 일치하는 18.4.5 앵커, 버전이 바뀌면 조용히 어긋나지 않고 anchor-lost).
|
|
8298
8505
|
// 회귀: patches/core-export-advisor-test.ts(실제 SDK exportFromFile과 bun dist/cli.js --export의 HTML).
|
|
8506
|
+
// 18.5.0: upstream 이 같은 수집을 `session/sub-sessions.ts` 로 옮기고 그 루프에서 isAdvisorTranscriptName 으로
|
|
8507
|
+
// 거른다(sub-sessions.ts:11·61, 번들도 같은 조건). 세 항목 모두 그 upstream 줄의 no-op 후보를 둔다(RETIRE).
|
|
8508
|
+
// 본 후보 앵커는 18.5.0 에서 지워진 loadEntriesFromFile import 를 함께 잡아 새 판 순정에서 성립하지 않게 한다.
|
|
8299
8509
|
{
|
|
8300
8510
|
file: "src/export/html/index.ts",
|
|
8301
8511
|
marker: 'import { isAdvisorTranscriptName } from "../../advisor/transcript-recorder";',
|
|
8302
|
-
anchor: 'import type { SessionEntry, SessionHeader } from "../../session/session-entries";',
|
|
8303
|
-
patched: 'import { isAdvisorTranscriptName } from "../../advisor/transcript-recorder";\nimport type { SessionEntry, SessionHeader } from "../../session/session-entries";',
|
|
8512
|
+
anchor: 'import type { SessionEntry, SessionHeader } from "../../session/session-entries";\nimport { loadEntriesFromFile } from "../../session/session-loader";',
|
|
8513
|
+
patched: 'import { isAdvisorTranscriptName } from "../../advisor/transcript-recorder";\nimport type { SessionEntry, SessionHeader } from "../../session/session-entries";\nimport { loadEntriesFromFile } from "../../session/session-loader";',
|
|
8514
|
+
alternates: [{
|
|
8515
|
+
file: "src/session/sub-sessions.ts",
|
|
8516
|
+
marker: 'import { isAdvisorTranscriptName } from "../advisor/transcript-recorder";',
|
|
8517
|
+
anchor: 'import { isAdvisorTranscriptName } from "../advisor/transcript-recorder";',
|
|
8518
|
+
patched: 'import { isAdvisorTranscriptName } from "../advisor/transcript-recorder";',
|
|
8519
|
+
}],
|
|
8304
8520
|
},
|
|
8305
8521
|
{
|
|
8306
8522
|
file: "src/export/html/index.ts",
|
|
8307
8523
|
marker: ' // Advisor transcripts share this directory but are the advisor\'s own prompts and reviews, not subagents.\n',
|
|
8308
8524
|
anchor: ' if (!name.endsWith(".jsonl") || name.includes(".bak")) continue;\n',
|
|
8309
8525
|
patched: ' if (!name.endsWith(".jsonl") || name.includes(".bak")) continue;\n // Advisor transcripts share this directory but are the advisor\'s own prompts and reviews, not subagents.\n if (isAdvisorTranscriptName(name)) continue;\n',
|
|
8526
|
+
alternates: [{
|
|
8527
|
+
file: "src/session/sub-sessions.ts",
|
|
8528
|
+
marker: ' if (!name.endsWith(".jsonl") || name.includes(".bak") || isAdvisorTranscriptName(name)) continue;\n',
|
|
8529
|
+
anchor: ' if (!name.endsWith(".jsonl") || name.includes(".bak") || isAdvisorTranscriptName(name)) continue;\n',
|
|
8530
|
+
patched: ' if (!name.endsWith(".jsonl") || name.includes(".bak") || isAdvisorTranscriptName(name)) continue;\n',
|
|
8531
|
+
}],
|
|
8310
8532
|
},
|
|
8311
8533
|
{
|
|
8312
8534
|
file: "dist/cli.js",
|
|
8313
8535
|
marker: 'if(!o.endsWith(".jsonl")||o.includes(".bak")||o==="__advisor.jsonl"||o.startsWith("__advisor.")&&o.endsWith(".jsonl"))continue;let r=o.slice(0,-6),',
|
|
8314
8536
|
anchor: 'if(!o.endsWith(".jsonl")||o.includes(".bak"))continue;let r=o.slice(0,-6),',
|
|
8315
8537
|
patched: 'if(!o.endsWith(".jsonl")||o.includes(".bak")||o==="__advisor.jsonl"||o.startsWith("__advisor.")&&o.endsWith(".jsonl"))continue;let r=o.slice(0,-6),',
|
|
8538
|
+
// 18.5.0 번들의 upstream 조건(XTe = isAdvisorTranscriptName) 자체의 no-op.
|
|
8539
|
+
alternates: [{
|
|
8540
|
+
file: "dist/cli.js",
|
|
8541
|
+
marker: 'if(!i.endsWith(".jsonl")||i.includes(".bak")||XTe(i))continue;let a=i.slice(0,-6),',
|
|
8542
|
+
anchor: 'if(!i.endsWith(".jsonl")||i.includes(".bak")||XTe(i))continue;let a=i.slice(0,-6),',
|
|
8543
|
+
patched: 'if(!i.endsWith(".jsonl")||i.includes(".bak")||XTe(i))continue;let a=i.slice(0,-6),',
|
|
8544
|
+
}],
|
|
8316
8545
|
},
|
|
8317
8546
|
// 18.4.5 는 /ratchet 을 새로 넣으면서 `src/ratchet/prelude.ts`(코드)와 `prelude.js`(eval 텍스트 자산)를 같은 stem 으로
|
|
8318
8547
|
// 두고 sdk.ts 가 `./ratchet/prelude` 로 import 한다. Bun 1.4.2 는 node_modules 안의 확장자 없는 import 를 .js 부터
|
|
@@ -8757,7 +8986,7 @@ class HarmonyLeakInterruption extends Error {`,
|
|
|
8757
8986
|
// 비교·치환이 어긋나지 않는다. core 파일 자체의 줄 끝은 건드리지 않는다.
|
|
8758
8987
|
for (const entry of EDITS) {
|
|
8759
8988
|
for (const candidate of [entry, ...(entry.alternates ?? [])]) {
|
|
8760
|
-
for (const key of ["anchor", "marker", "patched", "legacyPatched"]) {
|
|
8989
|
+
for (const key of ["anchor", "marker", "patched", "legacyPatched", "requires", "excludes"]) {
|
|
8761
8990
|
if (typeof candidate[key] === "string") candidate[key] = candidate[key].replaceAll("\r\n", "\n");
|
|
8762
8991
|
}
|
|
8763
8992
|
}
|
|
@@ -8770,6 +8999,10 @@ for (const entry of EDITS) {
|
|
|
8770
8999
|
* 옛 설치와 새 설치에서 앵커의 파일과 문구가 갈라지므로, 같은 목적을 양쪽 설치에 그대로 적용하려면
|
|
8771
9000
|
* 후보가 필요하다(18.2.5의 pi-coding-agent → pi-tui 이동). 성립하는 후보는 정확히 하나여야 한다.
|
|
8772
9001
|
* 둘 이상이면 어느 쪽이 정본인지 알 수 없으므로 한쪽을 조용히 고르지 않고 실패한다.
|
|
9002
|
+
* 선택 키 `requires`·`excludes` 는 같은 파일 안에 그 문자열이 있어야/없어야 후보로 본다. 옛 판의 적용본과
|
|
9003
|
+
* 새 판의 순정이 국소 문맥까지 바이트가 같을 때만 쓴다(18.5.0 task/index.ts 의 model 전달: upstream 이 우리
|
|
9004
|
+
* 패치와 같은 줄을 넣어 marker 만으로는 "옛 판 적용본"과 "새 판 순정"을 가를 수 없고, 잘못 가르면 --revert 가
|
|
9005
|
+
* upstream 줄을 지운다). 조건은 marker·anchor 판별 전에 적용하고, 남은 후보 수 규칙은 그대로다.
|
|
8773
9006
|
*/
|
|
8774
9007
|
function resolveEdit(entry, target) {
|
|
8775
9008
|
const candidates = [entry, ...(entry.alternates ?? [])];
|
|
@@ -8778,6 +9011,8 @@ function resolveEdit(entry, target) {
|
|
|
8778
9011
|
const live = present
|
|
8779
9012
|
.map(candidate => {
|
|
8780
9013
|
const text = readFileSync(join(target, candidate.file), "utf8");
|
|
9014
|
+
if (candidate.requires !== undefined && !text.includes(candidate.requires)) return undefined;
|
|
9015
|
+
if (candidate.excludes !== undefined && text.includes(candidate.excludes)) return undefined;
|
|
8781
9016
|
if (candidate.legacyPatched && text.includes(candidate.legacyPatched)) return { ...candidate, path: join(target, candidate.file), text, status: "legacy" };
|
|
8782
9017
|
if (text.includes(candidate.marker)) return { ...candidate, path: join(target, candidate.file), text, status: "applied" };
|
|
8783
9018
|
if (text.includes(candidate.anchor)) return { ...candidate, path: join(target, candidate.file), text, status: "appliable" };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cuelo",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.2",
|
|
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.5.0"
|
|
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.
|
|
92
|
-
"@oh-my-pi/pi-ai": "18.
|
|
93
|
-
"@oh-my-pi/pi-coding-agent": "18.
|
|
94
|
-
"@oh-my-pi/pi-tui": "18.
|
|
95
|
-
"@oh-my-pi/pi-utils": "18.
|
|
91
|
+
"@oh-my-pi/pi-agent-core": "18.5.0",
|
|
92
|
+
"@oh-my-pi/pi-ai": "18.5.0",
|
|
93
|
+
"@oh-my-pi/pi-coding-agent": "18.5.0",
|
|
94
|
+
"@oh-my-pi/pi-tui": "18.5.0",
|
|
95
|
+
"@oh-my-pi/pi-utils": "18.5.0",
|
|
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",
|
|
@@ -1,8 +1,55 @@
|
|
|
1
1
|
# Office 3D assets
|
|
2
2
|
|
|
3
|
-
오피스 보기의 3D 사무실(`components/office/OfficeScene3D.tsx`)은
|
|
4
|
-
|
|
3
|
+
오피스 보기의 3D 사무실(`components/office/OfficeScene3D.tsx`)은 방의 가구·벽·소품을 `office-kit.glb` 한 장에서
|
|
4
|
+
가져온다. 그 안의 모델은 모두 CC0 1.0(퍼블릭 도메인, https://creativecommons.org/publicdomain/zero/1.0/)이고
|
|
5
|
+
유료 자산은 쓰지 않는다. 키트를 받지 못하면 같은 방을 코드 도형으로 그린다.
|
|
5
6
|
|
|
6
|
-
-
|
|
7
|
-
|
|
7
|
+
- 일곱 캐릭터의 겉모습과 동작은 내려받은 파일 없이 `components/office/OfficeCharacter.ts`에서 three.js 기본 도형으로 만든다.
|
|
8
|
+
머리색·머리 모양·옷 색은 같은 저장소의 계정 아바타(`public/avatars/`)를 보고 정했다.
|
|
8
9
|
- 이전에 쓰던 three.js 예제 로봇(`RobotExpressive.glb`, CC0 1.0)은 더 쓰지 않아 지웠다.
|
|
10
|
+
|
|
11
|
+
## `office-kit.glb`
|
|
12
|
+
|
|
13
|
+
아래 원본 모델을 이름 붙은 노드 하나씩으로 묶었다. 원점을 바닥 가운데로 옮기고 크기를 장면 단위로 맞춘 뒤
|
|
14
|
+
같은 재질·도형을 합치고 위치·법선·UV를 정수로 줄였다(`KHR_mesh_quantization`). 모양과 텍스처는 바꾸지 않았다.
|
|
15
|
+
배치는 `components/office/OfficeRoomAssets.ts`, 휴게 구역 가구 자리는 `lib/office/office-stage.ts` `OFFICE_LOUNGE`에 있다.
|
|
16
|
+
|
|
17
|
+
| 노드 | 원본 파일 | 팩 |
|
|
18
|
+
| --- | --- | --- |
|
|
19
|
+
| `desk` | `Models/GLTF format/desk.glb` | Kenney Furniture Kit 2.0 |
|
|
20
|
+
| `chairDesk` | `Models/GLTF format/chairDesk.glb` | Kenney Furniture Kit 2.0 |
|
|
21
|
+
| `screen` | `Models/GLTF format/computerScreen.glb` | Kenney Furniture Kit 2.0 |
|
|
22
|
+
| `keyboard` | `Models/GLTF format/computerKeyboard.glb` | Kenney Furniture Kit 2.0 |
|
|
23
|
+
| `bookcase` | `Models/GLTF format/bookcaseOpen.glb` | Kenney Furniture Kit 2.0 |
|
|
24
|
+
| `plantTall` | `Models/GLTF format/pottedPlant.glb` | Kenney Furniture Kit 2.0 |
|
|
25
|
+
| `trashcan` | `Models/GLTF format/trashcan.glb` | Kenney Furniture Kit 2.0 |
|
|
26
|
+
| `coffeeMachine` | `Models/GLTF format/kitchenCoffeeMachine.glb` | Kenney Furniture Kit 2.0 |
|
|
27
|
+
| `couch` | `Assets/gltf/couch_pillows.gltf` | KayKit Furniture Bits 1.0 |
|
|
28
|
+
| `armchair` | `Assets/gltf/armchair_pillows.gltf` | KayKit Furniture Bits 1.0 |
|
|
29
|
+
| `tableLow` | `Assets/gltf/table_low.gltf` | KayKit Furniture Bits 1.0 |
|
|
30
|
+
| `rugRect` | `Assets/gltf/rug_rectangle_stripes_B.gltf` | KayKit Furniture Bits 1.0 |
|
|
31
|
+
| `rugOval` | `Assets/gltf/rug_oval_B.gltf` | KayKit Furniture Bits 1.0 |
|
|
32
|
+
| `lamp` | `Assets/gltf/lamp_standing.gltf` | KayKit Furniture Bits 1.0 |
|
|
33
|
+
| `cactus` | `Assets/gltf/cactus_medium_A.gltf` | KayKit Furniture Bits 1.0 |
|
|
34
|
+
| `cactusSmall` | `Assets/gltf/cactus_small_A.gltf` | KayKit Furniture Bits 1.0 |
|
|
35
|
+
| `shelf` | `Assets/gltf/shelf_B_large_decorated.gltf` | KayKit Furniture Bits 1.0 |
|
|
36
|
+
| `frame` | `Assets/gltf/pictureframe_large_A.gltf` | KayKit Furniture Bits 1.0 |
|
|
37
|
+
| `frameSmall` | `Assets/gltf/pictureframe_medium.gltf` | KayKit Furniture Bits 1.0 |
|
|
38
|
+
| `counter` | `Assets/gltf/kitchencounter_straight_B_backsplash.gltf` | KayKit Restaurant Bits 1.0 |
|
|
39
|
+
| `wall` | `Assets/gltf/wall.gltf` | KayKit Restaurant Bits 1.0 |
|
|
40
|
+
| `wallWindow` | `Assets/gltf/wall_window_closed.gltf` | KayKit Restaurant Bits 1.0 |
|
|
41
|
+
| `wallDoor` | `Assets/gltf/wall_doorway.gltf` | KayKit Restaurant Bits 1.0 |
|
|
42
|
+
| `floorTile` | `Assets/gltf/floor_kitchen.gltf` | KayKit Restaurant Bits 1.0 |
|
|
43
|
+
| `roundTable` | `Assets/gltf/table_round_A_small.gltf` | KayKit Restaurant Bits 1.0 |
|
|
44
|
+
| `stool` | `Assets/gltf/chair_stool.gltf` | KayKit Restaurant Bits 1.0 |
|
|
45
|
+
|
|
46
|
+
텍스처는 KayKit 팩의 `furniturebits_texture.png`·`restaurantbits_texture.png` 두 장을 그대로 넣었다. Kenney 모델은 색 재질만 쓴다.
|
|
47
|
+
|
|
48
|
+
## 출처
|
|
49
|
+
|
|
50
|
+
- KayKit Furniture Bits 1.0, Kay Lousberg (https://kaylousberg.com), CC0 1.0.
|
|
51
|
+
https://github.com/KayKit-Game-Assets/KayKit-Furniture-Bits-1.0 (커밋 `96d5930a8dbdb363409bbc2d3341718b00e17c9c`), 경로 `addons/kaykit_furniture_bits/`
|
|
52
|
+
- KayKit Restaurant Bits 1.0, Kay Lousberg, CC0 1.0.
|
|
53
|
+
https://github.com/KayKit-Game-Assets/KayKit-Restaurant-Bits-1.0 (커밋 `153c8a7535b48237854cb54ff6890679f8c574d1`), 경로 `addons/kaykit_restaurant_bits/`
|
|
54
|
+
- Kenney Furniture Kit 2.0, Kenney (https://www.kenney.nl), CC0 1.0.
|
|
55
|
+
https://kenney.nl/assets/furniture-kit
|
|
Binary file
|