commandmate 0.41.1 → 0.42.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-build-manifest.json +134 -134
- package/.next/app-path-routes-manifest.json +24 -24
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +9 -9
- package/.next/required-server-files.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/update/route.js +1 -1
- package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/versions/route.js +1 -1
- package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route.js +1 -1
- package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/capabilities/route.js +1 -1
- package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js +1 -1
- package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/claude-done/route.js +2 -2
- package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js +1 -1
- package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
- package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/relays/route.js +1 -1
- package/.next/server/app/api/relays/route.js.nft.json +1 -1
- package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js +1 -1
- package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js +1 -1
- package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/route.js +1 -1
- package/.next/server/app/api/repositories/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js +1 -1
- package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js +1 -1
- package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
- package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js +1 -1
- package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/slash-commands/route.js.nft.json +1 -1
- package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/route.js +103 -1
- package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js +103 -1
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +1 -103
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tasks/route.js +2 -2
- package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -103
- package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
- package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/worktrees/apply-default-agents/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/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/more/page_client-reference-manifest.js +1 -1
- package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
- package/.next/server/app/review/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +9 -9
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +24 -24
- package/.next/server/chunks/1068.js +1 -0
- package/.next/server/chunks/1210.js +1 -1
- package/.next/server/chunks/1501.js +5 -5
- package/.next/server/chunks/1990.js +103 -0
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2404.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/3241.js +1 -1
- package/.next/server/chunks/3707.js +1 -1
- package/.next/server/chunks/3718.js +1 -0
- package/.next/server/chunks/434.js +1 -1
- package/.next/server/chunks/4443.js +1 -1
- package/.next/server/chunks/5164.js +1 -1
- package/.next/server/chunks/5775.js +1 -0
- package/.next/server/chunks/611.js +1 -0
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/650.js +1 -1
- package/.next/server/chunks/6781.js +1 -1
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8581.js +1 -1
- package/.next/server/chunks/8583.js +1 -1
- package/.next/server/chunks/8673.js +2 -2
- package/.next/server/chunks/8728.js +3 -3
- package/.next/server/chunks/8791.js +1 -0
- package/.next/server/chunks/8800.js +1 -1
- package/.next/server/chunks/8918.js +1 -103
- package/.next/server/chunks/9130.js +2 -2
- package/.next/server/chunks/964.js +1 -1
- package/.next/server/chunks/9731.js +3 -3
- package/.next/server/chunks/9882.js +3 -3
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{2407-7bd75de2f6be3692.js → 2407-21fbf12d753b8d4d.js} +1 -1
- package/.next/static/chunks/7705-2a2936551b0cf9a3.js +1 -0
- package/.next/static/chunks/8165-934ee7ff3b4ddfd4.js +1 -0
- package/.next/static/chunks/app/{layout-51fa91ea833c97fc.js → layout-8ff4c7c08ef1f621.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/page-3c946bd2875391fd.js +1 -0
- package/.next/static/css/{974314e796232f53.css → b3f433d52b8ed5c8.css} +1 -1
- package/.next/trace +13 -13
- package/dist/cli/commands/attach.d.ts +6 -4
- package/dist/cli/commands/attach.d.ts.map +1 -1
- package/dist/cli/commands/attach.js +36 -5
- package/dist/cli/commands/instances.d.ts.map +1 -1
- package/dist/cli/commands/instances.js +5 -0
- package/dist/cli/commands/ls.d.ts.map +1 -1
- package/dist/cli/commands/ls.js +19 -9
- package/dist/cli/commands/whoami.d.ts +9 -25
- package/dist/cli/commands/whoami.d.ts.map +1 -1
- package/dist/cli/commands/whoami.js +18 -42
- package/dist/cli/types/api-responses.d.ts +37 -0
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/lib/cli-tools/session-name.d.ts +72 -4
- package/dist/lib/cli-tools/session-name.d.ts.map +1 -1
- package/dist/lib/cli-tools/session-name.js +115 -12
- package/dist/lib/detection/tools/verified-against.d.ts +11 -2
- package/dist/lib/detection/tools/verified-against.d.ts.map +1 -1
- package/dist/lib/detection/tools/verified-against.js +11 -2
- package/dist/lib/session/tmux-session-surface.d.ts +9 -7
- package/dist/lib/session/tmux-session-surface.d.ts.map +1 -1
- package/dist/lib/session/tmux-session-surface.js +15 -8
- package/dist/lib/tmux/legacy-session-alias.d.ts +43 -0
- package/dist/lib/tmux/legacy-session-alias.d.ts.map +1 -0
- package/dist/lib/tmux/legacy-session-alias.js +64 -0
- package/dist/lib/verification/verify-config.d.ts +21 -0
- package/dist/lib/verification/verify-config.d.ts.map +1 -1
- package/dist/lib/verification/verify-config.js +54 -1
- package/dist/server/locales/en/worktree.json +60 -17
- package/dist/server/locales/ja/worktree.json +63 -20
- package/dist/server/server.js +29 -0
- package/dist/server/src/lib/auto-yes-poller.js +15 -0
- package/dist/server/src/lib/cli-tools/antigravity.js +1 -1
- package/dist/server/src/lib/cli-tools/base.js +10 -1
- package/dist/server/src/lib/cli-tools/codex.js +1 -1
- package/dist/server/src/lib/cli-tools/command-code.js +1 -1
- package/dist/server/src/lib/cli-tools/copilot.js +1 -1
- package/dist/server/src/lib/cli-tools/gemini.js +1 -1
- package/dist/server/src/lib/cli-tools/legacy-session-adoption.js +19 -0
- package/dist/server/src/lib/cli-tools/opencode.js +1 -1
- package/dist/server/src/lib/cli-tools/session-name.js +115 -12
- package/dist/server/src/lib/cli-tools/session-namespace.js +55 -0
- package/dist/server/src/lib/cli-tools/session-ownership.js +21 -0
- package/dist/server/src/lib/cli-tools/vibe-local.js +1 -1
- package/dist/server/src/lib/cli-tools/worktree-session-ownership.js +28 -0
- package/dist/server/src/lib/db/app-settings-db.js +29 -0
- package/dist/server/src/lib/detection/cli-patterns.js +51 -10
- package/dist/server/src/lib/detection/tools/codex/cli-patterns.js +8 -2
- package/dist/server/src/lib/detection/tools/codex/detect.js +8 -1
- package/dist/server/src/lib/detection/tools/codex/prompt.js +6 -2
- package/dist/server/src/lib/detection/tools/verified-against.js +11 -2
- package/dist/server/src/lib/hooks/sources/codex/hooks-config.js +77 -2
- package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +77 -1
- package/dist/server/src/lib/realtime/terminal-broadcast.js +11 -0
- package/dist/server/src/lib/session/adopt-legacy-sessions.js +89 -0
- package/dist/server/src/lib/session/claude-session.js +13 -10
- package/dist/server/src/lib/session/current-output-builder.js +18 -0
- package/dist/server/src/lib/session/send-user-message.js +26 -0
- package/dist/server/src/lib/session/session-instance-targets.js +53 -0
- package/dist/server/src/lib/session/tmux-session-surface.js +15 -8
- package/dist/server/src/lib/session/worktree-session-reconcile.js +101 -56
- package/dist/server/src/lib/session-cleanup.js +33 -3
- package/dist/server/src/lib/tmux/legacy-session-alias.js +64 -0
- package/dist/server/src/lib/tmux/session-hook-scripts.js +12 -4
- package/dist/server/src/lib/tmux/session-ownership.js +174 -0
- package/dist/server/src/lib/tmux/tmux.js +13 -3
- package/dist/server/src/lib/verification/env-clean-gate.js +46 -14
- package/dist/server/src/lib/verification/gate-runner.js +1 -0
- package/dist/server/src/lib/verification/verify-config.js +54 -1
- package/dist/server/src/lib/ws-server.js +11 -0
- package/package.json +1 -1
- package/release-notes/0.42.0.json +62 -0
- package/release-notes/0.42.1.json +16 -0
- package/.next/server/chunks/3323.js +0 -1
- package/.next/server/chunks/7075.js +0 -1
- package/.next/server/chunks/9080.js +0 -1
- package/.next/static/chunks/7705-25076b57224da370.js +0 -1
- package/.next/static/chunks/8165-d3b7c8a7aa776bc7.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-1e6300dd50cd9a4d.js +0 -1
- /package/.next/static/{_fBjTkjoWfOqdjl2SeMIN → 3M_S0B7dhEDdVE2XSJz1Y}/_buildManifest.js +0 -0
- /package/.next/static/{_fBjTkjoWfOqdjl2SeMIN → 3M_S0B7dhEDdVE2XSJz1Y}/_ssgManifest.js +0 -0
|
@@ -85,10 +85,13 @@ function resolveRequireEnvClean(contract, config) {
|
|
|
85
85
|
sources.push(exports.REQUIRE_ENV_CLEAN_SOURCE_CONTRACT);
|
|
86
86
|
return { required: sources.length > 0, sources };
|
|
87
87
|
}
|
|
88
|
-
/** CLI tool ids, longest first: `vibe-local` must not be stripped as `vibe`. */
|
|
89
|
-
const CLI_PREFIXES = [...types_1.CLI_TOOL_IDS].sort((a, b) => b.length - a.length);
|
|
90
88
|
/**
|
|
91
|
-
* Attribute an `mcbd
|
|
89
|
+
* Attribute an `mcbd-[<ns>-]<cli>-<worktreeId>[-suffix]` session name to a
|
|
90
|
+
* worktree.
|
|
91
|
+
*
|
|
92
|
+
* The namespace (Issue #2866) is not consulted: the worktree ID is what ties a
|
|
93
|
+
* session to this task, and a session this task's agent started in any
|
|
94
|
+
* server's namespace is still this task's addition.
|
|
92
95
|
*
|
|
93
96
|
* Ambiguity resolves towards `self` on purpose. Worktree ids may contain
|
|
94
97
|
* hyphens, so `mcbd-claude-foo-bar` is genuinely ambiguous between worktree
|
|
@@ -97,13 +100,10 @@ const CLI_PREFIXES = [...types_1.CLI_TOOL_IDS].sort((a, b) => b.length - a.lengt
|
|
|
97
100
|
* rather than a missed leak.
|
|
98
101
|
*/
|
|
99
102
|
function attributeSessionName(name, worktreeId) {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
const rest = name.slice(env_snapshot_1.MCBD_SESSION_PREFIX.length);
|
|
103
|
-
const cli = CLI_PREFIXES.find((id) => rest.startsWith(`${id}-`));
|
|
104
|
-
if (!cli)
|
|
103
|
+
const parsed = (0, session_name_1.parseSessionName)(name);
|
|
104
|
+
if (!parsed)
|
|
105
105
|
return 'unattributed';
|
|
106
|
-
const tail = rest
|
|
106
|
+
const tail = parsed.rest;
|
|
107
107
|
if (tail === worktreeId || tail.startsWith(`${worktreeId}-`))
|
|
108
108
|
return 'self';
|
|
109
109
|
return 'other';
|
|
@@ -191,8 +191,9 @@ function toChange(entry, owner) {
|
|
|
191
191
|
* as an empty set — would report every entry as added or removed, which is worse
|
|
192
192
|
* than useless, and treating it as equal would be the fail-open.
|
|
193
193
|
*/
|
|
194
|
-
function diffEnvSnapshots(baseline, final, context) {
|
|
194
|
+
function diffEnvSnapshots(baseline, final, context, options = {}) {
|
|
195
195
|
const taskSession = readTaskSession(baseline);
|
|
196
|
+
const ignoredHomeEntries = new Set(options.ignoreHomeEntries ?? []);
|
|
196
197
|
const probes = env_snapshot_1.ENV_PROBE_IDS.map((probeId) => {
|
|
197
198
|
const before = baseline.probes[probeId];
|
|
198
199
|
const after = final.probes[probeId];
|
|
@@ -205,6 +206,7 @@ function diffEnvSnapshots(baseline, final, context) {
|
|
|
205
206
|
ignoredAdded: [],
|
|
206
207
|
taskSessionAdded: [],
|
|
207
208
|
removed: [],
|
|
209
|
+
ignoredByConfig: [],
|
|
208
210
|
};
|
|
209
211
|
}
|
|
210
212
|
if (!after || after.status !== 'ok') {
|
|
@@ -216,17 +218,26 @@ function diffEnvSnapshots(baseline, final, context) {
|
|
|
216
218
|
ignoredAdded: [],
|
|
217
219
|
taskSessionAdded: [],
|
|
218
220
|
removed: [],
|
|
221
|
+
ignoredByConfig: [],
|
|
219
222
|
};
|
|
220
223
|
}
|
|
221
224
|
const beforeKeys = new Set(before.entries.map((entry) => entry.key));
|
|
222
225
|
const afterKeys = new Set(after.entries.map((entry) => entry.key));
|
|
226
|
+
// Only `home-entries`, and only by the whole name: the same string under
|
|
227
|
+
// `~/.commandmate` is a different directory and stays counted.
|
|
228
|
+
const isIgnoredByConfig = (entry) => probeId === 'home-entries' && ignoredHomeEntries.has(entry.key);
|
|
223
229
|
const added = [];
|
|
224
230
|
const ignoredAdded = [];
|
|
225
231
|
const taskSessionAdded = [];
|
|
232
|
+
const ignoredByConfig = [];
|
|
226
233
|
for (const entry of after.entries) {
|
|
227
234
|
if (beforeKeys.has(entry.key))
|
|
228
235
|
continue;
|
|
229
236
|
const owner = attributeEntry(probeId, entry, context);
|
|
237
|
+
if (isIgnoredByConfig(entry)) {
|
|
238
|
+
ignoredByConfig.push(toChange(entry, owner));
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
230
241
|
if (probeId === 'tmux-sessions' && taskSession && entry.key === taskSession) {
|
|
231
242
|
// Additions only: a task session that existed at task start and is gone
|
|
232
243
|
// falls through to `removed` below like everything else (#1624).
|
|
@@ -235,9 +246,13 @@ function diffEnvSnapshots(baseline, final, context) {
|
|
|
235
246
|
}
|
|
236
247
|
(owner === 'other' ? ignoredAdded : added).push(toChange(entry, owner));
|
|
237
248
|
}
|
|
238
|
-
const removed =
|
|
239
|
-
|
|
240
|
-
|
|
249
|
+
const removed = [];
|
|
250
|
+
for (const entry of before.entries) {
|
|
251
|
+
if (afterKeys.has(entry.key))
|
|
252
|
+
continue;
|
|
253
|
+
const change = toChange(entry, attributeEntry(probeId, entry, context));
|
|
254
|
+
(isIgnoredByConfig(entry) ? ignoredByConfig : removed).push(change);
|
|
255
|
+
}
|
|
241
256
|
return {
|
|
242
257
|
probeId,
|
|
243
258
|
status: added.length + removed.length > 0 ? 'violated' : 'clean',
|
|
@@ -246,6 +261,7 @@ function diffEnvSnapshots(baseline, final, context) {
|
|
|
246
261
|
ignoredAdded,
|
|
247
262
|
taskSessionAdded,
|
|
248
263
|
removed,
|
|
264
|
+
ignoredByConfig,
|
|
249
265
|
};
|
|
250
266
|
});
|
|
251
267
|
// A measured violation is a verdict and outranks an unmeasured probe; an
|
|
@@ -296,6 +312,18 @@ function formatTaskSessionChanges(changes) {
|
|
|
296
312
|
return ` + ${change.key}${detail} [task session, excused]`;
|
|
297
313
|
});
|
|
298
314
|
}
|
|
315
|
+
/**
|
|
316
|
+
* `home-entries` changes dropped by `options.envCleanIgnoreHomeEntries`, on one
|
|
317
|
+
* line (#2890). Listed rather than dropped for the reason the excused task
|
|
318
|
+
* session is: a verdict that silently discounted an entry would read exactly
|
|
319
|
+
* like one that never saw it.
|
|
320
|
+
*/
|
|
321
|
+
function formatIgnoredByConfig(changes) {
|
|
322
|
+
if (changes.length === 0)
|
|
323
|
+
return [];
|
|
324
|
+
const names = changes.map((change) => change.key).join(', ');
|
|
325
|
+
return [` ignored (options.envCleanIgnoreHomeEntries): ${names}`];
|
|
326
|
+
}
|
|
299
327
|
/**
|
|
300
328
|
* The header's account of what could be excused, so a report judged against a
|
|
301
329
|
* baseline written before #2472 says why the task's own session was not.
|
|
@@ -322,12 +350,14 @@ function formatEnvCleanReport(diff) {
|
|
|
322
350
|
: '';
|
|
323
351
|
lines.push(` ${probe.probeId} clean (${label})${excused}`);
|
|
324
352
|
lines.push(...formatTaskSessionChanges(probe.taskSessionAdded));
|
|
353
|
+
lines.push(...formatIgnoredByConfig(probe.ignoredByConfig));
|
|
325
354
|
continue;
|
|
326
355
|
}
|
|
327
356
|
lines.push(` ${probe.probeId} VIOLATED (${label}): +${probe.added.length} -${probe.removed.length}`);
|
|
328
357
|
lines.push(...formatChanges('+', probe.added));
|
|
329
358
|
lines.push(...formatChanges('-', probe.removed));
|
|
330
359
|
lines.push(...formatTaskSessionChanges(probe.taskSessionAdded));
|
|
360
|
+
lines.push(...formatIgnoredByConfig(probe.ignoredByConfig));
|
|
331
361
|
for (const excused of probe.ignoredAdded) {
|
|
332
362
|
lines.push(` · ${excused.key} (ignored: belongs to another worktree)`);
|
|
333
363
|
}
|
|
@@ -383,7 +413,9 @@ async function evaluateEnvClean(input) {
|
|
|
383
413
|
return done('error', `${verify_config_1.ENV_CLEAN_GATE_ID}: UNKNOWN — the current snapshot could not be taken: ` +
|
|
384
414
|
`${error instanceof Error ? error.message : String(error)}`, null);
|
|
385
415
|
}
|
|
386
|
-
const diff = diffEnvSnapshots(input.baseline, final, input
|
|
416
|
+
const diff = diffEnvSnapshots(input.baseline, final, input, {
|
|
417
|
+
ignoreHomeEntries: input.ignoreHomeEntries,
|
|
418
|
+
});
|
|
387
419
|
const header = `${verify_config_1.ENV_CLEAN_GATE_ID}: baseline=${new Date(input.baseline.capturedAt).toISOString()} ` +
|
|
388
420
|
`status=${diff.status} task-session=${describeTaskSession(diff.taskSession)}`;
|
|
389
421
|
const report = `${header}\n${formatEnvCleanReport(diff)}`;
|
|
@@ -1154,6 +1154,7 @@ cancellation) {
|
|
|
1154
1154
|
taskId: envClean.taskId,
|
|
1155
1155
|
baseline: envClean.baseline,
|
|
1156
1156
|
sources: envClean.decision.sources,
|
|
1157
|
+
ignoreHomeEntries: config.options.envCleanIgnoreHomeEntries,
|
|
1157
1158
|
}));
|
|
1158
1159
|
statuses.push(outcome.status);
|
|
1159
1160
|
if (cancellation.cancelled) {
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* Server-only: reads from disk, so import this from API routes / CLI only.
|
|
9
9
|
*/
|
|
10
10
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
-
exports.VerifyConfigError = exports.MAX_RETRY_ON_FAIL = exports.MAX_GATE_MUTEX_LENGTH = exports.GATE_MUTEX_PATTERN = exports.GATE_ID_PATTERN = exports.DEFAULT_MAX_LOG_TAIL_BYTES = exports.DEFAULT_TIMEOUT_SEC = exports.VERIFY_CONFIG_RELATIVE_PATH = exports.RESERVED_GATE_IDS = exports.ENV_CLEAN_GATE_ID = exports.SCOPE_GATE_ID = exports.WORK_EVIDENCE_GATE_ID = void 0;
|
|
11
|
+
exports.VerifyConfigError = exports.MAX_ENV_CLEAN_IGNORE_HOME_ENTRIES = exports.MAX_RETRY_ON_FAIL = exports.MAX_GATE_MUTEX_LENGTH = exports.GATE_MUTEX_PATTERN = exports.GATE_ID_PATTERN = exports.DEFAULT_MAX_LOG_TAIL_BYTES = exports.DEFAULT_TIMEOUT_SEC = exports.VERIFY_CONFIG_RELATIVE_PATH = exports.RESERVED_GATE_IDS = exports.ENV_CLEAN_GATE_ID = exports.SCOPE_GATE_ID = exports.WORK_EVIDENCE_GATE_ID = void 0;
|
|
12
12
|
exports.defaultPlannedGateIds = defaultPlannedGateIds;
|
|
13
13
|
exports.validateGateEntries = validateGateEntries;
|
|
14
14
|
exports.loadVerifyConfig = loadVerifyConfig;
|
|
@@ -110,6 +110,11 @@ exports.MAX_GATE_MUTEX_LENGTH = 64;
|
|
|
110
110
|
* reports the machine's luck, not the work.
|
|
111
111
|
*/
|
|
112
112
|
exports.MAX_RETRY_ON_FAIL = 1;
|
|
113
|
+
/**
|
|
114
|
+
* Most names `options.envCleanIgnoreHomeEntries` may list (Issue #2890). A list
|
|
115
|
+
* this long is already a repository papering over a machine it should fix.
|
|
116
|
+
*/
|
|
117
|
+
exports.MAX_ENV_CLEAN_IGNORE_HOME_ENTRIES = 32;
|
|
113
118
|
const TOP_LEVEL_KEYS = ['version', 'gates', 'options'];
|
|
114
119
|
const GATE_KEYS = ['id', 'command', 'timeoutSec', 'mutex', 'retryOnFail', 'flakyIsPass'];
|
|
115
120
|
const OPTION_KEYS = [
|
|
@@ -118,6 +123,7 @@ const OPTION_KEYS = [
|
|
|
118
123
|
'maxLogTailBytes',
|
|
119
124
|
'requireCommit',
|
|
120
125
|
'requireEnvClean',
|
|
126
|
+
'envCleanIgnoreHomeEntries',
|
|
121
127
|
];
|
|
122
128
|
class VerifyConfigError extends Error {
|
|
123
129
|
issues;
|
|
@@ -316,6 +322,47 @@ function validateGates(value, issues) {
|
|
|
316
322
|
}
|
|
317
323
|
return validateGateEntries(value, 'gates', issues);
|
|
318
324
|
}
|
|
325
|
+
/**
|
|
326
|
+
* Validate `options.envCleanIgnoreHomeEntries` (Issue #2890).
|
|
327
|
+
*
|
|
328
|
+
* Each item must be usable as one exact `$HOME` directory-entry name: a string,
|
|
329
|
+
* non-empty, not `.` / `..`, and free of `/` and NUL. Anything with a separator
|
|
330
|
+
* could never equal a `readdir` result, so accepting it would be a rule that
|
|
331
|
+
* silently matches nothing.
|
|
332
|
+
*
|
|
333
|
+
* @returns the names, or null when the value was invalid (issues were pushed)
|
|
334
|
+
*/
|
|
335
|
+
function validateHomeEntryNames(value, issues) {
|
|
336
|
+
const label = 'options.envCleanIgnoreHomeEntries';
|
|
337
|
+
if (!Array.isArray(value)) {
|
|
338
|
+
issues.push(`${label}: must be a list of $HOME entry names (got ${describe(value)})`);
|
|
339
|
+
return null;
|
|
340
|
+
}
|
|
341
|
+
const before = issues.length;
|
|
342
|
+
if (value.length > exports.MAX_ENV_CLEAN_IGNORE_HOME_ENTRIES) {
|
|
343
|
+
issues.push(`${label}: at most ${exports.MAX_ENV_CLEAN_IGNORE_HOME_ENTRIES} entries (got ${value.length})`);
|
|
344
|
+
}
|
|
345
|
+
const names = [];
|
|
346
|
+
value.forEach((item, index) => {
|
|
347
|
+
const at = `${label}[${index}]`;
|
|
348
|
+
if (typeof item !== 'string') {
|
|
349
|
+
issues.push(`${at}: must be a string (got ${describe(item)})`);
|
|
350
|
+
}
|
|
351
|
+
else if (item === '') {
|
|
352
|
+
issues.push(`${at}: must not be empty`);
|
|
353
|
+
}
|
|
354
|
+
else if (item === '.' || item === '..') {
|
|
355
|
+
issues.push(`${at}: must be an entry name, not ${JSON.stringify(item)}`);
|
|
356
|
+
}
|
|
357
|
+
else if (item.includes('/') || item.includes('\0')) {
|
|
358
|
+
issues.push(`${at}: must be a single $HOME entry name without "/" or NUL (got ${describe(item)})`);
|
|
359
|
+
}
|
|
360
|
+
else {
|
|
361
|
+
names.push(item);
|
|
362
|
+
}
|
|
363
|
+
});
|
|
364
|
+
return issues.length === before ? names : null;
|
|
365
|
+
}
|
|
319
366
|
function validateOptions(value, issues) {
|
|
320
367
|
const options = {
|
|
321
368
|
baseRef: null,
|
|
@@ -323,6 +370,7 @@ function validateOptions(value, issues) {
|
|
|
323
370
|
maxLogTailBytes: exports.DEFAULT_MAX_LOG_TAIL_BYTES,
|
|
324
371
|
requireCommit: false,
|
|
325
372
|
requireEnvClean: false,
|
|
373
|
+
envCleanIgnoreHomeEntries: [],
|
|
326
374
|
};
|
|
327
375
|
// A childless `options:` key parses as null and means "all defaults".
|
|
328
376
|
if (value === undefined || value === null)
|
|
@@ -367,6 +415,11 @@ function validateOptions(value, issues) {
|
|
|
367
415
|
options.requireEnvClean = parsed;
|
|
368
416
|
}
|
|
369
417
|
}
|
|
418
|
+
if (value.envCleanIgnoreHomeEntries !== undefined) {
|
|
419
|
+
const names = validateHomeEntryNames(value.envCleanIgnoreHomeEntries, issues);
|
|
420
|
+
if (names)
|
|
421
|
+
options.envCleanIgnoreHomeEntries = names;
|
|
422
|
+
}
|
|
370
423
|
if (value.maxLogTailBytes !== undefined) {
|
|
371
424
|
const parsed = asInteger(value.maxLogTailBytes);
|
|
372
425
|
if (parsed === null) {
|
|
@@ -31,6 +31,7 @@ const db_instance_1 = require("./db/db-instance");
|
|
|
31
31
|
const db_1 = require("./db");
|
|
32
32
|
const tmux_control_mode_metrics_1 = require("./tmux/tmux-control-mode-metrics");
|
|
33
33
|
const control_mode_tmux_transport_1 = require("./tmux/control-mode-tmux-transport");
|
|
34
|
+
const session_ownership_1 = require("./cli-tools/session-ownership");
|
|
34
35
|
const tmux_control_mode_flags_1 = require("./tmux/tmux-control-mode-flags");
|
|
35
36
|
const cache_1 = require("./external-apps/cache");
|
|
36
37
|
const version_checker_1 = require("../lib/version-checker");
|
|
@@ -782,6 +783,16 @@ async function handleTerminalSubscribe(ws, message) {
|
|
|
782
783
|
clientInfo.terminalSubscription = null;
|
|
783
784
|
}
|
|
784
785
|
const sessionName = (0, session_name_1.resolveSessionName)(cliToolId, worktreeId);
|
|
786
|
+
// Issue #2865: never stream a same-named session another CommandMate server
|
|
787
|
+
// created (its `#{session_path}` is not this worktree's directory).
|
|
788
|
+
const ownership = await (0, session_ownership_1.checkSessionOwnership)(sessionName, worktree.path);
|
|
789
|
+
if (ownership.verdict === 'foreign') {
|
|
790
|
+
sendTerminalEvent(ws, {
|
|
791
|
+
type: 'terminal_error',
|
|
792
|
+
error: 'Session belongs to another CommandMate server',
|
|
793
|
+
});
|
|
794
|
+
return;
|
|
795
|
+
}
|
|
785
796
|
const transport = (0, control_mode_tmux_transport_1.getControlModeTmuxTransport)();
|
|
786
797
|
if (transport.getSubscriberCount(sessionName) >= MAX_TERMINAL_SUBSCRIBERS_PER_SESSION) {
|
|
787
798
|
sendTerminalEvent(ws, {
|
package/package.json
CHANGED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "0.42.0",
|
|
3
|
+
"date": "2026-09-27",
|
|
4
|
+
"highlight": {
|
|
5
|
+
"ja": "同じマシンで複数の CommandMate を動かしても、別のサーバのエージェントの画面が見えたり操作できたりしないようになりました。codex 0.157 の新しい画面にも対応しました。",
|
|
6
|
+
"en": "Running several CommandMate servers on one machine no longer lets one server see or drive another server's agents. The new screens in codex 0.157 are also supported."
|
|
7
|
+
},
|
|
8
|
+
"added": [
|
|
9
|
+
{
|
|
10
|
+
"ja": "選択画面で送信が続けて効かないとき、直接入力モードに切り替えるリンクが表示されるようになりました。",
|
|
11
|
+
"en": "When sending on a selection screen keeps having no effect, a link to switch to direct input mode is now shown."
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"ja": "検証の環境チェックで、作業と無関係なホームディレクトリの項目を名前で除外できるようになりました。",
|
|
15
|
+
"en": "The environment check in verification can now ignore unrelated items in your home directory by name."
|
|
16
|
+
}
|
|
17
|
+
],
|
|
18
|
+
"improved": [
|
|
19
|
+
{
|
|
20
|
+
"ja": "エージェントのセッション名にサーバごとの名前が付くようになり、別のサーバと同じ名前のプロジェクトでもセッションを起動できるようになりました。",
|
|
21
|
+
"en": "Agent session names now include a per-server name, so sessions can start even when another server has a project with the same name."
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"ja": "CLI の attach・ls・whoami・instances が新しいセッション名に対応しました。",
|
|
25
|
+
"en": "The CLI attach, ls, whoami, and instances commands now work with the new session names."
|
|
26
|
+
}
|
|
27
|
+
],
|
|
28
|
+
"fixed": [
|
|
29
|
+
{
|
|
30
|
+
"ja": "別のサーバが起動した同じ名前のセッションが表示され、送信や停止ができてしまう問題を直しました。",
|
|
31
|
+
"en": "Fixed sessions started by another server with the same name being shown and accepting messages or stop requests."
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"ja": "codex 0.157 のモデル選択画面を選択画面として扱えず、送信しても反応しなかった問題を直しました。",
|
|
35
|
+
"en": "Fixed the codex 0.157 model picker not being recognized, so sending a choice did nothing."
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"ja": "codex 0.157 のフォルダーの信頼確認画面を認識できなかった問題を直しました。",
|
|
39
|
+
"en": "Fixed the codex 0.157 folder trust screen not being recognized."
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"ja": "CommandMate から答えられない画面に送信ボタンが出ていた問題を直しました。代わりに直接入力への案内が出ます。",
|
|
43
|
+
"en": "Fixed the Send button appearing on screens CommandMate cannot answer. A pointer to direct input is shown instead."
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"ja": "「操作できません」の案内が表示されるまで最大で十数秒かかることがあった問題を直しました。",
|
|
47
|
+
"en": "Fixed the cannot-operate notice sometimes taking up to about fifteen seconds to appear."
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"ja": "スマホでチャット表示のリンクから開いたとき、直接入力に切り替えるとチャット表示に戻ってしまう問題を直しました。",
|
|
51
|
+
"en": "Fixed switching to direct input on a phone going back to the chat view when the page was opened from a chat view link."
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"ja": "codex を複数起動すると、別の codex の返答が最初に起動した codex の会話に入ってしまう問題を直しました。",
|
|
55
|
+
"en": "Fixed replies from one codex instance being saved into the conversation of the first codex that was started."
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"ja": "承認への応答の後に、別のサーバのセッションの画面が会話履歴に取り込まれることがある問題を直しました。",
|
|
59
|
+
"en": "Fixed another server's session screen sometimes being saved into the conversation history after answering an approval."
|
|
60
|
+
}
|
|
61
|
+
]
|
|
62
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "0.42.1",
|
|
3
|
+
"date": "2026-09-28",
|
|
4
|
+
"highlight": {
|
|
5
|
+
"ja": "opencode の新しい版で、起動直後に送信できないことがある問題を直しました。",
|
|
6
|
+
"en": "Sending to a newly started opencode session on recent versions works again."
|
|
7
|
+
},
|
|
8
|
+
"added": [],
|
|
9
|
+
"improved": [],
|
|
10
|
+
"fixed": [
|
|
11
|
+
{
|
|
12
|
+
"ja": "opencode 1.18.31 以降で、起動直後の入力待ちを認識できず送信が拒否されることがある問題を直しました。",
|
|
13
|
+
"en": "Fixed messages sometimes being refused right after opencode 1.18.31 or later started, because its input prompt was not recognized."
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";exports.id=3323,exports.ids=[3323],exports.modules={31517:(a,b,c)=>{c.d(b,{DL:()=>j,sD:()=>f});var d=c(2734);let e=(0,c(72626).h)("lib/hooks/stop-history-capture"),f=[150,500,2e3,5e3],g=new Set([d.c]);function h(a){return new Promise(b=>{setTimeout(b,a)})}async function i(a,b,c,d,f,g){let i=Date.now();try{for(let[j,k]of g.entries()){await h(k);let l={};if(await a.captureStructuredHistoryTurn(b.id,c,d,f,l))return e.info("stop-history-capture-deferred-captured",{worktreeId:b.id,cliToolId:c,instanceId:d,attempt:j+1,attempts:g.length,elapsedMs:Date.now()-i}),!0;e.debug("stop-history-capture-deferred-open",{worktreeId:b.id,cliToolId:c,instanceId:d,attempt:j+1,attempts:g.length,outcome:l.outcome??"unavailable",elapsedMs:Date.now()-i})}return e.info("stop-history-capture-deferred-exhausted",{worktreeId:b.id,cliToolId:c,instanceId:d,attempts:g.length,elapsedMs:Date.now()-i}),!1}catch(a){return e.warn("stop-history-capture-deferred-failed",{worktreeId:b.id,cliToolId:c,instanceId:d,error:a instanceof Error?a.message:String(a)}),!1}}async function j(a,b,d,k={}){try{let j=await Promise.all([c.e(1503),c.e(1719),c.e(9080),c.e(2119),c.e(2445),c.e(252),c.e(8800),c.e(8728),c.e(7905),c.e(9731),c.e(8918)]).then(c.bind(c,28918));if(!j.isPullTranscriptHistory(b))return{status:"unavailable"};let l={worktreePath:a.path,transcriptPathHint:null},m={};if(await j.captureStructuredHistoryTurn(a.id,b,d,l,m))return{status:"captured"};let n=()=>"not_yet_closed"===m.outcome?Promise.resolve(!0):j.hasStructuredHistoryTranscript(a.id,b,d,l);if(g.has(b)){let c=k.deferredDelaysMs??f;if(0===c.length||!await n())return{status:"unavailable"};let g=i(j,a,b,d,l,c);return e.info("stop-history-capture-deferred",{worktreeId:a.id,cliToolId:b,instanceId:d,delaysMs:c}),{status:"deferred",deferred:g}}let o=k.retryDelayMs??500;if(o<=0||!await n())return{status:"unavailable"};let p=Math.max(1,k.maxAttempts??3);for(let c=2;c<=p;c+=1){await h(o);let f={},g=await j.captureStructuredHistoryTurn(a.id,b,d,l,f);if(e.debug("stop-history-capture-retried",{worktreeId:a.id,cliToolId:b,instanceId:d,attempt:c,maxAttempts:p,captured:g,outcome:f.outcome??"unavailable"}),g)return{status:"captured"}}return{status:"unavailable"}}catch(c){return e.warn("stop-history-capture-failed",{worktreeId:a.id,cliToolId:b,instanceId:d,error:c instanceof Error?c.message:String(c)}),{status:"unavailable"}}}},52767:(a,b,c)=>{c.d(b,{r:()=>i,g:()=>h});var d=c(48524),e=c(87009),f=c(72626);let g=(0,f.h)("lib/tasks/task-transition-service");function h(a,b,c,f){let h=a.transaction(()=>{let g=(0,d.gg)(a,b);if(!g)return null;let h=g.status,i=function(a,b){switch(a){case"pending":switch(b){case"message_sent":return"running";case"send_failed":case"cancel":return"cancelled";default:return null}case"running":switch(b){case"prompt_detected":return"waiting_input";case"agent_idle":return"running";case"verify_started":return"verifying";case"send_failed":return"failed";case"cancel":return"cancelled";default:return null}case"waiting_input":switch(b){case"prompt_answered_auto":case"prompt_answered_human":case"agent_idle":return"running";case"verify_started":return"verifying";case"cancel":return"cancelled";default:return null}case"verifying":switch(b){case"verify_passed":return"succeeded";case"verify_failed":return"failed";case"verify_not_started":return"not_started";case"cancel":return"cancelled";default:return null}case"failed":case"not_started":switch(b){case"message_sent":return"running";case"verify_started":return"verifying";case"cancel":return"cancelled";default:return null}default:return null}}(h,c),j=Date.now(),k=(0,e.P)(a,{taskId:b,event:c,fromStatus:h,toStatus:i,payload:f,createdAt:j});return null===i?{task:g,fromStatus:h,toStatus:null,eventId:k}:{task:(0,d.xZ)(a,b,i,f?.runId===void 0?{}:{lastVerificationRunId:f.runId}),fromStatus:h,toStatus:i,eventId:k}})();return null===h?g.warn("task-event-unknown-task",{taskId:b,event:c}):null===h.toStatus&&g.warn("task-event-rejected",{taskId:b,event:c,fromStatus:h.fromStatus}),h}function i(a,b,c,e,f,i){try{let g=(0,d.MH)(a,b,c,e);if(!g)return null;return h(a,g.id,f,i)}catch(a){return g.warn("task-event-failed",{worktreeId:b,cliToolId:c,instanceId:e,event:f,error:a instanceof Error?a.message:String(a)}),null}}}};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";exports.id=7075,exports.ids=[964,2839,5220,7075,8583],exports.modules={23197:(a,b,c)=>{c.d(b,{H1:()=>d});let d="__global__"},39687:(a,b,c)=>{c.d(b,{d:()=>q});var d=c(56791),e=c(43234),f=c(15194),g=c(95220),h=c(12462),i=c(43015),j=c(54325),k=c(72626),l=c(58707),m=c(41466);let n=(0,k.h)("session/send-user-message");function o(a){return a instanceof Error?a.message:String(a)}async function p(a,b){let c=`${a}:${b}`,d=Date.now()+5e3;for(;(0,g.getActivePollers)().includes(c);){if(Date.now()>=d)return!1;await new Promise(a=>setTimeout(a,100))}return!0}async function q(a,b){let{worktreeId:c,content:k,cliToolId:q,instanceId:r,absoluteImagePath:s,copilotModel:t}=b,u=b.messageType??"normal",v=r??q,w=e.CLIToolManager.getInstance().getTool(q),x=await (0,l.a3)(c,q,r,{ignoreStructured:b.ignoreStructuredPromptGuard});if(x.waiting)return n.info("send-refused-prompt-waiting",{worktreeId:c,cliToolId:q,reason:x.reason,blockedBy:x.blockedBy}),{ok:!1,stage:"prompt_waiting",error:(0,l.br)(c,x.blockedBy)};if(t&&"copilot"===q){try{await w.sendModelCommand(c,t,r),n.info("copilot-model-command-sent",{model:t})}catch(a){return n.error("failed-to-send-model-command:",{error:o(a)}),{ok:!1,stage:"model",error:o(a)}}await p(c,v)||n.warn("previous-turn-poller-still-running",{worktreeId:c,instanceId:v,waitedMs:5e3})}let y=new Date;try{await (0,h.o4)(a,c,q,y,r)}catch(a){n.error("failed-to-save-pending-assistant-response:",{error:o(a)})}let z=null;try{let b=(0,d.getMessages)(a,c,{limit:1,cliToolId:q,instanceId:v,matchResolvedInstance:!0});b.length>0&&"user"===b[0].role&&b[0].content===k&&(z=b[0].id)}catch(a){n.error("failed-to-detect-orphaned-messages:",{error:o(a)})}try{s?(0,f._J)(w)?await w.sendMessageWithImage(c,k,s,r):await w.sendMessage(c,(0,m.TZ)(k,s),r):await w.sendMessage(c,k,r)}catch(a){return n.error("failed-to-send-message-to:",{error:o(a)}),{ok:!1,stage:"send",error:o(a)}}let A=(0,d.createMessage)(a,{worktreeId:c,role:"user",content:k,messageType:u,timestamp:y,cliToolId:q,instanceId:r,requestId:b.requestId});try{(0,i.broadcastMessage)("message",{worktreeId:c,message:{...A,cliToolId:q,instanceId:v}})}catch(a){n.warn("user-message-broadcast-failed",{error:o(a)})}if(z)try{if((0,d.deleteMessageById)(a,z)){n.info("cleaned-up-orphaned-user");try{(0,i.broadcastMessage)(j.dz,{worktreeId:c,cliToolId:q,instanceId:v,reason:"orphan_cleanup"})}catch(a){n.warn("orphan-cleanup-broadcast-failed",{error:o(a)})}}}catch(a){n.error("failed-to-clean-up-orphaned-message:",{error:o(a)})}return(0,d.updateLastUserMessage)(a,c,k,y),(0,d.clearInProgressMessageId)(a,c,q,r),n.info("cleared-in-progress-message-for"),(0,g.startPolling)(c,q,r),{ok:!0,message:A}}},40964:(a,b,c)=>{c.d(b,{m:()=>g});var d=c(15194);let e=/^[a-zA-Z0-9_-]+$/;function f(a){if(!e.test(a))throw Error(`Invalid session name format: ${a}`)}function g(a,b,c){let e=`mcbd-${a}-${b}`;if(!c||c===a)return f(e),e;let g=(0,d.pL)(c,a),h=g?`${e}-${g}`:e;return f(h),h}},58707:(a,b,c)=>{c.d(b,{$n:()=>k,a3:()=>l,br:()=>m});var d=c(43234),e=c(31990),f=c(95595),g=c(34405),h=c(72626),i=c(30008);let j=(0,h.h)("prompt-waiting-guard"),k="PROMPT_WAITING";async function l(a,b,c,h){try{let k=d.CLIToolManager.getInstance().getTool(b);if(!await k.isRunning(a,c))return{waiting:!1};let l=await (0,e.Wh)(a,b,g._,c),m=(0,f.WC)(l,b),n=(0,i._G)({worktreeId:a,cliToolId:b,instanceId:c,scraper:{status:m.status,reason:m.reason,hasActivePrompt:m.hasActivePrompt},ignoreStructured:h?.ignoreStructured});if(!n.blocksSend)return null!==n.structuredSendBlockSuppressed&&j.info("structured-send-guard-not-applied",{worktreeId:a,cliToolId:b,instanceId:c,suppressed:n.structuredSendBlockSuppressed,promptWaitingSince:n.structured?.at??null}),{waiting:!1};return{waiting:!0,reason:n.blockReason??void 0,blockedBy:n.blockedBy??void 0}}catch(c){return j.warn("prompt-waiting-check-failed",{worktreeId:a,cliToolId:b,error:c instanceof Error?c.message:String(c)}),{waiting:!1}}}function m(a,b){let c=`${a} is waiting on a prompt. Sending now would type into the prompt's input line instead of reaching the agent, and would leave that text in place for the next answer. Answer the prompt first: \`commandmate respond ${a} <answer>\`.`;if("structured"!==b)return c;let d=Math.round(i.j0/6e4);return`${c} This dialog was reported by the agent's own hooks and is not visible to the terminal scraper, so if the pane looks idle the record has outlived its dialog: it stops blocking sends ${d} minutes after it was reported, or immediately with \`commandmate send ${a} <message> --ignore-structured-prompt\` (server-wide: ${i.F1}=off).`}},61068:(a,b,c)=>{c.d(b,{Nz:()=>u,EB:()=>v,l7:()=>x});var d=c(95220),e=c(5363),f=c(56793),g=c(85775),h=c(72626),i=c(43234),j=c(79892);let k=(0,h.h)("global-session-poller"),l=new Map,m=new Map;var n=c(93997),o=c(15194),p=c(23197),q=c(77093),r=c(82325);let s=(0,h.h)("session-cleanup");async function t(a,b){let c={worktreeId:a,sessionsKilled:[],sessionErrors:[],pollersStopped:[],pollerErrors:[]};for(let e of((0,n.pc)(),o.XH)){try{await b(a,e)&&(c.sessionsKilled.push(e),s.info("session:killed",{worktreeId:a,cliToolId:e}))}catch(d){let b=`${e}: ${(0,q.u1)(d)}`;c.sessionErrors.push(b),s.warn("session:kill-failed",{worktreeId:a,cliToolId:e,error:d instanceof Error?d.message:String(d)})}try{(0,d.stopPolling)(a,e),c.pollersStopped.push(`response-poller:${e}`)}catch(d){let b=`response-poller:${e}: ${(0,q.u1)(d)}`;c.pollerErrors.push(b),s.warn("response-poller:stop-failed",{worktreeId:a,cliToolId:e,error:d instanceof Error?d.message:String(d)})}}try{(0,e._C)(a),c.pollersStopped.push("auto-yes-poller")}catch(d){let b=`auto-yes-poller: ${(0,q.u1)(d)}`;c.pollerErrors.push(b),s.warn("auto-yes-poller:stop-failed",{worktreeId:a,error:d instanceof Error?d.message:String(d)})}try{(0,e.LP)(a),c.pollersStopped.push("auto-yes-state")}catch(d){let b=`auto-yes-state: ${(0,q.u1)(d)}`;c.pollerErrors.push(b),s.warn("auto-yes-state:delete-failed",{worktreeId:a,error:d instanceof Error?d.message:String(d)})}try{(0,f.Yg)(a),c.pollersStopped.push("schedule-manager")}catch(d){let b=`schedule-manager: ${(0,q.u1)(d)}`;c.pollerErrors.push(b),s.warn("schedule-manager:stop-failed",{worktreeId:a,error:d instanceof Error?d.message:String(d)})}try{(0,g.Tm)(a),c.pollersStopped.push("timer-manager")}catch(d){let b=`timer-manager: ${(0,q.u1)(d)}`;c.pollerErrors.push(b),s.warn("timer-manager:stop-failed",{worktreeId:a,error:d instanceof Error?d.message:String(d)})}return c}async function u(a,b){let c=await Promise.allSettled(a.map(a=>t(a,b))),d=[],e=[];for(let b=0;b<c.length;b++){let f=c[b],g=a[b];if("fulfilled"===f.status){let a=f.value;for(let b of(d.push(a),a.sessionErrors))e.push(`Session kill error (${g}): ${b}`);for(let b of a.pollerErrors)e.push(`Poller stop error (${g}): ${b}`)}else e.push(`Cleanup failed (${g}): ${(0,q.u1)(f.reason)}`)}return{results:d,warnings:e}}async function v(a,b){try{let c=i.CLIToolManager.getInstance().getTool(b);if(!await c.isRunning(a))return!1;let e=`${a}:${b}`;(0,d.clearPromptHashCache)(e);let f=c.getSessionName(a);return(0,j.fY)(f)}catch{return!1}}async function w(){for(let a of l.keys()){let b=l.get(a);b&&clearTimeout(b)}l.clear(),m.clear(),k.info("poll:all-stopped");let a=0,b=i.CLIToolManager.getInstance();for(let c of o.XH)try{let d=b.getTool(c).getSessionName(p.H1);await (0,j.N)(d)&&await (0,j.fY)(d)&&(a++,s.info("global-session:killed",{cliToolId:c,sessionName:d}))}catch(a){s.warn("global-session:kill-failed",{cliToolId:c,error:(0,q.u1)(a)})}return a}async function x(a,b){let c=(0,r.L0)(a,b);try{await w()}catch(a){s.warn("sync:global-cleanup-failed",{error:(0,q.u1)(a)})}let d=[];if(c.deletedIds.length>0)try{let a=await u(c.deletedIds,v);a.warnings.length>0&&(s.warn("sync:cleanup-warnings",{warnings:a.warnings}),d=[`${a.warnings.length} session cleanup warning(s) occurred`])}catch(a){s.error("sync:cleanup-failed",{error:(0,q.u1)(a)}),d=["Session cleanup encountered an error"]}return{syncResult:c,cleanupWarnings:d}}},82325:(a,b,c)=>{c.d(b,{Hz:()=>o,L0:()=>r,Mg:()=>s,YM:()=>p,Yp:()=>q});var d=c(79646),e=c(28354),f=c(29021),g=c.n(f),h=c(33873),i=c.n(h),j=c(23718),k=c(56791),l=c(72626),m=c(64185);let n=(0,l.h)("worktrees");function o(){let a=process.env.WORKTREE_REPOS;return a&&a.trim()?a.split(",").map(a=>a.trim()).filter(a=>a.length>0):[]}async function p(a){let b=(0,e.promisify)(d.exec);if(function(a){if(!a)return!1;try{return g().lstatSync(a),!1}catch(b){let a=b.code;return"ENOENT"===a||"ENOTDIR"===a}}(a))return n.warn("repository:scan-skipped-missing-dir",{repoPath:a}),[];try{let{stdout:c}=await b("git worktree list",{cwd:a}),d=function(a){if(!a||""===a.trim())return[];let b=a.trim().split("\n"),c=[];for(let a of b){let b=a.trim();if(!b)continue;let d=b.match(/^(.+?)\s+([a-z0-9]+)\s+(?:\[(.+?)\]|\(detached HEAD\))/);if(d){let[,a,b,e]=d;c.push({path:a.trim(),branch:e||`detached-${b}`,commit:b})}}return c}(c),e=i().resolve(a),f=i().basename(e);return(0,m.oZ)(e),d.map(a=>{let b=i().resolve(a.path);return{id:(0,j.ko)(b),name:a.branch,branch:a.branch,path:b,repositoryPath:e,repositoryName:f}}).filter(a=>["/etc","/root","/sys","/proc","/dev","/boot","/bin","/sbin","/usr/bin","/usr/sbin"].some(b=>a.path.startsWith(b))?(n.warn("worktree:unsafe-path-skipped",{path:a.path}),!1):!(a.path.includes("\0")||a.path.includes(".."))||(n.warn("worktree:malicious-path-skipped",{path:a.path}),!1))}catch(c){let a=c instanceof Error?c.message:String(c),b=c.code;if(a?.includes("not a git repository")||128===b)return[];throw c}}async function q(a){let b=await Promise.allSettled(a.map(async a=>{n.info("repository:scan-start",{repoPath:a});let b=await p(a);return n.info("repository:scan-complete",{repoPath:a,worktreeCount:b.length}),b})),c=[];for(let d=0;d<b.length;d++){let e=b[d];"fulfilled"===e.status?c.push(...e.value):n.error("repository:scan-failed",{repoPath:a[d],error:e.reason instanceof Error?e.reason.message:String(e.reason)})}return c}function r(a,b){if(0===b.length)return{deletedIds:[],upsertedCount:0};let c=[],d=0,e=new Map;for(let a of b){let b=a.repositoryPath||"";e.has(b)||e.set(b,[]),e.get(b).push(a)}let f=new Set([...(0,k.getAllWorktreeIds)(a),...(0,k.getAliasedWorktreeIds)(a)]),g=new Map((0,k.getAllWorktreePathIds)(a).map(a=>[i().resolve(a.path),a.id])),h=new Map,l=new Map;for(let[a,b]of g)h.set(a,new Set([b])),l.set(b,a);for(let b of(0,k.getAllWorktreeAliases)(a)){let a=l.get(b.worktreeId);a&&h.get(a)?.add(b.oldId)}let m=new Set(b.map(a=>i().resolve(a.path)));for(let[b,o]of e){if(!b)continue;let e=(0,k.getWorktreesByRepository)(a,b).filter(a=>!m.has(i().resolve(a.path))).map(a=>a.id);if(e.length>0){let b=(0,k.deleteWorktreesByIds)(a,e);for(let a of(c.push(...e),e)){f.delete(a);let b=l.get(a);void 0!==b&&(g.delete(b),h.delete(b))}n.info("worktree:cleanup",{deletedCount:b.deletedCount})}for(let b of o){let c=i().resolve(b.path),e=g.get(c),m=b.id,n=e??(m&&!f.has(m)?m:function(a,b,c){if(!c||0===c.size)return(0,j.ko)(a,b);let d=new Set(b);for(let a of c)d.delete(a);return(0,j.ko)(a,d)}(c,f,h.get(c)));f.add(n),g.set(c,n),l.set(n,c),(0,k.upsertWorktree)(a,{...b,id:n,name:b.branch??b.name}),d++}}return{deletedIds:c,upsertedCount:d}}function s(a,b){let c=new Set(b.map(a=>a.repositoryPath).filter(a=>!!a)),d=[];for(let b of(0,k.getRepositories)(a)){let e=b.path;if(!e||c.has(e)||function(a){if(!a)return!1;try{return g().existsSync(a)&&g().existsSync(i().join(a,".git"))}catch{return!0}}(e))continue;let f=(0,k.getWorktreesByRepository)(a,e).map(a=>a.id);if(0===f.length)continue;let h=(0,k.deleteWorktreesByIds)(a,f);d.push(...f),n.info("worktree:stale-repo-pruned",{repoPath:e,deletedCount:h.deletedCount})}return d}},85775:(a,b,c)=>{c.d(b,{Tm:()=>o,x4:()=>m,xJ:()=>n});var d=c(34129),e=c(43234),f=c(88807),g=c(72626),h=c(87374),i=c(39687);let j=(0,g.h)("timer-manager");function k(){return globalThis.__timerManagerState||(globalThis.__timerManagerState={timers:new Map,timerWorktrees:new Map,initialized:!1}),globalThis.__timerManagerState}async function l(a){let b=k(),c=(0,f.getDbInstance)();try{let b=(0,d.kx)(c,a);if(!b||"pending"!==b.status)return;let f=e.CLIToolManager.getInstance().getTool(b.cliToolId),g=b.instanceId;if(!await f.isRunning(b.worktreeId,g)){j.warn("timer:no-session",{timerId:a,worktreeId:b.worktreeId,instanceId:g}),(0,d.j2)(c,a,h.HR.NO_SESSION);return}(0,d.j2)(c,a,"sending");let k=await (0,i.d)(c,{worktreeId:b.worktreeId,content:b.message,cliToolId:b.cliToolId,instanceId:g});if(!k.ok){let b=`[${k.stage}] ${k.error}`;(0,d.j2)(c,a,"failed",void 0,b),j.error("timer:send-failed",{timerId:a,stage:k.stage,error:k.error});return}(0,d.j2)(c,a,"sent",Date.now()),j.info("timer:sent",{timerId:a,worktreeId:b.worktreeId})}catch(e){let b=e instanceof Error?e.message:String(e);try{(0,d.j2)(c,a,"failed",void 0,b)}catch{}j.error("timer:send-failed",{timerId:a,error:b})}finally{b.timers.delete(a),b.timerWorktrees.delete(a)}}function m(a,b,c){let d=k(),e=setTimeout(()=>{l(a)},c);d.timers.set(a,e),d.timerWorktrees.set(a,b)}function n(a){let b=k(),c=b.timers.get(a);c&&(clearTimeout(c),b.timers.delete(a),b.timerWorktrees.delete(a));let e=(0,f.getDbInstance)();(0,d.Ud)(e,a)}function o(a){let b=k(),c=(0,f.getDbInstance)();for(let[c,d]of b.timerWorktrees)if(d===a){let a=b.timers.get(c);a&&clearTimeout(a),b.timers.delete(c),b.timerWorktrees.delete(c)}(0,d.$$)(c,a)}},95220:(a,b,c)=>{c.r(b),c.d(b,{accumulateTuiContent:()=>g.IZ,cleanClaudeResponse:()=>f.NN,cleanCopilotResponse:()=>f.LH,cleanGeminiResponse:()=>f.IS,cleanOpenCodeResponse:()=>f.aW,clearPromptHashCache:()=>h.iX,clearTuiAccumulator:()=>g.q1,extractCopilotContentLines:()=>g.o0,extractTuiContentLines:()=>g.K0,findOverlapIndex:()=>g.vQ,getAccumulatedContent:()=>g.Uz,getActivePollers:()=>d.KQ,initTuiAccumulator:()=>g.tb,isDuplicatePrompt:()=>h.gv,isOpenCodeComplete:()=>e.bE,migrateResponsePollerWorktreeIds:()=>d.sR,normalizeCopilotLine:()=>g.IW,normalizePromptForDedup:()=>h.zm,renamePromptHashCacheKey:()=>h.i2,resolveExtractionStartIndex:()=>e.QM,startPolling:()=>d.g8,stopAllPolling:()=>d.fq,stopPolling:()=>d.Et,truncateMessage:()=>f.Sj});var d=c(45146),e=c(60),f=c(82450),g=c(13033),h=c(72457)}};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";exports.id=9080,exports.ids=[9080],exports.modules={8953:(a,b,c)=>{c.d(b,{G2:()=>f,Mx:()=>g,pU:()=>e,qD:()=>d,sM:()=>j});let d=["Up","Down","Left","Right","Enter","Escape","Tab","BTab","PageUp","PageDown","Home","End","q","1","2","3","4","5","6","7","8","9","y","n"],e=[...d,"s"],f=[...e,"C-a"],g="C-x",h=["C-p","C-t"],i=["a","l","t","m","g","u","r","c"],j=[...d,g,...h,...i];[...d,...h,...i]},31442:(a,b,c)=>{c.d(b,{$D:()=>u,Bl:()=>z,Fk:()=>s,HL:()=>e,Ix:()=>y,KB:()=>t,L0:()=>k,Ls:()=>L,N2:()=>m,ND:()=>p,N_:()=>g,RS:()=>N,Rr:()=>J,Ys:()=>r,bq:()=>n,cD:()=>q,eC:()=>h,g4:()=>K,gM:()=>E,jp:()=>i,jx:()=>F,lY:()=>o,n9:()=>B,om:()=>v,sL:()=>M,tx:()=>l,wv:()=>j});var d=c(16983);let e="mcbd-";function f(a){return`=${a}:`}function g(a){return a.startsWith(e)}let h="@cm_status",i="@cm_worktree",j="@cm_tool",k="@cm_instance",l="@cm_updated",m="@cm_delegated",n=[h,i,j,k,l,m],o="[CommandMate #{@cm_tool}/#{@cm_instance} #{@cm_status}] #{window_width}x#{window_height}";function p(a,b,c){return["set-option","-t",f(a),b,c]}function q(a,b){return["set-option","-u","-t",f(a),b]}function r(a,b){return["show-options","-t",f(a),b]}function s(a,b){return["show-options","-v","-t",f(a),b]}function t(a,b){return p(a,"status-right",b)}function u(a){return q(a,"status-right")}function v(a=process.env){let b=(a.CM_TMUX_STATUS??"").trim().toLowerCase();return"off"!==b&&"0"!==b&&"false"!==b}function w(a,b,c){return["set-hook","-t",f(a),b,c]}function x(a,b){return["set-hook","-u","-t",f(a),b]}function y(a){return["list-clients","-t",f(a),"-F","#{client_control_mode}"]}function z(a){return a.split("\n").map(a=>a.trim()).filter(a=>"0"===a).length}let A=["claude"];function B(a){return!!g(a)&&A.some(b=>a.startsWith(`${e}${b}-`))}let C="client-attached[0]",D="client-attached[1]";function E(a=process.env){return"on"===(a.CM_LIVE_ATTACH_HOOK??"").trim().toLowerCase()}function F(a=process.env){return"on"===(a.CM_READ_MODE_AUTO_POPUP??"").trim().toLowerCase()}function G(a){if(!/["$`\\\n\r]/.test(a))return`"${a}"`}function H(a,b,c=[]){let d=[a,...b,...c].join(" ");return`run-shell -b '${d}'`}let I=["#{session_name}","#{client_control_mode}","#{client_name}"];function J(a,b){let c=G(b);if(void 0!==c)return w(a,C,H(c,I))}function K(a){return x(a,C)}function L(a,b){let c=G(b);if(void 0!==c)return w(a,D,H(c,I))}function M(a){return x(a,D)}function N(a,b=d.Jn,c=d.sO){return[["set-window-option","-t",f(a),"window-size","manual"],["resize-window","-t",f(a),"-x",String(b),"-y",String(c)],q(a,m)]}},54325:(a,b,c)=>{c.d(b,{LE:()=>f,Oo:()=>e,ST:()=>d,T4:()=>k,dz:()=>j,r9:()=>h,rx:()=>i,rz:()=>g});let d="client_version",e="version_mismatch";function f(a,b){return!!a&&!!b&&"0.0.0"!==a&&"0.0.0"!==b&&a!==b}let g="chat_turn_progress",h=1e3;function i(a,b=65536){return b<=0?{body:"",truncated:a.length>0}:a.length<=b?{body:a,truncated:!1}:{body:a.slice(a.length-b),truncated:!0}}let j="messages_invalidated",k="model_changed"},77864:(a,b,c)=>{c.d(b,{Mj:()=>e,yy:()=>f});let d=["Enter","Escape","Tab","BTab","BSpace","DC","Up","Down","Left","Right","Home","End","PageUp","PageDown","C-a","C-b","C-c","C-d","C-e","C-f","C-g","C-h","C-i","C-j","C-k","C-l","C-m","C-n","C-o","C-p","C-q","C-r","C-s","C-t","C-u","C-v","C-w","C-x","C-y","C-z"],e=32;function f(a){if("object"!=typeof a||null===a)return!1;if("key"===a.type){var b;return"string"==typeof(b=a.key)&&d.includes(b)}return"text"===a.type&&"string"==typeof a.text&&a.text.length>0&&a.text.length<=4096}},79892:(a,b,c)=>{c.d(b,{Xg:()=>y,ou:()=>D,Ce:()=>C,jw:()=>u,lA:()=>p,nS:()=>s,N:()=>r,N6:()=>E,fY:()=>z,GW:()=>t,zT:()=>q,ur:()=>H,V1:()=>v,ds:()=>B,KB:()=>x,Sb:()=>G});var d=c(79646),e=c(28354),f=c(93997),g=c(83598),h=c(16983),i=c(72626),j=c(8953),k=c(77864),l=c(86069);function m(a){return a.endsWith(";")?`${a.slice(0,-1)}\\;`:a}let n=(0,e.promisify)(d.execFile),o=(0,i.h)("tmux");function p(a){return`=${a}:`}async function q(a,b={}){let c,d,e,f=b.windowWidth??h.Jn,i=b.windowHeight??h.sO,j=p(a);try{c=(await n("tmux",["show-window-options","-v","-t",j,"window-size"],{timeout:5e3})).stdout.trim();let[a,b]=(await n("tmux",["display-message","-p","-t",j,"#{window_width}|#{window_height}"],{timeout:5e3})).stdout.trim().split("|").map(Number);Number.isFinite(a)&&(d=a),Number.isFinite(b)&&(e=b)}catch{}let k="manual"===c,l=d===f&&e===i;if(k&&l)return!1;if((b.respectAttachedClient??!0)&&await (0,g.Fh)(a))return o.info("session-geometry:delegated-to-client",{sessionName:a}),!1;try{return k||await n("tmux",["set-window-option","-t",j,"window-size","manual"],{timeout:5e3}),l||await n("tmux",["resize-window","-t",j,"-x",String(f),"-y",String(i)],{timeout:5e3}),!0}catch(b){return o.warn("session-geometry:reconcile-failed",{sessionName:a,error:b instanceof Error?b.message:String(b)}),!1}}async function r(a){try{return await n("tmux",["has-session","-t",p(a)],{timeout:5e3}),!0}catch{return!1}}async function s(a){try{let{stdout:b}=await n("tmux",["display-message","-p","-t",p(a),"#{session_path}"],{timeout:5e3}),c=b.trim();return""===c?null:c}catch{return null}}async function t(){try{let{stdout:a}=await n("tmux",["list-sessions","-F","#{session_name}|#{session_windows}|#{session_attached}"],{timeout:5e3});if(!a||""===a.trim())return[];return a.trim().split("\n").map(a=>{let[b,c,d]=a.split("|");return{name:b,windows:parseInt(c,10)||0,attached:"1"===d}})}catch{return[]}}async function u(a,b){let c,d,e,f,g;"string"==typeof a?(c=a,d=b,e=h.eu,f=h.Jn,g=h.sO):(c=a.sessionName,d=a.workingDirectory,e=a.historyLimit||h.eu,f=a.windowWidth||h.Jn,g=a.windowHeight||h.sO);try{await n("tmux",["new-session","-d","-s",c,"-c",d,"-x",String(f),"-y",String(g)],{timeout:5e3}),await n("tmux",["set-option","-t",p(c),"history-limit",String(e)],{timeout:5e3});try{await n("tmux",["new-window","-k","-t",`${p(c)}0`,"-c",d],{timeout:5e3})}catch(a){o.warn("session-history-limit:window-rebuild-failed",{sessionName:c,historyLimit:e,error:a instanceof Error?a.message:String(a)})}await q(c,{windowWidth:f,windowHeight:g,respectAttachedClient:!1})}catch(b){let a=b instanceof Error?b.message:String(b);throw Error(`Failed to create tmux session: ${a}`)}}async function v(a,b,c=!0,d){if(d?.literal&&c)throw Error("sendKeys: { literal: true } cannot be combined with sendEnter — a trailing C-m would be typed as text. Send Enter as a separate key.");let e=m(b),f=d?.literal?function(a,b){if("literal"===b.kind)return["send-keys","-t",a,"-l","--",m(b.text)];if(!(0,l.vY)(b.name))throw Error(`Invalid key sequence key name: ${b.name}`);return["send-keys","-t",a,"--",b.name]}(p(a),{kind:"literal",text:b}):c?["send-keys","-t",p(a),e,"C-m"]:["send-keys","-t",p(a),e];try{await n("tmux",f,{timeout:5e3})}catch(b){let a=b instanceof Error?b.message:String(b);throw Error(`Failed to send keys to tmux session: ${a}`)}}let w=new Set(["Up","Down","Left","Right","Enter","Space","Tab","Escape","BTab","BSpace","DC","PageUp","PageDown","Home","End","q","1","2","3","4","5","6","7","8","9","y","s","C-x","C-p","C-t","a","l","n","t","m","g","u","r","c","C-a"]);async function x(a,b){if(0!==b.length){for(let a of b)if(!w.has(a))throw Error(`Invalid special key: ${a}`);try{for(let c=0;c<b.length;c++)await n("tmux",["send-keys","-t",p(a),b[c]],{timeout:5e3}),c<b.length-1&&await new Promise(a=>setTimeout(a,100))}catch(b){let a=b instanceof Error?b.message:String(b);throw Error(`Failed to send special keys to tmux session: ${a}`)}}}async function y(a,b){let c,d;"number"==typeof b?(c=-b,d="-"):b?(c=b.startLine??-1e4,d=b.endLine??"-"):(c=-1e3,d="-");try{let{stdout:b}=await n("tmux",["capture-pane","-t",p(a),"-p","-e","-S",String(c),"-E",String(d)],{timeout:5e3,maxBuffer:0xa00000});return b}catch(b){let a=b instanceof Error?b.message:String(b);throw Error(`Failed to capture pane: ${a}`)}}async function z(a){try{return await n("tmux",["kill-session","-t",p(a)],{timeout:5e3}),!0}catch(b){let a=b instanceof Error?b.message:String(b);if(a?.includes("no server running")||a?.includes("can't find session"))return!1;throw Error(`Failed to kill tmux session: ${a}`)}}let A=new Set(["Escape","C-c","C-d","C-m","Enter"]);async function B(a,b){if(!A.has(b))throw Error(`Invalid special key: ${b}`);try{await n("tmux",["send-keys","-t",p(a),b],{timeout:5e3})}catch(b){let a=b instanceof Error?b.message:String(b);throw Error(`Failed to send special key: ${a}`)}}async function C(a){try{await n("tmux",["send-keys","-t",p(a),"C-u"],{timeout:5e3})}catch(b){let a=b instanceof Error?b.message:String(b);throw Error(`Failed to clear tmux input line: ${a}`)}}async function D(a){try{await n("tmux",["send-keys","-t",p(a),"C-e","C-u"],{timeout:5e3})}catch(b){let a=b instanceof Error?b.message:String(b);throw Error(`Failed to clear tmux composer line: ${a}`)}}function E(a,b=j.qD){return b.includes(a)&&w.has(a)}function F(a){let b=setTimeout(()=>(0,f.gm)(a),250);b.unref?.()}async function G(a,b){await x(a,b),(0,f.gm)(a),F(a)}async function H(a,b){for(let a of b)if(!(0,k.yy)(a))throw Error("Invalid direct input event");let c=p(a);for(let a of b){if("key"===a.type){await n("tmux",["send-keys","-t",c,"--",a.key],{timeout:5e3});continue}let b=Buffer.from(a.text,"utf8");for(let a=0;a<b.length;a+=256){let d=Array.from(b.subarray(a,a+256),a=>a.toString(16).padStart(2,"0"));await n("tmux",["send-keys","-t",c,"-H",...d],{timeout:5e3})}}(0,f.gm)(a),F(a)}},83598:(a,b,c)=>{c.d(b,{Fh:()=>l,G9:()=>m,Us:()=>j,zQ:()=>k});var d=c(79646),e=c(28354),f=c(31442);let g=(0,e.promisify)(d.execFile),h=globalThis.__cmGeometryDelegationCache??(globalThis.__cmGeometryDelegationCache=new Map),i=globalThis.__cmGeometryDelegationEdge??(globalThis.__cmGeometryDelegationEdge=new Map);async function j(a,b=Date.now()){let c=h.get(a);if(c&&b-c.readAt<1e3)return c.delegated;let d=!1;try{let{stdout:b}=await g("tmux",(0,f.Fk)(a,f.N2),{timeout:5e3});d="1"===b.trim()}catch{d=!1}return h.set(a,{delegated:d,readAt:b}),d}async function k(a,b=Date.now()){let c=await j(a,b),d=i.get(a)??!1;return i.set(a,c),{delegated:c,released:d&&!c}}async function l(a){try{let{stdout:b}=await g("tmux",(0,f.Ix)(a),{timeout:5e3});return(0,f.Bl)(b)>0}catch{return!1}}function m(a){h.delete(a),i.delete(a)}},86069:(a,b,c)=>{c.d(b,{IS:()=>e,J_:()=>h,iF:()=>f,vY:()=>g});let d=["Escape","C-c","C-d","C-m","Enter"];function e(a,b){return void 0===b?{kind:"key",name:a}:{kind:"key",name:a,delayAfterMs:b}}function f(a,b){return void 0===b?{kind:"literal",text:a}:{kind:"literal",text:a,delayAfterMs:b}}function g(a){return d.includes(a)}let h="unknown"},93997:(a,b,c)=>{c.d(b,{aq:()=>m,gm:()=>k,pc:()=>l,sl:()=>f,vF:()=>j,wd:()=>i,xE:()=>e});let d=(0,c(72626).h)("tmux-capture-cache"),e=1e4;function f(a,b=e){return b>0&&a>=b}function g(){return globalThis.__tmuxCaptureCache??=new Map}function h(){return globalThis.__tmuxCaptureCacheInflight??=new Map}function i(a,b){if(""===a)return"";let c=a.split("\n");return b>=c.length?a:c.slice(-b).join("\n")}function j(a,b,c){let d=g(),e=Date.now();for(let[a,b]of d)e-b.timestamp>5e3&&d.delete(a);if(d.size>=100&&!d.has(a)){let a=null,b=1/0;for(let[c,e]of d)e.timestamp<b&&(b=e.timestamp,a=c);a&&d.delete(a)}d.set(a,{output:b,capturedLines:c,timestamp:e})}function k(a){g().delete(a),d.debug("cache:invalidate",{sessionName:a})}function l(){g().clear(),h().clear()}async function m(a,b,c){let d=function(a,b){let c=g(),d=c.get(a);return d?Date.now()-d.timestamp>5e3?(c.delete(a),null):b>d.capturedLines?null:i(d.output,b):null}(a,b);if(null!==d)return d;let f=h(),k=f.get(a);if(k)return i(await k,b);let l=c();f.set(a,l);try{let c=await l;return c.length>0&&j(a,c,e),i(c,b)}finally{f.delete(a)}}}};
|