@promptbook/pdf 0.100.1 โ 0.100.2
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/esm/index.es.js +54 -19
- package/esm/index.es.js.map +1 -1
- package/esm/typings/src/book-2.0/agent-source/parseAgentSource.d.ts +2 -2
- package/esm/typings/src/book-2.0/commitments/_base/CommitmentDefinition.d.ts +2 -2
- package/esm/typings/src/book-2.0/commitments/_misc/AgentModelRequirements.d.ts +2 -2
- package/esm/typings/src/book-2.0/commitments/_misc/AgentSourceParseResult.d.ts +2 -2
- package/esm/typings/src/book-2.0/commitments/_misc/ParsedCommitment.d.ts +2 -2
- package/esm/typings/src/execution/utils/validatePromptResult.d.ts +4 -4
- package/esm/typings/src/utils/take/interfaces/ITakeChain.d.ts +2 -2
- package/esm/typings/src/utils/validators/filePath/isValidFilePath.d.ts +1 -1
- package/esm/typings/src/version.d.ts +1 -1
- package/esm/typings/src/wizard/wizard.d.ts +2 -2
- package/package.json +2 -2
- package/umd/index.umd.js +53 -18
- package/umd/index.umd.js.map +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { string_agent_name } from '../../types/typeAliases';
|
|
2
2
|
import type { string_url_image } from '../../types/typeAliases';
|
|
3
3
|
import type { string_book } from './string_book';
|
|
4
|
-
export
|
|
4
|
+
export type AgentBasicInformation = {
|
|
5
5
|
/**
|
|
6
6
|
* Name of the agent
|
|
7
7
|
* This is the first line of the agent source
|
|
@@ -17,7 +17,7 @@ export interface AgentBasicInformation {
|
|
|
17
17
|
* This is the line starting with "META IMAGE"
|
|
18
18
|
*/
|
|
19
19
|
profileImageUrl: string_url_image;
|
|
20
|
-
}
|
|
20
|
+
};
|
|
21
21
|
/**
|
|
22
22
|
* Parses basic information from agent source
|
|
23
23
|
*
|
|
@@ -6,7 +6,7 @@ import type { AgentModelRequirements } from '../_misc/AgentModelRequirements';
|
|
|
6
6
|
* - Creating regex patterns for parsing
|
|
7
7
|
* - Applying its effects to agent model requirements
|
|
8
8
|
*/
|
|
9
|
-
export
|
|
9
|
+
export type CommitmentDefinition = {
|
|
10
10
|
/**
|
|
11
11
|
* The type/name of this commitment (e.g., 'PERSONA', 'KNOWLEDGE', etc.)
|
|
12
12
|
*/
|
|
@@ -45,4 +45,4 @@ export interface CommitmentDefinition {
|
|
|
45
45
|
* @returns Updated agent model requirements
|
|
46
46
|
*/
|
|
47
47
|
applyToAgentModelRequirements(requirements: AgentModelRequirements, content: string): AgentModelRequirements;
|
|
48
|
-
}
|
|
48
|
+
};
|
|
@@ -4,7 +4,7 @@ import type { TODO_any } from '../../../utils/organization/TODO_any';
|
|
|
4
4
|
*
|
|
5
5
|
* This is like "compiled" version of agent source
|
|
6
6
|
*/
|
|
7
|
-
export
|
|
7
|
+
export type AgentModelRequirements = {
|
|
8
8
|
/**
|
|
9
9
|
* The system message that defines the agent's behavior and personality
|
|
10
10
|
*/
|
|
@@ -34,4 +34,4 @@ export interface AgentModelRequirements {
|
|
|
34
34
|
* Each commitment can store its own data here
|
|
35
35
|
*/
|
|
36
36
|
readonly metadata?: Record<string, TODO_any>;
|
|
37
|
-
}
|
|
37
|
+
};
|
|
@@ -2,7 +2,7 @@ import type { ParsedCommitment } from './ParsedCommitment';
|
|
|
2
2
|
/**
|
|
3
3
|
* Result of parsing agent source for commitments
|
|
4
4
|
*/
|
|
5
|
-
export
|
|
5
|
+
export type AgentSourceParseResult = {
|
|
6
6
|
/**
|
|
7
7
|
* The agent name (first line)
|
|
8
8
|
*/
|
|
@@ -15,4 +15,4 @@ export interface AgentSourceParseResult {
|
|
|
15
15
|
* Lines that are not commitments (for system message)
|
|
16
16
|
*/
|
|
17
17
|
nonCommitmentLines: string[];
|
|
18
|
-
}
|
|
18
|
+
};
|
|
@@ -2,7 +2,7 @@ import type { BookCommitment } from '../_base/BookCommitment';
|
|
|
2
2
|
/**
|
|
3
3
|
* Parsed commitment line from agent source
|
|
4
4
|
*/
|
|
5
|
-
export
|
|
5
|
+
export type ParsedCommitment = {
|
|
6
6
|
/**
|
|
7
7
|
* The commitment type (e.g., 'PERSONA', 'KNOWLEDGE')
|
|
8
8
|
*/
|
|
@@ -19,4 +19,4 @@ export interface ParsedCommitment {
|
|
|
19
19
|
* Line number in the agent source (1-based)
|
|
20
20
|
*/
|
|
21
21
|
lineNumber: number;
|
|
22
|
-
}
|
|
22
|
+
};
|
|
@@ -5,7 +5,7 @@ import type { string_postprocessing_function_name } from '../../types/typeAliase
|
|
|
5
5
|
/**
|
|
6
6
|
* Options for validating a prompt result
|
|
7
7
|
*/
|
|
8
|
-
export
|
|
8
|
+
export type ValidatePromptResultOptions = {
|
|
9
9
|
/**
|
|
10
10
|
* The result string to validate
|
|
11
11
|
*/
|
|
@@ -23,11 +23,11 @@ export interface ValidatePromptResultOptions {
|
|
|
23
23
|
* Note: This is for validation purposes only - postprocessing should be done before calling this function
|
|
24
24
|
*/
|
|
25
25
|
postprocessingFunctionNames?: ReadonlyArray<string_postprocessing_function_name>;
|
|
26
|
-
}
|
|
26
|
+
};
|
|
27
27
|
/**
|
|
28
28
|
* Result of prompt result validation
|
|
29
29
|
*/
|
|
30
|
-
export
|
|
30
|
+
export type ValidatePromptResultResult = {
|
|
31
31
|
/**
|
|
32
32
|
* Whether the result is valid (passes all expectations and format checks)
|
|
33
33
|
*/
|
|
@@ -40,7 +40,7 @@ export interface ValidatePromptResultResult {
|
|
|
40
40
|
* Error that occurred during validation, if any
|
|
41
41
|
*/
|
|
42
42
|
error?: ExpectError;
|
|
43
|
-
}
|
|
43
|
+
};
|
|
44
44
|
/**
|
|
45
45
|
* Validates a prompt result against expectations and format requirements.
|
|
46
46
|
* This function provides a common abstraction for result validation that can be used
|
|
@@ -6,7 +6,7 @@ import type { Takeable } from './Takeable';
|
|
|
6
6
|
* @deprecated [๐คก] Use some better functional library instead of `TakeChain`
|
|
7
7
|
*/
|
|
8
8
|
export type WithTake<TValue extends Takeable> = TValue & ITakeChain<TValue>;
|
|
9
|
-
export
|
|
9
|
+
export type ITakeChain<TValue extends Takeable> = {
|
|
10
10
|
readonly value: TValue;
|
|
11
11
|
then<TResultValue extends Takeable>(callback: (value: TValue) => TResultValue): WithTake<TResultValue>;
|
|
12
|
-
}
|
|
12
|
+
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { string_filename } from '../../../types/typeAliases';
|
|
2
2
|
import type { really_unknown } from '../../organization/really_unknown';
|
|
3
3
|
/**
|
|
4
|
-
* Tests if given string is valid
|
|
4
|
+
* Tests if given string is valid file path.
|
|
5
5
|
*
|
|
6
6
|
* Note: This does not check if the file exists only if the path is valid
|
|
7
7
|
* @public exported from `@promptbook/utils`
|
|
@@ -15,7 +15,7 @@ export declare const BOOK_LANGUAGE_VERSION: string_semantic_version;
|
|
|
15
15
|
export declare const PROMPTBOOK_ENGINE_VERSION: string_promptbook_version;
|
|
16
16
|
/**
|
|
17
17
|
* Represents the version string of the Promptbook engine.
|
|
18
|
-
* It follows semantic versioning (e.g., `0.100.
|
|
18
|
+
* It follows semantic versioning (e.g., `0.100.1`).
|
|
19
19
|
*
|
|
20
20
|
* @generated
|
|
21
21
|
*/
|
|
@@ -9,12 +9,12 @@ import type { string_pipeline_url } from '../types/typeAliases';
|
|
|
9
9
|
/**
|
|
10
10
|
* Options for wizard methods
|
|
11
11
|
*/
|
|
12
|
-
|
|
12
|
+
type WizardOptions = {
|
|
13
13
|
/**
|
|
14
14
|
* Whether to enable verbose logging
|
|
15
15
|
*/
|
|
16
16
|
isVerbose?: boolean;
|
|
17
|
-
}
|
|
17
|
+
};
|
|
18
18
|
/**
|
|
19
19
|
* Wizard for simple usage of the Promptbook
|
|
20
20
|
* Look at `wizard` for more details
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@promptbook/pdf",
|
|
3
|
-
"version": "0.100.
|
|
3
|
+
"version": "0.100.2",
|
|
4
4
|
"description": "Promptbook: Run AI apps in plain human language across multiple models and platforms",
|
|
5
5
|
"private": false,
|
|
6
6
|
"sideEffects": false,
|
|
@@ -94,7 +94,7 @@
|
|
|
94
94
|
"module": "./esm/index.es.js",
|
|
95
95
|
"typings": "./esm/typings/src/_packages/pdf.index.d.ts",
|
|
96
96
|
"peerDependencies": {
|
|
97
|
-
"@promptbook/core": "0.100.
|
|
97
|
+
"@promptbook/core": "0.100.2"
|
|
98
98
|
},
|
|
99
99
|
"dependencies": {
|
|
100
100
|
"crypto": "1.0.1",
|
package/umd/index.umd.js
CHANGED
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
* @generated
|
|
27
27
|
* @see https://github.com/webgptorg/promptbook
|
|
28
28
|
*/
|
|
29
|
-
const PROMPTBOOK_ENGINE_VERSION = '0.100.
|
|
29
|
+
const PROMPTBOOK_ENGINE_VERSION = '0.100.2';
|
|
30
30
|
/**
|
|
31
31
|
* TODO: string_promptbook_version should be constrained to the all versions of Promptbook engine
|
|
32
32
|
* Note: [๐] Ignore a discrepancy between file name and entity name
|
|
@@ -721,7 +721,7 @@
|
|
|
721
721
|
}
|
|
722
722
|
|
|
723
723
|
/**
|
|
724
|
-
* Tests if given string is valid
|
|
724
|
+
* Tests if given string is valid file path.
|
|
725
725
|
*
|
|
726
726
|
* Note: This does not check if the file exists only if the path is valid
|
|
727
727
|
* @public exported from `@promptbook/utils`
|
|
@@ -733,18 +733,25 @@
|
|
|
733
733
|
if (filename.split('\n').length > 1) {
|
|
734
734
|
return false;
|
|
735
735
|
}
|
|
736
|
-
|
|
737
|
-
|
|
736
|
+
// Normalize slashes early so heuristics can detect path-like inputs
|
|
737
|
+
const filenameSlashes = filename.replace(/\\/g, '/');
|
|
738
|
+
// Reject strings that look like sentences (informational text)
|
|
739
|
+
// Heuristic: contains multiple spaces and ends with a period, or contains typical sentence punctuation
|
|
740
|
+
// But skip this heuristic if the string looks like a path (contains '/' or starts with a drive letter)
|
|
741
|
+
if (filename.trim().length > 60 && // long enough to be a sentence
|
|
742
|
+
/[.!?]/.test(filename) && // contains sentence punctuation
|
|
743
|
+
filename.split(' ').length > 8 && // has many words
|
|
744
|
+
!/\/|^[A-Z]:/i.test(filenameSlashes) // do NOT treat as sentence if looks like a path
|
|
745
|
+
) {
|
|
738
746
|
return false;
|
|
739
747
|
}
|
|
740
|
-
const filenameSlashes = filename.split('\\').join('/');
|
|
741
748
|
// Absolute Unix path: /hello.txt
|
|
742
749
|
if (/^(\/)/i.test(filenameSlashes)) {
|
|
743
750
|
// console.log(filename, 'Absolute Unix path: /hello.txt');
|
|
744
751
|
return true;
|
|
745
752
|
}
|
|
746
|
-
// Absolute Windows path:
|
|
747
|
-
if (/^
|
|
753
|
+
// Absolute Windows path: C:/ or C:\ (allow spaces and multiple dots in filename)
|
|
754
|
+
if (/^[A-Z]:\/.+$/i.test(filenameSlashes)) {
|
|
748
755
|
// console.log(filename, 'Absolute Windows path: /hello.txt');
|
|
749
756
|
return true;
|
|
750
757
|
}
|
|
@@ -3639,9 +3646,15 @@
|
|
|
3639
3646
|
}
|
|
3640
3647
|
if (isValidUrl(knowledgeSourceContent)) {
|
|
3641
3648
|
const url = knowledgeSourceContent;
|
|
3649
|
+
if (isVerbose) {
|
|
3650
|
+
console.info(`๐ [1] "${name}" is available at "${url}"`);
|
|
3651
|
+
}
|
|
3642
3652
|
const response = await fetch(url); // <- TODO: [๐ง ] Scraping and fetch proxy
|
|
3643
3653
|
const mimeType = ((_a = response.headers.get('content-type')) === null || _a === void 0 ? void 0 : _a.split(';')[0]) || 'text/html';
|
|
3644
3654
|
if (tools.fs === undefined || !url.endsWith('.pdf' /* <- TODO: [๐ต] */)) {
|
|
3655
|
+
if (isVerbose) {
|
|
3656
|
+
console.info(`๐ [2] "${name}" tools.fs is not available or URL is not a PDF.`);
|
|
3657
|
+
}
|
|
3645
3658
|
return {
|
|
3646
3659
|
source: name,
|
|
3647
3660
|
filename: null,
|
|
@@ -3677,13 +3690,17 @@
|
|
|
3677
3690
|
await tools.fs.mkdir(path.dirname(path.join(rootDirname, filepath)), { recursive: true });
|
|
3678
3691
|
}
|
|
3679
3692
|
catch (error) {
|
|
3693
|
+
if (isVerbose) {
|
|
3694
|
+
console.info(`๐ [3] "${name}" error creating cache directory`);
|
|
3695
|
+
}
|
|
3680
3696
|
// Note: If we can't create cache directory, we'll handle it when trying to write the file
|
|
3681
3697
|
// This handles read-only filesystems, permission issues, and missing parent directories
|
|
3682
|
-
if (error instanceof Error &&
|
|
3683
|
-
error.message.includes('
|
|
3684
|
-
|
|
3685
|
-
|
|
3686
|
-
|
|
3698
|
+
if (error instanceof Error &&
|
|
3699
|
+
(error.message.includes('EROFS') ||
|
|
3700
|
+
error.message.includes('read-only') ||
|
|
3701
|
+
error.message.includes('EACCES') ||
|
|
3702
|
+
error.message.includes('EPERM') ||
|
|
3703
|
+
error.message.includes('ENOENT'))) ;
|
|
3687
3704
|
else {
|
|
3688
3705
|
// Re-throw other unexpected errors
|
|
3689
3706
|
throw error;
|
|
@@ -3698,13 +3715,17 @@
|
|
|
3698
3715
|
await tools.fs.writeFile(path.join(rootDirname, filepath), fileContent);
|
|
3699
3716
|
}
|
|
3700
3717
|
catch (error) {
|
|
3718
|
+
if (isVerbose) {
|
|
3719
|
+
console.info(`๐ [4] "${name}" error writing cache file`);
|
|
3720
|
+
}
|
|
3701
3721
|
// Note: If we can't write to cache, we'll process the file directly from memory
|
|
3702
3722
|
// This handles read-only filesystems like Vercel
|
|
3703
|
-
if (error instanceof Error &&
|
|
3704
|
-
error.message.includes('
|
|
3705
|
-
|
|
3706
|
-
|
|
3707
|
-
|
|
3723
|
+
if (error instanceof Error &&
|
|
3724
|
+
(error.message.includes('EROFS') ||
|
|
3725
|
+
error.message.includes('read-only') ||
|
|
3726
|
+
error.message.includes('EACCES') ||
|
|
3727
|
+
error.message.includes('EPERM') ||
|
|
3728
|
+
error.message.includes('ENOENT'))) {
|
|
3708
3729
|
// Return a handler that works directly with the downloaded content
|
|
3709
3730
|
return {
|
|
3710
3731
|
source: name,
|
|
@@ -3726,6 +3747,9 @@
|
|
|
3726
3747
|
}
|
|
3727
3748
|
// TODO: [๐ต] Check the file security
|
|
3728
3749
|
// TODO: [๐งน][๐ง ] Delete the file after the scraping is done
|
|
3750
|
+
if (isVerbose) {
|
|
3751
|
+
console.info(`๐ [5] "${name}" cached at "${path.join(rootDirname, filepath)}"`);
|
|
3752
|
+
}
|
|
3729
3753
|
return makeKnowledgeSourceHandler({ name, knowledgeSourceContent: filepath }, tools, {
|
|
3730
3754
|
...options,
|
|
3731
3755
|
rootDirname,
|
|
@@ -3740,7 +3764,12 @@
|
|
|
3740
3764
|
throw new EnvironmentMismatchError('Can not import file knowledge in non-file pipeline');
|
|
3741
3765
|
// <- TODO: [๐ง ] What is the best error type here`
|
|
3742
3766
|
}
|
|
3743
|
-
const filename = path.
|
|
3767
|
+
const filename = path.isAbsolute(knowledgeSourceContent)
|
|
3768
|
+
? knowledgeSourceContent
|
|
3769
|
+
: path.join(rootDirname, knowledgeSourceContent).split('\\').join('/');
|
|
3770
|
+
if (isVerbose) {
|
|
3771
|
+
console.info(`๐ [6] "${name}" is a valid file "${filename}"`);
|
|
3772
|
+
}
|
|
3744
3773
|
const fileExtension = getFileExtension(filename);
|
|
3745
3774
|
const mimeType = extensionToMimeType(fileExtension || '');
|
|
3746
3775
|
if (!(await isFileExisting(filename, tools.fs))) {
|
|
@@ -3782,6 +3811,12 @@
|
|
|
3782
3811
|
};
|
|
3783
3812
|
}
|
|
3784
3813
|
else {
|
|
3814
|
+
if (isVerbose) {
|
|
3815
|
+
console.info(`๐ [7] "${name}" is just a explicit string text with a knowledge source`);
|
|
3816
|
+
console.info('---');
|
|
3817
|
+
console.info(knowledgeSourceContent);
|
|
3818
|
+
console.info('---');
|
|
3819
|
+
}
|
|
3785
3820
|
return {
|
|
3786
3821
|
source: name,
|
|
3787
3822
|
filename: null,
|