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.
- package/CHANGELOG.md +8 -0
- package/dist/bin/command-registry.d.ts +25 -0
- package/dist/bin/command-registry.d.ts.map +1 -0
- package/dist/bin/command-registry.js +29 -0
- package/dist/bin/command-registry.js.map +1 -0
- package/dist/bin/spidersan.d.ts +16 -0
- package/dist/bin/spidersan.d.ts.map +1 -0
- package/dist/bin/spidersan.js +98 -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 +43 -0
- package/dist/commands/abandon.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 +50 -0
- package/dist/commands/cleanup.js.map +1 -0
- package/dist/commands/config.d.ts +15 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +309 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/conflicts.d.ts +34 -0
- package/dist/commands/conflicts.d.ts.map +1 -0
- package/dist/commands/conflicts.js +773 -0
- package/dist/commands/conflicts.js.map +1 -0
- package/dist/commands/context.d.ts +8 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +104 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/cross-conflicts.d.ts +17 -0
- package/dist/commands/cross-conflicts.d.ts.map +1 -0
- package/dist/commands/cross-conflicts.js +273 -0
- package/dist/commands/cross-conflicts.js.map +1 -0
- package/dist/commands/depends.d.ts +11 -0
- package/dist/commands/depends.d.ts.map +1 -0
- package/dist/commands/depends.js +63 -0
- package/dist/commands/depends.js.map +1 -0
- package/dist/commands/doctor.d.ts +30 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +558 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/git-watch.d.ts +24 -0
- package/dist/commands/git-watch.d.ts.map +1 -0
- package/dist/commands/git-watch.js +84 -0
- package/dist/commands/git-watch.js.map +1 -0
- package/dist/commands/github-sync.d.ts +42 -0
- package/dist/commands/github-sync.d.ts.map +1 -0
- package/dist/commands/github-sync.js +191 -0
- package/dist/commands/github-sync.js.map +1 -0
- package/dist/commands/index.d.ts +25 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +29 -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/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/log.d.ts +7 -0
- package/dist/commands/log.d.ts.map +1 -0
- package/dist/commands/log.js +110 -0
- package/dist/commands/log.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 +100 -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 +37 -0
- package/dist/commands/merged.js.map +1 -0
- package/dist/commands/pr-check.d.ts +24 -0
- package/dist/commands/pr-check.d.ts.map +1 -0
- package/dist/commands/pr-check.js +85 -0
- package/dist/commands/pr-check.js.map +1 -0
- package/dist/commands/ready-check.d.ts +11 -0
- package/dist/commands/ready-check.d.ts.map +1 -0
- package/dist/commands/ready-check.js +150 -0
- package/dist/commands/ready-check.js.map +1 -0
- package/dist/commands/rebase-helper.d.ts +3 -0
- package/dist/commands/rebase-helper.d.ts.map +1 -0
- package/dist/commands/rebase-helper.js +52 -0
- package/dist/commands/rebase-helper.js.map +1 -0
- package/dist/commands/register.d.ts +10 -0
- package/dist/commands/register.d.ts.map +1 -0
- package/dist/commands/register.js +176 -0
- package/dist/commands/register.js.map +1 -0
- package/dist/commands/registry-sync.d.ts +9 -0
- package/dist/commands/registry-sync.d.ts.map +1 -0
- package/dist/commands/registry-sync.js +129 -0
- package/dist/commands/registry-sync.js.map +1 -0
- package/dist/commands/stale.d.ts +17 -0
- package/dist/commands/stale.d.ts.map +1 -0
- package/dist/commands/stale.js +136 -0
- package/dist/commands/stale.js.map +1 -0
- package/dist/commands/sync.d.ts +21 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +78 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/verify-trunk.d.ts +18 -0
- package/dist/commands/verify-trunk.d.ts.map +1 -0
- package/dist/commands/verify-trunk.js +77 -0
- package/dist/commands/verify-trunk.js.map +1 -0
- package/dist/commands/watch.d.ts +8 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +509 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/activity.d.ts +53 -0
- package/dist/lib/activity.d.ts.map +1 -0
- package/dist/lib/activity.js +271 -0
- package/dist/lib/activity.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 +145 -0
- package/dist/lib/agent-errors.js.map +1 -0
- package/dist/lib/ai/context-builder.d.ts +16 -0
- package/dist/lib/ai/context-builder.d.ts.map +1 -0
- package/dist/lib/ai/context-builder.js +229 -0
- package/dist/lib/ai/context-builder.js.map +1 -0
- package/dist/lib/ai/event-handler.d.ts +21 -0
- package/dist/lib/ai/event-handler.d.ts.map +1 -0
- package/dist/lib/ai/event-handler.js +111 -0
- package/dist/lib/ai/event-handler.js.map +1 -0
- package/dist/lib/ai/index.d.ts +13 -0
- package/dist/lib/ai/index.d.ts.map +1 -0
- package/dist/lib/ai/index.js +11 -0
- package/dist/lib/ai/index.js.map +1 -0
- package/dist/lib/ai/llm-client.d.ts +37 -0
- package/dist/lib/ai/llm-client.d.ts.map +1 -0
- package/dist/lib/ai/llm-client.js +225 -0
- package/dist/lib/ai/llm-client.js.map +1 -0
- package/dist/lib/ai/reasoner.d.ts +11 -0
- package/dist/lib/ai/reasoner.d.ts.map +1 -0
- package/dist/lib/ai/reasoner.js +227 -0
- package/dist/lib/ai/reasoner.js.map +1 -0
- package/dist/lib/ai/setup.d.ts +40 -0
- package/dist/lib/ai/setup.d.ts.map +1 -0
- package/dist/lib/ai/setup.js +154 -0
- package/dist/lib/ai/setup.js.map +1 -0
- package/dist/lib/ai/types.d.ts +135 -0
- package/dist/lib/ai/types.d.ts.map +1 -0
- package/dist/lib/ai/types.js +42 -0
- package/dist/lib/ai/types.js.map +1 -0
- package/dist/lib/ast.d.ts +44 -0
- package/dist/lib/ast.d.ts.map +1 -0
- package/dist/lib/ast.js +160 -0
- package/dist/lib/ast.js.map +1 -0
- package/dist/lib/carries.d.ts +22 -0
- package/dist/lib/carries.d.ts.map +1 -0
- package/dist/lib/carries.js +56 -0
- package/dist/lib/carries.js.map +1 -0
- package/dist/lib/colony-subscriber.d.ts +56 -0
- package/dist/lib/colony-subscriber.d.ts.map +1 -0
- package/dist/lib/colony-subscriber.js +265 -0
- package/dist/lib/colony-subscriber.js.map +1 -0
- package/dist/lib/config.d.ts +62 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +235 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/conflict-analyzer.d.ts +33 -0
- package/dist/lib/conflict-analyzer.d.ts.map +1 -0
- package/dist/lib/conflict-analyzer.js +114 -0
- package/dist/lib/conflict-analyzer.js.map +1 -0
- package/dist/lib/conflict-renderer.d.ts +7 -0
- package/dist/lib/conflict-renderer.d.ts.map +1 -0
- package/dist/lib/conflict-renderer.js +145 -0
- package/dist/lib/conflict-renderer.js.map +1 -0
- package/dist/lib/conflict-tier.d.ts +20 -0
- package/dist/lib/conflict-tier.d.ts.map +1 -0
- package/dist/lib/conflict-tier.js +49 -0
- package/dist/lib/conflict-tier.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 +176 -0
- package/dist/lib/crypto.js.map +1 -0
- package/dist/lib/ecosystem-env.d.ts +33 -0
- package/dist/lib/ecosystem-env.d.ts.map +1 -0
- package/dist/lib/ecosystem-env.js +62 -0
- package/dist/lib/ecosystem-env.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/git-events-subscriber.d.ts +86 -0
- package/dist/lib/git-events-subscriber.d.ts.map +1 -0
- package/dist/lib/git-events-subscriber.js +870 -0
- package/dist/lib/git-events-subscriber.js.map +1 -0
- package/dist/lib/git-merge-analyzer.d.ts +38 -0
- package/dist/lib/git-merge-analyzer.d.ts.map +1 -0
- package/dist/lib/git-merge-analyzer.js +23 -0
- package/dist/lib/git-merge-analyzer.js.map +1 -0
- package/dist/lib/git.d.ts +103 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +670 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/github.d.ts +151 -0
- package/dist/lib/github.d.ts.map +1 -0
- package/dist/lib/github.js +425 -0
- package/dist/lib/github.js.map +1 -0
- package/dist/lib/graph.d.ts +38 -0
- package/dist/lib/graph.d.ts.map +1 -0
- package/dist/lib/graph.js +165 -0
- package/dist/lib/graph.js.map +1 -0
- package/dist/lib/machine.d.ts +14 -0
- package/dist/lib/machine.d.ts.map +1 -0
- package/dist/lib/machine.js +38 -0
- package/dist/lib/machine.js.map +1 -0
- package/dist/lib/notify.d.ts +68 -0
- package/dist/lib/notify.d.ts.map +1 -0
- package/dist/lib/notify.js +111 -0
- package/dist/lib/notify.js.map +1 -0
- package/dist/lib/outline.d.ts +6 -0
- package/dist/lib/outline.d.ts.map +1 -0
- package/dist/lib/outline.js +60 -0
- package/dist/lib/outline.js.map +1 -0
- package/dist/lib/push-registry.d.ts +22 -0
- package/dist/lib/push-registry.d.ts.map +1 -0
- package/dist/lib/push-registry.js +21 -0
- package/dist/lib/push-registry.js.map +1 -0
- package/dist/lib/reconcile.d.ts +100 -0
- package/dist/lib/reconcile.d.ts.map +1 -0
- package/dist/lib/reconcile.js +121 -0
- package/dist/lib/reconcile.js.map +1 -0
- package/dist/lib/regex-utils.d.ts +6 -0
- package/dist/lib/regex-utils.d.ts.map +1 -0
- package/dist/lib/regex-utils.js +24 -0
- package/dist/lib/regex-utils.js.map +1 -0
- package/dist/lib/register-renderer.d.ts +10 -0
- package/dist/lib/register-renderer.d.ts.map +1 -0
- package/dist/lib/register-renderer.js +19 -0
- package/dist/lib/register-renderer.js.map +1 -0
- package/dist/lib/remote-drift.d.ts +61 -0
- package/dist/lib/remote-drift.d.ts.map +1 -0
- package/dist/lib/remote-drift.js +227 -0
- package/dist/lib/remote-drift.js.map +1 -0
- package/dist/lib/security.d.ts +72 -0
- package/dist/lib/security.d.ts.map +1 -0
- package/dist/lib/security.js +180 -0
- package/dist/lib/security.js.map +1 -0
- package/dist/lib/semantic-analysis.d.ts +31 -0
- package/dist/lib/semantic-analysis.d.ts.map +1 -0
- package/dist/lib/semantic-analysis.js +120 -0
- package/dist/lib/semantic-analysis.js.map +1 -0
- package/dist/lib/supabase-credentials.d.ts +36 -0
- package/dist/lib/supabase-credentials.d.ts.map +1 -0
- package/dist/lib/supabase-credentials.js +43 -0
- package/dist/lib/supabase-credentials.js.map +1 -0
- package/dist/lib/trunk.d.ts +39 -0
- package/dist/lib/trunk.d.ts.map +1 -0
- package/dist/lib/trunk.js +116 -0
- package/dist/lib/trunk.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/lib/watch-renderer.d.ts +13 -0
- package/dist/lib/watch-renderer.d.ts.map +1 -0
- package/dist/lib/watch-renderer.js +35 -0
- package/dist/lib/watch-renderer.js.map +1 -0
- package/dist/storage/adapter.d.ts +81 -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/branch-registry-store.d.ts +13 -0
- package/dist/storage/branch-registry-store.d.ts.map +1 -0
- package/dist/storage/branch-registry-store.js +2 -0
- package/dist/storage/branch-registry-store.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 +14 -0
- package/dist/storage/factory.js.map +1 -0
- package/dist/storage/index.d.ts +10 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +11 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/json-branch-registry-store.d.ts +19 -0
- package/dist/storage/json-branch-registry-store.d.ts.map +1 -0
- package/dist/storage/json-branch-registry-store.js +138 -0
- package/dist/storage/json-branch-registry-store.js.map +1 -0
- package/dist/storage/local.d.ts +20 -0
- package/dist/storage/local.d.ts.map +1 -0
- package/dist/storage/local.js +40 -0
- package/dist/storage/local.js.map +1 -0
- package/dist/storage/memory-branch-registry-store.d.ts +16 -0
- package/dist/storage/memory-branch-registry-store.d.ts.map +1 -0
- package/dist/storage/memory-branch-registry-store.js +68 -0
- package/dist/storage/memory-branch-registry-store.js.map +1 -0
- package/dist/storage/supabase-registry-sync-client-impl.d.ts +40 -0
- package/dist/storage/supabase-registry-sync-client-impl.d.ts.map +1 -0
- package/dist/storage/supabase-registry-sync-client-impl.js +278 -0
- package/dist/storage/supabase-registry-sync-client-impl.js.map +1 -0
- package/dist/storage/supabase-registry-sync-client.d.ts +9 -0
- package/dist/storage/supabase-registry-sync-client.d.ts.map +1 -0
- package/dist/storage/supabase-registry-sync-client.js +2 -0
- package/dist/storage/supabase-registry-sync-client.js.map +1 -0
- package/dist/storage/supabase.d.ts +28 -0
- package/dist/storage/supabase.d.ts.map +1 -0
- package/dist/storage/supabase.js +56 -0
- package/dist/storage/supabase.js.map +1 -0
- package/dist/types/cloud.d.ts +102 -0
- package/dist/types/cloud.d.ts.map +1 -0
- package/dist/types/cloud.js +13 -0
- package/dist/types/cloud.js.map +1 -0
- 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"}
|