@promptbook/legacy-documents 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.
@@ -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 interface AgentBasicInformation {
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 interface CommitmentDefinition {
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 interface AgentModelRequirements {
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 interface AgentSourceParseResult {
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 interface ParsedCommitment {
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 interface ValidatePromptResultOptions {
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 interface ValidatePromptResultResult {
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 interface ITakeChain<TValue extends Takeable> {
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 URL.
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.0`).
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
- interface WizardOptions {
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/legacy-documents",
3
- "version": "0.100.1",
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,
@@ -95,7 +95,7 @@
95
95
  "module": "./esm/index.es.js",
96
96
  "typings": "./esm/typings/src/_packages/legacy-documents.index.d.ts",
97
97
  "peerDependencies": {
98
- "@promptbook/core": "0.100.1"
98
+ "@promptbook/core": "0.100.2"
99
99
  },
100
100
  "dependencies": {
101
101
  "colors": "1.4.0",
package/umd/index.umd.js CHANGED
@@ -27,7 +27,7 @@
27
27
  * @generated
28
28
  * @see https://github.com/webgptorg/promptbook
29
29
  */
30
- const PROMPTBOOK_ENGINE_VERSION = '0.100.1';
30
+ const PROMPTBOOK_ENGINE_VERSION = '0.100.2';
31
31
  /**
32
32
  * TODO: string_promptbook_version should be constrained to the all versions of Promptbook engine
33
33
  * Note: [๐Ÿ’ž] Ignore a discrepancy between file name and entity name
@@ -912,7 +912,7 @@
912
912
  }
913
913
 
914
914
  /**
915
- * Tests if given string is valid URL.
915
+ * Tests if given string is valid file path.
916
916
  *
917
917
  * Note: This does not check if the file exists only if the path is valid
918
918
  * @public exported from `@promptbook/utils`
@@ -924,18 +924,25 @@
924
924
  if (filename.split('\n').length > 1) {
925
925
  return false;
926
926
  }
927
- if (filename.split(' ').length >
928
- 5 /* <- TODO: [๐Ÿง ][๐Ÿˆท] Make some better non-arbitrary way how to distinct filenames from informational texts */) {
927
+ // Normalize slashes early so heuristics can detect path-like inputs
928
+ const filenameSlashes = filename.replace(/\\/g, '/');
929
+ // Reject strings that look like sentences (informational text)
930
+ // Heuristic: contains multiple spaces and ends with a period, or contains typical sentence punctuation
931
+ // But skip this heuristic if the string looks like a path (contains '/' or starts with a drive letter)
932
+ if (filename.trim().length > 60 && // long enough to be a sentence
933
+ /[.!?]/.test(filename) && // contains sentence punctuation
934
+ filename.split(' ').length > 8 && // has many words
935
+ !/\/|^[A-Z]:/i.test(filenameSlashes) // do NOT treat as sentence if looks like a path
936
+ ) {
929
937
  return false;
930
938
  }
931
- const filenameSlashes = filename.split('\\').join('/');
932
939
  // Absolute Unix path: /hello.txt
933
940
  if (/^(\/)/i.test(filenameSlashes)) {
934
941
  // console.log(filename, 'Absolute Unix path: /hello.txt');
935
942
  return true;
936
943
  }
937
- // Absolute Windows path: /hello.txt
938
- if (/^([A-Z]{1,2}:\/?)\//i.test(filenameSlashes)) {
944
+ // Absolute Windows path: C:/ or C:\ (allow spaces and multiple dots in filename)
945
+ if (/^[A-Z]:\/.+$/i.test(filenameSlashes)) {
939
946
  // console.log(filename, 'Absolute Windows path: /hello.txt');
940
947
  return true;
941
948
  }
@@ -3789,9 +3796,15 @@
3789
3796
  }
3790
3797
  if (isValidUrl(knowledgeSourceContent)) {
3791
3798
  const url = knowledgeSourceContent;
3799
+ if (isVerbose) {
3800
+ console.info(`๐Ÿ“„ [1] "${name}" is available at "${url}"`);
3801
+ }
3792
3802
  const response = await fetch(url); // <- TODO: [๐Ÿง ] Scraping and fetch proxy
3793
3803
  const mimeType = ((_a = response.headers.get('content-type')) === null || _a === void 0 ? void 0 : _a.split(';')[0]) || 'text/html';
3794
3804
  if (tools.fs === undefined || !url.endsWith('.pdf' /* <- TODO: [๐Ÿ’ต] */)) {
3805
+ if (isVerbose) {
3806
+ console.info(`๐Ÿ“„ [2] "${name}" tools.fs is not available or URL is not a PDF.`);
3807
+ }
3795
3808
  return {
3796
3809
  source: name,
3797
3810
  filename: null,
@@ -3827,13 +3840,17 @@
3827
3840
  await tools.fs.mkdir(path.dirname(path.join(rootDirname, filepath)), { recursive: true });
3828
3841
  }
3829
3842
  catch (error) {
3843
+ if (isVerbose) {
3844
+ console.info(`๐Ÿ“„ [3] "${name}" error creating cache directory`);
3845
+ }
3830
3846
  // Note: If we can't create cache directory, we'll handle it when trying to write the file
3831
3847
  // This handles read-only filesystems, permission issues, and missing parent directories
3832
- if (error instanceof Error && (error.message.includes('EROFS') ||
3833
- error.message.includes('read-only') ||
3834
- error.message.includes('EACCES') ||
3835
- error.message.includes('EPERM') ||
3836
- error.message.includes('ENOENT'))) ;
3848
+ if (error instanceof Error &&
3849
+ (error.message.includes('EROFS') ||
3850
+ error.message.includes('read-only') ||
3851
+ error.message.includes('EACCES') ||
3852
+ error.message.includes('EPERM') ||
3853
+ error.message.includes('ENOENT'))) ;
3837
3854
  else {
3838
3855
  // Re-throw other unexpected errors
3839
3856
  throw error;
@@ -3848,13 +3865,17 @@
3848
3865
  await tools.fs.writeFile(path.join(rootDirname, filepath), fileContent);
3849
3866
  }
3850
3867
  catch (error) {
3868
+ if (isVerbose) {
3869
+ console.info(`๐Ÿ“„ [4] "${name}" error writing cache file`);
3870
+ }
3851
3871
  // Note: If we can't write to cache, we'll process the file directly from memory
3852
3872
  // This handles read-only filesystems like Vercel
3853
- if (error instanceof Error && (error.message.includes('EROFS') ||
3854
- error.message.includes('read-only') ||
3855
- error.message.includes('EACCES') ||
3856
- error.message.includes('EPERM') ||
3857
- error.message.includes('ENOENT'))) {
3873
+ if (error instanceof Error &&
3874
+ (error.message.includes('EROFS') ||
3875
+ error.message.includes('read-only') ||
3876
+ error.message.includes('EACCES') ||
3877
+ error.message.includes('EPERM') ||
3878
+ error.message.includes('ENOENT'))) {
3858
3879
  // Return a handler that works directly with the downloaded content
3859
3880
  return {
3860
3881
  source: name,
@@ -3876,6 +3897,9 @@
3876
3897
  }
3877
3898
  // TODO: [๐Ÿ’ต] Check the file security
3878
3899
  // TODO: [๐Ÿงน][๐Ÿง ] Delete the file after the scraping is done
3900
+ if (isVerbose) {
3901
+ console.info(`๐Ÿ“„ [5] "${name}" cached at "${path.join(rootDirname, filepath)}"`);
3902
+ }
3879
3903
  return makeKnowledgeSourceHandler({ name, knowledgeSourceContent: filepath }, tools, {
3880
3904
  ...options,
3881
3905
  rootDirname,
@@ -3890,7 +3914,12 @@
3890
3914
  throw new EnvironmentMismatchError('Can not import file knowledge in non-file pipeline');
3891
3915
  // <- TODO: [๐Ÿง ] What is the best error type here`
3892
3916
  }
3893
- const filename = path.join(rootDirname, knowledgeSourceContent).split('\\').join('/');
3917
+ const filename = path.isAbsolute(knowledgeSourceContent)
3918
+ ? knowledgeSourceContent
3919
+ : path.join(rootDirname, knowledgeSourceContent).split('\\').join('/');
3920
+ if (isVerbose) {
3921
+ console.info(`๐Ÿ“„ [6] "${name}" is a valid file "${filename}"`);
3922
+ }
3894
3923
  const fileExtension = getFileExtension(filename);
3895
3924
  const mimeType = extensionToMimeType(fileExtension || '');
3896
3925
  if (!(await isFileExisting(filename, tools.fs))) {
@@ -3932,6 +3961,12 @@
3932
3961
  };
3933
3962
  }
3934
3963
  else {
3964
+ if (isVerbose) {
3965
+ console.info(`๐Ÿ“„ [7] "${name}" is just a explicit string text with a knowledge source`);
3966
+ console.info('---');
3967
+ console.info(knowledgeSourceContent);
3968
+ console.info('---');
3969
+ }
3935
3970
  return {
3936
3971
  source: name,
3937
3972
  filename: null,