gitmem-mcp 1.0.3 → 1.0.4
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/CHANGELOG.md +14 -14
- package/dist/commands/check.d.ts +1 -1
- package/dist/commands/check.js +4 -3
- package/dist/diagnostics/anonymizer.d.ts +1 -1
- package/dist/diagnostics/anonymizer.js +1 -1
- package/dist/diagnostics/channels.d.ts +1 -1
- package/dist/diagnostics/channels.js +1 -1
- package/dist/diagnostics/collector.d.ts +1 -1
- package/dist/diagnostics/collector.js +1 -1
- package/dist/diagnostics/index.d.ts +1 -1
- package/dist/diagnostics/index.js +1 -1
- package/dist/hooks/quick-retrieve.js +2 -1
- package/dist/index.js +0 -0
- package/dist/schemas/active-sessions.d.ts +9 -9
- package/dist/schemas/active-sessions.js +1 -1
- package/dist/schemas/common.d.ts +2 -5
- package/dist/schemas/common.js +13 -7
- package/dist/schemas/create-learning.js +1 -1
- package/dist/schemas/session-close.d.ts +5 -8
- package/dist/schemas/session-close.js +7 -3
- package/dist/schemas/session-start.d.ts +4 -4
- package/dist/schemas/session-start.js +1 -1
- package/dist/schemas/thread.d.ts +1 -1
- package/dist/schemas/thread.js +1 -1
- package/dist/server.d.ts +2 -2
- package/dist/server.js +21 -10
- package/dist/services/active-sessions.js +3 -2
- package/dist/services/agent-briefing.d.ts +1 -1
- package/dist/services/agent-briefing.js +1 -1
- package/dist/services/agent-detection.d.ts +1 -0
- package/dist/services/agent-detection.js +21 -12
- package/dist/services/analytics.d.ts +1 -1
- package/dist/services/analytics.js +3 -3
- package/dist/services/behavioral-decay.js +2 -2
- package/dist/services/cache.d.ts +1 -1
- package/dist/services/cache.js +1 -1
- package/dist/services/compliance-validator.d.ts +1 -1
- package/dist/services/compliance-validator.js +5 -5
- package/dist/services/config.d.ts +1 -1
- package/dist/services/config.js +1 -1
- package/dist/services/file-lock.js +12 -0
- package/dist/services/gitmem-dir.d.ts +17 -4
- package/dist/services/gitmem-dir.js +43 -9
- package/dist/services/local-file-storage.d.ts +1 -1
- package/dist/services/local-file-storage.js +4 -3
- package/dist/services/local-vector-search.d.ts +1 -1
- package/dist/services/local-vector-search.js +2 -2
- package/dist/services/metrics.d.ts +6 -6
- package/dist/services/metrics.js +8 -8
- package/dist/services/session-state.d.ts +7 -7
- package/dist/services/session-state.js +19 -7
- package/dist/services/startup.d.ts +1 -1
- package/dist/services/startup.js +3 -2
- package/dist/services/supabase-client.d.ts +17 -6
- package/dist/services/supabase-client.js +44 -8
- package/dist/services/thread-manager.d.ts +1 -1
- package/dist/services/thread-manager.js +5 -5
- package/dist/services/thread-supabase.d.ts +1 -1
- package/dist/services/thread-supabase.js +2 -2
- package/dist/services/transcript-chunker.d.ts +1 -1
- package/dist/services/transcript-chunker.js +1 -1
- package/dist/services/variant-assignment.d.ts +6 -6
- package/dist/services/variant-assignment.js +9 -8
- package/dist/tools/analyze.d.ts +2 -2
- package/dist/tools/analyze.js +2 -2
- package/dist/tools/archive-learning.js +36 -22
- package/dist/tools/confirm-scars.js +1 -1
- package/dist/tools/create-decision.d.ts +1 -1
- package/dist/tools/create-decision.js +2 -2
- package/dist/tools/create-learning.d.ts +1 -1
- package/dist/tools/create-learning.js +4 -4
- package/dist/tools/create-linear-issue.d.ts +18 -0
- package/dist/tools/create-linear-issue.js +197 -0
- package/dist/tools/create-thread.d.ts +1 -1
- package/dist/tools/create-thread.js +2 -2
- package/dist/tools/definitions.js +50 -48
- package/dist/tools/get-transcript.d.ts +1 -1
- package/dist/tools/get-transcript.js +1 -1
- package/dist/tools/graph-traverse.d.ts +1 -1
- package/dist/tools/graph-traverse.js +18 -16
- package/dist/tools/list-threads.d.ts +2 -2
- package/dist/tools/list-threads.js +4 -4
- package/dist/tools/log.d.ts +1 -1
- package/dist/tools/log.js +1 -1
- package/dist/tools/prepare-context.d.ts +1 -1
- package/dist/tools/prepare-context.js +1 -1
- package/dist/tools/recall.d.ts +4 -4
- package/dist/tools/recall.js +25 -25
- package/dist/tools/record-scar-usage-batch.js +2 -2
- package/dist/tools/record-scar-usage.d.ts +1 -1
- package/dist/tools/record-scar-usage.js +3 -3
- package/dist/tools/resolve-thread.d.ts +2 -2
- package/dist/tools/resolve-thread.js +3 -3
- package/dist/tools/save-transcript.d.ts +1 -1
- package/dist/tools/save-transcript.js +1 -1
- package/dist/tools/search.d.ts +1 -1
- package/dist/tools/search.js +1 -1
- package/dist/tools/session-close.d.ts +1 -1
- package/dist/tools/session-close.js +31 -31
- package/dist/tools/session-start.d.ts +5 -5
- package/dist/tools/session-start.js +63 -61
- package/dist/types/index.d.ts +13 -13
- package/hooks/.claude-plugin/plugin.json +1 -1
- package/hooks/scripts/post-tool-use.sh +1 -1
- package/hooks/scripts/recall-check.sh +1 -1
- package/hooks/scripts/session-close-check.sh +1 -1
- package/hooks/scripts/session-start.sh +1 -1
- package/package.json +6 -3
- package/dist/commands/check.d.ts.map +0 -1
- package/dist/commands/check.js.map +0 -1
- package/dist/constants/closing-questions.d.ts.map +0 -1
- package/dist/constants/closing-questions.js.map +0 -1
- package/dist/diagnostics/anonymizer.d.ts.map +0 -1
- package/dist/diagnostics/anonymizer.js.map +0 -1
- package/dist/diagnostics/channels.d.ts.map +0 -1
- package/dist/diagnostics/channels.js.map +0 -1
- package/dist/diagnostics/collector.d.ts.map +0 -1
- package/dist/diagnostics/collector.js.map +0 -1
- package/dist/diagnostics/index.d.ts.map +0 -1
- package/dist/diagnostics/index.js.map +0 -1
- package/dist/hooks/format-utils.d.ts.map +0 -1
- package/dist/hooks/format-utils.js.map +0 -1
- package/dist/hooks/quick-retrieve.d.ts.map +0 -1
- package/dist/hooks/quick-retrieve.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/schemas/absorb-observations.d.ts.map +0 -1
- package/dist/schemas/absorb-observations.js.map +0 -1
- package/dist/schemas/active-sessions.d.ts.map +0 -1
- package/dist/schemas/active-sessions.js.map +0 -1
- package/dist/schemas/analyze.d.ts.map +0 -1
- package/dist/schemas/analyze.js.map +0 -1
- package/dist/schemas/common.d.ts.map +0 -1
- package/dist/schemas/common.js.map +0 -1
- package/dist/schemas/create-decision.d.ts.map +0 -1
- package/dist/schemas/create-decision.js.map +0 -1
- package/dist/schemas/create-learning.d.ts.map +0 -1
- package/dist/schemas/create-learning.js.map +0 -1
- package/dist/schemas/get-transcript.d.ts.map +0 -1
- package/dist/schemas/get-transcript.js.map +0 -1
- package/dist/schemas/index.d.ts.map +0 -1
- package/dist/schemas/index.js.map +0 -1
- package/dist/schemas/log.d.ts.map +0 -1
- package/dist/schemas/log.js.map +0 -1
- package/dist/schemas/prepare-context.d.ts.map +0 -1
- package/dist/schemas/prepare-context.js.map +0 -1
- package/dist/schemas/recall.d.ts.map +0 -1
- package/dist/schemas/recall.js.map +0 -1
- package/dist/schemas/record-scar-usage-batch.d.ts.map +0 -1
- package/dist/schemas/record-scar-usage-batch.js.map +0 -1
- package/dist/schemas/record-scar-usage.d.ts.map +0 -1
- package/dist/schemas/record-scar-usage.js.map +0 -1
- package/dist/schemas/registry.d.ts.map +0 -1
- package/dist/schemas/registry.js.map +0 -1
- package/dist/schemas/save-transcript.d.ts.map +0 -1
- package/dist/schemas/save-transcript.js.map +0 -1
- package/dist/schemas/search-transcripts.d.ts.map +0 -1
- package/dist/schemas/search-transcripts.js.map +0 -1
- package/dist/schemas/search.d.ts.map +0 -1
- package/dist/schemas/search.js.map +0 -1
- package/dist/schemas/session-close.d.ts.map +0 -1
- package/dist/schemas/session-close.js.map +0 -1
- package/dist/schemas/session-start.d.ts.map +0 -1
- package/dist/schemas/session-start.js.map +0 -1
- package/dist/schemas/thread.d.ts.map +0 -1
- package/dist/schemas/thread.js.map +0 -1
- package/dist/server.d.ts.map +0 -1
- package/dist/server.js.map +0 -1
- package/dist/services/active-sessions.d.ts.map +0 -1
- package/dist/services/active-sessions.js.map +0 -1
- package/dist/services/agent-briefing.d.ts.map +0 -1
- package/dist/services/agent-briefing.js.map +0 -1
- package/dist/services/agent-detection.d.ts.map +0 -1
- package/dist/services/agent-detection.js.map +0 -1
- package/dist/services/analytics.d.ts.map +0 -1
- package/dist/services/analytics.js.map +0 -1
- package/dist/services/behavioral-decay.d.ts.map +0 -1
- package/dist/services/behavioral-decay.js.map +0 -1
- package/dist/services/bm25.d.ts.map +0 -1
- package/dist/services/bm25.js.map +0 -1
- package/dist/services/cache.d.ts.map +0 -1
- package/dist/services/cache.js.map +0 -1
- package/dist/services/cache.test.d.ts +0 -8
- package/dist/services/cache.test.d.ts.map +0 -1
- package/dist/services/cache.test.js +0 -267
- package/dist/services/cache.test.js.map +0 -1
- package/dist/services/compliance-validator.d.ts.map +0 -1
- package/dist/services/compliance-validator.js.map +0 -1
- package/dist/services/config.d.ts.map +0 -1
- package/dist/services/config.js.map +0 -1
- package/dist/services/display-protocol.d.ts.map +0 -1
- package/dist/services/display-protocol.js.map +0 -1
- package/dist/services/effect-tracker.d.ts.map +0 -1
- package/dist/services/effect-tracker.js.map +0 -1
- package/dist/services/embedding.d.ts.map +0 -1
- package/dist/services/embedding.js.map +0 -1
- package/dist/services/file-lock.d.ts.map +0 -1
- package/dist/services/file-lock.js.map +0 -1
- package/dist/services/gitmem-dir.d.ts.map +0 -1
- package/dist/services/gitmem-dir.js.map +0 -1
- package/dist/services/local-file-storage.d.ts.map +0 -1
- package/dist/services/local-file-storage.js.map +0 -1
- package/dist/services/local-vector-search.d.ts.map +0 -1
- package/dist/services/local-vector-search.js.map +0 -1
- package/dist/services/metrics.d.ts.map +0 -1
- package/dist/services/metrics.js.map +0 -1
- package/dist/services/session-state.d.ts.map +0 -1
- package/dist/services/session-state.js.map +0 -1
- package/dist/services/startup.d.ts.map +0 -1
- package/dist/services/startup.js.map +0 -1
- package/dist/services/storage.d.ts.map +0 -1
- package/dist/services/storage.js.map +0 -1
- package/dist/services/supabase-client.d.ts.map +0 -1
- package/dist/services/supabase-client.js.map +0 -1
- package/dist/services/thread-dedup.d.ts.map +0 -1
- package/dist/services/thread-dedup.js.map +0 -1
- package/dist/services/thread-manager.d.ts.map +0 -1
- package/dist/services/thread-manager.js.map +0 -1
- package/dist/services/thread-suggestions.d.ts.map +0 -1
- package/dist/services/thread-suggestions.js.map +0 -1
- package/dist/services/thread-supabase.d.ts.map +0 -1
- package/dist/services/thread-supabase.js.map +0 -1
- package/dist/services/thread-vitality.d.ts.map +0 -1
- package/dist/services/thread-vitality.js.map +0 -1
- package/dist/services/tier.d.ts.map +0 -1
- package/dist/services/tier.js.map +0 -1
- package/dist/services/timezone.d.ts.map +0 -1
- package/dist/services/timezone.js.map +0 -1
- package/dist/services/transcript-chunker.d.ts.map +0 -1
- package/dist/services/transcript-chunker.js.map +0 -1
- package/dist/services/triple-writer.d.ts.map +0 -1
- package/dist/services/triple-writer.js.map +0 -1
- package/dist/services/variant-assignment.d.ts.map +0 -1
- package/dist/services/variant-assignment.js.map +0 -1
- package/dist/services/variant-generation.d.ts.map +0 -1
- package/dist/services/variant-generation.js.map +0 -1
- package/dist/tools/absorb-observations.d.ts.map +0 -1
- package/dist/tools/absorb-observations.js.map +0 -1
- package/dist/tools/analyze.d.ts.map +0 -1
- package/dist/tools/analyze.js.map +0 -1
- package/dist/tools/archive-learning.d.ts.map +0 -1
- package/dist/tools/archive-learning.js.map +0 -1
- package/dist/tools/cleanup-threads.d.ts.map +0 -1
- package/dist/tools/cleanup-threads.js.map +0 -1
- package/dist/tools/confirm-scars.d.ts.map +0 -1
- package/dist/tools/confirm-scars.js.map +0 -1
- package/dist/tools/create-decision.d.ts.map +0 -1
- package/dist/tools/create-decision.js.map +0 -1
- package/dist/tools/create-learning.d.ts.map +0 -1
- package/dist/tools/create-learning.js.map +0 -1
- package/dist/tools/create-thread.d.ts.map +0 -1
- package/dist/tools/create-thread.js.map +0 -1
- package/dist/tools/definitions.d.ts.map +0 -1
- package/dist/tools/definitions.js.map +0 -1
- package/dist/tools/dismiss-suggestion.d.ts.map +0 -1
- package/dist/tools/dismiss-suggestion.js.map +0 -1
- package/dist/tools/get-transcript.d.ts.map +0 -1
- package/dist/tools/get-transcript.js.map +0 -1
- package/dist/tools/graph-traverse.d.ts.map +0 -1
- package/dist/tools/graph-traverse.js.map +0 -1
- package/dist/tools/list-threads.d.ts.map +0 -1
- package/dist/tools/list-threads.js.map +0 -1
- package/dist/tools/log.d.ts.map +0 -1
- package/dist/tools/log.js.map +0 -1
- package/dist/tools/prepare-context.d.ts.map +0 -1
- package/dist/tools/prepare-context.js.map +0 -1
- package/dist/tools/promote-suggestion.d.ts.map +0 -1
- package/dist/tools/promote-suggestion.js.map +0 -1
- package/dist/tools/recall.d.ts.map +0 -1
- package/dist/tools/recall.js.map +0 -1
- package/dist/tools/recall.test.d.ts +0 -5
- package/dist/tools/recall.test.d.ts.map +0 -1
- package/dist/tools/recall.test.js +0 -155
- package/dist/tools/recall.test.js.map +0 -1
- package/dist/tools/record-scar-usage-batch.d.ts.map +0 -1
- package/dist/tools/record-scar-usage-batch.js.map +0 -1
- package/dist/tools/record-scar-usage.d.ts.map +0 -1
- package/dist/tools/record-scar-usage.js.map +0 -1
- package/dist/tools/resolve-thread.d.ts.map +0 -1
- package/dist/tools/resolve-thread.js.map +0 -1
- package/dist/tools/save-transcript.d.ts.map +0 -1
- package/dist/tools/save-transcript.js.map +0 -1
- package/dist/tools/search-transcripts.d.ts.map +0 -1
- package/dist/tools/search-transcripts.js.map +0 -1
- package/dist/tools/search.d.ts.map +0 -1
- package/dist/tools/search.js.map +0 -1
- package/dist/tools/session-close.d.ts.map +0 -1
- package/dist/tools/session-close.js.map +0 -1
- package/dist/tools/session-start.d.ts.map +0 -1
- package/dist/tools/session-start.js.map +0 -1
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js.map +0 -1
- package/hooks/tests/test-hooks.sh +0 -577
package/CHANGELOG.md
CHANGED
|
@@ -10,16 +10,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
10
10
|
## [1.0.3] - 2026-02-15
|
|
11
11
|
|
|
12
12
|
### Changed
|
|
13
|
-
- **Tool alias consolidation
|
|
14
|
-
- **Starter scars reduced
|
|
15
|
-
- **Recall similarity threshold
|
|
16
|
-
- **Adaptive session closing
|
|
17
|
-
- **Scar relevance feedback
|
|
18
|
-
- **Pro tier messaging
|
|
13
|
+
- **Tool alias consolidation**: Reduced advertised tools from 55 to 20 (free tier). Aliases still work when called directly. Set `GITMEM_FULL_ALIASES=1` to restore all.
|
|
14
|
+
- **Starter scars reduced**: Ship with 3 high-quality starter scars instead of 12. Starter scars deprioritized with 0.7x score multiplier so earned scars outrank them.
|
|
15
|
+
- **Recall similarity threshold**: Weak matches below threshold (0.4 BM25, 0.35 embeddings) are suppressed. Empty results show helpful guidance instead of noise.
|
|
16
|
+
- **Adaptive session closing**: Auto-detects ceremony level (micro/standard/full) based on session activity. Removed hard rejection gate that blocked standard closes on short sessions.
|
|
17
|
+
- **Scar relevance feedback**: Optional `relevance` field (high/low/noise) on `confirm_scars` for recall quality improvement. Defaults derived from decision type.
|
|
18
|
+
- **Pro tier messaging**: Rewritten from agent's perspective with concrete value propositions.
|
|
19
19
|
|
|
20
20
|
### Added
|
|
21
|
-
- **Agent briefing
|
|
22
|
-
- **PMEM/GitMem boundary docs
|
|
21
|
+
- **Agent briefing**: Generates `.gitmem/agent-briefing.md` at session close with memory state summary for MEMORY.md bridge.
|
|
22
|
+
- **PMEM/GitMem boundary docs**: README section documenting how GitMem complements MEMORY.md/cursorrules.
|
|
23
23
|
|
|
24
24
|
## [1.0.2] - 2026-02-15
|
|
25
25
|
|
|
@@ -31,12 +31,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
31
31
|
## [1.0.0] - 2026-02-10
|
|
32
32
|
|
|
33
33
|
### Added
|
|
34
|
-
- **Hooks plugin bundled**: `gitmem install-hooks` / `uninstall-hooks` CLI commands
|
|
34
|
+
- **Hooks plugin bundled**: `gitmem install-hooks` / `uninstall-hooks` CLI commands
|
|
35
35
|
- **CLI `check` command wired**: `gitmem check` now reachable from CLI (was defined but unreachable)
|
|
36
|
-
- **Fresh-install E2E tests**: 16 integration tests covering CLI commands, hooks, and MCP server lifecycle
|
|
37
|
-
- **README rewrite**: External-developer-facing docs with no internal jargon
|
|
36
|
+
- **Fresh-install E2E tests**: 16 integration tests covering CLI commands, hooks, and MCP server lifecycle
|
|
37
|
+
- **README rewrite**: External-developer-facing docs with no internal jargon
|
|
38
38
|
- **CONTRIBUTING.md**: Dev setup, testing tiers, and PR guidelines
|
|
39
|
-
- **First public npm release**
|
|
39
|
+
- **First public npm release**
|
|
40
40
|
|
|
41
41
|
### Changed
|
|
42
42
|
- Package name standardized to `gitmem-mcp` for npm
|
|
@@ -46,11 +46,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
46
46
|
## [0.2.0] - 2026-02-08
|
|
47
47
|
|
|
48
48
|
### Added
|
|
49
|
-
- **Full monorepo sync**: Standalone repo is now source of truth
|
|
49
|
+
- **Full monorepo sync**: Standalone repo is now source of truth
|
|
50
50
|
- **Zod schemas**: 14 schema files for all tool parameter validation (`src/schemas/`)
|
|
51
51
|
- **Diagnostics suite**: Health checks, channel instrumentation, anonymization (`src/diagnostics/`)
|
|
52
52
|
- **Single source of truth constants**: Closing questions defined once (`src/constants/closing-questions.ts`)
|
|
53
|
-
- **Multi-agent tools**: `prepare_context` and `absorb_observations`
|
|
53
|
+
- **Multi-agent tools**: `prepare_context` and `absorb_observations`
|
|
54
54
|
- **Tool definitions module**: Centralized tool registration (`src/tools/definitions.ts`)
|
|
55
55
|
- **Commands module**: `gitmem check` CLI health diagnostics (`src/commands/check.ts`)
|
|
56
56
|
- **Full test suite**: 354+ unit tests across 20 test files, plus integration, e2e, and performance benchmarks
|
package/dist/commands/check.d.ts
CHANGED
package/dist/commands/check.js
CHANGED
|
@@ -8,13 +8,14 @@
|
|
|
8
8
|
* npx gitmem check --full — Full diagnostic (~30s)
|
|
9
9
|
* npx gitmem check --output report.json
|
|
10
10
|
*
|
|
11
|
-
*
|
|
11
|
+
*
|
|
12
12
|
*/
|
|
13
13
|
import { existsSync, mkdirSync, writeFileSync, readdirSync, statSync } from "fs";
|
|
14
14
|
import { join } from "path";
|
|
15
15
|
import { DiagnosticsCollector, runBenchmark, anonymizeSupabaseUrl, anonymizePath, isApiKeyConfigured, getSafeEnvironmentInfo, } from "../diagnostics/index.js";
|
|
16
16
|
import { getCache, CacheService } from "../services/cache.js";
|
|
17
17
|
import { getTier, hasSupabase } from "../services/tier.js";
|
|
18
|
+
import { getGitmemDir } from "../services/gitmem-dir.js";
|
|
18
19
|
// Report version for schema compatibility
|
|
19
20
|
const REPORT_VERSION = "1.0.0";
|
|
20
21
|
/**
|
|
@@ -287,7 +288,7 @@ async function runQuickCheck() {
|
|
|
287
288
|
// Data volume (counts only)
|
|
288
289
|
let dataVolume;
|
|
289
290
|
try {
|
|
290
|
-
const gitmemDir =
|
|
291
|
+
const gitmemDir = getGitmemDir();
|
|
291
292
|
let localCacheFiles = 0;
|
|
292
293
|
let localCacheBytes = 0;
|
|
293
294
|
if (existsSync(gitmemDir)) {
|
|
@@ -463,7 +464,7 @@ export async function runCheck(options) {
|
|
|
463
464
|
dataVolume,
|
|
464
465
|
};
|
|
465
466
|
// Determine output path
|
|
466
|
-
const gitmemDir =
|
|
467
|
+
const gitmemDir = getGitmemDir();
|
|
467
468
|
if (!existsSync(gitmemDir)) {
|
|
468
469
|
mkdirSync(gitmemDir, { recursive: true });
|
|
469
470
|
}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Subscribes to diagnostics_channel events and collects metrics
|
|
5
5
|
* during diagnostic pass. Anonymizes data as it's collected.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
7
|
+
*
|
|
8
8
|
*/
|
|
9
9
|
import { subscribe, unsubscribe } from "diagnostics_channel";
|
|
10
10
|
import { CHANNEL_NAMES, } from "./channels.js";
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
* // ... run operations ...
|
|
21
21
|
* const metrics = collector.stop();
|
|
22
22
|
*
|
|
23
|
-
*
|
|
23
|
+
*
|
|
24
24
|
*/
|
|
25
25
|
export { diagnostics, CHANNEL_NAMES, channel, type ToolCallEvent, type CacheEvent, type DbQueryEvent, type EmbeddingCallEvent, type ErrorEvent, } from "./channels.js";
|
|
26
26
|
export { DiagnosticsCollector, getCollector, resetCollector, runBenchmark, percentile, type DiagnosticMetrics, type DiagnosticReport, type HealthCheckResult, type BenchmarkResult, } from "./collector.js";
|
|
@@ -21,6 +21,7 @@ import { getStorage } from "../services/storage.js";
|
|
|
21
21
|
import { hasSupabase } from "../services/tier.js";
|
|
22
22
|
import { isLocalSearchReady, localScarSearch } from "../services/local-vector-search.js";
|
|
23
23
|
import { bm25Search } from "../services/bm25.js";
|
|
24
|
+
import { getGitmemDir } from "../services/gitmem-dir.js";
|
|
24
25
|
import { formatCompact } from "./format-utils.js";
|
|
25
26
|
/**
|
|
26
27
|
* Perform a quick scar search optimized for hook invocation.
|
|
@@ -72,7 +73,7 @@ export async function quickRetrieve(prompt, retrievalLevel, options = {}) {
|
|
|
72
73
|
* Uses BM25 ranking with field boosting (title 3x, keywords 2x, description 1x).
|
|
73
74
|
*/
|
|
74
75
|
function searchDiskCache(query, k) {
|
|
75
|
-
const cachePath = path.join(
|
|
76
|
+
const cachePath = path.join(getGitmemDir(), "cache", "hook-scars.json");
|
|
76
77
|
if (!fs.existsSync(cachePath)) {
|
|
77
78
|
return [];
|
|
78
79
|
}
|
package/dist/index.js
CHANGED
|
File without changes
|
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Zod schemas for active-sessions.json registry
|
|
2
|
+
* Zod schemas for active-sessions.json registry
|
|
3
3
|
*
|
|
4
4
|
* Validates data read from disk — defensive parsing of potentially corrupted JSON.
|
|
5
5
|
*/
|
|
6
6
|
import { z } from "zod";
|
|
7
7
|
export declare const ActiveSessionEntrySchema: z.ZodObject<{
|
|
8
8
|
session_id: z.ZodString;
|
|
9
|
-
agent: z.
|
|
9
|
+
agent: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, "local" | "cli" | "desktop" | "autonomous" | "cloud" | "Unknown", string>;
|
|
10
10
|
started_at: z.ZodString;
|
|
11
11
|
hostname: z.ZodString;
|
|
12
12
|
pid: z.ZodNumber;
|
|
13
13
|
project: z.ZodDefault<z.ZodString>;
|
|
14
14
|
}, "strip", z.ZodTypeAny, {
|
|
15
15
|
project: string;
|
|
16
|
-
agent: "
|
|
16
|
+
agent: "local" | "cli" | "desktop" | "autonomous" | "cloud" | "Unknown";
|
|
17
17
|
session_id: string;
|
|
18
18
|
started_at: string;
|
|
19
19
|
hostname: string;
|
|
20
20
|
pid: number;
|
|
21
21
|
}, {
|
|
22
|
-
agent:
|
|
22
|
+
agent: string;
|
|
23
23
|
session_id: string;
|
|
24
24
|
started_at: string;
|
|
25
25
|
hostname: string;
|
|
@@ -29,20 +29,20 @@ export declare const ActiveSessionEntrySchema: z.ZodObject<{
|
|
|
29
29
|
export declare const ActiveSessionsRegistrySchema: z.ZodObject<{
|
|
30
30
|
sessions: z.ZodArray<z.ZodObject<{
|
|
31
31
|
session_id: z.ZodString;
|
|
32
|
-
agent: z.
|
|
32
|
+
agent: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, "local" | "cli" | "desktop" | "autonomous" | "cloud" | "Unknown", string>;
|
|
33
33
|
started_at: z.ZodString;
|
|
34
34
|
hostname: z.ZodString;
|
|
35
35
|
pid: z.ZodNumber;
|
|
36
36
|
project: z.ZodDefault<z.ZodString>;
|
|
37
37
|
}, "strip", z.ZodTypeAny, {
|
|
38
38
|
project: string;
|
|
39
|
-
agent: "
|
|
39
|
+
agent: "local" | "cli" | "desktop" | "autonomous" | "cloud" | "Unknown";
|
|
40
40
|
session_id: string;
|
|
41
41
|
started_at: string;
|
|
42
42
|
hostname: string;
|
|
43
43
|
pid: number;
|
|
44
44
|
}, {
|
|
45
|
-
agent:
|
|
45
|
+
agent: string;
|
|
46
46
|
session_id: string;
|
|
47
47
|
started_at: string;
|
|
48
48
|
hostname: string;
|
|
@@ -52,7 +52,7 @@ export declare const ActiveSessionsRegistrySchema: z.ZodObject<{
|
|
|
52
52
|
}, "strip", z.ZodTypeAny, {
|
|
53
53
|
sessions: {
|
|
54
54
|
project: string;
|
|
55
|
-
agent: "
|
|
55
|
+
agent: "local" | "cli" | "desktop" | "autonomous" | "cloud" | "Unknown";
|
|
56
56
|
session_id: string;
|
|
57
57
|
started_at: string;
|
|
58
58
|
hostname: string;
|
|
@@ -60,7 +60,7 @@ export declare const ActiveSessionsRegistrySchema: z.ZodObject<{
|
|
|
60
60
|
}[];
|
|
61
61
|
}, {
|
|
62
62
|
sessions: {
|
|
63
|
-
agent:
|
|
63
|
+
agent: string;
|
|
64
64
|
session_id: string;
|
|
65
65
|
started_at: string;
|
|
66
66
|
hostname: string;
|
package/dist/schemas/common.d.ts
CHANGED
|
@@ -7,11 +7,8 @@ import { z } from "zod";
|
|
|
7
7
|
*/
|
|
8
8
|
export declare const ProjectSchema: z.ZodDefault<z.ZodString>;
|
|
9
9
|
export type Project = string;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
*/
|
|
13
|
-
export declare const AgentIdentitySchema: z.ZodEnum<["CLI", "DAC", "CODA-1", "Brain_Local", "Brain_Cloud", "Unknown"]>;
|
|
14
|
-
export type AgentIdentity = z.infer<typeof AgentIdentitySchema>;
|
|
10
|
+
export declare const AgentIdentitySchema: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, "local" | "cli" | "desktop" | "autonomous" | "cloud" | "Unknown", string>;
|
|
11
|
+
export type AgentIdentity = "cli" | "desktop" | "autonomous" | "local" | "cloud" | "Unknown";
|
|
15
12
|
/**
|
|
16
13
|
* Learning type enum (scar, win, pattern)
|
|
17
14
|
*/
|
package/dist/schemas/common.js
CHANGED
|
@@ -9,14 +9,20 @@ export const ProjectSchema = z.string().default("default");
|
|
|
9
9
|
/**
|
|
10
10
|
* Agent identity enum
|
|
11
11
|
*/
|
|
12
|
-
|
|
13
|
-
"CLI",
|
|
14
|
-
"DAC",
|
|
15
|
-
"CODA-1",
|
|
16
|
-
"Brain_Local",
|
|
17
|
-
"Brain_Cloud",
|
|
18
|
-
|
|
12
|
+
const LEGACY_AGENT_MAP = {
|
|
13
|
+
"CLI": "cli",
|
|
14
|
+
"DAC": "desktop",
|
|
15
|
+
"CODA-1": "autonomous",
|
|
16
|
+
"Brain_Local": "local",
|
|
17
|
+
"Brain_Cloud": "cloud",
|
|
18
|
+
};
|
|
19
|
+
const VALID_AGENTS = new Set([
|
|
20
|
+
"cli", "desktop", "autonomous", "local", "cloud", "Unknown",
|
|
21
|
+
"CLI", "DAC", "CODA-1", "Brain_Local", "Brain_Cloud",
|
|
19
22
|
]);
|
|
23
|
+
export const AgentIdentitySchema = z.string()
|
|
24
|
+
.refine((val) => VALID_AGENTS.has(val), { message: "Invalid agent identity" })
|
|
25
|
+
.transform((val) => (LEGACY_AGENT_MAP[val] || val));
|
|
20
26
|
/**
|
|
21
27
|
* Learning type enum (scar, win, pattern)
|
|
22
28
|
*/
|
|
@@ -25,7 +25,7 @@ export const CreateLearningParamsSchema = z
|
|
|
25
25
|
keywords: z.array(z.string()).optional(),
|
|
26
26
|
source_linear_issue: z.string().optional(),
|
|
27
27
|
project: ProjectSchema.optional(),
|
|
28
|
-
//
|
|
28
|
+
// LLM-cooperative enforcement fields
|
|
29
29
|
why_this_matters: z.string().optional(),
|
|
30
30
|
action_protocol: z.array(z.string()).optional(),
|
|
31
31
|
self_check_criteria: z.array(z.string()).optional(),
|
|
@@ -41,7 +41,7 @@ export declare const ClosingReflectionSchema: z.ZodObject<{
|
|
|
41
41
|
}>;
|
|
42
42
|
export type ClosingReflection = z.infer<typeof ClosingReflectionSchema>;
|
|
43
43
|
/**
|
|
44
|
-
* Task completion proof schema
|
|
44
|
+
* Task completion proof schema
|
|
45
45
|
*/
|
|
46
46
|
export declare const TaskCompletionSchema: z.ZodObject<{
|
|
47
47
|
questions_displayed_at: z.ZodEffects<z.ZodString, string, string>;
|
|
@@ -124,11 +124,8 @@ export declare const ScarUsageEntrySchema: z.ZodObject<{
|
|
|
124
124
|
variant_id?: string | undefined;
|
|
125
125
|
}>;
|
|
126
126
|
export type ScarUsageEntry = z.infer<typeof ScarUsageEntrySchema>;
|
|
127
|
-
/**
|
|
128
|
-
* Session close parameters schema
|
|
129
|
-
*/
|
|
130
127
|
export declare const SessionCloseParamsSchema: z.ZodObject<{
|
|
131
|
-
session_id: z.ZodString
|
|
128
|
+
session_id: z.ZodEffects<z.ZodString, string, string>;
|
|
132
129
|
close_type: z.ZodEnum<["standard", "quick", "autonomous", "retroactive"]>;
|
|
133
130
|
task_completion: z.ZodOptional<z.ZodObject<{
|
|
134
131
|
questions_displayed_at: z.ZodEffects<z.ZodString, string, string>;
|
|
@@ -270,10 +267,10 @@ export declare const SessionCloseParamsSchema: z.ZodObject<{
|
|
|
270
267
|
variant_id?: string | undefined;
|
|
271
268
|
}>, "many">>;
|
|
272
269
|
capture_transcript: z.ZodOptional<z.ZodBoolean>;
|
|
273
|
-
transcript_path: z.ZodOptional<z.ZodString
|
|
270
|
+
transcript_path: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
|
|
274
271
|
}, "strip", z.ZodTypeAny, {
|
|
275
272
|
session_id: string;
|
|
276
|
-
close_type: "
|
|
273
|
+
close_type: "autonomous" | "standard" | "quick" | "retroactive";
|
|
277
274
|
decisions?: {
|
|
278
275
|
title: string;
|
|
279
276
|
decision: string;
|
|
@@ -330,7 +327,7 @@ export declare const SessionCloseParamsSchema: z.ZodObject<{
|
|
|
330
327
|
capture_transcript?: boolean | undefined;
|
|
331
328
|
}, {
|
|
332
329
|
session_id: string;
|
|
333
|
-
close_type: "
|
|
330
|
+
close_type: "autonomous" | "standard" | "quick" | "retroactive";
|
|
334
331
|
decisions?: {
|
|
335
332
|
title: string;
|
|
336
333
|
decision: string;
|
|
@@ -22,7 +22,7 @@ export const ClosingReflectionSchema = z.object({
|
|
|
22
22
|
rapport_notes: z.string().optional(),
|
|
23
23
|
});
|
|
24
24
|
/**
|
|
25
|
-
* Task completion proof schema
|
|
25
|
+
* Task completion proof schema
|
|
26
26
|
*/
|
|
27
27
|
export const TaskCompletionSchema = z.object({
|
|
28
28
|
questions_displayed_at: ISOTimestampSchema,
|
|
@@ -59,8 +59,12 @@ export const ScarUsageEntrySchema = z.object({
|
|
|
59
59
|
/**
|
|
60
60
|
* Session close parameters schema
|
|
61
61
|
*/
|
|
62
|
+
// Session ID must be UUID or 8-char hex short-ID (no path traversal)
|
|
63
|
+
const SessionIdSchema = z.string().min(1, "session_id is required").refine((val) => /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(val) || /^[0-9a-f]{8}$/i.test(val), { message: "session_id must be a UUID or 8-char hex short-ID" });
|
|
64
|
+
// Transcript path must not contain path traversal sequences
|
|
65
|
+
const SafeTranscriptPathSchema = z.string().refine((val) => !val.includes("..") && !val.includes("\0"), { message: "transcript_path must not contain path traversal sequences" });
|
|
62
66
|
export const SessionCloseParamsSchema = z.object({
|
|
63
|
-
session_id:
|
|
67
|
+
session_id: SessionIdSchema,
|
|
64
68
|
close_type: CloseTypeSchema,
|
|
65
69
|
task_completion: TaskCompletionSchema.optional(),
|
|
66
70
|
closing_reflection: ClosingReflectionSchema.optional(),
|
|
@@ -73,7 +77,7 @@ export const SessionCloseParamsSchema = z.object({
|
|
|
73
77
|
ceremony_duration_ms: z.number().nonnegative().optional(),
|
|
74
78
|
scars_to_record: z.array(ScarUsageEntrySchema).optional(),
|
|
75
79
|
capture_transcript: z.boolean().optional(),
|
|
76
|
-
transcript_path:
|
|
80
|
+
transcript_path: SafeTranscriptPathSchema.optional(),
|
|
77
81
|
});
|
|
78
82
|
/**
|
|
79
83
|
* Validate session_close params with close type specific rules
|
|
@@ -9,19 +9,19 @@ import { z } from "zod";
|
|
|
9
9
|
* and use defaults for project.
|
|
10
10
|
*/
|
|
11
11
|
export declare const SessionStartParamsSchema: z.ZodObject<{
|
|
12
|
-
agent_identity: z.ZodOptional<z.
|
|
12
|
+
agent_identity: z.ZodOptional<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, "local" | "cli" | "desktop" | "autonomous" | "cloud" | "Unknown", string>>;
|
|
13
13
|
linear_issue: z.ZodOptional<z.ZodString>;
|
|
14
14
|
issue_title: z.ZodOptional<z.ZodString>;
|
|
15
15
|
issue_description: z.ZodOptional<z.ZodString>;
|
|
16
16
|
issue_labels: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
17
17
|
project: z.ZodOptional<z.ZodDefault<z.ZodString>>;
|
|
18
|
-
/**
|
|
18
|
+
/** Force overwrite of existing active session */
|
|
19
19
|
force: z.ZodOptional<z.ZodBoolean>;
|
|
20
20
|
}, "strip", z.ZodTypeAny, {
|
|
21
21
|
project?: string | undefined;
|
|
22
22
|
linear_issue?: string | undefined;
|
|
23
23
|
force?: boolean | undefined;
|
|
24
|
-
agent_identity?: "
|
|
24
|
+
agent_identity?: "local" | "cli" | "desktop" | "autonomous" | "cloud" | "Unknown" | undefined;
|
|
25
25
|
issue_title?: string | undefined;
|
|
26
26
|
issue_description?: string | undefined;
|
|
27
27
|
issue_labels?: string[] | undefined;
|
|
@@ -29,7 +29,7 @@ export declare const SessionStartParamsSchema: z.ZodObject<{
|
|
|
29
29
|
project?: string | undefined;
|
|
30
30
|
linear_issue?: string | undefined;
|
|
31
31
|
force?: boolean | undefined;
|
|
32
|
-
agent_identity?:
|
|
32
|
+
agent_identity?: string | undefined;
|
|
33
33
|
issue_title?: string | undefined;
|
|
34
34
|
issue_description?: string | undefined;
|
|
35
35
|
issue_labels?: string[] | undefined;
|
|
@@ -16,7 +16,7 @@ export const SessionStartParamsSchema = z.object({
|
|
|
16
16
|
issue_description: z.string().optional(),
|
|
17
17
|
issue_labels: z.array(z.string()).optional(),
|
|
18
18
|
project: ProjectSchema.optional(),
|
|
19
|
-
/**
|
|
19
|
+
/** Force overwrite of existing active session */
|
|
20
20
|
force: z.boolean().optional(),
|
|
21
21
|
});
|
|
22
22
|
/**
|
package/dist/schemas/thread.d.ts
CHANGED
package/dist/schemas/thread.js
CHANGED
package/dist/server.d.ts
CHANGED
|
@@ -12,8 +12,8 @@ export declare function createServer(): Server;
|
|
|
12
12
|
/**
|
|
13
13
|
* Run the server with stdio transport
|
|
14
14
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
15
|
+
* Initializes local vector search in background for fast startup.
|
|
16
|
+
* Uses direct Supabase queries to get embeddings for local cache.
|
|
17
17
|
*
|
|
18
18
|
* Server starts immediately; cache loads in background.
|
|
19
19
|
* First few queries may use Supabase fallback until cache is ready.
|
package/dist/server.js
CHANGED
|
@@ -43,7 +43,7 @@ import { validateToolArgs } from "./schemas/registry.js";
|
|
|
43
43
|
export function createServer() {
|
|
44
44
|
const server = new Server({
|
|
45
45
|
name: "gitmem-mcp",
|
|
46
|
-
version: "
|
|
46
|
+
version: "1.0.3",
|
|
47
47
|
}, {
|
|
48
48
|
capabilities: {
|
|
49
49
|
tools: {},
|
|
@@ -207,6 +207,7 @@ export function createServer() {
|
|
|
207
207
|
{ alias: "gitmem-r", full: "recall", description: "Check scars before taking action" },
|
|
208
208
|
{ alias: "gitmem-cs", full: "confirm_scars", description: "Confirm recalled scars (APPLYING/N_A/REFUTED)" },
|
|
209
209
|
{ alias: "gitmem-ss", full: "session_start", description: "Initialize session with context" },
|
|
210
|
+
{ alias: "gitmem-sr", full: "session_refresh", description: "Refresh context for active session" },
|
|
210
211
|
{ alias: "gitmem-sc", full: "session_close", description: "Close session with compliance validation" },
|
|
211
212
|
{ alias: "gitmem-cl", full: "create_learning", description: "Create scar/win/pattern entry" },
|
|
212
213
|
{ alias: "gitmem-cd", full: "create_decision", description: "Log architectural/operational decision" },
|
|
@@ -223,6 +224,7 @@ export function createServer() {
|
|
|
223
224
|
{ alias: "gitmem-cleanup", full: "cleanup_threads", description: "Triage threads by lifecycle health" },
|
|
224
225
|
{ alias: "gitmem-health", full: "health", description: "Show write health for fire-and-forget operations" },
|
|
225
226
|
{ alias: "gitmem-al", full: "archive_learning", description: "Archive a scar/win/pattern (is_active=false)" },
|
|
227
|
+
{ alias: "gitmem-graph", full: "graph_traverse", description: "Traverse knowledge graph over institutional memory" },
|
|
226
228
|
];
|
|
227
229
|
if (hasBatchOperations()) {
|
|
228
230
|
commands.push({ alias: "gitmem-rsb", full: "record_scar_usage_batch", description: "Track multiple scars (batch)" });
|
|
@@ -233,10 +235,12 @@ export function createServer() {
|
|
|
233
235
|
if (hasCacheManagement()) {
|
|
234
236
|
commands.push({ alias: "gitmem-cache-status", full: "cache_status", description: "Show cache status" }, { alias: "gitmem-cache-health", full: "cache_health", description: "Compare local vs remote" }, { alias: "gitmem-cache-flush", full: "cache_flush", description: "Force reload from Supabase" });
|
|
235
237
|
}
|
|
238
|
+
// Filter to only show commands whose canonical tool is actually registered
|
|
239
|
+
const visibleCommands = commands.filter(c => registeredToolNames.has(c.full));
|
|
236
240
|
// Build command table for display
|
|
237
|
-
const cmdLines =
|
|
241
|
+
const cmdLines = visibleCommands.map(c => ` ${c.alias.padEnd(22)} ${c.description}`).join("\n");
|
|
238
242
|
const display = [
|
|
239
|
-
`gitmem
|
|
243
|
+
`gitmem v1.0.3 · ${tier} · ${registeredTools.length} tools · ${hasSupabase() ? "supabase" : "local (.gitmem/)"}`,
|
|
240
244
|
"Memory that compounds.",
|
|
241
245
|
"",
|
|
242
246
|
cmdLines,
|
|
@@ -248,11 +252,11 @@ export function createServer() {
|
|
|
248
252
|
"Tool results are collapsed in the CLI — the user cannot see them unless you echo them.",
|
|
249
253
|
].join("\n");
|
|
250
254
|
result = {
|
|
251
|
-
version: "
|
|
255
|
+
version: "1.0.3",
|
|
252
256
|
tier,
|
|
253
257
|
tools_registered: registeredTools.length,
|
|
254
258
|
storage: hasSupabase() ? "supabase" : "local (.gitmem/)",
|
|
255
|
-
commands,
|
|
259
|
+
commands: visibleCommands,
|
|
256
260
|
display,
|
|
257
261
|
};
|
|
258
262
|
break;
|
|
@@ -277,7 +281,7 @@ export function createServer() {
|
|
|
277
281
|
case "gm-graph":
|
|
278
282
|
result = await graphTraverse(toolArgs);
|
|
279
283
|
break;
|
|
280
|
-
// Cache management tools
|
|
284
|
+
// Cache management tools
|
|
281
285
|
case "gitmem-cache-status":
|
|
282
286
|
case "gm-cache-s":
|
|
283
287
|
result = getCacheStatus(toolArgs.project || getProject() || "default");
|
|
@@ -319,12 +323,19 @@ export function createServer() {
|
|
|
319
323
|
};
|
|
320
324
|
}
|
|
321
325
|
catch (error) {
|
|
322
|
-
const
|
|
326
|
+
const rawMessage = error instanceof Error ? error.message : String(error);
|
|
327
|
+
// Redact internal details: file paths, SQL errors, stack traces
|
|
328
|
+
const safeMessage = rawMessage
|
|
329
|
+
.replace(/\/[^\s:]+/g, "[path]") // redact file paths
|
|
330
|
+
.replace(/\b\d{5}\b/g, "[code]") // redact PG error codes
|
|
331
|
+
.replace(/at\s+\S+\s+\(.+\)/g, "") // strip stack frames
|
|
332
|
+
.slice(0, 200); // cap length
|
|
333
|
+
console.error(`[server] Tool error:`, rawMessage);
|
|
323
334
|
return {
|
|
324
335
|
content: [
|
|
325
336
|
{
|
|
326
337
|
type: "text",
|
|
327
|
-
text: JSON.stringify({ error:
|
|
338
|
+
text: JSON.stringify({ error: safeMessage }),
|
|
328
339
|
},
|
|
329
340
|
],
|
|
330
341
|
isError: true,
|
|
@@ -336,8 +347,8 @@ export function createServer() {
|
|
|
336
347
|
/**
|
|
337
348
|
* Run the server with stdio transport
|
|
338
349
|
*
|
|
339
|
-
*
|
|
340
|
-
*
|
|
350
|
+
* Initializes local vector search in background for fast startup.
|
|
351
|
+
* Uses direct Supabase queries to get embeddings for local cache.
|
|
341
352
|
*
|
|
342
353
|
* Server starts immediately; cache loads in background.
|
|
343
354
|
* First few queries may use Supabase fallback until cache is ready.
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
import * as fs from "fs";
|
|
14
14
|
import * as path from "path";
|
|
15
15
|
import * as os from "os";
|
|
16
|
-
import { getGitmemDir, getSessionPath } from "./gitmem-dir.js";
|
|
16
|
+
import { getGitmemDir, getSessionPath, sanitizePathComponent } from "./gitmem-dir.js";
|
|
17
17
|
import { ActiveSessionsRegistrySchema } from "../schemas/active-sessions.js";
|
|
18
18
|
import { withLockSync } from "./file-lock.js";
|
|
19
19
|
const REGISTRY_FILENAME = "active-sessions.json";
|
|
@@ -276,6 +276,7 @@ function pruneOrphanedDirs(gitmemDir, registry) {
|
|
|
276
276
|
*/
|
|
277
277
|
function cleanupSessionDir(gitmemDir, sessionId) {
|
|
278
278
|
try {
|
|
279
|
+
sanitizePathComponent(sessionId, "sessionId");
|
|
279
280
|
const sessionDir = path.join(gitmemDir, "sessions", sessionId);
|
|
280
281
|
if (fs.existsSync(sessionDir)) {
|
|
281
282
|
fs.rmSync(sessionDir, { recursive: true, force: true });
|
|
@@ -328,7 +329,7 @@ export function migrateFromLegacy() {
|
|
|
328
329
|
// 2. Create registry with single entry
|
|
329
330
|
const entry = {
|
|
330
331
|
session_id: old.session_id,
|
|
331
|
-
agent: old.agent || "
|
|
332
|
+
agent: old.agent || "cli",
|
|
332
333
|
started_at: old.started_at || new Date().toISOString(),
|
|
333
334
|
hostname: old.hostname || os.hostname(),
|
|
334
335
|
pid: old.pid || process.pid,
|
|
@@ -18,6 +18,7 @@ import type { AgentIdentity, DetectedEnvironment } from "../types/index.js";
|
|
|
18
18
|
* Detect the current agent identity based on environment
|
|
19
19
|
*/
|
|
20
20
|
export declare function detectAgent(): DetectedEnvironment;
|
|
21
|
+
export declare function normalizeAgent(input: string): AgentIdentity;
|
|
21
22
|
/**
|
|
22
23
|
* Get just the agent identity (convenience function)
|
|
23
24
|
*/
|