@caupulican/pi-adaptative 0.86.17 → 0.90.0

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 (290) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/README.md +1 -1
  3. package/dist/bundled-resources/extensions/tmux-agent-manager/index.d.ts.map +1 -1
  4. package/dist/bundled-resources/extensions/tmux-agent-manager/index.js +14 -15
  5. package/dist/bundled-resources/extensions/tmux-agent-manager/index.js.map +1 -1
  6. package/dist/bundled-resources/extensions/tmux-agent-manager/index.ts +14 -16
  7. package/dist/bundled-resources/skills/worker-profile-writer/SKILL.md +4 -4
  8. package/dist/core/agent-session.d.ts +23 -33
  9. package/dist/core/agent-session.d.ts.map +1 -1
  10. package/dist/core/agent-session.js +76 -109
  11. package/dist/core/agent-session.js.map +1 -1
  12. package/dist/core/autonomy/contracts.d.ts +1 -1
  13. package/dist/core/autonomy/contracts.js.map +1 -1
  14. package/dist/core/autonomy/gates.d.ts.map +1 -1
  15. package/dist/core/autonomy/gates.js +16 -0
  16. package/dist/core/autonomy/gates.js.map +1 -1
  17. package/dist/core/autonomy/subagent-prompt.d.ts +2 -1
  18. package/dist/core/autonomy/subagent-prompt.d.ts.map +1 -1
  19. package/dist/core/autonomy/subagent-prompt.js +2 -18
  20. package/dist/core/autonomy/subagent-prompt.js.map +1 -1
  21. package/dist/core/background-tool-task-controller.js +5 -5
  22. package/dist/core/background-tool-task-controller.js.map +1 -1
  23. package/dist/core/compaction-controller.d.ts +22 -2
  24. package/dist/core/compaction-controller.d.ts.map +1 -1
  25. package/dist/core/compaction-controller.js +75 -39
  26. package/dist/core/compaction-controller.js.map +1 -1
  27. package/dist/core/context/brain-curator.d.ts +2 -3
  28. package/dist/core/context/brain-curator.d.ts.map +1 -1
  29. package/dist/core/context/brain-curator.js +3 -20
  30. package/dist/core/context/brain-curator.js.map +1 -1
  31. package/dist/core/context/context-composition.d.ts +2 -1
  32. package/dist/core/context/context-composition.d.ts.map +1 -1
  33. package/dist/core/context/context-composition.js +6 -1
  34. package/dist/core/context/context-composition.js.map +1 -1
  35. package/dist/core/context/memory-prompt-block.js +1 -1
  36. package/dist/core/context/memory-prompt-block.js.map +1 -1
  37. package/dist/core/context/tool-output-packer.js +1 -1
  38. package/dist/core/context/tool-output-packer.js.map +1 -1
  39. package/dist/core/context-gc.js +10 -10
  40. package/dist/core/context-gc.js.map +1 -1
  41. package/dist/core/context-pipeline.d.ts +4 -4
  42. package/dist/core/context-pipeline.js +4 -4
  43. package/dist/core/context-pipeline.js.map +1 -1
  44. package/dist/core/default-tool-surface.d.ts.map +1 -1
  45. package/dist/core/default-tool-surface.js +1 -2
  46. package/dist/core/default-tool-surface.js.map +1 -1
  47. package/dist/core/delegation/session-worker-claim.d.ts +2 -2
  48. package/dist/core/delegation/session-worker-claim.js +2 -2
  49. package/dist/core/delegation/session-worker-claim.js.map +1 -1
  50. package/dist/core/delegation/worker-agent-control-coordinator.js +1 -1
  51. package/dist/core/delegation/worker-agent-control-coordinator.js.map +1 -1
  52. package/dist/core/delegation/worker-resource-materializer.js +3 -3
  53. package/dist/core/delegation/worker-resource-materializer.js.map +1 -1
  54. package/dist/core/delegation/worker-runner.d.ts +2 -13
  55. package/dist/core/delegation/worker-runner.d.ts.map +1 -1
  56. package/dist/core/delegation/worker-runner.js +5 -67
  57. package/dist/core/delegation/worker-runner.js.map +1 -1
  58. package/dist/core/extensions/builtin.js +4 -4
  59. package/dist/core/extensions/builtin.js.map +1 -1
  60. package/dist/core/extensions/runner.d.ts +6 -2
  61. package/dist/core/extensions/runner.d.ts.map +1 -1
  62. package/dist/core/extensions/runner.js +21 -9
  63. package/dist/core/extensions/runner.js.map +1 -1
  64. package/dist/core/extensions/types.d.ts +9 -2
  65. package/dist/core/extensions/types.d.ts.map +1 -1
  66. package/dist/core/extensions/types.js.map +1 -1
  67. package/dist/core/foreground-terminal-handoff-controller.js +2 -2
  68. package/dist/core/foreground-terminal-handoff-controller.js.map +1 -1
  69. package/dist/core/goals/compact-goal-context.d.ts.map +1 -1
  70. package/dist/core/goals/compact-goal-context.js +13 -9
  71. package/dist/core/goals/compact-goal-context.js.map +1 -1
  72. package/dist/core/goals/goal-continuation-prompt.js +1 -1
  73. package/dist/core/goals/goal-continuation-prompt.js.map +1 -1
  74. package/dist/core/human-input-controller.js +1 -1
  75. package/dist/core/human-input-controller.js.map +1 -1
  76. package/dist/core/improvement-loop.js +13 -13
  77. package/dist/core/improvement-loop.js.map +1 -1
  78. package/dist/core/learning/reflection-engine.d.ts +2 -1
  79. package/dist/core/learning/reflection-engine.d.ts.map +1 -1
  80. package/dist/core/learning/reflection-engine.js +4 -24
  81. package/dist/core/learning/reflection-engine.js.map +1 -1
  82. package/dist/core/model-capability.d.ts.map +1 -1
  83. package/dist/core/model-capability.js +1 -1
  84. package/dist/core/model-capability.js.map +1 -1
  85. package/dist/core/model-router/route-judge.d.ts +2 -1
  86. package/dist/core/model-router/route-judge.d.ts.map +1 -1
  87. package/dist/core/model-router/route-judge.js +4 -12
  88. package/dist/core/model-router/route-judge.js.map +1 -1
  89. package/dist/core/models/perf-profile.d.ts +1 -1
  90. package/dist/core/models/perf-profile.d.ts.map +1 -1
  91. package/dist/core/models/perf-profile.js +2 -8
  92. package/dist/core/models/perf-profile.js.map +1 -1
  93. package/dist/core/orchestration/lane-tool-manifests.d.ts +1 -1
  94. package/dist/core/orchestration/lane-tool-manifests.d.ts.map +1 -1
  95. package/dist/core/orchestration/lane-tool-manifests.js +1 -6
  96. package/dist/core/orchestration/lane-tool-manifests.js.map +1 -1
  97. package/dist/core/process-matrix/resume-launcher.js +3 -3
  98. package/dist/core/process-matrix/resume-launcher.js.map +1 -1
  99. package/dist/core/process-matrix/runtime.d.ts +2 -0
  100. package/dist/core/process-matrix/runtime.d.ts.map +1 -1
  101. package/dist/core/process-matrix/runtime.js +23 -19
  102. package/dist/core/process-matrix/runtime.js.map +1 -1
  103. package/dist/core/provider-prompt-contracts.d.ts +34 -0
  104. package/dist/core/provider-prompt-contracts.d.ts.map +1 -0
  105. package/dist/core/provider-prompt-contracts.js +133 -0
  106. package/dist/core/provider-prompt-contracts.js.map +1 -0
  107. package/dist/core/provider-request-context-controller.d.ts +40 -0
  108. package/dist/core/provider-request-context-controller.d.ts.map +1 -0
  109. package/dist/core/provider-request-context-controller.js +68 -0
  110. package/dist/core/provider-request-context-controller.js.map +1 -0
  111. package/dist/core/provider-request-runtime-controller.d.ts +22 -0
  112. package/dist/core/provider-request-runtime-controller.d.ts.map +1 -0
  113. package/dist/core/provider-request-runtime-controller.js +87 -0
  114. package/dist/core/provider-request-runtime-controller.js.map +1 -0
  115. package/dist/core/provider-tool-text.d.ts +7 -0
  116. package/dist/core/provider-tool-text.d.ts.map +1 -0
  117. package/dist/core/provider-tool-text.js +42 -0
  118. package/dist/core/provider-tool-text.js.map +1 -0
  119. package/dist/core/research/model-fitness.d.ts +2 -5
  120. package/dist/core/research/model-fitness.d.ts.map +1 -1
  121. package/dist/core/research/model-fitness.js +2 -20
  122. package/dist/core/research/model-fitness.js.map +1 -1
  123. package/dist/core/research/research-runner.d.ts +2 -1
  124. package/dist/core/research/research-runner.d.ts.map +1 -1
  125. package/dist/core/research/research-runner.js +6 -21
  126. package/dist/core/research/research-runner.js.map +1 -1
  127. package/dist/core/risk-classifier.d.ts.map +1 -1
  128. package/dist/core/risk-classifier.js +9 -1
  129. package/dist/core/risk-classifier.js.map +1 -1
  130. package/dist/core/runtime-builder.d.ts +3 -0
  131. package/dist/core/runtime-builder.d.ts.map +1 -1
  132. package/dist/core/runtime-builder.js +20 -25
  133. package/dist/core/runtime-builder.js.map +1 -1
  134. package/dist/core/scout-controller.d.ts +2 -1
  135. package/dist/core/scout-controller.d.ts.map +1 -1
  136. package/dist/core/scout-controller.js +2 -16
  137. package/dist/core/scout-controller.js.map +1 -1
  138. package/dist/core/sdk.d.ts +1 -1
  139. package/dist/core/sdk.js.map +1 -1
  140. package/dist/core/secrets/credential-exposure-guard.js +6 -6
  141. package/dist/core/secrets/credential-exposure-guard.js.map +1 -1
  142. package/dist/core/secrets/credential-manager.d.ts +11 -1
  143. package/dist/core/secrets/credential-manager.d.ts.map +1 -1
  144. package/dist/core/secrets/credential-manager.js +28 -7
  145. package/dist/core/secrets/credential-manager.js.map +1 -1
  146. package/dist/core/secrets/credential-migration-source.d.ts +20 -0
  147. package/dist/core/secrets/credential-migration-source.d.ts.map +1 -0
  148. package/dist/core/secrets/credential-migration-source.js +113 -0
  149. package/dist/core/secrets/credential-migration-source.js.map +1 -0
  150. package/dist/core/secrets/credential-session-connection.d.ts +9 -0
  151. package/dist/core/secrets/credential-session-connection.d.ts.map +1 -0
  152. package/dist/core/secrets/credential-session-connection.js +39 -0
  153. package/dist/core/secrets/credential-session-connection.js.map +1 -0
  154. package/dist/core/security/untrusted-boundary.d.ts +2 -2
  155. package/dist/core/security/untrusted-boundary.d.ts.map +1 -1
  156. package/dist/core/security/untrusted-boundary.js +3 -10
  157. package/dist/core/security/untrusted-boundary.js.map +1 -1
  158. package/dist/core/session-role.d.ts.map +1 -1
  159. package/dist/core/session-role.js +1 -2
  160. package/dist/core/session-role.js.map +1 -1
  161. package/dist/core/skill-vault.d.ts +98 -0
  162. package/dist/core/skill-vault.d.ts.map +1 -0
  163. package/dist/core/skill-vault.js +270 -0
  164. package/dist/core/skill-vault.js.map +1 -0
  165. package/dist/core/skills.d.ts +10 -9
  166. package/dist/core/skills.d.ts.map +1 -1
  167. package/dist/core/skills.js +42 -50
  168. package/dist/core/skills.js.map +1 -1
  169. package/dist/core/system-prompt-builder.d.ts +1 -1
  170. package/dist/core/system-prompt-builder.d.ts.map +1 -1
  171. package/dist/core/system-prompt-builder.js +20 -60
  172. package/dist/core/system-prompt-builder.js.map +1 -1
  173. package/dist/core/system-prompt.d.ts +4 -4
  174. package/dist/core/system-prompt.d.ts.map +1 -1
  175. package/dist/core/system-prompt.js +87 -121
  176. package/dist/core/system-prompt.js.map +1 -1
  177. package/dist/core/tasks/task-state.d.ts.map +1 -1
  178. package/dist/core/tasks/task-state.js +6 -7
  179. package/dist/core/tasks/task-state.js.map +1 -1
  180. package/dist/core/tool-capability-policy.d.ts.map +1 -1
  181. package/dist/core/tool-capability-policy.js +2 -1
  182. package/dist/core/tool-capability-policy.js.map +1 -1
  183. package/dist/core/tool-protocol-controller.d.ts.map +1 -1
  184. package/dist/core/tool-protocol-controller.js +4 -7
  185. package/dist/core/tool-protocol-controller.js.map +1 -1
  186. package/dist/core/tool-selection/promotion.d.ts.map +1 -1
  187. package/dist/core/tool-selection/promotion.js +2 -6
  188. package/dist/core/tool-selection/promotion.js.map +1 -1
  189. package/dist/core/toolkit/reflex-interpreter.d.ts +2 -1
  190. package/dist/core/toolkit/reflex-interpreter.d.ts.map +1 -1
  191. package/dist/core/toolkit/reflex-interpreter.js +2 -14
  192. package/dist/core/toolkit/reflex-interpreter.js.map +1 -1
  193. package/dist/core/tools/ask-question.js +6 -6
  194. package/dist/core/tools/ask-question.js.map +1 -1
  195. package/dist/core/tools/bash.d.ts.map +1 -1
  196. package/dist/core/tools/bash.js +8 -7
  197. package/dist/core/tools/bash.js.map +1 -1
  198. package/dist/core/tools/delegate-status.d.ts +17 -13
  199. package/dist/core/tools/delegate-status.d.ts.map +1 -1
  200. package/dist/core/tools/delegate-status.js +111 -226
  201. package/dist/core/tools/delegate-status.js.map +1 -1
  202. package/dist/core/tools/delegate.d.ts +29 -2
  203. package/dist/core/tools/delegate.d.ts.map +1 -1
  204. package/dist/core/tools/delegate.js +149 -48
  205. package/dist/core/tools/delegate.js.map +1 -1
  206. package/dist/core/tools/edit.js +3 -3
  207. package/dist/core/tools/edit.js.map +1 -1
  208. package/dist/core/tools/extensionify-runtime.js +4 -4
  209. package/dist/core/tools/extensionify-runtime.js.map +1 -1
  210. package/dist/core/tools/find.d.ts.map +1 -1
  211. package/dist/core/tools/find.js +2 -4
  212. package/dist/core/tools/find.js.map +1 -1
  213. package/dist/core/tools/goal.js +3 -3
  214. package/dist/core/tools/goal.js.map +1 -1
  215. package/dist/core/tools/grep.js +2 -2
  216. package/dist/core/tools/grep.js.map +1 -1
  217. package/dist/core/tools/index.d.ts +1 -1
  218. package/dist/core/tools/index.d.ts.map +1 -1
  219. package/dist/core/tools/index.js +1 -1
  220. package/dist/core/tools/index.js.map +1 -1
  221. package/dist/core/tools/model-fitness.js +4 -4
  222. package/dist/core/tools/model-fitness.js.map +1 -1
  223. package/dist/core/tools/profile-writer.d.ts +30 -16
  224. package/dist/core/tools/profile-writer.d.ts.map +1 -1
  225. package/dist/core/tools/profile-writer.js +98 -59
  226. package/dist/core/tools/profile-writer.js.map +1 -1
  227. package/dist/core/tools/python.js +6 -6
  228. package/dist/core/tools/python.js.map +1 -1
  229. package/dist/core/tools/run-process.js +4 -4
  230. package/dist/core/tools/run-process.js.map +1 -1
  231. package/dist/core/tools/run-toolkit-script.js +4 -4
  232. package/dist/core/tools/run-toolkit-script.js.map +1 -1
  233. package/dist/core/tools/secret-store.d.ts +32 -3
  234. package/dist/core/tools/secret-store.d.ts.map +1 -1
  235. package/dist/core/tools/secret-store.js +141 -34
  236. package/dist/core/tools/secret-store.js.map +1 -1
  237. package/dist/core/tools/skill.d.ts +29 -0
  238. package/dist/core/tools/skill.d.ts.map +1 -0
  239. package/dist/core/tools/skill.js +79 -0
  240. package/dist/core/tools/skill.js.map +1 -0
  241. package/dist/core/tools/task-steps.js +4 -4
  242. package/dist/core/tools/task-steps.js.map +1 -1
  243. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  244. package/dist/core/tools/tool-definition-wrapper.js +2 -0
  245. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  246. package/dist/core/tools/worktree-sync.js +6 -6
  247. package/dist/core/tools/worktree-sync.js.map +1 -1
  248. package/dist/core/tools/write.js +3 -3
  249. package/dist/core/tools/write.js.map +1 -1
  250. package/dist/index.d.ts +5 -2
  251. package/dist/index.d.ts.map +1 -1
  252. package/dist/index.js +4 -1
  253. package/dist/index.js.map +1 -1
  254. package/dist/modes/interactive/interactive-event-controller.js +1 -1
  255. package/dist/modes/interactive/interactive-event-controller.js.map +1 -1
  256. package/dist/modes/interactive/interactive-mode.js +1 -1
  257. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  258. package/dist/modes/interactive/report-commands.js +1 -1
  259. package/dist/modes/interactive/report-commands.js.map +1 -1
  260. package/dist/modes/interactive/secret-menu-controller.d.ts.map +1 -1
  261. package/dist/modes/interactive/secret-menu-controller.js +2 -18
  262. package/dist/modes/interactive/secret-menu-controller.js.map +1 -1
  263. package/dist/modes/interactive/session-flow-commands.js +1 -1
  264. package/dist/modes/interactive/session-flow-commands.js.map +1 -1
  265. package/docs/compaction.md +45 -25
  266. package/docs/extensions.md +23 -7
  267. package/docs/settings.md +3 -3
  268. package/docs/skills.md +14 -10
  269. package/docs/task-steps.md +2 -2
  270. package/docs/tmux-agent-manager.md +1 -1
  271. package/docs/tool-repair.md +18 -1
  272. package/docs/usage.md +4 -2
  273. package/docs/worker-profiles.md +3 -3
  274. package/docs/worktree-sync.md +2 -2
  275. package/examples/extensions/custom-compaction.ts +5 -17
  276. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  277. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  278. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  279. package/examples/extensions/sandbox/package-lock.json +2 -2
  280. package/examples/extensions/sandbox/package.json +1 -1
  281. package/examples/extensions/summarize.ts +3 -5
  282. package/examples/extensions/with-deps/package-lock.json +2 -2
  283. package/examples/extensions/with-deps/package.json +1 -1
  284. package/examples/sdk/04-skills.ts +1 -1
  285. package/npm-shrinkwrap.json +12 -12
  286. package/package.json +4 -4
  287. package/dist/core/util/json-size.d.ts +0 -3
  288. package/dist/core/util/json-size.d.ts.map +0 -1
  289. package/dist/core/util/json-size.js +0 -95
  290. package/dist/core/util/json-size.js.map +0 -1
@@ -112,7 +112,7 @@ export function handleUsageCommand(host) {
112
112
  info += `${theme.fg("dim", "/compact")}: compact the active context now\n`;
113
113
  info += `${theme.fg("dim", "/settings")}: adjust Auto Learn, cost guard, compaction, and model-router config\n`;
114
114
  info += `${theme.fg("dim", "/auto-learn status|run")}: inspect or launch background learning\n`;
115
- info += `${theme.fg("dim", "context_audit")}: ask the agent to inspect provider-visible context contributors\n`;
115
+ info += `${theme.fg("dim", "/context")}: inspect provider-visible context contributors without model tokens\n`;
116
116
  host.chatContainer.addChild(new Spacer(1));
117
117
  host.chatContainer.addChild(new Text(info, 1, 0));
118
118
  host.ui.requestRender();
@@ -1 +1 @@
1
- {"version":3,"file":"report-commands.js","sourceRoot":"","sources":["../../../src/modes/interactive/report-commands.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Read-only report and easter-egg commands extracted from interactive-mode.\n *\n * These build informational output (usage/cost summary, changelog, hotkeys\n * table, render debug dump) or render an easter-egg component, appending to the\n * chat container and requesting a render. None mutate agent/session state, so\n * they operate through narrow `host` seams (chat container, TUI, and a few\n * read accessors) while interactive-mode keeps thin delegating wrappers.\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { Container, Keybinding, MarkdownTheme, TUI } from \"@caupulican/pi-tui\";\nimport { Markdown, Spacer, Text, visibleWidth } from \"@caupulican/pi-tui\";\nimport { getDebugLogPath } from \"../../config.ts\";\nimport type { AgentSession } from \"../../core/agent-session.ts\";\nimport { hasSubagentCostSignal, type SessionCostSummary } from \"../../core/cost/cost-summary.ts\";\nimport type { AppKeybinding, KeybindingsManager } from \"../../core/keybindings.ts\";\nimport type { AutoLearnSettings } from \"../../core/settings-manager.ts\";\nimport { getChangelogPath, parseChangelog } from \"../../utils/changelog.ts\";\nimport { getProcessMemoryMb } from \"../../utils/process-memory.ts\";\nimport { ArminComponent } from \"./components/armin.ts\";\nimport { DaxnutsComponent } from \"./components/daxnuts.ts\";\nimport { DynamicBorder } from \"./components/dynamic-border.ts\";\nimport { EarendilAnnouncementComponent } from \"./components/earendil-announcement.ts\";\nimport { formatKeyText } from \"./components/keybinding-hints.ts\";\nimport { theme } from \"./theme/theme.ts\";\n\nexport interface ReportRenderHost {\n\treadonly chatContainer: Container;\n\treadonly ui: TUI;\n}\n\nexport interface UsageReportHost extends ReportRenderHost {\n\treadonly session: AgentSession;\n\tgetCurrentAutoLearnSettings(): Required<AutoLearnSettings>;\n}\n\nexport interface ChangelogReportHost extends ReportRenderHost {\n\tgetMarkdownThemeWithSettings(): MarkdownTheme;\n}\n\nexport interface HotkeysReportHost extends ReportRenderHost {\n\treadonly session: AgentSession;\n\treadonly keybindings: KeybindingsManager;\n\tgetMarkdownThemeWithSettings(): MarkdownTheme;\n\tgetAppKeyDisplay(action: AppKeybinding): string;\n\tgetEditorKeyDisplay(action: Keybinding): string;\n}\n\nexport interface DebugReportHost extends ReportRenderHost {\n\treadonly session: AgentSession;\n}\n\nexport function formatCostReport(costs: SessionCostSummary, usingSubscription = false): string {\n\tconst lines = [\n\t\t`${theme.fg(\"dim\", \"CURRENT (session):\")} $${costs.currentCost.toFixed(4)}${usingSubscription ? \" (sub)\" : \"\"}`,\n\t];\n\tif (hasSubagentCostSignal(costs)) {\n\t\tlines.push(\n\t\t\t`${theme.fg(\"dim\", \"SUBAGENTS (included in CURRENT):\")} $${costs.subagentCost.toFixed(4)} (${costs.subagentReports} reports)`,\n\t\t);\n\t}\n\tlines.push(\n\t\t`${theme.fg(\"dim\", \"TODAY (host local day):\")} $${costs.todayCost.toFixed(4)}`,\n\t\t`${theme.fg(\"dim\", \"Today rollover:\")} local midnight`,\n\t);\n\treturn lines.join(\"\\n\");\n}\n\nexport function handleUsageCommand(host: UsageReportHost): void {\n\tconst stats = host.session.getSessionStats();\n\tconst costs = host.session.getCostSummary();\n\tconst context = host.session.getContextUsage();\n\tconst autoLearn = host.getCurrentAutoLearnSettings();\n\tconst costGuard = host.session.getLastCostGuardDecision();\n\tconst activeModel = host.session.model;\n\tconst usingSubscription = activeModel ? host.session.modelRegistry.isUsingOAuth(activeModel) : false;\n\tconst isChatGptSubscription = usingSubscription && activeModel?.provider === \"openai-codex\";\n\n\tlet info = `${theme.bold(\"Usage & Optimization\")}\\n\\n`;\n\tinfo += `${theme.bold(\"Session tokens\")}\\n`;\n\tinfo += `${theme.fg(\"dim\", \"Input:\")} ${stats.tokens.input.toLocaleString()}\\n`;\n\tinfo += `${theme.fg(\"dim\", \"Output:\")} ${stats.tokens.output.toLocaleString()}\\n`;\n\tinfo += `${theme.fg(\"dim\", \"Cache read:\")} ${stats.tokens.cacheRead.toLocaleString()}\\n`;\n\tinfo += `${theme.fg(\"dim\", \"Cache write:\")} ${stats.tokens.cacheWrite.toLocaleString()}\\n`;\n\tinfo += `${theme.fg(\"dim\", \"Total:\")} ${stats.tokens.total.toLocaleString()}\\n\\n`;\n\n\tinfo += `${theme.bold(\"Cost\")}\\n`;\n\tinfo += `${formatCostReport(costs, usingSubscription)}\\n\\n`;\n\n\tconst processMemory = getProcessMemoryMb();\n\tinfo += `${theme.bold(\"Process\")}\\n`;\n\tinfo += `${theme.fg(\"dim\", \"Memory:\")} rss ${processMemory.rssMb}MB, heap ${processMemory.heapUsedMb}MB, external ${processMemory.externalMb}MB\\n\\n`;\n\n\tinfo += `${theme.bold(\"Optimization state\")}\\n`;\n\tconst contextPercent = context?.percent;\n\tconst contextTokens = context?.tokens;\n\tif (\n\t\tcontext &&\n\t\tcontextPercent !== undefined &&\n\t\tcontextPercent !== null &&\n\t\tcontextTokens !== undefined &&\n\t\tcontextTokens !== null\n\t) {\n\t\tinfo += `${theme.fg(\"dim\", \"Context:\")} ${contextPercent.toFixed(1)}% (${contextTokens.toLocaleString()}/${context.contextWindow.toLocaleString()})\\n`;\n\t} else {\n\t\tinfo += `${theme.fg(\"dim\", \"Context:\")} unknown until next provider usage sample\\n`;\n\t}\n\tinfo += `${theme.fg(\"dim\", \"Auto-compaction:\")} ${host.session.autoCompactionEnabled ? \"enabled\" : \"disabled\"}\\n`;\n\tconst compactionGates = stats.compactionGates ?? {\n\t\tgateFailures: 0,\n\t\tdeterministicGapFills: 0,\n\t\tcompactionsWithGateFailures: 0,\n\t\tchecks: {},\n\t};\n\tinfo += `${theme.fg(\"dim\", \"Compaction gate failures:\")} ${compactionGates.gateFailures} (${compactionGates.deterministicGapFills} deterministic gap-fill)\\n`;\n\tconst failingChecks = Object.entries(compactionGates.checks).sort(\n\t\t([leftName, left], [rightName, right]) => right.failures - left.failures || leftName.localeCompare(rightName),\n\t);\n\tif (failingChecks.length > 0) {\n\t\tconst visibleChecks = failingChecks.slice(0, 3).map(([check, checkStats]) => {\n\t\t\tlet score = \"\";\n\t\t\tif (checkStats.minScore !== undefined && checkStats.maxScore !== undefined) {\n\t\t\t\tconst range =\n\t\t\t\t\tcheckStats.minScore === checkStats.maxScore\n\t\t\t\t\t\t? checkStats.minScore.toFixed(2)\n\t\t\t\t\t\t: `${checkStats.minScore.toFixed(2)}-${checkStats.maxScore.toFixed(2)}`;\n\t\t\t\tconst threshold =\n\t\t\t\t\tcheckStats.threshold === undefined\n\t\t\t\t\t\t? \"\"\n\t\t\t\t\t\t: ` ${checkStats.comparator === \"maximum\" ? \">\" : \"<\"} ${checkStats.threshold.toFixed(2)}`;\n\t\t\t\tscore = ` (${range}${threshold})`;\n\t\t\t}\n\t\t\treturn `${check} x${checkStats.failures}${score}`;\n\t\t});\n\t\tif (failingChecks.length > visibleChecks.length) {\n\t\t\tvisibleChecks.push(`+${failingChecks.length - visibleChecks.length} more`);\n\t\t}\n\t\tinfo += `${theme.fg(\"dim\", \"Failing compaction checks:\")} ${visibleChecks.join(\"; \")}\\n`;\n\t}\n\tif (isChatGptSubscription) {\n\t\tinfo += `${theme.fg(\"dim\", \"Cost guard:\")} not applicable to ChatGPT subscription usage\\n`;\n\t} else if (costGuard) {\n\t\tconst status = costGuard.over ? \"over\" : \"ok\";\n\t\tinfo += `${theme.fg(\"dim\", \"Cost guard:\")} ${status} $${costGuard.estUsd.toFixed(4)}/$${costGuard.thresholdUsd.toFixed(4)} (${costGuard.action})\\n`;\n\t} else {\n\t\tinfo += `${theme.fg(\"dim\", \"Cost guard:\")} disabled\\n`;\n\t}\n\tinfo += `${theme.fg(\"dim\", \"Auto Learn:\")} ${autoLearn.enabled ? \"enabled\" : \"disabled\"}\\n`;\n\tinfo += `${theme.fg(\"dim\", \"Scavenger model:\")} ${autoLearn.model || \"active\"}\\n`;\n\tinfo += `${theme.fg(\"dim\", \"Reflection review:\")} ${autoLearn.reflectionReview ? \"enabled\" : \"disabled\"} (${autoLearn.reflectionMinToolCalls} tool-call trigger)\\n`;\n\tinfo += `${theme.fg(\"dim\", \"Auto Learn concurrency:\")} ${autoLearn.maxConcurrentLearners} learner(s), ${autoLearn.cooldownMinutes}m cooldown\\n\\n`;\n\n\tinfo += `${theme.bold(\"Model Router\")}\\n`;\n\tinfo += `${host.session.getModelRouterStatus((label) => theme.fg(\"dim\", label))}\\n\\n`;\n\n\tinfo += `${theme.bold(\"Manual controls\")}\\n`;\n\tinfo += `${theme.fg(\"dim\", \"/compact\")}: compact the active context now\\n`;\n\tinfo += `${theme.fg(\"dim\", \"/settings\")}: adjust Auto Learn, cost guard, compaction, and model-router config\\n`;\n\tinfo += `${theme.fg(\"dim\", \"/auto-learn status|run\")}: inspect or launch background learning\\n`;\n\tinfo += `${theme.fg(\"dim\", \"context_audit\")}: ask the agent to inspect provider-visible context contributors\\n`;\n\n\thost.chatContainer.addChild(new Spacer(1));\n\thost.chatContainer.addChild(new Text(info, 1, 0));\n\thost.ui.requestRender();\n}\n\nexport function handleChangelogCommand(host: ChangelogReportHost): void {\n\tconst changelogPath = getChangelogPath();\n\tconst allEntries = parseChangelog(changelogPath);\n\n\tconst changelogMarkdown =\n\t\tallEntries.length > 0\n\t\t\t? allEntries\n\t\t\t\t\t.reverse()\n\t\t\t\t\t.map((e) => e.content)\n\t\t\t\t\t.join(\"\\n\\n\")\n\t\t\t: \"No changelog entries found.\";\n\n\thost.chatContainer.addChild(new Spacer(1));\n\thost.chatContainer.addChild(new DynamicBorder());\n\thost.chatContainer.addChild(new Text(theme.bold(theme.fg(\"accent\", \"What's New\")), 1, 0));\n\thost.chatContainer.addChild(new Spacer(1));\n\thost.chatContainer.addChild(new Markdown(changelogMarkdown, 1, 1, host.getMarkdownThemeWithSettings()));\n\thost.chatContainer.addChild(new DynamicBorder());\n\thost.ui.requestRender();\n}\n\nexport function handleHotkeysCommand(host: HotkeysReportHost): void {\n\t// Navigation keybindings\n\tconst cursorUp = host.getEditorKeyDisplay(\"tui.editor.cursorUp\");\n\tconst cursorDown = host.getEditorKeyDisplay(\"tui.editor.cursorDown\");\n\tconst cursorLeft = host.getEditorKeyDisplay(\"tui.editor.cursorLeft\");\n\tconst cursorRight = host.getEditorKeyDisplay(\"tui.editor.cursorRight\");\n\tconst cursorWordLeft = host.getEditorKeyDisplay(\"tui.editor.cursorWordLeft\");\n\tconst cursorWordRight = host.getEditorKeyDisplay(\"tui.editor.cursorWordRight\");\n\tconst cursorLineStart = host.getEditorKeyDisplay(\"tui.editor.cursorLineStart\");\n\tconst cursorLineEnd = host.getEditorKeyDisplay(\"tui.editor.cursorLineEnd\");\n\tconst jumpForward = host.getEditorKeyDisplay(\"tui.editor.jumpForward\");\n\tconst jumpBackward = host.getEditorKeyDisplay(\"tui.editor.jumpBackward\");\n\tconst pageUp = host.getEditorKeyDisplay(\"tui.editor.pageUp\");\n\tconst pageDown = host.getEditorKeyDisplay(\"tui.editor.pageDown\");\n\n\t// Editing keybindings\n\tconst submit = host.getEditorKeyDisplay(\"tui.input.submit\");\n\tconst newLine = host.getEditorKeyDisplay(\"tui.input.newLine\");\n\tconst deleteWordBackward = host.getEditorKeyDisplay(\"tui.editor.deleteWordBackward\");\n\tconst deleteWordForward = host.getEditorKeyDisplay(\"tui.editor.deleteWordForward\");\n\tconst deleteToLineStart = host.getEditorKeyDisplay(\"tui.editor.deleteToLineStart\");\n\tconst deleteToLineEnd = host.getEditorKeyDisplay(\"tui.editor.deleteToLineEnd\");\n\tconst yank = host.getEditorKeyDisplay(\"tui.editor.yank\");\n\tconst yankPop = host.getEditorKeyDisplay(\"tui.editor.yankPop\");\n\tconst undo = host.getEditorKeyDisplay(\"tui.editor.undo\");\n\tconst tab = host.getEditorKeyDisplay(\"tui.input.tab\");\n\n\t// App keybindings\n\tconst interrupt = host.getAppKeyDisplay(\"app.interrupt\");\n\tconst clear = host.getAppKeyDisplay(\"app.clear\");\n\tconst exit = host.getAppKeyDisplay(\"app.exit\");\n\tconst suspend = host.getAppKeyDisplay(\"app.suspend\");\n\tconst cycleThinkingLevel = host.getAppKeyDisplay(\"app.thinking.cycle\");\n\tconst cycleModelForward = host.getAppKeyDisplay(\"app.model.cycleForward\");\n\tconst selectModel = host.getAppKeyDisplay(\"app.model.select\");\n\tconst expandTools = host.getAppKeyDisplay(\"app.tools.expand\");\n\tconst toggleThinking = host.getAppKeyDisplay(\"app.thinking.toggle\");\n\tconst externalEditor = host.getAppKeyDisplay(\"app.editor.external\");\n\tconst cycleModelBackward = host.getAppKeyDisplay(\"app.model.cycleBackward\");\n\tconst followUp = host.getAppKeyDisplay(\"app.message.followUp\");\n\tconst dequeue = host.getAppKeyDisplay(\"app.message.dequeue\");\n\tconst pasteImage = host.getAppKeyDisplay(\"app.clipboard.pasteImage\");\n\n\tlet hotkeys = `\n**Navigation**\n| Key | Action |\n|-----|--------|\n| \\`${cursorUp}\\` / \\`${cursorDown}\\` / \\`${cursorLeft}\\` / \\`${cursorRight}\\` | Move cursor / browse history (Up when empty) |\n| \\`${cursorWordLeft}\\` / \\`${cursorWordRight}\\` | Move by word |\n| \\`${cursorLineStart}\\` | Start of line |\n| \\`${cursorLineEnd}\\` | End of line |\n| \\`${jumpForward}\\` | Jump forward to character |\n| \\`${jumpBackward}\\` | Jump backward to character |\n| \\`${pageUp}\\` / \\`${pageDown}\\` | Scroll by page |\n\n**Editing**\n| Key | Action |\n|-----|--------|\n| \\`${submit}\\` | Send message |\n| \\`${newLine}\\` | New line${process.platform === \"win32\" ? \" (Ctrl+Enter on Windows Terminal)\" : \"\"} |\n| \\`${deleteWordBackward}\\` | Delete word backwards |\n| \\`${deleteWordForward}\\` | Delete word forwards |\n| \\`${deleteToLineStart}\\` | Delete to start of line |\n| \\`${deleteToLineEnd}\\` | Delete to end of line |\n| \\`${yank}\\` | Paste the most-recently-deleted text |\n| \\`${yankPop}\\` | Cycle through the deleted text after pasting |\n| \\`${undo}\\` | Undo |\n\n**Other**\n| Key | Action |\n|-----|--------|\n| \\`${tab}\\` | Path completion / accept autocomplete |\n| \\`${interrupt}\\` | Cancel autocomplete / abort streaming |\n| \\`${clear}\\` | Clear editor (first) / exit (second) |\n| \\`${exit}\\` | Exit (when editor is empty) |\n| \\`${suspend}\\` | Suspend to background |\n| \\`${cycleThinkingLevel}\\` | Cycle thinking level |\n| \\`${cycleModelForward}\\` / \\`${cycleModelBackward}\\` | Cycle models |\n| \\`${selectModel}\\` | Open model selector |\n| \\`${expandTools}\\` | Toggle tool output expansion |\n| \\`${toggleThinking}\\` | Toggle thinking block visibility |\n| \\`${externalEditor}\\` | Edit message in external editor |\n| \\`${followUp}\\` | Queue follow-up message |\n| \\`${dequeue}\\` | Restore queued messages |\n| \\`${pasteImage}\\` | Paste image from clipboard |\n| \\`/\\` | Slash commands |\n| \\`!\\` | Run bash command |\n| \\`!!\\` | Run bash command (excluded from context) |\n`;\n\n\t// Add extension-registered shortcuts\n\tconst extensionRunner = host.session.extensionRunner;\n\tconst shortcuts = extensionRunner.getShortcuts(host.keybindings.getEffectiveConfig());\n\tif (shortcuts.size > 0) {\n\t\thotkeys += `\n**Extensions**\n| Key | Action |\n|-----|--------|\n`;\n\t\tfor (const [key, shortcut] of shortcuts) {\n\t\t\tconst description = shortcut.description ?? shortcut.extensionPath;\n\t\t\tconst keyDisplay = formatKeyText(key, { capitalize: true });\n\t\t\thotkeys += `| \\`${keyDisplay}\\` | ${description} |\\n`;\n\t\t}\n\t}\n\n\thost.chatContainer.addChild(new Spacer(1));\n\thost.chatContainer.addChild(new DynamicBorder());\n\thost.chatContainer.addChild(new Text(theme.bold(theme.fg(\"accent\", \"Keyboard Shortcuts\")), 1, 0));\n\thost.chatContainer.addChild(new Spacer(1));\n\thost.chatContainer.addChild(new Markdown(hotkeys.trim(), 1, 1, host.getMarkdownThemeWithSettings()));\n\thost.chatContainer.addChild(new DynamicBorder());\n\thost.ui.requestRender();\n}\n\nexport function handleDebugCommand(host: DebugReportHost): void {\n\tconst width = host.ui.terminal.columns;\n\tconst height = host.ui.terminal.rows;\n\tconst allLines = host.ui.render(width);\n\n\tconst debugLogPath = getDebugLogPath();\n\tconst debugData = [\n\t\t`Debug output at ${new Date().toISOString()}`,\n\t\t`Terminal: ${width}x${height}`,\n\t\t`Total lines: ${allLines.length}`,\n\t\t\"\",\n\t\t\"=== All rendered lines with visible widths ===\",\n\t\t...allLines.map((line, idx) => {\n\t\t\tconst vw = visibleWidth(line);\n\t\t\tconst escaped = JSON.stringify(line);\n\t\t\treturn `[${idx}] (w=${vw}) ${escaped}`;\n\t\t}),\n\t\t\"\",\n\t\t\"=== Agent messages (JSONL) ===\",\n\t\t...host.session.messages.map((msg) => JSON.stringify(msg)),\n\t\t\"\",\n\t].join(\"\\n\");\n\n\tfs.mkdirSync(path.dirname(debugLogPath), { recursive: true });\n\tfs.writeFileSync(debugLogPath, debugData);\n\n\thost.chatContainer.addChild(new Spacer(1));\n\thost.chatContainer.addChild(\n\t\tnew Text(`${theme.fg(\"accent\", \"✓ Debug log written\")}\\n${theme.fg(\"muted\", debugLogPath)}`, 1, 1),\n\t);\n\thost.ui.requestRender();\n}\n\nexport function handleArminSaysHi(host: ReportRenderHost): void {\n\thost.chatContainer.addChild(new Spacer(1));\n\thost.chatContainer.addChild(new ArminComponent(host.ui));\n\thost.ui.requestRender();\n}\n\nexport function handleDementedDelves(host: ReportRenderHost): void {\n\thost.chatContainer.addChild(new Spacer(1));\n\thost.chatContainer.addChild(new EarendilAnnouncementComponent());\n\thost.ui.requestRender();\n}\n\nexport function handleDaxnuts(host: ReportRenderHost): void {\n\thost.chatContainer.addChild(new Spacer(1));\n\thost.chatContainer.addChild(new DaxnutsComponent(host.ui));\n\thost.ui.requestRender();\n}\n\nexport function checkDaxnutsEasterEgg(host: ReportRenderHost, model: { provider: string; id: string }): void {\n\tif (model.provider === \"opencode\" && model.id.toLowerCase().includes(\"kimi-k2.5\")) {\n\t\thandleDaxnuts(host);\n\t}\n}\n"]}
1
+ {"version":3,"file":"report-commands.js","sourceRoot":"","sources":["../../../src/modes/interactive/report-commands.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Read-only report and easter-egg commands extracted from interactive-mode.\n *\n * These build informational output (usage/cost summary, changelog, hotkeys\n * table, render debug dump) or render an easter-egg component, appending to the\n * chat container and requesting a render. None mutate agent/session state, so\n * they operate through narrow `host` seams (chat container, TUI, and a few\n * read accessors) while interactive-mode keeps thin delegating wrappers.\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { Container, Keybinding, MarkdownTheme, TUI } from \"@caupulican/pi-tui\";\nimport { Markdown, Spacer, Text, visibleWidth } from \"@caupulican/pi-tui\";\nimport { getDebugLogPath } from \"../../config.ts\";\nimport type { AgentSession } from \"../../core/agent-session.ts\";\nimport { hasSubagentCostSignal, type SessionCostSummary } from \"../../core/cost/cost-summary.ts\";\nimport type { AppKeybinding, KeybindingsManager } from \"../../core/keybindings.ts\";\nimport type { AutoLearnSettings } from \"../../core/settings-manager.ts\";\nimport { getChangelogPath, parseChangelog } from \"../../utils/changelog.ts\";\nimport { getProcessMemoryMb } from \"../../utils/process-memory.ts\";\nimport { ArminComponent } from \"./components/armin.ts\";\nimport { DaxnutsComponent } from \"./components/daxnuts.ts\";\nimport { DynamicBorder } from \"./components/dynamic-border.ts\";\nimport { EarendilAnnouncementComponent } from \"./components/earendil-announcement.ts\";\nimport { formatKeyText } from \"./components/keybinding-hints.ts\";\nimport { theme } from \"./theme/theme.ts\";\n\nexport interface ReportRenderHost {\n\treadonly chatContainer: Container;\n\treadonly ui: TUI;\n}\n\nexport interface UsageReportHost extends ReportRenderHost {\n\treadonly session: AgentSession;\n\tgetCurrentAutoLearnSettings(): Required<AutoLearnSettings>;\n}\n\nexport interface ChangelogReportHost extends ReportRenderHost {\n\tgetMarkdownThemeWithSettings(): MarkdownTheme;\n}\n\nexport interface HotkeysReportHost extends ReportRenderHost {\n\treadonly session: AgentSession;\n\treadonly keybindings: KeybindingsManager;\n\tgetMarkdownThemeWithSettings(): MarkdownTheme;\n\tgetAppKeyDisplay(action: AppKeybinding): string;\n\tgetEditorKeyDisplay(action: Keybinding): string;\n}\n\nexport interface DebugReportHost extends ReportRenderHost {\n\treadonly session: AgentSession;\n}\n\nexport function formatCostReport(costs: SessionCostSummary, usingSubscription = false): string {\n\tconst lines = [\n\t\t`${theme.fg(\"dim\", \"CURRENT (session):\")} $${costs.currentCost.toFixed(4)}${usingSubscription ? \" (sub)\" : \"\"}`,\n\t];\n\tif (hasSubagentCostSignal(costs)) {\n\t\tlines.push(\n\t\t\t`${theme.fg(\"dim\", \"SUBAGENTS (included in CURRENT):\")} $${costs.subagentCost.toFixed(4)} (${costs.subagentReports} reports)`,\n\t\t);\n\t}\n\tlines.push(\n\t\t`${theme.fg(\"dim\", \"TODAY (host local day):\")} $${costs.todayCost.toFixed(4)}`,\n\t\t`${theme.fg(\"dim\", \"Today rollover:\")} local midnight`,\n\t);\n\treturn lines.join(\"\\n\");\n}\n\nexport function handleUsageCommand(host: UsageReportHost): void {\n\tconst stats = host.session.getSessionStats();\n\tconst costs = host.session.getCostSummary();\n\tconst context = host.session.getContextUsage();\n\tconst autoLearn = host.getCurrentAutoLearnSettings();\n\tconst costGuard = host.session.getLastCostGuardDecision();\n\tconst activeModel = host.session.model;\n\tconst usingSubscription = activeModel ? host.session.modelRegistry.isUsingOAuth(activeModel) : false;\n\tconst isChatGptSubscription = usingSubscription && activeModel?.provider === \"openai-codex\";\n\n\tlet info = `${theme.bold(\"Usage & Optimization\")}\\n\\n`;\n\tinfo += `${theme.bold(\"Session tokens\")}\\n`;\n\tinfo += `${theme.fg(\"dim\", \"Input:\")} ${stats.tokens.input.toLocaleString()}\\n`;\n\tinfo += `${theme.fg(\"dim\", \"Output:\")} ${stats.tokens.output.toLocaleString()}\\n`;\n\tinfo += `${theme.fg(\"dim\", \"Cache read:\")} ${stats.tokens.cacheRead.toLocaleString()}\\n`;\n\tinfo += `${theme.fg(\"dim\", \"Cache write:\")} ${stats.tokens.cacheWrite.toLocaleString()}\\n`;\n\tinfo += `${theme.fg(\"dim\", \"Total:\")} ${stats.tokens.total.toLocaleString()}\\n\\n`;\n\n\tinfo += `${theme.bold(\"Cost\")}\\n`;\n\tinfo += `${formatCostReport(costs, usingSubscription)}\\n\\n`;\n\n\tconst processMemory = getProcessMemoryMb();\n\tinfo += `${theme.bold(\"Process\")}\\n`;\n\tinfo += `${theme.fg(\"dim\", \"Memory:\")} rss ${processMemory.rssMb}MB, heap ${processMemory.heapUsedMb}MB, external ${processMemory.externalMb}MB\\n\\n`;\n\n\tinfo += `${theme.bold(\"Optimization state\")}\\n`;\n\tconst contextPercent = context?.percent;\n\tconst contextTokens = context?.tokens;\n\tif (\n\t\tcontext &&\n\t\tcontextPercent !== undefined &&\n\t\tcontextPercent !== null &&\n\t\tcontextTokens !== undefined &&\n\t\tcontextTokens !== null\n\t) {\n\t\tinfo += `${theme.fg(\"dim\", \"Context:\")} ${contextPercent.toFixed(1)}% (${contextTokens.toLocaleString()}/${context.contextWindow.toLocaleString()})\\n`;\n\t} else {\n\t\tinfo += `${theme.fg(\"dim\", \"Context:\")} unknown until next provider usage sample\\n`;\n\t}\n\tinfo += `${theme.fg(\"dim\", \"Auto-compaction:\")} ${host.session.autoCompactionEnabled ? \"enabled\" : \"disabled\"}\\n`;\n\tconst compactionGates = stats.compactionGates ?? {\n\t\tgateFailures: 0,\n\t\tdeterministicGapFills: 0,\n\t\tcompactionsWithGateFailures: 0,\n\t\tchecks: {},\n\t};\n\tinfo += `${theme.fg(\"dim\", \"Compaction gate failures:\")} ${compactionGates.gateFailures} (${compactionGates.deterministicGapFills} deterministic gap-fill)\\n`;\n\tconst failingChecks = Object.entries(compactionGates.checks).sort(\n\t\t([leftName, left], [rightName, right]) => right.failures - left.failures || leftName.localeCompare(rightName),\n\t);\n\tif (failingChecks.length > 0) {\n\t\tconst visibleChecks = failingChecks.slice(0, 3).map(([check, checkStats]) => {\n\t\t\tlet score = \"\";\n\t\t\tif (checkStats.minScore !== undefined && checkStats.maxScore !== undefined) {\n\t\t\t\tconst range =\n\t\t\t\t\tcheckStats.minScore === checkStats.maxScore\n\t\t\t\t\t\t? checkStats.minScore.toFixed(2)\n\t\t\t\t\t\t: `${checkStats.minScore.toFixed(2)}-${checkStats.maxScore.toFixed(2)}`;\n\t\t\t\tconst threshold =\n\t\t\t\t\tcheckStats.threshold === undefined\n\t\t\t\t\t\t? \"\"\n\t\t\t\t\t\t: ` ${checkStats.comparator === \"maximum\" ? \">\" : \"<\"} ${checkStats.threshold.toFixed(2)}`;\n\t\t\t\tscore = ` (${range}${threshold})`;\n\t\t\t}\n\t\t\treturn `${check} x${checkStats.failures}${score}`;\n\t\t});\n\t\tif (failingChecks.length > visibleChecks.length) {\n\t\t\tvisibleChecks.push(`+${failingChecks.length - visibleChecks.length} more`);\n\t\t}\n\t\tinfo += `${theme.fg(\"dim\", \"Failing compaction checks:\")} ${visibleChecks.join(\"; \")}\\n`;\n\t}\n\tif (isChatGptSubscription) {\n\t\tinfo += `${theme.fg(\"dim\", \"Cost guard:\")} not applicable to ChatGPT subscription usage\\n`;\n\t} else if (costGuard) {\n\t\tconst status = costGuard.over ? \"over\" : \"ok\";\n\t\tinfo += `${theme.fg(\"dim\", \"Cost guard:\")} ${status} $${costGuard.estUsd.toFixed(4)}/$${costGuard.thresholdUsd.toFixed(4)} (${costGuard.action})\\n`;\n\t} else {\n\t\tinfo += `${theme.fg(\"dim\", \"Cost guard:\")} disabled\\n`;\n\t}\n\tinfo += `${theme.fg(\"dim\", \"Auto Learn:\")} ${autoLearn.enabled ? \"enabled\" : \"disabled\"}\\n`;\n\tinfo += `${theme.fg(\"dim\", \"Scavenger model:\")} ${autoLearn.model || \"active\"}\\n`;\n\tinfo += `${theme.fg(\"dim\", \"Reflection review:\")} ${autoLearn.reflectionReview ? \"enabled\" : \"disabled\"} (${autoLearn.reflectionMinToolCalls} tool-call trigger)\\n`;\n\tinfo += `${theme.fg(\"dim\", \"Auto Learn concurrency:\")} ${autoLearn.maxConcurrentLearners} learner(s), ${autoLearn.cooldownMinutes}m cooldown\\n\\n`;\n\n\tinfo += `${theme.bold(\"Model Router\")}\\n`;\n\tinfo += `${host.session.getModelRouterStatus((label) => theme.fg(\"dim\", label))}\\n\\n`;\n\n\tinfo += `${theme.bold(\"Manual controls\")}\\n`;\n\tinfo += `${theme.fg(\"dim\", \"/compact\")}: compact the active context now\\n`;\n\tinfo += `${theme.fg(\"dim\", \"/settings\")}: adjust Auto Learn, cost guard, compaction, and model-router config\\n`;\n\tinfo += `${theme.fg(\"dim\", \"/auto-learn status|run\")}: inspect or launch background learning\\n`;\n\tinfo += `${theme.fg(\"dim\", \"/context\")}: inspect provider-visible context contributors without model tokens\\n`;\n\n\thost.chatContainer.addChild(new Spacer(1));\n\thost.chatContainer.addChild(new Text(info, 1, 0));\n\thost.ui.requestRender();\n}\n\nexport function handleChangelogCommand(host: ChangelogReportHost): void {\n\tconst changelogPath = getChangelogPath();\n\tconst allEntries = parseChangelog(changelogPath);\n\n\tconst changelogMarkdown =\n\t\tallEntries.length > 0\n\t\t\t? allEntries\n\t\t\t\t\t.reverse()\n\t\t\t\t\t.map((e) => e.content)\n\t\t\t\t\t.join(\"\\n\\n\")\n\t\t\t: \"No changelog entries found.\";\n\n\thost.chatContainer.addChild(new Spacer(1));\n\thost.chatContainer.addChild(new DynamicBorder());\n\thost.chatContainer.addChild(new Text(theme.bold(theme.fg(\"accent\", \"What's New\")), 1, 0));\n\thost.chatContainer.addChild(new Spacer(1));\n\thost.chatContainer.addChild(new Markdown(changelogMarkdown, 1, 1, host.getMarkdownThemeWithSettings()));\n\thost.chatContainer.addChild(new DynamicBorder());\n\thost.ui.requestRender();\n}\n\nexport function handleHotkeysCommand(host: HotkeysReportHost): void {\n\t// Navigation keybindings\n\tconst cursorUp = host.getEditorKeyDisplay(\"tui.editor.cursorUp\");\n\tconst cursorDown = host.getEditorKeyDisplay(\"tui.editor.cursorDown\");\n\tconst cursorLeft = host.getEditorKeyDisplay(\"tui.editor.cursorLeft\");\n\tconst cursorRight = host.getEditorKeyDisplay(\"tui.editor.cursorRight\");\n\tconst cursorWordLeft = host.getEditorKeyDisplay(\"tui.editor.cursorWordLeft\");\n\tconst cursorWordRight = host.getEditorKeyDisplay(\"tui.editor.cursorWordRight\");\n\tconst cursorLineStart = host.getEditorKeyDisplay(\"tui.editor.cursorLineStart\");\n\tconst cursorLineEnd = host.getEditorKeyDisplay(\"tui.editor.cursorLineEnd\");\n\tconst jumpForward = host.getEditorKeyDisplay(\"tui.editor.jumpForward\");\n\tconst jumpBackward = host.getEditorKeyDisplay(\"tui.editor.jumpBackward\");\n\tconst pageUp = host.getEditorKeyDisplay(\"tui.editor.pageUp\");\n\tconst pageDown = host.getEditorKeyDisplay(\"tui.editor.pageDown\");\n\n\t// Editing keybindings\n\tconst submit = host.getEditorKeyDisplay(\"tui.input.submit\");\n\tconst newLine = host.getEditorKeyDisplay(\"tui.input.newLine\");\n\tconst deleteWordBackward = host.getEditorKeyDisplay(\"tui.editor.deleteWordBackward\");\n\tconst deleteWordForward = host.getEditorKeyDisplay(\"tui.editor.deleteWordForward\");\n\tconst deleteToLineStart = host.getEditorKeyDisplay(\"tui.editor.deleteToLineStart\");\n\tconst deleteToLineEnd = host.getEditorKeyDisplay(\"tui.editor.deleteToLineEnd\");\n\tconst yank = host.getEditorKeyDisplay(\"tui.editor.yank\");\n\tconst yankPop = host.getEditorKeyDisplay(\"tui.editor.yankPop\");\n\tconst undo = host.getEditorKeyDisplay(\"tui.editor.undo\");\n\tconst tab = host.getEditorKeyDisplay(\"tui.input.tab\");\n\n\t// App keybindings\n\tconst interrupt = host.getAppKeyDisplay(\"app.interrupt\");\n\tconst clear = host.getAppKeyDisplay(\"app.clear\");\n\tconst exit = host.getAppKeyDisplay(\"app.exit\");\n\tconst suspend = host.getAppKeyDisplay(\"app.suspend\");\n\tconst cycleThinkingLevel = host.getAppKeyDisplay(\"app.thinking.cycle\");\n\tconst cycleModelForward = host.getAppKeyDisplay(\"app.model.cycleForward\");\n\tconst selectModel = host.getAppKeyDisplay(\"app.model.select\");\n\tconst expandTools = host.getAppKeyDisplay(\"app.tools.expand\");\n\tconst toggleThinking = host.getAppKeyDisplay(\"app.thinking.toggle\");\n\tconst externalEditor = host.getAppKeyDisplay(\"app.editor.external\");\n\tconst cycleModelBackward = host.getAppKeyDisplay(\"app.model.cycleBackward\");\n\tconst followUp = host.getAppKeyDisplay(\"app.message.followUp\");\n\tconst dequeue = host.getAppKeyDisplay(\"app.message.dequeue\");\n\tconst pasteImage = host.getAppKeyDisplay(\"app.clipboard.pasteImage\");\n\n\tlet hotkeys = `\n**Navigation**\n| Key | Action |\n|-----|--------|\n| \\`${cursorUp}\\` / \\`${cursorDown}\\` / \\`${cursorLeft}\\` / \\`${cursorRight}\\` | Move cursor / browse history (Up when empty) |\n| \\`${cursorWordLeft}\\` / \\`${cursorWordRight}\\` | Move by word |\n| \\`${cursorLineStart}\\` | Start of line |\n| \\`${cursorLineEnd}\\` | End of line |\n| \\`${jumpForward}\\` | Jump forward to character |\n| \\`${jumpBackward}\\` | Jump backward to character |\n| \\`${pageUp}\\` / \\`${pageDown}\\` | Scroll by page |\n\n**Editing**\n| Key | Action |\n|-----|--------|\n| \\`${submit}\\` | Send message |\n| \\`${newLine}\\` | New line${process.platform === \"win32\" ? \" (Ctrl+Enter on Windows Terminal)\" : \"\"} |\n| \\`${deleteWordBackward}\\` | Delete word backwards |\n| \\`${deleteWordForward}\\` | Delete word forwards |\n| \\`${deleteToLineStart}\\` | Delete to start of line |\n| \\`${deleteToLineEnd}\\` | Delete to end of line |\n| \\`${yank}\\` | Paste the most-recently-deleted text |\n| \\`${yankPop}\\` | Cycle through the deleted text after pasting |\n| \\`${undo}\\` | Undo |\n\n**Other**\n| Key | Action |\n|-----|--------|\n| \\`${tab}\\` | Path completion / accept autocomplete |\n| \\`${interrupt}\\` | Cancel autocomplete / abort streaming |\n| \\`${clear}\\` | Clear editor (first) / exit (second) |\n| \\`${exit}\\` | Exit (when editor is empty) |\n| \\`${suspend}\\` | Suspend to background |\n| \\`${cycleThinkingLevel}\\` | Cycle thinking level |\n| \\`${cycleModelForward}\\` / \\`${cycleModelBackward}\\` | Cycle models |\n| \\`${selectModel}\\` | Open model selector |\n| \\`${expandTools}\\` | Toggle tool output expansion |\n| \\`${toggleThinking}\\` | Toggle thinking block visibility |\n| \\`${externalEditor}\\` | Edit message in external editor |\n| \\`${followUp}\\` | Queue follow-up message |\n| \\`${dequeue}\\` | Restore queued messages |\n| \\`${pasteImage}\\` | Paste image from clipboard |\n| \\`/\\` | Slash commands |\n| \\`!\\` | Run bash command |\n| \\`!!\\` | Run bash command (excluded from context) |\n`;\n\n\t// Add extension-registered shortcuts\n\tconst extensionRunner = host.session.extensionRunner;\n\tconst shortcuts = extensionRunner.getShortcuts(host.keybindings.getEffectiveConfig());\n\tif (shortcuts.size > 0) {\n\t\thotkeys += `\n**Extensions**\n| Key | Action |\n|-----|--------|\n`;\n\t\tfor (const [key, shortcut] of shortcuts) {\n\t\t\tconst description = shortcut.description ?? shortcut.extensionPath;\n\t\t\tconst keyDisplay = formatKeyText(key, { capitalize: true });\n\t\t\thotkeys += `| \\`${keyDisplay}\\` | ${description} |\\n`;\n\t\t}\n\t}\n\n\thost.chatContainer.addChild(new Spacer(1));\n\thost.chatContainer.addChild(new DynamicBorder());\n\thost.chatContainer.addChild(new Text(theme.bold(theme.fg(\"accent\", \"Keyboard Shortcuts\")), 1, 0));\n\thost.chatContainer.addChild(new Spacer(1));\n\thost.chatContainer.addChild(new Markdown(hotkeys.trim(), 1, 1, host.getMarkdownThemeWithSettings()));\n\thost.chatContainer.addChild(new DynamicBorder());\n\thost.ui.requestRender();\n}\n\nexport function handleDebugCommand(host: DebugReportHost): void {\n\tconst width = host.ui.terminal.columns;\n\tconst height = host.ui.terminal.rows;\n\tconst allLines = host.ui.render(width);\n\n\tconst debugLogPath = getDebugLogPath();\n\tconst debugData = [\n\t\t`Debug output at ${new Date().toISOString()}`,\n\t\t`Terminal: ${width}x${height}`,\n\t\t`Total lines: ${allLines.length}`,\n\t\t\"\",\n\t\t\"=== All rendered lines with visible widths ===\",\n\t\t...allLines.map((line, idx) => {\n\t\t\tconst vw = visibleWidth(line);\n\t\t\tconst escaped = JSON.stringify(line);\n\t\t\treturn `[${idx}] (w=${vw}) ${escaped}`;\n\t\t}),\n\t\t\"\",\n\t\t\"=== Agent messages (JSONL) ===\",\n\t\t...host.session.messages.map((msg) => JSON.stringify(msg)),\n\t\t\"\",\n\t].join(\"\\n\");\n\n\tfs.mkdirSync(path.dirname(debugLogPath), { recursive: true });\n\tfs.writeFileSync(debugLogPath, debugData);\n\n\thost.chatContainer.addChild(new Spacer(1));\n\thost.chatContainer.addChild(\n\t\tnew Text(`${theme.fg(\"accent\", \"✓ Debug log written\")}\\n${theme.fg(\"muted\", debugLogPath)}`, 1, 1),\n\t);\n\thost.ui.requestRender();\n}\n\nexport function handleArminSaysHi(host: ReportRenderHost): void {\n\thost.chatContainer.addChild(new Spacer(1));\n\thost.chatContainer.addChild(new ArminComponent(host.ui));\n\thost.ui.requestRender();\n}\n\nexport function handleDementedDelves(host: ReportRenderHost): void {\n\thost.chatContainer.addChild(new Spacer(1));\n\thost.chatContainer.addChild(new EarendilAnnouncementComponent());\n\thost.ui.requestRender();\n}\n\nexport function handleDaxnuts(host: ReportRenderHost): void {\n\thost.chatContainer.addChild(new Spacer(1));\n\thost.chatContainer.addChild(new DaxnutsComponent(host.ui));\n\thost.ui.requestRender();\n}\n\nexport function checkDaxnutsEasterEgg(host: ReportRenderHost, model: { provider: string; id: string }): void {\n\tif (model.provider === \"opencode\" && model.id.toLowerCase().includes(\"kimi-k2.5\")) {\n\t\thandleDaxnuts(host);\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"secret-menu-controller.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/secret-menu-controller.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EACN,KAAK,iBAAiB,EAItB,MAAM,0CAA0C,CAAC;AAqBlD,MAAM,WAAW,2BAA2B;IAC3C,OAAO,EAAE,iBAAiB,CAAC;IAC3B,GAAG,EAAE,MAAM,CAAC;CACZ;AAsDD,qBAAa,oBAAoB;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAC5C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAE7B,YAAY,OAAO,EAAE,2BAA2B,EAG/C;IAEK,IAAI,CAAC,EAAE,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuDhD;YAEa,OAAO;YAkBP,WAAW;YAyCX,mBAAmB;YA4BnB,UAAU;YAqBV,aAAa;YAqBb,QAAQ;YAcR,IAAI;YAcJ,MAAM;CAcpB"}
1
+ {"version":3,"file":"secret-menu-controller.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/secret-menu-controller.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EACN,KAAK,iBAAiB,EAItB,MAAM,0CAA0C,CAAC;AAsBlD,MAAM,WAAW,2BAA2B;IAC3C,OAAO,EAAE,iBAAiB,CAAC;IAC3B,GAAG,EAAE,MAAM,CAAC;CACZ;AAsDD,qBAAa,oBAAoB;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAC5C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAE7B,YAAY,OAAO,EAAE,2BAA2B,EAG/C;IAEK,IAAI,CAAC,EAAE,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuDhD;YAEa,OAAO;YAIP,WAAW;YAyCX,mBAAmB;YA4BnB,UAAU;YAqBV,aAAa;YAqBb,QAAQ;YAcR,IAAI;YAcJ,MAAM;CAcpB"}
@@ -1,6 +1,7 @@
1
1
  import { readFile, stat } from "node:fs/promises";
2
2
  import { isAbsolute } from "node:path";
3
3
  import { CredentialManagerError, CredentialStorageError, } from "../../core/secrets/credential-manager.js";
4
+ import { connectCredentialSessionWithMaskedPrompt } from "../../core/secrets/credential-session-connection.js";
4
5
  import { formatDotenvVariables, MAX_DOTENV_VALUE_BYTES, parseDotenvDocument, SecretDotenvError, } from "../../core/secrets/secret-dotenv.js";
5
6
  import { ExtensionEditorComponent } from "./components/extension-editor.js";
6
7
  const ADD_ACTION = "Add or update credentials";
@@ -115,24 +116,7 @@ export class SecretMenuController {
115
116
  }
116
117
  }
117
118
  async connect(ui) {
118
- while (true) {
119
- let sessionKey = await ui.input("Connect Bitwarden", "Paste BW_SESSION session key", {
120
- sensitive: true,
121
- });
122
- if (sessionKey === undefined)
123
- return false;
124
- try {
125
- await this.manager.connect(sessionKey);
126
- ui.notify("Bitwarden connected. Pi keeps the session key in memory only.", "info");
127
- return true;
128
- }
129
- catch (error) {
130
- ui.notify(safeErrorMessage(error), "error");
131
- }
132
- finally {
133
- sessionKey = "";
134
- }
135
- }
119
+ return (await connectCredentialSessionWithMaskedPrompt(this.manager, ui)) === "connected";
136
120
  }
137
121
  async addOrUpdate(ui, profiles) {
138
122
  const profileInput = await ui.input("Credential profile", "Example: deploy-prod");
@@ -1 +1 @@
1
- {"version":3,"file":"secret-menu-controller.js","sourceRoot":"","sources":["../../../src/modes/interactive/secret-menu-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile, stat } from \"node:fs/promises\";\nimport { isAbsolute } from \"node:path\";\nimport type { ExtensionUIContext } from \"../../core/extensions/types.ts\";\nimport {\n\ttype CredentialManager,\n\tCredentialManagerError,\n\ttype CredentialProfileSummary,\n\tCredentialStorageError,\n} from \"../../core/secrets/credential-manager.ts\";\nimport {\n\tformatDotenvVariables,\n\tMAX_DOTENV_VALUE_BYTES,\n\tparseDotenvDocument,\n\tSecretDotenvError,\n} from \"../../core/secrets/secret-dotenv.ts\";\nimport { ExtensionEditorComponent } from \"./components/extension-editor.ts\";\n\nconst ADD_ACTION = \"Add or update credentials\";\nconst ACTIVATE_ACTION = \"Activate credentials for this project\";\nconst BIND_ACTION = \"Use an existing profile in this project\";\nconst REMOVE_ACTION = \"Remove a credential profile\";\nconst RECONNECT_ACTION = \"Reconnect Bitwarden\";\nconst LOCK_ACTION = \"Lock Pi credentials\";\nconst CLOSE_ACTION = \"Close\";\n\nconst USER_PASSWORD_KIND = \"Username and password\";\nconst KEY_KIND = \"API token or private key\";\nconst DOTENV_KIND = \"Environment variables (.env format)\";\n\nexport interface SecretMenuControllerOptions {\n\tmanager: CredentialManager;\n\tcwd: string;\n}\n\nfunction safeErrorMessage(error: unknown): string {\n\tif (\n\t\terror instanceof CredentialManagerError ||\n\t\terror instanceof CredentialStorageError ||\n\t\terror instanceof SecretDotenvError\n\t) {\n\t\treturn error.message;\n\t}\n\treturn \"Credential operation failed safely without exposing private data.\";\n}\n\nasync function openPrivateEditor(\n\tui: ExtensionUIContext,\n\ttitle: string,\n\tprefill: string,\n\tnotice: string,\n): Promise<string | undefined> {\n\treturn ui.custom<string | undefined>(\n\t\t(tui, _theme, keybindings, done) =>\n\t\t\tnew ExtensionEditorComponent(\n\t\t\t\ttui,\n\t\t\t\tkeybindings,\n\t\t\t\ttitle,\n\t\t\t\tprefill,\n\t\t\t\t(value) => done(value),\n\t\t\t\t() => done(undefined),\n\t\t\t\t{\n\t\t\t\t\tprivateContent: true,\n\t\t\t\t\tallowExternalEditor: false,\n\t\t\t\t\tnotice,\n\t\t\t\t},\n\t\t\t),\n\t);\n}\n\nfunction unquoteDroppedPath(value: string): string {\n\tif (value.length < 2) return value;\n\tconst first = value[0];\n\treturn (first === '\"' || first === \"'\") && value.at(-1) === first ? value.slice(1, -1) : value;\n}\n\nasync function resolvePrivateValue(editorValue: string): Promise<string> {\n\tconst pathCandidate = unquoteDroppedPath(editorValue.trim());\n\tif (!isAbsolute(pathCandidate)) return editorValue;\n\tconst metadata = await stat(pathCandidate).catch(() => undefined);\n\tif (!metadata?.isFile()) throw new SecretDotenvError(\"dropped key file was not found or is not a regular file\");\n\tif (metadata.size > MAX_DOTENV_VALUE_BYTES) {\n\t\tthrow new SecretDotenvError(\"dropped key file exceeds the 64 KiB value limit\");\n\t}\n\treturn readFile(pathCandidate, \"utf8\");\n}\n\nexport class SecretMenuController {\n\tprivate readonly manager: CredentialManager;\n\tprivate readonly cwd: string;\n\n\tconstructor(options: SecretMenuControllerOptions) {\n\t\tthis.manager = options.manager;\n\t\tthis.cwd = options.cwd;\n\t}\n\n\tasync open(ui: ExtensionUIContext): Promise<void> {\n\t\tlet profiles: CredentialProfileSummary[] | undefined;\n\t\tif (!this.manager.status.connected && this.manager.status.sessionAvailable) {\n\t\t\ttry {\n\t\t\t\tprofiles = await this.manager.listForProject(this.cwd);\n\t\t\t} catch {\n\t\t\t\t// A stale BW_SESSION falls through to the one-field owner reconnect flow.\n\t\t\t}\n\t\t}\n\t\tif (!this.manager.status.connected) {\n\t\t\tif (!(await this.connect(ui))) return;\n\t\t}\n\t\twhile (true) {\n\t\t\ttry {\n\t\t\t\tprofiles ??= await this.manager.listForProject(this.cwd);\n\t\t\t\tconst actions = [ADD_ACTION];\n\t\t\t\tif (profiles.some((profile) => profile.boundToCurrentProject)) actions.push(ACTIVATE_ACTION);\n\t\t\t\tif (profiles.some((profile) => !profile.boundToCurrentProject)) actions.push(BIND_ACTION);\n\t\t\t\tif (profiles.length > 0) actions.push(REMOVE_ACTION);\n\t\t\t\tactions.push(RECONNECT_ACTION, LOCK_ACTION, CLOSE_ACTION);\n\t\t\t\tconst action = await ui.select(\"Secrets · Bitwarden\", actions);\n\t\t\t\tswitch (action) {\n\t\t\t\t\tcase ADD_ACTION:\n\t\t\t\t\t\tawait this.addOrUpdate(ui, profiles);\n\t\t\t\t\t\tprofiles = undefined;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tcase ACTIVATE_ACTION:\n\t\t\t\t\t\tawait this.activate(ui, profiles);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tcase BIND_ACTION:\n\t\t\t\t\t\tawait this.bind(ui, profiles);\n\t\t\t\t\t\tprofiles = undefined;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tcase REMOVE_ACTION:\n\t\t\t\t\t\tawait this.remove(ui, profiles);\n\t\t\t\t\t\tprofiles = undefined;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tcase RECONNECT_ACTION:\n\t\t\t\t\t\tthis.manager.lock();\n\t\t\t\t\t\tif (!(await this.connect(ui))) return;\n\t\t\t\t\t\tprofiles = undefined;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tcase LOCK_ACTION:\n\t\t\t\t\t\tthis.manager.lock();\n\t\t\t\t\t\tui.notify(\"Pi credential access is locked for this session.\", \"info\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\tcase CLOSE_ACTION:\n\t\t\t\t\tcase undefined:\n\t\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tui.notify(safeErrorMessage(error), \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async connect(ui: ExtensionUIContext): Promise<boolean> {\n\t\twhile (true) {\n\t\t\tlet sessionKey = await ui.input(\"Connect Bitwarden\", \"Paste BW_SESSION session key\", {\n\t\t\t\tsensitive: true,\n\t\t\t});\n\t\t\tif (sessionKey === undefined) return false;\n\t\t\ttry {\n\t\t\t\tawait this.manager.connect(sessionKey);\n\t\t\t\tui.notify(\"Bitwarden connected. Pi keeps the session key in memory only.\", \"info\");\n\t\t\t\treturn true;\n\t\t\t} catch (error) {\n\t\t\t\tui.notify(safeErrorMessage(error), \"error\");\n\t\t\t} finally {\n\t\t\t\tsessionKey = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async addOrUpdate(ui: ExtensionUIContext, profiles: CredentialProfileSummary[]): Promise<void> {\n\t\tconst profileInput = await ui.input(\"Credential profile\", \"Example: deploy-prod\");\n\t\tif (profileInput === undefined) return;\n\t\tconst profile = profileInput.trim();\n\t\tif (!profile) {\n\t\t\tui.notify(\"Credential profile name is required.\", \"error\");\n\t\t\treturn;\n\t\t}\n\t\tif (profiles.some((candidate) => candidate.profile === profile)) {\n\t\t\tconst approved = await ui.confirm(\n\t\t\t\t\"Update credential profile\",\n\t\t\t\t`Replace the stored values for ${profile} while preserving its project bindings?`,\n\t\t\t);\n\t\t\tif (!approved) return;\n\t\t}\n\t\tconst descriptionInput = await ui.input(\"Description\", \"Optional non-secret description\");\n\t\tif (descriptionInput === undefined) return;\n\t\tconst description = descriptionInput.trim() || undefined;\n\t\tconst kind = await ui.select(\"Credential shape\", [USER_PASSWORD_KIND, KEY_KIND, DOTENV_KIND]);\n\t\tif (!kind) return;\n\t\tlet dotenv = \"\";\n\t\ttry {\n\t\t\tif (kind === USER_PASSWORD_KIND) dotenv = (await this.captureUserPassword(ui)) ?? \"\";\n\t\t\telse if (kind === KEY_KIND) dotenv = (await this.captureKey(ui)) ?? \"\";\n\t\t\telse dotenv = (await this.captureDotenv(ui)) ?? \"\";\n\t\t\tif (!dotenv) return;\n\t\t\tconst stored = await this.manager.storeForProject(this.cwd, { profile, description, dotenv });\n\t\t\tui.notify(\n\t\t\t\t`Stored and activated ${stored.profile} (${stored.variableNames.length} variables) in Bitwarden.`,\n\t\t\t\t\"info\",\n\t\t\t);\n\t\t\tif (stored.portable === false) {\n\t\t\t\tui.notify(\"This project has no portable Git remote, so its binding is local to this machine.\", \"warning\");\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tui.notify(safeErrorMessage(error), \"error\");\n\t\t} finally {\n\t\t\tdotenv = \"\";\n\t\t}\n\t}\n\n\tprivate async captureUserPassword(ui: ExtensionUIContext): Promise<string | undefined> {\n\t\tconst usernameVariableInput = await ui.input(\"Username variable\", \"USERNAME\");\n\t\tif (usernameVariableInput === undefined) return undefined;\n\t\tconst usernameVariable = usernameVariableInput.trim() || \"USERNAME\";\n\t\tlet username = await ui.input(\"Username\", \"Type the account username\", { sensitive: true });\n\t\tif (username === undefined) return undefined;\n\t\tconst passwordVariableInput = await ui.input(\"Password variable\", \"PASSWORD\");\n\t\tif (passwordVariableInput === undefined) {\n\t\t\tusername = \"\";\n\t\t\treturn undefined;\n\t\t}\n\t\tconst passwordVariable = passwordVariableInput.trim() || \"PASSWORD\";\n\t\tlet password = await ui.input(\"Password\", \"Type the account password\", { sensitive: true });\n\t\tif (password === undefined) {\n\t\t\tusername = \"\";\n\t\t\treturn undefined;\n\t\t}\n\t\ttry {\n\t\t\treturn formatDotenvVariables([\n\t\t\t\t{ name: usernameVariable, value: username },\n\t\t\t\t{ name: passwordVariable, value: password },\n\t\t\t]);\n\t\t} finally {\n\t\t\tusername = \"\";\n\t\t\tpassword = \"\";\n\t\t}\n\t}\n\n\tprivate async captureKey(ui: ExtensionUIContext): Promise<string | undefined> {\n\t\tconst variableInput = await ui.input(\"Key variable\", \"API_KEY\");\n\t\tif (variableInput === undefined) return undefined;\n\t\tconst variable = variableInput.trim() || \"API_KEY\";\n\t\tlet editorValue = await openPrivateEditor(\n\t\t\tui,\n\t\t\t`Private value · ${variable}`,\n\t\t\t\"\",\n\t\t\t\"Paste a token/key, or drag an absolute key-file path here · never sent to the model\",\n\t\t);\n\t\tif (editorValue === undefined) return undefined;\n\t\tlet value = \"\";\n\t\ttry {\n\t\t\tvalue = await resolvePrivateValue(editorValue);\n\t\t\treturn formatDotenvVariables([{ name: variable, value }]);\n\t\t} finally {\n\t\t\teditorValue = \"\";\n\t\t\tvalue = \"\";\n\t\t}\n\t}\n\n\tprivate async captureDotenv(ui: ExtensionUIContext): Promise<string | undefined> {\n\t\tlet draft = \"# NAME=value\\n\";\n\t\twhile (true) {\n\t\t\tconst edited = await openPrivateEditor(\n\t\t\t\tui,\n\t\t\t\t\"Environment credentials\",\n\t\t\t\tdraft,\n\t\t\t\t\"Private .env editor · paste one or more NAME=value entries · never sent to the model\",\n\t\t\t);\n\t\t\tif (edited === undefined) return undefined;\n\t\t\ttry {\n\t\t\t\tconst parsed = parseDotenvDocument(edited);\n\t\t\t\tdraft = \"\";\n\t\t\t\treturn parsed.document;\n\t\t\t} catch (error) {\n\t\t\t\tui.notify(safeErrorMessage(error), \"error\");\n\t\t\t\tdraft = edited;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async activate(ui: ExtensionUIContext, profiles: CredentialProfileSummary[]): Promise<void> {\n\t\tconst bound = profiles.filter((profile) => profile.boundToCurrentProject);\n\t\tconst profile = await ui.select(\n\t\t\t\"Activate credentials\",\n\t\t\tbound.map((candidate) => candidate.profile),\n\t\t);\n\t\tif (!profile) return;\n\t\tconst activated = await this.manager.activateForProject(this.cwd, profile);\n\t\tui.notify(\n\t\t\t`Activated ${activated.profile} for ${activated.project} (${activated.variableNames.length} variables).`,\n\t\t\t\"info\",\n\t\t);\n\t}\n\n\tprivate async bind(ui: ExtensionUIContext, profiles: CredentialProfileSummary[]): Promise<void> {\n\t\tconst unbound = profiles.filter((profile) => !profile.boundToCurrentProject);\n\t\tconst profile = await ui.select(\n\t\t\t\"Use profile in this project\",\n\t\t\tunbound.map((candidate) => candidate.profile),\n\t\t);\n\t\tif (!profile) return;\n\t\tconst bound = await this.manager.bindProfileToProject(this.cwd, profile);\n\t\tui.notify(`Bound ${bound.profile} to ${bound.project}.`, \"info\");\n\t\tif (bound.portable === false) {\n\t\t\tui.notify(\"This project has no portable Git remote, so its binding is local to this machine.\", \"warning\");\n\t\t}\n\t}\n\n\tprivate async remove(ui: ExtensionUIContext, profiles: CredentialProfileSummary[]): Promise<void> {\n\t\tconst profile = await ui.select(\n\t\t\t\"Remove credential profile\",\n\t\t\tprofiles.map((candidate) => candidate.profile),\n\t\t);\n\t\tif (!profile) return;\n\t\tconst approved = await ui.confirm(\n\t\t\t\"Remove credential profile\",\n\t\t\t`Move ${profile} to Bitwarden trash and clear its active environment?`,\n\t\t);\n\t\tif (!approved) return;\n\t\tconst removed = await this.manager.removeProfile(profile);\n\t\tui.notify(`Removed ${removed.profile} (${removed.variableNames.length} variables).`, \"info\");\n\t}\n}\n"]}
1
+ {"version":3,"file":"secret-menu-controller.js","sourceRoot":"","sources":["../../../src/modes/interactive/secret-menu-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile, stat } from \"node:fs/promises\";\nimport { isAbsolute } from \"node:path\";\nimport type { ExtensionUIContext } from \"../../core/extensions/types.ts\";\nimport {\n\ttype CredentialManager,\n\tCredentialManagerError,\n\ttype CredentialProfileSummary,\n\tCredentialStorageError,\n} from \"../../core/secrets/credential-manager.ts\";\nimport { connectCredentialSessionWithMaskedPrompt } from \"../../core/secrets/credential-session-connection.ts\";\nimport {\n\tformatDotenvVariables,\n\tMAX_DOTENV_VALUE_BYTES,\n\tparseDotenvDocument,\n\tSecretDotenvError,\n} from \"../../core/secrets/secret-dotenv.ts\";\nimport { ExtensionEditorComponent } from \"./components/extension-editor.ts\";\n\nconst ADD_ACTION = \"Add or update credentials\";\nconst ACTIVATE_ACTION = \"Activate credentials for this project\";\nconst BIND_ACTION = \"Use an existing profile in this project\";\nconst REMOVE_ACTION = \"Remove a credential profile\";\nconst RECONNECT_ACTION = \"Reconnect Bitwarden\";\nconst LOCK_ACTION = \"Lock Pi credentials\";\nconst CLOSE_ACTION = \"Close\";\n\nconst USER_PASSWORD_KIND = \"Username and password\";\nconst KEY_KIND = \"API token or private key\";\nconst DOTENV_KIND = \"Environment variables (.env format)\";\n\nexport interface SecretMenuControllerOptions {\n\tmanager: CredentialManager;\n\tcwd: string;\n}\n\nfunction safeErrorMessage(error: unknown): string {\n\tif (\n\t\terror instanceof CredentialManagerError ||\n\t\terror instanceof CredentialStorageError ||\n\t\terror instanceof SecretDotenvError\n\t) {\n\t\treturn error.message;\n\t}\n\treturn \"Credential operation failed safely without exposing private data.\";\n}\n\nasync function openPrivateEditor(\n\tui: ExtensionUIContext,\n\ttitle: string,\n\tprefill: string,\n\tnotice: string,\n): Promise<string | undefined> {\n\treturn ui.custom<string | undefined>(\n\t\t(tui, _theme, keybindings, done) =>\n\t\t\tnew ExtensionEditorComponent(\n\t\t\t\ttui,\n\t\t\t\tkeybindings,\n\t\t\t\ttitle,\n\t\t\t\tprefill,\n\t\t\t\t(value) => done(value),\n\t\t\t\t() => done(undefined),\n\t\t\t\t{\n\t\t\t\t\tprivateContent: true,\n\t\t\t\t\tallowExternalEditor: false,\n\t\t\t\t\tnotice,\n\t\t\t\t},\n\t\t\t),\n\t);\n}\n\nfunction unquoteDroppedPath(value: string): string {\n\tif (value.length < 2) return value;\n\tconst first = value[0];\n\treturn (first === '\"' || first === \"'\") && value.at(-1) === first ? value.slice(1, -1) : value;\n}\n\nasync function resolvePrivateValue(editorValue: string): Promise<string> {\n\tconst pathCandidate = unquoteDroppedPath(editorValue.trim());\n\tif (!isAbsolute(pathCandidate)) return editorValue;\n\tconst metadata = await stat(pathCandidate).catch(() => undefined);\n\tif (!metadata?.isFile()) throw new SecretDotenvError(\"dropped key file was not found or is not a regular file\");\n\tif (metadata.size > MAX_DOTENV_VALUE_BYTES) {\n\t\tthrow new SecretDotenvError(\"dropped key file exceeds the 64 KiB value limit\");\n\t}\n\treturn readFile(pathCandidate, \"utf8\");\n}\n\nexport class SecretMenuController {\n\tprivate readonly manager: CredentialManager;\n\tprivate readonly cwd: string;\n\n\tconstructor(options: SecretMenuControllerOptions) {\n\t\tthis.manager = options.manager;\n\t\tthis.cwd = options.cwd;\n\t}\n\n\tasync open(ui: ExtensionUIContext): Promise<void> {\n\t\tlet profiles: CredentialProfileSummary[] | undefined;\n\t\tif (!this.manager.status.connected && this.manager.status.sessionAvailable) {\n\t\t\ttry {\n\t\t\t\tprofiles = await this.manager.listForProject(this.cwd);\n\t\t\t} catch {\n\t\t\t\t// A stale BW_SESSION falls through to the one-field owner reconnect flow.\n\t\t\t}\n\t\t}\n\t\tif (!this.manager.status.connected) {\n\t\t\tif (!(await this.connect(ui))) return;\n\t\t}\n\t\twhile (true) {\n\t\t\ttry {\n\t\t\t\tprofiles ??= await this.manager.listForProject(this.cwd);\n\t\t\t\tconst actions = [ADD_ACTION];\n\t\t\t\tif (profiles.some((profile) => profile.boundToCurrentProject)) actions.push(ACTIVATE_ACTION);\n\t\t\t\tif (profiles.some((profile) => !profile.boundToCurrentProject)) actions.push(BIND_ACTION);\n\t\t\t\tif (profiles.length > 0) actions.push(REMOVE_ACTION);\n\t\t\t\tactions.push(RECONNECT_ACTION, LOCK_ACTION, CLOSE_ACTION);\n\t\t\t\tconst action = await ui.select(\"Secrets · Bitwarden\", actions);\n\t\t\t\tswitch (action) {\n\t\t\t\t\tcase ADD_ACTION:\n\t\t\t\t\t\tawait this.addOrUpdate(ui, profiles);\n\t\t\t\t\t\tprofiles = undefined;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tcase ACTIVATE_ACTION:\n\t\t\t\t\t\tawait this.activate(ui, profiles);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tcase BIND_ACTION:\n\t\t\t\t\t\tawait this.bind(ui, profiles);\n\t\t\t\t\t\tprofiles = undefined;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tcase REMOVE_ACTION:\n\t\t\t\t\t\tawait this.remove(ui, profiles);\n\t\t\t\t\t\tprofiles = undefined;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tcase RECONNECT_ACTION:\n\t\t\t\t\t\tthis.manager.lock();\n\t\t\t\t\t\tif (!(await this.connect(ui))) return;\n\t\t\t\t\t\tprofiles = undefined;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tcase LOCK_ACTION:\n\t\t\t\t\t\tthis.manager.lock();\n\t\t\t\t\t\tui.notify(\"Pi credential access is locked for this session.\", \"info\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\tcase CLOSE_ACTION:\n\t\t\t\t\tcase undefined:\n\t\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tui.notify(safeErrorMessage(error), \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async connect(ui: ExtensionUIContext): Promise<boolean> {\n\t\treturn (await connectCredentialSessionWithMaskedPrompt(this.manager, ui)) === \"connected\";\n\t}\n\n\tprivate async addOrUpdate(ui: ExtensionUIContext, profiles: CredentialProfileSummary[]): Promise<void> {\n\t\tconst profileInput = await ui.input(\"Credential profile\", \"Example: deploy-prod\");\n\t\tif (profileInput === undefined) return;\n\t\tconst profile = profileInput.trim();\n\t\tif (!profile) {\n\t\t\tui.notify(\"Credential profile name is required.\", \"error\");\n\t\t\treturn;\n\t\t}\n\t\tif (profiles.some((candidate) => candidate.profile === profile)) {\n\t\t\tconst approved = await ui.confirm(\n\t\t\t\t\"Update credential profile\",\n\t\t\t\t`Replace the stored values for ${profile} while preserving its project bindings?`,\n\t\t\t);\n\t\t\tif (!approved) return;\n\t\t}\n\t\tconst descriptionInput = await ui.input(\"Description\", \"Optional non-secret description\");\n\t\tif (descriptionInput === undefined) return;\n\t\tconst description = descriptionInput.trim() || undefined;\n\t\tconst kind = await ui.select(\"Credential shape\", [USER_PASSWORD_KIND, KEY_KIND, DOTENV_KIND]);\n\t\tif (!kind) return;\n\t\tlet dotenv = \"\";\n\t\ttry {\n\t\t\tif (kind === USER_PASSWORD_KIND) dotenv = (await this.captureUserPassword(ui)) ?? \"\";\n\t\t\telse if (kind === KEY_KIND) dotenv = (await this.captureKey(ui)) ?? \"\";\n\t\t\telse dotenv = (await this.captureDotenv(ui)) ?? \"\";\n\t\t\tif (!dotenv) return;\n\t\t\tconst stored = await this.manager.storeForProject(this.cwd, { profile, description, dotenv });\n\t\t\tui.notify(\n\t\t\t\t`Stored and activated ${stored.profile} (${stored.variableNames.length} variables) in Bitwarden.`,\n\t\t\t\t\"info\",\n\t\t\t);\n\t\t\tif (stored.portable === false) {\n\t\t\t\tui.notify(\"This project has no portable Git remote, so its binding is local to this machine.\", \"warning\");\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tui.notify(safeErrorMessage(error), \"error\");\n\t\t} finally {\n\t\t\tdotenv = \"\";\n\t\t}\n\t}\n\n\tprivate async captureUserPassword(ui: ExtensionUIContext): Promise<string | undefined> {\n\t\tconst usernameVariableInput = await ui.input(\"Username variable\", \"USERNAME\");\n\t\tif (usernameVariableInput === undefined) return undefined;\n\t\tconst usernameVariable = usernameVariableInput.trim() || \"USERNAME\";\n\t\tlet username = await ui.input(\"Username\", \"Type the account username\", { sensitive: true });\n\t\tif (username === undefined) return undefined;\n\t\tconst passwordVariableInput = await ui.input(\"Password variable\", \"PASSWORD\");\n\t\tif (passwordVariableInput === undefined) {\n\t\t\tusername = \"\";\n\t\t\treturn undefined;\n\t\t}\n\t\tconst passwordVariable = passwordVariableInput.trim() || \"PASSWORD\";\n\t\tlet password = await ui.input(\"Password\", \"Type the account password\", { sensitive: true });\n\t\tif (password === undefined) {\n\t\t\tusername = \"\";\n\t\t\treturn undefined;\n\t\t}\n\t\ttry {\n\t\t\treturn formatDotenvVariables([\n\t\t\t\t{ name: usernameVariable, value: username },\n\t\t\t\t{ name: passwordVariable, value: password },\n\t\t\t]);\n\t\t} finally {\n\t\t\tusername = \"\";\n\t\t\tpassword = \"\";\n\t\t}\n\t}\n\n\tprivate async captureKey(ui: ExtensionUIContext): Promise<string | undefined> {\n\t\tconst variableInput = await ui.input(\"Key variable\", \"API_KEY\");\n\t\tif (variableInput === undefined) return undefined;\n\t\tconst variable = variableInput.trim() || \"API_KEY\";\n\t\tlet editorValue = await openPrivateEditor(\n\t\t\tui,\n\t\t\t`Private value · ${variable}`,\n\t\t\t\"\",\n\t\t\t\"Paste a token/key, or drag an absolute key-file path here · never sent to the model\",\n\t\t);\n\t\tif (editorValue === undefined) return undefined;\n\t\tlet value = \"\";\n\t\ttry {\n\t\t\tvalue = await resolvePrivateValue(editorValue);\n\t\t\treturn formatDotenvVariables([{ name: variable, value }]);\n\t\t} finally {\n\t\t\teditorValue = \"\";\n\t\t\tvalue = \"\";\n\t\t}\n\t}\n\n\tprivate async captureDotenv(ui: ExtensionUIContext): Promise<string | undefined> {\n\t\tlet draft = \"# NAME=value\\n\";\n\t\twhile (true) {\n\t\t\tconst edited = await openPrivateEditor(\n\t\t\t\tui,\n\t\t\t\t\"Environment credentials\",\n\t\t\t\tdraft,\n\t\t\t\t\"Private .env editor · paste one or more NAME=value entries · never sent to the model\",\n\t\t\t);\n\t\t\tif (edited === undefined) return undefined;\n\t\t\ttry {\n\t\t\t\tconst parsed = parseDotenvDocument(edited);\n\t\t\t\tdraft = \"\";\n\t\t\t\treturn parsed.document;\n\t\t\t} catch (error) {\n\t\t\t\tui.notify(safeErrorMessage(error), \"error\");\n\t\t\t\tdraft = edited;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async activate(ui: ExtensionUIContext, profiles: CredentialProfileSummary[]): Promise<void> {\n\t\tconst bound = profiles.filter((profile) => profile.boundToCurrentProject);\n\t\tconst profile = await ui.select(\n\t\t\t\"Activate credentials\",\n\t\t\tbound.map((candidate) => candidate.profile),\n\t\t);\n\t\tif (!profile) return;\n\t\tconst activated = await this.manager.activateForProject(this.cwd, profile);\n\t\tui.notify(\n\t\t\t`Activated ${activated.profile} for ${activated.project} (${activated.variableNames.length} variables).`,\n\t\t\t\"info\",\n\t\t);\n\t}\n\n\tprivate async bind(ui: ExtensionUIContext, profiles: CredentialProfileSummary[]): Promise<void> {\n\t\tconst unbound = profiles.filter((profile) => !profile.boundToCurrentProject);\n\t\tconst profile = await ui.select(\n\t\t\t\"Use profile in this project\",\n\t\t\tunbound.map((candidate) => candidate.profile),\n\t\t);\n\t\tif (!profile) return;\n\t\tconst bound = await this.manager.bindProfileToProject(this.cwd, profile);\n\t\tui.notify(`Bound ${bound.profile} to ${bound.project}.`, \"info\");\n\t\tif (bound.portable === false) {\n\t\t\tui.notify(\"This project has no portable Git remote, so its binding is local to this machine.\", \"warning\");\n\t\t}\n\t}\n\n\tprivate async remove(ui: ExtensionUIContext, profiles: CredentialProfileSummary[]): Promise<void> {\n\t\tconst profile = await ui.select(\n\t\t\t\"Remove credential profile\",\n\t\t\tprofiles.map((candidate) => candidate.profile),\n\t\t);\n\t\tif (!profile) return;\n\t\tconst approved = await ui.confirm(\n\t\t\t\"Remove credential profile\",\n\t\t\t`Move ${profile} to Bitwarden trash and clear its active environment?`,\n\t\t);\n\t\tif (!approved) return;\n\t\tconst removed = await this.manager.removeProfile(profile);\n\t\tui.notify(`Removed ${removed.profile} (${removed.variableNames.length} variables).`, \"info\");\n\t}\n}\n"]}
@@ -639,7 +639,7 @@ export function handleTaskCommand(host, text) {
639
639
  return;
640
640
  }
641
641
  if (parsed.command.type === "retired_execution") {
642
- host.showStatus(`/task ${parsed.command.operation} was retired with the detached extension runner. Ask Pi to use native delegate/delegate_status; session-owned worker lanes notify on completion without polling.`);
642
+ host.showStatus(`/task ${parsed.command.operation} was retired with the detached extension runner. Ask Pi to use native delegate; session-owned worker lanes notify on completion without polling.`);
643
643
  return;
644
644
  }
645
645
  const now = new Date().toISOString();