gitmem-mcp 0.2.0
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 +47 -0
- package/CLAUDE.md.template +65 -0
- package/LICENSE +21 -0
- package/README.md +221 -0
- package/bin/gitmem.js +383 -0
- package/dist/commands/check.d.ts +33 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +492 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/constants/closing-questions.d.ts +40 -0
- package/dist/constants/closing-questions.d.ts.map +1 -0
- package/dist/constants/closing-questions.js +107 -0
- package/dist/constants/closing-questions.js.map +1 -0
- package/dist/diagnostics/anonymizer.d.ts +55 -0
- package/dist/diagnostics/anonymizer.d.ts.map +1 -0
- package/dist/diagnostics/anonymizer.js +191 -0
- package/dist/diagnostics/anonymizer.js.map +1 -0
- package/dist/diagnostics/channels.d.ts +132 -0
- package/dist/diagnostics/channels.d.ts.map +1 -0
- package/dist/diagnostics/channels.js +150 -0
- package/dist/diagnostics/channels.js.map +1 -0
- package/dist/diagnostics/collector.d.ts +183 -0
- package/dist/diagnostics/collector.d.ts.map +1 -0
- package/dist/diagnostics/collector.js +227 -0
- package/dist/diagnostics/collector.js.map +1 -0
- package/dist/diagnostics/index.d.ts +28 -0
- package/dist/diagnostics/index.d.ts.map +1 -0
- package/dist/diagnostics/index.js +31 -0
- package/dist/diagnostics/index.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/absorb-observations.d.ts +63 -0
- package/dist/schemas/absorb-observations.d.ts.map +1 -0
- package/dist/schemas/absorb-observations.js +25 -0
- package/dist/schemas/absorb-observations.js.map +1 -0
- package/dist/schemas/active-sessions.d.ts +71 -0
- package/dist/schemas/active-sessions.d.ts.map +1 -0
- package/dist/schemas/active-sessions.js +19 -0
- package/dist/schemas/active-sessions.js.map +1 -0
- package/dist/schemas/analyze.d.ts +38 -0
- package/dist/schemas/analyze.d.ts.map +1 -0
- package/dist/schemas/analyze.js +30 -0
- package/dist/schemas/analyze.js.map +1 -0
- package/dist/schemas/common.d.ts +55 -0
- package/dist/schemas/common.d.ts.map +1 -0
- package/dist/schemas/common.js +65 -0
- package/dist/schemas/common.js.map +1 -0
- package/dist/schemas/create-decision.d.ts +48 -0
- package/dist/schemas/create-decision.d.ts.map +1 -0
- package/dist/schemas/create-decision.js +31 -0
- package/dist/schemas/create-decision.js.map +1 -0
- package/dist/schemas/create-learning.d.ts +107 -0
- package/dist/schemas/create-learning.d.ts.map +1 -0
- package/dist/schemas/create-learning.js +64 -0
- package/dist/schemas/create-learning.js.map +1 -0
- package/dist/schemas/get-transcript.d.ts +24 -0
- package/dist/schemas/get-transcript.d.ts.map +1 -0
- package/dist/schemas/get-transcript.js +22 -0
- package/dist/schemas/get-transcript.js.map +1 -0
- package/dist/schemas/index.d.ts +23 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +23 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/log.d.ts +36 -0
- package/dist/schemas/log.d.ts.map +1 -0
- package/dist/schemas/log.js +27 -0
- package/dist/schemas/log.js.map +1 -0
- package/dist/schemas/prepare-context.d.ts +41 -0
- package/dist/schemas/prepare-context.d.ts.map +1 -0
- package/dist/schemas/prepare-context.js +31 -0
- package/dist/schemas/prepare-context.js.map +1 -0
- package/dist/schemas/recall.d.ts +41 -0
- package/dist/schemas/recall.d.ts.map +1 -0
- package/dist/schemas/recall.js +47 -0
- package/dist/schemas/recall.js.map +1 -0
- package/dist/schemas/record-scar-usage-batch.d.ts +82 -0
- package/dist/schemas/record-scar-usage-batch.d.ts.map +1 -0
- package/dist/schemas/record-scar-usage-batch.js +25 -0
- package/dist/schemas/record-scar-usage-batch.js.map +1 -0
- package/dist/schemas/record-scar-usage.d.ts +51 -0
- package/dist/schemas/record-scar-usage.d.ts.map +1 -0
- package/dist/schemas/record-scar-usage.js +32 -0
- package/dist/schemas/record-scar-usage.js.map +1 -0
- package/dist/schemas/save-transcript.d.ts +38 -0
- package/dist/schemas/save-transcript.d.ts.map +1 -0
- package/dist/schemas/save-transcript.js +30 -0
- package/dist/schemas/save-transcript.js.map +1 -0
- package/dist/schemas/search.d.ts +36 -0
- package/dist/schemas/search.d.ts.map +1 -0
- package/dist/schemas/search.js +27 -0
- package/dist/schemas/search.js.map +1 -0
- package/dist/schemas/session-close.d.ts +371 -0
- package/dist/schemas/session-close.d.ts.map +1 -0
- package/dist/schemas/session-close.js +95 -0
- package/dist/schemas/session-close.js.map +1 -0
- package/dist/schemas/session-start.d.ts +46 -0
- package/dist/schemas/session-start.d.ts.map +1 -0
- package/dist/schemas/session-start.js +33 -0
- package/dist/schemas/session-start.js.map +1 -0
- package/dist/schemas/thread.d.ts +72 -0
- package/dist/schemas/thread.d.ts.map +1 -0
- package/dist/schemas/thread.js +39 -0
- package/dist/schemas/thread.js.map +1 -0
- package/dist/server.d.ts +22 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +313 -0
- package/dist/server.js.map +1 -0
- package/dist/services/active-sessions.d.ts +66 -0
- package/dist/services/active-sessions.d.ts.map +1 -0
- package/dist/services/active-sessions.js +311 -0
- package/dist/services/active-sessions.js.map +1 -0
- package/dist/services/agent-detection.d.ts +25 -0
- package/dist/services/agent-detection.d.ts.map +1 -0
- package/dist/services/agent-detection.js +93 -0
- package/dist/services/agent-detection.js.map +1 -0
- package/dist/services/analytics.d.ts +201 -0
- package/dist/services/analytics.d.ts.map +1 -0
- package/dist/services/analytics.js +483 -0
- package/dist/services/analytics.js.map +1 -0
- package/dist/services/cache.d.ts +148 -0
- package/dist/services/cache.d.ts.map +1 -0
- package/dist/services/cache.js +384 -0
- package/dist/services/cache.js.map +1 -0
- package/dist/services/cache.test.d.ts +8 -0
- package/dist/services/cache.test.d.ts.map +1 -0
- package/dist/services/cache.test.js +267 -0
- package/dist/services/cache.test.js.map +1 -0
- package/dist/services/compliance-validator.d.ts +30 -0
- package/dist/services/compliance-validator.d.ts.map +1 -0
- package/dist/services/compliance-validator.js +257 -0
- package/dist/services/compliance-validator.js.map +1 -0
- package/dist/services/config.d.ts +48 -0
- package/dist/services/config.d.ts.map +1 -0
- package/dist/services/config.js +128 -0
- package/dist/services/config.js.map +1 -0
- package/dist/services/embedding.d.ts +58 -0
- package/dist/services/embedding.d.ts.map +1 -0
- package/dist/services/embedding.js +243 -0
- package/dist/services/embedding.js.map +1 -0
- package/dist/services/gitmem-dir.d.ts +38 -0
- package/dist/services/gitmem-dir.d.ts.map +1 -0
- package/dist/services/gitmem-dir.js +84 -0
- package/dist/services/gitmem-dir.js.map +1 -0
- package/dist/services/local-file-storage.d.ts +56 -0
- package/dist/services/local-file-storage.d.ts.map +1 -0
- package/dist/services/local-file-storage.js +213 -0
- package/dist/services/local-file-storage.js.map +1 -0
- package/dist/services/local-vector-search.d.ts +137 -0
- package/dist/services/local-vector-search.d.ts.map +1 -0
- package/dist/services/local-vector-search.js +311 -0
- package/dist/services/local-vector-search.js.map +1 -0
- package/dist/services/metrics.d.ts +104 -0
- package/dist/services/metrics.d.ts.map +1 -0
- package/dist/services/metrics.js +264 -0
- package/dist/services/metrics.js.map +1 -0
- package/dist/services/session-state.d.ts +113 -0
- package/dist/services/session-state.d.ts.map +1 -0
- package/dist/services/session-state.js +203 -0
- package/dist/services/session-state.js.map +1 -0
- package/dist/services/startup.d.ts +112 -0
- package/dist/services/startup.d.ts.map +1 -0
- package/dist/services/startup.js +436 -0
- package/dist/services/startup.js.map +1 -0
- package/dist/services/storage.d.ts +43 -0
- package/dist/services/storage.d.ts.map +1 -0
- package/dist/services/storage.js +92 -0
- package/dist/services/storage.js.map +1 -0
- package/dist/services/supabase-client.d.ts +163 -0
- package/dist/services/supabase-client.d.ts.map +1 -0
- package/dist/services/supabase-client.js +510 -0
- package/dist/services/supabase-client.js.map +1 -0
- package/dist/services/thread-dedup.d.ts +44 -0
- package/dist/services/thread-dedup.d.ts.map +1 -0
- package/dist/services/thread-dedup.js +113 -0
- package/dist/services/thread-dedup.js.map +1 -0
- package/dist/services/thread-manager.d.ts +77 -0
- package/dist/services/thread-manager.d.ts.map +1 -0
- package/dist/services/thread-manager.js +250 -0
- package/dist/services/thread-manager.js.map +1 -0
- package/dist/services/thread-suggestions.d.ts +66 -0
- package/dist/services/thread-suggestions.d.ts.map +1 -0
- package/dist/services/thread-suggestions.js +243 -0
- package/dist/services/thread-suggestions.js.map +1 -0
- package/dist/services/thread-supabase.d.ts +111 -0
- package/dist/services/thread-supabase.d.ts.map +1 -0
- package/dist/services/thread-supabase.js +459 -0
- package/dist/services/thread-supabase.js.map +1 -0
- package/dist/services/thread-vitality.d.ts +65 -0
- package/dist/services/thread-vitality.d.ts.map +1 -0
- package/dist/services/thread-vitality.js +143 -0
- package/dist/services/thread-vitality.js.map +1 -0
- package/dist/services/tier.d.ts +52 -0
- package/dist/services/tier.d.ts.map +1 -0
- package/dist/services/tier.js +109 -0
- package/dist/services/tier.js.map +1 -0
- package/dist/services/timezone.d.ts +37 -0
- package/dist/services/timezone.d.ts.map +1 -0
- package/dist/services/timezone.js +147 -0
- package/dist/services/timezone.js.map +1 -0
- package/dist/services/transcript-chunker.d.ts +18 -0
- package/dist/services/transcript-chunker.d.ts.map +1 -0
- package/dist/services/transcript-chunker.js +237 -0
- package/dist/services/transcript-chunker.js.map +1 -0
- package/dist/services/triple-writer.d.ts +128 -0
- package/dist/services/triple-writer.d.ts.map +1 -0
- package/dist/services/triple-writer.js +338 -0
- package/dist/services/triple-writer.js.map +1 -0
- package/dist/services/variant-assignment.d.ts +92 -0
- package/dist/services/variant-assignment.d.ts.map +1 -0
- package/dist/services/variant-assignment.js +196 -0
- package/dist/services/variant-assignment.js.map +1 -0
- package/dist/tools/absorb-observations.d.ts +16 -0
- package/dist/tools/absorb-observations.d.ts.map +1 -0
- package/dist/tools/absorb-observations.js +82 -0
- package/dist/tools/absorb-observations.js.map +1 -0
- package/dist/tools/analyze.d.ts +55 -0
- package/dist/tools/analyze.d.ts.map +1 -0
- package/dist/tools/analyze.js +139 -0
- package/dist/tools/analyze.js.map +1 -0
- package/dist/tools/cleanup-threads.d.ts +47 -0
- package/dist/tools/cleanup-threads.d.ts.map +1 -0
- package/dist/tools/cleanup-threads.js +127 -0
- package/dist/tools/cleanup-threads.js.map +1 -0
- package/dist/tools/confirm-scars.d.ts +23 -0
- package/dist/tools/confirm-scars.d.ts.map +1 -0
- package/dist/tools/confirm-scars.js +209 -0
- package/dist/tools/confirm-scars.js.map +1 -0
- package/dist/tools/create-decision.d.ts +15 -0
- package/dist/tools/create-decision.d.ts.map +1 -0
- package/dist/tools/create-decision.js +138 -0
- package/dist/tools/create-decision.js.map +1 -0
- package/dist/tools/create-learning.d.ts +15 -0
- package/dist/tools/create-learning.d.ts.map +1 -0
- package/dist/tools/create-learning.js +226 -0
- package/dist/tools/create-learning.js.map +1 -0
- package/dist/tools/create-thread.d.ts +42 -0
- package/dist/tools/create-thread.d.ts.map +1 -0
- package/dist/tools/create-thread.js +180 -0
- package/dist/tools/create-thread.js.map +1 -0
- package/dist/tools/definitions.d.ts +5013 -0
- package/dist/tools/definitions.d.ts.map +1 -0
- package/dist/tools/definitions.js +2017 -0
- package/dist/tools/definitions.js.map +1 -0
- package/dist/tools/dismiss-suggestion.d.ts +20 -0
- package/dist/tools/dismiss-suggestion.d.ts.map +1 -0
- package/dist/tools/dismiss-suggestion.js +40 -0
- package/dist/tools/dismiss-suggestion.js.map +1 -0
- package/dist/tools/get-transcript.d.ts +24 -0
- package/dist/tools/get-transcript.d.ts.map +1 -0
- package/dist/tools/get-transcript.js +52 -0
- package/dist/tools/get-transcript.js.map +1 -0
- package/dist/tools/graph-traverse.d.ts +83 -0
- package/dist/tools/graph-traverse.d.ts.map +1 -0
- package/dist/tools/graph-traverse.js +394 -0
- package/dist/tools/graph-traverse.js.map +1 -0
- package/dist/tools/list-threads.d.ts +15 -0
- package/dist/tools/list-threads.d.ts.map +1 -0
- package/dist/tools/list-threads.js +114 -0
- package/dist/tools/list-threads.js.map +1 -0
- package/dist/tools/log.d.ts +43 -0
- package/dist/tools/log.d.ts.map +1 -0
- package/dist/tools/log.js +157 -0
- package/dist/tools/log.js.map +1 -0
- package/dist/tools/prepare-context.d.ts +36 -0
- package/dist/tools/prepare-context.d.ts.map +1 -0
- package/dist/tools/prepare-context.js +353 -0
- package/dist/tools/prepare-context.js.map +1 -0
- package/dist/tools/promote-suggestion.d.ts +25 -0
- package/dist/tools/promote-suggestion.d.ts.map +1 -0
- package/dist/tools/promote-suggestion.js +60 -0
- package/dist/tools/promote-suggestion.js.map +1 -0
- package/dist/tools/recall.d.ts +77 -0
- package/dist/tools/recall.d.ts.map +1 -0
- package/dist/tools/recall.js +423 -0
- package/dist/tools/recall.js.map +1 -0
- package/dist/tools/recall.test.d.ts +5 -0
- package/dist/tools/recall.test.d.ts.map +1 -0
- package/dist/tools/recall.test.js +155 -0
- package/dist/tools/recall.test.js.map +1 -0
- package/dist/tools/record-scar-usage-batch.d.ts +10 -0
- package/dist/tools/record-scar-usage-batch.d.ts.map +1 -0
- package/dist/tools/record-scar-usage-batch.js +153 -0
- package/dist/tools/record-scar-usage-batch.js.map +1 -0
- package/dist/tools/record-scar-usage.d.ts +14 -0
- package/dist/tools/record-scar-usage.d.ts.map +1 -0
- package/dist/tools/record-scar-usage.js +94 -0
- package/dist/tools/record-scar-usage.js.map +1 -0
- package/dist/tools/resolve-thread.d.ts +16 -0
- package/dist/tools/resolve-thread.d.ts.map +1 -0
- package/dist/tools/resolve-thread.js +102 -0
- package/dist/tools/resolve-thread.js.map +1 -0
- package/dist/tools/save-transcript.d.ts +29 -0
- package/dist/tools/save-transcript.d.ts.map +1 -0
- package/dist/tools/save-transcript.js +97 -0
- package/dist/tools/save-transcript.js.map +1 -0
- package/dist/tools/search.d.ts +46 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +186 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/session-close.d.ts +14 -0
- package/dist/tools/session-close.d.ts.map +1 -0
- package/dist/tools/session-close.js +881 -0
- package/dist/tools/session-close.js.map +1 -0
- package/dist/tools/session-start.d.ts +38 -0
- package/dist/tools/session-start.d.ts.map +1 -0
- package/dist/tools/session-start.js +1104 -0
- package/dist/tools/session-start.js.map +1 -0
- package/dist/types/index.d.ts +456 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +76 -0
- package/schema/setup.sql +193 -0
- package/schema/starter-scars.json +206 -0
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for recall tool
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
5
|
+
import { recall } from "./recall.js";
|
|
6
|
+
import * as supabase from "../services/supabase-client.js";
|
|
7
|
+
// Mock the tier module to simulate pro/dev tier (Supabase available)
|
|
8
|
+
vi.mock("../services/tier.js", () => ({
|
|
9
|
+
getTier: vi.fn().mockReturnValue("pro"),
|
|
10
|
+
hasSupabase: vi.fn().mockReturnValue(true),
|
|
11
|
+
hasVariants: vi.fn().mockReturnValue(false),
|
|
12
|
+
hasMetrics: vi.fn().mockReturnValue(false),
|
|
13
|
+
hasCacheManagement: vi.fn().mockReturnValue(true),
|
|
14
|
+
hasCompliance: vi.fn().mockReturnValue(false),
|
|
15
|
+
hasTranscripts: vi.fn().mockReturnValue(false),
|
|
16
|
+
hasBatchOperations: vi.fn().mockReturnValue(false),
|
|
17
|
+
hasEmbeddings: vi.fn().mockReturnValue(true),
|
|
18
|
+
hasAdvancedAgentDetection: vi.fn().mockReturnValue(false),
|
|
19
|
+
hasMultiProject: vi.fn().mockReturnValue(false),
|
|
20
|
+
hasEnforcementFields: vi.fn().mockReturnValue(false),
|
|
21
|
+
getTablePrefix: vi.fn().mockReturnValue("gitmem_"),
|
|
22
|
+
getTableName: vi.fn((base) => `gitmem_${base}`),
|
|
23
|
+
}));
|
|
24
|
+
// Mock the supabase client
|
|
25
|
+
vi.mock("../services/supabase-client.js", () => ({
|
|
26
|
+
isConfigured: vi.fn(),
|
|
27
|
+
cachedScarSearch: vi.fn(), // OD-473: now uses cached version
|
|
28
|
+
upsertRecord: vi.fn().mockResolvedValue(undefined), // For metrics recording
|
|
29
|
+
}));
|
|
30
|
+
describe("recall", () => {
|
|
31
|
+
beforeEach(() => {
|
|
32
|
+
vi.clearAllMocks();
|
|
33
|
+
});
|
|
34
|
+
it("returns error when Supabase not configured", async () => {
|
|
35
|
+
vi.mocked(supabase.isConfigured).mockReturnValue(false);
|
|
36
|
+
const result = await recall({ plan: "deploy to production" });
|
|
37
|
+
expect(result.activated).toBe(false);
|
|
38
|
+
expect(result.formatted_response).toContain("not configured");
|
|
39
|
+
});
|
|
40
|
+
it("returns scars when found", async () => {
|
|
41
|
+
vi.mocked(supabase.isConfigured).mockReturnValue(true);
|
|
42
|
+
vi.mocked(supabase.cachedScarSearch).mockResolvedValue({
|
|
43
|
+
results: [
|
|
44
|
+
{
|
|
45
|
+
id: "test-scar-1",
|
|
46
|
+
title: "Test Scar",
|
|
47
|
+
description: "This is a test scar about deployment",
|
|
48
|
+
severity: "high",
|
|
49
|
+
counter_arguments: ["You might think it's easy", "You might skip testing"],
|
|
50
|
+
applies_when: ["deploying", "releasing"],
|
|
51
|
+
similarity: 0.85,
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
cache_hit: false,
|
|
55
|
+
});
|
|
56
|
+
const result = await recall({ plan: "deploy to production" });
|
|
57
|
+
expect(result.activated).toBe(true);
|
|
58
|
+
expect(result.scars).toHaveLength(1);
|
|
59
|
+
expect(result.scars[0].title).toBe("Test Scar");
|
|
60
|
+
expect(result.scars[0].severity).toBe("high");
|
|
61
|
+
expect(result.scars[0].similarity).toBe(0.85);
|
|
62
|
+
expect(result.formatted_response).toContain("INSTITUTIONAL MEMORY ACTIVATED");
|
|
63
|
+
expect(result.formatted_response).toContain("Test Scar");
|
|
64
|
+
});
|
|
65
|
+
it("returns empty when no scars found", async () => {
|
|
66
|
+
vi.mocked(supabase.isConfigured).mockReturnValue(true);
|
|
67
|
+
vi.mocked(supabase.cachedScarSearch).mockResolvedValue({ results: [], cache_hit: false });
|
|
68
|
+
const result = await recall({ plan: "unique task with no history" });
|
|
69
|
+
expect(result.activated).toBe(false);
|
|
70
|
+
expect(result.scars).toHaveLength(0);
|
|
71
|
+
expect(result.formatted_response).toContain("No relevant scars found");
|
|
72
|
+
expect(result.formatted_response).toContain("new territory");
|
|
73
|
+
});
|
|
74
|
+
it("uses default project and match_count", async () => {
|
|
75
|
+
vi.mocked(supabase.isConfigured).mockReturnValue(true);
|
|
76
|
+
vi.mocked(supabase.cachedScarSearch).mockResolvedValue({ results: [], cache_hit: false });
|
|
77
|
+
const result = await recall({ plan: "test plan" });
|
|
78
|
+
expect(result.project).toBe("orchestra_dev");
|
|
79
|
+
expect(result.match_count).toBe(3);
|
|
80
|
+
expect(supabase.cachedScarSearch).toHaveBeenCalledWith("test plan", 3, "orchestra_dev");
|
|
81
|
+
});
|
|
82
|
+
it("respects custom project and match_count", async () => {
|
|
83
|
+
vi.mocked(supabase.isConfigured).mockReturnValue(true);
|
|
84
|
+
vi.mocked(supabase.cachedScarSearch).mockResolvedValue({ results: [], cache_hit: false });
|
|
85
|
+
const result = await recall({
|
|
86
|
+
plan: "trading feature",
|
|
87
|
+
project: "weekend_warrior",
|
|
88
|
+
match_count: 5,
|
|
89
|
+
});
|
|
90
|
+
expect(result.project).toBe("weekend_warrior");
|
|
91
|
+
expect(result.match_count).toBe(5);
|
|
92
|
+
expect(supabase.cachedScarSearch).toHaveBeenCalledWith("trading feature", 5, "weekend_warrior");
|
|
93
|
+
});
|
|
94
|
+
it("handles search errors gracefully", async () => {
|
|
95
|
+
vi.mocked(supabase.isConfigured).mockReturnValue(true);
|
|
96
|
+
vi.mocked(supabase.cachedScarSearch).mockRejectedValue(new Error("Network error"));
|
|
97
|
+
const result = await recall({ plan: "test plan" });
|
|
98
|
+
expect(result.activated).toBe(false);
|
|
99
|
+
expect(result.formatted_response).toContain("Error querying institutional memory");
|
|
100
|
+
expect(result.formatted_response).toContain("Network error");
|
|
101
|
+
});
|
|
102
|
+
it("includes performance data", async () => {
|
|
103
|
+
vi.mocked(supabase.isConfigured).mockReturnValue(true);
|
|
104
|
+
vi.mocked(supabase.cachedScarSearch).mockResolvedValue({ results: [], cache_hit: false });
|
|
105
|
+
const result = await recall({ plan: "test plan" });
|
|
106
|
+
expect(result.performance).toBeDefined();
|
|
107
|
+
expect(result.performance.latency_ms).toBeGreaterThanOrEqual(0);
|
|
108
|
+
expect(result.performance.target_ms).toBe(2000); // OD-429 target for recall
|
|
109
|
+
expect(result.performance.meets_target).toBe(true);
|
|
110
|
+
expect(result.performance.result_count).toBe(0);
|
|
111
|
+
});
|
|
112
|
+
it("includes memories_surfaced in performance when scars found", async () => {
|
|
113
|
+
vi.mocked(supabase.isConfigured).mockReturnValue(true);
|
|
114
|
+
vi.mocked(supabase.cachedScarSearch).mockResolvedValue({
|
|
115
|
+
results: [
|
|
116
|
+
{ id: "scar-1", title: "Test", description: "Test", severity: "high", similarity: 0.9 },
|
|
117
|
+
{ id: "scar-2", title: "Test 2", description: "Test 2", severity: "medium", similarity: 0.8 },
|
|
118
|
+
],
|
|
119
|
+
cache_hit: true,
|
|
120
|
+
cache_age_ms: 5000,
|
|
121
|
+
});
|
|
122
|
+
const result = await recall({ plan: "test plan", match_count: 2 });
|
|
123
|
+
expect(result.performance.result_count).toBe(2);
|
|
124
|
+
expect(result.performance.memories_surfaced).toEqual(["scar-1", "scar-2"]);
|
|
125
|
+
expect(result.performance.similarity_scores).toEqual([0.9, 0.8]);
|
|
126
|
+
expect(result.performance.cache_hit).toBe(true);
|
|
127
|
+
});
|
|
128
|
+
it("formats severity with correct emoji", async () => {
|
|
129
|
+
vi.mocked(supabase.isConfigured).mockReturnValue(true);
|
|
130
|
+
vi.mocked(supabase.cachedScarSearch).mockResolvedValue({
|
|
131
|
+
results: [
|
|
132
|
+
{ id: "1", title: "Critical Scar", description: "desc", severity: "critical", similarity: 0.9 },
|
|
133
|
+
{ id: "2", title: "High Scar", description: "desc", severity: "high", similarity: 0.8 },
|
|
134
|
+
{ id: "3", title: "Medium Scar", description: "desc", severity: "medium", similarity: 0.7 },
|
|
135
|
+
],
|
|
136
|
+
cache_hit: false,
|
|
137
|
+
});
|
|
138
|
+
const result = await recall({ plan: "test", match_count: 3 });
|
|
139
|
+
expect(result.formatted_response).toContain("🔴");
|
|
140
|
+
expect(result.formatted_response).toContain("🟠");
|
|
141
|
+
expect(result.formatted_response).toContain("🟡");
|
|
142
|
+
});
|
|
143
|
+
it("includes cache_hit in performance data", async () => {
|
|
144
|
+
vi.mocked(supabase.isConfigured).mockReturnValue(true);
|
|
145
|
+
vi.mocked(supabase.cachedScarSearch).mockResolvedValue({
|
|
146
|
+
results: [],
|
|
147
|
+
cache_hit: true,
|
|
148
|
+
cache_age_ms: 12345,
|
|
149
|
+
});
|
|
150
|
+
const result = await recall({ plan: "test plan" });
|
|
151
|
+
expect(result.performance.cache_hit).toBe(true);
|
|
152
|
+
expect(result.performance.cache_age_ms).toBe(12345);
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
//# sourceMappingURL=recall.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recall.test.js","sourceRoot":"","sources":["../../src/tools/recall.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Batch Scar Usage Recording Tool
|
|
3
|
+
* Records multiple scar usages in a single call for improved session close performance
|
|
4
|
+
*/
|
|
5
|
+
import type { RecordScarUsageBatchParams, RecordScarUsageBatchResult } from "../types/index.js";
|
|
6
|
+
/**
|
|
7
|
+
* Records multiple scar usages in a single batch operation
|
|
8
|
+
*/
|
|
9
|
+
export declare function recordScarUsageBatch(params: RecordScarUsageBatchParams): Promise<RecordScarUsageBatchResult>;
|
|
10
|
+
//# sourceMappingURL=record-scar-usage-batch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-scar-usage-batch.d.ts","sourceRoot":"","sources":["../../src/tools/record-scar-usage-batch.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EACV,0BAA0B,EAC1B,0BAA0B,EAG3B,MAAM,mBAAmB,CAAC;AA0E3B;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,0BAA0B,GACjC,OAAO,CAAC,0BAA0B,CAAC,CAuGrC"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Batch Scar Usage Recording Tool
|
|
3
|
+
* Records multiple scar usages in a single call for improved session close performance
|
|
4
|
+
*/
|
|
5
|
+
import { v4 as uuidv4 } from "uuid";
|
|
6
|
+
import * as supabase from "../services/supabase-client.js";
|
|
7
|
+
import { Timer, recordMetrics, buildPerformanceData } from "../services/metrics.js";
|
|
8
|
+
const TARGET_LATENCY_MS = 2000; // Target for batch operation
|
|
9
|
+
/**
|
|
10
|
+
* Resolves a scar identifier (UUID or title/description) to a UUID
|
|
11
|
+
* @param identifier - UUID or title/description to resolve
|
|
12
|
+
* @param project - Project filter
|
|
13
|
+
* @returns UUID or null if not found
|
|
14
|
+
*/
|
|
15
|
+
async function resolveScarIdentifier(identifier, project) {
|
|
16
|
+
// If it looks like a UUID, return as-is
|
|
17
|
+
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
18
|
+
if (uuidRegex.test(identifier)) {
|
|
19
|
+
return identifier;
|
|
20
|
+
}
|
|
21
|
+
// Otherwise, query by title or description
|
|
22
|
+
try {
|
|
23
|
+
const filters = {};
|
|
24
|
+
if (project) {
|
|
25
|
+
filters.project = project;
|
|
26
|
+
}
|
|
27
|
+
// Try exact title match first
|
|
28
|
+
const titleResult = await supabase.listRecords({
|
|
29
|
+
table: "orchestra_learnings",
|
|
30
|
+
columns: "id,title,description,scar_type,severity",
|
|
31
|
+
filters: { ...filters, title: identifier },
|
|
32
|
+
limit: 1,
|
|
33
|
+
});
|
|
34
|
+
if (titleResult && titleResult.length > 0) {
|
|
35
|
+
return titleResult[0].id;
|
|
36
|
+
}
|
|
37
|
+
// Try partial title match (get more records to search)
|
|
38
|
+
const partialResult = await supabase.listRecords({
|
|
39
|
+
table: "orchestra_learnings",
|
|
40
|
+
columns: "id,title,description,scar_type,severity",
|
|
41
|
+
filters: { ...filters },
|
|
42
|
+
limit: 100,
|
|
43
|
+
});
|
|
44
|
+
if (partialResult) {
|
|
45
|
+
// Find by case-insensitive contains
|
|
46
|
+
const match = partialResult.find((record) => record.title.toLowerCase().includes(identifier.toLowerCase()) ||
|
|
47
|
+
record.description?.toLowerCase().includes(identifier.toLowerCase()));
|
|
48
|
+
if (match) {
|
|
49
|
+
return match.id;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
console.error(`[record-scar-usage-batch] Error resolving identifier "${identifier}":`, error);
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Records multiple scar usages in a single batch operation
|
|
61
|
+
*/
|
|
62
|
+
export async function recordScarUsageBatch(params) {
|
|
63
|
+
const timer = new Timer();
|
|
64
|
+
const metricsId = uuidv4();
|
|
65
|
+
const usageIds = [];
|
|
66
|
+
const failedIdentifiers = [];
|
|
67
|
+
let resolvedCount = 0;
|
|
68
|
+
try {
|
|
69
|
+
// Resolve all scar identifiers to UUIDs in parallel
|
|
70
|
+
const resolutionPromises = params.scars.map(async (entry) => {
|
|
71
|
+
const scarId = await resolveScarIdentifier(entry.scar_identifier, params.project);
|
|
72
|
+
return { entry, scarId };
|
|
73
|
+
});
|
|
74
|
+
const resolvedScars = await Promise.all(resolutionPromises);
|
|
75
|
+
// Build usage records for all successfully resolved scars
|
|
76
|
+
const usageRecords = resolvedScars
|
|
77
|
+
.filter(({ scarId }) => scarId !== null)
|
|
78
|
+
.map(({ entry, scarId }) => {
|
|
79
|
+
const usageId = uuidv4();
|
|
80
|
+
return {
|
|
81
|
+
id: usageId,
|
|
82
|
+
scar_id: scarId,
|
|
83
|
+
issue_id: entry.issue_id || null,
|
|
84
|
+
issue_identifier: entry.issue_identifier || null,
|
|
85
|
+
session_id: entry.session_id || null, // OD-552: Session tracking
|
|
86
|
+
agent: entry.agent || null, // OD-552: Agent identity
|
|
87
|
+
surfaced_at: entry.surfaced_at,
|
|
88
|
+
acknowledged_at: entry.acknowledged_at || null,
|
|
89
|
+
referenced: entry.reference_type !== "none",
|
|
90
|
+
reference_type: entry.reference_type,
|
|
91
|
+
reference_context: entry.reference_context,
|
|
92
|
+
execution_successful: entry.execution_successful ?? null,
|
|
93
|
+
created_at: new Date().toISOString(),
|
|
94
|
+
};
|
|
95
|
+
});
|
|
96
|
+
// Track failed resolutions
|
|
97
|
+
resolvedScars.forEach(({ entry, scarId }) => {
|
|
98
|
+
if (scarId === null) {
|
|
99
|
+
failedIdentifiers.push(entry.scar_identifier);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
resolvedCount++;
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
// Insert all usage records in parallel
|
|
106
|
+
const insertPromises = usageRecords.map(async (record) => {
|
|
107
|
+
const result = await supabase.directUpsert("scar_usage", record);
|
|
108
|
+
return result?.id || null;
|
|
109
|
+
});
|
|
110
|
+
const insertResults = await Promise.all(insertPromises);
|
|
111
|
+
usageIds.push(...insertResults.filter((id) => id !== null));
|
|
112
|
+
const latencyMs = timer.stop();
|
|
113
|
+
const perfData = buildPerformanceData("record_scar_usage_batch", latencyMs, usageIds.length);
|
|
114
|
+
// Record metrics asynchronously
|
|
115
|
+
recordMetrics({
|
|
116
|
+
id: metricsId,
|
|
117
|
+
tool_name: "record_scar_usage_batch",
|
|
118
|
+
tables_searched: ["scar_usage", "orchestra_learnings"],
|
|
119
|
+
latency_ms: latencyMs,
|
|
120
|
+
result_count: usageIds.length,
|
|
121
|
+
phase_tag: "scar_tracking",
|
|
122
|
+
metadata: {
|
|
123
|
+
total_scars: params.scars.length,
|
|
124
|
+
resolved_count: resolvedCount,
|
|
125
|
+
failed_count: failedIdentifiers.length,
|
|
126
|
+
},
|
|
127
|
+
}).catch(() => {
|
|
128
|
+
// Swallow errors - metrics are non-critical
|
|
129
|
+
});
|
|
130
|
+
return {
|
|
131
|
+
success: true,
|
|
132
|
+
usage_ids: usageIds,
|
|
133
|
+
resolved_count: resolvedCount,
|
|
134
|
+
failed_count: failedIdentifiers.length,
|
|
135
|
+
failed_identifiers: failedIdentifiers.length > 0 ? failedIdentifiers : undefined,
|
|
136
|
+
performance: perfData,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
const latencyMs = timer.stop();
|
|
141
|
+
const perfData = buildPerformanceData("record_scar_usage_batch", latencyMs, 0);
|
|
142
|
+
console.error("[record-scar-usage-batch] Error recording batch:", error);
|
|
143
|
+
return {
|
|
144
|
+
success: false,
|
|
145
|
+
usage_ids: usageIds,
|
|
146
|
+
resolved_count: resolvedCount,
|
|
147
|
+
failed_count: params.scars.length - resolvedCount,
|
|
148
|
+
failed_identifiers: failedIdentifiers.length > 0 ? failedIdentifiers : undefined,
|
|
149
|
+
performance: perfData,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=record-scar-usage-batch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-scar-usage-batch.js","sourceRoot":"","sources":["../../src/tools/record-scar-usage-batch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* record_scar_usage Tool
|
|
3
|
+
*
|
|
4
|
+
* Track scar application for effectiveness measurement.
|
|
5
|
+
* Records to scar_usage table.
|
|
6
|
+
*
|
|
7
|
+
* Performance target: <1000ms (OD-429)
|
|
8
|
+
*/
|
|
9
|
+
import type { RecordScarUsageParams, RecordScarUsageResult } from "../types/index.js";
|
|
10
|
+
/**
|
|
11
|
+
* Execute record_scar_usage tool
|
|
12
|
+
*/
|
|
13
|
+
export declare function recordScarUsage(params: RecordScarUsageParams): Promise<RecordScarUsageResult>;
|
|
14
|
+
//# sourceMappingURL=record-scar-usage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-scar-usage.d.ts","sourceRoot":"","sources":["../../src/tools/record-scar-usage.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH,OAAO,KAAK,EACV,qBAAqB,EACrB,qBAAqB,EAEtB,MAAM,mBAAmB,CAAC;AAE3B;;GAEG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC,CAgFhC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* record_scar_usage Tool
|
|
3
|
+
*
|
|
4
|
+
* Track scar application for effectiveness measurement.
|
|
5
|
+
* Records to scar_usage table.
|
|
6
|
+
*
|
|
7
|
+
* Performance target: <1000ms (OD-429)
|
|
8
|
+
*/
|
|
9
|
+
import { v4 as uuidv4 } from "uuid";
|
|
10
|
+
import * as supabase from "../services/supabase-client.js";
|
|
11
|
+
import { hasSupabase } from "../services/tier.js";
|
|
12
|
+
import { getStorage } from "../services/storage.js";
|
|
13
|
+
import { Timer, recordMetrics, buildPerformanceData, } from "../services/metrics.js";
|
|
14
|
+
/**
|
|
15
|
+
* Execute record_scar_usage tool
|
|
16
|
+
*/
|
|
17
|
+
export async function recordScarUsage(params) {
|
|
18
|
+
const timer = new Timer();
|
|
19
|
+
const metricsId = uuidv4();
|
|
20
|
+
const usageId = uuidv4();
|
|
21
|
+
const usageData = {
|
|
22
|
+
id: usageId,
|
|
23
|
+
scar_id: params.scar_id,
|
|
24
|
+
issue_id: params.issue_id || null,
|
|
25
|
+
issue_identifier: params.issue_identifier || null,
|
|
26
|
+
session_id: params.session_id || null, // OD-552: Session tracking
|
|
27
|
+
agent: params.agent || null, // OD-552: Agent identity
|
|
28
|
+
surfaced_at: params.surfaced_at,
|
|
29
|
+
acknowledged_at: params.acknowledged_at || null,
|
|
30
|
+
referenced: params.reference_type !== "none",
|
|
31
|
+
reference_type: params.reference_type,
|
|
32
|
+
reference_context: params.reference_context,
|
|
33
|
+
execution_successful: params.execution_successful ?? null,
|
|
34
|
+
created_at: new Date().toISOString(),
|
|
35
|
+
};
|
|
36
|
+
try {
|
|
37
|
+
const breakdown = {};
|
|
38
|
+
if (hasSupabase()) {
|
|
39
|
+
const upsertStart = Date.now();
|
|
40
|
+
await supabase.directUpsert("scar_usage", usageData);
|
|
41
|
+
breakdown.upsert = {
|
|
42
|
+
latency_ms: Date.now() - upsertStart,
|
|
43
|
+
source: "supabase",
|
|
44
|
+
cache_status: "not_applicable",
|
|
45
|
+
network_call: true,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
const upsertStart = Date.now();
|
|
50
|
+
await getStorage().upsert("scar_usage", usageData);
|
|
51
|
+
breakdown.upsert = {
|
|
52
|
+
latency_ms: Date.now() - upsertStart,
|
|
53
|
+
source: "memory",
|
|
54
|
+
cache_status: "not_applicable",
|
|
55
|
+
network_call: false,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
const latencyMs = timer.stop();
|
|
59
|
+
const perfData = buildPerformanceData("record_scar_usage", latencyMs, 1, {
|
|
60
|
+
breakdown,
|
|
61
|
+
});
|
|
62
|
+
// Record metrics
|
|
63
|
+
recordMetrics({
|
|
64
|
+
id: metricsId,
|
|
65
|
+
tool_name: "record_scar_usage",
|
|
66
|
+
tables_searched: ["scar_usage"],
|
|
67
|
+
latency_ms: latencyMs,
|
|
68
|
+
result_count: 1,
|
|
69
|
+
phase_tag: "scar_tracking",
|
|
70
|
+
linear_issue: params.issue_identifier,
|
|
71
|
+
memories_surfaced: [params.scar_id],
|
|
72
|
+
metadata: {
|
|
73
|
+
reference_type: params.reference_type,
|
|
74
|
+
execution_successful: params.execution_successful,
|
|
75
|
+
},
|
|
76
|
+
}).catch(() => { });
|
|
77
|
+
return {
|
|
78
|
+
success: true,
|
|
79
|
+
usage_id: usageId,
|
|
80
|
+
performance: perfData,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
console.error("[record_scar_usage] Failed:", error);
|
|
85
|
+
const latencyMs = timer.stop();
|
|
86
|
+
const perfData = buildPerformanceData("record_scar_usage", latencyMs, 0);
|
|
87
|
+
return {
|
|
88
|
+
success: false,
|
|
89
|
+
usage_id: "",
|
|
90
|
+
performance: perfData,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=record-scar-usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-scar-usage.js","sourceRoot":"","sources":["../../src/tools/record-scar-usage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* resolve_thread Tool (OD-thread-lifecycle, OD-621)
|
|
3
|
+
*
|
|
4
|
+
* Mark an open thread as resolved. Supports resolution by:
|
|
5
|
+
* - thread_id: exact match (preferred)
|
|
6
|
+
* - text_match: case-insensitive substring match (fallback)
|
|
7
|
+
*
|
|
8
|
+
* OD-621: Updates Supabase (source of truth) + local file (cache).
|
|
9
|
+
* Falls back to local-only if Supabase is unavailable or thread
|
|
10
|
+
* doesn't exist in Supabase.
|
|
11
|
+
*
|
|
12
|
+
* Performance target: <500ms (Supabase update + file write)
|
|
13
|
+
*/
|
|
14
|
+
import type { ResolveThreadParams, ResolveThreadResult } from "../types/index.js";
|
|
15
|
+
export declare function resolveThread(params: ResolveThreadParams): Promise<ResolveThreadResult>;
|
|
16
|
+
//# sourceMappingURL=resolve-thread.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-thread.d.ts","sourceRoot":"","sources":["../../src/tools/resolve-thread.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAkBH,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAElF,wBAAsB,aAAa,CACjC,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,mBAAmB,CAAC,CA0F9B"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* resolve_thread Tool (OD-thread-lifecycle, OD-621)
|
|
3
|
+
*
|
|
4
|
+
* Mark an open thread as resolved. Supports resolution by:
|
|
5
|
+
* - thread_id: exact match (preferred)
|
|
6
|
+
* - text_match: case-insensitive substring match (fallback)
|
|
7
|
+
*
|
|
8
|
+
* OD-621: Updates Supabase (source of truth) + local file (cache).
|
|
9
|
+
* Falls back to local-only if Supabase is unavailable or thread
|
|
10
|
+
* doesn't exist in Supabase.
|
|
11
|
+
*
|
|
12
|
+
* Performance target: <500ms (Supabase update + file write)
|
|
13
|
+
*/
|
|
14
|
+
import { v4 as uuidv4 } from "uuid";
|
|
15
|
+
import { getThreads, getCurrentSession } from "../services/session-state.js";
|
|
16
|
+
import { resolveThread as resolveThreadInList, loadThreadsFile, saveThreadsFile, } from "../services/thread-manager.js";
|
|
17
|
+
import { resolveThreadInSupabase } from "../services/thread-supabase.js";
|
|
18
|
+
import { writeTriplesForThreadResolution } from "../services/triple-writer.js";
|
|
19
|
+
import { getAgentIdentity } from "../services/agent-detection.js";
|
|
20
|
+
import { Timer, recordMetrics, buildPerformanceData, } from "../services/metrics.js";
|
|
21
|
+
import { formatThreadForDisplay } from "../services/timezone.js";
|
|
22
|
+
export async function resolveThread(params) {
|
|
23
|
+
const timer = new Timer();
|
|
24
|
+
const metricsId = uuidv4();
|
|
25
|
+
// Validate: need at least one of thread_id or text_match
|
|
26
|
+
if (!params.thread_id && !params.text_match) {
|
|
27
|
+
const latencyMs = timer.stop();
|
|
28
|
+
return {
|
|
29
|
+
success: false,
|
|
30
|
+
error: "Either thread_id or text_match is required",
|
|
31
|
+
performance: buildPerformanceData("resolve_thread", latencyMs, 0),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
// Load threads from session state, fall back to file
|
|
35
|
+
let threads = getThreads();
|
|
36
|
+
let fromFile = false;
|
|
37
|
+
if (threads.length === 0) {
|
|
38
|
+
threads = loadThreadsFile();
|
|
39
|
+
fromFile = true;
|
|
40
|
+
}
|
|
41
|
+
const session = getCurrentSession();
|
|
42
|
+
const sessionId = session?.sessionId;
|
|
43
|
+
// Resolve the thread locally (in-memory / file)
|
|
44
|
+
const resolved = resolveThreadInList(threads, {
|
|
45
|
+
threadId: params.thread_id,
|
|
46
|
+
textMatch: params.text_match,
|
|
47
|
+
sessionId,
|
|
48
|
+
resolutionNote: params.resolution_note,
|
|
49
|
+
});
|
|
50
|
+
if (!resolved) {
|
|
51
|
+
const latencyMs = timer.stop();
|
|
52
|
+
const searchKey = params.thread_id || params.text_match;
|
|
53
|
+
return {
|
|
54
|
+
success: false,
|
|
55
|
+
error: `Thread not found: "${searchKey}"`,
|
|
56
|
+
performance: buildPerformanceData("resolve_thread", latencyMs, 0),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// Persist to local file (cache)
|
|
60
|
+
saveThreadsFile(threads);
|
|
61
|
+
// OD-621: Update Supabase (source of truth) — graceful fallback on failure
|
|
62
|
+
let supabaseSynced = false;
|
|
63
|
+
const supabaseSuccess = await resolveThreadInSupabase(resolved.id, {
|
|
64
|
+
resolvedAt: resolved.resolved_at,
|
|
65
|
+
resolutionNote: resolved.resolution_note,
|
|
66
|
+
resolvedBySession: resolved.resolved_by_session || sessionId,
|
|
67
|
+
});
|
|
68
|
+
if (supabaseSuccess) {
|
|
69
|
+
supabaseSynced = true;
|
|
70
|
+
}
|
|
71
|
+
const latencyMs = timer.stop();
|
|
72
|
+
const perfData = buildPerformanceData("resolve_thread", latencyMs, 1);
|
|
73
|
+
recordMetrics({
|
|
74
|
+
id: metricsId,
|
|
75
|
+
tool_name: "resolve_thread",
|
|
76
|
+
query_text: `resolve:${params.thread_id || "text:" + params.text_match}`,
|
|
77
|
+
tables_searched: supabaseSynced ? ["orchestra_threads"] : [],
|
|
78
|
+
latency_ms: latencyMs,
|
|
79
|
+
result_count: 1,
|
|
80
|
+
phase_tag: "ad_hoc",
|
|
81
|
+
metadata: {
|
|
82
|
+
thread_id: resolved.id,
|
|
83
|
+
resolution_note: params.resolution_note,
|
|
84
|
+
supabase_synced: supabaseSynced,
|
|
85
|
+
},
|
|
86
|
+
}).catch(() => { });
|
|
87
|
+
// Phase 4: Knowledge graph triples (fire-and-forget)
|
|
88
|
+
writeTriplesForThreadResolution({
|
|
89
|
+
thread_id: resolved.id,
|
|
90
|
+
text: resolved.text,
|
|
91
|
+
resolution_note: params.resolution_note,
|
|
92
|
+
session_id: sessionId,
|
|
93
|
+
project: "orchestra_dev",
|
|
94
|
+
agent: getAgentIdentity(),
|
|
95
|
+
}).catch(() => { });
|
|
96
|
+
return {
|
|
97
|
+
success: true,
|
|
98
|
+
resolved_thread: formatThreadForDisplay(resolved),
|
|
99
|
+
performance: perfData,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=resolve-thread.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-thread.js","sourceRoot":"","sources":["../../src/tools/resolve-thread.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* save_transcript Tool
|
|
3
|
+
*
|
|
4
|
+
* Save full session transcript to Supabase storage for training data,
|
|
5
|
+
* post-mortems, and pattern mining.
|
|
6
|
+
*
|
|
7
|
+
* Issue: OD-467
|
|
8
|
+
*/
|
|
9
|
+
import type { Project, PerformanceData } from "../types/index.js";
|
|
10
|
+
export interface SaveTranscriptParams {
|
|
11
|
+
session_id: string;
|
|
12
|
+
transcript: string;
|
|
13
|
+
format?: "json" | "markdown";
|
|
14
|
+
project?: Project;
|
|
15
|
+
}
|
|
16
|
+
export interface SaveTranscriptResult {
|
|
17
|
+
success: boolean;
|
|
18
|
+
transcript_path?: string;
|
|
19
|
+
size_bytes?: number;
|
|
20
|
+
size_kb?: number;
|
|
21
|
+
estimated_tokens?: number;
|
|
22
|
+
error?: string;
|
|
23
|
+
performance: PerformanceData;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Execute save_transcript tool
|
|
27
|
+
*/
|
|
28
|
+
export declare function saveTranscript(params: SaveTranscriptParams): Promise<SaveTranscriptResult>;
|
|
29
|
+
//# sourceMappingURL=save-transcript.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"save-transcript.d.ts","sourceRoot":"","sources":["../../src/tools/save-transcript.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAwB,MAAM,mBAAmB,CAAC;AAExF,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,eAAe,CAAC;CAC9B;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,oBAAoB,CAAC,CA0F/B"}
|