agent-canvas 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 (65) hide show
  1. package/bin/agent-canvas.js +14 -0
  2. package/bin/agent-canvas.ts +377 -0
  3. package/daemon/build.ts +185 -0
  4. package/daemon/client/AnnotationProvider.tsx +185 -0
  5. package/daemon/client/AnnotationSidebar.tsx +314 -0
  6. package/daemon/client/App.tsx +611 -0
  7. package/daemon/client/CompareView.tsx +333 -0
  8. package/daemon/client/FileBrowser.tsx +188 -0
  9. package/daemon/client/FileIcon.tsx +76 -0
  10. package/daemon/client/FileViewer.tsx +207 -0
  11. package/daemon/client/PlanRenderer.tsx +665 -0
  12. package/daemon/client/Popover.tsx +285 -0
  13. package/daemon/client/ResponsePreview.tsx +260 -0
  14. package/daemon/client/RevisionSelect.tsx +97 -0
  15. package/daemon/client/SessionContext.tsx +3 -0
  16. package/daemon/client/SessionSwitcher.tsx +72 -0
  17. package/daemon/client/annotationContext.ts +114 -0
  18. package/daemon/client/components/Callout.tsx +25 -0
  19. package/daemon/client/components/Checklist.tsx +37 -0
  20. package/daemon/client/components/Choice.tsx +164 -0
  21. package/daemon/client/components/CodeBlock.tsx +35 -0
  22. package/daemon/client/components/Diff.tsx +65 -0
  23. package/daemon/client/components/FilePreview.tsx +88 -0
  24. package/daemon/client/components/Image.tsx +45 -0
  25. package/daemon/client/components/Mermaid.tsx +277 -0
  26. package/daemon/client/components/Note.tsx +13 -0
  27. package/daemon/client/components/Priority.tsx +19 -0
  28. package/daemon/client/components/ResponseNote.tsx +24 -0
  29. package/daemon/client/components/Section.tsx +32 -0
  30. package/daemon/client/components/Table.tsx +35 -0
  31. package/daemon/client/components/Task.tsx +75 -0
  32. package/daemon/client/components/UserInput.tsx +180 -0
  33. package/daemon/client/components/index.ts +15 -0
  34. package/daemon/client/domDiff.ts +336 -0
  35. package/daemon/client/exportMarkdown.ts +267 -0
  36. package/daemon/client/generateMarkdown.ts +194 -0
  37. package/daemon/client/highlightRange.ts +233 -0
  38. package/daemon/client/index.html +26 -0
  39. package/daemon/client/lcs.ts +19 -0
  40. package/daemon/client/popoverPosition.ts +31 -0
  41. package/daemon/client/runtime.ts +89 -0
  42. package/daemon/client/styles.css +306 -0
  43. package/daemon/client/theme.css +66 -0
  44. package/daemon/client/unifiedDiff.ts +604 -0
  45. package/daemon/dist/client.css +2 -0
  46. package/daemon/dist/client.js +68 -0
  47. package/daemon/dist/components.js +5 -0
  48. package/daemon/dist/index.html +108 -0
  49. package/daemon/dist/jsx-dev-runtime-shim.js +17 -0
  50. package/daemon/dist/jsx-runtime-shim.js +17 -0
  51. package/daemon/dist/react-dom-client-shim.js +4 -0
  52. package/daemon/dist/react-dom-shim.js +4 -0
  53. package/daemon/dist/react-shim.js +4 -0
  54. package/daemon/dist/runtime.js +1 -0
  55. package/daemon/dist/theme.css +66 -0
  56. package/daemon/src/compiler.ts +92 -0
  57. package/daemon/src/paths.ts +22 -0
  58. package/daemon/src/server.ts +448 -0
  59. package/daemon/src/session.ts +274 -0
  60. package/daemon/src/watcher.ts +59 -0
  61. package/hooks/session-start.sh +11 -0
  62. package/package.json +39 -0
  63. package/skills/canvas/SKILL.md +174 -0
  64. package/skills/canvas/components.md +349 -0
  65. package/skills/canvas/flows.md +406 -0
@@ -0,0 +1,306 @@
1
+ @import url('https://fonts.googleapis.com/css2?family=Instrument+Serif&family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500&display=swap');
2
+
3
+ @import "tailwindcss";
4
+ @import "./theme.css";
5
+ @source "./**/*.{tsx,ts,jsx,js}";
6
+
7
+ /* ── Non-theme CSS variables (not used by Tailwind utilities, just custom CSS) ── */
8
+ :root {
9
+ --color-shadow: rgba(0, 0, 0, 0.25);
10
+ --color-scrollbar: rgba(255, 248, 240, 0.06);
11
+ --color-scrollbar-hover: rgba(255, 248, 240, 0.12);
12
+ --color-folder-fill: rgba(196, 154, 58, 0.15);
13
+ --color-folder-fill-active: rgba(196, 154, 58, 0.25);
14
+ --color-folder-stroke: rgba(196, 154, 58, 0.5);
15
+ --color-folder-stroke-active: #c49a3a;
16
+ --color-hljs-base: #c4beb7;
17
+ --color-hljs-keyword: #d2a6ff;
18
+ --color-hljs-string: #a8cc8c;
19
+ --color-hljs-comment: #847d75;
20
+ --color-hljs-number: #e8a87c;
21
+ --color-hljs-variable: #7ec8e3;
22
+ --color-hljs-function: #dbc074;
23
+ --color-hljs-punctuation: #a09a92;
24
+ }
25
+
26
+ [data-theme="light"] {
27
+ /* Override Tailwind theme vars */
28
+ --color-bg-base: #faf5e6;
29
+ --color-bg-surface: #f3edd8;
30
+ --color-bg-elevated: #ebe4ce;
31
+ --color-bg-code: #f0ebd5;
32
+ --color-bg-input: rgba(80, 60, 10, 0.05);
33
+ --color-bg-elevated-half: rgba(235, 228, 206, 0.5);
34
+
35
+ --color-text-primary: #2a2520;
36
+ --color-text-secondary: #5a5550;
37
+ --color-text-tertiary: #9a9390;
38
+ --color-text-code: #4a4540;
39
+ --color-text-disabled: #c5c0b8;
40
+ --color-text-inverse: #faf6ef;
41
+
42
+ --color-border-subtle: rgba(80, 60, 30, 0.08);
43
+ --color-border-medium: rgba(80, 60, 30, 0.10);
44
+ --color-border-hover: rgba(80, 60, 30, 0.15);
45
+ --color-border-strong: rgba(80, 60, 30, 0.20);
46
+
47
+ --color-accent-green: #3a8a5a;
48
+ --color-accent-green-muted: rgba(58, 138, 90, 0.10);
49
+ --color-accent-amber: #a07820;
50
+ --color-accent-amber-muted: rgba(160, 120, 32, 0.10);
51
+ --color-accent-red: #b84a4a;
52
+ --color-accent-red-muted: rgba(184, 74, 74, 0.08);
53
+ --color-accent-blue: #4a7eb4;
54
+ --color-accent-blue-muted: rgba(74, 126, 180, 0.08);
55
+
56
+ --color-highlight-bg: rgba(200, 160, 30, 0.15);
57
+ --color-highlight-border: rgba(200, 160, 30, 0.40);
58
+ --color-highlight-annotation: rgba(200, 160, 30, 0.18);
59
+ --color-highlight-active: rgba(200, 160, 30, 0.25);
60
+ --color-highlight-selected: rgba(200, 160, 30, 0.10);
61
+
62
+ --color-badge-bg: rgba(160, 120, 32, 0.15);
63
+ --color-btn-primary: #2a2520;
64
+ --color-btn-primary-text: #faf6ef;
65
+
66
+ /* Override non-theme vars */
67
+ --color-shadow: rgba(80, 60, 30, 0.10);
68
+ --color-scrollbar: rgba(80, 60, 30, 0.08);
69
+ --color-scrollbar-hover: rgba(80, 60, 30, 0.15);
70
+ --color-folder-fill: rgba(160, 120, 32, 0.12);
71
+ --color-folder-fill-active: rgba(160, 120, 32, 0.22);
72
+ --color-folder-stroke: rgba(160, 120, 32, 0.4);
73
+ --color-folder-stroke-active: #a07820;
74
+ --color-hljs-base: #4a4540;
75
+ --color-hljs-keyword: #7c3aed;
76
+ --color-hljs-string: #2e7d32;
77
+ --color-hljs-comment: #9a9390;
78
+ --color-hljs-number: #c45a20;
79
+ --color-hljs-variable: #1976d2;
80
+ --color-hljs-function: #8a6d00;
81
+ --color-hljs-punctuation: #6b6560;
82
+ }
83
+
84
+ /* ── Base styles ── */
85
+ @layer base {
86
+ body {
87
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
88
+ background-color: var(--color-bg-base);
89
+ color: var(--color-text-primary);
90
+ -webkit-font-smoothing: antialiased;
91
+ -moz-osx-font-smoothing: grayscale;
92
+ }
93
+ }
94
+
95
+ code, pre, .font-mono {
96
+ font-family: 'JetBrains Mono', 'Fira Code', Consolas, monospace;
97
+ }
98
+
99
+ /* Annotation highlight */
100
+ .annotation-highlight {
101
+ background: var(--color-highlight-bg);
102
+ border-bottom: 2px solid var(--color-highlight-border);
103
+ border-radius: 2px;
104
+ cursor: pointer;
105
+ transition: background 150ms ease;
106
+ }
107
+
108
+ .annotation-highlight:hover,
109
+ .annotation-highlight.active {
110
+ background: var(--color-highlight-active);
111
+ }
112
+
113
+ /* Selection color */
114
+ ::selection {
115
+ background-color: var(--color-highlight-active);
116
+ color: var(--color-text-primary);
117
+ }
118
+
119
+ /* Focus ring */
120
+ *:focus-visible {
121
+ outline: 2px solid var(--color-accent-blue);
122
+ outline-offset: 2px;
123
+ border-radius: 4px;
124
+ }
125
+
126
+ textarea:focus-visible {
127
+ outline: none;
128
+ }
129
+
130
+ /* Transitions */
131
+ button, a, [role="button"] {
132
+ transition: all 150ms ease;
133
+ }
134
+
135
+ /* Scrollbar */
136
+ ::-webkit-scrollbar {
137
+ width: 6px;
138
+ height: 6px;
139
+ }
140
+
141
+ ::-webkit-scrollbar-track {
142
+ background: transparent;
143
+ }
144
+
145
+ ::-webkit-scrollbar-thumb {
146
+ background: var(--color-scrollbar);
147
+ border-radius: 3px;
148
+ }
149
+
150
+ ::-webkit-scrollbar-thumb:hover {
151
+ background: var(--color-scrollbar-hover);
152
+ }
153
+
154
+ /* Diff highlights for compare view */
155
+ .diff-added {
156
+ background-color: color-mix(in srgb, var(--color-accent-green) 25%, transparent);
157
+ border-radius: 2px;
158
+ padding-inline: 1px;
159
+ padding-block: 1px;
160
+ }
161
+ .diff-removed {
162
+ background-color: color-mix(in srgb, var(--color-accent-red) 25%, transparent);
163
+ border-radius: 2px;
164
+ padding-inline: 1px;
165
+ padding-block: 1px;
166
+ text-decoration: line-through;
167
+ text-decoration-color: var(--color-accent-red);
168
+ }
169
+
170
+ /* Block-level diff highlights for unified compare view */
171
+ .diff-block-removed {
172
+ background: color-mix(in srgb, var(--color-accent-red) 8%, transparent);
173
+ border-left: 3px solid var(--color-accent-red);
174
+ opacity: 0.7;
175
+ }
176
+ .diff-block-added {
177
+ background: color-mix(in srgb, var(--color-accent-green) 8%, transparent);
178
+ border-left: 3px solid var(--color-accent-green);
179
+ }
180
+ .diff-row-removed td {
181
+ background: color-mix(in srgb, var(--color-accent-red) 10%, transparent);
182
+ text-decoration: line-through;
183
+ text-decoration-color: var(--color-accent-red);
184
+ opacity: 0.6;
185
+ }
186
+ .diff-row-added td {
187
+ background: color-mix(in srgb, var(--color-accent-green) 10%, transparent);
188
+ }
189
+ .diff-item-removed {
190
+ background: color-mix(in srgb, var(--color-accent-red) 10%, transparent);
191
+ text-decoration: line-through;
192
+ text-decoration-color: var(--color-accent-red);
193
+ opacity: 0.6;
194
+ }
195
+ .diff-item-added {
196
+ background: color-mix(in srgb, var(--color-accent-green) 10%, transparent);
197
+ }
198
+ .diff-block-label {
199
+ position: absolute;
200
+ top: 4px;
201
+ right: 8px;
202
+ font-size: 10px;
203
+ font-weight: 500;
204
+ text-transform: uppercase;
205
+ padding: 1px 6px;
206
+ border-radius: 3px;
207
+ pointer-events: none;
208
+ }
209
+
210
+ /* Plan update flash */
211
+ @keyframes plan-refresh {
212
+ 0% { opacity: 0.6; }
213
+ 100% { opacity: 1; }
214
+ }
215
+
216
+ .plan-updated {
217
+ animation: plan-refresh 300ms ease;
218
+ }
219
+
220
+ /* Range input styling */
221
+ input[type="range"] {
222
+ height: 20px;
223
+ -webkit-appearance: none;
224
+ appearance: none;
225
+ background: transparent;
226
+ }
227
+
228
+ input[type="range"]::-webkit-slider-thumb {
229
+ -webkit-appearance: none;
230
+ appearance: none;
231
+ width: 14px;
232
+ height: 14px;
233
+ border-radius: 50%;
234
+ background: var(--color-accent-amber);
235
+ cursor: pointer;
236
+ border: 2px solid var(--color-bg-base);
237
+ margin-top: -5px;
238
+ }
239
+
240
+ input[type="range"]::-moz-range-thumb {
241
+ width: 14px;
242
+ height: 14px;
243
+ border-radius: 50%;
244
+ background: var(--color-accent-amber);
245
+ cursor: pointer;
246
+ border: 2px solid var(--color-bg-base);
247
+ }
248
+
249
+ input[type="range"]::-webkit-slider-runnable-track {
250
+ height: 4px;
251
+ border-radius: 2px;
252
+ background: transparent;
253
+ }
254
+
255
+ input[type="range"]::-moz-range-track {
256
+ height: 4px;
257
+ border-radius: 2px;
258
+ background: transparent;
259
+ }
260
+
261
+ /* highlight.js overrides */
262
+ .hljs {
263
+ background: transparent !important;
264
+ color: var(--color-hljs-base) !important;
265
+ }
266
+
267
+ pre code.hljs {
268
+ padding: 0 !important;
269
+ }
270
+
271
+ .hljs-keyword, .hljs-selector-tag, .hljs-built_in, .hljs-name, .hljs-tag {
272
+ color: var(--color-hljs-keyword) !important;
273
+ }
274
+
275
+ .hljs-string, .hljs-title, .hljs-section, .hljs-attribute, .hljs-literal,
276
+ .hljs-template-tag, .hljs-template-variable, .hljs-type {
277
+ color: var(--color-hljs-string) !important;
278
+ }
279
+
280
+ .hljs-comment, .hljs-quote, .hljs-deletion, .hljs-meta {
281
+ color: var(--color-hljs-comment) !important;
282
+ }
283
+
284
+ .hljs-number, .hljs-regexp, .hljs-addition {
285
+ color: var(--color-hljs-number) !important;
286
+ }
287
+
288
+ .hljs-variable, .hljs-attr {
289
+ color: var(--color-hljs-variable) !important;
290
+ }
291
+
292
+ .hljs-function .hljs-title, .hljs-title.function_ {
293
+ color: var(--color-hljs-function) !important;
294
+ }
295
+
296
+ .hljs-params {
297
+ color: var(--color-hljs-base) !important;
298
+ }
299
+
300
+ .hljs-property {
301
+ color: var(--color-hljs-variable) !important;
302
+ }
303
+
304
+ .hljs-punctuation {
305
+ color: var(--color-hljs-punctuation) !important;
306
+ }
@@ -0,0 +1,66 @@
1
+ @theme {
2
+ /* Colors — initial values, overridden by [data-theme] in styles.css */
3
+ --color-bg-base: #1a1915;
4
+ --color-bg-surface: #1f1e18;
5
+ --color-bg-elevated: #25241d;
6
+ --color-bg-code: #1c1b16;
7
+ --color-bg-input: rgba(255, 248, 220, 0.03);
8
+ --color-bg-elevated-half: rgba(37, 36, 29, 0.5);
9
+
10
+ --color-text-primary: #e8e4df;
11
+ --color-text-secondary: #a09a92;
12
+ --color-text-tertiary: #847d75;
13
+ --color-text-code: #c4beb7;
14
+ --color-text-disabled: #3a3530;
15
+ --color-text-inverse: #1a1a1a;
16
+
17
+ --color-border-subtle: rgba(255, 248, 240, 0.06);
18
+ --color-border-medium: rgba(255, 248, 240, 0.08);
19
+ --color-border-hover: rgba(255, 248, 240, 0.12);
20
+ --color-border-strong: rgba(255, 248, 240, 0.15);
21
+
22
+ --color-accent-green: #4a9e6d;
23
+ --color-accent-green-muted: rgba(74, 158, 109, 0.12);
24
+ --color-accent-amber: #c49a3a;
25
+ --color-accent-amber-muted: rgba(196, 154, 58, 0.12);
26
+ --color-accent-red: #c45a5a;
27
+ --color-accent-red-muted: rgba(196, 90, 90, 0.12);
28
+ --color-accent-blue: #5a8ec4;
29
+ --color-accent-blue-muted: rgba(90, 142, 196, 0.10);
30
+
31
+ --color-highlight-bg: rgba(255, 220, 100, 0.15);
32
+ --color-highlight-border: rgba(255, 220, 100, 0.35);
33
+ --color-highlight-annotation: rgba(255, 220, 100, 0.18);
34
+ --color-highlight-active: rgba(255, 220, 100, 0.25);
35
+ --color-highlight-selected: rgba(255, 220, 100, 0.10);
36
+
37
+ --color-badge-bg: rgba(196, 154, 58, 0.20);
38
+ --color-btn-primary: #e8e4df;
39
+ --color-btn-primary-text: #1a1a1a;
40
+
41
+ /* Fonts */
42
+ --font-heading: 'Instrument Serif', Georgia, 'Times New Roman', serif;
43
+ --font-body: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
44
+ --font-mono: 'JetBrains Mono', 'Fira Code', Consolas, monospace;
45
+
46
+ /* Font sizes */
47
+ --text-section: 1.75rem;
48
+ --text-section--line-height: 1.25;
49
+ --text-section--letter-spacing: -0.01em;
50
+ --text-task-label: 0.9375rem;
51
+ --text-task-label--line-height: 1.4;
52
+ --text-body: 0.875rem;
53
+ --text-body--line-height: 1.65;
54
+ --text-code: 0.8125rem;
55
+ --text-code--line-height: 1.6;
56
+ --text-meta: 0.75rem;
57
+ --text-meta--line-height: 1.4;
58
+ --text-meta--letter-spacing: 0.02em;
59
+ --text-tiny: 0.6875rem;
60
+ --text-tiny--line-height: 1.4;
61
+
62
+ /* Shadows */
63
+ --shadow-sm: 0 1px 2px var(--color-shadow);
64
+ --shadow-md: 0 4px 12px var(--color-shadow);
65
+ --shadow-lg: 0 8px 24px var(--color-shadow);
66
+ }