aura-code 0.3.6 → 0.5.0
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 +54 -2
- package/dist/agent/compactor.d.ts +26 -0
- package/dist/agent/compactor.js +156 -0
- package/dist/agent/compactor.js.map +1 -0
- package/dist/agent/design.d.ts +17 -0
- package/dist/agent/design.js +175 -0
- package/dist/agent/design.js.map +1 -0
- package/dist/agent/loop.js +8 -1
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/system-prompt.d.ts +1 -1
- package/dist/agent/system-prompt.js +5 -2
- package/dist/agent/system-prompt.js.map +1 -1
- package/dist/cli/display.js +40 -4
- package/dist/cli/display.js.map +1 -1
- package/dist/cli/index.js +258 -44
- package/dist/cli/index.js.map +1 -1
- package/dist/config/defaults.js +1 -1
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/project-config.d.ts +6 -0
- package/dist/config/project-config.js +2 -0
- package/dist/config/project-config.js.map +1 -1
- package/dist/dream/dream.d.ts +48 -0
- package/dist/dream/dream.js +187 -0
- package/dist/dream/dream.js.map +1 -0
- package/dist/kanban/index.d.ts +5 -0
- package/dist/kanban/index.js +11 -0
- package/dist/kanban/index.js.map +1 -0
- package/dist/kanban/pipeline.d.ts +16 -0
- package/dist/kanban/pipeline.js +910 -0
- package/dist/kanban/pipeline.js.map +1 -0
- package/dist/kanban/server.d.ts +5 -0
- package/dist/kanban/server.js +820 -0
- package/dist/kanban/server.js.map +1 -0
- package/dist/kanban/types.d.ts +75 -0
- package/dist/kanban/types.js +6 -0
- package/dist/kanban/types.js.map +1 -0
- package/dist/learnlight/driven.d.ts +2 -0
- package/dist/learnlight/driven.js +109 -0
- package/dist/learnlight/driven.js.map +1 -0
- package/dist/learnlight/index.d.ts +4 -0
- package/dist/learnlight/index.js +32 -0
- package/dist/learnlight/index.js.map +1 -0
- package/dist/learnlight/lesson-prep.d.ts +36 -0
- package/dist/learnlight/lesson-prep.js +224 -0
- package/dist/learnlight/lesson-prep.js.map +1 -0
- package/dist/learnlight/report.d.ts +2 -0
- package/dist/learnlight/report.js +37 -0
- package/dist/learnlight/report.js.map +1 -0
- package/dist/learnlight/types.d.ts +72 -0
- package/dist/learnlight/types.js +6 -0
- package/dist/learnlight/types.js.map +1 -0
- package/dist/perception/graph-store.d.ts +11 -0
- package/dist/perception/graph-store.js +33 -0
- package/dist/perception/graph-store.js.map +1 -1
- package/dist/perception/index.d.ts +1 -1
- package/dist/perception/index.js +2 -1
- package/dist/perception/index.js.map +1 -1
- package/dist/providers/factory.d.ts +16 -0
- package/dist/providers/factory.js +72 -0
- package/dist/providers/factory.js.map +1 -1
- package/dist/providers/openai-compatible.js +80 -49
- package/dist/providers/openai-compatible.js.map +1 -1
- package/dist/research/council.d.ts +26 -0
- package/dist/research/council.js +225 -0
- package/dist/research/council.js.map +1 -0
- package/dist/research/research.d.ts +24 -0
- package/dist/research/research.js +116 -0
- package/dist/research/research.js.map +1 -0
- package/dist/ruby/alternator.d.ts +36 -1
- package/dist/ruby/alternator.js +40 -31
- package/dist/ruby/alternator.js.map +1 -1
- package/dist/ruby/stats.js +10 -11
- package/dist/ruby/stats.js.map +1 -1
- package/dist/ruby/types.js +1 -1
- package/dist/ruby/types.js.map +1 -1
- package/dist/safety/permissions.d.ts +8 -0
- package/dist/safety/permissions.js +12 -0
- package/dist/safety/permissions.js.map +1 -1
- package/dist/setup/provider-registry.js +14 -0
- package/dist/setup/provider-registry.js.map +1 -1
- package/dist/setup/provider-test.js +24 -2
- package/dist/setup/provider-test.js.map +1 -1
- package/dist/setup/telegram-wizard.d.ts +57 -0
- package/dist/setup/telegram-wizard.js +343 -0
- package/dist/setup/telegram-wizard.js.map +1 -0
- package/dist/tools/audio-transcribe.d.ts +20 -0
- package/dist/tools/audio-transcribe.js +39 -28
- package/dist/tools/audio-transcribe.js.map +1 -1
- package/dist/tools/gmail-tool.d.ts +11 -0
- package/dist/tools/gmail-tool.js +221 -0
- package/dist/tools/gmail-tool.js.map +1 -0
- package/dist/tools/read-file.js +13 -0
- package/dist/tools/read-file.js.map +1 -1
- package/dist/tools/telegram-bot.js +103 -18
- package/dist/tools/telegram-bot.js.map +1 -1
- package/dist/tools/telegram-voice.d.ts +22 -0
- package/dist/tools/telegram-voice.js +203 -0
- package/dist/tools/telegram-voice.js.map +1 -0
- package/dist/tools/telegram.d.ts +6 -1
- package/dist/tools/telegram.js +115 -5
- package/dist/tools/telegram.js.map +1 -1
- package/dist/tools/video-render.d.ts +11 -0
- package/dist/tools/video-render.js +189 -0
- package/dist/tools/video-render.js.map +1 -0
- package/dist/util/errors.js +6 -0
- package/dist/util/errors.js.map +1 -1
- package/dist/viz/index.js +816 -30
- package/dist/viz/index.js.map +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -36,7 +36,10 @@
|
|
|
36
36
|
|
|
37
37
|
## What is Aura Code?
|
|
38
38
|
|
|
39
|
-
|
|
39
|
+
Designed and brought to life by **Dušan Milosavljević** using opencode.
|
|
40
|
+
Built by agents, for agents — AI-assisted engineering workflows with multiple AI agents contributing to design, implementation, testing, and verification.
|
|
41
|
+
Model-agnostic: works with Claude, GPT, Gemini, MiMo, and any OpenAI-compatible endpoint.
|
|
42
|
+
Written in TypeScript — not related to the Ruby programming language.
|
|
40
43
|
|
|
41
44
|
Built on the **Praktess** framework — from Ancient Greek: *she who acts and executes*.
|
|
42
45
|
|
|
@@ -107,12 +110,61 @@ Any OpenAI-compatible endpoint also works via `openrouter/<model>`.
|
|
|
107
110
|
|
|
108
111
|
---
|
|
109
112
|
|
|
113
|
+
## Testing
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
npm install
|
|
117
|
+
npm run build # compiles TypeScript, zero errors expected
|
|
118
|
+
npm test # runs the full suite (vitest)
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
For local development:
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
npm run test:watch # re-runs tests on file changes
|
|
125
|
+
npm run test:coverage # generates a coverage report
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
The suite currently runs 1000+ tests across 60+ files, covering the agent
|
|
129
|
+
loop, all provider integrations, the tool registry, safety/permissions, the
|
|
130
|
+
orchestration and self-improvement layers, and the dashboard generator.
|
|
131
|
+
|
|
132
|
+
Contributions should keep `npm run build` and `npm test` clean before
|
|
133
|
+
opening a pull request.
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## Known Limitations
|
|
138
|
+
|
|
139
|
+
- **Self-improvement routing (RubyAlternator) is implemented but inactive.**
|
|
140
|
+
Episode recording and competence scoring both work and are visible in the
|
|
141
|
+
dashboard's Learning tab, but the routing logic that would actually use
|
|
142
|
+
competence scores to pick models isn't wired into the main agent loop yet.
|
|
143
|
+
Today, model selection doesn't change based on what Aura has learned.
|
|
144
|
+
|
|
145
|
+
- **Provider behavior varies by model.** Tool-calling support, context
|
|
146
|
+
window handling, and error message quality differ across providers —
|
|
147
|
+
some of this is normalized (see CHANGELOG for cross-provider config
|
|
148
|
+
fixes), but not all of it. If a model behaves unexpectedly with tools,
|
|
149
|
+
check whether the provider documents function-calling support before
|
|
150
|
+
assuming it's a bug in Aura.
|
|
151
|
+
|
|
152
|
+
- **Large refactors still need verification.** `--verify` and `--test-command`
|
|
153
|
+
catch regressions Aura's own changes introduce, but they don't replace
|
|
154
|
+
review for changes spanning many files or with subtle behavioral intent.
|
|
155
|
+
|
|
156
|
+
- **Conversation compaction is new.** Long sessions now auto-summarize older
|
|
157
|
+
turns to stay within context limits; this is recently added and still
|
|
158
|
+
being hardened against edge cases in unusual tool-call sequences.
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
110
162
|
## Stats
|
|
111
163
|
|
|
112
164
|
| Metric | Value |
|
|
113
165
|
|--------|-------|
|
|
114
166
|
| Tests | 1035+ passing, 0 failures |
|
|
115
|
-
| Version | v0.3.
|
|
167
|
+
| Version | v0.3.7 |
|
|
116
168
|
| Language | TypeScript (strict) |
|
|
117
169
|
| License | MIT |
|
|
118
170
|
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { HistoryMessage } from '../providers/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Provider-independent estimate of how many tokens the *next* prompt will
|
|
4
|
+
* carry, measured directly from the system prompt + current history. This is
|
|
5
|
+
* the signal that should drive compaction: it reflects the payload we are
|
|
6
|
+
* about to send, it never lags a turn, and — critically — it does not depend
|
|
7
|
+
* on the provider reporting streamed `usage`, which several OpenAI-compatible
|
|
8
|
+
* endpoints omit on tool-call turns. Do NOT substitute a running sum of
|
|
9
|
+
* per-turn `usage.totalTokens`: each turn's input already contains the entire
|
|
10
|
+
* history, so summing them N-counts the same bytes.
|
|
11
|
+
*
|
|
12
|
+
* Uses the precise tokenizer when available (see loadEncoder), otherwise a
|
|
13
|
+
* conservative char-ratio estimate. Result is identical in shape either way.
|
|
14
|
+
*/
|
|
15
|
+
export declare function estimateContextTokens(system: string, history: HistoryMessage[]): number;
|
|
16
|
+
/**
|
|
17
|
+
* Compact conversation history when context usage crosses ~70% of the model's
|
|
18
|
+
* window. Keeps the first message (task) and the most recent messages
|
|
19
|
+
* verbatim; replaces the middle with a recap.
|
|
20
|
+
*
|
|
21
|
+
* Mutates `history` in place (clears and re-fills) so callers that hold a
|
|
22
|
+
* shared reference see the compacted version without reassignment.
|
|
23
|
+
*
|
|
24
|
+
* Returns `true` if compaction happened.
|
|
25
|
+
*/
|
|
26
|
+
export declare function compactHistory(history: HistoryMessage[], totalTokens: number, model: string): boolean;
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.estimateContextTokens = estimateContextTokens;
|
|
4
|
+
exports.compactHistory = compactHistory;
|
|
5
|
+
const factory_js_1 = require("../providers/factory.js");
|
|
6
|
+
const COMPACTION_THRESHOLD = 0.7;
|
|
7
|
+
const PRESERVE_RECENT = 3;
|
|
8
|
+
const DEFAULT_WINDOW = 128_000;
|
|
9
|
+
/** Average characters per token used for the local size estimate. Deliberately
|
|
10
|
+
* conservative (real ratio is ~4 for English prose, lower for code/JSON) so we
|
|
11
|
+
* err toward compacting slightly early rather than overflowing. */
|
|
12
|
+
const CHARS_PER_TOKEN = 3.5;
|
|
13
|
+
/**
|
|
14
|
+
* Optional precise tokenizer. `gpt-tokenizer` is pure-JS (o200k/cl100k BPE),
|
|
15
|
+
* which matches the OpenAI-compatible families Aura routes through (DeepSeek,
|
|
16
|
+
* MiMo, OpenAI). Loaded lazily and defensively: if the package is absent or
|
|
17
|
+
* errors, we silently fall back to the char-ratio estimate so compaction never
|
|
18
|
+
* depends on it being installed.
|
|
19
|
+
*/
|
|
20
|
+
let encodeFn;
|
|
21
|
+
function loadEncoder() {
|
|
22
|
+
if (encodeFn !== undefined)
|
|
23
|
+
return encodeFn;
|
|
24
|
+
try {
|
|
25
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
26
|
+
const mod = require('gpt-tokenizer');
|
|
27
|
+
encodeFn = typeof mod.encode === 'function' ? mod.encode : null;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
encodeFn = null;
|
|
31
|
+
}
|
|
32
|
+
return encodeFn;
|
|
33
|
+
}
|
|
34
|
+
/** Tokens for a single string: exact via tokenizer, else char-ratio estimate. */
|
|
35
|
+
function countText(text) {
|
|
36
|
+
if (!text)
|
|
37
|
+
return 0;
|
|
38
|
+
const enc = loadEncoder();
|
|
39
|
+
if (enc) {
|
|
40
|
+
try {
|
|
41
|
+
return enc(text).length;
|
|
42
|
+
}
|
|
43
|
+
catch { /* fall through */ }
|
|
44
|
+
}
|
|
45
|
+
return Math.ceil(text.length / CHARS_PER_TOKEN);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Provider-independent estimate of how many tokens the *next* prompt will
|
|
49
|
+
* carry, measured directly from the system prompt + current history. This is
|
|
50
|
+
* the signal that should drive compaction: it reflects the payload we are
|
|
51
|
+
* about to send, it never lags a turn, and — critically — it does not depend
|
|
52
|
+
* on the provider reporting streamed `usage`, which several OpenAI-compatible
|
|
53
|
+
* endpoints omit on tool-call turns. Do NOT substitute a running sum of
|
|
54
|
+
* per-turn `usage.totalTokens`: each turn's input already contains the entire
|
|
55
|
+
* history, so summing them N-counts the same bytes.
|
|
56
|
+
*
|
|
57
|
+
* Uses the precise tokenizer when available (see loadEncoder), otherwise a
|
|
58
|
+
* conservative char-ratio estimate. Result is identical in shape either way.
|
|
59
|
+
*/
|
|
60
|
+
function estimateContextTokens(system, history) {
|
|
61
|
+
let tokens = countText(system);
|
|
62
|
+
for (const msg of history) {
|
|
63
|
+
switch (msg.role) {
|
|
64
|
+
case 'user':
|
|
65
|
+
tokens += countText(msg.content);
|
|
66
|
+
break;
|
|
67
|
+
case 'assistant':
|
|
68
|
+
tokens += countText(msg.content ?? '');
|
|
69
|
+
for (const call of msg.toolCalls ?? []) {
|
|
70
|
+
tokens += countText(call.name) + countText(JSON.stringify(call.input));
|
|
71
|
+
}
|
|
72
|
+
break;
|
|
73
|
+
case 'tool_result':
|
|
74
|
+
for (const r of msg.results) {
|
|
75
|
+
tokens += countText(r.name) + countText(r.content ?? '');
|
|
76
|
+
}
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return tokens;
|
|
81
|
+
}
|
|
82
|
+
function summariseMessage(msg) {
|
|
83
|
+
switch (msg.role) {
|
|
84
|
+
case 'user':
|
|
85
|
+
return `User: ${msg.content.slice(0, 120)}${msg.content.length > 120 ? '…' : ''}`;
|
|
86
|
+
case 'assistant': {
|
|
87
|
+
const text = msg.content ? `Assistant: ${msg.content.slice(0, 120)}${msg.content.length > 120 ? '…' : ''}` : '';
|
|
88
|
+
const calls = msg.toolCalls?.length ? `Called: ${msg.toolCalls.map(c => c.name).join(', ')}` : '';
|
|
89
|
+
return [text, calls].filter(Boolean).join(' · ') || 'Assistant: (no content)';
|
|
90
|
+
}
|
|
91
|
+
case 'tool_result': {
|
|
92
|
+
const toolNames = msg.results.map(r => r.name).join(', ');
|
|
93
|
+
return `Tool results: [${toolNames}]`;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Compact conversation history when context usage crosses ~70% of the model's
|
|
99
|
+
* window. Keeps the first message (task) and the most recent messages
|
|
100
|
+
* verbatim; replaces the middle with a recap.
|
|
101
|
+
*
|
|
102
|
+
* Mutates `history` in place (clears and re-fills) so callers that hold a
|
|
103
|
+
* shared reference see the compacted version without reassignment.
|
|
104
|
+
*
|
|
105
|
+
* Returns `true` if compaction happened.
|
|
106
|
+
*/
|
|
107
|
+
function compactHistory(history, totalTokens, model) {
|
|
108
|
+
const window = (0, factory_js_1.getContextWindow)(model) ?? DEFAULT_WINDOW;
|
|
109
|
+
const threshold = Math.floor(window * COMPACTION_THRESHOLD);
|
|
110
|
+
if (totalTokens < threshold)
|
|
111
|
+
return false;
|
|
112
|
+
const MIN_KEEP = 2 + PRESERVE_RECENT;
|
|
113
|
+
if (history.length <= MIN_KEEP)
|
|
114
|
+
return false;
|
|
115
|
+
// Prefer preserving the ENTIRE most recent user turn intact — search
|
|
116
|
+
// backward for the last 'user' message (excluding the original task at
|
|
117
|
+
// index 0). A forward-only search from an arbitrary message-count
|
|
118
|
+
// boundary can miss this entirely, since the most recent user turn may
|
|
119
|
+
// start well before that boundary — confirmed by testing a multi-turn
|
|
120
|
+
// session where a forward search found nothing and fell through to
|
|
121
|
+
// collapsing the whole session, discarding a real, recent instruction.
|
|
122
|
+
let keepFrom = -1;
|
|
123
|
+
for (let i = history.length - 1; i >= 1; i--) {
|
|
124
|
+
if (history[i].role === 'user') {
|
|
125
|
+
keepFrom = i;
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
if (keepFrom === -1) {
|
|
130
|
+
// No later user turn exists (e.g. still mid-task, only the original
|
|
131
|
+
// instruction so far) — fall back to keeping roughly the last
|
|
132
|
+
// PRESERVE_RECENT messages, walked forward to avoid landing on an
|
|
133
|
+
// orphaned tool_result or directly after the assistant-role recap.
|
|
134
|
+
keepFrom = Math.max(1, history.length - PRESERVE_RECENT);
|
|
135
|
+
while (keepFrom < history.length &&
|
|
136
|
+
(history[keepFrom].role === 'tool_result' || history[keepFrom].role === 'assistant'))
|
|
137
|
+
keepFrom++;
|
|
138
|
+
}
|
|
139
|
+
const toCompact = history.slice(1, keepFrom);
|
|
140
|
+
if (toCompact.length === 0)
|
|
141
|
+
return false;
|
|
142
|
+
const summaries = toCompact.map(summariseMessage);
|
|
143
|
+
const recap = {
|
|
144
|
+
role: 'assistant',
|
|
145
|
+
content: [
|
|
146
|
+
`[Earlier conversation compacted: ${toCompact.length} turns removed to stay within context limits.]`,
|
|
147
|
+
...summaries,
|
|
148
|
+
].join('\n'),
|
|
149
|
+
};
|
|
150
|
+
const preserved = [history[0], recap, ...history.slice(keepFrom)];
|
|
151
|
+
history.length = 0;
|
|
152
|
+
for (const msg of preserved)
|
|
153
|
+
history.push(msg);
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=compactor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compactor.js","sourceRoot":"","sources":["../../src/agent/compactor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface DesignSelection {
|
|
2
|
+
slug: string;
|
|
3
|
+
name: string;
|
|
4
|
+
skillText: string;
|
|
5
|
+
matchedByName: boolean;
|
|
6
|
+
}
|
|
7
|
+
/** All available slugs (folder names) in the library, sorted. */
|
|
8
|
+
export declare function listDesignSlugs(projectRoot: string): string[];
|
|
9
|
+
/** Is this task asking to build/modify a website or UI? */
|
|
10
|
+
export declare function isWebBuildTask(task: string): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Decide which design skill (if any) applies to this task.
|
|
13
|
+
* Returns null when the task is not a UI/website build or no library exists.
|
|
14
|
+
*/
|
|
15
|
+
export declare function selectDesign(projectRoot: string, task: string): DesignSelection | null;
|
|
16
|
+
/** Render the design selection as a system-prompt section. */
|
|
17
|
+
export declare function designPromptSection(sel: DesignSelection): string;
|
|
@@ -0,0 +1,175 @@
|
|
|
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.listDesignSlugs = listDesignSlugs;
|
|
37
|
+
exports.isWebBuildTask = isWebBuildTask;
|
|
38
|
+
exports.selectDesign = selectDesign;
|
|
39
|
+
exports.designPromptSection = designPromptSection;
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
/**
|
|
43
|
+
* Design-system injection for UI/website builds.
|
|
44
|
+
*
|
|
45
|
+
* When a task is about building a website or UI, Aura loads a design "skill"
|
|
46
|
+
* (a SKILL.md from `design-systems/<slug>/`) into the system prompt so the
|
|
47
|
+
* generated markup follows real tokens, components, and accessibility rules
|
|
48
|
+
* instead of generic defaults. Library: bergside/awesome-design-skills (MIT).
|
|
49
|
+
*
|
|
50
|
+
* Selection is keyword-based and cheap (no extra LLM call):
|
|
51
|
+
* 1. If the task names a known slug/name ("make it brutalist", "luxury style",
|
|
52
|
+
* "terracotta"), that skill is used.
|
|
53
|
+
* 2. Otherwise the project default applies (AURA_DESIGN env or "terracotta").
|
|
54
|
+
* 3. If the task isn't a UI/website build at all, nothing is injected.
|
|
55
|
+
*/
|
|
56
|
+
const DIRNAME = 'design-systems';
|
|
57
|
+
/** Resolved at call time so `:design <slug>` / `:design off` take effect live. */
|
|
58
|
+
function defaultSlug() {
|
|
59
|
+
return process.env.AURA_DESIGN || 'terracotta';
|
|
60
|
+
}
|
|
61
|
+
/** Phrases that mark a task as UI/website work. Deliberately narrow — generic
|
|
62
|
+
* words like "design" or "page" alone false-positive on requests that have
|
|
63
|
+
* nothing to do with building a UI (e.g. "make a page summarizing my Tesla
|
|
64
|
+
* research" should NOT pull in a design skill). Multi-word phrases here are
|
|
65
|
+
* much less ambiguous than single common words. */
|
|
66
|
+
const WEB_SIGNALS = [
|
|
67
|
+
'website', 'web site', 'webpage', 'web page', 'landing page', 'homepage',
|
|
68
|
+
'home page', 'frontend', 'front-end', 'front end', 'web app', 'webapp',
|
|
69
|
+
'react component', 'ui component', 'ui design', 'redesign the site',
|
|
70
|
+
'restyle the site', 'portfolio site', 'hero section', 'marketing page',
|
|
71
|
+
'site for', 'design system', 'visual design',
|
|
72
|
+
];
|
|
73
|
+
/** Common natural-language variants → canonical slug. Keeps "make it brutalist"
|
|
74
|
+
* or "minimalist look" matching the right skill without fuzzy guessing. */
|
|
75
|
+
const ALIASES = {
|
|
76
|
+
brutalist: 'brutalism',
|
|
77
|
+
neobrutalist: 'neobrutalism',
|
|
78
|
+
minimalist: 'minimal',
|
|
79
|
+
minimalistic: 'minimal',
|
|
80
|
+
luxurious: 'luxury',
|
|
81
|
+
glassy: 'glassmorphism',
|
|
82
|
+
glass: 'glassmorphism',
|
|
83
|
+
neumorphic: 'neumorphism',
|
|
84
|
+
claymorphic: 'claymorphism',
|
|
85
|
+
skeuomorphic: 'skeumorphism',
|
|
86
|
+
skeuomorphism: 'skeumorphism',
|
|
87
|
+
editorialstyle: 'editorial',
|
|
88
|
+
corporatey: 'corporate',
|
|
89
|
+
retrostyle: 'retro',
|
|
90
|
+
vintagestyle: 'vintage',
|
|
91
|
+
professionallooking: 'professional',
|
|
92
|
+
};
|
|
93
|
+
function designsRoot(projectRoot) {
|
|
94
|
+
return path.join(projectRoot, DIRNAME);
|
|
95
|
+
}
|
|
96
|
+
/** All available slugs (folder names) in the library, sorted. */
|
|
97
|
+
function listDesignSlugs(projectRoot) {
|
|
98
|
+
try {
|
|
99
|
+
return fs.readdirSync(designsRoot(projectRoot), { withFileTypes: true })
|
|
100
|
+
.filter(d => d.isDirectory())
|
|
101
|
+
.map(d => d.name)
|
|
102
|
+
.sort();
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return [];
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/** Is this task asking to build/modify a website or UI? */
|
|
109
|
+
function isWebBuildTask(task) {
|
|
110
|
+
const t = task.toLowerCase();
|
|
111
|
+
return WEB_SIGNALS.some(sig => t.includes(sig));
|
|
112
|
+
}
|
|
113
|
+
/** Load a skill's SKILL.md text, or null if missing. */
|
|
114
|
+
function loadSkill(projectRoot, slug) {
|
|
115
|
+
try {
|
|
116
|
+
return fs.readFileSync(path.join(designsRoot(projectRoot), slug, 'SKILL.md'), 'utf8');
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
function titleCase(slug) {
|
|
123
|
+
return slug.charAt(0).toUpperCase() + slug.slice(1);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Decide which design skill (if any) applies to this task.
|
|
127
|
+
* Returns null when the task is not a UI/website build or no library exists.
|
|
128
|
+
*/
|
|
129
|
+
function selectDesign(projectRoot, task) {
|
|
130
|
+
const slugs = listDesignSlugs(projectRoot);
|
|
131
|
+
if (slugs.length === 0)
|
|
132
|
+
return null;
|
|
133
|
+
const t = task.toLowerCase();
|
|
134
|
+
// 1a. Alias forms ("brutalist", "minimalist") → canonical slug.
|
|
135
|
+
for (const [alias, slug] of Object.entries(ALIASES)) {
|
|
136
|
+
if (slugs.includes(slug) && new RegExp(`\\b${alias}\\b`).test(t)) {
|
|
137
|
+
const skillText = loadSkill(projectRoot, slug);
|
|
138
|
+
if (skillText)
|
|
139
|
+
return { slug, name: titleCase(slug), skillText, matchedByName: true };
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// 1b. Explicit style named in the task wins, even if it's not obviously "web"
|
|
143
|
+
// (e.g. "give the page a brutalist look").
|
|
144
|
+
const named = slugs.find(s => {
|
|
145
|
+
// match the slug or its spaced/title form as a whole word
|
|
146
|
+
const forms = new Set([s, s.replace(/-/g, ' '), titleCase(s).toLowerCase()]);
|
|
147
|
+
return [...forms].some(f => new RegExp(`\\b${f.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\b`).test(t));
|
|
148
|
+
});
|
|
149
|
+
if (named) {
|
|
150
|
+
const skillText = loadSkill(projectRoot, named);
|
|
151
|
+
if (skillText)
|
|
152
|
+
return { slug: named, name: titleCase(named), skillText, matchedByName: true };
|
|
153
|
+
}
|
|
154
|
+
// 2. No explicit style — only inject if this looks like a web/UI build.
|
|
155
|
+
if (!isWebBuildTask(task))
|
|
156
|
+
return null;
|
|
157
|
+
const def = defaultSlug();
|
|
158
|
+
if (def === '__none__')
|
|
159
|
+
return null; // auto-injection disabled via :design off
|
|
160
|
+
const fallback = slugs.includes(def) ? def : slugs[0];
|
|
161
|
+
const skillText = loadSkill(projectRoot, fallback);
|
|
162
|
+
if (!skillText)
|
|
163
|
+
return null;
|
|
164
|
+
return { slug: fallback, name: titleCase(fallback), skillText, matchedByName: false };
|
|
165
|
+
}
|
|
166
|
+
/** Render the design selection as a system-prompt section. */
|
|
167
|
+
function designPromptSection(sel) {
|
|
168
|
+
return (`\n\n## Active design system: ${sel.name}\n` +
|
|
169
|
+
`This is a UI/website task. Build the interface to match the design system below — ` +
|
|
170
|
+
`its colour tokens, typography, spacing, component styles, and accessibility rules are ` +
|
|
171
|
+
`authoritative. Do not fall back to generic defaults.` +
|
|
172
|
+
(sel.matchedByName ? '' : ` (Default style "${sel.slug}"; the user can name another, e.g. "make it luxury" or ":design <slug>".)`) +
|
|
173
|
+
`\n\n${sel.skillText}\n`);
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=design.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"design.js","sourceRoot":"","sources":["../../src/agent/design.ts"],"names":[],"mappings":"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"}
|
package/dist/agent/loop.js
CHANGED
|
@@ -42,6 +42,7 @@ const system_prompt_js_1 = require("./system-prompt.js");
|
|
|
42
42
|
const defaults_js_1 = require("../config/defaults.js");
|
|
43
43
|
const session_store_js_1 = require("./session-store.js");
|
|
44
44
|
const spawner_js_1 = require("./spawner.js");
|
|
45
|
+
const compactor_js_1 = require("./compactor.js");
|
|
45
46
|
const PRICING_USD_PER_MTOK = {
|
|
46
47
|
'claude-opus-4-5-20251001': { in: 15, out: 75 },
|
|
47
48
|
'claude-sonnet-4-5-20251001': { in: 3, out: 15 },
|
|
@@ -63,7 +64,7 @@ async function runAgentLoop(opts) {
|
|
|
63
64
|
const { provider, task, context, permissions, display } = opts;
|
|
64
65
|
const maxTurns = opts.maxTurns ?? defaults_js_1.DEFAULTS.maxTurns;
|
|
65
66
|
const pricingModel = opts.pricingModel ?? provider.model;
|
|
66
|
-
const system = (0, system_prompt_js_1.buildSystemPrompt)(context, provider.name);
|
|
67
|
+
const system = (0, system_prompt_js_1.buildSystemPrompt)(context, provider.name, task);
|
|
67
68
|
const history = [
|
|
68
69
|
...(opts.initialHistory ?? []),
|
|
69
70
|
{ role: 'user', content: task },
|
|
@@ -88,6 +89,12 @@ async function runLoopBody(args) {
|
|
|
88
89
|
const toolCallLog = [];
|
|
89
90
|
while (turns < maxTurns) {
|
|
90
91
|
turns++;
|
|
92
|
+
// Compact BEFORE the next provider call, using the size of the payload we
|
|
93
|
+
// are about to send (system + current history), measured locally. This was
|
|
94
|
+
// previously driven by `usage.totalTokens`, which stays 0 whenever the
|
|
95
|
+
// provider omits streamed usage — so compaction silently never fired and
|
|
96
|
+
// history grew until the provider rejected the request. See compactor.ts.
|
|
97
|
+
(0, compactor_js_1.compactHistory)(history, (0, compactor_js_1.estimateContextTokens)(system, history), provider.model);
|
|
91
98
|
let responseText = '';
|
|
92
99
|
const responseToolCalls = [];
|
|
93
100
|
let finalResponse = null;
|
package/dist/agent/loop.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/agent/loop.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/agent/loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { ProjectContext } from './context.js';
|
|
2
|
-
export declare function buildSystemPrompt(ctx: ProjectContext, providerName: string): string;
|
|
2
|
+
export declare function buildSystemPrompt(ctx: ProjectContext, providerName: string, task?: string): string;
|
|
3
3
|
export declare function buildArchitectPrompt(task: string, projectRoot: string): string;
|
|
@@ -2,7 +2,10 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.buildSystemPrompt = buildSystemPrompt;
|
|
4
4
|
exports.buildArchitectPrompt = buildArchitectPrompt;
|
|
5
|
-
|
|
5
|
+
const design_js_1 = require("./design.js");
|
|
6
|
+
function buildSystemPrompt(ctx, providerName, task) {
|
|
7
|
+
const design = task ? (0, design_js_1.selectDesign)(ctx.root, task) : null;
|
|
8
|
+
const designSection = design ? (0, design_js_1.designPromptSection)(design) : '';
|
|
6
9
|
return `You are Aura — a precise, efficient AI coding agent.
|
|
7
10
|
You are working in a ${ctx.language} project called "${ctx.name}" (${ctx.framework}).
|
|
8
11
|
|
|
@@ -68,7 +71,7 @@ ${ctx.readme}
|
|
|
68
71
|
### Recent git history
|
|
69
72
|
${ctx.recentCommits}
|
|
70
73
|
|
|
71
|
-
Provider: ${providerName}. Work efficiently — minimize unnecessary tool calls
|
|
74
|
+
Provider: ${providerName}. Work efficiently — minimize unnecessary tool calls.${designSection}`;
|
|
72
75
|
}
|
|
73
76
|
function buildArchitectPrompt(task, projectRoot) {
|
|
74
77
|
return `You are in architect mode. You are planning the implementation for: "${task}"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/agent/system-prompt.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/agent/system-prompt.ts"],"names":[],"mappings":";;AAGA,8CAqEC;AAED,oDAmCC;AA5GD,2CAAgE;AAEhE,SAAgB,iBAAiB,CAAC,GAAmB,EAAE,YAAoB,EAAE,IAAa;IACxF,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAA,wBAAY,EAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1D,MAAM,aAAa,GAAG,MAAM,CAAC,CAAC,CAAC,IAAA,+BAAmB,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,OAAO;uBACc,GAAG,CAAC,QAAQ,oBAAoB,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YA4CtE,GAAG,CAAC,QAAQ;aACX,GAAG,CAAC,SAAS;QAClB,GAAG,CAAC,IAAI;;;;EAId,GAAG,CAAC,IAAI;;;;;EAKR,GAAG,CAAC,MAAM;;;;EAIV,GAAG,CAAC,MAAM;;;EAGV,GAAG,CAAC,aAAa;;YAEP,YAAY,wDAAwD,aAAa,EAAE,CAAC;AAChG,CAAC;AAED,SAAgB,oBAAoB,CAAC,IAAY,EAAE,WAAmB;IACpE,OAAO,wEAAwE,IAAI;;gBAErE,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+BzB,CAAC;AACH,CAAC"}
|