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,188 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
JournalEntry,
|
|
3
|
-
Tag,
|
|
4
|
-
Relationship,
|
|
5
|
-
EntryType,
|
|
6
|
-
RelationshipType,
|
|
7
|
-
ImportanceResult,
|
|
8
|
-
} from '../../types/index.js'
|
|
9
|
-
import type { CreateEntryInput } from './schema.js'
|
|
10
|
-
|
|
11
|
-
export interface QueryResult {
|
|
12
|
-
columns: string[]
|
|
13
|
-
values: unknown[][]
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Universal SQLite database connection interface.
|
|
18
|
-
* Business logic (EntriesManager, TagsManager) programs against this
|
|
19
|
-
* abstraction rather than the better-sqlite3 driver directly.
|
|
20
|
-
*/
|
|
21
|
-
export interface IDatabaseConnection {
|
|
22
|
-
/**
|
|
23
|
-
* Executes queries that return results (SELECT, PRAGMA)
|
|
24
|
-
* Must return the shape: { columns: string[], values: unknown[][] }[]
|
|
25
|
-
*/
|
|
26
|
-
exec(sql: string, params?: unknown[]): QueryResult[]
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Executes queries that modify data (INSERT, UPDATE, DELETE)
|
|
30
|
-
*/
|
|
31
|
-
run(sql: string, params?: unknown[]): void
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Prepares and executes startup operations
|
|
35
|
-
*/
|
|
36
|
-
initialize(): Promise<void>
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Explicit trigger to save database to disk (if applicable)
|
|
40
|
-
*/
|
|
41
|
-
scheduleSave(): void
|
|
42
|
-
flushSave(): void
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Closes the database connection safely
|
|
46
|
-
*/
|
|
47
|
-
close(): void
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Team schema initialization hook
|
|
51
|
-
*/
|
|
52
|
-
applyTeamSchema(): void
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Directory path access for backups
|
|
56
|
-
*/
|
|
57
|
-
getBackupsDir(): string
|
|
58
|
-
getDbPath(): string
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Provides the underlying better-sqlite3 Database instance.
|
|
62
|
-
* Note: Avoid using this in business logic to prevent driver-coupling
|
|
63
|
-
*/
|
|
64
|
-
getRawDb(): unknown
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Execute a PRAGMA command.
|
|
68
|
-
* Wraps the driver-specific pragma call so callers don't need getRawDb().
|
|
69
|
-
*/
|
|
70
|
-
pragma(command: string): void
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Internal mechanisms for backup/restore
|
|
74
|
-
*/
|
|
75
|
-
closeDbBeforeRestore(): void
|
|
76
|
-
setDbAndInitialized(db: unknown): void
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* The public facade representing the capabilities of any memory-journal DB adapter
|
|
81
|
-
*/
|
|
82
|
-
export interface IDatabaseAdapter {
|
|
83
|
-
initialize(): Promise<void>
|
|
84
|
-
applyTeamSchema(): void
|
|
85
|
-
flushSave(): void
|
|
86
|
-
close(): void
|
|
87
|
-
|
|
88
|
-
// Entries Manager
|
|
89
|
-
createEntry(input: CreateEntryInput): JournalEntry
|
|
90
|
-
getEntryById(id: number): JournalEntry | null
|
|
91
|
-
getEntryByIdIncludeDeleted(id: number): JournalEntry | null
|
|
92
|
-
getEntriesByIds(ids: number[]): Map<number, JournalEntry>
|
|
93
|
-
calculateImportance(entryId: number): ImportanceResult
|
|
94
|
-
getRecentEntries(limit?: number, isPersonal?: boolean): JournalEntry[]
|
|
95
|
-
getEntriesPage(offset: number, limit: number): JournalEntry[]
|
|
96
|
-
getActiveEntryCount(): number
|
|
97
|
-
updateEntry(
|
|
98
|
-
id: number,
|
|
99
|
-
updates: {
|
|
100
|
-
content?: string
|
|
101
|
-
entryType?: EntryType
|
|
102
|
-
tags?: string[]
|
|
103
|
-
isPersonal?: boolean
|
|
104
|
-
}
|
|
105
|
-
): JournalEntry | null
|
|
106
|
-
deleteEntry(id: number, permanent?: boolean): boolean
|
|
107
|
-
searchEntries(
|
|
108
|
-
query: string,
|
|
109
|
-
options?: {
|
|
110
|
-
limit?: number
|
|
111
|
-
isPersonal?: boolean
|
|
112
|
-
projectNumber?: number
|
|
113
|
-
issueNumber?: number
|
|
114
|
-
prNumber?: number
|
|
115
|
-
prStatus?: string
|
|
116
|
-
workflowRunId?: number
|
|
117
|
-
}
|
|
118
|
-
): JournalEntry[]
|
|
119
|
-
searchByDateRange(
|
|
120
|
-
startDate: string,
|
|
121
|
-
endDate: string,
|
|
122
|
-
options?: {
|
|
123
|
-
entryType?: EntryType
|
|
124
|
-
tags?: string[]
|
|
125
|
-
isPersonal?: boolean
|
|
126
|
-
projectNumber?: number
|
|
127
|
-
issueNumber?: number
|
|
128
|
-
prNumber?: number
|
|
129
|
-
workflowRunId?: number
|
|
130
|
-
limit?: number
|
|
131
|
-
}
|
|
132
|
-
): JournalEntry[]
|
|
133
|
-
getStatistics(
|
|
134
|
-
groupBy?: 'day' | 'week' | 'month' | 'year',
|
|
135
|
-
startDate?: string,
|
|
136
|
-
endDate?: string,
|
|
137
|
-
projectBreakdown?: boolean
|
|
138
|
-
): Record<string, unknown>
|
|
139
|
-
|
|
140
|
-
// Tags Manager
|
|
141
|
-
getTagsForEntry(entryId: number): string[]
|
|
142
|
-
listTags(): Tag[]
|
|
143
|
-
mergeTags(
|
|
144
|
-
sourceTag: string,
|
|
145
|
-
targetTag: string
|
|
146
|
-
): { entriesUpdated: number; sourceDeleted: boolean }
|
|
147
|
-
|
|
148
|
-
// Relationships Manager
|
|
149
|
-
linkEntries(
|
|
150
|
-
fromEntryId: number,
|
|
151
|
-
toEntryId: number,
|
|
152
|
-
relationshipType: RelationshipType,
|
|
153
|
-
description?: string
|
|
154
|
-
): Relationship
|
|
155
|
-
getRelationships(entryId: number): Relationship[]
|
|
156
|
-
|
|
157
|
-
// Backup Manager
|
|
158
|
-
getBackupsDir(): string
|
|
159
|
-
exportToFile(
|
|
160
|
-
backupName?: string
|
|
161
|
-
): Promise<{ filename: string; path: string; sizeBytes: number }>
|
|
162
|
-
listBackups(): { filename: string; path: string; sizeBytes: number; createdAt: string }[]
|
|
163
|
-
deleteOldBackups(keepCount: number): { deleted: string[]; kept: number }
|
|
164
|
-
restoreFromFile(filename: string): Promise<{
|
|
165
|
-
restoredFrom: string
|
|
166
|
-
previousEntryCount: number
|
|
167
|
-
newEntryCount: number
|
|
168
|
-
}>
|
|
169
|
-
getHealthStatus(): {
|
|
170
|
-
database: {
|
|
171
|
-
path: string
|
|
172
|
-
sizeBytes: number
|
|
173
|
-
entryCount: number
|
|
174
|
-
deletedEntryCount: number
|
|
175
|
-
relationshipCount: number
|
|
176
|
-
tagCount: number
|
|
177
|
-
}
|
|
178
|
-
backups: {
|
|
179
|
-
directory: string
|
|
180
|
-
count: number
|
|
181
|
-
lastBackup: { filename: string; createdAt: string; sizeBytes: number } | null
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
getRawDb(): unknown
|
|
186
|
-
pragma(command: string): void
|
|
187
|
-
executeRawQuery(sql: string, params?: unknown[]): QueryResult[]
|
|
188
|
-
}
|
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Memory Journal MCP Server - Database Schema
|
|
3
|
-
*
|
|
4
|
-
* SQL DDL for initialization and input types for the database adapter.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import type { EntryType, SignificanceType } from '../../types/index.js'
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* SQL schema for database initialization.
|
|
11
|
-
* Creates all tables and indexes if they don't already exist.
|
|
12
|
-
*/
|
|
13
|
-
export const SCHEMA_SQL = `
|
|
14
|
-
-- Main journal entries table
|
|
15
|
-
CREATE TABLE IF NOT EXISTS memory_journal (
|
|
16
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
17
|
-
entry_type TEXT NOT NULL,
|
|
18
|
-
content TEXT NOT NULL,
|
|
19
|
-
timestamp TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
20
|
-
is_personal INTEGER DEFAULT 1,
|
|
21
|
-
significance_type TEXT,
|
|
22
|
-
auto_context TEXT,
|
|
23
|
-
deleted_at TEXT,
|
|
24
|
-
-- GitHub integration fields
|
|
25
|
-
project_number INTEGER,
|
|
26
|
-
project_owner TEXT,
|
|
27
|
-
issue_number INTEGER,
|
|
28
|
-
issue_url TEXT,
|
|
29
|
-
pr_number INTEGER,
|
|
30
|
-
pr_url TEXT,
|
|
31
|
-
pr_status TEXT,
|
|
32
|
-
workflow_run_id INTEGER,
|
|
33
|
-
workflow_name TEXT,
|
|
34
|
-
workflow_status TEXT
|
|
35
|
-
);
|
|
36
|
-
|
|
37
|
-
-- Tags table
|
|
38
|
-
CREATE TABLE IF NOT EXISTS tags (
|
|
39
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
40
|
-
name TEXT UNIQUE NOT NULL,
|
|
41
|
-
usage_count INTEGER DEFAULT 0
|
|
42
|
-
);
|
|
43
|
-
|
|
44
|
-
-- Junction table for entry-tag relationships
|
|
45
|
-
CREATE TABLE IF NOT EXISTS entry_tags (
|
|
46
|
-
entry_id INTEGER NOT NULL,
|
|
47
|
-
tag_id INTEGER NOT NULL,
|
|
48
|
-
PRIMARY KEY (entry_id, tag_id),
|
|
49
|
-
FOREIGN KEY (entry_id) REFERENCES memory_journal(id) ON DELETE CASCADE,
|
|
50
|
-
FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE
|
|
51
|
-
);
|
|
52
|
-
|
|
53
|
-
-- Relationships between entries
|
|
54
|
-
CREATE TABLE IF NOT EXISTS relationships (
|
|
55
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
56
|
-
from_entry_id INTEGER NOT NULL,
|
|
57
|
-
to_entry_id INTEGER NOT NULL,
|
|
58
|
-
relationship_type TEXT NOT NULL,
|
|
59
|
-
description TEXT,
|
|
60
|
-
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
61
|
-
FOREIGN KEY (from_entry_id) REFERENCES memory_journal(id) ON DELETE CASCADE,
|
|
62
|
-
FOREIGN KEY (to_entry_id) REFERENCES memory_journal(id) ON DELETE CASCADE
|
|
63
|
-
);
|
|
64
|
-
|
|
65
|
-
-- Legacy embeddings table (active embeddings use sqlite-vec vec0 virtual table)
|
|
66
|
-
CREATE TABLE IF NOT EXISTS embeddings (
|
|
67
|
-
entry_id INTEGER PRIMARY KEY,
|
|
68
|
-
embedding TEXT NOT NULL,
|
|
69
|
-
model_name TEXT NOT NULL,
|
|
70
|
-
FOREIGN KEY (entry_id) REFERENCES memory_journal(id) ON DELETE CASCADE
|
|
71
|
-
);
|
|
72
|
-
|
|
73
|
-
-- Indexes for performance
|
|
74
|
-
CREATE INDEX IF NOT EXISTS idx_memory_journal_timestamp ON memory_journal(timestamp);
|
|
75
|
-
CREATE INDEX IF NOT EXISTS idx_memory_journal_type ON memory_journal(entry_type);
|
|
76
|
-
CREATE INDEX IF NOT EXISTS idx_memory_journal_personal ON memory_journal(is_personal);
|
|
77
|
-
CREATE INDEX IF NOT EXISTS idx_memory_journal_deleted ON memory_journal(deleted_at);
|
|
78
|
-
CREATE INDEX IF NOT EXISTS idx_memory_journal_project ON memory_journal(project_number);
|
|
79
|
-
CREATE INDEX IF NOT EXISTS idx_memory_journal_issue ON memory_journal(issue_number);
|
|
80
|
-
CREATE INDEX IF NOT EXISTS idx_memory_journal_pr ON memory_journal(pr_number);
|
|
81
|
-
CREATE INDEX IF NOT EXISTS idx_tags_name ON tags(name);
|
|
82
|
-
CREATE INDEX IF NOT EXISTS idx_entry_tags_entry ON entry_tags(entry_id);
|
|
83
|
-
CREATE INDEX IF NOT EXISTS idx_entry_tags_tag ON entry_tags(tag_id);
|
|
84
|
-
CREATE INDEX IF NOT EXISTS idx_relationships_from ON relationships(from_entry_id);
|
|
85
|
-
CREATE INDEX IF NOT EXISTS idx_relationships_to ON relationships(to_entry_id);
|
|
86
|
-
|
|
87
|
-
-- Composite covering index for getRecentEntries (WHERE deleted_at IS NULL ORDER BY timestamp DESC, id DESC)
|
|
88
|
-
CREATE INDEX IF NOT EXISTS idx_memory_journal_recent ON memory_journal(deleted_at, timestamp DESC, id DESC);
|
|
89
|
-
|
|
90
|
-
-- FTS5 full-text search index (content-sync: reads from source table, no duplicate storage)
|
|
91
|
-
CREATE VIRTUAL TABLE IF NOT EXISTS fts_content USING fts5(
|
|
92
|
-
content,
|
|
93
|
-
content=memory_journal,
|
|
94
|
-
content_rowid=id,
|
|
95
|
-
tokenize='porter unicode61'
|
|
96
|
-
);
|
|
97
|
-
|
|
98
|
-
-- Triggers to keep FTS5 index in sync with memory_journal
|
|
99
|
-
CREATE TRIGGER IF NOT EXISTS fts_content_ai AFTER INSERT ON memory_journal BEGIN
|
|
100
|
-
INSERT INTO fts_content(rowid, content) VALUES (new.id, new.content);
|
|
101
|
-
END;
|
|
102
|
-
|
|
103
|
-
CREATE TRIGGER IF NOT EXISTS fts_content_au AFTER UPDATE OF content ON memory_journal BEGIN
|
|
104
|
-
INSERT INTO fts_content(fts_content, rowid, content) VALUES ('delete', old.id, old.content);
|
|
105
|
-
INSERT INTO fts_content(rowid, content) VALUES (new.id, new.content);
|
|
106
|
-
END;
|
|
107
|
-
|
|
108
|
-
CREATE TRIGGER IF NOT EXISTS fts_content_ad AFTER DELETE ON memory_journal BEGIN
|
|
109
|
-
INSERT INTO fts_content(fts_content, rowid, content) VALUES ('delete', old.id, old.content);
|
|
110
|
-
END;
|
|
111
|
-
`
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
* Input for creating a new entry
|
|
115
|
-
*/
|
|
116
|
-
export interface CreateEntryInput {
|
|
117
|
-
content: string
|
|
118
|
-
entryType?: EntryType
|
|
119
|
-
tags?: string[]
|
|
120
|
-
isPersonal?: boolean
|
|
121
|
-
significanceType?: SignificanceType
|
|
122
|
-
autoContext?: string
|
|
123
|
-
/** Optional ISO 8601 timestamp override (defaults to current time) */
|
|
124
|
-
timestamp?: string
|
|
125
|
-
projectNumber?: number
|
|
126
|
-
projectOwner?: string
|
|
127
|
-
issueNumber?: number
|
|
128
|
-
issueUrl?: string
|
|
129
|
-
prNumber?: number
|
|
130
|
-
prUrl?: string
|
|
131
|
-
prStatus?: 'draft' | 'open' | 'merged' | 'closed'
|
|
132
|
-
workflowRunId?: number
|
|
133
|
-
workflowName?: string
|
|
134
|
-
workflowStatus?: 'queued' | 'in_progress' | 'completed'
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
/**
|
|
138
|
-
* SQL migration to add the author column for team databases.
|
|
139
|
-
* Applied after SCHEMA_SQL when initializing a team database.
|
|
140
|
-
*/
|
|
141
|
-
export const TEAM_SCHEMA_SQL = `
|
|
142
|
-
-- Author column for team entries (identifies who shared the entry)
|
|
143
|
-
ALTER TABLE memory_journal ADD COLUMN author TEXT;
|
|
144
|
-
`
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Input for creating a team entry (extends standard entry with author)
|
|
148
|
-
*/
|
|
149
|
-
export interface CreateTeamEntryInput extends CreateEntryInput {
|
|
150
|
-
/** Author name (auto-detected from git config or TEAM_AUTHOR env) */
|
|
151
|
-
author?: string
|
|
152
|
-
}
|
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
import * as fs from 'node:fs'
|
|
2
|
-
import * as path from 'node:path'
|
|
3
|
-
import { logger } from '../../utils/logger.js'
|
|
4
|
-
import { assertNoPathTraversal } from '../../utils/security-utils.js'
|
|
5
|
-
import { ResourceNotFoundError, ValidationError } from '../../types/errors.js'
|
|
6
|
-
import type { IDatabaseConnection } from '../core/interfaces.js'
|
|
7
|
-
|
|
8
|
-
/** Maximum length for user-supplied backup names after sanitization */
|
|
9
|
-
const MAX_BACKUP_NAME_LENGTH = 50
|
|
10
|
-
|
|
11
|
-
export class BackupManager {
|
|
12
|
-
constructor(private ctx: IDatabaseConnection) {}
|
|
13
|
-
|
|
14
|
-
async exportToFile(
|
|
15
|
-
backupName?: string
|
|
16
|
-
): Promise<{ filename: string; path: string; sizeBytes: number }> {
|
|
17
|
-
const backupsDir = this.ctx.getBackupsDir()
|
|
18
|
-
|
|
19
|
-
if (backupName) {
|
|
20
|
-
assertNoPathTraversal(backupName)
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
if (!fs.existsSync(backupsDir)) {
|
|
24
|
-
await fs.promises.mkdir(backupsDir, { recursive: true })
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const timestamp = new Date().toISOString().replace(/[:.]/g, '-')
|
|
28
|
-
const sanitizedName = backupName
|
|
29
|
-
? backupName.replace(/[/\\:*?"<>|]/g, '_').slice(0, MAX_BACKUP_NAME_LENGTH)
|
|
30
|
-
: `backup_${timestamp}`
|
|
31
|
-
const filename = `${sanitizedName}.db`
|
|
32
|
-
const backupPath = path.join(backupsDir, filename)
|
|
33
|
-
|
|
34
|
-
try {
|
|
35
|
-
this.ctx.pragma('wal_checkpoint(TRUNCATE)')
|
|
36
|
-
} catch (checkpointErr) {
|
|
37
|
-
logger.debug('WAL checkpoint skipped', {
|
|
38
|
-
module: 'SqliteAdapter',
|
|
39
|
-
operation: 'exportToFile',
|
|
40
|
-
error:
|
|
41
|
-
checkpointErr instanceof Error ? checkpointErr.message : String(checkpointErr),
|
|
42
|
-
})
|
|
43
|
-
}
|
|
44
|
-
await fs.promises.copyFile(this.ctx.getDbPath(), backupPath)
|
|
45
|
-
|
|
46
|
-
const stats = await fs.promises.stat(backupPath)
|
|
47
|
-
|
|
48
|
-
logger.info('Backup created', {
|
|
49
|
-
module: 'SqliteAdapter',
|
|
50
|
-
operation: 'exportToFile',
|
|
51
|
-
context: { backupPath, sizeBytes: stats.size },
|
|
52
|
-
})
|
|
53
|
-
|
|
54
|
-
return { filename, path: backupPath, sizeBytes: stats.size }
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
listBackups(): { filename: string; path: string; sizeBytes: number; createdAt: string }[] {
|
|
58
|
-
const backupsDir = this.ctx.getBackupsDir()
|
|
59
|
-
|
|
60
|
-
if (!fs.existsSync(backupsDir)) {
|
|
61
|
-
return []
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
const files = fs.readdirSync(backupsDir)
|
|
65
|
-
const backups: { filename: string; path: string; sizeBytes: number; createdAt: string }[] =
|
|
66
|
-
[]
|
|
67
|
-
|
|
68
|
-
for (const filename of files) {
|
|
69
|
-
if (!filename.endsWith('.db')) continue
|
|
70
|
-
|
|
71
|
-
const filePath = path.join(backupsDir, filename)
|
|
72
|
-
try {
|
|
73
|
-
const stats = fs.statSync(filePath)
|
|
74
|
-
if (stats.isFile()) {
|
|
75
|
-
backups.push({
|
|
76
|
-
filename,
|
|
77
|
-
path: filePath,
|
|
78
|
-
sizeBytes: stats.size,
|
|
79
|
-
createdAt: stats.birthtime.toISOString(),
|
|
80
|
-
})
|
|
81
|
-
}
|
|
82
|
-
} catch {
|
|
83
|
-
// Skip files that can't be read
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
backups.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime())
|
|
88
|
-
return backups
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
deleteOldBackups(keepCount: number): { deleted: string[]; kept: number } {
|
|
92
|
-
const backups = this.listBackups()
|
|
93
|
-
|
|
94
|
-
if (keepCount < 1 || Number.isNaN(keepCount)) {
|
|
95
|
-
throw new ValidationError('keepCount must be at least 1')
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
const toKeep = backups.slice(0, keepCount)
|
|
99
|
-
const toDelete = backups.slice(keepCount)
|
|
100
|
-
const deleted: string[] = []
|
|
101
|
-
|
|
102
|
-
for (const backup of toDelete) {
|
|
103
|
-
try {
|
|
104
|
-
fs.unlinkSync(backup.path)
|
|
105
|
-
deleted.push(backup.filename)
|
|
106
|
-
} catch {
|
|
107
|
-
// Skip files that can't be deleted
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
logger.info('Old backups cleaned up', {
|
|
112
|
-
module: 'SqliteAdapter',
|
|
113
|
-
operation: 'deleteOldBackups',
|
|
114
|
-
context: { kept: toKeep.length, deleted: deleted.length },
|
|
115
|
-
})
|
|
116
|
-
|
|
117
|
-
return { deleted, kept: toKeep.length }
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
async restoreFromFile(filename: string): Promise<{
|
|
121
|
-
restoredFrom: string
|
|
122
|
-
previousEntryCount: number
|
|
123
|
-
newEntryCount: number
|
|
124
|
-
}> {
|
|
125
|
-
assertNoPathTraversal(filename)
|
|
126
|
-
|
|
127
|
-
const backupsDir = this.ctx.getBackupsDir()
|
|
128
|
-
const backupPath = path.join(backupsDir, filename)
|
|
129
|
-
|
|
130
|
-
if (!fs.existsSync(backupPath)) {
|
|
131
|
-
throw new ResourceNotFoundError('Backup', filename)
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
const currentCountResult = this.ctx.exec(
|
|
135
|
-
'SELECT COUNT(*) FROM memory_journal WHERE deleted_at IS NULL'
|
|
136
|
-
)
|
|
137
|
-
const previousEntryCount = (currentCountResult[0]?.values[0]?.[0] as number) ?? 0
|
|
138
|
-
|
|
139
|
-
await this.exportToFile(`pre_restore_${new Date().toISOString().replace(/[:.]/g, '-')}`)
|
|
140
|
-
|
|
141
|
-
// Close old DB via manager
|
|
142
|
-
this.ctx.closeDbBeforeRestore()
|
|
143
|
-
|
|
144
|
-
// Native better-sqlite3 connection
|
|
145
|
-
await fs.promises.copyFile(backupPath, this.ctx.getDbPath())
|
|
146
|
-
|
|
147
|
-
// Re-initialize the native connection via dynamic import to avoid static dependency
|
|
148
|
-
const DatabaseAdapter = (await import('better-sqlite3').then((m) => m.default)) as new (
|
|
149
|
-
path: string
|
|
150
|
-
) => unknown
|
|
151
|
-
const newDb = new DatabaseAdapter(this.ctx.getDbPath())
|
|
152
|
-
this.ctx.setDbAndInitialized(newDb)
|
|
153
|
-
|
|
154
|
-
const newCountResult = this.ctx.exec(
|
|
155
|
-
'SELECT COUNT(*) FROM memory_journal WHERE deleted_at IS NULL'
|
|
156
|
-
)
|
|
157
|
-
const newEntryCount = (newCountResult[0]?.values[0]?.[0] as number) ?? 0
|
|
158
|
-
|
|
159
|
-
logger.info('Database restored from backup', {
|
|
160
|
-
module: 'SqliteAdapter',
|
|
161
|
-
operation: 'restoreFromFile',
|
|
162
|
-
context: { backupPath, previousEntryCount, newEntryCount },
|
|
163
|
-
})
|
|
164
|
-
|
|
165
|
-
return { restoredFrom: filename, previousEntryCount, newEntryCount }
|
|
166
|
-
}
|
|
167
|
-
}
|