create-walle 0.9.11 → 0.9.13

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 (167) hide show
  1. package/README.md +3 -3
  2. package/package.json +2 -2
  3. package/template/bin/dev.sh +7 -1
  4. package/template/bin/setup.js +53 -9
  5. package/template/bin/sync-images.js +53 -0
  6. package/template/builder-journal.md +17 -0
  7. package/template/claude-task-manager/api-prompts.js +98 -13
  8. package/template/claude-task-manager/api-reviews.js +82 -5
  9. package/template/claude-task-manager/db.js +32 -5
  10. package/template/claude-task-manager/docs/session-capture-foundation-design.md +1273 -0
  11. package/template/claude-task-manager/lib/claude-desktop-sessions.js +696 -0
  12. package/template/claude-task-manager/lib/coding-agent-models.js +49 -1
  13. package/template/claude-task-manager/lib/session-capture.js +421 -0
  14. package/template/claude-task-manager/lib/session-history.js +135 -15
  15. package/template/claude-task-manager/lib/session-jobs.js +10 -5
  16. package/template/claude-task-manager/lib/session-stream.js +87 -19
  17. package/template/claude-task-manager/lib/setup-provider-config.js +115 -0
  18. package/template/claude-task-manager/lib/walle-ctm-history.js +72 -0
  19. package/template/claude-task-manager/lib/walle-session-context.js +61 -0
  20. package/template/claude-task-manager/lib/walle-transcript.js +176 -0
  21. package/template/claude-task-manager/public/css/setup.css +35 -8
  22. package/template/claude-task-manager/public/css/walle-session.css +56 -0
  23. package/template/claude-task-manager/public/css/walle.css +120 -0
  24. package/template/claude-task-manager/public/index.html +814 -181
  25. package/template/claude-task-manager/public/js/message-renderer.js +148 -19
  26. package/template/claude-task-manager/public/js/reviews.js +120 -62
  27. package/template/claude-task-manager/public/js/setup.js +75 -31
  28. package/template/claude-task-manager/public/js/stream-view.js +115 -55
  29. package/template/claude-task-manager/public/js/walle-session.js +84 -2
  30. package/template/claude-task-manager/public/js/walle.js +308 -54
  31. package/template/claude-task-manager/server.js +1092 -146
  32. package/template/claude-task-manager/session-integrity.js +181 -54
  33. package/template/claude-task-manager/session-utils.js +123 -41
  34. package/template/claude-task-manager/workers/state-detectors/codex.js +5 -2
  35. package/template/package.json +1 -1
  36. package/template/wall-e/adapters/ctm.js +39 -18
  37. package/template/wall-e/agent-runners/contract.js +17 -0
  38. package/template/wall-e/agent-runners/index.js +22 -0
  39. package/template/wall-e/agent-runtime/harness.js +212 -0
  40. package/template/wall-e/agent-runtime/index.js +8 -0
  41. package/template/wall-e/agent-runtime/registry.js +67 -0
  42. package/template/wall-e/agent-runtime/session-store.js +179 -0
  43. package/template/wall-e/agent-runtime/spawn.js +208 -0
  44. package/template/wall-e/api-walle.js +174 -7
  45. package/template/wall-e/brain.js +266 -28
  46. package/template/wall-e/channels/policy.js +88 -0
  47. package/template/wall-e/channels/registry.js +15 -1
  48. package/template/wall-e/channels/reply-dispatcher.js +70 -0
  49. package/template/wall-e/channels/session-bindings.js +51 -0
  50. package/template/wall-e/chat/code-review-context.js +29 -0
  51. package/template/wall-e/chat.js +188 -42
  52. package/template/wall-e/coding/acp-adapter.js +188 -0
  53. package/template/wall-e/coding/agent-catalog.js +129 -0
  54. package/template/wall-e/coding/compaction-service.js +247 -0
  55. package/template/wall-e/coding/execution-trace.js +3 -0
  56. package/template/wall-e/coding/instruction-service.js +224 -0
  57. package/template/wall-e/coding/model-message.js +67 -0
  58. package/template/wall-e/coding/permission-rules-store.js +111 -0
  59. package/template/wall-e/coding/permission-service.js +266 -0
  60. package/template/wall-e/coding/prompt-bundle.js +67 -0
  61. package/template/wall-e/coding/prompt-runtime.js +243 -0
  62. package/template/wall-e/coding/provider-transform.js +188 -0
  63. package/template/wall-e/coding/runtime-mode.js +132 -0
  64. package/template/wall-e/coding/snapshot-service.js +155 -0
  65. package/template/wall-e/coding/stream-processor.js +268 -0
  66. package/template/wall-e/coding/task-tool.js +255 -0
  67. package/template/wall-e/coding/tool-registry.js +361 -0
  68. package/template/wall-e/coding/transcript-writer.js +143 -0
  69. package/template/wall-e/coding/workspace-replay.js +324 -0
  70. package/template/wall-e/coding-context.js +4 -22
  71. package/template/wall-e/coding-orchestrator.js +307 -18
  72. package/template/wall-e/coding-prompts.js +44 -3
  73. package/template/wall-e/context/context-builder.js +43 -1
  74. package/template/wall-e/context/topic-matcher.js +1 -1
  75. package/template/wall-e/eval/agent-runner.js +59 -13
  76. package/template/wall-e/eval/benchmarks/memory-retrieval.json +155 -57
  77. package/template/wall-e/eval/benchmarks.js +100 -16
  78. package/template/wall-e/eval/eval-orchestrator.js +218 -8
  79. package/template/wall-e/eval/harvester.js +62 -5
  80. package/template/wall-e/eval/head-to-head.js +23 -2
  81. package/template/wall-e/eval/humaneval-adapter.js +30 -5
  82. package/template/wall-e/eval/livecodebench-adapter.js +29 -5
  83. package/template/wall-e/eval/manifest.js +186 -0
  84. package/template/wall-e/eval/run-agent-benchmarks.js +66 -2
  85. package/template/wall-e/eval/session-retrieval-benchmark.js +150 -0
  86. package/template/wall-e/eval/session-transcripts.js +57 -4
  87. package/template/wall-e/eval/swebench-adapter.js +109 -3
  88. package/template/wall-e/evaluation/agent-router.js +53 -1
  89. package/template/wall-e/evaluation/coding-quorum.js +48 -1
  90. package/template/wall-e/evaluation/router.js +4 -2
  91. package/template/wall-e/evaluation/tier-selector.js +11 -1
  92. package/template/wall-e/extraction/contradiction.js +2 -2
  93. package/template/wall-e/extraction/indexer.js +2 -1
  94. package/template/wall-e/extraction/knowledge-extractor.js +2 -2
  95. package/template/wall-e/hooks/cli.js +92 -0
  96. package/template/wall-e/hooks/discovery.js +119 -0
  97. package/template/wall-e/hooks/index.js +7 -0
  98. package/template/wall-e/hooks/manifest.js +55 -0
  99. package/template/wall-e/hooks/runtime.js +84 -0
  100. package/template/wall-e/hooks/session-memory.js +225 -0
  101. package/template/wall-e/http/auth.js +6 -2
  102. package/template/wall-e/http/chat-api.js +54 -8
  103. package/template/wall-e/integrations/claude-plugin/hooks/hooks.json +27 -0
  104. package/template/wall-e/integrations/claude-plugin/hooks/walle-precompact-hook.sh +5 -0
  105. package/template/wall-e/integrations/claude-plugin/hooks/walle-stop-hook.sh +5 -0
  106. package/template/wall-e/integrations/codex-plugin/hooks/walle-hook.sh +7 -0
  107. package/template/wall-e/integrations/codex-plugin/hooks.json +37 -0
  108. package/template/wall-e/listening/calendar.js +3 -1
  109. package/template/wall-e/llm/client.js +64 -10
  110. package/template/wall-e/llm/google.js +39 -5
  111. package/template/wall-e/llm/ollama.js +1 -1
  112. package/template/wall-e/llm/ollama.plugin.json +1 -1
  113. package/template/wall-e/llm/provider-availability.js +10 -0
  114. package/template/wall-e/llm/provider-error.js +269 -0
  115. package/template/wall-e/llm/tool-adapter.js +48 -12
  116. package/template/wall-e/loops/boot.js +2 -1
  117. package/template/wall-e/loops/initiative.js +2 -2
  118. package/template/wall-e/loops/tasks.js +8 -47
  119. package/template/wall-e/loops/workspace-prompts.js +20 -0
  120. package/template/wall-e/mcp-server.js +442 -1
  121. package/template/wall-e/memory/session-ingest-service.js +159 -0
  122. package/template/wall-e/memory/source-indexer.js +289 -0
  123. package/template/wall-e/plugins/discovery.js +83 -0
  124. package/template/wall-e/plugins/manifest-loader.js +50 -10
  125. package/template/wall-e/plugins/manifest-schema.js +69 -0
  126. package/template/wall-e/plugins/model-catalog.js +55 -0
  127. package/template/wall-e/prompts/coding/base.txt +2 -0
  128. package/template/wall-e/prompts/coding/deepseek.txt +1 -0
  129. package/template/wall-e/prompts/coding/memory-protocol.md +9 -0
  130. package/template/wall-e/prompts/coding/plan.txt +1 -0
  131. package/template/wall-e/runtime/execution-trace.js +220 -0
  132. package/template/wall-e/security/audit.js +266 -0
  133. package/template/wall-e/security/ssrf.js +236 -0
  134. package/template/wall-e/session-files.js +303 -0
  135. package/template/wall-e/skills/_bundled/slack-backfill/SKILL.md +3 -0
  136. package/template/wall-e/skills/_bundled/slack-sync/SKILL.md +3 -0
  137. package/template/wall-e/skills/internal-skill-registry.js +2 -2
  138. package/template/wall-e/skills/script-skill-runner.js +143 -0
  139. package/template/wall-e/skills/skill-executor.js +5 -6
  140. package/template/wall-e/skills/skill-fallback.js +3 -1
  141. package/template/wall-e/skills/skill-harness-registry.js +7 -8
  142. package/template/wall-e/skills/skill-planner.js +52 -4
  143. package/template/wall-e/skills/slack-ingest.js +11 -3
  144. package/template/wall-e/sources/base.js +90 -0
  145. package/template/wall-e/sources/builtin.js +33 -0
  146. package/template/wall-e/sources/claude-code-jsonl.js +78 -0
  147. package/template/wall-e/sources/codex-jsonl.js +125 -0
  148. package/template/wall-e/sources/coding-session-utils.js +117 -0
  149. package/template/wall-e/sources/contract-suite.js +59 -0
  150. package/template/wall-e/sources/gemini-jsonl.js +85 -0
  151. package/template/wall-e/sources/index.js +9 -0
  152. package/template/wall-e/sources/jsonl-utils.js +181 -0
  153. package/template/wall-e/sources/record-types.js +252 -0
  154. package/template/wall-e/sources/registry.js +92 -0
  155. package/template/wall-e/sources/transforms.js +100 -0
  156. package/template/wall-e/sources/walle-jsonl.js +108 -0
  157. package/template/wall-e/tools/coding-middleware.js +31 -1
  158. package/template/wall-e/tools/file-tracker.js +25 -1
  159. package/template/wall-e/tools/local-tools.js +75 -47
  160. package/template/wall-e/tools/session-sharing.js +68 -1
  161. package/template/wall-e/tools/shell-analyzer.js +1 -1
  162. package/template/wall-e/tools/shell-policy.js +47 -0
  163. package/template/wall-e/tools/snapshot.js +42 -0
  164. package/template/wall-e/training/harvester.js +62 -5
  165. package/template/wall-e/utils/repair.js +253 -1
  166. package/template/website/index.html +3 -3
  167. package/template/wall-e/skills/_bundled/slack-mentions/.watched-threads.json +0 -18
@@ -0,0 +1,176 @@
1
+ 'use strict';
2
+
3
+ const fs = require('fs');
4
+ const path = require('path');
5
+ const os = require('os');
6
+ const crypto = require('crypto');
7
+
8
+ const VERSION = 'walle-jsonl-v1';
9
+ const WALLE_PROJECT_ENTRY = '__walle__';
10
+
11
+ function defaultSessionsDir(env = process.env) {
12
+ if (env.WALLE_SESSIONS_DIR) return env.WALLE_SESSIONS_DIR;
13
+ if (env.WALL_E_SESSIONS_DIR) return env.WALL_E_SESSIONS_DIR;
14
+ if (env.WALLE_DEV_DIR) return path.join(env.WALLE_DEV_DIR, 'sessions');
15
+ if (env.WALL_E_DATA_DIR && env.WALL_E_DATA_DIR !== path.join(os.homedir(), '.walle', 'data')) {
16
+ return path.join(env.WALL_E_DATA_DIR, 'sessions');
17
+ }
18
+ if (env.CTM_DATA_DIR && env.CTM_DATA_DIR !== path.join(os.homedir(), '.walle', 'data')) {
19
+ return path.join(env.CTM_DATA_DIR, 'sessions');
20
+ }
21
+ return path.join(os.homedir(), '.walle', 'sessions');
22
+ }
23
+
24
+ function sessionPath(rootDir, sessionId) {
25
+ return path.join(rootDir, `${sessionId}.jsonl`);
26
+ }
27
+
28
+ function ensureDirForFile(filePath) {
29
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
30
+ }
31
+
32
+ function newUuid() {
33
+ return crypto.randomUUID ? crypto.randomUUID() : crypto.randomBytes(16).toString('hex');
34
+ }
35
+
36
+ function nowIso() {
37
+ return new Date().toISOString();
38
+ }
39
+
40
+ function textBlocks(text) {
41
+ return [{ type: 'text', text: String(text || '') }];
42
+ }
43
+
44
+ function appendRecord(filePath, record) {
45
+ ensureDirForFile(filePath);
46
+ const offset = fs.existsSync(filePath) ? fs.statSync(filePath).size : 0;
47
+ const line = JSON.stringify(record) + '\n';
48
+ fs.appendFileSync(filePath, line, 'utf8');
49
+ return {
50
+ filePath,
51
+ offset,
52
+ bytes: Buffer.byteLength(line),
53
+ record,
54
+ uuid: record.uuid || '',
55
+ };
56
+ }
57
+
58
+ function createSession(filePath, opts = {}) {
59
+ ensureDirForFile(filePath);
60
+ if (opts.reset !== false || !fs.existsSync(filePath)) {
61
+ fs.writeFileSync(filePath, '', 'utf8');
62
+ }
63
+ if (opts.reset === false && fs.existsSync(filePath) && fs.statSync(filePath).size > 0) {
64
+ return null;
65
+ }
66
+
67
+ const record = {
68
+ type: 'session_meta',
69
+ provider: 'walle',
70
+ version: VERSION,
71
+ sessionId: opts.sessionId || '',
72
+ chatSessionId: opts.chatSessionId || '',
73
+ cwd: opts.cwd || '',
74
+ label: opts.label || '',
75
+ modelId: opts.modelId || '',
76
+ modelProvider: opts.modelProvider || '',
77
+ gitBranch: opts.gitBranch || '',
78
+ hostname: os.hostname(),
79
+ uuid: newUuid(),
80
+ timestamp: opts.timestamp || nowIso(),
81
+ };
82
+ return appendRecord(filePath, record);
83
+ }
84
+
85
+ function baseMessage(opts, type, role) {
86
+ return {
87
+ type,
88
+ provider: 'walle',
89
+ version: VERSION,
90
+ sessionId: opts.sessionId || '',
91
+ chatSessionId: opts.chatSessionId || '',
92
+ uuid: opts.uuid || newUuid(),
93
+ parentUuid: opts.parentUuid || null,
94
+ cwd: opts.cwd || '',
95
+ timestamp: opts.timestamp || nowIso(),
96
+ message: {
97
+ role,
98
+ content: textBlocks(opts.text),
99
+ },
100
+ };
101
+ }
102
+
103
+ function appendUserMessage(filePath, opts = {}) {
104
+ const record = baseMessage(opts, 'user', 'user');
105
+ if (opts.modelId) record.modelId = opts.modelId;
106
+ if (opts.modelProvider) record.modelProvider = opts.modelProvider;
107
+ return appendRecord(filePath, record);
108
+ }
109
+
110
+ function appendAssistantMessage(filePath, opts = {}) {
111
+ const record = baseMessage(opts, 'assistant', 'assistant');
112
+ record.message.model = opts.model || opts.modelId || '';
113
+ record.modelId = opts.model || opts.modelId || '';
114
+ record.modelProvider = opts.modelProvider || opts.provider || '';
115
+ record.latencyMs = Number.isFinite(opts.latencyMs) ? opts.latencyMs : null;
116
+ record.tokens = opts.tokens || {};
117
+ record.cost = Number.isFinite(opts.cost) ? opts.cost : null;
118
+ return appendRecord(filePath, record);
119
+ }
120
+
121
+ function appendPart(filePath, opts = {}) {
122
+ const record = {
123
+ type: 'walle_part',
124
+ provider: 'walle',
125
+ version: VERSION,
126
+ sessionId: opts.sessionId || '',
127
+ chatSessionId: opts.chatSessionId || '',
128
+ uuid: opts.uuid || newUuid(),
129
+ parentUuid: opts.parentUuid || null,
130
+ cwd: opts.cwd || '',
131
+ timestamp: opts.timestamp || nowIso(),
132
+ partType: opts.partType || 'event',
133
+ data: opts.data && typeof opts.data === 'object' ? opts.data : {},
134
+ };
135
+ return appendRecord(filePath, record);
136
+ }
137
+
138
+ function extractText(content) {
139
+ if (!content) return '';
140
+ if (typeof content === 'string') return content;
141
+ if (Array.isArray(content)) {
142
+ return content
143
+ .filter((block) => block && block.type === 'text' && block.text)
144
+ .map((block) => block.text)
145
+ .join('\n');
146
+ }
147
+ if (typeof content.text === 'string') return content.text;
148
+ return '';
149
+ }
150
+
151
+ function readLastUuid(filePath) {
152
+ let raw;
153
+ try { raw = fs.readFileSync(filePath, 'utf8'); } catch { return ''; }
154
+ const lines = raw.trim().split('\n').filter(Boolean);
155
+ for (let i = lines.length - 1; i >= 0; i--) {
156
+ try {
157
+ const row = JSON.parse(lines[i]);
158
+ if (row && row.uuid) return row.uuid;
159
+ } catch { /* skip malformed tail rows */ }
160
+ }
161
+ return '';
162
+ }
163
+
164
+ module.exports = {
165
+ VERSION,
166
+ WALLE_PROJECT_ENTRY,
167
+ defaultSessionsDir,
168
+ sessionPath,
169
+ createSession,
170
+ appendRecord,
171
+ appendUserMessage,
172
+ appendAssistantMessage,
173
+ appendPart,
174
+ extractText,
175
+ readLastUuid,
176
+ };
@@ -191,22 +191,49 @@
191
191
  #setup-panel #setup-version-label { text-align: center; font-size: 11px; color: #30363d; margin-top: 8px; padding-bottom: 4px; }
192
192
 
193
193
  /* ── Provider toggle cards (3b) ─────────────────────────────────────── */
194
- #setup-panel .pcard { transition: border-color 0.2s, box-shadow 0.2s; }
195
- #setup-panel .pcard.is-default { border-color: var(--accent); box-shadow: 0 0 0 1px var(--accent) inset; }
194
+ #setup-panel .pcard {
195
+ border-color: #4d5a82 !important;
196
+ transition: border-color 0.2s, box-shadow 0.2s, background 0.2s;
197
+ }
198
+ #setup-panel .pcard:hover { border-color: #6d7fb3 !important; }
199
+ #setup-panel .pcard.is-default { border-color: var(--accent) !important; box-shadow: 0 0 0 1px var(--accent) inset; }
196
200
  #setup-panel .pcard[data-disabled="true"] .pcard-body { opacity: 0.6; pointer-events: none; }
197
- #setup-panel .pcard-toggle input[type="checkbox"]:checked + .pcard-slider { background: var(--accent); }
201
+ #setup-panel .pcard-toggle .pcard-slider {
202
+ background: #465176 !important;
203
+ border: 1px solid #65739f;
204
+ box-sizing: border-box;
205
+ }
206
+ #setup-panel .pcard-toggle input[type="checkbox"]:checked + .pcard-slider {
207
+ background: var(--accent) !important;
208
+ border-color: var(--accent);
209
+ }
198
210
  #setup-panel .pcard-slider::before {
199
- content: ""; position: absolute; left: 2px; top: 2px;
200
- width: 16px; height: 16px; background: var(--fg);
211
+ content: ""; position: absolute; left: 3px; top: 3px;
212
+ width: 14px; height: 14px; background: #d7e0ff;
201
213
  border-radius: 50%; transition: transform 0.2s;
214
+ box-shadow: 0 1px 2px rgba(0,0,0,0.35);
202
215
  }
203
216
  #setup-panel .pcard-toggle input[type="checkbox"]:checked + .pcard-slider::before { transform: translateX(16px); background: #0d1117; }
204
217
  #setup-panel .pcard-toggle input[type="checkbox"]:focus-visible + .pcard-slider {
205
218
  outline: 2px solid var(--accent); outline-offset: 2px;
206
219
  }
207
- #setup-panel .pcard-star { transition: color 0.15s, transform 0.15s; }
208
- #setup-panel .pcard-star:hover { color: var(--accent); transform: scale(1.1); }
209
- #setup-panel .pcard-star.is-default { color: var(--accent); }
220
+ #setup-panel .pcard-star {
221
+ color: #91a2d4 !important;
222
+ opacity: 1;
223
+ transition: color 0.15s, transform 0.15s, opacity 0.15s;
224
+ }
225
+ #setup-panel .pcard-star:hover { color: #d6e0ff !important; transform: scale(1.1); }
226
+ #setup-panel .pcard-star.is-default { color: #ffd166 !important; }
227
+ #setup-panel .pcard-star.is-saving { opacity: 1; cursor: progress; }
228
+ #setup-panel .pcard-star:disabled {
229
+ cursor: wait;
230
+ color: #91a2d4 !important;
231
+ -webkit-text-fill-color: #91a2d4;
232
+ }
233
+ #setup-panel .pcard-star.is-default:disabled {
234
+ color: #ffd166 !important;
235
+ -webkit-text-fill-color: #ffd166;
236
+ }
210
237
  #setup-panel .pcard-auth-row:hover { border-color: var(--fg-dim); }
211
238
  #setup-panel .pcard-auth-row.is-active {
212
239
  border-color: var(--accent); background: rgba(88,166,255,0.06);
@@ -13,6 +13,9 @@
13
13
  .session-item[data-agent="claude"] {
14
14
  border-left: 3px solid #c084fc;
15
15
  }
16
+ .session-item[data-agent="claude-desktop"] {
17
+ border-left: 3px solid #d97757;
18
+ }
16
19
  .session-item[data-agent="codex"] {
17
20
  border-left: 3px solid #22c55e;
18
21
  }
@@ -43,6 +46,10 @@
43
46
  background: rgba(192,132,252,0.18);
44
47
  color: #c084fc;
45
48
  }
49
+ .agent-badge.claude-desktop {
50
+ background: rgba(217,119,87,0.18);
51
+ color: #d97757;
52
+ }
46
53
  .agent-badge.codex {
47
54
  background: rgba(34,197,94,0.18);
48
55
  color: #22c55e;
@@ -616,6 +623,55 @@
616
623
  font-size: 13px;
617
624
  margin: 6px 0;
618
625
  }
626
+ .walle-error-notice.provider {
627
+ border-left: 3px solid #f7768e;
628
+ color: #f2c0c8;
629
+ }
630
+ .walle-error-title {
631
+ color: #fff;
632
+ font-weight: 700;
633
+ margin-bottom: 3px;
634
+ }
635
+ .walle-error-body {
636
+ line-height: 1.45;
637
+ overflow-wrap: anywhere;
638
+ }
639
+ .walle-error-details {
640
+ margin-top: 6px;
641
+ color: #d7dde8;
642
+ }
643
+ .walle-error-details summary {
644
+ cursor: pointer;
645
+ color: #9fb0c8;
646
+ }
647
+ .walle-error-details pre {
648
+ margin: 6px 0 0;
649
+ max-height: 180px;
650
+ overflow: auto;
651
+ white-space: pre-wrap;
652
+ word-break: break-word;
653
+ color: #cbd5e1;
654
+ font-size: 11px;
655
+ line-height: 1.4;
656
+ }
657
+ .walle-error-actions {
658
+ margin-top: 8px;
659
+ }
660
+ .walle-session-action-btn {
661
+ padding: 5px 12px;
662
+ border-radius: 5px;
663
+ border: 1px solid var(--border, #414868);
664
+ background: var(--bg-light, #24283b);
665
+ color: var(--fg, #c0caf5);
666
+ cursor: pointer;
667
+ font-size: 12px;
668
+ }
669
+ .walle-session-action-btn.primary {
670
+ background: var(--accent, #7aa2f7);
671
+ border-color: var(--accent, #7aa2f7);
672
+ color: #111827;
673
+ font-weight: 700;
674
+ }
619
675
 
620
676
  /* Permission Request Card */
621
677
  .walle-perm-card {
@@ -230,6 +230,126 @@
230
230
  .walle-chat-container { display: flex; flex-direction: column; height: 100%; }
231
231
  .walle-chat-messages { flex: 1; overflow-y: auto; padding: 0 0 12px; }
232
232
 
233
+ .we-provider-issue,
234
+ .we-provider-setup-banner,
235
+ .we-service-alerts {
236
+ flex-shrink: 0;
237
+ margin: 0 0 8px;
238
+ border-radius: 6px;
239
+ font-size: 12px;
240
+ }
241
+ .we-provider-issue {
242
+ display: flex;
243
+ justify-content: space-between;
244
+ gap: 12px;
245
+ padding: 10px 12px;
246
+ border: 1px solid rgba(247,118,142,0.36);
247
+ border-left: 3px solid #f7768e;
248
+ background: rgba(247,118,142,0.10);
249
+ color: #f2c0c8;
250
+ }
251
+ .we-provider-issue.warning {
252
+ border-color: rgba(250,176,5,0.36);
253
+ border-left-color: #fab005;
254
+ background: rgba(250,176,5,0.09);
255
+ color: #f6d58a;
256
+ }
257
+ .we-provider-issue.inline {
258
+ margin: 4px 0 0;
259
+ padding: 9px 10px;
260
+ }
261
+ .we-provider-issue-main { min-width: 0; flex: 1; }
262
+ .we-provider-issue-title {
263
+ color: #fff;
264
+ font-weight: 700;
265
+ margin-bottom: 2px;
266
+ }
267
+ .we-provider-issue-body {
268
+ line-height: 1.45;
269
+ overflow-wrap: anywhere;
270
+ }
271
+ .we-provider-issue-actions {
272
+ display: flex;
273
+ align-items: flex-start;
274
+ gap: 6px;
275
+ flex-shrink: 0;
276
+ }
277
+ .we-provider-issue-dismiss,
278
+ .we-service-alert-dismiss {
279
+ background: none;
280
+ border: none;
281
+ color: var(--fg-muted, #888);
282
+ cursor: pointer;
283
+ font-size: 16px;
284
+ line-height: 1;
285
+ padding: 2px 4px;
286
+ }
287
+ .we-provider-issue-details {
288
+ margin-top: 6px;
289
+ color: #d7dde8;
290
+ }
291
+ .we-provider-issue-details summary {
292
+ cursor: pointer;
293
+ color: #9fb0c8;
294
+ }
295
+ .we-provider-issue-details pre {
296
+ margin: 6px 0 0;
297
+ max-height: 180px;
298
+ overflow: auto;
299
+ white-space: pre-wrap;
300
+ word-break: break-word;
301
+ font-size: 11px;
302
+ line-height: 1.4;
303
+ color: #cbd5e1;
304
+ }
305
+ .we-provider-setup-banner {
306
+ display: flex;
307
+ align-items: center;
308
+ justify-content: space-between;
309
+ gap: 12px;
310
+ padding: 9px 12px;
311
+ border: 1px solid rgba(250,176,5,0.38);
312
+ background: rgba(250,176,5,0.08);
313
+ color: #f6d58a;
314
+ }
315
+ .we-provider-setup-actions { display: flex; gap: 8px; flex-shrink: 0; }
316
+ .we-service-alerts {
317
+ padding: 8px 12px;
318
+ border: 1px solid rgba(255,255,255,0.10);
319
+ background: rgba(255,255,255,0.04);
320
+ }
321
+ .we-service-alerts-title {
322
+ font-weight: 700;
323
+ margin-bottom: 4px;
324
+ color: #d7dde8;
325
+ }
326
+ .we-service-alert-item {
327
+ display: flex;
328
+ align-items: center;
329
+ gap: 8px;
330
+ padding: 5px 0;
331
+ }
332
+ .we-service-alert-icon {
333
+ width: 16px;
334
+ text-align: center;
335
+ color: #fab005;
336
+ font-weight: 800;
337
+ }
338
+ .we-service-alert-item.error .we-service-alert-icon,
339
+ .we-service-alert-item.provider .we-service-alert-icon { color: #f7768e; }
340
+ .we-service-alert-item.info .we-service-alert-icon { color: #74c0fc; }
341
+ .we-service-alert-text {
342
+ flex: 1;
343
+ min-width: 0;
344
+ line-height: 1.4;
345
+ overflow-wrap: anywhere;
346
+ }
347
+ .we-service-alert-action {
348
+ color: #74c0fc;
349
+ font-weight: 700;
350
+ text-decoration: underline;
351
+ }
352
+
233
353
  /* Conversation turn group — user question + assistant response paired together */
234
354
  .we-turn-group {
235
355
  border-bottom: 1px solid rgba(255,255,255,0.06);