@superblocksteam/vite-plugin-file-sync 2.0.130-next.1 → 2.0.130-next.3

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 (131) hide show
  1. package/dist/ai-service/agent/prompts/build-base-system-prompt.js +1 -1
  2. package/dist/ai-service/agent/prompts/build-base-system-prompt.js.map +1 -1
  3. package/dist/ai-service/agent/tool-message-utils.d.ts.map +1 -1
  4. package/dist/ai-service/agent/tool-message-utils.js +30 -0
  5. package/dist/ai-service/agent/tool-message-utils.js.map +1 -1
  6. package/dist/ai-service/agent/tools2/tools/exit-plan-mode.d.ts +11 -1
  7. package/dist/ai-service/agent/tools2/tools/exit-plan-mode.d.ts.map +1 -1
  8. package/dist/ai-service/agent/tools2/tools/exit-plan-mode.js +144 -29
  9. package/dist/ai-service/agent/tools2/tools/exit-plan-mode.js.map +1 -1
  10. package/dist/ai-service/agent/utils.d.ts.map +1 -1
  11. package/dist/ai-service/agent/utils.js +6 -1
  12. package/dist/ai-service/agent/utils.js.map +1 -1
  13. package/dist/ai-service/app-skills/helpers.d.ts.map +1 -1
  14. package/dist/ai-service/app-skills/helpers.js +17 -18
  15. package/dist/ai-service/app-skills/helpers.js.map +1 -1
  16. package/dist/ai-service/chat/chat-push-metrics.d.ts +12 -0
  17. package/dist/ai-service/chat/chat-push-metrics.d.ts.map +1 -0
  18. package/dist/ai-service/chat/chat-push-metrics.js +68 -0
  19. package/dist/ai-service/chat/chat-push-metrics.js.map +1 -0
  20. package/dist/ai-service/chat/chat-session-store.d.ts +61 -5
  21. package/dist/ai-service/chat/chat-session-store.d.ts.map +1 -1
  22. package/dist/ai-service/chat/chat-session-store.js +214 -8
  23. package/dist/ai-service/chat/chat-session-store.js.map +1 -1
  24. package/dist/ai-service/chat/transcript-budget.d.ts +108 -0
  25. package/dist/ai-service/chat/transcript-budget.d.ts.map +1 -0
  26. package/dist/ai-service/chat/transcript-budget.js +175 -0
  27. package/dist/ai-service/chat/transcript-budget.js.map +1 -0
  28. package/dist/ai-service/chat/transcript-metrics.d.ts +16 -0
  29. package/dist/ai-service/chat/transcript-metrics.d.ts.map +1 -0
  30. package/dist/ai-service/chat/transcript-metrics.js +128 -0
  31. package/dist/ai-service/chat/transcript-metrics.js.map +1 -0
  32. package/dist/ai-service/context-download.d.ts.map +1 -1
  33. package/dist/ai-service/context-download.js +48 -1
  34. package/dist/ai-service/context-download.js.map +1 -1
  35. package/dist/ai-service/context-upload.d.ts.map +1 -1
  36. package/dist/ai-service/context-upload.js +10 -0
  37. package/dist/ai-service/context-upload.js.map +1 -1
  38. package/dist/ai-service/index.d.ts.map +1 -1
  39. package/dist/ai-service/index.js +4 -0
  40. package/dist/ai-service/index.js.map +1 -1
  41. package/dist/ai-service/llm/clark-stream-telemetry-sink.d.ts +4 -0
  42. package/dist/ai-service/llm/clark-stream-telemetry-sink.d.ts.map +1 -0
  43. package/dist/ai-service/llm/clark-stream-telemetry-sink.js +105 -0
  44. package/dist/ai-service/llm/clark-stream-telemetry-sink.js.map +1 -0
  45. package/dist/ai-service/llm/client.d.ts.map +1 -1
  46. package/dist/ai-service/llm/client.js +63 -39
  47. package/dist/ai-service/llm/client.js.map +1 -1
  48. package/dist/ai-service/llm/context-v2/compaction/client-side.d.ts.map +1 -1
  49. package/dist/ai-service/llm/context-v2/compaction/client-side.js +10 -1
  50. package/dist/ai-service/llm/context-v2/compaction/client-side.js.map +1 -1
  51. package/dist/ai-service/llm/context-v2/context.d.ts +14 -0
  52. package/dist/ai-service/llm/context-v2/context.d.ts.map +1 -1
  53. package/dist/ai-service/llm/context-v2/context.js +94 -3
  54. package/dist/ai-service/llm/context-v2/context.js.map +1 -1
  55. package/dist/ai-service/llm/context-v2/storage/event-types.d.ts +10 -1
  56. package/dist/ai-service/llm/context-v2/storage/event-types.d.ts.map +1 -1
  57. package/dist/ai-service/llm/context-v2/storage/event-types.js +7 -1
  58. package/dist/ai-service/llm/context-v2/storage/event-types.js.map +1 -1
  59. package/dist/ai-service/llm/stream/config.d.ts +30 -0
  60. package/dist/ai-service/llm/stream/config.d.ts.map +1 -1
  61. package/dist/ai-service/llm/stream/config.js +34 -17
  62. package/dist/ai-service/llm/stream/config.js.map +1 -1
  63. package/dist/ai-service/llm/stream/errors.d.ts +10 -1
  64. package/dist/ai-service/llm/stream/errors.d.ts.map +1 -1
  65. package/dist/ai-service/llm/stream/errors.js +3 -1
  66. package/dist/ai-service/llm/stream/errors.js.map +1 -1
  67. package/dist/ai-service/llm/stream/idle-monitor.d.ts +34 -4
  68. package/dist/ai-service/llm/stream/idle-monitor.d.ts.map +1 -1
  69. package/dist/ai-service/llm/stream/idle-monitor.js +90 -6
  70. package/dist/ai-service/llm/stream/idle-monitor.js.map +1 -1
  71. package/dist/ai-service/llm/stream/index.d.ts +1 -1
  72. package/dist/ai-service/llm/stream/index.d.ts.map +1 -1
  73. package/dist/ai-service/llm/stream/index.js.map +1 -1
  74. package/dist/ai-service/llm/stream/managed-stream.d.ts.map +1 -1
  75. package/dist/ai-service/llm/stream/managed-stream.js +11 -0
  76. package/dist/ai-service/llm/stream/managed-stream.js.map +1 -1
  77. package/dist/ai-service/llm/stream/orchestrator.d.ts +19 -0
  78. package/dist/ai-service/llm/stream/orchestrator.d.ts.map +1 -1
  79. package/dist/ai-service/llm/stream/orchestrator.js +387 -33
  80. package/dist/ai-service/llm/stream/orchestrator.js.map +1 -1
  81. package/dist/ai-service/llm/stream/retry-engine.d.ts +18 -2
  82. package/dist/ai-service/llm/stream/retry-engine.d.ts.map +1 -1
  83. package/dist/ai-service/llm/stream/retry-engine.js +76 -3
  84. package/dist/ai-service/llm/stream/retry-engine.js.map +1 -1
  85. package/dist/ai-service/llm/stream/session.d.ts +6 -0
  86. package/dist/ai-service/llm/stream/session.d.ts.map +1 -1
  87. package/dist/ai-service/llm/stream/session.js +28 -0
  88. package/dist/ai-service/llm/stream/session.js.map +1 -1
  89. package/dist/ai-service/llm/stream/types.d.ts +1 -0
  90. package/dist/ai-service/llm/stream/types.d.ts.map +1 -1
  91. package/dist/ai-service/llm/stream/wait-state-tracker.d.ts +54 -0
  92. package/dist/ai-service/llm/stream/wait-state-tracker.d.ts.map +1 -0
  93. package/dist/ai-service/llm/stream/wait-state-tracker.js +105 -0
  94. package/dist/ai-service/llm/stream/wait-state-tracker.js.map +1 -0
  95. package/dist/ai-service/state-machine/clark-fsm.d.ts.map +1 -1
  96. package/dist/ai-service/state-machine/clark-fsm.js +13 -7
  97. package/dist/ai-service/state-machine/clark-fsm.js.map +1 -1
  98. package/dist/ai-service/state-machine/handlers/agent-planning.d.ts.map +1 -1
  99. package/dist/ai-service/state-machine/handlers/agent-planning.js +55 -43
  100. package/dist/ai-service/state-machine/handlers/agent-planning.js.map +1 -1
  101. package/dist/ai-service/state-machine/handlers/flush-pending-chat-pushes.d.ts +11 -0
  102. package/dist/ai-service/state-machine/handlers/flush-pending-chat-pushes.d.ts.map +1 -0
  103. package/dist/ai-service/state-machine/handlers/flush-pending-chat-pushes.js +11 -0
  104. package/dist/ai-service/state-machine/handlers/flush-pending-chat-pushes.js.map +1 -0
  105. package/dist/ai-service/state-machine/handlers/llm-generating.d.ts.map +1 -1
  106. package/dist/ai-service/state-machine/handlers/llm-generating.js +10 -0
  107. package/dist/ai-service/state-machine/handlers/llm-generating.js.map +1 -1
  108. package/dist/ai-service/state-machine/helpers/background-chat-record-metrics.d.ts +8 -0
  109. package/dist/ai-service/state-machine/helpers/background-chat-record-metrics.d.ts.map +1 -0
  110. package/dist/ai-service/state-machine/helpers/background-chat-record-metrics.js +52 -0
  111. package/dist/ai-service/state-machine/helpers/background-chat-record-metrics.js.map +1 -0
  112. package/dist/ai-service/state-machine/helpers/background-chat-record.d.ts +33 -0
  113. package/dist/ai-service/state-machine/helpers/background-chat-record.d.ts.map +1 -0
  114. package/dist/ai-service/state-machine/helpers/background-chat-record.js +61 -0
  115. package/dist/ai-service/state-machine/helpers/background-chat-record.js.map +1 -0
  116. package/dist/ai-service/state-machine/mocks.d.ts.map +1 -1
  117. package/dist/ai-service/state-machine/mocks.js +1 -0
  118. package/dist/ai-service/state-machine/mocks.js.map +1 -1
  119. package/dist/ai-service/tasks/peer-push.d.ts +7 -4
  120. package/dist/ai-service/tasks/peer-push.d.ts.map +1 -1
  121. package/dist/ai-service/tasks/peer-push.js +7 -4
  122. package/dist/ai-service/tasks/peer-push.js.map +1 -1
  123. package/dist/migration-templates/app-fullstack/package.json +1 -1
  124. package/dist/socket-manager.d.ts +2 -1
  125. package/dist/socket-manager.d.ts.map +1 -1
  126. package/dist/socket-manager.js +17 -6
  127. package/dist/socket-manager.js.map +1 -1
  128. package/dist/util/logger.d.ts +1 -0
  129. package/dist/util/logger.d.ts.map +1 -1
  130. package/dist/util/logger.js.map +1 -1
  131. package/package.json +8 -8
@@ -1,5 +1,12 @@
1
1
  import { StallTimeoutError } from "./errors.js";
2
2
  import type { StreamSession } from "./session.js";
3
+ /**
4
+ * An idle budget, either a fixed value or a thunk resolved at arm time. A thunk
5
+ * lets the budget track the CURRENT attempt's model across fallback, so a
6
+ * downgraded model is monitored against its own budget rather than the initial
7
+ * model's. See APPS-4775.
8
+ */
9
+ export type TimeoutBudget = number | (() => number);
3
10
  /**
4
11
  * Detects when a stream has stalled (no chunks received within timeout).
5
12
  *
@@ -26,15 +33,33 @@ import type { StreamSession } from "./session.js";
26
33
  */
27
34
  export interface IdleMonitorOptions {
28
35
  session: StreamSession;
29
- maxIdleTimeMs: number;
36
+ maxIdleTimeMs: TimeoutBudget;
30
37
  /**
31
38
  * Budget for the first useful output event in each provider step. Defaults
32
39
  * to `maxIdleTimeMs`. Set larger to tolerate server-side context compaction
33
40
  * gaps after the compaction start event.
34
41
  */
35
- firstChunkTimeoutMs?: number;
42
+ firstChunkTimeoutMs?: TimeoutBudget;
36
43
  onStall?: (error: StallTimeoutError) => void;
37
44
  onServerCompactionStart?: (blockId: string) => void;
45
+ /**
46
+ * Asked the instant the timer fires. When it returns true the gap is local
47
+ * work (a running tool, a step boundary, or the consumer holding the stream)
48
+ * rather than the provider going silent, so the monitor suppresses the stall
49
+ * and re-arms instead of firing. Returning false lets a genuine provider
50
+ * stall fire. See APPS-4605.
51
+ */
52
+ shouldPause?: () => boolean;
53
+ /**
54
+ * Called once when a stretch of local-wait suppression begins — the first
55
+ * timer fire that `shouldPause` turns into a re-arm rather than a stall. Not
56
+ * called again until real activity (a chunk, step, or retry) ends the stretch,
57
+ * so a healthy slow tool logs one event, not one per re-arm. This is the only
58
+ * stream-layer signal that a session has entered a long local wait (e.g. a
59
+ * tool that never returns), since no `stream_stall` is emitted for it. See
60
+ * APPS-4605.
61
+ */
62
+ onPause?: () => void;
38
63
  }
39
64
  export declare class IdleMonitor {
40
65
  private readonly session;
@@ -42,18 +67,23 @@ export declare class IdleMonitor {
42
67
  private readonly firstChunkTimeoutMs;
43
68
  private readonly onStallCallback?;
44
69
  private readonly onServerCompactionStart?;
70
+ private readonly shouldPause?;
71
+ private readonly onPauseCallback?;
45
72
  private timer;
46
73
  private stallError;
47
74
  private stallCallbacks;
48
75
  private subscribed;
49
76
  private hasReceivedChunk;
77
+ private pausedThisStretch;
50
78
  private readonly compactionTextBlockIds;
79
+ private armedBudget;
51
80
  constructor(options: IdleMonitorOptions);
81
+ private resolveBudget;
52
82
  /**
53
83
  * Active budget: the first-chunk budget until useful output arrives, then
54
- * the inter-chunk idle budget.
84
+ * the inter-chunk idle budget. Resolved against the current model each call.
55
85
  */
56
- private currentTimeoutMs;
86
+ private currentBudget;
57
87
  /**
58
88
  * Start the idle monitor. Arms the timer and subscribes to session events.
59
89
  */
@@ -1 +1 @@
1
- {"version":3,"file":"idle-monitor.d.ts","sourceRoot":"","sources":["../../../../src/ai-service/llm/stream/idle-monitor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,aAAa,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC7C,uBAAuB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACrD;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAqC;IACtE,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAA4B;IACrE,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,UAAU,CAAkC;IACpD,OAAO,CAAC,cAAc,CAAiD;IACvE,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAqB;gBAEhD,OAAO,EAAE,kBAAkB;IASvC;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;IACH,KAAK,IAAI,IAAI;IASb;;;;;;;OAOG;IACH,IAAI,IAAI,IAAI;IAOZ;;OAEG;IACH,aAAa,IAAI,iBAAiB,GAAG,IAAI;IAIzC;;OAEG;IACH,YAAY,IAAI,OAAO,CAAC,KAAK,CAAC;IAU9B,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,WAAW,CAOjB;IAEF,OAAO,CAAC,eAAe,CAMrB;IAEF,OAAO,CAAC,WAAW,CAOjB;IAEF,OAAO,CAAC,gBAAgB,CAEtB;IAEF,OAAO,CAAC,QAAQ;IAUhB,OAAO,CAAC,qBAAqB;IA2B7B,OAAO,CAAC,SAAS;CAmBlB"}
1
+ {"version":3,"file":"idle-monitor.d.ts","sourceRoot":"","sources":["../../../../src/ai-service/llm/stream/idle-monitor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAwB,MAAM,aAAa,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,aAAa,CAAC;IACvB,aAAa,EAAE,aAAa,CAAC;IAC7B;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,aAAa,CAAC;IACpC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC7C,uBAAuB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC;IAC5B;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAgB;IACpD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAqC;IACtE,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAA4B;IACrE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAgB;IAC7C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAa;IAC9C,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,UAAU,CAAkC;IACpD,OAAO,CAAC,cAAc,CAAiD;IACvE,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,gBAAgB,CAAS;IAGjC,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAqB;IAI5D,OAAO,CAAC,WAAW,CAGjB;gBAEU,OAAO,EAAE,kBAAkB;IAWvC,OAAO,CAAC,aAAa;IAIrB;;;OAGG;IACH,OAAO,CAAC,aAAa;IAYrB;;OAEG;IACH,KAAK,IAAI,IAAI;IAUb;;;;;;;OAOG;IACH,IAAI,IAAI,IAAI;IAOZ;;OAEG;IACH,aAAa,IAAI,iBAAiB,GAAG,IAAI;IAIzC;;OAEG;IACH,YAAY,IAAI,OAAO,CAAC,KAAK,CAAC;IAU9B,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,WAAW,CAQjB;IAEF,OAAO,CAAC,eAAe,CAOrB;IAEF,OAAO,CAAC,WAAW,CAQjB;IAEF,OAAO,CAAC,gBAAgB,CAEtB;IAEF,OAAO,CAAC,QAAQ;IAahB,OAAO,CAAC,qBAAqB;IA2B7B,OAAO,CAAC,SAAS;CAyElB"}
@@ -6,12 +6,24 @@ export class IdleMonitor {
6
6
  firstChunkTimeoutMs;
7
7
  onStallCallback;
8
8
  onServerCompactionStart;
9
+ shouldPause;
10
+ onPauseCallback;
9
11
  timer = null;
10
12
  stallError = null;
11
13
  stallCallbacks = [];
12
14
  subscribed = false;
13
15
  hasReceivedChunk = false;
16
+ // True once a local-wait suppression stretch has fired its onPause event;
17
+ // reset by real activity (chunk/step/retry) so each stretch logs exactly once.
18
+ pausedThisStretch = false;
14
19
  compactionTextBlockIds = new Set();
20
+ // The budget snapshot used when the live timer was armed. fireStall() reports
21
+ // this rather than re-resolving, so the logged budget always matches the timer
22
+ // that actually fired even if the model (and thus the resolver) changed since.
23
+ armedBudget = {
24
+ timeoutMs: 0,
25
+ budgetKind: "first-chunk",
26
+ };
15
27
  constructor(options) {
16
28
  this.session = options.session;
17
29
  this.maxIdleTimeMs = options.maxIdleTimeMs;
@@ -19,15 +31,26 @@ export class IdleMonitor {
19
31
  options.firstChunkTimeoutMs ?? options.maxIdleTimeMs;
20
32
  this.onStallCallback = options.onStall;
21
33
  this.onServerCompactionStart = options.onServerCompactionStart;
34
+ this.shouldPause = options.shouldPause;
35
+ this.onPauseCallback = options.onPause;
36
+ }
37
+ resolveBudget(budget) {
38
+ return typeof budget === "function" ? budget() : budget;
22
39
  }
23
40
  /**
24
41
  * Active budget: the first-chunk budget until useful output arrives, then
25
- * the inter-chunk idle budget.
42
+ * the inter-chunk idle budget. Resolved against the current model each call.
26
43
  */
27
- currentTimeoutMs() {
44
+ currentBudget() {
28
45
  return this.hasReceivedChunk
29
- ? this.maxIdleTimeMs
30
- : this.firstChunkTimeoutMs;
46
+ ? {
47
+ timeoutMs: this.resolveBudget(this.maxIdleTimeMs),
48
+ budgetKind: "inter-chunk",
49
+ }
50
+ : {
51
+ timeoutMs: this.resolveBudget(this.firstChunkTimeoutMs),
52
+ budgetKind: "first-chunk",
53
+ };
31
54
  }
32
55
  /**
33
56
  * Start the idle monitor. Arms the timer and subscribes to session events.
@@ -35,6 +58,7 @@ export class IdleMonitor {
35
58
  start() {
36
59
  this.stallError = null;
37
60
  this.hasReceivedChunk = false;
61
+ this.pausedThisStretch = false;
38
62
  this.compactionTextBlockIds.clear();
39
63
  this.session.resetActivityTimer();
40
64
  this.subscribeToEvents();
@@ -79,6 +103,10 @@ export class IdleMonitor {
79
103
  this.session.events.on("chunk", this.handleChunk);
80
104
  this.session.events.on("step:start", this.handleStepStart);
81
105
  this.session.events.on("retry", this.handleRetry);
106
+ // "retry" re-arms while session.provider is still the OLD model; "fallback"
107
+ // fires after the provider switch, so re-arming here picks up the new
108
+ // model's idle budget for the next attempt. See APPS-4775.
109
+ this.session.events.on("fallback", this.handleRetry);
82
110
  this.session.events.on("session:complete", this.handleSessionEnd);
83
111
  this.session.events.on("session:error", this.handleSessionEnd);
84
112
  this.session.events.on("session:abort", this.handleSessionEnd);
@@ -89,12 +117,14 @@ export class IdleMonitor {
89
117
  }
90
118
  this.stallError = null;
91
119
  this.stallCallbacks = [];
120
+ this.pausedThisStretch = false;
92
121
  this.armTimer();
93
122
  };
94
123
  handleStepStart = () => {
95
124
  this.hasReceivedChunk = false;
96
125
  this.compactionTextBlockIds.clear();
97
126
  this.stallError = null;
127
+ this.pausedThisStretch = false;
98
128
  this.session.resetActivityTimer();
99
129
  this.armTimer();
100
130
  };
@@ -103,6 +133,7 @@ export class IdleMonitor {
103
133
  this.compactionTextBlockIds.clear();
104
134
  this.stallError = null;
105
135
  this.stallCallbacks = [];
136
+ this.pausedThisStretch = false;
106
137
  this.session.resetActivityTimer();
107
138
  this.armTimer();
108
139
  };
@@ -113,9 +144,11 @@ export class IdleMonitor {
113
144
  if (this.timer !== null) {
114
145
  clearTimeout(this.timer);
115
146
  }
147
+ // Snapshot the budget once so the fired timer and the reported stall agree.
148
+ this.armedBudget = this.currentBudget();
116
149
  this.timer = setTimeout(() => {
117
150
  this.fireStall();
118
- }, this.currentTimeoutMs());
151
+ }, this.armedBudget.timeoutMs);
119
152
  }
120
153
  keepsFirstChunkBudget(chunk) {
121
154
  if (chunk.type === "raw" && this.compactionTextBlockIds.size > 0) {
@@ -142,8 +175,59 @@ export class IdleMonitor {
142
175
  if (!this.session.isPending()) {
143
176
  return;
144
177
  }
178
+ // The timer fired on a wall-clock budget, but the gap may be local work —
179
+ // a running tool, a step boundary, or the consumer holding the stream —
180
+ // rather than the provider going silent. Re-check at fire time (state can
181
+ // flip between arming and firing): if we're in a local wait, leave
182
+ // stallError null and any waitForStall() promise pending, and just re-arm
183
+ // so the managed stream stays blocked on the same upstream read instead of
184
+ // surfacing a useless provider retry. A genuine provider silence that
185
+ // follows the local wait still fires on a later tick. See APPS-4605.
186
+ //
187
+ // There is no cap on how long this can keep re-arming: a healthy slow tool
188
+ // is allowed to run for as long as it takes. A tool that hangs forever is
189
+ // bounded externally instead — the parent abortSignal (the dev server
190
+ // request's own timeout / the user navigating away) cascades to
191
+ // "session:abort", which stops the monitor and tears the stream down. The
192
+ // onPause event below makes the long wait observable while it is happening.
193
+ //
194
+ // Guard the callback like the others below: fireStall() runs from a
195
+ // setTimeout, so a throw here would escape as an unhandled exception, the
196
+ // timer would never re-arm, and stall detection would be dead for the rest
197
+ // of the session. On error, fall through and fire the stall — a real stall
198
+ // surfacing is safer than one being silently swallowed.
199
+ let shouldPause = false;
200
+ try {
201
+ shouldPause = this.shouldPause?.() ?? false;
202
+ }
203
+ catch {
204
+ // A shouldPause failure must not break stall monitoring.
205
+ }
206
+ if (shouldPause) {
207
+ // Emit one onPause event at the start of each suppression stretch so a
208
+ // long local wait (e.g. a tool that never returns) is observable, without
209
+ // logging on every re-arm. The flag clears on the next real chunk/step/
210
+ // retry, so a later stuck stretch emits again.
211
+ if (!this.pausedThisStretch) {
212
+ this.pausedThisStretch = true;
213
+ try {
214
+ this.onPauseCallback?.();
215
+ }
216
+ catch {
217
+ // A callback/logging failure must not break stall monitoring.
218
+ }
219
+ }
220
+ this.armTimer();
221
+ return;
222
+ }
145
223
  const idleTime = this.session.getTimeSinceLastActivity();
146
- this.stallError = new StallTimeoutError(idleTime, this.currentTimeoutMs());
224
+ this.stallError = new StallTimeoutError(idleTime, this.armedBudget.timeoutMs, this.armedBudget.budgetKind);
225
+ // Invariant: run onStallCallback before resolving stallCallbacks. Both are
226
+ // synchronous, so both observe session state as it was at the instant of
227
+ // the stall — before the rejected waitForStall() promise propagates (a
228
+ // microtask) into the managed stream's catch and mutates that state. The
229
+ // stall_reason classifier (orchestrator onStall) relies on this to read
230
+ // session.isAwaitingUpstream() while it still reflects the stalled await.
147
231
  try {
148
232
  this.onStallCallback?.(this.stallError);
149
233
  }
@@ -1 +1 @@
1
- {"version":3,"file":"idle-monitor.js","sourceRoot":"","sources":["../../../../src/ai-service/llm/stream/idle-monitor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"idle-monitor.js","sourceRoot":"","sources":["../../../../src/ai-service/llm/stream/idle-monitor.ts"],"names":[],"mappings":"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"}
@@ -43,7 +43,7 @@
43
43
  * ```
44
44
  */
45
45
  export { StreamConfig, defaultFirstChunkTimeoutMs } from "./config.js";
46
- export type { RetryConfigOptions, ProviderType, CoreModelType, FallbackStrategy, FallbackConfigOptions, } from "./config.js";
46
+ export type { RetryConfigOptions, RetryBudget, RetryBudgetResolver, ProviderType, CoreModelType, FallbackStrategy, FallbackConfigOptions, } from "./config.js";
47
47
  export type { StreamObserver } from "./observer.js";
48
48
  export { StreamOrchestrator } from "./orchestrator.js";
49
49
  export { LoggingObserver, LLMObsObserver, ContextObserver, RetryNotificationObserver, wrapToolsForObservability, } from "./observers/index.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/ai-service/llm/stream/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAEH,OAAO,EAAE,YAAY,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AACvE,YAAY,EACV,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,aAAa,CAAC;AAErB,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EACL,eAAe,EACf,cAAc,EACd,eAAe,EACf,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/ai-service/llm/stream/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAEH,OAAO,EAAE,YAAY,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AACvE,YAAY,EACV,kBAAkB,EAClB,WAAW,EACX,mBAAmB,EACnB,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,aAAa,CAAC;AAErB,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EACL,eAAe,EACf,cAAc,EACd,eAAe,EACf,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ai-service/llm/stream/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAEH,OAAO,EAAE,YAAY,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAWvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EACL,eAAe,EACf,cAAc,EACd,eAAe,EACf,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ai-service/llm/stream/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAEH,OAAO,EAAE,YAAY,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAavE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EACL,eAAe,EACf,cAAc,EACd,eAAe,EACf,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"managed-stream.d.ts","sourceRoot":"","sources":["../../../../src/ai-service/llm/stream/managed-stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC;AAE9D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAC;AAExD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,mBAAmB,CACjC,CAAC,SAAS,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,EAE9C,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC,EAC9B,OAAO,EAAE,aAAa,EACtB,WAAW,EAAE,WAAW,GACvB,mBAAmB,CAAC,CAAC,CAAC,CAuHxB"}
1
+ {"version":3,"file":"managed-stream.d.ts","sourceRoot":"","sources":["../../../../src/ai-service/llm/stream/managed-stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC;AAE9D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAC;AAExD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,mBAAmB,CACjC,CAAC,SAAS,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,EAE9C,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC,EAC9B,OAAO,EAAE,aAAa,EACtB,WAAW,EAAE,WAAW,GACvB,mBAAmB,CAAC,CAAC,CAAC,CAkIxB"}
@@ -50,7 +50,17 @@ export function createManagedStream(source, session, idleMonitor) {
50
50
  // chunk arrives. See APPS-3460.
51
51
  while (true) {
52
52
  try {
53
+ // Stamp each iteration so ms_since_last_pull stays fresh across
54
+ // keep-alive loops for stall-log triage.
55
+ session.recordPull();
56
+ // We are now blocked on upstream. If the idle monitor fires while
57
+ // this await is pending, the stall is "network-dark"; once a chunk
58
+ // arrives and we hand off to the consumer, a subsequent stall is
59
+ // "consumer-blocked" (the consumer is holding the stream without
60
+ // pulling). See orchestrator onStall + session.isAwaitingUpstream.
61
+ session.setAwaitingUpstream(true);
53
62
  const result = await raceWithStallDetection(iterator.next(), idleMonitor);
63
+ session.setAwaitingUpstream(false);
54
64
  if (result.done) {
55
65
  closed = true;
56
66
  session.finalize("complete");
@@ -106,6 +116,7 @@ export function createManagedStream(source, session, idleMonitor) {
106
116
  return;
107
117
  }
108
118
  catch (error) {
119
+ session.setAwaitingUpstream(false);
109
120
  closed = true;
110
121
  // no finalization, let wrapWithRetry handle it
111
122
  controller.error(error);
@@ -1 +1 @@
1
- {"version":3,"file":"managed-stream.js","sourceRoot":"","sources":["../../../../src/ai-service/llm/stream/managed-stream.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"managed-stream.js","sourceRoot":"","sources":["../../../../src/ai-service/llm/stream/managed-stream.ts"],"names":[],"mappings":"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"}
@@ -54,6 +54,8 @@ export declare class StreamOrchestrator {
54
54
  private readonly getJwt?;
55
55
  constructor(options: StreamOrchestratorOptions);
56
56
  execute<TOOLS extends Record<string, Tool>>(options: OrchestratorStreamTextOptions<TOOLS>): Promise<StreamTextResult<TOOLS>>;
57
+ private asAsyncIterableStream;
58
+ private textStreamFromFullStream;
57
59
  /**
58
60
  * Wraps a fullStream with retry logic. When an error occurs (either thrown or
59
61
  * as an error chunk), makes a retry decision and either creates a new stream
@@ -72,6 +74,14 @@ export declare class StreamOrchestrator {
72
74
  private startStreamWithRetry;
73
75
  private wrapFinalError;
74
76
  private startStream;
77
+ /**
78
+ * Wraps each tool's execute so only the live attempt can run it. The Vercel AI
79
+ * SDK auto-executes tools as their calls arrive on the provider stream, and a
80
+ * superseded attempt's stream can still deliver buffered tool calls after we
81
+ * abort it. Throwing AbortedError here ensures a terminal tool's real side
82
+ * effect (e.g. build_finalize) runs once, for the winning attempt only.
83
+ */
84
+ private guardToolsForAttempt;
75
85
  private applyProvider;
76
86
  /**
77
87
  * Replaces the thinking-related fields on `providerOptions.anthropic` and
@@ -82,6 +92,15 @@ export declare class StreamOrchestrator {
82
92
  */
83
93
  private rebuildThinkingOptions;
84
94
  private getFallbackReason;
95
+ /**
96
+ * Switch the session to a fallback provider, emit the structured switch log,
97
+ * and fire the "fallback" event. `fastFallback` distinguishes the stall
98
+ * fast-fallback path (a stall left the provider early) from a normal
99
+ * provider-exhaustion fallback, surfaced as a queryable Datadog facet so the
100
+ * fast-fallback behavior is verifiable in production. Error context for the
101
+ * triggering error is carried by the retry log that follows this call.
102
+ */
103
+ private switchProvider;
85
104
  private delay;
86
105
  }
87
106
  //# sourceMappingURL=orchestrator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../../src/ai-service/llm/stream/orchestrator.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,MAAM,EACZ,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAC;AAGxD,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAKpD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;CACnC;AAED,MAAM,MAAM,6BAA6B,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAC1E,iBAAiB,CAAC,KAAK,CAAC,GAAG;IACzB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B,CAAC;AAEJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAA2B;gBAEvC,OAAO,EAAE,yBAAyB;IAUxC,OAAO,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,EAC9C,OAAO,EAAE,6BAA6B,CAAC,KAAK,CAAC,GAC5C,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;IA6InC;;;;;;;;OAQG;IACH,OAAO,CAAC,aAAa;IAmErB;;;OAGG;YACW,mBAAmB;YA6EnB,oBAAoB;IA0ElC,OAAO,CAAC,cAAc;YA6BR,WAAW;IAyDzB,OAAO,CAAC,aAAa;IA8CrB;;;;;;OAMG;IACH,OAAO,CAAC,sBAAsB;IAgE9B,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,KAAK;CAmBd"}
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../../src/ai-service/llm/stream/orchestrator.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,MAAM,EACZ,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAC;AAGxD,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAMpD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;CACnC;AAED,MAAM,MAAM,6BAA6B,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAC1E,iBAAiB,CAAC,KAAK,CAAC,GAAG;IACzB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B,CAAC;AA+DJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAA2B;gBAEvC,OAAO,EAAE,yBAAyB;IAUxC,OAAO,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,EAC9C,OAAO,EAAE,6BAA6B,CAAC,KAAK,CAAC,GAC5C,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;IA2SnC,OAAO,CAAC,qBAAqB;IA4B7B,OAAO,CAAC,wBAAwB;IAiChC;;;;;;;;OAQG;IACH,OAAO,CAAC,aAAa;IAuErB;;;OAGG;YACW,mBAAmB;YA6EnB,oBAAoB;IAuElC,OAAO,CAAC,cAAc;YA6BR,WAAW;IAkFzB;;;;;;OAMG;IACH,OAAO,CAAC,oBAAoB;IA+B5B,OAAO,CAAC,aAAa;IA2DrB;;;;;;OAMG;IACH,OAAO,CAAC,sBAAsB;IAuE9B,OAAO,CAAC,iBAAiB;IAQzB;;;;;;;OAOG;YACW,cAAc;IAuC5B,OAAO,CAAC,KAAK;CAmBd"}