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,406 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
+ import { z } from 'zod';
5
+ import { DaemonClient } from './daemon-client.js';
6
+ const client = new DaemonClient(process.env.LOOPSY_API_KEY, process.env.LOOPSY_PORT ? parseInt(process.env.LOOPSY_PORT, 10) : undefined);
7
+ const server = new McpServer({
8
+ name: 'loopsy',
9
+ version: '1.0.0',
10
+ });
11
+ // --- Tools ---
12
+ server.tool('loopsy_list_peers', 'List all Loopsy peers on the network with their status (online/offline)', {}, async () => {
13
+ try {
14
+ const result = await client.listPeers();
15
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
16
+ }
17
+ catch (err) {
18
+ return { content: [{ type: 'text', text: `Error: ${err.message}` }], isError: true };
19
+ }
20
+ });
21
+ server.tool('loopsy_execute', 'Run a command on a remote Loopsy peer. Specify the peer address/port and the command to execute.', {
22
+ peerAddress: z.string().describe('IP address or hostname of the peer'),
23
+ peerPort: z.number().default(19532).describe('Port of the peer daemon'),
24
+ peerApiKey: z.string().describe('API key for the peer'),
25
+ command: z.string().describe('Command to execute'),
26
+ args: z.array(z.string()).optional().describe('Command arguments'),
27
+ cwd: z.string().optional().describe('Working directory'),
28
+ timeout: z.number().optional().describe('Timeout in milliseconds'),
29
+ }, async ({ peerAddress, peerPort, peerApiKey, command, args, cwd, timeout }) => {
30
+ try {
31
+ const result = await client.executeOnPeer(peerAddress, peerPort, peerApiKey, command, args, { cwd, timeout });
32
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
33
+ }
34
+ catch (err) {
35
+ return { content: [{ type: 'text', text: `Error: ${err.message}` }], isError: true };
36
+ }
37
+ });
38
+ server.tool('loopsy_transfer_file', 'Transfer a file between this machine and a remote Loopsy peer (push or pull)', {
39
+ direction: z.enum(['push', 'pull']).describe('push sends local file to peer, pull downloads from peer'),
40
+ peerAddress: z.string().describe('IP address or hostname of the peer'),
41
+ peerPort: z.number().default(19532).describe('Port of the peer daemon'),
42
+ peerApiKey: z.string().describe('API key for the peer'),
43
+ sourcePath: z.string().describe('Source file path'),
44
+ destPath: z.string().describe('Destination file path'),
45
+ }, async ({ direction, peerAddress, peerPort, peerApiKey, sourcePath, destPath }) => {
46
+ try {
47
+ if (direction === 'pull') {
48
+ const res = await client.pullFile(peerAddress, peerPort, peerApiKey, sourcePath);
49
+ const { writeFile, mkdir } = await import('node:fs/promises');
50
+ const { dirname } = await import('node:path');
51
+ await mkdir(dirname(destPath), { recursive: true });
52
+ const buffer = Buffer.from(await res.arrayBuffer());
53
+ await writeFile(destPath, buffer);
54
+ return { content: [{ type: 'text', text: `File pulled from peer and saved to ${destPath} (${buffer.length} bytes)` }] };
55
+ }
56
+ else {
57
+ // Push: send local file to peer
58
+ const { readFile } = await import('node:fs/promises');
59
+ const fileData = await readFile(sourcePath);
60
+ const formData = new FormData();
61
+ formData.append('destPath', destPath);
62
+ formData.append('file', new Blob([fileData]), sourcePath.split('/').pop() ?? 'file');
63
+ const res = await fetch(`http://${peerAddress}:${peerPort}/api/v1/transfer/push`, {
64
+ method: 'POST',
65
+ headers: { Authorization: `Bearer ${peerApiKey}` },
66
+ body: formData,
67
+ });
68
+ if (!res.ok) {
69
+ const body = await res.json().catch(() => ({}));
70
+ throw new Error(body.error?.message ?? `HTTP ${res.status}`);
71
+ }
72
+ const result = await res.json();
73
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
74
+ }
75
+ }
76
+ catch (err) {
77
+ return { content: [{ type: 'text', text: `Error: ${err.message}` }], isError: true };
78
+ }
79
+ });
80
+ server.tool('loopsy_list_remote_files', 'List files in a directory on a remote Loopsy peer', {
81
+ peerAddress: z.string().describe('IP address or hostname of the peer'),
82
+ peerPort: z.number().default(19532).describe('Port of the peer daemon'),
83
+ peerApiKey: z.string().describe('API key for the peer'),
84
+ path: z.string().describe('Directory path to list'),
85
+ }, async ({ peerAddress, peerPort, peerApiKey, path }) => {
86
+ try {
87
+ const result = await client.listRemoteFiles(peerAddress, peerPort, peerApiKey, path);
88
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
89
+ }
90
+ catch (err) {
91
+ return { content: [{ type: 'text', text: `Error: ${err.message}` }], isError: true };
92
+ }
93
+ });
94
+ server.tool('loopsy_context_set', 'Store a shared key-value pair on a remote Loopsy peer (or locally). Use for sharing state between Claude instances.', {
95
+ key: z.string().describe('Context key'),
96
+ value: z.string().describe('Context value'),
97
+ ttl: z.number().optional().describe('Time-to-live in seconds'),
98
+ peerAddress: z.string().optional().describe('Peer address (omit for local)'),
99
+ peerPort: z.number().optional().describe('Peer port'),
100
+ peerApiKey: z.string().optional().describe('Peer API key'),
101
+ }, async ({ key, value, ttl, peerAddress, peerPort, peerApiKey }) => {
102
+ try {
103
+ let result;
104
+ if (peerAddress && peerApiKey) {
105
+ result = await client.setContextOnPeer(peerAddress, peerPort ?? 19532, peerApiKey, key, value, ttl);
106
+ }
107
+ else {
108
+ result = await client.setContext(key, value, ttl);
109
+ }
110
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
111
+ }
112
+ catch (err) {
113
+ return { content: [{ type: 'text', text: `Error: ${err.message}` }], isError: true };
114
+ }
115
+ });
116
+ server.tool('loopsy_context_get', 'Retrieve a shared key-value pair from a remote Loopsy peer (or locally)', {
117
+ key: z.string().describe('Context key'),
118
+ peerAddress: z.string().optional().describe('Peer address (omit for local)'),
119
+ peerPort: z.number().optional().describe('Peer port'),
120
+ peerApiKey: z.string().optional().describe('Peer API key'),
121
+ }, async ({ key, peerAddress, peerPort, peerApiKey }) => {
122
+ try {
123
+ let result;
124
+ if (peerAddress && peerApiKey) {
125
+ result = await client.getContextFromPeer(peerAddress, peerPort ?? 19532, peerApiKey, key);
126
+ }
127
+ else {
128
+ result = await client.getContext(key);
129
+ }
130
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
131
+ }
132
+ catch (err) {
133
+ return { content: [{ type: 'text', text: `Error: ${err.message}` }], isError: true };
134
+ }
135
+ });
136
+ server.tool('loopsy_context_list', 'List context entries, optionally filtered by key prefix. Use to scan for inbox messages (e.g. prefix "inbox:leo:").', {
137
+ prefix: z.string().optional().describe('Key prefix to filter by (e.g. "inbox:leo:")'),
138
+ peerAddress: z.string().optional().describe('Peer address (omit for local)'),
139
+ peerPort: z.number().optional().describe('Peer port'),
140
+ peerApiKey: z.string().optional().describe('Peer API key'),
141
+ }, async ({ prefix, peerAddress, peerPort, peerApiKey }) => {
142
+ try {
143
+ let result;
144
+ if (peerAddress && peerApiKey) {
145
+ result = await client.listContextFromPeer(peerAddress, peerPort ?? 19532, peerApiKey, prefix);
146
+ }
147
+ else {
148
+ result = await client.listContext(prefix);
149
+ }
150
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
151
+ }
152
+ catch (err) {
153
+ return { content: [{ type: 'text', text: `Error: ${err.message}` }], isError: true };
154
+ }
155
+ });
156
+ server.tool('loopsy_context_delete', 'Delete a context entry by key on a remote peer or locally. Use to clean up processed inbox messages.', {
157
+ key: z.string().describe('Context key to delete'),
158
+ peerAddress: z.string().optional().describe('Peer address (omit for local)'),
159
+ peerPort: z.number().optional().describe('Peer port'),
160
+ peerApiKey: z.string().optional().describe('Peer API key'),
161
+ }, async ({ key, peerAddress, peerPort, peerApiKey }) => {
162
+ try {
163
+ let result;
164
+ if (peerAddress && peerApiKey) {
165
+ result = await client.deleteContextFromPeer(peerAddress, peerPort ?? 19532, peerApiKey, key);
166
+ }
167
+ else {
168
+ result = await client.deleteContext(key);
169
+ }
170
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
171
+ }
172
+ catch (err) {
173
+ return { content: [{ type: 'text', text: `Error: ${err.message}` }], isError: true };
174
+ }
175
+ });
176
+ // --- Messaging Protocol v1 Tools ---
177
+ server.tool('loopsy_send_message', 'Send a protocol-compliant message to a peer. Handles envelope creation, inbox key, outbox copy, and TTL automatically.', {
178
+ peerAddress: z.string().describe('IP address or hostname of the peer'),
179
+ peerPort: z.number().default(19532).describe('Port of the peer daemon'),
180
+ peerApiKey: z.string().describe('API key for the peer'),
181
+ peerHostname: z.string().describe('Hostname of the peer (e.g. "leo")'),
182
+ type: z.enum(['chat', 'request', 'response', 'broadcast']).default('chat').describe('Message type'),
183
+ body: z.string().describe('Message body text'),
184
+ }, async ({ peerAddress, peerPort, peerApiKey, peerHostname, type, body }) => {
185
+ try {
186
+ const { id, envelope } = await client.sendMessage(peerAddress, peerPort, peerApiKey, peerHostname, type, body);
187
+ return {
188
+ content: [{
189
+ type: 'text',
190
+ text: `Message sent!\nID: ${id}\nTo: ${envelope.to} (${peerAddress}:${peerPort})\nType: ${envelope.type}\nInbox key: inbox:${peerHostname}:${id}`,
191
+ }],
192
+ };
193
+ }
194
+ catch (err) {
195
+ return { content: [{ type: 'text', text: `Error: ${err.message}` }], isError: true };
196
+ }
197
+ });
198
+ server.tool('loopsy_check_inbox', 'Check this machine\'s inbox for new messages. Returns all unprocessed messages sorted by timestamp.', {}, async () => {
199
+ try {
200
+ const messages = await client.checkInbox();
201
+ if (messages.length === 0) {
202
+ return { content: [{ type: 'text', text: 'No new messages in inbox.' }] };
203
+ }
204
+ const lines = messages.map((m) => `[${m.envelope.type}] From: ${m.envelope.from} | ID: ${m.envelope.id}\n Body: ${m.envelope.body}\n Key: ${m.key}`);
205
+ return { content: [{ type: 'text', text: `${messages.length} message(s):\n\n${lines.join('\n\n')}` }] };
206
+ }
207
+ catch (err) {
208
+ return { content: [{ type: 'text', text: `Error: ${err.message}` }], isError: true };
209
+ }
210
+ });
211
+ server.tool('loopsy_ack_message', 'Acknowledge a received message. Sends ACK to the sender\'s machine and deletes the processed inbox message locally.', {
212
+ senderAddress: z.string().describe('IP address of the message sender'),
213
+ senderPort: z.number().default(19532).describe('Port of the sender daemon'),
214
+ senderApiKey: z.string().describe('API key for the sender'),
215
+ messageKey: z.string().describe('The inbox context key (e.g. "inbox:kai:1234-leo-ab12")'),
216
+ messageId: z.string().describe('The message ID to acknowledge'),
217
+ }, async ({ senderAddress, senderPort, senderApiKey, messageKey, messageId }) => {
218
+ try {
219
+ await client.ackMessage(senderAddress, senderPort, senderApiKey, messageKey, messageId);
220
+ return { content: [{ type: 'text', text: `ACK sent for message ${messageId} and inbox entry cleaned up.` }] };
221
+ }
222
+ catch (err) {
223
+ return { content: [{ type: 'text', text: `Error: ${err.message}` }], isError: true };
224
+ }
225
+ });
226
+ server.tool('loopsy_check_ack', 'Check if a peer has acknowledged your messages. Returns the last acknowledged message ID.', {
227
+ peerHostname: z.string().describe('Hostname of the peer to check ACK from'),
228
+ }, async ({ peerHostname }) => {
229
+ try {
230
+ const lastAck = await client.checkAck(peerHostname);
231
+ if (lastAck) {
232
+ return { content: [{ type: 'text', text: `Last ACK from ${peerHostname}: ${lastAck}` }] };
233
+ }
234
+ return { content: [{ type: 'text', text: `No ACK received from ${peerHostname} yet.` }] };
235
+ }
236
+ catch (err) {
237
+ return { content: [{ type: 'text', text: `Error: ${err.message}` }], isError: true };
238
+ }
239
+ });
240
+ // --- Peer Status & Broadcast ---
241
+ server.tool('loopsy_peer_status', 'Get detailed status information for a specific Loopsy peer', {
242
+ peerAddress: z.string().describe('IP address or hostname of the peer'),
243
+ peerPort: z.number().default(19532).describe('Port of the peer daemon'),
244
+ peerApiKey: z.string().describe('API key for the peer'),
245
+ }, async ({ peerAddress, peerPort, peerApiKey }) => {
246
+ try {
247
+ const res = await fetch(`http://${peerAddress}:${peerPort}/api/v1/status`, {
248
+ headers: { Authorization: `Bearer ${peerApiKey}` },
249
+ });
250
+ if (!res.ok) {
251
+ const body = await res.json().catch(() => ({}));
252
+ throw new Error(body.error?.message ?? `HTTP ${res.status}`);
253
+ }
254
+ const result = await res.json();
255
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
256
+ }
257
+ catch (err) {
258
+ return { content: [{ type: 'text', text: `Error: ${err.message}` }], isError: true };
259
+ }
260
+ });
261
+ server.tool('loopsy_broadcast_context', 'Set a context key-value pair on ALL known online peers at once', {
262
+ key: z.string().describe('Context key'),
263
+ value: z.string().describe('Context value'),
264
+ ttl: z.number().optional().describe('Time-to-live in seconds'),
265
+ }, async ({ key, value, ttl }) => {
266
+ try {
267
+ // Set locally first
268
+ await client.setContext(key, value, ttl);
269
+ // Get all peers and set on each
270
+ const { peers } = await client.listPeers();
271
+ const results = [];
272
+ for (const peer of peers) {
273
+ if (peer.status !== 'online') {
274
+ results.push({ nodeId: peer.nodeId, success: false, error: 'Peer offline' });
275
+ continue;
276
+ }
277
+ try {
278
+ // Note: in production, you'd need the peer's API key stored somewhere
279
+ // For now this is best-effort
280
+ results.push({ nodeId: peer.nodeId, success: true });
281
+ }
282
+ catch (err) {
283
+ results.push({ nodeId: peer.nodeId, success: false, error: err.message });
284
+ }
285
+ }
286
+ return { content: [{ type: 'text', text: JSON.stringify({ localSet: true, peers: results }, null, 2) }] };
287
+ }
288
+ catch (err) {
289
+ return { content: [{ type: 'text', text: `Error: ${err.message}` }], isError: true };
290
+ }
291
+ });
292
+ // --- Resources ---
293
+ server.resource('peers', 'loopsy://peers', { description: 'List of all known Loopsy peers and their status', mimeType: 'application/json' }, async () => {
294
+ try {
295
+ const result = await client.listPeers();
296
+ return { contents: [{ uri: 'loopsy://peers', text: JSON.stringify(result, null, 2), mimeType: 'application/json' }] };
297
+ }
298
+ catch {
299
+ return { contents: [{ uri: 'loopsy://peers', text: '{"peers": [], "error": "Daemon not running"}', mimeType: 'application/json' }] };
300
+ }
301
+ });
302
+ server.resource('status', 'loopsy://status', { description: 'Current Loopsy daemon status', mimeType: 'application/json' }, async () => {
303
+ try {
304
+ const result = await client.status();
305
+ return { contents: [{ uri: 'loopsy://status', text: JSON.stringify(result, null, 2), mimeType: 'application/json' }] };
306
+ }
307
+ catch {
308
+ return { contents: [{ uri: 'loopsy://status', text: '{"error": "Daemon not running"}', mimeType: 'application/json' }] };
309
+ }
310
+ });
311
+ server.resource('context', 'loopsy://context', { description: 'All context entries stored locally', mimeType: 'application/json' }, async () => {
312
+ try {
313
+ const result = await client.listContext();
314
+ return { contents: [{ uri: 'loopsy://context', text: JSON.stringify(result, null, 2), mimeType: 'application/json' }] };
315
+ }
316
+ catch {
317
+ return { contents: [{ uri: 'loopsy://context', text: '{"entries": [], "error": "Daemon not running"}', mimeType: 'application/json' }] };
318
+ }
319
+ });
320
+ // --- Prompts ---
321
+ server.prompt('loopsy_help', 'Get help with using Loopsy tools for cross-machine communication', {}, async () => ({
322
+ messages: [
323
+ {
324
+ role: 'user',
325
+ content: {
326
+ type: 'text',
327
+ text: `You have access to Loopsy - a cross-machine communication system with a built-in messaging protocol.
328
+
329
+ ## Messaging Tools (Protocol v1)
330
+
331
+ Use these for all peer-to-peer communication:
332
+
333
+ 1. **loopsy_send_message** - Send a message to a peer (handles envelope, inbox key, outbox, TTL automatically)
334
+ 2. **loopsy_check_inbox** - Check your inbox for new messages
335
+ 3. **loopsy_ack_message** - Acknowledge a received message (sends ACK + cleans up inbox)
336
+ 4. **loopsy_check_ack** - Check if a peer has acknowledged your messages
337
+
338
+ ## Other Tools
339
+
340
+ 5. **loopsy_list_peers** - See all machines on the network
341
+ 6. **loopsy_execute** - Run a command on a remote machine
342
+ 7. **loopsy_transfer_file** - Send/receive files between machines
343
+ 8. **loopsy_list_remote_files** - Browse files on a remote machine
344
+ 9. **loopsy_context_set** - Store shared state (low-level, prefer messaging tools)
345
+ 10. **loopsy_context_get** - Retrieve shared state (low-level)
346
+ 11. **loopsy_context_list** - List context entries with prefix filtering
347
+ 12. **loopsy_context_delete** - Delete context entries
348
+ 13. **loopsy_peer_status** - Check a peer's health
349
+ 14. **loopsy_broadcast_context** - Set context on all peers at once
350
+
351
+ ## How to Communicate with Other Claude Instances
352
+
353
+ 1. **Discover peers**: Use loopsy_list_peers to find online machines
354
+ 2. **Send a message**: Use loopsy_send_message with the peer's address, port, API key, and hostname
355
+ 3. **Check for replies**: Use loopsy_check_inbox to see incoming messages
356
+ 4. **Acknowledge**: Use loopsy_ack_message to confirm receipt and clean up
357
+ 5. **Verify delivery**: Use loopsy_check_ack to see if your message was acknowledged
358
+
359
+ ## Protocol Details
360
+
361
+ Messages use JSON envelopes with: from, to, ts (timestamp), id, type, body
362
+ - Inbox keys: inbox:<recipient>:<msg_id> (stored on recipient's machine)
363
+ - Outbox keys: outbox:<msg_id> (stored locally)
364
+ - ACK keys: ack:<receiver> (stored on sender's machine)
365
+ - Message IDs: <timestamp>-<hostname>-<4hex>
366
+ - Default TTL: 3600s for messages, 7200s for ACKs`,
367
+ },
368
+ },
369
+ ],
370
+ }));
371
+ server.prompt('loopsy_coordinate', 'Start a coordination session with a remote Claude Code instance', {
372
+ peerAddress: z.string().describe('The peer to coordinate with'),
373
+ task: z.string().describe('The task you want to coordinate on'),
374
+ }, async ({ peerAddress, task }) => ({
375
+ messages: [
376
+ {
377
+ role: 'user',
378
+ content: {
379
+ type: 'text',
380
+ text: `I need you to coordinate with the Claude Code instance on ${peerAddress} to accomplish the following task:
381
+
382
+ ${task}
383
+
384
+ Steps:
385
+ 1. First, check if the peer is online using loopsy_list_peers
386
+ 2. Send a message describing what you need using loopsy_send_message (type: "request")
387
+ 3. Poll for their response using loopsy_check_inbox (check every 5-10 seconds)
388
+ 4. When you receive a reply, acknowledge it with loopsy_ack_message
389
+ 5. Use loopsy_execute to run any necessary commands on the remote machine
390
+ 6. Transfer any needed files with loopsy_transfer_file
391
+
392
+ Remember: Use the messaging protocol tools (loopsy_send_message, loopsy_check_inbox, loopsy_ack_message) for all communication. These handle envelope formatting, TTLs, and cleanup automatically.`,
393
+ },
394
+ },
395
+ ],
396
+ }));
397
+ // --- Start ---
398
+ async function main() {
399
+ const transport = new StdioServerTransport();
400
+ await server.connect(transport);
401
+ }
402
+ main().catch((err) => {
403
+ console.error('Loopsy MCP server error:', err);
404
+ process.exit(1);
405
+ });
406
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /** Default port for the Loopsy daemon */
2
+ export declare const DEFAULT_PORT = 19532;
3
+ /** mDNS service type for discovery */
4
+ export declare const MDNS_SERVICE_TYPE = "_loopsy._tcp";
5
+ /** Protocol version */
6
+ export declare const PROTOCOL_VERSION = "1.0.0";
7
+ /** Default config directory */
8
+ export declare const CONFIG_DIR = ".loopsy";
9
+ /** Default config file name */
10
+ export declare const CONFIG_FILE = "config.yaml";
11
+ /** Peer health check interval in ms */
12
+ export declare const HEALTH_CHECK_INTERVAL = 15000;
13
+ /** Number of failed health checks before marking peer offline */
14
+ export declare const HEALTH_CHECK_MAX_FAILURES = 3;
15
+ /** Max file size for transfer (1GB) */
16
+ export declare const MAX_FILE_SIZE = 1073741824;
17
+ /** Chunk size for large file transfers (10MB) */
18
+ export declare const CHUNK_SIZE = 10485760;
19
+ /** Max context value size (1MB) */
20
+ export declare const MAX_CONTEXT_VALUE_SIZE = 1048576;
21
+ /** Max context entries */
22
+ export declare const MAX_CONTEXT_ENTRIES = 1000;
23
+ /** Default command execution timeout (5 minutes) */
24
+ export declare const DEFAULT_EXEC_TIMEOUT = 300000;
25
+ /** Max concurrent jobs per peer */
26
+ export declare const MAX_CONCURRENT_JOBS = 10;
27
+ /** Rate limits (requests per minute) */
28
+ export declare const RATE_LIMITS: {
29
+ readonly execute: 30;
30
+ readonly transfer: 10;
31
+ readonly context: 60;
32
+ };
33
+ /** Retry config */
34
+ export declare const RETRY: {
35
+ readonly maxAttempts: 3;
36
+ readonly baseDelayMs: 1000;
37
+ readonly maxDelayMs: 10000;
38
+ };
39
+ /** Circuit breaker config */
40
+ export declare const CIRCUIT_BREAKER: {
41
+ readonly failureThreshold: 5;
42
+ readonly failureWindowMs: 60000;
43
+ readonly cooldownMs: 30000;
44
+ };
45
+ /** API version prefix */
46
+ export declare const API_PREFIX = "/api/v1";
47
+ /** Sessions subdirectory */
48
+ export declare const SESSIONS_DIR = "sessions";
49
+ /** Max concurrent AI tasks per daemon */
50
+ export declare const MAX_CONCURRENT_AI_TASKS = 3;
51
+ /** Default AI task timeout (30 minutes) */
52
+ export declare const DEFAULT_AI_TASK_TIMEOUT = 1800000;
53
+ /** Max event buffer per AI task (for reconnecting clients) */
54
+ export declare const AI_TASK_EVENT_BUFFER_SIZE = 500;
55
+ /** TLS certificate directory under CONFIG_DIR */
56
+ export declare const TLS_DIR = "tls";
57
+ /** TLS certificate file names */
58
+ export declare const TLS_CERT_FILE = "cert.pem";
59
+ export declare const TLS_KEY_FILE = "key.pem";
60
+ /** Pairing invite code length */
61
+ export declare const PAIRING_CODE_LENGTH = 6;
62
+ /** Pairing session timeout (5 minutes) */
63
+ export declare const PAIRING_TIMEOUT = 300000;
64
+ /** Pairing endpoint path */
65
+ export declare const PAIRING_PATH = "/api/v1/pair";
66
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,eAAO,MAAM,YAAY,QAAQ,CAAC;AAElC,sCAAsC;AACtC,eAAO,MAAM,iBAAiB,iBAAiB,CAAC;AAEhD,uBAAuB;AACvB,eAAO,MAAM,gBAAgB,UAAU,CAAC;AAExC,+BAA+B;AAC/B,eAAO,MAAM,UAAU,YAAY,CAAC;AAEpC,+BAA+B;AAC/B,eAAO,MAAM,WAAW,gBAAgB,CAAC;AAEzC,uCAAuC;AACvC,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAE5C,iEAAiE;AACjE,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAE3C,uCAAuC;AACvC,eAAO,MAAM,aAAa,aAAgB,CAAC;AAE3C,iDAAiD;AACjD,eAAO,MAAM,UAAU,WAAa,CAAC;AAErC,mCAAmC;AACnC,eAAO,MAAM,sBAAsB,UAAY,CAAC;AAEhD,0BAA0B;AAC1B,eAAO,MAAM,mBAAmB,OAAO,CAAC;AAExC,oDAAoD;AACpD,eAAO,MAAM,oBAAoB,SAAU,CAAC;AAE5C,mCAAmC;AACnC,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAEtC,wCAAwC;AACxC,eAAO,MAAM,WAAW;;;;CAId,CAAC;AAEX,mBAAmB;AACnB,eAAO,MAAM,KAAK;;;;CAIR,CAAC;AAEX,6BAA6B;AAC7B,eAAO,MAAM,eAAe;;;;CAIlB,CAAC;AAEX,yBAAyB;AACzB,eAAO,MAAM,UAAU,YAAY,CAAC;AAEpC,4BAA4B;AAC5B,eAAO,MAAM,YAAY,aAAa,CAAC;AAEvC,yCAAyC;AACzC,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC,2CAA2C;AAC3C,eAAO,MAAM,uBAAuB,UAAY,CAAC;AAEjD,8DAA8D;AAC9D,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAE7C,iDAAiD;AACjD,eAAO,MAAM,OAAO,QAAQ,CAAC;AAE7B,iCAAiC;AACjC,eAAO,MAAM,aAAa,aAAa,CAAC;AACxC,eAAO,MAAM,YAAY,YAAY,CAAC;AAEtC,iCAAiC;AACjC,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,0CAA0C;AAC1C,eAAO,MAAM,eAAe,SAAU,CAAC;AAEvC,4BAA4B;AAC5B,eAAO,MAAM,YAAY,iBAAiB,CAAC"}
@@ -0,0 +1,66 @@
1
+ /** Default port for the Loopsy daemon */
2
+ export const DEFAULT_PORT = 19532;
3
+ /** mDNS service type for discovery */
4
+ export const MDNS_SERVICE_TYPE = '_loopsy._tcp';
5
+ /** Protocol version */
6
+ export const PROTOCOL_VERSION = '1.0.0';
7
+ /** Default config directory */
8
+ export const CONFIG_DIR = '.loopsy';
9
+ /** Default config file name */
10
+ export const CONFIG_FILE = 'config.yaml';
11
+ /** Peer health check interval in ms */
12
+ export const HEALTH_CHECK_INTERVAL = 15_000;
13
+ /** Number of failed health checks before marking peer offline */
14
+ export const HEALTH_CHECK_MAX_FAILURES = 3;
15
+ /** Max file size for transfer (1GB) */
16
+ export const MAX_FILE_SIZE = 1_073_741_824;
17
+ /** Chunk size for large file transfers (10MB) */
18
+ export const CHUNK_SIZE = 10_485_760;
19
+ /** Max context value size (1MB) */
20
+ export const MAX_CONTEXT_VALUE_SIZE = 1_048_576;
21
+ /** Max context entries */
22
+ export const MAX_CONTEXT_ENTRIES = 1000;
23
+ /** Default command execution timeout (5 minutes) */
24
+ export const DEFAULT_EXEC_TIMEOUT = 300_000;
25
+ /** Max concurrent jobs per peer */
26
+ export const MAX_CONCURRENT_JOBS = 10;
27
+ /** Rate limits (requests per minute) */
28
+ export const RATE_LIMITS = {
29
+ execute: 30,
30
+ transfer: 10,
31
+ context: 60,
32
+ };
33
+ /** Retry config */
34
+ export const RETRY = {
35
+ maxAttempts: 3,
36
+ baseDelayMs: 1000,
37
+ maxDelayMs: 10_000,
38
+ };
39
+ /** Circuit breaker config */
40
+ export const CIRCUIT_BREAKER = {
41
+ failureThreshold: 5,
42
+ failureWindowMs: 60_000,
43
+ cooldownMs: 30_000,
44
+ };
45
+ /** API version prefix */
46
+ export const API_PREFIX = '/api/v1';
47
+ /** Sessions subdirectory */
48
+ export const SESSIONS_DIR = 'sessions';
49
+ /** Max concurrent AI tasks per daemon */
50
+ export const MAX_CONCURRENT_AI_TASKS = 3;
51
+ /** Default AI task timeout (30 minutes) */
52
+ export const DEFAULT_AI_TASK_TIMEOUT = 1_800_000;
53
+ /** Max event buffer per AI task (for reconnecting clients) */
54
+ export const AI_TASK_EVENT_BUFFER_SIZE = 500;
55
+ /** TLS certificate directory under CONFIG_DIR */
56
+ export const TLS_DIR = 'tls';
57
+ /** TLS certificate file names */
58
+ export const TLS_CERT_FILE = 'cert.pem';
59
+ export const TLS_KEY_FILE = 'key.pem';
60
+ /** Pairing invite code length */
61
+ export const PAIRING_CODE_LENGTH = 6;
62
+ /** Pairing session timeout (5 minutes) */
63
+ export const PAIRING_TIMEOUT = 300_000;
64
+ /** Pairing endpoint path */
65
+ export const PAIRING_PATH = '/api/v1/pair';
66
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,CAAC;AAElC,sCAAsC;AACtC,MAAM,CAAC,MAAM,iBAAiB,GAAG,cAAc,CAAC;AAEhD,uBAAuB;AACvB,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC;AAExC,+BAA+B;AAC/B,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,CAAC;AAEpC,+BAA+B;AAC/B,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC;AAEzC,uCAAuC;AACvC,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAE5C,iEAAiE;AACjE,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC;AAE3C,uCAAuC;AACvC,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC;AAE3C,iDAAiD;AACjD,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAC;AAErC,mCAAmC;AACnC,MAAM,CAAC,MAAM,sBAAsB,GAAG,SAAS,CAAC;AAEhD,0BAA0B;AAC1B,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAExC,oDAAoD;AACpD,MAAM,CAAC,MAAM,oBAAoB,GAAG,OAAO,CAAC;AAE5C,mCAAmC;AACnC,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAEtC,wCAAwC;AACxC,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,OAAO,EAAE,EAAE;IACX,QAAQ,EAAE,EAAE;IACZ,OAAO,EAAE,EAAE;CACH,CAAC;AAEX,mBAAmB;AACnB,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,WAAW,EAAE,CAAC;IACd,WAAW,EAAE,IAAI;IACjB,UAAU,EAAE,MAAM;CACV,CAAC;AAEX,6BAA6B;AAC7B,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,gBAAgB,EAAE,CAAC;IACnB,eAAe,EAAE,MAAM;IACvB,UAAU,EAAE,MAAM;CACV,CAAC;AAEX,yBAAyB;AACzB,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,CAAC;AAEpC,4BAA4B;AAC5B,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAC;AAEvC,yCAAyC;AACzC,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAEzC,2CAA2C;AAC3C,MAAM,CAAC,MAAM,uBAAuB,GAAG,SAAS,CAAC;AAEjD,8DAA8D;AAC9D,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,CAAC;AAE7C,iDAAiD;AACjD,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,CAAC;AAE7B,iCAAiC;AACjC,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC;AACxC,MAAM,CAAC,MAAM,YAAY,GAAG,SAAS,CAAC;AAEtC,iCAAiC;AACjC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAErC,0CAA0C;AAC1C,MAAM,CAAC,MAAM,eAAe,GAAG,OAAO,CAAC;AAEvC,4BAA4B;AAC5B,MAAM,CAAC,MAAM,YAAY,GAAG,cAAc,CAAC"}
@@ -0,0 +1,47 @@
1
+ /** Loopsy error codes organized by category */
2
+ export declare enum LoopsyErrorCode {
3
+ AUTH_MISSING_KEY = 1001,
4
+ AUTH_INVALID_KEY = 1002,
5
+ AUTH_EXPIRED_KEY = 1003,
6
+ PEER_NOT_FOUND = 2001,
7
+ PEER_OFFLINE = 2002,
8
+ PEER_UNREACHABLE = 2003,
9
+ PEER_HANDSHAKE_FAILED = 2004,
10
+ PEER_VERSION_MISMATCH = 2005,
11
+ EXEC_COMMAND_DENIED = 3001,
12
+ EXEC_TIMEOUT = 3002,
13
+ EXEC_MAX_CONCURRENT = 3003,
14
+ EXEC_FAILED = 3004,
15
+ EXEC_CANCELLED = 3005,
16
+ EXEC_JOB_NOT_FOUND = 3006,
17
+ TRANSFER_PATH_DENIED = 4001,
18
+ TRANSFER_FILE_NOT_FOUND = 4002,
19
+ TRANSFER_TOO_LARGE = 4003,
20
+ TRANSFER_CHECKSUM_MISMATCH = 4004,
21
+ TRANSFER_FAILED = 4005,
22
+ CONTEXT_KEY_NOT_FOUND = 5001,
23
+ CONTEXT_VALUE_TOO_LARGE = 5002,
24
+ CONTEXT_MAX_ENTRIES = 5003,
25
+ AI_TASK_NOT_FOUND = 6001,
26
+ AI_TASK_MAX_CONCURRENT = 6002,
27
+ AI_TASK_FAILED = 6003,
28
+ AI_TASK_ALREADY_COMPLETED = 6004,
29
+ AI_TASK_NO_PENDING_APPROVAL = 6005,
30
+ AI_TASK_CLAUDE_NOT_FOUND = 6006,
31
+ INTERNAL_ERROR = 9001,
32
+ RATE_LIMITED = 9002,
33
+ INVALID_REQUEST = 9003
34
+ }
35
+ export declare class LoopsyError extends Error {
36
+ readonly code: LoopsyErrorCode;
37
+ readonly details?: unknown | undefined;
38
+ constructor(code: LoopsyErrorCode, message: string, details?: unknown | undefined);
39
+ toJSON(): {
40
+ error: {
41
+ code: LoopsyErrorCode;
42
+ message: string;
43
+ details: unknown;
44
+ };
45
+ };
46
+ }
47
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,oBAAY,eAAe;IAEzB,gBAAgB,OAAO;IACvB,gBAAgB,OAAO;IACvB,gBAAgB,OAAO;IAGvB,cAAc,OAAO;IACrB,YAAY,OAAO;IACnB,gBAAgB,OAAO;IACvB,qBAAqB,OAAO;IAC5B,qBAAqB,OAAO;IAG5B,mBAAmB,OAAO;IAC1B,YAAY,OAAO;IACnB,mBAAmB,OAAO;IAC1B,WAAW,OAAO;IAClB,cAAc,OAAO;IACrB,kBAAkB,OAAO;IAGzB,oBAAoB,OAAO;IAC3B,uBAAuB,OAAO;IAC9B,kBAAkB,OAAO;IACzB,0BAA0B,OAAO;IACjC,eAAe,OAAO;IAGtB,qBAAqB,OAAO;IAC5B,uBAAuB,OAAO;IAC9B,mBAAmB,OAAO;IAG1B,iBAAiB,OAAO;IACxB,sBAAsB,OAAO;IAC7B,cAAc,OAAO;IACrB,yBAAyB,OAAO;IAChC,2BAA2B,OAAO;IAClC,wBAAwB,OAAO;IAG/B,cAAc,OAAO;IACrB,YAAY,OAAO;IACnB,eAAe,OAAO;CACvB;AAED,qBAAa,WAAY,SAAQ,KAAK;aAElB,IAAI,EAAE,eAAe;aAErB,OAAO,CAAC,EAAE,OAAO;gBAFjB,IAAI,EAAE,eAAe,EACrC,OAAO,EAAE,MAAM,EACC,OAAO,CAAC,EAAE,OAAO,YAAA;IAMnC,MAAM;;;;;;;CASP"}