pi-crew 0.9.53 → 0.9.55

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 (493) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/package.json +6 -3
  3. package/scripts/clean-strip-types.mjs +60 -0
  4. package/src/adapters/claude-adapter.ts +23 -0
  5. package/src/adapters/codex-adapter.ts +21 -0
  6. package/src/adapters/cursor-adapter.ts +17 -0
  7. package/src/adapters/export-util.ts +143 -0
  8. package/src/adapters/index.ts +15 -0
  9. package/src/adapters/registry.ts +18 -0
  10. package/src/adapters/types.ts +23 -0
  11. package/src/agents/agent-config.ts +194 -0
  12. package/src/agents/agent-search.ts +98 -0
  13. package/src/agents/agent-serializer.ts +38 -0
  14. package/src/agents/discover-agents.ts +623 -0
  15. package/src/benchmark/benchmark-runner.ts +313 -0
  16. package/src/benchmark/feedback-loop.ts +73 -0
  17. package/src/config/config.ts +1270 -0
  18. package/src/config/defaults.ts +193 -0
  19. package/src/config/drift-detector.ts +290 -0
  20. package/src/config/markers.ts +330 -0
  21. package/src/config/resilient-parser.ts +117 -0
  22. package/src/config/role-tools.ts +118 -0
  23. package/src/config/suggestions.ts +75 -0
  24. package/src/config/types.ts +280 -0
  25. package/src/errors.ts +194 -0
  26. package/src/extension/action-suggestions.ts +117 -0
  27. package/src/extension/async-notifier.ts +179 -0
  28. package/src/extension/autonomous-policy.ts +209 -0
  29. package/src/extension/command-completions.ts +120 -0
  30. package/src/extension/context-status-injection.ts +185 -0
  31. package/src/extension/crew-autocomplete.ts +131 -0
  32. package/src/extension/crew-cleanup.ts +168 -0
  33. package/src/extension/crew-input-router.ts +93 -0
  34. package/src/extension/crew-shortcuts.ts +87 -0
  35. package/src/extension/crew-vibes/cat-frames.ts +18 -0
  36. package/src/extension/crew-vibes/config.ts +195 -0
  37. package/src/extension/crew-vibes/figures.ts +101 -0
  38. package/src/extension/crew-vibes/font-detect.ts +71 -0
  39. package/src/extension/crew-vibes/footer.ts +292 -0
  40. package/src/extension/crew-vibes/index.ts +432 -0
  41. package/src/extension/crew-vibes/provider-usage.ts +396 -0
  42. package/src/extension/crew-vibes/render.ts +206 -0
  43. package/src/extension/crew-vibes/speed.ts +286 -0
  44. package/src/extension/cross-extension-rpc.ts +350 -0
  45. package/src/extension/help.ts +62 -0
  46. package/src/extension/import-index.ts +74 -0
  47. package/src/extension/knowledge-injection.ts +402 -0
  48. package/src/extension/management.ts +571 -0
  49. package/src/extension/message-renderers.ts +108 -0
  50. package/src/extension/notification-router.ts +152 -0
  51. package/src/extension/notification-sink.ts +54 -0
  52. package/src/extension/pi-api.ts +56 -0
  53. package/src/extension/plan-orchestrate.ts +302 -0
  54. package/src/extension/project-init.ts +170 -0
  55. package/src/extension/register.ts +113 -0
  56. package/src/extension/registration/artifact-cleanup.ts +20 -0
  57. package/src/extension/registration/command-registration.ts +58 -0
  58. package/src/extension/registration/command-utils.ts +58 -0
  59. package/src/extension/registration/commands.ts +1228 -0
  60. package/src/extension/registration/compaction-guard.ts +333 -0
  61. package/src/extension/registration/context-builder.ts +135 -0
  62. package/src/extension/registration/crash-recovery-cache.ts +54 -0
  63. package/src/extension/registration/foreground-run-controller.ts +238 -0
  64. package/src/extension/registration/hook-registration.ts +119 -0
  65. package/src/extension/registration/lazy-configurers.ts +124 -0
  66. package/src/extension/registration/lifecycle-handlers.ts +923 -0
  67. package/src/extension/registration/lifecycle.ts +259 -0
  68. package/src/extension/registration/observability.ts +322 -0
  69. package/src/extension/registration/registration-types.ts +158 -0
  70. package/src/extension/registration/runtime-cleanup.ts +230 -0
  71. package/src/extension/registration/subagent-helpers.ts +125 -0
  72. package/src/extension/registration/subagent-manager-setup.ts +330 -0
  73. package/src/extension/registration/subagent-tools.ts +456 -0
  74. package/src/extension/registration/team-tool.ts +225 -0
  75. package/src/extension/registration/tool-registration.ts +50 -0
  76. package/src/extension/registration/ui.ts +172 -0
  77. package/src/extension/registration/viewers.ts +121 -0
  78. package/src/extension/registration/wire-cross-extension.ts +37 -0
  79. package/src/extension/result-watcher.ts +139 -0
  80. package/src/extension/rpc-hmac.ts +256 -0
  81. package/src/extension/run-bundle-schema.ts +104 -0
  82. package/src/extension/run-export.ts +97 -0
  83. package/src/extension/run-import.ts +168 -0
  84. package/src/extension/run-index.ts +131 -0
  85. package/src/extension/run-maintenance.ts +190 -0
  86. package/src/extension/session-summary.ts +18 -0
  87. package/src/extension/team-manager-command.ts +153 -0
  88. package/src/extension/team-onboard.ts +180 -0
  89. package/src/extension/team-recommendation.ts +288 -0
  90. package/src/extension/team-tool/anchor.ts +172 -0
  91. package/src/extension/team-tool/api.ts +1244 -0
  92. package/src/extension/team-tool/auto-summarize.ts +142 -0
  93. package/src/extension/team-tool/cache-control.ts +19 -0
  94. package/src/extension/team-tool/cancel.ts +337 -0
  95. package/src/extension/team-tool/chain-dispatch.ts +95 -0
  96. package/src/extension/team-tool/chain-executor.ts +379 -0
  97. package/src/extension/team-tool/config-patch.ts +50 -0
  98. package/src/extension/team-tool/context.ts +149 -0
  99. package/src/extension/team-tool/destructive-gate.ts +52 -0
  100. package/src/extension/team-tool/dispatch/automate.ts +80 -0
  101. package/src/extension/team-tool/dispatch/control.ts +42 -0
  102. package/src/extension/team-tool/dispatch/index.ts +95 -0
  103. package/src/extension/team-tool/dispatch/manage.ts +161 -0
  104. package/src/extension/team-tool/dispatch/run.ts +53 -0
  105. package/src/extension/team-tool/dispatch/status.ts +187 -0
  106. package/src/extension/team-tool/doctor.ts +431 -0
  107. package/src/extension/team-tool/explain.ts +282 -0
  108. package/src/extension/team-tool/failure-patterns.ts +118 -0
  109. package/src/extension/team-tool/goal-wrap.ts +330 -0
  110. package/src/extension/team-tool/goal.ts +556 -0
  111. package/src/extension/team-tool/handle-schedule.ts +332 -0
  112. package/src/extension/team-tool/handle-settings.ts +520 -0
  113. package/src/extension/team-tool/health-monitor.ts +481 -0
  114. package/src/extension/team-tool/inspect.ts +88 -0
  115. package/src/extension/team-tool/intent-policy.ts +45 -0
  116. package/src/extension/team-tool/lifecycle-actions.ts +615 -0
  117. package/src/extension/team-tool/orchestrate.ts +98 -0
  118. package/src/extension/team-tool/parallel-dispatch.ts +183 -0
  119. package/src/extension/team-tool/plan.ts +50 -0
  120. package/src/extension/team-tool/respond.ts +150 -0
  121. package/src/extension/team-tool/run-deadline.ts +66 -0
  122. package/src/extension/team-tool/run-not-found.ts +49 -0
  123. package/src/extension/team-tool/run.ts +1051 -0
  124. package/src/extension/team-tool/status.ts +260 -0
  125. package/src/extension/team-tool/workflow-manage.ts +261 -0
  126. package/src/extension/team-tool-types.ts +26 -0
  127. package/src/extension/team-tool.ts +750 -0
  128. package/src/extension/tool-result.ts +16 -0
  129. package/src/extension/validate-resources.ts +108 -0
  130. package/src/hooks/registry.ts +200 -0
  131. package/src/hooks/types.ts +69 -0
  132. package/src/i18n.ts +212 -0
  133. package/src/observability/correlation.ts +50 -0
  134. package/src/observability/event-bus.ts +86 -0
  135. package/src/observability/event-to-metric.ts +170 -0
  136. package/src/observability/exporters/adapter.ts +27 -0
  137. package/src/observability/exporters/otlp-exporter.ts +356 -0
  138. package/src/observability/exporters/prometheus-exporter.ts +54 -0
  139. package/src/observability/metric-registry.ts +100 -0
  140. package/src/observability/metric-retention.ts +64 -0
  141. package/src/observability/metric-sink.ts +99 -0
  142. package/src/observability/metrics-primitives.ts +219 -0
  143. package/src/plugins/plugin-define.ts +6 -0
  144. package/src/plugins/plugin-registry.ts +32 -0
  145. package/src/plugins/plugins/index.ts +3 -0
  146. package/src/plugins/plugins/nextjs.ts +19 -0
  147. package/src/plugins/plugins/vite.ts +10 -0
  148. package/src/plugins/plugins/vitest.ts +9 -0
  149. package/src/prompt/prompt-runtime.ts +380 -0
  150. package/src/runtime/adaptive-plan.ts +563 -0
  151. package/src/runtime/agent-control.ts +215 -0
  152. package/src/runtime/agent-memory.ts +81 -0
  153. package/src/runtime/agent-observability.ts +122 -0
  154. package/src/runtime/anchor-manager.ts +475 -0
  155. package/src/runtime/async-marker.ts +32 -0
  156. package/src/runtime/async-runner.ts +381 -0
  157. package/src/runtime/attention-events.ts +28 -0
  158. package/src/runtime/auto-summarize.ts +344 -0
  159. package/src/runtime/background-runner.ts +840 -0
  160. package/src/runtime/batch-barrier.ts +147 -0
  161. package/src/runtime/broker-issuer.ts +39 -0
  162. package/src/runtime/cancellation-token.ts +99 -0
  163. package/src/runtime/cancellation.ts +99 -0
  164. package/src/runtime/capability-inventory.ts +137 -0
  165. package/src/runtime/chain-parser.ts +237 -0
  166. package/src/runtime/chain-runner.ts +606 -0
  167. package/src/runtime/checkpoint.ts +291 -0
  168. package/src/runtime/child-pi-constants.ts +42 -0
  169. package/src/runtime/child-pi-kill.ts +180 -0
  170. package/src/runtime/child-pi-pool.ts +68 -0
  171. package/src/runtime/child-pi-spawn.ts +287 -0
  172. package/src/runtime/child-pi-steering.ts +128 -0
  173. package/src/runtime/child-pi-streams.ts +296 -0
  174. package/src/runtime/child-pi-transcript.ts +169 -0
  175. package/src/runtime/child-pi.ts +1105 -0
  176. package/src/runtime/coalesce-tasks.ts +268 -0
  177. package/src/runtime/code-summary.ts +292 -0
  178. package/src/runtime/command-trace.ts +105 -0
  179. package/src/runtime/compact-pipeline.ts +56 -0
  180. package/src/runtime/compact-stages/ansi-strip-stage.ts +25 -0
  181. package/src/runtime/compact-stages/blank-collapse-stage.ts +31 -0
  182. package/src/runtime/compact-stages/deduplicate-stage.ts +34 -0
  183. package/src/runtime/compact-stages/head-snap-stage.ts +57 -0
  184. package/src/runtime/compact-stages/index.ts +23 -0
  185. package/src/runtime/compact-stages/tail-capture-stage.ts +77 -0
  186. package/src/runtime/compact-stages/truncation-stage.ts +74 -0
  187. package/src/runtime/compaction-summary.ts +278 -0
  188. package/src/runtime/completion-guard.ts +207 -0
  189. package/src/runtime/concurrency.ts +58 -0
  190. package/src/runtime/crash-classification.ts +229 -0
  191. package/src/runtime/crash-recovery.ts +594 -0
  192. package/src/runtime/crew-agent-records.ts +595 -0
  193. package/src/runtime/crew-agent-runtime.ts +62 -0
  194. package/src/runtime/crew-broker-child.ts +88 -0
  195. package/src/runtime/crew-broker-client.ts +673 -0
  196. package/src/runtime/crew-broker-tokens.ts +159 -0
  197. package/src/runtime/crew-broker.ts +1304 -0
  198. package/src/runtime/crew-hooks.ts +227 -0
  199. package/src/runtime/cross-extension-rpc.ts +143 -0
  200. package/src/runtime/custom-tools/irc-tool.ts +282 -0
  201. package/src/runtime/custom-tools/submit-result-tool.ts +102 -0
  202. package/src/runtime/deadletter.ts +47 -0
  203. package/src/runtime/delivery-coordinator.ts +211 -0
  204. package/src/runtime/delta-conflict.ts +348 -0
  205. package/src/runtime/deterministic-ast.ts +161 -0
  206. package/src/runtime/diagnostic-export.ts +171 -0
  207. package/src/runtime/direct-run.ts +45 -0
  208. package/src/runtime/dwf-state-store.ts +102 -0
  209. package/src/runtime/dynamic-workflow-context.ts +1013 -0
  210. package/src/runtime/dynamic-workflow-runner.ts +325 -0
  211. package/src/runtime/effectiveness.ts +90 -0
  212. package/src/runtime/errors/crew-errors.ts +162 -0
  213. package/src/runtime/event-stream-bridge.ts +98 -0
  214. package/src/runtime/foreground-control.ts +193 -0
  215. package/src/runtime/foreground-watchdog.ts +132 -0
  216. package/src/runtime/global-worker-cap.ts +96 -0
  217. package/src/runtime/goal-achievement.ts +148 -0
  218. package/src/runtime/goal-evaluator.ts +365 -0
  219. package/src/runtime/goal-loop-runner.ts +825 -0
  220. package/src/runtime/goal-state-store.ts +219 -0
  221. package/src/runtime/green-contract.ts +55 -0
  222. package/src/runtime/group-join.ts +267 -0
  223. package/src/runtime/handoff-manager.ts +598 -0
  224. package/src/runtime/heartbeat-gradient.ts +36 -0
  225. package/src/runtime/heartbeat-watcher.ts +239 -0
  226. package/src/runtime/hidden-handoff.ts +407 -0
  227. package/src/runtime/important-line-classifier.ts +140 -0
  228. package/src/runtime/intercom-bridge.ts +187 -0
  229. package/src/runtime/iteration-hooks.ts +305 -0
  230. package/src/runtime/live-agent-control.ts +136 -0
  231. package/src/runtime/live-agent-manager.ts +704 -0
  232. package/src/runtime/live-control-realtime.ts +56 -0
  233. package/src/runtime/live-extension-bridge.ts +148 -0
  234. package/src/runtime/live-irc.ts +97 -0
  235. package/src/runtime/live-session-health.ts +108 -0
  236. package/src/runtime/live-session-runtime.ts +1146 -0
  237. package/src/runtime/loop-gates.ts +128 -0
  238. package/src/runtime/manifest-cache.ts +375 -0
  239. package/src/runtime/mcp-proxy.ts +105 -0
  240. package/src/runtime/metric-parser.ts +36 -0
  241. package/src/runtime/model-fallback.ts +409 -0
  242. package/src/runtime/model-resolver.ts +126 -0
  243. package/src/runtime/model-scope.ts +158 -0
  244. package/src/runtime/orphan-worker-registry.ts +465 -0
  245. package/src/runtime/output-validator.ts +202 -0
  246. package/src/runtime/overflow-recovery.ts +206 -0
  247. package/src/runtime/parallel-research.ts +68 -0
  248. package/src/runtime/parallel-utils.ts +160 -0
  249. package/src/runtime/parent-guard.ts +134 -0
  250. package/src/runtime/path-overlap.ts +150 -0
  251. package/src/runtime/peer-dep.ts +292 -0
  252. package/src/runtime/per-write-validator.ts +181 -0
  253. package/src/runtime/phase-progress.ts +217 -0
  254. package/src/runtime/phase-tracker.ts +385 -0
  255. package/src/runtime/pi-args.ts +655 -0
  256. package/src/runtime/pi-json-output.ts +170 -0
  257. package/src/runtime/pi-spawn.ts +273 -0
  258. package/src/runtime/pipeline-runner.ts +523 -0
  259. package/src/runtime/plan-templates.ts +201 -0
  260. package/src/runtime/policy-engine.ts +115 -0
  261. package/src/runtime/post-checks.ts +142 -0
  262. package/src/runtime/post-exit-stdio-guard.ts +109 -0
  263. package/src/runtime/process-lifecycle.ts +491 -0
  264. package/src/runtime/process-status.ts +154 -0
  265. package/src/runtime/progress-event-coalescer.ts +44 -0
  266. package/src/runtime/progress-tracker.ts +124 -0
  267. package/src/runtime/prose-compressor.ts +162 -0
  268. package/src/runtime/recovery-recipes.ts +203 -0
  269. package/src/runtime/replace.ts +570 -0
  270. package/src/runtime/resilient-edit.ts +153 -0
  271. package/src/runtime/result-extractor.ts +217 -0
  272. package/src/runtime/retry-executor.ts +109 -0
  273. package/src/runtime/retry-runner.ts +336 -0
  274. package/src/runtime/role-permission.ts +59 -0
  275. package/src/runtime/run-coalesced-task-group.ts +308 -0
  276. package/src/runtime/run-drift.ts +219 -0
  277. package/src/runtime/run-tracker.ts +116 -0
  278. package/src/runtime/run-worker.ts +78 -0
  279. package/src/runtime/runtime-policy.ts +29 -0
  280. package/src/runtime/runtime-resolver.ts +172 -0
  281. package/src/runtime/runtime-warmup.ts +160 -0
  282. package/src/runtime/scheduler.ts +353 -0
  283. package/src/runtime/semaphore.ts +141 -0
  284. package/src/runtime/sensitive-paths.ts +93 -0
  285. package/src/runtime/session-resources.ts +25 -0
  286. package/src/runtime/session-snapshot.ts +59 -0
  287. package/src/runtime/session-usage.ts +79 -0
  288. package/src/runtime/settings-store.ts +155 -0
  289. package/src/runtime/sidechain-output.ts +35 -0
  290. package/src/runtime/single-agent-compose.ts +84 -0
  291. package/src/runtime/skill-effectiveness.ts +524 -0
  292. package/src/runtime/skill-instructions.ts +394 -0
  293. package/src/runtime/stale-reconciler.ts +680 -0
  294. package/src/runtime/stream-preview.ts +184 -0
  295. package/src/runtime/streaming-output.ts +50 -0
  296. package/src/runtime/subagent-manager.ts +561 -0
  297. package/src/runtime/subprocess-tool-registry.ts +70 -0
  298. package/src/runtime/supervisor-contact.ts +64 -0
  299. package/src/runtime/task-display.ts +52 -0
  300. package/src/runtime/task-graph-scheduler.ts +227 -0
  301. package/src/runtime/task-graph.ts +290 -0
  302. package/src/runtime/task-health.ts +83 -0
  303. package/src/runtime/task-id.ts +161 -0
  304. package/src/runtime/task-output-context.ts +602 -0
  305. package/src/runtime/task-packet.ts +268 -0
  306. package/src/runtime/task-quality.ts +199 -0
  307. package/src/runtime/task-runner/capabilities.ts +78 -0
  308. package/src/runtime/task-runner/child-executor.ts +790 -0
  309. package/src/runtime/task-runner/context-retrieval.ts +163 -0
  310. package/src/runtime/task-runner/live-executor.ts +227 -0
  311. package/src/runtime/task-runner/output-splitter.ts +152 -0
  312. package/src/runtime/task-runner/post-execution.ts +480 -0
  313. package/src/runtime/task-runner/pre-execution.ts +365 -0
  314. package/src/runtime/task-runner/progress.ts +157 -0
  315. package/src/runtime/task-runner/prompt-builder.ts +278 -0
  316. package/src/runtime/task-runner/prompt-pipeline.ts +88 -0
  317. package/src/runtime/task-runner/result-utils.ts +16 -0
  318. package/src/runtime/task-runner/retrieval-orchestrator.ts +310 -0
  319. package/src/runtime/task-runner/run-projection.ts +125 -0
  320. package/src/runtime/task-runner/scaffold-executor.ts +25 -0
  321. package/src/runtime/task-runner/state-helpers.ts +176 -0
  322. package/src/runtime/task-runner/tail-read.ts +34 -0
  323. package/src/runtime/task-runner.ts +216 -0
  324. package/src/runtime/team-runner-artifacts.ts +13 -0
  325. package/src/runtime/team-runner.ts +2396 -0
  326. package/src/runtime/tool-output-pruner.ts +333 -0
  327. package/src/runtime/tool-progress.ts +278 -0
  328. package/src/runtime/usage-tracker.ts +73 -0
  329. package/src/runtime/verification-gates.ts +579 -0
  330. package/src/runtime/verification-integrity.ts +108 -0
  331. package/src/runtime/verification-worktree.ts +186 -0
  332. package/src/runtime/worker-heartbeat.ts +25 -0
  333. package/src/runtime/worker-startup.ts +83 -0
  334. package/src/runtime/workflow-state.ts +195 -0
  335. package/src/runtime/workspace-lock.ts +443 -0
  336. package/src/runtime/workspace-tree.ts +312 -0
  337. package/src/runtime/yield-handler.ts +224 -0
  338. package/src/runtime/zombie-scanner.ts +298 -0
  339. package/src/schema/config-schema.ts +327 -0
  340. package/src/schema/team-tool-schema.ts +492 -0
  341. package/src/schema/validation-types.ts +159 -0
  342. package/src/skills/discover-skills.ts +203 -0
  343. package/src/skills/skill-templates.ts +456 -0
  344. package/src/skills/validate.ts +285 -0
  345. package/src/state/active-run-registry.ts +439 -0
  346. package/src/state/artifact-store.ts +176 -0
  347. package/src/state/atomic-write.ts +970 -0
  348. package/src/state/blob-store.ts +308 -0
  349. package/src/state/contracts.ts +160 -0
  350. package/src/state/crew-init.ts +269 -0
  351. package/src/state/decision-ledger.ts +372 -0
  352. package/src/state/event-log-rotation.ts +399 -0
  353. package/src/state/event-log.ts +1465 -0
  354. package/src/state/event-reconstructor.ts +229 -0
  355. package/src/state/gitignore-manager.ts +46 -0
  356. package/src/state/health-store.ts +79 -0
  357. package/src/state/hook-instinct-bridge.ts +94 -0
  358. package/src/state/hook-integrations.ts +51 -0
  359. package/src/state/instinct-store.ts +275 -0
  360. package/src/state/jsonl-writer.ts +107 -0
  361. package/src/state/locks.ts +562 -0
  362. package/src/state/mailbox.ts +916 -0
  363. package/src/state/observation-store.ts +176 -0
  364. package/src/state/run-cache.ts +193 -0
  365. package/src/state/run-graph.ts +183 -0
  366. package/src/state/run-metrics.ts +165 -0
  367. package/src/state/schedule.ts +166 -0
  368. package/src/state/session-state-map.ts +51 -0
  369. package/src/state/state-store.ts +973 -0
  370. package/src/state/task-claims.ts +61 -0
  371. package/src/state/tiered-eval.ts +480 -0
  372. package/src/state/types-eval.ts +58 -0
  373. package/src/state/types.ts +447 -0
  374. package/src/state/usage.ts +138 -0
  375. package/src/state/worker-atomic-writer.ts +198 -0
  376. package/src/subagents/async-entry.ts +1 -0
  377. package/src/subagents/index.ts +3 -0
  378. package/src/subagents/live/control.ts +1 -0
  379. package/src/subagents/live/manager.ts +1 -0
  380. package/src/subagents/live/realtime.ts +1 -0
  381. package/src/subagents/live/session-runtime.ts +1 -0
  382. package/src/subagents/manager.ts +1 -0
  383. package/src/subagents/spawn.ts +1 -0
  384. package/src/teams/discover-teams.ts +187 -0
  385. package/src/teams/team-config.ts +27 -0
  386. package/src/teams/team-serializer.ts +38 -0
  387. package/src/tools/safe-bash-extension.ts +54 -0
  388. package/src/tools/safe-bash.ts +505 -0
  389. package/src/types/diff.d.ts +18 -0
  390. package/src/types/new-api-types.ts +35 -0
  391. package/src/ui/agent-management-overlay.ts +160 -0
  392. package/src/ui/card-colors.ts +139 -0
  393. package/src/ui/crew-footer.ts +102 -0
  394. package/src/ui/crew-select-list.ts +112 -0
  395. package/src/ui/dashboard-panes/agents-pane.ts +164 -0
  396. package/src/ui/dashboard-panes/cancellation-pane.ts +66 -0
  397. package/src/ui/dashboard-panes/capability-pane.ts +77 -0
  398. package/src/ui/dashboard-panes/health-pane.ts +31 -0
  399. package/src/ui/dashboard-panes/mailbox-pane.ts +35 -0
  400. package/src/ui/dashboard-panes/metrics-pane.ts +37 -0
  401. package/src/ui/dashboard-panes/progress-pane.ts +38 -0
  402. package/src/ui/dashboard-panes/transcript-pane.ts +10 -0
  403. package/src/ui/deploy-bundled-themes.ts +71 -0
  404. package/src/ui/dwf-phase-display.ts +151 -0
  405. package/src/ui/dynamic-border.ts +35 -0
  406. package/src/ui/format-helpers.ts +31 -0
  407. package/src/ui/heartbeat-aggregator.ts +74 -0
  408. package/src/ui/key-utils.ts +42 -0
  409. package/src/ui/keybinding-map.ts +248 -0
  410. package/src/ui/layout-primitives.ts +106 -0
  411. package/src/ui/live-conversation-overlay.ts +183 -0
  412. package/src/ui/live-duration.ts +55 -0
  413. package/src/ui/live-run-sidebar.ts +293 -0
  414. package/src/ui/loaders.ts +6 -0
  415. package/src/ui/mascot.ts +449 -0
  416. package/src/ui/overlays/agent-picker-overlay.ts +66 -0
  417. package/src/ui/overlays/confirm-overlay.ts +60 -0
  418. package/src/ui/overlays/help-overlay.ts +177 -0
  419. package/src/ui/overlays/mailbox-compose-overlay.ts +181 -0
  420. package/src/ui/overlays/mailbox-compose-preview.ts +78 -0
  421. package/src/ui/overlays/mailbox-detail-overlay.ts +155 -0
  422. package/src/ui/pi-ui-compat.ts +68 -0
  423. package/src/ui/powerbar-publisher.ts +459 -0
  424. package/src/ui/render-coalescer.ts +101 -0
  425. package/src/ui/render-diff.ts +160 -0
  426. package/src/ui/render-scheduler.ts +278 -0
  427. package/src/ui/run-action-dispatcher.ts +182 -0
  428. package/src/ui/run-dashboard.ts +910 -0
  429. package/src/ui/run-event-bus.ts +381 -0
  430. package/src/ui/run-snapshot-cache.ts +1057 -0
  431. package/src/ui/settings-overlay.ts +1067 -0
  432. package/src/ui/shared-overlay-scheduler.ts +96 -0
  433. package/src/ui/snapshot-types.ts +90 -0
  434. package/src/ui/spinner.ts +17 -0
  435. package/src/ui/status-colors.ts +143 -0
  436. package/src/ui/syntax-highlight.ts +136 -0
  437. package/src/ui/terminal-status.ts +269 -0
  438. package/src/ui/theme-adapter.ts +271 -0
  439. package/src/ui/theme-discovery.ts +199 -0
  440. package/src/ui/tool-progress-formatter.ts +93 -0
  441. package/src/ui/tool-renderers/brief-mode.ts +225 -0
  442. package/src/ui/tool-renderers/index.ts +726 -0
  443. package/src/ui/transcript-cache.ts +128 -0
  444. package/src/ui/transcript-entries.ts +256 -0
  445. package/src/ui/transcript-viewer.ts +424 -0
  446. package/src/ui/widget/index.ts +418 -0
  447. package/src/ui/widget/widget-formatters.ts +182 -0
  448. package/src/ui/widget/widget-model.ts +110 -0
  449. package/src/ui/widget/widget-renderer.ts +182 -0
  450. package/src/ui/widget/widget-types.ts +36 -0
  451. package/src/utils/bm25-search.ts +235 -0
  452. package/src/utils/completion-dedupe.ts +63 -0
  453. package/src/utils/conflict-detect.ts +668 -0
  454. package/src/utils/env-allowlist.ts +30 -0
  455. package/src/utils/env-filter.ts +155 -0
  456. package/src/utils/file-coalescer.ts +98 -0
  457. package/src/utils/fingerprint.ts +180 -0
  458. package/src/utils/frontmatter.ts +70 -0
  459. package/src/utils/fs-watch.ts +37 -0
  460. package/src/utils/gh-protocol.ts +556 -0
  461. package/src/utils/git.ts +260 -0
  462. package/src/utils/guards.ts +107 -0
  463. package/src/utils/ids.ts +24 -0
  464. package/src/utils/incremental-reader.ts +220 -0
  465. package/src/utils/internal-error.ts +10 -0
  466. package/src/utils/names.ts +36 -0
  467. package/src/utils/ndjson.ts +115 -0
  468. package/src/utils/paths.ts +227 -0
  469. package/src/utils/project-detector.ts +160 -0
  470. package/src/utils/redaction.ts +370 -0
  471. package/src/utils/resolve-shell.ts +36 -0
  472. package/src/utils/run-watcher-registry.ts +152 -0
  473. package/src/utils/safe-paths.ts +393 -0
  474. package/src/utils/scan-cache.ts +144 -0
  475. package/src/utils/session-utils.ts +110 -0
  476. package/src/utils/sleep.ts +54 -0
  477. package/src/utils/socket-path.ts +164 -0
  478. package/src/utils/sse-parser.ts +131 -0
  479. package/src/utils/task-name-generator.ts +337 -0
  480. package/src/utils/timings.ts +33 -0
  481. package/src/utils/token-counter.ts +200 -0
  482. package/src/utils/visual.ts +207 -0
  483. package/src/workflows/cost-estimator.ts +34 -0
  484. package/src/workflows/discover-workflows.ts +308 -0
  485. package/src/workflows/intermediate-store.ts +166 -0
  486. package/src/workflows/preflight-validator.ts +168 -0
  487. package/src/workflows/topology-analyzer.ts +203 -0
  488. package/src/workflows/validate-workflow.ts +50 -0
  489. package/src/workflows/workflow-config.ts +75 -0
  490. package/src/workflows/workflow-serializer.ts +32 -0
  491. package/src/worktree/branch-freshness.ts +112 -0
  492. package/src/worktree/cleanup.ts +341 -0
  493. package/src/worktree/worktree-manager.ts +1204 -0
@@ -0,0 +1,96 @@
1
+ import { logInternalError } from "../utils/internal-error.ts";
2
+ import { RenderScheduler } from "./render-scheduler.ts";
3
+ import { runEventBusAsRenderScheduler } from "./run-event-bus.ts";
4
+
5
+ export interface OverlaySchedulerHandle {
6
+ /** Force a debounced re-render fan-out (e.g. theme change, dashboard interaction). */
7
+ schedule(): void;
8
+ /** Unregister this overlay. Disposes the shared scheduler when the last overlay leaves (ref-count). */
9
+ dispose(): void;
10
+ }
11
+
12
+ /**
13
+ * C3 (Option G): the 3 overlays (widget + sidebar + dashboard) each used to
14
+ * instantiate an identical RenderScheduler (same run-event-bus channels,
15
+ * debounce 75ms, fallback 750ms) → 9 subscriptions + 9 live timers + 3×
16
+ * per-event schedule() CPU during active runs. This module owns ONE shared
17
+ * RenderScheduler (module singleton) whose `render` and `onInvalidate`
18
+ * fan out to all registered overlays, with per-callback try/catch isolation
19
+ * + ref-counted disposal (the underlying scheduler is disposed when the last
20
+ * overlay leaves, and a future register recreates it).
21
+ */
22
+
23
+ const CHANNELS = ["run:state", "worker:lifecycle", "ui:invalidate"] as const;
24
+
25
+ interface SharedOverlayState {
26
+ readonly scheduler: RenderScheduler;
27
+ readonly renderers: Set<() => void>;
28
+ readonly invalidators: Set<(payload: unknown) => void>;
29
+ }
30
+
31
+ let shared: SharedOverlayState | undefined;
32
+
33
+ function ensureShared(): SharedOverlayState {
34
+ if (shared) return shared;
35
+ const renderers = new Set<() => void>();
36
+ const invalidators = new Set<(payload: unknown) => void>();
37
+ const scheduler = new RenderScheduler(
38
+ runEventBusAsRenderScheduler([...CHANNELS]),
39
+ () => {
40
+ // Fan-out: each registered overlay's render runs in its own
41
+ // try/catch so one failing component cannot break the others.
42
+ for (const render of renderers) {
43
+ try {
44
+ render();
45
+ } catch (error) {
46
+ logInternalError("shared-overlay-scheduler.render", error);
47
+ }
48
+ }
49
+ },
50
+ {
51
+ debounceMs: 75,
52
+ fallbackMs: 750,
53
+ events: [...CHANNELS],
54
+ onInvalidate: (payload) => {
55
+ for (const invalidate of invalidators) {
56
+ try {
57
+ invalidate(payload);
58
+ } catch (error) {
59
+ logInternalError("shared-overlay-scheduler.invalidate", error);
60
+ }
61
+ }
62
+ },
63
+ },
64
+ );
65
+ shared = { scheduler, renderers, invalidators };
66
+ return shared;
67
+ }
68
+
69
+ /**
70
+ * Register an overlay's render (+ optional onInvalidate) with the shared
71
+ * scheduler. Returns a handle that lets the overlay force a debounced
72
+ * fan-out (schedule) and unregister itself (dispose). The underlying shared
73
+ * scheduler is created lazily on first register and disposed when the last
74
+ * overlay disposes.
75
+ */
76
+ export function registerOverlayScheduler(render: () => void, onInvalidate?: (payload: unknown) => void): OverlaySchedulerHandle {
77
+ const state = ensureShared();
78
+ state.renderers.add(render);
79
+ if (onInvalidate) state.invalidators.add(onInvalidate);
80
+ return {
81
+ schedule: () => {
82
+ state.scheduler.schedule();
83
+ },
84
+ dispose: () => {
85
+ state.renderers.delete(render);
86
+ if (onInvalidate) state.invalidators.delete(onInvalidate);
87
+ // Ref-count: when the last overlay leaves, dispose the underlying
88
+ // scheduler (clears subscriptions + timers) and reset the module
89
+ // variable so a future register recreates a fresh instance.
90
+ if (state.renderers.size === 0) {
91
+ state.scheduler.dispose();
92
+ if (shared === state) shared = undefined;
93
+ }
94
+ },
95
+ };
96
+ }
@@ -0,0 +1,90 @@
1
+ import type { CrewAgentRecord } from "../runtime/crew-agent-runtime.ts";
2
+ import type { TeamEvent } from "../state/event-log.ts";
3
+ import type { TeamRunManifest, TeamTaskState } from "../state/types.ts";
4
+ import type { DwfPhaseState } from "./dwf-phase-display.ts";
5
+
6
+ export interface RunUiProgress {
7
+ total: number;
8
+ completed: number;
9
+ running: number;
10
+ failed: number;
11
+ queued: number;
12
+ waiting?: number;
13
+ cancelled?: number;
14
+ skipped?: number;
15
+ needsAttention?: number;
16
+ }
17
+
18
+ export interface RunUiUsage {
19
+ tokensIn: number;
20
+ tokensOut: number;
21
+ toolUses: number;
22
+ }
23
+
24
+ export interface RunUiMailbox {
25
+ inboxUnread: number;
26
+ outboxPending: number;
27
+ needsAttention: number;
28
+ /** Urgent steering messages count. Default 0. */
29
+ steerUnread?: number;
30
+ /** Follow-up / continuation messages count. Default 0. */
31
+ followUpUnread?: number;
32
+ /** Response / reply messages count. Default 0. */
33
+ responseUnread?: number;
34
+ /** Generic messages count. Default 0. */
35
+ messageUnread?: number;
36
+ /** True when counts come from bounded tail reads and older messages may be omitted. */
37
+ approximate?: boolean;
38
+ }
39
+
40
+ export interface RunUiGroupJoin {
41
+ requestId: string;
42
+ messageId: string;
43
+ partial: boolean;
44
+ ack: "pending" | "acknowledged";
45
+ }
46
+
47
+ export interface RunUiSnapshot {
48
+ runId: string;
49
+ cwd: string;
50
+ fetchedAt: number;
51
+ signature: string;
52
+ /**
53
+ * 1.6 / 1.7 — per-slice signatures so dashboard panes can short-circuit
54
+ * their own render when the slice they care about hasn't changed:
55
+ *
56
+ * if (snapshot.sliceSignatures?.tasks === lastTaskSig) return cached;
57
+ *
58
+ * Optional for backwards-compat; consumers fall back to the full
59
+ * `signature` when the field is missing.
60
+ */
61
+ sliceSignatures?: {
62
+ tasks: string;
63
+ agents: string;
64
+ mailbox: string;
65
+ progress: string;
66
+ events: string;
67
+ };
68
+ manifest: TeamRunManifest;
69
+ tasks: TeamTaskState[];
70
+ agents: CrewAgentRecord[];
71
+ progress: RunUiProgress;
72
+ usage: RunUiUsage;
73
+ mailbox: RunUiMailbox;
74
+ groupJoins?: RunUiGroupJoin[];
75
+ /** Structured cancellation reason from run.cancelled event data, when available. */
76
+ cancellationReason?: string;
77
+ /** DWF phase state derived from `recentEvents`. Null/absent for non-DWF runs. */
78
+ dwfPhaseState?: DwfPhaseState | null;
79
+ recentEvents: TeamEvent[];
80
+ recentOutputLines: string[];
81
+ }
82
+
83
+ export interface RunSnapshotCache {
84
+ get(runId: string): RunUiSnapshot | undefined;
85
+ refresh(runId: string): RunUiSnapshot;
86
+ refreshIfStale(runId: string): RunUiSnapshot;
87
+ invalidate(runId?: string): void;
88
+ snapshotsByKey(): Map<string, RunUiSnapshot>;
89
+ dispose?(): void;
90
+ }
@@ -0,0 +1,17 @@
1
+ export const SUBAGENT_SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"] as const;
2
+ export const SUBAGENT_SPINNER_FRAME_MS = 160;
3
+
4
+ export function spinnerBucket(now = Date.now(), frameMs = SUBAGENT_SPINNER_FRAME_MS): number {
5
+ return Math.floor(now / Math.max(1, frameMs));
6
+ }
7
+
8
+ function hashKey(key: string): number {
9
+ let hash = 0;
10
+ for (let index = 0; index < key.length; index += 1) hash = (hash * 31 + key.charCodeAt(index)) >>> 0;
11
+ return hash;
12
+ }
13
+
14
+ export function spinnerFrame(key = "", now = Date.now()): string {
15
+ const offset = key ? hashKey(key) % SUBAGENT_SPINNER_FRAMES.length : 0;
16
+ return SUBAGENT_SPINNER_FRAMES[(spinnerBucket(now) + offset) % SUBAGENT_SPINNER_FRAMES.length] ?? SUBAGENT_SPINNER_FRAMES[0];
17
+ }
@@ -0,0 +1,143 @@
1
+ import type { CrewTheme, CrewThemeColor } from "./theme-adapter.ts";
2
+
3
+ export type RunStatus =
4
+ | "queued"
5
+ | "running"
6
+ | "waiting"
7
+ | "completed"
8
+ | "failed"
9
+ | "cancelled"
10
+ | "stopped"
11
+ | "blocked"
12
+ | "stale"
13
+ | "needs_attention"
14
+ | (string & {});
15
+
16
+ export function colorForStatus(status: RunStatus): CrewThemeColor {
17
+ switch (status) {
18
+ case "running":
19
+ return "accent";
20
+ case "waiting":
21
+ return "muted";
22
+ case "completed":
23
+ return "success";
24
+ case "failed":
25
+ case "stale":
26
+ return "error";
27
+ case "cancelled":
28
+ case "blocked":
29
+ case "stopped":
30
+ return "warning";
31
+ case "needs_attention":
32
+ return "warning";
33
+ case "queued":
34
+ default:
35
+ return "dim";
36
+ }
37
+ }
38
+
39
+ export function iconForStatus(status: RunStatus, options?: { runningGlyph?: string }): string {
40
+ const glyph = options?.runningGlyph ?? "▶";
41
+ switch (status) {
42
+ case "completed":
43
+ return "✓";
44
+ case "failed":
45
+ case "stale":
46
+ return "✗";
47
+ case "cancelled":
48
+ case "stopped":
49
+ return "■";
50
+ case "running":
51
+ return glyph;
52
+ case "waiting":
53
+ return "⏳";
54
+ case "queued":
55
+ return "◦";
56
+ case "blocked":
57
+ return "⏸";
58
+ case "needs_attention":
59
+ return "⚠";
60
+ default:
61
+ return "·";
62
+ }
63
+ }
64
+
65
+ /** @internal */
66
+ function colorForActivity(activityState: string | undefined): CrewThemeColor {
67
+ if (activityState === "needs_attention") return "warning";
68
+ if (activityState === "stale") return "error";
69
+ return "dim";
70
+ }
71
+
72
+ export function applyStatusColor(theme: CrewTheme, status: RunStatus, text: string): string {
73
+ return theme.fg(colorForStatus(status), text);
74
+ }
75
+
76
+ /**
77
+ * Shared glyph→color map for status glyphs embedded in rendered lines.
78
+ * Consolidates the duplicated `statusGlyphColor` (widget-renderer.ts) and
79
+ * `iconColor` (live-run-sidebar.ts) maps into a single source of truth.
80
+ *
81
+ * Covers ALL status glyphs, including the two previously-missing ones:
82
+ * ⏳ (waiting) → muted, ⚠ (needs_attention) → warning
83
+ * and the braille spinner range U+2800–U+28FF (⠁–⣿) → accent (V-3).
84
+ */
85
+ function glyphColor(glyph: string): CrewThemeColor {
86
+ // Braille Patterns block (U+2800–U+28FF) — running animation frames.
87
+ const code = glyph.codePointAt(0) ?? 0;
88
+ if (code >= 0x2800 && code <= 0x28ff) return "accent";
89
+ switch (glyph) {
90
+ case "✓":
91
+ return "success";
92
+ case "✗":
93
+ return "error";
94
+ case "■":
95
+ case "⏸":
96
+ case "⚠":
97
+ return "warning";
98
+ case "⏳":
99
+ return "muted";
100
+ case "◦":
101
+ case "·":
102
+ return "dim";
103
+ case "▶":
104
+ default:
105
+ return "accent";
106
+ }
107
+ }
108
+
109
+ /**
110
+ * Status glyph characters used in the fast-path check.
111
+ */
112
+ const STATUS_GLYPH_CHARS = "\u2713\u2717\u25a0\u23f8\u25e6\u00b7\u25b6\u23f3\u26a0";
113
+
114
+ /**
115
+ * Colorize status glyphs embedded in a rendered line. Wraps every status glyph
116
+ * (✓ ✗ ■ ⏸ ⏳ ⚠ ◦ · ▶ and braille spinner frames ⠁–⣿) in the appropriate theme
117
+ * color, leaving surrounding text untouched.
118
+ *
119
+ * Replaces the duplicated per-module glyph colorizers in widget-renderer.ts
120
+ * and live-run-sidebar.ts with a single shared helper (F-1, F-2, V-3).
121
+ */
122
+ export function colorizeStatusGlyphs(line: string, theme: CrewTheme): string {
123
+ // Fast path: skip regex if line contains no status glyphs at all.
124
+ let hasGlyph = false;
125
+ for (let i = 0; i < STATUS_GLYPH_CHARS.length; i++) {
126
+ if (line.indexOf(STATUS_GLYPH_CHARS[i]) !== -1) {
127
+ hasGlyph = true;
128
+ break;
129
+ }
130
+ }
131
+ if (!hasGlyph) {
132
+ // Check for braille range (U+2800–U+28FF)
133
+ for (let i = 0; i < line.length; i++) {
134
+ const cp = line.codePointAt(i)!;
135
+ if (cp >= 0x2800 && cp <= 0x28ff) {
136
+ hasGlyph = true;
137
+ break;
138
+ }
139
+ }
140
+ }
141
+ if (!hasGlyph) return line;
142
+ return line.replace(/[✓✗■⏸◦·▶⏳⚠]|[\u2800-\u28FF]/g, (glyph) => theme.fg(glyphColor(glyph), glyph));
143
+ }
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Syntax highlighting for pi-crew UI.
3
+ *
4
+ * Uses cli-highlight (sync) with the active Pi theme's syntax colors.
5
+ * Falls back to plain text (theme.fg on every line) if the language is
6
+ * unsupported or highlighting fails.
7
+ */
8
+ import { highlight, supportsLanguage } from "cli-highlight";
9
+ import type { CrewTheme } from "./theme-adapter.ts";
10
+ import { asCrewTheme } from "./theme-adapter.ts";
11
+
12
+ // ── cli-highlight theme bridge ──────────────────────────────────────────
13
+
14
+ function buildCliTheme(theme: CrewTheme): Record<string, (text: string) => string> {
15
+ return {
16
+ keyword: (text) => theme.fg("syntaxKeyword", text),
17
+ built_in: (text) => theme.fg("syntaxType", text),
18
+ literal: (text) => theme.fg("syntaxNumber", text),
19
+ number: (text) => theme.fg("syntaxNumber", text),
20
+ string: (text) => theme.fg("syntaxString", text),
21
+ comment: (text) => theme.fg("syntaxComment", text),
22
+ function: (text) => theme.fg("syntaxFunction", text),
23
+ title: (text) => theme.fg("syntaxFunction", text),
24
+ class: (text) => theme.fg("syntaxType", text),
25
+ type: (text) => theme.fg("syntaxType", text),
26
+ attr: (text) => theme.fg("syntaxVariable", text),
27
+ variable: (text) => theme.fg("syntaxVariable", text),
28
+ params: (text) => theme.fg("syntaxVariable", text),
29
+ operator: (text) => theme.fg("syntaxOperator", text),
30
+ punctuation: (text) => theme.fg("syntaxPunctuation", text),
31
+ };
32
+ }
33
+
34
+ function hlCliSync(code: string, language: string | undefined, theme: CrewTheme): string {
35
+ if (!language) {
36
+ return code
37
+ .split("\n")
38
+ .map((line) => theme.fg("mdCodeBlock", line))
39
+ .join("\n");
40
+ }
41
+ try {
42
+ return highlight(code, {
43
+ language,
44
+ ignoreIllegals: true,
45
+ theme: buildCliTheme(theme),
46
+ }).trimEnd();
47
+ } catch {
48
+ return code
49
+ .split("\n")
50
+ .map((line) => theme.fg("mdCodeBlock", line))
51
+ .join("\n");
52
+ }
53
+ }
54
+
55
+ // ── Language detection ──────────────────────────────────────────────────
56
+
57
+ export const languageMap: Record<string, string> = {
58
+ ts: "typescript",
59
+ tsx: "typescript",
60
+ js: "javascript",
61
+ jsx: "javascript",
62
+ mjs: "javascript",
63
+ cjs: "javascript",
64
+ py: "python",
65
+ md: "markdown",
66
+ markdown: "markdown",
67
+ json: "json",
68
+ yml: "yaml",
69
+ yaml: "yaml",
70
+ toml: "yaml",
71
+ html: "html",
72
+ htm: "html",
73
+ css: "css",
74
+ scss: "scss",
75
+ sass: "sass",
76
+ bash: "bash",
77
+ sh: "bash",
78
+ zsh: "bash",
79
+ fish: "bash",
80
+ ps1: "powershell",
81
+ sql: "sql",
82
+ rust: "rust",
83
+ rb: "ruby",
84
+ go: "go",
85
+ java: "java",
86
+ kt: "kotlin",
87
+ cpp: "cpp",
88
+ cc: "cpp",
89
+ cxx: "cpp",
90
+ hpp: "cpp",
91
+ c: "c",
92
+ h: "c",
93
+ cs: "csharp",
94
+ php: "php",
95
+ };
96
+
97
+ /** @internal */
98
+ function detectLanguageFromPath(filePath: string): string | undefined {
99
+ const ext = filePath.split(".").pop()?.toLowerCase();
100
+ if (!ext) return undefined;
101
+ return languageMap[ext];
102
+ }
103
+
104
+ // ── Public API ──────────────────────────────────────────────────────────
105
+
106
+ export function highlightCode(code: string, language: string | undefined, themeLike: unknown = undefined): string {
107
+ const theme = asCrewTheme(themeLike);
108
+ const validLanguage = language && supportsLanguage(language) ? language : undefined;
109
+ return hlCliSync(code, validLanguage, theme);
110
+ }
111
+
112
+ export function highlightJson(payload: string, themeLike: unknown = undefined): string {
113
+ const theme = asCrewTheme(themeLike);
114
+ try {
115
+ return highlight(payload, {
116
+ language: "json",
117
+ ignoreIllegals: true,
118
+ theme: buildCliTheme(theme),
119
+ }).trimEnd();
120
+ } catch {
121
+ try {
122
+ const parsed = JSON.parse(payload);
123
+ return JSON.stringify(parsed, null, 2)
124
+ .split("\n")
125
+ .map((line) => theme.fg("mdCodeBlock", line))
126
+ .join("\n");
127
+ } catch {
128
+ return payload
129
+ .split("\n")
130
+ .map((line) => theme.fg("mdCodeBlock", line))
131
+ .join("\n");
132
+ }
133
+ }
134
+ }
135
+
136
+ export { detectLanguageFromPath };