orcareplay 0.2.2 → 0.2.4

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 (68) hide show
  1. package/dist/args.d.ts +33 -0
  2. package/dist/args.d.ts.map +1 -1
  3. package/dist/args.js +41 -5
  4. package/dist/args.js.map +1 -1
  5. package/dist/commands/attach.js +15 -4
  6. package/dist/commands/attach.js.map +1 -1
  7. package/dist/commands/inspect.d.ts +11 -0
  8. package/dist/commands/inspect.d.ts.map +1 -1
  9. package/dist/commands/inspect.js +43 -0
  10. package/dist/commands/inspect.js.map +1 -1
  11. package/dist/commands/quickstart.d.ts +48 -0
  12. package/dist/commands/quickstart.d.ts.map +1 -0
  13. package/dist/commands/quickstart.js +373 -0
  14. package/dist/commands/quickstart.js.map +1 -0
  15. package/dist/commands/record.d.ts +13 -0
  16. package/dist/commands/record.d.ts.map +1 -1
  17. package/dist/commands/record.js +119 -8
  18. package/dist/commands/record.js.map +1 -1
  19. package/dist/commands/replay.d.ts.map +1 -1
  20. package/dist/commands/replay.js +439 -283
  21. package/dist/commands/replay.js.map +1 -1
  22. package/dist/commands/scrub.d.ts.map +1 -1
  23. package/dist/commands/scrub.js +182 -47
  24. package/dist/commands/scrub.js.map +1 -1
  25. package/dist/commands/setup.d.ts.map +1 -1
  26. package/dist/commands/setup.js +67 -4
  27. package/dist/commands/setup.js.map +1 -1
  28. package/dist/exchange-events.d.ts.map +1 -1
  29. package/dist/exchange-events.js +23 -0
  30. package/dist/exchange-events.js.map +1 -1
  31. package/dist/flags.d.ts.map +1 -1
  32. package/dist/flags.js +68 -2
  33. package/dist/flags.js.map +1 -1
  34. package/dist/main.d.ts.map +1 -1
  35. package/dist/main.js +32 -0
  36. package/dist/main.js.map +1 -1
  37. package/dist/tls-capture.d.ts +10 -2
  38. package/dist/tls-capture.d.ts.map +1 -1
  39. package/dist/tls-capture.js +41 -3
  40. package/dist/tls-capture.js.map +1 -1
  41. package/dist/upstream.d.ts.map +1 -1
  42. package/dist/upstream.js +17 -0
  43. package/dist/upstream.js.map +1 -1
  44. package/package.json +13 -12
  45. package/quickstart/project/agent.mjs +128 -0
  46. package/quickstart/project/package.json +8 -0
  47. package/quickstart/project/src/schedule.js +41 -0
  48. package/quickstart/project/test/schedule.test.js +25 -0
  49. package/quickstart/trace/blobs/f7/f7c1592306093f65f441d2afd5f496b7635b7e18f5c15f55b11f71f0b552a118 +1 -0
  50. package/quickstart/trace/events.jsonl +19 -0
  51. package/quickstart/trace/fs/HEAD +1 -0
  52. package/quickstart/trace/fs/config +11 -0
  53. package/quickstart/trace/fs/description +1 -0
  54. package/quickstart/trace/fs/index +0 -0
  55. package/quickstart/trace/fs/info/exclude +11 -0
  56. package/quickstart/trace/fs/objects/1b/1f956f306fe2c66611dd9e280e7fd2dce1ecda +0 -0
  57. package/quickstart/trace/fs/objects/1c/c77eaef0608e088283cb62876b80be9473edce +0 -0
  58. package/quickstart/trace/fs/objects/20/0c1f7a4be93b037ff27cea57853a738fcbf744 +0 -0
  59. package/quickstart/trace/fs/objects/20/28a902b70fff80fe02a8aaaf30005fd91bafb7 +0 -0
  60. package/quickstart/trace/fs/objects/34/522daa46d0e3f8db09ec7d874fa6f05cbcdabf +0 -0
  61. package/quickstart/trace/fs/objects/48/a7bdafdaae1c53a354c7bd06c740719e1cb255 +0 -0
  62. package/quickstart/trace/fs/objects/80/13b71377c59b728861dd8eec39a919387a4b81 +0 -0
  63. package/quickstart/trace/fs/objects/9f/db6ace4a4410e535a2aef50e653e46a4c3694a +0 -0
  64. package/quickstart/trace/fs/objects/a4/371e26fb48bece62891a54e4374895fba69f0d +0 -0
  65. package/quickstart/trace/fs/objects/d3/3088476a7db5aef2dfd6c839d16d2b2ccaca40 +0 -0
  66. package/quickstart/trace/manifest.json +43 -0
  67. package/quickstart/trace/redactions.json +4 -0
  68. package/quickstart/trace/shell-frames.jsonl +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"tls-capture.js","sourceRoot":"","sources":["../src/tls-capture.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tls-capture.js","sourceRoot":"","sources":["../src/tls-capture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EACL,0BAA0B,EAC1B,UAAU,EACV,KAAK,EACL,eAAe,GAKhB,MAAM,mBAAmB,CAAC;AA+C3B;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAgB,EAChB,aAAiC;IAEjC,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,aAAa,CAAC;QAAE,OAAO;IACxD,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IAC7E,MAAM,gBAAgB,EAAE,CAAC;AAC3B,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,SAAS,qBAAqB,CAAC,IAAgB,EAAE,aAAiC;IAChF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC5C,iGAAiG;IACjG,mFAAmF;IACnF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC;IACvD,OAAO,QAAQ,IAAI,CAAC,CAAC,OAAO,IAAI,aAAa,KAAK,SAAS,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAsB;IAC1D,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,GAAG,CAAC;IAEzD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACxC,MAAM,YAAY,GAAG,qBAAqB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAEhE,8FAA8F;IAC9F,sEAAsE;IACtE,IAAI,CAAC,YAAY,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,GAAG,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC,CAAC;IAC5F,CAAC;IACD,IAAI,CAAC,YAAY;QAAE,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;IAE/C,2FAA2F;IAC3F,wFAAwF;IACxF,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACvD,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;IAC5B,MAAM,kBAAkB,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACpD,MAAM,MAAM,GAAG,MAAM,EAAE,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC;IAC5C,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACvE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAE1C,6FAA6F;IAC7F,iEAAiE;IACjE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IAEnC,OAAO;QACL,EAAE;QACF,YAAY,EAAE;YACZ,GAAG,EAAE;gBACH,EAAE;gBACF,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC;gBACjB,kBAAkB;gBAClB,aAAa,EAAE,CAAC,QAAqB,EAAE,EAAE;oBACvC,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;oBACvC,IAAI,MAAM;wBAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;gBAClF,CAAC;gBACD,QAAQ,EAAE,CAAC,MAAoB,EAAE,EAAE;oBACjC,IAAI,MAAM;wBAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;gBAC3E,CAAC;gBACD,SAAS,EAAE,CAAC,OAAyB,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC;aAC3F;SACF;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,aAAa,CAAC,GAAW,EAAE,QAAqB,EAAE,QAAqB;IAC9E,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO;IACvC,6FAA6F;IAC7F,gGAAgG;IAChG,4FAA4F;IAC5F,iFAAiF;IACjF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAClC,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;IACzC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO;IAClC,8FAA8F;IAC9F,+FAA+F;IAC/F,6FAA6F;IAC7F,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACzC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;gBAAE,OAAO;QAC5D,CAAC;QAAC,MAAM,CAAC;YACP,+EAA+E;YAC/E,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC;IAC1D,MAAM,GAAG,GAAG,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,GAAG,IAAI,EAAE,CAAC;IACvD,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO;IAC9B,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAElB,8FAA8F;IAC9F,2FAA2F;IAC3F,gGAAgG;IAChG,gGAAgG;IAChG,IAAI,QAAQ,CAAC,gBAAgB,EAAE,CAAC;QAC9B,GAAG,CAAC,IAAI,CAAC,uBAAuB,EAAE;YAChC,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,WAAW,EAAE,0BAA0B;YACvC,MAAM,EAAE,4EAA4E;YACpF,WAAW,EAAE,4EAA4E;YACzF,IAAI,EAAE,gDAAgD;SACvD,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE;QAC7B,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,MAAM,EAAE,8DAA8D;QACtE,WAAW,EAAE,4EAA4E;QACzF,IAAI,EAAE,yCAAyC;KAChD,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAA6B;IAC5D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,KAAK,eAAe;YAAE,SAAS;QACjF,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QACxC,MAAM,MAAM,GAAG,KAAK;aACjB,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAC3B,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,MAAM,CAAC;IACvC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAA+B,EAC/B,QAA0B,EAC1B,QAAgB,EAChB,GAA2B,EAC3B,GAAW;IAEX,iGAAiG;IACjG,8FAA8F;IAC9F,4EAA4E;IAC5E,GAAG,CAAC,WAAW,GAAG,QAAQ,CAAC;IAC3B,GAAG,CAAC,WAAW,GAAG,QAAQ,CAAC;IAC3B,2FAA2F;IAC3F,8FAA8F;IAC9F,yFAAyF;IACzF,GAAG,CAAC,mBAAmB,GAAG,QAAQ,CAAC,UAAU,CAAC;IAC9C,KAAK,MAAM,QAAQ,IAAI;QACrB,eAAe;QACf,oBAAoB;QACpB,gBAAgB;QAChB,eAAe;QACf,WAAW;KACZ,EAAE,CAAC;QACF,GAAG,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC;IACxC,CAAC;IACD,wFAAwF;IACxF,sEAAsE;IACtE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;IACpE,MAAM,OAAO,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtF,GAAG,CAAC,QAAQ,GAAG,OAAO,CAAC;IACvB,GAAG,CAAC,QAAQ,GAAG,OAAO,CAAC;IAEvB,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE;QAC3B,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,SAAS,EAAE,QAAQ,CAAC,WAAW;QAC/B,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;KACrC,CAAC,CAAC;IACH,GAAG,CAAC,KAAK,CAAC,iFAAiF,CAAC,CAAC;IAC7F,GAAG,CAAC,KAAK,CAAC,mFAAmF,CAAC,CAAC;IAC/F,GAAG,CAAC,KAAK,CAAC,iFAAiF,CAAC,CAAC;IAC7F,GAAG,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAExE,6FAA6F;IAC7F,4FAA4F;IAC5F,4FAA4F;IAC5F,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,MAAM,CAAC,MAAM,CAAC;YAClB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,CAAC;YACP,KAAK,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,WAAW,EAAE;SACzF,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAmB,EACnB,IAAY,EACZ,QAAqB;IAErB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC;QAClC,IAAI,EAAE,aAAa;QACnB,yFAAyF;QACzF,iEAAiE;QACjE,KAAK,EAAE,OAAO;QACd,IAAI;QACJ,KAAK,EAAE;YACL,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC/D,WAAW,EAAE,IAAI;YACjB,OAAO,EAAE,QAAQ,CAAC,cAAc;YAChC,SAAS,EAAE,QAAQ,CAAC,gBAAgB;SACrC;QACD,OAAO,EAAE,QAAQ,CAAC,WAAoB;KACvC,CAAC,CAAC;IACH,MAAM,MAAM,CAAC,MAAM,CAAC;QAClB,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,MAAM;QACb,IAAI;QACJ,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;QACrB,KAAK,EAAE;YACL,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,WAAW,EAAE,IAAI;YACjB,OAAO,EAAE,QAAQ,CAAC,eAAe;YACjC,KAAK,EAAE,QAAQ,CAAC,aAAa;YAC7B,yFAAyF;YACzF,iFAAiF;YACjF,GAAG,CAAC,QAAQ,CAAC,mBAAmB,KAAK,SAAS;gBAC5C,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC,mBAAmB,EAAE,CAAC;YACnD,SAAS,EAAE,QAAQ,CAAC,iBAAiB;YACrC,wFAAwF;YACxF,4FAA4F;YAC5F,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClD,WAAW,EAAE,QAAQ,CAAC,UAAU;SACjC;QACD,OAAO,EAAE,QAAQ,CAAC,YAAqB;KACxC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,aAAa,CAC1B,MAAmB,EACnB,IAAY,EACZ,MAAoB;IAEpB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC;QAClC,IAAI,EAAE,aAAa;QACnB,KAAK,EAAE,OAAO;QACd,IAAI;QACJ,KAAK,EAAE;YACL,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,WAAW,EAAE,KAAK;YAClB,MAAM,EAAE,4CAA4C;SACrD;KACF,CAAC,CAAC;IACH,MAAM,MAAM,CAAC,MAAM,CAAC;QAClB,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,MAAM;QACb,IAAI;QACJ,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;QACrB,KAAK,EAAE;YACL,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,MAAM,CAAC,aAAa;YACrC,eAAe,EAAE,MAAM,CAAC,aAAa;YACrC,WAAW,EAAE,MAAM,CAAC,UAAU;YAC9B,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;SAC/D;KACF,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,gBAAgB,CAAC,MAAyB,OAAO,CAAC,GAAG;IAClE,MAAM,UAAU,GAAG,GAAG,CAAC,oBAAoB,CAAC;IAC5C,IAAI,CAAC,UAAU;QAAE,OAAO,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,UAAU;SAC1B,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"upstream.d.ts","sourceRoot":"","sources":["../src/upstream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAG5C;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAC5C;;;;;;;OAOG;IACH,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;CACnC;AAED,wBAAsB,YAAY,CAChC,IAAI,EAAE,UAAU,EAChB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAAC,YAAY,CAAC,CAsBvB"}
1
+ {"version":3,"file":"upstream.d.ts","sourceRoot":"","sources":["../src/upstream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAI5C;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAC5C;;;;;;;OAOG;IACH,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;CACnC;AAED,wBAAsB,YAAY,CAChC,IAAI,EAAE,UAAU,EAChB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAAC,YAAY,CAAC,CAwCvB"}
package/dist/upstream.js CHANGED
@@ -1,7 +1,24 @@
1
+ import { unusableOrigin } from '@orcareplay/proxy';
1
2
  import { gatewayHeaders, readConfig, resolveUpstream } from './config.js';
2
3
  export async function upstreamPlan(args, env = process.env) {
3
4
  const config = await readConfig(env);
4
5
  const upstream = await resolveUpstream(args, env);
6
+ // Refused here, because here is where all three sources meet: `--upstream-*`,
7
+ // `ORCA_UPSTREAM_*`, and the gateway from the config file. `orca setup` refuses one on the way
8
+ // in, but a config written before it did, a hand-edited one, an environment variable and a flag
9
+ // all still arrive unchecked — and on the record path an origin is not only sent, it is
10
+ // *printed*: `distinctOrigins` renders it on the recording line, and an origin `doFetch` cannot
11
+ // parse comes back inside undici's TypeError, which the proxy hands to the agent as a 500 body.
12
+ // Neither sink can be made safe by scrubbing alone, because `recordableOrigin` answers with a
13
+ // value for a scheme-less URL whose username parses as the protocol. Refusing closes both.
14
+ for (const [dialect, origin] of Object.entries(upstream ?? {})) {
15
+ const problem = unusableOrigin(origin);
16
+ if (problem === undefined)
17
+ continue;
18
+ throw new Error(`the upstream for ${dialect} is not an origin orca can use: ${problem}` +
19
+ '\n give it as scheme, host and path: --upstream-openai https://gateway.example/v1' +
20
+ '\n read in order: --upstream-*, then ORCA_UPSTREAM_*, then the gateway from orca setup');
21
+ }
5
22
  const headers = gatewayHeaders(config, env);
6
23
  // Unanimity, not `some`. `upstreamHeaders` are attached to every live call the proxy makes —
7
24
  // there is no per-dialect header channel — so if any origin we might reach is not the gateway,
@@ -1 +1 @@
1
- {"version":3,"file":"upstream.js","sourceRoot":"","sources":["../src/upstream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AA6B1E,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAgB,EAChB,MAAyB,OAAO,CAAC,GAAG;IAEpC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5C,6FAA6F;IAC7F,+FAA+F;IAC/F,0FAA0F;IAC1F,+FAA+F;IAC/F,kFAAkF;IAClF,EAAE;IACF,gGAAgG;IAChG,4FAA4F;IAC5F,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,cAAc,GAClB,MAAM,CAAC,OAAO,EAAE,GAAG,KAAK,SAAS;QACjC,OAAO,CAAC,MAAM,GAAG,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,OAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IACrE,OAAO;QACL,QAAQ;QACR,OAAO,EAAE,cAAc,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;QAChF,aAAa,EAAE,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,OAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;KAChE,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,CAAS,EAAE,CAAS;IACtC,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACzD,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"upstream.js","sourceRoot":"","sources":["../src/upstream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AA6B1E,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAgB,EAChB,MAAyB,OAAO,CAAC,GAAG;IAEpC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAElD,8EAA8E;IAC9E,+FAA+F;IAC/F,gGAAgG;IAChG,wFAAwF;IACxF,gGAAgG;IAChG,gGAAgG;IAChG,8FAA8F;IAC9F,2FAA2F;IAC3F,KAAK,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/D,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,OAAO,KAAK,SAAS;YAAE,SAAS;QACpC,MAAM,IAAI,KAAK,CACb,oBAAoB,OAAO,mCAAmC,OAAO,EAAE;YACrE,oFAAoF;YACpF,yFAAyF,CAC5F,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5C,6FAA6F;IAC7F,+FAA+F;IAC/F,0FAA0F;IAC1F,+FAA+F;IAC/F,kFAAkF;IAClF,EAAE;IACF,gGAAgG;IAChG,4FAA4F;IAC5F,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,cAAc,GAClB,MAAM,CAAC,OAAO,EAAE,GAAG,KAAK,SAAS;QACjC,OAAO,CAAC,MAAM,GAAG,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,OAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IACrE,OAAO;QACL,QAAQ;QACR,OAAO,EAAE,cAAc,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;QAChF,aAAa,EAAE,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,OAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;KAChE,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,CAAS,EAAE,CAAS;IACtC,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACzD,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "orcareplay",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "mcpName": "io.github.Continuum-AI-Corp/orcareplay",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -15,7 +15,8 @@
15
15
  ".": "./dist/index.js"
16
16
  },
17
17
  "files": [
18
- "dist"
18
+ "dist",
19
+ "quickstart"
19
20
  ],
20
21
  "engines": {
21
22
  "node": ">=20.0.0"
@@ -37,15 +38,15 @@
37
38
  "directory": "packages/cli"
38
39
  },
39
40
  "dependencies": {
40
- "@orcareplay/schema": "0.2.2",
41
- "@orcareplay/plugin-api": "0.2.2",
42
- "@orcareplay/core": "0.2.2",
43
- "@orcareplay/proxy": "0.2.2",
44
- "@orcareplay/providers": "0.2.2",
45
- "@orcareplay/adapters": "0.2.2",
46
- "@orcareplay/fs-capture": "0.2.2",
47
- "@orcareplay/viewer": "0.2.2",
48
- "@orcareplay/mcp-shim": "0.2.2",
49
- "@orcareplay/shell-shim": "0.2.2"
41
+ "@orcareplay/schema": "0.2.4",
42
+ "@orcareplay/plugin-api": "0.2.4",
43
+ "@orcareplay/core": "0.2.4",
44
+ "@orcareplay/proxy": "0.2.4",
45
+ "@orcareplay/providers": "0.2.4",
46
+ "@orcareplay/adapters": "0.2.4",
47
+ "@orcareplay/fs-capture": "0.2.4",
48
+ "@orcareplay/viewer": "0.2.4",
49
+ "@orcareplay/mcp-shim": "0.2.4",
50
+ "@orcareplay/shell-shim": "0.2.4"
50
51
  }
51
52
  }
@@ -0,0 +1,128 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * A very small coding agent, written so the quickstart needs nothing but Node.
4
+ *
5
+ * It reads `OPENAI_BASE_URL`, which is what `orca record` redirects, and drives an ordinary tool
6
+ * loop over chat completions: read the failing test, edit the source, run the test again. That is
7
+ * the whole shape orca depends on, so a trace recorded from it replays with nothing installed
8
+ * beyond the runtime orca already needs.
9
+ *
10
+ * orca record node -- node agent.mjs
11
+ */
12
+ import { execFileSync } from 'node:child_process';
13
+ import { readFileSync, writeFileSync } from 'node:fs';
14
+ import { join } from 'node:path';
15
+
16
+ const base = process.env.OPENAI_BASE_URL;
17
+ if (!base) {
18
+ console.error('agent: OPENAI_BASE_URL is not set — run this under `orca record`');
19
+ process.exit(2);
20
+ }
21
+
22
+ const cwd = process.cwd();
23
+ const model = process.env.AGENT_MODEL ?? 'gpt-5.4-mini';
24
+ const maxTurns = Number(process.env.AGENT_MAX_TURNS ?? '8');
25
+
26
+ const tools = [
27
+ {
28
+ type: 'function',
29
+ function: {
30
+ name: 'read_file',
31
+ description: 'Read a file from the project',
32
+ parameters: {
33
+ type: 'object',
34
+ properties: { path: { type: 'string' } },
35
+ required: ['path'],
36
+ },
37
+ },
38
+ },
39
+ {
40
+ type: 'function',
41
+ function: {
42
+ name: 'write_file',
43
+ description: 'Replace a file in the project with new contents',
44
+ parameters: {
45
+ type: 'object',
46
+ properties: { path: { type: 'string' }, content: { type: 'string' } },
47
+ required: ['path', 'content'],
48
+ },
49
+ },
50
+ },
51
+ ];
52
+
53
+ function runTests() {
54
+ try {
55
+ const out = execFileSync(process.execPath, ['--test', 'test/schedule.test.js'], {
56
+ cwd,
57
+ encoding: 'utf8',
58
+ stdio: ['ignore', 'pipe', 'pipe'],
59
+ });
60
+ return { ok: true, out };
61
+ } catch (err) {
62
+ return { ok: false, out: `${err.stdout ?? ''}${err.stderr ?? ''}` };
63
+ }
64
+ }
65
+
66
+ function useTool(name, input) {
67
+ if (name === 'read_file') return readFileSync(join(cwd, input.path), 'utf8');
68
+ if (name === 'write_file') {
69
+ writeFileSync(join(cwd, input.path), input.content);
70
+ return `wrote ${input.path}`;
71
+ }
72
+ return `unknown tool ${name}`;
73
+ }
74
+
75
+ const messages = [
76
+ {
77
+ role: 'user',
78
+ content:
79
+ 'The test suite in this project is failing. Read src/schedule.js and test/schedule.test.js, ' +
80
+ 'then fix the source so every test passes. You cannot run the tests — reason it out. ' +
81
+ 'Do not edit the tests. Say what you changed when you are done.',
82
+ },
83
+ ];
84
+
85
+ for (let turn = 0; turn < maxTurns; turn += 1) {
86
+ const res = await fetch(`${base}/chat/completions`, {
87
+ method: 'POST',
88
+ headers: {
89
+ 'content-type': 'application/json',
90
+ ...(process.env.OPENAI_API_KEY
91
+ ? { authorization: `Bearer ${process.env.OPENAI_API_KEY}` }
92
+ : {}),
93
+ },
94
+ body: JSON.stringify({ model, messages, tools, max_tokens: 2048 }),
95
+ });
96
+
97
+ if (!res.ok) {
98
+ console.error(`agent: ${res.status} ${await res.text()}`);
99
+ process.exit(1);
100
+ }
101
+
102
+ const reply = await res.json();
103
+ const choice = reply.choices?.[0]?.message;
104
+ if (!choice) {
105
+ console.error('agent: no choice in the response');
106
+ process.exit(1);
107
+ }
108
+ messages.push(choice);
109
+
110
+ if (choice.content) console.log(String(choice.content).trim());
111
+
112
+ const calls = choice.tool_calls ?? [];
113
+ if (calls.length === 0) break;
114
+
115
+ for (const call of calls) {
116
+ const input = JSON.parse(call.function.arguments || '{}');
117
+ messages.push({
118
+ role: 'tool',
119
+ tool_call_id: call.id,
120
+ content: useTool(call.function.name, input),
121
+ });
122
+ }
123
+ }
124
+
125
+ // Exits 0 because the agent believes it is finished, which is the point of the demo: the run
126
+ // looks clean and the suite is still red. Whether it actually worked is what `npm test` says
127
+ // next, and what a fork onto another model is for.
128
+ console.log('done');
@@ -0,0 +1,8 @@
1
+ {
2
+ "name": "schedule",
3
+ "private": true,
4
+ "type": "module",
5
+ "scripts": {
6
+ "test": "node --test test/schedule.test.js"
7
+ }
8
+ }
@@ -0,0 +1,41 @@
1
+ /**
2
+ * When does a recurring reminder next fire?
3
+ *
4
+ * A reminder set for "every morning at 09:00" means 09:00 on the user's own clock. The answer is
5
+ * an absolute instant, because that is what a scheduler waits on.
6
+ */
7
+
8
+ /** The zone's offset from UTC, in milliseconds, at a given instant. */
9
+ function offsetAt(instant, timeZone) {
10
+ const parts = new Intl.DateTimeFormat('en-US', {
11
+ timeZone,
12
+ hour12: false,
13
+ year: 'numeric',
14
+ month: '2-digit',
15
+ day: '2-digit',
16
+ hour: '2-digit',
17
+ minute: '2-digit',
18
+ second: '2-digit',
19
+ }).formatToParts(instant);
20
+ const at = Object.fromEntries(parts.map((p) => [p.type, p.value]));
21
+ const asUtc = Date.UTC(
22
+ Number(at.year),
23
+ Number(at.month) - 1,
24
+ Number(at.day),
25
+ Number(at.hour) % 24,
26
+ Number(at.minute),
27
+ Number(at.second),
28
+ );
29
+ return asUtc - instant.getTime();
30
+ }
31
+
32
+ /** The instant at which `wallClock` reads on the clock in `timeZone`. */
33
+ export function instantOf(wallClockIso, timeZone) {
34
+ const naive = new Date(`${wallClockIso}Z`);
35
+ return new Date(naive.getTime() - offsetAt(naive, timeZone));
36
+ }
37
+
38
+ export function nextOccurrence(fromWallClock, days, timeZone) {
39
+ const start = instantOf(fromWallClock, timeZone);
40
+ return new Date(start.getTime() + days * 24 * 60 * 60 * 1000).toISOString();
41
+ }
@@ -0,0 +1,25 @@
1
+ import { strict as assert } from 'node:assert';
2
+ import test from 'node:test';
3
+ import { nextOccurrence } from '../src/schedule.js';
4
+
5
+ const NY = 'America/New_York';
6
+
7
+ // A reminder is a wall-clock promise: 09:00 tomorrow means 09:00 on the user's clock, whatever
8
+ // the offset does overnight. New York springs forward at 02:00 on 8 March 2026, so the day is
9
+ // 23 hours long and 09:00 the next morning is an hour *earlier* in absolute time.
10
+ test('keeps the wall-clock time across the spring transition', () => {
11
+ assert.equal(nextOccurrence('2026-03-07T09:00', 1, NY), '2026-03-08T13:00:00.000Z');
12
+ });
13
+
14
+ // And back again on 1 November: a 25-hour day.
15
+ test('keeps the wall-clock time across the autumn transition', () => {
16
+ assert.equal(nextOccurrence('2026-10-31T09:00', 1, NY), '2026-11-01T14:00:00.000Z');
17
+ });
18
+
19
+ test('an ordinary day is unaffected', () => {
20
+ assert.equal(nextOccurrence('2026-06-01T09:00', 1, NY), '2026-06-02T13:00:00.000Z');
21
+ });
22
+
23
+ test('a zone without daylight saving is unaffected', () => {
24
+ assert.equal(nextOccurrence('2026-03-07T09:00', 1, 'Asia/Shanghai'), '2026-03-08T01:00:00.000Z');
25
+ });
@@ -0,0 +1 @@
1
+ "{\"model\":\"gpt-5.4-mini\",\"messages\":[{\"role\":\"user\",\"content\":\"The test suite in this project is failing. Read src/schedule.js and test/schedule.test.js, then fix the source so every test passes. You cannot run the tests — reason it out. Do not edit the tests. Say what you changed when you are done.\"},{\"role\":\"assistant\",\"content\":null,\"reasoning_content\":null,\"tool_calls\":[{\"id\":\"call_TWzcq8Oq1CO22vKrYcmkPTo5\",\"type\":\"function\",\"function\":{\"name\":\"read_file\",\"arguments\":\"{\\\"path\\\":\\\"src/schedule.js\\\"}\"}},{\"id\":\"call_hbFPpe99k3FsiPCGGcDSjds6\",\"type\":\"function\",\"function\":{\"name\":\"read_file\",\"arguments\":\"{\\\"path\\\":\\\"test/schedule.test.js\\\"}\"}}]},{\"role\":\"tool\",\"tool_call_id\":\"call_TWzcq8Oq1CO22vKrYcmkPTo5\",\"content\":\"/**\\n * When does a recurring reminder next fire?\\n *\\n * A reminder set for \\\"every morning at 09:00\\\" means 09:00 on the user's own clock. The answer is\\n * an absolute instant, because that is what a scheduler waits on.\\n */\\n\\n/** The zone's offset from UTC, in milliseconds, at a given instant. */\\nfunction offsetAt(instant, timeZone) {\\n const parts = new Intl.DateTimeFormat('en-US', {\\n timeZone,\\n hour12: false,\\n year: 'numeric',\\n month: '2-digit',\\n day: '2-digit',\\n hour: '2-digit',\\n minute: '2-digit',\\n second: '2-digit',\\n }).formatToParts(instant);\\n const at = Object.fromEntries(parts.map((p) => [p.type, p.value]));\\n const asUtc = Date.UTC(\\n Number(at.year),\\n Number(at.month) - 1,\\n Number(at.day),\\n Number(at.hour) % 24,\\n Number(at.minute),\\n Number(at.second),\\n );\\n return asUtc - instant.getTime();\\n}\\n\\n/** The instant at which `wallClock` reads on the clock in `timeZone`. */\\nexport function instantOf(wallClockIso, timeZone) {\\n const naive = new Date(`${wallClockIso}Z`);\\n return new Date(naive.getTime() - offsetAt(naive, timeZone));\\n}\\n\\nexport function nextOccurrence(fromWallClock, days, timeZone) {\\n const start = instantOf(fromWallClock, timeZone);\\n return new Date(start.getTime() + days * 24 * 60 * 60 * 1000).toISOString();\\n}\\n\"},{\"role\":\"tool\",\"tool_call_id\":\"call_hbFPpe99k3FsiPCGGcDSjds6\",\"content\":\"import { strict as assert } from 'node:assert';\\nimport test from 'node:test';\\nimport { nextOccurrence } from '../src/schedule.js';\\n\\nconst NY = 'America/New_York';\\n\\n// A reminder is a wall-clock promise: 09:00 tomorrow means 09:00 on the user's clock, whatever\\n// the offset does overnight. New York springs forward at 02:00 on 8 March 2026, so the day is\\n// 23 hours long and 09:00 the next morning is an hour *earlier* in absolute time.\\ntest('keeps the wall-clock time across the spring transition', () => {\\n assert.equal(nextOccurrence('2026-03-07T09:00', 1, NY), '2026-03-08T13:00:00.000Z');\\n});\\n\\n// And back again on 1 November: a 25-hour day.\\ntest('keeps the wall-clock time across the autumn transition', () => {\\n assert.equal(nextOccurrence('2026-10-31T09:00', 1, NY), '2026-11-01T14:00:00.000Z');\\n});\\n\\ntest('an ordinary day is unaffected', () => {\\n assert.equal(nextOccurrence('2026-06-01T09:00', 1, NY), '2026-06-02T13:00:00.000Z');\\n});\\n\\ntest('a zone without daylight saving is unaffected', () => {\\n assert.equal(nextOccurrence('2026-03-07T09:00', 1, 'Asia/Shanghai'), '2026-03-08T01:00:00.000Z');\\n});\\n\"},{\"role\":\"assistant\",\"content\":null,\"reasoning_content\":null,\"tool_calls\":[{\"id\":\"call_KjxzcZnKrkAYgfFYXCaSelGV\",\"type\":\"function\",\"function\":{\"name\":\"write_file\",\"arguments\":\"{\\\"path\\\":\\\"src/schedule.js\\\",\\\"content\\\":\\\"/**\\\\n * When does a recurring reminder next fire?\\\\n *\\\\n * A reminder set for \\\\\\\"every morning at 09:00\\\\\\\" means 09:00 on the user's own clock. The answer is\\\\n * an absolute instant, because that is what a scheduler waits on.\\\\n */\\\\n\\\\n/** The zone's offset from UTC, in milliseconds, at a given instant. */\\\\nfunction offsetAt(instant, timeZone) {\\\\n const parts = new Intl.DateTimeFormat('en-US', {\\\\n timeZone,\\\\n hour12: false,\\\\n year: 'numeric',\\\\n month: '2-digit',\\\\n day: '2-digit',\\\\n hour: '2-digit',\\\\n minute: '2-digit',\\\\n second: '2-digit',\\\\n }).formatToParts(instant);\\\\n const at = Object.fromEntries(parts.map((p) => [p.type, p.value]));\\\\n const asUtc = Date.UTC(\\\\n Number(at.year),\\\\n Number(at.month) - 1,\\\\n Number(at.day),\\\\n Number(at.hour) % 24,\\\\n Number(at.minute),\\\\n Number(at.second),\\\\n );\\\\n return asUtc - instant.getTime();\\\\n}\\\\n\\\\n/** The instant at which `wallClock` reads on the clock in `timeZone`. */\\\\nexport function instantOf(wallClockIso, timeZone) {\\\\n const naive = new Date(`${wallClockIso}Z`);\\\\n return new Date(naive.getTime() - offsetAt(naive, timeZone));\\\\n}\\\\n\\\\nexport function nextOccurrence(fromWallClock, days, timeZone) {\\\\n // Add days in wall-clock space, then convert that new local time to an absolute instant.\\\\n const wallClock = new Date(`${fromWallClock}Z`);\\\\n wallClock.setUTCDate(wallClock.getUTCDate() + days);\\\\n const nextWallClockIso = wallClock.toISOString().replace(/Z$/, '');\\\\n return instantOf(nextWallClockIso, timeZone).toISOString();\\\\n}\\\\n\\\"}\"}}]},{\"role\":\"tool\",\"tool_call_id\":\"call_KjxzcZnKrkAYgfFYXCaSelGV\",\"content\":\"wrote src/schedule.js\"}],\"tools\":[{\"type\":\"function\",\"function\":{\"name\":\"read_file\",\"description\":\"Read a file from the project\",\"parameters\":{\"type\":\"object\",\"properties\":{\"path\":{\"type\":\"string\"}},\"required\":[\"path\"]}}},{\"type\":\"function\",\"function\":{\"name\":\"write_file\",\"description\":\"Replace a file in the project with new contents\",\"parameters\":{\"type\":\"object\",\"properties\":{\"path\":{\"type\":\"string\"},\"content\":{\"type\":\"string\"}},\"required\":[\"path\",\"content\"]}}}],\"max_tokens\":2048}"
@@ -0,0 +1,19 @@
1
+ {"seq":0,"ts":"2026-09-02T02:52:40.494Z","mono_us":162930,"turn":0,"type":"run.start","actor":"orca","attrs":{"adapter":"node","cwd":"C:\\qs","proxy":"http://127.0.0.1:56508"}}
2
+ {"seq":1,"ts":"2026-09-02T02:52:40.530Z","mono_us":198859,"turn":0,"type":"fs.snapshot","actor":"orca","attrs":{"tree":"8013b71377c59b728861dd8eec39a919387a4b81","changes":0,"initial":true}}
3
+ {"seq":2,"ts":"2026-09-02T02:52:43.924Z","mono_us":3592424,"turn":1,"type":"model.request","actor":"agent","attrs":{"model":"gpt-5.4-mini","dialect":"openai","path":"/v1/chat/completions","messages":1,"tools":2},"payload":"{\"model\":\"gpt-5.4-mini\",\"messages\":[{\"role\":\"user\",\"content\":\"The test suite in this project is failing. Read src/schedule.js and test/schedule.test.js, then fix the source so every test passes. You cannot run the tests — reason it out. Do not edit the tests. Say what you changed when you are done.\"}],\"tools\":[{\"type\":\"function\",\"function\":{\"name\":\"read_file\",\"description\":\"Read a file from the project\",\"parameters\":{\"type\":\"object\",\"properties\":{\"path\":{\"type\":\"string\"}},\"required\":[\"path\"]}}},{\"type\":\"function\",\"function\":{\"name\":\"write_file\",\"description\":\"Replace a file in the project with new contents\",\"parameters\":{\"type\":\"object\",\"properties\":{\"path\":{\"type\":\"string\"},\"content\":{\"type\":\"string\"}},\"required\":[\"path\",\"content\"]}}}],\"max_tokens\":2048}"}
4
+ {"seq":3,"ts":"2026-09-02T02:52:43.926Z","mono_us":3594693,"turn":1,"type":"model.response","actor":"model","attrs":{"model":"gpt-5.4-mini-2026-03-17","stop_reason":"tool_use","input_tokens":422,"output_tokens":66,"status":200,"duration_ms":3288,"streamed":false},"payload":"{\"id\":\"resp_071e73faad484b6f016a978f7a380487d08c351f09bd7321be\",\"object\":\"chat.completion\",\"created\":1788317562,\"model\":\"gpt-5.4-mini-2026-03-17\",\"choices\":[{\"index\":0,\"message\":{\"role\":\"assistant\",\"content\":null,\"reasoning_content\":null,\"tool_calls\":[{\"id\":\"call_TWzcq8Oq1CO22vKrYcmkPTo5\",\"type\":\"function\",\"function\":{\"name\":\"read_file\",\"arguments\":\"{\\\"path\\\":\\\"src/schedule.js\\\"}\"}},{\"id\":\"call_hbFPpe99k3FsiPCGGcDSjds6\",\"type\":\"function\",\"function\":{\"name\":\"read_file\",\"arguments\":\"{\\\"path\\\":\\\"test/schedule.test.js\\\"}\"}}]},\"finish_reason\":\"tool_calls\",\"native_finish_reason\":\"tool_calls\"}],\"usage\":{\"completion_tokens\":66,\"total_tokens\":488,\"prompt_tokens\":422,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cached_creation_tokens\":0},\"completion_tokens_details\":{\"reasoning_tokens\":9}}}"}
5
+ {"seq":4,"ts":"2026-09-02T02:52:43.926Z","mono_us":3595089,"turn":1,"type":"tool.call","actor":"model","causes":[3],"attrs":{"tool_use_id":"call_TWzcq8Oq1CO22vKrYcmkPTo5","name":"read_file","input":{"path":"src/schedule.js"}}}
6
+ {"seq":5,"ts":"2026-09-02T02:52:43.927Z","mono_us":3595276,"turn":1,"type":"tool.call","actor":"model","causes":[3],"attrs":{"tool_use_id":"call_hbFPpe99k3FsiPCGGcDSjds6","name":"read_file","input":{"path":"test/schedule.test.js"}}}
7
+ {"seq":6,"ts":"2026-09-02T02:52:43.974Z","mono_us":3642808,"turn":1,"type":"fs.snapshot","actor":"orca","attrs":{"tree":"8013b71377c59b728861dd8eec39a919387a4b81","changes":0}}
8
+ {"seq":7,"ts":"2026-09-02T02:53:43.899Z","mono_us":63567793,"turn":2,"type":"tool.result","actor":"harness","causes":[4],"attrs":{"tool_use_id":"call_TWzcq8Oq1CO22vKrYcmkPTo5","name":"read_file","is_error":false,"bytes":1291},"payload":"/**\n * When does a recurring reminder next fire?\n *\n * A reminder set for \"every morning at 09:00\" means 09:00 on the user's own clock. The answer is\n * an absolute instant, because that is what a scheduler waits on.\n */\n\n/** The zone's offset from UTC, in milliseconds, at a given instant. */\nfunction offsetAt(instant, timeZone) {\n const parts = new Intl.DateTimeFormat('en-US', {\n timeZone,\n hour12: false,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n }).formatToParts(instant);\n const at = Object.fromEntries(parts.map((p) => [p.type, p.value]));\n const asUtc = Date.UTC(\n Number(at.year),\n Number(at.month) - 1,\n Number(at.day),\n Number(at.hour) % 24,\n Number(at.minute),\n Number(at.second),\n );\n return asUtc - instant.getTime();\n}\n\n/** The instant at which `wallClock` reads on the clock in `timeZone`. */\nexport function instantOf(wallClockIso, timeZone) {\n const naive = new Date(`${wallClockIso}Z`);\n return new Date(naive.getTime() - offsetAt(naive, timeZone));\n}\n\nexport function nextOccurrence(fromWallClock, days, timeZone) {\n const start = instantOf(fromWallClock, timeZone);\n return new Date(start.getTime() + days * 24 * 60 * 60 * 1000).toISOString();\n}\n"}
9
+ {"seq":8,"ts":"2026-09-02T02:53:43.900Z","mono_us":63568582,"turn":2,"type":"tool.result","actor":"harness","causes":[5],"attrs":{"tool_use_id":"call_hbFPpe99k3FsiPCGGcDSjds6","name":"read_file","is_error":false,"bytes":1115},"payload":"import { strict as assert } from 'node:assert';\nimport test from 'node:test';\nimport { nextOccurrence } from '../src/schedule.js';\n\nconst NY = 'America/New_York';\n\n// A reminder is a wall-clock promise: 09:00 tomorrow means 09:00 on the user's clock, whatever\n// the offset does overnight. New York springs forward at 02:00 on 8 March 2026, so the day is\n// 23 hours long and 09:00 the next morning is an hour *earlier* in absolute time.\ntest('keeps the wall-clock time across the spring transition', () => {\n assert.equal(nextOccurrence('2026-03-07T09:00', 1, NY), '2026-03-08T13:00:00.000Z');\n});\n\n// And back again on 1 November: a 25-hour day.\ntest('keeps the wall-clock time across the autumn transition', () => {\n assert.equal(nextOccurrence('2026-10-31T09:00', 1, NY), '2026-11-01T14:00:00.000Z');\n});\n\ntest('an ordinary day is unaffected', () => {\n assert.equal(nextOccurrence('2026-06-01T09:00', 1, NY), '2026-06-02T13:00:00.000Z');\n});\n\ntest('a zone without daylight saving is unaffected', () => {\n assert.equal(nextOccurrence('2026-03-07T09:00', 1, 'Asia/Shanghai'), '2026-03-08T01:00:00.000Z');\n});\n"}
10
+ {"seq":9,"ts":"2026-09-02T02:53:43.901Z","mono_us":63568921,"turn":2,"type":"model.request","actor":"agent","causes":[7,8],"attrs":{"model":"gpt-5.4-mini","dialect":"openai","path":"/v1/chat/completions","messages":3,"tools":2},"payload":"{\"model\":\"gpt-5.4-mini\",\"messages\":[{\"role\":\"user\",\"content\":\"The test suite in this project is failing. Read src/schedule.js and test/schedule.test.js, then fix the source so every test passes. You cannot run the tests — reason it out. Do not edit the tests. Say what you changed when you are done.\"},{\"role\":\"assistant\",\"content\":null,\"reasoning_content\":null,\"tool_calls\":[{\"id\":\"call_TWzcq8Oq1CO22vKrYcmkPTo5\",\"type\":\"function\",\"function\":{\"name\":\"read_file\",\"arguments\":\"{\\\"path\\\":\\\"src/schedule.js\\\"}\"}},{\"id\":\"call_hbFPpe99k3FsiPCGGcDSjds6\",\"type\":\"function\",\"function\":{\"name\":\"read_file\",\"arguments\":\"{\\\"path\\\":\\\"test/schedule.test.js\\\"}\"}}]},{\"role\":\"tool\",\"tool_call_id\":\"call_TWzcq8Oq1CO22vKrYcmkPTo5\",\"content\":\"/**\\n * When does a recurring reminder next fire?\\n *\\n * A reminder set for \\\"every morning at 09:00\\\" means 09:00 on the user's own clock. The answer is\\n * an absolute instant, because that is what a scheduler waits on.\\n */\\n\\n/** The zone's offset from UTC, in milliseconds, at a given instant. */\\nfunction offsetAt(instant, timeZone) {\\n const parts = new Intl.DateTimeFormat('en-US', {\\n timeZone,\\n hour12: false,\\n year: 'numeric',\\n month: '2-digit',\\n day: '2-digit',\\n hour: '2-digit',\\n minute: '2-digit',\\n second: '2-digit',\\n }).formatToParts(instant);\\n const at = Object.fromEntries(parts.map((p) => [p.type, p.value]));\\n const asUtc = Date.UTC(\\n Number(at.year),\\n Number(at.month) - 1,\\n Number(at.day),\\n Number(at.hour) % 24,\\n Number(at.minute),\\n Number(at.second),\\n );\\n return asUtc - instant.getTime();\\n}\\n\\n/** The instant at which `wallClock` reads on the clock in `timeZone`. */\\nexport function instantOf(wallClockIso, timeZone) {\\n const naive = new Date(`${wallClockIso}Z`);\\n return new Date(naive.getTime() - offsetAt(naive, timeZone));\\n}\\n\\nexport function nextOccurrence(fromWallClock, days, timeZone) {\\n const start = instantOf(fromWallClock, timeZone);\\n return new Date(start.getTime() + days * 24 * 60 * 60 * 1000).toISOString();\\n}\\n\"},{\"role\":\"tool\",\"tool_call_id\":\"call_hbFPpe99k3FsiPCGGcDSjds6\",\"content\":\"import { strict as assert } from 'node:assert';\\nimport test from 'node:test';\\nimport { nextOccurrence } from '../src/schedule.js';\\n\\nconst NY = 'America/New_York';\\n\\n// A reminder is a wall-clock promise: 09:00 tomorrow means 09:00 on the user's clock, whatever\\n// the offset does overnight. New York springs forward at 02:00 on 8 March 2026, so the day is\\n// 23 hours long and 09:00 the next morning is an hour *earlier* in absolute time.\\ntest('keeps the wall-clock time across the spring transition', () => {\\n assert.equal(nextOccurrence('2026-03-07T09:00', 1, NY), '2026-03-08T13:00:00.000Z');\\n});\\n\\n// And back again on 1 November: a 25-hour day.\\ntest('keeps the wall-clock time across the autumn transition', () => {\\n assert.equal(nextOccurrence('2026-10-31T09:00', 1, NY), '2026-11-01T14:00:00.000Z');\\n});\\n\\ntest('an ordinary day is unaffected', () => {\\n assert.equal(nextOccurrence('2026-06-01T09:00', 1, NY), '2026-06-02T13:00:00.000Z');\\n});\\n\\ntest('a zone without daylight saving is unaffected', () => {\\n assert.equal(nextOccurrence('2026-03-07T09:00', 1, 'Asia/Shanghai'), '2026-03-08T01:00:00.000Z');\\n});\\n\"}],\"tools\":[{\"type\":\"function\",\"function\":{\"name\":\"read_file\",\"description\":\"Read a file from the project\",\"parameters\":{\"type\":\"object\",\"properties\":{\"path\":{\"type\":\"string\"}},\"required\":[\"path\"]}}},{\"type\":\"function\",\"function\":{\"name\":\"write_file\",\"description\":\"Replace a file in the project with new contents\",\"parameters\":{\"type\":\"object\",\"properties\":{\"path\":{\"type\":\"string\"},\"content\":{\"type\":\"string\"}},\"required\":[\"path\",\"content\"]}}}],\"max_tokens\":2048}"}
11
+ {"seq":10,"ts":"2026-09-02T02:53:43.901Z","mono_us":63569620,"turn":2,"type":"model.response","actor":"model","attrs":{"model":"gpt-5.4-mini-2026-03-17","stop_reason":"tool_use","input_tokens":1201,"output_tokens":4127,"status":200,"duration_ms":59968,"streamed":false},"payload":"{\"id\":\"resp_05c30652e2904181016a978f7d59ec87d0b7e287e4ac375d31\",\"object\":\"chat.completion\",\"created\":1788317565,\"model\":\"gpt-5.4-mini-2026-03-17\",\"choices\":[{\"index\":0,\"message\":{\"role\":\"assistant\",\"content\":null,\"reasoning_content\":null,\"tool_calls\":[{\"id\":\"call_KjxzcZnKrkAYgfFYXCaSelGV\",\"type\":\"function\",\"function\":{\"name\":\"write_file\",\"arguments\":\"{\\\"path\\\":\\\"src/schedule.js\\\",\\\"content\\\":\\\"/**\\\\n * When does a recurring reminder next fire?\\\\n *\\\\n * A reminder set for \\\\\\\"every morning at 09:00\\\\\\\" means 09:00 on the user's own clock. The answer is\\\\n * an absolute instant, because that is what a scheduler waits on.\\\\n */\\\\n\\\\n/** The zone's offset from UTC, in milliseconds, at a given instant. */\\\\nfunction offsetAt(instant, timeZone) {\\\\n const parts = new Intl.DateTimeFormat('en-US', {\\\\n timeZone,\\\\n hour12: false,\\\\n year: 'numeric',\\\\n month: '2-digit',\\\\n day: '2-digit',\\\\n hour: '2-digit',\\\\n minute: '2-digit',\\\\n second: '2-digit',\\\\n }).formatToParts(instant);\\\\n const at = Object.fromEntries(parts.map((p) =\\u003e [p.type, p.value]));\\\\n const asUtc = Date.UTC(\\\\n Number(at.year),\\\\n Number(at.month) - 1,\\\\n Number(at.day),\\\\n Number(at.hour) % 24,\\\\n Number(at.minute),\\\\n Number(at.second),\\\\n );\\\\n return asUtc - instant.getTime();\\\\n}\\\\n\\\\n/** The instant at which `wallClock` reads on the clock in `timeZone`. */\\\\nexport function instantOf(wallClockIso, timeZone) {\\\\n const naive = new Date(`${wallClockIso}Z`);\\\\n return new Date(naive.getTime() - offsetAt(naive, timeZone));\\\\n}\\\\n\\\\nexport function nextOccurrence(fromWallClock, days, timeZone) {\\\\n // Add days in wall-clock space, then convert that new local time to an absolute instant.\\\\n const wallClock = new Date(`${fromWallClock}Z`);\\\\n wallClock.setUTCDate(wallClock.getUTCDate() + days);\\\\n const nextWallClockIso = wallClock.toISOString().replace(/Z$/, '');\\\\n return instantOf(nextWallClockIso, timeZone).toISOString();\\\\n}\\\\n\\\"}\"}}]},\"finish_reason\":\"tool_calls\",\"native_finish_reason\":\"tool_calls\"}],\"usage\":{\"completion_tokens\":4127,\"total_tokens\":5328,\"prompt_tokens\":1201,\"prompt_tokens_details\":{\"cached_tokens\":0,\"cached_creation_tokens\":0},\"completion_tokens_details\":{\"reasoning_tokens\":3636}}}"}
12
+ {"seq":11,"ts":"2026-09-02T02:53:43.902Z","mono_us":63570132,"turn":2,"type":"tool.call","actor":"model","causes":[10],"attrs":{"tool_use_id":"call_KjxzcZnKrkAYgfFYXCaSelGV","name":"write_file","input":{"path":"src/schedule.js","content":"/**\n * When does a recurring reminder next fire?\n *\n * A reminder set for \"every morning at 09:00\" means 09:00 on the user's own clock. The answer is\n * an absolute instant, because that is what a scheduler waits on.\n */\n\n/** The zone's offset from UTC, in milliseconds, at a given instant. */\nfunction offsetAt(instant, timeZone) {\n const parts = new Intl.DateTimeFormat('en-US', {\n timeZone,\n hour12: false,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n }).formatToParts(instant);\n const at = Object.fromEntries(parts.map((p) => [p.type, p.value]));\n const asUtc = Date.UTC(\n Number(at.year),\n Number(at.month) - 1,\n Number(at.day),\n Number(at.hour) % 24,\n Number(at.minute),\n Number(at.second),\n );\n return asUtc - instant.getTime();\n}\n\n/** The instant at which `wallClock` reads on the clock in `timeZone`. */\nexport function instantOf(wallClockIso, timeZone) {\n const naive = new Date(`${wallClockIso}Z`);\n return new Date(naive.getTime() - offsetAt(naive, timeZone));\n}\n\nexport function nextOccurrence(fromWallClock, days, timeZone) {\n // Add days in wall-clock space, then convert that new local time to an absolute instant.\n const wallClock = new Date(`${fromWallClock}Z`);\n wallClock.setUTCDate(wallClock.getUTCDate() + days);\n const nextWallClockIso = wallClock.toISOString().replace(/Z$/, '');\n return instantOf(nextWallClockIso, timeZone).toISOString();\n}\n"}}}
13
+ {"seq":12,"ts":"2026-09-02T02:53:43.963Z","mono_us":63630910,"turn":2,"type":"fs.snapshot","actor":"orca","attrs":{"tree":"48a7bdafdaae1c53a354c7bd06c740719e1cb255","changes":1}}
14
+ {"seq":13,"ts":"2026-09-02T02:53:43.963Z","mono_us":63631198,"turn":2,"type":"fs.change","actor":"orca","attrs":{"path":"src/schedule.js","status":"modified","insertions":5,"deletions":2}}
15
+ {"seq":14,"ts":"2026-09-02T02:53:57.789Z","mono_us":77457733,"turn":3,"type":"tool.result","actor":"harness","causes":[11],"attrs":{"tool_use_id":"call_KjxzcZnKrkAYgfFYXCaSelGV","name":"write_file","is_error":false,"bytes":21},"payload":"wrote src/schedule.js"}
16
+ {"seq":15,"ts":"2026-09-02T02:53:57.790Z","mono_us":77458089,"turn":3,"type":"model.request","actor":"agent","causes":[14],"attrs":{"model":"gpt-5.4-mini","dialect":"openai","path":"/v1/chat/completions","messages":5,"tools":2},"payload":{"$blob":"sha256:f7c1592306093f65f441d2afd5f496b7635b7e18f5c15f55b11f71f0b552a118","bytes":6052,"media_type":"application/json"}}
17
+ {"seq":16,"ts":"2026-09-02T02:53:57.792Z","mono_us":77460665,"turn":3,"type":"model.response","actor":"model","attrs":{"model":"gpt-5.4-mini-2026-03-17","stop_reason":"end_turn","input_tokens":683,"output_tokens":804,"status":200,"duration_ms":13883,"streamed":false},"payload":"{\"id\":\"resp_0274f3a450247093016a978fb9611087d0888a74dc74fa8180\",\"object\":\"chat.completion\",\"created\":1788317625,\"model\":\"gpt-5.4-mini-2026-03-17\",\"choices\":[{\"index\":0,\"message\":{\"role\":\"assistant\",\"content\":\"Fixed `src/schedule.js`.\\n\\nWhat I changed:\\n- Updated `nextOccurrence()` so it adds `days` in **wall-clock time** first, then converts that new local date/time back to an absolute instant.\\n- Left `instantOf()` and `offsetAt()` intact.\\n\\nWhy:\\n- The original code added `days * 24h` to an instant, which breaks across daylight-saving transitions.\\n- The tests expect “09:00 tomorrow” to remain 09:00 on the user’s clock, even if that day is 23 or 25 hours long.\\n\\nIf you want, I can also explain the DST edge case in more detail.\",\"reasoning_content\":null,\"tool_calls\":null},\"finish_reason\":\"stop\",\"native_finish_reason\":\"stop\"}],\"usage\":{\"completion_tokens\":804,\"total_tokens\":2511,\"prompt_tokens\":1707,\"prompt_tokens_details\":{\"cached_tokens\":1024,\"cached_creation_tokens\":0},\"completion_tokens_details\":{\"reasoning_tokens\":665}}}"}
18
+ {"seq":17,"ts":"2026-09-02T02:53:57.845Z","mono_us":77513293,"turn":3,"type":"fs.snapshot","actor":"orca","attrs":{"tree":"48a7bdafdaae1c53a354c7bd06c740719e1cb255","changes":0}}
19
+ {"seq":18,"ts":"2026-09-02T02:53:57.867Z","mono_us":77535729,"turn":3,"type":"run.end","actor":"orca","attrs":{"exit_code":0}}
@@ -0,0 +1 @@
1
+ ref: refs/heads/master
@@ -0,0 +1,11 @@
1
+ [core]
2
+ repositoryformatversion = 0
3
+ filemode = false
4
+ bare = true
5
+ symlinks = false
6
+ ignorecase = true
7
+ autocrlf = false
8
+ eol = lf
9
+ fsmonitor = false
10
+ [gc]
11
+ auto = 0
@@ -0,0 +1 @@
1
+ Unnamed repository; edit this file 'description' to name the repository.
Binary file
@@ -0,0 +1,11 @@
1
+ .env*
2
+ .ssh/
3
+ .aws/
4
+ .netrc
5
+ *.pem
6
+ *.key
7
+ id_rsa*
8
+ id_ed25519*
9
+ .orca/
10
+ node_modules/
11
+ .git/
@@ -0,0 +1,43 @@
1
+ {
2
+ "schema_version": "0.1.0",
3
+ "run_id": "run_35bb6b7dc8a0",
4
+ "created_at": "2026-09-02T02:52:40.326Z",
5
+ "orca_version": "0.1.2",
6
+ "adapter": {
7
+ "id": "node",
8
+ "version": "0.1.2"
9
+ },
10
+ "argv": ["node", "node", "agent.mjs"],
11
+ "cwd": "C:\\qs",
12
+ "env_allowlisted": {
13
+ "TERM": "xterm-256color",
14
+ "PATH": "/usr/local/bin:/usr/bin:/bin",
15
+ "HOME": "/home/you",
16
+ "SHELL": "/bin/sh",
17
+ "PWD": "C:\\qs"
18
+ },
19
+ "platform": {
20
+ "os": "win32",
21
+ "arch": "x64",
22
+ "node": "v22.23.2"
23
+ },
24
+ "ended_at": "2026-09-02T02:53:57.870Z",
25
+ "counts": {
26
+ "events": 19,
27
+ "blobs": 1
28
+ },
29
+ "redaction": {
30
+ "policy_version": 3,
31
+ "rules_fired": {}
32
+ },
33
+ "integrity": {
34
+ "events_sha256": "7062881f14cd88e4364bc34aa193ff1e4ecda5aa0ae02de29423cf7c1d429461",
35
+ "blob_count": 1
36
+ },
37
+ "git": {
38
+ "head": "0000000000000000000000000000000000000000",
39
+ "branch": "main",
40
+ "dirty": false
41
+ },
42
+ "exit_code": 0
43
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "policy_version": 3,
3
+ "records": []
4
+ }
File without changes