spidersan 0.6.0 → 0.10.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 +65 -51
- package/README.md +238 -3
- 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 +416 -0
- package/dist/commands/bot.js.map +1 -0
- package/dist/commands/conflicts.d.ts.map +1 -1
- package/dist/commands/conflicts.js +49 -77
- 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 +10 -44
- 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/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 +82 -82
- package/dist/commands/pulse.js.map +1 -1
- package/dist/commands/queen.d.ts.map +1 -1
- package/dist/commands/queen.js +11 -7
- 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 +22 -37
- package/dist/commands/register.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 +6 -0
- package/dist/commands/watch.d.ts.map +1 -1
- package/dist/commands/watch.js +117 -30
- package/dist/commands/watch.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/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/pulse-renderer.d.ts +19 -0
- package/dist/lib/pulse-renderer.d.ts.map +1 -0
- package/dist/lib/pulse-renderer.js +108 -0
- package/dist/lib/pulse-renderer.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/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 +11 -0
- package/dist/lib/security.d.ts.map +1 -1
- package/dist/lib/security.js +24 -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/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 +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/git-messages.d.ts +53 -0
- package/dist/storage/git-messages.d.ts.map +1 -0
- package/dist/storage/git-messages.js +376 -0
- package/dist/storage/git-messages.js.map +1 -0
- package/dist/storage/index.d.ts +5 -0
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +5 -0
- 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-messages.d.ts +37 -0
- package/dist/storage/local-messages.d.ts.map +1 -0
- package/dist/storage/local-messages.js +151 -0
- package/dist/storage/local-messages.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/message-adapter.d.ts +86 -0
- package/dist/storage/message-adapter.d.ts.map +1 -0
- package/dist/storage/message-adapter.js +28 -0
- package/dist/storage/message-adapter.js.map +1 -0
- package/dist/storage/message-factory.d.ts +36 -0
- package/dist/storage/message-factory.d.ts.map +1 -0
- package/dist/storage/message-factory.js +99 -0
- package/dist/storage/message-factory.js.map +1 -0
- package/dist/storage/mycmail-adapter.d.ts +38 -0
- package/dist/storage/mycmail-adapter.d.ts.map +1 -0
- package/dist/storage/mycmail-adapter.js +300 -0
- package/dist/storage/mycmail-adapter.js.map +1 -0
- 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,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"}
|
|
@@ -0,0 +1,225 @@
|
|
|
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 { execFile } from 'child_process';
|
|
14
|
+
import { promisify } from 'util';
|
|
15
|
+
import { DEFAULT_LLM_CONFIGS } from './types.js';
|
|
16
|
+
import { loadAiConfig } from './setup.js';
|
|
17
|
+
const execFileAsync = promisify(execFile);
|
|
18
|
+
export function resolveConfig(overrides) {
|
|
19
|
+
const providerEnv = process.env['SPIDERSAN_LLM'];
|
|
20
|
+
const provider = overrides?.provider ?? providerEnv ?? 'lmstudio';
|
|
21
|
+
const base = DEFAULT_LLM_CONFIGS[provider] ?? DEFAULT_LLM_CONFIGS.lmstudio;
|
|
22
|
+
return {
|
|
23
|
+
...base,
|
|
24
|
+
...overrides,
|
|
25
|
+
provider,
|
|
26
|
+
model: overrides?.model ?? process.env['SPIDERSAN_LLM_MODEL'] ?? base.model,
|
|
27
|
+
baseUrl: overrides?.baseUrl ?? process.env['SPIDERSAN_LLM_URL'] ?? base.baseUrl,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
async function getGitHubToken() {
|
|
31
|
+
try {
|
|
32
|
+
const { stdout } = await execFileAsync('gh', ['auth', 'token'], { timeout: 5000 });
|
|
33
|
+
return stdout.trim();
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
throw new Error('GitHub CLI not authenticated. Run `gh auth login` first.');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async function chatOpenAICompatible(config, messages, apiKey) {
|
|
40
|
+
// Normalize: strip trailing /v1 so we always build the full path ourselves.
|
|
41
|
+
// Handles both http://host:port (env var form) and http://host:port/v1 (default form).
|
|
42
|
+
const base = config.baseUrl.replace(/\/v1\/?$/, '');
|
|
43
|
+
const url = `${base}/v1/chat/completions`;
|
|
44
|
+
const headers = { 'Content-Type': 'application/json' };
|
|
45
|
+
if (apiKey)
|
|
46
|
+
headers['Authorization'] = `Bearer ${apiKey}`;
|
|
47
|
+
const resp = await fetch(url, {
|
|
48
|
+
method: 'POST',
|
|
49
|
+
headers,
|
|
50
|
+
body: JSON.stringify({
|
|
51
|
+
model: config.model,
|
|
52
|
+
messages,
|
|
53
|
+
temperature: config.temperature,
|
|
54
|
+
max_tokens: config.maxTokens,
|
|
55
|
+
}),
|
|
56
|
+
signal: AbortSignal.timeout(60_000),
|
|
57
|
+
});
|
|
58
|
+
if (!resp.ok) {
|
|
59
|
+
const body = await resp.text().catch(() => '');
|
|
60
|
+
throw new Error(`LLM ${config.provider} returned ${resp.status}: ${body.slice(0, 200)}`);
|
|
61
|
+
}
|
|
62
|
+
const data = await resp.json();
|
|
63
|
+
return {
|
|
64
|
+
content: data.choices[0]?.message?.content ?? '',
|
|
65
|
+
model: data.model ?? config.model,
|
|
66
|
+
provider: config.provider,
|
|
67
|
+
promptTokens: data.usage?.prompt_tokens ?? 0,
|
|
68
|
+
completionTokens: data.usage?.completion_tokens ?? 0,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
async function chatOllama(config, messages) {
|
|
72
|
+
const url = `${config.baseUrl}/api/chat`;
|
|
73
|
+
const resp = await fetch(url, {
|
|
74
|
+
method: 'POST',
|
|
75
|
+
headers: { 'Content-Type': 'application/json' },
|
|
76
|
+
body: JSON.stringify({
|
|
77
|
+
model: config.model,
|
|
78
|
+
messages,
|
|
79
|
+
stream: false,
|
|
80
|
+
options: { temperature: config.temperature, num_predict: config.maxTokens },
|
|
81
|
+
}),
|
|
82
|
+
signal: AbortSignal.timeout(120_000),
|
|
83
|
+
});
|
|
84
|
+
if (!resp.ok) {
|
|
85
|
+
throw new Error(`Ollama returned ${resp.status}`);
|
|
86
|
+
}
|
|
87
|
+
const data = await resp.json();
|
|
88
|
+
return {
|
|
89
|
+
content: data.message?.content ?? '',
|
|
90
|
+
model: data.model ?? config.model,
|
|
91
|
+
provider: 'ollama',
|
|
92
|
+
promptTokens: data.prompt_eval_count ?? 0,
|
|
93
|
+
completionTokens: data.eval_count ?? 0,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
async function chatWithProvider(config, messages, apiKey) {
|
|
97
|
+
switch (config.provider) {
|
|
98
|
+
case 'lmstudio':
|
|
99
|
+
return chatOpenAICompatible(config, messages);
|
|
100
|
+
case 'copilot': {
|
|
101
|
+
const token = await getGitHubToken();
|
|
102
|
+
return chatOpenAICompatible(config, messages, token);
|
|
103
|
+
}
|
|
104
|
+
case 'ollama':
|
|
105
|
+
return chatOllama(config, messages);
|
|
106
|
+
case 'hosted': {
|
|
107
|
+
const key = apiKey ?? config.apiKey;
|
|
108
|
+
if (!key)
|
|
109
|
+
throw new Error('No API key for hosted tier. Run: spidersan ai-setup');
|
|
110
|
+
return chatOpenAICompatible(config, messages, key);
|
|
111
|
+
}
|
|
112
|
+
default:
|
|
113
|
+
throw new Error(`Unknown LLM provider: ${config.provider}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Local-first fallback: never send repo context to remote without opt-in
|
|
117
|
+
const LOCAL_FALLBACK = ['lmstudio', 'ollama'];
|
|
118
|
+
const REMOTE_PROVIDERS = ['hosted', 'copilot'];
|
|
119
|
+
/** Resolve the hosted API key from env var or persisted config. */
|
|
120
|
+
async function resolveHostedApiKey() {
|
|
121
|
+
const envKey = process.env['SPIDERSAN_API_KEY'];
|
|
122
|
+
if (envKey)
|
|
123
|
+
return envKey;
|
|
124
|
+
const config = await loadAiConfig();
|
|
125
|
+
return config?.apiKey ?? undefined;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Send a chat completion request with automatic fallback.
|
|
129
|
+
*
|
|
130
|
+
* Priority order (auto-routing when no explicit provider set):
|
|
131
|
+
* 1. lmstudio (local)
|
|
132
|
+
* 2. ollama (local)
|
|
133
|
+
* 3. hosted (api.spidersan.net) — only if API key available
|
|
134
|
+
* 4. copilot — only if allowRemoteFallback or explicitly configured
|
|
135
|
+
*/
|
|
136
|
+
export async function chat(messages, configOverrides) {
|
|
137
|
+
const { allowRemoteFallback, ...llmOverrides } = configOverrides ?? {};
|
|
138
|
+
const config = resolveConfig(llmOverrides);
|
|
139
|
+
const isRemote = REMOTE_PROVIDERS.includes(config.provider);
|
|
140
|
+
const errors = [];
|
|
141
|
+
// Resolve hosted API key once (avoid repeated config reads in fallback loop)
|
|
142
|
+
const hostedApiKey = await resolveHostedApiKey();
|
|
143
|
+
// Try configured provider first
|
|
144
|
+
try {
|
|
145
|
+
return await chatWithProvider(config, messages, config.provider === 'hosted' ? hostedApiKey : undefined);
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
errors.push({ provider: config.provider, error: err.message });
|
|
149
|
+
}
|
|
150
|
+
// Local fallback chain
|
|
151
|
+
for (const fallback of LOCAL_FALLBACK) {
|
|
152
|
+
if (fallback === config.provider)
|
|
153
|
+
continue;
|
|
154
|
+
try {
|
|
155
|
+
const result = await chatWithProvider(DEFAULT_LLM_CONFIGS[fallback], messages);
|
|
156
|
+
result.provider = fallback;
|
|
157
|
+
return result;
|
|
158
|
+
}
|
|
159
|
+
catch (err) {
|
|
160
|
+
errors.push({ provider: fallback, error: err.message });
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Remote fallback: hosted (if key available + tier allows), then copilot (if opted in)
|
|
164
|
+
//
|
|
165
|
+
// Tier routing: if the user configured free/contributor tier via ai-setup, hosted is
|
|
166
|
+
// always a valid fallback when local is unavailable — no explicit allowRemoteFallback needed.
|
|
167
|
+
const savedConfig = await loadAiConfig();
|
|
168
|
+
const tierAllowsHosted = savedConfig?.tier === 'free' || savedConfig?.tier === 'contributor';
|
|
169
|
+
if (allowRemoteFallback || isRemote || tierAllowsHosted) {
|
|
170
|
+
// hosted — only if we have a key
|
|
171
|
+
if (config.provider !== 'hosted' && hostedApiKey) {
|
|
172
|
+
try {
|
|
173
|
+
const result = await chatWithProvider(DEFAULT_LLM_CONFIGS.hosted, messages, hostedApiKey);
|
|
174
|
+
result.provider = 'hosted';
|
|
175
|
+
return result;
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
errors.push({ provider: 'hosted', error: err.message });
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// copilot — only with explicit allowRemoteFallback (never auto-routed)
|
|
182
|
+
if (allowRemoteFallback || isRemote) {
|
|
183
|
+
for (const fallback of ['copilot']) {
|
|
184
|
+
if (fallback === config.provider)
|
|
185
|
+
continue;
|
|
186
|
+
try {
|
|
187
|
+
const result = await chatWithProvider(DEFAULT_LLM_CONFIGS[fallback], messages);
|
|
188
|
+
result.provider = fallback;
|
|
189
|
+
return result;
|
|
190
|
+
}
|
|
191
|
+
catch (err) {
|
|
192
|
+
errors.push({ provider: fallback, error: err.message });
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
const summary = errors.map(e => ` ${e.provider}: ${e.error}`).join('\n');
|
|
198
|
+
throw new Error(`All LLM providers failed:\n${summary}`);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Quick health check — can we reach the configured provider?
|
|
202
|
+
*/
|
|
203
|
+
export async function ping(configOverrides) {
|
|
204
|
+
const config = resolveConfig(configOverrides);
|
|
205
|
+
const start = Date.now();
|
|
206
|
+
try {
|
|
207
|
+
const result = await chat([{ role: 'user', content: 'Reply with just "ok".' }], { ...config, maxTokens: 10 });
|
|
208
|
+
return {
|
|
209
|
+
ok: true,
|
|
210
|
+
provider: result.provider,
|
|
211
|
+
model: result.model,
|
|
212
|
+
latencyMs: Date.now() - start,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
catch (err) {
|
|
216
|
+
return {
|
|
217
|
+
ok: false,
|
|
218
|
+
provider: config.provider,
|
|
219
|
+
model: config.model,
|
|
220
|
+
latencyMs: Date.now() - start,
|
|
221
|
+
error: err.message,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=llm-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-client.js","sourceRoot":"","sources":["../../../src/lib/ai/llm-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spidersan AI Core — Reasoner
|
|
3
|
+
*
|
|
4
|
+
* Sends SpiderContext + user question to LLM with spidersan-aware system prompt.
|
|
5
|
+
* The scenario playbook is embedded as a TS constant (no file I/O at runtime).
|
|
6
|
+
*/
|
|
7
|
+
import type { LLMConfig, ReasoningRequest, ReasoningResult } from './types.js';
|
|
8
|
+
export declare function reason(request: ReasoningRequest, llmOverrides?: Partial<LLMConfig> & {
|
|
9
|
+
allowRemoteFallback?: boolean;
|
|
10
|
+
}): Promise<ReasoningResult>;
|
|
11
|
+
//# sourceMappingURL=reasoner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reasoner.d.ts","sourceRoot":"","sources":["../../../src/lib/ai/reasoner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EACV,SAAS,EAGT,gBAAgB,EAChB,eAAe,EAEhB,MAAM,YAAY,CAAC;AAqMpB,wBAAsB,MAAM,CAC1B,OAAO,EAAE,gBAAgB,EACzB,YAAY,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG;IAAE,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAAE,GACpE,OAAO,CAAC,eAAe,CAAC,CAkE1B"}
|