create-walle 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 (136) hide show
  1. package/bin/create-walle.js +134 -0
  2. package/package.json +18 -0
  3. package/template/.env.example +40 -0
  4. package/template/CLAUDE.md +12 -0
  5. package/template/LICENSE +21 -0
  6. package/template/README.md +167 -0
  7. package/template/bin/setup.js +100 -0
  8. package/template/claude-code-skill.md +60 -0
  9. package/template/claude-task-manager/api-prompts.js +1841 -0
  10. package/template/claude-task-manager/api-reviews.js +275 -0
  11. package/template/claude-task-manager/approval-agent.js +454 -0
  12. package/template/claude-task-manager/bin/restart-ctm.sh +16 -0
  13. package/template/claude-task-manager/db.js +1721 -0
  14. package/template/claude-task-manager/docs/PROMPT-MANAGEMENT-DESIGN.md +631 -0
  15. package/template/claude-task-manager/git-utils.js +214 -0
  16. package/template/claude-task-manager/package-lock.json +1607 -0
  17. package/template/claude-task-manager/package.json +31 -0
  18. package/template/claude-task-manager/prompt-harvest.js +1148 -0
  19. package/template/claude-task-manager/public/css/prompts.css +880 -0
  20. package/template/claude-task-manager/public/css/reviews.css +430 -0
  21. package/template/claude-task-manager/public/css/walle.css +732 -0
  22. package/template/claude-task-manager/public/favicon.ico +0 -0
  23. package/template/claude-task-manager/public/icon.svg +37 -0
  24. package/template/claude-task-manager/public/index.html +8346 -0
  25. package/template/claude-task-manager/public/js/prompts.js +3159 -0
  26. package/template/claude-task-manager/public/js/reviews.js +1292 -0
  27. package/template/claude-task-manager/public/js/walle.js +3081 -0
  28. package/template/claude-task-manager/public/manifest.json +13 -0
  29. package/template/claude-task-manager/public/prompts.html +4353 -0
  30. package/template/claude-task-manager/public/setup.html +216 -0
  31. package/template/claude-task-manager/queue-engine.js +404 -0
  32. package/template/claude-task-manager/server-state.js +5 -0
  33. package/template/claude-task-manager/server.js +2254 -0
  34. package/template/claude-task-manager/session-utils.js +124 -0
  35. package/template/claude-task-manager/start.sh +17 -0
  36. package/template/claude-task-manager/tests/test-ai-search.js +61 -0
  37. package/template/claude-task-manager/tests/test-editor-ux.js +76 -0
  38. package/template/claude-task-manager/tests/test-editor-ux2.js +51 -0
  39. package/template/claude-task-manager/tests/test-features-v2.js +127 -0
  40. package/template/claude-task-manager/tests/test-insights-cached.js +78 -0
  41. package/template/claude-task-manager/tests/test-insights.js +124 -0
  42. package/template/claude-task-manager/tests/test-permissions-v2.js +127 -0
  43. package/template/claude-task-manager/tests/test-permissions.js +122 -0
  44. package/template/claude-task-manager/tests/test-pin.js +51 -0
  45. package/template/claude-task-manager/tests/test-prompts.js +164 -0
  46. package/template/claude-task-manager/tests/test-recent-sessions.js +96 -0
  47. package/template/claude-task-manager/tests/test-review.js +104 -0
  48. package/template/claude-task-manager/tests/test-send-dropdown.js +76 -0
  49. package/template/claude-task-manager/tests/test-send-final.js +30 -0
  50. package/template/claude-task-manager/tests/test-send-fixes.js +76 -0
  51. package/template/claude-task-manager/tests/test-send-integration.js +107 -0
  52. package/template/claude-task-manager/tests/test-send-visual.js +34 -0
  53. package/template/claude-task-manager/tests/test-session-create.js +147 -0
  54. package/template/claude-task-manager/tests/test-sidebar-ux.js +83 -0
  55. package/template/claude-task-manager/tests/test-url-hash.js +68 -0
  56. package/template/claude-task-manager/tests/test-ux-crop.js +34 -0
  57. package/template/claude-task-manager/tests/test-ux-review.js +130 -0
  58. package/template/claude-task-manager/tests/test-zoom-card.js +76 -0
  59. package/template/claude-task-manager/tests/test-zoom.js +92 -0
  60. package/template/claude-task-manager/tests/test-zoom2.js +67 -0
  61. package/template/docs/site/api/README.md +187 -0
  62. package/template/docs/site/guides/claude-code.md +58 -0
  63. package/template/docs/site/guides/configuration.md +96 -0
  64. package/template/docs/site/guides/quickstart.md +158 -0
  65. package/template/docs/site/index.md +14 -0
  66. package/template/docs/site/skills/README.md +135 -0
  67. package/template/wall-e/.dockerignore +11 -0
  68. package/template/wall-e/Dockerfile +25 -0
  69. package/template/wall-e/adapters/adapter-base.js +37 -0
  70. package/template/wall-e/adapters/ctm.js +193 -0
  71. package/template/wall-e/adapters/slack.js +56 -0
  72. package/template/wall-e/agent.js +319 -0
  73. package/template/wall-e/api-walle.js +1073 -0
  74. package/template/wall-e/brain.js +1235 -0
  75. package/template/wall-e/channels/agent-api.js +172 -0
  76. package/template/wall-e/channels/channel-base.js +14 -0
  77. package/template/wall-e/channels/imessage-channel.js +113 -0
  78. package/template/wall-e/channels/slack-channel.js +118 -0
  79. package/template/wall-e/chat.js +778 -0
  80. package/template/wall-e/decision/confidence.js +93 -0
  81. package/template/wall-e/deploy.sh +35 -0
  82. package/template/wall-e/docs/specs/2026-04-01-publish-plan.md +112 -0
  83. package/template/wall-e/docs/specs/SKILL-FORMAT.md +326 -0
  84. package/template/wall-e/extraction/contradiction.js +168 -0
  85. package/template/wall-e/extraction/knowledge-extractor.js +190 -0
  86. package/template/wall-e/fly.toml +24 -0
  87. package/template/wall-e/loops/ingest.js +34 -0
  88. package/template/wall-e/loops/reflect.js +63 -0
  89. package/template/wall-e/loops/tasks.js +487 -0
  90. package/template/wall-e/loops/think.js +125 -0
  91. package/template/wall-e/package-lock.json +533 -0
  92. package/template/wall-e/package.json +18 -0
  93. package/template/wall-e/scripts/ingest-slack-search.js +85 -0
  94. package/template/wall-e/scripts/pull-slack-via-claude.js +98 -0
  95. package/template/wall-e/scripts/slack-backfill.js +295 -0
  96. package/template/wall-e/scripts/slack-channel-history.js +454 -0
  97. package/template/wall-e/server.js +93 -0
  98. package/template/wall-e/skills/_bundled/email-digest/SKILL.md +95 -0
  99. package/template/wall-e/skills/_bundled/email-sync/SKILL.md +65 -0
  100. package/template/wall-e/skills/_bundled/email-sync/mail-reader.jxa +104 -0
  101. package/template/wall-e/skills/_bundled/email-sync/run.js +213 -0
  102. package/template/wall-e/skills/_bundled/google-calendar/SKILL.md +73 -0
  103. package/template/wall-e/skills/_bundled/google-calendar/cal-reader.swift +81 -0
  104. package/template/wall-e/skills/_bundled/google-calendar/run.js +181 -0
  105. package/template/wall-e/skills/_bundled/memory-search/SKILL.md +92 -0
  106. package/template/wall-e/skills/_bundled/morning-briefing/SKILL.md +131 -0
  107. package/template/wall-e/skills/_bundled/morning-briefing/run.js +264 -0
  108. package/template/wall-e/skills/_bundled/slack-backfill/SKILL.md +60 -0
  109. package/template/wall-e/skills/_bundled/slack-sync/SKILL.md +55 -0
  110. package/template/wall-e/skills/claude-code-reader.js +144 -0
  111. package/template/wall-e/skills/mcp-client.js +407 -0
  112. package/template/wall-e/skills/skill-executor.js +163 -0
  113. package/template/wall-e/skills/skill-loader.js +410 -0
  114. package/template/wall-e/skills/skill-planner.js +88 -0
  115. package/template/wall-e/skills/slack-ingest.js +329 -0
  116. package/template/wall-e/skills/slack-pull-live.js +270 -0
  117. package/template/wall-e/skills/tool-executor.js +188 -0
  118. package/template/wall-e/tests/adapter-base.test.js +20 -0
  119. package/template/wall-e/tests/adapter-ctm.test.js +122 -0
  120. package/template/wall-e/tests/adapter-slack.test.js +98 -0
  121. package/template/wall-e/tests/agent-api.test.js +256 -0
  122. package/template/wall-e/tests/api-walle.test.js +222 -0
  123. package/template/wall-e/tests/brain.test.js +602 -0
  124. package/template/wall-e/tests/channels.test.js +104 -0
  125. package/template/wall-e/tests/chat.test.js +103 -0
  126. package/template/wall-e/tests/confidence.test.js +134 -0
  127. package/template/wall-e/tests/contradiction.test.js +217 -0
  128. package/template/wall-e/tests/ingest.test.js +113 -0
  129. package/template/wall-e/tests/mcp-client.test.js +71 -0
  130. package/template/wall-e/tests/reflect.test.js +103 -0
  131. package/template/wall-e/tests/server.test.js +111 -0
  132. package/template/wall-e/tests/skills.test.js +198 -0
  133. package/template/wall-e/tests/slack-ingest.test.js +103 -0
  134. package/template/wall-e/tests/think.test.js +435 -0
  135. package/template/wall-e/tools/local-tools.js +697 -0
  136. package/template/wall-e/tools/slack-mcp.js +290 -0
@@ -0,0 +1,880 @@
1
+ /* Prompts Panel CSS - componentized from prompts.html */
2
+
3
+ /* Prompt sidebar (inside prompts panel) */
4
+ #prompts-panel {
5
+ display: none;
6
+ flex: 1;
7
+ flex-direction: column;
8
+ overflow: hidden;
9
+ }
10
+ #prompts-panel.active { display: flex; }
11
+
12
+ #prompts-panel-inner {
13
+ display: flex;
14
+ flex: 1;
15
+ overflow: hidden;
16
+ }
17
+
18
+ /* Prompt sub-topbar */
19
+ .prompts-topbar {
20
+ display: flex;
21
+ align-items: center;
22
+ gap: 6px;
23
+ padding: 7px 12px;
24
+ border-bottom: 1px solid var(--border);
25
+ background: var(--bg);
26
+ flex-shrink: 0;
27
+ }
28
+ .prompts-topbar .btn { font-size: 11px; padding: 3px 10px; }
29
+
30
+ /* Prompt sidebar */
31
+ #prompt-sidebar {
32
+ width: 280px;
33
+ background: var(--bg-light);
34
+ border-right: 1px solid var(--border);
35
+ display: flex;
36
+ flex-direction: column;
37
+ flex-shrink: 0;
38
+ }
39
+ .sidebar-header {
40
+ padding: 10px;
41
+ border-bottom: 1px solid var(--border);
42
+ display: flex;
43
+ flex-direction: column;
44
+ gap: 6px;
45
+ }
46
+ .sidebar-header .search-row { display: flex; gap: 4px; }
47
+ .sidebar-header input {
48
+ flex: 1;
49
+ background: var(--bg);
50
+ color: var(--fg);
51
+ border: 1px solid var(--border);
52
+ padding: 5px 8px;
53
+ border-radius: 4px;
54
+ font-size: 11px;
55
+ outline: none;
56
+ }
57
+ .sidebar-header input:focus { border-color: var(--accent); }
58
+ .sidebar-header input.ai-active {
59
+ border-color: var(--purple, #bb9af7);
60
+ background: rgba(187, 154, 247, 0.08);
61
+ }
62
+ .pe-ai-search-toggle {
63
+ background: var(--bg-lighter);
64
+ border: 1px solid var(--border);
65
+ color: var(--fg-dim);
66
+ padding: 4px 7px;
67
+ border-radius: 4px;
68
+ cursor: pointer;
69
+ font-size: 10px;
70
+ font-weight: 600;
71
+ white-space: nowrap;
72
+ transition: all 0.15s;
73
+ }
74
+ .pe-ai-search-toggle:hover { border-color: var(--purple, #bb9af7); color: var(--purple, #bb9af7); }
75
+ .pe-ai-search-toggle.active {
76
+ background: var(--purple, #bb9af7);
77
+ border-color: var(--purple, #bb9af7);
78
+ color: #1a1b26;
79
+ }
80
+ .ai-result-reason {
81
+ font-size: 10px;
82
+ color: var(--purple, #bb9af7);
83
+ margin-top: 2px;
84
+ line-height: 1.3;
85
+ font-style: italic;
86
+ }
87
+ .ai-result-score {
88
+ font-size: 9px;
89
+ background: var(--purple, #bb9af7);
90
+ color: #1a1b26;
91
+ padding: 1px 5px;
92
+ border-radius: 8px;
93
+ font-weight: 600;
94
+ flex-shrink: 0;
95
+ }
96
+ .pe-ai-searching {
97
+ padding: 16px;
98
+ text-align: center;
99
+ color: var(--fg-dim);
100
+ font-size: 12px;
101
+ }
102
+ .pe-ai-searching .spinner {
103
+ display: inline-block;
104
+ width: 14px;
105
+ height: 14px;
106
+ border: 2px solid var(--border);
107
+ border-top-color: var(--purple, #bb9af7);
108
+ border-radius: 50%;
109
+ animation: pe-spin 0.6s linear infinite;
110
+ margin-right: 6px;
111
+ vertical-align: middle;
112
+ }
113
+ @keyframes pe-spin { to { transform: rotate(360deg); } }
114
+
115
+ /* Folder tree */
116
+ .folder-tree {
117
+ flex: 0 0 auto;
118
+ max-height: 200px;
119
+ overflow-y: auto;
120
+ padding: 6px;
121
+ }
122
+ .folder-item {
123
+ display: flex;
124
+ align-items: center;
125
+ gap: 6px;
126
+ padding: 5px 8px;
127
+ border-radius: 5px;
128
+ cursor: pointer;
129
+ font-size: 12px;
130
+ margin-bottom: 2px;
131
+ transition: background 0.1s;
132
+ position: relative;
133
+ }
134
+ .folder-item:hover { background: var(--bg-lighter); }
135
+ .folder-item.active { background: var(--accent); color: #1a1b26; }
136
+ .folder-item .folder-icon { font-size: 14px; }
137
+ .folder-item .folder-count {
138
+ margin-left: auto;
139
+ font-size: 10px;
140
+ background: var(--bg);
141
+ padding: 1px 6px;
142
+ border-radius: 8px;
143
+ color: var(--fg-dim);
144
+ }
145
+ .folder-item .folder-actions {
146
+ display: none;
147
+ gap: 2px;
148
+ margin-left: auto;
149
+ flex-shrink: 0;
150
+ }
151
+ .folder-item:hover .folder-actions { display: flex; }
152
+ .folder-item:hover .folder-count { display: none; }
153
+ .folder-item .folder-actions .act-btn {
154
+ background: none;
155
+ border: none;
156
+ color: var(--fg-dim);
157
+ cursor: pointer;
158
+ padding: 1px 4px;
159
+ border-radius: 3px;
160
+ font-size: 11px;
161
+ transition: all 0.1s;
162
+ }
163
+ .folder-item .folder-actions .act-btn:hover { background: var(--bg); color: var(--fg); }
164
+ .folder-item.drag-over { border-top: 2px solid var(--accent); }
165
+ .folder-item .drag-handle {
166
+ cursor: grab;
167
+ color: var(--fg-dim);
168
+ opacity: 0;
169
+ font-size: 10px;
170
+ flex-shrink: 0;
171
+ user-select: none;
172
+ }
173
+ .folder-item:hover .drag-handle { opacity: 0.5; }
174
+ .folder-item .drag-handle:hover { opacity: 1; }
175
+ .folder-rename-input {
176
+ background: var(--bg);
177
+ color: var(--fg);
178
+ border: 1px solid var(--accent);
179
+ padding: 2px 6px;
180
+ border-radius: 3px;
181
+ font-size: 12px;
182
+ outline: none;
183
+ width: 100%;
184
+ }
185
+
186
+ /* Prompt list */
187
+ .prompt-list {
188
+ border-top: 1px solid var(--border);
189
+ flex: 1;
190
+ overflow-y: auto;
191
+ padding: 6px;
192
+ }
193
+ .prompt-item {
194
+ padding: 8px 8px 8px 6px;
195
+ border-radius: 5px;
196
+ cursor: pointer;
197
+ font-size: 12px;
198
+ margin-bottom: 3px;
199
+ border-left: 3px solid transparent;
200
+ transition: background 0.1s;
201
+ position: relative;
202
+ display: flex;
203
+ align-items: flex-start;
204
+ gap: 6px;
205
+ }
206
+ .prompt-item:hover { background: var(--bg-lighter); }
207
+ .prompt-item.active { background: var(--bg-lighter); border-left-color: var(--accent); }
208
+ .prompt-item.pinned { border-left-color: var(--yellow); }
209
+ .prompt-item.active.pinned { border-left-color: var(--yellow); }
210
+ .prompt-item.drag-over-above { box-shadow: 0 -2px 0 0 var(--accent); }
211
+ .prompt-item.drag-over-below { box-shadow: 0 2px 0 0 var(--accent); }
212
+ .prompt-item.drag-group {
213
+ outline: 2px solid var(--accent); outline-offset: -2px; border-radius: 6px;
214
+ background: rgba(122,162,247,0.12);
215
+ }
216
+ .prompt-item.drag-group::after {
217
+ content: 'Drop to group'; position: absolute; right: 8px; top: 50%; transform: translateY(-50%);
218
+ font-size: 9px; color: var(--accent); background: var(--bg); padding: 2px 8px;
219
+ border-radius: 4px; border: 1px solid var(--accent); pointer-events: none; z-index: 2;
220
+ }
221
+ .prompt-item.drag-over-above::after, .prompt-item.drag-over-below::after {
222
+ content: ''; /* clear group label */
223
+ }
224
+
225
+ /* Lifecycle section headers */
226
+ .lc-section-header {
227
+ display: flex; align-items: center; gap: 6px;
228
+ padding: 5px 10px 4px 8px; margin-top: 2px;
229
+ font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px;
230
+ color: var(--fg-dim); user-select: none;
231
+ border-bottom: 1px solid var(--border);
232
+ background: var(--bg);
233
+ position: sticky; top: 0; z-index: 3;
234
+ }
235
+ .lc-section-header:hover { background: var(--bg-light); }
236
+ .lc-section-chevron { font-size: 8px; width: 10px; color: var(--fg-dim); }
237
+ .lc-section-dot { width: 6px; height: 6px; border-radius: 50%; flex-shrink: 0; }
238
+ .lc-section-label { flex: 1; }
239
+ .lc-section-count {
240
+ font-size: 9px; font-weight: 500; color: var(--fg-dim);
241
+ background: var(--bg-lighter); padding: 0 5px; border-radius: 8px;
242
+ }
243
+
244
+ /* Tree grouping */
245
+ .prompt-group { margin-bottom: 2px; }
246
+ .prompt-group .group-header {
247
+ display: flex; align-items: center; gap: 0; position: relative;
248
+ }
249
+ /* Chevron overlaps the drag-handle area so group parent aligns with regular items */
250
+ .prompt-group .group-toggle {
251
+ position: absolute; left: 2px; top: 50%; transform: translateY(-50%);
252
+ width: 16px; height: 16px; display: flex; align-items: center; justify-content: center;
253
+ cursor: pointer; z-index: 2;
254
+ }
255
+ .prompt-group .group-chevron {
256
+ font-size: 7px; color: var(--fg-dim); transition: transform 0.15s;
257
+ }
258
+ .prompt-group.expanded .group-chevron { transform: rotate(90deg); }
259
+ .prompt-group .group-header .prompt-item { flex: 1; }
260
+ .prompt-group .group-header .prompt-item .drag-handle { visibility: hidden; }
261
+ .prompt-group .group-badge {
262
+ position: absolute; right: 4px; top: 4px;
263
+ font-size: 9px; color: var(--fg-dim); background: var(--bg-lighter); padding: 1px 6px;
264
+ border-radius: 8px; pointer-events: none; z-index: 1;
265
+ }
266
+ .prompt-group .group-children {
267
+ display: none; padding-left: 8px;
268
+ border-left: 1px solid var(--border); margin-left: 10px; margin-top: -2px;
269
+ }
270
+ .prompt-group.expanded .group-children { display: block; }
271
+ .prompt-group .group-children .prompt-item { font-size: 11px; padding: 5px 8px 5px 6px; }
272
+ .prompt-group .group-children .prompt-item .prompt-meta { font-size: 9px; }
273
+ .group-add-child {
274
+ display: flex; align-items: center; gap: 4px;
275
+ padding: 4px 8px; margin: 2px 0;
276
+ font-size: 11px; color: var(--fg-dim);
277
+ cursor: pointer; border-radius: 4px;
278
+ transition: all 0.15s;
279
+ }
280
+ .group-add-child:hover { color: var(--accent); background: var(--bg-lighter); }
281
+ .group-add-child span { font-size: 13px; font-weight: 600; }
282
+
283
+ /* Children panel (composite prompt view in editor) */
284
+ #pe-children-panel {
285
+ margin-top: 16px; border-top: 1px solid var(--border); padding-top: 12px;
286
+ }
287
+ .children-panel-loading {
288
+ padding: 12px; text-align: center; color: var(--fg-dim); font-size: 12px;
289
+ }
290
+ .children-panel-header {
291
+ display: flex; align-items: baseline; gap: 8px; margin-bottom: 8px; padding: 0 4px;
292
+ }
293
+ .children-panel-title {
294
+ font-size: 12px; font-weight: 600; color: var(--fg);
295
+ }
296
+ .children-panel-hint {
297
+ font-size: 10px; color: var(--fg-dim); font-style: italic;
298
+ }
299
+ .children-panel-list {
300
+ display: flex; flex-direction: column; gap: 6px;
301
+ }
302
+ .children-panel-item {
303
+ display: flex; gap: 10px; padding: 8px 10px; border-radius: 6px;
304
+ background: var(--bg-lighter); cursor: pointer; transition: background 0.15s;
305
+ }
306
+ .children-panel-item:hover { background: var(--bg-hover, rgba(255,255,255,0.06)); }
307
+ .children-panel-item-num {
308
+ flex-shrink: 0; width: 22px; height: 22px; border-radius: 50%;
309
+ background: var(--accent, #7aa2f7); color: var(--bg); font-size: 11px; font-weight: 700;
310
+ display: flex; align-items: center; justify-content: center; margin-top: 1px;
311
+ }
312
+ .children-panel-item-body { flex: 1; min-width: 0; }
313
+ .children-panel-item-title {
314
+ font-size: 12px; font-weight: 600; color: var(--fg); margin-bottom: 2px;
315
+ }
316
+ .children-panel-item-preview {
317
+ font-size: 11px; color: var(--fg-dim); line-height: 1.4;
318
+ display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
319
+ }
320
+
321
+ /* Group creation placeholder (skeleton loading) */
322
+ .prompt-group-creating {
323
+ padding: 8px 12px; margin-bottom: 2px; border-radius: 6px;
324
+ background: var(--bg-lighter); position: relative; overflow: hidden;
325
+ }
326
+ .prompt-group-creating::after {
327
+ content: ''; position: absolute; top: 0; left: -100%; width: 200%; height: 100%;
328
+ background: linear-gradient(90deg, transparent 25%, rgba(122,162,247,0.08) 50%, transparent 75%);
329
+ animation: pe-shimmer 1.5s infinite;
330
+ }
331
+ @keyframes pe-shimmer { to { transform: translateX(50%); } }
332
+ .prompt-group-creating .skeleton-header {
333
+ display: flex; align-items: center; gap: 8px;
334
+ }
335
+ .prompt-group-creating .skeleton-icon {
336
+ width: 14px; height: 14px; border: 2px solid var(--border);
337
+ border-top-color: var(--purple, #bb9af7); border-radius: 50%;
338
+ animation: pe-spin 0.6s linear infinite;
339
+ }
340
+ .prompt-group-creating .skeleton-title {
341
+ font-size: 11px; color: var(--fg-dim);
342
+ }
343
+ .prompt-group-creating .skeleton-bar {
344
+ height: 6px; border-radius: 3px; background: var(--border); margin-top: 6px; width: 60%;
345
+ }
346
+
347
+ /* Drop zone for ungrouping */
348
+ .ungroup-drop-zone {
349
+ display: none; padding: 6px; text-align: center; font-size: 10px;
350
+ color: var(--fg-dim); border: 1px dashed var(--border); border-radius: 6px;
351
+ margin: 4px 0; transition: all 0.2s;
352
+ }
353
+ .ungroup-drop-zone.visible { display: block; }
354
+ .ungroup-drop-zone.drag-over { border-color: var(--accent); background: rgba(122,162,247,0.08); color: var(--accent); }
355
+ .prompt-item .drag-handle {
356
+ cursor: grab;
357
+ color: var(--fg-dim);
358
+ opacity: 0;
359
+ font-size: 10px;
360
+ padding: 2px 0;
361
+ flex-shrink: 0;
362
+ user-select: none;
363
+ transition: opacity 0.1s;
364
+ }
365
+ .prompt-item:hover .drag-handle { opacity: 0.5; }
366
+ .prompt-item .drag-handle:hover { opacity: 1; }
367
+ .prompt-item .prompt-content { flex: 1; min-width: 0; }
368
+ .prompt-item .prompt-title {
369
+ font-weight: 500;
370
+ margin-bottom: 2px;
371
+ overflow: hidden;
372
+ text-overflow: ellipsis;
373
+ white-space: nowrap;
374
+ }
375
+ .prompt-item .prompt-meta {
376
+ display: flex;
377
+ gap: 6px;
378
+ font-size: 10px;
379
+ color: var(--fg-dim);
380
+ }
381
+ .prompt-item .prompt-meta .tag {
382
+ background: var(--bg);
383
+ padding: 0 5px;
384
+ border-radius: 3px;
385
+ }
386
+ .prompt-item .prompt-actions {
387
+ display: none;
388
+ gap: 2px;
389
+ flex-shrink: 0;
390
+ }
391
+ .prompt-item:hover .prompt-actions { display: flex; }
392
+ .prompt-item .prompt-actions .act-btn {
393
+ background: none;
394
+ border: none;
395
+ color: var(--fg-dim);
396
+ cursor: pointer;
397
+ padding: 2px 4px;
398
+ border-radius: 3px;
399
+ font-size: 11px;
400
+ line-height: 1;
401
+ transition: all 0.1s;
402
+ }
403
+ .prompt-item .prompt-actions .act-btn:hover { background: var(--bg); color: var(--fg); }
404
+ .prompt-item .prompt-actions .act-btn.pin-active { color: var(--yellow); }
405
+ .prompt-item.starred .prompt-title::before { content: '\2605 '; color: var(--yellow); }
406
+ .prompt-item .pin-badge { color: var(--yellow); font-size: 10px; margin-right: 2px; }
407
+
408
+ /* Multi-select bulk bar */
409
+ #pe-bulk-bar { background: var(--bg-lighter); font-size: 11px; }
410
+ #pe-bulk-bar .btn { font-size: 10px; padding: 2px 8px; }
411
+ .pe-select-cb { accent-color: var(--accent); width: 14px; height: 14px; flex-shrink: 0; }
412
+
413
+ /* Editor area */
414
+ #pe-editor-area {
415
+ flex: 1;
416
+ display: flex;
417
+ flex-direction: column;
418
+ overflow: hidden;
419
+ }
420
+
421
+ /* Editor toolbar */
422
+ .editor-toolbar {
423
+ display: flex;
424
+ align-items: center;
425
+ gap: 4px;
426
+ padding: 7px 18px;
427
+ border-bottom: 1px solid var(--border);
428
+ background: var(--bg-light);
429
+ flex-wrap: wrap;
430
+ flex-shrink: 0;
431
+ }
432
+ .toolbar-group {
433
+ display: flex;
434
+ gap: 2px;
435
+ padding-right: 10px;
436
+ border-right: 1px solid var(--border);
437
+ margin-right: 6px;
438
+ }
439
+ .toolbar-group:last-child { border-right: none; }
440
+ .toolbar-btn {
441
+ background: none;
442
+ border: 1px solid transparent;
443
+ color: var(--fg-dim);
444
+ padding: 5px 9px;
445
+ border-radius: 5px;
446
+ cursor: pointer;
447
+ font-size: 13px;
448
+ font-weight: 600;
449
+ transition: all 0.12s;
450
+ }
451
+ .toolbar-btn:hover { background: var(--bg-lighter); color: var(--fg); }
452
+ .toolbar-btn.active { background: var(--accent); color: #1a1b26; }
453
+ #pe-nav-back, #pe-nav-fwd { font-size: 16px; padding: 3px 8px; }
454
+ #pe-nav-back:disabled, #pe-nav-fwd:disabled { opacity: 0.25; cursor: default; }
455
+ #pe-nav-back:not(:disabled), #pe-nav-fwd:not(:disabled) { color: var(--accent); }
456
+ #pe-nav-back:not(:disabled):hover, #pe-nav-fwd:not(:disabled):hover { background: var(--accent); color: #1a1b26; }
457
+
458
+ /* Meta bar (title, tags, context type) */
459
+ .pe-meta-bar {
460
+ display: flex;
461
+ align-items: center;
462
+ gap: 10px;
463
+ padding: 10px 18px;
464
+ border-bottom: 1px solid var(--border);
465
+ background: var(--bg-light);
466
+ flex-shrink: 0;
467
+ }
468
+ .pe-meta-bar input {
469
+ background: transparent;
470
+ border: none;
471
+ color: var(--fg);
472
+ font-size: 17px;
473
+ font-weight: 600;
474
+ outline: none;
475
+ flex: 1;
476
+ min-width: 0;
477
+ letter-spacing: -0.01em;
478
+ }
479
+ .pe-meta-bar input::placeholder { color: var(--fg-dim); }
480
+ .pe-meta-bar select {
481
+ background: var(--bg);
482
+ color: var(--fg);
483
+ border: 1px solid var(--border);
484
+ padding: 4px 8px;
485
+ border-radius: 4px;
486
+ font-size: 11px;
487
+ outline: none;
488
+ }
489
+ .tags-input {
490
+ display: flex;
491
+ align-items: center;
492
+ gap: 4px;
493
+ flex-wrap: wrap;
494
+ }
495
+ .tag-chip {
496
+ background: var(--bg-lighter);
497
+ border: 1px solid var(--border);
498
+ padding: 1px 8px;
499
+ border-radius: 10px;
500
+ font-size: 10px;
501
+ display: flex;
502
+ align-items: center;
503
+ gap: 4px;
504
+ cursor: default;
505
+ }
506
+ .tag-chip .tag-remove {
507
+ cursor: pointer;
508
+ opacity: 0.6;
509
+ font-size: 12px;
510
+ }
511
+ .tag-chip .tag-remove:hover { opacity: 1; }
512
+ .tags-input input {
513
+ background: transparent;
514
+ border: none;
515
+ color: var(--fg);
516
+ font-size: 11px;
517
+ outline: none;
518
+ width: 80px;
519
+ padding: 2px 0;
520
+ }
521
+
522
+ /* Send dropdown */
523
+ .send-dropdown-wrap {
524
+ position: relative;
525
+ display: inline-flex;
526
+ }
527
+ .send-dropdown-wrap .btn-main {
528
+ border-radius: 6px 0 0 6px;
529
+ border-right: none;
530
+ }
531
+ .send-dropdown-wrap .btn-caret {
532
+ border-radius: 0 6px 6px 0;
533
+ padding: 5px 6px;
534
+ border-left: 1px solid rgba(26,27,38,0.3);
535
+ min-width: 0;
536
+ }
537
+ .send-dropdown {
538
+ display: none;
539
+ position: absolute;
540
+ top: 100%;
541
+ right: 0;
542
+ margin-top: 4px;
543
+ background: var(--bg-light);
544
+ border: 1px solid var(--border);
545
+ border-radius: 8px;
546
+ min-width: 280px;
547
+ box-shadow: 0 8px 24px rgba(0,0,0,0.4);
548
+ z-index: 100;
549
+ overflow: hidden;
550
+ }
551
+ .send-dropdown.open { display: block; }
552
+ .send-dropdown-section {
553
+ padding: 4px 0;
554
+ border-bottom: 1px solid var(--border);
555
+ }
556
+ .send-dropdown-section:last-child { border-bottom: none; }
557
+ .send-dropdown-section .section-label {
558
+ padding: 6px 12px 2px;
559
+ font-size: 10px;
560
+ text-transform: uppercase;
561
+ color: var(--fg-dim);
562
+ letter-spacing: 0.5px;
563
+ }
564
+ .send-dropdown-item {
565
+ display: flex;
566
+ align-items: center;
567
+ gap: 8px;
568
+ padding: 7px 12px;
569
+ font-size: 12px;
570
+ color: var(--fg);
571
+ cursor: pointer;
572
+ transition: background 0.1s;
573
+ }
574
+ .send-dropdown-item:hover { background: var(--bg-lighter); }
575
+ .send-dropdown-item .item-icon { font-size: 14px; flex-shrink: 0; width: 20px; text-align: center; }
576
+ .send-dropdown-item .item-label { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
577
+ .send-dropdown-item .item-meta { font-size: 10px; color: var(--fg-dim); flex-shrink: 0; }
578
+ .send-dropdown-item.disabled { opacity: 0.4; cursor: not-allowed; }
579
+ .send-dropdown-item.disabled:hover { background: transparent; }
580
+
581
+ /* Usage badges */
582
+ .usage-badge {
583
+ display: inline-flex;
584
+ align-items: center;
585
+ gap: 4px;
586
+ font-size: 10px;
587
+ color: var(--fg-dim);
588
+ background: var(--bg);
589
+ padding: 2px 8px;
590
+ border-radius: 10px;
591
+ border: 1px solid var(--border);
592
+ cursor: pointer;
593
+ }
594
+ .usage-badge:hover { color: var(--fg); border-color: var(--accent); }
595
+
596
+ /* Rich text editor */
597
+ .editor-wrapper {
598
+ flex: 1;
599
+ overflow: auto;
600
+ padding: 40px 48px;
601
+ background: #171822;
602
+ }
603
+ .ProseMirror {
604
+ width: 740px;
605
+ margin: 0 auto;
606
+ min-height: 400px;
607
+ outline: none;
608
+ color: #d1d5e8;
609
+ font-family: 'Courier New', Courier, monospace;
610
+ font-size: 15px;
611
+ line-height: 1.8;
612
+ padding: 36px 44px;
613
+ background: var(--bg);
614
+ border: 1px solid var(--border);
615
+ border-radius: 10px;
616
+ box-shadow: 0 1px 3px rgba(0,0,0,0.2);
617
+ }
618
+ .ProseMirror p { margin-bottom: 12px; }
619
+ .ProseMirror > p:first-child > strong:only-child,
620
+ .ProseMirror > p:first-child > b:only-child {
621
+ font-size: 1.6em;
622
+ letter-spacing: -0.02em;
623
+ line-height: 1.35;
624
+ color: var(--fg);
625
+ }
626
+ .ProseMirror > p:empty { margin-bottom: 8px; }
627
+ .ProseMirror h1 { font-size: 1.75em; font-weight: 700; margin: 32px 0 14px; color: var(--fg); letter-spacing: -0.02em; line-height: 1.3; }
628
+ .ProseMirror h2 { font-size: 1.4em; font-weight: 600; margin: 28px 0 12px; color: var(--fg); letter-spacing: -0.01em; line-height: 1.35; }
629
+ .ProseMirror h3 { font-size: 1.15em; font-weight: 600; margin: 22px 0 8px; color: var(--fg); line-height: 1.4; }
630
+ .ProseMirror ul, .ProseMirror ol { padding-left: 28px; margin-bottom: 12px; }
631
+ .ProseMirror li { margin-bottom: 5px; }
632
+ .ProseMirror li p { margin-bottom: 5px; }
633
+ .ProseMirror blockquote {
634
+ border-left: 3px solid var(--accent);
635
+ padding: 4px 0 4px 18px;
636
+ color: var(--fg-dim);
637
+ margin: 14px 0;
638
+ background: rgba(122, 162, 247, 0.04);
639
+ border-radius: 0 6px 6px 0;
640
+ }
641
+ .ProseMirror a { color: var(--accent); text-decoration: underline; text-decoration-color: rgba(122, 162, 247, 0.35); text-underline-offset: 2px; transition: text-decoration-color 0.15s; }
642
+ .ProseMirror a:hover { text-decoration-color: var(--accent); }
643
+ .ProseMirror code {
644
+ background: var(--bg-lighter);
645
+ padding: 2px 7px;
646
+ border-radius: 4px;
647
+ font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', monospace;
648
+ font-size: 0.87em;
649
+ border: 1px solid rgba(59, 66, 97, 0.5);
650
+ }
651
+ .ProseMirror pre {
652
+ background: var(--bg-light);
653
+ border: 1px solid var(--border);
654
+ border-radius: 8px;
655
+ padding: 16px 18px;
656
+ margin: 16px 0;
657
+ overflow-x: auto;
658
+ }
659
+ .ProseMirror pre code { background: none; padding: 0; border-radius: 0; border: none; font-size: 0.87em; display: block; white-space: pre; }
660
+ .ProseMirror hr { border: none; border-top: 1px solid var(--border); margin: 28px 0; }
661
+ .ProseMirror strong { font-weight: 700; color: var(--fg); }
662
+ .ProseMirror em { font-style: italic; }
663
+ .ProseMirror img { max-width: 100%; border-radius: 8px; margin: 14px 0; cursor: pointer; border: 2px solid transparent; transition: border-color 0.15s, box-shadow 0.15s; }
664
+ .ProseMirror img.img-selected { border-color: var(--accent); box-shadow: 0 0 0 2px color-mix(in srgb, var(--accent) 30%, transparent); }
665
+ .ProseMirror .is-editor-empty:first-child::before {
666
+ content: attr(data-placeholder);
667
+ color: var(--fg-dim);
668
+ pointer-events: none;
669
+ float: left;
670
+ height: 0;
671
+ }
672
+
673
+ /* Version panel */
674
+ #pe-version-panel {
675
+ display: none;
676
+ width: 300px;
677
+ background: var(--bg-light);
678
+ border-left: 1px solid var(--border);
679
+ flex-direction: column;
680
+ overflow: hidden;
681
+ }
682
+ #pe-version-panel.active { display: flex; }
683
+ .version-header {
684
+ padding: 10px;
685
+ border-bottom: 1px solid var(--border);
686
+ font-size: 13px;
687
+ font-weight: 600;
688
+ display: flex;
689
+ align-items: center;
690
+ justify-content: space-between;
691
+ }
692
+ .version-list {
693
+ flex: 1;
694
+ overflow-y: auto;
695
+ padding: 6px;
696
+ }
697
+ .version-item {
698
+ padding: 8px;
699
+ border-radius: 5px;
700
+ margin-bottom: 4px;
701
+ cursor: pointer;
702
+ border-left: 3px solid transparent;
703
+ transition: background 0.1s;
704
+ }
705
+ .version-item:hover { background: var(--bg-lighter); }
706
+ .version-item.active { border-left-color: var(--accent); background: var(--bg-lighter); }
707
+ .version-item .v-num { font-size: 12px; font-weight: 600; color: var(--accent); }
708
+ .version-item .v-date { font-size: 10px; color: var(--fg-dim); }
709
+ .version-item .v-msg { font-size: 11px; color: var(--fg-dim); margin-top: 2px; }
710
+
711
+ /* Image annotation overlay */
712
+ .annotation-overlay {
713
+ position: fixed;
714
+ inset: 0;
715
+ background: rgba(0,0,0,0.85);
716
+ z-index: 200;
717
+ display: none;
718
+ flex-direction: column;
719
+ align-items: center;
720
+ justify-content: center;
721
+ }
722
+ .annotation-overlay.active { display: flex; }
723
+ .annotation-toolbar {
724
+ display: flex;
725
+ gap: 6px;
726
+ padding: 8px;
727
+ background: var(--bg-light);
728
+ border-radius: 8px;
729
+ margin-bottom: 8px;
730
+ }
731
+ .annotation-toolbar .tool-btn {
732
+ background: var(--bg-lighter);
733
+ border: 1px solid var(--border);
734
+ color: var(--fg);
735
+ padding: 6px 12px;
736
+ border-radius: 5px;
737
+ cursor: pointer;
738
+ font-size: 12px;
739
+ transition: all 0.1s;
740
+ }
741
+ .annotation-toolbar .tool-btn:hover { border-color: var(--accent); }
742
+ .annotation-toolbar .tool-btn.active { background: var(--accent); color: #1a1b26; border-color: var(--accent); }
743
+ .annotation-canvas-container {
744
+ position: relative;
745
+ max-width: 90vw;
746
+ max-height: calc(100vh - 120px);
747
+ overflow: auto;
748
+ }
749
+ .annotation-canvas-container img { max-width: 100%; display: block; }
750
+ .annotation-canvas-container canvas { position: absolute; top: 0; left: 0; cursor: crosshair; }
751
+
752
+ /* Chains visual editor */
753
+ .chain-canvas {
754
+ flex: 1;
755
+ overflow: auto;
756
+ position: relative;
757
+ background: var(--bg);
758
+ background-image: radial-gradient(var(--border) 1px, transparent 1px);
759
+ background-size: 20px 20px;
760
+ }
761
+ .chain-node {
762
+ position: absolute;
763
+ background: var(--bg-light);
764
+ border: 1px solid var(--border);
765
+ border-radius: 8px;
766
+ padding: 10px;
767
+ min-width: 150px;
768
+ cursor: move;
769
+ font-size: 12px;
770
+ }
771
+ .chain-node:hover { border-color: var(--accent); }
772
+ .chain-node .node-title { font-weight: 600; margin-bottom: 4px; }
773
+ .chain-node .node-type { font-size: 10px; color: var(--fg-dim); }
774
+
775
+ /* Empty state */
776
+ .pe-empty-state {
777
+ display: flex;
778
+ flex-direction: column;
779
+ align-items: center;
780
+ justify-content: center;
781
+ flex: 1;
782
+ gap: 12px;
783
+ color: var(--fg-dim);
784
+ text-align: center;
785
+ padding: 40px;
786
+ }
787
+ .pe-empty-state h3 { color: var(--fg); font-size: 16px; }
788
+ .pe-empty-state p { font-size: 13px; line-height: 1.6; max-width: 400px; }
789
+
790
+ /* Prompt panel tabs */
791
+ .pe-panel-tabs {
792
+ display: flex;
793
+ border-bottom: 1px solid var(--border);
794
+ background: var(--bg);
795
+ }
796
+ .pe-panel-tab {
797
+ padding: 6px 14px;
798
+ font-size: 12px;
799
+ cursor: pointer;
800
+ color: var(--fg-dim);
801
+ border-bottom: 2px solid transparent;
802
+ transition: all 0.1s;
803
+ }
804
+ .pe-panel-tab:hover { color: var(--fg); }
805
+ .pe-panel-tab.active { color: var(--accent); border-bottom-color: var(--accent); }
806
+
807
+ /* Prompts modal overrides */
808
+ .pe-modal-overlay {
809
+ position: fixed;
810
+ inset: 0;
811
+ background: rgba(0,0,0,0.6);
812
+ display: flex;
813
+ align-items: center;
814
+ justify-content: center;
815
+ z-index: 100;
816
+ }
817
+ .pe-modal-overlay.hidden { display: none; }
818
+ .pe-modal {
819
+ background: var(--bg-light);
820
+ border: 1px solid var(--border);
821
+ border-radius: 10px;
822
+ padding: 20px;
823
+ min-width: 420px;
824
+ max-width: 90vw;
825
+ max-height: 90vh;
826
+ overflow-y: auto;
827
+ }
828
+ .pe-modal h3 { margin-bottom: 14px; font-size: 15px; }
829
+ .pe-modal label { display: block; font-size: 12px; color: var(--fg-dim); margin-bottom: 4px; margin-top: 10px; }
830
+ .pe-modal input,
831
+ .pe-modal select,
832
+ .pe-modal textarea {
833
+ width: 100%;
834
+ background: var(--bg);
835
+ color: var(--fg);
836
+ border: 1px solid var(--border);
837
+ padding: 8px 10px;
838
+ border-radius: 5px;
839
+ font-size: 13px;
840
+ outline: none;
841
+ }
842
+ .pe-modal input:focus,
843
+ .pe-modal select:focus,
844
+ .pe-modal textarea:focus { border-color: var(--accent); }
845
+ .pe-modal textarea { min-height: 80px; resize: vertical; font-family: 'SF Mono', monospace; }
846
+ .pe-modal .btn-row { display: flex; justify-content: flex-end; gap: 8px; margin-top: 16px; }
847
+
848
+ /* Prompts status bar */
849
+ #pe-statusbar {
850
+ display: flex;
851
+ align-items: center;
852
+ height: 24px;
853
+ background: var(--bg-light);
854
+ border-top: 1px solid var(--border);
855
+ padding: 0 12px;
856
+ font-size: 10px;
857
+ color: var(--fg-dim);
858
+ gap: 12px;
859
+ flex-shrink: 0;
860
+ }
861
+ #pe-statusbar .status-item { display: flex; align-items: center; gap: 4px; }
862
+
863
+ /* Backup table inside prompts panel */
864
+ #prompts-panel .perm-table {
865
+ width: 100%;
866
+ border-collapse: collapse;
867
+ font-size: 12px;
868
+ }
869
+ #prompts-panel .perm-table th {
870
+ text-align: left;
871
+ padding: 6px 10px;
872
+ border-bottom: 1px solid var(--border);
873
+ color: var(--fg-dim);
874
+ font-size: 11px;
875
+ font-weight: 500;
876
+ }
877
+ #prompts-panel .perm-table td {
878
+ padding: 8px 10px;
879
+ border-bottom: 1px solid var(--border);
880
+ }