aura-code 0.6.3 → 0.10.1
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/README.md +47 -164
- package/dist/agent/affect.d.ts +13 -0
- package/dist/agent/affect.js +34 -0
- package/dist/agent/affect.js.map +1 -0
- package/dist/agent/compactor.d.ts +27 -4
- package/dist/agent/compactor.js +185 -54
- package/dist/agent/compactor.js.map +1 -1
- package/dist/agent/confess.d.ts +35 -0
- package/dist/agent/confess.js +296 -0
- package/dist/agent/confess.js.map +1 -0
- package/dist/agent/context.d.ts +0 -4
- package/dist/agent/context.js +0 -38
- package/dist/agent/context.js.map +1 -1
- package/dist/agent/domain-expertise.d.ts +22 -0
- package/dist/agent/domain-expertise.js +110 -0
- package/dist/agent/domain-expertise.js.map +1 -0
- package/dist/agent/executive-queue.d.ts +26 -0
- package/dist/agent/executive-queue.js +50 -0
- package/dist/agent/executive-queue.js.map +1 -0
- package/dist/agent/generational-flush.d.ts +28 -0
- package/dist/agent/generational-flush.js +48 -0
- package/dist/agent/generational-flush.js.map +1 -0
- package/dist/agent/loop-profile.d.ts +50 -0
- package/dist/agent/loop-profile.js +88 -0
- package/dist/agent/loop-profile.js.map +1 -0
- package/dist/agent/loop.d.ts +14 -5
- package/dist/agent/loop.js +167 -39
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/memory-consolidate.d.ts +14 -0
- package/dist/agent/memory-consolidate.js +141 -0
- package/dist/agent/memory-consolidate.js.map +1 -0
- package/dist/agent/mixture.d.ts +33 -0
- package/dist/agent/mixture.js +138 -0
- package/dist/agent/mixture.js.map +1 -0
- package/dist/agent/spawner.js +2 -2
- package/dist/agent/spawner.js.map +1 -1
- package/dist/agent/system-prompt.d.ts +1 -1
- package/dist/agent/system-prompt.js +50 -22
- package/dist/agent/system-prompt.js.map +1 -1
- package/dist/agent/unified-memory.d.ts +15 -0
- package/dist/agent/unified-memory.js +164 -0
- package/dist/agent/unified-memory.js.map +1 -0
- package/dist/checkpoints/engine.d.ts +44 -0
- package/dist/checkpoints/engine.js +324 -0
- package/dist/checkpoints/engine.js.map +1 -0
- package/dist/cli/command-palette.d.ts +26 -0
- package/dist/cli/command-palette.js +133 -0
- package/dist/cli/command-palette.js.map +1 -0
- package/dist/cli/context-health.d.ts +51 -0
- package/dist/cli/context-health.js +187 -0
- package/dist/cli/context-health.js.map +1 -0
- package/dist/cli/diamond.d.ts +67 -0
- package/dist/cli/diamond.js +222 -12
- package/dist/cli/diamond.js.map +1 -1
- package/dist/cli/dic.d.ts +2 -0
- package/dist/cli/dic.js +106 -0
- package/dist/cli/dic.js.map +1 -0
- package/dist/cli/diff-view.d.ts +18 -0
- package/dist/cli/diff-view.js +114 -0
- package/dist/cli/diff-view.js.map +1 -0
- package/dist/cli/display.d.ts +18 -4
- package/dist/cli/display.js +74 -151
- package/dist/cli/display.js.map +1 -1
- package/dist/cli/help-data.d.ts +7 -0
- package/dist/cli/help-data.js +80 -0
- package/dist/cli/help-data.js.map +1 -0
- package/dist/cli/index.js +1002 -852
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/markdown.d.ts +5 -0
- package/dist/cli/markdown.js +128 -0
- package/dist/cli/markdown.js.map +1 -0
- package/dist/cli/model-select.d.ts +39 -0
- package/dist/cli/model-select.js +65 -0
- package/dist/cli/model-select.js.map +1 -0
- package/dist/cli/tui.d.ts +34 -0
- package/dist/cli/tui.js +1176 -0
- package/dist/cli/tui.js.map +1 -0
- package/dist/config/defaults.d.ts +6 -17
- package/dist/config/defaults.js +25 -46
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/project-config.d.ts +2 -6
- package/dist/config/project-config.js +2 -2
- package/dist/config/project-config.js.map +1 -1
- package/dist/doctor/checks.d.ts +18 -0
- package/dist/doctor/checks.js +524 -0
- package/dist/doctor/checks.js.map +1 -0
- package/dist/doctor/index.d.ts +4 -0
- package/dist/doctor/index.js +229 -0
- package/dist/doctor/index.js.map +1 -0
- package/dist/doctor/repair.d.ts +19 -0
- package/dist/doctor/repair.js +126 -0
- package/dist/doctor/repair.js.map +1 -0
- package/dist/doctor/types.d.ts +38 -0
- package/dist/doctor/types.js +10 -0
- package/dist/doctor/types.js.map +1 -0
- package/dist/dream/dream.d.ts +79 -59
- package/dist/dream/dream.js +324 -144
- package/dist/dream/dream.js.map +1 -1
- package/dist/dream/episode.d.ts +17 -0
- package/dist/dream/episode.js +116 -0
- package/dist/dream/episode.js.map +1 -0
- package/dist/kanban/engine.d.ts +26 -0
- package/dist/kanban/engine.js +208 -0
- package/dist/kanban/engine.js.map +1 -0
- package/dist/kanban/types.d.ts +19 -0
- package/dist/kanban/types.js +9 -1
- package/dist/kanban/types.js.map +1 -1
- package/dist/machina/render-html.js +4 -2
- package/dist/machina/render-html.js.map +1 -1
- package/dist/machina/render-terminal.js +11 -4
- package/dist/machina/render-terminal.js.map +1 -1
- package/dist/machina/repair.d.ts +23 -0
- package/dist/machina/repair.js +98 -0
- package/dist/machina/repair.js.map +1 -0
- package/dist/machina/spec.js +12 -12
- package/dist/machina/spec.js.map +1 -1
- package/dist/machina/verify.d.ts +13 -1
- package/dist/machina/verify.js +12 -2
- package/dist/machina/verify.js.map +1 -1
- package/dist/mining/extract.d.ts +34 -0
- package/dist/mining/extract.js +229 -0
- package/dist/mining/extract.js.map +1 -0
- package/dist/mining/refine.d.ts +28 -0
- package/dist/mining/refine.js +256 -0
- package/dist/mining/refine.js.map +1 -0
- package/dist/perception/extractor.js +5 -3
- package/dist/perception/extractor.js.map +1 -1
- package/dist/perception/graph-store.d.ts +0 -11
- package/dist/perception/graph-store.js +0 -33
- package/dist/perception/graph-store.js.map +1 -1
- package/dist/perception/index.d.ts +1 -1
- package/dist/perception/index.js +1 -2
- package/dist/perception/index.js.map +1 -1
- package/dist/plugins/commands.d.ts +38 -0
- package/dist/plugins/commands.js +134 -0
- package/dist/plugins/commands.js.map +1 -0
- package/dist/plugins/frontmatter.d.ts +14 -0
- package/dist/plugins/frontmatter.js +78 -0
- package/dist/plugins/frontmatter.js.map +1 -0
- package/dist/plugins/hooks.d.ts +12 -0
- package/dist/plugins/hooks.js +148 -0
- package/dist/plugins/hooks.js.map +1 -0
- package/dist/plugins/loader.d.ts +7 -0
- package/dist/plugins/loader.js +255 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/market.d.ts +23 -0
- package/dist/plugins/market.js +281 -0
- package/dist/plugins/market.js.map +1 -0
- package/dist/plugins/types.d.ts +90 -0
- package/dist/plugins/types.js +20 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/providers/anthropic-oauth-draft.d.ts +119 -0
- package/dist/providers/anthropic-oauth-draft.js +414 -0
- package/dist/providers/anthropic-oauth-draft.js.map +1 -0
- package/dist/providers/anthropic.d.ts +4 -1
- package/dist/providers/anthropic.js +35 -7
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/factory.d.ts +43 -19
- package/dist/providers/factory.js +183 -129
- package/dist/providers/factory.js.map +1 -1
- package/dist/providers/google.js +9 -22
- package/dist/providers/google.js.map +1 -1
- package/dist/providers/live-models.d.ts +23 -0
- package/dist/providers/live-models.js +145 -0
- package/dist/providers/live-models.js.map +1 -0
- package/dist/providers/openai-compatible.d.ts +1 -12
- package/dist/providers/openai-compatible.js +71 -108
- package/dist/providers/openai-compatible.js.map +1 -1
- package/dist/providers/resilient-factory.js +1 -1
- package/dist/providers/resilient-factory.js.map +1 -1
- package/dist/repl/queue.d.ts +22 -0
- package/dist/repl/queue.js +165 -0
- package/dist/repl/queue.js.map +1 -0
- package/dist/repl/side-channel.d.ts +23 -0
- package/dist/repl/side-channel.js +63 -0
- package/dist/repl/side-channel.js.map +1 -0
- package/dist/research/council.d.ts +2 -0
- package/dist/research/council.js +29 -4
- package/dist/research/council.js.map +1 -1
- package/dist/ruby/alternator.d.ts +11 -30
- package/dist/ruby/alternator.js +59 -38
- package/dist/ruby/alternator.js.map +1 -1
- package/dist/ruby/episode-capture.d.ts +0 -10
- package/dist/ruby/episode-capture.js +0 -33
- package/dist/ruby/episode-capture.js.map +1 -1
- package/dist/ruby/types.js +1 -1
- package/dist/ruby/types.js.map +1 -1
- package/dist/safety/path-jail.d.ts +17 -0
- package/dist/safety/path-jail.js +100 -0
- package/dist/safety/path-jail.js.map +1 -0
- package/dist/safety/permissions.d.ts +12 -21
- package/dist/safety/permissions.js +81 -216
- package/dist/safety/permissions.js.map +1 -1
- package/dist/safety/ssrf.d.ts +29 -0
- package/dist/safety/ssrf.js +185 -0
- package/dist/safety/ssrf.js.map +1 -0
- package/dist/server/index.js +64 -10
- package/dist/server/index.js.map +1 -1
- package/dist/setup/first-run.d.ts +0 -24
- package/dist/setup/first-run.js +10 -344
- package/dist/setup/first-run.js.map +1 -1
- package/dist/setup/key-store.d.ts +12 -0
- package/dist/setup/key-store.js +108 -0
- package/dist/setup/key-store.js.map +1 -0
- package/dist/setup/provider-registry.js +31 -18
- package/dist/setup/provider-registry.js.map +1 -1
- package/dist/setup/provider-test.d.ts +7 -0
- package/dist/setup/provider-test.js +73 -10
- package/dist/setup/provider-test.js.map +1 -1
- package/dist/setup/provider-wizard.d.ts +4 -1
- package/dist/setup/provider-wizard.js +92 -26
- package/dist/setup/provider-wizard.js.map +1 -1
- package/dist/setup/xiaomi.d.ts +1 -1
- package/dist/setup/xiaomi.js +3 -3
- package/dist/setup/xiaomi.js.map +1 -1
- package/dist/tools/browser.js +14 -10
- package/dist/tools/browser.js.map +1 -1
- package/dist/tools/clipboard.js +7 -1
- package/dist/tools/clipboard.js.map +1 -1
- package/dist/tools/dictate.d.ts +60 -0
- package/dist/tools/dictate.js +983 -0
- package/dist/tools/dictate.js.map +1 -0
- package/dist/tools/dictate_patched.js +1057 -0
- package/dist/tools/edit-file.js +10 -2
- package/dist/tools/edit-file.js.map +1 -1
- package/dist/tools/http-request.js +14 -4
- package/dist/tools/http-request.js.map +1 -1
- package/dist/tools/image-read.js +34 -2
- package/dist/tools/image-read.js.map +1 -1
- package/dist/tools/index.d.ts +16 -1
- package/dist/tools/index.js +59 -8
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/mcp.js +12 -0
- package/dist/tools/mcp.js.map +1 -1
- package/dist/tools/read-file.js +10 -14
- package/dist/tools/read-file.js.map +1 -1
- package/dist/tools/telegram-audio-policy.d.ts +30 -0
- package/dist/tools/telegram-audio-policy.js +49 -0
- package/dist/tools/telegram-audio-policy.js.map +1 -0
- package/dist/tools/telegram-bot.js +1136 -537
- package/dist/tools/telegram-bot.js.map +1 -1
- package/dist/tools/telegram-voice.d.ts +18 -5
- package/dist/tools/telegram-voice.js +54 -12
- package/dist/tools/telegram-voice.js.map +1 -1
- package/dist/tools/telegram.d.ts +3 -3
- package/dist/tools/telegram.js +5 -84
- package/dist/tools/telegram.js.map +1 -1
- package/dist/tools/tools.d.ts +2 -14
- package/dist/tools/tools.js +79 -144
- package/dist/tools/tools.js.map +1 -1
- package/dist/tools/web-fetch.js +39 -7
- package/dist/tools/web-fetch.js.map +1 -1
- package/dist/tools/web-search.d.ts +0 -20
- package/dist/tools/web-search.js +40 -137
- package/dist/tools/web-search.js.map +1 -1
- package/dist/util/errors.js +1 -15
- package/dist/util/errors.js.map +1 -1
- package/dist/util/json-repair.d.ts +11 -0
- package/dist/util/json-repair.js +31 -0
- package/dist/util/json-repair.js.map +1 -0
- package/dist/util/rate-limiter.js +2 -8
- package/dist/util/rate-limiter.js.map +1 -1
- package/dist/viz/index.js +793 -792
- package/dist/viz/index.js.map +1 -1
- package/package.json +12 -32
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.gitDirOf = gitDirOf;
|
|
37
|
+
exports.createCheckpoint = createCheckpoint;
|
|
38
|
+
exports.listCheckpoints = listCheckpoints;
|
|
39
|
+
exports.restoreCheckpoint = restoreCheckpoint;
|
|
40
|
+
exports.pruneCheckpoints = pruneCheckpoints;
|
|
41
|
+
exports.deleteCheckpoint = deleteCheckpoint;
|
|
42
|
+
/**
|
|
43
|
+
* Checkpoints — shadow-git snapshots of the working tree, so every agent
|
|
44
|
+
* write is cheaply reversible with `aura --undo` (or `:undo` in the REPL).
|
|
45
|
+
*
|
|
46
|
+
* How it works: before the first mutating tool call of each turn, the loop
|
|
47
|
+
* snapshots the ENTIRE working tree (tracked + untracked, .gitignore
|
|
48
|
+
* respected) into the repo's object store via a TEMPORARY index, then points
|
|
49
|
+
* a ref at it under `refs/aura/checkpoints/<id>`. The user's real index,
|
|
50
|
+
* HEAD, branches, and reflog are never touched — checkpoints are invisible
|
|
51
|
+
* to normal git workflows and are garbage-collectable once pruned.
|
|
52
|
+
*
|
|
53
|
+
* Restore diffs the snapshot tree against a fresh snapshot of "now", writes
|
|
54
|
+
* changed/added files back and deletes files that didn't exist at snapshot
|
|
55
|
+
* time. A pre-restore checkpoint is always taken first, so restore itself
|
|
56
|
+
* is undoable.
|
|
57
|
+
*
|
|
58
|
+
* Requires the project to be a git repository; in a non-repo all operations
|
|
59
|
+
* are silent no-ops (create returns null).
|
|
60
|
+
*/
|
|
61
|
+
const child_process_1 = require("child_process");
|
|
62
|
+
const fs = __importStar(require("fs"));
|
|
63
|
+
const path = __importStar(require("path"));
|
|
64
|
+
const REF_PREFIX = 'refs/aura/checkpoints/';
|
|
65
|
+
/** Shadow commits need an ident but must never depend on user git config. */
|
|
66
|
+
const SHADOW_IDENT = {
|
|
67
|
+
GIT_AUTHOR_NAME: 'aura-checkpoint',
|
|
68
|
+
GIT_AUTHOR_EMAIL: 'checkpoint@aura.local',
|
|
69
|
+
GIT_COMMITTER_NAME: 'aura-checkpoint',
|
|
70
|
+
GIT_COMMITTER_EMAIL: 'checkpoint@aura.local',
|
|
71
|
+
};
|
|
72
|
+
function git(root, args, extraEnv, stdin) {
|
|
73
|
+
return new Promise((resolve, reject) => {
|
|
74
|
+
const child = (0, child_process_1.execFile)('git', args, { cwd: root, env: { ...process.env, ...SHADOW_IDENT, ...extraEnv }, maxBuffer: 64 * 1024 * 1024 }, (err, stdout, stderr) => {
|
|
75
|
+
if (err)
|
|
76
|
+
reject(new Error(`git ${args[0]}: ${stderr || err.message}`));
|
|
77
|
+
else
|
|
78
|
+
resolve(stdout);
|
|
79
|
+
});
|
|
80
|
+
if (stdin !== undefined)
|
|
81
|
+
child.stdin?.end(stdin);
|
|
82
|
+
else
|
|
83
|
+
child.stdin?.end();
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
/** Absolute .git dir of the repo containing root, or null if not a repo. */
|
|
87
|
+
async function gitDirOf(root) {
|
|
88
|
+
try {
|
|
89
|
+
return (await git(root, ['rev-parse', '--absolute-git-dir'])).trim();
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Monotonic within the process so ids created in the same millisecond still
|
|
96
|
+
// sort in creation order (listCheckpoints sorts by refname).
|
|
97
|
+
let lastIdTs = 0;
|
|
98
|
+
function newId() {
|
|
99
|
+
lastIdTs = Math.max(Date.now(), lastIdTs + 1);
|
|
100
|
+
return `${lastIdTs.toString(36)}-${Math.random().toString(36).slice(2, 6)}`;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Common secret patterns that should never be captured in checkpoints.
|
|
104
|
+
* These patterns match files that contain API keys, tokens, or other secrets.
|
|
105
|
+
*/
|
|
106
|
+
const SECRET_PATTERNS = [
|
|
107
|
+
// Environment variable style: TOKEN=, API_KEY=, etc.
|
|
108
|
+
/^(?:TOKEN|API_KEY|SECRET|PASSWORD|AUTH|KEY|BEARER)\s*=/i,
|
|
109
|
+
// JSON style: "api_key": "sk_...", "token": "ghp_..."
|
|
110
|
+
/["'](?:api_key|token|secret|password|auth_key|bearer|access_token)["']?\s*:\s*["']?(?:sk_|pk_|ghp_|gho_|ghu_|glpat-|ey|Bearer)/i,
|
|
111
|
+
// Common API key patterns (more lenient)
|
|
112
|
+
/(?:sk_|pk_|ghp_|gho_|ghu_|glpat-)[a-zA-Z0-9_]{10,}/i,
|
|
113
|
+
// Bearer tokens
|
|
114
|
+
/Bearer\s+[a-zA-Z0-9_\-\.]{10,}/i,
|
|
115
|
+
// Private keys
|
|
116
|
+
/-----BEGIN\s+(?:RSA\s+)?PRIVATE\s+KEY-----/,
|
|
117
|
+
// Generic long base64-like strings (likely tokens)
|
|
118
|
+
/[a-zA-Z0-9_\-\.]{32,}/,
|
|
119
|
+
];
|
|
120
|
+
/**
|
|
121
|
+
* Check if a file contains potential secrets by scanning its content.
|
|
122
|
+
* Returns true if any secret pattern is matched.
|
|
123
|
+
*/
|
|
124
|
+
function fileContainsSecrets(content) {
|
|
125
|
+
for (const pattern of SECRET_PATTERNS) {
|
|
126
|
+
if (pattern.test(content))
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Get list of files in the temporary index that should be excluded from checkpoints
|
|
133
|
+
* due to containing secrets.
|
|
134
|
+
*/
|
|
135
|
+
async function getSecretFilesFromIndex(root, env) {
|
|
136
|
+
const secretFiles = [];
|
|
137
|
+
try {
|
|
138
|
+
// Get all files in the temporary index (tracked + staged untracked files)
|
|
139
|
+
const out = await git(root, ['ls-files', '-z'], env);
|
|
140
|
+
const files = out.split('\0').filter(Boolean);
|
|
141
|
+
for (const file of files) {
|
|
142
|
+
const absPath = path.join(root, file);
|
|
143
|
+
try {
|
|
144
|
+
// Only check text-based files that might contain credentials
|
|
145
|
+
if (/\.(json|js|ts|mjs|env|config|sh|py|ya?ml|toml|ini|conf|txt|md)$/.test(file)) {
|
|
146
|
+
const content = fs.readFileSync(absPath, 'utf8');
|
|
147
|
+
if (fileContainsSecrets(content)) {
|
|
148
|
+
secretFiles.push(file);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch (e) { /* skip files we can't read */ }
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
catch (e) { /* if git ls-files fails, return empty array */ }
|
|
156
|
+
return secretFiles;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Snapshot the working tree into the object store through a temporary index.
|
|
160
|
+
* Returns the tree hash. Never touches the user's real index.
|
|
161
|
+
*
|
|
162
|
+
* SECURITY: Excludes files containing secrets to prevent credential leakage
|
|
163
|
+
* into checkpoint refs. This is a critical safety measure since checkpoint refs
|
|
164
|
+
* live outside normal branches and won't be caught by standard secret scanning.
|
|
165
|
+
*/
|
|
166
|
+
async function writeShadowTree(root, gitDir) {
|
|
167
|
+
const tmpIndex = path.join(gitDir, `aura-checkpoint-index-${process.pid}`);
|
|
168
|
+
const env = { GIT_INDEX_FILE: tmpIndex };
|
|
169
|
+
try {
|
|
170
|
+
// Seed from HEAD when it exists so `add -A` computes a minimal update.
|
|
171
|
+
try {
|
|
172
|
+
await git(root, ['read-tree', 'HEAD'], env);
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
await git(root, ['read-tree', '--empty'], env);
|
|
176
|
+
}
|
|
177
|
+
// Add all files, respecting .gitignore (git add -A behavior)
|
|
178
|
+
await git(root, ['add', '-A', '--', '.'], env);
|
|
179
|
+
// CRITICAL: Remove any files that contain secrets (check AFTER adding to index)
|
|
180
|
+
const secretFiles = await getSecretFilesFromIndex(root, env);
|
|
181
|
+
if (secretFiles.length > 0) {
|
|
182
|
+
// Remove files with secrets from the index
|
|
183
|
+
await git(root, ['rm', '--cached', '--', ...secretFiles], env);
|
|
184
|
+
console.warn(`[checkpoint] Excluded ${secretFiles.length} file(s) containing secrets from checkpoint`);
|
|
185
|
+
}
|
|
186
|
+
return (await git(root, ['write-tree'], env)).trim();
|
|
187
|
+
}
|
|
188
|
+
finally {
|
|
189
|
+
try {
|
|
190
|
+
fs.unlinkSync(tmpIndex);
|
|
191
|
+
}
|
|
192
|
+
catch { /* already gone */ }
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Create a checkpoint of the current working tree.
|
|
197
|
+
* Returns null when: not a git repo, or the tree is identical to the most
|
|
198
|
+
* recent checkpoint (deduped — repeated calls within a burst are no-ops).
|
|
199
|
+
*/
|
|
200
|
+
async function createCheckpoint(root, label) {
|
|
201
|
+
const gitDir = await gitDirOf(root);
|
|
202
|
+
if (!gitDir)
|
|
203
|
+
return null;
|
|
204
|
+
const tree = await writeShadowTree(root, gitDir);
|
|
205
|
+
const existing = await listCheckpoints(root);
|
|
206
|
+
if (existing[0]?.tree === tree)
|
|
207
|
+
return null;
|
|
208
|
+
let head = null;
|
|
209
|
+
try {
|
|
210
|
+
head = (await git(root, ['rev-parse', '--verify', 'HEAD'])).trim();
|
|
211
|
+
}
|
|
212
|
+
catch { /* unborn branch — parentless shadow commit */ }
|
|
213
|
+
const cleanLabel = label.replace(/\s+/g, ' ').trim().slice(0, 120) || 'checkpoint';
|
|
214
|
+
const commitArgs = ['commit-tree', tree, '-m', cleanLabel];
|
|
215
|
+
if (head)
|
|
216
|
+
commitArgs.push('-p', head);
|
|
217
|
+
const commit = (await git(root, commitArgs)).trim();
|
|
218
|
+
const id = newId();
|
|
219
|
+
const ref = REF_PREFIX + id;
|
|
220
|
+
await git(root, ['update-ref', ref, commit]);
|
|
221
|
+
return { id, ref, commit, tree, label: cleanLabel, createdAt: new Date().toISOString() };
|
|
222
|
+
}
|
|
223
|
+
/** All checkpoints for the repo containing root, newest first. */
|
|
224
|
+
async function listCheckpoints(root) {
|
|
225
|
+
const gitDir = await gitDirOf(root);
|
|
226
|
+
if (!gitDir)
|
|
227
|
+
return [];
|
|
228
|
+
// Sort by refname, not creatordate: commit dates have 1-second resolution,
|
|
229
|
+
// while ids embed a base36 ms timestamp that sorts correctly lexically.
|
|
230
|
+
const out = await git(root, [
|
|
231
|
+
'for-each-ref', '--sort=-refname',
|
|
232
|
+
'--format=%(refname)%09%(objectname)%09%(tree)%09%(creatordate:iso-strict)%09%(subject)',
|
|
233
|
+
REF_PREFIX,
|
|
234
|
+
]);
|
|
235
|
+
return out.split('\n').filter(Boolean).map(line => {
|
|
236
|
+
const [ref, commit, tree, createdAt, ...subject] = line.split('\t');
|
|
237
|
+
return {
|
|
238
|
+
id: ref.slice(REF_PREFIX.length),
|
|
239
|
+
ref, commit, tree, createdAt,
|
|
240
|
+
label: subject.join('\t'),
|
|
241
|
+
};
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Restore the working tree to the state captured by checkpoint `id`
|
|
246
|
+
* (or the most recent checkpoint when id is omitted).
|
|
247
|
+
*
|
|
248
|
+
* Only paths that differ are touched; the user's index/HEAD stay put, so
|
|
249
|
+
* after a restore `git status` simply reflects the restored content.
|
|
250
|
+
*/
|
|
251
|
+
async function restoreCheckpoint(root, id) {
|
|
252
|
+
const gitDir = await gitDirOf(root);
|
|
253
|
+
if (!gitDir)
|
|
254
|
+
throw new Error('Not a git repository — checkpoints unavailable.');
|
|
255
|
+
const all = await listCheckpoints(root);
|
|
256
|
+
if (all.length === 0)
|
|
257
|
+
throw new Error('No checkpoints exist for this repository.');
|
|
258
|
+
const target = id ? all.find(c => c.id === id) : all[0];
|
|
259
|
+
if (!target)
|
|
260
|
+
throw new Error(`Checkpoint not found: ${id}`);
|
|
261
|
+
// Snapshot "now" first — makes the restore itself undoable, and gives us
|
|
262
|
+
// the tree to diff against. createCheckpoint dedupes, so when the tree
|
|
263
|
+
// hasn't changed since the latest checkpoint we reuse that one's tree.
|
|
264
|
+
const preRestore = await createCheckpoint(root, `pre-restore (before restoring ${target.id})`);
|
|
265
|
+
const nowTree = preRestore?.tree ?? (await listCheckpoints(root))[0].tree;
|
|
266
|
+
if (nowTree === target.tree)
|
|
267
|
+
return { restored: [], deleted: [], preRestore };
|
|
268
|
+
// -z output: STATUS NUL path NUL … — statuses relative nowTree → target:
|
|
269
|
+
// A = exists only in the snapshot (write it back)
|
|
270
|
+
// D = exists only now (delete it)
|
|
271
|
+
// M/T = content/type differs (write it back)
|
|
272
|
+
const raw = await git(root, ['diff-tree', '-r', '-z', '--name-status', nowTree, target.tree]);
|
|
273
|
+
const parts = raw.split('\0').filter(p => p.length > 0);
|
|
274
|
+
const toWrite = [];
|
|
275
|
+
const toDelete = [];
|
|
276
|
+
for (let i = 0; i + 1 < parts.length; i += 2) {
|
|
277
|
+
const status = parts[i];
|
|
278
|
+
const file = parts[i + 1];
|
|
279
|
+
if (status === 'D')
|
|
280
|
+
toDelete.push(file);
|
|
281
|
+
else
|
|
282
|
+
toWrite.push(file);
|
|
283
|
+
}
|
|
284
|
+
for (const file of toDelete) {
|
|
285
|
+
try {
|
|
286
|
+
fs.rmSync(path.join(root, file), { force: true });
|
|
287
|
+
}
|
|
288
|
+
catch { /* best-effort */ }
|
|
289
|
+
}
|
|
290
|
+
if (toWrite.length > 0) {
|
|
291
|
+
const tmpIndex = path.join(gitDir, `aura-restore-index-${process.pid}`);
|
|
292
|
+
const env = { GIT_INDEX_FILE: tmpIndex };
|
|
293
|
+
try {
|
|
294
|
+
await git(root, ['read-tree', target.tree], env);
|
|
295
|
+
await git(root, ['checkout-index', '-f', '-z', '--stdin'], env, toWrite.join('\0') + '\0');
|
|
296
|
+
}
|
|
297
|
+
finally {
|
|
298
|
+
try {
|
|
299
|
+
fs.unlinkSync(tmpIndex);
|
|
300
|
+
}
|
|
301
|
+
catch { /* already gone */ }
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
return { restored: toWrite, deleted: toDelete, preRestore };
|
|
305
|
+
}
|
|
306
|
+
/** Delete all but the newest `keep` checkpoints. Returns how many were pruned. */
|
|
307
|
+
async function pruneCheckpoints(root, keep) {
|
|
308
|
+
const all = await listCheckpoints(root);
|
|
309
|
+
const stale = all.slice(Math.max(0, keep));
|
|
310
|
+
for (const cp of stale) {
|
|
311
|
+
await git(root, ['update-ref', '-d', cp.ref]);
|
|
312
|
+
}
|
|
313
|
+
return stale.length;
|
|
314
|
+
}
|
|
315
|
+
/** Delete a single checkpoint by id. */
|
|
316
|
+
async function deleteCheckpoint(root, id) {
|
|
317
|
+
const all = await listCheckpoints(root);
|
|
318
|
+
const cp = all.find(c => c.id === id);
|
|
319
|
+
if (!cp)
|
|
320
|
+
return false;
|
|
321
|
+
await git(root, ['update-ref', '-d', cp.ref]);
|
|
322
|
+
return true;
|
|
323
|
+
}
|
|
324
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/checkpoints/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface PaletteCommand {
|
|
2
|
+
id: string;
|
|
3
|
+
label: string;
|
|
4
|
+
description: string;
|
|
5
|
+
category: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* All commands available in the palette. Derived from help-data.ts
|
|
9
|
+
* but kept as a static list here to avoid circular imports.
|
|
10
|
+
*/
|
|
11
|
+
export declare const PALETTE_COMMANDS: PaletteCommand[];
|
|
12
|
+
/**
|
|
13
|
+
* Fuzzy-match a query against a command's label + id.
|
|
14
|
+
* Returns a score (lower = better match), or -1 for no match.
|
|
15
|
+
*/
|
|
16
|
+
export declare function fuzzyMatch(query: string, text: string): number;
|
|
17
|
+
/**
|
|
18
|
+
* Filter and sort commands by fuzzy match score.
|
|
19
|
+
*/
|
|
20
|
+
export declare function filterCommands(query: string): PaletteCommand[];
|
|
21
|
+
/**
|
|
22
|
+
* Render the palette overlay. Returns styled lines to draw.
|
|
23
|
+
* `selectedIdx` is the currently highlighted item.
|
|
24
|
+
* `maxVisible` controls how many items fit in the overlay.
|
|
25
|
+
*/
|
|
26
|
+
export declare function renderPalette(commands: PaletteCommand[], query: string, selectedIdx: number, maxVisible: number, width: number): string[];
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.PALETTE_COMMANDS = void 0;
|
|
7
|
+
exports.fuzzyMatch = fuzzyMatch;
|
|
8
|
+
exports.filterCommands = filterCommands;
|
|
9
|
+
exports.renderPalette = renderPalette;
|
|
10
|
+
/**
|
|
11
|
+
* Command palette — Ctrl+P opens a fuzzy-searchable list of all
|
|
12
|
+
* :commands. Inspired by OpenCode's Ctrl+P palette.
|
|
13
|
+
*
|
|
14
|
+
* Renders an overlay panel at the bottom of the screen (above the
|
|
15
|
+
* input box in bottom-input layout). User types to filter, arrow
|
|
16
|
+
* keys to navigate, Enter to execute, Esc to cancel.
|
|
17
|
+
*/
|
|
18
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
19
|
+
const diamond_js_1 = require("./diamond.js");
|
|
20
|
+
const TEXT = chalk_1.default.hex(diamond_js_1.TEXT_HEX);
|
|
21
|
+
const TEXT_DIM = chalk_1.default.hex(diamond_js_1.TEXT_DIM_HEX);
|
|
22
|
+
const RUBY = diamond_js_1.RUBY_ACCENT;
|
|
23
|
+
const HIGHLIGHT = chalk_1.default.hex('#cc785c');
|
|
24
|
+
/**
|
|
25
|
+
* All commands available in the palette. Derived from help-data.ts
|
|
26
|
+
* but kept as a static list here to avoid circular imports.
|
|
27
|
+
*/
|
|
28
|
+
exports.PALETTE_COMMANDS = [
|
|
29
|
+
// Session
|
|
30
|
+
{ id: ':id', label: 'Show session ID', description: 'Current chat ID', category: 'Session' },
|
|
31
|
+
{ id: ':sessions', label: 'List sessions', description: 'All saved sessions', category: 'Session' },
|
|
32
|
+
{ id: ':resume', label: 'Resume session', description: 'Resume latest session', category: 'Session' },
|
|
33
|
+
{ id: ':new', label: 'New session', description: 'Start fresh session', category: 'Session' },
|
|
34
|
+
{ id: ':history', label: 'Show history', description: 'Turn count in current session', category: 'Session' },
|
|
35
|
+
{ id: ':save', label: 'Save session', description: 'Rename/save current session', category: 'Session' },
|
|
36
|
+
// Model
|
|
37
|
+
{ id: ':model', label: 'Switch model', description: 'Interactive model selector', category: 'Model / API' },
|
|
38
|
+
{ id: ':models', label: 'List models', description: 'All available models', category: 'Model / API' },
|
|
39
|
+
{ id: ':provider', label: 'Provider wizard', description: 'Pick provider, model, key', category: 'Model / API' },
|
|
40
|
+
{ id: ':apikey', label: 'Set API key', description: 'Set API key for session', category: 'Model / API' },
|
|
41
|
+
// Workflows
|
|
42
|
+
{ id: ':workflows', label: 'List workflows', description: 'All saved workflows', category: 'Workflows' },
|
|
43
|
+
{ id: ':workflow', label: 'Create workflow', description: 'Multi-step workflow', category: 'Workflows' },
|
|
44
|
+
{ id: ':machina', label: 'Machina task', description: 'Self-verification + auto-retry', category: 'Workflows' },
|
|
45
|
+
{ id: ':council', label: 'Council', description: 'Parallel read-only specialists', category: 'Workflows' },
|
|
46
|
+
{ id: ':q add', label: 'Queue task', description: 'Enqueue a task', category: 'Workflows' },
|
|
47
|
+
{ id: ':q list', label: 'Queue list', description: 'List queued tasks', category: 'Workflows' },
|
|
48
|
+
// Memory
|
|
49
|
+
{ id: ':dream', label: 'Dream', description: 'Consolidate episodes', category: 'Memory' },
|
|
50
|
+
{ id: ':rem', label: 'Show memory', description: 'Reconciled memory', category: 'Memory' },
|
|
51
|
+
{ id: ':mine', label: 'Mine patterns', description: 'Mine episodes for patterns', category: 'Memory' },
|
|
52
|
+
{ id: ':research', label: 'Research', description: 'Multi-step research pass', category: 'Memory' },
|
|
53
|
+
{ id: ':btw', label: 'Side question', description: 'Quick read-only question', category: 'Memory' },
|
|
54
|
+
// Voice
|
|
55
|
+
{ id: ':speak', label: 'Toggle voice', description: 'Read replies aloud', category: 'Voice' },
|
|
56
|
+
// Safety
|
|
57
|
+
{ id: ':approve', label: 'Toggle auto-approve', description: 'Skip y/N prompts', category: 'Safety' },
|
|
58
|
+
// System
|
|
59
|
+
{ id: ':help', label: 'Help', description: 'Show all commands', category: 'System' },
|
|
60
|
+
{ id: ':q', label: 'Quit', description: 'Exit Aura', category: 'System' },
|
|
61
|
+
{ id: ':context', label: 'Context health', description: 'Token usage dashboard', category: 'System' },
|
|
62
|
+
{ id: ':doctor', label: 'Doctor', description: 'Run health checks', category: 'System' },
|
|
63
|
+
];
|
|
64
|
+
/**
|
|
65
|
+
* Fuzzy-match a query against a command's label + id.
|
|
66
|
+
* Returns a score (lower = better match), or -1 for no match.
|
|
67
|
+
*/
|
|
68
|
+
function fuzzyMatch(query, text) {
|
|
69
|
+
if (!query)
|
|
70
|
+
return 0;
|
|
71
|
+
const q = query.toLowerCase();
|
|
72
|
+
const t = text.toLowerCase();
|
|
73
|
+
// Exact substring match — best
|
|
74
|
+
const idx = t.indexOf(q);
|
|
75
|
+
if (idx >= 0)
|
|
76
|
+
return idx;
|
|
77
|
+
// Fuzzy: all chars of query appear in order in text
|
|
78
|
+
let qi = 0;
|
|
79
|
+
let score = 0;
|
|
80
|
+
let lastMatchPos = -1;
|
|
81
|
+
for (let ti = 0; ti < t.length && qi < q.length; ti++) {
|
|
82
|
+
if (t[ti] === q[qi]) {
|
|
83
|
+
score += lastMatchPos >= 0 ? (ti - lastMatchPos) : 0;
|
|
84
|
+
lastMatchPos = ti;
|
|
85
|
+
qi++;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return qi === q.length ? score + 100 : -1;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Filter and sort commands by fuzzy match score.
|
|
92
|
+
*/
|
|
93
|
+
function filterCommands(query) {
|
|
94
|
+
if (!query)
|
|
95
|
+
return exports.PALETTE_COMMANDS;
|
|
96
|
+
const scored = exports.PALETTE_COMMANDS.map(cmd => {
|
|
97
|
+
const score = fuzzyMatch(query, cmd.label + ' ' + cmd.id);
|
|
98
|
+
return { cmd, score };
|
|
99
|
+
}).filter(s => s.score >= 0);
|
|
100
|
+
scored.sort((a, b) => a.score - b.score);
|
|
101
|
+
return scored.map(s => s.cmd);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Render the palette overlay. Returns styled lines to draw.
|
|
105
|
+
* `selectedIdx` is the currently highlighted item.
|
|
106
|
+
* `maxVisible` controls how many items fit in the overlay.
|
|
107
|
+
*/
|
|
108
|
+
function renderPalette(commands, query, selectedIdx, maxVisible, width) {
|
|
109
|
+
const lines = [];
|
|
110
|
+
// Header
|
|
111
|
+
lines.push(TEXT_DIM(' ┌─ command palette ' + '─'.repeat(Math.max(0, width - 21)) + '┐'));
|
|
112
|
+
lines.push(TEXT_DIM(' │ ') + RUBY(query) + TEXT_DIM('_'.repeat(Math.max(0, width - query.length - 6)) + ' │'));
|
|
113
|
+
const visible = commands.slice(0, maxVisible);
|
|
114
|
+
const actualSelected = Math.min(selectedIdx, visible.length - 1);
|
|
115
|
+
for (let i = 0; i < visible.length; i++) {
|
|
116
|
+
const cmd = visible[i];
|
|
117
|
+
const isSelected = i === actualSelected;
|
|
118
|
+
const prefix = isSelected ? RUBY('▸ ') : ' ';
|
|
119
|
+
const label = isSelected ? HIGHLIGHT.bold(cmd.label) : TEXT(cmd.label);
|
|
120
|
+
const desc = TEXT_DIM(` ${cmd.description}`);
|
|
121
|
+
const cat = TEXT_DIM(` [${cmd.category}]`);
|
|
122
|
+
const content = `${prefix}${label}${desc}${cat}`;
|
|
123
|
+
const truncContent = content.length > width - 4
|
|
124
|
+
? content.slice(0, width - 5) + '…'
|
|
125
|
+
: content;
|
|
126
|
+
lines.push(TEXT_DIM(' │ ') + truncContent + TEXT_DIM(' │'));
|
|
127
|
+
}
|
|
128
|
+
// Footer
|
|
129
|
+
lines.push(TEXT_DIM(' └' + '─'.repeat(width - 4) + '┘'));
|
|
130
|
+
lines.push(TEXT_DIM(' ↑↓ navigate · Enter select · Esc cancel'));
|
|
131
|
+
return lines;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=command-palette.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-palette.js","sourceRoot":"","sources":["../../src/cli/command-palette.ts"],"names":[],"mappings":";;;;;;AAoEA,gCAsBC;AAKD,wCAUC;AAOD,sCAmCC;AAnJD;;;;;;;GAOG;AACH,kDAA0B;AAC1B,6CAAmE;AAEnE,MAAM,IAAI,GAAG,eAAK,CAAC,GAAG,CAAC,qBAAQ,CAAC,CAAC;AACjC,MAAM,QAAQ,GAAG,eAAK,CAAC,GAAG,CAAC,yBAAY,CAAC,CAAC;AACzC,MAAM,IAAI,GAAG,wBAAW,CAAC;AACzB,MAAM,SAAS,GAAG,eAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AASvC;;;GAGG;AACU,QAAA,gBAAgB,GAAqB;IAChD,UAAU;IACV,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,iBAAiB,EAAE,QAAQ,EAAE,SAAS,EAAE;IAC5F,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,oBAAoB,EAAE,QAAQ,EAAE,SAAS,EAAE;IACnG,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,uBAAuB,EAAE,QAAQ,EAAE,SAAS,EAAE;IACrG,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,qBAAqB,EAAE,QAAQ,EAAE,SAAS,EAAE;IAC7F,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,+BAA+B,EAAE,QAAQ,EAAE,SAAS,EAAE;IAC5G,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,6BAA6B,EAAE,QAAQ,EAAE,SAAS,EAAE;IACvG,QAAQ;IACR,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,4BAA4B,EAAE,QAAQ,EAAE,aAAa,EAAE;IAC3G,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,sBAAsB,EAAE,QAAQ,EAAE,aAAa,EAAE;IACrG,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,2BAA2B,EAAE,QAAQ,EAAE,aAAa,EAAE;IAChH,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,yBAAyB,EAAE,QAAQ,EAAE,aAAa,EAAE;IACxG,YAAY;IACZ,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,qBAAqB,EAAE,QAAQ,EAAE,WAAW,EAAE;IACxG,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,qBAAqB,EAAE,QAAQ,EAAE,WAAW,EAAE;IACxG,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,gCAAgC,EAAE,QAAQ,EAAE,WAAW,EAAE;IAC/G,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,gCAAgC,EAAE,QAAQ,EAAE,WAAW,EAAE;IAC1G,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,QAAQ,EAAE,WAAW,EAAE;IAC3F,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,QAAQ,EAAE,WAAW,EAAE;IAC/F,SAAS;IACT,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,QAAQ,EAAE,QAAQ,EAAE;IACzF,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,mBAAmB,EAAE,QAAQ,EAAE,QAAQ,EAAE;IAC1F,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,4BAA4B,EAAE,QAAQ,EAAE,QAAQ,EAAE;IACtG,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,0BAA0B,EAAE,QAAQ,EAAE,QAAQ,EAAE;IACnG,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,0BAA0B,EAAE,QAAQ,EAAE,QAAQ,EAAE;IACnG,QAAQ;IACR,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,oBAAoB,EAAE,QAAQ,EAAE,OAAO,EAAE;IAC7F,SAAS;IACT,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,qBAAqB,EAAE,WAAW,EAAE,kBAAkB,EAAE,QAAQ,EAAE,QAAQ,EAAE;IACrG,SAAS;IACT,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,mBAAmB,EAAE,QAAQ,EAAE,QAAQ,EAAE;IACpF,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE;IACzE,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,uBAAuB,EAAE,QAAQ,EAAE,QAAQ,EAAE;IACrG,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,mBAAmB,EAAE,QAAQ,EAAE,QAAQ,EAAE;CACzF,CAAC;AAEF;;;GAGG;AACH,SAAgB,UAAU,CAAC,KAAa,EAAE,IAAY;IACpD,IAAI,CAAC,KAAK;QAAE,OAAO,CAAC,CAAC;IACrB,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAE7B,+BAA+B;IAC/B,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,GAAG,CAAC;IAEzB,oDAAoD;IACpD,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC;IACtB,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,MAAM,IAAI,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;QACtD,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;YACpB,KAAK,IAAI,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACrD,YAAY,GAAG,EAAE,CAAC;YAClB,EAAE,EAAE,CAAC;QACP,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,KAAa;IAC1C,IAAI,CAAC,KAAK;QAAE,OAAO,wBAAgB,CAAC;IAEpC,MAAM,MAAM,GAAG,wBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;QACxC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1D,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;IAE7B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACzC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAChC,CAAC;AAED;;;;GAIG;AACH,SAAgB,aAAa,CAC3B,QAA0B,EAC1B,KAAa,EACb,WAAmB,EACnB,UAAkB,EAClB,KAAa;IAEb,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,SAAS;IACT,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,uBAAuB,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAC1F,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAEhH,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAC9C,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAEjE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,UAAU,GAAG,CAAC,KAAK,cAAc,CAAC;QACxC,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9C,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,GAAG,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,GAAG,EAAE,CAAC;QACjD,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,KAAK,GAAG,CAAC;YAC7C,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG;YACnC,CAAC,CAAC,OAAO,CAAC;QACZ,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,SAAS;IACT,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAC1D,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,2CAA2C,CAAC,CAAC,CAAC;IAElE,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { HistoryMessage } from '../providers/types.js';
|
|
2
|
+
export interface LargestMessage {
|
|
3
|
+
role: string;
|
|
4
|
+
preview: string;
|
|
5
|
+
tokens: number;
|
|
6
|
+
index: number;
|
|
7
|
+
}
|
|
8
|
+
export interface CompactionEvent {
|
|
9
|
+
turn: number;
|
|
10
|
+
beforeTokens: number;
|
|
11
|
+
afterTokens: number;
|
|
12
|
+
generation: number;
|
|
13
|
+
}
|
|
14
|
+
export interface ContextHealth {
|
|
15
|
+
estimatedTokens: number;
|
|
16
|
+
contextWindow: number;
|
|
17
|
+
usagePercent: number;
|
|
18
|
+
recapGeneration: number;
|
|
19
|
+
nextCompactionThreshold: number;
|
|
20
|
+
nextCompactionPercent: number;
|
|
21
|
+
tokensUntilCompaction: number;
|
|
22
|
+
rolloversRemaining: number;
|
|
23
|
+
totalInputTokens: number;
|
|
24
|
+
totalOutputTokens: number;
|
|
25
|
+
totalCostUsd: number;
|
|
26
|
+
turnCount: number;
|
|
27
|
+
toolCallCount: number;
|
|
28
|
+
compactionCount: number;
|
|
29
|
+
largestMessages: LargestMessage[];
|
|
30
|
+
compactionHistory: CompactionEvent[];
|
|
31
|
+
}
|
|
32
|
+
export declare class ContextHealthTracker {
|
|
33
|
+
private getSystem;
|
|
34
|
+
private getHistory;
|
|
35
|
+
private model;
|
|
36
|
+
private pricingModel;
|
|
37
|
+
private compactionEvents;
|
|
38
|
+
private _turnCount;
|
|
39
|
+
private _toolCallCount;
|
|
40
|
+
constructor(getSystem: () => string, getHistory: () => HistoryMessage[], model: string, pricingModel: string);
|
|
41
|
+
incrementTurn(): void;
|
|
42
|
+
incrementToolCalls(n?: number): void;
|
|
43
|
+
/** Replace the system-prompt source — used when a shared tracker is passed
|
|
44
|
+
* into the loop and the loop builds the real (task-embedded) system prompt. */
|
|
45
|
+
updateSystem(s: string): void;
|
|
46
|
+
recordCompaction(beforeTokens: number, afterTokens: number, generation: number): void;
|
|
47
|
+
snapshot(inputTokens?: number, outputTokens?: number): ContextHealth;
|
|
48
|
+
}
|
|
49
|
+
export declare function formatContextBar(h: ContextHealth): string;
|
|
50
|
+
export declare function formatContextDashboard(h: ContextHealth): string;
|
|
51
|
+
export declare function formatCompactionEvent(beforeTokens: number, afterTokens: number, generation: number, threshold: number): string;
|