fixo-cli 1.0.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/LICENSE +201 -0
- package/README.md +530 -0
- package/dist/agent/agent-client.d.ts +108 -0
- package/dist/agent/agent-client.d.ts.map +1 -0
- package/dist/agent/agent-client.js +1247 -0
- package/dist/agent/agent-client.js.map +1 -0
- package/dist/agent/agent-pool.d.ts +20 -0
- package/dist/agent/agent-pool.d.ts.map +1 -0
- package/dist/agent/agent-pool.js +217 -0
- package/dist/agent/agent-pool.js.map +1 -0
- package/dist/agent/background-awareness.d.ts +55 -0
- package/dist/agent/background-awareness.d.ts.map +1 -0
- package/dist/agent/background-awareness.js +104 -0
- package/dist/agent/background-awareness.js.map +1 -0
- package/dist/agent/command-parser.d.ts +33 -0
- package/dist/agent/command-parser.d.ts.map +1 -0
- package/dist/agent/command-parser.js +120 -0
- package/dist/agent/command-parser.js.map +1 -0
- package/dist/agent/context-budget.d.ts +91 -0
- package/dist/agent/context-budget.d.ts.map +1 -0
- package/dist/agent/context-budget.js +219 -0
- package/dist/agent/context-budget.js.map +1 -0
- package/dist/agent/conversation.d.ts +190 -0
- package/dist/agent/conversation.d.ts.map +1 -0
- package/dist/agent/conversation.js +547 -0
- package/dist/agent/conversation.js.map +1 -0
- package/dist/agent/hooks.d.ts +72 -0
- package/dist/agent/hooks.d.ts.map +1 -0
- package/dist/agent/hooks.js +214 -0
- package/dist/agent/hooks.js.map +1 -0
- package/dist/agent/mcp-bridge.d.ts +13 -0
- package/dist/agent/mcp-bridge.d.ts.map +1 -0
- package/dist/agent/mcp-bridge.js +86 -0
- package/dist/agent/mcp-bridge.js.map +1 -0
- package/dist/agent/mcp-client.d.ts +24 -0
- package/dist/agent/mcp-client.d.ts.map +1 -0
- package/dist/agent/mcp-client.js +146 -0
- package/dist/agent/mcp-client.js.map +1 -0
- package/dist/agent/mcp-manager.d.ts +13 -0
- package/dist/agent/mcp-manager.d.ts.map +1 -0
- package/dist/agent/mcp-manager.js +84 -0
- package/dist/agent/mcp-manager.js.map +1 -0
- package/dist/agent/mcp-registry.d.ts +45 -0
- package/dist/agent/mcp-registry.d.ts.map +1 -0
- package/dist/agent/mcp-registry.js +98 -0
- package/dist/agent/mcp-registry.js.map +1 -0
- package/dist/agent/orchestrator.d.ts +14 -0
- package/dist/agent/orchestrator.d.ts.map +1 -0
- package/dist/agent/orchestrator.js +118 -0
- package/dist/agent/orchestrator.js.map +1 -0
- package/dist/agent/parser-adapter.d.ts +120 -0
- package/dist/agent/parser-adapter.d.ts.map +1 -0
- package/dist/agent/parser-adapter.js +265 -0
- package/dist/agent/parser-adapter.js.map +1 -0
- package/dist/agent/parsers/imports.d.ts +11 -0
- package/dist/agent/parsers/imports.d.ts.map +1 -0
- package/dist/agent/parsers/imports.js +94 -0
- package/dist/agent/parsers/imports.js.map +1 -0
- package/dist/agent/parsers/shell.d.ts +23 -0
- package/dist/agent/parsers/shell.d.ts.map +1 -0
- package/dist/agent/parsers/shell.js +200 -0
- package/dist/agent/parsers/shell.js.map +1 -0
- package/dist/agent/parsers/symbols.d.ts +17 -0
- package/dist/agent/parsers/symbols.d.ts.map +1 -0
- package/dist/agent/parsers/symbols.js +103 -0
- package/dist/agent/parsers/symbols.js.map +1 -0
- package/dist/agent/permissions.d.ts +65 -0
- package/dist/agent/permissions.d.ts.map +1 -0
- package/dist/agent/permissions.js +219 -0
- package/dist/agent/permissions.js.map +1 -0
- package/dist/agent/predictive-gate.d.ts +69 -0
- package/dist/agent/predictive-gate.d.ts.map +1 -0
- package/dist/agent/predictive-gate.js +128 -0
- package/dist/agent/predictive-gate.js.map +1 -0
- package/dist/agent/provider-cooldown.d.ts +144 -0
- package/dist/agent/provider-cooldown.d.ts.map +1 -0
- package/dist/agent/provider-cooldown.js +300 -0
- package/dist/agent/provider-cooldown.js.map +1 -0
- package/dist/agent/providers-manager.d.ts +109 -0
- package/dist/agent/providers-manager.d.ts.map +1 -0
- package/dist/agent/providers-manager.js +464 -0
- package/dist/agent/providers-manager.js.map +1 -0
- package/dist/agent/repo-map.d.ts +6 -0
- package/dist/agent/repo-map.d.ts.map +1 -0
- package/dist/agent/repo-map.js +221 -0
- package/dist/agent/repo-map.js.map +1 -0
- package/dist/agent/retry.d.ts +103 -0
- package/dist/agent/retry.d.ts.map +1 -0
- package/dist/agent/retry.js +276 -0
- package/dist/agent/retry.js.map +1 -0
- package/dist/agent/search/index.d.ts +61 -0
- package/dist/agent/search/index.d.ts.map +1 -0
- package/dist/agent/search/index.js +314 -0
- package/dist/agent/search/index.js.map +1 -0
- package/dist/agent/single-agent.d.ts +76 -0
- package/dist/agent/single-agent.d.ts.map +1 -0
- package/dist/agent/single-agent.js +697 -0
- package/dist/agent/single-agent.js.map +1 -0
- package/dist/agent/skills.d.ts +22 -0
- package/dist/agent/skills.d.ts.map +1 -0
- package/dist/agent/skills.js +139 -0
- package/dist/agent/skills.js.map +1 -0
- package/dist/agent/stream-glue.d.ts +85 -0
- package/dist/agent/stream-glue.d.ts.map +1 -0
- package/dist/agent/stream-glue.js +120 -0
- package/dist/agent/stream-glue.js.map +1 -0
- package/dist/agent/subagent.d.ts +72 -0
- package/dist/agent/subagent.d.ts.map +1 -0
- package/dist/agent/subagent.js +193 -0
- package/dist/agent/subagent.js.map +1 -0
- package/dist/agent/telemetry.d.ts +192 -0
- package/dist/agent/telemetry.d.ts.map +1 -0
- package/dist/agent/telemetry.js +400 -0
- package/dist/agent/telemetry.js.map +1 -0
- package/dist/agent/tokenizer.d.ts +42 -0
- package/dist/agent/tokenizer.d.ts.map +1 -0
- package/dist/agent/tokenizer.js +107 -0
- package/dist/agent/tokenizer.js.map +1 -0
- package/dist/agent/tool-executor.d.ts +289 -0
- package/dist/agent/tool-executor.d.ts.map +1 -0
- package/dist/agent/tool-executor.js +2519 -0
- package/dist/agent/tool-executor.js.map +1 -0
- package/dist/agent/web-impl.d.ts +2 -0
- package/dist/agent/web-impl.d.ts.map +1 -0
- package/dist/agent/web-impl.js +34 -0
- package/dist/agent/web-impl.js.map +1 -0
- package/dist/agent/web.d.ts +8 -0
- package/dist/agent/web.d.ts.map +1 -0
- package/dist/agent/web.js +8 -0
- package/dist/agent/web.js.map +1 -0
- package/dist/agent/worker-agent.d.ts +27 -0
- package/dist/agent/worker-agent.d.ts.map +1 -0
- package/dist/agent/worker-agent.js +503 -0
- package/dist/agent/worker-agent.js.map +1 -0
- package/dist/config.d.ts +162 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +138 -0
- package/dist/config.js.map +1 -0
- package/dist/context/fixo-md-watcher.d.ts +42 -0
- package/dist/context/fixo-md-watcher.d.ts.map +1 -0
- package/dist/context/fixo-md-watcher.js +126 -0
- package/dist/context/fixo-md-watcher.js.map +1 -0
- package/dist/context/fixo-md.d.ts +50 -0
- package/dist/context/fixo-md.d.ts.map +1 -0
- package/dist/context/fixo-md.js +118 -0
- package/dist/context/fixo-md.js.map +1 -0
- package/dist/context/todo.d.ts +65 -0
- package/dist/context/todo.d.ts.map +1 -0
- package/dist/context/todo.js +194 -0
- package/dist/context/todo.js.map +1 -0
- package/dist/git/git-manager.d.ts +33 -0
- package/dist/git/git-manager.d.ts.map +1 -0
- package/dist/git/git-manager.js +293 -0
- package/dist/git/git-manager.js.map +1 -0
- package/dist/git/git-ops.d.ts +10 -0
- package/dist/git/git-ops.d.ts.map +1 -0
- package/dist/git/git-ops.js +131 -0
- package/dist/git/git-ops.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +352 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer.d.ts +30 -0
- package/dist/indexer.d.ts.map +1 -0
- package/dist/indexer.js +273 -0
- package/dist/indexer.js.map +1 -0
- package/dist/lsp/lsp-client.d.ts +24 -0
- package/dist/lsp/lsp-client.d.ts.map +1 -0
- package/dist/lsp/lsp-client.js +205 -0
- package/dist/lsp/lsp-client.js.map +1 -0
- package/dist/lsp/lsp-manager.d.ts +17 -0
- package/dist/lsp/lsp-manager.d.ts.map +1 -0
- package/dist/lsp/lsp-manager.js +154 -0
- package/dist/lsp/lsp-manager.js.map +1 -0
- package/dist/lsp/lsp-pre-save.d.ts +137 -0
- package/dist/lsp/lsp-pre-save.d.ts.map +1 -0
- package/dist/lsp/lsp-pre-save.js +245 -0
- package/dist/lsp/lsp-pre-save.js.map +1 -0
- package/dist/lsp/syntax-fallback.d.ts +83 -0
- package/dist/lsp/syntax-fallback.d.ts.map +1 -0
- package/dist/lsp/syntax-fallback.js +275 -0
- package/dist/lsp/syntax-fallback.js.map +1 -0
- package/dist/model-outcomes.d.ts +12 -0
- package/dist/model-outcomes.d.ts.map +1 -0
- package/dist/model-outcomes.js +46 -0
- package/dist/model-outcomes.js.map +1 -0
- package/dist/planner.d.ts +32 -0
- package/dist/planner.d.ts.map +1 -0
- package/dist/planner.js +163 -0
- package/dist/planner.js.map +1 -0
- package/dist/project-memory.d.ts +29 -0
- package/dist/project-memory.d.ts.map +1 -0
- package/dist/project-memory.js +349 -0
- package/dist/project-memory.js.map +1 -0
- package/dist/review.d.ts +2 -0
- package/dist/review.d.ts.map +1 -0
- package/dist/review.js +61 -0
- package/dist/review.js.map +1 -0
- package/dist/runtime/background-jobs.d.ts +97 -0
- package/dist/runtime/background-jobs.d.ts.map +1 -0
- package/dist/runtime/background-jobs.js +331 -0
- package/dist/runtime/background-jobs.js.map +1 -0
- package/dist/runtime/credential-vault.d.ts +124 -0
- package/dist/runtime/credential-vault.d.ts.map +1 -0
- package/dist/runtime/credential-vault.js +184 -0
- package/dist/runtime/credential-vault.js.map +1 -0
- package/dist/runtime/loop-trap.d.ts +197 -0
- package/dist/runtime/loop-trap.d.ts.map +1 -0
- package/dist/runtime/loop-trap.js +420 -0
- package/dist/runtime/loop-trap.js.map +1 -0
- package/dist/runtime/policy.d.ts +15 -0
- package/dist/runtime/policy.d.ts.map +1 -0
- package/dist/runtime/policy.js +60 -0
- package/dist/runtime/policy.js.map +1 -0
- package/dist/runtime/redaction.d.ts +66 -0
- package/dist/runtime/redaction.d.ts.map +1 -0
- package/dist/runtime/redaction.js +155 -0
- package/dist/runtime/redaction.js.map +1 -0
- package/dist/runtime/session-snapshots.d.ts +76 -0
- package/dist/runtime/session-snapshots.d.ts.map +1 -0
- package/dist/runtime/session-snapshots.js +166 -0
- package/dist/runtime/session-snapshots.js.map +1 -0
- package/dist/runtime/staging.d.ts +205 -0
- package/dist/runtime/staging.d.ts.map +1 -0
- package/dist/runtime/staging.js +526 -0
- package/dist/runtime/staging.js.map +1 -0
- package/dist/runtime/task-session.d.ts +95 -0
- package/dist/runtime/task-session.d.ts.map +1 -0
- package/dist/runtime/task-session.js +263 -0
- package/dist/runtime/task-session.js.map +1 -0
- package/dist/runtime/worktree.d.ts +55 -0
- package/dist/runtime/worktree.d.ts.map +1 -0
- package/dist/runtime/worktree.js +175 -0
- package/dist/runtime/worktree.js.map +1 -0
- package/dist/setup-wizard.d.ts +8 -0
- package/dist/setup-wizard.d.ts.map +1 -0
- package/dist/setup-wizard.js +73 -0
- package/dist/setup-wizard.js.map +1 -0
- package/dist/shared/content.d.ts +43 -0
- package/dist/shared/content.d.ts.map +1 -0
- package/dist/shared/content.js +61 -0
- package/dist/shared/content.js.map +1 -0
- package/dist/shared/types.d.ts +217 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +3 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/test-runner.d.ts +5 -0
- package/dist/test-runner.d.ts.map +1 -0
- package/dist/test-runner.js +42 -0
- package/dist/test-runner.js.map +1 -0
- package/dist/types.d.ts +85 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/ascii.d.ts +23 -0
- package/dist/ui/ascii.d.ts.map +1 -0
- package/dist/ui/ascii.js +45 -0
- package/dist/ui/ascii.js.map +1 -0
- package/dist/ui/colors.d.ts +111 -0
- package/dist/ui/colors.d.ts.map +1 -0
- package/dist/ui/colors.js +166 -0
- package/dist/ui/colors.js.map +1 -0
- package/dist/ui/image-attach.d.ts +27 -0
- package/dist/ui/image-attach.d.ts.map +1 -0
- package/dist/ui/image-attach.js +100 -0
- package/dist/ui/image-attach.js.map +1 -0
- package/dist/ui/index.d.ts +18 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +18 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/markdown-stream.d.ts +91 -0
- package/dist/ui/markdown-stream.d.ts.map +1 -0
- package/dist/ui/markdown-stream.js +524 -0
- package/dist/ui/markdown-stream.js.map +1 -0
- package/dist/ui/plan-renderer.d.ts +36 -0
- package/dist/ui/plan-renderer.d.ts.map +1 -0
- package/dist/ui/plan-renderer.js +79 -0
- package/dist/ui/plan-renderer.js.map +1 -0
- package/dist/ui/prompt.d.ts +11 -0
- package/dist/ui/prompt.d.ts.map +1 -0
- package/dist/ui/prompt.js +1960 -0
- package/dist/ui/prompt.js.map +1 -0
- package/dist/ui/render-primitives.d.ts +117 -0
- package/dist/ui/render-primitives.d.ts.map +1 -0
- package/dist/ui/render-primitives.js +322 -0
- package/dist/ui/render-primitives.js.map +1 -0
- package/dist/ui/render.d.ts +133 -0
- package/dist/ui/render.d.ts.map +1 -0
- package/dist/ui/render.js +547 -0
- package/dist/ui/render.js.map +1 -0
- package/dist/ui/session-header.d.ts +30 -0
- package/dist/ui/session-header.d.ts.map +1 -0
- package/dist/ui/session-header.js +74 -0
- package/dist/ui/session-header.js.map +1 -0
- package/dist/workspace-guard.d.ts +68 -0
- package/dist/workspace-guard.d.ts.map +1 -0
- package/dist/workspace-guard.js +168 -0
- package/dist/workspace-guard.js.map +1 -0
- package/dist/workspace-lock.d.ts +27 -0
- package/dist/workspace-lock.d.ts.map +1 -0
- package/dist/workspace-lock.js +95 -0
- package/dist/workspace-lock.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
export function detectProjectFacts(cwd) {
|
|
4
|
+
const packageJson = path.join(cwd, 'package.json');
|
|
5
|
+
let scripts = {};
|
|
6
|
+
if (fs.existsSync(packageJson)) {
|
|
7
|
+
try {
|
|
8
|
+
scripts = JSON.parse(fs.readFileSync(packageJson, 'utf-8')).scripts ?? {};
|
|
9
|
+
}
|
|
10
|
+
catch (error) {
|
|
11
|
+
if (process.env.DEBUG || process.env.VERBOSE || process.argv.includes('--verbose')) {
|
|
12
|
+
console.warn(`[Debug Warning] Failed to parse package.json scripts: ${error.message || error}`);
|
|
13
|
+
}
|
|
14
|
+
scripts = {};
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
const packageManager = fs.existsSync(path.join(cwd, 'pnpm-lock.yaml'))
|
|
18
|
+
? 'pnpm'
|
|
19
|
+
: fs.existsSync(path.join(cwd, 'yarn.lock'))
|
|
20
|
+
? 'yarn'
|
|
21
|
+
: fs.existsSync(path.join(cwd, 'package-lock.json'))
|
|
22
|
+
? 'npm'
|
|
23
|
+
: 'unknown';
|
|
24
|
+
const prefix = packageManager === 'unknown' ? 'npm' : packageManager;
|
|
25
|
+
return {
|
|
26
|
+
packageManager,
|
|
27
|
+
scripts,
|
|
28
|
+
testCommands: Object.keys(scripts).filter(k => /test|check|typecheck/.test(k)).map(k => `${prefix} run ${k}`),
|
|
29
|
+
buildCommands: Object.keys(scripts).filter(k => /build/.test(k)).map(k => `${prefix} run ${k}`),
|
|
30
|
+
tsconfigs: findFiles(cwd, /^tsconfig.*\.json$/).slice(0, 20),
|
|
31
|
+
updatedAt: new Date().toISOString(),
|
|
32
|
+
allowRules: readAllowRules(cwd),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
36
|
+
import { colors } from './ui/colors.js';
|
|
37
|
+
let dbInstance = null;
|
|
38
|
+
let lastCwd = '';
|
|
39
|
+
export function getDb(cwd) {
|
|
40
|
+
const dir = memoryDir(cwd);
|
|
41
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
42
|
+
const dbPath = path.join(dir, 'memory.db');
|
|
43
|
+
if (dbInstance && lastCwd === cwd) {
|
|
44
|
+
return dbInstance;
|
|
45
|
+
}
|
|
46
|
+
if (dbInstance) {
|
|
47
|
+
try {
|
|
48
|
+
dbInstance.close?.();
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
if (process.env.DEBUG || process.env.VERBOSE || process.argv.includes('--verbose')) {
|
|
52
|
+
console.warn(`[Debug Warning] Failed to close database instance: ${error.message || error}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
lastCwd = cwd;
|
|
57
|
+
dbInstance = new DatabaseSync(dbPath);
|
|
58
|
+
// Initialize tables
|
|
59
|
+
dbInstance.exec(`
|
|
60
|
+
CREATE TABLE IF NOT EXISTS facts (
|
|
61
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
62
|
+
content TEXT NOT NULL UNIQUE,
|
|
63
|
+
embedding TEXT,
|
|
64
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
65
|
+
);
|
|
66
|
+
CREATE TABLE IF NOT EXISTS session_history (
|
|
67
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
68
|
+
summary TEXT NOT NULL,
|
|
69
|
+
embedding TEXT,
|
|
70
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
71
|
+
);
|
|
72
|
+
`);
|
|
73
|
+
// Migrate legacy memory.md if present
|
|
74
|
+
const memoryFile = path.join(dir, 'memory.md');
|
|
75
|
+
if (fs.existsSync(memoryFile)) {
|
|
76
|
+
try {
|
|
77
|
+
const content = fs.readFileSync(memoryFile, 'utf-8');
|
|
78
|
+
const lines = content.split('\n');
|
|
79
|
+
const insertStmt = dbInstance.prepare(`
|
|
80
|
+
INSERT OR IGNORE INTO facts (content) VALUES (?)
|
|
81
|
+
`);
|
|
82
|
+
for (const line of lines) {
|
|
83
|
+
const trimmed = line.trim();
|
|
84
|
+
if (trimmed.startsWith('- ') || trimmed.startsWith('* ')) {
|
|
85
|
+
const fact = trimmed.slice(2).trim();
|
|
86
|
+
if (fact && fact !== 'FixO Project Memory') {
|
|
87
|
+
insertStmt.run(fact);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
fs.renameSync(memoryFile, path.join(dir, 'memory.md.migrated'));
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
console.warn(`[Memory Migration] Warning: Failed to migrate legacy memory.md: ${err instanceof Error ? err.message : String(err)}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return dbInstance;
|
|
98
|
+
}
|
|
99
|
+
export function calculateTfidfSimilarity(query, documents) {
|
|
100
|
+
if (documents.length === 0)
|
|
101
|
+
return [];
|
|
102
|
+
const tokenize = (text) => {
|
|
103
|
+
return (text.toLowerCase().match(/[a-z0-9]+/g) || []);
|
|
104
|
+
};
|
|
105
|
+
const queryTokens = tokenize(query);
|
|
106
|
+
if (queryTokens.length === 0) {
|
|
107
|
+
return new Array(documents.length).fill(0);
|
|
108
|
+
}
|
|
109
|
+
const docTokensList = documents.map(doc => tokenize(doc));
|
|
110
|
+
const numDocs = documents.length;
|
|
111
|
+
const allUniqueTokens = new Set([...queryTokens, ...docTokensList.flat()]);
|
|
112
|
+
const df = {};
|
|
113
|
+
for (const token of allUniqueTokens) {
|
|
114
|
+
let count = 0;
|
|
115
|
+
for (const docTokens of docTokensList) {
|
|
116
|
+
if (docTokens.includes(token)) {
|
|
117
|
+
count++;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
df[token] = count;
|
|
121
|
+
}
|
|
122
|
+
const idf = {};
|
|
123
|
+
for (const token of allUniqueTokens) {
|
|
124
|
+
idf[token] = Math.log(1 + (numDocs / (df[token] || 1)));
|
|
125
|
+
}
|
|
126
|
+
const getVector = (tokens) => {
|
|
127
|
+
const tf = {};
|
|
128
|
+
for (const token of tokens) {
|
|
129
|
+
tf[token] = (tf[token] || 0) + 1;
|
|
130
|
+
}
|
|
131
|
+
const vector = {};
|
|
132
|
+
for (const token in tf) {
|
|
133
|
+
if (idf[token] !== undefined) {
|
|
134
|
+
vector[token] = tf[token] * idf[token];
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return vector;
|
|
138
|
+
};
|
|
139
|
+
const queryVector = getVector(queryTokens);
|
|
140
|
+
const magnitude = (vec) => {
|
|
141
|
+
let sum = 0;
|
|
142
|
+
for (const val of Object.values(vec)) {
|
|
143
|
+
sum += val * val;
|
|
144
|
+
}
|
|
145
|
+
return Math.sqrt(sum);
|
|
146
|
+
};
|
|
147
|
+
const queryMag = magnitude(queryVector);
|
|
148
|
+
if (queryMag === 0) {
|
|
149
|
+
return new Array(documents.length).fill(0);
|
|
150
|
+
}
|
|
151
|
+
return docTokensList.map((docTokens) => {
|
|
152
|
+
if (docTokens.length === 0)
|
|
153
|
+
return 0;
|
|
154
|
+
const docVector = getVector(docTokens);
|
|
155
|
+
const docMag = magnitude(docVector);
|
|
156
|
+
if (docMag === 0)
|
|
157
|
+
return 0;
|
|
158
|
+
let dotProduct = 0;
|
|
159
|
+
for (const token in queryVector) {
|
|
160
|
+
if (docVector[token]) {
|
|
161
|
+
dotProduct += queryVector[token] * docVector[token];
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return dotProduct / (queryMag * docMag);
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
function cosineSimilarity(a, b) {
|
|
168
|
+
if (a.length !== b.length || a.length === 0)
|
|
169
|
+
return 0;
|
|
170
|
+
let dotProduct = 0;
|
|
171
|
+
let normA = 0;
|
|
172
|
+
let normB = 0;
|
|
173
|
+
for (let i = 0; i < a.length; i++) {
|
|
174
|
+
dotProduct += a[i] * b[i];
|
|
175
|
+
normA += a[i] * a[i];
|
|
176
|
+
normB += b[i] * b[i];
|
|
177
|
+
}
|
|
178
|
+
if (normA === 0 || normB === 0)
|
|
179
|
+
return 0;
|
|
180
|
+
return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
|
|
181
|
+
}
|
|
182
|
+
export async function retrieveRelevantFacts(cwd, query, client, limit = 5) {
|
|
183
|
+
const db = getDb(cwd);
|
|
184
|
+
const allRows = db.prepare('SELECT id, content, embedding FROM facts').all();
|
|
185
|
+
if (allRows.length === 0)
|
|
186
|
+
return [];
|
|
187
|
+
if (client) {
|
|
188
|
+
try {
|
|
189
|
+
const queryEmbedding = await client.getEmbedding(query);
|
|
190
|
+
if (queryEmbedding && Array.isArray(queryEmbedding)) {
|
|
191
|
+
const updateStmt = db.prepare('UPDATE facts SET embedding = ? WHERE id = ?');
|
|
192
|
+
const similarities = [];
|
|
193
|
+
for (const row of allRows) {
|
|
194
|
+
let factEmbedding = null;
|
|
195
|
+
if (row.embedding) {
|
|
196
|
+
try {
|
|
197
|
+
factEmbedding = JSON.parse(row.embedding);
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
if (process.env.DEBUG || process.env.VERBOSE || process.argv.includes('--verbose')) {
|
|
201
|
+
console.warn(`[Debug Warning] Failed to parse fact embedding JSON for ID ${row.id}: ${error.message || error}`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if (!factEmbedding) {
|
|
206
|
+
try {
|
|
207
|
+
factEmbedding = await client.getEmbedding(row.content);
|
|
208
|
+
if (factEmbedding) {
|
|
209
|
+
updateStmt.run(JSON.stringify(factEmbedding), row.id);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
catch (err) {
|
|
213
|
+
if (client.verbose) {
|
|
214
|
+
console.warn(`[Memory] Failed to compute embedding for fact ID ${row.id}: ${err instanceof Error ? err.message : String(err)}`);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
if (factEmbedding) {
|
|
219
|
+
const sim = cosineSimilarity(queryEmbedding, factEmbedding);
|
|
220
|
+
similarities.push({ content: row.content, similarity: sim });
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
similarities.push({ content: row.content, similarity: 0 });
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
similarities.sort((a, b) => b.similarity - a.similarity);
|
|
227
|
+
return similarities.slice(0, limit).map(s => s.content);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
catch (err) {
|
|
231
|
+
console.warn(`${colors.yellow}Warning: Embeddings API failed. Falling back to local TF-IDF memory retrieval. Error: ${err instanceof Error ? err.message : String(err)}${colors.reset}`);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
try {
|
|
235
|
+
const docContents = allRows.map(r => r.content);
|
|
236
|
+
const sims = calculateTfidfSimilarity(query, docContents);
|
|
237
|
+
const factsWithSim = allRows.map((row, idx) => ({
|
|
238
|
+
content: row.content,
|
|
239
|
+
similarity: sims[idx] || 0
|
|
240
|
+
}));
|
|
241
|
+
factsWithSim.sort((a, b) => b.similarity - a.similarity);
|
|
242
|
+
return factsWithSim.slice(0, limit).map(s => s.content);
|
|
243
|
+
}
|
|
244
|
+
catch (err) {
|
|
245
|
+
console.error(`${colors.red}Error: Local TF-IDF search failed. ${err instanceof Error ? err.message : String(err)}${colors.reset}`);
|
|
246
|
+
return allRows.slice(0, limit).map(r => r.content);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
export function appendSessionSummary(cwd, summary) {
|
|
250
|
+
const db = getDb(cwd);
|
|
251
|
+
const stmt = db.prepare('INSERT INTO session_history (summary) VALUES (?)');
|
|
252
|
+
stmt.run(summary.trim());
|
|
253
|
+
}
|
|
254
|
+
export function readSessionHistory(cwd) {
|
|
255
|
+
const db = getDb(cwd);
|
|
256
|
+
const stmt = db.prepare('SELECT summary FROM session_history ORDER BY id DESC');
|
|
257
|
+
const rows = stmt.all();
|
|
258
|
+
return rows.map(r => r.summary);
|
|
259
|
+
}
|
|
260
|
+
export function memoryDir(cwd) {
|
|
261
|
+
return path.join(cwd, '.fixo');
|
|
262
|
+
}
|
|
263
|
+
export function ensureProjectMemory(cwd) {
|
|
264
|
+
const dir = memoryDir(cwd);
|
|
265
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
266
|
+
const projectFile = path.join(dir, 'project.json');
|
|
267
|
+
const facts = detectProjectFacts(cwd);
|
|
268
|
+
fs.writeFileSync(projectFile, JSON.stringify(facts, null, 2) + '\n', 'utf-8');
|
|
269
|
+
getDb(cwd); // Ensures DB is created and tables are initialized
|
|
270
|
+
return facts;
|
|
271
|
+
}
|
|
272
|
+
export function readMemory(cwd) {
|
|
273
|
+
ensureProjectMemory(cwd);
|
|
274
|
+
const db = getDb(cwd);
|
|
275
|
+
const rows = db.prepare('SELECT content FROM facts ORDER BY id DESC').all();
|
|
276
|
+
if (rows.length === 0) {
|
|
277
|
+
return '';
|
|
278
|
+
}
|
|
279
|
+
return rows.map(r => `- ${r.content}`).join('\n');
|
|
280
|
+
}
|
|
281
|
+
export function appendMemory(cwd, text) {
|
|
282
|
+
ensureProjectMemory(cwd);
|
|
283
|
+
const db = getDb(cwd);
|
|
284
|
+
const stmt = db.prepare('INSERT OR IGNORE INTO facts (content) VALUES (?)');
|
|
285
|
+
stmt.run(text.trim());
|
|
286
|
+
}
|
|
287
|
+
export function readAllowRules(cwd) {
|
|
288
|
+
const file = path.join(memoryDir(cwd), 'allow-rules.json');
|
|
289
|
+
if (!fs.existsSync(file))
|
|
290
|
+
return { commands: [] };
|
|
291
|
+
try {
|
|
292
|
+
const parsed = JSON.parse(fs.readFileSync(file, 'utf-8'));
|
|
293
|
+
return { commands: Array.isArray(parsed.commands) ? parsed.commands.filter(Boolean) : [] };
|
|
294
|
+
}
|
|
295
|
+
catch (error) {
|
|
296
|
+
if (process.env.DEBUG || process.env.VERBOSE || process.argv.includes('--verbose')) {
|
|
297
|
+
console.warn(`[Debug Warning] Failed to read or parse allow-rules.json from ${file}: ${error.message || error}`);
|
|
298
|
+
}
|
|
299
|
+
return { commands: [] };
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
export function allowCommand(cwd, command) {
|
|
303
|
+
const dir = memoryDir(cwd);
|
|
304
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
305
|
+
const rules = readAllowRules(cwd);
|
|
306
|
+
if (!rules.commands.includes(command.trim()))
|
|
307
|
+
rules.commands.push(command.trim());
|
|
308
|
+
fs.writeFileSync(path.join(dir, 'allow-rules.json'), JSON.stringify(rules, null, 2) + '\n', 'utf-8');
|
|
309
|
+
}
|
|
310
|
+
export function forgetMemory(cwd) {
|
|
311
|
+
const db = getDb(cwd);
|
|
312
|
+
db.exec('DELETE FROM facts');
|
|
313
|
+
}
|
|
314
|
+
export function doctor(cwd) {
|
|
315
|
+
const facts = ensureProjectMemory(cwd);
|
|
316
|
+
const db = getDb(cwd);
|
|
317
|
+
const factsCount = db.prepare('SELECT COUNT(*) as count FROM facts').get().count;
|
|
318
|
+
const sessionsCount = db.prepare('SELECT COUNT(*) as count FROM session_history').get().count;
|
|
319
|
+
const lines = [
|
|
320
|
+
'FixO Doctor',
|
|
321
|
+
`Package manager: ${facts.packageManager}`,
|
|
322
|
+
`Scripts: ${Object.keys(facts.scripts).length}`,
|
|
323
|
+
`Build commands: ${facts.buildCommands.join(', ') || '(none)'}`,
|
|
324
|
+
`Test commands: ${facts.testCommands.join(', ') || '(none)'}`,
|
|
325
|
+
`TypeScript configs: ${facts.tsconfigs.join(', ') || '(none)'}`,
|
|
326
|
+
`SQLite Database: ok (.fixo/memory.db)`,
|
|
327
|
+
`Stored Facts: ${factsCount}`,
|
|
328
|
+
`Stored Sessions: ${sessionsCount}`,
|
|
329
|
+
`Allowed commands: ${facts.allowRules.commands.join(', ') || '(none)'}`,
|
|
330
|
+
];
|
|
331
|
+
return lines.join('\n');
|
|
332
|
+
}
|
|
333
|
+
function findFiles(root, pattern) {
|
|
334
|
+
const result = [];
|
|
335
|
+
const walk = (dir) => {
|
|
336
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
337
|
+
if (entry.name === 'node_modules' || entry.name === '.git' || entry.name === 'dist')
|
|
338
|
+
continue;
|
|
339
|
+
const full = path.join(dir, entry.name);
|
|
340
|
+
if (entry.isDirectory())
|
|
341
|
+
walk(full);
|
|
342
|
+
else if (pattern.test(entry.name))
|
|
343
|
+
result.push(path.relative(root, full));
|
|
344
|
+
}
|
|
345
|
+
};
|
|
346
|
+
walk(root);
|
|
347
|
+
return result;
|
|
348
|
+
}
|
|
349
|
+
//# sourceMappingURL=project-memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-memory.js","sourceRoot":"","sources":["../src/project-memory.ts"],"names":[],"mappings":"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"}
|
package/dist/review.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../src/review.ts"],"names":[],"mappings":"AAIA,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAqCnD"}
|
package/dist/review.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { execFileSync } from 'child_process';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
export function reviewWorkspace(cwd) {
|
|
5
|
+
const diff = getDiff(cwd);
|
|
6
|
+
if (!diff.trim())
|
|
7
|
+
return 'No diff to review.';
|
|
8
|
+
const findings = [];
|
|
9
|
+
const lines = diff.split('\n');
|
|
10
|
+
for (const [idx, line] of lines.entries()) {
|
|
11
|
+
if (/execSync\(`|execSync\([^'"]/.test(line)) {
|
|
12
|
+
findings.push(`P1 command-injection risk near diff line ${idx + 1}: shell command construction should use argument arrays.`);
|
|
13
|
+
}
|
|
14
|
+
if (/startsWith\(.*cwd|startsWith\(.*root/.test(line)) {
|
|
15
|
+
findings.push(`P1 path-boundary risk near diff line ${idx + 1}: prefix checks can be bypassed by sibling paths.`);
|
|
16
|
+
}
|
|
17
|
+
if (/reset --hard/.test(line)) {
|
|
18
|
+
findings.push(`P1 data-loss risk near diff line ${idx + 1}: hard reset should not be used for user-facing undo.`);
|
|
19
|
+
}
|
|
20
|
+
if (/writeFileSync|unlinkSync|renameSync/.test(line) && !/TaskSession|WorkspaceGuard/.test(line)) {
|
|
21
|
+
findings.push(`P2 mutation audit gap near diff line ${idx + 1}: file mutation should be ledgered and workspace-guarded.`);
|
|
22
|
+
}
|
|
23
|
+
if (/api[_-]?key|token|secret|password/i.test(line) && line.startsWith('+')) {
|
|
24
|
+
findings.push(`P1 possible secret exposure near diff line ${idx + 1}: added credential-like text should be redacted or moved to secure config.`);
|
|
25
|
+
}
|
|
26
|
+
if (/initialValue:\s*true/.test(line) && /confirm/.test(lines[Math.max(0, idx - 2)] + line)) {
|
|
27
|
+
findings.push(`P2 unsafe confirmation default near diff line ${idx + 1}: dangerous prompts should default to No.`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
for (const file of changedFiles(cwd)) {
|
|
31
|
+
if (file.endsWith('.ts') && fs.existsSync(path.join(cwd, file))) {
|
|
32
|
+
const content = fs.readFileSync(path.join(cwd, file), 'utf-8');
|
|
33
|
+
if (/TODO|placeholder|not available yet/i.test(content)) {
|
|
34
|
+
findings.push(`P3 incomplete implementation marker in ${file}: remove placeholders from production paths.`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (findings.length === 0) {
|
|
39
|
+
findings.push('No high-confidence issues found by local static review. Residual risk: semantic bugs still require model/human review.');
|
|
40
|
+
}
|
|
41
|
+
return ['Human-Grade Review', ...findings.map(f => `- ${f}`)].join('\n');
|
|
42
|
+
}
|
|
43
|
+
function getDiff(cwd) {
|
|
44
|
+
try {
|
|
45
|
+
return execFileSync('git', ['diff', '--', '.'], { cwd, encoding: 'utf-8', maxBuffer: 2 * 1024 * 1024 });
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return '';
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function changedFiles(cwd) {
|
|
52
|
+
try {
|
|
53
|
+
return execFileSync('git', ['diff', '--name-only', '--', '.'], { cwd, encoding: 'utf-8' })
|
|
54
|
+
.split('\n')
|
|
55
|
+
.filter(Boolean);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return [];
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.js","sourceRoot":"","sources":["../src/review.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
export type JobStatus = 'running' | 'exited' | 'killed' | 'failed';
|
|
2
|
+
export interface BackgroundJob {
|
|
3
|
+
id: string;
|
|
4
|
+
cmd: string;
|
|
5
|
+
args: string[];
|
|
6
|
+
cwd: string;
|
|
7
|
+
pid?: number;
|
|
8
|
+
status: JobStatus;
|
|
9
|
+
startedAt: string;
|
|
10
|
+
exitedAt?: string;
|
|
11
|
+
exitCode?: number;
|
|
12
|
+
/** Truncated to STREAM_CAP_BYTES; use totalStdoutBytes for the full count. */
|
|
13
|
+
stdout: string;
|
|
14
|
+
/** Truncated to STREAM_CAP_BYTES. */
|
|
15
|
+
stderr: string;
|
|
16
|
+
/** Total bytes seen on stdout (pre-truncation). */
|
|
17
|
+
totalStdoutBytes: number;
|
|
18
|
+
/** Total bytes seen on stderr (pre-truncation). */
|
|
19
|
+
totalStderrBytes: number;
|
|
20
|
+
/** When true, stdout/stderr reached STREAM_CAP_BYTES. */
|
|
21
|
+
stdoutTruncated: boolean;
|
|
22
|
+
stderrTruncated: boolean;
|
|
23
|
+
/** Why a `failed` job failed (e.g. command-parser rejection). */
|
|
24
|
+
failureReason?: string;
|
|
25
|
+
/** Last error message captured from the child process. */
|
|
26
|
+
lastError?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface RegisterInput {
|
|
29
|
+
cmd: string;
|
|
30
|
+
args: string[];
|
|
31
|
+
cwd: string;
|
|
32
|
+
}
|
|
33
|
+
export interface RegisterResult {
|
|
34
|
+
ok: boolean;
|
|
35
|
+
jobId?: string;
|
|
36
|
+
pid?: number;
|
|
37
|
+
error?: string;
|
|
38
|
+
}
|
|
39
|
+
export interface PollInput {
|
|
40
|
+
jobId: string;
|
|
41
|
+
tailLines?: number;
|
|
42
|
+
sinceBytes?: number;
|
|
43
|
+
}
|
|
44
|
+
export interface JobSnapshot {
|
|
45
|
+
id: string;
|
|
46
|
+
status: JobStatus;
|
|
47
|
+
exitCode?: number;
|
|
48
|
+
startedAt: string;
|
|
49
|
+
exitedAt?: string;
|
|
50
|
+
cmd: string;
|
|
51
|
+
args: string[];
|
|
52
|
+
cwd: string;
|
|
53
|
+
/** Truncated to last `tailLines` lines if supplied. */
|
|
54
|
+
stdout: string;
|
|
55
|
+
stderr: string;
|
|
56
|
+
/** The full pre-truncation byte counter — useful for `sinceBytes`. */
|
|
57
|
+
totalStdoutBytes: number;
|
|
58
|
+
totalStderrBytes: number;
|
|
59
|
+
stdoutTruncated: boolean;
|
|
60
|
+
stderrTruncated: boolean;
|
|
61
|
+
stdoutDelta?: string;
|
|
62
|
+
stderrDelta?: string;
|
|
63
|
+
}
|
|
64
|
+
export interface BackgroundJobRegistryOptions {
|
|
65
|
+
/** Override the snapshot directory (default: `<cwd>/.fixo/jobs`). */
|
|
66
|
+
snapshotDir?: string;
|
|
67
|
+
/** Disable the 1-hour reaper. Test-only. */
|
|
68
|
+
disableReaper?: boolean;
|
|
69
|
+
}
|
|
70
|
+
export declare class BackgroundJobRegistry {
|
|
71
|
+
private readonly jobs;
|
|
72
|
+
private readonly processes;
|
|
73
|
+
private readonly cwd;
|
|
74
|
+
private readonly snapshotDir;
|
|
75
|
+
private flushTimer;
|
|
76
|
+
private reaperTimer;
|
|
77
|
+
constructor(cwd: string, opts?: BackgroundJobRegistryOptions);
|
|
78
|
+
/** Spawn a new background command. Reuses `isCommandSafe` for AST validation. */
|
|
79
|
+
register(input: RegisterInput): Promise<RegisterResult>;
|
|
80
|
+
/** Read a snapshot. Honours `tailLines` and `sinceBytes` for the streams. */
|
|
81
|
+
poll(input: PollInput): JobSnapshot | null;
|
|
82
|
+
/** Kill a running job. Returns false if the job was already terminal. */
|
|
83
|
+
kill(jobId: string): {
|
|
84
|
+
ok: boolean;
|
|
85
|
+
error?: string;
|
|
86
|
+
};
|
|
87
|
+
/** List all jobs (newest first). */
|
|
88
|
+
list(): BackgroundJob[];
|
|
89
|
+
/** Read a job directly (no tail / sinceBytes shaping). */
|
|
90
|
+
get(jobId: string): BackgroundJob | null;
|
|
91
|
+
/** Stop timers and kill all running children. Called on CLI shutdown. */
|
|
92
|
+
shutdown(): void;
|
|
93
|
+
private startSnapshotFlusher;
|
|
94
|
+
private flushAllSnapshots;
|
|
95
|
+
private startReaper;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=background-jobs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"background-jobs.d.ts","sourceRoot":"","sources":["../../src/runtime/background-jobs.ts"],"names":[],"mappings":"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"}
|