bosun 0.36.0 → 0.36.2

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 (98) hide show
  1. package/.env.example +98 -16
  2. package/README.md +27 -0
  3. package/agent-event-bus.mjs +5 -5
  4. package/agent-pool.mjs +129 -12
  5. package/agent-prompts.mjs +7 -1
  6. package/agent-sdk.mjs +13 -2
  7. package/agent-supervisor.mjs +2 -2
  8. package/agent-work-report.mjs +1 -1
  9. package/anomaly-detector.mjs +6 -6
  10. package/autofix.mjs +15 -15
  11. package/bosun-skills.mjs +4 -4
  12. package/bosun.schema.json +160 -4
  13. package/claude-shell.mjs +11 -11
  14. package/cli.mjs +21 -21
  15. package/codex-config.mjs +19 -19
  16. package/codex-shell.mjs +180 -29
  17. package/config-doctor.mjs +27 -2
  18. package/config.mjs +60 -7
  19. package/copilot-shell.mjs +4 -4
  20. package/error-detector.mjs +1 -1
  21. package/fleet-coordinator.mjs +2 -2
  22. package/gemini-shell.mjs +692 -0
  23. package/github-oauth-portal.mjs +1 -1
  24. package/github-reconciler.mjs +2 -2
  25. package/kanban-adapter.mjs +741 -168
  26. package/merge-strategy.mjs +25 -25
  27. package/monitor.mjs +123 -105
  28. package/opencode-shell.mjs +22 -22
  29. package/package.json +7 -1
  30. package/postinstall.mjs +22 -22
  31. package/pr-cleanup-daemon.mjs +6 -6
  32. package/prepublish-check.mjs +4 -4
  33. package/presence.mjs +2 -2
  34. package/primary-agent.mjs +85 -7
  35. package/publish.mjs +1 -1
  36. package/review-agent.mjs +1 -1
  37. package/session-tracker.mjs +11 -0
  38. package/setup-web-server.mjs +429 -21
  39. package/setup.mjs +367 -12
  40. package/shared-knowledge.mjs +1 -1
  41. package/startup-service.mjs +9 -9
  42. package/stream-resilience.mjs +58 -4
  43. package/sync-engine.mjs +2 -2
  44. package/task-assessment.mjs +9 -9
  45. package/task-cli.mjs +1 -1
  46. package/task-complexity.mjs +71 -2
  47. package/task-context.mjs +1 -2
  48. package/task-executor.mjs +104 -41
  49. package/telegram-bot.mjs +825 -494
  50. package/telegram-sentinel.mjs +28 -28
  51. package/ui/app.js +256 -23
  52. package/ui/app.monolith.js +1 -1
  53. package/ui/components/agent-selector.js +4 -3
  54. package/ui/components/chat-view.js +101 -28
  55. package/ui/components/diff-viewer.js +3 -3
  56. package/ui/components/kanban-board.js +3 -3
  57. package/ui/components/session-list.js +255 -35
  58. package/ui/components/workspace-switcher.js +3 -3
  59. package/ui/demo.html +209 -194
  60. package/ui/index.html +3 -3
  61. package/ui/modules/icon-utils.js +206 -142
  62. package/ui/modules/icons.js +2 -27
  63. package/ui/modules/settings-schema.js +29 -5
  64. package/ui/modules/streaming.js +30 -2
  65. package/ui/modules/vision-stream.js +275 -0
  66. package/ui/modules/voice-client.js +102 -9
  67. package/ui/modules/voice-fallback.js +62 -6
  68. package/ui/modules/voice-overlay.js +594 -59
  69. package/ui/modules/voice.js +31 -38
  70. package/ui/setup.html +284 -34
  71. package/ui/styles/components.css +47 -0
  72. package/ui/styles/sessions.css +75 -0
  73. package/ui/tabs/agents.js +73 -43
  74. package/ui/tabs/chat.js +37 -40
  75. package/ui/tabs/control.js +2 -2
  76. package/ui/tabs/dashboard.js +1 -1
  77. package/ui/tabs/infra.js +10 -10
  78. package/ui/tabs/library.js +8 -8
  79. package/ui/tabs/logs.js +10 -10
  80. package/ui/tabs/settings.js +20 -20
  81. package/ui/tabs/tasks.js +76 -47
  82. package/ui-server.mjs +1761 -124
  83. package/update-check.mjs +13 -13
  84. package/ve-kanban.mjs +1 -1
  85. package/whatsapp-channel.mjs +5 -5
  86. package/workflow-engine.mjs +20 -1
  87. package/workflow-nodes.mjs +904 -4
  88. package/workflow-templates/agents.mjs +321 -7
  89. package/workflow-templates/ci-cd.mjs +6 -6
  90. package/workflow-templates/github.mjs +156 -84
  91. package/workflow-templates/planning.mjs +8 -8
  92. package/workflow-templates/reliability.mjs +8 -8
  93. package/workflow-templates/security.mjs +3 -3
  94. package/workflow-templates.mjs +15 -9
  95. package/workspace-manager.mjs +85 -1
  96. package/workspace-monitor.mjs +2 -2
  97. package/workspace-registry.mjs +2 -2
  98. package/worktree-manager.mjs +1 -1
@@ -191,7 +191,7 @@ Directory: ${ctx.worktreeDir}`);
191
191
  Based on the above context, choose ONE action:
192
192
 
193
193
  1. **merge_after_ci_pass** — Agent completed the task successfully, PR looks good, merge when CI passes.
194
- Use when: Agent reports success (" Task Complete"), changes match the task description, no obvious issues.
194
+ Use when: Agent reports success (":check: Task Complete"), changes match the task description, no obvious issues.
195
195
 
196
196
  2. **prompt** — Agent needs to do more work. Provide a specific message telling the agent what to fix.
197
197
  Use when: Task partially done, lint/test failures mentioned, missing files, incomplete implementation.
@@ -444,7 +444,7 @@ export async function analyzeMergeStrategy(ctx, opts = {}) {
444
444
 
445
445
  if (onTelegram) {
446
446
  onTelegram(
447
- `🔍 Merge strategy analysis started for ${ctx.shortId}` +
447
+ `:search: Merge strategy analysis started for ${ctx.shortId}` +
448
448
  (ctx.taskTitle ? ` — "${ctx.taskTitle}"` : "") +
449
449
  (ctx.prNumber ? ` (PR #${ctx.prNumber})` : ""),
450
450
  );
@@ -539,16 +539,16 @@ export async function analyzeMergeStrategy(ctx, opts = {}) {
539
539
 
540
540
  // ── Notify ─────────────────────────────────────────────────
541
541
  const actionEmoji = {
542
- merge_after_ci_pass: "",
543
- prompt: "💬",
544
- close_pr: "🚫",
545
- re_attempt: "🔄",
546
- manual_review: "👀",
547
- wait: "",
548
- noop: "",
542
+ merge_after_ci_pass: ":check:",
543
+ prompt: ":chat:",
544
+ close_pr: ":ban:",
545
+ re_attempt: ":refresh:",
546
+ manual_review: ":eye:",
547
+ wait: ":clock:",
548
+ noop: ":close:",
549
549
  };
550
550
 
551
- const emoji = actionEmoji[decision.action] || "";
551
+ const emoji = actionEmoji[decision.action] || ":help:";
552
552
  console.log(
553
553
  `[${tag}] decision: ${emoji} ${decision.action}` +
554
554
  (decision.reason ? ` — ${decision.reason.slice(0, 120)}` : "") +
@@ -671,7 +671,7 @@ export async function executeDecision(decision, ctx, opts = {}) {
671
671
  case "manual_review":
672
672
  if (onTelegram) {
673
673
  onTelegram(
674
- `👀 Manual review needed for ${ctx.taskTitle || ctx.shortId}: ${decision.reason || "no reason"}`,
674
+ `:eye: Manual review needed for ${ctx.taskTitle || ctx.shortId}: ${decision.reason || "no reason"}`,
675
675
  );
676
676
  }
677
677
  return { executed: true, action: "manual_review", success: true };
@@ -740,7 +740,7 @@ async function executePromptAction(decision, ctx, execOpts) {
740
740
 
741
741
  if (onTelegram) {
742
742
  onTelegram(
743
- `💬 ${hasLiveThread ? "Resuming" : "Starting"} agent for ${ctx.taskTitle || ctx.shortId}: ${fixMessage.slice(0, 200)}`,
743
+ `:chat: ${hasLiveThread ? "Resuming" : "Starting"} agent for ${ctx.taskTitle || ctx.shortId}: ${fixMessage.slice(0, 200)}`,
744
744
  );
745
745
  }
746
746
 
@@ -762,18 +762,18 @@ async function executePromptAction(decision, ctx, execOpts) {
762
762
 
763
763
  if (result.success) {
764
764
  console.log(
765
- `[${tag}] agent ${result.resumed ? "resumed" : "launched"} successfully for fix`,
765
+ `[${tag}] :check: agent ${result.resumed ? "resumed" : "launched"} successfully for fix`,
766
766
  );
767
767
  if (onTelegram) {
768
768
  onTelegram(
769
- `✅ Agent ${result.resumed ? "resumed" : "completed"} fix for ${ctx.taskTitle || ctx.shortId}`,
769
+ `:check: Agent ${result.resumed ? "resumed" : "completed"} fix for ${ctx.taskTitle || ctx.shortId}`,
770
770
  );
771
771
  }
772
772
  } else {
773
- console.warn(`[${tag}] agent fix failed: ${result.error}`);
773
+ console.warn(`[${tag}] :close: agent fix failed: ${result.error}`);
774
774
  if (onTelegram) {
775
775
  onTelegram(
776
- `❌ Agent fix failed for ${ctx.taskTitle || ctx.shortId}: ${result.error?.slice(0, 200)}`,
776
+ `:close: Agent fix failed for ${ctx.taskTitle || ctx.shortId}: ${result.error?.slice(0, 200)}`,
777
777
  );
778
778
  }
779
779
  }
@@ -890,7 +890,7 @@ async function executeReAttemptAction(decision, ctx, execOpts) {
890
890
 
891
891
  if (onTelegram) {
892
892
  onTelegram(
893
- `🔄 Re-attempting task "${ctx.taskTitle || ctx.shortId}": ${reason.slice(0, 200)}`,
893
+ `:refresh: Re-attempting task "${ctx.taskTitle || ctx.shortId}": ${reason.slice(0, 200)}`,
894
894
  );
895
895
  }
896
896
 
@@ -912,20 +912,20 @@ async function executeReAttemptAction(decision, ctx, execOpts) {
912
912
 
913
913
  if (result.success) {
914
914
  console.log(
915
- `[${tag}] re-attempt succeeded after ${result.attempts} attempt(s)`,
915
+ `[${tag}] :check: re-attempt succeeded after ${result.attempts} attempt(s)`,
916
916
  );
917
917
  if (onTelegram) {
918
918
  onTelegram(
919
- `✅ Re-attempt succeeded for "${ctx.taskTitle || ctx.shortId}" (${result.attempts} attempt(s))`,
919
+ `:check: Re-attempt succeeded for "${ctx.taskTitle || ctx.shortId}" (${result.attempts} attempt(s))`,
920
920
  );
921
921
  }
922
922
  } else {
923
923
  console.warn(
924
- `[${tag}] re-attempt failed after ${result.attempts} attempt(s): ${result.error}`,
924
+ `[${tag}] :close: re-attempt failed after ${result.attempts} attempt(s): ${result.error}`,
925
925
  );
926
926
  if (onTelegram) {
927
927
  onTelegram(
928
- `❌ Re-attempt failed for "${ctx.taskTitle || ctx.shortId}" after ${result.attempts} attempt(s): ${result.error?.slice(0, 200)}`,
928
+ `:close: Re-attempt failed for "${ctx.taskTitle || ctx.shortId}" after ${result.attempts} attempt(s): ${result.error?.slice(0, 200)}`,
929
929
  );
930
930
  }
931
931
  }
@@ -1007,7 +1007,7 @@ async function executeMergeAction(decision, ctx, execOpts) {
1007
1007
  );
1008
1008
  if (onTelegram) {
1009
1009
  onTelegram(
1010
- `⛔ Merge blocked for ${ctx.taskTitle || `PR #${ctx.prNumber || "unknown"}`}: ${reason}`,
1010
+ `:ban: Merge blocked for ${ctx.taskTitle || `PR #${ctx.prNumber || "unknown"}`}: ${reason}`,
1011
1011
  );
1012
1012
  }
1013
1013
  return {
@@ -1050,7 +1050,7 @@ async function executeMergeAction(decision, ctx, execOpts) {
1050
1050
 
1051
1051
  if (onTelegram) {
1052
1052
  onTelegram(
1053
- `✅ Auto-merge enabled for PR #${ctx.prNumber} "${ctx.prTitle || ctx.taskTitle || ""}"`,
1053
+ `:check: Auto-merge enabled for PR #${ctx.prNumber} "${ctx.prTitle || ctx.taskTitle || ""}"`,
1054
1054
  );
1055
1055
  }
1056
1056
 
@@ -1066,7 +1066,7 @@ async function executeMergeAction(decision, ctx, execOpts) {
1066
1066
 
1067
1067
  if (onTelegram) {
1068
1068
  onTelegram(
1069
- `⚠️ Auto-merge failed for PR #${ctx.prNumber}: ${err.message?.slice(0, 200)}. Will retry on next cycle.`,
1069
+ `:alert: Auto-merge failed for PR #${ctx.prNumber}: ${err.message?.slice(0, 200)}. Will retry on next cycle.`,
1070
1070
  );
1071
1071
  }
1072
1072
 
@@ -1116,7 +1116,7 @@ async function executeCloseAction(decision, ctx, execOpts) {
1116
1116
 
1117
1117
  if (onTelegram) {
1118
1118
  onTelegram(
1119
- `🚫 Closed PR #${ctx.prNumber}: ${decision.reason || "strategy decision"}`,
1119
+ `:ban: Closed PR #${ctx.prNumber}: ${decision.reason || "strategy decision"}`,
1120
1120
  );
1121
1121
  }
1122
1122