@sudodevstudio/astro-ai 0.1.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/LICENSE +21 -0
- package/README.md +114 -0
- package/dist/agent/agent-fallback.d.ts +50 -0
- package/dist/agent/agent-fallback.d.ts.map +1 -0
- package/dist/agent/agent-fallback.js +31 -0
- package/dist/agent/agent-fallback.js.map +1 -0
- package/dist/agent/cli-agent-fallback.d.ts +79 -0
- package/dist/agent/cli-agent-fallback.d.ts.map +1 -0
- package/dist/agent/cli-agent-fallback.js +1056 -0
- package/dist/agent/cli-agent-fallback.js.map +1 -0
- package/dist/integration/index.d.ts +28 -0
- package/dist/integration/index.d.ts.map +1 -0
- package/dist/integration/index.js +389 -0
- package/dist/integration/index.js.map +1 -0
- package/dist/resolver/astro-resolver.d.ts +28 -0
- package/dist/resolver/astro-resolver.d.ts.map +1 -0
- package/dist/resolver/astro-resolver.js +835 -0
- package/dist/resolver/astro-resolver.js.map +1 -0
- package/dist/resolver/types.d.ts +39 -0
- package/dist/resolver/types.d.ts.map +1 -0
- package/dist/resolver/types.js +2 -0
- package/dist/resolver/types.js.map +1 -0
- package/dist/shared/protocol.d.ts +150 -0
- package/dist/shared/protocol.d.ts.map +1 -0
- package/dist/shared/protocol.js +28 -0
- package/dist/shared/protocol.js.map +1 -0
- package/dist/shared/selection-context.d.ts +75 -0
- package/dist/shared/selection-context.d.ts.map +1 -0
- package/dist/shared/selection-context.js +2 -0
- package/dist/shared/selection-context.js.map +1 -0
- package/dist/shared/visual-components.d.ts +15 -0
- package/dist/shared/visual-components.d.ts.map +1 -0
- package/dist/shared/visual-components.js +2 -0
- package/dist/shared/visual-components.js.map +1 -0
- package/dist/toolbar/action-model.d.ts +20 -0
- package/dist/toolbar/action-model.d.ts.map +1 -0
- package/dist/toolbar/action-model.js +49 -0
- package/dist/toolbar/action-model.js.map +1 -0
- package/dist/toolbar/app.d.ts +3 -0
- package/dist/toolbar/app.d.ts.map +1 -0
- package/dist/toolbar/app.js +274 -0
- package/dist/toolbar/app.js.map +1 -0
- package/dist/toolbar/chat-drawer.d.ts +111 -0
- package/dist/toolbar/chat-drawer.d.ts.map +1 -0
- package/dist/toolbar/chat-drawer.js +1575 -0
- package/dist/toolbar/chat-drawer.js.map +1 -0
- package/dist/toolbar/chat-windows.d.ts +62 -0
- package/dist/toolbar/chat-windows.d.ts.map +1 -0
- package/dist/toolbar/chat-windows.js +287 -0
- package/dist/toolbar/chat-windows.js.map +1 -0
- package/dist/toolbar/contextual-actions.d.ts +24 -0
- package/dist/toolbar/contextual-actions.d.ts.map +1 -0
- package/dist/toolbar/contextual-actions.js +371 -0
- package/dist/toolbar/contextual-actions.js.map +1 -0
- package/dist/toolbar/diagnostic-actions.d.ts +22 -0
- package/dist/toolbar/diagnostic-actions.d.ts.map +1 -0
- package/dist/toolbar/diagnostic-actions.js +127 -0
- package/dist/toolbar/diagnostic-actions.js.map +1 -0
- package/dist/toolbar/layers.d.ts +26 -0
- package/dist/toolbar/layers.d.ts.map +1 -0
- package/dist/toolbar/layers.js +31 -0
- package/dist/toolbar/layers.js.map +1 -0
- package/dist/toolbar/overlay.d.ts +40 -0
- package/dist/toolbar/overlay.d.ts.map +1 -0
- package/dist/toolbar/overlay.js +619 -0
- package/dist/toolbar/overlay.js.map +1 -0
- package/dist/visual/capability-resolver.d.ts +11 -0
- package/dist/visual/capability-resolver.d.ts.map +1 -0
- package/dist/visual/capability-resolver.js +69 -0
- package/dist/visual/capability-resolver.js.map +1 -0
- package/dist/visual/command-engine.d.ts +10 -0
- package/dist/visual/command-engine.d.ts.map +1 -0
- package/dist/visual/command-engine.js +199 -0
- package/dist/visual/command-engine.js.map +1 -0
- package/dist/visual/commands.d.ts +36 -0
- package/dist/visual/commands.d.ts.map +1 -0
- package/dist/visual/commands.js +2 -0
- package/dist/visual/commands.js.map +1 -0
- package/dist/visual/patch-transactions.d.ts +57 -0
- package/dist/visual/patch-transactions.d.ts.map +1 -0
- package/dist/visual/patch-transactions.js +259 -0
- package/dist/visual/patch-transactions.js.map +1 -0
- package/dist/vite/build-ai-plugin.d.ts +11 -0
- package/dist/vite/build-ai-plugin.d.ts.map +1 -0
- package/dist/vite/build-ai-plugin.js +45 -0
- package/dist/vite/build-ai-plugin.js.map +1 -0
- package/package.json +85 -0
- package/src/agent/agent-fallback.ts +95 -0
- package/src/agent/cli-agent-fallback.ts +1382 -0
- package/src/integration/index.ts +475 -0
- package/src/resolver/astro-resolver.ts +1024 -0
- package/src/resolver/types.ts +47 -0
- package/src/shared/protocol.ts +181 -0
- package/src/shared/selection-context.ts +91 -0
- package/src/shared/visual-components.ts +16 -0
- package/src/toolbar/action-model.ts +67 -0
- package/src/toolbar/app.ts +294 -0
- package/src/toolbar/chat-drawer.ts +1742 -0
- package/src/toolbar/chat-windows.ts +331 -0
- package/src/toolbar/contextual-actions.ts +401 -0
- package/src/toolbar/diagnostic-actions.ts +151 -0
- package/src/toolbar/layers.ts +32 -0
- package/src/toolbar/overlay.ts +638 -0
- package/src/visual/capability-resolver.ts +83 -0
- package/src/visual/command-engine.ts +250 -0
- package/src/visual/commands.ts +37 -0
- package/src/visual/patch-transactions.ts +270 -0
- package/src/vite/build-ai-plugin.ts +46 -0
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { mkdir, readFile, readdir, rename, rm, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
const DEFAULT_MAX_RECOVERY_FILES = 20;
|
|
5
|
+
export class PatchTransactionStore {
|
|
6
|
+
#resolver;
|
|
7
|
+
#hooks;
|
|
8
|
+
#historyFile;
|
|
9
|
+
#undoStack = [];
|
|
10
|
+
#redoStack = [];
|
|
11
|
+
#readyPromise;
|
|
12
|
+
constructor(resolver, hooks = {}) {
|
|
13
|
+
this.#resolver = resolver;
|
|
14
|
+
this.#hooks = hooks;
|
|
15
|
+
this.#historyFile = hooks.historyFile === undefined
|
|
16
|
+
? join(resolver.projectRoot, '.astro', 'astro-ai', 'transactions.json')
|
|
17
|
+
: hooks.historyFile;
|
|
18
|
+
this.#readyPromise = this.#load();
|
|
19
|
+
}
|
|
20
|
+
ready() { return this.#readyPromise; }
|
|
21
|
+
commit(kind, file, before, after) {
|
|
22
|
+
return this.commitBatch(kind, [{ file, before, after }]);
|
|
23
|
+
}
|
|
24
|
+
async commitBatch(kind, proposed) {
|
|
25
|
+
await this.ready();
|
|
26
|
+
const normalized = proposed.filter(({ before, after }) => before !== after).map(({ file, before, after }) => ({
|
|
27
|
+
file: this.#resolver.toProjectPath(file),
|
|
28
|
+
...(before === undefined ? {} : { before }),
|
|
29
|
+
...(after === undefined ? {} : { after }),
|
|
30
|
+
}));
|
|
31
|
+
if (normalized.length === 0)
|
|
32
|
+
throw new Error('The operation would not change the source.');
|
|
33
|
+
const changes = [];
|
|
34
|
+
const conflicts = [];
|
|
35
|
+
for (const change of normalized) {
|
|
36
|
+
const current = await readOptional(this.#resolver.toAbsoluteProjectFile(change.file));
|
|
37
|
+
const merged = reconcileChange(change.before, change.after, current);
|
|
38
|
+
if (!merged.ok) {
|
|
39
|
+
conflicts.push({ file: change.file, reason: merged.reason });
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
changes.push({ file: change.file, ...(current === undefined ? {} : { before: current }), ...(merged.after === undefined ? {} : { after: merged.after }) });
|
|
43
|
+
}
|
|
44
|
+
if (conflicts.length > 0)
|
|
45
|
+
await this.#writeRecovery(normalized, conflicts);
|
|
46
|
+
if (changes.length === 0) {
|
|
47
|
+
throw new Error(`No files were applied because the source changed during the agent run. The generated diff was saved for recovery. Conflicts: ${conflicts.map(({ file }) => file).join(', ')}`);
|
|
48
|
+
}
|
|
49
|
+
await this.#applyWithBoundary(changes, 'after', 'before');
|
|
50
|
+
const transaction = { id: randomUUID(), kind, changes, createdAt: new Date().toISOString() };
|
|
51
|
+
this.#undoStack.push(transaction);
|
|
52
|
+
this.#redoStack.length = 0;
|
|
53
|
+
await this.#persist();
|
|
54
|
+
return summarize(transaction, conflicts);
|
|
55
|
+
}
|
|
56
|
+
async undo() {
|
|
57
|
+
await this.ready();
|
|
58
|
+
const skipped = [];
|
|
59
|
+
while (this.#undoStack.length > 0) {
|
|
60
|
+
const transaction = this.#undoStack.pop();
|
|
61
|
+
if (transaction === undefined)
|
|
62
|
+
break;
|
|
63
|
+
const { compatible, conflicts } = await this.#compatibleChanges(transaction.changes, 'after');
|
|
64
|
+
skipped.push(...conflicts);
|
|
65
|
+
if (compatible.length === 0)
|
|
66
|
+
continue;
|
|
67
|
+
await this.#applyWithBoundary(compatible, 'before', 'after');
|
|
68
|
+
const applied = { ...transaction, changes: compatible };
|
|
69
|
+
this.#redoStack.push(applied);
|
|
70
|
+
await this.#persist();
|
|
71
|
+
return summarize(applied, skipped);
|
|
72
|
+
}
|
|
73
|
+
await this.#persist();
|
|
74
|
+
if (skipped.length > 0)
|
|
75
|
+
throw new Error('Undo skipped externally modified transactions; no older compatible transaction remains.');
|
|
76
|
+
throw new Error('There is no visual operation to undo.');
|
|
77
|
+
}
|
|
78
|
+
async redo() {
|
|
79
|
+
await this.ready();
|
|
80
|
+
const skipped = [];
|
|
81
|
+
while (this.#redoStack.length > 0) {
|
|
82
|
+
const transaction = this.#redoStack.pop();
|
|
83
|
+
if (transaction === undefined)
|
|
84
|
+
break;
|
|
85
|
+
const { compatible, conflicts } = await this.#compatibleChanges(transaction.changes, 'before');
|
|
86
|
+
skipped.push(...conflicts);
|
|
87
|
+
if (compatible.length === 0)
|
|
88
|
+
continue;
|
|
89
|
+
await this.#applyWithBoundary(compatible, 'after', 'before');
|
|
90
|
+
const applied = { ...transaction, changes: compatible };
|
|
91
|
+
this.#undoStack.push(applied);
|
|
92
|
+
await this.#persist();
|
|
93
|
+
return summarize(applied, skipped);
|
|
94
|
+
}
|
|
95
|
+
await this.#persist();
|
|
96
|
+
if (skipped.length > 0)
|
|
97
|
+
throw new Error('Redo skipped externally modified transactions; no older compatible transaction remains.');
|
|
98
|
+
throw new Error('There is no visual operation to redo.');
|
|
99
|
+
}
|
|
100
|
+
state() {
|
|
101
|
+
const undo = this.#undoStack.at(-1);
|
|
102
|
+
const redo = this.#redoStack.at(-1);
|
|
103
|
+
return { canUndo: undo !== undefined, canRedo: redo !== undefined, ...(undo === undefined ? {} : { undoLabel: undo.kind }), ...(redo === undefined ? {} : { redoLabel: redo.kind }) };
|
|
104
|
+
}
|
|
105
|
+
async #compatibleChanges(changes, expectedKey) {
|
|
106
|
+
const compatible = [];
|
|
107
|
+
const conflicts = [];
|
|
108
|
+
for (const change of changes) {
|
|
109
|
+
const current = await readOptional(this.#resolver.toAbsoluteProjectFile(change.file));
|
|
110
|
+
if (current === change[expectedKey])
|
|
111
|
+
compatible.push(change);
|
|
112
|
+
else
|
|
113
|
+
conflicts.push({ file: change.file, reason: 'The file was changed outside this transaction and was left untouched.' });
|
|
114
|
+
}
|
|
115
|
+
return { compatible, conflicts };
|
|
116
|
+
}
|
|
117
|
+
async #applyWithRollback(changes, targetKey, rollbackKey) {
|
|
118
|
+
const applied = [];
|
|
119
|
+
try {
|
|
120
|
+
for (const change of changes) {
|
|
121
|
+
await this.#write(change.file, change[targetKey]);
|
|
122
|
+
applied.push(change);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
for (const change of applied.reverse())
|
|
127
|
+
await this.#write(change.file, change[rollbackKey]);
|
|
128
|
+
throw error;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
async #applyWithBoundary(changes, targetKey, rollbackKey) {
|
|
132
|
+
const absoluteFiles = changes.map(({ file }) => this.#resolver.toAbsoluteProjectFile(file));
|
|
133
|
+
await this.#hooks.beforeApply?.(absoluteFiles);
|
|
134
|
+
try {
|
|
135
|
+
await this.#applyWithRollback(changes, targetKey, rollbackKey);
|
|
136
|
+
}
|
|
137
|
+
finally {
|
|
138
|
+
await this.#hooks.afterApply?.(absoluteFiles);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
async #write(projectFile, content) {
|
|
142
|
+
const absoluteFile = this.#resolver.toAbsoluteProjectFile(projectFile);
|
|
143
|
+
if (content === undefined) {
|
|
144
|
+
await rm(absoluteFile, { force: true });
|
|
145
|
+
if (isSourceFile(absoluteFile))
|
|
146
|
+
this.#resolver.removeFile(absoluteFile);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
await mkdir(dirname(absoluteFile), { recursive: true });
|
|
150
|
+
await writeFile(absoluteFile, content, 'utf8');
|
|
151
|
+
// Vite's watcher is the single re-indexing path, avoiding a duplicate parse.
|
|
152
|
+
}
|
|
153
|
+
async #load() {
|
|
154
|
+
if (this.#historyFile === false)
|
|
155
|
+
return;
|
|
156
|
+
try {
|
|
157
|
+
const parsed = JSON.parse(await readFile(this.#historyFile, 'utf8'));
|
|
158
|
+
if (parsed.version !== 1 || !Array.isArray(parsed.undo) || !Array.isArray(parsed.redo)) {
|
|
159
|
+
this.#hooks.onHistoryWarning?.(`Ignored invalid visual transaction history at ${this.#historyFile}. Delete the file to reset undo history.`);
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
this.#undoStack.push(...parsed.undo.slice(-50));
|
|
163
|
+
this.#redoStack.push(...parsed.redo.slice(-50));
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
if (isNotFound(error))
|
|
167
|
+
return;
|
|
168
|
+
const detail = error instanceof Error ? error.message : 'unknown read error';
|
|
169
|
+
this.#hooks.onHistoryWarning?.(`Could not load visual transaction history at ${this.#historyFile}: ${detail}. Delete the file to reset undo history.`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
async #persist() {
|
|
173
|
+
if (this.#historyFile === false)
|
|
174
|
+
return;
|
|
175
|
+
await mkdir(dirname(this.#historyFile), { recursive: true });
|
|
176
|
+
const temporary = `${this.#historyFile}.${process.pid}.tmp`;
|
|
177
|
+
await writeFile(temporary, JSON.stringify({ version: 1, undo: this.#undoStack.slice(-50), redo: this.#redoStack.slice(-50) }), 'utf8');
|
|
178
|
+
await rename(temporary, this.#historyFile);
|
|
179
|
+
}
|
|
180
|
+
async #writeRecovery(changes, conflicts) {
|
|
181
|
+
if (this.#historyFile === false)
|
|
182
|
+
return;
|
|
183
|
+
const recovery = join(dirname(this.#historyFile), 'recovery', `${Date.now()}-${randomUUID()}.diff`);
|
|
184
|
+
await mkdir(dirname(recovery), { recursive: true });
|
|
185
|
+
await writeFile(recovery, renderDiff(changes), 'utf8');
|
|
186
|
+
await pruneRecoveryDirectory(dirname(recovery), this.#hooks.maxRecoveryFiles ?? DEFAULT_MAX_RECOVERY_FILES);
|
|
187
|
+
for (const conflict of conflicts)
|
|
188
|
+
conflict.recoveryFile = recovery;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
export async function pruneRecoveryDirectory(directory, maximumFiles = DEFAULT_MAX_RECOVERY_FILES) {
|
|
192
|
+
const entries = await readdir(directory, { withFileTypes: true });
|
|
193
|
+
const stale = entries
|
|
194
|
+
.filter((entry) => entry.isFile() && entry.name.endsWith('.diff'))
|
|
195
|
+
.map(({ name }) => name)
|
|
196
|
+
.sort((left, right) => right.localeCompare(left))
|
|
197
|
+
.slice(Math.max(0, maximumFiles));
|
|
198
|
+
await Promise.all(stale.map((name) => rm(join(directory, name), { force: true })));
|
|
199
|
+
}
|
|
200
|
+
function reconcileChange(before, after, current) {
|
|
201
|
+
if (current === before)
|
|
202
|
+
return { ok: true, ...(after === undefined ? {} : { after }) };
|
|
203
|
+
if (before === undefined || after === undefined || current === undefined)
|
|
204
|
+
return { ok: false, reason: 'The file was created, removed, or replaced externally.' };
|
|
205
|
+
const merged = mergeSingleRegion(before, after, current);
|
|
206
|
+
return merged === undefined ? { ok: false, reason: 'The generated edit overlaps an external edit.' } : { ok: true, after: merged };
|
|
207
|
+
}
|
|
208
|
+
/** Applies a generated single-region edit when the same source region remains unique in current text. */
|
|
209
|
+
export function mergeSingleRegion(base, generated, current) {
|
|
210
|
+
let prefix = 0;
|
|
211
|
+
while (prefix < base.length && prefix < generated.length && base[prefix] === generated[prefix])
|
|
212
|
+
prefix += 1;
|
|
213
|
+
let suffix = 0;
|
|
214
|
+
while (suffix < base.length - prefix && suffix < generated.length - prefix && base[base.length - 1 - suffix] === generated[generated.length - 1 - suffix])
|
|
215
|
+
suffix += 1;
|
|
216
|
+
const removed = base.slice(prefix, base.length - suffix);
|
|
217
|
+
const inserted = generated.slice(prefix, generated.length - suffix);
|
|
218
|
+
if (removed === '') {
|
|
219
|
+
const left = base.slice(Math.max(0, prefix - 32), prefix);
|
|
220
|
+
const right = base.slice(prefix, Math.min(base.length, prefix + 32));
|
|
221
|
+
const anchor = `${left}${right}`;
|
|
222
|
+
const index = current.indexOf(anchor);
|
|
223
|
+
if (anchor === '' || index < 0 || current.indexOf(anchor, index + 1) >= 0)
|
|
224
|
+
return undefined;
|
|
225
|
+
return `${current.slice(0, index + left.length)}${inserted}${current.slice(index + left.length)}`;
|
|
226
|
+
}
|
|
227
|
+
const index = current.indexOf(removed);
|
|
228
|
+
if (index < 0 || current.indexOf(removed, index + 1) >= 0)
|
|
229
|
+
return undefined;
|
|
230
|
+
return `${current.slice(0, index)}${inserted}${current.slice(index + removed.length)}`;
|
|
231
|
+
}
|
|
232
|
+
function isSourceFile(file) { return /\.(?:astro|jsx?|tsx?)$/.test(file); }
|
|
233
|
+
async function readOptional(file) { try {
|
|
234
|
+
return await readFile(file, 'utf8');
|
|
235
|
+
}
|
|
236
|
+
catch (error) {
|
|
237
|
+
if (isNotFound(error))
|
|
238
|
+
return undefined;
|
|
239
|
+
throw error;
|
|
240
|
+
} }
|
|
241
|
+
function isNotFound(error) { return typeof error === 'object' && error !== null && 'code' in error && error.code === 'ENOENT'; }
|
|
242
|
+
function summarize(transaction, conflicts = []) {
|
|
243
|
+
const files = transaction.changes.map(({ file }) => file);
|
|
244
|
+
return { id: transaction.id, kind: transaction.kind, file: files[0] ?? '', files, createdAt: transaction.createdAt, diff: renderDiff(transaction.changes), ...(conflicts.length === 0 ? {} : { conflicts }) };
|
|
245
|
+
}
|
|
246
|
+
export function renderDiff(changes) {
|
|
247
|
+
return changes.map(({ file, before = '', after = '' }) => {
|
|
248
|
+
const beforeLines = before.split('\n');
|
|
249
|
+
const afterLines = after.split('\n');
|
|
250
|
+
let prefix = 0;
|
|
251
|
+
while (prefix < beforeLines.length && prefix < afterLines.length && beforeLines[prefix] === afterLines[prefix])
|
|
252
|
+
prefix += 1;
|
|
253
|
+
let suffix = 0;
|
|
254
|
+
while (suffix < beforeLines.length - prefix && suffix < afterLines.length - prefix && beforeLines[beforeLines.length - 1 - suffix] === afterLines[afterLines.length - 1 - suffix])
|
|
255
|
+
suffix += 1;
|
|
256
|
+
return [`--- a/${file}`, `+++ b/${file}`, `@@ ${prefix + 1} @@`, ...beforeLines.slice(prefix, beforeLines.length - suffix).map((line) => `-${line}`), ...afterLines.slice(prefix, afterLines.length - suffix).map((line) => `+${line}`)].join('\n');
|
|
257
|
+
}).join('\n\n');
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=patch-transactions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patch-transactions.js","sourceRoot":"","sources":["../../src/visual/patch-transactions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Plugin } from 'vite';
|
|
2
|
+
import type { AstroResolver } from '../resolver/astro-resolver.js';
|
|
3
|
+
export declare const BUILD_AI_VITE_PLUGIN_NAME: "astro-ai:dev";
|
|
4
|
+
/**
|
|
5
|
+
* Instruments original Astro and React JSX source before framework compiler
|
|
6
|
+
* transforms. The ordered pre-hook keeps source ranges aligned with the files
|
|
7
|
+
* that deterministic operations edit.
|
|
8
|
+
*/
|
|
9
|
+
export declare function buildAIVitePlugin(resolver: AstroResolver): Plugin;
|
|
10
|
+
export declare function sourceFileFromId(id: string): string | undefined;
|
|
11
|
+
//# sourceMappingURL=build-ai-plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-ai-plugin.d.ts","sourceRoot":"","sources":["../../src/vite/build-ai-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAEnE,eAAO,MAAM,yBAAyB,EAAG,cAAuB,CAAC;AAEjE;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAqBjE;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAO/D"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export const BUILD_AI_VITE_PLUGIN_NAME = 'astro-ai:dev';
|
|
2
|
+
/**
|
|
3
|
+
* Instruments original Astro and React JSX source before framework compiler
|
|
4
|
+
* transforms. The ordered pre-hook keeps source ranges aligned with the files
|
|
5
|
+
* that deterministic operations edit.
|
|
6
|
+
*/
|
|
7
|
+
export function buildAIVitePlugin(resolver) {
|
|
8
|
+
return {
|
|
9
|
+
name: BUILD_AI_VITE_PLUGIN_NAME,
|
|
10
|
+
apply: 'serve',
|
|
11
|
+
enforce: 'pre',
|
|
12
|
+
transform: {
|
|
13
|
+
order: 'pre',
|
|
14
|
+
handler(source, id) {
|
|
15
|
+
const file = sourceFileFromId(id);
|
|
16
|
+
if (file === undefined || !resolver.ownsFile(file)) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
return resolver.instrumentFile(file, source);
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
configureServer(server) {
|
|
23
|
+
server.watcher.on('unlink', (file) => {
|
|
24
|
+
if (isSupportedSourceId(file) && resolver.ownsFile(file))
|
|
25
|
+
resolver.removeFile(file);
|
|
26
|
+
});
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export function sourceFileFromId(id) {
|
|
31
|
+
const [file, query = ''] = id.split('?', 2);
|
|
32
|
+
if (file === undefined || file.split(/[\\/]/).includes('node_modules'))
|
|
33
|
+
return undefined;
|
|
34
|
+
if (!/\.(?:astro|jsx?|tsx?)$/.test(file))
|
|
35
|
+
return undefined;
|
|
36
|
+
if (file.endsWith('.astro') && query !== '')
|
|
37
|
+
return undefined;
|
|
38
|
+
if (query !== '' && /(?:^|&)(?:astro|type|lang)\b/.test(query))
|
|
39
|
+
return undefined;
|
|
40
|
+
return file;
|
|
41
|
+
}
|
|
42
|
+
function isSupportedSourceId(id) {
|
|
43
|
+
return sourceFileFromId(id) !== undefined;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=build-ai-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-ai-plugin.js","sourceRoot":"","sources":["../../src/vite/build-ai-plugin.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,yBAAyB,GAAG,cAAuB,CAAC;AAEjE;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAuB;IACvD,OAAO;QACL,IAAI,EAAE,yBAAyB;QAC/B,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,KAAK;QACd,SAAS,EAAE;YACT,KAAK,EAAE,KAAK;YACZ,OAAO,CAAC,MAAM,EAAE,EAAE;gBAChB,MAAM,IAAI,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBAClC,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBACnD,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,OAAO,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC/C,CAAC;SACF;QACD,eAAe,CAAC,MAAM;YACpB,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;gBACnC,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACtF,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAU;IACzC,MAAM,CAAC,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC5C,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC;QAAE,OAAO,SAAS,CAAC;IACzF,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3D,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAC9D,IAAI,KAAK,KAAK,EAAE,IAAI,8BAA8B,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACjF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,mBAAmB,CAAC,EAAU;IACrC,OAAO,gBAAgB,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC;AAC5C,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@sudodevstudio/astro-ai",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Development-only Build with AI tooling for Astro projects.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Maninderpreet Singh",
|
|
7
|
+
"homepage": "https://github.com/SudoDevStudio/astro-ai#readme",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/SudoDevStudio/astro-ai.git",
|
|
11
|
+
"directory": "packages/astro-ai"
|
|
12
|
+
},
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/SudoDevStudio/astro-ai/issues"
|
|
15
|
+
},
|
|
16
|
+
"publishConfig": {
|
|
17
|
+
"access": "public"
|
|
18
|
+
},
|
|
19
|
+
"keywords": [
|
|
20
|
+
"astro-integration",
|
|
21
|
+
"astro-component",
|
|
22
|
+
"withastro",
|
|
23
|
+
"astro",
|
|
24
|
+
"visual-editor",
|
|
25
|
+
"devtools",
|
|
26
|
+
"vite",
|
|
27
|
+
"codex",
|
|
28
|
+
"claude",
|
|
29
|
+
"development-tools"
|
|
30
|
+
],
|
|
31
|
+
"type": "module",
|
|
32
|
+
"engines": {
|
|
33
|
+
"node": ">=22.12.0"
|
|
34
|
+
},
|
|
35
|
+
"exports": {
|
|
36
|
+
".": {
|
|
37
|
+
"types": "./dist/integration/index.d.ts",
|
|
38
|
+
"import": "./dist/integration/index.js"
|
|
39
|
+
},
|
|
40
|
+
"./protocol": {
|
|
41
|
+
"types": "./dist/shared/protocol.d.ts",
|
|
42
|
+
"import": "./dist/shared/protocol.js"
|
|
43
|
+
},
|
|
44
|
+
"./package.json": "./package.json"
|
|
45
|
+
},
|
|
46
|
+
"files": [
|
|
47
|
+
"dist",
|
|
48
|
+
"src"
|
|
49
|
+
],
|
|
50
|
+
"scripts": {
|
|
51
|
+
"build": "tsc -p tsconfig.build.json",
|
|
52
|
+
"check": "tsc --noEmit",
|
|
53
|
+
"format:check": "prettier --check src/agent/cli-agent-fallback.ts",
|
|
54
|
+
"test": "npm run test:unit",
|
|
55
|
+
"test:all": "npm run test:unit && npm run test:hmr && npm run test:production",
|
|
56
|
+
"test:unit": "npm run build && node --test test/*.test.mjs",
|
|
57
|
+
"test:hmr": "node test/run-live-tests.mjs",
|
|
58
|
+
"test:production": "node test/verify-production.mjs",
|
|
59
|
+
"smoke:hmr": "node test/live-hmr-smoke.mjs",
|
|
60
|
+
"prepare": "npm run build"
|
|
61
|
+
},
|
|
62
|
+
"dependencies": {
|
|
63
|
+
"@astrojs/compiler-rs": "^0.4.0",
|
|
64
|
+
"@babel/parser": "^7.29.8",
|
|
65
|
+
"magic-string": "^1.0.0"
|
|
66
|
+
},
|
|
67
|
+
"peerDependencies": {
|
|
68
|
+
"astro": ">=7.0.0 <8.0.0",
|
|
69
|
+
"vite": ">=7.0.0 <9.0.0"
|
|
70
|
+
},
|
|
71
|
+
"peerDependenciesMeta": {
|
|
72
|
+
"vite": {
|
|
73
|
+
"optional": true
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
"devDependencies": {
|
|
77
|
+
"@types/node": "^22.19.0",
|
|
78
|
+
"astro": "^7.2.9",
|
|
79
|
+
"jsdom": "^29.1.1",
|
|
80
|
+
"prettier": "^3.9.6",
|
|
81
|
+
"typescript": "^6.0.3",
|
|
82
|
+
"vite": "^8.2.2"
|
|
83
|
+
},
|
|
84
|
+
"sideEffects": false
|
|
85
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import type { SelectionContext } from '../shared/selection-context.js';
|
|
2
|
+
import type {
|
|
3
|
+
AgentExternalContext,
|
|
4
|
+
AgentFileAttachment,
|
|
5
|
+
AgentRequestMode,
|
|
6
|
+
} from '../shared/protocol.js';
|
|
7
|
+
import type {
|
|
8
|
+
PatchTransactionStore,
|
|
9
|
+
PatchTransactionSummary,
|
|
10
|
+
} from '../visual/patch-transactions.js';
|
|
11
|
+
|
|
12
|
+
export type AgentFallbackRequest = {
|
|
13
|
+
instruction: string;
|
|
14
|
+
reason: string;
|
|
15
|
+
/** Chat window this run belongs to. Each session keeps its own turns and workspace. */
|
|
16
|
+
sessionId?: string;
|
|
17
|
+
mode?: AgentRequestMode;
|
|
18
|
+
selections?: SelectionContext[];
|
|
19
|
+
/** Project-relative files that the provider may modify. Undefined means project-wide. */
|
|
20
|
+
editableFiles?: string[];
|
|
21
|
+
externalContext?: AgentExternalContext;
|
|
22
|
+
files?: AgentFileAttachment[];
|
|
23
|
+
signal?: AbortSignal;
|
|
24
|
+
onProgress?(state: AgentProgressState, message: string): void;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export type AgentProgressState =
|
|
28
|
+
| 'queued'
|
|
29
|
+
| 'reading'
|
|
30
|
+
| 'editing'
|
|
31
|
+
| 'validation'
|
|
32
|
+
| 'diagnostics'
|
|
33
|
+
| 'tool';
|
|
34
|
+
|
|
35
|
+
export type AgentProviderStatus = {
|
|
36
|
+
provider: string;
|
|
37
|
+
available: boolean;
|
|
38
|
+
authenticated: boolean;
|
|
39
|
+
message: string;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export type AgentFallbackResult = {
|
|
43
|
+
provider?: string;
|
|
44
|
+
response: string;
|
|
45
|
+
transaction?: PatchTransactionSummary;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Boundary for operations rejected by deterministic capability checks.
|
|
50
|
+
* Implementations must apply all proposed file changes through the provided
|
|
51
|
+
* transaction store; browser code never receives provider credentials.
|
|
52
|
+
*/
|
|
53
|
+
export abstract class AgentFallback {
|
|
54
|
+
abstract status(): Promise<AgentProviderStatus>;
|
|
55
|
+
|
|
56
|
+
dispose(): void | Promise<void> {}
|
|
57
|
+
|
|
58
|
+
/** Releases the conversation and workspace held for one closed chat window. */
|
|
59
|
+
closeSession(_sessionId: string): void | Promise<void> {}
|
|
60
|
+
|
|
61
|
+
/** Releases every idle session outside the set the page still has open. */
|
|
62
|
+
retainSessions(_sessionIds: readonly string[]): void | Promise<void> {}
|
|
63
|
+
|
|
64
|
+
abstract execute(
|
|
65
|
+
request: AgentFallbackRequest,
|
|
66
|
+
transactions: PatchTransactionStore,
|
|
67
|
+
): Promise<AgentFallbackResult>;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export class UnavailableAgentFallback extends AgentFallback {
|
|
71
|
+
readonly #message: string;
|
|
72
|
+
|
|
73
|
+
constructor(message = 'No CLI agent provider is configured.') {
|
|
74
|
+
super();
|
|
75
|
+
this.#message = message;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
status(): Promise<AgentProviderStatus> {
|
|
79
|
+
return Promise.resolve({
|
|
80
|
+
provider: 'none',
|
|
81
|
+
available: false,
|
|
82
|
+
authenticated: false,
|
|
83
|
+
message: this.#message,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
execute(
|
|
88
|
+
_request: AgentFallbackRequest,
|
|
89
|
+
_transactions: PatchTransactionStore,
|
|
90
|
+
): Promise<AgentFallbackResult> {
|
|
91
|
+
return Promise.reject(
|
|
92
|
+
new Error(this.#message),
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
}
|