commandmate 0.1.5 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -0
- package/.next/app-build-manifest.json +72 -0
- package/.next/app-path-routes-manifest.json +1 -0
- package/.next/build-manifest.json +32 -0
- package/.next/cache/.tsbuildinfo +1 -0
- package/.next/cache/config.json +7 -0
- package/.next/cache/webpack/client-production/0.pack +0 -0
- package/.next/cache/webpack/client-production/1.pack +0 -0
- package/.next/cache/webpack/client-production/2.pack +0 -0
- package/.next/cache/webpack/client-production/index.pack +0 -0
- package/.next/cache/webpack/client-production/index.pack.old +0 -0
- package/.next/cache/webpack/edge-server-production/0.pack +0 -0
- package/.next/cache/webpack/edge-server-production/index.pack +0 -0
- package/.next/cache/webpack/server-production/0.pack +0 -0
- package/.next/cache/webpack/server-production/index.pack +0 -0
- package/.next/export-marker.json +1 -0
- package/.next/images-manifest.json +1 -0
- package/.next/next-minimal-server.js.nft.json +1 -0
- package/.next/next-server.js.nft.json +1 -0
- package/.next/package.json +1 -0
- package/.next/prerender-manifest.json +1 -0
- package/.next/react-loadable-manifest.json +249 -0
- package/.next/required-server-files.json +1 -0
- package/.next/routes-manifest.json +1 -0
- package/.next/server/app/_not-found/page.js +1 -0
- package/.next/server/app/_not-found/page.js.nft.json +1 -0
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
- package/.next/server/app/_not-found.html +1 -0
- package/.next/server/app/_not-found.meta +6 -0
- package/.next/server/app/_not-found.rsc +10 -0
- package/.next/server/app/api/external-apps/[id]/health/route.js +45 -0
- package/.next/server/app/api/external-apps/[id]/health/route.js.nft.json +1 -0
- package/.next/server/app/api/external-apps/[id]/route.js +45 -0
- package/.next/server/app/api/external-apps/[id]/route.js.nft.json +1 -0
- package/.next/server/app/api/external-apps/route.js +45 -0
- package/.next/server/app/api/external-apps/route.js.nft.json +1 -0
- package/.next/server/app/api/hooks/claude-done/route.js +19 -0
- package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -0
- package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -0
- package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -0
- package/.next/server/app/api/repositories/clone/route.js +1 -0
- package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -0
- package/.next/server/app/api/repositories/route.js +1 -0
- package/.next/server/app/api/repositories/route.js.nft.json +1 -0
- package/.next/server/app/api/repositories/scan/route.js +1 -0
- package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -0
- package/.next/server/app/api/repositories/sync/route.js +1 -0
- package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -0
- package/.next/server/app/api/slash-commands/route.js +1 -0
- package/.next/server/app/api/slash-commands/route.js.nft.json +1 -0
- package/.next/server/app/api/slash-commands.body +1 -0
- package/.next/server/app/api/slash-commands.meta +1 -0
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/capture/route.js +2 -0
- package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/cli-tool/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/logs/route.js +19 -0
- package/.next/server/app/api/worktrees/[id]/logs/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/memos/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/messages/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/search/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/search/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/send/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/slash-commands/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/start-polling/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/start-polling/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/tree/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/tree/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -0
- package/.next/server/app/api/worktrees/[id]/viewed/route.js.nft.json +1 -0
- package/.next/server/app/api/worktrees/route.js +1 -0
- package/.next/server/app/api/worktrees/route.js.nft.json +1 -0
- package/.next/server/app/apple-icon.png/route.js +1 -0
- package/.next/server/app/apple-icon.png/route.js.nft.json +1 -0
- package/.next/server/app/apple-icon.png.body +0 -0
- package/.next/server/app/apple-icon.png.meta +1 -0
- package/.next/server/app/icon.png/route.js +1 -0
- package/.next/server/app/icon.png/route.js.nft.json +1 -0
- package/.next/server/app/icon.png.body +0 -0
- package/.next/server/app/icon.png.meta +1 -0
- package/.next/server/app/index.html +9 -0
- package/.next/server/app/index.meta +5 -0
- package/.next/server/app/index.rsc +8 -0
- package/.next/server/app/page.js +16 -0
- package/.next/server/app/page.js.nft.json +1 -0
- package/.next/server/app/page_client-reference-manifest.js +1 -0
- package/.next/server/app/proxy/[...path]/route.js +45 -0
- package/.next/server/app/proxy/[...path]/route.js.nft.json +1 -0
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js +1 -0
- package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -0
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -0
- package/.next/server/app/worktrees/[id]/page.js +21 -0
- package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -0
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -0
- package/.next/server/app/worktrees/[id]/simple-terminal/page.js +4 -0
- package/.next/server/app/worktrees/[id]/simple-terminal/page.js.nft.json +1 -0
- package/.next/server/app/worktrees/[id]/simple-terminal/page_client-reference-manifest.js +1 -0
- package/.next/server/app/worktrees/[id]/terminal/page.js +6 -0
- package/.next/server/app/worktrees/[id]/terminal/page.js.nft.json +1 -0
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -0
- package/.next/server/app-paths-manifest.json +46 -0
- package/.next/server/chunks/1318.js +29 -0
- package/.next/server/chunks/1528.js +1 -0
- package/.next/server/chunks/1682.js +6 -0
- package/.next/server/chunks/2518.js +12 -0
- package/.next/server/chunks/3053.js +1 -0
- package/.next/server/chunks/3673.js +1 -0
- package/.next/server/chunks/3853.js +1 -0
- package/.next/server/chunks/434.js +1 -0
- package/.next/server/chunks/4471.js +2 -0
- package/.next/server/chunks/4893.js +2 -0
- package/.next/server/chunks/5972.js +12 -0
- package/.next/server/chunks/6550.js +1 -0
- package/.next/server/chunks/6621.js +1 -0
- package/.next/server/chunks/7213.js +1 -0
- package/.next/server/chunks/7425.js +500 -0
- package/.next/server/chunks/8585.js +1 -0
- package/.next/server/chunks/8887.js +1 -0
- package/.next/server/chunks/8948.js +2 -0
- package/.next/server/chunks/9703.js +31 -0
- package/.next/server/chunks/9723.js +19 -0
- package/.next/server/chunks/font-manifest.json +1 -0
- package/.next/server/edge-runtime-webpack.js +2 -0
- package/.next/server/edge-runtime-webpack.js.map +1 -0
- package/.next/server/font-manifest.json +1 -0
- package/.next/server/functions-config-manifest.json +1 -0
- package/.next/server/interception-route-rewrite-manifest.js +1 -0
- package/.next/server/middleware-build-manifest.js +1 -0
- package/.next/server/middleware-manifest.json +32 -0
- package/.next/server/middleware-react-loadable-manifest.js +1 -0
- package/.next/server/next-font-manifest.js +1 -0
- package/.next/server/next-font-manifest.json +1 -0
- package/.next/server/pages/404.html +1 -0
- package/.next/server/pages/500.html +1 -0
- package/.next/server/pages/_app.js +1 -0
- package/.next/server/pages/_app.js.nft.json +1 -0
- package/.next/server/pages/_document.js +1 -0
- package/.next/server/pages/_document.js.nft.json +1 -0
- package/.next/server/pages/_error.js +1 -0
- package/.next/server/pages/_error.js.nft.json +1 -0
- package/.next/server/pages-manifest.json +1 -0
- package/.next/server/server-reference-manifest.js +1 -0
- package/.next/server/server-reference-manifest.json +1 -0
- package/.next/server/src/middleware.js +14 -0
- package/.next/server/src/middleware.js.map +1 -0
- package/.next/server/webpack-runtime.js +1 -0
- package/.next/static/3jNZMmFnQhc5G7met-OU4/_buildManifest.js +1 -0
- package/.next/static/3jNZMmFnQhc5G7met-OU4/_ssgManifest.js +1 -0
- package/.next/static/chunks/0dbeb660.3e800dfbd28be3bd.js +53 -0
- package/.next/static/chunks/1015.0eaa4da7f61149bc.js +59 -0
- package/.next/static/chunks/1098.49268c9fe1b028fa.js +1 -0
- package/.next/static/chunks/13.feeafc7cc620f8c4.js +1 -0
- package/.next/static/chunks/1423.7b1e8bf760d28078.js +1 -0
- package/.next/static/chunks/1582.9f8590f71ff798ca.js +55 -0
- package/.next/static/chunks/1817.a66d96cedb761daa.js +262 -0
- package/.next/static/chunks/2117-d845c2cd62e344a6.js +2 -0
- package/.next/static/chunks/2398.0b21e4eb7006a230.js +93 -0
- package/.next/static/chunks/2526.8ac62b527c9ab703.js +43 -0
- package/.next/static/chunks/2626.2125083a1ff3b80a.js +29 -0
- package/.next/static/chunks/2689.720a4874b02d4211.js +174 -0
- package/.next/static/chunks/2853-d11a80b03c9a1640.js +1 -0
- package/.next/static/chunks/2957-327e43ef4c12808f.js +1 -0
- package/.next/static/chunks/2cdb6380.35626fc6e41bbba4.js +136 -0
- package/.next/static/chunks/30d07d85-393352a92199f695.js +3 -0
- package/.next/static/chunks/3559.f073f72c4466ce0e.js +1 -0
- package/.next/static/chunks/3574.7a94c27e6a496a56.js +63 -0
- package/.next/static/chunks/383.20683891c9a5f2c4.js +4 -0
- package/.next/static/chunks/3843.3fdda732987f7bb8.js +1 -0
- package/.next/static/chunks/3852.822389f445c9b427.js +1 -0
- package/.next/static/chunks/3991.4bc063cb5be3a86c.js +1 -0
- package/.next/static/chunks/4212.52c1bb34fc97d0d0.js +131 -0
- package/.next/static/chunks/4327.3b84aa049900fdeb.js +60 -0
- package/.next/static/chunks/4362.7bd6f0282e49d79b.js +1 -0
- package/.next/static/chunks/4721.40615a5f4f32b5fb.js +1 -0
- package/.next/static/chunks/4851-45df4d388db5623f.js +1 -0
- package/.next/static/chunks/5112.17318d1c6b28044b.js +1 -0
- package/.next/static/chunks/5126.93fa4e797d609286.js +56 -0
- package/.next/static/chunks/5387.47590ac4ef66c864.js +5 -0
- package/.next/static/chunks/5813.4483664ba482beb1.js +1 -0
- package/.next/static/chunks/6143.1450875bd03a2366.js +36 -0
- package/.next/static/chunks/6406.9653f0d41ab85059.js +1 -0
- package/.next/static/chunks/656.d72f25ce819bd77e.js +149 -0
- package/.next/static/chunks/6678.492e73ca42b2a273.js +62 -0
- package/.next/static/chunks/6725-f7607851b7d57eb1.js +1 -0
- package/.next/static/chunks/6792.3c01ac4dda4b5c6d.js +1 -0
- package/.next/static/chunks/7004.808cbf327ef5955e.js +1 -0
- package/.next/static/chunks/7290.09ef84cf94f90c4d.js +1 -0
- package/.next/static/chunks/7415.6b481c2baf363262.js +148 -0
- package/.next/static/chunks/7648-325564a6e12a3257.js +1 -0
- package/.next/static/chunks/7665.47fccad04449a8f9.js +215 -0
- package/.next/static/chunks/7753.6bdce86b7fde3d10.js +166 -0
- package/.next/static/chunks/8125.245a9df052d274fb.js +1 -0
- package/.next/static/chunks/816-7e340dad784be28c.js +1 -0
- package/.next/static/chunks/8288.4883743fa40672e2.js +24 -0
- package/.next/static/chunks/8522.1607e96011c66877.js +1 -0
- package/.next/static/chunks/8772.863c564498d88487.js +1 -0
- package/.next/static/chunks/8841.dadeb1ece8e46004.js +1 -0
- package/.next/static/chunks/8885.f8d9912b40d74811.js +1 -0
- package/.next/static/chunks/90542734.c1553d0fe7fc14fc.js +1 -0
- package/.next/static/chunks/9365-733d8c05712d2888.js +1 -0
- package/.next/static/chunks/9552.b7dfb7903ead934b.js +1 -0
- package/.next/static/chunks/9834.295b45635ce04f5e.js +24 -0
- package/.next/static/chunks/app/_not-found/page-a9d04e58c81115ec.js +1 -0
- package/.next/static/chunks/app/layout-37e55f11dcc8b1bf.js +1 -0
- package/.next/static/chunks/app/page-9cd00de9cc0abc43.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-9e5adf57cbbbdf05.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/page-8c6676303b63fdaf.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/simple-terminal/page-16feb3e86e42f4d1.js +1 -0
- package/.next/static/chunks/app/worktrees/[id]/terminal/page-be802baffc84dbd2.js +1 -0
- package/.next/static/chunks/d3ac728e.6c9c508274d4d2d5.js +1 -0
- package/.next/static/chunks/fd9d1056-bbe86e4ae099d5cd.js +1 -0
- package/.next/static/chunks/framework-8e0e0f4a6b83a956.js +1 -0
- package/.next/static/chunks/main-a960f4a5e1a2f598.js +1 -0
- package/.next/static/chunks/main-app-420d93e43682fee5.js +1 -0
- package/.next/static/chunks/pages/_app-3c9ca398d360b709.js +1 -0
- package/.next/static/chunks/pages/_error-cf5ca766ac8f493f.js +1 -0
- package/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/.next/static/chunks/webpack-3fc79fab9bb738d7.js +1 -0
- package/.next/static/css/5eacd01f773eed7f.css +11 -0
- package/.next/static/css/85fa6dafca566008.css +1 -0
- package/.next/static/css/e174aa24f94ce607.css +3 -0
- package/.next/trace +5 -0
- package/.next/types/app/api/external-apps/[id]/health/route.ts +343 -0
- package/.next/types/app/api/external-apps/[id]/route.ts +343 -0
- package/.next/types/app/api/external-apps/route.ts +343 -0
- package/.next/types/app/api/hooks/claude-done/route.ts +343 -0
- package/.next/types/app/api/repositories/clone/[jobId]/route.ts +343 -0
- package/.next/types/app/api/repositories/clone/route.ts +343 -0
- package/.next/types/app/api/repositories/route.ts +343 -0
- package/.next/types/app/api/repositories/scan/route.ts +343 -0
- package/.next/types/app/api/repositories/sync/route.ts +343 -0
- package/.next/types/app/api/slash-commands/route.ts +343 -0
- package/.next/types/app/api/worktrees/[id]/auto-yes/route.ts +343 -0
- package/.next/types/app/api/worktrees/[id]/capture/route.ts +343 -0
- package/.next/types/app/api/worktrees/[id]/cli-tool/route.ts +343 -0
- package/.next/types/app/api/worktrees/[id]/current-output/route.ts +343 -0
- package/.next/types/app/api/worktrees/[id]/files/[...path]/route.ts +343 -0
- package/.next/types/app/api/worktrees/[id]/interrupt/route.ts +343 -0
- package/.next/types/app/api/worktrees/[id]/kill-session/route.ts +343 -0
- package/.next/types/app/api/worktrees/[id]/logs/[filename]/route.ts +343 -0
- package/.next/types/app/api/worktrees/[id]/logs/route.ts +343 -0
- package/.next/types/app/api/worktrees/[id]/memos/[memoId]/route.ts +343 -0
- package/.next/types/app/api/worktrees/[id]/memos/route.ts +343 -0
- package/.next/types/app/api/worktrees/[id]/messages/route.ts +343 -0
- package/.next/types/app/api/worktrees/[id]/prompt-response/route.ts +343 -0
- package/.next/types/app/api/worktrees/[id]/respond/route.ts +343 -0
- package/.next/types/app/api/worktrees/[id]/route.ts +343 -0
- package/.next/types/app/api/worktrees/[id]/search/route.ts +343 -0
- package/.next/types/app/api/worktrees/[id]/send/route.ts +343 -0
- package/.next/types/app/api/worktrees/[id]/slash-commands/route.ts +343 -0
- package/.next/types/app/api/worktrees/[id]/start-polling/route.ts +343 -0
- package/.next/types/app/api/worktrees/[id]/terminal/route.ts +343 -0
- package/.next/types/app/api/worktrees/[id]/tree/[...path]/route.ts +343 -0
- package/.next/types/app/api/worktrees/[id]/tree/route.ts +343 -0
- package/.next/types/app/api/worktrees/[id]/upload/[...path]/route.ts +343 -0
- package/.next/types/app/api/worktrees/[id]/viewed/route.ts +343 -0
- package/.next/types/app/api/worktrees/route.ts +343 -0
- package/.next/types/app/page.ts +79 -0
- package/.next/types/app/proxy/[...path]/route.ts +343 -0
- package/.next/types/app/worktrees/[id]/files/[...path]/page.ts +79 -0
- package/.next/types/app/worktrees/[id]/page.ts +79 -0
- package/.next/types/app/worktrees/[id]/simple-terminal/page.ts +79 -0
- package/.next/types/app/worktrees/[id]/terminal/page.ts +79 -0
- package/.next/types/package.json +1 -0
- package/README.md +39 -8
- package/dist/cli/commands/init.d.ts +1 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +143 -27
- package/dist/cli/types/index.d.ts +18 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/utils/env-setup.d.ts +25 -0
- package/dist/cli/utils/env-setup.d.ts.map +1 -1
- package/dist/cli/utils/env-setup.js +56 -1
- package/dist/cli/utils/prompt.d.ts +68 -0
- package/dist/cli/utils/prompt.d.ts.map +1 -0
- package/dist/cli/utils/prompt.js +208 -0
- package/dist/server/server.js +123 -0
- package/dist/server/src/lib/claude-output.js +33 -0
- package/dist/server/src/lib/claude-session.js +312 -0
- package/dist/server/src/lib/cli-patterns.js +137 -0
- package/dist/server/src/lib/cli-session.js +73 -0
- package/dist/server/src/lib/cli-tools/base.js +51 -0
- package/dist/server/src/lib/cli-tools/claude.js +65 -0
- package/dist/server/src/lib/cli-tools/codex.js +132 -0
- package/dist/server/src/lib/cli-tools/gemini.js +122 -0
- package/dist/server/src/lib/cli-tools/index.js +22 -0
- package/dist/server/src/lib/cli-tools/manager.js +143 -0
- package/dist/server/src/lib/cli-tools/types.js +5 -0
- package/dist/server/src/lib/conversation-logger.js +25 -0
- package/dist/server/src/lib/db-instance.js +51 -0
- package/dist/server/src/lib/db-migrations.js +777 -0
- package/dist/server/src/lib/db.js +835 -0
- package/dist/server/src/lib/env.js +179 -0
- package/dist/server/src/lib/log-manager.js +234 -0
- package/dist/server/src/lib/logger.js +232 -0
- package/dist/server/src/lib/prompt-detector.js +285 -0
- package/dist/server/src/lib/response-poller.js +638 -0
- package/dist/server/src/lib/tmux.js +299 -0
- package/dist/server/src/lib/worktrees.js +231 -0
- package/dist/server/src/lib/ws-server.js +323 -0
- package/dist/server/src/types/clone.js +39 -0
- package/dist/server/src/types/conversation.js +9 -0
- package/dist/server/src/types/external-apps.js +6 -0
- package/dist/server/src/types/infinite-messages.js +65 -0
- package/dist/server/src/types/markdown-editor.js +94 -0
- package/dist/server/src/types/models.js +5 -0
- package/dist/server/src/types/sidebar.js +89 -0
- package/dist/server/src/types/slash-commands.js +47 -0
- package/dist/server/src/types/ui-actions.js +8 -0
- package/dist/server/src/types/ui-state.js +62 -0
- package/package.json +8 -4
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* WebSocket Server for Real-time Communication
|
|
4
|
+
* Manages WebSocket connections and room-based message broadcasting
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.setupWebSocket = setupWebSocket;
|
|
8
|
+
exports.broadcast = broadcast;
|
|
9
|
+
exports.broadcastMessage = broadcastMessage;
|
|
10
|
+
exports.cleanupRooms = cleanupRooms;
|
|
11
|
+
exports.closeWebSocket = closeWebSocket;
|
|
12
|
+
const ws_1 = require("ws");
|
|
13
|
+
// Global state
|
|
14
|
+
let wss = null;
|
|
15
|
+
const clients = new Map();
|
|
16
|
+
const rooms = new Map();
|
|
17
|
+
/**
|
|
18
|
+
* Setup WebSocket server on HTTP server
|
|
19
|
+
*
|
|
20
|
+
* @param server - HTTP server instance
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* const server = createServer();
|
|
25
|
+
* setupWebSocket(server);
|
|
26
|
+
* server.listen(3000);
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
function setupWebSocket(server) {
|
|
30
|
+
wss = new ws_1.WebSocketServer({ server });
|
|
31
|
+
// Handle WebSocket server errors (e.g., invalid frames from clients)
|
|
32
|
+
wss.on('error', (error) => {
|
|
33
|
+
console.error('[WS Server] Error:', error.message);
|
|
34
|
+
});
|
|
35
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
36
|
+
wss.on('connection', (ws, req) => {
|
|
37
|
+
// Connection logging removed to reduce noise
|
|
38
|
+
// Initialize client info
|
|
39
|
+
const clientInfo = {
|
|
40
|
+
ws,
|
|
41
|
+
worktreeIds: new Set(),
|
|
42
|
+
};
|
|
43
|
+
clients.set(ws, clientInfo);
|
|
44
|
+
// Handle underlying socket errors (catches invalid frame errors earlier)
|
|
45
|
+
// Force destroy the socket on error to prevent further frame processing
|
|
46
|
+
const socket = ws._socket;
|
|
47
|
+
if (socket) {
|
|
48
|
+
socket.on('error', (err) => {
|
|
49
|
+
// Suppress common mobile browser disconnect errors
|
|
50
|
+
const isExpectedError = err.code === 'WS_ERR_INVALID_CLOSE_CODE' ||
|
|
51
|
+
err.message?.includes('Invalid WebSocket frame') ||
|
|
52
|
+
err.message?.includes('write after end') ||
|
|
53
|
+
err.message?.includes('ECONNRESET') ||
|
|
54
|
+
err.message?.includes('EPIPE');
|
|
55
|
+
if (!isExpectedError) {
|
|
56
|
+
console.error('[WS Socket] Error:', err.message);
|
|
57
|
+
}
|
|
58
|
+
// Immediately destroy the socket to prevent further errors
|
|
59
|
+
try {
|
|
60
|
+
if (socket.destroy)
|
|
61
|
+
socket.destroy();
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// Socket may already be destroyed
|
|
65
|
+
}
|
|
66
|
+
handleDisconnect(ws);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
// Handle messages
|
|
70
|
+
ws.on('message', (data) => {
|
|
71
|
+
try {
|
|
72
|
+
const message = JSON.parse(data.toString());
|
|
73
|
+
handleMessage(ws, message);
|
|
74
|
+
}
|
|
75
|
+
catch (parseError) {
|
|
76
|
+
console.error('Error parsing WebSocket message:', parseError);
|
|
77
|
+
// Don't close connection on parse error, just log it
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
// Handle disconnection - silently clean up
|
|
81
|
+
ws.on('close', () => {
|
|
82
|
+
handleDisconnect(ws);
|
|
83
|
+
});
|
|
84
|
+
// Handle errors (including invalid close codes from mobile browsers)
|
|
85
|
+
ws.on('error', (error) => {
|
|
86
|
+
// Suppress noisy errors from mobile browser disconnects
|
|
87
|
+
const isExpectedError = error.code === 'WS_ERR_INVALID_CLOSE_CODE' ||
|
|
88
|
+
error.message?.includes('Invalid WebSocket frame') ||
|
|
89
|
+
error.message?.includes('write after end');
|
|
90
|
+
if (!isExpectedError) {
|
|
91
|
+
console.error('[WS] WebSocket error:', error.message);
|
|
92
|
+
}
|
|
93
|
+
// Immediately terminate to prevent further errors
|
|
94
|
+
try {
|
|
95
|
+
ws.terminate();
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// WebSocket may already be closed
|
|
99
|
+
}
|
|
100
|
+
handleDisconnect(ws);
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
console.log('WebSocket server initialized');
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Handle incoming WebSocket message
|
|
107
|
+
*/
|
|
108
|
+
function handleMessage(ws, message) {
|
|
109
|
+
switch (message.type) {
|
|
110
|
+
case 'subscribe':
|
|
111
|
+
handleSubscribe(ws, message.worktreeId);
|
|
112
|
+
break;
|
|
113
|
+
case 'unsubscribe':
|
|
114
|
+
handleUnsubscribe(ws, message.worktreeId);
|
|
115
|
+
break;
|
|
116
|
+
case 'broadcast':
|
|
117
|
+
handleBroadcast(message.worktreeId, message.data);
|
|
118
|
+
break;
|
|
119
|
+
default:
|
|
120
|
+
console.warn('Unknown message type:', message);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Subscribe client to a worktree room
|
|
125
|
+
*/
|
|
126
|
+
function handleSubscribe(ws, worktreeId) {
|
|
127
|
+
const clientInfo = clients.get(ws);
|
|
128
|
+
if (!clientInfo) {
|
|
129
|
+
console.log(`[WS] handleSubscribe: clientInfo not found for worktreeId: ${worktreeId}`);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
// Add worktreeId to client's subscriptions
|
|
133
|
+
clientInfo.worktreeIds.add(worktreeId);
|
|
134
|
+
// Add client to room
|
|
135
|
+
if (!rooms.has(worktreeId)) {
|
|
136
|
+
rooms.set(worktreeId, new Set());
|
|
137
|
+
}
|
|
138
|
+
const room = rooms.get(worktreeId);
|
|
139
|
+
room.add(ws);
|
|
140
|
+
console.log(`Client subscribed to worktree: ${worktreeId}, room size: ${room.size}, ws readyState: ${ws.readyState}`);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Unsubscribe client from a worktree room
|
|
144
|
+
*/
|
|
145
|
+
function handleUnsubscribe(ws, worktreeId) {
|
|
146
|
+
const clientInfo = clients.get(ws);
|
|
147
|
+
if (!clientInfo)
|
|
148
|
+
return;
|
|
149
|
+
// Remove worktreeId from client's subscriptions
|
|
150
|
+
clientInfo.worktreeIds.delete(worktreeId);
|
|
151
|
+
// Remove client from room
|
|
152
|
+
const room = rooms.get(worktreeId);
|
|
153
|
+
if (room) {
|
|
154
|
+
room.delete(ws);
|
|
155
|
+
// Clean up empty rooms
|
|
156
|
+
if (room.size === 0) {
|
|
157
|
+
rooms.delete(worktreeId);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
console.log(`Client unsubscribed from worktree: ${worktreeId}`);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Broadcast message to all clients in a worktree room
|
|
164
|
+
*/
|
|
165
|
+
function handleBroadcast(worktreeId, data) {
|
|
166
|
+
const room = rooms.get(worktreeId);
|
|
167
|
+
console.log(`[WS] handleBroadcast called for ${worktreeId}, room size: ${room?.size || 0}`);
|
|
168
|
+
if (!room) {
|
|
169
|
+
console.log(`[WS] No room found for ${worktreeId}`);
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
if (room.size === 0) {
|
|
173
|
+
console.log(`[WS] Room for ${worktreeId} is empty`);
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
try {
|
|
177
|
+
const message = JSON.stringify({
|
|
178
|
+
type: 'broadcast',
|
|
179
|
+
worktreeId,
|
|
180
|
+
data,
|
|
181
|
+
});
|
|
182
|
+
let successCount = 0;
|
|
183
|
+
let errorCount = 0;
|
|
184
|
+
room.forEach((client) => {
|
|
185
|
+
if (client.readyState === ws_1.WebSocket.OPEN) {
|
|
186
|
+
try {
|
|
187
|
+
client.send(message);
|
|
188
|
+
successCount++;
|
|
189
|
+
}
|
|
190
|
+
catch (sendError) {
|
|
191
|
+
errorCount++;
|
|
192
|
+
console.error(`Error sending WebSocket message to client:`, sendError);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
console.log(`Broadcast to worktree ${worktreeId}: ${successCount}/${room.size} clients (${errorCount} errors)`);
|
|
197
|
+
}
|
|
198
|
+
catch (broadcastError) {
|
|
199
|
+
console.error(`Error broadcasting to worktree ${worktreeId}:`, broadcastError);
|
|
200
|
+
// Try to broadcast with sanitized data
|
|
201
|
+
try {
|
|
202
|
+
const sanitizedMessage = JSON.stringify({
|
|
203
|
+
type: 'broadcast',
|
|
204
|
+
worktreeId,
|
|
205
|
+
data: { error: 'Message encoding error' },
|
|
206
|
+
});
|
|
207
|
+
room.forEach((client) => {
|
|
208
|
+
if (client.readyState === ws_1.WebSocket.OPEN) {
|
|
209
|
+
try {
|
|
210
|
+
client.send(sanitizedMessage);
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
// Silent fail for fallback
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
catch (fallbackError) {
|
|
219
|
+
console.error('Failed to send fallback message:', fallbackError);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Handle client disconnection
|
|
225
|
+
*/
|
|
226
|
+
function handleDisconnect(ws) {
|
|
227
|
+
const clientInfo = clients.get(ws);
|
|
228
|
+
if (!clientInfo)
|
|
229
|
+
return;
|
|
230
|
+
// Remove client from all rooms
|
|
231
|
+
clientInfo.worktreeIds.forEach((worktreeId) => {
|
|
232
|
+
const room = rooms.get(worktreeId);
|
|
233
|
+
if (room) {
|
|
234
|
+
room.delete(ws);
|
|
235
|
+
// Clean up empty rooms
|
|
236
|
+
if (room.size === 0) {
|
|
237
|
+
rooms.delete(worktreeId);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
// Remove client from clients map
|
|
242
|
+
clients.delete(ws);
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Broadcast message to a specific worktree room (for API use)
|
|
246
|
+
*
|
|
247
|
+
* @param worktreeId - Worktree identifier
|
|
248
|
+
* @param data - Data to broadcast
|
|
249
|
+
*
|
|
250
|
+
* @example
|
|
251
|
+
* ```typescript
|
|
252
|
+
* broadcast('feature-foo', { type: 'message', content: 'New message' });
|
|
253
|
+
* ```
|
|
254
|
+
*/
|
|
255
|
+
function broadcast(worktreeId, data) {
|
|
256
|
+
handleBroadcast(worktreeId, data);
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Broadcast message with type to a specific worktree room
|
|
260
|
+
*
|
|
261
|
+
* @param type - Message type
|
|
262
|
+
* @param data - Data to broadcast (should include worktreeId)
|
|
263
|
+
*
|
|
264
|
+
* @example
|
|
265
|
+
* ```typescript
|
|
266
|
+
* broadcastMessage('message', { worktreeId: 'feature-foo', message: {...} });
|
|
267
|
+
* ```
|
|
268
|
+
*/
|
|
269
|
+
function broadcastMessage(type, data) {
|
|
270
|
+
if (data.worktreeId) {
|
|
271
|
+
handleBroadcast(data.worktreeId, { type, ...data });
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
console.warn('broadcastMessage called without worktreeId');
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Clean up WebSocket rooms for deleted worktrees
|
|
279
|
+
* Removes rooms from the rooms map (clients will naturally disconnect or resubscribe)
|
|
280
|
+
*
|
|
281
|
+
* @param worktreeIds - Array of worktree IDs to clean up
|
|
282
|
+
*
|
|
283
|
+
* @example
|
|
284
|
+
* ```typescript
|
|
285
|
+
* cleanupRooms(['wt-1', 'wt-2', 'wt-3']);
|
|
286
|
+
* ```
|
|
287
|
+
*/
|
|
288
|
+
function cleanupRooms(worktreeIds) {
|
|
289
|
+
for (const worktreeId of worktreeIds) {
|
|
290
|
+
const room = rooms.get(worktreeId);
|
|
291
|
+
if (room) {
|
|
292
|
+
// Unsubscribe all clients from this room
|
|
293
|
+
room.forEach((ws) => {
|
|
294
|
+
const clientInfo = clients.get(ws);
|
|
295
|
+
if (clientInfo) {
|
|
296
|
+
clientInfo.worktreeIds.delete(worktreeId);
|
|
297
|
+
}
|
|
298
|
+
});
|
|
299
|
+
// Delete the room
|
|
300
|
+
rooms.delete(worktreeId);
|
|
301
|
+
console.log(`[WS] Cleaned up room for worktree: ${worktreeId}`);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Close WebSocket server
|
|
307
|
+
* Used for testing and graceful shutdown
|
|
308
|
+
*/
|
|
309
|
+
function closeWebSocket() {
|
|
310
|
+
if (wss) {
|
|
311
|
+
// Close all client connections
|
|
312
|
+
clients.forEach((clientInfo) => {
|
|
313
|
+
clientInfo.ws.close();
|
|
314
|
+
});
|
|
315
|
+
// Clear state
|
|
316
|
+
clients.clear();
|
|
317
|
+
rooms.clear();
|
|
318
|
+
// Close server
|
|
319
|
+
wss.close();
|
|
320
|
+
wss = null;
|
|
321
|
+
console.log('WebSocket server closed');
|
|
322
|
+
}
|
|
323
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Clone URL Registration Types
|
|
4
|
+
* Issue #71: Clone URL registration feature
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.isCloneJobStatus = isCloneJobStatus;
|
|
8
|
+
exports.isCloneError = isCloneError;
|
|
9
|
+
exports.isValidationError = isValidationError;
|
|
10
|
+
// Type guards
|
|
11
|
+
/**
|
|
12
|
+
* Check if value is a valid CloneJobStatus
|
|
13
|
+
*/
|
|
14
|
+
function isCloneJobStatus(value) {
|
|
15
|
+
return (typeof value === 'string' &&
|
|
16
|
+
['pending', 'running', 'completed', 'failed', 'cancelled'].includes(value));
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Check if value is a valid CloneError
|
|
20
|
+
*/
|
|
21
|
+
function isCloneError(value) {
|
|
22
|
+
if (!value || typeof value !== 'object') {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
const obj = value;
|
|
26
|
+
const validCategories = ['validation', 'network', 'auth', 'filesystem', 'git', 'system'];
|
|
27
|
+
return (typeof obj.category === 'string' &&
|
|
28
|
+
validCategories.includes(obj.category) &&
|
|
29
|
+
typeof obj.code === 'string' &&
|
|
30
|
+
typeof obj.message === 'string' &&
|
|
31
|
+
typeof obj.recoverable === 'boolean' &&
|
|
32
|
+
typeof obj.suggestedAction === 'string');
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Check if error is a validation error
|
|
36
|
+
*/
|
|
37
|
+
function isValidationError(error) {
|
|
38
|
+
return error.category === 'validation';
|
|
39
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Conversation Pair Types
|
|
4
|
+
*
|
|
5
|
+
* Types for grouping user-assistant message pairs in the UI layer.
|
|
6
|
+
* These types are used to display conversation history with 1:1 correspondence
|
|
7
|
+
* between user inputs and assistant responses.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Type definitions for infinite message loading functionality
|
|
4
|
+
*
|
|
5
|
+
* Used by useInfiniteMessages hook and related components.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.createInfiniteMessagesError = createInfiniteMessagesError;
|
|
9
|
+
/**
|
|
10
|
+
* Creates a structured InfiniteMessagesError from an unknown error
|
|
11
|
+
*
|
|
12
|
+
* @param options - Error creation options
|
|
13
|
+
* @returns Structured error object
|
|
14
|
+
*/
|
|
15
|
+
function createInfiniteMessagesError(options) {
|
|
16
|
+
const { error, defaultMessage = 'An error occurred' } = options;
|
|
17
|
+
// Handle TypeError (typically network errors)
|
|
18
|
+
if (error instanceof TypeError && error.message.includes('fetch')) {
|
|
19
|
+
return {
|
|
20
|
+
code: 'NETWORK_ERROR',
|
|
21
|
+
message: 'Network error occurred. Please check your connection.',
|
|
22
|
+
retryable: true,
|
|
23
|
+
originalError: error,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
// Handle Response objects (server errors)
|
|
27
|
+
if (error instanceof Response) {
|
|
28
|
+
if (error.status >= 500) {
|
|
29
|
+
return {
|
|
30
|
+
code: 'SERVER_ERROR',
|
|
31
|
+
message: 'Server error occurred. Please try again later.',
|
|
32
|
+
retryable: true,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
code: 'UNKNOWN',
|
|
37
|
+
message: `Request failed with status ${error.status}`,
|
|
38
|
+
retryable: error.status !== 404,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
// Handle SyntaxError (parse errors)
|
|
42
|
+
if (error instanceof SyntaxError) {
|
|
43
|
+
return {
|
|
44
|
+
code: 'PARSE_ERROR',
|
|
45
|
+
message: 'Failed to parse response. Please try again.',
|
|
46
|
+
retryable: true,
|
|
47
|
+
originalError: error,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
// Handle generic Error objects
|
|
51
|
+
if (error instanceof Error) {
|
|
52
|
+
return {
|
|
53
|
+
code: 'UNKNOWN',
|
|
54
|
+
message: error.message || defaultMessage,
|
|
55
|
+
retryable: true,
|
|
56
|
+
originalError: error,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// Handle unknown error types
|
|
60
|
+
return {
|
|
61
|
+
code: 'UNKNOWN',
|
|
62
|
+
message: defaultMessage,
|
|
63
|
+
retryable: true,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Type definitions for markdown editor feature
|
|
4
|
+
*
|
|
5
|
+
* @module types/markdown-editor
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.DEFAULT_LAYOUT_STATE = exports.MAX_SPLIT_RATIO = exports.MIN_SPLIT_RATIO = exports.DEFAULT_SPLIT_RATIO = exports.FILE_SIZE_LIMITS = exports.PREVIEW_DEBOUNCE_MS = exports.LOCAL_STORAGE_KEY_MAXIMIZED = exports.LOCAL_STORAGE_KEY_SPLIT_RATIO = exports.LOCAL_STORAGE_KEY = exports.VIEW_MODE_STRATEGIES = void 0;
|
|
9
|
+
exports.isValidSplitRatio = isValidSplitRatio;
|
|
10
|
+
exports.isValidBoolean = isValidBoolean;
|
|
11
|
+
/**
|
|
12
|
+
* View mode strategies lookup
|
|
13
|
+
*/
|
|
14
|
+
exports.VIEW_MODE_STRATEGIES = {
|
|
15
|
+
split: {
|
|
16
|
+
showEditor: true,
|
|
17
|
+
showPreview: true,
|
|
18
|
+
editorWidth: 'w-1/2',
|
|
19
|
+
previewWidth: 'w-1/2',
|
|
20
|
+
},
|
|
21
|
+
editor: {
|
|
22
|
+
showEditor: true,
|
|
23
|
+
showPreview: false,
|
|
24
|
+
editorWidth: 'w-full',
|
|
25
|
+
previewWidth: 'w-0',
|
|
26
|
+
},
|
|
27
|
+
preview: {
|
|
28
|
+
showEditor: false,
|
|
29
|
+
showPreview: true,
|
|
30
|
+
editorWidth: 'w-0',
|
|
31
|
+
previewWidth: 'w-full',
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Local storage key for view mode persistence
|
|
36
|
+
*/
|
|
37
|
+
exports.LOCAL_STORAGE_KEY = 'commandmate:md-editor-view-mode';
|
|
38
|
+
/**
|
|
39
|
+
* Local storage key for split ratio persistence
|
|
40
|
+
*/
|
|
41
|
+
exports.LOCAL_STORAGE_KEY_SPLIT_RATIO = 'commandmate:md-editor-split-ratio';
|
|
42
|
+
/**
|
|
43
|
+
* Local storage key for maximized state persistence
|
|
44
|
+
*/
|
|
45
|
+
exports.LOCAL_STORAGE_KEY_MAXIMIZED = 'commandmate:md-editor-maximized';
|
|
46
|
+
/**
|
|
47
|
+
* Default debounce delay for preview updates (in milliseconds)
|
|
48
|
+
*/
|
|
49
|
+
exports.PREVIEW_DEBOUNCE_MS = 300;
|
|
50
|
+
/**
|
|
51
|
+
* File size thresholds
|
|
52
|
+
*/
|
|
53
|
+
exports.FILE_SIZE_LIMITS = {
|
|
54
|
+
/** Warning threshold (500KB) */
|
|
55
|
+
WARNING_THRESHOLD: 500 * 1024,
|
|
56
|
+
/** Maximum file size (1MB) */
|
|
57
|
+
MAX_SIZE: 1024 * 1024,
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Default split ratio (50:50)
|
|
61
|
+
*/
|
|
62
|
+
exports.DEFAULT_SPLIT_RATIO = 0.5;
|
|
63
|
+
/**
|
|
64
|
+
* Minimum split ratio (10%)
|
|
65
|
+
*/
|
|
66
|
+
exports.MIN_SPLIT_RATIO = 0.1;
|
|
67
|
+
/**
|
|
68
|
+
* Maximum split ratio (90%)
|
|
69
|
+
*/
|
|
70
|
+
exports.MAX_SPLIT_RATIO = 0.9;
|
|
71
|
+
/**
|
|
72
|
+
* Default editor layout state
|
|
73
|
+
*/
|
|
74
|
+
exports.DEFAULT_LAYOUT_STATE = {
|
|
75
|
+
viewMode: 'split',
|
|
76
|
+
isMaximized: false,
|
|
77
|
+
splitRatio: exports.DEFAULT_SPLIT_RATIO,
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* Validate split ratio value
|
|
81
|
+
* @param value - Value to validate
|
|
82
|
+
* @returns true if valid split ratio (0.1-0.9)
|
|
83
|
+
*/
|
|
84
|
+
function isValidSplitRatio(value) {
|
|
85
|
+
return typeof value === 'number' && value >= exports.MIN_SPLIT_RATIO && value <= exports.MAX_SPLIT_RATIO;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Validate boolean value from localStorage
|
|
89
|
+
* @param value - Value to validate
|
|
90
|
+
* @returns true if valid boolean
|
|
91
|
+
*/
|
|
92
|
+
function isValidBoolean(value) {
|
|
93
|
+
return typeof value === 'boolean';
|
|
94
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Sidebar Type Definitions
|
|
4
|
+
*
|
|
5
|
+
* Types for sidebar components and branch status display
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.calculateHasUnread = calculateHasUnread;
|
|
9
|
+
exports.toBranchItem = toBranchItem;
|
|
10
|
+
/**
|
|
11
|
+
* Determine branch status from Worktree data
|
|
12
|
+
*
|
|
13
|
+
* Status priority:
|
|
14
|
+
* - waiting: Claude asked a yes/no prompt, waiting for user's answer (green dot)
|
|
15
|
+
* - running: Claude is actively processing user's request (spinner)
|
|
16
|
+
* - ready: Session running, waiting for user's new message (green dot)
|
|
17
|
+
* - idle: Session not running (gray dot)
|
|
18
|
+
*/
|
|
19
|
+
function determineBranchStatus(worktree) {
|
|
20
|
+
// Check CLI-specific status first
|
|
21
|
+
const claudeStatus = worktree.sessionStatusByCli?.claude;
|
|
22
|
+
if (claudeStatus) {
|
|
23
|
+
if (claudeStatus.isWaitingForResponse) {
|
|
24
|
+
return 'waiting';
|
|
25
|
+
}
|
|
26
|
+
if (claudeStatus.isProcessing) {
|
|
27
|
+
return 'running';
|
|
28
|
+
}
|
|
29
|
+
// Session running but not processing = ready (waiting for user to type new message)
|
|
30
|
+
if (claudeStatus.isRunning) {
|
|
31
|
+
return 'ready';
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// Fall back to legacy status fields
|
|
35
|
+
if (worktree.isWaitingForResponse) {
|
|
36
|
+
return 'waiting';
|
|
37
|
+
}
|
|
38
|
+
if (worktree.isProcessing) {
|
|
39
|
+
return 'running';
|
|
40
|
+
}
|
|
41
|
+
// Session running but not processing = ready
|
|
42
|
+
if (worktree.isSessionRunning) {
|
|
43
|
+
return 'ready';
|
|
44
|
+
}
|
|
45
|
+
return 'idle';
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Calculate whether a worktree has unread messages
|
|
49
|
+
*
|
|
50
|
+
* hasUnread is true when:
|
|
51
|
+
* - There is at least one assistant message (lastAssistantMessageAt exists)
|
|
52
|
+
* - AND the user has never viewed this worktree (lastViewedAt is null)
|
|
53
|
+
* OR the last assistant message is newer than the last view
|
|
54
|
+
*
|
|
55
|
+
* @param worktree - Source worktree data
|
|
56
|
+
* @returns true if there are unread messages
|
|
57
|
+
*/
|
|
58
|
+
function calculateHasUnread(worktree) {
|
|
59
|
+
// No assistant messages = no unread
|
|
60
|
+
if (!worktree.lastAssistantMessageAt) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
// Never viewed but has assistant message = unread
|
|
64
|
+
if (!worktree.lastViewedAt) {
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
// Compare timestamps: unread if assistant message is newer than last view
|
|
68
|
+
return new Date(worktree.lastAssistantMessageAt) > new Date(worktree.lastViewedAt);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Convert Worktree to SidebarBranchItem for display
|
|
72
|
+
*
|
|
73
|
+
* @param worktree - Source worktree data
|
|
74
|
+
* @returns SidebarBranchItem for sidebar display
|
|
75
|
+
*/
|
|
76
|
+
function toBranchItem(worktree) {
|
|
77
|
+
const status = determineBranchStatus(worktree);
|
|
78
|
+
// Use new hasUnread logic based on lastAssistantMessageAt and lastViewedAt
|
|
79
|
+
const hasUnread = calculateHasUnread(worktree);
|
|
80
|
+
return {
|
|
81
|
+
id: worktree.id,
|
|
82
|
+
name: worktree.name,
|
|
83
|
+
repositoryName: worktree.repositoryName,
|
|
84
|
+
status,
|
|
85
|
+
hasUnread,
|
|
86
|
+
lastActivity: worktree.updatedAt,
|
|
87
|
+
description: worktree.description,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Slash Command Types
|
|
4
|
+
*
|
|
5
|
+
* Type definitions for slash commands loaded from .claude/commands/*.md
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.COMMAND_CATEGORIES = exports.CATEGORY_LABELS = void 0;
|
|
9
|
+
/**
|
|
10
|
+
* Category labels for display
|
|
11
|
+
*/
|
|
12
|
+
exports.CATEGORY_LABELS = {
|
|
13
|
+
planning: 'Planning',
|
|
14
|
+
development: 'Development',
|
|
15
|
+
review: 'Review',
|
|
16
|
+
documentation: 'Documentation',
|
|
17
|
+
workflow: 'Workflow',
|
|
18
|
+
// Standard command category labels (Issue #56)
|
|
19
|
+
'standard-session': 'Standard (Session)',
|
|
20
|
+
'standard-config': 'Standard (Config)',
|
|
21
|
+
'standard-monitor': 'Standard (Monitor)',
|
|
22
|
+
'standard-git': 'Standard (Git)',
|
|
23
|
+
'standard-util': 'Standard (Utility)',
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Command to category mapping
|
|
27
|
+
* Maps command names to their categories
|
|
28
|
+
*/
|
|
29
|
+
exports.COMMAND_CATEGORIES = {
|
|
30
|
+
// Planning commands
|
|
31
|
+
'work-plan': 'planning',
|
|
32
|
+
'issue-create': 'planning',
|
|
33
|
+
'issue-split': 'planning',
|
|
34
|
+
'design-policy': 'planning',
|
|
35
|
+
// Development commands
|
|
36
|
+
'tdd-impl': 'development',
|
|
37
|
+
'bug-fix': 'development',
|
|
38
|
+
'refactoring': 'development',
|
|
39
|
+
// Review commands
|
|
40
|
+
'architecture-review': 'review',
|
|
41
|
+
'acceptance-test': 'review',
|
|
42
|
+
// Documentation commands
|
|
43
|
+
'progress-report': 'documentation',
|
|
44
|
+
// Workflow commands
|
|
45
|
+
'create-pr': 'workflow',
|
|
46
|
+
'pm-auto-dev': 'workflow',
|
|
47
|
+
};
|