@nac3/forge-cli 0.2.0-alpha.38 → 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,CA4/FxD"}
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"}
@@ -257,14 +257,89 @@ body {
257
257
  display: inline-block; /* shrink-to-fit so pre + scroll work together */
258
258
  min-width: 100%;
259
259
  }
260
- #yf-full .pz-body.pz-markdown { line-height: 1.6; }
261
- #yf-full .pz-body table {
262
- width: 100%; border-collapse: collapse; font-size: 11px;
263
- }
264
- #yf-full .pz-body th, #yf-full .pz-body td {
265
- text-align: left; padding: 4px 6px; border-bottom: 1px solid var(--border-subtle);
266
- }
267
- #yf-full .pz-body th { font-weight: 600; background: var(--bg-2); }
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); }
268
343
  #yf-full .pz-edit-wrap {
269
344
  flex: 1; min-height: 0;
270
345
  display: flex; flex-direction: column;
@@ -925,6 +1000,186 @@ function renderMd(src) {
925
1000
  return out;
926
1001
  }
927
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
+
928
1183
  function renderStream() {
929
1184
  for (const target of [$('#stream-mini'), $('#stream-full')]) {
930
1185
  target.innerHTML = '';
@@ -1061,6 +1316,68 @@ function pizarronStartEdit(id) {
1061
1316
  renderPizarron();
1062
1317
  }
1063
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
+
1064
1381
  async function pizarronSave(id) {
1065
1382
  const it = state.pizarron.items.find((x) => x.id === id);
1066
1383
  if (!it || !it.isEditing) return;
@@ -1139,7 +1456,12 @@ function renderPizarronCardBody(it) {
1139
1456
  + '<div class="pz-edit-actions">'
1140
1457
  + ' <button type="button" class="pz-save" data-pz-save data-pz-item-id="' + it.id + '"'
1141
1458
  + ' data-nac-id="yujin.pizarron.editor.' + it.id + '.save"'
1142
- + ' 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>'
1143
1465
  + ' <button type="button" data-pz-discard data-pz-item-id="' + it.id + '"'
1144
1466
  + ' data-nac-id="yujin.pizarron.editor.' + it.id + '.discard"'
1145
1467
  + ' data-nac-role="action" data-nac-action="discard_changes">Descartar</button>'
@@ -1147,37 +1469,39 @@ function renderPizarronCardBody(it) {
1147
1469
  + '</div>'
1148
1470
  + '</div>';
1149
1471
  }
1150
- /* 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">';
1151
1474
  if (it.kind === 'code') {
1152
- return '<div class="pz-body" data-nac-id="yujin.pizarron.item.' + it.id + '.body" data-nac-role="region" data-nac-action="scroll" tabindex="0">'
1153
- + '<pre>' + escapeHtml(it.content) + '</pre>'
1154
- + '</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>';
1155
1486
  }
1156
1487
  if (it.kind === 'markdown' || it.kind === 'document') {
1157
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">'
1158
- + renderMd(it.content) + '</div>';
1489
+ + renderMdRich(it.content) + '</div>';
1159
1490
  }
1160
1491
  if (it.kind === 'table') {
1161
- return '<div class="pz-body" data-nac-id="yujin.pizarron.item.' + it.id + '.body" data-nac-role="region" data-nac-action="scroll" tabindex="0">'
1162
- + renderMd(it.content) + '</div>';
1492
+ return bodyOpen + renderMdRich(it.content) + '</div>';
1163
1493
  }
1164
1494
  if (it.kind === 'tree') {
1165
- return '<div class="pz-body" data-nac-id="yujin.pizarron.item.' + it.id + '.body" data-nac-role="region" data-nac-action="scroll" tabindex="0">'
1166
- + '<pre>' + escapeHtml(it.content) + '</pre></div>';
1495
+ return bodyOpen + '<pre class="pz-tree">' + escapeHtml(it.content) + '</pre></div>';
1167
1496
  }
1168
1497
  if (it.kind === 'bpmn' || it.kind === 'flow') {
1169
- /* Trust SVG content from the LLM only when it starts with
1170
- <svg ... otherwise treat as text (mermaid syntax etc). */
1171
1498
  const trimmed = it.content.trim();
1172
1499
  if (trimmed.startsWith('<svg')) {
1173
- return '<div class="pz-body" data-nac-id="yujin.pizarron.item.' + it.id + '.body" data-nac-role="region" data-nac-action="scroll" tabindex="0">'
1174
- + trimmed + '</div>';
1500
+ return bodyOpen + sanitizeHtml(trimmed) + '</div>';
1175
1501
  }
1176
- return '<div class="pz-body" data-nac-id="yujin.pizarron.item.' + it.id + '.body" data-nac-role="region" data-nac-action="scroll" tabindex="0">'
1177
- + '<pre>' + escapeHtml(it.content) + '</pre></div>';
1502
+ return bodyOpen + '<pre class="pz-code"><code>' + escapeHtml(it.content) + '</code></pre></div>';
1178
1503
  }
1179
- return '<div class="pz-body" data-nac-id="yujin.pizarron.item.' + it.id + '.body" data-nac-role="region"><pre>'
1180
- + escapeHtml(it.content) + '</pre></div>';
1504
+ return bodyOpen + '<pre><code>' + escapeHtml(it.content) + '</code></pre></div>';
1181
1505
  }
1182
1506
 
1183
1507
  function renderPizarron() {
@@ -2836,6 +3160,7 @@ document.addEventListener('DOMContentLoaded', () => {
2836
3160
  const closeEl = t.closest('[data-pz-close]');
2837
3161
  const editEl = t.closest('[data-pz-edit]');
2838
3162
  const saveEl = t.closest('[data-pz-save]');
3163
+ const saveAsEl = t.closest('[data-pz-save-as]');
2839
3164
  const discardEl = t.closest('[data-pz-discard]');
2840
3165
  const readEl = t.closest('[data-pz-read]');
2841
3166
  const copyEl = t.closest('[data-pz-copy]');
@@ -2849,6 +3174,8 @@ document.addEventListener('DOMContentLoaded', () => {
2849
3174
  pizarronStartEdit(editEl.getAttribute('data-pz-item-id'));
2850
3175
  } else if (saveEl) {
2851
3176
  pizarronSave(saveEl.getAttribute('data-pz-item-id'));
3177
+ } else if (saveAsEl) {
3178
+ pizarronSaveAs(saveAsEl.getAttribute('data-pz-item-id'));
2852
3179
  } else if (discardEl) {
2853
3180
  pizarronDiscard(discardEl.getAttribute('data-pz-item-id'));
2854
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.38";
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.38';
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.38",
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>",