@alexjbarnes/cockpit 0.1.1 → 0.2.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-path-routes-manifest.json +12 -0
- package/.next/build-manifest.json +3 -3
- package/.next/prerender-manifest.json +51 -3
- package/.next/react-loadable-manifest.json +2 -2
- package/.next/routes-manifest.json +76 -0
- package/.next/server/app/(app)/agents/[name]/page.js +3 -3
- package/.next/server/app/(app)/agents/[name]/page.js.nft.json +1 -1
- package/.next/server/app/(app)/agents/[name]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/agents/page.js +2 -2
- package/.next/server/app/(app)/agents/page.js.nft.json +1 -1
- package/.next/server/app/(app)/agents/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/changes/page.js +2 -2
- package/.next/server/app/(app)/changes/page.js.nft.json +1 -1
- package/.next/server/app/(app)/changes/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/claude-md/edit/page.js +2 -2
- package/.next/server/app/(app)/claude-md/edit/page.js.nft.json +1 -1
- package/.next/server/app/(app)/claude-md/edit/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/claude-md/page.js +2 -2
- package/.next/server/app/(app)/claude-md/page.js.nft.json +1 -1
- package/.next/server/app/(app)/claude-md/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/commands/[name]/page.js +3 -3
- package/.next/server/app/(app)/commands/[name]/page.js.nft.json +1 -1
- package/.next/server/app/(app)/commands/[name]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/commands/page.js +2 -2
- package/.next/server/app/(app)/commands/page.js.nft.json +1 -1
- package/.next/server/app/(app)/commands/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/files/page.js +2 -2
- package/.next/server/app/(app)/files/page.js.nft.json +1 -1
- package/.next/server/app/(app)/files/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/hooks/[event]/page.js +3 -3
- package/.next/server/app/(app)/hooks/[event]/page.js.nft.json +1 -1
- package/.next/server/app/(app)/hooks/[event]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/hooks/page.js +2 -2
- package/.next/server/app/(app)/hooks/page.js.nft.json +1 -1
- package/.next/server/app/(app)/hooks/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/inbox/[id]/page.js +2 -0
- package/.next/server/app/(app)/inbox/[id]/page.js.nft.json +1 -0
- package/.next/server/app/(app)/inbox/[id]/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/inbox/page.js +2 -0
- package/.next/server/app/(app)/inbox/page.js.nft.json +1 -0
- package/.next/server/app/(app)/inbox/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/jobs/[id]/edit/page.js +2 -2
- package/.next/server/app/(app)/jobs/[id]/edit/page.js.nft.json +1 -1
- package/.next/server/app/(app)/jobs/[id]/edit/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/jobs/[id]/page.js +2 -2
- package/.next/server/app/(app)/jobs/[id]/page.js.nft.json +1 -1
- package/.next/server/app/(app)/jobs/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/jobs/[id]/runs/[runId]/page.js +2 -2
- package/.next/server/app/(app)/jobs/[id]/runs/[runId]/page.js.nft.json +1 -1
- package/.next/server/app/(app)/jobs/[id]/runs/[runId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/jobs/page.js +2 -2
- package/.next/server/app/(app)/jobs/page.js.nft.json +1 -1
- package/.next/server/app/(app)/jobs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/mcp-servers/[name]/page.js +2 -2
- package/.next/server/app/(app)/mcp-servers/[name]/page.js.nft.json +1 -1
- package/.next/server/app/(app)/mcp-servers/[name]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/mcp-servers/page.js +2 -2
- package/.next/server/app/(app)/mcp-servers/page.js.nft.json +1 -1
- package/.next/server/app/(app)/mcp-servers/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/page.js +2 -2
- package/.next/server/app/(app)/page.js.nft.json +1 -1
- package/.next/server/app/(app)/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/reviews/[owner]/[repo]/[number]/page.js +9 -9
- package/.next/server/app/(app)/reviews/[owner]/[repo]/[number]/page.js.nft.json +1 -1
- package/.next/server/app/(app)/reviews/[owner]/[repo]/[number]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/reviews/[owner]/[repo]/page.js +2 -2
- package/.next/server/app/(app)/reviews/[owner]/[repo]/page.js.nft.json +1 -1
- package/.next/server/app/(app)/reviews/[owner]/[repo]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/reviews/page.js +2 -2
- package/.next/server/app/(app)/reviews/page.js.nft.json +1 -1
- package/.next/server/app/(app)/reviews/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/sessions/[id]/page.js +2 -2
- package/.next/server/app/(app)/sessions/[id]/page.js.nft.json +1 -1
- package/.next/server/app/(app)/sessions/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/settings/notifications/page.js +2 -0
- package/.next/server/app/(app)/settings/notifications/page.js.nft.json +1 -0
- package/.next/server/app/(app)/settings/notifications/page_client-reference-manifest.js +1 -0
- package/.next/server/app/(app)/settings/page.js +2 -2
- package/.next/server/app/(app)/settings/page.js.nft.json +1 -1
- package/.next/server/app/(app)/settings/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/skills/[name]/page.js +3 -3
- package/.next/server/app/(app)/skills/[name]/page.js.nft.json +1 -1
- package/.next/server/app/(app)/skills/[name]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/(app)/skills/page.js +2 -2
- package/.next/server/app/(app)/skills/page.js.nft.json +1 -1
- package/.next/server/app/(app)/skills/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_global-error/page.js +3 -3
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page.js +2 -2
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +2 -2
- package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/agents.html +1 -1
- package/.next/server/app/agents.rsc +4 -4
- package/.next/server/app/agents.segments/!KGFwcCk/agents/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/agents.segments/!KGFwcCk/agents.segment.rsc +1 -1
- package/.next/server/app/agents.segments/!KGFwcCk.segment.rsc +2 -2
- package/.next/server/app/agents.segments/_full.segment.rsc +4 -4
- package/.next/server/app/agents.segments/_head.segment.rsc +1 -1
- package/.next/server/app/agents.segments/_index.segment.rsc +2 -2
- package/.next/server/app/agents.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/api/agents/[name]/route.js +1 -1
- package/.next/server/app/api/agents/route.js +1 -1
- package/.next/server/app/api/auth/check/route.js +1 -1
- package/.next/server/app/api/auth/login/route.js +1 -1
- package/.next/server/app/api/auth/setup/route.js +1 -1
- package/.next/server/app/api/auth/ws-token/route.js +1 -1
- package/.next/server/app/api/btw/route.js +2 -2
- package/.next/server/app/api/claude-md/route.js +1 -1
- package/.next/server/app/api/commands/[name]/route.js +1 -1
- package/.next/server/app/api/commands/route.js +1 -1
- package/.next/server/app/api/defaults/route.js +1 -1
- package/.next/server/app/api/filesystem/browse/route.js +1 -1
- package/.next/server/app/api/filesystem/files/route.js +1 -1
- package/.next/server/app/api/filesystem/mkdir/route.js +1 -1
- package/.next/server/app/api/filesystem/read/route.js +1 -1
- package/.next/server/app/api/git/clone/route.js +1 -1
- package/.next/server/app/api/git/commit/route.js +1 -1
- package/.next/server/app/api/git/diff/route.js +1 -1
- package/.next/server/app/api/git/discard/route.js +1 -1
- package/.next/server/app/api/git/generate-message/route.js +2 -2
- package/.next/server/app/api/git/push/route.js +1 -1
- package/.next/server/app/api/git/status/route.js +1 -1
- package/.next/server/app/api/github/file-content/route.js +1 -1
- package/.next/server/app/api/github/orgs/route.js +1 -1
- package/.next/server/app/api/github/prs/checks/route.js +1 -1
- package/.next/server/app/api/github/prs/diff/route.js +1 -1
- package/.next/server/app/api/github/prs/review/route.js +1 -1
- package/.next/server/app/api/github/prs/route.js +1 -1
- package/.next/server/app/api/github/prs/view/route.js +1 -1
- package/.next/server/app/api/github/repos/route.js +1 -1
- package/.next/server/app/api/github/review-session/route.js +1 -1
- package/.next/server/app/api/health/route.js +1 -1
- package/.next/server/app/api/hooks/route.js +1 -1
- package/.next/server/app/api/inbox/[id]/route.js +5 -0
- package/.next/server/app/api/inbox/[id]/route.js.nft.json +1 -0
- package/.next/server/app/api/inbox/[id]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/inbox/route.js +5 -0
- package/.next/server/app/api/inbox/route.js.nft.json +1 -0
- package/.next/server/app/api/inbox/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/jobs/[id]/route.js +1 -1
- package/.next/server/app/api/jobs/[id]/runs/[runId]/route.js +1 -1
- package/.next/server/app/api/jobs/[id]/runs/[runId]/transcript/route.js +1 -1
- package/.next/server/app/api/jobs/[id]/runs/route.js +1 -1
- package/.next/server/app/api/jobs/[id]/trigger/route.js +1 -1
- package/.next/server/app/api/jobs/mcp-discover/route.js +1 -1
- package/.next/server/app/api/jobs/route.js +1 -1
- package/.next/server/app/api/jobs/status/route.js +1 -1
- package/.next/server/app/api/mcp-servers/[name]/route.js +1 -1
- package/.next/server/app/api/mcp-servers/[name]/test/route.js +1 -1
- package/.next/server/app/api/mcp-servers/route.js +1 -1
- package/.next/server/app/api/notifications/route.js +1 -0
- package/.next/server/app/api/notifications/route.js.nft.json +1 -0
- package/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/notifications/test/route.js +5 -0
- package/.next/server/app/api/notifications/test/route.js.nft.json +1 -0
- package/.next/server/app/api/notifications/test/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/reviews/pinned/route.js +1 -0
- package/.next/server/app/api/reviews/pinned/route.js.nft.json +1 -0
- package/.next/server/app/api/reviews/pinned/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/[id]/context/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/mcp/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/search/route.js +1 -1
- package/.next/server/app/api/sessions/bulk-delete/route.js +1 -0
- package/.next/server/app/api/sessions/bulk-delete/route.js.nft.json +1 -0
- package/.next/server/app/api/sessions/bulk-delete/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/by-ids/route.js +1 -0
- package/.next/server/app/api/sessions/by-ids/route.js.nft.json +1 -0
- package/.next/server/app/api/sessions/by-ids/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/group/route.js +1 -0
- package/.next/server/app/api/sessions/group/route.js.nft.json +1 -0
- package/.next/server/app/api/sessions/group/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/pinned/route.js +1 -1
- package/.next/server/app/api/sessions/route.js +1 -1
- package/.next/server/app/api/sessions/search/route.js +1 -0
- package/.next/server/app/api/sessions/search/route.js.nft.json +1 -0
- package/.next/server/app/api/sessions/search/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/skills/[name]/route.js +1 -1
- package/.next/server/app/api/skills/route.js +1 -1
- package/.next/server/app/api/usage/route.js +1 -1
- package/.next/server/app/api/version/cockpit/route.js +1 -1
- package/.next/server/app/api/version/route.js +2 -2
- package/.next/server/app/changes.html +1 -1
- package/.next/server/app/changes.rsc +4 -4
- package/.next/server/app/changes.segments/!KGFwcCk/changes/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/changes.segments/!KGFwcCk/changes.segment.rsc +1 -1
- package/.next/server/app/changes.segments/!KGFwcCk.segment.rsc +2 -2
- package/.next/server/app/changes.segments/_full.segment.rsc +4 -4
- package/.next/server/app/changes.segments/_head.segment.rsc +1 -1
- package/.next/server/app/changes.segments/_index.segment.rsc +2 -2
- package/.next/server/app/changes.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/claude-md/edit.html +1 -1
- package/.next/server/app/claude-md/edit.rsc +4 -4
- package/.next/server/app/claude-md/edit.segments/!KGFwcCk/claude-md/edit/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/claude-md/edit.segments/!KGFwcCk/claude-md/edit.segment.rsc +1 -1
- package/.next/server/app/claude-md/edit.segments/!KGFwcCk/claude-md.segment.rsc +1 -1
- package/.next/server/app/claude-md/edit.segments/!KGFwcCk.segment.rsc +2 -2
- package/.next/server/app/claude-md/edit.segments/_full.segment.rsc +4 -4
- package/.next/server/app/claude-md/edit.segments/_head.segment.rsc +1 -1
- package/.next/server/app/claude-md/edit.segments/_index.segment.rsc +2 -2
- package/.next/server/app/claude-md/edit.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/claude-md.html +1 -1
- package/.next/server/app/claude-md.rsc +4 -4
- package/.next/server/app/claude-md.segments/!KGFwcCk/claude-md/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/claude-md.segments/!KGFwcCk/claude-md.segment.rsc +1 -1
- package/.next/server/app/claude-md.segments/!KGFwcCk.segment.rsc +2 -2
- package/.next/server/app/claude-md.segments/_full.segment.rsc +4 -4
- package/.next/server/app/claude-md.segments/_head.segment.rsc +1 -1
- package/.next/server/app/claude-md.segments/_index.segment.rsc +2 -2
- package/.next/server/app/claude-md.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/commands.html +1 -1
- package/.next/server/app/commands.rsc +4 -4
- package/.next/server/app/commands.segments/!KGFwcCk/commands/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/commands.segments/!KGFwcCk/commands.segment.rsc +1 -1
- package/.next/server/app/commands.segments/!KGFwcCk.segment.rsc +2 -2
- package/.next/server/app/commands.segments/_full.segment.rsc +4 -4
- package/.next/server/app/commands.segments/_head.segment.rsc +1 -1
- package/.next/server/app/commands.segments/_index.segment.rsc +2 -2
- package/.next/server/app/commands.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/files.html +1 -1
- package/.next/server/app/files.rsc +4 -4
- package/.next/server/app/files.segments/!KGFwcCk/files/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/files.segments/!KGFwcCk/files.segment.rsc +1 -1
- package/.next/server/app/files.segments/!KGFwcCk.segment.rsc +2 -2
- package/.next/server/app/files.segments/_full.segment.rsc +4 -4
- package/.next/server/app/files.segments/_head.segment.rsc +1 -1
- package/.next/server/app/files.segments/_index.segment.rsc +2 -2
- package/.next/server/app/files.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/hooks.html +1 -1
- package/.next/server/app/hooks.rsc +4 -4
- package/.next/server/app/hooks.segments/!KGFwcCk/hooks/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/hooks.segments/!KGFwcCk/hooks.segment.rsc +1 -1
- package/.next/server/app/hooks.segments/!KGFwcCk.segment.rsc +2 -2
- package/.next/server/app/hooks.segments/_full.segment.rsc +4 -4
- package/.next/server/app/hooks.segments/_head.segment.rsc +1 -1
- package/.next/server/app/hooks.segments/_index.segment.rsc +2 -2
- package/.next/server/app/hooks.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/inbox.html +1 -0
- package/.next/server/app/inbox.meta +16 -0
- package/.next/server/app/inbox.rsc +23 -0
- package/.next/server/app/inbox.segments/!KGFwcCk/inbox/__PAGE__.segment.rsc +9 -0
- package/.next/server/app/inbox.segments/!KGFwcCk/inbox.segment.rsc +5 -0
- package/.next/server/app/inbox.segments/!KGFwcCk.segment.rsc +7 -0
- package/.next/server/app/inbox.segments/_full.segment.rsc +23 -0
- package/.next/server/app/inbox.segments/_head.segment.rsc +6 -0
- package/.next/server/app/inbox.segments/_index.segment.rsc +5 -0
- package/.next/server/app/inbox.segments/_tree.segment.rsc +2 -0
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +4 -4
- package/.next/server/app/index.segments/!KGFwcCk/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/index.segments/!KGFwcCk.segment.rsc +2 -2
- package/.next/server/app/index.segments/_full.segment.rsc +4 -4
- package/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/jobs.html +1 -1
- package/.next/server/app/jobs.rsc +4 -4
- package/.next/server/app/jobs.segments/!KGFwcCk/jobs/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/jobs.segments/!KGFwcCk/jobs.segment.rsc +1 -1
- package/.next/server/app/jobs.segments/!KGFwcCk.segment.rsc +2 -2
- package/.next/server/app/jobs.segments/_full.segment.rsc +4 -4
- package/.next/server/app/jobs.segments/_head.segment.rsc +1 -1
- package/.next/server/app/jobs.segments/_index.segment.rsc +2 -2
- package/.next/server/app/jobs.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/login/page.js +2 -2
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/login.html +1 -1
- package/.next/server/app/login.rsc +2 -2
- package/.next/server/app/login.segments/_full.segment.rsc +2 -2
- package/.next/server/app/login.segments/_head.segment.rsc +1 -1
- package/.next/server/app/login.segments/_index.segment.rsc +2 -2
- package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/login.segments/login.segment.rsc +1 -1
- package/.next/server/app/mcp-servers.html +1 -1
- package/.next/server/app/mcp-servers.rsc +4 -4
- package/.next/server/app/mcp-servers.segments/!KGFwcCk/mcp-servers/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/mcp-servers.segments/!KGFwcCk/mcp-servers.segment.rsc +1 -1
- package/.next/server/app/mcp-servers.segments/!KGFwcCk.segment.rsc +2 -2
- package/.next/server/app/mcp-servers.segments/_full.segment.rsc +4 -4
- package/.next/server/app/mcp-servers.segments/_head.segment.rsc +1 -1
- package/.next/server/app/mcp-servers.segments/_index.segment.rsc +2 -2
- package/.next/server/app/mcp-servers.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/reviews.html +1 -1
- package/.next/server/app/reviews.rsc +4 -4
- package/.next/server/app/reviews.segments/!KGFwcCk/reviews/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/reviews.segments/!KGFwcCk/reviews.segment.rsc +1 -1
- package/.next/server/app/reviews.segments/!KGFwcCk.segment.rsc +2 -2
- package/.next/server/app/reviews.segments/_full.segment.rsc +4 -4
- package/.next/server/app/reviews.segments/_head.segment.rsc +1 -1
- package/.next/server/app/reviews.segments/_index.segment.rsc +2 -2
- package/.next/server/app/reviews.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings/notifications.html +1 -0
- package/.next/server/app/settings/notifications.meta +17 -0
- package/.next/server/app/settings/notifications.rsc +23 -0
- package/.next/server/app/settings/notifications.segments/!KGFwcCk/settings/notifications/__PAGE__.segment.rsc +9 -0
- package/.next/server/app/settings/notifications.segments/!KGFwcCk/settings/notifications.segment.rsc +5 -0
- package/.next/server/app/settings/notifications.segments/!KGFwcCk/settings.segment.rsc +5 -0
- package/.next/server/app/settings/notifications.segments/!KGFwcCk.segment.rsc +7 -0
- package/.next/server/app/settings/notifications.segments/_full.segment.rsc +23 -0
- package/.next/server/app/settings/notifications.segments/_head.segment.rsc +6 -0
- package/.next/server/app/settings/notifications.segments/_index.segment.rsc +5 -0
- package/.next/server/app/settings/notifications.segments/_tree.segment.rsc +2 -0
- package/.next/server/app/settings.html +1 -1
- package/.next/server/app/settings.rsc +4 -4
- package/.next/server/app/settings.segments/!KGFwcCk/settings/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/settings.segments/!KGFwcCk/settings.segment.rsc +1 -1
- package/.next/server/app/settings.segments/!KGFwcCk.segment.rsc +2 -2
- package/.next/server/app/settings.segments/_full.segment.rsc +4 -4
- package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_index.segment.rsc +2 -2
- package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/skills.html +1 -1
- package/.next/server/app/skills.rsc +4 -4
- package/.next/server/app/skills.segments/!KGFwcCk/skills/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/skills.segments/!KGFwcCk/skills.segment.rsc +1 -1
- package/.next/server/app/skills.segments/!KGFwcCk.segment.rsc +2 -2
- package/.next/server/app/skills.segments/_full.segment.rsc +4 -4
- package/.next/server/app/skills.segments/_head.segment.rsc +1 -1
- package/.next/server/app/skills.segments/_index.segment.rsc +2 -2
- package/.next/server/app/skills.segments/_tree.segment.rsc +2 -2
- package/.next/server/app-paths-manifest.json +12 -0
- package/.next/server/chunks/1659.js +1 -1
- package/.next/server/chunks/1941.js +2 -2
- package/.next/server/chunks/1979.js +2 -2
- package/.next/server/chunks/2408.js +1 -1
- package/.next/server/chunks/2444.js +1 -1
- package/.next/server/chunks/3108.js +1 -0
- package/.next/server/chunks/4445.js +1 -1
- package/.next/server/chunks/{6142.js → 5920.js} +1 -1
- package/.next/server/chunks/5965.js +1 -1
- package/.next/server/chunks/{9012.js → 7627.js} +3 -3
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/brzairTqHmHwvfgKpdkYX/_buildManifest.js +1 -0
- package/.next/static/chunks/11242-d240a18d4e59390b.js +199 -0
- package/.next/static/chunks/3765-a4c7a493ec83f918.js +20 -0
- package/.next/static/chunks/{80392.bca860d8b5972706.js → 58011.3de5770e8b0d8759.js} +1 -1
- package/.next/static/chunks/{69427.755a0a4013596f7a.js → 69427.0f379c6bdea95405.js} +1 -1
- package/.next/static/chunks/75866-76a3987dda1295ae.js +1 -0
- package/.next/static/chunks/93273-87110c1449e1e7fd.js +6 -0
- package/.next/static/chunks/app/(app)/agents/[name]/{page-44c5691c80f17d38.js → page-3ec9a3460e8e9006.js} +2 -2
- package/.next/static/chunks/app/(app)/agents/page-d6d504e7d7757ea2.js +1 -0
- package/.next/static/chunks/app/(app)/changes/page-a09bf4742aa8b5ce.js +1 -0
- package/.next/static/chunks/app/(app)/claude-md/edit/page-ab42921ba2618dc3.js +1 -0
- package/.next/static/chunks/app/(app)/claude-md/page-c4c8b20aa002a94a.js +1 -0
- package/.next/static/chunks/app/(app)/commands/[name]/{page-6ef571e73b105248.js → page-2124ffed9a4e95a3.js} +2 -2
- package/.next/static/chunks/app/(app)/commands/page-d5bf1bddd17e31dd.js +1 -0
- package/.next/static/chunks/app/(app)/files/page-04e4e5bf1ca89945.js +1 -0
- package/.next/static/chunks/app/(app)/hooks/[event]/{page-03f85595561b068a.js → page-d988623e739973b5.js} +2 -2
- package/.next/static/chunks/app/(app)/hooks/page-818242d7db432578.js +1 -0
- package/.next/static/chunks/app/(app)/inbox/[id]/page-c33dc94e309ff117.js +1 -0
- package/.next/static/chunks/app/(app)/inbox/page-ca3e1724b5072734.js +1 -0
- package/.next/static/chunks/app/(app)/jobs/[id]/edit/page-3a1c927d76333bf0.js +1 -0
- package/.next/static/chunks/app/(app)/jobs/[id]/page-8e698e00b90968b0.js +1 -0
- package/.next/static/chunks/app/(app)/jobs/[id]/runs/[runId]/page-f942df0b7c1d280b.js +1 -0
- package/.next/static/chunks/app/(app)/jobs/page-7a88cc6ac34550c2.js +1 -0
- package/.next/static/chunks/app/(app)/layout-81c1899969de11e6.js +1 -0
- package/.next/static/chunks/app/(app)/mcp-servers/[name]/page-3541bf3ccdef9145.js +1 -0
- package/.next/static/chunks/app/(app)/mcp-servers/page-3927dfd03d921040.js +1 -0
- package/.next/static/chunks/app/(app)/page-594120e0ea1df527.js +1 -0
- package/.next/static/chunks/app/(app)/reviews/[owner]/[repo]/[number]/page-74c23b04f5c3ff88.js +13 -0
- package/.next/static/chunks/app/(app)/reviews/[owner]/[repo]/page-c7473a899c7c59c3.js +1 -0
- package/.next/static/chunks/app/(app)/reviews/page-0e6e7395a4f62b50.js +1 -0
- package/.next/static/chunks/app/(app)/sessions/[id]/page-435e9fb4dd34007d.js +1 -0
- package/.next/static/chunks/app/(app)/settings/notifications/page-a28db2ebc9fd0de8.js +1 -0
- package/.next/static/chunks/app/(app)/settings/page-f8ada7997c0d5b03.js +1 -0
- package/.next/static/chunks/app/(app)/skills/[name]/{page-e6572062a6ad90df.js → page-5dbe1e7682880145.js} +2 -2
- package/.next/static/chunks/app/(app)/skills/page-fd1986ad7e060f4d.js +1 -0
- package/.next/static/chunks/app/_global-error/page-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/agents/[name]/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/agents/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/auth/check/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/auth/login/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/auth/setup/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/auth/ws-token/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/btw/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/claude-md/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/commands/[name]/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/commands/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/defaults/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/filesystem/browse/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/filesystem/files/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/filesystem/mkdir/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/filesystem/read/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/git/clone/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/git/commit/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/git/diff/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/git/discard/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/git/generate-message/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/git/push/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/git/status/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/github/file-content/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/github/orgs/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/github/prs/checks/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/github/prs/diff/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/github/prs/review/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/github/prs/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/github/prs/view/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/github/repos/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/github/review-session/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/health/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/hooks/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/inbox/[id]/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/inbox/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/jobs/[id]/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/jobs/[id]/runs/[runId]/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/jobs/[id]/runs/[runId]/transcript/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/jobs/[id]/runs/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/jobs/[id]/trigger/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/jobs/mcp-discover/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/jobs/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/jobs/status/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/mcp-servers/[name]/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/mcp-servers/[name]/test/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/mcp-servers/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/notifications/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/notifications/test/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/reviews/pinned/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/context/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/mcp/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/search/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/sessions/bulk-delete/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/sessions/by-ids/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/sessions/group/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/sessions/pinned/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/sessions/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/sessions/search/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/skills/[name]/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/skills/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/usage/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/version/cockpit/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/app/api/version/route-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/app-error-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/forbidden-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/not-found-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-65c661eddfc65f5b.js +1 -0
- package/.next/static/chunks/{webpack-2a5835e108df6f34.js → webpack-3461a05957b13f46.js} +1 -1
- package/.next/static/css/f04f303b5708dd90.css +1 -0
- package/README.md +14 -4
- package/dist/server.js +38 -1
- package/dist/src/server/defaults.js +2 -0
- package/dist/src/server/inbox.js +132 -0
- package/dist/src/server/job-scheduler.js +152 -40
- package/dist/src/server/job-storage.js +4 -7
- package/dist/src/server/notification-settings.js +39 -0
- package/dist/src/server/notifications.js +125 -0
- package/dist/src/server/session-manager.js +118 -15
- package/dist/src/server/transcript.js +271 -6
- package/dist/src/server/ws-handler.js +16 -13
- package/package.json +1 -1
- package/.next/server/chunks/8346.js +0 -1
- package/.next/static/V2EfPtTUC96VYyF12K0om/_buildManifest.js +0 -1
- package/.next/static/chunks/22086-756d490e3320ad15.js +0 -1
- package/.next/static/chunks/30120-1535e9064b17ce74.js +0 -20
- package/.next/static/chunks/66997-652baf5596173fea.js +0 -199
- package/.next/static/chunks/93273-c5cb6dcedef67c81.js +0 -6
- package/.next/static/chunks/app/(app)/agents/page-4ce7a715bc0145dc.js +0 -1
- package/.next/static/chunks/app/(app)/changes/page-84cf4cd3ca347d98.js +0 -1
- package/.next/static/chunks/app/(app)/claude-md/edit/page-fb7117171d0f94d2.js +0 -1
- package/.next/static/chunks/app/(app)/claude-md/page-9503f1415e660911.js +0 -1
- package/.next/static/chunks/app/(app)/commands/page-e8a506da73d1c280.js +0 -1
- package/.next/static/chunks/app/(app)/files/page-67a95d351a685d79.js +0 -1
- package/.next/static/chunks/app/(app)/hooks/page-5578c83ad353e307.js +0 -1
- package/.next/static/chunks/app/(app)/jobs/[id]/edit/page-51d784c59737778c.js +0 -1
- package/.next/static/chunks/app/(app)/jobs/[id]/page-7d00e7a01c70a261.js +0 -1
- package/.next/static/chunks/app/(app)/jobs/[id]/runs/[runId]/page-665191da233fde19.js +0 -1
- package/.next/static/chunks/app/(app)/jobs/page-8b4ee1166a53d5e1.js +0 -1
- package/.next/static/chunks/app/(app)/layout-8dad55d6ce637a01.js +0 -1
- package/.next/static/chunks/app/(app)/mcp-servers/[name]/page-c30f0d78daf7719e.js +0 -1
- package/.next/static/chunks/app/(app)/mcp-servers/page-737b87d338afdb49.js +0 -1
- package/.next/static/chunks/app/(app)/page-40052655d2a9a84f.js +0 -1
- package/.next/static/chunks/app/(app)/reviews/[owner]/[repo]/[number]/page-1d9179bf5a4de7a4.js +0 -13
- package/.next/static/chunks/app/(app)/reviews/[owner]/[repo]/page-d8a9ee39e7cc056a.js +0 -1
- package/.next/static/chunks/app/(app)/reviews/page-098e6e6fe3123e02.js +0 -1
- package/.next/static/chunks/app/(app)/sessions/[id]/page-a74f7fe8322678ba.js +0 -1
- package/.next/static/chunks/app/(app)/settings/page-1fa46b8ac8e22927.js +0 -1
- package/.next/static/chunks/app/(app)/skills/page-8fca8814aa818ae6.js +0 -1
- package/.next/static/chunks/app/_global-error/page-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/agents/[name]/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/agents/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/auth/check/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/auth/login/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/auth/setup/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/auth/ws-token/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/btw/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/claude-md/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/commands/[name]/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/commands/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/defaults/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/filesystem/browse/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/filesystem/files/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/filesystem/mkdir/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/filesystem/read/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/git/clone/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/git/commit/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/git/diff/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/git/discard/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/git/generate-message/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/git/push/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/git/status/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/github/file-content/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/github/orgs/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/github/prs/checks/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/github/prs/diff/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/github/prs/review/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/github/prs/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/github/prs/view/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/github/repos/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/github/review-session/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/health/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/hooks/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/jobs/[id]/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/jobs/[id]/runs/[runId]/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/jobs/[id]/runs/[runId]/transcript/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/jobs/[id]/runs/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/jobs/[id]/trigger/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/jobs/mcp-discover/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/jobs/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/jobs/status/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/mcp-servers/[name]/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/mcp-servers/[name]/test/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/mcp-servers/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/context/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/mcp/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/search/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/sessions/pinned/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/sessions/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/skills/[name]/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/skills/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/usage/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/version/cockpit/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/app/api/version/route-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/next/dist/client/components/builtin/app-error-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/next/dist/client/components/builtin/forbidden-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/next/dist/client/components/builtin/not-found-b277aba73f9e0212.js +0 -1
- package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-b277aba73f9e0212.js +0 -1
- package/.next/static/css/1e1239c76b265910.css +0 -1
- /package/.next/static/{V2EfPtTUC96VYyF12K0om → brzairTqHmHwvfgKpdkYX}/_ssgManifest.js +0 -0
|
@@ -54,6 +54,7 @@ class SessionManager {
|
|
|
54
54
|
lastActiveAt: now,
|
|
55
55
|
status: "idle",
|
|
56
56
|
model: defaults.model || undefined,
|
|
57
|
+
pendingRequestCount: 0,
|
|
57
58
|
};
|
|
58
59
|
this.sessions.set(id, {
|
|
59
60
|
info,
|
|
@@ -100,6 +101,7 @@ class SessionManager {
|
|
|
100
101
|
lastActiveAt: now,
|
|
101
102
|
status: "idle",
|
|
102
103
|
model: prefs?.model || defaults.model || undefined,
|
|
104
|
+
pendingRequestCount: 0,
|
|
103
105
|
},
|
|
104
106
|
process: null,
|
|
105
107
|
stdin: null,
|
|
@@ -146,12 +148,15 @@ class SessionManager {
|
|
|
146
148
|
this.ensureSession(id, cwd);
|
|
147
149
|
session = this.sessions.get(id);
|
|
148
150
|
}
|
|
149
|
-
const
|
|
151
|
+
const stitching = (0, defaults_1.getDefaults)().messageStitching;
|
|
152
|
+
const willStitch = stitching && session.previousCliSessionIds.length > 0;
|
|
153
|
+
// Load full current session when stitching to avoid losing middle messages.
|
|
154
|
+
// Without stitching, tail-read is fine because byteOffset stays pointing at
|
|
155
|
+
// the current session's file for backward pagination.
|
|
156
|
+
const result = await (0, transcript_1.loadTranscript)(session.cliSessionId, session.info.cwd, willStitch ? undefined : { tailLines: 150 });
|
|
150
157
|
let { messages, byteOffset, totalSize, lastUsage } = result;
|
|
151
158
|
session.bufferCliSessionId = session.cliSessionId;
|
|
152
|
-
|
|
153
|
-
// conversation is visible on refresh instead of only post-clear messages.
|
|
154
|
-
if (session.previousCliSessionIds.length > 0) {
|
|
159
|
+
if (willStitch) {
|
|
155
160
|
const currentMessages = messages;
|
|
156
161
|
for (let i = session.previousCliSessionIds.length - 1; i >= 0; i--) {
|
|
157
162
|
const prevId = session.previousCliSessionIds[i];
|
|
@@ -178,11 +183,11 @@ class SessionManager {
|
|
|
178
183
|
session.transcriptByteOffset = byteOffset;
|
|
179
184
|
session.transcriptTotalSize = totalSize;
|
|
180
185
|
// Fresh pagination copy so getMoreHistory doesn't consume the canonical list
|
|
181
|
-
session.paginationPrevIds = [...session.previousCliSessionIds];
|
|
186
|
+
session.paginationPrevIds = stitching ? [...session.previousCliSessionIds] : [];
|
|
182
187
|
// Send last 50 to client, keep rest in buffer
|
|
183
188
|
const PAGE = 50;
|
|
184
189
|
const clientMessages = messages.length > PAGE ? messages.slice(-PAGE) : messages;
|
|
185
|
-
const hasMore = messages.length > PAGE || byteOffset > 0 || session.previousCliSessionIds.length > 0;
|
|
190
|
+
const hasMore = messages.length > PAGE || byteOffset > 0 || (stitching && session.previousCliSessionIds.length > 0);
|
|
186
191
|
const defaultName = node_path_1.default.basename(session.info.cwd) || session.info.cwd;
|
|
187
192
|
if (session.info.name === defaultName && messages.length > 0) {
|
|
188
193
|
const firstUser = messages.find((m) => m.role === "user" && m.content && !m.content.startsWith("[") && !m.content.startsWith("<"));
|
|
@@ -195,12 +200,12 @@ class SessionManager {
|
|
|
195
200
|
async getSessionByCwd(id, cwd) {
|
|
196
201
|
this.ensureSession(id, cwd);
|
|
197
202
|
const session = this.sessions.get(id);
|
|
198
|
-
const
|
|
203
|
+
const stitching = (0, defaults_1.getDefaults)().messageStitching;
|
|
204
|
+
const willStitch = stitching && session.previousCliSessionIds.length > 0;
|
|
205
|
+
const result = await (0, transcript_1.loadTranscript)(session.cliSessionId, cwd, willStitch ? undefined : { tailLines: 150 });
|
|
199
206
|
let { messages, byteOffset, totalSize, lastUsage } = result;
|
|
200
207
|
session.bufferCliSessionId = session.cliSessionId;
|
|
201
|
-
|
|
202
|
-
// conversation is visible on refresh instead of only post-clear messages.
|
|
203
|
-
if (session.previousCliSessionIds.length > 0) {
|
|
208
|
+
if (willStitch) {
|
|
204
209
|
const currentMessages = messages;
|
|
205
210
|
for (let i = session.previousCliSessionIds.length - 1; i >= 0; i--) {
|
|
206
211
|
const prevId = session.previousCliSessionIds[i];
|
|
@@ -227,11 +232,11 @@ class SessionManager {
|
|
|
227
232
|
session.transcriptByteOffset = byteOffset;
|
|
228
233
|
session.transcriptTotalSize = totalSize;
|
|
229
234
|
// Fresh pagination copy so getMoreHistory doesn't consume the canonical list
|
|
230
|
-
session.paginationPrevIds = [...session.previousCliSessionIds];
|
|
235
|
+
session.paginationPrevIds = stitching ? [...session.previousCliSessionIds] : [];
|
|
231
236
|
// Send last 50 to client, keep rest in buffer
|
|
232
237
|
const PAGE = 50;
|
|
233
238
|
const clientMessages = messages.length > PAGE ? messages.slice(-PAGE) : messages;
|
|
234
|
-
const hasMore = messages.length > PAGE || byteOffset > 0 || session.previousCliSessionIds.length > 0;
|
|
239
|
+
const hasMore = messages.length > PAGE || byteOffset > 0 || (stitching && session.previousCliSessionIds.length > 0);
|
|
235
240
|
// Derive title from first user message if name is still the default
|
|
236
241
|
const defaultName = node_path_1.default.basename(cwd) || cwd;
|
|
237
242
|
if (session.info.name === defaultName && messages.length > 0) {
|
|
@@ -247,9 +252,10 @@ class SessionManager {
|
|
|
247
252
|
return null;
|
|
248
253
|
const chain = (0, session_prefs_1.findChainForCliSession)(cliId);
|
|
249
254
|
const prevIds = chain ? chain.truncatedPrevIds : [];
|
|
250
|
-
const
|
|
255
|
+
const willStitch = (0, defaults_1.getDefaults)().messageStitching && prevIds.length > 0;
|
|
256
|
+
const result = await (0, transcript_1.loadTranscript)(cliId, cwd, willStitch ? undefined : { tailLines: 150 });
|
|
251
257
|
let { messages, lastUsage } = result;
|
|
252
|
-
if (
|
|
258
|
+
if (willStitch) {
|
|
253
259
|
const currentMessages = messages;
|
|
254
260
|
for (let i = prevIds.length - 1; i >= 0; i--) {
|
|
255
261
|
const prevResult = await (0, transcript_1.loadTranscript)(prevIds[i], cwd, { tailLines: 150 });
|
|
@@ -382,11 +388,16 @@ class SessionManager {
|
|
|
382
388
|
const session = this.sessions.get(id);
|
|
383
389
|
return !!session?.process;
|
|
384
390
|
}
|
|
391
|
+
hasRunningProcess(id) {
|
|
392
|
+
const session = this.sessions.get(id);
|
|
393
|
+
return !!session?.process;
|
|
394
|
+
}
|
|
385
395
|
fixStaleStatus(id) {
|
|
386
396
|
const session = this.sessions.get(id);
|
|
387
397
|
if (session && session.info.status === "running" && !session.process) {
|
|
388
398
|
session.info.status = "idle";
|
|
389
399
|
session.pendingRequests.clear();
|
|
400
|
+
this.notifyPendingChanged(session, id);
|
|
390
401
|
}
|
|
391
402
|
}
|
|
392
403
|
restartSession(sessionId) {
|
|
@@ -399,6 +410,7 @@ class SessionManager {
|
|
|
399
410
|
}
|
|
400
411
|
this.killProcess(session);
|
|
401
412
|
session.pendingRequests.clear();
|
|
413
|
+
this.notifyPendingChanged(session, sessionId);
|
|
402
414
|
session.streamingSnapshot = null;
|
|
403
415
|
session.info.status = "idle";
|
|
404
416
|
session.emitter.emit("status", sessionId, "idle");
|
|
@@ -437,6 +449,16 @@ class SessionManager {
|
|
|
437
449
|
session.emitter.on("status", handler);
|
|
438
450
|
return () => session.emitter.off("status", handler);
|
|
439
451
|
}
|
|
452
|
+
onPending(id, listener) {
|
|
453
|
+
const session = this.sessions.get(id);
|
|
454
|
+
if (!session)
|
|
455
|
+
return null;
|
|
456
|
+
const handler = (_sessionId, count) => {
|
|
457
|
+
listener(count);
|
|
458
|
+
};
|
|
459
|
+
session.emitter.on("pending", handler);
|
|
460
|
+
return () => session.emitter.off("pending", handler);
|
|
461
|
+
}
|
|
440
462
|
onError(id, listener) {
|
|
441
463
|
const session = this.sessions.get(id);
|
|
442
464
|
if (!session)
|
|
@@ -484,12 +506,14 @@ class SessionManager {
|
|
|
484
506
|
const session = this.sessions.get(sessionId);
|
|
485
507
|
if (session) {
|
|
486
508
|
session.pendingRequests.set(request.requestId, request);
|
|
509
|
+
this.notifyPendingChanged(session, sessionId);
|
|
487
510
|
}
|
|
488
511
|
}
|
|
489
512
|
removePendingRequest(sessionId, requestId) {
|
|
490
513
|
const session = this.sessions.get(sessionId);
|
|
491
514
|
if (session) {
|
|
492
515
|
session.pendingRequests.delete(requestId);
|
|
516
|
+
this.notifyPendingChanged(session, sessionId);
|
|
493
517
|
}
|
|
494
518
|
}
|
|
495
519
|
getPendingRequests(sessionId) {
|
|
@@ -498,11 +522,15 @@ class SessionManager {
|
|
|
498
522
|
return [];
|
|
499
523
|
return Array.from(session.pendingRequests.values());
|
|
500
524
|
}
|
|
525
|
+
getPendingRequest(sessionId, requestId) {
|
|
526
|
+
return this.sessions.get(sessionId)?.pendingRequests.get(requestId);
|
|
527
|
+
}
|
|
501
528
|
respondToPermission(sessionId, requestId, allowed, toolInput, permissionSuggestions, denyReason) {
|
|
502
529
|
const session = this.sessions.get(sessionId);
|
|
503
530
|
if (!session?.stdin)
|
|
504
531
|
return false;
|
|
505
532
|
session.pendingRequests.delete(requestId);
|
|
533
|
+
this.notifyPendingChanged(session, sessionId);
|
|
506
534
|
const response = {
|
|
507
535
|
type: "control_response",
|
|
508
536
|
response: {
|
|
@@ -511,7 +539,7 @@ class SessionManager {
|
|
|
511
539
|
response: allowed
|
|
512
540
|
? {
|
|
513
541
|
behavior: "allow",
|
|
514
|
-
|
|
542
|
+
updatedInput: toolInput ?? {},
|
|
515
543
|
...(permissionSuggestions?.length ? { updatedPermissions: permissionSuggestions } : {}),
|
|
516
544
|
}
|
|
517
545
|
: { behavior: "deny", message: denyReason ?? "User denied" },
|
|
@@ -540,6 +568,7 @@ class SessionManager {
|
|
|
540
568
|
// Don't change CLI mode while in plan mode; bypass will restore on plan exit
|
|
541
569
|
if (!session.planMode) {
|
|
542
570
|
this.sendPermissionMode(session, sessionId, "bypassPermissions");
|
|
571
|
+
this.scheduleRespawnForPermissions(session);
|
|
543
572
|
}
|
|
544
573
|
this.emitSystem(session, sessionId, "__bypass_state::on");
|
|
545
574
|
}
|
|
@@ -551,9 +580,25 @@ class SessionManager {
|
|
|
551
580
|
(0, session_prefs_1.setSessionPrefs)(sessionId, { bypassAllPermissions: false });
|
|
552
581
|
if (!session.planMode) {
|
|
553
582
|
this.sendPermissionMode(session, sessionId, "default");
|
|
583
|
+
this.scheduleRespawnForPermissions(session);
|
|
554
584
|
}
|
|
555
585
|
this.emitSystem(session, sessionId, "__bypass_state::off");
|
|
556
586
|
}
|
|
587
|
+
// Runtime set_permission_mode is unreliable when the CLI was spawned without
|
|
588
|
+
// the target mode. Respawning the process picks up --permission-mode from
|
|
589
|
+
// session state, guaranteeing the next message runs in the right mode.
|
|
590
|
+
// If a message is in flight, defer until message_done so we don't orphan it.
|
|
591
|
+
scheduleRespawnForPermissions(session) {
|
|
592
|
+
if (!session.process)
|
|
593
|
+
return;
|
|
594
|
+
if (session.info.status === "idle") {
|
|
595
|
+
this.killProcess(session);
|
|
596
|
+
session.hasSpawnedBefore = (0, transcript_1.transcriptExists)(session.cliSessionId, session.info.cwd);
|
|
597
|
+
}
|
|
598
|
+
else {
|
|
599
|
+
session.needsRespawnForPermissions = true;
|
|
600
|
+
}
|
|
601
|
+
}
|
|
557
602
|
isBypassActive(sessionId) {
|
|
558
603
|
const session = this.sessions.get(sessionId);
|
|
559
604
|
return session?.bypassAllPermissions ?? false;
|
|
@@ -574,6 +619,7 @@ class SessionManager {
|
|
|
574
619
|
}
|
|
575
620
|
// Clear orphaned pending requests from the killed process
|
|
576
621
|
session.pendingRequests.clear();
|
|
622
|
+
this.notifyPendingChanged(session, sessionId);
|
|
577
623
|
this.emitSystem(session, sessionId, "__plan_state::on");
|
|
578
624
|
}
|
|
579
625
|
clearPlanMode(sessionId) {
|
|
@@ -591,6 +637,7 @@ class SessionManager {
|
|
|
591
637
|
}
|
|
592
638
|
// Clear orphaned pending requests from the killed process
|
|
593
639
|
session.pendingRequests.clear();
|
|
640
|
+
this.notifyPendingChanged(session, sessionId);
|
|
594
641
|
this.emitSystem(session, sessionId, "__plan_state::off");
|
|
595
642
|
// Re-sync bypass state with the client so the UI reflects it correctly
|
|
596
643
|
// after the plan-mode process is torn down.
|
|
@@ -968,6 +1015,13 @@ class SessionManager {
|
|
|
968
1015
|
emitSystem(session, sessionId, text) {
|
|
969
1016
|
session.emitter.emit("system", sessionId, text);
|
|
970
1017
|
}
|
|
1018
|
+
notifyPendingChanged(session, sessionId) {
|
|
1019
|
+
const count = session.pendingRequests.size;
|
|
1020
|
+
if (session.info.pendingRequestCount === count)
|
|
1021
|
+
return;
|
|
1022
|
+
session.info.pendingRequestCount = count;
|
|
1023
|
+
session.emitter.emit("pending", sessionId, count);
|
|
1024
|
+
}
|
|
971
1025
|
applyProcessedResult(session, sessionId, result) {
|
|
972
1026
|
for (const msg of result.intermediateMessages) {
|
|
973
1027
|
session.emitter.emit("event", sessionId, { type: "message_done", message: msg });
|
|
@@ -1008,6 +1062,12 @@ class SessionManager {
|
|
|
1008
1062
|
else if (pa.type === "auto_deny") {
|
|
1009
1063
|
this.respondToPermission(sessionId, pa.requestId, false, undefined, undefined, pa.denyReason);
|
|
1010
1064
|
}
|
|
1065
|
+
else if (session.bypassAllPermissions && !session.planMode) {
|
|
1066
|
+
// CLI was spawned without bypass capability (e.g. after exiting plan
|
|
1067
|
+
// mode) but the session has bypass enabled. Auto-approve server-side
|
|
1068
|
+
// until the process respawns with the right flags.
|
|
1069
|
+
this.respondToPermission(sessionId, pa.requestId, true, pa.rawToolInput);
|
|
1070
|
+
}
|
|
1011
1071
|
else {
|
|
1012
1072
|
const planPath = pa.toolName === "ExitPlanMode" ? (0, plans_1.findLatestPlanFile)() : undefined;
|
|
1013
1073
|
session.pendingRequests.set(pa.requestId, {
|
|
@@ -1016,9 +1076,11 @@ class SessionManager {
|
|
|
1016
1076
|
toolName: pa.toolName,
|
|
1017
1077
|
toolInput: pa.toolInput || "",
|
|
1018
1078
|
rawToolInput: pa.rawToolInput,
|
|
1079
|
+
permissionSuggestions: pa.permissionSuggestions,
|
|
1019
1080
|
planFilePath: planPath,
|
|
1020
1081
|
planContent: planPath ? (0, plans_1.readPlanFile)(planPath) : undefined,
|
|
1021
1082
|
});
|
|
1083
|
+
this.notifyPendingChanged(session, sessionId);
|
|
1022
1084
|
}
|
|
1023
1085
|
}
|
|
1024
1086
|
if (result.compactDone) {
|
|
@@ -1197,6 +1259,27 @@ Additional Cockpit rules beyond the CLI's defaults:
|
|
|
1197
1259
|
smLog(id, `recovery succeeded: restored from ${cwd}`);
|
|
1198
1260
|
return true;
|
|
1199
1261
|
}
|
|
1262
|
+
estimateMessageTokens(text, images, documents) {
|
|
1263
|
+
let tokens = Math.ceil(text.length / 4);
|
|
1264
|
+
if (images)
|
|
1265
|
+
tokens += images.length * 2000;
|
|
1266
|
+
if (documents)
|
|
1267
|
+
tokens += documents.reduce((sum, d) => sum + Math.ceil(d.data.length / 5), 0);
|
|
1268
|
+
return tokens;
|
|
1269
|
+
}
|
|
1270
|
+
shouldPreCompact(session, text, images, documents) {
|
|
1271
|
+
if (!session.contextUsage)
|
|
1272
|
+
return false;
|
|
1273
|
+
if (session.compacting)
|
|
1274
|
+
return false;
|
|
1275
|
+
if (text.trim().toLowerCase().startsWith("/compact"))
|
|
1276
|
+
return false;
|
|
1277
|
+
if (text.trim().startsWith("/"))
|
|
1278
|
+
return false;
|
|
1279
|
+
const estimate = this.estimateMessageTokens(text, images, documents);
|
|
1280
|
+
const { used, total } = session.contextUsage;
|
|
1281
|
+
return used + estimate > total * 0.85;
|
|
1282
|
+
}
|
|
1200
1283
|
sendMessage(sessionId, text, images, documents) {
|
|
1201
1284
|
const session = this.sessions.get(sessionId);
|
|
1202
1285
|
if (!session) {
|
|
@@ -1214,6 +1297,26 @@ Additional Cockpit rules beyond the CLI's defaults:
|
|
|
1214
1297
|
this.emitSystem(session, sessionId, "__compact::start");
|
|
1215
1298
|
}
|
|
1216
1299
|
}
|
|
1300
|
+
// If the message would likely overflow the context window, compact first
|
|
1301
|
+
// and queue the message for delivery after compaction finishes.
|
|
1302
|
+
if (session.info.status !== "running" && this.shouldPreCompact(session, text, images, documents)) {
|
|
1303
|
+
this.log(sessionId, "pre-send compact: message would exceed 85% of context window");
|
|
1304
|
+
(0, debug_logger_1.logDiag)(sessionId, "compact:pre-send");
|
|
1305
|
+
session.queuedMessages.push({ id: `q-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`, text, images, documents });
|
|
1306
|
+
session.emitter.emit("queued", sessionId, session.queuedMessages.length);
|
|
1307
|
+
session.compacting = true;
|
|
1308
|
+
this.emitSystem(session, sessionId, "__compact::start");
|
|
1309
|
+
session.info.status = "running";
|
|
1310
|
+
session.emitter.emit("status", sessionId, "running");
|
|
1311
|
+
if (session.process && session.stdin) {
|
|
1312
|
+
const compactInput = { type: "user", message: { role: "user", content: "/compact" } };
|
|
1313
|
+
session.stdin.write(JSON.stringify(compactInput) + "\n");
|
|
1314
|
+
}
|
|
1315
|
+
else {
|
|
1316
|
+
this.spawnProcess(session, sessionId, "/compact");
|
|
1317
|
+
}
|
|
1318
|
+
return true;
|
|
1319
|
+
}
|
|
1217
1320
|
const content = this.buildContent(session, text, images, documents);
|
|
1218
1321
|
// If queue was paused (user interrupted then sent a new message),
|
|
1219
1322
|
// discard the paused messages and reset the flag.
|
|
@@ -4,12 +4,18 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.transcriptExists = transcriptExists;
|
|
7
|
+
exports.deleteTranscript = deleteTranscript;
|
|
8
|
+
exports.countTranscriptMessages = countTranscriptMessages;
|
|
7
9
|
exports.readMoreLines = readMoreLines;
|
|
8
10
|
exports.loadLastUsage = loadLastUsage;
|
|
9
11
|
exports.loadTranscript = loadTranscript;
|
|
10
12
|
exports.loadMoreMessages = loadMoreMessages;
|
|
11
13
|
exports.findSessionCwd = findSessionCwd;
|
|
12
14
|
exports.scanAllSessions = scanAllSessions;
|
|
15
|
+
exports.scanSessionsForCwd = scanSessionsForCwd;
|
|
16
|
+
exports.scanSessionsByIds = scanSessionsByIds;
|
|
17
|
+
exports.listAllTranscriptFiles = listAllTranscriptFiles;
|
|
18
|
+
exports.globalSearch = globalSearch;
|
|
13
19
|
const node_fs_1 = require("node:fs");
|
|
14
20
|
const promises_1 = require("node:fs/promises");
|
|
15
21
|
const node_os_1 = require("node:os");
|
|
@@ -24,6 +30,31 @@ function getTranscriptPath(sessionId, cwd) {
|
|
|
24
30
|
function transcriptExists(sessionId, cwd) {
|
|
25
31
|
return (0, node_fs_1.existsSync)(getTranscriptPath(sessionId, cwd));
|
|
26
32
|
}
|
|
33
|
+
async function deleteTranscript(sessionId, cwd) {
|
|
34
|
+
const fp = getTranscriptPath(sessionId, cwd);
|
|
35
|
+
if (!(0, node_fs_1.existsSync)(fp))
|
|
36
|
+
return false;
|
|
37
|
+
await (0, promises_1.unlink)(fp);
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
function countTranscriptMessages(sessionId, cwd) {
|
|
41
|
+
const fp = getTranscriptPath(sessionId, cwd);
|
|
42
|
+
if (!(0, node_fs_1.existsSync)(fp))
|
|
43
|
+
return 0;
|
|
44
|
+
try {
|
|
45
|
+
const raw = (0, node_fs_1.readFileSync)(fp, "utf-8");
|
|
46
|
+
let count = 0;
|
|
47
|
+
for (const line of raw.split("\n")) {
|
|
48
|
+
if (line.includes('"role"') && (line.includes('"assistant"') || line.includes('"user"'))) {
|
|
49
|
+
count++;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return count;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return 0;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
27
58
|
const CLI_XML_RE = /<(?:task-notification|local-command-caveat|local-command-stdout|system-reminder)[^>]*>[\s\S]*?<\/(?:task-notification|local-command-caveat|local-command-stdout|system-reminder)>[\s\S]*/g;
|
|
28
59
|
const FILE_TAG_RE = /<file\s+path="([^"]+)">\n([\s\S]*?)\n<\/file>/g;
|
|
29
60
|
function extractTextFiles(text) {
|
|
@@ -106,9 +137,6 @@ async function readTailLines(filePath, targetCount) {
|
|
|
106
137
|
}
|
|
107
138
|
// Not enough lines, double chunk and retry
|
|
108
139
|
chunkSize *= 2;
|
|
109
|
-
if (chunkSize >= totalSize) {
|
|
110
|
-
return { lines, byteOffset: 0, totalSize };
|
|
111
|
-
}
|
|
112
140
|
}
|
|
113
141
|
}
|
|
114
142
|
finally {
|
|
@@ -154,9 +182,6 @@ async function readMoreLines(filePath, byteOffset, targetCount) {
|
|
|
154
182
|
return { lines: result, newByteOffset: offset === 0 ? 0 : newByteOffset };
|
|
155
183
|
}
|
|
156
184
|
chunkSize *= 2;
|
|
157
|
-
if (chunkSize >= byteOffset) {
|
|
158
|
-
return { lines, newByteOffset: 0 };
|
|
159
|
-
}
|
|
160
185
|
}
|
|
161
186
|
}
|
|
162
187
|
finally {
|
|
@@ -646,6 +671,7 @@ async function scanAllSessions() {
|
|
|
646
671
|
cwd,
|
|
647
672
|
dirName: node_path_1.default.basename(cwd) || cwd,
|
|
648
673
|
sessions,
|
|
674
|
+
totalSessionCount: sessions.length,
|
|
649
675
|
});
|
|
650
676
|
}
|
|
651
677
|
result.sort((a, b) => {
|
|
@@ -655,3 +681,242 @@ async function scanAllSessions() {
|
|
|
655
681
|
});
|
|
656
682
|
return result;
|
|
657
683
|
}
|
|
684
|
+
function metaToSessionInfo(meta) {
|
|
685
|
+
return {
|
|
686
|
+
id: meta.id,
|
|
687
|
+
name: meta.title,
|
|
688
|
+
cwd: meta.cwd,
|
|
689
|
+
createdAt: meta.createdAt,
|
|
690
|
+
lastActiveAt: meta.lastActiveAt,
|
|
691
|
+
status: "idle",
|
|
692
|
+
};
|
|
693
|
+
}
|
|
694
|
+
async function scanSessionsForCwd(targetCwd) {
|
|
695
|
+
const projectsDir = node_path_1.default.join((0, node_os_1.homedir)(), ".claude", "projects");
|
|
696
|
+
if (!(0, node_fs_1.existsSync)(projectsDir))
|
|
697
|
+
return [];
|
|
698
|
+
let projectDirs;
|
|
699
|
+
try {
|
|
700
|
+
projectDirs = await (0, promises_1.readdir)(projectsDir);
|
|
701
|
+
}
|
|
702
|
+
catch {
|
|
703
|
+
return [];
|
|
704
|
+
}
|
|
705
|
+
const results = [];
|
|
706
|
+
for (const dir of projectDirs) {
|
|
707
|
+
const dirPath = node_path_1.default.join(projectsDir, dir);
|
|
708
|
+
let files;
|
|
709
|
+
try {
|
|
710
|
+
files = await (0, promises_1.readdir)(dirPath);
|
|
711
|
+
}
|
|
712
|
+
catch {
|
|
713
|
+
continue;
|
|
714
|
+
}
|
|
715
|
+
const jsonlFiles = files.filter((f) => f.endsWith(".jsonl"));
|
|
716
|
+
const metas = await Promise.all(jsonlFiles.map((f) => extractSessionMeta(node_path_1.default.join(dirPath, f))));
|
|
717
|
+
for (const meta of metas) {
|
|
718
|
+
if (meta && meta.cwd === targetCwd) {
|
|
719
|
+
results.push(metaToSessionInfo(meta));
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
results.sort((a, b) => b.lastActiveAt - a.lastActiveAt);
|
|
724
|
+
return results;
|
|
725
|
+
}
|
|
726
|
+
async function scanSessionsByIds(ids) {
|
|
727
|
+
if (ids.length === 0)
|
|
728
|
+
return [];
|
|
729
|
+
const projectsDir = node_path_1.default.join((0, node_os_1.homedir)(), ".claude", "projects");
|
|
730
|
+
if (!(0, node_fs_1.existsSync)(projectsDir))
|
|
731
|
+
return [];
|
|
732
|
+
let projectDirs;
|
|
733
|
+
try {
|
|
734
|
+
projectDirs = await (0, promises_1.readdir)(projectsDir);
|
|
735
|
+
}
|
|
736
|
+
catch {
|
|
737
|
+
return [];
|
|
738
|
+
}
|
|
739
|
+
const idSet = new Set(ids);
|
|
740
|
+
const results = [];
|
|
741
|
+
for (const dir of projectDirs) {
|
|
742
|
+
if (idSet.size === 0)
|
|
743
|
+
break;
|
|
744
|
+
const dirPath = node_path_1.default.join(projectsDir, dir);
|
|
745
|
+
let files;
|
|
746
|
+
try {
|
|
747
|
+
files = await (0, promises_1.readdir)(dirPath);
|
|
748
|
+
}
|
|
749
|
+
catch {
|
|
750
|
+
continue;
|
|
751
|
+
}
|
|
752
|
+
const matching = files.filter((f) => f.endsWith(".jsonl") && idSet.has(f.slice(0, -".jsonl".length)));
|
|
753
|
+
if (matching.length === 0)
|
|
754
|
+
continue;
|
|
755
|
+
const metas = await Promise.all(matching.map((f) => extractSessionMeta(node_path_1.default.join(dirPath, f))));
|
|
756
|
+
for (const meta of metas) {
|
|
757
|
+
if (meta) {
|
|
758
|
+
results.push(metaToSessionInfo(meta));
|
|
759
|
+
idSet.delete(meta.id);
|
|
760
|
+
}
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
return results;
|
|
764
|
+
}
|
|
765
|
+
async function listAllTranscriptFiles() {
|
|
766
|
+
const projectsDir = node_path_1.default.join((0, node_os_1.homedir)(), ".claude", "projects");
|
|
767
|
+
if (!(0, node_fs_1.existsSync)(projectsDir))
|
|
768
|
+
return [];
|
|
769
|
+
let projectDirs;
|
|
770
|
+
try {
|
|
771
|
+
projectDirs = await (0, promises_1.readdir)(projectsDir);
|
|
772
|
+
}
|
|
773
|
+
catch {
|
|
774
|
+
return [];
|
|
775
|
+
}
|
|
776
|
+
const results = [];
|
|
777
|
+
for (const dir of projectDirs) {
|
|
778
|
+
if (dir.includes(".cockpit"))
|
|
779
|
+
continue;
|
|
780
|
+
const dirPath = node_path_1.default.join(projectsDir, dir);
|
|
781
|
+
let files;
|
|
782
|
+
try {
|
|
783
|
+
files = await (0, promises_1.readdir)(dirPath);
|
|
784
|
+
}
|
|
785
|
+
catch {
|
|
786
|
+
continue;
|
|
787
|
+
}
|
|
788
|
+
for (const f of files) {
|
|
789
|
+
if (!f.endsWith(".jsonl"))
|
|
790
|
+
continue;
|
|
791
|
+
const filePath = node_path_1.default.join(dirPath, f);
|
|
792
|
+
try {
|
|
793
|
+
const s = await (0, promises_1.stat)(filePath);
|
|
794
|
+
results.push({ filePath, sessionId: f.slice(0, -6), mtimeMs: s.mtimeMs });
|
|
795
|
+
}
|
|
796
|
+
catch { }
|
|
797
|
+
}
|
|
798
|
+
}
|
|
799
|
+
results.sort((a, b) => b.mtimeMs - a.mtimeMs);
|
|
800
|
+
return results;
|
|
801
|
+
}
|
|
802
|
+
async function globalSearch(query, limit, offset = 0) {
|
|
803
|
+
const MAX_FILES = 500;
|
|
804
|
+
const MAX_PARSED_BASE = 30;
|
|
805
|
+
const MAX_PER_FILE = 10;
|
|
806
|
+
const effectiveLimit = Math.min(limit, 100);
|
|
807
|
+
const lowerQuery = query.toLowerCase();
|
|
808
|
+
// When paginating, allow parsing more files to reach the offset
|
|
809
|
+
const maxParsed = MAX_PARSED_BASE + Math.ceil(offset / MAX_PER_FILE);
|
|
810
|
+
const files = await listAllTranscriptFiles();
|
|
811
|
+
const searchFiles = files.slice(0, MAX_FILES);
|
|
812
|
+
const results = [];
|
|
813
|
+
let totalFound = 0;
|
|
814
|
+
let filesParsed = 0;
|
|
815
|
+
let truncated = false;
|
|
816
|
+
for (const file of searchFiles) {
|
|
817
|
+
if (results.length >= effectiveLimit || filesParsed >= maxParsed) {
|
|
818
|
+
truncated = true;
|
|
819
|
+
break;
|
|
820
|
+
}
|
|
821
|
+
let raw;
|
|
822
|
+
try {
|
|
823
|
+
raw = await (0, promises_1.readFile)(file.filePath, "utf-8");
|
|
824
|
+
}
|
|
825
|
+
catch {
|
|
826
|
+
continue;
|
|
827
|
+
}
|
|
828
|
+
if (!raw.toLowerCase().includes(lowerQuery))
|
|
829
|
+
continue;
|
|
830
|
+
filesParsed++;
|
|
831
|
+
const lines = raw.split(/\r?\n/).filter((l) => l.trim());
|
|
832
|
+
const { messages } = parseLines(lines);
|
|
833
|
+
let cwd = "";
|
|
834
|
+
let sessionTitle = "";
|
|
835
|
+
for (let j = 0; j < Math.min(lines.length, 50); j++) {
|
|
836
|
+
try {
|
|
837
|
+
const entry = JSON.parse(lines[j]);
|
|
838
|
+
if (entry.type === "user" && entry.cwd && !cwd)
|
|
839
|
+
cwd = entry.cwd;
|
|
840
|
+
if (entry.type === "user" && entry.message && !sessionTitle) {
|
|
841
|
+
const content = entry.message.content;
|
|
842
|
+
let candidate = "";
|
|
843
|
+
if (typeof content === "string")
|
|
844
|
+
candidate = content;
|
|
845
|
+
else if (Array.isArray(content)) {
|
|
846
|
+
const tb = content.find((b) => b.type === "text" && b.text);
|
|
847
|
+
if (tb?.text)
|
|
848
|
+
candidate = tb.text;
|
|
849
|
+
}
|
|
850
|
+
if (candidate && !candidate.startsWith("[") && !candidate.startsWith("<")) {
|
|
851
|
+
sessionTitle = candidate.slice(0, 120);
|
|
852
|
+
}
|
|
853
|
+
}
|
|
854
|
+
if (cwd && sessionTitle)
|
|
855
|
+
break;
|
|
856
|
+
}
|
|
857
|
+
catch { }
|
|
858
|
+
}
|
|
859
|
+
if (!cwd)
|
|
860
|
+
continue;
|
|
861
|
+
if (cwd.endsWith(".cockpit/reviews") || cwd.endsWith(".cockpit/jobs"))
|
|
862
|
+
continue;
|
|
863
|
+
const dirName = node_path_1.default.basename(cwd) || cwd;
|
|
864
|
+
let fileResults = 0;
|
|
865
|
+
for (let i = 0; i < messages.length; i++) {
|
|
866
|
+
if (fileResults >= MAX_PER_FILE || results.length >= effectiveLimit)
|
|
867
|
+
break;
|
|
868
|
+
const msg = messages[i];
|
|
869
|
+
if (msg.role !== "user" && msg.role !== "assistant")
|
|
870
|
+
continue;
|
|
871
|
+
if (i > 0 && messages[i - 1].content === "__compacted__")
|
|
872
|
+
continue;
|
|
873
|
+
if (i > 1 && messages[i - 2].content === "__compacted__")
|
|
874
|
+
continue;
|
|
875
|
+
let text = "";
|
|
876
|
+
if (msg.blocks && msg.blocks.length > 0) {
|
|
877
|
+
text = msg.blocks
|
|
878
|
+
.filter((b) => b.type === "text")
|
|
879
|
+
.map((b) => b.text)
|
|
880
|
+
.join("\n");
|
|
881
|
+
}
|
|
882
|
+
if (!text && typeof msg.content === "string") {
|
|
883
|
+
text = msg.content;
|
|
884
|
+
}
|
|
885
|
+
if (!text)
|
|
886
|
+
continue;
|
|
887
|
+
const matchIndex = text.toLowerCase().indexOf(lowerQuery);
|
|
888
|
+
if (matchIndex === -1)
|
|
889
|
+
continue;
|
|
890
|
+
totalFound++;
|
|
891
|
+
fileResults++;
|
|
892
|
+
if (totalFound <= offset)
|
|
893
|
+
continue;
|
|
894
|
+
const previewStart = Math.max(0, matchIndex - 100);
|
|
895
|
+
const previewEnd = Math.min(text.length, matchIndex + query.length + 100);
|
|
896
|
+
let preview = text.slice(previewStart, previewEnd);
|
|
897
|
+
let matchStart = matchIndex - previewStart;
|
|
898
|
+
if (previewStart > 0) {
|
|
899
|
+
preview = "..." + preview;
|
|
900
|
+
matchStart += 3;
|
|
901
|
+
}
|
|
902
|
+
if (previewEnd < text.length) {
|
|
903
|
+
preview = preview + "...";
|
|
904
|
+
}
|
|
905
|
+
results.push({
|
|
906
|
+
sessionId: file.sessionId,
|
|
907
|
+
sessionName: sessionTitle || "Untitled session",
|
|
908
|
+
cwd,
|
|
909
|
+
dirName,
|
|
910
|
+
messageId: msg.id,
|
|
911
|
+
role: msg.role,
|
|
912
|
+
timestamp: msg.timestamp,
|
|
913
|
+
preview,
|
|
914
|
+
matchStart,
|
|
915
|
+
matchLength: query.length,
|
|
916
|
+
fullContent: text.length > 2000 ? text.slice(0, 2000) + "..." : text,
|
|
917
|
+
});
|
|
918
|
+
}
|
|
919
|
+
}
|
|
920
|
+
results.sort((a, b) => b.timestamp - a.timestamp);
|
|
921
|
+
return { results, totalFilesSearched: searchFiles.length, truncated };
|
|
922
|
+
}
|