argustack 0.2.0 → 0.3.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 +31 -115
- package/dist/adapters/board/board-sync.js +2 -2
- package/dist/adapters/board/board-sync.js.map +1 -1
- package/dist/adapters/board/md-parser.js +3 -3
- package/dist/adapters/board/md-parser.js.map +1 -1
- package/dist/adapters/board/skill-discovery.js +2 -2
- package/dist/adapters/board/skill-discovery.js.map +1 -1
- package/dist/adapters/board/skill-runner.js +2 -2
- package/dist/adapters/board/skill-runner.js.map +1 -1
- package/dist/adapters/board/store.d.ts.map +1 -1
- package/dist/adapters/board/store.js +11 -11
- package/dist/adapters/board/store.js.map +1 -1
- package/dist/adapters/csv/mapper.js +11 -11
- package/dist/adapters/csv/mapper.js.map +1 -1
- package/dist/adapters/csv/parser.d.ts.map +1 -1
- package/dist/adapters/csv/parser.js +8 -7
- package/dist/adapters/csv/parser.js.map +1 -1
- package/dist/adapters/csv/provider.js +4 -4
- package/dist/adapters/csv/provider.js.map +1 -1
- package/dist/adapters/db/client.js +2 -2
- package/dist/adapters/db/client.js.map +1 -1
- package/dist/adapters/db/index.js +1 -0
- package/dist/adapters/db/index.js.map +1 -1
- package/dist/adapters/db/mapper.js +1 -1
- package/dist/adapters/db/mapper.js.map +1 -1
- package/dist/adapters/db/provider.js +4 -4
- package/dist/adapters/db/provider.js.map +1 -1
- package/dist/adapters/db/sql-validator.js +2 -2
- package/dist/adapters/db/sql-validator.js.map +1 -1
- package/dist/adapters/docker/cli-docker-control.d.ts +13 -0
- package/dist/adapters/docker/cli-docker-control.d.ts.map +1 -0
- package/dist/adapters/docker/cli-docker-control.js +70 -0
- package/dist/adapters/docker/cli-docker-control.js.map +1 -0
- package/dist/adapters/docker/index.d.ts +2 -0
- package/dist/adapters/docker/index.d.ts.map +1 -0
- package/dist/adapters/docker/index.js +2 -0
- package/dist/adapters/docker/index.js.map +1 -0
- package/dist/adapters/git/mapper.js +1 -1
- package/dist/adapters/git/mapper.js.map +1 -1
- package/dist/adapters/git/provider.js +4 -4
- package/dist/adapters/git/provider.js.map +1 -1
- package/dist/adapters/github/mapper.js +3 -3
- package/dist/adapters/github/mapper.js.map +1 -1
- package/dist/adapters/github/provider.d.ts.map +1 -1
- package/dist/adapters/github/provider.js +2 -2
- package/dist/adapters/github/provider.js.map +1 -1
- package/dist/adapters/jira/mapper.js +4 -4
- package/dist/adapters/jira/mapper.js.map +1 -1
- package/dist/adapters/jira/provider.js +8 -8
- package/dist/adapters/jira/provider.js.map +1 -1
- package/dist/adapters/jira-proxy/client.js +4 -4
- package/dist/adapters/jira-proxy/client.js.map +1 -1
- package/dist/adapters/jira-proxy/config-loader.d.ts +9 -0
- package/dist/adapters/jira-proxy/config-loader.d.ts.map +1 -1
- package/dist/adapters/jira-proxy/config-loader.js +26 -3
- package/dist/adapters/jira-proxy/config-loader.js.map +1 -1
- package/dist/adapters/jira-proxy/index.d.ts +1 -1
- package/dist/adapters/jira-proxy/index.d.ts.map +1 -1
- package/dist/adapters/jira-proxy/index.js +1 -1
- package/dist/adapters/jira-proxy/index.js.map +1 -1
- package/dist/adapters/jira-proxy/mapper.js +2 -2
- package/dist/adapters/jira-proxy/mapper.js.map +1 -1
- package/dist/adapters/jira-proxy/provider.d.ts.map +1 -1
- package/dist/adapters/jira-proxy/provider.js +19 -8
- package/dist/adapters/jira-proxy/provider.js.map +1 -1
- package/dist/adapters/lmstudio/embedding-provider.js +4 -4
- package/dist/adapters/lmstudio/embedding-provider.js.map +1 -1
- package/dist/adapters/lsp/jsonrpc.js +1 -1
- package/dist/adapters/lsp/jsonrpc.js.map +1 -1
- package/dist/adapters/lsp/typescript-lsp.js +7 -7
- package/dist/adapters/lsp/typescript-lsp.js.map +1 -1
- package/dist/adapters/neo4j/client.js +2 -2
- package/dist/adapters/neo4j/client.js.map +1 -1
- package/dist/adapters/neo4j/graph-store.js +3 -3
- package/dist/adapters/neo4j/graph-store.js.map +1 -1
- package/dist/adapters/neo4j/mapper.js +4 -4
- package/dist/adapters/neo4j/mapper.js.map +1 -1
- package/dist/adapters/ollama/chat-llm.d.ts +24 -0
- package/dist/adapters/ollama/chat-llm.d.ts.map +1 -0
- package/dist/adapters/ollama/chat-llm.js +53 -0
- package/dist/adapters/ollama/chat-llm.js.map +1 -0
- package/dist/adapters/ollama/embedding-provider.d.ts +30 -0
- package/dist/adapters/ollama/embedding-provider.d.ts.map +1 -0
- package/dist/adapters/ollama/embedding-provider.js +124 -0
- package/dist/adapters/ollama/embedding-provider.js.map +1 -0
- package/dist/adapters/ollama/http-ollama-control.d.ts +24 -0
- package/dist/adapters/ollama/http-ollama-control.d.ts.map +1 -0
- package/dist/adapters/ollama/http-ollama-control.js +224 -0
- package/dist/adapters/ollama/http-ollama-control.js.map +1 -0
- package/dist/adapters/ollama/index.d.ts +6 -0
- package/dist/adapters/ollama/index.d.ts.map +1 -0
- package/dist/adapters/ollama/index.js +4 -0
- package/dist/adapters/ollama/index.js.map +1 -0
- package/dist/adapters/platform/index.d.ts +2 -0
- package/dist/adapters/platform/index.d.ts.map +1 -0
- package/dist/adapters/platform/index.js +2 -0
- package/dist/adapters/platform/index.js.map +1 -0
- package/dist/adapters/platform/node-platform-probe.d.ts +9 -0
- package/dist/adapters/platform/node-platform-probe.d.ts.map +1 -0
- package/dist/adapters/platform/node-platform-probe.js +88 -0
- package/dist/adapters/platform/node-platform-probe.js.map +1 -0
- package/dist/adapters/postgres/code-meta.js +13 -13
- package/dist/adapters/postgres/code-meta.js.map +1 -1
- package/dist/adapters/postgres/index.d.ts +2 -0
- package/dist/adapters/postgres/index.d.ts.map +1 -1
- package/dist/adapters/postgres/index.js +2 -0
- package/dist/adapters/postgres/index.js.map +1 -1
- package/dist/adapters/postgres/migrate-helpers.d.ts +43 -0
- package/dist/adapters/postgres/migrate-helpers.d.ts.map +1 -0
- package/dist/adapters/postgres/migrate-helpers.js +136 -0
- package/dist/adapters/postgres/migrate-helpers.js.map +1 -0
- package/dist/adapters/postgres/readiness-probe.d.ts +22 -0
- package/dist/adapters/postgres/readiness-probe.d.ts.map +1 -0
- package/dist/adapters/postgres/readiness-probe.js +47 -0
- package/dist/adapters/postgres/readiness-probe.js.map +1 -0
- package/dist/adapters/postgres/schema.d.ts +11 -1
- package/dist/adapters/postgres/schema.d.ts.map +1 -1
- package/dist/adapters/postgres/schema.js +159 -113
- package/dist/adapters/postgres/schema.js.map +1 -1
- package/dist/adapters/postgres/storage-commits.d.ts +13 -0
- package/dist/adapters/postgres/storage-commits.d.ts.map +1 -0
- package/dist/adapters/postgres/storage-commits.js +63 -0
- package/dist/adapters/postgres/storage-commits.js.map +1 -0
- package/dist/adapters/postgres/storage-dbschema.d.ts +14 -0
- package/dist/adapters/postgres/storage-dbschema.d.ts.map +1 -0
- package/dist/adapters/postgres/storage-dbschema.js +63 -0
- package/dist/adapters/postgres/storage-dbschema.js.map +1 -0
- package/dist/adapters/postgres/storage-graph.d.ts +18 -0
- package/dist/adapters/postgres/storage-graph.d.ts.map +1 -0
- package/dist/adapters/postgres/storage-graph.js +127 -0
- package/dist/adapters/postgres/storage-graph.js.map +1 -0
- package/dist/adapters/postgres/storage-issues.d.ts +26 -0
- package/dist/adapters/postgres/storage-issues.d.ts.map +1 -0
- package/dist/adapters/postgres/storage-issues.js +233 -0
- package/dist/adapters/postgres/storage-issues.js.map +1 -0
- package/dist/adapters/postgres/storage-prs.d.ts +15 -0
- package/dist/adapters/postgres/storage-prs.d.ts.map +1 -0
- package/dist/adapters/postgres/storage-prs.js +142 -0
- package/dist/adapters/postgres/storage-prs.js.map +1 -0
- package/dist/adapters/postgres/storage-query.d.ts +26 -0
- package/dist/adapters/postgres/storage-query.d.ts.map +1 -0
- package/dist/adapters/postgres/storage-query.js +74 -0
- package/dist/adapters/postgres/storage-query.js.map +1 -0
- package/dist/adapters/postgres/storage-search.d.ts +18 -0
- package/dist/adapters/postgres/storage-search.d.ts.map +1 -0
- package/dist/adapters/postgres/storage-search.js +90 -0
- package/dist/adapters/postgres/storage-search.js.map +1 -0
- package/dist/adapters/postgres/storage.d.ts +47 -31
- package/dist/adapters/postgres/storage.d.ts.map +1 -1
- package/dist/adapters/postgres/storage.js +86 -602
- package/dist/adapters/postgres/storage.js.map +1 -1
- package/dist/adapters/postgres/workspace-store.d.ts +26 -0
- package/dist/adapters/postgres/workspace-store.d.ts.map +1 -0
- package/dist/adapters/postgres/workspace-store.js +94 -0
- package/dist/adapters/postgres/workspace-store.js.map +1 -0
- package/dist/adapters/qdrant/client.js +1 -1
- package/dist/adapters/qdrant/client.js.map +1 -1
- package/dist/adapters/qdrant/mapper.d.ts.map +1 -1
- package/dist/adapters/qdrant/mapper.js +11 -4
- package/dist/adapters/qdrant/mapper.js.map +1 -1
- package/dist/adapters/qdrant/vector-store.d.ts +1 -0
- package/dist/adapters/qdrant/vector-store.d.ts.map +1 -1
- package/dist/adapters/qdrant/vector-store.js +40 -10
- package/dist/adapters/qdrant/vector-store.js.map +1 -1
- package/dist/adapters/tree-sitter/parser.d.ts.map +1 -1
- package/dist/adapters/tree-sitter/parser.js +12 -12
- package/dist/adapters/tree-sitter/parser.js.map +1 -1
- package/dist/adapters/voyage/embedding-provider.js +2 -2
- package/dist/adapters/voyage/embedding-provider.js.map +1 -1
- package/dist/cli/add/code.d.ts +3 -0
- package/dist/cli/add/code.d.ts.map +1 -0
- package/dist/cli/add/code.js +97 -0
- package/dist/cli/add/code.js.map +1 -0
- package/dist/cli/add/csv.d.ts +3 -0
- package/dist/cli/add/csv.d.ts.map +1 -0
- package/dist/cli/add/csv.js +26 -0
- package/dist/cli/add/csv.js.map +1 -0
- package/dist/cli/add/db.d.ts +3 -0
- package/dist/cli/add/db.d.ts.map +1 -0
- package/dist/cli/add/db.js +46 -0
- package/dist/cli/add/db.js.map +1 -0
- package/dist/cli/add/git.d.ts +3 -0
- package/dist/cli/add/git.d.ts.map +1 -0
- package/dist/cli/add/git.js +26 -0
- package/dist/cli/add/git.js.map +1 -0
- package/dist/cli/add/github.d.ts +3 -0
- package/dist/cli/add/github.d.ts.map +1 -0
- package/dist/cli/add/github.js +32 -0
- package/dist/cli/add/github.js.map +1 -0
- package/dist/cli/add/index.d.ts +3 -0
- package/dist/cli/add/index.d.ts.map +1 -0
- package/dist/cli/add/index.js +18 -0
- package/dist/cli/add/index.js.map +1 -0
- package/dist/cli/add/jira.d.ts +3 -0
- package/dist/cli/add/jira.d.ts.map +1 -0
- package/dist/cli/add/jira.js +45 -0
- package/dist/cli/add/jira.js.map +1 -0
- package/dist/cli/add/shared.d.ts +31 -0
- package/dist/cli/add/shared.d.ts.map +1 -0
- package/dist/cli/add/shared.js +102 -0
- package/dist/cli/add/shared.js.map +1 -0
- package/dist/cli/board-server.js +1 -1
- package/dist/cli/board-server.js.map +1 -1
- package/dist/cli/board.d.ts.map +1 -1
- package/dist/cli/board.js +11 -12
- package/dist/cli/board.js.map +1 -1
- package/dist/cli/code.d.ts.map +1 -1
- package/dist/cli/code.js +95 -193
- package/dist/cli/code.js.map +1 -1
- package/dist/cli/embed.d.ts.map +1 -1
- package/dist/cli/embed.js +21 -26
- package/dist/cli/embed.js.map +1 -1
- package/dist/cli/graph.d.ts.map +1 -1
- package/dist/cli/graph.js +37 -55
- package/dist/cli/graph.js.map +1 -1
- package/dist/cli/index.js +28 -25
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init/cleanup.d.ts +11 -0
- package/dist/cli/init/cleanup.d.ts.map +1 -0
- package/dist/cli/init/cleanup.js +39 -0
- package/dist/cli/init/cleanup.js.map +1 -0
- package/dist/cli/init/generators.js +27 -27
- package/dist/cli/init/generators.js.map +1 -1
- package/dist/cli/init/index.d.ts +0 -10
- package/dist/cli/init/index.d.ts.map +1 -1
- package/dist/cli/init/index.js +386 -354
- package/dist/cli/init/index.js.map +1 -1
- package/dist/cli/init/presenter.d.ts +30 -0
- package/dist/cli/init/presenter.d.ts.map +1 -0
- package/dist/cli/init/presenter.js +152 -0
- package/dist/cli/init/presenter.js.map +1 -0
- package/dist/cli/init/prompts.d.ts +28 -0
- package/dist/cli/init/prompts.d.ts.map +1 -0
- package/dist/cli/init/prompts.js +110 -0
- package/dist/cli/init/prompts.js.map +1 -0
- package/dist/cli/init/setup-csv.js +2 -2
- package/dist/cli/init/setup-csv.js.map +1 -1
- package/dist/cli/init/setup-db.d.ts.map +1 -1
- package/dist/cli/init/setup-db.js +17 -14
- package/dist/cli/init/setup-db.js.map +1 -1
- package/dist/cli/init/setup-git.js +16 -16
- package/dist/cli/init/setup-git.js.map +1 -1
- package/dist/cli/init/setup-github.d.ts.map +1 -1
- package/dist/cli/init/setup-github.js +7 -5
- package/dist/cli/init/setup-github.js.map +1 -1
- package/dist/cli/init/setup-jira.d.ts.map +1 -1
- package/dist/cli/init/setup-jira.js +11 -9
- package/dist/cli/init/setup-jira.js.map +1 -1
- package/dist/cli/init/types.d.ts +4 -0
- package/dist/cli/init/types.d.ts.map +1 -1
- package/dist/cli/init/types.js +4 -4
- package/dist/cli/init/types.js.map +1 -1
- package/dist/cli/mcp-install.d.ts +1 -1
- package/dist/cli/mcp-install.d.ts.map +1 -1
- package/dist/cli/mcp-install.js +10 -24
- package/dist/cli/mcp-install.js.map +1 -1
- package/dist/cli/migrate-to-hub-impl.d.ts +51 -0
- package/dist/cli/migrate-to-hub-impl.d.ts.map +1 -0
- package/dist/cli/migrate-to-hub-impl.js +171 -0
- package/dist/cli/migrate-to-hub-impl.js.map +1 -0
- package/dist/cli/migrate-to-hub.d.ts +3 -0
- package/dist/cli/migrate-to-hub.d.ts.map +1 -0
- package/dist/cli/migrate-to-hub.js +90 -0
- package/dist/cli/migrate-to-hub.js.map +1 -0
- package/dist/cli/push.d.ts.map +1 -1
- package/dist/cli/push.js +62 -65
- package/dist/cli/push.js.map +1 -1
- package/dist/cli/sources.d.ts +0 -7
- package/dist/cli/sources.d.ts.map +1 -1
- package/dist/cli/sources.js +47 -112
- package/dist/cli/sources.js.map +1 -1
- package/dist/cli/status.d.ts +0 -3
- package/dist/cli/status.d.ts.map +1 -1
- package/dist/cli/status.js +95 -70
- package/dist/cli/status.js.map +1 -1
- package/dist/cli/sync.d.ts +0 -10
- package/dist/cli/sync.d.ts.map +1 -1
- package/dist/cli/sync.js +186 -317
- package/dist/cli/sync.js.map +1 -1
- package/dist/cli/workspace/add.d.ts +3 -0
- package/dist/cli/workspace/add.d.ts.map +1 -0
- package/dist/cli/workspace/add.js +38 -0
- package/dist/cli/workspace/add.js.map +1 -0
- package/dist/cli/workspace/index.d.ts +3 -0
- package/dist/cli/workspace/index.d.ts.map +1 -0
- package/dist/cli/workspace/index.js +16 -0
- package/dist/cli/workspace/index.js.map +1 -0
- package/dist/cli/workspace/info.d.ts +3 -0
- package/dist/cli/workspace/info.d.ts.map +1 -0
- package/dist/cli/workspace/info.js +69 -0
- package/dist/cli/workspace/info.js.map +1 -0
- package/dist/cli/workspace/list.d.ts +3 -0
- package/dist/cli/workspace/list.d.ts.map +1 -0
- package/dist/cli/workspace/list.js +36 -0
- package/dist/cli/workspace/list.js.map +1 -0
- package/dist/cli/workspace/remove.d.ts +3 -0
- package/dist/cli/workspace/remove.d.ts.map +1 -0
- package/dist/cli/workspace/remove.js +43 -0
- package/dist/cli/workspace/remove.js.map +1 -0
- package/dist/cli/workspace/shared.d.ts +7 -0
- package/dist/cli/workspace/shared.d.ts.map +1 -0
- package/dist/cli/workspace/shared.js +17 -0
- package/dist/cli/workspace/shared.js.map +1 -0
- package/dist/cli/workspace/use.d.ts +3 -0
- package/dist/cli/workspace/use.d.ts.map +1 -0
- package/dist/cli/workspace/use.js +27 -0
- package/dist/cli/workspace/use.js.map +1 -0
- package/dist/code-intel/file-discovery.js +3 -3
- package/dist/code-intel/file-discovery.js.map +1 -1
- package/dist/code-intel/indexer.js +8 -8
- package/dist/code-intel/indexer.js.map +1 -1
- package/dist/code-intel/lsp-resolver.js +5 -5
- package/dist/code-intel/lsp-resolver.js.map +1 -1
- package/dist/code-intel/ranker.d.ts +14 -0
- package/dist/code-intel/ranker.d.ts.map +1 -1
- package/dist/code-intel/ranker.js +54 -0
- package/dist/code-intel/ranker.js.map +1 -1
- package/dist/code-intel/resolver.js +4 -4
- package/dist/code-intel/resolver.js.map +1 -1
- package/dist/code-intel/tsconfig-paths.js +2 -2
- package/dist/code-intel/tsconfig-paths.js.map +1 -1
- package/dist/code-intel/watcher.js +4 -4
- package/dist/code-intel/watcher.js.map +1 -1
- package/dist/core/board/board-column.value-object.js +1 -1
- package/dist/core/board/board-column.value-object.js.map +1 -1
- package/dist/core/board/pipeline.value-object.js +1 -1
- package/dist/core/board/pipeline.value-object.js.map +1 -1
- package/dist/core/board/skill-execution.entity.js +1 -1
- package/dist/core/board/skill-execution.entity.js.map +1 -1
- package/dist/core/board/task-title.value-object.js +1 -1
- package/dist/core/board/task-title.value-object.js.map +1 -1
- package/dist/core/ports/chat-llm.d.ts +36 -0
- package/dist/core/ports/chat-llm.d.ts.map +1 -0
- package/dist/core/ports/chat-llm.js +2 -0
- package/dist/core/ports/chat-llm.js.map +1 -0
- package/dist/core/ports/code-meta.d.ts +4 -0
- package/dist/core/ports/code-meta.d.ts.map +1 -1
- package/dist/core/ports/code-vector-store.d.ts +5 -0
- package/dist/core/ports/code-vector-store.d.ts.map +1 -1
- package/dist/core/ports/docker-control.d.ts +44 -0
- package/dist/core/ports/docker-control.d.ts.map +1 -0
- package/dist/core/ports/docker-control.js +8 -0
- package/dist/core/ports/docker-control.js.map +1 -0
- package/dist/core/ports/hub-readiness-probe.d.ts +22 -0
- package/dist/core/ports/hub-readiness-probe.d.ts.map +1 -0
- package/dist/core/ports/hub-readiness-probe.js +2 -0
- package/dist/core/ports/hub-readiness-probe.js.map +1 -0
- package/dist/core/ports/index.d.ts +4 -0
- package/dist/core/ports/index.d.ts.map +1 -1
- package/dist/core/ports/ollama-control.d.ts +61 -0
- package/dist/core/ports/ollama-control.d.ts.map +1 -0
- package/dist/core/ports/ollama-control.js +7 -0
- package/dist/core/ports/ollama-control.js.map +1 -0
- package/dist/core/ports/platform-probe.d.ts +47 -0
- package/dist/core/ports/platform-probe.d.ts.map +1 -0
- package/dist/core/ports/platform-probe.js +8 -0
- package/dist/core/ports/platform-probe.js.map +1 -0
- package/dist/core/ports/storage.d.ts +62 -29
- package/dist/core/ports/storage.d.ts.map +1 -1
- package/dist/core/ports/workspace-store.d.ts +52 -0
- package/dist/core/ports/workspace-store.d.ts.map +1 -0
- package/dist/core/ports/workspace-store.js +2 -0
- package/dist/core/ports/workspace-store.js.map +1 -0
- package/dist/core/types/index.d.ts +2 -0
- package/dist/core/types/index.d.ts.map +1 -1
- package/dist/core/types/init.d.ts +29 -0
- package/dist/core/types/init.d.ts.map +1 -0
- package/dist/core/types/init.js +2 -0
- package/dist/core/types/init.js.map +1 -0
- package/dist/core/types/workspace.d.ts +78 -0
- package/dist/core/types/workspace.d.ts.map +1 -0
- package/dist/core/types/workspace.js +2 -0
- package/dist/core/types/workspace.js.map +1 -0
- package/dist/mcp/helpers.d.ts +121 -30
- package/dist/mcp/helpers.d.ts.map +1 -1
- package/dist/mcp/helpers.js +240 -264
- package/dist/mcp/helpers.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +43 -5
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/code-graph.d.ts.map +1 -1
- package/dist/mcp/tools/code-graph.js +109 -74
- package/dist/mcp/tools/code-graph.js.map +1 -1
- package/dist/mcp/tools/code-hybrid.d.ts.map +1 -1
- package/dist/mcp/tools/code-hybrid.js +75 -51
- package/dist/mcp/tools/code-hybrid.js.map +1 -1
- package/dist/mcp/tools/code-search.d.ts.map +1 -1
- package/dist/mcp/tools/code-search.js +32 -32
- package/dist/mcp/tools/code-search.js.map +1 -1
- package/dist/mcp/tools/database.d.ts.map +1 -1
- package/dist/mcp/tools/database.js +86 -97
- package/dist/mcp/tools/database.js.map +1 -1
- package/dist/mcp/tools/estimate.d.ts.map +1 -1
- package/dist/mcp/tools/estimate.js +106 -82
- package/dist/mcp/tools/estimate.js.map +1 -1
- package/dist/mcp/tools/graph.d.ts.map +1 -1
- package/dist/mcp/tools/graph.js +142 -157
- package/dist/mcp/tools/graph.js.map +1 -1
- package/dist/mcp/tools/issue.d.ts.map +1 -1
- package/dist/mcp/tools/issue.js +172 -172
- package/dist/mcp/tools/issue.js.map +1 -1
- package/dist/mcp/tools/push.d.ts.map +1 -1
- package/dist/mcp/tools/push.js +70 -100
- package/dist/mcp/tools/push.js.map +1 -1
- package/dist/mcp/tools/query.d.ts.map +1 -1
- package/dist/mcp/tools/query.js +187 -246
- package/dist/mcp/tools/query.js.map +1 -1
- package/dist/mcp/tools/search.d.ts.map +1 -1
- package/dist/mcp/tools/search.js +25 -22
- package/dist/mcp/tools/search.js.map +1 -1
- package/dist/mcp/tools/workspace.d.ts.map +1 -1
- package/dist/mcp/tools/workspace.js +120 -73
- package/dist/mcp/tools/workspace.js.map +1 -1
- package/dist/use-cases/build-graph.d.ts +1 -1
- package/dist/use-cases/build-graph.d.ts.map +1 -1
- package/dist/use-cases/build-graph.js +63 -50
- package/dist/use-cases/build-graph.js.map +1 -1
- package/dist/use-cases/code-search.d.ts +29 -5
- package/dist/use-cases/code-search.d.ts.map +1 -1
- package/dist/use-cases/code-search.js +98 -9
- package/dist/use-cases/code-search.js.map +1 -1
- package/dist/use-cases/embed.d.ts +1 -1
- package/dist/use-cases/embed.d.ts.map +1 -1
- package/dist/use-cases/embed.js +5 -5
- package/dist/use-cases/embed.js.map +1 -1
- package/dist/use-cases/index-code.js +2 -2
- package/dist/use-cases/index-code.js.map +1 -1
- package/dist/use-cases/init/bootstrap-hub.d.ts +55 -0
- package/dist/use-cases/init/bootstrap-hub.d.ts.map +1 -0
- package/dist/use-cases/init/bootstrap-hub.js +116 -0
- package/dist/use-cases/init/bootstrap-hub.js.map +1 -0
- package/dist/use-cases/init/check-dims-conflict.d.ts +33 -0
- package/dist/use-cases/init/check-dims-conflict.d.ts.map +1 -0
- package/dist/use-cases/init/check-dims-conflict.js +39 -0
- package/dist/use-cases/init/check-dims-conflict.js.map +1 -0
- package/dist/use-cases/init/check-hub-exists.d.ts +23 -0
- package/dist/use-cases/init/check-hub-exists.d.ts.map +1 -0
- package/dist/use-cases/init/check-hub-exists.js +39 -0
- package/dist/use-cases/init/check-hub-exists.js.map +1 -0
- package/dist/use-cases/init/check-ports.d.ts +18 -0
- package/dist/use-cases/init/check-ports.d.ts.map +1 -0
- package/dist/use-cases/init/check-ports.js +25 -0
- package/dist/use-cases/init/check-ports.js.map +1 -0
- package/dist/use-cases/init/check-versions.d.ts +37 -0
- package/dist/use-cases/init/check-versions.d.ts.map +1 -0
- package/dist/use-cases/init/check-versions.js +50 -0
- package/dist/use-cases/init/check-versions.js.map +1 -0
- package/dist/use-cases/init/clear-stale-active.d.ts +20 -0
- package/dist/use-cases/init/clear-stale-active.d.ts.map +1 -0
- package/dist/use-cases/init/clear-stale-active.js +26 -0
- package/dist/use-cases/init/clear-stale-active.js.map +1 -0
- package/dist/use-cases/init/ensure-embedding-model.d.ts +20 -0
- package/dist/use-cases/init/ensure-embedding-model.d.ts.map +1 -0
- package/dist/use-cases/init/ensure-embedding-model.js +24 -0
- package/dist/use-cases/init/ensure-embedding-model.js.map +1 -0
- package/dist/use-cases/init/ensure-ollama-running.d.ts +19 -0
- package/dist/use-cases/init/ensure-ollama-running.d.ts.map +1 -0
- package/dist/use-cases/init/ensure-ollama-running.js +24 -0
- package/dist/use-cases/init/ensure-ollama-running.js.map +1 -0
- package/dist/use-cases/init/health-check-existing-llm.d.ts +25 -0
- package/dist/use-cases/init/health-check-existing-llm.d.ts.map +1 -0
- package/dist/use-cases/init/health-check-existing-llm.js +42 -0
- package/dist/use-cases/init/health-check-existing-llm.js.map +1 -0
- package/dist/use-cases/init/install-ollama.d.ts +27 -0
- package/dist/use-cases/init/install-ollama.d.ts.map +1 -0
- package/dist/use-cases/init/install-ollama.js +51 -0
- package/dist/use-cases/init/install-ollama.js.map +1 -0
- package/dist/use-cases/init/probe-llm.d.ts +32 -0
- package/dist/use-cases/init/probe-llm.d.ts.map +1 -0
- package/dist/use-cases/init/probe-llm.js +42 -0
- package/dist/use-cases/init/probe-llm.js.map +1 -0
- package/dist/use-cases/init/resolve-hub-ports.d.ts +46 -0
- package/dist/use-cases/init/resolve-hub-ports.d.ts.map +1 -0
- package/dist/use-cases/init/resolve-hub-ports.js +77 -0
- package/dist/use-cases/init/resolve-hub-ports.js.map +1 -0
- package/dist/use-cases/init/validate-workspace-name.d.ts +26 -0
- package/dist/use-cases/init/validate-workspace-name.d.ts.map +1 -0
- package/dist/use-cases/init/validate-workspace-name.js +39 -0
- package/dist/use-cases/init/validate-workspace-name.js.map +1 -0
- package/dist/use-cases/init/wait-for-docker.d.ts +16 -0
- package/dist/use-cases/init/wait-for-docker.d.ts.map +1 -0
- package/dist/use-cases/init/wait-for-docker.js +16 -0
- package/dist/use-cases/init/wait-for-docker.js.map +1 -0
- package/dist/use-cases/init/write-config-env.d.ts +32 -0
- package/dist/use-cases/init/write-config-env.d.ts.map +1 -0
- package/dist/use-cases/init/write-config-env.js +118 -0
- package/dist/use-cases/init/write-config-env.js.map +1 -0
- package/dist/use-cases/move-task.js +2 -2
- package/dist/use-cases/move-task.js.map +1 -1
- package/dist/use-cases/pull-db.d.ts +1 -1
- package/dist/use-cases/pull-db.d.ts.map +1 -1
- package/dist/use-cases/pull-db.js +3 -3
- package/dist/use-cases/pull-db.js.map +1 -1
- package/dist/use-cases/pull-git.d.ts +1 -1
- package/dist/use-cases/pull-git.d.ts.map +1 -1
- package/dist/use-cases/pull-git.js +5 -5
- package/dist/use-cases/pull-git.js.map +1 -1
- package/dist/use-cases/pull-github.d.ts +1 -1
- package/dist/use-cases/pull-github.d.ts.map +1 -1
- package/dist/use-cases/pull-github.js +6 -6
- package/dist/use-cases/pull-github.js.map +1 -1
- package/dist/use-cases/pull.d.ts +1 -1
- package/dist/use-cases/pull.d.ts.map +1 -1
- package/dist/use-cases/pull.js +6 -6
- package/dist/use-cases/pull.js.map +1 -1
- package/dist/use-cases/push.d.ts +2 -2
- package/dist/use-cases/push.d.ts.map +1 -1
- package/dist/use-cases/push.js +8 -8
- package/dist/use-cases/push.js.map +1 -1
- package/dist/use-cases/register-code-project.d.ts +8 -0
- package/dist/use-cases/register-code-project.d.ts.map +1 -1
- package/dist/use-cases/register-code-project.js +8 -0
- package/dist/use-cases/register-code-project.js.map +1 -1
- package/dist/use-cases/watch-code.js +1 -1
- package/dist/use-cases/watch-code.js.map +1 -1
- package/dist/workspace/active-workspace.d.ts +26 -0
- package/dist/workspace/active-workspace.d.ts.map +1 -0
- package/dist/workspace/active-workspace.js +69 -0
- package/dist/workspace/active-workspace.js.map +1 -0
- package/dist/workspace/adf.d.ts.map +1 -1
- package/dist/workspace/adf.js +20 -19
- package/dist/workspace/adf.js.map +1 -1
- package/dist/workspace/config.d.ts +11 -0
- package/dist/workspace/config.d.ts.map +1 -1
- package/dist/workspace/config.js +76 -22
- package/dist/workspace/config.js.map +1 -1
- package/dist/workspace/hub-config.d.ts +74 -0
- package/dist/workspace/hub-config.d.ts.map +1 -0
- package/dist/workspace/hub-config.js +164 -0
- package/dist/workspace/hub-config.js.map +1 -0
- package/dist/workspace/registry.d.ts +23 -3
- package/dist/workspace/registry.d.ts.map +1 -1
- package/dist/workspace/registry.js +32 -14
- package/dist/workspace/registry.js.map +1 -1
- package/dist/workspace/resolver.d.ts +20 -18
- package/dist/workspace/resolver.d.ts.map +1 -1
- package/dist/workspace/resolver.js +100 -59
- package/dist/workspace/resolver.js.map +1 -1
- package/package.json +4 -2
- package/templates/hub-config.env +65 -0
- package/templates/hub-docker-compose.yml +88 -0
- package/templates/migrate-to-hub.sql +90 -0
- package/dist/cli/workspaces.d.ts +0 -3
- package/dist/cli/workspaces.d.ts.map +0 -1
- package/dist/cli/workspaces.js +0 -34
- package/dist/cli/workspaces.js.map +0 -1
package/dist/cli/init/index.js
CHANGED
|
@@ -1,405 +1,437 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { input, confirm, checkbox, select } from '@inquirer/prompts';
|
|
4
|
-
import { execSync } from 'node:child_process';
|
|
1
|
+
import { dirname, join, resolve } from 'node:path';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
5
3
|
import chalk from 'chalk';
|
|
6
4
|
import ora from 'ora';
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
5
|
+
import { setActiveWorkspace } from '../../workspace/active-workspace.js';
|
|
6
|
+
import { hubDir, hubConfigPath, loadHubConfig, resetHubConfigCache } from '../../workspace/hub-config.js';
|
|
7
|
+
import { NodePlatformProbe } from '../../adapters/platform/index.js';
|
|
8
|
+
import { CliDockerControl } from '../../adapters/docker/index.js';
|
|
9
|
+
import { HttpOllamaControl } from '../../adapters/ollama/index.js';
|
|
10
|
+
import { CheckVersionsUseCase } from '../../use-cases/init/check-versions.js';
|
|
11
|
+
import { CheckHubExistsUseCase } from '../../use-cases/init/check-hub-exists.js';
|
|
12
|
+
import { WaitForDockerUseCase } from '../../use-cases/init/wait-for-docker.js';
|
|
13
|
+
import { ResolveHubPortsUseCase, labelForPortKey } from '../../use-cases/init/resolve-hub-ports.js';
|
|
14
|
+
import { BootstrapHubUseCase } from '../../use-cases/init/bootstrap-hub.js';
|
|
15
|
+
import { ClearStaleActiveUseCase } from '../../use-cases/init/clear-stale-active.js';
|
|
16
|
+
import { ValidateWorkspaceNameUseCase } from '../../use-cases/init/validate-workspace-name.js';
|
|
17
|
+
import { InstallOllamaUseCase } from '../../use-cases/init/install-ollama.js';
|
|
18
|
+
import { EnsureOllamaRunningUseCase } from '../../use-cases/init/ensure-ollama-running.js';
|
|
19
|
+
import { EnsureEmbeddingModelUseCase } from '../../use-cases/init/ensure-embedding-model.js';
|
|
20
|
+
import { ProbeLlmUseCase } from '../../use-cases/init/probe-llm.js';
|
|
21
|
+
import { HealthCheckExistingLlmUseCase } from '../../use-cases/init/health-check-existing-llm.js';
|
|
22
|
+
import { WriteConfigEnvUseCase } from '../../use-cases/init/write-config-env.js';
|
|
23
|
+
import { CheckDimsConflictUseCase } from '../../use-cases/init/check-dims-conflict.js';
|
|
24
|
+
import { promptConfigureCode, promptDimsRecreate, promptOwnLlm, promptOwnLlmUrlAndModel, promptPortChoice, promptProbeRetry, promptWaitForDocker, promptWorkspaceName, promptReconfigureBrokenLlm, } from './prompts.js';
|
|
25
|
+
import { printDockerNotRunning, printDockerTimeout, printDone, printHeader, printLlmHealthyAtReinit, printNoInteractiveMissingName, printOllamaInstallFailed, printOllamaTimeout, printOllamaWindowsLink, printPortPlan, printPortsAborted, printProbeError, printPullFailed, printSwitchedTo, printVersionFailure, printWorkspaceList, printWriteConfigFailed, printBootstrapFailure, printStaleActiveCleared, } from './presenter.js';
|
|
26
|
+
const HUB_PORT_DEFAULTS = {
|
|
27
|
+
pg: 15432,
|
|
28
|
+
pgweb: 15433,
|
|
29
|
+
neo4jHttp: 15434,
|
|
30
|
+
neo4jBolt: 15435,
|
|
31
|
+
qdrantRest: 15436,
|
|
32
|
+
qdrantGrpc: 15437,
|
|
33
|
+
};
|
|
34
|
+
const DEFAULT_OLLAMA_URL = 'http://localhost:11434';
|
|
35
|
+
const DEFAULT_OLLAMA_MODEL = 'nomic-embed-text';
|
|
36
|
+
const MAX_PROBE_ATTEMPTS = 3;
|
|
37
|
+
function getTemplatesDir() {
|
|
38
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
39
|
+
return resolve(here, '..', '..', '..', 'templates');
|
|
40
|
+
}
|
|
41
|
+
function makeHubStoreFactory() {
|
|
42
|
+
return {
|
|
43
|
+
async open() {
|
|
44
|
+
const { loadHubConfig: load } = await import('../../workspace/hub-config.js');
|
|
45
|
+
const { PostgresWorkspaceStore, createPool } = await import('../../adapters/postgres/index.js');
|
|
46
|
+
const hub = load();
|
|
47
|
+
const pool = createPool(hub.db);
|
|
48
|
+
const store = new PostgresWorkspaceStore(pool);
|
|
49
|
+
return { store, close: async () => { await pool.end(); } };
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
export async function runInit(flags = {}) {
|
|
54
|
+
printHeader();
|
|
55
|
+
const platform = new NodePlatformProbe();
|
|
56
|
+
const docker = new CliDockerControl(platform);
|
|
57
|
+
const ollama = new HttpOllamaControl(platform);
|
|
58
|
+
const versions = new CheckVersionsUseCase(platform, docker);
|
|
59
|
+
const v = await versions.execute();
|
|
60
|
+
if (!v.ok) {
|
|
61
|
+
printVersionFailure(v.failure);
|
|
62
|
+
process.exit(1);
|
|
29
63
|
}
|
|
30
|
-
|
|
31
|
-
if (
|
|
32
|
-
|
|
64
|
+
if (!await docker.isRunning()) {
|
|
65
|
+
if (flags.interactive === false) {
|
|
66
|
+
printDockerNotRunning();
|
|
67
|
+
process.exit(1);
|
|
33
68
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
69
|
+
printDockerNotRunning();
|
|
70
|
+
const wait = await promptWaitForDocker();
|
|
71
|
+
if (!wait) {
|
|
72
|
+
process.exit(0);
|
|
73
|
+
}
|
|
74
|
+
const spinner = ora('Waiting for Docker').start();
|
|
75
|
+
const came = await new WaitForDockerUseCase(docker).execute({
|
|
76
|
+
onTick: (sec) => { spinner.text = `Waiting for Docker (${String(sec)}s)`; },
|
|
77
|
+
});
|
|
78
|
+
spinner.stop();
|
|
79
|
+
if (!came) {
|
|
80
|
+
printDockerTimeout();
|
|
81
|
+
process.exit(1);
|
|
44
82
|
}
|
|
45
83
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Sanitize workspace name to kebab-case directory name.
|
|
50
|
-
*/
|
|
51
|
-
function sanitizeName(raw) {
|
|
52
|
-
return raw
|
|
53
|
-
.toLowerCase()
|
|
54
|
-
.trim()
|
|
55
|
-
.replace(/[^a-z0-9-]/g, '-')
|
|
56
|
-
.replace(/-+/g, '-')
|
|
57
|
-
.replace(/^-|-$/g, '');
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Find next available port by checking existing docker-compose files.
|
|
61
|
-
*/
|
|
62
|
-
async function startAndSync(workspaceDir, hasJira, hasGit, hasGithub, csv, db, pgwebPort) {
|
|
63
|
-
const spinnerDb = ora('Starting Docker containers...').start();
|
|
84
|
+
const hubStoreFactory = makeHubStoreFactory();
|
|
85
|
+
let hubExists;
|
|
64
86
|
try {
|
|
65
|
-
|
|
66
|
-
spinnerDb.succeed('Database running!');
|
|
67
|
-
}
|
|
68
|
-
catch (err) {
|
|
69
|
-
spinnerDb.fail('Failed to start Docker');
|
|
70
|
-
console.log(chalk.red(` Error: ${getErrorMsg(err)}`));
|
|
71
|
-
console.log(chalk.dim(' Make sure Docker Desktop is running, then:'));
|
|
72
|
-
console.log(chalk.cyan(` cd ${workspaceDir} && docker compose up -d`));
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
const spinnerWait = ora('Waiting for PostgreSQL...').start();
|
|
76
|
-
const MAX_WAIT_SECONDS = 30;
|
|
77
|
-
for (let i = 0; i < MAX_WAIT_SECONDS; i++) {
|
|
87
|
+
const tmp = await hubStoreFactory.open();
|
|
78
88
|
try {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
break;
|
|
89
|
+
const c = await new CheckHubExistsUseCase(hubDir(), tmp.store).execute();
|
|
90
|
+
hubExists = c.exists;
|
|
82
91
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
spinnerWait.fail('PostgreSQL not ready after 30s');
|
|
86
|
-
console.log(chalk.dim(' Try manually: docker compose logs db'));
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
await new Promise((r) => setTimeout(r, 1000));
|
|
92
|
+
finally {
|
|
93
|
+
await tmp.close();
|
|
90
94
|
}
|
|
91
95
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
96
|
+
catch {
|
|
97
|
+
hubExists = false;
|
|
98
|
+
}
|
|
99
|
+
let activePorts;
|
|
100
|
+
if (!hubExists) {
|
|
101
|
+
const portsResult = await resolvePorts(platform, flags);
|
|
102
|
+
if (portsResult == null) {
|
|
103
|
+
printPortsAborted();
|
|
104
|
+
process.exit(1);
|
|
97
105
|
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
106
|
+
activePorts = portsResult;
|
|
107
|
+
const bootstrapSpinner = ora('Bootstrap hub').start();
|
|
108
|
+
const bootstrapResult = await bootstrap(hubStoreFactory, flags, activePorts, (msg) => { bootstrapSpinner.text = msg; });
|
|
109
|
+
bootstrapSpinner.stop();
|
|
110
|
+
if (!bootstrapResult.ok) {
|
|
111
|
+
printBootstrapFailure(bootstrapResult.stage, bootstrapResult.details);
|
|
112
|
+
process.exit(1);
|
|
101
113
|
}
|
|
114
|
+
console.log(chalk.green(' ✓ hub bootstrapped'));
|
|
102
115
|
}
|
|
103
|
-
|
|
104
|
-
console.log('');
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
116
|
+
else {
|
|
117
|
+
console.log(chalk.dim(' Hub already exists, skipping bootstrap.'));
|
|
118
|
+
activePorts = readPortsFromConfig();
|
|
119
|
+
}
|
|
120
|
+
resetHubConfigCache();
|
|
121
|
+
const { store: hubStore, close: closeHub } = await hubStoreFactory.open();
|
|
122
|
+
try {
|
|
123
|
+
if (hubExists) {
|
|
124
|
+
const stale = await new ClearStaleActiveUseCase(hubStore).execute();
|
|
125
|
+
if (stale.cleared) {
|
|
126
|
+
printStaleActiveCleared(stale.staleId);
|
|
127
|
+
}
|
|
108
128
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
129
|
+
const existingList = (await hubStore.list()).map((w) => w.name);
|
|
130
|
+
printWorkspaceList(existingList);
|
|
131
|
+
if (flags.interactive === false && (flags.name === undefined || flags.name === '')) {
|
|
132
|
+
printNoInteractiveMissingName();
|
|
133
|
+
process.exit(1);
|
|
112
134
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
await
|
|
135
|
+
const validator = new ValidateWorkspaceNameUseCase(hubStore);
|
|
136
|
+
let workspaceId = '';
|
|
137
|
+
let workspaceName = '';
|
|
138
|
+
let nameHint = flags.name;
|
|
139
|
+
while (workspaceId.length === 0) {
|
|
140
|
+
const raw = nameHint ?? await promptWorkspaceName(existingList);
|
|
141
|
+
const v2 = await validator.execute(raw);
|
|
142
|
+
if (!v2.ok) {
|
|
143
|
+
if (flags.interactive === false) {
|
|
144
|
+
printNoInteractiveMissingName();
|
|
145
|
+
process.exit(1);
|
|
146
|
+
}
|
|
147
|
+
nameHint = undefined;
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
if (v2.action === 'create') {
|
|
151
|
+
await hubStore.create({ id: v2.id, name: v2.name });
|
|
152
|
+
console.log(chalk.green(` ✓ workspace "${v2.name}" created`));
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
printSwitchedTo(v2.name);
|
|
156
|
+
}
|
|
157
|
+
setActiveWorkspace(v2.id, v2.name);
|
|
158
|
+
await hubStore.touchActive(v2.id);
|
|
159
|
+
workspaceId = v2.id;
|
|
160
|
+
workspaceName = v2.name;
|
|
119
161
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
162
|
+
if (flags.skipLlm === true) {
|
|
163
|
+
writeNoLlm(activePorts);
|
|
164
|
+
printDone(workspaceName, false);
|
|
165
|
+
return;
|
|
123
166
|
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
167
|
+
const probe = new ProbeLlmUseCase(ollama);
|
|
168
|
+
if (hubExists) {
|
|
169
|
+
try {
|
|
170
|
+
const hub = loadHubConfig();
|
|
171
|
+
const health = await new HealthCheckExistingLlmUseCase(probe).execute(hub);
|
|
172
|
+
if (health.configured) {
|
|
173
|
+
if (health.healthy) {
|
|
174
|
+
printLlmHealthyAtReinit(hub.embedding.model);
|
|
175
|
+
printDone(workspaceName, true);
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
const reconf = flags.interactive === false ? false : await promptReconfigureBrokenLlm();
|
|
179
|
+
if (!reconf) {
|
|
180
|
+
printDone(workspaceName, true);
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
/* config missing — fall through to setup */
|
|
187
|
+
}
|
|
130
188
|
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
189
|
+
if (flags.interactive !== false) {
|
|
190
|
+
const wantsCode = await promptConfigureCode();
|
|
191
|
+
if (!wantsCode) {
|
|
192
|
+
writeNoLlm(activePorts);
|
|
193
|
+
printDone(workspaceName, false);
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
134
196
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
await syncDbFromInit(workspaceDir);
|
|
197
|
+
const plan = await setupLlm(flags, platform, ollama, probe);
|
|
198
|
+
if (plan == null) {
|
|
199
|
+
writeNoLlm(activePorts);
|
|
200
|
+
printDone(workspaceName, false);
|
|
201
|
+
return;
|
|
141
202
|
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
203
|
+
const dimsOk = await handleDimsConflict(workspaceId, plan.dimensions, flags);
|
|
204
|
+
if (!dimsOk) {
|
|
205
|
+
writeNoLlm(activePorts);
|
|
206
|
+
printDone(workspaceName, false);
|
|
207
|
+
return;
|
|
145
208
|
}
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
console.log(chalk.dim(' Claude integration:'));
|
|
151
|
-
console.log(` Claude Code: ${chalk.green('Open this folder — MCP tools ready!')}`);
|
|
152
|
-
console.log(` Claude Desktop: ${chalk.cyan('argustack mcp install')}`);
|
|
153
|
-
console.log('');
|
|
154
|
-
}
|
|
155
|
-
async function setupSources(flags) {
|
|
156
|
-
console.log('');
|
|
157
|
-
const selectedSources = await checkbox({
|
|
158
|
-
message: 'Which sources do you have access to?',
|
|
159
|
-
choices: ALL_SOURCES.map((s) => ({
|
|
160
|
-
value: s,
|
|
161
|
-
name: SOURCE_META[s].label,
|
|
162
|
-
description: SOURCE_META[s].description,
|
|
163
|
-
})),
|
|
164
|
-
});
|
|
165
|
-
if (selectedSources.length === 0) {
|
|
166
|
-
console.log(chalk.yellow('\n No sources selected. You can add them later with:'));
|
|
167
|
-
console.log(chalk.cyan(' argustack source add jira'));
|
|
168
|
-
const continueAnyway = await confirm({
|
|
169
|
-
message: 'Create workspace without sources?',
|
|
170
|
-
default: true,
|
|
209
|
+
const writeRes = new WriteConfigEnvUseCase().execute({
|
|
210
|
+
llm: plan,
|
|
211
|
+
ports: activePorts,
|
|
212
|
+
targetPath: hubConfigPath(),
|
|
171
213
|
});
|
|
172
|
-
if (!
|
|
173
|
-
|
|
214
|
+
if (!writeRes.ok) {
|
|
215
|
+
printWriteConfigFailed(writeRes.details);
|
|
216
|
+
process.exit(1);
|
|
174
217
|
}
|
|
218
|
+
resetHubConfigCache();
|
|
219
|
+
printDone(workspaceName, true);
|
|
175
220
|
}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
let git = null;
|
|
179
|
-
let github = null;
|
|
180
|
-
let csv = null;
|
|
181
|
-
let db = null;
|
|
182
|
-
for (const source of selectedSources) {
|
|
183
|
-
switch (source) {
|
|
184
|
-
case 'jira': {
|
|
185
|
-
const result = await setupJiraInteractive();
|
|
186
|
-
jira = result.jira;
|
|
187
|
-
proxy = result.proxy;
|
|
188
|
-
break;
|
|
189
|
-
}
|
|
190
|
-
case 'git':
|
|
191
|
-
git = await setupGitInteractive();
|
|
192
|
-
break;
|
|
193
|
-
case 'github':
|
|
194
|
-
github = await setupGithubInteractive(git?.githubToken, git?.githubRepos);
|
|
195
|
-
break;
|
|
196
|
-
case 'csv':
|
|
197
|
-
csv = await setupCsvInteractive();
|
|
198
|
-
break;
|
|
199
|
-
case 'db':
|
|
200
|
-
db = await setupDbInteractive();
|
|
201
|
-
break;
|
|
202
|
-
case 'board': break;
|
|
203
|
-
case 'code': break;
|
|
204
|
-
}
|
|
221
|
+
finally {
|
|
222
|
+
await closeHub();
|
|
205
223
|
}
|
|
206
|
-
void flags;
|
|
207
|
-
return { jira, proxy, git, github, csv, db };
|
|
208
224
|
}
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
225
|
+
function readPortsFromConfig() {
|
|
226
|
+
try {
|
|
227
|
+
const hub = loadHubConfig();
|
|
228
|
+
const qdrantPortStr = new URL(hub.qdrant.url).port;
|
|
229
|
+
const qdrantPort = Number(qdrantPortStr !== '' ? qdrantPortStr : '15436');
|
|
230
|
+
const neo4jPortStr = new URL(hub.neo4j.uri.replace('bolt://', 'http://')).port;
|
|
231
|
+
const neo4jBoltPort = Number(neo4jPortStr !== '' ? neo4jPortStr : '15435');
|
|
232
|
+
return {
|
|
233
|
+
pg: hub.db.port,
|
|
234
|
+
pgweb: HUB_PORT_DEFAULTS.pgweb,
|
|
235
|
+
neo4jBolt: neo4jBoltPort,
|
|
236
|
+
neo4jHttp: HUB_PORT_DEFAULTS.neo4jHttp,
|
|
237
|
+
qdrantRest: qdrantPort,
|
|
238
|
+
qdrantGrpc: HUB_PORT_DEFAULTS.qdrantGrpc,
|
|
239
|
+
};
|
|
213
240
|
}
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
if (isWorkspace(workspaceDir)) {
|
|
217
|
-
throw new Error(`Workspace '${workspaceName}' already exists at ${workspaceDir}`);
|
|
241
|
+
catch {
|
|
242
|
+
return { ...HUB_PORT_DEFAULTS };
|
|
218
243
|
}
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
244
|
+
}
|
|
245
|
+
async function handleDimsConflict(workspaceId, newDims, flags) {
|
|
246
|
+
const { QdrantCodeVectorStore } = await import('../../adapters/qdrant/index.js');
|
|
247
|
+
const hub = loadHubConfig();
|
|
248
|
+
const vec = new QdrantCodeVectorStore({ url: hub.qdrant.url });
|
|
249
|
+
try {
|
|
250
|
+
const conflict = await new CheckDimsConflictUseCase(vec).execute(workspaceId, newDims);
|
|
251
|
+
if (!conflict.conflict) {
|
|
252
|
+
return true;
|
|
225
253
|
}
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
case 'jira':
|
|
235
|
-
jiraResult = await setupJiraFromFlags(flags);
|
|
236
|
-
break;
|
|
237
|
-
case 'git':
|
|
238
|
-
gitResult = setupGitFromFlags(flags);
|
|
239
|
-
break;
|
|
240
|
-
case 'github':
|
|
241
|
-
githubResult = setupGithubFromFlags(flags);
|
|
242
|
-
break;
|
|
243
|
-
case 'csv':
|
|
244
|
-
csvResult = setupCsvFromFlags(flags);
|
|
245
|
-
break;
|
|
246
|
-
case 'db':
|
|
247
|
-
dbResult = setupDbFromFlags(flags);
|
|
248
|
-
break;
|
|
249
|
-
case 'board':
|
|
250
|
-
break;
|
|
251
|
-
case 'code':
|
|
252
|
-
break;
|
|
254
|
+
console.log(chalk.yellow(` ⚠ Embedding dimensions changed: ${String(conflict.existingDims)} → ${String(conflict.newDims)}. ` +
|
|
255
|
+
`Qdrant collection "${conflict.vectorCollection}" must be deleted.`));
|
|
256
|
+
const recreate = flags.interactive === false
|
|
257
|
+
? false
|
|
258
|
+
: await promptDimsRecreate(conflict.existingDims, conflict.newDims);
|
|
259
|
+
if (!recreate) {
|
|
260
|
+
console.log(chalk.dim(' Skipped — keeping existing collection. LLM provider NOT saved.'));
|
|
261
|
+
return false;
|
|
253
262
|
}
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
spinner.succeed(`Workspace '${workspaceName}' created!`);
|
|
263
|
+
const spinner = ora(`Deleting Qdrant collection ${conflict.vectorCollection}`).start();
|
|
264
|
+
try {
|
|
265
|
+
await vec.deleteCollection(workspaceId);
|
|
266
|
+
spinner.succeed(`Deleted ${conflict.vectorCollection}`);
|
|
267
|
+
}
|
|
268
|
+
catch (err) {
|
|
269
|
+
spinner.fail(`Failed to delete: ${err instanceof Error ? err.message : String(err)}`);
|
|
270
|
+
return false;
|
|
271
|
+
}
|
|
272
|
+
return true;
|
|
265
273
|
}
|
|
266
274
|
catch (err) {
|
|
267
|
-
|
|
268
|
-
|
|
275
|
+
console.log(chalk.yellow(` ⚠ Could not check Qdrant collection dims: ${err instanceof Error ? err.message : String(err)}`));
|
|
276
|
+
console.log(chalk.dim(' Continuing — first `argustack code index` will create the collection fresh.'));
|
|
277
|
+
return true;
|
|
278
|
+
}
|
|
279
|
+
finally {
|
|
280
|
+
await vec.close();
|
|
269
281
|
}
|
|
270
|
-
printSummary(workspaceDir, jiraResult, gitResult, githubResult, csvResult, dbResult, pgwebPort, false, null);
|
|
271
282
|
}
|
|
272
|
-
async function
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
const
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
if (existing.length > 0) {
|
|
281
|
-
console.log(chalk.dim(` Found ${String(existing.length)} workspace(s) in ${basename(cwd)}:`));
|
|
282
|
-
for (const ws of existing) {
|
|
283
|
-
const sources = ws.config.order.length > 0
|
|
284
|
-
? ws.config.order.map((s) => SOURCE_META[s].label).join(', ')
|
|
285
|
-
: 'no sources';
|
|
286
|
-
console.log(` ${chalk.green('●')} ${chalk.bold(ws.name)} — ${chalk.dim(sources)}`);
|
|
283
|
+
async function resolvePorts(platform, flags) {
|
|
284
|
+
const resolver = new ResolveHubPortsUseCase(platform);
|
|
285
|
+
const { plan } = await resolver.execute({ ...HUB_PORT_DEFAULTS });
|
|
286
|
+
const finalPorts = { ...HUB_PORT_DEFAULTS };
|
|
287
|
+
for (const entry of plan) {
|
|
288
|
+
if (entry.conflict == null) {
|
|
289
|
+
finalPorts[entry.key] = entry.current;
|
|
290
|
+
continue;
|
|
287
291
|
}
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
choices: [
|
|
292
|
-
{ value: 'new', name: 'Create new workspace' },
|
|
293
|
-
...existing.map((ws) => ({
|
|
294
|
-
value: `update:${ws.name}`,
|
|
295
|
-
name: `Update ${ws.name}`,
|
|
296
|
-
})),
|
|
297
|
-
],
|
|
298
|
-
});
|
|
299
|
-
if (action.startsWith('update:')) {
|
|
300
|
-
const updateName = action.slice('update:'.length);
|
|
301
|
-
const ws = existing.find((w) => w.name === updateName);
|
|
302
|
-
if (!ws) {
|
|
303
|
-
throw new Error(`Workspace '${updateName}' not found`);
|
|
292
|
+
if (flags.interactive === false) {
|
|
293
|
+
if (entry.suggested === null) {
|
|
294
|
+
return null;
|
|
304
295
|
}
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
workspaceDir = ws.path;
|
|
296
|
+
finalPorts[entry.key] = entry.suggested;
|
|
297
|
+
continue;
|
|
308
298
|
}
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
return 'This looks like a URL. Enter a short project name (e.g. "myapp", "my-project")';
|
|
315
|
-
}
|
|
316
|
-
const sanitized = sanitizeName(val);
|
|
317
|
-
if (!sanitized) {
|
|
318
|
-
return 'Name is required (letters, numbers, hyphens)';
|
|
319
|
-
}
|
|
320
|
-
if (sanitized.length > 30) {
|
|
321
|
-
return 'Name too long — keep it under 30 characters';
|
|
322
|
-
}
|
|
323
|
-
if (existing.some((ws) => ws.name === sanitized)) {
|
|
324
|
-
return `Workspace '${sanitized}' already exists`;
|
|
325
|
-
}
|
|
326
|
-
return true;
|
|
327
|
-
},
|
|
328
|
-
});
|
|
329
|
-
workspaceName = sanitizeName(rawName);
|
|
330
|
-
workspaceDir = join(cwd, workspaceName);
|
|
299
|
+
const label = labelForPortKey(entry.key);
|
|
300
|
+
const conflictDetails = `${entry.conflict.processName} pid ${String(entry.conflict.pid)}`;
|
|
301
|
+
const decision = await promptPortChoice(label, entry.default, conflictDetails, entry.suggested);
|
|
302
|
+
if (decision.choice === 'abort') {
|
|
303
|
+
return null;
|
|
331
304
|
}
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
return 'This looks like a URL. Enter a short project name (e.g. "myapp", "my-project")';
|
|
339
|
-
}
|
|
340
|
-
const sanitized = sanitizeName(val);
|
|
341
|
-
if (!sanitized) {
|
|
342
|
-
return 'Name is required (letters, numbers, hyphens)';
|
|
343
|
-
}
|
|
344
|
-
if (sanitized.length > 30) {
|
|
345
|
-
return 'Name too long — keep it under 30 characters';
|
|
346
|
-
}
|
|
347
|
-
return true;
|
|
348
|
-
},
|
|
349
|
-
});
|
|
350
|
-
workspaceName = sanitizeName(rawName);
|
|
351
|
-
workspaceDir = join(cwd, workspaceName);
|
|
352
|
-
}
|
|
353
|
-
if (isWorkspace(workspaceDir)) {
|
|
354
|
-
console.log(chalk.yellow(`\n Workspace '${workspaceName}' already exists.`));
|
|
355
|
-
const proceed = await confirm({ message: 'Reinitialize this workspace?', default: false });
|
|
356
|
-
if (!proceed) {
|
|
357
|
-
console.log(chalk.dim(' Cancelled.'));
|
|
358
|
-
return;
|
|
305
|
+
if (decision.choice === 'accept-suggested' && entry.suggested !== null) {
|
|
306
|
+
finalPorts[entry.key] = entry.suggested;
|
|
307
|
+
continue;
|
|
308
|
+
}
|
|
309
|
+
if (decision.choice === 'custom') {
|
|
310
|
+
finalPorts[entry.key] = decision.port;
|
|
359
311
|
}
|
|
360
312
|
}
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
});
|
|
372
|
-
const
|
|
373
|
-
|
|
374
|
-
|
|
313
|
+
printPortPlan(plan.map((p) => ({
|
|
314
|
+
label: labelForPortKey(p.key),
|
|
315
|
+
port: finalPorts[p.key],
|
|
316
|
+
fromDefault: finalPorts[p.key] === p.default,
|
|
317
|
+
})));
|
|
318
|
+
return finalPorts;
|
|
319
|
+
}
|
|
320
|
+
async function bootstrap(_hubStoreFactory, flags, ports, onStep) {
|
|
321
|
+
const platform = new NodePlatformProbe();
|
|
322
|
+
const docker = new CliDockerControl(platform);
|
|
323
|
+
const { PgReadinessProbe, PostgresWorkspaceStore, createPool } = await import('../../adapters/postgres/index.js');
|
|
324
|
+
const hubCredentials = { user: 'argustack', password: 'argustack_hub', database: 'argustack_hub' };
|
|
325
|
+
const readinessProbe = new PgReadinessProbe(hubCredentials);
|
|
326
|
+
const workspaceStoreFactory = (port) => {
|
|
327
|
+
const pool = createPool({ host: 'localhost', port, ...hubCredentials });
|
|
328
|
+
return {
|
|
329
|
+
store: new PostgresWorkspaceStore(pool),
|
|
330
|
+
close: async () => { await pool.end(); },
|
|
331
|
+
};
|
|
332
|
+
};
|
|
333
|
+
const useCase = new BootstrapHubUseCase(docker, readinessProbe, workspaceStoreFactory);
|
|
334
|
+
const templates = getTemplatesDir();
|
|
335
|
+
const result = await useCase.execute({
|
|
336
|
+
hubDir: hubDir(),
|
|
337
|
+
templateComposePath: join(templates, 'hub-docker-compose.yml'),
|
|
338
|
+
templateConfigEnvPath: join(templates, 'hub-config.env'),
|
|
339
|
+
ports,
|
|
340
|
+
...(flags.skipDocker === true ? { skipDocker: true } : {}),
|
|
341
|
+
onStep,
|
|
375
342
|
});
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
const spinner = ora('Creating workspace...').start();
|
|
379
|
-
try {
|
|
380
|
-
createWorkspaceFiles(workspaceDir, jira, git, github, csv, db, dbPort, pgwebPort, workspaceName, proxy);
|
|
381
|
-
spinner.succeed(`Workspace '${workspaceName}' created!`);
|
|
343
|
+
if (result.ok) {
|
|
344
|
+
return { ok: true };
|
|
382
345
|
}
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
default: true,
|
|
391
|
-
});
|
|
392
|
-
printSummary(workspaceDir, jira, git, github, csv, db, pgwebPort, autoStart, proxy);
|
|
393
|
-
if (autoStart) {
|
|
394
|
-
await startAndSync(workspaceDir, jira !== null || proxy !== null, git !== null, github !== null, csv, db, pgwebPort);
|
|
346
|
+
return { ok: false, stage: result.stage, details: result.details };
|
|
347
|
+
}
|
|
348
|
+
function writeNoLlm(ports) {
|
|
349
|
+
const writeRes = new WriteConfigEnvUseCase().execute({ ports, targetPath: hubConfigPath() });
|
|
350
|
+
if (!writeRes.ok) {
|
|
351
|
+
printWriteConfigFailed(writeRes.details);
|
|
352
|
+
process.exit(1);
|
|
395
353
|
}
|
|
354
|
+
resetHubConfigCache();
|
|
396
355
|
}
|
|
397
|
-
|
|
356
|
+
async function setupLlm(flags, platform, ollama, probe) {
|
|
398
357
|
if (flags.interactive === false) {
|
|
399
|
-
|
|
358
|
+
return setupOllama(platform, ollama, probe);
|
|
359
|
+
}
|
|
360
|
+
const hasOwn = await promptOwnLlm();
|
|
361
|
+
if (hasOwn) {
|
|
362
|
+
return setupOwnLlm(platform, ollama, probe);
|
|
363
|
+
}
|
|
364
|
+
return setupOllama(platform, ollama, probe);
|
|
365
|
+
}
|
|
366
|
+
async function setupOwnLlm(platform, ollama, probe) {
|
|
367
|
+
let attempts = 0;
|
|
368
|
+
while (attempts < MAX_PROBE_ATTEMPTS) {
|
|
369
|
+
const { url, model } = await promptOwnLlmUrlAndModel();
|
|
370
|
+
const spinner = ora('Probing LLM').start();
|
|
371
|
+
const result = await probe.execute({ url, model });
|
|
372
|
+
spinner.stop();
|
|
373
|
+
attempts += 1;
|
|
374
|
+
if (result.ok) {
|
|
375
|
+
return { provider: 'custom', url, model, dimensions: result.dims };
|
|
376
|
+
}
|
|
377
|
+
printProbeError(result.kind, result.details);
|
|
378
|
+
const choice = await promptProbeRetry();
|
|
379
|
+
if (choice === 'use-ollama') {
|
|
380
|
+
return setupOllama(platform, ollama, probe);
|
|
381
|
+
}
|
|
382
|
+
if (choice === 'skip') {
|
|
383
|
+
return null;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
console.log(chalk.yellow(' Probe retry limit reached. Continuing without LLM.'));
|
|
387
|
+
return null;
|
|
388
|
+
}
|
|
389
|
+
async function setupOllama(platform, ollama, probe) {
|
|
390
|
+
const installed = await ollama.isInstalled();
|
|
391
|
+
if (!installed) {
|
|
392
|
+
const os = platform.detectOS();
|
|
393
|
+
if (os === 'windows') {
|
|
394
|
+
printOllamaWindowsLink();
|
|
395
|
+
return null;
|
|
396
|
+
}
|
|
397
|
+
const installer = new InstallOllamaUseCase(ollama, platform);
|
|
398
|
+
const spinner = ora('Installing Ollama').start();
|
|
399
|
+
const result = await installer.execute();
|
|
400
|
+
spinner.stop();
|
|
401
|
+
if (!result.ok) {
|
|
402
|
+
printOllamaInstallFailed(result.details);
|
|
403
|
+
return null;
|
|
404
|
+
}
|
|
405
|
+
console.log(chalk.green(` ✓ Ollama installed via ${result.via}`));
|
|
406
|
+
}
|
|
407
|
+
const runSpinner = ora('Starting Ollama').start();
|
|
408
|
+
const run = await new EnsureOllamaRunningUseCase(ollama).execute();
|
|
409
|
+
runSpinner.stop();
|
|
410
|
+
if (!run.ok) {
|
|
411
|
+
printOllamaTimeout();
|
|
412
|
+
return null;
|
|
413
|
+
}
|
|
414
|
+
const modelSpinner = ora('Pulling embedding model').start();
|
|
415
|
+
const ensured = await new EnsureEmbeddingModelUseCase(ollama).execute(DEFAULT_OLLAMA_MODEL, (pct) => { modelSpinner.text = `Pulling ${DEFAULT_OLLAMA_MODEL} (${String(pct)}%)`; });
|
|
416
|
+
modelSpinner.stop();
|
|
417
|
+
if (!ensured.ok) {
|
|
418
|
+
printPullFailed(ensured.kind, ensured.details);
|
|
419
|
+
return null;
|
|
420
|
+
}
|
|
421
|
+
if (ensured.alreadyPresent) {
|
|
422
|
+
console.log(chalk.dim(` ${DEFAULT_OLLAMA_MODEL} already present`));
|
|
400
423
|
}
|
|
401
424
|
else {
|
|
402
|
-
|
|
425
|
+
console.log(chalk.green(` ✓ ${DEFAULT_OLLAMA_MODEL} pulled`));
|
|
426
|
+
}
|
|
427
|
+
const probeSpinner = ora('Probing embedding').start();
|
|
428
|
+
const probed = await probe.execute({ url: DEFAULT_OLLAMA_URL, model: DEFAULT_OLLAMA_MODEL });
|
|
429
|
+
probeSpinner.stop();
|
|
430
|
+
if (!probed.ok) {
|
|
431
|
+
printProbeError(probed.kind, probed.details);
|
|
432
|
+
return null;
|
|
403
433
|
}
|
|
434
|
+
console.log(chalk.green(` ✓ embedding works (${String(probed.dims)} dims)`));
|
|
435
|
+
return { provider: 'ollama', url: DEFAULT_OLLAMA_URL, model: DEFAULT_OLLAMA_MODEL, dimensions: probed.dims };
|
|
404
436
|
}
|
|
405
437
|
//# sourceMappingURL=index.js.map
|