aura-code 0.5.0 → 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 (294) 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/domain-expertise.d.ts +22 -0
  12. package/dist/agent/domain-expertise.js +110 -0
  13. package/dist/agent/domain-expertise.js.map +1 -0
  14. package/dist/agent/executive-queue.d.ts +26 -0
  15. package/dist/agent/executive-queue.js +50 -0
  16. package/dist/agent/executive-queue.js.map +1 -0
  17. package/dist/agent/generational-flush.d.ts +28 -0
  18. package/dist/agent/generational-flush.js +48 -0
  19. package/dist/agent/generational-flush.js.map +1 -0
  20. package/dist/agent/loop-profile.d.ts +50 -0
  21. package/dist/agent/loop-profile.js +88 -0
  22. package/dist/agent/loop-profile.js.map +1 -0
  23. package/dist/agent/loop.d.ts +14 -5
  24. package/dist/agent/loop.js +167 -23
  25. package/dist/agent/loop.js.map +1 -1
  26. package/dist/agent/memory-consolidate.d.ts +14 -0
  27. package/dist/agent/memory-consolidate.js +141 -0
  28. package/dist/agent/memory-consolidate.js.map +1 -0
  29. package/dist/agent/mixture.d.ts +33 -0
  30. package/dist/agent/mixture.js +138 -0
  31. package/dist/agent/mixture.js.map +1 -0
  32. package/dist/agent/spawner.js +2 -2
  33. package/dist/agent/spawner.js.map +1 -1
  34. package/dist/agent/system-prompt.d.ts +1 -1
  35. package/dist/agent/system-prompt.js +49 -13
  36. package/dist/agent/system-prompt.js.map +1 -1
  37. package/dist/agent/unified-memory.d.ts +15 -0
  38. package/dist/agent/unified-memory.js +164 -0
  39. package/dist/agent/unified-memory.js.map +1 -0
  40. package/dist/checkpoints/engine.d.ts +44 -0
  41. package/dist/checkpoints/engine.js +324 -0
  42. package/dist/checkpoints/engine.js.map +1 -0
  43. package/dist/cli/command-palette.d.ts +26 -0
  44. package/dist/cli/command-palette.js +133 -0
  45. package/dist/cli/command-palette.js.map +1 -0
  46. package/dist/cli/context-health.d.ts +51 -0
  47. package/dist/cli/context-health.js +187 -0
  48. package/dist/cli/context-health.js.map +1 -0
  49. package/dist/cli/diamond.d.ts +67 -0
  50. package/dist/cli/diamond.js +222 -12
  51. package/dist/cli/diamond.js.map +1 -1
  52. package/dist/cli/dic.d.ts +2 -0
  53. package/dist/cli/dic.js +106 -0
  54. package/dist/cli/dic.js.map +1 -0
  55. package/dist/cli/diff-view.d.ts +18 -0
  56. package/dist/cli/diff-view.js +114 -0
  57. package/dist/cli/diff-view.js.map +1 -0
  58. package/dist/cli/display.d.ts +18 -4
  59. package/dist/cli/display.js +74 -146
  60. package/dist/cli/display.js.map +1 -1
  61. package/dist/cli/help-data.d.ts +7 -0
  62. package/dist/cli/help-data.js +80 -0
  63. package/dist/cli/help-data.js.map +1 -0
  64. package/dist/cli/index.js +1001 -788
  65. package/dist/cli/index.js.map +1 -1
  66. package/dist/cli/markdown.d.ts +5 -0
  67. package/dist/cli/markdown.js +128 -0
  68. package/dist/cli/markdown.js.map +1 -0
  69. package/dist/cli/model-select.d.ts +39 -0
  70. package/dist/cli/model-select.js +65 -0
  71. package/dist/cli/model-select.js.map +1 -0
  72. package/dist/cli/tui.d.ts +34 -0
  73. package/dist/cli/tui.js +1176 -0
  74. package/dist/cli/tui.js.map +1 -0
  75. package/dist/config/defaults.d.ts +6 -17
  76. package/dist/config/defaults.js +25 -39
  77. package/dist/config/defaults.js.map +1 -1
  78. package/dist/config/project-config.d.ts +2 -6
  79. package/dist/config/project-config.js +2 -2
  80. package/dist/config/project-config.js.map +1 -1
  81. package/dist/doctor/checks.d.ts +18 -0
  82. package/dist/doctor/checks.js +524 -0
  83. package/dist/doctor/checks.js.map +1 -0
  84. package/dist/doctor/index.d.ts +4 -0
  85. package/dist/doctor/index.js +229 -0
  86. package/dist/doctor/index.js.map +1 -0
  87. package/dist/doctor/repair.d.ts +19 -0
  88. package/dist/doctor/repair.js +126 -0
  89. package/dist/doctor/repair.js.map +1 -0
  90. package/dist/doctor/types.d.ts +38 -0
  91. package/dist/doctor/types.js +10 -0
  92. package/dist/doctor/types.js.map +1 -0
  93. package/dist/dream/dream.d.ts +79 -36
  94. package/dist/dream/dream.js +327 -117
  95. package/dist/dream/dream.js.map +1 -1
  96. package/dist/dream/episode.d.ts +17 -0
  97. package/dist/dream/episode.js +116 -0
  98. package/dist/dream/episode.js.map +1 -0
  99. package/dist/dream/okf.d.ts +10 -0
  100. package/dist/dream/okf.js +280 -0
  101. package/dist/dream/okf.js.map +1 -0
  102. package/dist/dream/parser.d.ts +60 -0
  103. package/dist/dream/parser.js +176 -0
  104. package/dist/dream/parser.js.map +1 -0
  105. package/dist/dream/reconcile.d.ts +69 -0
  106. package/dist/dream/reconcile.js +303 -0
  107. package/dist/dream/reconcile.js.map +1 -0
  108. package/dist/kanban/engine.d.ts +26 -0
  109. package/dist/kanban/engine.js +208 -0
  110. package/dist/kanban/engine.js.map +1 -0
  111. package/dist/kanban/types.d.ts +19 -0
  112. package/dist/kanban/types.js +9 -1
  113. package/dist/kanban/types.js.map +1 -1
  114. package/dist/machina/index.d.ts +16 -0
  115. package/dist/machina/index.js +61 -0
  116. package/dist/machina/index.js.map +1 -0
  117. package/dist/machina/render-html.d.ts +2 -0
  118. package/dist/machina/render-html.js +191 -0
  119. package/dist/machina/render-html.js.map +1 -0
  120. package/dist/machina/render-terminal.d.ts +2 -0
  121. package/dist/machina/render-terminal.js +99 -0
  122. package/dist/machina/render-terminal.js.map +1 -0
  123. package/dist/machina/repair.d.ts +23 -0
  124. package/dist/machina/repair.js +98 -0
  125. package/dist/machina/repair.js.map +1 -0
  126. package/dist/machina/spec.d.ts +61 -0
  127. package/dist/machina/spec.js +124 -0
  128. package/dist/machina/spec.js.map +1 -0
  129. package/dist/machina/verify.d.ts +39 -0
  130. package/dist/machina/verify.js +95 -0
  131. package/dist/machina/verify.js.map +1 -0
  132. package/dist/mining/extract.d.ts +34 -0
  133. package/dist/mining/extract.js +229 -0
  134. package/dist/mining/extract.js.map +1 -0
  135. package/dist/mining/refine.d.ts +28 -0
  136. package/dist/mining/refine.js +256 -0
  137. package/dist/mining/refine.js.map +1 -0
  138. package/dist/perception/extractor.js +5 -3
  139. package/dist/perception/extractor.js.map +1 -1
  140. package/dist/perception/graph-store.d.ts +0 -11
  141. package/dist/perception/graph-store.js +0 -33
  142. package/dist/perception/graph-store.js.map +1 -1
  143. package/dist/perception/index.d.ts +1 -1
  144. package/dist/perception/index.js +1 -2
  145. package/dist/perception/index.js.map +1 -1
  146. package/dist/plugins/commands.d.ts +38 -0
  147. package/dist/plugins/commands.js +134 -0
  148. package/dist/plugins/commands.js.map +1 -0
  149. package/dist/plugins/frontmatter.d.ts +14 -0
  150. package/dist/plugins/frontmatter.js +78 -0
  151. package/dist/plugins/frontmatter.js.map +1 -0
  152. package/dist/plugins/hooks.d.ts +12 -0
  153. package/dist/plugins/hooks.js +148 -0
  154. package/dist/plugins/hooks.js.map +1 -0
  155. package/dist/plugins/loader.d.ts +7 -0
  156. package/dist/plugins/loader.js +255 -0
  157. package/dist/plugins/loader.js.map +1 -0
  158. package/dist/plugins/market.d.ts +23 -0
  159. package/dist/plugins/market.js +281 -0
  160. package/dist/plugins/market.js.map +1 -0
  161. package/dist/plugins/types.d.ts +90 -0
  162. package/dist/plugins/types.js +20 -0
  163. package/dist/plugins/types.js.map +1 -0
  164. package/dist/providers/anthropic-oauth-draft.d.ts +119 -0
  165. package/dist/providers/anthropic-oauth-draft.js +414 -0
  166. package/dist/providers/anthropic-oauth-draft.js.map +1 -0
  167. package/dist/providers/anthropic.d.ts +4 -1
  168. package/dist/providers/anthropic.js +34 -6
  169. package/dist/providers/anthropic.js.map +1 -1
  170. package/dist/providers/factory.d.ts +71 -14
  171. package/dist/providers/factory.js +205 -124
  172. package/dist/providers/factory.js.map +1 -1
  173. package/dist/providers/google.js +8 -21
  174. package/dist/providers/google.js.map +1 -1
  175. package/dist/providers/live-models.d.ts +23 -0
  176. package/dist/providers/live-models.js +145 -0
  177. package/dist/providers/live-models.js.map +1 -0
  178. package/dist/providers/openai-compatible.d.ts +1 -12
  179. package/dist/providers/openai-compatible.js +71 -108
  180. package/dist/providers/openai-compatible.js.map +1 -1
  181. package/dist/providers/resilient-factory.js +1 -1
  182. package/dist/providers/resilient-factory.js.map +1 -1
  183. package/dist/rem/graph.d.ts +72 -0
  184. package/dist/rem/graph.js +139 -0
  185. package/dist/rem/graph.js.map +1 -0
  186. package/dist/rem/index.d.ts +16 -0
  187. package/dist/rem/index.js +60 -0
  188. package/dist/rem/index.js.map +1 -0
  189. package/dist/rem/render-html.d.ts +2 -0
  190. package/dist/rem/render-html.js +189 -0
  191. package/dist/rem/render-html.js.map +1 -0
  192. package/dist/rem/render-terminal.d.ts +4 -0
  193. package/dist/rem/render-terminal.js +94 -0
  194. package/dist/rem/render-terminal.js.map +1 -0
  195. package/dist/repl/queue.d.ts +22 -0
  196. package/dist/repl/queue.js +165 -0
  197. package/dist/repl/queue.js.map +1 -0
  198. package/dist/repl/side-channel.d.ts +23 -0
  199. package/dist/repl/side-channel.js +63 -0
  200. package/dist/repl/side-channel.js.map +1 -0
  201. package/dist/research/council.d.ts +5 -2
  202. package/dist/research/council.js +73 -10
  203. package/dist/research/council.js.map +1 -1
  204. package/dist/ruby/alternator.d.ts +11 -30
  205. package/dist/ruby/alternator.js +59 -38
  206. package/dist/ruby/alternator.js.map +1 -1
  207. package/dist/ruby/episode-capture.d.ts +0 -10
  208. package/dist/ruby/episode-capture.js +0 -33
  209. package/dist/ruby/episode-capture.js.map +1 -1
  210. package/dist/ruby/types.js +1 -1
  211. package/dist/ruby/types.js.map +1 -1
  212. package/dist/safety/path-jail.d.ts +17 -0
  213. package/dist/safety/path-jail.js +100 -0
  214. package/dist/safety/path-jail.js.map +1 -0
  215. package/dist/safety/permissions.d.ts +12 -21
  216. package/dist/safety/permissions.js +81 -216
  217. package/dist/safety/permissions.js.map +1 -1
  218. package/dist/safety/ssrf.d.ts +29 -0
  219. package/dist/safety/ssrf.js +185 -0
  220. package/dist/safety/ssrf.js.map +1 -0
  221. package/dist/server/index.js +64 -10
  222. package/dist/server/index.js.map +1 -1
  223. package/dist/setup/first-run.d.ts +0 -24
  224. package/dist/setup/first-run.js +10 -344
  225. package/dist/setup/first-run.js.map +1 -1
  226. package/dist/setup/key-store.d.ts +12 -0
  227. package/dist/setup/key-store.js +108 -0
  228. package/dist/setup/key-store.js.map +1 -0
  229. package/dist/setup/provider-registry.js +31 -18
  230. package/dist/setup/provider-registry.js.map +1 -1
  231. package/dist/setup/provider-test.d.ts +7 -0
  232. package/dist/setup/provider-test.js +73 -10
  233. package/dist/setup/provider-test.js.map +1 -1
  234. package/dist/setup/provider-wizard.d.ts +4 -1
  235. package/dist/setup/provider-wizard.js +92 -26
  236. package/dist/setup/provider-wizard.js.map +1 -1
  237. package/dist/setup/xiaomi.d.ts +1 -1
  238. package/dist/setup/xiaomi.js +3 -3
  239. package/dist/setup/xiaomi.js.map +1 -1
  240. package/dist/tools/browser.js +6 -4
  241. package/dist/tools/browser.js.map +1 -1
  242. package/dist/tools/clipboard.js +7 -1
  243. package/dist/tools/clipboard.js.map +1 -1
  244. package/dist/tools/dictate.d.ts +60 -0
  245. package/dist/tools/dictate.js +983 -0
  246. package/dist/tools/dictate.js.map +1 -0
  247. package/dist/tools/dictate_patched.js +1057 -0
  248. package/dist/tools/edit-file.js +10 -2
  249. package/dist/tools/edit-file.js.map +1 -1
  250. package/dist/tools/gmail-tool.d.ts +5 -1
  251. package/dist/tools/gmail-tool.js +151 -11
  252. package/dist/tools/gmail-tool.js.map +1 -1
  253. package/dist/tools/http-request.js +14 -4
  254. package/dist/tools/http-request.js.map +1 -1
  255. package/dist/tools/image-read.js +34 -2
  256. package/dist/tools/image-read.js.map +1 -1
  257. package/dist/tools/index.d.ts +16 -1
  258. package/dist/tools/index.js +59 -8
  259. package/dist/tools/index.js.map +1 -1
  260. package/dist/tools/mcp.js +12 -0
  261. package/dist/tools/mcp.js.map +1 -1
  262. package/dist/tools/read-file.js +10 -14
  263. package/dist/tools/read-file.js.map +1 -1
  264. package/dist/tools/telegram-audio-policy.d.ts +30 -0
  265. package/dist/tools/telegram-audio-policy.js +49 -0
  266. package/dist/tools/telegram-audio-policy.js.map +1 -0
  267. package/dist/tools/telegram-bot.js +1136 -539
  268. package/dist/tools/telegram-bot.js.map +1 -1
  269. package/dist/tools/telegram-voice.d.ts +18 -5
  270. package/dist/tools/telegram-voice.js +54 -12
  271. package/dist/tools/telegram-voice.js.map +1 -1
  272. package/dist/tools/telegram.d.ts +3 -3
  273. package/dist/tools/telegram.js +5 -84
  274. package/dist/tools/telegram.js.map +1 -1
  275. package/dist/tools/tools.d.ts +2 -14
  276. package/dist/tools/tools.js +79 -144
  277. package/dist/tools/tools.js.map +1 -1
  278. package/dist/tools/web-fetch.js +39 -7
  279. package/dist/tools/web-fetch.js.map +1 -1
  280. package/dist/tools/web-search.js +2 -3
  281. package/dist/tools/web-search.js.map +1 -1
  282. package/dist/util/errors.js +1 -15
  283. package/dist/util/errors.js.map +1 -1
  284. package/dist/util/json-repair.d.ts +11 -0
  285. package/dist/util/json-repair.js +31 -0
  286. package/dist/util/json-repair.js.map +1 -0
  287. package/dist/util/rate-limiter.js +2 -8
  288. package/dist/util/rate-limiter.js.map +1 -1
  289. package/dist/viz/index.js +793 -792
  290. package/dist/viz/index.js.map +1 -1
  291. package/dist/viz/reader.d.ts +33 -0
  292. package/dist/viz/reader.js +343 -0
  293. package/dist/viz/reader.js.map +1 -0
  294. package/package.json +13 -32
@@ -7,6 +7,19 @@ const loop_js_1 = require("../agent/loop.js");
7
7
  const permissions_js_1 = require("../safety/permissions.js");
8
8
  const competence_js_1 = require("./competence.js");
9
9
  const episode_capture_js_1 = require("./episode-capture.js");
10
+ /** Inert LoopResult for the both-paths-failed case — run() never throws. */
11
+ function emptyLoopResult(summary) {
12
+ return {
13
+ success: false,
14
+ summary,
15
+ turns: 0,
16
+ toolCallCount: 0,
17
+ usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },
18
+ costUsd: 0,
19
+ history: [],
20
+ toolCallLog: [],
21
+ };
22
+ }
10
23
  const RECENT_EPISODE_LIMIT = 50;
11
24
  const OLLAMA_PING_MS = 3_000;
12
25
  // ─────────────────────────────────────────────────────────────────────────────
@@ -29,6 +42,9 @@ function createNoopDisplay() {
29
42
  showPlan: () => { },
30
43
  stepStarted: () => { },
31
44
  stepCompleted: () => { },
45
+ contextBar: () => { },
46
+ contextDashboard: () => { },
47
+ compactionEvent: () => { },
32
48
  };
33
49
  }
34
50
  // ─────────────────────────────────────────────────────────────────────────────
@@ -101,7 +117,6 @@ class RubyAlternator {
101
117
  async run(task) {
102
118
  const startMs = Date.now();
103
119
  const { rubyConfig, largeModelProvider, projectRoot, context } = this.opts;
104
- const confirmFn = this.opts.confirmFn;
105
120
  let decision = {
106
121
  useRuby: false,
107
122
  reason: 'Initializing alternation.',
@@ -110,12 +125,13 @@ class RubyAlternator {
110
125
  };
111
126
  let rubyAttempted = false;
112
127
  let rubySucceeded = false;
113
- let rubyLoopResult;
114
- let largeModelLoopResult;
128
+ let rubyOutput;
129
+ let rubyTokens = 0;
130
+ let largeModelOutput;
131
+ let largeModelTokens = 0;
115
132
  let usedRuby = false;
116
- // Only used to build the error-path fallback LoopResult below; the
117
- // success paths read everything from rubyLoopResult/largeModelLoopResult.
118
- let errorSummary;
133
+ let result = '';
134
+ let finalLoopResult;
119
135
  try {
120
136
  const recent = await episode_capture_js_1.episodeStore.loadEpisodes(projectRoot, RECENT_EPISODE_LIMIT);
121
137
  decision = (0, competence_js_1.assessCompetence)(recent, task, rubyConfig);
@@ -131,20 +147,24 @@ class RubyAlternator {
131
147
  this.display.success(`Trying Ruby (${rubyConfig.modelName})…`);
132
148
  try {
133
149
  const rubyProvider = buildRubyProvider(rubyConfig);
134
- rubyLoopResult = await (0, loop_js_1.runAgentLoop)({
150
+ const loopResult = await (0, loop_js_1.runAgentLoop)({
135
151
  provider: rubyProvider,
136
152
  task,
137
153
  context,
138
154
  permissions: this.permissions,
139
155
  display: this.display,
140
- confirmFn,
141
- initialHistory: this.opts.initialHistory,
142
156
  disableSpawn: true,
143
157
  maxTurns: 15,
158
+ confirmFn: this.opts.confirmFn,
159
+ initialHistory: this.opts.initialHistory,
144
160
  });
145
- if (isNonEmptyResult(rubyLoopResult.summary) && rubyLoopResult.success) {
161
+ rubyTokens = loopResult.usage.totalTokens;
162
+ rubyOutput = loopResult.summary;
163
+ if (isNonEmptyResult(rubyOutput) && loopResult.success) {
146
164
  rubySucceeded = true;
147
165
  usedRuby = true;
166
+ result = rubyOutput;
167
+ finalLoopResult = loopResult;
148
168
  this.display.success('Ruby handled the task without escalation.');
149
169
  }
150
170
  else {
@@ -153,48 +173,43 @@ class RubyAlternator {
153
173
  }
154
174
  catch (e) {
155
175
  this.display.warning(`Ruby error: ${String(e)} — escalating.`);
176
+ rubyOutput = rubyOutput ?? `Error: ${String(e)}`;
156
177
  }
157
178
  }
158
179
  }
159
180
  if (!usedRuby) {
160
181
  this.display.header('Large model', largeModelProvider.name);
161
182
  try {
162
- largeModelLoopResult = await (0, loop_js_1.runAgentLoop)({
183
+ const loopResult = await (0, loop_js_1.runAgentLoop)({
163
184
  provider: largeModelProvider,
164
185
  task,
165
186
  context,
166
187
  permissions: this.permissions,
167
188
  display: this.display,
168
- confirmFn,
169
- initialHistory: this.opts.initialHistory,
170
189
  disableSpawn: true,
190
+ confirmFn: this.opts.confirmFn,
191
+ initialHistory: this.opts.initialHistory,
171
192
  });
193
+ largeModelTokens = loopResult.usage.totalTokens;
194
+ largeModelOutput = loopResult.summary;
195
+ finalLoopResult = loopResult;
196
+ result = isNonEmptyResult(largeModelOutput)
197
+ ? largeModelOutput
198
+ : loopResult.success
199
+ ? '(Task completed with no output)'
200
+ : `Large model did not complete: ${loopResult.summary}`;
172
201
  }
173
202
  catch (e) {
174
- errorSummary = `Large model error: ${String(e)}`;
175
- this.display.error(errorSummary);
203
+ result = `Large model error: ${String(e)}`;
204
+ largeModelOutput = result;
205
+ this.display.error(result);
176
206
  }
177
207
  }
178
208
  }
179
209
  catch (e) {
180
- errorSummary = `Alternation error: ${String(e)}`;
181
- this.display.error(errorSummary);
210
+ result = `Alternation error: ${String(e)}`;
211
+ this.display.error(result);
182
212
  }
183
- // The full result that actually represents this run's output — Ruby's
184
- // if it succeeded, otherwise the large model's, otherwise a safe empty
185
- // result for the case where something threw before either path ran.
186
- const finalLoopResult = usedRuby
187
- ? rubyLoopResult
188
- : largeModelLoopResult ?? {
189
- success: false,
190
- summary: errorSummary ?? 'Alternation failed before either model ran.',
191
- turns: 0,
192
- toolCallCount: 0,
193
- usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },
194
- costUsd: 0,
195
- history: [],
196
- toolCallLog: [],
197
- };
198
213
  const episode = {
199
214
  id: (0, crypto_1.randomUUID)(),
200
215
  timestamp: Date.now(),
@@ -202,13 +217,13 @@ class RubyAlternator {
202
217
  projectRoot,
203
218
  rubyAttempted,
204
219
  rubySucceeded,
205
- rubyOutput: rubyLoopResult?.summary,
220
+ rubyOutput,
206
221
  largeModelUsed: usedRuby ? undefined : largeModelProvider.model,
207
- largeModelOutput: usedRuby ? undefined : largeModelLoopResult?.summary,
208
- reviewerApproved: isNonEmptyResult(finalLoopResult.summary) && finalLoopResult.success,
222
+ largeModelOutput: usedRuby ? undefined : largeModelOutput,
223
+ reviewerApproved: isNonEmptyResult(result),
209
224
  tokensUsed: {
210
- ruby: rubyAttempted ? rubyLoopResult?.usage.totalTokens : undefined,
211
- largeModel: usedRuby ? undefined : largeModelLoopResult?.usage.totalTokens,
225
+ ruby: rubyAttempted ? rubyTokens : undefined,
226
+ largeModel: usedRuby ? undefined : largeModelTokens,
212
227
  },
213
228
  durationMs: Date.now() - startMs,
214
229
  taskCategory: inferTaskCategory(task),
@@ -228,7 +243,13 @@ class RubyAlternator {
228
243
  catch {
229
244
  /* best-effort */
230
245
  }
231
- return { loopResult: finalLoopResult, episode, usedRuby, decision };
246
+ return {
247
+ result,
248
+ loopResult: finalLoopResult ?? emptyLoopResult(result),
249
+ episode,
250
+ usedRuby,
251
+ decision,
252
+ };
232
253
  }
233
254
  /**
234
255
  * Returns aggregate episode statistics for this alternator's project.
@@ -1 +1 @@
1
- {"version":3,"file":"alternator.js","sourceRoot":"","sources":["../../src/ruby/alternator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"alternator.js","sourceRoot":"","sources":["../../src/ruby/alternator.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,4 @@
1
1
  import type { Episode } from './types.js';
2
- /**
3
- * Rough character-based token estimation (≈1 token per 4 characters).
4
- * Used only for episode recording when the provider does not report usage
5
- * (e.g. MiMo streaming, Google Gemini streaming).
6
- */
7
- export declare function estimateTokens(text: string | undefined): number;
8
2
  /** Stats returned by {@link getEpisodeStats}. */
9
3
  export interface EpisodeStats {
10
4
  total: number;
@@ -29,10 +23,6 @@ export declare const episodeStore: {
29
23
  episodePath(projectRoot: string, id: string): string;
30
24
  /**
31
25
  * Persists one episode to `~/.aura/episodes/{projectHash}/{id}.json`.
32
- *
33
- * When the provider did not report token usage (totalTokens === 0), fills in
34
- * a character-based estimate from the episode's output text so that fine-tune
35
- * readiness and competence tracking still have meaningful token counts.
36
26
  */
37
27
  saveEpisode(projectRoot: string, episode: Episode): Promise<void>;
38
28
  /**
@@ -34,26 +34,9 @@ var __importStar = (this && this.__importStar) || (function () {
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.getEpisodeStats = exports.deleteEpisode = exports.loadEpisodes = exports.saveEpisode = exports.episodeStore = void 0;
37
- exports.estimateTokens = estimateTokens;
38
37
  const fs = __importStar(require("fs"));
39
38
  const path = __importStar(require("path"));
40
39
  const competence_js_1 = require("./competence.js");
41
- // ─────────────────────────────────────────────────────────────────────────────
42
- // Episode persistence
43
- // ─────────────────────────────────────────────────────────────────────────────
44
- //
45
- // Stores alternation episodes under ~/.aura/episodes/{projectHash}/ so
46
- // Ruby competence and fine-tune readiness can be computed per project.
47
- /**
48
- * Rough character-based token estimation (≈1 token per 4 characters).
49
- * Used only for episode recording when the provider does not report usage
50
- * (e.g. MiMo streaming, Google Gemini streaming).
51
- */
52
- function estimateTokens(text) {
53
- if (!text)
54
- return 0;
55
- return Math.ceil(text.length / 4);
56
- }
57
40
  /**
58
41
  * On-disk episode persistence for the Ruby Principle.
59
42
  * Mirrors {@link sessionStore} — atomic `.tmp` writes, namespaced by project hash.
@@ -78,23 +61,8 @@ exports.episodeStore = {
78
61
  },
79
62
  /**
80
63
  * Persists one episode to `~/.aura/episodes/{projectHash}/{id}.json`.
81
- *
82
- * When the provider did not report token usage (totalTokens === 0), fills in
83
- * a character-based estimate from the episode's output text so that fine-tune
84
- * readiness and competence tracking still have meaningful token counts.
85
64
  */
86
65
  async saveEpisode(projectRoot, episode) {
87
- // Fill estimated tokens when the provider reported 0
88
- if (episode.rubyAttempted && !episode.tokensUsed.ruby) {
89
- const est = estimateTokens(episode.rubyOutput);
90
- if (est > 0)
91
- episode = { ...episode, tokensUsed: { ...episode.tokensUsed, ruby: est } };
92
- }
93
- if (episode.largeModelUsed && !episode.tokensUsed.largeModel) {
94
- const est = estimateTokens(episode.largeModelOutput);
95
- if (est > 0)
96
- episode = { ...episode, tokensUsed: { ...episode.tokensUsed, largeModel: est } };
97
- }
98
66
  const dir = this.projectDir(projectRoot);
99
67
  if (!fs.existsSync(dir))
100
68
  fs.mkdirSync(dir, { recursive: true });
@@ -189,5 +157,4 @@ exports.saveEpisode = exports.episodeStore.saveEpisode.bind(exports.episodeStore
189
157
  exports.loadEpisodes = exports.episodeStore.loadEpisodes.bind(exports.episodeStore);
190
158
  exports.deleteEpisode = exports.episodeStore.deleteEpisode.bind(exports.episodeStore);
191
159
  exports.getEpisodeStats = exports.episodeStore.getEpisodeStats.bind(exports.episodeStore);
192
- // estimateTokens is already a top-level export above
193
160
  //# sourceMappingURL=episode-capture.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"episode-capture.js","sourceRoot":"","sources":["../../src/ruby/episode-capture.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"episode-capture.js","sourceRoot":"","sources":["../../src/ruby/episode-capture.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,6 @@ exports.DEFAULT_RUBY_CONFIG = {
15
15
  ollamaBaseUrl: 'http://localhost:11434/v1',
16
16
  competenceThreshold: 0.7,
17
17
  minAttempts: 3,
18
- enabled: false,
18
+ enabled: true,
19
19
  };
20
20
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/ruby/types.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,8BAA8B;AAC9B,gFAAgF;AAChF,EAAE;AACF,uEAAuE;AACvE,6EAA6E;AAC7E,yEAAyE;AACzE,0BAA0B;;;AAkD1B,4DAA4D;AAC/C,QAAA,mBAAmB,GAAe;IAC7C,SAAS,EAAE,oBAAoB;IAC/B,aAAa,EAAE,2BAA2B;IAC1C,mBAAmB,EAAE,GAAG;IACxB,WAAW,EAAE,CAAC;IACd,OAAO,EAAE,KAAK;CACf,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/ruby/types.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,8BAA8B;AAC9B,gFAAgF;AAChF,EAAE;AACF,uEAAuE;AACvE,6EAA6E;AAC7E,yEAAyE;AACzE,0BAA0B;;;AAkD1B,4DAA4D;AAC/C,QAAA,mBAAmB,GAAe;IAC7C,SAAS,EAAE,oBAAoB;IAC/B,aAAa,EAAE,2BAA2B;IAC1C,mBAAmB,EAAE,GAAG;IACxB,WAAW,EAAE,CAAC;IACd,OAAO,EAAE,IAAI;CACd,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Filesystem containment: every file tool must keep its target inside the
3
+ * project root. Without this, a model-issued (or prompt-injected) path like
4
+ * `../../../home/user/.ssh/authorized_keys` or an absolute `/etc/passwd`
5
+ * resolves and reads/writes freely with the user's full privileges.
6
+ */
7
+ export declare class PathJailError extends Error {
8
+ readonly inputPath: string;
9
+ constructor(inputPath: string);
10
+ }
11
+ /**
12
+ * Resolve `inputPath` (relative to `root`, or absolute) and guarantee the
13
+ * result stays within `root`. Throws {@link PathJailError} on escape.
14
+ * Absolute paths outside the root, `..` traversal, and symlink escapes are
15
+ * all rejected.
16
+ */
17
+ export declare function resolveInRoot(root: string, inputPath: string): string;
@@ -0,0 +1,100 @@
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.PathJailError = void 0;
37
+ exports.resolveInRoot = resolveInRoot;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ /**
41
+ * Filesystem containment: every file tool must keep its target inside the
42
+ * project root. Without this, a model-issued (or prompt-injected) path like
43
+ * `../../../home/user/.ssh/authorized_keys` or an absolute `/etc/passwd`
44
+ * resolves and reads/writes freely with the user's full privileges.
45
+ */
46
+ class PathJailError extends Error {
47
+ inputPath;
48
+ constructor(inputPath) {
49
+ super(`Path escapes the project root: ${inputPath}`);
50
+ this.inputPath = inputPath;
51
+ this.name = 'PathJailError';
52
+ }
53
+ }
54
+ exports.PathJailError = PathJailError;
55
+ /**
56
+ * Resolve the deepest existing ancestor of `p` through the real filesystem
57
+ * (following symlinks), then re-append the not-yet-existing tail. This makes
58
+ * containment checks robust against symlink escapes: a symlink anywhere in
59
+ * the existing prefix is resolved to its real location before we compare,
60
+ * while still allowing writes to paths that don't exist yet.
61
+ */
62
+ function realpathAllowingMissing(p) {
63
+ let existing = path.resolve(p);
64
+ const tail = [];
65
+ while (!fs.existsSync(existing)) {
66
+ const parent = path.dirname(existing);
67
+ if (parent === existing)
68
+ break; // reached the filesystem root
69
+ tail.unshift(path.basename(existing));
70
+ existing = parent;
71
+ }
72
+ let real;
73
+ try {
74
+ real = fs.realpathSync(existing);
75
+ }
76
+ catch {
77
+ real = existing;
78
+ }
79
+ return tail.length ? path.join(real, ...tail) : real;
80
+ }
81
+ /**
82
+ * Resolve `inputPath` (relative to `root`, or absolute) and guarantee the
83
+ * result stays within `root`. Throws {@link PathJailError} on escape.
84
+ * Absolute paths outside the root, `..` traversal, and symlink escapes are
85
+ * all rejected.
86
+ */
87
+ function resolveInRoot(root, inputPath) {
88
+ const realRoot = realpathAllowingMissing(root);
89
+ // path.resolve ignores realRoot when inputPath is absolute; the containment
90
+ // check below is what actually rejects an out-of-root absolute path.
91
+ const candidate = realpathAllowingMissing(path.resolve(realRoot, inputPath ?? ''));
92
+ const rel = path.relative(realRoot, candidate);
93
+ const escapes = rel === '..'
94
+ || rel.startsWith('..' + path.sep)
95
+ || path.isAbsolute(rel);
96
+ if (escapes)
97
+ throw new PathJailError(inputPath);
98
+ return candidate;
99
+ }
100
+ //# sourceMappingURL=path-jail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-jail.js","sourceRoot":"","sources":["../../src/safety/path-jail.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CA,sCAaC;AAzDD,uCAAyB;AACzB,2CAA6B;AAE7B;;;;;GAKG;AACH,MAAa,aAAc,SAAQ,KAAK;IACV;IAA5B,YAA4B,SAAiB;QAC3C,KAAK,CAAC,kCAAkC,SAAS,EAAE,CAAC,CAAC;QAD3B,cAAS,GAAT,SAAS,CAAQ;QAE3C,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AALD,sCAKC;AAED;;;;;;GAMG;AACH,SAAS,uBAAuB,CAAC,CAAS;IACxC,IAAI,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,MAAM,KAAK,QAAQ;YAAE,MAAM,CAAC,8BAA8B;QAC9D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QACtC,QAAQ,GAAG,MAAM,CAAC;IACpB,CAAC;IACD,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QAAC,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAAC,CAAC;IACzC,MAAM,CAAC;QAAC,IAAI,GAAG,QAAQ,CAAC;IAAC,CAAC;IAC1B,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACvD,CAAC;AAED;;;;;GAKG;AACH,SAAgB,aAAa,CAAC,IAAY,EAAE,SAAiB;IAC3D,MAAM,QAAQ,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAC/C,4EAA4E;IAC5E,qEAAqE;IACrE,MAAM,SAAS,GAAG,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC;IAEnF,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,GAAG,KAAK,IAAI;WACvB,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC;WAC/B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,OAAO;QAAE,MAAM,IAAI,aAAa,CAAC,SAAS,CAAC,CAAC;IAEhD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -1,40 +1,31 @@
1
+ import * as readline from 'readline';
1
2
  export type PermissionLevel = 'read-only' | 'normal' | 'auto';
2
3
  export interface PermissionResult {
3
4
  allowed: boolean;
4
5
  reason?: string;
5
6
  needsConfirm?: boolean;
6
7
  }
7
- export interface PermissionConfig {
8
- allowedMountPaths?: string[];
9
- }
10
- export declare class ShellCommandValidator {
11
- private blockedPrefixes;
12
- constructor();
13
- private discoverFuseMounts;
14
- validateCommand(cmd: string, projectRoot: string, config?: PermissionConfig): {
15
- allowed: boolean;
16
- reason?: string;
17
- };
18
- }
19
8
  export declare class PermissionSystem {
20
9
  private level;
21
10
  private sessionApprovals;
22
- private validator;
23
- private projectRoot;
24
- private config?;
25
- constructor(level?: PermissionLevel, projectRoot?: string, config?: PermissionConfig);
11
+ constructor(level?: PermissionLevel);
26
12
  check(toolName: string, input: Record<string, unknown>): PermissionResult;
27
13
  approveForSession(key: string): void;
14
+ /** Current enforcement level. */
15
+ getLevel(): PermissionLevel;
28
16
  /**
29
- * Change the permission level mid-session. Used by `:approve all` since
30
- * RubyAlternator stores a reference to this same instance rather than its
31
- * own copy, calling this also takes effect for any in-flight or future
32
- * Ruby-alternated attempts, with no extra wiring needed.
17
+ * Change the level at runtime — used by the REPL `:approve` command to flip
18
+ * a session into auto-approve (no per-command confirm) and back. Dangerous
19
+ * commands are STILL blocked in 'auto'; this only removes the y/N prompt for
20
+ * ordinary destructive-but-safe operations.
33
21
  */
34
22
  setLevel(level: PermissionLevel): void;
35
- getLevel(): PermissionLevel;
23
+ private mcpConnectCommand;
36
24
  private isDangerous;
37
25
  private isSafe;
38
26
  }
27
+ export declare function setSharedReadline(rl: readline.Interface | null): void;
28
+ export declare function getSharedReadline(): readline.Interface | null;
29
+ export declare function setConfirmHandler(fn: ((message: string) => Promise<boolean>) | null): void;
39
30
  /** Ask user to confirm in the terminal. Returns true if approved. */
40
31
  export declare function confirm(message: string): Promise<boolean>;