@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,96 @@
|
|
|
1
|
+
import crypto from 'node:crypto';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
const GITHUB_API = 'https://api.github.com';
|
|
4
|
+
/**
|
|
5
|
+
* Read and validate a PEM private key file.
|
|
6
|
+
*/
|
|
7
|
+
export function loadPrivateKey(keyPath) {
|
|
8
|
+
if (!fs.existsSync(keyPath)) {
|
|
9
|
+
throw new Error(`Private key file not found: ${keyPath}`);
|
|
10
|
+
}
|
|
11
|
+
const key = fs.readFileSync(keyPath, 'utf-8').trim();
|
|
12
|
+
if (!key.startsWith('-----BEGIN')) {
|
|
13
|
+
throw new Error('Invalid private key: file does not start with -----BEGIN');
|
|
14
|
+
}
|
|
15
|
+
return key;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Create a JWT for GitHub App authentication (RS256).
|
|
19
|
+
* Valid for 10 minutes, backdated 60 seconds for clock skew.
|
|
20
|
+
*/
|
|
21
|
+
export function createAppJWT(appId, privateKey) {
|
|
22
|
+
const now = Math.floor(Date.now() / 1000);
|
|
23
|
+
const header = Buffer.from(JSON.stringify({ alg: 'RS256', typ: 'JWT' })).toString('base64url');
|
|
24
|
+
const payload = Buffer.from(JSON.stringify({ iat: now - 60, exp: now + 600, iss: appId })).toString('base64url');
|
|
25
|
+
const signature = crypto.sign('sha256', Buffer.from(`${header}.${payload}`), privateKey).toString('base64url');
|
|
26
|
+
return `${header}.${payload}.${signature}`;
|
|
27
|
+
}
|
|
28
|
+
async function githubGet(path, jwt) {
|
|
29
|
+
const res = await fetch(`${GITHUB_API}${path}`, {
|
|
30
|
+
headers: { Authorization: `Bearer ${jwt}`, Accept: 'application/vnd.github+json' },
|
|
31
|
+
});
|
|
32
|
+
const data = await res.json();
|
|
33
|
+
return { ok: res.ok, status: res.status, data };
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Verify GitHub App connectivity: authenticate as the app, then check the installation exists.
|
|
37
|
+
*/
|
|
38
|
+
export async function verifyAppConnectivity(appId, privateKey, installationId) {
|
|
39
|
+
const jwt = createAppJWT(appId, privateKey);
|
|
40
|
+
const appRes = await githubGet('/app', jwt);
|
|
41
|
+
if (!appRes.ok) {
|
|
42
|
+
return { ok: false, error: `GET /app failed (${appRes.status}): ${appRes.data?.message ?? 'unknown error'}` };
|
|
43
|
+
}
|
|
44
|
+
const installRes = await githubGet(`/app/installations/${installationId}`, jwt);
|
|
45
|
+
if (!installRes.ok) {
|
|
46
|
+
return { ok: false, error: `Installation ${installationId} not found (${installRes.status}): ${installRes.data?.message ?? 'unknown error'}` };
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
ok: true,
|
|
50
|
+
appName: appRes.data.name,
|
|
51
|
+
orgName: installRes.data.account?.login,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Map fleet access levels to GitHub App installation token permissions.
|
|
56
|
+
*/
|
|
57
|
+
export function mapAccessLevel(level) {
|
|
58
|
+
const levels = {
|
|
59
|
+
read: { contents: 'read', metadata: 'read' },
|
|
60
|
+
push: { contents: 'write', metadata: 'read' },
|
|
61
|
+
admin: { contents: 'write', administration: 'write', actions: 'write', metadata: 'read' },
|
|
62
|
+
issues: { issues: 'write', pull_requests: 'write', metadata: 'read' },
|
|
63
|
+
full: { contents: 'write', administration: 'write', issues: 'write', pull_requests: 'write', actions: 'write', metadata: 'read' },
|
|
64
|
+
};
|
|
65
|
+
return levels[level] ?? levels.read;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Mint a scoped, short-lived installation access token.
|
|
69
|
+
*/
|
|
70
|
+
export async function mintGitToken(appId, privateKey, installationId, repos, permissions) {
|
|
71
|
+
const jwt = createAppJWT(appId, privateKey);
|
|
72
|
+
if (repos.some(r => r !== '*' && !/^[\w.-]+\/[\w.-]+$/.test(r))) {
|
|
73
|
+
throw new Error('Invalid repo name format');
|
|
74
|
+
}
|
|
75
|
+
// repos are "owner/name" — GitHub API wants just the name part
|
|
76
|
+
const repoNames = repos.filter(r => r !== '*').map(r => r.split('/').pop());
|
|
77
|
+
const body = { permissions };
|
|
78
|
+
if (repoNames.length > 0) {
|
|
79
|
+
body.repositories = repoNames;
|
|
80
|
+
}
|
|
81
|
+
const res = await fetch(`${GITHUB_API}/app/installations/${installationId}/access_tokens`, {
|
|
82
|
+
method: 'POST',
|
|
83
|
+
headers: {
|
|
84
|
+
Authorization: `Bearer ${jwt}`,
|
|
85
|
+
Accept: 'application/vnd.github+json',
|
|
86
|
+
'Content-Type': 'application/json',
|
|
87
|
+
},
|
|
88
|
+
body: JSON.stringify(body),
|
|
89
|
+
});
|
|
90
|
+
const data = await res.json();
|
|
91
|
+
if (!res.ok) {
|
|
92
|
+
throw new Error(`Token mint failed (${res.status}): ${data?.message ?? 'unknown error'}`);
|
|
93
|
+
}
|
|
94
|
+
return { token: data.token, expiresAt: data.expires_at };
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=github-app.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-app.js","sourceRoot":"","sources":["../../src/services/github-app.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare const DEFAULT_ICON = "\u26AA";
|
|
2
|
+
/** Resolve a named icon to its emoji, or return the input if already emoji. */
|
|
3
|
+
export declare function resolveIcon(input: string): string;
|
|
4
|
+
/**
|
|
5
|
+
* Pick the first unused icon from the pool.
|
|
6
|
+
* If all are taken, append a number suffix (e.g., "🔵2").
|
|
7
|
+
*/
|
|
8
|
+
export declare function assignIcon(existingIcons: string[]): string;
|
|
9
|
+
/**
|
|
10
|
+
* Check if an icon string is valid: must be in the pool, match the overflow
|
|
11
|
+
* pattern (emoji + digits), or contain at least one character in the emoji
|
|
12
|
+
* Unicode range (codepoint >= 0x1F000). Rejects ASCII-only strings and
|
|
13
|
+
* control characters.
|
|
14
|
+
*/
|
|
15
|
+
export declare function isValidIcon(icon: string): boolean;
|
|
16
|
+
//# sourceMappingURL=icons.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../src/services/icons.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,YAAY,WAAM,CAAC;AAahC,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,MAAM,CAe1D;AAKD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAUjD"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// 8 colors × 2 shapes (circle + square) = 16 icons
|
|
2
|
+
// Circles assigned first (primary), squares second (for pairing)
|
|
3
|
+
const ICON_POOL = [
|
|
4
|
+
'🔵', '🟢', '🔴', '🟡', '🟣', '🟠', '🟤', '⚫', // circles
|
|
5
|
+
'🟦', '🟩', '🟥', '🟨', '🟪', '🟧', '🟫', '⬛', // squares
|
|
6
|
+
];
|
|
7
|
+
export const DEFAULT_ICON = '⚪';
|
|
8
|
+
// Named aliases so callers don't need to type emoji
|
|
9
|
+
// Pattern: {color}-{shape} — consistent 8 colors × 2 shapes
|
|
10
|
+
const ICON_NAMES = {
|
|
11
|
+
'blue-circle': '🔵', 'green-circle': '🟢', 'red-circle': '🔴',
|
|
12
|
+
'yellow-circle': '🟡', 'purple-circle': '🟣', 'orange-circle': '🟠',
|
|
13
|
+
'brown-circle': '🟤', 'black-circle': '⚫',
|
|
14
|
+
'blue-square': '🟦', 'green-square': '🟩', 'red-square': '🟥',
|
|
15
|
+
'yellow-square': '🟨', 'purple-square': '🟪', 'orange-square': '🟧',
|
|
16
|
+
'brown-square': '🟫', 'black-square': '⬛',
|
|
17
|
+
};
|
|
18
|
+
/** Resolve a named icon to its emoji, or return the input if already emoji. */
|
|
19
|
+
export function resolveIcon(input) {
|
|
20
|
+
return ICON_NAMES[input.toLowerCase()] ?? input;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Pick the first unused icon from the pool.
|
|
24
|
+
* If all are taken, append a number suffix (e.g., "🔵2").
|
|
25
|
+
*/
|
|
26
|
+
export function assignIcon(existingIcons) {
|
|
27
|
+
const used = new Set(existingIcons);
|
|
28
|
+
for (const icon of ICON_POOL) {
|
|
29
|
+
if (!used.has(icon))
|
|
30
|
+
return icon;
|
|
31
|
+
}
|
|
32
|
+
// All base icons taken — append a number suffix
|
|
33
|
+
// Safety cap at 99 to avoid unbounded loop
|
|
34
|
+
for (let n = 2; n <= 99; n++) {
|
|
35
|
+
for (const icon of ICON_POOL) {
|
|
36
|
+
const candidate = `${icon}${n}`;
|
|
37
|
+
if (!used.has(candidate))
|
|
38
|
+
return candidate;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Extremely unlikely: all 16 * 98 suffixed slots taken, just return last candidate
|
|
42
|
+
return `${ICON_POOL[0]}100`;
|
|
43
|
+
}
|
|
44
|
+
// Pattern for overflow icons: emoji + digits (e.g., "🔵2", "🔵100")
|
|
45
|
+
const OVERFLOW_PATTERN = /^.{1,2}\d+$/u;
|
|
46
|
+
/**
|
|
47
|
+
* Check if an icon string is valid: must be in the pool, match the overflow
|
|
48
|
+
* pattern (emoji + digits), or contain at least one character in the emoji
|
|
49
|
+
* Unicode range (codepoint >= 0x1F000). Rejects ASCII-only strings and
|
|
50
|
+
* control characters.
|
|
51
|
+
*/
|
|
52
|
+
export function isValidIcon(icon) {
|
|
53
|
+
if (!icon || icon.length > 8)
|
|
54
|
+
return false;
|
|
55
|
+
if (ICON_POOL.includes(icon))
|
|
56
|
+
return true;
|
|
57
|
+
if (OVERFLOW_PATTERN.test(icon))
|
|
58
|
+
return true;
|
|
59
|
+
// Must contain at least one emoji-range character (U+1F000+)
|
|
60
|
+
for (const ch of icon) {
|
|
61
|
+
const cp = ch.codePointAt(0);
|
|
62
|
+
if (cp >= 0x1F000)
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=icons.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icons.js","sourceRoot":"","sources":["../../src/services/icons.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,iEAAiE;AACjE,MAAM,SAAS,GAAG;IAChB,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAG,UAAU;IAC1D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAG,UAAU;CAC3D,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,CAAC;AAEhC,oDAAoD;AACpD,4DAA4D;AAC5D,MAAM,UAAU,GAA2B;IACzC,aAAa,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI;IAC7D,eAAe,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI;IACnE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG;IACzC,aAAa,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI;IAC7D,eAAe,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI;IACnE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG;CAC1C,CAAC;AAEF,+EAA+E;AAC/E,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,UAAU,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,KAAK,CAAC;AAClD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,aAAuB;IAChD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;IACpC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;IACnC,CAAC;IACD,gDAAgD;IAChD,2CAA2C;IAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;gBAAE,OAAO,SAAS,CAAC;QAC7C,CAAC;IACH,CAAC;IACD,mFAAmF;IACnF,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;AAC9B,CAAC;AAED,oEAAoE;AACpE,MAAM,gBAAgB,GAAG,cAAc,CAAC;AAExC;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,6DAA6D;IAC7D,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;QACtB,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC;QAC9B,IAAI,EAAE,IAAI,OAAO;YAAE,OAAO,IAAI,CAAC;IACjC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export declare class HostKeyMismatchError extends Error {
|
|
2
|
+
readonly host: string;
|
|
3
|
+
readonly port: number;
|
|
4
|
+
readonly oldFingerprint: string;
|
|
5
|
+
readonly newFingerprint: string;
|
|
6
|
+
constructor(host: string, port: number, oldFingerprint: string, newFingerprint: string);
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Verify a host key using Trust-On-First-Use (TOFU).
|
|
10
|
+
* - First connection: stores the fingerprint and returns true
|
|
11
|
+
* - Matching fingerprint: returns true
|
|
12
|
+
* - Mismatched fingerprint: throws HostKeyMismatchError
|
|
13
|
+
*/
|
|
14
|
+
export declare function verifyHostKey(host: string, port: number, key: Buffer): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Replace a known host fingerprint (used after user accepts a new key).
|
|
17
|
+
*/
|
|
18
|
+
export declare function replaceKnownHost(host: string, port: number, newFp: string): void;
|
|
19
|
+
/**
|
|
20
|
+
* Remove a known host entry.
|
|
21
|
+
*/
|
|
22
|
+
export declare function removeKnownHost(host: string, port: number): void;
|
|
23
|
+
//# sourceMappingURL=known-hosts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"known-hosts.d.ts","sourceRoot":"","sources":["../../src/services/known-hosts.ts"],"names":[],"mappings":"AAOA,qBAAa,oBAAqB,SAAQ,KAAK;aAE3B,IAAI,EAAE,MAAM;aACZ,IAAI,EAAE,MAAM;aACZ,cAAc,EAAE,MAAM;aACtB,cAAc,EAAE,MAAM;gBAHtB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM;CAUzC;AA+BD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAkB9E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAIhF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAIhE"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import crypto from 'node:crypto';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { enforceOwnerOnly } from '../utils/file-permissions.js';
|
|
5
|
+
import { FLEET_DIR } from '../paths.js';
|
|
6
|
+
const KNOWN_HOSTS_PATH = path.join(FLEET_DIR, 'known_hosts');
|
|
7
|
+
export class HostKeyMismatchError extends Error {
|
|
8
|
+
host;
|
|
9
|
+
port;
|
|
10
|
+
oldFingerprint;
|
|
11
|
+
newFingerprint;
|
|
12
|
+
constructor(host, port, oldFingerprint, newFingerprint) {
|
|
13
|
+
super(`SSH HOST KEY MISMATCH for ${host}:${port}! ` +
|
|
14
|
+
`Expected ${oldFingerprint}, got ${newFingerprint}. ` +
|
|
15
|
+
`This could indicate a server reinstall or a man-in-the-middle attack. ` +
|
|
16
|
+
`Delete the entry from ~/.apra-fleet/data/known_hosts to accept the new key.`);
|
|
17
|
+
this.host = host;
|
|
18
|
+
this.port = port;
|
|
19
|
+
this.oldFingerprint = oldFingerprint;
|
|
20
|
+
this.newFingerprint = newFingerprint;
|
|
21
|
+
this.name = 'HostKeyMismatchError';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function hostKey(host, port) {
|
|
25
|
+
return `${host}:${port}`;
|
|
26
|
+
}
|
|
27
|
+
function fingerprint(key) {
|
|
28
|
+
return 'sha256:' + crypto.createHash('sha256').update(key).digest('base64');
|
|
29
|
+
}
|
|
30
|
+
function loadKnownHosts() {
|
|
31
|
+
try {
|
|
32
|
+
if (fs.existsSync(KNOWN_HOSTS_PATH)) {
|
|
33
|
+
return JSON.parse(fs.readFileSync(KNOWN_HOSTS_PATH, 'utf-8'));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// Corrupted file — start fresh
|
|
38
|
+
}
|
|
39
|
+
return {};
|
|
40
|
+
}
|
|
41
|
+
function saveKnownHosts(store) {
|
|
42
|
+
if (!fs.existsSync(FLEET_DIR)) {
|
|
43
|
+
fs.mkdirSync(FLEET_DIR, { recursive: true, mode: 0o700 });
|
|
44
|
+
}
|
|
45
|
+
fs.writeFileSync(KNOWN_HOSTS_PATH, JSON.stringify(store, null, 2), { mode: 0o600 });
|
|
46
|
+
enforceOwnerOnly(KNOWN_HOSTS_PATH);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Verify a host key using Trust-On-First-Use (TOFU).
|
|
50
|
+
* - First connection: stores the fingerprint and returns true
|
|
51
|
+
* - Matching fingerprint: returns true
|
|
52
|
+
* - Mismatched fingerprint: throws HostKeyMismatchError
|
|
53
|
+
*/
|
|
54
|
+
export function verifyHostKey(host, port, key) {
|
|
55
|
+
const store = loadKnownHosts();
|
|
56
|
+
const hk = hostKey(host, port);
|
|
57
|
+
const fp = fingerprint(key);
|
|
58
|
+
const stored = store[hk];
|
|
59
|
+
if (!stored) {
|
|
60
|
+
// TOFU: first connection — trust and save
|
|
61
|
+
store[hk] = fp;
|
|
62
|
+
saveKnownHosts(store);
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
if (stored === fp) {
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
throw new HostKeyMismatchError(host, port, stored, fp);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Replace a known host fingerprint (used after user accepts a new key).
|
|
72
|
+
*/
|
|
73
|
+
export function replaceKnownHost(host, port, newFp) {
|
|
74
|
+
const store = loadKnownHosts();
|
|
75
|
+
store[hostKey(host, port)] = newFp;
|
|
76
|
+
saveKnownHosts(store);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Remove a known host entry.
|
|
80
|
+
*/
|
|
81
|
+
export function removeKnownHost(host, port) {
|
|
82
|
+
const store = loadKnownHosts();
|
|
83
|
+
delete store[hostKey(host, port)];
|
|
84
|
+
saveKnownHosts(store);
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=known-hosts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"known-hosts.js","sourceRoot":"","sources":["../../src/services/known-hosts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { OnboardingState } from '../types.js';
|
|
2
|
+
export declare let welcomeBackShownThisSession: boolean;
|
|
3
|
+
/**
|
|
4
|
+
* Load onboarding state from disk into the in-memory singleton.
|
|
5
|
+
* Call once at server startup. Missing file = fresh install (all false).
|
|
6
|
+
* If the registry already has members but no onboarding file, this is an
|
|
7
|
+
* upgrade: pre-set bannerShown=true so existing users don't see the banner.
|
|
8
|
+
*/
|
|
9
|
+
export declare function loadOnboardingState(existingMemberCount?: number): OnboardingState;
|
|
10
|
+
/**
|
|
11
|
+
* Persist the current in-memory state to disk atomically (temp write + rename).
|
|
12
|
+
*/
|
|
13
|
+
export declare function saveOnboardingState(): void;
|
|
14
|
+
/**
|
|
15
|
+
* Get the current in-memory state. Loads from disk if not yet loaded (fallback for tests).
|
|
16
|
+
*/
|
|
17
|
+
export declare function getOnboardingState(): OnboardingState;
|
|
18
|
+
/**
|
|
19
|
+
* Returns true if the milestone has NOT yet been shown (i.e., it should be shown now).
|
|
20
|
+
*/
|
|
21
|
+
export declare function shouldShow(key: keyof OnboardingState): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Mark a milestone as reached. Updates in-memory state and persists to disk immediately.
|
|
24
|
+
*/
|
|
25
|
+
export declare function advanceMilestone(key: keyof OnboardingState): void;
|
|
26
|
+
/**
|
|
27
|
+
* Reset session-level runtime flags. Call at server startup after loadOnboardingState().
|
|
28
|
+
*/
|
|
29
|
+
export declare function resetSessionFlags(): void;
|
|
30
|
+
/**
|
|
31
|
+
* Mark welcome-back as shown for this server session.
|
|
32
|
+
*/
|
|
33
|
+
export declare function markWelcomeBackShown(): void;
|
|
34
|
+
/**
|
|
35
|
+
* Returns true if this tool should be able to consume onboarding preambles.
|
|
36
|
+
* Passive tools (version, shutdown_server) should never consume the banner.
|
|
37
|
+
*/
|
|
38
|
+
export declare function isActiveTool(toolName: string): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Returns true if the tool response is JSON-formatted (starts with `{` or `[`).
|
|
41
|
+
* Used by wrapTool to skip prepending onboarding text to structured data responses.
|
|
42
|
+
* Covers: fleet_status, list_members, member_detail, monitor_task.
|
|
43
|
+
*/
|
|
44
|
+
export declare function isJsonResponse(result: string): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Returns the first-run banner + getting started guide if this is the first tool
|
|
47
|
+
* call after a fresh install. Marks bannerShown and persists immediately so a
|
|
48
|
+
* server crash won't re-show the banner.
|
|
49
|
+
* Returns null if the banner has already been shown.
|
|
50
|
+
*/
|
|
51
|
+
export declare function getFirstRunPreamble(): string | null;
|
|
52
|
+
/**
|
|
53
|
+
* Post-tool contextual nudge. Called by wrapTool after every tool invocation.
|
|
54
|
+
* Uses input.member_type directly — no response string parsing for type.
|
|
55
|
+
* Each nudge fires at most once (milestone flag prevents repeat).
|
|
56
|
+
*/
|
|
57
|
+
export declare function getOnboardingNudge(toolName: string, input: any, result: string): string | null;
|
|
58
|
+
/**
|
|
59
|
+
* Welcome-back preamble for non-first-run server starts.
|
|
60
|
+
* Shown once per server lifecycle (session flag prevents repeat).
|
|
61
|
+
* Returns null if this is the first run (banner not yet shown) or already shown this session.
|
|
62
|
+
*/
|
|
63
|
+
export declare function getWelcomeBackPreamble(): string | null;
|
|
64
|
+
/**
|
|
65
|
+
* Reset module state — used in tests only.
|
|
66
|
+
*/
|
|
67
|
+
export declare function _resetForTest(): void;
|
|
68
|
+
//# sourceMappingURL=onboarding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding.d.ts","sourceRoot":"","sources":["../../src/services/onboarding.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AA2BnD,eAAO,IAAI,2BAA2B,SAAQ,CAAC;AAQ/C;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,mBAAmB,SAAI,GAAG,eAAe,CAyB5E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAQ1C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,eAAe,CAGpD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,eAAe,GAAG,OAAO,CAE9D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,eAAe,GAAG,IAAI,CAKjE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAKnD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAqB9F;AAkBD;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,IAAI,CAQtD;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAGpC"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { FLEET_DIR } from '../paths.js';
|
|
4
|
+
import { enforceOwnerOnly } from '../utils/file-permissions.js';
|
|
5
|
+
import { BANNER, GETTING_STARTED_GUIDE, WELCOME_BACK, NUDGE_AFTER_FIRST_REGISTER, NUDGE_AFTER_FIRST_PROMPT, NUDGE_AFTER_MULTI_MEMBER } from '../onboarding/text.js';
|
|
6
|
+
import { getAllAgents } from './registry.js';
|
|
7
|
+
const ONBOARDING_PATH = path.join(FLEET_DIR, 'onboarding.json');
|
|
8
|
+
/**
|
|
9
|
+
* Tools that should NOT consume the onboarding banner or welcome-back preamble.
|
|
10
|
+
* These are diagnostic/administrative tools that may be called automatically
|
|
11
|
+
* by the client before the user's first meaningful interaction.
|
|
12
|
+
*/
|
|
13
|
+
const PASSIVE_TOOLS = new Set(['version', 'shutdown_server']);
|
|
14
|
+
const DEFAULT_STATE = {
|
|
15
|
+
bannerShown: false,
|
|
16
|
+
firstMemberRegistered: false,
|
|
17
|
+
firstPromptExecuted: false,
|
|
18
|
+
multiMemberNudgeShown: false,
|
|
19
|
+
};
|
|
20
|
+
// In-memory singleton — loaded once at server start.
|
|
21
|
+
// All reads use this copy; JS event loop serializes access (no concurrent-read races).
|
|
22
|
+
let _state = null;
|
|
23
|
+
// Runtime-only flag — not persisted to disk.
|
|
24
|
+
export let welcomeBackShownThisSession = false;
|
|
25
|
+
function ensureFleetDir() {
|
|
26
|
+
if (!fs.existsSync(FLEET_DIR)) {
|
|
27
|
+
fs.mkdirSync(FLEET_DIR, { recursive: true, mode: 0o700 });
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Load onboarding state from disk into the in-memory singleton.
|
|
32
|
+
* Call once at server startup. Missing file = fresh install (all false).
|
|
33
|
+
* If the registry already has members but no onboarding file, this is an
|
|
34
|
+
* upgrade: pre-set bannerShown=true so existing users don't see the banner.
|
|
35
|
+
*/
|
|
36
|
+
export function loadOnboardingState(existingMemberCount = 0) {
|
|
37
|
+
ensureFleetDir();
|
|
38
|
+
if (!fs.existsSync(ONBOARDING_PATH)) {
|
|
39
|
+
const state = { ...DEFAULT_STATE };
|
|
40
|
+
if (existingMemberCount > 0) {
|
|
41
|
+
// Upgrade path: existing registry, no onboarding file → skip banner
|
|
42
|
+
state.bannerShown = true;
|
|
43
|
+
}
|
|
44
|
+
_state = state;
|
|
45
|
+
return _state;
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
const raw = fs.readFileSync(ONBOARDING_PATH, 'utf-8');
|
|
49
|
+
const parsed = JSON.parse(raw);
|
|
50
|
+
// Merge with defaults so new fields added in future upgrades get falsy defaults
|
|
51
|
+
_state = { ...DEFAULT_STATE, ...parsed };
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// Corrupted file → treat as fresh install, log warning
|
|
55
|
+
process.stderr.write('[apra-fleet] Warning: onboarding.json is corrupted; resetting to defaults.\n');
|
|
56
|
+
_state = { ...DEFAULT_STATE };
|
|
57
|
+
}
|
|
58
|
+
return _state;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Persist the current in-memory state to disk atomically (temp write + rename).
|
|
62
|
+
*/
|
|
63
|
+
export function saveOnboardingState() {
|
|
64
|
+
if (_state === null)
|
|
65
|
+
return;
|
|
66
|
+
ensureFleetDir();
|
|
67
|
+
const tmp = ONBOARDING_PATH + '.tmp';
|
|
68
|
+
fs.writeFileSync(tmp, JSON.stringify(_state, null, 2), { mode: 0o600 });
|
|
69
|
+
fs.renameSync(tmp, ONBOARDING_PATH);
|
|
70
|
+
enforceOwnerOnly(ONBOARDING_PATH);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Get the current in-memory state. Loads from disk if not yet loaded (fallback for tests).
|
|
74
|
+
*/
|
|
75
|
+
export function getOnboardingState() {
|
|
76
|
+
if (_state === null)
|
|
77
|
+
loadOnboardingState();
|
|
78
|
+
return _state;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Returns true if the milestone has NOT yet been shown (i.e., it should be shown now).
|
|
82
|
+
*/
|
|
83
|
+
export function shouldShow(key) {
|
|
84
|
+
return !getOnboardingState()[key];
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Mark a milestone as reached. Updates in-memory state and persists to disk immediately.
|
|
88
|
+
*/
|
|
89
|
+
export function advanceMilestone(key) {
|
|
90
|
+
const state = getOnboardingState();
|
|
91
|
+
if (state[key])
|
|
92
|
+
return; // Already advanced — no-op
|
|
93
|
+
state[key] = true;
|
|
94
|
+
saveOnboardingState();
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Reset session-level runtime flags. Call at server startup after loadOnboardingState().
|
|
98
|
+
*/
|
|
99
|
+
export function resetSessionFlags() {
|
|
100
|
+
welcomeBackShownThisSession = false;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Mark welcome-back as shown for this server session.
|
|
104
|
+
*/
|
|
105
|
+
export function markWelcomeBackShown() {
|
|
106
|
+
welcomeBackShownThisSession = true;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Returns true if this tool should be able to consume onboarding preambles.
|
|
110
|
+
* Passive tools (version, shutdown_server) should never consume the banner.
|
|
111
|
+
*/
|
|
112
|
+
export function isActiveTool(toolName) {
|
|
113
|
+
return !PASSIVE_TOOLS.has(toolName);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Returns true if the tool response is JSON-formatted (starts with `{` or `[`).
|
|
117
|
+
* Used by wrapTool to skip prepending onboarding text to structured data responses.
|
|
118
|
+
* Covers: fleet_status, list_members, member_detail, monitor_task.
|
|
119
|
+
*/
|
|
120
|
+
export function isJsonResponse(result) {
|
|
121
|
+
return result.startsWith('{') || result.startsWith('[');
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Returns the first-run banner + getting started guide if this is the first tool
|
|
125
|
+
* call after a fresh install. Marks bannerShown and persists immediately so a
|
|
126
|
+
* server crash won't re-show the banner.
|
|
127
|
+
* Returns null if the banner has already been shown.
|
|
128
|
+
*/
|
|
129
|
+
export function getFirstRunPreamble() {
|
|
130
|
+
const state = getOnboardingState();
|
|
131
|
+
if (state.bannerShown)
|
|
132
|
+
return null;
|
|
133
|
+
advanceMilestone('bannerShown');
|
|
134
|
+
return BANNER + '\n' + GETTING_STARTED_GUIDE;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Post-tool contextual nudge. Called by wrapTool after every tool invocation.
|
|
138
|
+
* Uses input.member_type directly — no response string parsing for type.
|
|
139
|
+
* Each nudge fires at most once (milestone flag prevents repeat).
|
|
140
|
+
*/
|
|
141
|
+
export function getOnboardingNudge(toolName, input, result) {
|
|
142
|
+
if (toolName === 'register_member' && result.startsWith('✅')) {
|
|
143
|
+
if (shouldShow('firstMemberRegistered')) {
|
|
144
|
+
advanceMilestone('firstMemberRegistered');
|
|
145
|
+
return NUDGE_AFTER_FIRST_REGISTER(input.member_type, input.friendly_name);
|
|
146
|
+
}
|
|
147
|
+
if (shouldShow('multiMemberNudgeShown')) {
|
|
148
|
+
const agents = getAllAgents();
|
|
149
|
+
if (agents.length >= 2) {
|
|
150
|
+
advanceMilestone('multiMemberNudgeShown');
|
|
151
|
+
return NUDGE_AFTER_MULTI_MEMBER();
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (toolName === 'execute_prompt' && result.startsWith('📋')) {
|
|
156
|
+
if (shouldShow('firstPromptExecuted')) {
|
|
157
|
+
advanceMilestone('firstPromptExecuted');
|
|
158
|
+
return NUDGE_AFTER_FIRST_PROMPT();
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
function formatLastActive(agents) {
|
|
164
|
+
const times = agents
|
|
165
|
+
.map(a => a.lastUsed)
|
|
166
|
+
.filter((t) => Boolean(t))
|
|
167
|
+
.map(t => new Date(t).getTime())
|
|
168
|
+
.filter(t => !isNaN(t)); // guard against malformed date strings
|
|
169
|
+
if (times.length === 0)
|
|
170
|
+
return 'unknown';
|
|
171
|
+
const diff = Date.now() - Math.max(...times);
|
|
172
|
+
const minutes = Math.floor(diff / 60000);
|
|
173
|
+
if (minutes < 1)
|
|
174
|
+
return 'just now';
|
|
175
|
+
if (minutes < 60)
|
|
176
|
+
return `${minutes}m ago`;
|
|
177
|
+
const hours = Math.floor(minutes / 60);
|
|
178
|
+
if (hours < 24)
|
|
179
|
+
return `${hours}h ago`;
|
|
180
|
+
return `${Math.floor(hours / 24)}d ago`;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Welcome-back preamble for non-first-run server starts.
|
|
184
|
+
* Shown once per server lifecycle (session flag prevents repeat).
|
|
185
|
+
* Returns null if this is the first run (banner not yet shown) or already shown this session.
|
|
186
|
+
*/
|
|
187
|
+
export function getWelcomeBackPreamble() {
|
|
188
|
+
const state = getOnboardingState();
|
|
189
|
+
if (!state.bannerShown)
|
|
190
|
+
return null; // first run — banner will handle it
|
|
191
|
+
if (welcomeBackShownThisSession)
|
|
192
|
+
return null;
|
|
193
|
+
markWelcomeBackShown();
|
|
194
|
+
const agents = getAllAgents();
|
|
195
|
+
const lastActive = formatLastActive(agents);
|
|
196
|
+
return WELCOME_BACK(agents.length, lastActive);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Reset module state — used in tests only.
|
|
200
|
+
*/
|
|
201
|
+
export function _resetForTest() {
|
|
202
|
+
_state = null;
|
|
203
|
+
welcomeBackShownThisSession = false;
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=onboarding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../../src/services/onboarding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Agent } from '../types.js';
|
|
2
|
+
export declare function getAllAgents(): Agent[];
|
|
3
|
+
export declare function getAgent(id: string): Agent | undefined;
|
|
4
|
+
export declare function findAgentByName(name: string): Agent | undefined;
|
|
5
|
+
export declare function addAgent(agent: Agent): void;
|
|
6
|
+
export declare function updateAgent(id: string, updates: Partial<Agent>): Agent | undefined;
|
|
7
|
+
export declare function removeAgent(id: string): boolean;
|
|
8
|
+
export declare function getKeysDir(): string;
|
|
9
|
+
/**
|
|
10
|
+
* Check if another agent already uses the same folder on the same device.
|
|
11
|
+
* - Local agents: match any existing local agent with the same normalized folder.
|
|
12
|
+
* - Remote agents: match any existing remote agent with the same host + port + normalized folder.
|
|
13
|
+
* Returns true if a duplicate exists.
|
|
14
|
+
*/
|
|
15
|
+
export declare function hasDuplicateFolder(agentType: 'local' | 'remote', folder: string, host?: string, port?: number, excludeId?: string): boolean;
|
|
16
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/services/registry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAiB,MAAM,aAAa,CAAC;AAuFxD,wBAAgB,YAAY,IAAI,KAAK,EAAE,CAEtC;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAEtD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAI/D;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAI3C;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,SAAS,CAOlF;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAO/C;AAED,wBAAgB,UAAU,IAAI,MAAM,CAGnC;AAiBD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,OAAO,GAAG,QAAQ,EAC7B,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAmBT"}
|