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
|
@@ -1,648 +1,132 @@
|
|
|
1
1
|
import { createPool } from './connection.js';
|
|
2
2
|
import { ensureSchema } from './schema.js';
|
|
3
|
-
import { adfToMarkdown } from '../../workspace/adf.js';
|
|
4
3
|
import { PostgresCodeMetaStore } from './code-meta.js';
|
|
4
|
+
import { PostgresIssueStorage } from './storage-issues.js';
|
|
5
|
+
import { PostgresCommitStorage } from './storage-commits.js';
|
|
6
|
+
import { PostgresPullRequestStorage } from './storage-prs.js';
|
|
7
|
+
import { PostgresSearchStorage } from './storage-search.js';
|
|
8
|
+
import { PostgresDbSchemaStorage } from './storage-dbschema.js';
|
|
9
|
+
import { PostgresGraphStorage } from './storage-graph.js';
|
|
10
|
+
import { PostgresQueryStorage } from './storage-query.js';
|
|
5
11
|
/**
|
|
6
|
-
* PostgreSQL adapter — implements IStorage + ICodeMetaStore
|
|
12
|
+
* PostgreSQL adapter — implements {@link IStorage} + {@link ICodeMetaStore}
|
|
13
|
+
* (via the {@link PostgresCodeMetaStore} base class).
|
|
7
14
|
*
|
|
8
|
-
*
|
|
15
|
+
* Composition over inheritance: this class is a thin orchestrator that
|
|
16
|
+
* holds one specialized storage module per aggregate
|
|
17
|
+
* (`storage-issues`, `storage-commits`, etc.) and delegates every
|
|
18
|
+
* `IStorage` method to the matching module. Each module owns the SQL
|
|
19
|
+
* for one table family and stays under the 900-line architectural
|
|
20
|
+
* file-size cap.
|
|
21
|
+
*
|
|
22
|
+
* Every public method is scoped by `workspaceId` as the first
|
|
23
|
+
* parameter and binds it to the tenant `workspace_id` column.
|
|
9
24
|
*/
|
|
10
25
|
export class PostgresStorage extends PostgresCodeMetaStore {
|
|
11
26
|
name = 'PostgreSQL';
|
|
27
|
+
issues;
|
|
28
|
+
commits;
|
|
29
|
+
prs;
|
|
30
|
+
search;
|
|
31
|
+
dbSchema;
|
|
32
|
+
graph;
|
|
33
|
+
query;
|
|
12
34
|
constructor(config) {
|
|
13
35
|
super(createPool(config));
|
|
36
|
+
this.issues = new PostgresIssueStorage(this.pool);
|
|
37
|
+
this.commits = new PostgresCommitStorage(this.pool);
|
|
38
|
+
this.prs = new PostgresPullRequestStorage(this.pool);
|
|
39
|
+
this.search = new PostgresSearchStorage(this.pool);
|
|
40
|
+
this.dbSchema = new PostgresDbSchemaStorage(this.pool);
|
|
41
|
+
this.graph = new PostgresGraphStorage(this.pool);
|
|
42
|
+
this.query = new PostgresQueryStorage(this.pool);
|
|
14
43
|
}
|
|
15
44
|
async initialize() {
|
|
16
45
|
await ensureSchema(this.pool);
|
|
17
46
|
}
|
|
18
|
-
async saveBatch(batch) {
|
|
19
|
-
|
|
20
|
-
try {
|
|
21
|
-
await client.query('BEGIN');
|
|
22
|
-
for (const issue of batch.issues) {
|
|
23
|
-
await client.query(`INSERT INTO issues (
|
|
24
|
-
issue_key, issue_id, project_key, summary, description,
|
|
25
|
-
issue_type, status, status_category, priority, resolution,
|
|
26
|
-
assignee, assignee_id, reporter, reporter_id, created, updated, resolved,
|
|
27
|
-
due_date, labels, components, fix_versions, parent_key,
|
|
28
|
-
sprint, story_points, original_estimate, remaining_estimate, time_spent,
|
|
29
|
-
custom_fields, raw_json, source, pulled_at,
|
|
30
|
-
search_vector
|
|
31
|
-
) VALUES (
|
|
32
|
-
$1, $2, $3, $4, $5,
|
|
33
|
-
$6, $7, $8, $9, $10,
|
|
34
|
-
$11, $12, $13, $14, $15, $16, $17,
|
|
35
|
-
$18, $19, $20, $21, $22,
|
|
36
|
-
$23, $24, $25, $26, $27,
|
|
37
|
-
$28, $29, $30, NOW(),
|
|
38
|
-
to_tsvector('english', $31)
|
|
39
|
-
)
|
|
40
|
-
ON CONFLICT (issue_key) DO UPDATE SET
|
|
41
|
-
issue_id = EXCLUDED.issue_id,
|
|
42
|
-
project_key = EXCLUDED.project_key,
|
|
43
|
-
summary = EXCLUDED.summary,
|
|
44
|
-
description = EXCLUDED.description,
|
|
45
|
-
issue_type = EXCLUDED.issue_type,
|
|
46
|
-
status = EXCLUDED.status,
|
|
47
|
-
status_category = EXCLUDED.status_category,
|
|
48
|
-
priority = EXCLUDED.priority,
|
|
49
|
-
resolution = EXCLUDED.resolution,
|
|
50
|
-
assignee = EXCLUDED.assignee,
|
|
51
|
-
assignee_id = EXCLUDED.assignee_id,
|
|
52
|
-
reporter = EXCLUDED.reporter,
|
|
53
|
-
reporter_id = EXCLUDED.reporter_id,
|
|
54
|
-
created = EXCLUDED.created,
|
|
55
|
-
updated = EXCLUDED.updated,
|
|
56
|
-
resolved = EXCLUDED.resolved,
|
|
57
|
-
due_date = EXCLUDED.due_date,
|
|
58
|
-
labels = EXCLUDED.labels,
|
|
59
|
-
components = EXCLUDED.components,
|
|
60
|
-
fix_versions = EXCLUDED.fix_versions,
|
|
61
|
-
parent_key = EXCLUDED.parent_key,
|
|
62
|
-
sprint = EXCLUDED.sprint,
|
|
63
|
-
story_points = EXCLUDED.story_points,
|
|
64
|
-
original_estimate = EXCLUDED.original_estimate,
|
|
65
|
-
remaining_estimate = EXCLUDED.remaining_estimate,
|
|
66
|
-
time_spent = EXCLUDED.time_spent,
|
|
67
|
-
custom_fields = EXCLUDED.custom_fields,
|
|
68
|
-
raw_json = EXCLUDED.raw_json,
|
|
69
|
-
source = EXCLUDED.source,
|
|
70
|
-
pulled_at = NOW(),
|
|
71
|
-
search_vector = to_tsvector('english', coalesce(EXCLUDED.summary, '') || ' ' || coalesce(EXCLUDED.description, ''))
|
|
72
|
-
`, [
|
|
73
|
-
issue.key, issue.id, issue.projectKey, issue.summary, normalizeDescription(issue.description),
|
|
74
|
-
issue.issueType, issue.status, issue.statusCategory, issue.priority, issue.resolution,
|
|
75
|
-
issue.assignee, issue.assigneeId, issue.reporter, issue.reporterId, issue.created, issue.updated, issue.resolved,
|
|
76
|
-
issue.dueDate, issue.labels, issue.components, issue.fixVersions, issue.parentKey,
|
|
77
|
-
issue.sprint, issue.storyPoints, issue.originalEstimate, issue.remainingEstimate, issue.timeSpent,
|
|
78
|
-
JSON.stringify(issue.customFields), JSON.stringify(issue.rawJson), issue.source ?? 'jira',
|
|
79
|
-
[issue.summary, normalizeDescription(issue.description)].filter(Boolean).join(' '),
|
|
80
|
-
]);
|
|
81
|
-
}
|
|
82
|
-
const issueKeys = batch.issues.map((i) => i.key);
|
|
83
|
-
if (issueKeys.length > 0) {
|
|
84
|
-
const keysParam = issueKeys.map((_, i) => `$${i + 1}`).join(',');
|
|
85
|
-
await client.query(`DELETE FROM issue_comments WHERE issue_key IN (${keysParam})`, issueKeys);
|
|
86
|
-
await client.query(`DELETE FROM issue_changelogs WHERE issue_key IN (${keysParam})`, issueKeys);
|
|
87
|
-
await client.query(`DELETE FROM issue_worklogs WHERE issue_key IN (${keysParam})`, issueKeys);
|
|
88
|
-
await client.query(`DELETE FROM issue_links WHERE source_key IN (${keysParam})`, issueKeys);
|
|
89
|
-
}
|
|
90
|
-
for (const c of batch.comments) {
|
|
91
|
-
await client.query(`INSERT INTO issue_comments (issue_key, comment_id, author, body, created, updated)
|
|
92
|
-
VALUES ($1, $2, $3, $4, $5, $6)`, [c.issueKey, c.commentId, c.author, c.body, c.created, c.updated]);
|
|
93
|
-
}
|
|
94
|
-
for (const ch of batch.changelogs) {
|
|
95
|
-
await client.query(`INSERT INTO issue_changelogs (issue_key, author, field, from_value, to_value, changed_at)
|
|
96
|
-
VALUES ($1, $2, $3, $4, $5, $6)`, [ch.issueKey, ch.author, ch.field, ch.fromValue, ch.toValue, ch.changedAt]);
|
|
97
|
-
}
|
|
98
|
-
for (const w of batch.worklogs) {
|
|
99
|
-
await client.query(`INSERT INTO issue_worklogs (issue_key, author, time_spent, time_spent_seconds, comment, started)
|
|
100
|
-
VALUES ($1, $2, $3, $4, $5, $6)`, [w.issueKey, w.author, w.timeSpent, w.timeSpentSeconds, w.comment, w.started]);
|
|
101
|
-
}
|
|
102
|
-
for (const l of batch.links) {
|
|
103
|
-
await client.query(`INSERT INTO issue_links (source_key, target_key, link_type, direction)
|
|
104
|
-
VALUES ($1, $2, $3, $4)`, [l.sourceKey, l.targetKey, l.linkType, l.direction]);
|
|
105
|
-
}
|
|
106
|
-
await client.query('COMMIT');
|
|
107
|
-
}
|
|
108
|
-
catch (err) {
|
|
109
|
-
await client.query('ROLLBACK');
|
|
110
|
-
throw err;
|
|
111
|
-
}
|
|
112
|
-
finally {
|
|
113
|
-
client.release();
|
|
114
|
-
}
|
|
47
|
+
async saveBatch(workspaceId, batch) {
|
|
48
|
+
await this.issues.saveBatch(workspaceId, batch);
|
|
115
49
|
}
|
|
116
|
-
async
|
|
117
|
-
|
|
118
|
-
try {
|
|
119
|
-
await client.query('BEGIN');
|
|
120
|
-
for (const commit of batch.commits) {
|
|
121
|
-
await client.query(`INSERT INTO commits (hash, message, author, email, committed_at, parents, repo_path, pulled_at, search_vector)
|
|
122
|
-
VALUES ($1, $2, $3, $4, $5, $6::text[], $7, NOW(),
|
|
123
|
-
to_tsvector('english', $8)
|
|
124
|
-
)
|
|
125
|
-
ON CONFLICT (hash) DO UPDATE SET
|
|
126
|
-
message = EXCLUDED.message,
|
|
127
|
-
author = EXCLUDED.author,
|
|
128
|
-
email = EXCLUDED.email,
|
|
129
|
-
committed_at = EXCLUDED.committed_at,
|
|
130
|
-
parents = EXCLUDED.parents,
|
|
131
|
-
repo_path = EXCLUDED.repo_path,
|
|
132
|
-
pulled_at = NOW(),
|
|
133
|
-
search_vector = to_tsvector('english', coalesce(EXCLUDED.message, '') || ' ' || coalesce(EXCLUDED.author, ''))`, [commit.hash, commit.message, commit.author, commit.email, commit.committedAt, commit.parents, commit.repoPath, `${commit.message || ''} ${commit.author || ''}`]);
|
|
134
|
-
}
|
|
135
|
-
const hashes = batch.commits.map((c) => c.hash);
|
|
136
|
-
if (hashes.length > 0) {
|
|
137
|
-
const hashesParam = hashes.map((_, i) => `$${i + 1}`).join(',');
|
|
138
|
-
await client.query(`DELETE FROM commit_files WHERE commit_hash IN (${hashesParam})`, hashes);
|
|
139
|
-
await client.query(`DELETE FROM commit_issue_refs WHERE commit_hash IN (${hashesParam})`, hashes);
|
|
140
|
-
}
|
|
141
|
-
for (const file of batch.files) {
|
|
142
|
-
await client.query(`INSERT INTO commit_files (commit_hash, file_path, status, additions, deletions)
|
|
143
|
-
VALUES ($1, $2, $3, $4, $5)`, [file.commitHash, file.filePath, file.status, file.additions, file.deletions]);
|
|
144
|
-
}
|
|
145
|
-
for (const ref of batch.issueRefs) {
|
|
146
|
-
await client.query(`INSERT INTO commit_issue_refs (commit_hash, issue_key)
|
|
147
|
-
VALUES ($1, $2)
|
|
148
|
-
ON CONFLICT DO NOTHING`, [ref.commitHash, ref.issueKey]);
|
|
149
|
-
}
|
|
150
|
-
await client.query('COMMIT');
|
|
151
|
-
}
|
|
152
|
-
catch (err) {
|
|
153
|
-
await client.query('ROLLBACK');
|
|
154
|
-
throw err;
|
|
155
|
-
}
|
|
156
|
-
finally {
|
|
157
|
-
client.release();
|
|
158
|
-
}
|
|
50
|
+
async getLastUpdated(workspaceId, projectKey) {
|
|
51
|
+
return this.issues.getLastUpdated(workspaceId, projectKey);
|
|
159
52
|
}
|
|
160
|
-
async
|
|
161
|
-
|
|
162
|
-
return result.rows[0]?.last_date ?? null;
|
|
53
|
+
async getLocalIssues(workspaceId) {
|
|
54
|
+
return this.issues.getLocalIssues(workspaceId);
|
|
163
55
|
}
|
|
164
|
-
async
|
|
165
|
-
|
|
166
|
-
const raw = result.rows[0]?.last_updated;
|
|
167
|
-
if (!raw) {
|
|
168
|
-
return null;
|
|
169
|
-
}
|
|
170
|
-
return new Date(raw).toISOString();
|
|
56
|
+
async updateIssueSource(workspaceId, issueKey, source) {
|
|
57
|
+
await this.issues.updateIssueSource(workspaceId, issueKey, source);
|
|
171
58
|
}
|
|
172
|
-
async
|
|
173
|
-
|
|
174
|
-
try {
|
|
175
|
-
await client.query('BEGIN');
|
|
176
|
-
for (const pr of batch.pullRequests) {
|
|
177
|
-
await client.query(`INSERT INTO pull_requests (
|
|
178
|
-
number, repo_full_name, title, body, state, author,
|
|
179
|
-
created_at, updated_at, merged_at, closed_at,
|
|
180
|
-
merge_commit_sha, head_ref, base_ref,
|
|
181
|
-
labels, reviewers, additions, deletions, changed_files,
|
|
182
|
-
raw_json, pulled_at, search_vector
|
|
183
|
-
) VALUES (
|
|
184
|
-
$1, $2, $3, $4, $5, $6,
|
|
185
|
-
$7, $8, $9, $10,
|
|
186
|
-
$11, $12, $13,
|
|
187
|
-
$14::text[], $15::text[], $16, $17, $18,
|
|
188
|
-
$19, NOW(),
|
|
189
|
-
to_tsvector('english', $20)
|
|
190
|
-
)
|
|
191
|
-
ON CONFLICT (repo_full_name, number) DO UPDATE SET
|
|
192
|
-
title = EXCLUDED.title,
|
|
193
|
-
body = EXCLUDED.body,
|
|
194
|
-
state = EXCLUDED.state,
|
|
195
|
-
author = EXCLUDED.author,
|
|
196
|
-
created_at = EXCLUDED.created_at,
|
|
197
|
-
updated_at = EXCLUDED.updated_at,
|
|
198
|
-
merged_at = EXCLUDED.merged_at,
|
|
199
|
-
closed_at = EXCLUDED.closed_at,
|
|
200
|
-
merge_commit_sha = EXCLUDED.merge_commit_sha,
|
|
201
|
-
head_ref = EXCLUDED.head_ref,
|
|
202
|
-
base_ref = EXCLUDED.base_ref,
|
|
203
|
-
labels = EXCLUDED.labels,
|
|
204
|
-
reviewers = EXCLUDED.reviewers,
|
|
205
|
-
additions = EXCLUDED.additions,
|
|
206
|
-
deletions = EXCLUDED.deletions,
|
|
207
|
-
changed_files = EXCLUDED.changed_files,
|
|
208
|
-
raw_json = EXCLUDED.raw_json,
|
|
209
|
-
pulled_at = NOW(),
|
|
210
|
-
search_vector = to_tsvector('english', coalesce(EXCLUDED.title, '') || ' ' || coalesce(EXCLUDED.body, ''))`, [
|
|
211
|
-
pr.number, pr.repoFullName, pr.title, pr.body, pr.state, pr.author,
|
|
212
|
-
pr.createdAt, pr.updatedAt, pr.mergedAt, pr.closedAt,
|
|
213
|
-
pr.mergeCommitSha, pr.headRef, pr.baseRef,
|
|
214
|
-
pr.labels, pr.reviewers, pr.additions, pr.deletions, pr.changedFiles,
|
|
215
|
-
JSON.stringify(pr.rawJson),
|
|
216
|
-
[pr.title, pr.body].filter(Boolean).join(' '),
|
|
217
|
-
]);
|
|
218
|
-
}
|
|
219
|
-
const prNumbers = batch.pullRequests.map((p) => p.number);
|
|
220
|
-
const repoName = batch.pullRequests[0]?.repoFullName;
|
|
221
|
-
if (prNumbers.length > 0 && repoName) {
|
|
222
|
-
const prParams = prNumbers.map((_, i) => `$${i + 2}`).join(',');
|
|
223
|
-
await client.query(`DELETE FROM pr_reviews WHERE repo_full_name = $1 AND pr_number IN (${prParams})`, [repoName, ...prNumbers]);
|
|
224
|
-
await client.query(`DELETE FROM pr_comments WHERE repo_full_name = $1 AND pr_number IN (${prParams})`, [repoName, ...prNumbers]);
|
|
225
|
-
await client.query(`DELETE FROM pr_files WHERE repo_full_name = $1 AND pr_number IN (${prParams})`, [repoName, ...prNumbers]);
|
|
226
|
-
await client.query(`DELETE FROM pr_issue_refs WHERE repo_full_name = $1 AND pr_number IN (${prParams})`, [repoName, ...prNumbers]);
|
|
227
|
-
}
|
|
228
|
-
for (const r of batch.reviews) {
|
|
229
|
-
await client.query(`INSERT INTO pr_reviews (pr_number, repo_full_name, review_id, reviewer, state, body, submitted_at)
|
|
230
|
-
VALUES ($1, $2, $3, $4, $5, $6, $7)`, [r.prNumber, r.repoFullName, r.reviewId, r.reviewer, r.state, r.body, r.submittedAt]);
|
|
231
|
-
}
|
|
232
|
-
for (const c of batch.comments) {
|
|
233
|
-
await client.query(`INSERT INTO pr_comments (pr_number, repo_full_name, comment_id, author, body, path, line, created_at, updated_at)
|
|
234
|
-
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)`, [c.prNumber, c.repoFullName, c.commentId, c.author, c.body, c.path, c.line, c.createdAt, c.updatedAt]);
|
|
235
|
-
}
|
|
236
|
-
for (const f of batch.files) {
|
|
237
|
-
await client.query(`INSERT INTO pr_files (pr_number, repo_full_name, file_path, status, additions, deletions)
|
|
238
|
-
VALUES ($1, $2, $3, $4, $5, $6)`, [f.prNumber, f.repoFullName, f.filePath, f.status, f.additions, f.deletions]);
|
|
239
|
-
}
|
|
240
|
-
for (const ref of batch.issueRefs) {
|
|
241
|
-
await client.query(`INSERT INTO pr_issue_refs (pr_number, repo_full_name, issue_key)
|
|
242
|
-
VALUES ($1, $2, $3)
|
|
243
|
-
ON CONFLICT DO NOTHING`, [ref.prNumber, ref.repoFullName, ref.issueKey]);
|
|
244
|
-
}
|
|
245
|
-
await client.query('COMMIT');
|
|
246
|
-
}
|
|
247
|
-
catch (err) {
|
|
248
|
-
await client.query('ROLLBACK');
|
|
249
|
-
throw err;
|
|
250
|
-
}
|
|
251
|
-
finally {
|
|
252
|
-
client.release();
|
|
253
|
-
}
|
|
59
|
+
async updateIssueFields(workspaceId, issueKey, fields) {
|
|
60
|
+
await this.issues.updateIssueFields(workspaceId, issueKey, fields);
|
|
254
61
|
}
|
|
255
|
-
async
|
|
256
|
-
|
|
257
|
-
try {
|
|
258
|
-
await client.query('BEGIN');
|
|
259
|
-
for (const rel of releases) {
|
|
260
|
-
await client.query(`INSERT INTO releases (
|
|
261
|
-
id, repo_full_name, tag_name, name, body, author,
|
|
262
|
-
draft, prerelease, created_at, published_at,
|
|
263
|
-
raw_json, pulled_at, search_vector
|
|
264
|
-
) VALUES (
|
|
265
|
-
$1, $2, $3, $4, $5, $6,
|
|
266
|
-
$7, $8, $9, $10,
|
|
267
|
-
$11, NOW(),
|
|
268
|
-
to_tsvector('english', $12)
|
|
269
|
-
)
|
|
270
|
-
ON CONFLICT (repo_full_name, id) DO UPDATE SET
|
|
271
|
-
tag_name = EXCLUDED.tag_name,
|
|
272
|
-
name = EXCLUDED.name,
|
|
273
|
-
body = EXCLUDED.body,
|
|
274
|
-
author = EXCLUDED.author,
|
|
275
|
-
draft = EXCLUDED.draft,
|
|
276
|
-
prerelease = EXCLUDED.prerelease,
|
|
277
|
-
created_at = EXCLUDED.created_at,
|
|
278
|
-
published_at = EXCLUDED.published_at,
|
|
279
|
-
raw_json = EXCLUDED.raw_json,
|
|
280
|
-
pulled_at = NOW(),
|
|
281
|
-
search_vector = to_tsvector('english', coalesce(EXCLUDED.name, '') || ' ' || coalesce(EXCLUDED.body, '') || ' ' || coalesce(EXCLUDED.tag_name, ''))`, [
|
|
282
|
-
rel.id, rel.repoFullName, rel.tagName, rel.name, rel.body, rel.author,
|
|
283
|
-
rel.draft, rel.prerelease, rel.createdAt, rel.publishedAt,
|
|
284
|
-
JSON.stringify(rel.rawJson),
|
|
285
|
-
[rel.name, rel.body, rel.tagName].filter(Boolean).join(' '),
|
|
286
|
-
]);
|
|
287
|
-
}
|
|
288
|
-
await client.query('COMMIT');
|
|
289
|
-
}
|
|
290
|
-
catch (err) {
|
|
291
|
-
await client.query('ROLLBACK');
|
|
292
|
-
throw err;
|
|
293
|
-
}
|
|
294
|
-
finally {
|
|
295
|
-
client.release();
|
|
296
|
-
}
|
|
62
|
+
async getModifiedIssues(workspaceId) {
|
|
63
|
+
return this.issues.getModifiedIssues(workspaceId);
|
|
297
64
|
}
|
|
298
|
-
async
|
|
299
|
-
|
|
300
|
-
return result.rows[0]?.last_updated ?? null;
|
|
65
|
+
async clearModifiedFlag(workspaceId, issueKey) {
|
|
66
|
+
await this.issues.clearModifiedFlag(workspaceId, issueKey);
|
|
301
67
|
}
|
|
302
|
-
async
|
|
303
|
-
|
|
304
|
-
return result.rows.map((r) => r.issue_key);
|
|
68
|
+
async saveCommitBatch(workspaceId, batch) {
|
|
69
|
+
await this.commits.saveCommitBatch(workspaceId, batch);
|
|
305
70
|
}
|
|
306
|
-
async
|
|
307
|
-
|
|
71
|
+
async getLastCommitDate(workspaceId, repoPath) {
|
|
72
|
+
return this.commits.getLastCommitDate(workspaceId, repoPath);
|
|
308
73
|
}
|
|
309
|
-
async
|
|
310
|
-
|
|
311
|
-
const thresholdClause = threshold !== undefined
|
|
312
|
-
? `AND 1 - (embedding <=> $1::vector) >= ${String(threshold)}`
|
|
313
|
-
: '';
|
|
314
|
-
const result = await this.pool.query(`SELECT issue_key, 1 - (embedding <=> $1::vector) AS similarity
|
|
315
|
-
FROM issues
|
|
316
|
-
WHERE embedding IS NOT NULL ${thresholdClause}
|
|
317
|
-
ORDER BY embedding <=> $1::vector
|
|
318
|
-
LIMIT $2`, [vectorStr, limit]);
|
|
319
|
-
return result.rows.map((r) => ({
|
|
320
|
-
issueKey: r.issue_key,
|
|
321
|
-
similarity: r.similarity,
|
|
322
|
-
}));
|
|
74
|
+
async saveGitHubBatch(workspaceId, batch) {
|
|
75
|
+
await this.prs.saveGitHubBatch(workspaceId, batch);
|
|
323
76
|
}
|
|
324
|
-
async
|
|
325
|
-
|
|
326
|
-
const maxPerSource = limit * 2;
|
|
327
|
-
const minSimilarity = threshold ?? 0.5;
|
|
328
|
-
if (!vector) {
|
|
329
|
-
const result = await this.pool.query(`SELECT issue_key,
|
|
330
|
-
1.0 / (${String(k)} + ROW_NUMBER() OVER (ORDER BY ts_rank_cd(search_vector, plainto_tsquery('english', $1)) DESC)) AS score,
|
|
331
|
-
true AS in_text,
|
|
332
|
-
false AS in_vector
|
|
333
|
-
FROM issues
|
|
334
|
-
WHERE search_vector @@ plainto_tsquery('english', $1)
|
|
335
|
-
ORDER BY score DESC
|
|
336
|
-
LIMIT $2`, [query, limit]);
|
|
337
|
-
return result.rows.map((r) => ({
|
|
338
|
-
issueKey: r.issue_key,
|
|
339
|
-
score: r.score,
|
|
340
|
-
source: 'text',
|
|
341
|
-
}));
|
|
342
|
-
}
|
|
343
|
-
const vectorStr = `[${vector.join(',')}]`;
|
|
344
|
-
const result = await this.pool.query(`WITH text_search AS (
|
|
345
|
-
SELECT issue_key, ROW_NUMBER() OVER (ORDER BY ts_rank_cd(search_vector, plainto_tsquery('english', $1)) DESC) AS rank
|
|
346
|
-
FROM issues
|
|
347
|
-
WHERE search_vector @@ plainto_tsquery('english', $1)
|
|
348
|
-
LIMIT $3
|
|
349
|
-
),
|
|
350
|
-
vector_search AS (
|
|
351
|
-
SELECT issue_key, ROW_NUMBER() OVER (ORDER BY embedding <=> $2::vector) AS rank
|
|
352
|
-
FROM issues
|
|
353
|
-
WHERE embedding IS NOT NULL
|
|
354
|
-
AND 1 - (embedding <=> $2::vector) >= ${String(minSimilarity)}
|
|
355
|
-
LIMIT $3
|
|
356
|
-
)
|
|
357
|
-
SELECT COALESCE(t.issue_key, v.issue_key) AS issue_key,
|
|
358
|
-
1.0 / (${String(k)} + COALESCE(t.rank, 1000)) + 1.0 / (${String(k)} + COALESCE(v.rank, 1000)) AS score,
|
|
359
|
-
t.issue_key IS NOT NULL AS in_text,
|
|
360
|
-
v.issue_key IS NOT NULL AS in_vector
|
|
361
|
-
FROM text_search t
|
|
362
|
-
FULL OUTER JOIN vector_search v ON t.issue_key = v.issue_key
|
|
363
|
-
ORDER BY score DESC
|
|
364
|
-
LIMIT $4`, [query, vectorStr, maxPerSource, limit]);
|
|
365
|
-
return result.rows.map((r) => {
|
|
366
|
-
let source;
|
|
367
|
-
if (r.in_text && r.in_vector) {
|
|
368
|
-
source = 'both';
|
|
369
|
-
}
|
|
370
|
-
else if (r.in_text) {
|
|
371
|
-
source = 'text';
|
|
372
|
-
}
|
|
373
|
-
else {
|
|
374
|
-
source = 'semantic';
|
|
375
|
-
}
|
|
376
|
-
return { issueKey: r.issue_key, score: r.score, source };
|
|
377
|
-
});
|
|
77
|
+
async saveReleases(workspaceId, releases) {
|
|
78
|
+
await this.prs.saveReleases(workspaceId, releases);
|
|
378
79
|
}
|
|
379
|
-
async
|
|
380
|
-
|
|
381
|
-
return { rows: result.rows };
|
|
80
|
+
async getLastPrUpdated(workspaceId, repoFullName) {
|
|
81
|
+
return this.prs.getLastPrUpdated(workspaceId, repoFullName);
|
|
382
82
|
}
|
|
383
|
-
async
|
|
384
|
-
|
|
385
|
-
try {
|
|
386
|
-
await client.query('BEGIN');
|
|
387
|
-
for (const table of batch.tables) {
|
|
388
|
-
await client.query(`INSERT INTO db_tables (source_name, table_schema, table_name, row_count, size_bytes)
|
|
389
|
-
VALUES ($1, $2, $3, $4, $5)
|
|
390
|
-
ON CONFLICT (source_name, table_schema, table_name) DO UPDATE SET
|
|
391
|
-
row_count = EXCLUDED.row_count,
|
|
392
|
-
size_bytes = EXCLUDED.size_bytes,
|
|
393
|
-
pulled_at = NOW()`, [sourceName, table.schema, table.name, table.rowCount, table.sizeBytes]);
|
|
394
|
-
for (const col of table.columns) {
|
|
395
|
-
await client.query(`INSERT INTO db_columns (source_name, table_schema, table_name, column_name, data_type, is_nullable, default_value, is_primary_key, ordinal_position)
|
|
396
|
-
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)
|
|
397
|
-
ON CONFLICT (source_name, table_schema, table_name, column_name) DO UPDATE SET
|
|
398
|
-
data_type = EXCLUDED.data_type,
|
|
399
|
-
is_nullable = EXCLUDED.is_nullable,
|
|
400
|
-
default_value = EXCLUDED.default_value,
|
|
401
|
-
is_primary_key = EXCLUDED.is_primary_key,
|
|
402
|
-
ordinal_position = EXCLUDED.ordinal_position`, [sourceName, table.schema, table.name, col.name, col.dataType, col.nullable, col.defaultValue, col.isPrimaryKey, col.ordinalPosition]);
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
for (const fk of batch.foreignKeys) {
|
|
406
|
-
await client.query(`INSERT INTO db_foreign_keys (source_name, table_name, column_name, referenced_table, referenced_column)
|
|
407
|
-
VALUES ($1, $2, $3, $4, $5)
|
|
408
|
-
ON CONFLICT (source_name, table_name, column_name, referenced_table, referenced_column) DO NOTHING`, [sourceName, fk.tableName, fk.columnName, fk.referencedTable, fk.referencedColumn]);
|
|
409
|
-
}
|
|
410
|
-
for (const idx of batch.indexes) {
|
|
411
|
-
await client.query(`INSERT INTO db_indexes (source_name, table_name, index_name, columns, is_unique, is_primary)
|
|
412
|
-
VALUES ($1, $2, $3, $4, $5, $6)
|
|
413
|
-
ON CONFLICT (source_name, table_name, index_name) DO UPDATE SET
|
|
414
|
-
columns = EXCLUDED.columns,
|
|
415
|
-
is_unique = EXCLUDED.is_unique,
|
|
416
|
-
is_primary = EXCLUDED.is_primary`, [sourceName, idx.tableName, idx.indexName, idx.columns, idx.isUnique, idx.isPrimary]);
|
|
417
|
-
}
|
|
418
|
-
await client.query('COMMIT');
|
|
419
|
-
}
|
|
420
|
-
catch (err) {
|
|
421
|
-
await client.query('ROLLBACK');
|
|
422
|
-
throw err;
|
|
423
|
-
}
|
|
424
|
-
finally {
|
|
425
|
-
client.release();
|
|
426
|
-
}
|
|
83
|
+
async getUnembeddedIssueKeys(workspaceId, limit) {
|
|
84
|
+
return this.search.getUnembeddedIssueKeys(workspaceId, limit);
|
|
427
85
|
}
|
|
428
|
-
async
|
|
429
|
-
await this.
|
|
430
|
-
await this.pool.query('DELETE FROM db_foreign_keys WHERE source_name = $1', [sourceName]);
|
|
431
|
-
await this.pool.query('DELETE FROM db_columns WHERE source_name = $1', [sourceName]);
|
|
432
|
-
await this.pool.query('DELETE FROM db_tables WHERE source_name = $1', [sourceName]);
|
|
86
|
+
async saveEmbedding(workspaceId, issueKey, vector) {
|
|
87
|
+
await this.search.saveEmbedding(workspaceId, issueKey, vector);
|
|
433
88
|
}
|
|
434
|
-
async
|
|
435
|
-
|
|
436
|
-
return result.rows.map((row) => this.mapRowToIssue(row));
|
|
89
|
+
async semanticSearch(workspaceId, vector, limit, threshold) {
|
|
90
|
+
return this.search.semanticSearch(workspaceId, vector, limit, threshold);
|
|
437
91
|
}
|
|
438
|
-
async
|
|
439
|
-
|
|
92
|
+
async hybridSearch(workspaceId, query, vector, limit, threshold) {
|
|
93
|
+
return this.search.hybridSearch(workspaceId, query, vector, limit, threshold);
|
|
440
94
|
}
|
|
441
|
-
async
|
|
442
|
-
|
|
443
|
-
if (fields.summary !== undefined) {
|
|
444
|
-
fieldMap['summary'] = fields.summary;
|
|
445
|
-
}
|
|
446
|
-
if (fields.description !== undefined) {
|
|
447
|
-
fieldMap['description'] = fields.description;
|
|
448
|
-
}
|
|
449
|
-
if (fields.status !== undefined) {
|
|
450
|
-
fieldMap['status'] = fields.status;
|
|
451
|
-
}
|
|
452
|
-
if (fields.priority !== undefined) {
|
|
453
|
-
fieldMap['priority'] = fields.priority;
|
|
454
|
-
}
|
|
455
|
-
if (fields.assignee !== undefined) {
|
|
456
|
-
fieldMap['assignee'] = fields.assignee;
|
|
457
|
-
}
|
|
458
|
-
if (fields.labels !== undefined) {
|
|
459
|
-
fieldMap['labels'] = fields.labels;
|
|
460
|
-
}
|
|
461
|
-
if (fields.components !== undefined) {
|
|
462
|
-
fieldMap['components'] = fields.components;
|
|
463
|
-
}
|
|
464
|
-
if (fields.storyPoints !== undefined) {
|
|
465
|
-
fieldMap['story_points'] = fields.storyPoints;
|
|
466
|
-
}
|
|
467
|
-
const keys = Object.keys(fieldMap);
|
|
468
|
-
if (keys.length === 0) {
|
|
469
|
-
return;
|
|
470
|
-
}
|
|
471
|
-
const setClauses = keys.map((col, i) => `${col} = $${String(i + 2)}`);
|
|
472
|
-
setClauses.push('locally_modified = true', 'modified_at = NOW()');
|
|
473
|
-
setClauses.push(`modified_fields = $${String(keys.length + 2)}`);
|
|
474
|
-
const values = keys.map((col) => fieldMap[col]);
|
|
475
|
-
values.push(keys);
|
|
476
|
-
const sql = `UPDATE issues SET ${setClauses.join(', ')} WHERE issue_key = $1`;
|
|
477
|
-
const result = await this.pool.query(sql, [issueKey, ...values]);
|
|
478
|
-
if (result.rowCount === 0) {
|
|
479
|
-
throw new Error(`Issue ${issueKey} not found in local database`);
|
|
480
|
-
}
|
|
95
|
+
async saveDbSchemaBatch(workspaceId, batch, sourceName) {
|
|
96
|
+
await this.dbSchema.saveDbSchemaBatch(workspaceId, batch, sourceName);
|
|
481
97
|
}
|
|
482
|
-
async
|
|
483
|
-
|
|
484
|
-
return result.rows.map((row) => {
|
|
485
|
-
const r = row;
|
|
486
|
-
return {
|
|
487
|
-
...this.mapRowToIssue(r),
|
|
488
|
-
modifiedFields: r['modified_fields'] ?? [],
|
|
489
|
-
};
|
|
490
|
-
});
|
|
98
|
+
async deleteDbSchema(workspaceId, sourceName) {
|
|
99
|
+
await this.dbSchema.deleteDbSchema(workspaceId, sourceName);
|
|
491
100
|
}
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
const strNull = (key) => typeof row[key] === 'string' ? row[key] : null;
|
|
495
|
-
const numNull = (key) => typeof row[key] === 'number' ? row[key] : null;
|
|
496
|
-
const arr = (key) => Array.isArray(row[key]) ? row[key] : [];
|
|
497
|
-
return {
|
|
498
|
-
key: str('issue_key'),
|
|
499
|
-
id: str('issue_id'),
|
|
500
|
-
projectKey: str('project_key'),
|
|
501
|
-
summary: str('summary'),
|
|
502
|
-
description: strNull('description'),
|
|
503
|
-
issueType: strNull('issue_type'),
|
|
504
|
-
status: strNull('status'),
|
|
505
|
-
statusCategory: strNull('status_category'),
|
|
506
|
-
priority: strNull('priority'),
|
|
507
|
-
resolution: strNull('resolution'),
|
|
508
|
-
assignee: strNull('assignee'),
|
|
509
|
-
assigneeId: strNull('assignee_id'),
|
|
510
|
-
reporter: strNull('reporter'),
|
|
511
|
-
reporterId: strNull('reporter_id'),
|
|
512
|
-
created: strNull('created'),
|
|
513
|
-
updated: strNull('updated'),
|
|
514
|
-
resolved: strNull('resolved'),
|
|
515
|
-
dueDate: strNull('due_date'),
|
|
516
|
-
labels: arr('labels'),
|
|
517
|
-
components: arr('components'),
|
|
518
|
-
fixVersions: arr('fix_versions'),
|
|
519
|
-
parentKey: strNull('parent_key'),
|
|
520
|
-
sprint: strNull('sprint'),
|
|
521
|
-
storyPoints: numNull('story_points'),
|
|
522
|
-
originalEstimate: numNull('original_estimate'),
|
|
523
|
-
remainingEstimate: numNull('remaining_estimate'),
|
|
524
|
-
timeSpent: numNull('time_spent'),
|
|
525
|
-
customFields: row['custom_fields'] ?? {},
|
|
526
|
-
rawJson: row['raw_json'] ?? {},
|
|
527
|
-
source: row['source'] ?? 'jira',
|
|
528
|
-
};
|
|
101
|
+
async saveGraphEntities(workspaceId, entities) {
|
|
102
|
+
await this.graph.saveGraphEntities(workspaceId, entities);
|
|
529
103
|
}
|
|
530
|
-
async
|
|
531
|
-
await this.
|
|
104
|
+
async saveGraphRelationships(workspaceId, rels) {
|
|
105
|
+
await this.graph.saveGraphRelationships(workspaceId, rels);
|
|
532
106
|
}
|
|
533
|
-
async
|
|
534
|
-
|
|
535
|
-
await this.pool.query(`INSERT INTO graph_entities (name, type, properties)
|
|
536
|
-
VALUES ($1, $2, $3)
|
|
537
|
-
ON CONFLICT (name, type) DO UPDATE SET properties = EXCLUDED.properties`, [entity.name, entity.type, JSON.stringify(entity.properties)]);
|
|
538
|
-
}
|
|
107
|
+
async saveGraphObservation(workspaceId, entityId, content, author) {
|
|
108
|
+
await this.graph.saveGraphObservation(workspaceId, entityId, content, author);
|
|
539
109
|
}
|
|
540
|
-
async
|
|
541
|
-
|
|
542
|
-
await this.pool.query(`INSERT INTO graph_relationships (source_id, target_id, type, weight, source, properties)
|
|
543
|
-
VALUES ($1, $2, $3, $4, $5, $6)
|
|
544
|
-
ON CONFLICT (source_id, target_id, type) DO UPDATE SET weight = EXCLUDED.weight, properties = EXCLUDED.properties`, [rel.sourceId, rel.targetId, rel.type, rel.weight, rel.source, JSON.stringify(rel.properties)]);
|
|
545
|
-
}
|
|
110
|
+
async getObservations(workspaceId, entityId) {
|
|
111
|
+
return this.graph.getObservations(workspaceId, entityId);
|
|
546
112
|
}
|
|
547
|
-
async
|
|
548
|
-
|
|
113
|
+
async queryGraph(workspaceId, entityName, depth) {
|
|
114
|
+
return this.graph.queryGraph(workspaceId, entityName, depth);
|
|
549
115
|
}
|
|
550
|
-
async
|
|
551
|
-
|
|
552
|
-
return result.rows.map((r) => ({
|
|
553
|
-
id: r['id'],
|
|
554
|
-
entityId: r['entity_id'],
|
|
555
|
-
content: r['content'],
|
|
556
|
-
author: r['author'],
|
|
557
|
-
createdAt: r['created_at'],
|
|
558
|
-
}));
|
|
116
|
+
async getGraphStats(workspaceId) {
|
|
117
|
+
return this.graph.getGraphStats(workspaceId);
|
|
559
118
|
}
|
|
560
|
-
async
|
|
561
|
-
|
|
562
|
-
SELECT id, name, type, properties, 0 as depth
|
|
563
|
-
FROM graph_entities WHERE name ILIKE $1
|
|
564
|
-
UNION
|
|
565
|
-
SELECT e.id, e.name, e.type, e.properties, gw.depth + 1
|
|
566
|
-
FROM graph_walk gw
|
|
567
|
-
JOIN graph_relationships r ON r.source_id = gw.id OR r.target_id = gw.id
|
|
568
|
-
JOIN graph_entities e ON e.id = CASE WHEN r.source_id = gw.id THEN r.target_id ELSE r.source_id END
|
|
569
|
-
WHERE gw.depth < $2
|
|
570
|
-
)
|
|
571
|
-
SELECT DISTINCT id, name, type, properties FROM graph_walk LIMIT 200`, [`%${entityName}%`, depth]);
|
|
572
|
-
const entityIds = result.rows.map((r) => r['id']);
|
|
573
|
-
const entities = result.rows.map((r) => ({
|
|
574
|
-
id: r['id'],
|
|
575
|
-
name: r['name'],
|
|
576
|
-
type: r['type'],
|
|
577
|
-
properties: r['properties'],
|
|
578
|
-
}));
|
|
579
|
-
let relationships = [];
|
|
580
|
-
let observations = [];
|
|
581
|
-
if (entityIds.length > 0) {
|
|
582
|
-
const idList = entityIds.map((_, i) => `$${String(i + 1)}`).join(',');
|
|
583
|
-
const relResult = await this.pool.query(`SELECT id, source_id, target_id, type, weight, source, properties
|
|
584
|
-
FROM graph_relationships WHERE source_id IN (${idList}) OR target_id IN (${idList})`, entityIds);
|
|
585
|
-
relationships = relResult.rows.map((r) => ({
|
|
586
|
-
id: r['id'],
|
|
587
|
-
sourceId: r['source_id'],
|
|
588
|
-
targetId: r['target_id'],
|
|
589
|
-
type: r['type'],
|
|
590
|
-
weight: Number(r['weight']),
|
|
591
|
-
source: r['source'],
|
|
592
|
-
properties: r['properties'],
|
|
593
|
-
}));
|
|
594
|
-
const obsResult = await this.pool.query(`SELECT id, entity_id, content, author, created_at
|
|
595
|
-
FROM graph_observations WHERE entity_id IN (${idList})`, entityIds);
|
|
596
|
-
observations = obsResult.rows.map((r) => ({
|
|
597
|
-
id: r['id'],
|
|
598
|
-
entityId: r['entity_id'],
|
|
599
|
-
content: r['content'],
|
|
600
|
-
author: r['author'],
|
|
601
|
-
createdAt: r['created_at'],
|
|
602
|
-
}));
|
|
603
|
-
}
|
|
604
|
-
return { entities, relationships, observations };
|
|
119
|
+
async clearGraph(workspaceId) {
|
|
120
|
+
await this.graph.clearGraph(workspaceId);
|
|
605
121
|
}
|
|
606
|
-
async
|
|
607
|
-
|
|
608
|
-
const relResult = await this.pool.query(`SELECT type, COUNT(*) as cnt FROM graph_relationships GROUP BY type`);
|
|
609
|
-
const obsResult = await this.pool.query(`SELECT COUNT(*) as cnt FROM graph_observations`);
|
|
610
|
-
const byEntityType = {};
|
|
611
|
-
let entityCount = 0;
|
|
612
|
-
for (const row of entityResult.rows) {
|
|
613
|
-
const count = Number(row['cnt']);
|
|
614
|
-
byEntityType[row['type']] = count;
|
|
615
|
-
entityCount += count;
|
|
616
|
-
}
|
|
617
|
-
const byRelationshipType = {};
|
|
618
|
-
let relationshipCount = 0;
|
|
619
|
-
for (const row of relResult.rows) {
|
|
620
|
-
const count = Number(row['cnt']);
|
|
621
|
-
byRelationshipType[row['type']] = count;
|
|
622
|
-
relationshipCount += count;
|
|
623
|
-
}
|
|
624
|
-
const firstRow = obsResult.rows[0];
|
|
625
|
-
const observationCount = Number(firstRow?.['cnt'] ?? 0);
|
|
626
|
-
return { entityCount, relationshipCount, observationCount, byEntityType, byRelationshipType };
|
|
122
|
+
async queryForWorkspace(workspaceId, sql, params) {
|
|
123
|
+
return this.query.queryForWorkspace(workspaceId, sql, params);
|
|
627
124
|
}
|
|
628
|
-
async
|
|
629
|
-
|
|
630
|
-
await this.pool.query(`DELETE FROM graph_entities WHERE id NOT IN (
|
|
631
|
-
SELECT DISTINCT source_id FROM graph_relationships
|
|
632
|
-
UNION SELECT DISTINCT target_id FROM graph_relationships
|
|
633
|
-
) AND id NOT IN (SELECT DISTINCT entity_id FROM graph_observations)`);
|
|
125
|
+
async rawQuery(sql, params) {
|
|
126
|
+
return this.query.rawQuery(sql, params);
|
|
634
127
|
}
|
|
635
128
|
async close() {
|
|
636
129
|
await this.pool.end();
|
|
637
130
|
}
|
|
638
131
|
}
|
|
639
|
-
function normalizeDescription(desc) {
|
|
640
|
-
if (!desc) {
|
|
641
|
-
return desc;
|
|
642
|
-
}
|
|
643
|
-
if (desc.startsWith('{"type":"doc"')) {
|
|
644
|
-
return adfToMarkdown(desc);
|
|
645
|
-
}
|
|
646
|
-
return desc;
|
|
647
|
-
}
|
|
648
132
|
//# sourceMappingURL=storage.js.map
|