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
package/src/utils/mcp-logger.ts
DELETED
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Memory Journal MCP Server - MCP Protocol Logger
|
|
3
|
-
*
|
|
4
|
-
* Logging that sends structured messages via MCP notifications/message.
|
|
5
|
-
* Falls back to stderr when MCP server is not connected.
|
|
6
|
-
* Follows RFC 5424 severity levels as per MCP spec.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* MCP log levels per RFC 5424
|
|
13
|
-
*/
|
|
14
|
-
export type McpLogLevel =
|
|
15
|
-
| 'debug'
|
|
16
|
-
| 'info'
|
|
17
|
-
| 'notice'
|
|
18
|
-
| 'warning'
|
|
19
|
-
| 'error'
|
|
20
|
-
| 'critical'
|
|
21
|
-
| 'alert'
|
|
22
|
-
| 'emergency'
|
|
23
|
-
|
|
24
|
-
const LOG_LEVEL_PRIORITY: Record<McpLogLevel, number> = {
|
|
25
|
-
emergency: 0,
|
|
26
|
-
alert: 1,
|
|
27
|
-
critical: 2,
|
|
28
|
-
error: 3,
|
|
29
|
-
warning: 4,
|
|
30
|
-
notice: 5,
|
|
31
|
-
info: 6,
|
|
32
|
-
debug: 7,
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
interface LogData {
|
|
36
|
-
message: string
|
|
37
|
-
module?: string
|
|
38
|
-
operation?: string
|
|
39
|
-
[key: string]: unknown
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* MCP Protocol Logger
|
|
44
|
-
*
|
|
45
|
-
* Sends structured log messages via MCP notifications/message protocol.
|
|
46
|
-
* Falls back to stderr when server not connected.
|
|
47
|
-
*/
|
|
48
|
-
export class McpLogger {
|
|
49
|
-
private server: McpServer | null = null
|
|
50
|
-
private minLevel: McpLogLevel = 'info'
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Connect to MCP server for protocol logging
|
|
54
|
-
*/
|
|
55
|
-
setServer(server: McpServer): void {
|
|
56
|
-
this.server = server
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Set minimum log level (from logging/setLevel request)
|
|
61
|
-
*/
|
|
62
|
-
setLevel(level: McpLogLevel): void {
|
|
63
|
-
if (level in LOG_LEVEL_PRIORITY) {
|
|
64
|
-
this.minLevel = level
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Get current minimum log level
|
|
70
|
-
*/
|
|
71
|
-
getLevel(): McpLogLevel {
|
|
72
|
-
return this.minLevel
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Check if a level should be logged
|
|
77
|
-
*/
|
|
78
|
-
private shouldLog(level: McpLogLevel): boolean {
|
|
79
|
-
return LOG_LEVEL_PRIORITY[level] <= LOG_LEVEL_PRIORITY[this.minLevel]
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* Format message for stderr fallback
|
|
84
|
-
*/
|
|
85
|
-
private formatForStderr(level: McpLogLevel, loggerName: string, data: LogData): string {
|
|
86
|
-
const timestamp = new Date().toISOString()
|
|
87
|
-
const levelUpper = level.toUpperCase().padEnd(9)
|
|
88
|
-
const module = loggerName ? `[${loggerName}]` : ''
|
|
89
|
-
|
|
90
|
-
let formatted = `[${timestamp}] [${levelUpper}] ${module} ${data.message}`
|
|
91
|
-
|
|
92
|
-
// Add extra context (filter out message and module)
|
|
93
|
-
const extras = Object.fromEntries(
|
|
94
|
-
Object.entries(data).filter(([key]) => key !== 'message' && key !== 'module')
|
|
95
|
-
)
|
|
96
|
-
|
|
97
|
-
if (Object.keys(extras).length > 0) {
|
|
98
|
-
formatted += ` ${JSON.stringify(extras)}`
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
return formatted
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Send log message via MCP protocol or fallback to stderr
|
|
106
|
-
*/
|
|
107
|
-
log(level: McpLogLevel, loggerName: string, data: LogData): void {
|
|
108
|
-
if (!this.shouldLog(level)) return
|
|
109
|
-
|
|
110
|
-
// Send via MCP protocol if server connected
|
|
111
|
-
if (this.server) {
|
|
112
|
-
try {
|
|
113
|
-
void this.server.sendLoggingMessage({
|
|
114
|
-
level,
|
|
115
|
-
logger: loggerName,
|
|
116
|
-
data,
|
|
117
|
-
})
|
|
118
|
-
} catch {
|
|
119
|
-
// Fallback to stderr if MCP send fails
|
|
120
|
-
console.error(this.formatForStderr(level, loggerName, data))
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// Always also log to stderr for local debugging
|
|
125
|
-
console.error(this.formatForStderr(level, loggerName, data))
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
// Convenience methods
|
|
129
|
-
debug(loggerName: string, message: string, context?: Record<string, unknown>): void {
|
|
130
|
-
this.log('debug', loggerName, { message, ...context })
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
info(loggerName: string, message: string, context?: Record<string, unknown>): void {
|
|
134
|
-
this.log('info', loggerName, { message, ...context })
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
notice(loggerName: string, message: string, context?: Record<string, unknown>): void {
|
|
138
|
-
this.log('notice', loggerName, { message, ...context })
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
warning(loggerName: string, message: string, context?: Record<string, unknown>): void {
|
|
142
|
-
this.log('warning', loggerName, { message, ...context })
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
error(loggerName: string, message: string, context?: Record<string, unknown>): void {
|
|
146
|
-
this.log('error', loggerName, { message, ...context })
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
critical(loggerName: string, message: string, context?: Record<string, unknown>): void {
|
|
150
|
-
this.log('critical', loggerName, { message, ...context })
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
// Singleton instance
|
|
155
|
-
export const mcpLogger = new McpLogger()
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Memory Journal MCP Server - Progress Notification Utilities
|
|
3
|
-
*
|
|
4
|
-
* Utilities for sending MCP progress notifications during long-running operations.
|
|
5
|
-
* Follows MCP 2025-11-25 specification for notifications/progress.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Minimal interface for sending MCP notifications.
|
|
10
|
-
* Uses structural typing to avoid importing the deprecated Server class.
|
|
11
|
-
*/
|
|
12
|
-
interface NotificationSender {
|
|
13
|
-
notification(notification: {
|
|
14
|
-
method: 'notifications/progress'
|
|
15
|
-
params: {
|
|
16
|
-
progressToken: string | number
|
|
17
|
-
progress: number
|
|
18
|
-
total?: number
|
|
19
|
-
message?: string
|
|
20
|
-
}
|
|
21
|
-
}): Promise<void>
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/** Progress token from client request _meta */
|
|
25
|
-
export type ProgressToken = string | number
|
|
26
|
-
|
|
27
|
-
/** Context required to send progress notifications */
|
|
28
|
-
export interface ProgressContext {
|
|
29
|
-
/** Object with notification method for sending progress updates */
|
|
30
|
-
server: NotificationSender
|
|
31
|
-
/** Progress token from request _meta (if client requested progress) */
|
|
32
|
-
progressToken?: ProgressToken
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Send a progress notification to the client.
|
|
37
|
-
*
|
|
38
|
-
* Only sends if a progressToken was provided in the original request.
|
|
39
|
-
* Silently no-ops if no token was provided.
|
|
40
|
-
*
|
|
41
|
-
* @param ctx - Progress context with server and optional token
|
|
42
|
-
* @param progress - Current progress value (e.g., items processed)
|
|
43
|
-
* @param total - Optional total value for percentage calculation
|
|
44
|
-
* @param message - Optional human-readable status message
|
|
45
|
-
*/
|
|
46
|
-
export async function sendProgress(
|
|
47
|
-
ctx: ProgressContext | undefined,
|
|
48
|
-
progress: number,
|
|
49
|
-
total?: number,
|
|
50
|
-
message?: string
|
|
51
|
-
): Promise<void> {
|
|
52
|
-
// Early return if no context, no progressToken, or no server
|
|
53
|
-
if (ctx === undefined) return
|
|
54
|
-
if (ctx.progressToken === undefined) return
|
|
55
|
-
|
|
56
|
-
try {
|
|
57
|
-
// Use the underlying Protocol's notification method
|
|
58
|
-
// The server extends Protocol which has notification() method
|
|
59
|
-
const notification = {
|
|
60
|
-
method: 'notifications/progress' as const,
|
|
61
|
-
params: {
|
|
62
|
-
progressToken: ctx.progressToken,
|
|
63
|
-
progress,
|
|
64
|
-
...(total !== undefined && { total }),
|
|
65
|
-
...(message !== undefined && message !== '' && { message }),
|
|
66
|
-
},
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// Access the notification sender through the server's protocol
|
|
70
|
-
// The Server class exposes notification() which we need to call directly
|
|
71
|
-
await ctx.server.notification(notification)
|
|
72
|
-
} catch {
|
|
73
|
-
// Non-critical: progress notifications are best-effort
|
|
74
|
-
// Don't let notification failures break the operation
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Create a progress reporter function for batch operations.
|
|
80
|
-
*
|
|
81
|
-
* @param ctx - Progress context
|
|
82
|
-
* @param total - Total number of items to process
|
|
83
|
-
* @param throttle - Report every N items (default: 10)
|
|
84
|
-
* @returns Async function to call on each item processed
|
|
85
|
-
*/
|
|
86
|
-
export function createBatchProgressReporter(
|
|
87
|
-
ctx: ProgressContext | undefined,
|
|
88
|
-
total: number,
|
|
89
|
-
throttle = 10
|
|
90
|
-
): (current: number, message?: string) => Promise<void> {
|
|
91
|
-
let lastReported = 0
|
|
92
|
-
|
|
93
|
-
return async (current: number, message?: string) => {
|
|
94
|
-
// Report progress at throttle intervals or at completion
|
|
95
|
-
if (current - lastReported >= throttle || current === total) {
|
|
96
|
-
await sendProgress(ctx, current, total, message)
|
|
97
|
-
lastReported = current
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
}
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Query Helpers — Input Coercion Utilities
|
|
3
|
-
*
|
|
4
|
-
* Standard coercion helpers that safely convert MCP SDK inputs (which may
|
|
5
|
-
* arrive as strings due to JSON serialization) into their expected types.
|
|
6
|
-
*
|
|
7
|
-
* Used with `z.preprocess()` to ensure bad input reaches the handler's
|
|
8
|
-
* try/catch instead of causing raw -32602 protocol errors.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
// =============================================================================
|
|
12
|
-
// Constants
|
|
13
|
-
// =============================================================================
|
|
14
|
-
|
|
15
|
-
/** Default number of rows returned by query tools */
|
|
16
|
-
export const DEFAULT_QUERY_LIMIT = 100
|
|
17
|
-
|
|
18
|
-
// =============================================================================
|
|
19
|
-
// Coercion Functions
|
|
20
|
-
// =============================================================================
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Coerce a value to a number. Returns `undefined` for non-numeric input
|
|
24
|
-
* so Zod treats it as "not provided" instead of producing NaN.
|
|
25
|
-
*
|
|
26
|
-
* Usage: `z.preprocess(coerceNumber, z.number().optional())`
|
|
27
|
-
*/
|
|
28
|
-
export function coerceNumber(val: unknown): unknown {
|
|
29
|
-
if (typeof val === 'number') return val
|
|
30
|
-
if (typeof val === 'string') {
|
|
31
|
-
const n = Number(val)
|
|
32
|
-
return Number.isNaN(n) ? undefined : n
|
|
33
|
-
}
|
|
34
|
-
return undefined
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Coerce a value to a boolean. Handles string "true"/"false" from
|
|
39
|
-
* MCP SDK serialization.
|
|
40
|
-
*
|
|
41
|
-
* Usage: `z.preprocess(coerceBoolean, z.boolean().optional())`
|
|
42
|
-
*/
|
|
43
|
-
export function coerceBoolean(val: unknown): unknown {
|
|
44
|
-
if (typeof val === 'boolean') return val
|
|
45
|
-
if (val === 'true') return true
|
|
46
|
-
if (val === 'false') return false
|
|
47
|
-
return undefined
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Coerce a raw limit value to a usable number.
|
|
52
|
-
* - `undefined` → `defaultLimit`
|
|
53
|
-
* - `NaN` → `defaultLimit`
|
|
54
|
-
* - `0` → `null` (meaning "unlimited")
|
|
55
|
-
* - negative → `defaultLimit`
|
|
56
|
-
* - positive → the value itself
|
|
57
|
-
*
|
|
58
|
-
* Works with both `z.preprocess(coerceNumber, ...)` and `z.coerce.number()`
|
|
59
|
-
* outputs, safely handling NaN and undefined.
|
|
60
|
-
*/
|
|
61
|
-
export function coerceLimit(
|
|
62
|
-
raw: unknown,
|
|
63
|
-
defaultLimit: number = DEFAULT_QUERY_LIMIT
|
|
64
|
-
): number | null {
|
|
65
|
-
if (raw === undefined || raw === null) return defaultLimit
|
|
66
|
-
const num = Number(raw)
|
|
67
|
-
if (Number.isNaN(num)) return defaultLimit
|
|
68
|
-
if (num === 0) return null
|
|
69
|
-
return num > 0 ? num : defaultLimit
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Build a SQL LIMIT clause from a coerced limit value.
|
|
74
|
-
* `null` means "no limit" — returns an empty string.
|
|
75
|
-
*/
|
|
76
|
-
export function buildLimitClause(limitVal: number | null): string {
|
|
77
|
-
return limitVal !== null ? ` LIMIT ${String(limitVal)}` : ''
|
|
78
|
-
}
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Resource Annotation Presets
|
|
3
|
-
*
|
|
4
|
-
* Centralized annotation presets for MCP resources following
|
|
5
|
-
* MCP 2025-11-25 spec. Use these instead of inline annotation
|
|
6
|
-
* objects to ensure consistency across all resource definitions.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
// =============================================================================
|
|
10
|
-
// Preset Types
|
|
11
|
-
// =============================================================================
|
|
12
|
-
|
|
13
|
-
interface ResourceAnnotation {
|
|
14
|
-
audience?: ('user' | 'assistant')[]
|
|
15
|
-
priority?: number
|
|
16
|
-
autoRead?: boolean
|
|
17
|
-
sessionInit?: boolean
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
// =============================================================================
|
|
21
|
-
// Standard Presets
|
|
22
|
-
// =============================================================================
|
|
23
|
-
|
|
24
|
-
/** Critical state resources (health, schema, activity) — priority 0.9 */
|
|
25
|
-
export const HIGH_PRIORITY: ResourceAnnotation = {
|
|
26
|
-
priority: 0.9,
|
|
27
|
-
audience: ['user', 'assistant'],
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/** Analysis/monitoring resources (stats, indexes) — priority 0.6 */
|
|
31
|
-
export const MEDIUM_PRIORITY: ResourceAnnotation = {
|
|
32
|
-
priority: 0.6,
|
|
33
|
-
audience: ['user', 'assistant'],
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/** Supplementary resources (pool stats, extension status) — priority 0.4 */
|
|
37
|
-
export const LOW_PRIORITY: ResourceAnnotation = {
|
|
38
|
-
priority: 0.4,
|
|
39
|
-
audience: ['user', 'assistant'],
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/** Agent-only resources (capabilities, settings, instructions) — priority 0.5 */
|
|
43
|
-
export const ASSISTANT_FOCUSED: ResourceAnnotation = {
|
|
44
|
-
priority: 0.5,
|
|
45
|
-
audience: ['assistant'],
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// =============================================================================
|
|
49
|
-
// Helpers
|
|
50
|
-
// =============================================================================
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Create a custom-priority annotation, optionally extending a base preset.
|
|
54
|
-
*/
|
|
55
|
-
export function withPriority(
|
|
56
|
-
priority: number,
|
|
57
|
-
base: ResourceAnnotation = MEDIUM_PRIORITY
|
|
58
|
-
): ResourceAnnotation {
|
|
59
|
-
return { ...base, priority }
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Clone a base annotation with autoRead flag set.
|
|
64
|
-
* Useful for session-init resources that should be auto-read.
|
|
65
|
-
*/
|
|
66
|
-
export function withAutoRead(base: ResourceAnnotation = HIGH_PRIORITY): ResourceAnnotation {
|
|
67
|
-
return { ...base, autoRead: true }
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Clone a base annotation with sessionInit flag set.
|
|
72
|
-
*/
|
|
73
|
-
export function withSessionInit(base: ResourceAnnotation = HIGH_PRIORITY): ResourceAnnotation {
|
|
74
|
-
return { ...base, sessionInit: true }
|
|
75
|
-
}
|
|
@@ -1,198 +0,0 @@
|
|
|
1
|
-
import { execFileSync } from 'node:child_process'
|
|
2
|
-
import { MemoryJournalMcpError } from '../types/errors.js'
|
|
3
|
-
import { ErrorCategory } from '../types/error-types.js'
|
|
4
|
-
|
|
5
|
-
/** Timeout for shelling out to git commands (ms) */
|
|
6
|
-
const GIT_COMMAND_TIMEOUT_MS = 3000
|
|
7
|
-
|
|
8
|
-
// ============================================================================
|
|
9
|
-
// Typed Security Errors
|
|
10
|
-
// ============================================================================
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Base class for security-related errors.
|
|
14
|
-
* Extends MemoryJournalMcpError with VALIDATION category.
|
|
15
|
-
*/
|
|
16
|
-
export class SecurityError extends MemoryJournalMcpError {
|
|
17
|
-
constructor(message: string, code: string) {
|
|
18
|
-
super(message, code, ErrorCategory.VALIDATION, {
|
|
19
|
-
suggestion: 'Check input for security violations',
|
|
20
|
-
recoverable: false,
|
|
21
|
-
})
|
|
22
|
-
this.name = 'SecurityError'
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Thrown when an invalid date format pattern is detected
|
|
28
|
-
*/
|
|
29
|
-
export class InvalidDateFormatError extends SecurityError {
|
|
30
|
-
constructor(value: string) {
|
|
31
|
-
super(`Invalid date format pattern: '${value}'`, 'INVALID_DATE_FORMAT')
|
|
32
|
-
this.name = 'InvalidDateFormatError'
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Thrown when path traversal is detected in input
|
|
38
|
-
*/
|
|
39
|
-
export class PathTraversalError extends SecurityError {
|
|
40
|
-
constructor(path: string) {
|
|
41
|
-
super(`Path traversal detected: '${path}'`, 'PATH_TRAVERSAL')
|
|
42
|
-
this.name = 'PathTraversalError'
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
// ============================================================================
|
|
47
|
-
// Date Format Validation
|
|
48
|
-
// ============================================================================
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Whitelist of allowed strftime format patterns for SQLite.
|
|
52
|
-
* These are the only patterns allowed to be interpolated into SQL.
|
|
53
|
-
*/
|
|
54
|
-
const ALLOWED_DATE_FORMATS: Record<string, string> = {
|
|
55
|
-
day: '%Y-%m-%d',
|
|
56
|
-
week: '%Y-W%W',
|
|
57
|
-
month: '%Y-%m',
|
|
58
|
-
} as const
|
|
59
|
-
|
|
60
|
-
export type DateGroupBy = 'day' | 'week' | 'month'
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Validates and returns a safe strftime format pattern.
|
|
64
|
-
*
|
|
65
|
-
* @param groupBy - The grouping period ('day', 'week', or 'month')
|
|
66
|
-
* @returns The validated strftime format pattern
|
|
67
|
-
* @throws InvalidDateFormatError if the groupBy value is invalid
|
|
68
|
-
*
|
|
69
|
-
* @example
|
|
70
|
-
* ```typescript
|
|
71
|
-
* const format = validateDateFormatPattern('day') // Returns '%Y-%m-%d'
|
|
72
|
-
* const format = validateDateFormatPattern('invalid') // Throws InvalidDateFormatError
|
|
73
|
-
* ```
|
|
74
|
-
*/
|
|
75
|
-
export function validateDateFormatPattern(groupBy: string): string {
|
|
76
|
-
const format = ALLOWED_DATE_FORMATS[groupBy]
|
|
77
|
-
if (!format) {
|
|
78
|
-
throw new InvalidDateFormatError(groupBy)
|
|
79
|
-
}
|
|
80
|
-
return format
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// ============================================================================
|
|
84
|
-
// Search Query Sanitization
|
|
85
|
-
// ============================================================================
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Escapes special characters in LIKE patterns to prevent injection.
|
|
89
|
-
* SQLite LIKE uses % and _ as wildcards.
|
|
90
|
-
*
|
|
91
|
-
* @param query - The user-provided search query
|
|
92
|
-
* @returns Escaped query safe for use in LIKE patterns
|
|
93
|
-
*
|
|
94
|
-
* @example
|
|
95
|
-
* ```typescript
|
|
96
|
-
* sanitizeSearchQuery('100%') // Returns '100\\%'
|
|
97
|
-
* sanitizeSearchQuery('test_value') // Returns 'test\\_value'
|
|
98
|
-
* ```
|
|
99
|
-
*/
|
|
100
|
-
export function sanitizeSearchQuery(query: string): string {
|
|
101
|
-
// Escape backslashes first, then LIKE wildcards
|
|
102
|
-
return query.replace(/\\/g, '\\\\').replace(/%/g, '\\%').replace(/_/g, '\\_')
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
// ============================================================================
|
|
106
|
-
// Path Validation
|
|
107
|
-
// ============================================================================
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Validates that a filename does not contain path traversal characters.
|
|
111
|
-
*
|
|
112
|
-
* @param filename - The filename to validate
|
|
113
|
-
* @throws PathTraversalError if path traversal is detected
|
|
114
|
-
*/
|
|
115
|
-
export function assertNoPathTraversal(filename: string): void {
|
|
116
|
-
if (filename.includes('/') || filename.includes('\\') || filename.includes('..')) {
|
|
117
|
-
throw new PathTraversalError(filename)
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// ============================================================================
|
|
122
|
-
// Error Message Sanitization
|
|
123
|
-
// ============================================================================
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* Patterns that may contain sensitive tokens in error messages.
|
|
127
|
-
* Used to scrub error output before logging.
|
|
128
|
-
*/
|
|
129
|
-
const TOKEN_PATTERNS = [
|
|
130
|
-
// GitHub personal access tokens (classic and fine-grained)
|
|
131
|
-
/ghp_[A-Za-z0-9_]{36,}/g,
|
|
132
|
-
/github_pat_[A-Za-z0-9_]{82,}/g,
|
|
133
|
-
// Authorization headers in error dumps
|
|
134
|
-
/Authorization:\s*(?:token|Bearer)\s+\S+/gi,
|
|
135
|
-
// Generic Bearer tokens
|
|
136
|
-
/Bearer\s+[A-Za-z0-9._\-~+/]+=*/gi,
|
|
137
|
-
] as const
|
|
138
|
-
|
|
139
|
-
/**
|
|
140
|
-
* Sanitizes an error message by replacing any detected tokens with '[REDACTED]'.
|
|
141
|
-
* This is a defense-in-depth measure for error logging paths.
|
|
142
|
-
*
|
|
143
|
-
* @param message - The error message to sanitize
|
|
144
|
-
* @returns The sanitized message with tokens replaced
|
|
145
|
-
*/
|
|
146
|
-
export function sanitizeErrorForLogging(message: string): string {
|
|
147
|
-
let sanitized = message
|
|
148
|
-
for (const pattern of TOKEN_PATTERNS) {
|
|
149
|
-
// Reset lastIndex for global regex patterns
|
|
150
|
-
pattern.lastIndex = 0
|
|
151
|
-
sanitized = sanitized.replace(pattern, '[REDACTED]')
|
|
152
|
-
}
|
|
153
|
-
return sanitized
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
// ============================================================================
|
|
157
|
-
// Author Sanitization
|
|
158
|
-
// ============================================================================
|
|
159
|
-
|
|
160
|
-
/**
|
|
161
|
-
* Sanitize an author string: strip control characters and cap length.
|
|
162
|
-
* Prevents crafted git config or TEAM_AUTHOR values from injecting
|
|
163
|
-
* control characters into the database or JSON payloads.
|
|
164
|
-
*
|
|
165
|
-
* @param raw - The raw author string from git config or environment
|
|
166
|
-
* @returns Sanitized string with control characters removed and length capped at 100
|
|
167
|
-
*/
|
|
168
|
-
export function sanitizeAuthor(raw: string): string {
|
|
169
|
-
// eslint-disable-next-line no-control-regex
|
|
170
|
-
return raw.replace(/[\x00-\x1f\x7f]/g, '').slice(0, 100)
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// ============================================================================
|
|
174
|
-
// Author Resolution
|
|
175
|
-
// ============================================================================
|
|
176
|
-
|
|
177
|
-
/**
|
|
178
|
-
* Resolve the author name for team-shared entries.
|
|
179
|
-
* Priority: TEAM_AUTHOR env → git config user.name → 'unknown'
|
|
180
|
-
*
|
|
181
|
-
* Uses sanitizeAuthor() to strip control characters and cap length.
|
|
182
|
-
*/
|
|
183
|
-
export function resolveAuthor(): string {
|
|
184
|
-
const envAuthor = process.env['TEAM_AUTHOR']?.trim().replace(/"/g, '')
|
|
185
|
-
if (envAuthor) return sanitizeAuthor(envAuthor)
|
|
186
|
-
try {
|
|
187
|
-
const gitUser = execFileSync('git', ['config', 'user.name'], {
|
|
188
|
-
encoding: 'utf-8',
|
|
189
|
-
timeout: GIT_COMMAND_TIMEOUT_MS,
|
|
190
|
-
})
|
|
191
|
-
.trim()
|
|
192
|
-
.replace(/"/g, '')
|
|
193
|
-
if (gitUser) return sanitizeAuthor(gitUser)
|
|
194
|
-
} catch {
|
|
195
|
-
// Git not available
|
|
196
|
-
}
|
|
197
|
-
return 'unknown'
|
|
198
|
-
}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Vector Index Helpers
|
|
3
|
-
*
|
|
4
|
-
* Shared fire-and-forget vector indexing logic used by entry-creation
|
|
5
|
-
* handlers (create_entry, create_entry_minimal, restore_entry, etc.).
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import type { VectorSearchManager } from '../vector/vector-search-manager.js'
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Auto-index an entry to the vector store for semantic search.
|
|
12
|
-
* Non-critical — failures are silently ignored because the entry
|
|
13
|
-
* is already persisted in the database.
|
|
14
|
-
*/
|
|
15
|
-
export function autoIndexEntry(
|
|
16
|
-
vectorManager: VectorSearchManager | undefined,
|
|
17
|
-
entryId: number,
|
|
18
|
-
content: string
|
|
19
|
-
): void {
|
|
20
|
-
if (vectorManager === undefined) return
|
|
21
|
-
vectorManager.addEntry(entryId, content).catch(() => {
|
|
22
|
-
// Non-critical failure — entry already saved to DB
|
|
23
|
-
})
|
|
24
|
-
}
|