@agent-native/core 0.84.36 → 0.84.37

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 (48) hide show
  1. package/corpus/core/CHANGELOG.md +6 -0
  2. package/corpus/core/docs/content/getting-started.mdx +3 -3
  3. package/corpus/core/docs/content/locales/ar-SA/getting-started.mdx +2 -2
  4. package/corpus/core/docs/content/locales/de-DE/getting-started.mdx +2 -2
  5. package/corpus/core/docs/content/locales/es-ES/getting-started.mdx +2 -2
  6. package/corpus/core/docs/content/locales/fr-FR/getting-started.mdx +2 -2
  7. package/corpus/core/docs/content/locales/hi-IN/getting-started.mdx +2 -2
  8. package/corpus/core/docs/content/locales/ja-JP/getting-started.mdx +2 -2
  9. package/corpus/core/docs/content/locales/ko-KR/getting-started.mdx +2 -2
  10. package/corpus/core/docs/content/locales/pt-BR/getting-started.mdx +2 -2
  11. package/corpus/core/docs/content/locales/zh-CN/getting-started.mdx +2 -2
  12. package/corpus/core/docs/content/locales/zh-TW/getting-started.mdx +2 -2
  13. package/corpus/core/package.json +1 -1
  14. package/corpus/core/src/client/AssistantChat.tsx +27 -13
  15. package/corpus/core/src/client/RunStuckBanner.tsx +23 -3
  16. package/corpus/core/src/client/use-run-stuck-detection.ts +14 -1
  17. package/corpus/core/src/server/agent-chat-plugin.ts +5 -2
  18. package/dist/client/AssistantChat.d.ts +6 -0
  19. package/dist/client/AssistantChat.d.ts.map +1 -1
  20. package/dist/client/AssistantChat.js +19 -13
  21. package/dist/client/AssistantChat.js.map +1 -1
  22. package/dist/client/RunStuckBanner.d.ts.map +1 -1
  23. package/dist/client/RunStuckBanner.js +16 -1
  24. package/dist/client/RunStuckBanner.js.map +1 -1
  25. package/dist/client/use-run-stuck-detection.d.ts +4 -0
  26. package/dist/client/use-run-stuck-detection.d.ts.map +1 -1
  27. package/dist/client/use-run-stuck-detection.js +7 -1
  28. package/dist/client/use-run-stuck-detection.js.map +1 -1
  29. package/dist/collab/awareness.d.ts +2 -2
  30. package/dist/collab/awareness.d.ts.map +1 -1
  31. package/dist/collab/routes.d.ts +1 -1
  32. package/dist/notifications/routes.d.ts +3 -3
  33. package/dist/progress/routes.d.ts +1 -1
  34. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  35. package/dist/server/agent-chat-plugin.js +3 -2
  36. package/dist/server/agent-chat-plugin.js.map +1 -1
  37. package/docs/content/getting-started.mdx +3 -3
  38. package/docs/content/locales/ar-SA/getting-started.mdx +2 -2
  39. package/docs/content/locales/de-DE/getting-started.mdx +2 -2
  40. package/docs/content/locales/es-ES/getting-started.mdx +2 -2
  41. package/docs/content/locales/fr-FR/getting-started.mdx +2 -2
  42. package/docs/content/locales/hi-IN/getting-started.mdx +2 -2
  43. package/docs/content/locales/ja-JP/getting-started.mdx +2 -2
  44. package/docs/content/locales/ko-KR/getting-started.mdx +2 -2
  45. package/docs/content/locales/pt-BR/getting-started.mdx +2 -2
  46. package/docs/content/locales/zh-CN/getting-started.mdx +2 -2
  47. package/docs/content/locales/zh-TW/getting-started.mdx +2 -2
  48. package/package.json +1 -1
@@ -1,5 +1,11 @@
1
1
  # @agent-native/core
2
2
 
3
+ ## 0.84.37
4
+
5
+ ### Patch Changes
6
+
7
+ - 885a0bd: Hide docs formatter guards from rendered content, refine assistant recovery status labels, and keep live background workers from being auto-retried as stuck.
8
+
3
9
  ## 0.84.36
4
10
 
5
11
  ### Patch Changes
@@ -59,7 +59,7 @@ An action is one typed operation your agent and UI can both call. Replace the
59
59
  starter `hello` action with the first real operation in your domain. This example
60
60
  analyzes form responses and returns a validated shape for a custom chat chart:
61
61
 
62
- {/* prettier-ignore */}
62
+ <!-- prettier-ignore -->
63
63
  ```ts
64
64
  // actions/analyze-responses.ts
65
65
  import { defineAction } from "@agent-native/core/action";
@@ -108,7 +108,7 @@ The action above declares `outputSchema` and a product-specific
108
108
  into prose. Register a React component for that exact renderer id, for example
109
109
  by importing `app/chat-renderers.tsx` once from `app/root.tsx`:
110
110
 
111
- {/* prettier-ignore */}
111
+ <!-- prettier-ignore -->
112
112
  ```tsx
113
113
  import { registerActionChatRenderer, type ToolRendererProps,} from "@agent-native/core/client/chat";
114
114
 
@@ -209,7 +209,7 @@ separate REST route just for the browser if an action is the operation.
209
209
 
210
210
  Now add a durable page for the data behind the chat result:
211
211
 
212
- {/* prettier-ignore */}
212
+ <!-- prettier-ignore -->
213
213
  ```tsx
214
214
  // app/routes/response-insights.tsx
215
215
  import { useActionMutation, useActionQuery } from "@agent-native/core/client";
@@ -32,7 +32,7 @@ pnpm dev
32
32
 
33
33
  Action هي عملية typed operation مشتركة بين agent و UI. في هذا المسار أنشئ `actions/analyze-responses.ts`: تحلل ردود النماذج وتعيد شكلاً موثقًا لرسم مخصص داخل الدردشة.
34
34
 
35
- {/* prettier-ignore */}
35
+ <!-- prettier-ignore -->
36
36
  ```ts
37
37
  // actions/analyze-responses.ts
38
38
  import { defineAction } from "@agent-native/core/action";
@@ -75,7 +75,7 @@ pnpm action analyze-responses --formId demo
75
75
 
76
76
  لأن action تعلن `outputSchema` و `chatUI.renderer` خاصًا بالمنتج، لا يحول transcript البيانات المنظمة إلى نص عادي. سجّل مكون React لذلك المعرّف نفسه عند بدء التطبيق، مثل استيراد `app/chat-renderers.tsx` مرة واحدة من `app/root.tsx`:
77
77
 
78
- {/* prettier-ignore */}
78
+ <!-- prettier-ignore -->
79
79
  ```tsx
80
80
  import { registerActionChatRenderer, type ToolRendererProps,} from "@agent-native/core/client/chat";
81
81
 
@@ -32,7 +32,7 @@ Das Template enthält durable chat threads, auth, live sync, ein `actions/`-Verz
32
32
 
33
33
  Eine action ist eine typisierte Operation, die Agent und UI gemeinsam aufrufen. Für diesen Ablauf erstellen Sie `actions/analyze-responses.ts`: Sie analysiert Formularantworten und gibt eine validierte Form für ein eigenes Chat-Diagramm zurück.
34
34
 
35
- {/* prettier-ignore */}
35
+ <!-- prettier-ignore -->
36
36
  ```ts
37
37
  // actions/analyze-responses.ts
38
38
  import { defineAction } from "@agent-native/core/action";
@@ -75,7 +75,7 @@ Oder im Browser den Agent fragen:
75
75
 
76
76
  Weil die action `outputSchema` und eine produktspezifische `chatUI.renderer` deklariert, muss der Transcript strukturierte Daten nicht in Fließtext verwandeln. Registrieren Sie beim App-Start eine React-Komponente für genau diese Renderer-ID, zum Beispiel indem `app/chat-renderers.tsx` einmal aus `app/root.tsx` importiert wird:
77
77
 
78
- {/* prettier-ignore */}
78
+ <!-- prettier-ignore -->
79
79
  ```tsx
80
80
  import { registerActionChatRenderer, type ToolRendererProps,} from "@agent-native/core/client/chat";
81
81
 
@@ -32,7 +32,7 @@ El template incluye durable chat threads, auth, live sync, un directorio `action
32
32
 
33
33
  Una action es una operación tipada que comparten el agent y la UI. Para este flujo, crea `actions/analyze-responses.ts`: analiza respuestas de formularios y devuelve una forma validada para un gráfico de chat propio.
34
34
 
35
- {/* prettier-ignore */}
35
+ <!-- prettier-ignore -->
36
36
  ```ts
37
37
  // actions/analyze-responses.ts
38
38
  import { defineAction } from "@agent-native/core/action";
@@ -75,7 +75,7 @@ O pídeselo al agent en el navegador:
75
75
 
76
76
  Como la action declara `outputSchema` y una `chatUI.renderer` específica del producto, el transcript no convierte los datos en texto plano. Registra un componente React para ese id exacto desde el arranque de la app, por ejemplo importando `app/chat-renderers.tsx` una vez desde `app/root.tsx`:
77
77
 
78
- {/* prettier-ignore */}
78
+ <!-- prettier-ignore -->
79
79
  ```tsx
80
80
  import { registerActionChatRenderer, type ToolRendererProps,} from "@agent-native/core/client/chat";
81
81
 
@@ -32,7 +32,7 @@ Le template inclut durable chat threads, auth, live sync, un dossier `actions/`,
32
32
 
33
33
  Une action est une opération typée appelée par l'agent et par l'UI. Pour ce guide, créez `actions/analyze-responses.ts` : elle analyse des réponses de formulaire et renvoie une forme validée pour un graphique de chat personnalisé.
34
34
 
35
- {/* prettier-ignore */}
35
+ <!-- prettier-ignore -->
36
36
  ```ts
37
37
  // actions/analyze-responses.ts
38
38
  import { defineAction } from "@agent-native/core/action";
@@ -75,7 +75,7 @@ Ou demandez à l'agent dans le navigateur :
75
75
 
76
76
  Comme l'action déclare `outputSchema` et un `chatUI.renderer` propre au produit, le transcript ne transforme pas les données structurées en simple texte. Enregistrez un composant React pour cet id exact au démarrage de l'app, par exemple en important `app/chat-renderers.tsx` une fois depuis `app/root.tsx` :
77
77
 
78
- {/* prettier-ignore */}
78
+ <!-- prettier-ignore -->
79
79
  ```tsx
80
80
  import { registerActionChatRenderer, type ToolRendererProps,} from "@agent-native/core/client/chat";
81
81
 
@@ -32,7 +32,7 @@ pnpm dev
32
32
 
33
33
  Action वह typed operation है जिसे agent और UI दोनों call करते हैं. इस flow के लिए `actions/analyze-responses.ts` बनाएं: यह form responses analyze करता है और custom chat chart के लिए validated shape लौटाता है.
34
34
 
35
- {/* prettier-ignore */}
35
+ <!-- prettier-ignore -->
36
36
  ```ts
37
37
  // actions/analyze-responses.ts
38
38
  import { defineAction } from "@agent-native/core/action";
@@ -75,7 +75,7 @@ pnpm action analyze-responses --formId demo
75
75
 
76
76
  क्योंकि action `outputSchema` और product-specific `chatUI.renderer` declare करता है, transcript structured data को plain text में नहीं बदलता. फिर app startup से उसी exact renderer id के लिए React component register करें, जैसे `app/root.tsx` से `app/chat-renderers.tsx` को एक बार import करके:
77
77
 
78
- {/* prettier-ignore */}
78
+ <!-- prettier-ignore -->
79
79
  ```tsx
80
80
  import { registerActionChatRenderer, type ToolRendererProps,} from "@agent-native/core/client/chat";
81
81
 
@@ -32,7 +32,7 @@ pnpm dev
32
32
 
33
33
  action は agent と UI が共有する typed operation です。この流れでは `actions/analyze-responses.ts` を作成し、フォーム回答を分析してカスタムチャットグラフ用の検証済み形状を返します。
34
34
 
35
- {/* prettier-ignore */}
35
+ <!-- prettier-ignore -->
36
36
  ```ts
37
37
  // actions/analyze-responses.ts
38
38
  import { defineAction } from "@agent-native/core/action";
@@ -75,7 +75,7 @@ pnpm action analyze-responses --formId demo
75
75
 
76
76
  action が `outputSchema` とプロダクト固有の `chatUI.renderer` を宣言しているため、チャットは構造化データを長い文章に潰しません。次に、app の起動時にその正確な renderer id に対応する React コンポーネントを登録します。たとえば `app/root.tsx` から `app/chat-renderers.tsx` を一度 import します。
77
77
 
78
- {/* prettier-ignore */}
78
+ <!-- prettier-ignore -->
79
79
  ```tsx
80
80
  import { registerActionChatRenderer, type ToolRendererProps,} from "@agent-native/core/client/chat";
81
81
 
@@ -32,7 +32,7 @@ pnpm dev
32
32
 
33
33
  action은 agent와 UI가 함께 호출하는 typed operation입니다. 이 흐름에서는 `actions/analyze-responses.ts`를 만들고, 폼 응답을 분석해 custom chat chart를 위한 검증된 형태를 반환합니다.
34
34
 
35
- {/* prettier-ignore */}
35
+ <!-- prettier-ignore -->
36
36
  ```ts
37
37
  // actions/analyze-responses.ts
38
38
  import { defineAction } from "@agent-native/core/action";
@@ -75,7 +75,7 @@ pnpm action analyze-responses --formId demo
75
75
 
76
76
  action이 `outputSchema`와 제품별 `chatUI.renderer`를 선언하므로 transcript가 구조화된 데이터를 긴 텍스트로 바꾸지 않습니다. 그런 다음 app startup에서 정확히 같은 renderer id에 대한 React component를 등록합니다. 예를 들어 `app/root.tsx`에서 `app/chat-renderers.tsx`를 한 번 import합니다.
77
77
 
78
- {/* prettier-ignore */}
78
+ <!-- prettier-ignore -->
79
79
  ```tsx
80
80
  import { registerActionChatRenderer, type ToolRendererProps,} from "@agent-native/core/client/chat";
81
81
 
@@ -32,7 +32,7 @@ O template inclui durable chat threads, auth, live sync, diretório `actions/`,
32
32
 
33
33
  Uma action é uma operação tipada que o agent e a UI chamam juntos. Para este fluxo, crie `actions/analyze-responses.ts`: ela analisa respostas de formulários e retorna um formato validado para um gráfico de chat customizado.
34
34
 
35
- {/* prettier-ignore */}
35
+ <!-- prettier-ignore -->
36
36
  ```ts
37
37
  // actions/analyze-responses.ts
38
38
  import { defineAction } from "@agent-native/core/action";
@@ -75,7 +75,7 @@ Ou peça ao agent no navegador:
75
75
 
76
76
  Como a action declara `outputSchema` e uma `chatUI.renderer` específica do produto, o transcript não transforma dados estruturados em texto corrido. Registre um componente React para esse id exato no startup da app, por exemplo importando `app/chat-renderers.tsx` uma vez a partir de `app/root.tsx`:
77
77
 
78
- {/* prettier-ignore */}
78
+ <!-- prettier-ignore -->
79
79
  ```tsx
80
80
  import { registerActionChatRenderer, type ToolRendererProps,} from "@agent-native/core/client/chat";
81
81
 
@@ -42,7 +42,7 @@ npx @agent-native/core@latest create my-app
42
42
  Action 是 agent 和 UI 共同调用的一次 typed operation。可以把入门示例换成
43
43
  `actions/analyze-responses.ts`:它分析表单反馈,并返回自定义聊天图表的已验证数据形状。
44
44
 
45
- {/* prettier-ignore */}
45
+ <!-- prettier-ignore -->
46
46
  ```ts
47
47
  // actions/analyze-responses.ts
48
48
  import { defineAction } from "@agent-native/core/action";
@@ -85,7 +85,7 @@ pnpm action analyze-responses --formId demo
85
85
 
86
86
  因为 action 声明了 `outputSchema` 和产品专属的 `chatUI.renderer`,聊天记录不需要把结构化数据压成一段文字。然后在 app 启动时为这个完全相同的 renderer id 注册 React 组件,例如从 `app/root.tsx` 导入一次 `app/chat-renderers.tsx`:
87
87
 
88
- {/* prettier-ignore */}
88
+ <!-- prettier-ignore -->
89
89
  ```tsx
90
90
  import { registerActionChatRenderer, type ToolRendererProps,} from "@agent-native/core/client/chat";
91
91
 
@@ -40,7 +40,7 @@ npx @agent-native/core@latest create my-app
40
40
 
41
41
  Action 是 agent 與 UI 共同呼叫的一個 typed operation。可將入門範例換成 `actions/analyze-responses.ts`:它分析表單回覆並返回自訂聊天圖表的已驗證資料形狀。
42
42
 
43
- {/* prettier-ignore */}
43
+ <!-- prettier-ignore -->
44
44
  ```ts
45
45
  // actions/analyze-responses.ts
46
46
  import { defineAction } from "@agent-native/core/action";
@@ -83,7 +83,7 @@ pnpm action analyze-responses --formId demo
83
83
 
84
84
  因為 action 宣告了 `outputSchema` 與產品專屬的 `chatUI.renderer`,聊天紀錄不必把結構化資料壓成文字。然後在 app 啟動時為這個完全相同的 renderer id 註冊 React 元件,例如從 `app/root.tsx` 匯入一次 `app/chat-renderers.tsx`:
85
85
 
86
- {/* prettier-ignore */}
86
+ <!-- prettier-ignore -->
87
87
  ```tsx
88
88
  import { registerActionChatRenderer, type ToolRendererProps,} from "@agent-native/core/client/chat";
89
89
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core",
3
- "version": "0.84.36",
3
+ "version": "0.84.37",
4
4
  "description": "Framework for agent-native application development — where AI agents and UI share SQL state, actions, and context",
5
5
  "homepage": "https://github.com/BuilderIO/agent-native#readme",
6
6
  "bugs": {
@@ -662,6 +662,23 @@ export function resolveAssistantChatRunningState({
662
662
  };
663
663
  }
664
664
 
665
+ export function resolveAssistantChatRunningStatusLabel({
666
+ runningActivityLabel,
667
+ isAutoResuming,
668
+ isReconnecting,
669
+ hasReconnectContent,
670
+ }: {
671
+ runningActivityLabel: string | null | undefined;
672
+ isAutoResuming: boolean;
673
+ isReconnecting: boolean;
674
+ hasReconnectContent: boolean;
675
+ }): string {
676
+ if (runningActivityLabel) return runningActivityLabel;
677
+ if (isAutoResuming) return "Resuming";
678
+ if (isReconnecting && hasReconnectContent) return "Continuing";
679
+ return "Thinking";
680
+ }
681
+
665
682
  type QueuedMessage = {
666
683
  id: string;
667
684
  text: string;
@@ -1497,18 +1514,15 @@ const AssistantChatInner = forwardRef<
1497
1514
  hasActiveServerRun,
1498
1515
  });
1499
1516
  const textStreaming = showRunningInUI || externalStreaming;
1500
- // A revealed activity label wins; otherwise stay a steady "Thinking" by
1501
- // default. We only surface "Reconnecting" while we are actively replaying
1502
- // recovered content (reconnectContent populated). A bare reconnect with no
1503
- // replayed content is normal ongoing work, so it must read as "Thinking",
1504
- // never a perpetual "Working".
1505
- const runningStatusLabel = runningActivityLabel
1506
- ? runningActivityLabel
1507
- : isAutoResuming
1508
- ? "Resuming"
1509
- : isReconnecting && reconnectContent.length > 0
1510
- ? "Reconnecting"
1511
- : "Thinking";
1517
+ // A revealed activity label wins; otherwise keep recovery states calm and
1518
+ // product-facing. Reconnect is transport machinery, so normal replay reads as
1519
+ // "Continuing" instead of exposing "Reconnecting" mid-chat.
1520
+ const runningStatusLabel = resolveAssistantChatRunningStatusLabel({
1521
+ runningActivityLabel,
1522
+ isAutoResuming,
1523
+ isReconnecting,
1524
+ hasReconnectContent: reconnectContent.length > 0,
1525
+ });
1512
1526
  const reconnectActivityContent = useMemo(
1513
1527
  () =>
1514
1528
  (isReconnecting || reconnectFrozen) && reconnectContent.length === 0
@@ -1952,7 +1966,7 @@ const AssistantChatInner = forwardRef<
1952
1966
  }
1953
1967
  setRunErrorInfo({
1954
1968
  message:
1955
- "The previous agent run stopped producing visible progress while reconnecting, so it was stopped before it could keep looping.",
1969
+ "The previous agent run stopped producing visible progress during recovery, so it was stopped before it could keep looping.",
1956
1970
  errorCode: "reconnect_no_progress",
1957
1971
  recoverable: true,
1958
1972
  runId,
@@ -55,6 +55,7 @@ export interface RunStuckBannerProps {
55
55
  }
56
56
 
57
57
  const AUTO_RETRY_CLAIM_TTL_MS = 5 * 60 * 1000;
58
+ const BACKGROUND_WORKER_FRESH_HEARTBEAT_MS = 30_000;
58
59
 
59
60
  type BusyState = { type: "none" } | { type: "cancel" | "retry"; runId: string };
60
61
 
@@ -78,6 +79,16 @@ function autoRetryClaimKey(threadId: string, runId: string) {
78
79
  return `agent-native:stuck-auto-retry:${threadId}:${runId}`;
79
80
  }
80
81
 
82
+ function isFreshBackgroundWorker(state: RunStuckState): boolean {
83
+ return Boolean(
84
+ state.status === "running" &&
85
+ state.dispatchMode === "background-processing" &&
86
+ state.heartbeatSinceMs != null &&
87
+ state.heartbeatSinceMs >= 0 &&
88
+ state.heartbeatSinceMs < BACKGROUND_WORKER_FRESH_HEARTBEAT_MS,
89
+ );
90
+ }
91
+
81
92
  function markAutoRetryClaim(key: string, ownerId: string) {
82
93
  if (typeof window === "undefined") return true;
83
94
  const now = Date.now();
@@ -151,6 +162,7 @@ export function RunStuckBanner({
151
162
  generatedOwnerIdRef.current = createAutoRetryOwnerId();
152
163
  }
153
164
  const ownerId = autoRetryOwnerId ?? generatedOwnerIdRef.current;
165
+ const backgroundWorkerStillAlive = isFreshBackgroundWorker(state);
154
166
 
155
167
  const lastReportedRef = useRef<{
156
168
  isStuck: boolean;
@@ -190,6 +202,7 @@ export function RunStuckBanner({
190
202
  useEffect(() => {
191
203
  if (
192
204
  !autoRetry ||
205
+ backgroundWorkerStillAlive ||
193
206
  !state.isStuck ||
194
207
  !state.runId ||
195
208
  busy.type !== "none" ||
@@ -223,6 +236,7 @@ export function RunStuckBanner({
223
236
  }, [
224
237
  abortRun,
225
238
  autoRetry,
239
+ backgroundWorkerStillAlive,
226
240
  busy,
227
241
  onRetry,
228
242
  ownerId,
@@ -280,11 +294,17 @@ export function RunStuckBanner({
280
294
  />
281
295
  <div className="flex min-w-0 flex-1 flex-col gap-1.5">
282
296
  <div className="leading-snug">
283
- <span className="font-medium">This chat looks stuck.</span>{" "}
297
+ <span className="font-medium">
298
+ {backgroundWorkerStillAlive
299
+ ? "The agent is still working."
300
+ : "This chat looks stuck."}
301
+ </span>{" "}
284
302
  <span className="text-muted-foreground">
285
303
  No progress
286
- {stuckSeconds != null ? ` for ${stuckSeconds}s` : ""}. The agent may
287
- have hit a server timeout or lost its connection.
304
+ {stuckSeconds != null ? ` for ${stuckSeconds}s` : ""}.{" "}
305
+ {backgroundWorkerStillAlive
306
+ ? "The background worker is still alive; large updates can take a few minutes."
307
+ : "The agent may have hit a server timeout or lost its connection."}
288
308
  {autoRetry && busyType === "retry"
289
309
  ? " Retrying automatically now."
290
310
  : ""}
@@ -24,6 +24,10 @@ export interface RunStuckState {
24
24
  stuckSinceMs: number | null;
25
25
  /** Server timestamp (ms) of the last process-alive heartbeat. */
26
26
  heartbeatAt: number | null;
27
+ /** Milliseconds since `heartbeatAt`, computed against the server clock. */
28
+ heartbeatSinceMs: number | null;
29
+ /** How the run was dispatched, e.g. foreground or background-processing. */
30
+ dispatchMode: string | null;
27
31
  }
28
32
 
29
33
  export interface UseRunStuckDetectionOptions {
@@ -51,6 +55,7 @@ interface ActiveRunResponse {
51
55
  status?: string;
52
56
  heartbeatAt: number | null;
53
57
  lastProgressAt?: number | null;
58
+ dispatchMode?: string | null;
54
59
  /** Server clock at response time, used to compute elapsed server-relative. */
55
60
  serverNow?: number;
56
61
  }
@@ -62,6 +67,8 @@ const EMPTY_STATE: RunStuckState = {
62
67
  lastProgressAt: null,
63
68
  stuckSinceMs: null,
64
69
  heartbeatAt: null,
70
+ heartbeatSinceMs: null,
71
+ dispatchMode: null,
65
72
  };
66
73
 
67
74
  export function useRunStuckDetection({
@@ -102,6 +109,9 @@ export function useRunStuckDetection({
102
109
  const nowMs = data.serverNow ?? Date.now();
103
110
  const stuckSinceMs =
104
111
  lastProgressAt != null ? nowMs - lastProgressAt : null;
112
+ const heartbeatAt = data.heartbeatAt ?? null;
113
+ const heartbeatSinceMs =
114
+ heartbeatAt != null ? nowMs - heartbeatAt : null;
105
115
  const isStuck = Boolean(
106
116
  data.active &&
107
117
  data.status === "running" &&
@@ -114,7 +124,10 @@ export function useRunStuckDetection({
114
124
  status: data.status ?? null,
115
125
  lastProgressAt,
116
126
  stuckSinceMs,
117
- heartbeatAt: data.heartbeatAt ?? null,
127
+ heartbeatAt,
128
+ heartbeatSinceMs,
129
+ dispatchMode:
130
+ typeof data.dispatchMode === "string" ? data.dispatchMode : null,
118
131
  });
119
132
  // Back off polling when nothing is in flight — there's no point
120
133
  // hammering the endpoint while the chat is idle. We still poll
@@ -7278,8 +7278,11 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
7278
7278
  let reason = "user";
7279
7279
  try {
7280
7280
  const body = await readBody(event);
7281
- if (body?.reason === "no_progress") {
7282
- reason = "no_progress";
7281
+ if (
7282
+ typeof body?.reason === "string" &&
7283
+ /^[a-z0-9_-]{1,64}$/i.test(body.reason)
7284
+ ) {
7285
+ reason = body.reason;
7283
7286
  }
7284
7287
  } catch {
7285
7288
  // Empty/invalid body — keep the default user abort reason.
@@ -49,6 +49,12 @@ export declare function resolveAssistantChatRunningState({ forceStopped, isRunti
49
49
  isRunning: boolean;
50
50
  showRunningInUI: boolean;
51
51
  };
52
+ export declare function resolveAssistantChatRunningStatusLabel({ runningActivityLabel, isAutoResuming, isReconnecting, hasReconnectContent, }: {
53
+ runningActivityLabel: string | null | undefined;
54
+ isAutoResuming: boolean;
55
+ isReconnecting: boolean;
56
+ hasReconnectContent: boolean;
57
+ }): string;
52
58
  export interface AssistantChatHandle {
53
59
  /** Programmatically send a message into this chat */
54
60
  sendMessage(text: string, images?: string[], options?: AssistantChatSendOptions): void;
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantChat.d.ts","sourceRoot":"","sources":["../../src/client/AssistantChat.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AssistantChat.d.ts","sourceRoot":"","sources":["../../src/client/AssistantChat.tsx"],"names":[],"mappings":"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"}
@@ -323,6 +323,15 @@ export function resolveAssistantChatRunningState({ forceStopped, isRuntimeRunnin
323
323
  showRunningInUI: !forceStopped && (isRunning || isAutoResuming),
324
324
  };
325
325
  }
326
+ export function resolveAssistantChatRunningStatusLabel({ runningActivityLabel, isAutoResuming, isReconnecting, hasReconnectContent, }) {
327
+ if (runningActivityLabel)
328
+ return runningActivityLabel;
329
+ if (isAutoResuming)
330
+ return "Resuming";
331
+ if (isReconnecting && hasReconnectContent)
332
+ return "Continuing";
333
+ return "Thinking";
334
+ }
326
335
  export const CHAT_STORAGE_PREFIX = "agent-chat:";
327
336
  const THREAD_SNAPSHOT_CACHE_PREFIX = `${CHAT_STORAGE_PREFIX}thread-snapshot:`;
328
337
  function threadSnapshotCacheKey(apiUrl, threadId) {
@@ -817,18 +826,15 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
817
826
  hasActiveServerRun,
818
827
  });
819
828
  const textStreaming = showRunningInUI || externalStreaming;
820
- // A revealed activity label wins; otherwise stay a steady "Thinking" by
821
- // default. We only surface "Reconnecting" while we are actively replaying
822
- // recovered content (reconnectContent populated). A bare reconnect with no
823
- // replayed content is normal ongoing work, so it must read as "Thinking",
824
- // never a perpetual "Working".
825
- const runningStatusLabel = runningActivityLabel
826
- ? runningActivityLabel
827
- : isAutoResuming
828
- ? "Resuming"
829
- : isReconnecting && reconnectContent.length > 0
830
- ? "Reconnecting"
831
- : "Thinking";
829
+ // A revealed activity label wins; otherwise keep recovery states calm and
830
+ // product-facing. Reconnect is transport machinery, so normal replay reads as
831
+ // "Continuing" instead of exposing "Reconnecting" mid-chat.
832
+ const runningStatusLabel = resolveAssistantChatRunningStatusLabel({
833
+ runningActivityLabel,
834
+ isAutoResuming,
835
+ isReconnecting,
836
+ hasReconnectContent: reconnectContent.length > 0,
837
+ });
832
838
  const reconnectActivityContent = useMemo(() => (isReconnecting || reconnectFrozen) && reconnectContent.length === 0
833
839
  ? reconnectActivityFallbackContent(runningActivityTool)
834
840
  : [], [
@@ -1215,7 +1221,7 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
1215
1221
  reconnectCanMaterializeRef.current = latestContent.length > 0;
1216
1222
  }
1217
1223
  setRunErrorInfo({
1218
- message: "The previous agent run stopped producing visible progress while reconnecting, so it was stopped before it could keep looping.",
1224
+ message: "The previous agent run stopped producing visible progress during recovery, so it was stopped before it could keep looping.",
1219
1225
  errorCode: "reconnect_no_progress",
1220
1226
  recoverable: true,
1221
1227
  runId,