@skroyc/librarian 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.
- package/CHANGELOG.md +176 -0
- package/LICENSE +210 -0
- package/README.md +614 -0
- package/biome.jsonc +9 -0
- package/dist/agents/context-schema.d.ts +17 -0
- package/dist/agents/context-schema.d.ts.map +1 -0
- package/dist/agents/context-schema.js +16 -0
- package/dist/agents/context-schema.js.map +1 -0
- package/dist/agents/react-agent.d.ts +38 -0
- package/dist/agents/react-agent.d.ts.map +1 -0
- package/dist/agents/react-agent.js +719 -0
- package/dist/agents/react-agent.js.map +1 -0
- package/dist/agents/tool-runtime.d.ts +7 -0
- package/dist/agents/tool-runtime.d.ts.map +1 -0
- package/dist/agents/tool-runtime.js +2 -0
- package/dist/agents/tool-runtime.js.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +172 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +243 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +470 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/file-finding.tool.d.ts +24 -0
- package/dist/tools/file-finding.tool.d.ts.map +1 -0
- package/dist/tools/file-finding.tool.js +198 -0
- package/dist/tools/file-finding.tool.js.map +1 -0
- package/dist/tools/file-listing.tool.d.ts +12 -0
- package/dist/tools/file-listing.tool.d.ts.map +1 -0
- package/dist/tools/file-listing.tool.js +132 -0
- package/dist/tools/file-listing.tool.js.map +1 -0
- package/dist/tools/file-reading.tool.d.ts +9 -0
- package/dist/tools/file-reading.tool.d.ts.map +1 -0
- package/dist/tools/file-reading.tool.js +112 -0
- package/dist/tools/file-reading.tool.js.map +1 -0
- package/dist/tools/grep-content.tool.d.ts +27 -0
- package/dist/tools/grep-content.tool.d.ts.map +1 -0
- package/dist/tools/grep-content.tool.js +229 -0
- package/dist/tools/grep-content.tool.js.map +1 -0
- package/dist/utils/file-utils.d.ts +2 -0
- package/dist/utils/file-utils.d.ts.map +1 -0
- package/dist/utils/file-utils.js +28 -0
- package/dist/utils/file-utils.js.map +1 -0
- package/dist/utils/logger.d.ts +32 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +177 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/path-utils.d.ts +2 -0
- package/dist/utils/path-utils.d.ts.map +1 -0
- package/dist/utils/path-utils.js +9 -0
- package/dist/utils/path-utils.js.map +1 -0
- package/package.json +84 -0
- package/src/agents/context-schema.ts +61 -0
- package/src/agents/react-agent.ts +928 -0
- package/src/agents/tool-runtime.ts +21 -0
- package/src/cli.ts +206 -0
- package/src/config.ts +309 -0
- package/src/index.ts +628 -0
- package/src/tools/file-finding.tool.ts +324 -0
- package/src/tools/file-listing.tool.ts +212 -0
- package/src/tools/file-reading.tool.ts +154 -0
- package/src/tools/grep-content.tool.ts +325 -0
- package/src/utils/file-utils.ts +39 -0
- package/src/utils/logger.ts +295 -0
- package/src/utils/path-utils.ts +17 -0
- package/tsconfig.json +37 -0
- package/tsconfig.test.json +17 -0
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import { tool } from "langchain";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { readdir, stat } from "node:fs/promises";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { logger } from "../utils/logger.js";
|
|
6
|
+
import { isTextFile } from "../utils/file-utils.js";
|
|
7
|
+
async function readFileContent(filePath) {
|
|
8
|
+
try {
|
|
9
|
+
return await Bun.file(filePath).text();
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
13
|
+
throw new Error(`Failed to read file: ${errorMessage}`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function searchFileContent(content, regex) {
|
|
17
|
+
const lines = content.split("\n");
|
|
18
|
+
const matches = [];
|
|
19
|
+
for (let i = 0; i < lines.length; i++) {
|
|
20
|
+
const line = lines[i];
|
|
21
|
+
if (line === undefined) {
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
const match = regex.exec(line);
|
|
25
|
+
if (match) {
|
|
26
|
+
matches.push({
|
|
27
|
+
line: i + 1,
|
|
28
|
+
column: match.index + 1,
|
|
29
|
+
text: line,
|
|
30
|
+
match,
|
|
31
|
+
});
|
|
32
|
+
regex.lastIndex = 0;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return matches;
|
|
36
|
+
}
|
|
37
|
+
async function findFiles(dirPath, pattern, recursive = true) {
|
|
38
|
+
const foundFiles = [];
|
|
39
|
+
const entries = await readdir(dirPath, { withFileTypes: true });
|
|
40
|
+
for (const entry of entries) {
|
|
41
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
42
|
+
if (entry.isDirectory()) {
|
|
43
|
+
if (recursive) {
|
|
44
|
+
const subDirFiles = await findFiles(fullPath, pattern, recursive);
|
|
45
|
+
foundFiles.push(...subDirFiles);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
else if (entry.isFile() && (pattern === "*" || entry.name.includes(pattern.replace(/\*/g, "")))) {
|
|
49
|
+
foundFiles.push(fullPath);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return foundFiles;
|
|
53
|
+
}
|
|
54
|
+
async function validateAndResolvePath(workingDir, searchPath) {
|
|
55
|
+
const resolvedPath = path.resolve(workingDir, searchPath);
|
|
56
|
+
const resolvedWorkingDir = path.resolve(workingDir);
|
|
57
|
+
const relativePath = path.relative(resolvedWorkingDir, resolvedPath);
|
|
58
|
+
logger.debug("TOOL", "Path validation", {
|
|
59
|
+
resolvedPath: resolvedPath.replace(Bun.env.HOME || "", "~"),
|
|
60
|
+
resolvedWorkingDir: resolvedWorkingDir.replace(Bun.env.HOME || "", "~"),
|
|
61
|
+
relativePath,
|
|
62
|
+
validated: !relativePath.startsWith(".."),
|
|
63
|
+
});
|
|
64
|
+
if (relativePath.startsWith("..")) {
|
|
65
|
+
logger.error("PATH", "Search path escapes working directory sandbox", undefined, { searchPath, relativePath });
|
|
66
|
+
throw new Error(`Search path "${searchPath}" attempts to escape the working directory sandbox`);
|
|
67
|
+
}
|
|
68
|
+
const stats = await stat(resolvedPath);
|
|
69
|
+
if (!stats.isDirectory()) {
|
|
70
|
+
logger.error("TOOL", "Search path is not a directory", undefined, {
|
|
71
|
+
searchPath,
|
|
72
|
+
});
|
|
73
|
+
throw new Error(`Search path "${searchPath}" is not a directory`);
|
|
74
|
+
}
|
|
75
|
+
return resolvedPath;
|
|
76
|
+
}
|
|
77
|
+
async function findFilesToSearch(resolvedPath, patterns, recursive) {
|
|
78
|
+
let filesToSearch = [];
|
|
79
|
+
for (const pattern of patterns) {
|
|
80
|
+
const foundFiles = await findFiles(resolvedPath, pattern, recursive);
|
|
81
|
+
filesToSearch = [...filesToSearch, ...foundFiles];
|
|
82
|
+
}
|
|
83
|
+
logger.debug("TOOL", "Files to search", {
|
|
84
|
+
count: filesToSearch.length,
|
|
85
|
+
patterns,
|
|
86
|
+
});
|
|
87
|
+
return filesToSearch;
|
|
88
|
+
}
|
|
89
|
+
function compileSearchRegex(query, regex, caseSensitive) {
|
|
90
|
+
const flags = caseSensitive ? "gm" : "gim";
|
|
91
|
+
if (regex) {
|
|
92
|
+
try {
|
|
93
|
+
const searchRegex = new RegExp(query, flags);
|
|
94
|
+
logger.debug("TOOL", "Regex pattern compiled", { query, flags });
|
|
95
|
+
return searchRegex;
|
|
96
|
+
}
|
|
97
|
+
catch (e) {
|
|
98
|
+
logger.error("TOOL", "Invalid regex pattern", e instanceof Error ? e : new Error(String(e)), { query });
|
|
99
|
+
throw new Error(`Invalid regex pattern: ${e.message}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const escapedQuery = query.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
103
|
+
const searchRegex = new RegExp(escapedQuery, flags);
|
|
104
|
+
logger.debug("TOOL", "Escaped query compiled to regex", {
|
|
105
|
+
originalQuery: query,
|
|
106
|
+
flags,
|
|
107
|
+
});
|
|
108
|
+
return searchRegex;
|
|
109
|
+
}
|
|
110
|
+
async function performGrepSearch(filesToSearch, searchRegex, maxResults) {
|
|
111
|
+
const results = [];
|
|
112
|
+
let totalMatches = 0;
|
|
113
|
+
for (const file of filesToSearch) {
|
|
114
|
+
if (totalMatches >= maxResults) {
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
if (await isTextFile(file)) {
|
|
118
|
+
try {
|
|
119
|
+
const content = await readFileContent(file);
|
|
120
|
+
const fileMatches = searchFileContent(content, searchRegex);
|
|
121
|
+
if (fileMatches.length > 0) {
|
|
122
|
+
const limitedMatches = fileMatches.slice(0, maxResults - totalMatches);
|
|
123
|
+
results.push({ path: file, matches: limitedMatches });
|
|
124
|
+
totalMatches += limitedMatches.length;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return results;
|
|
132
|
+
}
|
|
133
|
+
function formatGrepResults(results, query) {
|
|
134
|
+
if (results.length === 0) {
|
|
135
|
+
return `No matches found for query "${query}" in the searched files`;
|
|
136
|
+
}
|
|
137
|
+
const totalMatches = results.reduce((sum, r) => sum + r.matches.length, 0);
|
|
138
|
+
let output = `Found ${totalMatches} matches for query "${query}" in ${results.length} files:\n\n`;
|
|
139
|
+
for (const result of results) {
|
|
140
|
+
output += `File: ${result.path}\n`;
|
|
141
|
+
for (const match of result.matches) {
|
|
142
|
+
output += ` Line ${match.line}, Col ${match.column}: ${match.text}\n`;
|
|
143
|
+
}
|
|
144
|
+
output += "\n";
|
|
145
|
+
}
|
|
146
|
+
return output;
|
|
147
|
+
}
|
|
148
|
+
export const grepContentTool = tool(async ({ searchPath = ".", query, patterns = ["*"], caseSensitive = false, regex = false, recursive = true, maxResults = 100, }, config) => {
|
|
149
|
+
const timingId = logger.timingStart("grepContent");
|
|
150
|
+
logger.info("TOOL", "grep_content called", {
|
|
151
|
+
searchPath,
|
|
152
|
+
queryLength: query.length,
|
|
153
|
+
patterns,
|
|
154
|
+
caseSensitive,
|
|
155
|
+
regex,
|
|
156
|
+
recursive,
|
|
157
|
+
maxResults,
|
|
158
|
+
});
|
|
159
|
+
try {
|
|
160
|
+
const workingDir = config?.context?.workingDir;
|
|
161
|
+
if (!workingDir) {
|
|
162
|
+
throw new Error("Context with workingDir is required for file operations");
|
|
163
|
+
}
|
|
164
|
+
logger.debug("TOOL", "Working directory", {
|
|
165
|
+
workingDir: workingDir.replace(Bun.env.HOME || "", "~"),
|
|
166
|
+
});
|
|
167
|
+
if (!query) {
|
|
168
|
+
logger.error("TOOL", "Query parameter missing", undefined, {});
|
|
169
|
+
throw new Error('The "query" parameter is required');
|
|
170
|
+
}
|
|
171
|
+
const resolvedPath = await validateAndResolvePath(workingDir, searchPath);
|
|
172
|
+
const filesToSearch = await findFilesToSearch(resolvedPath, patterns, recursive);
|
|
173
|
+
const searchRegex = compileSearchRegex(query, regex, caseSensitive);
|
|
174
|
+
const results = await performGrepSearch(filesToSearch, searchRegex, maxResults);
|
|
175
|
+
logger.timingEnd(timingId, "TOOL", "grep_content completed");
|
|
176
|
+
logger.debug("TOOL", "Search completed", {
|
|
177
|
+
filesSearched: filesToSearch.length,
|
|
178
|
+
filesWithMatches: results.length,
|
|
179
|
+
totalMatches: results.reduce((sum, r) => sum + r.matches.length, 0),
|
|
180
|
+
});
|
|
181
|
+
return formatGrepResults(results, query);
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
logger.error("TOOL", "grep_content failed", error instanceof Error ? error : new Error(String(error)), { searchPath, query });
|
|
185
|
+
return `Error searching content: ${error.message}`;
|
|
186
|
+
}
|
|
187
|
+
}, {
|
|
188
|
+
name: "grep_content",
|
|
189
|
+
description: `A powerful search tool built on ripgrep
|
|
190
|
+
|
|
191
|
+
Usage:
|
|
192
|
+
- ALWAYS use grep_content for search tasks.
|
|
193
|
+
- Supports full regex syntax (e.g., "log.*Error", "function\\s+\\w+")
|
|
194
|
+
- Filter files with glob parameter (e.g., "*.js", "**/*.tsx") or type parameter (e.g., "js", "py", "rust")
|
|
195
|
+
- Pattern syntax: Uses ripgrep (not grep) - literal braces need escaping (use \`interface{}\` to find \`interface{}\` in Go code)
|
|
196
|
+
`,
|
|
197
|
+
schema: z.object({
|
|
198
|
+
searchPath: z.string().describe("The directory path to search in"),
|
|
199
|
+
query: z
|
|
200
|
+
.string()
|
|
201
|
+
.describe("The search query - the text or pattern to look for in files"),
|
|
202
|
+
patterns: z
|
|
203
|
+
.array(z.string())
|
|
204
|
+
.optional()
|
|
205
|
+
.default(["*"])
|
|
206
|
+
.describe("File patterns to search in (e.g., ['*.js', '*.ts'])"),
|
|
207
|
+
caseSensitive: z
|
|
208
|
+
.boolean()
|
|
209
|
+
.optional()
|
|
210
|
+
.default(false)
|
|
211
|
+
.describe("Whether the search should be case-sensitive. Defaults to `false`"),
|
|
212
|
+
regex: z
|
|
213
|
+
.boolean()
|
|
214
|
+
.optional()
|
|
215
|
+
.default(false)
|
|
216
|
+
.describe("Whether the query should be treated as a regular expression. Defaults to `false`"),
|
|
217
|
+
recursive: z
|
|
218
|
+
.boolean()
|
|
219
|
+
.optional()
|
|
220
|
+
.default(true)
|
|
221
|
+
.describe("Whether to search recursively in subdirectories. Defaults to `true`"),
|
|
222
|
+
maxResults: z
|
|
223
|
+
.number()
|
|
224
|
+
.optional()
|
|
225
|
+
.default(100)
|
|
226
|
+
.describe("Maximum number of matches to return. Defaults to 100"),
|
|
227
|
+
}),
|
|
228
|
+
});
|
|
229
|
+
//# sourceMappingURL=grep-content.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grep-content.tool.js","sourceRoot":"","sources":["../../src/tools/grep-content.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-utils.d.ts","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"AAWA,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA2BnE"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
export async function isTextFile(filePath) {
|
|
3
|
+
const textExtensions = new Set([
|
|
4
|
+
'.txt', '.js', '.ts', '.jsx', '.tsx', '.json', '.yaml', '.yml', '.md',
|
|
5
|
+
'.html', '.htm', '.css', '.scss', '.sass', '.less', '.py', '.rb', '.java',
|
|
6
|
+
'.cpp', '.c', '.h', '.hpp', '.go', '.rs', '.php', '.sql', '.xml', '.csv',
|
|
7
|
+
'.toml', '.lock', '.sh', '.bash', '.zsh', '.env', '.dockerfile', 'dockerfile',
|
|
8
|
+
'.gitignore', '.npmrc', '.prettierrc', '.eslintrc', '.editorconfig', '.jsonc'
|
|
9
|
+
]);
|
|
10
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
11
|
+
if (textExtensions.has(ext)) {
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
const buffer = await Bun.file(filePath).arrayBuffer();
|
|
16
|
+
const uint8Array = new Uint8Array(buffer);
|
|
17
|
+
for (let i = 0; i < Math.min(512, uint8Array.length); i++) {
|
|
18
|
+
if (uint8Array[i] === 0) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=file-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"AAKA,OAAO,IAAI,MAAM,WAAW,CAAC;AAM7B,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;QAC7B,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK;QACrE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO;QACzE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;QACxE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY;QAC7E,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,QAAQ;KAC9E,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACjD,IAAI,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAGA,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QACtD,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1D,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxB,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export type LogLevel = 'INFO' | 'DEBUG' | 'WARN' | 'ERROR';
|
|
2
|
+
export type LogComponent = 'CLI' | 'CONFIG' | 'LIBRARIAN' | 'AGENT' | 'TOOL' | 'LLM' | 'GIT' | 'PATH' | 'LOGGER' | 'TIMING';
|
|
3
|
+
interface LogMetadata {
|
|
4
|
+
[key: string]: unknown;
|
|
5
|
+
}
|
|
6
|
+
declare class Logger {
|
|
7
|
+
private static instance;
|
|
8
|
+
private writer;
|
|
9
|
+
private debugMode;
|
|
10
|
+
private readonly timingOperations;
|
|
11
|
+
private constructor();
|
|
12
|
+
static getInstance(): Logger;
|
|
13
|
+
setDebugMode(enabled: boolean): void;
|
|
14
|
+
private initializeLogFile;
|
|
15
|
+
private formatTimestamp;
|
|
16
|
+
private redactMetadata;
|
|
17
|
+
private getRedactedValue;
|
|
18
|
+
private redactUrl;
|
|
19
|
+
private formatLogEntry;
|
|
20
|
+
private writeLog;
|
|
21
|
+
private log;
|
|
22
|
+
info(component: LogComponent, message: string, metadata?: LogMetadata): void;
|
|
23
|
+
debug(component: LogComponent, message: string, metadata?: LogMetadata): void;
|
|
24
|
+
warn(component: LogComponent, message: string, metadata?: LogMetadata): void;
|
|
25
|
+
error(component: LogComponent, message: string, error?: Error, metadata?: LogMetadata): void;
|
|
26
|
+
timingStart(operation: string): string;
|
|
27
|
+
timingEnd(operationId: string, component: LogComponent, message?: string): void;
|
|
28
|
+
close(): void;
|
|
29
|
+
}
|
|
30
|
+
export declare const logger: Logger;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;AAC3D,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE5H,UAAU,WAAW;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAOD,cAAM,MAAM;IACV,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAS;IAChC,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA2C;IAE5E,OAAO;IAMP,MAAM,CAAC,WAAW,IAAI,MAAM;IAO5B,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;YAQtB,iBAAiB;IAgD/B,OAAO,CAAC,eAAe;IAgBvB,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,gBAAgB;IA0BxB,OAAO,CAAC,SAAS;IAYjB,OAAO,CAAC,cAAc;IAerB,OAAO,CAAC,QAAQ;IAajB,OAAO,CAAC,GAAG;IAYX,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,IAAI;IAO5E,KAAK,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,IAAI;IAS7E,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,IAAI;IAO5E,KAAK,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,IAAI;IAoB5F,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAetC,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAqB9E,KAAK,IAAI,IAAI;CASf;AAGD,eAAO,MAAM,MAAM,QAAuB,CAAC"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { mkdir } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
class Logger {
|
|
5
|
+
static instance;
|
|
6
|
+
writer = null;
|
|
7
|
+
debugMode = false;
|
|
8
|
+
timingOperations = new Map();
|
|
9
|
+
constructor() {
|
|
10
|
+
this.initializeLogFile().catch(() => {
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
static getInstance() {
|
|
14
|
+
if (!Logger.instance) {
|
|
15
|
+
Logger.instance = new Logger();
|
|
16
|
+
}
|
|
17
|
+
return Logger.instance;
|
|
18
|
+
}
|
|
19
|
+
setDebugMode(enabled) {
|
|
20
|
+
this.debugMode = enabled;
|
|
21
|
+
}
|
|
22
|
+
async initializeLogFile() {
|
|
23
|
+
try {
|
|
24
|
+
const now = new Date();
|
|
25
|
+
const isoString = now.toISOString();
|
|
26
|
+
if (!isoString) {
|
|
27
|
+
throw new Error('Failed to generate timestamp');
|
|
28
|
+
}
|
|
29
|
+
const year = now.getFullYear();
|
|
30
|
+
const month = String(now.getMonth() + 1).padStart(2, '0');
|
|
31
|
+
const day = String(now.getDate()).padStart(2, '0');
|
|
32
|
+
const hours = String(now.getHours()).padStart(2, '0');
|
|
33
|
+
const minutes = String(now.getMinutes()).padStart(2, '0');
|
|
34
|
+
const seconds = String(now.getSeconds()).padStart(2, '0');
|
|
35
|
+
const ms = String(now.getMilliseconds()).padStart(3, '0');
|
|
36
|
+
const timestamp = `${year}-${month}-${day}_${hours}-${minutes}-${seconds}_${ms}`;
|
|
37
|
+
const logDir = path.join(os.homedir(), '.config', 'librarian', 'logs');
|
|
38
|
+
if (!(await Bun.file(logDir).exists())) {
|
|
39
|
+
await mkdir(logDir, { recursive: true });
|
|
40
|
+
}
|
|
41
|
+
const logFilename = `${timestamp}-librarian.log`;
|
|
42
|
+
const logPath = path.join(logDir, logFilename);
|
|
43
|
+
const logFile = Bun.file(logPath);
|
|
44
|
+
this.writer = logFile.writer();
|
|
45
|
+
this.info('LOGGER', `Logging initialized: ${logPath}`);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
formatTimestamp() {
|
|
51
|
+
const now = new Date();
|
|
52
|
+
const year = now.getFullYear();
|
|
53
|
+
const month = String(now.getMonth() + 1).padStart(2, '0');
|
|
54
|
+
const day = String(now.getDate()).padStart(2, '0');
|
|
55
|
+
const hours = String(now.getHours()).padStart(2, '0');
|
|
56
|
+
const minutes = String(now.getMinutes()).padStart(2, '0');
|
|
57
|
+
const seconds = String(now.getSeconds()).padStart(2, '0');
|
|
58
|
+
const ms = String(now.getMilliseconds()).padStart(3, '0');
|
|
59
|
+
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${ms}`;
|
|
60
|
+
}
|
|
61
|
+
redactMetadata(metadata) {
|
|
62
|
+
const redacted = {};
|
|
63
|
+
for (const [key, value] of Object.entries(metadata)) {
|
|
64
|
+
redacted[key] = this.getRedactedValue(key, value);
|
|
65
|
+
}
|
|
66
|
+
return redacted;
|
|
67
|
+
}
|
|
68
|
+
getRedactedValue(key, value) {
|
|
69
|
+
const lowerKey = key.toLowerCase();
|
|
70
|
+
if (['apiKey', 'token', 'secret', 'password'].includes(lowerKey)) {
|
|
71
|
+
return '[REDACTED]';
|
|
72
|
+
}
|
|
73
|
+
if ((key === 'query' || key === 'content') && typeof value === 'string') {
|
|
74
|
+
return value.length;
|
|
75
|
+
}
|
|
76
|
+
if ((key === 'repoUrl' || key === 'baseURL') && typeof value === 'string') {
|
|
77
|
+
return this.redactUrl(value);
|
|
78
|
+
}
|
|
79
|
+
if (key === 'workingDir' && typeof value === 'string') {
|
|
80
|
+
return value.replace(os.homedir(), '~');
|
|
81
|
+
}
|
|
82
|
+
if (typeof value === 'string' && (value.includes(os.homedir()) || value.includes('/home/'))) {
|
|
83
|
+
return value.replace(os.homedir(), '~');
|
|
84
|
+
}
|
|
85
|
+
return value;
|
|
86
|
+
}
|
|
87
|
+
redactUrl(value) {
|
|
88
|
+
try {
|
|
89
|
+
const url = new URL(value);
|
|
90
|
+
return url.hostname;
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return '[INVALID_URL]';
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
formatLogEntry(level, component, message, metadata) {
|
|
97
|
+
const timestamp = this.formatTimestamp();
|
|
98
|
+
let entry = `[${timestamp}] [${level}] [${component}] ${message}`;
|
|
99
|
+
if (metadata && Object.keys(metadata).length > 0) {
|
|
100
|
+
const redactedMetadata = this.redactMetadata(metadata);
|
|
101
|
+
entry += ` | ${JSON.stringify(redactedMetadata)}`;
|
|
102
|
+
}
|
|
103
|
+
return entry;
|
|
104
|
+
}
|
|
105
|
+
writeLog(entry) {
|
|
106
|
+
try {
|
|
107
|
+
if (this.writer) {
|
|
108
|
+
this.writer.write(`${entry}\n`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
log(level, component, message, metadata) {
|
|
115
|
+
try {
|
|
116
|
+
const entry = this.formatLogEntry(level, component, message, metadata);
|
|
117
|
+
this.writeLog(entry);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
info(component, message, metadata) {
|
|
123
|
+
this.log('INFO', component, message, metadata);
|
|
124
|
+
}
|
|
125
|
+
debug(component, message, metadata) {
|
|
126
|
+
if (this.debugMode) {
|
|
127
|
+
this.log('DEBUG', component, message, metadata);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
warn(component, message, metadata) {
|
|
131
|
+
this.log('WARN', component, message, metadata);
|
|
132
|
+
}
|
|
133
|
+
error(component, message, error, metadata) {
|
|
134
|
+
const errorMetadata = metadata ? { ...metadata } : {};
|
|
135
|
+
if (error) {
|
|
136
|
+
errorMetadata.errorName = error.name;
|
|
137
|
+
errorMetadata.errorMessage = error.message;
|
|
138
|
+
if (error.stack) {
|
|
139
|
+
errorMetadata.stack = error.stack;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
this.log('ERROR', component, message, errorMetadata);
|
|
143
|
+
}
|
|
144
|
+
timingStart(operation) {
|
|
145
|
+
const operationId = `${operation}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
146
|
+
this.timingOperations.set(operationId, {
|
|
147
|
+
operation,
|
|
148
|
+
startTime: performance.now()
|
|
149
|
+
});
|
|
150
|
+
this.debug('TIMING', `Started: ${operation}`);
|
|
151
|
+
return operationId;
|
|
152
|
+
}
|
|
153
|
+
timingEnd(operationId, component, message) {
|
|
154
|
+
const timing = this.timingOperations.get(operationId);
|
|
155
|
+
if (timing) {
|
|
156
|
+
const duration = performance.now() - timing.startTime;
|
|
157
|
+
const durationMs = Math.round(duration);
|
|
158
|
+
this.timingOperations.delete(operationId);
|
|
159
|
+
const logMessage = message || `Completed: ${timing.operation}`;
|
|
160
|
+
this.info(component, logMessage, { duration: `${durationMs}ms` });
|
|
161
|
+
if (this.debugMode) {
|
|
162
|
+
this.debug('TIMING', `Ended: ${timing.operation}`, { durationMs });
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
close() {
|
|
167
|
+
try {
|
|
168
|
+
if (this.writer) {
|
|
169
|
+
this.writer.end();
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
export const logger = Logger.getInstance();
|
|
177
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-utils.d.ts","sourceRoot":"","sources":["../../src/utils/path-utils.ts"],"names":[],"mappings":"AAWA,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKpD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-utils.js","sourceRoot":"","sources":["../../src/utils/path-utils.ts"],"names":[],"mappings":"AAKA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAKzB,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@skroyc/librarian",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Librarian CLI - Technology Research Agent",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"librarian": "./dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"require": "./dist/index.js"
|
|
14
|
+
},
|
|
15
|
+
"./cli": {
|
|
16
|
+
"types": "./dist/cli.d.ts",
|
|
17
|
+
"import": "./dist/cli.js",
|
|
18
|
+
"require": "./dist/cli.js"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"publishConfig": {
|
|
22
|
+
"access": "public",
|
|
23
|
+
"registry": "https://registry.npmjs.org/"
|
|
24
|
+
},
|
|
25
|
+
"engines": {
|
|
26
|
+
"node": ">=20.0.0",
|
|
27
|
+
"bun": ">=1.0.0"
|
|
28
|
+
},
|
|
29
|
+
"type": "module",
|
|
30
|
+
"scripts": {
|
|
31
|
+
"prepublishOnly": "npm run build:dev",
|
|
32
|
+
"build": "bun build --outfile librarian --target bun ./src/cli.ts",
|
|
33
|
+
"build:dev": "tsc",
|
|
34
|
+
"test": "bun test tests/",
|
|
35
|
+
"test:watch": "bun test --watch tests/",
|
|
36
|
+
"lint": "eslint src --ext .ts",
|
|
37
|
+
"start": "bun dist/index.js",
|
|
38
|
+
"cli": "bun dist/cli.js",
|
|
39
|
+
"postinstall": "bunx bun2nix -o bun.nix"
|
|
40
|
+
},
|
|
41
|
+
"keywords": [
|
|
42
|
+
"cli",
|
|
43
|
+
"research",
|
|
44
|
+
"ai",
|
|
45
|
+
"typescript",
|
|
46
|
+
"langchain",
|
|
47
|
+
"git"
|
|
48
|
+
],
|
|
49
|
+
"author": "Oscar",
|
|
50
|
+
"license": "Apache-2.0",
|
|
51
|
+
"repository": {
|
|
52
|
+
"type": "git",
|
|
53
|
+
"url": "https://github.com/SkrOYC/librarian.git"
|
|
54
|
+
},
|
|
55
|
+
"homepage": "https://github.com/SkrOYC/librarian#readme",
|
|
56
|
+
"bugs": {
|
|
57
|
+
"url": "https://github.com/SkrOYC/librarian/issues"
|
|
58
|
+
},
|
|
59
|
+
"dependencies": {
|
|
60
|
+
"@langchain/anthropic": "^1.3.2",
|
|
61
|
+
"@langchain/core": "^1.1.7",
|
|
62
|
+
"@langchain/google-genai": "^2.1.2",
|
|
63
|
+
"@langchain/langgraph": "^1.0.7",
|
|
64
|
+
"@langchain/openai": "^1.2.0",
|
|
65
|
+
"commander": "^14.0.2",
|
|
66
|
+
"glob": "^13.0.0",
|
|
67
|
+
"isomorphic-git": "^1.36.1",
|
|
68
|
+
"langchain": "^1.2.2",
|
|
69
|
+
"yaml": "^2.8.2",
|
|
70
|
+
"zod": "^4.2.1"
|
|
71
|
+
},
|
|
72
|
+
"devDependencies": {
|
|
73
|
+
"@biomejs/biome": "2.3.11",
|
|
74
|
+
"@types/bun": "^1.3.5",
|
|
75
|
+
"@types/node": "^25.0.3",
|
|
76
|
+
"@typescript-eslint/eslint-plugin": "^8.50.0",
|
|
77
|
+
"@typescript-eslint/parser": "^8.50.0",
|
|
78
|
+
"bun-types": "^1.3.5",
|
|
79
|
+
"bun2nix": "^2.0.6",
|
|
80
|
+
"eslint": "^9.39.2",
|
|
81
|
+
"typescript": "^5.9.3",
|
|
82
|
+
"ultracite": "7.0.11"
|
|
83
|
+
}
|
|
84
|
+
}
|