@hs-x/cli 0.4.12 → 0.4.13

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 (109) hide show
  1. package/README.md +21 -7
  2. package/dist/commands/completion.d.ts.map +1 -1
  3. package/dist/commands/completion.js +3 -0
  4. package/dist/commands/completion.js.map +1 -1
  5. package/dist/commands/deploy.d.ts +10 -0
  6. package/dist/commands/deploy.d.ts.map +1 -1
  7. package/dist/commands/deploy.js +37 -13
  8. package/dist/commands/deploy.js.map +1 -1
  9. package/dist/commands/dev.d.ts +1 -0
  10. package/dist/commands/dev.d.ts.map +1 -1
  11. package/dist/commands/dev.js +368 -16
  12. package/dist/commands/dev.js.map +1 -1
  13. package/dist/commands/help-command.d.ts.map +1 -1
  14. package/dist/commands/help-command.js +22 -6
  15. package/dist/commands/help-command.js.map +1 -1
  16. package/dist/commands/project-lifecycle.d.ts +10 -0
  17. package/dist/commands/project-lifecycle.d.ts.map +1 -1
  18. package/dist/commands/project-lifecycle.js +120 -33
  19. package/dist/commands/project-lifecycle.js.map +1 -1
  20. package/dist/commands/project.d.ts +3 -0
  21. package/dist/commands/project.d.ts.map +1 -1
  22. package/dist/commands/project.js +2 -0
  23. package/dist/commands/project.js.map +1 -1
  24. package/dist/constants.d.ts +1 -1
  25. package/dist/constants.js +1 -1
  26. package/dist/dev/account-selection.d.ts +55 -0
  27. package/dist/dev/account-selection.d.ts.map +1 -1
  28. package/dist/dev/account-selection.js +120 -0
  29. package/dist/dev/account-selection.js.map +1 -1
  30. package/dist/dev/browser-log-bridge.d.ts +13 -8
  31. package/dist/dev/browser-log-bridge.d.ts.map +1 -1
  32. package/dist/dev/browser-log-bridge.js +37 -17
  33. package/dist/dev/browser-log-bridge.js.map +1 -1
  34. package/dist/dev/clipboard.d.ts +9 -0
  35. package/dist/dev/clipboard.d.ts.map +1 -0
  36. package/dist/dev/clipboard.js +42 -0
  37. package/dist/dev/clipboard.js.map +1 -0
  38. package/dist/dev/compat-shim.d.ts +19 -4
  39. package/dist/dev/compat-shim.d.ts.map +1 -1
  40. package/dist/dev/compat-shim.js +31 -4
  41. package/dist/dev/compat-shim.js.map +1 -1
  42. package/dist/dev/component-selection.d.ts +11 -0
  43. package/dist/dev/component-selection.d.ts.map +1 -1
  44. package/dist/dev/component-selection.js +23 -0
  45. package/dist/dev/component-selection.js.map +1 -1
  46. package/dist/dev/frontend-log-relay.d.ts +12 -0
  47. package/dist/dev/frontend-log-relay.d.ts.map +1 -1
  48. package/dist/dev/frontend-log-relay.js +31 -20
  49. package/dist/dev/frontend-log-relay.js.map +1 -1
  50. package/dist/dev/hubspot-logs-poller.d.ts +7 -1
  51. package/dist/dev/hubspot-logs-poller.d.ts.map +1 -1
  52. package/dist/dev/hubspot-logs-poller.js +28 -1
  53. package/dist/dev/hubspot-logs-poller.js.map +1 -1
  54. package/dist/dev/keyboard.d.ts +21 -3
  55. package/dist/dev/keyboard.d.ts.map +1 -1
  56. package/dist/dev/keyboard.js +96 -4
  57. package/dist/dev/keyboard.js.map +1 -1
  58. package/dist/dev/local-proxy.d.ts +90 -0
  59. package/dist/dev/local-proxy.d.ts.map +1 -0
  60. package/dist/dev/local-proxy.js +186 -0
  61. package/dist/dev/local-proxy.js.map +1 -0
  62. package/dist/dev/log-server.d.ts +9 -0
  63. package/dist/dev/log-server.d.ts.map +1 -1
  64. package/dist/dev/log-server.js +46 -3
  65. package/dist/dev/log-server.js.map +1 -1
  66. package/dist/dev/production-app-check.d.ts +23 -0
  67. package/dist/dev/production-app-check.d.ts.map +1 -0
  68. package/dist/dev/production-app-check.js +28 -0
  69. package/dist/dev/production-app-check.js.map +1 -0
  70. package/dist/dev/session-manager.d.ts +49 -1
  71. package/dist/dev/session-manager.d.ts.map +1 -1
  72. package/dist/dev/session-manager.js +152 -12
  73. package/dist/dev/session-manager.js.map +1 -1
  74. package/dist/dev/stream-event-format.d.ts +10 -1
  75. package/dist/dev/stream-event-format.d.ts.map +1 -1
  76. package/dist/dev/stream-event-format.js +157 -5
  77. package/dist/dev/stream-event-format.js.map +1 -1
  78. package/dist/dev/stream-renderer.d.ts +34 -1
  79. package/dist/dev/stream-renderer.d.ts.map +1 -1
  80. package/dist/dev/stream-renderer.js +371 -60
  81. package/dist/dev/stream-renderer.js.map +1 -1
  82. package/dist/dev/trace-markdown.d.ts +25 -0
  83. package/dist/dev/trace-markdown.d.ts.map +1 -0
  84. package/dist/dev/trace-markdown.js +159 -0
  85. package/dist/dev/trace-markdown.js.map +1 -0
  86. package/dist/hubspot-app-logs.d.ts +9 -0
  87. package/dist/hubspot-app-logs.d.ts.map +1 -1
  88. package/dist/hubspot-app-logs.js +6 -4
  89. package/dist/hubspot-app-logs.js.map +1 -1
  90. package/dist/hubspot-developer-client.js +3 -0
  91. package/dist/hubspot-developer-client.js.map +1 -1
  92. package/dist/hubspot-project.d.ts +2 -0
  93. package/dist/hubspot-project.d.ts.map +1 -1
  94. package/dist/hubspot-project.js +13 -1
  95. package/dist/hubspot-project.js.map +1 -1
  96. package/dist/prompt.d.ts +6 -0
  97. package/dist/prompt.d.ts.map +1 -1
  98. package/dist/prompt.js +20 -0
  99. package/dist/prompt.js.map +1 -1
  100. package/dist/reporter/human.d.ts.map +1 -1
  101. package/dist/reporter/human.js +6 -1
  102. package/dist/reporter/human.js.map +1 -1
  103. package/dist/reporter/style.d.ts +10 -0
  104. package/dist/reporter/style.d.ts.map +1 -1
  105. package/dist/reporter/style.js +39 -0
  106. package/dist/reporter/style.js.map +1 -1
  107. package/dist/services/hubspot-dev-client.js +3 -0
  108. package/dist/services/hubspot-dev-client.js.map +1 -1
  109. package/package.json +8 -8
@@ -1 +1 @@
1
- {"version":3,"file":"frontend-log-relay.js","sourceRoot":"","sources":["../../src/dev/frontend-log-relay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,CAAC,MAAM,sBAAsB,GAAG,iCAAiC,CAAC;AAExE,MAAM,cAAc,GAAG,iCAAiC,CAAC;AACzD,MAAM,cAAc,GAAG,GAAG,CAAC;AAC3B,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAC9B,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACjC,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAiBtC;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,KAK5C;IACC,IAAI,sBAAsB,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,qDAAqD,sBAAsB,EAAE,CAAC,CAAC;IACjG,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,uBAAuB,CAAC,CAAC,CAAC;IAC5E,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,mBAAmB,CAAC,CAAC;IACzD,MAAM,SAAS,CACb,UAAU,EACV,uGAAuG,IAAI,CAAC,SAAS,CACnH,cAAc,CACf,2MAA2M,EAC5M,MAAM,CACP,CAAC;IAEF,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAG,UAAyD,CAAC;IAC9E,MAAM,YAAY,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,aAAa,GAAG,IAAI,GAAG,EAAgC,CAAC;IAC9D,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC,OAAgB,EAAE,EAAE;QAC9C,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;QACjC,IAAI,KAAK,CAAC,aAAa,IAAI,MAAM,EAAE,EAAE,KAAK,WAAW,EAAE,CAAC;YACtD,MAAM,MAAM,GAAG,wBAAwB,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC5D,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC7D,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;QAC9D,CAAC;QACD,IAAI,KAAK,CAAC,aAAa,IAAI,MAAM,EAAE,EAAE,KAAK,aAAa,EAAE,CAAC;YACxD,MAAM,MAAM,GAAG,wBAAwB,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC5D,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;YACpE,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,GAAG,EAAmB,CAAC;YACtE,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,EAAE,CAAC;gBAChE,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;gBAClC,MAAM,GAAG,GAAG,wBAAwB,CAAC,KAAK,EAAE,GAAG,EAAE,oBAAoB,CAAC,CAAC;gBACvE,MAAM,KAAK,GAAG,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBAChD,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE;oBAAE,SAAS;gBAChC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,iBAAiB;oBAAE,SAAS;gBACjE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC;YACD,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACjC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QACtB,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,KAAK,MAAM,KAAK,IAAI,qBAAqB,CAAC,OAAO,CAAC;gBAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACpD,MAAM,UAAU,GAAG;QACjB,GAAG,KAAK,CAAC,UAAU;QACnB,CAAC,sBAAsB,CAAC,EAAE;YACxB,GAAG,EAAE,sBAAsB;YAC3B,aAAa,EAAE,cAAc;YAC7B,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE;YAC5C,YAAY,EAAE,mBAAmB;YACjC,MAAM,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,EAAE;YACnD,KAAK,EAAE,EAAE;YACT,QAAQ,EAAE;gBACR,aAAa,EAAE,YAAY;gBAC3B,mBAAmB,EAAE,QAAQ;aAC9B;SACF;KACF,CAAC;IAEF,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,OAAO;QACL,WAAW,EAAE,sBAAsB;QACnC,UAAU;QACV,UAAU;QACV,KAAK,CAAC,OAAO;YACX,IAAI,SAAS;gBAAE,OAAO;YACtB,SAAS,GAAG,IAAI,CAAC;YACjB,IAAI,YAAY,KAAK,SAAS;gBAAE,OAAO,WAAW,CAAC,WAAW,CAAC,CAAC;;gBAC3D,WAAW,CAAC,WAAW,CAAC,GAAG,YAAY,CAAC;YAC7C,MAAM,EAAE,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAc,EAAE,SAAiB;IACjE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/F,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IACzC,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,MAAM,GAAG,sBAAsB;YACxE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;QACvB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAY,EAAE,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAc;IAC3C,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3D,MAAM,OAAO,GAAuB,EAAE,CAAC;IACvC,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,EAAE,CAAC;QACjE,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;QAClC,MAAM,GAAG,GAAG,OAAO,KAAK,EAAE,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACzF,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QAC9D,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC;YACX,KAAK;YACL,GAAG;YACH,EAAE,EAAE,OAAO,KAAK,EAAE,EAAE,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;YACtF,GAAG,CAAC,OAAO,KAAK,EAAE,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM;gBACnD,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;gBACxC,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9B,CAAC,CAAC;IACL,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,kBAAkB,CAAC,UAA6C;IACvE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACtD,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,KAAK,aAAa;YAAE,OAAO,GAAG,CAAC;IACnE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO,CAAC;AACxF,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAChD,CAAC,CAAE,KAAiC;QACpC,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"frontend-log-relay.js","sourceRoot":"","sources":["../../src/dev/frontend-log-relay.ts"],"names":[],"mappings":"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"}
@@ -15,8 +15,14 @@ export interface HubSpotLogsPollerOptions {
15
15
  readonly bus: DevEventBus;
16
16
  readonly source: HubSpotLogsSource;
17
17
  readonly intervalMs?: number;
18
- /** Emit only entries at/after this time (default: poller start). */
18
+ /** Emit only entries at/after this time (default: poller start minus `catchUpMs`). */
19
19
  readonly sessionStartMs?: number;
20
+ /**
21
+ * How far before poller start the first poll reaches back, so a lane that
22
+ * is working shows recent activity right away instead of looking dead
23
+ * until the card acts again. Default 0 (nothing before start).
24
+ */
25
+ readonly catchUpMs?: number;
20
26
  readonly systemTypes?: readonly SystemType[];
21
27
  /**
22
28
  * Called when HubSpot rejects the poll as unauthorized. Resolves `true` when
@@ -1 +1 @@
1
- {"version":3,"file":"hubspot-logs-poller.d.ts","sourceRoot":"","sources":["../../src/dev/hubspot-logs-poller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EAEvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAoBlD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,oEAAoE;IACpE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IAC7C;;;;OAIG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,sEAAsE;IACtE,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE;QAC9B,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;QACnC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;KAC7C,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,iBAAiB;IAChC,sEAAsE;IACtE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,IAAI,IAAI,IAAI,CAAC;CACd;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,wBAAwB,GAAG,iBAAiB,CA4G3F"}
1
+ {"version":3,"file":"hubspot-logs-poller.d.ts","sourceRoot":"","sources":["../../src/dev/hubspot-logs-poller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EAEvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAoBlD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,sFAAsF;IACtF,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IAC7C;;;;OAIG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,sEAAsE;IACtE,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE;QAC9B,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;QACnC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;KAC7C,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,iBAAiB;IAChC,sEAAsE;IACtE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,IAAI,IAAI,IAAI,CAAC;CACd;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,wBAAwB,GAAG,iBAAiB,CAyI3F"}
@@ -14,7 +14,9 @@ const POLL_LIMIT = 50;
14
14
  export function startHubSpotLogsPoller(options) {
15
15
  const fetchPayload = options.fetchPayload ?? fetchHubSpotLogsPayload;
16
16
  const systemTypes = options.systemTypes ?? DEV_POLL_SYSTEM_TYPES;
17
- const sessionStartMs = options.sessionStartMs ?? Date.now();
17
+ const catchUpMs = Math.max(0, options.catchUpMs ?? 0);
18
+ const sessionStartMs = options.sessionStartMs ?? Date.now() - catchUpMs;
19
+ let firstPollReported = false;
18
20
  const onUnauthorized = options.onUnauthorized ?? (() => repairHubSpotAccessToken(options.source.developerAccountId));
19
21
  const seen = new Set();
20
22
  let stopped = false;
@@ -85,12 +87,32 @@ export function startHubSpotLogsPoller(options) {
85
87
  return Number.isFinite(ts) && ts >= sessionStartMs;
86
88
  })
87
89
  .sort((a, b) => String(a.timestamp).localeCompare(String(b.timestamp)));
90
+ if (!firstPollReported) {
91
+ // Say once that the lane is live, and what the catch-up window held:
92
+ // silence right after start is otherwise indistinguishable from a
93
+ // broken credential.
94
+ firstPollReported = true;
95
+ const minutes = Math.max(1, Math.round(catchUpMs / 60_000));
96
+ const window = catchUpMs > 0 ? ` in the last ${minutes} min` : '';
97
+ const count = fresh.length === 0
98
+ ? `no entries${window}`
99
+ : `${fresh.length} entr${fresh.length === 1 ? 'y' : 'ies'}${window}`;
100
+ options.bus.emit({
101
+ lane: 'hubspot',
102
+ level: 'debug',
103
+ ts: Date.now(),
104
+ msg: `app logs live — ${count}; new ones appear within ~30s of the card acting`,
105
+ });
106
+ }
88
107
  for (const row of fresh) {
89
108
  const errorType = typeof row.errorType === 'string' ? row.errorType : undefined;
90
109
  const source = typeof row.source === 'string' ? row.source : 'app-log';
91
110
  const target = typeof row.target === 'string' ? row.target : undefined;
92
111
  const durationMs = typeof row.durationMs === 'number' ? row.durationMs : undefined;
93
112
  const invocationId = typeof row.invocationId === 'string' ? row.invocationId : undefined;
113
+ const portalId = typeof row.portalId === 'number' ? row.portalId : undefined;
114
+ const traceId = typeof row.traceId === 'string' ? row.traceId : undefined;
115
+ const systemType = typeof row.systemType === 'string' ? row.systemType : undefined;
94
116
  options.bus.emit({
95
117
  lane: 'hubspot',
96
118
  level: errorType ? 'error' : 'info',
@@ -100,6 +122,11 @@ export function startHubSpotLogsPoller(options) {
100
122
  fields: {
101
123
  ...(durationMs !== undefined ? { durationMs } : {}),
102
124
  ...(invocationId ? { invocationId } : {}),
125
+ ...(portalId !== undefined ? { portalId } : {}),
126
+ ...(traceId ? { traceId } : {}),
127
+ ...(systemType ? { systemType } : {}),
128
+ ...(target ? { target } : {}),
129
+ ...(errorType ? { errorType } : {}),
103
130
  },
104
131
  });
105
132
  }
@@ -1 +1 @@
1
- {"version":3,"file":"hubspot-logs-poller.js","sourceRoot":"","sources":["../../src/dev/hubspot-logs-poller.ts"],"names":[],"mappings":"AAWA,OAAO,EAGL,uBAAuB,GACxB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,iBAAiB,EACjB,4BAA4B,EAC5B,wBAAwB,GACzB,MAAM,2BAA2B,CAAC;AAEnC,iEAAiE;AACjE,MAAM,qBAAqB,GAA0B;IACnD,wBAAwB;IACxB,kBAAkB;IAClB,eAAe;IACf,iBAAiB;CAClB,CAAC;AAEF,MAAM,wBAAwB,GAAG,MAAM,CAAC;AACxC,gEAAgE;AAChE,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAC3B,MAAM,UAAU,GAAG,EAAE,CAAC;AA8BtB,MAAM,UAAU,sBAAsB,CAAC,OAAiC;IACtE,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,uBAAuB,CAAC;IACrE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,qBAAqB,CAAC;IACjE,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;IAC5D,MAAM,cAAc,GAClB,OAAO,CAAC,cAAc,IAAI,CAAC,GAAG,EAAE,CAAC,wBAAwB,CAAC,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAChG,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,WAA+B,CAAC;IAEpC,MAAM,SAAS,GAAG,KAAK,IAAiC,EAAE;QACxD,IAAI,CAAC;YACH,OAAO,MAAM,YAAY,CAAC;gBACxB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,YAAY,EAAE,gBAAgB;gBAC9B,KAAK,EAAE,UAAU;gBACjB,WAAW;aACZ,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACrF,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,KAAK,IAAmB,EAAE;QACrC,IAAI,OAAO;YAAE,OAAO;QACpB,IAAI,OAAO,GAAG,MAAM,SAAS,EAAE,CAAC;QAChC,IAAI,OAAO;YAAE,OAAO;QACpB,IAAI,OAAO,CAAC,KAAK,IAAI,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACtD,oEAAoE;YACpE,IAAI,MAAM,cAAc,EAAE,EAAE,CAAC;gBAC3B,IAAI,OAAO;oBAAE,OAAO;gBACpB,OAAO,GAAG,MAAM,SAAS,EAAE,CAAC;gBAC5B,IAAI,OAAO;oBAAE,OAAO;YACtB,CAAC;QACH,CAAC;QACD,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,qEAAqE;YACrE,qEAAqE;YACrE,yDAAyD;YACzD,MAAM,QAAQ,GAAG,4BAA4B,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC7D,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;gBAC7B,WAAW,GAAG,QAAQ,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;oBACf,IAAI,EAAE,SAAS;oBACf,KAAK,EAAE,MAAM;oBACb,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;oBACd,GAAG,EAAE,iCAAiC,OAAO,CAAC,KAAK,GACjD,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC;wBAC9B,CAAC,CAAC,0CAA0C,OAAO,CAAC,MAAM,CAAC,kBAAkB,oBAAoB;wBACjG,CAAC,CAAC,EACN,EAAE;iBACH,CAAC,CAAC;YACL,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,MAAM;gBACb,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;gBACd,GAAG,EAAE,mCAAmC;aACzC,CAAC,CAAC;QACL,CAAC;QACD,WAAW,GAAG,SAAS,CAAC;QAExB,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI;aACvB,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;YACd,MAAM,EAAE,GAAG,OAAO,GAAG,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;YAC/E,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,OAAO,KAAK,CAAC;YACtC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACb,MAAM,EAAE,GAAG,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;YACtF,OAAO,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,cAAc,CAAC;QACrD,CAAC,CAAC;aACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAE1E,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;YACxB,MAAM,SAAS,GAAG,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;YAChF,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;YACvE,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;YACvE,MAAM,UAAU,GAAG,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;YACnF,MAAM,YAAY,GAAG,OAAO,GAAG,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;YACzF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;gBACnC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBACrC,GAAG,EAAE,GAAG,MAAM,IAAI,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC/D,MAAM;gBACN,MAAM,EAAE;oBACN,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACnD,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC1C;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,KAAK,IAAI,EAAE,CAAC;IACd,CAAC,EAAE,OAAO,CAAC,UAAU,IAAI,wBAAwB,CAAC,CAAC;IACnD,oDAAoD;IACpD,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IAEhB,OAAO;QACL,IAAI;QACJ,IAAI;YACF,OAAO,GAAG,IAAI,CAAC;YACf,aAAa,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"hubspot-logs-poller.js","sourceRoot":"","sources":["../../src/dev/hubspot-logs-poller.ts"],"names":[],"mappings":"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"}
@@ -1,19 +1,29 @@
1
1
  /**
2
2
  * Raw-mode keyboard controller for `hs-x dev` — drives the stream renderer's
3
- * filter/pause/status surface with single keystrokes:
3
+ * filter/pause/details surface with single keystrokes:
4
4
  *
5
5
  * f cycle lane: all → frontend → backend → request → hubspot
6
6
  * 1 2 3 4 jump to frontend / backend / request / hubspot (again: back to all)
7
7
  * a all lanes
8
8
  * e toggle errors-only w toggle warnings-and-up
9
9
  * / search (type · Enter apply · Esc cancel · Ctrl+U clear)
10
- * d show full details for the latest matching event (again: back)
10
+ * d ↑ open the details browser on the latest matching event
11
11
  * c reset to the launch filter (--only selectors, or everything)
12
12
  * p pause / resume (buffered rows flush on resume)
13
13
  * ? h key help
14
14
  * q ^C stop the dev server
15
15
  *
16
- * The same selector grammar backs the `--only` flag (stream-filter.ts), so a
16
+ * Inside the details browser (list beside the selected event's details):
17
+ *
18
+ * ↑ ↓ k j move the selection (older / newer)
19
+ * PgUp PgDn scroll the detail pane
20
+ * Home End g G jump to the oldest / newest event
21
+ * t toggle related trace/context events
22
+ * y copy a redacted Markdown trace to the clipboard
23
+ * Esc d back to the stream
24
+ *
25
+ * Filter keys keep working in the browser and re-derive the list. The same
26
+ * selector grammar backs the `--only` flag (stream-filter.ts), so a
17
27
  * keystroke session and a scripted run can never disagree about semantics.
18
28
  * No-ops entirely when stdin is not a TTY (CI, piped, dev-in-tmux-pane).
19
29
  */
@@ -28,5 +38,13 @@ export interface DevKeyboardOptions {
28
38
  export interface DevKeyboard {
29
39
  stop(): void;
30
40
  }
41
+ type NavigationKey = 'up' | 'down' | 'pageUp' | 'pageDown' | 'home' | 'end';
42
+ /**
43
+ * Decode the cursor-key escape sequences terminals send in raw mode: CSI
44
+ * (`ESC [ A`) and SS3 (`ESC O A`, application cursor mode) letter forms, plus
45
+ * the VT `ESC [ n ~` forms for page/home/end. Anything else stays opaque.
46
+ */
47
+ export declare function decodeNavigationKey(data: string): NavigationKey | undefined;
31
48
  export declare function attachDevKeyboard(opts: DevKeyboardOptions): DevKeyboard;
49
+ export {};
32
50
  //# sourceMappingURL=keyboard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"keyboard.d.ts","sourceRoot":"","sources":["../../src/dev/keyboard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACnC,qDAAqD;IACrD,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,IAAI,IAAI,CAAC;CACd;AAaD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,GAAG,WAAW,CA0HvE"}
1
+ {"version":3,"file":"keyboard.d.ts","sourceRoot":"","sources":["../../src/dev/keyboard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACnC,qDAAqD;IACrD,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,IAAI,IAAI,CAAC;CACd;AAeD,KAAK,aAAa,GAAG,IAAI,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,KAAK,CAAC;AAE5E;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAyB3E;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,GAAG,WAAW,CA2KvE"}
@@ -1,32 +1,77 @@
1
1
  /**
2
2
  * Raw-mode keyboard controller for `hs-x dev` — drives the stream renderer's
3
- * filter/pause/status surface with single keystrokes:
3
+ * filter/pause/details surface with single keystrokes:
4
4
  *
5
5
  * f cycle lane: all → frontend → backend → request → hubspot
6
6
  * 1 2 3 4 jump to frontend / backend / request / hubspot (again: back to all)
7
7
  * a all lanes
8
8
  * e toggle errors-only w toggle warnings-and-up
9
9
  * / search (type · Enter apply · Esc cancel · Ctrl+U clear)
10
- * d show full details for the latest matching event (again: back)
10
+ * d ↑ open the details browser on the latest matching event
11
11
  * c reset to the launch filter (--only selectors, or everything)
12
12
  * p pause / resume (buffered rows flush on resume)
13
13
  * ? h key help
14
14
  * q ^C stop the dev server
15
15
  *
16
- * The same selector grammar backs the `--only` flag (stream-filter.ts), so a
16
+ * Inside the details browser (list beside the selected event's details):
17
+ *
18
+ * ↑ ↓ k j move the selection (older / newer)
19
+ * PgUp PgDn scroll the detail pane
20
+ * Home End g G jump to the oldest / newest event
21
+ * t toggle related trace/context events
22
+ * y copy a redacted Markdown trace to the clipboard
23
+ * Esc d back to the stream
24
+ *
25
+ * Filter keys keep working in the browser and re-derive the list. The same
26
+ * selector grammar backs the `--only` flag (stream-filter.ts), so a
17
27
  * keystroke session and a scripted run can never disagree about semantics.
18
28
  * No-ops entirely when stdin is not a TTY (CI, piped, dev-in-tmux-pane).
19
29
  */
20
30
  import { DEV_LANES, cycleLane } from './stream-filter.js';
21
31
  const HELP_TEXT = [
22
32
  ' keys f cycle lane 1/2/3/4 jump lane (again: all) a all lanes',
23
- ' e errors only w warnings / search d details c reset p pause q quit',
33
+ ' e errors only w warnings / search c reset p pause q quit',
34
+ ' d or ↑ open details ↑/↓ move t related y copy trace pgup/pgdn scroll esc back',
24
35
  ].join('\n');
25
36
  const CTRL_C = '\x03';
26
37
  const CTRL_U = '\x15';
27
38
  const ESC = '\x1b';
28
39
  const ENTER = '\r';
29
40
  const BACKSPACE = '\x7f';
41
+ const DETAIL_PAGE_LINES = 10;
42
+ /**
43
+ * Decode the cursor-key escape sequences terminals send in raw mode: CSI
44
+ * (`ESC [ A`) and SS3 (`ESC O A`, application cursor mode) letter forms, plus
45
+ * the VT `ESC [ n ~` forms for page/home/end. Anything else stays opaque.
46
+ */
47
+ export function decodeNavigationKey(data) {
48
+ if (data.length < 3 || data[0] !== ESC)
49
+ return undefined;
50
+ const introducer = data[1];
51
+ if (introducer !== '[' && introducer !== 'O')
52
+ return undefined;
53
+ const body = data.slice(2);
54
+ switch (body) {
55
+ case 'A':
56
+ return 'up';
57
+ case 'B':
58
+ return 'down';
59
+ case 'H':
60
+ case '1~':
61
+ case '7~':
62
+ return 'home';
63
+ case 'F':
64
+ case '4~':
65
+ case '8~':
66
+ return 'end';
67
+ case '5~':
68
+ return 'pageUp';
69
+ case '6~':
70
+ return 'pageDown';
71
+ default:
72
+ return undefined;
73
+ }
74
+ }
30
75
  export function attachDevKeyboard(opts) {
31
76
  const stdin = opts.stdin ?? process.stdin;
32
77
  const isTTY = opts.isTTY ?? Boolean(stdin.isTTY);
@@ -50,6 +95,24 @@ export function attachDevKeyboard(opts) {
50
95
  const drawSearch = () => {
51
96
  renderer.setPrompt(`/${search ?? ''}▏ enter apply · esc cancel`);
52
97
  };
98
+ const navigate = (key) => {
99
+ switch (key) {
100
+ case 'up':
101
+ return renderer.moveDetailsSelection(-1);
102
+ case 'down':
103
+ return renderer.moveDetailsSelection(1);
104
+ case 'pageUp':
105
+ return renderer.scrollDetails(-DETAIL_PAGE_LINES);
106
+ case 'pageDown':
107
+ return renderer.scrollDetails(DETAIL_PAGE_LINES);
108
+ case 'home':
109
+ return renderer.jumpDetailsSelection('first');
110
+ case 'end':
111
+ return renderer.jumpDetailsSelection('last');
112
+ default:
113
+ return;
114
+ }
115
+ };
53
116
  const onData = (chunk) => {
54
117
  const data = chunk.toString('utf8');
55
118
  // Search mode consumes every key until Enter/Esc.
@@ -77,6 +140,35 @@ export function attachDevKeyboard(opts) {
77
140
  }
78
141
  return;
79
142
  }
143
+ const navigation = decodeNavigationKey(data);
144
+ if (navigation) {
145
+ // Only ↑ opens the browser from the stream — ↓ / page keys there would
146
+ // be surprising. Inside the browser every navigation key is live.
147
+ if (renderer.isShowingDetails() || navigation === 'up')
148
+ navigate(navigation);
149
+ return;
150
+ }
151
+ if (renderer.isShowingDetails()) {
152
+ switch (data) {
153
+ case ESC:
154
+ case 'd':
155
+ return renderer.toggleLatestDetails();
156
+ case 'k':
157
+ return navigate('up');
158
+ case 'j':
159
+ return navigate('down');
160
+ case 'g':
161
+ return navigate('home');
162
+ case 'G':
163
+ return navigate('end');
164
+ case 't':
165
+ return renderer.toggleRelatedDetails();
166
+ case 'y':
167
+ return renderer.copyDetailsTrace();
168
+ default:
169
+ break;
170
+ }
171
+ }
80
172
  switch (data) {
81
173
  case CTRL_C:
82
174
  case 'q':
@@ -1 +1 @@
1
- {"version":3,"file":"keyboard.js","sourceRoot":"","sources":["../../src/dev/keyboard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"keyboard.js","sourceRoot":"","sources":["../../src/dev/keyboard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * HubSpot's dev server reads `<app root>/local.json` and, when it carries a
3
+ * `proxy` map, switches `hubspot.fetch` into local proxy mode: every request to
4
+ * a mapped origin is rewritten to the local target and issued from the CLI
5
+ * process instead of HubSpot's backend proxy. A mapping whose target is not
6
+ * listening therefore fails every `hubspot.fetch` to that origin with an empty
7
+ * `ECONNREFUSED` aggregate error. Surface the mappings and their reachability
8
+ * so that failure is visible at start-up rather than as blank card errors.
9
+ */
10
+ export interface HubSpotLocalProxyMapping {
11
+ readonly from: string;
12
+ readonly to: string;
13
+ }
14
+ export interface HubSpotLocalProxyProbe extends HubSpotLocalProxyMapping {
15
+ readonly reachable: boolean;
16
+ }
17
+ export declare const HUBSPOT_LOCAL_CONFIG_FILENAME = "local.json";
18
+ export declare function readHubSpotLocalProxyMappings(appRoot: string): Promise<readonly HubSpotLocalProxyMapping[]>;
19
+ export declare function probeHubSpotLocalProxyMappings(mappings: readonly HubSpotLocalProxyMapping[], probe?: (target: string) => Promise<boolean>): Promise<readonly HubSpotLocalProxyProbe[]>;
20
+ /** True when something accepts a TCP connection at the target URL's host:port. */
21
+ export declare function isTcpTargetListening(target: string): Promise<boolean>;
22
+ /**
23
+ * `--local-proxy` modes:
24
+ * - `auto` (default): enter proxy mode only when local.json has mappings and
25
+ * every target is listening — exactly where `hs project dev` would send the
26
+ * app's fetches. With a dead target (or no local.json) the file is hidden so
27
+ * `hubspot.fetch` keeps going through HubSpot's own proxy, signed. Proxy mode
28
+ * sends unmapped fetches straight to their origins from this machine, and
29
+ * backends that verify HubSpot signatures reject those, so hs-x never turns
30
+ * it on uninvited.
31
+ * - `always`: apply the map regardless (dead targets fail loud), and enter
32
+ * proxy mode even without local.json — the explicit opt-in for card logs on
33
+ * apps whose backends accept unsigned dev traffic.
34
+ * - `never`: ignore local.json and keep HubSpot's own proxy for every fetch.
35
+ */
36
+ export type HubSpotLocalProxyMode = 'auto' | 'always' | 'never';
37
+ export declare const HUBSPOT_LOCAL_PROXY_MODES: readonly ["auto", "always", "never"];
38
+ export declare const DEFAULT_HUBSPOT_LOCAL_PROXY_MODE: HubSpotLocalProxyMode;
39
+ export declare function resolveHubSpotLocalProxyMode(raw: string | undefined): HubSpotLocalProxyMode;
40
+ /** Whether HubSpot's dev server should enter local proxy mode for this run. */
41
+ export declare function hubSpotLocalProxyApplies(mode: HubSpotLocalProxyMode, probes: readonly HubSpotLocalProxyProbe[]): boolean;
42
+ /**
43
+ * The origin the card's log bridge posts to through `hubspot.fetch`. It only
44
+ * has to be a syntactically valid origin: in proxy mode the dev server rewrites
45
+ * it to hs-x's local sidecar before any network is involved, and the card
46
+ * iframe never resolves it.
47
+ */
48
+ export declare const HSX_LOCAL_PROXY_ORIGIN = "https://hsx-dev.local";
49
+ export declare const HSX_LOCAL_PROXY_RELAY_PATH = "/__hsx/relay";
50
+ export interface HubSpotLocalProxyPlan {
51
+ /** The `proxy` map the dev server will see, or undefined to hide local.json. */
52
+ readonly proxy: Readonly<Record<string, string>> | undefined;
53
+ /** User mappings and whether each one made it into the map. */
54
+ readonly mappings: readonly (HubSpotLocalProxyProbe & {
55
+ readonly applied: boolean;
56
+ })[];
57
+ /** True when the hs-x relay mapping is part of the map. */
58
+ readonly relay: boolean;
59
+ }
60
+ /** Why proxy mode stayed off (and with it the card's log channel). */
61
+ export type HubSpotLocalProxyBlocker = 'never' | 'no-mappings' | 'dead-target';
62
+ export interface HubSpotLocalProxyPlanInput {
63
+ readonly mode: HubSpotLocalProxyMode;
64
+ readonly probes: readonly HubSpotLocalProxyProbe[];
65
+ readonly relayTarget?: string | undefined;
66
+ }
67
+ /**
68
+ * Decide the proxy map for one start. Proxy mode is all-or-nothing for the
69
+ * app's fetches, so it is entered only where `hs project dev` would enter it
70
+ * (all mappings live) or on explicit `always`; the hs-x relay mapping rides
71
+ * along whenever proxy mode is on and a sidecar URL is given.
72
+ */
73
+ export declare function planHubSpotLocalProxy(input: HubSpotLocalProxyPlanInput): HubSpotLocalProxyPlan & {
74
+ readonly blocker?: HubSpotLocalProxyBlocker;
75
+ };
76
+ /**
77
+ * Run one upstream dev-server start with `<appRoot>/local.json` presented as
78
+ * `{ proxy }` — the user's file (if any) is never touched. HubSpot's
79
+ * `loadLocalConfig` probes `fs.existsSync` and then `fs.readFileSync`, both
80
+ * through the default `fs` export, so both are answered for that one path.
81
+ */
82
+ export declare function withHubSpotLocalProxyMappings<T>(appRoot: string, proxy: Readonly<Record<string, string>>, operation: () => Promise<T>): Promise<T>;
83
+ /**
84
+ * Run one upstream dev-server start with `<appRoot>/local.json` hidden from
85
+ * `fs.existsSync`, which is the only probe HubSpot's `loadLocalConfig` makes
86
+ * before reading the file. Nothing on disk changes, and the original method
87
+ * is restored as soon as the operation settles.
88
+ */
89
+ export declare function withHubSpotLocalProxyHidden<T>(appRoot: string, operation: () => Promise<T>): Promise<T>;
90
+ //# sourceMappingURL=local-proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-proxy.d.ts","sourceRoot":"","sources":["../../src/dev/local-proxy.ts"],"names":[],"mappings":"AAKA;;;;;;;;GAQG;AACH,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,sBAAuB,SAAQ,wBAAwB;IACtE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED,eAAO,MAAM,6BAA6B,eAAe,CAAC;AAG1D,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,SAAS,wBAAwB,EAAE,CAAC,CAsB9C;AAED,wBAAsB,8BAA8B,CAClD,QAAQ,EAAE,SAAS,wBAAwB,EAAE,EAC7C,KAAK,GAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAwB,GACjE,OAAO,CAAC,SAAS,sBAAsB,EAAE,CAAC,CAI5C;AAED,kFAAkF;AAClF,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAoBrE;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAChE,eAAO,MAAM,yBAAyB,sCAAuC,CAAC;AAC9E,eAAO,MAAM,gCAAgC,EAAE,qBAA8B,CAAC;AAE9E,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,qBAAqB,CAG3F;AAED,+EAA+E;AAC/E,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,qBAAqB,EAC3B,MAAM,EAAE,SAAS,sBAAsB,EAAE,GACxC,OAAO,CAKT;AAED;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,0BAA0B,CAAC;AAC9D,eAAO,MAAM,0BAA0B,iBAAiB,CAAC;AAEzD,MAAM,WAAW,qBAAqB;IACpC,gFAAgF;IAChF,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC;IAC7D,+DAA+D;IAC/D,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,sBAAsB,GAAG;QAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,EAAE,CAAC;IACvF,2DAA2D;IAC3D,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED,sEAAsE;AACtE,MAAM,MAAM,wBAAwB,GAAG,OAAO,GAAG,aAAa,GAAG,aAAa,CAAC;AAE/E,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACnD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3C;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,0BAA0B,GAChC,qBAAqB,GAAG;IAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,wBAAwB,CAAA;CAAE,CAyBzE;AAOD;;;;;GAKG;AACH,wBAAsB,6BAA6B,CAAC,CAAC,EACnD,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACvC,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAC1B,OAAO,CAAC,CAAC,CAAC,CAsCZ;AAED;;;;;GAKG;AACH,wBAAsB,2BAA2B,CAAC,CAAC,EACjD,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAC1B,OAAO,CAAC,CAAC,CAAC,CAoBZ"}
@@ -0,0 +1,186 @@
1
+ import fs from 'node:fs';
2
+ import { readFile } from 'node:fs/promises';
3
+ import { connect } from 'node:net';
4
+ import { join, resolve } from 'node:path';
5
+ export const HUBSPOT_LOCAL_CONFIG_FILENAME = 'local.json';
6
+ const PROBE_TIMEOUT_MS = 1_000;
7
+ export async function readHubSpotLocalProxyMappings(appRoot) {
8
+ let raw;
9
+ try {
10
+ raw = await readFile(join(appRoot, HUBSPOT_LOCAL_CONFIG_FILENAME), 'utf8');
11
+ }
12
+ catch {
13
+ return [];
14
+ }
15
+ let parsed;
16
+ try {
17
+ parsed = JSON.parse(raw);
18
+ }
19
+ catch {
20
+ // The dev server logs its own parse error and ignores the file.
21
+ return [];
22
+ }
23
+ const proxy = typeof parsed === 'object' && parsed !== null
24
+ ? parsed.proxy
25
+ : undefined;
26
+ if (typeof proxy !== 'object' || proxy === null)
27
+ return [];
28
+ return Object.entries(proxy).flatMap(([from, to]) => typeof to === 'string' && to.length > 0 ? [{ from, to }] : []);
29
+ }
30
+ export async function probeHubSpotLocalProxyMappings(mappings, probe = isTcpTargetListening) {
31
+ return Promise.all(mappings.map(async (mapping) => ({ ...mapping, reachable: await probe(mapping.to) })));
32
+ }
33
+ /** True when something accepts a TCP connection at the target URL's host:port. */
34
+ export function isTcpTargetListening(target) {
35
+ let url;
36
+ try {
37
+ url = new URL(target);
38
+ }
39
+ catch {
40
+ return Promise.resolve(false);
41
+ }
42
+ const port = Number(url.port || (url.protocol === 'https:' ? 443 : 80));
43
+ const host = url.hostname.replace(/^\[|\]$/g, '');
44
+ return new Promise((resolve) => {
45
+ const socket = connect({ host, port });
46
+ const finish = (result) => {
47
+ socket.removeAllListeners();
48
+ socket.destroy();
49
+ resolve(result);
50
+ };
51
+ socket.setTimeout(PROBE_TIMEOUT_MS, () => finish(false));
52
+ socket.once('connect', () => finish(true));
53
+ socket.once('error', () => finish(false));
54
+ });
55
+ }
56
+ export const HUBSPOT_LOCAL_PROXY_MODES = ['auto', 'always', 'never'];
57
+ export const DEFAULT_HUBSPOT_LOCAL_PROXY_MODE = 'auto';
58
+ export function resolveHubSpotLocalProxyMode(raw) {
59
+ const value = raw?.trim().toLowerCase();
60
+ return value === 'always' || value === 'never' ? value : DEFAULT_HUBSPOT_LOCAL_PROXY_MODE;
61
+ }
62
+ /** Whether HubSpot's dev server should enter local proxy mode for this run. */
63
+ export function hubSpotLocalProxyApplies(mode, probes) {
64
+ if (probes.length === 0)
65
+ return false;
66
+ if (mode === 'always')
67
+ return true;
68
+ if (mode === 'never')
69
+ return false;
70
+ return probes.some((probe) => probe.reachable);
71
+ }
72
+ /**
73
+ * The origin the card's log bridge posts to through `hubspot.fetch`. It only
74
+ * has to be a syntactically valid origin: in proxy mode the dev server rewrites
75
+ * it to hs-x's local sidecar before any network is involved, and the card
76
+ * iframe never resolves it.
77
+ */
78
+ export const HSX_LOCAL_PROXY_ORIGIN = 'https://hsx-dev.local';
79
+ export const HSX_LOCAL_PROXY_RELAY_PATH = '/__hsx/relay';
80
+ /**
81
+ * Decide the proxy map for one start. Proxy mode is all-or-nothing for the
82
+ * app's fetches, so it is entered only where `hs project dev` would enter it
83
+ * (all mappings live) or on explicit `always`; the hs-x relay mapping rides
84
+ * along whenever proxy mode is on and a sidecar URL is given.
85
+ */
86
+ export function planHubSpotLocalProxy(input) {
87
+ const blocker = input.mode === 'never'
88
+ ? 'never'
89
+ : input.mode === 'always'
90
+ ? undefined
91
+ : input.probes.length === 0
92
+ ? 'no-mappings'
93
+ : input.probes.some((probe) => !probe.reachable)
94
+ ? 'dead-target'
95
+ : undefined;
96
+ const on = blocker === undefined;
97
+ const mappings = input.probes.map((probe) => ({ ...probe, applied: on }));
98
+ const relay = on && Boolean(input.relayTarget);
99
+ const proxy = {};
100
+ if (on) {
101
+ for (const mapping of mappings)
102
+ proxy[mapping.from] = mapping.to;
103
+ if (relay && input.relayTarget)
104
+ proxy[HSX_LOCAL_PROXY_ORIGIN] = input.relayTarget;
105
+ }
106
+ return {
107
+ proxy: Object.keys(proxy).length > 0 ? proxy : undefined,
108
+ mappings,
109
+ relay,
110
+ ...(blocker ? { blocker } : {}),
111
+ };
112
+ }
113
+ // The dev server reads `<app root>/local.json` through the default `fs`
114
+ // export during `start()`. Serialize callers so overlapping starts cannot
115
+ // restore each other's wrapper out of order.
116
+ let hideTail = Promise.resolve();
117
+ /**
118
+ * Run one upstream dev-server start with `<appRoot>/local.json` presented as
119
+ * `{ proxy }` — the user's file (if any) is never touched. HubSpot's
120
+ * `loadLocalConfig` probes `fs.existsSync` and then `fs.readFileSync`, both
121
+ * through the default `fs` export, so both are answered for that one path.
122
+ */
123
+ export async function withHubSpotLocalProxyMappings(appRoot, proxy, operation) {
124
+ let release;
125
+ const prior = hideTail;
126
+ hideTail = new Promise((done) => {
127
+ release = done;
128
+ });
129
+ await prior;
130
+ const target = resolve(appRoot, HUBSPOT_LOCAL_CONFIG_FILENAME);
131
+ const matches = (candidate) => typeof candidate === 'string' && resolve(candidate) === target;
132
+ const originalExistsSync = fs.existsSync;
133
+ const originalReadFileSync = fs.readFileSync;
134
+ const content = Buffer.from(JSON.stringify({ proxy }), 'utf8');
135
+ const existsSyncWithProxy = (candidate) => matches(candidate) ? true : originalExistsSync.call(fs, candidate);
136
+ const readFileSyncWithProxy = ((candidate, options) => matches(candidate)
137
+ ? typeof options === 'string' ||
138
+ (typeof options === 'object' &&
139
+ options !== null &&
140
+ 'encoding' in options &&
141
+ options.encoding)
142
+ ? content.toString('utf8')
143
+ : content
144
+ : originalReadFileSync.call(fs, candidate, options));
145
+ fs.existsSync = existsSyncWithProxy;
146
+ fs.readFileSync = readFileSyncWithProxy;
147
+ try {
148
+ return await operation();
149
+ }
150
+ finally {
151
+ if (fs.existsSync === existsSyncWithProxy)
152
+ fs.existsSync = originalExistsSync;
153
+ if (fs.readFileSync === readFileSyncWithProxy)
154
+ fs.readFileSync = originalReadFileSync;
155
+ release();
156
+ }
157
+ }
158
+ /**
159
+ * Run one upstream dev-server start with `<appRoot>/local.json` hidden from
160
+ * `fs.existsSync`, which is the only probe HubSpot's `loadLocalConfig` makes
161
+ * before reading the file. Nothing on disk changes, and the original method
162
+ * is restored as soon as the operation settles.
163
+ */
164
+ export async function withHubSpotLocalProxyHidden(appRoot, operation) {
165
+ let release;
166
+ const prior = hideTail;
167
+ hideTail = new Promise((done) => {
168
+ release = done;
169
+ });
170
+ await prior;
171
+ const hidden = resolve(appRoot, HUBSPOT_LOCAL_CONFIG_FILENAME);
172
+ const originalExistsSync = fs.existsSync;
173
+ const existsSyncWithoutLocalConfig = (target) => typeof target === 'string' && resolve(target) === hidden
174
+ ? false
175
+ : originalExistsSync.call(fs, target);
176
+ fs.existsSync = existsSyncWithoutLocalConfig;
177
+ try {
178
+ return await operation();
179
+ }
180
+ finally {
181
+ if (fs.existsSync === existsSyncWithoutLocalConfig)
182
+ fs.existsSync = originalExistsSync;
183
+ release();
184
+ }
185
+ }
186
+ //# sourceMappingURL=local-proxy.js.map