spidersan 0.5.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +46 -48
- package/README.md +241 -4
- package/dist/bin/spidersan.d.ts.map +1 -1
- package/dist/bin/spidersan.js +13 -1
- package/dist/bin/spidersan.js.map +1 -1
- package/dist/commands/abandon.d.ts.map +1 -1
- package/dist/commands/abandon.js +1 -9
- package/dist/commands/abandon.js.map +1 -1
- package/dist/commands/ai.d.ts +15 -0
- package/dist/commands/ai.d.ts.map +1 -0
- package/dist/commands/ai.js +498 -0
- package/dist/commands/ai.js.map +1 -0
- package/dist/commands/auto.d.ts.map +1 -1
- package/dist/commands/auto.js +2 -1
- package/dist/commands/auto.js.map +1 -1
- package/dist/commands/bot.d.ts +16 -0
- package/dist/commands/bot.d.ts.map +1 -0
- package/dist/commands/bot.js +398 -0
- package/dist/commands/bot.js.map +1 -0
- package/dist/commands/conflicts.d.ts.map +1 -1
- package/dist/commands/conflicts.js +264 -313
- package/dist/commands/conflicts.js.map +1 -1
- 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.map +1 -1
- package/dist/commands/cross-conflicts.js +1 -38
- package/dist/commands/cross-conflicts.js.map +1 -1
- package/dist/commands/depends.d.ts.map +1 -1
- package/dist/commands/depends.js +1 -9
- package/dist/commands/depends.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +117 -59
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/fleet-status.d.ts +14 -0
- package/dist/commands/fleet-status.d.ts.map +1 -0
- package/dist/commands/fleet-status.js +127 -0
- package/dist/commands/fleet-status.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/index.d.ts +5 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +7 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/merge-order.d.ts.map +1 -1
- package/dist/commands/merge-order.js +18 -67
- package/dist/commands/merge-order.js.map +1 -1
- package/dist/commands/merged.d.ts.map +1 -1
- package/dist/commands/merged.js +1 -9
- package/dist/commands/merged.js.map +1 -1
- package/dist/commands/pulse.d.ts.map +1 -1
- package/dist/commands/pulse.js +137 -74
- package/dist/commands/pulse.js.map +1 -1
- package/dist/commands/queen.d.ts.map +1 -1
- package/dist/commands/queen.js +36 -19
- package/dist/commands/queen.js.map +1 -1
- package/dist/commands/ready-check.d.ts +2 -1
- package/dist/commands/ready-check.d.ts.map +1 -1
- package/dist/commands/ready-check.js +6 -30
- package/dist/commands/ready-check.js.map +1 -1
- package/dist/commands/register.d.ts.map +1 -1
- package/dist/commands/register.js +7 -29
- package/dist/commands/register.js.map +1 -1
- package/dist/commands/stale.d.ts +1 -9
- package/dist/commands/stale.d.ts.map +1 -1
- package/dist/commands/stale.js +1 -42
- package/dist/commands/stale.js.map +1 -1
- package/dist/commands/torrent.d.ts.map +1 -1
- package/dist/commands/torrent.js +29 -18
- package/dist/commands/torrent.js.map +1 -1
- package/dist/commands/watch.d.ts.map +1 -1
- package/dist/commands/watch.js +13 -34
- package/dist/commands/watch.js.map +1 -1
- package/dist/lib/agent-errors.js +2 -2
- package/dist/lib/agent-errors.js.map +1 -1
- 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 +216 -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 +98 -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 +246 -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 +39 -0
- package/dist/lib/ai/types.js.map +1 -0
- package/dist/lib/colony-subscriber.d.ts +15 -12
- package/dist/lib/colony-subscriber.d.ts.map +1 -1
- package/dist/lib/colony-subscriber.js +146 -65
- package/dist/lib/colony-subscriber.js.map +1 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +18 -4
- package/dist/lib/config.js.map +1 -1
- 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 +162 -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.js +1 -1
- package/dist/lib/crypto.js.map +1 -1
- package/dist/lib/daily-bridge.d.ts.map +1 -1
- package/dist/lib/daily-bridge.js +3 -2
- package/dist/lib/daily-bridge.js.map +1 -1
- package/dist/lib/git-events-subscriber.d.ts +59 -0
- package/dist/lib/git-events-subscriber.d.ts.map +1 -0
- package/dist/lib/git-events-subscriber.js +779 -0
- package/dist/lib/git-events-subscriber.js.map +1 -0
- package/dist/lib/git.d.ts +15 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +180 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/github.d.ts.map +1 -1
- package/dist/lib/github.js +14 -9
- package/dist/lib/github.js.map +1 -1
- package/dist/lib/graph.d.ts +23 -0
- package/dist/lib/graph.d.ts.map +1 -0
- package/dist/lib/graph.js +134 -0
- package/dist/lib/graph.js.map +1 -0
- package/dist/lib/hub.d.ts +31 -0
- package/dist/lib/hub.d.ts.map +1 -0
- package/dist/lib/hub.js +92 -0
- package/dist/lib/hub.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/remote-drift.d.ts +60 -0
- package/dist/lib/remote-drift.d.ts.map +1 -0
- package/dist/lib/remote-drift.js +225 -0
- package/dist/lib/remote-drift.js.map +1 -0
- package/dist/lib/repo-scanner.d.ts +0 -4
- package/dist/lib/repo-scanner.d.ts.map +1 -1
- package/dist/lib/repo-scanner.js +2 -1
- package/dist/lib/repo-scanner.js.map +1 -1
- package/dist/lib/salvage-analyzer.d.ts.map +1 -1
- package/dist/lib/salvage-analyzer.js +2 -3
- package/dist/lib/salvage-analyzer.js.map +1 -1
- package/dist/lib/security.d.ts +17 -0
- package/dist/lib/security.d.ts.map +1 -1
- package/dist/lib/security.js +34 -1
- package/dist/lib/security.js.map +1 -1
- package/dist/lib/session-logger.d.ts +54 -0
- package/dist/lib/session-logger.d.ts.map +1 -0
- package/dist/lib/session-logger.js +136 -0
- package/dist/lib/session-logger.js.map +1 -0
- package/dist/storage/adapter.d.ts +4 -0
- package/dist/storage/adapter.d.ts.map +1 -1
- 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 +4 -0
- package/dist/storage/factory.d.ts.map +1 -1
- package/dist/storage/factory.js +25 -9
- package/dist/storage/factory.js.map +1 -1
- package/dist/storage/index.d.ts +5 -5
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +5 -6
- package/dist/storage/index.js.map +1 -1
- 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 +112 -0
- package/dist/storage/json-branch-registry-store.js.map +1 -0
- package/dist/storage/local.d.ts +2 -6
- package/dist/storage/local.d.ts.map +1 -1
- package/dist/storage/local.js +13 -76
- package/dist/storage/local.js.map +1 -1
- 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 +65 -0
- package/dist/storage/memory-branch-registry-store.js.map +1 -0
- package/dist/storage/mycmail-adapter.d.ts.map +1 -1
- package/dist/storage/mycmail-adapter.js +4 -6
- package/dist/storage/mycmail-adapter.js.map +1 -1
- package/dist/storage/supabase-registry-sync-client-impl.d.ts +46 -0
- package/dist/storage/supabase-registry-sync-client-impl.d.ts.map +1 -0
- package/dist/storage/supabase-registry-sync-client-impl.js +322 -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 +8 -46
- package/dist/storage/supabase.d.ts.map +1 -1
- package/dist/storage/supabase.js +30 -342
- package/dist/storage/supabase.js.map +1 -1
- package/dist/tui/screen.d.ts.map +1 -1
- package/dist/tui/screen.js +5 -3
- package/dist/tui/screen.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-builder.d.ts","sourceRoot":"","sources":["../../../src/lib/ai/context-builder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,KAAK,EAGV,aAAa,EAGd,MAAM,YAAY,CAAC;AAUpB,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AA2ND,wBAAsB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,aAAa,CAAC,CAyC5F"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spidersan AI Core — Context Builder
|
|
3
|
+
*
|
|
4
|
+
* Aggregates context from all sources into structured SpiderContext.
|
|
5
|
+
* Uses storage adapter (not raw file reads) and pure functions (no CLI shelling).
|
|
6
|
+
* Each source is best-effort — failures are reported, not fatal.
|
|
7
|
+
*/
|
|
8
|
+
import { execFile } from 'child_process';
|
|
9
|
+
import { promisify } from 'util';
|
|
10
|
+
import { getStorage } from '../../storage/factory.js';
|
|
11
|
+
import { classifyTier } from '../conflict-tier.js';
|
|
12
|
+
const execFileAsync = promisify(execFile);
|
|
13
|
+
// ─── Git Helpers ────────────────────────────────────────────
|
|
14
|
+
async function getGitInfo(cwd) {
|
|
15
|
+
try {
|
|
16
|
+
const opts = { cwd, timeout: 5000 };
|
|
17
|
+
const [branchResult, statusResult, remoteResult] = await Promise.all([
|
|
18
|
+
execFileAsync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], opts),
|
|
19
|
+
execFileAsync('git', ['status', '--porcelain'], opts),
|
|
20
|
+
execFileAsync('git', ['remote', 'get-url', 'origin'], opts).catch(() => ({ stdout: '' })),
|
|
21
|
+
]);
|
|
22
|
+
const branch = branchResult.stdout.trim();
|
|
23
|
+
const dirty = statusResult.stdout.trim().split('\n').filter(Boolean).map(l => l.slice(3));
|
|
24
|
+
const repo = remoteResult.stdout.trim().replace(/.*[:/]([^/]+\/[^/]+?)(?:\.git)?$/, '$1');
|
|
25
|
+
let ahead = 0, behind = 0;
|
|
26
|
+
try {
|
|
27
|
+
const revList = await execFileAsync('git', ['rev-list', '--left-right', '--count', `origin/${branch}...HEAD`], opts);
|
|
28
|
+
const parts = revList.stdout.trim().split(/\s+/);
|
|
29
|
+
behind = parseInt(parts[0] ?? '0', 10);
|
|
30
|
+
ahead = parseInt(parts[1] ?? '0', 10);
|
|
31
|
+
}
|
|
32
|
+
catch { /* no remote tracking */ }
|
|
33
|
+
return { available: true, data: { branch, repo, ahead, behind, dirty } };
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
return {
|
|
37
|
+
available: false,
|
|
38
|
+
data: { branch: 'unknown', repo: 'unknown', ahead: 0, behind: 0, dirty: [] },
|
|
39
|
+
error: err.message,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// ─── Registry & Conflict Detection ─────────────────────────
|
|
44
|
+
async function getRegistryContext(currentBranch) {
|
|
45
|
+
try {
|
|
46
|
+
const storage = await getStorage();
|
|
47
|
+
const allBranches = await storage.list();
|
|
48
|
+
const staleThreshold = Date.now() - 7 * 24 * 60 * 60 * 1000;
|
|
49
|
+
const branches = allBranches.map((b) => ({
|
|
50
|
+
name: b.name,
|
|
51
|
+
agent: b.agent ?? null,
|
|
52
|
+
files: b.files,
|
|
53
|
+
status: b.status,
|
|
54
|
+
lastUpdated: b.registeredAt instanceof Date
|
|
55
|
+
? b.registeredAt.toISOString()
|
|
56
|
+
: new Date(b.registeredAt).toISOString(),
|
|
57
|
+
commitsBehindMain: 0,
|
|
58
|
+
}));
|
|
59
|
+
const activeBranches = branches.filter(b => b.status === 'active');
|
|
60
|
+
const staleBranches = branches.filter(b => b.status === 'active' && new Date(b.lastUpdated).getTime() < staleThreshold);
|
|
61
|
+
// Compute conflicts: find file overlaps between current branch and others
|
|
62
|
+
const currentEntry = allBranches.find((b) => b.name === currentBranch);
|
|
63
|
+
const currentFiles = currentEntry?.files ?? [];
|
|
64
|
+
const conflicts = [];
|
|
65
|
+
if (currentFiles.length > 0) {
|
|
66
|
+
// ⚡ Bolt: Use a Set for O(1) lookups instead of Array.includes for O(N) to improve conflict detection speed
|
|
67
|
+
// when checking many files against many active branches.
|
|
68
|
+
const currentFilesSet = new Set(currentFiles);
|
|
69
|
+
for (const other of allBranches) {
|
|
70
|
+
if (other.name === currentBranch || other.status !== 'active')
|
|
71
|
+
continue;
|
|
72
|
+
const overlapping = other.files.filter(f => currentFilesSet.has(f));
|
|
73
|
+
if (overlapping.length > 0) {
|
|
74
|
+
const maxTier = Math.max(...overlapping.map(file => classifyTier(file)));
|
|
75
|
+
conflicts.push({
|
|
76
|
+
branch: currentBranch,
|
|
77
|
+
otherBranch: other.name,
|
|
78
|
+
tier: maxTier,
|
|
79
|
+
files: overlapping,
|
|
80
|
+
agent: currentEntry?.agent ?? null,
|
|
81
|
+
otherAgent: other.agent ?? null,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
available: true,
|
|
88
|
+
data: {
|
|
89
|
+
active: activeBranches.length,
|
|
90
|
+
stale: staleBranches.length,
|
|
91
|
+
branches,
|
|
92
|
+
conflicts,
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
return {
|
|
98
|
+
available: false,
|
|
99
|
+
data: { active: 0, stale: 0, branches: [], conflicts: [] },
|
|
100
|
+
error: err.message,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// ─── Colony (read-only snapshot) ────────────────────────────
|
|
105
|
+
async function getColonySnapshot() {
|
|
106
|
+
const colonyUrl = process.env['COLONY_SUPABASE_URL'];
|
|
107
|
+
const colonyKey = process.env['COLONY_SUPABASE_KEY'];
|
|
108
|
+
if (!colonyUrl || !colonyKey) {
|
|
109
|
+
return { available: false, data: { online: false, activeAgents: [], inProgress: [] }, error: 'Colony not configured' };
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
const resp = await fetch(`${colonyUrl}/rest/v1/colony_state?status=eq.in-progress&select=agent_label,task,status,last_heartbeat`, {
|
|
113
|
+
headers: {
|
|
114
|
+
'apikey': colonyKey,
|
|
115
|
+
'Authorization': `Bearer ${colonyKey}`,
|
|
116
|
+
},
|
|
117
|
+
signal: AbortSignal.timeout(5000),
|
|
118
|
+
});
|
|
119
|
+
if (!resp.ok)
|
|
120
|
+
throw new Error(`Colony API ${resp.status}`);
|
|
121
|
+
const rows = await resp.json();
|
|
122
|
+
return {
|
|
123
|
+
available: true,
|
|
124
|
+
data: {
|
|
125
|
+
online: true,
|
|
126
|
+
activeAgents: [...new Set(rows.map(r => r.agent_label))],
|
|
127
|
+
inProgress: rows.map(r => ({
|
|
128
|
+
agent: r.agent_label,
|
|
129
|
+
task: r.task,
|
|
130
|
+
status: r.status,
|
|
131
|
+
lastHeartbeat: r.last_heartbeat,
|
|
132
|
+
})),
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
return {
|
|
138
|
+
available: false,
|
|
139
|
+
data: { online: false, activeAgents: [], inProgress: [] },
|
|
140
|
+
error: err.message,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// ─── Activity Log (best-effort) ────────────────────────────
|
|
145
|
+
async function getRecentActivity(_repoRoot) {
|
|
146
|
+
try {
|
|
147
|
+
const { readFileSync, existsSync } = await import('fs');
|
|
148
|
+
const { join } = await import('path');
|
|
149
|
+
const { homedir } = await import('os');
|
|
150
|
+
const logPath = join(homedir(), '.spidersan', 'activity.jsonl');
|
|
151
|
+
if (!existsSync(logPath)) {
|
|
152
|
+
return { available: false, data: [], error: 'No activity log found' };
|
|
153
|
+
}
|
|
154
|
+
const cutoff = Date.now() - 24 * 60 * 60 * 1000;
|
|
155
|
+
const lines = readFileSync(logPath, 'utf-8').trim().split('\n').filter(Boolean);
|
|
156
|
+
const entries = [];
|
|
157
|
+
for (const line of lines.slice(-100)) {
|
|
158
|
+
try {
|
|
159
|
+
const record = JSON.parse(line);
|
|
160
|
+
if (new Date(record.created_at).getTime() > cutoff) {
|
|
161
|
+
entries.push({
|
|
162
|
+
event: record.event,
|
|
163
|
+
branch: record.branch,
|
|
164
|
+
agent: record.agent,
|
|
165
|
+
details: record.details,
|
|
166
|
+
timestamp: record.created_at,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
catch { /* skip malformed lines */ }
|
|
171
|
+
}
|
|
172
|
+
return { available: true, data: entries };
|
|
173
|
+
}
|
|
174
|
+
catch (err) {
|
|
175
|
+
return { available: false, data: [], error: err.message };
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// ─── Main Builder ───────────────────────────────────────────
|
|
179
|
+
export async function buildContext(options = {}) {
|
|
180
|
+
const cwd = options.repoRoot ?? process.cwd();
|
|
181
|
+
// Gather all sources in parallel (all best-effort)
|
|
182
|
+
const [gitInfo, registryCtx, colonyCtx, activityCtx] = await Promise.all([
|
|
183
|
+
getGitInfo(cwd),
|
|
184
|
+
getGitInfo(cwd).then(g => getRegistryContext(g.data.branch)),
|
|
185
|
+
getColonySnapshot(),
|
|
186
|
+
options.includeActivity ? getRecentActivity(cwd) : Promise.resolve(undefined),
|
|
187
|
+
]);
|
|
188
|
+
const conflicts = registryCtx.data.conflicts;
|
|
189
|
+
const context = {
|
|
190
|
+
timestamp: new Date().toISOString(),
|
|
191
|
+
repo: gitInfo.data.repo,
|
|
192
|
+
branch: gitInfo.data.branch,
|
|
193
|
+
registry: {
|
|
194
|
+
active: registryCtx.data.active,
|
|
195
|
+
stale: registryCtx.data.stale,
|
|
196
|
+
branches: registryCtx.data.branches,
|
|
197
|
+
},
|
|
198
|
+
conflicts: {
|
|
199
|
+
tier1: conflicts.filter(c => c.tier === 1).length,
|
|
200
|
+
tier2: conflicts.filter(c => c.tier === 2).length,
|
|
201
|
+
tier3: conflicts.filter(c => c.tier === 3).length,
|
|
202
|
+
details: conflicts,
|
|
203
|
+
},
|
|
204
|
+
gitStatus: {
|
|
205
|
+
ahead: gitInfo.data.ahead,
|
|
206
|
+
behind: gitInfo.data.behind,
|
|
207
|
+
dirty: gitInfo.data.dirty,
|
|
208
|
+
},
|
|
209
|
+
colony: colonyCtx.data,
|
|
210
|
+
};
|
|
211
|
+
if (activityCtx?.available) {
|
|
212
|
+
context.activityLog = activityCtx.data;
|
|
213
|
+
}
|
|
214
|
+
return context;
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=context-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-builder.js","sourceRoot":"","sources":["../../../src/lib/ai/context-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spidersan AI Core — Event Handler
|
|
3
|
+
*
|
|
4
|
+
* Processes git/colony events → deterministic conflict check → optional LLM escalation.
|
|
5
|
+
* Pure functions — no CLI or server concerns.
|
|
6
|
+
*/
|
|
7
|
+
import type { Advice, EventPayload } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Handle an event (push, PR, colony signal, branch register).
|
|
10
|
+
* First runs deterministic conflict check (fast, no LLM).
|
|
11
|
+
* Only escalates to LLM for TIER 2+ or complex scenarios.
|
|
12
|
+
*
|
|
13
|
+
* @param opts.repoRoot - Local repo path for context building. Defaults to process.cwd().
|
|
14
|
+
* @param opts.localOnly - If true, LLM escalation uses local providers only (never hosted/copilot).
|
|
15
|
+
* Use this for daemon/webhook paths to avoid consuming remote API credits.
|
|
16
|
+
*/
|
|
17
|
+
export declare function handleEvent(event: EventPayload, opts?: {
|
|
18
|
+
repoRoot?: string;
|
|
19
|
+
localOnly?: boolean;
|
|
20
|
+
}): Promise<Advice>;
|
|
21
|
+
//# sourceMappingURL=event-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-handler.d.ts","sourceRoot":"","sources":["../../../src/lib/ai/event-handler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAiB,MAAM,YAAY,CAAC;AAwDtE;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAwC7H"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spidersan AI Core — Event Handler
|
|
3
|
+
*
|
|
4
|
+
* Processes git/colony events → deterministic conflict check → optional LLM escalation.
|
|
5
|
+
* Pure functions — no CLI or server concerns.
|
|
6
|
+
*/
|
|
7
|
+
import { reason } from './reasoner.js';
|
|
8
|
+
import { buildContext } from './context-builder.js';
|
|
9
|
+
import { classifyTier } from '../conflict-tier.js';
|
|
10
|
+
// ─── Deterministic Conflict Check ───────────────────────────
|
|
11
|
+
function checkDeterministicConflicts(event, context) {
|
|
12
|
+
if (!event.files || event.files.length === 0)
|
|
13
|
+
return null;
|
|
14
|
+
// Find overlapping files with registered branches
|
|
15
|
+
const overlaps = [];
|
|
16
|
+
// Pre-compute event files as Set for O(1) lookups
|
|
17
|
+
const eventFilesSet = new Set(event.files);
|
|
18
|
+
for (const branch of context.registry.branches) {
|
|
19
|
+
if (branch.name === event.branch)
|
|
20
|
+
continue;
|
|
21
|
+
if (branch.status !== 'active')
|
|
22
|
+
continue;
|
|
23
|
+
for (const file of branch.files) {
|
|
24
|
+
if (eventFilesSet.has(file)) {
|
|
25
|
+
overlaps.push({ branch: branch.name, file, tier: classifyTier(file) });
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (overlaps.length === 0)
|
|
30
|
+
return null;
|
|
31
|
+
const maxTier = Math.max(...overlaps.map(o => o.tier));
|
|
32
|
+
const tierActions = {
|
|
33
|
+
3: { action: 'block', label: 'BLOCK' },
|
|
34
|
+
2: { action: 'pause', label: 'PAUSE' },
|
|
35
|
+
1: { action: 'warn', label: 'WARN' },
|
|
36
|
+
};
|
|
37
|
+
const { action, label } = tierActions[maxTier];
|
|
38
|
+
const affectedBranches = [...new Set(overlaps.map(o => o.branch))];
|
|
39
|
+
const affectedFiles = [...new Set(overlaps.map(o => o.file))];
|
|
40
|
+
const commands = ['spidersan conflicts --json'];
|
|
41
|
+
if (maxTier >= 2)
|
|
42
|
+
commands.push('spidersan conflicts --wake');
|
|
43
|
+
if (maxTier >= 3)
|
|
44
|
+
commands.push('spidersan conflicts --strict');
|
|
45
|
+
return {
|
|
46
|
+
tier: maxTier,
|
|
47
|
+
action,
|
|
48
|
+
message: `🕷️ TIER ${maxTier} ${label}: ${event.branch ?? 'unknown'} overlaps with ${affectedBranches.join(', ')} on ${affectedFiles.join(', ')}`,
|
|
49
|
+
commands,
|
|
50
|
+
escalateToLLM: maxTier >= 2,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
// ─── Main Event Handler ────────────────────────────────────
|
|
54
|
+
/**
|
|
55
|
+
* Handle an event (push, PR, colony signal, branch register).
|
|
56
|
+
* First runs deterministic conflict check (fast, no LLM).
|
|
57
|
+
* Only escalates to LLM for TIER 2+ or complex scenarios.
|
|
58
|
+
*
|
|
59
|
+
* @param opts.repoRoot - Local repo path for context building. Defaults to process.cwd().
|
|
60
|
+
* @param opts.localOnly - If true, LLM escalation uses local providers only (never hosted/copilot).
|
|
61
|
+
* Use this for daemon/webhook paths to avoid consuming remote API credits.
|
|
62
|
+
*/
|
|
63
|
+
export async function handleEvent(event, opts = {}) {
|
|
64
|
+
const context = await buildContext({ includeActivity: true, repoRoot: opts.repoRoot });
|
|
65
|
+
// Fast path: deterministic conflict check
|
|
66
|
+
const deterministicAdvice = checkDeterministicConflicts(event, context);
|
|
67
|
+
if (deterministicAdvice && !deterministicAdvice.escalateToLLM) {
|
|
68
|
+
return deterministicAdvice;
|
|
69
|
+
}
|
|
70
|
+
// Slow path: LLM reasoning for TIER 2+ or ambiguous situations
|
|
71
|
+
if (deterministicAdvice?.escalateToLLM) {
|
|
72
|
+
try {
|
|
73
|
+
const result = await reason({
|
|
74
|
+
mode: 'ask',
|
|
75
|
+
question: `Event: ${event.type} on branch ${event.branch ?? 'unknown'} touching files [${(event.files ?? []).join(', ')}]. ${deterministicAdvice.message}. What should the agents do?`,
|
|
76
|
+
context,
|
|
77
|
+
}, { allowRemoteFallback: opts.localOnly ? false : undefined });
|
|
78
|
+
return {
|
|
79
|
+
...deterministicAdvice,
|
|
80
|
+
message: result.advice,
|
|
81
|
+
commands: result.commands.length > 0 ? result.commands : deterministicAdvice.commands,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// LLM failed — return deterministic advice as fallback
|
|
86
|
+
return deterministicAdvice;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// No conflicts detected
|
|
90
|
+
return {
|
|
91
|
+
tier: 0,
|
|
92
|
+
action: 'info',
|
|
93
|
+
message: `✅ ${event.type} on ${event.branch ?? 'unknown'}: no conflicts detected.`,
|
|
94
|
+
commands: [],
|
|
95
|
+
escalateToLLM: false,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=event-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-handler.js","sourceRoot":"","sources":["../../../src/lib/ai/event-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spidersan AI Core — Public API
|
|
3
|
+
*
|
|
4
|
+
* Shared library for CLI (ask/advise/explain), MCP tools, webhook, and agent mode.
|
|
5
|
+
*/
|
|
6
|
+
export { buildContext } from './context-builder.js';
|
|
7
|
+
export type { BuildContextOptions } from './context-builder.js';
|
|
8
|
+
export { chat, ping, resolveConfig } from './llm-client.js';
|
|
9
|
+
export { reason } from './reasoner.js';
|
|
10
|
+
export { handleEvent } from './event-handler.js';
|
|
11
|
+
export type { Advice, AIConfig, ActivityEntry, BranchSummary, ConflictSummary, DailyEntry, EventPayload, EventType, LLMConfig, LLMMessage, LLMProvider, LLMResponse, ReasoningMode, ReasoningRequest, ReasoningResult, SpiderContext, WorkSignal, } from './types.js';
|
|
12
|
+
export { DEFAULT_LLM_CONFIGS } from './types.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/ai/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,YAAY,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEhE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAE5D,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,YAAY,EACV,MAAM,EACN,QAAQ,EACR,aAAa,EACb,aAAa,EACb,eAAe,EACf,UAAU,EACV,YAAY,EACZ,SAAS,EACT,SAAS,EACT,UAAU,EACV,WAAW,EACX,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,UAAU,GACX,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spidersan AI Core — Public API
|
|
3
|
+
*
|
|
4
|
+
* Shared library for CLI (ask/advise/explain), MCP tools, webhook, and agent mode.
|
|
5
|
+
*/
|
|
6
|
+
export { buildContext } from './context-builder.js';
|
|
7
|
+
export { chat, ping, resolveConfig } from './llm-client.js';
|
|
8
|
+
export { reason } from './reasoner.js';
|
|
9
|
+
export { handleEvent } from './event-handler.js';
|
|
10
|
+
export { DEFAULT_LLM_CONFIGS } from './types.js';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/ai/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGpD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAE5D,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAsBjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spidersan AI Core — LLM Client
|
|
3
|
+
*
|
|
4
|
+
* Unified interface for LLM providers with automatic fallback chain:
|
|
5
|
+
* LM Studio (Gemma 4) → Ollama → Hosted API (api.spidersan.net) → GitHub Copilot
|
|
6
|
+
*
|
|
7
|
+
* Tier routing (auto, no explicit provider):
|
|
8
|
+
* Tier 1: localhost:1234 / :8082 (lmstudio)
|
|
9
|
+
* Tier 2: localhost:11434 (ollama)
|
|
10
|
+
* Tier 3: api.spidersan.net (hosted) — requires API key
|
|
11
|
+
* Remote: copilot — only with allowRemoteFallback or explicit config
|
|
12
|
+
*/
|
|
13
|
+
import type { LLMConfig, LLMMessage, LLMProvider, LLMResponse } from './types.js';
|
|
14
|
+
export declare function resolveConfig(overrides?: Partial<LLMConfig>): LLMConfig;
|
|
15
|
+
/**
|
|
16
|
+
* Send a chat completion request with automatic fallback.
|
|
17
|
+
*
|
|
18
|
+
* Priority order (auto-routing when no explicit provider set):
|
|
19
|
+
* 1. lmstudio (local)
|
|
20
|
+
* 2. ollama (local)
|
|
21
|
+
* 3. hosted (api.spidersan.net) — only if API key available
|
|
22
|
+
* 4. copilot — only if allowRemoteFallback or explicitly configured
|
|
23
|
+
*/
|
|
24
|
+
export declare function chat(messages: LLMMessage[], configOverrides?: Partial<LLMConfig> & {
|
|
25
|
+
allowRemoteFallback?: boolean;
|
|
26
|
+
}): Promise<LLMResponse>;
|
|
27
|
+
/**
|
|
28
|
+
* Quick health check — can we reach the configured provider?
|
|
29
|
+
*/
|
|
30
|
+
export declare function ping(configOverrides?: Partial<LLMConfig>): Promise<{
|
|
31
|
+
ok: boolean;
|
|
32
|
+
provider: LLMProvider;
|
|
33
|
+
model: string;
|
|
34
|
+
latencyMs: number;
|
|
35
|
+
error?: string;
|
|
36
|
+
}>;
|
|
37
|
+
//# sourceMappingURL=llm-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-client.d.ts","sourceRoot":"","sources":["../../../src/lib/ai/llm-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAMlF,wBAAgB,aAAa,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAYvE;AAyHD;;;;;;;;GAQG;AACH,wBAAsB,IAAI,CACxB,QAAQ,EAAE,UAAU,EAAE,EACtB,eAAe,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG;IAAE,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAAE,GACvE,OAAO,CAAC,WAAW,CAAC,CAgEtB;AAED;;GAEG;AACH,wBAAsB,IAAI,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC;IACxE,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,WAAW,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CAwBD"}
|