@nac3/forge-cli 1.0.77 → 1.0.79
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.
- package/dist/chat/ingest_session.d.ts +16 -0
- package/dist/chat/ingest_session.d.ts.map +1 -1
- package/dist/chat/ingest_session.js +34 -0
- package/dist/chat/ingest_session.js.map +1 -1
- package/dist/chat/panel.d.ts.map +1 -1
- package/dist/chat/panel.js +238 -34
- package/dist/chat/panel.js.map +1 -1
- package/dist/chat/server.d.ts.map +1 -1
- package/dist/chat/server.js +21 -1
- package/dist/chat/server.js.map +1 -1
- package/dist/core/file_tree.d.ts +2 -0
- package/dist/core/file_tree.d.ts.map +1 -1
- package/dist/core/file_tree.js +4 -2
- package/dist/core/file_tree.js.map +1 -1
- package/dist/core/forge_embed.d.ts.map +1 -1
- package/dist/core/forge_embed.js +7 -0
- package/dist/core/forge_embed.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/src/i18n/catalogs/ar.json +533 -525
- package/src/i18n/catalogs/de.json +533 -525
- package/src/i18n/catalogs/en.json +533 -525
- package/src/i18n/catalogs/es.json +533 -525
- package/src/i18n/catalogs/fr.json +533 -525
- package/src/i18n/catalogs/hi.json +533 -525
- package/src/i18n/catalogs/it.json +533 -525
- package/src/i18n/catalogs/ja.json +533 -525
- package/src/i18n/catalogs/pt.json +533 -525
- package/src/i18n/catalogs/zh.json +533 -525
|
@@ -73,6 +73,14 @@ export interface IngestSession {
|
|
|
73
73
|
plan?: import('./spec_plan.js').SpecPlan;
|
|
74
74
|
/** When V1.43 has run, the scaffold report + rollback log. */
|
|
75
75
|
scaffold?: import('./spec_scaffold.js').ScaffoldReport;
|
|
76
|
+
/** Absolute path to the ORIGINAL attachment bytes on disk (PND-153).
|
|
77
|
+
* Set by saveIngestSource so the office.* readers can open the real
|
|
78
|
+
* file (all sheets, full content) -- the digest only ever showed a
|
|
79
|
+
* first-section summary, so tools had nothing to open and the brain
|
|
80
|
+
* wrongly asked the user to re-upload. Lives in the ingest store
|
|
81
|
+
* (~/.yujin-forge/ingest/...), NOT the project tree, so it is safe
|
|
82
|
+
* even for a read-only PROD embedded assistant. */
|
|
83
|
+
source_path?: string;
|
|
76
84
|
/** ISO timestamp the session was created. */
|
|
77
85
|
ingested_at: string;
|
|
78
86
|
}
|
|
@@ -99,6 +107,14 @@ export declare function flattenDocument(doc: NormalisedDocument): {
|
|
|
99
107
|
};
|
|
100
108
|
export declare function recordIngest(doc: NormalisedDocument): IngestSession;
|
|
101
109
|
export declare function getIngest(docId: string): IngestSession | null;
|
|
110
|
+
/** PND-153 -- persist the ORIGINAL attachment bytes next to the session
|
|
111
|
+
* JSON, so the office.* readers (and any path-based tool) can open the
|
|
112
|
+
* real file with ALL its sheets/pages -- not just the first-section
|
|
113
|
+
* digest. Returns the absolute path, or null when there is no active
|
|
114
|
+
* project slug (pure in-memory mode: tests / legacy callers) or no
|
|
115
|
+
* session for docId. Best-effort: the caller treats a throw/null as
|
|
116
|
+
* "not persisted" and degrades the digest accordingly. */
|
|
117
|
+
export declare function saveIngestSource(docId: string, filename: string, buffer: Buffer): Promise<string | null>;
|
|
102
118
|
export declare function setExtraction(docId: string, extraction: SpecExtraction): void;
|
|
103
119
|
export declare function setPlan(docId: string, plan: import('./spec_plan.js').SpecPlan): void;
|
|
104
120
|
export declare function setScaffold(docId: string, report: import('./spec_scaffold.js').ScaffoldReport): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ingest_session.d.ts","sourceRoot":"","sources":["../../src/chat/ingest_session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAKH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb;iCAC6B;IAC7B,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;CAC9C;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB;qBACiB;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,oBAAoB,EAAE,CAAC;IACrC,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,UAAU,EAAE,kBAAkB,EAAE,CAAC;IACjC;sBACkB;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,kBAAkB,CAAC;IACxB;;;oDAGgD;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB;;wCAEoC;IACpC,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,6DAA6D;IAC7D,IAAI,CAAC,EAAE,OAAO,gBAAgB,EAAE,QAAQ,CAAC;IACzC,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,OAAO,oBAAoB,EAAE,cAAc,CAAC;IACvD,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;qDAEqD;AACrD,eAAO,MAAM,iBAAiB,QAAY,CAAC;AAU3C,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAEjE;AAED,wBAAgB,eAAe,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"ingest_session.d.ts","sourceRoot":"","sources":["../../src/chat/ingest_session.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,6 +37,13 @@ export function setProjectSlugForIngest(slug) {
|
|
|
37
37
|
activeProjectSlug = slug;
|
|
38
38
|
}
|
|
39
39
|
export function ingestStoreRoot() {
|
|
40
|
+
/* PND-153 -- an explicit override wins, so a hardened embedded deployment
|
|
41
|
+
* (systemd StateDirectory, ProtectHome=, a system user with no real $HOME)
|
|
42
|
+
* can point the ingest store at a guaranteed-writable dir. The generated
|
|
43
|
+
* unit sets YF_INGEST_DIR; otherwise fall back to Forge's home config dir. */
|
|
44
|
+
const override = (process.env.YF_INGEST_DIR || '').trim();
|
|
45
|
+
if (override && path.isAbsolute(override))
|
|
46
|
+
return override;
|
|
40
47
|
const home = process.env.HOME || process.env.USERPROFILE || os.homedir();
|
|
41
48
|
return path.join(home, '.yujin-forge', 'ingest');
|
|
42
49
|
}
|
|
@@ -67,6 +74,8 @@ function serialiseSession(s) {
|
|
|
67
74
|
clean.plan = s.plan;
|
|
68
75
|
if (s.scaffold)
|
|
69
76
|
clean.scaffold = s.scaffold;
|
|
77
|
+
if (s.source_path)
|
|
78
|
+
clean.source_path = s.source_path;
|
|
70
79
|
return JSON.stringify(clean, null, 2);
|
|
71
80
|
}
|
|
72
81
|
async function persistSession(s) {
|
|
@@ -192,6 +201,31 @@ export function recordIngest(doc) {
|
|
|
192
201
|
export function getIngest(docId) {
|
|
193
202
|
return SESSIONS.get(docId) ?? null;
|
|
194
203
|
}
|
|
204
|
+
/** PND-153 -- persist the ORIGINAL attachment bytes next to the session
|
|
205
|
+
* JSON, so the office.* readers (and any path-based tool) can open the
|
|
206
|
+
* real file with ALL its sheets/pages -- not just the first-section
|
|
207
|
+
* digest. Returns the absolute path, or null when there is no active
|
|
208
|
+
* project slug (pure in-memory mode: tests / legacy callers) or no
|
|
209
|
+
* session for docId. Best-effort: the caller treats a throw/null as
|
|
210
|
+
* "not persisted" and degrades the digest accordingly. */
|
|
211
|
+
export async function saveIngestSource(docId, filename, buffer) {
|
|
212
|
+
const dir = projectDir();
|
|
213
|
+
if (!dir)
|
|
214
|
+
return null;
|
|
215
|
+
const s = SESSIONS.get(docId);
|
|
216
|
+
if (!s)
|
|
217
|
+
return null;
|
|
218
|
+
let ext = path.extname(filename || '').toLowerCase();
|
|
219
|
+
/* Guard a junk/oversized "extension" from a hostile filename. */
|
|
220
|
+
if (!/^\.[a-z0-9]{1,8}$/.test(ext))
|
|
221
|
+
ext = '.' + String(s.doc.format || 'bin').replace(/[^a-z0-9]/gi, '').slice(0, 8);
|
|
222
|
+
const target = path.join(dir, docId + ext);
|
|
223
|
+
await fs.mkdir(dir, { recursive: true });
|
|
224
|
+
await fs.writeFile(target, buffer);
|
|
225
|
+
s.source_path = target;
|
|
226
|
+
persistAsync(s);
|
|
227
|
+
return target;
|
|
228
|
+
}
|
|
195
229
|
export function setExtraction(docId, extraction) {
|
|
196
230
|
const s = SESSIONS.get(docId);
|
|
197
231
|
if (!s)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ingest_session.js","sourceRoot":"","sources":["../../src/chat/ingest_session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"ingest_session.js","sourceRoot":"","sources":["../../src/chat/ingest_session.ts"],"names":[],"mappings":"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"}
|
package/dist/chat/panel.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/chat/panel.ts"],"names":[],"mappings":"AAmBA,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,
|
|
1
|
+
{"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/chat/panel.ts"],"names":[],"mappings":"AAmBA,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,CAg1YxD"}
|
package/dist/chat/panel.js
CHANGED
|
@@ -56,6 +56,14 @@ export function renderPanelHtml(cfg) {
|
|
|
56
56
|
filesTruncated: tForLang(lang, 'panel.files.truncated'),
|
|
57
57
|
filesOpened: tForLang(lang, 'panel.files.opened'),
|
|
58
58
|
filesOpenFailed: tForLang(lang, 'panel.files.openFailed'),
|
|
59
|
+
filesSearchName: tForLang(lang, 'panel.files.searchName'),
|
|
60
|
+
filesSearchType: tForLang(lang, 'panel.files.searchType'),
|
|
61
|
+
filesMatches: tForLang(lang, 'panel.files.matches'),
|
|
62
|
+
filesNoMatches: tForLang(lang, 'panel.files.noMatches'),
|
|
63
|
+
filesSortBy: tForLang(lang, 'panel.files.sortBy'),
|
|
64
|
+
filesSortName: tForLang(lang, 'panel.files.sortName'),
|
|
65
|
+
filesSortSize: tForLang(lang, 'panel.files.sortSize'),
|
|
66
|
+
filesSortType: tForLang(lang, 'panel.files.sortType'),
|
|
59
67
|
projectSwitching: tForLang(lang, 'panel.project.switching'),
|
|
60
68
|
micButton: tForLang(lang, 'panel.button.mic'),
|
|
61
69
|
micButtonRec: tForLang(lang, 'panel.button.mic.recording'),
|
|
@@ -676,6 +684,26 @@ body {
|
|
|
676
684
|
.pz-files-tree .pz-file-ic { flex: 0 0 auto; }
|
|
677
685
|
.pz-files-tree .pz-file-name { overflow: hidden; text-overflow: ellipsis; }
|
|
678
686
|
.pz-files-tree .pz-file-dir > .pz-file-name { font-weight: 600; }
|
|
687
|
+
/* PND-152 -- per-file metadata (size . ext . date) + name/type search. */
|
|
688
|
+
.pz-files-tree .pz-file-meta { margin-left: auto; padding-left: 12px; flex: 0 0 auto;
|
|
689
|
+
font-size: 10.5px; color: var(--ink-muted, #a49c8c); font-variant-numeric: tabular-nums; }
|
|
690
|
+
.pz-files-tree .pz-file-dir > .pz-file-meta { min-width: 1.5em; text-align: right; opacity: 0.7; }
|
|
691
|
+
.pz-files-tree.pz-files-flat, .pz-files-tree ul.pz-files-flat { }
|
|
692
|
+
.pz-files-search { display: flex; gap: 8px; padding: 6px 10px; flex: 0 0 auto;
|
|
693
|
+
border-bottom: 1px solid var(--border-subtle, #e3ddcf); }
|
|
694
|
+
.pz-files-search input { font: inherit; font-size: 11.5px; color: #3a3a3a;
|
|
695
|
+
border: 1px solid var(--border-subtle, #d9d2c4); background: #fff; border-radius: 6px;
|
|
696
|
+
padding: 4px 8px; outline: none; }
|
|
697
|
+
.pz-files-search input:focus { border-color: var(--accent, #b08d57); }
|
|
698
|
+
.pz-files-search .pz-files-q { flex: 1 1 auto; min-width: 0; }
|
|
699
|
+
.pz-files-search .pz-files-type { flex: 0 0 22%; max-width: 120px; }
|
|
700
|
+
.pz-files-search .pz-files-sort { font: inherit; font-size: 11.5px; color: #3a3a3a;
|
|
701
|
+
border: 1px solid var(--border-subtle, #d9d2c4); background: #fff; border-radius: 6px;
|
|
702
|
+
padding: 4px 6px; outline: none; flex: 0 0 auto; cursor: pointer; }
|
|
703
|
+
.pz-files-search .pz-files-dir { font: inherit; font-size: 11px; cursor: pointer; flex: 0 0 auto;
|
|
704
|
+
border: 1px solid var(--border-subtle, #d9d2c4); background: #fff; color: #3a3a3a;
|
|
705
|
+
border-radius: 6px; padding: 4px 8px; line-height: 1; }
|
|
706
|
+
.pz-files-search .pz-files-dir:hover { background: var(--bg2, #f1efe7); }
|
|
679
707
|
/* PIZ-3 (PND-073) -- grafo de nodos dinamico, estetica sumi-e. */
|
|
680
708
|
#yf-full .pz-graph-wrap {
|
|
681
709
|
display: flex; gap: 0; height: 100%; min-height: 360px; padding: 0;
|
|
@@ -5534,11 +5562,34 @@ function renderPizarronCardBody(it) {
|
|
|
5534
5562
|
/* File explorer of the local repo. The tree is fetched live by
|
|
5535
5563
|
* initFilesTab from /api/forge/files-tree; clicking a file opens it
|
|
5536
5564
|
* with the OS-associated app via /api/forge/open-native. */
|
|
5565
|
+
const phName = escapeHtml((CONFIG.i18n && CONFIG.i18n.filesSearchName) || 'Filtrar por nombre');
|
|
5566
|
+
const phType = escapeHtml((CONFIG.i18n && CONFIG.i18n.filesSearchType) || 'Tipo (ej: ts, png)');
|
|
5567
|
+
const sortBy = escapeHtml((CONFIG.i18n && CONFIG.i18n.filesSortBy) || 'Ordenar por');
|
|
5537
5568
|
return '<div class="pz-body pz-files-wrap" data-nac-id="yujin.pizarron.item.' + it.id + '.body" data-nac-role="region">'
|
|
5538
5569
|
+ '<div class="pz-files-bar">'
|
|
5539
|
-
+ '<button type="button" class="pz-files-refresh" data-pz-files-refresh
|
|
5570
|
+
+ '<button type="button" class="pz-files-refresh" data-pz-files-refresh'
|
|
5571
|
+
+ ' data-nac-id="yujin.files.refresh" data-nac-role="action" data-nac-action="refresh_files"'
|
|
5572
|
+
+ ' data-nac-label="' + phName + '" data-nac-hint="reload the file tree">' + escapeHtml((CONFIG.i18n && CONFIG.i18n.filesRefresh) || 'Actualizar') + '</button>'
|
|
5540
5573
|
+ '<span class="pz-files-status" data-pz-files-status></span>'
|
|
5541
5574
|
+ '</div>'
|
|
5575
|
+
+ '<div class="pz-files-search">'
|
|
5576
|
+
+ '<input type="text" class="pz-files-q" data-pz-files-q placeholder="' + phName + '" spellcheck="false"'
|
|
5577
|
+
+ ' data-nac-id="yujin.files.search.name" data-nac-role="field" data-nac-action="filter_by_name"'
|
|
5578
|
+
+ ' data-nac-label="' + phName + '" data-nac-hint="filter files by name" aria-label="' + phName + '" />'
|
|
5579
|
+
+ '<input type="text" class="pz-files-type" data-pz-files-type placeholder="' + phType + '" spellcheck="false"'
|
|
5580
|
+
+ ' data-nac-id="yujin.files.search.type" data-nac-role="field" data-nac-action="filter_by_type"'
|
|
5581
|
+
+ ' data-nac-label="' + phType + '" data-nac-hint="filter files by extension" aria-label="' + phType + '" />'
|
|
5582
|
+
+ '<select class="pz-files-sort" data-pz-files-sort'
|
|
5583
|
+
+ ' data-nac-id="yujin.files.sort" data-nac-role="field" data-nac-action="sort_files"'
|
|
5584
|
+
+ ' data-nac-label="' + sortBy + '" data-nac-hint="sort files" aria-label="' + sortBy + '">'
|
|
5585
|
+
+ '<option value="name">' + escapeHtml((CONFIG.i18n && CONFIG.i18n.filesSortName) || 'Nombre') + '</option>'
|
|
5586
|
+
+ '<option value="size">' + escapeHtml((CONFIG.i18n && CONFIG.i18n.filesSortSize) || 'Tamano') + '</option>'
|
|
5587
|
+
+ '<option value="type">' + escapeHtml((CONFIG.i18n && CONFIG.i18n.filesSortType) || 'Tipo') + '</option>'
|
|
5588
|
+
+ '</select>'
|
|
5589
|
+
+ '<button type="button" class="pz-files-dir" data-pz-files-dir'
|
|
5590
|
+
+ ' data-nac-id="yujin.files.sort.dir" data-nac-role="action" data-nac-action="toggle_sort_dir"'
|
|
5591
|
+
+ ' data-nac-label="' + sortBy + '" data-nac-hint="toggle ascending/descending" aria-label="' + sortBy + '" title="' + sortBy + '">▲</button>'
|
|
5592
|
+
+ '</div>'
|
|
5542
5593
|
+ '<div class="pz-files-tree" data-pz-files-tree>' + escapeHtml((CONFIG.i18n && CONFIG.i18n.filesLoading) || 'Cargando...') + '</div>'
|
|
5543
5594
|
+ '</div>';
|
|
5544
5595
|
}
|
|
@@ -6726,6 +6777,25 @@ function fmtFileSize(n) {
|
|
|
6726
6777
|
return (n / (1024 * 1024)).toFixed(1) + ' MB';
|
|
6727
6778
|
}
|
|
6728
6779
|
|
|
6780
|
+
/* PND-152 -- per-file metadata for the files tab. */
|
|
6781
|
+
function fileExt(name) {
|
|
6782
|
+
const s = String(name || '');
|
|
6783
|
+
const dot = s.lastIndexOf('.');
|
|
6784
|
+
return dot > 0 ? s.slice(dot + 1).toLowerCase() : '';
|
|
6785
|
+
}
|
|
6786
|
+
function fmtFileDate(ms) {
|
|
6787
|
+
if (typeof ms !== 'number' || !isFinite(ms) || ms <= 0) return '';
|
|
6788
|
+
try {
|
|
6789
|
+
return new Date(ms).toLocaleDateString(undefined, { day: '2-digit', month: 'short', year: '2-digit' });
|
|
6790
|
+
} catch (e) { return ''; }
|
|
6791
|
+
}
|
|
6792
|
+
/* size . ext . fecha -- the muted metadata line shown after a file name. */
|
|
6793
|
+
function fmtFileMeta(node) {
|
|
6794
|
+
const ext = fileExt(node.name);
|
|
6795
|
+
return [fmtFileSize(node.size), ext ? '.' + ext : '', fmtFileDate(node.mtime)]
|
|
6796
|
+
.filter(Boolean).join(' · ');
|
|
6797
|
+
}
|
|
6798
|
+
|
|
6729
6799
|
function initFilesTab(it) {
|
|
6730
6800
|
const wrap = document.querySelector('[data-pz-files-tree]');
|
|
6731
6801
|
if (!wrap) return;
|
|
@@ -6733,25 +6803,77 @@ function initFilesTab(it) {
|
|
|
6733
6803
|
const refreshBtn = document.querySelector('[data-pz-files-refresh]');
|
|
6734
6804
|
const expanded = _filesExpandByTab[it.id] || (_filesExpandByTab[it.id] = new Set());
|
|
6735
6805
|
|
|
6806
|
+
const qEl = document.querySelector('[data-pz-files-q]');
|
|
6807
|
+
const typeEl = document.querySelector('[data-pz-files-type]');
|
|
6808
|
+
const sortEl = document.querySelector('[data-pz-files-sort]');
|
|
6809
|
+
const dirEl = document.querySelector('[data-pz-files-dir]');
|
|
6810
|
+
let treeData = null; /* the last loaded tree, kept so search re-filters without a refetch */
|
|
6811
|
+
let sortKey = 'name'; /* name | size | type */
|
|
6812
|
+
let sortDir = 1; /* 1 asc, -1 desc */
|
|
6813
|
+
|
|
6736
6814
|
function setFilesStatus(msg) { if (statusEl) statusEl.textContent = msg || ''; }
|
|
6737
6815
|
|
|
6738
|
-
|
|
6739
|
-
|
|
6740
|
-
|
|
6816
|
+
/* PND-152 -- order by name / size / type. In the tree, dirs stay first
|
|
6817
|
+
* (a file explorer convention) and the key orders within each kind; the
|
|
6818
|
+
* flat search list is a pure key sort. */
|
|
6819
|
+
function cmpByKey(a, b) {
|
|
6820
|
+
let r = 0;
|
|
6821
|
+
if (sortKey === 'size') r = (a.size || 0) - (b.size || 0);
|
|
6822
|
+
else if (sortKey === 'type') r = fileExt(a.name).localeCompare(fileExt(b.name));
|
|
6823
|
+
if (r === 0) r = a.name.toLowerCase().localeCompare(b.name.toLowerCase()); /* stable tiebreak */
|
|
6824
|
+
return r * sortDir;
|
|
6825
|
+
}
|
|
6826
|
+
function sortChildren(children) {
|
|
6827
|
+
return children.slice().sort(function (a, b) {
|
|
6828
|
+
if (a.kind !== b.kind) return a.kind === 'dir' ? -1 : 1; /* dirs first, regardless of dir */
|
|
6829
|
+
return cmpByKey(a, b);
|
|
6830
|
+
});
|
|
6831
|
+
}
|
|
6832
|
+
|
|
6833
|
+
/* A single file row (used by BOTH the tree and the flat search results).
|
|
6834
|
+
* label = what to show (name in the tree, full path in search results). */
|
|
6835
|
+
function makeFileRow(node, label) {
|
|
6741
6836
|
const row = document.createElement('div');
|
|
6742
|
-
row.className = 'pz-file-row pz-file-
|
|
6837
|
+
row.className = 'pz-file-row pz-file-file';
|
|
6743
6838
|
row.setAttribute('role', 'button');
|
|
6744
6839
|
row.setAttribute('tabindex', '0');
|
|
6840
|
+
row.setAttribute('data-pz-file-path', node.path);
|
|
6841
|
+
const meta = fmtFileMeta(node);
|
|
6842
|
+
row.title = node.path + (meta ? ' (' + meta + ')' : '');
|
|
6843
|
+
row.innerHTML = '<span class="pz-file-caret"></span>'
|
|
6844
|
+
+ '<span class="pz-file-ic">📄</span>'
|
|
6845
|
+
+ '<span class="pz-file-name">' + escapeHtml(label) + '</span>'
|
|
6846
|
+
+ (meta ? '<span class="pz-file-meta">' + escapeHtml(meta) + '</span>' : '');
|
|
6847
|
+
/* PND-150 -- IDE semantics: single click SELECTS (highlight),
|
|
6848
|
+
* double click OPENS in the right surface (openInIde). */
|
|
6849
|
+
row.addEventListener('click', function () {
|
|
6850
|
+
const scope = row.closest('.pz-files-tree') || document;
|
|
6851
|
+
scope.querySelectorAll('.pz-file-row.selected').forEach(function (r) { r.classList.remove('selected'); });
|
|
6852
|
+
row.classList.add('selected');
|
|
6853
|
+
});
|
|
6854
|
+
row.addEventListener('dblclick', function () { openInIde(node.path, setFilesStatus); });
|
|
6855
|
+
return row;
|
|
6856
|
+
}
|
|
6857
|
+
|
|
6858
|
+
function renderNode(node) {
|
|
6859
|
+
const li = document.createElement('li');
|
|
6860
|
+
li.className = 'pz-file-li';
|
|
6745
6861
|
if (node.kind === 'dir') {
|
|
6862
|
+
const row = document.createElement('div');
|
|
6863
|
+
row.className = 'pz-file-row pz-file-dir';
|
|
6864
|
+
row.setAttribute('role', 'button');
|
|
6865
|
+
row.setAttribute('tabindex', '0');
|
|
6746
6866
|
const isOpen = expanded.has(node.path);
|
|
6867
|
+
const childCount = (node.children || []).length;
|
|
6747
6868
|
row.innerHTML = '<span class="pz-file-caret">' + (isOpen ? '▾' : '▸') + '</span>'
|
|
6748
6869
|
+ '<span class="pz-file-ic">📁</span>'
|
|
6749
|
-
+ '<span class="pz-file-name">' + escapeHtml(node.name) + '</span>'
|
|
6870
|
+
+ '<span class="pz-file-name">' + escapeHtml(node.name) + '</span>'
|
|
6871
|
+
+ '<span class="pz-file-meta">' + childCount + '</span>';
|
|
6750
6872
|
li.appendChild(row);
|
|
6751
6873
|
const childUl = document.createElement('ul');
|
|
6752
6874
|
childUl.className = 'pz-files-ul';
|
|
6753
6875
|
childUl.style.display = isOpen ? '' : 'none';
|
|
6754
|
-
(node.children || []).forEach(function (c) { childUl.appendChild(renderNode(c)); });
|
|
6876
|
+
sortChildren(node.children || []).forEach(function (c) { childUl.appendChild(renderNode(c)); });
|
|
6755
6877
|
li.appendChild(childUl);
|
|
6756
6878
|
row.addEventListener('click', function () {
|
|
6757
6879
|
const nowOpen = childUl.style.display === 'none';
|
|
@@ -6761,25 +6883,67 @@ function initFilesTab(it) {
|
|
|
6761
6883
|
if (nowOpen) expanded.add(node.path); else expanded.delete(node.path);
|
|
6762
6884
|
});
|
|
6763
6885
|
} else {
|
|
6764
|
-
|
|
6765
|
-
const sz = fmtFileSize(node.size);
|
|
6766
|
-
row.title = node.path + (sz ? ' (' + sz + ')' : '');
|
|
6767
|
-
row.innerHTML = '<span class="pz-file-caret"></span>'
|
|
6768
|
-
+ '<span class="pz-file-ic">📄</span>'
|
|
6769
|
-
+ '<span class="pz-file-name">' + escapeHtml(node.name) + '</span>';
|
|
6770
|
-
li.appendChild(row);
|
|
6771
|
-
/* PND-150 -- IDE semantics: single click SELECTS (highlight),
|
|
6772
|
-
* double click OPENS in the right surface (openInIde). */
|
|
6773
|
-
row.addEventListener('click', function () {
|
|
6774
|
-
const ul = row.closest('.pz-files-root') || row.parentNode;
|
|
6775
|
-
if (ul) ul.querySelectorAll('.pz-file-row.selected').forEach(function (r) { r.classList.remove('selected'); });
|
|
6776
|
-
row.classList.add('selected');
|
|
6777
|
-
});
|
|
6778
|
-
row.addEventListener('dblclick', function () { openInIde(node.path, setFilesStatus); });
|
|
6886
|
+
li.appendChild(makeFileRow(node, node.name));
|
|
6779
6887
|
}
|
|
6780
6888
|
return li;
|
|
6781
6889
|
}
|
|
6782
6890
|
|
|
6891
|
+
/* Flatten the tree to files matching name (substring of the path) + type
|
|
6892
|
+
* (substring of the extension). Either filter empty = ignored. */
|
|
6893
|
+
function collectMatches(node, nameQ, typeQ, acc) {
|
|
6894
|
+
if (!node) return;
|
|
6895
|
+
if (node.kind === 'file') {
|
|
6896
|
+
const pathOk = !nameQ || node.path.toLowerCase().indexOf(nameQ) !== -1;
|
|
6897
|
+
const typeOk = !typeQ || fileExt(node.name).indexOf(typeQ) !== -1;
|
|
6898
|
+
if (pathOk && typeOk) acc.push(node);
|
|
6899
|
+
return;
|
|
6900
|
+
}
|
|
6901
|
+
(node.children || []).forEach(function (c) { collectMatches(c, nameQ, typeQ, acc); });
|
|
6902
|
+
}
|
|
6903
|
+
|
|
6904
|
+
function normalizeType(v) {
|
|
6905
|
+
return String(v || '').trim().toLowerCase().replace(/^[.*]+/, ''); /* ".ts" / "*.ts" -> "ts" */
|
|
6906
|
+
}
|
|
6907
|
+
|
|
6908
|
+
function render() {
|
|
6909
|
+
if (!treeData) return;
|
|
6910
|
+
const nameQ = qEl ? String(qEl.value || '').trim().toLowerCase() : '';
|
|
6911
|
+
const typeQ = typeEl ? normalizeType(typeEl.value) : '';
|
|
6912
|
+
wrap.innerHTML = '';
|
|
6913
|
+
if (nameQ || typeQ) {
|
|
6914
|
+
/* Search mode: a flat, sorted list of matching files (full paths). */
|
|
6915
|
+
const matches = [];
|
|
6916
|
+
collectMatches(treeData, nameQ, typeQ, matches);
|
|
6917
|
+
matches.sort(cmpByKey);
|
|
6918
|
+
if (matches.length === 0) {
|
|
6919
|
+
wrap.textContent = (CONFIG.i18n && CONFIG.i18n.filesNoMatches) || 'Sin coincidencias';
|
|
6920
|
+
setFilesStatus('');
|
|
6921
|
+
return;
|
|
6922
|
+
}
|
|
6923
|
+
const ul = document.createElement('ul');
|
|
6924
|
+
ul.className = 'pz-files-ul pz-files-root pz-files-flat';
|
|
6925
|
+
matches.forEach(function (n) {
|
|
6926
|
+
const li = document.createElement('li');
|
|
6927
|
+
li.className = 'pz-file-li';
|
|
6928
|
+
li.appendChild(makeFileRow(n, n.path));
|
|
6929
|
+
ul.appendChild(li);
|
|
6930
|
+
});
|
|
6931
|
+
wrap.appendChild(ul);
|
|
6932
|
+
setFilesStatus(((CONFIG.i18n && CONFIG.i18n.filesMatches) || '{n} coincidencias').replace('{n}', matches.length));
|
|
6933
|
+
return;
|
|
6934
|
+
}
|
|
6935
|
+
/* Tree mode. */
|
|
6936
|
+
const rootUl = document.createElement('ul');
|
|
6937
|
+
rootUl.className = 'pz-files-ul pz-files-root';
|
|
6938
|
+
sortChildren(treeData.children || []).forEach(function (c) { rootUl.appendChild(renderNode(c)); });
|
|
6939
|
+
if (!treeData.children || treeData.children.length === 0) {
|
|
6940
|
+
wrap.textContent = (CONFIG.i18n && CONFIG.i18n.filesEmpty) || '(sin archivos)';
|
|
6941
|
+
return;
|
|
6942
|
+
}
|
|
6943
|
+
wrap.appendChild(rootUl);
|
|
6944
|
+
setFilesStatus('');
|
|
6945
|
+
}
|
|
6946
|
+
|
|
6783
6947
|
async function load() {
|
|
6784
6948
|
wrap.textContent = (CONFIG.i18n && CONFIG.i18n.filesLoading) || 'Cargando...';
|
|
6785
6949
|
setFilesStatus('');
|
|
@@ -6790,21 +6954,34 @@ function initFilesTab(it) {
|
|
|
6790
6954
|
wrap.textContent = (j && j.error) || ((CONFIG.i18n && CONFIG.i18n.filesError) || 'No pude leer los archivos.');
|
|
6791
6955
|
return;
|
|
6792
6956
|
}
|
|
6793
|
-
|
|
6794
|
-
|
|
6795
|
-
rootUl.className = 'pz-files-ul pz-files-root';
|
|
6796
|
-
(j.tree.children || []).forEach(function (c) { rootUl.appendChild(renderNode(c)); });
|
|
6797
|
-
if (!j.tree.children || j.tree.children.length === 0) {
|
|
6798
|
-
wrap.textContent = (CONFIG.i18n && CONFIG.i18n.filesEmpty) || '(sin archivos)';
|
|
6799
|
-
return;
|
|
6800
|
-
}
|
|
6801
|
-
wrap.appendChild(rootUl);
|
|
6957
|
+
treeData = j.tree;
|
|
6958
|
+
render();
|
|
6802
6959
|
if (j.truncated) setFilesStatus((CONFIG.i18n && CONFIG.i18n.filesTruncated) || '(lista truncada)');
|
|
6803
6960
|
} catch (e) {
|
|
6804
6961
|
wrap.textContent = (CONFIG.i18n && CONFIG.i18n.filesError) || 'No pude leer los archivos.';
|
|
6805
6962
|
}
|
|
6806
6963
|
}
|
|
6807
6964
|
|
|
6965
|
+
let _searchTimer = null;
|
|
6966
|
+
function onSearchInput() {
|
|
6967
|
+
if (_searchTimer) clearTimeout(_searchTimer);
|
|
6968
|
+
_searchTimer = setTimeout(render, 120); /* debounce so typing stays smooth */
|
|
6969
|
+
}
|
|
6970
|
+
if (qEl && !qEl._wired) { qEl._wired = true; qEl.addEventListener('input', onSearchInput); }
|
|
6971
|
+
if (typeEl && !typeEl._wired) { typeEl._wired = true; typeEl.addEventListener('input', onSearchInput); }
|
|
6972
|
+
if (sortEl && !sortEl._wired) {
|
|
6973
|
+
sortEl._wired = true;
|
|
6974
|
+
sortEl.addEventListener('change', function () { sortKey = sortEl.value || 'name'; render(); });
|
|
6975
|
+
}
|
|
6976
|
+
if (dirEl && !dirEl._wired) {
|
|
6977
|
+
dirEl._wired = true;
|
|
6978
|
+
dirEl.addEventListener('click', function () {
|
|
6979
|
+
sortDir = -sortDir;
|
|
6980
|
+
dirEl.innerHTML = sortDir === 1 ? '▲' : '▼'; /* up / down triangle */
|
|
6981
|
+
render();
|
|
6982
|
+
});
|
|
6983
|
+
}
|
|
6984
|
+
|
|
6808
6985
|
if (refreshBtn && !refreshBtn._wired) {
|
|
6809
6986
|
refreshBtn._wired = true;
|
|
6810
6987
|
refreshBtn.addEventListener('click', load);
|
|
@@ -10276,17 +10453,44 @@ async function ingestSpecFile(file) {
|
|
|
10276
10453
|
return;
|
|
10277
10454
|
}
|
|
10278
10455
|
const ing = data.ingested || {};
|
|
10456
|
+
const fmt = String(ing.format || '').toLowerCase();
|
|
10457
|
+
const isExcel = /xlsx|xls|csv|ods/.test(fmt);
|
|
10458
|
+
const isWord = /docx|doc|odt|rtf/.test(fmt);
|
|
10459
|
+
const isPdf = /pdf/.test(fmt);
|
|
10460
|
+
const unit = isExcel ? 'hoja' : 'seccion';
|
|
10279
10461
|
const lines = [
|
|
10280
|
-
'Le1
|
|
10462
|
+
'Adjunto recibido y parseado (Le1).',
|
|
10281
10463
|
'Titulo: ' + (ing.title || '(sin titulo)'),
|
|
10282
|
-
'Formato: ' + ing.format + ' / ' + ing.sections + ' seccion(es) / ' + Math.round(ing.bytes / 1024) + ' KB',
|
|
10464
|
+
'Formato: ' + ing.format + ' / ' + ing.sections + ' ' + (isExcel ? 'hoja(s)' : 'seccion(es)') + ' / ' + Math.round(ing.bytes / 1024) + ' KB',
|
|
10283
10465
|
];
|
|
10466
|
+
if (ing.section_names && ing.section_names.length > 0) {
|
|
10467
|
+
lines.push((isExcel ? 'Hojas' : 'Secciones') + ' (' + ing.section_names.length + '): ' + ing.section_names.join(' | '));
|
|
10468
|
+
}
|
|
10284
10469
|
if (ing.first_paragraphs && ing.first_paragraphs.length > 0) {
|
|
10285
|
-
lines.push('
|
|
10470
|
+
lines.push('Muestra (solo la 1a ' + unit + '):');
|
|
10286
10471
|
for (const p of ing.first_paragraphs) {
|
|
10287
10472
|
lines.push(' - ' + p.slice(0, 160) + (p.length > 160 ? '...' : ''));
|
|
10288
10473
|
}
|
|
10289
10474
|
}
|
|
10475
|
+
/* PND-153 -- the digest above is only a SAMPLE of the first section.
|
|
10476
|
+
Point the brain at the real file on disk + the exact reader call so
|
|
10477
|
+
it reads the full content of ANY sheet, instead of asking the user
|
|
10478
|
+
to re-upload (which it cannot see because attachments were never
|
|
10479
|
+
persisted before). */
|
|
10480
|
+
if (ing.source_path) {
|
|
10481
|
+
lines.push('Archivo guardado en disco: ' + ing.source_path);
|
|
10482
|
+
if (isExcel) {
|
|
10483
|
+
lines.push('IMPORTANTE: lo de arriba es solo una muestra de la 1a hoja. Para analizar una hoja COMPLETA (p.ej. otra distinta a la primera) usa office.excel.read({path:"' + ing.source_path + '", sheet:"<nombre exacto de la hoja>"}). El archivo YA esta en disco en esa ruta: NO pidas al usuario que lo vuelva a subir.');
|
|
10484
|
+
} else if (isWord) {
|
|
10485
|
+
lines.push('IMPORTANTE: para leer el contenido completo usa office.word.read({path:"' + ing.source_path + '"}). El archivo YA esta en disco: NO pidas re-subirlo.');
|
|
10486
|
+
} else if (isPdf) {
|
|
10487
|
+
lines.push('IMPORTANTE: para leer el contenido completo usa office.pdf.read({path:"' + ing.source_path + '"}). El archivo YA esta en disco: NO pidas re-subirlo.');
|
|
10488
|
+
} else {
|
|
10489
|
+
lines.push('El archivo YA esta en disco en esa ruta; leelo con la tool apropiada segun su tipo. NO pidas re-subirlo.');
|
|
10490
|
+
}
|
|
10491
|
+
} else {
|
|
10492
|
+
lines.push('(Nota: solo se pudo conservar un resumen de la 1a ' + unit + '; el archivo no se guardo en disco en este entorno, asi que el resto del contenido no es accesible por las tools.)');
|
|
10493
|
+
}
|
|
10290
10494
|
/* Record as a synthetic tool round in the trace so the
|
|
10291
10495
|
pizarra reflects the ingest action. */
|
|
10292
10496
|
state.toolHistory.push({
|