@apralabs/apra-fleet 0.2.2
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/LICENSE +182 -0
- package/README.md +324 -0
- package/dist/cli/auth.d.ts +2 -0
- package/dist/cli/auth.d.ts.map +1 -0
- package/dist/cli/auth.js +210 -0
- package/dist/cli/auth.js.map +1 -0
- package/dist/cli/config.d.ts +30 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +157 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/install.d.ts +37 -0
- package/dist/cli/install.d.ts.map +1 -0
- package/dist/cli/install.js +630 -0
- package/dist/cli/install.js.map +1 -0
- package/dist/cli/secret.d.ts +2 -0
- package/dist/cli/secret.d.ts.map +1 -0
- package/dist/cli/secret.js +366 -0
- package/dist/cli/secret.js.map +1 -0
- package/dist/cli/uninstall.d.ts +2 -0
- package/dist/cli/uninstall.d.ts.map +1 -0
- package/dist/cli/uninstall.js +312 -0
- package/dist/cli/uninstall.js.map +1 -0
- package/dist/cli/update.d.ts +2 -0
- package/dist/cli/update.d.ts.map +1 -0
- package/dist/cli/update.js +105 -0
- package/dist/cli/update.js.map +1 -0
- package/dist/delivery-mode.d.ts +19 -0
- package/dist/delivery-mode.d.ts.map +1 -0
- package/dist/delivery-mode.js +26 -0
- package/dist/delivery-mode.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +272 -0
- package/dist/index.js.map +1 -0
- package/dist/onboarding/text.d.ts +83 -0
- package/dist/onboarding/text.d.ts.map +1 -0
- package/dist/onboarding/text.js +126 -0
- package/dist/onboarding/text.js.map +1 -0
- package/dist/os/index.d.ts +9 -0
- package/dist/os/index.d.ts.map +1 -0
- package/dist/os/index.js +16 -0
- package/dist/os/index.js.map +1 -0
- package/dist/os/linux.d.ts +50 -0
- package/dist/os/linux.d.ts.map +1 -0
- package/dist/os/linux.js +244 -0
- package/dist/os/linux.js.map +1 -0
- package/dist/os/macos.d.ts +12 -0
- package/dist/os/macos.d.ts.map +1 -0
- package/dist/os/macos.js +41 -0
- package/dist/os/macos.js.map +1 -0
- package/dist/os/os-commands.d.ts +47 -0
- package/dist/os/os-commands.d.ts.map +1 -0
- package/dist/os/os-commands.js +3 -0
- package/dist/os/os-commands.js.map +1 -0
- package/dist/os/windows-wrapper.d.ts +6 -0
- package/dist/os/windows-wrapper.d.ts.map +1 -0
- package/dist/os/windows-wrapper.js +9 -0
- package/dist/os/windows-wrapper.js.map +1 -0
- package/dist/os/windows.d.ts +44 -0
- package/dist/os/windows.d.ts.map +1 -0
- package/dist/os/windows.js +269 -0
- package/dist/os/windows.js.map +1 -0
- package/dist/paths.d.ts +2 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +4 -0
- package/dist/paths.js.map +1 -0
- package/dist/providers/agy.d.ts +41 -0
- package/dist/providers/agy.d.ts.map +1 -0
- package/dist/providers/agy.js +208 -0
- package/dist/providers/agy.js.map +1 -0
- package/dist/providers/claude.d.ts +40 -0
- package/dist/providers/claude.d.ts.map +1 -0
- package/dist/providers/claude.js +178 -0
- package/dist/providers/claude.js.map +1 -0
- package/dist/providers/codex.d.ts +44 -0
- package/dist/providers/codex.d.ts.map +1 -0
- package/dist/providers/codex.js +173 -0
- package/dist/providers/codex.js.map +1 -0
- package/dist/providers/copilot.d.ts +40 -0
- package/dist/providers/copilot.d.ts.map +1 -0
- package/dist/providers/copilot.js +172 -0
- package/dist/providers/copilot.js.map +1 -0
- package/dist/providers/gemini.d.ts +41 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +192 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/index.d.ts +10 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +27 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/provider.d.ts +85 -0
- package/dist/providers/provider.d.ts.map +1 -0
- package/dist/providers/provider.js +21 -0
- package/dist/providers/provider.js.map +1 -0
- package/dist/services/auth-socket.d.ts +87 -0
- package/dist/services/auth-socket.d.ts.map +1 -0
- package/dist/services/auth-socket.js +684 -0
- package/dist/services/auth-socket.js.map +1 -0
- package/dist/services/auth-web.d.ts +31 -0
- package/dist/services/auth-web.d.ts.map +1 -0
- package/dist/services/auth-web.js +202 -0
- package/dist/services/auth-web.js.map +1 -0
- package/dist/services/cloud/activity.d.ts +16 -0
- package/dist/services/cloud/activity.d.ts.map +1 -0
- package/dist/services/cloud/activity.js +61 -0
- package/dist/services/cloud/activity.js.map +1 -0
- package/dist/services/cloud/aws.d.ts +24 -0
- package/dist/services/cloud/aws.d.ts.map +1 -0
- package/dist/services/cloud/aws.js +114 -0
- package/dist/services/cloud/aws.js.map +1 -0
- package/dist/services/cloud/cost.d.ts +46 -0
- package/dist/services/cloud/cost.d.ts.map +1 -0
- package/dist/services/cloud/cost.js +161 -0
- package/dist/services/cloud/cost.js.map +1 -0
- package/dist/services/cloud/idle-manager.d.ts +20 -0
- package/dist/services/cloud/idle-manager.d.ts.map +1 -0
- package/dist/services/cloud/idle-manager.js +103 -0
- package/dist/services/cloud/idle-manager.js.map +1 -0
- package/dist/services/cloud/lifecycle.d.ts +14 -0
- package/dist/services/cloud/lifecycle.d.ts.map +1 -0
- package/dist/services/cloud/lifecycle.js +128 -0
- package/dist/services/cloud/lifecycle.js.map +1 -0
- package/dist/services/cloud/task-wrapper.d.ts +30 -0
- package/dist/services/cloud/task-wrapper.d.ts.map +1 -0
- package/dist/services/cloud/task-wrapper.js +116 -0
- package/dist/services/cloud/task-wrapper.js.map +1 -0
- package/dist/services/cloud/types.d.ts +26 -0
- package/dist/services/cloud/types.d.ts.map +1 -0
- package/dist/services/cloud/types.js +2 -0
- package/dist/services/cloud/types.js.map +1 -0
- package/dist/services/credential-cleanup.d.ts +4 -0
- package/dist/services/credential-cleanup.d.ts.map +1 -0
- package/dist/services/credential-cleanup.js +61 -0
- package/dist/services/credential-cleanup.js.map +1 -0
- package/dist/services/credential-store.d.ts +56 -0
- package/dist/services/credential-store.d.ts.map +1 -0
- package/dist/services/credential-store.js +280 -0
- package/dist/services/credential-store.js.map +1 -0
- package/dist/services/file-transfer.d.ts +22 -0
- package/dist/services/file-transfer.d.ts.map +1 -0
- package/dist/services/file-transfer.js +14 -0
- package/dist/services/file-transfer.js.map +1 -0
- package/dist/services/git-config.d.ts +6 -0
- package/dist/services/git-config.d.ts.map +1 -0
- package/dist/services/git-config.js +31 -0
- package/dist/services/git-config.js.map +1 -0
- package/dist/services/github-app.d.ts +30 -0
- package/dist/services/github-app.d.ts.map +1 -0
- package/dist/services/github-app.js +96 -0
- package/dist/services/github-app.js.map +1 -0
- package/dist/services/icons.d.ts +16 -0
- package/dist/services/icons.d.ts.map +1 -0
- package/dist/services/icons.js +67 -0
- package/dist/services/icons.js.map +1 -0
- package/dist/services/known-hosts.d.ts +23 -0
- package/dist/services/known-hosts.d.ts.map +1 -0
- package/dist/services/known-hosts.js +86 -0
- package/dist/services/known-hosts.js.map +1 -0
- package/dist/services/onboarding.d.ts +68 -0
- package/dist/services/onboarding.d.ts.map +1 -0
- package/dist/services/onboarding.js +205 -0
- package/dist/services/onboarding.js.map +1 -0
- package/dist/services/registry.d.ts +16 -0
- package/dist/services/registry.d.ts.map +1 -0
- package/dist/services/registry.js +156 -0
- package/dist/services/registry.js.map +1 -0
- package/dist/services/sftp.d.ts +16 -0
- package/dist/services/sftp.d.ts.map +1 -0
- package/dist/services/sftp.js +104 -0
- package/dist/services/sftp.js.map +1 -0
- package/dist/services/ssh.d.ts +29 -0
- package/dist/services/ssh.d.ts.map +1 -0
- package/dist/services/ssh.js +297 -0
- package/dist/services/ssh.js.map +1 -0
- package/dist/services/stall/find-log-file.d.ts +2 -0
- package/dist/services/stall/find-log-file.d.ts.map +1 -0
- package/dist/services/stall/find-log-file.js +153 -0
- package/dist/services/stall/find-log-file.js.map +1 -0
- package/dist/services/stall/index.d.ts +4 -0
- package/dist/services/stall/index.d.ts.map +1 -0
- package/dist/services/stall/index.js +4 -0
- package/dist/services/stall/index.js.map +1 -0
- package/dist/services/stall/log-path-resolver.d.ts +4 -0
- package/dist/services/stall/log-path-resolver.d.ts.map +1 -0
- package/dist/services/stall/log-path-resolver.js +32 -0
- package/dist/services/stall/log-path-resolver.js.map +1 -0
- package/dist/services/stall/log-path-resolver.test.d.ts +2 -0
- package/dist/services/stall/log-path-resolver.test.d.ts.map +1 -0
- package/dist/services/stall/log-path-resolver.test.js +76 -0
- package/dist/services/stall/log-path-resolver.test.js.map +1 -0
- package/dist/services/stall/read-log-tail.d.ts +6 -0
- package/dist/services/stall/read-log-tail.d.ts.map +1 -0
- package/dist/services/stall/read-log-tail.js +44 -0
- package/dist/services/stall/read-log-tail.js.map +1 -0
- package/dist/services/stall/stall-detector.d.ts +25 -0
- package/dist/services/stall/stall-detector.d.ts.map +1 -0
- package/dist/services/stall/stall-detector.js +153 -0
- package/dist/services/stall/stall-detector.js.map +1 -0
- package/dist/services/stall/stall-poller.d.ts +6 -0
- package/dist/services/stall/stall-poller.d.ts.map +1 -0
- package/dist/services/stall/stall-poller.js +75 -0
- package/dist/services/stall/stall-poller.js.map +1 -0
- package/dist/services/stall/time-utils.d.ts +4 -0
- package/dist/services/stall/time-utils.d.ts.map +1 -0
- package/dist/services/stall/time-utils.js +22 -0
- package/dist/services/stall/time-utils.js.map +1 -0
- package/dist/services/statusline.d.ts +10 -0
- package/dist/services/statusline.d.ts.map +1 -0
- package/dist/services/statusline.js +84 -0
- package/dist/services/statusline.js.map +1 -0
- package/dist/services/strategy.d.ts +16 -0
- package/dist/services/strategy.d.ts.map +1 -0
- package/dist/services/strategy.js +241 -0
- package/dist/services/strategy.js.map +1 -0
- package/dist/services/task-cleanup.d.ts +3 -0
- package/dist/services/task-cleanup.d.ts.map +1 -0
- package/dist/services/task-cleanup.js +81 -0
- package/dist/services/task-cleanup.js.map +1 -0
- package/dist/services/update-check.d.ts +15 -0
- package/dist/services/update-check.d.ts.map +1 -0
- package/dist/services/update-check.js +67 -0
- package/dist/services/update-check.js.map +1 -0
- package/dist/services/user-config.d.ts +12 -0
- package/dist/services/user-config.d.ts.map +1 -0
- package/dist/services/user-config.js +73 -0
- package/dist/services/user-config.js.map +1 -0
- package/dist/services/vcs/azure-devops.d.ts +7 -0
- package/dist/services/vcs/azure-devops.d.ts.map +1 -0
- package/dist/services/vcs/azure-devops.js +38 -0
- package/dist/services/vcs/azure-devops.js.map +1 -0
- package/dist/services/vcs/bitbucket.d.ts +6 -0
- package/dist/services/vcs/bitbucket.d.ts.map +1 -0
- package/dist/services/vcs/bitbucket.js +31 -0
- package/dist/services/vcs/bitbucket.js.map +1 -0
- package/dist/services/vcs/constants.d.ts +2 -0
- package/dist/services/vcs/constants.d.ts.map +1 -0
- package/dist/services/vcs/constants.js +6 -0
- package/dist/services/vcs/constants.js.map +1 -0
- package/dist/services/vcs/github.d.ts +6 -0
- package/dist/services/vcs/github.d.ts.map +1 -0
- package/dist/services/vcs/github.js +81 -0
- package/dist/services/vcs/github.js.map +1 -0
- package/dist/services/vcs/types.d.ts +52 -0
- package/dist/services/vcs/types.d.ts.map +1 -0
- package/dist/services/vcs/types.js +8 -0
- package/dist/services/vcs/types.js.map +1 -0
- package/dist/smoke-test.d.ts +10 -0
- package/dist/smoke-test.d.ts.map +1 -0
- package/dist/smoke-test.js +102 -0
- package/dist/smoke-test.js.map +1 -0
- package/dist/tools/check-status.d.ts +11 -0
- package/dist/tools/check-status.d.ts.map +1 -0
- package/dist/tools/check-status.js +247 -0
- package/dist/tools/check-status.js.map +1 -0
- package/dist/tools/cloud-control.d.ts +17 -0
- package/dist/tools/cloud-control.d.ts.map +1 -0
- package/dist/tools/cloud-control.js +102 -0
- package/dist/tools/cloud-control.js.map +1 -0
- package/dist/tools/compose-permissions.d.ts +26 -0
- package/dist/tools/compose-permissions.d.ts.map +1 -0
- package/dist/tools/compose-permissions.js +217 -0
- package/dist/tools/compose-permissions.js.map +1 -0
- package/dist/tools/credential-store-delete.d.ts +11 -0
- package/dist/tools/credential-store-delete.d.ts.map +1 -0
- package/dist/tools/credential-store-delete.js +15 -0
- package/dist/tools/credential-store-delete.js.map +1 -0
- package/dist/tools/credential-store-list.d.ts +4 -0
- package/dist/tools/credential-store-list.d.ts.map +1 -0
- package/dist/tools/credential-store-list.js +30 -0
- package/dist/tools/credential-store-list.js.map +1 -0
- package/dist/tools/credential-store-set.d.ts +26 -0
- package/dist/tools/credential-store-set.d.ts.map +1 -0
- package/dist/tools/credential-store-set.js +28 -0
- package/dist/tools/credential-store-set.js.map +1 -0
- package/dist/tools/credential-store-update.d.ts +20 -0
- package/dist/tools/credential-store-update.d.ts.map +1 -0
- package/dist/tools/credential-store-update.js +38 -0
- package/dist/tools/credential-store-update.js.map +1 -0
- package/dist/tools/execute-command.d.ts +33 -0
- package/dist/tools/execute-command.d.ts.map +1 -0
- package/dist/tools/execute-command.js +231 -0
- package/dist/tools/execute-command.js.map +1 -0
- package/dist/tools/execute-prompt.d.ts +36 -0
- package/dist/tools/execute-prompt.d.ts.map +1 -0
- package/dist/tools/execute-prompt.js +310 -0
- package/dist/tools/execute-prompt.js.map +1 -0
- package/dist/tools/list-members.d.ts +11 -0
- package/dist/tools/list-members.d.ts.map +1 -0
- package/dist/tools/list-members.js +108 -0
- package/dist/tools/list-members.js.map +1 -0
- package/dist/tools/member-detail.d.ts +17 -0
- package/dist/tools/member-detail.d.ts.map +1 -0
- package/dist/tools/member-detail.js +263 -0
- package/dist/tools/member-detail.js.map +1 -0
- package/dist/tools/monitor-task.d.ts +20 -0
- package/dist/tools/monitor-task.d.ts.map +1 -0
- package/dist/tools/monitor-task.js +89 -0
- package/dist/tools/monitor-task.js.map +1 -0
- package/dist/tools/provision-auth.d.ts +17 -0
- package/dist/tools/provision-auth.d.ts.map +1 -0
- package/dist/tools/provision-auth.js +256 -0
- package/dist/tools/provision-auth.js.map +1 -0
- package/dist/tools/provision-vcs-auth.d.ts +50 -0
- package/dist/tools/provision-vcs-auth.d.ts.map +1 -0
- package/dist/tools/provision-vcs-auth.js +187 -0
- package/dist/tools/provision-vcs-auth.js.map +1 -0
- package/dist/tools/receive-files.d.ts +20 -0
- package/dist/tools/receive-files.d.ts.map +1 -0
- package/dist/tools/receive-files.js +82 -0
- package/dist/tools/receive-files.js.map +1 -0
- package/dist/tools/register-member.d.ts +74 -0
- package/dist/tools/register-member.d.ts.map +1 -0
- package/dist/tools/register-member.js +310 -0
- package/dist/tools/register-member.js.map +1 -0
- package/dist/tools/remove-member.d.ts +17 -0
- package/dist/tools/remove-member.d.ts.map +1 -0
- package/dist/tools/remove-member.js +126 -0
- package/dist/tools/remove-member.js.map +1 -0
- package/dist/tools/revoke-vcs-auth.d.ts +23 -0
- package/dist/tools/revoke-vcs-auth.d.ts.map +1 -0
- package/dist/tools/revoke-vcs-auth.js +55 -0
- package/dist/tools/revoke-vcs-auth.js.map +1 -0
- package/dist/tools/send-files.d.ts +20 -0
- package/dist/tools/send-files.d.ts.map +1 -0
- package/dist/tools/send-files.js +103 -0
- package/dist/tools/send-files.js.map +1 -0
- package/dist/tools/setup-git-app.d.ts +17 -0
- package/dist/tools/setup-git-app.d.ts.map +1 -0
- package/dist/tools/setup-git-app.js +89 -0
- package/dist/tools/setup-git-app.js.map +1 -0
- package/dist/tools/setup-ssh-key.d.ts +14 -0
- package/dist/tools/setup-ssh-key.d.ts.map +1 -0
- package/dist/tools/setup-ssh-key.js +119 -0
- package/dist/tools/setup-ssh-key.js.map +1 -0
- package/dist/tools/shutdown-server.d.ts +4 -0
- package/dist/tools/shutdown-server.d.ts.map +1 -0
- package/dist/tools/shutdown-server.js +9 -0
- package/dist/tools/shutdown-server.js.map +1 -0
- package/dist/tools/stop-prompt.d.ts +14 -0
- package/dist/tools/stop-prompt.d.ts.map +1 -0
- package/dist/tools/stop-prompt.js +44 -0
- package/dist/tools/stop-prompt.js.map +1 -0
- package/dist/tools/update-agent-cli.d.ts +17 -0
- package/dist/tools/update-agent-cli.d.ts.map +1 -0
- package/dist/tools/update-agent-cli.js +110 -0
- package/dist/tools/update-agent-cli.js.map +1 -0
- package/dist/tools/update-member.d.ts +77 -0
- package/dist/tools/update-member.d.ts.map +1 -0
- package/dist/tools/update-member.js +202 -0
- package/dist/tools/update-member.js.map +1 -0
- package/dist/tools/version.d.ts +4 -0
- package/dist/tools/version.d.ts.map +1 -0
- package/dist/tools/version.js +7 -0
- package/dist/tools/version.js.map +1 -0
- package/dist/types.d.ts +70 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/agent-helpers.d.ts +41 -0
- package/dist/utils/agent-helpers.d.ts.map +1 -0
- package/dist/utils/agent-helpers.js +84 -0
- package/dist/utils/agent-helpers.js.map +1 -0
- package/dist/utils/ansi.d.ts +6 -0
- package/dist/utils/ansi.d.ts.map +1 -0
- package/dist/utils/ansi.js +20 -0
- package/dist/utils/ansi.js.map +1 -0
- package/dist/utils/auth-env.d.ts +8 -0
- package/dist/utils/auth-env.d.ts.map +1 -0
- package/dist/utils/auth-env.js +30 -0
- package/dist/utils/auth-env.js.map +1 -0
- package/dist/utils/collect-secret.d.ts +2 -0
- package/dist/utils/collect-secret.d.ts.map +1 -0
- package/dist/utils/collect-secret.js +80 -0
- package/dist/utils/collect-secret.js.map +1 -0
- package/dist/utils/credential-validation.d.ts +13 -0
- package/dist/utils/credential-validation.d.ts.map +1 -0
- package/dist/utils/credential-validation.js +35 -0
- package/dist/utils/credential-validation.js.map +1 -0
- package/dist/utils/crypto.d.ts +3 -0
- package/dist/utils/crypto.d.ts.map +1 -0
- package/dist/utils/crypto.js +61 -0
- package/dist/utils/crypto.js.map +1 -0
- package/dist/utils/deep-merge.d.ts +3 -0
- package/dist/utils/deep-merge.d.ts.map +1 -0
- package/dist/utils/deep-merge.js +23 -0
- package/dist/utils/deep-merge.js.map +1 -0
- package/dist/utils/file-permissions.d.ts +8 -0
- package/dist/utils/file-permissions.d.ts.map +1 -0
- package/dist/utils/file-permissions.js +13 -0
- package/dist/utils/file-permissions.js.map +1 -0
- package/dist/utils/gpu-parser.d.ts +6 -0
- package/dist/utils/gpu-parser.d.ts.map +1 -0
- package/dist/utils/gpu-parser.js +15 -0
- package/dist/utils/gpu-parser.js.map +1 -0
- package/dist/utils/log-helpers.d.ts +29 -0
- package/dist/utils/log-helpers.d.ts.map +1 -0
- package/dist/utils/log-helpers.js +128 -0
- package/dist/utils/log-helpers.js.map +1 -0
- package/dist/utils/oob-timeout.d.ts +2 -0
- package/dist/utils/oob-timeout.d.ts.map +1 -0
- package/dist/utils/oob-timeout.js +2 -0
- package/dist/utils/oob-timeout.js.map +1 -0
- package/dist/utils/pid-helpers.d.ts +11 -0
- package/dist/utils/pid-helpers.d.ts.map +1 -0
- package/dist/utils/pid-helpers.js +21 -0
- package/dist/utils/pid-helpers.js.map +1 -0
- package/dist/utils/platform.d.ts +13 -0
- package/dist/utils/platform.d.ts.map +1 -0
- package/dist/utils/platform.js +60 -0
- package/dist/utils/platform.js.map +1 -0
- package/dist/utils/prompt-errors.d.ts +5 -0
- package/dist/utils/prompt-errors.d.ts.map +1 -0
- package/dist/utils/prompt-errors.js +15 -0
- package/dist/utils/prompt-errors.js.map +1 -0
- package/dist/utils/resolve-member.d.ts +18 -0
- package/dist/utils/resolve-member.d.ts.map +1 -0
- package/dist/utils/resolve-member.js +23 -0
- package/dist/utils/resolve-member.js.map +1 -0
- package/dist/utils/secure-input.d.ts +6 -0
- package/dist/utils/secure-input.d.ts.map +1 -0
- package/dist/utils/secure-input.js +60 -0
- package/dist/utils/secure-input.js.map +1 -0
- package/dist/utils/shell-escape.d.ts +43 -0
- package/dist/utils/shell-escape.d.ts.map +1 -0
- package/dist/utils/shell-escape.js +67 -0
- package/dist/utils/shell-escape.js.map +1 -0
- package/dist/utils/ssh-error-messages.d.ts +5 -0
- package/dist/utils/ssh-error-messages.d.ts.map +1 -0
- package/dist/utils/ssh-error-messages.js +20 -0
- package/dist/utils/ssh-error-messages.js.map +1 -0
- package/dist/version.d.ts +18 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +101 -0
- package/dist/version.js.map +1 -0
- package/hooks/hooks-config.json +15 -0
- package/hooks/post-register-member.sh +10 -0
- package/package.json +82 -0
- package/scripts/agy-settings-merge.js +27 -0
- package/scripts/agy-transcript-reader.js +62 -0
- package/scripts/fleet-statusline.sh +43 -0
- package/skills/fleet/SKILL.md +262 -0
- package/skills/fleet/auth-azdevops.md +72 -0
- package/skills/fleet/auth-bitbucket.md +65 -0
- package/skills/fleet/auth-github.md +86 -0
- package/skills/fleet/beads.md +90 -0
- package/skills/fleet/onboarding.md +92 -0
- package/skills/fleet/permissions.md +23 -0
- package/skills/fleet/profiles/base-dev.json +18 -0
- package/skills/fleet/profiles/base-reviewer.json +14 -0
- package/skills/fleet/profiles/cpp.json +4 -0
- package/skills/fleet/profiles/dotnet.json +4 -0
- package/skills/fleet/profiles/go.json +4 -0
- package/skills/fleet/profiles/jvm.json +4 -0
- package/skills/fleet/profiles/node.json +4 -0
- package/skills/fleet/profiles/python.json +4 -0
- package/skills/fleet/profiles/rust.json +4 -0
- package/skills/fleet/profiles/tpl-permissions.json +5 -0
- package/skills/fleet/skill-matrix.md +34 -0
- package/skills/fleet/troubleshooting.md +13 -0
- package/skills/pm/SKILL.md +110 -0
- package/skills/pm/backlog-item.md +65 -0
- package/skills/pm/beads.md +192 -0
- package/skills/pm/cleanup.md +15 -0
- package/skills/pm/context-file.md +40 -0
- package/skills/pm/doer-reviewer.md +123 -0
- package/skills/pm/init.md +25 -0
- package/skills/pm/multi-pair-sprint.md +64 -0
- package/skills/pm/plan-prompt.md +94 -0
- package/skills/pm/simple-sprint.md +42 -0
- package/skills/pm/single-pair-sprint.md +178 -0
- package/skills/pm/tpl-deploy.md +24 -0
- package/skills/pm/tpl-design.md +29 -0
- package/skills/pm/tpl-doer.md +43 -0
- package/skills/pm/tpl-plan.md +72 -0
- package/skills/pm/tpl-pm.md +2 -0
- package/skills/pm/tpl-progress.json +28 -0
- package/skills/pm/tpl-projects.md +4 -0
- package/skills/pm/tpl-requirements.md +21 -0
- package/skills/pm/tpl-reviewer-plan.md +53 -0
- package/skills/pm/tpl-reviewer.md +72 -0
- package/skills/pm/tpl-status.md +29 -0
- package/version.json +3 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { getStrategy } from '../services/strategy.js';
|
|
3
|
+
import { getOsCommands } from '../os/index.js';
|
|
4
|
+
import { getAgentOS, touchAgent } from '../utils/agent-helpers.js';
|
|
5
|
+
import { memberIdentifier, resolveMember } from '../utils/resolve-member.js';
|
|
6
|
+
import { githubProvider } from '../services/vcs/github.js';
|
|
7
|
+
import { bitbucketProvider } from '../services/vcs/bitbucket.js';
|
|
8
|
+
import { azureDevOpsProvider } from '../services/vcs/azure-devops.js';
|
|
9
|
+
import { PROVIDER_HOSTS } from '../services/vcs/constants.js';
|
|
10
|
+
import { logLine } from '../utils/log-helpers.js';
|
|
11
|
+
const providers = {
|
|
12
|
+
'github': githubProvider,
|
|
13
|
+
'bitbucket': bitbucketProvider,
|
|
14
|
+
'azure-devops': azureDevOpsProvider,
|
|
15
|
+
};
|
|
16
|
+
export const revokeVcsAuthSchema = z.object({
|
|
17
|
+
...memberIdentifier,
|
|
18
|
+
provider: z.enum(['github', 'bitbucket', 'azure-devops']).describe('VCS provider whose credentials to revoke'),
|
|
19
|
+
label: z.string().regex(/^[a-zA-Z0-9_-]{1,64}$/).optional().describe('Credential label to revoke (e.g. "work-github"). If omitted, revokes the default (provider-named) credential.'),
|
|
20
|
+
scope_url: z.string().optional().describe('Git credential scope URL used when the credential was provisioned (e.g. "https://github.com/my-org"). Defaults to "https://<host>".'),
|
|
21
|
+
});
|
|
22
|
+
export async function revokeVcsAuth(input) {
|
|
23
|
+
const agentOrError = resolveMember(input.member_id, input.member_name);
|
|
24
|
+
if (typeof agentOrError === 'string')
|
|
25
|
+
return agentOrError;
|
|
26
|
+
const agent = agentOrError;
|
|
27
|
+
const service = providers[input.provider];
|
|
28
|
+
const strategy = getStrategy(agent);
|
|
29
|
+
const conn = await strategy.testConnection();
|
|
30
|
+
if (!conn.ok)
|
|
31
|
+
return `❌ Member "${agent.friendlyName}" is offline: ${conn.error}`;
|
|
32
|
+
const cmds = getOsCommands(getAgentOS(agent));
|
|
33
|
+
const exec = async (cmd) => {
|
|
34
|
+
const result = await strategy.execCommand(cmd, 15000);
|
|
35
|
+
if (result.code !== 0 && result.stderr)
|
|
36
|
+
throw new Error(result.stderr);
|
|
37
|
+
return result.stdout;
|
|
38
|
+
};
|
|
39
|
+
const label = input.label ?? input.provider;
|
|
40
|
+
const host = PROVIDER_HOSTS[input.provider];
|
|
41
|
+
const scopeUrl = input.scope_url ?? `https://${host}`;
|
|
42
|
+
let result;
|
|
43
|
+
try {
|
|
44
|
+
result = await service.revoke(agent, cmds, exec, label, scopeUrl);
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
return `❌ Failed to revoke ${input.provider} credentials on "${agent.friendlyName}": ${err.message}`;
|
|
48
|
+
}
|
|
49
|
+
touchAgent(agent.id);
|
|
50
|
+
logLine('revoke_vcs_auth', `provider=${input.provider}`, agent);
|
|
51
|
+
return result.success
|
|
52
|
+
? `✅ ${result.message} on "${agent.friendlyName}"`
|
|
53
|
+
: `❌ ${result.message}`;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=revoke-vcs-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revoke-vcs-auth.js","sourceRoot":"","sources":["../../src/tools/revoke-vcs-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const sendFilesSchema: z.ZodObject<{
|
|
3
|
+
local_paths: z.ZodArray<z.ZodString, "many">;
|
|
4
|
+
dest_subdir: z.ZodOptional<z.ZodString>;
|
|
5
|
+
member_id: z.ZodOptional<z.ZodString>;
|
|
6
|
+
member_name: z.ZodOptional<z.ZodString>;
|
|
7
|
+
}, "strip", z.ZodTypeAny, {
|
|
8
|
+
local_paths: string[];
|
|
9
|
+
member_id?: string | undefined;
|
|
10
|
+
member_name?: string | undefined;
|
|
11
|
+
dest_subdir?: string | undefined;
|
|
12
|
+
}, {
|
|
13
|
+
local_paths: string[];
|
|
14
|
+
member_id?: string | undefined;
|
|
15
|
+
member_name?: string | undefined;
|
|
16
|
+
dest_subdir?: string | undefined;
|
|
17
|
+
}>;
|
|
18
|
+
export type SendFilesInput = z.infer<typeof sendFilesSchema>;
|
|
19
|
+
export declare function sendFiles(input: SendFilesInput, extra?: any): Promise<string>;
|
|
20
|
+
//# sourceMappingURL=send-files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send-files.d.ts","sourceRoot":"","sources":["../../src/tools/send-files.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;EAQ1B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE7D,wBAAsB,SAAS,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CA8FnF"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { getStrategy } from '../services/strategy.js';
|
|
4
|
+
import { touchAgent } from '../utils/agent-helpers.js';
|
|
5
|
+
import { memberIdentifier, resolveMember } from '../utils/resolve-member.js';
|
|
6
|
+
import { writeStatusline } from '../services/statusline.js';
|
|
7
|
+
import { ensureCloudReady } from '../services/cloud/lifecycle.js';
|
|
8
|
+
import { isContainedInWorkFolder } from '../utils/platform.js';
|
|
9
|
+
import { LogScope } from '../utils/log-helpers.js';
|
|
10
|
+
export const sendFilesSchema = z.object({
|
|
11
|
+
...memberIdentifier,
|
|
12
|
+
local_paths: z.array(z.string()).describe('Array of local file paths to upload'),
|
|
13
|
+
dest_subdir: z.string().optional().describe('Destination subdirectory relative to work_folder on the member. ' +
|
|
14
|
+
'Defaults to work_folder root (equivalent to "."). ' +
|
|
15
|
+
'Paths outside work_folder are rejected.'),
|
|
16
|
+
});
|
|
17
|
+
export async function sendFiles(input, extra) {
|
|
18
|
+
const agentOrError = resolveMember(input.member_id, input.member_name);
|
|
19
|
+
if (typeof agentOrError === 'string')
|
|
20
|
+
return agentOrError;
|
|
21
|
+
let agent;
|
|
22
|
+
try {
|
|
23
|
+
agent = await ensureCloudReady(agentOrError); // auto-start if stopped
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
return `Failed to upload files to "${agentOrError.friendlyName}": ${err.message}`;
|
|
27
|
+
}
|
|
28
|
+
if (input.dest_subdir?.includes('\0')) {
|
|
29
|
+
return `⛔ Invalid dest_subdir: null bytes are not allowed.`;
|
|
30
|
+
}
|
|
31
|
+
// Path security: verify dest_subdir stays within work_folder
|
|
32
|
+
let resolvedPath;
|
|
33
|
+
if (input.dest_subdir) {
|
|
34
|
+
if (agent.agentType === 'local') {
|
|
35
|
+
const resolved = path.resolve(agent.workFolder, input.dest_subdir);
|
|
36
|
+
const workFolderNorm = path.resolve(agent.workFolder);
|
|
37
|
+
if (resolved !== workFolderNorm && !resolved.startsWith(workFolderNorm + path.sep)) {
|
|
38
|
+
return 'dest_subdir resolves outside member work_folder — write blocked';
|
|
39
|
+
}
|
|
40
|
+
resolvedPath = resolved;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
if (!isContainedInWorkFolder(agent.workFolder, input.dest_subdir)) {
|
|
44
|
+
return 'dest_subdir resolves outside member work_folder — write blocked';
|
|
45
|
+
}
|
|
46
|
+
const normWorkFolder = agent.workFolder.replace(/\\/g, '/').replace(/\/$/, '');
|
|
47
|
+
const normSubdir = input.dest_subdir.replace(/\\/g, '/');
|
|
48
|
+
const isAbsolute = /^[A-Za-z]:/.test(normSubdir) || normSubdir.startsWith('/');
|
|
49
|
+
resolvedPath = isAbsolute ? normSubdir : `${normWorkFolder}/${normSubdir}`;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Pre-flight: detect basename collisions that would silently overwrite files
|
|
53
|
+
const seen = new Map();
|
|
54
|
+
const collisionLines = [];
|
|
55
|
+
for (const p of input.local_paths) {
|
|
56
|
+
const bn = path.basename(p);
|
|
57
|
+
const first = seen.get(bn);
|
|
58
|
+
if (first !== undefined) {
|
|
59
|
+
collisionLines.push(` ${bn}: "${first}" and "${p}"`);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
seen.set(bn, p);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (collisionLines.length > 0) {
|
|
66
|
+
return `⛔ Basename collision: these files share a name and would overwrite each other at destination:\n${collisionLines.join('\n')}`;
|
|
67
|
+
}
|
|
68
|
+
const strategy = getStrategy(agent);
|
|
69
|
+
const dest = resolvedPath ?? agent.workFolder;
|
|
70
|
+
const scope = new LogScope('send_files', `${input.local_paths.length} file(s) → ${dest}`, agent);
|
|
71
|
+
writeStatusline(new Map([[agent.id, 'busy']]));
|
|
72
|
+
try {
|
|
73
|
+
const result = await strategy.transferFiles(input.local_paths, input.dest_subdir, extra?.signal);
|
|
74
|
+
touchAgent(agent.id); // T7: idle manager resets its timer via touchAgent
|
|
75
|
+
let output = '';
|
|
76
|
+
if (result.success.length > 0) {
|
|
77
|
+
output += `✅ Successfully uploaded ${result.success.length} file(s) to ${agent.friendlyName}:\n`;
|
|
78
|
+
for (const f of result.success) {
|
|
79
|
+
output += ` - ${f}\n`;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (result.failed.length > 0) {
|
|
83
|
+
output += `\n❌ Failed to upload ${result.failed.length} file(s):\n`;
|
|
84
|
+
for (const f of result.failed) {
|
|
85
|
+
output += ` - ${f.path}: ${f.error}\n`;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
output += `\nDestination: ${resolvedPath ?? agent.workFolder}`;
|
|
89
|
+
if (result.failed.length > 0 && result.success.length > 0)
|
|
90
|
+
scope.fail(`${result.success.length} ok, ${result.failed.length} failed`);
|
|
91
|
+
else if (result.failed.length > 0)
|
|
92
|
+
scope.abort(`all ${result.failed.length} file(s) failed`);
|
|
93
|
+
else
|
|
94
|
+
scope.ok(`${result.success.length} file(s)`);
|
|
95
|
+
return output;
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
writeStatusline(new Map([[agent.id, 'offline']]));
|
|
99
|
+
scope.abort(err.message);
|
|
100
|
+
return `Failed to upload files to "${agent.friendlyName}": ${err.message}`;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=send-files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send-files.js","sourceRoot":"","sources":["../../src/tools/send-files.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAGnD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,GAAG,gBAAgB;IACnB,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,qCAAqC,CAAC;IAChF,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACzC,kEAAkE;QAClE,oDAAoD;QACpD,yCAAyC,CAC1C;CACF,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAqB,EAAE,KAAW;IAChE,MAAM,YAAY,GAAG,aAAa,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;IACvE,IAAI,OAAO,YAAY,KAAK,QAAQ;QAAE,OAAO,YAAY,CAAC;IAC1D,IAAI,KAAY,CAAC;IACjB,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,gBAAgB,CAAC,YAAqB,CAAC,CAAC,CAAC,wBAAwB;IACjF,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,8BAA+B,YAAsB,CAAC,YAAY,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;IAC/F,CAAC;IAED,IAAI,KAAK,CAAC,WAAW,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,OAAO,oDAAoD,CAAC;IAC9D,CAAC;IAED,6DAA6D;IAC7D,IAAI,YAAgC,CAAC;IACrC,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACtB,IAAI,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;YAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;YACnE,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACtD,IAAI,QAAQ,KAAK,cAAc,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnF,OAAO,iEAAiE,CAAC;YAC3E,CAAC;YACD,YAAY,GAAG,QAAQ,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;gBAClE,OAAO,iEAAiE,CAAC;YAC3E,CAAC;YACD,MAAM,cAAc,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC/E,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACzD,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAC/E,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,cAAc,IAAI,UAAU,EAAE,CAAC;QAC7E,CAAC;IACH,CAAC;IAED,6EAA6E;IAC7E,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvC,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QAClC,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,KAAK,UAAU,CAAC,GAAG,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IACD,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,kGAAkG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACvI,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAEpC,MAAM,IAAI,GAAG,YAAY,IAAI,KAAK,CAAC,UAAU,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,YAAY,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC,MAAM,cAAc,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;IAEjG,eAAe,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAE/C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAEjG,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,mDAAmD;QAEzE,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,2BAA2B,MAAM,CAAC,OAAO,CAAC,MAAM,eAAe,KAAK,CAAC,YAAY,KAAK,CAAC;YACjG,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC/B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;YACzB,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,wBAAwB,MAAM,CAAC,MAAM,CAAC,MAAM,aAAa,CAAC;YACpE,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAC9B,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC;YAC1C,CAAC;QACH,CAAC;QAED,MAAM,IAAI,kBAAkB,YAAY,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QAE/D,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;YACvD,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,QAAQ,MAAM,CAAC,MAAM,CAAC,MAAM,SAAS,CAAC,CAAC;aACvE,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;YAC/B,KAAK,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,iBAAiB,CAAC,CAAC;;YAE1D,KAAK,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,UAAU,CAAC,CAAC;QAE/C,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,eAAe,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACzB,OAAO,8BAA8B,KAAK,CAAC,YAAY,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;IAC7E,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const setupGitAppSchema: z.ZodObject<{
|
|
3
|
+
app_id: z.ZodString;
|
|
4
|
+
private_key_path: z.ZodString;
|
|
5
|
+
installation_id: z.ZodNumber;
|
|
6
|
+
}, "strip", z.ZodTypeAny, {
|
|
7
|
+
app_id: string;
|
|
8
|
+
private_key_path: string;
|
|
9
|
+
installation_id: number;
|
|
10
|
+
}, {
|
|
11
|
+
app_id: string;
|
|
12
|
+
private_key_path: string;
|
|
13
|
+
installation_id: number;
|
|
14
|
+
}>;
|
|
15
|
+
export type SetupGitAppInput = z.infer<typeof setupGitAppSchema>;
|
|
16
|
+
export declare function setupGitApp(input: SetupGitAppInput): Promise<string>;
|
|
17
|
+
//# sourceMappingURL=setup-git-app.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-git-app.d.ts","sourceRoot":"","sources":["../../src/tools/setup-git-app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAaxB,eAAO,MAAM,iBAAiB;;;;;;;;;;;;EAI5B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEjE,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAkE1E"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import os from 'node:os';
|
|
5
|
+
import crypto from 'node:crypto';
|
|
6
|
+
import { loadPrivateKey, verifyAppConnectivity } from '../services/github-app.js';
|
|
7
|
+
import { setGitHubApp } from '../services/git-config.js';
|
|
8
|
+
import { enforceOwnerOnly } from '../utils/file-permissions.js';
|
|
9
|
+
import { credentialResolve } from '../services/credential-store.js';
|
|
10
|
+
import { FLEET_DIR } from '../paths.js';
|
|
11
|
+
const STORED_KEY_PATH = path.join(FLEET_DIR, 'github-app.pem');
|
|
12
|
+
const TOKEN_RE = /\{\{secure\.([a-zA-Z0-9_-]{1,64})\}\}/;
|
|
13
|
+
export const setupGitAppSchema = z.object({
|
|
14
|
+
app_id: z.string().regex(/^\d+$/, 'App ID must be numeric').describe('The GitHub App ID (numeric string)'),
|
|
15
|
+
private_key_path: z.string().describe('Path to the GitHub App private key (.pem) file. Supports {{secure.NAME}} token — if the resolved value starts with -----BEGIN it is treated as PEM key content directly (no file needed).'),
|
|
16
|
+
installation_id: z.number().describe('The GitHub App installation ID for your organization'),
|
|
17
|
+
});
|
|
18
|
+
export async function setupGitApp(input) {
|
|
19
|
+
// Resolve {{secure.NAME}} token in private_key_path if present
|
|
20
|
+
let keyPath = input.private_key_path;
|
|
21
|
+
let tempKeyPath;
|
|
22
|
+
const tokenMatch = TOKEN_RE.exec(input.private_key_path);
|
|
23
|
+
if (tokenMatch) {
|
|
24
|
+
const entry = credentialResolve(tokenMatch[1], '*');
|
|
25
|
+
if (!entry)
|
|
26
|
+
return `❌ Credential "${tokenMatch[1]}" not found. Run credential_store_set first.`;
|
|
27
|
+
if ('denied' in entry)
|
|
28
|
+
return `❌ ${entry.denied}`;
|
|
29
|
+
if ('expired' in entry)
|
|
30
|
+
return `❌ ${entry.expired}`;
|
|
31
|
+
const resolved = entry.plaintext;
|
|
32
|
+
if (resolved.startsWith('-----BEGIN')) {
|
|
33
|
+
tempKeyPath = path.join(os.tmpdir(), `apra-fleet-gitapp-${crypto.randomBytes(8).toString('hex')}.pem`);
|
|
34
|
+
fs.writeFileSync(tempKeyPath, resolved, { mode: 0o600 });
|
|
35
|
+
keyPath = tempKeyPath;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
keyPath = resolved;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
// Validate and read private key
|
|
43
|
+
let privateKey;
|
|
44
|
+
try {
|
|
45
|
+
privateKey = loadPrivateKey(keyPath);
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
return `❌ ${err.message}`;
|
|
49
|
+
}
|
|
50
|
+
// Verify connectivity before storing anything
|
|
51
|
+
let result;
|
|
52
|
+
try {
|
|
53
|
+
result = await verifyAppConnectivity(input.app_id, privateKey, input.installation_id);
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
return `❌ GitHub API verification failed: ${err.message}`;
|
|
57
|
+
}
|
|
58
|
+
if (!result.ok) {
|
|
59
|
+
return `❌ GitHub App verification failed: ${result.error}`;
|
|
60
|
+
}
|
|
61
|
+
// Copy PEM to fleet dir
|
|
62
|
+
if (!fs.existsSync(FLEET_DIR)) {
|
|
63
|
+
fs.mkdirSync(FLEET_DIR, { recursive: true, mode: 0o700 });
|
|
64
|
+
}
|
|
65
|
+
fs.writeFileSync(STORED_KEY_PATH, privateKey + '\n', { mode: 0o600 });
|
|
66
|
+
enforceOwnerOnly(STORED_KEY_PATH);
|
|
67
|
+
// Store config
|
|
68
|
+
setGitHubApp({
|
|
69
|
+
appId: input.app_id,
|
|
70
|
+
privateKeyPath: STORED_KEY_PATH,
|
|
71
|
+
installationId: input.installation_id,
|
|
72
|
+
createdAt: new Date().toISOString(),
|
|
73
|
+
});
|
|
74
|
+
return `✅ GitHub App configured successfully\n`
|
|
75
|
+
+ ` App: ${result.appName} (ID: ${input.app_id})\n`
|
|
76
|
+
+ ` Org: ${result.orgName}\n`
|
|
77
|
+
+ ` Installation: ${input.installation_id}\n`
|
|
78
|
+
+ ` Private key stored: ${STORED_KEY_PATH}`;
|
|
79
|
+
}
|
|
80
|
+
finally {
|
|
81
|
+
if (tempKeyPath) {
|
|
82
|
+
try {
|
|
83
|
+
fs.unlinkSync(tempKeyPath);
|
|
84
|
+
}
|
|
85
|
+
catch { /* best effort */ }
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=setup-git-app.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-git-app.js","sourceRoot":"","sources":["../../src/tools/setup-git-app.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const setupSSHKeySchema: z.ZodObject<{
|
|
3
|
+
member_id: z.ZodOptional<z.ZodString>;
|
|
4
|
+
member_name: z.ZodOptional<z.ZodString>;
|
|
5
|
+
}, "strip", z.ZodTypeAny, {
|
|
6
|
+
member_id?: string | undefined;
|
|
7
|
+
member_name?: string | undefined;
|
|
8
|
+
}, {
|
|
9
|
+
member_id?: string | undefined;
|
|
10
|
+
member_name?: string | undefined;
|
|
11
|
+
}>;
|
|
12
|
+
export type SetupSSHKeyInput = z.infer<typeof setupSSHKeySchema>;
|
|
13
|
+
export declare function setupSSHKey(input: SetupSSHKeyInput): Promise<string>;
|
|
14
|
+
//# sourceMappingURL=setup-ssh-key.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-ssh-key.d.ts","sourceRoot":"","sources":["../../src/tools/setup-ssh-key.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAYxB,eAAO,MAAM,iBAAiB;;;;;;;;;EAE5B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAoCjE,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiF1E"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import crypto from 'node:crypto';
|
|
5
|
+
import { updateAgent, getKeysDir } from '../services/registry.js';
|
|
6
|
+
import { getStrategy } from '../services/strategy.js';
|
|
7
|
+
import { testAuthConnection } from '../services/ssh.js';
|
|
8
|
+
import { memberIdentifier, resolveMember } from '../utils/resolve-member.js';
|
|
9
|
+
import { getOsCommands } from '../os/index.js';
|
|
10
|
+
import { logLine } from '../utils/log-helpers.js';
|
|
11
|
+
export const setupSSHKeySchema = z.object({
|
|
12
|
+
...memberIdentifier,
|
|
13
|
+
});
|
|
14
|
+
/**
|
|
15
|
+
* Convert an RSA public key (PEM) to OpenSSH authorized_keys format.
|
|
16
|
+
* Uses JWK export to extract modulus (n) and exponent (e), then builds
|
|
17
|
+
* the ssh-rsa wire format per RFC 4253.
|
|
18
|
+
*/
|
|
19
|
+
function rsaPublicKeyToOpenSSH(publicKeyPem, comment) {
|
|
20
|
+
const keyObj = crypto.createPublicKey(publicKeyPem);
|
|
21
|
+
const jwk = keyObj.export({ format: 'jwk' });
|
|
22
|
+
const e = Buffer.from(jwk.e, 'base64url');
|
|
23
|
+
const n = Buffer.from(jwk.n, 'base64url');
|
|
24
|
+
const typeStr = 'ssh-rsa';
|
|
25
|
+
const typeLen = Buffer.alloc(4);
|
|
26
|
+
typeLen.writeUInt32BE(typeStr.length);
|
|
27
|
+
// Leading zero byte needed if high bit is set (to avoid being interpreted as negative)
|
|
28
|
+
const ePadded = (e[0] & 0x80) ? Buffer.concat([Buffer.from([0]), e]) : e;
|
|
29
|
+
const eLen = Buffer.alloc(4);
|
|
30
|
+
eLen.writeUInt32BE(ePadded.length);
|
|
31
|
+
const nPadded = (n[0] & 0x80) ? Buffer.concat([Buffer.from([0]), n]) : n;
|
|
32
|
+
const nLen = Buffer.alloc(4);
|
|
33
|
+
nLen.writeUInt32BE(nPadded.length);
|
|
34
|
+
const blob = Buffer.concat([typeLen, Buffer.from(typeStr), eLen, ePadded, nLen, nPadded]);
|
|
35
|
+
return `ssh-rsa ${blob.toString('base64')} ${comment}`;
|
|
36
|
+
}
|
|
37
|
+
function cleanupLocalKeys(privateKeyPath, publicKeyPath) {
|
|
38
|
+
try {
|
|
39
|
+
fs.unlinkSync(privateKeyPath);
|
|
40
|
+
}
|
|
41
|
+
catch { }
|
|
42
|
+
try {
|
|
43
|
+
fs.unlinkSync(publicKeyPath);
|
|
44
|
+
}
|
|
45
|
+
catch { }
|
|
46
|
+
}
|
|
47
|
+
export async function setupSSHKey(input) {
|
|
48
|
+
const agentOrError = resolveMember(input.member_id, input.member_name);
|
|
49
|
+
if (typeof agentOrError === 'string')
|
|
50
|
+
return agentOrError;
|
|
51
|
+
const agent = agentOrError;
|
|
52
|
+
if (agent.agentType === 'local') {
|
|
53
|
+
return `❌ SSH key setup is not applicable for local members. Member "${agent.friendlyName}" runs on the same machine — no SSH authentication is needed.`;
|
|
54
|
+
}
|
|
55
|
+
if (agent.authType === 'key') {
|
|
56
|
+
return `Member "${agent.friendlyName}" is already using key-based authentication.`;
|
|
57
|
+
}
|
|
58
|
+
const keysDir = getKeysDir();
|
|
59
|
+
const keyName = `${agent.id}_rsa`;
|
|
60
|
+
const privateKeyPath = path.join(keysDir, keyName);
|
|
61
|
+
const publicKeyPath = `${privateKeyPath}.pub`;
|
|
62
|
+
const strategy = getStrategy(agent);
|
|
63
|
+
// Step 1: Generate RSA-4096 key pair using Node crypto (no external tools needed)
|
|
64
|
+
try {
|
|
65
|
+
const { privateKey, publicKey } = crypto.generateKeyPairSync('rsa', {
|
|
66
|
+
modulusLength: 4096,
|
|
67
|
+
publicKeyEncoding: { type: 'spki', format: 'pem' },
|
|
68
|
+
privateKeyEncoding: { type: 'pkcs1', format: 'pem' },
|
|
69
|
+
});
|
|
70
|
+
// Convert to OpenSSH authorized_keys format
|
|
71
|
+
const comment = `apra-fleet-${agent.friendlyName}`;
|
|
72
|
+
const opensshPubKey = rsaPublicKeyToOpenSSH(publicKey, comment);
|
|
73
|
+
fs.writeFileSync(privateKeyPath, privateKey, { mode: 0o600 });
|
|
74
|
+
fs.writeFileSync(publicKeyPath, opensshPubKey, { mode: 0o644 });
|
|
75
|
+
// Step 2: Deploy public key to remote using OS-specific commands
|
|
76
|
+
const cmds = getOsCommands(agent.os ?? 'linux');
|
|
77
|
+
const deployCommands = cmds.deploySSHPublicKey(opensshPubKey);
|
|
78
|
+
for (const cmd of deployCommands) {
|
|
79
|
+
const result = await strategy.execCommand(cmd, 10000);
|
|
80
|
+
if (result.code !== 0) {
|
|
81
|
+
cleanupLocalKeys(privateKeyPath, publicKeyPath);
|
|
82
|
+
return `❌ Failed to deploy key to "${agent.friendlyName}": ${result.stderr}`;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Step 3: Test key-based login with a dedicated non-pooled connection.
|
|
86
|
+
// This avoids reusing the cached password-based session from the pool
|
|
87
|
+
// and avoids TOCTOU races with other agents sharing the same host.
|
|
88
|
+
const testAgent = { ...agent, authType: 'key', keyPath: privateKeyPath, encryptedPassword: undefined };
|
|
89
|
+
try {
|
|
90
|
+
const testResult = await testAuthConnection(testAgent, 'echo "key-auth-ok"', 10000);
|
|
91
|
+
if (!testResult.stdout.includes('key-auth-ok')) {
|
|
92
|
+
cleanupLocalKeys(privateKeyPath, publicKeyPath);
|
|
93
|
+
return `❌ Key-based authentication test failed for "${agent.friendlyName}". Password auth is still active.`;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
cleanupLocalKeys(privateKeyPath, publicKeyPath);
|
|
98
|
+
return `❌ Key-based authentication test failed: ${err.message}. Password auth is still active.`;
|
|
99
|
+
}
|
|
100
|
+
// Step 4: Update agent registration (only after successful verification)
|
|
101
|
+
updateAgent(agent.id, {
|
|
102
|
+
authType: 'key',
|
|
103
|
+
keyPath: privateKeyPath,
|
|
104
|
+
encryptedPassword: undefined,
|
|
105
|
+
});
|
|
106
|
+
logLine('setup_ssh_key', `id=${agent.id} name=${agent.friendlyName}`, agent);
|
|
107
|
+
let result = `✅ SSH key authentication set up for "${agent.friendlyName}"\n\n`;
|
|
108
|
+
result += ` Private key: ${privateKeyPath}\n`;
|
|
109
|
+
result += ` Public key: ${publicKeyPath}\n`;
|
|
110
|
+
result += ` Auth type: key (updated from password)\n`;
|
|
111
|
+
result += ` Verification: Key-based login successful\n`;
|
|
112
|
+
return result;
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
cleanupLocalKeys(privateKeyPath, publicKeyPath);
|
|
116
|
+
return `❌ Failed to set up SSH key: ${err.message}`;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=setup-ssh-key.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-ssh-key.js","sourceRoot":"","sources":["../../src/tools/setup-ssh-key.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shutdown-server.d.ts","sourceRoot":"","sources":["../../src/tools/shutdown-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,oBAAoB,gDAAe,CAAC;AAEjD,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAItD"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { closeAllConnections } from '../services/ssh.js';
|
|
3
|
+
export const shutdownServerSchema = z.object({});
|
|
4
|
+
export async function shutdownServer() {
|
|
5
|
+
closeAllConnections();
|
|
6
|
+
setTimeout(() => process.exit(0), 100);
|
|
7
|
+
return 'Server shutting down. Run /mcp to start a fresh instance.';
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=shutdown-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shutdown-server.js","sourceRoot":"","sources":["../../src/tools/shutdown-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,mBAAmB,EAAE,CAAC;IACtB,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACvC,OAAO,2DAA2D,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const stopPromptSchema: z.ZodObject<{
|
|
3
|
+
member_id: z.ZodOptional<z.ZodString>;
|
|
4
|
+
member_name: z.ZodOptional<z.ZodString>;
|
|
5
|
+
}, "strip", z.ZodTypeAny, {
|
|
6
|
+
member_id?: string | undefined;
|
|
7
|
+
member_name?: string | undefined;
|
|
8
|
+
}, {
|
|
9
|
+
member_id?: string | undefined;
|
|
10
|
+
member_name?: string | undefined;
|
|
11
|
+
}>;
|
|
12
|
+
export type StopPromptInput = z.infer<typeof stopPromptSchema>;
|
|
13
|
+
export declare function stopPrompt(input: StopPromptInput): Promise<string>;
|
|
14
|
+
//# sourceMappingURL=stop-prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop-prompt.d.ts","sourceRoot":"","sources":["../../src/tools/stop-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAYxB,eAAO,MAAM,gBAAgB;;;;;;;;;EAE3B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE/D,wBAAsB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAkCxE"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { memberIdentifier, resolveMember } from '../utils/resolve-member.js';
|
|
3
|
+
import { getStoredPid, getAgentOS } from '../utils/agent-helpers.js';
|
|
4
|
+
import { getStrategy } from '../services/strategy.js';
|
|
5
|
+
import { getOsCommands } from '../os/index.js';
|
|
6
|
+
import { tryKillPid } from '../utils/pid-helpers.js';
|
|
7
|
+
import { logLine } from '../utils/log-helpers.js';
|
|
8
|
+
import { inFlightAgents } from './execute-prompt.js';
|
|
9
|
+
import { writeStatusline } from '../services/statusline.js';
|
|
10
|
+
import { getStallDetector } from '../services/stall/index.js';
|
|
11
|
+
import { cancelPendingAuth } from '../services/auth-socket.js';
|
|
12
|
+
export const stopPromptSchema = z.object({
|
|
13
|
+
...memberIdentifier,
|
|
14
|
+
});
|
|
15
|
+
export async function stopPrompt(input) {
|
|
16
|
+
const agentOrError = resolveMember(input.member_id, input.member_name);
|
|
17
|
+
if (typeof agentOrError === 'string')
|
|
18
|
+
return agentOrError;
|
|
19
|
+
const agent = agentOrError;
|
|
20
|
+
const strategy = getStrategy(agent);
|
|
21
|
+
const cmds = getOsCommands(getAgentOS(agent));
|
|
22
|
+
const pid = getStoredPid(agent.id);
|
|
23
|
+
cancelPendingAuth(agent.friendlyName);
|
|
24
|
+
await tryKillPid(agent, strategy, cmds);
|
|
25
|
+
getStallDetector().remove(agent.id);
|
|
26
|
+
if (pid !== undefined) {
|
|
27
|
+
// Poll until execute_prompt's finally block clears inFlightAgents so a
|
|
28
|
+
// re-dispatch immediately after stop_prompt doesn't race against cleanup.
|
|
29
|
+
const deadline = Date.now() + 2000;
|
|
30
|
+
while (inFlightAgents.has(agent.id) && Date.now() < deadline) {
|
|
31
|
+
await new Promise(r => setTimeout(r, 50));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// Unconditionally clear busy state — handles pid=none case where inFlightAgents
|
|
35
|
+
// still holds the agent but the process never recorded a PID.
|
|
36
|
+
inFlightAgents.delete(agent.id);
|
|
37
|
+
writeStatusline();
|
|
38
|
+
logLine('stop_prompt', `pid=${pid ?? 'none'}`, agent);
|
|
39
|
+
if (pid !== undefined) {
|
|
40
|
+
return `🛑 Agent "${agent.friendlyName}" stopped (killed PID ${pid}).`;
|
|
41
|
+
}
|
|
42
|
+
return `🛑 Agent "${agent.friendlyName}" stopped (no active session was running).`;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=stop-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop-prompt.js","sourceRoot":"","sources":["../../src/tools/stop-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAE/D,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,GAAG,gBAAgB;CACpB,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAsB;IACrD,MAAM,YAAY,GAAG,aAAa,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;IACvE,IAAI,OAAO,YAAY,KAAK,QAAQ;QAAE,OAAO,YAAY,CAAC;IAC1D,MAAM,KAAK,GAAG,YAAY,CAAC;IAE3B,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IAE9C,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAEnC,iBAAiB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACtC,MAAM,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IACxC,gBAAgB,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAEpC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,uEAAuE;QACvE,0EAA0E;QAC1E,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QACnC,OAAO,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;YAC7D,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,gFAAgF;IAChF,8DAA8D;IAC9D,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAChC,eAAe,EAAE,CAAC;IAElB,OAAO,CAAC,aAAa,EAAE,OAAO,GAAG,IAAI,MAAM,EAAE,EAAE,KAAK,CAAC,CAAC;IAEtD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO,aAAa,KAAK,CAAC,YAAY,yBAAyB,GAAG,IAAI,CAAC;IACzE,CAAC;IACD,OAAO,aAAa,KAAK,CAAC,YAAY,4CAA4C,CAAC;AACrF,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const updateAgentCliSchema: z.ZodObject<{
|
|
3
|
+
install_if_missing: z.ZodDefault<z.ZodBoolean>;
|
|
4
|
+
member_id: z.ZodOptional<z.ZodString>;
|
|
5
|
+
member_name: z.ZodOptional<z.ZodString>;
|
|
6
|
+
}, "strip", z.ZodTypeAny, {
|
|
7
|
+
install_if_missing: boolean;
|
|
8
|
+
member_id?: string | undefined;
|
|
9
|
+
member_name?: string | undefined;
|
|
10
|
+
}, {
|
|
11
|
+
member_id?: string | undefined;
|
|
12
|
+
member_name?: string | undefined;
|
|
13
|
+
install_if_missing?: boolean | undefined;
|
|
14
|
+
}>;
|
|
15
|
+
export type UpdateAgentCliInput = z.infer<typeof updateAgentCliSchema>;
|
|
16
|
+
export declare function updateAgentCli(input: UpdateAgentCliInput): Promise<string>;
|
|
17
|
+
//# sourceMappingURL=update-agent-cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-agent-cli.d.ts","sourceRoot":"","sources":["../../src/tools/update-agent-cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB,eAAO,MAAM,oBAAoB;;;;;;;;;;;;EAG/B,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AA8DvE,wBAAsB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyDhF"}
|