@promptbook/remote-server 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/remote-server",
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/remote-server.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
@@ -49,7 +49,7 @@
49
49
  * @generated
50
50
  * @see https://github.com/webgptorg/promptbook
51
51
  */
52
- const PROMPTBOOK_ENGINE_VERSION = '0.100.1';
52
+ const PROMPTBOOK_ENGINE_VERSION = '0.100.2';
53
53
  /**
54
54
  * TODO: string_promptbook_version should be constrained to the all versions of Promptbook engine
55
55
  * Note: [๐Ÿ’ž] Ignore a discrepancy between file name and entity name
@@ -2295,7 +2295,7 @@
2295
2295
  }
2296
2296
 
2297
2297
  /**
2298
- * Tests if given string is valid URL.
2298
+ * Tests if given string is valid file path.
2299
2299
  *
2300
2300
  * Note: This does not check if the file exists only if the path is valid
2301
2301
  * @public exported from `@promptbook/utils`
@@ -2307,18 +2307,25 @@
2307
2307
  if (filename.split('\n').length > 1) {
2308
2308
  return false;
2309
2309
  }
2310
- if (filename.split(' ').length >
2311
- 5 /* <- TODO: [๐Ÿง ][๐Ÿˆท] Make some better non-arbitrary way how to distinct filenames from informational texts */) {
2310
+ // Normalize slashes early so heuristics can detect path-like inputs
2311
+ const filenameSlashes = filename.replace(/\\/g, '/');
2312
+ // Reject strings that look like sentences (informational text)
2313
+ // Heuristic: contains multiple spaces and ends with a period, or contains typical sentence punctuation
2314
+ // But skip this heuristic if the string looks like a path (contains '/' or starts with a drive letter)
2315
+ if (filename.trim().length > 60 && // long enough to be a sentence
2316
+ /[.!?]/.test(filename) && // contains sentence punctuation
2317
+ filename.split(' ').length > 8 && // has many words
2318
+ !/\/|^[A-Z]:/i.test(filenameSlashes) // do NOT treat as sentence if looks like a path
2319
+ ) {
2312
2320
  return false;
2313
2321
  }
2314
- const filenameSlashes = filename.split('\\').join('/');
2315
2322
  // Absolute Unix path: /hello.txt
2316
2323
  if (/^(\/)/i.test(filenameSlashes)) {
2317
2324
  // console.log(filename, 'Absolute Unix path: /hello.txt');
2318
2325
  return true;
2319
2326
  }
2320
- // Absolute Windows path: /hello.txt
2321
- if (/^([A-Z]{1,2}:\/?)\//i.test(filenameSlashes)) {
2327
+ // Absolute Windows path: C:/ or C:\ (allow spaces and multiple dots in filename)
2328
+ if (/^[A-Z]:\/.+$/i.test(filenameSlashes)) {
2322
2329
  // console.log(filename, 'Absolute Windows path: /hello.txt');
2323
2330
  return true;
2324
2331
  }
@@ -3964,9 +3971,15 @@
3964
3971
  }
3965
3972
  if (isValidUrl(knowledgeSourceContent)) {
3966
3973
  const url = knowledgeSourceContent;
3974
+ if (isVerbose) {
3975
+ console.info(`๐Ÿ“„ [1] "${name}" is available at "${url}"`);
3976
+ }
3967
3977
  const response = await fetch(url); // <- TODO: [๐Ÿง ] Scraping and fetch proxy
3968
3978
  const mimeType = ((_a = response.headers.get('content-type')) === null || _a === void 0 ? void 0 : _a.split(';')[0]) || 'text/html';
3969
3979
  if (tools.fs === undefined || !url.endsWith('.pdf' /* <- TODO: [๐Ÿ’ต] */)) {
3980
+ if (isVerbose) {
3981
+ console.info(`๐Ÿ“„ [2] "${name}" tools.fs is not available or URL is not a PDF.`);
3982
+ }
3970
3983
  return {
3971
3984
  source: name,
3972
3985
  filename: null,
@@ -4002,13 +4015,17 @@
4002
4015
  await tools.fs.mkdir(path.dirname(path.join(rootDirname, filepath)), { recursive: true });
4003
4016
  }
4004
4017
  catch (error) {
4018
+ if (isVerbose) {
4019
+ console.info(`๐Ÿ“„ [3] "${name}" error creating cache directory`);
4020
+ }
4005
4021
  // Note: If we can't create cache directory, we'll handle it when trying to write the file
4006
4022
  // This handles read-only filesystems, permission issues, and missing parent directories
4007
- if (error instanceof Error && (error.message.includes('EROFS') ||
4008
- error.message.includes('read-only') ||
4009
- error.message.includes('EACCES') ||
4010
- error.message.includes('EPERM') ||
4011
- error.message.includes('ENOENT'))) ;
4023
+ if (error instanceof Error &&
4024
+ (error.message.includes('EROFS') ||
4025
+ error.message.includes('read-only') ||
4026
+ error.message.includes('EACCES') ||
4027
+ error.message.includes('EPERM') ||
4028
+ error.message.includes('ENOENT'))) ;
4012
4029
  else {
4013
4030
  // Re-throw other unexpected errors
4014
4031
  throw error;
@@ -4023,13 +4040,17 @@
4023
4040
  await tools.fs.writeFile(path.join(rootDirname, filepath), fileContent);
4024
4041
  }
4025
4042
  catch (error) {
4043
+ if (isVerbose) {
4044
+ console.info(`๐Ÿ“„ [4] "${name}" error writing cache file`);
4045
+ }
4026
4046
  // Note: If we can't write to cache, we'll process the file directly from memory
4027
4047
  // This handles read-only filesystems like Vercel
4028
- if (error instanceof Error && (error.message.includes('EROFS') ||
4029
- error.message.includes('read-only') ||
4030
- error.message.includes('EACCES') ||
4031
- error.message.includes('EPERM') ||
4032
- error.message.includes('ENOENT'))) {
4048
+ if (error instanceof Error &&
4049
+ (error.message.includes('EROFS') ||
4050
+ error.message.includes('read-only') ||
4051
+ error.message.includes('EACCES') ||
4052
+ error.message.includes('EPERM') ||
4053
+ error.message.includes('ENOENT'))) {
4033
4054
  // Return a handler that works directly with the downloaded content
4034
4055
  return {
4035
4056
  source: name,
@@ -4051,6 +4072,9 @@
4051
4072
  }
4052
4073
  // TODO: [๐Ÿ’ต] Check the file security
4053
4074
  // TODO: [๐Ÿงน][๐Ÿง ] Delete the file after the scraping is done
4075
+ if (isVerbose) {
4076
+ console.info(`๐Ÿ“„ [5] "${name}" cached at "${path.join(rootDirname, filepath)}"`);
4077
+ }
4054
4078
  return makeKnowledgeSourceHandler({ name, knowledgeSourceContent: filepath }, tools, {
4055
4079
  ...options,
4056
4080
  rootDirname,
@@ -4065,7 +4089,12 @@
4065
4089
  throw new EnvironmentMismatchError('Can not import file knowledge in non-file pipeline');
4066
4090
  // <- TODO: [๐Ÿง ] What is the best error type here`
4067
4091
  }
4068
- const filename = path.join(rootDirname, knowledgeSourceContent).split('\\').join('/');
4092
+ const filename = path.isAbsolute(knowledgeSourceContent)
4093
+ ? knowledgeSourceContent
4094
+ : path.join(rootDirname, knowledgeSourceContent).split('\\').join('/');
4095
+ if (isVerbose) {
4096
+ console.info(`๐Ÿ“„ [6] "${name}" is a valid file "${filename}"`);
4097
+ }
4069
4098
  const fileExtension = getFileExtension(filename);
4070
4099
  const mimeType = extensionToMimeType(fileExtension || '');
4071
4100
  if (!(await isFileExisting(filename, tools.fs))) {
@@ -4107,6 +4136,12 @@
4107
4136
  };
4108
4137
  }
4109
4138
  else {
4139
+ if (isVerbose) {
4140
+ console.info(`๐Ÿ“„ [7] "${name}" is just a explicit string text with a knowledge source`);
4141
+ console.info('---');
4142
+ console.info(knowledgeSourceContent);
4143
+ console.info('---');
4144
+ }
4110
4145
  return {
4111
4146
  source: name,
4112
4147
  filename: null,