cuelo 0.5.0 → 0.5.1
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 +11 -11
- package/.next/build-manifest.json +3 -3
- package/.next/prerender-manifest.json +3 -3
- package/.next/required-server-files.js +4 -4
- package/.next/required-server-files.json +4 -4
- package/.next/server/app/_global-error/page.js +3 -3
- 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.js +2 -2
- 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 +3 -3
- package/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
- 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 +2 -2
- package/.next/server/app/api/agent/[id]/account/route.js +1 -1
- package/.next/server/app/api/agent/[id]/account/route.js.nft.json +1 -1
- package/.next/server/app/api/agent/[id]/account/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agent/[id]/bash-output/route.js +1 -1
- package/.next/server/app/api/agent/[id]/bash-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agent/[id]/events/route.js +2 -2
- package/.next/server/app/api/agent/[id]/events/route.js.nft.json +1 -1
- package/.next/server/app/api/agent/[id]/events/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agent/[id]/route.js +1 -1
- package/.next/server/app/api/agent/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/agent/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agent/new/route.js +1 -1
- package/.next/server/app/api/agent/new/route.js.nft.json +1 -1
- package/.next/server/app/api/agent/new/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agent/running/route.js +1 -1
- package/.next/server/app/api/agent/running/route.js.nft.json +1 -1
- package/.next/server/app/api/agent/running/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/all-providers/route.js +1 -1
- package/.next/server/app/api/auth/all-providers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/api-key/[provider]/route.js +1 -1
- package/.next/server/app/api/auth/api-key/[provider]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/[provider]/route.js +2 -2
- package/.next/server/app/api/auth/login/[provider]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/[provider]/route.js +1 -1
- package/.next/server/app/api/auth/logout/[provider]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/providers/route.js +1 -1
- package/.next/server/app/api/auth/providers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/cwd/browse/route.js +1 -1
- package/.next/server/app/api/cwd/browse/route.js.nft.json +1 -1
- package/.next/server/app/api/cwd/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/cwd/validate/route.js +1 -1
- package/.next/server/app/api/cwd/validate/route.js.nft.json +1 -1
- package/.next/server/app/api/cwd/validate/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/default-cwd/route.js +1 -1
- package/.next/server/app/api/default-cwd/route.js.nft.json +1 -1
- package/.next/server/app/api/default-cwd/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/display-settings/route.js +1 -1
- package/.next/server/app/api/display-settings/route.js.nft.json +1 -1
- package/.next/server/app/api/display-settings/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/document-text/route.js +1 -1
- package/.next/server/app/api/document-text/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/experiments/route.js +1 -1
- package/.next/server/app/api/experiments/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/file-index/route.js +1 -1
- package/.next/server/app/api/file-index/route.js.nft.json +1 -1
- package/.next/server/app/api/file-index/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/files/[...path]/route.js +2 -2
- package/.next/server/app/api/files/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/files/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/git/diff/route.js +2 -2
- package/.next/server/app/api/git/diff/route.js.nft.json +1 -1
- package/.next/server/app/api/git/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/git/status/route.js +1 -1
- package/.next/server/app/api/git/status/route.js.nft.json +1 -1
- package/.next/server/app/api/git/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/gpt6/handles/route.js +1 -1
- package/.next/server/app/api/gpt6/handles/route.js.nft.json +1 -1
- package/.next/server/app/api/gpt6/handles/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/gpt6/mcp/route.js +1 -1
- package/.next/server/app/api/gpt6/mcp/route.js.nft.json +1 -1
- package/.next/server/app/api/gpt6/mcp/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/gpt6/reply/route.js +1 -1
- package/.next/server/app/api/gpt6/reply/route.js.nft.json +1 -1
- package/.next/server/app/api/gpt6/reply/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/gpt6/token/route.js +1 -1
- package/.next/server/app/api/gpt6/token/route.js.nft.json +1 -1
- package/.next/server/app/api/gpt6/token/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/gpt6/web6-session/route.js +1 -1
- package/.next/server/app/api/gpt6/web6-session/route.js.nft.json +1 -1
- package/.next/server/app/api/gpt6/web6-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/home/route.js +1 -1
- package/.next/server/app/api/home/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/live/call/[callId]/route.js +1 -1
- package/.next/server/app/api/live/call/[callId]/route.js.nft.json +1 -1
- package/.next/server/app/api/live/call/[callId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/live/events/route.js +2 -2
- package/.next/server/app/api/live/events/route.js.nft.json +1 -1
- package/.next/server/app/api/live/events/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/live/offer/route.js +1 -1
- package/.next/server/app/api/live/offer/route.js.nft.json +1 -1
- package/.next/server/app/api/live/offer/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/live/voices/route.js +1 -1
- package/.next/server/app/api/live/voices/route.js.nft.json +1 -1
- package/.next/server/app/api/live/voices/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/route.js +2 -2
- package/.next/server/app/api/mcp/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/model-roles/route.js +1 -1
- package/.next/server/app/api/model-roles/route.js.nft.json +1 -1
- package/.next/server/app/api/model-roles/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/models/route.js +1 -1
- package/.next/server/app/api/models/route.js.nft.json +1 -1
- package/.next/server/app/api/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/models-config/catalog/route.js +1 -1
- package/.next/server/app/api/models-config/catalog/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/models-config/discover/route.js +1 -1
- package/.next/server/app/api/models-config/discover/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/models-config/route.js +2 -2
- package/.next/server/app/api/models-config/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/models-config/test/route.js +1 -1
- package/.next/server/app/api/models-config/test/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/plugins/route.js +1 -1
- package/.next/server/app/api/plugins/route.js.nft.json +1 -1
- package/.next/server/app/api/plugins/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/project-trust/route.js +1 -1
- package/.next/server/app/api/project-trust/route.js.nft.json +1 -1
- package/.next/server/app/api/project-trust/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/projects/route.js +1 -1
- package/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/runs/[runId]/route.js +1 -1
- package/.next/server/app/api/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/runs/route.js +1 -1
- package/.next/server/app/api/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sessions/[id]/auto-name/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/auto-name/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/auto-name/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sessions/[id]/context/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/context/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/context/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sessions/[id]/entries/[entryId]/thinking/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/entries/[entryId]/thinking/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sessions/[id]/export/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/export/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sessions/[id]/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sessions/[id]/state/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/state/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/state/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sessions/route.js +1 -1
- package/.next/server/app/api/sessions/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/route.js +1 -1
- package/.next/server/app/api/settings/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sidecars/[service]/[...path]/route.js +1 -1
- package/.next/server/app/api/sidecars/[service]/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/check/route.js +1 -1
- package/.next/server/app/api/skills/check/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/install/route.js +1 -1
- package/.next/server/app/api/skills/install/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route.js +2 -2
- package/.next/server/app/api/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/search/route.js +1 -1
- package/.next/server/app/api/skills/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/update/route.js +1 -1
- package/.next/server/app/api/skills/update/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/theme/route.js +1 -1
- package/.next/server/app/api/theme/route.js.nft.json +1 -1
- package/.next/server/app/api/theme/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/update-maintenance/route.js +2 -2
- package/.next/server/app/api/update-maintenance/route.js.nft.json +1 -1
- package/.next/server/app/api/update-maintenance/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/updates/route.js +1 -1
- package/.next/server/app/api/updates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/web-access/recovery/route.js +1 -1
- package/.next/server/app/api/web-access/recovery/route.js.nft.json +1 -1
- package/.next/server/app/api/web-access/recovery/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/web-access/route.js +1 -1
- package/.next/server/app/api/web-access/route.js.nft.json +1 -1
- package/.next/server/app/api/web-access/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/web6/consults/route.js +1 -1
- package/.next/server/app/api/web6/consults/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/route.js +1 -1
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
- package/.next/server/app/favicon.ico/route.js +1 -1
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +5 -5
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +3 -3
- package/.next/server/app/index.segments/_full.segment.rsc +5 -5
- package/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/server/app/index.segments/_index.segment.rsc +3 -3
- package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/manifest.webmanifest/route.js +2 -2
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/page.js +9 -9
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/recover/page.js +2 -2
- 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 +4 -4
- package/.next/server/app/recover.segments/_full.segment.rsc +4 -4
- package/.next/server/app/recover.segments/_head.segment.rsc +1 -1
- package/.next/server/app/recover.segments/_index.segment.rsc +3 -3
- package/.next/server/app/recover.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/recover.segments/recover/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/recover.segments/recover.segment.rsc +1 -1
- package/.next/server/app-paths-manifest.json +11 -11
- package/.next/server/chunks/319.js +3 -3
- package/.next/server/chunks/3379.js +1 -1
- package/.next/server/chunks/7245.js +1 -1
- package/.next/server/chunks/9280.js +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware.js +11 -11
- 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/app/_not-found/page-d47816c8266ad10a.js +1 -0
- package/.next/static/chunks/app/{layout-95725ad1abf3cb75.js → layout-85736d5559027813.js} +1 -1
- package/.next/static/chunks/app/{page-26a4df181c1d562c.js → page-5cde6189aa974555.js} +4 -4
- package/.next/static/chunks/app/recover/page-b21a217e972ce75f.js +1 -0
- package/.next/static/chunks/{main-app-0dc38ffe862cd588.js → main-app-0af2539744a1d9c8.js} +1 -1
- package/.next/static/chunks/next/dist/client/components/builtin/global-error-5bf20286772920a7.js +1 -0
- package/.next/static/css/e55ae9b4602a1ee6.css +1 -0
- package/.next/trace +7 -8
- package/.next/trace-build +1 -1
- package/.next/types/app/api/agent/[id]/account/route.ts +1 -1
- package/.next/types/app/api/agent/[id]/bash-output/route.ts +1 -1
- package/.next/types/app/api/agent/[id]/events/route.ts +1 -1
- package/.next/types/app/api/agent/[id]/route.ts +1 -1
- package/.next/types/app/api/agent/new/route.ts +1 -1
- package/.next/types/app/api/agent/running/route.ts +1 -1
- package/.next/types/app/api/auth/all-providers/route.ts +1 -1
- package/.next/types/app/api/auth/api-key/[provider]/route.ts +1 -1
- package/.next/types/app/api/auth/login/[provider]/route.ts +1 -1
- package/.next/types/app/api/auth/logout/[provider]/route.ts +1 -1
- package/.next/types/app/api/auth/providers/route.ts +1 -1
- package/.next/types/app/api/cwd/browse/route.ts +1 -1
- package/.next/types/app/api/cwd/validate/route.ts +1 -1
- package/.next/types/app/api/default-cwd/route.ts +1 -1
- package/.next/types/app/api/display-settings/route.ts +1 -1
- package/.next/types/app/api/document-text/route.ts +1 -1
- package/.next/types/app/api/experiments/route.ts +1 -1
- package/.next/types/app/api/file-index/route.ts +1 -1
- package/.next/types/app/api/files/[...path]/route.ts +1 -1
- package/.next/types/app/api/git/diff/route.ts +1 -1
- package/.next/types/app/api/git/status/route.ts +1 -1
- package/.next/types/app/api/gpt6/handles/route.ts +1 -1
- package/.next/types/app/api/gpt6/mcp/route.ts +1 -1
- package/.next/types/app/api/gpt6/reply/route.ts +1 -1
- package/.next/types/app/api/gpt6/token/route.ts +1 -1
- package/.next/types/app/api/gpt6/web6-session/route.ts +1 -1
- package/.next/types/app/api/home/route.ts +1 -1
- package/.next/types/app/api/live/call/[callId]/route.ts +1 -1
- package/.next/types/app/api/live/events/route.ts +1 -1
- package/.next/types/app/api/live/offer/route.ts +1 -1
- package/.next/types/app/api/live/voices/route.ts +1 -1
- package/.next/types/app/api/mcp/route.ts +1 -1
- package/.next/types/app/api/model-roles/route.ts +1 -1
- package/.next/types/app/api/models/route.ts +1 -1
- package/.next/types/app/api/models-config/catalog/route.ts +1 -1
- package/.next/types/app/api/models-config/discover/route.ts +1 -1
- package/.next/types/app/api/models-config/route.ts +1 -1
- package/.next/types/app/api/models-config/test/route.ts +1 -1
- package/.next/types/app/api/plugins/route.ts +1 -1
- package/.next/types/app/api/project-trust/route.ts +1 -1
- package/.next/types/app/api/projects/route.ts +1 -1
- package/.next/types/app/api/runs/[runId]/route.ts +1 -1
- package/.next/types/app/api/runs/route.ts +1 -1
- package/.next/types/app/api/sessions/[id]/auto-name/route.ts +1 -1
- package/.next/types/app/api/sessions/[id]/context/route.ts +1 -1
- package/.next/types/app/api/sessions/[id]/entries/[entryId]/thinking/route.ts +1 -1
- package/.next/types/app/api/sessions/[id]/export/route.ts +1 -1
- package/.next/types/app/api/sessions/[id]/route.ts +1 -1
- package/.next/types/app/api/sessions/[id]/state/route.ts +1 -1
- package/.next/types/app/api/sessions/route.ts +1 -1
- package/.next/types/app/api/settings/route.ts +1 -1
- package/.next/types/app/api/sidecars/[service]/[...path]/route.ts +1 -1
- package/.next/types/app/api/skills/check/route.ts +1 -1
- package/.next/types/app/api/skills/install/route.ts +1 -1
- package/.next/types/app/api/skills/route.ts +1 -1
- package/.next/types/app/api/skills/search/route.ts +1 -1
- package/.next/types/app/api/skills/update/route.ts +1 -1
- package/.next/types/app/api/theme/route.ts +1 -1
- package/.next/types/app/api/update-maintenance/route.ts +1 -1
- package/.next/types/app/api/updates/route.ts +1 -1
- package/.next/types/app/api/web-access/recovery/route.ts +1 -1
- package/.next/types/app/api/web-access/route.ts +1 -1
- package/.next/types/app/api/web6/consults/route.ts +1 -1
- package/.next/types/app/api/worktrees/route.ts +1 -1
- package/.next/types/app/layout.ts +1 -1
- package/.next/types/app/page.ts +1 -1
- package/.next/types/app/recover/page.ts +1 -1
- package/README.md +174 -174
- package/Tools/CUELO_Setup/files/native-runtime-patch.js +349 -349
- package/Tools/OMP_Global_Config/agent/AGENTS.md +3 -3
- package/Tools/OMP_Global_Config/agent/agents/maker.md +390 -390
- package/Tools/OMP_Global_Config/agent/extensions/command-guard/matcher.ts +3 -1
- package/Tools/OMP_Global_Config/agent/extensions/jev-runtime.ts +63 -28
- package/Tools/OMP_Global_Config/agent/extensions/todo-nudge.ts +56 -56
- package/Tools/OMP_Global_Config/agent/prompt-copies/AGENTS.en.md +4 -4
- package/Tools/OMP_Global_Config/patches/apply-core-patch.mjs +5005 -5005
- package/bin/prepare-runtime.js +81 -81
- package/install.mjs +393 -393
- package/package.json +1 -1
- package/public/audio/completion/voices.json +1195 -1195
- package/public/offline.html +145 -145
- package/.next/static/chunks/app/_not-found/page-d3f2ac234e6fd3b6.js +0 -1
- package/.next/static/chunks/app/recover/page-770a1de1ff4ded56.js +0 -1
- package/.next/static/chunks/next/dist/client/components/builtin/global-error-070571d2fa580e7d.js +0 -1
- package/.next/static/css/bc8f2da9192ea16d.css +0 -1
- /package/.next/static/{MvC-CM1U-UMEzpaGIsCuQ → RnMmpk_boPQwlwbelVcs-}/_buildManifest.js +0 -0
- /package/.next/static/{MvC-CM1U-UMEzpaGIsCuQ → RnMmpk_boPQwlwbelVcs-}/_ssgManifest.js +0 -0
|
@@ -659,8 +659,10 @@ function parseGitInvocation(tokens: ShellToken[], invocation: Invocation): GitIn
|
|
|
659
659
|
};
|
|
660
660
|
}
|
|
661
661
|
|
|
662
|
+
// `~`는 단어 맨 앞이나 assignment 꼴의 `=`·`:` 뒤에서만 셸이 확장한다. 경로 중간의 literal
|
|
663
|
+
// `~`(8.3 짧은 이름 `RUNNER~1` 등)는 확장이 아니므로 저장소 판정으로 넘긴다.
|
|
662
664
|
function hasShellExpansion(value: string): boolean {
|
|
663
|
-
return /[
|
|
665
|
+
return /[$%`*?]|(?:^|[=:])~/.test(value);
|
|
664
666
|
}
|
|
665
667
|
|
|
666
668
|
function finalizerTargetDirectory(
|
|
@@ -800,12 +800,14 @@ export function createJevRuntime(deps: JevRuntimeDeps = {}) {
|
|
|
800
800
|
const settledAttempts = new Set<string>();
|
|
801
801
|
/** settle로 이미 소비한 async jobId. 채널(via)과 무관하게 중복 소비하지 않는다. */
|
|
802
802
|
const consumedJobs = new Set<string>();
|
|
803
|
-
/** 명시 REWORK 전송이 성공해 열린 재개 attempt. agentId → 그 전송 직후 관측한 정확한 새 jobId
|
|
804
|
-
const resumeByAgent = new Map<string, { attemptId: string; jobId: string }>();
|
|
803
|
+
/** 명시 REWORK 전송이 성공해 열린 재개 attempt. agentId → 그 전송 직후 관측한 정확한 새 jobId와 전송 시각. */
|
|
804
|
+
const resumeByAgent = new Map<string, { attemptId: string; jobId: string; sentAt: number }>();
|
|
805
805
|
/** 전송별 snapshot을 보존해 같은 actor로 겹친 DM도 서로의 기준선을 덮지 않는다. */
|
|
806
|
-
const preWriteJobs = new Map<string, Set<string
|
|
806
|
+
const preWriteJobs = new Map<string, { known: Set<string>; sentAt: number }>();
|
|
807
807
|
/** 성공한 REWORK receipt. 새 job이 실제 snapshot에 나타나기 전에는 attempt를 만들지 않는다. */
|
|
808
|
-
const pendingResume = new Map<string, { priorJobs: ReadonlySet<string>; sourceAttemptId: string }>();
|
|
808
|
+
const pendingResume = new Map<string, { priorJobs: ReadonlySet<string>; sourceAttemptId: string; sentAt: number }>();
|
|
809
|
+
/** 재사용 jobId로 온 재개 실행 중 이미 검수한 실행(`jobId@startTime`). 같은 실행은 채널과 무관하게 한 번만 본다. */
|
|
810
|
+
const judgedResumeRuns = new Set<string>();
|
|
809
811
|
const VERDICTS = ["accepted", "rework", "held"] as const;
|
|
810
812
|
type VerdictInput = {
|
|
811
813
|
sessionId: string; assignmentId: string; attemptId: string; verdict: string;
|
|
@@ -953,6 +955,36 @@ export function createJevRuntime(deps: JevRuntimeDeps = {}) {
|
|
|
953
955
|
else liveMakers.delete(ref.callId);
|
|
954
956
|
}
|
|
955
957
|
}
|
|
958
|
+
/**
|
|
959
|
+
* core는 task job을 `id: agentId`로 등록하고 소비된 row를 곧 evict하므로 재개(IRC wake) 실행이 같은 jobId를 다시 받는다.
|
|
960
|
+
* async-result에는 agentId도 없다. 그래서 agentId는 현재 snapshot row(id 정확 일치)에서만 읽고, 열린 REWORK receipt의
|
|
961
|
+
* 전송 시각 이후 시작된 row만 재개 실행(resumeKey)으로 본다. row가 없거나(evict) 전송 전 row면 재개가 아니다.
|
|
962
|
+
*/
|
|
963
|
+
function settledRun(job: SettledJobMeta, ctx: ExtensionContext): { agentId?: string; resumeKey?: string } {
|
|
964
|
+
const snapshot = ctx.getAsyncJobSnapshot?.();
|
|
965
|
+
const row = [...(snapshot?.running ?? []), ...(snapshot?.recent ?? [])].find((entry) => entry.id === job.jobId);
|
|
966
|
+
const agentId = job.agentId ?? row?.agentId;
|
|
967
|
+
if (!row || !agentId || row.agentId !== agentId || typeof row.startTime !== "number") return { agentId };
|
|
968
|
+
const sentAt = pendingResume.get(agentId)?.sentAt ?? resumeByAgent.get(agentId)?.sentAt;
|
|
969
|
+
return sentAt !== undefined && row.startTime >= sentAt
|
|
970
|
+
? { agentId, resumeKey: `${job.jobId}@${row.startTime}` }
|
|
971
|
+
: { agentId };
|
|
972
|
+
}
|
|
973
|
+
/** 처음 보는 jobId이거나, 재사용 jobId라도 아직 검수하지 않은 재개 실행이면 검수 대상이다. */
|
|
974
|
+
function takeUnjudged(jobs: SettledJobMeta[], ctx: ExtensionContext): SettledJobMeta[] {
|
|
975
|
+
return jobs.filter((job) => {
|
|
976
|
+
if (!judgedReviews.has(job.jobId)) {
|
|
977
|
+
judgedReviews.add(job.jobId);
|
|
978
|
+
const { resumeKey } = settledRun(job, ctx);
|
|
979
|
+
if (resumeKey) judgedResumeRuns.add(resumeKey);
|
|
980
|
+
return true;
|
|
981
|
+
}
|
|
982
|
+
const { resumeKey } = settledRun(job, ctx);
|
|
983
|
+
if (!resumeKey || judgedResumeRuns.has(resumeKey)) return false;
|
|
984
|
+
judgedResumeRuns.add(resumeKey);
|
|
985
|
+
return true;
|
|
986
|
+
});
|
|
987
|
+
}
|
|
956
988
|
async function runPreReview(
|
|
957
989
|
ctx: ExtensionContext,
|
|
958
990
|
via: "async-result" | "wait" | "read proc://",
|
|
@@ -968,15 +1000,21 @@ export function createJevRuntime(deps: JevRuntimeDeps = {}) {
|
|
|
968
1000
|
: undefined;
|
|
969
1001
|
const todoMetadata = spawned?.guard.progress;
|
|
970
1002
|
// 재개 바인딩은 그 전송 직후 관측한 정확한 새 jobId에만 소비된다. 다른 job(늦은 원 실행·stale)은 소비하지 않는다.
|
|
971
|
-
|
|
972
|
-
|
|
1003
|
+
// 이미 소비한 jobId의 재사용은 전송 뒤 시작된 snapshot row(resumeKey)일 때만 새 실행으로 본다.
|
|
1004
|
+
const run = settledRun(job, ctx);
|
|
1005
|
+
const agentId = run.agentId;
|
|
1006
|
+
const newRun = !consumedJobs.has(job.jobId) || run.resumeKey !== undefined;
|
|
1007
|
+
const binding = agentId ? resumeByAgent.get(agentId) : undefined;
|
|
1008
|
+
let resumeAttemptId = binding && binding.jobId === job.jobId && newRun ? binding.attemptId : undefined;
|
|
973
1009
|
// 늦은 이벤트 자체를 새 실행으로 간주하지 않는다. 현재 snapshot에서 확인한 유일한 새 job만 잇는다.
|
|
974
|
-
if (!resumeAttemptId &&
|
|
975
|
-
const pending = pendingResume.get(
|
|
1010
|
+
if (!resumeAttemptId && agentId && !spawned?.identity && newRun) {
|
|
1011
|
+
const pending = pendingResume.get(agentId);
|
|
976
1012
|
const source = pending ? observedAttempts.get(pending.sourceAttemptId) : undefined;
|
|
977
1013
|
const snapshot = pending ? ctx.getAsyncJobSnapshot?.() : undefined;
|
|
978
1014
|
const candidates = new Set([...(snapshot?.running ?? []), ...(snapshot?.recent ?? [])]
|
|
979
|
-
.filter((entry) => entry.agentId ===
|
|
1015
|
+
.filter((entry) => entry.agentId === agentId && (
|
|
1016
|
+
(typeof entry.startTime === "number" && entry.startTime >= pending!.sentAt)
|
|
1017
|
+
|| (!pending!.priorJobs.has(entry.id) && !consumedJobs.has(entry.id))))
|
|
980
1018
|
.map((entry) => entry.id));
|
|
981
1019
|
if (pending && source && candidates.size === 1 && candidates.has(job.jobId)) {
|
|
982
1020
|
const attempt = source.attempt + 1;
|
|
@@ -985,7 +1023,7 @@ export function createJevRuntime(deps: JevRuntimeDeps = {}) {
|
|
|
985
1023
|
assignmentId: source.assignmentId,
|
|
986
1024
|
attempt,
|
|
987
1025
|
attemptId: `${source.assignmentId}#a${attempt}`,
|
|
988
|
-
agentId
|
|
1026
|
+
agentId,
|
|
989
1027
|
jobId: job.jobId,
|
|
990
1028
|
};
|
|
991
1029
|
const sourceDispatch = baseLedger.read()
|
|
@@ -1007,20 +1045,20 @@ export function createJevRuntime(deps: JevRuntimeDeps = {}) {
|
|
|
1007
1045
|
purpose: sourceDispatch?.purpose ?? null,
|
|
1008
1046
|
});
|
|
1009
1047
|
observedAttempts.set(identity.attemptId, { ...identity, name: source.name, status: "running" });
|
|
1010
|
-
pendingResume.delete(
|
|
1048
|
+
pendingResume.delete(agentId);
|
|
1011
1049
|
resumeAttemptId = identity.attemptId;
|
|
1012
1050
|
}
|
|
1013
1051
|
}
|
|
1014
1052
|
// session_start에서 복원한 in-flight dispatch도 실제 jobId·agentId로 정산한다.
|
|
1015
1053
|
const identity = resumeAttemptId ? observedAttempts.get(resumeAttemptId)
|
|
1016
1054
|
: spawned?.identity ?? [...observedAttempts.values()].find((entry) =>
|
|
1017
|
-
entry.status === "running" && entry.jobId === job.jobId && entry.agentId ===
|
|
1055
|
+
entry.status === "running" && entry.jobId === job.jobId && entry.agentId === agentId);
|
|
1018
1056
|
// 채널과 무관하게 이미 소비한 jobId는 다시 처리하지 않고, 같은 attempt도 한 번만 소비한다.
|
|
1019
|
-
if (identity && !consumedJobs.has(job.jobId) && !settledAttempts.has(identity.attemptId)
|
|
1057
|
+
if (identity && (!consumedJobs.has(job.jobId) || resumeAttemptId !== undefined) && !settledAttempts.has(identity.attemptId)
|
|
1020
1058
|
&& (spawned?.agent === undefined || spawned.agent === "maker")) {
|
|
1021
1059
|
consumedJobs.add(job.jobId);
|
|
1022
1060
|
settledAttempts.add(identity.attemptId);
|
|
1023
|
-
if (resumeAttemptId &&
|
|
1061
|
+
if (resumeAttemptId && agentId) resumeByAgent.delete(agentId);
|
|
1024
1062
|
const status: OutcomeRecord["status"] = job.status === "cancelled" ? "cancelled" : job.hasError ? "failed" : "completed";
|
|
1025
1063
|
baseLedger.append({
|
|
1026
1064
|
type: "outcome",
|
|
@@ -1160,6 +1198,7 @@ export function createJevRuntime(deps: JevRuntimeDeps = {}) {
|
|
|
1160
1198
|
knownMakers.clear();
|
|
1161
1199
|
routing.reset();
|
|
1162
1200
|
judgedReviews.clear();
|
|
1201
|
+
judgedResumeRuns.clear();
|
|
1163
1202
|
advisedOwnerMessages.clear();
|
|
1164
1203
|
advisedMissingVerdicts.clear();
|
|
1165
1204
|
pendingCheckpoints.clear();
|
|
@@ -1211,11 +1250,8 @@ export function createJevRuntime(deps: JevRuntimeDeps = {}) {
|
|
|
1211
1250
|
// pre-review: async-result 자동 전달이 Main에 도착하는 가장 이른 경계.
|
|
1212
1251
|
// async-result는 attribution:"agent"로 오므로 attribution 필터보다 먼저 본다.
|
|
1213
1252
|
if (message.role !== "custom" || message.customType !== "async-result") return;
|
|
1214
|
-
const settled = readSettledTaskJobs(message.details, message.content)
|
|
1215
|
-
(job) => !judgedReviews.has(job.jobId),
|
|
1216
|
-
);
|
|
1253
|
+
const settled = takeUnjudged(readSettledTaskJobs(message.details, message.content), ctx);
|
|
1217
1254
|
if (settled.length === 0) return;
|
|
1218
|
-
for (const job of settled) judgedReviews.add(job.jobId);
|
|
1219
1255
|
await runPreReview(
|
|
1220
1256
|
ctx,
|
|
1221
1257
|
"async-result",
|
|
@@ -1275,7 +1311,7 @@ export function createJevRuntime(deps: JevRuntimeDeps = {}) {
|
|
|
1275
1311
|
for (const entry of observedAttempts.values()) {
|
|
1276
1312
|
if (entry.agentId === target && entry.jobId) known.add(entry.jobId);
|
|
1277
1313
|
}
|
|
1278
|
-
preWriteJobs.set(event.toolCallId, known);
|
|
1314
|
+
preWriteJobs.set(event.toolCallId, { known, sentAt: Date.now() });
|
|
1279
1315
|
}
|
|
1280
1316
|
// canonical child id가 agent:// 대상이다. 표시용 task name으로 판정 대상을 추측하지 않는다.
|
|
1281
1317
|
const owner = target ? knownMakerForTarget(target) : undefined;
|
|
@@ -1373,12 +1409,14 @@ export function createJevRuntime(deps: JevRuntimeDeps = {}) {
|
|
|
1373
1409
|
if (targetAgentId && previous && /(?:^|\n)\s*REWORK\s+task_id=\S+/i.test(message)
|
|
1374
1410
|
&& previous.status !== "running" && !resumeByAgent.has(targetAgentId) && !pendingResume.has(targetAgentId) && beforeWrite) {
|
|
1375
1411
|
// 성공 receipt와 전송 전 snapshot이 있는 경우에만 실제 새 job을 바인딩한다.
|
|
1376
|
-
const prior = beforeWrite;
|
|
1412
|
+
const { known: prior, sentAt } = beforeWrite;
|
|
1377
1413
|
const snapshot = ctx.getAsyncJobSnapshot?.();
|
|
1378
1414
|
const fresh = [...new Set([...(snapshot?.running ?? []), ...(snapshot?.recent ?? [])]
|
|
1379
1415
|
.flatMap((job) => {
|
|
1380
|
-
const record = job as { id?: unknown; agentId?: unknown };
|
|
1381
|
-
if (typeof record.id !== "string" || !record.id
|
|
1416
|
+
const record = job as { id?: unknown; agentId?: unknown; startTime?: unknown };
|
|
1417
|
+
if (typeof record.id !== "string" || !record.id) return [];
|
|
1418
|
+
// 전송 전 집합의 id라도 전송 뒤 시작된 row면 같은 id를 재사용한 새 실행이다.
|
|
1419
|
+
if (prior.has(record.id) && !(typeof record.startTime === "number" && record.startTime >= sentAt)) return [];
|
|
1382
1420
|
// 관측된 canonical agentId가 정확히 같은 job만 후보다. agentId 없는 낯선 job은 승격하지 않는다.
|
|
1383
1421
|
if (record.agentId !== targetAgentId) return [];
|
|
1384
1422
|
return [record.id];
|
|
@@ -1414,7 +1452,7 @@ export function createJevRuntime(deps: JevRuntimeDeps = {}) {
|
|
|
1414
1452
|
});
|
|
1415
1453
|
observedAttempts.set(identity.attemptId, { ...identity, name: previous.name, status: "running" });
|
|
1416
1454
|
// 바인딩에 전송 직후 관측한 정확한 새 jobId를 둔다. 다른 job이 먼저 정산돼도 이 attempt를 소비하지 않는다.
|
|
1417
|
-
resumeByAgent.set(targetAgentId, { attemptId: identity.attemptId, jobId: fresh[0]
|
|
1455
|
+
resumeByAgent.set(targetAgentId, { attemptId: identity.attemptId, jobId: fresh[0]!, sentAt });
|
|
1418
1456
|
sendAdvisory(
|
|
1419
1457
|
"rework-attempt",
|
|
1420
1458
|
renderAdvisory(
|
|
@@ -1426,7 +1464,7 @@ export function createJevRuntime(deps: JevRuntimeDeps = {}) {
|
|
|
1426
1464
|
);
|
|
1427
1465
|
} else if (fresh.length === 0) {
|
|
1428
1466
|
// 새 job이 아직 스냅샷에 없다. 성공 receipt를 보관하고 다음 기존 관측(settle)에서 실제 새 job을 묶는다.
|
|
1429
|
-
pendingResume.set(targetAgentId, { priorJobs: prior, sourceAttemptId: previous.attemptId });
|
|
1467
|
+
pendingResume.set(targetAgentId, { priorJobs: prior, sourceAttemptId: previous.attemptId, sentAt });
|
|
1430
1468
|
}
|
|
1431
1469
|
}
|
|
1432
1470
|
}
|
|
@@ -1549,11 +1587,8 @@ export function createJevRuntime(deps: JevRuntimeDeps = {}) {
|
|
|
1549
1587
|
} else {
|
|
1550
1588
|
return;
|
|
1551
1589
|
}
|
|
1552
|
-
const settled = readSettledTaskJobs(jobDetails, event.content)
|
|
1553
|
-
(job) => !judgedReviews.has(job.jobId),
|
|
1554
|
-
);
|
|
1590
|
+
const settled = takeUnjudged(readSettledTaskJobs(jobDetails, event.content), ctx);
|
|
1555
1591
|
if (settled.length === 0) return;
|
|
1556
|
-
for (const job of settled) judgedReviews.add(job.jobId);
|
|
1557
1592
|
await runPreReview(
|
|
1558
1593
|
ctx,
|
|
1559
1594
|
via,
|
|
@@ -1,56 +1,56 @@
|
|
|
1
|
-
import type { ExtensionAPI } from "@oh-my-pi/pi-coding-agent";
|
|
2
|
-
import { readPersistedTodoProgress, readTodoSnapshot, type TodoSnapshotItem } from "./lib/task-progress";
|
|
3
|
-
|
|
4
|
-
// 여러 단계 요청에서 Main 이 todo 없이 도구만 이어 부르면 한 번 안내한다(2026-09-26: GPT 계열은 todo 를
|
|
5
|
-
// 잘 쓰는데 Claude Main 은 생략하는 일이 잦아, 사용자가 화면에서 Main 이 무엇을 하는지 알 수 없었다).
|
|
6
|
-
// 도구는 막지 않고, 사용자 직접 입력이 있을 때만 켜지므로 그런 입력을 받지 않는 child 세션에는 개입하지 않는다.
|
|
7
|
-
|
|
8
|
-
/** todo 없이 이만큼 도구를 부르면 3단계 이상 작업으로 본다(AGENTS 「3단계 이상이면 todo」와 같은 기준). */
|
|
9
|
-
const TOOL_CALLS_BEFORE_NUDGE = 3;
|
|
10
|
-
|
|
11
|
-
const REMINDER =
|
|
12
|
-
"이번 사용자 요청에서 todo 목록 없이 도구를 여러 번 이어 부르고 있다. 사용자는 todo 목록으로 지금 무엇을 하는지 본다. 3단계 이상이거나 사용자가 여러 항목을 요청한 작업이면 지금 todo 를 init 해서 요청 항목을 빠짐없이 나누고, 진행에 맞춰 상태를 갱신하며 이어 가라. 조회 한두 번으로 끝나는 일이면 이 안내는 무시한다.";
|
|
13
|
-
|
|
14
|
-
const isActive = (items: readonly TodoSnapshotItem[]) =>
|
|
15
|
-
items.some((item) => item.status === "pending" || item.status === "in_progress");
|
|
16
|
-
|
|
17
|
-
export default function todoNudge(pi: ExtensionAPI): void {
|
|
18
|
-
let armed = false;
|
|
19
|
-
let usedTodo = false;
|
|
20
|
-
let nudged = false;
|
|
21
|
-
let calls = 0;
|
|
22
|
-
let todos: readonly TodoSnapshotItem[] = [];
|
|
23
|
-
|
|
24
|
-
pi.on("session_start", (_event, ctx) => {
|
|
25
|
-
armed = false;
|
|
26
|
-
todos = readPersistedTodoProgress(ctx.sessionManager.getBranch()).currentTodos;
|
|
27
|
-
});
|
|
28
|
-
pi.on("input", (event) => {
|
|
29
|
-
if (event.source !== "interactive" && event.source !== "rpc") return;
|
|
30
|
-
armed = true;
|
|
31
|
-
usedTodo = false;
|
|
32
|
-
nudged = false;
|
|
33
|
-
calls = 0;
|
|
34
|
-
});
|
|
35
|
-
pi.on("tool_result", (event) => {
|
|
36
|
-
if (event.toolName !== "todo" || event.isError) return;
|
|
37
|
-
const snapshot = readTodoSnapshot(event.details);
|
|
38
|
-
if (snapshot) todos = snapshot;
|
|
39
|
-
});
|
|
40
|
-
pi.on("tool_call", (event) => {
|
|
41
|
-
if (!armed || nudged || usedTodo) return;
|
|
42
|
-
if (event.toolName === "todo") {
|
|
43
|
-
usedTodo = true;
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
// 이전 요청의 진행 중 목록이 있으면 이미 추적 중이다. 끼어든 짧은 지시마다 새 목록을 강요하지 않는다.
|
|
47
|
-
if (isActive(todos)) return;
|
|
48
|
-
calls += 1;
|
|
49
|
-
if (calls < TOOL_CALLS_BEFORE_NUDGE) return;
|
|
50
|
-
nudged = true;
|
|
51
|
-
pi.sendMessage(
|
|
52
|
-
{ customType: "todo-nudge", content: REMINDER, display: false, attribution: "agent" },
|
|
53
|
-
{ deliverAs: "aside" },
|
|
54
|
-
);
|
|
55
|
-
});
|
|
56
|
-
}
|
|
1
|
+
import type { ExtensionAPI } from "@oh-my-pi/pi-coding-agent";
|
|
2
|
+
import { readPersistedTodoProgress, readTodoSnapshot, type TodoSnapshotItem } from "./lib/task-progress";
|
|
3
|
+
|
|
4
|
+
// 여러 단계 요청에서 Main 이 todo 없이 도구만 이어 부르면 한 번 안내한다(2026-09-26: GPT 계열은 todo 를
|
|
5
|
+
// 잘 쓰는데 Claude Main 은 생략하는 일이 잦아, 사용자가 화면에서 Main 이 무엇을 하는지 알 수 없었다).
|
|
6
|
+
// 도구는 막지 않고, 사용자 직접 입력이 있을 때만 켜지므로 그런 입력을 받지 않는 child 세션에는 개입하지 않는다.
|
|
7
|
+
|
|
8
|
+
/** todo 없이 이만큼 도구를 부르면 3단계 이상 작업으로 본다(AGENTS 「3단계 이상이면 todo」와 같은 기준). */
|
|
9
|
+
const TOOL_CALLS_BEFORE_NUDGE = 3;
|
|
10
|
+
|
|
11
|
+
const REMINDER =
|
|
12
|
+
"이번 사용자 요청에서 todo 목록 없이 도구를 여러 번 이어 부르고 있다. 사용자는 todo 목록으로 지금 무엇을 하는지 본다. 3단계 이상이거나 사용자가 여러 항목을 요청한 작업이면 지금 todo 를 init 해서 요청 항목을 빠짐없이 나누고, 진행에 맞춰 상태를 갱신하며 이어 가라. 조회 한두 번으로 끝나는 일이면 이 안내는 무시한다.";
|
|
13
|
+
|
|
14
|
+
const isActive = (items: readonly TodoSnapshotItem[]) =>
|
|
15
|
+
items.some((item) => item.status === "pending" || item.status === "in_progress");
|
|
16
|
+
|
|
17
|
+
export default function todoNudge(pi: ExtensionAPI): void {
|
|
18
|
+
let armed = false;
|
|
19
|
+
let usedTodo = false;
|
|
20
|
+
let nudged = false;
|
|
21
|
+
let calls = 0;
|
|
22
|
+
let todos: readonly TodoSnapshotItem[] = [];
|
|
23
|
+
|
|
24
|
+
pi.on("session_start", (_event, ctx) => {
|
|
25
|
+
armed = false;
|
|
26
|
+
todos = readPersistedTodoProgress(ctx.sessionManager.getBranch()).currentTodos;
|
|
27
|
+
});
|
|
28
|
+
pi.on("input", (event) => {
|
|
29
|
+
if (event.source !== "interactive" && event.source !== "rpc") return;
|
|
30
|
+
armed = true;
|
|
31
|
+
usedTodo = false;
|
|
32
|
+
nudged = false;
|
|
33
|
+
calls = 0;
|
|
34
|
+
});
|
|
35
|
+
pi.on("tool_result", (event) => {
|
|
36
|
+
if (event.toolName !== "todo" || event.isError) return;
|
|
37
|
+
const snapshot = readTodoSnapshot(event.details);
|
|
38
|
+
if (snapshot) todos = snapshot;
|
|
39
|
+
});
|
|
40
|
+
pi.on("tool_call", (event) => {
|
|
41
|
+
if (!armed || nudged || usedTodo) return;
|
|
42
|
+
if (event.toolName === "todo") {
|
|
43
|
+
usedTodo = true;
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
// 이전 요청의 진행 중 목록이 있으면 이미 추적 중이다. 끼어든 짧은 지시마다 새 목록을 강요하지 않는다.
|
|
47
|
+
if (isActive(todos)) return;
|
|
48
|
+
calls += 1;
|
|
49
|
+
if (calls < TOOL_CALLS_BEFORE_NUDGE) return;
|
|
50
|
+
nudged = true;
|
|
51
|
+
pi.sendMessage(
|
|
52
|
+
{ customType: "todo-nudge", content: REMINDER, display: false, attribution: "agent" },
|
|
53
|
+
{ deliverAs: "aside" },
|
|
54
|
+
);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<!-- source-fingerprint:
|
|
1
|
+
<!-- source-fingerprint: 13a662daf067abc8 -->
|
|
2
2
|
# Global Agent Instructions
|
|
3
3
|
|
|
4
4
|
(Model-facing English copy of the Korean source `AGENTS.md`. All user-facing prose stays Korean.)
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
This section overrides every rule and Skill. For any user message or interjection, **reply briefly in that same turn first**, then continue with investigation, tools, delegation, or verification. Never delay the answer to wait for complete results; on a change of direction, state progress in one line and follow the new instruction. Keep the selected character voice not only in the first reply but in tool narration, failures, risks, unverified items, progress, and the final answer. Unless the user asked about procedure, do not list roles, providers, or investigation order as a kickoff report, and do not turn verification/evidence/status contracts into a routine answer format. State facts, risks, and uncertainty precisely; preserve code, commands, paths, APIs, and raw errors.
|
|
9
9
|
|
|
10
|
-
Keep the user oriented during long turns where you chain tools alone. **When you find a cause, when a check passes or fails, and when you move to the next step**, first write that fact and the next action in one or two sentences, then call the next tool. Never chain tool calls with no prose in between. When relaying a child report you did not verify, say it is unverified.
|
|
10
|
+
Keep the user oriented during long turns where you chain tools alone. **When you find a cause, when a check passes or fails, and when you move to the next step**, first write that fact and the next action in one or two sentences, then call the next tool. Never chain tool calls with no prose in between. When relaying a child report you did not verify, say it is unverified. Write everything addressed to the user (immediate replies, progress, results) as visible response text, never inside reasoning/thinking: sentences inside thinking never reach the user's screen or the session record.
|
|
11
11
|
|
|
12
12
|
**Observe only at the four moments below, and then completely. With no live child, background job, or `bash` `name` service, this does not apply.**
|
|
13
13
|
|
|
@@ -90,8 +90,8 @@ Alias + `교체` switches the current Main session; alias + `호출`·`불러`·
|
|
|
90
90
|
|---|---|---|---|
|
|
91
91
|
|**YUKI(유키)**|`openai-codex/gpt-6-astra`|task child on this model|switch current session only|
|
|
92
92
|
|**ISANA(이사나)**|`b-ai/deepseek-v4.1-flash`|task child on this model|switch current session only|
|
|
93
|
-
|**RIN(린)**|`anthropic/claude-opus-5-5`,
|
|
94
|
-
|**MIO(미오)**|`anthropic/claude-opus-5-5`,
|
|
93
|
+
|**RIN(린)**|`anthropic/claude-opus-5-5`, OAuth position `0`|task child pinned to position 0|pin position 0, then switch current session|
|
|
94
|
+
|**MIO(미오)**|`anthropic/claude-opus-5-5`, OAuth position `1`|task child pinned to position 1|pin position 1, then switch current session|
|
|
95
95
|
|**NOVA(노바)**|`opencode-go/muse-spark-1.3-contributor`|task child on this model|switch current session only|
|
|
96
96
|
|**SHION(시온)**|`web6/gpt-6-pro`|`rule://web6-consult` consult (not a child)|forbidden|
|
|
97
97
|
|