@evalops/maestro 0.10.16 → 0.10.17
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/agent/providers/google-gemini-cli.js +3 -5
- package/dist/agent/providers/google.js +3 -5
- package/dist/agent/providers/vertex.js +3 -5
- package/dist/cli.js +305 -292
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +31 -10
- package/dist/main.js.map +1 -1
- package/dist/utils/logger.d.ts +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +3 -5
- package/dist/utils/logger.js.map +1 -1
- package/dist/version.json +2 -2
- package/node_modules/@evalops/contracts/package.json +1 -1
- package/node_modules/@evalops/tui/package.json +1 -1
- package/package.json +3 -3
package/dist/utils/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAkC/C,MAAM,eAAe,GAAG;IACvB,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;IAC9B,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;IAChC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;IAChC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;IAClC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;CAClC,CAAC;AAEF,MAAM,UAAU,GAA6B;IAC5C,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACR,CAAC;AAEF,MAAM,MAAM;IAGX,YAAY,MAA8B;QACzC,IAAI,CAAC,MAAM,GAAG;YACb,QAAQ,EAAG,OAAO,CAAC,GAAG,CAAC,iBAA8B,IAAI,MAAM;YAC/D,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,GAAG;YAChD,UAAU,EAAE,IAAI;YAChB,GAAG,MAAM;SACT,CAAC;IACH,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,KAAe;QAChC,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC9D,CAAC;IAED;;OAEG;IACK,GAAG,CACV,KAAe,EACf,OAAe,EACf,OAAoB,EACpB,KAAa;QAEb,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;YAAE,OAAO;QAEnC,MAAM,KAAK,GAAa;YACvB,KAAK;YACL,OAAO;YACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,OAAO;YACP,KAAK,EAAE,KAAK;gBACX,CAAC,CAAC;oBACA,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,KAAK,EAAE,KAAK,CAAC,KAAK;iBAClB;gBACF,CAAC,CAAC,SAAS;SACZ,CAAC;QAEF,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC1B,OAAO;QACR,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YAC5B,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;IACF,CAAC;IAED;;OAEG;IACK,UAAU,CAAC,KAAe;QACjC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;QACrE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,KAAe;QACnC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;QACrE,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;QACpC,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAE1B,IAAI,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5D,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3C,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAExB,IAAI,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;YACxB,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;IACF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAe,EAAE,OAAoB;QAC1C,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,OAAe,EAAE,OAAoB;QACzC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,OAAe,EAAE,OAAoB;QACzC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAe,EAAE,KAAa,EAAE,OAAoB;QACzD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAA6B;QAClC,OAAO,IAAI,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;IACtD,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,MAA6B;QACtC,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;IAC7C,CAAC;CACD;AAED;;GAEG;AACH,MAAM,gBAAiB,SAAQ,MAAM;IACpC,YACS,MAAc,EACd,WAAuB;QAE/B,KAAK,EAAE,CAAC;QAHA,WAAM,GAAN,MAAM,CAAQ;QACd,gBAAW,GAAX,WAAW,CAAY;IAGhC,CAAC;IAEO,YAAY,CAAC,OAAoB;QACxC,OAAO,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,OAAO,EAAE,CAAC;IAC5C,CAAC;IAEQ,KAAK,CAAC,OAAe,EAAE,OAAoB;QACnD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IACxD,CAAC;IAEQ,IAAI,CAAC,OAAe,EAAE,OAAoB;QAClD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IACvD,CAAC;IAEQ,IAAI,CAAC,OAAe,EAAE,OAAoB;QAClD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IACvD,CAAC;IAEQ,KAAK,CAAC,OAAe,EAAE,KAAa,EAAE,OAAoB;QAClE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/D,CAAC;CACD;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;AAEnC;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,UAAkB;IAC9C,OAAO,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC5B,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,CAAC;AACxC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAiB;IACrD,MAAM,OAAO,GAAG,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;IAE5E,0BAA0B;IAC1B,IAAI,CAAC;QACJ,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACR,8BAA8B;IAC/B,CAAC;IAED,MAAM,CAAC,SAAS,CAAC;QAChB,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACjB,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;YAC7C,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAE1B,IAAI,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5D,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YAC3C,CAAC;YAED,IAAI,IAAI,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAElC,IAAI,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;gBACxB,IAAI,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;YAClC,CAAC;YAED,IAAI,CAAC;gBACJ,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC/B,CAAC;YAAC,MAAM,CAAC;gBACR,kDAAkD;YACnD,CAAC;QACF,CAAC;KACD,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAEvC;IACA,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;QACpC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC;IACF,OAAO,CAAC,IAAI,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;QACrC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC;IACF,OAAO,CAAC,IAAI,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;QACrC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC;IACF,OAAO,CAAC,KAAK,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;QACtC,IAAI,OAAO,EAAE,mBAAmB,EAAE,CAAC;YAClC,eAAe,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YAC/B,OAAO;QACR,CAAC;QACD,wCAAwC;QACxC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,KAAK,CAE1C,CAAC;QACb,IAAI,UAAU,EAAE,CAAC;YAChB,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACP,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1C,CAAC;IACF,CAAC,CAAC;IACF,OAAO,CAAC,KAAK,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;QACtC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB;IACrC,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,KAAc,EAAE,EAAE;QACzC,MAAM,IAAI,GACT,OAAO,KAAK,KAAK,QAAQ;YACxB,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,KAAK,YAAY,MAAM;gBACxB,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE;gBAClB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IACb,CAAC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB;IACxC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE;QACjC,MAAM,CAAC,IAAI,CACV,GAAG,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,OAAO,GAClC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EACxC,EAAE,CACF,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;QACpD,MAAM,CAAC,KAAK,CACX,uBAAuB,MAAM,CAAC,MAAM,CAAC,cAAc,MAAM,CAAC,OAAO,CAAC,GAAG,CACrE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE;QACzC,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC5B,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACP,MAAM,CAAC,KAAK,CAAC,sBAAsB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACrD,CAAC;IACF,CAAC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Structured logging service for Composer CLI.\n * Replaces scattered console.log/error calls with centralized, level-based logging.\n */\n\nimport { appendFileSync, mkdirSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { PATHS } from \"../config/constants.js\";\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport interface LogContext {\n\t[key: string]: unknown;\n}\n\ninterface LogEntry {\n\tlevel: LogLevel;\n\tmessage: string;\n\ttimestamp: string;\n\tcontext?: LogContext;\n\terror?: {\n\t\tname: string;\n\t\tmessage: string;\n\t\tstack?: string;\n\t};\n}\n\n/**\n * Logger configuration\n */\ninterface LoggerConfig {\n\t/** Minimum log level to output (debug < info < warn < error) */\n\tminLevel: LogLevel;\n\t/** Whether to output JSON format (useful for log aggregation) */\n\tjsonFormat: boolean;\n\t/** Whether to include timestamps */\n\ttimestamps: boolean;\n\t/** Custom output function (defaults to console) */\n\toutput?: (entry: LogEntry) => void;\n}\n\nconst originalConsole = {\n\tlog: console.log.bind(console),\n\tinfo: console.info.bind(console),\n\twarn: console.warn.bind(console),\n\terror: console.error.bind(console),\n\tdebug: console.debug.bind(console),\n};\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n\tdebug: 0,\n\tinfo: 1,\n\twarn: 2,\n\terror: 3,\n};\n\nclass Logger {\n\tprivate config: LoggerConfig;\n\n\tconstructor(config?: Partial<LoggerConfig>) {\n\t\tthis.config = {\n\t\t\tminLevel: (process.env.MAESTRO_LOG_LEVEL as LogLevel) ?? \"info\",\n\t\t\tjsonFormat: process.env.MAESTRO_LOG_JSON === \"1\",\n\t\t\ttimestamps: true,\n\t\t\t...config,\n\t\t};\n\t}\n\n\t/**\n\t * Check if a log level should be output\n\t */\n\tprivate shouldLog(level: LogLevel): boolean {\n\t\treturn LOG_LEVELS[level] >= LOG_LEVELS[this.config.minLevel];\n\t}\n\n\t/**\n\t * Format and output a log entry\n\t */\n\tprivate log(\n\t\tlevel: LogLevel,\n\t\tmessage: string,\n\t\tcontext?: LogContext,\n\t\terror?: Error,\n\t): void {\n\t\tif (!this.shouldLog(level)) return;\n\n\t\tconst entry: LogEntry = {\n\t\t\tlevel,\n\t\t\tmessage,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tcontext,\n\t\t\terror: error\n\t\t\t\t? {\n\t\t\t\t\t\tname: error.name,\n\t\t\t\t\t\tmessage: error.message,\n\t\t\t\t\t\tstack: error.stack,\n\t\t\t\t\t}\n\t\t\t\t: undefined,\n\t\t};\n\n\t\tif (this.config.output) {\n\t\t\tthis.config.output(entry);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.config.jsonFormat) {\n\t\t\tthis.outputJson(entry);\n\t\t} else {\n\t\t\tthis.outputPretty(entry);\n\t\t}\n\t}\n\n\t/**\n\t * Output as JSON (for log aggregation systems)\n\t */\n\tprivate outputJson(entry: LogEntry): void {\n\t\tconst output = entry.level === \"error\" ? console.error : console.log;\n\t\toutput(JSON.stringify(entry));\n\t}\n\n\t/**\n\t * Output as human-readable format\n\t */\n\tprivate outputPretty(entry: LogEntry): void {\n\t\tconst output = entry.level === \"error\" ? console.error : console.log;\n\t\tconst parts: string[] = [];\n\n\t\tif (this.config.timestamps) {\n\t\t\tparts.push(`[${entry.timestamp}]`);\n\t\t}\n\n\t\tparts.push(`[${entry.level.toUpperCase()}]`);\n\t\tparts.push(entry.message);\n\n\t\tif (entry.context && Object.keys(entry.context).length > 0) {\n\t\t\tparts.push(JSON.stringify(entry.context));\n\t\t}\n\n\t\toutput(parts.join(\" \"));\n\n\t\tif (entry.error?.stack) {\n\t\t\toutput(entry.error.stack);\n\t\t}\n\t}\n\n\t/**\n\t * Log debug message (verbose, typically for development)\n\t */\n\tdebug(message: string, context?: LogContext): void {\n\t\tthis.log(\"debug\", message, context);\n\t}\n\n\t/**\n\t * Log info message (general information)\n\t */\n\tinfo(message: string, context?: LogContext): void {\n\t\tthis.log(\"info\", message, context);\n\t}\n\n\t/**\n\t * Log warning message (potentially problematic situations)\n\t */\n\twarn(message: string, context?: LogContext): void {\n\t\tthis.log(\"warn\", message, context);\n\t}\n\n\t/**\n\t * Log error message (failures and exceptions)\n\t */\n\terror(message: string, error?: Error, context?: LogContext): void {\n\t\tthis.log(\"error\", message, context, error);\n\t}\n\n\t/**\n\t * Create a child logger with additional context\n\t */\n\tchild(additionalContext: LogContext): Logger {\n\t\treturn new ContextualLogger(this, additionalContext);\n\t}\n\n\t/**\n\t * Update logger configuration\n\t */\n\tconfigure(config: Partial<LoggerConfig>): void {\n\t\tthis.config = { ...this.config, ...config };\n\t}\n}\n\n/**\n * Logger that automatically includes context in all log calls\n */\nclass ContextualLogger extends Logger {\n\tconstructor(\n\t\tprivate parent: Logger,\n\t\tprivate contextData: LogContext,\n\t) {\n\t\tsuper();\n\t}\n\n\tprivate mergeContext(context?: LogContext): LogContext {\n\t\treturn { ...this.contextData, ...context };\n\t}\n\n\toverride debug(message: string, context?: LogContext): void {\n\t\tthis.parent.debug(message, this.mergeContext(context));\n\t}\n\n\toverride info(message: string, context?: LogContext): void {\n\t\tthis.parent.info(message, this.mergeContext(context));\n\t}\n\n\toverride warn(message: string, context?: LogContext): void {\n\t\tthis.parent.warn(message, this.mergeContext(context));\n\t}\n\n\toverride error(message: string, error?: Error, context?: LogContext): void {\n\t\tthis.parent.error(message, error, this.mergeContext(context));\n\t}\n}\n\n/**\n * Global logger instance\n */\nexport const logger = new Logger();\n\n/**\n * Create a logger for a specific module/component\n */\nexport function createLogger(moduleName: string): Logger {\n\treturn logger.child({ module: moduleName });\n}\n\n/**\n * Silence the logger (useful for TUI mode where stdout must not be polluted)\n */\nexport function silenceLogger(): void {\n\tlogger.configure({ output: () => {} });\n}\n\n/**\n * Redirect all logs to a file (useful for TUI mode)\n * @param filePath - Path to the log file (defaults to ~/.maestro/logs/maestro.log)\n */\nexport function redirectLoggerToFile(filePath?: string): void {\n\tconst logFile = filePath ?? join(PATHS.MAESTRO_HOME, \"logs\", \"maestro.log\");\n\n\t// Ensure directory exists\n\ttry {\n\t\tmkdirSync(dirname(logFile), { recursive: true });\n\t} catch {\n\t\t// Directory may already exist\n\t}\n\n\tlogger.configure({\n\t\toutput: (entry) => {\n\t\t\tconst parts: string[] = [];\n\t\t\tparts.push(`[${entry.timestamp}]`);\n\t\t\tparts.push(`[${entry.level.toUpperCase()}]`);\n\t\t\tparts.push(entry.message);\n\n\t\t\tif (entry.context && Object.keys(entry.context).length > 0) {\n\t\t\t\tparts.push(JSON.stringify(entry.context));\n\t\t\t}\n\n\t\t\tlet line = `${parts.join(\" \")}\\n`;\n\n\t\t\tif (entry.error?.stack) {\n\t\t\t\tline += `${entry.error.stack}\\n`;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tappendFileSync(logFile, line);\n\t\t\t} catch {\n\t\t\t\t// Silently fail if we can't write to the log file\n\t\t\t}\n\t\t},\n\t});\n}\n\n/**\n * Redirect global console methods to the structured logger.\n *\n * Important: Call this only after redirectLoggerToFile() (or a custom logger\n * output) has been configured; otherwise console.* would route back to the\n * console-backed logger output and recurse.\n */\nexport function redirectConsoleToLogger(options?: {\n\tpreserveErrorStderr?: boolean;\n}): void {\n\tconsole.log = (...args: unknown[]) => {\n\t\tlogger.info(args.map(String).join(\" \"));\n\t};\n\tconsole.info = (...args: unknown[]) => {\n\t\tlogger.info(args.map(String).join(\" \"));\n\t};\n\tconsole.warn = (...args: unknown[]) => {\n\t\tlogger.warn(args.map(String).join(\" \"));\n\t};\n\tconsole.error = (...args: unknown[]) => {\n\t\tif (options?.preserveErrorStderr) {\n\t\t\toriginalConsole.error(...args);\n\t\t\treturn;\n\t\t}\n\t\t// Preserve first Error stack if present\n\t\tconst maybeError = args.find((a) => a instanceof Error) as\n\t\t\t| Error\n\t\t\t| undefined;\n\t\tif (maybeError) {\n\t\t\tlogger.error(maybeError.message, maybeError);\n\t\t} else {\n\t\t\tlogger.error(args.map(String).join(\" \"));\n\t\t}\n\t};\n\tconsole.debug = (...args: unknown[]) => {\n\t\tlogger.debug(args.map(String).join(\" \"));\n\t};\n}\n\n/**\n * Redirect process.stderr writes to the structured logger.\n * Useful in TUI mode to prevent third-party libraries from corrupting the terminal.\n */\nexport function redirectStderrToLogger(): void {\n\tprocess.stderr.write = (chunk: unknown) => {\n\t\tconst text =\n\t\t\ttypeof chunk === \"string\"\n\t\t\t\t? chunk\n\t\t\t\t: chunk instanceof Buffer\n\t\t\t\t\t? chunk.toString()\n\t\t\t\t\t: String(chunk);\n\t\tlogger.error(text.trimEnd());\n\t\treturn true;\n\t};\n}\n\n/**\n * Wire process warning / rejection hooks into the logger so they don't hit stderr.\n */\nexport function pipeProcessEventsToLogger(): void {\n\tprocess.on(\"warning\", (warning) => {\n\t\tlogger.warn(\n\t\t\t`${warning.name}: ${warning.message}${\n\t\t\t\twarning.stack ? `\\n${warning.stack}` : \"\"\n\t\t\t}`,\n\t\t);\n\t});\n\n\tprocess.on(\"unhandledRejection\", (reason, promise) => {\n\t\tlogger.error(\n\t\t\t`UnhandledRejection: ${String(reason)} (promise: ${String(promise)})`,\n\t\t);\n\t});\n\n\tprocess.on(\"uncaughtException\", (error) => {\n\t\tif (error instanceof Error) {\n\t\t\tlogger.error(error.message, error);\n\t\t} else {\n\t\t\tlogger.error(`UncaughtException: ${String(error)}`);\n\t\t}\n\t});\n}\n"]}
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Structured logging service for Composer CLI.\n * Replaces scattered console.log/error calls with centralized, level-based logging.\n */\n\nimport { appendFileSync, mkdirSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { PATHS } from \"../config/constants.js\";\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport interface LogContext {\n\t[key: string]: unknown;\n}\n\ninterface LogEntry {\n\tlevel: LogLevel;\n\tmessage: string;\n\ttimestamp: string;\n\tcontext?: LogContext;\n\terror?: {\n\t\tname: string;\n\t\tmessage: string;\n\t\tstack?: string;\n\t};\n}\n\n/**\n * Logger configuration\n */\ninterface LoggerConfig {\n\t/** Minimum log level to output (debug < info < warn < error) */\n\tminLevel: LogLevel;\n\t/** Whether to output JSON format (useful for log aggregation) */\n\tjsonFormat: boolean;\n\t/** Whether to include timestamps */\n\ttimestamps: boolean;\n\t/** Custom output function (defaults to stderr) */\n\toutput?: (entry: LogEntry) => void;\n}\n\nconst originalConsole = {\n\tlog: console.log.bind(console),\n\tinfo: console.info.bind(console),\n\twarn: console.warn.bind(console),\n\terror: console.error.bind(console),\n\tdebug: console.debug.bind(console),\n};\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n\tdebug: 0,\n\tinfo: 1,\n\twarn: 2,\n\terror: 3,\n};\n\nclass Logger {\n\tprivate config: LoggerConfig;\n\n\tconstructor(config?: Partial<LoggerConfig>) {\n\t\tthis.config = {\n\t\t\tminLevel: (process.env.MAESTRO_LOG_LEVEL as LogLevel) ?? \"info\",\n\t\t\tjsonFormat: process.env.MAESTRO_LOG_JSON === \"1\",\n\t\t\ttimestamps: true,\n\t\t\t...config,\n\t\t};\n\t}\n\n\t/**\n\t * Check if a log level should be output\n\t */\n\tprivate shouldLog(level: LogLevel): boolean {\n\t\treturn LOG_LEVELS[level] >= LOG_LEVELS[this.config.minLevel];\n\t}\n\n\t/**\n\t * Format and output a log entry\n\t */\n\tprivate log(\n\t\tlevel: LogLevel,\n\t\tmessage: string,\n\t\tcontext?: LogContext,\n\t\terror?: Error,\n\t): void {\n\t\tif (!this.shouldLog(level)) return;\n\n\t\tconst entry: LogEntry = {\n\t\t\tlevel,\n\t\t\tmessage,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tcontext,\n\t\t\terror: error\n\t\t\t\t? {\n\t\t\t\t\t\tname: error.name,\n\t\t\t\t\t\tmessage: error.message,\n\t\t\t\t\t\tstack: error.stack,\n\t\t\t\t\t}\n\t\t\t\t: undefined,\n\t\t};\n\n\t\tif (this.config.output) {\n\t\t\tthis.config.output(entry);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.config.jsonFormat) {\n\t\t\tthis.outputJson(entry);\n\t\t} else {\n\t\t\tthis.outputPretty(entry);\n\t\t}\n\t}\n\n\t/**\n\t * Output as JSON (for log aggregation systems)\n\t */\n\tprivate outputJson(entry: LogEntry): void {\n\t\tconsole.error(JSON.stringify(entry));\n\t}\n\n\t/**\n\t * Output as human-readable format\n\t */\n\tprivate outputPretty(entry: LogEntry): void {\n\t\tconst parts: string[] = [];\n\n\t\tif (this.config.timestamps) {\n\t\t\tparts.push(`[${entry.timestamp}]`);\n\t\t}\n\n\t\tparts.push(`[${entry.level.toUpperCase()}]`);\n\t\tparts.push(entry.message);\n\n\t\tif (entry.context && Object.keys(entry.context).length > 0) {\n\t\t\tparts.push(JSON.stringify(entry.context));\n\t\t}\n\n\t\tconsole.error(parts.join(\" \"));\n\n\t\tif (entry.error?.stack) {\n\t\t\tconsole.error(entry.error.stack);\n\t\t}\n\t}\n\n\t/**\n\t * Log debug message (verbose, typically for development)\n\t */\n\tdebug(message: string, context?: LogContext): void {\n\t\tthis.log(\"debug\", message, context);\n\t}\n\n\t/**\n\t * Log info message (general information)\n\t */\n\tinfo(message: string, context?: LogContext): void {\n\t\tthis.log(\"info\", message, context);\n\t}\n\n\t/**\n\t * Log warning message (potentially problematic situations)\n\t */\n\twarn(message: string, context?: LogContext): void {\n\t\tthis.log(\"warn\", message, context);\n\t}\n\n\t/**\n\t * Log error message (failures and exceptions)\n\t */\n\terror(message: string, error?: Error, context?: LogContext): void {\n\t\tthis.log(\"error\", message, context, error);\n\t}\n\n\t/**\n\t * Create a child logger with additional context\n\t */\n\tchild(additionalContext: LogContext): Logger {\n\t\treturn new ContextualLogger(this, additionalContext);\n\t}\n\n\t/**\n\t * Update logger configuration\n\t */\n\tconfigure(config: Partial<LoggerConfig>): void {\n\t\tthis.config = { ...this.config, ...config };\n\t}\n}\n\n/**\n * Logger that automatically includes context in all log calls\n */\nclass ContextualLogger extends Logger {\n\tconstructor(\n\t\tprivate parent: Logger,\n\t\tprivate contextData: LogContext,\n\t) {\n\t\tsuper();\n\t}\n\n\tprivate mergeContext(context?: LogContext): LogContext {\n\t\treturn { ...this.contextData, ...context };\n\t}\n\n\toverride debug(message: string, context?: LogContext): void {\n\t\tthis.parent.debug(message, this.mergeContext(context));\n\t}\n\n\toverride info(message: string, context?: LogContext): void {\n\t\tthis.parent.info(message, this.mergeContext(context));\n\t}\n\n\toverride warn(message: string, context?: LogContext): void {\n\t\tthis.parent.warn(message, this.mergeContext(context));\n\t}\n\n\toverride error(message: string, error?: Error, context?: LogContext): void {\n\t\tthis.parent.error(message, error, this.mergeContext(context));\n\t}\n}\n\n/**\n * Global logger instance\n */\nexport const logger = new Logger();\n\n/**\n * Create a logger for a specific module/component\n */\nexport function createLogger(moduleName: string): Logger {\n\treturn logger.child({ module: moduleName });\n}\n\n/**\n * Silence the logger (useful for TUI mode where stdout must not be polluted)\n */\nexport function silenceLogger(): void {\n\tlogger.configure({ output: () => {} });\n}\n\n/**\n * Redirect all logs to a file (useful for TUI mode)\n * @param filePath - Path to the log file (defaults to ~/.maestro/logs/maestro.log)\n */\nexport function redirectLoggerToFile(filePath?: string): void {\n\tconst logFile = filePath ?? join(PATHS.MAESTRO_HOME, \"logs\", \"maestro.log\");\n\n\t// Ensure directory exists\n\ttry {\n\t\tmkdirSync(dirname(logFile), { recursive: true });\n\t} catch {\n\t\t// Directory may already exist\n\t}\n\n\tlogger.configure({\n\t\toutput: (entry) => {\n\t\t\tconst parts: string[] = [];\n\t\t\tparts.push(`[${entry.timestamp}]`);\n\t\t\tparts.push(`[${entry.level.toUpperCase()}]`);\n\t\t\tparts.push(entry.message);\n\n\t\t\tif (entry.context && Object.keys(entry.context).length > 0) {\n\t\t\t\tparts.push(JSON.stringify(entry.context));\n\t\t\t}\n\n\t\t\tlet line = `${parts.join(\" \")}\\n`;\n\n\t\t\tif (entry.error?.stack) {\n\t\t\t\tline += `${entry.error.stack}\\n`;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tappendFileSync(logFile, line);\n\t\t\t} catch {\n\t\t\t\t// Silently fail if we can't write to the log file\n\t\t\t}\n\t\t},\n\t});\n}\n\n/**\n * Redirect global console methods to the structured logger.\n *\n * Important: Call this only after redirectLoggerToFile() (or a custom logger\n * output) has been configured; otherwise console.* would route back to the\n * console-backed logger output and recurse.\n */\nexport function redirectConsoleToLogger(options?: {\n\tpreserveErrorStderr?: boolean;\n}): void {\n\tconsole.log = (...args: unknown[]) => {\n\t\tlogger.info(args.map(String).join(\" \"));\n\t};\n\tconsole.info = (...args: unknown[]) => {\n\t\tlogger.info(args.map(String).join(\" \"));\n\t};\n\tconsole.warn = (...args: unknown[]) => {\n\t\tlogger.warn(args.map(String).join(\" \"));\n\t};\n\tconsole.error = (...args: unknown[]) => {\n\t\tif (options?.preserveErrorStderr) {\n\t\t\toriginalConsole.error(...args);\n\t\t\treturn;\n\t\t}\n\t\t// Preserve first Error stack if present\n\t\tconst maybeError = args.find((a) => a instanceof Error) as\n\t\t\t| Error\n\t\t\t| undefined;\n\t\tif (maybeError) {\n\t\t\tlogger.error(maybeError.message, maybeError);\n\t\t} else {\n\t\t\tlogger.error(args.map(String).join(\" \"));\n\t\t}\n\t};\n\tconsole.debug = (...args: unknown[]) => {\n\t\tlogger.debug(args.map(String).join(\" \"));\n\t};\n}\n\n/**\n * Redirect process.stderr writes to the structured logger.\n * Useful in TUI mode to prevent third-party libraries from corrupting the terminal.\n */\nexport function redirectStderrToLogger(): void {\n\tprocess.stderr.write = (chunk: unknown) => {\n\t\tconst text =\n\t\t\ttypeof chunk === \"string\"\n\t\t\t\t? chunk\n\t\t\t\t: chunk instanceof Buffer\n\t\t\t\t\t? chunk.toString()\n\t\t\t\t\t: String(chunk);\n\t\tlogger.error(text.trimEnd());\n\t\treturn true;\n\t};\n}\n\n/**\n * Wire process warning / rejection hooks into the logger so they don't hit stderr.\n */\nexport function pipeProcessEventsToLogger(): void {\n\tprocess.on(\"warning\", (warning) => {\n\t\tlogger.warn(\n\t\t\t`${warning.name}: ${warning.message}${\n\t\t\t\twarning.stack ? `\\n${warning.stack}` : \"\"\n\t\t\t}`,\n\t\t);\n\t});\n\n\tprocess.on(\"unhandledRejection\", (reason, promise) => {\n\t\tlogger.error(\n\t\t\t`UnhandledRejection: ${String(reason)} (promise: ${String(promise)})`,\n\t\t);\n\t});\n\n\tprocess.on(\"uncaughtException\", (error) => {\n\t\tif (error instanceof Error) {\n\t\t\tlogger.error(error.message, error);\n\t\t} else {\n\t\t\tlogger.error(`UncaughtException: ${String(error)}`);\n\t\t}\n\t});\n}\n"]}
|
package/dist/version.json
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.10.
|
|
3
|
-
"notes": "Maestro by EvalOps - Deterministic coding agent with TUI/CLI and Web UI for AI-assisted development v0.10.
|
|
2
|
+
"version": "0.10.17",
|
|
3
|
+
"notes": "Maestro by EvalOps - Deterministic coding agent with TUI/CLI and Web UI for AI-assisted development v0.10.17 is now available."
|
|
4
4
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@evalops/maestro",
|
|
3
3
|
"description": "Maestro by EvalOps - Deterministic coding agent with TUI/CLI and Web UI for AI-assisted development",
|
|
4
|
-
"version": "0.10.
|
|
4
|
+
"version": "0.10.17",
|
|
5
5
|
"private": false,
|
|
6
6
|
"type": "module",
|
|
7
7
|
"workspaces": [
|
|
@@ -127,8 +127,8 @@
|
|
|
127
127
|
"@aws-sdk/client-bedrock-runtime": "^3.1020.0",
|
|
128
128
|
"@crosscopy/clipboard": "^0.2.8",
|
|
129
129
|
"@daytonaio/sdk": "^0.155.0",
|
|
130
|
-
"@evalops/contracts": "^0.10.
|
|
131
|
-
"@evalops/tui": "^0.10.
|
|
130
|
+
"@evalops/contracts": "^0.10.17",
|
|
131
|
+
"@evalops/tui": "^0.10.17",
|
|
132
132
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
133
133
|
"@opentelemetry/api": "^1.9.1",
|
|
134
134
|
"@opentelemetry/auto-instrumentations-node": "^0.74.0",
|