@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.
Files changed (108) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +114 -0
  3. package/dist/agent/agent-fallback.d.ts +50 -0
  4. package/dist/agent/agent-fallback.d.ts.map +1 -0
  5. package/dist/agent/agent-fallback.js +31 -0
  6. package/dist/agent/agent-fallback.js.map +1 -0
  7. package/dist/agent/cli-agent-fallback.d.ts +79 -0
  8. package/dist/agent/cli-agent-fallback.d.ts.map +1 -0
  9. package/dist/agent/cli-agent-fallback.js +1056 -0
  10. package/dist/agent/cli-agent-fallback.js.map +1 -0
  11. package/dist/integration/index.d.ts +28 -0
  12. package/dist/integration/index.d.ts.map +1 -0
  13. package/dist/integration/index.js +389 -0
  14. package/dist/integration/index.js.map +1 -0
  15. package/dist/resolver/astro-resolver.d.ts +28 -0
  16. package/dist/resolver/astro-resolver.d.ts.map +1 -0
  17. package/dist/resolver/astro-resolver.js +835 -0
  18. package/dist/resolver/astro-resolver.js.map +1 -0
  19. package/dist/resolver/types.d.ts +39 -0
  20. package/dist/resolver/types.d.ts.map +1 -0
  21. package/dist/resolver/types.js +2 -0
  22. package/dist/resolver/types.js.map +1 -0
  23. package/dist/shared/protocol.d.ts +150 -0
  24. package/dist/shared/protocol.d.ts.map +1 -0
  25. package/dist/shared/protocol.js +28 -0
  26. package/dist/shared/protocol.js.map +1 -0
  27. package/dist/shared/selection-context.d.ts +75 -0
  28. package/dist/shared/selection-context.d.ts.map +1 -0
  29. package/dist/shared/selection-context.js +2 -0
  30. package/dist/shared/selection-context.js.map +1 -0
  31. package/dist/shared/visual-components.d.ts +15 -0
  32. package/dist/shared/visual-components.d.ts.map +1 -0
  33. package/dist/shared/visual-components.js +2 -0
  34. package/dist/shared/visual-components.js.map +1 -0
  35. package/dist/toolbar/action-model.d.ts +20 -0
  36. package/dist/toolbar/action-model.d.ts.map +1 -0
  37. package/dist/toolbar/action-model.js +49 -0
  38. package/dist/toolbar/action-model.js.map +1 -0
  39. package/dist/toolbar/app.d.ts +3 -0
  40. package/dist/toolbar/app.d.ts.map +1 -0
  41. package/dist/toolbar/app.js +274 -0
  42. package/dist/toolbar/app.js.map +1 -0
  43. package/dist/toolbar/chat-drawer.d.ts +111 -0
  44. package/dist/toolbar/chat-drawer.d.ts.map +1 -0
  45. package/dist/toolbar/chat-drawer.js +1575 -0
  46. package/dist/toolbar/chat-drawer.js.map +1 -0
  47. package/dist/toolbar/chat-windows.d.ts +62 -0
  48. package/dist/toolbar/chat-windows.d.ts.map +1 -0
  49. package/dist/toolbar/chat-windows.js +287 -0
  50. package/dist/toolbar/chat-windows.js.map +1 -0
  51. package/dist/toolbar/contextual-actions.d.ts +24 -0
  52. package/dist/toolbar/contextual-actions.d.ts.map +1 -0
  53. package/dist/toolbar/contextual-actions.js +371 -0
  54. package/dist/toolbar/contextual-actions.js.map +1 -0
  55. package/dist/toolbar/diagnostic-actions.d.ts +22 -0
  56. package/dist/toolbar/diagnostic-actions.d.ts.map +1 -0
  57. package/dist/toolbar/diagnostic-actions.js +127 -0
  58. package/dist/toolbar/diagnostic-actions.js.map +1 -0
  59. package/dist/toolbar/layers.d.ts +26 -0
  60. package/dist/toolbar/layers.d.ts.map +1 -0
  61. package/dist/toolbar/layers.js +31 -0
  62. package/dist/toolbar/layers.js.map +1 -0
  63. package/dist/toolbar/overlay.d.ts +40 -0
  64. package/dist/toolbar/overlay.d.ts.map +1 -0
  65. package/dist/toolbar/overlay.js +619 -0
  66. package/dist/toolbar/overlay.js.map +1 -0
  67. package/dist/visual/capability-resolver.d.ts +11 -0
  68. package/dist/visual/capability-resolver.d.ts.map +1 -0
  69. package/dist/visual/capability-resolver.js +69 -0
  70. package/dist/visual/capability-resolver.js.map +1 -0
  71. package/dist/visual/command-engine.d.ts +10 -0
  72. package/dist/visual/command-engine.d.ts.map +1 -0
  73. package/dist/visual/command-engine.js +199 -0
  74. package/dist/visual/command-engine.js.map +1 -0
  75. package/dist/visual/commands.d.ts +36 -0
  76. package/dist/visual/commands.d.ts.map +1 -0
  77. package/dist/visual/commands.js +2 -0
  78. package/dist/visual/commands.js.map +1 -0
  79. package/dist/visual/patch-transactions.d.ts +57 -0
  80. package/dist/visual/patch-transactions.d.ts.map +1 -0
  81. package/dist/visual/patch-transactions.js +259 -0
  82. package/dist/visual/patch-transactions.js.map +1 -0
  83. package/dist/vite/build-ai-plugin.d.ts +11 -0
  84. package/dist/vite/build-ai-plugin.d.ts.map +1 -0
  85. package/dist/vite/build-ai-plugin.js +45 -0
  86. package/dist/vite/build-ai-plugin.js.map +1 -0
  87. package/package.json +85 -0
  88. package/src/agent/agent-fallback.ts +95 -0
  89. package/src/agent/cli-agent-fallback.ts +1382 -0
  90. package/src/integration/index.ts +475 -0
  91. package/src/resolver/astro-resolver.ts +1024 -0
  92. package/src/resolver/types.ts +47 -0
  93. package/src/shared/protocol.ts +181 -0
  94. package/src/shared/selection-context.ts +91 -0
  95. package/src/shared/visual-components.ts +16 -0
  96. package/src/toolbar/action-model.ts +67 -0
  97. package/src/toolbar/app.ts +294 -0
  98. package/src/toolbar/chat-drawer.ts +1742 -0
  99. package/src/toolbar/chat-windows.ts +331 -0
  100. package/src/toolbar/contextual-actions.ts +401 -0
  101. package/src/toolbar/diagnostic-actions.ts +151 -0
  102. package/src/toolbar/layers.ts +32 -0
  103. package/src/toolbar/overlay.ts +638 -0
  104. package/src/visual/capability-resolver.ts +83 -0
  105. package/src/visual/command-engine.ts +250 -0
  106. package/src/visual/commands.ts +37 -0
  107. package/src/visual/patch-transactions.ts +270 -0
  108. package/src/vite/build-ai-plugin.ts +46 -0
@@ -0,0 +1,371 @@
1
+ import { EDITOR_LAYERS } from './layers.js';
2
+ import { contextualActions, middleTruncatePath, } from './action-model.js';
3
+ export class ContextualActionBar {
4
+ #host;
5
+ #root;
6
+ #callbacks;
7
+ #context;
8
+ #contexts = [];
9
+ #target;
10
+ #point;
11
+ #activeDetail;
12
+ constructor(callbacks) {
13
+ this.#callbacks = callbacks;
14
+ this.#host = document.createElement('div');
15
+ this.#host.dataset.astroAiUi = 'actions';
16
+ Object.assign(this.#host.style, {
17
+ display: 'none',
18
+ position: 'fixed',
19
+ inset: 'auto',
20
+ zIndex: String(EDITOR_LAYERS.actionBar),
21
+ });
22
+ this.#root = this.#host.attachShadow({ mode: 'open' });
23
+ this.#root.append(createStyle());
24
+ document.documentElement.append(this.#host);
25
+ document.addEventListener('keydown', this.#onKeyDown, true);
26
+ }
27
+ show(context, target, point) {
28
+ this.#context = context;
29
+ this.#contexts = [context];
30
+ this.#target = target;
31
+ this.#point = point;
32
+ this.#activeDetail = undefined;
33
+ this.#render();
34
+ this.#host.style.display = 'block';
35
+ requestAnimationFrame(() => this.reposition());
36
+ }
37
+ showMultiple(contexts, target) {
38
+ this.#context = undefined;
39
+ this.#contexts = [...contexts];
40
+ this.#target = target;
41
+ this.#point = undefined;
42
+ this.#activeDetail = undefined;
43
+ this.#render();
44
+ this.#host.style.display = 'block';
45
+ requestAnimationFrame(() => this.reposition());
46
+ }
47
+ hide() {
48
+ this.#context = undefined;
49
+ this.#contexts = [];
50
+ this.#target = undefined;
51
+ this.#point = undefined;
52
+ this.#activeDetail = undefined;
53
+ this.#host.style.display = 'none';
54
+ this.#root.querySelector('section')?.remove();
55
+ }
56
+ reposition() {
57
+ if (this.#contexts.length === 0 || this.#target === undefined)
58
+ return;
59
+ const targetRect = this.#target.getBoundingClientRect();
60
+ const barRect = this.#host.getBoundingClientRect();
61
+ const gap = 8;
62
+ const margin = 8;
63
+ let left;
64
+ let top;
65
+ if (this.#point !== undefined) {
66
+ left = this.#point.x + gap;
67
+ top = this.#point.y + gap;
68
+ }
69
+ else {
70
+ left = targetRect.left;
71
+ top = targetRect.bottom + gap;
72
+ if (top + barRect.height > window.innerHeight - margin) {
73
+ top = targetRect.top - barRect.height - gap;
74
+ }
75
+ if (top < margin) {
76
+ left = targetRect.right + gap;
77
+ top = targetRect.top;
78
+ }
79
+ if (left + barRect.width > window.innerWidth - margin && targetRect.left > barRect.width + gap) {
80
+ left = targetRect.left - barRect.width - gap;
81
+ }
82
+ }
83
+ left = clamp(left, margin, Math.max(margin, window.innerWidth - barRect.width - margin));
84
+ top = clamp(top, margin, Math.max(margin, window.innerHeight - barRect.height - margin));
85
+ this.#host.style.left = `${left}px`;
86
+ this.#host.style.top = `${top}px`;
87
+ }
88
+ destroy() {
89
+ document.removeEventListener('keydown', this.#onKeyDown, true);
90
+ this.#host.remove();
91
+ }
92
+ #render() {
93
+ const previous = this.#root.querySelector('section');
94
+ previous?.remove();
95
+ if (this.#contexts.length === 0)
96
+ return;
97
+ const shell = element('section', 'action-shell');
98
+ shell.setAttribute('role', 'toolbar');
99
+ shell.setAttribute('aria-label', this.#contexts.length === 1
100
+ ? 'Actions for selected source element'
101
+ : `Actions for ${this.#contexts.length} selected source elements`);
102
+ const row = element('div', 'action-row');
103
+ if (this.#contexts.length > 1) {
104
+ const count = element('span', 'selection-count');
105
+ count.textContent = `${this.#contexts.length} selected`;
106
+ row.append(count, button('Ask AI', () => this.#callbacks.onAskAI(this.#contexts)));
107
+ }
108
+ else if (this.#context !== undefined) {
109
+ for (const action of contextualActions(this.#context)) {
110
+ const control = button(action.label, () => this.#activate(action.id));
111
+ control.dataset.action = action.id;
112
+ control.setAttribute('aria-pressed', String(this.#activeDetail === action.id));
113
+ row.append(control);
114
+ }
115
+ }
116
+ const close = button('×', this.#callbacks.onClear);
117
+ close.className = 'close';
118
+ close.title = 'Clear selection (Escape)';
119
+ close.setAttribute('aria-label', 'Clear selection');
120
+ row.append(close);
121
+ shell.append(row);
122
+ const detail = this.#detail();
123
+ if (detail !== undefined)
124
+ shell.append(detail);
125
+ this.#root.append(shell);
126
+ requestAnimationFrame(() => this.reposition());
127
+ }
128
+ #activate(action) {
129
+ if (this.#context === undefined)
130
+ return;
131
+ if (action === 'click') {
132
+ const target = this.#target;
133
+ // The click can navigate or re-render the page, which would leave the bar
134
+ // anchored to a detached element, so dismiss it first.
135
+ if (target !== undefined) {
136
+ this.#callbacks.onClear();
137
+ this.#callbacks.onClickThrough?.(target);
138
+ }
139
+ return;
140
+ }
141
+ if (action === 'ask-ai') {
142
+ this.#callbacks.onAskAI([this.#context]);
143
+ return;
144
+ }
145
+ if (action === 'remove') {
146
+ this.#callbacks.onCommand({ kind: 'remove-source-node', nodeId: this.#context.selectedNode.nodeId });
147
+ return;
148
+ }
149
+ this.#activeDetail = this.#activeDetail === action ? undefined : action;
150
+ this.#render();
151
+ }
152
+ #detail() {
153
+ if (this.#context === undefined || this.#activeDetail === undefined)
154
+ return undefined;
155
+ if (this.#activeDetail === 'edit')
156
+ return this.#editDetail(this.#context);
157
+ if (this.#activeDetail === 'props')
158
+ return this.#propsDetail(this.#context);
159
+ if (this.#activeDetail === 'move')
160
+ return this.#moveDetail(this.#context);
161
+ if (this.#activeDetail === 'source')
162
+ return sourceDetail(this.#context);
163
+ return undefined;
164
+ }
165
+ #editDetail(context) {
166
+ const form = element('form', 'detail');
167
+ const label = document.createElement('label');
168
+ label.textContent = 'Literal source text';
169
+ const input = document.createElement('input');
170
+ input.value = context.selectedNode.literalText ?? '';
171
+ label.append(input);
172
+ const submit = button('Apply locally');
173
+ submit.type = 'submit';
174
+ form.append(label, submit);
175
+ form.addEventListener('submit', (event) => {
176
+ event.preventDefault();
177
+ this.#callbacks.onCommand({
178
+ kind: 'edit-literal-text',
179
+ nodeId: context.selectedNode.nodeId,
180
+ text: input.value,
181
+ });
182
+ });
183
+ requestAnimationFrame(() => input.focus());
184
+ return form;
185
+ }
186
+ #propsDetail(context) {
187
+ const detail = element('div', 'detail');
188
+ for (const prop of context.capabilities.editableProps) {
189
+ const form = element('form', 'prop-row');
190
+ const label = document.createElement('label');
191
+ label.textContent = prop.name;
192
+ const input = prop.allowedValues === undefined
193
+ ? document.createElement('input')
194
+ : document.createElement('select');
195
+ if (input instanceof HTMLSelectElement) {
196
+ for (const value of prop.allowedValues ?? []) {
197
+ const option = document.createElement('option');
198
+ option.value = String(value);
199
+ option.textContent = String(value);
200
+ option.selected = value === prop.value;
201
+ input.append(option);
202
+ }
203
+ }
204
+ else if (prop.type === 'boolean') {
205
+ input.type = 'checkbox';
206
+ input.checked = Boolean(prop.value);
207
+ }
208
+ else {
209
+ input.type = prop.type === 'number' ? 'number' : 'text';
210
+ input.value = String(prop.value);
211
+ }
212
+ const apply = button('Apply');
213
+ apply.type = 'submit';
214
+ label.append(input);
215
+ form.append(label, apply);
216
+ form.addEventListener('submit', (event) => {
217
+ event.preventDefault();
218
+ let value;
219
+ if (prop.type === 'boolean') {
220
+ value = input instanceof HTMLInputElement ? input.checked : input.value === 'true';
221
+ }
222
+ else if (prop.type === 'number') {
223
+ value = Number(input.value);
224
+ }
225
+ else {
226
+ value = input.value;
227
+ }
228
+ this.#callbacks.onCommand({
229
+ kind: 'set-literal-prop',
230
+ nodeId: context.selectedNode.nodeId,
231
+ prop: prop.name,
232
+ value,
233
+ });
234
+ });
235
+ detail.append(form);
236
+ }
237
+ return detail;
238
+ }
239
+ #moveDetail(context) {
240
+ const detail = element('div', 'detail move-row');
241
+ const previous = button('Move before', () => this.#callbacks.onCommand({
242
+ kind: 'reorder-sibling',
243
+ nodeId: context.selectedNode.nodeId,
244
+ direction: 'previous',
245
+ }));
246
+ previous.disabled = context.capabilities.reorderTargets.previous === undefined;
247
+ const next = button('Move after', () => this.#callbacks.onCommand({
248
+ kind: 'reorder-sibling',
249
+ nodeId: context.selectedNode.nodeId,
250
+ direction: 'next',
251
+ }));
252
+ next.disabled = context.capabilities.reorderTargets.next === undefined;
253
+ detail.append(previous, next);
254
+ if (context.capabilities.movable && !context.capabilities.reorderable) {
255
+ const note = element('p', 'muted');
256
+ note.textContent = context.capabilities.allowedParentSlots.length === 0
257
+ ? 'No compatible declared target slot is available in this view.'
258
+ : `Compatible declared slots: ${context.capabilities.allowedParentSlots.join(', ')}. Drag onto a registered target component to move structurally.`;
259
+ detail.append(note);
260
+ }
261
+ return detail;
262
+ }
263
+ #onKeyDown = (event) => {
264
+ if (event.key !== 'Escape' || this.#contexts.length === 0)
265
+ return;
266
+ event.preventDefault();
267
+ event.stopImmediatePropagation();
268
+ if (this.#activeDetail !== undefined) {
269
+ this.#activeDetail = undefined;
270
+ this.#render();
271
+ }
272
+ else {
273
+ this.#callbacks.onClear();
274
+ }
275
+ };
276
+ }
277
+ function sourceDetail(context) {
278
+ const detail = element('div', 'detail source-detail');
279
+ const name = context.selectedNode.componentName ?? context.selectedNode.tagName ?? 'Astro node';
280
+ const source = context.selectedNode.source;
281
+ const path = element('code', 'source-path');
282
+ path.textContent = middleTruncatePath(source.file);
283
+ path.title = source.file;
284
+ detail.append(definition('Element', name), definitionNode('Source', path), definition('Position', `${source.start.line}:${source.start.column}`), definition('Kind', humanize(context.capabilities.sourceKind)));
285
+ const ancestry = context.parentComponents.length === 0
286
+ ? 'Native Astro template'
287
+ : context.parentComponents.map(({ name: parent }) => parent).join(' → ');
288
+ detail.append(definition('Ancestry', ancestry));
289
+ let provenance = context.capabilities.dataProvenance.description;
290
+ const declaredAt = context.capabilities.dataProvenance.declaredAt;
291
+ if (declaredAt !== undefined) {
292
+ provenance += ` Declaration: ${declaredAt.file}:${declaredAt.start.line}:${declaredAt.start.column}.`;
293
+ }
294
+ detail.append(definition('Provenance', provenance));
295
+ if (context.capabilities.repeatContext !== undefined) {
296
+ const warning = element('p', 'warning');
297
+ warning.textContent = 'Repeated template: this source edit affects every rendered instance.';
298
+ detail.append(warning);
299
+ }
300
+ const actions = element('div', 'source-buttons');
301
+ const copy = button('Copy path', () => {
302
+ void navigator.clipboard.writeText(source.file).then(() => { copy.textContent = 'Copied'; }, () => { copy.textContent = 'Copy failed'; });
303
+ });
304
+ const open = button('Open in editor', () => {
305
+ const file = `${source.file}:${source.start.line}:${source.start.column}`;
306
+ void fetch(`/__open-in-editor?file=${encodeURIComponent(file)}`);
307
+ });
308
+ actions.append(copy, open);
309
+ detail.append(actions);
310
+ return detail;
311
+ }
312
+ function createStyle() {
313
+ const style = document.createElement('style');
314
+ style.textContent = `
315
+ :host { color: #f8fafc; font: 12px/1.4 ui-sans-serif, system-ui, sans-serif; }
316
+ .action-shell { background: #14171d; border: 1px solid #3f4552; border-radius: 9px; box-shadow: 0 12px 35px rgb(0 0 0 / .38); box-sizing: border-box; max-width: min(430px, calc(100vw - 16px)); min-width: 260px; padding: 6px; }
317
+ .action-row, .move-row, .source-buttons { align-items: center; display: flex; flex-wrap: wrap; gap: 5px; }
318
+ .selection-count { color: #ddd6fe; font-weight: 700; padding: 0 7px; }
319
+ button { background: #252a34; border: 1px solid #444b59; border-radius: 5px; color: #f8fafc; cursor: pointer; padding: 6px 8px; }
320
+ button:hover:not(:disabled), button[aria-pressed='true'] { background: #4c1d95; border-color: #8b5cf6; }
321
+ button:focus-visible, input:focus-visible, select:focus-visible { outline: 2px solid #a78bfa; outline-offset: 2px; }
322
+ button:disabled { cursor: not-allowed; opacity: .4; }
323
+ .close { margin-left: auto; }
324
+ .detail { border-top: 1px solid #343a46; display: grid; gap: 8px; margin-top: 6px; max-height: min(360px, calc(100vh - 80px)); overflow: auto; padding: 10px 6px 5px; }
325
+ label { display: grid; gap: 4px; }
326
+ input, select { background: #0d1015; border: 1px solid #444b59; border-radius: 5px; box-sizing: border-box; color: white; min-width: 0; padding: 7px; }
327
+ input:not([type='checkbox']), select { width: 100%; }
328
+ .prop-row { align-items: end; display: grid; gap: 7px; grid-template-columns: minmax(150px, 1fr) auto; }
329
+ dl { display: grid; gap: 2px; margin: 0; }
330
+ dt { color: #939cab; font-size: 10px; text-transform: uppercase; }
331
+ dd { margin: 0; overflow-wrap: anywhere; }
332
+ .source-path { color: #c4b5fd; }
333
+ .warning { background: #422006; border: 1px solid #854d0e; border-radius: 5px; color: #fde68a; margin: 0; padding: 7px; }
334
+ .muted { color: #aeb6c5; margin: 0; }
335
+ `;
336
+ return style;
337
+ }
338
+ function definition(term, description) {
339
+ const value = document.createElement('span');
340
+ value.textContent = description;
341
+ return definitionNode(term, value);
342
+ }
343
+ function definitionNode(term, description) {
344
+ const list = document.createElement('dl');
345
+ const dt = document.createElement('dt');
346
+ dt.textContent = term;
347
+ const dd = document.createElement('dd');
348
+ dd.append(description);
349
+ list.append(dt, dd);
350
+ return list;
351
+ }
352
+ function element(tag, className) {
353
+ const output = document.createElement(tag);
354
+ output.className = className;
355
+ return output;
356
+ }
357
+ function button(label, onClick) {
358
+ const output = document.createElement('button');
359
+ output.type = 'button';
360
+ output.textContent = label;
361
+ if (onClick !== undefined)
362
+ output.addEventListener('click', onClick);
363
+ return output;
364
+ }
365
+ function humanize(value) {
366
+ return value.replaceAll('-', ' ');
367
+ }
368
+ function clamp(value, minimum, maximum) {
369
+ return Math.min(maximum, Math.max(minimum, value));
370
+ }
371
+ //# sourceMappingURL=contextual-actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contextual-actions.js","sourceRoot":"","sources":["../../src/toolbar/contextual-actions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { AgentExternalContext } from '../shared/protocol.js';
2
+ type DiagnosticActionCallbacks = {
3
+ onFix(context: AgentExternalContext): void;
4
+ };
5
+ /**
6
+ * Feature-detected bridge to development diagnostics owned by Vite and Astro.
7
+ * Both surfaces use open shadow roots in the supported Astro version. If that
8
+ * internal structure changes, scans simply find nothing and leave the host UI
9
+ * untouched.
10
+ */
11
+ export declare class DiagnosticActionBridge {
12
+ #private;
13
+ constructor(callbacks: DiagnosticActionCallbacks);
14
+ scan(): void;
15
+ destroy(): void;
16
+ }
17
+ export declare function parseSourceReference(value?: string): {
18
+ file?: string;
19
+ line?: number;
20
+ };
21
+ export {};
22
+ //# sourceMappingURL=diagnostic-actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostic-actions.d.ts","sourceRoot":"","sources":["../../src/toolbar/diagnostic-actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAElE,KAAK,yBAAyB,GAAG;IAC/B,KAAK,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAAC;CAC5C,CAAC;AAYF;;;;;GAKG;AACH,qBAAa,sBAAsB;;gBAKrB,SAAS,EAAE,yBAAyB;IAOhD,IAAI,IAAI,IAAI;IAKZ,OAAO,IAAI,IAAI;CA2FhB;AAED,wBAAgB,oBAAoB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAUrF"}
@@ -0,0 +1,127 @@
1
+ const ACTION_ATTRIBUTE = 'data-astro-ai-fix-action';
2
+ /**
3
+ * Feature-detected bridge to development diagnostics owned by Vite and Astro.
4
+ * Both surfaces use open shadow roots in the supported Astro version. If that
5
+ * internal structure changes, scans simply find nothing and leave the host UI
6
+ * untouched.
7
+ */
8
+ export class DiagnosticActionBridge {
9
+ #callbacks;
10
+ #observer;
11
+ #actions = new Set();
12
+ constructor(callbacks) {
13
+ this.#callbacks = callbacks;
14
+ this.#observer = new MutationObserver(() => this.scan());
15
+ this.#observer.observe(document.documentElement, { childList: true, subtree: true });
16
+ this.scan();
17
+ }
18
+ scan() {
19
+ this.#scanViteErrors();
20
+ this.#scanAstroAudits();
21
+ }
22
+ destroy() {
23
+ this.#observer.disconnect();
24
+ for (const action of this.#actions)
25
+ action.remove();
26
+ this.#actions.clear();
27
+ }
28
+ #scanViteErrors() {
29
+ for (const overlay of document.querySelectorAll('vite-error-overlay')) {
30
+ const root = overlay.shadowRoot;
31
+ const windowElement = root?.querySelector('.window');
32
+ if (root == null || windowElement == null || root.querySelector(`[${ACTION_ATTRIBUTE}]`) !== null) {
33
+ continue;
34
+ }
35
+ const title = root.querySelector('.message-body')?.textContent?.trim() || 'Development error';
36
+ const rawFile = root.querySelector('.file')?.textContent?.trim();
37
+ const source = parseSourceReference(rawFile);
38
+ const frame = root.querySelector('.frame')?.textContent?.trim();
39
+ const message = [title, frame].filter(Boolean).join('\n\n');
40
+ const action = this.#createAction('error', () => {
41
+ this.#callbacks.onFix({
42
+ kind: 'error',
43
+ title,
44
+ message,
45
+ ...(source.file === undefined ? {} : { file: normalizeProjectFile(source.file) }),
46
+ ...(source.line === undefined ? {} : { line: source.line }),
47
+ });
48
+ });
49
+ windowElement.insertBefore(action, windowElement.querySelector('.tip'));
50
+ }
51
+ }
52
+ #scanAstroAudits() {
53
+ const toolbar = document.querySelector('astro-dev-toolbar');
54
+ const toolbarRoot = toolbar?.shadowRoot;
55
+ const auditCanvas = toolbarRoot?.querySelector('astro-dev-toolbar-app-canvas[data-app-id="astro:audit"]');
56
+ const auditWindow = auditCanvas?.shadowRoot?.querySelector('astro-dev-toolbar-audit-window');
57
+ for (const audit of auditWindow?.audits ?? []) {
58
+ const root = audit.card?.shadowRoot;
59
+ const detail = root?.querySelector('.extended-info');
60
+ if (root == null || detail == null || root.querySelector(`[${ACTION_ATTRIBUTE}]`) !== null) {
61
+ continue;
62
+ }
63
+ const title = audit.rule?.title ?? detail.querySelector('.audit-title')?.textContent?.trim() ?? 'Audit issue';
64
+ const message = [
65
+ audit.rule?.message ?? detail.querySelector('.audit-message')?.textContent?.trim(),
66
+ audit.rule?.description ?? detail.querySelector('.audit-description')?.textContent?.trim(),
67
+ ].filter(Boolean).join('\n\n');
68
+ const source = parseSourceReference(audit.auditedElement?.getAttribute('data-astro-ai-source') ?? undefined);
69
+ const action = this.#createAction('audit', () => {
70
+ this.#callbacks.onFix({
71
+ kind: 'audit',
72
+ title,
73
+ message: message || title,
74
+ ...(source.file === undefined ? {} : { file: source.file }),
75
+ ...(source.line === undefined ? {} : { line: source.line }),
76
+ });
77
+ });
78
+ detail.append(action);
79
+ }
80
+ }
81
+ #createAction(kind, onClick) {
82
+ const action = document.createElement('button');
83
+ action.setAttribute(ACTION_ATTRIBUTE, kind);
84
+ action.type = 'button';
85
+ action.textContent = '✦ Fix with AI';
86
+ Object.assign(action.style, {
87
+ background: kind === 'error' ? '#7f1d1d' : '#4c1d95',
88
+ border: `1px solid ${kind === 'error' ? '#ef4444' : '#8b5cf6'}`,
89
+ borderRadius: '7px',
90
+ color: '#fff',
91
+ cursor: 'pointer',
92
+ display: 'inline-flex',
93
+ font: '600 13px/1.2 ui-sans-serif, system-ui, sans-serif',
94
+ margin: '12px 0',
95
+ padding: '9px 12px',
96
+ });
97
+ action.addEventListener('click', (event) => {
98
+ event.preventDefault();
99
+ event.stopPropagation();
100
+ onClick();
101
+ });
102
+ this.#actions.add(action);
103
+ return action;
104
+ }
105
+ }
106
+ export function parseSourceReference(value) {
107
+ if (value === undefined || value.trim() === '')
108
+ return {};
109
+ const match = value.trim().match(/^(.*?):(\d+)(?::\d+)?$/);
110
+ if (match === null)
111
+ return { file: value.trim() };
112
+ const file = match[1]?.trim();
113
+ const line = match[2] === undefined ? undefined : Number(match[2]);
114
+ return {
115
+ ...(file === undefined || file === '' ? {} : { file }),
116
+ ...(line === undefined || !Number.isFinite(line) ? {} : { line }),
117
+ };
118
+ }
119
+ function normalizeProjectFile(file) {
120
+ const root = window
121
+ .__astro_dev_toolbar__?.root;
122
+ if (root === undefined)
123
+ return file;
124
+ const normalizedRoot = root.endsWith('/') ? root : `${root}/`;
125
+ return file.startsWith(normalizedRoot) ? file.slice(normalizedRoot.length) : file;
126
+ }
127
+ //# sourceMappingURL=diagnostic-actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostic-actions.js","sourceRoot":"","sources":["../../src/toolbar/diagnostic-actions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * The editor's stacking order, in one place.
3
+ *
4
+ * These sit at the top of the z-index range so they clear application UI; what
5
+ * matters is their order relative to each other. Chat windows own a band so the
6
+ * focused window can rise above its siblings while every window still stays
7
+ * above the selection overlays that point at the page.
8
+ */
9
+ export declare const EDITOR_LAYERS: {
10
+ readonly actionBar: 2147483647;
11
+ readonly chatWindowTop: 2147483646;
12
+ readonly chatWindowBase: 2147483640;
13
+ readonly insertionControl: 2147483638;
14
+ readonly marquee: 2147483638;
15
+ readonly selectionOutline: 2147483637;
16
+ readonly hoverOutline: 2147483636;
17
+ readonly selectionConnector: 2147483635;
18
+ };
19
+ /** How many chat windows can be stacked with a distinct z-index. */
20
+ export declare const MAX_STACKED_CHAT_WINDOWS: number;
21
+ /**
22
+ * Places a chat window in its band. The focused window always takes the top
23
+ * slot; the rest keep their relative order below it.
24
+ */
25
+ export declare function chatWindowLayer(focused: boolean, rank: number): number;
26
+ //# sourceMappingURL=layers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layers.d.ts","sourceRoot":"","sources":["../../src/toolbar/layers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa;;;;;;;;;CAShB,CAAC;AAEX,oEAAoE;AACpE,eAAO,MAAM,wBAAwB,QAC2B,CAAC;AAEjE;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAItE"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * The editor's stacking order, in one place.
3
+ *
4
+ * These sit at the top of the z-index range so they clear application UI; what
5
+ * matters is their order relative to each other. Chat windows own a band so the
6
+ * focused window can rise above its siblings while every window still stays
7
+ * above the selection overlays that point at the page.
8
+ */
9
+ export const EDITOR_LAYERS = {
10
+ actionBar: 2147483647,
11
+ chatWindowTop: 2147483646,
12
+ chatWindowBase: 2147483640,
13
+ insertionControl: 2147483638,
14
+ marquee: 2147483638,
15
+ selectionOutline: 2147483637,
16
+ hoverOutline: 2147483636,
17
+ selectionConnector: 2147483635,
18
+ };
19
+ /** How many chat windows can be stacked with a distinct z-index. */
20
+ export const MAX_STACKED_CHAT_WINDOWS = EDITOR_LAYERS.chatWindowTop - EDITOR_LAYERS.chatWindowBase + 1;
21
+ /**
22
+ * Places a chat window in its band. The focused window always takes the top
23
+ * slot; the rest keep their relative order below it.
24
+ */
25
+ export function chatWindowLayer(focused, rank) {
26
+ if (focused)
27
+ return EDITOR_LAYERS.chatWindowTop;
28
+ const offset = Math.min(Math.max(rank, 0), MAX_STACKED_CHAT_WINDOWS - 2);
29
+ return EDITOR_LAYERS.chatWindowBase + offset;
30
+ }
31
+ //# sourceMappingURL=layers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layers.js","sourceRoot":"","sources":["../../src/toolbar/layers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,SAAS,EAAE,UAAU;IACrB,aAAa,EAAE,UAAU;IACzB,cAAc,EAAE,UAAU;IAC1B,gBAAgB,EAAE,UAAU;IAC5B,OAAO,EAAE,UAAU;IACnB,gBAAgB,EAAE,UAAU;IAC5B,YAAY,EAAE,UAAU;IACxB,kBAAkB,EAAE,UAAU;CACtB,CAAC;AAEX,oEAAoE;AACpE,MAAM,CAAC,MAAM,wBAAwB,GACnC,aAAa,CAAC,aAAa,GAAG,aAAa,CAAC,cAAc,GAAG,CAAC,CAAC;AAEjE;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,OAAgB,EAAE,IAAY;IAC5D,IAAI,OAAO;QAAE,OAAO,aAAa,CAAC,aAAa,CAAC;IAChD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,wBAAwB,GAAG,CAAC,CAAC,CAAC;IACzE,OAAO,aAAa,CAAC,cAAc,GAAG,MAAM,CAAC;AAC/C,CAAC"}