@things-factory/learning 10.1.264 → 10.1.266
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,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { openPdf } from '@operato/utils/pdf-loader.js';
|
|
2
|
+
import { drawPdfPage, isScannedPage, pdfPageText } from '@things-factory/ai-assistant/dist-client/index.js';
|
|
2
3
|
/** Complete captions, never a guessed transcript from the video's name or a few sampled frames. */
|
|
3
4
|
export function captionParts(text) {
|
|
4
5
|
const clean = text.replace(/^\uFEFF/, '').trim();
|
|
@@ -34,8 +35,7 @@ export async function pdfMaterial(fileId, url, signal) {
|
|
|
34
35
|
const blob = await response.blob();
|
|
35
36
|
if (blob.size > 50 * 1024 * 1024)
|
|
36
37
|
throw new Error('learning-ai-source-limit');
|
|
37
|
-
const
|
|
38
|
-
const loading = pdfjs.getDocument({ data: new Uint8Array(await blob.arrayBuffer()) });
|
|
38
|
+
const loading = await openPdf(new Uint8Array(await blob.arrayBuffer()));
|
|
39
39
|
const abort = () => { void loading.destroy(); };
|
|
40
40
|
signal.addEventListener('abort', abort, { once: true });
|
|
41
41
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"material-source.js","sourceRoot":"","sources":["../../client/utils/material-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"material-source.js","sourceRoot":"","sources":["../../client/utils/material-source.ts"],"names":[],"mappings":"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","sourcesContent":["import { openPdf } from '@operato/utils/pdf-loader.js'\nimport { drawPdfPage, isScannedPage, pdfPageText } from '@things-factory/ai-assistant/dist-client/index.js'\n\nexport type MaterialPart = { id: string; text?: string; image?: string }\nexport type MaterialSource = { fileId: string; parts: MaterialPart[] }\n\n/** Complete captions, never a guessed transcript from the video's name or a few sampled frames. */\nexport function captionParts(text: string): MaterialPart[] {\n const clean = text.replace(/^\\uFEFF/, '').trim()\n if (!clean || clean.length > 120_000) throw new Error('learning-ai-source-limit')\n // Keep timestamps and cue order as evidence. Plain transcripts are also accepted, explicitly supplied by the manager.\n const blocks = clean.split(/\\r?\\n\\s*\\r?\\n/).filter(s => s.trim() && s.trim() !== 'WEBVTT')\n const parts: MaterialPart[] = []\n let current = ''\n for (const block of blocks) {\n if (current && current.length + block.length > 8000) { parts.push({ id: `caption-${parts.length + 1}`, text: current }); current = '' }\n current += (current ? '\\n\\n' : '') + block\n }\n if (current) parts.push({ id: `caption-${parts.length + 1}`, text: current })\n if (!parts.length || parts.length > 80) throw new Error('learning-ai-source-limit')\n return parts\n}\n\nconst blobData = (blob: Blob): Promise<string> => new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => resolve(String(reader.result))\n reader.onerror = () => reject(reader.error)\n reader.readAsDataURL(blob)\n})\n\nexport async function pdfMaterial(fileId: string, url: string, signal: AbortSignal): Promise<MaterialSource> {\n const response = await fetch(url, { credentials: 'include', signal })\n if (!response.ok) throw new Error('learning-ai-source-read')\n const blob = await response.blob()\n if (blob.size > 50 * 1024 * 1024) throw new Error('learning-ai-source-limit')\n const loading = await openPdf(new Uint8Array(await blob.arrayBuffer()))\n const abort = () => { void loading.destroy() }\n signal.addEventListener('abort', abort, { once: true })\n try {\n if (signal.aborted) throw new Error('learning-ai-source-read')\n const pdf = await loading.promise\n if (!pdf.numPages || pdf.numPages > 80) throw new Error('learning-ai-source-limit')\n const parts: MaterialPart[] = []\n let chars = 0, scans = 0, imageChars = 0\n for (let n = 1; n <= pdf.numPages; n++) {\n if (signal.aborted) throw new Error('learning-ai-source-read')\n const page = await pdf.getPage(n)\n const text = pdfPageText((await page.getTextContent()).items)\n if (isScannedPage(text)) {\n if (++scans > 12) throw new Error('learning-ai-source-limit')\n const image = await blobData(await drawPdfPage(pdf, n))\n imageChars += image.length\n if (imageChars > 8_000_000) throw new Error('learning-ai-source-limit')\n parts.push({ id: `page-${n}`, image })\n } else {\n chars += text.length\n if (chars > 120_000) throw new Error('learning-ai-source-limit')\n parts.push({ id: `page-${n}`, text })\n }\n }\n return { fileId, parts }\n } finally { signal.removeEventListener('abort', abort); await loading.destroy() }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@things-factory/learning",
|
|
3
|
-
"version": "10.1.
|
|
3
|
+
"version": "10.1.266",
|
|
4
4
|
"main": "dist-server/index.js",
|
|
5
5
|
"browser": "dist-client/index.js",
|
|
6
6
|
"things-factory": true,
|
|
@@ -33,27 +33,27 @@
|
|
|
33
33
|
"@operato/i18n": "^10.0.0",
|
|
34
34
|
"@operato/input": "^10.29.52",
|
|
35
35
|
"@operato/layout": "^10.29.49",
|
|
36
|
-
"@operato/learning": "^10.29.
|
|
36
|
+
"@operato/learning": "^10.29.76",
|
|
37
37
|
"@operato/list-state": "^10.29.39",
|
|
38
38
|
"@operato/popup": "^10.29.39",
|
|
39
39
|
"@operato/shell": "^10.29.69",
|
|
40
40
|
"@operato/styles": "^10.29.1",
|
|
41
|
-
"@operato/utils": "^10.
|
|
42
|
-
"@things-factory/ai-assistant": "^10.1.
|
|
43
|
-
"@things-factory/ai-client-base": "^10.1.
|
|
44
|
-
"@things-factory/announcement": "^10.1.
|
|
45
|
-
"@things-factory/attachment-base": "^10.1.
|
|
46
|
-
"@things-factory/auth-base": "^10.1.
|
|
41
|
+
"@operato/utils": "^10.29.76",
|
|
42
|
+
"@things-factory/ai-assistant": "^10.1.265",
|
|
43
|
+
"@things-factory/ai-client-base": "^10.1.265",
|
|
44
|
+
"@things-factory/announcement": "^10.1.265",
|
|
45
|
+
"@things-factory/attachment-base": "^10.1.265",
|
|
46
|
+
"@things-factory/auth-base": "^10.1.265",
|
|
47
47
|
"@things-factory/env": "^10.1.149",
|
|
48
|
-
"@things-factory/i18n-base": "^10.1.
|
|
49
|
-
"@things-factory/notification": "^10.1.
|
|
50
|
-
"@things-factory/organization": "^10.1.
|
|
51
|
-
"@things-factory/pdf": "^10.1.
|
|
52
|
-
"@things-factory/shell": "^10.1.
|
|
53
|
-
"@things-factory/worklist": "^10.1.
|
|
48
|
+
"@things-factory/i18n-base": "^10.1.265",
|
|
49
|
+
"@things-factory/notification": "^10.1.265",
|
|
50
|
+
"@things-factory/organization": "^10.1.265",
|
|
51
|
+
"@things-factory/pdf": "^10.1.265",
|
|
52
|
+
"@things-factory/shell": "^10.1.265",
|
|
53
|
+
"@things-factory/worklist": "^10.1.266",
|
|
54
54
|
"graphql-tag": "^2.12.6",
|
|
55
55
|
"graphql-upload": "^15.0.2",
|
|
56
56
|
"lit": "^3.1.2"
|
|
57
57
|
},
|
|
58
|
-
"gitHead": "
|
|
58
|
+
"gitHead": "7c28fbc4a3a031d804a16708143da1b0afd19200"
|
|
59
59
|
}
|