@virtengine/openfleet 0.25.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 (120) hide show
  1. package/.env.example +914 -0
  2. package/LICENSE +190 -0
  3. package/README.md +500 -0
  4. package/agent-endpoint.mjs +918 -0
  5. package/agent-hook-bridge.mjs +230 -0
  6. package/agent-hooks.mjs +1188 -0
  7. package/agent-pool.mjs +2403 -0
  8. package/agent-prompts.mjs +689 -0
  9. package/agent-sdk.mjs +141 -0
  10. package/anomaly-detector.mjs +1195 -0
  11. package/autofix.mjs +1294 -0
  12. package/claude-shell.mjs +708 -0
  13. package/cli.mjs +906 -0
  14. package/codex-config.mjs +1274 -0
  15. package/codex-model-profiles.mjs +135 -0
  16. package/codex-shell.mjs +762 -0
  17. package/config-doctor.mjs +613 -0
  18. package/config.mjs +1720 -0
  19. package/conflict-resolver.mjs +248 -0
  20. package/container-runner.mjs +450 -0
  21. package/copilot-shell.mjs +827 -0
  22. package/daemon-restart-policy.mjs +56 -0
  23. package/diff-stats.mjs +282 -0
  24. package/error-detector.mjs +829 -0
  25. package/fetch-runtime.mjs +34 -0
  26. package/fleet-coordinator.mjs +838 -0
  27. package/get-telegram-chat-id.mjs +71 -0
  28. package/git-safety.mjs +170 -0
  29. package/github-reconciler.mjs +403 -0
  30. package/hook-profiles.mjs +651 -0
  31. package/kanban-adapter.mjs +4491 -0
  32. package/lib/logger.mjs +645 -0
  33. package/maintenance.mjs +828 -0
  34. package/merge-strategy.mjs +1171 -0
  35. package/monitor.mjs +12207 -0
  36. package/openfleet.config.example.json +115 -0
  37. package/openfleet.schema.json +465 -0
  38. package/package.json +203 -0
  39. package/postinstall.mjs +187 -0
  40. package/pr-cleanup-daemon.mjs +978 -0
  41. package/preflight.mjs +408 -0
  42. package/prepublish-check.mjs +90 -0
  43. package/presence.mjs +328 -0
  44. package/primary-agent.mjs +282 -0
  45. package/publish.mjs +151 -0
  46. package/repo-root.mjs +29 -0
  47. package/restart-controller.mjs +100 -0
  48. package/review-agent.mjs +557 -0
  49. package/rotate-agent-logs.sh +133 -0
  50. package/sdk-conflict-resolver.mjs +973 -0
  51. package/session-tracker.mjs +880 -0
  52. package/setup.mjs +3937 -0
  53. package/shared-knowledge.mjs +410 -0
  54. package/shared-state-manager.mjs +841 -0
  55. package/shared-workspace-cli.mjs +199 -0
  56. package/shared-workspace-registry.mjs +537 -0
  57. package/shared-workspaces.json +18 -0
  58. package/startup-service.mjs +1070 -0
  59. package/sync-engine.mjs +1063 -0
  60. package/task-archiver.mjs +801 -0
  61. package/task-assessment.mjs +550 -0
  62. package/task-claims.mjs +924 -0
  63. package/task-complexity.mjs +581 -0
  64. package/task-executor.mjs +5111 -0
  65. package/task-store.mjs +753 -0
  66. package/telegram-bot.mjs +9281 -0
  67. package/telegram-sentinel.mjs +2010 -0
  68. package/ui/app.js +867 -0
  69. package/ui/app.legacy.js +1464 -0
  70. package/ui/app.monolith.js +2488 -0
  71. package/ui/components/charts.js +226 -0
  72. package/ui/components/chat-view.js +567 -0
  73. package/ui/components/command-palette.js +587 -0
  74. package/ui/components/diff-viewer.js +190 -0
  75. package/ui/components/forms.js +327 -0
  76. package/ui/components/kanban-board.js +451 -0
  77. package/ui/components/session-list.js +305 -0
  78. package/ui/components/shared.js +473 -0
  79. package/ui/index.html +70 -0
  80. package/ui/modules/api.js +297 -0
  81. package/ui/modules/icons.js +461 -0
  82. package/ui/modules/router.js +81 -0
  83. package/ui/modules/settings-schema.js +261 -0
  84. package/ui/modules/state.js +679 -0
  85. package/ui/modules/telegram.js +331 -0
  86. package/ui/modules/utils.js +270 -0
  87. package/ui/styles/animations.css +140 -0
  88. package/ui/styles/base.css +98 -0
  89. package/ui/styles/components.css +1915 -0
  90. package/ui/styles/kanban.css +286 -0
  91. package/ui/styles/layout.css +809 -0
  92. package/ui/styles/sessions.css +827 -0
  93. package/ui/styles/variables.css +188 -0
  94. package/ui/styles.css +141 -0
  95. package/ui/styles.monolith.css +1046 -0
  96. package/ui/tabs/agents.js +1417 -0
  97. package/ui/tabs/chat.js +74 -0
  98. package/ui/tabs/control.js +887 -0
  99. package/ui/tabs/dashboard.js +515 -0
  100. package/ui/tabs/infra.js +537 -0
  101. package/ui/tabs/logs.js +783 -0
  102. package/ui/tabs/settings.js +1487 -0
  103. package/ui/tabs/tasks.js +1385 -0
  104. package/ui-server.mjs +4073 -0
  105. package/update-check.mjs +465 -0
  106. package/utils.mjs +172 -0
  107. package/ve-kanban.mjs +654 -0
  108. package/ve-kanban.ps1 +1365 -0
  109. package/ve-kanban.sh +18 -0
  110. package/ve-orchestrator.mjs +340 -0
  111. package/ve-orchestrator.ps1 +6546 -0
  112. package/ve-orchestrator.sh +18 -0
  113. package/vibe-kanban-wrapper.mjs +41 -0
  114. package/vk-error-resolver.mjs +470 -0
  115. package/vk-log-stream.mjs +914 -0
  116. package/whatsapp-channel.mjs +520 -0
  117. package/workspace-monitor.mjs +581 -0
  118. package/workspace-reaper.mjs +405 -0
  119. package/workspace-registry.mjs +238 -0
  120. package/worktree-manager.mjs +1266 -0
@@ -0,0 +1,188 @@
1
+ /* ─── VirtEngine Control Center — CSS Custom Properties ─── */
2
+ /* Tuned for a CodexMonitor-style desktop + responsive UI */
3
+
4
+ :root {
5
+ /* Typography */
6
+ --font-ui: "Sora", "Space Grotesk", "IBM Plex Sans", "Segoe UI", sans-serif;
7
+ --font-mono: "JetBrains Mono", "IBM Plex Mono", "Fira Code", "SF Mono", monospace;
8
+
9
+ /* Core colors (dark, with Telegram fallbacks) */
10
+ --bg-primary: var(--tg-theme-bg-color, #0b0f14);
11
+ --bg-secondary: var(--tg-theme-secondary-bg-color, #121823);
12
+ --bg-card: var(--tg-theme-section-bg-color, #141c27);
13
+ --bg-surface: #0f141d;
14
+ --bg-input: #0f141d;
15
+ --bg-card-hover: rgba(255, 255, 255, 0.06);
16
+ --bg-elevated: #192232;
17
+
18
+ --text-primary: var(--tg-theme-text-color, #e4e9f0);
19
+ --text-secondary: var(
20
+ --tg-theme-subtitle-text-color,
21
+ var(--tg-theme-hint-color, #9aa3b2)
22
+ );
23
+ --text-hint: var(--tg-theme-hint-color, #7f8898);
24
+ --text-bright: #f5f8fb;
25
+
26
+ --accent: var(--tg-theme-button-color, #4cc9f0);
27
+ --accent-text: var(--tg-theme-button-text-color, #051018);
28
+ --accent-hover: var(--tg-theme-accent-text-color, #7bdff6);
29
+
30
+ --link-color: var(--tg-theme-link-color, #7bdff6);
31
+ --destructive: var(--tg-theme-destructive-text-color, #ff6b6b);
32
+
33
+ --border: var(--tg-theme-section-separator-color, rgba(148, 163, 184, 0.18));
34
+ --border-strong: rgba(148, 163, 184, 0.28);
35
+ --header-text: var(
36
+ --tg-theme-section-header-text-color,
37
+ var(--text-secondary)
38
+ );
39
+
40
+ /* Bottom bar */
41
+ --bottom-bar-bg: var(--tg-theme-bottom-bar-bg-color, var(--bg-secondary));
42
+
43
+ /* Safe areas from Telegram */
44
+ --safe-top: var(--tg-safe-area-inset-top, env(safe-area-inset-top, 0px));
45
+ --safe-bottom: var(
46
+ --tg-safe-area-inset-bottom,
47
+ env(safe-area-inset-bottom, 0px)
48
+ );
49
+ --safe-left: var(--tg-safe-area-inset-left, env(safe-area-inset-left, 0px));
50
+ --safe-right: var(
51
+ --tg-safe-area-inset-right,
52
+ env(safe-area-inset-right, 0px)
53
+ );
54
+ --content-safe-top: var(--tg-content-safe-area-inset-top, 0px);
55
+ --content-safe-bottom: var(--tg-content-safe-area-inset-bottom, 0px);
56
+
57
+ /* Viewport from Telegram */
58
+ --viewport-height: var(--tg-viewport-height, 100vh);
59
+ --viewport-stable-height: var(--tg-viewport-stable-height, 100vh);
60
+
61
+ /* Spacing scale */
62
+ --space-2xs: 2px;
63
+ --space-xs: 4px;
64
+ --space-sm: 8px;
65
+ --space-md: 16px;
66
+ --space-lg: 24px;
67
+ --space-xl: 32px;
68
+ --space-2xl: 48px;
69
+
70
+ /* Semantic accent aliases */
71
+ --accent-primary: var(--accent);
72
+ --accent-success: var(--color-done);
73
+ --accent-warning: var(--color-inreview);
74
+ --accent-error: var(--color-error);
75
+ --accent-danger: var(--color-error);
76
+
77
+ /* Layout */
78
+ --header-height: 60px;
79
+ --nav-height: 66px;
80
+ --sidebar-width: 88px;
81
+ --rail-width: 320px;
82
+ --inspector-width: 320px;
83
+ --content-max: 1200px;
84
+ --shell-gap: 16px;
85
+ --radius-xs: 4px;
86
+ --radius-sm: 8px;
87
+ --radius-md: 14px;
88
+ --radius-lg: 18px;
89
+ --radius-xl: 24px;
90
+ --radius-full: 9999px;
91
+
92
+ /* Shadows */
93
+ --shadow-sm: 0 1px 2px rgba(5, 10, 18, 0.45);
94
+ --shadow-md: 0 8px 20px rgba(5, 10, 18, 0.4);
95
+ --shadow-lg: 0 18px 36px rgba(5, 10, 18, 0.45);
96
+ --shadow-xl: 0 28px 64px rgba(5, 10, 18, 0.55);
97
+ --shadow-inset: inset 0 1px 0 rgba(255, 255, 255, 0.04);
98
+
99
+ /* Glass System */
100
+ --glass-bg: rgba(10, 14, 20, 0.68);
101
+ --glass-border: rgba(148, 163, 184, 0.2);
102
+ --glass-blur: blur(12px);
103
+ --glass-highlight: rgba(255, 255, 255, 0.06);
104
+
105
+ /* Glow System */
106
+ --accent-glow: rgba(76, 201, 240, 0.25);
107
+ --accent-subtle: rgba(76, 201, 240, 0.14);
108
+ --glow-progress: rgba(59, 130, 246, 0.2);
109
+ --glow-success: rgba(34, 197, 94, 0.22);
110
+ --glow-warning: rgba(245, 158, 11, 0.22);
111
+ --glow-error: rgba(248, 113, 113, 0.22);
112
+ --shadow-glow: 0 0 18px var(--accent-glow);
113
+ --shadow-glow-sm: 0 0 8px var(--accent-glow);
114
+ --border-glow: rgba(76, 201, 240, 0.35);
115
+
116
+ /* Status colors */
117
+ --color-todo: #94a3b2;
118
+ --color-inprogress: #4cc9f0;
119
+ --color-inreview: #f59e0b;
120
+ --color-done: #34d399;
121
+ --color-error: #f87171;
122
+ --color-cancelled: #94a3b2;
123
+ --color-critical: #f87171;
124
+ --color-high: #f59e0b;
125
+ --color-medium: #4cc9f0;
126
+ --color-low: #94a3b2;
127
+
128
+ /* Gradients */
129
+ --gradient-accent: linear-gradient(135deg, #4cc9f0 0%, #5eead4 100%);
130
+ --gradient-accent-hover: linear-gradient(135deg, #5eead4 0%, #7bdff6 100%);
131
+ --gradient-progress: linear-gradient(90deg, #4cc9f0 0%, #34d399 100%);
132
+ --gradient-hero: radial-gradient(circle at 20% 0%, rgba(76, 201, 240, 0.22), transparent 55%),
133
+ radial-gradient(circle at 80% 10%, rgba(94, 234, 212, 0.18), transparent 50%),
134
+ radial-gradient(circle at 50% 90%, rgba(59, 130, 246, 0.16), transparent 60%);
135
+ --gradient-surface: linear-gradient(180deg, rgba(15, 20, 30, 0.9) 0%, rgba(12, 16, 24, 0.95) 100%);
136
+ --gradient-radial-glow: radial-gradient(circle at 50% 20%, rgba(76, 201, 240, 0.2), transparent 60%);
137
+ --gradient-mesh: radial-gradient(circle at 10% 20%, rgba(76, 201, 240, 0.18), transparent 55%),
138
+ radial-gradient(circle at 90% 10%, rgba(94, 234, 212, 0.14), transparent 45%),
139
+ radial-gradient(circle at 50% 100%, rgba(59, 130, 246, 0.12), transparent 60%);
140
+
141
+ /* Backdrop */
142
+ --backdrop: rgba(5, 10, 18, 0.7);
143
+ --backdrop-blur: blur(10px);
144
+
145
+ /* Transitions */
146
+ --transition-fast: 0.15s cubic-bezier(0.4, 0, 0.2, 1);
147
+ --transition-normal: 0.25s cubic-bezier(0.4, 0, 0.2, 1);
148
+ --transition-slow: 0.4s cubic-bezier(0.4, 0, 0.2, 1);
149
+ --transition-spring: 0.5s cubic-bezier(0.34, 1.56, 0.64, 1);
150
+ --transition-bounce: 0.6s cubic-bezier(0.68, -0.55, 0.265, 1.55);
151
+ }
152
+
153
+ /* Light theme - Telegram sets --tg-color-scheme */
154
+ @media (prefers-color-scheme: light) {
155
+ :root:not([data-theme="dark"]) {
156
+ --bg-primary: var(--tg-theme-bg-color, #f4f7fb);
157
+ --bg-secondary: var(--tg-theme-secondary-bg-color, #ffffff);
158
+ --bg-card: var(--tg-theme-section-bg-color, #ffffff);
159
+ --bg-surface: #edf2f7;
160
+ --bg-input: #ffffff;
161
+ --bg-card-hover: rgba(15, 23, 42, 0.04);
162
+ --bg-elevated: #ffffff;
163
+
164
+ --text-primary: var(--tg-theme-text-color, #1b2430);
165
+ --text-secondary: var(
166
+ --tg-theme-subtitle-text-color,
167
+ var(--tg-theme-hint-color, #5b6474)
168
+ );
169
+ --text-hint: var(--tg-theme-hint-color, #7b8598);
170
+ --text-bright: #0f172a;
171
+
172
+ --border: var(--tg-theme-section-separator-color, rgba(15, 23, 42, 0.12));
173
+ --border-strong: rgba(15, 23, 42, 0.18);
174
+
175
+ --glass-bg: rgba(255, 255, 255, 0.92);
176
+ --glass-border: rgba(15, 23, 42, 0.12);
177
+ --glass-highlight: rgba(15, 23, 42, 0.04);
178
+
179
+ --accent-glow: rgba(37, 99, 235, 0.18);
180
+ --accent-subtle: rgba(37, 99, 235, 0.12);
181
+ --gradient-hero: radial-gradient(circle at 20% 0%, rgba(37, 99, 235, 0.16), transparent 55%),
182
+ radial-gradient(circle at 80% 5%, rgba(14, 165, 233, 0.12), transparent 50%),
183
+ radial-gradient(circle at 50% 95%, rgba(59, 130, 246, 0.1), transparent 60%);
184
+ --gradient-mesh: radial-gradient(circle at 10% 20%, rgba(14, 165, 233, 0.14), transparent 55%),
185
+ radial-gradient(circle at 90% 10%, rgba(37, 99, 235, 0.1), transparent 45%),
186
+ radial-gradient(circle at 50% 100%, rgba(59, 130, 246, 0.08), transparent 60%);
187
+ }
188
+ }
package/ui/styles.css ADDED
@@ -0,0 +1,141 @@
1
+ @import "./styles/base.css";
2
+ @import "./styles/layout.css";
3
+ @import "./styles/components.css";
4
+ @import "./styles/animations.css";
5
+
6
+ /* ─── Agent Stream Enhancements ─── */
7
+ .stream-toolbar {
8
+ display: flex;
9
+ flex-direction: column;
10
+ gap: 8px;
11
+ margin-bottom: 8px;
12
+ }
13
+
14
+ .stream-actions {
15
+ display: flex;
16
+ flex-wrap: wrap;
17
+ gap: 6px;
18
+ align-items: center;
19
+ justify-content: space-between;
20
+ }
21
+
22
+ .stream-search {
23
+ display: flex;
24
+ align-items: center;
25
+ gap: 6px;
26
+ background: var(--bg-primary);
27
+ border: 1px solid var(--border);
28
+ border-radius: var(--radius-full);
29
+ padding: 4px 10px;
30
+ min-width: 180px;
31
+ flex: 1;
32
+ }
33
+
34
+ .stream-search .input {
35
+ border: none;
36
+ background: transparent;
37
+ padding: 0;
38
+ font-size: 12px;
39
+ }
40
+
41
+ .input-compact {
42
+ height: 28px;
43
+ font-size: 12px;
44
+ }
45
+
46
+ .stream-list {
47
+ display: flex;
48
+ flex-direction: column;
49
+ gap: 8px;
50
+ max-height: 320px;
51
+ overflow-y: auto;
52
+ padding-right: 4px;
53
+ }
54
+
55
+ .stream-item {
56
+ border: 1px solid var(--border);
57
+ border-radius: var(--radius-md);
58
+ padding: 8px 10px;
59
+ background: var(--bg-card);
60
+ }
61
+
62
+ .stream-item-header {
63
+ display: flex;
64
+ align-items: center;
65
+ gap: 8px;
66
+ flex-wrap: wrap;
67
+ font-size: 11px;
68
+ text-transform: uppercase;
69
+ letter-spacing: 0.06em;
70
+ }
71
+
72
+ .stream-item-tool {
73
+ font-size: 12px;
74
+ text-transform: none;
75
+ }
76
+
77
+ .stream-item-time {
78
+ color: var(--text-hint);
79
+ font-size: 11px;
80
+ }
81
+
82
+ .stream-item-body {
83
+ margin-top: 6px;
84
+ font-size: 12px;
85
+ color: var(--text-secondary);
86
+ line-height: 1.5;
87
+ }
88
+
89
+ .stream-tag {
90
+ display: inline-flex;
91
+ align-items: center;
92
+ padding: 2px 8px;
93
+ border-radius: var(--radius-full);
94
+ font-size: 10px;
95
+ font-weight: 700;
96
+ border: 1px solid transparent;
97
+ }
98
+
99
+ .stream-tag-tool_call {
100
+ background: rgba(88, 166, 255, 0.16);
101
+ color: var(--color-inprogress);
102
+ border-color: rgba(88, 166, 255, 0.4);
103
+ }
104
+
105
+ .stream-tag-tool_result {
106
+ background: rgba(46, 160, 67, 0.16);
107
+ color: var(--color-done);
108
+ border-color: rgba(46, 160, 67, 0.35);
109
+ }
110
+
111
+ .stream-tag-error {
112
+ background: rgba(248, 81, 73, 0.16);
113
+ color: var(--color-error);
114
+ border-color: rgba(248, 81, 73, 0.35);
115
+ }
116
+
117
+ .stream-tag-file {
118
+ background: rgba(139, 148, 158, 0.14);
119
+ color: var(--text-secondary);
120
+ border-color: rgba(139, 148, 158, 0.35);
121
+ }
122
+
123
+ .stream-empty {
124
+ display: flex;
125
+ flex-direction: column;
126
+ align-items: center;
127
+ gap: 6px;
128
+ padding: 16px;
129
+ border: 1px dashed var(--border);
130
+ border-radius: var(--radius-md);
131
+ color: var(--text-secondary);
132
+ }
133
+
134
+ .stream-empty-icon {
135
+ font-size: 20px;
136
+ }
137
+
138
+ .stream-empty-text {
139
+ font-size: 12px;
140
+ text-align: center;
141
+ }