sygal-cli 0.5.3 → 0.5.5

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/CHANGELOG.md CHANGED
@@ -9,10 +9,10 @@ partagent toujours le même numéro de version, publiés ensemble, même si un
9
9
  seul a réellement changé de contenu — même principe que l'app desktop.
10
10
  Détails du process : `CLI_RELEASE_GUIDE.md` à la racine du repo.
11
11
 
12
- ## 0.5.2
12
+ ## 0.5.3
13
13
 
14
14
  - Aucun changement fonctionnel côté CLI/sidecars : bump lockstep pour rester
15
- aligné avec la version de l'app desktop (1.5.2).
15
+ aligné avec la version de l'app desktop (1.5.3).
16
16
 
17
17
  ## 0.5.1
18
18
 
package/dist/index.js CHANGED
@@ -1522,8 +1522,31 @@ function buildJsonEnvelope(doc) {
1522
1522
  function serializeJsonExport(doc) {
1523
1523
  return JSON.stringify(buildJsonEnvelope(doc), null, 2);
1524
1524
  }
1525
+ var ILLEGAL_FILENAME_CHARS = /[\\/:*?"<>|\x00-\x1f]/g;
1526
+ function sanitizeFilename(name) {
1527
+ return name.replace(ILLEGAL_FILENAME_CHARS, " ").replace(/\s+/g, " ").trim();
1528
+ }
1529
+ var MAX_FILENAME_BYTES = 255;
1530
+ var RESERVED_SUFFIX_BYTES = 11;
1531
+ var encoder = new TextEncoder();
1532
+ function truncateToByteLength(name, maxBytes) {
1533
+ if (encoder.encode(name).length <= maxBytes) return name;
1534
+ let result = "";
1535
+ let bytes = 0;
1536
+ for (const char of name) {
1537
+ const charBytes = encoder.encode(char).length;
1538
+ if (bytes + charBytes > maxBytes) break;
1539
+ result += char;
1540
+ bytes += charBytes;
1541
+ }
1542
+ return result.trim();
1543
+ }
1525
1544
  async function resolveCollisionPath(dir, stem, ext) {
1526
- const candidate = (n2) => (0, import_node_path3.join)(dir, n2 === 0 ? `${stem}${ext}` : `${stem} (${n2})${ext}`);
1545
+ const safeStem = truncateToByteLength(
1546
+ sanitizeFilename(stem),
1547
+ MAX_FILENAME_BYTES - RESERVED_SUFFIX_BYTES
1548
+ );
1549
+ const candidate = (n2) => (0, import_node_path3.join)(dir, n2 === 0 ? `${safeStem}${ext}` : `${safeStem} (${n2})${ext}`);
1527
1550
  let n = 0;
1528
1551
  while (n < 999) {
1529
1552
  try {
@@ -1709,6 +1732,7 @@ var CONVERSION_CODE_MAP = {
1709
1732
  TRANSLATION_INCOHERENT: "translation_incoherent",
1710
1733
  URL_FORBIDDEN: "url_forbidden",
1711
1734
  URL_UNREACHABLE: "url_unreachable",
1735
+ URL_EMPTY_CONTENT: "url_empty_content",
1712
1736
  HEIC_HEVC_UNSUPPORTED: "heic_hevc_unsupported",
1713
1737
  IMAGE_DECODE_UNSUPPORTED: "image_decode_unsupported",
1714
1738
  UNKNOWN: "unknown"
@@ -1741,6 +1765,8 @@ function toCliError(err) {
1741
1765
  return { code: "url_forbidden", message: err.message };
1742
1766
  case "URL_UNREACHABLE":
1743
1767
  return { code: "url_unreachable", message: err.message };
1768
+ case "URL_EMPTY_CONTENT":
1769
+ return { code: "url_empty_content", message: err.message };
1744
1770
  default:
1745
1771
  return { code: "conversion_failed", message: err.message };
1746
1772
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sygal-cli",
3
- "version": "0.5.3",
3
+ "version": "0.5.5",
4
4
  "description": "Sygal CLI - convert files and web pages to Markdown/JSON (local MarkItDown pipeline, OCR for images)",
5
5
  "author": "Cyrill Semah",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -37,9 +37,9 @@
37
37
  "@sygal/core": "0.1.0"
38
38
  },
39
39
  "optionalDependencies": {
40
- "@sygal/sidecar-darwin-arm64": "0.5.3",
41
- "@sygal/sidecar-win32-x64": "0.5.3",
42
- "@sygal/sidecar-linux-x64": "0.5.3"
40
+ "@sygal/sidecar-win32-x64": "0.5.5",
41
+ "@sygal/sidecar-darwin-arm64": "0.5.5",
42
+ "@sygal/sidecar-linux-x64": "0.5.5"
43
43
  },
44
44
  "scripts": {
45
45
  "build": "esbuild src/index.ts --bundle --platform=node --target=node20 --format=cjs --outfile=dist/index.js --external:sharp --external:gpt-tokenizer --external:commander --external:picocolors",