spidersan 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (245) hide show
  1. package/CHANGELOG.md +91 -0
  2. package/LICENSE +21 -0
  3. package/LICENSE.md +85 -0
  4. package/README.md +217 -0
  5. package/dist/bin/spidersan.d.ts +9 -0
  6. package/dist/bin/spidersan.d.ts.map +1 -0
  7. package/dist/bin/spidersan.js +152 -0
  8. package/dist/bin/spidersan.js.map +1 -0
  9. package/dist/commands/abandon.d.ts +8 -0
  10. package/dist/commands/abandon.d.ts.map +1 -0
  11. package/dist/commands/abandon.js +49 -0
  12. package/dist/commands/abandon.js.map +1 -0
  13. package/dist/commands/activate.d.ts +9 -0
  14. package/dist/commands/activate.d.ts.map +1 -0
  15. package/dist/commands/activate.js +45 -0
  16. package/dist/commands/activate.js.map +1 -0
  17. package/dist/commands/active-windows.d.ts +16 -0
  18. package/dist/commands/active-windows.d.ts.map +1 -0
  19. package/dist/commands/active-windows.js +373 -0
  20. package/dist/commands/active-windows.js.map +1 -0
  21. package/dist/commands/audit-mark.d.ts +12 -0
  22. package/dist/commands/audit-mark.d.ts.map +1 -0
  23. package/dist/commands/audit-mark.js +204 -0
  24. package/dist/commands/audit-mark.js.map +1 -0
  25. package/dist/commands/cleanup.d.ts +8 -0
  26. package/dist/commands/cleanup.d.ts.map +1 -0
  27. package/dist/commands/cleanup.js +41 -0
  28. package/dist/commands/cleanup.js.map +1 -0
  29. package/dist/commands/close.d.ts +9 -0
  30. package/dist/commands/close.d.ts.map +1 -0
  31. package/dist/commands/close.js +129 -0
  32. package/dist/commands/close.js.map +1 -0
  33. package/dist/commands/collab-sync.d.ts +14 -0
  34. package/dist/commands/collab-sync.d.ts.map +1 -0
  35. package/dist/commands/collab-sync.js +240 -0
  36. package/dist/commands/collab-sync.js.map +1 -0
  37. package/dist/commands/collab.d.ts +6 -0
  38. package/dist/commands/collab.d.ts.map +1 -0
  39. package/dist/commands/collab.js +103 -0
  40. package/dist/commands/collab.js.map +1 -0
  41. package/dist/commands/completions.d.ts +8 -0
  42. package/dist/commands/completions.d.ts.map +1 -0
  43. package/dist/commands/completions.js +83 -0
  44. package/dist/commands/completions.js.map +1 -0
  45. package/dist/commands/conflicts.d.ts +12 -0
  46. package/dist/commands/conflicts.d.ts.map +1 -0
  47. package/dist/commands/conflicts.js +426 -0
  48. package/dist/commands/conflicts.js.map +1 -0
  49. package/dist/commands/demo.d.ts +3 -0
  50. package/dist/commands/demo.d.ts.map +1 -0
  51. package/dist/commands/demo.js +113 -0
  52. package/dist/commands/demo.js.map +1 -0
  53. package/dist/commands/depends.d.ts +8 -0
  54. package/dist/commands/depends.d.ts.map +1 -0
  55. package/dist/commands/depends.js +44 -0
  56. package/dist/commands/depends.js.map +1 -0
  57. package/dist/commands/doctor.d.ts +8 -0
  58. package/dist/commands/doctor.d.ts.map +1 -0
  59. package/dist/commands/doctor.js +249 -0
  60. package/dist/commands/doctor.js.map +1 -0
  61. package/dist/commands/inbox.d.ts +3 -0
  62. package/dist/commands/inbox.d.ts.map +1 -0
  63. package/dist/commands/inbox.js +66 -0
  64. package/dist/commands/inbox.js.map +1 -0
  65. package/dist/commands/index.d.ts +43 -0
  66. package/dist/commands/index.d.ts.map +1 -0
  67. package/dist/commands/index.js +61 -0
  68. package/dist/commands/index.js.map +1 -0
  69. package/dist/commands/init.d.ts +8 -0
  70. package/dist/commands/init.d.ts.map +1 -0
  71. package/dist/commands/init.js +23 -0
  72. package/dist/commands/init.js.map +1 -0
  73. package/dist/commands/intent-scan.d.ts +17 -0
  74. package/dist/commands/intent-scan.d.ts.map +1 -0
  75. package/dist/commands/intent-scan.js +336 -0
  76. package/dist/commands/intent-scan.js.map +1 -0
  77. package/dist/commands/key-import.d.ts +3 -0
  78. package/dist/commands/key-import.d.ts.map +1 -0
  79. package/dist/commands/key-import.js +54 -0
  80. package/dist/commands/key-import.js.map +1 -0
  81. package/dist/commands/keygen.d.ts +3 -0
  82. package/dist/commands/keygen.d.ts.map +1 -0
  83. package/dist/commands/keygen.js +53 -0
  84. package/dist/commands/keygen.js.map +1 -0
  85. package/dist/commands/keys.d.ts +3 -0
  86. package/dist/commands/keys.d.ts.map +1 -0
  87. package/dist/commands/keys.js +56 -0
  88. package/dist/commands/keys.js.map +1 -0
  89. package/dist/commands/list.d.ts +3 -0
  90. package/dist/commands/list.d.ts.map +1 -0
  91. package/dist/commands/list.js +45 -0
  92. package/dist/commands/list.js.map +1 -0
  93. package/dist/commands/lock.d.ts +11 -0
  94. package/dist/commands/lock.d.ts.map +1 -0
  95. package/dist/commands/lock.js +220 -0
  96. package/dist/commands/lock.js.map +1 -0
  97. package/dist/commands/log.d.ts +8 -0
  98. package/dist/commands/log.d.ts.map +1 -0
  99. package/dist/commands/log.js +95 -0
  100. package/dist/commands/log.js.map +1 -0
  101. package/dist/commands/mcp-health.d.ts +3 -0
  102. package/dist/commands/mcp-health.d.ts.map +1 -0
  103. package/dist/commands/mcp-health.js +305 -0
  104. package/dist/commands/mcp-health.js.map +1 -0
  105. package/dist/commands/mcp-restart.d.ts +3 -0
  106. package/dist/commands/mcp-restart.d.ts.map +1 -0
  107. package/dist/commands/mcp-restart.js +176 -0
  108. package/dist/commands/mcp-restart.js.map +1 -0
  109. package/dist/commands/merge-order.d.ts +9 -0
  110. package/dist/commands/merge-order.d.ts.map +1 -0
  111. package/dist/commands/merge-order.js +138 -0
  112. package/dist/commands/merge-order.js.map +1 -0
  113. package/dist/commands/merged.d.ts +8 -0
  114. package/dist/commands/merged.d.ts.map +1 -0
  115. package/dist/commands/merged.js +39 -0
  116. package/dist/commands/merged.js.map +1 -0
  117. package/dist/commands/msg-read.d.ts +3 -0
  118. package/dist/commands/msg-read.d.ts.map +1 -0
  119. package/dist/commands/msg-read.js +70 -0
  120. package/dist/commands/msg-read.js.map +1 -0
  121. package/dist/commands/pulse.d.ts +9 -0
  122. package/dist/commands/pulse.d.ts.map +1 -0
  123. package/dist/commands/pulse.js +232 -0
  124. package/dist/commands/pulse.js.map +1 -0
  125. package/dist/commands/radar.d.ts +3 -0
  126. package/dist/commands/radar.d.ts.map +1 -0
  127. package/dist/commands/radar.js +147 -0
  128. package/dist/commands/radar.js.map +1 -0
  129. package/dist/commands/ready-check.d.ts +9 -0
  130. package/dist/commands/ready-check.d.ts.map +1 -0
  131. package/dist/commands/ready-check.js +156 -0
  132. package/dist/commands/ready-check.js.map +1 -0
  133. package/dist/commands/register.d.ts +3 -0
  134. package/dist/commands/register.d.ts.map +1 -0
  135. package/dist/commands/register.js +124 -0
  136. package/dist/commands/register.js.map +1 -0
  137. package/dist/commands/send.d.ts +3 -0
  138. package/dist/commands/send.d.ts.map +1 -0
  139. package/dist/commands/send.js +134 -0
  140. package/dist/commands/send.js.map +1 -0
  141. package/dist/commands/stale.d.ts +8 -0
  142. package/dist/commands/stale.d.ts.map +1 -0
  143. package/dist/commands/stale.js +38 -0
  144. package/dist/commands/stale.js.map +1 -0
  145. package/dist/commands/status.d.ts +9 -0
  146. package/dist/commands/status.d.ts.map +1 -0
  147. package/dist/commands/status.js +41 -0
  148. package/dist/commands/status.js.map +1 -0
  149. package/dist/commands/sync-all.d.ts +9 -0
  150. package/dist/commands/sync-all.d.ts.map +1 -0
  151. package/dist/commands/sync-all.js +180 -0
  152. package/dist/commands/sync-all.js.map +1 -0
  153. package/dist/commands/sync.d.ts +8 -0
  154. package/dist/commands/sync.d.ts.map +1 -0
  155. package/dist/commands/sync.js +49 -0
  156. package/dist/commands/sync.js.map +1 -0
  157. package/dist/commands/tension.d.ts +12 -0
  158. package/dist/commands/tension.d.ts.map +1 -0
  159. package/dist/commands/tension.js +242 -0
  160. package/dist/commands/tension.js.map +1 -0
  161. package/dist/commands/torrent.d.ts +9 -0
  162. package/dist/commands/torrent.d.ts.map +1 -0
  163. package/dist/commands/torrent.js +431 -0
  164. package/dist/commands/torrent.js.map +1 -0
  165. package/dist/commands/tui.d.ts +8 -0
  166. package/dist/commands/tui.d.ts.map +1 -0
  167. package/dist/commands/tui.js +15 -0
  168. package/dist/commands/tui.js.map +1 -0
  169. package/dist/commands/wake.d.ts +9 -0
  170. package/dist/commands/wake.d.ts.map +1 -0
  171. package/dist/commands/wake.js +188 -0
  172. package/dist/commands/wake.js.map +1 -0
  173. package/dist/commands/watch.d.ts +3 -0
  174. package/dist/commands/watch.d.ts.map +1 -0
  175. package/dist/commands/watch.js +245 -0
  176. package/dist/commands/watch.js.map +1 -0
  177. package/dist/commands/who-touched.d.ts +9 -0
  178. package/dist/commands/who-touched.d.ts.map +1 -0
  179. package/dist/commands/who-touched.js +186 -0
  180. package/dist/commands/who-touched.js.map +1 -0
  181. package/dist/index.d.ts +6 -0
  182. package/dist/index.d.ts.map +1 -0
  183. package/dist/index.js +6 -0
  184. package/dist/index.js.map +1 -0
  185. package/dist/lib/agent-errors.d.ts +41 -0
  186. package/dist/lib/agent-errors.d.ts.map +1 -0
  187. package/dist/lib/agent-errors.js +143 -0
  188. package/dist/lib/agent-errors.js.map +1 -0
  189. package/dist/lib/ast.d.ts +56 -0
  190. package/dist/lib/ast.d.ts.map +1 -0
  191. package/dist/lib/ast.js +134 -0
  192. package/dist/lib/ast.js.map +1 -0
  193. package/dist/lib/config.d.ts +33 -0
  194. package/dist/lib/config.d.ts.map +1 -0
  195. package/dist/lib/config.js +127 -0
  196. package/dist/lib/config.js.map +1 -0
  197. package/dist/lib/crdt.d.ts +83 -0
  198. package/dist/lib/crdt.d.ts.map +1 -0
  199. package/dist/lib/crdt.js +160 -0
  200. package/dist/lib/crdt.js.map +1 -0
  201. package/dist/lib/crypto.d.ts +71 -0
  202. package/dist/lib/crypto.d.ts.map +1 -0
  203. package/dist/lib/crypto.js +172 -0
  204. package/dist/lib/crypto.js.map +1 -0
  205. package/dist/lib/errors.d.ts +35 -0
  206. package/dist/lib/errors.d.ts.map +1 -0
  207. package/dist/lib/errors.js +71 -0
  208. package/dist/lib/errors.js.map +1 -0
  209. package/dist/lib/license.d.ts +61 -0
  210. package/dist/lib/license.d.ts.map +1 -0
  211. package/dist/lib/license.js +171 -0
  212. package/dist/lib/license.js.map +1 -0
  213. package/dist/lib/security.d.ts +53 -0
  214. package/dist/lib/security.d.ts.map +1 -0
  215. package/dist/lib/security.js +122 -0
  216. package/dist/lib/security.js.map +1 -0
  217. package/dist/lib/update-check.d.ts +11 -0
  218. package/dist/lib/update-check.d.ts.map +1 -0
  219. package/dist/lib/update-check.js +113 -0
  220. package/dist/lib/update-check.js.map +1 -0
  221. package/dist/storage/adapter.d.ts +58 -0
  222. package/dist/storage/adapter.d.ts.map +1 -0
  223. package/dist/storage/adapter.js +8 -0
  224. package/dist/storage/adapter.js.map +1 -0
  225. package/dist/storage/factory.d.ts +6 -0
  226. package/dist/storage/factory.d.ts.map +1 -0
  227. package/dist/storage/factory.js +22 -0
  228. package/dist/storage/factory.js.map +1 -0
  229. package/dist/storage/index.d.ts +5 -0
  230. package/dist/storage/index.d.ts.map +1 -0
  231. package/dist/storage/index.js +5 -0
  232. package/dist/storage/index.js.map +1 -0
  233. package/dist/storage/local.d.ts +24 -0
  234. package/dist/storage/local.d.ts.map +1 -0
  235. package/dist/storage/local.js +101 -0
  236. package/dist/storage/local.js.map +1 -0
  237. package/dist/storage/supabase.d.ts +52 -0
  238. package/dist/storage/supabase.d.ts.map +1 -0
  239. package/dist/storage/supabase.js +221 -0
  240. package/dist/storage/supabase.js.map +1 -0
  241. package/dist/tui/screen.d.ts +14 -0
  242. package/dist/tui/screen.d.ts.map +1 -0
  243. package/dist/tui/screen.js +136 -0
  244. package/dist/tui/screen.js.map +1 -0
  245. package/package.json +89 -0
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Spidersan CRDT State
3
+ *
4
+ * Decentralized symbol locking using Yjs CRDTs.
5
+ * Allows agents to claim symbols before editing, preventing conflicts.
6
+ *
7
+ * @module crdt
8
+ */
9
+ import * as Y from 'yjs';
10
+ export interface SymbolLock {
11
+ symbolId: string;
12
+ agentId: string;
13
+ astHash: string;
14
+ timestamp: number;
15
+ description?: string;
16
+ }
17
+ export interface SwarmStateOptions {
18
+ agentId: string;
19
+ onUpdate?: (update: Uint8Array) => void;
20
+ }
21
+ export declare class SwarmState {
22
+ doc: Y.Doc;
23
+ locks: Y.Map<SymbolLock>;
24
+ intents: Y.Map<string>;
25
+ agentId: string;
26
+ private onUpdate?;
27
+ constructor(options: SwarmStateOptions);
28
+ /**
29
+ * Try to acquire a lock on a symbol
30
+ * Returns true if lock acquired, false if already locked by another agent
31
+ */
32
+ acquireLock(symbolId: string, astHash: string, description?: string): boolean;
33
+ /**
34
+ * Release a lock on a symbol
35
+ */
36
+ releaseLock(symbolId: string): boolean;
37
+ /**
38
+ * Release all locks held by this agent
39
+ */
40
+ releaseAllLocks(): number;
41
+ /**
42
+ * Get lock info for a symbol
43
+ */
44
+ getLock(symbolId: string): SymbolLock | undefined;
45
+ /**
46
+ * Check if a symbol is locked by another agent
47
+ */
48
+ isLockedByOther(symbolId: string): boolean;
49
+ /**
50
+ * Get all locks held by a specific agent
51
+ */
52
+ getAgentLocks(agentId: string): SymbolLock[];
53
+ /**
54
+ * Get all active locks
55
+ */
56
+ getAllLocks(): SymbolLock[];
57
+ /**
58
+ * Set current intent for this agent
59
+ */
60
+ setIntent(intent: string): void;
61
+ /**
62
+ * Get intent for an agent
63
+ */
64
+ getIntent(agentId: string): string | undefined;
65
+ /**
66
+ * Get all agent intents
67
+ */
68
+ getAllIntents(): Map<string, string>;
69
+ /**
70
+ * Apply an update from another agent
71
+ */
72
+ applyUpdate(update: Uint8Array): void;
73
+ /**
74
+ * Get the current state as an update (for initial sync)
75
+ */
76
+ getStateAsUpdate(): Uint8Array;
77
+ /**
78
+ * Merge state from another SwarmState instance
79
+ */
80
+ mergeFrom(other: SwarmState): void;
81
+ }
82
+ export declare function createSwarmState(agentId: string, onUpdate?: (update: Uint8Array) => void): SwarmState;
83
+ //# sourceMappingURL=crdt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crdt.d.ts","sourceRoot":"","sources":["../../src/lib/crdt.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,MAAM,WAAW,UAAU;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;CAC3C;AAED,qBAAa,UAAU;IACZ,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC;IACX,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACzB,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,QAAQ,CAAC,CAA+B;gBAEpC,OAAO,EAAE,iBAAiB;IAgBtC;;;OAGG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO;IA0B7E;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAStC;;OAEG;IACH,eAAe,IAAI,MAAM;IAWzB;;OAEG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIjD;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAK1C;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE;IAU5C;;OAEG;IACH,WAAW,IAAI,UAAU,EAAE;IAM3B;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI9C;;OAEG;IACH,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAQpC;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAIrC;;OAEG;IACH,gBAAgB,IAAI,UAAU;IAI9B;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;CAIrC;AAGD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,GAAG,UAAU,CAErG"}
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Spidersan CRDT State
3
+ *
4
+ * Decentralized symbol locking using Yjs CRDTs.
5
+ * Allows agents to claim symbols before editing, preventing conflicts.
6
+ *
7
+ * @module crdt
8
+ */
9
+ import * as Y from 'yjs';
10
+ export class SwarmState {
11
+ doc;
12
+ locks;
13
+ intents; // agentId -> current intent
14
+ agentId;
15
+ onUpdate;
16
+ constructor(options) {
17
+ this.doc = new Y.Doc();
18
+ this.agentId = options.agentId;
19
+ this.onUpdate = options.onUpdate;
20
+ this.locks = this.doc.getMap('locks');
21
+ this.intents = this.doc.getMap('intents');
22
+ // Propagate updates to sync callback
23
+ this.doc.on('update', (update) => {
24
+ if (this.onUpdate) {
25
+ this.onUpdate(update);
26
+ }
27
+ });
28
+ }
29
+ /**
30
+ * Try to acquire a lock on a symbol
31
+ * Returns true if lock acquired, false if already locked by another agent
32
+ */
33
+ acquireLock(symbolId, astHash, description) {
34
+ const existingLock = this.locks.get(symbolId);
35
+ // Check if locked by another agent
36
+ if (existingLock && existingLock.agentId !== this.agentId) {
37
+ // Check if lock is stale (older than 30 minutes)
38
+ const staleThreshold = 30 * 60 * 1000;
39
+ if (Date.now() - existingLock.timestamp > staleThreshold) {
40
+ console.warn(`🕷️ Taking over stale lock on ${symbolId} from ${existingLock.agentId}`);
41
+ }
42
+ else {
43
+ return false; // Still locked by active agent
44
+ }
45
+ }
46
+ // Acquire or refresh lock
47
+ const lock = {
48
+ symbolId,
49
+ agentId: this.agentId,
50
+ astHash,
51
+ timestamp: Date.now(),
52
+ description,
53
+ };
54
+ this.locks.set(symbolId, lock);
55
+ return true;
56
+ }
57
+ /**
58
+ * Release a lock on a symbol
59
+ */
60
+ releaseLock(symbolId) {
61
+ const lock = this.locks.get(symbolId);
62
+ if (lock && lock.agentId === this.agentId) {
63
+ this.locks.delete(symbolId);
64
+ return true;
65
+ }
66
+ return false;
67
+ }
68
+ /**
69
+ * Release all locks held by this agent
70
+ */
71
+ releaseAllLocks() {
72
+ let released = 0;
73
+ this.locks.forEach((lock, symbolId) => {
74
+ if (lock.agentId === this.agentId) {
75
+ this.locks.delete(symbolId);
76
+ released++;
77
+ }
78
+ });
79
+ return released;
80
+ }
81
+ /**
82
+ * Get lock info for a symbol
83
+ */
84
+ getLock(symbolId) {
85
+ return this.locks.get(symbolId);
86
+ }
87
+ /**
88
+ * Check if a symbol is locked by another agent
89
+ */
90
+ isLockedByOther(symbolId) {
91
+ const lock = this.locks.get(symbolId);
92
+ return lock !== undefined && lock.agentId !== this.agentId;
93
+ }
94
+ /**
95
+ * Get all locks held by a specific agent
96
+ */
97
+ getAgentLocks(agentId) {
98
+ const locks = [];
99
+ this.locks.forEach((lock) => {
100
+ if (lock.agentId === agentId) {
101
+ locks.push(lock);
102
+ }
103
+ });
104
+ return locks;
105
+ }
106
+ /**
107
+ * Get all active locks
108
+ */
109
+ getAllLocks() {
110
+ const locks = [];
111
+ this.locks.forEach((lock) => locks.push(lock));
112
+ return locks;
113
+ }
114
+ /**
115
+ * Set current intent for this agent
116
+ */
117
+ setIntent(intent) {
118
+ this.intents.set(this.agentId, intent);
119
+ }
120
+ /**
121
+ * Get intent for an agent
122
+ */
123
+ getIntent(agentId) {
124
+ return this.intents.get(agentId);
125
+ }
126
+ /**
127
+ * Get all agent intents
128
+ */
129
+ getAllIntents() {
130
+ const intents = new Map();
131
+ this.intents.forEach((intent, agentId) => {
132
+ intents.set(agentId, intent);
133
+ });
134
+ return intents;
135
+ }
136
+ /**
137
+ * Apply an update from another agent
138
+ */
139
+ applyUpdate(update) {
140
+ Y.applyUpdate(this.doc, update);
141
+ }
142
+ /**
143
+ * Get the current state as an update (for initial sync)
144
+ */
145
+ getStateAsUpdate() {
146
+ return Y.encodeStateAsUpdate(this.doc);
147
+ }
148
+ /**
149
+ * Merge state from another SwarmState instance
150
+ */
151
+ mergeFrom(other) {
152
+ const update = other.getStateAsUpdate();
153
+ this.applyUpdate(update);
154
+ }
155
+ }
156
+ // Factory function for creating connected swarm states
157
+ export function createSwarmState(agentId, onUpdate) {
158
+ return new SwarmState({ agentId, onUpdate });
159
+ }
160
+ //# sourceMappingURL=crdt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crdt.js","sourceRoot":"","sources":["../../src/lib/crdt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Spider Mail Crypto Module
3
+ *
4
+ * E2E encryption for agent messaging using TweetNaCl.
5
+ * Uses X25519 for key exchange and XSalsa20-Poly1305 for encryption.
6
+ */
7
+ export interface KeyPair {
8
+ publicKey: Uint8Array;
9
+ secretKey: Uint8Array;
10
+ }
11
+ export interface SerializedKeyPair {
12
+ publicKey: string;
13
+ secretKey: string;
14
+ }
15
+ export interface EncryptedMessage {
16
+ ciphertext: string;
17
+ nonce: string;
18
+ senderPublicKey: string;
19
+ }
20
+ /**
21
+ * Generate a new keypair for an agent
22
+ */
23
+ export declare function generateKeyPair(): KeyPair;
24
+ /**
25
+ * Save keypair to local storage
26
+ */
27
+ export declare function saveKeyPair(agentId: string, keyPair: KeyPair): void;
28
+ /**
29
+ * Load keypair from local storage
30
+ */
31
+ export declare function loadKeyPair(agentId: string): KeyPair | null;
32
+ /**
33
+ * Check if agent has a keypair
34
+ */
35
+ export declare function hasKeyPair(agentId: string): boolean;
36
+ /**
37
+ * Get public key as base64 string (for sharing)
38
+ */
39
+ export declare function getPublicKeyBase64(agentId: string): string | null;
40
+ /**
41
+ * Load known public keys registry
42
+ */
43
+ export declare function loadKnownKeys(): Record<string, string>;
44
+ /**
45
+ * Save a public key for another agent
46
+ */
47
+ export declare function saveKnownKey(agentId: string, publicKeyBase64: string): void;
48
+ /**
49
+ * Get public key for an agent (from known keys)
50
+ */
51
+ export declare function getKnownKey(agentId: string): Uint8Array | null;
52
+ /**
53
+ * Encrypt a message for a recipient
54
+ */
55
+ export declare function encryptMessage(message: string, recipientPublicKey: Uint8Array, senderKeyPair: KeyPair): EncryptedMessage;
56
+ /**
57
+ * Decrypt a message from a sender
58
+ */
59
+ export declare function decryptMessage(encrypted: EncryptedMessage, recipientKeyPair: KeyPair): string | null;
60
+ /**
61
+ * Encrypt multiple fields for a message
62
+ */
63
+ export declare function encryptFields(fields: Record<string, unknown>, recipientPublicKey: Uint8Array, senderKeyPair: KeyPair): {
64
+ encrypted: EncryptedMessage;
65
+ fieldNames: string[];
66
+ };
67
+ /**
68
+ * Decrypt fields from a message
69
+ */
70
+ export declare function decryptFields(encrypted: EncryptedMessage, recipientKeyPair: KeyPair): Record<string, unknown> | null;
71
+ //# sourceMappingURL=crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/lib/crypto.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,MAAM,WAAW,OAAO;IACpB,SAAS,EAAE,UAAU,CAAC;IACtB,SAAS,EAAE,UAAU,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;CAC3B;AAyBD;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAOnE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAa3D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIjE;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQtD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI,CAK3E;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAK9D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC1B,OAAO,EAAE,MAAM,EACf,kBAAkB,EAAE,UAAU,EAC9B,aAAa,EAAE,OAAO,GACvB,gBAAgB,CAgBlB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC1B,SAAS,EAAE,gBAAgB,EAC3B,gBAAgB,EAAE,OAAO,GAC1B,MAAM,GAAG,IAAI,CAkBf;AAED;;GAEG;AACH,wBAAgB,aAAa,CACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,kBAAkB,EAAE,UAAU,EAC9B,aAAa,EAAE,OAAO,GACvB;IAAE,SAAS,EAAE,gBAAgB,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAOvD;AAED;;GAEG;AACH,wBAAgB,aAAa,CACzB,SAAS,EAAE,gBAAgB,EAC3B,gBAAgB,EAAE,OAAO,GAC1B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAQhC"}
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Spider Mail Crypto Module
3
+ *
4
+ * E2E encryption for agent messaging using TweetNaCl.
5
+ * Uses X25519 for key exchange and XSalsa20-Poly1305 for encryption.
6
+ */
7
+ import nacl from 'tweetnacl';
8
+ import util from 'tweetnacl-util';
9
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
10
+ import { join } from 'path';
11
+ import { homedir } from 'os';
12
+ // Key storage location
13
+ const KEYS_DIR = join(homedir(), '.spidersan', 'keys');
14
+ /**
15
+ * Ensure keys directory exists
16
+ */
17
+ function ensureKeysDir() {
18
+ if (!existsSync(KEYS_DIR)) {
19
+ mkdirSync(KEYS_DIR, { recursive: true });
20
+ }
21
+ }
22
+ /**
23
+ * Get path to agent's keypair file
24
+ */
25
+ function getKeyPath(agentId) {
26
+ return join(KEYS_DIR, `${agentId}.key.json`);
27
+ }
28
+ /**
29
+ * Get path to known public keys registry
30
+ */
31
+ function getPublicKeysPath() {
32
+ return join(KEYS_DIR, 'known_keys.json');
33
+ }
34
+ /**
35
+ * Generate a new keypair for an agent
36
+ */
37
+ export function generateKeyPair() {
38
+ return nacl.box.keyPair();
39
+ }
40
+ /**
41
+ * Save keypair to local storage
42
+ */
43
+ export function saveKeyPair(agentId, keyPair) {
44
+ ensureKeysDir();
45
+ const serialized = {
46
+ publicKey: util.encodeBase64(keyPair.publicKey),
47
+ secretKey: util.encodeBase64(keyPair.secretKey),
48
+ };
49
+ writeFileSync(getKeyPath(agentId), JSON.stringify(serialized, null, 2), { mode: 0o600 });
50
+ }
51
+ /**
52
+ * Load keypair from local storage
53
+ */
54
+ export function loadKeyPair(agentId) {
55
+ const path = getKeyPath(agentId);
56
+ if (!existsSync(path))
57
+ return null;
58
+ try {
59
+ const data = JSON.parse(readFileSync(path, 'utf-8'));
60
+ return {
61
+ publicKey: util.decodeBase64(data.publicKey),
62
+ secretKey: util.decodeBase64(data.secretKey),
63
+ };
64
+ }
65
+ catch {
66
+ return null;
67
+ }
68
+ }
69
+ /**
70
+ * Check if agent has a keypair
71
+ */
72
+ export function hasKeyPair(agentId) {
73
+ return existsSync(getKeyPath(agentId));
74
+ }
75
+ /**
76
+ * Get public key as base64 string (for sharing)
77
+ */
78
+ export function getPublicKeyBase64(agentId) {
79
+ const keyPair = loadKeyPair(agentId);
80
+ if (!keyPair)
81
+ return null;
82
+ return util.encodeBase64(keyPair.publicKey);
83
+ }
84
+ /**
85
+ * Load known public keys registry
86
+ */
87
+ export function loadKnownKeys() {
88
+ const path = getPublicKeysPath();
89
+ if (!existsSync(path))
90
+ return {};
91
+ try {
92
+ return JSON.parse(readFileSync(path, 'utf-8'));
93
+ }
94
+ catch {
95
+ return {};
96
+ }
97
+ }
98
+ /**
99
+ * Save a public key for another agent
100
+ */
101
+ export function saveKnownKey(agentId, publicKeyBase64) {
102
+ ensureKeysDir();
103
+ const keys = loadKnownKeys();
104
+ keys[agentId] = publicKeyBase64;
105
+ writeFileSync(getPublicKeysPath(), JSON.stringify(keys, null, 2));
106
+ }
107
+ /**
108
+ * Get public key for an agent (from known keys)
109
+ */
110
+ export function getKnownKey(agentId) {
111
+ const keys = loadKnownKeys();
112
+ const keyBase64 = keys[agentId];
113
+ if (!keyBase64)
114
+ return null;
115
+ return util.decodeBase64(keyBase64);
116
+ }
117
+ /**
118
+ * Encrypt a message for a recipient
119
+ */
120
+ export function encryptMessage(message, recipientPublicKey, senderKeyPair) {
121
+ const messageBytes = util.decodeUTF8(message);
122
+ const nonce = nacl.randomBytes(nacl.box.nonceLength);
123
+ const ciphertext = nacl.box(messageBytes, nonce, recipientPublicKey, senderKeyPair.secretKey);
124
+ return {
125
+ ciphertext: util.encodeBase64(ciphertext),
126
+ nonce: util.encodeBase64(nonce),
127
+ senderPublicKey: util.encodeBase64(senderKeyPair.publicKey),
128
+ };
129
+ }
130
+ /**
131
+ * Decrypt a message from a sender
132
+ */
133
+ export function decryptMessage(encrypted, recipientKeyPair) {
134
+ try {
135
+ const ciphertext = util.decodeBase64(encrypted.ciphertext);
136
+ const nonce = util.decodeBase64(encrypted.nonce);
137
+ const senderPublicKey = util.decodeBase64(encrypted.senderPublicKey);
138
+ const decrypted = nacl.box.open(ciphertext, nonce, senderPublicKey, recipientKeyPair.secretKey);
139
+ if (!decrypted)
140
+ return null;
141
+ return util.encodeUTF8(decrypted);
142
+ }
143
+ catch {
144
+ return null;
145
+ }
146
+ }
147
+ /**
148
+ * Encrypt multiple fields for a message
149
+ */
150
+ export function encryptFields(fields, recipientPublicKey, senderKeyPair) {
151
+ const serialized = JSON.stringify(fields);
152
+ const encrypted = encryptMessage(serialized, recipientPublicKey, senderKeyPair);
153
+ return {
154
+ encrypted,
155
+ fieldNames: Object.keys(fields),
156
+ };
157
+ }
158
+ /**
159
+ * Decrypt fields from a message
160
+ */
161
+ export function decryptFields(encrypted, recipientKeyPair) {
162
+ const decrypted = decryptMessage(encrypted, recipientKeyPair);
163
+ if (!decrypted)
164
+ return null;
165
+ try {
166
+ return JSON.parse(decrypted);
167
+ }
168
+ catch {
169
+ return null;
170
+ }
171
+ }
172
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/lib/crypto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Spidersan Error Classes
3
+ *
4
+ * Structured error types for consistent error handling.
5
+ */
6
+ export declare class SpidersanError extends Error {
7
+ readonly code: string;
8
+ constructor(message: string, code: string);
9
+ }
10
+ export declare class StorageError extends SpidersanError {
11
+ readonly operation: string;
12
+ constructor(message: string, operation: string);
13
+ }
14
+ export declare class ConfigError extends SpidersanError {
15
+ constructor(message: string);
16
+ }
17
+ export declare class GitError extends SpidersanError {
18
+ constructor(message: string);
19
+ }
20
+ export declare class LicenseError extends SpidersanError {
21
+ constructor(message: string);
22
+ }
23
+ export declare class SupabaseError extends SpidersanError {
24
+ readonly hint?: string | undefined;
25
+ constructor(message: string, hint?: string | undefined);
26
+ }
27
+ /**
28
+ * Format error for CLI output
29
+ */
30
+ export declare function formatError(error: unknown): string;
31
+ /**
32
+ * Handle CLI errors consistently
33
+ */
34
+ export declare function handleError(error: unknown, exitCode?: number): never;
35
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,qBAAa,cAAe,SAAQ,KAAK;aACQ,IAAI,EAAE,MAAM;gBAA7C,OAAO,EAAE,MAAM,EAAkB,IAAI,EAAE,MAAM;CAI5D;AAED,qBAAa,YAAa,SAAQ,cAAc;aACC,SAAS,EAAE,MAAM;gBAAlD,OAAO,EAAE,MAAM,EAAkB,SAAS,EAAE,MAAM;CAIjE;AAED,qBAAa,WAAY,SAAQ,cAAc;gBAC/B,OAAO,EAAE,MAAM;CAI9B;AAED,qBAAa,QAAS,SAAQ,cAAc;gBAC5B,OAAO,EAAE,MAAM;CAI9B;AAED,qBAAa,YAAa,SAAQ,cAAc;gBAChC,OAAO,EAAE,MAAM;CAI9B;AAED,qBAAa,aAAc,SAAQ,cAAc;aACA,IAAI,CAAC,EAAE,MAAM;gBAA9C,OAAO,EAAE,MAAM,EAAkB,IAAI,CAAC,EAAE,MAAM,YAAA;CAI7D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAYlD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,SAAI,GAAG,KAAK,CAG/D"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Spidersan Error Classes
3
+ *
4
+ * Structured error types for consistent error handling.
5
+ */
6
+ export class SpidersanError extends Error {
7
+ code;
8
+ constructor(message, code) {
9
+ super(message);
10
+ this.code = code;
11
+ this.name = 'SpidersanError';
12
+ }
13
+ }
14
+ export class StorageError extends SpidersanError {
15
+ operation;
16
+ constructor(message, operation) {
17
+ super(message, 'STORAGE_ERROR');
18
+ this.operation = operation;
19
+ this.name = 'StorageError';
20
+ }
21
+ }
22
+ export class ConfigError extends SpidersanError {
23
+ constructor(message) {
24
+ super(message, 'CONFIG_ERROR');
25
+ this.name = 'ConfigError';
26
+ }
27
+ }
28
+ export class GitError extends SpidersanError {
29
+ constructor(message) {
30
+ super(message, 'GIT_ERROR');
31
+ this.name = 'GitError';
32
+ }
33
+ }
34
+ export class LicenseError extends SpidersanError {
35
+ constructor(message) {
36
+ super(message, 'LICENSE_ERROR');
37
+ this.name = 'LicenseError';
38
+ }
39
+ }
40
+ export class SupabaseError extends SpidersanError {
41
+ hint;
42
+ constructor(message, hint) {
43
+ super(message, 'SUPABASE_ERROR');
44
+ this.hint = hint;
45
+ this.name = 'SupabaseError';
46
+ }
47
+ }
48
+ /**
49
+ * Format error for CLI output
50
+ */
51
+ export function formatError(error) {
52
+ if (error instanceof SpidersanError) {
53
+ let msg = `❌ ${error.message}`;
54
+ if (error instanceof SupabaseError && error.hint) {
55
+ msg += `\n Hint: ${error.hint}`;
56
+ }
57
+ return msg;
58
+ }
59
+ if (error instanceof Error) {
60
+ return `❌ ${error.message}`;
61
+ }
62
+ return `❌ Unknown error: ${String(error)}`;
63
+ }
64
+ /**
65
+ * Handle CLI errors consistently
66
+ */
67
+ export function handleError(error, exitCode = 1) {
68
+ console.error(formatError(error));
69
+ process.exit(exitCode);
70
+ }
71
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,OAAO,cAAe,SAAQ,KAAK;IACQ;IAA7C,YAAY,OAAe,EAAkB,IAAY;QACrD,KAAK,CAAC,OAAO,CAAC,CAAC;QAD0B,SAAI,GAAJ,IAAI,CAAQ;QAErD,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IACjC,CAAC;CACJ;AAED,MAAM,OAAO,YAAa,SAAQ,cAAc;IACC;IAA7C,YAAY,OAAe,EAAkB,SAAiB;QAC1D,KAAK,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QADS,cAAS,GAAT,SAAS,CAAQ;QAE1D,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC/B,CAAC;CACJ;AAED,MAAM,OAAO,WAAY,SAAQ,cAAc;IAC3C,YAAY,OAAe;QACvB,KAAK,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC9B,CAAC;CACJ;AAED,MAAM,OAAO,QAAS,SAAQ,cAAc;IACxC,YAAY,OAAe;QACvB,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IAC3B,CAAC;CACJ;AAED,MAAM,OAAO,YAAa,SAAQ,cAAc;IAC5C,YAAY,OAAe;QACvB,KAAK,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC/B,CAAC;CACJ;AAED,MAAM,OAAO,aAAc,SAAQ,cAAc;IACA;IAA7C,YAAY,OAAe,EAAkB,IAAa;QACtD,KAAK,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;QADQ,SAAI,GAAJ,IAAI,CAAS;QAEtD,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAChC,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAAc;IACtC,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;QAClC,IAAI,GAAG,GAAG,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;QAC/B,IAAI,KAAK,YAAY,aAAa,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YAC/C,GAAG,IAAI,cAAc,KAAK,CAAC,IAAI,EAAE,CAAC;QACtC,CAAC;QACD,OAAO,GAAG,CAAC;IACf,CAAC;IACD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QACzB,OAAO,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;IAChC,CAAC;IACD,OAAO,oBAAoB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAAc,EAAE,QAAQ,GAAG,CAAC;IACpD,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;IAClC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC3B,CAAC"}