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.
Files changed (265) hide show
  1. package/README.md +47 -164
  2. package/dist/agent/affect.d.ts +13 -0
  3. package/dist/agent/affect.js +34 -0
  4. package/dist/agent/affect.js.map +1 -0
  5. package/dist/agent/compactor.d.ts +27 -4
  6. package/dist/agent/compactor.js +185 -54
  7. package/dist/agent/compactor.js.map +1 -1
  8. package/dist/agent/confess.d.ts +35 -0
  9. package/dist/agent/confess.js +296 -0
  10. package/dist/agent/confess.js.map +1 -0
  11. package/dist/agent/context.d.ts +0 -4
  12. package/dist/agent/context.js +0 -38
  13. package/dist/agent/context.js.map +1 -1
  14. package/dist/agent/domain-expertise.d.ts +22 -0
  15. package/dist/agent/domain-expertise.js +110 -0
  16. package/dist/agent/domain-expertise.js.map +1 -0
  17. package/dist/agent/executive-queue.d.ts +26 -0
  18. package/dist/agent/executive-queue.js +50 -0
  19. package/dist/agent/executive-queue.js.map +1 -0
  20. package/dist/agent/generational-flush.d.ts +28 -0
  21. package/dist/agent/generational-flush.js +48 -0
  22. package/dist/agent/generational-flush.js.map +1 -0
  23. package/dist/agent/loop-profile.d.ts +50 -0
  24. package/dist/agent/loop-profile.js +88 -0
  25. package/dist/agent/loop-profile.js.map +1 -0
  26. package/dist/agent/loop.d.ts +14 -5
  27. package/dist/agent/loop.js +167 -39
  28. package/dist/agent/loop.js.map +1 -1
  29. package/dist/agent/memory-consolidate.d.ts +14 -0
  30. package/dist/agent/memory-consolidate.js +141 -0
  31. package/dist/agent/memory-consolidate.js.map +1 -0
  32. package/dist/agent/mixture.d.ts +33 -0
  33. package/dist/agent/mixture.js +138 -0
  34. package/dist/agent/mixture.js.map +1 -0
  35. package/dist/agent/spawner.js +2 -2
  36. package/dist/agent/spawner.js.map +1 -1
  37. package/dist/agent/system-prompt.d.ts +1 -1
  38. package/dist/agent/system-prompt.js +50 -22
  39. package/dist/agent/system-prompt.js.map +1 -1
  40. package/dist/agent/unified-memory.d.ts +15 -0
  41. package/dist/agent/unified-memory.js +164 -0
  42. package/dist/agent/unified-memory.js.map +1 -0
  43. package/dist/checkpoints/engine.d.ts +44 -0
  44. package/dist/checkpoints/engine.js +324 -0
  45. package/dist/checkpoints/engine.js.map +1 -0
  46. package/dist/cli/command-palette.d.ts +26 -0
  47. package/dist/cli/command-palette.js +133 -0
  48. package/dist/cli/command-palette.js.map +1 -0
  49. package/dist/cli/context-health.d.ts +51 -0
  50. package/dist/cli/context-health.js +187 -0
  51. package/dist/cli/context-health.js.map +1 -0
  52. package/dist/cli/diamond.d.ts +67 -0
  53. package/dist/cli/diamond.js +222 -12
  54. package/dist/cli/diamond.js.map +1 -1
  55. package/dist/cli/dic.d.ts +2 -0
  56. package/dist/cli/dic.js +106 -0
  57. package/dist/cli/dic.js.map +1 -0
  58. package/dist/cli/diff-view.d.ts +18 -0
  59. package/dist/cli/diff-view.js +114 -0
  60. package/dist/cli/diff-view.js.map +1 -0
  61. package/dist/cli/display.d.ts +18 -4
  62. package/dist/cli/display.js +74 -151
  63. package/dist/cli/display.js.map +1 -1
  64. package/dist/cli/help-data.d.ts +7 -0
  65. package/dist/cli/help-data.js +80 -0
  66. package/dist/cli/help-data.js.map +1 -0
  67. package/dist/cli/index.js +1002 -852
  68. package/dist/cli/index.js.map +1 -1
  69. package/dist/cli/markdown.d.ts +5 -0
  70. package/dist/cli/markdown.js +128 -0
  71. package/dist/cli/markdown.js.map +1 -0
  72. package/dist/cli/model-select.d.ts +39 -0
  73. package/dist/cli/model-select.js +65 -0
  74. package/dist/cli/model-select.js.map +1 -0
  75. package/dist/cli/tui.d.ts +34 -0
  76. package/dist/cli/tui.js +1176 -0
  77. package/dist/cli/tui.js.map +1 -0
  78. package/dist/config/defaults.d.ts +6 -17
  79. package/dist/config/defaults.js +25 -46
  80. package/dist/config/defaults.js.map +1 -1
  81. package/dist/config/project-config.d.ts +2 -6
  82. package/dist/config/project-config.js +2 -2
  83. package/dist/config/project-config.js.map +1 -1
  84. package/dist/doctor/checks.d.ts +18 -0
  85. package/dist/doctor/checks.js +524 -0
  86. package/dist/doctor/checks.js.map +1 -0
  87. package/dist/doctor/index.d.ts +4 -0
  88. package/dist/doctor/index.js +229 -0
  89. package/dist/doctor/index.js.map +1 -0
  90. package/dist/doctor/repair.d.ts +19 -0
  91. package/dist/doctor/repair.js +126 -0
  92. package/dist/doctor/repair.js.map +1 -0
  93. package/dist/doctor/types.d.ts +38 -0
  94. package/dist/doctor/types.js +10 -0
  95. package/dist/doctor/types.js.map +1 -0
  96. package/dist/dream/dream.d.ts +79 -59
  97. package/dist/dream/dream.js +324 -144
  98. package/dist/dream/dream.js.map +1 -1
  99. package/dist/dream/episode.d.ts +17 -0
  100. package/dist/dream/episode.js +116 -0
  101. package/dist/dream/episode.js.map +1 -0
  102. package/dist/kanban/engine.d.ts +26 -0
  103. package/dist/kanban/engine.js +208 -0
  104. package/dist/kanban/engine.js.map +1 -0
  105. package/dist/kanban/types.d.ts +19 -0
  106. package/dist/kanban/types.js +9 -1
  107. package/dist/kanban/types.js.map +1 -1
  108. package/dist/machina/render-html.js +4 -2
  109. package/dist/machina/render-html.js.map +1 -1
  110. package/dist/machina/render-terminal.js +11 -4
  111. package/dist/machina/render-terminal.js.map +1 -1
  112. package/dist/machina/repair.d.ts +23 -0
  113. package/dist/machina/repair.js +98 -0
  114. package/dist/machina/repair.js.map +1 -0
  115. package/dist/machina/spec.js +12 -12
  116. package/dist/machina/spec.js.map +1 -1
  117. package/dist/machina/verify.d.ts +13 -1
  118. package/dist/machina/verify.js +12 -2
  119. package/dist/machina/verify.js.map +1 -1
  120. package/dist/mining/extract.d.ts +34 -0
  121. package/dist/mining/extract.js +229 -0
  122. package/dist/mining/extract.js.map +1 -0
  123. package/dist/mining/refine.d.ts +28 -0
  124. package/dist/mining/refine.js +256 -0
  125. package/dist/mining/refine.js.map +1 -0
  126. package/dist/perception/extractor.js +5 -3
  127. package/dist/perception/extractor.js.map +1 -1
  128. package/dist/perception/graph-store.d.ts +0 -11
  129. package/dist/perception/graph-store.js +0 -33
  130. package/dist/perception/graph-store.js.map +1 -1
  131. package/dist/perception/index.d.ts +1 -1
  132. package/dist/perception/index.js +1 -2
  133. package/dist/perception/index.js.map +1 -1
  134. package/dist/plugins/commands.d.ts +38 -0
  135. package/dist/plugins/commands.js +134 -0
  136. package/dist/plugins/commands.js.map +1 -0
  137. package/dist/plugins/frontmatter.d.ts +14 -0
  138. package/dist/plugins/frontmatter.js +78 -0
  139. package/dist/plugins/frontmatter.js.map +1 -0
  140. package/dist/plugins/hooks.d.ts +12 -0
  141. package/dist/plugins/hooks.js +148 -0
  142. package/dist/plugins/hooks.js.map +1 -0
  143. package/dist/plugins/loader.d.ts +7 -0
  144. package/dist/plugins/loader.js +255 -0
  145. package/dist/plugins/loader.js.map +1 -0
  146. package/dist/plugins/market.d.ts +23 -0
  147. package/dist/plugins/market.js +281 -0
  148. package/dist/plugins/market.js.map +1 -0
  149. package/dist/plugins/types.d.ts +90 -0
  150. package/dist/plugins/types.js +20 -0
  151. package/dist/plugins/types.js.map +1 -0
  152. package/dist/providers/anthropic-oauth-draft.d.ts +119 -0
  153. package/dist/providers/anthropic-oauth-draft.js +414 -0
  154. package/dist/providers/anthropic-oauth-draft.js.map +1 -0
  155. package/dist/providers/anthropic.d.ts +4 -1
  156. package/dist/providers/anthropic.js +35 -7
  157. package/dist/providers/anthropic.js.map +1 -1
  158. package/dist/providers/factory.d.ts +43 -19
  159. package/dist/providers/factory.js +183 -129
  160. package/dist/providers/factory.js.map +1 -1
  161. package/dist/providers/google.js +9 -22
  162. package/dist/providers/google.js.map +1 -1
  163. package/dist/providers/live-models.d.ts +23 -0
  164. package/dist/providers/live-models.js +145 -0
  165. package/dist/providers/live-models.js.map +1 -0
  166. package/dist/providers/openai-compatible.d.ts +1 -12
  167. package/dist/providers/openai-compatible.js +71 -108
  168. package/dist/providers/openai-compatible.js.map +1 -1
  169. package/dist/providers/resilient-factory.js +1 -1
  170. package/dist/providers/resilient-factory.js.map +1 -1
  171. package/dist/repl/queue.d.ts +22 -0
  172. package/dist/repl/queue.js +165 -0
  173. package/dist/repl/queue.js.map +1 -0
  174. package/dist/repl/side-channel.d.ts +23 -0
  175. package/dist/repl/side-channel.js +63 -0
  176. package/dist/repl/side-channel.js.map +1 -0
  177. package/dist/research/council.d.ts +2 -0
  178. package/dist/research/council.js +29 -4
  179. package/dist/research/council.js.map +1 -1
  180. package/dist/ruby/alternator.d.ts +11 -30
  181. package/dist/ruby/alternator.js +59 -38
  182. package/dist/ruby/alternator.js.map +1 -1
  183. package/dist/ruby/episode-capture.d.ts +0 -10
  184. package/dist/ruby/episode-capture.js +0 -33
  185. package/dist/ruby/episode-capture.js.map +1 -1
  186. package/dist/ruby/types.js +1 -1
  187. package/dist/ruby/types.js.map +1 -1
  188. package/dist/safety/path-jail.d.ts +17 -0
  189. package/dist/safety/path-jail.js +100 -0
  190. package/dist/safety/path-jail.js.map +1 -0
  191. package/dist/safety/permissions.d.ts +12 -21
  192. package/dist/safety/permissions.js +81 -216
  193. package/dist/safety/permissions.js.map +1 -1
  194. package/dist/safety/ssrf.d.ts +29 -0
  195. package/dist/safety/ssrf.js +185 -0
  196. package/dist/safety/ssrf.js.map +1 -0
  197. package/dist/server/index.js +64 -10
  198. package/dist/server/index.js.map +1 -1
  199. package/dist/setup/first-run.d.ts +0 -24
  200. package/dist/setup/first-run.js +10 -344
  201. package/dist/setup/first-run.js.map +1 -1
  202. package/dist/setup/key-store.d.ts +12 -0
  203. package/dist/setup/key-store.js +108 -0
  204. package/dist/setup/key-store.js.map +1 -0
  205. package/dist/setup/provider-registry.js +31 -18
  206. package/dist/setup/provider-registry.js.map +1 -1
  207. package/dist/setup/provider-test.d.ts +7 -0
  208. package/dist/setup/provider-test.js +73 -10
  209. package/dist/setup/provider-test.js.map +1 -1
  210. package/dist/setup/provider-wizard.d.ts +4 -1
  211. package/dist/setup/provider-wizard.js +92 -26
  212. package/dist/setup/provider-wizard.js.map +1 -1
  213. package/dist/setup/xiaomi.d.ts +1 -1
  214. package/dist/setup/xiaomi.js +3 -3
  215. package/dist/setup/xiaomi.js.map +1 -1
  216. package/dist/tools/browser.js +14 -10
  217. package/dist/tools/browser.js.map +1 -1
  218. package/dist/tools/clipboard.js +7 -1
  219. package/dist/tools/clipboard.js.map +1 -1
  220. package/dist/tools/dictate.d.ts +60 -0
  221. package/dist/tools/dictate.js +983 -0
  222. package/dist/tools/dictate.js.map +1 -0
  223. package/dist/tools/dictate_patched.js +1057 -0
  224. package/dist/tools/edit-file.js +10 -2
  225. package/dist/tools/edit-file.js.map +1 -1
  226. package/dist/tools/http-request.js +14 -4
  227. package/dist/tools/http-request.js.map +1 -1
  228. package/dist/tools/image-read.js +34 -2
  229. package/dist/tools/image-read.js.map +1 -1
  230. package/dist/tools/index.d.ts +16 -1
  231. package/dist/tools/index.js +59 -8
  232. package/dist/tools/index.js.map +1 -1
  233. package/dist/tools/mcp.js +12 -0
  234. package/dist/tools/mcp.js.map +1 -1
  235. package/dist/tools/read-file.js +10 -14
  236. package/dist/tools/read-file.js.map +1 -1
  237. package/dist/tools/telegram-audio-policy.d.ts +30 -0
  238. package/dist/tools/telegram-audio-policy.js +49 -0
  239. package/dist/tools/telegram-audio-policy.js.map +1 -0
  240. package/dist/tools/telegram-bot.js +1136 -537
  241. package/dist/tools/telegram-bot.js.map +1 -1
  242. package/dist/tools/telegram-voice.d.ts +18 -5
  243. package/dist/tools/telegram-voice.js +54 -12
  244. package/dist/tools/telegram-voice.js.map +1 -1
  245. package/dist/tools/telegram.d.ts +3 -3
  246. package/dist/tools/telegram.js +5 -84
  247. package/dist/tools/telegram.js.map +1 -1
  248. package/dist/tools/tools.d.ts +2 -14
  249. package/dist/tools/tools.js +79 -144
  250. package/dist/tools/tools.js.map +1 -1
  251. package/dist/tools/web-fetch.js +39 -7
  252. package/dist/tools/web-fetch.js.map +1 -1
  253. package/dist/tools/web-search.d.ts +0 -20
  254. package/dist/tools/web-search.js +40 -137
  255. package/dist/tools/web-search.js.map +1 -1
  256. package/dist/util/errors.js +1 -15
  257. package/dist/util/errors.js.map +1 -1
  258. package/dist/util/json-repair.d.ts +11 -0
  259. package/dist/util/json-repair.js +31 -0
  260. package/dist/util/json-repair.js.map +1 -0
  261. package/dist/util/rate-limiter.js +2 -8
  262. package/dist/util/rate-limiter.js.map +1 -1
  263. package/dist/viz/index.js +793 -792
  264. package/dist/viz/index.js.map +1 -1
  265. 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":"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"}
@@ -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;