@apart-tech/apart-intelligence 0.1.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.
Files changed (141) hide show
  1. package/dist/analyzers/python-analyzer.d.ts +3 -0
  2. package/dist/analyzers/python-analyzer.d.ts.map +1 -0
  3. package/dist/analyzers/python-analyzer.js +127 -0
  4. package/dist/analyzers/python-analyzer.js.map +1 -0
  5. package/dist/analyzers/types.d.ts +18 -0
  6. package/dist/analyzers/types.d.ts.map +1 -0
  7. package/dist/analyzers/types.js +2 -0
  8. package/dist/analyzers/types.js.map +1 -0
  9. package/dist/analyzers/typescript-analyzer.d.ts +3 -0
  10. package/dist/analyzers/typescript-analyzer.d.ts.map +1 -0
  11. package/dist/analyzers/typescript-analyzer.js +131 -0
  12. package/dist/analyzers/typescript-analyzer.js.map +1 -0
  13. package/dist/api-client/api-provider.d.ts +3 -0
  14. package/dist/api-client/api-provider.d.ts.map +1 -0
  15. package/dist/api-client/api-provider.js +85 -0
  16. package/dist/api-client/api-provider.js.map +1 -0
  17. package/dist/api-client/credentials.d.ts +6 -0
  18. package/dist/api-client/credentials.d.ts.map +1 -0
  19. package/dist/api-client/credentials.js +34 -0
  20. package/dist/api-client/credentials.js.map +1 -0
  21. package/dist/api-client/direct-provider.d.ts +3 -0
  22. package/dist/api-client/direct-provider.d.ts.map +1 -0
  23. package/dist/api-client/direct-provider.js +149 -0
  24. package/dist/api-client/direct-provider.js.map +1 -0
  25. package/dist/api-client/http-client.d.ts +11 -0
  26. package/dist/api-client/http-client.d.ts.map +1 -0
  27. package/dist/api-client/http-client.js +37 -0
  28. package/dist/api-client/http-client.js.map +1 -0
  29. package/dist/api-client/index.d.ts +5 -0
  30. package/dist/api-client/index.d.ts.map +1 -0
  31. package/dist/api-client/index.js +12 -0
  32. package/dist/api-client/index.js.map +1 -0
  33. package/dist/api-client/types.d.ts +93 -0
  34. package/dist/api-client/types.d.ts.map +1 -0
  35. package/dist/api-client/types.js +2 -0
  36. package/dist/api-client/types.js.map +1 -0
  37. package/dist/commands/add.d.ts +3 -0
  38. package/dist/commands/add.d.ts.map +1 -0
  39. package/dist/commands/add.js +50 -0
  40. package/dist/commands/add.js.map +1 -0
  41. package/dist/commands/context.d.ts +3 -0
  42. package/dist/commands/context.d.ts.map +1 -0
  43. package/dist/commands/context.js +40 -0
  44. package/dist/commands/context.js.map +1 -0
  45. package/dist/commands/delete.d.ts +3 -0
  46. package/dist/commands/delete.d.ts.map +1 -0
  47. package/dist/commands/delete.js +45 -0
  48. package/dist/commands/delete.js.map +1 -0
  49. package/dist/commands/domains.d.ts +3 -0
  50. package/dist/commands/domains.d.ts.map +1 -0
  51. package/dist/commands/domains.js +61 -0
  52. package/dist/commands/domains.js.map +1 -0
  53. package/dist/commands/drafts.d.ts +3 -0
  54. package/dist/commands/drafts.d.ts.map +1 -0
  55. package/dist/commands/drafts.js +29 -0
  56. package/dist/commands/drafts.js.map +1 -0
  57. package/dist/commands/duplicates.d.ts +3 -0
  58. package/dist/commands/duplicates.d.ts.map +1 -0
  59. package/dist/commands/duplicates.js +39 -0
  60. package/dist/commands/duplicates.js.map +1 -0
  61. package/dist/commands/get.d.ts +3 -0
  62. package/dist/commands/get.d.ts.map +1 -0
  63. package/dist/commands/get.js +43 -0
  64. package/dist/commands/get.js.map +1 -0
  65. package/dist/commands/graph.d.ts +3 -0
  66. package/dist/commands/graph.d.ts.map +1 -0
  67. package/dist/commands/graph.js +368 -0
  68. package/dist/commands/graph.js.map +1 -0
  69. package/dist/commands/health.d.ts +3 -0
  70. package/dist/commands/health.d.ts.map +1 -0
  71. package/dist/commands/health.js +61 -0
  72. package/dist/commands/health.js.map +1 -0
  73. package/dist/commands/init.d.ts +3 -0
  74. package/dist/commands/init.d.ts.map +1 -0
  75. package/dist/commands/init.js +336 -0
  76. package/dist/commands/init.js.map +1 -0
  77. package/dist/commands/islands.d.ts +3 -0
  78. package/dist/commands/islands.d.ts.map +1 -0
  79. package/dist/commands/islands.js +70 -0
  80. package/dist/commands/islands.js.map +1 -0
  81. package/dist/commands/link.d.ts +3 -0
  82. package/dist/commands/link.d.ts.map +1 -0
  83. package/dist/commands/link.js +40 -0
  84. package/dist/commands/link.js.map +1 -0
  85. package/dist/commands/login.d.ts +3 -0
  86. package/dist/commands/login.d.ts.map +1 -0
  87. package/dist/commands/login.js +72 -0
  88. package/dist/commands/login.js.map +1 -0
  89. package/dist/commands/logout.d.ts +3 -0
  90. package/dist/commands/logout.d.ts.map +1 -0
  91. package/dist/commands/logout.js +18 -0
  92. package/dist/commands/logout.js.map +1 -0
  93. package/dist/commands/map.d.ts +3 -0
  94. package/dist/commands/map.d.ts.map +1 -0
  95. package/dist/commands/map.js +127 -0
  96. package/dist/commands/map.js.map +1 -0
  97. package/dist/commands/normalize.d.ts +3 -0
  98. package/dist/commands/normalize.d.ts.map +1 -0
  99. package/dist/commands/normalize.js +67 -0
  100. package/dist/commands/normalize.js.map +1 -0
  101. package/dist/commands/orphans.d.ts +3 -0
  102. package/dist/commands/orphans.d.ts.map +1 -0
  103. package/dist/commands/orphans.js +36 -0
  104. package/dist/commands/orphans.js.map +1 -0
  105. package/dist/commands/search.d.ts +3 -0
  106. package/dist/commands/search.d.ts.map +1 -0
  107. package/dist/commands/search.js +44 -0
  108. package/dist/commands/search.js.map +1 -0
  109. package/dist/commands/status.d.ts +3 -0
  110. package/dist/commands/status.d.ts.map +1 -0
  111. package/dist/commands/status.js +25 -0
  112. package/dist/commands/status.js.map +1 -0
  113. package/dist/commands/suggest-links.d.ts +3 -0
  114. package/dist/commands/suggest-links.d.ts.map +1 -0
  115. package/dist/commands/suggest-links.js +44 -0
  116. package/dist/commands/suggest-links.js.map +1 -0
  117. package/dist/commands/types.d.ts +3 -0
  118. package/dist/commands/types.d.ts.map +1 -0
  119. package/dist/commands/types.js +30 -0
  120. package/dist/commands/types.js.map +1 -0
  121. package/dist/commands/update.d.ts +3 -0
  122. package/dist/commands/update.d.ts.map +1 -0
  123. package/dist/commands/update.js +55 -0
  124. package/dist/commands/update.js.map +1 -0
  125. package/dist/commands/validate.d.ts +3 -0
  126. package/dist/commands/validate.d.ts.map +1 -0
  127. package/dist/commands/validate.js +79 -0
  128. package/dist/commands/validate.js.map +1 -0
  129. package/dist/commands/whoami.d.ts +3 -0
  130. package/dist/commands/whoami.d.ts.map +1 -0
  131. package/dist/commands/whoami.js +21 -0
  132. package/dist/commands/whoami.js.map +1 -0
  133. package/dist/index.d.ts +3 -0
  134. package/dist/index.d.ts.map +1 -0
  135. package/dist/index.js +59 -0
  136. package/dist/index.js.map +1 -0
  137. package/dist/utils.d.ts +3 -0
  138. package/dist/utils.d.ts.map +1 -0
  139. package/dist/utils.js +7 -0
  140. package/dist/utils.js.map +1 -0
  141. package/package.json +37 -0
@@ -0,0 +1,3 @@
1
+ import type { FileAnalysis } from "./types.js";
2
+ export declare function analyzePythonProject(root: string, exclude?: string[]): FileAnalysis[];
3
+ //# sourceMappingURL=python-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python-analyzer.d.ts","sourceRoot":"","sources":["../../src/analyzers/python-analyzer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAA0B,MAAM,YAAY,CAAC;AAQvE,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,MAAM,EAAO,GACrB,YAAY,EAAE,CAGhB"}
@@ -0,0 +1,127 @@
1
+ import { readFileSync, readdirSync, statSync, existsSync } from "fs";
2
+ import { join, relative, resolve, dirname } from "path";
3
+ const IGNORE_DIRS = new Set([
4
+ "node_modules", "__pycache__", ".venv", "venv", "env",
5
+ ".git", "dist", "build", ".tox", ".mypy_cache",
6
+ ".pytest_cache", ".eggs", "*.egg-info",
7
+ ]);
8
+ export function analyzePythonProject(root, exclude = []) {
9
+ const files = discoverPythonFiles(root, exclude);
10
+ return files.map((f) => analyzeFile(f, root));
11
+ }
12
+ function discoverPythonFiles(root, exclude) {
13
+ const results = [];
14
+ function walk(dir) {
15
+ const entries = readdirSync(dir);
16
+ for (const entry of entries) {
17
+ const full = join(dir, entry);
18
+ const stat = statSync(full);
19
+ if (stat.isDirectory()) {
20
+ if (IGNORE_DIRS.has(entry))
21
+ continue;
22
+ if (exclude.some((ex) => entry.includes(ex)))
23
+ continue;
24
+ walk(full);
25
+ }
26
+ else if (entry.endsWith(".py")) {
27
+ const rel = relative(root, full);
28
+ if (!exclude.some((ex) => rel.includes(ex))) {
29
+ results.push(full);
30
+ }
31
+ }
32
+ }
33
+ }
34
+ walk(root);
35
+ return results;
36
+ }
37
+ function analyzeFile(filePath, root) {
38
+ const content = readFileSync(filePath, "utf-8");
39
+ const lines = content.split("\n");
40
+ const exports = [];
41
+ const imports = [];
42
+ for (const line of lines) {
43
+ const trimmed = line.trimStart();
44
+ // Top-level class definitions
45
+ const classMatch = trimmed.match(/^class\s+(\w+)/);
46
+ if (classMatch && !line.startsWith(" ") && !line.startsWith("\t")) {
47
+ exports.push({ name: classMatch[1], kind: "class" });
48
+ }
49
+ // Top-level function definitions
50
+ const funcMatch = trimmed.match(/^def\s+(\w+)/);
51
+ if (funcMatch && !line.startsWith(" ") && !line.startsWith("\t")) {
52
+ exports.push({ name: funcMatch[1], kind: "function" });
53
+ }
54
+ // Top-level constants (UPPER_CASE = ...)
55
+ const constMatch = trimmed.match(/^([A-Z][A-Z_0-9]+)\s*=/);
56
+ if (constMatch && !line.startsWith(" ") && !line.startsWith("\t")) {
57
+ exports.push({ name: constMatch[1], kind: "const" });
58
+ }
59
+ // import module
60
+ const importMatch = trimmed.match(/^import\s+([\w.]+)/);
61
+ if (importMatch) {
62
+ const mod = importMatch[1];
63
+ imports.push({
64
+ moduleSpecifier: mod,
65
+ resolvedPath: resolveModule(mod, filePath, root),
66
+ importedNames: [mod.split(".").pop()],
67
+ });
68
+ }
69
+ // from module import names
70
+ const fromMatch = trimmed.match(/^from\s+([\w.]+)\s+import\s+(.+)/);
71
+ if (fromMatch) {
72
+ const mod = fromMatch[1];
73
+ const names = fromMatch[2]
74
+ .split(",")
75
+ .map((n) => n.trim().split(" as ")[0].trim())
76
+ .filter((n) => n && n !== "(");
77
+ imports.push({
78
+ moduleSpecifier: mod,
79
+ resolvedPath: resolveModule(mod, filePath, root),
80
+ importedNames: names,
81
+ });
82
+ }
83
+ }
84
+ return {
85
+ relativePath: relative(root, filePath),
86
+ absolutePath: filePath,
87
+ language: "python",
88
+ exports,
89
+ imports,
90
+ linesOfCode: lines.length,
91
+ };
92
+ }
93
+ function resolveModule(moduleSpecifier, containingFile, root) {
94
+ // Relative imports (starts with .)
95
+ if (moduleSpecifier.startsWith(".")) {
96
+ const dots = moduleSpecifier.match(/^\.+/)[0].length;
97
+ let base = dirname(containingFile);
98
+ for (let i = 1; i < dots; i++)
99
+ base = dirname(base);
100
+ const rest = moduleSpecifier.slice(dots).replace(/\./g, "/");
101
+ const candidates = [
102
+ join(base, rest + ".py"),
103
+ join(base, rest, "__init__.py"),
104
+ ];
105
+ for (const c of candidates) {
106
+ if (existsSync(c) && c.startsWith(resolve(root))) {
107
+ return relative(root, c);
108
+ }
109
+ }
110
+ return null;
111
+ }
112
+ // Absolute imports — try to resolve within project
113
+ const parts = moduleSpecifier.replace(/\./g, "/");
114
+ const candidates = [
115
+ join(root, parts + ".py"),
116
+ join(root, parts, "__init__.py"),
117
+ join(root, "src", parts + ".py"),
118
+ join(root, "src", parts, "__init__.py"),
119
+ ];
120
+ for (const c of candidates) {
121
+ if (existsSync(c)) {
122
+ return relative(root, c);
123
+ }
124
+ }
125
+ return null; // external package
126
+ }
127
+ //# sourceMappingURL=python-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python-analyzer.js","sourceRoot":"","sources":["../../src/analyzers/python-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export interface ExportInfo {
2
+ name: string;
3
+ kind: "class" | "function" | "interface" | "type" | "const" | "enum" | "variable";
4
+ }
5
+ export interface ImportInfo {
6
+ moduleSpecifier: string;
7
+ resolvedPath: string | null;
8
+ importedNames: string[];
9
+ }
10
+ export interface FileAnalysis {
11
+ relativePath: string;
12
+ absolutePath: string;
13
+ language: "typescript" | "python";
14
+ exports: ExportInfo[];
15
+ imports: ImportInfo[];
16
+ linesOfCode: number;
17
+ }
18
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/analyzers/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,CAAC;CACnF;AAED,MAAM,WAAW,UAAU;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,YAAY,GAAG,QAAQ,CAAC;IAClC,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/analyzers/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import type { FileAnalysis } from "./types.js";
2
+ export declare function analyzeTypeScriptProject(root: string, exclude?: string[]): FileAnalysis[];
3
+ //# sourceMappingURL=typescript-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescript-analyzer.d.ts","sourceRoot":"","sources":["../../src/analyzers/typescript-analyzer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAA0B,MAAM,YAAY,CAAC;AAOvE,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,MAAM,EAAO,GACrB,YAAY,EAAE,CAsChB"}
@@ -0,0 +1,131 @@
1
+ import ts from "typescript";
2
+ import { readFileSync } from "fs";
3
+ import { resolve, relative, dirname } from "path";
4
+ const IGNORE_DIRS = new Set([
5
+ "node_modules", "dist", "build", ".git", "coverage",
6
+ ".next", ".nuxt", ".turbo", ".cache",
7
+ ]);
8
+ export function analyzeTypeScriptProject(root, exclude = []) {
9
+ const tsconfigPath = ts.findConfigFile(root, ts.sys.fileExists, "tsconfig.json");
10
+ if (!tsconfigPath) {
11
+ throw new Error(`No tsconfig.json found in ${root}`);
12
+ }
13
+ const configFile = ts.readConfigFile(tsconfigPath, ts.sys.readFile);
14
+ if (configFile.error) {
15
+ throw new Error(`Error reading tsconfig.json: ${ts.flattenDiagnosticMessageText(configFile.error.messageText, "\n")}`);
16
+ }
17
+ const parsed = ts.parseJsonConfigFileContent(configFile.config, ts.sys, dirname(tsconfigPath));
18
+ // Filter files
19
+ const files = parsed.fileNames.filter((f) => {
20
+ const rel = relative(root, f);
21
+ if (rel.includes(".d.ts"))
22
+ return false;
23
+ if (IGNORE_DIRS.has(rel.split("/")[0]))
24
+ return false;
25
+ if (exclude.some((ex) => rel.includes(ex)))
26
+ return false;
27
+ return true;
28
+ });
29
+ const program = ts.createProgram(files, parsed.options);
30
+ const results = [];
31
+ for (const filePath of files) {
32
+ const sourceFile = program.getSourceFile(filePath);
33
+ if (!sourceFile)
34
+ continue;
35
+ const analysis = analyzeFile(sourceFile, program, root);
36
+ if (analysis)
37
+ results.push(analysis);
38
+ }
39
+ return results;
40
+ }
41
+ function analyzeFile(sourceFile, program, root) {
42
+ const exports = [];
43
+ const imports = [];
44
+ const checker = program.getTypeChecker();
45
+ ts.forEachChild(sourceFile, (node) => {
46
+ // Exports
47
+ if (ts.isFunctionDeclaration(node) && isExported(node)) {
48
+ exports.push({ name: node.name?.text ?? "(anonymous)", kind: "function" });
49
+ }
50
+ if (ts.isClassDeclaration(node) && isExported(node)) {
51
+ exports.push({ name: node.name?.text ?? "(anonymous)", kind: "class" });
52
+ }
53
+ if (ts.isInterfaceDeclaration(node) && isExported(node)) {
54
+ exports.push({ name: node.name?.text ?? "unknown", kind: "interface" });
55
+ }
56
+ if (ts.isTypeAliasDeclaration(node) && isExported(node)) {
57
+ exports.push({ name: node.name.text, kind: "type" });
58
+ }
59
+ if (ts.isEnumDeclaration(node) && isExported(node)) {
60
+ exports.push({ name: node.name.text, kind: "enum" });
61
+ }
62
+ if (ts.isVariableStatement(node) && isExported(node)) {
63
+ for (const decl of node.declarationList.declarations) {
64
+ if (ts.isIdentifier(decl.name)) {
65
+ const isConst = (node.declarationList.flags & ts.NodeFlags.Const) !== 0;
66
+ exports.push({ name: decl.name.text, kind: isConst ? "const" : "variable" });
67
+ }
68
+ }
69
+ }
70
+ // Re-exports: export { Foo } from "./bar"
71
+ if (ts.isExportDeclaration(node) && node.exportClause && node.moduleSpecifier) {
72
+ if (ts.isNamedExports(node.exportClause)) {
73
+ for (const spec of node.exportClause.elements) {
74
+ exports.push({ name: spec.name.text, kind: "const" });
75
+ }
76
+ }
77
+ }
78
+ // Imports
79
+ if (ts.isImportDeclaration(node) && node.moduleSpecifier) {
80
+ const specifier = node.moduleSpecifier.text;
81
+ const importedNames = [];
82
+ if (node.importClause) {
83
+ if (node.importClause.name) {
84
+ importedNames.push(node.importClause.name.text);
85
+ }
86
+ if (node.importClause.namedBindings) {
87
+ if (ts.isNamedImports(node.importClause.namedBindings)) {
88
+ for (const el of node.importClause.namedBindings.elements) {
89
+ importedNames.push(el.name.text);
90
+ }
91
+ }
92
+ else if (ts.isNamespaceImport(node.importClause.namedBindings)) {
93
+ importedNames.push(`* as ${node.importClause.namedBindings.name.text}`);
94
+ }
95
+ }
96
+ }
97
+ const resolvedPath = resolveImport(specifier, sourceFile.fileName, program.getCompilerOptions(), root);
98
+ imports.push({ moduleSpecifier: specifier, resolvedPath, importedNames });
99
+ }
100
+ });
101
+ const content = readFileSync(sourceFile.fileName, "utf-8");
102
+ const lines = content.split("\n").length;
103
+ return {
104
+ relativePath: relative(root, sourceFile.fileName),
105
+ absolutePath: sourceFile.fileName,
106
+ language: "typescript",
107
+ exports,
108
+ imports,
109
+ linesOfCode: lines,
110
+ };
111
+ }
112
+ function isExported(node) {
113
+ return (ts.canHaveModifiers(node) &&
114
+ ts.getModifiers(node)?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword) === true);
115
+ }
116
+ function resolveImport(specifier, containingFile, options, root) {
117
+ // Only resolve relative imports and path-aliased imports
118
+ if (!specifier.startsWith(".") && !specifier.startsWith("@/")) {
119
+ return null;
120
+ }
121
+ const resolved = ts.resolveModuleName(specifier, containingFile, options, ts.sys);
122
+ if (resolved.resolvedModule) {
123
+ const resolvedPath = resolved.resolvedModule.resolvedFileName;
124
+ // Only include if it's within the project root
125
+ if (resolvedPath.startsWith(resolve(root)) && !resolvedPath.includes("node_modules")) {
126
+ return relative(root, resolvedPath);
127
+ }
128
+ }
129
+ return null;
130
+ }
131
+ //# sourceMappingURL=typescript-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescript-analyzer.js","sourceRoot":"","sources":["../../src/analyzers/typescript-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ServiceProvider, Credentials } from "./types.js";
2
+ export declare function createApiProvider(creds: Credentials): ServiceProvider;
3
+ //# sourceMappingURL=api-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-provider.d.ts","sourceRoot":"","sources":["../../src/api-client/api-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAU/D,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,eAAe,CAoGrE"}
@@ -0,0 +1,85 @@
1
+ import { HttpClient } from "./http-client.js";
2
+ export function createApiProvider(creds) {
3
+ const http = new HttpClient(creds);
4
+ return {
5
+ nodes: {
6
+ create: (input) => http.post("/api/nodes", input),
7
+ getById: async (id) => {
8
+ try {
9
+ const result = await http.get(`/api/nodes/${id}`);
10
+ return result.node;
11
+ }
12
+ catch {
13
+ return null;
14
+ }
15
+ },
16
+ update: async (id, input) => {
17
+ try {
18
+ return await http.patch(`/api/nodes/${id}`, input);
19
+ }
20
+ catch {
21
+ return null;
22
+ }
23
+ },
24
+ delete: async (id) => {
25
+ try {
26
+ await http.delete(`/api/nodes/${id}`);
27
+ return true;
28
+ }
29
+ catch {
30
+ return false;
31
+ }
32
+ },
33
+ setStatus: async (id, status) => {
34
+ try {
35
+ return await http.patch(`/api/nodes/${id}/status`, {
36
+ status,
37
+ });
38
+ }
39
+ catch {
40
+ return null;
41
+ }
42
+ },
43
+ listDrafts: (limit) => http.get(`/api/nodes/drafts${limit ? `?limit=${limit}` : ""}`),
44
+ listTypes: () => http.get("/api/nodes/types"),
45
+ },
46
+ edges: {
47
+ create: (input) => http.post("/api/edges", input),
48
+ getByNodeId: async (nodeId) => {
49
+ const result = await http.get(`/api/nodes/${nodeId}`);
50
+ return result.edges;
51
+ },
52
+ delete: async (id) => {
53
+ try {
54
+ await http.delete(`/api/edges/${id}`);
55
+ return true;
56
+ }
57
+ catch {
58
+ return false;
59
+ }
60
+ },
61
+ listRelationshipTypes: () => http.get("/api/edges/types"),
62
+ },
63
+ search: {
64
+ search: (options) => http.post("/api/search", options),
65
+ context: (options) => http.post("/api/context", options),
66
+ },
67
+ domains: {
68
+ getTree: () => http.get("/api/domains"),
69
+ seed: () => http.post("/api/domains/seed"),
70
+ getBySlug: async (slug) => {
71
+ try {
72
+ return await http.get(`/api/domains/${slug}`);
73
+ }
74
+ catch {
75
+ return null;
76
+ }
77
+ },
78
+ resolveSlugs: (slugs) => http.post("/api/domains/resolve", { slugs }),
79
+ },
80
+ map: {
81
+ upload: (input) => http.post("/api/map", input),
82
+ },
83
+ };
84
+ }
85
+ //# sourceMappingURL=api-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-provider.js","sourceRoot":"","sources":["../../src/api-client/api-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Credentials } from "./types.js";
2
+ export declare function loadCredentials(): Credentials | null;
3
+ export declare function saveCredentials(creds: Credentials): void;
4
+ export declare function deleteCredentials(): boolean;
5
+ export declare function getCredentialsPath(): string;
6
+ //# sourceMappingURL=credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/api-client/credentials.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAK9C,wBAAgB,eAAe,IAAI,WAAW,GAAG,IAAI,CAUpD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAGxD;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAI3C;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C"}
@@ -0,0 +1,34 @@
1
+ import { readFileSync, writeFileSync, mkdirSync, unlinkSync, existsSync, } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { parse, stringify } from "yaml";
5
+ const CREDENTIALS_DIR = join(homedir(), ".apart");
6
+ const CREDENTIALS_PATH = join(CREDENTIALS_DIR, "credentials.yaml");
7
+ export function loadCredentials() {
8
+ if (!existsSync(CREDENTIALS_PATH))
9
+ return null;
10
+ try {
11
+ const raw = readFileSync(CREDENTIALS_PATH, "utf-8");
12
+ const data = parse(raw);
13
+ if (data?.server && data?.apiKey)
14
+ return data;
15
+ return null;
16
+ }
17
+ catch {
18
+ return null;
19
+ }
20
+ }
21
+ export function saveCredentials(creds) {
22
+ mkdirSync(CREDENTIALS_DIR, { recursive: true });
23
+ writeFileSync(CREDENTIALS_PATH, stringify(creds), { mode: 0o600 });
24
+ }
25
+ export function deleteCredentials() {
26
+ if (!existsSync(CREDENTIALS_PATH))
27
+ return false;
28
+ unlinkSync(CREDENTIALS_PATH);
29
+ return true;
30
+ }
31
+ export function getCredentialsPath() {
32
+ return CREDENTIALS_PATH;
33
+ }
34
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/api-client/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,aAAa,EACb,SAAS,EACT,UAAU,EACV,UAAU,GACX,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAGxC,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AAClD,MAAM,gBAAgB,GAAG,IAAI,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;AAEnE,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,IAAI,EAAE,MAAM,IAAI,IAAI,EAAE,MAAM;YAAE,OAAO,IAAmB,CAAC;QAC7D,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAkB;IAChD,SAAS,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,aAAa,CAAC,gBAAgB,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAAE,OAAO,KAAK,CAAC;IAChD,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAC7B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,gBAAgB,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ServiceProvider } from "./types.js";
2
+ export declare function createDirectProvider(): ServiceProvider;
3
+ //# sourceMappingURL=direct-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"direct-provider.d.ts","sourceRoot":"","sources":["../../src/api-client/direct-provider.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD,wBAAgB,oBAAoB,IAAI,eAAe,CAwHtD"}
@@ -0,0 +1,149 @@
1
+ import { loadConfig, getTenantDb, NodeService, EdgeService, SearchService, ContextService, DomainService, createEmbeddingProvider, } from "@apart-tech/intelligence-core";
2
+ import { resolveTenant } from "../utils.js";
3
+ export function createDirectProvider() {
4
+ const config = loadConfig();
5
+ const tenant = resolveTenant(config);
6
+ const db = getTenantDb(config.database.url, tenant);
7
+ const embeddings = createEmbeddingProvider(config);
8
+ const nodeService = new NodeService(db, embeddings, tenant);
9
+ const edgeService = new EdgeService(db, tenant);
10
+ const searchService = new SearchService(db, embeddings, config, tenant);
11
+ const contextService = new ContextService(nodeService, edgeService, searchService, config);
12
+ const domainService = new DomainService(db, tenant);
13
+ return {
14
+ nodes: {
15
+ create: (input) => nodeService.create(input),
16
+ getById: (id) => nodeService.getById(id),
17
+ update: (id, input) => nodeService.update(id, input),
18
+ delete: (id) => nodeService.delete(id),
19
+ setStatus: (id, status) => nodeService.setStatus(id, status),
20
+ listDrafts: (limit) => nodeService.listDrafts(limit),
21
+ listTypes: () => nodeService.listTypes(),
22
+ },
23
+ edges: {
24
+ create: (input) => edgeService.create(input),
25
+ getByNodeId: (nodeId) => edgeService.getByNodeId(nodeId),
26
+ delete: (id) => edgeService.delete(id),
27
+ listRelationshipTypes: () => edgeService.listRelationshipTypes(),
28
+ },
29
+ search: {
30
+ search: (options) => searchService.search(options),
31
+ context: (options) => contextService.assemble(options),
32
+ },
33
+ domains: {
34
+ getTree: () => domainService.getTree(),
35
+ seed: () => domainService.seed(),
36
+ getBySlug: (slug) => domainService.getBySlug(slug),
37
+ resolveSlugs: (slugs) => domainService.resolveSlugs(slugs),
38
+ },
39
+ map: {
40
+ upload: async (input) => {
41
+ const existingNodes = await db.node.findMany({
42
+ where: { type: "module" },
43
+ select: { id: true, title: true },
44
+ });
45
+ const existingByTitle = new Map(existingNodes.map((n) => [n.title, n.id]));
46
+ const pathToNodeId = new Map();
47
+ let nodesCreated = 0;
48
+ let nodesUpdated = 0;
49
+ for (const file of input.analyses) {
50
+ const title = `${input.projectName}/${file.relativePath}`;
51
+ const content = buildMapNodeContent(file, input.projectName);
52
+ const metadata = {
53
+ language: file.language,
54
+ linesOfCode: file.linesOfCode,
55
+ projectRoot: input.projectName,
56
+ exports: file.exports.map((e) => `${e.kind}:${e.name}`),
57
+ importCount: file.imports.length,
58
+ };
59
+ const existingId = existingByTitle.get(title);
60
+ if (existingId) {
61
+ await nodeService.update(existingId, { content, metadata });
62
+ pathToNodeId.set(file.relativePath, existingId);
63
+ nodesUpdated++;
64
+ }
65
+ else {
66
+ const node = await nodeService.create({
67
+ type: "module",
68
+ title,
69
+ content,
70
+ metadata,
71
+ createdBy: input.createdBy ?? "tc-map",
72
+ domainId: input.domainId,
73
+ });
74
+ pathToNodeId.set(file.relativePath, node.id);
75
+ nodesCreated++;
76
+ }
77
+ }
78
+ // Delete old import edges and recreate
79
+ const allNodeIds = [...pathToNodeId.values()];
80
+ if (allNodeIds.length > 0) {
81
+ await db.edge.deleteMany({
82
+ where: {
83
+ relationshipType: "imports",
84
+ sourceNodeId: { in: allNodeIds },
85
+ },
86
+ });
87
+ }
88
+ let edgesCreated = 0;
89
+ for (const file of input.analyses) {
90
+ const sourceId = pathToNodeId.get(file.relativePath);
91
+ if (!sourceId)
92
+ continue;
93
+ for (const imp of file.imports) {
94
+ if (!imp.resolvedPath)
95
+ continue;
96
+ const targetId = pathToNodeId.get(imp.resolvedPath);
97
+ if (!targetId || targetId === sourceId)
98
+ continue;
99
+ await edgeService.create({
100
+ sourceNodeId: sourceId,
101
+ targetNodeId: targetId,
102
+ relationshipType: "imports",
103
+ metadata: { importedNames: imp.importedNames },
104
+ createdBy: input.createdBy ?? "tc-map",
105
+ });
106
+ edgesCreated++;
107
+ }
108
+ }
109
+ return { nodesCreated, nodesUpdated, edgesCreated };
110
+ },
111
+ },
112
+ };
113
+ }
114
+ function buildMapNodeContent(file, projectName) {
115
+ const sections = [];
116
+ sections.push(`# ${projectName}/${file.relativePath}`);
117
+ sections.push(`Language: ${file.language} | ${file.linesOfCode} lines`);
118
+ if (file.exports.length > 0) {
119
+ sections.push("");
120
+ sections.push("## Exports");
121
+ for (const exp of file.exports) {
122
+ sections.push(`- ${exp.kind} ${exp.name}`);
123
+ }
124
+ }
125
+ const internalImports = file.imports.filter((i) => i.resolvedPath);
126
+ const externalImports = file.imports.filter((i) => !i.resolvedPath);
127
+ if (internalImports.length > 0) {
128
+ sections.push("");
129
+ sections.push("## Internal Dependencies");
130
+ for (const imp of internalImports) {
131
+ const names = imp.importedNames.length > 0
132
+ ? ` (${imp.importedNames.join(", ")})`
133
+ : "";
134
+ sections.push(`- ${imp.resolvedPath}${names}`);
135
+ }
136
+ }
137
+ if (externalImports.length > 0) {
138
+ sections.push("");
139
+ sections.push("## External Dependencies");
140
+ for (const imp of externalImports) {
141
+ const names = imp.importedNames.length > 0
142
+ ? ` (${imp.importedNames.join(", ")})`
143
+ : "";
144
+ sections.push(`- ${imp.moduleSpecifier}${names}`);
145
+ }
146
+ }
147
+ return sections.join("\n");
148
+ }
149
+ //# sourceMappingURL=direct-provider.js.map