@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.
@@ -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":"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"}
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":"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"}
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;AAuEzB;;qDAEqD;AACrD,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,GAAG,IAAI,CAAC;AAE3C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAyB,CAAC;AAElD;;kEAEkE;AAElE,IAAI,iBAAiB,GAAkB,IAAI,CAAC;AAE5C,MAAM,UAAU,uBAAuB,CAAC,IAAmB;IACzD,iBAAiB,GAAG,IAAI,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B;;;kFAG8E;IAC9E,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1D,IAAI,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC3D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;IACzE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,UAAU;IACjB,IAAI,CAAC,iBAAiB;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,iBAAiB,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,8DAA8D;IAC9D,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,GAAG,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,gBAAgB,CAAC,CAAgB;IACxC;+DAC2D;IAC3D,MAAM,KAAK,GAA4B;QACrC,MAAM,EAAO,CAAC,CAAC,MAAM;QACrB,GAAG,EAAU,CAAC,CAAC,GAAG;QAClB,SAAS,EAAI,CAAC,CAAC,SAAS;QACxB,WAAW,EAAE,CAAC,CAAC,WAAW;KAC3B,CAAC;IACF,IAAI,CAAC,CAAC,UAAU;QAAE,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;IAClD,IAAI,CAAC,CAAC,IAAI;QAAQ,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;IACtC,IAAI,CAAC,CAAC,QAAQ;QAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;IAC9C,IAAI,CAAC,CAAC,WAAW;QAAE,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC;IACrD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,CAAgB;IAC5C,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,CAAC,IAAI;QAAE,OAAO;IAClB,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG,IAAI,GAAG,MAAM,CAAC;IAC1B,MAAM,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACtD;;6CAEyC;IACzC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;IACpE,MAAM,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACnC,CAAC;AAED;;;;;uCAKuC;AACvC,MAAM,cAAc,GAA+B,IAAI,GAAG,EAAE,CAAC;AAE7D;;;gCAGgC;AAChC,SAAS,YAAY,CAAC,CAAgB;IACpC,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAC/D;;mEAE+D;IAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAkB,CAAC;IAClE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACnE,IAAI,CAAC;YACH,OAAO,CAAC,KAAK,CAAC,qCAAqC,GAAG,CAAC,CAAC,MAAM,GAAG,IAAI;kBACjE,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC;QAAC,MAAM,CAAC,CAAC,0CAA0C,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IACH,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACnC;oEACgE;IAChE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;QAChB,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI;YAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;8BAG8B;AAC9B,MAAM,CAAC,KAAK,UAAU,wBAAwB;IAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;IACrD,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AACrC,CAAC;AAED;;;wCAGwC;AACxC,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAY;IACnD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,IAAI,CAAC,CAAC;IAC/C,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO;QAC7D,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,SAAS;QACnC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAkB,CAAC;YAChD,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAChD,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,0DAA0D;QAC5D,CAAC;IACH,CAAC;AACH,CAAC;AAGD,6DAA6D;AAC7D,MAAM,UAAU,eAAe,CAAC,GAAuB;IACrD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC7B,IAAI,CAAC,CAAC,OAAO;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;QAC7C,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YACzB,IAAI,MAAM,IAAI,CAAC,IAAI,OAAQ,CAAsB,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACpE,KAAK,CAAC,IAAI,CAAE,CAAsB,CAAC,IAAI,CAAC,CAAC;YAC3C,CAAC;iBAAM,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;gBAC1B,KAAK,CAAC,IAAI,CAAC,GAAG,GAAI,CAAsB,CAAC,IAAI,GAAG,IAAI;sBAC/C,CAAyB,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,MAAM,CAAC,MAAM,IAAI,iBAAiB,EAAE,CAAC;QACvC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC5C,CAAC;IACD,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,GAAG,mCAAmC,GAAG,MAAM,CAAC,MAAM,GAAG,SAAS;QAC1G,SAAS,EAAE,IAAI;KAChB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAuB;IAClD,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,OAAO,GAAkB;QAC7B,MAAM,EAAE,GAAG,CAAC,EAAE;QACd,GAAG;QACH,SAAS,EAAE,IAAI,CAAC,IAAI;QACpB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACtC,CAAC;IACF,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAC9B,YAAY,CAAC,OAAO,CAAC,CAAC;IACtB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,OAAO,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;AACrC,CAAC;AAED;;;;;;2DAM2D;AAC3D,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAa,EAAE,QAAgB,EAAE,MAAc;IACpF,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACrD,iEAAiE;IACjE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,GAAG,GAAG,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACrH,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,GAAG,GAAG,CAAC,CAAC;IAC3C,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,MAAM,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC,WAAW,GAAG,MAAM,CAAC;IACvB,YAAY,CAAC,CAAC,CAAC,CAAC;IAChB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,UAA0B;IACrE,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,GAAG,KAAK,CAAC,CAAC;IACnE,CAAC,CAAC,UAAU,GAAG,UAAU,CAAC;IAC1B,YAAY,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAa,EAAE,IAAuC;IAC5E,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,GAAG,KAAK,CAAC,CAAC;IACnE,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;IACd,YAAY,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,MAAmD;IAC5F,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,GAAG,KAAK,CAAC,CAAC;IACnE,CAAC,CAAC,QAAQ,GAAG,MAAM,CAAC;IACpB,YAAY,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,GAAG,KAAK,CAAC,CAAC;IACnE,OAAO,CAAC,CAAC,QAAQ,CAAC;IAClB,YAAY,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/C,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK;QAClB,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM;QACpB,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,cAAc,EAAE,CAAC,CAAC,UAAU,KAAK,SAAS;QAC1C,QAAQ,EAAE,CAAC,CAAC,IAAI,KAAK,SAAS;QAC9B,YAAY,EAAE,CAAC,CAAC,QAAQ,KAAK,SAAS;KACvC,CAAC,CAAC,CAAC;AACN,CAAC;AAED,iBAAiB;AACjB,MAAM,UAAU,oBAAoB;IAClC,QAAQ,CAAC,KAAK,EAAE,CAAC;AACnB,CAAC"}
@@ -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,CAooYxD"}
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"}
@@ -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>' + escapeHtml((CONFIG.i18n && CONFIG.i18n.filesRefresh) || 'Actualizar') + '</button>'
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 + '">&#9650;</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
- function renderNode(node) {
6739
- const li = document.createElement('li');
6740
- li.className = 'pz-file-li';
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-' + (node.kind === 'dir' ? 'dir' : '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">&#128196;</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 ? '&#9662;' : '&#9656;') + '</span>'
6748
6869
  + '<span class="pz-file-ic">&#128193;</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
- row.setAttribute('data-pz-file-path', node.path);
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">&#128196;</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
- wrap.innerHTML = '';
6794
- const rootUl = document.createElement('ul');
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 ? '&#9650;' : '&#9660;'; /* 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: leida.',
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('Primeras lineas:');
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({