@autocode-cli/autocode 0.0.43 → 0.1.4

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 (106) hide show
  1. package/LICENSE +5 -5
  2. package/LICENSE.fr.md +203 -0
  3. package/README.md +48 -15
  4. package/dist/cli/parser.d.ts +1 -1
  5. package/dist/cli/parser.d.ts.map +1 -1
  6. package/dist/cli/parser.js +5 -4
  7. package/dist/cli/parser.js.map +1 -1
  8. package/dist/index.js +4 -1
  9. package/dist/index.js.map +1 -1
  10. package/dist/server/api.d.ts.map +1 -1
  11. package/dist/server/api.js +47 -7
  12. package/dist/server/api.js.map +1 -1
  13. package/dist/server/dashboard/index.d.ts +10 -0
  14. package/dist/server/dashboard/index.d.ts.map +1 -0
  15. package/dist/server/dashboard/index.js +16 -0
  16. package/dist/server/dashboard/index.js.map +1 -0
  17. package/dist/server/dashboard/pages/column-edit.d.ts +8 -0
  18. package/dist/server/dashboard/pages/column-edit.d.ts.map +1 -0
  19. package/dist/server/dashboard/pages/column-edit.js +303 -0
  20. package/dist/server/dashboard/pages/column-edit.js.map +1 -0
  21. package/dist/server/dashboard/pages/column-prompt.d.ts +8 -0
  22. package/dist/server/dashboard/pages/column-prompt.d.ts.map +1 -0
  23. package/dist/server/dashboard/pages/column-prompt.js +228 -0
  24. package/dist/server/dashboard/pages/column-prompt.js.map +1 -0
  25. package/dist/server/dashboard/pages/column-terminal.d.ts +8 -0
  26. package/dist/server/dashboard/pages/column-terminal.d.ts.map +1 -0
  27. package/dist/server/dashboard/pages/column-terminal.js +529 -0
  28. package/dist/server/dashboard/pages/column-terminal.js.map +1 -0
  29. package/dist/server/dashboard/pages/index.d.ts +12 -0
  30. package/dist/server/dashboard/pages/index.d.ts.map +1 -0
  31. package/dist/server/dashboard/pages/index.js +12 -0
  32. package/dist/server/dashboard/pages/index.js.map +1 -0
  33. package/dist/server/dashboard/pages/main-dashboard.d.ts +11 -0
  34. package/dist/server/dashboard/pages/main-dashboard.d.ts.map +1 -0
  35. package/dist/server/dashboard/pages/main-dashboard.js +209 -0
  36. package/dist/server/dashboard/pages/main-dashboard.js.map +1 -0
  37. package/dist/server/dashboard/pages/shared.d.ts +8 -0
  38. package/dist/server/dashboard/pages/shared.d.ts.map +1 -0
  39. package/dist/server/dashboard/pages/shared.js +58 -0
  40. package/dist/server/dashboard/pages/shared.js.map +1 -0
  41. package/dist/server/dashboard/pages/ticket-view.d.ts +8 -0
  42. package/dist/server/dashboard/pages/ticket-view.d.ts.map +1 -0
  43. package/dist/server/dashboard/pages/ticket-view.js +1364 -0
  44. package/dist/server/dashboard/pages/ticket-view.js.map +1 -0
  45. package/dist/server/dashboard/scripts/index.d.ts +11 -0
  46. package/dist/server/dashboard/scripts/index.d.ts.map +1 -0
  47. package/dist/server/dashboard/scripts/index.js +1325 -0
  48. package/dist/server/dashboard/scripts/index.js.map +1 -0
  49. package/dist/server/dashboard/styles/base.d.ts +5 -0
  50. package/dist/server/dashboard/styles/base.d.ts.map +1 -0
  51. package/dist/server/dashboard/styles/base.js +110 -0
  52. package/dist/server/dashboard/styles/base.js.map +1 -0
  53. package/dist/server/dashboard/styles/board.d.ts +5 -0
  54. package/dist/server/dashboard/styles/board.d.ts.map +1 -0
  55. package/dist/server/dashboard/styles/board.js +168 -0
  56. package/dist/server/dashboard/styles/board.js.map +1 -0
  57. package/dist/server/dashboard/styles/comments.d.ts +5 -0
  58. package/dist/server/dashboard/styles/comments.d.ts.map +1 -0
  59. package/dist/server/dashboard/styles/comments.js +249 -0
  60. package/dist/server/dashboard/styles/comments.js.map +1 -0
  61. package/dist/server/dashboard/styles/components.d.ts +5 -0
  62. package/dist/server/dashboard/styles/components.d.ts.map +1 -0
  63. package/dist/server/dashboard/styles/components.js +190 -0
  64. package/dist/server/dashboard/styles/components.js.map +1 -0
  65. package/dist/server/dashboard/styles/footer.d.ts +5 -0
  66. package/dist/server/dashboard/styles/footer.d.ts.map +1 -0
  67. package/dist/server/dashboard/styles/footer.js +32 -0
  68. package/dist/server/dashboard/styles/footer.js.map +1 -0
  69. package/dist/server/dashboard/styles/index.d.ts +8 -0
  70. package/dist/server/dashboard/styles/index.d.ts.map +1 -0
  71. package/dist/server/dashboard/styles/index.js +27 -0
  72. package/dist/server/dashboard/styles/index.js.map +1 -0
  73. package/dist/server/dashboard/styles/logs.d.ts +5 -0
  74. package/dist/server/dashboard/styles/logs.d.ts.map +1 -0
  75. package/dist/server/dashboard/styles/logs.js +89 -0
  76. package/dist/server/dashboard/styles/logs.js.map +1 -0
  77. package/dist/server/dashboard/styles/notifications.d.ts +5 -0
  78. package/dist/server/dashboard/styles/notifications.d.ts.map +1 -0
  79. package/dist/server/dashboard/styles/notifications.js +51 -0
  80. package/dist/server/dashboard/styles/notifications.js.map +1 -0
  81. package/dist/server/dashboard/styles/variables.d.ts +5 -0
  82. package/dist/server/dashboard/styles/variables.d.ts.map +1 -0
  83. package/dist/server/dashboard/styles/variables.js +29 -0
  84. package/dist/server/dashboard/styles/variables.js.map +1 -0
  85. package/dist/server/dashboard/utils.d.ts +8 -0
  86. package/dist/server/dashboard/utils.d.ts.map +1 -0
  87. package/dist/server/dashboard/utils.js +14 -0
  88. package/dist/server/dashboard/utils.js.map +1 -0
  89. package/dist/server/dashboard.d.ts +5 -21
  90. package/dist/server/dashboard.d.ts.map +1 -1
  91. package/dist/server/dashboard.js +5 -4843
  92. package/dist/server/dashboard.js.map +1 -1
  93. package/dist/server/websocket.d.ts +12 -0
  94. package/dist/server/websocket.d.ts.map +1 -1
  95. package/dist/server/websocket.js +19 -0
  96. package/dist/server/websocket.js.map +1 -1
  97. package/dist/services/claude.d.ts.map +1 -1
  98. package/dist/services/claude.js +4 -1
  99. package/dist/services/claude.js.map +1 -1
  100. package/dist/utils/config.d.ts +1 -1
  101. package/dist/utils/config.js +1 -1
  102. package/dist/utils/version-check.d.ts +26 -0
  103. package/dist/utils/version-check.d.ts.map +1 -0
  104. package/dist/utils/version-check.js +234 -0
  105. package/dist/utils/version-check.js.map +1 -0
  106. package/package.json +2 -2
@@ -0,0 +1,529 @@
1
+ /**
2
+ * Column terminal page generator
3
+ */
4
+ import { getConfig } from '../../../utils/config.js';
5
+ import { getTicket } from '../../../core/ticket.js';
6
+ import { escapeHtml } from '../utils.js';
7
+ import { generate404Page } from './shared.js';
8
+ /**
9
+ * Generate the column terminal page
10
+ */
11
+ export function generateColumnTerminalPage(ticketKey, columnSlug, lang) {
12
+ const config = getConfig();
13
+ const ticket = getTicket(config.root, ticketKey);
14
+ if (!ticket) {
15
+ return generate404Page(ticketKey, lang);
16
+ }
17
+ return `<!DOCTYPE html>
18
+ <html lang="${lang}">
19
+ <head>
20
+ <meta charset="UTF-8">
21
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
22
+ <title>Terminal → ${escapeHtml(columnSlug)} | ${ticketKey} - AutoCode</title>
23
+ <style>
24
+ :root {
25
+ --bg: #0a0a0f;
26
+ --bg-secondary: #12121a;
27
+ --bg-tertiary: #1a1a24;
28
+ --text: #f1f5f9;
29
+ --muted: #94a3b8;
30
+ --border: #2a2a3a;
31
+ --accent: #6366f1;
32
+ --blue: #4dabf7;
33
+ --green: #4ade80;
34
+ --yellow: #facc15;
35
+ --orange: #fb923c;
36
+ --red: #f87171;
37
+ --purple: #a78bfa;
38
+ }
39
+ * { margin: 0; padding: 0; box-sizing: border-box; }
40
+ body {
41
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
42
+ background: var(--bg);
43
+ color: var(--text);
44
+ min-height: 100vh;
45
+ display: flex;
46
+ flex-direction: column;
47
+ }
48
+ .header {
49
+ display: flex;
50
+ align-items: center;
51
+ gap: 24px;
52
+ padding: 16px 24px;
53
+ background: var(--bg-secondary);
54
+ border-bottom: 1px solid var(--border);
55
+ position: sticky;
56
+ top: 0;
57
+ z-index: 100;
58
+ }
59
+ .back-btn {
60
+ color: var(--muted);
61
+ text-decoration: none;
62
+ font-size: 14px;
63
+ display: flex;
64
+ align-items: center;
65
+ gap: 8px;
66
+ padding: 8px 16px;
67
+ background: var(--bg-tertiary);
68
+ border-radius: 6px;
69
+ transition: all 0.2s;
70
+ }
71
+ .back-btn:hover { color: var(--text); background: var(--border); }
72
+ .ticket-key {
73
+ font-family: 'SF Mono', Monaco, monospace;
74
+ font-size: 12px;
75
+ color: var(--accent);
76
+ background: rgba(99, 102, 241, 0.15);
77
+ padding: 4px 10px;
78
+ border-radius: 4px;
79
+ font-weight: 600;
80
+ }
81
+ .column-slug {
82
+ font-family: 'SF Mono', Monaco, monospace;
83
+ font-size: 14px;
84
+ color: var(--green);
85
+ background: rgba(74, 222, 128, 0.15);
86
+ padding: 6px 12px;
87
+ border-radius: 4px;
88
+ font-weight: 500;
89
+ }
90
+ .page-title {
91
+ flex: 1;
92
+ font-size: 18px;
93
+ font-weight: 600;
94
+ display: flex;
95
+ align-items: center;
96
+ gap: 12px;
97
+ }
98
+ .main {
99
+ flex: 1;
100
+ padding: 24px;
101
+ display: flex;
102
+ flex-direction: column;
103
+ }
104
+ .terminal-container {
105
+ flex: 1;
106
+ background: var(--bg-secondary);
107
+ border: 1px solid var(--border);
108
+ border-radius: 12px;
109
+ display: flex;
110
+ flex-direction: column;
111
+ overflow: hidden;
112
+ }
113
+ .terminal-header {
114
+ display: flex;
115
+ align-items: center;
116
+ gap: 12px;
117
+ padding: 12px 16px;
118
+ background: var(--bg-tertiary);
119
+ border-bottom: 1px solid var(--border);
120
+ }
121
+ .terminal-status {
122
+ font-size: 12px;
123
+ padding: 4px 12px;
124
+ border-radius: 12px;
125
+ font-weight: 500;
126
+ }
127
+ .terminal-status.idle { background: var(--bg-secondary); color: var(--muted); }
128
+ .terminal-status.processing { background: rgba(251, 146, 60, 0.15); color: var(--orange); }
129
+ .terminal-status.success { background: rgba(74, 222, 128, 0.15); color: var(--green); }
130
+ .terminal-status.error { background: rgba(248, 113, 113, 0.15); color: var(--red); }
131
+ .terminal-log {
132
+ flex: 1;
133
+ padding: 16px;
134
+ overflow-y: auto;
135
+ font-family: 'SF Mono', Monaco, Consolas, monospace;
136
+ font-size: 13px;
137
+ line-height: 1.6;
138
+ }
139
+
140
+ /* Log entry styles */
141
+ .log-entry {
142
+ padding: 4px 0;
143
+ flex-shrink: 0;
144
+ }
145
+ .log-entry.timestamp { color: var(--muted); font-size: 11px; }
146
+ .log-entry.system { color: var(--blue); }
147
+ .log-entry.error { color: var(--red); }
148
+ .log-entry.tool-call { margin: 8px 0; }
149
+ .log-label {
150
+ display: inline-block;
151
+ padding: 2px 8px;
152
+ border-radius: 4px;
153
+ font-size: 11px;
154
+ font-weight: 600;
155
+ margin-right: 8px;
156
+ text-transform: uppercase;
157
+ }
158
+ .log-entry.system .log-label { background: rgba(77, 171, 247, 0.15); color: var(--blue); }
159
+ .log-entry.error .log-label { background: rgba(248, 113, 113, 0.15); color: var(--red); }
160
+ .log-tool-badge {
161
+ display: inline-block;
162
+ background: rgba(163, 139, 250, 0.15);
163
+ color: var(--purple);
164
+ padding: 4px 10px;
165
+ border-radius: 4px;
166
+ font-size: 12px;
167
+ font-weight: 500;
168
+ }
169
+ .log-content { display: inline; }
170
+
171
+ /* Message cards */
172
+ .log-message-card {
173
+ background: var(--bg-tertiary);
174
+ border: 1px solid var(--border);
175
+ border-radius: 8px;
176
+ margin: 12px 0;
177
+ overflow: hidden;
178
+ flex-shrink: 0;
179
+ }
180
+ .log-message-header {
181
+ padding: 8px 12px;
182
+ font-size: 11px;
183
+ font-weight: 600;
184
+ text-transform: uppercase;
185
+ letter-spacing: 0.5px;
186
+ }
187
+ .assistant-header { background: rgba(99, 102, 241, 0.15); color: var(--accent); }
188
+ .result-header { background: rgba(74, 222, 128, 0.15); color: var(--green); }
189
+ .log-message-body {
190
+ padding: 12px;
191
+ line-height: 1.6;
192
+ white-space: pre-wrap;
193
+ word-break: break-word;
194
+ }
195
+
196
+ /* Code blocks - collapsible */
197
+ .log-code-block {
198
+ background: #0d1117;
199
+ border: 1px solid var(--border);
200
+ border-radius: 6px;
201
+ overflow: hidden;
202
+ margin: 8px 0;
203
+ }
204
+ .log-code-block summary.log-code-header {
205
+ background: #161b22;
206
+ padding: 10px 14px;
207
+ font-size: 12px;
208
+ color: var(--muted);
209
+ cursor: pointer;
210
+ display: flex;
211
+ align-items: center;
212
+ gap: 8px;
213
+ user-select: none;
214
+ list-style: none;
215
+ }
216
+ .log-code-block summary.log-code-header::-webkit-details-marker { display: none; }
217
+ .log-code-block summary.log-code-header::before {
218
+ content: '▶';
219
+ font-size: 10px;
220
+ transition: transform 0.2s;
221
+ }
222
+ .log-code-block[open] summary.log-code-header::before {
223
+ transform: rotate(90deg);
224
+ }
225
+ .log-code-block .code-lang {
226
+ background: var(--accent);
227
+ color: white;
228
+ padding: 2px 6px;
229
+ border-radius: 4px;
230
+ font-size: 10px;
231
+ font-weight: 600;
232
+ text-transform: uppercase;
233
+ }
234
+ .log-code-block pre {
235
+ margin: 0;
236
+ padding: 0;
237
+ background: transparent;
238
+ }
239
+ .log-code-block code {
240
+ display: block;
241
+ padding: 14px;
242
+ overflow-x: auto;
243
+ font-family: 'Fira Code', 'SF Mono', Monaco, monospace;
244
+ font-size: 13px;
245
+ line-height: 1.6;
246
+ max-height: 500px;
247
+ overflow-y: auto;
248
+ }
249
+
250
+ .no-log {
251
+ color: var(--muted);
252
+ text-align: center;
253
+ padding: 48px;
254
+ font-size: 14px;
255
+ }
256
+
257
+ /* Markdown styles for message bodies */
258
+ .log-message-body h1 { font-size: 1.5em; font-weight: 600; margin: 0.8em 0 0.4em 0; }
259
+ .log-message-body h2 { font-size: 1.3em; font-weight: 600; margin: 0.8em 0 0.4em 0; }
260
+ .log-message-body h3 { font-size: 1.15em; font-weight: 600; margin: 0.8em 0 0.4em 0; }
261
+ .log-message-body h4, .log-message-body h5, .log-message-body h6 { font-size: 1em; font-weight: 600; margin: 0.6em 0 0.3em 0; }
262
+ .log-message-body p { margin: 0.6em 0; }
263
+ .log-message-body ul, .log-message-body ol { margin: 0.6em 0; padding-left: 1.5em; }
264
+ .log-message-body li { margin: 0.2em 0; }
265
+ .log-message-body code { background: var(--bg); padding: 2px 5px; border-radius: 3px; font-size: 0.9em; }
266
+ .log-message-body pre { background: var(--bg); padding: 12px; border-radius: 6px; overflow-x: auto; margin: 0.6em 0; }
267
+ .log-message-body pre code { background: none; padding: 0; }
268
+ .log-message-body blockquote { border-left: 3px solid var(--accent); padding-left: 12px; margin: 0.6em 0; color: var(--muted); font-style: italic; }
269
+ .log-message-body a { color: var(--blue); text-decoration: none; }
270
+ .log-message-body a:hover { text-decoration: underline; }
271
+ .log-message-body strong { font-weight: 600; }
272
+ .log-message-body em { font-style: italic; }
273
+ .log-message-body hr { border: none; border-top: 1px solid var(--border); margin: 1em 0; }
274
+ </style>
275
+ <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
276
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github-dark.min.css">
277
+ </head>
278
+ <body>
279
+ <header class="header">
280
+ <a href="/ticket/${ticketKey}" class="back-btn">← Retour</a>
281
+ <span class="ticket-key">${ticketKey}</span>
282
+ <div class="page-title">
283
+ <span>Terminal →</span>
284
+ <span class="column-slug">${escapeHtml(columnSlug)}</span>
285
+ </div>
286
+ </header>
287
+
288
+ <main class="main">
289
+ <div class="terminal-container">
290
+ <div class="terminal-header">
291
+ <span class="terminal-status idle" id="terminal-status">En attente</span>
292
+ </div>
293
+ <div class="terminal-log" id="terminal-log">
294
+ <div class="no-log">Chargement...</div>
295
+ </div>
296
+ </div>
297
+ </main>
298
+
299
+ <script>
300
+ const TICKET_KEY = '${ticketKey}';
301
+ const COLUMN_SLUG = '${escapeHtml(columnSlug)}';
302
+
303
+ function escapeHtml(str) {
304
+ if (typeof str !== 'string') return '';
305
+ return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
306
+ }
307
+
308
+ function renderMarkdown(str) {
309
+ if (typeof str !== 'string') return '';
310
+ try {
311
+ return marked.parse(str);
312
+ } catch (e) {
313
+ return escapeHtml(str);
314
+ }
315
+ }
316
+
317
+ function formatCodeBlock(content, filename) {
318
+ const lines = content.split(/\\\\n|\\n/);
319
+ // Détecter le langage depuis le nom de fichier
320
+ let lang = 'plaintext';
321
+ if (filename) {
322
+ const ext = filename.split('.').pop().toLowerCase();
323
+ const langMap = {
324
+ 'js': 'javascript', 'ts': 'typescript', 'vue': 'html', 'jsx': 'javascript',
325
+ 'tsx': 'typescript', 'py': 'python', 'rb': 'ruby', 'java': 'java',
326
+ 'go': 'go', 'rs': 'rust', 'cpp': 'cpp', 'c': 'c', 'h': 'c',
327
+ 'css': 'css', 'scss': 'scss', 'html': 'html', 'json': 'json',
328
+ 'md': 'markdown', 'sh': 'bash', 'yml': 'yaml', 'yaml': 'yaml'
329
+ };
330
+ lang = langMap[ext] || 'plaintext';
331
+ }
332
+ // Extraire le code sans les numéros de ligne pour highlight.js
333
+ let codeLines = [];
334
+ for (const line of lines) {
335
+ const match = line.match(/^\\s*\\d+[→|](.*)$/);
336
+ if (match) {
337
+ codeLines.push(match[1]);
338
+ } else if (line.trim()) {
339
+ codeLines.push(line);
340
+ }
341
+ }
342
+ const codeContent = codeLines.join('\\n');
343
+ const lineCount = codeLines.length;
344
+ const preview = filename || (lineCount + ' lignes');
345
+
346
+ let html = '<details class="log-code-block">';
347
+ html += '<summary class="log-code-header"><span class="code-lang">' + lang + '</span> ' + escapeHtml(preview) + '</summary>';
348
+ html += '<pre><code class="language-' + lang + '">' + escapeHtml(codeContent) + '</code></pre>';
349
+ html += '</details>';
350
+ return html;
351
+ }
352
+
353
+ function formatLogContent(rawContent) {
354
+ if (!rawContent) return '';
355
+ // Supprimer les balises <system-reminder> et leur contenu
356
+ let cleanedContent = rawContent.replace(/<system-reminder>[\\s\\S]*?<\\/system-reminder>/gi, '');
357
+ const lines = cleanedContent.split('\\n');
358
+ const entries = [];
359
+ let textBuffer = [];
360
+
361
+ function flushTextBuffer() {
362
+ if (textBuffer.length > 0) {
363
+ const text = textBuffer.join('\\n');
364
+ entries.push('<div class="log-message-card"><div class="log-message-header assistant-header">Assistant</div><div class="log-message-body">' + renderMarkdown(text) + '</div></div>');
365
+ textBuffer = [];
366
+ }
367
+ }
368
+
369
+ for (const line of lines) {
370
+ // Garder les lignes vides dans le buffer pour les paragraphes markdown
371
+ if (!line.trim()) {
372
+ if (textBuffer.length > 0) textBuffer.push('');
373
+ continue;
374
+ }
375
+
376
+ const timestampMatch = line.match(/^\\[(\\d{4}-\\d{2}-\\d{2}T[^\\]]+)\\]\\s*(.*)$/);
377
+ if (timestampMatch) {
378
+ flushTextBuffer();
379
+ const date = new Date(timestampMatch[1]);
380
+ const timeStr = date.toLocaleTimeString();
381
+ entries.push('<div class="log-entry timestamp">' + timeStr + ' - ' + escapeHtml(timestampMatch[2]) + '</div>');
382
+ continue;
383
+ }
384
+
385
+ if (line.startsWith('[RAW] ')) {
386
+ flushTextBuffer();
387
+ const raw = line.slice(6);
388
+ if (!raw.startsWith('{')) continue;
389
+
390
+ if (raw.includes('"type":"tool_result"')) {
391
+ const contentStart = raw.indexOf('"content":"');
392
+ if (contentStart !== -1) {
393
+ let content = raw.slice(contentStart + 11);
394
+ const endQuote = content.lastIndexOf('"');
395
+ if (endQuote > 0) content = content.slice(0, endQuote);
396
+ const decoded = content.replace(/\\\\n/g, '\\n').replace(/\\\\"/g, '"').replace(/\\\\t/g, '\\t');
397
+ if (/^\\s*\\d+[→|]/.test(decoded)) {
398
+ entries.push('<div class="log-message-card"><div class="log-message-header result-header">Tool Result</div><div class="log-message-body">' + formatCodeBlock(decoded) + '</div></div>');
399
+ } else {
400
+ const lines = decoded.split('\\n').slice(0, 20);
401
+ const truncated = decoded.split('\\n').length > 20 ? '<div style="color:#8b949e;font-style:italic">... (truncated)</div>' : '';
402
+ entries.push('<div class="log-message-card"><div class="log-message-header result-header">Tool Result</div><div class="log-message-body" style="font-family:monospace;font-size:12px;white-space:pre-wrap;max-height:200px;overflow-y:auto">' + escapeHtml(lines.join('\\n')) + truncated + '</div></div>');
403
+ }
404
+ continue;
405
+ }
406
+ }
407
+
408
+ const textMatch = raw.match(/"type":"text","text":"([^"]+)"/);
409
+ if (textMatch) {
410
+ const decoded = textMatch[1].replace(/\\\\n/g, '\\n').replace(/\\\\"/g, '"');
411
+ entries.push('<div class="log-message-card"><div class="log-message-header assistant-header">Assistant</div><div class="log-message-body">' + renderMarkdown(decoded) + '</div></div>');
412
+ continue;
413
+ }
414
+
415
+ const toolMatch = raw.match(/"type":"tool_use"[^}]*"name":"([^"]+)"/);
416
+ if (toolMatch) {
417
+ entries.push('<div class="log-entry tool-call"><span class="log-tool-badge">' + escapeHtml(toolMatch[1]) + '</span></div>');
418
+ continue;
419
+ }
420
+ continue;
421
+ }
422
+
423
+ if (line.startsWith('[SYSTEM]')) {
424
+ flushTextBuffer();
425
+ entries.push('<div class="log-entry system"><span class="log-label">System</span><div class="log-content">' + escapeHtml(line.slice(9)) + '</div></div>');
426
+ continue;
427
+ }
428
+ if (line.startsWith('[ASSISTANT]')) {
429
+ flushTextBuffer();
430
+ entries.push('<div class="log-message-card"><div class="log-message-header assistant-header">Assistant</div><div class="log-message-body">' + renderMarkdown(line.slice(12)) + '</div></div>');
431
+ continue;
432
+ }
433
+ if (line.startsWith('[TOOL]')) {
434
+ flushTextBuffer();
435
+ entries.push('<div class="log-entry tool-call"><span class="log-tool-badge">' + escapeHtml(line.slice(7)) + '</span></div>');
436
+ continue;
437
+ }
438
+ if (line.startsWith('[RESULT]')) {
439
+ flushTextBuffer();
440
+ const content = line.slice(9);
441
+ if (/^\\s*\\d+[→|]/.test(content)) {
442
+ entries.push('<div class="log-message-card"><div class="log-message-header result-header">Result</div><div class="log-message-body">' + formatCodeBlock(content) + '</div></div>');
443
+ } else {
444
+ entries.push('<div class="log-message-card"><div class="log-message-header result-header">Result</div><div class="log-message-body">' + escapeHtml(content.slice(0, 1000)) + (content.length > 1000 ? '...' : '') + '</div></div>');
445
+ }
446
+ continue;
447
+ }
448
+ if (line.startsWith('[ERROR]')) {
449
+ flushTextBuffer();
450
+ entries.push('<div class="log-entry error"><span class="log-label">Error</span><div class="log-content">' + escapeHtml(line.slice(8)) + '</div></div>');
451
+ continue;
452
+ }
453
+
454
+ // Ligne de texte brut - ajouter au buffer pour regrouper
455
+ textBuffer.push(line);
456
+ }
457
+
458
+ // Flush le buffer restant
459
+ flushTextBuffer();
460
+ return entries.join('');
461
+ }
462
+
463
+ async function fetchLog() {
464
+ try {
465
+ const res = await fetch('/api/tickets/' + TICKET_KEY + '/log/' + COLUMN_SLUG);
466
+ const json = await res.json();
467
+ const log = document.getElementById('terminal-log');
468
+ const status = document.getElementById('terminal-status');
469
+
470
+ if (json.success && json.data && json.data.content) {
471
+ log.innerHTML = formatLogContent(json.data.content);
472
+ // Appliquer le syntax highlighting
473
+ if (window.hljs) {
474
+ log.querySelectorAll('pre code').forEach((block) => {
475
+ hljs.highlightElement(block);
476
+ });
477
+ }
478
+ log.scrollTop = log.scrollHeight;
479
+ status.className = 'terminal-status success';
480
+ status.textContent = 'Terminé';
481
+ } else {
482
+ log.innerHTML = '<div class="no-log">Aucun log disponible pour cette colonne.</div>';
483
+ status.className = 'terminal-status idle';
484
+ status.textContent = 'Aucun log';
485
+ }
486
+ } catch (e) {
487
+ console.error('Log fetch error:', e);
488
+ document.getElementById('terminal-log').innerHTML = '<div class="no-log">Erreur de chargement.</div>';
489
+ }
490
+ }
491
+
492
+ // WebSocket for live updates
493
+ let ws = null;
494
+ function connectWebSocket() {
495
+ const protocol = location.protocol === 'https:' ? 'wss:' : 'ws:';
496
+ ws = new WebSocket(protocol + '//' + location.host + '/ws');
497
+
498
+ ws.onmessage = (event) => {
499
+ try {
500
+ const msg = JSON.parse(event.data);
501
+ if (msg.type === 'claude:start' && msg.ticketKey === TICKET_KEY) {
502
+ document.getElementById('terminal-status').className = 'terminal-status processing';
503
+ document.getElementById('terminal-status').textContent = 'En cours...';
504
+ }
505
+ if (msg.type === 'claude:end' && msg.ticketKey === TICKET_KEY) {
506
+ fetchLog();
507
+ }
508
+ if (msg.type === 'ticket:updated' && msg.ticketKey === TICKET_KEY) {
509
+ fetchLog();
510
+ }
511
+ } catch (e) {
512
+ console.error('WebSocket error:', e);
513
+ }
514
+ };
515
+
516
+ ws.onclose = () => {
517
+ setTimeout(connectWebSocket, 3000);
518
+ };
519
+ }
520
+
521
+ // Init
522
+ fetchLog();
523
+ connectWebSocket();
524
+ </script>
525
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
526
+ </body>
527
+ </html>`;
528
+ }
529
+ //# sourceMappingURL=column-terminal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-terminal.js","sourceRoot":"","sources":["../../../../src/server/dashboard/pages/column-terminal.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,SAAiB,EAAE,UAAkB,EAAE,IAAY;IAC5F,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAEjD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO;cACK,IAAI;;;;sBAII,UAAU,CAAC,UAAU,CAAC,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAkQpC,SAAS;+BACD,SAAS;;;kCAGN,UAAU,CAAC,UAAU,CAAC;;;;;;;;;;;;;;;;0BAgB9B,SAAS;2BACR,UAAU,CAAC,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAkOzC,CAAC;AACT,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Pages module index
3
+ *
4
+ * Re-exports all page generators.
5
+ */
6
+ export { generateDashboard } from './main-dashboard.js';
7
+ export { generateColumnEditPage } from './column-edit.js';
8
+ export { generateTicketViewPage } from './ticket-view.js';
9
+ export { generateColumnTerminalPage } from './column-terminal.js';
10
+ export { generateColumnPromptPage } from './column-prompt.js';
11
+ export { generate404Page } from './shared.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/server/dashboard/pages/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Pages module index
3
+ *
4
+ * Re-exports all page generators.
5
+ */
6
+ export { generateDashboard } from './main-dashboard.js';
7
+ export { generateColumnEditPage } from './column-edit.js';
8
+ export { generateTicketViewPage } from './ticket-view.js';
9
+ export { generateColumnTerminalPage } from './column-terminal.js';
10
+ export { generateColumnPromptPage } from './column-prompt.js';
11
+ export { generate404Page } from './shared.js';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/server/dashboard/pages/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Main dashboard page generator
3
+ *
4
+ * This module re-exports from the parent dashboard for now.
5
+ * The full page content remains in the main file for stability.
6
+ */
7
+ /**
8
+ * Generate the full dashboard HTML
9
+ */
10
+ export declare function generateDashboard(): string;
11
+ //# sourceMappingURL=main-dashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main-dashboard.d.ts","sourceRoot":"","sources":["../../../../src/server/dashboard/pages/main-dashboard.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CA+L1C"}