@nio-cli/cli 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +374 -139
- package/dist/adapters/docker/docker-gateway.js +100 -0
- package/dist/adapters/docker/docker-gateway.js.map +1 -0
- package/dist/adapters/ide/ide-gateway.js +50 -0
- package/dist/adapters/ide/ide-gateway.js.map +1 -0
- package/dist/adapters/lang/knowledge-store.js +97 -0
- package/dist/adapters/lang/knowledge-store.js.map +1 -0
- package/dist/adapters/lang/language-catalog.js +86 -0
- package/dist/adapters/lang/language-catalog.js.map +1 -0
- package/dist/adapters/lang/package-map.js +98 -0
- package/dist/adapters/lang/package-map.js.map +1 -0
- package/dist/adapters/lang/project-detector.js +40 -0
- package/dist/adapters/lang/project-detector.js.map +1 -0
- package/dist/adapters/lang/repos.js +8 -0
- package/dist/adapters/lang/repos.js.map +1 -0
- package/dist/adapters/lang/scaffold-gateway.js +135 -0
- package/dist/adapters/lang/scaffold-gateway.js.map +1 -0
- package/dist/adapters/lang/vendor.js +52 -0
- package/dist/adapters/lang/vendor.js.map +1 -0
- package/dist/adapters/pg/auth-session-repository.js +41 -0
- package/dist/adapters/pg/auth-session-repository.js.map +1 -0
- package/dist/adapters/pg/client.js +74 -0
- package/dist/adapters/pg/client.js.map +1 -0
- package/dist/adapters/pg/dependency-event-repository.js +40 -0
- package/dist/adapters/pg/dependency-event-repository.js.map +1 -0
- package/dist/adapters/pg/login-challenge-repository.js +54 -0
- package/dist/adapters/pg/login-challenge-repository.js.map +1 -0
- package/dist/adapters/pg/session-repository.js +70 -0
- package/dist/adapters/pg/session-repository.js.map +1 -0
- package/dist/adapters/pg/user-repository.js +71 -0
- package/dist/adapters/pg/user-repository.js.map +1 -0
- package/dist/adapters/pkg/toolchain-gateway.js +35 -0
- package/dist/adapters/pkg/toolchain-gateway.js.map +1 -0
- package/dist/adapters/skills/recipe-catalog.js +84 -0
- package/dist/adapters/skills/recipe-catalog.js.map +1 -0
- package/dist/adapters/sms/http-generic.js +50 -0
- package/dist/adapters/sms/http-generic.js.map +1 -0
- package/dist/app/ai-client.js +44 -0
- package/dist/app/ai-client.js.map +1 -0
- package/dist/app/dependency-watcher.js +87 -0
- package/dist/app/dependency-watcher.js.map +1 -0
- package/dist/app/docker-manager.js +113 -0
- package/dist/app/docker-manager.js.map +1 -0
- package/dist/app/environment-builder.js +73 -0
- package/dist/app/environment-builder.js.map +1 -0
- package/dist/app/language-configurator.js +30 -0
- package/dist/app/language-configurator.js.map +1 -0
- package/dist/app/session-manager.js +124 -0
- package/dist/app/session-manager.js.map +1 -0
- package/dist/brand.js +3 -61
- package/dist/brand.js.map +1 -1
- package/dist/cli/commands/agents.js +30 -0
- package/dist/cli/commands/agents.js.map +1 -0
- package/dist/cli/commands/ai.js +61 -0
- package/dist/cli/commands/ai.js.map +1 -0
- package/dist/cli/commands/auth.js +149 -96
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/clean.js +1 -13
- package/dist/cli/commands/clean.js.map +1 -1
- package/dist/cli/commands/command.js +58 -0
- package/dist/cli/commands/command.js.map +1 -0
- package/dist/cli/commands/completion.js +0 -3
- package/dist/cli/commands/completion.js.map +1 -1
- package/dist/cli/commands/config.js +43 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/debug.js +102 -0
- package/dist/cli/commands/debug.js.map +1 -0
- package/dist/cli/commands/deps.js +94 -0
- package/dist/cli/commands/deps.js.map +1 -0
- package/dist/cli/commands/docker.js +385 -0
- package/dist/cli/commands/docker.js.map +1 -0
- package/dist/cli/commands/docs/content.js +219 -0
- package/dist/cli/commands/docs/content.js.map +1 -0
- package/dist/cli/commands/docs/dynamic.js +42 -0
- package/dist/cli/commands/docs/dynamic.js.map +1 -0
- package/dist/cli/commands/docs/html.js +108 -0
- package/dist/cli/commands/docs/html.js.map +1 -0
- package/dist/cli/commands/docs/terminal.js +42 -0
- package/dist/cli/commands/docs/terminal.js.map +1 -0
- package/dist/cli/commands/docs.js +34 -0
- package/dist/cli/commands/docs.js.map +1 -0
- package/dist/cli/commands/exec.js +2 -7
- package/dist/cli/commands/exec.js.map +1 -1
- package/dist/cli/commands/init/auth-step.js +10 -45
- package/dist/cli/commands/init/auth-step.js.map +1 -1
- package/dist/cli/commands/init/clients-step.js +12 -39
- package/dist/cli/commands/init/clients-step.js.map +1 -1
- package/dist/cli/commands/init/context-step.js +7 -33
- package/dist/cli/commands/init/context-step.js.map +1 -1
- package/dist/cli/commands/init/handoff.js +20 -0
- package/dist/cli/commands/init/handoff.js.map +1 -0
- package/dist/cli/commands/init/index.js +164 -34
- package/dist/cli/commands/init/index.js.map +1 -1
- package/dist/cli/commands/init/lang-step.js +40 -0
- package/dist/cli/commands/init/lang-step.js.map +1 -0
- package/dist/cli/commands/init/profile-step.js +43 -0
- package/dist/cli/commands/init/profile-step.js.map +1 -0
- package/dist/cli/commands/init/provision-step.js +8 -23
- package/dist/cli/commands/init/provision-step.js.map +1 -1
- package/dist/cli/commands/init/recipe-step.js +18 -0
- package/dist/cli/commands/init/recipe-step.js.map +1 -0
- package/dist/cli/commands/lang.js +27 -0
- package/dist/cli/commands/lang.js.map +1 -0
- package/dist/cli/commands/open.js +59 -0
- package/dist/cli/commands/open.js.map +1 -0
- package/dist/cli/commands/plan.js +2 -6
- package/dist/cli/commands/plan.js.map +1 -1
- package/dist/cli/commands/security.js +143 -0
- package/dist/cli/commands/security.js.map +1 -0
- package/dist/cli/commands/sessions.js +92 -0
- package/dist/cli/commands/sessions.js.map +1 -0
- package/dist/cli/commands/skills.js +1 -1
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/commands/start.js +8 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/sync.js +52 -58
- package/dist/cli/commands/sync.js.map +1 -1
- package/dist/cli/commands/validate-plan.js +2 -6
- package/dist/cli/commands/validate-plan.js.map +1 -1
- package/dist/cli/copy/auth.json +9 -2
- package/dist/cli/copy/init.json +2 -6
- package/dist/cli/copy.js +0 -8
- package/dist/cli/copy.js.map +1 -1
- package/dist/cli/flows/clients.js +3 -94
- package/dist/cli/flows/clients.js.map +1 -1
- package/dist/cli/flows/completion.js +1 -6
- package/dist/cli/flows/completion.js.map +1 -1
- package/dist/cli/flows/dependencies.js +1 -18
- package/dist/cli/flows/dependencies.js.map +1 -1
- package/dist/cli/flows/onboarding.js +116 -0
- package/dist/cli/flows/onboarding.js.map +1 -0
- package/dist/cli/flows/sections.js +2 -10
- package/dist/cli/flows/sections.js.map +1 -1
- package/dist/cli/flows/user-config.js +5 -10
- package/dist/cli/flows/user-config.js.map +1 -1
- package/dist/cli/program.js +58 -0
- package/dist/cli/program.js.map +1 -0
- package/dist/cli/ui/render.js +2 -53
- package/dist/cli/ui/render.js.map +1 -1
- package/dist/cli/ui/report.js +0 -13
- package/dist/cli/ui/report.js.map +1 -1
- package/dist/cli.js +27 -31
- package/dist/cli.js.map +1 -1
- package/dist/config.js +27 -56
- package/dist/config.js.map +1 -1
- package/dist/core/docker.js +2 -0
- package/dist/core/docker.js.map +1 -0
- package/dist/core/environment.js +2 -0
- package/dist/core/environment.js.map +1 -0
- package/dist/core/lang.js +11 -0
- package/dist/core/lang.js.map +1 -0
- package/dist/core/messaging.js +2 -0
- package/dist/core/messaging.js.map +1 -0
- package/dist/core/repositories.js +2 -0
- package/dist/core/repositories.js.map +1 -0
- package/dist/core/types.js +0 -5
- package/dist/core/types.js.map +1 -1
- package/dist/gateway/config.js +13 -0
- package/dist/gateway/config.js.map +1 -0
- package/dist/gateway/edge-filter.js +55 -0
- package/dist/gateway/edge-filter.js.map +1 -0
- package/dist/gateway/index.js +176 -0
- package/dist/gateway/index.js.map +1 -0
- package/dist/gateway/middleware/auth.js +34 -0
- package/dist/gateway/middleware/auth.js.map +1 -0
- package/dist/gateway/services/login.js +112 -0
- package/dist/gateway/services/login.js.map +1 -0
- package/dist/gateway/services/security.js +99 -0
- package/dist/gateway/services/security.js.map +1 -0
- package/dist/lib/auth/backup-codes.js +46 -0
- package/dist/lib/auth/backup-codes.js.map +1 -0
- package/dist/lib/auth/gateway-client.js +86 -0
- package/dist/lib/auth/gateway-client.js.map +1 -0
- package/dist/lib/auth/gateway-process.js +54 -0
- package/dist/lib/auth/gateway-process.js.map +1 -0
- package/dist/lib/auth/gateway-token.js +26 -0
- package/dist/lib/auth/gateway-token.js.map +1 -0
- package/dist/lib/auth/nio-config.js +147 -0
- package/dist/lib/auth/nio-config.js.map +1 -0
- package/dist/lib/auth/otp.js +23 -0
- package/dist/lib/auth/otp.js.map +1 -0
- package/dist/lib/auth/password.js +23 -0
- package/dist/lib/auth/password.js.map +1 -0
- package/dist/lib/auth/session-store.js +49 -0
- package/dist/lib/auth/session-store.js.map +1 -0
- package/dist/lib/clients/autopull.js +8 -0
- package/dist/lib/clients/autopull.js.map +1 -0
- package/dist/lib/{client-configs.js → clients/client-configs.js} +113 -34
- package/dist/lib/clients/client-configs.js.map +1 -0
- package/dist/lib/clients/client-install.js +20 -0
- package/dist/lib/clients/client-install.js.map +1 -0
- package/dist/lib/{harness.js → clients/harness.js} +1 -16
- package/dist/lib/clients/harness.js.map +1 -0
- package/dist/lib/{hooks.js → clients/hooks.js} +5 -31
- package/dist/lib/clients/hooks.js.map +1 -0
- package/dist/lib/{targets.js → clients/targets.js} +17 -53
- package/dist/lib/clients/targets.js.map +1 -0
- package/dist/lib/colors.js +0 -24
- package/dist/lib/colors.js.map +1 -1
- package/dist/lib/cowork-extension.js +2 -25
- package/dist/lib/cowork-extension.js.map +1 -1
- package/dist/lib/debug.js +6 -0
- package/dist/lib/debug.js.map +1 -0
- package/dist/lib/{dependencies.js → deps/dependencies.js} +1 -26
- package/dist/lib/deps/dependencies.js.map +1 -0
- package/dist/lib/deps/dependency-install-project.js +27 -0
- package/dist/lib/deps/dependency-install-project.js.map +1 -0
- package/dist/lib/{dependency-install.js → deps/dependency-install.js} +10 -35
- package/dist/lib/deps/dependency-install.js.map +1 -0
- package/dist/lib/deps/dependency-installed.js +64 -0
- package/dist/lib/deps/dependency-installed.js.map +1 -0
- package/dist/lib/deps/dependency-scan.js +100 -0
- package/dist/lib/deps/dependency-scan.js.map +1 -0
- package/dist/lib/docker.js +50 -0
- package/dist/lib/docker.js.map +1 -0
- package/dist/lib/dotfiles.js +57 -0
- package/dist/lib/dotfiles.js.map +1 -0
- package/dist/lib/{exec-delegate.js → exec/exec-delegate.js} +4 -13
- package/dist/lib/exec/exec-delegate.js.map +1 -0
- package/dist/lib/{exec-engines.js → exec/exec-engines.js} +1 -10
- package/dist/lib/exec/exec-engines.js.map +1 -0
- package/dist/lib/{plan-delegate.js → exec/plan-delegate.js} +1 -7
- package/dist/lib/exec/plan-delegate.js.map +1 -0
- package/dist/lib/{validate-plan-delegate.js → exec/validate-plan-delegate.js} +2 -7
- package/dist/lib/exec/validate-plan-delegate.js.map +1 -0
- package/dist/lib/headroom.js +44 -0
- package/dist/lib/headroom.js.map +1 -0
- package/dist/lib/ide-tasks.js +54 -0
- package/dist/lib/ide-tasks.js.map +1 -0
- package/dist/lib/load-env.js +44 -0
- package/dist/lib/load-env.js.map +1 -0
- package/dist/lib/open-url.js +9 -0
- package/dist/lib/open-url.js.map +1 -0
- package/dist/lib/prompts.js +0 -13
- package/dist/lib/prompts.js.map +1 -1
- package/dist/lib/{provision-apply.js → provision/provision-apply.js} +4 -30
- package/dist/lib/provision/provision-apply.js.map +1 -0
- package/dist/lib/{provision-collect.js → provision/provision-collect.js} +0 -9
- package/dist/lib/provision/provision-collect.js.map +1 -0
- package/dist/lib/{provision.js → provision/provision.js} +4 -17
- package/dist/lib/provision/provision.js.map +1 -0
- package/dist/lib/{patterns.js → skills/patterns.js} +0 -13
- package/dist/lib/skills/patterns.js.map +1 -0
- package/dist/lib/{rules.js → skills/rules.js} +0 -22
- package/dist/lib/skills/rules.js.map +1 -0
- package/dist/lib/skills/sections.js +58 -0
- package/dist/lib/skills/sections.js.map +1 -0
- package/dist/lib/{skill-serve.js → skills/skill-serve.js} +1 -26
- package/dist/lib/skills/skill-serve.js.map +1 -0
- package/dist/lib/{skills-cache.js → skills/skills-cache.js} +15 -21
- package/dist/lib/skills/skills-cache.js.map +1 -0
- package/dist/lib/{skills.js → skills/skills.js} +3 -49
- package/dist/lib/skills/skills.js.map +1 -0
- package/dist/lib/spinner.js.map +1 -0
- package/dist/lib/telemetry.js +3 -20
- package/dist/lib/telemetry.js.map +1 -1
- package/dist/lib/version-check.js +0 -20
- package/dist/lib/version-check.js.map +1 -1
- package/dist/matrix-logo.js +43 -21
- package/dist/matrix-logo.js.map +1 -1
- package/dist/mcp-server-lang.js +39 -0
- package/dist/mcp-server-lang.js.map +1 -0
- package/dist/mcp-server.js +37 -41
- package/dist/mcp-server.js.map +1 -1
- package/dist/profiles/analyst.js +10 -0
- package/dist/profiles/analyst.js.map +1 -0
- package/dist/profiles/bi.js +9 -0
- package/dist/profiles/bi.js.map +1 -0
- package/dist/profiles/dba.js +21 -0
- package/dist/profiles/dba.js.map +1 -0
- package/dist/profiles/fullstack.js +9 -0
- package/dist/profiles/fullstack.js.map +1 -0
- package/dist/profiles/index.js +39 -0
- package/dist/profiles/index.js.map +1 -0
- package/dist/profiles/mcps.js +23 -0
- package/dist/profiles/mcps.js.map +1 -0
- package/dist/profiles/qa.js +10 -0
- package/dist/profiles/qa.js.map +1 -0
- package/dist/profiles/scientist.js +9 -0
- package/dist/profiles/scientist.js.map +1 -0
- package/dist/profiles/toolchains.js +9 -0
- package/dist/profiles/toolchains.js.map +1 -0
- package/dist/tools/delegate-exec.js +2 -2
- package/dist/tools/delegate-exec.js.map +1 -1
- package/dist/tools/env-detect-deps.js +54 -0
- package/dist/tools/env-detect-deps.js.map +1 -0
- package/dist/tools/env-materialize.js +43 -0
- package/dist/tools/env-materialize.js.map +1 -0
- package/dist/tools/exec-status.js +1 -1
- package/dist/tools/exec-status.js.map +1 -1
- package/dist/tools/index.js +12 -32
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/lang-recipe.js +31 -0
- package/dist/tools/lang-recipe.js.map +1 -0
- package/dist/tools/lang-reference.js +34 -0
- package/dist/tools/lang-reference.js.map +1 -0
- package/dist/tools/plan.js +2 -2
- package/dist/tools/plan.js.map +1 -1
- package/dist/tools/profile-get.js +57 -0
- package/dist/tools/profile-get.js.map +1 -0
- package/dist/tools/session-activate.js +35 -0
- package/dist/tools/session-activate.js.map +1 -0
- package/dist/tools/session-create.js +83 -0
- package/dist/tools/session-create.js.map +1 -0
- package/dist/tools/session-list.js +29 -0
- package/dist/tools/session-list.js.map +1 -0
- package/dist/tools/session-shared.js +25 -0
- package/dist/tools/session-shared.js.map +1 -0
- package/dist/tools/validate-plan.js +2 -2
- package/dist/tools/validate-plan.js.map +1 -1
- package/dist/tui/app.js +116 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/tui/components.js +0 -0
- package/dist/tui/components.js.map +1 -0
- package/dist/tui/debug.js +17 -0
- package/dist/tui/debug.js.map +1 -0
- package/dist/tui/index.js +2 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/launch.js +64 -0
- package/dist/tui/launch.js.map +1 -0
- package/dist/tui/markdown.js +40 -0
- package/dist/tui/markdown.js.map +1 -0
- package/dist/tui/opencode.js +28 -0
- package/dist/tui/opencode.js.map +1 -0
- package/dist/tui/palette-source.js +71 -0
- package/dist/tui/palette-source.js.map +1 -0
- package/dist/tui/palette.js +100 -0
- package/dist/tui/palette.js.map +1 -0
- package/dist/tui/state.js +105 -0
- package/dist/tui/state.js.map +1 -0
- package/dist/tui/theme.js +14 -0
- package/dist/tui/theme.js.map +1 -0
- package/docker/docker-compose.yml +44 -0
- package/headroom/docker-compose.yml +27 -0
- package/package.json +40 -16
- package/dist/adapters/supabase/allocation-gateway.js +0 -236
- package/dist/adapters/supabase/allocation-gateway.js.map +0 -1
- package/dist/adapters/supabase/analytics-gateway.js +0 -18
- package/dist/adapters/supabase/analytics-gateway.js.map +0 -1
- package/dist/adapters/supabase/client.js +0 -96
- package/dist/adapters/supabase/client.js.map +0 -1
- package/dist/adapters/supabase/context-gateway.js +0 -23
- package/dist/adapters/supabase/context-gateway.js.map +0 -1
- package/dist/adapters/supabase/gateway.js +0 -18
- package/dist/adapters/supabase/gateway.js.map +0 -1
- package/dist/adapters/supabase/task-gateway.js +0 -450
- package/dist/adapters/supabase/task-gateway.js.map +0 -1
- package/dist/auth.js +0 -118
- package/dist/auth.js.map +0 -1
- package/dist/cli/commands/init/project-step.js +0 -105
- package/dist/cli/commands/init/project-step.js.map +0 -1
- package/dist/constants.js +0 -9
- package/dist/constants.js.map +0 -1
- package/dist/core/ports.js +0 -2
- package/dist/core/ports.js.map +0 -1
- package/dist/database.types.js +0 -11
- package/dist/database.types.js.map +0 -1
- package/dist/lib/active-project.js +0 -28
- package/dist/lib/active-project.js.map +0 -1
- package/dist/lib/autopull.js +0 -13
- package/dist/lib/autopull.js.map +0 -1
- package/dist/lib/client-configs.js.map +0 -1
- package/dist/lib/client-install.js +0 -40
- package/dist/lib/client-install.js.map +0 -1
- package/dist/lib/dependencies.js.map +0 -1
- package/dist/lib/dependency-install.js.map +0 -1
- package/dist/lib/exec-delegate.js.map +0 -1
- package/dist/lib/exec-engines.js.map +0 -1
- package/dist/lib/harness.js.map +0 -1
- package/dist/lib/hooks.js.map +0 -1
- package/dist/lib/patterns.js.map +0 -1
- package/dist/lib/plan-delegate.js.map +0 -1
- package/dist/lib/project-context.js +0 -151
- package/dist/lib/project-context.js.map +0 -1
- package/dist/lib/provision-apply.js.map +0 -1
- package/dist/lib/provision-collect.js.map +0 -1
- package/dist/lib/provision.js.map +0 -1
- package/dist/lib/require-config.js +0 -32
- package/dist/lib/require-config.js.map +0 -1
- package/dist/lib/rules.js.map +0 -1
- package/dist/lib/sections.js +0 -89
- package/dist/lib/sections.js.map +0 -1
- package/dist/lib/skill-serve.js.map +0 -1
- package/dist/lib/skills-cache.js.map +0 -1
- package/dist/lib/skills.js.map +0 -1
- package/dist/lib/targets.js.map +0 -1
- package/dist/lib/task-history.js +0 -15
- package/dist/lib/task-history.js.map +0 -1
- package/dist/lib/validate-plan-delegate.js.map +0 -1
- package/dist/session-factory.js +0 -19
- package/dist/session-factory.js.map +0 -1
- package/dist/spinner.js.map +0 -1
- package/dist/tools/comment-task.js +0 -72
- package/dist/tools/comment-task.js.map +0 -1
- package/dist/tools/create-task.js +0 -129
- package/dist/tools/create-task.js.map +0 -1
- package/dist/tools/end-allocation.js +0 -38
- package/dist/tools/end-allocation.js.map +0 -1
- package/dist/tools/end-task-allocation.js +0 -37
- package/dist/tools/end-task-allocation.js.map +0 -1
- package/dist/tools/get-active-allocation.js +0 -69
- package/dist/tools/get-active-allocation.js.map +0 -1
- package/dist/tools/get-context.js +0 -48
- package/dist/tools/get-context.js.map +0 -1
- package/dist/tools/get-task.js +0 -137
- package/dist/tools/get-task.js.map +0 -1
- package/dist/tools/list-my-allocations.js +0 -71
- package/dist/tools/list-my-allocations.js.map +0 -1
- package/dist/tools/list-projects.js +0 -38
- package/dist/tools/list-projects.js.map +0 -1
- package/dist/tools/list-tasks.js +0 -93
- package/dist/tools/list-tasks.js.map +0 -1
- package/dist/tools/move-task.js +0 -82
- package/dist/tools/move-task.js.map +0 -1
- package/dist/tools/record-delivery.js +0 -71
- package/dist/tools/record-delivery.js.map +0 -1
- package/dist/tools/set-project.js +0 -52
- package/dist/tools/set-project.js.map +0 -1
- package/dist/tools/start-allocation.js +0 -32
- package/dist/tools/start-allocation.js.map +0 -1
- package/dist/tools/start-task-allocation.js +0 -75
- package/dist/tools/start-task-allocation.js.map +0 -1
- package/dist/tools/update-task.js +0 -139
- package/dist/tools/update-task.js.map +0 -1
- /package/dist/{spinner.js → lib/spinner.js} +0 -0
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
import { createProjectDetector } from './project-detector.js';
|
|
5
|
+
import { createPackageMap } from './package-map.js';
|
|
6
|
+
const INIT = {
|
|
7
|
+
npm: { program: 'npm', args: ['init', '-y'] },
|
|
8
|
+
pnpm: { program: 'pnpm', args: ['init'] },
|
|
9
|
+
yarn: { program: 'yarn', args: ['init', '-y'] },
|
|
10
|
+
uv: { program: 'uv', args: ['init'] },
|
|
11
|
+
pip: { program: 'python', args: ['-m', 'venv', '.venv'] },
|
|
12
|
+
nuget: { program: 'dotnet', args: ['new', 'console'] },
|
|
13
|
+
};
|
|
14
|
+
const NODE_ADD = { npm: 'install', pnpm: 'add', yarn: 'add' };
|
|
15
|
+
function addCommand(pm, pkg) {
|
|
16
|
+
switch (pm) {
|
|
17
|
+
case 'npm':
|
|
18
|
+
return { program: 'npm', args: ['install', pkg] };
|
|
19
|
+
case 'pnpm':
|
|
20
|
+
return { program: 'pnpm', args: ['add', pkg] };
|
|
21
|
+
case 'yarn':
|
|
22
|
+
return { program: 'yarn', args: ['add', pkg] };
|
|
23
|
+
case 'pip':
|
|
24
|
+
return { program: 'pip', args: ['install', pkg] };
|
|
25
|
+
case 'uv':
|
|
26
|
+
return { program: 'uv', args: ['add', pkg] };
|
|
27
|
+
case 'pipenv':
|
|
28
|
+
return { program: 'pipenv', args: ['install', pkg] };
|
|
29
|
+
case 'poetry':
|
|
30
|
+
return { program: 'poetry', args: ['add', pkg] };
|
|
31
|
+
case 'conda':
|
|
32
|
+
return { program: 'conda', args: ['install', '-y', pkg] };
|
|
33
|
+
case 'nuget':
|
|
34
|
+
return { program: 'dotnet', args: ['add', 'package', pkg] };
|
|
35
|
+
default:
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function fitsEcosystem(recipe, ctx) {
|
|
40
|
+
if (ctx.empty)
|
|
41
|
+
return true;
|
|
42
|
+
switch (recipe.runtime) {
|
|
43
|
+
case 'node':
|
|
44
|
+
return ctx.hasPackageJson;
|
|
45
|
+
case 'python':
|
|
46
|
+
return ctx.hasPyproject || ctx.hasRequirements;
|
|
47
|
+
case 'dotnet':
|
|
48
|
+
return ctx.hasCsproj;
|
|
49
|
+
default:
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function buildPlanWith(detector, packageMap, recipe, choices, targetDir) {
|
|
54
|
+
const ctx = detector.detect(targetDir);
|
|
55
|
+
const pm = choices.packageManager ?? ctx.nodePackageManager ?? recipe.packageManagers[0];
|
|
56
|
+
const fits = fitsEcosystem(recipe, ctx);
|
|
57
|
+
const steps = [];
|
|
58
|
+
if (ctx.empty) {
|
|
59
|
+
const init = INIT[pm];
|
|
60
|
+
if (init) {
|
|
61
|
+
steps.push({ kind: 'run', program: init.program, args: init.args, cwd: targetDir, label: `inicializa (${pm})` });
|
|
62
|
+
}
|
|
63
|
+
const nodeAdd = NODE_ADD[pm];
|
|
64
|
+
if (nodeAdd && recipe.typings.length > 0) {
|
|
65
|
+
steps.push({ kind: 'run', program: pm, args: [nodeAdd, '-D', ...recipe.typings], cwd: targetDir, label: 'instala tipagens' });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const installed = [];
|
|
69
|
+
const skipped = [];
|
|
70
|
+
for (const displayName of [choices.framework, choices.orm]) {
|
|
71
|
+
if (!displayName)
|
|
72
|
+
continue;
|
|
73
|
+
const pkg = packageMap.resolve(recipe.language, displayName);
|
|
74
|
+
const cmd = pkg && fits ? addCommand(pm, pkg) : null;
|
|
75
|
+
if (pkg && fits && cmd) {
|
|
76
|
+
installed.push(pkg);
|
|
77
|
+
steps.push({ kind: 'run', program: cmd.program, args: cmd.args, cwd: targetDir, label: `instala ${displayName} (${pkg})` });
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
skipped.push(displayName);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
const marker = {
|
|
84
|
+
language: recipe.language,
|
|
85
|
+
packageManager: pm,
|
|
86
|
+
framework: choices.framework ?? null,
|
|
87
|
+
orm: choices.orm ?? null,
|
|
88
|
+
greenfield: ctx.empty,
|
|
89
|
+
ecosystemFits: fits,
|
|
90
|
+
installed,
|
|
91
|
+
skipped,
|
|
92
|
+
};
|
|
93
|
+
steps.push({
|
|
94
|
+
kind: 'write',
|
|
95
|
+
path: join(targetDir, '.nio-lang.json'),
|
|
96
|
+
content: JSON.stringify(marker, null, 2) + '\n',
|
|
97
|
+
label: 'registra escolhas/contexto (.nio-lang.json)',
|
|
98
|
+
});
|
|
99
|
+
return { language: recipe.language, targetDir, steps };
|
|
100
|
+
}
|
|
101
|
+
function runStep(step) {
|
|
102
|
+
try {
|
|
103
|
+
if (step.kind === 'run') {
|
|
104
|
+
const res = spawnSync(step.program, step.args, { cwd: step.cwd, stdio: 'inherit' });
|
|
105
|
+
if (res.error)
|
|
106
|
+
return { step, status: 'failed', error: res.error.message };
|
|
107
|
+
if (res.status !== 0)
|
|
108
|
+
return { step, status: 'failed', error: `código ${res.status}` };
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
mkdirSync(dirname(step.path), { recursive: true });
|
|
112
|
+
writeFileSync(step.path, step.content);
|
|
113
|
+
}
|
|
114
|
+
return { step, status: 'done' };
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
return { step, status: 'failed', error: err.message };
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
export function createScaffoldGateway(deps = {}) {
|
|
121
|
+
const detector = deps.detector ?? createProjectDetector();
|
|
122
|
+
const packageMap = deps.packageMap ?? createPackageMap();
|
|
123
|
+
return {
|
|
124
|
+
plan(recipe, choices, targetDir) {
|
|
125
|
+
return buildPlanWith(detector, packageMap, recipe, choices, targetDir);
|
|
126
|
+
},
|
|
127
|
+
apply(plan, opts) {
|
|
128
|
+
const dryRun = opts?.dryRun ?? false;
|
|
129
|
+
if (dryRun)
|
|
130
|
+
return plan.steps.map((step) => ({ step, status: 'planned' }));
|
|
131
|
+
return plan.steps.map(runStep);
|
|
132
|
+
},
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=scaffold-gateway.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold-gateway.js","sourceRoot":"","sources":["../../../src/adapters/lang/scaffold-gateway.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, rmSync, cpSync, readdirSync } from 'node:fs';
|
|
2
|
+
import { tmpdir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import AdmZip from 'adm-zip';
|
|
5
|
+
import { homePath } from '../../brand.js';
|
|
6
|
+
import { LANG_REPOS } from './repos.js';
|
|
7
|
+
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
8
|
+
async function downloadRepo(spec, baseDir, opts) {
|
|
9
|
+
const dest = join(baseDir, spec.dir);
|
|
10
|
+
const base = { dir: spec.dir, repo: spec.repo, ref: spec.ref };
|
|
11
|
+
if (!opts.force && existsSync(dest)) {
|
|
12
|
+
return { ...base, status: 'cached' };
|
|
13
|
+
}
|
|
14
|
+
const url = `https://codeload.github.com/${spec.repo}/zip/refs/heads/${spec.ref}`;
|
|
15
|
+
const staging = join(tmpdir(), `nio-lang-${spec.dir}-${process.pid}-${Date.now()}`);
|
|
16
|
+
const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
17
|
+
const ac = new AbortController();
|
|
18
|
+
const timer = setTimeout(() => ac.abort(), timeoutMs);
|
|
19
|
+
try {
|
|
20
|
+
const res = await fetch(url, { signal: ac.signal });
|
|
21
|
+
if (!res.ok)
|
|
22
|
+
throw new Error(`HTTP ${res.status} ao baixar ${url}`);
|
|
23
|
+
const buf = Buffer.from(await res.arrayBuffer());
|
|
24
|
+
rmSync(staging, { recursive: true, force: true });
|
|
25
|
+
mkdirSync(staging, { recursive: true });
|
|
26
|
+
new AdmZip(buf).extractAllTo(staging, true);
|
|
27
|
+
const dirs = readdirSync(staging, { withFileTypes: true }).filter((e) => e.isDirectory());
|
|
28
|
+
const root = dirs.length === 1 ? join(staging, dirs[0].name) : staging;
|
|
29
|
+
rmSync(dest, { recursive: true, force: true });
|
|
30
|
+
mkdirSync(dest, { recursive: true });
|
|
31
|
+
cpSync(root, dest, { recursive: true });
|
|
32
|
+
return { ...base, status: 'fetched' };
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
const msg = ac.signal.aborted ? `timeout após ${timeoutMs}ms` : err.message;
|
|
36
|
+
return { ...base, status: existsSync(dest) ? 'cached' : 'failed', error: msg };
|
|
37
|
+
}
|
|
38
|
+
finally {
|
|
39
|
+
clearTimeout(timer);
|
|
40
|
+
rmSync(staging, { recursive: true, force: true });
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export async function syncLangRepos(opts = {}) {
|
|
44
|
+
const baseDir = opts.dir ?? homePath('lang');
|
|
45
|
+
mkdirSync(baseDir, { recursive: true });
|
|
46
|
+
const results = [];
|
|
47
|
+
for (const spec of Object.values(LANG_REPOS)) {
|
|
48
|
+
results.push(await downloadRepo(spec, baseDir, opts));
|
|
49
|
+
}
|
|
50
|
+
return results;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=vendor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vendor.js","sourceRoot":"","sources":["../../../src/adapters/lang/vendor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { query, isUuid } from './client.js';
|
|
2
|
+
const COLS = 'id, user_id, expires_at, revoked_at, created_at';
|
|
3
|
+
export function mapAuthSessionRow(row) {
|
|
4
|
+
return {
|
|
5
|
+
id: row.id,
|
|
6
|
+
userId: Number(row.user_id),
|
|
7
|
+
expiresAt: row.expires_at,
|
|
8
|
+
revokedAt: row.revoked_at,
|
|
9
|
+
createdAt: row.created_at,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export function createAuthSessionRepository() {
|
|
13
|
+
return {
|
|
14
|
+
async create(input) {
|
|
15
|
+
const res = await query(`INSERT INTO auth_sessions (user_id, expires_at) VALUES ($1, $2) RETURNING ${COLS}`, [input.userId, input.expiresAt]);
|
|
16
|
+
return mapAuthSessionRow(res.rows[0]);
|
|
17
|
+
},
|
|
18
|
+
async findById(id) {
|
|
19
|
+
if (!isUuid(id))
|
|
20
|
+
return null;
|
|
21
|
+
const res = await query(`SELECT ${COLS} FROM auth_sessions WHERE id = $1`, [id]);
|
|
22
|
+
const row = res.rows[0];
|
|
23
|
+
return row ? mapAuthSessionRow(row) : null;
|
|
24
|
+
},
|
|
25
|
+
async revoke(id) {
|
|
26
|
+
if (!isUuid(id))
|
|
27
|
+
return;
|
|
28
|
+
await query(`UPDATE auth_sessions SET revoked_at = NOW() WHERE id = $1 AND revoked_at IS NULL`, [id]);
|
|
29
|
+
},
|
|
30
|
+
async listActiveByUser(userId) {
|
|
31
|
+
const res = await query(`SELECT ${COLS} FROM auth_sessions
|
|
32
|
+
WHERE user_id = $1 AND revoked_at IS NULL AND expires_at > NOW()
|
|
33
|
+
ORDER BY created_at DESC`, [userId]);
|
|
34
|
+
return res.rows.map(mapAuthSessionRow);
|
|
35
|
+
},
|
|
36
|
+
async revokeAllByUser(userId) {
|
|
37
|
+
await query(`UPDATE auth_sessions SET revoked_at = NOW() WHERE user_id = $1 AND revoked_at IS NULL`, [userId]);
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=auth-session-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-session-repository.js","sourceRoot":"","sources":["../../../src/adapters/pg/auth-session-repository.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAW5C,MAAM,IAAI,GAAG,iDAAiD,CAAC;AAG/D,MAAM,UAAU,iBAAiB,CAAC,GAAmB;IACnD,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;QAC3B,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,2BAA2B;IACzC,OAAO;QACL,KAAK,CAAC,MAAM,CAAC,KAA0B;YACrC,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,6EAA6E,IAAI,EAAE,EACnF,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,CAChC,CAAC;YACF,OAAO,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC;QACzC,CAAC;QAED,KAAK,CAAC,QAAQ,CAAC,EAAE;YACf,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC7B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAiB,UAAU,IAAI,mCAAmC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACjG,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACxB,OAAO,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7C,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,EAAE;YACb,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBAAE,OAAO;YACxB,MAAM,KAAK,CACT,kFAAkF,EAClF,CAAC,EAAE,CAAC,CACL,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,gBAAgB,CAAC,MAAM;YAC3B,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,UAAU,IAAI;;kCAEY,EAC1B,CAAC,MAAM,CAAC,CACT,CAAC;YACF,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QACzC,CAAC;QAED,KAAK,CAAC,eAAe,CAAC,MAAM;YAC1B,MAAM,KAAK,CACT,uFAAuF,EACvF,CAAC,MAAM,CAAC,CACT,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { Pool } from 'pg';
|
|
2
|
+
function readDatabaseUrl() {
|
|
3
|
+
const url = process.env.NIO_DATABASE_URL?.trim();
|
|
4
|
+
if (!url) {
|
|
5
|
+
throw new Error('NIO_DATABASE_URL não definida. Configure a conexão do Postgres, ex.: ' +
|
|
6
|
+
'NIO_DATABASE_URL="postgres://user:pass@host:5432/nio_cli".');
|
|
7
|
+
}
|
|
8
|
+
if (!/^postgres(ql)?:\/\//i.test(url)) {
|
|
9
|
+
throw new Error(`NIO_DATABASE_URL inválida: esperado "postgres://..." e veio "${url.slice(0, 16)}…".`);
|
|
10
|
+
}
|
|
11
|
+
return url;
|
|
12
|
+
}
|
|
13
|
+
function readSslOption() {
|
|
14
|
+
const flag = process.env.NIO_DATABASE_SSL?.trim().toLowerCase();
|
|
15
|
+
if (flag === 'true' || flag === '1')
|
|
16
|
+
return { rejectUnauthorized: false };
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
let pool = null;
|
|
20
|
+
export function getPool() {
|
|
21
|
+
if (pool)
|
|
22
|
+
return pool;
|
|
23
|
+
pool = new Pool({
|
|
24
|
+
connectionString: readDatabaseUrl(),
|
|
25
|
+
ssl: readSslOption(),
|
|
26
|
+
max: 10,
|
|
27
|
+
idleTimeoutMillis: 30_000,
|
|
28
|
+
connectionTimeoutMillis: 10_000,
|
|
29
|
+
});
|
|
30
|
+
pool.on('error', (err) => {
|
|
31
|
+
console.error('[pg] erro em client ocioso do pool:', err.message);
|
|
32
|
+
});
|
|
33
|
+
return pool;
|
|
34
|
+
}
|
|
35
|
+
export async function query(text, params) {
|
|
36
|
+
return getPool().query(text, params ? [...params] : undefined);
|
|
37
|
+
}
|
|
38
|
+
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
39
|
+
export function isUuid(s) {
|
|
40
|
+
return UUID_RE.test(s);
|
|
41
|
+
}
|
|
42
|
+
export async function withTransaction(fn) {
|
|
43
|
+
const client = await getPool().connect();
|
|
44
|
+
try {
|
|
45
|
+
await client.query('BEGIN');
|
|
46
|
+
const result = await fn(client);
|
|
47
|
+
await client.query('COMMIT');
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
await client.query('ROLLBACK').catch(() => { });
|
|
52
|
+
throw err;
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
client.release();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export async function ping() {
|
|
59
|
+
try {
|
|
60
|
+
const res = await query('SELECT 1 AS ok');
|
|
61
|
+
return res.rows[0]?.ok === 1;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export async function closePool() {
|
|
68
|
+
if (!pool)
|
|
69
|
+
return;
|
|
70
|
+
const p = pool;
|
|
71
|
+
pool = null;
|
|
72
|
+
await p.end();
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/adapters/pg/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { query, withTransaction } from './client.js';
|
|
2
|
+
const COLS = 'id, session_id, file_path, dependency_name, dependency_type, detected_at, installed, installed_at';
|
|
3
|
+
export function mapDependencyEventRow(row) {
|
|
4
|
+
return {
|
|
5
|
+
id: row.id,
|
|
6
|
+
sessionId: row.session_id,
|
|
7
|
+
filePath: row.file_path,
|
|
8
|
+
dependencyName: row.dependency_name,
|
|
9
|
+
dependencyType: row.dependency_type,
|
|
10
|
+
detectedAt: row.detected_at,
|
|
11
|
+
installed: row.installed,
|
|
12
|
+
installedAt: row.installed_at,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export function createDependencyEventRepository() {
|
|
16
|
+
return {
|
|
17
|
+
async recordIfNew(input) {
|
|
18
|
+
return withTransaction(async (tx) => {
|
|
19
|
+
const existing = await tx.query(`SELECT ${COLS} FROM dependency_events
|
|
20
|
+
WHERE session_id = $1 AND file_path = $2 AND dependency_name = $3
|
|
21
|
+
ORDER BY detected_at DESC LIMIT 1`, [input.sessionId, input.filePath, input.dependencyName]);
|
|
22
|
+
if (existing.rows[0]) {
|
|
23
|
+
return { event: mapDependencyEventRow(existing.rows[0]), created: false };
|
|
24
|
+
}
|
|
25
|
+
const inserted = await tx.query(`INSERT INTO dependency_events (session_id, file_path, dependency_name, dependency_type)
|
|
26
|
+
VALUES ($1, $2, $3, $4)
|
|
27
|
+
RETURNING ${COLS}`, [input.sessionId, input.filePath, input.dependencyName, input.dependencyType]);
|
|
28
|
+
return { event: mapDependencyEventRow(inserted.rows[0]), created: true };
|
|
29
|
+
});
|
|
30
|
+
},
|
|
31
|
+
async markInstalled(id) {
|
|
32
|
+
await query(`UPDATE dependency_events SET installed = TRUE, installed_at = NOW() WHERE id = $1`, [id]);
|
|
33
|
+
},
|
|
34
|
+
async listBySession(sessionId) {
|
|
35
|
+
const res = await query(`SELECT ${COLS} FROM dependency_events WHERE session_id = $1 ORDER BY detected_at DESC`, [sessionId]);
|
|
36
|
+
return res.rows.map(mapDependencyEventRow);
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=dependency-event-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-event-repository.js","sourceRoot":"","sources":["../../../src/adapters/pg/dependency-event-repository.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAcrD,MAAM,IAAI,GACR,mGAAmG,CAAC;AAEtG,MAAM,UAAU,qBAAqB,CAAC,GAAuB;IAC3D,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,cAAc,EAAE,GAAG,CAAC,eAAe;QACnC,cAAc,EAAE,GAAG,CAAC,eAAiC;QACrD,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,WAAW,EAAE,GAAG,CAAC,YAAY;KAC9B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,+BAA+B;IAC7C,OAAO;QACL,KAAK,CAAC,WAAW,CAAC,KAA8B;YAC9C,OAAO,eAAe,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;gBAElC,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,KAAK,CAC7B,UAAU,IAAI;;6CAEqB,EACnC,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,cAAc,CAAC,CACxD,CAAC;gBACF,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;oBACrB,OAAO,EAAE,KAAK,EAAE,qBAAqB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;gBAC5E,CAAC;gBACD,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,KAAK,CAC7B;;uBAEa,IAAI,EAAE,EACnB,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,cAAc,CAAC,CAC9E,CAAC;gBACF,OAAO,EAAE,KAAK,EAAE,qBAAqB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC5E,CAAC,CAAC,CAAC;QACL,CAAC;QAED,KAAK,CAAC,aAAa,CAAC,EAAE;YACpB,MAAM,KAAK,CACT,mFAAmF,EACnF,CAAC,EAAE,CAAC,CACL,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,aAAa,CAAC,SAAS;YAC3B,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,UAAU,IAAI,yEAAyE,EACvF,CAAC,SAAS,CAAC,CACZ,CAAC;YACF,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QAC7C,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { query, withTransaction, isUuid } from './client.js';
|
|
2
|
+
const COLS = 'id, user_id, purpose, code_hash, channel, attempts, expires_at, consumed_at, created_at';
|
|
3
|
+
export function isChallengeId(id) {
|
|
4
|
+
return isUuid(id);
|
|
5
|
+
}
|
|
6
|
+
export function mapLoginChallengeRow(row) {
|
|
7
|
+
return {
|
|
8
|
+
id: row.id,
|
|
9
|
+
userId: Number(row.user_id),
|
|
10
|
+
purpose: row.purpose,
|
|
11
|
+
codeHash: row.code_hash,
|
|
12
|
+
channel: row.channel,
|
|
13
|
+
attempts: Number(row.attempts),
|
|
14
|
+
expiresAt: row.expires_at,
|
|
15
|
+
consumedAt: row.consumed_at,
|
|
16
|
+
createdAt: row.created_at,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export function createLoginChallengeRepository() {
|
|
20
|
+
return {
|
|
21
|
+
async create(input) {
|
|
22
|
+
return withTransaction(async (tx) => {
|
|
23
|
+
await tx.query('DELETE FROM login_challenges WHERE expires_at < NOW()');
|
|
24
|
+
await tx.query('DELETE FROM login_challenges WHERE user_id = $1 AND consumed_at IS NULL', [input.userId]);
|
|
25
|
+
const res = await tx.query(`INSERT INTO login_challenges (user_id, purpose, code_hash, channel, expires_at)
|
|
26
|
+
VALUES ($1, $2, $3, $4, $5)
|
|
27
|
+
RETURNING ${COLS}`, [input.userId, input.purpose, input.codeHash, input.channel, input.expiresAt]);
|
|
28
|
+
return mapLoginChallengeRow(res.rows[0]);
|
|
29
|
+
});
|
|
30
|
+
},
|
|
31
|
+
async findById(id) {
|
|
32
|
+
if (!isChallengeId(id))
|
|
33
|
+
return null;
|
|
34
|
+
const res = await query(`SELECT ${COLS} FROM login_challenges WHERE id = $1`, [id]);
|
|
35
|
+
const row = res.rows[0];
|
|
36
|
+
return row ? mapLoginChallengeRow(row) : null;
|
|
37
|
+
},
|
|
38
|
+
async incrementAttempts(id) {
|
|
39
|
+
if (!isChallengeId(id))
|
|
40
|
+
return 0;
|
|
41
|
+
const res = await query('UPDATE login_challenges SET attempts = attempts + 1 WHERE id = $1 RETURNING attempts', [id]);
|
|
42
|
+
return Number(res.rows[0]?.attempts ?? 0);
|
|
43
|
+
},
|
|
44
|
+
async consume(id) {
|
|
45
|
+
if (!isChallengeId(id))
|
|
46
|
+
return;
|
|
47
|
+
await query('UPDATE login_challenges SET consumed_at = NOW() WHERE id = $1 AND consumed_at IS NULL', [id]);
|
|
48
|
+
},
|
|
49
|
+
async deleteExpired() {
|
|
50
|
+
await query('DELETE FROM login_challenges WHERE expires_at < NOW()');
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=login-challenge-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login-challenge-repository.js","sourceRoot":"","sources":["../../../src/adapters/pg/login-challenge-repository.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAe7D,MAAM,IAAI,GACR,yFAAyF,CAAC;AAG5F,MAAM,UAAU,aAAa,CAAC,EAAU;IACtC,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,GAAsB;IACzD,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;QAC3B,OAAO,EAAE,GAAG,CAAC,OAA2B;QACxC,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,OAAO,EAAE,GAAG,CAAC,OAAgB;QAC7B,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC9B,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,8BAA8B;IAC5C,OAAO;QACL,KAAK,CAAC,MAAM,CAAC,KAA6B;YACxC,OAAO,eAAe,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;gBAClC,MAAM,EAAE,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;gBACxE,MAAM,EAAE,CAAC,KAAK,CACZ,yEAAyE,EACzE,CAAC,KAAK,CAAC,MAAM,CAAC,CACf,CAAC;gBACF,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,KAAK,CACxB;;uBAEa,IAAI,EAAE,EACnB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,CAC9E,CAAC;gBACF,OAAO,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC;YAC5C,CAAC,CAAC,CAAC;QACL,CAAC;QAED,KAAK,CAAC,QAAQ,CAAC,EAAE;YACf,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;gBAAE,OAAO,IAAI,CAAC;YACpC,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,UAAU,IAAI,sCAAsC,EACpD,CAAC,EAAE,CAAC,CACL,CAAC;YACF,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACxB,OAAO,GAAG,CAAC,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAChD,CAAC;QAED,KAAK,CAAC,iBAAiB,CAAC,EAAE;YACxB,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;gBAAE,OAAO,CAAC,CAAC;YACjC,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,sFAAsF,EACtF,CAAC,EAAE,CAAC,CACL,CAAC;YACF,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,IAAI,CAAC,CAAC,CAAC;QAC5C,CAAC;QAED,KAAK,CAAC,OAAO,CAAC,EAAE;YACd,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;gBAAE,OAAO;YAC/B,MAAM,KAAK,CACT,uFAAuF,EACvF,CAAC,EAAE,CAAC,CACL,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,aAAa;YACjB,MAAM,KAAK,CAAC,uDAAuD,CAAC,CAAC;QACvE,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { query, withTransaction } from './client.js';
|
|
2
|
+
const COLS = 'id, user_id, name, profile, status, project_path, ide, config, created_at, updated_at';
|
|
3
|
+
export function mapSessionRow(row) {
|
|
4
|
+
return {
|
|
5
|
+
id: row.id,
|
|
6
|
+
userId: Number(row.user_id),
|
|
7
|
+
name: row.name,
|
|
8
|
+
profile: row.profile,
|
|
9
|
+
status: row.status,
|
|
10
|
+
projectPath: row.project_path,
|
|
11
|
+
ide: row.ide,
|
|
12
|
+
config: (row.config ?? {}),
|
|
13
|
+
createdAt: row.created_at,
|
|
14
|
+
updatedAt: row.updated_at,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export function createSessionRepository() {
|
|
18
|
+
return {
|
|
19
|
+
async create(input) {
|
|
20
|
+
return withTransaction(async (tx) => {
|
|
21
|
+
await tx.query(`UPDATE sessions SET status = 'archived' WHERE user_id = $1 AND status = 'active'`, [input.userId]);
|
|
22
|
+
const res = await tx.query(`INSERT INTO sessions (user_id, name, profile, status, project_path, ide, config)
|
|
23
|
+
VALUES ($1, $2, $3, 'active', $4, $5, $6)
|
|
24
|
+
RETURNING ${COLS}`, [
|
|
25
|
+
input.userId,
|
|
26
|
+
input.name,
|
|
27
|
+
input.profile,
|
|
28
|
+
input.projectPath,
|
|
29
|
+
input.ide,
|
|
30
|
+
JSON.stringify(input.config ?? {}),
|
|
31
|
+
]);
|
|
32
|
+
return mapSessionRow(res.rows[0]);
|
|
33
|
+
});
|
|
34
|
+
},
|
|
35
|
+
async findById(id) {
|
|
36
|
+
const res = await query(`SELECT ${COLS} FROM sessions WHERE id = $1`, [id]);
|
|
37
|
+
const row = res.rows[0];
|
|
38
|
+
return row ? mapSessionRow(row) : null;
|
|
39
|
+
},
|
|
40
|
+
async listByUser(userId) {
|
|
41
|
+
const res = await query(`SELECT ${COLS} FROM sessions WHERE user_id = $1 ORDER BY updated_at DESC`, [userId]);
|
|
42
|
+
return res.rows.map(mapSessionRow);
|
|
43
|
+
},
|
|
44
|
+
async findActiveByUser(userId) {
|
|
45
|
+
const res = await query(`SELECT ${COLS} FROM sessions WHERE user_id = $1 AND status = 'active'
|
|
46
|
+
ORDER BY updated_at DESC LIMIT 1`, [userId]);
|
|
47
|
+
const row = res.rows[0];
|
|
48
|
+
return row ? mapSessionRow(row) : null;
|
|
49
|
+
},
|
|
50
|
+
async activate(id, userId) {
|
|
51
|
+
return withTransaction(async (tx) => {
|
|
52
|
+
const found = await tx.query(`UPDATE sessions SET status = 'active' WHERE id = $1 RETURNING ${COLS}`, [id]);
|
|
53
|
+
if (!found.rows[0])
|
|
54
|
+
return null;
|
|
55
|
+
await tx.query(`UPDATE sessions SET status = 'archived' WHERE user_id = $1 AND status = 'active' AND id <> $2`, [userId, id]);
|
|
56
|
+
return mapSessionRow(found.rows[0]);
|
|
57
|
+
});
|
|
58
|
+
},
|
|
59
|
+
async setStatus(id, status) {
|
|
60
|
+
await query('UPDATE sessions SET status = $2 WHERE id = $1', [id, status]);
|
|
61
|
+
},
|
|
62
|
+
async updateConfig(id, config) {
|
|
63
|
+
await query('UPDATE sessions SET config = $2 WHERE id = $1', [id, JSON.stringify(config)]);
|
|
64
|
+
},
|
|
65
|
+
async delete(id) {
|
|
66
|
+
await query('DELETE FROM sessions WHERE id = $1', [id]);
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=session-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-repository.js","sourceRoot":"","sources":["../../../src/adapters/pg/session-repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { hashPassword, verifyPassword } from '../../lib/auth/password.js';
|
|
2
|
+
import { query } from './client.js';
|
|
3
|
+
function parseIps(raw) {
|
|
4
|
+
if (!raw)
|
|
5
|
+
return [];
|
|
6
|
+
try {
|
|
7
|
+
const parsed = JSON.parse(raw);
|
|
8
|
+
return Array.isArray(parsed) ? parsed.filter((x) => typeof x === 'string') : [];
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return [];
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function mapUserRow(row) {
|
|
15
|
+
return {
|
|
16
|
+
id: Number(row.id),
|
|
17
|
+
name: row.name,
|
|
18
|
+
auth2: row.auth_2,
|
|
19
|
+
phone: row.phone,
|
|
20
|
+
ipsUsing: parseIps(row.ips_using),
|
|
21
|
+
timestampCreation: row.timestamp_creation,
|
|
22
|
+
timestampPasswordChange: row.timestamp_password_change,
|
|
23
|
+
timestampLastSession: row.timestamp_last_session,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
const COLS = 'id, name, password, timestamp_creation, timestamp_password_change, ' +
|
|
27
|
+
'auth_2, phone, backup_codes, timestamp_last_session, ips_using';
|
|
28
|
+
export function createUserRepository() {
|
|
29
|
+
return {
|
|
30
|
+
async findByName(name) {
|
|
31
|
+
const res = await query(`SELECT ${COLS} FROM user_cli WHERE name = $1`, [name]);
|
|
32
|
+
const row = res.rows[0];
|
|
33
|
+
return row ? mapUserRow(row) : null;
|
|
34
|
+
},
|
|
35
|
+
async findById(id) {
|
|
36
|
+
const res = await query(`SELECT ${COLS} FROM user_cli WHERE id = $1`, [id]);
|
|
37
|
+
const row = res.rows[0];
|
|
38
|
+
return row ? mapUserRow(row) : null;
|
|
39
|
+
},
|
|
40
|
+
async create(input) {
|
|
41
|
+
const passwordHash = await hashPassword(input.password);
|
|
42
|
+
const res = await query(`INSERT INTO user_cli (name, password) VALUES ($1, $2) RETURNING ${COLS}`, [input.name, passwordHash]);
|
|
43
|
+
return mapUserRow(res.rows[0]);
|
|
44
|
+
},
|
|
45
|
+
async verifyCredentials(name, password) {
|
|
46
|
+
const res = await query(`SELECT ${COLS} FROM user_cli WHERE name = $1`, [name]);
|
|
47
|
+
const row = res.rows[0];
|
|
48
|
+
if (!row)
|
|
49
|
+
return null;
|
|
50
|
+
const ok = await verifyPassword(row.password, password);
|
|
51
|
+
return ok ? mapUserRow(row) : null;
|
|
52
|
+
},
|
|
53
|
+
async touchLastSession(userId) {
|
|
54
|
+
await query('UPDATE user_cli SET timestamp_last_session = NOW() WHERE id = $1', [userId]);
|
|
55
|
+
},
|
|
56
|
+
async enable2fa(userId, phone, backupCodeHashes) {
|
|
57
|
+
await query('UPDATE user_cli SET auth_2 = TRUE, phone = $2, backup_codes = $3 WHERE id = $1', [userId, phone, backupCodeHashes]);
|
|
58
|
+
},
|
|
59
|
+
async disable2fa(userId) {
|
|
60
|
+
await query('UPDATE user_cli SET auth_2 = FALSE, phone = NULL, backup_codes = NULL WHERE id = $1', [userId]);
|
|
61
|
+
},
|
|
62
|
+
async updateBackupCodes(userId, joined) {
|
|
63
|
+
await query('UPDATE user_cli SET backup_codes = $2 WHERE id = $1', [userId, joined]);
|
|
64
|
+
},
|
|
65
|
+
async getBackupCodes(userId) {
|
|
66
|
+
const res = await query('SELECT backup_codes FROM user_cli WHERE id = $1', [userId]);
|
|
67
|
+
return res.rows[0]?.backup_codes ?? null;
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=user-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-repository.js","sourceRoot":"","sources":["../../../src/adapters/pg/user-repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
import { globExists } from '../../lib/deps/dependency-install.js';
|
|
3
|
+
function isPresent(spec) {
|
|
4
|
+
return Boolean(spec.detect && spec.detect.some(globExists));
|
|
5
|
+
}
|
|
6
|
+
function ensure(spec) {
|
|
7
|
+
if (isPresent(spec))
|
|
8
|
+
return { id: spec.id, status: 'present' };
|
|
9
|
+
if (!spec.install) {
|
|
10
|
+
return {
|
|
11
|
+
id: spec.id,
|
|
12
|
+
status: 'failed',
|
|
13
|
+
error: 'não detectado e sem plano de instalação automática (instale manualmente)',
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
const res = spawnSync(spec.install.program, spec.install.args, { stdio: 'inherit' });
|
|
17
|
+
if (res.error) {
|
|
18
|
+
return { id: spec.id, status: 'failed', error: res.error.message };
|
|
19
|
+
}
|
|
20
|
+
if (res.status !== 0) {
|
|
21
|
+
return { id: spec.id, status: 'failed', error: `instalador saiu com código ${res.status}` };
|
|
22
|
+
}
|
|
23
|
+
if (spec.detect && !isPresent(spec)) {
|
|
24
|
+
return { id: spec.id, status: 'failed', error: 'instalador rodou mas o toolchain não foi detectado' };
|
|
25
|
+
}
|
|
26
|
+
return { id: spec.id, status: 'installed' };
|
|
27
|
+
}
|
|
28
|
+
export function createToolchainGateway() {
|
|
29
|
+
return {
|
|
30
|
+
async ensure(spec) {
|
|
31
|
+
return ensure(spec);
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=toolchain-gateway.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolchain-gateway.js","sourceRoot":"","sources":["../../../src/adapters/pkg/toolchain-gateway.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAIlE,SAAS,SAAS,CAAC,IAAmB;IACpC,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,MAAM,CAAC,IAAmB;IACjC,IAAI,SAAS,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAE/D,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,0EAA0E;SAClF,CAAC;IACJ,CAAC;IAGD,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IACrF,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QACd,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IACrE,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,8BAA8B,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;IAC9F,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,oDAAoD,EAAE,CAAC;IACxG,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO;QACL,KAAK,CAAC,MAAM,CAAC,IAAmB;YAC9B,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;KACF,CAAC;AACJ,CAAC"}
|