ft-scout 7.0.2 → 7.0.4
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/.firebase/hosting.d2Vi.cache +3 -3
- package/bin/src/commands/agent.d.ts.map +1 -1
- package/bin/src/commands/agent.js +33 -10
- package/bin/src/commands/agent.js.map +1 -1
- package/bin/src/commands/benchmark.d.ts.map +1 -0
- package/bin/src/commands/benchmark.js +135 -0
- package/bin/src/commands/benchmark.js.map +1 -0
- package/bin/src/commands/undo.js +1 -1
- package/bin/src/commands/undo.js.map +1 -1
- package/bin/src/engine/agentEngine.d.ts.map +1 -1
- package/bin/src/engine/agentEngine.js +90 -19
- package/bin/src/engine/agentEngine.js.map +1 -1
- package/bin/src/engine/llm.d.ts.map +1 -1
- package/bin/src/engine/llm.js +11 -6
- package/bin/src/engine/llm.js.map +1 -1
- package/bin/src/engine/verifier.d.ts.map +1 -1
- package/bin/src/engine/verifier.js +63 -8
- package/bin/src/engine/verifier.js.map +1 -1
- package/bin/src/index.js +14 -4
- package/bin/src/index.js.map +1 -1
- package/bin/src/utils/branding.js +1 -1
- package/bin/src/utils/config.d.ts.map +1 -1
- package/bin/src/utils/config.js +18 -3
- package/bin/src/utils/config.js.map +1 -1
- package/bin/src/utils/session.d.ts.map +1 -0
- package/bin/src/utils/session.js +81 -0
- package/bin/src/utils/session.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
const FT_DIR = path.join(process.cwd(), '.ft', 'scout');
|
|
4
|
+
const SESSIONS_FILE = path.join(FT_DIR, 'agent-sessions.json');
|
|
5
|
+
function ensureFtDir() {
|
|
6
|
+
if (!fs.existsSync(FT_DIR)) {
|
|
7
|
+
fs.mkdirSync(FT_DIR, { recursive: true });
|
|
8
|
+
}
|
|
9
|
+
const legacyPath = path.join(process.cwd(), '.ft', 'agent-sessions.json');
|
|
10
|
+
if (!fs.existsSync(SESSIONS_FILE) && fs.existsSync(legacyPath)) {
|
|
11
|
+
try {
|
|
12
|
+
fs.copyFileSync(legacyPath, SESSIONS_FILE);
|
|
13
|
+
}
|
|
14
|
+
catch { }
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Load all recorded agent sessions from disk.
|
|
19
|
+
* Sorted by timestamp descending (newest first).
|
|
20
|
+
*/
|
|
21
|
+
export function loadAgentSessions(limit = 10) {
|
|
22
|
+
ensureFtDir();
|
|
23
|
+
if (!fs.existsSync(SESSIONS_FILE))
|
|
24
|
+
return [];
|
|
25
|
+
try {
|
|
26
|
+
const raw = fs.readFileSync(SESSIONS_FILE, 'utf-8');
|
|
27
|
+
const sessions = JSON.parse(raw);
|
|
28
|
+
if (!Array.isArray(sessions))
|
|
29
|
+
return [];
|
|
30
|
+
return sessions.slice(0, limit);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return [];
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Save a new agent session record to disk.
|
|
38
|
+
* Keeps history intact, prepending the latest session.
|
|
39
|
+
*/
|
|
40
|
+
export function saveAgentSession(session) {
|
|
41
|
+
ensureFtDir();
|
|
42
|
+
const existing = loadAgentSessions(50);
|
|
43
|
+
const newRecord = {
|
|
44
|
+
id: session.id || `session-${Date.now()}-${Math.floor(Math.random() * 1000)}`,
|
|
45
|
+
timestamp: session.timestamp || new Date().toISOString(),
|
|
46
|
+
goal: session.goal,
|
|
47
|
+
summary: session.summary,
|
|
48
|
+
modifiedFiles: session.modifiedFiles || [],
|
|
49
|
+
keyHighlights: session.keyHighlights || [],
|
|
50
|
+
};
|
|
51
|
+
// Prepend new session
|
|
52
|
+
const updated = [newRecord, ...existing];
|
|
53
|
+
fs.writeFileSync(SESSIONS_FILE, JSON.stringify(updated, null, 2), 'utf-8');
|
|
54
|
+
return newRecord;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Retrieves past session history formatted for the LLM context.
|
|
58
|
+
* Guarantees context from at least the previous minSessions (default: 3 sessions minimum).
|
|
59
|
+
*/
|
|
60
|
+
export function getRecentSessionsSummary(minSessions = 3) {
|
|
61
|
+
const sessions = loadAgentSessions(Math.max(minSessions, 5));
|
|
62
|
+
if (sessions.length === 0)
|
|
63
|
+
return '';
|
|
64
|
+
// Take up to the requested number of sessions (at least minSessions if available)
|
|
65
|
+
const targetSessions = sessions.slice(0, Math.max(minSessions, 3));
|
|
66
|
+
const formattedList = targetSessions.map((s, idx) => {
|
|
67
|
+
const dateStr = new Date(s.timestamp).toLocaleString();
|
|
68
|
+
const filesStr = s.modifiedFiles && s.modifiedFiles.length > 0
|
|
69
|
+
? s.modifiedFiles.map((f) => `\`${f}\``).join(', ')
|
|
70
|
+
: 'None';
|
|
71
|
+
return (`--- Previous Session #${targetSessions.length - idx} (${dateStr}) ---\n` +
|
|
72
|
+
`• User Goal: "${s.goal}"\n` +
|
|
73
|
+
`• Summary & Outcome: ${s.summary}\n` +
|
|
74
|
+
`• Modified Files: ${filesStr}`);
|
|
75
|
+
}).reverse(); // Present in chronological order
|
|
76
|
+
return (`[Previous Agent Sessions Memory (Last ${targetSessions.length} Session(s) Context)]:\n` +
|
|
77
|
+
`The agent MUST remember the context, goals, and changes made in these previous sessions:\n\n` +
|
|
78
|
+
formattedList.join('\n\n') +
|
|
79
|
+
`\n\nUse this session memory to maintain continuity, understand existing progress, avoid repeating past mistakes, and build upon prior session changes.`);
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAiBxB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AACxD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;AAE/D,SAAS,WAAW;IAChB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,qBAAqB,CAAC,CAAC;IAC1E,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7D,IAAI,CAAC;YACD,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC,CAAC,CAAC;IACf,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAK,GAAW,EAAE;IAChD,WAAW,EAAE,CAAC;IACd,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7C,IAAI,CAAC;QACD,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAyB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;YAAE,OAAO,EAAE,CAAC;QACxC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAA2F;IACxH,WAAW,EAAE,CAAC;IACd,MAAM,QAAQ,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,SAAS,GAAuB;QAClC,EAAE,EAAE,OAAO,CAAC,EAAE,IAAI,WAAW,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE;QAC7E,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACxD,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,EAAE;QAC1C,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,EAAE;KAC7C,CAAC;IAEF,sBAAsB;IACtB,MAAM,OAAO,GAAG,CAAC,SAAS,EAAE,GAAG,QAAQ,CAAC,CAAC;IACzC,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC3E,OAAO,SAAS,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,WAAW,GAAW,CAAC;IAC5D,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAErC,kFAAkF;IAClF,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;IAEnE,MAAM,aAAa,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;QAChD,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,CAAC;QACvD,MAAM,QAAQ,GAAG,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;YAC1D,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YACnD,CAAC,CAAC,MAAM,CAAC;QAEb,OAAO,CACH,yBAAyB,cAAc,CAAC,MAAM,GAAG,GAAG,KAAK,OAAO,SAAS;YACzE,iBAAiB,CAAC,CAAC,IAAI,KAAK;YAC5B,wBAAwB,CAAC,CAAC,OAAO,IAAI;YACrC,qBAAqB,QAAQ,EAAE,CAClC,CAAC;IACN,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,iCAAiC;IAE/C,OAAO,CACH,yCAAyC,cAAc,CAAC,MAAM,0BAA0B;QACxF,8FAA8F;QAC9F,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;QAC1B,wJAAwJ,CAC3J,CAAC;AACN,CAAC"}
|