@compilr-dev/cli 0.4.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +254 -68
- package/dist/.tsbuildinfo.app +1 -0
- package/dist/.tsbuildinfo.data +1 -0
- package/dist/.tsbuildinfo.domain +1 -0
- package/dist/.tsbuildinfo.foundation +1 -0
- package/dist/agent.d.ts +134 -4
- package/dist/agent.js +345 -166
- package/dist/anchors/index.d.ts +9 -0
- package/dist/anchors/index.js +9 -0
- package/dist/anchors/project-anchors.d.ts +79 -0
- package/dist/anchors/project-anchors.js +202 -0
- package/dist/auth/api-client.d.ts +124 -0
- package/dist/auth/api-client.js +261 -0
- package/dist/auth/index.d.ts +172 -0
- package/dist/auth/index.js +545 -0
- package/dist/auth/storage.d.ts +52 -0
- package/dist/auth/storage.js +118 -0
- package/dist/changelog/index.d.ts +16 -0
- package/dist/changelog/index.js +24 -0
- package/dist/changelog/releases.d.ts +17 -0
- package/dist/changelog/releases.js +63 -0
- package/dist/commands/index.d.ts +2 -1
- package/dist/commands-v2/handlers/auth.d.ts +10 -0
- package/dist/commands-v2/handlers/auth.js +118 -0
- package/dist/commands-v2/handlers/background.d.ts +14 -0
- package/dist/commands-v2/handlers/background.js +276 -0
- package/dist/commands-v2/handlers/context.d.ts +13 -0
- package/dist/commands-v2/handlers/context.js +533 -0
- package/dist/commands-v2/handlers/core.d.ts +14 -0
- package/dist/commands-v2/handlers/core.js +290 -0
- package/dist/commands-v2/handlers/debug.d.ts +11 -0
- package/dist/commands-v2/handlers/debug.js +177 -0
- package/dist/commands-v2/handlers/delegations.d.ts +8 -0
- package/dist/commands-v2/handlers/delegations.js +29 -0
- package/dist/commands-v2/handlers/files.d.ts +8 -0
- package/dist/commands-v2/handlers/files.js +162 -0
- package/dist/commands-v2/handlers/filter.d.ts +9 -0
- package/dist/commands-v2/handlers/filter.js +130 -0
- package/dist/commands-v2/handlers/games.d.ts +7 -0
- package/dist/commands-v2/handlers/games.js +57 -0
- package/dist/commands-v2/handlers/index.d.ts +25 -0
- package/dist/commands-v2/handlers/index.js +63 -0
- package/dist/commands-v2/handlers/mcp.d.ts +8 -0
- package/dist/commands-v2/handlers/mcp.js +39 -0
- package/dist/commands-v2/handlers/notifications.d.ts +9 -0
- package/dist/commands-v2/handlers/notifications.js +34 -0
- package/dist/commands-v2/handlers/project.d.ts +22 -0
- package/dist/commands-v2/handlers/project.js +1035 -0
- package/dist/commands-v2/handlers/reset.d.ts +11 -0
- package/dist/commands-v2/handlers/reset.js +118 -0
- package/dist/commands-v2/handlers/session.d.ts +161 -0
- package/dist/commands-v2/handlers/session.js +805 -0
- package/dist/commands-v2/handlers/settings.d.ts +17 -0
- package/dist/commands-v2/handlers/settings.js +417 -0
- package/dist/commands-v2/handlers/tasks.d.ts +5 -0
- package/dist/commands-v2/handlers/tasks.js +36 -0
- package/dist/commands-v2/handlers/team.d.ts +9 -0
- package/dist/commands-v2/handlers/team.js +549 -0
- package/dist/commands-v2/handlers/terminals.d.ts +9 -0
- package/dist/commands-v2/handlers/terminals.js +34 -0
- package/dist/commands-v2/index.d.ts +14 -0
- package/dist/commands-v2/index.js +18 -0
- package/dist/commands-v2/registry.d.ts +52 -0
- package/dist/commands-v2/registry.js +114 -0
- package/dist/commands-v2/types.d.ts +153 -0
- package/dist/commands-v2/types.js +7 -0
- package/dist/commands.js +123 -7
- package/dist/compilr-diff-companion.vsix +0 -0
- package/dist/db/index.js +98 -4
- package/dist/db/repositories/document-repository.d.ts +2 -0
- package/dist/db/repositories/document-repository.js +5 -1
- package/dist/db/repositories/index.d.ts +2 -0
- package/dist/db/repositories/index.js +1 -0
- package/dist/db/repositories/plan-repository.d.ts +101 -0
- package/dist/db/repositories/plan-repository.js +275 -0
- package/dist/db/repositories/project-repository.d.ts +6 -0
- package/dist/db/repositories/project-repository.js +41 -0
- package/dist/db/repositories/work-item-repository.d.ts +15 -0
- package/dist/db/repositories/work-item-repository.js +69 -4
- package/dist/db/schema.d.ts +40 -3
- package/dist/db/schema.js +66 -3
- package/dist/episodes/index.d.ts +20 -0
- package/dist/episodes/index.js +27 -0
- package/dist/episodes/recorder.d.ts +51 -0
- package/dist/episodes/recorder.js +195 -0
- package/dist/episodes/significant-work.d.ts +21 -0
- package/dist/episodes/significant-work.js +56 -0
- package/dist/episodes/store.d.ts +38 -0
- package/dist/episodes/store.js +199 -0
- package/dist/episodes/types.d.ts +35 -0
- package/dist/episodes/types.js +6 -0
- package/dist/episodes/work-at-risk.d.ts +12 -0
- package/dist/episodes/work-at-risk.js +38 -0
- package/dist/episodes/work-summary-anchor.d.ts +23 -0
- package/dist/episodes/work-summary-anchor.js +73 -0
- package/dist/games/coins.d.ts +66 -0
- package/dist/games/coins.js +165 -0
- package/dist/games/game-base.d.ts +84 -0
- package/dist/games/game-base.js +204 -0
- package/dist/games/index.d.ts +16 -0
- package/dist/games/index.js +49 -0
- package/dist/games/scores.d.ts +69 -0
- package/dist/games/scores.js +191 -0
- package/dist/games/tetris/board.d.ts +59 -0
- package/dist/games/tetris/board.js +170 -0
- package/dist/games/tetris/index.d.ts +109 -0
- package/dist/games/tetris/index.js +610 -0
- package/dist/games/tetris/pieces.d.ts +44 -0
- package/dist/games/tetris/pieces.js +271 -0
- package/dist/games/tetris/renderer.d.ts +26 -0
- package/dist/games/tetris/renderer.js +77 -0
- package/dist/guide/guide-content.d.ts +23 -0
- package/dist/guide/guide-content.js +196 -0
- package/dist/guide/index.d.ts +8 -0
- package/dist/guide/index.js +7 -0
- package/dist/guide/shared-content.d.ts +37 -0
- package/dist/guide/shared-content.js +1272 -0
- package/dist/guide/tutorial-helpers.d.ts +57 -0
- package/dist/guide/tutorial-helpers.js +147 -0
- package/dist/handlers/ask-user-handlers.d.ts +32 -0
- package/dist/handlers/ask-user-handlers.js +104 -0
- package/dist/handlers/delegation-handlers.d.ts +34 -0
- package/dist/handlers/delegation-handlers.js +291 -0
- package/dist/handlers/permission-handler.d.ts +30 -0
- package/dist/handlers/permission-handler.js +205 -0
- package/dist/index.d.ts +11 -1
- package/dist/index.js +615 -179
- package/dist/input-handlers/index.d.ts +7 -0
- package/dist/input-handlers/index.js +7 -0
- package/dist/input-handlers/memory-handler.d.ts +26 -0
- package/dist/input-handlers/memory-handler.js +69 -0
- package/dist/models/index.d.ts +10 -0
- package/dist/models/index.js +12 -0
- package/dist/models/model-registry.d.ts +38 -0
- package/dist/models/model-registry.js +69 -0
- package/dist/models/model-tiers.d.ts +28 -0
- package/dist/models/model-tiers.js +71 -0
- package/dist/models/model-validation.d.ts +25 -0
- package/dist/models/model-validation.js +291 -0
- package/dist/models/ollama-models.d.ts +73 -0
- package/dist/models/ollama-models.js +178 -0
- package/dist/models/provider-types.d.ts +6 -0
- package/dist/models/provider-types.js +1 -0
- package/dist/models/providers.d.ts +35 -0
- package/dist/models/providers.js +58 -0
- package/dist/models/types.d.ts +4 -0
- package/dist/models/types.js +4 -0
- package/dist/multi-agent/activity.d.ts +21 -0
- package/dist/multi-agent/activity.js +34 -0
- package/dist/multi-agent/agent-selection.d.ts +55 -0
- package/dist/multi-agent/agent-selection.js +90 -0
- package/dist/multi-agent/artifacts.d.ts +197 -0
- package/dist/multi-agent/artifacts.js +379 -0
- package/dist/multi-agent/checkpointer.d.ts +138 -0
- package/dist/multi-agent/checkpointer.js +471 -0
- package/dist/multi-agent/collision-utils.d.ts +16 -0
- package/dist/multi-agent/collision-utils.js +28 -0
- package/dist/multi-agent/context-resolver.d.ts +97 -0
- package/dist/multi-agent/context-resolver.js +316 -0
- package/dist/multi-agent/custom-agents.d.ts +83 -0
- package/dist/multi-agent/custom-agents.js +227 -0
- package/dist/multi-agent/delegation-tracker.d.ts +157 -0
- package/dist/multi-agent/delegation-tracker.js +243 -0
- package/dist/multi-agent/file-lock-hook.d.ts +29 -0
- package/dist/multi-agent/file-lock-hook.js +97 -0
- package/dist/multi-agent/file-locks.d.ts +58 -0
- package/dist/multi-agent/file-locks.js +194 -0
- package/dist/multi-agent/index.d.ts +24 -0
- package/dist/multi-agent/index.js +30 -0
- package/dist/multi-agent/mention-parser.d.ts +64 -0
- package/dist/multi-agent/mention-parser.js +146 -0
- package/dist/multi-agent/notification-manager.d.ts +84 -0
- package/dist/multi-agent/notification-manager.js +224 -0
- package/dist/multi-agent/pending-requests.d.ts +122 -0
- package/dist/multi-agent/pending-requests.js +155 -0
- package/dist/multi-agent/session-registry.d.ts +139 -0
- package/dist/multi-agent/session-registry.js +514 -0
- package/dist/multi-agent/shared-context.d.ts +293 -0
- package/dist/multi-agent/shared-context.js +671 -0
- package/dist/multi-agent/skill-requirements.d.ts +66 -0
- package/dist/multi-agent/skill-requirements.js +178 -0
- package/dist/multi-agent/task-assignment.d.ts +69 -0
- package/dist/multi-agent/task-assignment.js +123 -0
- package/dist/multi-agent/task-suggestion.d.ts +31 -0
- package/dist/multi-agent/task-suggestion.js +72 -0
- package/dist/multi-agent/team-agent.d.ts +201 -0
- package/dist/multi-agent/team-agent.js +488 -0
- package/dist/multi-agent/team.d.ts +286 -0
- package/dist/multi-agent/team.js +610 -0
- package/dist/multi-agent/tool-config.d.ts +110 -0
- package/dist/multi-agent/tool-config.js +661 -0
- package/dist/multi-agent/types.d.ts +211 -0
- package/dist/multi-agent/types.js +617 -0
- package/dist/prompts/plan-mode-prompt.d.ts +11 -0
- package/dist/prompts/plan-mode-prompt.js +95 -0
- package/dist/repl-helpers.d.ts +63 -0
- package/dist/repl-helpers.js +319 -0
- package/dist/repl-v2.d.ts +554 -0
- package/dist/repl-v2.js +3286 -0
- package/dist/session/index.d.ts +6 -0
- package/dist/session/index.js +6 -0
- package/dist/session/project-session-manager.d.ts +158 -0
- package/dist/session/project-session-manager.js +650 -0
- package/dist/settings/index.d.ts +156 -13
- package/dist/settings/index.js +377 -24
- package/dist/settings/mcp-config.d.ts +76 -0
- package/dist/settings/mcp-config.js +143 -0
- package/dist/settings/paths.d.ts +114 -0
- package/dist/settings/paths.js +270 -0
- package/dist/shared-handlers.d.ts +62 -0
- package/dist/shared-handlers.js +48 -0
- package/dist/system-prompt/builder.d.ts +5 -0
- package/dist/system-prompt/builder.js +4 -0
- package/dist/system-prompt/index.d.ts +18 -0
- package/dist/system-prompt/index.js +18 -0
- package/dist/system-prompt/modules.d.ts +5 -0
- package/dist/system-prompt/modules.js +4 -0
- package/dist/tabbed-menu.js +2 -1
- package/dist/templates/compilr-md-import.d.ts +16 -0
- package/dist/templates/compilr-md-import.js +241 -0
- package/dist/templates/compilr-md.js +10 -58
- package/dist/templates/config-json.d.ts +1 -25
- package/dist/templates/index.d.ts +2 -0
- package/dist/templates/index.js +35 -75
- package/dist/themes/colors.js +3 -1
- package/dist/themes/registry.d.ts +5 -36
- package/dist/themes/registry.js +11 -95
- package/dist/themes/types.d.ts +3 -38
- package/dist/themes/types.js +2 -2
- package/dist/tool-names.d.ts +108 -0
- package/dist/tool-names.js +227 -0
- package/dist/tools/anchor-tools.d.ts +31 -0
- package/dist/tools/anchor-tools.js +255 -0
- package/dist/tools/artifact-tools.d.ts +42 -0
- package/dist/tools/artifact-tools.js +328 -0
- package/dist/tools/ask-user-simple.d.ts +1 -1
- package/dist/tools/ask-user-simple.js +2 -1
- package/dist/tools/ask-user.d.ts +1 -1
- package/dist/tools/ask-user.js +2 -1
- package/dist/tools/backlog-wrappers.d.ts +56 -0
- package/dist/tools/backlog-wrappers.js +353 -0
- package/dist/tools/backlog.d.ts +2 -2
- package/dist/tools/backlog.js +2 -2
- package/dist/tools/db-tools.d.ts +12 -0
- package/dist/tools/db-tools.js +14 -0
- package/dist/tools/delegate-background.d.ts +27 -0
- package/dist/tools/delegate-background.js +115 -0
- package/dist/tools/delegate.d.ts +22 -0
- package/dist/tools/delegate.js +97 -0
- package/dist/tools/delegation-status.d.ts +16 -0
- package/dist/tools/delegation-status.js +128 -0
- package/dist/tools/document-db.d.ts +43 -0
- package/dist/tools/document-db.js +220 -0
- package/dist/tools/guide-tool.d.ts +12 -0
- package/dist/tools/guide-tool.js +59 -0
- package/dist/tools/handoff.d.ts +25 -0
- package/dist/tools/handoff.js +99 -0
- package/dist/tools/meta-tools.d.ts +26 -0
- package/dist/tools/meta-tools.js +47 -0
- package/dist/tools/plan-tools.d.ts +54 -0
- package/dist/tools/plan-tools.js +338 -0
- package/dist/tools/platform-adapter.d.ts +29 -0
- package/dist/tools/platform-adapter.js +394 -0
- package/dist/tools/project-db.d.ts +34 -0
- package/dist/tools/project-db.js +39 -0
- package/dist/tools/recall-work-tool.d.ts +18 -0
- package/dist/tools/recall-work-tool.js +82 -0
- package/dist/tools/workitem-db.d.ts +135 -0
- package/dist/tools/workitem-db.js +730 -0
- package/dist/tools.d.ts +67 -2
- package/dist/tools.js +238 -38
- package/dist/ui/ask-user-overlay.d.ts +2 -2
- package/dist/ui/ask-user-overlay.js +443 -535
- package/dist/ui/ask-user-simple-overlay.d.ts +2 -2
- package/dist/ui/ask-user-simple-overlay.js +182 -209
- package/dist/ui/autocomplete-controller.d.ts +42 -0
- package/dist/ui/autocomplete-controller.js +384 -0
- package/dist/ui/base/index.d.ts +26 -0
- package/dist/ui/base/index.js +33 -0
- package/dist/ui/base/inline-overlay-utils.d.ts +217 -0
- package/dist/ui/base/inline-overlay-utils.js +320 -0
- package/dist/ui/base/inline-overlay.d.ts +159 -0
- package/dist/ui/base/inline-overlay.js +257 -0
- package/dist/ui/base/key-utils.d.ts +15 -0
- package/dist/ui/base/key-utils.js +30 -0
- package/dist/ui/base/overlay-base-v2.d.ts +203 -0
- package/dist/ui/base/overlay-base-v2.js +260 -0
- package/dist/ui/base/overlay-base.d.ts +156 -0
- package/dist/ui/base/overlay-base.js +238 -0
- package/dist/ui/base/overlay-lifecycle.d.ts +65 -0
- package/dist/ui/base/overlay-lifecycle.js +159 -0
- package/dist/ui/base/overlay-types.d.ts +185 -0
- package/dist/ui/base/overlay-types.js +7 -0
- package/dist/ui/base/render-utils.d.ts +27 -0
- package/dist/ui/base/render-utils.js +36 -0
- package/dist/ui/base/screen-stack.d.ts +148 -0
- package/dist/ui/base/screen-stack.js +184 -0
- package/dist/ui/base/tabbed-list-overlay-v2.d.ts +118 -0
- package/dist/ui/base/tabbed-list-overlay-v2.js +335 -0
- package/dist/ui/base/tabbed-list-overlay.d.ts +153 -0
- package/dist/ui/base/tabbed-list-overlay.js +369 -0
- package/dist/ui/constants/labels.d.ts +14 -0
- package/dist/ui/constants/labels.js +51 -0
- package/dist/ui/conversation-store.d.ts +55 -0
- package/dist/ui/conversation-store.js +107 -0
- package/dist/ui/conversation.d.ts +75 -4
- package/dist/ui/conversation.js +376 -165
- package/dist/ui/diff.d.ts +7 -1
- package/dist/ui/diff.js +85 -48
- package/dist/ui/ephemeral.d.ts +1 -1
- package/dist/ui/ephemeral.js +4 -10
- package/dist/ui/features/index.d.ts +34 -0
- package/dist/ui/features/index.js +34 -0
- package/dist/ui/features/input-feature.d.ts +85 -0
- package/dist/ui/features/input-feature.js +238 -0
- package/dist/ui/features/list-feature.d.ts +155 -0
- package/dist/ui/features/list-feature.js +244 -0
- package/dist/ui/features/pagination-feature.d.ts +154 -0
- package/dist/ui/features/pagination-feature.js +238 -0
- package/dist/ui/features/search-feature.d.ts +148 -0
- package/dist/ui/features/search-feature.js +185 -0
- package/dist/ui/features/tab-feature.d.ts +194 -0
- package/dist/ui/features/tab-feature.js +307 -0
- package/dist/ui/file-autocomplete.d.ts +24 -0
- package/dist/ui/file-autocomplete.js +56 -0
- package/dist/ui/footer-renderer.d.ts +69 -0
- package/dist/ui/footer-renderer.js +431 -0
- package/dist/ui/footer.d.ts +181 -7
- package/dist/ui/footer.js +523 -74
- package/dist/ui/guardrail-overlay.d.ts +29 -0
- package/dist/ui/guardrail-overlay.js +145 -0
- package/dist/ui/index.d.ts +1 -1
- package/dist/ui/index.js +1 -3
- package/dist/ui/input-controller.d.ts +51 -0
- package/dist/ui/input-controller.js +176 -0
- package/dist/ui/input-prompt.d.ts +135 -33
- package/dist/ui/input-prompt.js +728 -337
- package/dist/ui/iteration-limit-overlay.d.ts +2 -2
- package/dist/ui/iteration-limit-overlay.js +92 -128
- package/dist/ui/keyboard-handler.d.ts +57 -0
- package/dist/ui/keyboard-handler.js +557 -0
- package/dist/ui/keys-overlay.d.ts +1 -0
- package/dist/ui/keys-overlay.js +203 -141
- package/dist/ui/line-utils.d.ts +88 -0
- package/dist/ui/line-utils.js +150 -0
- package/dist/ui/live-region-facade.d.ts +42 -0
- package/dist/ui/live-region-facade.js +205 -0
- package/dist/ui/live-region.d.ts +157 -0
- package/dist/ui/live-region.js +379 -0
- package/dist/ui/mascot/expressions.d.ts +32 -0
- package/dist/ui/mascot/expressions.js +213 -0
- package/dist/ui/mascot/index.d.ts +8 -0
- package/dist/ui/mascot/index.js +8 -0
- package/dist/ui/mascot/renderer.d.ts +19 -0
- package/dist/ui/mascot/renderer.js +132 -0
- package/dist/ui/overlay/data/tutorial-content.d.ts +9 -0
- package/dist/ui/overlay/data/tutorial-content.js +9 -0
- package/dist/ui/overlay/data/tutorial-registry.d.ts +12 -0
- package/dist/ui/overlay/data/tutorial-registry.js +116 -0
- package/dist/ui/overlay/data/tutorial-types.d.ts +35 -0
- package/dist/ui/overlay/data/tutorial-types.js +6 -0
- package/dist/ui/overlay/data/tutorials/basics/first-conversation.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/basics/first-conversation.js +220 -0
- package/dist/ui/overlay/data/tutorials/basics/first-project.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/basics/first-project.js +284 -0
- package/dist/ui/overlay/data/tutorials/basics/navigation.d.ts +8 -0
- package/dist/ui/overlay/data/tutorials/basics/navigation.js +22 -0
- package/dist/ui/overlay/data/tutorials/basics/welcome.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/basics/welcome.js +174 -0
- package/dist/ui/overlay/data/tutorials/config/context-management.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/config/context-management.js +158 -0
- package/dist/ui/overlay/data/tutorials/config/mcp-servers.d.ts +8 -0
- package/dist/ui/overlay/data/tutorials/config/mcp-servers.js +155 -0
- package/dist/ui/overlay/data/tutorials/config/model-selection.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/config/model-selection.js +162 -0
- package/dist/ui/overlay/data/tutorials/config/permissions-safety.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/config/permissions-safety.js +163 -0
- package/dist/ui/overlay/data/tutorials/config/settings-config.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/config/settings-config.js +166 -0
- package/dist/ui/overlay/data/tutorials/planning/arch.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/planning/arch.js +168 -0
- package/dist/ui/overlay/data/tutorials/planning/backlog.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/planning/backlog.js +103 -0
- package/dist/ui/overlay/data/tutorials/planning/build.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/planning/build.js +173 -0
- package/dist/ui/overlay/data/tutorials/planning/design.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/planning/design.js +205 -0
- package/dist/ui/overlay/data/tutorials/planning/docs.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/planning/docs.js +143 -0
- package/dist/ui/overlay/data/tutorials/planning/prd.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/planning/prd.js +173 -0
- package/dist/ui/overlay/data/tutorials/planning/scaffold.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/planning/scaffold.js +164 -0
- package/dist/ui/overlay/data/tutorials/planning/sketch.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/planning/sketch.js +58 -0
- package/dist/ui/overlay/data/tutorials/projects/anchors.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/projects/anchors.js +248 -0
- package/dist/ui/overlay/data/tutorials/projects/import-project.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/projects/import-project.js +172 -0
- package/dist/ui/overlay/data/tutorials/projects/managing-projects.d.ts +8 -0
- package/dist/ui/overlay/data/tutorials/projects/managing-projects.js +212 -0
- package/dist/ui/overlay/data/tutorials/projects/new-project.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/projects/new-project.js +251 -0
- package/dist/ui/overlay/data/tutorials/projects/session-management.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/projects/session-management.js +169 -0
- package/dist/ui/overlay/data/tutorials/teams/background-execution.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/teams/background-execution.js +171 -0
- package/dist/ui/overlay/data/tutorials/teams/multi-terminal.d.ts +8 -0
- package/dist/ui/overlay/data/tutorials/teams/multi-terminal.js +147 -0
- package/dist/ui/overlay/data/tutorials/teams/task-assignment.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/teams/task-assignment.js +204 -0
- package/dist/ui/overlay/data/tutorials/teams/team-overview.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/teams/team-overview.js +165 -0
- package/dist/ui/overlay/data/tutorials/teams/working-with-agents.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/teams/working-with-agents.js +172 -0
- package/dist/ui/overlay/impl/agents-overlay-v2.d.ts +45 -0
- package/dist/ui/overlay/impl/agents-overlay-v2.js +814 -0
- package/dist/ui/overlay/impl/anchors-overlay-v2.d.ts +47 -0
- package/dist/ui/overlay/impl/anchors-overlay-v2.js +749 -0
- package/dist/ui/overlay/impl/arch-type-overlay-v2.d.ts +37 -0
- package/dist/ui/overlay/impl/arch-type-overlay-v2.js +240 -0
- package/dist/ui/overlay/impl/artifact-detail-overlay-v2.d.ts +43 -0
- package/dist/ui/overlay/impl/artifact-detail-overlay-v2.js +232 -0
- package/dist/ui/overlay/impl/artifact-overlay-v2.d.ts +40 -0
- package/dist/ui/overlay/impl/artifact-overlay-v2.js +115 -0
- package/dist/ui/overlay/impl/ask-user-overlay-v2.d.ts +72 -0
- package/dist/ui/overlay/impl/ask-user-overlay-v2.js +581 -0
- package/dist/ui/overlay/impl/ask-user-simple-overlay-v2.d.ts +46 -0
- package/dist/ui/overlay/impl/ask-user-simple-overlay-v2.js +204 -0
- package/dist/ui/overlay/impl/background-overlay-v2.d.ts +40 -0
- package/dist/ui/overlay/impl/background-overlay-v2.js +147 -0
- package/dist/ui/overlay/impl/backlog-overlay-v2.d.ts +52 -0
- package/dist/ui/overlay/impl/backlog-overlay-v2.js +681 -0
- package/dist/ui/overlay/impl/changelog-overlay-v2.d.ts +44 -0
- package/dist/ui/overlay/impl/changelog-overlay-v2.js +165 -0
- package/dist/ui/overlay/impl/commands-overlay-v2.d.ts +33 -0
- package/dist/ui/overlay/impl/commands-overlay-v2.js +439 -0
- package/dist/ui/overlay/impl/config-overlay-v2.d.ts +111 -0
- package/dist/ui/overlay/impl/config-overlay-v2.js +718 -0
- package/dist/ui/overlay/impl/custom-agent-form-overlay-v2.d.ts +83 -0
- package/dist/ui/overlay/impl/custom-agent-form-overlay-v2.js +711 -0
- package/dist/ui/overlay/impl/dashboard-overlay-v2.d.ts +57 -0
- package/dist/ui/overlay/impl/dashboard-overlay-v2.js +382 -0
- package/dist/ui/overlay/impl/delegations-overlay-v2.d.ts +28 -0
- package/dist/ui/overlay/impl/delegations-overlay-v2.js +279 -0
- package/dist/ui/overlay/impl/docs-overlay-v2.d.ts +45 -0
- package/dist/ui/overlay/impl/docs-overlay-v2.js +117 -0
- package/dist/ui/overlay/impl/document-detail-overlay-v2.d.ts +84 -0
- package/dist/ui/overlay/impl/document-detail-overlay-v2.js +1112 -0
- package/dist/ui/overlay/impl/filter-overlay-v2.d.ts +41 -0
- package/dist/ui/overlay/impl/filter-overlay-v2.js +110 -0
- package/dist/ui/overlay/impl/games-overlay-v2.d.ts +31 -0
- package/dist/ui/overlay/impl/games-overlay-v2.js +135 -0
- package/dist/ui/overlay/impl/guardrail-overlay-v2.d.ts +43 -0
- package/dist/ui/overlay/impl/guardrail-overlay-v2.js +114 -0
- package/dist/ui/overlay/impl/help-overlay-v2.d.ts +57 -0
- package/dist/ui/overlay/impl/help-overlay-v2.js +287 -0
- package/dist/ui/overlay/impl/init-setup-overlay-v2.d.ts +25 -0
- package/dist/ui/overlay/impl/init-setup-overlay-v2.js +97 -0
- package/dist/ui/overlay/impl/iteration-limit-overlay-v2.d.ts +35 -0
- package/dist/ui/overlay/impl/iteration-limit-overlay-v2.js +105 -0
- package/dist/ui/overlay/impl/keys-overlay-v2.d.ts +41 -0
- package/dist/ui/overlay/impl/keys-overlay-v2.js +248 -0
- package/dist/ui/overlay/impl/login-overlay-v2.d.ts +49 -0
- package/dist/ui/overlay/impl/login-overlay-v2.js +277 -0
- package/dist/ui/overlay/impl/mascot-overlay-v2.d.ts +41 -0
- package/dist/ui/overlay/impl/mascot-overlay-v2.js +138 -0
- package/dist/ui/overlay/impl/mcp-overlay-v2.d.ts +63 -0
- package/dist/ui/overlay/impl/mcp-overlay-v2.js +907 -0
- package/dist/ui/overlay/impl/model-overlay-v2.d.ts +93 -0
- package/dist/ui/overlay/impl/model-overlay-v2.js +1143 -0
- package/dist/ui/overlay/impl/model-warning-overlay-v2.d.ts +46 -0
- package/dist/ui/overlay/impl/model-warning-overlay-v2.js +132 -0
- package/dist/ui/overlay/impl/new-overlay-v2.d.ts +108 -0
- package/dist/ui/overlay/impl/new-overlay-v2.js +1243 -0
- package/dist/ui/overlay/impl/notifications-overlay-v2.d.ts +20 -0
- package/dist/ui/overlay/impl/notifications-overlay-v2.js +116 -0
- package/dist/ui/overlay/impl/onboarding-wizard-overlay-v2.d.ts +76 -0
- package/dist/ui/overlay/impl/onboarding-wizard-overlay-v2.js +728 -0
- package/dist/ui/overlay/impl/pending-overlay-v2.d.ts +51 -0
- package/dist/ui/overlay/impl/pending-overlay-v2.js +445 -0
- package/dist/ui/overlay/impl/permission-overlay-v2.d.ts +36 -0
- package/dist/ui/overlay/impl/permission-overlay-v2.js +380 -0
- package/dist/ui/overlay/impl/permissions-overlay-v2.d.ts +85 -0
- package/dist/ui/overlay/impl/permissions-overlay-v2.js +820 -0
- package/dist/ui/overlay/impl/plan-approval-overlay-v2.d.ts +35 -0
- package/dist/ui/overlay/impl/plan-approval-overlay-v2.js +181 -0
- package/dist/ui/overlay/impl/project-edit-overlay-v2.d.ts +36 -0
- package/dist/ui/overlay/impl/project-edit-overlay-v2.js +195 -0
- package/dist/ui/overlay/impl/projects-overlay-v2.d.ts +37 -0
- package/dist/ui/overlay/impl/projects-overlay-v2.js +733 -0
- package/dist/ui/overlay/impl/reset-overlay-v2.d.ts +39 -0
- package/dist/ui/overlay/impl/reset-overlay-v2.js +107 -0
- package/dist/ui/overlay/impl/resume-overlay-v2.d.ts +60 -0
- package/dist/ui/overlay/impl/resume-overlay-v2.js +414 -0
- package/dist/ui/overlay/impl/session-mode-overlay-v2.d.ts +43 -0
- package/dist/ui/overlay/impl/session-mode-overlay-v2.js +124 -0
- package/dist/ui/overlay/impl/tasks-overlay-v2.d.ts +28 -0
- package/dist/ui/overlay/impl/tasks-overlay-v2.js +283 -0
- package/dist/ui/overlay/impl/team-overlay-v2.d.ts +86 -0
- package/dist/ui/overlay/impl/team-overlay-v2.js +692 -0
- package/dist/ui/overlay/impl/terminals-overlay-v2.d.ts +26 -0
- package/dist/ui/overlay/impl/terminals-overlay-v2.js +217 -0
- package/dist/ui/overlay/impl/theme-overlay-v2.d.ts +42 -0
- package/dist/ui/overlay/impl/theme-overlay-v2.js +135 -0
- package/dist/ui/overlay/impl/tools-overlay-v2.d.ts +47 -0
- package/dist/ui/overlay/impl/tools-overlay-v2.js +214 -0
- package/dist/ui/overlay/impl/tutorial-overlay-v2.d.ts +45 -0
- package/dist/ui/overlay/impl/tutorial-overlay-v2.js +212 -0
- package/dist/ui/overlay/impl/workflow-overlay-v2.d.ts +80 -0
- package/dist/ui/overlay/impl/workflow-overlay-v2.js +641 -0
- package/dist/ui/overlay/index.d.ts +52 -0
- package/dist/ui/overlay/index.js +54 -0
- package/dist/ui/overlay/key-utils.d.ts +6 -0
- package/dist/ui/overlay/key-utils.js +6 -0
- package/dist/ui/overlay/types.d.ts +140 -0
- package/dist/ui/overlay/types.js +22 -0
- package/dist/ui/overlay-manager.d.ts +43 -0
- package/dist/ui/overlay-manager.js +238 -0
- package/dist/ui/overlays.d.ts +0 -4
- package/dist/ui/overlays.js +4 -460
- package/dist/ui/permission-overlay.d.ts +1 -1
- package/dist/ui/permission-overlay.js +189 -300
- package/dist/ui/providers/types.d.ts +178 -0
- package/dist/ui/providers/types.js +9 -0
- package/dist/ui/render-modes.d.ts +36 -0
- package/dist/ui/render-modes.js +44 -0
- package/dist/ui/startup-menu.d.ts +36 -0
- package/dist/ui/startup-menu.js +236 -0
- package/dist/ui/status-bar-controller.d.ts +33 -0
- package/dist/ui/status-bar-controller.js +99 -0
- package/dist/ui/subagent-renderer.d.ts +117 -0
- package/dist/ui/subagent-renderer.js +318 -0
- package/dist/ui/terminal-autocomplete-utils.d.ts +23 -0
- package/dist/ui/terminal-autocomplete-utils.js +83 -0
- package/dist/ui/terminal-codes.d.ts +94 -0
- package/dist/ui/terminal-codes.js +124 -0
- package/dist/ui/terminal-line-builders.d.ts +17 -0
- package/dist/ui/terminal-line-builders.js +42 -0
- package/dist/ui/terminal-render-item.d.ts +16 -0
- package/dist/ui/terminal-render-item.js +267 -0
- package/dist/ui/terminal-renderer.d.ts +220 -0
- package/dist/ui/terminal-renderer.js +750 -0
- package/dist/ui/terminal-types.d.ts +179 -0
- package/dist/ui/terminal-types.js +34 -0
- package/dist/ui/terminal-ui.d.ts +331 -0
- package/dist/ui/terminal-ui.js +819 -0
- package/dist/ui/terminal.d.ts +20 -0
- package/dist/ui/terminal.js +72 -0
- package/dist/ui/todo-zone.d.ts +19 -1
- package/dist/ui/todo-zone.js +124 -38
- package/dist/ui/tool-formatters.d.ts +16 -0
- package/dist/ui/tool-formatters.js +1027 -0
- package/dist/ui/turn-metrics.d.ts +56 -0
- package/dist/ui/turn-metrics.js +75 -0
- package/dist/ui/types.d.ts +28 -0
- package/dist/ui/types.js +1 -0
- package/dist/ui/vscode-diff-ipc.d.ts +102 -0
- package/dist/ui/vscode-diff-ipc.js +385 -0
- package/dist/utils/credentials.d.ts +24 -5
- package/dist/utils/credentials.js +123 -9
- package/dist/utils/debug-log.d.ts +28 -0
- package/dist/utils/debug-log.js +57 -0
- package/dist/utils/format-tokens.d.ts +13 -0
- package/dist/utils/format-tokens.js +18 -0
- package/dist/utils/git-config.d.ts +26 -0
- package/dist/utils/git-config.js +54 -0
- package/dist/utils/message-utils.d.ts +61 -0
- package/dist/utils/message-utils.js +72 -0
- package/dist/utils/model-tiers.d.ts +8 -1
- package/dist/utils/model-tiers.js +39 -17
- package/dist/utils/open-browser.d.ts +5 -0
- package/dist/utils/open-browser.js +32 -0
- package/dist/utils/path-safety.d.ts +56 -0
- package/dist/utils/path-safety.js +240 -0
- package/dist/utils/project-detection.d.ts +58 -0
- package/dist/utils/project-detection.js +424 -0
- package/dist/utils/project-memory.js +2 -1
- package/dist/utils/project-status.d.ts +2 -2
- package/dist/utils/startup-perf.d.ts +18 -0
- package/dist/utils/startup-perf.js +60 -0
- package/dist/utils/token-tracker.d.ts +62 -0
- package/dist/utils/token-tracker.js +150 -0
- package/dist/utils/token-types.d.ts +23 -0
- package/dist/utils/token-types.js +18 -0
- package/dist/utils/types/config-types.d.ts +32 -0
- package/dist/utils/types/config-types.js +8 -0
- package/dist/utils/update-checker.d.ts +28 -0
- package/dist/utils/update-checker.js +106 -0
- package/dist/utils/version.d.ts +7 -0
- package/dist/utils/version.js +10 -0
- package/dist/utils/vscode-detect.d.ts +39 -0
- package/dist/utils/vscode-detect.js +137 -0
- package/dist/workflow/guided-mode-injector.d.ts +42 -0
- package/dist/workflow/guided-mode-injector.js +191 -0
- package/dist/workflow/index.d.ts +8 -0
- package/dist/workflow/index.js +8 -0
- package/dist/workflow/step-criteria.d.ts +62 -0
- package/dist/workflow/step-criteria.js +150 -0
- package/dist/workflow/step-tracker.d.ts +92 -0
- package/dist/workflow/step-tracker.js +141 -0
- package/package.json +32 -12
- package/dist/index.old.d.ts +0 -7
- package/dist/index.old.js +0 -1014
- package/dist/repl.d.ts +0 -121
- package/dist/repl.js +0 -1878
- package/dist/templates/claude-md.d.ts +0 -7
- package/dist/templates/claude-md.js +0 -189
- package/dist/test-autocomplete.d.ts +0 -7
- package/dist/test-autocomplete.js +0 -85
- package/dist/test-tabbed-menu.d.ts +0 -7
- package/dist/test-tabbed-menu.js +0 -25
- package/dist/tool-selector.d.ts +0 -71
- package/dist/tool-selector.js +0 -184
- package/dist/ui/agents-overlay.d.ts +0 -12
- package/dist/ui/agents-overlay.js +0 -501
- package/dist/ui/arch-type-overlay.d.ts +0 -20
- package/dist/ui/arch-type-overlay.js +0 -229
- package/dist/ui/backlog-overlay.d.ts +0 -17
- package/dist/ui/backlog-overlay.js +0 -786
- package/dist/ui/commands-overlay.d.ts +0 -11
- package/dist/ui/commands-overlay.js +0 -410
- package/dist/ui/config-overlay.d.ts +0 -34
- package/dist/ui/config-overlay.js +0 -977
- package/dist/ui/init-overlay.d.ts +0 -24
- package/dist/ui/init-overlay.js +0 -525
- package/dist/ui/input-prompt-v2.d.ts +0 -179
- package/dist/ui/input-prompt-v2.js +0 -991
- package/dist/ui/model-warning-overlay.d.ts +0 -30
- package/dist/ui/model-warning-overlay.js +0 -171
- package/dist/ui/tools-overlay.d.ts +0 -26
- package/dist/ui/tools-overlay.js +0 -278
- package/dist/ui/tutorial-overlay.d.ts +0 -10
- package/dist/ui/tutorial-overlay.js +0 -936
|
@@ -0,0 +1,545 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth Manager Module
|
|
3
|
+
*
|
|
4
|
+
* Singleton authentication manager for the CLI.
|
|
5
|
+
* Handles login, logout, token refresh, and session management.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* const auth = getAuthManager();
|
|
9
|
+
* if (!await auth.isAuthenticated()) {
|
|
10
|
+
* // Show login prompt
|
|
11
|
+
* }
|
|
12
|
+
*/
|
|
13
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
14
|
+
import * as os from 'os';
|
|
15
|
+
import { loadAuthData, saveAuthData, clearAuthData, updateSession, hasAuthData, checkAuthFilePermissions, } from './storage.js';
|
|
16
|
+
import { refreshToken as apiRefreshToken, sendHeartbeat, getProfile, updateProfile, requestDeviceCode, pollDeviceToken, getAuthorizationUrl, } from './api-client.js';
|
|
17
|
+
import { isTelemetryEnabled } from '../settings/index.js';
|
|
18
|
+
import * as fs from 'fs';
|
|
19
|
+
import * as path from 'path';
|
|
20
|
+
// Get version from package.json to avoid circular import with index.ts
|
|
21
|
+
function getVersion() {
|
|
22
|
+
try {
|
|
23
|
+
const dir = path.dirname(new URL(import.meta.url).pathname);
|
|
24
|
+
const pkgPath = path.join(dir, '../../package.json');
|
|
25
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
|
|
26
|
+
return pkg.version;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return '0.0.0';
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// =============================================================================
|
|
33
|
+
// Auth Manager Class
|
|
34
|
+
// =============================================================================
|
|
35
|
+
class AuthManager {
|
|
36
|
+
authData = null;
|
|
37
|
+
profileData = null;
|
|
38
|
+
sessionInfo = null;
|
|
39
|
+
heartbeatInterval = null;
|
|
40
|
+
constructor() {
|
|
41
|
+
// Load cached auth data
|
|
42
|
+
this.authData = loadAuthData();
|
|
43
|
+
// Check for insecure permissions
|
|
44
|
+
const warning = checkAuthFilePermissions();
|
|
45
|
+
if (warning) {
|
|
46
|
+
console.warn(warning);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// ===========================================================================
|
|
50
|
+
// Authentication Status
|
|
51
|
+
// ===========================================================================
|
|
52
|
+
/**
|
|
53
|
+
* Check if user is authenticated with a valid session.
|
|
54
|
+
*
|
|
55
|
+
* If an API token (tok_xxx) is present, authentication is immediate —
|
|
56
|
+
* no expiry check or refresh needed (server validates on each call).
|
|
57
|
+
*
|
|
58
|
+
* Falls back to JWT refresh for pre-v2 users who don't have an API token yet.
|
|
59
|
+
*/
|
|
60
|
+
async isAuthenticated() {
|
|
61
|
+
if (!this.authData) {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
// API token: server validates on each request, no local expiry check needed
|
|
65
|
+
if (this.authData.session.apiToken) {
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
// Legacy JWT fallback: check expiry and refresh if needed
|
|
69
|
+
const expiresAt = new Date(this.authData.session.expiresAt);
|
|
70
|
+
const now = new Date();
|
|
71
|
+
// If token expires in less than 5 minutes, try to refresh
|
|
72
|
+
const fiveMinutes = 5 * 60 * 1000;
|
|
73
|
+
if (expiresAt.getTime() - now.getTime() < fiveMinutes) {
|
|
74
|
+
const refreshed = await this.refreshToken();
|
|
75
|
+
if (!refreshed) {
|
|
76
|
+
// Refresh failed — clear in-memory state but preserve auth.json on disk.
|
|
77
|
+
// The refresh token may still be valid (transient error, cold start, etc.)
|
|
78
|
+
// Only explicit logout() should delete stored credentials.
|
|
79
|
+
this.authData = null;
|
|
80
|
+
this.profileData = null;
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Check if any auth data exists (quick check without validation).
|
|
88
|
+
*/
|
|
89
|
+
hasStoredAuth() {
|
|
90
|
+
return hasAuthData();
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get cached email from local auth data (no network call).
|
|
94
|
+
* Returns null if not authenticated.
|
|
95
|
+
*/
|
|
96
|
+
getEmail() {
|
|
97
|
+
return this.authData?.user.email ?? null;
|
|
98
|
+
}
|
|
99
|
+
// ===========================================================================
|
|
100
|
+
// User Operations
|
|
101
|
+
// ===========================================================================
|
|
102
|
+
/**
|
|
103
|
+
* Get the current user.
|
|
104
|
+
* Throws if not authenticated.
|
|
105
|
+
*/
|
|
106
|
+
async getUser() {
|
|
107
|
+
if (!await this.isAuthenticated()) {
|
|
108
|
+
throw new Error('Not authenticated');
|
|
109
|
+
}
|
|
110
|
+
// After isAuthenticated(), authData is guaranteed to exist
|
|
111
|
+
const authData = this.authData;
|
|
112
|
+
if (!authData) {
|
|
113
|
+
throw new Error('Authentication state inconsistent');
|
|
114
|
+
}
|
|
115
|
+
// Return cached user if available
|
|
116
|
+
if (this.profileData) {
|
|
117
|
+
return {
|
|
118
|
+
id: authData.user.id,
|
|
119
|
+
email: authData.user.email,
|
|
120
|
+
accountType: this.profileData.account_type,
|
|
121
|
+
createdAt: new Date(authData.user.createdAt),
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
// Fetch profile to get account type
|
|
125
|
+
await this.fetchProfile();
|
|
126
|
+
// Get account type from fetched profile
|
|
127
|
+
// Cast to work around TypeScript control flow narrowing issue
|
|
128
|
+
const profile = this.profileData;
|
|
129
|
+
return {
|
|
130
|
+
id: authData.user.id,
|
|
131
|
+
email: authData.user.email,
|
|
132
|
+
accountType: profile?.account_type ?? 'free',
|
|
133
|
+
createdAt: new Date(authData.user.createdAt),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Get the access token (auto-refreshes if needed).
|
|
138
|
+
* Prefers API token (tok_xxx) over JWT when available.
|
|
139
|
+
*/
|
|
140
|
+
async getAccessToken() {
|
|
141
|
+
if (!await this.isAuthenticated()) {
|
|
142
|
+
throw new Error('Not authenticated');
|
|
143
|
+
}
|
|
144
|
+
const authData = this.authData;
|
|
145
|
+
if (!authData) {
|
|
146
|
+
throw new Error('Authentication state inconsistent');
|
|
147
|
+
}
|
|
148
|
+
// Prefer long-lived API token over short-lived JWT
|
|
149
|
+
return authData.session.apiToken ?? authData.session.accessToken;
|
|
150
|
+
}
|
|
151
|
+
// ===========================================================================
|
|
152
|
+
// Login / Logout
|
|
153
|
+
// ===========================================================================
|
|
154
|
+
/**
|
|
155
|
+
* Login using device flow (browser-based authentication).
|
|
156
|
+
* This is the recommended way to authenticate the CLI.
|
|
157
|
+
*
|
|
158
|
+
* @param callbacks - Callbacks for progress updates
|
|
159
|
+
* @param signal - AbortSignal for cancellation
|
|
160
|
+
*/
|
|
161
|
+
async loginWithDeviceFlow(callbacks, signal) {
|
|
162
|
+
// Step 1: Request device code
|
|
163
|
+
const codeResult = await requestDeviceCode();
|
|
164
|
+
if (!codeResult.success || !codeResult.data) {
|
|
165
|
+
return {
|
|
166
|
+
success: false,
|
|
167
|
+
error: codeResult.error ?? 'Failed to get device code',
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
const { device_code, user_code, expires_in, interval } = codeResult.data;
|
|
171
|
+
// Use client-side URL (respects COMPILR_WEB_URL env var for testing)
|
|
172
|
+
const authUrl = getAuthorizationUrl(user_code);
|
|
173
|
+
// Step 2: Notify callback with code and URL
|
|
174
|
+
callbacks.onCodeReady(user_code, authUrl);
|
|
175
|
+
// Step 3: Try to open browser
|
|
176
|
+
if (callbacks.onOpenBrowser) {
|
|
177
|
+
await callbacks.onOpenBrowser(authUrl);
|
|
178
|
+
}
|
|
179
|
+
// Step 4: Poll for token
|
|
180
|
+
const startTime = Date.now();
|
|
181
|
+
const expiresAt = startTime + (expires_in * 1000);
|
|
182
|
+
let pollInterval = interval * 1000; // Convert to milliseconds
|
|
183
|
+
while (Date.now() < expiresAt) {
|
|
184
|
+
// Check for cancellation
|
|
185
|
+
if (signal?.aborted) {
|
|
186
|
+
return {
|
|
187
|
+
success: false,
|
|
188
|
+
error: 'Login cancelled',
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
// Wait before polling (with cancellation support)
|
|
192
|
+
const cancelled = await new Promise((resolve) => {
|
|
193
|
+
const timeout = setTimeout(() => {
|
|
194
|
+
cleanup();
|
|
195
|
+
resolve(false);
|
|
196
|
+
}, pollInterval);
|
|
197
|
+
const onAbort = () => {
|
|
198
|
+
clearTimeout(timeout);
|
|
199
|
+
resolve(true);
|
|
200
|
+
};
|
|
201
|
+
const cleanup = () => {
|
|
202
|
+
signal?.removeEventListener('abort', onAbort);
|
|
203
|
+
};
|
|
204
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
205
|
+
});
|
|
206
|
+
if (cancelled || signal?.aborted) {
|
|
207
|
+
return {
|
|
208
|
+
success: false,
|
|
209
|
+
error: 'Login cancelled',
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
// Poll for token
|
|
213
|
+
callbacks.onStatusUpdate?.('polling');
|
|
214
|
+
const tokenResult = await pollDeviceToken(device_code);
|
|
215
|
+
if (tokenResult.success && tokenResult.data) {
|
|
216
|
+
// Success! Save the tokens
|
|
217
|
+
callbacks.onStatusUpdate?.('authorized');
|
|
218
|
+
const { access_token, refresh_token, api_token, expires_in: tokenExpiresIn, user } = tokenResult.data;
|
|
219
|
+
const expiresAt = new Date(Date.now() + (tokenExpiresIn * 1000)).toISOString();
|
|
220
|
+
const authData = {
|
|
221
|
+
version: 1,
|
|
222
|
+
user: {
|
|
223
|
+
id: user.id,
|
|
224
|
+
email: user.email,
|
|
225
|
+
createdAt: new Date().toISOString(), // We don't get this from device flow
|
|
226
|
+
},
|
|
227
|
+
session: {
|
|
228
|
+
accessToken: access_token,
|
|
229
|
+
refreshToken: refresh_token,
|
|
230
|
+
expiresAt,
|
|
231
|
+
apiToken: api_token, // Long-lived CLI token (tok_xxx)
|
|
232
|
+
},
|
|
233
|
+
};
|
|
234
|
+
saveAuthData(authData);
|
|
235
|
+
this.authData = authData;
|
|
236
|
+
// Fetch profile to get account type
|
|
237
|
+
await this.fetchProfile();
|
|
238
|
+
return {
|
|
239
|
+
success: true,
|
|
240
|
+
user: {
|
|
241
|
+
id: user.id,
|
|
242
|
+
email: user.email,
|
|
243
|
+
accountType: this.profileData?.account_type ?? 'free',
|
|
244
|
+
createdAt: new Date(),
|
|
245
|
+
},
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
// Handle errors
|
|
249
|
+
if (tokenResult.error) {
|
|
250
|
+
switch (tokenResult.error.error) {
|
|
251
|
+
case 'authorization_pending':
|
|
252
|
+
// Keep polling
|
|
253
|
+
continue;
|
|
254
|
+
case 'slow_down':
|
|
255
|
+
// Increase poll interval
|
|
256
|
+
pollInterval = Math.min(pollInterval + 5000, 30000);
|
|
257
|
+
continue;
|
|
258
|
+
case 'expired_token':
|
|
259
|
+
callbacks.onStatusUpdate?.('expired');
|
|
260
|
+
return {
|
|
261
|
+
success: false,
|
|
262
|
+
error: 'Authorization expired. Please try again.',
|
|
263
|
+
};
|
|
264
|
+
case 'access_denied':
|
|
265
|
+
callbacks.onStatusUpdate?.('denied');
|
|
266
|
+
return {
|
|
267
|
+
success: false,
|
|
268
|
+
error: 'Authorization denied.',
|
|
269
|
+
};
|
|
270
|
+
default:
|
|
271
|
+
return {
|
|
272
|
+
success: false,
|
|
273
|
+
error: tokenResult.error.error_description,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
// Network error - retry
|
|
278
|
+
if (tokenResult.networkError) {
|
|
279
|
+
// Wait a bit longer on network errors
|
|
280
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
// Expired
|
|
285
|
+
callbacks.onStatusUpdate?.('expired');
|
|
286
|
+
return {
|
|
287
|
+
success: false,
|
|
288
|
+
error: 'Authorization timed out. Please try again.',
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Logout (clear local session).
|
|
293
|
+
* Tokens expire naturally (1 hour). No server call needed.
|
|
294
|
+
*/
|
|
295
|
+
logout() {
|
|
296
|
+
// Stop heartbeat
|
|
297
|
+
this.stopHeartbeat();
|
|
298
|
+
// Clear local data
|
|
299
|
+
clearAuthData();
|
|
300
|
+
this.authData = null;
|
|
301
|
+
this.profileData = null;
|
|
302
|
+
this.sessionInfo = null;
|
|
303
|
+
}
|
|
304
|
+
// ===========================================================================
|
|
305
|
+
// Token Management
|
|
306
|
+
// ===========================================================================
|
|
307
|
+
/**
|
|
308
|
+
* Refresh the access token using the refresh token.
|
|
309
|
+
* Calls the server-side Netlify function (no direct Supabase SDK).
|
|
310
|
+
*/
|
|
311
|
+
async refreshToken() {
|
|
312
|
+
if (!this.authData?.session.refreshToken) {
|
|
313
|
+
return false;
|
|
314
|
+
}
|
|
315
|
+
const result = await apiRefreshToken(this.authData.session.refreshToken);
|
|
316
|
+
if (!result.success || !result.access_token || !result.refresh_token) {
|
|
317
|
+
// Debug: log refresh failure details
|
|
318
|
+
console.error('[auth] Token refresh failed:', result.error ?? 'missing token fields');
|
|
319
|
+
console.error('[auth] API_BASE_URL:', process.env.COMPILR_API_URL ?? '(not set, using compilr.dev)');
|
|
320
|
+
return false;
|
|
321
|
+
}
|
|
322
|
+
// Calculate expiry from expires_in (seconds), default to 1 hour
|
|
323
|
+
const expiresIn = result.expires_in ?? 3600;
|
|
324
|
+
const expiresAt = new Date(Date.now() + expiresIn * 1000).toISOString();
|
|
325
|
+
const newSession = {
|
|
326
|
+
accessToken: result.access_token,
|
|
327
|
+
refreshToken: result.refresh_token,
|
|
328
|
+
expiresAt,
|
|
329
|
+
};
|
|
330
|
+
updateSession(newSession);
|
|
331
|
+
this.authData.session = newSession;
|
|
332
|
+
return true;
|
|
333
|
+
}
|
|
334
|
+
// ===========================================================================
|
|
335
|
+
// Profile Management
|
|
336
|
+
// ===========================================================================
|
|
337
|
+
/**
|
|
338
|
+
* Get the best available token for API calls.
|
|
339
|
+
* Prefers API token (tok_xxx) over short-lived JWT.
|
|
340
|
+
*/
|
|
341
|
+
getBestToken() {
|
|
342
|
+
if (!this.authData)
|
|
343
|
+
return null;
|
|
344
|
+
return this.authData.session.apiToken ?? this.authData.session.accessToken;
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Fetch user profile from server.
|
|
348
|
+
*/
|
|
349
|
+
async fetchProfile() {
|
|
350
|
+
const token = this.getBestToken();
|
|
351
|
+
if (!token)
|
|
352
|
+
return;
|
|
353
|
+
const result = await getProfile(token);
|
|
354
|
+
if (result.success && result.profile) {
|
|
355
|
+
this.profileData = result.profile;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Get cached profile data.
|
|
360
|
+
*/
|
|
361
|
+
getProfile() {
|
|
362
|
+
return this.profileData;
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Update profile settings on server.
|
|
366
|
+
*/
|
|
367
|
+
async updateProfileSettings(updates) {
|
|
368
|
+
if (!await this.isAuthenticated()) {
|
|
369
|
+
return false;
|
|
370
|
+
}
|
|
371
|
+
const token = this.getBestToken();
|
|
372
|
+
if (!token) {
|
|
373
|
+
return false;
|
|
374
|
+
}
|
|
375
|
+
const result = await updateProfile(token, updates);
|
|
376
|
+
if (result.success && result.profile) {
|
|
377
|
+
this.profileData = result.profile;
|
|
378
|
+
}
|
|
379
|
+
return result.success;
|
|
380
|
+
}
|
|
381
|
+
// ===========================================================================
|
|
382
|
+
// Session / Telemetry
|
|
383
|
+
// ===========================================================================
|
|
384
|
+
/**
|
|
385
|
+
* Start a new CLI session and begin heartbeat.
|
|
386
|
+
*/
|
|
387
|
+
async startSession(projectId) {
|
|
388
|
+
this.sessionInfo = {
|
|
389
|
+
sessionId: uuidv4(),
|
|
390
|
+
startedAt: new Date(),
|
|
391
|
+
projectId,
|
|
392
|
+
messageCount: 0,
|
|
393
|
+
tokensIn: 0,
|
|
394
|
+
tokensOut: 0,
|
|
395
|
+
commandsUsed: {},
|
|
396
|
+
agentsUsed: new Set(),
|
|
397
|
+
toolsUsed: new Set(),
|
|
398
|
+
};
|
|
399
|
+
// Send initial heartbeat
|
|
400
|
+
await this.sendHeartbeat();
|
|
401
|
+
// Start periodic heartbeat (every 60 seconds)
|
|
402
|
+
this.heartbeatInterval = setInterval(() => {
|
|
403
|
+
void this.sendHeartbeat();
|
|
404
|
+
}, 60 * 1000);
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Stop the current session.
|
|
408
|
+
*/
|
|
409
|
+
stopHeartbeat() {
|
|
410
|
+
if (this.heartbeatInterval) {
|
|
411
|
+
clearInterval(this.heartbeatInterval);
|
|
412
|
+
this.heartbeatInterval = null;
|
|
413
|
+
}
|
|
414
|
+
// Send final heartbeat
|
|
415
|
+
if (this.sessionInfo) {
|
|
416
|
+
void this.sendHeartbeat();
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Record a message in the current session.
|
|
421
|
+
*/
|
|
422
|
+
recordMessage(tokensIn, tokensOut) {
|
|
423
|
+
if (this.sessionInfo) {
|
|
424
|
+
this.sessionInfo.messageCount++;
|
|
425
|
+
this.sessionInfo.tokensIn += tokensIn;
|
|
426
|
+
this.sessionInfo.tokensOut += tokensOut;
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* Record command usage.
|
|
431
|
+
*/
|
|
432
|
+
recordCommand(command) {
|
|
433
|
+
if (this.sessionInfo) {
|
|
434
|
+
this.sessionInfo.commandsUsed[command] = (this.sessionInfo.commandsUsed[command] ?? 0) + 1;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Record agent usage.
|
|
439
|
+
*/
|
|
440
|
+
recordAgent(agentId) {
|
|
441
|
+
if (this.sessionInfo) {
|
|
442
|
+
this.sessionInfo.agentsUsed.add(agentId);
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* Record tool usage.
|
|
447
|
+
*/
|
|
448
|
+
recordTool(toolName) {
|
|
449
|
+
if (this.sessionInfo) {
|
|
450
|
+
this.sessionInfo.toolsUsed.add(toolName);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Set LLM provider/model for session.
|
|
455
|
+
*/
|
|
456
|
+
setLLMInfo(provider, model) {
|
|
457
|
+
if (this.sessionInfo) {
|
|
458
|
+
this.sessionInfo.llmProvider = provider;
|
|
459
|
+
this.sessionInfo.llmModel = model;
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
/**
|
|
463
|
+
* Send a single heartbeat regardless of telemetry setting.
|
|
464
|
+
* Called once at login to register the CLI connection with the server
|
|
465
|
+
* (sets first_session_at on cli_users_extended). This is account metadata,
|
|
466
|
+
* not telemetry data.
|
|
467
|
+
*/
|
|
468
|
+
async sendForcedHeartbeat() {
|
|
469
|
+
const token = this.getBestToken();
|
|
470
|
+
if (!token)
|
|
471
|
+
return;
|
|
472
|
+
const sessionId = this.sessionInfo?.sessionId ?? uuidv4();
|
|
473
|
+
const data = {
|
|
474
|
+
session_id: sessionId,
|
|
475
|
+
cli_version: getVersion(),
|
|
476
|
+
os: os.platform(),
|
|
477
|
+
node_version: process.version,
|
|
478
|
+
};
|
|
479
|
+
try {
|
|
480
|
+
await sendHeartbeat(token, data);
|
|
481
|
+
}
|
|
482
|
+
catch {
|
|
483
|
+
// Silently ignore - this is best-effort
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
/**
|
|
487
|
+
* Send heartbeat to server (if telemetry enabled).
|
|
488
|
+
*/
|
|
489
|
+
async sendHeartbeat() {
|
|
490
|
+
// Check local telemetry setting
|
|
491
|
+
if (!isTelemetryEnabled()) {
|
|
492
|
+
return;
|
|
493
|
+
}
|
|
494
|
+
// Check if authenticated
|
|
495
|
+
const token = this.getBestToken();
|
|
496
|
+
if (!token || !this.sessionInfo) {
|
|
497
|
+
return;
|
|
498
|
+
}
|
|
499
|
+
const data = {
|
|
500
|
+
session_id: this.sessionInfo.sessionId,
|
|
501
|
+
cli_version: getVersion(),
|
|
502
|
+
os: os.platform(),
|
|
503
|
+
node_version: process.version,
|
|
504
|
+
project_id: this.sessionInfo.projectId,
|
|
505
|
+
total_messages: this.sessionInfo.messageCount,
|
|
506
|
+
total_tokens_in: this.sessionInfo.tokensIn,
|
|
507
|
+
total_tokens_out: this.sessionInfo.tokensOut,
|
|
508
|
+
commands_used: this.sessionInfo.commandsUsed,
|
|
509
|
+
agents_used: Array.from(this.sessionInfo.agentsUsed),
|
|
510
|
+
tools_used: Array.from(this.sessionInfo.toolsUsed),
|
|
511
|
+
llm_provider: this.sessionInfo.llmProvider,
|
|
512
|
+
llm_model: this.sessionInfo.llmModel,
|
|
513
|
+
};
|
|
514
|
+
try {
|
|
515
|
+
await sendHeartbeat(token, data);
|
|
516
|
+
}
|
|
517
|
+
catch {
|
|
518
|
+
// Silently ignore heartbeat failures
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
// =============================================================================
|
|
523
|
+
// Singleton
|
|
524
|
+
// =============================================================================
|
|
525
|
+
let authManagerInstance = null;
|
|
526
|
+
/**
|
|
527
|
+
* Get the AuthManager singleton instance.
|
|
528
|
+
*/
|
|
529
|
+
export function getAuthManager() {
|
|
530
|
+
if (!authManagerInstance) {
|
|
531
|
+
authManagerInstance = new AuthManager();
|
|
532
|
+
}
|
|
533
|
+
return authManagerInstance;
|
|
534
|
+
}
|
|
535
|
+
/**
|
|
536
|
+
* Reset AuthManager (for testing).
|
|
537
|
+
*/
|
|
538
|
+
export function resetAuthManager() {
|
|
539
|
+
if (authManagerInstance) {
|
|
540
|
+
authManagerInstance.stopHeartbeat();
|
|
541
|
+
}
|
|
542
|
+
authManagerInstance = null;
|
|
543
|
+
}
|
|
544
|
+
// Re-export device flow utilities
|
|
545
|
+
export { getAuthorizationUrl } from './api-client.js';
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth Storage Module
|
|
3
|
+
*
|
|
4
|
+
* Manages persistent storage of authentication credentials.
|
|
5
|
+
* File: ~/.compilr-dev/auth.json
|
|
6
|
+
*
|
|
7
|
+
* Security:
|
|
8
|
+
* - File permissions set to 0600 (owner read/write only)
|
|
9
|
+
* - Tokens are JWTs from Supabase Auth
|
|
10
|
+
*/
|
|
11
|
+
export interface AuthUser {
|
|
12
|
+
id: string;
|
|
13
|
+
email: string;
|
|
14
|
+
createdAt: string;
|
|
15
|
+
}
|
|
16
|
+
export interface AuthSession {
|
|
17
|
+
accessToken: string;
|
|
18
|
+
refreshToken: string;
|
|
19
|
+
expiresAt: string;
|
|
20
|
+
apiToken?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface AuthData {
|
|
23
|
+
version: number;
|
|
24
|
+
user: AuthUser;
|
|
25
|
+
session: AuthSession;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Load auth data from disk.
|
|
29
|
+
* Returns null if file doesn't exist or is invalid.
|
|
30
|
+
*/
|
|
31
|
+
export declare function loadAuthData(): AuthData | null;
|
|
32
|
+
/**
|
|
33
|
+
* Save auth data to disk with secure permissions.
|
|
34
|
+
*/
|
|
35
|
+
export declare function saveAuthData(data: AuthData): void;
|
|
36
|
+
/**
|
|
37
|
+
* Clear auth data (logout).
|
|
38
|
+
*/
|
|
39
|
+
export declare function clearAuthData(): void;
|
|
40
|
+
/**
|
|
41
|
+
* Update just the session tokens (after refresh).
|
|
42
|
+
*/
|
|
43
|
+
export declare function updateSession(session: AuthSession): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Check if auth data exists (quick check without loading).
|
|
46
|
+
*/
|
|
47
|
+
export declare function hasAuthData(): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Check if stored auth file has insecure permissions.
|
|
50
|
+
* Returns warning message if insecure, null if OK.
|
|
51
|
+
*/
|
|
52
|
+
export declare function checkAuthFilePermissions(): string | null;
|