@redaksjon/kronologi 1.0.5 → 1.0.6
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/dist/chunks/{configLoader-JvccSd17.js → configLoader-BEIzknpu.js} +2 -2
- package/dist/chunks/{configLoader-JvccSd17.js.map → configLoader-BEIzknpu.js.map} +1 -1
- package/dist/chunks/{run-BJePcz3g.js → run-BgmeXPLm.js} +4 -4
- package/dist/chunks/{run-BJePcz3g.js.map → run-BgmeXPLm.js.map} +1 -1
- package/dist/chunks/{storage-BYW0Uw63.js → storage-By2KSJCa.js} +2 -2
- package/dist/chunks/{storage-BYW0Uw63.js.map → storage-By2KSJCa.js.map} +1 -1
- package/dist/init-job.js +1 -1
- package/dist/main.js +4 -4
- package/dist/main.js.map +1 -1
- package/dist/mcp/server.js +4 -4
- package/dist/validate-job.js +2 -2
- package/package.json +2 -2
- package/tsconfig.tsbuildinfo +1 -1
- package/vite.config.ts +3 -3
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { join } from 'path';
|
|
2
2
|
import { load } from 'js-yaml';
|
|
3
|
-
import { n as create, p as JOB_CONFIG_FILE, q as DEFAULT_CHARACTER_ENCODING, m as getLogger } from './storage-
|
|
3
|
+
import { n as create, p as JOB_CONFIG_FILE, q as DEFAULT_CHARACTER_ENCODING, m as getLogger } from './storage-By2KSJCa.js';
|
|
4
4
|
|
|
5
5
|
const createConfig = async (jobName, configPath) => {
|
|
6
6
|
const logger = getLogger();
|
|
@@ -121,4 +121,4 @@ const createParameters = (config, params) => {
|
|
|
121
121
|
};
|
|
122
122
|
|
|
123
123
|
export { createParameters as a, createConfig as c };
|
|
124
|
-
//# sourceMappingURL=configLoader-
|
|
124
|
+
//# sourceMappingURL=configLoader-BEIzknpu.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configLoader-JvccSd17.js","sources":["../../src/analysis/configLoader.ts"],"sourcesContent":["import { join } from 'path';\nimport { load as loadYaml } from 'js-yaml';\nimport { DEFAULT_CHARACTER_ENCODING, JOB_CONFIG_FILE } from '../constants';\nimport { getLogger } from '../logging';\nimport { AnalysisConfig, Parameters } from '../types';\nimport * as Storage from '../util/storage';\n\n/**\n * Creates and validates a configuration from the config file\n */\nexport const createConfig = async (jobName: string, configPath: string): Promise<AnalysisConfig> => {\n const logger = getLogger();\n const storage = Storage.create({ log: logger.debug });\n\n // Read and parse YAML config\n const config = loadYaml(\n await storage.readFile(join(configPath, JOB_CONFIG_FILE), DEFAULT_CHARACTER_ENCODING)\n ) as AnalysisConfig;\n\n config.name = jobName;\n\n // Apply defaults to the configuration\n applyConfigDefaults(config);\n\n // Validate required config properties\n if (!config.model) {\n throw new Error(`Missing required config property in ${configPath}/config.yaml: model`);\n }\n\n // Validate reasoning config is present (required in reasoning-only mode)\n if (!config.reasoning) {\n throw new Error(\n `Missing required 'reasoning' configuration in ${configPath}/config.yaml. ` +\n `Kronologi now operates in reasoning-only mode. Please add a 'reasoning' section with 'provider' (openai or anthropic).`\n );\n }\n\n // Validate reasoning provider\n if (!config.reasoning.provider || !['openai', 'anthropic'].includes(config.reasoning.provider)) {\n throw new Error(\n `Invalid or missing 'provider' in reasoning configuration in ${configPath}/config.yaml. ` +\n `Must be either 'openai' or 'anthropic'.`\n );\n }\n\n // Validate each context directory has required properties\n for (const [key, value] of Object.entries(config.context || {})) {\n // Apply name default if not provided\n if (!value.name) {\n value.name = key.charAt(0).toUpperCase() + key.slice(1).replace(/_/g, ' ');\n }\n\n // Validate based on context type\n switch (value.type) {\n case 'static':\n if (!value.directory) {\n throw new Error(`Missing required directory property for ${value.type} context ${key} in ${configPath}/config.yaml`);\n }\n break;\n\n case 'history':\n if (!value.from) {\n throw new Error(`Missing required 'from' property for history context ${key} in ${configPath}/config.yaml`);\n }\n \n // Validate months if provided\n if (value.months && (typeof value.months !== 'number' && !(typeof value.months === 'string' && /^\\${.*}$/.test(value.months)))) {\n throw new Error(`Invalid months property for history context ${key} in ${configPath}/config.yaml - must be a number or parameter reference`);\n }\n\n // Validate weeks if provided\n if (value.weeks && (typeof value.weeks !== 'number' && !(typeof value.weeks === 'string' && /^\\${.*}$/.test(value.weeks)))) {\n throw new Error(`Invalid weeks property for history context ${key} in ${configPath}/config.yaml - must be a number or parameter reference`);\n }\n\n // If months is a parameter reference, validate it points to a valid numeric parameter\n if (typeof value.months === 'string' && /^\\${parameters\\.(.*)}$/.test(value.months)) {\n const paramMatch = value.months.match(/^\\${parameters\\.(.*)}$/);\n const paramName = paramMatch![1];\n const param = config.parameters?.[paramName];\n\n if (!param) {\n throw new Error(`Parameter ${paramName} referenced in months for history context ${key} not found in config parameters`);\n }\n\n if (param.type !== 'number') {\n throw new Error(`Parameter ${paramName} referenced in months for history context ${key} must be of type number`);\n }\n\n if (!param.required && param.default === undefined) {\n throw new Error(`Parameter ${paramName} referenced in months for history context ${key} must be required or have a default value`);\n }\n }\n\n // If weeks is a parameter reference, validate it points to a valid numeric parameter\n if (typeof value.weeks === 'string' && /^\\${parameters\\.(.*)}$/.test(value.weeks)) {\n const paramMatch = value.weeks.match(/^\\${parameters\\.(.*)}$/);\n const paramName = paramMatch![1];\n const param = config.parameters?.[paramName];\n\n if (!param) {\n throw new Error(`Parameter ${paramName} referenced in weeks for history context ${key} not found in config parameters`);\n }\n\n if (param.type !== 'number') {\n throw new Error(`Parameter ${paramName} referenced in weeks for history context ${key} must be of type number`);\n }\n\n if (!param.required && param.default === undefined) {\n throw new Error(`Parameter ${paramName} referenced in weeks for history context ${key} must be required or have a default value`);\n }\n }\n break;\n\n default:\n throw new Error(`Invalid context type '${value}' for context ${key} in ${configPath}/config.yaml`);\n }\n }\n\n // Apply defaults to content configurations\n for (const [key, value] of Object.entries(config.content || {})) {\n if (!value.name) {\n // Generate a nice default name from the key\n value.name = key.charAt(0).toUpperCase() + key.slice(1).replace(/_/g, ' ');\n }\n if (!value.pattern) {\n value.pattern = '**/*.md'; // Default to all markdown files\n }\n if (!value.directory) {\n value.directory = ''; // Default to root of activity directory\n }\n }\n\n return config;\n}\n\n/**\n * Applies sensible defaults to configuration\n */\nfunction applyConfigDefaults(config: AnalysisConfig): void {\n // Set default temperature if not provided\n if (config.temperature === undefined) {\n config.temperature = 0.7;\n }\n\n // Set default maxCompletionTokens if not provided\n if (config.maxCompletionTokens === undefined) {\n config.maxCompletionTokens = 4000;\n }\n\n // Apply parameter defaults\n if (config.parameters) {\n for (const param of Object.values(config.parameters)) {\n // If required is not explicitly set and there's no default, mark as required\n if (param.required === undefined) {\n param.required = param.default === undefined || param.default === null;\n }\n }\n }\n}\n\n/**\n * Creates parameter objects from configuration and input parameters\n */\nexport const createParameters = (config: AnalysisConfig, params: Record<string, string | number>): Parameters => {\n const parameters: Parameters = {};\n\n // Check to see if the params has all of the required parameters from the configuration. If one is missing, throw an error stating which one is missing.\n for (const [key, value] of Object.entries(config.parameters)) {\n if (value.required && params[key] === undefined) {\n throw new Error(`Missing required parameter: ${key}`);\n }\n }\n\n // Iterate through all of the parameters defined in the configuration, and assign either the value from the params object or the default value from the configuration.\n for (const [key, value] of Object.entries(config.parameters)) {\n parameters[key] = {\n ...value,\n value: params[key] === undefined ? value.default : params[key]\n };\n }\n\n return parameters;\n} "],"names":["Storage.create","loadYaml"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"configLoader-BEIzknpu.js","sources":["../../src/analysis/configLoader.ts"],"sourcesContent":["import { join } from 'path';\nimport { load as loadYaml } from 'js-yaml';\nimport { DEFAULT_CHARACTER_ENCODING, JOB_CONFIG_FILE } from '../constants';\nimport { getLogger } from '../logging';\nimport { AnalysisConfig, Parameters } from '../types';\nimport * as Storage from '../util/storage';\n\n/**\n * Creates and validates a configuration from the config file\n */\nexport const createConfig = async (jobName: string, configPath: string): Promise<AnalysisConfig> => {\n const logger = getLogger();\n const storage = Storage.create({ log: logger.debug });\n\n // Read and parse YAML config\n const config = loadYaml(\n await storage.readFile(join(configPath, JOB_CONFIG_FILE), DEFAULT_CHARACTER_ENCODING)\n ) as AnalysisConfig;\n\n config.name = jobName;\n\n // Apply defaults to the configuration\n applyConfigDefaults(config);\n\n // Validate required config properties\n if (!config.model) {\n throw new Error(`Missing required config property in ${configPath}/config.yaml: model`);\n }\n\n // Validate reasoning config is present (required in reasoning-only mode)\n if (!config.reasoning) {\n throw new Error(\n `Missing required 'reasoning' configuration in ${configPath}/config.yaml. ` +\n `Kronologi now operates in reasoning-only mode. Please add a 'reasoning' section with 'provider' (openai or anthropic).`\n );\n }\n\n // Validate reasoning provider\n if (!config.reasoning.provider || !['openai', 'anthropic'].includes(config.reasoning.provider)) {\n throw new Error(\n `Invalid or missing 'provider' in reasoning configuration in ${configPath}/config.yaml. ` +\n `Must be either 'openai' or 'anthropic'.`\n );\n }\n\n // Validate each context directory has required properties\n for (const [key, value] of Object.entries(config.context || {})) {\n // Apply name default if not provided\n if (!value.name) {\n value.name = key.charAt(0).toUpperCase() + key.slice(1).replace(/_/g, ' ');\n }\n\n // Validate based on context type\n switch (value.type) {\n case 'static':\n if (!value.directory) {\n throw new Error(`Missing required directory property for ${value.type} context ${key} in ${configPath}/config.yaml`);\n }\n break;\n\n case 'history':\n if (!value.from) {\n throw new Error(`Missing required 'from' property for history context ${key} in ${configPath}/config.yaml`);\n }\n \n // Validate months if provided\n if (value.months && (typeof value.months !== 'number' && !(typeof value.months === 'string' && /^\\${.*}$/.test(value.months)))) {\n throw new Error(`Invalid months property for history context ${key} in ${configPath}/config.yaml - must be a number or parameter reference`);\n }\n\n // Validate weeks if provided\n if (value.weeks && (typeof value.weeks !== 'number' && !(typeof value.weeks === 'string' && /^\\${.*}$/.test(value.weeks)))) {\n throw new Error(`Invalid weeks property for history context ${key} in ${configPath}/config.yaml - must be a number or parameter reference`);\n }\n\n // If months is a parameter reference, validate it points to a valid numeric parameter\n if (typeof value.months === 'string' && /^\\${parameters\\.(.*)}$/.test(value.months)) {\n const paramMatch = value.months.match(/^\\${parameters\\.(.*)}$/);\n const paramName = paramMatch![1];\n const param = config.parameters?.[paramName];\n\n if (!param) {\n throw new Error(`Parameter ${paramName} referenced in months for history context ${key} not found in config parameters`);\n }\n\n if (param.type !== 'number') {\n throw new Error(`Parameter ${paramName} referenced in months for history context ${key} must be of type number`);\n }\n\n if (!param.required && param.default === undefined) {\n throw new Error(`Parameter ${paramName} referenced in months for history context ${key} must be required or have a default value`);\n }\n }\n\n // If weeks is a parameter reference, validate it points to a valid numeric parameter\n if (typeof value.weeks === 'string' && /^\\${parameters\\.(.*)}$/.test(value.weeks)) {\n const paramMatch = value.weeks.match(/^\\${parameters\\.(.*)}$/);\n const paramName = paramMatch![1];\n const param = config.parameters?.[paramName];\n\n if (!param) {\n throw new Error(`Parameter ${paramName} referenced in weeks for history context ${key} not found in config parameters`);\n }\n\n if (param.type !== 'number') {\n throw new Error(`Parameter ${paramName} referenced in weeks for history context ${key} must be of type number`);\n }\n\n if (!param.required && param.default === undefined) {\n throw new Error(`Parameter ${paramName} referenced in weeks for history context ${key} must be required or have a default value`);\n }\n }\n break;\n\n default:\n throw new Error(`Invalid context type '${value}' for context ${key} in ${configPath}/config.yaml`);\n }\n }\n\n // Apply defaults to content configurations\n for (const [key, value] of Object.entries(config.content || {})) {\n if (!value.name) {\n // Generate a nice default name from the key\n value.name = key.charAt(0).toUpperCase() + key.slice(1).replace(/_/g, ' ');\n }\n if (!value.pattern) {\n value.pattern = '**/*.md'; // Default to all markdown files\n }\n if (!value.directory) {\n value.directory = ''; // Default to root of activity directory\n }\n }\n\n return config;\n}\n\n/**\n * Applies sensible defaults to configuration\n */\nfunction applyConfigDefaults(config: AnalysisConfig): void {\n // Set default temperature if not provided\n if (config.temperature === undefined) {\n config.temperature = 0.7;\n }\n\n // Set default maxCompletionTokens if not provided\n if (config.maxCompletionTokens === undefined) {\n config.maxCompletionTokens = 4000;\n }\n\n // Apply parameter defaults\n if (config.parameters) {\n for (const param of Object.values(config.parameters)) {\n // If required is not explicitly set and there's no default, mark as required\n if (param.required === undefined) {\n param.required = param.default === undefined || param.default === null;\n }\n }\n }\n}\n\n/**\n * Creates parameter objects from configuration and input parameters\n */\nexport const createParameters = (config: AnalysisConfig, params: Record<string, string | number>): Parameters => {\n const parameters: Parameters = {};\n\n // Check to see if the params has all of the required parameters from the configuration. If one is missing, throw an error stating which one is missing.\n for (const [key, value] of Object.entries(config.parameters)) {\n if (value.required && params[key] === undefined) {\n throw new Error(`Missing required parameter: ${key}`);\n }\n }\n\n // Iterate through all of the parameters defined in the configuration, and assign either the value from the params object or the default value from the configuration.\n for (const [key, value] of Object.entries(config.parameters)) {\n parameters[key] = {\n ...value,\n value: params[key] === undefined ? value.default : params[key]\n };\n }\n\n return parameters;\n} "],"names":["Storage.create","loadYaml"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { Parser, createSection, createPrompt, Formatter } from '@
|
|
1
|
+
import { Parser, createSection, createPrompt, Formatter } from '@kjerneverk/riotprompt';
|
|
2
2
|
import { join } from 'path';
|
|
3
3
|
import { glob } from 'glob';
|
|
4
|
-
import { n as create, r as JOB_REQUIRED_FILES, m as getLogger, q as DEFAULT_CHARACTER_ENCODING, t as JOB_PERSONA_PROMPT_FILE, u as JOB_INSTRUCTIONS_PROMPT_FILE } from './storage-
|
|
5
|
-
import { c as createConfig, a as createParameters } from './configLoader-
|
|
4
|
+
import { n as create, r as JOB_REQUIRED_FILES, m as getLogger, q as DEFAULT_CHARACTER_ENCODING, t as JOB_PERSONA_PROMPT_FILE, u as JOB_INSTRUCTIONS_PROMPT_FILE } from './storage-By2KSJCa.js';
|
|
5
|
+
import { c as createConfig, a as createParameters } from './configLoader-BEIzknpu.js';
|
|
6
6
|
import { OpenAI } from 'openai';
|
|
7
7
|
import Anthropic from '@anthropic-ai/sdk';
|
|
8
8
|
import { z } from 'zod';
|
|
@@ -850,4 +850,4 @@ const runModel = async (analysisConfig, kronologiConfig, jobConfig, existingMont
|
|
|
850
850
|
};
|
|
851
851
|
|
|
852
852
|
export { createInputs as c, runModel as r };
|
|
853
|
-
//# sourceMappingURL=run-
|
|
853
|
+
//# sourceMappingURL=run-BgmeXPLm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-BJePcz3g.js","sources":["../../src/analysis/file.ts","../../src/analysis/prompt.ts","../../src/analysis/section.ts","../../src/reasoning/systemPrompt.ts","../../src/analysis/inputs.ts","../../src/reasoning/providers/openai.ts","../../src/reasoning/providers/anthropic.ts","../../src/reasoning/client.ts","../../src/reasoning/tools/registry.ts","../../src/reasoning/tools/file.ts","../../src/reasoning/tools/search.ts","../../src/reasoning/tools/index.ts","../../src/reasoning/reportGenerator.ts","../../src/run.ts"],"sourcesContent":["import { glob } from 'glob';\nimport { join } from 'path';\nimport { DEFAULT_CHARACTER_ENCODING, JOB_REQUIRED_FILES } from '../constants';\nimport { getLogger } from '../logging';\nimport { FileContents } from '../types';\nimport * as Storage from '../util/storage';\n\n/**\n * Reads files from a directory that match a given pattern.\n */\nexport async function readFiles(directory: string, pattern?: string): Promise<FileContents> {\n const logger = getLogger();\n const storage = Storage.create({ log: logger.debug });\n const fileContents: FileContents = {};\n\n // If no pattern is specified, default to all files\n const filePattern = pattern || '**/*';\n\n // Get all files matching the pattern in the directory\n const files = glob.sync(filePattern, {\n cwd: directory,\n nodir: true // Only return files, not directories\n });\n\n // Read the contents of each file\n for (const file of files) {\n const filePath = join(directory, file);\n try {\n logger.debug(`Reading file ${filePath}`);\n const content = await storage.readFile(filePath, DEFAULT_CHARACTER_ENCODING);\n fileContents[filePath] = content;\n } catch (error) {\n logger.warn(`Could not read file ${filePath}: ${error}`);\n }\n }\n return fileContents;\n}\n\n/**\n * Checks if a directory exists and contains required files.\n */\nexport const checkDirectory = async (directory: string) => {\n const logger = getLogger();\n const storage = Storage.create({ log: logger.debug });\n\n if (!(await storage.exists(directory))) {\n throw new Error(`Configuration Directory ${directory} does not exist`);\n }\n\n // Check for required files\n for (const file of JOB_REQUIRED_FILES) {\n if (!(await storage.exists(join(directory, file)))) {\n throw new Error(`Missing required file in ${directory}: ${file}`);\n }\n }\n} ","import { Content, Context, createSection, Instruction, Parser, Section } from '@riotprompt/riotprompt';\nimport { join } from 'path';\nimport { JOB_INSTRUCTIONS_PROMPT_FILE, JOB_PERSONA_PROMPT_FILE } from '../constants';\nimport { getLogger } from '../logging';\nimport { AnalysisConfig, HistoryContextConfig, Parameters, StaticContextConfig } from '../types';\nimport { KronologiConfig } from '../types';\nimport { readFiles } from './file';\n\n/**\n * Type guard for static context config\n */\nexport const isStaticContextConfig = (config: any): config is StaticContextConfig => {\n return config && (config.type === 'static');\n}\n\n/**\n * Type guard for history context config\n */\nexport const isHistoryContextConfig = (config: any): config is HistoryContextConfig => {\n return config && config.type === 'history';\n}\n\n/**\n * Generates the persona section for the prompt\n */\nexport async function generatePersona(configPath: string): Promise<Section<Instruction>> {\n const parser = Parser.create();\n const persona = await parser.parseFile(join(configPath, JOB_PERSONA_PROMPT_FILE));\n return persona;\n}\n\n/**\n * Generates the instructions section for the prompt\n */\nexport async function generateInstructions(configPath: string): Promise<Section<Instruction>> {\n const parser = Parser.create();\n const instructions = await parser.parseFile(join(configPath, JOB_INSTRUCTIONS_PROMPT_FILE));\n return instructions;\n}\n\n/**\n * Generates the context section for the prompt\n */\nexport async function generateContext(config: AnalysisConfig, parameters: Parameters, mindshahnConfig: KronologiConfig): Promise<Section<Context>> {\n const logger = getLogger();\n\n const context = createSection<Context>({ title: 'Context' });\n\n // Step through each context directory defined in config\n for (const [key, contextConfig] of Object.entries(config.context)) {\n if (contextConfig.include === false) {\n logger.info(`Skipping ${contextConfig.name || key} Context because it is not included`);\n continue;\n }\n\n if (isStaticContextConfig(contextConfig)) {\n const contextSection = await readStaticContext(contextConfig, mindshahnConfig);\n context.add(contextSection);\n } else if (isHistoryContextConfig(contextConfig)) {\n const contextSection = await readHistoricalContext(contextConfig, config, parameters, mindshahnConfig);\n context.add(contextSection);\n }\n }\n\n return context;\n}\n\n/**\n * Reads historical context for the prompt\n */\nexport async function readHistoricalContext(contextConfig: HistoryContextConfig, config: AnalysisConfig, parameters: Parameters, mindshahnConfig: KronologiConfig): Promise<Section<Context>> {\n const logger = getLogger();\n\n // If this is a history context config, we need to get the configuration for the source\n const sourceConfig = config.content[contextConfig.from] || config.output[contextConfig.from];\n if (!sourceConfig) {\n throw new Error(`Missing required source context ${contextConfig.from} for history context ${contextConfig.name}`);\n }\n\n const year = parameters.year.value as number;\n const month = parameters.month?.value as number | undefined;\n const week = parameters.week?.value as number | undefined;\n\n // Determine the location of the source context based on the type of the source config\n const sourceDirectory = sourceConfig.type === 'activity' ? mindshahnConfig.activityDirectory : mindshahnConfig.summaryDirectory;\n const sourcePattern = sourceConfig.pattern;\n\n // Add section header for this context directory\n const sourceSection: Section<Context> = createSection<Context>({ title: `${sourceConfig.name || contextConfig.from} Context` });\n\n // Handle week-based history\n if (week !== undefined) {\n // Get the number of weeks which may be a parameter reference or a number\n const weeks: number = typeof contextConfig.weeks === 'string' && /^\\${parameters\\.(.*)}$/.test(contextConfig.weeks)\n ? parameters[contextConfig.weeks.match(/^\\${parameters\\.(.*)}$/)![1]].value as number\n : contextConfig.weeks as number || 1;\n\n // Get historical data for the specified number of weeks\n for (let i = 1; i < weeks + 1; i++) {\n // Calculate the target year and week\n let targetWeek = week - i;\n let targetYear = year;\n\n // Handle week rollover\n while (targetWeek <= 0) {\n targetYear--;\n // Assume 52 weeks per year (simplified)\n targetWeek += 52;\n }\n\n try {\n // Read files from the target directory\n const weekDir = `Week ${targetWeek}`;\n const historyPath = join(sourceDirectory, sourceConfig.directory || '', targetYear.toString(), weekDir);\n logger.debug(`Reading historical data from ${historyPath} with pattern ${sourcePattern}`);\n\n const contents = await readFiles(historyPath, sourcePattern);\n\n // Add each file's contents\n for (const [filename, content] of Object.entries(contents)) {\n const fileSection: Section<Context> = createSection<Context>({ title: filename });\n fileSection.add(content as string);\n sourceSection.add(fileSection);\n }\n } catch (error) {\n logger.warn(`Could not read historical data for ${targetYear}-W${targetWeek}: ${error}`);\n }\n }\n } else if (month !== undefined) {\n // Get the number of months which may be a parameter reference or a number\n const months: number = typeof contextConfig.months === 'string' && /^\\${parameters\\.(.*)}$/.test(contextConfig.months)\n ? parameters[contextConfig.months.match(/^\\${parameters\\.(.*)}$/)![1]].value as number\n : contextConfig.months as number || 1;\n\n // Get historical data for the specified number of months\n for (let i = 1; i < months + 1; i++) {\n // Calculate the target year and month\n let targetMonth = month - i;\n let targetYear = year;\n\n // Handle month rollover\n while (targetMonth <= 0) {\n targetMonth += 12;\n targetYear--;\n }\n\n try {\n // Read files from the target directory\n const historyPath = join(sourceDirectory, sourceConfig.directory || '', targetYear.toString(), targetMonth.toString());\n logger.debug(`Reading historical data from ${historyPath} with pattern ${sourcePattern}`);\n\n const contents = await readFiles(historyPath, sourcePattern);\n\n // Add each file's contents\n for (const [filename, content] of Object.entries(contents)) {\n const fileSection: Section<Context> = createSection<Context>({ title: filename });\n fileSection.add(content as string);\n sourceSection.add(fileSection);\n }\n } catch (error) {\n logger.warn(`Could not read historical data for ${targetYear}-${targetMonth}: ${error}`);\n }\n }\n }\n\n return sourceSection;\n}\n\n/**\n * Reads static context for the prompt\n */\nexport async function readStaticContext(contextConfig: StaticContextConfig, mindshahnConfig: KronologiConfig): Promise<Section<Context>> {\n const logger = getLogger();\n const section: Section<Context> = createSection<Context>({ title: `${contextConfig.name} Context` });\n const directoryPath = contextConfig.directory;\n logger.debug(`Generating ${contextConfig.name} Context from ${directoryPath} with pattern ${contextConfig.pattern}`);\n try {\n // Read all files in the directory\n const contents = await readFiles(join(mindshahnConfig.contextDirectory, directoryPath), contextConfig.pattern);\n\n // Add each file's contents\n for (const [filename, content] of Object.entries(contents)) {\n const fileSection: Section<Context> = createSection<Context>({ title: filename });\n fileSection.add(content as string);\n section.add(fileSection);\n }\n } catch (error) {\n logger.warn(`Could not read context directory ${directoryPath}: ${error}`);\n throw error;\n }\n return section;\n}\n\n/**\n * Formats the period directory name (adds \"Week \" prefix for weeks)\n */\nfunction formatPeriodDirectory(week: number | string | undefined, month: number | string | undefined): string {\n if (week !== undefined) {\n return `Week ${week}`;\n } else if (month !== undefined) {\n return month.toString();\n }\n throw new Error('Either month or week parameter must be provided');\n}\n\n/**\n * Generates the content section for the prompt\n */\nexport async function generateContent(config: AnalysisConfig, parameters: Parameters, mindshahnConfig: KronologiConfig): Promise<Section<Content>> {\n const logger = getLogger();\n\n const content = createSection<Content>({ title: 'Content' });\n\n const year = parameters.year.value as string;\n const month = parameters.month?.value as number | undefined;\n const week = parameters.week?.value as number | undefined;\n\n let contributingFileCount = 0;\n\n for (const [key, value] of Object.entries(config.content)) {\n let directoryPath = '';\n\n // Format the period directory name\n const periodDir = formatPeriodDirectory(week, month);\n\n if (value.type === 'summary') {\n directoryPath = join(mindshahnConfig.summaryDirectory, value.directory || '', year.toString(), periodDir);\n } else {\n directoryPath = join(mindshahnConfig.activityDirectory, value.directory || '', year.toString(), periodDir);\n }\n\n logger.debug(`Generating ${value.name || key} Content from ${directoryPath} with pattern ${value.pattern}`);\n\n const contents = await readFiles(directoryPath, value.pattern);\n const contentSection: Section<Content> = createSection<Content>({ title: `${value.name || key} Content` });\n\n // Add each file's contents to the content section\n for (const [filename, content] of Object.entries(contents)) {\n const fileSection: Section<Content> = createSection<Content>({ title: filename });\n fileSection.add(content as string);\n contentSection.add(fileSection);\n contributingFileCount++;\n }\n\n content.add(contentSection);\n }\n\n if (contributingFileCount === 0) {\n logger.warn(`No contributing files found for ${config.name}`);\n }\n\n return content;\n} ","import { createSection, Section, Weighted } from '@riotprompt/riotprompt';\nimport { Parameters } from '../types';\n\n/**\n * Checks if an object is a Section\n */\nexport const isSection = (object: any): boolean => {\n return object !== undefined && object !== null && typeof object === 'object' && 'items' in object;\n}\n\n/**\n * Replaces parameter placeholders in a section with their actual values\n */\nexport const replaceParameters = <T extends Weighted>(section: Section<T>, parameters: Parameters): Section<T> => {\n let returnSection: Section<T>;\n\n const items = section.items.map((item) => {\n if (isSection(item)) {\n const section = item as Section<T>;\n return replaceParameters(section, parameters);\n } else {\n const weighted = item as T;\n for (const [key, value] of Object.entries(parameters)) {\n weighted.text = weighted.text.replace(new RegExp(`{{parameters.${key}}}`, 'g'), value.value.toString());\n }\n }\n return item;\n });\n\n if (section.title) {\n let title = section.title;\n for (const [key, value] of Object.entries(parameters)) {\n title = title.replace(new RegExp(`{{parameters.${key}}}`, 'g'), value.value.toString());\n }\n returnSection = createSection<T>({ title });\n } else {\n // TODO: There should be a better way to create a section with no title.\n returnSection = createSection<T>({ title: '' });\n }\n\n returnSection.items = items;\n return returnSection;\n} ","/**\n * System Prompt Wrapper\n * \n * Automatically wraps user's task-focused instructions with tool usage guidance.\n * This keeps job configurations clean and focused on domain tasks rather than\n * implementation details.\n * \n * Separation of Concerns:\n * - Job Instructions (user-defined): WHAT to do, domain requirements, output format\n * - System Wrapper (kronologi-injected): HOW to do it, tool usage, exploration patterns\n */\n\nimport { ContentSourcesConfig } from '../types';\n\n/**\n * Build system message that describes tools and content sources\n */\nexport function buildSystemMessage(contentSources?: ContentSourcesConfig): string {\n const sections: string[] = [];\n\n sections.push(`You are an intelligent analysis assistant with access to tools for exploring content.\n\n# Your Tools\n\nYou have access to the following tools for content exploration:\n\n- **list_files**: List files in a directory with optional pattern matching\n - Use to see what files are available\n - Supports glob patterns (e.g., \"*.md\", \"2025-*.md\")\n - Returns file names for further exploration\n\n- **read_file**: Read the contents of a specific file\n - Use when you know which file you need\n - Reads from activity, summary, or context directories\n - Returns full file content\n\n- **search_files**: Search for text patterns across files\n - Use to find files containing specific keywords or topics\n - Searches file content, not just names\n - Returns matching files with context\n\n# Your Approach\n\nFollow this systematic approach to complete tasks:\n\n1. **Explore First**: Use \\`list_files\\` to understand what content is available\n2. **Search Strategically**: Use \\`search_files\\` to find relevant content before reading everything\n3. **Read Selectively**: Only read files that are relevant to the task\n4. **Iterate**: Make multiple tool calls to refine your understanding\n5. **Synthesize**: Once you have sufficient information, complete the task\n\n# Best Practices\n\n- Start with exploration tools (list_files) to get an overview\n- Use search to identify relevant files before reading\n- Read context files early to understand requirements and guidelines\n- Review previous summaries for continuity and context\n- Only read content that's directly relevant to the task\n- Don't try to read everything - be selective and strategic\n- Use multiple tool calls to progressively build understanding\n\n# Important\n\nThe user's instructions describe WHAT to do (the task, requirements, and output format).\nUse your tools to explore content and complete the task effectively.\nFocus on the user's requirements and deliver the requested output.`);\n\n // Add content source information if available\n if (contentSources) {\n sections.push('\\n# Available Content Sources\\n');\n \n if (contentSources.activity) {\n sections.push(`\\n## Activity Files\n${contentSources.activity.description}\n- Directory: ${contentSources.activity.directory}\n- Use \\`list_files\\` with directory=\"activity\" to explore\n- Use \\`read_file\\` to read specific activity files`);\n }\n\n if (contentSources.history) {\n sections.push(`\\n## Historical Content\n${contentSources.history.description}\n- Directory: ${contentSources.history.directory}\n${contentSources.history.monthsAvailable ? `- Historical depth: ${contentSources.history.monthsAvailable} months` : ''}\n${contentSources.history.weeksAvailable ? `- Historical depth: ${contentSources.history.weeksAvailable} weeks` : ''}\n- Use \\`list_files\\` to explore historical directories\n- Use \\`read_file\\` to read historical files`);\n }\n\n if (contentSources.summaries) {\n sections.push(`\\n## Previous Summaries\n${contentSources.summaries.description}\n- Directory: ${contentSources.summaries.directory}\n${contentSources.summaries.monthsAvailable ? `- Summaries available: ${contentSources.summaries.monthsAvailable} months` : ''}\n${contentSources.summaries.weeksAvailable ? `- Summaries available: ${contentSources.summaries.weeksAvailable} weeks` : ''}\n- Use \\`list_files\\` to see available summaries\n- Use \\`read_file\\` to read previous summaries for context`);\n }\n\n if (contentSources.context) {\n sections.push(`\\n## Context Files\n${contentSources.context.description}\n- Directory: ${contentSources.context.directory}\n- Use \\`list_files\\` to see available context files\n- Read these early to understand guidelines and requirements`);\n }\n }\n\n return sections.join('\\n');\n}\n\n/**\n * Build complete prompt with system wrapper and user instructions\n * \n * Returns an object with system and user messages separated\n */\nexport function buildWrappedPrompt(\n userInstructions: string,\n contentSources?: ContentSourcesConfig\n): { system: string; user: string } {\n return {\n system: buildSystemMessage(contentSources),\n user: userInstructions\n };\n}\n\n/**\n * Get tool usage guidance for inclusion in prompts\n */\nexport function getToolUsageGuidance(): string {\n return `# Tool Usage Strategy\n\nWhen analyzing content, follow this approach:\n\n1. **Start with Overview**: Use \\`list_files\\` to understand what content is available\n2. **Search Strategically**: Use \\`search_files\\` to find specific topics, keywords, or themes\n3. **Read Selectively**: Use \\`read_file\\` to read only the most relevant files\n4. **Iterate**: Use multiple tool calls to build understanding progressively\n\n## Example Workflow\n\n1. List files in activity directory to see what's available\n2. Search for key topics or themes mentioned in the task\n3. Read the most relevant files identified by search\n4. If needed, explore historical content for context\n5. Check previous summaries to understand trends\n6. Synthesize findings into the requested output\n\nRemember: You don't need to read everything. Focus on what's most relevant to the task.`;\n}\n","import { Content, Context, createPrompt, Formatter, Instruction, Model, Prompt, Request, Section, createSection } from '@riotprompt/riotprompt';\nimport { join } from 'path';\nimport { JobConfig, KronologiConfig, AnalysisConfigWithSources } from '../types';\nimport { checkDirectory } from './file';\nimport { Inputs } from '../types';\nimport { createConfig, createParameters } from './configLoader';\nimport { generateContent, generateContext, generateInstructions, generatePersona } from './prompt';\nimport { replaceParameters } from './section';\nimport { buildSystemMessage } from '../reasoning/systemPrompt';\nimport { getLogger } from '../logging';\n\n/**\n * Main function that creates inputs for analysis by combining configuration, parameters, and content generation\n */\nexport const createInputs = async (analysisName: string, params: Record<string, string | number | undefined>, mindshahnConfig: KronologiConfig, jobConfig: JobConfig): Promise<Inputs> => {\n const configPath = join(mindshahnConfig.configDirectory, 'jobs', jobConfig.job);\n checkDirectory(configPath);\n\n const logger = getLogger();\n \n // Load and validate configuration\n const config = await createConfig(jobConfig.job, configPath) as AnalysisConfigWithSources;\n\n // Process parameters - filter out undefined values\n const filteredParams: Record<string, string | number> = {};\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n filteredParams[key] = value;\n }\n }\n const parameters = createParameters(config, filteredParams);\n\n // Generate prompt sections\n let persona: Section<Instruction> = await generatePersona(configPath);\n let instructions: Section<Instruction> = await generateInstructions(configPath);\n\n // Replace parameters in text\n persona = replaceParameters(persona, parameters);\n instructions = replaceParameters(instructions, parameters);\n\n // Check if using new content sources (reasoning-only mode)\n if (config.contentSources) {\n logger.info('Using reasoning-only mode with system prompt wrapper');\n \n // Build system message with tool usage guidance and content sources\n const systemMessage = buildSystemMessage(config.contentSources);\n\n // Create context section with system message\n const context: Section<Context> = createSection<Context>({ title: 'System' });\n context.add(systemMessage);\n\n // User instructions go in content section\n const content: Section<Content> = createSection<Content>({ title: 'Task' });\n // Instructions section contains the user's task-focused instructions\n content.add(instructions.toString());\n\n // Create the complete prompt with sections object\n // Persona is optional and goes in instructions if present\n const prompt: Prompt = createPrompt({\n persona: persona.toString() ? persona : undefined,\n instructions: instructions,\n contexts: context,\n contents: content\n });\n\n // Format for the model using formatter instance\n const formatter = Formatter.create();\n const request: Request = formatter.formatPrompt(mindshahnConfig.model as Model, prompt);\n\n return {\n config,\n request\n };\n } else {\n // Traditional mode (deprecated but kept for backward compatibility)\n logger.warn('Using deprecated traditional mode - consider migrating to contentSources');\n \n // Generate context and content (old way)\n const context: Section<Context> = await generateContext(config, parameters, mindshahnConfig);\n const content: Section<Content> = await generateContent(config, parameters, mindshahnConfig);\n\n // Create the complete prompt with sections object\n const prompt: Prompt = createPrompt({\n persona,\n instructions,\n contexts: context,\n contents: content\n });\n\n // Format for the model using formatter instance\n const formatter = Formatter.create();\n const request: Request = formatter.formatPrompt(mindshahnConfig.model as Model, prompt);\n\n return {\n config,\n request\n };\n }\n}\n\n","/**\n * OpenAI Provider\n *\n * Implements the Provider interface for OpenAI's API.\n * Wraps OpenAI SDK calls and normalizes responses.\n */\n\nimport { OpenAI } from 'openai';\nimport { Provider, ProviderConfig } from '../provider';\nimport { CompletionResponse, Message } from '../types';\n\nexport class OpenAIProvider implements Provider {\n private client: OpenAI;\n\n constructor(apiKey?: string) {\n this.client = new OpenAI({\n apiKey: apiKey || process.env.OPENAI_API_KEY\n });\n }\n\n async complete(\n messages: Message[],\n config: ProviderConfig\n ): Promise<CompletionResponse> {\n const response = await this.client.chat.completions.create({\n model: config.model,\n messages: messages as any,\n temperature: config.temperature,\n max_completion_tokens: config.maxTokens,\n });\n\n return {\n content: response.choices[0].message.content || '',\n usage: {\n inputTokens: response.usage?.prompt_tokens || 0,\n outputTokens: response.usage?.completion_tokens || 0,\n totalTokens: response.usage?.total_tokens || 0,\n },\n model: response.model,\n stopReason: this.mapStopReason(response.choices[0].finish_reason),\n };\n }\n\n private mapStopReason(reason: string | null): 'end_turn' | 'max_tokens' | 'stop_sequence' {\n switch (reason) {\n case 'stop': return 'end_turn';\n case 'length': return 'max_tokens';\n default: return 'stop_sequence';\n }\n }\n}\n","/**\n * Anthropic Provider\n *\n * Implements the Provider interface for Anthropic's Claude API.\n * Supports tool use for agentic workflows.\n */\n\nimport Anthropic from '@anthropic-ai/sdk';\nimport { Provider, ProviderConfig } from '../provider';\nimport { CompletionResponse, Message, ToolCall } from '../types';\nimport { Tool } from '../tools/types';\n\nexport class AnthropicProvider implements Provider {\n private client: Anthropic;\n\n constructor(apiKey?: string) {\n this.client = new Anthropic({\n apiKey: apiKey || process.env.ANTHROPIC_API_KEY\n });\n }\n\n async complete(\n messages: Message[],\n config: ProviderConfig\n ): Promise<CompletionResponse> {\n const response = await this.client.messages.create({\n model: config.model,\n messages: this.convertMessages(messages),\n max_tokens: config.maxTokens,\n temperature: config.temperature,\n system: this.extractSystemMessage(messages),\n });\n\n return {\n content: this.extractContent(response),\n usage: {\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n totalTokens: response.usage.input_tokens + response.usage.output_tokens,\n },\n model: response.model,\n stopReason: response.stop_reason === 'end_turn' ? 'end_turn' : 'max_tokens',\n };\n }\n\n async executeWithTools(\n messages: Message[],\n tools: Tool[],\n config: ProviderConfig\n ): Promise<{ response: CompletionResponse; toolCalls: ToolCall[] }> {\n const anthropicTools = tools.map(t => ({\n name: t.name,\n description: t.description,\n input_schema: this.zodToJsonSchema(t.inputSchema),\n }));\n\n const response = await this.client.messages.create({\n model: config.model,\n messages: this.convertMessages(messages),\n max_tokens: config.maxTokens,\n temperature: config.temperature,\n system: this.extractSystemMessage(messages),\n tools: anthropicTools,\n });\n\n const toolCalls: ToolCall[] = [];\n if (response.stop_reason === 'tool_use') {\n // Extract tool calls from response\n for (const block of response.content) {\n if (block.type === 'tool_use') {\n toolCalls.push({\n id: block.id,\n name: block.name,\n input: block.input,\n });\n }\n }\n }\n\n return {\n response: {\n content: this.extractContent(response),\n usage: {\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n totalTokens: response.usage.input_tokens + response.usage.output_tokens,\n },\n model: response.model,\n stopReason: response.stop_reason === 'end_turn' ? 'end_turn' : 'max_tokens',\n },\n toolCalls,\n };\n }\n\n private convertMessages(messages: Message[]): Anthropic.MessageParam[] {\n // Filter out system messages (handled separately)\n return messages\n .filter(m => m.role !== 'system')\n .map(m => ({\n role: m.role as 'user' | 'assistant',\n content: m.content,\n }));\n }\n\n private extractSystemMessage(messages: Message[]): string | undefined {\n const systemMessage = messages.find(m => m.role === 'system');\n return systemMessage?.content;\n }\n\n private extractContent(response: Anthropic.Message): string {\n // Extract text content from response\n return response.content\n .filter((block): block is Anthropic.TextBlock => block.type === 'text')\n .map(block => block.text)\n .join('\\n');\n }\n\n private zodToJsonSchema(schema: any): any {\n // Simple Zod to JSON Schema conversion\n // For production, consider using zod-to-json-schema library\n \n // Handle ZodObject\n if (schema._def?.typeName === 'ZodObject') {\n const shape = schema._def.shape();\n const properties: any = {};\n const required: string[] = [];\n\n for (const [key, value] of Object.entries(shape)) {\n const field = value as any;\n const isOptional = field._def?.typeName === 'ZodOptional';\n \n // Get the actual field (unwrap optional)\n const actualField = isOptional ? field._def.innerType : field;\n \n properties[key] = {\n type: this.getJsonType(actualField),\n description: actualField._def?.description || undefined,\n };\n\n // Add to required if not optional\n if (!isOptional) {\n required.push(key);\n }\n }\n\n return {\n type: 'object',\n properties,\n required: required.length > 0 ? required : undefined,\n };\n }\n\n // Fallback for other types\n return { type: 'object', properties: {} };\n }\n\n private getJsonType(field: any): string {\n const typeName = field._def?.typeName;\n if (!typeName) return 'string';\n\n if (typeName.includes('String')) return 'string';\n if (typeName.includes('Number')) return 'number';\n if (typeName.includes('Boolean')) return 'boolean';\n if (typeName.includes('Array')) return 'array';\n if (typeName.includes('Object')) return 'object';\n if (typeName.includes('Enum')) return 'string';\n\n return 'string';\n }\n}\n","/**\n * Reasoning Client\n *\n * Main entry point for AI completions.\n * Wraps providers and provides a consistent interface.\n */\n\nimport { Provider } from './provider';\nimport { OpenAIProvider } from './providers/openai';\nimport { AnthropicProvider } from './providers/anthropic';\nimport { Message, CompletionResponse, ReasoningConfig, ReasoningResult } from './types';\nimport { Tool, ToolContext } from './tools/types';\n\nexport class ReasoningClient {\n private provider: Provider;\n private config: ReasoningConfig;\n private toolContext?: ToolContext;\n\n constructor(config: ReasoningConfig, toolContext?: ToolContext) {\n this.config = config;\n this.provider = this.createProvider(config.provider);\n this.toolContext = toolContext;\n }\n\n private createProvider(type: 'openai' | 'anthropic'): Provider {\n if (type === 'openai') {\n return new OpenAIProvider(this.config.apiKey);\n }\n if (type === 'anthropic') {\n return new AnthropicProvider(this.config.apiKey);\n }\n throw new Error(`Unknown provider: ${type}`);\n }\n\n async complete(messages: Message[]): Promise<CompletionResponse> {\n return await this.provider.complete(messages, {\n model: this.config.model,\n temperature: this.config.temperature,\n maxTokens: this.config.maxTokens,\n apiKey: this.config.apiKey,\n });\n }\n\n /**\n * Execute with tools - enables agentic workflows with multi-turn tool use\n */\n async executeWithTools(\n initialMessages: Message[],\n tools: Tool[],\n options: {\n maxIterations?: number;\n onToolCall?: (call: any) => void;\n } = {}\n ): Promise<ReasoningResult> {\n if (!this.provider.executeWithTools) {\n throw new Error(`Provider ${this.config.provider} does not support tool execution`);\n }\n\n if (!this.toolContext) {\n throw new Error('Tool context is required for executeWithTools');\n }\n\n const maxIterations = options.maxIterations || 10;\n const conversationHistory: Message[] = [...initialMessages];\n const allToolCalls: any[] = [];\n let iterations = 0;\n let lastResponse: CompletionResponse | null = null;\n\n while (iterations < maxIterations) {\n iterations++;\n\n // Get response with potential tool calls\n const { response, toolCalls } = await this.provider.executeWithTools(\n conversationHistory,\n tools,\n {\n model: this.config.model,\n temperature: this.config.temperature,\n maxTokens: this.config.maxTokens,\n }\n );\n\n lastResponse = response;\n\n // If no tool calls, we're done\n if (!toolCalls || toolCalls.length === 0) {\n return {\n ...response,\n toolCalls: allToolCalls,\n iterations,\n };\n }\n\n // Execute tool calls\n for (const call of toolCalls) {\n allToolCalls.push(call);\n\n if (options.onToolCall) {\n options.onToolCall(call);\n }\n\n const tool = tools.find(t => t.name === call.name);\n if (!tool) {\n throw new Error(`Tool not found: ${call.name}`);\n }\n\n // Execute tool\n const result = await tool.execute(call.input, this.toolContext);\n\n // Add tool result to conversation\n conversationHistory.push({\n role: 'assistant',\n content: `Using tool: ${call.name}`,\n });\n conversationHistory.push({\n role: 'user',\n content: `Tool result: ${JSON.stringify(result)}`,\n });\n }\n }\n\n // Max iterations reached\n return {\n content: lastResponse?.content || '',\n usage: lastResponse?.usage || { inputTokens: 0, outputTokens: 0, totalTokens: 0 },\n model: lastResponse?.model || this.config.model,\n stopReason: 'max_tokens' as const,\n toolCalls: allToolCalls,\n iterations,\n };\n }\n}\n\nexport function createReasoningClient(config: ReasoningConfig, toolContext?: ToolContext): ReasoningClient {\n return new ReasoningClient(config, toolContext);\n}\n","/**\n * Tool Registry\n *\n * Manages registration and lookup of available tools.\n * Provides a central registry for all tools that can be used by the reasoning client.\n */\n\nimport { Tool } from './types';\n\nexport class ToolRegistry {\n private tools: Map<string, Tool> = new Map();\n\n /**\n * Register a tool to make it available for use\n */\n register(tool: Tool): void {\n this.tools.set(tool.name, tool);\n }\n\n /**\n * Get a specific tool by name\n */\n get(name: string): Tool | undefined {\n return this.tools.get(name);\n }\n\n /**\n * Get all registered tools\n */\n list(): Tool[] {\n return Array.from(this.tools.values());\n }\n\n /**\n * Check if a tool is registered\n */\n has(name: string): boolean {\n return this.tools.has(name);\n }\n\n /**\n * Get multiple tools by name\n */\n getMany(names: string[]): Tool[] {\n return names\n .map(name => this.get(name))\n .filter((tool): tool is Tool => tool !== undefined);\n }\n}\n\n/**\n * Global tool registry instance\n */\nexport const globalToolRegistry = new ToolRegistry();\n","/**\n * File Tools\n *\n * Tools for reading and listing files from activity, summary, and context directories.\n */\n\nimport { z } from 'zod';\nimport { Tool, ToolContext, ToolResult } from './types';\nimport { join } from 'path';\n\n/**\n * Tool: read_file\n * Reads the contents of a file from activity, summary, or context directory\n */\nexport const readFileTool: Tool = {\n name: 'read_file',\n description: 'Read the contents of a file from the activity, summary, or context directory',\n inputSchema: z.object({\n path: z.string().describe('Relative path to the file (e.g., \"2026-01/summary.md\")'),\n directory: z.enum(['activity', 'summary', 'context']).describe('Which directory to read from'),\n }),\n execute: async (input, context: ToolContext): Promise<ToolResult<string>> => {\n try {\n const baseDir = input.directory === 'activity'\n ? context.config.activityDirectory\n : input.directory === 'summary'\n ? context.config.summaryDirectory\n : context.config.contextDirectory;\n\n const fullPath = join(baseDir, input.path);\n\n if (!(await context.storage.exists(fullPath))) {\n return {\n success: false,\n error: `File not found: ${input.path}`,\n };\n }\n\n const content = await context.storage.readFile(fullPath, 'utf-8');\n\n return {\n success: true,\n data: content,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n },\n};\n\n/**\n * Tool: list_files\n * Lists files in a directory with optional pattern matching\n */\nexport const listFilesTool: Tool = {\n name: 'list_files',\n description: 'List files in a directory',\n inputSchema: z.object({\n directory: z.enum(['activity', 'summary', 'context']).describe('Which directory to list from'),\n path: z.string().optional().describe('Subdirectory path (optional)'),\n pattern: z.string().optional().describe('Glob pattern (e.g., \"*.md\")'),\n }),\n execute: async (input, context: ToolContext): Promise<ToolResult<string[]>> => {\n try {\n const baseDir = input.directory === 'activity'\n ? context.config.activityDirectory\n : input.directory === 'summary'\n ? context.config.summaryDirectory\n : context.config.contextDirectory;\n\n const targetDir = input.path ? join(baseDir, input.path) : baseDir;\n\n if (!(await context.storage.exists(targetDir))) {\n return {\n success: false,\n error: `Directory not found: ${input.path || '/'}`,\n };\n }\n\n const files = await context.storage.listFiles(targetDir);\n\n // Apply pattern filter if provided\n let filtered = files;\n if (input.pattern) {\n const regex = new RegExp(\n input.pattern.replace(/\\*/g, '.*').replace(/\\?/g, '.')\n );\n filtered = files.filter(f => regex.test(f));\n }\n\n return {\n success: true,\n data: filtered,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n },\n};\n","/**\n * Search Tools\n *\n * Tools for searching through files by content.\n */\n\nimport { z } from 'zod';\nimport { Tool, ToolContext, ToolResult } from './types';\nimport { join } from 'path';\n\nexport interface SearchResult {\n file: string;\n matches: string[];\n matchCount: number;\n}\n\n/**\n * Tool: search_files\n * Search for text patterns in files\n */\nexport const searchFilesTool: Tool = {\n name: 'search_files',\n description: 'Search for text patterns in files',\n inputSchema: z.object({\n directory: z.enum(['activity', 'summary', 'context']).describe('Which directory to search in'),\n query: z.string().describe('Text to search for'),\n path: z.string().optional().describe('Subdirectory to search in (optional)'),\n filePattern: z.string().optional().describe('File pattern (e.g., \"*.md\")'),\n limit: z.number().optional().describe('Max results to return'),\n }),\n execute: async (input, context: ToolContext): Promise<ToolResult<SearchResult[]>> => {\n try {\n const baseDir = input.directory === 'activity'\n ? context.config.activityDirectory\n : input.directory === 'summary'\n ? context.config.summaryDirectory\n : context.config.contextDirectory;\n\n const searchDir = input.path ? join(baseDir, input.path) : baseDir;\n const pattern = input.filePattern || '**/*.md';\n const results: SearchResult[] = [];\n\n await context.storage.forEachFileIn(searchDir, async (filePath) => {\n const content = await context.storage.readFile(filePath, 'utf-8');\n const lines = content.split('\\n');\n const matches: string[] = [];\n\n lines.forEach((line, index) => {\n if (line.toLowerCase().includes(input.query.toLowerCase())) {\n matches.push(`Line ${index + 1}: ${line.trim()}`);\n }\n });\n\n if (matches.length > 0) {\n results.push({\n file: filePath,\n matches: matches.slice(0, 5), // Limit matches per file\n matchCount: matches.length,\n });\n }\n }, { pattern });\n\n // Apply result limit\n const limited = input.limit ? results.slice(0, input.limit) : results;\n\n return {\n success: true,\n data: limited,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n },\n};\n","/**\n * Tool Index\n *\n * Central export for all tools and automatic registration with global registry.\n */\n\nimport { globalToolRegistry } from './registry';\nimport { readFileTool, listFilesTool } from './file';\nimport { searchFilesTool } from './search';\n\n// Register all tools with the global registry\nglobalToolRegistry.register(readFileTool);\nglobalToolRegistry.register(listFilesTool);\nglobalToolRegistry.register(searchFilesTool);\n\n// Export everything for external use\nexport { globalToolRegistry };\nexport * from './types';\nexport * from './registry';\nexport * from './file';\nexport * from './search';\n","/**\n * Report Generator\n *\n * Generates reports using the reasoning client with tool-based content exploration.\n * All reports use agentic workflows with tool execution.\n */\n\nimport { createReasoningClient } from './client';\nimport { Message } from './types';\nimport { ToolContext } from './tools/types';\nimport { globalToolRegistry } from './tools';\nimport { AnalysisConfig } from '../types';\n\nexport interface ReportResult {\n content: string;\n usage: {\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n };\n toolCalls?: any[];\n iterations?: number;\n}\n\n/**\n * Generate report using reasoning mode with tools\n */\nexport async function generateReport(\n analysisConfig: AnalysisConfig,\n messages: Message[],\n toolContext: ToolContext\n): Promise<ReportResult> {\n const reasoningConfig = analysisConfig.reasoning!;\n\n const client = createReasoningClient(\n {\n provider: reasoningConfig.provider || 'anthropic',\n model: analysisConfig.model,\n temperature: analysisConfig.temperature,\n maxTokens: analysisConfig.maxCompletionTokens,\n },\n toolContext\n );\n\n // Get enabled tools\n const enabledToolNames = reasoningConfig.tools || ['read_file', 'list_files', 'search_files'];\n const tools = globalToolRegistry.getMany(enabledToolNames);\n\n if (tools.length === 0) {\n throw new Error('No tools available for reasoning mode');\n }\n\n const result = await client.executeWithTools(messages, tools, {\n maxIterations: reasoningConfig.maxIterations || 10,\n onToolCall: (call) => {\n toolContext.logger.info(`Tool called: ${call.name}`, call.input);\n },\n });\n\n return {\n content: result.content,\n usage: result.usage,\n toolCalls: result.toolCalls,\n iterations: result.iterations,\n };\n}\n","import * as Analysis from \"./analysis/inputs\";\nimport { JobConfig, KronologiConfig } from \"./types\";\nimport { AnalysisConfig } from \"./types\";\nimport { Message } from \"./reasoning/types\";\nimport { generateReport } from \"./reasoning/reportGenerator\";\nimport { ToolContext } from \"./reasoning/tools/types\";\nimport * as Storage from \"./util/storage\";\nimport { getLogger } from \"./logging\";\n\nexport const runModel = async (\n analysisConfig: AnalysisConfig,\n kronologiConfig: KronologiConfig,\n jobConfig: JobConfig,\n existingMonthlySummary?: any,\n): Promise<{ aiSummary: string, aiUsage: any, monthlySummary: any }> => {\n // Build parameters based on whether this is a week or month-based job\n const params: Record<string, string | number | undefined> = {\n year: jobConfig.year,\n };\n\n if (jobConfig.week !== undefined) {\n params.week = jobConfig.week;\n params.historyWeeks = jobConfig.historyWeeks;\n params.summaryWeeks = jobConfig.summaryWeeks;\n } else {\n params.month = jobConfig.month;\n params.historyMonths = jobConfig.historyMonths;\n params.summaryMonths = jobConfig.summaryMonths;\n }\n\n const monthlySummary = existingMonthlySummary || await Analysis.createInputs(jobConfig.job, params, kronologiConfig, jobConfig);\n\n const messages: Message[] = monthlySummary.request.messages.map((m: any) => ({\n role: m.role,\n content: m.content,\n }));\n\n // Always use reasoning mode with tools\n const toolContext: ToolContext = {\n storage: Storage.create({ log: getLogger().info }),\n config: kronologiConfig,\n job: jobConfig,\n logger: getLogger(),\n };\n\n const result = await generateReport(analysisConfig, messages, toolContext);\n\n return {\n aiSummary: result.content,\n aiUsage: {\n choices: [{\n message: { content: result.content },\n finish_reason: 'stop',\n }],\n usage: {\n prompt_tokens: result.usage.inputTokens,\n completion_tokens: result.usage.outputTokens,\n total_tokens: result.usage.totalTokens,\n },\n model: analysisConfig.model,\n },\n monthlySummary: {\n ...monthlySummary,\n toolCalls: result.toolCalls,\n iterations: result.iterations,\n }\n };\n}"],"names":["Storage.create","content","section","Analysis.createInputs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"run-BgmeXPLm.js","sources":["../../src/analysis/file.ts","../../src/analysis/prompt.ts","../../src/analysis/section.ts","../../src/reasoning/systemPrompt.ts","../../src/analysis/inputs.ts","../../src/reasoning/providers/openai.ts","../../src/reasoning/providers/anthropic.ts","../../src/reasoning/client.ts","../../src/reasoning/tools/registry.ts","../../src/reasoning/tools/file.ts","../../src/reasoning/tools/search.ts","../../src/reasoning/tools/index.ts","../../src/reasoning/reportGenerator.ts","../../src/run.ts"],"sourcesContent":["import { glob } from 'glob';\nimport { join } from 'path';\nimport { DEFAULT_CHARACTER_ENCODING, JOB_REQUIRED_FILES } from '../constants';\nimport { getLogger } from '../logging';\nimport { FileContents } from '../types';\nimport * as Storage from '../util/storage';\n\n/**\n * Reads files from a directory that match a given pattern.\n */\nexport async function readFiles(directory: string, pattern?: string): Promise<FileContents> {\n const logger = getLogger();\n const storage = Storage.create({ log: logger.debug });\n const fileContents: FileContents = {};\n\n // If no pattern is specified, default to all files\n const filePattern = pattern || '**/*';\n\n // Get all files matching the pattern in the directory\n const files = glob.sync(filePattern, {\n cwd: directory,\n nodir: true // Only return files, not directories\n });\n\n // Read the contents of each file\n for (const file of files) {\n const filePath = join(directory, file);\n try {\n logger.debug(`Reading file ${filePath}`);\n const content = await storage.readFile(filePath, DEFAULT_CHARACTER_ENCODING);\n fileContents[filePath] = content;\n } catch (error) {\n logger.warn(`Could not read file ${filePath}: ${error}`);\n }\n }\n return fileContents;\n}\n\n/**\n * Checks if a directory exists and contains required files.\n */\nexport const checkDirectory = async (directory: string) => {\n const logger = getLogger();\n const storage = Storage.create({ log: logger.debug });\n\n if (!(await storage.exists(directory))) {\n throw new Error(`Configuration Directory ${directory} does not exist`);\n }\n\n // Check for required files\n for (const file of JOB_REQUIRED_FILES) {\n if (!(await storage.exists(join(directory, file)))) {\n throw new Error(`Missing required file in ${directory}: ${file}`);\n }\n }\n} ","import { Content, Context, createSection, Instruction, Parser, Section } from '@kjerneverk/riotprompt';\nimport { join } from 'path';\nimport { JOB_INSTRUCTIONS_PROMPT_FILE, JOB_PERSONA_PROMPT_FILE } from '../constants';\nimport { getLogger } from '../logging';\nimport { AnalysisConfig, HistoryContextConfig, Parameters, StaticContextConfig } from '../types';\nimport { KronologiConfig } from '../types';\nimport { readFiles } from './file';\n\n/**\n * Type guard for static context config\n */\nexport const isStaticContextConfig = (config: any): config is StaticContextConfig => {\n return config && (config.type === 'static');\n}\n\n/**\n * Type guard for history context config\n */\nexport const isHistoryContextConfig = (config: any): config is HistoryContextConfig => {\n return config && config.type === 'history';\n}\n\n/**\n * Generates the persona section for the prompt\n */\nexport async function generatePersona(configPath: string): Promise<Section<Instruction>> {\n const parser = Parser.create();\n const persona = await parser.parseFile(join(configPath, JOB_PERSONA_PROMPT_FILE));\n return persona;\n}\n\n/**\n * Generates the instructions section for the prompt\n */\nexport async function generateInstructions(configPath: string): Promise<Section<Instruction>> {\n const parser = Parser.create();\n const instructions = await parser.parseFile(join(configPath, JOB_INSTRUCTIONS_PROMPT_FILE));\n return instructions;\n}\n\n/**\n * Generates the context section for the prompt\n */\nexport async function generateContext(config: AnalysisConfig, parameters: Parameters, mindshahnConfig: KronologiConfig): Promise<Section<Context>> {\n const logger = getLogger();\n\n const context = createSection<Context>({ title: 'Context' });\n\n // Step through each context directory defined in config\n for (const [key, contextConfig] of Object.entries(config.context)) {\n if (contextConfig.include === false) {\n logger.info(`Skipping ${contextConfig.name || key} Context because it is not included`);\n continue;\n }\n\n if (isStaticContextConfig(contextConfig)) {\n const contextSection = await readStaticContext(contextConfig, mindshahnConfig);\n context.add(contextSection);\n } else if (isHistoryContextConfig(contextConfig)) {\n const contextSection = await readHistoricalContext(contextConfig, config, parameters, mindshahnConfig);\n context.add(contextSection);\n }\n }\n\n return context;\n}\n\n/**\n * Reads historical context for the prompt\n */\nexport async function readHistoricalContext(contextConfig: HistoryContextConfig, config: AnalysisConfig, parameters: Parameters, mindshahnConfig: KronologiConfig): Promise<Section<Context>> {\n const logger = getLogger();\n\n // If this is a history context config, we need to get the configuration for the source\n const sourceConfig = config.content[contextConfig.from] || config.output[contextConfig.from];\n if (!sourceConfig) {\n throw new Error(`Missing required source context ${contextConfig.from} for history context ${contextConfig.name}`);\n }\n\n const year = parameters.year.value as number;\n const month = parameters.month?.value as number | undefined;\n const week = parameters.week?.value as number | undefined;\n\n // Determine the location of the source context based on the type of the source config\n const sourceDirectory = sourceConfig.type === 'activity' ? mindshahnConfig.activityDirectory : mindshahnConfig.summaryDirectory;\n const sourcePattern = sourceConfig.pattern;\n\n // Add section header for this context directory\n const sourceSection: Section<Context> = createSection<Context>({ title: `${sourceConfig.name || contextConfig.from} Context` });\n\n // Handle week-based history\n if (week !== undefined) {\n // Get the number of weeks which may be a parameter reference or a number\n const weeks: number = typeof contextConfig.weeks === 'string' && /^\\${parameters\\.(.*)}$/.test(contextConfig.weeks)\n ? parameters[contextConfig.weeks.match(/^\\${parameters\\.(.*)}$/)![1]].value as number\n : contextConfig.weeks as number || 1;\n\n // Get historical data for the specified number of weeks\n for (let i = 1; i < weeks + 1; i++) {\n // Calculate the target year and week\n let targetWeek = week - i;\n let targetYear = year;\n\n // Handle week rollover\n while (targetWeek <= 0) {\n targetYear--;\n // Assume 52 weeks per year (simplified)\n targetWeek += 52;\n }\n\n try {\n // Read files from the target directory\n const weekDir = `Week ${targetWeek}`;\n const historyPath = join(sourceDirectory, sourceConfig.directory || '', targetYear.toString(), weekDir);\n logger.debug(`Reading historical data from ${historyPath} with pattern ${sourcePattern}`);\n\n const contents = await readFiles(historyPath, sourcePattern);\n\n // Add each file's contents\n for (const [filename, content] of Object.entries(contents)) {\n const fileSection: Section<Context> = createSection<Context>({ title: filename });\n fileSection.add(content as string);\n sourceSection.add(fileSection);\n }\n } catch (error) {\n logger.warn(`Could not read historical data for ${targetYear}-W${targetWeek}: ${error}`);\n }\n }\n } else if (month !== undefined) {\n // Get the number of months which may be a parameter reference or a number\n const months: number = typeof contextConfig.months === 'string' && /^\\${parameters\\.(.*)}$/.test(contextConfig.months)\n ? parameters[contextConfig.months.match(/^\\${parameters\\.(.*)}$/)![1]].value as number\n : contextConfig.months as number || 1;\n\n // Get historical data for the specified number of months\n for (let i = 1; i < months + 1; i++) {\n // Calculate the target year and month\n let targetMonth = month - i;\n let targetYear = year;\n\n // Handle month rollover\n while (targetMonth <= 0) {\n targetMonth += 12;\n targetYear--;\n }\n\n try {\n // Read files from the target directory\n const historyPath = join(sourceDirectory, sourceConfig.directory || '', targetYear.toString(), targetMonth.toString());\n logger.debug(`Reading historical data from ${historyPath} with pattern ${sourcePattern}`);\n\n const contents = await readFiles(historyPath, sourcePattern);\n\n // Add each file's contents\n for (const [filename, content] of Object.entries(contents)) {\n const fileSection: Section<Context> = createSection<Context>({ title: filename });\n fileSection.add(content as string);\n sourceSection.add(fileSection);\n }\n } catch (error) {\n logger.warn(`Could not read historical data for ${targetYear}-${targetMonth}: ${error}`);\n }\n }\n }\n\n return sourceSection;\n}\n\n/**\n * Reads static context for the prompt\n */\nexport async function readStaticContext(contextConfig: StaticContextConfig, mindshahnConfig: KronologiConfig): Promise<Section<Context>> {\n const logger = getLogger();\n const section: Section<Context> = createSection<Context>({ title: `${contextConfig.name} Context` });\n const directoryPath = contextConfig.directory;\n logger.debug(`Generating ${contextConfig.name} Context from ${directoryPath} with pattern ${contextConfig.pattern}`);\n try {\n // Read all files in the directory\n const contents = await readFiles(join(mindshahnConfig.contextDirectory, directoryPath), contextConfig.pattern);\n\n // Add each file's contents\n for (const [filename, content] of Object.entries(contents)) {\n const fileSection: Section<Context> = createSection<Context>({ title: filename });\n fileSection.add(content as string);\n section.add(fileSection);\n }\n } catch (error) {\n logger.warn(`Could not read context directory ${directoryPath}: ${error}`);\n throw error;\n }\n return section;\n}\n\n/**\n * Formats the period directory name (adds \"Week \" prefix for weeks)\n */\nfunction formatPeriodDirectory(week: number | string | undefined, month: number | string | undefined): string {\n if (week !== undefined) {\n return `Week ${week}`;\n } else if (month !== undefined) {\n return month.toString();\n }\n throw new Error('Either month or week parameter must be provided');\n}\n\n/**\n * Generates the content section for the prompt\n */\nexport async function generateContent(config: AnalysisConfig, parameters: Parameters, mindshahnConfig: KronologiConfig): Promise<Section<Content>> {\n const logger = getLogger();\n\n const content = createSection<Content>({ title: 'Content' });\n\n const year = parameters.year.value as string;\n const month = parameters.month?.value as number | undefined;\n const week = parameters.week?.value as number | undefined;\n\n let contributingFileCount = 0;\n\n for (const [key, value] of Object.entries(config.content)) {\n let directoryPath = '';\n\n // Format the period directory name\n const periodDir = formatPeriodDirectory(week, month);\n\n if (value.type === 'summary') {\n directoryPath = join(mindshahnConfig.summaryDirectory, value.directory || '', year.toString(), periodDir);\n } else {\n directoryPath = join(mindshahnConfig.activityDirectory, value.directory || '', year.toString(), periodDir);\n }\n\n logger.debug(`Generating ${value.name || key} Content from ${directoryPath} with pattern ${value.pattern}`);\n\n const contents = await readFiles(directoryPath, value.pattern);\n const contentSection: Section<Content> = createSection<Content>({ title: `${value.name || key} Content` });\n\n // Add each file's contents to the content section\n for (const [filename, content] of Object.entries(contents)) {\n const fileSection: Section<Content> = createSection<Content>({ title: filename });\n fileSection.add(content as string);\n contentSection.add(fileSection);\n contributingFileCount++;\n }\n\n content.add(contentSection);\n }\n\n if (contributingFileCount === 0) {\n logger.warn(`No contributing files found for ${config.name}`);\n }\n\n return content;\n} ","import { createSection, Section, Weighted } from '@kjerneverk/riotprompt';\nimport { Parameters } from '../types';\n\n/**\n * Checks if an object is a Section\n */\nexport const isSection = (object: any): boolean => {\n return object !== undefined && object !== null && typeof object === 'object' && 'items' in object;\n}\n\n/**\n * Replaces parameter placeholders in a section with their actual values\n */\nexport const replaceParameters = <T extends Weighted>(section: Section<T>, parameters: Parameters): Section<T> => {\n let returnSection: Section<T>;\n\n const items = section.items.map((item) => {\n if (isSection(item)) {\n const section = item as Section<T>;\n return replaceParameters(section, parameters);\n } else {\n const weighted = item as T;\n for (const [key, value] of Object.entries(parameters)) {\n weighted.text = weighted.text.replace(new RegExp(`{{parameters.${key}}}`, 'g'), value.value.toString());\n }\n }\n return item;\n });\n\n if (section.title) {\n let title = section.title;\n for (const [key, value] of Object.entries(parameters)) {\n title = title.replace(new RegExp(`{{parameters.${key}}}`, 'g'), value.value.toString());\n }\n returnSection = createSection<T>({ title });\n } else {\n // TODO: There should be a better way to create a section with no title.\n returnSection = createSection<T>({ title: '' });\n }\n\n returnSection.items = items;\n return returnSection;\n} ","/**\n * System Prompt Wrapper\n * \n * Automatically wraps user's task-focused instructions with tool usage guidance.\n * This keeps job configurations clean and focused on domain tasks rather than\n * implementation details.\n * \n * Separation of Concerns:\n * - Job Instructions (user-defined): WHAT to do, domain requirements, output format\n * - System Wrapper (kronologi-injected): HOW to do it, tool usage, exploration patterns\n */\n\nimport { ContentSourcesConfig } from '../types';\n\n/**\n * Build system message that describes tools and content sources\n */\nexport function buildSystemMessage(contentSources?: ContentSourcesConfig): string {\n const sections: string[] = [];\n\n sections.push(`You are an intelligent analysis assistant with access to tools for exploring content.\n\n# Your Tools\n\nYou have access to the following tools for content exploration:\n\n- **list_files**: List files in a directory with optional pattern matching\n - Use to see what files are available\n - Supports glob patterns (e.g., \"*.md\", \"2025-*.md\")\n - Returns file names for further exploration\n\n- **read_file**: Read the contents of a specific file\n - Use when you know which file you need\n - Reads from activity, summary, or context directories\n - Returns full file content\n\n- **search_files**: Search for text patterns across files\n - Use to find files containing specific keywords or topics\n - Searches file content, not just names\n - Returns matching files with context\n\n# Your Approach\n\nFollow this systematic approach to complete tasks:\n\n1. **Explore First**: Use \\`list_files\\` to understand what content is available\n2. **Search Strategically**: Use \\`search_files\\` to find relevant content before reading everything\n3. **Read Selectively**: Only read files that are relevant to the task\n4. **Iterate**: Make multiple tool calls to refine your understanding\n5. **Synthesize**: Once you have sufficient information, complete the task\n\n# Best Practices\n\n- Start with exploration tools (list_files) to get an overview\n- Use search to identify relevant files before reading\n- Read context files early to understand requirements and guidelines\n- Review previous summaries for continuity and context\n- Only read content that's directly relevant to the task\n- Don't try to read everything - be selective and strategic\n- Use multiple tool calls to progressively build understanding\n\n# Important\n\nThe user's instructions describe WHAT to do (the task, requirements, and output format).\nUse your tools to explore content and complete the task effectively.\nFocus on the user's requirements and deliver the requested output.`);\n\n // Add content source information if available\n if (contentSources) {\n sections.push('\\n# Available Content Sources\\n');\n \n if (contentSources.activity) {\n sections.push(`\\n## Activity Files\n${contentSources.activity.description}\n- Directory: ${contentSources.activity.directory}\n- Use \\`list_files\\` with directory=\"activity\" to explore\n- Use \\`read_file\\` to read specific activity files`);\n }\n\n if (contentSources.history) {\n sections.push(`\\n## Historical Content\n${contentSources.history.description}\n- Directory: ${contentSources.history.directory}\n${contentSources.history.monthsAvailable ? `- Historical depth: ${contentSources.history.monthsAvailable} months` : ''}\n${contentSources.history.weeksAvailable ? `- Historical depth: ${contentSources.history.weeksAvailable} weeks` : ''}\n- Use \\`list_files\\` to explore historical directories\n- Use \\`read_file\\` to read historical files`);\n }\n\n if (contentSources.summaries) {\n sections.push(`\\n## Previous Summaries\n${contentSources.summaries.description}\n- Directory: ${contentSources.summaries.directory}\n${contentSources.summaries.monthsAvailable ? `- Summaries available: ${contentSources.summaries.monthsAvailable} months` : ''}\n${contentSources.summaries.weeksAvailable ? `- Summaries available: ${contentSources.summaries.weeksAvailable} weeks` : ''}\n- Use \\`list_files\\` to see available summaries\n- Use \\`read_file\\` to read previous summaries for context`);\n }\n\n if (contentSources.context) {\n sections.push(`\\n## Context Files\n${contentSources.context.description}\n- Directory: ${contentSources.context.directory}\n- Use \\`list_files\\` to see available context files\n- Read these early to understand guidelines and requirements`);\n }\n }\n\n return sections.join('\\n');\n}\n\n/**\n * Build complete prompt with system wrapper and user instructions\n * \n * Returns an object with system and user messages separated\n */\nexport function buildWrappedPrompt(\n userInstructions: string,\n contentSources?: ContentSourcesConfig\n): { system: string; user: string } {\n return {\n system: buildSystemMessage(contentSources),\n user: userInstructions\n };\n}\n\n/**\n * Get tool usage guidance for inclusion in prompts\n */\nexport function getToolUsageGuidance(): string {\n return `# Tool Usage Strategy\n\nWhen analyzing content, follow this approach:\n\n1. **Start with Overview**: Use \\`list_files\\` to understand what content is available\n2. **Search Strategically**: Use \\`search_files\\` to find specific topics, keywords, or themes\n3. **Read Selectively**: Use \\`read_file\\` to read only the most relevant files\n4. **Iterate**: Use multiple tool calls to build understanding progressively\n\n## Example Workflow\n\n1. List files in activity directory to see what's available\n2. Search for key topics or themes mentioned in the task\n3. Read the most relevant files identified by search\n4. If needed, explore historical content for context\n5. Check previous summaries to understand trends\n6. Synthesize findings into the requested output\n\nRemember: You don't need to read everything. Focus on what's most relevant to the task.`;\n}\n","import { Content, Context, createPrompt, Formatter, Instruction, Model, Prompt, Request, Section, createSection } from '@kjerneverk/riotprompt';\nimport { join } from 'path';\nimport { JobConfig, KronologiConfig, AnalysisConfigWithSources } from '../types';\nimport { checkDirectory } from './file';\nimport { Inputs } from '../types';\nimport { createConfig, createParameters } from './configLoader';\nimport { generateContent, generateContext, generateInstructions, generatePersona } from './prompt';\nimport { replaceParameters } from './section';\nimport { buildSystemMessage } from '../reasoning/systemPrompt';\nimport { getLogger } from '../logging';\n\n/**\n * Main function that creates inputs for analysis by combining configuration, parameters, and content generation\n */\nexport const createInputs = async (analysisName: string, params: Record<string, string | number | undefined>, mindshahnConfig: KronologiConfig, jobConfig: JobConfig): Promise<Inputs> => {\n const configPath = join(mindshahnConfig.configDirectory, 'jobs', jobConfig.job);\n checkDirectory(configPath);\n\n const logger = getLogger();\n \n // Load and validate configuration\n const config = await createConfig(jobConfig.job, configPath) as AnalysisConfigWithSources;\n\n // Process parameters - filter out undefined values\n const filteredParams: Record<string, string | number> = {};\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n filteredParams[key] = value;\n }\n }\n const parameters = createParameters(config, filteredParams);\n\n // Generate prompt sections\n let persona: Section<Instruction> = await generatePersona(configPath);\n let instructions: Section<Instruction> = await generateInstructions(configPath);\n\n // Replace parameters in text\n persona = replaceParameters(persona, parameters);\n instructions = replaceParameters(instructions, parameters);\n\n // Check if using new content sources (reasoning-only mode)\n if (config.contentSources) {\n logger.info('Using reasoning-only mode with system prompt wrapper');\n \n // Build system message with tool usage guidance and content sources\n const systemMessage = buildSystemMessage(config.contentSources);\n\n // Create context section with system message\n const context: Section<Context> = createSection<Context>({ title: 'System' });\n context.add(systemMessage);\n\n // User instructions go in content section\n const content: Section<Content> = createSection<Content>({ title: 'Task' });\n // Instructions section contains the user's task-focused instructions\n content.add(instructions.toString());\n\n // Create the complete prompt with sections object\n // Persona is optional and goes in instructions if present\n const prompt: Prompt = createPrompt({\n persona: persona.toString() ? persona : undefined,\n instructions: instructions,\n contexts: context,\n contents: content\n });\n\n // Format for the model using formatter instance\n const formatter = Formatter.create();\n const request: Request = formatter.formatPrompt(mindshahnConfig.model as Model, prompt);\n\n return {\n config,\n request\n };\n } else {\n // Traditional mode (deprecated but kept for backward compatibility)\n logger.warn('Using deprecated traditional mode - consider migrating to contentSources');\n \n // Generate context and content (old way)\n const context: Section<Context> = await generateContext(config, parameters, mindshahnConfig);\n const content: Section<Content> = await generateContent(config, parameters, mindshahnConfig);\n\n // Create the complete prompt with sections object\n const prompt: Prompt = createPrompt({\n persona,\n instructions,\n contexts: context,\n contents: content\n });\n\n // Format for the model using formatter instance\n const formatter = Formatter.create();\n const request: Request = formatter.formatPrompt(mindshahnConfig.model as Model, prompt);\n\n return {\n config,\n request\n };\n }\n}\n\n","/**\n * OpenAI Provider\n *\n * Implements the Provider interface for OpenAI's API.\n * Wraps OpenAI SDK calls and normalizes responses.\n */\n\nimport { OpenAI } from 'openai';\nimport { Provider, ProviderConfig } from '../provider';\nimport { CompletionResponse, Message } from '../types';\n\nexport class OpenAIProvider implements Provider {\n private client: OpenAI;\n\n constructor(apiKey?: string) {\n this.client = new OpenAI({\n apiKey: apiKey || process.env.OPENAI_API_KEY\n });\n }\n\n async complete(\n messages: Message[],\n config: ProviderConfig\n ): Promise<CompletionResponse> {\n const response = await this.client.chat.completions.create({\n model: config.model,\n messages: messages as any,\n temperature: config.temperature,\n max_completion_tokens: config.maxTokens,\n });\n\n return {\n content: response.choices[0].message.content || '',\n usage: {\n inputTokens: response.usage?.prompt_tokens || 0,\n outputTokens: response.usage?.completion_tokens || 0,\n totalTokens: response.usage?.total_tokens || 0,\n },\n model: response.model,\n stopReason: this.mapStopReason(response.choices[0].finish_reason),\n };\n }\n\n private mapStopReason(reason: string | null): 'end_turn' | 'max_tokens' | 'stop_sequence' {\n switch (reason) {\n case 'stop': return 'end_turn';\n case 'length': return 'max_tokens';\n default: return 'stop_sequence';\n }\n }\n}\n","/**\n * Anthropic Provider\n *\n * Implements the Provider interface for Anthropic's Claude API.\n * Supports tool use for agentic workflows.\n */\n\nimport Anthropic from '@anthropic-ai/sdk';\nimport { Provider, ProviderConfig } from '../provider';\nimport { CompletionResponse, Message, ToolCall } from '../types';\nimport { Tool } from '../tools/types';\n\nexport class AnthropicProvider implements Provider {\n private client: Anthropic;\n\n constructor(apiKey?: string) {\n this.client = new Anthropic({\n apiKey: apiKey || process.env.ANTHROPIC_API_KEY\n });\n }\n\n async complete(\n messages: Message[],\n config: ProviderConfig\n ): Promise<CompletionResponse> {\n const response = await this.client.messages.create({\n model: config.model,\n messages: this.convertMessages(messages),\n max_tokens: config.maxTokens,\n temperature: config.temperature,\n system: this.extractSystemMessage(messages),\n });\n\n return {\n content: this.extractContent(response),\n usage: {\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n totalTokens: response.usage.input_tokens + response.usage.output_tokens,\n },\n model: response.model,\n stopReason: response.stop_reason === 'end_turn' ? 'end_turn' : 'max_tokens',\n };\n }\n\n async executeWithTools(\n messages: Message[],\n tools: Tool[],\n config: ProviderConfig\n ): Promise<{ response: CompletionResponse; toolCalls: ToolCall[] }> {\n const anthropicTools = tools.map(t => ({\n name: t.name,\n description: t.description,\n input_schema: this.zodToJsonSchema(t.inputSchema),\n }));\n\n const response = await this.client.messages.create({\n model: config.model,\n messages: this.convertMessages(messages),\n max_tokens: config.maxTokens,\n temperature: config.temperature,\n system: this.extractSystemMessage(messages),\n tools: anthropicTools,\n });\n\n const toolCalls: ToolCall[] = [];\n if (response.stop_reason === 'tool_use') {\n // Extract tool calls from response\n for (const block of response.content) {\n if (block.type === 'tool_use') {\n toolCalls.push({\n id: block.id,\n name: block.name,\n input: block.input,\n });\n }\n }\n }\n\n return {\n response: {\n content: this.extractContent(response),\n usage: {\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n totalTokens: response.usage.input_tokens + response.usage.output_tokens,\n },\n model: response.model,\n stopReason: response.stop_reason === 'end_turn' ? 'end_turn' : 'max_tokens',\n },\n toolCalls,\n };\n }\n\n private convertMessages(messages: Message[]): Anthropic.MessageParam[] {\n // Filter out system messages (handled separately)\n return messages\n .filter(m => m.role !== 'system')\n .map(m => ({\n role: m.role as 'user' | 'assistant',\n content: m.content,\n }));\n }\n\n private extractSystemMessage(messages: Message[]): string | undefined {\n const systemMessage = messages.find(m => m.role === 'system');\n return systemMessage?.content;\n }\n\n private extractContent(response: Anthropic.Message): string {\n // Extract text content from response\n return response.content\n .filter((block): block is Anthropic.TextBlock => block.type === 'text')\n .map(block => block.text)\n .join('\\n');\n }\n\n private zodToJsonSchema(schema: any): any {\n // Simple Zod to JSON Schema conversion\n // For production, consider using zod-to-json-schema library\n \n // Handle ZodObject\n if (schema._def?.typeName === 'ZodObject') {\n const shape = schema._def.shape();\n const properties: any = {};\n const required: string[] = [];\n\n for (const [key, value] of Object.entries(shape)) {\n const field = value as any;\n const isOptional = field._def?.typeName === 'ZodOptional';\n \n // Get the actual field (unwrap optional)\n const actualField = isOptional ? field._def.innerType : field;\n \n properties[key] = {\n type: this.getJsonType(actualField),\n description: actualField._def?.description || undefined,\n };\n\n // Add to required if not optional\n if (!isOptional) {\n required.push(key);\n }\n }\n\n return {\n type: 'object',\n properties,\n required: required.length > 0 ? required : undefined,\n };\n }\n\n // Fallback for other types\n return { type: 'object', properties: {} };\n }\n\n private getJsonType(field: any): string {\n const typeName = field._def?.typeName;\n if (!typeName) return 'string';\n\n if (typeName.includes('String')) return 'string';\n if (typeName.includes('Number')) return 'number';\n if (typeName.includes('Boolean')) return 'boolean';\n if (typeName.includes('Array')) return 'array';\n if (typeName.includes('Object')) return 'object';\n if (typeName.includes('Enum')) return 'string';\n\n return 'string';\n }\n}\n","/**\n * Reasoning Client\n *\n * Main entry point for AI completions.\n * Wraps providers and provides a consistent interface.\n */\n\nimport { Provider } from './provider';\nimport { OpenAIProvider } from './providers/openai';\nimport { AnthropicProvider } from './providers/anthropic';\nimport { Message, CompletionResponse, ReasoningConfig, ReasoningResult } from './types';\nimport { Tool, ToolContext } from './tools/types';\n\nexport class ReasoningClient {\n private provider: Provider;\n private config: ReasoningConfig;\n private toolContext?: ToolContext;\n\n constructor(config: ReasoningConfig, toolContext?: ToolContext) {\n this.config = config;\n this.provider = this.createProvider(config.provider);\n this.toolContext = toolContext;\n }\n\n private createProvider(type: 'openai' | 'anthropic'): Provider {\n if (type === 'openai') {\n return new OpenAIProvider(this.config.apiKey);\n }\n if (type === 'anthropic') {\n return new AnthropicProvider(this.config.apiKey);\n }\n throw new Error(`Unknown provider: ${type}`);\n }\n\n async complete(messages: Message[]): Promise<CompletionResponse> {\n return await this.provider.complete(messages, {\n model: this.config.model,\n temperature: this.config.temperature,\n maxTokens: this.config.maxTokens,\n apiKey: this.config.apiKey,\n });\n }\n\n /**\n * Execute with tools - enables agentic workflows with multi-turn tool use\n */\n async executeWithTools(\n initialMessages: Message[],\n tools: Tool[],\n options: {\n maxIterations?: number;\n onToolCall?: (call: any) => void;\n } = {}\n ): Promise<ReasoningResult> {\n if (!this.provider.executeWithTools) {\n throw new Error(`Provider ${this.config.provider} does not support tool execution`);\n }\n\n if (!this.toolContext) {\n throw new Error('Tool context is required for executeWithTools');\n }\n\n const maxIterations = options.maxIterations || 10;\n const conversationHistory: Message[] = [...initialMessages];\n const allToolCalls: any[] = [];\n let iterations = 0;\n let lastResponse: CompletionResponse | null = null;\n\n while (iterations < maxIterations) {\n iterations++;\n\n // Get response with potential tool calls\n const { response, toolCalls } = await this.provider.executeWithTools(\n conversationHistory,\n tools,\n {\n model: this.config.model,\n temperature: this.config.temperature,\n maxTokens: this.config.maxTokens,\n }\n );\n\n lastResponse = response;\n\n // If no tool calls, we're done\n if (!toolCalls || toolCalls.length === 0) {\n return {\n ...response,\n toolCalls: allToolCalls,\n iterations,\n };\n }\n\n // Execute tool calls\n for (const call of toolCalls) {\n allToolCalls.push(call);\n\n if (options.onToolCall) {\n options.onToolCall(call);\n }\n\n const tool = tools.find(t => t.name === call.name);\n if (!tool) {\n throw new Error(`Tool not found: ${call.name}`);\n }\n\n // Execute tool\n const result = await tool.execute(call.input, this.toolContext);\n\n // Add tool result to conversation\n conversationHistory.push({\n role: 'assistant',\n content: `Using tool: ${call.name}`,\n });\n conversationHistory.push({\n role: 'user',\n content: `Tool result: ${JSON.stringify(result)}`,\n });\n }\n }\n\n // Max iterations reached\n return {\n content: lastResponse?.content || '',\n usage: lastResponse?.usage || { inputTokens: 0, outputTokens: 0, totalTokens: 0 },\n model: lastResponse?.model || this.config.model,\n stopReason: 'max_tokens' as const,\n toolCalls: allToolCalls,\n iterations,\n };\n }\n}\n\nexport function createReasoningClient(config: ReasoningConfig, toolContext?: ToolContext): ReasoningClient {\n return new ReasoningClient(config, toolContext);\n}\n","/**\n * Tool Registry\n *\n * Manages registration and lookup of available tools.\n * Provides a central registry for all tools that can be used by the reasoning client.\n */\n\nimport { Tool } from './types';\n\nexport class ToolRegistry {\n private tools: Map<string, Tool> = new Map();\n\n /**\n * Register a tool to make it available for use\n */\n register(tool: Tool): void {\n this.tools.set(tool.name, tool);\n }\n\n /**\n * Get a specific tool by name\n */\n get(name: string): Tool | undefined {\n return this.tools.get(name);\n }\n\n /**\n * Get all registered tools\n */\n list(): Tool[] {\n return Array.from(this.tools.values());\n }\n\n /**\n * Check if a tool is registered\n */\n has(name: string): boolean {\n return this.tools.has(name);\n }\n\n /**\n * Get multiple tools by name\n */\n getMany(names: string[]): Tool[] {\n return names\n .map(name => this.get(name))\n .filter((tool): tool is Tool => tool !== undefined);\n }\n}\n\n/**\n * Global tool registry instance\n */\nexport const globalToolRegistry = new ToolRegistry();\n","/**\n * File Tools\n *\n * Tools for reading and listing files from activity, summary, and context directories.\n */\n\nimport { z } from 'zod';\nimport { Tool, ToolContext, ToolResult } from './types';\nimport { join } from 'path';\n\n/**\n * Tool: read_file\n * Reads the contents of a file from activity, summary, or context directory\n */\nexport const readFileTool: Tool = {\n name: 'read_file',\n description: 'Read the contents of a file from the activity, summary, or context directory',\n inputSchema: z.object({\n path: z.string().describe('Relative path to the file (e.g., \"2026-01/summary.md\")'),\n directory: z.enum(['activity', 'summary', 'context']).describe('Which directory to read from'),\n }),\n execute: async (input, context: ToolContext): Promise<ToolResult<string>> => {\n try {\n const baseDir = input.directory === 'activity'\n ? context.config.activityDirectory\n : input.directory === 'summary'\n ? context.config.summaryDirectory\n : context.config.contextDirectory;\n\n const fullPath = join(baseDir, input.path);\n\n if (!(await context.storage.exists(fullPath))) {\n return {\n success: false,\n error: `File not found: ${input.path}`,\n };\n }\n\n const content = await context.storage.readFile(fullPath, 'utf-8');\n\n return {\n success: true,\n data: content,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n },\n};\n\n/**\n * Tool: list_files\n * Lists files in a directory with optional pattern matching\n */\nexport const listFilesTool: Tool = {\n name: 'list_files',\n description: 'List files in a directory',\n inputSchema: z.object({\n directory: z.enum(['activity', 'summary', 'context']).describe('Which directory to list from'),\n path: z.string().optional().describe('Subdirectory path (optional)'),\n pattern: z.string().optional().describe('Glob pattern (e.g., \"*.md\")'),\n }),\n execute: async (input, context: ToolContext): Promise<ToolResult<string[]>> => {\n try {\n const baseDir = input.directory === 'activity'\n ? context.config.activityDirectory\n : input.directory === 'summary'\n ? context.config.summaryDirectory\n : context.config.contextDirectory;\n\n const targetDir = input.path ? join(baseDir, input.path) : baseDir;\n\n if (!(await context.storage.exists(targetDir))) {\n return {\n success: false,\n error: `Directory not found: ${input.path || '/'}`,\n };\n }\n\n const files = await context.storage.listFiles(targetDir);\n\n // Apply pattern filter if provided\n let filtered = files;\n if (input.pattern) {\n const regex = new RegExp(\n input.pattern.replace(/\\*/g, '.*').replace(/\\?/g, '.')\n );\n filtered = files.filter(f => regex.test(f));\n }\n\n return {\n success: true,\n data: filtered,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n },\n};\n","/**\n * Search Tools\n *\n * Tools for searching through files by content.\n */\n\nimport { z } from 'zod';\nimport { Tool, ToolContext, ToolResult } from './types';\nimport { join } from 'path';\n\nexport interface SearchResult {\n file: string;\n matches: string[];\n matchCount: number;\n}\n\n/**\n * Tool: search_files\n * Search for text patterns in files\n */\nexport const searchFilesTool: Tool = {\n name: 'search_files',\n description: 'Search for text patterns in files',\n inputSchema: z.object({\n directory: z.enum(['activity', 'summary', 'context']).describe('Which directory to search in'),\n query: z.string().describe('Text to search for'),\n path: z.string().optional().describe('Subdirectory to search in (optional)'),\n filePattern: z.string().optional().describe('File pattern (e.g., \"*.md\")'),\n limit: z.number().optional().describe('Max results to return'),\n }),\n execute: async (input, context: ToolContext): Promise<ToolResult<SearchResult[]>> => {\n try {\n const baseDir = input.directory === 'activity'\n ? context.config.activityDirectory\n : input.directory === 'summary'\n ? context.config.summaryDirectory\n : context.config.contextDirectory;\n\n const searchDir = input.path ? join(baseDir, input.path) : baseDir;\n const pattern = input.filePattern || '**/*.md';\n const results: SearchResult[] = [];\n\n await context.storage.forEachFileIn(searchDir, async (filePath) => {\n const content = await context.storage.readFile(filePath, 'utf-8');\n const lines = content.split('\\n');\n const matches: string[] = [];\n\n lines.forEach((line, index) => {\n if (line.toLowerCase().includes(input.query.toLowerCase())) {\n matches.push(`Line ${index + 1}: ${line.trim()}`);\n }\n });\n\n if (matches.length > 0) {\n results.push({\n file: filePath,\n matches: matches.slice(0, 5), // Limit matches per file\n matchCount: matches.length,\n });\n }\n }, { pattern });\n\n // Apply result limit\n const limited = input.limit ? results.slice(0, input.limit) : results;\n\n return {\n success: true,\n data: limited,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n },\n};\n","/**\n * Tool Index\n *\n * Central export for all tools and automatic registration with global registry.\n */\n\nimport { globalToolRegistry } from './registry';\nimport { readFileTool, listFilesTool } from './file';\nimport { searchFilesTool } from './search';\n\n// Register all tools with the global registry\nglobalToolRegistry.register(readFileTool);\nglobalToolRegistry.register(listFilesTool);\nglobalToolRegistry.register(searchFilesTool);\n\n// Export everything for external use\nexport { globalToolRegistry };\nexport * from './types';\nexport * from './registry';\nexport * from './file';\nexport * from './search';\n","/**\n * Report Generator\n *\n * Generates reports using the reasoning client with tool-based content exploration.\n * All reports use agentic workflows with tool execution.\n */\n\nimport { createReasoningClient } from './client';\nimport { Message } from './types';\nimport { ToolContext } from './tools/types';\nimport { globalToolRegistry } from './tools';\nimport { AnalysisConfig } from '../types';\n\nexport interface ReportResult {\n content: string;\n usage: {\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n };\n toolCalls?: any[];\n iterations?: number;\n}\n\n/**\n * Generate report using reasoning mode with tools\n */\nexport async function generateReport(\n analysisConfig: AnalysisConfig,\n messages: Message[],\n toolContext: ToolContext\n): Promise<ReportResult> {\n const reasoningConfig = analysisConfig.reasoning!;\n\n const client = createReasoningClient(\n {\n provider: reasoningConfig.provider || 'anthropic',\n model: analysisConfig.model,\n temperature: analysisConfig.temperature,\n maxTokens: analysisConfig.maxCompletionTokens,\n },\n toolContext\n );\n\n // Get enabled tools\n const enabledToolNames = reasoningConfig.tools || ['read_file', 'list_files', 'search_files'];\n const tools = globalToolRegistry.getMany(enabledToolNames);\n\n if (tools.length === 0) {\n throw new Error('No tools available for reasoning mode');\n }\n\n const result = await client.executeWithTools(messages, tools, {\n maxIterations: reasoningConfig.maxIterations || 10,\n onToolCall: (call) => {\n toolContext.logger.info(`Tool called: ${call.name}`, call.input);\n },\n });\n\n return {\n content: result.content,\n usage: result.usage,\n toolCalls: result.toolCalls,\n iterations: result.iterations,\n };\n}\n","import * as Analysis from \"./analysis/inputs\";\nimport { JobConfig, KronologiConfig } from \"./types\";\nimport { AnalysisConfig } from \"./types\";\nimport { Message } from \"./reasoning/types\";\nimport { generateReport } from \"./reasoning/reportGenerator\";\nimport { ToolContext } from \"./reasoning/tools/types\";\nimport * as Storage from \"./util/storage\";\nimport { getLogger } from \"./logging\";\n\nexport const runModel = async (\n analysisConfig: AnalysisConfig,\n kronologiConfig: KronologiConfig,\n jobConfig: JobConfig,\n existingMonthlySummary?: any,\n): Promise<{ aiSummary: string, aiUsage: any, monthlySummary: any }> => {\n // Build parameters based on whether this is a week or month-based job\n const params: Record<string, string | number | undefined> = {\n year: jobConfig.year,\n };\n\n if (jobConfig.week !== undefined) {\n params.week = jobConfig.week;\n params.historyWeeks = jobConfig.historyWeeks;\n params.summaryWeeks = jobConfig.summaryWeeks;\n } else {\n params.month = jobConfig.month;\n params.historyMonths = jobConfig.historyMonths;\n params.summaryMonths = jobConfig.summaryMonths;\n }\n\n const monthlySummary = existingMonthlySummary || await Analysis.createInputs(jobConfig.job, params, kronologiConfig, jobConfig);\n\n const messages: Message[] = monthlySummary.request.messages.map((m: any) => ({\n role: m.role,\n content: m.content,\n }));\n\n // Always use reasoning mode with tools\n const toolContext: ToolContext = {\n storage: Storage.create({ log: getLogger().info }),\n config: kronologiConfig,\n job: jobConfig,\n logger: getLogger(),\n };\n\n const result = await generateReport(analysisConfig, messages, toolContext);\n\n return {\n aiSummary: result.content,\n aiUsage: {\n choices: [{\n message: { content: result.content },\n finish_reason: 'stop',\n }],\n usage: {\n prompt_tokens: result.usage.inputTokens,\n completion_tokens: result.usage.outputTokens,\n total_tokens: result.usage.totalTokens,\n },\n model: analysisConfig.model,\n },\n monthlySummary: {\n ...monthlySummary,\n toolCalls: result.toolCalls,\n iterations: result.iterations,\n }\n };\n}"],"names":["Storage.create","content","section","Analysis.createInputs"],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { glob } from 'glob';
|
|
|
4
4
|
import path from 'path';
|
|
5
5
|
import crypto from 'crypto';
|
|
6
6
|
|
|
7
|
-
const VERSION = "1.0.
|
|
7
|
+
const VERSION = "1.0.6 (HEAD/9e273fa T:v1.0.6 2026-01-30 22:58:26 -0800) linux x64 v22.22.0";
|
|
8
8
|
const PROGRAM_NAME = "kronologi";
|
|
9
9
|
const DEFAULT_CHARACTER_ENCODING = "utf-8";
|
|
10
10
|
const DEFAULT_TIMEZONE = "Etc/UTC";
|
|
@@ -199,4 +199,4 @@ const create = (params) => {
|
|
|
199
199
|
};
|
|
200
200
|
|
|
201
201
|
export { ALLOWED_MODELS as A, DEFAULT_HISTORY_MONTHS as D, JOB_DEFAULTS as J, KRONOLOGI_DEFAULTS as K, PROGRAM_NAME as P, VERSION as V, DEFAULT_HISTORY_WEEKS as a, DEFAULT_SUMMARY_MONTHS as b, DEFAULT_SUMMARY_WEEKS as c, DEFAULT_DRY_RUN as d, DEFAULT_VERBOSE as e, DEFAULT_DEBUG as f, DEFAULT_MODEL as g, DEFAULT_CONFIG_DIR as h, DEFAULT_CONTEXT_DIR as i, DEFAULT_ACTIVITY_DIR as j, DEFAULT_SUMMARY_DIR as k, DEFAULT_REPLACE as l, getLogger as m, create as n, DEFAULT_TIMEZONE as o, JOB_CONFIG_FILE as p, DEFAULT_CHARACTER_ENCODING as q, JOB_REQUIRED_FILES as r, setLogLevel as s, JOB_PERSONA_PROMPT_FILE as t, JOB_INSTRUCTIONS_PROMPT_FILE as u };
|
|
202
|
-
//# sourceMappingURL=storage-
|
|
202
|
+
//# sourceMappingURL=storage-By2KSJCa.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-BYW0Uw63.js","sources":["../../src/constants.ts","../../src/logging.ts","../../src/util/storage.ts"],"sourcesContent":["import { JobConfig, KronologiConfig } from \"@/types\";\n\nexport const VERSION = '__VERSION__ (__GIT_BRANCH__/__GIT_COMMIT__ __GIT_TAGS__ __GIT_COMMIT_DATE__) __SYSTEM_INFO__';\nexport const PROGRAM_NAME = 'kronologi';\nexport const DEFAULT_CHARACTER_ENCODING = 'utf-8';\nexport const DEFAULT_BINARY_TO_TEXT_ENCODING = 'base64';\nexport const DEFAULT_DIFF = true;\nexport const DEFAULT_LOG = false;\nexport const DEFAULT_TIMEZONE = 'Etc/UTC';\nexport const DATE_FORMAT_MONTH_DAY = 'M-D';\nexport const DATE_FORMAT_YEAR = 'YYYY';\nexport const DATE_FORMAT_YEAR_MONTH = 'YYYY-M';\nexport const DATE_FORMAT_YEAR_WEEK = 'YYYY-W';\nexport const DATE_FORMAT_YEAR_MONTH_DAY = 'YYYY-M-D';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_SLASH = 'YYYY/M/D';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES = 'YYYY-M-D-HHmm';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS = 'YYYY-M-D-HHmmss';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS = 'YYYY-M-D-HHmmss.SSS';\nexport const DATE_FORMAT_MONTH = 'M';\nexport const DATE_FORMAT_WEEK = 'W';\nexport const DATE_FORMAT_DAY = 'D';\nexport const DATE_FORMAT_HOURS = 'HHmm';\nexport const DATE_FORMAT_MINUTES = 'mm';\nexport const DATE_FORMAT_SECONDS = 'ss';\nexport const DATE_FORMAT_MILLISECONDS = 'SSS';\nexport const DEFAULT_VERBOSE = false;\nexport const DEFAULT_DRY_RUN = false;\nexport const DEFAULT_DEBUG = false;\nexport const DEFAULT_MODEL = 'gpt-4o';\n\n\nexport const DEFAULT_CONFIG_DIR = `./.${PROGRAM_NAME}`;\n\n// TODO: Add more models, but also this should be a part of an OpenAI specific extension.\nexport const ALLOWED_MODELS: string[] = ['gpt-4o', 'gpt-4o-mini', 'o1-preview', 'o1-mini', 'o3-mini', 'o3-preview', 'o1-pro', 'o1-preview-2024-09-12'];\n\nexport const DEFAULT_OVERRIDES = false;\n\nexport const JOB_CONFIG_FILE = 'config.yaml';\nexport const JOB_PERSONA_PROMPT_FILE = 'persona.md';\nexport const JOB_INSTRUCTIONS_PROMPT_FILE = 'instructions.md';\nexport const JOB_REQUIRED_FILES = [JOB_CONFIG_FILE, JOB_PERSONA_PROMPT_FILE, JOB_INSTRUCTIONS_PROMPT_FILE];\n\nexport const DEFAULT_JOB_DIR = `./.${PROGRAM_NAME}/jobs`;\n\nexport const DEFAULT_CONTEXT_DIR = `context`;\nexport const DEFAULT_CONTEXT_NAMESPACE = 'redaksjon';\nexport const DEFAULT_ACTIVITY_DIR = `activity`;\nexport const DEFAULT_SUMMARY_DIR = `summary`;\n\nexport const DEFAULT_REPLACE = false;\n\nexport const DEFAULT_HISTORY_MONTHS = 1;\nexport const DEFAULT_SUMMARY_MONTHS = 1;\nexport const DEFAULT_HISTORY_WEEKS = 1;\nexport const DEFAULT_SUMMARY_WEEKS = 1;\n\nexport const KRONOLOGI_DEFAULTS: Partial<KronologiConfig> = {\n configDirectory: DEFAULT_CONFIG_DIR,\n dryRun: DEFAULT_DRY_RUN,\n verbose: DEFAULT_VERBOSE,\n debug: DEFAULT_DEBUG,\n model: DEFAULT_MODEL,\n timezone: DEFAULT_TIMEZONE,\n contextDirectory: DEFAULT_CONTEXT_DIR,\n activityDirectory: DEFAULT_ACTIVITY_DIR,\n summaryDirectory: DEFAULT_SUMMARY_DIR,\n replace: DEFAULT_REPLACE,\n};\n\nexport const JOB_DEFAULTS: Partial<JobConfig> = {\n historyMonths: DEFAULT_HISTORY_MONTHS,\n summaryMonths: DEFAULT_SUMMARY_MONTHS,\n historyWeeks: DEFAULT_HISTORY_WEEKS,\n summaryWeeks: DEFAULT_SUMMARY_WEEKS,\n};\n","import winston from 'winston';\nimport { DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS, PROGRAM_NAME } from './constants';\n\nexport interface LogContext {\n [key: string]: any;\n}\n\nconst createLogger = (level: string = 'info') => {\n\n let format = winston.format.combine(\n winston.format.timestamp({ format: DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS }),\n winston.format.errors({ stack: true }),\n winston.format.splat(),\n winston.format.json()\n );\n\n let transports = [\n new winston.transports.Console({\n format: winston.format.combine(\n winston.format.colorize(),\n winston.format.printf(({ timestamp, level, message, ...meta }) => {\n const metaStr = Object.keys(meta).length ? ` ${JSON.stringify(meta)}` : '';\n return `${timestamp} ${level}: ${message}${metaStr}`;\n })\n )\n })\n ];\n\n if (level === 'info') {\n format = winston.format.combine(\n winston.format.errors({ stack: true }),\n winston.format.splat(),\n );\n\n transports = [\n new winston.transports.Console({\n format: winston.format.combine(\n winston.format.colorize(),\n winston.format.printf(({ level, message }) => {\n return `${level}: ${message}`;\n })\n )\n })\n ];\n }\n\n return winston.createLogger({\n level,\n format,\n defaultMeta: { service: PROGRAM_NAME },\n transports,\n });\n};\n\nlet logger = createLogger();\n\nexport const setLogLevel = (level: string) => {\n logger = createLogger(level);\n};\n\nexport const getLogger = () => logger; ","// eslint-disable-next-line no-restricted-imports\nimport * as fs from 'fs';\nimport { glob } from 'glob';\nimport path from 'path';\nimport crypto from 'crypto';\n/**\n * This module exists to isolate filesystem operations from the rest of the codebase.\n * This makes testing easier by avoiding direct fs mocking in jest configuration.\n * \n * Additionally, abstracting storage operations allows for future flexibility - \n * this export utility may need to work with storage systems other than the local filesystem\n * (e.g. S3, Google Cloud Storage, etc).\n */\n\nexport interface Utility {\n exists: (path: string) => Promise<boolean>;\n isDirectory: (path: string) => Promise<boolean>;\n isFile: (path: string) => Promise<boolean>;\n isReadable: (path: string) => Promise<boolean>;\n isWritable: (path: string) => Promise<boolean>;\n isFileReadable: (path: string) => Promise<boolean>;\n isDirectoryWritable: (path: string) => Promise<boolean>;\n isDirectoryReadable: (path: string) => Promise<boolean>;\n createDirectory: (path: string) => Promise<void>;\n readFile: (path: string, encoding: string) => Promise<string>;\n readStream: (path: string) => Promise<fs.ReadStream>;\n writeFile: (path: string, data: string | Buffer, encoding: string) => Promise<void>;\n forEachFileIn: (directory: string, callback: (path: string) => Promise<void>, options?: { pattern: string }) => Promise<void>;\n hashFile: (path: string, length: number) => Promise<string>;\n listFiles: (directory: string) => Promise<string[]>;\n}\n\nexport const create = (params: { log?: (message: string, ...args: any[]) => void }): Utility => {\n\n // eslint-disable-next-line no-console\n const log = params.log || console.log;\n\n const exists = async (path: string): Promise<boolean> => {\n try {\n await fs.promises.stat(path);\n return true;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (error: any) {\n return false;\n }\n }\n\n const isDirectory = async (path: string): Promise<boolean> => {\n const stats = await fs.promises.stat(path);\n if (!stats.isDirectory()) {\n log(`${path} is not a directory`);\n return false;\n }\n return true;\n }\n\n const isFile = async (path: string): Promise<boolean> => {\n const stats = await fs.promises.stat(path);\n if (!stats.isFile()) {\n log(`${path} is not a file`);\n return false;\n }\n return true;\n }\n\n const isReadable = async (path: string): Promise<boolean> => {\n try {\n await fs.promises.access(path, fs.constants.R_OK);\n } catch (error: any) {\n log(`${path} is not readable: %s %s`, error.message, error.stack);\n return false;\n }\n return true;\n }\n\n const isWritable = async (path: string): Promise<boolean> => {\n try {\n await fs.promises.access(path, fs.constants.W_OK);\n } catch (error: any) {\n log(`${path} is not writable: %s %s`, error.message, error.stack);\n return false;\n }\n return true;\n }\n\n const isFileReadable = async (path: string): Promise<boolean> => {\n return await exists(path) && await isFile(path) && await isReadable(path);\n }\n\n const isDirectoryWritable = async (path: string): Promise<boolean> => {\n return await exists(path) && await isDirectory(path) && await isWritable(path);\n }\n\n const isDirectoryReadable = async (path: string): Promise<boolean> => {\n return await exists(path) && await isDirectory(path) && await isReadable(path);\n }\n\n const createDirectory = async (path: string): Promise<void> => {\n try {\n await fs.promises.mkdir(path, { recursive: true });\n } catch (mkdirError: any) {\n throw new Error(`Failed to create output directory ${path}: ${mkdirError.message} ${mkdirError.stack}`);\n }\n }\n\n const readFile = async (path: string, encoding: string): Promise<string> => {\n return await fs.promises.readFile(path, { encoding: encoding as BufferEncoding });\n }\n\n const writeFile = async (path: string, data: string | Buffer, encoding: string): Promise<void> => {\n await fs.promises.writeFile(path, data, { encoding: encoding as BufferEncoding });\n }\n\n const forEachFileIn = async (directory: string, callback: (file: string) => Promise<void>, options: { pattern: string | string[] } = { pattern: '*.*' }): Promise<void> => {\n try {\n const files = await glob(options.pattern, { cwd: directory, nodir: true });\n for (const file of files) {\n await callback(path.join(directory, file));\n }\n } catch (err: any) {\n throw new Error(`Failed to glob pattern ${options.pattern} in ${directory}: ${err.message}`);\n }\n }\n\n const readStream = async (path: string): Promise<fs.ReadStream> => {\n return fs.createReadStream(path);\n }\n\n const hashFile = async (path: string, length: number): Promise<string> => {\n const file = await readFile(path, 'utf8');\n return crypto.createHash('sha256').update(file).digest('hex').slice(0, length);\n }\n\n const listFiles = async (directory: string): Promise<string[]> => {\n return await fs.promises.readdir(directory);\n }\n\n return {\n exists,\n isDirectory,\n isFile,\n isReadable,\n isWritable,\n isFileReadable,\n isDirectoryWritable,\n isDirectoryReadable,\n createDirectory,\n readFile,\n readStream,\n writeFile,\n forEachFileIn,\n hashFile,\n listFiles,\n };\n}"],"names":["level","path"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"storage-By2KSJCa.js","sources":["../../src/constants.ts","../../src/logging.ts","../../src/util/storage.ts"],"sourcesContent":["import { JobConfig, KronologiConfig } from \"@/types\";\n\nexport const VERSION = '__VERSION__ (__GIT_BRANCH__/__GIT_COMMIT__ __GIT_TAGS__ __GIT_COMMIT_DATE__) __SYSTEM_INFO__';\nexport const PROGRAM_NAME = 'kronologi';\nexport const DEFAULT_CHARACTER_ENCODING = 'utf-8';\nexport const DEFAULT_BINARY_TO_TEXT_ENCODING = 'base64';\nexport const DEFAULT_DIFF = true;\nexport const DEFAULT_LOG = false;\nexport const DEFAULT_TIMEZONE = 'Etc/UTC';\nexport const DATE_FORMAT_MONTH_DAY = 'M-D';\nexport const DATE_FORMAT_YEAR = 'YYYY';\nexport const DATE_FORMAT_YEAR_MONTH = 'YYYY-M';\nexport const DATE_FORMAT_YEAR_WEEK = 'YYYY-W';\nexport const DATE_FORMAT_YEAR_MONTH_DAY = 'YYYY-M-D';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_SLASH = 'YYYY/M/D';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES = 'YYYY-M-D-HHmm';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS = 'YYYY-M-D-HHmmss';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS = 'YYYY-M-D-HHmmss.SSS';\nexport const DATE_FORMAT_MONTH = 'M';\nexport const DATE_FORMAT_WEEK = 'W';\nexport const DATE_FORMAT_DAY = 'D';\nexport const DATE_FORMAT_HOURS = 'HHmm';\nexport const DATE_FORMAT_MINUTES = 'mm';\nexport const DATE_FORMAT_SECONDS = 'ss';\nexport const DATE_FORMAT_MILLISECONDS = 'SSS';\nexport const DEFAULT_VERBOSE = false;\nexport const DEFAULT_DRY_RUN = false;\nexport const DEFAULT_DEBUG = false;\nexport const DEFAULT_MODEL = 'gpt-4o';\n\n\nexport const DEFAULT_CONFIG_DIR = `./.${PROGRAM_NAME}`;\n\n// TODO: Add more models, but also this should be a part of an OpenAI specific extension.\nexport const ALLOWED_MODELS: string[] = ['gpt-4o', 'gpt-4o-mini', 'o1-preview', 'o1-mini', 'o3-mini', 'o3-preview', 'o1-pro', 'o1-preview-2024-09-12'];\n\nexport const DEFAULT_OVERRIDES = false;\n\nexport const JOB_CONFIG_FILE = 'config.yaml';\nexport const JOB_PERSONA_PROMPT_FILE = 'persona.md';\nexport const JOB_INSTRUCTIONS_PROMPT_FILE = 'instructions.md';\nexport const JOB_REQUIRED_FILES = [JOB_CONFIG_FILE, JOB_PERSONA_PROMPT_FILE, JOB_INSTRUCTIONS_PROMPT_FILE];\n\nexport const DEFAULT_JOB_DIR = `./.${PROGRAM_NAME}/jobs`;\n\nexport const DEFAULT_CONTEXT_DIR = `context`;\nexport const DEFAULT_CONTEXT_NAMESPACE = 'redaksjon';\nexport const DEFAULT_ACTIVITY_DIR = `activity`;\nexport const DEFAULT_SUMMARY_DIR = `summary`;\n\nexport const DEFAULT_REPLACE = false;\n\nexport const DEFAULT_HISTORY_MONTHS = 1;\nexport const DEFAULT_SUMMARY_MONTHS = 1;\nexport const DEFAULT_HISTORY_WEEKS = 1;\nexport const DEFAULT_SUMMARY_WEEKS = 1;\n\nexport const KRONOLOGI_DEFAULTS: Partial<KronologiConfig> = {\n configDirectory: DEFAULT_CONFIG_DIR,\n dryRun: DEFAULT_DRY_RUN,\n verbose: DEFAULT_VERBOSE,\n debug: DEFAULT_DEBUG,\n model: DEFAULT_MODEL,\n timezone: DEFAULT_TIMEZONE,\n contextDirectory: DEFAULT_CONTEXT_DIR,\n activityDirectory: DEFAULT_ACTIVITY_DIR,\n summaryDirectory: DEFAULT_SUMMARY_DIR,\n replace: DEFAULT_REPLACE,\n};\n\nexport const JOB_DEFAULTS: Partial<JobConfig> = {\n historyMonths: DEFAULT_HISTORY_MONTHS,\n summaryMonths: DEFAULT_SUMMARY_MONTHS,\n historyWeeks: DEFAULT_HISTORY_WEEKS,\n summaryWeeks: DEFAULT_SUMMARY_WEEKS,\n};\n","import winston from 'winston';\nimport { DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS, PROGRAM_NAME } from './constants';\n\nexport interface LogContext {\n [key: string]: any;\n}\n\nconst createLogger = (level: string = 'info') => {\n\n let format = winston.format.combine(\n winston.format.timestamp({ format: DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS }),\n winston.format.errors({ stack: true }),\n winston.format.splat(),\n winston.format.json()\n );\n\n let transports = [\n new winston.transports.Console({\n format: winston.format.combine(\n winston.format.colorize(),\n winston.format.printf(({ timestamp, level, message, ...meta }) => {\n const metaStr = Object.keys(meta).length ? ` ${JSON.stringify(meta)}` : '';\n return `${timestamp} ${level}: ${message}${metaStr}`;\n })\n )\n })\n ];\n\n if (level === 'info') {\n format = winston.format.combine(\n winston.format.errors({ stack: true }),\n winston.format.splat(),\n );\n\n transports = [\n new winston.transports.Console({\n format: winston.format.combine(\n winston.format.colorize(),\n winston.format.printf(({ level, message }) => {\n return `${level}: ${message}`;\n })\n )\n })\n ];\n }\n\n return winston.createLogger({\n level,\n format,\n defaultMeta: { service: PROGRAM_NAME },\n transports,\n });\n};\n\nlet logger = createLogger();\n\nexport const setLogLevel = (level: string) => {\n logger = createLogger(level);\n};\n\nexport const getLogger = () => logger; ","// eslint-disable-next-line no-restricted-imports\nimport * as fs from 'fs';\nimport { glob } from 'glob';\nimport path from 'path';\nimport crypto from 'crypto';\n/**\n * This module exists to isolate filesystem operations from the rest of the codebase.\n * This makes testing easier by avoiding direct fs mocking in jest configuration.\n * \n * Additionally, abstracting storage operations allows for future flexibility - \n * this export utility may need to work with storage systems other than the local filesystem\n * (e.g. S3, Google Cloud Storage, etc).\n */\n\nexport interface Utility {\n exists: (path: string) => Promise<boolean>;\n isDirectory: (path: string) => Promise<boolean>;\n isFile: (path: string) => Promise<boolean>;\n isReadable: (path: string) => Promise<boolean>;\n isWritable: (path: string) => Promise<boolean>;\n isFileReadable: (path: string) => Promise<boolean>;\n isDirectoryWritable: (path: string) => Promise<boolean>;\n isDirectoryReadable: (path: string) => Promise<boolean>;\n createDirectory: (path: string) => Promise<void>;\n readFile: (path: string, encoding: string) => Promise<string>;\n readStream: (path: string) => Promise<fs.ReadStream>;\n writeFile: (path: string, data: string | Buffer, encoding: string) => Promise<void>;\n forEachFileIn: (directory: string, callback: (path: string) => Promise<void>, options?: { pattern: string }) => Promise<void>;\n hashFile: (path: string, length: number) => Promise<string>;\n listFiles: (directory: string) => Promise<string[]>;\n}\n\nexport const create = (params: { log?: (message: string, ...args: any[]) => void }): Utility => {\n\n // eslint-disable-next-line no-console\n const log = params.log || console.log;\n\n const exists = async (path: string): Promise<boolean> => {\n try {\n await fs.promises.stat(path);\n return true;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (error: any) {\n return false;\n }\n }\n\n const isDirectory = async (path: string): Promise<boolean> => {\n const stats = await fs.promises.stat(path);\n if (!stats.isDirectory()) {\n log(`${path} is not a directory`);\n return false;\n }\n return true;\n }\n\n const isFile = async (path: string): Promise<boolean> => {\n const stats = await fs.promises.stat(path);\n if (!stats.isFile()) {\n log(`${path} is not a file`);\n return false;\n }\n return true;\n }\n\n const isReadable = async (path: string): Promise<boolean> => {\n try {\n await fs.promises.access(path, fs.constants.R_OK);\n } catch (error: any) {\n log(`${path} is not readable: %s %s`, error.message, error.stack);\n return false;\n }\n return true;\n }\n\n const isWritable = async (path: string): Promise<boolean> => {\n try {\n await fs.promises.access(path, fs.constants.W_OK);\n } catch (error: any) {\n log(`${path} is not writable: %s %s`, error.message, error.stack);\n return false;\n }\n return true;\n }\n\n const isFileReadable = async (path: string): Promise<boolean> => {\n return await exists(path) && await isFile(path) && await isReadable(path);\n }\n\n const isDirectoryWritable = async (path: string): Promise<boolean> => {\n return await exists(path) && await isDirectory(path) && await isWritable(path);\n }\n\n const isDirectoryReadable = async (path: string): Promise<boolean> => {\n return await exists(path) && await isDirectory(path) && await isReadable(path);\n }\n\n const createDirectory = async (path: string): Promise<void> => {\n try {\n await fs.promises.mkdir(path, { recursive: true });\n } catch (mkdirError: any) {\n throw new Error(`Failed to create output directory ${path}: ${mkdirError.message} ${mkdirError.stack}`);\n }\n }\n\n const readFile = async (path: string, encoding: string): Promise<string> => {\n return await fs.promises.readFile(path, { encoding: encoding as BufferEncoding });\n }\n\n const writeFile = async (path: string, data: string | Buffer, encoding: string): Promise<void> => {\n await fs.promises.writeFile(path, data, { encoding: encoding as BufferEncoding });\n }\n\n const forEachFileIn = async (directory: string, callback: (file: string) => Promise<void>, options: { pattern: string | string[] } = { pattern: '*.*' }): Promise<void> => {\n try {\n const files = await glob(options.pattern, { cwd: directory, nodir: true });\n for (const file of files) {\n await callback(path.join(directory, file));\n }\n } catch (err: any) {\n throw new Error(`Failed to glob pattern ${options.pattern} in ${directory}: ${err.message}`);\n }\n }\n\n const readStream = async (path: string): Promise<fs.ReadStream> => {\n return fs.createReadStream(path);\n }\n\n const hashFile = async (path: string, length: number): Promise<string> => {\n const file = await readFile(path, 'utf8');\n return crypto.createHash('sha256').update(file).digest('hex').slice(0, length);\n }\n\n const listFiles = async (directory: string): Promise<string[]> => {\n return await fs.promises.readdir(directory);\n }\n\n return {\n exists,\n isDirectory,\n isFile,\n isReadable,\n isWritable,\n isFileReadable,\n isDirectoryWritable,\n isDirectoryReadable,\n createDirectory,\n readFile,\n readStream,\n writeFile,\n forEachFileIn,\n hashFile,\n listFiles,\n };\n}"],"names":["level","path"],"mappings":"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"}
|