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,182 +0,0 @@
|
|
|
1
|
-
import type { Database } from 'better-sqlite3'
|
|
2
|
-
import { logger } from '../../utils/logger.js'
|
|
3
|
-
import { ResourceNotFoundError, QueryError } from '../../types/errors.js'
|
|
4
|
-
import type { Tag } from '../../types/index.js'
|
|
5
|
-
import type { NativeConnectionManager } from './native-connection.js'
|
|
6
|
-
|
|
7
|
-
export class TagsManager {
|
|
8
|
-
private ctx: NativeConnectionManager
|
|
9
|
-
|
|
10
|
-
constructor(ctx: NativeConnectionManager) {
|
|
11
|
-
this.ctx = ctx
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
private get db(): Database {
|
|
15
|
-
return this.ctx.getRawDb() as Database
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
linkTagsToEntry(entryId: number, tagNames: string[]): void {
|
|
19
|
-
if (tagNames.length === 0) return
|
|
20
|
-
const db = this.db
|
|
21
|
-
|
|
22
|
-
const insertPlaceholders = tagNames.map(() => '(?, 0)').join(', ')
|
|
23
|
-
db.prepare(
|
|
24
|
-
`INSERT OR IGNORE INTO tags (name, usage_count) VALUES ${insertPlaceholders}`
|
|
25
|
-
).run(...tagNames)
|
|
26
|
-
|
|
27
|
-
const selectPlaceholders = tagNames.map(() => '?').join(', ')
|
|
28
|
-
const rows = db
|
|
29
|
-
.prepare(`SELECT id, name FROM tags WHERE name IN (${selectPlaceholders})`)
|
|
30
|
-
.all(...tagNames) as { id: number; name: string }[]
|
|
31
|
-
|
|
32
|
-
const tagIds = rows.map((r) => r.id)
|
|
33
|
-
if (tagIds.length === 0) return
|
|
34
|
-
|
|
35
|
-
const linkPlaceholders = tagIds.map(() => '(?, ?)').join(', ')
|
|
36
|
-
const linkParams = tagIds.flatMap((tagId) => [entryId, tagId])
|
|
37
|
-
db.prepare(
|
|
38
|
-
`INSERT OR IGNORE INTO entry_tags (entry_id, tag_id) VALUES ${linkPlaceholders}`
|
|
39
|
-
).run(...linkParams)
|
|
40
|
-
|
|
41
|
-
const updatePlaceholders = tagIds.map(() => '?').join(', ')
|
|
42
|
-
db.prepare(
|
|
43
|
-
`UPDATE tags
|
|
44
|
-
SET usage_count = (
|
|
45
|
-
SELECT COUNT(*)
|
|
46
|
-
FROM entry_tags et
|
|
47
|
-
WHERE et.tag_id = tags.id
|
|
48
|
-
)
|
|
49
|
-
WHERE id IN (${updatePlaceholders})`
|
|
50
|
-
).run(...tagIds)
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
getTagsForEntry(entryId: number): string[] {
|
|
54
|
-
const rows = this.db
|
|
55
|
-
.prepare(
|
|
56
|
-
`SELECT t.name FROM tags t
|
|
57
|
-
JOIN entry_tags et ON t.id = et.tag_id
|
|
58
|
-
WHERE et.entry_id = ?`
|
|
59
|
-
)
|
|
60
|
-
.all(entryId) as { name: string }[]
|
|
61
|
-
|
|
62
|
-
return rows.map((r) => r.name)
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
batchGetTagsForEntries(ids: number[]): Map<number, string[]> {
|
|
66
|
-
const tagMap = new Map<number, string[]>()
|
|
67
|
-
if (ids.length === 0) return tagMap
|
|
68
|
-
|
|
69
|
-
const placeholders = ids.map(() => '?').join(', ')
|
|
70
|
-
const rows = this.db
|
|
71
|
-
.prepare(
|
|
72
|
-
`SELECT et.entry_id, t.name
|
|
73
|
-
FROM entry_tags et
|
|
74
|
-
JOIN tags t ON et.tag_id = t.id
|
|
75
|
-
WHERE et.entry_id IN (${placeholders})`
|
|
76
|
-
)
|
|
77
|
-
.all(...ids) as { entry_id: number; name: string }[]
|
|
78
|
-
|
|
79
|
-
for (const row of rows) {
|
|
80
|
-
const existing = tagMap.get(row.entry_id)
|
|
81
|
-
if (existing) {
|
|
82
|
-
existing.push(row.name)
|
|
83
|
-
} else {
|
|
84
|
-
tagMap.set(row.entry_id, [row.name])
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
return tagMap
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
listTags(): Tag[] {
|
|
91
|
-
const rows = this.db
|
|
92
|
-
.prepare(
|
|
93
|
-
'SELECT id, name, COALESCE(usage_count, 0) as usage_count FROM tags WHERE COALESCE(usage_count, 0) > 0 ORDER BY usage_count DESC'
|
|
94
|
-
)
|
|
95
|
-
.all() as { id: number; name: string; usage_count: number }[]
|
|
96
|
-
|
|
97
|
-
return rows.map((r) => ({ id: r.id, name: r.name, usageCount: r.usage_count }))
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
mergeTags(
|
|
101
|
-
sourceTag: string,
|
|
102
|
-
targetTag: string
|
|
103
|
-
): { entriesUpdated: number; sourceDeleted: boolean } {
|
|
104
|
-
const db = this.db
|
|
105
|
-
|
|
106
|
-
const mergeOp = db.transaction(() => {
|
|
107
|
-
const sourceRow = db.prepare('SELECT id FROM tags WHERE name = ?').get(sourceTag) as
|
|
108
|
-
| { id: number }
|
|
109
|
-
| undefined
|
|
110
|
-
if (!sourceRow) throw new ResourceNotFoundError('Tag', sourceTag)
|
|
111
|
-
const sourceTagId = sourceRow.id
|
|
112
|
-
|
|
113
|
-
db.prepare('INSERT OR IGNORE INTO tags (name, usage_count) VALUES (?, 0)').run(
|
|
114
|
-
targetTag
|
|
115
|
-
)
|
|
116
|
-
const targetRow = db.prepare('SELECT id FROM tags WHERE name = ?').get(targetTag) as
|
|
117
|
-
| { id: number }
|
|
118
|
-
| undefined
|
|
119
|
-
if (!targetRow) throw new QueryError(`Failed to get or create target tag: ${targetTag}`)
|
|
120
|
-
const targetTagId = targetRow.id
|
|
121
|
-
|
|
122
|
-
// Clean orphaned entry_tags (entries permanently deleted but links remain)
|
|
123
|
-
db.prepare(
|
|
124
|
-
`DELETE FROM entry_tags WHERE tag_id = ? AND entry_id NOT IN (SELECT id FROM memory_journal)`
|
|
125
|
-
).run(sourceTagId)
|
|
126
|
-
db.prepare(
|
|
127
|
-
`DELETE FROM entry_tags WHERE tag_id = ? AND entry_id NOT IN (SELECT id FROM memory_journal)`
|
|
128
|
-
).run(targetTagId)
|
|
129
|
-
|
|
130
|
-
// Select only valid entries (join ensures no orphans)
|
|
131
|
-
const entryRows = db
|
|
132
|
-
.prepare(
|
|
133
|
-
`SELECT et.entry_id FROM entry_tags et
|
|
134
|
-
JOIN memory_journal mj ON et.entry_id = mj.id
|
|
135
|
-
WHERE et.tag_id = ?`
|
|
136
|
-
)
|
|
137
|
-
.all(sourceTagId) as { entry_id: number }[]
|
|
138
|
-
const entryIds = entryRows.map((r) => r.entry_id)
|
|
139
|
-
|
|
140
|
-
// Pre-fetch entries already linked to targetTag in one query (O(1) vs O(N))
|
|
141
|
-
const existingRows = db
|
|
142
|
-
.prepare('SELECT entry_id FROM entry_tags WHERE tag_id = ?')
|
|
143
|
-
.all(targetTagId) as { entry_id: number }[]
|
|
144
|
-
const existingEntryIds = new Set(existingRows.map((r) => r.entry_id))
|
|
145
|
-
|
|
146
|
-
// Filter to only entries that need linking
|
|
147
|
-
const newEntryIds = entryIds.filter((id) => !existingEntryIds.has(id))
|
|
148
|
-
const entriesUpdated = newEntryIds.length
|
|
149
|
-
|
|
150
|
-
if (newEntryIds.length > 0) {
|
|
151
|
-
const placeholders = newEntryIds.map(() => '(?, ?)').join(', ')
|
|
152
|
-
const params = newEntryIds.flatMap((entryId) => [entryId, targetTagId])
|
|
153
|
-
db.prepare(
|
|
154
|
-
`INSERT OR IGNORE INTO entry_tags (entry_id, tag_id) VALUES ${placeholders}`
|
|
155
|
-
).run(...params)
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
if (entriesUpdated > 0) {
|
|
159
|
-
db.prepare('UPDATE tags SET usage_count = usage_count + ? WHERE id = ?').run(
|
|
160
|
-
entriesUpdated,
|
|
161
|
-
targetTagId
|
|
162
|
-
)
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
db.prepare('DELETE FROM entry_tags WHERE tag_id = ?').run(sourceTagId)
|
|
166
|
-
db.prepare('DELETE FROM tags WHERE id = ?').run(sourceTagId)
|
|
167
|
-
|
|
168
|
-
return { entriesUpdated, sourceDeleted: true }
|
|
169
|
-
})
|
|
170
|
-
|
|
171
|
-
const result = mergeOp()
|
|
172
|
-
|
|
173
|
-
this.ctx.scheduleSave()
|
|
174
|
-
logger.info('Tags merged', {
|
|
175
|
-
module: 'SqliteAdapter',
|
|
176
|
-
operation: 'mergeTags',
|
|
177
|
-
context: { sourceTag, targetTag, entriesUpdated: result.entriesUpdated },
|
|
178
|
-
})
|
|
179
|
-
|
|
180
|
-
return result
|
|
181
|
-
}
|
|
182
|
-
}
|
|
@@ -1,312 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Memory Journal MCP Server - Tool Filtering
|
|
3
|
-
*
|
|
4
|
-
* Configurable tool filtering system with groups and meta-groups.
|
|
5
|
-
* Matches mysql-mcp filtering syntax and patterns.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import type { ToolGroup, MetaGroup, ToolFilterRule, ToolFilterConfig } from '../types/index.js'
|
|
9
|
-
|
|
10
|
-
// Re-export ToolFilterConfig from types
|
|
11
|
-
export type { ToolFilterConfig } from '../types/index.js'
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Tool group definitions mapping group names to tool names
|
|
15
|
-
*
|
|
16
|
-
* All 61 tools are categorized here for filtering support.
|
|
17
|
-
*/
|
|
18
|
-
export const TOOL_GROUPS: Record<ToolGroup, string[]> = {
|
|
19
|
-
core: [
|
|
20
|
-
'create_entry',
|
|
21
|
-
'get_entry_by_id',
|
|
22
|
-
'get_recent_entries',
|
|
23
|
-
'create_entry_minimal',
|
|
24
|
-
'test_simple',
|
|
25
|
-
'list_tags',
|
|
26
|
-
],
|
|
27
|
-
search: ['search_entries', 'search_by_date_range', 'semantic_search', 'get_vector_index_stats'],
|
|
28
|
-
analytics: ['get_statistics', 'get_cross_project_insights'],
|
|
29
|
-
relationships: ['link_entries', 'visualize_relationships'],
|
|
30
|
-
export: ['export_entries'],
|
|
31
|
-
admin: [
|
|
32
|
-
'update_entry',
|
|
33
|
-
'delete_entry',
|
|
34
|
-
'rebuild_vector_index',
|
|
35
|
-
'add_to_vector_index',
|
|
36
|
-
'merge_tags',
|
|
37
|
-
],
|
|
38
|
-
github: [
|
|
39
|
-
'get_github_issues',
|
|
40
|
-
'get_github_prs',
|
|
41
|
-
'get_github_issue',
|
|
42
|
-
'get_github_pr',
|
|
43
|
-
'get_github_context',
|
|
44
|
-
'get_kanban_board',
|
|
45
|
-
'move_kanban_item',
|
|
46
|
-
'create_github_issue_with_entry',
|
|
47
|
-
'close_github_issue_with_entry',
|
|
48
|
-
'get_github_milestones',
|
|
49
|
-
'get_github_milestone',
|
|
50
|
-
'create_github_milestone',
|
|
51
|
-
'update_github_milestone',
|
|
52
|
-
'delete_github_milestone',
|
|
53
|
-
'get_repo_insights',
|
|
54
|
-
'get_copilot_reviews',
|
|
55
|
-
],
|
|
56
|
-
backup: ['backup_journal', 'list_backups', 'restore_backup', 'cleanup_backups'],
|
|
57
|
-
team: [
|
|
58
|
-
'team_create_entry',
|
|
59
|
-
'team_get_entry_by_id',
|
|
60
|
-
'team_get_recent',
|
|
61
|
-
'team_list_tags',
|
|
62
|
-
'team_search',
|
|
63
|
-
'team_search_by_date_range',
|
|
64
|
-
'team_update_entry',
|
|
65
|
-
'team_delete_entry',
|
|
66
|
-
'team_merge_tags',
|
|
67
|
-
'team_get_statistics',
|
|
68
|
-
'team_link_entries',
|
|
69
|
-
'team_visualize_relationships',
|
|
70
|
-
'team_export_entries',
|
|
71
|
-
'team_backup',
|
|
72
|
-
'team_list_backups',
|
|
73
|
-
'team_semantic_search',
|
|
74
|
-
'team_get_vector_index_stats',
|
|
75
|
-
'team_rebuild_vector_index',
|
|
76
|
-
'team_add_to_vector_index',
|
|
77
|
-
'team_get_cross_project_insights',
|
|
78
|
-
],
|
|
79
|
-
codemode: ['mj_execute_code'],
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* Meta-group definitions mapping shortcuts to groups
|
|
84
|
-
*/
|
|
85
|
-
export const META_GROUPS: Record<MetaGroup, ToolGroup[]> = {
|
|
86
|
-
starter: ['core', 'search', 'codemode'],
|
|
87
|
-
essential: ['core', 'codemode'],
|
|
88
|
-
full: [
|
|
89
|
-
'core',
|
|
90
|
-
'search',
|
|
91
|
-
'analytics',
|
|
92
|
-
'relationships',
|
|
93
|
-
'export',
|
|
94
|
-
'admin',
|
|
95
|
-
'github',
|
|
96
|
-
'backup',
|
|
97
|
-
'team',
|
|
98
|
-
'codemode',
|
|
99
|
-
],
|
|
100
|
-
readonly: ['core', 'search', 'analytics', 'relationships', 'export'],
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* Get all tool names across all groups
|
|
105
|
-
*/
|
|
106
|
-
export function getAllToolNames(): string[] {
|
|
107
|
-
const allTools: string[] = []
|
|
108
|
-
for (const tools of Object.values(TOOL_GROUPS)) {
|
|
109
|
-
allTools.push(...tools)
|
|
110
|
-
}
|
|
111
|
-
return allTools
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* Get the group for a specific tool
|
|
116
|
-
*/
|
|
117
|
-
export function getToolGroup(toolName: string): ToolGroup | undefined {
|
|
118
|
-
for (const [group, tools] of Object.entries(TOOL_GROUPS)) {
|
|
119
|
-
if (tools.includes(toolName)) {
|
|
120
|
-
return group as ToolGroup
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
return undefined
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* Determine which tool groups have at least one enabled tool.
|
|
128
|
-
* Used by instruction generation to conditionally include/exclude sections.
|
|
129
|
-
*/
|
|
130
|
-
export function getEnabledGroups(enabledTools: Set<string>): Set<ToolGroup> {
|
|
131
|
-
const groups = new Set<ToolGroup>()
|
|
132
|
-
for (const [group, tools] of Object.entries(TOOL_GROUPS) as [ToolGroup, string[]][]) {
|
|
133
|
-
if (tools.some((t) => enabledTools.has(t))) {
|
|
134
|
-
groups.add(group)
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
return groups
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* Check if a string is a valid group name
|
|
142
|
-
*/
|
|
143
|
-
function isGroup(name: string): name is ToolGroup {
|
|
144
|
-
return name in TOOL_GROUPS
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* Check if a string is a valid meta-group name
|
|
149
|
-
*/
|
|
150
|
-
function isMetaGroup(name: string): name is MetaGroup {
|
|
151
|
-
return name in META_GROUPS
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
/**
|
|
155
|
-
* Parse a tool filter string into configuration
|
|
156
|
-
*
|
|
157
|
-
* Syntax:
|
|
158
|
-
* - `starter` - Use starter preset (whitelist mode)
|
|
159
|
-
* - `core,search` - Enable specific groups (whitelist mode)
|
|
160
|
-
* - `full,-admin` - All tools except admin group
|
|
161
|
-
* - `starter,-delete_entry` - Starter without specific tool
|
|
162
|
-
* - `+semantic_search` - Add specific tool to current set
|
|
163
|
-
*/
|
|
164
|
-
export function parseToolFilter(filterString: string): ToolFilterConfig {
|
|
165
|
-
const rules: ToolFilterRule[] = []
|
|
166
|
-
const parts = filterString
|
|
167
|
-
.split(',')
|
|
168
|
-
.map((p) => p.trim())
|
|
169
|
-
.filter(Boolean)
|
|
170
|
-
|
|
171
|
-
// Determine if we're in whitelist or blacklist mode
|
|
172
|
-
// If first item has no prefix and is a group/metagroup, we're in whitelist mode
|
|
173
|
-
let enabledTools = new Set<string>()
|
|
174
|
-
let isWhitelistMode = false
|
|
175
|
-
|
|
176
|
-
for (let i = 0; i < parts.length; i++) {
|
|
177
|
-
const part = parts[i]
|
|
178
|
-
if (!part) continue
|
|
179
|
-
|
|
180
|
-
const isAdd = part.startsWith('+')
|
|
181
|
-
const isRemove = part.startsWith('-')
|
|
182
|
-
const name = isAdd || isRemove ? part.slice(1) : part
|
|
183
|
-
|
|
184
|
-
if (i === 0 && !isAdd && !isRemove) {
|
|
185
|
-
// First item without prefix - whitelist mode
|
|
186
|
-
isWhitelistMode = true
|
|
187
|
-
|
|
188
|
-
if (isMetaGroup(name)) {
|
|
189
|
-
// Expand meta-group to groups
|
|
190
|
-
for (const group of META_GROUPS[name]) {
|
|
191
|
-
enabledTools = new Set([...enabledTools, ...TOOL_GROUPS[group]])
|
|
192
|
-
}
|
|
193
|
-
} else if (isGroup(name)) {
|
|
194
|
-
enabledTools = new Set([...enabledTools, ...TOOL_GROUPS[name]])
|
|
195
|
-
} else {
|
|
196
|
-
// Single tool
|
|
197
|
-
enabledTools.add(name)
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
rules.push({
|
|
201
|
-
type: 'include',
|
|
202
|
-
target: name,
|
|
203
|
-
isGroup: isGroup(name) || isMetaGroup(name),
|
|
204
|
-
})
|
|
205
|
-
} else if (isRemove) {
|
|
206
|
-
// Remove group or tool
|
|
207
|
-
if (isGroup(name)) {
|
|
208
|
-
for (const tool of TOOL_GROUPS[name]) {
|
|
209
|
-
enabledTools.delete(tool)
|
|
210
|
-
}
|
|
211
|
-
} else {
|
|
212
|
-
enabledTools.delete(name)
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
rules.push({
|
|
216
|
-
type: 'exclude',
|
|
217
|
-
target: name,
|
|
218
|
-
isGroup: isGroup(name),
|
|
219
|
-
})
|
|
220
|
-
} else {
|
|
221
|
-
// Add group or tool (with or without + prefix)
|
|
222
|
-
if (isMetaGroup(name)) {
|
|
223
|
-
for (const group of META_GROUPS[name]) {
|
|
224
|
-
enabledTools = new Set([...enabledTools, ...TOOL_GROUPS[group]])
|
|
225
|
-
}
|
|
226
|
-
} else if (isGroup(name)) {
|
|
227
|
-
enabledTools = new Set([...enabledTools, ...TOOL_GROUPS[name]])
|
|
228
|
-
} else {
|
|
229
|
-
enabledTools.add(name)
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
rules.push({
|
|
233
|
-
type: 'include',
|
|
234
|
-
target: name,
|
|
235
|
-
isGroup: isGroup(name) || isMetaGroup(name),
|
|
236
|
-
})
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
// If no filter specified or starting with removal, start with all tools
|
|
241
|
-
if (!isWhitelistMode && rules.length > 0 && rules[0]?.type === 'exclude') {
|
|
242
|
-
enabledTools = new Set(getAllToolNames())
|
|
243
|
-
// Re-apply rules
|
|
244
|
-
for (const rule of rules) {
|
|
245
|
-
if (rule.type === 'exclude') {
|
|
246
|
-
if (isGroup(rule.target)) {
|
|
247
|
-
for (const tool of TOOL_GROUPS[rule.target]) {
|
|
248
|
-
enabledTools.delete(tool)
|
|
249
|
-
}
|
|
250
|
-
} else {
|
|
251
|
-
enabledTools.delete(rule.target)
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
return {
|
|
258
|
-
raw: filterString,
|
|
259
|
-
rules,
|
|
260
|
-
enabledTools,
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
/**
|
|
265
|
-
* Check if a tool is enabled based on filter string
|
|
266
|
-
*/
|
|
267
|
-
export function isToolEnabled(toolName: string, filterConfig: ToolFilterConfig): boolean {
|
|
268
|
-
return filterConfig.enabledTools.has(toolName)
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
/**
|
|
272
|
-
* Filter tools array based on filter configuration
|
|
273
|
-
*/
|
|
274
|
-
export function filterTools<T extends { name: string }>(
|
|
275
|
-
tools: T[],
|
|
276
|
-
filterConfig: ToolFilterConfig
|
|
277
|
-
): T[] {
|
|
278
|
-
return tools.filter((tool) => isToolEnabled(tool.name, filterConfig))
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
/**
|
|
282
|
-
* Get tool filter from environment variable
|
|
283
|
-
*/
|
|
284
|
-
export function getToolFilterFromEnv(): ToolFilterConfig | null {
|
|
285
|
-
const filterString = process.env['MEMORY_JOURNAL_MCP_TOOL_FILTER']
|
|
286
|
-
if (!filterString) return null
|
|
287
|
-
return parseToolFilter(filterString)
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
/**
|
|
291
|
-
* Calculate token savings from filtering
|
|
292
|
-
*/
|
|
293
|
-
export function calculateTokenSavings(
|
|
294
|
-
totalTools: number,
|
|
295
|
-
enabledTools: number,
|
|
296
|
-
avgTokensPerTool = 150
|
|
297
|
-
): { reduction: number; savedTokens: number } {
|
|
298
|
-
const savedTokens = (totalTools - enabledTools) * avgTokensPerTool
|
|
299
|
-
const reduction = ((totalTools - enabledTools) / totalTools) * 100
|
|
300
|
-
return { reduction, savedTokens }
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
/**
|
|
304
|
-
* Get human-readable filter summary
|
|
305
|
-
*/
|
|
306
|
-
export function getFilterSummary(filterConfig: ToolFilterConfig): string {
|
|
307
|
-
const total = getAllToolNames().length
|
|
308
|
-
const enabled = filterConfig.enabledTools.size
|
|
309
|
-
const { reduction } = calculateTokenSavings(total, enabled)
|
|
310
|
-
|
|
311
|
-
return `${enabled}/${total} tools enabled (${reduction.toFixed(0)}% reduction)`
|
|
312
|
-
}
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
import { Octokit } from '@octokit/rest'
|
|
2
|
-
import { graphql } from '@octokit/graphql'
|
|
3
|
-
import * as simpleGitImport from 'simple-git'
|
|
4
|
-
import { logger } from '../../utils/logger.js'
|
|
5
|
-
import type { RepoInfo } from './types.js'
|
|
6
|
-
|
|
7
|
-
export const CACHE_TTL_MS = 5 * 60 * 1000
|
|
8
|
-
export const TRAFFIC_CACHE_TTL_MS = 10 * 60 * 1000
|
|
9
|
-
|
|
10
|
-
export interface CacheEntry<T> {
|
|
11
|
-
data: T
|
|
12
|
-
timestamp: number
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
type SimpleGitType = typeof simpleGitImport.simpleGit
|
|
16
|
-
const simpleGit: SimpleGitType = simpleGitImport.simpleGit
|
|
17
|
-
|
|
18
|
-
export class GitHubClient {
|
|
19
|
-
public octokit: Octokit | null = null
|
|
20
|
-
public graphqlWithAuth: typeof graphql | null = null
|
|
21
|
-
public git: simpleGitImport.SimpleGit
|
|
22
|
-
public token: string | undefined
|
|
23
|
-
public cachedRepoInfo: RepoInfo | null = null
|
|
24
|
-
|
|
25
|
-
public readonly apiCache = new Map<string, CacheEntry<unknown>>()
|
|
26
|
-
|
|
27
|
-
constructor(workingDir = '.') {
|
|
28
|
-
this.token = process.env['GITHUB_TOKEN']
|
|
29
|
-
|
|
30
|
-
const envRepoPath = process.env['GITHUB_REPO_PATH']
|
|
31
|
-
const effectiveDir = envRepoPath || workingDir
|
|
32
|
-
|
|
33
|
-
const resolvedDir = effectiveDir === '.' ? process.cwd() : effectiveDir
|
|
34
|
-
logger.info('GitHub integration using directory', {
|
|
35
|
-
module: 'GitHub',
|
|
36
|
-
workingDir,
|
|
37
|
-
envRepoPath: envRepoPath ?? 'not set',
|
|
38
|
-
effectiveDir,
|
|
39
|
-
resolvedDir,
|
|
40
|
-
cwd: process.cwd(),
|
|
41
|
-
})
|
|
42
|
-
|
|
43
|
-
this.git = simpleGit(effectiveDir)
|
|
44
|
-
|
|
45
|
-
if (this.token) {
|
|
46
|
-
this.octokit = new Octokit({ auth: this.token })
|
|
47
|
-
this.graphqlWithAuth = graphql.defaults({
|
|
48
|
-
headers: { authorization: `token ${this.token}` },
|
|
49
|
-
})
|
|
50
|
-
logger.info('GitHub integration initialized with token', { module: 'GitHub' })
|
|
51
|
-
} else {
|
|
52
|
-
logger.info('GitHub integration initialized without token (limited functionality)', {
|
|
53
|
-
module: 'GitHub',
|
|
54
|
-
})
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
isApiAvailable(): boolean {
|
|
59
|
-
return this.octokit !== null
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
getCached(key: string): unknown {
|
|
63
|
-
const entry = this.apiCache.get(key)
|
|
64
|
-
if (entry && Date.now() - entry.timestamp < CACHE_TTL_MS) {
|
|
65
|
-
// Map iteration order is insertion order: delete and re-set to make it newest (LRU)
|
|
66
|
-
this.apiCache.delete(key)
|
|
67
|
-
this.apiCache.set(key, entry)
|
|
68
|
-
return entry.data
|
|
69
|
-
}
|
|
70
|
-
if (entry) {
|
|
71
|
-
this.apiCache.delete(key)
|
|
72
|
-
}
|
|
73
|
-
return undefined
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
getCachedWithTtl(key: string, ttlMs: number): unknown {
|
|
77
|
-
const entry = this.apiCache.get(key)
|
|
78
|
-
if (entry && Date.now() - entry.timestamp < ttlMs) {
|
|
79
|
-
// Map iteration order is insertion order: delete and re-set to make it newest (LRU)
|
|
80
|
-
this.apiCache.delete(key)
|
|
81
|
-
this.apiCache.set(key, entry)
|
|
82
|
-
return entry.data
|
|
83
|
-
}
|
|
84
|
-
if (entry) {
|
|
85
|
-
this.apiCache.delete(key)
|
|
86
|
-
}
|
|
87
|
-
return undefined
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
setCache(key: string, data: unknown): void {
|
|
91
|
-
this.apiCache.delete(key) // Ensure it is inserted at the end of iteration order
|
|
92
|
-
this.apiCache.set(key, { data, timestamp: Date.now() })
|
|
93
|
-
|
|
94
|
-
// Prevent unbounded memory growth (Max 100 items)
|
|
95
|
-
if (this.apiCache.size > 100) {
|
|
96
|
-
const oldestKey = this.apiCache.keys().next().value
|
|
97
|
-
if (oldestKey !== undefined) {
|
|
98
|
-
this.apiCache.delete(oldestKey)
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
invalidateCache(prefix: string): void {
|
|
104
|
-
for (const key of this.apiCache.keys()) {
|
|
105
|
-
if (key.startsWith(prefix)) {
|
|
106
|
-
this.apiCache.delete(key)
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
clearCache(): void {
|
|
112
|
-
this.apiCache.clear()
|
|
113
|
-
}
|
|
114
|
-
}
|