loopsy 1.0.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/LICENSE +190 -0
  2. package/README.md +425 -0
  3. package/dist/cli/commands/connect.d.ts +2 -0
  4. package/dist/cli/commands/connect.d.ts.map +1 -0
  5. package/dist/cli/commands/connect.js +120 -0
  6. package/dist/cli/commands/connect.js.map +1 -0
  7. package/dist/cli/commands/context.d.ts +2 -0
  8. package/dist/cli/commands/context.d.ts.map +1 -0
  9. package/dist/cli/commands/context.js +39 -0
  10. package/dist/cli/commands/context.js.map +1 -0
  11. package/dist/cli/commands/daemon.d.ts +4 -0
  12. package/dist/cli/commands/daemon.d.ts.map +1 -0
  13. package/dist/cli/commands/daemon.js +55 -0
  14. package/dist/cli/commands/daemon.js.map +1 -0
  15. package/dist/cli/commands/dashboard.d.ts +2 -0
  16. package/dist/cli/commands/dashboard.d.ts.map +1 -0
  17. package/dist/cli/commands/dashboard.js +24 -0
  18. package/dist/cli/commands/dashboard.js.map +1 -0
  19. package/dist/cli/commands/doctor.d.ts +2 -0
  20. package/dist/cli/commands/doctor.d.ts.map +1 -0
  21. package/dist/cli/commands/doctor.js +130 -0
  22. package/dist/cli/commands/doctor.js.map +1 -0
  23. package/dist/cli/commands/exec.d.ts +2 -0
  24. package/dist/cli/commands/exec.d.ts.map +1 -0
  25. package/dist/cli/commands/exec.js +34 -0
  26. package/dist/cli/commands/exec.js.map +1 -0
  27. package/dist/cli/commands/init.d.ts +2 -0
  28. package/dist/cli/commands/init.d.ts.map +1 -0
  29. package/dist/cli/commands/init.js +71 -0
  30. package/dist/cli/commands/init.js.map +1 -0
  31. package/dist/cli/commands/key.d.ts +2 -0
  32. package/dist/cli/commands/key.d.ts.map +1 -0
  33. package/dist/cli/commands/key.js +39 -0
  34. package/dist/cli/commands/key.js.map +1 -0
  35. package/dist/cli/commands/logs.d.ts +2 -0
  36. package/dist/cli/commands/logs.d.ts.map +1 -0
  37. package/dist/cli/commands/logs.js +26 -0
  38. package/dist/cli/commands/logs.js.map +1 -0
  39. package/dist/cli/commands/mcp.d.ts +4 -0
  40. package/dist/cli/commands/mcp.d.ts.map +1 -0
  41. package/dist/cli/commands/mcp.js +70 -0
  42. package/dist/cli/commands/mcp.js.map +1 -0
  43. package/dist/cli/commands/pair.d.ts +6 -0
  44. package/dist/cli/commands/pair.d.ts.map +1 -0
  45. package/dist/cli/commands/pair.js +208 -0
  46. package/dist/cli/commands/pair.js.map +1 -0
  47. package/dist/cli/commands/peers.d.ts +2 -0
  48. package/dist/cli/commands/peers.d.ts.map +1 -0
  49. package/dist/cli/commands/peers.js +29 -0
  50. package/dist/cli/commands/peers.js.map +1 -0
  51. package/dist/cli/commands/service/linux.d.ts +7 -0
  52. package/dist/cli/commands/service/linux.d.ts.map +1 -0
  53. package/dist/cli/commands/service/linux.js +86 -0
  54. package/dist/cli/commands/service/linux.js.map +1 -0
  55. package/dist/cli/commands/service/macos.d.ts +7 -0
  56. package/dist/cli/commands/service/macos.d.ts.map +1 -0
  57. package/dist/cli/commands/service/macos.js +83 -0
  58. package/dist/cli/commands/service/macos.js.map +1 -0
  59. package/dist/cli/commands/service/windows.d.ts +7 -0
  60. package/dist/cli/commands/service/windows.d.ts.map +1 -0
  61. package/dist/cli/commands/service/windows.js +52 -0
  62. package/dist/cli/commands/service/windows.js.map +1 -0
  63. package/dist/cli/commands/service.d.ts +4 -0
  64. package/dist/cli/commands/service.d.ts.map +1 -0
  65. package/dist/cli/commands/service.js +68 -0
  66. package/dist/cli/commands/service.js.map +1 -0
  67. package/dist/cli/commands/session.d.ts +8 -0
  68. package/dist/cli/commands/session.d.ts.map +1 -0
  69. package/dist/cli/commands/session.js +270 -0
  70. package/dist/cli/commands/session.js.map +1 -0
  71. package/dist/cli/commands/transfer.d.ts +3 -0
  72. package/dist/cli/commands/transfer.d.ts.map +1 -0
  73. package/dist/cli/commands/transfer.js +57 -0
  74. package/dist/cli/commands/transfer.js.map +1 -0
  75. package/dist/cli/index.d.ts +3 -0
  76. package/dist/cli/index.d.ts.map +1 -0
  77. package/dist/cli/index.js +89 -0
  78. package/dist/cli/index.js.map +1 -0
  79. package/dist/cli/package-root.d.ts +27 -0
  80. package/dist/cli/package-root.d.ts.map +1 -0
  81. package/dist/cli/package-root.js +54 -0
  82. package/dist/cli/package-root.js.map +1 -0
  83. package/dist/cli/utils.d.ts +11 -0
  84. package/dist/cli/utils.d.ts.map +1 -0
  85. package/dist/cli/utils.js +48 -0
  86. package/dist/cli/utils.js.map +1 -0
  87. package/dist/daemon/config.d.ts +4 -0
  88. package/dist/daemon/config.d.ts.map +1 -0
  89. package/dist/daemon/config.js +58 -0
  90. package/dist/daemon/config.js.map +1 -0
  91. package/dist/daemon/hooks/permission-hook.mjs +108 -0
  92. package/dist/daemon/index.d.ts +3 -0
  93. package/dist/daemon/index.d.ts.map +1 -0
  94. package/dist/daemon/index.js +3 -0
  95. package/dist/daemon/index.js.map +1 -0
  96. package/dist/daemon/main.d.ts +3 -0
  97. package/dist/daemon/main.d.ts.map +1 -0
  98. package/dist/daemon/main.js +28 -0
  99. package/dist/daemon/main.js.map +1 -0
  100. package/dist/daemon/middleware/auth.d.ts +3 -0
  101. package/dist/daemon/middleware/auth.d.ts.map +1 -0
  102. package/dist/daemon/middleware/auth.js +22 -0
  103. package/dist/daemon/middleware/auth.js.map +1 -0
  104. package/dist/daemon/routes/ai-tasks.d.ts +4 -0
  105. package/dist/daemon/routes/ai-tasks.d.ts.map +1 -0
  106. package/dist/daemon/routes/ai-tasks.js +146 -0
  107. package/dist/daemon/routes/ai-tasks.js.map +1 -0
  108. package/dist/daemon/routes/context.d.ts +4 -0
  109. package/dist/daemon/routes/context.d.ts.map +1 -0
  110. package/dist/daemon/routes/context.js +49 -0
  111. package/dist/daemon/routes/context.js.map +1 -0
  112. package/dist/daemon/routes/execute.d.ts +4 -0
  113. package/dist/daemon/routes/execute.d.ts.map +1 -0
  114. package/dist/daemon/routes/execute.js +74 -0
  115. package/dist/daemon/routes/execute.js.map +1 -0
  116. package/dist/daemon/routes/health.d.ts +15 -0
  117. package/dist/daemon/routes/health.d.ts.map +1 -0
  118. package/dist/daemon/routes/health.js +38 -0
  119. package/dist/daemon/routes/health.js.map +1 -0
  120. package/dist/daemon/routes/pair.d.ts +11 -0
  121. package/dist/daemon/routes/pair.d.ts.map +1 -0
  122. package/dist/daemon/routes/pair.js +149 -0
  123. package/dist/daemon/routes/pair.js.map +1 -0
  124. package/dist/daemon/routes/peers.d.ts +5 -0
  125. package/dist/daemon/routes/peers.d.ts.map +1 -0
  126. package/dist/daemon/routes/peers.js +69 -0
  127. package/dist/daemon/routes/peers.js.map +1 -0
  128. package/dist/daemon/routes/transfer.d.ts +4 -0
  129. package/dist/daemon/routes/transfer.d.ts.map +1 -0
  130. package/dist/daemon/routes/transfer.js +135 -0
  131. package/dist/daemon/routes/transfer.js.map +1 -0
  132. package/dist/daemon/server.d.ts +8 -0
  133. package/dist/daemon/server.d.ts.map +1 -0
  134. package/dist/daemon/server.js +170 -0
  135. package/dist/daemon/server.js.map +1 -0
  136. package/dist/daemon/services/ai-task-manager.d.ts +56 -0
  137. package/dist/daemon/services/ai-task-manager.d.ts.map +1 -0
  138. package/dist/daemon/services/ai-task-manager.js +491 -0
  139. package/dist/daemon/services/ai-task-manager.js.map +1 -0
  140. package/dist/daemon/services/audit-logger.d.ts +16 -0
  141. package/dist/daemon/services/audit-logger.d.ts.map +1 -0
  142. package/dist/daemon/services/audit-logger.js +23 -0
  143. package/dist/daemon/services/audit-logger.js.map +1 -0
  144. package/dist/daemon/services/context-store.d.ts +17 -0
  145. package/dist/daemon/services/context-store.d.ts.map +1 -0
  146. package/dist/daemon/services/context-store.js +97 -0
  147. package/dist/daemon/services/context-store.js.map +1 -0
  148. package/dist/daemon/services/job-manager.d.ts +19 -0
  149. package/dist/daemon/services/job-manager.d.ts.map +1 -0
  150. package/dist/daemon/services/job-manager.js +92 -0
  151. package/dist/daemon/services/job-manager.js.map +1 -0
  152. package/dist/daemon/services/tls-manager.d.ts +33 -0
  153. package/dist/daemon/services/tls-manager.d.ts.map +1 -0
  154. package/dist/daemon/services/tls-manager.js +114 -0
  155. package/dist/daemon/services/tls-manager.js.map +1 -0
  156. package/dist/daemon/utils/which.d.ts +2 -0
  157. package/dist/daemon/utils/which.d.ts.map +1 -0
  158. package/dist/daemon/utils/which.js +18 -0
  159. package/dist/daemon/utils/which.js.map +1 -0
  160. package/dist/dashboard/config.d.ts +8 -0
  161. package/dist/dashboard/config.d.ts.map +1 -0
  162. package/dist/dashboard/config.js +22 -0
  163. package/dist/dashboard/config.js.map +1 -0
  164. package/dist/dashboard/public/app.js +120 -0
  165. package/dist/dashboard/public/icon-192.png +0 -0
  166. package/dist/dashboard/public/icon-512.png +0 -0
  167. package/dist/dashboard/public/index.html +85 -0
  168. package/dist/dashboard/public/manifest.json +12 -0
  169. package/dist/dashboard/public/style.css +784 -0
  170. package/dist/dashboard/public/sw.js +31 -0
  171. package/dist/dashboard/public/views/ai-tasks.js +679 -0
  172. package/dist/dashboard/public/views/context.js +167 -0
  173. package/dist/dashboard/public/views/messages.js +263 -0
  174. package/dist/dashboard/public/views/overview.js +228 -0
  175. package/dist/dashboard/public/views/peers.js +136 -0
  176. package/dist/dashboard/public/views/terminal.js +153 -0
  177. package/dist/dashboard/routes/ai-tasks.d.ts +3 -0
  178. package/dist/dashboard/routes/ai-tasks.d.ts.map +1 -0
  179. package/dist/dashboard/routes/ai-tasks.js +193 -0
  180. package/dist/dashboard/routes/ai-tasks.js.map +1 -0
  181. package/dist/dashboard/routes/messages.d.ts +3 -0
  182. package/dist/dashboard/routes/messages.d.ts.map +1 -0
  183. package/dist/dashboard/routes/messages.js +137 -0
  184. package/dist/dashboard/routes/messages.js.map +1 -0
  185. package/dist/dashboard/routes/peer-utils.d.ts +17 -0
  186. package/dist/dashboard/routes/peer-utils.d.ts.map +1 -0
  187. package/dist/dashboard/routes/peer-utils.js +193 -0
  188. package/dist/dashboard/routes/peer-utils.js.map +1 -0
  189. package/dist/dashboard/routes/peers-all.d.ts +3 -0
  190. package/dist/dashboard/routes/peers-all.d.ts.map +1 -0
  191. package/dist/dashboard/routes/peers-all.js +8 -0
  192. package/dist/dashboard/routes/peers-all.js.map +1 -0
  193. package/dist/dashboard/routes/proxy.d.ts +3 -0
  194. package/dist/dashboard/routes/proxy.d.ts.map +1 -0
  195. package/dist/dashboard/routes/proxy.js +59 -0
  196. package/dist/dashboard/routes/proxy.js.map +1 -0
  197. package/dist/dashboard/routes/sessions.d.ts +3 -0
  198. package/dist/dashboard/routes/sessions.d.ts.map +1 -0
  199. package/dist/dashboard/routes/sessions.js +64 -0
  200. package/dist/dashboard/routes/sessions.js.map +1 -0
  201. package/dist/dashboard/routes/sse.d.ts +3 -0
  202. package/dist/dashboard/routes/sse.d.ts.map +1 -0
  203. package/dist/dashboard/routes/sse.js +49 -0
  204. package/dist/dashboard/routes/sse.js.map +1 -0
  205. package/dist/dashboard/routes/status.d.ts +3 -0
  206. package/dist/dashboard/routes/status.d.ts.map +1 -0
  207. package/dist/dashboard/routes/status.js +38 -0
  208. package/dist/dashboard/routes/status.js.map +1 -0
  209. package/dist/dashboard/server.d.ts +3 -0
  210. package/dist/dashboard/server.d.ts.map +1 -0
  211. package/dist/dashboard/server.js +77 -0
  212. package/dist/dashboard/server.js.map +1 -0
  213. package/dist/dashboard/session-manager.d.ts +17 -0
  214. package/dist/dashboard/session-manager.d.ts.map +1 -0
  215. package/dist/dashboard/session-manager.js +225 -0
  216. package/dist/dashboard/session-manager.js.map +1 -0
  217. package/dist/discovery/health-checker.d.ts +15 -0
  218. package/dist/discovery/health-checker.d.ts.map +1 -0
  219. package/dist/discovery/health-checker.js +47 -0
  220. package/dist/discovery/health-checker.js.map +1 -0
  221. package/dist/discovery/index.d.ts +4 -0
  222. package/dist/discovery/index.d.ts.map +1 -0
  223. package/dist/discovery/index.js +4 -0
  224. package/dist/discovery/index.js.map +1 -0
  225. package/dist/discovery/mdns.d.ts +21 -0
  226. package/dist/discovery/mdns.d.ts.map +1 -0
  227. package/dist/discovery/mdns.js +83 -0
  228. package/dist/discovery/mdns.js.map +1 -0
  229. package/dist/discovery/peer-registry.d.ts +18 -0
  230. package/dist/discovery/peer-registry.d.ts.map +1 -0
  231. package/dist/discovery/peer-registry.js +81 -0
  232. package/dist/discovery/peer-registry.js.map +1 -0
  233. package/dist/mcp-server/daemon-client.d.ts +69 -0
  234. package/dist/mcp-server/daemon-client.d.ts.map +1 -0
  235. package/dist/mcp-server/daemon-client.js +281 -0
  236. package/dist/mcp-server/daemon-client.js.map +1 -0
  237. package/dist/mcp-server/index.d.ts +3 -0
  238. package/dist/mcp-server/index.d.ts.map +1 -0
  239. package/dist/mcp-server/index.js +406 -0
  240. package/dist/mcp-server/index.js.map +1 -0
  241. package/dist/protocol/constants.d.ts +66 -0
  242. package/dist/protocol/constants.d.ts.map +1 -0
  243. package/dist/protocol/constants.js +66 -0
  244. package/dist/protocol/constants.js.map +1 -0
  245. package/dist/protocol/errors.d.ts +47 -0
  246. package/dist/protocol/errors.d.ts.map +1 -0
  247. package/dist/protocol/errors.js +62 -0
  248. package/dist/protocol/errors.js.map +1 -0
  249. package/dist/protocol/index.d.ts +5 -0
  250. package/dist/protocol/index.d.ts.map +1 -0
  251. package/dist/protocol/index.js +5 -0
  252. package/dist/protocol/index.js.map +1 -0
  253. package/dist/protocol/schemas.d.ts +209 -0
  254. package/dist/protocol/schemas.d.ts.map +1 -0
  255. package/dist/protocol/schemas.js +115 -0
  256. package/dist/protocol/schemas.js.map +1 -0
  257. package/dist/protocol/types.d.ts +302 -0
  258. package/dist/protocol/types.d.ts.map +1 -0
  259. package/dist/protocol/types.js +2 -0
  260. package/dist/protocol/types.js.map +1 -0
  261. package/package.json +50 -0
  262. package/scripts/postinstall.mjs +42 -0
@@ -0,0 +1,52 @@
1
+ import { execSync } from 'node:child_process';
2
+ import { daemonMainPath } from '../../package-root.js';
3
+ const TASK_NAME = 'LoopsyDaemon';
4
+ export async function enableWindows() {
5
+ const nodePath = process.execPath;
6
+ const daemonPath = daemonMainPath();
7
+ // Delete existing task if present (ignore errors)
8
+ try {
9
+ execSync(`schtasks /delete /tn "${TASK_NAME}" /f`, { stdio: 'ignore' });
10
+ }
11
+ catch { }
12
+ // Create a task that runs at logon
13
+ // /sc onlogon: trigger on user logon
14
+ // /rl LIMITED: run with user privileges (no elevation)
15
+ const cmd = `schtasks /create /tn "${TASK_NAME}" /tr "\\"${nodePath}\\" \\"${daemonPath}\\"" /sc onlogon /rl LIMITED /f`;
16
+ execSync(cmd);
17
+ // Also start it now
18
+ try {
19
+ execSync(`schtasks /run /tn "${TASK_NAME}"`, { stdio: 'ignore' });
20
+ }
21
+ catch { }
22
+ console.log('Loopsy daemon registered with Task Scheduler');
23
+ console.log('The daemon will start automatically on logon');
24
+ }
25
+ export async function disableWindows() {
26
+ // Stop the running task
27
+ try {
28
+ execSync(`schtasks /end /tn "${TASK_NAME}"`, { stdio: 'ignore' });
29
+ }
30
+ catch { }
31
+ // Delete the scheduled task
32
+ try {
33
+ execSync(`schtasks /delete /tn "${TASK_NAME}" /f`);
34
+ }
35
+ catch { }
36
+ console.log('Loopsy daemon unregistered from Task Scheduler');
37
+ }
38
+ export async function statusWindows() {
39
+ let enabled = false;
40
+ let running = false;
41
+ try {
42
+ const output = execSync(`schtasks /query /tn "${TASK_NAME}" /fo csv /nh`, {
43
+ encoding: 'utf-8',
44
+ stdio: ['pipe', 'pipe', 'pipe'],
45
+ });
46
+ enabled = output.includes(TASK_NAME);
47
+ running = output.includes('Running');
48
+ }
49
+ catch { }
50
+ return { enabled, running };
51
+ }
52
+ //# sourceMappingURL=windows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windows.js","sourceRoot":"","sources":["../../../src/commands/service/windows.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,MAAM,SAAS,GAAG,cAAc,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IAEpC,kDAAkD;IAClD,IAAI,CAAC;QACH,QAAQ,CAAC,yBAAyB,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC1E,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,mCAAmC;IACnC,qCAAqC;IACrC,uDAAuD;IACvD,MAAM,GAAG,GAAG,yBAAyB,SAAS,aAAa,QAAQ,UAAU,UAAU,iCAAiC,CAAC;IACzH,QAAQ,CAAC,GAAG,CAAC,CAAC;IAEd,oBAAoB;IACpB,IAAI,CAAC;QACH,QAAQ,CAAC,sBAAsB,SAAS,GAAG,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,wBAAwB;IACxB,IAAI,CAAC;QACH,QAAQ,CAAC,sBAAsB,SAAS,GAAG,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,4BAA4B;IAC5B,IAAI,CAAC;QACH,QAAQ,CAAC,yBAAyB,SAAS,MAAM,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,wBAAwB,SAAS,eAAe,EAAE;YACxE,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QACH,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACrC,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function enableCommand(): Promise<void>;
2
+ export declare function disableCommand(): Promise<void>;
3
+ export declare function serviceStatusCommand(): Promise<void>;
4
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/commands/service.ts"],"names":[],"mappings":"AAuBA,wBAAsB,aAAa,kBAclC;AAED,wBAAsB,cAAc,kBAWnC;AAED,wBAAsB,oBAAoB,kBAsBzC"}
@@ -0,0 +1,68 @@
1
+ import { platform } from 'node:os';
2
+ async function getPlatformModule() {
3
+ const os = platform();
4
+ switch (os) {
5
+ case 'darwin':
6
+ return import('./service/macos.js');
7
+ case 'linux':
8
+ return import('./service/linux.js');
9
+ case 'win32':
10
+ return import('./service/windows.js');
11
+ default:
12
+ console.error(`Unsupported platform: ${os}`);
13
+ console.error('Supported platforms: macOS (launchd), Linux (systemd), Windows (Task Scheduler)');
14
+ process.exit(1);
15
+ }
16
+ }
17
+ export async function enableCommand() {
18
+ const os = platform();
19
+ const mod = await getPlatformModule();
20
+ console.log(`Platform: ${os}`);
21
+ console.log('');
22
+ if (os === 'darwin') {
23
+ await mod.enableMacos();
24
+ }
25
+ else if (os === 'linux') {
26
+ await mod.enableLinux();
27
+ }
28
+ else if (os === 'win32') {
29
+ await mod.enableWindows();
30
+ }
31
+ }
32
+ export async function disableCommand() {
33
+ const os = platform();
34
+ const mod = await getPlatformModule();
35
+ if (os === 'darwin') {
36
+ await mod.disableMacos();
37
+ }
38
+ else if (os === 'linux') {
39
+ await mod.disableLinux();
40
+ }
41
+ else if (os === 'win32') {
42
+ await mod.disableWindows();
43
+ }
44
+ }
45
+ export async function serviceStatusCommand() {
46
+ const os = platform();
47
+ const mod = await getPlatformModule();
48
+ let status;
49
+ if (os === 'darwin') {
50
+ status = await mod.statusMacos();
51
+ }
52
+ else if (os === 'linux') {
53
+ status = await mod.statusLinux();
54
+ }
55
+ else if (os === 'win32') {
56
+ status = await mod.statusWindows();
57
+ }
58
+ else {
59
+ return;
60
+ }
61
+ console.log(`System service: ${status.enabled ? 'enabled' : 'disabled'}`);
62
+ console.log(`Daemon process: ${status.running ? 'running' : 'stopped'}`);
63
+ if (!status.enabled) {
64
+ console.log('');
65
+ console.log('Run "loopsy enable" to register the daemon as a system service');
66
+ }
67
+ }
68
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/commands/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export declare function sessionStartCommand(argv: any): Promise<void>;
2
+ export declare function sessionStartFleetCommand(argv: any): Promise<void>;
3
+ export declare function sessionStopCommand(argv: any): Promise<void>;
4
+ export declare function sessionStopAllCommand(): Promise<void>;
5
+ export declare function sessionListCommand(): Promise<void>;
6
+ export declare function sessionStatusCommand(argv: any): Promise<void>;
7
+ export declare function sessionCommand(argv: any): void;
8
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"AAwDA,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,GAAG,iBA+GlD;AAED,wBAAsB,wBAAwB,CAAC,IAAI,EAAE,GAAG,iBAQvD;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,GAAG,iBAWjD;AAED,wBAAsB,qBAAqB,kBAoB1C;AAED,wBAAsB,kBAAkB,kBAwCvC;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,GAAG,iBAuBnD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,GAAG,QAEvC"}
@@ -0,0 +1,270 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { readFile, writeFile, mkdir, readdir, unlink } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ import { homedir, hostname as osHostname } from 'node:os';
5
+ import { parse as parseYaml, stringify as toYaml } from 'yaml';
6
+ import { createServer } from 'node:net';
7
+ import { CONFIG_DIR, CONFIG_FILE, SESSIONS_DIR, DEFAULT_PORT } from '@loopsy/protocol';
8
+ import { daemonMainPath } from '../package-root.js';
9
+ const LOOPSY_DIR = join(homedir(), CONFIG_DIR);
10
+ const SESSIONS_PATH = join(LOOPSY_DIR, SESSIONS_DIR);
11
+ async function loadParentConfig() {
12
+ const raw = await readFile(join(LOOPSY_DIR, CONFIG_FILE), 'utf-8');
13
+ return parseYaml(raw);
14
+ }
15
+ async function isPortFree(port) {
16
+ return new Promise((resolve) => {
17
+ const server = createServer();
18
+ server.once('error', () => resolve(false));
19
+ server.once('listening', () => {
20
+ server.close(() => resolve(true));
21
+ });
22
+ server.listen(port, '0.0.0.0');
23
+ });
24
+ }
25
+ async function findFreePort(startPort) {
26
+ for (let port = startPort; port < startPort + 100; port++) {
27
+ if (await isPortFree(port))
28
+ return port;
29
+ }
30
+ throw new Error('No free port found in range');
31
+ }
32
+ async function getRunningSessionPorts() {
33
+ const sessions = [];
34
+ try {
35
+ const dirs = await readdir(SESSIONS_PATH);
36
+ for (const name of dirs) {
37
+ try {
38
+ const configRaw = await readFile(join(SESSIONS_PATH, name, CONFIG_FILE), 'utf-8');
39
+ const config = parseYaml(configRaw);
40
+ const pidRaw = await readFile(join(SESSIONS_PATH, name, 'daemon.pid'), 'utf-8');
41
+ const pid = parseInt(pidRaw, 10);
42
+ process.kill(pid, 0); // Check if running
43
+ sessions.push({ name, port: config.server.port, hostname: config.server?.hostname || name });
44
+ }
45
+ catch {
46
+ // Not running or no config
47
+ }
48
+ }
49
+ }
50
+ catch {
51
+ // No sessions dir yet
52
+ }
53
+ return sessions;
54
+ }
55
+ export async function sessionStartCommand(argv) {
56
+ const name = argv.name;
57
+ const sessionDir = join(SESSIONS_PATH, name);
58
+ const pidFile = join(sessionDir, 'daemon.pid');
59
+ // Check if already running
60
+ try {
61
+ const pid = parseInt(await readFile(pidFile, 'utf-8'), 10);
62
+ process.kill(pid, 0);
63
+ console.log(`Session "${name}" already running (PID ${pid})`);
64
+ return;
65
+ }
66
+ catch {
67
+ // Not running
68
+ }
69
+ // Load parent config
70
+ const parentConfig = await loadParentConfig();
71
+ const machineHostname = parentConfig.server?.hostname || osHostname();
72
+ // Find a free port
73
+ const runningSessions = await getRunningSessionPorts();
74
+ const usedPorts = new Set(runningSessions.map((s) => s.port));
75
+ let port = DEFAULT_PORT + 1;
76
+ while (usedPorts.has(port) || !(await isPortFree(port))) {
77
+ port++;
78
+ if (port > DEFAULT_PORT + 100)
79
+ throw new Error('No free port found');
80
+ }
81
+ // Build sibling manual peers (main daemon + other sessions) with hostnames
82
+ const manualPeers = [
83
+ // Main daemon
84
+ { address: '127.0.0.1', port: parentConfig.server?.port ?? DEFAULT_PORT, hostname: machineHostname },
85
+ // Existing sibling sessions
86
+ ...runningSessions.map((s) => ({ address: '127.0.0.1', port: s.port, hostname: s.hostname })),
87
+ // Remote peers from parent config
88
+ ...(parentConfig.discovery?.manualPeers ?? []),
89
+ ];
90
+ // Build session config
91
+ const sessionConfig = {
92
+ server: {
93
+ port,
94
+ host: '0.0.0.0',
95
+ hostname: `${machineHostname}-${name}`,
96
+ },
97
+ auth: {
98
+ apiKey: parentConfig.auth.apiKey,
99
+ allowedKeys: { ...parentConfig.auth.allowedKeys },
100
+ },
101
+ execution: parentConfig.execution,
102
+ transfer: parentConfig.transfer,
103
+ rateLimits: parentConfig.rateLimits,
104
+ discovery: {
105
+ enabled: false, // Use manual peers for sessions to avoid mDNS conflicts
106
+ manualPeers: manualPeers,
107
+ },
108
+ logging: { level: 'info' },
109
+ };
110
+ // Write session config
111
+ await mkdir(join(sessionDir, 'logs'), { recursive: true });
112
+ await writeFile(join(sessionDir, CONFIG_FILE), toYaml(sessionConfig));
113
+ // Spawn daemon with --data-dir
114
+ const daemonPath = daemonMainPath();
115
+ const child = spawn('node', [daemonPath, '--data-dir', sessionDir], {
116
+ detached: true,
117
+ stdio: 'ignore',
118
+ });
119
+ if (child.pid) {
120
+ await writeFile(pidFile, String(child.pid));
121
+ child.unref();
122
+ console.log(`Session "${name}" started`);
123
+ console.log(` PID: ${child.pid}`);
124
+ console.log(` Port: ${port}`);
125
+ console.log(` Hostname: ${sessionConfig.server.hostname}`);
126
+ console.log(` Data dir: ${sessionDir}`);
127
+ // Notify existing sibling sessions about the new peer
128
+ for (const sibling of runningSessions) {
129
+ try {
130
+ await fetch(`http://127.0.0.1:${sibling.port}/api/v1/peers`, {
131
+ method: 'POST',
132
+ headers: {
133
+ 'Content-Type': 'application/json',
134
+ Authorization: `Bearer ${parentConfig.auth.apiKey}`,
135
+ },
136
+ body: JSON.stringify({ address: '127.0.0.1', port, hostname: sessionConfig.server.hostname }),
137
+ });
138
+ }
139
+ catch {
140
+ // Sibling might not be responding yet
141
+ }
142
+ }
143
+ // Notify main daemon about the new session
144
+ try {
145
+ await fetch(`http://127.0.0.1:${parentConfig.server?.port ?? DEFAULT_PORT}/api/v1/peers`, {
146
+ method: 'POST',
147
+ headers: {
148
+ 'Content-Type': 'application/json',
149
+ Authorization: `Bearer ${parentConfig.auth.apiKey}`,
150
+ },
151
+ body: JSON.stringify({ address: '127.0.0.1', port }),
152
+ });
153
+ }
154
+ catch {
155
+ // Main daemon might not be running
156
+ }
157
+ }
158
+ else {
159
+ console.error(`Failed to start session "${name}"`);
160
+ }
161
+ }
162
+ export async function sessionStartFleetCommand(argv) {
163
+ const count = argv.count;
164
+ for (let i = 1; i <= count; i++) {
165
+ const name = `worker-${i}`;
166
+ console.log(`\nStarting session ${i}/${count}...`);
167
+ await sessionStartCommand({ name });
168
+ }
169
+ console.log(`\nFleet of ${count} sessions started.`);
170
+ }
171
+ export async function sessionStopCommand(argv) {
172
+ const name = argv.name;
173
+ const pidFile = join(SESSIONS_PATH, name, 'daemon.pid');
174
+ try {
175
+ const pid = parseInt(await readFile(pidFile, 'utf-8'), 10);
176
+ process.kill(pid, 'SIGTERM');
177
+ await unlink(pidFile);
178
+ console.log(`Session "${name}" stopped (PID ${pid})`);
179
+ }
180
+ catch {
181
+ console.log(`Session "${name}" is not running`);
182
+ }
183
+ }
184
+ export async function sessionStopAllCommand() {
185
+ try {
186
+ const dirs = await readdir(SESSIONS_PATH);
187
+ let stopped = 0;
188
+ for (const name of dirs) {
189
+ const pidFile = join(SESSIONS_PATH, name, 'daemon.pid');
190
+ try {
191
+ const pid = parseInt(await readFile(pidFile, 'utf-8'), 10);
192
+ process.kill(pid, 'SIGTERM');
193
+ await unlink(pidFile);
194
+ console.log(`Stopped session "${name}" (PID ${pid})`);
195
+ stopped++;
196
+ }
197
+ catch {
198
+ // Not running
199
+ }
200
+ }
201
+ console.log(`\nStopped ${stopped} session(s)`);
202
+ }
203
+ catch {
204
+ console.log('No sessions found');
205
+ }
206
+ }
207
+ export async function sessionListCommand() {
208
+ try {
209
+ const dirs = await readdir(SESSIONS_PATH);
210
+ if (dirs.length === 0) {
211
+ console.log('No sessions found');
212
+ return;
213
+ }
214
+ console.log('Sessions:');
215
+ console.log(' NAME PORT HOSTNAME PID STATUS');
216
+ console.log(' ' + '-'.repeat(70));
217
+ for (const name of dirs.sort()) {
218
+ let port = '?';
219
+ let hostname = '?';
220
+ let pid = '?';
221
+ let status = 'stopped';
222
+ try {
223
+ const configRaw = await readFile(join(SESSIONS_PATH, name, CONFIG_FILE), 'utf-8');
224
+ const config = parseYaml(configRaw);
225
+ port = String(config.server?.port ?? '?');
226
+ hostname = config.server?.hostname ?? '?';
227
+ }
228
+ catch { }
229
+ try {
230
+ const pidRaw = await readFile(join(SESSIONS_PATH, name, 'daemon.pid'), 'utf-8');
231
+ const pidNum = parseInt(pidRaw, 10);
232
+ process.kill(pidNum, 0); // Check if running
233
+ pid = String(pidNum);
234
+ status = 'running';
235
+ }
236
+ catch { }
237
+ console.log(` ${name.padEnd(16)}${port.padEnd(8)}${hostname.padEnd(28)}${pid.padEnd(8)}${status}`);
238
+ }
239
+ }
240
+ catch {
241
+ console.log('No sessions found');
242
+ }
243
+ }
244
+ export async function sessionStatusCommand(argv) {
245
+ const name = argv.name;
246
+ const sessionDir = join(SESSIONS_PATH, name);
247
+ try {
248
+ const configRaw = await readFile(join(sessionDir, CONFIG_FILE), 'utf-8');
249
+ const config = parseYaml(configRaw);
250
+ const port = config.server?.port;
251
+ const res = await fetch(`http://127.0.0.1:${port}/api/v1/status`, {
252
+ headers: { Authorization: `Bearer ${config.auth?.apiKey}` },
253
+ });
254
+ if (res.ok) {
255
+ const status = await res.json();
256
+ console.log(JSON.stringify(status, null, 2));
257
+ }
258
+ else {
259
+ console.log(`Session "${name}" is not responding (HTTP ${res.status})`);
260
+ }
261
+ }
262
+ catch (err) {
263
+ console.log(`Session "${name}" is not running or unreachable`);
264
+ console.log(`Error: ${err.message}`);
265
+ }
266
+ }
267
+ export function sessionCommand(argv) {
268
+ // Handled by subcommands
269
+ }
270
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,SAAS,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACvF,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AAC/C,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;AAErD,KAAK,UAAU,gBAAgB;IAC7B,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;IACnE,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;AACxB,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAY;IACpC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;YAC5B,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,SAAiB;IAC3C,KAAK,IAAI,IAAI,GAAG,SAAS,EAAE,IAAI,GAAG,SAAS,GAAG,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC;QAC1D,IAAI,MAAM,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;IAC1C,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;AACjD,CAAC;AAED,KAAK,UAAU,sBAAsB;IACnC,MAAM,QAAQ,GAA4D,EAAE,CAAC;IAC7E,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;QAC1C,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;YACxB,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;gBAClF,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAQ,CAAC;gBAC3C,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;gBAChF,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBACjC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,mBAAmB;gBACzC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAC;YAC/F,CAAC;YAAC,MAAM,CAAC;gBACP,2BAA2B;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,sBAAsB;IACxB,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAS;IACjD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAc,CAAC;IACjC,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAE/C,2BAA2B;IAC3B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,0BAA0B,GAAG,GAAG,CAAC,CAAC;QAC9D,OAAO;IACT,CAAC;IAAC,MAAM,CAAC;QACP,cAAc;IAChB,CAAC;IAED,qBAAqB;IACrB,MAAM,YAAY,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAC9C,MAAM,eAAe,GAAG,YAAY,CAAC,MAAM,EAAE,QAAQ,IAAI,UAAU,EAAE,CAAC;IAEtE,mBAAmB;IACnB,MAAM,eAAe,GAAG,MAAM,sBAAsB,EAAE,CAAC;IACvD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9D,IAAI,IAAI,GAAG,YAAY,GAAG,CAAC,CAAC;IAC5B,OAAO,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACxD,IAAI,EAAE,CAAC;QACP,IAAI,IAAI,GAAG,YAAY,GAAG,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACvE,CAAC;IAED,2EAA2E;IAC3E,MAAM,WAAW,GAAG;QAClB,cAAc;QACd,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,CAAC,MAAM,EAAE,IAAI,IAAI,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE;QACpG,4BAA4B;QAC5B,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC7F,kCAAkC;QAClC,GAAG,CAAC,YAAY,CAAC,SAAS,EAAE,WAAW,IAAI,EAAE,CAAC;KAC/C,CAAC;IAEF,uBAAuB;IACvB,MAAM,aAAa,GAAG;QACpB,MAAM,EAAE;YACN,IAAI;YACJ,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,GAAG,eAAe,IAAI,IAAI,EAAE;SACvC;QACD,IAAI,EAAE;YACJ,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,MAAM;YAChC,WAAW,EAAE,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE;SAClD;QACD,SAAS,EAAE,YAAY,CAAC,SAAS;QACjC,QAAQ,EAAE,YAAY,CAAC,QAAQ;QAC/B,UAAU,EAAE,YAAY,CAAC,UAAU;QACnC,SAAS,EAAE;YACT,OAAO,EAAE,KAAK,EAAE,wDAAwD;YACxE,WAAW,EAAE,WAAW;SACzB;QACD,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;KAC3B,CAAC;IAEF,uBAAuB;IACvB,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,MAAM,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;IAEtE,+BAA+B;IAC/B,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IACpC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE;QAClE,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,QAAQ;KAChB,CAAC,CAAC;IAEH,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;QACd,MAAM,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5C,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,WAAW,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,eAAe,aAAa,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,eAAe,UAAU,EAAE,CAAC,CAAC;QAEzC,sDAAsD;QACtD,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;YACtC,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,oBAAoB,OAAO,CAAC,IAAI,eAAe,EAAE;oBAC3D,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE;wBACP,cAAc,EAAE,kBAAkB;wBAClC,aAAa,EAAE,UAAU,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE;qBACpD;oBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;iBAC9F,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,sCAAsC;YACxC,CAAC;QACH,CAAC;QAED,2CAA2C;QAC3C,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,oBAAoB,YAAY,CAAC,MAAM,EAAE,IAAI,IAAI,YAAY,eAAe,EAAE;gBACxF,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,aAAa,EAAE,UAAU,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE;iBACpD;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;aACrD,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,mCAAmC;QACrC,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,4BAA4B,IAAI,GAAG,CAAC,CAAC;IACrD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,IAAS;IACtD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAe,CAAC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,UAAU,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;QACnD,MAAM,mBAAmB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,oBAAoB,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAS;IAChD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAc,CAAC;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;IACxD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC7B,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,kBAAkB,GAAG,GAAG,CAAC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,kBAAkB,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;QAC1C,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;YACxD,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC3D,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;gBAC7B,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,UAAU,GAAG,GAAG,CAAC,CAAC;gBACtD,OAAO,EAAE,CAAC;YACZ,CAAC;YAAC,MAAM,CAAC;gBACP,cAAc;YAChB,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,aAAa,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;QAC1C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACjC,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;QACpF,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAEnC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YAC/B,IAAI,IAAI,GAAG,GAAG,CAAC;YACf,IAAI,QAAQ,GAAG,GAAG,CAAC;YACnB,IAAI,GAAG,GAAG,GAAG,CAAC;YACd,IAAI,MAAM,GAAG,SAAS,CAAC;YAEvB,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;gBAClF,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAQ,CAAC;gBAC3C,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,IAAI,GAAG,CAAC,CAAC;gBAC1C,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,IAAI,GAAG,CAAC;YAC5C,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;YAEV,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;gBAChF,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBACpC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,mBAAmB;gBAC5C,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;gBACrB,MAAM,GAAG,SAAS,CAAC;YACrB,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;YAEV,OAAO,CAAC,GAAG,CACT,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CACvF,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,IAAS;IAClD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAc,CAAC;IACjC,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IAE7C,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;QACzE,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAQ,CAAC;QAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC;QAEjC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,oBAAoB,IAAI,gBAAgB,EAAE;YAChE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;SAC5D,CAAC,CAAC;QAEH,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;YACX,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,6BAA6B,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,iCAAiC,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAS;IACtC,yBAAyB;AAC3B,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function sendCommand(argv: any): Promise<void>;
2
+ export declare function pullCommand(argv: any): Promise<void>;
3
+ //# sourceMappingURL=transfer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../../src/commands/transfer.ts"],"names":[],"mappings":"AAIA,wBAAsB,WAAW,CAAC,IAAI,EAAE,GAAG,iBA4B1C;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,GAAG,iBA4B1C"}
@@ -0,0 +1,57 @@
1
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
2
+ import { dirname } from 'node:path';
3
+ import { loadApiKey, parsePeerAddress } from '../utils.js';
4
+ export async function sendCommand(argv) {
5
+ const { address, port } = parsePeerAddress(argv.peer);
6
+ const apiKey = argv.key || await loadApiKey();
7
+ try {
8
+ const fileData = await readFile(argv.src);
9
+ const formData = new FormData();
10
+ formData.append('destPath', argv.dest);
11
+ formData.append('file', new Blob([fileData]), argv.src.split('/').pop() ?? 'file');
12
+ const res = await fetch(`http://${address}:${port}/api/v1/transfer/push`, {
13
+ method: 'POST',
14
+ headers: { Authorization: `Bearer ${apiKey}` },
15
+ body: formData,
16
+ });
17
+ if (!res.ok) {
18
+ const body = await res.json().catch(() => ({}));
19
+ console.error(`Error: ${body.error?.message ?? res.statusText}`);
20
+ process.exit(1);
21
+ }
22
+ const result = await res.json();
23
+ console.log(`File sent: ${result.path} (${result.size} bytes, sha256: ${result.checksum})`);
24
+ }
25
+ catch (err) {
26
+ console.error(`Failed to send: ${err.message}`);
27
+ process.exit(1);
28
+ }
29
+ }
30
+ export async function pullCommand(argv) {
31
+ const { address, port } = parsePeerAddress(argv.peer);
32
+ const apiKey = argv.key || await loadApiKey();
33
+ try {
34
+ const res = await fetch(`http://${address}:${port}/api/v1/transfer/pull`, {
35
+ method: 'POST',
36
+ headers: {
37
+ 'Content-Type': 'application/json',
38
+ Authorization: `Bearer ${apiKey}`,
39
+ },
40
+ body: JSON.stringify({ sourcePath: argv.src }),
41
+ });
42
+ if (!res.ok) {
43
+ const body = await res.json().catch(() => ({}));
44
+ console.error(`Error: ${body.error?.message ?? res.statusText}`);
45
+ process.exit(1);
46
+ }
47
+ await mkdir(dirname(argv.dest), { recursive: true });
48
+ const buffer = Buffer.from(await res.arrayBuffer());
49
+ await writeFile(argv.dest, buffer);
50
+ console.log(`File pulled: ${argv.dest} (${buffer.length} bytes)`);
51
+ }
52
+ catch (err) {
53
+ console.error(`Failed to pull: ${err.message}`);
54
+ process.exit(1);
55
+ }
56
+ }
57
+ //# sourceMappingURL=transfer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../src/commands/transfer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,89 @@
1
+ #!/usr/bin/env node
2
+ import yargs from 'yargs';
3
+ import { hideBin } from 'yargs/helpers';
4
+ import { initCommand } from './commands/init.js';
5
+ import { startCommand, stopCommand, statusCommand } from './commands/daemon.js';
6
+ import { peersCommand } from './commands/peers.js';
7
+ import { execCommand } from './commands/exec.js';
8
+ import { sendCommand, pullCommand } from './commands/transfer.js';
9
+ import { contextCommand } from './commands/context.js';
10
+ import { keyCommand } from './commands/key.js';
11
+ import { logsCommand } from './commands/logs.js';
12
+ import { connectCommand } from './commands/connect.js';
13
+ import { sessionCommand, sessionStartCommand, sessionStartFleetCommand, sessionStopCommand, sessionStopAllCommand, sessionListCommand, sessionStatusCommand, } from './commands/session.js';
14
+ import { dashboardCommand } from './commands/dashboard.js';
15
+ import { enableCommand, disableCommand, serviceStatusCommand } from './commands/service.js';
16
+ import { mcpAddCommand, mcpRemoveCommand, mcpStatusCommand } from './commands/mcp.js';
17
+ import { pairCommand } from './commands/pair.js';
18
+ import { doctorCommand } from './commands/doctor.js';
19
+ yargs(hideBin(process.argv))
20
+ .scriptName('loopsy')
21
+ .command('init', 'Initialize Loopsy config and generate API key', {}, initCommand)
22
+ .command('connect', 'Interactive wizard to connect to another machine', {}, connectCommand)
23
+ .command('start', 'Start the Loopsy daemon', {}, startCommand)
24
+ .command('stop', 'Stop the Loopsy daemon', {}, stopCommand)
25
+ .command('status', 'Show daemon status', {}, statusCommand)
26
+ .command('peers', 'List known peers', (yargs) => yargs
27
+ .command('add <address> [port]', 'Add a manual peer', {
28
+ address: { type: 'string', demandOption: true },
29
+ port: { type: 'number', default: 19532 },
30
+ })
31
+ .command('remove <nodeId>', 'Remove a peer', {
32
+ nodeId: { type: 'string', demandOption: true },
33
+ }), peersCommand)
34
+ .command('exec <peer> <cmd..>', 'Execute a command on a remote peer', (yargs) => yargs
35
+ .positional('peer', { type: 'string', demandOption: true, describe: 'Peer address (host:port)' })
36
+ .positional('cmd', { type: 'string', array: true, demandOption: true })
37
+ .option('key', { type: 'string', alias: 'k', describe: 'API key for the peer' })
38
+ .option('timeout', { type: 'number', alias: 't', describe: 'Timeout in ms' }), execCommand)
39
+ .command('send <peer> <src> <dest>', 'Push a local file to a remote peer', (yargs) => yargs
40
+ .positional('peer', { type: 'string', demandOption: true })
41
+ .positional('src', { type: 'string', demandOption: true })
42
+ .positional('dest', { type: 'string', demandOption: true })
43
+ .option('key', { type: 'string', alias: 'k' }), sendCommand)
44
+ .command('pull <peer> <src> <dest>', 'Pull a file from a remote peer', (yargs) => yargs
45
+ .positional('peer', { type: 'string', demandOption: true })
46
+ .positional('src', { type: 'string', demandOption: true })
47
+ .positional('dest', { type: 'string', demandOption: true })
48
+ .option('key', { type: 'string', alias: 'k' }), pullCommand)
49
+ .command('context', 'Manage shared context', (yargs) => yargs
50
+ .command('set <key> <value>', 'Set a context value', {
51
+ key: { type: 'string', demandOption: true },
52
+ value: { type: 'string', demandOption: true },
53
+ ttl: { type: 'number', describe: 'TTL in seconds' },
54
+ })
55
+ .command('get <key>', 'Get a context value', {
56
+ key: { type: 'string', demandOption: true },
57
+ })
58
+ .command('list', 'List all context entries')
59
+ .command('delete <key>', 'Delete a context entry', {
60
+ key: { type: 'string', demandOption: true },
61
+ }), contextCommand)
62
+ .command('key', 'API key management', (yargs) => yargs
63
+ .command('generate', 'Generate a new API key')
64
+ .command('show', 'Show current API key'), keyCommand)
65
+ .command('logs', 'View daemon logs', (yargs) => yargs.option('follow', { type: 'boolean', alias: 'f', default: false }), logsCommand)
66
+ .command('session', 'Manage daemon sessions', (yargs) => yargs
67
+ .command('start <name>', 'Start a named session', (y) => y.positional('name', { type: 'string', demandOption: true, describe: 'Session name' }), sessionStartCommand)
68
+ .command('start-fleet', 'Start multiple worker sessions', (y) => y.option('count', { type: 'number', alias: 'c', default: 3, describe: 'Number of sessions' }), sessionStartFleetCommand)
69
+ .command('stop <name>', 'Stop a named session', (y) => y.positional('name', { type: 'string', demandOption: true }), sessionStopCommand)
70
+ .command('stop-all', 'Stop all sessions', {}, sessionStopAllCommand)
71
+ .command('list', 'List all sessions', {}, sessionListCommand)
72
+ .command('status <name>', 'Show status for a session', (y) => y.positional('name', { type: 'string', demandOption: true }), sessionStatusCommand)
73
+ .demandCommand(1), sessionCommand)
74
+ .command('dashboard', 'Start the web dashboard for monitoring and control', (yargs) => yargs.option('port', { type: 'number', alias: 'p', default: 19540, describe: 'Dashboard port' }), dashboardCommand)
75
+ .command('pair [address]', 'Pair with another machine (run without address to wait, or with address to connect)', (yargs) => yargs.positional('address', { type: 'string', describe: 'Peer address (host or host:port)' }), pairCommand)
76
+ .command('enable', 'Register daemon as a system service (auto-start on login)', {}, enableCommand)
77
+ .command('disable', 'Unregister daemon from system service', {}, disableCommand)
78
+ .command('service-status', 'Check system service registration status', {}, serviceStatusCommand)
79
+ .command('mcp', 'Manage MCP server registration with Claude Code', (yargs) => yargs
80
+ .command('add', 'Register MCP server with Claude Code', {}, mcpAddCommand)
81
+ .command('remove', 'Unregister MCP server from Claude Code', {}, mcpRemoveCommand)
82
+ .command('status', 'Check MCP server registration', {}, mcpStatusCommand)
83
+ .demandCommand(1), () => { })
84
+ .command('doctor', 'Run health checks on your Loopsy installation', {}, doctorCommand)
85
+ .demandCommand(1, 'You need at least one command')
86
+ .help()
87
+ .version('1.0.0')
88
+ .parse();
89
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,wBAAwB,EACxB,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC5F,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACtF,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;KACzB,UAAU,CAAC,QAAQ,CAAC;KACpB,OAAO,CAAC,MAAM,EAAE,+CAA+C,EAAE,EAAE,EAAE,WAAW,CAAC;KACjF,OAAO,CAAC,SAAS,EAAE,kDAAkD,EAAE,EAAE,EAAE,cAAc,CAAC;KAC1F,OAAO,CAAC,OAAO,EAAE,yBAAyB,EAAE,EAAE,EAAE,YAAY,CAAC;KAC7D,OAAO,CAAC,MAAM,EAAE,wBAAwB,EAAE,EAAE,EAAE,WAAW,CAAC;KAC1D,OAAO,CAAC,QAAQ,EAAE,oBAAoB,EAAE,EAAE,EAAE,aAAa,CAAC;KAC1D,OAAO,CACN,OAAO,EACP,kBAAkB,EAClB,CAAC,KAAK,EAAE,EAAE,CACR,KAAK;KACF,OAAO,CAAC,sBAAsB,EAAE,mBAAmB,EAAE;IACpD,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE;IAC/C,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;CACzC,CAAC;KACD,OAAO,CAAC,iBAAiB,EAAE,eAAe,EAAE;IAC3C,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE;CAC/C,CAAC,EACN,YAAY,CACb;KACA,OAAO,CACN,qBAAqB,EACrB,oCAAoC,EACpC,CAAC,KAAK,EAAE,EAAE,CACR,KAAK;KACF,UAAU,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,0BAA0B,EAAE,CAAC;KAChG,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;KACtE,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,sBAAsB,EAAE,CAAC;KAC/E,MAAM,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,EACjF,WAAW,CACZ;KACA,OAAO,CACN,0BAA0B,EAC1B,oCAAoC,EACpC,CAAC,KAAK,EAAE,EAAE,CACR,KAAK;KACF,UAAU,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;KAC1D,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;KACzD,UAAU,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;KAC1D,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAClD,WAAW,CACZ;KACA,OAAO,CACN,0BAA0B,EAC1B,gCAAgC,EAChC,CAAC,KAAK,EAAE,EAAE,CACR,KAAK;KACF,UAAU,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;KAC1D,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;KACzD,UAAU,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;KAC1D,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAClD,WAAW,CACZ;KACA,OAAO,CACN,SAAS,EACT,uBAAuB,EACvB,CAAC,KAAK,EAAE,EAAE,CACR,KAAK;KACF,OAAO,CAAC,mBAAmB,EAAE,qBAAqB,EAAE;IACnD,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE;IAC3C,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE;IAC7C,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,EAAE;CACpD,CAAC;KACD,OAAO,CAAC,WAAW,EAAE,qBAAqB,EAAE;IAC3C,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE;CAC5C,CAAC;KACD,OAAO,CAAC,MAAM,EAAE,0BAA0B,CAAC;KAC3C,OAAO,CAAC,cAAc,EAAE,wBAAwB,EAAE;IACjD,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE;CAC5C,CAAC,EACN,cAAc,CACf;KACA,OAAO,CACN,KAAK,EACL,oBAAoB,EACpB,CAAC,KAAK,EAAE,EAAE,CACR,KAAK;KACF,OAAO,CAAC,UAAU,EAAE,wBAAwB,CAAC;KAC7C,OAAO,CAAC,MAAM,EAAE,sBAAsB,CAAC,EAC5C,UAAU,CACX;KACA,OAAO,CACN,MAAM,EACN,kBAAkB,EAClB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAClF,WAAW,CACZ;KACA,OAAO,CACN,SAAS,EACT,wBAAwB,EACxB,CAAC,KAAK,EAAE,EAAE,CACR,KAAK;KACF,OAAO,CACN,cAAc,EACd,uBAAuB,EACvB,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,EAClG,mBAAmB,CACpB;KACA,OAAO,CACN,aAAa,EACb,gCAAgC,EAChC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,oBAAoB,EAAE,CAAC,EACzG,wBAAwB,CACzB;KACA,OAAO,CACN,aAAa,EACb,sBAAsB,EACtB,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,EACxE,kBAAkB,CACnB;KACA,OAAO,CAAC,UAAU,EAAE,mBAAmB,EAAE,EAAE,EAAE,qBAAqB,CAAC;KACnE,OAAO,CAAC,MAAM,EAAE,mBAAmB,EAAE,EAAE,EAAE,kBAAkB,CAAC;KAC5D,OAAO,CACN,eAAe,EACf,2BAA2B,EAC3B,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,EACxE,oBAAoB,CACrB;KACA,aAAa,CAAC,CAAC,CAAC,EACrB,cAAc,CACf;KACA,OAAO,CACN,WAAW,EACX,oDAAoD,EACpD,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,EAC3G,gBAAgB,CACjB;KACA,OAAO,CACN,gBAAgB,EAChB,qFAAqF,EACrF,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,kCAAkC,EAAE,CAAC,EAC/F,WAAW,CACZ;KACA,OAAO,CAAC,QAAQ,EAAE,2DAA2D,EAAE,EAAE,EAAE,aAAa,CAAC;KACjG,OAAO,CAAC,SAAS,EAAE,uCAAuC,EAAE,EAAE,EAAE,cAAc,CAAC;KAC/E,OAAO,CAAC,gBAAgB,EAAE,0CAA0C,EAAE,EAAE,EAAE,oBAAoB,CAAC;KAC/F,OAAO,CACN,KAAK,EACL,iDAAiD,EACjD,CAAC,KAAK,EAAE,EAAE,CACR,KAAK;KACF,OAAO,CAAC,KAAK,EAAE,sCAAsC,EAAE,EAAE,EAAE,aAAa,CAAC;KACzE,OAAO,CAAC,QAAQ,EAAE,wCAAwC,EAAE,EAAE,EAAE,gBAAgB,CAAC;KACjF,OAAO,CAAC,QAAQ,EAAE,+BAA+B,EAAE,EAAE,EAAE,gBAAgB,CAAC;KACxE,aAAa,CAAC,CAAC,CAAC,EACrB,GAAG,EAAE,GAAE,CAAC,CACT;KACA,OAAO,CAAC,QAAQ,EAAE,+CAA+C,EAAE,EAAE,EAAE,aAAa,CAAC;KACrF,aAAa,CAAC,CAAC,EAAE,+BAA+B,CAAC;KACjD,IAAI,EAAE;KACN,OAAO,CAAC,OAAO,CAAC;KAChB,KAAK,EAAE,CAAC"}