memory-journal-mcp 6.1.2 → 6.2.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 +44 -28
- package/dist/{chunk-X4SWFATC.js → chunk-BI4ZNSKA.js} +38 -24
- package/dist/{chunk-HCEWINSB.js → chunk-N6EBIDN7.js} +99 -102
- package/dist/cli.js +2 -2
- package/dist/index.js +2 -2
- package/dist/tools-WPRY5MJ6.js +2 -0
- package/package.json +10 -1
- package/skills/github-commander/SKILL.md +151 -0
- package/skills/github-commander/config/project-config.example.md +125 -0
- package/skills/github-commander/workflows/code-quality-audit.md +80 -0
- package/skills/github-commander/workflows/full-audit.md +134 -0
- package/skills/github-commander/workflows/issue-triage.md +239 -0
- package/skills/github-commander/workflows/milestone-sprint.md +81 -0
- package/skills/github-commander/workflows/perf-audit.md +142 -0
- package/skills/github-commander/workflows/pr-review.md +123 -0
- package/skills/github-commander/workflows/security-audit.md +170 -0
- package/skills/github-commander/workflows/update-deps.md +109 -0
- package/.dockerignore +0 -139
- package/.gitattributes +0 -20
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -95
- package/.github/ISSUE_TEMPLATE/config.yml +0 -11
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -110
- package/.github/ISSUE_TEMPLATE/question.md +0 -78
- package/.github/aw/actions-lock.json +0 -14
- package/.github/copilot-instructions.md +0 -122
- package/.github/dependabot.yml +0 -93
- package/.github/pull_request_template.md +0 -135
- package/.github/workflows/README.md +0 -133
- package/.github/workflows/agentics-maintenance.yml +0 -141
- package/.github/workflows/auto-release.yml +0 -68
- package/.github/workflows/ci-health-monitor.lock.yml +0 -1121
- package/.github/workflows/ci-health-monitor.md +0 -87
- package/.github/workflows/codeql.yml +0 -41
- package/.github/workflows/dependabot-auto-merge.yml +0 -42
- package/.github/workflows/dependency-maintenance.lock.yml +0 -1182
- package/.github/workflows/dependency-maintenance.md +0 -147
- package/.github/workflows/docker-publish.yml +0 -254
- package/.github/workflows/docs-drift-detector.lock.yml +0 -1142
- package/.github/workflows/docs-drift-detector.md +0 -115
- package/.github/workflows/lint-and-test.yml +0 -60
- package/.github/workflows/publish-npm.yml +0 -85
- package/.github/workflows/secrets-scanning.yml +0 -32
- package/.github/workflows/security-update.yml +0 -127
- package/.gitleaks.toml +0 -9
- package/.prettierignore +0 -21
- package/.prettierrc +0 -33
- package/.scout-ignore +0 -12
- package/.trivyignore +0 -21
- package/CHANGELOG.md +0 -1814
- package/CODE_OF_CONDUCT.md +0 -133
- package/CONTRIBUTING.md +0 -263
- package/DOCKER_README.md +0 -331
- package/Dockerfile +0 -128
- package/SECURITY.md +0 -227
- package/UNRELEASED.md +0 -1
- package/dist/tools-T4U5A3X4.js +0 -2
- package/docker-compose.yml +0 -71
- package/docs/README.md +0 -18
- package/docs/agentic-journal-synergy.md +0 -175
- package/docs/copilot-setup.md +0 -72
- package/eslint.config.js +0 -110
- package/mcp-config-example.json +0 -21
- package/playwright.config.ts +0 -35
- package/releases/v2.1.0.md +0 -220
- package/releases/v2.2.0.md +0 -168
- package/releases/v3.0.0.md +0 -237
- package/releases/v3.1.0.md +0 -104
- package/releases/v3.1.1.md +0 -42
- package/releases/v3.1.2.md +0 -40
- package/releases/v3.1.3.md +0 -64
- package/releases/v3.1.4.md +0 -32
- package/releases/v3.1.5.md +0 -44
- package/releases/v4.0.0.md +0 -71
- package/releases/v4.1.0.md +0 -88
- package/releases/v4.2.0.md +0 -90
- package/releases/v4.3.0.md +0 -92
- package/releases/v4.3.1.md +0 -69
- package/releases/v4.4.0.md +0 -120
- package/releases/v4.4.1.md +0 -33
- package/releases/v4.4.2.md +0 -31
- package/releases/v4.5.0.md +0 -116
- package/releases/v5.0.0.md +0 -105
- package/releases/v5.0.1.md +0 -25
- package/releases/v5.1.0.md +0 -83
- package/releases/v5.1.1.md +0 -10
- package/releases/v6.0.0.md +0 -48
- package/releases/v6.0.1.md +0 -36
- package/releases/v6.1.0.md +0 -68
- package/releases/v6.1.1.md +0 -30
- package/releases/v6.1.2.md +0 -23
- package/scripts/generate-server-instructions.ts +0 -306
- package/scripts/server-instructions-function-body.ts +0 -107
- package/scripts/server-instructions-gotchas.ts +0 -45
- package/server.json +0 -42
- package/social-preview.png +0 -0
- package/src/auth/auth-context.ts +0 -78
- package/src/auth/authorization-server-discovery.ts +0 -263
- package/src/auth/errors.ts +0 -215
- package/src/auth/index.ts +0 -58
- package/src/auth/middleware.ts +0 -392
- package/src/auth/oauth-resource-server.ts +0 -170
- package/src/auth/scope-map.ts +0 -46
- package/src/auth/scopes.ts +0 -256
- package/src/auth/token-validator.ts +0 -293
- package/src/auth/transport-agnostic.ts +0 -164
- package/src/auth/types.ts +0 -372
- package/src/cli.ts +0 -279
- package/src/codemode/api-constants.ts +0 -263
- package/src/codemode/api.ts +0 -302
- package/src/codemode/auto-return.ts +0 -65
- package/src/codemode/index.ts +0 -47
- package/src/codemode/sandbox-factory.ts +0 -144
- package/src/codemode/sandbox.ts +0 -220
- package/src/codemode/security.ts +0 -155
- package/src/codemode/types.ts +0 -228
- package/src/codemode/worker-sandbox.ts +0 -277
- package/src/codemode/worker-script.ts +0 -239
- package/src/constants/icons.ts +0 -183
- package/src/constants/server-instructions.md +0 -166
- package/src/constants/server-instructions.ts +0 -514
- package/src/database/adapter-factory.ts +0 -16
- package/src/database/core/entry-columns.ts +0 -10
- package/src/database/core/interfaces.ts +0 -188
- package/src/database/core/schema.ts +0 -152
- package/src/database/sqlite-adapter/backup.ts +0 -167
- package/src/database/sqlite-adapter/entries/crud.ts +0 -233
- package/src/database/sqlite-adapter/entries/importance.ts +0 -76
- package/src/database/sqlite-adapter/entries/index.ts +0 -142
- package/src/database/sqlite-adapter/entries/search.ts +0 -294
- package/src/database/sqlite-adapter/entries/shared.ts +0 -102
- package/src/database/sqlite-adapter/entries/statistics.ts +0 -162
- package/src/database/sqlite-adapter/index.ts +0 -265
- package/src/database/sqlite-adapter/native-connection.ts +0 -301
- package/src/database/sqlite-adapter/relationships.ts +0 -70
- package/src/database/sqlite-adapter/tags.ts +0 -182
- package/src/filtering/tool-filter.ts +0 -312
- package/src/github/github-integration/client.ts +0 -114
- package/src/github/github-integration/index.ts +0 -297
- package/src/github/github-integration/insights.ts +0 -155
- package/src/github/github-integration/issues.ts +0 -213
- package/src/github/github-integration/milestones.ts +0 -262
- package/src/github/github-integration/projects.ts +0 -414
- package/src/github/github-integration/pull-requests.ts +0 -235
- package/src/github/github-integration/repository.ts +0 -110
- package/src/github/github-integration/types.ts +0 -43
- package/src/handlers/prompts/github.ts +0 -210
- package/src/handlers/prompts/index.ts +0 -97
- package/src/handlers/prompts/workflow.ts +0 -361
- package/src/handlers/resources/core/briefing/context-section.ts +0 -182
- package/src/handlers/resources/core/briefing/github-section.ts +0 -354
- package/src/handlers/resources/core/briefing/index.ts +0 -106
- package/src/handlers/resources/core/briefing/user-message.ts +0 -114
- package/src/handlers/resources/core/health.ts +0 -75
- package/src/handlers/resources/core/index.ts +0 -31
- package/src/handlers/resources/core/instructions.ts +0 -45
- package/src/handlers/resources/core/utilities.ts +0 -310
- package/src/handlers/resources/github.ts +0 -340
- package/src/handlers/resources/graph.ts +0 -218
- package/src/handlers/resources/help.ts +0 -410
- package/src/handlers/resources/index.ts +0 -143
- package/src/handlers/resources/shared.ts +0 -219
- package/src/handlers/resources/team.ts +0 -134
- package/src/handlers/resources/templates.ts +0 -334
- package/src/handlers/tools/admin.ts +0 -351
- package/src/handlers/tools/analytics.ts +0 -346
- package/src/handlers/tools/backup.ts +0 -272
- package/src/handlers/tools/codemode.ts +0 -188
- package/src/handlers/tools/core.ts +0 -359
- package/src/handlers/tools/error-fields-mixin.ts +0 -10
- package/src/handlers/tools/export.ts +0 -150
- package/src/handlers/tools/github/copilot-tools.ts +0 -72
- package/src/handlers/tools/github/helpers.ts +0 -125
- package/src/handlers/tools/github/insights-tools.ts +0 -112
- package/src/handlers/tools/github/issue-tools.ts +0 -442
- package/src/handlers/tools/github/kanban-tools.ts +0 -153
- package/src/handlers/tools/github/milestone-tools.ts +0 -371
- package/src/handlers/tools/github/mutation-tools.ts +0 -17
- package/src/handlers/tools/github/read-tools.ts +0 -302
- package/src/handlers/tools/github/schemas.ts +0 -435
- package/src/handlers/tools/github.ts +0 -39
- package/src/handlers/tools/index.ts +0 -255
- package/src/handlers/tools/relationships.ts +0 -390
- package/src/handlers/tools/schemas.ts +0 -165
- package/src/handlers/tools/search.ts +0 -448
- package/src/handlers/tools/team/admin-tools.ts +0 -164
- package/src/handlers/tools/team/analytics-tools.ts +0 -233
- package/src/handlers/tools/team/backup-tools.ts +0 -83
- package/src/handlers/tools/team/core-tools.ts +0 -197
- package/src/handlers/tools/team/export-tools.ts +0 -130
- package/src/handlers/tools/team/helpers.ts +0 -66
- package/src/handlers/tools/team/index.ts +0 -45
- package/src/handlers/tools/team/relationship-tools.ts +0 -219
- package/src/handlers/tools/team/schemas.ts +0 -558
- package/src/handlers/tools/team/search-tools.ts +0 -145
- package/src/handlers/tools/team/vector-tools.ts +0 -261
- package/src/index.ts +0 -57
- package/src/server/mcp-server.ts +0 -446
- package/src/server/registration.ts +0 -141
- package/src/server/scheduler.ts +0 -283
- package/src/transports/http/handlers.ts +0 -78
- package/src/transports/http/index.ts +0 -8
- package/src/transports/http/security.ts +0 -147
- package/src/transports/http/server/index.ts +0 -397
- package/src/transports/http/server/legacy-sse.ts +0 -87
- package/src/transports/http/server/stateful.ts +0 -222
- package/src/transports/http/server/stateless.ts +0 -42
- package/src/transports/http/types.ts +0 -132
- package/src/types/entities.ts +0 -145
- package/src/types/error-types.ts +0 -92
- package/src/types/errors.ts +0 -200
- package/src/types/filtering.ts +0 -55
- package/src/types/github.ts +0 -216
- package/src/types/index.ts +0 -348
- package/src/utils/error-helpers.ts +0 -78
- package/src/utils/errors/error-response-fields.ts +0 -29
- package/src/utils/errors/suggestions.ts +0 -94
- package/src/utils/github-helpers.ts +0 -33
- package/src/utils/logger.ts +0 -107
- package/src/utils/mcp-logger.ts +0 -155
- package/src/utils/progress-utils.ts +0 -100
- package/src/utils/query-helpers.ts +0 -78
- package/src/utils/resource-annotations.ts +0 -75
- package/src/utils/security-utils.ts +0 -198
- package/src/utils/vector-index-helpers.ts +0 -24
- package/src/vector/vector-search-manager.ts +0 -409
- package/src/version.ts +0 -15
- package/test-server/README.md +0 -193
- package/test-server/code-map.md +0 -399
- package/test-server/test-agent-experience.md +0 -213
- package/test-server/test-filter-instructions.mjs +0 -295
- package/test-server/test-instruction-levels.mjs +0 -102
- package/test-server/test-preflight.md +0 -55
- package/test-server/test-prompts.mjs +0 -185
- package/test-server/test-scheduler.mjs +0 -174
- package/test-server/test-tool-annotations.mjs +0 -115
- package/test-server/test-tools-codemode.md +0 -632
- package/test-server/test-tools-codemode2.md +0 -1218
- package/test-server/test-tools-team.md +0 -215
- package/test-server/test-tools.md +0 -429
- package/test-server/test-tools2.md +0 -361
- package/test-server/test-tools3.md +0 -396
- package/test-server/tool-reference.md +0 -231
- package/tests/README.md +0 -54
- package/tests/auth/auth-context.test.ts +0 -162
- package/tests/auth/authorization-server-discovery.test.ts +0 -265
- package/tests/auth/errors.test.ts +0 -170
- package/tests/auth/middleware.test.ts +0 -585
- package/tests/auth/oauth-resource-server.test.ts +0 -173
- package/tests/auth/scope-map.test.ts +0 -66
- package/tests/auth/scopes.test.ts +0 -347
- package/tests/auth/token-validator.test.ts +0 -271
- package/tests/codemode/api.test.ts +0 -396
- package/tests/codemode/auto-return.test.ts +0 -167
- package/tests/codemode/codemode-tool-handlers.test.ts +0 -197
- package/tests/codemode/sandbox-factory.test.ts +0 -152
- package/tests/codemode/sandbox.test.ts +0 -190
- package/tests/codemode/security.test.ts +0 -242
- package/tests/codemode/worker-sandbox.test.ts +0 -106
- package/tests/constants/icons.test.ts +0 -101
- package/tests/constants/server-instructions.test.ts +0 -514
- package/tests/database/crud-workflow-branches.test.ts +0 -418
- package/tests/database/database-branches.test.ts +0 -132
- package/tests/database/entries-auth-branches.test.ts +0 -390
- package/tests/database/native-connection.test.ts +0 -249
- package/tests/database/shared-helpers.test.ts +0 -103
- package/tests/database/sqlite-adapter.bench.ts +0 -63
- package/tests/database/sqlite-adapter.test.ts +0 -690
- package/tests/database/tags.test.ts +0 -134
- package/tests/e2e/README.md +0 -39
- package/tests/e2e/auth.spec.ts +0 -106
- package/tests/e2e/codemode-abuse.spec.ts +0 -75
- package/tests/e2e/health.spec.ts +0 -63
- package/tests/e2e/helpers.ts +0 -139
- package/tests/e2e/oauth-discovery.spec.ts +0 -102
- package/tests/e2e/oauth-scopes.spec.ts +0 -222
- package/tests/e2e/payloads-admin.spec.ts +0 -76
- package/tests/e2e/payloads-analytics.spec.ts +0 -37
- package/tests/e2e/payloads-backup-restore.spec.ts +0 -102
- package/tests/e2e/payloads-backup.spec.ts +0 -44
- package/tests/e2e/payloads-codemode-api.spec.ts +0 -131
- package/tests/e2e/payloads-codemode-readonly.spec.ts +0 -116
- package/tests/e2e/payloads-codemode.spec.ts +0 -116
- package/tests/e2e/payloads-core.spec.ts +0 -82
- package/tests/e2e/payloads-error-contracts.spec.ts +0 -159
- package/tests/e2e/payloads-export.spec.ts +0 -46
- package/tests/e2e/payloads-github-degradation.spec.ts +0 -73
- package/tests/e2e/payloads-github.spec.ts +0 -176
- package/tests/e2e/payloads-relationships.spec.ts +0 -56
- package/tests/e2e/payloads-search.spec.ts +0 -64
- package/tests/e2e/payloads-team-happy.spec.ts +0 -231
- package/tests/e2e/payloads-team.spec.ts +0 -174
- package/tests/e2e/prompts-expanded.spec.ts +0 -137
- package/tests/e2e/prompts.spec.ts +0 -62
- package/tests/e2e/protocols.spec.ts +0 -134
- package/tests/e2e/rate-limiting.spec.ts +0 -291
- package/tests/e2e/resources-briefing-env.spec.ts +0 -106
- package/tests/e2e/resources-complete.spec.ts +0 -180
- package/tests/e2e/resources-expanded.spec.ts +0 -83
- package/tests/e2e/resources-instructions-levels.spec.ts +0 -145
- package/tests/e2e/resources-templates.spec.ts +0 -123
- package/tests/e2e/resources.spec.ts +0 -103
- package/tests/e2e/scheduler.spec.ts +0 -79
- package/tests/e2e/security.spec.ts +0 -112
- package/tests/e2e/session-advanced.spec.ts +0 -152
- package/tests/e2e/sessions.spec.ts +0 -95
- package/tests/e2e/stateless.spec.ts +0 -79
- package/tests/e2e/streaming.spec.ts +0 -176
- package/tests/e2e/tool-filtering-presets.spec.ts +0 -192
- package/tests/e2e/tool-filtering.spec.ts +0 -77
- package/tests/e2e/tools.spec.ts +0 -111
- package/tests/filtering/tool-filter.test.ts +0 -314
- package/tests/github/client-issues-errors.test.ts +0 -433
- package/tests/github/github-integration-branches.test.ts +0 -490
- package/tests/github/github-integration.test.ts +0 -1015
- package/tests/github/github-managers-branches.test.ts +0 -907
- package/tests/github/pull-requests.test.ts +0 -334
- package/tests/handlers/analytics-branches.test.ts +0 -222
- package/tests/handlers/backup-branches.test.ts +0 -270
- package/tests/handlers/briefing-context-section.test.ts +0 -388
- package/tests/handlers/briefing-github-section.test.ts +0 -392
- package/tests/handlers/briefing-user-message.test.ts +0 -405
- package/tests/handlers/codemode-tools.test.ts +0 -85
- package/tests/handlers/copilot-tools.test.ts +0 -126
- package/tests/handlers/error-path-coverage.test.ts +0 -324
- package/tests/handlers/export-tools.test.ts +0 -203
- package/tests/handlers/github-resource-handlers.test.ts +0 -929
- package/tests/handlers/github-tool-handlers.test.ts +0 -1452
- package/tests/handlers/handler-error-branches.test.ts +0 -346
- package/tests/handlers/help-resource.test.ts +0 -92
- package/tests/handlers/prompt-handler-coverage.test.ts +0 -108
- package/tests/handlers/prompt-handlers.test.ts +0 -131
- package/tests/handlers/resource-handler-coverage.test.ts +0 -281
- package/tests/handlers/resource-handlers.test.ts +0 -357
- package/tests/handlers/resource-prompt-branches.test.ts +0 -495
- package/tests/handlers/search-tool-handlers.test.ts +0 -379
- package/tests/handlers/targeted-gap-closure.test.ts +0 -387
- package/tests/handlers/team-admin.test.ts +0 -291
- package/tests/handlers/team-analytics.test.ts +0 -220
- package/tests/handlers/team-core.test.ts +0 -148
- package/tests/handlers/team-data.test.ts +0 -198
- package/tests/handlers/team-relationships.test.ts +0 -271
- package/tests/handlers/team-resource-handlers.test.ts +0 -161
- package/tests/handlers/team-search.test.ts +0 -134
- package/tests/handlers/team-tool-handlers.test.ts +0 -301
- package/tests/handlers/team-vector.test.ts +0 -213
- package/tests/handlers/template-github-branches.test.ts +0 -676
- package/tests/handlers/tool-annotations.test.ts +0 -90
- package/tests/handlers/tool-handler-coverage.test.ts +0 -514
- package/tests/handlers/tool-handlers.test.ts +0 -510
- package/tests/handlers/tool-output-schemas.test.ts +0 -116
- package/tests/handlers/vector-tool-handlers.test.ts +0 -238
- package/tests/security/sql-injection.test.ts +0 -284
- package/tests/server/mcp-server.bench.ts +0 -55
- package/tests/server/mcp-server.test.ts +0 -1326
- package/tests/server/scheduler.test.ts +0 -400
- package/tests/transports/http-legacy-sse.test.ts +0 -275
- package/tests/transports/http-security.test.ts +0 -322
- package/tests/transports/http-stateful.test.ts +0 -487
- package/tests/transports/http-transport-server.test.ts +0 -301
- package/tests/transports/http-transport.test.ts +0 -771
- package/tests/utils/github-helpers.test.ts +0 -58
- package/tests/utils/logger.test.ts +0 -180
- package/tests/utils/mcp-logger.test.ts +0 -211
- package/tests/utils/progress-utils.test.ts +0 -156
- package/tests/utils/query-helpers.test.ts +0 -80
- package/tests/utils/security-utils.test.ts +0 -82
- package/tests/vector/vector-search-branches.test.ts +0 -111
- package/tests/vector/vector-search-manager.test.ts +0 -375
- package/tests/vector/vector-search.bench.ts +0 -48
- package/tsconfig.json +0 -42
- package/tsup.config.ts +0 -19
- package/vitest.config.ts +0 -25
|
@@ -1,255 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tool Handler Barrel
|
|
3
|
-
*
|
|
4
|
-
* Composes all tool group modules and exposes the public API:
|
|
5
|
-
* - getTools(): returns filtered tool definitions for the MCP server
|
|
6
|
-
* - callTool(): dispatches a tool call by name
|
|
7
|
-
*
|
|
8
|
-
* Each group module owns its:
|
|
9
|
-
* - Input/output Zod schemas
|
|
10
|
-
* - Tool definitions (name, description, group, annotations)
|
|
11
|
-
* - Handler implementations (with try/catch + formatHandlerError)
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import type {
|
|
15
|
-
ToolFilterConfig,
|
|
16
|
-
ToolDefinition,
|
|
17
|
-
ToolRegistration,
|
|
18
|
-
ToolContext,
|
|
19
|
-
ToolHandlerConfig,
|
|
20
|
-
} from '../../types/index.js'
|
|
21
|
-
import type { IDatabaseAdapter } from '../../database/core/interfaces.js'
|
|
22
|
-
import type { VectorSearchManager } from '../../vector/vector-search-manager.js'
|
|
23
|
-
import type { GitHubIntegration } from '../../github/github-integration/index.js'
|
|
24
|
-
import type { ProgressContext } from '../../utils/progress-utils.js'
|
|
25
|
-
|
|
26
|
-
import { getCoreTools } from './core.js'
|
|
27
|
-
import { getSearchTools } from './search.js'
|
|
28
|
-
import { getAnalyticsTools } from './analytics.js'
|
|
29
|
-
import { getRelationshipTools } from './relationships.js'
|
|
30
|
-
import { getExportTools } from './export.js'
|
|
31
|
-
import { getAdminTools } from './admin.js'
|
|
32
|
-
import { getGitHubTools } from './github.js'
|
|
33
|
-
import { getBackupTools } from './backup.js'
|
|
34
|
-
import { getTeamTools } from './team/index.js'
|
|
35
|
-
import { getCodeModeTools } from './codemode.js'
|
|
36
|
-
|
|
37
|
-
// Re-export for backward compatibility (McpServer imports these)
|
|
38
|
-
export type { ToolHandlerConfig }
|
|
39
|
-
|
|
40
|
-
// ============================================================================
|
|
41
|
-
// Icon Mapping
|
|
42
|
-
// ============================================================================
|
|
43
|
-
|
|
44
|
-
function getToolIcon(
|
|
45
|
-
group: string
|
|
46
|
-
): { iconUrl: string; title: string; description: string } | undefined {
|
|
47
|
-
const iconMap: Record<string, { iconUrl: string; title: string; description: string }> = {
|
|
48
|
-
core: {
|
|
49
|
-
iconUrl: 'https://cdn.jsdelivr.net/npm/@mdi/svg@7.4.47/svg/notebook.svg',
|
|
50
|
-
title: 'Journal Core',
|
|
51
|
-
description: 'Core journal operations',
|
|
52
|
-
},
|
|
53
|
-
search: {
|
|
54
|
-
iconUrl: 'https://cdn.jsdelivr.net/npm/@mdi/svg@7.4.47/svg/magnify.svg',
|
|
55
|
-
title: 'Search',
|
|
56
|
-
description: 'Entry search operations',
|
|
57
|
-
},
|
|
58
|
-
analytics: {
|
|
59
|
-
iconUrl: 'https://cdn.jsdelivr.net/npm/@mdi/svg@7.4.47/svg/chart-bar.svg',
|
|
60
|
-
title: 'Analytics',
|
|
61
|
-
description: 'Journal analytics',
|
|
62
|
-
},
|
|
63
|
-
relationships: {
|
|
64
|
-
iconUrl: 'https://cdn.jsdelivr.net/npm/@mdi/svg@7.4.47/svg/graph-outline.svg',
|
|
65
|
-
title: 'Relationships',
|
|
66
|
-
description: 'Entry relationship management',
|
|
67
|
-
},
|
|
68
|
-
export: {
|
|
69
|
-
iconUrl: 'https://cdn.jsdelivr.net/npm/@mdi/svg@7.4.47/svg/export.svg',
|
|
70
|
-
title: 'Export',
|
|
71
|
-
description: 'Data export operations',
|
|
72
|
-
},
|
|
73
|
-
admin: {
|
|
74
|
-
iconUrl: 'https://cdn.jsdelivr.net/npm/@mdi/svg@7.4.47/svg/cog.svg',
|
|
75
|
-
title: 'Admin',
|
|
76
|
-
description: 'Administrative operations',
|
|
77
|
-
},
|
|
78
|
-
github: {
|
|
79
|
-
iconUrl: 'https://cdn.jsdelivr.net/npm/@mdi/svg@7.4.47/svg/github.svg',
|
|
80
|
-
title: 'GitHub',
|
|
81
|
-
description: 'GitHub integration',
|
|
82
|
-
},
|
|
83
|
-
backup: {
|
|
84
|
-
iconUrl: 'https://cdn.jsdelivr.net/npm/@mdi/svg@7.4.47/svg/backup-restore.svg',
|
|
85
|
-
title: 'Backup',
|
|
86
|
-
description: 'Backup and restore',
|
|
87
|
-
},
|
|
88
|
-
team: {
|
|
89
|
-
iconUrl: 'https://cdn.jsdelivr.net/npm/@mdi/svg@7.4.47/svg/account-group.svg',
|
|
90
|
-
title: 'Team',
|
|
91
|
-
description: 'Team collaboration',
|
|
92
|
-
},
|
|
93
|
-
codemode: {
|
|
94
|
-
iconUrl: 'https://cdn.jsdelivr.net/npm/@mdi/svg@7.4.47/svg/code-braces.svg',
|
|
95
|
-
title: 'Code Mode',
|
|
96
|
-
description: 'Sandboxed code execution',
|
|
97
|
-
},
|
|
98
|
-
}
|
|
99
|
-
return iconMap[group]
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// ============================================================================
|
|
103
|
-
// Public API
|
|
104
|
-
// ============================================================================
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* Get all tool definitions, optionally filtered by config
|
|
108
|
-
*/
|
|
109
|
-
export function getTools(
|
|
110
|
-
db: IDatabaseAdapter,
|
|
111
|
-
filterConfig: ToolFilterConfig | null,
|
|
112
|
-
vectorManager?: VectorSearchManager,
|
|
113
|
-
github?: GitHubIntegration,
|
|
114
|
-
config?: ToolHandlerConfig,
|
|
115
|
-
teamDb?: IDatabaseAdapter,
|
|
116
|
-
teamVectorManager?: VectorSearchManager
|
|
117
|
-
): ToolRegistration[] {
|
|
118
|
-
// Ensure tool map is built / up-to-date (shared cache with callTool)
|
|
119
|
-
ensureToolCache(db, vectorManager, github, config, teamDb, teamVectorManager)
|
|
120
|
-
|
|
121
|
-
const mapTool = (t: ToolDefinition): ToolRegistration => ({
|
|
122
|
-
name: t.name,
|
|
123
|
-
title: t.title,
|
|
124
|
-
description: t.description,
|
|
125
|
-
inputSchema: t.inputSchema,
|
|
126
|
-
// Only include outputSchema when defined — undefined values in the
|
|
127
|
-
// tools/list response break clients that process the JSON Schema field
|
|
128
|
-
...(t.outputSchema !== undefined ? { outputSchema: t.outputSchema } : {}),
|
|
129
|
-
annotations: t.annotations,
|
|
130
|
-
icons: getToolIcon(t.group),
|
|
131
|
-
})
|
|
132
|
-
|
|
133
|
-
if (filterConfig) {
|
|
134
|
-
// Filtered lists are not cached — filter sets vary per call
|
|
135
|
-
return Array.from((toolMapCache ?? EMPTY_TOOL_MAP).values())
|
|
136
|
-
.filter((t) => filterConfig.enabledTools.has(t.name))
|
|
137
|
-
.map(mapTool)
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
// Return cached mapped output for unfiltered calls
|
|
141
|
-
mappedToolsCache ??= Array.from((toolMapCache ?? EMPTY_TOOL_MAP).values()).map(mapTool)
|
|
142
|
-
return mappedToolsCache
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
/**
|
|
146
|
-
* Cached tool map for O(1) lookup in callTool and getTools.
|
|
147
|
-
* Built lazily on first invocation. Invalidates when any
|
|
148
|
-
* context parameter changes (happens in tests with different mocks;
|
|
149
|
-
* in production, all instances are stable).
|
|
150
|
-
*/
|
|
151
|
-
let toolMapCache: Map<string, ToolDefinition> | null = null
|
|
152
|
-
/** Cached mapped tool output for unfiltered getTools calls */
|
|
153
|
-
let mappedToolsCache: ToolRegistration[] | null = null
|
|
154
|
-
/** Typed empty map for safe fallback (narrowing guard, never actually used) */
|
|
155
|
-
const EMPTY_TOOL_MAP = new Map<string, ToolDefinition>()
|
|
156
|
-
let cachedContextRefs: {
|
|
157
|
-
db: IDatabaseAdapter
|
|
158
|
-
github?: GitHubIntegration
|
|
159
|
-
vectorManager?: VectorSearchManager
|
|
160
|
-
config?: ToolHandlerConfig
|
|
161
|
-
teamDb?: IDatabaseAdapter
|
|
162
|
-
teamVectorManager?: VectorSearchManager
|
|
163
|
-
} | null = null
|
|
164
|
-
|
|
165
|
-
/**
|
|
166
|
-
* Ensure the tool definition cache is populated and valid for the given context.
|
|
167
|
-
* Shared by getTools() and callTool() to avoid redundant getAllToolDefinitions() calls.
|
|
168
|
-
*/
|
|
169
|
-
function ensureToolCache(
|
|
170
|
-
db: IDatabaseAdapter,
|
|
171
|
-
vectorManager?: VectorSearchManager,
|
|
172
|
-
github?: GitHubIntegration,
|
|
173
|
-
config?: ToolHandlerConfig,
|
|
174
|
-
teamDb?: IDatabaseAdapter,
|
|
175
|
-
teamVectorManager?: VectorSearchManager
|
|
176
|
-
): void {
|
|
177
|
-
if (
|
|
178
|
-
toolMapCache &&
|
|
179
|
-
cachedContextRefs?.db === db &&
|
|
180
|
-
cachedContextRefs.github === github &&
|
|
181
|
-
cachedContextRefs.vectorManager === vectorManager &&
|
|
182
|
-
cachedContextRefs.config === config &&
|
|
183
|
-
cachedContextRefs.teamDb === teamDb &&
|
|
184
|
-
cachedContextRefs.teamVectorManager === teamVectorManager
|
|
185
|
-
) {
|
|
186
|
-
return // Cache is valid
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
const context: ToolContext = { db, teamDb, vectorManager, teamVectorManager, github, config }
|
|
190
|
-
toolMapCache = new Map(getAllToolDefinitions(context).map((t) => [t.name, t]))
|
|
191
|
-
mappedToolsCache = null // Invalidate mapped cache when definitions change
|
|
192
|
-
cachedContextRefs = { db, github, vectorManager, config, teamDb, teamVectorManager }
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
/**
|
|
196
|
-
* Call a tool by name
|
|
197
|
-
*/
|
|
198
|
-
export function callTool(
|
|
199
|
-
name: string,
|
|
200
|
-
args: Record<string, unknown>,
|
|
201
|
-
db: IDatabaseAdapter,
|
|
202
|
-
vectorManager?: VectorSearchManager,
|
|
203
|
-
github?: GitHubIntegration,
|
|
204
|
-
config?: ToolHandlerConfig,
|
|
205
|
-
progress?: ProgressContext,
|
|
206
|
-
teamDb?: IDatabaseAdapter,
|
|
207
|
-
teamVectorManager?: VectorSearchManager
|
|
208
|
-
): Promise<unknown> {
|
|
209
|
-
ensureToolCache(db, vectorManager, github, config, teamDb, teamVectorManager)
|
|
210
|
-
|
|
211
|
-
const tool = (toolMapCache ?? EMPTY_TOOL_MAP).get(name)
|
|
212
|
-
|
|
213
|
-
if (!tool) {
|
|
214
|
-
return Promise.reject(new Error(`Unknown tool: ${name}`))
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
// When progress context is provided, rebuild the handler with it.
|
|
218
|
-
// This is rare (only MCP server calls with progress tokens, not benchmarked).
|
|
219
|
-
if (progress) {
|
|
220
|
-
const context: ToolContext = {
|
|
221
|
-
db,
|
|
222
|
-
teamDb,
|
|
223
|
-
vectorManager,
|
|
224
|
-
teamVectorManager,
|
|
225
|
-
github,
|
|
226
|
-
config,
|
|
227
|
-
progress,
|
|
228
|
-
}
|
|
229
|
-
const freshTools = getAllToolDefinitions(context)
|
|
230
|
-
const freshTool = freshTools.find((t) => t.name === name)
|
|
231
|
-
if (freshTool) {
|
|
232
|
-
return Promise.resolve(freshTool.handler(args))
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
return Promise.resolve(tool.handler(args))
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
/**
|
|
240
|
-
* Compose all tool definitions from group modules
|
|
241
|
-
*/
|
|
242
|
-
function getAllToolDefinitions(context: ToolContext): ToolDefinition[] {
|
|
243
|
-
return [
|
|
244
|
-
...getCoreTools(context),
|
|
245
|
-
...getSearchTools(context),
|
|
246
|
-
...getAnalyticsTools(context),
|
|
247
|
-
...getRelationshipTools(context),
|
|
248
|
-
...getExportTools(context),
|
|
249
|
-
...getAdminTools(context),
|
|
250
|
-
...getGitHubTools(context),
|
|
251
|
-
...getBackupTools(context),
|
|
252
|
-
...getTeamTools(context),
|
|
253
|
-
...getCodeModeTools(context),
|
|
254
|
-
]
|
|
255
|
-
}
|
|
@@ -1,390 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Relationships Tool Group - 2 tools
|
|
3
|
-
*
|
|
4
|
-
* Tools: link_entries, visualize_relationships
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { z } from 'zod'
|
|
8
|
-
import type { ToolDefinition, ToolContext, RelationshipType } from '../../types/index.js'
|
|
9
|
-
import { formatHandlerError } from '../../utils/error-helpers.js'
|
|
10
|
-
import { RelationshipOutputSchema, relaxedNumber } from './schemas.js'
|
|
11
|
-
import { ErrorFieldsMixin } from './error-fields-mixin.js'
|
|
12
|
-
import type { QueryResult } from '../../database/core/interfaces.js'
|
|
13
|
-
|
|
14
|
-
// ============================================================================
|
|
15
|
-
// Input Schemas
|
|
16
|
-
// ============================================================================
|
|
17
|
-
|
|
18
|
-
/** Strict schema — used inside handler for structured Zod errors */
|
|
19
|
-
const LinkEntriesSchema = z.object({
|
|
20
|
-
from_entry_id: z.number(),
|
|
21
|
-
to_entry_id: z.number(),
|
|
22
|
-
relationship_type: z
|
|
23
|
-
.enum([
|
|
24
|
-
'evolves_from',
|
|
25
|
-
'references',
|
|
26
|
-
'implements',
|
|
27
|
-
'clarifies',
|
|
28
|
-
'response_to',
|
|
29
|
-
'blocked_by',
|
|
30
|
-
'resolved',
|
|
31
|
-
'caused',
|
|
32
|
-
])
|
|
33
|
-
.optional()
|
|
34
|
-
.default('references'),
|
|
35
|
-
description: z.string().optional(),
|
|
36
|
-
})
|
|
37
|
-
|
|
38
|
-
/** Relaxed schema — passed to SDK inputSchema so Zod enum errors reach the handler */
|
|
39
|
-
const LinkEntriesSchemaMcp = z.object({
|
|
40
|
-
from_entry_id: relaxedNumber(),
|
|
41
|
-
to_entry_id: relaxedNumber(),
|
|
42
|
-
relationship_type: z.string().optional().default('references'),
|
|
43
|
-
description: z.string().optional(),
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
const VisualizeInputSchema = z.object({
|
|
47
|
-
entry_id: z
|
|
48
|
-
.number()
|
|
49
|
-
.optional()
|
|
50
|
-
.describe('Specific entry ID to visualize (shows connected entries)'),
|
|
51
|
-
tags: z.array(z.string()).optional().describe('Filter entries by tags'),
|
|
52
|
-
depth: z.number().min(1).max(3).optional().default(2).describe('Relationship traversal depth'),
|
|
53
|
-
limit: z.number().max(500).optional().default(20).describe('Maximum entries to include'),
|
|
54
|
-
})
|
|
55
|
-
|
|
56
|
-
/** Relaxed schema — passed to SDK inputSchema so Zod min/max errors reach the handler */
|
|
57
|
-
const VisualizeInputSchemaMcp = z.object({
|
|
58
|
-
entry_id: relaxedNumber()
|
|
59
|
-
.optional()
|
|
60
|
-
.describe('Specific entry ID to visualize (shows connected entries)'),
|
|
61
|
-
tags: z.array(z.string()).optional().describe('Filter entries by tags'),
|
|
62
|
-
depth: relaxedNumber().optional().default(2).describe('Relationship traversal depth'),
|
|
63
|
-
limit: relaxedNumber().optional().default(20).describe('Maximum entries to include'),
|
|
64
|
-
})
|
|
65
|
-
|
|
66
|
-
// ============================================================================
|
|
67
|
-
// Output Schemas
|
|
68
|
-
// ============================================================================
|
|
69
|
-
|
|
70
|
-
const LinkEntriesOutputSchema = z
|
|
71
|
-
.object({
|
|
72
|
-
success: z.boolean().optional(),
|
|
73
|
-
relationship: RelationshipOutputSchema.optional(),
|
|
74
|
-
duplicate: z.boolean().optional().describe('True if relationship already existed'),
|
|
75
|
-
message: z.string().optional().describe('Additional context about the operation'),
|
|
76
|
-
error: z.string().optional(),
|
|
77
|
-
})
|
|
78
|
-
.extend(ErrorFieldsMixin.shape)
|
|
79
|
-
|
|
80
|
-
const VisualizationOutputSchema = z
|
|
81
|
-
.object({
|
|
82
|
-
entry_count: z.number().optional(),
|
|
83
|
-
relationship_count: z.number().optional(),
|
|
84
|
-
root_entry: z.number().nullable().optional(),
|
|
85
|
-
depth: z.number().optional(),
|
|
86
|
-
mermaid: z.string().nullable().optional(),
|
|
87
|
-
message: z.string().optional(),
|
|
88
|
-
legend: z
|
|
89
|
-
.object({
|
|
90
|
-
blue: z.string(),
|
|
91
|
-
orange: z.string(),
|
|
92
|
-
arrows: z.record(z.string(), z.string()),
|
|
93
|
-
})
|
|
94
|
-
.optional(),
|
|
95
|
-
success: z.boolean().optional(),
|
|
96
|
-
error: z.string().optional(),
|
|
97
|
-
})
|
|
98
|
-
.extend(ErrorFieldsMixin.shape)
|
|
99
|
-
|
|
100
|
-
// ============================================================================
|
|
101
|
-
// Tool Definitions
|
|
102
|
-
// ============================================================================
|
|
103
|
-
|
|
104
|
-
export function getRelationshipTools(context: ToolContext): ToolDefinition[] {
|
|
105
|
-
const { db } = context
|
|
106
|
-
return [
|
|
107
|
-
{
|
|
108
|
-
name: 'link_entries',
|
|
109
|
-
title: 'Link Entries',
|
|
110
|
-
description: 'Create a relationship between two journal entries',
|
|
111
|
-
group: 'relationships',
|
|
112
|
-
inputSchema: LinkEntriesSchemaMcp,
|
|
113
|
-
outputSchema: LinkEntriesOutputSchema,
|
|
114
|
-
annotations: { readOnlyHint: false, idempotentHint: false, openWorldHint: false },
|
|
115
|
-
handler: (params: unknown) => {
|
|
116
|
-
try {
|
|
117
|
-
const input = LinkEntriesSchema.parse(params)
|
|
118
|
-
|
|
119
|
-
// Guard: self-referential links are not meaningful
|
|
120
|
-
if (input.from_entry_id === input.to_entry_id) {
|
|
121
|
-
return {
|
|
122
|
-
success: false,
|
|
123
|
-
error: 'Cannot link an entry to itself',
|
|
124
|
-
code: 'VALIDATION_ERROR',
|
|
125
|
-
category: 'validation',
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
// Check for existing duplicate relationship (exact direction only).
|
|
130
|
-
// Reverse direction (B→A when A→B exists) is intentionally allowed
|
|
131
|
-
// so agents can model bidirectional relationships explicitly.
|
|
132
|
-
const existingRelationships = db.getRelationships(input.from_entry_id)
|
|
133
|
-
const existing = existingRelationships.find(
|
|
134
|
-
(r) =>
|
|
135
|
-
r.fromEntryId === input.from_entry_id &&
|
|
136
|
-
r.toEntryId === input.to_entry_id &&
|
|
137
|
-
r.relationshipType === input.relationship_type
|
|
138
|
-
)
|
|
139
|
-
|
|
140
|
-
if (existing) {
|
|
141
|
-
return {
|
|
142
|
-
success: true,
|
|
143
|
-
relationship: existing,
|
|
144
|
-
duplicate: true,
|
|
145
|
-
message: 'Relationship already exists',
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
// linkEntries throws for nonexistent entries
|
|
150
|
-
const relationship = db.linkEntries(
|
|
151
|
-
input.from_entry_id,
|
|
152
|
-
input.to_entry_id,
|
|
153
|
-
input.relationship_type as RelationshipType,
|
|
154
|
-
input.description
|
|
155
|
-
)
|
|
156
|
-
return { success: true, relationship }
|
|
157
|
-
} catch (error) {
|
|
158
|
-
// Domain errors from db.linkEntries (nonexistent entries)
|
|
159
|
-
const input = (() => {
|
|
160
|
-
try {
|
|
161
|
-
return LinkEntriesSchema.parse(params)
|
|
162
|
-
} catch {
|
|
163
|
-
// If parse itself failed, use formatHandlerError
|
|
164
|
-
return null
|
|
165
|
-
}
|
|
166
|
-
})()
|
|
167
|
-
|
|
168
|
-
if (input) {
|
|
169
|
-
const errMsg = error instanceof Error ? error.message : 'Unknown error'
|
|
170
|
-
const isFkError = errMsg.includes('FOREIGN KEY constraint failed')
|
|
171
|
-
if (isFkError) {
|
|
172
|
-
return {
|
|
173
|
-
success: false,
|
|
174
|
-
error: `One or both entries not found (from: ${String(input.from_entry_id)}, to: ${String(input.to_entry_id)})`,
|
|
175
|
-
code: 'RESOURCE_NOT_FOUND',
|
|
176
|
-
category: 'resource',
|
|
177
|
-
suggestion: 'Verify both entry IDs exist before linking',
|
|
178
|
-
recoverable: true,
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
return formatHandlerError(error)
|
|
183
|
-
}
|
|
184
|
-
},
|
|
185
|
-
},
|
|
186
|
-
{
|
|
187
|
-
name: 'visualize_relationships',
|
|
188
|
-
title: 'Visualize Relationships',
|
|
189
|
-
description: 'Generate a Mermaid diagram visualization of entry relationships',
|
|
190
|
-
group: 'relationships',
|
|
191
|
-
inputSchema: VisualizeInputSchemaMcp,
|
|
192
|
-
outputSchema: VisualizationOutputSchema,
|
|
193
|
-
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
|
|
194
|
-
handler: (params: unknown) => {
|
|
195
|
-
try {
|
|
196
|
-
const input = VisualizeInputSchema.parse(params)
|
|
197
|
-
let entriesResult: QueryResult[]
|
|
198
|
-
|
|
199
|
-
if (input.entry_id !== undefined) {
|
|
200
|
-
const entry = db.getEntryById(input.entry_id)
|
|
201
|
-
if (!entry) {
|
|
202
|
-
return {
|
|
203
|
-
success: false,
|
|
204
|
-
entry_count: 0,
|
|
205
|
-
relationship_count: 0,
|
|
206
|
-
root_entry: input.entry_id,
|
|
207
|
-
depth: input.depth,
|
|
208
|
-
mermaid: null,
|
|
209
|
-
message: `Entry ${String(input.entry_id)} not found`,
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
entriesResult = db.executeRawQuery(
|
|
214
|
-
`
|
|
215
|
-
WITH RECURSIVE connected_entries(id, distance) AS (
|
|
216
|
-
SELECT id, 0 FROM memory_journal WHERE id = ? AND deleted_at IS NULL
|
|
217
|
-
UNION
|
|
218
|
-
SELECT DISTINCT
|
|
219
|
-
CASE
|
|
220
|
-
WHEN r.from_entry_id = ce.id THEN r.to_entry_id
|
|
221
|
-
ELSE r.from_entry_id
|
|
222
|
-
END,
|
|
223
|
-
ce.distance + 1
|
|
224
|
-
FROM connected_entries ce
|
|
225
|
-
JOIN relationships r ON r.from_entry_id = ce.id OR r.to_entry_id = ce.id
|
|
226
|
-
WHERE ce.distance < ?
|
|
227
|
-
)
|
|
228
|
-
SELECT DISTINCT mj.id, mj.entry_type, mj.content, mj.is_personal
|
|
229
|
-
FROM memory_journal mj
|
|
230
|
-
JOIN connected_entries ce ON mj.id = ce.id
|
|
231
|
-
WHERE mj.deleted_at IS NULL
|
|
232
|
-
LIMIT ?
|
|
233
|
-
`,
|
|
234
|
-
[input.entry_id, input.depth, input.limit]
|
|
235
|
-
)
|
|
236
|
-
} else if (input.tags && input.tags.length > 0) {
|
|
237
|
-
const placeholders = input.tags.map(() => '?').join(',')
|
|
238
|
-
entriesResult = db.executeRawQuery(
|
|
239
|
-
`
|
|
240
|
-
SELECT DISTINCT mj.id, mj.entry_type, mj.content, mj.is_personal
|
|
241
|
-
FROM memory_journal mj
|
|
242
|
-
WHERE mj.deleted_at IS NULL
|
|
243
|
-
AND mj.id IN (
|
|
244
|
-
SELECT et.entry_id FROM entry_tags et
|
|
245
|
-
JOIN tags t ON et.tag_id = t.id
|
|
246
|
-
WHERE t.name IN (${placeholders})
|
|
247
|
-
)
|
|
248
|
-
LIMIT ?
|
|
249
|
-
`,
|
|
250
|
-
[...input.tags, input.limit]
|
|
251
|
-
)
|
|
252
|
-
} else {
|
|
253
|
-
entriesResult = db.executeRawQuery(
|
|
254
|
-
`
|
|
255
|
-
SELECT DISTINCT mj.id, mj.entry_type, mj.content, mj.is_personal
|
|
256
|
-
FROM memory_journal mj
|
|
257
|
-
WHERE mj.deleted_at IS NULL
|
|
258
|
-
AND mj.id IN (
|
|
259
|
-
SELECT DISTINCT from_entry_id FROM relationships
|
|
260
|
-
UNION
|
|
261
|
-
SELECT DISTINCT to_entry_id FROM relationships
|
|
262
|
-
)
|
|
263
|
-
ORDER BY mj.id DESC
|
|
264
|
-
LIMIT ?
|
|
265
|
-
`,
|
|
266
|
-
[input.limit]
|
|
267
|
-
)
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
if (!entriesResult[0] || entriesResult[0].values.length === 0) {
|
|
271
|
-
return {
|
|
272
|
-
entry_count: 0,
|
|
273
|
-
relationship_count: 0,
|
|
274
|
-
root_entry: input.entry_id ?? null,
|
|
275
|
-
depth: input.depth,
|
|
276
|
-
mermaid: null,
|
|
277
|
-
message: 'No entries found with relationships matching your criteria',
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
// Build entries map
|
|
282
|
-
const entries: Record<
|
|
283
|
-
number,
|
|
284
|
-
{
|
|
285
|
-
id: number
|
|
286
|
-
entry_type: string
|
|
287
|
-
content: string
|
|
288
|
-
is_personal: boolean
|
|
289
|
-
}
|
|
290
|
-
> = {}
|
|
291
|
-
const cols = entriesResult[0].columns
|
|
292
|
-
for (const row of entriesResult[0].values) {
|
|
293
|
-
const id = row[cols.indexOf('id')] as number
|
|
294
|
-
entries[id] = {
|
|
295
|
-
id,
|
|
296
|
-
entry_type: row[cols.indexOf('entry_type')] as string,
|
|
297
|
-
content: row[cols.indexOf('content')] as string,
|
|
298
|
-
is_personal: Boolean(row[cols.indexOf('is_personal')]),
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
const entryIds = Object.keys(entries).map(Number)
|
|
303
|
-
const placeholders = entryIds.map(() => '?').join(',')
|
|
304
|
-
|
|
305
|
-
const relsResult = db.executeRawQuery(
|
|
306
|
-
`
|
|
307
|
-
SELECT from_entry_id, to_entry_id, relationship_type
|
|
308
|
-
FROM relationships
|
|
309
|
-
WHERE from_entry_id IN (${placeholders})
|
|
310
|
-
AND to_entry_id IN (${placeholders})
|
|
311
|
-
`,
|
|
312
|
-
[...entryIds, ...entryIds]
|
|
313
|
-
)
|
|
314
|
-
|
|
315
|
-
const relationships = relsResult[0]?.values ?? []
|
|
316
|
-
|
|
317
|
-
// Generate Mermaid diagram
|
|
318
|
-
const MERMAID_CONTENT_PREVIEW_LENGTH = 40
|
|
319
|
-
let mermaid = '```mermaid\\ngraph TD\\n'
|
|
320
|
-
|
|
321
|
-
for (const [idStr, entry] of Object.entries(entries)) {
|
|
322
|
-
let contentPreview = entry.content
|
|
323
|
-
.slice(0, MERMAID_CONTENT_PREVIEW_LENGTH)
|
|
324
|
-
.replace(/\\n/g, ' ')
|
|
325
|
-
if (entry.content.length > MERMAID_CONTENT_PREVIEW_LENGTH)
|
|
326
|
-
contentPreview += '...'
|
|
327
|
-
contentPreview = contentPreview
|
|
328
|
-
.replace(/"/g, "'")
|
|
329
|
-
.replace(/\[/g, '(')
|
|
330
|
-
.replace(/\]/g, ')')
|
|
331
|
-
const entryTypeShort = entry.entry_type.slice(0, 20)
|
|
332
|
-
mermaid += ` E${idStr}["#${idStr}: ${contentPreview}<br/>${entryTypeShort}"]\\n`
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
mermaid += '\\n'
|
|
336
|
-
|
|
337
|
-
const relSymbols: Record<string, string> = {
|
|
338
|
-
references: '-->',
|
|
339
|
-
implements: '==>',
|
|
340
|
-
clarifies: '-.->',
|
|
341
|
-
evolves_from: '-->',
|
|
342
|
-
response_to: '<-->',
|
|
343
|
-
blocked_by: '--x',
|
|
344
|
-
resolved: '==>',
|
|
345
|
-
caused: '-.->',
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
for (const rel of relationships) {
|
|
349
|
-
const fromId = rel[0] as number
|
|
350
|
-
const toId = rel[1] as number
|
|
351
|
-
const relType = rel[2] as string
|
|
352
|
-
const arrow = relSymbols[relType] ?? '-->'
|
|
353
|
-
mermaid += ` E${String(fromId)} ${arrow}|${relType}| E${String(toId)}\\n`
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
mermaid += '\\n'
|
|
357
|
-
for (const [idStr, entry] of Object.entries(entries)) {
|
|
358
|
-
if (entry.is_personal) {
|
|
359
|
-
mermaid += ` style E${idStr} fill:#E3F2FD\\n`
|
|
360
|
-
} else {
|
|
361
|
-
mermaid += ` style E${idStr} fill:#FFF3E0\\n`
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
mermaid += '```'
|
|
365
|
-
|
|
366
|
-
return {
|
|
367
|
-
entry_count: Object.keys(entries).length,
|
|
368
|
-
relationship_count: relationships.length,
|
|
369
|
-
root_entry: input.entry_id ?? null,
|
|
370
|
-
depth: input.depth,
|
|
371
|
-
mermaid,
|
|
372
|
-
legend: {
|
|
373
|
-
blue: 'Personal entries',
|
|
374
|
-
orange: 'Project entries',
|
|
375
|
-
arrows: {
|
|
376
|
-
'-->': 'references / evolves_from',
|
|
377
|
-
'==>': 'implements / resolved',
|
|
378
|
-
'-.->': 'clarifies / caused',
|
|
379
|
-
'<-->': 'response_to',
|
|
380
|
-
'--x': 'blocked_by',
|
|
381
|
-
},
|
|
382
|
-
},
|
|
383
|
-
}
|
|
384
|
-
} catch (err) {
|
|
385
|
-
return formatHandlerError(err)
|
|
386
|
-
}
|
|
387
|
-
},
|
|
388
|
-
},
|
|
389
|
-
]
|
|
390
|
-
}
|