@jay-framework/aiditor 0.17.3 → 0.18.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 (48) hide show
  1. package/README.md +1 -5
  2. package/dist/actions/check-add-page-route.jay-action +12 -0
  3. package/dist/actions/check-add-page-route.jay-action.d.ts +10 -0
  4. package/dist/actions/check-page-add-page-brief.jay-action +9 -0
  5. package/dist/actions/check-page-add-page-brief.jay-action.d.ts +8 -0
  6. package/dist/actions/check-plugin-update.jay-action +14 -0
  7. package/dist/actions/check-plugin-update.jay-action.d.ts +13 -0
  8. package/dist/actions/ensure-project-plugin.jay-action +9 -0
  9. package/dist/actions/ensure-project-plugin.jay-action.d.ts +8 -0
  10. package/dist/actions/generate-add-page-brief-from-image.jay-action +20 -0
  11. package/dist/actions/generate-add-page-brief-from-image.jay-action.d.ts +20 -0
  12. package/dist/actions/get-plugin-setup-status.jay-action +9 -0
  13. package/dist/actions/get-plugin-setup-status.jay-action.d.ts +6 -0
  14. package/dist/actions/list-jay-plugins.jay-action +8 -0
  15. package/dist/actions/list-jay-plugins.jay-action.d.ts +5 -0
  16. package/dist/actions/list-plugin-contracts.jay-action +11 -0
  17. package/dist/actions/list-plugin-contracts.jay-action.d.ts +9 -0
  18. package/dist/actions/open-add-page-from-brief.jay-action +20 -0
  19. package/dist/actions/open-add-page-from-brief.jay-action.d.ts +18 -0
  20. package/dist/actions/reclassify-add-page-asset.jay-action +12 -0
  21. package/dist/actions/reclassify-add-page-asset.jay-action.d.ts +10 -0
  22. package/dist/actions/rerun-plugin-setup.jay-action +12 -0
  23. package/dist/actions/rerun-plugin-setup.jay-action.d.ts +10 -0
  24. package/dist/actions/save-add-page-draft.jay-action +10 -0
  25. package/dist/actions/save-add-page-draft.jay-action.d.ts +9 -0
  26. package/dist/actions/start-add-page-request.jay-action +12 -0
  27. package/dist/actions/start-add-page-request.jay-action.d.ts +10 -0
  28. package/dist/actions/submit-add-page.jay-action +21 -0
  29. package/dist/actions/submit-add-page.jay-action.d.ts +17 -0
  30. package/dist/actions/submit-task.jay-action +1 -0
  31. package/dist/actions/submit-task.jay-action.d.ts +1 -0
  32. package/dist/actions/sync-add-page-plugin-manifest.jay-action +11 -0
  33. package/dist/actions/sync-add-page-plugin-manifest.jay-action.d.ts +9 -0
  34. package/dist/actions/upload-add-page-asset.jay-action +13 -0
  35. package/dist/actions/upload-add-page-asset.jay-action.d.ts +13 -0
  36. package/dist/actions/write-plugin-source.jay-action +13 -0
  37. package/dist/actions/write-plugin-source.jay-action.d.ts +12 -0
  38. package/dist/add-page-agent/SKILL.md +79 -0
  39. package/dist/add-page-agent/system.md +47 -0
  40. package/dist/index.client.js +2696 -278
  41. package/dist/index.d.ts +797 -6
  42. package/dist/index.js +2682 -14
  43. package/dist/pages/aiditor/page.jay-html +603 -2
  44. package/dist/prompts/add-page-figma-brief-prompt.md +163 -0
  45. package/dist/prompts/add-page-figma-design-definitions-prompt.md +256 -0
  46. package/dist/prompts/add-page-figma-design-from-image-prompt.md +144 -0
  47. package/package.json +24 -7
  48. package/plugin.yaml +34 -0
@@ -105,6 +105,15 @@
105
105
  .chunk-error { color: #f48771; }
106
106
  .chunk-thinking { color: #666; font-style: italic; }
107
107
  .chunk-result { color: #89d185; }
108
+ .chunk-user { color: #c5e1a5; }
109
+ .chunk-user-prefix { color: #888; }
110
+ .agent-chat-row { display: flex; gap: 8px; padding: 8px 12px; border-top: 1px solid #3e3e3e; flex-shrink: 0; align-items: flex-end; }
111
+ .agent-chat-input { flex: 1; min-height: 32px; max-height: 96px; resize: none; background: #252526; color: #d4d4d4; border: 1px solid #3e3e3e; border-radius: 4px; padding: 6px 8px; font-family: 'Segoe UI', system-ui, sans-serif; font-size: 12px; line-height: 1.4; }
112
+ .agent-chat-input:focus { outline: none; border-color: #007acc; }
113
+ .agent-chat-input:disabled { opacity: 0.6; cursor: not-allowed; }
114
+ .agent-chat-send { background: #0e639c; color: #fff; border: none; border-radius: 4px; padding: 6px 14px; font-size: 12px; font-weight: 600; cursor: pointer; flex-shrink: 0; height: 32px; }
115
+ .agent-chat-send:hover:not(:disabled) { background: #1177bb; }
116
+ .agent-chat-send:disabled { opacity: 0.45; cursor: not-allowed; }
108
117
  .tool-group-sep { width: 1px; background: #3e3e3e; align-self: stretch; margin: 0 4px; flex-shrink: 0; }
109
118
  .file-link { color: #569cd6; text-decoration: underline; cursor: pointer; }
110
119
  .file-link:hover { color: #9cdcfe; }
@@ -174,6 +183,110 @@
174
183
  .snapshot-discard-confirm { display: flex; align-items: center; gap: 10px; font-size: 13px; color: #f48771; }
175
184
  .snapshot-discard-confirm-msg { flex: 1; }
176
185
  .snapshot-overlay .arrow-svg line { marker-end: url(#aiditor-snapshot-arrowhead); }
186
+ .add-page-open-btn { margin-left: 12px; background: #0e639c; color: #fff; border: none; border-radius: 6px; padding: 6px 14px; font-size: 12px; font-weight: 600; cursor: pointer; flex-shrink: 0; }
187
+ .add-page-open-btn:hover { background: #1177bb; }
188
+ .add-page-open-btn:disabled { opacity: 0.5; cursor: not-allowed; }
189
+ .add-page-from-brief-btn { margin-left: 8px; background: #2d4a2d; color: #c5e1a5; border: 1px solid #4a6a4a; border-radius: 6px; padding: 6px 14px; font-size: 12px; font-weight: 600; cursor: pointer; flex-shrink: 0; }
190
+ .add-page-from-brief-btn:hover { background: #3a5a3a; color: #fff; }
191
+ .add-page-from-brief-btn:disabled { opacity: 0.5; cursor: not-allowed; }
192
+ .add-page-overlay { position: fixed; inset: 0; z-index: 300; background: rgba(0,0,0,0.45); display: flex; justify-content: flex-end; }
193
+ .project-settings-overlay { position: fixed; inset: 0; z-index: 350; background: rgba(0,0,0,0.5); display: flex; align-items: center; justify-content: center; padding: 24px; box-sizing: border-box; }
194
+ .project-settings-dialog { background: #252526; border: 1px solid #3e3e3e; border-radius: 8px; width: min(520px, 100%); max-height: min(80vh, 640px); display: flex; flex-direction: column; overflow: hidden; }
195
+ .project-settings-header { display: flex; align-items: center; justify-content: space-between; padding: 12px 16px; border-bottom: 1px solid #3e3e3e; }
196
+ .project-settings-title { font-size: 14px; font-weight: 600; color: #fff; }
197
+ .project-settings-close { background: none; border: none; color: #888; font-size: 20px; cursor: pointer; line-height: 1; }
198
+ .project-settings-body { padding: 14px 16px; overflow: auto; display: flex; flex-direction: column; gap: 12px; }
199
+ .project-settings-btn { background: #333; color: #ccc; border: 1px solid #3e3e3e; border-radius: 4px; padding: 6px 12px; font-size: 12px; cursor: pointer; }
200
+ .project-settings-btn:hover { background: #444; color: #fff; }
201
+ .add-page-plugin-picker { width: 100%; background: #252526; color: #ccc; border: 1px solid #3e3e3e; border-radius: 4px; font-size: 12px; padding: 6px 8px; margin-top: 6px; }
202
+ .add-page-manage-link { font-size: 11px; color: #9cdcfe; cursor: pointer; margin-top: 6px; background: none; border: none; padding: 0; text-align: left; }
203
+ .add-page-slideover { width: min(480px, 100vw); height: 100%; background: #1e1e1e; border-left: 1px solid #3e3e3e; display: flex; flex-direction: column; box-shadow: -4px 0 24px rgba(0,0,0,0.4); position: relative; }
204
+ .add-page-header { display: flex; align-items: center; gap: 8px; padding: 14px 16px; border-bottom: 1px solid #3e3e3e; flex-shrink: 0; }
205
+ .add-page-title { font-size: 14px; font-weight: 600; color: #9cdcfe; flex: 1; }
206
+ .add-page-close { background: none; border: none; color: #888; font-size: 20px; cursor: pointer; line-height: 1; padding: 0 4px; }
207
+ .add-page-close:hover { color: #fff; }
208
+ .add-page-body { flex: 1; overflow: auto; padding: 14px 16px; display: flex; flex-direction: column; gap: 16px; }
209
+ .add-page-section-label { font-size: 11px; font-weight: 600; color: #888; text-transform: uppercase; letter-spacing: 0.4px; margin-bottom: 6px; }
210
+ .add-page-section-header-row { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 6px; }
211
+ .add-page-section-header-row .add-page-section-label { margin-bottom: 0; flex: 1; }
212
+ .add-page-fill-from-image-btn { background: #2d2d30; color: #9cdcfe; border: 1px solid #3e3e3e; border-radius: 4px; padding: 4px 10px; font-size: 11px; font-weight: 600; cursor: pointer; flex-shrink: 0; }
213
+ .add-page-fill-from-image-btn:hover { background: #3c3c3c; color: #fff; }
214
+ .add-page-fill-from-image-btn:disabled { opacity: 0.45; cursor: not-allowed; }
215
+ .add-page-suggested-route { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; background: #252526; border: 1px solid #3e3e3e; border-radius: 6px; padding: 8px 10px; font-size: 12px; color: #ccc; margin-bottom: 8px; }
216
+ .add-page-suggested-route code { font-family: ui-monospace, monospace; color: #ce9178; }
217
+ .add-page-brief-fill-popover { position: absolute; inset: 0; z-index: 10; background: rgba(0,0,0,0.55); display: flex; align-items: center; justify-content: center; padding: 16px; box-sizing: border-box; }
218
+ .add-page-brief-fill-panel { background: #252526; border: 1px solid #3e3e3e; border-radius: 8px; width: min(420px, 100%); max-height: 90%; overflow: auto; padding: 14px 16px; display: flex; flex-direction: column; gap: 10px; }
219
+ .add-page-brief-fill-header { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
220
+ .add-page-brief-fill-title { font-size: 13px; font-weight: 600; color: #9cdcfe; }
221
+ .add-page-brief-fill-context { width: 100%; min-height: 64px; background: #1e1e1e; color: #d4d4d4; border: 1px solid #3e3e3e; border-radius: 6px; padding: 8px; font-size: 12px; font-family: ui-monospace, monospace; resize: vertical; box-sizing: border-box; }
222
+ .add-page-brief-fill-dropzone { border: 1px dashed #3e3e3e; border-radius: 8px; padding: 14px; text-align: center; color: #888; font-size: 12px; cursor: pointer; }
223
+ .add-page-brief-fill-dropzone-disabled { opacity: 0.45; cursor: not-allowed; pointer-events: none; }
224
+ .add-page-brief-fill-context:disabled { opacity: 0.6; cursor: not-allowed; }
225
+ .add-page-brief-fill-dropzone:focus { outline: 1px solid #0e639c; }
226
+ .add-page-brief-fill-thumbs { display: flex; flex-wrap: wrap; gap: 8px; }
227
+ .add-page-brief-fill-thumb { position: relative; width: 72px; height: 72px; border-radius: 6px; overflow: hidden; border: 1px solid #3e3e3e; background: #1e1e1e; }
228
+ .add-page-brief-fill-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
229
+ .add-page-brief-fill-thumb-remove { position: absolute; top: 2px; right: 2px; background: rgba(0,0,0,0.7); color: #fff; border: none; border-radius: 3px; width: 18px; height: 18px; font-size: 12px; line-height: 1; cursor: pointer; padding: 0; }
230
+ .add-page-brief-fill-actions { display: flex; gap: 8px; justify-content: flex-end; margin-top: 4px; }
231
+ .add-page-route-row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
232
+ .add-page-route-input { flex: 1; min-width: 160px; background: #252526; color: #d4d4d4; border: 1px solid #3e3e3e; border-radius: 6px; padding: 8px 10px; font-size: 13px; font-family: ui-monospace, monospace; box-sizing: border-box; }
233
+ .add-page-route-input:focus { border-color: #0e639c; outline: none; }
234
+ .add-page-route-badge { font-size: 10px; color: #ce9178; background: #2d2d30; padding: 2px 8px; border-radius: 4px; }
235
+ .add-page-field-error { font-size: 12px; color: #f48771; margin-top: 4px; }
236
+ .add-page-hint { font-size: 12px; color: #888; margin-top: 4px; }
237
+ .add-page-textarea { width: 100%; min-height: 120px; background: #252526; color: #d4d4d4; border: 1px solid #3e3e3e; border-radius: 6px; padding: 10px; font-size: 12px; font-family: ui-monospace, monospace; resize: vertical; box-sizing: border-box; outline: none; }
238
+ .add-page-textarea:focus { border-color: #0e639c; }
239
+ .add-page-dropzone { border: 1px dashed #3e3e3e; border-radius: 8px; padding: 16px; text-align: center; color: #888; font-size: 12px; }
240
+ .add-page-chips { display: flex; flex-direction: column; gap: 6px; margin-top: 8px; }
241
+ .add-page-chip { display: flex; align-items: center; gap: 8px; background: #252526; border: 1px solid #3e3e3e; border-radius: 6px; padding: 6px 8px; font-size: 11px; }
242
+ .add-page-chip-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: #ccc; }
243
+ .add-page-chip-path { font-size: 10px; color: #666; font-family: ui-monospace, monospace; }
244
+ .add-page-chip select { background: #1e1e1e; color: #ccc; border: 1px solid #3e3e3e; border-radius: 4px; font-size: 11px; padding: 2px 4px; }
245
+ .add-page-chip-remove { background: none; border: none; color: #888; cursor: pointer; font-size: 14px; padding: 0 4px; }
246
+ .add-page-chip-remove:hover { color: #f48771; }
247
+ .add-page-plugins { border: 1px solid #3e3e3e; border-radius: 6px; padding: 10px; margin-top: 8px; display: flex; flex-direction: column; gap: 12px; max-height: 320px; overflow: auto; }
248
+ .add-page-plugins-zone-title { font-size: 11px; font-weight: 600; color: #aaa; text-transform: uppercase; letter-spacing: 0.04em; margin-bottom: 4px; }
249
+ .add-page-plugin-row { display: flex; align-items: center; gap: 8px; padding: 4px 0; font-size: 11px; border-bottom: 1px solid #2d2d30; }
250
+ .add-page-plugin-row:last-child { border-bottom: none; }
251
+ .add-page-plugin-label { flex: 1; color: #ccc; }
252
+ .add-page-plugin-btn { background: #333; color: #ccc; border: 1px solid #3e3e3e; border-radius: 4px; padding: 2px 8px; font-size: 10px; cursor: pointer; }
253
+ .add-page-plugin-btn:hover { background: #444; color: #fff; }
254
+ .add-page-plugin-btn:disabled { opacity: 0.45; cursor: not-allowed; }
255
+ .add-page-setup-ok { color: #89d185; font-size: 10px; }
256
+ .add-page-setup-warn { color: #dcdcaa; font-size: 10px; }
257
+ .add-page-setup-error { color: #f48771; font-size: 10px; }
258
+ .add-page-plugin-contract { padding-left: 0; font-size: 11px; color: #999; display: flex; flex-direction: column; gap: 4px; margin-top: 6px; }
259
+ .add-page-plugin-contract-row { display: flex; align-items: center; gap: 8px; padding: 4px 0; border-bottom: 1px solid #2d2d30; }
260
+ .add-page-plugin-contract-row:last-child { border-bottom: none; }
261
+ .add-page-plugin-contract-name { flex: 1; color: #ccc; font-size: 11px; }
262
+ .add-page-plugin-contract-added { font-size: 10px; color: #89d185; }
263
+ .add-page-plugin-chips { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 4px; }
264
+ .add-page-plugin-chip { background: #2d2d30; border: 1px solid #3e3e3e; border-radius: 4px; padding: 2px 6px; font-size: 10px; color: #ccc; display: flex; align-items: center; gap: 4px; }
265
+ .add-page-plugin-chip-remove { background: none; border: none; color: #888; cursor: pointer; padding: 0 2px; }
266
+ .add-page-plugins-warn { font-size: 11px; color: #dcdcaa; margin-top: 4px; }
267
+ .add-page-install-live { font-size: 11px; color: #888; }
268
+ .add-page-local-plugin-form { display: flex; flex-direction: column; gap: 6px; margin-top: 8px; padding-top: 8px; border-top: 1px solid #3e3e3e; }
269
+ .add-page-local-plugin-form input { background: #252526; color: #ccc; border: 1px solid #3e3e3e; border-radius: 4px; padding: 4px 6px; font-size: 11px; }
270
+ .annotation-binding { margin-top: 6px; border-top: 1px solid #3e3e3e; padding-top: 6px; }
271
+ .annotation-binding-toggle { background: none; border: none; color: #9cdcfe; font-size: 11px; cursor: pointer; padding: 0; text-align: left; }
272
+ .annotation-binding-panel { display: flex; flex-direction: column; gap: 6px; margin-top: 6px; font-size: 11px; color: #ccc; }
273
+ .annotation-binding-preview { font-size: 10px; color: #89d185; margin: 0; }
274
+ .annotation-binding-panel label { display: flex; flex-direction: column; gap: 2px; }
275
+ .annotation-binding-panel select { background: #252526; color: #ccc; border: 1px solid #3e3e3e; border-radius: 4px; font-size: 11px; }
276
+ .annotation-binding-scope-row { display: flex; gap: 10px; flex-wrap: wrap; }
277
+ .annotation-binding-install { background: #0e639c; color: #fff; border: none; border-radius: 4px; padding: 4px 8px; font-size: 10px; cursor: pointer; align-self: flex-start; }
278
+ .add-page-footer { display: flex; gap: 8px; padding: 12px 16px; border-top: 1px solid #3e3e3e; flex-shrink: 0; }
279
+ .add-page-btn { flex: 1; padding: 10px; border-radius: 6px; font-size: 13px; font-weight: 600; cursor: pointer; border: 1px solid #3e3e3e; }
280
+ .add-page-btn-cancel { background: #2d2d30; color: #ccc; }
281
+ .add-page-btn-primary { background: #0e639c; color: #fff; border-color: #0e639c; }
282
+ .add-page-btn-primary:disabled { opacity: 0.45; cursor: not-allowed; }
283
+ .add-page-result-banner { margin: 0 20px 8px; padding: 10px 14px; border-radius: 8px; font-size: 12px; display: flex; flex-wrap: wrap; align-items: center; gap: 10px; }
284
+ .add-page-result-success { background: #1e3a1e; border: 1px solid #3a5a3a; color: #89d185; }
285
+ .add-page-result-failed { background: #3a1f1f; border: 1px solid #5a3030; color: #f48771; }
286
+ .add-page-result-actions { display: flex; gap: 8px; margin-left: auto; }
287
+ .add-page-result-btn { background: #333; color: #ccc; border: 1px solid #3e3e3e; border-radius: 4px; padding: 4px 10px; font-size: 11px; cursor: pointer; }
288
+ .add-page-result-btn:hover { background: #444; color: #fff; }
289
+ .add-page-hidden-file { display: none; }
177
290
  </style>
178
291
  <script type="application/jay-data">
179
292
  data:
@@ -191,6 +304,12 @@ data:
191
304
  cssClass: string
192
305
  filePath: string
193
306
  toolName: string
307
+ showUserPrefix: boolean
308
+ agentChatMessage: string
309
+ showAgentChatInput: boolean
310
+ agentChatInputDisabled: boolean
311
+ agentChatSendDisabled: boolean
312
+ agentChatPlaceholder: string
194
313
  hasChunks: boolean
195
314
  outputEmpty: boolean
196
315
  pageSelectOptions:
@@ -274,6 +393,31 @@ data:
274
393
  name: string
275
394
  thumbUrl: string
276
395
  annotationId: string
396
+ bindingSectionOpen: boolean
397
+ showBindingControls: boolean
398
+ showMarkerHasBindingChips: boolean
399
+ showMarkerBindingEmptyHint: boolean
400
+ markerBindingChips:
401
+ - rowKey: string
402
+ label: string
403
+ pluginName: string
404
+ packageName: string
405
+ contractName: string
406
+ scope: string
407
+ markerPluginOptions:
408
+ - rowKey: string
409
+ value: string
410
+ label: string
411
+ showMarkerContractPicker: boolean
412
+ markerPickerPluginLabel: string
413
+ markerContractPickerRows:
414
+ - rowKey: string
415
+ pluginName: string
416
+ packageName: string
417
+ contractName: string
418
+ description: string
419
+ onPage: boolean
420
+ componentKey: string
277
421
  recordingDraftUi:
278
422
  id: string
279
423
  kindLabel: string
@@ -360,6 +504,31 @@ data:
360
504
  name: string
361
505
  thumbUrl: string
362
506
  annotationId: string
507
+ bindingSectionOpen: boolean
508
+ showBindingControls: boolean
509
+ showMarkerHasBindingChips: boolean
510
+ showMarkerBindingEmptyHint: boolean
511
+ markerBindingChips:
512
+ - rowKey: string
513
+ label: string
514
+ pluginName: string
515
+ packageName: string
516
+ contractName: string
517
+ scope: string
518
+ markerPluginOptions:
519
+ - rowKey: string
520
+ value: string
521
+ label: string
522
+ showMarkerContractPicker: boolean
523
+ markerPickerPluginLabel: string
524
+ markerContractPickerRows:
525
+ - rowKey: string
526
+ pluginName: string
527
+ packageName: string
528
+ contractName: string
529
+ description: string
530
+ onPage: boolean
531
+ componentKey: string
363
532
  showVideoAnnotationsPanel: boolean
364
533
  videoModalOverlayPointerNone: boolean
365
534
  videoSubmitError: string
@@ -436,9 +605,146 @@ data:
436
605
  name: string
437
606
  thumbUrl: string
438
607
  annotationId: string
608
+ bindingSectionOpen: boolean
609
+ showBindingControls: boolean
610
+ showMarkerHasBindingChips: boolean
611
+ showMarkerBindingEmptyHint: boolean
612
+ markerBindingChips:
613
+ - rowKey: string
614
+ label: string
615
+ pluginName: string
616
+ packageName: string
617
+ contractName: string
618
+ scope: string
619
+ markerPluginOptions:
620
+ - rowKey: string
621
+ value: string
622
+ label: string
623
+ showMarkerContractPicker: boolean
624
+ markerPickerPluginLabel: string
625
+ markerContractPickerRows:
626
+ - rowKey: string
627
+ pluginName: string
628
+ packageName: string
629
+ contractName: string
630
+ description: string
631
+ onPage: boolean
632
+ componentKey: string
439
633
  showSnapshotAnnotationsPanel: boolean
440
634
  showSnapshotSubmitError: boolean
441
635
  snapshotSubmitError: string
636
+ showAddPageComposer: boolean
637
+ addPageRoute: string
638
+ addPageContentMd: string
639
+ addPageDesignMd: string
640
+ addPageRouteError: string
641
+ showAddPageRouteError: boolean
642
+ addPageComposerError: string
643
+ showAddPageComposerError: boolean
644
+ addPageUploadHint: string
645
+ showAddPageUploadHint: boolean
646
+ addPageIsDynamicRoute: boolean
647
+ addPageShowDesignHint: boolean
648
+ addPageCreateDisabled: boolean
649
+ addPageRunningHint: string
650
+ showAddPageRunningHint: boolean
651
+ showAddPageAttachments: boolean
652
+ addPageAttachmentRows:
653
+ - rowKey: string
654
+ id: string
655
+ filename: string
656
+ path: string
657
+ role: string
658
+ roleLabel: string
659
+ showProjectSettingsModal: boolean
660
+ showProjectSettingsPluginsPanel: boolean
661
+ showProjectSettingsInstallZone: boolean
662
+ showProjectSettingsInstalledZone: boolean
663
+ projectSettingsInstallRows:
664
+ - rowKey: string
665
+ pluginName: string
666
+ packageName: string
667
+ description: string
668
+ buttonLabel: string
669
+ buttonDisabled: boolean
670
+ projectSettingsInstalledRows:
671
+ - rowKey: string
672
+ pluginName: string
673
+ packageName: string
674
+ description: string
675
+ versionLabel: string
676
+ setupBadge: string
677
+ setupBadgeClass: string
678
+ configFile: string
679
+ showConfig: boolean
680
+ contractSummary: string
681
+ showCheckForUpdateBtn: boolean
682
+ showRunUpdateBtn: boolean
683
+ updateButtonLabel: string
684
+ updateButtonDisabled: boolean
685
+ showProjectSettingsPluginsError: boolean
686
+ showFixInstallWithAgent: boolean
687
+ fixInstallPluginName: string
688
+ projectSettingsPluginsError: string
689
+ showProjectSettingsInstallProgress: boolean
690
+ projectSettingsInstallProgress: string
691
+ showProjectSettingsWixConfigWarning: boolean
692
+ showProjectSettingsReloadPreview: boolean
693
+ showProjectLocalPluginForm: boolean
694
+ projectLocalPluginName: string
695
+ projectLocalPackageName: string
696
+ projectLocalPath: string
697
+ showAddPagePluginsPanel: boolean
698
+ showAddPagePagePluginsZone: boolean
699
+ addPagePluginPickerOptions:
700
+ - rowKey: string
701
+ value: string
702
+ label: string
703
+ addPagePluginPickerValue: string
704
+ showAddPageContractPicker: boolean
705
+ addPagePickerPluginLabel: string
706
+ addPageContractPickerRows:
707
+ - rowKey: string
708
+ pluginName: string
709
+ packageName: string
710
+ contractName: string
711
+ description: string
712
+ onPage: boolean
713
+ componentKey: string
714
+ addPagePagePluginChips:
715
+ - rowKey: string
716
+ label: string
717
+ pluginName: string
718
+ packageName: string
719
+ contractName: string
720
+ componentKey: string
721
+ showAddPageHasPagePluginChips: boolean
722
+ showAddPagePagePluginsEmptyHint: boolean
723
+ showAddPageResultBanner: boolean
724
+ addPageResultBannerClass: string
725
+ addPageResultBannerMessage: string
726
+ showAddPageRetry: boolean
727
+ showAddPageFixWithAiditor: boolean
728
+ showAddPageFromBriefBtn: boolean
729
+ showBriefFillPopover: boolean
730
+ briefFillContextNotes: string
731
+ briefFillPopoverError: string
732
+ showBriefFillPopoverError: boolean
733
+ briefFillDisabled: boolean
734
+ briefFillInputDisabled: boolean
735
+ briefFillDropzoneClass: string
736
+ addPageBriefFillGenerateDisabled: boolean
737
+ briefFillStatusHint: string
738
+ showBriefFillStatusHint: boolean
739
+ showBriefFillThumbnails: boolean
740
+ addPageBriefFillThumbRows:
741
+ - rowKey: string
742
+ name: string
743
+ thumbUrl: string
744
+ index: number
745
+ removeDisabled: boolean
746
+ showSuggestedRouteBanner: boolean
747
+ suggestedRouteLabel: string
442
748
  </script>
443
749
  </head>
444
750
  <body>
@@ -478,6 +784,9 @@ data:
478
784
  <span class="params-loading-hint" if="paramsLoadingHint">{paramsLoadingHint}</span>
479
785
  </div>
480
786
  </div>
787
+ <button type="button" class="project-settings-btn" ref="projectSettingsBtn" disabled="isRunning">Project settings</button>
788
+ <button type="button" class="add-page-open-btn" ref="addPageOpenBtn" disabled="isRunning">Add Page</button>
789
+ <button type="button" class="add-page-from-brief-btn" ref="addPageFromBriefBtn" if="showAddPageFromBriefBtn" disabled="isRunning">Page Briefs</button>
481
790
  </div>
482
791
 
483
792
  <div class="preview-stack" if="isPreviewMode">
@@ -640,6 +949,36 @@ data:
640
949
  data-annotation-id="{id}"
641
950
  value="{instruction}"
642
951
  ></textarea>
952
+ <div class="annotation-binding">
953
+ <button type="button" class="annotation-binding-toggle">Components (optional)</button>
954
+ <div class="annotation-binding-panel" if="showBindingControls">
955
+ <div if="showMarkerHasBindingChips">
956
+ <div class="add-page-plugins-zone-title">Components on this marker</div>
957
+ <div class="add-page-plugin-chips">
958
+ <span class="add-page-plugin-chip" forEach="markerBindingChips" trackBy="rowKey">{label}<button type="button" class="add-page-plugin-chip-remove" data-marker-remove-binding="1" data-plugin="{pluginName}" data-contract="{contractName}" title="Remove from marker">×</button></span>
959
+ </div>
960
+ </div>
961
+ <p class="add-page-hint" if="showMarkerBindingEmptyHint">No components yet — pick a plugin below and click Add for each component you need.</p>
962
+ <div class="add-page-plugins-zone-title">Add component</div>
963
+ <label class="add-page-hint">Plugin
964
+ <select class="annotation-binding-plugin">
965
+ <option value="">— Select plugin —</option>
966
+ <option forEach="markerPluginOptions" trackBy="rowKey" value="{value}">{label}</option>
967
+ </select>
968
+ </label>
969
+ <button type="button" class="add-page-manage-link" data-marker-manage-plugins="1">Manage plugins…</button>
970
+ <div if="showMarkerContractPicker">
971
+ <p class="add-page-hint">{markerPickerPluginLabel}</p>
972
+ <div class="add-page-plugin-contract">
973
+ <div class="add-page-plugin-contract-row" forEach="markerContractPickerRows" trackBy="rowKey">
974
+ <span class="add-page-plugin-contract-name">{contractName}</span>
975
+ <button type="button" class="add-page-plugin-btn" if="!onPage" data-marker-add-contract="1" data-plugin="{pluginName}" data-package="{packageName}" data-contract="{contractName}" data-key="{componentKey}">Add</button>
976
+ <span class="add-page-plugin-contract-added" if="onPage">Added</span>
977
+ </div>
978
+ </div>
979
+ </div>
980
+ </div>
981
+ </div>
643
982
  <div class="visual-annotation-files">
644
983
  <div class="visual-attach-row">
645
984
  <button type="button" class="visual-attach-btn visual-annotation-attach" data-annotation-id="{id}">
@@ -667,17 +1006,219 @@ data:
667
1006
  </div>
668
1007
 
669
1008
  </main>
1009
+ <div class="add-page-result-slot" ref="addPageResultBannerSlot">
1010
+ <div class="{addPageResultBannerClass} add-page-result-banner" if="showAddPageResultBanner">
1011
+ <span>{addPageResultBannerMessage}</span>
1012
+ <div class="add-page-result-actions">
1013
+ <button type="button" class="add-page-result-btn" data-add-page-retry="1" if="showAddPageRetry">Retry</button>
1014
+ <button type="button" class="add-page-result-btn" data-add-page-fix="1" if="showAddPageFixWithAiditor">Fix with AIditor</button>
1015
+ </div>
1016
+ </div>
1017
+ </div>
1018
+ <div class="{bottomPanelClass}">
1019
+ <div class="bottom-panel-resize" ref="bottomPanelResize"></div>
1020
+ <div class="bottom-panel-header" ref="bottomPanelHeader">
1021
+ <span class="bottom-panel-title">Agent output</span>
1022
+ <span class="bottom-panel-running" if="showBottomPanelRunning"></span>
1023
+ <span class="bottom-panel-spacer"></span>
1024
+ <button type="button" class="bottom-panel-clear" ref="bottomPanelClearBtn">Clear</button>
1025
+ <button type="button" class="bottom-panel-toggle" ref="bottomPanelToggleBtn">{bottomPanelToggleGlyph}</button>
1026
+ </div>
1027
+ <div class="output-panel" ref="outputScroll">
1028
+ <div class="{cssClass}" forEach="chunks" trackBy="text"><span if="showUserPrefix" class="chunk-user-prefix">You: </span><span if="filePath" class="chunk-tool-prefix">&gt; {toolName} </span><a if="filePath" class="file-link" href="#" data-path="{filePath}">{filePath}</a><span if="!filePath">{text}</span></div>
1029
+ </div>
1030
+ <div class="agent-chat-row" if="showAgentChatInput">
1031
+ <textarea class="agent-chat-input" ref="agentChatInput" rows="1" value="{agentChatMessage}" placeholder="{agentChatPlaceholder}" disabled="agentChatInputDisabled" aria-label="Message to agent"></textarea>
1032
+ <button type="button" class="agent-chat-send" ref="agentChatSendBtn" disabled="agentChatSendDisabled" aria-label="Send message">Send</button>
1033
+ </div>
1034
+ </div>
1035
+ </div>
1036
+
1037
+ <div class="project-settings-overlay" if="showProjectSettingsModal" ref="projectSettingsOverlay" role="dialog" aria-modal="true" aria-label="Project settings">
1038
+ <div class="project-settings-dialog">
1039
+ <div class="project-settings-header">
1040
+ <span class="project-settings-title">Project settings</span>
1041
+ <button type="button" class="project-settings-close" ref="projectSettingsCloseBtn" aria-label="Close">×</button>
1042
+ </div>
1043
+ <div class="project-settings-body">
1044
+ <div class="add-page-plugins-zone-title">Plugins</div>
1045
+ <p class="add-page-hint">Install plugins once for the project. Add Page and markers use installed plugins only.</p>
1046
+ <div class="add-page-plugins" ref="projectPluginsPanel" if="showProjectSettingsPluginsPanel" aria-live="polite">
1047
+ <p class="add-page-install-live" if="showProjectSettingsInstallProgress">{projectSettingsInstallProgress}</p>
1048
+ <div class="add-page-install-error-row" if="showProjectSettingsPluginsError">
1049
+ <p class="add-page-field-error">{projectSettingsPluginsError}</p>
1050
+ <button type="button" class="add-page-plugin-btn add-page-plugin-btn-primary" data-project-fix-install-agent="1" data-plugin="{fixInstallPluginName}" if="showFixInstallWithAgent">Fix with agent</button>
1051
+ </div>
1052
+ <p class="add-page-plugins-warn" if="showProjectSettingsWixConfigWarning">Wix credentials missing — configure config/.wix.yaml in your IDE.</p>
1053
+ <p class="add-page-plugins-warn" if="showProjectSettingsReloadPreview">Refreshing project… If preview breaks, reload the preview.</p>
1054
+ <div if="showProjectSettingsInstallZone">
1055
+ <div class="add-page-plugins-zone-title">Install plugin</div>
1056
+ <div class="add-page-plugin-row" forEach="projectSettingsInstallRows" trackBy="rowKey">
1057
+ <span class="add-page-plugin-label">{pluginName} — {description}</span>
1058
+ <button type="button" class="add-page-plugin-btn" data-project-install-plugin="1" data-plugin="{pluginName}" disabled="buttonDisabled">{buttonLabel}</button>
1059
+ </div>
1060
+ </div>
1061
+ <div if="showProjectSettingsInstalledZone">
1062
+ <div class="add-page-plugins-zone-title">Installed plugins</div>
1063
+ <div class="add-page-plugin-row add-page-plugin-row-installed" forEach="projectSettingsInstalledRows" trackBy="rowKey">
1064
+ <span class="add-page-plugin-label" if="versionLabel">{pluginName} ({versionLabel})</span>
1065
+ <span class="add-page-plugin-label" if="!versionLabel">{pluginName}</span>
1066
+ <span class="{setupBadgeClass}" if="setupBadge">{setupBadge}</span>
1067
+ <button type="button" class="add-page-plugin-btn" data-project-check-update="1" data-plugin="{pluginName}" disabled="updateButtonDisabled" if="showCheckForUpdateBtn">{updateButtonLabel}</button>
1068
+ <button type="button" class="add-page-plugin-btn add-page-plugin-btn-primary" data-project-run-update="1" data-plugin="{pluginName}" disabled="updateButtonDisabled" if="showRunUpdateBtn">{updateButtonLabel}</button>
1069
+ <button type="button" class="add-page-plugin-btn" data-project-rerun-setup="1" data-plugin="{pluginName}" if="setupBadge">Re-run setup</button>
1070
+ <button type="button" class="add-page-plugin-btn" data-project-open-config="1" data-config="{configFile}" if="showConfig">Open config</button>
1071
+ <span class="add-page-hint" if="contractSummary">{contractSummary}</span>
1072
+ </div>
1073
+ </div>
1074
+ <div class="add-page-local-plugin-form" if="showProjectLocalPluginForm">
1075
+ <div class="add-page-plugins-zone-title">Add local plugin</div>
1076
+ <input type="text" class="project-local-name" ref="projectLocalPluginNameInput" value="{projectLocalPluginName}" placeholder="Plugin name" />
1077
+ <input type="text" class="project-local-package" ref="projectLocalPackageInput" value="{projectLocalPackageName}" placeholder="Package name" />
1078
+ <input type="text" class="project-local-path" ref="projectLocalPathInput" value="{projectLocalPath}" placeholder="Relative path" />
1079
+ <button type="button" class="add-page-plugin-btn" data-project-save-local-plugin="1">Save to plugin-sources.yaml</button>
1080
+ <button type="button" class="add-page-plugin-btn" data-project-cancel-local-plugin="1">Cancel</button>
1081
+ </div>
1082
+ <button type="button" class="add-page-plugin-btn" data-project-show-local-plugin="1" if="!showProjectLocalPluginForm">Add local plugin</button>
1083
+ </div>
1084
+ </div>
1085
+ </div>
1086
+ </div>
1087
+
1088
+ <div class="add-page-overlay" if="showAddPageComposer" ref="addPageOverlay" role="dialog" aria-modal="true" aria-label="Add Page">
1089
+ <div class="add-page-slideover" ref="addPageSlideover">
1090
+ <div class="add-page-header">
1091
+ <span class="add-page-title">Add Page</span>
1092
+ <button type="button" class="add-page-close" ref="addPageCloseBtn" aria-label="Close">×</button>
1093
+ </div>
1094
+ <div class="add-page-body">
1095
+ <section>
1096
+ <div class="add-page-section-label">Page route</div>
1097
+ <div class="add-page-route-row">
1098
+ <input type="text" class="add-page-route-input" ref="addPageRouteInput" value="{addPageRoute}" placeholder="/pricing or /products/[slug]" />
1099
+ <span class="add-page-route-badge" if="addPageIsDynamicRoute">Dynamic route</span>
1100
+ </div>
1101
+ <p class="add-page-field-error" if="showAddPageRouteError">{addPageRouteError}</p>
1102
+ <div class="add-page-suggested-route" if="showSuggestedRouteBanner">
1103
+ <span>Suggested route: <code>{suggestedRouteLabel}</code></span>
1104
+ <button type="button" class="add-page-btn add-page-btn-primary" ref="addPageSuggestedRouteApplyBtn" style="flex:0;padding:4px 10px;font-size:11px">Apply route</button>
1105
+ <button type="button" class="add-page-btn add-page-btn-cancel" ref="addPageSuggestedRouteDismissBtn" style="flex:0;padding:4px 10px;font-size:11px">Dismiss</button>
1106
+ </div>
1107
+ </section>
1108
+ <section>
1109
+ <div class="add-page-section-header-row">
1110
+ <div class="add-page-section-label">Content</div>
1111
+ <button type="button" class="add-page-fill-from-image-btn" ref="addPageFillContentFromImageBtn" title="Generate markdown from screenshot(s) using AI" disabled="briefFillDisabled">Fill from image</button>
1112
+ </div>
1113
+ <p class="add-page-hint">Behavior, plugins, contracts, interactions, copy.</p>
1114
+ <textarea class="add-page-textarea" ref="addPageContentMd" placeholder="# Pricing page&#10;- Headless: none (static marketing page)&#10;- Show 3 tiers: Starter / Pro / Enterprise">{addPageContentMd}</textarea>
1115
+ <div class="add-page-plugins" ref="addPagePluginsPanel" if="showAddPagePluginsPanel" aria-live="polite">
1116
+ <div if="showAddPagePagePluginsZone">
1117
+ <div class="add-page-plugins-zone-title">Plugins on this page</div>
1118
+ <div if="showAddPageHasPagePluginChips">
1119
+ <div class="add-page-plugins-zone-title">Components on this page</div>
1120
+ <div class="add-page-plugin-chips">
1121
+ <span class="add-page-plugin-chip" forEach="addPagePagePluginChips" trackBy="rowKey">{label}<button type="button" class="add-page-plugin-chip-remove" data-add-page-remove-chip="1" data-plugin="{pluginName}" data-package="{packageName}" data-contract="{contractName}" title="Remove from page">×</button></span>
1122
+ </div>
1123
+ </div>
1124
+ <p class="add-page-hint" if="showAddPagePagePluginsEmptyHint">No components yet — pick a plugin below and click Add on each component you need.</p>
1125
+ <div class="add-page-plugins-zone-title">Add component</div>
1126
+ <label class="add-page-hint">Plugin
1127
+ <select class="add-page-plugin-picker" ref="addPagePluginPicker" value="{addPagePluginPickerValue}">
1128
+ <option value="">— Select plugin —</option>
1129
+ <option forEach="addPagePluginPickerOptions" trackBy="rowKey" value="{value}">{label}</option>
1130
+ </select>
1131
+ </label>
1132
+ <button type="button" class="add-page-manage-link" data-add-page-manage-plugins="1">Manage plugins…</button>
1133
+ <div if="showAddPageContractPicker">
1134
+ <p class="add-page-hint">{addPagePickerPluginLabel}</p>
1135
+ <div class="add-page-plugin-contract">
1136
+ <div class="add-page-plugin-contract-row" forEach="addPageContractPickerRows" trackBy="rowKey">
1137
+ <span class="add-page-plugin-contract-name">{contractName}</span>
1138
+ <button type="button" class="add-page-plugin-btn" if="!onPage" data-add-page-add-contract="1" data-plugin="{pluginName}" data-package="{packageName}" data-contract="{contractName}" data-key="{componentKey}">Add</button>
1139
+ <span class="add-page-plugin-contract-added" if="onPage">Added</span>
1140
+ </div>
1141
+ </div>
1142
+ </div>
1143
+ </div>
1144
+ </div>
1145
+ </section>
1146
+ <section>
1147
+ <div class="add-page-section-header-row">
1148
+ <div class="add-page-section-label">Design</div>
1149
+ <button type="button" class="add-page-fill-from-image-btn" ref="addPageFillDesignFromImageBtn" title="Generate markdown from screenshot(s) using AI" disabled="briefFillDisabled">Fill from image</button>
1150
+ </div>
1151
+ <p class="add-page-hint">Layout, colors, typography, breakpoints.</p>
1152
+ <textarea class="add-page-textarea" ref="addPageDesignMd" placeholder="- Match site header from home&#10;- Hero: centered H1, muted subtitle (#888)">{addPageDesignMd}</textarea>
1153
+ <p class="add-page-hint" if="addPageShowDesignHint">Add a mock or screenshot for better layout fidelity.</p>
1154
+ </section>
1155
+ <section>
1156
+ <div class="add-page-section-label">References</div>
1157
+ <div class="add-page-dropzone" ref="addPageReferenceDrop">Drop reference files here</div>
1158
+ <button type="button" class="add-page-btn add-page-btn-cancel" ref="addPageAttachReferenceBtn" style="margin-top:8px;width:100%">Attach reference</button>
1159
+ <input type="file" class="add-page-hidden-file" ref="addPageReferenceFileInput" multiple />
1160
+ <p class="add-page-hint" if="showAddPageUploadHint">{addPageUploadHint}</p>
1161
+ <div class="add-page-chips" ref="addPageAttachmentsList" if="showAddPageAttachments">
1162
+ <div class="add-page-chip" forEach="addPageAttachmentRows" trackBy="rowKey">
1163
+ <span class="add-page-chip-name">{filename}</span>
1164
+ <select data-attachment-id="{id}" value="{role}">
1165
+ <option value="reference">Reference</option>
1166
+ <option value="asset">Asset</option>
1167
+ </select>
1168
+ <span class="add-page-chip-path">{path}</span>
1169
+ <button type="button" class="add-page-chip-remove" data-add-page-remove="{id}">×</button>
1170
+ </div>
1171
+ </div>
1172
+ </section>
1173
+ <p class="add-page-field-error" if="showAddPageComposerError">{addPageComposerError}</p>
1174
+ <p class="add-page-hint" if="showAddPageRunningHint">{addPageRunningHint}</p>
1175
+ </div>
1176
+ <div class="add-page-footer">
1177
+ <button type="button" class="add-page-btn add-page-btn-cancel" ref="addPageCancelBtn">Cancel</button>
1178
+ <button type="button" class="add-page-btn add-page-btn-primary" ref="addPageCreateBtn" disabled="addPageCreateDisabled">Create page</button>
1179
+ </div>
1180
+ <div class="add-page-brief-fill-popover" if="showBriefFillPopover" ref="addPageBriefFillPopover">
1181
+ <div class="add-page-brief-fill-panel">
1182
+ <div class="add-page-brief-fill-header">
1183
+ <span class="add-page-brief-fill-title">Fill from image</span>
1184
+ <button type="button" class="add-page-close" ref="addPageBriefFillCloseBtn" aria-label="Close">×</button>
1185
+ </div>
1186
+ <p class="add-page-hint">Add at least one screenshot. Optional notes help the AI (e.g. Image 1 = desktop, Image 2 = mobile).</p>
1187
+ <label class="add-page-hint">Context notes
1188
+ <textarea class="add-page-brief-fill-context" ref="addPageBriefFillContextNotes" placeholder="Route: /pricing&#10;Match header from home&#10;Image 2 = mobile frame" value="{briefFillContextNotes}" disabled="briefFillInputDisabled"></textarea>
1189
+ </label>
1190
+ <div class="{briefFillDropzoneClass}" ref="addPageBriefFillDropzone" tabindex="0">Paste (⌘V), drag-drop, or click to upload (max 5 images)</div>
1191
+ <input type="file" class="add-page-hidden-file" ref="addPageBriefFillFileInput" accept="image/*" multiple disabled="briefFillInputDisabled" />
1192
+ <div class="add-page-brief-fill-thumbs" ref="addPageBriefFillThumbnails" if="showBriefFillThumbnails">
1193
+ <div class="add-page-brief-fill-thumb" forEach="addPageBriefFillThumbRows" trackBy="rowKey">
1194
+ <img src="{thumbUrl}" alt="{name}" />
1195
+ <button type="button" class="add-page-brief-fill-thumb-remove" data-brief-fill-remove="{index}" disabled="removeDisabled">×</button>
1196
+ </div>
1197
+ </div>
1198
+ <p class="add-page-field-error" if="showBriefFillPopoverError">{briefFillPopoverError}</p>
1199
+ <p class="add-page-hint" if="showBriefFillStatusHint">{briefFillStatusHint}</p>
1200
+ <div class="add-page-brief-fill-actions">
1201
+ <button type="button" class="add-page-btn add-page-btn-cancel" ref="addPageBriefFillCancelBtn">Cancel</button>
1202
+ <button type="button" class="add-page-btn add-page-btn-primary" ref="addPageBriefFillGenerateBtn" disabled="addPageBriefFillGenerateDisabled" style="flex:0">Generate</button>
1203
+ </div>
1204
+ </div>
1205
+ </div>
1206
+ </div>
670
1207
  <div class="{bottomPanelClass}">
671
1208
  <div class="bottom-panel-resize" ref="bottomPanelResize"></div>
672
1209
  <div class="bottom-panel-header" ref="bottomPanelHeader">
673
- <span class="bottom-panel-title">Claude Code Output</span>
1210
+ <span class="bottom-panel-title">Agent output</span>
674
1211
  <span class="bottom-panel-running" if="showBottomPanelRunning"></span>
675
1212
  <span class="bottom-panel-spacer"></span>
676
1213
  <button type="button" class="bottom-panel-clear" ref="bottomPanelClearBtn">Clear</button>
677
1214
  <button type="button" class="bottom-panel-toggle" ref="bottomPanelToggleBtn">{bottomPanelToggleGlyph}</button>
678
1215
  </div>
679
1216
  <div class="output-panel" ref="outputScroll">
680
- <div class="{cssClass}" forEach="chunks" trackBy="text"><span if="filePath" class="chunk-tool-prefix">&gt; {toolName} </span><a if="filePath" class="file-link" href="#" data-path="{filePath}">{filePath}</a><span if="!filePath">{text}</span></div>
1217
+ <div class="{cssClass}" forEach="chunks" trackBy="text"><span if="showUserPrefix" class="chunk-user-prefix">You: </span><span if="filePath" class="chunk-tool-prefix">&gt; {toolName} </span><a if="filePath" class="file-link" href="#" data-path="{filePath}">{filePath}</a><span if="!filePath">{text}</span></div>
1218
+ </div>
1219
+ <div class="agent-chat-row" if="showAgentChatInput">
1220
+ <textarea class="agent-chat-input" ref="agentChatInput" rows="1" value="{agentChatMessage}" placeholder="{agentChatPlaceholder}" disabled="agentChatInputDisabled" aria-label="Message to agent"></textarea>
1221
+ <button type="button" class="agent-chat-send" ref="agentChatSendBtn" disabled="agentChatSendDisabled" aria-label="Send message">Send</button>
681
1222
  </div>
682
1223
  </div>
683
1224
  </div>
@@ -793,6 +1334,36 @@ data:
793
1334
  data-annotation-id="{id}"
794
1335
  value="{instruction}"
795
1336
  ></textarea>
1337
+ <div class="annotation-binding">
1338
+ <button type="button" class="annotation-binding-toggle">Components (optional)</button>
1339
+ <div class="annotation-binding-panel" if="showBindingControls">
1340
+ <div if="showMarkerHasBindingChips">
1341
+ <div class="add-page-plugins-zone-title">Components on this marker</div>
1342
+ <div class="add-page-plugin-chips">
1343
+ <span class="add-page-plugin-chip" forEach="markerBindingChips" trackBy="rowKey">{label}<button type="button" class="add-page-plugin-chip-remove" data-marker-remove-binding="1" data-plugin="{pluginName}" data-contract="{contractName}" title="Remove from marker">×</button></span>
1344
+ </div>
1345
+ </div>
1346
+ <p class="add-page-hint" if="showMarkerBindingEmptyHint">No components yet — pick a plugin below and click Add for each component you need.</p>
1347
+ <div class="add-page-plugins-zone-title">Add component</div>
1348
+ <label class="add-page-hint">Plugin
1349
+ <select class="annotation-binding-plugin">
1350
+ <option value="">— Select plugin —</option>
1351
+ <option forEach="markerPluginOptions" trackBy="rowKey" value="{value}">{label}</option>
1352
+ </select>
1353
+ </label>
1354
+ <button type="button" class="add-page-manage-link" data-marker-manage-plugins="1">Manage plugins…</button>
1355
+ <div if="showMarkerContractPicker">
1356
+ <p class="add-page-hint">{markerPickerPluginLabel}</p>
1357
+ <div class="add-page-plugin-contract">
1358
+ <div class="add-page-plugin-contract-row" forEach="markerContractPickerRows" trackBy="rowKey">
1359
+ <span class="add-page-plugin-contract-name">{contractName}</span>
1360
+ <button type="button" class="add-page-plugin-btn" if="!onPage" data-marker-add-contract="1" data-plugin="{pluginName}" data-package="{packageName}" data-contract="{contractName}" data-key="{componentKey}">Add</button>
1361
+ <span class="add-page-plugin-contract-added" if="onPage">Added</span>
1362
+ </div>
1363
+ </div>
1364
+ </div>
1365
+ </div>
1366
+ </div>
796
1367
  <div class="visual-annotation-files">
797
1368
  <div class="visual-attach-row">
798
1369
  <button type="button" class="visual-attach-btn visual-video-annotation-attach" data-annotation-id="{id}">
@@ -929,6 +1500,36 @@ data:
929
1500
  data-annotation-id="{id}"
930
1501
  value="{instruction}"
931
1502
  ></textarea>
1503
+ <div class="annotation-binding">
1504
+ <button type="button" class="annotation-binding-toggle">Components (optional)</button>
1505
+ <div class="annotation-binding-panel" if="showBindingControls">
1506
+ <div if="showMarkerHasBindingChips">
1507
+ <div class="add-page-plugins-zone-title">Components on this marker</div>
1508
+ <div class="add-page-plugin-chips">
1509
+ <span class="add-page-plugin-chip" forEach="markerBindingChips" trackBy="rowKey">{label}<button type="button" class="add-page-plugin-chip-remove" data-marker-remove-binding="1" data-plugin="{pluginName}" data-contract="{contractName}" title="Remove from marker">×</button></span>
1510
+ </div>
1511
+ </div>
1512
+ <p class="add-page-hint" if="showMarkerBindingEmptyHint">No components yet — pick a plugin below and click Add for each component you need.</p>
1513
+ <div class="add-page-plugins-zone-title">Add component</div>
1514
+ <label class="add-page-hint">Plugin
1515
+ <select class="annotation-binding-plugin">
1516
+ <option value="">— Select plugin —</option>
1517
+ <option forEach="markerPluginOptions" trackBy="rowKey" value="{value}">{label}</option>
1518
+ </select>
1519
+ </label>
1520
+ <button type="button" class="add-page-manage-link" data-marker-manage-plugins="1">Manage plugins…</button>
1521
+ <div if="showMarkerContractPicker">
1522
+ <p class="add-page-hint">{markerPickerPluginLabel}</p>
1523
+ <div class="add-page-plugin-contract">
1524
+ <div class="add-page-plugin-contract-row" forEach="markerContractPickerRows" trackBy="rowKey">
1525
+ <span class="add-page-plugin-contract-name">{contractName}</span>
1526
+ <button type="button" class="add-page-plugin-btn" if="!onPage" data-marker-add-contract="1" data-plugin="{pluginName}" data-package="{packageName}" data-contract="{contractName}" data-key="{componentKey}">Add</button>
1527
+ <span class="add-page-plugin-contract-added" if="onPage">Added</span>
1528
+ </div>
1529
+ </div>
1530
+ </div>
1531
+ </div>
1532
+ </div>
932
1533
  <div class="visual-annotation-files">
933
1534
  <div class="visual-attach-row">
934
1535
  <button type="button" class="visual-attach-btn snapshot-annotation-attach" data-annotation-id="{id}">