cuelo 0.5.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 -0
- package/.next/app-path-routes-manifest.json +72 -0
- package/.next/build-manifest.json +20 -0
- package/.next/diagnostics/build-diagnostics.json +6 -0
- package/.next/diagnostics/framework.json +1 -0
- package/.next/export-marker.json +6 -0
- package/.next/images-manifest.json +68 -0
- package/.next/next-minimal-server.js.nft.json +1 -0
- package/.next/next-server.js.nft.json +1 -0
- package/.next/package.json +1 -0
- package/.next/prerender-manifest.json +138 -0
- package/.next/react-loadable-manifest.json +2370 -0
- package/.next/required-server-files.js +350 -0
- package/.next/required-server-files.json +350 -0
- package/.next/routes-manifest.json +537 -0
- package/.next/server/app/_global-error/page.js +32 -0
- package/.next/server/app/_global-error/page.js.nft.json +1 -0
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -0
- package/.next/server/app/_global-error.html +1 -0
- package/.next/server/app/_global-error.meta +16 -0
- package/.next/server/app/_global-error.rsc +14 -0
- package/.next/server/app/_global-error.segments/_full.segment.rsc +14 -0
- package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +5 -0
- package/.next/server/app/_global-error.segments/_global-error.segment.rsc +5 -0
- package/.next/server/app/_global-error.segments/_head.segment.rsc +5 -0
- package/.next/server/app/_global-error.segments/_index.segment.rsc +5 -0
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
- package/.next/server/app/_not-found/page.js +2 -0
- package/.next/server/app/_not-found/page.js.nft.json +1 -0
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
- package/.next/server/app/_not-found.html +1 -0
- package/.next/server/app/_not-found.meta +16 -0
- package/.next/server/app/_not-found.rsc +18 -0
- package/.next/server/app/_not-found.segments/_full.segment.rsc +18 -0
- package/.next/server/app/_not-found.segments/_head.segment.rsc +6 -0
- package/.next/server/app/_not-found.segments/_index.segment.rsc +7 -0
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +5 -0
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +5 -0
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +3 -0
- package/.next/server/app/api/agent/[id]/account/route.js +1 -0
- package/.next/server/app/api/agent/[id]/account/route.js.nft.json +1 -0
- package/.next/server/app/api/agent/[id]/account/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/agent/[id]/bash-output/route.js +1 -0
- package/.next/server/app/api/agent/[id]/bash-output/route.js.nft.json +1 -0
- package/.next/server/app/api/agent/[id]/bash-output/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/agent/[id]/events/route.js +3 -0
- package/.next/server/app/api/agent/[id]/events/route.js.nft.json +1 -0
- package/.next/server/app/api/agent/[id]/events/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/agent/[id]/route.js +1 -0
- package/.next/server/app/api/agent/[id]/route.js.nft.json +1 -0
- package/.next/server/app/api/agent/[id]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/agent/new/route.js +1 -0
- package/.next/server/app/api/agent/new/route.js.nft.json +1 -0
- package/.next/server/app/api/agent/new/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/agent/running/route.js +1 -0
- package/.next/server/app/api/agent/running/route.js.nft.json +1 -0
- package/.next/server/app/api/agent/running/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/auth/all-providers/route.js +1 -0
- package/.next/server/app/api/auth/all-providers/route.js.nft.json +1 -0
- package/.next/server/app/api/auth/all-providers/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/auth/api-key/[provider]/route.js +1 -0
- package/.next/server/app/api/auth/api-key/[provider]/route.js.nft.json +1 -0
- package/.next/server/app/api/auth/api-key/[provider]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/auth/login/[provider]/route.js +3 -0
- package/.next/server/app/api/auth/login/[provider]/route.js.nft.json +1 -0
- package/.next/server/app/api/auth/login/[provider]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/auth/logout/[provider]/route.js +1 -0
- package/.next/server/app/api/auth/logout/[provider]/route.js.nft.json +1 -0
- package/.next/server/app/api/auth/logout/[provider]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/auth/providers/route.js +1 -0
- package/.next/server/app/api/auth/providers/route.js.nft.json +1 -0
- package/.next/server/app/api/auth/providers/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/cwd/browse/route.js +1 -0
- package/.next/server/app/api/cwd/browse/route.js.nft.json +1 -0
- package/.next/server/app/api/cwd/browse/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/cwd/validate/route.js +1 -0
- package/.next/server/app/api/cwd/validate/route.js.nft.json +1 -0
- package/.next/server/app/api/cwd/validate/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/default-cwd/route.js +1 -0
- package/.next/server/app/api/default-cwd/route.js.nft.json +1 -0
- package/.next/server/app/api/default-cwd/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/display-settings/route.js +1 -0
- package/.next/server/app/api/display-settings/route.js.nft.json +1 -0
- package/.next/server/app/api/display-settings/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/document-text/route.js +4 -0
- package/.next/server/app/api/document-text/route.js.nft.json +1 -0
- package/.next/server/app/api/document-text/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/experiments/route.js +1 -0
- package/.next/server/app/api/experiments/route.js.nft.json +1 -0
- package/.next/server/app/api/experiments/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/file-index/route.js +1 -0
- package/.next/server/app/api/file-index/route.js.nft.json +1 -0
- package/.next/server/app/api/file-index/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/files/[...path]/route.js +49 -0
- package/.next/server/app/api/files/[...path]/route.js.nft.json +1 -0
- package/.next/server/app/api/files/[...path]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/git/diff/route.js +6 -0
- package/.next/server/app/api/git/diff/route.js.nft.json +1 -0
- package/.next/server/app/api/git/diff/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/git/status/route.js +6 -0
- package/.next/server/app/api/git/status/route.js.nft.json +1 -0
- package/.next/server/app/api/git/status/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/gpt6/handles/route.js +1 -0
- package/.next/server/app/api/gpt6/handles/route.js.nft.json +1 -0
- package/.next/server/app/api/gpt6/handles/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/gpt6/mcp/route.js +2 -0
- package/.next/server/app/api/gpt6/mcp/route.js.nft.json +1 -0
- package/.next/server/app/api/gpt6/mcp/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/gpt6/reply/route.js +1 -0
- package/.next/server/app/api/gpt6/reply/route.js.nft.json +1 -0
- package/.next/server/app/api/gpt6/reply/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/gpt6/token/route.js +1 -0
- package/.next/server/app/api/gpt6/token/route.js.nft.json +1 -0
- package/.next/server/app/api/gpt6/token/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/gpt6/web6-session/route.js +1 -0
- package/.next/server/app/api/gpt6/web6-session/route.js.nft.json +1 -0
- package/.next/server/app/api/gpt6/web6-session/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/home/route.js +1 -0
- package/.next/server/app/api/home/route.js.nft.json +1 -0
- package/.next/server/app/api/home/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/live/call/[callId]/route.js +1 -0
- package/.next/server/app/api/live/call/[callId]/route.js.nft.json +1 -0
- package/.next/server/app/api/live/call/[callId]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/live/events/route.js +3 -0
- package/.next/server/app/api/live/events/route.js.nft.json +1 -0
- package/.next/server/app/api/live/events/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/live/offer/route.js +1 -0
- package/.next/server/app/api/live/offer/route.js.nft.json +1 -0
- package/.next/server/app/api/live/offer/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/live/voices/route.js +1 -0
- package/.next/server/app/api/live/voices/route.js.nft.json +1 -0
- package/.next/server/app/api/live/voices/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/mcp/route.js +2 -0
- package/.next/server/app/api/mcp/route.js.nft.json +1 -0
- package/.next/server/app/api/mcp/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/model-roles/route.js +1 -0
- package/.next/server/app/api/model-roles/route.js.nft.json +1 -0
- package/.next/server/app/api/model-roles/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/models/route.js +1 -0
- package/.next/server/app/api/models/route.js.nft.json +1 -0
- package/.next/server/app/api/models/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/models-config/catalog/route.js +1 -0
- package/.next/server/app/api/models-config/catalog/route.js.nft.json +1 -0
- package/.next/server/app/api/models-config/catalog/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/models-config/discover/route.js +1 -0
- package/.next/server/app/api/models-config/discover/route.js.nft.json +1 -0
- package/.next/server/app/api/models-config/discover/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/models-config/route.js +25 -0
- package/.next/server/app/api/models-config/route.js.nft.json +1 -0
- package/.next/server/app/api/models-config/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/models-config/test/route.js +1 -0
- package/.next/server/app/api/models-config/test/route.js.nft.json +1 -0
- package/.next/server/app/api/models-config/test/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/plugins/route.js +1 -0
- package/.next/server/app/api/plugins/route.js.nft.json +1 -0
- package/.next/server/app/api/plugins/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/project-trust/route.js +1 -0
- package/.next/server/app/api/project-trust/route.js.nft.json +1 -0
- package/.next/server/app/api/project-trust/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/projects/route.js +2 -0
- package/.next/server/app/api/projects/route.js.nft.json +1 -0
- package/.next/server/app/api/projects/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/runs/[runId]/route.js +1 -0
- package/.next/server/app/api/runs/[runId]/route.js.nft.json +1 -0
- package/.next/server/app/api/runs/[runId]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/runs/route.js +1 -0
- package/.next/server/app/api/runs/route.js.nft.json +1 -0
- package/.next/server/app/api/runs/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/[id]/auto-name/route.js +1 -0
- package/.next/server/app/api/sessions/[id]/auto-name/route.js.nft.json +1 -0
- package/.next/server/app/api/sessions/[id]/auto-name/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/[id]/context/route.js +1 -0
- package/.next/server/app/api/sessions/[id]/context/route.js.nft.json +1 -0
- package/.next/server/app/api/sessions/[id]/context/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/[id]/entries/[entryId]/thinking/route.js +1 -0
- package/.next/server/app/api/sessions/[id]/entries/[entryId]/thinking/route.js.nft.json +1 -0
- package/.next/server/app/api/sessions/[id]/entries/[entryId]/thinking/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/[id]/export/route.js +1 -0
- package/.next/server/app/api/sessions/[id]/export/route.js.nft.json +1 -0
- package/.next/server/app/api/sessions/[id]/export/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/[id]/route.js +1 -0
- package/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -0
- package/.next/server/app/api/sessions/[id]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/[id]/state/route.js +1 -0
- package/.next/server/app/api/sessions/[id]/state/route.js.nft.json +1 -0
- package/.next/server/app/api/sessions/[id]/state/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/route.js +1 -0
- package/.next/server/app/api/sessions/route.js.nft.json +1 -0
- package/.next/server/app/api/sessions/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/settings/route.js +1 -0
- package/.next/server/app/api/settings/route.js.nft.json +1 -0
- package/.next/server/app/api/settings/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sidecars/[service]/[...path]/route.js +1 -0
- package/.next/server/app/api/sidecars/[service]/[...path]/route.js.nft.json +1 -0
- package/.next/server/app/api/sidecars/[service]/[...path]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/skills/check/route.js +1 -0
- package/.next/server/app/api/skills/check/route.js.nft.json +1 -0
- package/.next/server/app/api/skills/check/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/skills/install/route.js +2 -0
- package/.next/server/app/api/skills/install/route.js.nft.json +1 -0
- package/.next/server/app/api/skills/install/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/skills/route.js +6 -0
- package/.next/server/app/api/skills/route.js.nft.json +1 -0
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/skills/search/route.js +1 -0
- package/.next/server/app/api/skills/search/route.js.nft.json +1 -0
- package/.next/server/app/api/skills/search/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/skills/update/route.js +1 -0
- package/.next/server/app/api/skills/update/route.js.nft.json +1 -0
- package/.next/server/app/api/skills/update/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/theme/route.js +1 -0
- package/.next/server/app/api/theme/route.js.nft.json +1 -0
- package/.next/server/app/api/theme/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/update-maintenance/route.js +556 -0
- package/.next/server/app/api/update-maintenance/route.js.nft.json +1 -0
- package/.next/server/app/api/update-maintenance/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/updates/route.js +1 -0
- package/.next/server/app/api/updates/route.js.nft.json +1 -0
- package/.next/server/app/api/updates/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/web-access/recovery/route.js +1 -0
- package/.next/server/app/api/web-access/recovery/route.js.nft.json +1 -0
- package/.next/server/app/api/web-access/recovery/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/web-access/route.js +1 -0
- package/.next/server/app/api/web-access/route.js.nft.json +1 -0
- package/.next/server/app/api/web-access/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/web6/consults/route.js +1 -0
- package/.next/server/app/api/web6/consults/route.js.nft.json +1 -0
- package/.next/server/app/api/web6/consults/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/route.js +1 -0
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -0
- package/.next/server/app/favicon.ico/route.js +1 -0
- package/.next/server/app/favicon.ico/route.js.nft.json +1 -0
- package/.next/server/app/favicon.ico.body +0 -0
- package/.next/server/app/favicon.ico.meta +1 -0
- package/.next/server/app/index.html +1 -0
- package/.next/server/app/index.meta +14 -0
- package/.next/server/app/index.rsc +20 -0
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +9 -0
- package/.next/server/app/index.segments/_full.segment.rsc +20 -0
- package/.next/server/app/index.segments/_head.segment.rsc +6 -0
- package/.next/server/app/index.segments/_index.segment.rsc +7 -0
- package/.next/server/app/index.segments/_tree.segment.rsc +5 -0
- package/.next/server/app/manifest.webmanifest/route.js +16 -0
- package/.next/server/app/manifest.webmanifest/route.js.nft.json +1 -0
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -0
- package/.next/server/app/page.js +22 -0
- package/.next/server/app/page.js.nft.json +1 -0
- package/.next/server/app/page_client-reference-manifest.js +1 -0
- package/.next/server/app/recover/page.js +2 -0
- package/.next/server/app/recover/page.js.nft.json +1 -0
- package/.next/server/app/recover/page_client-reference-manifest.js +1 -0
- package/.next/server/app/recover.html +1 -0
- package/.next/server/app/recover.meta +15 -0
- package/.next/server/app/recover.rsc +23 -0
- package/.next/server/app/recover.segments/_full.segment.rsc +23 -0
- package/.next/server/app/recover.segments/_head.segment.rsc +6 -0
- package/.next/server/app/recover.segments/_index.segment.rsc +7 -0
- package/.next/server/app/recover.segments/_tree.segment.rsc +4 -0
- package/.next/server/app/recover.segments/recover/__PAGE__.segment.rsc +10 -0
- package/.next/server/app/recover.segments/recover.segment.rsc +5 -0
- package/.next/server/app-paths-manifest.json +72 -0
- package/.next/server/chunks/11.js +1 -0
- package/.next/server/chunks/1286.js +1 -0
- package/.next/server/chunks/1412.js +38 -0
- package/.next/server/chunks/1517.js +19 -0
- package/.next/server/chunks/1605.js +1 -0
- package/.next/server/chunks/169.js +1 -0
- package/.next/server/chunks/18.js +86 -0
- package/.next/server/chunks/1813.js +1 -0
- package/.next/server/chunks/2022.js +1 -0
- package/.next/server/chunks/2156.js +1 -0
- package/.next/server/chunks/2157.js +1 -0
- package/.next/server/chunks/2325.js +82 -0
- package/.next/server/chunks/2651.js +2 -0
- package/.next/server/chunks/2838.js +1 -0
- package/.next/server/chunks/2897.js +79 -0
- package/.next/server/chunks/2958.js +90 -0
- package/.next/server/chunks/319.js +45 -0
- package/.next/server/chunks/3227.js +1 -0
- package/.next/server/chunks/3229.js +2 -0
- package/.next/server/chunks/3266.js +1 -0
- package/.next/server/chunks/3379.js +1 -0
- package/.next/server/chunks/3428.js +32 -0
- package/.next/server/chunks/3479.js +1 -0
- package/.next/server/chunks/367.js +115 -0
- package/.next/server/chunks/3698.js +93 -0
- package/.next/server/chunks/3709.js +148 -0
- package/.next/server/chunks/3759.js +34 -0
- package/.next/server/chunks/4107.js +62 -0
- package/.next/server/chunks/4741.js +20 -0
- package/.next/server/chunks/4755.js +153 -0
- package/.next/server/chunks/5002.js +1 -0
- package/.next/server/chunks/5112.js +1 -0
- package/.next/server/chunks/5289.js +8 -0
- package/.next/server/chunks/5318.js +1 -0
- package/.next/server/chunks/5452.js +23 -0
- package/.next/server/chunks/5453.js +1 -0
- package/.next/server/chunks/5582.js +20 -0
- package/.next/server/chunks/5749.js +27 -0
- package/.next/server/chunks/5782.js +36 -0
- package/.next/server/chunks/6163.js +104 -0
- package/.next/server/chunks/6169.js +64 -0
- package/.next/server/chunks/6208.js +172 -0
- package/.next/server/chunks/6399.js +24 -0
- package/.next/server/chunks/6429.js +10 -0
- package/.next/server/chunks/6496.js +1 -0
- package/.next/server/chunks/6775.js +6 -0
- package/.next/server/chunks/6823.js +215 -0
- package/.next/server/chunks/6888.js +1 -0
- package/.next/server/chunks/7245.js +77 -0
- package/.next/server/chunks/7307.js +1 -0
- package/.next/server/chunks/7372.js +287 -0
- package/.next/server/chunks/7384.js +226 -0
- package/.next/server/chunks/7516.js +1 -0
- package/.next/server/chunks/7531.js +24 -0
- package/.next/server/chunks/7591.js +1 -0
- package/.next/server/chunks/7755.js +138 -0
- package/.next/server/chunks/7916.js +1 -0
- package/.next/server/chunks/8078.js +94 -0
- package/.next/server/chunks/8253.js +41 -0
- package/.next/server/chunks/8635.js +1 -0
- package/.next/server/chunks/8688.js +1 -0
- package/.next/server/chunks/877.js +1 -0
- package/.next/server/chunks/8872.js +1 -0
- package/.next/server/chunks/9006.js +1 -0
- package/.next/server/chunks/9018.js +1 -0
- package/.next/server/chunks/9047.js +1 -0
- package/.next/server/chunks/9108.js +1 -0
- package/.next/server/chunks/9280.js +256 -0
- package/.next/server/chunks/9419.js +1 -0
- package/.next/server/chunks/9430.js +1 -0
- package/.next/server/chunks/9586.js +1 -0
- package/.next/server/chunks/9775.js +1 -0
- package/.next/server/chunks/9910.js +1 -0
- package/.next/server/chunks/992.js +1 -0
- package/.next/server/chunks/9926.js +1 -0
- package/.next/server/functions-config-manifest.json +25 -0
- package/.next/server/interception-route-rewrite-manifest.js +1 -0
- package/.next/server/middleware-build-manifest.js +1 -0
- package/.next/server/middleware-manifest.json +6 -0
- package/.next/server/middleware-react-loadable-manifest.js +1 -0
- package/.next/server/middleware.js +45 -0
- package/.next/server/middleware.js.nft.json +1 -0
- package/.next/server/next-font-manifest.js +1 -0
- package/.next/server/next-font-manifest.json +1 -0
- package/.next/server/pages/404.html +1 -0
- package/.next/server/pages/500.html +1 -0
- package/.next/server/pages-manifest.json +4 -0
- package/.next/server/prefetch-hints.json +1 -0
- package/.next/server/server-reference-manifest.js +1 -0
- package/.next/server/server-reference-manifest.json +1 -0
- package/.next/server/webpack-runtime.js +1 -0
- package/.next/static/MvC-CM1U-UMEzpaGIsCuQ/_buildManifest.js +1 -0
- package/.next/static/MvC-CM1U-UMEzpaGIsCuQ/_ssgManifest.js +1 -0
- package/.next/static/chunks/1213.e5c6e70a79b5f7e6.js +24 -0
- package/.next/static/chunks/1519.2f596e5f5af9ef57.js +62 -0
- package/.next/static/chunks/1966.b8f83f7ba376c962.js +1 -0
- package/.next/static/chunks/1974.885c9a133b86d8a4.js +32 -0
- package/.next/static/chunks/2280.6a7f540787704698.js +1 -0
- package/.next/static/chunks/2521.7f745f50d30076e7.js +77 -0
- package/.next/static/chunks/2585.4d6aa847c780c666.js +1 -0
- package/.next/static/chunks/2589.1aad68c09021b1ac.js +1 -0
- package/.next/static/chunks/2600.45ba17a0f756fc31.js +1 -0
- package/.next/static/chunks/2619.9aac8983f30c7c8a.js +1 -0
- package/.next/static/chunks/26d302b2.b77b53a34ca944aa.js +122 -0
- package/.next/static/chunks/2768.305914f7900745b6.js +1 -0
- package/.next/static/chunks/3016.406e568aa95ff867.js +1 -0
- package/.next/static/chunks/3022.972047558a20553a.js +172 -0
- package/.next/static/chunks/3064.3a2a1e7cd4fdca5f.js +1 -0
- package/.next/static/chunks/3174.03fbed7b7d7a8256.js +1 -0
- package/.next/static/chunks/3189.b048866768087750.js +1 -0
- package/.next/static/chunks/3217.1a053843c58b70b5.js +24 -0
- package/.next/static/chunks/3308.34ea31e24088c85f.js +74 -0
- package/.next/static/chunks/331.fc5d78e1e91daf43.js +1 -0
- package/.next/static/chunks/3510.5d4d1c79533e080c.js +1 -0
- package/.next/static/chunks/364.ce5400a9dd70b9dc.js +1 -0
- package/.next/static/chunks/370.57cfa27da8567918.js +1 -0
- package/.next/static/chunks/3789.c418b69121761983.js +1 -0
- package/.next/static/chunks/3794-1b03b52e3112452e.js +32 -0
- package/.next/static/chunks/3831.25ae62d10dccc27a.js +1 -0
- package/.next/static/chunks/3899.3f761f7e3a944e8c.js +1 -0
- package/.next/static/chunks/3a7aa434.93dbd20997cfd24f.js +82 -0
- package/.next/static/chunks/4020.3cc19c463c49f969.js +23 -0
- package/.next/static/chunks/4035.0acc428926d5c8dd.js +1 -0
- package/.next/static/chunks/405.0902e4f6eb7bd9a2.js +215 -0
- package/.next/static/chunks/4159.49ae537ff687bdc6.js +138 -0
- package/.next/static/chunks/4208.384b381ca2757643.js +287 -0
- package/.next/static/chunks/4263.ffa8d9bd8a0faaae.js +1 -0
- package/.next/static/chunks/4592.d0f37bc216b9d988.js +93 -0
- package/.next/static/chunks/4799.0dc7aa21bff2fd2a.js +1 -0
- package/.next/static/chunks/4bd1b696-e356ca5ba0218e27.js +1 -0
- package/.next/static/chunks/514.b804c51b26f5e126.js +1 -0
- package/.next/static/chunks/5270.28592864d38e881c.js +1 -0
- package/.next/static/chunks/52733464.3870f99cc446f9ff.js +1 -0
- package/.next/static/chunks/5312.4828d88ccc66f057.js +41 -0
- package/.next/static/chunks/5354.b559c717a607dc5c.js +1 -0
- package/.next/static/chunks/5413.1f8eeba1c502f3e9.js +34 -0
- package/.next/static/chunks/5448.d3972d9fb464b54f.js +38 -0
- package/.next/static/chunks/587.d52737d7288c11b4.js +1 -0
- package/.next/static/chunks/5909.9e37f7b495b11995.js +115 -0
- package/.next/static/chunks/5949.5504b3545fcc3d34.js +104 -0
- package/.next/static/chunks/6361.893d04ac34fa1b49.js +148 -0
- package/.next/static/chunks/6379-7da431a165ac5d41.js +7 -0
- package/.next/static/chunks/6774.8cd53427dbf32cac.js +86 -0
- package/.next/static/chunks/6968.b80277c724dbc96e.js +1 -0
- package/.next/static/chunks/7113.4b9e7ea870aa300a.js +8 -0
- package/.next/static/chunks/7236.55a9728d35f5b8a6.js +1 -0
- package/.next/static/chunks/7390.dde9b5bc2f6e24b8.js +1 -0
- package/.next/static/chunks/7806.a903780fcfa3a30e.js +1 -0
- package/.next/static/chunks/7997.be57e92e583fe635.js +1 -0
- package/.next/static/chunks/8216.64a72d4d35ea7be0.js +1 -0
- package/.next/static/chunks/830.5d5274d7ad1cb58e.js +1 -0
- package/.next/static/chunks/8378.fa91de3406f554c9.js +226 -0
- package/.next/static/chunks/8501.cd06aa1b0c7e1c6a.js +79 -0
- package/.next/static/chunks/8663.6ec5792fb4952e45.js +27 -0
- package/.next/static/chunks/872.96937e758ddce860.js +1 -0
- package/.next/static/chunks/8803.75bde095fe3613f5.js +1 -0
- package/.next/static/chunks/8863.72f5dbb820a0e4c3.js +1 -0
- package/.next/static/chunks/889.ff9934ce4324e448.js +90 -0
- package/.next/static/chunks/90542734.b88b1467ff8248c7.js +1 -0
- package/.next/static/chunks/9379.5bc9c9343ec5a16c.js +64 -0
- package/.next/static/chunks/9389.906fe7aa9cd6a170.js +1 -0
- package/.next/static/chunks/9472.8818ee52cfa931a4.js +94 -0
- package/.next/static/chunks/966.d6babbf8119162cc.js +1 -0
- package/.next/static/chunks/9884.839b23ae397c150e.js +36 -0
- package/.next/static/chunks/app/_global-error/page-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/_not-found/page-d3f2ac234e6fd3b6.js +1 -0
- package/.next/static/chunks/app/api/agent/[id]/account/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/agent/[id]/bash-output/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/agent/[id]/events/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/agent/[id]/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/agent/new/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/agent/running/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/auth/all-providers/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/auth/api-key/[provider]/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/auth/login/[provider]/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/[provider]/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/auth/providers/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/cwd/browse/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/cwd/validate/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/default-cwd/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/display-settings/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/document-text/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/experiments/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/file-index/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/files/[...path]/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/git/diff/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/git/status/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/gpt6/handles/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/gpt6/mcp/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/gpt6/reply/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/gpt6/token/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/gpt6/web6-session/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/home/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/live/call/[callId]/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/live/events/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/live/offer/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/live/voices/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/mcp/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/model-roles/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/models/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/models-config/catalog/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/models-config/discover/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/models-config/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/models-config/test/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/plugins/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/project-trust/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/projects/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/runs/[runId]/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/runs/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/auto-name/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/context/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/entries/[entryId]/thinking/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/export/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/state/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/sessions/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/settings/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/sidecars/[service]/[...path]/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/skills/check/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/skills/install/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/skills/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/skills/search/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/skills/update/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/theme/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/update-maintenance/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/updates/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/web-access/recovery/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/web-access/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/web6/consults/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/layout-95725ad1abf3cb75.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/app/page-26a4df181c1d562c.js +15 -0
- package/.next/static/chunks/app/recover/page-770a1de1ff4ded56.js +1 -0
- package/.next/static/chunks/c16f53c3-7916593d74747bde.js +1 -0
- package/.next/static/chunks/d3ac728e-7964f816a1ca64e5.js +1 -0
- package/.next/static/chunks/e413bedd.3a12a8cb02e28fdf.js +153 -0
- package/.next/static/chunks/ea233666.f00b64a7d99b4950.js +62 -0
- package/.next/static/chunks/framework-32a7466d5cae4a81.js +1 -0
- package/.next/static/chunks/main-50999e6ee5708e08.js +5 -0
- package/.next/static/chunks/main-app-0dc38ffe862cd588.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/app-error-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/forbidden-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/global-error-070571d2fa580e7d.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/not-found-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-a9c51a9353807009.js +1 -0
- package/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/.next/static/chunks/webpack-4094d78ef0b4c382.js +1 -0
- package/.next/static/css/2f46e0db0d4a3aed.css +1 -0
- package/.next/static/css/792a9d55c2fd2c0c.css +1 -0
- package/.next/static/css/92023589aa455863.css +1 -0
- package/.next/static/css/bb6b220f400250d8.css +1 -0
- package/.next/static/css/bc8f2da9192ea16d.css +1 -0
- package/.next/static/media/KaTeX_AMS-Regular.1608a09b.woff +0 -0
- package/.next/static/media/KaTeX_AMS-Regular.4aafdb68.ttf +0 -0
- package/.next/static/media/KaTeX_AMS-Regular.a79f1c31.woff2 +0 -0
- package/.next/static/media/KaTeX_Caligraphic-Bold.b6770918.woff +0 -0
- package/.next/static/media/KaTeX_Caligraphic-Bold.cce5b8ec.ttf +0 -0
- package/.next/static/media/KaTeX_Caligraphic-Bold.ec17d132.woff2 +0 -0
- package/.next/static/media/KaTeX_Caligraphic-Regular.07ef19e7.ttf +0 -0
- package/.next/static/media/KaTeX_Caligraphic-Regular.55fac258.woff2 +0 -0
- package/.next/static/media/KaTeX_Caligraphic-Regular.dad44a7f.woff +0 -0
- package/.next/static/media/KaTeX_Fraktur-Bold.9f256b85.woff +0 -0
- package/.next/static/media/KaTeX_Fraktur-Bold.b18f59e1.ttf +0 -0
- package/.next/static/media/KaTeX_Fraktur-Bold.d42a5579.woff2 +0 -0
- package/.next/static/media/KaTeX_Fraktur-Regular.7c187121.woff +0 -0
- package/.next/static/media/KaTeX_Fraktur-Regular.d3c882a6.woff2 +0 -0
- package/.next/static/media/KaTeX_Fraktur-Regular.ed38e79f.ttf +0 -0
- package/.next/static/media/KaTeX_Main-Bold.b74a1a8b.ttf +0 -0
- package/.next/static/media/KaTeX_Main-Bold.c3fb5ac2.woff2 +0 -0
- package/.next/static/media/KaTeX_Main-Bold.d181c465.woff +0 -0
- package/.next/static/media/KaTeX_Main-BoldItalic.6f2bb1df.woff2 +0 -0
- package/.next/static/media/KaTeX_Main-BoldItalic.70d8b0a5.ttf +0 -0
- package/.next/static/media/KaTeX_Main-BoldItalic.e3f82f9d.woff +0 -0
- package/.next/static/media/KaTeX_Main-Italic.47373d1e.ttf +0 -0
- package/.next/static/media/KaTeX_Main-Italic.8916142b.woff2 +0 -0
- package/.next/static/media/KaTeX_Main-Italic.9024d815.woff +0 -0
- package/.next/static/media/KaTeX_Main-Regular.0462f03b.woff2 +0 -0
- package/.next/static/media/KaTeX_Main-Regular.7f51fe03.woff +0 -0
- package/.next/static/media/KaTeX_Main-Regular.b7f8fe9b.ttf +0 -0
- package/.next/static/media/KaTeX_Math-BoldItalic.572d331f.woff2 +0 -0
- package/.next/static/media/KaTeX_Math-BoldItalic.a879cf83.ttf +0 -0
- package/.next/static/media/KaTeX_Math-BoldItalic.f1035d8d.woff +0 -0
- package/.next/static/media/KaTeX_Math-Italic.5295ba48.woff +0 -0
- package/.next/static/media/KaTeX_Math-Italic.939bc644.ttf +0 -0
- package/.next/static/media/KaTeX_Math-Italic.f28c23ac.woff2 +0 -0
- package/.next/static/media/KaTeX_SansSerif-Bold.8c5b5494.woff2 +0 -0
- package/.next/static/media/KaTeX_SansSerif-Bold.94e1e8dc.ttf +0 -0
- package/.next/static/media/KaTeX_SansSerif-Bold.bf59d231.woff +0 -0
- package/.next/static/media/KaTeX_SansSerif-Italic.3b1e59b3.woff2 +0 -0
- package/.next/static/media/KaTeX_SansSerif-Italic.7c9bc82b.woff +0 -0
- package/.next/static/media/KaTeX_SansSerif-Italic.b4c20c84.ttf +0 -0
- package/.next/static/media/KaTeX_SansSerif-Regular.74048478.woff +0 -0
- package/.next/static/media/KaTeX_SansSerif-Regular.ba21ed5f.woff2 +0 -0
- package/.next/static/media/KaTeX_SansSerif-Regular.d4d7ba48.ttf +0 -0
- package/.next/static/media/KaTeX_Script-Regular.03e9641d.woff2 +0 -0
- package/.next/static/media/KaTeX_Script-Regular.07505710.woff +0 -0
- package/.next/static/media/KaTeX_Script-Regular.fe9cbbe1.ttf +0 -0
- package/.next/static/media/KaTeX_Size1-Regular.e1e279cb.woff +0 -0
- package/.next/static/media/KaTeX_Size1-Regular.eae34984.woff2 +0 -0
- package/.next/static/media/KaTeX_Size1-Regular.fabc004a.ttf +0 -0
- package/.next/static/media/KaTeX_Size2-Regular.57727022.woff +0 -0
- package/.next/static/media/KaTeX_Size2-Regular.5916a24f.woff2 +0 -0
- package/.next/static/media/KaTeX_Size2-Regular.d6b476ec.ttf +0 -0
- package/.next/static/media/KaTeX_Size3-Regular.9acaf01c.woff +0 -0
- package/.next/static/media/KaTeX_Size3-Regular.a144ef58.ttf +0 -0
- package/.next/static/media/KaTeX_Size3-Regular.b4230e7e.woff2 +0 -0
- package/.next/static/media/KaTeX_Size4-Regular.10d95fd3.woff2 +0 -0
- package/.next/static/media/KaTeX_Size4-Regular.7a996c9d.woff +0 -0
- package/.next/static/media/KaTeX_Size4-Regular.fbccdabe.ttf +0 -0
- package/.next/static/media/KaTeX_Typewriter-Regular.6258592b.woff +0 -0
- package/.next/static/media/KaTeX_Typewriter-Regular.a8709e36.woff2 +0 -0
- package/.next/static/media/KaTeX_Typewriter-Regular.d97aaf4a.ttf +0 -0
- package/.next/trace +8 -0
- package/.next/trace-build +1 -0
- package/.next/types/app/api/agent/[id]/account/route.ts +351 -0
- package/.next/types/app/api/agent/[id]/bash-output/route.ts +351 -0
- package/.next/types/app/api/agent/[id]/events/route.ts +351 -0
- package/.next/types/app/api/agent/[id]/route.ts +351 -0
- package/.next/types/app/api/agent/new/route.ts +351 -0
- package/.next/types/app/api/agent/running/route.ts +351 -0
- package/.next/types/app/api/auth/all-providers/route.ts +351 -0
- package/.next/types/app/api/auth/api-key/[provider]/route.ts +351 -0
- package/.next/types/app/api/auth/login/[provider]/route.ts +351 -0
- package/.next/types/app/api/auth/logout/[provider]/route.ts +351 -0
- package/.next/types/app/api/auth/providers/route.ts +351 -0
- package/.next/types/app/api/cwd/browse/route.ts +351 -0
- package/.next/types/app/api/cwd/validate/route.ts +351 -0
- package/.next/types/app/api/default-cwd/route.ts +351 -0
- package/.next/types/app/api/display-settings/route.ts +351 -0
- package/.next/types/app/api/document-text/route.ts +351 -0
- package/.next/types/app/api/experiments/route.ts +351 -0
- package/.next/types/app/api/file-index/route.ts +351 -0
- package/.next/types/app/api/files/[...path]/route.ts +351 -0
- package/.next/types/app/api/git/diff/route.ts +351 -0
- package/.next/types/app/api/git/status/route.ts +351 -0
- package/.next/types/app/api/gpt6/handles/route.ts +351 -0
- package/.next/types/app/api/gpt6/mcp/route.ts +351 -0
- package/.next/types/app/api/gpt6/reply/route.ts +351 -0
- package/.next/types/app/api/gpt6/token/route.ts +351 -0
- package/.next/types/app/api/gpt6/web6-session/route.ts +351 -0
- package/.next/types/app/api/home/route.ts +351 -0
- package/.next/types/app/api/live/call/[callId]/route.ts +351 -0
- package/.next/types/app/api/live/events/route.ts +351 -0
- package/.next/types/app/api/live/offer/route.ts +351 -0
- package/.next/types/app/api/live/voices/route.ts +351 -0
- package/.next/types/app/api/mcp/route.ts +351 -0
- package/.next/types/app/api/model-roles/route.ts +351 -0
- package/.next/types/app/api/models/route.ts +351 -0
- package/.next/types/app/api/models-config/catalog/route.ts +351 -0
- package/.next/types/app/api/models-config/discover/route.ts +351 -0
- package/.next/types/app/api/models-config/route.ts +351 -0
- package/.next/types/app/api/models-config/test/route.ts +351 -0
- package/.next/types/app/api/plugins/route.ts +351 -0
- package/.next/types/app/api/project-trust/route.ts +351 -0
- package/.next/types/app/api/projects/route.ts +351 -0
- package/.next/types/app/api/runs/[runId]/route.ts +351 -0
- package/.next/types/app/api/runs/route.ts +351 -0
- package/.next/types/app/api/sessions/[id]/auto-name/route.ts +351 -0
- package/.next/types/app/api/sessions/[id]/context/route.ts +351 -0
- package/.next/types/app/api/sessions/[id]/entries/[entryId]/thinking/route.ts +351 -0
- package/.next/types/app/api/sessions/[id]/export/route.ts +351 -0
- package/.next/types/app/api/sessions/[id]/route.ts +351 -0
- package/.next/types/app/api/sessions/[id]/state/route.ts +351 -0
- package/.next/types/app/api/sessions/route.ts +351 -0
- package/.next/types/app/api/settings/route.ts +351 -0
- package/.next/types/app/api/sidecars/[service]/[...path]/route.ts +351 -0
- package/.next/types/app/api/skills/check/route.ts +351 -0
- package/.next/types/app/api/skills/install/route.ts +351 -0
- package/.next/types/app/api/skills/route.ts +351 -0
- package/.next/types/app/api/skills/search/route.ts +351 -0
- package/.next/types/app/api/skills/update/route.ts +351 -0
- package/.next/types/app/api/theme/route.ts +351 -0
- package/.next/types/app/api/update-maintenance/route.ts +351 -0
- package/.next/types/app/api/updates/route.ts +351 -0
- package/.next/types/app/api/web-access/recovery/route.ts +351 -0
- package/.next/types/app/api/web-access/route.ts +351 -0
- package/.next/types/app/api/web6/consults/route.ts +351 -0
- package/.next/types/app/api/worktrees/route.ts +351 -0
- package/.next/types/app/layout.ts +87 -0
- package/.next/types/app/page.ts +87 -0
- package/.next/types/app/recover/page.ts +87 -0
- package/.next/types/cache-life.d.ts +145 -0
- package/.next/types/package.json +1 -0
- package/.next/types/routes.d.ts +137 -0
- package/.next/types/validator.ts +655 -0
- package/LICENSE +22 -0
- package/README.md +174 -0
- package/Tools/CUELO_Setup/files/btw-server.js +343 -0
- package/Tools/CUELO_Setup/files/native-runtime-patch.js +349 -0
- package/Tools/CUELO_Setup/files/subagent-server.js +587 -0
- package/Tools/CUELO_Setup/files/usage-server.js +896 -0
- package/Tools/OMP_Global_Config/agent/AGENTS.md +122 -0
- package/Tools/OMP_Global_Config/agent/RULES.md +75 -0
- package/Tools/OMP_Global_Config/agent/WATCHDOG.md +55 -0
- package/Tools/OMP_Global_Config/agent/agents/maker.md +390 -0
- package/Tools/OMP_Global_Config/agent/extensions/character-voice.ts +718 -0
- package/Tools/OMP_Global_Config/agent/extensions/command-guard/index.ts +899 -0
- package/Tools/OMP_Global_Config/agent/extensions/command-guard/matcher.ts +1227 -0
- package/Tools/OMP_Global_Config/agent/extensions/command-guard/task-guard.ts +890 -0
- package/Tools/OMP_Global_Config/agent/extensions/jev-runtime.ts +1567 -0
- package/Tools/OMP_Global_Config/agent/extensions/lib/maker-routing.ts +1020 -0
- package/Tools/OMP_Global_Config/agent/extensions/lib/prepared-task.ts +204 -0
- package/Tools/OMP_Global_Config/agent/extensions/lib/routing-ledger.ts +289 -0
- package/Tools/OMP_Global_Config/agent/extensions/lib/task-progress.ts +492 -0
- package/Tools/OMP_Global_Config/agent/extensions/prompt-compact.ts +67 -0
- package/Tools/OMP_Global_Config/agent/extensions/steering-reply-gate.ts +92 -0
- package/Tools/OMP_Global_Config/agent/extensions/todo-nudge.ts +56 -0
- package/Tools/OMP_Global_Config/agent/extensions/turn-end-guard.ts +154 -0
- package/Tools/OMP_Global_Config/agent/prompt-copies/AGENTS.en.md +125 -0
- package/Tools/OMP_Global_Config/agent/prompt-copies/RULES.en.md +28 -0
- package/Tools/OMP_Global_Config/agent/rules/docs-handoff.md +36 -0
- package/Tools/OMP_Global_Config/agent/rules/frontend.md +63 -0
- package/Tools/OMP_Global_Config/agent/rules/harness-policy.json +1080 -0
- package/Tools/OMP_Global_Config/agent/rules/legacy-encoding.md +21 -0
- package/Tools/OMP_Global_Config/agent/rules/meta-harness.md +45 -0
- package/Tools/OMP_Global_Config/agent/rules/omp-harness.md +143 -0
- package/Tools/OMP_Global_Config/agent/rules/subagent.md +543 -0
- package/Tools/OMP_Global_Config/agent/rules/task-guard.md +54 -0
- package/Tools/OMP_Global_Config/agent/rules/verdict.md +183 -0
- package/Tools/OMP_Global_Config/agent/rules/web6-consult.md +84 -0
- package/Tools/OMP_Global_Config/agent/sop/_common.md +130 -0
- package/Tools/OMP_Global_Config/agent/sop/_writer.md +242 -0
- package/Tools/OMP_Global_Config/agent/sop/maker.md +9 -0
- package/Tools/OMP_Global_Config/agent/tools/git-finalizer/finalizer.ps1 +340 -0
- package/Tools/OMP_Global_Config/agent/tools/git-finalizer/index.ts +83 -0
- package/Tools/OMP_Global_Config/notices/orchestrate.md +26 -0
- package/Tools/OMP_Global_Config/notices/ultrathink.md +9 -0
- package/Tools/OMP_Global_Config/notices/workflow.md +16 -0
- package/Tools/OMP_Global_Config/patches/apply-core-patch.mjs +5005 -0
- package/Tools/OMP_Global_Config/patches/apply-notices.mjs +135 -0
- package/bin/cuelo-options.js +38 -0
- package/bin/cuelo.js +268 -0
- package/bin/password-prompt.js +100 -0
- package/bin/prepare-runtime.js +81 -0
- package/bin/runtime.js +134 -0
- package/bin/web-auth-store.d.ts +104 -0
- package/bin/web-auth-store.js +593 -0
- package/install.mjs +393 -0
- package/next.config.ts +96 -0
- package/package.json +134 -0
- package/public/audio/completion/isana/01.wav +0 -0
- package/public/audio/completion/isana/02.wav +0 -0
- package/public/audio/completion/isana/03.wav +0 -0
- package/public/audio/completion/isana/04.wav +0 -0
- package/public/audio/completion/isana/05.wav +0 -0
- package/public/audio/completion/isana/06.wav +0 -0
- package/public/audio/completion/isana/approval/01.wav +0 -0
- package/public/audio/completion/isana/approval/02.wav +0 -0
- package/public/audio/completion/isana/approval/03.wav +0 -0
- package/public/audio/completion/isana/choice/01.wav +0 -0
- package/public/audio/completion/isana/choice/02.wav +0 -0
- package/public/audio/completion/isana/choice/03.wav +0 -0
- package/public/audio/completion/isana/failed/01.wav +0 -0
- package/public/audio/completion/isana/failed/02.wav +0 -0
- package/public/audio/completion/isana/failed/03.wav +0 -0
- package/public/audio/completion/isana/working/01.wav +0 -0
- package/public/audio/completion/isana/working/02.wav +0 -0
- package/public/audio/completion/isana/working/03.wav +0 -0
- package/public/audio/completion/mio/01.wav +0 -0
- package/public/audio/completion/mio/02.wav +0 -0
- package/public/audio/completion/mio/03.wav +0 -0
- package/public/audio/completion/mio/04.wav +0 -0
- package/public/audio/completion/mio/05.wav +0 -0
- package/public/audio/completion/mio/06.wav +0 -0
- package/public/audio/completion/mio/approval/01.wav +0 -0
- package/public/audio/completion/mio/approval/02.wav +0 -0
- package/public/audio/completion/mio/approval/03.wav +0 -0
- package/public/audio/completion/mio/choice/01.wav +0 -0
- package/public/audio/completion/mio/choice/02.wav +0 -0
- package/public/audio/completion/mio/choice/03.wav +0 -0
- package/public/audio/completion/mio/failed/01.wav +0 -0
- package/public/audio/completion/mio/failed/02.wav +0 -0
- package/public/audio/completion/mio/failed/03.wav +0 -0
- package/public/audio/completion/mio/working/01.wav +0 -0
- package/public/audio/completion/mio/working/02.wav +0 -0
- package/public/audio/completion/mio/working/03.wav +0 -0
- package/public/audio/completion/nova/01.wav +0 -0
- package/public/audio/completion/nova/02.wav +0 -0
- package/public/audio/completion/nova/03.wav +0 -0
- package/public/audio/completion/nova/04.wav +0 -0
- package/public/audio/completion/nova/05.wav +0 -0
- package/public/audio/completion/nova/06.wav +0 -0
- package/public/audio/completion/nova/approval/01.wav +0 -0
- package/public/audio/completion/nova/approval/02.wav +0 -0
- package/public/audio/completion/nova/approval/03.wav +0 -0
- package/public/audio/completion/nova/choice/01.wav +0 -0
- package/public/audio/completion/nova/choice/02.wav +0 -0
- package/public/audio/completion/nova/choice/03.wav +0 -0
- package/public/audio/completion/nova/failed/01.wav +0 -0
- package/public/audio/completion/nova/failed/02.wav +0 -0
- package/public/audio/completion/nova/failed/03.wav +0 -0
- package/public/audio/completion/nova/working/01.wav +0 -0
- package/public/audio/completion/nova/working/02.wav +0 -0
- package/public/audio/completion/nova/working/03.wav +0 -0
- package/public/audio/completion/rin/01.wav +0 -0
- package/public/audio/completion/rin/02.wav +0 -0
- package/public/audio/completion/rin/03.wav +0 -0
- package/public/audio/completion/rin/04.wav +0 -0
- package/public/audio/completion/rin/05.wav +0 -0
- package/public/audio/completion/rin/06.wav +0 -0
- package/public/audio/completion/rin/approval/01.wav +0 -0
- package/public/audio/completion/rin/approval/02.wav +0 -0
- package/public/audio/completion/rin/approval/03.wav +0 -0
- package/public/audio/completion/rin/choice/01.wav +0 -0
- package/public/audio/completion/rin/choice/02.wav +0 -0
- package/public/audio/completion/rin/choice/03.wav +0 -0
- package/public/audio/completion/rin/failed/01.wav +0 -0
- package/public/audio/completion/rin/failed/02.wav +0 -0
- package/public/audio/completion/rin/failed/03.wav +0 -0
- package/public/audio/completion/rin/working/01.wav +0 -0
- package/public/audio/completion/rin/working/02.wav +0 -0
- package/public/audio/completion/rin/working/03.wav +0 -0
- package/public/audio/completion/shion/01.wav +0 -0
- package/public/audio/completion/shion/02.wav +0 -0
- package/public/audio/completion/shion/03.wav +0 -0
- package/public/audio/completion/shion/04.wav +0 -0
- package/public/audio/completion/shion/05.wav +0 -0
- package/public/audio/completion/shion/06.wav +0 -0
- package/public/audio/completion/shion/approval/01.wav +0 -0
- package/public/audio/completion/shion/approval/02.wav +0 -0
- package/public/audio/completion/shion/approval/03.wav +0 -0
- package/public/audio/completion/shion/choice/01.wav +0 -0
- package/public/audio/completion/shion/choice/02.wav +0 -0
- package/public/audio/completion/shion/choice/03.wav +0 -0
- package/public/audio/completion/shion/failed/01.wav +0 -0
- package/public/audio/completion/shion/failed/02.wav +0 -0
- package/public/audio/completion/shion/failed/03.wav +0 -0
- package/public/audio/completion/shion/working/01.wav +0 -0
- package/public/audio/completion/shion/working/02.wav +0 -0
- package/public/audio/completion/shion/working/03.wav +0 -0
- package/public/audio/completion/voices.json +1195 -0
- package/public/audio/completion/yuki/01.wav +0 -0
- package/public/audio/completion/yuki/02.wav +0 -0
- package/public/audio/completion/yuki/03.wav +0 -0
- package/public/audio/completion/yuki/04.wav +0 -0
- package/public/audio/completion/yuki/05.wav +0 -0
- package/public/audio/completion/yuki/06.wav +0 -0
- package/public/audio/completion/yuki/approval/01.wav +0 -0
- package/public/audio/completion/yuki/approval/02.wav +0 -0
- package/public/audio/completion/yuki/approval/03.wav +0 -0
- package/public/audio/completion/yuki/choice/01.wav +0 -0
- package/public/audio/completion/yuki/choice/02.wav +0 -0
- package/public/audio/completion/yuki/choice/03.wav +0 -0
- package/public/audio/completion/yuki/failed/01.wav +0 -0
- package/public/audio/completion/yuki/failed/02.wav +0 -0
- package/public/audio/completion/yuki/failed/03.wav +0 -0
- package/public/audio/completion/yuki/working/01.wav +0 -0
- package/public/audio/completion/yuki/working/02.wav +0 -0
- package/public/audio/completion/yuki/working/03.wav +0 -0
- package/public/avatars/isana.webp +0 -0
- package/public/avatars/mio.webp +0 -0
- package/public/avatars/nova.webp +0 -0
- package/public/avatars/rin.webp +0 -0
- package/public/avatars/shion.webp +0 -0
- package/public/avatars/yuki.webp +0 -0
- package/public/icons/apple-touch-icon.png +0 -0
- package/public/icons/catppuccin/LICENSE +22 -0
- package/public/icons/catppuccin/README.md +8 -0
- package/public/icons/catppuccin/latte/_file.svg +3 -0
- package/public/icons/catppuccin/latte/_folder.svg +3 -0
- package/public/icons/catppuccin/latte/_folder_open.svg +3 -0
- package/public/icons/catppuccin/latte/bash.svg +7 -0
- package/public/icons/catppuccin/latte/bun-lock.svg +8 -0
- package/public/icons/catppuccin/latte/config.svg +3 -0
- package/public/icons/catppuccin/latte/css.svg +6 -0
- package/public/icons/catppuccin/latte/database.svg +3 -0
- package/public/icons/catppuccin/latte/docker.svg +3 -0
- package/public/icons/catppuccin/latte/env.svg +3 -0
- package/public/icons/catppuccin/latte/eslint.svg +6 -0
- package/public/icons/catppuccin/latte/git.svg +6 -0
- package/public/icons/catppuccin/latte/go.svg +3 -0
- package/public/icons/catppuccin/latte/graphql.svg +3 -0
- package/public/icons/catppuccin/latte/html.svg +6 -0
- package/public/icons/catppuccin/latte/javascript-react.svg +8 -0
- package/public/icons/catppuccin/latte/javascript.svg +6 -0
- package/public/icons/catppuccin/latte/json.svg +3 -0
- package/public/icons/catppuccin/latte/lock.svg +3 -0
- package/public/icons/catppuccin/latte/markdown.svg +3 -0
- package/public/icons/catppuccin/latte/ms-word.svg +6 -0
- package/public/icons/catppuccin/latte/next.svg +6 -0
- package/public/icons/catppuccin/latte/npm-lock.svg +7 -0
- package/public/icons/catppuccin/latte/pdf.svg +3 -0
- package/public/icons/catppuccin/latte/python.svg +8 -0
- package/public/icons/catppuccin/latte/rust.svg +6 -0
- package/public/icons/catppuccin/latte/sass.svg +3 -0
- package/public/icons/catppuccin/latte/terraform.svg +3 -0
- package/public/icons/catppuccin/latte/toml.svg +3 -0
- package/public/icons/catppuccin/latte/typescript-react.svg +8 -0
- package/public/icons/catppuccin/latte/typescript.svg +6 -0
- package/public/icons/catppuccin/latte/yaml.svg +3 -0
- package/public/icons/catppuccin/mocha/_file.svg +3 -0
- package/public/icons/catppuccin/mocha/_folder.svg +3 -0
- package/public/icons/catppuccin/mocha/_folder_open.svg +3 -0
- package/public/icons/catppuccin/mocha/bash.svg +7 -0
- package/public/icons/catppuccin/mocha/bun-lock.svg +8 -0
- package/public/icons/catppuccin/mocha/config.svg +3 -0
- package/public/icons/catppuccin/mocha/css.svg +6 -0
- package/public/icons/catppuccin/mocha/database.svg +3 -0
- package/public/icons/catppuccin/mocha/docker.svg +3 -0
- package/public/icons/catppuccin/mocha/env.svg +3 -0
- package/public/icons/catppuccin/mocha/eslint.svg +6 -0
- package/public/icons/catppuccin/mocha/git.svg +6 -0
- package/public/icons/catppuccin/mocha/go.svg +3 -0
- package/public/icons/catppuccin/mocha/graphql.svg +3 -0
- package/public/icons/catppuccin/mocha/html.svg +6 -0
- package/public/icons/catppuccin/mocha/javascript-react.svg +8 -0
- package/public/icons/catppuccin/mocha/javascript.svg +6 -0
- package/public/icons/catppuccin/mocha/json.svg +3 -0
- package/public/icons/catppuccin/mocha/lock.svg +3 -0
- package/public/icons/catppuccin/mocha/markdown.svg +3 -0
- package/public/icons/catppuccin/mocha/ms-word.svg +6 -0
- package/public/icons/catppuccin/mocha/next.svg +6 -0
- package/public/icons/catppuccin/mocha/npm-lock.svg +7 -0
- package/public/icons/catppuccin/mocha/pdf.svg +3 -0
- package/public/icons/catppuccin/mocha/python.svg +8 -0
- package/public/icons/catppuccin/mocha/rust.svg +6 -0
- package/public/icons/catppuccin/mocha/sass.svg +3 -0
- package/public/icons/catppuccin/mocha/terraform.svg +3 -0
- package/public/icons/catppuccin/mocha/toml.svg +3 -0
- package/public/icons/catppuccin/mocha/typescript-react.svg +8 -0
- package/public/icons/catppuccin/mocha/typescript.svg +6 -0
- package/public/icons/catppuccin/mocha/yaml.svg +3 -0
- package/public/icons/icon-192.png +0 -0
- package/public/icons/icon-512.png +0 -0
- package/public/offline.html +145 -0
- package/public/stickers/isana/approval/01.webp +0 -0
- package/public/stickers/isana/approval/02.webp +0 -0
- package/public/stickers/isana/approval/03.webp +0 -0
- package/public/stickers/isana/choice/01.webp +0 -0
- package/public/stickers/isana/choice/02.webp +0 -0
- package/public/stickers/isana/choice/03.webp +0 -0
- package/public/stickers/isana/done/01.webp +0 -0
- package/public/stickers/isana/done/02.webp +0 -0
- package/public/stickers/isana/done/03.webp +0 -0
- package/public/stickers/isana/failed/01.webp +0 -0
- package/public/stickers/isana/failed/02.webp +0 -0
- package/public/stickers/isana/failed/03.webp +0 -0
- package/public/stickers/isana/working/01.webp +0 -0
- package/public/stickers/mio/approval/01.webp +0 -0
- package/public/stickers/mio/approval/02.webp +0 -0
- package/public/stickers/mio/approval/03.webp +0 -0
- package/public/stickers/mio/choice/01.webp +0 -0
- package/public/stickers/mio/choice/02.webp +0 -0
- package/public/stickers/mio/choice/03.webp +0 -0
- package/public/stickers/mio/done/01.webp +0 -0
- package/public/stickers/mio/done/02.webp +0 -0
- package/public/stickers/mio/done/03.webp +0 -0
- package/public/stickers/mio/failed/01.webp +0 -0
- package/public/stickers/mio/failed/02.webp +0 -0
- package/public/stickers/mio/failed/03.webp +0 -0
- package/public/stickers/mio/working/01.webp +0 -0
- package/public/stickers/nova/approval/01.webp +0 -0
- package/public/stickers/nova/approval/02.webp +0 -0
- package/public/stickers/nova/approval/03.webp +0 -0
- package/public/stickers/nova/choice/01.webp +0 -0
- package/public/stickers/nova/choice/02.webp +0 -0
- package/public/stickers/nova/choice/03.webp +0 -0
- package/public/stickers/nova/done/01.webp +0 -0
- package/public/stickers/nova/done/02.webp +0 -0
- package/public/stickers/nova/done/03.webp +0 -0
- package/public/stickers/nova/failed/01.webp +0 -0
- package/public/stickers/nova/failed/02.webp +0 -0
- package/public/stickers/nova/failed/03.webp +0 -0
- package/public/stickers/nova/working/01.webp +0 -0
- package/public/stickers/rin/approval/01.webp +0 -0
- package/public/stickers/rin/approval/02.webp +0 -0
- package/public/stickers/rin/approval/03.webp +0 -0
- package/public/stickers/rin/choice/01.webp +0 -0
- package/public/stickers/rin/choice/02.webp +0 -0
- package/public/stickers/rin/choice/03.webp +0 -0
- package/public/stickers/rin/done/01.webp +0 -0
- package/public/stickers/rin/done/02.webp +0 -0
- package/public/stickers/rin/done/03.webp +0 -0
- package/public/stickers/rin/failed/01.webp +0 -0
- package/public/stickers/rin/failed/02.webp +0 -0
- package/public/stickers/rin/failed/03.webp +0 -0
- package/public/stickers/rin/working/01.webp +0 -0
- package/public/stickers/shion/approval/01.webp +0 -0
- package/public/stickers/shion/approval/02.webp +0 -0
- package/public/stickers/shion/approval/03.webp +0 -0
- package/public/stickers/shion/choice/01.webp +0 -0
- package/public/stickers/shion/choice/02.webp +0 -0
- package/public/stickers/shion/choice/03.webp +0 -0
- package/public/stickers/shion/done/01.webp +0 -0
- package/public/stickers/shion/done/02.webp +0 -0
- package/public/stickers/shion/done/03.webp +0 -0
- package/public/stickers/shion/failed/01.webp +0 -0
- package/public/stickers/shion/failed/02.webp +0 -0
- package/public/stickers/shion/failed/03.webp +0 -0
- package/public/stickers/shion/working/01.webp +0 -0
- package/public/stickers/yuki/approval/01.webp +0 -0
- package/public/stickers/yuki/approval/02.webp +0 -0
- package/public/stickers/yuki/approval/03.webp +0 -0
- package/public/stickers/yuki/choice/01.webp +0 -0
- package/public/stickers/yuki/choice/02.webp +0 -0
- package/public/stickers/yuki/choice/03.webp +0 -0
- package/public/stickers/yuki/done/01.webp +0 -0
- package/public/stickers/yuki/done/02.webp +0 -0
- package/public/stickers/yuki/done/03.webp +0 -0
- package/public/stickers/yuki/failed/01.webp +0 -0
- package/public/stickers/yuki/failed/02.webp +0 -0
- package/public/stickers/yuki/failed/03.webp +0 -0
- package/public/stickers/yuki/working/01.webp +0 -0
- package/public/sw.js +124 -0
package/README.md
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="./docs/hero.png" alt="CUELO — AI coding agent workspace and harness for omp" width="100%">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<p align="center">
|
|
6
|
+
<a href="./LICENSE"><img src="https://img.shields.io/github/license/gim47656-ship-it/CUELO?style=flat&colorA=222222&colorB=58A6FF" alt="License"></a>
|
|
7
|
+
<a href="https://www.typescriptlang.org"><img src="https://img.shields.io/badge/TypeScript-3178C6?style=flat&colorA=222222&logo=typescript&logoColor=white" alt="TypeScript"></a>
|
|
8
|
+
<a href="https://bun.sh"><img src="https://img.shields.io/badge/runtime-Bun-f472b6?style=flat&colorA=222222" alt="Bun"></a>
|
|
9
|
+
</p>
|
|
10
|
+
|
|
11
|
+
# CUELO — AI Coding Agent Workspace & Harness for omp (oh-my-pi)
|
|
12
|
+
|
|
13
|
+
**CUELO** is an open-source AI coding agent workspace and harness for **[omp (oh-my-pi)](https://github.com/can1357/oh-my-pi)**.
|
|
14
|
+
|
|
15
|
+
Use the same `~/.omp/agent` sessions, credentials and model configuration from the terminal and browser. The web workspace provides session management, model configuration, skills, worktrees, usage views and PWA access. The public harness provides multi-agent orchestration and model-routing rules; some integrations require separately configured services, as detailed below.
|
|
16
|
+
|
|
17
|
+
**한국어:** CUELO는 omp(oh-my-pi)를 위한 오픈소스 AI 코딩 에이전트 작업 공간이자 하네스입니다. 웹 앱은 omp SDK를 서버 안에서 실행하고, `omp` CLI와 같은 `~/.omp/agent` 디렉터리를 씁니다. 터미널에서 하던 세션을 브라우저에서 이어 가고, 다시 터미널로 돌아가도 기록·계정·모델 설정을 공유합니다.
|
|
18
|
+
|
|
19
|
+
CUELO의 목적은 작업 중 확인한 실패와 막힘을 기억·작업 규칙·실행 절차에 반영해, 사람이 같은 문제를 다시 지적하지 않아도 다음 작업에서 실수를 줄이는 것입니다. 원인을 확인하고 필요한 부분만 바꾸며, 다음 작업에서 적용과 효과를 확인하는 것까지를 지향합니다. 기록을 저장했다는 이유만으로 자동 개선이 끝났다고 보지는 않습니다.
|
|
20
|
+
|
|
21
|
+
**Keywords:** AI coding agent · agent harness · multi-agent orchestration · omp · oh-my-pi · model routing · developer tools
|
|
22
|
+
|
|
23
|
+
## 이 저장소로 되는 것과 따로 필요한 것
|
|
24
|
+
|
|
25
|
+
| 구분 | 내용 |
|
|
26
|
+
| --- | --- |
|
|
27
|
+
| 이 저장소만으로 동작 | 웹 앱 전체: 세션 탐색·실시간 대화·분기/fork, 모델 역할, provider·플러그인·스킬 관리, 파일 미리보기, worktree, 비밀번호 잠금, 캐릭터 알림, 효율 패널(`~/.omp/stats.db` 읽기) |
|
|
28
|
+
| 사용자가 준비할 것 | 자신의 모델 제공자 계정과 모델 선택. 인증정보·세션·설정은 사용자의 로컬 `~/.omp/agent`에 저장합니다 |
|
|
29
|
+
| 로컬 사이드카 (공개) | 계정 사용량 카드, 사이드 챗(`/btw`), SubAgent 아카이브의 실행 소스도 포함합니다. `node install.mjs start`가 앱과 함께 실행합니다 |
|
|
30
|
+
| OMP 하네스 (공개) | Main/Maker 역할 분담, 발주·검수 계약, task guard, 판단 라우팅(Jev), 캐릭터 음성, 명령 가드의 규칙·SOP·확장과 core 패치입니다. `node install.mjs setup`으로 설치하며, 자세한 설명은 [docs/harness.md](./docs/harness.md)에 있습니다 |
|
|
31
|
+
| 포함하지 않는 것 | 개발자의 로그인 정보·API 키·개인 계정 및 모델 설정·개인 skill·대화와 작업 기록·PC별 운영 자료. 공개 설치는 필요한 비개인 운영 기본값만 제공하고 모델은 사용자가 고릅니다 |
|
|
32
|
+
|
|
33
|
+
## CUELO에서 할 수 있는 것
|
|
34
|
+
|
|
35
|
+
**세션과 대화**
|
|
36
|
+
|
|
37
|
+
- 프로젝트별로 지난 omp 세션을 찾아 이어 가고, 실시간으로 스트리밍되는 대화에서 도구 호출·비용·컨텍스트 사용량을 봅니다.
|
|
38
|
+
- 이전 메시지에서 갈래를 나누거나(세션 안 분기), 별도 세션으로 fork합니다.
|
|
39
|
+
- 작업 공간(프로젝트·worktree)을 바꾸면 그곳에서 마지막으로 열어 둔 세션으로 돌아갑니다.
|
|
40
|
+
- goal 모드의 자동 이어 가기와 todo 진행 상황을 대화창 위에서 확인합니다.
|
|
41
|
+
- 작업 로그 패널에서 이번 턴의 과정 항목과 턴마다 쓴 파일을 따로 봅니다.
|
|
42
|
+
|
|
43
|
+
**계정과 자원**
|
|
44
|
+
|
|
45
|
+
- 계정별 사용량 카드: 한도 창, 이번 구간 실측, 리셋 권장을 한 화면에 보여 줍니다. 기록이 없으면 숫자를 지어내지 않고 「기록 부족」으로 표시합니다.
|
|
46
|
+
- 계정은 이메일 대신 캐릭터 얼굴과 별칭으로 구별합니다. 주소를 상시 노출하지 않기 위해서입니다.
|
|
47
|
+
- 효율 패널(Run X-Ray · Experiment Lab): `~/.omp/stats.db`와 세션 기록에 이미 쌓인 값만 읽어 실행별 병목과 구성 비교를 보여 줍니다.
|
|
48
|
+
|
|
49
|
+
**여러 에이전트와 함께 일하기**
|
|
50
|
+
|
|
51
|
+
- SubAgent 아카이브: 진행 중·완료된 자식 에이전트의 기록을 열어 봅니다.
|
|
52
|
+
- 자식 에이전트의 발화가 해당 턴 아래 대화 흐름에 끼어들어 누가 무슨 말을 했는지 이어서 읽힙니다.
|
|
53
|
+
- 공개 하네스는 완료된 Maker의 미기록 Main 판정을 후속 지시 때 안내하고, 재작업 이력과 최종 수용을 구분합니다. 모델별 허용 추론 강도와 적용 경계는 [하네스 안내](./docs/harness.md#발주와-검수-계약)를 따릅니다.
|
|
54
|
+
- 사이드 챗(`/btw`): 본 대화를 끊지 않고 옆 패널에서 따로 묻습니다. 답변은 본 대화와 같은 캐릭터 얼굴·스티커·마크다운으로 보이고, 세션마다 초안이 따로 보관됩니다. 사이드 챗 문답은 본 대화에 남지 않으며, 답변의 「메인에 보내기」를 누를 때만 문답과 추가 지시가 본 대화로 전달됩니다(본 대화가 실행 중이면 steer, 아니면 새 요청).
|
|
55
|
+
- ChatGPT 6 Pro(SHION) 상담 브리지: 6 Pro가 MCP로 omp 세션에 붙어 상담하고, 상담 기록과 실패 기록이 대화창에 표시됩니다.
|
|
56
|
+
- 실시간 음성: 브라우저 마이크로 Codex live 음성 세션을 엽니다. 자격 증명은 서버에만 두고 페이지에는 넘기지 않습니다.
|
|
57
|
+
|
|
58
|
+
**알림과 표현**
|
|
59
|
+
|
|
60
|
+
- 완료·실패·승인 요청·선택 요청 등 상황에 맞는 캐릭터 스티커와 음성으로 알립니다(RIN · MIO · YUKI · ISANA · NOVA · SHION).
|
|
61
|
+
- 브라우저 알림과 PWA 설치를 지원합니다.
|
|
62
|
+
- 한국어가 기본인 인터페이스입니다(영어·중국어 간체도 선택 가능).
|
|
63
|
+
|
|
64
|
+
**omp-web에서 이어받은 기반 기능**
|
|
65
|
+
|
|
66
|
+
- 모델 역할(`default`, `smol`, `slow`, `plan`, `commit`, `task` 등)별 모델 지정·전환 — TUI의 `/model`과 같은 `config.yml`을 씁니다.
|
|
67
|
+
- 입력창의 `/` 명령은 대기 중뿐 아니라 실행 중에도 Enter·Steer·Follow-up으로 실행할 수 있습니다. 내장 명령은 즉시 처리하고, 발견된 확장·스킬·프롬프트 템플릿 명령은 해당 명령 경로로 전달합니다. 사용할 수 없거나 실행 중 허용되지 않는 명령은 안내하며 일반 채팅으로 전송하지 않습니다.
|
|
68
|
+
- provider 로그인·API 키, `models.yml`, 플러그인, 스킬을 웹에서 관리합니다.
|
|
69
|
+
- 프로젝트 파일 탐색과 소스·문서·이미지·오디오·PDF 미리보기, Git worktree 전환.
|
|
70
|
+
- 프로젝트 신뢰: 신뢰하지 않은 저장소의 확장·훅·도구·MCP는 실행하지 않습니다([docs/project-trust.md](./docs/project-trust.md)).
|
|
71
|
+
- 비밀번호 잠금(HTTP Basic Auth, scrypt 해시 저장)과 `/recover` 복구([docs/authentication.md](./docs/authentication.md)).
|
|
72
|
+
|
|
73
|
+
## 실행하기
|
|
74
|
+
|
|
75
|
+
CUELO는 GitHub 소스와 npm 패키지 [`cuelo`](https://www.npmjs.com/package/cuelo)로 설치합니다. npm의 `omp-web`은 upstream 프로젝트이며 CUELO와 별개입니다.
|
|
76
|
+
|
|
77
|
+
> **개발·검증 환경은 Windows입니다.** macOS·Linux는 개발·테스트 환경이 아니므로 동작과 지원을 보장하지 않습니다.
|
|
78
|
+
|
|
79
|
+
omp SDK가 TypeScript 소스와 `bun:` 내장 모듈을 쓰기 때문에 서버는 **Bun 1.4.2 이상**에서만 돕니다.
|
|
80
|
+
메모리 패키지가 선언한 선택적 ONNX peer는 `onnxruntime-node:1.21.0`으로 제공합니다. Transformers가 요구하는 별도 버전은 자체 의존성으로 유지하며, 설치 오류를 피하려고 peer 검증을 끄지 않습니다.
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
# Bun 설치
|
|
84
|
+
powershell -c "irm bun.sh/install.ps1 | iex" # Windows
|
|
85
|
+
|
|
86
|
+
# CUELO 받기와 실행
|
|
87
|
+
git clone https://github.com/gim47656-ship-it/CUELO.git
|
|
88
|
+
cd CUELO
|
|
89
|
+
node install.mjs setup
|
|
90
|
+
node install.mjs start
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
소스 빌드 없이 npm으로 설치하려면 Node.js 22.19.0 이상과 Bun 1.4.2 이상을 준비한 뒤 실행합니다.
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
npm install -g cuelo
|
|
97
|
+
cuelo setup
|
|
98
|
+
cuelo start
|
|
99
|
+
# 다른 터미널에서 서비스 확인
|
|
100
|
+
cuelo health
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
`setup`은 공개 하네스의 없는 파일만 추가합니다. npm 설치본에는 production 빌드가 포함되어 있어 다시 빌드하지 않습니다. 실행 중인 CUELO가 있다면 종료하거나 `cuelo start --port-base 31141`로 별도 포트를 사용하세요.
|
|
104
|
+
|
|
105
|
+
앱과 세 사이드카가 같은 터미널에서 실행됩니다. 브라우저에서 [http://127.0.0.1:30141](http://127.0.0.1:30141)을 열고 본인 계정으로 로그인한 뒤 모델을 선택하세요. 기본은 `127.0.0.1` 전용이며, Ctrl+C로 실행한 서비스를 종료합니다.
|
|
106
|
+
|
|
107
|
+
다른 터미널에서 `node install.mjs health`로 네 서비스의 응답을 확인합니다. 기존 설치와 다른 포트가 필요하면 `start`와 `health` 양쪽에 `--port-base 31141`처럼 지정합니다. Node.js 22.19.0 이상과 Git도 필요합니다.
|
|
108
|
+
|
|
109
|
+
처음 설치하거나 Claude·Codex에 설치를 맡길 때는 **[설치와 실행 안내](./docs/installation.md)**를 기준으로 하세요. 기존 프로필 파일은 자동으로 덮어쓰지 않으며, 제공자 로그인·권한 승인·모델 선택은 사용자 단계입니다. Windows에서 검증하며 다른 OS의 실사용 검증 범위는 설치 안내에 구분합니다.
|
|
110
|
+
|
|
111
|
+
앱만 따로 실행하는 기존 실행기 옵션:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
bun bin/cuelo.js --port 8080 # 포트 변경
|
|
115
|
+
bun bin/cuelo.js --hostname 0.0.0.0 # 신뢰하는 네트워크에만 노출
|
|
116
|
+
bun bin/cuelo.js --no-open # 브라우저 자동 열기 끄기
|
|
117
|
+
bun bin/cuelo.js --authenticated # 비밀번호 잠금 켜기
|
|
118
|
+
bun bin/cuelo.js --reset-password # 비밀번호 재설정
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
원격에서 쓸 때는 평문 HTTP를 인터넷에 열지 말고, 신뢰할 수 있는 HTTPS 리버스 프록시나 VPN 뒤에 두세요. CUELO는 권한이 큰 에이전트를 실행합니다.
|
|
122
|
+
|
|
123
|
+
### 업데이트
|
|
124
|
+
|
|
125
|
+
새 CUELO 릴리스가 나오면 사이드바 아래에 알림이 뜹니다. CUELO는 스스로 설치하지 않습니다. 소스에서 실행 중이면 서비스를 종료한 뒤 소스를 갱신하고 다시 설치·시작하세요. 실행 중인 개발 서버의 `.next/`에 빌드를 겹쳐 쓰지 마세요.
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
git pull --ff-only
|
|
129
|
+
node install.mjs setup
|
|
130
|
+
node install.mjs start
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
공개 웹 소스 릴리스와 변경 내용은 [GitHub Releases](https://github.com/gim47656-ship-it/CUELO/releases)에서 확인하세요. [릴리스 절차](./docs/release.md)는 CUELO의 수동 게시 흐름을 설명합니다.
|
|
134
|
+
|
|
135
|
+
### 사이드카 서비스
|
|
136
|
+
|
|
137
|
+
사용량 카드, 사이드 챗, SubAgent 아카이브는 로컬 사이드카 서비스에서 데이터를 받습니다. 실행 소스는 공개 저장소의 `Tools/CUELO_Setup/files/`에 있고, `node install.mjs start`가 함께 실행합니다. 개발자의 인증정보나 대화 기록을 제공하는 서비스가 아니라, 각 사용자 PC의 데이터를 읽는 서비스입니다.
|
|
138
|
+
|
|
139
|
+
| 기능 | 주소 |
|
|
140
|
+
| --- | --- |
|
|
141
|
+
| 계정 사용량·리셋 | `http://127.0.0.1:30142` |
|
|
142
|
+
| 사이드 챗 | `http://127.0.0.1:30143` |
|
|
143
|
+
| SubAgent 아카이브 | `http://127.0.0.1:30144` |
|
|
144
|
+
|
|
145
|
+
사이드카가 없으면 해당 패널은 「연결 안 됨」으로 표시되고, 나머지 기능은 그대로 동작합니다.
|
|
146
|
+
|
|
147
|
+
### Docker
|
|
148
|
+
|
|
149
|
+
`Dockerfile`과 `docker-compose.yml`로 컨테이너에서 실행할 수 있습니다. omp 홈 디렉터리(`~/.omp`)를 마운트해야 합니다. 자세한 내용은 [docs/docker.md](./docs/docker.md)를 보세요.
|
|
150
|
+
|
|
151
|
+
## 개발
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
bun install
|
|
155
|
+
bun run dev # http://127.0.0.1:30141
|
|
156
|
+
bun run typecheck
|
|
157
|
+
bun run lint
|
|
158
|
+
bun run test # 앱 테스트
|
|
159
|
+
bun run test:coverage # 앱 테스트 + 커버리지 표
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
개발 서버를 쓰는 동안 같은 출력 경로에 `bun run build`를 돌리지 마세요. `.next/`를 덮어써서 개발 서버가 깨집니다. 검증용 production 빌드는 별도 소스 복사본이나 격리된 `CUELO_DIST_DIR`에서 실행하세요.
|
|
163
|
+
|
|
164
|
+
참고 문서: [OMP 하네스](./docs/harness.md) · [인증](./docs/authentication.md) · [프로젝트 신뢰](./docs/project-trust.md) · [worktree](./docs/worktrees.md) · [다국어](./docs/i18n.md) · [Docker](./docs/docker.md)
|
|
165
|
+
|
|
166
|
+
## 계보와 라이선스
|
|
167
|
+
|
|
168
|
+
CUELO는 [@ddallabenetta](https://github.com/ddallabenetta)의 [omp-web](https://github.com/ddallabenetta/omp-web)을 기반으로 하고, omp-web은 [@agegr](https://github.com/agegr)의 [pi-web](https://github.com/agegr/pi-web)에서 갈라져 나왔습니다. CUELO 앱은 독립적으로 개발·배포하며 upstream 앱의 릴리스를 자동으로 따르지 않습니다. 기반 소스의 출처는 [`UPSTREAM.json`](./UPSTREAM.json)에 기록되어 있습니다.
|
|
169
|
+
|
|
170
|
+
CUELO의 에이전트 엔진은 [omp (oh-my-pi)](https://github.com/can1357/oh-my-pi)입니다. omp 소스를 이 저장소에 복사하지 않고 `@oh-my-pi/*` npm 패키지(MIT, Copyright (c) 2025 Mario Zechner, Copyright (c) 2025-2026 Can Bölük)를 의존성으로 씁니다. 각 패키지의 라이선스 전문은 설치된 패키지 안의 `LICENSE`에 들어 있습니다.
|
|
171
|
+
|
|
172
|
+
캐릭터(RIN · MIO · YUKI · ISANA · NOVA · SHION)의 그림·음성·스티커와 `docs/hero.png`는 CUELO 고유 자산입니다.
|
|
173
|
+
|
|
174
|
+
코드: [MIT License](./LICENSE)
|
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
// Sidecar: /btw-style ephemeral side chat for CUELO at http://127.0.0.1:30143/ask.
|
|
2
|
+
// MUST run under Bun (the omp SDK is TS sources importing bun: builtins); launch.ps1
|
|
3
|
+
// starts it with ~\.bun\bin\bun.exe. The UI lives in components/workspace/SideChatPanel.tsx.
|
|
4
|
+
//
|
|
5
|
+
// How it works: the panel POSTs { sessionPath, question, history? }. This server
|
|
6
|
+
// copies the session .jsonl to a temp file (SessionManager.open takes a single-writer
|
|
7
|
+
// lock, so the live file CUELO owns is never opened), builds an AgentSession over
|
|
8
|
+
// the copy, and calls session.runEphemeralTurn() — the same primitive the TUI's /btw
|
|
9
|
+
// uses: full session context, no tools, nothing persisted. Deltas stream back as
|
|
10
|
+
// NDJSON lines: {t:'d',v:delta} | {t:'done',v:full} | {t:'err',v:message}.
|
|
11
|
+
'use strict';
|
|
12
|
+
import { createHash } from 'node:crypto';
|
|
13
|
+
import fs from 'node:fs';
|
|
14
|
+
import os from 'node:os';
|
|
15
|
+
import path from 'node:path';
|
|
16
|
+
import { pathToFileURL } from 'node:url';
|
|
17
|
+
|
|
18
|
+
const PORT = Number(process.env.OMP_BTW_PORT) || 30143;
|
|
19
|
+
const ALLOW_ORIGIN = 'http://127.0.0.1:' + (Number(process.env.PORT) || 30141);
|
|
20
|
+
const IDLE_DISPOSE_MS = 15 * 60_000;
|
|
21
|
+
const SESSIONS_ROOT = path.join(os.homedir(), '.omp', 'agent', 'sessions');
|
|
22
|
+
const TMP_DIR = path.join(os.tmpdir(), 'omp-btw');
|
|
23
|
+
|
|
24
|
+
// omp SDK out of CUELO's own node_modules, so both always share one SDK version.
|
|
25
|
+
// npm global prefix 를 바꿔 쓰는 PC 도 있으므로 기본 위치가 없으면 `npm root -g` 로 찾는다.
|
|
26
|
+
function resolveCueloDir() {
|
|
27
|
+
const candidates = [];
|
|
28
|
+
if (process.env.CUELO_DIR) candidates.push(process.env.CUELO_DIR);
|
|
29
|
+
// 공식 fallback 설치본은 upstream 이름(omp-web)으로 들어간다.
|
|
30
|
+
for (const name of ['cuelo', 'omp-web']) candidates.push(path.join(process.env.APPDATA || '', 'npm', 'node_modules', name));
|
|
31
|
+
try {
|
|
32
|
+
// 명령이 고정 문자열이라 주입 여지가 없다. execFileSync + shell:true 는
|
|
33
|
+
// Node 가 deprecation 경고를 내므로 execSync 를 쓴다.
|
|
34
|
+
const root = require('node:child_process')
|
|
35
|
+
.execSync('npm root -g', { encoding: 'utf8', windowsHide: true })
|
|
36
|
+
.trim();
|
|
37
|
+
if (root) for (const name of ['cuelo', 'omp-web']) candidates.push(path.join(root, name));
|
|
38
|
+
} catch { /* npm 이 없으면 기본 후보만 쓴다 */ }
|
|
39
|
+
const hit = candidates.find(dir => dir && fs.existsSync(path.join(dir, 'node_modules', '@oh-my-pi', 'pi-coding-agent', 'src', 'index.ts')));
|
|
40
|
+
return hit || candidates[candidates.length - 1];
|
|
41
|
+
}
|
|
42
|
+
const cueloDir = resolveCueloDir();
|
|
43
|
+
const sdkEntry = path.join(cueloDir, 'node_modules', '@oh-my-pi', 'pi-coding-agent', 'src', 'index.ts');
|
|
44
|
+
if (!fs.existsSync(sdkEntry)) {
|
|
45
|
+
console.error('omp SDK not found: ' + sdkEntry + '\nSet CUELO_DIR to the CUELO folder (the one with node_modules/@oh-my-pi), for example by starting it with `node install.mjs start`.');
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
const { createAgentSession, SessionManager, AgentRegistry } = await import(pathToFileURL(sdkEntry).href);
|
|
49
|
+
|
|
50
|
+
fs.mkdirSync(TMP_DIR, { recursive: true });
|
|
51
|
+
|
|
52
|
+
// sessionPath -> { mtimeMs, size, lastUsed, session, copyPath }
|
|
53
|
+
const cache = new Map();
|
|
54
|
+
|
|
55
|
+
function headerCwd(jsonlPath) {
|
|
56
|
+
try {
|
|
57
|
+
const firstLine = fs.readFileSync(jsonlPath, 'utf8').split('\n', 1)[0];
|
|
58
|
+
const cwd = JSON.parse(firstLine).cwd;
|
|
59
|
+
if (typeof cwd === 'string' && fs.existsSync(cwd)) return cwd;
|
|
60
|
+
} catch {}
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** 세션 파일에서 sessionId 를 얻는다. 헤더 항목이 우선, 없으면 파일명에서 뽑는다. */
|
|
65
|
+
function sessionIdOf(jsonlPath) {
|
|
66
|
+
try {
|
|
67
|
+
for (const line of fs.readFileSync(jsonlPath, 'utf8').slice(0, 16384).split('\n')) {
|
|
68
|
+
if (!line.trim()) continue;
|
|
69
|
+
const entry = JSON.parse(line);
|
|
70
|
+
if (entry.type === 'session' && typeof entry.id === 'string') return entry.id;
|
|
71
|
+
}
|
|
72
|
+
} catch {}
|
|
73
|
+
const m = /_([0-9a-f]{8}-[0-9a-f-]+)\.jsonl$/i.exec(path.basename(jsonlPath));
|
|
74
|
+
return m ? m[1] : undefined;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* 사본 위에 새로 만든 AgentSession 은 설정된 default 모델로 복원된다. 메인 세션이 자동
|
|
79
|
+
* 폴백으로 다른 모델에서 돌고 있으면(주 모델 한도 소진 등) 사본은 소진된 모델을 그대로
|
|
80
|
+
* 다시 호출하고, runEphemeralTurn 은 TurnRecovery 를 거치지 않으므로 429 가 그대로
|
|
81
|
+
* 사용자에게 노출된다. 그래서 매 질문 전에 메인의 live state.model 로 맞춘다.
|
|
82
|
+
* 조회나 적용이 실패하면 조용히 기존 모델을 유지한다.
|
|
83
|
+
*/
|
|
84
|
+
async function syncModelFromMain(session, jsonlPath) {
|
|
85
|
+
const sessionId = sessionIdOf(jsonlPath);
|
|
86
|
+
if (!sessionId) return;
|
|
87
|
+
let live;
|
|
88
|
+
try {
|
|
89
|
+
const res = await fetch(ALLOW_ORIGIN + '/api/agent/' + sessionId, {
|
|
90
|
+
headers: { Accept: 'application/json' },
|
|
91
|
+
signal: AbortSignal.timeout(3000),
|
|
92
|
+
});
|
|
93
|
+
if (!res.ok) return;
|
|
94
|
+
live = (await res.json())?.state?.model;
|
|
95
|
+
} catch { return; }
|
|
96
|
+
if (!live || typeof live.provider !== 'string' || typeof live.id !== 'string') return;
|
|
97
|
+
const current = session.model;
|
|
98
|
+
if (current && current.provider === live.provider && current.id === live.id) return;
|
|
99
|
+
const target = session.modelRegistry.find(live.provider, live.id);
|
|
100
|
+
if (!target) return;
|
|
101
|
+
try {
|
|
102
|
+
await session.setModel(target);
|
|
103
|
+
} catch {}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// --- 모델 폴백 --------------------------------------------------------------
|
|
107
|
+
// runEphemeralTurn 은 TurnRecovery 를 거치지 않으므로 retry.fallbackChains 가 적용되지
|
|
108
|
+
// 않는다(TUI /btw 와 같은 한계). 그래서 주 모델 한도가 소진되면 메인 세션은 폴백으로
|
|
109
|
+
// 멀쩡히 돌아가는데 사이드채팅만 429 를 그대로 뱉었다. 같은 설정을 직접 읽어 체인을 밟는다.
|
|
110
|
+
|
|
111
|
+
const CONFIG_PATH = path.join(os.homedir(), '.omp', 'agent', 'config.yml');
|
|
112
|
+
const THINKING_LEVELS = new Set(['off', 'minimal', 'low', 'medium', 'high', 'xhigh', 'max']);
|
|
113
|
+
|
|
114
|
+
// config.yml 은 omp 재시작 없이 바뀔 수 있으므로 mtime 이 달라질 때만 다시 읽는다.
|
|
115
|
+
let chainCache = { mtimeMs: -1, chains: {} };
|
|
116
|
+
function fallbackChains() {
|
|
117
|
+
let st;
|
|
118
|
+
try { st = fs.statSync(CONFIG_PATH); } catch { return {}; }
|
|
119
|
+
if (st.mtimeMs !== chainCache.mtimeMs) {
|
|
120
|
+
const chains = {};
|
|
121
|
+
try {
|
|
122
|
+
const raw = Bun.YAML.parse(fs.readFileSync(CONFIG_PATH, 'utf8'))?.retry?.fallbackChains;
|
|
123
|
+
for (const key of Object.keys(raw || {})) {
|
|
124
|
+
if (Array.isArray(raw[key])) chains[key] = raw[key].filter(s => typeof s === 'string');
|
|
125
|
+
}
|
|
126
|
+
} catch {}
|
|
127
|
+
chainCache = { mtimeMs: st.mtimeMs, chains };
|
|
128
|
+
}
|
|
129
|
+
return chainCache.chains;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/** omp 와 같은 우선순위: 정확한 모델 키 > provider/* > default. 역할 키는 여기 해당 없음. */
|
|
133
|
+
function chainFor(model) {
|
|
134
|
+
if (!model) return [];
|
|
135
|
+
const chains = fallbackChains();
|
|
136
|
+
return chains[model.provider + '/' + model.id] ?? chains[model.provider + '/*'] ?? chains.default ?? [];
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* "provider/id" 또는 "provider/id:thinking" 을 나눈다. provider 는 첫 구간이고 나머지가
|
|
141
|
+
* id 다(openrouter/google/x 처럼 id 에 슬래시가 있을 수 있다). thinking 접미사는 레지스트리
|
|
142
|
+
* 조회에 방해되므로 떼어내기만 하고 적용하지는 않는다 — 여기서 필요한 건 모델 교체다.
|
|
143
|
+
*/
|
|
144
|
+
function parseSelector(selector) {
|
|
145
|
+
let base = selector;
|
|
146
|
+
const colon = selector.lastIndexOf(':');
|
|
147
|
+
// 모델 id 자체에 콜론이 있을 수 있어 알려진 thinking 값일 때만 접미사로 본다.
|
|
148
|
+
if (colon > 0 && THINKING_LEVELS.has(selector.slice(colon + 1))) base = selector.slice(0, colon);
|
|
149
|
+
const slash = base.indexOf('/');
|
|
150
|
+
if (slash < 1 || slash === base.length - 1) return null;
|
|
151
|
+
return { provider: base.slice(0, slash), id: base.slice(slash + 1) };
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// 모델 교체로 풀릴 만한 실패를 넓게 잡는다. 사이드채팅에서 다른 모델로 한 번 더 시도하는
|
|
155
|
+
// 비용은 낮고, 놓치면 사용자에게 429 가 그대로 보인다.
|
|
156
|
+
const SWITCH_WORTHY =
|
|
157
|
+
/\b(?:429|402)\b|rate.?limit|usage.?limit|quota|insufficient_quota|resource_exhausted|overloaded|over capacity|too many requests|service unavailable|bad gateway|gateway timeout|internal server error/i;
|
|
158
|
+
function isSwitchWorthy(err) {
|
|
159
|
+
const status = err?.status ?? err?.statusCode;
|
|
160
|
+
if (typeof status === 'number' && (status === 429 || status === 402 || status >= 500)) return true;
|
|
161
|
+
return SWITCH_WORTHY.test(String(err?.message || err));
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* 현재 모델로 먼저 시도하고, 모델 교체로 풀릴 실패면 체인을 순서대로 밟는다.
|
|
166
|
+
* 이미 화면에 글자가 나간 뒤에는 교체하지 않는다 — 다른 모델로 다시 스트리밍하면 앞서 보낸
|
|
167
|
+
* 내용과 뒤섞인다. TurnRecovery 의 replay-safety 와 같은 판단이다.
|
|
168
|
+
*/
|
|
169
|
+
async function runTurnWithFallback(session, args, onSwitch) {
|
|
170
|
+
const chain = chainFor(session.model);
|
|
171
|
+
const tried = new Set(session.model ? [session.model.provider + '/' + session.model.id] : []);
|
|
172
|
+
let streamed = false;
|
|
173
|
+
const turnArgs = { ...args, onTextDelta: d => { streamed = true; args.onTextDelta?.(d); } };
|
|
174
|
+
let next = 0;
|
|
175
|
+
for (;;) {
|
|
176
|
+
try {
|
|
177
|
+
return await session.runEphemeralTurn(turnArgs);
|
|
178
|
+
} catch (err) {
|
|
179
|
+
if (args.signal?.aborted || streamed || !isSwitchWorthy(err)) throw err;
|
|
180
|
+
let switched;
|
|
181
|
+
while (next < chain.length && !switched) {
|
|
182
|
+
const parsed = parseSelector(chain[next++]);
|
|
183
|
+
if (!parsed) continue;
|
|
184
|
+
const key = parsed.provider + '/' + parsed.id;
|
|
185
|
+
if (tried.has(key)) continue;
|
|
186
|
+
tried.add(key);
|
|
187
|
+
const model = session.modelRegistry.find(parsed.provider, parsed.id);
|
|
188
|
+
if (!model) continue;
|
|
189
|
+
try {
|
|
190
|
+
await session.setModel(model);
|
|
191
|
+
switched = model;
|
|
192
|
+
} catch {}
|
|
193
|
+
}
|
|
194
|
+
if (!switched) throw err;
|
|
195
|
+
onSwitch?.(switched);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
async function disposeEntry(key, entry) {
|
|
201
|
+
cache.delete(key);
|
|
202
|
+
try { await entry.session.dispose(); } catch {}
|
|
203
|
+
fs.rmSync(entry.copyPath, { force: true });
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/** Session over a temp copy of the .jsonl; rebuilt when the original changes. */
|
|
207
|
+
async function getSession(sessionPath) {
|
|
208
|
+
const st = fs.statSync(sessionPath);
|
|
209
|
+
const hit = cache.get(sessionPath);
|
|
210
|
+
if (hit && hit.mtimeMs === st.mtimeMs && hit.size === st.size) {
|
|
211
|
+
hit.lastUsed = Date.now();
|
|
212
|
+
return hit.session;
|
|
213
|
+
}
|
|
214
|
+
if (hit) await disposeEntry(sessionPath, hit);
|
|
215
|
+
|
|
216
|
+
const copyPath = path.join(
|
|
217
|
+
TMP_DIR,
|
|
218
|
+
createHash('sha1').update(sessionPath).digest('hex').slice(0, 16) + '.jsonl',
|
|
219
|
+
);
|
|
220
|
+
fs.copyFileSync(sessionPath, copyPath);
|
|
221
|
+
const sessionManager = await SessionManager.open(copyPath, undefined, undefined, {
|
|
222
|
+
suppressBreadcrumb: true,
|
|
223
|
+
});
|
|
224
|
+
const { session } = await createAgentSession({
|
|
225
|
+
cwd: headerCwd(copyPath),
|
|
226
|
+
sessionManager,
|
|
227
|
+
enableMCP: false,
|
|
228
|
+
enableLsp: false,
|
|
229
|
+
enableIrc: false,
|
|
230
|
+
disableExtensionDiscovery: true,
|
|
231
|
+
// Private registry: several cached sessions may coexist in this process.
|
|
232
|
+
agentRegistry: new AgentRegistry(),
|
|
233
|
+
});
|
|
234
|
+
cache.set(sessionPath, { mtimeMs: st.mtimeMs, size: st.size, lastUsed: Date.now(), session, copyPath });
|
|
235
|
+
return session;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
setInterval(() => {
|
|
239
|
+
const now = Date.now();
|
|
240
|
+
for (const [key, entry] of cache) {
|
|
241
|
+
if (now - entry.lastUsed > IDLE_DISPOSE_MS) void disposeEntry(key, entry);
|
|
242
|
+
}
|
|
243
|
+
}, 60_000).unref?.();
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* 사이드챗은 도구가 없고 메인 세션 파일의 사본만 본다. 안내가 없으면 메인인 것처럼 진행 상태를
|
|
247
|
+
* 단정하거나 메인 대신 작업을 약속한다. 그래서 매 질문 앞에 사본 시점과 자기 위치를 알린다.
|
|
248
|
+
*/
|
|
249
|
+
function buildPromptText(question, history, snapshotAt) {
|
|
250
|
+
const lines = [
|
|
251
|
+
'[사이드챗 안내] 너는 메인 세션의 사본(마지막 기록 ' + snapshotAt.toLocaleString('ko-KR', { hour12: false }) + ')을 읽는 사이드챗이다. '
|
|
252
|
+
+ '도구가 없고, 이 시각 이후 메인이 한 일이나 지금 진행 중인 턴은 모른다. '
|
|
253
|
+
+ '진행·완료 상태를 말할 때는 "사본 기준"이라고 밝히고 이후 바뀌었을 수 있다고 알린다. '
|
|
254
|
+
+ '메인 대신 작업을 약속하거나 한 것처럼 말하지 않는다. 메인이 해야 할 일이면 사용자에게 이 답의 "메인에 보내기"를 권한다.',
|
|
255
|
+
'',
|
|
256
|
+
];
|
|
257
|
+
if (Array.isArray(history) && history.length > 0) {
|
|
258
|
+
lines.push('(참고: 이 사이드채팅의 이전 문답. 메인 대화 기록에는 없는 내용이다.)');
|
|
259
|
+
for (const turn of history.slice(-6)) {
|
|
260
|
+
if (turn && typeof turn.q === 'string' && typeof turn.a === 'string') {
|
|
261
|
+
lines.push('Q: ' + turn.q, 'A: ' + turn.a, '');
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
lines.push(question);
|
|
266
|
+
return lines.join('\n');
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
const CORS = {
|
|
270
|
+
'Access-Control-Allow-Origin': ALLOW_ORIGIN,
|
|
271
|
+
'Access-Control-Allow-Methods': 'POST, GET, OPTIONS',
|
|
272
|
+
'Access-Control-Allow-Headers': 'Content-Type',
|
|
273
|
+
'Cache-Control': 'no-store',
|
|
274
|
+
};
|
|
275
|
+
|
|
276
|
+
function json(status, body) {
|
|
277
|
+
return new Response(JSON.stringify(body), {
|
|
278
|
+
status,
|
|
279
|
+
headers: { ...CORS, 'Content-Type': 'application/json; charset=utf-8' },
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
async function handleAsk(req) {
|
|
284
|
+
let body;
|
|
285
|
+
try { body = await req.json(); } catch { return json(400, { error: 'invalid JSON body' }); }
|
|
286
|
+
const question = typeof body.question === 'string' ? body.question.trim() : '';
|
|
287
|
+
if (!question) return json(400, { error: 'question required' });
|
|
288
|
+
const resolved = path.resolve(String(body.sessionPath || ''));
|
|
289
|
+
// Only session files under the default agent dir; this is a context loader, not a file reader.
|
|
290
|
+
if (!resolved.toLowerCase().startsWith(SESSIONS_ROOT.toLowerCase() + path.sep) ||
|
|
291
|
+
!resolved.endsWith('.jsonl') || !fs.existsSync(resolved)) {
|
|
292
|
+
return json(400, { error: 'sessionPath must be an existing .jsonl under ' + SESSIONS_ROOT });
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
let session;
|
|
296
|
+
try { session = await getSession(resolved); } catch (e) {
|
|
297
|
+
return json(500, { error: 'session load failed: ' + String(e?.message || e) });
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
// 메인이 폴백으로 다른 모델에 있으면 사본도 그 모델로 맞춘다(소진된 모델 재호출 방지).
|
|
301
|
+
await syncModelFromMain(session, resolved);
|
|
302
|
+
|
|
303
|
+
const promptText = buildPromptText(question, body.history, fs.statSync(resolved).mtime);
|
|
304
|
+
const enc = new TextEncoder();
|
|
305
|
+
const stream = new ReadableStream({
|
|
306
|
+
async start(controller) {
|
|
307
|
+
const send = obj => { try { controller.enqueue(enc.encode(JSON.stringify(obj) + '\n')); } catch {} };
|
|
308
|
+
try {
|
|
309
|
+
const { replyText } = await runTurnWithFallback(
|
|
310
|
+
session,
|
|
311
|
+
{
|
|
312
|
+
promptText,
|
|
313
|
+
onTextDelta: d => send({ t: 'd', v: d }),
|
|
314
|
+
signal: req.signal,
|
|
315
|
+
},
|
|
316
|
+
model => send({ t: 'm', v: model.provider + '/' + model.id }),
|
|
317
|
+
);
|
|
318
|
+
send({ t: 'done', v: replyText });
|
|
319
|
+
} catch (e) {
|
|
320
|
+
if (!req.signal.aborted) send({ t: 'err', v: String(e?.message || e) });
|
|
321
|
+
} finally {
|
|
322
|
+
try { controller.close(); } catch {}
|
|
323
|
+
}
|
|
324
|
+
},
|
|
325
|
+
});
|
|
326
|
+
return new Response(stream, {
|
|
327
|
+
headers: { ...CORS, 'Content-Type': 'application/x-ndjson; charset=utf-8' },
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
Bun.serve({
|
|
332
|
+
port: PORT,
|
|
333
|
+
hostname: '127.0.0.1',
|
|
334
|
+
idleTimeout: 0, // ephemeral turns on big contexts can exceed the 10 s default
|
|
335
|
+
async fetch(req) {
|
|
336
|
+
const url = new URL(req.url);
|
|
337
|
+
if (req.method === 'OPTIONS') return new Response(null, { status: 204, headers: CORS });
|
|
338
|
+
if (url.pathname === '/health') return json(200, { ok: true, cached: cache.size });
|
|
339
|
+
if (url.pathname === '/ask' && req.method === 'POST') return handleAsk(req);
|
|
340
|
+
return json(404, { error: 'not found' });
|
|
341
|
+
},
|
|
342
|
+
});
|
|
343
|
+
console.log('btw sidecar on http://127.0.0.1:' + PORT + '/ask');
|