jfl 0.1.0 → 0.2.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 (262) hide show
  1. package/README.md +443 -145
  2. package/clawdbot-plugin/clawdbot.plugin.json +20 -0
  3. package/clawdbot-plugin/index.js +555 -0
  4. package/clawdbot-plugin/index.ts +582 -0
  5. package/clawdbot-skill/SKILL.md +33 -336
  6. package/clawdbot-skill/index.ts +491 -321
  7. package/clawdbot-skill/skill.json +4 -13
  8. package/dist/commands/clawdbot.d.ts +11 -0
  9. package/dist/commands/clawdbot.d.ts.map +1 -0
  10. package/dist/commands/clawdbot.js +215 -0
  11. package/dist/commands/clawdbot.js.map +1 -0
  12. package/dist/commands/context-hub.d.ts +5 -0
  13. package/dist/commands/context-hub.d.ts.map +1 -1
  14. package/dist/commands/context-hub.js +394 -28
  15. package/dist/commands/context-hub.js.map +1 -1
  16. package/dist/commands/gtm-process-update.d.ts +10 -0
  17. package/dist/commands/gtm-process-update.d.ts.map +1 -0
  18. package/dist/commands/gtm-process-update.js +101 -0
  19. package/dist/commands/gtm-process-update.js.map +1 -0
  20. package/dist/commands/init.d.ts.map +1 -1
  21. package/dist/commands/init.js +278 -4
  22. package/dist/commands/init.js.map +1 -1
  23. package/dist/commands/login.d.ts.map +1 -1
  24. package/dist/commands/login.js +32 -33
  25. package/dist/commands/login.js.map +1 -1
  26. package/dist/commands/memory.d.ts +38 -0
  27. package/dist/commands/memory.d.ts.map +1 -0
  28. package/dist/commands/memory.js +229 -0
  29. package/dist/commands/memory.js.map +1 -0
  30. package/dist/commands/migrate-services.d.ts +8 -0
  31. package/dist/commands/migrate-services.d.ts.map +1 -0
  32. package/dist/commands/migrate-services.js +182 -0
  33. package/dist/commands/migrate-services.js.map +1 -0
  34. package/dist/commands/onboard.d.ts +24 -0
  35. package/dist/commands/onboard.d.ts.map +1 -0
  36. package/dist/commands/onboard.js +663 -0
  37. package/dist/commands/onboard.js.map +1 -0
  38. package/dist/commands/openclaw.d.ts +56 -0
  39. package/dist/commands/openclaw.d.ts.map +1 -0
  40. package/dist/commands/openclaw.js +700 -0
  41. package/dist/commands/openclaw.js.map +1 -0
  42. package/dist/commands/orchestrate.d.ts +14 -0
  43. package/dist/commands/orchestrate.d.ts.map +1 -0
  44. package/dist/commands/orchestrate.js +270 -0
  45. package/dist/commands/orchestrate.js.map +1 -0
  46. package/dist/commands/profile.d.ts +46 -0
  47. package/dist/commands/profile.d.ts.map +1 -0
  48. package/dist/commands/profile.js +498 -0
  49. package/dist/commands/profile.js.map +1 -0
  50. package/dist/commands/repair.d.ts.map +1 -1
  51. package/dist/commands/repair.js +37 -0
  52. package/dist/commands/repair.js.map +1 -1
  53. package/dist/commands/service-agent.d.ts +16 -0
  54. package/dist/commands/service-agent.d.ts.map +1 -0
  55. package/dist/commands/service-agent.js +375 -0
  56. package/dist/commands/service-agent.js.map +1 -0
  57. package/dist/commands/service-manager.d.ts +12 -0
  58. package/dist/commands/service-manager.d.ts.map +1 -0
  59. package/dist/commands/service-manager.js +967 -0
  60. package/dist/commands/service-manager.js.map +1 -0
  61. package/dist/commands/service-validate.d.ts +12 -0
  62. package/dist/commands/service-validate.d.ts.map +1 -0
  63. package/dist/commands/service-validate.js +611 -0
  64. package/dist/commands/service-validate.js.map +1 -0
  65. package/dist/commands/services-create.d.ts +15 -0
  66. package/dist/commands/services-create.d.ts.map +1 -0
  67. package/dist/commands/services-create.js +1452 -0
  68. package/dist/commands/services-create.js.map +1 -0
  69. package/dist/commands/services-scan.d.ts +13 -0
  70. package/dist/commands/services-scan.d.ts.map +1 -0
  71. package/dist/commands/services-scan.js +251 -0
  72. package/dist/commands/services-scan.js.map +1 -0
  73. package/dist/commands/services-sync-agents.d.ts +23 -0
  74. package/dist/commands/services-sync-agents.d.ts.map +1 -0
  75. package/dist/commands/services-sync-agents.js +207 -0
  76. package/dist/commands/services-sync-agents.js.map +1 -0
  77. package/dist/commands/services.d.ts +19 -0
  78. package/dist/commands/services.d.ts.map +1 -0
  79. package/dist/commands/services.js +742 -0
  80. package/dist/commands/services.js.map +1 -0
  81. package/dist/commands/session.d.ts +5 -1
  82. package/dist/commands/session.d.ts.map +1 -1
  83. package/dist/commands/session.js +68 -586
  84. package/dist/commands/session.js.map +1 -1
  85. package/dist/commands/status.d.ts.map +1 -1
  86. package/dist/commands/status.js +17 -0
  87. package/dist/commands/status.js.map +1 -1
  88. package/dist/commands/update.d.ts.map +1 -1
  89. package/dist/commands/update.js +75 -21
  90. package/dist/commands/update.js.map +1 -1
  91. package/dist/commands/validate-settings.d.ts +37 -0
  92. package/dist/commands/validate-settings.d.ts.map +1 -0
  93. package/dist/commands/validate-settings.js +197 -0
  94. package/dist/commands/validate-settings.js.map +1 -0
  95. package/dist/commands/voice.d.ts +0 -1
  96. package/dist/commands/voice.d.ts.map +1 -1
  97. package/dist/commands/voice.js +16 -15
  98. package/dist/commands/voice.js.map +1 -1
  99. package/dist/index.js +395 -141
  100. package/dist/index.js.map +1 -1
  101. package/dist/lib/agent-generator.d.ts +26 -0
  102. package/dist/lib/agent-generator.d.ts.map +1 -0
  103. package/dist/lib/agent-generator.js +331 -0
  104. package/dist/lib/agent-generator.js.map +1 -0
  105. package/dist/lib/memory-db.d.ts +102 -0
  106. package/dist/lib/memory-db.d.ts.map +1 -0
  107. package/dist/lib/memory-db.js +313 -0
  108. package/dist/lib/memory-db.js.map +1 -0
  109. package/dist/lib/memory-indexer.d.ts +47 -0
  110. package/dist/lib/memory-indexer.d.ts.map +1 -0
  111. package/dist/lib/memory-indexer.js +215 -0
  112. package/dist/lib/memory-indexer.js.map +1 -0
  113. package/dist/lib/memory-search.d.ts +41 -0
  114. package/dist/lib/memory-search.d.ts.map +1 -0
  115. package/dist/lib/memory-search.js +246 -0
  116. package/dist/lib/memory-search.js.map +1 -0
  117. package/dist/lib/openclaw-registry.d.ts +48 -0
  118. package/dist/lib/openclaw-registry.d.ts.map +1 -0
  119. package/dist/lib/openclaw-registry.js +181 -0
  120. package/dist/lib/openclaw-registry.js.map +1 -0
  121. package/dist/lib/openclaw-sdk.d.ts +107 -0
  122. package/dist/lib/openclaw-sdk.d.ts.map +1 -0
  123. package/dist/lib/openclaw-sdk.js +208 -0
  124. package/dist/lib/openclaw-sdk.js.map +1 -0
  125. package/dist/lib/peer-agent-generator.d.ts +44 -0
  126. package/dist/lib/peer-agent-generator.d.ts.map +1 -0
  127. package/dist/lib/peer-agent-generator.js +286 -0
  128. package/dist/lib/peer-agent-generator.js.map +1 -0
  129. package/dist/lib/service-dependencies.d.ts +44 -0
  130. package/dist/lib/service-dependencies.d.ts.map +1 -0
  131. package/dist/lib/service-dependencies.js +314 -0
  132. package/dist/lib/service-dependencies.js.map +1 -0
  133. package/dist/lib/service-detector.d.ts +61 -0
  134. package/dist/lib/service-detector.d.ts.map +1 -0
  135. package/dist/lib/service-detector.js +521 -0
  136. package/dist/lib/service-detector.js.map +1 -0
  137. package/dist/lib/service-gtm.d.ts +157 -0
  138. package/dist/lib/service-gtm.d.ts.map +1 -0
  139. package/dist/lib/service-gtm.js +786 -0
  140. package/dist/lib/service-gtm.js.map +1 -0
  141. package/dist/lib/service-mcp-base.d.ts +103 -0
  142. package/dist/lib/service-mcp-base.d.ts.map +1 -0
  143. package/dist/lib/service-mcp-base.js +263 -0
  144. package/dist/lib/service-mcp-base.js.map +1 -0
  145. package/dist/lib/service-utils.d.ts +103 -0
  146. package/dist/lib/service-utils.d.ts.map +1 -0
  147. package/dist/lib/service-utils.js +368 -0
  148. package/dist/lib/service-utils.js.map +1 -0
  149. package/dist/lib/skill-generator.d.ts +21 -0
  150. package/dist/lib/skill-generator.d.ts.map +1 -0
  151. package/dist/lib/skill-generator.js +253 -0
  152. package/dist/lib/skill-generator.js.map +1 -0
  153. package/dist/lib/stratus-client.d.ts +100 -0
  154. package/dist/lib/stratus-client.d.ts.map +1 -0
  155. package/dist/lib/stratus-client.js +255 -0
  156. package/dist/lib/stratus-client.js.map +1 -0
  157. package/dist/mcp/context-hub-mcp.js +135 -53
  158. package/dist/mcp/context-hub-mcp.js.map +1 -1
  159. package/dist/mcp/service-mcp-server.d.ts +12 -0
  160. package/dist/mcp/service-mcp-server.d.ts.map +1 -0
  161. package/dist/mcp/service-mcp-server.js +434 -0
  162. package/dist/mcp/service-mcp-server.js.map +1 -0
  163. package/dist/mcp/service-peer-mcp.d.ts +36 -0
  164. package/dist/mcp/service-peer-mcp.d.ts.map +1 -0
  165. package/dist/mcp/service-peer-mcp.js +220 -0
  166. package/dist/mcp/service-peer-mcp.js.map +1 -0
  167. package/dist/mcp/service-registry-mcp.d.ts +13 -0
  168. package/dist/mcp/service-registry-mcp.d.ts.map +1 -0
  169. package/dist/mcp/service-registry-mcp.js +330 -0
  170. package/dist/mcp/service-registry-mcp.js.map +1 -0
  171. package/dist/ui/banner.js +1 -1
  172. package/dist/ui/banner.js.map +1 -1
  173. package/dist/ui/context-hub-logs.d.ts +10 -0
  174. package/dist/ui/context-hub-logs.d.ts.map +1 -0
  175. package/dist/ui/context-hub-logs.js +175 -0
  176. package/dist/ui/context-hub-logs.js.map +1 -0
  177. package/dist/ui/service-dashboard.d.ts +11 -0
  178. package/dist/ui/service-dashboard.d.ts.map +1 -0
  179. package/dist/ui/service-dashboard.js +357 -0
  180. package/dist/ui/service-dashboard.js.map +1 -0
  181. package/dist/ui/services-manager.d.ts +11 -0
  182. package/dist/ui/services-manager.d.ts.map +1 -0
  183. package/dist/ui/services-manager.js +507 -0
  184. package/dist/ui/services-manager.js.map +1 -0
  185. package/dist/utils/auth-guard.d.ts.map +1 -1
  186. package/dist/utils/auth-guard.js +8 -9
  187. package/dist/utils/auth-guard.js.map +1 -1
  188. package/dist/utils/claude-md-generator.d.ts +10 -0
  189. package/dist/utils/claude-md-generator.d.ts.map +1 -0
  190. package/dist/utils/claude-md-generator.js +215 -0
  191. package/dist/utils/claude-md-generator.js.map +1 -0
  192. package/dist/utils/ensure-context-hub.d.ts +20 -0
  193. package/dist/utils/ensure-context-hub.d.ts.map +1 -0
  194. package/dist/utils/ensure-context-hub.js +65 -0
  195. package/dist/utils/ensure-context-hub.js.map +1 -0
  196. package/dist/utils/ensure-project.d.ts.map +1 -1
  197. package/dist/utils/ensure-project.js +3 -4
  198. package/dist/utils/ensure-project.js.map +1 -1
  199. package/dist/utils/jfl-config.d.ts +19 -0
  200. package/dist/utils/jfl-config.d.ts.map +1 -0
  201. package/dist/utils/jfl-config.js +112 -0
  202. package/dist/utils/jfl-config.js.map +1 -0
  203. package/dist/utils/jfl-migration.d.ts +29 -0
  204. package/dist/utils/jfl-migration.d.ts.map +1 -0
  205. package/dist/utils/jfl-migration.js +142 -0
  206. package/dist/utils/jfl-migration.js.map +1 -0
  207. package/dist/utils/jfl-paths.d.ts +55 -0
  208. package/dist/utils/jfl-paths.d.ts.map +1 -0
  209. package/dist/utils/jfl-paths.js +120 -0
  210. package/dist/utils/jfl-paths.js.map +1 -0
  211. package/dist/utils/settings-validator.d.ts +73 -0
  212. package/dist/utils/settings-validator.d.ts.map +1 -0
  213. package/dist/utils/settings-validator.js +222 -0
  214. package/dist/utils/settings-validator.js.map +1 -0
  215. package/package.json +19 -3
  216. package/scripts/commit-gtm.sh +56 -0
  217. package/scripts/commit-product.sh +68 -0
  218. package/scripts/context-query.sh +45 -0
  219. package/scripts/session/auto-commit.sh +297 -0
  220. package/scripts/session/jfl-doctor.sh +707 -0
  221. package/scripts/session/session-cleanup.sh +268 -0
  222. package/scripts/session/session-end.sh +198 -0
  223. package/scripts/session/session-init.sh +350 -0
  224. package/scripts/session/session-init.sh.backup +292 -0
  225. package/scripts/session/session-sync.sh +167 -0
  226. package/scripts/session/test-context-preservation.sh +160 -0
  227. package/scripts/session/test-critical-infrastructure.sh +293 -0
  228. package/scripts/session/test-experience-level.sh +336 -0
  229. package/scripts/session/test-session-cleanup.sh +268 -0
  230. package/scripts/session/test-session-sync.sh +320 -0
  231. package/scripts/voice-start.sh +36 -8
  232. package/scripts/where-am-i.sh +78 -0
  233. package/template/.claude/service-settings.json +32 -0
  234. package/template/.claude/settings.json +14 -1
  235. package/template/.claude/skills/end/SKILL.md +1780 -0
  236. package/template/.jfl/config.json +2 -1
  237. package/template/CLAUDE.md +1039 -134
  238. package/template/CLAUDE.md.bak +1187 -0
  239. package/template/scripts/commit-gtm.sh +56 -0
  240. package/template/scripts/commit-product.sh +68 -0
  241. package/template/scripts/migrate-to-branch-sessions.sh +201 -0
  242. package/template/scripts/session/auto-commit.sh +58 -6
  243. package/template/scripts/session/jfl-doctor.sh +137 -17
  244. package/template/scripts/session/session-cleanup.sh +268 -0
  245. package/template/scripts/session/session-end.sh +4 -0
  246. package/template/scripts/session/session-init.sh +253 -66
  247. package/template/scripts/session/test-critical-infrastructure.sh +293 -0
  248. package/template/scripts/session/test-experience-level.sh +336 -0
  249. package/template/scripts/session/test-session-cleanup.sh +268 -0
  250. package/template/scripts/session/test-session-sync.sh +320 -0
  251. package/template/scripts/where-am-i.sh +78 -0
  252. package/template/templates/service-agent/.claude/settings.json +32 -0
  253. package/template/templates/service-agent/CLAUDE.md +334 -0
  254. package/template/templates/service-agent/knowledge/ARCHITECTURE.md +115 -0
  255. package/template/templates/service-agent/knowledge/DEPLOYMENT.md +199 -0
  256. package/template/templates/service-agent/knowledge/RUNBOOK.md +412 -0
  257. package/template/templates/service-agent/knowledge/SERVICE_SPEC.md +77 -0
  258. package/dist/commands/session-mgmt.d.ts +0 -33
  259. package/dist/commands/session-mgmt.d.ts.map +0 -1
  260. package/dist/commands/session-mgmt.js +0 -404
  261. package/dist/commands/session-mgmt.js.map +0 -1
  262. package/template/scripts/session/auto-merge.sh +0 -325
@@ -0,0 +1,507 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * JFL Services Manager TUI
4
+ *
5
+ * Interactive service management dashboard with live updates,
6
+ * logs, chat, and service controls
7
+ *
8
+ * @purpose Full-featured TUI for managing JFL services with real-time updates
9
+ */
10
+ import React, { useState, useEffect } from 'react';
11
+ import { render, Box, Text, useInput, useApp, useStdout } from 'ink';
12
+ import * as fs from 'fs';
13
+ import * as path from 'path';
14
+ import { JFL_PATHS } from '../utils/jfl-paths.js';
15
+ const DEFAULT_PORT = 3402;
16
+ const CONFIG_FILE = path.join(JFL_PATHS.config, 'service-manager.json');
17
+ function getServiceManagerPort() {
18
+ if (process.env.JFL_SERVICE_MANAGER_PORT) {
19
+ return parseInt(process.env.JFL_SERVICE_MANAGER_PORT, 10);
20
+ }
21
+ try {
22
+ if (fs.existsSync(CONFIG_FILE)) {
23
+ const content = fs.readFileSync(CONFIG_FILE, 'utf-8');
24
+ const config = JSON.parse(content);
25
+ return config.port;
26
+ }
27
+ }
28
+ catch {
29
+ // Fallback to default
30
+ }
31
+ return DEFAULT_PORT;
32
+ }
33
+ const ServicesManager = () => {
34
+ const [services, setServices] = useState([]);
35
+ const [selectedIndex, setSelectedIndex] = useState(0);
36
+ const [view, setView] = useState('dashboard');
37
+ const [logLines, setLogLines] = useState([]);
38
+ const [logScrollOffset, setLogScrollOffset] = useState(0);
39
+ const [autoScrollLogs, setAutoScrollLogs] = useState(true);
40
+ const [chatMessages, setChatMessages] = useState([]);
41
+ const [input, setInput] = useState('');
42
+ const { exit } = useApp();
43
+ const { stdout } = useStdout();
44
+ const terminalHeight = (stdout?.rows || 24) - 2; // Leave 2 lines of breathing room
45
+ // Load services from Service Manager API
46
+ useEffect(() => {
47
+ const loadServices = async () => {
48
+ try {
49
+ const SERVICE_MANAGER_PORT = getServiceManagerPort();
50
+ // Check if Service Manager is running
51
+ const healthResponse = await fetch(`http://localhost:${SERVICE_MANAGER_PORT}/health`);
52
+ if (!healthResponse.ok) {
53
+ console.error('Service Manager not responding. Start it with:');
54
+ console.error(` jfl service-manager start --port ${SERVICE_MANAGER_PORT}`);
55
+ setServices([]);
56
+ return;
57
+ }
58
+ // Fetch services from API
59
+ const response = await fetch(`http://localhost:${SERVICE_MANAGER_PORT}/services`);
60
+ const data = await response.json();
61
+ // Map API response to TUI format
62
+ const mapped = data.services.map((svc) => {
63
+ // Calculate uptime if service is running
64
+ let uptime;
65
+ if (svc.started_at && svc.status === 'running') {
66
+ const startTime = new Date(svc.started_at);
67
+ const now = new Date();
68
+ const diffMs = now.getTime() - startTime.getTime();
69
+ const hours = Math.floor(diffMs / (1000 * 60 * 60));
70
+ const minutes = Math.floor((diffMs % (1000 * 60 * 60)) / (1000 * 60));
71
+ uptime = hours > 0 ? `${hours}h${minutes}m` : `${minutes}m`;
72
+ }
73
+ return {
74
+ name: svc.name,
75
+ status: svc.status === 'running' ? 'running' :
76
+ svc.status === 'stopped' ? 'stopped' : 'error',
77
+ health: 'unknown', // Will be updated by health check
78
+ pid: svc.pid,
79
+ port: svc.port,
80
+ uptime,
81
+ // Memory and CPU stats not available yet from Service Manager
82
+ // Could be added later via process stats
83
+ memory: undefined,
84
+ cpu: undefined,
85
+ description: svc.description,
86
+ log_path: svc.log_path,
87
+ health_url: svc.health_url
88
+ };
89
+ });
90
+ setServices(mapped);
91
+ }
92
+ catch (error) {
93
+ console.error('Failed to fetch services:', error);
94
+ console.error('Make sure Service Manager is running:');
95
+ console.error(' jfl service-manager start');
96
+ setServices([]);
97
+ }
98
+ };
99
+ loadServices();
100
+ const interval = setInterval(loadServices, 2000); // Refresh every 2s
101
+ return () => clearInterval(interval);
102
+ }, []);
103
+ // Periodic health checks
104
+ useEffect(() => {
105
+ const runHealthChecks = async () => {
106
+ if (services.length === 0)
107
+ return;
108
+ const healthPromises = services.map(async (service) => {
109
+ // Only check running services with explicit health_url
110
+ if (service.status !== 'running' || !service.health_url) {
111
+ return { name: service.name, health: 'unknown' };
112
+ }
113
+ try {
114
+ const controller = new AbortController();
115
+ const timeoutId = setTimeout(() => controller.abort(), 2000);
116
+ const response = await fetch(service.health_url, {
117
+ signal: controller.signal
118
+ });
119
+ clearTimeout(timeoutId);
120
+ return {
121
+ name: service.name,
122
+ health: response.ok ? 'healthy' : 'unhealthy'
123
+ };
124
+ }
125
+ catch (error) {
126
+ return { name: service.name, health: 'unhealthy' };
127
+ }
128
+ });
129
+ const healthResults = await Promise.all(healthPromises);
130
+ // Update services with health status
131
+ setServices(prevServices => prevServices.map(service => {
132
+ const healthResult = healthResults.find(r => r.name === service.name);
133
+ return healthResult ? { ...service, health: healthResult.health } : service;
134
+ }));
135
+ };
136
+ // Run initial health check after a short delay
137
+ const initialTimeout = setTimeout(runHealthChecks, 1000);
138
+ // Run health checks every 8 seconds
139
+ const interval = setInterval(runHealthChecks, 8000);
140
+ return () => {
141
+ clearTimeout(initialTimeout);
142
+ clearInterval(interval);
143
+ };
144
+ }, [services.length]);
145
+ // Keyboard controls
146
+ useInput((input, key) => {
147
+ // If not in dashboard, ESC goes back to dashboard
148
+ if (view !== 'dashboard' && key.escape) {
149
+ setView('dashboard');
150
+ setLogLines([]);
151
+ setLogScrollOffset(0);
152
+ setAutoScrollLogs(true);
153
+ setChatMessages([]);
154
+ return;
155
+ }
156
+ // If in dashboard, ESC or q exits the app
157
+ if (view === 'dashboard' && (key.escape || input === 'q')) {
158
+ exit();
159
+ return;
160
+ }
161
+ if (view === 'dashboard') {
162
+ if (key.upArrow) {
163
+ setSelectedIndex(Math.max(0, selectedIndex - 1));
164
+ }
165
+ else if (key.downArrow) {
166
+ setSelectedIndex(Math.min(services.length - 1, selectedIndex + 1));
167
+ }
168
+ else if (input === 'l') {
169
+ setView('logs');
170
+ setLogScrollOffset(0);
171
+ setAutoScrollLogs(true);
172
+ loadLogs();
173
+ }
174
+ else if (input === 'c') {
175
+ setView('chat');
176
+ }
177
+ else if (input === 'a') {
178
+ setView('add');
179
+ }
180
+ else if (input === 's') {
181
+ startService();
182
+ }
183
+ else if (input === 'x') {
184
+ stopService();
185
+ }
186
+ else if (input === 'r') {
187
+ restartService();
188
+ }
189
+ else if (input === 'd') {
190
+ removeService();
191
+ }
192
+ }
193
+ else if (view === 'logs') {
194
+ // Scroll controls for logs view
195
+ const visibleHeight = terminalHeight - 6; // Account for header/footer
196
+ const maxScroll = Math.max(0, logLines.length - visibleHeight);
197
+ if (key.upArrow) {
198
+ setLogScrollOffset(Math.max(0, logScrollOffset - 1));
199
+ setAutoScrollLogs(false); // Disable auto-scroll when manually scrolling
200
+ }
201
+ else if (key.downArrow) {
202
+ const newOffset = Math.min(maxScroll, logScrollOffset + 1);
203
+ setLogScrollOffset(newOffset);
204
+ // Re-enable auto-scroll if we've scrolled to the bottom
205
+ if (newOffset === maxScroll) {
206
+ setAutoScrollLogs(true);
207
+ }
208
+ }
209
+ else if (key.pageUp) {
210
+ setLogScrollOffset(Math.max(0, logScrollOffset - visibleHeight));
211
+ setAutoScrollLogs(false);
212
+ }
213
+ else if (key.pageDown) {
214
+ const newOffset = Math.min(maxScroll, logScrollOffset + visibleHeight);
215
+ setLogScrollOffset(newOffset);
216
+ if (newOffset === maxScroll) {
217
+ setAutoScrollLogs(true);
218
+ }
219
+ }
220
+ else if (input === 'g') {
221
+ // Go to top
222
+ setLogScrollOffset(0);
223
+ setAutoScrollLogs(false);
224
+ }
225
+ else if (input === 'G') {
226
+ // Go to bottom (and re-enable auto-scroll)
227
+ setLogScrollOffset(maxScroll);
228
+ setAutoScrollLogs(true);
229
+ }
230
+ }
231
+ });
232
+ const loadLogs = () => {
233
+ const service = services[selectedIndex];
234
+ if (!service || !service.log_path)
235
+ return;
236
+ const logFile = service.log_path;
237
+ if (fs.existsSync(logFile)) {
238
+ const content = fs.readFileSync(logFile, 'utf-8');
239
+ const lines = content.split('\n').filter(line => line.trim().length > 0);
240
+ setLogLines(lines);
241
+ // Auto-scroll to bottom if enabled
242
+ if (autoScrollLogs) {
243
+ const visibleHeight = terminalHeight - 6;
244
+ setLogScrollOffset(Math.max(0, lines.length - visibleHeight));
245
+ }
246
+ // Watch for updates and tail the log
247
+ const watcher = fs.watch(logFile, () => {
248
+ try {
249
+ const newContent = fs.readFileSync(logFile, 'utf-8');
250
+ const newLines = newContent.split('\n').filter(line => line.trim().length > 0);
251
+ setLogLines(newLines);
252
+ // Auto-scroll to bottom if enabled
253
+ if (autoScrollLogs) {
254
+ const visibleHeight = terminalHeight - 6;
255
+ setLogScrollOffset(Math.max(0, newLines.length - visibleHeight));
256
+ }
257
+ }
258
+ catch (err) {
259
+ // File might have been rotated or deleted
260
+ }
261
+ });
262
+ // Keep watcher active while in logs view
263
+ return () => watcher.close();
264
+ }
265
+ };
266
+ const startService = async () => {
267
+ const service = services[selectedIndex];
268
+ if (service) {
269
+ try {
270
+ const SERVICE_MANAGER_PORT = getServiceManagerPort();
271
+ await fetch(`http://localhost:${SERVICE_MANAGER_PORT}/services/${service.name}/start`, {
272
+ method: 'POST'
273
+ });
274
+ }
275
+ catch (error) {
276
+ console.error('Failed to start service:', error);
277
+ }
278
+ }
279
+ };
280
+ const stopService = async () => {
281
+ const service = services[selectedIndex];
282
+ if (service) {
283
+ try {
284
+ const SERVICE_MANAGER_PORT = getServiceManagerPort();
285
+ await fetch(`http://localhost:${SERVICE_MANAGER_PORT}/services/${service.name}/stop`, {
286
+ method: 'POST'
287
+ });
288
+ }
289
+ catch (error) {
290
+ console.error('Failed to stop service:', error);
291
+ }
292
+ }
293
+ };
294
+ const restartService = async () => {
295
+ const service = services[selectedIndex];
296
+ if (service) {
297
+ try {
298
+ const SERVICE_MANAGER_PORT = getServiceManagerPort();
299
+ await fetch(`http://localhost:${SERVICE_MANAGER_PORT}/services/${service.name}/restart`, {
300
+ method: 'POST'
301
+ });
302
+ }
303
+ catch (error) {
304
+ console.error('Failed to restart service:', error);
305
+ }
306
+ }
307
+ };
308
+ const removeService = async () => {
309
+ const service = services[selectedIndex];
310
+ if (service) {
311
+ try {
312
+ const SERVICE_MANAGER_PORT = getServiceManagerPort();
313
+ await fetch(`http://localhost:${SERVICE_MANAGER_PORT}/services/${service.name}`, {
314
+ method: 'DELETE'
315
+ });
316
+ }
317
+ catch (error) {
318
+ console.error('Failed to remove service:', error);
319
+ }
320
+ }
321
+ };
322
+ return (React.createElement(Box, { flexDirection: "column", height: terminalHeight },
323
+ React.createElement(Box, { borderStyle: "double", borderColor: "cyan", paddingX: 2 },
324
+ React.createElement(Text, { bold: true, color: "cyan" }, "\u26A1 JFL Services Manager"),
325
+ React.createElement(Text, { dimColor: true }, " | "),
326
+ React.createElement(Text, { color: "magenta" },
327
+ services.length,
328
+ " services"),
329
+ React.createElement(Text, { dimColor: true }, " | "),
330
+ React.createElement(Text, { dimColor: true }, view.toUpperCase())),
331
+ React.createElement(Box, { flexDirection: "column", flexGrow: 1 },
332
+ view === 'dashboard' && React.createElement(DashboardView, { services: services, selectedIndex: selectedIndex }),
333
+ view === 'logs' && (React.createElement(LogsView, { service: services[selectedIndex], lines: logLines, scrollOffset: logScrollOffset, autoScroll: autoScrollLogs, visibleHeight: terminalHeight - 6 })),
334
+ view === 'chat' && React.createElement(ChatView, { service: services[selectedIndex], messages: chatMessages }),
335
+ view === 'add' && React.createElement(AddServiceView, null)),
336
+ React.createElement(Box, { borderStyle: "single", borderColor: "gray", paddingX: 1 },
337
+ view === 'dashboard' && (React.createElement(Text, { dimColor: true },
338
+ "\u2191\u2193: Select | ",
339
+ React.createElement(Text, { color: "green" }, "s"),
340
+ ": Start | ",
341
+ React.createElement(Text, { color: "red" }, "x"),
342
+ ": Stop |",
343
+ React.createElement(Text, { color: "yellow" }, "r"),
344
+ ": Restart | ",
345
+ React.createElement(Text, { color: "blue" }, "l"),
346
+ ": Logs |",
347
+ React.createElement(Text, { color: "magenta" }, "c"),
348
+ ": Chat | ",
349
+ React.createElement(Text, { color: "cyan" }, "a"),
350
+ ": Add |",
351
+ React.createElement(Text, { color: "red" }, "d"),
352
+ ": Remove | ",
353
+ React.createElement(Text, { bold: true }, "q"),
354
+ ": Quit")),
355
+ view === 'logs' && (React.createElement(Text, { dimColor: true },
356
+ "\u2191\u2193: Scroll | ",
357
+ React.createElement(Text, { color: "cyan" }, "PgUp/PgDn"),
358
+ ": Page |",
359
+ React.createElement(Text, { color: "green" }, "g"),
360
+ ": Top | ",
361
+ React.createElement(Text, { color: "green" }, "G"),
362
+ ": Bottom (tail) |",
363
+ React.createElement(Text, { bold: true }, "ESC"),
364
+ ": Back")),
365
+ view !== 'dashboard' && view !== 'logs' && (React.createElement(Text, { dimColor: true },
366
+ React.createElement(Text, { bold: true }, "ESC"),
367
+ ": Back to dashboard")))));
368
+ };
369
+ // Dashboard View
370
+ const DashboardView = ({ services, selectedIndex }) => {
371
+ return (React.createElement(Box, { flexDirection: "column" },
372
+ React.createElement(Box, { borderStyle: "round", borderColor: "gray", paddingX: 1, marginBottom: 1 },
373
+ React.createElement(Text, { bold: true, dimColor: true }, "NAME"),
374
+ React.createElement(Text, { dimColor: true }, " "),
375
+ React.createElement(Text, { bold: true, dimColor: true }, "STATUS"),
376
+ React.createElement(Text, { dimColor: true }, " "),
377
+ React.createElement(Text, { bold: true, dimColor: true }, "HEALTH"),
378
+ React.createElement(Text, { dimColor: true }, " "),
379
+ React.createElement(Text, { bold: true, dimColor: true }, "PID"),
380
+ React.createElement(Text, { dimColor: true }, " "),
381
+ React.createElement(Text, { bold: true, dimColor: true }, "PORT"),
382
+ React.createElement(Text, { dimColor: true }, " "),
383
+ React.createElement(Text, { bold: true, dimColor: true }, "UPTIME")),
384
+ services.length === 0 ? (React.createElement(Box, { paddingX: 2 },
385
+ React.createElement(Text, { dimColor: true }, "No services found. Press "),
386
+ React.createElement(Text, { color: "cyan", bold: true }, "a"),
387
+ React.createElement(Text, { dimColor: true }, " to add one."))) : (services.map((service, i) => (React.createElement(ServiceRow, { key: service.name, service: service, selected: i === selectedIndex }))))));
388
+ };
389
+ // Service Row
390
+ const ServiceRow = ({ service, selected }) => {
391
+ const statusColor = service.status === 'running' ? 'green' :
392
+ service.status === 'stopped' ? 'yellow' : 'red';
393
+ const statusIcon = service.status === 'running' ? '●' :
394
+ service.status === 'stopped' ? '○' : '✗';
395
+ const healthColor = service.health === 'healthy' ? 'green' :
396
+ service.health === 'unhealthy' ? 'red' : 'gray';
397
+ const healthIcon = service.health === 'healthy' ? '✓' :
398
+ service.health === 'unhealthy' ? '✗' : '?';
399
+ return (React.createElement(Box, null,
400
+ React.createElement(Text, { color: selected ? 'cyan' : undefined, bold: selected },
401
+ selected ? '▶ ' : ' ',
402
+ service.name.padEnd(15)),
403
+ React.createElement(Text, { color: statusColor },
404
+ statusIcon,
405
+ " ",
406
+ service.status.padEnd(10)),
407
+ React.createElement(Text, { color: healthColor },
408
+ healthIcon,
409
+ " ",
410
+ (service.health || 'unknown').padEnd(10)),
411
+ React.createElement(Text, { dimColor: true },
412
+ (service.pid?.toString() || 'N/A').padEnd(8),
413
+ (service.port?.toString() || 'N/A').padEnd(8),
414
+ (service.uptime || 'N/A').padEnd(10))));
415
+ };
416
+ // Logs View
417
+ const LogsView = ({ service, lines, scrollOffset, autoScroll, visibleHeight }) => {
418
+ if (!service) {
419
+ return React.createElement(Text, { dimColor: true }, "No service selected");
420
+ }
421
+ const statusColor = service.status === 'running' ? 'green' :
422
+ service.status === 'stopped' ? 'yellow' : 'red';
423
+ const statusIcon = service.status === 'running' ? '●' :
424
+ service.status === 'stopped' ? '○' : '✗';
425
+ // Calculate visible portion of logs
426
+ const visibleLines = lines.slice(scrollOffset, scrollOffset + visibleHeight);
427
+ const totalLines = lines.length;
428
+ const canScrollUp = scrollOffset > 0;
429
+ const canScrollDown = scrollOffset + visibleHeight < totalLines;
430
+ return (React.createElement(Box, { flexDirection: "column", height: "100%" },
431
+ React.createElement(Box, { borderStyle: "round", borderColor: "yellow", paddingX: 1, marginBottom: 1 },
432
+ React.createElement(Text, { bold: true, color: "yellow" },
433
+ "\uD83D\uDCCB Logs: ",
434
+ service.name),
435
+ React.createElement(Text, { dimColor: true }, " | "),
436
+ React.createElement(Text, { color: statusColor },
437
+ statusIcon,
438
+ " ",
439
+ service.status),
440
+ service.pid && (React.createElement(React.Fragment, null,
441
+ React.createElement(Text, { dimColor: true }, " | PID: "),
442
+ React.createElement(Text, null, service.pid))),
443
+ service.port && (React.createElement(React.Fragment, null,
444
+ React.createElement(Text, { dimColor: true }, " | Port: "),
445
+ React.createElement(Text, null, service.port))),
446
+ React.createElement(Text, { dimColor: true }, " | "),
447
+ React.createElement(Text, { dimColor: true },
448
+ "Lines: ",
449
+ scrollOffset + 1,
450
+ "-",
451
+ Math.min(scrollOffset + visibleHeight, totalLines),
452
+ "/",
453
+ totalLines),
454
+ autoScroll && React.createElement(Text, { color: "green" }, " [TAILING]")),
455
+ React.createElement(Box, { flexDirection: "column", flexGrow: 1, overflow: "hidden" },
456
+ canScrollUp && (React.createElement(Text, { dimColor: true, backgroundColor: "gray" }, "\u25B2 More above (\u2191/PgUp to scroll, g for top)")),
457
+ lines.length === 0 ? (React.createElement(Text, { dimColor: true }, "No logs available")) : (visibleLines.map((line, i) => (React.createElement(Text, { key: scrollOffset + i }, line)))),
458
+ canScrollDown && (React.createElement(Text, { dimColor: true, backgroundColor: "gray" }, "\u25BC More below (\u2193/PgDn to scroll, G for bottom)")))));
459
+ };
460
+ // Chat View
461
+ const ChatView = ({ service, messages }) => {
462
+ if (!service) {
463
+ return React.createElement(Text, { dimColor: true }, "No service selected");
464
+ }
465
+ return (React.createElement(Box, { flexDirection: "column", height: "100%" },
466
+ React.createElement(Box, { borderStyle: "round", borderColor: "magenta", paddingX: 1, marginBottom: 1 },
467
+ React.createElement(Text, { bold: true, color: "magenta" },
468
+ "\uD83D\uDCAC Chat with ",
469
+ service.name,
470
+ " agent")),
471
+ React.createElement(Box, { flexDirection: "column", flexGrow: 1, overflow: "hidden" }, messages.length === 0 ? (React.createElement(Box, { flexDirection: "column" },
472
+ React.createElement(Text, { dimColor: true },
473
+ "Start a conversation with the ",
474
+ service.name,
475
+ " agent."),
476
+ React.createElement(Box, null,
477
+ React.createElement(Text, { dimColor: true }, "Type your message and press Enter.")),
478
+ React.createElement(Box, null,
479
+ React.createElement(Text, { dimColor: true }, "The agent can help with:")),
480
+ React.createElement(Text, { color: "cyan" }, " \u2022 Service status and health"),
481
+ React.createElement(Text, { color: "cyan" }, " \u2022 Configuration changes"),
482
+ React.createElement(Text, { color: "cyan" }, " \u2022 Debugging issues"),
483
+ React.createElement(Text, { color: "cyan" }, " \u2022 Performance optimization"))) : (messages.map((msg, i) => (React.createElement(Text, { key: i }, msg))))),
484
+ React.createElement(Box, null,
485
+ React.createElement(Text, { dimColor: true }, "Coming soon: Agent chat integration via MCP"))));
486
+ };
487
+ // Add Service View
488
+ const AddServiceView = () => {
489
+ return (React.createElement(Box, { flexDirection: "column" },
490
+ React.createElement(Box, { borderStyle: "round", borderColor: "cyan", paddingX: 1, marginBottom: 1 },
491
+ React.createElement(Text, { bold: true, color: "cyan" }, "\u2795 Add New Service")),
492
+ React.createElement(Box, { flexDirection: "column", paddingX: 2 },
493
+ React.createElement(Text, { color: "yellow", bold: true }, "Coming soon!"),
494
+ React.createElement(Box, null,
495
+ React.createElement(Text, { dimColor: true }, "You'll be able to add services by:")),
496
+ React.createElement(Box, null,
497
+ React.createElement(Text, { color: "cyan" }, " \u2022 Entering a git URL")),
498
+ React.createElement(Text, { color: "cyan" }, " \u2022 Selecting from templates"),
499
+ React.createElement(Text, { color: "cyan" }, " \u2022 Importing from a local path"),
500
+ React.createElement(Box, null,
501
+ React.createElement(Text, { dimColor: true },
502
+ "For now, use: ",
503
+ React.createElement(Text, { color: "green" }, "jfl service add <name> <url>"))))));
504
+ };
505
+ // Render the component
506
+ render(React.createElement(ServicesManager, null));
507
+ //# sourceMappingURL=services-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services-manager.js","sourceRoot":"","sources":["../../src/ui/services-manager.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"auth-guard.d.ts","sourceRoot":"","sources":["../../src/utils/auth-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,EAIL,OAAO,EACR,MAAM,kBAAkB,CAAA;AAiBzB,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,OAAO,CAAA;IACtB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAqBD;;GAEG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAInC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAEhD;AAED;;;GAGG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC,CAwBrD;AAED;;;;GAIG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAuH7D;AAqDD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAkBxC;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,CAAC,EACpC,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,GACxC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAQnB;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAUrC;AA+BD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAsB5D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAcxD"}
1
+ {"version":3,"file":"auth-guard.d.ts","sourceRoot":"","sources":["../../src/utils/auth-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,EAIL,OAAO,EACR,MAAM,kBAAkB,CAAA;AAezB,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,OAAO,CAAA;IACtB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAqBD;;GAEG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAInC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAEhD;AAED;;;GAGG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC,CAwBrD;AAED;;;;GAIG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAuH7D;AAqDD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAkBxC;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,CAAC,EACpC,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,GACxC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAQnB;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAUrC;AA+BD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAsB5D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAcxD"}
@@ -9,22 +9,21 @@
9
9
  import chalk from 'chalk';
10
10
  import ora from 'ora';
11
11
  import inquirer from 'inquirer';
12
- import Conf from 'conf';
12
+ import { getConfigValue, setConfig } from './jfl-config.js';
13
13
  import { getDayPass, getDayPassTimeRemaining, purchaseDayPass, } from './x402-client.js';
14
14
  import { checkUsdcBalance, waitForUsdcBalance, getNetworkName, seedPhraseToPrivateKey, transferUsdc, } from './wallet.js';
15
15
  import { getProjectWallet, getProjectName, } from './project-config.js';
16
- const config = new Conf({ projectName: 'jfl' });
17
16
  /**
18
17
  * Get private key from config
19
18
  */
20
19
  function getPrivateKey() {
21
20
  // Try seed phrase first
22
- const seedPhrase = config.get('x402SeedPhrase');
21
+ const seedPhrase = getConfigValue('x402SeedPhrase');
23
22
  if (seedPhrase) {
24
23
  return seedPhraseToPrivateKey(seedPhrase, 0);
25
24
  }
26
25
  // Try direct private key
27
- const privateKey = config.get('x402PrivateKey');
26
+ const privateKey = getConfigValue('x402PrivateKey');
28
27
  if (privateKey) {
29
28
  return privateKey;
30
29
  }
@@ -34,15 +33,15 @@ function getPrivateKey() {
34
33
  * Check if user is authenticated (has wallet with signing capability)
35
34
  */
36
35
  export function hasWallet() {
37
- const address = config.get('x402Address');
38
- const hasKey = config.get('x402PrivateKey') || config.get('x402SeedPhrase');
36
+ const address = getConfigValue('x402Address');
37
+ const hasKey = getConfigValue('x402PrivateKey') || getConfigValue('x402SeedPhrase');
39
38
  return !!(address && hasKey);
40
39
  }
41
40
  /**
42
41
  * Get user's wallet address
43
42
  */
44
43
  export function getWalletAddress() {
45
- return config.get('x402Address');
44
+ return getConfigValue('x402Address');
46
45
  }
47
46
  /**
48
47
  * Check auth status and day pass
@@ -263,7 +262,7 @@ export async function requireDayPass(handler) {
263
262
  */
264
263
  export function isTrialMode() {
265
264
  // Check if user has completed foundation
266
- const foundationComplete = config.get('foundationComplete');
265
+ const foundationComplete = getConfigValue('foundationComplete');
267
266
  if (foundationComplete)
268
267
  return false;
269
268
  // Check if any teammates have actually joined (authenticated)
@@ -326,7 +325,7 @@ export function markTeammateJoined(username) {
326
325
  * Mark foundation as complete (triggers payment requirement)
327
326
  */
328
327
  export function markFoundationComplete() {
329
- config.set('foundationComplete', true);
328
+ setConfig('foundationComplete', true);
330
329
  }
331
330
  /**
332
331
  * Check if feature requires payment