@getpaseo/server 0.1.75 → 0.1.76

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 (178) hide show
  1. package/dist/server/client/daemon-client.d.ts +13 -2
  2. package/dist/server/client/daemon-client.d.ts.map +1 -1
  3. package/dist/server/client/daemon-client.js +36 -0
  4. package/dist/server/client/daemon-client.js.map +1 -1
  5. package/dist/server/server/agent/agent-manager.d.ts +1 -0
  6. package/dist/server/server/agent/agent-manager.d.ts.map +1 -1
  7. package/dist/server/server/agent/agent-manager.js +13 -8
  8. package/dist/server/server/agent/agent-manager.js.map +1 -1
  9. package/dist/server/server/agent/agent-sdk-types.d.ts +3 -0
  10. package/dist/server/server/agent/agent-sdk-types.d.ts.map +1 -1
  11. package/dist/server/server/agent/agent-sdk-types.js +7 -0
  12. package/dist/server/server/agent/agent-sdk-types.js.map +1 -1
  13. package/dist/server/server/agent/mcp-server.d.ts.map +1 -1
  14. package/dist/server/server/agent/mcp-server.js +74 -3
  15. package/dist/server/server/agent/mcp-server.js.map +1 -1
  16. package/dist/server/server/agent/provider-history-timestamps.d.ts +2 -0
  17. package/dist/server/server/agent/provider-history-timestamps.d.ts.map +1 -0
  18. package/dist/server/server/agent/provider-history-timestamps.js +16 -0
  19. package/dist/server/server/agent/provider-history-timestamps.js.map +1 -0
  20. package/dist/server/server/agent/provider-manifest.d.ts +1 -1
  21. package/dist/server/server/agent/provider-manifest.d.ts.map +1 -1
  22. package/dist/server/server/agent/provider-manifest.js +14 -0
  23. package/dist/server/server/agent/provider-manifest.js.map +1 -1
  24. package/dist/server/server/agent/provider-registry.d.ts.map +1 -1
  25. package/dist/server/server/agent/provider-registry.js +53 -27
  26. package/dist/server/server/agent/provider-registry.js.map +1 -1
  27. package/dist/server/server/agent/provider-snapshot-manager.d.ts +2 -6
  28. package/dist/server/server/agent/provider-snapshot-manager.d.ts.map +1 -1
  29. package/dist/server/server/agent/provider-snapshot-manager.js +43 -32
  30. package/dist/server/server/agent/provider-snapshot-manager.js.map +1 -1
  31. package/dist/server/server/agent/providers/acp-agent.d.ts +3 -1
  32. package/dist/server/server/agent/providers/acp-agent.d.ts.map +1 -1
  33. package/dist/server/server/agent/providers/acp-agent.js +61 -14
  34. package/dist/server/server/agent/providers/acp-agent.js.map +1 -1
  35. package/dist/server/server/agent/providers/claude/agent.d.ts.map +1 -1
  36. package/dist/server/server/agent/providers/claude/agent.js +111 -38
  37. package/dist/server/server/agent/providers/claude/agent.js.map +1 -1
  38. package/dist/server/server/agent/providers/claude/models.d.ts +2 -0
  39. package/dist/server/server/agent/providers/claude/models.d.ts.map +1 -1
  40. package/dist/server/server/agent/providers/claude/models.js +78 -0
  41. package/dist/server/server/agent/providers/claude/models.js.map +1 -1
  42. package/dist/server/server/agent/providers/codex/app-server-transport.d.ts +1 -0
  43. package/dist/server/server/agent/providers/codex/app-server-transport.d.ts.map +1 -1
  44. package/dist/server/server/agent/providers/codex/app-server-transport.js +14 -10
  45. package/dist/server/server/agent/providers/codex/app-server-transport.js.map +1 -1
  46. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +15 -1
  47. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
  48. package/dist/server/server/agent/providers/codex-app-server-agent.js +369 -68
  49. package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
  50. package/dist/server/server/agent/providers/cursor-acp-agent.d.ts +21 -0
  51. package/dist/server/server/agent/providers/cursor-acp-agent.d.ts.map +1 -0
  52. package/dist/server/server/agent/providers/cursor-acp-agent.js +85 -0
  53. package/dist/server/server/agent/providers/cursor-acp-agent.js.map +1 -0
  54. package/dist/server/server/agent/providers/generic-acp-agent.d.ts +13 -0
  55. package/dist/server/server/agent/providers/generic-acp-agent.d.ts.map +1 -1
  56. package/dist/server/server/agent/providers/generic-acp-agent.js +209 -2
  57. package/dist/server/server/agent/providers/generic-acp-agent.js.map +1 -1
  58. package/dist/server/server/agent/providers/opencode-agent.d.ts +1 -3
  59. package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -1
  60. package/dist/server/server/agent/providers/opencode-agent.js +73 -75
  61. package/dist/server/server/agent/providers/opencode-agent.js.map +1 -1
  62. package/dist/server/server/agent/providers/pi-direct-agent.d.ts +1 -1
  63. package/dist/server/server/agent/providers/pi-direct-agent.d.ts.map +1 -1
  64. package/dist/server/server/agent/providers/pi-direct-agent.js +14 -0
  65. package/dist/server/server/agent/providers/pi-direct-agent.js.map +1 -1
  66. package/dist/server/server/agent/providers/pi-session-recovery-policy.d.ts +22 -0
  67. package/dist/server/server/agent/providers/pi-session-recovery-policy.d.ts.map +1 -0
  68. package/dist/server/server/agent/providers/pi-session-recovery-policy.js +51 -0
  69. package/dist/server/server/agent/providers/pi-session-recovery-policy.js.map +1 -0
  70. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts.map +1 -1
  71. package/dist/server/server/agent/timeline-projection.d.ts.map +1 -1
  72. package/dist/server/server/agent/timeline-projection.js +9 -0
  73. package/dist/server/server/agent/timeline-projection.js.map +1 -1
  74. package/dist/server/server/auto-archive-on-merge/archive-if-safe.d.ts +40 -0
  75. package/dist/server/server/auto-archive-on-merge/archive-if-safe.d.ts.map +1 -0
  76. package/dist/server/server/auto-archive-on-merge/archive-if-safe.js +80 -0
  77. package/dist/server/server/auto-archive-on-merge/archive-if-safe.js.map +1 -0
  78. package/dist/server/server/auto-archive-on-merge/index.d.ts +8 -0
  79. package/dist/server/server/auto-archive-on-merge/index.d.ts.map +1 -0
  80. package/dist/server/server/auto-archive-on-merge/index.js +15 -0
  81. package/dist/server/server/auto-archive-on-merge/index.js.map +1 -0
  82. package/dist/server/server/bootstrap.d.ts +1 -0
  83. package/dist/server/server/bootstrap.d.ts.map +1 -1
  84. package/dist/server/server/bootstrap.js +74 -38
  85. package/dist/server/server/bootstrap.js.map +1 -1
  86. package/dist/server/server/checkout/status-projection.d.ts.map +1 -1
  87. package/dist/server/server/checkout/status-projection.js +5 -1
  88. package/dist/server/server/checkout/status-projection.js.map +1 -1
  89. package/dist/server/server/config.d.ts.map +1 -1
  90. package/dist/server/server/config.js +3 -1
  91. package/dist/server/server/config.js.map +1 -1
  92. package/dist/server/server/daemon-config-store.js +1 -0
  93. package/dist/server/server/daemon-config-store.js.map +1 -1
  94. package/dist/server/server/loop/rpc-schemas.d.ts +96 -96
  95. package/dist/server/server/loop-service.d.ts +18 -18
  96. package/dist/server/server/paseo-worktree-service.d.ts +3 -1
  97. package/dist/server/server/paseo-worktree-service.d.ts.map +1 -1
  98. package/dist/server/server/paseo-worktree-service.js +55 -18
  99. package/dist/server/server/paseo-worktree-service.js.map +1 -1
  100. package/dist/server/server/persisted-config.d.ts +7 -0
  101. package/dist/server/server/persisted-config.d.ts.map +1 -1
  102. package/dist/server/server/persisted-config.js +1 -0
  103. package/dist/server/server/persisted-config.js.map +1 -1
  104. package/dist/server/server/relay-transport.d.ts +2 -1
  105. package/dist/server/server/relay-transport.d.ts.map +1 -1
  106. package/dist/server/server/relay-transport.js +26 -4
  107. package/dist/server/server/relay-transport.js.map +1 -1
  108. package/dist/server/server/session.d.ts +6 -0
  109. package/dist/server/server/session.d.ts.map +1 -1
  110. package/dist/server/server/session.js +193 -33
  111. package/dist/server/server/session.js.map +1 -1
  112. package/dist/server/server/websocket-server.d.ts.map +1 -1
  113. package/dist/server/server/websocket-server.js +5 -0
  114. package/dist/server/server/websocket-server.js.map +1 -1
  115. package/dist/server/server/workspace-git-service.d.ts +6 -1
  116. package/dist/server/server/workspace-git-service.d.ts.map +1 -1
  117. package/dist/server/server/workspace-git-service.js +27 -4
  118. package/dist/server/server/workspace-git-service.js.map +1 -1
  119. package/dist/server/server/workspace-reconciliation-service.d.ts +4 -2
  120. package/dist/server/server/workspace-reconciliation-service.d.ts.map +1 -1
  121. package/dist/server/server/workspace-reconciliation-service.js +112 -14
  122. package/dist/server/server/workspace-reconciliation-service.js.map +1 -1
  123. package/dist/server/server/workspace-registry.d.ts +6 -1
  124. package/dist/server/server/workspace-registry.d.ts.map +1 -1
  125. package/dist/server/server/workspace-registry.js +11 -0
  126. package/dist/server/server/workspace-registry.js.map +1 -1
  127. package/dist/server/server/worktree-session.d.ts.map +1 -1
  128. package/dist/server/server/worktree-session.js +1 -0
  129. package/dist/server/server/worktree-session.js.map +1 -1
  130. package/dist/server/services/github-service.d.ts +46 -0
  131. package/dist/server/services/github-service.d.ts.map +1 -1
  132. package/dist/server/services/github-service.js +274 -5
  133. package/dist/server/services/github-service.js.map +1 -1
  134. package/dist/server/shared/messages.d.ts +3427 -290
  135. package/dist/server/shared/messages.d.ts.map +1 -1
  136. package/dist/server/shared/messages.js +93 -3
  137. package/dist/server/shared/messages.js.map +1 -1
  138. package/dist/server/shared/terminal-input-mode.d.ts +26 -0
  139. package/dist/server/shared/terminal-input-mode.d.ts.map +1 -0
  140. package/dist/server/shared/terminal-input-mode.js +151 -0
  141. package/dist/server/shared/terminal-input-mode.js.map +1 -0
  142. package/dist/server/terminal/terminal-session-controller.d.ts.map +1 -1
  143. package/dist/server/terminal/terminal-session-controller.js +12 -2
  144. package/dist/server/terminal/terminal-session-controller.js.map +1 -1
  145. package/dist/server/terminal/terminal.d.ts +1 -0
  146. package/dist/server/terminal/terminal.d.ts.map +1 -1
  147. package/dist/server/terminal/terminal.js +16 -3
  148. package/dist/server/terminal/terminal.js.map +1 -1
  149. package/dist/server/terminal/worker-terminal-manager.d.ts.map +1 -1
  150. package/dist/server/terminal/worker-terminal-manager.js +8 -0
  151. package/dist/server/terminal/worker-terminal-manager.js.map +1 -1
  152. package/dist/server/utils/checkout-git.d.ts +4 -1
  153. package/dist/server/utils/checkout-git.d.ts.map +1 -1
  154. package/dist/server/utils/checkout-git.js +85 -29
  155. package/dist/server/utils/checkout-git.js.map +1 -1
  156. package/dist/server/utils/directory-suggestions.d.ts.map +1 -1
  157. package/dist/server/utils/directory-suggestions.js +51 -14
  158. package/dist/server/utils/directory-suggestions.js.map +1 -1
  159. package/dist/server/utils/executable.d.ts.map +1 -1
  160. package/dist/server/utils/executable.js +6 -3
  161. package/dist/server/utils/executable.js.map +1 -1
  162. package/dist/server/utils/run-git-command.d.ts +2 -0
  163. package/dist/server/utils/run-git-command.d.ts.map +1 -1
  164. package/dist/server/utils/run-git-command.js +41 -1
  165. package/dist/server/utils/run-git-command.js.map +1 -1
  166. package/dist/server/utils/worktree.js +1 -1
  167. package/dist/server/utils/worktree.js.map +1 -1
  168. package/dist/src/server/agent/agent-sdk-types.js +7 -0
  169. package/dist/src/server/agent/agent-sdk-types.js.map +1 -1
  170. package/dist/src/server/agent/provider-manifest.js +14 -0
  171. package/dist/src/server/agent/provider-manifest.js.map +1 -1
  172. package/dist/src/server/persisted-config.js +1 -0
  173. package/dist/src/server/persisted-config.js.map +1 -1
  174. package/dist/src/shared/messages.js +93 -3
  175. package/dist/src/shared/messages.js.map +1 -1
  176. package/dist/src/utils/executable.js +6 -3
  177. package/dist/src/utils/executable.js.map +1 -1
  178. package/package.json +3 -3
@@ -14,6 +14,7 @@ import { formatDiagnosticStatus, formatProviderDiagnostic, formatProviderDiagnos
14
14
  import { runProviderTurn } from "./provider-runner.js";
15
15
  import { renderPromptAttachmentAsText } from "../prompt-attachments.js";
16
16
  import { createSdkOpenCodeClient, } from "./opencode/runtime.js";
17
+ import { normalizeProviderReplayTimestamp } from "../provider-history-timestamps.js";
17
18
  const OPENCODE_CAPABILITIES = {
18
19
  supportsStreaming: true,
19
20
  supportsSessionPersistence: true,
@@ -26,7 +27,6 @@ const OPENCODE_BUILD_MODE_ID = "build";
26
27
  const OPENCODE_FULL_ACCESS_MODE_ID = "full-access";
27
28
  const OPENCODE_STORAGE_SESSION_LIMIT = 200;
28
29
  const OPENCODE_PENDING_ABORT_START_TIMEOUT_MS = 10000;
29
- const OPENCODE_RETRY_STATUS_FAILURE_MS = 10000;
30
30
  const DEFAULT_MODES = [
31
31
  {
32
32
  id: OPENCODE_BUILD_MODE_ID,
@@ -389,7 +389,9 @@ function buildOpenCodeModelContextWindowLookup(providers) {
389
389
  }
390
390
  const connectedProviderIds = new Set(providers.connected ?? []);
391
391
  for (const provider of providers.all ?? []) {
392
- if (!connectedProviderIds.has(provider.id)) {
392
+ // Providers with source "api" are managed by the OpenCode console/subscription and are
393
+ // usable even though they don't appear in `connected` (which only lists env/config providers).
394
+ if (!connectedProviderIds.has(provider.id) && provider.source !== "api") {
393
395
  continue;
394
396
  }
395
397
  for (const [modelId, modelDefinition] of Object.entries(provider.models ?? {})) {
@@ -637,6 +639,55 @@ function getOpenCodeMessageTimestamp(message) {
637
639
  function getOpenCodePartTimestamp(part) {
638
640
  return part.time?.start ?? part.time?.end ?? 0;
639
641
  }
642
+ function resolveOpenCodeReplayTimestamp(params) {
643
+ const timedPart = params.part;
644
+ const partTimestamp = timedPart?.time?.start ??
645
+ timedPart?.time?.end ??
646
+ params.message.time?.created ??
647
+ params.message.time?.completed;
648
+ return normalizeProviderReplayTimestamp(partTimestamp);
649
+ }
650
+ function buildOpenCodeReplayTimelineEvent(params) {
651
+ const timestamp = resolveOpenCodeReplayTimestamp({
652
+ message: params.message,
653
+ part: params.part,
654
+ });
655
+ return {
656
+ type: "timeline",
657
+ provider: "opencode",
658
+ item: params.item,
659
+ ...(timestamp ? { timestamp } : {}),
660
+ };
661
+ }
662
+ function buildOpenCodeReplayPartTimelineEvent(params) {
663
+ const { part, message } = params;
664
+ if (part.type === "text" && part.text) {
665
+ return buildOpenCodeReplayTimelineEvent({
666
+ item: { type: "assistant_message", text: part.text },
667
+ message,
668
+ part,
669
+ });
670
+ }
671
+ if (part.type === "reasoning" && part.text) {
672
+ return buildOpenCodeReplayTimelineEvent({
673
+ item: { type: "reasoning", text: part.text },
674
+ message,
675
+ part,
676
+ });
677
+ }
678
+ if (part.type !== "tool") {
679
+ return null;
680
+ }
681
+ const parsedToolPart = OpencodeToolPartToTimelineItemSchema.safeParse(part);
682
+ if (!parsedToolPart.success || !parsedToolPart.data) {
683
+ return null;
684
+ }
685
+ return buildOpenCodeReplayTimelineEvent({
686
+ item: parsedToolPart.data,
687
+ message,
688
+ part,
689
+ });
690
+ }
640
691
  export const __openCodeInternals = {
641
692
  buildOpenCodePromptParts,
642
693
  buildOpenCodeModelContextWindowLookup,
@@ -752,17 +803,21 @@ export class OpenCodeAgentClient {
752
803
  if (!providers) {
753
804
  return [];
754
805
  }
755
- // Only include models from connected providers (ones that are actually available)
756
806
  const connectedProviderIds = new Set(providers.connected);
757
- // Fail fast if no providers are connected
758
- if (connectedProviderIds.size === 0) {
759
- throw new Error("OpenCode has no connected providers. Please authenticate with at least one provider (e.g., openai, anthropic) or set appropriate environment variables (e.g., OPENAI_API_KEY).");
807
+ // Providers with source "api" are managed by the OpenCode console/subscription (e.g. Pi
808
+ // coding agent). They do not appear in `connected` (which only lists env/config providers)
809
+ // but are fully usable OpenCode authenticates them internally via the console session.
810
+ const isAccessible = (provider) => connectedProviderIds.has(provider.id) || provider.source === "api";
811
+ // Fail fast if no providers are accessible at all
812
+ if (!providers.all.some(isAccessible)) {
813
+ throw new Error("OpenCode has no connected providers. Please authenticate with at least one provider " +
814
+ "(e.g., openai, anthropic), set appropriate environment variables (e.g., OPENAI_API_KEY), " +
815
+ "or log in to OpenCode Go via the console.");
760
816
  }
761
817
  const models = [];
762
818
  this.modelContextWindows.clear();
763
819
  for (const provider of providers.all) {
764
- // Skip providers that aren't connected/configured
765
- if (!connectedProviderIds.has(provider.id)) {
820
+ if (!isAccessible(provider)) {
766
821
  continue;
767
822
  }
768
823
  for (const [modelId, model] of Object.entries(provider.models)) {
@@ -1607,7 +1662,6 @@ class OpenCodeAgentSession {
1607
1662
  this.subAgentCallIdByChildSessionId = new Map();
1608
1663
  this.pendingChildToolPartsBySessionId = new Map();
1609
1664
  this.deletedFromProvider = false;
1610
- this.retryFailureTimer = null;
1611
1665
  this.config = config;
1612
1666
  this.client = client;
1613
1667
  this.sessionId = sessionId;
@@ -1703,7 +1757,6 @@ class OpenCodeAgentSession {
1703
1757
  this.subAgentsByCallId.clear();
1704
1758
  this.subAgentCallIdByChildSessionId.clear();
1705
1759
  this.pendingChildToolPartsBySessionId.clear();
1706
- this.clearRetryFailureTimer();
1707
1760
  const turnAbortController = new AbortController();
1708
1761
  this.abortController = turnAbortController;
1709
1762
  await this.ensureMcpServersConfigured();
@@ -1730,6 +1783,7 @@ class OpenCodeAgentSession {
1730
1783
  // consumeEventStream already finished the turn with the subscription error.
1731
1784
  return { turnId };
1732
1785
  }
1786
+ this.notifySubscribers({ type: "turn_started", provider: "opencode" }, turnId);
1733
1787
  const slashCommand = await this.resolveSlashCommandInvocation(prompt);
1734
1788
  if (slashCommand) {
1735
1789
  if (slashCommand.commandName === "compact" || slashCommand.commandName === "summarize") {
@@ -1977,7 +2031,6 @@ class OpenCodeAgentSession {
1977
2031
  });
1978
2032
  return false;
1979
2033
  }
1980
- this.armRetryFailureTimerForStatus(event, turnId);
1981
2034
  const translated = await this.translateEvent(event);
1982
2035
  this.traceOpenCode("provider.opencode.parsed_event", {
1983
2036
  turnId,
@@ -2024,7 +2077,6 @@ class OpenCodeAgentSession {
2024
2077
  else {
2025
2078
  this.runningToolCalls.clear();
2026
2079
  }
2027
- this.clearRetryFailureTimer();
2028
2080
  this.activeForegroundTurnId = null;
2029
2081
  // Abort the SSE connection so the SDK tears down the underlying fetch.
2030
2082
  this.abortController?.abort();
@@ -2038,37 +2090,6 @@ class OpenCodeAgentSession {
2038
2090
  }
2039
2091
  this.runningToolCalls.delete(item.callId);
2040
2092
  }
2041
- armRetryFailureTimerForStatus(event, turnId) {
2042
- if (this.retryFailureTimer || event.type !== "session.status") {
2043
- return;
2044
- }
2045
- if (event.properties.sessionID !== this.sessionId || event.properties.status.type !== "retry") {
2046
- return;
2047
- }
2048
- const retry = event.properties.status;
2049
- const message = typeof retry.message === "string" ? retry.message.trim() : "";
2050
- const error = message
2051
- ? `OpenCode provider retry did not recover: ${message}`
2052
- : "OpenCode provider retry did not recover";
2053
- this.retryFailureTimer = setTimeout(() => {
2054
- this.retryFailureTimer = null;
2055
- if (this.activeForegroundTurnId !== turnId) {
2056
- return;
2057
- }
2058
- this.finishForegroundTurn({
2059
- type: "turn_failed",
2060
- provider: "opencode",
2061
- error,
2062
- }, turnId);
2063
- }, OPENCODE_RETRY_STATUS_FAILURE_MS);
2064
- }
2065
- clearRetryFailureTimer() {
2066
- if (!this.retryFailureTimer) {
2067
- return;
2068
- }
2069
- clearTimeout(this.retryFailureTimer);
2070
- this.retryFailureTimer = null;
2071
- }
2072
2093
  synthesizeInterruptedToolCalls(turnId) {
2073
2094
  for (const item of this.runningToolCalls.values()) {
2074
2095
  const error = { message: "Tool execution aborted" };
@@ -2135,11 +2156,10 @@ class OpenCodeAgentSession {
2135
2156
  .map((p) => p.text)
2136
2157
  .join("");
2137
2158
  if (text) {
2138
- yield {
2139
- type: "timeline",
2140
- provider: "opencode",
2159
+ yield buildOpenCodeReplayTimelineEvent({
2141
2160
  item: { type: "user_message", text },
2142
- };
2161
+ message: info,
2162
+ });
2143
2163
  }
2144
2164
  }
2145
2165
  else {
@@ -2147,41 +2167,19 @@ class OpenCodeAgentSession {
2147
2167
  for (const part of parts) {
2148
2168
  if (part.type === "text" && part.text) {
2149
2169
  emittedAssistantText = true;
2150
- yield {
2151
- type: "timeline",
2152
- provider: "opencode",
2153
- item: { type: "assistant_message", text: part.text },
2154
- };
2155
- continue;
2156
- }
2157
- if (part.type === "reasoning" && part.text) {
2158
- yield {
2159
- type: "timeline",
2160
- provider: "opencode",
2161
- item: { type: "reasoning", text: part.text },
2162
- };
2163
- continue;
2164
- }
2165
- if (part.type !== "tool") {
2166
- continue;
2167
2170
  }
2168
- const parsedToolPart = OpencodeToolPartToTimelineItemSchema.safeParse(part);
2169
- if (parsedToolPart.success && parsedToolPart.data) {
2170
- yield {
2171
- type: "timeline",
2172
- provider: "opencode",
2173
- item: parsedToolPart.data,
2174
- };
2171
+ const event = buildOpenCodeReplayPartTimelineEvent({ part, message: info });
2172
+ if (event) {
2173
+ yield event;
2175
2174
  }
2176
2175
  }
2177
2176
  if (!emittedAssistantText) {
2178
2177
  const text = stringifyStructuredAssistantMessage(info.structured);
2179
2178
  if (text) {
2180
- yield {
2181
- type: "timeline",
2182
- provider: "opencode",
2179
+ yield buildOpenCodeReplayTimelineEvent({
2183
2180
  item: { type: "assistant_message", text },
2184
- };
2181
+ message: info,
2182
+ });
2185
2183
  }
2186
2184
  }
2187
2185
  }