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.
- 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/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 -23
- 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 +49 -13
- 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 -146
- 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 +1001 -788
- 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 -39
- 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 -36
- package/dist/dream/dream.js +327 -117
- 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/dream/okf.d.ts +10 -0
- package/dist/dream/okf.js +280 -0
- package/dist/dream/okf.js.map +1 -0
- package/dist/dream/parser.d.ts +60 -0
- package/dist/dream/parser.js +176 -0
- package/dist/dream/parser.js.map +1 -0
- package/dist/dream/reconcile.d.ts +69 -0
- package/dist/dream/reconcile.js +303 -0
- package/dist/dream/reconcile.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/index.d.ts +16 -0
- package/dist/machina/index.js +61 -0
- package/dist/machina/index.js.map +1 -0
- package/dist/machina/render-html.d.ts +2 -0
- package/dist/machina/render-html.js +191 -0
- package/dist/machina/render-html.js.map +1 -0
- package/dist/machina/render-terminal.d.ts +2 -0
- package/dist/machina/render-terminal.js +99 -0
- package/dist/machina/render-terminal.js.map +1 -0
- 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.d.ts +61 -0
- package/dist/machina/spec.js +124 -0
- package/dist/machina/spec.js.map +1 -0
- package/dist/machina/verify.d.ts +39 -0
- package/dist/machina/verify.js +95 -0
- package/dist/machina/verify.js.map +1 -0
- 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 +34 -6
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/factory.d.ts +71 -14
- package/dist/providers/factory.js +205 -124
- package/dist/providers/factory.js.map +1 -1
- package/dist/providers/google.js +8 -21
- 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/rem/graph.d.ts +72 -0
- package/dist/rem/graph.js +139 -0
- package/dist/rem/graph.js.map +1 -0
- package/dist/rem/index.d.ts +16 -0
- package/dist/rem/index.js +60 -0
- package/dist/rem/index.js.map +1 -0
- package/dist/rem/render-html.d.ts +2 -0
- package/dist/rem/render-html.js +189 -0
- package/dist/rem/render-html.js.map +1 -0
- package/dist/rem/render-terminal.d.ts +4 -0
- package/dist/rem/render-terminal.js +94 -0
- package/dist/rem/render-terminal.js.map +1 -0
- 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 +5 -2
- package/dist/research/council.js +73 -10
- 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 +6 -4
- 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/gmail-tool.d.ts +5 -1
- package/dist/tools/gmail-tool.js +151 -11
- package/dist/tools/gmail-tool.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 -539
- 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.js +2 -3
- 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/dist/viz/reader.d.ts +33 -0
- package/dist/viz/reader.js +343 -0
- package/dist/viz/reader.js.map +1 -0
- package/package.json +13 -32
package/dist/ruby/alternator.js
CHANGED
|
@@ -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
|
|
114
|
-
let
|
|
128
|
+
let rubyOutput;
|
|
129
|
+
let rubyTokens = 0;
|
|
130
|
+
let largeModelOutput;
|
|
131
|
+
let largeModelTokens = 0;
|
|
115
132
|
let usedRuby = false;
|
|
116
|
-
|
|
117
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
175
|
-
|
|
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
|
-
|
|
181
|
-
this.display.error(
|
|
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
|
|
220
|
+
rubyOutput,
|
|
206
221
|
largeModelUsed: usedRuby ? undefined : largeModelProvider.model,
|
|
207
|
-
largeModelOutput: usedRuby ? undefined :
|
|
208
|
-
reviewerApproved: isNonEmptyResult(
|
|
222
|
+
largeModelOutput: usedRuby ? undefined : largeModelOutput,
|
|
223
|
+
reviewerApproved: isNonEmptyResult(result),
|
|
209
224
|
tokensUsed: {
|
|
210
|
-
ruby: rubyAttempted ?
|
|
211
|
-
largeModel: usedRuby ? undefined :
|
|
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 {
|
|
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":";;;AAAA,mCAAoC;
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"episode-capture.js","sourceRoot":"","sources":["../../src/ruby/episode-capture.ts"],"names":[],"mappings":"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"}
|
package/dist/ruby/types.js
CHANGED
package/dist/ruby/types.js.map
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
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
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
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
|
-
|
|
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>;
|