@tarunspandit/codexflow 0.29.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 (92) hide show
  1. package/AGENTS.example.md +18 -0
  2. package/CHANGELOG.md +311 -0
  3. package/CHATGPT_PROMPT.md +12 -0
  4. package/CODEX_PROMPT.md +12 -0
  5. package/CONTRIBUTING.md +51 -0
  6. package/DOMAIN_SETUP.md +241 -0
  7. package/FAQ.md +327 -0
  8. package/FAQ_ZH.md +279 -0
  9. package/LICENSE +21 -0
  10. package/NOTICE +9 -0
  11. package/PUBLIC_LAUNCH_CHECKLIST.md +111 -0
  12. package/README.md +287 -0
  13. package/README_ZH.md +461 -0
  14. package/SECURITY.md +145 -0
  15. package/config.example.env +31 -0
  16. package/dist/analysis/cache.js +27 -0
  17. package/dist/analysis/cache.js.map +1 -0
  18. package/dist/analysis/classify.js +102 -0
  19. package/dist/analysis/classify.js.map +1 -0
  20. package/dist/analysis/extract.js +139 -0
  21. package/dist/analysis/extract.js.map +1 -0
  22. package/dist/analysis/graph.js +22 -0
  23. package/dist/analysis/graph.js.map +1 -0
  24. package/dist/analysis/impact.js +167 -0
  25. package/dist/analysis/impact.js.map +1 -0
  26. package/dist/analysis/index.js +215 -0
  27. package/dist/analysis/index.js.map +1 -0
  28. package/dist/analysis/inventory.js +51 -0
  29. package/dist/analysis/inventory.js.map +1 -0
  30. package/dist/analysis/providers.js +24 -0
  31. package/dist/analysis/providers.js.map +1 -0
  32. package/dist/analysis/rank.js +27 -0
  33. package/dist/analysis/rank.js.map +1 -0
  34. package/dist/analysis/types.js +8 -0
  35. package/dist/analysis/types.js.map +1 -0
  36. package/dist/bashOps.js +233 -0
  37. package/dist/bashOps.js.map +1 -0
  38. package/dist/capabilitiesOps.js +365 -0
  39. package/dist/capabilitiesOps.js.map +1 -0
  40. package/dist/codexSessions.js +379 -0
  41. package/dist/codexSessions.js.map +1 -0
  42. package/dist/config.js +289 -0
  43. package/dist/config.js.map +1 -0
  44. package/dist/fsOps.js +286 -0
  45. package/dist/fsOps.js.map +1 -0
  46. package/dist/gitOps.js +79 -0
  47. package/dist/gitOps.js.map +1 -0
  48. package/dist/guard.js +198 -0
  49. package/dist/guard.js.map +1 -0
  50. package/dist/http.js +1671 -0
  51. package/dist/http.js.map +1 -0
  52. package/dist/proContext.js +274 -0
  53. package/dist/proContext.js.map +1 -0
  54. package/dist/profileStore.js +89 -0
  55. package/dist/profileStore.js.map +1 -0
  56. package/dist/projectCatalog.js +134 -0
  57. package/dist/projectCatalog.js.map +1 -0
  58. package/dist/redact.js +73 -0
  59. package/dist/redact.js.map +1 -0
  60. package/dist/searchOps.js +186 -0
  61. package/dist/searchOps.js.map +1 -0
  62. package/dist/server.js +2502 -0
  63. package/dist/server.js.map +1 -0
  64. package/dist/stdio.js +36 -0
  65. package/dist/stdio.js.map +1 -0
  66. package/dist/toolCardWidget.js +1155 -0
  67. package/dist/toolCardWidget.js.map +1 -0
  68. package/dist/workspaceOps.js +229 -0
  69. package/dist/workspaceOps.js.map +1 -0
  70. package/docs/.nojekyll +1 -0
  71. package/docs/favicon.svg +5 -0
  72. package/docs/index.html +638 -0
  73. package/docs/og.png +0 -0
  74. package/docs/script.js +80 -0
  75. package/docs/star.svg +11 -0
  76. package/docs/styles.css +1229 -0
  77. package/docs/zh.html +436 -0
  78. package/package.json +94 -0
  79. package/scripts/analysis-cli-smoke.mjs +81 -0
  80. package/scripts/analysis-smoke.mjs +179 -0
  81. package/scripts/clean.mjs +6 -0
  82. package/scripts/cli-smoke.mjs +168 -0
  83. package/scripts/codexflow.mjs +4375 -0
  84. package/scripts/doctor-smoke.mjs +90 -0
  85. package/scripts/execute-handoff-smoke.mjs +1110 -0
  86. package/scripts/http-smoke.mjs +812 -0
  87. package/scripts/pro-apply.mjs +141 -0
  88. package/scripts/pro-bundle.mjs +121 -0
  89. package/scripts/pro-smoke.mjs +95 -0
  90. package/scripts/settings-smoke.mjs +756 -0
  91. package/scripts/smoke.mjs +1194 -0
  92. package/scripts/stress.mjs +835 -0
@@ -0,0 +1,215 @@
1
+ import fsp from "node:fs/promises";
2
+ import { redactSensitiveText } from "../redact.js";
3
+ import { detectProjectTypes } from "./classify.js";
4
+ import { getCachedWorkspaceAnalysis, setCachedWorkspaceAnalysis } from "./cache.js";
5
+ import { extractWorkspaceFiles } from "./extract.js";
6
+ import { buildRelationships } from "./graph.js";
7
+ import { inventoryWorkspace } from "./inventory.js";
8
+ import { classifySearchIntent, emptySearchGroups, groupForFile, sortStructuredMatches } from "./rank.js";
9
+ function cacheKey(workspace, fingerprint, config) {
10
+ return `${workspace.id}:${fingerprint}:${JSON.stringify(config.analysisLimits)}`;
11
+ }
12
+ function areasFor(files) {
13
+ const counts = new Map();
14
+ for (const file of files) {
15
+ const top = file.path.includes("/") ? file.path.split("/")[0] : ".";
16
+ const current = counts.get(top) ?? { role: file.role, files: 0 };
17
+ current.files += 1;
18
+ if (current.role === "other" && file.role !== "other")
19
+ current.role = file.role;
20
+ counts.set(top, current);
21
+ }
22
+ return [...counts.entries()].map(([areaPath, value]) => ({ path: areaPath, ...value })).sort((a, b) => b.files - a.files || a.path.localeCompare(b.path));
23
+ }
24
+ export async function inspectWorkspace(config, guard, workspace) {
25
+ if (!config.analysisEnabled)
26
+ throw new Error("Repository analysis is disabled by CODEXFLOW_ANALYSIS=0.");
27
+ const inventory = await inventoryWorkspace(config, guard, workspace);
28
+ const key = cacheKey(workspace, inventory.fingerprint, config);
29
+ const cached = getCachedWorkspaceAnalysis(key);
30
+ if (cached)
31
+ return { ...cached, cache: { hit: true, key } };
32
+ const extraction = await extractWorkspaceFiles(config, guard, workspace, inventory.files);
33
+ const symbols = extraction.files.flatMap((file) => file.symbols).slice(0, config.analysisLimits.maxSymbols);
34
+ const relationships = buildRelationships(extraction.files, inventory.files, config.analysisLimits.maxRelationships);
35
+ const languages = [...new Set(inventory.files.map((file) => file.language).filter((language) => language !== "unknown"))].sort();
36
+ const warnings = [...inventory.coverage.warnings, ...extraction.warnings];
37
+ const result = {
38
+ schemaVersion: 1,
39
+ workspaceId: workspace.id,
40
+ root: workspace.root,
41
+ languages,
42
+ projectTypes: detectProjectTypes(inventory.files),
43
+ entrypoints: inventory.files.filter((file) => file.entrypoint).map((file) => file.path),
44
+ importantFiles: inventory.files.filter((file) => file.role === "config" || /(^|\/)(README|AGENTS)\.md$/i.test(file.path)).map((file) => file.path),
45
+ areas: areasFor(inventory.files),
46
+ files: inventory.files,
47
+ symbols,
48
+ relationships,
49
+ coverage: {
50
+ ...inventory.coverage,
51
+ analyzedFiles: extraction.analyzedFiles,
52
+ scannedBytes: extraction.scannedBytes,
53
+ symbolCount: symbols.length,
54
+ relationshipCount: relationships.length,
55
+ truncated: inventory.coverage.truncated || extraction.truncated,
56
+ warnings
57
+ },
58
+ warnings,
59
+ fingerprint: inventory.fingerprint,
60
+ cache: { hit: false, key }
61
+ };
62
+ setCachedWorkspaceAnalysis(key, result);
63
+ return result;
64
+ }
65
+ export async function searchWorkspaceStructured(config, guard, workspace, options) {
66
+ const query = options.query.trim();
67
+ if (!query)
68
+ throw new Error("query is required.");
69
+ const analysis = await inspectWorkspace(config, guard, workspace);
70
+ const intent = classifySearchIntent(query, options.intent ?? "auto", options.regex);
71
+ const groups = emptySearchGroups();
72
+ const lowered = query.toLowerCase();
73
+ const matches = [];
74
+ const warnings = [...analysis.warnings];
75
+ const resultLimit = Math.max(1, Math.min(options.maxResults ?? config.maxSearchResults, config.maxSearchResults));
76
+ const candidateLimit = Math.max(resultLimit, Math.min(resultLimit * 4, 20_000));
77
+ const resolvedRoot = options.root?.trim() ? guard.resolve(workspace, options.root).relPath.replace(/^\.\/?$/, "") : "";
78
+ const inScope = (filePath) => !resolvedRoot || filePath === resolvedRoot || filePath.startsWith(`${resolvedRoot}/`);
79
+ const definitionsByPath = new Map();
80
+ for (const symbol of analysis.symbols) {
81
+ const byLine = definitionsByPath.get(symbol.path) ?? new Map();
82
+ byLine.set(symbol.line, symbol);
83
+ definitionsByPath.set(symbol.path, byLine);
84
+ }
85
+ if (options.regex) {
86
+ warnings.push("Grouped results are unavailable for regular expression searches. Lexical regex matching remains delegated to ripgrep.");
87
+ return {
88
+ schemaVersion: 1,
89
+ query,
90
+ intent,
91
+ groups,
92
+ matches: [],
93
+ coverage: { ...analysis.coverage, truncated: true, warnings },
94
+ warnings,
95
+ cache: analysis.cache
96
+ };
97
+ }
98
+ let scannedFiles = 0;
99
+ let scannedBytes = 0;
100
+ let searchBudgetReached = false;
101
+ let candidateLimitReached = false;
102
+ let skippedFiles = 0;
103
+ scan: for (const file of analysis.files) {
104
+ if (file.generated || (!options.includeTests && file.role === "test"))
105
+ continue;
106
+ if (!inScope(file.path) && !(options.includeTests && file.role === "test"))
107
+ continue;
108
+ if (scannedFiles >= config.analysisLimits.maxAnalyzedFiles || scannedBytes + file.bytes > config.analysisLimits.maxScannedBytes) {
109
+ searchBudgetReached = true;
110
+ break;
111
+ }
112
+ let text;
113
+ try {
114
+ const resolved = guard.resolve(workspace, file.path);
115
+ text = await fsp.readFile(resolved.absPath, "utf8");
116
+ }
117
+ catch {
118
+ skippedFiles += 1;
119
+ continue;
120
+ }
121
+ const actualBytes = Buffer.byteLength(text, "utf8");
122
+ if (scannedBytes + actualBytes > config.analysisLimits.maxScannedBytes) {
123
+ searchBudgetReached = true;
124
+ break;
125
+ }
126
+ scannedFiles += 1;
127
+ scannedBytes += actualBytes;
128
+ const definitions = definitionsByPath.get(file.path) ?? new Map();
129
+ const lines = text.split(/\r?\n/);
130
+ for (let index = 0; index < lines.length; index += 1) {
131
+ const line = lines[index];
132
+ if (!line.toLowerCase().includes(lowered))
133
+ continue;
134
+ const symbol = definitions.get(index + 1);
135
+ const isDefinition = Boolean(symbol && symbol.name.toLowerCase() === lowered);
136
+ const group = groupForFile(analysis, file.path, isDefinition);
137
+ const reasons = isDefinition ? ["exact text match", "symbol definition"] : file.role === "test" ? ["exact text match", "related test"] : ["exact text match"];
138
+ if (matches.length >= candidateLimit) {
139
+ candidateLimitReached = true;
140
+ break scan;
141
+ }
142
+ matches.push({
143
+ path: file.path,
144
+ line: index + 1,
145
+ text: redactSensitiveText(line.trim().slice(0, 400)),
146
+ group,
147
+ score: isDefinition ? 190 : file.role === "test" ? 160 : 100,
148
+ reasons,
149
+ confidence: isDefinition ? "strong" : "exact",
150
+ source: "built-in analysis"
151
+ });
152
+ }
153
+ }
154
+ if (searchBudgetReached)
155
+ warnings.push("Grouped search reached its configured file or byte limit.");
156
+ if (skippedFiles)
157
+ warnings.push(`Grouped search skipped ${skippedFiles} file${skippedFiles === 1 ? "" : "s"} that changed or became unreadable during analysis.`);
158
+ if (intent === "references" || intent === "impact") {
159
+ const definitionPaths = new Set(analysis.symbols
160
+ .filter((symbol) => symbol.name.toLowerCase() === lowered)
161
+ .map((symbol) => symbol.path));
162
+ for (const relationship of analysis.relationships) {
163
+ if (!definitionPaths.has(relationship.to))
164
+ continue;
165
+ const group = relationship.kind === "tests" ? "tests" : "references";
166
+ if (group === "tests" && !options.includeTests)
167
+ continue;
168
+ const reason = relationship.kind === "tests" ? "dependent test" : "dependent module";
169
+ const existing = matches.find((match) => match.path === relationship.from && match.group === group);
170
+ if (existing) {
171
+ if (!existing.reasons.includes(reason))
172
+ existing.reasons.push(reason);
173
+ existing.score = Math.max(existing.score, relationship.kind === "tests" ? 170 : 165);
174
+ existing.confidence = "strong";
175
+ continue;
176
+ }
177
+ if (matches.length >= candidateLimit) {
178
+ candidateLimitReached = true;
179
+ continue;
180
+ }
181
+ matches.push({
182
+ path: relationship.from,
183
+ line: 1,
184
+ text: `${relationship.kind} ${relationship.to}`,
185
+ group,
186
+ score: relationship.kind === "tests" ? 170 : 165,
187
+ reasons: [reason, `${relationship.kind} relationship`],
188
+ confidence: "strong",
189
+ source: relationship.source
190
+ });
191
+ }
192
+ }
193
+ if (candidateLimitReached)
194
+ warnings.push(`Grouped search retained the first ${candidateLimit} candidates before ranking.`);
195
+ for (const match of sortStructuredMatches(matches).slice(0, resultLimit))
196
+ groups[match.group].push(match);
197
+ return {
198
+ schemaVersion: 1,
199
+ query,
200
+ intent,
201
+ groups,
202
+ matches: Object.values(groups).flat(),
203
+ coverage: {
204
+ ...analysis.coverage,
205
+ truncated: analysis.coverage.truncated || searchBudgetReached || candidateLimitReached || skippedFiles > 0,
206
+ warnings
207
+ },
208
+ warnings,
209
+ cache: analysis.cache
210
+ };
211
+ }
212
+ export { invalidateWorkspaceAnalysis } from "./cache.js";
213
+ export { reviewWorkspaceChanges } from "./impact.js";
214
+ export { listAnalysisProviders, normalizeProviderPaths, registerAnalysisProvider } from "./providers.js";
215
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analysis/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import { createHash } from "node:crypto";
2
+ import fsp from "node:fs/promises";
3
+ import { listFiles, textScanByteLimit } from "../fsOps.js";
4
+ import { classifyFileRole, classifyLanguage, isEntrypoint, isGeneratedFile } from "./classify.js";
5
+ export async function inventoryWorkspace(config, guard, workspace) {
6
+ const maxFiles = config.analysisLimits.maxInventoryFiles;
7
+ const candidates = await listFiles(guard, workspace, { root: ".", includeHidden: true, maxFiles: maxFiles + 1 });
8
+ const truncated = candidates.length > maxFiles;
9
+ const files = [];
10
+ for (const candidate of candidates.slice(0, maxFiles)) {
11
+ try {
12
+ const resolved = guard.resolve(workspace, candidate);
13
+ const stat = await fsp.stat(resolved.absPath);
14
+ if (!stat.isFile())
15
+ continue;
16
+ await guard.assertTextFile(resolved.absPath, textScanByteLimit(config));
17
+ const language = classifyLanguage(resolved.relPath);
18
+ files.push({
19
+ path: resolved.relPath,
20
+ bytes: stat.size,
21
+ modifiedMs: stat.mtimeMs,
22
+ language,
23
+ role: classifyFileRole(resolved.relPath, language),
24
+ generated: isGeneratedFile(resolved.relPath),
25
+ entrypoint: isEntrypoint(resolved.relPath)
26
+ });
27
+ }
28
+ catch {
29
+ // Blocked, escaping, unreadable, binary, and oversized files are absent by design.
30
+ }
31
+ }
32
+ files.sort((a, b) => a.path.localeCompare(b.path));
33
+ const fingerprint = createHash("sha256")
34
+ .update(files.map((file) => `${file.path}:${file.bytes}:${file.modifiedMs}`).join("\n"))
35
+ .digest("hex");
36
+ const warnings = truncated ? [`Inventory truncated at ${maxFiles} files.`] : [];
37
+ return {
38
+ files,
39
+ fingerprint,
40
+ coverage: {
41
+ inventoryFiles: files.length,
42
+ analyzedFiles: 0,
43
+ scannedBytes: 0,
44
+ symbolCount: 0,
45
+ relationshipCount: 0,
46
+ truncated,
47
+ warnings
48
+ }
49
+ };
50
+ }
51
+ //# sourceMappingURL=inventory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inventory.js","sourceRoot":"","sources":["../../src/analysis/inventory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,GAAG,MAAM,kBAAkB,CAAC;AAEnC,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAE3D,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGlG,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAuB,EAAE,KAAgB,EAAE,SAAoB;IACtG,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC;IACzD,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,GAAG,CAAC,EAAE,CAAC,CAAC;IACjH,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,GAAG,QAAQ,CAAC;IAC/C,MAAM,KAAK,GAAoB,EAAE,CAAC;IAElC,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC;QACtD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YACrD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC9C,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;gBAAE,SAAS;YAC7B,MAAM,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;YACxE,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACpD,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,QAAQ,CAAC,OAAO;gBACtB,KAAK,EAAE,IAAI,CAAC,IAAI;gBAChB,UAAU,EAAE,IAAI,CAAC,OAAO;gBACxB,QAAQ;gBACR,IAAI,EAAE,gBAAgB,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;gBAClD,SAAS,EAAE,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAC5C,UAAU,EAAE,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC;aAC3C,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,mFAAmF;QACrF,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC;SACrC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACvF,MAAM,CAAC,KAAK,CAAC,CAAC;IACjB,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,0BAA0B,QAAQ,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAChF,OAAO;QACL,KAAK;QACL,WAAW;QACX,QAAQ,EAAE;YACR,cAAc,EAAE,KAAK,CAAC,MAAM;YAC5B,aAAa,EAAE,CAAC;YAChB,YAAY,EAAE,CAAC;YACf,WAAW,EAAE,CAAC;YACd,iBAAiB,EAAE,CAAC;YACpB,SAAS;YACT,QAAQ;SACT;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { redactSensitiveText } from "../redact.js";
2
+ const providers = new Map();
3
+ export function registerAnalysisProvider(provider) {
4
+ if (!provider.id.trim())
5
+ throw new Error("Analysis provider id is required.");
6
+ providers.set(provider.id, provider);
7
+ }
8
+ export function listAnalysisProviders() {
9
+ return [...providers.values()];
10
+ }
11
+ export function normalizeProviderPaths(guard, workspace, paths) {
12
+ const valid = [];
13
+ const warnings = [];
14
+ for (const candidate of paths) {
15
+ try {
16
+ valid.push(guard.resolve(workspace, candidate).relPath);
17
+ }
18
+ catch (error) {
19
+ warnings.push(redactSensitiveText(`Provider path rejected: ${error instanceof Error ? error.message : String(error)}`));
20
+ }
21
+ }
22
+ return { paths: [...new Set(valid)], warnings };
23
+ }
24
+ //# sourceMappingURL=providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/analysis/providers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGnD,MAAM,SAAS,GAAG,IAAI,GAAG,EAA4B,CAAC;AAEtD,MAAM,UAAU,wBAAwB,CAAC,QAA0B;IACjE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAC9E,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAgB,EAAE,SAAoB,EAAE,KAAe;IAC5F,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC;QAC1D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,2BAA2B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1H,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;AAClD,CAAC"}
@@ -0,0 +1,27 @@
1
+ const GROUPS = ["definitions", "references", "tests", "configuration", "documentation", "other"];
2
+ export function emptySearchGroups() {
3
+ return { definitions: [], references: [], tests: [], configuration: [], documentation: [], other: [] };
4
+ }
5
+ export function classifySearchIntent(query, requested = "auto", regex = false) {
6
+ if (requested !== "auto")
7
+ return requested;
8
+ if (regex || /\s/.test(query) || /^['"].*['"]$/.test(query))
9
+ return "text";
10
+ return /^[A-Za-z_$][\w$]*$/.test(query) ? "symbol" : "text";
11
+ }
12
+ export function sortStructuredMatches(matches) {
13
+ return matches.sort((a, b) => b.score - a.score || a.path.localeCompare(b.path) || a.line - b.line);
14
+ }
15
+ export function groupForFile(analysis, filePath, isDefinition) {
16
+ if (isDefinition)
17
+ return "definitions";
18
+ const role = analysis.files.find((file) => file.path === filePath)?.role;
19
+ if (role === "test")
20
+ return "tests";
21
+ if (role === "config")
22
+ return "configuration";
23
+ if (role === "docs")
24
+ return "documentation";
25
+ return "references";
26
+ }
27
+ //# sourceMappingURL=rank.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rank.js","sourceRoot":"","sources":["../../src/analysis/rank.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,GAAG,CAAC,aAAa,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,OAAO,CAAU,CAAC;AAE1G,MAAM,UAAU,iBAAiB;IAC/B,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AACzG,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAa,EAAE,YAAkC,MAAM,EAAE,KAAK,GAAG,KAAK;IACzG,IAAI,SAAS,KAAK,MAAM;QAAE,OAAO,SAAS,CAAC;IAC3C,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAC3E,OAAO,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgC;IACpE,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;AACtG,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAA2B,EAAE,QAAgB,EAAE,YAAqB;IAC/F,IAAI,YAAY;QAAE,OAAO,aAAa,CAAC;IACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,IAAI,CAAC;IACzE,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,OAAO,CAAC;IACpC,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,eAAe,CAAC;IAC9C,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,eAAe,CAAC;IAC5C,OAAO,YAAY,CAAC;AACtB,CAAC"}
@@ -0,0 +1,8 @@
1
+ export const DEFAULT_ANALYSIS_LIMITS = {
2
+ maxInventoryFiles: 20_000,
3
+ maxAnalyzedFiles: 5_000,
4
+ maxScannedBytes: 64 * 1024 * 1024,
5
+ maxSymbols: 100_000,
6
+ maxRelationships: 250_000
7
+ };
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/analysis/types.ts"],"names":[],"mappings":"AA8BA,MAAM,CAAC,MAAM,uBAAuB,GAAmB;IACrD,iBAAiB,EAAE,MAAM;IACzB,gBAAgB,EAAE,KAAK;IACvB,eAAe,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;IACjC,UAAU,EAAE,OAAO;IACnB,gBAAgB,EAAE,OAAO;CAC1B,CAAC"}
@@ -0,0 +1,233 @@
1
+ import { spawn } from "node:child_process";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { CodexFlowError } from "./guard.js";
5
+ import { redactSensitiveText } from "./redact.js";
6
+ const SAFE_ALLOWED_PREFIXES = [
7
+ "pwd",
8
+ "ls",
9
+ "find",
10
+ "git status",
11
+ "git diff",
12
+ "git log",
13
+ "git show",
14
+ "git branch",
15
+ "git rev-parse",
16
+ "git ls-files",
17
+ "npm test",
18
+ "npm run test",
19
+ "npm run typecheck",
20
+ "npm run lint",
21
+ "npm run build",
22
+ "npm run check",
23
+ "pnpm test",
24
+ "pnpm run test",
25
+ "pnpm run typecheck",
26
+ "pnpm run lint",
27
+ "pnpm run build",
28
+ "pnpm run check",
29
+ "yarn test",
30
+ "yarn run test",
31
+ "yarn run typecheck",
32
+ "yarn run lint",
33
+ "yarn run build",
34
+ "yarn run check",
35
+ "bun test",
36
+ "bun run test",
37
+ "bun run typecheck",
38
+ "bun run lint",
39
+ "bun run build",
40
+ "pytest",
41
+ "python -m pytest",
42
+ "python3 -m pytest",
43
+ "uv run pytest",
44
+ "go test",
45
+ "cargo test",
46
+ "cargo check",
47
+ "cargo clippy",
48
+ "tsc",
49
+ "npx tsc",
50
+ "eslint",
51
+ "npx eslint",
52
+ "biome check",
53
+ "npx biome check"
54
+ ];
55
+ const SAFE_BLOCKED_PATTERNS = [
56
+ /(^|\s)rm\s+/,
57
+ /(^|\s)mv\s+/,
58
+ /(^|\s)cp\s+/,
59
+ /(^|\s)dd\s+/,
60
+ /(^|\s)sudo\s+/,
61
+ /(^|\s)chmod\s+/,
62
+ /(^|\s)chown\s+/,
63
+ /(^|\s)kill\s+/,
64
+ /(^|\s)pkill\s+/,
65
+ /(^|\s)curl\s+/,
66
+ /(^|\s)wget\s+/,
67
+ /(^|\s)ssh\s+/,
68
+ /(^|\s)scp\s+/,
69
+ /(^|\s)rsync\s+/,
70
+ /(^|\s)docker\s+/,
71
+ /(^|\s)podman\s+/,
72
+ /(^|\s)git\s+push\b/,
73
+ /(^|\s)git\s+reset\b/,
74
+ /(^|\s)git\s+clean\b/,
75
+ /(^|\s)git\s+checkout\b/,
76
+ /(^|\s)git\s+switch\b/,
77
+ /(^|\s)git\s+restore\b/,
78
+ /(^|\s)(npm|pnpm|yarn)\s+publish\b/,
79
+ /(^|\s)--no-index\b/,
80
+ /(^|\s)--fix\b/,
81
+ /(^|\s)(\/|~(?:\/|\s|$))/,
82
+ /(^|\s)\.\.(?:\/|\s|$)/,
83
+ /\$/,
84
+ /(^|[\s:])(?:\.env(?:[./\s:]|$)|\.git(?:[\/\s:]|$)|node_modules(?:[\/\s:]|$)|\.ssh(?:[\/\s:]|$)|id_rsa(?:[.\s:]|$)|id_ed25519(?:[.\s:]|$)|[^\s:]*\.(?:pem|key)(?:[\s:]|$))/,
85
+ /(^|\s)['"]?-exec(?:['"]|\s|$)/,
86
+ /(^|\s)['"]?-execdir(?:['"]|\s|$)/,
87
+ /(^|\s)['"]?-delete(?:['"]|\s|$)/,
88
+ /(^|\s)['"]?-ok(?:['"]|\s|$)/,
89
+ /(^|\s)['"]?-okdir(?:['"]|\s|$)/,
90
+ /(^|\s)['"]?-fprint0?(?:['"]|\s|$)/,
91
+ /(^|\s)['"]?-fprintf(?:['"]|\s|$)/,
92
+ /(^|\s)['"]?-fls(?:['"]|\s|$)/,
93
+ /(^|\s)['"]?--output(?:=|['"]|\s|$)/,
94
+ /(^|\s)(sed|perl)\s+.*(^|\s)-i(\s|$)/,
95
+ /(^|\s)(cat|grep|rg|head|tail|wc)\s+/,
96
+ /[;&|<>`]/,
97
+ /[\r\n]/
98
+ ];
99
+ function compact(command) {
100
+ return command.trim().replace(/\s+/g, " ");
101
+ }
102
+ function startsWithAllowedPrefix(command) {
103
+ const normalized = compact(command);
104
+ return isAllowedPackageScript(normalized) || SAFE_ALLOWED_PREFIXES.some((prefix) => normalized === prefix || normalized.startsWith(`${prefix} `));
105
+ }
106
+ function isAllowedPackageScript(command) {
107
+ const packageScriptPattern = /^(?:npm|pnpm|yarn|bun)\s+run\s+(?:test|typecheck|lint|build|check)(?::[A-Za-z0-9._-]+)*(?:\s+--\s+[A-Za-z0-9._:= -]+)?$/;
108
+ return packageScriptPattern.test(command);
109
+ }
110
+ function assertSafeCommand(config, command) {
111
+ if (config.bashMode === "off") {
112
+ throw new CodexFlowError("bash tool is disabled. Start with CODEXFLOW_BASH_MODE=safe or CODEXFLOW_BASH_MODE=full to enable it.");
113
+ }
114
+ if (config.bashMode === "full")
115
+ return;
116
+ const raw = command.trim();
117
+ const normalized = compact(command);
118
+ for (const pattern of SAFE_BLOCKED_PATTERNS) {
119
+ if (pattern.test(raw) || pattern.test(normalized)) {
120
+ throw new CodexFlowError(`Command is blocked in CODEXFLOW_BASH_MODE=safe: ${normalized}\n` +
121
+ "Use separate read/search/git tools, or restart with CODEXFLOW_BASH_MODE=full only for trusted repos.");
122
+ }
123
+ }
124
+ if (!startsWithAllowedPrefix(normalized)) {
125
+ throw new CodexFlowError(`Command is not in the safe bash allowlist: ${normalized}\n` +
126
+ "Allowed examples: ls, find, git status, git diff, npm test, npm run typecheck, npm run build:clients, pytest, go test, cargo test. Use read/search tools for file contents. " +
127
+ "Use CODEXFLOW_BASH_MODE=full for trusted local automation.");
128
+ }
129
+ }
130
+ function assertBashSession(config, sessionId) {
131
+ const requested = sessionId?.trim();
132
+ if (!config.bashSessionId) {
133
+ if (config.requireBashSession) {
134
+ throw new CodexFlowError("bash session guard is enabled but no server bash session id is configured.");
135
+ }
136
+ return undefined;
137
+ }
138
+ if (!requested) {
139
+ if (config.requireBashSession) {
140
+ throw new CodexFlowError(`bash session id is required. Retry with session_id="${config.bashSessionId}".`);
141
+ }
142
+ return config.bashSessionId;
143
+ }
144
+ if (requested !== config.bashSessionId) {
145
+ throw new CodexFlowError(`bash session id mismatch. This CodexFlow server accepts session_id="${config.bashSessionId}".`);
146
+ }
147
+ return config.bashSessionId;
148
+ }
149
+ function makeEnv(config) {
150
+ if (config.inheritEnv) {
151
+ return { ...process.env, NO_COLOR: "1", CI: process.env.CI ?? "1" };
152
+ }
153
+ return {
154
+ PATH: process.env.PATH ?? "/usr/local/bin:/usr/bin:/bin",
155
+ HOME: process.env.HOME ?? "",
156
+ USER: process.env.USER ?? "",
157
+ SHELL: process.env.SHELL ?? "/bin/bash",
158
+ TMPDIR: process.env.TMPDIR ?? "/tmp",
159
+ TERM: "dumb",
160
+ NO_COLOR: "1",
161
+ CI: "1"
162
+ };
163
+ }
164
+ function bashExecutable() {
165
+ return fs.existsSync("/bin/bash") ? "/bin/bash" : "bash";
166
+ }
167
+ function trimOutput(value, maxBytes) {
168
+ const buffer = Buffer.from(value, "utf8");
169
+ if (buffer.byteLength <= maxBytes)
170
+ return { value, truncated: false };
171
+ const sliced = buffer.subarray(0, maxBytes).toString("utf8");
172
+ return { value: `${sliced}\n...[output truncated to ${maxBytes} bytes]`, truncated: true };
173
+ }
174
+ export async function runBash(config, guard, workspace, command, options = {}) {
175
+ if (!command?.trim())
176
+ throw new CodexFlowError("command is required.");
177
+ const bashSessionId = assertBashSession(config, options.sessionId);
178
+ assertSafeCommand(config, command);
179
+ const cwdResolved = guard.resolve(workspace, options.cwd ?? ".");
180
+ const cwd = cwdResolved.absPath;
181
+ const timeoutMs = Math.max(1_000, Math.min(options.timeoutMs ?? 30_000, 180_000));
182
+ const start = Date.now();
183
+ return new Promise((resolve, reject) => {
184
+ const child = spawn(bashExecutable(), ["-lc", command], {
185
+ cwd,
186
+ env: makeEnv(config),
187
+ stdio: ["ignore", "pipe", "pipe"]
188
+ });
189
+ let stdout = "";
190
+ let stderr = "";
191
+ let killedByTimeout = false;
192
+ const timer = setTimeout(() => {
193
+ killedByTimeout = true;
194
+ child.kill("SIGTERM");
195
+ setTimeout(() => {
196
+ if (!child.killed)
197
+ child.kill("SIGKILL");
198
+ }, 1_500).unref();
199
+ }, timeoutMs);
200
+ timer.unref();
201
+ child.stdout.on("data", (chunk) => {
202
+ stdout += String(chunk);
203
+ if (Buffer.byteLength(stdout, "utf8") > config.maxOutputBytes * 2)
204
+ child.kill("SIGTERM");
205
+ });
206
+ child.stderr.on("data", (chunk) => {
207
+ stderr += String(chunk);
208
+ if (Buffer.byteLength(stderr, "utf8") > config.maxOutputBytes * 2)
209
+ child.kill("SIGTERM");
210
+ });
211
+ child.on("error", reject);
212
+ child.on("close", (exitCode, signal) => {
213
+ clearTimeout(timer);
214
+ if (killedByTimeout) {
215
+ stderr += `\n[codexflow] Command timed out after ${timeoutMs} ms.`;
216
+ }
217
+ const out = trimOutput(redactSensitiveText(stdout), config.maxOutputBytes);
218
+ const err = trimOutput(redactSensitiveText(stderr), config.maxOutputBytes);
219
+ resolve({
220
+ command,
221
+ cwd: path.relative(workspace.root, cwd) || ".",
222
+ exitCode,
223
+ signal,
224
+ durationMs: Date.now() - start,
225
+ stdout: out.value,
226
+ stderr: err.value,
227
+ truncated: out.truncated || err.truncated,
228
+ ...(bashSessionId ? { bashSessionId } : {})
229
+ });
230
+ });
231
+ });
232
+ }
233
+ //# sourceMappingURL=bashOps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bashOps.js","sourceRoot":"","sources":["../src/bashOps.ts"],"names":[],"mappings":"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"}