@eldrforge/kodrdriv 0.0.19 → 0.0.24
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/arguments.js +664 -0
- package/dist/arguments.js.map +1 -0
- package/dist/commands/audio-commit.js +99 -0
- package/dist/commands/audio-commit.js.map +1 -0
- package/dist/commands/audio-review.js +110 -0
- package/dist/commands/audio-review.js.map +1 -0
- package/dist/commands/clean.js +36 -0
- package/dist/commands/clean.js.map +1 -0
- package/dist/commands/commit.js +125 -0
- package/dist/commands/commit.js.map +1 -0
- package/dist/commands/link.js +184 -0
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/publish.js +301 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/release.js +85 -0
- package/dist/commands/release.js.map +1 -0
- package/dist/commands/review.js +268 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/select-audio.js +29 -0
- package/dist/commands/select-audio.js.map +1 -0
- package/dist/commands/unlink.js +180 -0
- package/dist/commands/unlink.js.map +1 -0
- package/dist/constants.js +154 -0
- package/dist/constants.js.map +1 -0
- package/dist/content/diff.js +220 -0
- package/dist/content/diff.js.map +1 -0
- package/dist/content/issues.js +360 -0
- package/dist/content/issues.js.map +1 -0
- package/dist/content/log.js +53 -0
- package/dist/content/log.js.map +1 -0
- package/dist/content/releaseNotes.js +90 -0
- package/dist/content/releaseNotes.js.map +1 -0
- package/dist/error/ExitError.js +9 -0
- package/dist/error/ExitError.js.map +1 -0
- package/dist/logging.js +103 -0
- package/dist/logging.js.map +1 -0
- package/dist/main.js +30 -3707
- package/dist/main.js.map +1 -1
- package/dist/prompt/commit.js +56 -0
- package/dist/prompt/commit.js.map +1 -0
- package/dist/prompt/release.js +52 -0
- package/dist/prompt/release.js.map +1 -0
- package/dist/prompt/review.js +64 -0
- package/dist/prompt/review.js.map +1 -0
- package/dist/types.js +88 -0
- package/dist/types.js.map +1 -0
- package/dist/util/child.js +23 -0
- package/dist/util/child.js.map +1 -0
- package/dist/util/general.js +96 -0
- package/dist/util/general.js.map +1 -0
- package/dist/util/github.js +208 -0
- package/dist/util/github.js.map +1 -0
- package/dist/util/openai.js +146 -0
- package/dist/util/openai.js.map +1 -0
- package/dist/util/stdin.js +101 -0
- package/dist/util/stdin.js.map +1 -0
- package/dist/util/storage.js +149 -0
- package/dist/util/storage.js.map +1 -0
- package/package.json +5 -5
- /package/dist/{src/prompt → prompt}/instructions/commit.md +0 -0
- /package/dist/{src/prompt → prompt}/instructions/release.md +0 -0
- /package/dist/{src/prompt → prompt}/instructions/review.md +0 -0
- /package/dist/{src/prompt → prompt}/personas/releaser.md +0 -0
- /package/dist/{src/prompt → prompt}/personas/you.md +0 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { getLogger } from '../logging.js';
|
|
2
|
+
import { getOctokit, getRepoDetails } from '../util/github.js';
|
|
3
|
+
|
|
4
|
+
// Function to truncate overly large content while preserving structure
|
|
5
|
+
const truncateContent = (content, maxLength = 3000)=>{
|
|
6
|
+
if (content.length <= maxLength) {
|
|
7
|
+
return content;
|
|
8
|
+
}
|
|
9
|
+
const lines = content.split('\n');
|
|
10
|
+
const truncatedLines = [];
|
|
11
|
+
let currentLength = 0;
|
|
12
|
+
for (const line of lines){
|
|
13
|
+
if (currentLength + line.length + 1 > maxLength) {
|
|
14
|
+
break;
|
|
15
|
+
}
|
|
16
|
+
truncatedLines.push(line);
|
|
17
|
+
currentLength += line.length + 1; // +1 for newline
|
|
18
|
+
}
|
|
19
|
+
truncatedLines.push('');
|
|
20
|
+
truncatedLines.push(`... [TRUNCATED: Original content was ${content.length} characters, showing first ${currentLength}] ...`);
|
|
21
|
+
return truncatedLines.join('\n');
|
|
22
|
+
};
|
|
23
|
+
// Function to fetch recent releases from GitHub API
|
|
24
|
+
const findRecentReleaseNotes = async (limit)=>{
|
|
25
|
+
const logger = getLogger();
|
|
26
|
+
const releaseNotes = [];
|
|
27
|
+
if (limit <= 0) {
|
|
28
|
+
return releaseNotes;
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
const octokit = getOctokit();
|
|
32
|
+
const { owner, repo } = await getRepoDetails();
|
|
33
|
+
logger.debug(`Fetching up to ${limit} recent releases from GitHub...`);
|
|
34
|
+
const response = await octokit.repos.listReleases({
|
|
35
|
+
owner,
|
|
36
|
+
repo,
|
|
37
|
+
per_page: Math.min(limit, 100)
|
|
38
|
+
});
|
|
39
|
+
const releases = response.data;
|
|
40
|
+
if (releases.length === 0) {
|
|
41
|
+
logger.debug('No releases found in GitHub repository');
|
|
42
|
+
return releaseNotes;
|
|
43
|
+
}
|
|
44
|
+
for (const release of releases.slice(0, limit)){
|
|
45
|
+
const releaseContent = [
|
|
46
|
+
`# ${release.name || release.tag_name}`,
|
|
47
|
+
`**Tag:** ${release.tag_name}`,
|
|
48
|
+
`**Published:** ${release.published_at}`,
|
|
49
|
+
release.prerelease ? '**Type:** Pre-release' : '**Type:** Release',
|
|
50
|
+
release.draft ? '**Status:** Draft' : '**Status:** Published',
|
|
51
|
+
'',
|
|
52
|
+
release.body || 'No release notes provided'
|
|
53
|
+
].join('\n');
|
|
54
|
+
const truncatedContent = truncateContent(releaseContent);
|
|
55
|
+
releaseNotes.push(`=== GitHub Release: ${release.tag_name} ===\n${truncatedContent}`);
|
|
56
|
+
if (truncatedContent.length < releaseContent.length) {
|
|
57
|
+
logger.debug(`Found release ${release.tag_name} (%d characters, truncated from %d)`, truncatedContent.length, releaseContent.length);
|
|
58
|
+
} else {
|
|
59
|
+
logger.debug(`Found release ${release.tag_name} (%d characters)`, releaseContent.length);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
logger.debug(`Fetched ${releaseNotes.length} releases from GitHub`);
|
|
63
|
+
} catch (error) {
|
|
64
|
+
logger.warn('Error fetching releases from GitHub API: %s', error.message);
|
|
65
|
+
// If we have a GitHub API error, we could fall back to checking for local release notes
|
|
66
|
+
// This maintains some backward compatibility
|
|
67
|
+
logger.debug('Falling back to local RELEASE_NOTES.md file...');
|
|
68
|
+
try {
|
|
69
|
+
const fs = await import('fs/promises');
|
|
70
|
+
const content = await fs.readFile('RELEASE_NOTES.md', 'utf-8');
|
|
71
|
+
if (content.trim()) {
|
|
72
|
+
const truncatedContent = truncateContent(content);
|
|
73
|
+
releaseNotes.push(`=== Local RELEASE_NOTES.md ===\n${truncatedContent}`);
|
|
74
|
+
logger.debug(`Found local release notes (%d characters)`, content.length);
|
|
75
|
+
}
|
|
76
|
+
} catch {
|
|
77
|
+
// No local file either, return empty array
|
|
78
|
+
logger.debug('No local RELEASE_NOTES.md file found either');
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return releaseNotes.slice(0, limit);
|
|
82
|
+
};
|
|
83
|
+
const get = async (options = {})=>{
|
|
84
|
+
const { limit = 3 } = options;
|
|
85
|
+
const releaseNotes = await findRecentReleaseNotes(limit);
|
|
86
|
+
return releaseNotes.join('\n\n');
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
export { findRecentReleaseNotes, get };
|
|
90
|
+
//# sourceMappingURL=releaseNotes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"releaseNotes.js","sources":["../../src/content/releaseNotes.ts"],"sourcesContent":["import { getLogger } from '../logging';\nimport { getOctokit, getRepoDetails } from '../util/github';\n\n// Function to truncate overly large content while preserving structure\nconst truncateContent = (content: string, maxLength: number = 3000): string => {\n if (content.length <= maxLength) {\n return content;\n }\n\n const lines = content.split('\\n');\n const truncatedLines: string[] = [];\n let currentLength = 0;\n\n for (const line of lines) {\n if (currentLength + line.length + 1 > maxLength) {\n break;\n }\n truncatedLines.push(line);\n currentLength += line.length + 1; // +1 for newline\n }\n\n truncatedLines.push('');\n truncatedLines.push(`... [TRUNCATED: Original content was ${content.length} characters, showing first ${currentLength}] ...`);\n\n return truncatedLines.join('\\n');\n};\n\n// Function to fetch recent releases from GitHub API\nexport const findRecentReleaseNotes = async (limit: number): Promise<string[]> => {\n const logger = getLogger();\n const releaseNotes: string[] = [];\n\n if (limit <= 0) {\n return releaseNotes;\n }\n\n try {\n const octokit = getOctokit();\n const { owner, repo } = await getRepoDetails();\n\n logger.debug(`Fetching up to ${limit} recent releases from GitHub...`);\n\n const response = await octokit.repos.listReleases({\n owner,\n repo,\n per_page: Math.min(limit, 100), // GitHub API limit\n });\n\n const releases = response.data;\n\n if (releases.length === 0) {\n logger.debug('No releases found in GitHub repository');\n return releaseNotes;\n }\n\n for (const release of releases.slice(0, limit)) {\n const releaseContent = [\n `# ${release.name || release.tag_name}`,\n `**Tag:** ${release.tag_name}`,\n `**Published:** ${release.published_at}`,\n release.prerelease ? '**Type:** Pre-release' : '**Type:** Release',\n release.draft ? '**Status:** Draft' : '**Status:** Published',\n '',\n release.body || 'No release notes provided'\n ].join('\\n');\n\n const truncatedContent = truncateContent(releaseContent);\n releaseNotes.push(`=== GitHub Release: ${release.tag_name} ===\\n${truncatedContent}`);\n\n if (truncatedContent.length < releaseContent.length) {\n logger.debug(`Found release ${release.tag_name} (%d characters, truncated from %d)`,\n truncatedContent.length, releaseContent.length);\n } else {\n logger.debug(`Found release ${release.tag_name} (%d characters)`, releaseContent.length);\n }\n }\n\n logger.debug(`Fetched ${releaseNotes.length} releases from GitHub`);\n\n } catch (error: any) {\n logger.warn('Error fetching releases from GitHub API: %s', error.message);\n\n // If we have a GitHub API error, we could fall back to checking for local release notes\n // This maintains some backward compatibility\n logger.debug('Falling back to local RELEASE_NOTES.md file...');\n try {\n const fs = await import('fs/promises');\n const content = await fs.readFile('RELEASE_NOTES.md', 'utf-8');\n if (content.trim()) {\n const truncatedContent = truncateContent(content);\n releaseNotes.push(`=== Local RELEASE_NOTES.md ===\\n${truncatedContent}`);\n logger.debug(`Found local release notes (%d characters)`, content.length);\n }\n } catch {\n // No local file either, return empty array\n logger.debug('No local RELEASE_NOTES.md file found either');\n }\n }\n\n return releaseNotes.slice(0, limit);\n};\n\nexport const get = async (options: { limit?: number } = {}): Promise<string> => {\n const { limit = 3 } = options;\n const releaseNotes = await findRecentReleaseNotes(limit);\n return releaseNotes.join('\\n\\n');\n}; "],"names":["truncateContent","content","maxLength","length","lines","split","truncatedLines","currentLength","line","push","join","findRecentReleaseNotes","limit","logger","getLogger","releaseNotes","octokit","getOctokit","owner","repo","getRepoDetails","debug","response","repos","listReleases","per_page","Math","min","releases","data","release","slice","releaseContent","name","tag_name","published_at","prerelease","draft","body","truncatedContent","error","warn","message","fs","readFile","trim","get","options"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExitError.js","sources":["../../src/error/ExitError.ts"],"sourcesContent":["export class ExitError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ExitError';\n }\n}\n"],"names":["ExitError","Error","message","name"],"mappings":"AAAO,MAAMA,SAAAA,SAAkBC,KAAAA,CAAAA;AAC3B,IAAA,WAAA,CAAYC,OAAe,CAAE;AACzB,QAAA,KAAK,CAACA,OAAAA,CAAAA;QACN,IAAI,CAACC,IAAI,GAAG,WAAA;AAChB,IAAA;AACJ;;;;"}
|
package/dist/logging.js
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import winston from 'winston';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { PROGRAM_NAME, DEFAULT_OUTPUT_DIRECTORY, DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS } from './constants.js';
|
|
5
|
+
|
|
6
|
+
// Track if debug directory has been ensured for this session
|
|
7
|
+
let debugDirectoryEnsured = false;
|
|
8
|
+
const ensureDebugDirectory = ()=>{
|
|
9
|
+
if (debugDirectoryEnsured) return;
|
|
10
|
+
const debugDir = path.join(DEFAULT_OUTPUT_DIRECTORY, 'debug');
|
|
11
|
+
try {
|
|
12
|
+
fs.mkdirSync(debugDir, {
|
|
13
|
+
recursive: true
|
|
14
|
+
});
|
|
15
|
+
debugDirectoryEnsured = true;
|
|
16
|
+
} catch (error) {
|
|
17
|
+
// eslint-disable-next-line no-console
|
|
18
|
+
console.error(`Failed to create debug directory ${debugDir}:`, error);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
const generateDebugLogFilename = ()=>{
|
|
22
|
+
const now = new Date();
|
|
23
|
+
const timestamp = now.toISOString().replace(/[-:]/g, '').replace(/\./g, '').replace('T', '-').replace('Z', '');
|
|
24
|
+
return `${timestamp}-debug.log`;
|
|
25
|
+
};
|
|
26
|
+
const createTransports = (level)=>{
|
|
27
|
+
const transports = [];
|
|
28
|
+
// Always add console transport for info level and above
|
|
29
|
+
if (level === 'info') {
|
|
30
|
+
transports.push(new winston.transports.Console({
|
|
31
|
+
format: winston.format.combine(winston.format.colorize(), winston.format.printf(({ level, message })=>{
|
|
32
|
+
return `${level}: ${message}`;
|
|
33
|
+
}))
|
|
34
|
+
}));
|
|
35
|
+
} else {
|
|
36
|
+
// For debug/verbose levels, add console transport that shows info and above
|
|
37
|
+
transports.push(new winston.transports.Console({
|
|
38
|
+
level: 'info',
|
|
39
|
+
format: winston.format.combine(winston.format.colorize(), winston.format.printf(({ timestamp, level, message, ...meta })=>{
|
|
40
|
+
// For info level messages, use simpler format without timestamp
|
|
41
|
+
if (level.includes('info')) {
|
|
42
|
+
return String(message);
|
|
43
|
+
}
|
|
44
|
+
const metaStr = Object.keys(meta).length ? ` ${JSON.stringify(meta)}` : '';
|
|
45
|
+
return `${timestamp} ${level}: ${String(message)}${metaStr}`;
|
|
46
|
+
}))
|
|
47
|
+
}));
|
|
48
|
+
// Add file transport for debug levels (debug and silly)
|
|
49
|
+
if (level === 'debug' || level === 'silly') {
|
|
50
|
+
ensureDebugDirectory();
|
|
51
|
+
const debugLogPath = path.join(DEFAULT_OUTPUT_DIRECTORY, 'debug', generateDebugLogFilename());
|
|
52
|
+
transports.push(new winston.transports.File({
|
|
53
|
+
filename: debugLogPath,
|
|
54
|
+
level: 'debug',
|
|
55
|
+
format: winston.format.combine(winston.format.timestamp({
|
|
56
|
+
format: DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS
|
|
57
|
+
}), winston.format.errors({
|
|
58
|
+
stack: true
|
|
59
|
+
}), winston.format.splat(), winston.format.printf(({ timestamp, level, message, ...meta })=>{
|
|
60
|
+
const metaStr = Object.keys(meta).length ? ` ${JSON.stringify(meta)}` : '';
|
|
61
|
+
return `${timestamp} ${level}: ${message}${metaStr}`;
|
|
62
|
+
}))
|
|
63
|
+
}));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return transports;
|
|
67
|
+
};
|
|
68
|
+
const createFormat = (level)=>{
|
|
69
|
+
if (level === 'info') {
|
|
70
|
+
return winston.format.combine(winston.format.errors({
|
|
71
|
+
stack: true
|
|
72
|
+
}), winston.format.splat());
|
|
73
|
+
}
|
|
74
|
+
return winston.format.combine(winston.format.timestamp({
|
|
75
|
+
format: DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS
|
|
76
|
+
}), winston.format.errors({
|
|
77
|
+
stack: true
|
|
78
|
+
}), winston.format.splat(), winston.format.json());
|
|
79
|
+
};
|
|
80
|
+
// Create the logger instance once
|
|
81
|
+
const logger = winston.createLogger({
|
|
82
|
+
level: 'info',
|
|
83
|
+
format: createFormat('info'),
|
|
84
|
+
defaultMeta: {
|
|
85
|
+
service: PROGRAM_NAME
|
|
86
|
+
},
|
|
87
|
+
transports: createTransports('info')
|
|
88
|
+
});
|
|
89
|
+
const setLogLevel = (level)=>{
|
|
90
|
+
// Reconfigure the existing logger instead of creating a new one
|
|
91
|
+
logger.configure({
|
|
92
|
+
level,
|
|
93
|
+
format: createFormat(level),
|
|
94
|
+
defaultMeta: {
|
|
95
|
+
service: PROGRAM_NAME
|
|
96
|
+
},
|
|
97
|
+
transports: createTransports(level)
|
|
98
|
+
});
|
|
99
|
+
};
|
|
100
|
+
const getLogger = ()=>logger;
|
|
101
|
+
|
|
102
|
+
export { getLogger, setLogLevel };
|
|
103
|
+
//# sourceMappingURL=logging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging.js","sources":["../src/logging.ts"],"sourcesContent":["import winston from 'winston';\n// eslint-disable-next-line no-restricted-imports\nimport * as fs from 'fs';\nimport path from 'path';\nimport { DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS, PROGRAM_NAME, DEFAULT_OUTPUT_DIRECTORY } from './constants';\n\nexport interface LogContext {\n [key: string]: any;\n}\n\n// Track if debug directory has been ensured for this session\nlet debugDirectoryEnsured = false;\n\nconst ensureDebugDirectory = () => {\n if (debugDirectoryEnsured) return;\n\n const debugDir = path.join(DEFAULT_OUTPUT_DIRECTORY, 'debug');\n\n try {\n fs.mkdirSync(debugDir, { recursive: true });\n debugDirectoryEnsured = true;\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(`Failed to create debug directory ${debugDir}:`, error);\n }\n};\n\nconst generateDebugLogFilename = () => {\n const now = new Date();\n const timestamp = now.toISOString()\n .replace(/[-:]/g, '')\n .replace(/\\./g, '')\n .replace('T', '-')\n .replace('Z', '');\n\n return `${timestamp}-debug.log`;\n};\n\nconst createTransports = (level: string) => {\n const transports: winston.transport[] = [];\n\n // Always add console transport for info level and above\n if (level === 'info') {\n transports.push(\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 } else {\n // For debug/verbose levels, add console transport that shows info and above\n transports.push(\n new winston.transports.Console({\n level: 'info', // Show info, warn, and error on console\n format: winston.format.combine(\n winston.format.colorize(),\n winston.format.printf(({ timestamp, level, message, ...meta }): string => {\n // For info level messages, use simpler format without timestamp\n if (level.includes('info')) {\n return String(message);\n }\n const metaStr = Object.keys(meta).length ? ` ${JSON.stringify(meta)}` : '';\n return `${timestamp} ${level}: ${String(message)}${metaStr}`;\n })\n )\n })\n );\n\n // Add file transport for debug levels (debug and silly)\n if (level === 'debug' || level === 'silly') {\n ensureDebugDirectory();\n\n const debugLogPath = path.join(DEFAULT_OUTPUT_DIRECTORY, 'debug', generateDebugLogFilename());\n\n transports.push(\n new winston.transports.File({\n filename: debugLogPath,\n level: 'debug', // Capture debug and above in the file\n format: winston.format.combine(\n winston.format.timestamp({ format: DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS }),\n winston.format.errors({ stack: true }),\n winston.format.splat(),\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 }\n\n return transports;\n};\n\nconst createFormat = (level: string) => {\n if (level === 'info') {\n return winston.format.combine(\n winston.format.errors({ stack: true }),\n winston.format.splat(),\n );\n }\n\n return winston.format.combine(\n winston.format.timestamp({ format: DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS }),\n winston.format.errors({ stack: true }),\n winston.format.splat(),\n winston.format.json()\n );\n};\n\n// Create the logger instance once\nconst logger = winston.createLogger({\n level: 'info',\n format: createFormat('info'),\n defaultMeta: { service: PROGRAM_NAME },\n transports: createTransports('info'),\n});\n\nexport const setLogLevel = (level: string) => {\n // Reconfigure the existing logger instead of creating a new one\n logger.configure({\n level,\n format: createFormat(level),\n defaultMeta: { service: PROGRAM_NAME },\n transports: createTransports(level),\n });\n};\n\nexport const getLogger = () => logger; "],"names":["debugDirectoryEnsured","ensureDebugDirectory","debugDir","path","join","DEFAULT_OUTPUT_DIRECTORY","fs","mkdirSync","recursive","error","console","generateDebugLogFilename","now","Date","timestamp","toISOString","replace","createTransports","level","transports","push","winston","Console","format","combine","colorize","printf","message","meta","includes","String","metaStr","Object","keys","length","JSON","stringify","debugLogPath","File","filename","DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS","errors","stack","splat","createFormat","json","logger","createLogger","defaultMeta","service","PROGRAM_NAME","setLogLevel","configure","getLogger"],"mappings":"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"}
|