@agentuity/cli 2.0.0-beta.0 → 2.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cli.ts +5 -0
- package/dist/auth.d.ts +1 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +12 -1
- package/dist/auth.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +29 -1
- package/dist/cli.js.map +1 -1
- package/dist/cmd/auth/ssh/delete.js +1 -1
- package/dist/cmd/auth/ssh/delete.js.map +1 -1
- package/dist/cmd/build/app-config-extractor.d.ts +27 -0
- package/dist/cmd/build/app-config-extractor.d.ts.map +1 -0
- package/dist/cmd/build/app-config-extractor.js +152 -0
- package/dist/cmd/build/app-config-extractor.js.map +1 -0
- package/dist/cmd/build/ci.d.ts +18 -0
- package/dist/cmd/build/ci.d.ts.map +1 -0
- package/dist/cmd/build/ci.js +181 -0
- package/dist/cmd/build/ci.js.map +1 -0
- package/dist/cmd/build/index.d.ts.map +1 -1
- package/dist/cmd/build/index.js +53 -14
- package/dist/cmd/build/index.js.map +1 -1
- package/dist/cmd/build/vite/bun-dev-server.d.ts +35 -0
- package/dist/cmd/build/vite/bun-dev-server.d.ts.map +1 -1
- package/dist/cmd/build/vite/bun-dev-server.js +232 -4
- package/dist/cmd/build/vite/bun-dev-server.js.map +1 -1
- package/dist/cmd/build/vite/config-loader.d.ts +15 -20
- package/dist/cmd/build/vite/config-loader.d.ts.map +1 -1
- package/dist/cmd/build/vite/config-loader.js +41 -74
- package/dist/cmd/build/vite/config-loader.js.map +1 -1
- package/dist/cmd/build/vite/static-renderer.d.ts +0 -2
- package/dist/cmd/build/vite/static-renderer.d.ts.map +1 -1
- package/dist/cmd/build/vite/static-renderer.js +28 -14
- package/dist/cmd/build/vite/static-renderer.js.map +1 -1
- package/dist/cmd/build/vite/tailwind-source-plugin.d.ts +15 -0
- package/dist/cmd/build/vite/tailwind-source-plugin.d.ts.map +1 -0
- package/dist/cmd/build/vite/tailwind-source-plugin.js +61 -0
- package/dist/cmd/build/vite/tailwind-source-plugin.js.map +1 -0
- package/dist/cmd/build/vite/vite-asset-server-config.d.ts.map +1 -1
- package/dist/cmd/build/vite/vite-asset-server-config.js +4 -48
- package/dist/cmd/build/vite/vite-asset-server-config.js.map +1 -1
- package/dist/cmd/build/vite/vite-builder.d.ts.map +1 -1
- package/dist/cmd/build/vite/vite-builder.js +38 -156
- package/dist/cmd/build/vite/vite-builder.js.map +1 -1
- package/dist/cmd/cloud/agent/get.d.ts.map +1 -1
- package/dist/cmd/cloud/agent/get.js +1 -0
- package/dist/cmd/cloud/agent/get.js.map +1 -1
- package/dist/cmd/cloud/apikey/delete.js +1 -1
- package/dist/cmd/cloud/apikey/delete.js.map +1 -1
- package/dist/cmd/cloud/apikey/get.d.ts.map +1 -1
- package/dist/cmd/cloud/apikey/get.js +1 -0
- package/dist/cmd/cloud/apikey/get.js.map +1 -1
- package/dist/cmd/cloud/apikey/index.d.ts.map +1 -1
- package/dist/cmd/cloud/apikey/index.js +1 -0
- package/dist/cmd/cloud/apikey/index.js.map +1 -1
- package/dist/cmd/cloud/db/delete.js +1 -1
- package/dist/cmd/cloud/db/delete.js.map +1 -1
- package/dist/cmd/cloud/deploy.js +1 -1
- package/dist/cmd/cloud/deploy.js.map +1 -1
- package/dist/cmd/cloud/deployment/remove.js +17 -17
- package/dist/cmd/cloud/deployment/remove.js.map +1 -1
- package/dist/cmd/cloud/deployment/show.js +1 -1
- package/dist/cmd/cloud/deployment/show.js.map +1 -1
- package/dist/cmd/cloud/email/create.js +1 -1
- package/dist/cmd/cloud/email/create.js.map +1 -1
- package/dist/cmd/cloud/email/delete.js +1 -1
- package/dist/cmd/cloud/email/delete.js.map +1 -1
- package/dist/cmd/cloud/email/destination/delete.js +1 -1
- package/dist/cmd/cloud/email/destination/delete.js.map +1 -1
- package/dist/cmd/cloud/email/get.d.ts.map +1 -1
- package/dist/cmd/cloud/email/get.js +1 -0
- package/dist/cmd/cloud/email/get.js.map +1 -1
- package/dist/cmd/cloud/email/inbound/get.d.ts.map +1 -1
- package/dist/cmd/cloud/email/inbound/get.js +1 -0
- package/dist/cmd/cloud/email/inbound/get.js.map +1 -1
- package/dist/cmd/cloud/email/outbound/get.d.ts.map +1 -1
- package/dist/cmd/cloud/email/outbound/get.js +1 -0
- package/dist/cmd/cloud/email/outbound/get.js.map +1 -1
- package/dist/cmd/cloud/env/delete.js +1 -1
- package/dist/cmd/cloud/env/delete.js.map +1 -1
- package/dist/cmd/cloud/env/get.d.ts.map +1 -1
- package/dist/cmd/cloud/env/get.js +1 -0
- package/dist/cmd/cloud/env/get.js.map +1 -1
- package/dist/cmd/cloud/eval/get.d.ts.map +1 -1
- package/dist/cmd/cloud/eval/get.js +1 -0
- package/dist/cmd/cloud/eval/get.js.map +1 -1
- package/dist/cmd/cloud/eval/index.d.ts.map +1 -1
- package/dist/cmd/cloud/eval/index.js +1 -0
- package/dist/cmd/cloud/eval/index.js.map +1 -1
- package/dist/cmd/cloud/eval/list.js +1 -1
- package/dist/cmd/cloud/eval/list.js.map +1 -1
- package/dist/cmd/cloud/eval-run/get.d.ts.map +1 -1
- package/dist/cmd/cloud/eval-run/get.js +1 -0
- package/dist/cmd/cloud/eval-run/get.js.map +1 -1
- package/dist/cmd/cloud/eval-run/index.d.ts.map +1 -1
- package/dist/cmd/cloud/eval-run/index.js +1 -0
- package/dist/cmd/cloud/eval-run/index.js.map +1 -1
- package/dist/cmd/cloud/eval-run/list.js +1 -1
- package/dist/cmd/cloud/eval-run/list.js.map +1 -1
- package/dist/cmd/cloud/keyvalue/delete-namespace.js +1 -1
- package/dist/cmd/cloud/keyvalue/delete-namespace.js.map +1 -1
- package/dist/cmd/cloud/keyvalue/delete.js +1 -1
- package/dist/cmd/cloud/keyvalue/delete.js.map +1 -1
- package/dist/cmd/cloud/keyvalue/get.d.ts.map +1 -1
- package/dist/cmd/cloud/keyvalue/get.js +1 -0
- package/dist/cmd/cloud/keyvalue/get.js.map +1 -1
- package/dist/cmd/cloud/keyvalue/index.js +1 -1
- package/dist/cmd/cloud/keyvalue/index.js.map +1 -1
- package/dist/cmd/cloud/machine/delete.js +1 -1
- package/dist/cmd/cloud/machine/delete.js.map +1 -1
- package/dist/cmd/cloud/oidc/delete.js +1 -1
- package/dist/cmd/cloud/oidc/delete.js.map +1 -1
- package/dist/cmd/cloud/oidc/get.d.ts.map +1 -1
- package/dist/cmd/cloud/oidc/get.js +1 -0
- package/dist/cmd/cloud/oidc/get.js.map +1 -1
- package/dist/cmd/cloud/queue/create.d.ts.map +1 -1
- package/dist/cmd/cloud/queue/create.js +1 -0
- package/dist/cmd/cloud/queue/create.js.map +1 -1
- package/dist/cmd/cloud/queue/delete.js +1 -1
- package/dist/cmd/cloud/queue/delete.js.map +1 -1
- package/dist/cmd/cloud/queue/get.d.ts.map +1 -1
- package/dist/cmd/cloud/queue/get.js +1 -0
- package/dist/cmd/cloud/queue/get.js.map +1 -1
- package/dist/cmd/cloud/redis/get.js +1 -1
- package/dist/cmd/cloud/redis/get.js.map +1 -1
- package/dist/cmd/cloud/sandbox/checkpoint/create.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/checkpoint/create.js +1 -0
- package/dist/cmd/cloud/sandbox/checkpoint/create.js.map +1 -1
- package/dist/cmd/cloud/sandbox/checkpoint/delete.js +1 -1
- package/dist/cmd/cloud/sandbox/checkpoint/delete.js.map +1 -1
- package/dist/cmd/cloud/sandbox/checkpoint/index.js +1 -1
- package/dist/cmd/cloud/sandbox/checkpoint/index.js.map +1 -1
- package/dist/cmd/cloud/sandbox/create.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/create.js +9 -0
- package/dist/cmd/cloud/sandbox/create.js.map +1 -1
- package/dist/cmd/cloud/sandbox/delete.js +1 -1
- package/dist/cmd/cloud/sandbox/delete.js.map +1 -1
- package/dist/cmd/cloud/sandbox/execution/index.js +1 -1
- package/dist/cmd/cloud/sandbox/execution/index.js.map +1 -1
- package/dist/cmd/cloud/sandbox/execution/list.js +2 -2
- package/dist/cmd/cloud/sandbox/execution/list.js.map +1 -1
- package/dist/cmd/cloud/sandbox/fs/cp.d.ts +3 -0
- package/dist/cmd/cloud/sandbox/fs/cp.d.ts.map +1 -0
- package/dist/cmd/cloud/sandbox/{cp.js → fs/cp.js} +13 -13
- package/dist/cmd/cloud/sandbox/fs/cp.js.map +1 -0
- package/dist/cmd/cloud/sandbox/fs/download.d.ts +3 -0
- package/dist/cmd/cloud/sandbox/fs/download.d.ts.map +1 -0
- package/dist/cmd/cloud/sandbox/{download.js → fs/download.js} +7 -7
- package/dist/cmd/cloud/sandbox/fs/download.js.map +1 -0
- package/dist/cmd/cloud/sandbox/fs/index.d.ts +2 -0
- package/dist/cmd/cloud/sandbox/fs/index.d.ts.map +1 -0
- package/dist/cmd/cloud/sandbox/fs/index.js +36 -0
- package/dist/cmd/cloud/sandbox/fs/index.js.map +1 -0
- package/dist/cmd/cloud/sandbox/fs/ls.d.ts +3 -0
- package/dist/cmd/cloud/sandbox/fs/ls.d.ts.map +1 -0
- package/dist/cmd/cloud/sandbox/{ls.js → fs/ls.js} +10 -10
- package/dist/cmd/cloud/sandbox/fs/ls.js.map +1 -0
- package/dist/cmd/cloud/sandbox/fs/mkdir.d.ts +3 -0
- package/dist/cmd/cloud/sandbox/fs/mkdir.d.ts.map +1 -0
- package/dist/cmd/cloud/sandbox/{mkdir.js → fs/mkdir.js} +6 -6
- package/dist/cmd/cloud/sandbox/fs/mkdir.js.map +1 -0
- package/dist/cmd/cloud/sandbox/fs/rm.d.ts +3 -0
- package/dist/cmd/cloud/sandbox/fs/rm.d.ts.map +1 -0
- package/dist/cmd/cloud/sandbox/{rm.js → fs/rm.js} +6 -5
- package/dist/cmd/cloud/sandbox/fs/rm.js.map +1 -0
- package/dist/cmd/cloud/sandbox/fs/rmdir.d.ts +3 -0
- package/dist/cmd/cloud/sandbox/fs/rmdir.d.ts.map +1 -0
- package/dist/cmd/cloud/sandbox/{rmdir.js → fs/rmdir.js} +6 -6
- package/dist/cmd/cloud/sandbox/fs/rmdir.js.map +1 -0
- package/dist/cmd/cloud/sandbox/fs/upload.d.ts +3 -0
- package/dist/cmd/cloud/sandbox/fs/upload.d.ts.map +1 -0
- package/dist/cmd/cloud/sandbox/{upload.js → fs/upload.js} +7 -7
- package/dist/cmd/cloud/sandbox/fs/upload.js.map +1 -0
- package/dist/cmd/cloud/sandbox/index.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/index.js +4 -14
- package/dist/cmd/cloud/sandbox/index.js.map +1 -1
- package/dist/cmd/cloud/sandbox/job/create.d.ts +3 -0
- package/dist/cmd/cloud/sandbox/job/create.d.ts.map +1 -0
- package/dist/cmd/cloud/sandbox/job/create.js +52 -0
- package/dist/cmd/cloud/sandbox/job/create.js.map +1 -0
- package/dist/cmd/cloud/sandbox/job/destroy.d.ts +3 -0
- package/dist/cmd/cloud/sandbox/job/destroy.d.ts.map +1 -0
- package/dist/cmd/cloud/sandbox/job/destroy.js +59 -0
- package/dist/cmd/cloud/sandbox/job/destroy.js.map +1 -0
- package/dist/cmd/cloud/sandbox/job/get.d.ts +3 -0
- package/dist/cmd/cloud/sandbox/job/get.d.ts.map +1 -0
- package/dist/cmd/cloud/sandbox/job/get.js +66 -0
- package/dist/cmd/cloud/sandbox/job/get.js.map +1 -0
- package/dist/cmd/cloud/sandbox/job/index.d.ts +3 -0
- package/dist/cmd/cloud/sandbox/job/index.d.ts.map +1 -0
- package/dist/cmd/cloud/sandbox/job/index.js +30 -0
- package/dist/cmd/cloud/sandbox/job/index.js.map +1 -0
- package/dist/cmd/cloud/sandbox/job/list.d.ts +3 -0
- package/dist/cmd/cloud/sandbox/job/list.d.ts.map +1 -0
- package/dist/cmd/cloud/sandbox/job/list.js +67 -0
- package/dist/cmd/cloud/sandbox/job/list.js.map +1 -0
- package/dist/cmd/cloud/sandbox/runtime/index.js +1 -1
- package/dist/cmd/cloud/sandbox/runtime/index.js.map +1 -1
- package/dist/cmd/cloud/sandbox/snapshot/create.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/snapshot/create.js +1 -0
- package/dist/cmd/cloud/sandbox/snapshot/create.js.map +1 -1
- package/dist/cmd/cloud/sandbox/snapshot/delete.js +1 -1
- package/dist/cmd/cloud/sandbox/snapshot/delete.js.map +1 -1
- package/dist/cmd/cloud/sandbox/snapshot/index.js +1 -1
- package/dist/cmd/cloud/sandbox/snapshot/index.js.map +1 -1
- package/dist/cmd/cloud/schedule/create.d.ts.map +1 -1
- package/dist/cmd/cloud/schedule/create.js +1 -0
- package/dist/cmd/cloud/schedule/create.js.map +1 -1
- package/dist/cmd/cloud/schedule/delete.js +1 -1
- package/dist/cmd/cloud/schedule/delete.js.map +1 -1
- package/dist/cmd/cloud/schedule/delivery/get.d.ts.map +1 -1
- package/dist/cmd/cloud/schedule/delivery/get.js +1 -0
- package/dist/cmd/cloud/schedule/delivery/get.js.map +1 -1
- package/dist/cmd/cloud/schedule/destination/create.d.ts.map +1 -1
- package/dist/cmd/cloud/schedule/destination/create.js +1 -0
- package/dist/cmd/cloud/schedule/destination/create.js.map +1 -1
- package/dist/cmd/cloud/schedule/destination/delete.js +1 -1
- package/dist/cmd/cloud/schedule/destination/delete.js.map +1 -1
- package/dist/cmd/cloud/schedule/destination/get.d.ts.map +1 -1
- package/dist/cmd/cloud/schedule/destination/get.js +1 -0
- package/dist/cmd/cloud/schedule/destination/get.js.map +1 -1
- package/dist/cmd/cloud/schedule/get.d.ts.map +1 -1
- package/dist/cmd/cloud/schedule/get.js +1 -0
- package/dist/cmd/cloud/schedule/get.js.map +1 -1
- package/dist/cmd/cloud/session/get.d.ts.map +1 -1
- package/dist/cmd/cloud/session/get.js +1 -0
- package/dist/cmd/cloud/session/get.js.map +1 -1
- package/dist/cmd/cloud/session/index.d.ts.map +1 -1
- package/dist/cmd/cloud/session/index.js +1 -0
- package/dist/cmd/cloud/session/index.js.map +1 -1
- package/dist/cmd/cloud/session/list.js +1 -1
- package/dist/cmd/cloud/session/list.js.map +1 -1
- package/dist/cmd/cloud/storage/delete.js +1 -1
- package/dist/cmd/cloud/storage/delete.js.map +1 -1
- package/dist/cmd/cloud/stream/delete.js +1 -1
- package/dist/cmd/cloud/stream/delete.js.map +1 -1
- package/dist/cmd/cloud/stream/get.d.ts.map +1 -1
- package/dist/cmd/cloud/stream/get.js +1 -0
- package/dist/cmd/cloud/stream/get.js.map +1 -1
- package/dist/cmd/cloud/task/delete.js +1 -1
- package/dist/cmd/cloud/task/delete.js.map +1 -1
- package/dist/cmd/cloud/task/index.d.ts.map +1 -1
- package/dist/cmd/cloud/task/index.js +1 -0
- package/dist/cmd/cloud/task/index.js.map +1 -1
- package/dist/cmd/cloud/thread/delete.js +1 -1
- package/dist/cmd/cloud/thread/delete.js.map +1 -1
- package/dist/cmd/cloud/thread/get.d.ts.map +1 -1
- package/dist/cmd/cloud/thread/get.js +1 -0
- package/dist/cmd/cloud/thread/get.js.map +1 -1
- package/dist/cmd/cloud/thread/index.d.ts.map +1 -1
- package/dist/cmd/cloud/thread/index.js +1 -0
- package/dist/cmd/cloud/thread/index.js.map +1 -1
- package/dist/cmd/cloud/thread/list.js +1 -1
- package/dist/cmd/cloud/thread/list.js.map +1 -1
- package/dist/cmd/cloud/vector/delete-namespace.js +1 -1
- package/dist/cmd/cloud/vector/delete-namespace.js.map +1 -1
- package/dist/cmd/cloud/vector/delete.js +1 -1
- package/dist/cmd/cloud/vector/delete.js.map +1 -1
- package/dist/cmd/cloud/vector/get.d.ts.map +1 -1
- package/dist/cmd/cloud/vector/get.js +1 -0
- package/dist/cmd/cloud/vector/get.js.map +1 -1
- package/dist/cmd/cloud/vector/index.js +1 -1
- package/dist/cmd/cloud/vector/index.js.map +1 -1
- package/dist/cmd/cloud/webhook/create.d.ts.map +1 -1
- package/dist/cmd/cloud/webhook/create.js +1 -0
- package/dist/cmd/cloud/webhook/create.js.map +1 -1
- package/dist/cmd/cloud/webhook/delete.js +1 -1
- package/dist/cmd/cloud/webhook/delete.js.map +1 -1
- package/dist/cmd/cloud/webhook/get.d.ts.map +1 -1
- package/dist/cmd/cloud/webhook/get.js +1 -0
- package/dist/cmd/cloud/webhook/get.js.map +1 -1
- package/dist/cmd/dev/index.d.ts.map +1 -1
- package/dist/cmd/dev/index.js +161 -130
- package/dist/cmd/dev/index.js.map +1 -1
- package/dist/cmd/dev/process-manager.d.ts +104 -0
- package/dist/cmd/dev/process-manager.d.ts.map +1 -0
- package/dist/cmd/dev/process-manager.js +204 -0
- package/dist/cmd/dev/process-manager.js.map +1 -0
- package/dist/cmd/git/account/remove.d.ts.map +1 -1
- package/dist/cmd/git/account/remove.js +1 -0
- package/dist/cmd/git/account/remove.js.map +1 -1
- package/dist/cmd/profile/delete.js +1 -1
- package/dist/cmd/profile/delete.js.map +1 -1
- package/dist/cmd/project/delete.js +1 -1
- package/dist/cmd/project/delete.js.map +1 -1
- package/dist/cmd/project/hostname/get.d.ts.map +1 -1
- package/dist/cmd/project/hostname/get.js +1 -0
- package/dist/cmd/project/hostname/get.js.map +1 -1
- package/dist/cmd/upgrade/index.d.ts.map +1 -1
- package/dist/cmd/upgrade/index.js +3 -16
- package/dist/cmd/upgrade/index.js.map +1 -1
- package/dist/schema-generator.js +1 -1
- package/dist/schema-generator.js.map +1 -1
- package/dist/schema-parser.d.ts.map +1 -1
- package/dist/schema-parser.js +8 -0
- package/dist/schema-parser.js.map +1 -1
- package/dist/utils/version-mismatch.d.ts +39 -0
- package/dist/utils/version-mismatch.d.ts.map +1 -0
- package/dist/utils/version-mismatch.js +161 -0
- package/dist/utils/version-mismatch.js.map +1 -0
- package/package.json +8 -6
- package/src/auth.ts +12 -2
- package/src/cli.ts +33 -1
- package/src/cmd/auth/ssh/delete.ts +1 -1
- package/src/cmd/build/app-config-extractor.ts +186 -0
- package/src/cmd/build/ci.ts +223 -0
- package/src/cmd/build/index.ts +65 -14
- package/src/cmd/build/vite/bun-dev-server.ts +319 -6
- package/src/cmd/build/vite/config-loader.ts +45 -77
- package/src/cmd/build/vite/static-renderer.ts +34 -16
- package/src/cmd/build/vite/tailwind-source-plugin.ts +73 -0
- package/src/cmd/build/vite/vite-asset-server-config.ts +4 -47
- package/src/cmd/build/vite/vite-builder.ts +45 -169
- package/src/cmd/cloud/agent/get.ts +1 -0
- package/src/cmd/cloud/apikey/delete.ts +1 -1
- package/src/cmd/cloud/apikey/get.ts +1 -0
- package/src/cmd/cloud/apikey/index.ts +1 -0
- package/src/cmd/cloud/db/delete.ts +1 -1
- package/src/cmd/cloud/deploy.ts +1 -1
- package/src/cmd/cloud/deployment/remove.ts +17 -17
- package/src/cmd/cloud/deployment/show.ts +1 -1
- package/src/cmd/cloud/email/create.ts +1 -1
- package/src/cmd/cloud/email/delete.ts +1 -1
- package/src/cmd/cloud/email/destination/delete.ts +1 -1
- package/src/cmd/cloud/email/get.ts +1 -0
- package/src/cmd/cloud/email/inbound/get.ts +1 -0
- package/src/cmd/cloud/email/outbound/get.ts +1 -0
- package/src/cmd/cloud/env/delete.ts +1 -1
- package/src/cmd/cloud/env/get.ts +1 -0
- package/src/cmd/cloud/eval/get.ts +1 -0
- package/src/cmd/cloud/eval/index.ts +1 -0
- package/src/cmd/cloud/eval/list.ts +1 -1
- package/src/cmd/cloud/eval-run/get.ts +1 -0
- package/src/cmd/cloud/eval-run/index.ts +1 -0
- package/src/cmd/cloud/eval-run/list.ts +1 -1
- package/src/cmd/cloud/keyvalue/delete-namespace.ts +1 -1
- package/src/cmd/cloud/keyvalue/delete.ts +1 -1
- package/src/cmd/cloud/keyvalue/get.ts +1 -0
- package/src/cmd/cloud/keyvalue/index.ts +1 -1
- package/src/cmd/cloud/machine/delete.ts +1 -1
- package/src/cmd/cloud/oidc/delete.ts +1 -1
- package/src/cmd/cloud/oidc/get.ts +1 -0
- package/src/cmd/cloud/queue/create.ts +1 -0
- package/src/cmd/cloud/queue/delete.ts +1 -1
- package/src/cmd/cloud/queue/get.ts +1 -0
- package/src/cmd/cloud/redis/get.ts +1 -1
- package/src/cmd/cloud/sandbox/checkpoint/create.ts +1 -0
- package/src/cmd/cloud/sandbox/checkpoint/delete.ts +1 -1
- package/src/cmd/cloud/sandbox/checkpoint/index.ts +1 -1
- package/src/cmd/cloud/sandbox/create.ts +9 -0
- package/src/cmd/cloud/sandbox/delete.ts +1 -1
- package/src/cmd/cloud/sandbox/execution/index.ts +1 -1
- package/src/cmd/cloud/sandbox/execution/list.ts +2 -2
- package/src/cmd/cloud/sandbox/{cp.ts → fs/cp.ts} +13 -13
- package/src/cmd/cloud/sandbox/{download.ts → fs/download.ts} +7 -7
- package/src/cmd/cloud/sandbox/fs/index.ts +36 -0
- package/src/cmd/cloud/sandbox/{ls.ts → fs/ls.ts} +10 -10
- package/src/cmd/cloud/sandbox/{mkdir.ts → fs/mkdir.ts} +6 -6
- package/src/cmd/cloud/sandbox/{rm.ts → fs/rm.ts} +6 -5
- package/src/cmd/cloud/sandbox/{rmdir.ts → fs/rmdir.ts} +6 -6
- package/src/cmd/cloud/sandbox/{upload.ts → fs/upload.ts} +7 -7
- package/src/cmd/cloud/sandbox/index.ts +4 -14
- package/src/cmd/cloud/sandbox/job/create.ts +63 -0
- package/src/cmd/cloud/sandbox/job/destroy.ts +67 -0
- package/src/cmd/cloud/sandbox/job/get.ts +78 -0
- package/src/cmd/cloud/sandbox/job/index.ts +31 -0
- package/src/cmd/cloud/sandbox/job/list.ts +81 -0
- package/src/cmd/cloud/sandbox/runtime/index.ts +1 -1
- package/src/cmd/cloud/sandbox/snapshot/create.ts +1 -0
- package/src/cmd/cloud/sandbox/snapshot/delete.ts +1 -1
- package/src/cmd/cloud/sandbox/snapshot/index.ts +1 -1
- package/src/cmd/cloud/schedule/create.ts +1 -0
- package/src/cmd/cloud/schedule/delete.ts +1 -1
- package/src/cmd/cloud/schedule/delivery/get.ts +1 -0
- package/src/cmd/cloud/schedule/destination/create.ts +1 -0
- package/src/cmd/cloud/schedule/destination/delete.ts +1 -1
- package/src/cmd/cloud/schedule/destination/get.ts +1 -0
- package/src/cmd/cloud/schedule/get.ts +1 -0
- package/src/cmd/cloud/session/get.ts +1 -0
- package/src/cmd/cloud/session/index.ts +1 -0
- package/src/cmd/cloud/session/list.ts +1 -1
- package/src/cmd/cloud/storage/delete.ts +1 -1
- package/src/cmd/cloud/stream/delete.ts +1 -1
- package/src/cmd/cloud/stream/get.ts +1 -0
- package/src/cmd/cloud/task/delete.ts +1 -1
- package/src/cmd/cloud/task/index.ts +1 -0
- package/src/cmd/cloud/thread/delete.ts +1 -1
- package/src/cmd/cloud/thread/get.ts +1 -0
- package/src/cmd/cloud/thread/index.ts +1 -0
- package/src/cmd/cloud/thread/list.ts +1 -1
- package/src/cmd/cloud/vector/delete-namespace.ts +1 -1
- package/src/cmd/cloud/vector/delete.ts +1 -1
- package/src/cmd/cloud/vector/get.ts +1 -0
- package/src/cmd/cloud/vector/index.ts +1 -1
- package/src/cmd/cloud/webhook/create.ts +1 -0
- package/src/cmd/cloud/webhook/delete.ts +1 -1
- package/src/cmd/cloud/webhook/get.ts +1 -0
- package/src/cmd/dev/index.ts +171 -131
- package/src/cmd/dev/process-manager.ts +261 -0
- package/src/cmd/git/account/remove.ts +1 -0
- package/src/cmd/profile/delete.ts +1 -1
- package/src/cmd/project/delete.ts +1 -1
- package/src/cmd/project/hostname/get.ts +1 -0
- package/src/cmd/upgrade/index.ts +3 -18
- package/src/schema-generator.ts +1 -1
- package/src/schema-parser.ts +11 -0
- package/src/utils/version-mismatch.ts +204 -0
- package/dist/cmd/cloud/sandbox/cp.d.ts +0 -3
- package/dist/cmd/cloud/sandbox/cp.d.ts.map +0 -1
- package/dist/cmd/cloud/sandbox/cp.js.map +0 -1
- package/dist/cmd/cloud/sandbox/download.d.ts +0 -3
- package/dist/cmd/cloud/sandbox/download.d.ts.map +0 -1
- package/dist/cmd/cloud/sandbox/download.js.map +0 -1
- package/dist/cmd/cloud/sandbox/ls.d.ts +0 -3
- package/dist/cmd/cloud/sandbox/ls.d.ts.map +0 -1
- package/dist/cmd/cloud/sandbox/ls.js.map +0 -1
- package/dist/cmd/cloud/sandbox/mkdir.d.ts +0 -3
- package/dist/cmd/cloud/sandbox/mkdir.d.ts.map +0 -1
- package/dist/cmd/cloud/sandbox/mkdir.js.map +0 -1
- package/dist/cmd/cloud/sandbox/rm.d.ts +0 -3
- package/dist/cmd/cloud/sandbox/rm.d.ts.map +0 -1
- package/dist/cmd/cloud/sandbox/rm.js.map +0 -1
- package/dist/cmd/cloud/sandbox/rmdir.d.ts +0 -3
- package/dist/cmd/cloud/sandbox/rmdir.d.ts.map +0 -1
- package/dist/cmd/cloud/sandbox/rmdir.js.map +0 -1
- package/dist/cmd/cloud/sandbox/upload.d.ts +0 -3
- package/dist/cmd/cloud/sandbox/upload.d.ts.map +0 -1
- package/dist/cmd/cloud/sandbox/upload.js.map +0 -1
package/src/cmd/dev/index.ts
CHANGED
|
@@ -20,6 +20,8 @@ import { isTTY, hasLoggedInBefore } from '../../auth';
|
|
|
20
20
|
|
|
21
21
|
import { prepareDevLock, releaseLockSync } from './dev-lock';
|
|
22
22
|
import { checkAndUpgradeDependencies } from '../../utils/dependency-checker';
|
|
23
|
+
import { initProcessManager } from './process-manager';
|
|
24
|
+
import { detectVersionMismatch, formatVersionMismatchWarning } from '../../utils/version-mismatch';
|
|
23
25
|
|
|
24
26
|
import { ErrorCode } from '../../errors';
|
|
25
27
|
|
|
@@ -31,12 +33,13 @@ const MAX_PORT = 65535;
|
|
|
31
33
|
interface ProcessLike {
|
|
32
34
|
kill: (signal?: number | NodeJS.Signals) => void;
|
|
33
35
|
exitCode: number | null;
|
|
36
|
+
pid?: number;
|
|
34
37
|
stdout?: AsyncIterable<Uint8Array>;
|
|
35
38
|
stderr?: AsyncIterable<Uint8Array>;
|
|
36
39
|
}
|
|
37
40
|
|
|
38
41
|
interface ServerLike {
|
|
39
|
-
close: () => void
|
|
42
|
+
close: () => void | Promise<void>;
|
|
40
43
|
}
|
|
41
44
|
|
|
42
45
|
/**
|
|
@@ -337,6 +340,14 @@ export const command = createCommand({
|
|
|
337
340
|
);
|
|
338
341
|
}
|
|
339
342
|
|
|
343
|
+
// Check for version mismatches (v1 vs v2 SDK packages)
|
|
344
|
+
const versionMismatch = detectVersionMismatch(rootDir, logger);
|
|
345
|
+
if (versionMismatch.hasV1Packages || versionMismatch.hasMajorMismatches) {
|
|
346
|
+
tui.newline();
|
|
347
|
+
tui.warning(formatVersionMismatchWarning(versionMismatch));
|
|
348
|
+
tui.newline();
|
|
349
|
+
}
|
|
350
|
+
|
|
340
351
|
try {
|
|
341
352
|
// Setup devmode and gravity (if using public URL)
|
|
342
353
|
const useMockService = process.env.DEVMODE_SYNC_SERVICE_MOCK === 'true';
|
|
@@ -428,12 +439,12 @@ export const command = createCommand({
|
|
|
428
439
|
}
|
|
429
440
|
}
|
|
430
441
|
|
|
431
|
-
// Get workbench info from
|
|
432
|
-
const {
|
|
442
|
+
// Get workbench info from createApp() in app.ts (v2 approach)
|
|
443
|
+
const { getWorkbenchConfig, loadRuntimeConfig } = await import(
|
|
433
444
|
'../build/vite/config-loader'
|
|
434
445
|
);
|
|
435
|
-
const
|
|
436
|
-
const workbenchConfigData = getWorkbenchConfig(
|
|
446
|
+
const runtimeConfig = await loadRuntimeConfig(rootDir, logger);
|
|
447
|
+
const workbenchConfigData = getWorkbenchConfig(true, runtimeConfig); // dev mode
|
|
437
448
|
const workbench = {
|
|
438
449
|
hasWorkbench: workbenchConfigData.enabled,
|
|
439
450
|
config: workbenchConfigData.enabled
|
|
@@ -529,6 +540,9 @@ export const command = createCommand({
|
|
|
529
540
|
let viteServer: ServerLike | null = null;
|
|
530
541
|
let vitePort: number;
|
|
531
542
|
|
|
543
|
+
// Initialize process manager to track all servers/processes
|
|
544
|
+
const procManager = initProcessManager(logger);
|
|
545
|
+
|
|
532
546
|
try {
|
|
533
547
|
logger.debug('Starting Vite dev server (internal port %d)...', viteInternalPort);
|
|
534
548
|
const viteResult = await startViteAssetServer({
|
|
@@ -542,6 +556,14 @@ export const command = createCommand({
|
|
|
542
556
|
viteServer = viteResult.server;
|
|
543
557
|
vitePort = viteResult.port;
|
|
544
558
|
|
|
559
|
+
// Register Vite server with process manager
|
|
560
|
+
procManager.registerServer({
|
|
561
|
+
id: 'vite',
|
|
562
|
+
server: viteServer,
|
|
563
|
+
description: 'Vite dev server (frontend assets)',
|
|
564
|
+
port: vitePort,
|
|
565
|
+
});
|
|
566
|
+
|
|
545
567
|
// Update dev lock with actual Vite port
|
|
546
568
|
await devLock.updatePorts({ vite: vitePort });
|
|
547
569
|
|
|
@@ -550,6 +572,7 @@ export const command = createCommand({
|
|
|
550
572
|
);
|
|
551
573
|
} catch (error) {
|
|
552
574
|
tui.error(`Failed to start Vite dev server: ${error}`);
|
|
575
|
+
await procManager.cleanup('vite startup failure');
|
|
553
576
|
await devLock.release();
|
|
554
577
|
originalExit(1);
|
|
555
578
|
return;
|
|
@@ -569,11 +592,25 @@ export const command = createCommand({
|
|
|
569
592
|
routePaths,
|
|
570
593
|
logger,
|
|
571
594
|
});
|
|
595
|
+
|
|
596
|
+
// Register front-door proxy with process manager
|
|
597
|
+
procManager.registerServer({
|
|
598
|
+
id: 'front-door-proxy',
|
|
599
|
+
server: {
|
|
600
|
+
close: () => {
|
|
601
|
+
frontDoorServer?.close();
|
|
602
|
+
},
|
|
603
|
+
},
|
|
604
|
+
description: 'Front-door TCP proxy (WS routing)',
|
|
605
|
+
port: opts.port,
|
|
606
|
+
});
|
|
607
|
+
|
|
572
608
|
logger.debug(
|
|
573
609
|
`Front-door proxy on port ${opts.port} (Vite:${vitePort}, Bun:${bunBackendPort})`
|
|
574
610
|
);
|
|
575
611
|
} catch (error) {
|
|
576
612
|
tui.error(`Failed to start front-door proxy: ${error}`);
|
|
613
|
+
await procManager.cleanup('front-door proxy startup failure');
|
|
577
614
|
await devLock.release();
|
|
578
615
|
originalExit(1);
|
|
579
616
|
return;
|
|
@@ -585,63 +622,29 @@ export const command = createCommand({
|
|
|
585
622
|
let stdinListenerRegistered = false;
|
|
586
623
|
let stdinDataHandler: ((data: Buffer | string) => void) | null = null;
|
|
587
624
|
let shutdownRequested = false;
|
|
588
|
-
let cleaningUp = false;
|
|
589
625
|
|
|
590
626
|
/**
|
|
591
627
|
* Centralized cleanup function for all resources.
|
|
628
|
+
* Uses the process manager for tracked servers/processes.
|
|
592
629
|
*/
|
|
593
630
|
const cleanup = async (exitAfter = false, exitCode = 0, silent = false) => {
|
|
594
|
-
if (
|
|
595
|
-
|
|
631
|
+
if (shutdownRequested) return;
|
|
632
|
+
shutdownRequested = true;
|
|
596
633
|
|
|
597
634
|
if (!silent) {
|
|
598
635
|
tui.info('Shutting down...');
|
|
599
636
|
}
|
|
600
637
|
|
|
601
|
-
// Stop
|
|
602
|
-
try {
|
|
603
|
-
frontDoorServer?.close();
|
|
604
|
-
} catch (err) {
|
|
605
|
-
logger.debug('Error stopping front-door proxy: %s', err);
|
|
606
|
-
}
|
|
607
|
-
|
|
608
|
-
// Kill Bun subprocess
|
|
609
|
-
killBunSubprocess(logger);
|
|
610
|
-
|
|
611
|
-
// Stop gravity heartbeat interval
|
|
638
|
+
// Stop gravity heartbeat interval first
|
|
612
639
|
if (gravityHeartbeatInterval) {
|
|
613
640
|
clearInterval(gravityHeartbeatInterval);
|
|
614
641
|
gravityHeartbeatInterval = null;
|
|
615
642
|
}
|
|
616
643
|
|
|
617
|
-
//
|
|
618
|
-
|
|
619
|
-
try {
|
|
620
|
-
gravityProcess.kill('SIGTERM');
|
|
621
|
-
await new Promise((resolve) => setTimeout(resolve, 150));
|
|
622
|
-
if (gravityProcess.exitCode === null) {
|
|
623
|
-
gravityProcess.kill('SIGKILL');
|
|
624
|
-
}
|
|
625
|
-
} catch (err) {
|
|
626
|
-
logger.debug('Error killing gravity: %s', err);
|
|
627
|
-
} finally {
|
|
628
|
-
gravityProcess = null;
|
|
629
|
-
}
|
|
630
|
-
}
|
|
631
|
-
|
|
632
|
-
// Close Vite
|
|
633
|
-
if (viteServer) {
|
|
634
|
-
try {
|
|
635
|
-
const closePromise = viteServer.close();
|
|
636
|
-
const timeoutPromise = new Promise<void>((resolve) => setTimeout(resolve, 2000));
|
|
637
|
-
await Promise.race([closePromise, timeoutPromise]);
|
|
638
|
-
} catch (err) {
|
|
639
|
-
logger.debug('Error closing Vite: %s', err);
|
|
640
|
-
} finally {
|
|
641
|
-
viteServer = null;
|
|
642
|
-
}
|
|
643
|
-
}
|
|
644
|
+
// Use process manager for tracked cleanup
|
|
645
|
+
await procManager.cleanup('shutdown');
|
|
644
646
|
|
|
647
|
+
// Additional cleanup for non-tracked resources
|
|
645
648
|
await devLock.release();
|
|
646
649
|
await killLingeringGravityProcesses(logger);
|
|
647
650
|
|
|
@@ -848,15 +851,35 @@ export const command = createCommand({
|
|
|
848
851
|
// Step 3: Start Bun backend with --hot (handles its own HMR)
|
|
849
852
|
// ================================================================
|
|
850
853
|
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
854
|
+
try {
|
|
855
|
+
await startBunDevServer({
|
|
856
|
+
rootDir,
|
|
857
|
+
port: bunBackendPort,
|
|
858
|
+
logger,
|
|
859
|
+
vitePort,
|
|
860
|
+
inspect: opts.inspect,
|
|
861
|
+
inspectWait: opts.inspectWait,
|
|
862
|
+
inspectBrk: opts.inspectBrk,
|
|
863
|
+
});
|
|
864
|
+
|
|
865
|
+
// Register Bun subprocess with process manager
|
|
866
|
+
// The subprocess is stored in globalThis.__AGENTUITY_BUN_SUBPROCESS__
|
|
867
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
868
|
+
const bunSubprocess = (globalThis as any).__AGENTUITY_BUN_SUBPROCESS__ as ProcessLike;
|
|
869
|
+
if (bunSubprocess) {
|
|
870
|
+
procManager.registerProcess({
|
|
871
|
+
id: 'bun-backend',
|
|
872
|
+
process: bunSubprocess,
|
|
873
|
+
description: 'Bun backend server (--hot)',
|
|
874
|
+
port: bunBackendPort,
|
|
875
|
+
critical: true,
|
|
876
|
+
});
|
|
877
|
+
}
|
|
878
|
+
} catch (error) {
|
|
879
|
+
tui.error(`Failed to start Bun backend server: ${error}`);
|
|
880
|
+
await cleanup(true, 1, true);
|
|
881
|
+
return;
|
|
882
|
+
}
|
|
860
883
|
|
|
861
884
|
// ================================================================
|
|
862
885
|
// Step 4: Start gravity tunnel (if public URL enabled)
|
|
@@ -865,94 +888,111 @@ export const command = createCommand({
|
|
|
865
888
|
if (gravityBin && gravityURL && devmode && project) {
|
|
866
889
|
const privateKeyPEM = devmode.privateKey ?? savedPrivateKey;
|
|
867
890
|
if (!privateKeyPEM) {
|
|
868
|
-
|
|
891
|
+
tui.error(
|
|
869
892
|
'No private key available for gravity connection. Please re-run to generate a new key.'
|
|
870
893
|
);
|
|
894
|
+
await cleanup(true, 1, true);
|
|
895
|
+
return;
|
|
871
896
|
}
|
|
872
|
-
gravityProcess = Bun.spawn(
|
|
873
|
-
[
|
|
874
|
-
gravityBin,
|
|
875
|
-
'--endpoint-id',
|
|
876
|
-
devmode.id,
|
|
877
|
-
'--port',
|
|
878
|
-
vitePort.toString(),
|
|
879
|
-
'--url',
|
|
880
|
-
gravityURL,
|
|
881
|
-
'--log-level',
|
|
882
|
-
process.env.AGENTUITY_GRAVITY_LOG_LEVEL ?? 'error',
|
|
883
|
-
'--org-id',
|
|
884
|
-
project.orgId,
|
|
885
|
-
'--project-id',
|
|
886
|
-
project.projectId,
|
|
887
|
-
'--private-key',
|
|
888
|
-
Buffer.from(privateKeyPEM).toString('base64'),
|
|
889
|
-
'--health-check',
|
|
890
|
-
],
|
|
891
|
-
{
|
|
892
|
-
cwd: rootDir,
|
|
893
|
-
stdout: 'pipe',
|
|
894
|
-
stderr: 'pipe',
|
|
895
|
-
detached: false,
|
|
896
|
-
}
|
|
897
|
-
);
|
|
898
897
|
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
898
|
+
try {
|
|
899
|
+
gravityProcess = Bun.spawn(
|
|
900
|
+
[
|
|
901
|
+
gravityBin,
|
|
902
|
+
'--endpoint-id',
|
|
903
|
+
devmode.id,
|
|
904
|
+
'--port',
|
|
905
|
+
vitePort.toString(),
|
|
906
|
+
'--url',
|
|
907
|
+
gravityURL,
|
|
908
|
+
'--log-level',
|
|
909
|
+
process.env.AGENTUITY_GRAVITY_LOG_LEVEL ?? 'error',
|
|
910
|
+
'--org-id',
|
|
911
|
+
project.orgId,
|
|
912
|
+
'--project-id',
|
|
913
|
+
project.projectId,
|
|
914
|
+
'--private-key',
|
|
915
|
+
Buffer.from(privateKeyPEM).toString('base64'),
|
|
916
|
+
'--health-check',
|
|
917
|
+
],
|
|
918
|
+
{
|
|
919
|
+
cwd: rootDir,
|
|
920
|
+
stdout: 'pipe',
|
|
921
|
+
stderr: 'pipe',
|
|
922
|
+
detached: false,
|
|
923
|
+
}
|
|
924
|
+
);
|
|
907
925
|
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
926
|
+
const gravityPid = (gravityProcess as { pid?: number }).pid;
|
|
927
|
+
if (gravityPid) {
|
|
928
|
+
await devLock.registerChild({
|
|
929
|
+
pid: gravityPid,
|
|
930
|
+
type: 'gravity',
|
|
931
|
+
description: 'Gravity public URL tunnel',
|
|
932
|
+
});
|
|
933
|
+
|
|
934
|
+
// Register with process manager
|
|
935
|
+
procManager.registerProcess({
|
|
936
|
+
id: 'gravity',
|
|
937
|
+
process: gravityProcess,
|
|
938
|
+
description: 'Gravity public URL tunnel',
|
|
939
|
+
critical: false,
|
|
940
|
+
});
|
|
941
|
+
}
|
|
942
|
+
|
|
943
|
+
// Log gravity output and detect heartbeat port
|
|
944
|
+
(async () => {
|
|
945
|
+
try {
|
|
946
|
+
if (gravityProcess?.stdout) {
|
|
947
|
+
for await (const chunk of gravityProcess.stdout) {
|
|
948
|
+
const text = new TextDecoder().decode(chunk);
|
|
949
|
+
const trimmed = text.trim();
|
|
950
|
+
|
|
951
|
+
const match = trimmed.match(/^HEARTBEAT_PORT=(\d+)$/m);
|
|
952
|
+
if (match?.[1]) {
|
|
953
|
+
const heartbeatPort = parseInt(match[1], 10);
|
|
954
|
+
logger.debug('Gravity heartbeat port: %d', heartbeatPort);
|
|
955
|
+
|
|
956
|
+
if (!gravityHeartbeatInterval) {
|
|
957
|
+
const sendHeartbeat = async () => {
|
|
958
|
+
try {
|
|
959
|
+
await fetch(`http://127.0.0.1:${heartbeatPort}/heartbeat`, {
|
|
960
|
+
method: 'POST',
|
|
961
|
+
signal: AbortSignal.timeout(2000),
|
|
962
|
+
});
|
|
963
|
+
} catch {
|
|
964
|
+
// Ignore heartbeat failures
|
|
965
|
+
}
|
|
966
|
+
};
|
|
967
|
+
sendHeartbeat();
|
|
968
|
+
gravityHeartbeatInterval = setInterval(sendHeartbeat, 5000);
|
|
969
|
+
}
|
|
970
|
+
} else if (trimmed) {
|
|
971
|
+
logger.debug('[gravity] %s', trimmed);
|
|
934
972
|
}
|
|
935
|
-
} else if (trimmed) {
|
|
936
|
-
logger.debug('[gravity] %s', trimmed);
|
|
937
973
|
}
|
|
938
974
|
}
|
|
975
|
+
} catch (err) {
|
|
976
|
+
logger.error('Error reading gravity stdout: %s', err);
|
|
939
977
|
}
|
|
940
|
-
}
|
|
941
|
-
logger.error('Error reading gravity stdout: %s', err);
|
|
942
|
-
}
|
|
943
|
-
})();
|
|
978
|
+
})();
|
|
944
979
|
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
980
|
+
(async () => {
|
|
981
|
+
try {
|
|
982
|
+
if (gravityProcess?.stderr) {
|
|
983
|
+
for await (const chunk of gravityProcess.stderr) {
|
|
984
|
+
logger.warn('[gravity] %s', new TextDecoder().decode(chunk).trim());
|
|
985
|
+
}
|
|
950
986
|
}
|
|
987
|
+
} catch (err) {
|
|
988
|
+
logger.error('Error reading gravity stderr: %s', err);
|
|
951
989
|
}
|
|
952
|
-
}
|
|
953
|
-
|
|
954
|
-
}
|
|
955
|
-
|
|
990
|
+
})();
|
|
991
|
+
} catch (error) {
|
|
992
|
+
tui.error(`Failed to start gravity tunnel: ${error}`);
|
|
993
|
+
await cleanup(true, 1, true);
|
|
994
|
+
return;
|
|
995
|
+
}
|
|
956
996
|
}
|
|
957
997
|
|
|
958
998
|
// ================================================================
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Process Manager for Dev Mode
|
|
3
|
+
*
|
|
4
|
+
* Tracks all spawned processes and ensures they're cleaned up on:
|
|
5
|
+
* - Startup failure (any server fails to start)
|
|
6
|
+
* - Runtime crash (uncaught exception)
|
|
7
|
+
* - Graceful shutdown (SIGINT/SIGTERM)
|
|
8
|
+
*
|
|
9
|
+
* This prevents orphan processes and port conflicts between dev sessions.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import type { Logger } from '../../types';
|
|
13
|
+
|
|
14
|
+
export interface ManagedProcess {
|
|
15
|
+
/** Process identifier for logging */
|
|
16
|
+
id: string;
|
|
17
|
+
/** The process handle */
|
|
18
|
+
process: {
|
|
19
|
+
kill: (signal?: number | NodeJS.Signals) => void;
|
|
20
|
+
exitCode: number | null;
|
|
21
|
+
pid?: number;
|
|
22
|
+
};
|
|
23
|
+
/** Human-readable description */
|
|
24
|
+
description: string;
|
|
25
|
+
/** The port this process uses (if any) */
|
|
26
|
+
port?: number;
|
|
27
|
+
/** Whether this process is critical (startup fails if it dies) */
|
|
28
|
+
critical?: boolean;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface ManagedServer {
|
|
32
|
+
/** Server identifier */
|
|
33
|
+
id: string;
|
|
34
|
+
/** The server handle */
|
|
35
|
+
server: {
|
|
36
|
+
close: () => void | Promise<void>;
|
|
37
|
+
};
|
|
38
|
+
/** Human-readable description */
|
|
39
|
+
description: string;
|
|
40
|
+
/** The port this server uses */
|
|
41
|
+
port?: number;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Process Manager
|
|
46
|
+
*
|
|
47
|
+
* Tracks all processes and servers started during dev mode and provides
|
|
48
|
+
* centralized cleanup on failure or shutdown.
|
|
49
|
+
*/
|
|
50
|
+
export class ProcessManager {
|
|
51
|
+
private processes: ManagedProcess[] = [];
|
|
52
|
+
private servers: ManagedServer[] = [];
|
|
53
|
+
private logger: Logger;
|
|
54
|
+
private cleaningUp = false;
|
|
55
|
+
|
|
56
|
+
constructor(logger: Logger) {
|
|
57
|
+
this.logger = logger;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Register a spawned process for tracking.
|
|
62
|
+
*/
|
|
63
|
+
registerProcess(proc: ManagedProcess): void {
|
|
64
|
+
this.processes.push(proc);
|
|
65
|
+
this.logger.debug(
|
|
66
|
+
'Registered process: %s (pid=%s, port=%s)',
|
|
67
|
+
proc.id,
|
|
68
|
+
proc.process.pid ?? 'unknown',
|
|
69
|
+
proc.port ?? 'n/a'
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Register a server for tracking.
|
|
75
|
+
*/
|
|
76
|
+
registerServer(server: ManagedServer): void {
|
|
77
|
+
this.servers.push(server);
|
|
78
|
+
this.logger.debug('Registered server: %s (port=%s)', server.id, server.port ?? 'n/a');
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Unregister a process (e.g., after it exits normally).
|
|
83
|
+
*/
|
|
84
|
+
unregisterProcess(id: string): void {
|
|
85
|
+
const idx = this.processes.findIndex((p) => p.id === id);
|
|
86
|
+
if (idx !== -1) {
|
|
87
|
+
this.processes.splice(idx, 1);
|
|
88
|
+
this.logger.debug('Unregistered process: %s', id);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Unregister a server.
|
|
94
|
+
*/
|
|
95
|
+
unregisterServer(id: string): void {
|
|
96
|
+
const idx = this.servers.findIndex((s) => s.id === id);
|
|
97
|
+
if (idx !== -1) {
|
|
98
|
+
this.servers.splice(idx, 1);
|
|
99
|
+
this.logger.debug('Unregistered server: %s', id);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Get all registered ports (for cleanup verification).
|
|
105
|
+
*/
|
|
106
|
+
getPorts(): number[] {
|
|
107
|
+
const ports: number[] = [];
|
|
108
|
+
for (const proc of this.processes) {
|
|
109
|
+
if (proc.port) ports.push(proc.port);
|
|
110
|
+
}
|
|
111
|
+
for (const server of this.servers) {
|
|
112
|
+
if (server.port) ports.push(server.port);
|
|
113
|
+
}
|
|
114
|
+
return ports;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Clean up all tracked processes and servers.
|
|
119
|
+
*
|
|
120
|
+
* @param reason - Why cleanup is happening (for logging)
|
|
121
|
+
* @param timeout - Max time to wait for graceful shutdown (ms)
|
|
122
|
+
*/
|
|
123
|
+
async cleanup(reason: string, timeout = 3000): Promise<void> {
|
|
124
|
+
if (this.cleaningUp) {
|
|
125
|
+
this.logger.debug('Cleanup already in progress, skipping');
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
this.cleaningUp = true;
|
|
129
|
+
|
|
130
|
+
this.logger.debug('Starting cleanup (reason: %s)', reason);
|
|
131
|
+
|
|
132
|
+
// Kill processes in reverse order (LIFO)
|
|
133
|
+
for (let i = this.processes.length - 1; i >= 0; i--) {
|
|
134
|
+
const proc = this.processes[i];
|
|
135
|
+
if (!proc) continue;
|
|
136
|
+
|
|
137
|
+
try {
|
|
138
|
+
if (proc.process.exitCode === null) {
|
|
139
|
+
this.logger.debug(
|
|
140
|
+
'Killing process %s (pid=%s)',
|
|
141
|
+
proc.id,
|
|
142
|
+
proc.process.pid ?? 'unknown'
|
|
143
|
+
);
|
|
144
|
+
proc.process.kill('SIGTERM');
|
|
145
|
+
}
|
|
146
|
+
} catch (err) {
|
|
147
|
+
this.logger.debug('Error killing process %s: %s', proc.id, err);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Close servers
|
|
152
|
+
for (let i = this.servers.length - 1; i >= 0; i--) {
|
|
153
|
+
const server = this.servers[i];
|
|
154
|
+
if (!server) continue;
|
|
155
|
+
|
|
156
|
+
try {
|
|
157
|
+
this.logger.debug('Closing server %s', server.id);
|
|
158
|
+
const closePromise = server.server.close();
|
|
159
|
+
if (closePromise instanceof Promise) {
|
|
160
|
+
await Promise.race([
|
|
161
|
+
closePromise,
|
|
162
|
+
new Promise<void>((resolve) => setTimeout(resolve, 1000)),
|
|
163
|
+
]);
|
|
164
|
+
}
|
|
165
|
+
} catch (err) {
|
|
166
|
+
this.logger.debug('Error closing server %s: %s', server.id, err);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// Wait for processes to exit, then force-kill if needed
|
|
171
|
+
const startTime = Date.now();
|
|
172
|
+
while (Date.now() - startTime < timeout) {
|
|
173
|
+
const allExited = this.processes.every((p) => p.process.exitCode !== null);
|
|
174
|
+
if (allExited) break;
|
|
175
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Force kill any remaining
|
|
179
|
+
for (const proc of this.processes) {
|
|
180
|
+
if (proc.process.exitCode === null) {
|
|
181
|
+
try {
|
|
182
|
+
this.logger.debug('Force killing process %s', proc.id);
|
|
183
|
+
proc.process.kill('SIGKILL');
|
|
184
|
+
} catch (err) {
|
|
185
|
+
this.logger.debug('Error force killing process %s: %s', proc.id, err);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
this.logger.debug('Cleanup complete');
|
|
191
|
+
this.processes = [];
|
|
192
|
+
this.servers = [];
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Verify that all ports used by tracked processes are released.
|
|
197
|
+
* Used after cleanup to ensure no orphan processes remain.
|
|
198
|
+
*/
|
|
199
|
+
async verifyPortsReleased(): Promise<{ port: number; released: boolean }[]> {
|
|
200
|
+
const results: { port: number; released: boolean }[] = [];
|
|
201
|
+
const ports = this.getPorts();
|
|
202
|
+
|
|
203
|
+
for (const port of ports) {
|
|
204
|
+
const released = await this.isPortAvailable(port);
|
|
205
|
+
results.push({ port, released });
|
|
206
|
+
|
|
207
|
+
if (!released) {
|
|
208
|
+
this.logger.warn('Port %d is still in use after cleanup', port);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
return results;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Check if a port is available.
|
|
217
|
+
*/
|
|
218
|
+
private isPortAvailable(port: number, host = '127.0.0.1'): Promise<boolean> {
|
|
219
|
+
return new Promise((resolve) => {
|
|
220
|
+
const net = require('node:net');
|
|
221
|
+
const server = net.createServer();
|
|
222
|
+
server.once('error', () => resolve(false));
|
|
223
|
+
server.listen(port, host, () => {
|
|
224
|
+
server.close(() => resolve(true));
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Global process manager instance for dev mode.
|
|
232
|
+
* Set in dev/index.ts during startup.
|
|
233
|
+
*/
|
|
234
|
+
let globalProcessManager: ProcessManager | null = null;
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Get the global process manager (throws if not initialized).
|
|
238
|
+
*/
|
|
239
|
+
export function getProcessManager(): ProcessManager {
|
|
240
|
+
if (!globalProcessManager) {
|
|
241
|
+
throw new Error('ProcessManager not initialized. Call initProcessManager first.');
|
|
242
|
+
}
|
|
243
|
+
return globalProcessManager;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Initialize the global process manager.
|
|
248
|
+
*/
|
|
249
|
+
export function initProcessManager(logger: Logger): ProcessManager {
|
|
250
|
+
globalProcessManager = new ProcessManager(logger);
|
|
251
|
+
return globalProcessManager;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Cleanup helper that can be called from signal handlers or error handlers.
|
|
256
|
+
*/
|
|
257
|
+
export async function cleanupAll(reason: string): Promise<void> {
|
|
258
|
+
if (globalProcessManager) {
|
|
259
|
+
await globalProcessManager.cleanup(reason);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
@@ -22,6 +22,7 @@ const RemoveResponseSchema = z.object({
|
|
|
22
22
|
|
|
23
23
|
export const removeSubcommand = createSubcommand({
|
|
24
24
|
name: 'remove',
|
|
25
|
+
aliases: ['rm', 'del', 'delete', 'terminate'],
|
|
25
26
|
description: 'Remove a GitHub App installation',
|
|
26
27
|
tags: ['mutating', 'destructive', 'slow'],
|
|
27
28
|
idempotent: false,
|
|
@@ -11,7 +11,7 @@ export const deleteCommand = createSubcommand({
|
|
|
11
11
|
description: 'Delete a configuration profile',
|
|
12
12
|
tags: ['destructive', 'deletes-resource', 'fast'],
|
|
13
13
|
idempotent: false,
|
|
14
|
-
aliases: ['
|
|
14
|
+
aliases: ['rm', 'del', 'remove', 'terminate'],
|
|
15
15
|
examples: [
|
|
16
16
|
{ command: getCommand('profile delete staging'), description: 'Delete item' },
|
|
17
17
|
{
|