@noyrax/5d-database-plugin 0.1.14-beta.5 → 0.1.14-beta.8

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.
Files changed (121) hide show
  1. package/out/api/adr-api.d.ts +0 -6
  2. package/out/api/adr-api.d.ts.map +1 -1
  3. package/out/api/adr-api.js +14 -49
  4. package/out/api/adr-api.js.map +1 -1
  5. package/out/api/bootstrap-api.d.ts +4 -1
  6. package/out/api/bootstrap-api.d.ts.map +1 -1
  7. package/out/api/bootstrap-api.js +27 -4
  8. package/out/api/bootstrap-api.js.map +1 -1
  9. package/out/api/context-builder.d.ts.map +1 -1
  10. package/out/api/context-builder.js +21 -5
  11. package/out/api/context-builder.js.map +1 -1
  12. package/out/api/evidence-grader.d.ts +83 -0
  13. package/out/api/evidence-grader.d.ts.map +1 -0
  14. package/out/api/evidence-grader.js +161 -0
  15. package/out/api/evidence-grader.js.map +1 -0
  16. package/out/api/index.d.ts +5 -0
  17. package/out/api/index.d.ts.map +1 -1
  18. package/out/api/index.js +11 -1
  19. package/out/api/index.js.map +1 -1
  20. package/out/api/learning-path-api.d.ts +3 -0
  21. package/out/api/learning-path-api.d.ts.map +1 -1
  22. package/out/api/learning-path-api.js +15 -2
  23. package/out/api/learning-path-api.js.map +1 -1
  24. package/out/api/module-api.d.ts +0 -1
  25. package/out/api/module-api.d.ts.map +1 -1
  26. package/out/api/module-api.js +4 -38
  27. package/out/api/module-api.js.map +1 -1
  28. package/out/api/self-explanation-api.d.ts +11 -1
  29. package/out/api/self-explanation-api.d.ts.map +1 -1
  30. package/out/api/self-explanation-api.js +285 -19
  31. package/out/api/self-explanation-api.js.map +1 -1
  32. package/out/api/semantic-search-api.d.ts +3 -0
  33. package/out/api/semantic-search-api.d.ts.map +1 -1
  34. package/out/api/semantic-search-api.js +39 -2
  35. package/out/api/semantic-search-api.js.map +1 -1
  36. package/out/api/source-access-contract-api.d.ts +60 -0
  37. package/out/api/source-access-contract-api.d.ts.map +1 -0
  38. package/out/api/source-access-contract-api.js +231 -0
  39. package/out/api/source-access-contract-api.js.map +1 -0
  40. package/out/api/source-snippet-api.d.ts +58 -0
  41. package/out/api/source-snippet-api.d.ts.map +1 -0
  42. package/out/api/source-snippet-api.js +187 -0
  43. package/out/api/source-snippet-api.js.map +1 -0
  44. package/out/api/vector-backend-status-api.d.ts +68 -0
  45. package/out/api/vector-backend-status-api.d.ts.map +1 -0
  46. package/out/api/vector-backend-status-api.js +241 -0
  47. package/out/api/vector-backend-status-api.js.map +1 -0
  48. package/out/cli/ingest-cli.js +44 -5
  49. package/out/cli/ingest-cli.js.map +1 -1
  50. package/out/cli/tool-cli.js +1 -1
  51. package/out/cli/tool-cli.js.map +1 -1
  52. package/out/core/migration-manager.d.ts.map +1 -1
  53. package/out/core/migration-manager.js +61 -32
  54. package/out/core/migration-manager.js.map +1 -1
  55. package/out/core/multi-db-manager.d.ts +26 -0
  56. package/out/core/multi-db-manager.d.ts.map +1 -1
  57. package/out/core/multi-db-manager.js +143 -2
  58. package/out/core/multi-db-manager.js.map +1 -1
  59. package/out/core/path-normalizer.d.ts +46 -0
  60. package/out/core/path-normalizer.d.ts.map +1 -0
  61. package/out/core/path-normalizer.js +152 -0
  62. package/out/core/path-normalizer.js.map +1 -0
  63. package/out/ingestors/adr-ingestor.d.ts.map +1 -1
  64. package/out/ingestors/adr-ingestor.js +7 -8
  65. package/out/ingestors/adr-ingestor.js.map +1 -1
  66. package/out/ingestors/module-ingestor.d.ts.map +1 -1
  67. package/out/ingestors/module-ingestor.js +17 -0
  68. package/out/ingestors/module-ingestor.js.map +1 -1
  69. package/out/ingestors/symbol-ingestor.d.ts.map +1 -1
  70. package/out/ingestors/symbol-ingestor.js +24 -2
  71. package/out/ingestors/symbol-ingestor.js.map +1 -1
  72. package/out/mcp/tools/gap-analysis.d.ts +16 -2
  73. package/out/mcp/tools/gap-analysis.d.ts.map +1 -1
  74. package/out/mcp/tools/gap-analysis.js +177 -31
  75. package/out/mcp/tools/gap-analysis.js.map +1 -1
  76. package/out/mcp/tools/learning-path.d.ts.map +1 -1
  77. package/out/mcp/tools/learning-path.js +19 -5
  78. package/out/mcp/tools/learning-path.js.map +1 -1
  79. package/out/mcp/tools/semantic-discovery.d.ts.map +1 -1
  80. package/out/mcp/tools/semantic-discovery.js +44 -4
  81. package/out/mcp/tools/semantic-discovery.js.map +1 -1
  82. package/out/mcp/tools/source-access-contract.d.ts +26 -0
  83. package/out/mcp/tools/source-access-contract.d.ts.map +1 -0
  84. package/out/mcp/tools/source-access-contract.js +45 -0
  85. package/out/mcp/tools/source-access-contract.js.map +1 -0
  86. package/out/mcp/tools/source-snippet.d.ts +71 -0
  87. package/out/mcp/tools/source-snippet.d.ts.map +1 -0
  88. package/out/mcp/tools/source-snippet.js +82 -0
  89. package/out/mcp/tools/source-snippet.js.map +1 -0
  90. package/out/models/action-hint.d.ts +36 -0
  91. package/out/models/action-hint.d.ts.map +1 -0
  92. package/out/models/action-hint.js +38 -0
  93. package/out/models/action-hint.js.map +1 -0
  94. package/out/models/evidence.d.ts +68 -0
  95. package/out/models/evidence.d.ts.map +1 -0
  96. package/out/models/evidence.js +91 -0
  97. package/out/models/evidence.js.map +1 -0
  98. package/out/models/module.d.ts +2 -0
  99. package/out/models/module.d.ts.map +1 -1
  100. package/out/models/reason-codes.d.ts +52 -0
  101. package/out/models/reason-codes.d.ts.map +1 -0
  102. package/out/models/reason-codes.js +83 -0
  103. package/out/models/reason-codes.js.map +1 -0
  104. package/out/models/symbol.d.ts +6 -0
  105. package/out/models/symbol.d.ts.map +1 -1
  106. package/out/repositories/module-repository.d.ts.map +1 -1
  107. package/out/repositories/module-repository.js +9 -3
  108. package/out/repositories/module-repository.js.map +1 -1
  109. package/out/repositories/symbol-repository.d.ts.map +1 -1
  110. package/out/repositories/symbol-repository.js +22 -4
  111. package/out/repositories/symbol-repository.js.map +1 -1
  112. package/out/services/cross-dimension-linker.d.ts +0 -5
  113. package/out/services/cross-dimension-linker.d.ts.map +1 -1
  114. package/out/services/cross-dimension-linker.js +2 -35
  115. package/out/services/cross-dimension-linker.js.map +1 -1
  116. package/package.json +196 -196
  117. package/schemas/sqlite/001_add_source_code_spans_modules.sql +7 -0
  118. package/schemas/sqlite/001_z_add_source_code_spans_modules.sql +13 -0
  119. package/schemas/sqlite/002_add_source_code_spans_symbols.sql +15 -0
  120. package/schemas/sqlite/002_z_add_source_code_spans_symbols.sql +21 -0
  121. package/schemas/sqlite/006_add_source_access_config.sql +33 -0
@@ -0,0 +1,231 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.SourceAccessContractApi = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const reason_codes_1 = require("../models/reason-codes");
40
+ const evidence_1 = require("../models/evidence");
41
+ const evidence_2 = require("../models/evidence");
42
+ /**
43
+ * API for managing source access contract.
44
+ * Determines whether source code is available and provides runtime status.
45
+ */
46
+ class SourceAccessContractApi {
47
+ constructor(dbManager) {
48
+ this.dbManager = dbManager;
49
+ }
50
+ /**
51
+ * Get current source access contract.
52
+ * Deterministically checks if workspace root is accessible.
53
+ */
54
+ async getContract(workspaceRoot) {
55
+ const db = await this.dbManager.getDatabase('V');
56
+ // Read from database
57
+ const row = await this.queryOne(db, `
58
+ SELECT * FROM source_access_config WHERE id = 'singleton'
59
+ `);
60
+ if (!row) {
61
+ // No config yet - initialize
62
+ return this.initializeContract(workspaceRoot || this.dbManager.getWorkspaceRoot());
63
+ }
64
+ // Check if contract is uninitialized (migration default value)
65
+ // Uninitialized contract has: status='UNAVAILABLE', workspace_root=null, no reason_codes
66
+ const isUninitialized = row.status === 'UNAVAILABLE' &&
67
+ !row.workspace_root &&
68
+ !row.reason_codes_json;
69
+ if (isUninitialized) {
70
+ // Contract exists but is uninitialized - initialize it
71
+ return this.initializeContract(workspaceRoot || this.dbManager.getWorkspaceRoot());
72
+ }
73
+ const contract = {
74
+ status: row.status,
75
+ resolver_type: row.resolver_type,
76
+ workspace_root: row.workspace_root,
77
+ constraints: row.max_bytes_per_request ? {
78
+ max_bytes_per_request: row.max_bytes_per_request,
79
+ max_lines_per_request: row.max_lines_per_request,
80
+ max_concurrent_requests: row.max_concurrent_requests,
81
+ redactions: JSON.parse(row.redactions_json || '[]')
82
+ } : null,
83
+ reason_codes: row.reason_codes_json ? JSON.parse(row.reason_codes_json).map((code) => {
84
+ return reason_codes_1.ReasonCode[code] || reason_codes_1.ReasonCode.NOT_MOUNTED;
85
+ }) : [],
86
+ verified_at: row.verified_at,
87
+ evidence_grade: row.evidence_grade,
88
+ evidence: (0, evidence_1.createFactEvidence)([
89
+ (0, evidence_2.createEvidenceSource)('DB_QUERY', undefined, undefined, undefined, { table: 'source_access_config' })
90
+ ], 'Source access contract retrieved from database')
91
+ };
92
+ // CRITICAL: Auto-correct workspace_root if it doesn't match MultiDbManager's workspace root
93
+ // This handles cases where:
94
+ // - Workspace was moved/renamed
95
+ // - Contract was initialized with wrong workspace_root (e.g. process.cwd() on different system)
96
+ // - Contract was restored from backup with different workspace_root
97
+ // - Different path representations (e.g. D:\ vs d:\ on Windows)
98
+ const dbWorkspaceRoot = this.dbManager.getWorkspaceRoot();
99
+ const contractWorkspaceRoot = contract.workspace_root;
100
+ if (contractWorkspaceRoot) {
101
+ // Normalize both paths for comparison (path.resolve handles case normalization on Windows)
102
+ const normalizedDbRoot = path.resolve(dbWorkspaceRoot);
103
+ const normalizedContractRoot = path.resolve(contractWorkspaceRoot);
104
+ if (normalizedContractRoot !== normalizedDbRoot) {
105
+ // Workspace root mismatch detected - re-initialize with correct workspace root
106
+ return this.initializeContract(workspaceRoot || dbWorkspaceRoot);
107
+ }
108
+ }
109
+ // Verify current status (check if workspace still accessible)
110
+ if (contract.status === 'AVAILABLE' && contract.workspace_root) {
111
+ if (!fs.existsSync(contract.workspace_root)) {
112
+ // Workspace no longer accessible
113
+ return this.updateContract('UNAVAILABLE', [reason_codes_1.ReasonCode.NOT_MOUNTED], workspaceRoot);
114
+ }
115
+ }
116
+ // If contract has UNAVAILABLE status with NOT_MOUNTED and a workspace_root that doesn't exist,
117
+ // and a different workspaceRoot is provided, re-initialize with the new workspaceRoot
118
+ if (contract.status === 'UNAVAILABLE' &&
119
+ contract.workspace_root &&
120
+ contract.reason_codes?.includes(reason_codes_1.ReasonCode.NOT_MOUNTED) &&
121
+ !fs.existsSync(contract.workspace_root) &&
122
+ workspaceRoot &&
123
+ workspaceRoot !== contract.workspace_root &&
124
+ fs.existsSync(workspaceRoot)) {
125
+ // Old workspace_root doesn't exist, but new workspaceRoot is provided and exists - re-initialize
126
+ return this.initializeContract(workspaceRoot);
127
+ }
128
+ return contract;
129
+ }
130
+ /**
131
+ * Initialize source access contract.
132
+ */
133
+ async initializeContract(workspaceRoot) {
134
+ // Check if workspace is accessible
135
+ const isAccessible = fs.existsSync(workspaceRoot);
136
+ if (!isAccessible) {
137
+ return this.updateContract('UNAVAILABLE', [reason_codes_1.ReasonCode.NOT_MOUNTED], workspaceRoot);
138
+ }
139
+ // Check read permissions
140
+ try {
141
+ fs.accessSync(workspaceRoot, fs.constants.R_OK);
142
+ }
143
+ catch (error) {
144
+ return this.updateContract('UNAVAILABLE', [reason_codes_1.ReasonCode.PERMISSION_DENIED], workspaceRoot);
145
+ }
146
+ // All good - set as AVAILABLE
147
+ return this.updateContract('AVAILABLE', [], workspaceRoot, {
148
+ resolver_type: 'FILESYSTEM',
149
+ constraints: {
150
+ max_bytes_per_request: 51200, // 50KB
151
+ max_lines_per_request: 500,
152
+ max_concurrent_requests: 5,
153
+ redactions: ['*.env', '.git/*', 'node_modules/*', '*.key', '*.pem']
154
+ }
155
+ });
156
+ }
157
+ /**
158
+ * Update source access contract.
159
+ */
160
+ async updateContract(status, reasonCodes, workspaceRoot, options) {
161
+ const db = await this.dbManager.getDatabase('V');
162
+ const now = new Date().toISOString();
163
+ const workspaceRootToUse = workspaceRoot || (status === 'AVAILABLE' ? this.dbManager.getWorkspaceRoot() : null);
164
+ await this.execute(db, `
165
+ INSERT OR REPLACE INTO source_access_config (
166
+ id, status, resolver_type, workspace_root,
167
+ max_bytes_per_request, max_lines_per_request, max_concurrent_requests,
168
+ redactions_json, reason_codes_json,
169
+ verified_at, evidence_grade, updated_at
170
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
171
+ `, [
172
+ 'singleton',
173
+ status,
174
+ options?.resolver_type || null,
175
+ workspaceRootToUse,
176
+ options?.constraints?.max_bytes_per_request || null,
177
+ options?.constraints?.max_lines_per_request || null,
178
+ options?.constraints?.max_concurrent_requests || null,
179
+ JSON.stringify(options?.constraints?.redactions || []),
180
+ JSON.stringify(reasonCodes.map(code => code.toString())),
181
+ now,
182
+ 'DETERMINISTIC',
183
+ now
184
+ ]);
185
+ // Return contract directly without calling getContract (to avoid recursion)
186
+ return {
187
+ status,
188
+ resolver_type: options?.resolver_type || null,
189
+ workspace_root: workspaceRootToUse,
190
+ constraints: options?.constraints || null,
191
+ reason_codes: reasonCodes,
192
+ verified_at: now,
193
+ evidence_grade: 'DETERMINISTIC',
194
+ evidence: (0, evidence_1.createFactEvidence)([
195
+ (0, evidence_2.createEvidenceSource)('DB_QUERY', undefined, undefined, undefined, { table: 'source_access_config' })
196
+ ], 'Source access contract updated')
197
+ };
198
+ }
199
+ /**
200
+ * Helper method to execute a query and return a single row.
201
+ */
202
+ async queryOne(db, sql, params = []) {
203
+ return new Promise((resolve, reject) => {
204
+ db.get(sql, params, (err, row) => {
205
+ if (err) {
206
+ reject(err);
207
+ }
208
+ else {
209
+ resolve(row);
210
+ }
211
+ });
212
+ });
213
+ }
214
+ /**
215
+ * Helper method to execute a query.
216
+ */
217
+ async execute(db, sql, params = []) {
218
+ return new Promise((resolve, reject) => {
219
+ db.run(sql, params, (err) => {
220
+ if (err) {
221
+ reject(err);
222
+ }
223
+ else {
224
+ resolve();
225
+ }
226
+ });
227
+ });
228
+ }
229
+ }
230
+ exports.SourceAccessContractApi = SourceAccessContractApi;
231
+ //# sourceMappingURL=source-access-contract-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-access-contract-api.js","sourceRoot":"","sources":["../../src/api/source-access-contract-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import { MultiDbManager } from '../core/multi-db-manager';
2
+ import { ReasonCode } from '../models/reason-codes';
3
+ import { Evidence } from '../models/evidence';
4
+ /**
5
+ * Source code snippet with metadata.
6
+ */
7
+ export interface SourceSnippet {
8
+ file_path: string;
9
+ start_line: number;
10
+ end_line: number;
11
+ core_start_line: number;
12
+ core_end_line: number;
13
+ snippet: string;
14
+ content_hash: string;
15
+ byte_size: number;
16
+ evidence: Evidence;
17
+ }
18
+ /**
19
+ * Source snippet error.
20
+ */
21
+ export interface SourceSnippetError {
22
+ error: 'SOURCE_UNAVAILABLE' | 'SYMBOL_NOT_FOUND' | 'SNIPPET_TOO_LARGE' | 'FILE_NOT_FOUND' | 'HASH_MISMATCH';
23
+ reason_codes?: ReasonCode[];
24
+ symbol_id?: string;
25
+ requested_lines?: number;
26
+ max_allowed?: number;
27
+ file_path?: string;
28
+ resolved_path?: string;
29
+ expected_hash?: string;
30
+ computed_hash?: string;
31
+ evidence: Evidence;
32
+ }
33
+ /**
34
+ * API for fetching source code snippets.
35
+ * Provides gated access with size limits and hash verification.
36
+ */
37
+ export declare class SourceSnippetApi {
38
+ private contractApi;
39
+ private dbManager;
40
+ constructor(dbManager: MultiDbManager);
41
+ /**
42
+ * Fetch source code snippet by symbol ID or file path + range.
43
+ * Gated access with size limits and hash verification.
44
+ */
45
+ fetchSnippet(args: {
46
+ symbol_id?: string;
47
+ file_path?: string;
48
+ start_line?: number;
49
+ end_line?: number;
50
+ content_hash?: string;
51
+ include_context?: boolean;
52
+ context_lines?: number;
53
+ verify_hash?: boolean;
54
+ pluginId: string;
55
+ workspaceRoot?: string;
56
+ }): Promise<SourceSnippet | SourceSnippetError>;
57
+ }
58
+ //# sourceMappingURL=source-snippet-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-snippet-api.d.ts","sourceRoot":"","sources":["../../src/api/source-snippet-api.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG1D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAsB,MAAM,oBAAoB,CAAC;AAGlE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAC/B,KAAK,EAAE,oBAAoB,GAAG,kBAAkB,GAAG,mBAAmB,GAAG,gBAAgB,GAAG,eAAe,CAAC;IAC5G,YAAY,CAAC,EAAE,UAAU,EAAE,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,QAAQ,CAAC;CACtB;AAED;;;GAGG;AACH,qBAAa,gBAAgB;IACzB,OAAO,CAAC,WAAW,CAA0B;IAC7C,OAAO,CAAC,SAAS,CAAiB;gBAEtB,SAAS,EAAE,cAAc;IAKrC;;;OAGG;IACG,YAAY,CAAC,IAAI,EAAE;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,eAAe,CAAC,EAAE,OAAO,CAAC;QAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;KAC1B,GAAG,OAAO,CAAC,aAAa,GAAG,kBAAkB,CAAC;CAmJlD"}
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.SourceSnippetApi = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const crypto = __importStar(require("crypto"));
40
+ const source_access_contract_api_1 = require("./source-access-contract-api");
41
+ const symbol_repository_1 = require("../repositories/symbol-repository");
42
+ const evidence_1 = require("../models/evidence");
43
+ const evidence_2 = require("../models/evidence");
44
+ /**
45
+ * API for fetching source code snippets.
46
+ * Provides gated access with size limits and hash verification.
47
+ */
48
+ class SourceSnippetApi {
49
+ constructor(dbManager) {
50
+ this.dbManager = dbManager;
51
+ this.contractApi = new source_access_contract_api_1.SourceAccessContractApi(dbManager);
52
+ }
53
+ /**
54
+ * Fetch source code snippet by symbol ID or file path + range.
55
+ * Gated access with size limits and hash verification.
56
+ */
57
+ async fetchSnippet(args) {
58
+ // 1. Get source access contract
59
+ const contract = await this.contractApi.getContract(args.workspaceRoot);
60
+ if (contract.status === 'UNAVAILABLE') {
61
+ return {
62
+ error: 'SOURCE_UNAVAILABLE',
63
+ reason_codes: contract.reason_codes,
64
+ evidence: (0, evidence_1.createFactEvidence)([
65
+ (0, evidence_2.createEvidenceSource)('DB_QUERY', undefined, undefined, undefined, {
66
+ table: 'source_access_config',
67
+ status: contract.status
68
+ })
69
+ ], `Source code unavailable: ${contract.reason_codes?.map(code => code.toString()).join(', ')}`)
70
+ };
71
+ }
72
+ // 2. Resolve symbol to span (if symbol_id provided)
73
+ let filePath = args.file_path;
74
+ let startLine = args.start_line;
75
+ let endLine = args.end_line;
76
+ if (args.symbol_id) {
77
+ const db = await this.dbManager.getDatabase('Y');
78
+ const repository = new symbol_repository_1.SymbolRepository(db);
79
+ // Try to find symbol by symbol_id
80
+ const symbol = await repository.getBySymbolId(args.symbol_id, args.pluginId);
81
+ if (!symbol) {
82
+ return {
83
+ error: 'SYMBOL_NOT_FOUND',
84
+ symbol_id: args.symbol_id,
85
+ evidence: (0, evidence_1.createFactEvidence)([
86
+ (0, evidence_2.createEvidenceSource)('DB_QUERY', args.symbol_id, undefined, undefined, {
87
+ table: 'symbols',
88
+ plugin_id: args.pluginId
89
+ })
90
+ ], `Symbol ${args.symbol_id} not found in database`)
91
+ };
92
+ }
93
+ if (!symbol.start_line || !symbol.end_line) {
94
+ return {
95
+ error: 'SYMBOL_NOT_FOUND',
96
+ symbol_id: args.symbol_id,
97
+ evidence: (0, evidence_1.createFactEvidence)([
98
+ (0, evidence_2.createEvidenceSource)('DB_QUERY', args.symbol_id, symbol.path, undefined, {
99
+ table: 'symbols',
100
+ note: 'Symbol found but missing span information'
101
+ })
102
+ ], `Symbol ${args.symbol_id} found but missing span information (start_line/end_line)`)
103
+ };
104
+ }
105
+ filePath = symbol.path;
106
+ startLine = symbol.start_line;
107
+ endLine = symbol.end_line;
108
+ }
109
+ if (!filePath || !startLine || !endLine) {
110
+ throw new Error('Either symbol_id OR (file_path + start_line + end_line) must be provided');
111
+ }
112
+ // 3. Size check (gating!)
113
+ const requestedLines = endLine - startLine + 1;
114
+ const contextLines = args.include_context ? (args.context_lines || 5) : 0;
115
+ const totalLines = requestedLines + (contextLines * 2);
116
+ if (contract.constraints && totalLines > contract.constraints.max_lines_per_request) {
117
+ return {
118
+ error: 'SNIPPET_TOO_LARGE',
119
+ requested_lines: totalLines,
120
+ max_allowed: contract.constraints.max_lines_per_request,
121
+ evidence: (0, evidence_1.createFactEvidence)([
122
+ (0, evidence_2.createEvidenceSource)('DB_QUERY', undefined, undefined, undefined, {
123
+ table: 'source_access_config',
124
+ constraint: 'max_lines_per_request'
125
+ })
126
+ ], `Requested ${totalLines} lines exceeds limit of ${contract.constraints.max_lines_per_request}`)
127
+ };
128
+ }
129
+ // 4. Fetch code from filesystem
130
+ // Use MultiDbManager's workspace root as primary source (most reliable)
131
+ const dbWorkspaceRoot = this.dbManager.getWorkspaceRoot();
132
+ const workspaceRoot = contract.workspace_root || args.workspaceRoot || dbWorkspaceRoot;
133
+ const fullPath = path.join(workspaceRoot, filePath);
134
+ if (!fs.existsSync(fullPath)) {
135
+ return {
136
+ error: 'FILE_NOT_FOUND',
137
+ file_path: filePath,
138
+ resolved_path: fullPath,
139
+ evidence: (0, evidence_1.createFactEvidence)([
140
+ (0, evidence_2.createEvidenceSource)('STATUS_CHECK', undefined, fullPath, undefined, {
141
+ check: 'file_exists'
142
+ })
143
+ ], `File not found: ${fullPath}`)
144
+ };
145
+ }
146
+ const fileContent = fs.readFileSync(fullPath, 'utf-8');
147
+ const lines = fileContent.split('\n');
148
+ // 5. Extract snippet with optional context
149
+ const actualStart = Math.max(1, startLine - contextLines);
150
+ const actualEnd = Math.min(lines.length, endLine + contextLines);
151
+ const snippet = lines.slice(actualStart - 1, actualEnd).join('\n');
152
+ // 6. Hash verification (if requested)
153
+ const computedHash = crypto.createHash('sha256').update(snippet).digest('hex').substring(0, 16);
154
+ if (args.verify_hash && args.content_hash && computedHash !== args.content_hash) {
155
+ return {
156
+ error: 'HASH_MISMATCH',
157
+ expected_hash: args.content_hash,
158
+ computed_hash: computedHash,
159
+ evidence: (0, evidence_1.createFactEvidence)([
160
+ (0, evidence_2.createEvidenceSource)('STATUS_CHECK', undefined, fullPath, computedHash, {
161
+ check: 'hash_verification',
162
+ expected: args.content_hash
163
+ })
164
+ ], `Hash mismatch: expected ${args.content_hash}, got ${computedHash}. Code may have changed since scan.`)
165
+ };
166
+ }
167
+ // 7. Return snippet with provenance
168
+ return {
169
+ file_path: filePath,
170
+ start_line: actualStart,
171
+ end_line: actualEnd,
172
+ core_start_line: startLine,
173
+ core_end_line: endLine,
174
+ snippet: snippet,
175
+ content_hash: computedHash,
176
+ byte_size: Buffer.byteLength(snippet, 'utf-8'),
177
+ evidence: (0, evidence_1.createFactEvidence)([
178
+ (0, evidence_2.createEvidenceSource)('STATUS_CHECK', undefined, fullPath, computedHash, {
179
+ check: 'filesystem_read',
180
+ lines: `${actualStart}-${actualEnd}`
181
+ })
182
+ ], `Code snippet extracted from ${filePath} lines ${startLine}-${endLine} with ${contextLines} context lines`)
183
+ };
184
+ }
185
+ }
186
+ exports.SourceSnippetApi = SourceSnippetApi;
187
+ //# sourceMappingURL=source-snippet-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-snippet-api.js","sourceRoot":"","sources":["../../src/api/source-snippet-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ import { MultiDbManager } from '../core/multi-db-manager';
2
+ import { ReasonCode } from '../models/reason-codes';
3
+ import { ActionHint } from '../models/action-hint';
4
+ /**
5
+ * Vector backend status information.
6
+ */
7
+ export interface VectorBackendStatus {
8
+ /** Type of backend (chromadb, vss, or fallback) */
9
+ backend: 'chromadb' | 'vss' | 'fallback' | 'none';
10
+ /** Mode (expected backend for this platform) */
11
+ mode: 'chromadb' | 'vss' | 'fallback';
12
+ /** Whether the expected backend is available */
13
+ expected_available: boolean;
14
+ /** Whether the backend is reachable */
15
+ reachable: boolean;
16
+ /** Whether fallback is active */
17
+ fallback: boolean;
18
+ /** Reason code for the current status */
19
+ reason_code: ReasonCode;
20
+ /** Human-readable description */
21
+ description: string;
22
+ /** Action hints for resolving issues (if any) */
23
+ action_hints?: ActionHint[];
24
+ /** Platform information */
25
+ platform: string;
26
+ }
27
+ /**
28
+ * Vector backend healthcheck result.
29
+ */
30
+ export interface VectorBackendHealthcheck {
31
+ /** Whether the healthcheck passed */
32
+ healthy: boolean;
33
+ /** Reason code */
34
+ reason_code: ReasonCode;
35
+ /** Latency in milliseconds (if measurable) */
36
+ latency_ms?: number;
37
+ /** Error code (if any) */
38
+ error_code?: string;
39
+ /** Human-readable description */
40
+ description: string;
41
+ /** Action hints for resolving issues (if any) */
42
+ action_hints?: ActionHint[];
43
+ }
44
+ /**
45
+ * API for checking vector backend status and health.
46
+ */
47
+ export declare class VectorBackendStatusApi {
48
+ private dbManager;
49
+ constructor(dbManager: MultiDbManager);
50
+ /**
51
+ * Gets the current vector backend status.
52
+ *
53
+ * @returns Promise that resolves to vector backend status
54
+ */
55
+ getVectorBackendStatus(): Promise<VectorBackendStatus>;
56
+ /**
57
+ * Performs a healthcheck on the vector backend.
58
+ * Attempts to perform a simple query to verify the backend is responsive.
59
+ *
60
+ * @returns Promise that resolves to healthcheck result
61
+ */
62
+ healthcheckVectorBackend(): Promise<VectorBackendHealthcheck>;
63
+ /**
64
+ * Gets action hints for a specific reason code.
65
+ */
66
+ private getActionHintsForReason;
67
+ }
68
+ //# sourceMappingURL=vector-backend-status-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector-backend-status-api.d.ts","sourceRoot":"","sources":["../../src/api/vector-backend-status-api.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAI1D,OAAO,EAAE,UAAU,EAA4B,MAAM,wBAAwB,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAoB,MAAM,uBAAuB,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,mDAAmD;IACnD,OAAO,EAAE,UAAU,GAAG,KAAK,GAAG,UAAU,GAAG,MAAM,CAAC;IAElD,gDAAgD;IAChD,IAAI,EAAE,UAAU,GAAG,KAAK,GAAG,UAAU,CAAC;IAEtC,gDAAgD;IAChD,kBAAkB,EAAE,OAAO,CAAC;IAE5B,uCAAuC;IACvC,SAAS,EAAE,OAAO,CAAC;IAEnB,iCAAiC;IACjC,QAAQ,EAAE,OAAO,CAAC;IAElB,yCAAyC;IACzC,WAAW,EAAE,UAAU,CAAC;IAExB,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IAEpB,iDAAiD;IACjD,YAAY,CAAC,EAAE,UAAU,EAAE,CAAC;IAE5B,2BAA2B;IAC3B,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACrC,qCAAqC;IACrC,OAAO,EAAE,OAAO,CAAC;IAEjB,kBAAkB;IAClB,WAAW,EAAE,UAAU,CAAC;IAExB,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,0BAA0B;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IAEpB,iDAAiD;IACjD,YAAY,CAAC,EAAE,UAAU,EAAE,CAAC;CAC/B;AAED;;GAEG;AACH,qBAAa,sBAAsB;IAC/B,OAAO,CAAC,SAAS,CAAiB;gBAEtB,SAAS,EAAE,cAAc;IAIrC;;;;OAIG;IACG,sBAAsB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAuF5D;;;;;OAKG;IACG,wBAAwB,IAAI,OAAO,CAAC,wBAAwB,CAAC;IAuEnE;;OAEG;IACH,OAAO,CAAC,uBAAuB;CAoElC"}