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.
- package/CHANGELOG.md +91 -0
- package/LICENSE +21 -0
- package/LICENSE.md +85 -0
- package/README.md +217 -0
- package/dist/bin/spidersan.d.ts +9 -0
- package/dist/bin/spidersan.d.ts.map +1 -0
- package/dist/bin/spidersan.js +152 -0
- package/dist/bin/spidersan.js.map +1 -0
- package/dist/commands/abandon.d.ts +8 -0
- package/dist/commands/abandon.d.ts.map +1 -0
- package/dist/commands/abandon.js +49 -0
- package/dist/commands/abandon.js.map +1 -0
- package/dist/commands/activate.d.ts +9 -0
- package/dist/commands/activate.d.ts.map +1 -0
- package/dist/commands/activate.js +45 -0
- package/dist/commands/activate.js.map +1 -0
- package/dist/commands/active-windows.d.ts +16 -0
- package/dist/commands/active-windows.d.ts.map +1 -0
- package/dist/commands/active-windows.js +373 -0
- package/dist/commands/active-windows.js.map +1 -0
- package/dist/commands/audit-mark.d.ts +12 -0
- package/dist/commands/audit-mark.d.ts.map +1 -0
- package/dist/commands/audit-mark.js +204 -0
- package/dist/commands/audit-mark.js.map +1 -0
- package/dist/commands/cleanup.d.ts +8 -0
- package/dist/commands/cleanup.d.ts.map +1 -0
- package/dist/commands/cleanup.js +41 -0
- package/dist/commands/cleanup.js.map +1 -0
- package/dist/commands/close.d.ts +9 -0
- package/dist/commands/close.d.ts.map +1 -0
- package/dist/commands/close.js +129 -0
- package/dist/commands/close.js.map +1 -0
- package/dist/commands/collab-sync.d.ts +14 -0
- package/dist/commands/collab-sync.d.ts.map +1 -0
- package/dist/commands/collab-sync.js +240 -0
- package/dist/commands/collab-sync.js.map +1 -0
- package/dist/commands/collab.d.ts +6 -0
- package/dist/commands/collab.d.ts.map +1 -0
- package/dist/commands/collab.js +103 -0
- package/dist/commands/collab.js.map +1 -0
- package/dist/commands/completions.d.ts +8 -0
- package/dist/commands/completions.d.ts.map +1 -0
- package/dist/commands/completions.js +83 -0
- package/dist/commands/completions.js.map +1 -0
- package/dist/commands/conflicts.d.ts +12 -0
- package/dist/commands/conflicts.d.ts.map +1 -0
- package/dist/commands/conflicts.js +426 -0
- package/dist/commands/conflicts.js.map +1 -0
- package/dist/commands/demo.d.ts +3 -0
- package/dist/commands/demo.d.ts.map +1 -0
- package/dist/commands/demo.js +113 -0
- package/dist/commands/demo.js.map +1 -0
- package/dist/commands/depends.d.ts +8 -0
- package/dist/commands/depends.d.ts.map +1 -0
- package/dist/commands/depends.js +44 -0
- package/dist/commands/depends.js.map +1 -0
- package/dist/commands/doctor.d.ts +8 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +249 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/inbox.d.ts +3 -0
- package/dist/commands/inbox.d.ts.map +1 -0
- package/dist/commands/inbox.js +66 -0
- package/dist/commands/inbox.js.map +1 -0
- package/dist/commands/index.d.ts +43 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +61 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.d.ts +8 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +23 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/intent-scan.d.ts +17 -0
- package/dist/commands/intent-scan.d.ts.map +1 -0
- package/dist/commands/intent-scan.js +336 -0
- package/dist/commands/intent-scan.js.map +1 -0
- package/dist/commands/key-import.d.ts +3 -0
- package/dist/commands/key-import.d.ts.map +1 -0
- package/dist/commands/key-import.js +54 -0
- package/dist/commands/key-import.js.map +1 -0
- package/dist/commands/keygen.d.ts +3 -0
- package/dist/commands/keygen.d.ts.map +1 -0
- package/dist/commands/keygen.js +53 -0
- package/dist/commands/keygen.js.map +1 -0
- package/dist/commands/keys.d.ts +3 -0
- package/dist/commands/keys.d.ts.map +1 -0
- package/dist/commands/keys.js +56 -0
- package/dist/commands/keys.js.map +1 -0
- package/dist/commands/list.d.ts +3 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +45 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/lock.d.ts +11 -0
- package/dist/commands/lock.d.ts.map +1 -0
- package/dist/commands/lock.js +220 -0
- package/dist/commands/lock.js.map +1 -0
- package/dist/commands/log.d.ts +8 -0
- package/dist/commands/log.d.ts.map +1 -0
- package/dist/commands/log.js +95 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/mcp-health.d.ts +3 -0
- package/dist/commands/mcp-health.d.ts.map +1 -0
- package/dist/commands/mcp-health.js +305 -0
- package/dist/commands/mcp-health.js.map +1 -0
- package/dist/commands/mcp-restart.d.ts +3 -0
- package/dist/commands/mcp-restart.d.ts.map +1 -0
- package/dist/commands/mcp-restart.js +176 -0
- package/dist/commands/mcp-restart.js.map +1 -0
- package/dist/commands/merge-order.d.ts +9 -0
- package/dist/commands/merge-order.d.ts.map +1 -0
- package/dist/commands/merge-order.js +138 -0
- package/dist/commands/merge-order.js.map +1 -0
- package/dist/commands/merged.d.ts +8 -0
- package/dist/commands/merged.d.ts.map +1 -0
- package/dist/commands/merged.js +39 -0
- package/dist/commands/merged.js.map +1 -0
- package/dist/commands/msg-read.d.ts +3 -0
- package/dist/commands/msg-read.d.ts.map +1 -0
- package/dist/commands/msg-read.js +70 -0
- package/dist/commands/msg-read.js.map +1 -0
- package/dist/commands/pulse.d.ts +9 -0
- package/dist/commands/pulse.d.ts.map +1 -0
- package/dist/commands/pulse.js +232 -0
- package/dist/commands/pulse.js.map +1 -0
- package/dist/commands/radar.d.ts +3 -0
- package/dist/commands/radar.d.ts.map +1 -0
- package/dist/commands/radar.js +147 -0
- package/dist/commands/radar.js.map +1 -0
- package/dist/commands/ready-check.d.ts +9 -0
- package/dist/commands/ready-check.d.ts.map +1 -0
- package/dist/commands/ready-check.js +156 -0
- package/dist/commands/ready-check.js.map +1 -0
- package/dist/commands/register.d.ts +3 -0
- package/dist/commands/register.d.ts.map +1 -0
- package/dist/commands/register.js +124 -0
- package/dist/commands/register.js.map +1 -0
- package/dist/commands/send.d.ts +3 -0
- package/dist/commands/send.d.ts.map +1 -0
- package/dist/commands/send.js +134 -0
- package/dist/commands/send.js.map +1 -0
- package/dist/commands/stale.d.ts +8 -0
- package/dist/commands/stale.d.ts.map +1 -0
- package/dist/commands/stale.js +38 -0
- package/dist/commands/stale.js.map +1 -0
- package/dist/commands/status.d.ts +9 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +41 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/sync-all.d.ts +9 -0
- package/dist/commands/sync-all.d.ts.map +1 -0
- package/dist/commands/sync-all.js +180 -0
- package/dist/commands/sync-all.js.map +1 -0
- package/dist/commands/sync.d.ts +8 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +49 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/tension.d.ts +12 -0
- package/dist/commands/tension.d.ts.map +1 -0
- package/dist/commands/tension.js +242 -0
- package/dist/commands/tension.js.map +1 -0
- package/dist/commands/torrent.d.ts +9 -0
- package/dist/commands/torrent.d.ts.map +1 -0
- package/dist/commands/torrent.js +431 -0
- package/dist/commands/torrent.js.map +1 -0
- package/dist/commands/tui.d.ts +8 -0
- package/dist/commands/tui.d.ts.map +1 -0
- package/dist/commands/tui.js +15 -0
- package/dist/commands/tui.js.map +1 -0
- package/dist/commands/wake.d.ts +9 -0
- package/dist/commands/wake.d.ts.map +1 -0
- package/dist/commands/wake.js +188 -0
- package/dist/commands/wake.js.map +1 -0
- package/dist/commands/watch.d.ts +3 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +245 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/commands/who-touched.d.ts +9 -0
- package/dist/commands/who-touched.d.ts.map +1 -0
- package/dist/commands/who-touched.js +186 -0
- package/dist/commands/who-touched.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/agent-errors.d.ts +41 -0
- package/dist/lib/agent-errors.d.ts.map +1 -0
- package/dist/lib/agent-errors.js +143 -0
- package/dist/lib/agent-errors.js.map +1 -0
- package/dist/lib/ast.d.ts +56 -0
- package/dist/lib/ast.d.ts.map +1 -0
- package/dist/lib/ast.js +134 -0
- package/dist/lib/ast.js.map +1 -0
- package/dist/lib/config.d.ts +33 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +127 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/crdt.d.ts +83 -0
- package/dist/lib/crdt.d.ts.map +1 -0
- package/dist/lib/crdt.js +160 -0
- package/dist/lib/crdt.js.map +1 -0
- package/dist/lib/crypto.d.ts +71 -0
- package/dist/lib/crypto.d.ts.map +1 -0
- package/dist/lib/crypto.js +172 -0
- package/dist/lib/crypto.js.map +1 -0
- package/dist/lib/errors.d.ts +35 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +71 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/license.d.ts +61 -0
- package/dist/lib/license.d.ts.map +1 -0
- package/dist/lib/license.js +171 -0
- package/dist/lib/license.js.map +1 -0
- package/dist/lib/security.d.ts +53 -0
- package/dist/lib/security.d.ts.map +1 -0
- package/dist/lib/security.js +122 -0
- package/dist/lib/security.js.map +1 -0
- package/dist/lib/update-check.d.ts +11 -0
- package/dist/lib/update-check.d.ts.map +1 -0
- package/dist/lib/update-check.js +113 -0
- package/dist/lib/update-check.js.map +1 -0
- package/dist/storage/adapter.d.ts +58 -0
- package/dist/storage/adapter.d.ts.map +1 -0
- package/dist/storage/adapter.js +8 -0
- package/dist/storage/adapter.js.map +1 -0
- package/dist/storage/factory.d.ts +6 -0
- package/dist/storage/factory.d.ts.map +1 -0
- package/dist/storage/factory.js +22 -0
- package/dist/storage/factory.js.map +1 -0
- package/dist/storage/index.d.ts +5 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +5 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/local.d.ts +24 -0
- package/dist/storage/local.d.ts.map +1 -0
- package/dist/storage/local.js +101 -0
- package/dist/storage/local.js.map +1 -0
- package/dist/storage/supabase.d.ts +52 -0
- package/dist/storage/supabase.d.ts.map +1 -0
- package/dist/storage/supabase.js +221 -0
- package/dist/storage/supabase.js.map +1 -0
- package/dist/tui/screen.d.ts +14 -0
- package/dist/tui/screen.d.ts.map +1 -0
- package/dist/tui/screen.js +136 -0
- package/dist/tui/screen.js.map +1 -0
- 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"}
|
package/dist/lib/crdt.js
ADDED
|
@@ -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"}
|