baxian 1.2.2 → 1.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 (91) hide show
  1. package/dist/agent/bootstrap-poller.d.ts.map +1 -1
  2. package/dist/agent/bootstrap-poller.js +2 -6
  3. package/dist/agent/bootstrap-poller.js.map +1 -1
  4. package/dist/agent/detect/debounce.d.ts +7 -0
  5. package/dist/agent/detect/debounce.d.ts.map +1 -0
  6. package/dist/agent/detect/debounce.js +23 -0
  7. package/dist/agent/detect/debounce.js.map +1 -0
  8. package/dist/agent/detect/gate.d.ts +11 -0
  9. package/dist/agent/detect/gate.d.ts.map +1 -0
  10. package/dist/agent/detect/gate.js +115 -0
  11. package/dist/agent/detect/gate.js.map +1 -0
  12. package/dist/agent/detect/index.d.ts +5 -0
  13. package/dist/agent/detect/index.d.ts.map +1 -0
  14. package/dist/agent/detect/index.js +5 -0
  15. package/dist/agent/detect/index.js.map +1 -0
  16. package/dist/agent/detect/manifest.d.ts +27 -0
  17. package/dist/agent/detect/manifest.d.ts.map +1 -0
  18. package/dist/agent/detect/manifest.js +75 -0
  19. package/dist/agent/detect/manifest.js.map +1 -0
  20. package/dist/agent/detect/manifests/claude-code.json +230 -0
  21. package/dist/agent/detect/manifests/codex.json +115 -0
  22. package/dist/agent/detect/region.d.ts +6 -0
  23. package/dist/agent/detect/region.d.ts.map +1 -0
  24. package/dist/agent/detect/region.js +118 -0
  25. package/dist/agent/detect/region.js.map +1 -0
  26. package/dist/agent/manager.d.ts +5 -1
  27. package/dist/agent/manager.d.ts.map +1 -1
  28. package/dist/agent/manager.js +52 -44
  29. package/dist/agent/manager.js.map +1 -1
  30. package/dist/agent/review-transport.d.ts +1 -1
  31. package/dist/agent/review-transport.d.ts.map +1 -1
  32. package/dist/agent/review-transport.js +1 -4
  33. package/dist/agent/review-transport.js.map +1 -1
  34. package/dist/agent/tmux-probe-poller.d.ts +5 -0
  35. package/dist/agent/tmux-probe-poller.d.ts.map +1 -1
  36. package/dist/agent/tmux-probe-poller.js +88 -37
  37. package/dist/agent/tmux-probe-poller.js.map +1 -1
  38. package/dist/agent/tmux.d.ts +3 -2
  39. package/dist/agent/tmux.d.ts.map +1 -1
  40. package/dist/agent/tmux.js +48 -30
  41. package/dist/agent/tmux.js.map +1 -1
  42. package/dist/agent/worktree.d.ts +4 -1
  43. package/dist/agent/worktree.d.ts.map +1 -1
  44. package/dist/agent/worktree.js +93 -7
  45. package/dist/agent/worktree.js.map +1 -1
  46. package/dist/api/projects.d.ts.map +1 -1
  47. package/dist/api/projects.js +2 -1
  48. package/dist/api/projects.js.map +1 -1
  49. package/dist/api/tasks.d.ts.map +1 -1
  50. package/dist/api/tasks.js +5 -0
  51. package/dist/api/tasks.js.map +1 -1
  52. package/dist/config/loader.d.ts +1 -1
  53. package/dist/config/loader.d.ts.map +1 -1
  54. package/dist/config/loader.js +34 -35
  55. package/dist/config/loader.js.map +1 -1
  56. package/dist/config/validator.d.ts +1 -1
  57. package/dist/config/validator.d.ts.map +1 -1
  58. package/dist/config/validator.js +31 -17
  59. package/dist/config/validator.js.map +1 -1
  60. package/dist/event/server-handlers.d.ts.map +1 -1
  61. package/dist/event/server-handlers.js +64 -2
  62. package/dist/event/server-handlers.js.map +1 -1
  63. package/dist/github/index.d.ts +1 -1
  64. package/dist/github/index.d.ts.map +1 -1
  65. package/dist/github/index.js.map +1 -1
  66. package/dist/github/mapper.d.ts +1 -1
  67. package/dist/github/mapper.d.ts.map +1 -1
  68. package/dist/github/mapper.js +6 -4
  69. package/dist/github/mapper.js.map +1 -1
  70. package/dist/github/poller.d.ts +3 -0
  71. package/dist/github/poller.d.ts.map +1 -1
  72. package/dist/github/poller.js +6 -3
  73. package/dist/github/poller.js.map +1 -1
  74. package/dist/github/resolver.d.ts.map +1 -1
  75. package/dist/github/resolver.js +5 -0
  76. package/dist/github/resolver.js.map +1 -1
  77. package/dist/index.d.ts +1 -0
  78. package/dist/index.d.ts.map +1 -1
  79. package/dist/index.js +17 -9
  80. package/dist/index.js.map +1 -1
  81. package/dist/shared/constants.d.ts +17 -0
  82. package/dist/shared/constants.d.ts.map +1 -1
  83. package/dist/shared/constants.js +27 -0
  84. package/dist/shared/constants.js.map +1 -1
  85. package/dist/shared/types.d.ts +12 -8
  86. package/dist/shared/types.d.ts.map +1 -1
  87. package/dist/shared/types.js +3 -1
  88. package/dist/shared/types.js.map +1 -1
  89. package/dist/web/assets/{index-COIOmeco.js → index-BQ-vJO9b.js} +3 -3
  90. package/dist/web/index.html +1 -1
  91. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap-poller.d.ts","sourceRoot":"","sources":["../../src/agent/bootstrap-poller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAIjE,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,cAAc,CAAC;IAC1B,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,aAAa,CAAC;IACtD,gBAAgB,CAAC,EAAE,CACjB,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,EACzB,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,EACzB,KAAK,EAAE,cAAc,KAClB,SAAS,CAAC;IACf,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAID,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;IACpD,OAAO,CAAC,IAAI,CAAyB;IACrC,OAAO,CAAC,mBAAmB,CAA6B;IACxD,OAAO,CAAC,cAAc,CAAS;gBAEnB,OAAO,EAAE,sBAAsB;IAe3C,aAAa,CAAC,SAAS,EAAE,YAAY,GAAG,IAAI;IAe5C,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,IAAI;IAIN,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAYzB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,OAAO,CAAA;KAAE,CAAC;YAqBpF,WAAW;CAiB1B"}
1
+ {"version":3,"file":"bootstrap-poller.d.ts","sourceRoot":"","sources":["../../src/agent/bootstrap-poller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAIjE,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,cAAc,CAAC;IAC1B,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,aAAa,CAAC;IACtD,gBAAgB,CAAC,EAAE,CACjB,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,EACzB,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,EACzB,KAAK,EAAE,cAAc,KAClB,SAAS,CAAC;IACf,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;IACpD,OAAO,CAAC,IAAI,CAAyB;IACrC,OAAO,CAAC,mBAAmB,CAA6B;IACxD,OAAO,CAAC,cAAc,CAAS;gBAEnB,OAAO,EAAE,sBAAsB;IAc3C,aAAa,CAAC,SAAS,EAAE,YAAY,GAAG,IAAI;IAa5C,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,IAAI;IAIN,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAYzB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,OAAO,CAAA;KAAE,CAAC;YAqBpF,WAAW;CAiB1B"}
@@ -1,7 +1,6 @@
1
1
  import { hostGroupKey } from './runner.js';
2
2
  import { collectTargets, runSingleTarget } from './bootstrap.js';
3
3
  import { PeriodicTaskRunner } from '../timing/periodic-task-runner.js';
4
- const DEFAULT_INTERVAL_MS = 60_000;
5
4
  export class BootstrapPoller {
6
5
  periodicRunner;
7
6
  opts;
@@ -10,8 +9,7 @@ export class BootstrapPoller {
10
9
  constructor(options) {
11
10
  this.opts = options;
12
11
  this.pollIntervalMs = options.intervalMs
13
- ?? options.config.server.bootstrapRetryIntervalMs
14
- ?? DEFAULT_INTERVAL_MS;
12
+ ?? options.config.server.bootstrapRetryIntervalMs;
15
13
  this.periodicRunner = new PeriodicTaskRunner({
16
14
  name: 'bootstrap-poller',
17
15
  intervalMs: this.pollIntervalMs,
@@ -28,9 +26,7 @@ export class BootstrapPoller {
28
26
  if (!validKeys.has(key))
29
27
  this.lastFailureByTarget.delete(key);
30
28
  }
31
- // Cleared field must revert to default, not freeze the prior runtime value —
32
- // PATCH /config dropping the key signals "use default", not "keep current".
33
- const nextIntervalMs = validated.server.bootstrapRetryIntervalMs ?? DEFAULT_INTERVAL_MS;
29
+ const nextIntervalMs = validated.server.bootstrapRetryIntervalMs;
34
30
  if (nextIntervalMs !== this.pollIntervalMs) {
35
31
  this.pollIntervalMs = nextIntervalMs;
36
32
  this.periodicRunner.reschedule(nextIntervalMs);
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap-poller.js","sourceRoot":"","sources":["../../src/agent/bootstrap-poller.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAoBvE,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAEnC,MAAM,OAAO,eAAe;IACT,cAAc,CAAqB;IAC5C,IAAI,CAAyB;IAC7B,mBAAmB,GAAG,IAAI,GAAG,EAAkB,CAAC;IAChD,cAAc,CAAS;IAE/B,YAAY,OAA+B;QACzC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;QACpB,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,UAAU;eACnC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,wBAAwB;eAC9C,mBAAmB,CAAC;QACzB,IAAI,CAAC,cAAc,GAAG,IAAI,kBAAkB,CAAC;YAC3C,IAAI,EAAE,kBAAkB;YACxB,UAAU,EAAE,IAAI,CAAC,cAAc;YAC/B,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE;SAC9B,CAAC,CAAC;IACL,CAAC;IAED,+EAA+E;IAC/E,+EAA+E;IAC/E,+EAA+E;IAC/E,aAAa,CAAC,SAAuB;QACnC,IAAI,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAChD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;QACpE,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YACvD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChE,CAAC;QACD,6EAA6E;QAC7E,4EAA4E;QAC5E,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,CAAC,wBAAwB,IAAI,mBAAmB,CAAC;QACxF,IAAI,cAAc,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;YAC3C,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;YACrC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,IAAI;QACF,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;IACtC,CAAC;IAED,0FAA0F;IAC1F,4FAA4F;IAC5F,8EAA8E;IAC9E,EAAE;IACF,6FAA6F;IAC7F,0FAA0F;IAC1F,4FAA4F;IAC5F,gFAAgF;IAChF,KAAK,CAAC,WAAW,CAAC,SAAiB;QACjC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;QAC5E,IAAI,CAAC,YAAY;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;QACrE,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;QACzF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;QAC1E,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,MAAM,OAAO,CAAC,UAAU,CACtB,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YAC3B,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;YAC9B,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC;YACnF,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;gBACd,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACN,KAAK,GAAG,KAAK,CAAC;gBACd,IAAI,MAAM,CAAC,cAAc;oBAAE,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;YACtF,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QACF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;IAChE,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,OAAO,CAAC,UAAU,CACtB,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YAC3B,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;YAC9B,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE;gBACtD,eAAe,EAAE,KAAK;gBACtB,sBAAsB,EAAE,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC;aAC1D,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;gBACd,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvC,CAAC;iBAAM,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;gBACjC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;CACF;AAED,SAAS,SAAS,CAAC,MAAiD;IAClE,MAAM,KAAK,GAAG,MAAM,CAAC,mBAAmB,CAAC;IACzC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;AACtH,CAAC"}
1
+ {"version":3,"file":"bootstrap-poller.js","sourceRoot":"","sources":["../../src/agent/bootstrap-poller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { DetectedState } from './manifest.js';
2
+ export declare class WorkingToIdleDebounce {
3
+ private confirmations;
4
+ apply(nextState: DetectedState, previousPublished: DetectedState, visibleIdle: boolean): DetectedState;
5
+ reset(): void;
6
+ }
7
+ //# sourceMappingURL=debounce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debounce.d.ts","sourceRoot":"","sources":["../../../src/agent/detect/debounce.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAInD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,aAAa,CAAK;IAE1B,KAAK,CACH,SAAS,EAAE,aAAa,EACxB,iBAAiB,EAAE,aAAa,EAChC,WAAW,EAAE,OAAO,GACnB,aAAa;IAmBhB,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,23 @@
1
+ const IDLE_CONFIRMATION_THRESHOLD = 3;
2
+ export class WorkingToIdleDebounce {
3
+ confirmations = 0;
4
+ apply(nextState, previousPublished, visibleIdle) {
5
+ const isWorkingToPlainIdle = previousPublished === 'working'
6
+ && nextState === 'idle'
7
+ && !visibleIdle;
8
+ if (!isWorkingToPlainIdle) {
9
+ this.confirmations = 0;
10
+ return nextState;
11
+ }
12
+ this.confirmations++;
13
+ if (this.confirmations >= IDLE_CONFIRMATION_THRESHOLD) {
14
+ this.confirmations = 0;
15
+ return 'idle';
16
+ }
17
+ return 'working';
18
+ }
19
+ reset() {
20
+ this.confirmations = 0;
21
+ }
22
+ }
23
+ //# sourceMappingURL=debounce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debounce.js","sourceRoot":"","sources":["../../../src/agent/detect/debounce.ts"],"names":[],"mappings":"AAEA,MAAM,2BAA2B,GAAG,CAAC,CAAC;AAEtC,MAAM,OAAO,qBAAqB;IACxB,aAAa,GAAG,CAAC,CAAC;IAE1B,KAAK,CACH,SAAwB,EACxB,iBAAgC,EAChC,WAAoB;QAEpB,MAAM,oBAAoB,GACxB,iBAAiB,KAAK,SAAS;eAC5B,SAAS,KAAK,MAAM;eACpB,CAAC,WAAW,CAAC;QAElB,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC1B,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;YACvB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,IAAI,CAAC,aAAa,IAAI,2BAA2B,EAAE,CAAC;YACtD,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;YACvB,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;IACzB,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ export interface Gate {
2
+ contains?: string[];
3
+ regex?: string[];
4
+ lineRegex?: string[];
5
+ all?: Gate[];
6
+ any?: Gate[];
7
+ not?: Gate[];
8
+ notAfter?: Gate[];
9
+ }
10
+ export declare function evaluateGate(gate: Gate, text: string): boolean;
11
+ //# sourceMappingURL=gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../../src/agent/detect/gate.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC;IACb,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC;IACb,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC;IACb,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC;CACnB;AAmED,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CA2D9D"}
@@ -0,0 +1,115 @@
1
+ const regexCache = new Map();
2
+ function getCachedRegExp(pattern) {
3
+ let re = regexCache.get(pattern);
4
+ if (!re) {
5
+ re = new RegExp(pattern);
6
+ regexCache.set(pattern, re);
7
+ }
8
+ return re;
9
+ }
10
+ function findLastPositiveMatchLine(gate, lines) {
11
+ let last = -1;
12
+ if (gate.contains) {
13
+ for (const needle of gate.contains) {
14
+ const lower = needle.toLowerCase();
15
+ for (let i = lines.length - 1; i >= 0; i--) {
16
+ if (lines[i].toLowerCase().includes(lower)) {
17
+ last = Math.max(last, i);
18
+ break;
19
+ }
20
+ }
21
+ }
22
+ }
23
+ if (gate.lineRegex) {
24
+ for (const pattern of gate.lineRegex) {
25
+ const re = getCachedRegExp(pattern);
26
+ for (let i = lines.length - 1; i >= 0; i--) {
27
+ if (re.test(lines[i])) {
28
+ last = Math.max(last, i);
29
+ break;
30
+ }
31
+ }
32
+ }
33
+ }
34
+ if (gate.regex) {
35
+ for (const pattern of gate.regex) {
36
+ const re = getCachedRegExp(pattern);
37
+ for (let i = lines.length - 1; i >= 0; i--) {
38
+ if (re.test(lines[i])) {
39
+ last = Math.max(last, i);
40
+ break;
41
+ }
42
+ }
43
+ }
44
+ }
45
+ if (gate.any) {
46
+ for (const nested of gate.any) {
47
+ last = Math.max(last, findLastPositiveMatchLine(nested, lines));
48
+ }
49
+ }
50
+ if (gate.all) {
51
+ for (const nested of gate.all) {
52
+ last = Math.max(last, findLastPositiveMatchLine(nested, lines));
53
+ }
54
+ }
55
+ return last;
56
+ }
57
+ export function evaluateGate(gate, text) {
58
+ const hasMatcher = (gate.contains && gate.contains.length > 0)
59
+ || (gate.regex && gate.regex.length > 0)
60
+ || (gate.lineRegex && gate.lineRegex.length > 0)
61
+ || (gate.all && gate.all.length > 0)
62
+ || (gate.any && gate.any.length > 0)
63
+ || (gate.not && gate.not.length > 0);
64
+ if (!hasMatcher)
65
+ return false;
66
+ if (gate.contains) {
67
+ const lowerText = text.toLowerCase();
68
+ for (const needle of gate.contains) {
69
+ if (!lowerText.includes(needle.toLowerCase()))
70
+ return false;
71
+ }
72
+ }
73
+ if (gate.regex) {
74
+ for (const pattern of gate.regex) {
75
+ if (!getCachedRegExp(pattern).test(text))
76
+ return false;
77
+ }
78
+ }
79
+ if (gate.lineRegex) {
80
+ const lines = text.split('\n');
81
+ for (const pattern of gate.lineRegex) {
82
+ if (!lines.some(line => getCachedRegExp(pattern).test(line)))
83
+ return false;
84
+ }
85
+ }
86
+ if (gate.all) {
87
+ for (const nested of gate.all) {
88
+ if (!evaluateGate(nested, text))
89
+ return false;
90
+ }
91
+ }
92
+ if (gate.any && gate.any.length > 0) {
93
+ if (!gate.any.some(nested => evaluateGate(nested, text)))
94
+ return false;
95
+ }
96
+ if (gate.not) {
97
+ for (const nested of gate.not) {
98
+ if (evaluateGate(nested, text))
99
+ return false;
100
+ }
101
+ }
102
+ if (gate.notAfter && gate.notAfter.length > 0) {
103
+ const lines = text.split('\n');
104
+ const anchor = findLastPositiveMatchLine(gate, lines);
105
+ if (anchor >= 0 && anchor < lines.length - 1) {
106
+ const suffix = lines.slice(anchor + 1).join('\n');
107
+ for (const nested of gate.notAfter) {
108
+ if (evaluateGate(nested, suffix))
109
+ return false;
110
+ }
111
+ }
112
+ }
113
+ return true;
114
+ }
115
+ //# sourceMappingURL=gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.js","sourceRoot":"","sources":["../../../src/agent/detect/gate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { evaluateGate, type Gate } from './gate.js';
2
+ export { extractRegion, type DetectionInput } from './region.js';
3
+ export { evaluateManifest, type AgentManifest, type ManifestRule, type ManifestDetection, type DetectedState, } from './manifest.js';
4
+ export { WorkingToIdleDebounce } from './debounce.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agent/detect/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,IAAI,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EACL,gBAAgB,EAChB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,aAAa,GACnB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { evaluateGate } from './gate.js';
2
+ export { extractRegion } from './region.js';
3
+ export { evaluateManifest, } from './manifest.js';
4
+ export { WorkingToIdleDebounce } from './debounce.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agent/detect/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAa,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,aAAa,EAAuB,MAAM,aAAa,CAAC;AACjE,OAAO,EACL,gBAAgB,GAKjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { Gate } from './gate.js';
2
+ import { type DetectionInput } from './region.js';
3
+ export type DetectedState = 'idle' | 'working' | 'pending' | 'unknown';
4
+ export interface ManifestRule extends Gate {
5
+ id: string;
6
+ state: DetectedState;
7
+ priority: number;
8
+ region: string;
9
+ visibleBlocker?: boolean;
10
+ visibleIdle?: boolean;
11
+ visibleWorking?: boolean;
12
+ skipStateUpdate?: boolean;
13
+ }
14
+ export interface AgentManifest {
15
+ id: string;
16
+ rules: ManifestRule[];
17
+ }
18
+ export interface ManifestDetection {
19
+ state: DetectedState;
20
+ matchedRuleId?: string;
21
+ visibleBlocker: boolean;
22
+ visibleIdle: boolean;
23
+ visibleWorking: boolean;
24
+ skipStateUpdate: boolean;
25
+ }
26
+ export declare function evaluateManifest(manifest: AgentManifest, input: DetectionInput): ManifestDetection;
27
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/agent/detect/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAEjE,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAEvE,MAAM,WAAW,YAAa,SAAQ,IAAI;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,aAAa,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,aAAa,EACvB,KAAK,EAAE,cAAc,GACpB,iBAAiB,CAqEnB"}
@@ -0,0 +1,75 @@
1
+ import { evaluateGate } from './gate.js';
2
+ import { extractRegion } from './region.js';
3
+ export function evaluateManifest(manifest, input) {
4
+ let matched;
5
+ let bestScreenBlocker;
6
+ let bestScreenEvidence;
7
+ let bestScreenSkip;
8
+ for (const rule of manifest.rules) {
9
+ const regionText = extractRegion(input, rule.region);
10
+ if (!evaluateGate(rule, regionText))
11
+ continue;
12
+ if (!matched || rule.priority > matched.priority) {
13
+ matched = rule;
14
+ }
15
+ if (rule.region !== 'oscTitle') {
16
+ if (rule.skipStateUpdate) {
17
+ if (!bestScreenSkip || rule.priority > bestScreenSkip.priority) {
18
+ bestScreenSkip = rule;
19
+ }
20
+ }
21
+ else {
22
+ if (rule.visibleBlocker && rule.state === 'pending') {
23
+ if (!bestScreenBlocker || rule.priority > bestScreenBlocker.priority) {
24
+ bestScreenBlocker = rule;
25
+ }
26
+ }
27
+ if ((rule.visibleWorking && rule.state === 'working') || (rule.visibleIdle && rule.state === 'idle')) {
28
+ if (!bestScreenEvidence || rule.priority > bestScreenEvidence.priority) {
29
+ bestScreenEvidence = rule;
30
+ }
31
+ }
32
+ }
33
+ }
34
+ }
35
+ if (matched && matched.region === 'oscTitle') {
36
+ if (bestScreenBlocker && bestScreenSkip && bestScreenBlocker.priority >= bestScreenSkip.priority) {
37
+ matched = bestScreenBlocker;
38
+ }
39
+ else if (bestScreenSkip) {
40
+ matched = bestScreenSkip;
41
+ }
42
+ else if (matched.state === 'working' && bestScreenBlocker && bestScreenBlocker.priority >= 900) {
43
+ matched = bestScreenBlocker;
44
+ }
45
+ else if (matched.state === 'working' && bestScreenEvidence && bestScreenEvidence.state === 'idle') {
46
+ matched = bestScreenEvidence;
47
+ }
48
+ else if (matched.state === 'pending') {
49
+ if (bestScreenBlocker) {
50
+ matched = bestScreenBlocker;
51
+ }
52
+ else if (bestScreenEvidence) {
53
+ matched = bestScreenEvidence;
54
+ }
55
+ }
56
+ }
57
+ if (!matched) {
58
+ return {
59
+ state: 'idle',
60
+ visibleBlocker: false,
61
+ visibleIdle: false,
62
+ visibleWorking: false,
63
+ skipStateUpdate: false,
64
+ };
65
+ }
66
+ return {
67
+ state: matched.state,
68
+ matchedRuleId: matched.id,
69
+ visibleBlocker: !!(matched.visibleBlocker && matched.state === 'pending'),
70
+ visibleIdle: !!(matched.visibleIdle && matched.state === 'idle'),
71
+ visibleWorking: !!(matched.visibleWorking && matched.state === 'working'),
72
+ skipStateUpdate: !!matched.skipStateUpdate,
73
+ };
74
+ }
75
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/agent/detect/manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,230 @@
1
+ {
2
+ "id": "claude-code",
3
+ "rules": [
4
+ {
5
+ "id": "osc_title_working",
6
+ "state": "working",
7
+ "priority": 1100,
8
+ "region": "oscTitle",
9
+ "visibleWorking": true,
10
+ "regex": ["^[\\u2800-\\u28FF] "]
11
+ },
12
+ {
13
+ "id": "transcript_viewer",
14
+ "state": "unknown",
15
+ "priority": 1200,
16
+ "region": "tailNonEmpty(1)",
17
+ "skipStateUpdate": true,
18
+ "any": [
19
+ { "contains": ["ctrl+o", "to toggle"] },
20
+ { "contains": ["ctrl+e", "show all"] },
21
+ { "contains": ["ctrl+e", "collapse"] },
22
+ { "contains": ["showing detailed transcript"] },
23
+ { "contains": ["↑↓ scroll"] },
24
+ { "contains": ["? for shortcuts"] }
25
+ ]
26
+ },
27
+ {
28
+ "id": "live_blocked_form",
29
+ "state": "pending",
30
+ "priority": 980,
31
+ "region": "afterLastHorizontalRule",
32
+ "visibleBlocker": true,
33
+ "contains": ["enter to select", "esc to cancel"],
34
+ "any": [
35
+ { "contains": ["tab/arrow keys to navigate"] },
36
+ { "contains": ["arrow keys to navigate"] },
37
+ { "contains": ["arrows to navigate"] },
38
+ { "contains": ["↑/↓ to navigate"] },
39
+ { "contains": ["↑↓ to navigate"] }
40
+ ],
41
+ "notAfter": [
42
+ { "lineRegex": ["^\\s*[❯>]\\s*$"] },
43
+ { "lineRegex": ["^[·✢✳✶✻✽][ \\t]+[^\\n…]{1,200}…[ \\t]*\\([ \\t]*(?:\\d+[ \\t]*m[ \\t]+)?\\d+[ \\t]*s"] },
44
+ { "regex": ["[eE]sc to interru(?:pt|p(?:…|\\.{3})?)"] },
45
+ { "lineRegex": ["^[ \\t]*⏵⏵ bypass permissions on"] }
46
+ ]
47
+ },
48
+ {
49
+ "id": "dynamic_workflow_prompt",
50
+ "state": "pending",
51
+ "priority": 980,
52
+ "region": "afterLastHorizontalRule",
53
+ "visibleBlocker": true,
54
+ "contains": ["run a dynamic workflow?", "esc to cancel"],
55
+ "notAfter": [
56
+ { "lineRegex": ["^\\s*[❯>]\\s*$"] },
57
+ { "lineRegex": ["^[·✢✳✶✻✽][ \\t]+[^\\n…]{1,200}…[ \\t]*\\([ \\t]*(?:\\d+[ \\t]*m[ \\t]+)?\\d+[ \\t]*s"] },
58
+ { "regex": ["[eE]sc to interru(?:pt|p(?:…|\\.{3})?)"] },
59
+ { "lineRegex": ["^[ \\t]*⏵⏵ bypass permissions on"] }
60
+ ]
61
+ },
62
+ {
63
+ "id": "runtime_menu",
64
+ "state": "pending",
65
+ "priority": 955,
66
+ "region": "tail(5)",
67
+ "visibleBlocker": true,
68
+ "contains": ["enter to"],
69
+ "lineRegex": ["^[ \\t]*[Ee]nter to\\b[^\\n]{0,160}\\u00b7[^\\n]{0,40}\\b[Ee]sc to\\b"],
70
+ "notAfter": [
71
+ { "lineRegex": ["^[·✢✳✶✻✽][ \\t]+[^\\n…]{1,200}…[ \\t]*\\([ \\t]*(?:\\d+[ \\t]*m[ \\t]+)?\\d+[ \\t]*s"] },
72
+ { "lineRegex": ["^\\s*[❯>]\\s*$"] },
73
+ { "regex": ["[eE]sc to interru(?:pt|p(?:…|\\.{3})?)"] },
74
+ { "lineRegex": ["^[ \\t]*⏵⏵ bypass permissions on"] }
75
+ ]
76
+ },
77
+ {
78
+ "id": "live_prompt_box",
79
+ "state": "idle",
80
+ "priority": 950,
81
+ "region": "promptBoxBody",
82
+ "visibleIdle": true,
83
+ "lineRegex": ["^\\s*❯\\s*$"],
84
+ "not": [
85
+ { "contains": ["enter to select"] },
86
+ { "contains": ["esc to cancel"] },
87
+ { "contains": ["tab/arrow keys"] },
88
+ { "contains": ["arrow keys to navigate"] },
89
+ { "contains": ["↑/↓ to navigate"] }
90
+ ]
91
+ },
92
+ {
93
+ "id": "model_picker_menu",
94
+ "state": "unknown",
95
+ "priority": 960,
96
+ "region": "whole",
97
+ "skipStateUpdate": true,
98
+ "contains": ["select model", "enter to set as default"],
99
+ "notAfter": [
100
+ { "regex": ["[eE]sc to interru(?:pt|p(?:…|\\.{3})?)"] },
101
+ { "lineRegex": ["^\\s*[❯>]\\s*$"] },
102
+ { "lineRegex": ["^[·✢✳✶✻✽][ \\t]+[^\\n…]{1,200}…[ \\t]*\\([ \\t]*(?:\\d+[ \\t]*m[ \\t]+)?\\d+[ \\t]*s"] },
103
+ { "contains": ["do you want to"] },
104
+ { "contains": ["would you like to"] },
105
+ { "contains": ["enter to select"] },
106
+ { "contains": ["enter to confirm"] },
107
+ { "contains": ["waiting for permission"] },
108
+ { "contains": ["tab to amend"] },
109
+ { "contains": ["ctrl+e to explain"] },
110
+ { "contains": ["review your answers"] },
111
+ { "contains": ["skip interview and plan immediately"] },
112
+ { "lineRegex": ["^[ \\t]*⏵⏵ bypass permissions on"] }
113
+ ]
114
+ },
115
+ {
116
+ "id": "bash_permission_prompt",
117
+ "state": "pending",
118
+ "priority": 953,
119
+ "region": "afterLastHorizontalRule",
120
+ "visibleBlocker": true,
121
+ "contains": ["do you want to proceed?"],
122
+ "any": [
123
+ { "contains": ["bash command"] },
124
+ { "contains": ["bash("] },
125
+ { "contains": ["contains expansion"] },
126
+ { "contains": ["tab to amend"] },
127
+ { "contains": ["ctrl+e to explain"] }
128
+ ],
129
+ "all": [
130
+ { "any": [
131
+ { "lineRegex": ["^\\s*❯?\\s*[Yy][Ee][Ss]\\b"] },
132
+ { "lineRegex": ["^\\s*1\\.\\s*[Yy][Ee][Ss]\\b"] },
133
+ { "lineRegex": ["^\\s*2\\.\\s*[Nn][Oo]\\b"] }
134
+ ]}
135
+ ],
136
+ "notAfter": [
137
+ { "lineRegex": ["^\\s*[❯>]\\s*$"] },
138
+ { "lineRegex": ["^[·✢✳✶✻✽][ \\t]+[^\\n…]{1,200}…[ \\t]*\\([ \\t]*(?:\\d+[ \\t]*m[ \\t]+)?\\d+[ \\t]*s"] },
139
+ { "regex": ["[eE]sc to interru(?:pt|p(?:…|\\.{3})?)"] },
140
+ { "lineRegex": ["^[ \\t]*⏵⏵ bypass permissions on"] }
141
+ ]
142
+ },
143
+ {
144
+ "id": "generic_permission_prompt",
145
+ "state": "pending",
146
+ "priority": 952,
147
+ "region": "afterLastHorizontalRule",
148
+ "visibleBlocker": true,
149
+ "contains": ["do you want to proceed?", "esc to cancel"],
150
+ "all": [
151
+ { "any": [
152
+ { "lineRegex": ["^\\s*❯?\\s*1\\.\\s*[Yy][Ee][Ss]\\b"] },
153
+ { "lineRegex": ["^\\s*2\\.\\s*[Yy][Ee][Ss]\\b"] },
154
+ { "lineRegex": ["^\\s*2\\.\\s*[Nn][Oo]\\b"] },
155
+ { "lineRegex": ["^\\s*3\\.\\s*[Nn][Oo]\\b"] }
156
+ ]}
157
+ ],
158
+ "notAfter": [
159
+ { "lineRegex": ["^\\s*[❯>]\\s*$"] },
160
+ { "lineRegex": ["^[·✢✳✶✻✽][ \\t]+[^\\n…]{1,200}…[ \\t]*\\([ \\t]*(?:\\d+[ \\t]*m[ \\t]+)?\\d+[ \\t]*s"] },
161
+ { "regex": ["[eE]sc to interru(?:pt|p(?:…|\\.{3})?)"] },
162
+ { "lineRegex": ["^[ \\t]*⏵⏵ bypass permissions on"] }
163
+ ]
164
+ },
165
+ {
166
+ "id": "legacy_no_prompt_blocker",
167
+ "state": "pending",
168
+ "priority": 300,
169
+ "region": "afterLastHorizontalRule",
170
+ "visibleBlocker": true,
171
+ "any": [
172
+ { "contains": ["do you want to"], "any": [{ "contains": ["yes"] }, { "lineRegex": ["^\\s*❯\\s+\\S"] }] },
173
+ { "contains": ["would you like to"], "any": [{ "contains": ["yes"] }, { "lineRegex": ["^\\s*❯\\s+\\S"] }] },
174
+ { "contains": ["waiting for permission"] },
175
+ { "contains": ["do you want to allow this connection?"] },
176
+ { "contains": ["tab to amend"] },
177
+ { "contains": ["ctrl+e to explain"] },
178
+ { "contains": ["do you want to proceed?", "esc to cancel"] },
179
+ { "contains": ["review your answers"] },
180
+ { "contains": ["skip interview and plan immediately"] }
181
+ ],
182
+ "notAfter": [
183
+ { "lineRegex": ["^\\s*[❯>]\\s*$"] },
184
+ { "regex": ["[eE]sc to interru(?:pt|p(?:…|\\.{3})?)"] },
185
+ { "lineRegex": ["^[ \\t]*⏵⏵ bypass permissions on"] }
186
+ ]
187
+ },
188
+ {
189
+ "id": "spinner_working",
190
+ "state": "working",
191
+ "priority": 951,
192
+ "region": "tail(10)",
193
+ "visibleWorking": true,
194
+ "lineRegex": ["^[·✢✳✶✻✽][ \\t]+[^\\n…]{1,200}…[ \\t]*\\([ \\t]*(?:\\d+[ \\t]*m[ \\t]+)?\\d+[ \\t]*s"],
195
+ "notAfter": [
196
+ { "lineRegex": ["^✻[ \\t]+Worked for"] }
197
+ ]
198
+ },
199
+ {
200
+ "id": "esc_to_interrupt_working",
201
+ "state": "working",
202
+ "priority": 240,
203
+ "region": "afterLastHorizontalRule",
204
+ "regex": ["[eE]sc to interru(?:pt|p(?:…|\\.{3})?)"],
205
+ "notAfter": [
206
+ { "lineRegex": ["^[ \\t]*[❯>][ \\t]*$"] },
207
+ { "lineRegex": ["^[ \\t]*⏵⏵ bypass permissions on"] }
208
+ ]
209
+ },
210
+ {
211
+ "id": "osc_title_idle",
212
+ "state": "idle",
213
+ "priority": 200,
214
+ "region": "oscTitle",
215
+ "visibleIdle": true,
216
+ "regex": ["^\\u2733 "]
217
+ },
218
+ {
219
+ "id": "idle_composer_prompt",
220
+ "state": "idle",
221
+ "priority": 100,
222
+ "region": "tail(6)",
223
+ "visibleIdle": true,
224
+ "any": [
225
+ { "regex": ["(?:^|\\n)[ \\t]*[❯>][ \\t]*(?:\\n[ \\t]*)*$"] },
226
+ { "regex": ["(?:^|\\n)[ \\t]*⏵⏵ bypass permissions on[^\\n]*(?:\\n[ \\t]*)*$"] }
227
+ ]
228
+ }
229
+ ]
230
+ }