spidersan 0.20.1 → 0.20.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 (310) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/bin/command-registry.d.ts +25 -0
  3. package/dist/bin/command-registry.d.ts.map +1 -0
  4. package/dist/bin/command-registry.js +29 -0
  5. package/dist/bin/command-registry.js.map +1 -0
  6. package/dist/bin/spidersan.d.ts +16 -0
  7. package/dist/bin/spidersan.d.ts.map +1 -0
  8. package/dist/bin/spidersan.js +98 -0
  9. package/dist/bin/spidersan.js.map +1 -0
  10. package/dist/commands/abandon.d.ts +8 -0
  11. package/dist/commands/abandon.d.ts.map +1 -0
  12. package/dist/commands/abandon.js +43 -0
  13. package/dist/commands/abandon.js.map +1 -0
  14. package/dist/commands/cleanup.d.ts +8 -0
  15. package/dist/commands/cleanup.d.ts.map +1 -0
  16. package/dist/commands/cleanup.js +50 -0
  17. package/dist/commands/cleanup.js.map +1 -0
  18. package/dist/commands/config.d.ts +15 -0
  19. package/dist/commands/config.d.ts.map +1 -0
  20. package/dist/commands/config.js +309 -0
  21. package/dist/commands/config.js.map +1 -0
  22. package/dist/commands/conflicts.d.ts +34 -0
  23. package/dist/commands/conflicts.d.ts.map +1 -0
  24. package/dist/commands/conflicts.js +773 -0
  25. package/dist/commands/conflicts.js.map +1 -0
  26. package/dist/commands/context.d.ts +8 -0
  27. package/dist/commands/context.d.ts.map +1 -0
  28. package/dist/commands/context.js +104 -0
  29. package/dist/commands/context.js.map +1 -0
  30. package/dist/commands/cross-conflicts.d.ts +17 -0
  31. package/dist/commands/cross-conflicts.d.ts.map +1 -0
  32. package/dist/commands/cross-conflicts.js +273 -0
  33. package/dist/commands/cross-conflicts.js.map +1 -0
  34. package/dist/commands/depends.d.ts +11 -0
  35. package/dist/commands/depends.d.ts.map +1 -0
  36. package/dist/commands/depends.js +63 -0
  37. package/dist/commands/depends.js.map +1 -0
  38. package/dist/commands/doctor.d.ts +30 -0
  39. package/dist/commands/doctor.d.ts.map +1 -0
  40. package/dist/commands/doctor.js +558 -0
  41. package/dist/commands/doctor.js.map +1 -0
  42. package/dist/commands/git-watch.d.ts +24 -0
  43. package/dist/commands/git-watch.d.ts.map +1 -0
  44. package/dist/commands/git-watch.js +84 -0
  45. package/dist/commands/git-watch.js.map +1 -0
  46. package/dist/commands/github-sync.d.ts +42 -0
  47. package/dist/commands/github-sync.d.ts.map +1 -0
  48. package/dist/commands/github-sync.js +191 -0
  49. package/dist/commands/github-sync.js.map +1 -0
  50. package/dist/commands/index.d.ts +25 -0
  51. package/dist/commands/index.d.ts.map +1 -0
  52. package/dist/commands/index.js +29 -0
  53. package/dist/commands/index.js.map +1 -0
  54. package/dist/commands/init.d.ts +8 -0
  55. package/dist/commands/init.d.ts.map +1 -0
  56. package/dist/commands/init.js +23 -0
  57. package/dist/commands/init.js.map +1 -0
  58. package/dist/commands/list.d.ts +3 -0
  59. package/dist/commands/list.d.ts.map +1 -0
  60. package/dist/commands/list.js +45 -0
  61. package/dist/commands/list.js.map +1 -0
  62. package/dist/commands/log.d.ts +7 -0
  63. package/dist/commands/log.d.ts.map +1 -0
  64. package/dist/commands/log.js +110 -0
  65. package/dist/commands/log.js.map +1 -0
  66. package/dist/commands/merge-order.d.ts +9 -0
  67. package/dist/commands/merge-order.d.ts.map +1 -0
  68. package/dist/commands/merge-order.js +100 -0
  69. package/dist/commands/merge-order.js.map +1 -0
  70. package/dist/commands/merged.d.ts +8 -0
  71. package/dist/commands/merged.d.ts.map +1 -0
  72. package/dist/commands/merged.js +37 -0
  73. package/dist/commands/merged.js.map +1 -0
  74. package/dist/commands/pr-check.d.ts +24 -0
  75. package/dist/commands/pr-check.d.ts.map +1 -0
  76. package/dist/commands/pr-check.js +85 -0
  77. package/dist/commands/pr-check.js.map +1 -0
  78. package/dist/commands/ready-check.d.ts +11 -0
  79. package/dist/commands/ready-check.d.ts.map +1 -0
  80. package/dist/commands/ready-check.js +150 -0
  81. package/dist/commands/ready-check.js.map +1 -0
  82. package/dist/commands/rebase-helper.d.ts +3 -0
  83. package/dist/commands/rebase-helper.d.ts.map +1 -0
  84. package/dist/commands/rebase-helper.js +52 -0
  85. package/dist/commands/rebase-helper.js.map +1 -0
  86. package/dist/commands/register.d.ts +10 -0
  87. package/dist/commands/register.d.ts.map +1 -0
  88. package/dist/commands/register.js +176 -0
  89. package/dist/commands/register.js.map +1 -0
  90. package/dist/commands/registry-sync.d.ts +9 -0
  91. package/dist/commands/registry-sync.d.ts.map +1 -0
  92. package/dist/commands/registry-sync.js +129 -0
  93. package/dist/commands/registry-sync.js.map +1 -0
  94. package/dist/commands/stale.d.ts +17 -0
  95. package/dist/commands/stale.d.ts.map +1 -0
  96. package/dist/commands/stale.js +136 -0
  97. package/dist/commands/stale.js.map +1 -0
  98. package/dist/commands/sync.d.ts +21 -0
  99. package/dist/commands/sync.d.ts.map +1 -0
  100. package/dist/commands/sync.js +78 -0
  101. package/dist/commands/sync.js.map +1 -0
  102. package/dist/commands/verify-trunk.d.ts +18 -0
  103. package/dist/commands/verify-trunk.d.ts.map +1 -0
  104. package/dist/commands/verify-trunk.js +77 -0
  105. package/dist/commands/verify-trunk.js.map +1 -0
  106. package/dist/commands/watch.d.ts +8 -0
  107. package/dist/commands/watch.d.ts.map +1 -0
  108. package/dist/commands/watch.js +509 -0
  109. package/dist/commands/watch.js.map +1 -0
  110. package/dist/index.d.ts +8 -0
  111. package/dist/index.d.ts.map +1 -0
  112. package/dist/index.js +8 -0
  113. package/dist/index.js.map +1 -0
  114. package/dist/lib/activity.d.ts +53 -0
  115. package/dist/lib/activity.d.ts.map +1 -0
  116. package/dist/lib/activity.js +271 -0
  117. package/dist/lib/activity.js.map +1 -0
  118. package/dist/lib/agent-errors.d.ts +41 -0
  119. package/dist/lib/agent-errors.d.ts.map +1 -0
  120. package/dist/lib/agent-errors.js +145 -0
  121. package/dist/lib/agent-errors.js.map +1 -0
  122. package/dist/lib/ai/context-builder.d.ts +16 -0
  123. package/dist/lib/ai/context-builder.d.ts.map +1 -0
  124. package/dist/lib/ai/context-builder.js +229 -0
  125. package/dist/lib/ai/context-builder.js.map +1 -0
  126. package/dist/lib/ai/event-handler.d.ts +21 -0
  127. package/dist/lib/ai/event-handler.d.ts.map +1 -0
  128. package/dist/lib/ai/event-handler.js +111 -0
  129. package/dist/lib/ai/event-handler.js.map +1 -0
  130. package/dist/lib/ai/index.d.ts +13 -0
  131. package/dist/lib/ai/index.d.ts.map +1 -0
  132. package/dist/lib/ai/index.js +11 -0
  133. package/dist/lib/ai/index.js.map +1 -0
  134. package/dist/lib/ai/llm-client.d.ts +37 -0
  135. package/dist/lib/ai/llm-client.d.ts.map +1 -0
  136. package/dist/lib/ai/llm-client.js +225 -0
  137. package/dist/lib/ai/llm-client.js.map +1 -0
  138. package/dist/lib/ai/reasoner.d.ts +11 -0
  139. package/dist/lib/ai/reasoner.d.ts.map +1 -0
  140. package/dist/lib/ai/reasoner.js +227 -0
  141. package/dist/lib/ai/reasoner.js.map +1 -0
  142. package/dist/lib/ai/setup.d.ts +40 -0
  143. package/dist/lib/ai/setup.d.ts.map +1 -0
  144. package/dist/lib/ai/setup.js +154 -0
  145. package/dist/lib/ai/setup.js.map +1 -0
  146. package/dist/lib/ai/types.d.ts +135 -0
  147. package/dist/lib/ai/types.d.ts.map +1 -0
  148. package/dist/lib/ai/types.js +42 -0
  149. package/dist/lib/ai/types.js.map +1 -0
  150. package/dist/lib/ast.d.ts +44 -0
  151. package/dist/lib/ast.d.ts.map +1 -0
  152. package/dist/lib/ast.js +160 -0
  153. package/dist/lib/ast.js.map +1 -0
  154. package/dist/lib/carries.d.ts +22 -0
  155. package/dist/lib/carries.d.ts.map +1 -0
  156. package/dist/lib/carries.js +56 -0
  157. package/dist/lib/carries.js.map +1 -0
  158. package/dist/lib/colony-subscriber.d.ts +56 -0
  159. package/dist/lib/colony-subscriber.d.ts.map +1 -0
  160. package/dist/lib/colony-subscriber.js +265 -0
  161. package/dist/lib/colony-subscriber.js.map +1 -0
  162. package/dist/lib/config.d.ts +62 -0
  163. package/dist/lib/config.d.ts.map +1 -0
  164. package/dist/lib/config.js +235 -0
  165. package/dist/lib/config.js.map +1 -0
  166. package/dist/lib/conflict-analyzer.d.ts +33 -0
  167. package/dist/lib/conflict-analyzer.d.ts.map +1 -0
  168. package/dist/lib/conflict-analyzer.js +114 -0
  169. package/dist/lib/conflict-analyzer.js.map +1 -0
  170. package/dist/lib/conflict-renderer.d.ts +7 -0
  171. package/dist/lib/conflict-renderer.d.ts.map +1 -0
  172. package/dist/lib/conflict-renderer.js +145 -0
  173. package/dist/lib/conflict-renderer.js.map +1 -0
  174. package/dist/lib/conflict-tier.d.ts +20 -0
  175. package/dist/lib/conflict-tier.d.ts.map +1 -0
  176. package/dist/lib/conflict-tier.js +49 -0
  177. package/dist/lib/conflict-tier.js.map +1 -0
  178. package/dist/lib/crypto.d.ts +71 -0
  179. package/dist/lib/crypto.d.ts.map +1 -0
  180. package/dist/lib/crypto.js +176 -0
  181. package/dist/lib/crypto.js.map +1 -0
  182. package/dist/lib/ecosystem-env.d.ts +33 -0
  183. package/dist/lib/ecosystem-env.d.ts.map +1 -0
  184. package/dist/lib/ecosystem-env.js +62 -0
  185. package/dist/lib/ecosystem-env.js.map +1 -0
  186. package/dist/lib/errors.d.ts +35 -0
  187. package/dist/lib/errors.d.ts.map +1 -0
  188. package/dist/lib/errors.js +71 -0
  189. package/dist/lib/errors.js.map +1 -0
  190. package/dist/lib/git-events-subscriber.d.ts +86 -0
  191. package/dist/lib/git-events-subscriber.d.ts.map +1 -0
  192. package/dist/lib/git-events-subscriber.js +870 -0
  193. package/dist/lib/git-events-subscriber.js.map +1 -0
  194. package/dist/lib/git-merge-analyzer.d.ts +38 -0
  195. package/dist/lib/git-merge-analyzer.d.ts.map +1 -0
  196. package/dist/lib/git-merge-analyzer.js +23 -0
  197. package/dist/lib/git-merge-analyzer.js.map +1 -0
  198. package/dist/lib/git.d.ts +103 -0
  199. package/dist/lib/git.d.ts.map +1 -0
  200. package/dist/lib/git.js +670 -0
  201. package/dist/lib/git.js.map +1 -0
  202. package/dist/lib/github.d.ts +151 -0
  203. package/dist/lib/github.d.ts.map +1 -0
  204. package/dist/lib/github.js +425 -0
  205. package/dist/lib/github.js.map +1 -0
  206. package/dist/lib/graph.d.ts +38 -0
  207. package/dist/lib/graph.d.ts.map +1 -0
  208. package/dist/lib/graph.js +165 -0
  209. package/dist/lib/graph.js.map +1 -0
  210. package/dist/lib/machine.d.ts +14 -0
  211. package/dist/lib/machine.d.ts.map +1 -0
  212. package/dist/lib/machine.js +38 -0
  213. package/dist/lib/machine.js.map +1 -0
  214. package/dist/lib/notify.d.ts +68 -0
  215. package/dist/lib/notify.d.ts.map +1 -0
  216. package/dist/lib/notify.js +111 -0
  217. package/dist/lib/notify.js.map +1 -0
  218. package/dist/lib/outline.d.ts +6 -0
  219. package/dist/lib/outline.d.ts.map +1 -0
  220. package/dist/lib/outline.js +60 -0
  221. package/dist/lib/outline.js.map +1 -0
  222. package/dist/lib/push-registry.d.ts +22 -0
  223. package/dist/lib/push-registry.d.ts.map +1 -0
  224. package/dist/lib/push-registry.js +21 -0
  225. package/dist/lib/push-registry.js.map +1 -0
  226. package/dist/lib/reconcile.d.ts +100 -0
  227. package/dist/lib/reconcile.d.ts.map +1 -0
  228. package/dist/lib/reconcile.js +121 -0
  229. package/dist/lib/reconcile.js.map +1 -0
  230. package/dist/lib/regex-utils.d.ts +6 -0
  231. package/dist/lib/regex-utils.d.ts.map +1 -0
  232. package/dist/lib/regex-utils.js +24 -0
  233. package/dist/lib/regex-utils.js.map +1 -0
  234. package/dist/lib/register-renderer.d.ts +10 -0
  235. package/dist/lib/register-renderer.d.ts.map +1 -0
  236. package/dist/lib/register-renderer.js +19 -0
  237. package/dist/lib/register-renderer.js.map +1 -0
  238. package/dist/lib/remote-drift.d.ts +61 -0
  239. package/dist/lib/remote-drift.d.ts.map +1 -0
  240. package/dist/lib/remote-drift.js +227 -0
  241. package/dist/lib/remote-drift.js.map +1 -0
  242. package/dist/lib/security.d.ts +72 -0
  243. package/dist/lib/security.d.ts.map +1 -0
  244. package/dist/lib/security.js +180 -0
  245. package/dist/lib/security.js.map +1 -0
  246. package/dist/lib/semantic-analysis.d.ts +31 -0
  247. package/dist/lib/semantic-analysis.d.ts.map +1 -0
  248. package/dist/lib/semantic-analysis.js +120 -0
  249. package/dist/lib/semantic-analysis.js.map +1 -0
  250. package/dist/lib/supabase-credentials.d.ts +36 -0
  251. package/dist/lib/supabase-credentials.d.ts.map +1 -0
  252. package/dist/lib/supabase-credentials.js +43 -0
  253. package/dist/lib/supabase-credentials.js.map +1 -0
  254. package/dist/lib/trunk.d.ts +39 -0
  255. package/dist/lib/trunk.d.ts.map +1 -0
  256. package/dist/lib/trunk.js +116 -0
  257. package/dist/lib/trunk.js.map +1 -0
  258. package/dist/lib/update-check.d.ts +11 -0
  259. package/dist/lib/update-check.d.ts.map +1 -0
  260. package/dist/lib/update-check.js +113 -0
  261. package/dist/lib/update-check.js.map +1 -0
  262. package/dist/lib/watch-renderer.d.ts +13 -0
  263. package/dist/lib/watch-renderer.d.ts.map +1 -0
  264. package/dist/lib/watch-renderer.js +35 -0
  265. package/dist/lib/watch-renderer.js.map +1 -0
  266. package/dist/storage/adapter.d.ts +81 -0
  267. package/dist/storage/adapter.d.ts.map +1 -0
  268. package/dist/storage/adapter.js +8 -0
  269. package/dist/storage/adapter.js.map +1 -0
  270. package/dist/storage/branch-registry-store.d.ts +13 -0
  271. package/dist/storage/branch-registry-store.d.ts.map +1 -0
  272. package/dist/storage/branch-registry-store.js +2 -0
  273. package/dist/storage/branch-registry-store.js.map +1 -0
  274. package/dist/storage/factory.d.ts +6 -0
  275. package/dist/storage/factory.d.ts.map +1 -0
  276. package/dist/storage/factory.js +14 -0
  277. package/dist/storage/factory.js.map +1 -0
  278. package/dist/storage/index.d.ts +10 -0
  279. package/dist/storage/index.d.ts.map +1 -0
  280. package/dist/storage/index.js +11 -0
  281. package/dist/storage/index.js.map +1 -0
  282. package/dist/storage/json-branch-registry-store.d.ts +19 -0
  283. package/dist/storage/json-branch-registry-store.d.ts.map +1 -0
  284. package/dist/storage/json-branch-registry-store.js +138 -0
  285. package/dist/storage/json-branch-registry-store.js.map +1 -0
  286. package/dist/storage/local.d.ts +20 -0
  287. package/dist/storage/local.d.ts.map +1 -0
  288. package/dist/storage/local.js +40 -0
  289. package/dist/storage/local.js.map +1 -0
  290. package/dist/storage/memory-branch-registry-store.d.ts +16 -0
  291. package/dist/storage/memory-branch-registry-store.d.ts.map +1 -0
  292. package/dist/storage/memory-branch-registry-store.js +68 -0
  293. package/dist/storage/memory-branch-registry-store.js.map +1 -0
  294. package/dist/storage/supabase-registry-sync-client-impl.d.ts +40 -0
  295. package/dist/storage/supabase-registry-sync-client-impl.d.ts.map +1 -0
  296. package/dist/storage/supabase-registry-sync-client-impl.js +278 -0
  297. package/dist/storage/supabase-registry-sync-client-impl.js.map +1 -0
  298. package/dist/storage/supabase-registry-sync-client.d.ts +9 -0
  299. package/dist/storage/supabase-registry-sync-client.d.ts.map +1 -0
  300. package/dist/storage/supabase-registry-sync-client.js +2 -0
  301. package/dist/storage/supabase-registry-sync-client.js.map +1 -0
  302. package/dist/storage/supabase.d.ts +28 -0
  303. package/dist/storage/supabase.d.ts.map +1 -0
  304. package/dist/storage/supabase.js +56 -0
  305. package/dist/storage/supabase.js.map +1 -0
  306. package/dist/types/cloud.d.ts +102 -0
  307. package/dist/types/cloud.d.ts.map +1 -0
  308. package/dist/types/cloud.js +13 -0
  309. package/dist/types/cloud.js.map +1 -0
  310. package/package.json +1 -1
@@ -0,0 +1,176 @@
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
+ import { validateAgentId } from './security.js';
13
+ // Key storage location
14
+ const KEYS_DIR = join(homedir(), '.spidersan', 'keys');
15
+ /**
16
+ * Ensure keys directory exists
17
+ */
18
+ function ensureKeysDir() {
19
+ if (!existsSync(KEYS_DIR)) {
20
+ mkdirSync(KEYS_DIR, { recursive: true });
21
+ }
22
+ }
23
+ /**
24
+ * Get path to agent's keypair file
25
+ */
26
+ function getKeyPath(agentId) {
27
+ const safeAgentId = validateAgentId(agentId);
28
+ return join(KEYS_DIR, `${safeAgentId}.key.json`);
29
+ }
30
+ /**
31
+ * Get path to known public keys registry
32
+ */
33
+ function getPublicKeysPath() {
34
+ return join(KEYS_DIR, 'known_keys.json');
35
+ }
36
+ /**
37
+ * Generate a new keypair for an agent
38
+ */
39
+ export function generateKeyPair() {
40
+ return nacl.box.keyPair();
41
+ }
42
+ /**
43
+ * Save keypair to local storage
44
+ */
45
+ export function saveKeyPair(agentId, keyPair) {
46
+ ensureKeysDir();
47
+ const serialized = {
48
+ publicKey: util.encodeBase64(keyPair.publicKey),
49
+ secretKey: util.encodeBase64(keyPair.secretKey),
50
+ };
51
+ writeFileSync(getKeyPath(agentId), JSON.stringify(serialized, null, 2), { mode: 0o600 });
52
+ }
53
+ /**
54
+ * Load keypair from local storage
55
+ */
56
+ export function loadKeyPair(agentId) {
57
+ const path = getKeyPath(agentId);
58
+ if (!existsSync(path))
59
+ return null;
60
+ try {
61
+ const data = JSON.parse(readFileSync(path, 'utf-8'));
62
+ return {
63
+ publicKey: util.decodeBase64(data.publicKey),
64
+ secretKey: util.decodeBase64(data.secretKey),
65
+ };
66
+ }
67
+ catch {
68
+ return null;
69
+ }
70
+ }
71
+ /**
72
+ * Check if agent has a keypair
73
+ */
74
+ export function hasKeyPair(agentId) {
75
+ return existsSync(getKeyPath(agentId));
76
+ }
77
+ /**
78
+ * Get public key as base64 string (for sharing)
79
+ */
80
+ export function getPublicKeyBase64(agentId) {
81
+ const keyPair = loadKeyPair(agentId);
82
+ if (!keyPair)
83
+ return null;
84
+ return util.encodeBase64(keyPair.publicKey);
85
+ }
86
+ /**
87
+ * Load known public keys registry
88
+ */
89
+ export function loadKnownKeys() {
90
+ const path = getPublicKeysPath();
91
+ if (!existsSync(path))
92
+ return {};
93
+ try {
94
+ return JSON.parse(readFileSync(path, 'utf-8'));
95
+ }
96
+ catch {
97
+ return {};
98
+ }
99
+ }
100
+ /**
101
+ * Save a public key for another agent
102
+ */
103
+ export function saveKnownKey(agentId, publicKeyBase64) {
104
+ ensureKeysDir();
105
+ const safeAgentId = validateAgentId(agentId);
106
+ const keys = loadKnownKeys();
107
+ keys[safeAgentId] = publicKeyBase64;
108
+ writeFileSync(getPublicKeysPath(), JSON.stringify(keys, null, 2), { mode: 0o600 });
109
+ }
110
+ /**
111
+ * Get public key for an agent (from known keys)
112
+ */
113
+ export function getKnownKey(agentId) {
114
+ const safeAgentId = validateAgentId(agentId);
115
+ const keys = loadKnownKeys();
116
+ const keyBase64 = keys[safeAgentId];
117
+ if (!keyBase64)
118
+ return null;
119
+ return util.decodeBase64(keyBase64);
120
+ }
121
+ /**
122
+ * Encrypt a message for a recipient
123
+ */
124
+ export function encryptMessage(message, recipientPublicKey, senderKeyPair) {
125
+ const messageBytes = util.decodeUTF8(message);
126
+ const nonce = nacl.randomBytes(nacl.box.nonceLength);
127
+ const ciphertext = nacl.box(messageBytes, nonce, recipientPublicKey, senderKeyPair.secretKey);
128
+ return {
129
+ ciphertext: util.encodeBase64(ciphertext),
130
+ nonce: util.encodeBase64(nonce),
131
+ senderPublicKey: util.encodeBase64(senderKeyPair.publicKey),
132
+ };
133
+ }
134
+ /**
135
+ * Decrypt a message from a sender
136
+ */
137
+ export function decryptMessage(encrypted, recipientKeyPair) {
138
+ try {
139
+ const ciphertext = util.decodeBase64(encrypted.ciphertext);
140
+ const nonce = util.decodeBase64(encrypted.nonce);
141
+ const senderPublicKey = util.decodeBase64(encrypted.senderPublicKey);
142
+ const decrypted = nacl.box.open(ciphertext, nonce, senderPublicKey, recipientKeyPair.secretKey);
143
+ if (!decrypted)
144
+ return null;
145
+ return util.encodeUTF8(decrypted);
146
+ }
147
+ catch {
148
+ return null;
149
+ }
150
+ }
151
+ /**
152
+ * Encrypt multiple fields for a message
153
+ */
154
+ export function encryptFields(fields, recipientPublicKey, senderKeyPair) {
155
+ const serialized = JSON.stringify(fields);
156
+ const encrypted = encryptMessage(serialized, recipientPublicKey, senderKeyPair);
157
+ return {
158
+ encrypted,
159
+ fieldNames: Object.keys(fields),
160
+ };
161
+ }
162
+ /**
163
+ * Decrypt fields from a message
164
+ */
165
+ export function decryptFields(encrypted, recipientKeyPair) {
166
+ const decrypted = decryptMessage(encrypted, recipientKeyPair);
167
+ if (!decrypted)
168
+ return null;
169
+ try {
170
+ return JSON.parse(decrypted);
171
+ }
172
+ catch {
173
+ return null;
174
+ }
175
+ }
176
+ //# 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,33 @@
1
+ /**
2
+ * Ecosystem environment resolution.
3
+ *
4
+ * The repo list scanned by `spidersan conflicts --ecosystem`. It comes from
5
+ * `--repos`, then `SPIDERSAN_ECOSYSTEM` when that holds a path list
6
+ * (colon-separated), then `conflicts.ecosystemRepos` in a config file.
7
+ * There is no built-in default: unconfigured means no repos.
8
+ *
9
+ * A boolean-looking SPIDERSAN_ECOSYSTEM value was the switch for the
10
+ * `spidersan-ecosystem` plugin, removed in 0.20.0. It is still never read as a
11
+ * path list, so `SPIDERSAN_ECOSYSTEM=0` does not scan a repo named "0".
12
+ */
13
+ import type { SpidersanConfig } from './config.js';
14
+ type Env = Record<string, string | undefined>;
15
+ export declare function isOffToken(value?: string): boolean;
16
+ export declare function isOnToken(value?: string): boolean;
17
+ export type EcosystemRepoSource = 'flag' | 'env' | 'config' | 'none';
18
+ export interface EcosystemRepoResolution {
19
+ repos: string[];
20
+ source: EcosystemRepoSource;
21
+ }
22
+ export declare const ECOSYSTEM_UNCONFIGURED_HINT: string;
23
+ /**
24
+ * Resolve the repo list for `conflicts --ecosystem`.
25
+ * Precedence: --repos flag > SPIDERSAN_ECOSYSTEM path list > config > none.
26
+ */
27
+ export declare function resolveEcosystemRepos(config: Pick<SpidersanConfig, 'conflicts'>, options?: {
28
+ reposFlag?: string;
29
+ env?: Env;
30
+ home?: string;
31
+ }): EcosystemRepoResolution;
32
+ export {};
33
+ //# sourceMappingURL=ecosystem-env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ecosystem-env.d.ts","sourceRoot":"","sources":["../../src/lib/ecosystem-env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAS9C,wBAAgB,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,wBAAgB,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAEjD;AAQD,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAErE,MAAM,WAAW,uBAAuB;IACpC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,mBAAmB,CAAC;CAC/B;AAED,eAAO,MAAM,2BAA2B,QAEgE,CAAC;AAEzG;;;GAGG;AACH,wBAAgB,qBAAqB,CACjC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,EAC1C,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,GAAG,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/D,uBAAuB,CAwBzB"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Ecosystem environment resolution.
3
+ *
4
+ * The repo list scanned by `spidersan conflicts --ecosystem`. It comes from
5
+ * `--repos`, then `SPIDERSAN_ECOSYSTEM` when that holds a path list
6
+ * (colon-separated), then `conflicts.ecosystemRepos` in a config file.
7
+ * There is no built-in default: unconfigured means no repos.
8
+ *
9
+ * A boolean-looking SPIDERSAN_ECOSYSTEM value was the switch for the
10
+ * `spidersan-ecosystem` plugin, removed in 0.20.0. It is still never read as a
11
+ * path list, so `SPIDERSAN_ECOSYSTEM=0` does not scan a repo named "0".
12
+ */
13
+ import { homedir } from 'os';
14
+ import { join } from 'path';
15
+ const OFF_TOKENS = ['0', 'false', 'no', 'off'];
16
+ const ON_TOKENS = ['1', 'true', 'yes', 'on'];
17
+ function norm(value) {
18
+ return (value ?? '').trim().toLowerCase();
19
+ }
20
+ export function isOffToken(value) {
21
+ return OFF_TOKENS.includes(norm(value));
22
+ }
23
+ export function isOnToken(value) {
24
+ return ON_TOKENS.includes(norm(value));
25
+ }
26
+ function expandHome(p, home) {
27
+ if (p === '~')
28
+ return home;
29
+ if (p.startsWith('~/'))
30
+ return join(home, p.slice(2));
31
+ return p;
32
+ }
33
+ export const ECOSYSTEM_UNCONFIGURED_HINT = 'No ecosystem repos configured. Set SPIDERSAN_ECOSYSTEM=/path/to/repo-a:/path/to/repo-b, ' +
34
+ 'add "conflicts": { "ecosystemRepos": ["/path/to/repo-a"] } to ~/.spidersanrc, or pass --repos a,b.';
35
+ /**
36
+ * Resolve the repo list for `conflicts --ecosystem`.
37
+ * Precedence: --repos flag > SPIDERSAN_ECOSYSTEM path list > config > none.
38
+ */
39
+ export function resolveEcosystemRepos(config, options = {}) {
40
+ const env = options.env ?? process.env;
41
+ const home = options.home ?? env.HOME ?? homedir();
42
+ const clean = (list) => [...new Set(list.map((r) => r.trim()).filter(Boolean).map((r) => expandHome(r, home)))];
43
+ if (options.reposFlag) {
44
+ const repos = clean(options.reposFlag.split(','));
45
+ if (repos.length > 0)
46
+ return { repos, source: 'flag' };
47
+ }
48
+ const envValue = env.SPIDERSAN_ECOSYSTEM;
49
+ if (envValue && !isOffToken(envValue) && !isOnToken(envValue)) {
50
+ const repos = clean(envValue.split(':'));
51
+ if (repos.length > 0)
52
+ return { repos, source: 'env' };
53
+ }
54
+ const fromConfig = config.conflicts?.ecosystemRepos;
55
+ if (Array.isArray(fromConfig)) {
56
+ const repos = clean(fromConfig.filter((r) => typeof r === 'string'));
57
+ if (repos.length > 0)
58
+ return { repos, source: 'config' };
59
+ }
60
+ return { repos: [], source: 'none' };
61
+ }
62
+ //# sourceMappingURL=ecosystem-env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ecosystem-env.js","sourceRoot":"","sources":["../../src/lib/ecosystem-env.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"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * git-events-subscriber
3
+ *
4
+ * Subscribes to spidersan_git_events via Supabase Realtime for low-latency
5
+ * git-change notifications, with a catch-up poll on startup/reconnect so no
6
+ * events are missed while a machine was offline.
7
+ *
8
+ * Delivery model:
9
+ * Realtime INSERT — instant fan-out (< 1s when connected)
10
+ * Catch-up query — WHERE seq > last_seen_seq on startup/reconnect
11
+ *
12
+ * Actions per event type (P1 — notify, not auto-execute):
13
+ * push → warn agent, log to activity + pending files
14
+ * pull_request → log only
15
+ * create → log only
16
+ * delete → mark registry branch abandoned, archive entry
17
+ *
18
+ * AI layer (P2): pending events will be routed through spidersan-smol/gemma4
19
+ * for ecosystem-aware severity decisions. The pending log is the handoff point.
20
+ */
21
+ /**
22
+ * The compare-API credential, preferring the vault-injected name.
23
+ *
24
+ * It cannot be stored as `GITHUB_TOKEN`: envoak's protected-namespace filter
25
+ * (`SENSITIVE_PREFIXES` in Envoak vault.ts) refuses to inject any name starting
26
+ * `GITHUB_`, so a vault secret called GITHUB_TOKEN would be granted, decrypted,
27
+ * and then dropped — leaving the daemon silently unauthenticated at 60 req/h.
28
+ * Hence the app-prefixed `spidersan/SPIDERSAN_GITHUB_TOKEN`.
29
+ *
30
+ * `GITHUB_TOKEN` stays as a fallback so a plain shell (or CI) that already
31
+ * exports it keeps working.
32
+ */
33
+ export declare function resolveGithubToken(env?: NodeJS.ProcessEnv): string | undefined;
34
+ export interface GitEvent {
35
+ id: string;
36
+ seq: number;
37
+ delivery_id: string;
38
+ repo: string;
39
+ event_type: string;
40
+ action: string | null;
41
+ ref: string | null;
42
+ ref_type: string | null;
43
+ branch: string | null;
44
+ before_sha: string | null;
45
+ after_sha: string | null;
46
+ sender_login: string | null;
47
+ received_at: string;
48
+ }
49
+ export interface GitWatchOptions {
50
+ pollIntervalMs?: number;
51
+ repoPaths?: string[];
52
+ onEvent?: (event: GitEvent) => void;
53
+ logger?: (msg: string) => void;
54
+ quiet?: boolean;
55
+ disableRealtime?: boolean;
56
+ }
57
+ export interface GitWatchHandle {
58
+ stop: () => void;
59
+ }
60
+ /**
61
+ * Build a map from "owner/repo" to local clone path(s).
62
+ * Scans provided repoPaths first; if empty, scans all registered repos
63
+ * by reading their .spidersan/registry.json locations from ~/.spidersan.
64
+ */
65
+ export declare function normalizeRemoteUrl(url: string): string;
66
+ export declare function isTreebirdRepo(repo: string): boolean;
67
+ /**
68
+ * Detect the stale-revert signature in one repo: many tracked files DELETED in
69
+ * the working tree (HEAD/index intact). This is recoverable and non-destructive
70
+ * — `git restore` brings the files back — so we only warn, loudly, with the fix.
71
+ * Returns true if an alarm fired.
72
+ */
73
+ export declare function checkWorkingTreeIntegrity(repoPath: string, log: (m: string) => void): boolean;
74
+ /**
75
+ * Start the git-events daemon in hybrid mode:
76
+ * - Supabase Realtime WebSocket for < 1s delivery (when available)
77
+ * - 5-min safety-sweep poll to catch events missed during disconnects
78
+ * Returns a handle with a stop() method.
79
+ */
80
+ export declare function startGitWatch(opts?: GitWatchOptions): Promise<GitWatchHandle>;
81
+ /**
82
+ * One-shot catch-up: fetch any missed events since last cursor, then exit.
83
+ * Useful for cron/CI environments that don't run persistent daemons.
84
+ */
85
+ export declare function catchUpOnce(opts?: GitWatchOptions): Promise<void>;
86
+ //# sourceMappingURL=git-events-subscriber.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-events-subscriber.d.ts","sourceRoot":"","sources":["../../src/lib/git-events-subscriber.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAuBH;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAC9B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACrC,MAAM,GAAG,SAAS,CAEpB;AAID,MAAM,WAAW,QAAQ;IACrB,EAAE,EAAY,MAAM,CAAC;IACrB,GAAG,EAAW,MAAM,CAAC;IACrB,WAAW,EAAG,MAAM,CAAC;IACrB,IAAI,EAAU,MAAM,CAAC;IACrB,UAAU,EAAI,MAAM,CAAC;IACrB,MAAM,EAAQ,MAAM,GAAG,IAAI,CAAC;IAC5B,GAAG,EAAW,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAM,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAQ,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAI,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAK,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAG,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;IACpC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,MAAM,IAAI,CAAC;CACpB;AA4CD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAWtD;AAMD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD;AA4CD;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAuB7F;AAirBD;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,cAAc,CAAC,CAgDvF;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAS3E"}