@bastani/atomic 0.9.41 → 0.9.42-alpha.1

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 (270) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/dist/builtin/intercom/CHANGELOG.md +13 -0
  3. package/dist/builtin/intercom/README.md +7 -3
  4. package/dist/builtin/intercom/broker/broker-status.ts +48 -0
  5. package/dist/builtin/intercom/broker/broker.ts +90 -9
  6. package/dist/builtin/intercom/broker/client.ts +112 -12
  7. package/dist/builtin/intercom/broker/control.ts +225 -0
  8. package/dist/builtin/intercom/broker/multinode-router.ts +32 -39
  9. package/dist/builtin/intercom/broker/paths.ts +4 -0
  10. package/dist/builtin/intercom/broker/pending-send-registry.ts +27 -5
  11. package/dist/builtin/intercom/broker/shared-storage-setting.ts +60 -0
  12. package/dist/builtin/intercom/broker/spawn.ts +13 -4
  13. package/dist/builtin/intercom/broker/sql-lease-store.ts +23 -0
  14. package/dist/builtin/intercom/broker/watchdog.ts +105 -0
  15. package/dist/builtin/intercom/index.bundle.mjs +200 -22
  16. package/dist/builtin/intercom/package.json +1 -1
  17. package/dist/builtin/intercom/types.ts +34 -2
  18. package/dist/builtin/mcp/package.json +1 -1
  19. package/dist/builtin/subagents/package.json +1 -1
  20. package/dist/builtin/subagents/src/extension/index.bundle.mjs +1 -0
  21. package/dist/builtin/web-access/package.json +1 -1
  22. package/dist/builtin/workflows/CHANGELOG.md +12 -0
  23. package/dist/builtin/workflows/README.md +10 -0
  24. package/dist/builtin/workflows/builtin/{chunk-txbc93t6.js → chunk-3s95f7ry.js} +1 -1
  25. package/dist/builtin/workflows/builtin/{chunk-n2gkzkty.js → chunk-edhf30ef.js} +1 -1
  26. package/dist/builtin/workflows/builtin/{chunk-8x61e0s7.js → chunk-frqxd4d1.js} +18 -9
  27. package/dist/builtin/workflows/builtin/goal.js +2 -2
  28. package/dist/builtin/workflows/builtin/index.js +3 -3
  29. package/dist/builtin/workflows/builtin/ralph.js +2 -2
  30. package/dist/builtin/workflows/package.json +6 -1
  31. package/dist/builtin/workflows/src/authoring.d.ts +3 -1
  32. package/dist/builtin/workflows/src/durable/journal/internal.d.ts +13 -0
  33. package/dist/builtin/workflows/src/durable/journal/resolution.d.ts +2 -0
  34. package/dist/builtin/workflows/src/durable/journal/sql-run-journal.d.ts +1 -0
  35. package/dist/builtin/workflows/src/extension/index.bundle.mjs +88554 -82820
  36. package/dist/builtin/workflows/src/extension/local-worker-entry.mjs +72635 -0
  37. package/dist/builtin/workflows/src/index.js +53824 -5907
  38. package/dist/builtin/workflows/src/local-worker-entry.mjs +72635 -0
  39. package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +7 -0
  40. package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +2 -0
  41. package/dist/builtin/workflows/src/workers/public-options.d.ts +31 -0
  42. package/dist/bun/app-host-modules.d.ts +9 -0
  43. package/dist/bun/app-host-modules.d.ts.map +1 -0
  44. package/dist/bun/app-host-modules.js +10 -0
  45. package/dist/bun/app-host-modules.js.map +1 -0
  46. package/dist/bun/cli.d.ts +3 -1
  47. package/dist/bun/cli.d.ts.map +1 -1
  48. package/dist/bun/cli.js +15 -1
  49. package/dist/bun/cli.js.map +1 -1
  50. package/dist/bun/internal-intercom-broker.d.ts +17 -0
  51. package/dist/bun/internal-intercom-broker.d.ts.map +1 -1
  52. package/dist/bun/internal-intercom-broker.js +29 -0
  53. package/dist/bun/internal-intercom-broker.js.map +1 -1
  54. package/dist/bun/internal-workflow-worker.d.ts +4 -0
  55. package/dist/bun/internal-workflow-worker.d.ts.map +1 -0
  56. package/dist/bun/internal-workflow-worker.js +37 -0
  57. package/dist/bun/internal-workflow-worker.js.map +1 -0
  58. package/dist/bun/split-loader.js +10 -2
  59. package/dist/bun/split-loader.js.map +1 -1
  60. package/dist/cli/args.d.ts.map +1 -1
  61. package/dist/cli/args.js +3 -1
  62. package/dist/cli/args.js.map +1 -1
  63. package/dist/cli/intercom-command.d.ts +15 -0
  64. package/dist/cli/intercom-command.d.ts.map +1 -0
  65. package/dist/cli/intercom-command.js +87 -0
  66. package/dist/cli/intercom-command.js.map +1 -0
  67. package/dist/cli/storage-command.d.ts +39 -0
  68. package/dist/cli/storage-command.d.ts.map +1 -0
  69. package/dist/cli/storage-command.js +367 -0
  70. package/dist/cli/storage-command.js.map +1 -0
  71. package/dist/core/agent-session-events.d.ts.map +1 -1
  72. package/dist/core/agent-session-events.js +5 -1
  73. package/dist/core/agent-session-events.js.map +1 -1
  74. package/dist/core/agent-session-methods.d.ts +1 -0
  75. package/dist/core/agent-session-methods.d.ts.map +1 -1
  76. package/dist/core/agent-session-methods.js.map +1 -1
  77. package/dist/core/agent-session-tasks.d.ts.map +1 -1
  78. package/dist/core/agent-session-tasks.js +1 -0
  79. package/dist/core/agent-session-tasks.js.map +1 -1
  80. package/dist/core/agent-session-types.d.ts +1 -0
  81. package/dist/core/agent-session-types.d.ts.map +1 -1
  82. package/dist/core/agent-session-types.js.map +1 -1
  83. package/dist/core/agent-session.d.ts +1 -0
  84. package/dist/core/agent-session.d.ts.map +1 -1
  85. package/dist/core/agent-session.js +2 -0
  86. package/dist/core/agent-session.js.map +1 -1
  87. package/dist/core/builtin-install-layout.d.ts +6 -0
  88. package/dist/core/builtin-install-layout.d.ts.map +1 -1
  89. package/dist/core/builtin-install-layout.js +9 -0
  90. package/dist/core/builtin-install-layout.js.map +1 -1
  91. package/dist/core/child-session-options.d.ts.map +1 -1
  92. package/dist/core/child-session-options.js +3 -0
  93. package/dist/core/child-session-options.js.map +1 -1
  94. package/dist/core/exec.js +2 -2
  95. package/dist/core/exec.js.map +1 -1
  96. package/dist/core/export-html/template.css +9 -0
  97. package/dist/core/export-html/template.js +165 -45
  98. package/dist/core/extensions/loader-host-modules.d.ts +6 -0
  99. package/dist/core/extensions/loader-host-modules.d.ts.map +1 -1
  100. package/dist/core/extensions/loader-host-modules.js +12 -1
  101. package/dist/core/extensions/loader-host-modules.js.map +1 -1
  102. package/dist/core/extensions/loader-virtual-modules.d.ts +6 -0
  103. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  104. package/dist/core/extensions/loader-virtual-modules.js +18 -0
  105. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  106. package/dist/core/extensions/message-types.d.ts +4 -0
  107. package/dist/core/extensions/message-types.d.ts.map +1 -1
  108. package/dist/core/extensions/message-types.js.map +1 -1
  109. package/dist/core/fast-model-routing-transport.d.ts.map +1 -1
  110. package/dist/core/fast-model-routing-transport.js +5 -1
  111. package/dist/core/fast-model-routing-transport.js.map +1 -1
  112. package/dist/core/intercom-broker-control.d.ts +67 -0
  113. package/dist/core/intercom-broker-control.d.ts.map +1 -0
  114. package/dist/core/intercom-broker-control.js +17 -0
  115. package/dist/core/intercom-broker-control.js.map +1 -0
  116. package/dist/core/model-runtime-streaming.d.ts.map +1 -1
  117. package/dist/core/model-runtime-streaming.js +38 -1
  118. package/dist/core/model-runtime-streaming.js.map +1 -1
  119. package/dist/core/package-manager-git.d.ts +2 -2
  120. package/dist/core/package-manager-git.d.ts.map +1 -1
  121. package/dist/core/package-manager-git.js.map +1 -1
  122. package/dist/core/package-manager-manifest.d.ts.map +1 -1
  123. package/dist/core/package-manager-manifest.js +9 -1
  124. package/dist/core/package-manager-manifest.js.map +1 -1
  125. package/dist/core/package-manager-npm.d.ts +2 -2
  126. package/dist/core/package-manager-npm.d.ts.map +1 -1
  127. package/dist/core/package-manager-npm.js.map +1 -1
  128. package/dist/core/package-manager-paths.d.ts +7 -7
  129. package/dist/core/package-manager-paths.d.ts.map +1 -1
  130. package/dist/core/package-manager-paths.js.map +1 -1
  131. package/dist/core/package-manager-storage-adapters.d.ts +7 -0
  132. package/dist/core/package-manager-storage-adapters.d.ts.map +1 -0
  133. package/dist/core/package-manager-storage-adapters.js +76 -0
  134. package/dist/core/package-manager-storage-adapters.js.map +1 -0
  135. package/dist/core/package-manager-types.d.ts +4 -0
  136. package/dist/core/package-manager-types.d.ts.map +1 -1
  137. package/dist/core/package-manager-types.js.map +1 -1
  138. package/dist/core/provider-rate-limits.d.ts +23 -0
  139. package/dist/core/provider-rate-limits.d.ts.map +1 -0
  140. package/dist/core/provider-rate-limits.js +113 -0
  141. package/dist/core/provider-rate-limits.js.map +1 -0
  142. package/dist/core/provider-request-admission.d.ts +7 -0
  143. package/dist/core/provider-request-admission.d.ts.map +1 -0
  144. package/dist/core/provider-request-admission.js +91 -0
  145. package/dist/core/provider-request-admission.js.map +1 -0
  146. package/dist/core/resource-admission-scope.d.ts +4 -0
  147. package/dist/core/resource-admission-scope.d.ts.map +1 -0
  148. package/dist/core/resource-admission-scope.js +9 -0
  149. package/dist/core/resource-admission-scope.js.map +1 -0
  150. package/dist/core/sdk-types.d.ts +16 -0
  151. package/dist/core/sdk-types.d.ts.map +1 -1
  152. package/dist/core/sdk-types.js.map +1 -1
  153. package/dist/core/sdk.d.ts +2 -1
  154. package/dist/core/sdk.d.ts.map +1 -1
  155. package/dist/core/sdk.js +18 -2
  156. package/dist/core/sdk.js.map +1 -1
  157. package/dist/core/session-lifecycle-work.d.ts +1 -0
  158. package/dist/core/session-lifecycle-work.d.ts.map +1 -1
  159. package/dist/core/session-lifecycle-work.js +1 -0
  160. package/dist/core/session-lifecycle-work.js.map +1 -1
  161. package/dist/core/settings-manager-basic-accessors.d.ts +3 -0
  162. package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
  163. package/dist/core/settings-manager-basic-accessors.js +6 -0
  164. package/dist/core/settings-manager-basic-accessors.js.map +1 -1
  165. package/dist/core/settings-schema.d.ts +22 -0
  166. package/dist/core/settings-schema.d.ts.map +1 -1
  167. package/dist/core/settings-schema.js +18 -1
  168. package/dist/core/settings-schema.js.map +1 -1
  169. package/dist/core/storage/index.d.ts +1 -0
  170. package/dist/core/storage/index.d.ts.map +1 -1
  171. package/dist/core/storage/index.js +1 -0
  172. package/dist/core/storage/index.js.map +1 -1
  173. package/dist/core/storage/node-sqlite.d.ts +2 -1
  174. package/dist/core/storage/node-sqlite.d.ts.map +1 -1
  175. package/dist/core/storage/node-sqlite.js +5 -4
  176. package/dist/core/storage/node-sqlite.js.map +1 -1
  177. package/dist/core/storage/provider.d.ts +6 -0
  178. package/dist/core/storage/provider.d.ts.map +1 -1
  179. package/dist/core/storage/provider.js +27 -7
  180. package/dist/core/storage/provider.js.map +1 -1
  181. package/dist/core/storage/sqlite-facade.d.ts +49 -0
  182. package/dist/core/storage/sqlite-facade.d.ts.map +1 -0
  183. package/dist/core/storage/sqlite-facade.js +180 -0
  184. package/dist/core/storage/sqlite-facade.js.map +1 -0
  185. package/dist/core/storage/storage-status.d.ts +81 -0
  186. package/dist/core/storage/storage-status.d.ts.map +1 -0
  187. package/dist/core/storage/storage-status.js +409 -0
  188. package/dist/core/storage/storage-status.js.map +1 -0
  189. package/dist/core/tasks/supervisor.d.ts +2 -1
  190. package/dist/core/tasks/supervisor.d.ts.map +1 -1
  191. package/dist/core/tasks/supervisor.js +105 -4
  192. package/dist/core/tasks/supervisor.js.map +1 -1
  193. package/dist/core/tools/bash-pty-native.d.ts.map +1 -1
  194. package/dist/core/tools/bash-pty-native.js +1 -1
  195. package/dist/core/tools/bash-pty-native.js.map +1 -1
  196. package/dist/index.d.ts +2 -1
  197. package/dist/index.d.ts.map +1 -1
  198. package/dist/index.js +2 -1
  199. package/dist/index.js.map +1 -1
  200. package/dist/main.d.ts.map +1 -1
  201. package/dist/main.js +28 -2
  202. package/dist/main.js.map +1 -1
  203. package/dist/modes/interactive/components/assistant-message.d.ts +3 -1
  204. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  205. package/dist/modes/interactive/components/assistant-message.js +7 -3
  206. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  207. package/dist/modes/interactive/components/chat-message-renderer.d.ts +9 -1
  208. package/dist/modes/interactive/components/chat-message-renderer.d.ts.map +1 -1
  209. package/dist/modes/interactive/components/chat-message-renderer.js +16 -8
  210. package/dist/modes/interactive/components/chat-message-renderer.js.map +1 -1
  211. package/dist/modes/interactive/components/login-dialog.d.ts +5 -0
  212. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  213. package/dist/modes/interactive/components/login-dialog.js +69 -2
  214. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  215. package/dist/modes/interactive/components/markdown-transform.d.ts +1 -1
  216. package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -1
  217. package/dist/modes/interactive/components/markdown-transform.js +2 -2
  218. package/dist/modes/interactive/components/markdown-transform.js.map +1 -1
  219. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  220. package/dist/modes/interactive/components/session-selector-search.js +80 -22
  221. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  222. package/dist/modes/interactive/components/user-message.d.ts +3 -1
  223. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  224. package/dist/modes/interactive/components/user-message.js +6 -2
  225. package/dist/modes/interactive/components/user-message.js.map +1 -1
  226. package/dist/modes/interactive/interactive-mode-deps.d.ts +1 -1
  227. package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -1
  228. package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
  229. package/dist/modes/interactive/interactive-render-chat.js +6 -2
  230. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  231. package/dist/modes/interactive-engine/engine-health.d.ts +8 -4
  232. package/dist/modes/interactive-engine/engine-health.d.ts.map +1 -1
  233. package/dist/modes/interactive-engine/engine-health.js +41 -6
  234. package/dist/modes/interactive-engine/engine-health.js.map +1 -1
  235. package/dist/modes/interactive-engine/isolated-runtime.d.ts.map +1 -1
  236. package/dist/modes/interactive-engine/isolated-runtime.js +19 -17
  237. package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -1
  238. package/dist/modes/interactive-engine/remote-queue-pause.js +1 -1
  239. package/dist/modes/interactive-engine/remote-queue-pause.js.map +1 -1
  240. package/dist/modes/rpc/rpc-input-scheduler.d.ts +1 -0
  241. package/dist/modes/rpc/rpc-input-scheduler.d.ts.map +1 -1
  242. package/dist/modes/rpc/rpc-input-scheduler.js +4 -1
  243. package/dist/modes/rpc/rpc-input-scheduler.js.map +1 -1
  244. package/dist/modes/rpc/rpc-input.d.ts.map +1 -1
  245. package/dist/modes/rpc/rpc-input.js +29 -7
  246. package/dist/modes/rpc/rpc-input.js.map +1 -1
  247. package/dist/utils/shell.d.ts.map +1 -1
  248. package/dist/utils/shell.js +14 -0
  249. package/dist/utils/shell.js.map +1 -1
  250. package/docs/custom-provider/oauth.md +8 -1
  251. package/docs/extensions/api-reference.md +2 -0
  252. package/docs/intercom/operations.md +17 -8
  253. package/docs/intercom/reference.md +1 -1
  254. package/docs/keybindings.md +1 -1
  255. package/docs/packages/authoring.md +15 -0
  256. package/docs/packages.md +3 -2
  257. package/docs/providers.md +2 -0
  258. package/docs/reference/cli.md +17 -0
  259. package/docs/sdk.md +37 -0
  260. package/docs/settings.md +33 -2
  261. package/docs/storage.md +191 -219
  262. package/docs/usage.md +1 -1
  263. package/docs/workflows/api-reference.md +50 -0
  264. package/docs/workflows/operations.md +44 -1
  265. package/docs/workflows.md +25 -0
  266. package/examples/extensions/gondolin/package-lock.json +14 -24
  267. package/examples/extensions/gondolin/package.json +1 -1
  268. package/npm-shrinkwrap.json +35 -35
  269. package/package.json +4 -4
  270. package/schemas/settings.schema.json +87 -1
@@ -13,7 +13,7 @@ import { SkillInvocationMessageComponent } from "./skill-invocation-message.js";
13
13
  import { TaskRow } from "./task-row.js";
14
14
  import { ToolExecutionComponent } from "./tool-execution.js";
15
15
  import { UserMessageComponent } from "./user-message.js";
16
- export function chatEntriesFromAgentMessages(messages) {
16
+ export function chatEntriesFromAgentMessages(messages, messageMeta) {
17
17
  const entries = [];
18
18
  const pendingTools = new Map();
19
19
  for (const message of messages) {
@@ -21,7 +21,14 @@ export function chatEntriesFromAgentMessages(messages) {
21
21
  continue;
22
22
  switch (message.role) {
23
23
  case "assistant": {
24
- entries.push({ role: "assistant", kind: "assistant", message });
24
+ const meta = messageMeta?.get(message);
25
+ entries.push({
26
+ role: "assistant",
27
+ kind: "assistant",
28
+ message,
29
+ messageId: meta?.id,
30
+ timestamp: meta?.timestamp,
31
+ });
25
32
  for (const content of message.content) {
26
33
  if (content.type !== "toolCall")
27
34
  continue;
@@ -77,8 +84,9 @@ export function chatEntriesFromAgentMessages(messages) {
77
84
  }
78
85
  case "user": {
79
86
  const text = getMessageText(message);
87
+ const meta = messageMeta?.get(message);
80
88
  if (text)
81
- entries.push({ role: "user", kind: "user", text });
89
+ entries.push({ role: "user", kind: "user", text, messageId: meta?.id, timestamp: meta?.timestamp });
82
90
  break;
83
91
  }
84
92
  case "bashExecution":
@@ -412,7 +420,7 @@ export function renderChatMessageEntry(entry, options) {
412
420
  activityOmitted: messageEntry.activityOmitted,
413
421
  });
414
422
  case "assistant":
415
- return new AssistantMessageComponent(messageEntry.message, options.hideThinkingBlock ?? false, markdownTheme, options.hiddenThinkingLabel ?? "Thinking...", options.outputPad ?? 1, options.markdownTransformers, options.isStreaming, options.renderLatex);
423
+ return new AssistantMessageComponent(messageEntry.message, options.hideThinkingBlock ?? false, markdownTheme, options.hiddenThinkingLabel ?? "Thinking...", options.outputPad ?? 1, options.markdownTransformers, options.isStreaming, options.renderLatex, messageEntry.messageId, messageEntry.timestamp);
416
424
  case "tool": {
417
425
  if (options.createToolComponent)
418
426
  return options.createToolComponent(messageEntry);
@@ -438,7 +446,7 @@ export function renderChatMessageEntry(entry, options) {
438
446
  return component;
439
447
  }
440
448
  case "user":
441
- return userMessageComponent(messageEntry.text, markdownTheme, options.toolOutputExpanded ?? false, options.outputPad ?? 1, options.markdownTransformers, options.renderLatex);
449
+ return userMessageComponent(messageEntry.text, markdownTheme, options.toolOutputExpanded ?? false, options.outputPad ?? 1, options.markdownTransformers, options.renderLatex, messageEntry.messageId, messageEntry.timestamp);
442
450
  case "custom": {
443
451
  if (isVerbatimCompactionMessage(messageEntry.message)) {
444
452
  return compactionBoundaryFromMessage(messageEntry.message, options.toolOutputExpanded ?? false, options.outputPad);
@@ -466,16 +474,16 @@ class SkillMessageContainer extends Container {
466
474
  }
467
475
  }
468
476
  }
469
- function userMessageComponent(text, markdownTheme, expanded, outputPad = 1, markdownTransformers = [], renderLatex = true) {
477
+ function userMessageComponent(text, markdownTheme, expanded, outputPad = 1, markdownTransformers = [], renderLatex = true, messageId, timestamp) {
470
478
  const skillBlock = parseSkillBlock(text);
471
479
  if (!skillBlock)
472
- return new UserMessageComponent(text, markdownTheme, outputPad, markdownTransformers, renderLatex);
480
+ return new UserMessageComponent(text, markdownTheme, outputPad, markdownTransformers, renderLatex, messageId, timestamp);
473
481
  const container = new SkillMessageContainer();
474
482
  const skillComponent = new SkillInvocationMessageComponent(skillBlock, markdownTheme, renderLatex, outputPad);
475
483
  skillComponent.setExpanded(expanded);
476
484
  container.addChild(skillComponent);
477
485
  if (skillBlock.userMessage) {
478
- container.addChild(new UserMessageComponent(skillBlock.userMessage, markdownTheme, outputPad, markdownTransformers, renderLatex));
486
+ container.addChild(new UserMessageComponent(skillBlock.userMessage, markdownTheme, outputPad, markdownTransformers, renderLatex, messageId, timestamp));
479
487
  }
480
488
  return container;
481
489
  }
@@ -1 +1 @@
1
- {"version":3,"file":"chat-message-renderer.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/chat-message-renderer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage, ToolResultMessage } from \"@bastani/pi-ai/compat\";\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport { type Component, Container, type MarkdownTheme, Text, type TUI } from \"@earendil-works/pi-tui\";\nimport { parseSkillBlock } from \"../../../core/agent-session.js\";\nimport type { MarkdownTransformer, MessageRenderer, ToolRenderers } from \"../../../core/extensions/types.ts\";\nimport {\n\ttype BashExecutionMessage,\n\ttype BranchSummaryMessage,\n\ttype CustomMessage,\n\tisVerbatimCompactionMessage,\n} from \"../../../core/messages.ts\";\nimport type { TaskRecord } from \"../../../core/tasks/contracts.js\";\nimport type { OwnerTaskStore, TaskActivity } from \"../../../core/tasks/owner-store.js\";\nimport {\n\tapplyAssistantMessageDelta,\n\tbeginStreamingAssistantMessage,\n\ttype StreamingAssistantDelta,\n} from \"../streaming-assistant-message.ts\";\nimport { getMarkdownTheme, theme } from \"../theme/theme.js\";\nimport { AssistantMessageComponent } from \"./assistant-message.ts\";\nimport { BashExecutionComponent } from \"./bash-execution.ts\";\nimport { BranchSummaryMessageComponent } from \"./branch-summary-message.ts\";\nimport { extractMessageText } from \"./chat-session-host-utils.ts\";\nimport { compactionBoundaryFromMessage } from \"./compaction-boundary-message.ts\";\nimport { CustomMessageComponent } from \"./custom-message.ts\";\nimport { SkillInvocationMessageComponent } from \"./skill-invocation-message.ts\";\nimport { TaskRow } from \"./task-row.js\";\nimport { ToolExecutionComponent } from \"./tool-execution.ts\";\nimport { UserMessageComponent } from \"./user-message.ts\";\nexport type ChatMessageEntry =\n\t| { role: \"assistant\"; kind: \"assistant\"; message: AssistantMessage }\n\t| {\n\t\t\trole: \"tool\";\n\t\t\tkind: \"task\";\n\t\t\ttask: TaskRecord;\n\t\t\tduplicate: boolean;\n\t\t\tsiblings: readonly TaskRecord[];\n\t\t\tactivity: TaskActivity[];\n\t\t\tactivityOmitted: boolean;\n\t }\n\t| {\n\t\t\trole: \"tool\";\n\t\t\tkind: \"tool\";\n\t\t\ttoolName: string;\n\t\t\ttoolCallId: string;\n\t\t\targs: unknown;\n\t\t\tresult?: RenderableToolResult;\n\t\t\tisPartial?: boolean;\n\t }\n\t| { role: \"tool\"; kind: \"bashExecution\"; message: BashExecutionMessage; isPartial?: boolean }\n\t| { role: \"user\"; kind: \"user\"; text: string }\n\t| { role: \"custom\"; kind: \"custom\"; message: CustomMessage<unknown> }\n\t| { role: \"summary\"; kind: \"branchSummary\"; message: BranchSummaryMessage }\n\t| { role: \"system\"; kind: \"system\"; text: string };\nexport interface ChatMessageRenderOptions {\n\tui: Pick<TUI, \"requestRender\">;\n\tcwd: string;\n\tmarkdownTheme?: MarkdownTheme;\n\thideThinkingBlock?: boolean;\n\thiddenThinkingLabel?: string;\n\ttoolOutputExpanded?: boolean;\n\tshowImages?: boolean;\n\timageWidthCells?: number;\n\toutputPad?: number;\n\tisStreaming?: boolean;\n\tmarkdownTransformers?: readonly MarkdownTransformer[];\n\trenderLatex?: boolean;\n\tgetToolDefinition?: (toolName: string) => ToolRenderers | undefined;\n\tgetCustomMessageRenderer?: (customType: string) => MessageRenderer | undefined;\n\tcreateToolComponent?: (entry: Extract<ChatMessageEntry, { kind: \"tool\" }>) => Component;\n\tcreateCustomMessageComponent?: (message: CustomMessage<unknown>) => Component;\n}\nexport function chatEntriesFromAgentMessages(messages: readonly AgentMessage[]): ChatMessageEntry[] {\n\tconst entries: ChatMessageEntry[] = [];\n\tconst pendingTools = new Map<string, Extract<ChatMessageEntry, { kind: \"tool\" }>>();\n\tfor (const message of messages) {\n\t\tif (isLegacyCompactionSummaryMessage(message)) continue;\n\t\tswitch (message.role) {\n\t\t\tcase \"assistant\": {\n\t\t\t\tentries.push({ role: \"assistant\", kind: \"assistant\", message });\n\t\t\t\tfor (const content of message.content) {\n\t\t\t\t\tif (content.type !== \"toolCall\") continue;\n\t\t\t\t\tconst toolEntry: ChatMessageEntry = {\n\t\t\t\t\t\trole: \"tool\",\n\t\t\t\t\t\tkind: \"tool\",\n\t\t\t\t\t\ttoolName: content.name,\n\t\t\t\t\t\ttoolCallId: content.id,\n\t\t\t\t\t\targs: content.arguments,\n\t\t\t\t\t\tisPartial: true,\n\t\t\t\t\t};\n\t\t\t\t\tentries.push(toolEntry);\n\t\t\t\t\tpendingTools.set(content.id, toolEntry);\n\t\t\t\t}\n\t\t\t\tif (message.stopReason === \"aborted\" || message.stopReason === \"error\") {\n\t\t\t\t\tconst errorText =\n\t\t\t\t\t\tmessage.stopReason === \"aborted\"\n\t\t\t\t\t\t\t? message.errorMessage || \"Operation aborted\"\n\t\t\t\t\t\t\t: message.errorMessage || \"Unknown error\";\n\t\t\t\t\tfor (const toolEntry of pendingTools.values()) {\n\t\t\t\t\t\ttoolEntry.result = {\n\t\t\t\t\t\t\trole: \"toolResult\",\n\t\t\t\t\t\t\ttoolCallId: toolEntry.toolCallId,\n\t\t\t\t\t\t\ttoolName: toolEntry.toolName,\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: errorText }],\n\t\t\t\t\t\t\tisError: true,\n\t\t\t\t\t\t\ttimestamp: message.timestamp,\n\t\t\t\t\t\t};\n\t\t\t\t\t\ttoolEntry.isPartial = false;\n\t\t\t\t\t}\n\t\t\t\t\tpendingTools.clear();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"toolResult\": {\n\t\t\t\tconst toolEntry = pendingTools.get(message.toolCallId);\n\t\t\t\tif (toolEntry) {\n\t\t\t\t\ttoolEntry.result = message;\n\t\t\t\t\ttoolEntry.isPartial = false;\n\t\t\t\t\tpendingTools.delete(message.toolCallId);\n\t\t\t\t} else {\n\t\t\t\t\tentries.push({\n\t\t\t\t\t\trole: \"tool\",\n\t\t\t\t\t\tkind: \"tool\",\n\t\t\t\t\t\ttoolName: message.toolName,\n\t\t\t\t\t\ttoolCallId: message.toolCallId,\n\t\t\t\t\t\targs: {},\n\t\t\t\t\t\tresult: message,\n\t\t\t\t\t\tisPartial: false,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"user\": {\n\t\t\t\tconst text = getMessageText(message);\n\t\t\t\tif (text) entries.push({ role: \"user\", kind: \"user\", text });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"bashExecution\":\n\t\t\t\tentries.push({ role: \"tool\", kind: \"bashExecution\", message });\n\t\t\t\tbreak;\n\t\t\tcase \"custom\":\n\t\t\t\tif (message.display) entries.push({ role: \"custom\", kind: \"custom\", message });\n\t\t\t\tbreak;\n\t\t\tcase \"branchSummary\":\n\t\t\t\tentries.push({ role: \"summary\", kind: \"branchSummary\", message });\n\t\t\t\tbreak;\n\t\t\tcase \"system\":\n\t\t\t\t// System messages carry prompt sections, not chat content; rendering\n\t\t\t\t// them printed a bare dim \"system\" line in workflow stage chats.\n\t\t\t\tbreak;\n\t\t\tdefault: {\n\t\t\t\tconst role = (message as { role: string }).role;\n\t\t\t\tentries.push({ role: \"system\", kind: \"system\", text: role });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn entries;\n}\nexport interface LiveChatEventLike {\n\treadonly type?: unknown;\n\treadonly message?: unknown;\n\treadonly assistantMessageEvent?: StreamingAssistantDelta;\n\treadonly toolCallId?: unknown;\n\treadonly parentToolCallId?: unknown;\n\treadonly toolName?: unknown;\n\treadonly args?: unknown;\n\treadonly partialResult?: unknown;\n\treadonly result?: unknown;\n\treadonly isError?: unknown;\n\treadonly durationMs?: unknown;\n}\ntype LiveChatEntry = ChatMessageEntry | { role: string };\nexport class LiveChatEntriesController {\n\tprivate streamingAssistantIndex: number | undefined;\n\tprivate pendingToolIndexes = new Map<string, number>();\n\tprivate declare readonly entries: LiveChatEntry[];\n\tconstructor(entries: LiveChatEntry[]) {\n\t\tthis.entries = entries;\n\t}\n\tclearTasks(): void {\n\t\tconst streaming =\n\t\t\tthis.streamingAssistantIndex === undefined ? undefined : this.entries[this.streamingAssistantIndex];\n\t\tfor (let index = this.entries.length - 1; index >= 0; index--) {\n\t\t\tconst entry = this.entries[index];\n\t\t\tif (\"kind\" in entry && entry.kind === \"task\") this.entries.splice(index, 1);\n\t\t}\n\t\tthis.streamingAssistantIndex = streaming === undefined ? undefined : this.entries.indexOf(streaming);\n\t\tthis.reindexPendingTools();\n\t}\n\tupsertTasks(tasks: readonly TaskRecord[], store?: OwnerTaskStore): void {\n\t\tfor (const task of tasks) {\n\t\t\tconst activity = store?.recentActivity(task.ref.taskId) ?? [];\n\t\t\tconst activityOmitted = store?.activityOmitted(task.ref.taskId) ?? false;\n\t\t\tconst duplicate =\n\t\t\t\ttasks.filter((other) => other.agentName === task.agentName && other.title === task.title).length > 1;\n\t\t\tconst entry = this.entries.find(\n\t\t\t\t(entry) => \"kind\" in entry && entry.kind === \"task\" && entry.task.ref.taskId === task.ref.taskId,\n\t\t\t);\n\t\t\tif (entry && \"kind\" in entry && entry.kind === \"task\") {\n\t\t\t\tentry.task = task;\n\t\t\t\tentry.duplicate = duplicate;\n\t\t\t\tentry.siblings = tasks;\n\t\t\t\tentry.activity = activity;\n\t\t\t\tentry.activityOmitted = activityOmitted;\n\t\t\t} else\n\t\t\t\tthis.entries.push({\n\t\t\t\t\trole: \"tool\",\n\t\t\t\t\tkind: \"task\",\n\t\t\t\t\ttask,\n\t\t\t\t\tduplicate,\n\t\t\t\t\tsiblings: tasks,\n\t\t\t\t\tactivity,\n\t\t\t\t\tactivityOmitted,\n\t\t\t\t});\n\t\t}\n\t}\n\tappendMessages(messages: readonly AgentMessage[]): void {\n\t\tthis.entries.push(...chatEntriesFromAgentMessages(messages));\n\t\tthis.reindexPendingTools();\n\t}\n\treplaceMessages(messages: readonly AgentMessage[], preservedEntries: readonly { role: string }[] = []): void {\n\t\tthis.entries.splice(0, this.entries.length, ...chatEntriesFromAgentMessages(messages), ...preservedEntries);\n\t\tthis.streamingAssistantIndex = undefined;\n\t\tthis.reindexPendingTools();\n\t}\n\tappendUserText(text: string): void {\n\t\tthis.entries.push({ role: \"user\", kind: \"user\", text });\n\t}\n\t/**\n\t * Seed the assistant message a chat mounted mid-stream never saw start.\n\t *\n\t * Delta-only updates carry just the next fragment, so a consumer attached\n\t * part-way through a turn cannot recover the text that already streamed. The\n\t * live session keeps that in-flight message, and seeding it here makes the\n\t * deltas that arrive afterwards continue it instead of opening a second\n\t * assistant message. A stream this consumer is already following wins.\n\t */\n\thydrateStreamingAssistantMessage(message: unknown): boolean {\n\t\tif (!isAgentMessageLike(message) || message.role !== \"assistant\") return false;\n\t\tif (this.currentStreamingAssistantMessage() !== undefined) return false;\n\t\treturn this.updateAssistantMessage(beginStreamingAssistantMessage(message as AssistantMessage));\n\t}\n\tapplyEvent(event: LiveChatEventLike): boolean {\n\t\tconst type = String(event.type ?? \"\");\n\t\tif (typeof event.parentToolCallId === \"string\" && type.startsWith(\"tool_execution_\")) return false;\n\t\tswitch (type) {\n\t\t\tcase \"message_start\":\n\t\t\t\treturn this.handleMessageStart(event.message);\n\t\t\tcase \"message_update\":\n\t\t\t\treturn this.handleMessageUpdate(event);\n\t\t\tcase \"message_end\":\n\t\t\t\treturn this.handleMessageEnd(event.message);\n\t\t\tcase \"tool_execution_start\":\n\t\t\t\treturn this.upsertToolEntry({\n\t\t\t\t\ttoolCallId: typeof event.toolCallId === \"string\" ? event.toolCallId : undefined,\n\t\t\t\t\ttoolName: typeof event.toolName === \"string\" ? event.toolName : \"tool\",\n\t\t\t\t\targs: event.args,\n\t\t\t\t\tisPartial: true,\n\t\t\t\t});\n\t\t\tcase \"tool_execution_update\": {\n\t\t\t\tconst toolCallId = typeof event.toolCallId === \"string\" ? event.toolCallId : undefined;\n\t\t\t\tif (!toolCallId) return false;\n\t\t\t\treturn this.updateToolResult(toolCallId, event.partialResult, true, false);\n\t\t\t}\n\t\t\tcase \"tool_execution_end\": {\n\t\t\t\tconst toolCallId = typeof event.toolCallId === \"string\" ? event.toolCallId : undefined;\n\t\t\t\tif (!toolCallId) return false;\n\t\t\t\treturn this.updateToolResult(\n\t\t\t\t\ttoolCallId,\n\t\t\t\t\tevent.result,\n\t\t\t\t\tfalse,\n\t\t\t\t\tevent.isError === true,\n\t\t\t\t\ttypeof event.durationMs === \"number\" ? event.durationMs : undefined,\n\t\t\t\t);\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t}\n\t}\n\tpendingToolIds(): string[] {\n\t\treturn [...this.pendingToolIndexes.keys()];\n\t}\n\tclearPendingTools(): void {\n\t\tthis.pendingToolIndexes.clear();\n\t}\n\n\tisStreamingAssistantEntry(entry: ChatMessageEntry): boolean {\n\t\treturn this.streamingAssistantIndex !== undefined && this.entries[this.streamingAssistantIndex] === entry;\n\t}\n\n\tprivate handleMessageStart(message: unknown): boolean {\n\t\tif (!isAgentMessageLike(message)) return false;\n\t\tif (message.role === \"assistant\") {\n\t\t\tthis.streamingAssistantIndex = undefined;\n\t\t\treturn this.updateAssistantMessage(beginStreamingAssistantMessage(message as AssistantMessage));\n\t\t}\n\t\tif (message.role === \"toolResult\") {\n\t\t\tconst toolResult = message as ToolResultMessage;\n\t\t\tif (this.findToolEntryIndex(toolResult.toolCallId) >= 0) return true;\n\t\t}\n\t\tconst entries = chatEntriesFromAgentMessages([message as AgentMessage]);\n\t\tif (entries.length === 0) return false;\n\t\tthis.entries.push(...entries);\n\t\tthis.reindexPendingTools();\n\t\treturn true;\n\t}\n\tprivate handleMessageUpdate(event: LiveChatEventLike): boolean {\n\t\tif (!event.assistantMessageEvent) return false;\n\t\tconst message = this.currentStreamingAssistantMessage() ?? minimalAssistantMessage();\n\t\tif (!applyAssistantMessageDelta(message, event.assistantMessageEvent)) return false;\n\t\treturn this.updateAssistantMessage(message);\n\t}\n\tprivate handleMessageEnd(message: unknown): boolean {\n\t\tif (!isAgentMessageLike(message) || message.role !== \"assistant\") return false;\n\t\tconst changed = this.updateAssistantMessage(message as AssistantMessage);\n\t\tconst stopReason = typeof message.stopReason === \"string\" ? message.stopReason : \"\";\n\t\tif (stopReason === \"aborted\" || stopReason === \"error\") {\n\t\t\tconst errorText =\n\t\t\t\ttypeof message.errorMessage === \"string\" && message.errorMessage\n\t\t\t\t\t? message.errorMessage\n\t\t\t\t\t: stopReason === \"aborted\"\n\t\t\t\t\t\t? \"Operation aborted\"\n\t\t\t\t\t\t: \"Unknown error\";\n\t\t\tfor (const toolCallId of this.pendingToolIds()) {\n\t\t\t\tthis.updateToolResult(toolCallId, { content: [{ type: \"text\", text: errorText }] }, false, true);\n\t\t\t}\n\t\t\tthis.clearPendingTools();\n\t\t}\n\t\tthis.streamingAssistantIndex = undefined;\n\t\treturn changed || true;\n\t}\n\tprivate updateAssistantMessage(message: AssistantMessage): boolean {\n\t\tif (\n\t\t\tthis.streamingAssistantIndex !== undefined &&\n\t\t\tthis.isAssistantEntry(this.entries[this.streamingAssistantIndex])\n\t\t) {\n\t\t\tthis.entries[this.streamingAssistantIndex] = {\n\t\t\t\t...(this.entries[this.streamingAssistantIndex] as Extract<ChatMessageEntry, { kind: \"assistant\" }>),\n\t\t\t\tmessage,\n\t\t\t};\n\t\t} else {\n\t\t\tthis.entries.push({ role: \"assistant\", kind: \"assistant\", message });\n\t\t\tthis.streamingAssistantIndex = this.entries.length - 1;\n\t\t}\n\t\tfor (const content of message.content) {\n\t\t\tif (content.type !== \"toolCall\") continue;\n\t\t\tthis.upsertToolEntry({\n\t\t\t\ttoolCallId: content.id,\n\t\t\t\ttoolName: content.name,\n\t\t\t\targs: content.arguments,\n\t\t\t\tisPartial: true,\n\t\t\t});\n\t\t}\n\t\treturn true;\n\t}\n\tprivate currentStreamingAssistantMessage(): AssistantMessage | undefined {\n\t\tconst entry = this.streamingAssistantIndex !== undefined ? this.entries[this.streamingAssistantIndex] : undefined;\n\t\treturn this.isAssistantEntry(entry) ? entry.message : undefined;\n\t}\n\tprivate upsertToolEntry(update: {\n\t\ttoolCallId?: string;\n\t\ttoolName: string;\n\t\targs?: unknown;\n\t\tisPartial: boolean;\n\t}): boolean {\n\t\tconst toolCallId = update.toolCallId ?? `live-${update.toolName}`;\n\t\tconst index = this.pendingToolIndexes.get(toolCallId) ?? this.findToolEntryIndex(toolCallId, update.toolName);\n\t\tconst previous = index >= 0 ? this.entries[index] : undefined;\n\t\tconst previousTool = this.isToolEntry(previous) ? previous : undefined;\n\t\tconst next: ChatMessageEntry = {\n\t\t\trole: \"tool\",\n\t\t\tkind: \"tool\",\n\t\t\ttoolName: previousTool?.toolName ?? update.toolName,\n\t\t\ttoolCallId,\n\t\t\targs: update.args ?? previousTool?.args ?? {},\n\t\t\tresult: previousTool?.result,\n\t\t\tisPartial: update.isPartial,\n\t\t};\n\t\tif (index >= 0) this.entries[index] = next;\n\t\telse this.entries.push(next);\n\t\tthis.pendingToolIndexes.set(toolCallId, index >= 0 ? index : this.entries.length - 1);\n\t\treturn true;\n\t}\n\tprivate updateToolResult(\n\t\ttoolCallId: string,\n\t\tresult: unknown,\n\t\tisPartial: boolean,\n\t\tisError: boolean,\n\t\tdurationMs?: number,\n\t): boolean {\n\t\tconst index = this.pendingToolIndexes.get(toolCallId) ?? this.findToolEntryIndex(toolCallId);\n\t\tif (index < 0) return false;\n\t\tconst entry = this.entries[index];\n\t\tif (!this.isToolEntry(entry)) return false;\n\t\tconst resultObject = toolResultFromUnknown(result, entry.toolName, toolCallId, isError);\n\t\tif (durationMs !== undefined) resultObject.durationMs = durationMs;\n\t\tthis.entries[index] = { ...entry, result: resultObject, isPartial };\n\t\tif (!isPartial) this.pendingToolIndexes.delete(toolCallId);\n\t\treturn true;\n\t}\n\tprivate isSyntheticToolCallId(toolCallId: string): boolean {\n\t\treturn toolCallId.startsWith(\"live-\");\n\t}\n\tprivate findToolEntryIndex(toolCallId: string, toolName?: string): number {\n\t\tfor (let i = this.entries.length - 1; i >= 0; i--) {\n\t\t\tconst entry = this.entries[i];\n\t\t\tif (!this.isToolEntry(entry)) continue;\n\t\t\tif (entry.toolCallId === toolCallId) return i;\n\t\t\tif (\n\t\t\t\ttoolName &&\n\t\t\t\tentry.toolName === toolName &&\n\t\t\t\tentry.isPartial !== false &&\n\t\t\t\t(this.isSyntheticToolCallId(toolCallId) || this.isSyntheticToolCallId(entry.toolCallId))\n\t\t\t) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\n\tprivate reindexPendingTools(): void {\n\t\tthis.pendingToolIndexes.clear();\n\t\tfor (let i = 0; i < this.entries.length; i++) {\n\t\t\tconst entry = this.entries[i];\n\t\t\tif (this.isToolEntry(entry) && entry.isPartial !== false) this.pendingToolIndexes.set(entry.toolCallId, i);\n\t\t}\n\t}\n\tprivate isAssistantEntry(\n\t\tentry: LiveChatEntry | undefined,\n\t): entry is Extract<ChatMessageEntry, { kind: \"assistant\" }> {\n\t\treturn isChatMessageEntry(entry) && entry.kind === \"assistant\";\n\t}\n\tprivate isToolEntry(entry: LiveChatEntry | undefined): entry is Extract<ChatMessageEntry, { kind: \"tool\" }> {\n\t\treturn isChatMessageEntry(entry) && entry.kind === \"tool\";\n\t}\n}\nfunction isChatMessageEntry(entry: LiveChatEntry | undefined): entry is ChatMessageEntry {\n\treturn entry !== undefined && \"kind\" in entry;\n}\nfunction isLegacyCompactionSummaryMessage(message: AgentMessage): boolean {\n\treturn message.role === \"compaction\" + \"Summary\";\n}\nfunction isAgentMessageLike(\n\tmessage: unknown,\n): message is AgentMessage & { stopReason?: unknown; errorMessage?: unknown } {\n\treturn message !== null && typeof message === \"object\" && \"role\" in message;\n}\nfunction minimalAssistantMessage(): AssistantMessage {\n\treturn {\n\t\trole: \"assistant\",\n\t\tcontent: [],\n\t\tstopReason: \"stop\",\n\t} as unknown as AssistantMessage;\n}\n/** UI progress may contain in-memory details; only durable transcript results are JSON. */\ntype RenderableToolResult = Omit<ToolResultMessage, \"details\"> & { details?: unknown };\nfunction toolResultFromUnknown(\n\tresult: unknown,\n\ttoolName: string,\n\ttoolCallId: string,\n\tisError: boolean,\n): RenderableToolResult {\n\tif (result !== null && typeof result === \"object\" && \"content\" in result) {\n\t\tconst candidate = result as { content?: unknown; details?: unknown };\n\t\tconst content = Array.isArray(candidate.content) ? candidate.content : [];\n\t\treturn {\n\t\t\trole: \"toolResult\",\n\t\t\ttoolCallId,\n\t\t\ttoolName,\n\t\t\tcontent: content as ToolResultMessage[\"content\"],\n\t\t\tdetails: candidate.details,\n\t\t\tisError,\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\t}\n\treturn {\n\t\trole: \"toolResult\",\n\t\ttoolCallId,\n\t\ttoolName,\n\t\tcontent: typeof result === \"string\" ? [{ type: \"text\", text: result }] : [],\n\t\tisError,\n\t\ttimestamp: Date.now(),\n\t};\n}\nexport function renderChatMessageEntry(entry: ChatMessageEntry, options: ChatMessageRenderOptions): Component {\n\tconst messageEntry = entry as ChatMessageEntry;\n\tconst markdownTheme = options.markdownTheme ?? getMarkdownTheme();\n\tswitch (messageEntry.kind) {\n\t\tcase \"task\":\n\t\t\treturn new TaskRow(messageEntry.task, {\n\t\t\t\texpanded: options.toolOutputExpanded,\n\t\t\t\tduplicate: messageEntry.duplicate,\n\t\t\t\tsiblings: messageEntry.siblings,\n\t\t\t\tactivity: messageEntry.activity,\n\t\t\t\tactivityOmitted: messageEntry.activityOmitted,\n\t\t\t});\n\t\tcase \"assistant\":\n\t\t\treturn new AssistantMessageComponent(\n\t\t\t\tmessageEntry.message,\n\t\t\t\toptions.hideThinkingBlock ?? false,\n\t\t\t\tmarkdownTheme,\n\t\t\t\toptions.hiddenThinkingLabel ?? \"Thinking...\",\n\t\t\t\toptions.outputPad ?? 1,\n\t\t\t\toptions.markdownTransformers,\n\t\t\t\toptions.isStreaming,\n\t\t\t\toptions.renderLatex,\n\t\t\t);\n\t\tcase \"tool\": {\n\t\t\tif (options.createToolComponent) return options.createToolComponent(messageEntry);\n\t\t\tconst component = new ToolExecutionComponent(\n\t\t\t\tmessageEntry.toolName,\n\t\t\t\tmessageEntry.toolCallId,\n\t\t\t\tmessageEntry.args,\n\t\t\t\t{\n\t\t\t\t\tshowImages: options.showImages ?? true,\n\t\t\t\t\timageWidthCells: options.imageWidthCells,\n\t\t\t\t\toutputPad: options.outputPad,\n\t\t\t\t},\n\t\t\t\toptions.getToolDefinition?.(messageEntry.toolName),\n\t\t\t\toptions.ui as TUI,\n\t\t\t\toptions.cwd,\n\t\t\t);\n\t\t\tcomponent.setExpanded(options.toolOutputExpanded ?? false);\n\t\t\tif (messageEntry.result) component.updateResult(messageEntry.result, messageEntry.isPartial ?? false);\n\t\t\treturn component;\n\t\t}\n\t\tcase \"bashExecution\": {\n\t\t\tconst component = new BashExecutionComponent(\n\t\t\t\tmessageEntry.message.command,\n\t\t\t\toptions.ui as TUI,\n\t\t\t\tmessageEntry.message.excludeFromContext,\n\t\t\t\toptions.outputPad,\n\t\t\t);\n\t\t\tif (messageEntry.message.output) component.appendOutput(messageEntry.message.output);\n\t\t\tif (messageEntry.isPartial !== true) {\n\t\t\t\tcomponent.setComplete(\n\t\t\t\t\tmessageEntry.message.exitCode,\n\t\t\t\t\tmessageEntry.message.cancelled,\n\t\t\t\t\tmessageEntry.message.truncated\n\t\t\t\t\t\t? ({ truncated: true } as Parameters<BashExecutionComponent[\"setComplete\"]>[2])\n\t\t\t\t\t\t: undefined,\n\t\t\t\t\tmessageEntry.message.fullOutputPath,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn component;\n\t\t}\n\t\tcase \"user\":\n\t\t\treturn userMessageComponent(\n\t\t\t\tmessageEntry.text,\n\t\t\t\tmarkdownTheme,\n\t\t\t\toptions.toolOutputExpanded ?? false,\n\t\t\t\toptions.outputPad ?? 1,\n\t\t\t\toptions.markdownTransformers,\n\t\t\t\toptions.renderLatex,\n\t\t\t);\n\t\tcase \"custom\": {\n\t\t\tif (isVerbatimCompactionMessage(messageEntry.message)) {\n\t\t\t\treturn compactionBoundaryFromMessage(\n\t\t\t\t\tmessageEntry.message,\n\t\t\t\t\toptions.toolOutputExpanded ?? false,\n\t\t\t\t\toptions.outputPad,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (options.createCustomMessageComponent) return options.createCustomMessageComponent(messageEntry.message);\n\t\t\tconst component = new CustomMessageComponent(\n\t\t\t\tmessageEntry.message,\n\t\t\t\toptions.getCustomMessageRenderer?.(messageEntry.message.customType),\n\t\t\t\tmarkdownTheme,\n\t\t\t\toptions.outputPad ?? 1,\n\t\t\t\toptions.renderLatex,\n\t\t\t);\n\t\t\tcomponent.setExpanded(options.toolOutputExpanded ?? false);\n\t\t\treturn component;\n\t\t}\n\t\tcase \"branchSummary\": {\n\t\t\tconst component = new BranchSummaryMessageComponent(\n\t\t\t\tmessageEntry.message,\n\t\t\t\tmarkdownTheme,\n\t\t\t\toptions.renderLatex,\n\t\t\t\toptions.outputPad,\n\t\t\t);\n\t\t\tcomponent.setExpanded(options.toolOutputExpanded ?? false);\n\t\t\treturn component;\n\t\t}\n\t\tcase \"system\":\n\t\t\treturn new Text(theme.fg(\"dim\", messageEntry.text), options.outputPad ?? 1, 0);\n\t}\n}\nclass SkillMessageContainer extends Container {\n\tsetOutputPad(outputPad: number): void {\n\t\tfor (const child of this.children) {\n\t\t\tif (\"setOutputPad\" in child && typeof child.setOutputPad === \"function\") child.setOutputPad(outputPad);\n\t\t}\n\t}\n}\n\nfunction userMessageComponent(\n\ttext: string,\n\tmarkdownTheme: MarkdownTheme,\n\texpanded: boolean,\n\toutputPad = 1,\n\tmarkdownTransformers: readonly MarkdownTransformer[] = [],\n\trenderLatex = true,\n): Component {\n\tconst skillBlock = parseSkillBlock(text);\n\tif (!skillBlock) return new UserMessageComponent(text, markdownTheme, outputPad, markdownTransformers, renderLatex);\n\tconst container = new SkillMessageContainer();\n\tconst skillComponent = new SkillInvocationMessageComponent(skillBlock, markdownTheme, renderLatex, outputPad);\n\tskillComponent.setExpanded(expanded);\n\tcontainer.addChild(skillComponent);\n\tif (skillBlock.userMessage) {\n\t\tcontainer.addChild(\n\t\t\tnew UserMessageComponent(skillBlock.userMessage, markdownTheme, outputPad, markdownTransformers, renderLatex),\n\t\t);\n\t}\n\treturn container;\n}\nfunction getMessageText(message: Extract<AgentMessage, { role: \"user\" }>): string {\n\treturn extractMessageText(message.content).trim();\n}\n"]}
1
+ {"version":3,"file":"chat-message-renderer.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/chat-message-renderer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage, ToolResultMessage } from \"@bastani/pi-ai/compat\";\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport { type Component, Container, type MarkdownTheme, Text, type TUI } from \"@earendil-works/pi-tui\";\nimport { parseSkillBlock } from \"../../../core/agent-session.js\";\nimport type { MarkdownTransformer, MessageRenderer, ToolRenderers } from \"../../../core/extensions/types.ts\";\nimport {\n\ttype BashExecutionMessage,\n\ttype BranchSummaryMessage,\n\ttype CustomMessage,\n\tisVerbatimCompactionMessage,\n} from \"../../../core/messages.ts\";\nimport type { TaskRecord } from \"../../../core/tasks/contracts.js\";\nimport type { OwnerTaskStore, TaskActivity } from \"../../../core/tasks/owner-store.js\";\nimport {\n\tapplyAssistantMessageDelta,\n\tbeginStreamingAssistantMessage,\n\ttype StreamingAssistantDelta,\n} from \"../streaming-assistant-message.ts\";\nimport { getMarkdownTheme, theme } from \"../theme/theme.js\";\nimport { AssistantMessageComponent } from \"./assistant-message.ts\";\nimport { BashExecutionComponent } from \"./bash-execution.ts\";\nimport { BranchSummaryMessageComponent } from \"./branch-summary-message.ts\";\nimport { extractMessageText } from \"./chat-session-host-utils.ts\";\nimport { compactionBoundaryFromMessage } from \"./compaction-boundary-message.ts\";\nimport { CustomMessageComponent } from \"./custom-message.ts\";\nimport { SkillInvocationMessageComponent } from \"./skill-invocation-message.ts\";\nimport { TaskRow } from \"./task-row.js\";\nimport { ToolExecutionComponent } from \"./tool-execution.ts\";\nimport { UserMessageComponent } from \"./user-message.ts\";\nexport interface PersistedMessageMeta {\n\tid: string;\n\ttimestamp: string;\n}\nexport type ChatMessageEntry =\n\t| { role: \"assistant\"; kind: \"assistant\"; message: AssistantMessage; messageId?: string; timestamp?: string }\n\t| {\n\t\t\trole: \"tool\";\n\t\t\tkind: \"task\";\n\t\t\ttask: TaskRecord;\n\t\t\tduplicate: boolean;\n\t\t\tsiblings: readonly TaskRecord[];\n\t\t\tactivity: TaskActivity[];\n\t\t\tactivityOmitted: boolean;\n\t }\n\t| {\n\t\t\trole: \"tool\";\n\t\t\tkind: \"tool\";\n\t\t\ttoolName: string;\n\t\t\ttoolCallId: string;\n\t\t\targs: unknown;\n\t\t\tresult?: RenderableToolResult;\n\t\t\tisPartial?: boolean;\n\t }\n\t| { role: \"tool\"; kind: \"bashExecution\"; message: BashExecutionMessage; isPartial?: boolean }\n\t| { role: \"user\"; kind: \"user\"; text: string; messageId?: string; timestamp?: string }\n\t| { role: \"custom\"; kind: \"custom\"; message: CustomMessage<unknown> }\n\t| { role: \"summary\"; kind: \"branchSummary\"; message: BranchSummaryMessage }\n\t| { role: \"system\"; kind: \"system\"; text: string };\nexport interface ChatMessageRenderOptions {\n\tui: Pick<TUI, \"requestRender\">;\n\tcwd: string;\n\tmarkdownTheme?: MarkdownTheme;\n\thideThinkingBlock?: boolean;\n\thiddenThinkingLabel?: string;\n\ttoolOutputExpanded?: boolean;\n\tshowImages?: boolean;\n\timageWidthCells?: number;\n\toutputPad?: number;\n\tisStreaming?: boolean;\n\tmarkdownTransformers?: readonly MarkdownTransformer[];\n\trenderLatex?: boolean;\n\tgetToolDefinition?: (toolName: string) => ToolRenderers | undefined;\n\tgetCustomMessageRenderer?: (customType: string) => MessageRenderer | undefined;\n\tcreateToolComponent?: (entry: Extract<ChatMessageEntry, { kind: \"tool\" }>) => Component;\n\tcreateCustomMessageComponent?: (message: CustomMessage<unknown>) => Component;\n}\nexport function chatEntriesFromAgentMessages(\n\tmessages: readonly AgentMessage[],\n\tmessageMeta?: ReadonlyMap<AgentMessage, PersistedMessageMeta>,\n): ChatMessageEntry[] {\n\tconst entries: ChatMessageEntry[] = [];\n\tconst pendingTools = new Map<string, Extract<ChatMessageEntry, { kind: \"tool\" }>>();\n\tfor (const message of messages) {\n\t\tif (isLegacyCompactionSummaryMessage(message)) continue;\n\t\tswitch (message.role) {\n\t\t\tcase \"assistant\": {\n\t\t\t\tconst meta = messageMeta?.get(message);\n\t\t\t\tentries.push({\n\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\tkind: \"assistant\",\n\t\t\t\t\tmessage,\n\t\t\t\t\tmessageId: meta?.id,\n\t\t\t\t\ttimestamp: meta?.timestamp,\n\t\t\t\t});\n\t\t\t\tfor (const content of message.content) {\n\t\t\t\t\tif (content.type !== \"toolCall\") continue;\n\t\t\t\t\tconst toolEntry: ChatMessageEntry = {\n\t\t\t\t\t\trole: \"tool\",\n\t\t\t\t\t\tkind: \"tool\",\n\t\t\t\t\t\ttoolName: content.name,\n\t\t\t\t\t\ttoolCallId: content.id,\n\t\t\t\t\t\targs: content.arguments,\n\t\t\t\t\t\tisPartial: true,\n\t\t\t\t\t};\n\t\t\t\t\tentries.push(toolEntry);\n\t\t\t\t\tpendingTools.set(content.id, toolEntry);\n\t\t\t\t}\n\t\t\t\tif (message.stopReason === \"aborted\" || message.stopReason === \"error\") {\n\t\t\t\t\tconst errorText =\n\t\t\t\t\t\tmessage.stopReason === \"aborted\"\n\t\t\t\t\t\t\t? message.errorMessage || \"Operation aborted\"\n\t\t\t\t\t\t\t: message.errorMessage || \"Unknown error\";\n\t\t\t\t\tfor (const toolEntry of pendingTools.values()) {\n\t\t\t\t\t\ttoolEntry.result = {\n\t\t\t\t\t\t\trole: \"toolResult\",\n\t\t\t\t\t\t\ttoolCallId: toolEntry.toolCallId,\n\t\t\t\t\t\t\ttoolName: toolEntry.toolName,\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: errorText }],\n\t\t\t\t\t\t\tisError: true,\n\t\t\t\t\t\t\ttimestamp: message.timestamp,\n\t\t\t\t\t\t};\n\t\t\t\t\t\ttoolEntry.isPartial = false;\n\t\t\t\t\t}\n\t\t\t\t\tpendingTools.clear();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"toolResult\": {\n\t\t\t\tconst toolEntry = pendingTools.get(message.toolCallId);\n\t\t\t\tif (toolEntry) {\n\t\t\t\t\ttoolEntry.result = message;\n\t\t\t\t\ttoolEntry.isPartial = false;\n\t\t\t\t\tpendingTools.delete(message.toolCallId);\n\t\t\t\t} else {\n\t\t\t\t\tentries.push({\n\t\t\t\t\t\trole: \"tool\",\n\t\t\t\t\t\tkind: \"tool\",\n\t\t\t\t\t\ttoolName: message.toolName,\n\t\t\t\t\t\ttoolCallId: message.toolCallId,\n\t\t\t\t\t\targs: {},\n\t\t\t\t\t\tresult: message,\n\t\t\t\t\t\tisPartial: false,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"user\": {\n\t\t\t\tconst text = getMessageText(message);\n\t\t\t\tconst meta = messageMeta?.get(message);\n\t\t\t\tif (text)\n\t\t\t\t\tentries.push({ role: \"user\", kind: \"user\", text, messageId: meta?.id, timestamp: meta?.timestamp });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"bashExecution\":\n\t\t\t\tentries.push({ role: \"tool\", kind: \"bashExecution\", message });\n\t\t\t\tbreak;\n\t\t\tcase \"custom\":\n\t\t\t\tif (message.display) entries.push({ role: \"custom\", kind: \"custom\", message });\n\t\t\t\tbreak;\n\t\t\tcase \"branchSummary\":\n\t\t\t\tentries.push({ role: \"summary\", kind: \"branchSummary\", message });\n\t\t\t\tbreak;\n\t\t\tcase \"system\":\n\t\t\t\t// System messages carry prompt sections, not chat content; rendering\n\t\t\t\t// them printed a bare dim \"system\" line in workflow stage chats.\n\t\t\t\tbreak;\n\t\t\tdefault: {\n\t\t\t\tconst role = (message as { role: string }).role;\n\t\t\t\tentries.push({ role: \"system\", kind: \"system\", text: role });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn entries;\n}\nexport interface LiveChatEventLike {\n\treadonly type?: unknown;\n\treadonly message?: unknown;\n\treadonly assistantMessageEvent?: StreamingAssistantDelta;\n\treadonly toolCallId?: unknown;\n\treadonly parentToolCallId?: unknown;\n\treadonly toolName?: unknown;\n\treadonly args?: unknown;\n\treadonly partialResult?: unknown;\n\treadonly result?: unknown;\n\treadonly isError?: unknown;\n\treadonly durationMs?: unknown;\n}\ntype LiveChatEntry = ChatMessageEntry | { role: string };\nexport class LiveChatEntriesController {\n\tprivate streamingAssistantIndex: number | undefined;\n\tprivate pendingToolIndexes = new Map<string, number>();\n\tprivate declare readonly entries: LiveChatEntry[];\n\tconstructor(entries: LiveChatEntry[]) {\n\t\tthis.entries = entries;\n\t}\n\tclearTasks(): void {\n\t\tconst streaming =\n\t\t\tthis.streamingAssistantIndex === undefined ? undefined : this.entries[this.streamingAssistantIndex];\n\t\tfor (let index = this.entries.length - 1; index >= 0; index--) {\n\t\t\tconst entry = this.entries[index];\n\t\t\tif (\"kind\" in entry && entry.kind === \"task\") this.entries.splice(index, 1);\n\t\t}\n\t\tthis.streamingAssistantIndex = streaming === undefined ? undefined : this.entries.indexOf(streaming);\n\t\tthis.reindexPendingTools();\n\t}\n\tupsertTasks(tasks: readonly TaskRecord[], store?: OwnerTaskStore): void {\n\t\tfor (const task of tasks) {\n\t\t\tconst activity = store?.recentActivity(task.ref.taskId) ?? [];\n\t\t\tconst activityOmitted = store?.activityOmitted(task.ref.taskId) ?? false;\n\t\t\tconst duplicate =\n\t\t\t\ttasks.filter((other) => other.agentName === task.agentName && other.title === task.title).length > 1;\n\t\t\tconst entry = this.entries.find(\n\t\t\t\t(entry) => \"kind\" in entry && entry.kind === \"task\" && entry.task.ref.taskId === task.ref.taskId,\n\t\t\t);\n\t\t\tif (entry && \"kind\" in entry && entry.kind === \"task\") {\n\t\t\t\tentry.task = task;\n\t\t\t\tentry.duplicate = duplicate;\n\t\t\t\tentry.siblings = tasks;\n\t\t\t\tentry.activity = activity;\n\t\t\t\tentry.activityOmitted = activityOmitted;\n\t\t\t} else\n\t\t\t\tthis.entries.push({\n\t\t\t\t\trole: \"tool\",\n\t\t\t\t\tkind: \"task\",\n\t\t\t\t\ttask,\n\t\t\t\t\tduplicate,\n\t\t\t\t\tsiblings: tasks,\n\t\t\t\t\tactivity,\n\t\t\t\t\tactivityOmitted,\n\t\t\t\t});\n\t\t}\n\t}\n\tappendMessages(messages: readonly AgentMessage[]): void {\n\t\tthis.entries.push(...chatEntriesFromAgentMessages(messages));\n\t\tthis.reindexPendingTools();\n\t}\n\treplaceMessages(messages: readonly AgentMessage[], preservedEntries: readonly { role: string }[] = []): void {\n\t\tthis.entries.splice(0, this.entries.length, ...chatEntriesFromAgentMessages(messages), ...preservedEntries);\n\t\tthis.streamingAssistantIndex = undefined;\n\t\tthis.reindexPendingTools();\n\t}\n\tappendUserText(text: string): void {\n\t\tthis.entries.push({ role: \"user\", kind: \"user\", text });\n\t}\n\t/**\n\t * Seed the assistant message a chat mounted mid-stream never saw start.\n\t *\n\t * Delta-only updates carry just the next fragment, so a consumer attached\n\t * part-way through a turn cannot recover the text that already streamed. The\n\t * live session keeps that in-flight message, and seeding it here makes the\n\t * deltas that arrive afterwards continue it instead of opening a second\n\t * assistant message. A stream this consumer is already following wins.\n\t */\n\thydrateStreamingAssistantMessage(message: unknown): boolean {\n\t\tif (!isAgentMessageLike(message) || message.role !== \"assistant\") return false;\n\t\tif (this.currentStreamingAssistantMessage() !== undefined) return false;\n\t\treturn this.updateAssistantMessage(beginStreamingAssistantMessage(message as AssistantMessage));\n\t}\n\tapplyEvent(event: LiveChatEventLike): boolean {\n\t\tconst type = String(event.type ?? \"\");\n\t\tif (typeof event.parentToolCallId === \"string\" && type.startsWith(\"tool_execution_\")) return false;\n\t\tswitch (type) {\n\t\t\tcase \"message_start\":\n\t\t\t\treturn this.handleMessageStart(event.message);\n\t\t\tcase \"message_update\":\n\t\t\t\treturn this.handleMessageUpdate(event);\n\t\t\tcase \"message_end\":\n\t\t\t\treturn this.handleMessageEnd(event.message);\n\t\t\tcase \"tool_execution_start\":\n\t\t\t\treturn this.upsertToolEntry({\n\t\t\t\t\ttoolCallId: typeof event.toolCallId === \"string\" ? event.toolCallId : undefined,\n\t\t\t\t\ttoolName: typeof event.toolName === \"string\" ? event.toolName : \"tool\",\n\t\t\t\t\targs: event.args,\n\t\t\t\t\tisPartial: true,\n\t\t\t\t});\n\t\t\tcase \"tool_execution_update\": {\n\t\t\t\tconst toolCallId = typeof event.toolCallId === \"string\" ? event.toolCallId : undefined;\n\t\t\t\tif (!toolCallId) return false;\n\t\t\t\treturn this.updateToolResult(toolCallId, event.partialResult, true, false);\n\t\t\t}\n\t\t\tcase \"tool_execution_end\": {\n\t\t\t\tconst toolCallId = typeof event.toolCallId === \"string\" ? event.toolCallId : undefined;\n\t\t\t\tif (!toolCallId) return false;\n\t\t\t\treturn this.updateToolResult(\n\t\t\t\t\ttoolCallId,\n\t\t\t\t\tevent.result,\n\t\t\t\t\tfalse,\n\t\t\t\t\tevent.isError === true,\n\t\t\t\t\ttypeof event.durationMs === \"number\" ? event.durationMs : undefined,\n\t\t\t\t);\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t}\n\t}\n\tpendingToolIds(): string[] {\n\t\treturn [...this.pendingToolIndexes.keys()];\n\t}\n\tclearPendingTools(): void {\n\t\tthis.pendingToolIndexes.clear();\n\t}\n\n\tisStreamingAssistantEntry(entry: ChatMessageEntry): boolean {\n\t\treturn this.streamingAssistantIndex !== undefined && this.entries[this.streamingAssistantIndex] === entry;\n\t}\n\n\tprivate handleMessageStart(message: unknown): boolean {\n\t\tif (!isAgentMessageLike(message)) return false;\n\t\tif (message.role === \"assistant\") {\n\t\t\tthis.streamingAssistantIndex = undefined;\n\t\t\treturn this.updateAssistantMessage(beginStreamingAssistantMessage(message as AssistantMessage));\n\t\t}\n\t\tif (message.role === \"toolResult\") {\n\t\t\tconst toolResult = message as ToolResultMessage;\n\t\t\tif (this.findToolEntryIndex(toolResult.toolCallId) >= 0) return true;\n\t\t}\n\t\tconst entries = chatEntriesFromAgentMessages([message as AgentMessage]);\n\t\tif (entries.length === 0) return false;\n\t\tthis.entries.push(...entries);\n\t\tthis.reindexPendingTools();\n\t\treturn true;\n\t}\n\tprivate handleMessageUpdate(event: LiveChatEventLike): boolean {\n\t\tif (!event.assistantMessageEvent) return false;\n\t\tconst message = this.currentStreamingAssistantMessage() ?? minimalAssistantMessage();\n\t\tif (!applyAssistantMessageDelta(message, event.assistantMessageEvent)) return false;\n\t\treturn this.updateAssistantMessage(message);\n\t}\n\tprivate handleMessageEnd(message: unknown): boolean {\n\t\tif (!isAgentMessageLike(message) || message.role !== \"assistant\") return false;\n\t\tconst changed = this.updateAssistantMessage(message as AssistantMessage);\n\t\tconst stopReason = typeof message.stopReason === \"string\" ? message.stopReason : \"\";\n\t\tif (stopReason === \"aborted\" || stopReason === \"error\") {\n\t\t\tconst errorText =\n\t\t\t\ttypeof message.errorMessage === \"string\" && message.errorMessage\n\t\t\t\t\t? message.errorMessage\n\t\t\t\t\t: stopReason === \"aborted\"\n\t\t\t\t\t\t? \"Operation aborted\"\n\t\t\t\t\t\t: \"Unknown error\";\n\t\t\tfor (const toolCallId of this.pendingToolIds()) {\n\t\t\t\tthis.updateToolResult(toolCallId, { content: [{ type: \"text\", text: errorText }] }, false, true);\n\t\t\t}\n\t\t\tthis.clearPendingTools();\n\t\t}\n\t\tthis.streamingAssistantIndex = undefined;\n\t\treturn changed || true;\n\t}\n\tprivate updateAssistantMessage(message: AssistantMessage): boolean {\n\t\tif (\n\t\t\tthis.streamingAssistantIndex !== undefined &&\n\t\t\tthis.isAssistantEntry(this.entries[this.streamingAssistantIndex])\n\t\t) {\n\t\t\tthis.entries[this.streamingAssistantIndex] = {\n\t\t\t\t...(this.entries[this.streamingAssistantIndex] as Extract<ChatMessageEntry, { kind: \"assistant\" }>),\n\t\t\t\tmessage,\n\t\t\t};\n\t\t} else {\n\t\t\tthis.entries.push({ role: \"assistant\", kind: \"assistant\", message });\n\t\t\tthis.streamingAssistantIndex = this.entries.length - 1;\n\t\t}\n\t\tfor (const content of message.content) {\n\t\t\tif (content.type !== \"toolCall\") continue;\n\t\t\tthis.upsertToolEntry({\n\t\t\t\ttoolCallId: content.id,\n\t\t\t\ttoolName: content.name,\n\t\t\t\targs: content.arguments,\n\t\t\t\tisPartial: true,\n\t\t\t});\n\t\t}\n\t\treturn true;\n\t}\n\tprivate currentStreamingAssistantMessage(): AssistantMessage | undefined {\n\t\tconst entry = this.streamingAssistantIndex !== undefined ? this.entries[this.streamingAssistantIndex] : undefined;\n\t\treturn this.isAssistantEntry(entry) ? entry.message : undefined;\n\t}\n\tprivate upsertToolEntry(update: {\n\t\ttoolCallId?: string;\n\t\ttoolName: string;\n\t\targs?: unknown;\n\t\tisPartial: boolean;\n\t}): boolean {\n\t\tconst toolCallId = update.toolCallId ?? `live-${update.toolName}`;\n\t\tconst index = this.pendingToolIndexes.get(toolCallId) ?? this.findToolEntryIndex(toolCallId, update.toolName);\n\t\tconst previous = index >= 0 ? this.entries[index] : undefined;\n\t\tconst previousTool = this.isToolEntry(previous) ? previous : undefined;\n\t\tconst next: ChatMessageEntry = {\n\t\t\trole: \"tool\",\n\t\t\tkind: \"tool\",\n\t\t\ttoolName: previousTool?.toolName ?? update.toolName,\n\t\t\ttoolCallId,\n\t\t\targs: update.args ?? previousTool?.args ?? {},\n\t\t\tresult: previousTool?.result,\n\t\t\tisPartial: update.isPartial,\n\t\t};\n\t\tif (index >= 0) this.entries[index] = next;\n\t\telse this.entries.push(next);\n\t\tthis.pendingToolIndexes.set(toolCallId, index >= 0 ? index : this.entries.length - 1);\n\t\treturn true;\n\t}\n\tprivate updateToolResult(\n\t\ttoolCallId: string,\n\t\tresult: unknown,\n\t\tisPartial: boolean,\n\t\tisError: boolean,\n\t\tdurationMs?: number,\n\t): boolean {\n\t\tconst index = this.pendingToolIndexes.get(toolCallId) ?? this.findToolEntryIndex(toolCallId);\n\t\tif (index < 0) return false;\n\t\tconst entry = this.entries[index];\n\t\tif (!this.isToolEntry(entry)) return false;\n\t\tconst resultObject = toolResultFromUnknown(result, entry.toolName, toolCallId, isError);\n\t\tif (durationMs !== undefined) resultObject.durationMs = durationMs;\n\t\tthis.entries[index] = { ...entry, result: resultObject, isPartial };\n\t\tif (!isPartial) this.pendingToolIndexes.delete(toolCallId);\n\t\treturn true;\n\t}\n\tprivate isSyntheticToolCallId(toolCallId: string): boolean {\n\t\treturn toolCallId.startsWith(\"live-\");\n\t}\n\tprivate findToolEntryIndex(toolCallId: string, toolName?: string): number {\n\t\tfor (let i = this.entries.length - 1; i >= 0; i--) {\n\t\t\tconst entry = this.entries[i];\n\t\t\tif (!this.isToolEntry(entry)) continue;\n\t\t\tif (entry.toolCallId === toolCallId) return i;\n\t\t\tif (\n\t\t\t\ttoolName &&\n\t\t\t\tentry.toolName === toolName &&\n\t\t\t\tentry.isPartial !== false &&\n\t\t\t\t(this.isSyntheticToolCallId(toolCallId) || this.isSyntheticToolCallId(entry.toolCallId))\n\t\t\t) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\n\tprivate reindexPendingTools(): void {\n\t\tthis.pendingToolIndexes.clear();\n\t\tfor (let i = 0; i < this.entries.length; i++) {\n\t\t\tconst entry = this.entries[i];\n\t\t\tif (this.isToolEntry(entry) && entry.isPartial !== false) this.pendingToolIndexes.set(entry.toolCallId, i);\n\t\t}\n\t}\n\tprivate isAssistantEntry(\n\t\tentry: LiveChatEntry | undefined,\n\t): entry is Extract<ChatMessageEntry, { kind: \"assistant\" }> {\n\t\treturn isChatMessageEntry(entry) && entry.kind === \"assistant\";\n\t}\n\tprivate isToolEntry(entry: LiveChatEntry | undefined): entry is Extract<ChatMessageEntry, { kind: \"tool\" }> {\n\t\treturn isChatMessageEntry(entry) && entry.kind === \"tool\";\n\t}\n}\nfunction isChatMessageEntry(entry: LiveChatEntry | undefined): entry is ChatMessageEntry {\n\treturn entry !== undefined && \"kind\" in entry;\n}\nfunction isLegacyCompactionSummaryMessage(message: AgentMessage): boolean {\n\treturn message.role === \"compaction\" + \"Summary\";\n}\nfunction isAgentMessageLike(\n\tmessage: unknown,\n): message is AgentMessage & { stopReason?: unknown; errorMessage?: unknown } {\n\treturn message !== null && typeof message === \"object\" && \"role\" in message;\n}\nfunction minimalAssistantMessage(): AssistantMessage {\n\treturn {\n\t\trole: \"assistant\",\n\t\tcontent: [],\n\t\tstopReason: \"stop\",\n\t} as unknown as AssistantMessage;\n}\n/** UI progress may contain in-memory details; only durable transcript results are JSON. */\ntype RenderableToolResult = Omit<ToolResultMessage, \"details\"> & { details?: unknown };\nfunction toolResultFromUnknown(\n\tresult: unknown,\n\ttoolName: string,\n\ttoolCallId: string,\n\tisError: boolean,\n): RenderableToolResult {\n\tif (result !== null && typeof result === \"object\" && \"content\" in result) {\n\t\tconst candidate = result as { content?: unknown; details?: unknown };\n\t\tconst content = Array.isArray(candidate.content) ? candidate.content : [];\n\t\treturn {\n\t\t\trole: \"toolResult\",\n\t\t\ttoolCallId,\n\t\t\ttoolName,\n\t\t\tcontent: content as ToolResultMessage[\"content\"],\n\t\t\tdetails: candidate.details,\n\t\t\tisError,\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\t}\n\treturn {\n\t\trole: \"toolResult\",\n\t\ttoolCallId,\n\t\ttoolName,\n\t\tcontent: typeof result === \"string\" ? [{ type: \"text\", text: result }] : [],\n\t\tisError,\n\t\ttimestamp: Date.now(),\n\t};\n}\nexport function renderChatMessageEntry(entry: ChatMessageEntry, options: ChatMessageRenderOptions): Component {\n\tconst messageEntry = entry as ChatMessageEntry;\n\tconst markdownTheme = options.markdownTheme ?? getMarkdownTheme();\n\tswitch (messageEntry.kind) {\n\t\tcase \"task\":\n\t\t\treturn new TaskRow(messageEntry.task, {\n\t\t\t\texpanded: options.toolOutputExpanded,\n\t\t\t\tduplicate: messageEntry.duplicate,\n\t\t\t\tsiblings: messageEntry.siblings,\n\t\t\t\tactivity: messageEntry.activity,\n\t\t\t\tactivityOmitted: messageEntry.activityOmitted,\n\t\t\t});\n\t\tcase \"assistant\":\n\t\t\treturn new AssistantMessageComponent(\n\t\t\t\tmessageEntry.message,\n\t\t\t\toptions.hideThinkingBlock ?? false,\n\t\t\t\tmarkdownTheme,\n\t\t\t\toptions.hiddenThinkingLabel ?? \"Thinking...\",\n\t\t\t\toptions.outputPad ?? 1,\n\t\t\t\toptions.markdownTransformers,\n\t\t\t\toptions.isStreaming,\n\t\t\t\toptions.renderLatex,\n\t\t\t\tmessageEntry.messageId,\n\t\t\t\tmessageEntry.timestamp,\n\t\t\t);\n\t\tcase \"tool\": {\n\t\t\tif (options.createToolComponent) return options.createToolComponent(messageEntry);\n\t\t\tconst component = new ToolExecutionComponent(\n\t\t\t\tmessageEntry.toolName,\n\t\t\t\tmessageEntry.toolCallId,\n\t\t\t\tmessageEntry.args,\n\t\t\t\t{\n\t\t\t\t\tshowImages: options.showImages ?? true,\n\t\t\t\t\timageWidthCells: options.imageWidthCells,\n\t\t\t\t\toutputPad: options.outputPad,\n\t\t\t\t},\n\t\t\t\toptions.getToolDefinition?.(messageEntry.toolName),\n\t\t\t\toptions.ui as TUI,\n\t\t\t\toptions.cwd,\n\t\t\t);\n\t\t\tcomponent.setExpanded(options.toolOutputExpanded ?? false);\n\t\t\tif (messageEntry.result) component.updateResult(messageEntry.result, messageEntry.isPartial ?? false);\n\t\t\treturn component;\n\t\t}\n\t\tcase \"bashExecution\": {\n\t\t\tconst component = new BashExecutionComponent(\n\t\t\t\tmessageEntry.message.command,\n\t\t\t\toptions.ui as TUI,\n\t\t\t\tmessageEntry.message.excludeFromContext,\n\t\t\t\toptions.outputPad,\n\t\t\t);\n\t\t\tif (messageEntry.message.output) component.appendOutput(messageEntry.message.output);\n\t\t\tif (messageEntry.isPartial !== true) {\n\t\t\t\tcomponent.setComplete(\n\t\t\t\t\tmessageEntry.message.exitCode,\n\t\t\t\t\tmessageEntry.message.cancelled,\n\t\t\t\t\tmessageEntry.message.truncated\n\t\t\t\t\t\t? ({ truncated: true } as Parameters<BashExecutionComponent[\"setComplete\"]>[2])\n\t\t\t\t\t\t: undefined,\n\t\t\t\t\tmessageEntry.message.fullOutputPath,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn component;\n\t\t}\n\t\tcase \"user\":\n\t\t\treturn userMessageComponent(\n\t\t\t\tmessageEntry.text,\n\t\t\t\tmarkdownTheme,\n\t\t\t\toptions.toolOutputExpanded ?? false,\n\t\t\t\toptions.outputPad ?? 1,\n\t\t\t\toptions.markdownTransformers,\n\t\t\t\toptions.renderLatex,\n\t\t\t\tmessageEntry.messageId,\n\t\t\t\tmessageEntry.timestamp,\n\t\t\t);\n\t\tcase \"custom\": {\n\t\t\tif (isVerbatimCompactionMessage(messageEntry.message)) {\n\t\t\t\treturn compactionBoundaryFromMessage(\n\t\t\t\t\tmessageEntry.message,\n\t\t\t\t\toptions.toolOutputExpanded ?? false,\n\t\t\t\t\toptions.outputPad,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (options.createCustomMessageComponent) return options.createCustomMessageComponent(messageEntry.message);\n\t\t\tconst component = new CustomMessageComponent(\n\t\t\t\tmessageEntry.message,\n\t\t\t\toptions.getCustomMessageRenderer?.(messageEntry.message.customType),\n\t\t\t\tmarkdownTheme,\n\t\t\t\toptions.outputPad ?? 1,\n\t\t\t\toptions.renderLatex,\n\t\t\t);\n\t\t\tcomponent.setExpanded(options.toolOutputExpanded ?? false);\n\t\t\treturn component;\n\t\t}\n\t\tcase \"branchSummary\": {\n\t\t\tconst component = new BranchSummaryMessageComponent(\n\t\t\t\tmessageEntry.message,\n\t\t\t\tmarkdownTheme,\n\t\t\t\toptions.renderLatex,\n\t\t\t\toptions.outputPad,\n\t\t\t);\n\t\t\tcomponent.setExpanded(options.toolOutputExpanded ?? false);\n\t\t\treturn component;\n\t\t}\n\t\tcase \"system\":\n\t\t\treturn new Text(theme.fg(\"dim\", messageEntry.text), options.outputPad ?? 1, 0);\n\t}\n}\nclass SkillMessageContainer extends Container {\n\tsetOutputPad(outputPad: number): void {\n\t\tfor (const child of this.children) {\n\t\t\tif (\"setOutputPad\" in child && typeof child.setOutputPad === \"function\") child.setOutputPad(outputPad);\n\t\t}\n\t}\n}\n\nfunction userMessageComponent(\n\ttext: string,\n\tmarkdownTheme: MarkdownTheme,\n\texpanded: boolean,\n\toutputPad = 1,\n\tmarkdownTransformers: readonly MarkdownTransformer[] = [],\n\trenderLatex = true,\n\tmessageId?: string,\n\ttimestamp?: string,\n): Component {\n\tconst skillBlock = parseSkillBlock(text);\n\tif (!skillBlock)\n\t\treturn new UserMessageComponent(\n\t\t\ttext,\n\t\t\tmarkdownTheme,\n\t\t\toutputPad,\n\t\t\tmarkdownTransformers,\n\t\t\trenderLatex,\n\t\t\tmessageId,\n\t\t\ttimestamp,\n\t\t);\n\tconst container = new SkillMessageContainer();\n\tconst skillComponent = new SkillInvocationMessageComponent(skillBlock, markdownTheme, renderLatex, outputPad);\n\tskillComponent.setExpanded(expanded);\n\tcontainer.addChild(skillComponent);\n\tif (skillBlock.userMessage) {\n\t\tcontainer.addChild(\n\t\t\tnew UserMessageComponent(\n\t\t\t\tskillBlock.userMessage,\n\t\t\t\tmarkdownTheme,\n\t\t\t\toutputPad,\n\t\t\t\tmarkdownTransformers,\n\t\t\t\trenderLatex,\n\t\t\t\tmessageId,\n\t\t\t\ttimestamp,\n\t\t\t),\n\t\t);\n\t}\n\treturn container;\n}\nfunction getMessageText(message: Extract<AgentMessage, { role: \"user\" }>): string {\n\treturn extractMessageText(message.content).trim();\n}\n"]}
@@ -12,12 +12,15 @@ export declare class LoginDialogComponent extends Container implements Focusable
12
12
  private inputResolver?;
13
13
  private inputRejecter?;
14
14
  private authCancelHint?;
15
+ private deviceCodeAction?;
16
+ private deviceCodeHint?;
15
17
  private _focused;
16
18
  get focused(): boolean;
17
19
  set focused(value: boolean);
18
20
  private onComplete;
19
21
  constructor(tui: TUI, providerId: string, onComplete: (success: boolean, message?: string) => void, providerNameOverride?: string, titleOverride?: string);
20
22
  get signal(): AbortSignal;
23
+ private clearDeviceCodeAction;
21
24
  private cancel;
22
25
  /**
23
26
  * Called by onAuth callback - show URL and optional instructions
@@ -30,6 +33,8 @@ export declare class LoginDialogComponent extends Container implements Focusable
30
33
  * Called by onDeviceCode callback - show URL and user code.
31
34
  */
32
35
  showDeviceCode(info: OAuthDeviceCodeInfo): void;
36
+ private setDeviceCodeStatus;
37
+ private activateDeviceCode;
33
38
  private replaceInputWithSubmittedText;
34
39
  private removeAuthCancelHint;
35
40
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"login-dialog.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/login-dialog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,KAAK,SAAS,EAAuC,KAAK,GAAG,EAAE,MAAM,wBAAwB,CAAC;AAOlH;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,SAAU,YAAW,SAAS;IACvE,OAAO,CAAC,gBAAgB,CAAY;IACpC,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,OAAO,CAAC,CAAmB;IACnC,OAAO,CAAC,eAAe,CAAyB;IAChD,OAAO,CAAC,aAAa,CAAC,CAA0B;IAChD,OAAO,CAAC,aAAa,CAAC,CAAyB;IAC/C,OAAO,CAAC,cAAc,CAAC,CAAO;IAG9B,OAAO,CAAC,QAAQ,CAAS;IACzB,IAAI,OAAO,IAAI,OAAO,CAErB;IACD,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAGzB;IAED,QAAgB,UAAU,CAA+C;IAEzE,YACC,GAAG,EAAE,GAAG,EACR,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,EACxD,oBAAoB,CAAC,EAAE,MAAM,EAC7B,aAAa,CAAC,EAAE,MAAM,EAoCtB;IAED,IAAI,MAAM,IAAI,WAAW,CAExB;IAED,OAAO,CAAC,MAAM;IAUd;;OAEG;IACH,QAAQ,CACP,GAAG,EAAE,MAAM,EACX,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,GAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAA;KAAO,GACnE,IAAI,CAqBN;IAED;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,CAgB9C;IAED,OAAO,CAAC,6BAA6B;IAMrC,OAAO,CAAC,oBAAoB;IAM5B;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAa/C;IAED,wFAAwF;IACxF,mBAAmB,IAAI,IAAI,CAI1B;IAED;;;OAGG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBjE;IAED,0DAA0D;IAC1D,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CASjC;IAED,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,SAAS,YAAY,EAAO,GAAG,IAAI,CASnE;IAED;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAMjC;IAED;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAGlC;IAED,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAejC;CACD"}
1
+ {"version":3,"file":"login-dialog.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/login-dialog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EACN,SAAS,EACT,KAAK,SAAS,EAMd,KAAK,GAAG,EACR,MAAM,wBAAwB,CAAC;AAQhC;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,SAAU,YAAW,SAAS;IACvE,OAAO,CAAC,gBAAgB,CAAY;IACpC,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,OAAO,CAAC,CAAmB;IACnC,OAAO,CAAC,eAAe,CAAyB;IAChD,OAAO,CAAC,aAAa,CAAC,CAA0B;IAChD,OAAO,CAAC,aAAa,CAAC,CAAyB;IAC/C,OAAO,CAAC,cAAc,CAAC,CAAO;IAC9B,OAAO,CAAC,gBAAgB,CAAC,CAAiD;IAC1E,OAAO,CAAC,cAAc,CAAC,CAAY;IAGnC,OAAO,CAAC,QAAQ,CAAS;IACzB,IAAI,OAAO,IAAI,OAAO,CAErB;IACD,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAGzB;IAED,QAAgB,UAAU,CAA+C;IAEzE,YACC,GAAG,EAAE,GAAG,EACR,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,EACxD,oBAAoB,CAAC,EAAE,MAAM,EAC7B,aAAa,CAAC,EAAE,MAAM,EAoCtB;IAED,IAAI,MAAM,IAAI,WAAW,CAExB;IAED,OAAO,CAAC,qBAAqB;IAQ7B,OAAO,CAAC,MAAM;IAWd;;OAEG;IACH,QAAQ,CACP,GAAG,EAAE,MAAM,EACX,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,GAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAA;KAAO,GACnE,IAAI,CAsBN;IAED;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,CAiC9C;IAED,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,kBAAkB;IAiB1B,OAAO,CAAC,6BAA6B;IAMrC,OAAO,CAAC,oBAAoB;IAM5B;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAc/C;IAED,wFAAwF;IACxF,mBAAmB,IAAI,IAAI,CAI1B;IAED;;;OAGG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBjE;IAED,0DAA0D;IAC1D,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAUjC;IAED,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,SAAS,YAAY,EAAO,GAAG,IAAI,CASnE;IAED;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAMjC;IAED;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAGlC;IAED,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CA6BjC;CACD"}
@@ -1,4 +1,5 @@
1
- import { Container, getKeybindings, Input, Spacer, Text } from "@earendil-works/pi-tui";
1
+ import { Container, getKeybindings, Input, Spacer, Text, TruncatedText, } from "@earendil-works/pi-tui";
2
+ import { copyToClipboard } from "../../../utils/clipboard.js";
2
3
  import { openBrowser } from "../../../utils/open-browser.js";
3
4
  import { theme } from "../theme/theme.js";
4
5
  import { AuthUrlComponent } from "./auth-url.js";
@@ -16,6 +17,8 @@ export class LoginDialogComponent extends Container {
16
17
  inputResolver;
17
18
  inputRejecter;
18
19
  authCancelHint;
20
+ deviceCodeAction;
21
+ deviceCodeHint;
19
22
  // Focusable implementation - propagate to input for IME cursor positioning
20
23
  _focused = false;
21
24
  get focused() {
@@ -58,7 +61,15 @@ export class LoginDialogComponent extends Container {
58
61
  get signal() {
59
62
  return this.abortController.signal;
60
63
  }
64
+ clearDeviceCodeAction() {
65
+ if (this.deviceCodeHint) {
66
+ this.contentContainer.removeChild(this.deviceCodeHint);
67
+ }
68
+ this.deviceCodeHint = undefined;
69
+ this.deviceCodeAction = undefined;
70
+ }
61
71
  cancel() {
72
+ this.clearDeviceCodeAction();
62
73
  this.abortController.abort();
63
74
  if (this.inputRejecter) {
64
75
  this.inputRejecter(new Error("Login cancelled"));
@@ -71,6 +82,7 @@ export class LoginDialogComponent extends Container {
71
82
  * Called by onAuth callback - show URL and optional instructions
72
83
  */
73
84
  showAuth(url, instructions, options = {}) {
85
+ this.clearDeviceCodeAction();
74
86
  this.contentContainer.clear();
75
87
  this.authCancelHint = undefined;
76
88
  this.contentContainer.addChild(new Spacer(1));
@@ -94,6 +106,12 @@ export class LoginDialogComponent extends Container {
94
106
  */
95
107
  showDeviceCode(info) {
96
108
  this.authUrl = undefined;
109
+ info = {
110
+ ...info,
111
+ openBrowserOnConfirm: info.openBrowserOnConfirm ?? true,
112
+ copyCodeOnConfirm: info.copyCodeOnConfirm ?? true,
113
+ };
114
+ this.clearDeviceCodeAction();
97
115
  this.contentContainer.clear();
98
116
  this.authCancelHint = undefined;
99
117
  this.contentContainer.addChild(new Spacer(1));
@@ -104,9 +122,44 @@ export class LoginDialogComponent extends Container {
104
122
  this.contentContainer.addChild(new Text(theme.fg("dim", hyperlink), 1, 0));
105
123
  this.contentContainer.addChild(new Spacer(1));
106
124
  this.contentContainer.addChild(new Text(theme.fg("warning", `Enter code: ${info.userCode}`), 1, 0));
107
- openBrowser(info.verificationUri);
125
+ if (!this.signal.aborted && (info.openBrowserOnConfirm || info.copyCodeOnConfirm)) {
126
+ const actionLabel = info.openBrowserOnConfirm
127
+ ? info.copyCodeOnConfirm
128
+ ? "to open browser and copy code"
129
+ : "to open browser"
130
+ : "to copy code";
131
+ const hint = new Container();
132
+ hint.addChild(new TruncatedText(`(${keyHint("tui.select.confirm", actionLabel)})`, 1, 0));
133
+ this.contentContainer.addChild(hint);
134
+ this.deviceCodeHint = hint;
135
+ this.deviceCodeAction = { info, hint };
136
+ }
137
+ this.tui.requestRender();
138
+ }
139
+ setDeviceCodeStatus(hint, message) {
140
+ if (this.signal.aborted || !this.focused || !this.contentContainer.children.includes(hint))
141
+ return;
142
+ hint.children = [new TruncatedText(theme.fg("dim", message), 1, 0)];
108
143
  this.tui.requestRender();
109
144
  }
145
+ activateDeviceCode(info, hint) {
146
+ this.setDeviceCodeStatus(hint, info.copyCodeOnConfirm ? "Copying code..." : "Browser open requested");
147
+ if (info.copyCodeOnConfirm) {
148
+ void copyToClipboard(info.userCode)
149
+ .then(() => this.setDeviceCodeStatus(hint, "Code copied to clipboard"))
150
+ .catch(() => this.setDeviceCodeStatus(hint, "Copy code manually"));
151
+ }
152
+ if (info.openBrowserOnConfirm) {
153
+ try {
154
+ const url = new URL(info.verificationUri);
155
+ if (url.protocol === "https:" || url.protocol === "http:")
156
+ openBrowser(url.href);
157
+ }
158
+ catch {
159
+ // Invalid URLs or launcher failures must not interrupt login.
160
+ }
161
+ }
162
+ }
110
163
  replaceInputWithSubmittedText(value) {
111
164
  this.contentContainer.children = this.contentContainer.children.map((child) => child === this.input ? new Text(`> ${value}`, 0, 0) : child);
112
165
  }
@@ -120,6 +173,7 @@ export class LoginDialogComponent extends Container {
120
173
  * Show input for manual code/URL entry (for callback server providers)
121
174
  */
122
175
  showManualInput(prompt) {
176
+ this.clearDeviceCodeAction();
123
177
  this.removeAuthCancelHint();
124
178
  this.input.setValue("");
125
179
  this.contentContainer.addChild(new Spacer(1));
@@ -143,6 +197,7 @@ export class LoginDialogComponent extends Container {
143
197
  * Note: Does NOT clear content, appends to existing (preserves URL from showAuth)
144
198
  */
145
199
  showPrompt(message, placeholder) {
200
+ this.clearDeviceCodeAction();
146
201
  this.removeAuthCancelHint();
147
202
  this.contentContainer.addChild(new Spacer(1));
148
203
  this.contentContainer.addChild(new Text(theme.fg("text", message), 1, 0));
@@ -161,6 +216,7 @@ export class LoginDialogComponent extends Container {
161
216
  /** Show static informational details and a close hint. */
162
217
  showDetails(lines) {
163
218
  this.authUrl = undefined;
219
+ this.clearDeviceCodeAction();
164
220
  this.contentContainer.clear();
165
221
  this.authCancelHint = undefined;
166
222
  this.contentContainer.addChild(new Spacer(1));
@@ -208,6 +264,17 @@ export class LoginDialogComponent extends Container {
208
264
  void this.authUrl.copy();
209
265
  return true;
210
266
  }
267
+ if (this.deviceCodeAction &&
268
+ !this.inputResolver &&
269
+ !this.signal.aborted &&
270
+ this.focused &&
271
+ kb.matches(data, "tui.select.confirm")) {
272
+ const action = this.deviceCodeAction;
273
+ this.deviceCodeAction = undefined;
274
+ this.activateDeviceCode(action.info, action.hint);
275
+ this.tui.requestRender();
276
+ return true;
277
+ }
211
278
  // Pass to input
212
279
  this.input.handleInput(data);
213
280
  return true;
@@ -1 +1 @@
1
- {"version":3,"file":"login-dialog.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/login-dialog.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAkB,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAY,MAAM,wBAAwB,CAAC;AAClH,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEhD;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,SAAS;IAC1C,gBAAgB,CAAY;IAC5B,KAAK,CAAQ;IACb,GAAG,CAAM;IACT,OAAO,CAAoB;IAC3B,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;IACxC,aAAa,CAA2B;IACxC,aAAa,CAA0B;IACvC,cAAc,CAAQ;IAE9B,2EAA2E;IACnE,QAAQ,GAAG,KAAK,CAAC;IACzB,IAAI,OAAO;QACV,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IACD,IAAI,OAAO,CAAC,KAAc;QACzB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;IAC5B,CAAC;IAID,YACC,GAAQ,EACR,UAAkB,EAClB,UAAwD,EACxD,oBAA6B,EAC7B,aAAsB;QAEtB,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QAEf,MAAM,YAAY,GAAG,oBAAoB,IAAI,UAAU,CAAC;QACxD,MAAM,KAAK,GAAG,aAAa,IAAI,YAAY,YAAY,EAAE,CAAC;QAE1D,aAAa;QACb,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;QAEnC,QAAQ;QACR,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAErE,uBAAuB;QACvB,IAAI,CAAC,gBAAgB,GAAG,IAAI,SAAS,EAAE,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAErC,2CAA2C;QAC3C,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,EAAE;YAC1B,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACxB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACpC,IAAI,CAAC,6BAA6B,CAAC,KAAK,CAAC,CAAC;gBAC1C,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBAC1B,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;gBAC/B,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;YAChC,CAAC;QACF,CAAC,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,EAAE;YAC1B,IAAI,CAAC,MAAM,EAAE,CAAC;QACf,CAAC,CAAC;QAEF,gBAAgB;QAChB,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,MAAM;QACT,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;IACpC,CAAC;IAEO,MAAM;QACb,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;YACjD,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;YAC/B,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QAChC,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,QAAQ,CACP,GAAW,EACX,YAAqB,EACrB,OAAO,GAA4D,EAAE;QAErE,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;QAChC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACnD,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE7C,IAAI,YAAY,EAAE,CAAC;YAClB,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACnF,CAAC;QAED,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAC5B,IAAI,CAAC,cAAc,GAAG,IAAI,IAAI,CAAC,IAAI,OAAO,CAAC,mBAAmB,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACpF,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACrD,CAAC;QAED,IAAI,OAAO,CAAC,eAAe,IAAI,IAAI,EAAE,CAAC;YACrC,WAAW,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,IAAyB;QACvC,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QACzB,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;QAChC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM,SAAS,GAAG,WAAW,IAAI,CAAC,eAAe,OAAO,IAAI,CAAC,eAAe,cAAc,CAAC;QAC3F,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAE9E,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,oBAAoB,CAAC;QAC7F,MAAM,SAAS,GAAG,WAAW,IAAI,CAAC,eAAe,OAAO,SAAS,cAAc,CAAC;QAChF,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3E,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,eAAe,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAEpG,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC1B,CAAC;IAEO,6BAA6B,CAAC,KAAa;QAClD,IAAI,CAAC,gBAAgB,CAAC,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAC7E,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAC3D,CAAC;IACH,CAAC;IAEO,oBAAoB;QAC3B,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,OAAO;QACjC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,cAAc,CAAC,CAAC;QACjH,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,MAAc;QAC7B,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,IAAI,OAAO,CAAC,mBAAmB,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9F,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAEzB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACtC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;YAC7B,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;QAC7B,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,wFAAwF;IACxF,mBAAmB;QAClB,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,CAAC;QACzB,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QAC/B,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,UAAU,CAAC,OAAe,EAAE,WAAoB;QAC/C,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1E,IAAI,WAAW,EAAE,CAAC;YACjB,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACzF,CAAC;QACD,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAC7B,IAAI,IAAI,CAAC,IAAI,OAAO,CAAC,mBAAmB,EAAE,SAAS,CAAC,IAAI,OAAO,CAAC,oBAAoB,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CACzG,CAAC;QAEF,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAEzB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACtC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;YAC7B,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;QAC7B,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,0DAA0D;IAC1D,WAAW,CAAC,KAAe;QAC1B,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QACzB,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;QAChC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/E,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,IAAI,OAAO,CAAC,mBAAmB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7F,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC1B,CAAC;IAED,+DAA+D;IAC/D,QAAQ,CAAC,OAAe,EAAE,KAAK,GAA4B,EAAE;QAC5D,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YAClE,MAAM,SAAS,GAAG,WAAW,IAAI,CAAC,GAAG,OAAO,IAAI,cAAc,CAAC;YAC/D,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/E,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,OAAe;QAC1B,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,IAAI,OAAO,CAAC,mBAAmB,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9F,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,OAAe;QAC3B,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC1B,CAAC;IAED,WAAW,CAAC,IAAY;QACvB,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;QAE5B,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,mBAAmB,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,OAAO,IAAI,CAAC;QACb,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,kBAAkB,CAAC,EAAE,CAAC;YAC1D,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC;QACb,CAAC;QAED,gBAAgB;QAChB,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IACb,CAAC;CACD","sourcesContent":["import type { AuthInfoLink, OAuthDeviceCodeInfo } from \"@bastani/pi-ai\";\nimport { Container, type Focusable, getKeybindings, Input, Spacer, Text, type TUI } from \"@earendil-works/pi-tui\";\nimport { openBrowser } from \"../../../utils/open-browser.ts\";\nimport { theme } from \"../theme/theme.js\";\nimport { AuthUrlComponent } from \"./auth-url.js\";\nimport { DynamicBorder } from \"./dynamic-border.ts\";\nimport { keyHint } from \"./keybinding-hints.js\";\n\n/**\n * Login dialog component - replaces editor during OAuth login flow\n */\nexport class LoginDialogComponent extends Container implements Focusable {\n\tprivate contentContainer: Container;\n\tprivate input: Input;\n\tprivate tui: TUI;\n\tprivate authUrl?: AuthUrlComponent;\n\tprivate abortController = new AbortController();\n\tprivate inputResolver?: (value: string) => void;\n\tprivate inputRejecter?: (error: Error) => void;\n\tprivate authCancelHint?: Text;\n\n\t// Focusable implementation - propagate to input for IME cursor positioning\n\tprivate _focused = false;\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t\tthis.input.focused = value;\n\t}\n\n\tprivate declare onComplete: (success: boolean, message?: string) => void;\n\n\tconstructor(\n\t\ttui: TUI,\n\t\tproviderId: string,\n\t\tonComplete: (success: boolean, message?: string) => void,\n\t\tproviderNameOverride?: string,\n\t\ttitleOverride?: string,\n\t) {\n\t\tsuper();\n\t\tthis.onComplete = onComplete;\n\t\tthis.tui = tui;\n\n\t\tconst providerName = providerNameOverride || providerId;\n\t\tconst title = titleOverride ?? `Login to ${providerName}`;\n\n\t\t// Top border\n\t\tthis.addChild(new DynamicBorder());\n\n\t\t// Title\n\t\tthis.addChild(new Text(theme.fg(\"accent\", theme.bold(title)), 1, 0));\n\n\t\t// Dynamic content area\n\t\tthis.contentContainer = new Container();\n\t\tthis.addChild(this.contentContainer);\n\n\t\t// Input (always present, used when needed)\n\t\tthis.input = new Input();\n\t\tthis.input.onSubmit = () => {\n\t\t\tif (this.inputResolver) {\n\t\t\t\tconst value = this.input.getValue();\n\t\t\t\tthis.replaceInputWithSubmittedText(value);\n\t\t\t\tthis.inputResolver(value);\n\t\t\t\tthis.inputResolver = undefined;\n\t\t\t\tthis.inputRejecter = undefined;\n\t\t\t}\n\t\t};\n\t\tthis.input.onEscape = () => {\n\t\t\tthis.cancel();\n\t\t};\n\n\t\t// Bottom border\n\t\tthis.addChild(new DynamicBorder());\n\t}\n\n\tget signal(): AbortSignal {\n\t\treturn this.abortController.signal;\n\t}\n\n\tprivate cancel(): void {\n\t\tthis.abortController.abort();\n\t\tif (this.inputRejecter) {\n\t\t\tthis.inputRejecter(new Error(\"Login cancelled\"));\n\t\t\tthis.inputResolver = undefined;\n\t\t\tthis.inputRejecter = undefined;\n\t\t}\n\t\tthis.onComplete(false, \"Login cancelled\");\n\t}\n\n\t/**\n\t * Called by onAuth callback - show URL and optional instructions\n\t */\n\tshowAuth(\n\t\turl: string,\n\t\tinstructions?: string,\n\t\toptions: { autoOpenBrowser?: boolean; showCancelHint?: boolean } = {},\n\t): void {\n\t\tthis.contentContainer.clear();\n\t\tthis.authCancelHint = undefined;\n\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\tthis.authUrl = new AuthUrlComponent(this.tui, url);\n\t\tthis.contentContainer.addChild(this.authUrl);\n\n\t\tif (instructions) {\n\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\tthis.contentContainer.addChild(new Text(theme.fg(\"warning\", instructions), 1, 0));\n\t\t}\n\n\t\tif (options.showCancelHint) {\n\t\t\tthis.authCancelHint = new Text(`(${keyHint(\"tui.select.cancel\", \"Cancel\")})`, 1, 0);\n\t\t\tthis.contentContainer.addChild(this.authCancelHint);\n\t\t}\n\n\t\tif (options.autoOpenBrowser ?? true) {\n\t\t\topenBrowser(url);\n\t\t}\n\t\tthis.tui.requestRender();\n\t}\n\n\t/**\n\t * Called by onDeviceCode callback - show URL and user code.\n\t */\n\tshowDeviceCode(info: OAuthDeviceCodeInfo): void {\n\t\tthis.authUrl = undefined;\n\t\tthis.contentContainer.clear();\n\t\tthis.authCancelHint = undefined;\n\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\tconst linkedUrl = `\\x1b]8;;${info.verificationUri}\\x07${info.verificationUri}\\x1b]8;;\\x07`;\n\t\tthis.contentContainer.addChild(new Text(theme.fg(\"accent\", linkedUrl), 1, 0));\n\n\t\tconst clickHint = process.platform === \"darwin\" ? \"Cmd+click to open\" : \"Ctrl+click to open\";\n\t\tconst hyperlink = `\\x1b]8;;${info.verificationUri}\\x07${clickHint}\\x1b]8;;\\x07`;\n\t\tthis.contentContainer.addChild(new Text(theme.fg(\"dim\", hyperlink), 1, 0));\n\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\tthis.contentContainer.addChild(new Text(theme.fg(\"warning\", `Enter code: ${info.userCode}`), 1, 0));\n\n\t\topenBrowser(info.verificationUri);\n\t\tthis.tui.requestRender();\n\t}\n\n\tprivate replaceInputWithSubmittedText(value: string): void {\n\t\tthis.contentContainer.children = this.contentContainer.children.map((child) =>\n\t\t\tchild === this.input ? new Text(`> ${value}`, 0, 0) : child,\n\t\t);\n\t}\n\n\tprivate removeAuthCancelHint(): void {\n\t\tif (!this.authCancelHint) return;\n\t\tthis.contentContainer.children = this.contentContainer.children.filter((child) => child !== this.authCancelHint);\n\t\tthis.authCancelHint = undefined;\n\t}\n\n\t/**\n\t * Show input for manual code/URL entry (for callback server providers)\n\t */\n\tshowManualInput(prompt: string): Promise<string> {\n\t\tthis.removeAuthCancelHint();\n\t\tthis.input.setValue(\"\");\n\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\tthis.contentContainer.addChild(new Text(theme.fg(\"dim\", prompt), 1, 0));\n\t\tthis.contentContainer.addChild(this.input);\n\t\tthis.contentContainer.addChild(new Text(`(${keyHint(\"tui.select.cancel\", \"Cancel\")})`, 1, 0));\n\t\tthis.tui.requestRender();\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.inputResolver = resolve;\n\t\t\tthis.inputRejecter = reject;\n\t\t});\n\t}\n\n\t/** Resolve and release a manual input prompt after an out-of-band callback succeeds. */\n\tdismissPendingInput(): void {\n\t\tthis.inputResolver?.(\"\");\n\t\tthis.inputResolver = undefined;\n\t\tthis.inputRejecter = undefined;\n\t}\n\n\t/**\n\t * Called by onPrompt callback - show prompt and wait for input\n\t * Note: Does NOT clear content, appends to existing (preserves URL from showAuth)\n\t */\n\tshowPrompt(message: string, placeholder?: string): Promise<string> {\n\t\tthis.removeAuthCancelHint();\n\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\tthis.contentContainer.addChild(new Text(theme.fg(\"text\", message), 1, 0));\n\t\tif (placeholder) {\n\t\t\tthis.contentContainer.addChild(new Text(theme.fg(\"dim\", `e.g., ${placeholder}`), 1, 0));\n\t\t}\n\t\tthis.contentContainer.addChild(this.input);\n\t\tthis.contentContainer.addChild(\n\t\t\tnew Text(`(${keyHint(\"tui.select.cancel\", \"Cancel,\")} ${keyHint(\"tui.select.confirm\", \"Submit\")})`, 1, 0),\n\t\t);\n\n\t\tthis.input.setValue(\"\");\n\t\tthis.tui.requestRender();\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.inputResolver = resolve;\n\t\t\tthis.inputRejecter = reject;\n\t\t});\n\t}\n\n\t/** Show static informational details and a close hint. */\n\tshowDetails(lines: string[]): void {\n\t\tthis.authUrl = undefined;\n\t\tthis.contentContainer.clear();\n\t\tthis.authCancelHint = undefined;\n\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\tfor (const line of lines) this.contentContainer.addChild(new Text(line, 1, 0));\n\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\tthis.contentContainer.addChild(new Text(`(${keyHint(\"tui.select.cancel\", \"Close\")})`, 1, 0));\n\t\tthis.tui.requestRender();\n\t}\n\n\t/** Show provider-owned information and terminal hyperlinks. */\n\tshowInfo(message: string, links: readonly AuthInfoLink[] = []): void {\n\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\tthis.contentContainer.addChild(new Text(theme.fg(\"text\", message), 1, 0));\n\t\tfor (const link of links) {\n\t\t\tconst text = link.label ? `${link.label}: ${link.url}` : link.url;\n\t\t\tconst hyperlink = `\\x1b]8;;${link.url}\\x07${text}\\x1b]8;;\\x07`;\n\t\t\tthis.contentContainer.addChild(new Text(theme.fg(\"accent\", hyperlink), 1, 0));\n\t\t}\n\t\tthis.tui.requestRender();\n\t}\n\n\t/**\n\t * Show waiting message (for polling flows like GitHub Copilot)\n\t */\n\tshowWaiting(message: string): void {\n\t\tthis.removeAuthCancelHint();\n\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\tthis.contentContainer.addChild(new Text(theme.fg(\"dim\", message), 1, 0));\n\t\tthis.contentContainer.addChild(new Text(`(${keyHint(\"tui.select.cancel\", \"Cancel\")})`, 1, 0));\n\t\tthis.tui.requestRender();\n\t}\n\n\t/**\n\t * Called by onProgress callback\n\t */\n\tshowProgress(message: string): void {\n\t\tthis.contentContainer.addChild(new Text(theme.fg(\"dim\", message), 1, 0));\n\t\tthis.tui.requestRender();\n\t}\n\n\thandleInput(data: string): boolean {\n\t\tconst kb = getKeybindings();\n\n\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.cancel();\n\t\t\treturn true;\n\t\t}\n\t\tif (this.authUrl && kb.matches(data, \"app.auth.copyUrl\")) {\n\t\t\tvoid this.authUrl.copy();\n\t\t\treturn true;\n\t\t}\n\n\t\t// Pass to input\n\t\tthis.input.handleInput(data);\n\t\treturn true;\n\t}\n}\n"]}
1
+ {"version":3,"file":"login-dialog.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/login-dialog.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AuthInfoLink, OAuthDeviceCodeInfo } from \"@bastani/pi-ai\";\nimport {\n\tContainer,\n\ttype Focusable,\n\tgetKeybindings,\n\tInput,\n\tSpacer,\n\tText,\n\tTruncatedText,\n\ttype TUI,\n} from \"@earendil-works/pi-tui\";\nimport { copyToClipboard } from \"../../../utils/clipboard.js\";\nimport { openBrowser } from \"../../../utils/open-browser.ts\";\nimport { theme } from \"../theme/theme.js\";\nimport { AuthUrlComponent } from \"./auth-url.js\";\nimport { DynamicBorder } from \"./dynamic-border.ts\";\nimport { keyHint } from \"./keybinding-hints.js\";\n\n/**\n * Login dialog component - replaces editor during OAuth login flow\n */\nexport class LoginDialogComponent extends Container implements Focusable {\n\tprivate contentContainer: Container;\n\tprivate input: Input;\n\tprivate tui: TUI;\n\tprivate authUrl?: AuthUrlComponent;\n\tprivate abortController = new AbortController();\n\tprivate inputResolver?: (value: string) => void;\n\tprivate inputRejecter?: (error: Error) => void;\n\tprivate authCancelHint?: Text;\n\tprivate deviceCodeAction?: { info: OAuthDeviceCodeInfo; hint: Container };\n\tprivate deviceCodeHint?: Container;\n\n\t// Focusable implementation - propagate to input for IME cursor positioning\n\tprivate _focused = false;\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t\tthis.input.focused = value;\n\t}\n\n\tprivate declare onComplete: (success: boolean, message?: string) => void;\n\n\tconstructor(\n\t\ttui: TUI,\n\t\tproviderId: string,\n\t\tonComplete: (success: boolean, message?: string) => void,\n\t\tproviderNameOverride?: string,\n\t\ttitleOverride?: string,\n\t) {\n\t\tsuper();\n\t\tthis.onComplete = onComplete;\n\t\tthis.tui = tui;\n\n\t\tconst providerName = providerNameOverride || providerId;\n\t\tconst title = titleOverride ?? `Login to ${providerName}`;\n\n\t\t// Top border\n\t\tthis.addChild(new DynamicBorder());\n\n\t\t// Title\n\t\tthis.addChild(new Text(theme.fg(\"accent\", theme.bold(title)), 1, 0));\n\n\t\t// Dynamic content area\n\t\tthis.contentContainer = new Container();\n\t\tthis.addChild(this.contentContainer);\n\n\t\t// Input (always present, used when needed)\n\t\tthis.input = new Input();\n\t\tthis.input.onSubmit = () => {\n\t\t\tif (this.inputResolver) {\n\t\t\t\tconst value = this.input.getValue();\n\t\t\t\tthis.replaceInputWithSubmittedText(value);\n\t\t\t\tthis.inputResolver(value);\n\t\t\t\tthis.inputResolver = undefined;\n\t\t\t\tthis.inputRejecter = undefined;\n\t\t\t}\n\t\t};\n\t\tthis.input.onEscape = () => {\n\t\t\tthis.cancel();\n\t\t};\n\n\t\t// Bottom border\n\t\tthis.addChild(new DynamicBorder());\n\t}\n\n\tget signal(): AbortSignal {\n\t\treturn this.abortController.signal;\n\t}\n\n\tprivate clearDeviceCodeAction(): void {\n\t\tif (this.deviceCodeHint) {\n\t\t\tthis.contentContainer.removeChild(this.deviceCodeHint);\n\t\t}\n\t\tthis.deviceCodeHint = undefined;\n\t\tthis.deviceCodeAction = undefined;\n\t}\n\n\tprivate cancel(): void {\n\t\tthis.clearDeviceCodeAction();\n\t\tthis.abortController.abort();\n\t\tif (this.inputRejecter) {\n\t\t\tthis.inputRejecter(new Error(\"Login cancelled\"));\n\t\t\tthis.inputResolver = undefined;\n\t\t\tthis.inputRejecter = undefined;\n\t\t}\n\t\tthis.onComplete(false, \"Login cancelled\");\n\t}\n\n\t/**\n\t * Called by onAuth callback - show URL and optional instructions\n\t */\n\tshowAuth(\n\t\turl: string,\n\t\tinstructions?: string,\n\t\toptions: { autoOpenBrowser?: boolean; showCancelHint?: boolean } = {},\n\t): void {\n\t\tthis.clearDeviceCodeAction();\n\t\tthis.contentContainer.clear();\n\t\tthis.authCancelHint = undefined;\n\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\tthis.authUrl = new AuthUrlComponent(this.tui, url);\n\t\tthis.contentContainer.addChild(this.authUrl);\n\n\t\tif (instructions) {\n\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\tthis.contentContainer.addChild(new Text(theme.fg(\"warning\", instructions), 1, 0));\n\t\t}\n\n\t\tif (options.showCancelHint) {\n\t\t\tthis.authCancelHint = new Text(`(${keyHint(\"tui.select.cancel\", \"Cancel\")})`, 1, 0);\n\t\t\tthis.contentContainer.addChild(this.authCancelHint);\n\t\t}\n\n\t\tif (options.autoOpenBrowser ?? true) {\n\t\t\topenBrowser(url);\n\t\t}\n\t\tthis.tui.requestRender();\n\t}\n\n\t/**\n\t * Called by onDeviceCode callback - show URL and user code.\n\t */\n\tshowDeviceCode(info: OAuthDeviceCodeInfo): void {\n\t\tthis.authUrl = undefined;\n\t\tinfo = {\n\t\t\t...info,\n\t\t\topenBrowserOnConfirm: info.openBrowserOnConfirm ?? true,\n\t\t\tcopyCodeOnConfirm: info.copyCodeOnConfirm ?? true,\n\t\t};\n\t\tthis.clearDeviceCodeAction();\n\t\tthis.contentContainer.clear();\n\t\tthis.authCancelHint = undefined;\n\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\tconst linkedUrl = `\\x1b]8;;${info.verificationUri}\\x07${info.verificationUri}\\x1b]8;;\\x07`;\n\t\tthis.contentContainer.addChild(new Text(theme.fg(\"accent\", linkedUrl), 1, 0));\n\n\t\tconst clickHint = process.platform === \"darwin\" ? \"Cmd+click to open\" : \"Ctrl+click to open\";\n\t\tconst hyperlink = `\\x1b]8;;${info.verificationUri}\\x07${clickHint}\\x1b]8;;\\x07`;\n\t\tthis.contentContainer.addChild(new Text(theme.fg(\"dim\", hyperlink), 1, 0));\n\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\tthis.contentContainer.addChild(new Text(theme.fg(\"warning\", `Enter code: ${info.userCode}`), 1, 0));\n\n\t\tif (!this.signal.aborted && (info.openBrowserOnConfirm || info.copyCodeOnConfirm)) {\n\t\t\tconst actionLabel = info.openBrowserOnConfirm\n\t\t\t\t? info.copyCodeOnConfirm\n\t\t\t\t\t? \"to open browser and copy code\"\n\t\t\t\t\t: \"to open browser\"\n\t\t\t\t: \"to copy code\";\n\t\t\tconst hint = new Container();\n\t\t\thint.addChild(new TruncatedText(`(${keyHint(\"tui.select.confirm\", actionLabel)})`, 1, 0));\n\t\t\tthis.contentContainer.addChild(hint);\n\t\t\tthis.deviceCodeHint = hint;\n\t\t\tthis.deviceCodeAction = { info, hint };\n\t\t}\n\t\tthis.tui.requestRender();\n\t}\n\n\tprivate setDeviceCodeStatus(hint: Container, message: string): void {\n\t\tif (this.signal.aborted || !this.focused || !this.contentContainer.children.includes(hint)) return;\n\t\thint.children = [new TruncatedText(theme.fg(\"dim\", message), 1, 0)];\n\t\tthis.tui.requestRender();\n\t}\n\n\tprivate activateDeviceCode(info: OAuthDeviceCodeInfo, hint: Container): void {\n\t\tthis.setDeviceCodeStatus(hint, info.copyCodeOnConfirm ? \"Copying code...\" : \"Browser open requested\");\n\t\tif (info.copyCodeOnConfirm) {\n\t\t\tvoid copyToClipboard(info.userCode)\n\t\t\t\t.then(() => this.setDeviceCodeStatus(hint, \"Code copied to clipboard\"))\n\t\t\t\t.catch(() => this.setDeviceCodeStatus(hint, \"Copy code manually\"));\n\t\t}\n\t\tif (info.openBrowserOnConfirm) {\n\t\t\ttry {\n\t\t\t\tconst url = new URL(info.verificationUri);\n\t\t\t\tif (url.protocol === \"https:\" || url.protocol === \"http:\") openBrowser(url.href);\n\t\t\t} catch {\n\t\t\t\t// Invalid URLs or launcher failures must not interrupt login.\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate replaceInputWithSubmittedText(value: string): void {\n\t\tthis.contentContainer.children = this.contentContainer.children.map((child) =>\n\t\t\tchild === this.input ? new Text(`> ${value}`, 0, 0) : child,\n\t\t);\n\t}\n\n\tprivate removeAuthCancelHint(): void {\n\t\tif (!this.authCancelHint) return;\n\t\tthis.contentContainer.children = this.contentContainer.children.filter((child) => child !== this.authCancelHint);\n\t\tthis.authCancelHint = undefined;\n\t}\n\n\t/**\n\t * Show input for manual code/URL entry (for callback server providers)\n\t */\n\tshowManualInput(prompt: string): Promise<string> {\n\t\tthis.clearDeviceCodeAction();\n\t\tthis.removeAuthCancelHint();\n\t\tthis.input.setValue(\"\");\n\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\tthis.contentContainer.addChild(new Text(theme.fg(\"dim\", prompt), 1, 0));\n\t\tthis.contentContainer.addChild(this.input);\n\t\tthis.contentContainer.addChild(new Text(`(${keyHint(\"tui.select.cancel\", \"Cancel\")})`, 1, 0));\n\t\tthis.tui.requestRender();\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.inputResolver = resolve;\n\t\t\tthis.inputRejecter = reject;\n\t\t});\n\t}\n\n\t/** Resolve and release a manual input prompt after an out-of-band callback succeeds. */\n\tdismissPendingInput(): void {\n\t\tthis.inputResolver?.(\"\");\n\t\tthis.inputResolver = undefined;\n\t\tthis.inputRejecter = undefined;\n\t}\n\n\t/**\n\t * Called by onPrompt callback - show prompt and wait for input\n\t * Note: Does NOT clear content, appends to existing (preserves URL from showAuth)\n\t */\n\tshowPrompt(message: string, placeholder?: string): Promise<string> {\n\t\tthis.clearDeviceCodeAction();\n\t\tthis.removeAuthCancelHint();\n\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\tthis.contentContainer.addChild(new Text(theme.fg(\"text\", message), 1, 0));\n\t\tif (placeholder) {\n\t\t\tthis.contentContainer.addChild(new Text(theme.fg(\"dim\", `e.g., ${placeholder}`), 1, 0));\n\t\t}\n\t\tthis.contentContainer.addChild(this.input);\n\t\tthis.contentContainer.addChild(\n\t\t\tnew Text(`(${keyHint(\"tui.select.cancel\", \"Cancel,\")} ${keyHint(\"tui.select.confirm\", \"Submit\")})`, 1, 0),\n\t\t);\n\n\t\tthis.input.setValue(\"\");\n\t\tthis.tui.requestRender();\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.inputResolver = resolve;\n\t\t\tthis.inputRejecter = reject;\n\t\t});\n\t}\n\n\t/** Show static informational details and a close hint. */\n\tshowDetails(lines: string[]): void {\n\t\tthis.authUrl = undefined;\n\t\tthis.clearDeviceCodeAction();\n\t\tthis.contentContainer.clear();\n\t\tthis.authCancelHint = undefined;\n\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\tfor (const line of lines) this.contentContainer.addChild(new Text(line, 1, 0));\n\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\tthis.contentContainer.addChild(new Text(`(${keyHint(\"tui.select.cancel\", \"Close\")})`, 1, 0));\n\t\tthis.tui.requestRender();\n\t}\n\n\t/** Show provider-owned information and terminal hyperlinks. */\n\tshowInfo(message: string, links: readonly AuthInfoLink[] = []): void {\n\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\tthis.contentContainer.addChild(new Text(theme.fg(\"text\", message), 1, 0));\n\t\tfor (const link of links) {\n\t\t\tconst text = link.label ? `${link.label}: ${link.url}` : link.url;\n\t\t\tconst hyperlink = `\\x1b]8;;${link.url}\\x07${text}\\x1b]8;;\\x07`;\n\t\t\tthis.contentContainer.addChild(new Text(theme.fg(\"accent\", hyperlink), 1, 0));\n\t\t}\n\t\tthis.tui.requestRender();\n\t}\n\n\t/**\n\t * Show waiting message (for polling flows like GitHub Copilot)\n\t */\n\tshowWaiting(message: string): void {\n\t\tthis.removeAuthCancelHint();\n\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\tthis.contentContainer.addChild(new Text(theme.fg(\"dim\", message), 1, 0));\n\t\tthis.contentContainer.addChild(new Text(`(${keyHint(\"tui.select.cancel\", \"Cancel\")})`, 1, 0));\n\t\tthis.tui.requestRender();\n\t}\n\n\t/**\n\t * Called by onProgress callback\n\t */\n\tshowProgress(message: string): void {\n\t\tthis.contentContainer.addChild(new Text(theme.fg(\"dim\", message), 1, 0));\n\t\tthis.tui.requestRender();\n\t}\n\n\thandleInput(data: string): boolean {\n\t\tconst kb = getKeybindings();\n\n\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.cancel();\n\t\t\treturn true;\n\t\t}\n\t\tif (this.authUrl && kb.matches(data, \"app.auth.copyUrl\")) {\n\t\t\tvoid this.authUrl.copy();\n\t\t\treturn true;\n\t\t}\n\n\t\tif (\n\t\t\tthis.deviceCodeAction &&\n\t\t\t!this.inputResolver &&\n\t\t\t!this.signal.aborted &&\n\t\t\tthis.focused &&\n\t\t\tkb.matches(data, \"tui.select.confirm\")\n\t\t) {\n\t\t\tconst action = this.deviceCodeAction;\n\t\t\tthis.deviceCodeAction = undefined;\n\t\t\tthis.activateDeviceCode(action.info, action.hint);\n\t\t\tthis.tui.requestRender();\n\t\t\treturn true;\n\t\t}\n\n\t\t// Pass to input\n\t\tthis.input.handleInput(data);\n\t\treturn true;\n\t}\n}\n"]}
@@ -1,3 +1,3 @@
1
1
  import type { MarkdownTransformContext, MarkdownTransformer } from "../../../core/extensions/types.ts";
2
- export declare function createMarkdownTransform(messageType: MarkdownTransformContext["messageType"], isStreaming: boolean, transformers: readonly MarkdownTransformer[]): (markdown: string, availableWidth: number) => string;
2
+ export declare function createMarkdownTransform(messageType: MarkdownTransformContext["messageType"], isStreaming: boolean, transformers: readonly MarkdownTransformer[], messageId?: string, timestamp?: string): (markdown: string, availableWidth: number) => string;
3
3
  //# sourceMappingURL=markdown-transform.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"markdown-transform.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/markdown-transform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAEvG,wBAAgB,uBAAuB,CACtC,WAAW,EAAE,wBAAwB,CAAC,aAAa,CAAC,EACpD,WAAW,EAAE,OAAO,EACpB,YAAY,EAAE,SAAS,mBAAmB,EAAE,GAC1C,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,MAAM,CAGtD"}
1
+ {"version":3,"file":"markdown-transform.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/markdown-transform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAEvG,wBAAgB,uBAAuB,CACtC,WAAW,EAAE,wBAAwB,CAAC,aAAa,CAAC,EACpD,WAAW,EAAE,OAAO,EACpB,YAAY,EAAE,SAAS,mBAAmB,EAAE,EAC5C,SAAS,CAAC,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,GAChB,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,MAAM,CAOtD"}
@@ -1,5 +1,5 @@
1
- export function createMarkdownTransform(messageType, isStreaming, transformers) {
2
- return (markdown, availableWidth) => applyMarkdownTransformers(markdown, { messageType, isStreaming, availableWidth }, transformers);
1
+ export function createMarkdownTransform(messageType, isStreaming, transformers, messageId, timestamp) {
2
+ return (markdown, availableWidth) => applyMarkdownTransformers(markdown, { messageType, isStreaming, availableWidth, messageId, timestamp }, transformers);
3
3
  }
4
4
  function applyMarkdownTransformers(markdown, context, transformers) {
5
5
  let transformedMarkdown = markdown;
@@ -1 +1 @@
1
- {"version":3,"file":"markdown-transform.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/markdown-transform.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,uBAAuB,CACtC,WAAoD,EACpD,WAAoB,EACpB,YAA4C;IAE5C,OAAO,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,CACnC,yBAAyB,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,EAAE,YAAY,CAAC,CAAC;AAClG,CAAC;AAED,SAAS,yBAAyB,CACjC,QAAgB,EAChB,OAAiC,EACjC,YAA4C;IAE5C,IAAI,mBAAmB,GAAG,QAAQ,CAAC;IACnC,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;QACxC,IAAI,CAAC;YACJ,MAAM,WAAW,GAAG,WAAW,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;YAC9D,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;gBACrC,mBAAmB,GAAG,WAAW,CAAC;YACnC,CAAC;QACF,CAAC;QAAC,MAAM,CAAC;YACR,oEAAoE;QACrE,CAAC;IACF,CAAC;IACD,OAAO,mBAAmB,CAAC;AAC5B,CAAC","sourcesContent":["import type { MarkdownTransformContext, MarkdownTransformer } from \"../../../core/extensions/types.ts\";\n\nexport function createMarkdownTransform(\n\tmessageType: MarkdownTransformContext[\"messageType\"],\n\tisStreaming: boolean,\n\ttransformers: readonly MarkdownTransformer[],\n): (markdown: string, availableWidth: number) => string {\n\treturn (markdown, availableWidth) =>\n\t\tapplyMarkdownTransformers(markdown, { messageType, isStreaming, availableWidth }, transformers);\n}\n\nfunction applyMarkdownTransformers(\n\tmarkdown: string,\n\tcontext: MarkdownTransformContext,\n\ttransformers: readonly MarkdownTransformer[],\n): string {\n\tlet transformedMarkdown = markdown;\n\tfor (const transformer of transformers) {\n\t\ttry {\n\t\t\tconst transformed = transformer(transformedMarkdown, context);\n\t\t\tif (typeof transformed === \"string\") {\n\t\t\t\ttransformedMarkdown = transformed;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Keep the current Markdown and continue with the next transformer.\n\t\t}\n\t}\n\treturn transformedMarkdown;\n}\n"]}
1
+ {"version":3,"file":"markdown-transform.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/markdown-transform.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,uBAAuB,CACtC,WAAoD,EACpD,WAAoB,EACpB,YAA4C,EAC5C,SAAkB,EAClB,SAAkB;IAElB,OAAO,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,CACnC,yBAAyB,CACxB,QAAQ,EACR,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,EAClE,YAAY,CACZ,CAAC;AACJ,CAAC;AAED,SAAS,yBAAyB,CACjC,QAAgB,EAChB,OAAiC,EACjC,YAA4C;IAE5C,IAAI,mBAAmB,GAAG,QAAQ,CAAC;IACnC,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;QACxC,IAAI,CAAC;YACJ,MAAM,WAAW,GAAG,WAAW,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;YAC9D,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;gBACrC,mBAAmB,GAAG,WAAW,CAAC;YACnC,CAAC;QACF,CAAC;QAAC,MAAM,CAAC;YACR,oEAAoE;QACrE,CAAC;IACF,CAAC;IACD,OAAO,mBAAmB,CAAC;AAC5B,CAAC","sourcesContent":["import type { MarkdownTransformContext, MarkdownTransformer } from \"../../../core/extensions/types.ts\";\n\nexport function createMarkdownTransform(\n\tmessageType: MarkdownTransformContext[\"messageType\"],\n\tisStreaming: boolean,\n\ttransformers: readonly MarkdownTransformer[],\n\tmessageId?: string,\n\ttimestamp?: string,\n): (markdown: string, availableWidth: number) => string {\n\treturn (markdown, availableWidth) =>\n\t\tapplyMarkdownTransformers(\n\t\t\tmarkdown,\n\t\t\t{ messageType, isStreaming, availableWidth, messageId, timestamp },\n\t\t\ttransformers,\n\t\t);\n}\n\nfunction applyMarkdownTransformers(\n\tmarkdown: string,\n\tcontext: MarkdownTransformContext,\n\ttransformers: readonly MarkdownTransformer[],\n): string {\n\tlet transformedMarkdown = markdown;\n\tfor (const transformer of transformers) {\n\t\ttry {\n\t\t\tconst transformed = transformer(transformedMarkdown, context);\n\t\t\tif (typeof transformed === \"string\") {\n\t\t\t\ttransformedMarkdown = transformed;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Keep the current Markdown and continue with the next transformer.\n\t\t}\n\t}\n\treturn transformedMarkdown;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"session-selector-search.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/session-selector-search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAEpE,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE3D,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,OAAO,CAAC;AAEzC,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;IACzB,MAAM,EAAE;QAAE,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACtD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;CACd;AAUD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAE5D;AAOD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,CA2EjE;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,iBAAiB,GAAG,WAAW,CAsCzF;AAED,wBAAgB,qBAAqB,CACpC,QAAQ,EAAE,WAAW,EAAE,EACvB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,QAAQ,EAClB,UAAU,GAAE,UAAkB,GAC5B,WAAW,EAAE,CAiCf"}
1
+ {"version":3,"file":"session-selector-search.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/session-selector-search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAEpE,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE3D,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,OAAO,CAAC;AAEzC,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;IACzB,MAAM,EAAE;QAAE,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACtD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;CACd;AAmFD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAE5D;AAOD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,CA2EjE;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,iBAAiB,GAAG,WAAW,CAyBzF;AAED,wBAAgB,qBAAqB,CACpC,QAAQ,EAAE,WAAW,EAAE,EACvB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,QAAQ,EAClB,UAAU,GAAE,UAAkB,GAC5B,WAAW,EAAE,CAiCf"}