commandmate 0.43.0 → 0.44.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +209 -209
- package/.next/app-path-routes-manifest.json +36 -36
- 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.nft.json +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.nft.json +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.js +2 -2
- package/.next/server/app/api/app/update/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/fs/browse/route.js.nft.json +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.js.nft.json +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 +2 -2
- 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.js.nft.json +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.js +1 -1
- package/.next/server/app/api/push/escalation/route.js.nft.json +1 -1
- package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/subscriptions/route.js.nft.json +1 -1
- package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/push/vapid/route.js +1 -1
- package/.next/server/app/api/push/vapid/route.js.nft.json +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.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.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.js.nft.json +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.js.nft.json +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.js.nft.json +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.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.js.nft.json +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.js.nft.json +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.js +1 -1
- package/.next/server/app/api/skills/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/installations/route.js +1 -1
- package/.next/server/app/api/skills/installations/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/operations/route.js +2 -2
- package/.next/server/app/api/skills/operations/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/reindex/route.js +1 -1
- package/.next/server/app/api/skills/reindex/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/skills/route.js +1 -1
- 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/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.js.nft.json +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.js.nft.json +1 -1
- package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/templates/route.js.nft.json +1 -1
- package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verification/runs/[runId]/route.js.nft.json +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.js.nft.json +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.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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.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.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.js.nft.json +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.js.nft.json +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.js +7 -7
- package/.next/server/app/api/worktrees/[id]/marp-render/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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 +1 -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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/search/route.js.nft.json +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 +1 -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 +2 -2
- 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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js.nft.json +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.js +1 -1
- package/.next/server/app/api/worktrees/[id]/skills/route.js.nft.json +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.nft.json +1 -1
- 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 +103 -1
- 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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js +1 -1
- package/.next/server/app/sessions/page.js.nft.json +1 -1
- package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/skills/[skillId]/page.js +1 -1
- package/.next/server/app/skills/[skillId]/page.js.nft.json +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.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +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 +3 -3
- package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page.js.nft.json +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +36 -36
- package/.next/server/chunks/1501.js +3 -3
- package/.next/server/chunks/2119.js +1 -1
- package/.next/server/chunks/2283.js +15 -0
- package/.next/server/chunks/2328.js +1 -1
- package/.next/server/chunks/2445.js +1 -1
- package/.next/server/chunks/4207.js +1 -1
- package/.next/server/chunks/4802.js +1 -1
- package/.next/server/chunks/488.js +1 -0
- package/.next/server/chunks/5326.js +1 -1
- package/.next/server/chunks/5456.js +1 -1
- package/.next/server/chunks/611.js +1 -1
- package/.next/server/chunks/6130.js +1 -1
- package/.next/server/chunks/6401.js +1 -1
- package/.next/server/chunks/6474.js +14 -0
- package/.next/server/chunks/650.js +1 -0
- package/.next/server/chunks/6781.js +1 -1
- package/.next/server/chunks/{5742.js → 6927.js} +1 -1
- package/.next/server/chunks/7506.js +1 -1
- package/.next/server/chunks/7905.js +1 -1
- package/.next/server/chunks/8543.js +1 -1
- package/.next/server/chunks/8581.js +1 -1
- package/.next/server/chunks/8728.js +2 -2
- package/.next/server/chunks/8782.js +1 -0
- package/.next/server/chunks/8791.js +1 -1
- package/.next/server/chunks/8918.js +105 -3
- package/.next/server/chunks/9130.js +1 -1
- package/.next/server/chunks/9390.js +1 -1
- package/.next/server/chunks/967.js +1 -1
- package/.next/server/chunks/9731.js +3 -3
- package/.next/server/chunks/9882.js +2 -2
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/pages/500.html +1 -1
- package/.next/server/pages-manifest.json +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/server/src/middleware.js +2 -2
- package/.next/server/src/middleware.js.map +1 -1
- package/.next/static/chunks/{1642-767aed8e7c61ef7f.js → 1642-fb2e176aaadbd137.js} +1 -1
- package/.next/static/chunks/2053-85a974ddfe7498fe.js +1 -0
- package/.next/static/chunks/{2407-940df9b11fadafc6.js → 2407-340774f1a24f2b45.js} +1 -1
- package/.next/static/chunks/{2619-a305ad4810f1393a.js → 2619-04bc32f026a0d946.js} +1 -1
- package/.next/static/chunks/5521-c358c31f60e5e689.js +1 -0
- package/.next/static/chunks/591-0a45801e83f26f24.js +1 -0
- package/.next/static/chunks/{8165-3525fb42f1b4976e.js → 8165-3853772f6ae1299b.js} +1 -1
- package/.next/static/chunks/{8566-a6a7c70558927410.js → 8566-aeda747542072ace.js} +1 -1
- package/.next/static/chunks/8811-29eaa24237f48558.js +1 -0
- package/.next/static/chunks/{9619-22adf5367c4b7080.js → 9619-84aced0846cbe3ac.js} +1 -1
- package/.next/static/chunks/app/{layout-057c850cd0df978e.js → layout-0fc249fb7de75a27.js} +1 -1
- package/.next/static/chunks/app/sessions/page-55297155e7bf01b9.js +1 -0
- package/.next/static/chunks/app/skills/[skillId]/{page-74aac15286504ef4.js → page-9ee7a381636e60cb.js} +1 -1
- package/.next/static/chunks/app/worktrees/[id]/page-d2103e0c25be83c8.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/terminal/{page-c601f3b3ece6557e.js → page-373ea37b16d930c7.js} +1 -1
- package/.next/static/css/38070d879efa1371.css +1 -0
- package/.next/trace +13 -13
- package/README.md +58 -620
- package/dist/cli/commands/capture.d.ts.map +1 -1
- package/dist/cli/commands/capture.js +11 -1
- package/dist/cli/commands/docs.d.ts.map +1 -1
- package/dist/cli/commands/docs.js +5 -0
- package/dist/cli/commands/remote.d.ts +24 -1
- package/dist/cli/commands/remote.d.ts.map +1 -1
- package/dist/cli/commands/remote.js +155 -6
- package/dist/cli/commands/respond.d.ts.map +1 -1
- package/dist/cli/commands/respond.js +255 -112
- package/dist/cli/commands/stop.d.ts.map +1 -1
- package/dist/cli/commands/stop.js +53 -1
- package/dist/cli/commands/sync.js +3 -3
- package/dist/cli/docs/setup-guide.d.ts +14 -0
- package/dist/cli/docs/setup-guide.d.ts.map +1 -0
- package/dist/cli/docs/setup-guide.js +366 -0
- package/dist/cli/types/api-responses.d.ts +11 -0
- package/dist/cli/types/api-responses.d.ts.map +1 -1
- package/dist/cli/types/index.d.ts +2 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/utils/daemon.d.ts +42 -2
- package/dist/cli/utils/daemon.d.ts.map +1 -1
- package/dist/cli/utils/daemon.js +222 -40
- package/dist/cli/utils/docs-reader.d.ts +6 -0
- package/dist/cli/utils/docs-reader.d.ts.map +1 -1
- package/dist/cli/utils/docs-reader.js +14 -13
- package/dist/cli/utils/npm-runner.d.ts +12 -0
- package/dist/cli/utils/npm-runner.d.ts.map +1 -1
- package/dist/cli/utils/npm-runner.js +36 -0
- package/dist/cli/utils/process-inspect.d.ts +55 -0
- package/dist/cli/utils/process-inspect.d.ts.map +1 -0
- package/dist/cli/utils/process-inspect.js +214 -0
- package/dist/cli/utils/remote-pairing.d.ts +68 -0
- package/dist/cli/utils/remote-pairing.d.ts.map +1 -0
- package/dist/cli/utils/remote-pairing.js +117 -0
- package/dist/cli/utils/server-identity.d.ts +50 -0
- package/dist/cli/utils/server-identity.d.ts.map +1 -0
- package/dist/cli/utils/server-identity.js +118 -0
- package/dist/cli/utils/server-ready.d.ts +13 -0
- package/dist/cli/utils/server-ready.d.ts.map +1 -1
- package/dist/cli/utils/server-ready.js +16 -0
- package/dist/lib/security/pairing-code.d.ts +2 -1
- package/dist/lib/security/pairing-code.d.ts.map +1 -1
- package/dist/server/locales/en/worktree.json +28 -6
- package/dist/server/locales/ja/worktree.json +28 -6
- package/dist/server/src/config/image-extensions.js +1 -0
- package/dist/server/src/lib/auto-yes-poller.js +22 -0
- package/dist/server/src/lib/cli-tools/command-code-plan-review.js +175 -0
- package/dist/server/src/lib/cli-tools/command-code.js +27 -2
- package/dist/server/src/lib/detection/cli-patterns.js +94 -1
- package/dist/server/src/lib/detection/tools/codex/detect.js +26 -0
- package/dist/server/src/lib/detection/tools/command-code/plan-review-state.js +75 -0
- package/dist/server/src/lib/hooks/sources/claude/transcript.js +33 -1
- package/dist/server/src/lib/session/claude-executor.js +2 -2
- package/dist/server/src/lib/session/claude-session.js +131 -15
- package/dist/server/src/lib/session/session-start-error.js +20 -0
- package/dist/server/src/lib/skills/agent-state-paths.js +39 -0
- package/dist/server/src/lib/skills/receipt-owned-paths.js +118 -0
- package/dist/server/src/lib/tmux/tmux.js +25 -0
- package/dist/server/src/lib/verification/env-clean-gate.js +195 -6
- package/dist/server/src/lib/verification/gate-runner.js +29 -2
- package/dist/server/src/lib/verification/scope-gate.js +58 -4
- package/docs/en/architecture.md +722 -0
- package/docs/en/user-guide/agents-guide.md +306 -0
- package/docs/en/user-guide/cli-setup-guide.md +676 -0
- package/docs/en/user-guide/cmate-schedules-guide.md +388 -0
- package/docs/en/user-guide/commands-guide.md +467 -0
- package/docs/en/user-guide/quick-start.md +231 -0
- package/docs/en/user-guide/webapp-guide.md +1020 -0
- package/docs/en/user-guide/workflow-examples.md +463 -0
- package/package.json +18 -7
- package/release-notes/0.44.0.json +82 -0
- package/.next/server/chunks/1990.js +0 -103
- package/.next/server/chunks/3707.js +0 -15
- package/.next/server/chunks/6491.js +0 -103
- package/.next/server/chunks/7004.js +0 -1
- package/.next/server/chunks/8673.js +0 -14
- package/.next/static/chunks/2039-117a361f795ddc4b.js +0 -1
- package/.next/static/chunks/2053-611dd27d42721b79.js +0 -1
- package/.next/static/chunks/3778-56f41fc2cecb8c43.js +0 -1
- package/.next/static/chunks/7705-1f58d4c03d991fcf.js +0 -1
- package/.next/static/chunks/app/sessions/page-1a8ba152bbcb9efb.js +0 -1
- package/.next/static/chunks/app/worktrees/[id]/page-eab0bf7564d3f9e2.js +0 -1
- package/.next/static/css/b3f433d52b8ed5c8.css +0 -1
- /package/.next/static/{BVkBYdceLRvMROqQIqeBx → wu7SUiHTirFcrpo5teyZ3}/_buildManifest.js +0 -0
- /package/.next/static/{BVkBYdceLRvMROqQIqeBx → wu7SUiHTirFcrpo5teyZ3}/_ssgManifest.js +0 -0
|
@@ -6,6 +6,12 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { DaemonStatus, StartOptions } from '../types';
|
|
8
8
|
import { ServerEnv } from './server-url';
|
|
9
|
+
/** How long stop() waits for the server's process group after SIGTERM before escalating. */
|
|
10
|
+
export declare const STOP_GRACE_TIMEOUT_MS = 10000;
|
|
11
|
+
/** How long stop() waits for the process group after SIGKILL. */
|
|
12
|
+
export declare const STOP_KILL_TIMEOUT_MS = 3000;
|
|
13
|
+
/** How long stop() waits for the recorded port to be released once the group is gone. */
|
|
14
|
+
export declare const PORT_RELEASE_TIMEOUT_MS = 3000;
|
|
9
15
|
/**
|
|
10
16
|
* Daemon manager for background server process
|
|
11
17
|
*/
|
|
@@ -35,12 +41,43 @@ export declare class DaemonManager {
|
|
|
35
41
|
* @throws Error if already running
|
|
36
42
|
*/
|
|
37
43
|
start(options: StartOptions): Promise<number>;
|
|
44
|
+
/** Throws when the recorded server is running, or an earlier server's group lives on. */
|
|
45
|
+
private assertNotRunning;
|
|
46
|
+
/** Builds the child process env from process.env, .env and the start options. */
|
|
47
|
+
private buildChildEnv;
|
|
48
|
+
/** Decides bind address, port and protocol, warning when exposed without protection. */
|
|
49
|
+
private resolveEndpoint;
|
|
50
|
+
/** Throws when something else already answers on the port the server would bind. */
|
|
51
|
+
private assertPortFree;
|
|
52
|
+
/** Persists the DaemonState; kills the spawned child and throws when the write fails. */
|
|
53
|
+
private recordState;
|
|
38
54
|
/**
|
|
39
55
|
* Stop daemon process
|
|
56
|
+
*
|
|
57
|
+
* Issue #3087: signals the daemon's whole process group, waits for every member to exit
|
|
58
|
+
* (escalating to SIGKILL after {@link STOP_GRACE_TIMEOUT_MS}), and then requires the recorded
|
|
59
|
+
* port to be free. "Stopped" is reported only when both hold. A recorded leader that already
|
|
60
|
+
* exited while its group lives on (the orphaned server of #3087) is stopped the same way.
|
|
61
|
+
*
|
|
40
62
|
* @param force Use SIGKILL instead of SIGTERM
|
|
41
|
-
* @returns true if stopped
|
|
63
|
+
* @returns true if stopped (or the PID file was stale), false if not running or not stopped
|
|
42
64
|
*/
|
|
43
65
|
stop(force?: boolean): Promise<boolean>;
|
|
66
|
+
/**
|
|
67
|
+
* Signal the daemon's process group and wait until no member is left.
|
|
68
|
+
*
|
|
69
|
+
* @returns true once the group is gone, false if it outlived SIGKILL
|
|
70
|
+
*/
|
|
71
|
+
private terminateGroup;
|
|
72
|
+
/**
|
|
73
|
+
* Issue #3087: confirm the port the server was started on is free again.
|
|
74
|
+
*
|
|
75
|
+
* A state file from before #1354 records no port; re-deriving one from a .env that may have
|
|
76
|
+
* changed since could blame an unrelated listener, so that legacy case is not checked.
|
|
77
|
+
*
|
|
78
|
+
* @returns true when the port is free (or unknown), false if something still listens on it
|
|
79
|
+
*/
|
|
80
|
+
private waitForPortRelease;
|
|
44
81
|
/**
|
|
45
82
|
* Get daemon status
|
|
46
83
|
* @returns Status object or null if no PID file
|
|
@@ -51,7 +88,10 @@ export declare class DaemonManager {
|
|
|
51
88
|
*/
|
|
52
89
|
isRunning(): Promise<boolean>;
|
|
53
90
|
/**
|
|
54
|
-
* Wait
|
|
91
|
+
* Wait until neither the recorded PID nor any member of its process group is alive
|
|
92
|
+
* (Issue #3087: the group, because the server outlives npm).
|
|
93
|
+
*
|
|
94
|
+
* @returns true if everything exited within the timeout
|
|
55
95
|
*/
|
|
56
96
|
private waitForExit;
|
|
57
97
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/daemon.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAOtD,OAAO,EAA2C,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/daemon.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAOtD,OAAO,EAA2C,SAAS,EAAE,MAAM,cAAc,CAAC;AASlF,4FAA4F;AAC5F,eAAO,MAAM,qBAAqB,QAAQ,CAAC;AAE3C,iEAAiE;AACjE,eAAO,MAAM,oBAAoB,OAAO,CAAC;AAEzC,yFAAyF;AACzF,eAAO,MAAM,uBAAuB,OAAO,CAAC;AAsE5C;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,YAAY,CAAC,CAAY;IAEjC;;;;OAIG;gBACS,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;IAMjD;;;;;;OAMG;IACH,eAAe,IAAI,SAAS;IAK5B;;;;;OAKG;IACG,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAoCnD,yFAAyF;IACzF,OAAO,CAAC,gBAAgB;IAiBxB,iFAAiF;IACjF,OAAO,CAAC,aAAa;IA2CrB,wFAAwF;IACxF,OAAO,CAAC,eAAe;IAoBvB,oFAAoF;YACtE,cAAc;IAgB5B,yFAAyF;IACzF,OAAO,CAAC,WAAW;IAkCnB;;;;;;;;;;OAUG;IACG,IAAI,CAAC,KAAK,GAAE,OAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAkDpD;;;;OAIG;YACW,cAAc;IAe5B;;;;;;;OAOG;YACW,kBAAkB;IAuBhC;;;OAGG;IACG,SAAS,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAmD/C;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAInC;;;;;OAKG;YACW,WAAW;CAc1B"}
|
package/dist/cli/utils/daemon.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* SF-1: SRP - Process management only (PID handling delegated to PidManager)
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.DaemonManager = void 0;
|
|
9
|
+
exports.DaemonManager = exports.PORT_RELEASE_TIMEOUT_MS = exports.STOP_KILL_TIMEOUT_MS = exports.STOP_GRACE_TIMEOUT_MS = void 0;
|
|
10
10
|
const child_process_1 = require("child_process");
|
|
11
11
|
const dotenv_1 = require("dotenv");
|
|
12
12
|
const pid_manager_1 = require("./pid-manager");
|
|
@@ -16,6 +16,81 @@ const package_info_1 = require("./package-info");
|
|
|
16
16
|
const security_messages_1 = require("../config/security-messages");
|
|
17
17
|
const logger_1 = require("./logger");
|
|
18
18
|
const server_url_1 = require("./server-url");
|
|
19
|
+
const server_ready_1 = require("./server-ready");
|
|
20
|
+
const process_inspect_1 = require("./process-inspect");
|
|
21
|
+
/** How long stop() waits for the server's process group after SIGTERM before escalating. */
|
|
22
|
+
exports.STOP_GRACE_TIMEOUT_MS = 10000;
|
|
23
|
+
/** How long stop() waits for the process group after SIGKILL. */
|
|
24
|
+
exports.STOP_KILL_TIMEOUT_MS = 3000;
|
|
25
|
+
/** How long stop() waits for the recorded port to be released once the group is gone. */
|
|
26
|
+
exports.PORT_RELEASE_TIMEOUT_MS = 3000;
|
|
27
|
+
/**
|
|
28
|
+
* Whether a signal can be delivered to `target` (a PID, or a negated PGID).
|
|
29
|
+
* EPERM means it exists but belongs to someone else, which still counts as alive.
|
|
30
|
+
*/
|
|
31
|
+
function signalTargetExists(target) {
|
|
32
|
+
try {
|
|
33
|
+
process.kill(target, 0);
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
return err.code === 'EPERM';
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Issue #3087: whether the process is still running code. `kill(pid, 0)` also succeeds for a
|
|
42
|
+
* zombie, which without an init process (a container whose PID 1 never reaps) stays forever.
|
|
43
|
+
*/
|
|
44
|
+
function processAlive(pid) {
|
|
45
|
+
return signalTargetExists(pid) && !(0, process_inspect_1.isZombieProcess)(pid);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Issue #3087: whether any process of the group the daemon was spawned into is still alive.
|
|
49
|
+
*
|
|
50
|
+
* `start()` spawns with `detached: true`, so the recorded PID is a process-group leader and the
|
|
51
|
+
* server it launches (npm → node server.js) inherits that PGID. A PGID is not reused while any
|
|
52
|
+
* member is alive, so a live group with the recorded ID is ours even after the leader exited.
|
|
53
|
+
*
|
|
54
|
+
* A group whose members are all zombies has exited. Only Linux can tell (via /proc); elsewhere,
|
|
55
|
+
* or when /proc shows no member at all, the signal-based answer stands.
|
|
56
|
+
*/
|
|
57
|
+
function processGroupExists(pid) {
|
|
58
|
+
if (pid <= 1 || !signalTargetExists(-pid)) {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
const states = (0, process_inspect_1.listProcessGroupStates)(pid);
|
|
62
|
+
return states === null || states.length === 0 || states.some((state) => !(0, process_inspect_1.isExitedState)(state));
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Issue #3087: signal the whole process group, not just the recorded PID.
|
|
66
|
+
*
|
|
67
|
+
* The recorded PID is npm's, and npm does not reliably forward signals to the server it runs
|
|
68
|
+
* (observed on Linux), so `kill(pid)` alone left the server listening as an orphan. Falls back
|
|
69
|
+
* to the bare PID when no such group exists (e.g. a server that is not a group leader).
|
|
70
|
+
*/
|
|
71
|
+
function signalProcessGroup(pid, signal) {
|
|
72
|
+
// Never negate 0 or 1: kill(0) signals our own group and kill(-1) every process we may signal.
|
|
73
|
+
if (pid <= 1) {
|
|
74
|
+
throw new Error(`Refusing to signal invalid PID ${pid}`);
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
process.kill(-pid, signal);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
if (err.code !== 'ESRCH') {
|
|
82
|
+
throw err;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
try {
|
|
86
|
+
process.kill(pid, signal);
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
if (err.code !== 'ESRCH') {
|
|
90
|
+
throw err;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
19
94
|
/**
|
|
20
95
|
* Daemon manager for background server process
|
|
21
96
|
*/
|
|
@@ -52,15 +127,46 @@ class DaemonManager {
|
|
|
52
127
|
* @throws Error if already running
|
|
53
128
|
*/
|
|
54
129
|
async start(options) {
|
|
55
|
-
|
|
56
|
-
const pid = this.pidManager.readPid();
|
|
57
|
-
throw new Error(`Server is already running (PID: ${pid})`);
|
|
58
|
-
}
|
|
130
|
+
this.assertNotRunning();
|
|
59
131
|
// Clean up stale PID file
|
|
60
132
|
this.pidManager.removePid();
|
|
61
133
|
const npmScript = options.dev ? 'dev' : 'start';
|
|
62
134
|
// Use package installation directory, not current working directory
|
|
63
135
|
const packageRoot = (0, paths_1.getPackageRoot)();
|
|
136
|
+
const env = this.buildChildEnv(options);
|
|
137
|
+
const { bindAddress, port, protocol } = this.resolveEndpoint(env);
|
|
138
|
+
await this.assertPortFree(bindAddress, port);
|
|
139
|
+
// Log startup with accurate settings (Stage 4 review: MF-2)
|
|
140
|
+
this.logger.info(`Starting server at ${protocol}://${bindAddress}:${port}`);
|
|
141
|
+
// Spawn detached process
|
|
142
|
+
const child = (0, child_process_1.spawn)('npm', ['run', npmScript], {
|
|
143
|
+
cwd: packageRoot,
|
|
144
|
+
env,
|
|
145
|
+
detached: true,
|
|
146
|
+
stdio: 'ignore',
|
|
147
|
+
});
|
|
148
|
+
// Unref to allow parent to exit
|
|
149
|
+
child.unref();
|
|
150
|
+
const pid = child.pid;
|
|
151
|
+
this.recordState(pid, env, bindAddress, port, protocol);
|
|
152
|
+
return pid;
|
|
153
|
+
}
|
|
154
|
+
/** Throws when the recorded server is running, or an earlier server's group lives on. */
|
|
155
|
+
assertNotRunning() {
|
|
156
|
+
if (this.pidManager.isProcessRunning()) {
|
|
157
|
+
const pid = this.pidManager.readPid();
|
|
158
|
+
throw new Error(`Server is already running (PID: ${pid})`);
|
|
159
|
+
}
|
|
160
|
+
// Issue #3087: a stale PID file is the only record of the PGID an orphaned server still runs
|
|
161
|
+
// in. Removing it here would leave `stop` with nothing to find that server by.
|
|
162
|
+
const stale = this.pidManager.readState();
|
|
163
|
+
if (stale !== null && !processAlive(stale.pid) && processGroupExists(stale.pid)) {
|
|
164
|
+
throw new Error(`Processes of an earlier server are still running (process group ${stale.pid}). ` +
|
|
165
|
+
'Run "commandmate stop" to stop them first.');
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/** Builds the child process env from process.env, .env and the start options. */
|
|
169
|
+
buildChildEnv(options) {
|
|
64
170
|
// Issue #125: Load .env file from correct location
|
|
65
171
|
const envPath = (0, env_setup_1.getEnvPath)();
|
|
66
172
|
const envResult = (0, dotenv_1.config)({ path: envPath });
|
|
@@ -94,6 +200,10 @@ class DaemonManager {
|
|
|
94
200
|
env[key] = process.env[key];
|
|
95
201
|
}
|
|
96
202
|
}
|
|
203
|
+
return env;
|
|
204
|
+
}
|
|
205
|
+
/** Decides bind address, port and protocol, warning when exposed without protection. */
|
|
206
|
+
resolveEndpoint(env) {
|
|
97
207
|
// Issue #179: Security warning for external access - recommend reverse proxy
|
|
98
208
|
const bindAddress = env.CM_BIND || '127.0.0.1';
|
|
99
209
|
const port = env.CM_PORT || '3000';
|
|
@@ -105,18 +215,24 @@ class DaemonManager {
|
|
|
105
215
|
if (bindAddress === '0.0.0.0' && !env.CM_AUTH_TOKEN_HASH && !env.CM_ALLOWED_IPS) {
|
|
106
216
|
console.log(security_messages_1.REVERSE_PROXY_WARNING);
|
|
107
217
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
218
|
+
return { bindAddress, port, protocol };
|
|
219
|
+
}
|
|
220
|
+
/** Throws when something else already answers on the port the server would bind. */
|
|
221
|
+
async assertPortFree(bindAddress, port) {
|
|
222
|
+
// Issue #3087: refuse to launch onto a port something else already answers on. The new
|
|
223
|
+
// server would fail to listen and exit, while every later TCP check (status, remote's
|
|
224
|
+
// readiness wait) would be answered by that other process and mistake it for this server.
|
|
225
|
+
const probeHost = bindAddress === '0.0.0.0' ? '127.0.0.1' : bindAddress;
|
|
226
|
+
if (await (0, server_ready_1.isPortInUse)(probeHost, parseInt(port, 10))) {
|
|
227
|
+
const listeners = (0, process_inspect_1.describeListeners)(parseInt(port, 10));
|
|
228
|
+
throw new Error(`Port ${port} on ${probeHost} is already in use by another process` +
|
|
229
|
+
`${listeners ? ` (${listeners})` : ''} ` +
|
|
230
|
+
'that is not the server recorded in the PID file (e.g. an earlier server left running). ' +
|
|
231
|
+
'Stop that process or choose another port.');
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/** Persists the DaemonState; kills the spawned child and throws when the write fails. */
|
|
235
|
+
recordState(pid, env, bindAddress, port, protocol) {
|
|
120
236
|
// Issue #1354/#1355/#1358: persist the daemon's version, effective settings, and a
|
|
121
237
|
// process-identity signature so status/stop/start can report and verify the actual server,
|
|
122
238
|
// not re-derive it from a possibly-diverged .env. The port/protocol/auth recorded here are
|
|
@@ -142,36 +258,102 @@ class DaemonManager {
|
|
|
142
258
|
}
|
|
143
259
|
throw new Error('Failed to write PID file - server may already be running');
|
|
144
260
|
}
|
|
145
|
-
return pid;
|
|
146
261
|
}
|
|
147
262
|
/**
|
|
148
263
|
* Stop daemon process
|
|
264
|
+
*
|
|
265
|
+
* Issue #3087: signals the daemon's whole process group, waits for every member to exit
|
|
266
|
+
* (escalating to SIGKILL after {@link STOP_GRACE_TIMEOUT_MS}), and then requires the recorded
|
|
267
|
+
* port to be free. "Stopped" is reported only when both hold. A recorded leader that already
|
|
268
|
+
* exited while its group lives on (the orphaned server of #3087) is stopped the same way.
|
|
269
|
+
*
|
|
149
270
|
* @param force Use SIGKILL instead of SIGTERM
|
|
150
|
-
* @returns true if stopped
|
|
271
|
+
* @returns true if stopped (or the PID file was stale), false if not running or not stopped
|
|
151
272
|
*/
|
|
152
273
|
async stop(force = false) {
|
|
153
|
-
const
|
|
154
|
-
if (
|
|
274
|
+
const state = this.pidManager.readState();
|
|
275
|
+
if (state === null) {
|
|
155
276
|
return false;
|
|
156
277
|
}
|
|
278
|
+
const pid = state.pid;
|
|
279
|
+
const signal = force ? 'SIGKILL' : 'SIGTERM';
|
|
157
280
|
if (!this.pidManager.isProcessRunning()) {
|
|
158
|
-
//
|
|
159
|
-
|
|
160
|
-
|
|
281
|
+
// The leader is gone. Only when its PID is entirely unused (not reused by an unrelated
|
|
282
|
+
// process) can a live group with that ID be the server it left behind.
|
|
283
|
+
const orphanedGroup = !processAlive(pid) && processGroupExists(pid);
|
|
284
|
+
if (!orphanedGroup) {
|
|
285
|
+
// Process not running - clean up stale PID file
|
|
286
|
+
this.pidManager.removePid();
|
|
287
|
+
return true;
|
|
288
|
+
}
|
|
289
|
+
this.logger.warn(`The recorded process ${pid} has exited but its server processes are still running; stopping them.`);
|
|
161
290
|
}
|
|
162
|
-
const signal = force ? 'SIGKILL' : 'SIGTERM';
|
|
163
291
|
try {
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
292
|
+
const exited = await this.terminateGroup(pid, signal);
|
|
293
|
+
if (!exited) {
|
|
294
|
+
// Issue #3087: where zombies cannot be told apart (no /proc), a group can look alive
|
|
295
|
+
// after it stopped serving. The port is what was at stake, so a released port decides.
|
|
296
|
+
if (state.port !== undefined && (await this.waitForPortRelease(state))) {
|
|
297
|
+
this.logger.warn(`Process group ${pid} did not report exit, but port ${state.port} has been released; ` +
|
|
298
|
+
'treating the server as stopped.');
|
|
299
|
+
this.pidManager.removePid();
|
|
300
|
+
return true;
|
|
301
|
+
}
|
|
302
|
+
this.logger.warn(`Process group ${pid} did not exit.`);
|
|
303
|
+
return false;
|
|
304
|
+
}
|
|
305
|
+
// Clean up PID file: nothing this file describes is alive any more.
|
|
168
306
|
this.pidManager.removePid();
|
|
169
|
-
return
|
|
307
|
+
return await this.waitForPortRelease(state);
|
|
170
308
|
}
|
|
171
309
|
catch {
|
|
172
310
|
return false;
|
|
173
311
|
}
|
|
174
312
|
}
|
|
313
|
+
/**
|
|
314
|
+
* Signal the daemon's process group and wait until no member is left.
|
|
315
|
+
*
|
|
316
|
+
* @returns true once the group is gone, false if it outlived SIGKILL
|
|
317
|
+
*/
|
|
318
|
+
async terminateGroup(pid, signal) {
|
|
319
|
+
signalProcessGroup(pid, signal);
|
|
320
|
+
if (await this.waitForExit(pid, signal === 'SIGKILL' ? exports.STOP_KILL_TIMEOUT_MS : exports.STOP_GRACE_TIMEOUT_MS)) {
|
|
321
|
+
return true;
|
|
322
|
+
}
|
|
323
|
+
if (signal === 'SIGKILL') {
|
|
324
|
+
return false;
|
|
325
|
+
}
|
|
326
|
+
this.logger.warn(`Server (process group ${pid}) did not exit within ${exports.STOP_GRACE_TIMEOUT_MS / 1000}s; sending SIGKILL.`);
|
|
327
|
+
signalProcessGroup(pid, 'SIGKILL');
|
|
328
|
+
return this.waitForExit(pid, exports.STOP_KILL_TIMEOUT_MS);
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Issue #3087: confirm the port the server was started on is free again.
|
|
332
|
+
*
|
|
333
|
+
* A state file from before #1354 records no port; re-deriving one from a .env that may have
|
|
334
|
+
* changed since could blame an unrelated listener, so that legacy case is not checked.
|
|
335
|
+
*
|
|
336
|
+
* @returns true when the port is free (or unknown), false if something still listens on it
|
|
337
|
+
*/
|
|
338
|
+
async waitForPortRelease(state) {
|
|
339
|
+
if (state.port === undefined) {
|
|
340
|
+
return true;
|
|
341
|
+
}
|
|
342
|
+
const bind = state.bind ?? '127.0.0.1';
|
|
343
|
+
const host = bind === '0.0.0.0' ? '127.0.0.1' : bind;
|
|
344
|
+
const deadline = Date.now() + exports.PORT_RELEASE_TIMEOUT_MS;
|
|
345
|
+
for (;;) {
|
|
346
|
+
if (!(await (0, server_ready_1.isPortInUse)(host, state.port, 500))) {
|
|
347
|
+
return true;
|
|
348
|
+
}
|
|
349
|
+
if (Date.now() >= deadline) {
|
|
350
|
+
this.logger.warn(`Port ${state.port} on ${host} is still in use after the server stopped; ` +
|
|
351
|
+
'another process is listening on it.');
|
|
352
|
+
return false;
|
|
353
|
+
}
|
|
354
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
355
|
+
}
|
|
356
|
+
}
|
|
175
357
|
/**
|
|
176
358
|
* Get daemon status
|
|
177
359
|
* @returns Status object or null if no PID file
|
|
@@ -227,23 +409,23 @@ class DaemonManager {
|
|
|
227
409
|
return this.pidManager.isProcessRunning();
|
|
228
410
|
}
|
|
229
411
|
/**
|
|
230
|
-
* Wait
|
|
412
|
+
* Wait until neither the recorded PID nor any member of its process group is alive
|
|
413
|
+
* (Issue #3087: the group, because the server outlives npm).
|
|
414
|
+
*
|
|
415
|
+
* @returns true if everything exited within the timeout
|
|
231
416
|
*/
|
|
232
417
|
async waitForExit(pid, timeout) {
|
|
233
418
|
const startTime = Date.now();
|
|
234
419
|
const checkInterval = 100;
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
// Process still exists, wait
|
|
239
|
-
await new Promise(resolve => setTimeout(resolve, checkInterval));
|
|
420
|
+
for (;;) {
|
|
421
|
+
if (!processAlive(pid) && !processGroupExists(pid)) {
|
|
422
|
+
return true;
|
|
240
423
|
}
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
return;
|
|
424
|
+
if (Date.now() - startTime >= timeout) {
|
|
425
|
+
return false;
|
|
244
426
|
}
|
|
427
|
+
await new Promise(resolve => setTimeout(resolve, checkInterval));
|
|
245
428
|
}
|
|
246
|
-
// Timeout - process may still be running
|
|
247
429
|
}
|
|
248
430
|
}
|
|
249
431
|
exports.DaemonManager = DaemonManager;
|
|
@@ -13,6 +13,12 @@
|
|
|
13
13
|
*
|
|
14
14
|
* @module docs-reader
|
|
15
15
|
*/
|
|
16
|
+
/**
|
|
17
|
+
* Whitelist of available documentation sections.
|
|
18
|
+
* [C-CONS-003] Only files listed here can be accessed via the docs command.
|
|
19
|
+
* Path traversal attempts are prevented by validating section names against this map.
|
|
20
|
+
*/
|
|
21
|
+
export declare const SECTION_MAP: Record<string, string>;
|
|
16
22
|
/**
|
|
17
23
|
* Get list of available documentation section names.
|
|
18
24
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs-reader.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/docs-reader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"docs-reader.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/docs-reader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAU9C,CAAC;AAwCF;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAE/C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAYnD;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAsCvF"}
|
|
@@ -48,6 +48,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
48
48
|
};
|
|
49
49
|
})();
|
|
50
50
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
51
|
+
exports.SECTION_MAP = void 0;
|
|
51
52
|
exports.getAvailableSections = getAvailableSections;
|
|
52
53
|
exports.isValidSection = isValidSection;
|
|
53
54
|
exports.readSection = readSection;
|
|
@@ -60,15 +61,15 @@ const agent_operations_1 = require("../docs/agent-operations");
|
|
|
60
61
|
* [C-CONS-003] Only files listed here can be accessed via the docs command.
|
|
61
62
|
* Path traversal attempts are prevented by validating section names against this map.
|
|
62
63
|
*/
|
|
63
|
-
|
|
64
|
-
'quick-start': 'docs/user-guide/quick-start.md',
|
|
65
|
-
'commands': 'docs/user-guide/commands-guide.md',
|
|
66
|
-
'webapp': 'docs/user-guide/webapp-guide.md',
|
|
67
|
-
'workflow-examples': 'docs/user-guide/workflow-examples.md',
|
|
68
|
-
'cli-setup': 'docs/user-guide/cli-setup-guide.md',
|
|
69
|
-
'agents': 'docs/user-guide/agents-guide.md',
|
|
70
|
-
'cmate-schedules': 'docs/user-guide/cmate-schedules-guide.md',
|
|
71
|
-
'architecture': 'docs/architecture.md',
|
|
64
|
+
exports.SECTION_MAP = {
|
|
65
|
+
'quick-start': 'docs/en/user-guide/quick-start.md',
|
|
66
|
+
'commands': 'docs/en/user-guide/commands-guide.md',
|
|
67
|
+
'webapp': 'docs/en/user-guide/webapp-guide.md',
|
|
68
|
+
'workflow-examples': 'docs/en/user-guide/workflow-examples.md',
|
|
69
|
+
'cli-setup': 'docs/en/user-guide/cli-setup-guide.md',
|
|
70
|
+
'agents': 'docs/en/user-guide/agents-guide.md',
|
|
71
|
+
'cmate-schedules': 'docs/en/user-guide/cmate-schedules-guide.md',
|
|
72
|
+
'architecture': 'docs/en/architecture.md',
|
|
72
73
|
'readme': 'README.md',
|
|
73
74
|
};
|
|
74
75
|
/**
|
|
@@ -111,13 +112,13 @@ function resolvePackageRoot() {
|
|
|
111
112
|
* Get list of available documentation section names.
|
|
112
113
|
*/
|
|
113
114
|
function getAvailableSections() {
|
|
114
|
-
return [...Object.keys(SECTION_MAP), ...Object.keys(EMBEDDED_SECTIONS)];
|
|
115
|
+
return [...Object.keys(exports.SECTION_MAP), ...Object.keys(EMBEDDED_SECTIONS)];
|
|
115
116
|
}
|
|
116
117
|
/**
|
|
117
118
|
* Check if a section name is valid (exists in the whitelist or embedded).
|
|
118
119
|
*/
|
|
119
120
|
function isValidSection(section) {
|
|
120
|
-
return section in SECTION_MAP || section in EMBEDDED_SECTIONS;
|
|
121
|
+
return section in exports.SECTION_MAP || section in EMBEDDED_SECTIONS;
|
|
121
122
|
}
|
|
122
123
|
/**
|
|
123
124
|
* Read the content of a documentation section.
|
|
@@ -136,7 +137,7 @@ function readSection(section) {
|
|
|
136
137
|
}
|
|
137
138
|
// File-based sections
|
|
138
139
|
const packageRoot = resolvePackageRoot();
|
|
139
|
-
const filePath = path.join(packageRoot, SECTION_MAP[section]);
|
|
140
|
+
const filePath = path.join(packageRoot, exports.SECTION_MAP[section]);
|
|
140
141
|
return fs.readFileSync(filePath, 'utf-8');
|
|
141
142
|
}
|
|
142
143
|
/**
|
|
@@ -154,7 +155,7 @@ function searchDocs(query) {
|
|
|
154
155
|
const packageRoot = resolvePackageRoot();
|
|
155
156
|
const lowerQuery = query.toLowerCase();
|
|
156
157
|
// Search file-based sections
|
|
157
|
-
for (const [section, relativePath] of Object.entries(SECTION_MAP)) {
|
|
158
|
+
for (const [section, relativePath] of Object.entries(exports.SECTION_MAP)) {
|
|
158
159
|
const filePath = path.join(packageRoot, relativePath);
|
|
159
160
|
try {
|
|
160
161
|
const content = fs.readFileSync(filePath, 'utf-8');
|
|
@@ -47,6 +47,18 @@ export interface NpmInstallResult {
|
|
|
47
47
|
* @returns The resolved version, or a classified failure
|
|
48
48
|
*/
|
|
49
49
|
export declare function viewLatestVersion(packageName: string): NpmViewResult;
|
|
50
|
+
/**
|
|
51
|
+
* Non-blocking twin of {@link viewLatestVersion}, for the server. [Issue #3110]
|
|
52
|
+
*
|
|
53
|
+
* The update-check route asks npm whether a release GitHub already announced
|
|
54
|
+
* has reached the registry. `spawnSync` would stall the server's event loop for
|
|
55
|
+
* the whole network round trip, so this uses `execFile` (array args, no shell —
|
|
56
|
+
* MF-SEC-1 holds) under the same timeout and failure classification.
|
|
57
|
+
*
|
|
58
|
+
* @param packageName - Package name (e.g. `commandmate`)
|
|
59
|
+
* @returns The resolved version, or a classified failure. Never rejects.
|
|
60
|
+
*/
|
|
61
|
+
export declare function viewLatestVersionAsync(packageName: string): Promise<NpmViewResult>;
|
|
50
62
|
/**
|
|
51
63
|
* Install the latest published version of a package globally.
|
|
52
64
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"npm-runner.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/npm-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,wFAAwF;AACxF,eAAO,MAAM,mBAAmB,QAAS,CAAC;AAE1C,mFAAmF;AACnF,eAAO,MAAM,mBAAmB,OAAQ,CAAC;AAEzC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,kCAAkC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,0DAA0D;IAC1D,gBAAgB,EAAE,OAAO,CAAC;IAC1B,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,CA+BpE;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB,CAwCzE;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAsBrF"}
|
|
1
|
+
{"version":3,"file":"npm-runner.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/npm-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,wFAAwF;AACxF,eAAO,MAAM,mBAAmB,QAAS,CAAC;AAE1C,mFAAmF;AACnF,eAAO,MAAM,mBAAmB,OAAQ,CAAC;AAEzC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,kCAAkC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,0DAA0D;IAC1D,gBAAgB,EAAE,OAAO,CAAC;IAC1B,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,CA+BpE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA6BlF;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB,CAwCzE;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAsBrF"}
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
19
|
exports.NPM_ROOT_TIMEOUT_MS = exports.NPM_VIEW_TIMEOUT_MS = void 0;
|
|
20
20
|
exports.viewLatestVersion = viewLatestVersion;
|
|
21
|
+
exports.viewLatestVersionAsync = viewLatestVersionAsync;
|
|
21
22
|
exports.installGlobalLatest = installGlobalLatest;
|
|
22
23
|
exports.findGlobalInstallation = findGlobalInstallation;
|
|
23
24
|
const child_process_1 = require("child_process");
|
|
@@ -61,6 +62,41 @@ function viewLatestVersion(packageName) {
|
|
|
61
62
|
}
|
|
62
63
|
return { success: true, version };
|
|
63
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* Non-blocking twin of {@link viewLatestVersion}, for the server. [Issue #3110]
|
|
67
|
+
*
|
|
68
|
+
* The update-check route asks npm whether a release GitHub already announced
|
|
69
|
+
* has reached the registry. `spawnSync` would stall the server's event loop for
|
|
70
|
+
* the whole network round trip, so this uses `execFile` (array args, no shell —
|
|
71
|
+
* MF-SEC-1 holds) under the same timeout and failure classification.
|
|
72
|
+
*
|
|
73
|
+
* @param packageName - Package name (e.g. `commandmate`)
|
|
74
|
+
* @returns The resolved version, or a classified failure. Never rejects.
|
|
75
|
+
*/
|
|
76
|
+
function viewLatestVersionAsync(packageName) {
|
|
77
|
+
return new Promise((resolve) => {
|
|
78
|
+
(0, child_process_1.execFile)('npm', ['view', packageName, 'version'], { encoding: 'utf-8', timeout: exports.NPM_VIEW_TIMEOUT_MS }, (error, stdout, stderr) => {
|
|
79
|
+
if (error) {
|
|
80
|
+
const errnoError = error;
|
|
81
|
+
if (errnoError.code === 'ENOENT') {
|
|
82
|
+
resolve({
|
|
83
|
+
success: false,
|
|
84
|
+
error: 'npm command not found. Install Node.js/npm and try again.',
|
|
85
|
+
});
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
resolve({ success: false, error: readStream(stderr) || errnoError.message });
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const version = readStream(stdout);
|
|
92
|
+
if (!version) {
|
|
93
|
+
resolve({ success: false, error: 'npm view returned no version' });
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
resolve({ success: true, version });
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
}
|
|
64
100
|
/**
|
|
65
101
|
* Install the latest published version of a package globally.
|
|
66
102
|
*
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Best-effort process inspection for stop/start (Issue #3087)
|
|
3
|
+
*
|
|
4
|
+
* - Zombies: `kill(pid, 0)` succeeds for a zombie, so without an init process
|
|
5
|
+
* (a container whose PID 1 never reaps) a stopped server's group looked alive
|
|
6
|
+
* forever. On Linux, /proc tells a zombie apart; elsewhere nothing is known
|
|
7
|
+
* and callers keep their signal-based answer.
|
|
8
|
+
* - Listeners: when something answers on the configured port but is not the
|
|
9
|
+
* server the PID file describes, the user is told which PID holds it.
|
|
10
|
+
*
|
|
11
|
+
* Every function here is read-only and never throws.
|
|
12
|
+
*
|
|
13
|
+
* @module process-inspect
|
|
14
|
+
*/
|
|
15
|
+
interface ProcStat {
|
|
16
|
+
state: string;
|
|
17
|
+
pgrp: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Parse `/proc/<pid>/stat`. The command name is parenthesised and may itself
|
|
21
|
+
* contain spaces or parentheses, so fields are read after the LAST `)`.
|
|
22
|
+
*/
|
|
23
|
+
export declare function parseProcStat(content: string): ProcStat | null;
|
|
24
|
+
/**
|
|
25
|
+
* @returns true when /proc reports the process as a zombie (or dead); false when it is
|
|
26
|
+
* running, absent, or the platform has no /proc
|
|
27
|
+
*/
|
|
28
|
+
export declare function isZombieProcess(pid: number): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* States of every process whose process group is `pgid`.
|
|
31
|
+
*
|
|
32
|
+
* @returns the state letters (possibly empty), or null when /proc cannot be read
|
|
33
|
+
* (non-Linux), in which case nothing is known
|
|
34
|
+
*/
|
|
35
|
+
export declare function listProcessGroupStates(pgid: number): string[] | null;
|
|
36
|
+
/** @returns true when a /proc state letter means the process no longer runs */
|
|
37
|
+
export declare function isExitedState(state: string): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* PIDs listening on a TCP port: /proc on Linux, `lsof` elsewhere.
|
|
40
|
+
*
|
|
41
|
+
* @returns the PIDs found; empty when none are visible (another user's process, or no tool)
|
|
42
|
+
*/
|
|
43
|
+
export declare function findListeningPids(port: number): number[];
|
|
44
|
+
/**
|
|
45
|
+
* One-line description of a process for an error message.
|
|
46
|
+
*
|
|
47
|
+
* @returns the command line, or null when it cannot be read
|
|
48
|
+
*/
|
|
49
|
+
export declare function describeProcess(pid: number): string | null;
|
|
50
|
+
/**
|
|
51
|
+
* "PID 875 (node dist/server/server.js), PID 876" — or null when no PID is visible.
|
|
52
|
+
*/
|
|
53
|
+
export declare function describeListeners(port: number): string | null;
|
|
54
|
+
export {};
|
|
55
|
+
//# sourceMappingURL=process-inspect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-inspect.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/process-inspect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAQH,UAAU,QAAQ;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAQ9D;AAUD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAIpD;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAmBpE;AAED,+EAA+E;AAC/E,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEpD;AA0ED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAExD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAe1D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS7D"}
|