liteagents 2.6.0 → 2.8.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 (57) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/LICENSE +202 -21
  3. package/README.md +6 -4
  4. package/installer/cli.js +4 -1
  5. package/package.json +2 -2
  6. package/packages/ampcode/commands/live-canvas/README.md +38 -47
  7. package/packages/{claude/skills/live-canvas/templates/demo → ampcode/commands/live-canvas/dev}/post-variants.html +8 -3
  8. package/packages/ampcode/commands/live-canvas/templates/lab-banner.html +6 -0
  9. package/packages/ampcode/commands/live-canvas/templates/overlay-vanilla.js +64 -6
  10. package/packages/ampcode/commands/live-canvas.md +140 -161
  11. package/packages/claude/plugins/live-canvas-marketplace/plugins/live-canvas-channel/.claude-plugin/plugin.json +1 -1
  12. package/packages/claude/plugins/live-canvas-marketplace/plugins/live-canvas-channel/README.md +2 -2
  13. package/packages/claude/plugins/live-canvas-marketplace/plugins/live-canvas-channel/package-lock.json +13 -13
  14. package/packages/claude/plugins/live-canvas-marketplace/plugins/live-canvas-channel/package.json +1 -1
  15. package/packages/claude/plugins/live-canvas-marketplace/plugins/live-canvas-channel/schema.json +1 -1
  16. package/packages/claude/plugins/live-canvas-marketplace/plugins/live-canvas-channel/server.js +320 -27
  17. package/packages/claude/plugins/live-canvas-marketplace/setup.sh +83 -24
  18. package/packages/claude/skills/live-canvas/README.md +53 -57
  19. package/packages/claude/skills/live-canvas/SKILL.md +122 -158
  20. package/packages/{ampcode/commands/live-canvas/templates/demo → claude/skills/live-canvas/dev}/post-variants.html +8 -3
  21. package/packages/claude/skills/live-canvas/templates/lab-banner.html +6 -0
  22. package/packages/claude/skills/live-canvas/templates/overlay-vanilla.js +64 -6
  23. package/packages/droid/commands/live-canvas/README.md +38 -47
  24. package/packages/droid/commands/live-canvas/{templates/demo → dev}/post-variants.html +8 -3
  25. package/packages/droid/commands/live-canvas/templates/lab-banner.html +6 -0
  26. package/packages/droid/commands/live-canvas/templates/overlay-vanilla.js +64 -6
  27. package/packages/droid/commands/live-canvas.md +140 -161
  28. package/packages/opencode/command/live-canvas/README.md +38 -47
  29. package/packages/opencode/command/live-canvas/{templates/demo → dev}/post-variants.html +8 -3
  30. package/packages/opencode/command/live-canvas/templates/lab-banner.html +6 -0
  31. package/packages/opencode/command/live-canvas/templates/overlay-vanilla.js +64 -6
  32. package/packages/opencode/command/live-canvas.md +140 -161
  33. package/packages/ampcode/commands/live-canvas/templates/.claude/settings.local.json +0 -8
  34. package/packages/ampcode/commands/live-canvas/templates/feedback-react/FeedbackOverlay.tsx +0 -1299
  35. package/packages/ampcode/commands/live-canvas/templates/feedback-react/format-utils.ts +0 -283
  36. package/packages/ampcode/commands/live-canvas/templates/feedback-react/index.ts +0 -62
  37. package/packages/ampcode/commands/live-canvas/templates/feedback-react/selector-utils.ts +0 -423
  38. package/packages/ampcode/commands/live-canvas/templates/feedback-react/types.ts +0 -118
  39. package/packages/claude/skills/live-canvas/INTEGRATION_NOTES.md +0 -210
  40. package/packages/claude/skills/live-canvas/templates/.claude/settings.local.json +0 -8
  41. package/packages/claude/skills/live-canvas/templates/feedback-react/FeedbackOverlay.tsx +0 -1299
  42. package/packages/claude/skills/live-canvas/templates/feedback-react/format-utils.ts +0 -283
  43. package/packages/claude/skills/live-canvas/templates/feedback-react/index.ts +0 -62
  44. package/packages/claude/skills/live-canvas/templates/feedback-react/selector-utils.ts +0 -423
  45. package/packages/claude/skills/live-canvas/templates/feedback-react/types.ts +0 -118
  46. package/packages/droid/commands/live-canvas/templates/.claude/settings.local.json +0 -8
  47. package/packages/droid/commands/live-canvas/templates/feedback-react/FeedbackOverlay.tsx +0 -1299
  48. package/packages/droid/commands/live-canvas/templates/feedback-react/format-utils.ts +0 -283
  49. package/packages/droid/commands/live-canvas/templates/feedback-react/index.ts +0 -62
  50. package/packages/droid/commands/live-canvas/templates/feedback-react/selector-utils.ts +0 -423
  51. package/packages/droid/commands/live-canvas/templates/feedback-react/types.ts +0 -118
  52. package/packages/opencode/command/live-canvas/templates/.claude/settings.local.json +0 -8
  53. package/packages/opencode/command/live-canvas/templates/feedback-react/FeedbackOverlay.tsx +0 -1299
  54. package/packages/opencode/command/live-canvas/templates/feedback-react/format-utils.ts +0 -283
  55. package/packages/opencode/command/live-canvas/templates/feedback-react/index.ts +0 -62
  56. package/packages/opencode/command/live-canvas/templates/feedback-react/selector-utils.ts +0 -423
  57. package/packages/opencode/command/live-canvas/templates/feedback-react/types.ts +0 -118
@@ -23,7 +23,7 @@
23
23
  * Batch — saves accumulate locally; Submit All POSTs JSONL to batchEndpoint
24
24
  * (or downloads the file if no endpoint configured)
25
25
  *
26
- * Payload schema: v1.0, compatible with the upstream React FeedbackOverlay.
26
+ * Payload schema: v1.0 (see live-canvas-channel/schema.json).
27
27
  */
28
28
  (function () {
29
29
  'use strict';
@@ -38,11 +38,16 @@
38
38
  batchEndpoint: null,
39
39
  active: false,
40
40
  picking: false,
41
+ minimized: false, // collapsed to a single bubble?
41
42
  comments: [], // Comment[] — only items pending batch submit
42
43
  overall: '',
43
44
  pinCounts: Object.create(null), // `${variant}|${selector}` → placed-pin count
44
45
  };
45
46
 
47
+ // Persist collapse state across hot reloads / variant switches.
48
+ const MIN_KEY = 'lc-minimized';
49
+ try { state.minimized = sessionStorage.getItem(MIN_KEY) === '1'; } catch (_) {}
50
+
46
51
  // ---------- utilities ----------
47
52
 
48
53
  const uid = () => `c-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
@@ -134,7 +139,8 @@
134
139
  const css = `
135
140
  [${DATA_OVERLAY}] { font-family: system-ui, sans-serif; box-sizing: border-box; }
136
141
  .${PFX}-bar { position: fixed; right: 16px; bottom: 16px; z-index: 2147483646;
137
- display: flex; gap: 8px; }
142
+ display: flex; gap: 8px; align-items: center; }
143
+ .${PFX}-bar[data-hidden='1'] { display: none; }
138
144
  .${PFX}-btn { border: 0; border-radius: 999px; padding: 10px 16px;
139
145
  font-weight: 600; font-size: 13px; cursor: pointer;
140
146
  box-shadow: 0 4px 12px rgba(0,0,0,.25); font-family: inherit; }
@@ -146,9 +152,22 @@
146
152
  .${PFX}-submit .${PFX}-count { display: inline-block; background: #d946ef; color: #fff;
147
153
  border-radius: 999px; min-width: 18px; padding: 0 6px; margin-left: 6px;
148
154
  font-size: 11px; line-height: 18px; text-align: center; }
155
+ .${PFX}-min { width: 32px; height: 32px; padding: 0; border-radius: 50%;
156
+ background: #fff; color: #111; border: 1px solid #e4e4e7; font-size: 16px;
157
+ line-height: 1; display: flex; align-items: center; justify-content: center; }
158
+ .${PFX}-bubble { position: fixed; right: 16px; bottom: 16px; z-index: 2147483646;
159
+ width: 36px; height: 36px; border-radius: 50%; border: 0; cursor: pointer;
160
+ background: #111; color: #fff; font-size: 14px; font-weight: 700;
161
+ box-shadow: 0 4px 12px rgba(0,0,0,.25); display: none; }
162
+ .${PFX}-bubble[data-show='1'] { display: flex; align-items: center; justify-content: center; }
149
163
  .${PFX}-mode { position: fixed; right: 16px; bottom: 60px; z-index: 2147483646;
150
164
  background: rgba(0,0,0,.75); color: #fff; font-size: 11px;
151
165
  padding: 4px 8px; border-radius: 4px; pointer-events: none; }
166
+ .${PFX}-mode[data-hidden='1'] { display: none; }
167
+ @media (max-width: 640px) {
168
+ .${PFX}-popup { left: 8px !important; right: 8px; width: auto !important; max-width: none; }
169
+ .${PFX}-submit-card { width: 100% !important; max-width: calc(100vw - 24px); }
170
+ }
152
171
  .${PFX}-picking { cursor: crosshair !important; }
153
172
  .${PFX}-hover-outline { outline: 2px solid #d946ef !important; outline-offset: 2px; }
154
173
  .${PFX}-pin { position: absolute; z-index: 2147483645; width: 24px; height: 24px;
@@ -235,9 +254,33 @@
235
254
 
236
255
  // ---------- UI ----------
237
256
 
238
- let toggleBtn, submitBtn, modeBadge, toast, popupNode;
257
+ let toggleBtn, submitBtn, minBtn, bubbleBtn, barNode, modeBadge, toast, popupNode;
239
258
  let hoverEl = null;
240
259
 
260
+ const applyMinimized = () => {
261
+ if (!barNode) return;
262
+ barNode.setAttribute('data-hidden', state.minimized ? '1' : '0');
263
+ modeBadge.setAttribute('data-hidden', state.minimized ? '1' : '0');
264
+ bubbleBtn.setAttribute('data-show', state.minimized ? '1' : '0');
265
+ // state.mode can flip live → batch mid-session if a push fails; refresh
266
+ // the badge each time we re-show it so it doesn't lie.
267
+ if (!state.minimized) {
268
+ modeBadge.textContent = `${state.mode === 'live' ? 'LIVE' : 'JSON'} mode`;
269
+ }
270
+ // Cancel an active pick when collapsing — otherwise clicks land on the page.
271
+ if (state.minimized && state.picking) {
272
+ state.picking = false;
273
+ setPickingCursor(false);
274
+ clearHover();
275
+ toggleBtn.setAttribute('data-active', '0');
276
+ toggleBtn.textContent = 'Add Feedback';
277
+ }
278
+ closePopup();
279
+ try { sessionStorage.setItem(MIN_KEY, state.minimized ? '1' : '0'); } catch (_) {}
280
+ };
281
+
282
+ const setMinimized = (v) => { state.minimized = !!v; applyMinimized(); };
283
+
241
284
  const pendingCount = () => state.comments.filter(c => !c.delivered).length;
242
285
 
243
286
  const refreshSubmitBtn = () => {
@@ -442,14 +485,29 @@
442
485
  submitBtn = el('button', { class: `${PFX}-btn ${PFX}-submit`, on: {
443
486
  click: openSubmitModal,
444
487
  }});
488
+ minBtn = el('button', {
489
+ class: `${PFX}-btn ${PFX}-min`,
490
+ title: 'Hide overlay',
491
+ 'aria-label': 'Hide overlay',
492
+ on: { click: () => setMinimized(true) },
493
+ }, '−');
445
494
  refreshSubmitBtn();
446
- const bar = el('div', { class: `${PFX}-bar` }, [submitBtn, toggleBtn]);
447
- modeBadge = el('div', { class: `${PFX}-mode` }, `${state.mode === 'live' ? 'LIVE' : 'BATCH'} mode`);
495
+ barNode = el('div', { class: `${PFX}-bar` }, [minBtn, submitBtn, toggleBtn]);
496
+ bubbleBtn = el('button', {
497
+ class: `${PFX}-bubble`,
498
+ title: 'Show feedback overlay',
499
+ 'aria-label': 'Show feedback overlay',
500
+ on: { click: () => setMinimized(false) },
501
+ }, '◐');
502
+ modeBadge = el('div', { class: `${PFX}-mode` }, `${state.mode === 'live' ? 'LIVE' : 'JSON'} mode`);
448
503
  toast = el('div', { class: `${PFX}-toast` });
449
- document.body.appendChild(bar);
504
+ document.body.appendChild(barNode);
505
+ document.body.appendChild(bubbleBtn);
450
506
  document.body.appendChild(modeBadge);
451
507
  document.body.appendChild(toast);
452
508
 
509
+ applyMinimized();
510
+
453
511
  document.addEventListener('mousemove', onMouseMove, true);
454
512
  document.addEventListener('click', onClick, true);
455
513
  };