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,409 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Memory Journal MCP Server - Vector Search Manager
|
|
3
|
-
*
|
|
4
|
-
* Semantic search using @huggingface/transformers for embeddings
|
|
5
|
-
* and sqlite-vec for vector indexing (stored in the same SQLite database).
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
// @huggingface/transformers is loaded lazily via dynamic import() in initialize()
|
|
9
|
-
// to avoid 1.5s cold-start penalty from eagerly loading the module.
|
|
10
|
-
import type { Database as BetterSqlite3Database } from 'better-sqlite3'
|
|
11
|
-
import { logger } from '../utils/logger.js'
|
|
12
|
-
import type { IDatabaseAdapter } from '../database/core/interfaces.js'
|
|
13
|
-
import type { JournalEntry } from '../types/index.js'
|
|
14
|
-
import { sendProgress, type ProgressContext } from '../utils/progress-utils.js'
|
|
15
|
-
import { ConfigurationError } from '../types/errors.js'
|
|
16
|
-
|
|
17
|
-
/** Default model for embeddings (same as Python version) */
|
|
18
|
-
const DEFAULT_MODEL = 'Xenova/all-MiniLM-L6-v2'
|
|
19
|
-
|
|
20
|
-
/** Embedding dimensions for all-MiniLM-L6-v2 */
|
|
21
|
-
const EMBEDDING_DIMENSIONS = 384
|
|
22
|
-
|
|
23
|
-
/** Number of entries to embed concurrently during rebuild */
|
|
24
|
-
const REBUILD_BATCH_SIZE = 5
|
|
25
|
-
|
|
26
|
-
/** Number of entries to fetch per page during rebuild */
|
|
27
|
-
const REBUILD_PAGE_SIZE = 200
|
|
28
|
-
|
|
29
|
-
/** Search result with similarity score */
|
|
30
|
-
export interface SemanticSearchResult {
|
|
31
|
-
entryId: number
|
|
32
|
-
score: number
|
|
33
|
-
entry?: JournalEntry
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* VectorSearchManager - Handles semantic search with local embeddings
|
|
38
|
-
*
|
|
39
|
-
* Stores embeddings in the same SQLite database using the sqlite-vec extension.
|
|
40
|
-
* Uses vec0 virtual tables for efficient KNN vector search via SQL.
|
|
41
|
-
*/
|
|
42
|
-
export class VectorSearchManager {
|
|
43
|
-
// Use a more flexible type since FeatureExtractionPipeline doesn't fully implement Pipeline
|
|
44
|
-
private embedder:
|
|
45
|
-
| ((text: string, options?: Record<string, unknown>) => Promise<unknown>)
|
|
46
|
-
| null = null
|
|
47
|
-
private db: BetterSqlite3Database | null = null
|
|
48
|
-
private readonly modelName: string
|
|
49
|
-
private initialized = false
|
|
50
|
-
private initializing = false
|
|
51
|
-
|
|
52
|
-
constructor(
|
|
53
|
-
private readonly dbAdapter: IDatabaseAdapter,
|
|
54
|
-
modelName = DEFAULT_MODEL
|
|
55
|
-
) {
|
|
56
|
-
this.modelName = modelName
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Check if vector search is initialized
|
|
61
|
-
*/
|
|
62
|
-
isInitialized(): boolean {
|
|
63
|
-
return this.initialized
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Initialize the vector search manager (lazy loading)
|
|
68
|
-
*/
|
|
69
|
-
async initialize(): Promise<void> {
|
|
70
|
-
if (this.initialized || this.initializing) return
|
|
71
|
-
|
|
72
|
-
this.initializing = true
|
|
73
|
-
|
|
74
|
-
try {
|
|
75
|
-
logger.info('Initializing vector search...', { module: 'VectorSearch' })
|
|
76
|
-
|
|
77
|
-
// Load embedding model (downloads on first use, ~23MB)
|
|
78
|
-
// Dynamic import avoids 1.5s cold-start penalty from eagerly loading the module
|
|
79
|
-
logger.info(`Loading embedding model: ${this.modelName}`, { module: 'VectorSearch' })
|
|
80
|
-
const { pipeline } = await import('@huggingface/transformers')
|
|
81
|
-
this.embedder = await pipeline('feature-extraction', this.modelName, {
|
|
82
|
-
dtype: 'q8', // Quantized int8 for faster inference and smaller model size
|
|
83
|
-
})
|
|
84
|
-
logger.info('Embedding model loaded', { module: 'VectorSearch' })
|
|
85
|
-
|
|
86
|
-
// Get the raw better-sqlite3 database instance
|
|
87
|
-
// sqlite-vec extension is already loaded by NativeConnectionManager
|
|
88
|
-
this.db = this.dbAdapter.getRawDb() as BetterSqlite3Database
|
|
89
|
-
|
|
90
|
-
this.initialized = true
|
|
91
|
-
this.initializing = false
|
|
92
|
-
logger.info('Vector search initialized successfully', { module: 'VectorSearch' })
|
|
93
|
-
} catch (error) {
|
|
94
|
-
this.initializing = false
|
|
95
|
-
logger.error('Failed to initialize vector search', {
|
|
96
|
-
module: 'VectorSearch',
|
|
97
|
-
error: error instanceof Error ? error.message : String(error),
|
|
98
|
-
})
|
|
99
|
-
throw error
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* Generate embedding for text
|
|
105
|
-
*/
|
|
106
|
-
async generateEmbedding(text: string): Promise<number[]> {
|
|
107
|
-
if (!this.embedder) {
|
|
108
|
-
throw new ConfigurationError('Vector search not initialized')
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// Generate embedding using feature-extraction pipeline
|
|
112
|
-
// The pipeline returns a Tensor with a data property containing the embeddings
|
|
113
|
-
const output = (await this.embedder(text, {
|
|
114
|
-
pooling: 'mean',
|
|
115
|
-
normalize: true,
|
|
116
|
-
})) as { data: ArrayLike<number> }
|
|
117
|
-
|
|
118
|
-
// Convert to number array
|
|
119
|
-
const embedding = Array.from(output.data)
|
|
120
|
-
return embedding
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
/**
|
|
124
|
-
* Add an entry to the vector index (upsert - replaces if exists)
|
|
125
|
-
*/
|
|
126
|
-
async addEntry(
|
|
127
|
-
entryId: number,
|
|
128
|
-
content: string
|
|
129
|
-
): Promise<{ success: boolean; error?: string }> {
|
|
130
|
-
if (!this.initialized) {
|
|
131
|
-
try {
|
|
132
|
-
await this.initialize()
|
|
133
|
-
} catch (initError) {
|
|
134
|
-
const msg = initError instanceof Error ? initError.message : String(initError)
|
|
135
|
-
return { success: false, error: `Vector search initialization failed: ${msg}` }
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
if (!this.db) {
|
|
140
|
-
return { success: false, error: 'Vector database not available' }
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
try {
|
|
144
|
-
// Generate embedding
|
|
145
|
-
const embedding = await this.generateEmbedding(content)
|
|
146
|
-
|
|
147
|
-
// vec0 virtual tables don't support INSERT OR REPLACE — use DELETE+INSERT
|
|
148
|
-
const vec = new Float32Array(embedding)
|
|
149
|
-
const bigId = BigInt(entryId)
|
|
150
|
-
// DELETE is a no-op if entry doesn't exist
|
|
151
|
-
this.db.prepare('DELETE FROM vec_embeddings WHERE entry_id = ?').run(bigId)
|
|
152
|
-
this.db
|
|
153
|
-
.prepare('INSERT INTO vec_embeddings(entry_id, embedding) VALUES (?, ?)')
|
|
154
|
-
.run(bigId, vec)
|
|
155
|
-
|
|
156
|
-
logger.debug('Added entry to vector index', {
|
|
157
|
-
module: 'VectorSearch',
|
|
158
|
-
entityId: entryId,
|
|
159
|
-
})
|
|
160
|
-
|
|
161
|
-
return { success: true }
|
|
162
|
-
} catch (error) {
|
|
163
|
-
const errorMessage = error instanceof Error ? error.message : String(error)
|
|
164
|
-
logger.error('Failed to add entry to vector index', {
|
|
165
|
-
module: 'VectorSearch',
|
|
166
|
-
entityId: entryId,
|
|
167
|
-
error: errorMessage,
|
|
168
|
-
})
|
|
169
|
-
return { success: false, error: errorMessage }
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* Perform semantic search
|
|
175
|
-
*
|
|
176
|
-
* sqlite-vec returns L2 distance (lower = more similar).
|
|
177
|
-
* We convert to a similarity score: score = 1 / (1 + distance)
|
|
178
|
-
*/
|
|
179
|
-
async search(
|
|
180
|
-
query: string,
|
|
181
|
-
limit = 10,
|
|
182
|
-
similarityThreshold = 0.3
|
|
183
|
-
): Promise<SemanticSearchResult[]> {
|
|
184
|
-
if (!this.initialized) {
|
|
185
|
-
try {
|
|
186
|
-
await this.initialize()
|
|
187
|
-
} catch {
|
|
188
|
-
return []
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
if (!this.db) {
|
|
193
|
-
return []
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
try {
|
|
197
|
-
// Generate query embedding
|
|
198
|
-
const queryEmbedding = await this.generateEmbedding(query)
|
|
199
|
-
const queryVec = new Float32Array(queryEmbedding)
|
|
200
|
-
|
|
201
|
-
// KNN search via sqlite-vec vec0 virtual table
|
|
202
|
-
// Returns entry_id and distance (L2), ordered by distance ascending
|
|
203
|
-
const results = this.db
|
|
204
|
-
.prepare(
|
|
205
|
-
`SELECT entry_id, distance
|
|
206
|
-
FROM vec_embeddings
|
|
207
|
-
WHERE embedding MATCH ?
|
|
208
|
-
ORDER BY distance
|
|
209
|
-
LIMIT ?`
|
|
210
|
-
)
|
|
211
|
-
.all(queryVec, limit * 2) as { entry_id: number; distance: number }[]
|
|
212
|
-
|
|
213
|
-
// Convert L2 distance to similarity score and filter by threshold
|
|
214
|
-
const filteredResults: SemanticSearchResult[] = results
|
|
215
|
-
.map((r) => ({
|
|
216
|
-
entryId: r.entry_id,
|
|
217
|
-
score: 1 / (1 + r.distance),
|
|
218
|
-
}))
|
|
219
|
-
.filter((r) => r.score >= similarityThreshold)
|
|
220
|
-
.slice(0, limit)
|
|
221
|
-
|
|
222
|
-
return filteredResults
|
|
223
|
-
} catch (error) {
|
|
224
|
-
logger.error('Semantic search failed', {
|
|
225
|
-
module: 'VectorSearch',
|
|
226
|
-
error: error instanceof Error ? error.message : String(error),
|
|
227
|
-
})
|
|
228
|
-
return []
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
/**
|
|
233
|
-
* Remove an entry from the vector index
|
|
234
|
-
*/
|
|
235
|
-
removeEntry(entryId: number): boolean {
|
|
236
|
-
if (!this.db) return false
|
|
237
|
-
|
|
238
|
-
try {
|
|
239
|
-
// sqlite-vec vec0 requires BigInt primary keys through better-sqlite3 bindings
|
|
240
|
-
this.db.prepare('DELETE FROM vec_embeddings WHERE entry_id = ?').run(BigInt(entryId))
|
|
241
|
-
return true
|
|
242
|
-
} catch (error) {
|
|
243
|
-
logger.debug('Vector removeEntry failed (item may not exist)', {
|
|
244
|
-
module: 'VectorSearch',
|
|
245
|
-
entityId: entryId,
|
|
246
|
-
error: error instanceof Error ? error.message : String(error),
|
|
247
|
-
})
|
|
248
|
-
return false
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
/**
|
|
253
|
-
* Rebuild index from database entries.
|
|
254
|
-
* Uses paginated fetching and parallel batch embedding for performance.
|
|
255
|
-
* @param db - Database adapter
|
|
256
|
-
* @param progress - Optional progress context for notifications
|
|
257
|
-
*/
|
|
258
|
-
async rebuildIndex(
|
|
259
|
-
db: IDatabaseAdapter,
|
|
260
|
-
progress?: ProgressContext
|
|
261
|
-
): Promise<{ indexed: number; failed: number; firstError: string | null }> {
|
|
262
|
-
if (!this.initialized) {
|
|
263
|
-
try {
|
|
264
|
-
await this.initialize()
|
|
265
|
-
} catch (initError) {
|
|
266
|
-
const msg = initError instanceof Error ? initError.message : String(initError)
|
|
267
|
-
return {
|
|
268
|
-
indexed: 0,
|
|
269
|
-
failed: 0,
|
|
270
|
-
firstError: `Vector search initialization failed: ${msg}`,
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
if (!this.db) {
|
|
276
|
-
return { indexed: 0, failed: 0, firstError: null }
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
logger.info('Rebuilding vector index from database...', { module: 'VectorSearch' })
|
|
280
|
-
|
|
281
|
-
// Step 1: Get total entry count for progress reporting
|
|
282
|
-
const totalEntries = db.getActiveEntryCount()
|
|
283
|
-
|
|
284
|
-
// Step 2: Clear existing embeddings (O(1) operation)
|
|
285
|
-
this.db.prepare('DELETE FROM vec_embeddings').run()
|
|
286
|
-
logger.info('Cleared vec_embeddings table for rebuild', { module: 'VectorSearch' })
|
|
287
|
-
|
|
288
|
-
// Step 3: Re-index all entries using paginated fetch
|
|
289
|
-
// Embeddings are generated in parallel batches (CPU-bound, safe),
|
|
290
|
-
// then inserted into SQLite (synchronous, fast, concurrency-safe via WAL)
|
|
291
|
-
await sendProgress(progress, 0, totalEntries, 'Starting vector index rebuild...')
|
|
292
|
-
|
|
293
|
-
// Prepare insert statement once for reuse
|
|
294
|
-
const insertStmt = this.db.prepare(
|
|
295
|
-
'INSERT INTO vec_embeddings(entry_id, embedding) VALUES (?, ?)'
|
|
296
|
-
)
|
|
297
|
-
|
|
298
|
-
let indexed = 0
|
|
299
|
-
let failed = 0
|
|
300
|
-
let firstError: string | null = null
|
|
301
|
-
for (let offset = 0; offset < totalEntries; offset += REBUILD_PAGE_SIZE) {
|
|
302
|
-
const page = db.getEntriesPage(offset, REBUILD_PAGE_SIZE)
|
|
303
|
-
|
|
304
|
-
// Generate embeddings in parallel batches
|
|
305
|
-
for (let i = 0; i < page.length; i += REBUILD_BATCH_SIZE) {
|
|
306
|
-
const batch = page.slice(i, i + REBUILD_BATCH_SIZE)
|
|
307
|
-
|
|
308
|
-
// Parallel embedding generation
|
|
309
|
-
const embeddings = await Promise.all(
|
|
310
|
-
batch.map(async (entry: JournalEntry) => {
|
|
311
|
-
try {
|
|
312
|
-
return {
|
|
313
|
-
entry,
|
|
314
|
-
embedding: await this.generateEmbedding(entry.content),
|
|
315
|
-
error: null,
|
|
316
|
-
}
|
|
317
|
-
} catch (embError) {
|
|
318
|
-
const errorMsg =
|
|
319
|
-
embError instanceof Error ? embError.message : String(embError)
|
|
320
|
-
logger.debug('Failed to generate embedding for entry', {
|
|
321
|
-
module: 'VectorSearch',
|
|
322
|
-
entityId: entry.id,
|
|
323
|
-
error: errorMsg,
|
|
324
|
-
})
|
|
325
|
-
return { entry, embedding: null as number[] | null, error: errorMsg }
|
|
326
|
-
}
|
|
327
|
-
})
|
|
328
|
-
)
|
|
329
|
-
|
|
330
|
-
// Insert embeddings into SQLite
|
|
331
|
-
for (const { entry, embedding, error: embError } of embeddings) {
|
|
332
|
-
if (embedding !== null) {
|
|
333
|
-
try {
|
|
334
|
-
const vec = new Float32Array(embedding)
|
|
335
|
-
// sqlite-vec vec0 requires BigInt primary keys through better-sqlite3 bindings
|
|
336
|
-
insertStmt.run(BigInt(entry.id), vec)
|
|
337
|
-
indexed++
|
|
338
|
-
} catch (error) {
|
|
339
|
-
failed++
|
|
340
|
-
const errorMsg = error instanceof Error ? error.message : String(error)
|
|
341
|
-
firstError ??= errorMsg
|
|
342
|
-
logger.error('Failed to insert entry into vector index', {
|
|
343
|
-
module: 'VectorSearch',
|
|
344
|
-
entityId: entry.id,
|
|
345
|
-
error: errorMsg,
|
|
346
|
-
})
|
|
347
|
-
}
|
|
348
|
-
} else {
|
|
349
|
-
failed++
|
|
350
|
-
if (embError !== null) firstError ??= embError
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
// Report progress every 10 entries to avoid flooding
|
|
355
|
-
if (indexed % 10 === 0 || indexed === totalEntries) {
|
|
356
|
-
await sendProgress(
|
|
357
|
-
progress,
|
|
358
|
-
indexed,
|
|
359
|
-
totalEntries,
|
|
360
|
-
`Indexed ${String(indexed)} of ${String(totalEntries)} entries`
|
|
361
|
-
)
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
// Final progress
|
|
367
|
-
await sendProgress(progress, indexed, totalEntries, 'Vector index rebuild complete')
|
|
368
|
-
|
|
369
|
-
if (failed > 0) {
|
|
370
|
-
logger.warning(
|
|
371
|
-
`Vector index rebuild: ${String(indexed)} indexed, ${String(failed)} failed`,
|
|
372
|
-
{
|
|
373
|
-
module: 'VectorSearch',
|
|
374
|
-
}
|
|
375
|
-
)
|
|
376
|
-
} else {
|
|
377
|
-
logger.info(`Rebuilt vector index with ${String(indexed)} entries`, {
|
|
378
|
-
module: 'VectorSearch',
|
|
379
|
-
})
|
|
380
|
-
}
|
|
381
|
-
return { indexed, failed, firstError }
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
/**
|
|
385
|
-
* Get index statistics
|
|
386
|
-
*/
|
|
387
|
-
getStats(): { itemCount: number; modelName: string; dimensions: number } {
|
|
388
|
-
if (!this.db) {
|
|
389
|
-
return { itemCount: 0, modelName: this.modelName, dimensions: EMBEDDING_DIMENSIONS }
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
try {
|
|
393
|
-
const result = this.db.prepare('SELECT COUNT(*) as count FROM vec_embeddings').get() as
|
|
394
|
-
| { count: number }
|
|
395
|
-
| undefined
|
|
396
|
-
return {
|
|
397
|
-
itemCount: result?.count ?? 0,
|
|
398
|
-
modelName: this.modelName,
|
|
399
|
-
dimensions: EMBEDDING_DIMENSIONS,
|
|
400
|
-
}
|
|
401
|
-
} catch (error) {
|
|
402
|
-
logger.debug('Failed to get vector index stats', {
|
|
403
|
-
module: 'VectorSearch',
|
|
404
|
-
error: error instanceof Error ? error.message : String(error),
|
|
405
|
-
})
|
|
406
|
-
return { itemCount: 0, modelName: this.modelName, dimensions: EMBEDDING_DIMENSIONS }
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
}
|
package/src/version.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Version SSoT — Single Source of Truth
|
|
3
|
-
*
|
|
4
|
-
* Reads the version from package.json at runtime via createRequire.
|
|
5
|
-
* All modules that need the version string should import from here
|
|
6
|
-
* instead of importing package.json directly.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { createRequire } from 'node:module'
|
|
10
|
-
|
|
11
|
-
const require = createRequire(import.meta.url)
|
|
12
|
-
const pkg = require('../package.json') as { version: string }
|
|
13
|
-
|
|
14
|
-
/** The current server version, read from package.json */
|
|
15
|
-
export const VERSION: string = pkg.version
|
package/test-server/README.md
DELETED
|
@@ -1,193 +0,0 @@
|
|
|
1
|
-
# Memory Journal MCP Test Server — Agent Testing Instructions
|
|
2
|
-
|
|
3
|
-
> **This README is optimized for AI agent consumption.** It serves as the primary orchestration document for running manual MCP functionality tests against the `memory-journal-mcp` service. Test `.db` files in this directory are `.gitignore`d.
|
|
4
|
-
|
|
5
|
-
## Files
|
|
6
|
-
|
|
7
|
-
| File | Purpose | When to Read |
|
|
8
|
-
| ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------- |
|
|
9
|
-
| `test-tools.md` | **Pass 1: Core Functionality** — Phases 0-8, 10 covering seed data, happy paths, error paths, and feature verification for 41 core tools, 24 resources, 16 prompts, and scheduler | Always read first |
|
|
10
|
-
| `test-tools-team.md` | **Pass 1b: Team Collaboration** — Phase 9 covering 20 team tools + 2 team resources | After Pass 1 completes |
|
|
11
|
-
| `test-tools2.md` | **Pass 2: Validation & Edge Cases** — Phases 11-15 covering outputSchema validation, structured error verification, data integrity, boundary values, and implementation bug detection | After Pass 1 completes |
|
|
12
|
-
| `test-tools-codemode.md` | **Pass 3: Code Mode** — Phases 16-21 covering sandbox execution, API discoverability, multi-step workflows, readonly mode, error handling, and cross-group orchestration | After Pass 1 completes |
|
|
13
|
-
| `test-tools-codemode2.md` | **Pass 4: Code Mode Advanced** — Extended Code Mode scenarios | After Pass 3 completes |
|
|
14
|
-
|
|
15
|
-
| `test-preflight.md` | **Pre-flight check** — validates tiered instructions, resources, and tool-filter alignment in 5 steps | Before any test pass |
|
|
16
|
-
| `test-agent-experience.md` | **Agent experience test** — 23 open-ended scenarios across 4 passes validating instruction sufficiency for cold-start | After instruction changes |
|
|
17
|
-
| [`tool-reference.md`](tool-reference.md) | **Tool Reference** — Categorized list of all 61 tools across 11 groups | Reference |
|
|
18
|
-
| [`code-map.md`](code-map.md) | **Source Code Map** — Directory tree, handler→tool mapping, type locations, error hierarchy, key constants, architecture patterns | When debugging source code or making changes |
|
|
19
|
-
|
|
20
|
-
## Integration Test Scripts
|
|
21
|
-
|
|
22
|
-
These scripts test features that require separate server processes — they **cannot** be run via MCP tool calls. All scripts are Node.js (`.mjs`), require no dependencies beyond Node.js, and exit with code 0 on success.
|
|
23
|
-
|
|
24
|
-
> [!IMPORTANT]
|
|
25
|
-
> Always `npm run build` before running these scripts — they execute `dist/cli.js` directly.
|
|
26
|
-
|
|
27
|
-
### Script Reference
|
|
28
|
-
|
|
29
|
-
| Script | Tests | Transport | Duration |
|
|
30
|
-
| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------- | ------------- | -------- |
|
|
31
|
-
| `test-instruction-levels.mjs` | `--instruction-level` essential/standard/full token ordering | stdio | ~10s |
|
|
32
|
-
| `test-filter-instructions.mjs` | Filter-aware sections — validates each `--tool-filter` config includes/excludes correct sections + reports token estimates per filter | stdio | ~90s |
|
|
33
|
-
| `test-tool-annotations.mjs` | `tools/list` openWorldHint annotation counts (45 false + 16 true = 61) | stdio | ~5s |
|
|
34
|
-
| `test-prompts.mjs` | `prompts/list` + `prompts/get` for all 16 prompts (shape + errors) | stdio | ~10s |
|
|
35
|
-
| `test-scheduler.mjs` | Scheduler job execution (backup, vacuum, rebuild-index) | HTTP stateful | ~130s |
|
|
36
|
-
|
|
37
|
-
### Quick Run
|
|
38
|
-
|
|
39
|
-
```powershell
|
|
40
|
-
cd C:\Users\chris\Desktop\memory-journal-mcp
|
|
41
|
-
npm run build
|
|
42
|
-
|
|
43
|
-
# Phase 1.3A — Instruction levels
|
|
44
|
-
node test-server/test-instruction-levels.mjs
|
|
45
|
-
|
|
46
|
-
# Phase 1.3B — Filter-aware instruction sections + token estimates
|
|
47
|
-
node test-server/test-filter-instructions.mjs
|
|
48
|
-
|
|
49
|
-
# Phase 1.3C — Tool annotations
|
|
50
|
-
node test-server/test-tool-annotations.mjs
|
|
51
|
-
|
|
52
|
-
# Phase 8 — Prompt handlers
|
|
53
|
-
node test-server/test-prompts.mjs
|
|
54
|
-
|
|
55
|
-
# Phase 9 — Scheduler (requires HTTP server in a separate terminal)
|
|
56
|
-
node dist/cli.js --transport http --port 3099 --backup-interval 1 --keep-backups 3 --vacuum-interval 2 --rebuild-index-interval 2
|
|
57
|
-
# In another terminal:
|
|
58
|
-
node test-server/test-scheduler.mjs
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
### Scheduler Script Options
|
|
62
|
-
|
|
63
|
-
| Env Variable | Default | Description |
|
|
64
|
-
| -------------- | --------------------------- | -------------------------------------------------------------------- |
|
|
65
|
-
| `MCP_URL` | `http://localhost:3099/mcp` | HTTP endpoint URL |
|
|
66
|
-
| `WAIT_SECONDS` | `130` | Seconds to wait for jobs to fire (set to `0` for initial check only) |
|
|
67
|
-
|
|
68
|
-
### Dual Transport Notes
|
|
69
|
-
|
|
70
|
-
The server supports three transport modes:
|
|
71
|
-
|
|
72
|
-
| Mode | CLI Flags | Scheduler | Sessions |
|
|
73
|
-
| -------------- | ------------------------------ | ----------- | ------------------------ |
|
|
74
|
-
| stdio | `--transport stdio` (default) | ❌ Inactive | N/A |
|
|
75
|
-
| HTTP stateful | `--transport http` | ✅ Active | `mcp-session-id` header |
|
|
76
|
-
| HTTP stateless | `--transport http --stateless` | ✅ Active | No sessions (serverless) |
|
|
77
|
-
|
|
78
|
-
The scheduler activates in **both** HTTP modes. The test script handles SSE response parsing automatically (HTTP transport returns `text/event-stream`). In stateless mode, there are no sessions so each request is independent — the scheduler still runs but session-scoped resources behave differently.
|
|
79
|
-
|
|
80
|
-
## Success Criteria
|
|
81
|
-
|
|
82
|
-
### Instruction Levels (Phase 1.3A)
|
|
83
|
-
|
|
84
|
-
- [ ] essential (~1.2K tokens) < standard (~1.4K) < full (~6.7K)
|
|
85
|
-
- [ ] No runtime errors in server logs
|
|
86
|
-
|
|
87
|
-
### Filter-Aware Instructions (Phase 1.3B)
|
|
88
|
-
|
|
89
|
-
- [ ] 9/9 filter configs pass section presence/absence checks
|
|
90
|
-
- [ ] `full` includes CORE + COPILOT + CODE_MODE + GITHUB_INTEGRATION + SEARCH_ROW (~1790 tokens)
|
|
91
|
-
- [ ] `codemode` omits COPILOT + GITHUB_INTEGRATION + SEARCH_ROW (~1190 tokens)
|
|
92
|
-
- [ ] `essential` — CORE + CODE_MODE only (~1214 tokens)
|
|
93
|
-
- [ ] `starter` — CORE + CODE_MODE + SEARCH_ROW (~1250 tokens)
|
|
94
|
-
- [ ] `core` — CORE only (~759 tokens)
|
|
95
|
-
- [ ] `full -codemode` — COPILOT + GITHUB_INTEGRATION + SEARCH_ROW, no CODE_MODE (~1147 tokens)
|
|
96
|
-
- [ ] `full -github` — CODE_MODE + SEARCH_ROW, no COPILOT/GITHUB_INTEGRATION (~1391 tokens)
|
|
97
|
-
- [ ] `readonly` — CORE + SEARCH_ROW, no CODE_MODE/COPILOT/GITHUB_INTEGRATION (~771 tokens)
|
|
98
|
-
- [ ] `full --instruction-level essential` — omits GITHUB_INTEGRATION but keeps COPILOT + CODE_MODE (~1582 tokens)
|
|
99
|
-
|
|
100
|
-
### Tool Annotations (Phase 1.3C)
|
|
101
|
-
|
|
102
|
-
- [ ] 61 tools returned, all with `annotations` object
|
|
103
|
-
- [ ] 45 tools with `openWorldHint: false`, 16 with `openWorldHint: true`, 0 missing
|
|
104
|
-
|
|
105
|
-
### Scheduler (Phase 9)
|
|
106
|
-
|
|
107
|
-
- [ ] `memory://health` shows `scheduler.active: false` and empty `jobs` array in stdio mode
|
|
108
|
-
- [ ] Server logs confirm scheduler started with correct intervals
|
|
109
|
-
- [ ] `memory://health` shows all 3 jobs active with `nextRun` timestamps
|
|
110
|
-
- [ ] Backup job creates timestamped `.db` files and prunes to `--keep-backups` limit
|
|
111
|
-
- [ ] Vacuum job logs `PRAGMA optimize` completion
|
|
112
|
-
- [ ] Rebuild-index job logs vector index rebuild with entry count
|
|
113
|
-
- [ ] All `lastResult` values are `"success"` after jobs fire
|
|
114
|
-
- [ ] `lastError` remains `null` for all jobs
|
|
115
|
-
- [ ] Error in one job does not prevent others from running
|
|
116
|
-
|
|
117
|
-
## Conventions & Protocols
|
|
118
|
-
|
|
119
|
-
| Convention | Rule |
|
|
120
|
-
| ----------------------------- | -------------------------------------------------------------------------------------------------------------------- |
|
|
121
|
-
| **Reporting** | ❌ Fail, ⚠️ Issue, 📦 Payload. ✅ inline only, omit from final summary. |
|
|
122
|
-
| **Error testing** | Must return `{success: false, error: "...", code, category, suggestion, recoverable}`, NOT raw MCP error exceptions. |
|
|
123
|
-
| **Error items in checklists** | Marked with 🔴 prefix |
|
|
124
|
-
| **Post-test** | Clean up test databases/data → plan fixes → implement → lint+typecheck → changelog → commit (no push) |
|
|
125
|
-
|
|
126
|
-
## Connection Details & Portability
|
|
127
|
-
|
|
128
|
-
The SQLite database path for `memory-journal-mcp` is entirely portable and **does not require code changes**.
|
|
129
|
-
|
|
130
|
-
The server initializes its database locations using **Smart Path Resolution**:
|
|
131
|
-
|
|
132
|
-
1. If `--db` or `DB_PATH` is passed explicitly, it is used immediately.
|
|
133
|
-
2. If `memory_journal.db` exists in the root directory, it is used.
|
|
134
|
-
3. If `test-server/test-memory-journal.db` exists, it falls back to this test database automatically.
|
|
135
|
-
4. If neither exist, it creates a new `memory_journal.db` in the root.
|
|
136
|
-
|
|
137
|
-
_(The identical fallback pattern applies to `--team-db` / `TEAM_DB_PATH` / `test-team-journal.db`)_.
|
|
138
|
-
|
|
139
|
-
### Automated Test Artifacts
|
|
140
|
-
|
|
141
|
-
When you run automated testing (e.g., `npm run test:e2e` or `vitest`), the test suites generate isolated database artifacts into the `.test-output/` directory (gitignored):
|
|
142
|
-
|
|
143
|
-
- `.test-output/e2e/test-e2e.db`
|
|
144
|
-
- `.test-output/e2e/test-e2e-auth.db`
|
|
145
|
-
- `.test-output/e2e/test-e2e-stateless.db`
|
|
146
|
-
- `.test-output/e2e/test-isolation-dir/`
|
|
147
|
-
|
|
148
|
-
**You do NOT need to maintain a copy of your real journal database here.** The test prompts and automated suites are designed for "from-scratch" database workflows.
|
|
149
|
-
|
|
150
|
-
## Agent Workflow
|
|
151
|
-
|
|
152
|
-
1. Read the server instructions you received during initialization, then `memory://briefing`.
|
|
153
|
-
2. Read `test-tools.md` for Pass 1 protocol, phases, and success criteria.
|
|
154
|
-
3. Execute via direct MCP tool calls. Run both happy-path and 🔴 error-path tests.
|
|
155
|
-
4. **Run integration test scripts** for Phase 1.3 (instruction levels, annotations), Phase 8 (prompts), and Phase 9 (scheduler).
|
|
156
|
-
5. Provide manual cleanup (e.g., deleting test nodes) if testing stateful behavior.
|
|
157
|
-
6. Report findings returning proper handler formatting.
|
|
158
|
-
7. (Optional) Run Pass 1b from `test-tools-team.md` for team collaboration testing.
|
|
159
|
-
8. (Optional) Run Pass 2 from `test-tools2.md` after Pass 1 completes successfully.
|
|
160
|
-
9. (Optional) Run Pass 3 from `test-tools-codemode.md` for Code Mode sandbox testing.
|
|
161
|
-
10. (Optional) Run Pass 4 from `test-tools-codemode2.md` for advanced Code Mode scenarios.
|
|
162
|
-
|
|
163
|
-
## Troubleshooting
|
|
164
|
-
|
|
165
|
-
### SQLite database locked
|
|
166
|
-
|
|
167
|
-
The `memory-journal-mcp` uses `better-sqlite3` (native SQLite) in WAL mode. Lock errors are uncommon but can occur if multiple processes access the same `.db` file:
|
|
168
|
-
|
|
169
|
-
1. Stop all MCP server instances accessing the database
|
|
170
|
-
2. Delete any `*.db-journal` or `*.db-wal` files alongside the database
|
|
171
|
-
3. Restart a single server instance
|
|
172
|
-
|
|
173
|
-
### GitHub tools return "Could not auto-detect repository"
|
|
174
|
-
|
|
175
|
-
1. Verify `GITHUB_REPO_PATH` is set in `mcp_config.json` env
|
|
176
|
-
2. Verify the path points to a directory with a `.git` folder and a valid `origin` remote
|
|
177
|
-
3. Alternatively, pass `owner` and `repo` parameters explicitly in tool calls
|
|
178
|
-
|
|
179
|
-
### GitHub tools return 401/403
|
|
180
|
-
|
|
181
|
-
1. Verify `GITHUB_TOKEN` is set and not expired
|
|
182
|
-
2. Required scopes: `repo`, `project`, `read:org` (for org-level project discovery)
|
|
183
|
-
3. For traffic/insights data, the token needs push access to the repository
|
|
184
|
-
|
|
185
|
-
### Vector search returns no results
|
|
186
|
-
|
|
187
|
-
1. Run `rebuild_vector_index` to re-index all entries
|
|
188
|
-
2. Check `get_vector_index_stats` — if `itemCount: 0`, the index is empty
|
|
189
|
-
3. The first index build triggers ML model download (~30MB) — verify network access
|
|
190
|
-
|
|
191
|
-
### Team tools return "Team database not configured"
|
|
192
|
-
|
|
193
|
-
Set `TEAM_DB_PATH` in `mcp_config.json` env or via `--team-db` CLI flag. The path can be any writable location.
|