@nac3/forge-cli 0.2.0-alpha.37 → 0.2.0-alpha.39

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.
@@ -1 +1 @@
1
- {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/chat/panel.ts"],"names":[],"mappings":"AAkBA,OAAO,EAEL,KAAK,iBAAiB,EAEvB,MAAM,kBAAkB,CAAC;AAG1B,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb;;;;;2BAKuB;IACvB,IAAI,CAAC,EAAE,iBAAiB,CAAC;CAC1B;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAo9FxD"}
1
+ {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/chat/panel.ts"],"names":[],"mappings":"AAkBA,OAAO,EAEL,KAAK,iBAAiB,EAEvB,MAAM,kBAAkB,CAAC;AAG1B,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb;;;;;2BAKuB;IACvB,IAAI,CAAC,EAAE,iBAAiB,CAAC;CAC1B;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAm0GxD"}
@@ -150,6 +150,35 @@ body {
150
150
  #yf-full .body .pizarra .pizarra-empty .kanji-big {
151
151
  font-size: 96px; opacity: 0.4;
152
152
  }
153
+ /* alpha.38 -- visible scrollbars inside pizarron (both axes).
154
+ The OS-native scrollbars are sometimes invisible on macOS until
155
+ hover; force always-visible + Yujin-themed so wide code / tall
156
+ docs do NOT silently truncate the content. */
157
+ #yf-full .pz-tab-body ::-webkit-scrollbar,
158
+ #yf-full .pz-body ::-webkit-scrollbar,
159
+ #yf-full .pz-edit-area::-webkit-scrollbar {
160
+ width: 10px; height: 10px;
161
+ }
162
+ #yf-full .pz-tab-body ::-webkit-scrollbar-thumb,
163
+ #yf-full .pz-body ::-webkit-scrollbar-thumb,
164
+ #yf-full .pz-edit-area::-webkit-scrollbar-thumb {
165
+ background: rgba(0,0,0,0.25); border-radius: 5px;
166
+ }
167
+ #yf-full .pz-tab-body ::-webkit-scrollbar-thumb:hover,
168
+ #yf-full .pz-body ::-webkit-scrollbar-thumb:hover,
169
+ #yf-full .pz-edit-area::-webkit-scrollbar-thumb:hover {
170
+ background: rgba(0,0,0,0.4);
171
+ }
172
+ #yf-full .pz-tab-body ::-webkit-scrollbar-track,
173
+ #yf-full .pz-body ::-webkit-scrollbar-track,
174
+ #yf-full .pz-edit-area::-webkit-scrollbar-track {
175
+ background: rgba(0,0,0,0.05);
176
+ }
177
+ /* Firefox */
178
+ #yf-full .pz-tab-body, #yf-full .pz-body, #yf-full .pz-edit-area {
179
+ scrollbar-width: thin; scrollbar-color: rgba(0,0,0,0.3) rgba(0,0,0,0.05);
180
+ }
181
+
153
182
  /* alpha.35 -- multi-tab pizarron (VS Code-style). */
154
183
  #yf-full .pz-tabs {
155
184
  display: flex; gap: 2px; background: var(--bg-2);
@@ -216,19 +245,101 @@ body {
216
245
  flex: 1; min-height: 0;
217
246
  padding: 10px; overflow: auto;
218
247
  font-size: 12px; background: var(--bg-0, white);
248
+ /* alpha.38 -- explicit scroll on both axes so wide code +
249
+ tall outputs are not truncated. */
250
+ overflow-x: auto; overflow-y: auto;
251
+ scrollbar-gutter: stable;
219
252
  }
220
253
  #yf-full .pz-body pre {
221
254
  margin: 0; font-family: ui-monospace, "Cascadia Code", "JetBrains Mono", monospace;
222
- font-size: 11px; line-height: 1.5; white-space: pre;
223
- }
224
- #yf-full .pz-body.pz-markdown { line-height: 1.6; }
225
- #yf-full .pz-body table {
226
- width: 100%; border-collapse: collapse; font-size: 11px;
227
- }
228
- #yf-full .pz-body th, #yf-full .pz-body td {
229
- text-align: left; padding: 4px 6px; border-bottom: 1px solid var(--border-subtle);
230
- }
231
- #yf-full .pz-body th { font-weight: 600; background: var(--bg-2); }
255
+ font-size: 11px; line-height: 1.5;
256
+ white-space: pre; /* no wrap -> horizontal scroll on long lines */
257
+ display: inline-block; /* shrink-to-fit so pre + scroll work together */
258
+ min-width: 100%;
259
+ }
260
+ #yf-full .pz-body.pz-markdown { line-height: 1.6; font-size: 13px; color: var(--ink); }
261
+ #yf-full .pz-body.pz-html { line-height: 1.5; color: var(--ink); }
262
+ #yf-full .pz-body.pz-html * { max-width: 100%; }
263
+ #yf-full .pz-body.pz-html img { max-width: 100%; height: auto; }
264
+ /* alpha.39 -- embellished markdown rendering. */
265
+ #yf-full .pz-body .pz-h {
266
+ margin: 14px 0 8px; font-weight: 600; color: var(--ink);
267
+ line-height: 1.3;
268
+ }
269
+ #yf-full .pz-body .pz-h1 { font-size: 20px; border-bottom: 2px solid var(--border); padding-bottom: 6px; }
270
+ #yf-full .pz-body .pz-h2 { font-size: 17px; border-bottom: 1px solid var(--border-subtle); padding-bottom: 4px; }
271
+ #yf-full .pz-body .pz-h3 { font-size: 15px; }
272
+ #yf-full .pz-body .pz-h4 { font-size: 14px; }
273
+ #yf-full .pz-body .pz-h5, #yf-full .pz-body .pz-h6 { font-size: 13px; color: var(--ink-2); }
274
+ #yf-full .pz-body .pz-p { margin: 8px 0; line-height: 1.6; }
275
+ #yf-full .pz-body .pz-ul, #yf-full .pz-body .pz-ol {
276
+ margin: 8px 0; padding-left: 28px; line-height: 1.6;
277
+ }
278
+ #yf-full .pz-body .pz-ul li, #yf-full .pz-body .pz-ol li { margin: 4px 0; }
279
+ #yf-full .pz-body .pz-ul li::marker { color: var(--ink-2); }
280
+ #yf-full .pz-body .pz-ol li::marker { color: var(--ink-2); font-weight: 600; }
281
+ #yf-full .pz-body .pz-quote {
282
+ margin: 8px 0; padding: 6px 12px; border-left: 3px solid var(--border);
283
+ background: rgba(0,0,0,0.03); color: var(--ink-2); font-style: italic;
284
+ }
285
+ #yf-full .pz-body .pz-hr {
286
+ margin: 16px 0; border: none; border-top: 1px solid var(--border);
287
+ }
288
+ /* Tablas markdown encuadradas + zebra stripes. */
289
+ #yf-full .pz-body .pz-table {
290
+ width: 100%; border-collapse: collapse; margin: 10px 0;
291
+ font-size: 12px; border: 1px solid var(--border);
292
+ border-radius: 4px; overflow: hidden;
293
+ }
294
+ #yf-full .pz-body .pz-table th,
295
+ #yf-full .pz-body .pz-table td {
296
+ padding: 6px 10px;
297
+ border: 1px solid var(--border-subtle);
298
+ }
299
+ #yf-full .pz-body .pz-table th {
300
+ background: var(--bg-2); font-weight: 600;
301
+ color: var(--ink); text-transform: uppercase;
302
+ font-size: 10px; letter-spacing: 0.5px;
303
+ }
304
+ #yf-full .pz-body .pz-table tbody tr:nth-child(even) { background: rgba(0,0,0,0.025); }
305
+ #yf-full .pz-body .pz-table tbody tr:hover { background: rgba(0,0,0,0.05); }
306
+ /* Inline code + code blocks. */
307
+ #yf-full .pz-body code {
308
+ font-family: ui-monospace, "Cascadia Code", monospace;
309
+ font-size: 0.92em; background: rgba(0,0,0,0.06);
310
+ padding: 1px 5px; border-radius: 3px; color: #c0392b;
311
+ }
312
+ #yf-full .pz-body pre.pz-code {
313
+ margin: 10px 0; padding: 12px; background: #f6f8fa;
314
+ border: 1px solid var(--border); border-radius: 4px;
315
+ overflow-x: auto; font-size: 11px; line-height: 1.5;
316
+ position: relative;
317
+ }
318
+ #yf-full .pz-body pre.pz-code[data-lang]::before {
319
+ content: attr(data-lang);
320
+ position: absolute; top: 4px; right: 8px;
321
+ font-size: 9px; color: var(--ink-2); text-transform: uppercase;
322
+ letter-spacing: 0.5px;
323
+ }
324
+ #yf-full .pz-body pre.pz-code code {
325
+ background: transparent; padding: 0; color: var(--ink);
326
+ }
327
+ #yf-full .pz-body pre.pz-tree {
328
+ margin: 0; padding: 10px; font-size: 11px;
329
+ font-family: ui-monospace, monospace;
330
+ line-height: 1.45;
331
+ }
332
+ #yf-full .pz-body a {
333
+ color: #2563eb; text-decoration: underline;
334
+ }
335
+ #yf-full .pz-body a.fpath {
336
+ color: #2e7d32; font-family: monospace; text-decoration: none;
337
+ border-bottom: 1px dashed currentColor;
338
+ }
339
+ #yf-full .pz-body a.fpath:hover { background: rgba(46,125,50,0.08); }
340
+ #yf-full .pz-body strong { font-weight: 600; color: var(--ink); }
341
+ #yf-full .pz-body em { font-style: italic; }
342
+ #yf-full .pz-body s { color: var(--ink-2); }
232
343
  #yf-full .pz-edit-wrap {
233
344
  flex: 1; min-height: 0;
234
345
  display: flex; flex-direction: column;
@@ -241,6 +352,9 @@ body {
241
352
  border: none; outline: none;
242
353
  padding: 12px; resize: none;
243
354
  tab-size: 2;
355
+ /* alpha.38 -- NO word wrap in the editor; long lines scroll
356
+ horizontally so indentation + code structure stay intact. */
357
+ white-space: pre; overflow: auto; word-wrap: normal;
244
358
  }
245
359
  #yf-full .pz-edit-actions {
246
360
  display: flex; gap: 6px; padding: 6px 10px; align-items: center;
@@ -886,6 +1000,186 @@ function renderMd(src) {
886
1000
  return out;
887
1001
  }
888
1002
 
1003
+ /* alpha.39 -- renderer markdown completo para pizarron.
1004
+ * Soporta:
1005
+ * - headings (# .. ######)
1006
+ * - lists (-, *, +, 1.) con anidamiento por indentacion
1007
+ * - tables markdown (| col | col |)
1008
+ * - blockquotes
1009
+ * - code fences con lenguaje
1010
+ * - inline code, bold, italic
1011
+ * - links + file path linkify
1012
+ * - horizontal rules
1013
+ *
1014
+ * NO usa libs externas -- parser line-based simple. Suficiente
1015
+ * para tablas + listas + headings + code blocks que el LLM
1016
+ * produce. ASCII-only.
1017
+ */
1018
+ function renderMdRich(src) {
1019
+ const text = String(src || '');
1020
+ /* Split into lines BEFORE escape so we can detect block
1021
+ structure cleanly. Code fences eat their content raw. */
1022
+ const lines = text.split(/\\r?\\n/);
1023
+ const out = [];
1024
+ let i = 0;
1025
+ /* Helper: inline transformations applied per text fragment
1026
+ (already html-escaped). */
1027
+ function inline(s) {
1028
+ let r = s;
1029
+ /* inline code (backtick wrapped) */
1030
+ r = r.replace(/\`([^\`]+)\`/g, '<code>$1</code>');
1031
+ /* bold (double-asterisk wrapped) */
1032
+ r = r.replace(/\\*\\*([^*]+?)\\*\\*/g, '<strong>$1</strong>');
1033
+ /* italic (underscore wrapped, avoiding mid-word) */
1034
+ r = r.replace(/(^|[\\s>])_([^_\\s][^_]*?)_(?=[\\s.,;:!?)]|\$)/g,
1035
+ '$1<em>$2</em>');
1036
+ /* strikethrough (double-tilde wrapped) */
1037
+ r = r.replace(/~~([^~]+?)~~/g, '<s>$1</s>');
1038
+ /* links of the form [label](url) */
1039
+ r = r.replace(/\\[([^\\]]+)\\]\\(([^)\\s]+)\\)/g,
1040
+ '<a href="$2" target="_blank" rel="noopener">$1</a>');
1041
+ /* file paths */
1042
+ r = r.replace(
1043
+ /(?<![\\w/])((?:src|tests|docs|packages|apps|scripts)\\/[\\w./-]+(?:\\.[\\w]+)(?::\\d+(?::\\d+)?)?)/g,
1044
+ '<a class="fpath" data-fpath="$1" href="#" title="Abrir">$1</a>',
1045
+ );
1046
+ return r;
1047
+ }
1048
+ /* Parse a table starting at index i. Returns the rendered
1049
+ HTML and the new index, or null if not a valid table. */
1050
+ function tryTable(start) {
1051
+ if (start >= lines.length) return null;
1052
+ const row0 = lines[start];
1053
+ if (!/^\\s*\\|.*\\|\\s*\$/.test(row0)) return null;
1054
+ if (start + 1 >= lines.length) return null;
1055
+ const sep = lines[start + 1];
1056
+ if (!/^\\s*\\|?\\s*:?-+:?(?:\\s*\\|\\s*:?-+:?)+\\|?\\s*\$/.test(sep)) return null;
1057
+ const cells = (row) => row.trim().replace(/^\\|/, '').replace(/\\|\$/, '').split('|').map((c) => c.trim());
1058
+ const header = cells(row0);
1059
+ const aligns = cells(sep).map((s) => {
1060
+ const l = s.startsWith(':'); const r = s.endsWith(':');
1061
+ if (l && r) return 'center';
1062
+ if (r) return 'right';
1063
+ return 'left';
1064
+ });
1065
+ const rows = [];
1066
+ let j = start + 2;
1067
+ while (j < lines.length && /^\\s*\\|.*\\|\\s*\$/.test(lines[j])) {
1068
+ rows.push(cells(lines[j]));
1069
+ j += 1;
1070
+ }
1071
+ let html = '<table class="pz-table"><thead><tr>';
1072
+ header.forEach((h, k) => {
1073
+ html += '<th style="text-align:' + (aligns[k] || 'left') + '">' + inline(escapeHtml(h)) + '</th>';
1074
+ });
1075
+ html += '</tr></thead><tbody>';
1076
+ for (const row of rows) {
1077
+ html += '<tr>';
1078
+ row.forEach((cell, k) => {
1079
+ html += '<td style="text-align:' + (aligns[k] || 'left') + '">' + inline(escapeHtml(cell)) + '</td>';
1080
+ });
1081
+ html += '</tr>';
1082
+ }
1083
+ html += '</tbody></table>';
1084
+ return { html, next: j };
1085
+ }
1086
+ while (i < lines.length) {
1087
+ const line = lines[i];
1088
+ /* Code fence */
1089
+ const fence = line.match(/^\\s*\`\`\`([a-zA-Z0-9_+-]*)\\s*\$/);
1090
+ if (fence) {
1091
+ const lang = fence[1] || '';
1092
+ const body = [];
1093
+ i += 1;
1094
+ while (i < lines.length && !/^\\s*\`\`\`\\s*\$/.test(lines[i])) {
1095
+ body.push(lines[i]); i += 1;
1096
+ }
1097
+ if (i < lines.length) i += 1; /* skip closing */
1098
+ out.push('<pre class="pz-code"' + (lang ? ' data-lang="' + escapeHtml(lang) + '"' : '') + '><code>'
1099
+ + escapeHtml(body.join('\\n')) + '</code></pre>');
1100
+ continue;
1101
+ }
1102
+ /* Horizontal rule */
1103
+ if (/^\\s*(?:-{3,}|_{3,}|\\*{3,})\\s*\$/.test(line)) {
1104
+ out.push('<hr class="pz-hr">'); i += 1; continue;
1105
+ }
1106
+ /* Heading */
1107
+ const h = line.match(/^\\s*(#{1,6})\\s+(.+?)\\s*#*\\s*\$/);
1108
+ if (h) {
1109
+ const level = h[1].length;
1110
+ out.push('<h' + level + ' class="pz-h pz-h' + level + '">' + inline(escapeHtml(h[2])) + '</h' + level + '>');
1111
+ i += 1; continue;
1112
+ }
1113
+ /* Blockquote */
1114
+ if (/^\\s*>\\s?/.test(line)) {
1115
+ const buf = [];
1116
+ while (i < lines.length && /^\\s*>\\s?/.test(lines[i])) {
1117
+ buf.push(lines[i].replace(/^\\s*>\\s?/, ''));
1118
+ i += 1;
1119
+ }
1120
+ out.push('<blockquote class="pz-quote">' + inline(escapeHtml(buf.join(' '))) + '</blockquote>');
1121
+ continue;
1122
+ }
1123
+ /* Table */
1124
+ const tbl = tryTable(i);
1125
+ if (tbl) { out.push(tbl.html); i = tbl.next; continue; }
1126
+ /* Unordered list */
1127
+ if (/^\\s*[-*+]\\s+/.test(line)) {
1128
+ out.push('<ul class="pz-ul">');
1129
+ while (i < lines.length && /^\\s*[-*+]\\s+/.test(lines[i])) {
1130
+ const item = lines[i].replace(/^\\s*[-*+]\\s+/, '');
1131
+ out.push('<li>' + inline(escapeHtml(item)) + '</li>');
1132
+ i += 1;
1133
+ }
1134
+ out.push('</ul>');
1135
+ continue;
1136
+ }
1137
+ /* Ordered list */
1138
+ if (/^\\s*\\d+[.)]\\s+/.test(line)) {
1139
+ out.push('<ol class="pz-ol">');
1140
+ while (i < lines.length && /^\\s*\\d+[.)]\\s+/.test(lines[i])) {
1141
+ const item = lines[i].replace(/^\\s*\\d+[.)]\\s+/, '');
1142
+ out.push('<li>' + inline(escapeHtml(item)) + '</li>');
1143
+ i += 1;
1144
+ }
1145
+ out.push('</ol>');
1146
+ continue;
1147
+ }
1148
+ /* Empty line -> paragraph separator. */
1149
+ if (line.trim() === '') {
1150
+ out.push(''); i += 1; continue;
1151
+ }
1152
+ /* Default: paragraph. Coalesce consecutive non-block lines. */
1153
+ const para = [];
1154
+ while (i < lines.length && lines[i].trim() !== ''
1155
+ && !/^\\s*(#{1,6}\\s+|>\\s?|\\d+[.)]\\s+|[-*+]\\s+|\`\`\`|\\|)/.test(lines[i])) {
1156
+ para.push(lines[i]); i += 1;
1157
+ }
1158
+ if (para.length > 0) {
1159
+ out.push('<p class="pz-p">' + inline(escapeHtml(para.join(' '))) + '</p>');
1160
+ }
1161
+ }
1162
+ return out.join('');
1163
+ }
1164
+
1165
+ /* Sanitiser para kind='html': elimina <script>, <style>,
1166
+ * on* attrs, javascript: URIs. NO usa DOMParser para que sea
1167
+ * deterministico + sin side effects. */
1168
+ function sanitizeHtml(src) {
1169
+ let s = String(src || '');
1170
+ /* Strip script + style blocks completely. */
1171
+ s = s.replace(/<script\\b[\\s\\S]*?<\\/script>/gi, '');
1172
+ s = s.replace(/<style\\b[\\s\\S]*?<\\/style>/gi, '');
1173
+ /* Strip on* event handler attributes. */
1174
+ s = s.replace(/\\s+on[a-z]+\\s*=\\s*"[^"]*"/gi, '');
1175
+ s = s.replace(/\\s+on[a-z]+\\s*=\\s*'[^']*'/gi, '');
1176
+ s = s.replace(/\\s+on[a-z]+\\s*=\\s*[^\\s>]+/gi, '');
1177
+ /* javascript: protocol in hrefs / srcs. */
1178
+ s = s.replace(/(href|src)\\s*=\\s*"\\s*javascript:[^"]*"/gi, '$1="#"');
1179
+ s = s.replace(/(href|src)\\s*=\\s*'\\s*javascript:[^']*'/gi, "$1='#'");
1180
+ return s;
1181
+ }
1182
+
889
1183
  function renderStream() {
890
1184
  for (const target of [$('#stream-mini'), $('#stream-full')]) {
891
1185
  target.innerHTML = '';
@@ -1022,6 +1316,68 @@ function pizarronStartEdit(id) {
1022
1316
  renderPizarron();
1023
1317
  }
1024
1318
 
1319
+ async function pizarronSaveAs(id) {
1320
+ const it = state.pizarron.items.find((x) => x.id === id);
1321
+ if (!it || !it.isEditing) return;
1322
+ /* alpha.39 -- usa File System Access API (showSaveFilePicker)
1323
+ * cuando el browser la soporta (Chrome/Edge): da el diálogo
1324
+ * nativo del SO con explorer-style chooser. Si NO está
1325
+ * disponible (Firefox/Safari), fallback a prompt() con el
1326
+ * path actual prefilled para que el user edite dir + nombre. */
1327
+ if (typeof window.showSaveFilePicker === 'function') {
1328
+ try {
1329
+ const suggestedName = (it.file_path || it.title || 'untitled.txt').split('/').pop();
1330
+ const handle = await window.showSaveFilePicker({
1331
+ suggestedName,
1332
+ types: [{ description: it.kind, accept: { 'text/plain': ['.txt', '.ts', '.tsx', '.js', '.md', '.json', '.html', '.css'] } }],
1333
+ });
1334
+ const writable = await handle.createWritable();
1335
+ await writable.write(it.editValue);
1336
+ await writable.close();
1337
+ it.content = it.editValue;
1338
+ it.dirty = false;
1339
+ it.file_path = handle.name; /* solo el nombre; el browser
1340
+ no expone full path */
1341
+ setStatus('Guardado como: ' + handle.name + ' (en la ruta que elegiste en el dialog).');
1342
+ renderPizarron();
1343
+ return;
1344
+ } catch (err) {
1345
+ /* AbortError = el user cancelo el dialog -- silencioso. */
1346
+ if (err && err.name === 'AbortError') return;
1347
+ setStatus('Error en Guardar como: ' + (err && err.message ? err.message : err) + ' -- usando fallback.', true);
1348
+ }
1349
+ }
1350
+ /* Fallback: prompt con path relativo al projectRoot. */
1351
+ const initial = it.file_path || 'untitled.txt';
1352
+ const nextPath = prompt('Guardar como (path relativo al proyecto):', initial);
1353
+ if (!nextPath || nextPath.trim() === '') return;
1354
+ const rel = nextPath.trim();
1355
+ if (rel.startsWith('/') || rel.includes('..')) {
1356
+ alert('El path debe ser relativo al proyecto (sin "/" inicial ni "..").');
1357
+ return;
1358
+ }
1359
+ try {
1360
+ const r = await fetch('/api/forge/file', {
1361
+ method: 'POST',
1362
+ headers: { 'content-type': 'application/json' },
1363
+ body: JSON.stringify({ path: rel, content: it.editValue }),
1364
+ });
1365
+ const data = await r.json();
1366
+ if (!r.ok || !data.ok) {
1367
+ setStatus('Error al guardar: ' + (data.error || r.status), true);
1368
+ return;
1369
+ }
1370
+ it.content = it.editValue;
1371
+ it.file_path = rel;
1372
+ it.title = rel.split('/').pop() || rel;
1373
+ it.dirty = false;
1374
+ setStatus('Guardado como: ' + rel + ' (' + data.bytes_written + ' bytes)');
1375
+ renderPizarron();
1376
+ } catch (err) {
1377
+ setStatus('Error de red: ' + (err && err.message ? err.message : err), true);
1378
+ }
1379
+ }
1380
+
1025
1381
  async function pizarronSave(id) {
1026
1382
  const it = state.pizarron.items.find((x) => x.id === id);
1027
1383
  if (!it || !it.isEditing) return;
@@ -1095,11 +1451,17 @@ function renderPizarronCardBody(it) {
1095
1451
  + '<textarea class="pz-edit-area" data-pz-edit-input data-pz-item-id="' + it.id + '"'
1096
1452
  + ' data-nac-id="yujin.pizarron.editor.' + it.id + '.input"'
1097
1453
  + ' data-nac-role="field" data-nac-action="edit_content"'
1454
+ + ' data-nac-scrollable="both"'
1098
1455
  + ' spellcheck="false">' + escapeHtml(it.editValue || '') + '</textarea>'
1099
1456
  + '<div class="pz-edit-actions">'
1100
1457
  + ' <button type="button" class="pz-save" data-pz-save data-pz-item-id="' + it.id + '"'
1101
1458
  + ' data-nac-id="yujin.pizarron.editor.' + it.id + '.save"'
1102
- + ' data-nac-role="action" data-nac-action="save_file">Guardar</button>'
1459
+ + ' data-nac-role="action" data-nac-action="save_file"'
1460
+ + ' title="Guardar en ' + escapeHtml(it.file_path || '(memoria)') + '">Guardar</button>'
1461
+ + ' <button type="button" data-pz-save-as data-pz-item-id="' + it.id + '"'
1462
+ + ' data-nac-id="yujin.pizarron.editor.' + it.id + '.save-as"'
1463
+ + ' data-nac-role="action" data-nac-action="save_file_as"'
1464
+ + ' title="Guardar como -- elegí nuevo path (relativo al proyecto)">Guardar como…</button>'
1103
1465
  + ' <button type="button" data-pz-discard data-pz-item-id="' + it.id + '"'
1104
1466
  + ' data-nac-id="yujin.pizarron.editor.' + it.id + '.discard"'
1105
1467
  + ' data-nac-role="action" data-nac-action="discard_changes">Descartar</button>'
@@ -1107,37 +1469,39 @@ function renderPizarronCardBody(it) {
1107
1469
  + '</div>'
1108
1470
  + '</div>';
1109
1471
  }
1110
- /* View mode by kind. */
1472
+ /* alpha.39 -- richer view-mode by kind. */
1473
+ const bodyOpen = '<div class="pz-body" data-nac-id="yujin.pizarron.item.' + it.id + '.body" data-nac-role="region" data-nac-action="scroll" tabindex="0">';
1111
1474
  if (it.kind === 'code') {
1112
- return '<div class="pz-body" data-nac-id="yujin.pizarron.item.' + it.id + '.body" data-nac-role="region">'
1113
- + '<pre>' + escapeHtml(it.content) + '</pre>'
1114
- + '</div>';
1475
+ return bodyOpen
1476
+ + '<pre class="pz-code"' + (it.language ? ' data-lang="' + escapeHtml(it.language) + '"' : '') + '><code>'
1477
+ + escapeHtml(it.content)
1478
+ + '</code></pre></div>';
1479
+ }
1480
+ if (it.kind === 'html') {
1481
+ /* Render como HTML real (sanitizado). Per Pablo: 'que los
1482
+ * htmls rendericen como html y no se muestren como texto
1483
+ * plano a menos que la accion sea editar'. */
1484
+ return '<div class="pz-body pz-html" data-nac-id="yujin.pizarron.item.' + it.id + '.body" data-nac-role="region" data-nac-action="scroll" tabindex="0">'
1485
+ + sanitizeHtml(it.content) + '</div>';
1115
1486
  }
1116
1487
  if (it.kind === 'markdown' || it.kind === 'document') {
1117
- return '<div class="pz-body pz-markdown" data-nac-id="yujin.pizarron.item.' + it.id + '.body" data-nac-role="region">'
1118
- + renderMd(it.content) + '</div>';
1488
+ return '<div class="pz-body pz-markdown" data-nac-id="yujin.pizarron.item.' + it.id + '.body" data-nac-role="region" data-nac-action="scroll" tabindex="0">'
1489
+ + renderMdRich(it.content) + '</div>';
1119
1490
  }
1120
1491
  if (it.kind === 'table') {
1121
- return '<div class="pz-body" data-nac-id="yujin.pizarron.item.' + it.id + '.body" data-nac-role="region">'
1122
- + renderMd(it.content) + '</div>';
1492
+ return bodyOpen + renderMdRich(it.content) + '</div>';
1123
1493
  }
1124
1494
  if (it.kind === 'tree') {
1125
- return '<div class="pz-body" data-nac-id="yujin.pizarron.item.' + it.id + '.body" data-nac-role="region">'
1126
- + '<pre>' + escapeHtml(it.content) + '</pre></div>';
1495
+ return bodyOpen + '<pre class="pz-tree">' + escapeHtml(it.content) + '</pre></div>';
1127
1496
  }
1128
1497
  if (it.kind === 'bpmn' || it.kind === 'flow') {
1129
- /* Trust SVG content from the LLM only when it starts with
1130
- <svg ... otherwise treat as text (mermaid syntax etc). */
1131
1498
  const trimmed = it.content.trim();
1132
1499
  if (trimmed.startsWith('<svg')) {
1133
- return '<div class="pz-body" data-nac-id="yujin.pizarron.item.' + it.id + '.body" data-nac-role="region">'
1134
- + trimmed + '</div>';
1500
+ return bodyOpen + sanitizeHtml(trimmed) + '</div>';
1135
1501
  }
1136
- return '<div class="pz-body" data-nac-id="yujin.pizarron.item.' + it.id + '.body" data-nac-role="region">'
1137
- + '<pre>' + escapeHtml(it.content) + '</pre></div>';
1502
+ return bodyOpen + '<pre class="pz-code"><code>' + escapeHtml(it.content) + '</code></pre></div>';
1138
1503
  }
1139
- return '<div class="pz-body" data-nac-id="yujin.pizarron.item.' + it.id + '.body" data-nac-role="region"><pre>'
1140
- + escapeHtml(it.content) + '</pre></div>';
1504
+ return bodyOpen + '<pre><code>' + escapeHtml(it.content) + '</code></pre></div>';
1141
1505
  }
1142
1506
 
1143
1507
  function renderPizarron() {
@@ -2796,6 +3160,7 @@ document.addEventListener('DOMContentLoaded', () => {
2796
3160
  const closeEl = t.closest('[data-pz-close]');
2797
3161
  const editEl = t.closest('[data-pz-edit]');
2798
3162
  const saveEl = t.closest('[data-pz-save]');
3163
+ const saveAsEl = t.closest('[data-pz-save-as]');
2799
3164
  const discardEl = t.closest('[data-pz-discard]');
2800
3165
  const readEl = t.closest('[data-pz-read]');
2801
3166
  const copyEl = t.closest('[data-pz-copy]');
@@ -2809,6 +3174,8 @@ document.addEventListener('DOMContentLoaded', () => {
2809
3174
  pizarronStartEdit(editEl.getAttribute('data-pz-item-id'));
2810
3175
  } else if (saveEl) {
2811
3176
  pizarronSave(saveEl.getAttribute('data-pz-item-id'));
3177
+ } else if (saveAsEl) {
3178
+ pizarronSaveAs(saveAsEl.getAttribute('data-pz-item-id'));
2812
3179
  } else if (discardEl) {
2813
3180
  pizarronDiscard(discardEl.getAttribute('data-pz-item-id'));
2814
3181
  } else if (readEl) {
@@ -1 +1 @@
1
- {"version":3,"file":"panel.js","sourceRoot":"","sources":["../../src/chat/panel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"panel.js","sourceRoot":"","sources":["../../src/chat/panel.ts"],"names":[],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA27EtB,CAAC;AACT,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC;SACL,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC"}
package/dist/version.d.ts CHANGED
@@ -4,5 +4,5 @@
4
4
  * into the npm metadata) so we don't end up with two versions
5
5
  * drifting.
6
6
  */
7
- export declare const VERSION = "0.2.0-alpha.37";
7
+ export declare const VERSION = "0.2.0-alpha.39";
8
8
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -4,5 +4,5 @@
4
4
  * into the npm metadata) so we don't end up with two versions
5
5
  * drifting.
6
6
  */
7
- export const VERSION = '0.2.0-alpha.37';
7
+ export const VERSION = '0.2.0-alpha.39';
8
8
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nac3/forge-cli",
3
- "version": "0.2.0-alpha.37",
3
+ "version": "0.2.0-alpha.39",
4
4
  "description": "Yujin Forge -- voice-first NAC-3 React development framework. CLI + chat panel + spec ingest + 10-format document reader + voice loop.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "author": "Pablo Kuschnirof <pablo@rpaforce.com>",