fix(framework): add real-time pressure to ffs command
- Add --tokens=<current>/<budget> parameter to framework-stats.js - Calculate and display real-time context pressure when tokens provided - Show data source (real-time/cached/history/stats) in output - Display warning when showing cached data - Include token budget and usage percentage in output Fixes issue where ffs showed stale 0% pressure from cached session state 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
d6abefefdb
commit
1c4b1dfda2
1 changed files with 53 additions and 8 deletions
|
|
@ -140,6 +140,21 @@ async function getAuditLogStats() {
|
||||||
|
|
||||||
async function main() {
|
async function main() {
|
||||||
try {
|
try {
|
||||||
|
// Parse command-line arguments
|
||||||
|
const args = process.argv.slice(2);
|
||||||
|
const tokensArg = args.find(arg => arg.startsWith('--tokens='));
|
||||||
|
let currentTokens = null;
|
||||||
|
let tokenBudget = null;
|
||||||
|
|
||||||
|
if (tokensArg) {
|
||||||
|
const tokensValue = tokensArg.split('=')[1];
|
||||||
|
const [current, budget] = tokensValue.split('/').map(t => parseInt(t.trim()));
|
||||||
|
if (!isNaN(current) && !isNaN(budget)) {
|
||||||
|
currentTokens = current;
|
||||||
|
tokenBudget = budget;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Connect to MongoDB
|
// Connect to MongoDB
|
||||||
await mongoose.connect('mongodb://localhost:27017/tractatus_dev', {
|
await mongoose.connect('mongodb://localhost:27017/tractatus_dev', {
|
||||||
serverSelectionTimeoutMS: 2000
|
serverSelectionTimeoutMS: 2000
|
||||||
|
|
@ -168,6 +183,12 @@ async function main() {
|
||||||
? pressureHistory[pressureHistory.length - 1]
|
? pressureHistory[pressureHistory.length - 1]
|
||||||
: null;
|
: null;
|
||||||
|
|
||||||
|
// Calculate real-time pressure if tokens provided
|
||||||
|
let realTimePressure = null;
|
||||||
|
if (currentTokens !== null && tokenBudget !== null) {
|
||||||
|
realTimePressure = await ContextPressureMonitor.analyzePressure(currentTokens, tokenBudget, 1);
|
||||||
|
}
|
||||||
|
|
||||||
// Build report
|
// Build report
|
||||||
const report = {
|
const report = {
|
||||||
timestamp: new Date().toISOString(),
|
timestamp: new Date().toISOString(),
|
||||||
|
|
@ -187,22 +208,33 @@ async function main() {
|
||||||
nextCheckpoint: tokenCheckpoints.checkpoints.find(c => !c.reached)
|
nextCheckpoint: tokenCheckpoints.checkpoints.find(c => !c.reached)
|
||||||
} : null,
|
} : null,
|
||||||
|
|
||||||
contextPressure: sessionStats?.pressureMonitoring ? {
|
contextPressure: realTimePressure ? {
|
||||||
|
level: realTimePressure.pressureLevel?.name || 'NORMAL',
|
||||||
|
score: Math.round(realTimePressure.overallScore * 10) / 10,
|
||||||
|
tokenCount: currentTokens,
|
||||||
|
tokenBudget: tokenBudget,
|
||||||
|
source: 'real-time',
|
||||||
|
timestamp: new Date().toISOString(),
|
||||||
|
metrics: realTimePressure.metrics
|
||||||
|
} : (sessionStats?.pressureMonitoring ? {
|
||||||
level: sessionStats.pressureMonitoring.last_level || 'UNKNOWN',
|
level: sessionStats.pressureMonitoring.last_level || 'UNKNOWN',
|
||||||
score: sessionStats.pressureMonitoring.last_score || 0,
|
score: sessionStats.pressureMonitoring.last_score || 0,
|
||||||
lastChecked: sessionStats.pressureMonitoring.timestamp,
|
lastChecked: sessionStats.pressureMonitoring.timestamp,
|
||||||
messageNumber: sessionStats.pressureMonitoring.message,
|
messageNumber: sessionStats.pressureMonitoring.message,
|
||||||
tokenCount: sessionStats.pressureMonitoring.tokens
|
tokenCount: sessionStats.pressureMonitoring.tokens,
|
||||||
|
source: 'cached'
|
||||||
} : (latestPressure ? {
|
} : (latestPressure ? {
|
||||||
level: latestPressure.pressureLevel?.name || 'UNKNOWN',
|
level: latestPressure.pressureLevel?.name || 'UNKNOWN',
|
||||||
score: latestPressure.overallScore,
|
score: latestPressure.overallScore,
|
||||||
timestamp: latestPressure.timestamp,
|
timestamp: latestPressure.timestamp,
|
||||||
metrics: latestPressure.metrics
|
metrics: latestPressure.metrics,
|
||||||
|
source: 'history'
|
||||||
} : (monitorStats ? {
|
} : (monitorStats ? {
|
||||||
level: 'UNKNOWN',
|
level: 'UNKNOWN',
|
||||||
score: 0,
|
score: 0,
|
||||||
stats: monitorStats
|
stats: monitorStats,
|
||||||
} : null)),
|
source: 'stats'
|
||||||
|
} : null))),
|
||||||
|
|
||||||
autoCompacts: sessionStats?.autoCompactEvents ? {
|
autoCompacts: sessionStats?.autoCompactEvents ? {
|
||||||
total: sessionStats.autoCompactEvents.length,
|
total: sessionStats.autoCompactEvents.length,
|
||||||
|
|
@ -280,13 +312,26 @@ async function main() {
|
||||||
console.log('⚠️ CONTEXT PRESSURE');
|
console.log('⚠️ CONTEXT PRESSURE');
|
||||||
console.log(` Level: ${report.contextPressure.level}`);
|
console.log(` Level: ${report.contextPressure.level}`);
|
||||||
console.log(` Overall Score: ${report.contextPressure.score}%`);
|
console.log(` Overall Score: ${report.contextPressure.score}%`);
|
||||||
|
console.log(` Data Source: ${report.contextPressure.source || 'unknown'}`);
|
||||||
|
|
||||||
|
if (report.contextPressure.source === 'cached') {
|
||||||
|
console.log(' ⚠️ WARNING: Showing cached data. Use --tokens=<current>/<budget> for real-time.');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (report.contextPressure.tokenCount) {
|
||||||
|
console.log(` Token Count: ${report.contextPressure.tokenCount?.toLocaleString()}`);
|
||||||
|
}
|
||||||
|
if (report.contextPressure.tokenBudget) {
|
||||||
|
console.log(` Token Budget: ${report.contextPressure.tokenBudget?.toLocaleString()}`);
|
||||||
|
const percentUsed = ((report.contextPressure.tokenCount / report.contextPressure.tokenBudget) * 100).toFixed(1);
|
||||||
|
console.log(` Tokens Used: ${percentUsed}%`);
|
||||||
|
}
|
||||||
if (report.contextPressure.lastChecked) {
|
if (report.contextPressure.lastChecked) {
|
||||||
console.log(` Last Checked: ${new Date(report.contextPressure.lastChecked).toLocaleString()}`);
|
console.log(` Last Checked: ${new Date(report.contextPressure.lastChecked).toLocaleString()}`);
|
||||||
console.log(` At Message: #${report.contextPressure.messageNumber}`);
|
console.log(` At Message: #${report.contextPressure.messageNumber}`);
|
||||||
console.log(` Token Count: ${report.contextPressure.tokenCount?.toLocaleString() || 'N/A'}`);
|
|
||||||
}
|
}
|
||||||
if (report.contextPressure.timestamp) {
|
if (report.contextPressure.timestamp && report.contextPressure.source !== 'cached') {
|
||||||
console.log(` Last Updated: ${new Date(report.contextPressure.timestamp).toLocaleString()}`);
|
console.log(` Calculated: ${new Date(report.contextPressure.timestamp).toLocaleString()}`);
|
||||||
}
|
}
|
||||||
if (report.contextPressure.metrics) {
|
if (report.contextPressure.metrics) {
|
||||||
console.log(' Metrics:');
|
console.log(' Metrics:');
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue