@northflare/runner 0.0.9 → 0.0.10

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.
Files changed (56) hide show
  1. package/dist/components/claude-sdk-manager.d.ts.map +1 -1
  2. package/dist/components/claude-sdk-manager.js +5 -4
  3. package/dist/components/claude-sdk-manager.js.map +1 -1
  4. package/dist/components/codex-sdk-manager.d.ts +2 -0
  5. package/dist/components/codex-sdk-manager.d.ts.map +1 -1
  6. package/dist/components/codex-sdk-manager.js +91 -10
  7. package/dist/components/codex-sdk-manager.js.map +1 -1
  8. package/dist/components/message-handler-sse.d.ts.map +1 -1
  9. package/dist/components/message-handler-sse.js +15 -14
  10. package/dist/components/message-handler-sse.js.map +1 -1
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +4 -2
  13. package/dist/index.js.map +1 -1
  14. package/dist/runner-sse.d.ts.map +1 -1
  15. package/dist/runner-sse.js +25 -112
  16. package/dist/runner-sse.js.map +1 -1
  17. package/dist/runner.js +3 -3
  18. package/dist/types/index.d.ts +1 -0
  19. package/dist/types/index.d.ts.map +1 -1
  20. package/dist/utils/config.d.ts.map +1 -1
  21. package/dist/utils/config.js +1 -0
  22. package/dist/utils/config.js.map +1 -1
  23. package/dist/utils/console.d.ts.map +1 -1
  24. package/dist/utils/console.js +2 -1
  25. package/dist/utils/console.js.map +1 -1
  26. package/dist/utils/debug.d.ts +2 -0
  27. package/dist/utils/debug.d.ts.map +1 -0
  28. package/dist/utils/debug.js +19 -0
  29. package/dist/utils/debug.js.map +1 -0
  30. package/dist/utils/logger.d.ts.map +1 -1
  31. package/dist/utils/logger.js +6 -4
  32. package/dist/utils/logger.js.map +1 -1
  33. package/dist/utils/status-line.d.ts +0 -8
  34. package/dist/utils/status-line.d.ts.map +1 -1
  35. package/dist/utils/status-line.js +4 -3
  36. package/dist/utils/status-line.js.map +1 -1
  37. package/dist/utils/tool-response-sanitizer.d.ts +9 -0
  38. package/dist/utils/tool-response-sanitizer.d.ts.map +1 -0
  39. package/dist/utils/tool-response-sanitizer.js +122 -0
  40. package/dist/utils/tool-response-sanitizer.js.map +1 -0
  41. package/exceptions.log +2 -0
  42. package/package.json +1 -1
  43. package/rejections.log +3 -0
  44. package/src/components/claude-sdk-manager.ts +5 -4
  45. package/src/components/codex-sdk-manager.ts +111 -10
  46. package/src/components/message-handler-sse.ts +15 -14
  47. package/src/index.ts +4 -2
  48. package/src/runner-sse.ts +29 -133
  49. package/src/types/index.ts +1 -0
  50. package/src/utils/config.ts +1 -0
  51. package/src/utils/console.ts +4 -2
  52. package/src/utils/debug.ts +18 -0
  53. package/src/utils/logger.ts +8 -5
  54. package/src/utils/status-line.ts +3 -2
  55. package/src/utils/tool-response-sanitizer.ts +160 -0
  56. package/tests/tool-response-sanitizer.test.ts +63 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@northflare/runner",
3
- "version": "0.0.9",
3
+ "version": "0.0.10",
4
4
  "description": "Distributed conversation runner for Northflare",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
package/rejections.log CHANGED
@@ -63,3 +63,6 @@
63
63
  {"date":"Fri Oct 31 2025 15:15:47 GMT+0100 (Central European Standard Time)","error":{"code":"MODULE_NOT_FOUND","path":"/Users/toby/Code/claudette/runner/node_modules/@anthropic-ai/claude-code/package.json","requestPath":"@anthropic-ai/claude-code"},"level":"error","message":"unhandledRejection: Cannot find module '/Users/toby/Code/claudette/runner/node_modules/@anthropic-ai/claude-code/sdk.mjs'. Please verify that the package.json has a valid \"main\" entry\nError: Cannot find module '/Users/toby/Code/claudette/runner/node_modules/@anthropic-ai/claude-code/sdk.mjs'. Please verify that the package.json has a valid \"main\" entry\n at tryPackage (node:internal/modules/cjs/loader:511:19)\n at Function._findPath (node:internal/modules/cjs/loader:796:18)\n at Function._resolveFilename (node:internal/modules/cjs/loader:1387:27)\n at defaultResolveImpl (node:internal/modules/cjs/loader:1057:19)\n at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1062:22)\n at Function._load (node:internal/modules/cjs/loader:1211:37)\n at TracingChannel.traceSync (node:diagnostics_channel:322:14)\n at wrapModuleLoad (node:internal/modules/cjs/loader:235:24)\n at Module.require (node:internal/modules/cjs/loader:1487:12)\n at require (node:internal/modules/helpers:135:16)","os":{"loadavg":[10.09228515625,5.86376953125,4.3662109375],"uptime":187703},"process":{"argv":["/Users/toby/.nvm/versions/node/v22.15.0/bin/node","/Users/toby/Code/claudette/runner/bin/claudette-runner"],"cwd":"/Users/toby/Code/claudette/runner","execPath":"/Users/toby/.nvm/versions/node/v22.15.0/bin/node","gid":20,"memoryUsage":{"arrayBuffers":12531,"external":1652665,"heapTotal":10829824,"heapUsed":7045984,"rss":56049664},"pid":4552,"uid":501,"version":"v22.15.0"},"rejection":true,"stack":"Error: Cannot find module '/Users/toby/Code/claudette/runner/node_modules/@anthropic-ai/claude-code/sdk.mjs'. Please verify that the package.json has a valid \"main\" entry\n at tryPackage (node:internal/modules/cjs/loader:511:19)\n at Function._findPath (node:internal/modules/cjs/loader:796:18)\n at Function._resolveFilename (node:internal/modules/cjs/loader:1387:27)\n at defaultResolveImpl (node:internal/modules/cjs/loader:1057:19)\n at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1062:22)\n at Function._load (node:internal/modules/cjs/loader:1211:37)\n at TracingChannel.traceSync (node:diagnostics_channel:322:14)\n at wrapModuleLoad (node:internal/modules/cjs/loader:235:24)\n at Module.require (node:internal/modules/cjs/loader:1487:12)\n at require (node:internal/modules/helpers:135:16)","trace":[{"column":19,"file":"node:internal/modules/cjs/loader","function":"tryPackage","line":511,"method":null,"native":false},{"column":18,"file":"node:internal/modules/cjs/loader","function":"Function._findPath","line":796,"method":"_findPath","native":false},{"column":27,"file":"node:internal/modules/cjs/loader","function":"Function._resolveFilename","line":1387,"method":"_resolveFilename","native":false},{"column":19,"file":"node:internal/modules/cjs/loader","function":"defaultResolveImpl","line":1057,"method":null,"native":false},{"column":22,"file":"node:internal/modules/cjs/loader","function":"resolveForCJSWithHooks","line":1062,"method":null,"native":false},{"column":37,"file":"node:internal/modules/cjs/loader","function":"Function._load","line":1211,"method":"_load","native":false},{"column":14,"file":"node:diagnostics_channel","function":"TracingChannel.traceSync","line":322,"method":"traceSync","native":false},{"column":24,"file":"node:internal/modules/cjs/loader","function":"wrapModuleLoad","line":235,"method":null,"native":false},{"column":12,"file":"node:internal/modules/cjs/loader","function":"Module.require","line":1487,"method":"require","native":false},{"column":16,"file":"node:internal/modules/helpers","function":"require","line":135,"method":null,"native":false}]}
64
64
  {"date":"Tue Nov 18 2025 11:23:35 GMT+0100 (Central European Standard Time)","error":{"code":"ERR_PACKAGE_PATH_NOT_EXPORTED"},"level":"error","message":"unhandledRejection: No \"exports\" main defined in /Users/toby/Code/claudette/runner/node_modules/@northflare/codex-sdk/package.json\nError [ERR_PACKAGE_PATH_NOT_EXPORTED]: No \"exports\" main defined in /Users/toby/Code/claudette/runner/node_modules/@northflare/codex-sdk/package.json\n at exportsNotFound (node:internal/modules/esm/resolve:314:10)\n at packageExportsResolve (node:internal/modules/esm/resolve:604:13)\n at resolveExports (node:internal/modules/cjs/loader:657:36)\n at Function._findPath (node:internal/modules/cjs/loader:749:31)\n at Function._resolveFilename (node:internal/modules/cjs/loader:1387:27)\n at defaultResolveImpl (node:internal/modules/cjs/loader:1057:19)\n at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1062:22)\n at Function._load (node:internal/modules/cjs/loader:1211:37)\n at TracingChannel.traceSync (node:diagnostics_channel:322:14)\n at wrapModuleLoad (node:internal/modules/cjs/loader:235:24)","os":{"loadavg":[4.82373046875,4.37255859375,4.115234375],"uptime":97198},"process":{"argv":["/Users/toby/.nvm/versions/node/v22.15.0/bin/node","/Users/toby/Code/claudette/runner/bin/northflare-runner"],"cwd":"/Users/toby/Code/claudette/runner","execPath":"/Users/toby/.nvm/versions/node/v22.15.0/bin/node","gid":20,"memoryUsage":{"arrayBuffers":18675,"external":2091282,"heapTotal":18972672,"heapUsed":12330016,"rss":65404928},"pid":95991,"uid":501,"version":"v22.15.0"},"rejection":true,"stack":"Error [ERR_PACKAGE_PATH_NOT_EXPORTED]: No \"exports\" main defined in /Users/toby/Code/claudette/runner/node_modules/@northflare/codex-sdk/package.json\n at exportsNotFound (node:internal/modules/esm/resolve:314:10)\n at packageExportsResolve (node:internal/modules/esm/resolve:604:13)\n at resolveExports (node:internal/modules/cjs/loader:657:36)\n at Function._findPath (node:internal/modules/cjs/loader:749:31)\n at Function._resolveFilename (node:internal/modules/cjs/loader:1387:27)\n at defaultResolveImpl (node:internal/modules/cjs/loader:1057:19)\n at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1062:22)\n at Function._load (node:internal/modules/cjs/loader:1211:37)\n at TracingChannel.traceSync (node:diagnostics_channel:322:14)\n at wrapModuleLoad (node:internal/modules/cjs/loader:235:24)","trace":[{"column":10,"file":"node:internal/modules/esm/resolve","function":"exportsNotFound","line":314,"method":null,"native":false},{"column":13,"file":"node:internal/modules/esm/resolve","function":"packageExportsResolve","line":604,"method":null,"native":false},{"column":36,"file":"node:internal/modules/cjs/loader","function":"resolveExports","line":657,"method":null,"native":false},{"column":31,"file":"node:internal/modules/cjs/loader","function":"Function._findPath","line":749,"method":"_findPath","native":false},{"column":27,"file":"node:internal/modules/cjs/loader","function":"Function._resolveFilename","line":1387,"method":"_resolveFilename","native":false},{"column":19,"file":"node:internal/modules/cjs/loader","function":"defaultResolveImpl","line":1057,"method":null,"native":false},{"column":22,"file":"node:internal/modules/cjs/loader","function":"resolveForCJSWithHooks","line":1062,"method":null,"native":false},{"column":37,"file":"node:internal/modules/cjs/loader","function":"Function._load","line":1211,"method":"_load","native":false},{"column":14,"file":"node:diagnostics_channel","function":"TracingChannel.traceSync","line":322,"method":"traceSync","native":false},{"column":24,"file":"node:internal/modules/cjs/loader","function":"wrapModuleLoad","line":235,"method":null,"native":false}]}
65
65
  {"date":"Tue Nov 18 2025 11:24:17 GMT+0100 (Central European Standard Time)","error":{"code":"ERR_PACKAGE_PATH_NOT_EXPORTED"},"level":"error","message":"unhandledRejection: No \"exports\" main defined in /Users/toby/Code/claudette/runner/node_modules/@northflare/codex-sdk/package.json\nError [ERR_PACKAGE_PATH_NOT_EXPORTED]: No \"exports\" main defined in /Users/toby/Code/claudette/runner/node_modules/@northflare/codex-sdk/package.json\n at exportsNotFound (node:internal/modules/esm/resolve:314:10)\n at packageExportsResolve (node:internal/modules/esm/resolve:604:13)\n at resolveExports (node:internal/modules/cjs/loader:657:36)\n at Function._findPath (node:internal/modules/cjs/loader:749:31)\n at Function._resolveFilename (node:internal/modules/cjs/loader:1387:27)\n at defaultResolveImpl (node:internal/modules/cjs/loader:1057:19)\n at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1062:22)\n at Function._load (node:internal/modules/cjs/loader:1211:37)\n at TracingChannel.traceSync (node:diagnostics_channel:322:14)\n at wrapModuleLoad (node:internal/modules/cjs/loader:235:24)","os":{"loadavg":[7.13623046875,4.9140625,4.31787109375],"uptime":97240},"process":{"argv":["/Users/toby/.nvm/versions/node/v22.15.0/bin/node","/Users/toby/Code/claudette/runner/bin/northflare-runner"],"cwd":"/Users/toby/Code/claudette/runner","execPath":"/Users/toby/.nvm/versions/node/v22.15.0/bin/node","gid":20,"memoryUsage":{"arrayBuffers":18675,"external":2091282,"heapTotal":18710528,"heapUsed":12265536,"rss":65486848},"pid":99528,"uid":501,"version":"v22.15.0"},"rejection":true,"stack":"Error [ERR_PACKAGE_PATH_NOT_EXPORTED]: No \"exports\" main defined in /Users/toby/Code/claudette/runner/node_modules/@northflare/codex-sdk/package.json\n at exportsNotFound (node:internal/modules/esm/resolve:314:10)\n at packageExportsResolve (node:internal/modules/esm/resolve:604:13)\n at resolveExports (node:internal/modules/cjs/loader:657:36)\n at Function._findPath (node:internal/modules/cjs/loader:749:31)\n at Function._resolveFilename (node:internal/modules/cjs/loader:1387:27)\n at defaultResolveImpl (node:internal/modules/cjs/loader:1057:19)\n at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1062:22)\n at Function._load (node:internal/modules/cjs/loader:1211:37)\n at TracingChannel.traceSync (node:diagnostics_channel:322:14)\n at wrapModuleLoad (node:internal/modules/cjs/loader:235:24)","trace":[{"column":10,"file":"node:internal/modules/esm/resolve","function":"exportsNotFound","line":314,"method":null,"native":false},{"column":13,"file":"node:internal/modules/esm/resolve","function":"packageExportsResolve","line":604,"method":null,"native":false},{"column":36,"file":"node:internal/modules/cjs/loader","function":"resolveExports","line":657,"method":null,"native":false},{"column":31,"file":"node:internal/modules/cjs/loader","function":"Function._findPath","line":749,"method":"_findPath","native":false},{"column":27,"file":"node:internal/modules/cjs/loader","function":"Function._resolveFilename","line":1387,"method":"_resolveFilename","native":false},{"column":19,"file":"node:internal/modules/cjs/loader","function":"defaultResolveImpl","line":1057,"method":null,"native":false},{"column":22,"file":"node:internal/modules/cjs/loader","function":"resolveForCJSWithHooks","line":1062,"method":null,"native":false},{"column":37,"file":"node:internal/modules/cjs/loader","function":"Function._load","line":1211,"method":"_load","native":false},{"column":14,"file":"node:diagnostics_channel","function":"TracingChannel.traceSync","line":322,"method":"traceSync","native":false},{"column":24,"file":"node:internal/modules/cjs/loader","function":"wrapModuleLoad","line":235,"method":null,"native":false}]}
66
+ {"date":"Wed Nov 19 2025 04:00:21 GMT+0100 (Central European Standard Time)","error":{},"level":"error","message":"unhandledRejection: Cannot access 'debug_1' before initialization\nReferenceError: Cannot access 'debug_1' before initialization\n at new StatusLineManager (/Users/toby/Code/claudette/runner/dist/utils/status-line.js:19:39)\n at Object.<anonymous> (/Users/toby/Code/claudette/runner/dist/utils/status-line.js:112:29)\n at Module._compile (node:internal/modules/cjs/loader:1730:14)\n at Object..js (node:internal/modules/cjs/loader:1895:10)\n at Module.load (node:internal/modules/cjs/loader:1465:32)\n at Function._load (node:internal/modules/cjs/loader:1282:12)\n at TracingChannel.traceSync (node:diagnostics_channel:322:14)\n at wrapModuleLoad (node:internal/modules/cjs/loader:235:24)\n at Module.require (node:internal/modules/cjs/loader:1487:12)\n at require (node:internal/modules/helpers:135:16)","os":{"loadavg":[4.80712890625,4.451171875,4.53564453125],"uptime":157004},"process":{"argv":["/Users/toby/.nvm/versions/node/v22.15.0/bin/node","/Users/toby/Code/claudette/runner/bin/northflare-runner"],"cwd":"/Users/toby/Code/claudette/runner","execPath":"/Users/toby/.nvm/versions/node/v22.15.0/bin/node","gid":20,"memoryUsage":{"arrayBuffers":12531,"external":1652665,"heapTotal":11091968,"heapUsed":6918376,"rss":54345728},"pid":4913,"uid":501,"version":"v22.15.0"},"rejection":true,"stack":"ReferenceError: Cannot access 'debug_1' before initialization\n at new StatusLineManager (/Users/toby/Code/claudette/runner/dist/utils/status-line.js:19:39)\n at Object.<anonymous> (/Users/toby/Code/claudette/runner/dist/utils/status-line.js:112:29)\n at Module._compile (node:internal/modules/cjs/loader:1730:14)\n at Object..js (node:internal/modules/cjs/loader:1895:10)\n at Module.load (node:internal/modules/cjs/loader:1465:32)\n at Function._load (node:internal/modules/cjs/loader:1282:12)\n at TracingChannel.traceSync (node:diagnostics_channel:322:14)\n at wrapModuleLoad (node:internal/modules/cjs/loader:235:24)\n at Module.require (node:internal/modules/cjs/loader:1487:12)\n at require (node:internal/modules/helpers:135:16)","trace":[{"column":39,"file":"/Users/toby/Code/claudette/runner/dist/utils/status-line.js","function":"new StatusLineManager","line":19,"method":null,"native":false},{"column":29,"file":"/Users/toby/Code/claudette/runner/dist/utils/status-line.js","function":null,"line":112,"method":null,"native":false},{"column":14,"file":"node:internal/modules/cjs/loader","function":"Module._compile","line":1730,"method":"_compile","native":false},{"column":10,"file":"node:internal/modules/cjs/loader","function":"Object..js","line":1895,"method":".js","native":false},{"column":32,"file":"node:internal/modules/cjs/loader","function":"Module.load","line":1465,"method":"load","native":false},{"column":12,"file":"node:internal/modules/cjs/loader","function":"Function._load","line":1282,"method":"_load","native":false},{"column":14,"file":"node:diagnostics_channel","function":"TracingChannel.traceSync","line":322,"method":"traceSync","native":false},{"column":24,"file":"node:internal/modules/cjs/loader","function":"wrapModuleLoad","line":235,"method":null,"native":false},{"column":12,"file":"node:internal/modules/cjs/loader","function":"Module.require","line":1487,"method":"require","native":false},{"column":16,"file":"node:internal/modules/helpers","function":"require","line":135,"method":null,"native":false}]}
67
+ {"date":"Wed Nov 19 2025 04:01:10 GMT+0100 (Central European Standard Time)","error":{},"level":"error","message":"unhandledRejection: Cannot access 'debug_1' before initialization\nReferenceError: Cannot access 'debug_1' before initialization\n at new StatusLineManager (/Users/toby/Code/claudette/runner/dist/utils/status-line.js:19:39)\n at Object.<anonymous> (/Users/toby/Code/claudette/runner/dist/utils/status-line.js:112:29)\n at Module._compile (node:internal/modules/cjs/loader:1730:14)\n at Object..js (node:internal/modules/cjs/loader:1895:10)\n at Module.load (node:internal/modules/cjs/loader:1465:32)\n at Function._load (node:internal/modules/cjs/loader:1282:12)\n at TracingChannel.traceSync (node:diagnostics_channel:322:14)\n at wrapModuleLoad (node:internal/modules/cjs/loader:235:24)\n at Module.require (node:internal/modules/cjs/loader:1487:12)\n at require (node:internal/modules/helpers:135:16)","os":{"loadavg":[4.14501953125,4.3193359375,4.48046875],"uptime":157053},"process":{"argv":["/Users/toby/.nvm/versions/node/v22.15.0/bin/node","/Users/toby/Code/claudette/runner/bin/northflare-runner"],"cwd":"/Users/toby/Code/claudette/runner","execPath":"/Users/toby/.nvm/versions/node/v22.15.0/bin/node","gid":20,"memoryUsage":{"arrayBuffers":12531,"external":1652665,"heapTotal":11091968,"heapUsed":6903192,"rss":55017472},"pid":8705,"uid":501,"version":"v22.15.0"},"rejection":true,"stack":"ReferenceError: Cannot access 'debug_1' before initialization\n at new StatusLineManager (/Users/toby/Code/claudette/runner/dist/utils/status-line.js:19:39)\n at Object.<anonymous> (/Users/toby/Code/claudette/runner/dist/utils/status-line.js:112:29)\n at Module._compile (node:internal/modules/cjs/loader:1730:14)\n at Object..js (node:internal/modules/cjs/loader:1895:10)\n at Module.load (node:internal/modules/cjs/loader:1465:32)\n at Function._load (node:internal/modules/cjs/loader:1282:12)\n at TracingChannel.traceSync (node:diagnostics_channel:322:14)\n at wrapModuleLoad (node:internal/modules/cjs/loader:235:24)\n at Module.require (node:internal/modules/cjs/loader:1487:12)\n at require (node:internal/modules/helpers:135:16)","trace":[{"column":39,"file":"/Users/toby/Code/claudette/runner/dist/utils/status-line.js","function":"new StatusLineManager","line":19,"method":null,"native":false},{"column":29,"file":"/Users/toby/Code/claudette/runner/dist/utils/status-line.js","function":null,"line":112,"method":null,"native":false},{"column":14,"file":"node:internal/modules/cjs/loader","function":"Module._compile","line":1730,"method":"_compile","native":false},{"column":10,"file":"node:internal/modules/cjs/loader","function":"Object..js","line":1895,"method":".js","native":false},{"column":32,"file":"node:internal/modules/cjs/loader","function":"Module.load","line":1465,"method":"load","native":false},{"column":12,"file":"node:internal/modules/cjs/loader","function":"Function._load","line":1282,"method":"_load","native":false},{"column":14,"file":"node:diagnostics_channel","function":"TracingChannel.traceSync","line":322,"method":"traceSync","native":false},{"column":24,"file":"node:internal/modules/cjs/loader","function":"wrapModuleLoad","line":235,"method":null,"native":false},{"column":12,"file":"node:internal/modules/cjs/loader","function":"Module.require","line":1487,"method":"require","native":false},{"column":16,"file":"node:internal/modules/helpers","function":"require","line":135,"method":null,"native":false}]}
68
+ {"date":"Wed Nov 19 2025 04:01:13 GMT+0100 (Central European Standard Time)","error":{},"level":"error","message":"unhandledRejection: Cannot access 'debug_1' before initialization\nReferenceError: Cannot access 'debug_1' before initialization\n at new StatusLineManager (/Users/toby/Code/claudette/runner/dist/utils/status-line.js:19:39)\n at Object.<anonymous> (/Users/toby/Code/claudette/runner/dist/utils/status-line.js:112:29)\n at Module._compile (node:internal/modules/cjs/loader:1730:14)\n at Object..js (node:internal/modules/cjs/loader:1895:10)\n at Module.load (node:internal/modules/cjs/loader:1465:32)\n at Function._load (node:internal/modules/cjs/loader:1282:12)\n at TracingChannel.traceSync (node:diagnostics_channel:322:14)\n at wrapModuleLoad (node:internal/modules/cjs/loader:235:24)\n at Module.require (node:internal/modules/cjs/loader:1487:12)\n at require (node:internal/modules/helpers:135:16)","os":{"loadavg":[4.53369140625,4.39697265625,4.5068359375],"uptime":157056},"process":{"argv":["/Users/toby/.nvm/versions/node/v22.15.0/bin/node","/Users/toby/Code/claudette/runner/bin/northflare-runner"],"cwd":"/Users/toby/Code/claudette/runner","execPath":"/Users/toby/.nvm/versions/node/v22.15.0/bin/node","gid":20,"memoryUsage":{"arrayBuffers":12531,"external":1652665,"heapTotal":11091968,"heapUsed":6909192,"rss":55214080},"pid":8860,"uid":501,"version":"v22.15.0"},"rejection":true,"stack":"ReferenceError: Cannot access 'debug_1' before initialization\n at new StatusLineManager (/Users/toby/Code/claudette/runner/dist/utils/status-line.js:19:39)\n at Object.<anonymous> (/Users/toby/Code/claudette/runner/dist/utils/status-line.js:112:29)\n at Module._compile (node:internal/modules/cjs/loader:1730:14)\n at Object..js (node:internal/modules/cjs/loader:1895:10)\n at Module.load (node:internal/modules/cjs/loader:1465:32)\n at Function._load (node:internal/modules/cjs/loader:1282:12)\n at TracingChannel.traceSync (node:diagnostics_channel:322:14)\n at wrapModuleLoad (node:internal/modules/cjs/loader:235:24)\n at Module.require (node:internal/modules/cjs/loader:1487:12)\n at require (node:internal/modules/helpers:135:16)","trace":[{"column":39,"file":"/Users/toby/Code/claudette/runner/dist/utils/status-line.js","function":"new StatusLineManager","line":19,"method":null,"native":false},{"column":29,"file":"/Users/toby/Code/claudette/runner/dist/utils/status-line.js","function":null,"line":112,"method":null,"native":false},{"column":14,"file":"node:internal/modules/cjs/loader","function":"Module._compile","line":1730,"method":"_compile","native":false},{"column":10,"file":"node:internal/modules/cjs/loader","function":"Object..js","line":1895,"method":".js","native":false},{"column":32,"file":"node:internal/modules/cjs/loader","function":"Module.load","line":1465,"method":"load","native":false},{"column":12,"file":"node:internal/modules/cjs/loader","function":"Function._load","line":1282,"method":"_load","native":false},{"column":14,"file":"node:diagnostics_channel","function":"TracingChannel.traceSync","line":322,"method":"traceSync","native":false},{"column":24,"file":"node:internal/modules/cjs/loader","function":"wrapModuleLoad","line":235,"method":null,"native":false},{"column":12,"file":"node:internal/modules/cjs/loader","function":"Module.require","line":1487,"method":"require","native":false},{"column":16,"file":"node:internal/modules/helpers","function":"require","line":135,"method":null,"native":false}]}
@@ -24,6 +24,7 @@ import { ConversationContext, ConversationConfig, Message } from "../types";
24
24
  import { statusLineManager } from "../utils/status-line";
25
25
  import { console } from "../utils/console";
26
26
  import { expandEnv } from "../utils/expand-env";
27
+ import { isRunnerDebugEnabled } from "../utils/debug";
27
28
  import * as jwt from "jsonwebtoken";
28
29
 
29
30
  export class ClaudeManager {
@@ -38,7 +39,7 @@ export class ClaudeManager {
38
39
  this.repositoryManager = repositoryManager;
39
40
 
40
41
  // Log debug mode status
41
- if (process.env["DEBUG"] === "true") {
42
+ if (isRunnerDebugEnabled()) {
42
43
  console.log(
43
44
  "[ClaudeManager] DEBUG MODE ENABLED - Claude SDK will log verbose output"
44
45
  );
@@ -256,7 +257,7 @@ export class ClaudeManager {
256
257
  envVars["GITHUB_TOKEN"] = githubToken;
257
258
  }
258
259
 
259
- if (process.env["DEBUG"] === "true") {
260
+ if (isRunnerDebugEnabled()) {
260
261
  envVars["DEBUG"] = "1";
261
262
  }
262
263
 
@@ -334,7 +335,7 @@ export class ClaudeManager {
334
335
  : {}),
335
336
  ...(disallowedTools.length ? { disallowedTools } : {}),
336
337
  ...(mcpServers ? { mcpServers } : {}),
337
- ...(process.env["DEBUG"] === "true"
338
+ ...(isRunnerDebugEnabled()
338
339
  ? {
339
340
  stderr: (data: string) => {
340
341
  try {
@@ -678,7 +679,7 @@ export class ClaudeManager {
678
679
  // Native message injection - SDK handles queueing and delivery
679
680
  const normalizedText = this.normalizeToText(content);
680
681
 
681
- if (process.env["DEBUG"] === "true") {
682
+ if (isRunnerDebugEnabled()) {
682
683
  console.log("[ClaudeManager] Normalized follow-up content", {
683
684
  originalType: typeof content,
684
685
  isArray: Array.isArray(content) || undefined,
@@ -9,6 +9,7 @@ import { parseModelValue } from "../utils/model";
9
9
  import * as jwt from "jsonwebtoken";
10
10
  import fs from "fs/promises";
11
11
  import path from "path";
12
+ import { isRunnerDebugEnabled } from "../utils/debug";
12
13
 
13
14
  let codexSdkPromise: Promise<typeof import("@northflare/codex-sdk")> | null =
14
15
  null;
@@ -349,7 +350,7 @@ export class CodexManager {
349
350
  envVars["TOOL_TOKEN"] = toolToken;
350
351
  }
351
352
 
352
- if (process.env["DEBUG"] === "true") {
353
+ if (isRunnerDebugEnabled()) {
353
354
  envVars["DEBUG"] = "1";
354
355
  }
355
356
 
@@ -543,6 +544,8 @@ export class CodexManager {
543
544
  event: ThreadEvent
544
545
  ): Promise<void> {
545
546
  try {
547
+ this.logRawThreadEvent(event);
548
+
546
549
  switch (event.type) {
547
550
  case "thread.started": {
548
551
  await this.handleThreadStarted(context, event.thread_id);
@@ -687,19 +690,62 @@ export class CodexManager {
687
690
  };
688
691
  }
689
692
  case "command_execution": {
693
+ const toolUseId = this.buildToolUseId(context, item.id);
694
+ const timestamp = new Date().toISOString();
695
+ const isTerminal =
696
+ phase === "completed" ||
697
+ item.status === "completed" ||
698
+ item.status === "failed";
699
+
700
+ if (!isTerminal) {
701
+ if (phase !== "started") {
702
+ return null;
703
+ }
704
+
705
+ return {
706
+ type: "assistant",
707
+ subtype: "tool_use",
708
+ content: [
709
+ {
710
+ toolCalls: [
711
+ {
712
+ id: toolUseId,
713
+ name: "codex_command",
714
+ arguments: {
715
+ command: item.command,
716
+ status: item.status,
717
+ },
718
+ status: item.status,
719
+ },
720
+ ],
721
+ timestamp,
722
+ },
723
+ ],
724
+ };
725
+ }
726
+
727
+ const exitCode =
728
+ typeof item.exit_code === "number" ? item.exit_code : null;
729
+ const isError = item.status === "failed" || (exitCode ?? 0) !== 0;
730
+
690
731
  return {
691
- type: "system",
692
- subtype: `command_execution.${phase}`,
732
+ type: "tool_result",
733
+ subtype: "tool_result",
693
734
  content: [
694
735
  {
695
- type: "command_execution",
696
- command: item.command,
697
- aggregated_output: item.aggregated_output,
698
- exit_code: item.exit_code,
699
- status: item.status,
700
- phase,
736
+ type: "tool_result",
737
+ tool_use_id: toolUseId,
738
+ content: {
739
+ kind: "codex_command_result",
740
+ command: item.command,
741
+ output: item.aggregated_output || "",
742
+ exitCode,
743
+ status: item.status,
744
+ },
745
+ timestamp,
701
746
  },
702
747
  ],
748
+ isError,
703
749
  };
704
750
  }
705
751
  case "file_change": {
@@ -860,7 +906,7 @@ export class CodexManager {
860
906
  timestamp: new Date().toISOString(),
861
907
  };
862
908
 
863
- if (process.env["DEBUG"] === "true") {
909
+ if (isRunnerDebugEnabled()) {
864
910
  console.log("[CodexManager] Sending message.agent", payload);
865
911
  }
866
912
 
@@ -948,6 +994,61 @@ export class CodexManager {
948
994
  return `mcp__${safeServer}__${safeTool}`;
949
995
  }
950
996
 
997
+ private logRawThreadEvent(event: ThreadEvent): void {
998
+ if (!isRunnerDebugEnabled()) {
999
+ return;
1000
+ }
1001
+
1002
+ try {
1003
+ console.log(
1004
+ "[CodexManager] RAW Codex event FULL:",
1005
+ this.safeStringify(event)
1006
+ );
1007
+
1008
+ const summary: Record<string, unknown> = {
1009
+ type: event?.type,
1010
+ keys: Object.keys((event as Record<string, unknown>) || {}),
1011
+ hasItem: Boolean((event as any)?.item),
1012
+ itemType: (event as any)?.item?.type,
1013
+ hasUsage: Boolean((event as any)?.usage),
1014
+ threadId: (event as any)?.thread_id,
1015
+ turnId: (event as any)?.turn_id,
1016
+ };
1017
+
1018
+ console.log("[CodexManager] RAW Codex event summary:", summary);
1019
+
1020
+ if ((event as any)?.item) {
1021
+ console.log(
1022
+ "[CodexManager] RAW Codex event item:",
1023
+ this.safeStringify((event as any).item)
1024
+ );
1025
+ }
1026
+
1027
+ if ((event as any)?.usage) {
1028
+ console.log("[CodexManager] RAW Codex usage:", (event as any).usage);
1029
+ }
1030
+ } catch (error) {
1031
+ console.warn("[CodexManager] Failed to log raw Codex event:", error);
1032
+ }
1033
+ }
1034
+
1035
+ private safeStringify(value: any): string {
1036
+ const seen = new WeakSet();
1037
+ return JSON.stringify(
1038
+ value,
1039
+ (key, nested) => {
1040
+ if (typeof nested === "function") return undefined;
1041
+ if (typeof nested === "bigint") return nested.toString();
1042
+ if (typeof nested === "object" && nested !== null) {
1043
+ if (seen.has(nested)) return "[Circular]";
1044
+ seen.add(nested);
1045
+ }
1046
+ return nested;
1047
+ },
1048
+ 2
1049
+ );
1050
+ }
1051
+
951
1052
  private buildToolUseId(context: ConversationContext, rawId: string): string {
952
1053
  const scope =
953
1054
  context.agentSessionId ||
@@ -14,6 +14,7 @@ import { RunnerAPIClient } from "../services/RunnerAPIClient";
14
14
  import { statusLineManager } from "../utils/status-line";
15
15
  import { console } from "../utils/console";
16
16
  import { createLogger } from "../utils/logger";
17
+ import { isRunnerDebugEnabled } from "../utils/debug";
17
18
 
18
19
  const logger = createLogger("MessageHandler");
19
20
 
@@ -156,7 +157,7 @@ export class MessageHandler {
156
157
  if (event.type === "runner.message") {
157
158
  const message = event.data as RunnerMessage;
158
159
 
159
- if (process.env["DEBUG"] === "true") {
160
+ if (isRunnerDebugEnabled()) {
160
161
  logger.debug("Received SSE event", {
161
162
  eventId: event.id,
162
163
  type: event.type,
@@ -183,7 +184,7 @@ export class MessageHandler {
183
184
  }
184
185
 
185
186
  private async processMessage(message: RunnerMessage): Promise<void> {
186
- if (process.env["DEBUG"] === "true") {
187
+ if (isRunnerDebugEnabled()) {
187
188
  logger.debug("processMessage called", {
188
189
  messageId: message.id,
189
190
  method: message.payload?.method,
@@ -216,7 +217,7 @@ export class MessageHandler {
216
217
  return;
217
218
  }
218
219
 
219
- if (process.env["DEBUG"] === "true") {
220
+ if (isRunnerDebugEnabled()) {
220
221
  logger.debug("Processing message", {
221
222
  messageId: message.id,
222
223
  method: method,
@@ -232,7 +233,7 @@ export class MessageHandler {
232
233
  // Acknowledge ALL messages to update lastProcessedAt
233
234
  await this.acknowledgeMessage(message);
234
235
 
235
- if (process.env["DEBUG"] === "true") {
236
+ if (isRunnerDebugEnabled()) {
236
237
  logger.debug("Message acknowledged", {
237
238
  messageId: message.id,
238
239
  method: method,
@@ -241,7 +242,7 @@ export class MessageHandler {
241
242
  });
242
243
  }
243
244
  } catch (error) {
244
- if (process.env["DEBUG"] === "true") {
245
+ if (isRunnerDebugEnabled()) {
245
246
  logger.debug("Message processing error", {
246
247
  messageId: message.id,
247
248
  method: method,
@@ -298,7 +299,7 @@ export class MessageHandler {
298
299
  };
299
300
  })();
300
301
 
301
- if (process.env["DEBUG"] === "true") {
302
+ if (isRunnerDebugEnabled()) {
302
303
  logger.debug("Message processing decision", {
303
304
  messageId: message.id,
304
305
  method: message.payload?.method,
@@ -366,7 +367,7 @@ export class MessageHandler {
366
367
  console.error(
367
368
  `[MessageHandler] Cannot send error report - no conversationObjectId available. Error: ${errorMessage}`
368
369
  );
369
- if (process.env["DEBUG"] === "true") {
370
+ if (isRunnerDebugEnabled()) {
370
371
  logger.debug("Error without conversationObjectId", {
371
372
  messageId: message.id,
372
373
  method: message.payload?.method,
@@ -403,7 +404,7 @@ export class MessageHandler {
403
404
  console.error(
404
405
  `[MessageHandler] Cannot send error report - no conversationObjectId available. Processing error: ${errorMessage}`
405
406
  );
406
- if (process.env["DEBUG"] === "true") {
407
+ if (isRunnerDebugEnabled()) {
407
408
  logger.debug("Processing error without conversationObjectId", {
408
409
  messageId: message.id,
409
410
  method: message.payload?.method,
@@ -770,7 +771,7 @@ export class MessageHandler {
770
771
  `MessageHandler: Handling UID change notification - new UID: ${runnerUid}, lastProcessedAt: ${lastProcessedAt}`
771
772
  );
772
773
 
773
- if (process.env["DEBUG"] === "true") {
774
+ if (isRunnerDebugEnabled()) {
774
775
  logger.debug("UID change notification received", {
775
776
  newUid: runnerUid,
776
777
  currentUid: this.runner.getRunnerUid(),
@@ -792,7 +793,7 @@ export class MessageHandler {
792
793
  lastProcessedAt ? new Date(lastProcessedAt) : null
793
794
  );
794
795
 
795
- if (process.env["DEBUG"] === "true") {
796
+ if (isRunnerDebugEnabled()) {
796
797
  logger.debug("Runner activated as primary", {
797
798
  runnerUid: runnerUid,
798
799
  lastProcessedAt: lastProcessedAt,
@@ -808,7 +809,7 @@ export class MessageHandler {
808
809
  });
809
810
  } catch (error) {
810
811
  console.error("Failed to send activation notification:", error);
811
- if (process.env["DEBUG"] === "true") {
812
+ if (isRunnerDebugEnabled()) {
812
813
  logger.debug("Activation notification failed", {
813
814
  error: error instanceof Error ? error.message : String(error),
814
815
  });
@@ -830,7 +831,7 @@ export class MessageHandler {
830
831
  console.log(
831
832
  `MessageHandler: Ignoring old UID change (${lastProcessedAt} < ${currentLastProcessedAt.toISOString()})`
832
833
  );
833
- if (process.env["DEBUG"] === "true") {
834
+ if (isRunnerDebugEnabled()) {
834
835
  logger.debug("Ignoring old UID change", {
835
836
  newUid: runnerUid,
836
837
  newLastProcessedAt: lastProcessedAt,
@@ -855,7 +856,7 @@ export class MessageHandler {
855
856
  }
856
857
  }
857
858
 
858
- if (process.env["DEBUG"] === "true") {
859
+ if (isRunnerDebugEnabled()) {
859
860
  logger.debug("Runner deactivated - being replaced", {
860
861
  newRunnerUid: runnerUid,
861
862
  ourUid: this.runner.getRunnerUid(),
@@ -882,7 +883,7 @@ export class MessageHandler {
882
883
  });
883
884
  } catch (error) {
884
885
  console.error("Failed to send deactivation notification:", error);
885
- if (process.env["DEBUG"] === "true") {
886
+ if (isRunnerDebugEnabled()) {
886
887
  logger.debug("Deactivation notification failed", {
887
888
  error: error instanceof Error ? error.message : String(error),
888
889
  });
package/src/index.ts CHANGED
@@ -5,6 +5,7 @@
5
5
  import { RunnerApp } from "./runner-sse";
6
6
  import { ConfigManager } from "./utils/config";
7
7
  import { logger, configureFileLogging } from "./utils/logger";
8
+ import { isRunnerDebugEnabled } from "./utils/debug";
8
9
  import path from "path";
9
10
  import fs from "fs/promises";
10
11
 
@@ -13,6 +14,7 @@ let runner: RunnerApp | null = null;
13
14
  async function main() {
14
15
  try {
15
16
  logger.info("Starting Northflare Runner...");
17
+ const debugEnabled = isRunnerDebugEnabled();
16
18
 
17
19
  // Load configuration (args already parsed by CLI)
18
20
  let configPath = process.argv[2]; // This is set by the CLI if --config was provided
@@ -53,7 +55,7 @@ async function main() {
53
55
  });
54
56
 
55
57
  // Additional debug logging
56
- if (process.env["DEBUG"] === "true") {
58
+ if (debugEnabled) {
57
59
  logger.debug("Debug mode enabled - verbose logging active", {
58
60
  dataDir: config.dataDir,
59
61
  heartbeatInterval: config.heartbeatInterval,
@@ -75,7 +77,7 @@ async function main() {
75
77
  });
76
78
 
77
79
  // Log additional details in debug mode
78
- if (process.env["DEBUG"] === "true" && runner) {
80
+ if (debugEnabled && runner) {
79
81
  logger.debug("Runner started with full details", {
80
82
  runnerId: runner.getRunnerId(),
81
83
  runnerUid: runner.getRunnerUid(),