@promptbook/wizard 0.100.1 โ†’ 0.100.3-0

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.2`).
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/wizard",
3
- "version": "0.100.1",
3
+ "version": "0.100.3-0",
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/wizard.index.d.ts",
97
97
  "peerDependencies": {
98
- "@promptbook/core": "0.100.1"
98
+ "@promptbook/core": "0.100.3-0"
99
99
  },
100
100
  "dependencies": {
101
101
  "@ai-sdk/deepseek": "0.1.6",
package/umd/index.umd.js CHANGED
@@ -50,7 +50,7 @@
50
50
  * @generated
51
51
  * @see https://github.com/webgptorg/promptbook
52
52
  */
53
- const PROMPTBOOK_ENGINE_VERSION = '0.100.1';
53
+ const PROMPTBOOK_ENGINE_VERSION = '0.100.3-0';
54
54
  /**
55
55
  * TODO: string_promptbook_version should be constrained to the all versions of Promptbook engine
56
56
  * Note: [๐Ÿ’ž] Ignore a discrepancy between file name and entity name
@@ -6228,7 +6228,7 @@
6228
6228
  }
6229
6229
 
6230
6230
  /**
6231
- * Tests if given string is valid URL.
6231
+ * Tests if given string is valid file path.
6232
6232
  *
6233
6233
  * Note: This does not check if the file exists only if the path is valid
6234
6234
  * @public exported from `@promptbook/utils`
@@ -6240,18 +6240,25 @@
6240
6240
  if (filename.split('\n').length > 1) {
6241
6241
  return false;
6242
6242
  }
6243
- if (filename.split(' ').length >
6244
- 5 /* <- TODO: [๐Ÿง ][๐Ÿˆท] Make some better non-arbitrary way how to distinct filenames from informational texts */) {
6243
+ // Normalize slashes early so heuristics can detect path-like inputs
6244
+ const filenameSlashes = filename.replace(/\\/g, '/');
6245
+ // Reject strings that look like sentences (informational text)
6246
+ // Heuristic: contains multiple spaces and ends with a period, or contains typical sentence punctuation
6247
+ // But skip this heuristic if the string looks like a path (contains '/' or starts with a drive letter)
6248
+ if (filename.trim().length > 60 && // long enough to be a sentence
6249
+ /[.!?]/.test(filename) && // contains sentence punctuation
6250
+ filename.split(' ').length > 8 && // has many words
6251
+ !/\/|^[A-Z]:/i.test(filenameSlashes) // do NOT treat as sentence if looks like a path
6252
+ ) {
6245
6253
  return false;
6246
6254
  }
6247
- const filenameSlashes = filename.split('\\').join('/');
6248
6255
  // Absolute Unix path: /hello.txt
6249
6256
  if (/^(\/)/i.test(filenameSlashes)) {
6250
6257
  // console.log(filename, 'Absolute Unix path: /hello.txt');
6251
6258
  return true;
6252
6259
  }
6253
- // Absolute Windows path: /hello.txt
6254
- if (/^([A-Z]{1,2}:\/?)\//i.test(filenameSlashes)) {
6260
+ // Absolute Windows path: C:/ or C:\ (allow spaces and multiple dots in filename)
6261
+ if (/^[A-Z]:\/.+$/i.test(filenameSlashes)) {
6255
6262
  // console.log(filename, 'Absolute Windows path: /hello.txt');
6256
6263
  return true;
6257
6264
  }
@@ -8161,9 +8168,15 @@
8161
8168
  }
8162
8169
  if (isValidUrl(knowledgeSourceContent)) {
8163
8170
  const url = knowledgeSourceContent;
8171
+ if (isVerbose) {
8172
+ console.info(`๐Ÿ“„ [1] "${name}" is available at "${url}"`);
8173
+ }
8164
8174
  const response = await fetch(url); // <- TODO: [๐Ÿง ] Scraping and fetch proxy
8165
8175
  const mimeType = ((_a = response.headers.get('content-type')) === null || _a === void 0 ? void 0 : _a.split(';')[0]) || 'text/html';
8166
8176
  if (tools.fs === undefined || !url.endsWith('.pdf' /* <- TODO: [๐Ÿ’ต] */)) {
8177
+ if (isVerbose) {
8178
+ console.info(`๐Ÿ“„ [2] "${name}" tools.fs is not available or URL is not a PDF.`);
8179
+ }
8167
8180
  return {
8168
8181
  source: name,
8169
8182
  filename: null,
@@ -8199,13 +8212,17 @@
8199
8212
  await tools.fs.mkdir(path.dirname(path.join(rootDirname, filepath)), { recursive: true });
8200
8213
  }
8201
8214
  catch (error) {
8215
+ if (isVerbose) {
8216
+ console.info(`๐Ÿ“„ [3] "${name}" error creating cache directory`);
8217
+ }
8202
8218
  // Note: If we can't create cache directory, we'll handle it when trying to write the file
8203
8219
  // This handles read-only filesystems, permission issues, and missing parent directories
8204
- if (error instanceof Error && (error.message.includes('EROFS') ||
8205
- error.message.includes('read-only') ||
8206
- error.message.includes('EACCES') ||
8207
- error.message.includes('EPERM') ||
8208
- error.message.includes('ENOENT'))) ;
8220
+ if (error instanceof Error &&
8221
+ (error.message.includes('EROFS') ||
8222
+ error.message.includes('read-only') ||
8223
+ error.message.includes('EACCES') ||
8224
+ error.message.includes('EPERM') ||
8225
+ error.message.includes('ENOENT'))) ;
8209
8226
  else {
8210
8227
  // Re-throw other unexpected errors
8211
8228
  throw error;
@@ -8220,13 +8237,17 @@
8220
8237
  await tools.fs.writeFile(path.join(rootDirname, filepath), fileContent);
8221
8238
  }
8222
8239
  catch (error) {
8240
+ if (isVerbose) {
8241
+ console.info(`๐Ÿ“„ [4] "${name}" error writing cache file`);
8242
+ }
8223
8243
  // Note: If we can't write to cache, we'll process the file directly from memory
8224
8244
  // This handles read-only filesystems like Vercel
8225
- if (error instanceof Error && (error.message.includes('EROFS') ||
8226
- error.message.includes('read-only') ||
8227
- error.message.includes('EACCES') ||
8228
- error.message.includes('EPERM') ||
8229
- error.message.includes('ENOENT'))) {
8245
+ if (error instanceof Error &&
8246
+ (error.message.includes('EROFS') ||
8247
+ error.message.includes('read-only') ||
8248
+ error.message.includes('EACCES') ||
8249
+ error.message.includes('EPERM') ||
8250
+ error.message.includes('ENOENT'))) {
8230
8251
  // Return a handler that works directly with the downloaded content
8231
8252
  return {
8232
8253
  source: name,
@@ -8248,6 +8269,9 @@
8248
8269
  }
8249
8270
  // TODO: [๐Ÿ’ต] Check the file security
8250
8271
  // TODO: [๐Ÿงน][๐Ÿง ] Delete the file after the scraping is done
8272
+ if (isVerbose) {
8273
+ console.info(`๐Ÿ“„ [5] "${name}" cached at "${path.join(rootDirname, filepath)}"`);
8274
+ }
8251
8275
  return makeKnowledgeSourceHandler({ name, knowledgeSourceContent: filepath }, tools, {
8252
8276
  ...options,
8253
8277
  rootDirname,
@@ -8262,7 +8286,12 @@
8262
8286
  throw new EnvironmentMismatchError('Can not import file knowledge in non-file pipeline');
8263
8287
  // <- TODO: [๐Ÿง ] What is the best error type here`
8264
8288
  }
8265
- const filename = path.join(rootDirname, knowledgeSourceContent).split('\\').join('/');
8289
+ const filename = path.isAbsolute(knowledgeSourceContent)
8290
+ ? knowledgeSourceContent
8291
+ : path.join(rootDirname, knowledgeSourceContent).split('\\').join('/');
8292
+ if (isVerbose) {
8293
+ console.info(`๐Ÿ“„ [6] "${name}" is a valid file "${filename}"`);
8294
+ }
8266
8295
  const fileExtension = getFileExtension(filename);
8267
8296
  const mimeType = extensionToMimeType(fileExtension || '');
8268
8297
  if (!(await isFileExisting(filename, tools.fs))) {
@@ -8304,6 +8333,12 @@
8304
8333
  };
8305
8334
  }
8306
8335
  else {
8336
+ if (isVerbose) {
8337
+ console.info(`๐Ÿ“„ [7] "${name}" is just a explicit string text with a knowledge source`);
8338
+ console.info('---');
8339
+ console.info(knowledgeSourceContent);
8340
+ console.info('---');
8341
+ }
8307
8342
  return {
8308
8343
  source: name,
8309
8344
  filename: null,