@digital-lake/lognexus 0.0.0-stage → 1.0.0-alpha.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/LICENSE +22 -0
- package/NOTICE.md +27 -0
- package/README.md +184 -2
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +116 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/loadConfig.d.ts +36 -0
- package/dist/config/loadConfig.d.ts.map +1 -0
- package/dist/config/loadConfig.js +65 -0
- package/dist/config/loadConfig.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/providers/deepseek.d.ts +10 -0
- package/dist/providers/deepseek.d.ts.map +1 -0
- package/dist/providers/deepseek.js +13 -0
- package/dist/providers/deepseek.js.map +1 -0
- package/dist/providers/factory.d.ts +4 -0
- package/dist/providers/factory.d.ts.map +1 -0
- package/dist/providers/factory.js +23 -0
- package/dist/providers/factory.js.map +1 -0
- package/dist/providers/gemini.d.ts +17 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +105 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/openaiCompatible.d.ts +17 -0
- package/dist/providers/openaiCompatible.d.ts.map +1 -0
- package/dist/providers/openaiCompatible.js +100 -0
- package/dist/providers/openaiCompatible.js.map +1 -0
- package/dist/providers/types.d.ts +35 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/routing/tierRouter.d.ts +11 -0
- package/dist/routing/tierRouter.d.ts.map +1 -0
- package/dist/routing/tierRouter.js +42 -0
- package/dist/routing/tierRouter.js.map +1 -0
- package/package.json +64 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 devallibus
|
|
4
|
+
Copyright (c) 2026 Digital Lake and LogNexus contributors
|
|
5
|
+
|
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
8
|
+
in the Software without restriction, including without limitation the rights
|
|
9
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
10
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
11
|
+
furnished to do so, subject to the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be included in all
|
|
14
|
+
copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
18
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
19
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
20
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
22
|
+
SOFTWARE.
|
package/NOTICE.md
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Open Source Notice
|
|
2
|
+
|
|
3
|
+
## LogNexus
|
|
4
|
+
Copyright (c) 2026 Digital Lake and LogNexus contributors.
|
|
5
|
+
|
|
6
|
+
LogNexus is an independent hard fork and continuation of the `shiplog` project created by devallibus.
|
|
7
|
+
- **Original Project:** [devallibus/shiplog](https://github.com/devallibus/shiplog)
|
|
8
|
+
- **Original Author:** devallibus
|
|
9
|
+
- **License:** MIT License (Copyright (c) 2026 devallibus)
|
|
10
|
+
|
|
11
|
+
All enhancements, multi-model routing integration (Gemini & DeepSeek), and runtime architecture additions developed under LogNexus are maintained by Digital Lake and released under the MIT License.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Third-Party Components & Attributions
|
|
16
|
+
|
|
17
|
+
Portions of the commit, brainstorm, and PR workflows in LogNexus incorporate ideas and patterns from:
|
|
18
|
+
|
|
19
|
+
1. **OrchestKit**
|
|
20
|
+
- Repository: `https://github.com/yonatangross/orchestkit`
|
|
21
|
+
- Copyright (c) 2025 Yonatan Gross
|
|
22
|
+
- License: MIT (see `LICENSES/orchestkit-MIT.txt`)
|
|
23
|
+
|
|
24
|
+
2. **Superpowers**
|
|
25
|
+
- Repository: `https://github.com/obra/superpowers`
|
|
26
|
+
- Copyright (c) 2025 Jesse Vincent
|
|
27
|
+
- License: MIT (see `LICENSES/superpowers-MIT.txt`)
|
package/README.md
CHANGED
|
@@ -1,3 +1,185 @@
|
|
|
1
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="docs/assets/logo.png" alt="LogNexus Logo" width="360">
|
|
3
|
+
</p>
|
|
2
4
|
|
|
3
|
-
|
|
5
|
+
# LogNexus
|
|
6
|
+
|
|
7
|
+
<p align="center">
|
|
8
|
+
<strong>The Git-Powered Memory Nexus for AI Agents</strong>
|
|
9
|
+
</p>
|
|
10
|
+
|
|
11
|
+
<p align="center">
|
|
12
|
+
<a href="https://github.com/digital-lake-ai/lognexus/actions"><img src="https://img.shields.io/github/actions/workflow/status/digital-lake-ai/lognexus/ci.yml?branch=main&label=CI" alt="CI Status"></a>
|
|
13
|
+
<a href="https://www.npmjs.com/package/@digital-lake/lognexus"><img src="https://img.shields.io/npm/v/@digital-lake/lognexus.svg?color=blue" alt="npm version"></a>
|
|
14
|
+
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="License: MIT"></a>
|
|
15
|
+
<a href="https://github.com/digital-lake-ai/lognexus"><img src="https://img.shields.io/badge/org-Digital%20Lake-indigo.svg" alt="Digital Lake"></a>
|
|
16
|
+
</p>
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## What is LogNexus?
|
|
21
|
+
|
|
22
|
+
As AI coding agents take on multi-step engineering tasks, they suffer from a fundamental failure mode: **cognitive amnesia**. Between conversation resets, context compactations, model handoffs, and unexpected bugs, the *why* behind design decisions, discarded alternatives, and technical discoveries vanishes.
|
|
23
|
+
|
|
24
|
+
**LogNexus transforms Git and GitHub into a persistent, traceable knowledge graph.** It turns every brainstorm into an issue, every issue into a scoped branch, every commit into an annotated milestone, and every Pull Request into an auditable timeline of the entire development journey.
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
Issues (Why & Goals) ──▶ Branches (Task Scopes) ──▶ Commits (Context & Diffs) ──▶ PR (Timeline & Review)
|
|
28
|
+
▲ │
|
|
29
|
+
└─────────────────────── Git-Backed Knowledge Graph ──────────────────────────────┘
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Key Features
|
|
35
|
+
|
|
36
|
+
- **Dual-Layer Architecture:**
|
|
37
|
+
- **Skill Layer (Markdown):** Drop-in compatibility with **Claude Code**, **Cursor**, **Codex**, **Antigravity**, and **Gemini CLI**.
|
|
38
|
+
- **Runtime Layer (TypeScript):** Lightweight, zero-heavy-dependency runtime with native `fetch` and a flexible **Strategy/Factory** pattern.
|
|
39
|
+
- **Native Multi-Model Routing:**
|
|
40
|
+
- Route planning, PR synthesis, and cross-review to high-reasoning tiers (**Gemini / Claude Opus / DeepSeek Reasoner**).
|
|
41
|
+
- Ingest massive codebases using long-context windows (**Gemini** with 1M tokens).
|
|
42
|
+
- Delegate closed-contract implementation tasks to cost-effective execution engines (**DeepSeek Chat** at marginal cost).
|
|
43
|
+
- **Cross-Model Review Gates:** Enforce non-negotiable review separation (`Authored-by:` vs `Reviewed-by:`). No model merges its own code without independent verification.
|
|
44
|
+
- **Contract-First Subtasks:** Tasks are bounded by strict decision budgets, file allowlists, and stop conditions (`feat(#42/T1)`).
|
|
45
|
+
- **Hidden Metadata Envelopes:** HTML comments preserve machine-parseable state (`<!-- lognexus: kind: state ... -->`) without cluttering human-readable markdown.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Why Multi-Model Routing?
|
|
50
|
+
|
|
51
|
+
Empirical benchmarks and community data demonstrate that routing specialized agent tasks to provider tiers according to context, reasoning, and execution profiles drastically reduces operating costs while improving quality.
|
|
52
|
+
|
|
53
|
+
<p align="center">
|
|
54
|
+
<img src="docs/assets/multimodel-routing-costs.png" alt="Multi-Model Routing Cost and Performance Analysis" width="85%">
|
|
55
|
+
</p>
|
|
56
|
+
|
|
57
|
+
### Operational Tiers
|
|
58
|
+
|
|
59
|
+
| Tier | Default Provider / Model | Primary Role |
|
|
60
|
+
|---|---|---|
|
|
61
|
+
| **tier-1 (Reasoning)** | Gemini Pro/Flash (High) · DeepSeek Reasoner · Claude Opus | Architectural design, brainstorm synthesis, PR timelines, and cross-model review gates. |
|
|
62
|
+
| **tier-2 (Context)** | Gemini (1M Context Window) | Rapid codebase exploration, large context loading, discovery triage, and documentation. |
|
|
63
|
+
| **tier-3 (Execution)** | DeepSeek Chat | Routine implementation under closed delegation contracts, subtask commits, and timeline logging. |
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Architecture & Competitive Positioning
|
|
68
|
+
|
|
69
|
+
LogNexus advances agentic development workflows beyond passive markdown instructions into an active, verifiable development platform.
|
|
70
|
+
|
|
71
|
+
<p align="center">
|
|
72
|
+
<img src="docs/assets/competitive-gap-map.png" alt="Competitive Gap Map and Roadmap" width="85%">
|
|
73
|
+
</p>
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Quickstart & Golden Path
|
|
78
|
+
|
|
79
|
+
LogNexus coordinates the full issue-to-merge lifecycle through intuitive slash commands:
|
|
80
|
+
|
|
81
|
+
### 1. Capture the Plan
|
|
82
|
+
```bash
|
|
83
|
+
/lognexus plan
|
|
84
|
+
```
|
|
85
|
+
Transforms an exploratory brainstorm into a structured GitHub Issue with discrete subtasks (`T1..Tn`), verification criteria, and tier tags.
|
|
86
|
+
|
|
87
|
+
### 2. Start Work on a Clean Branch
|
|
88
|
+
```bash
|
|
89
|
+
/lognexus start <issue-number>
|
|
90
|
+
```
|
|
91
|
+
Creates an ID-prefixed branch (`issue/<id>-<slug>`) from the default branch tip and logs a signed `[lognexus/session-start]` note.
|
|
92
|
+
|
|
93
|
+
### 3. Commit with Traceability
|
|
94
|
+
```bash
|
|
95
|
+
/lognexus commit
|
|
96
|
+
```
|
|
97
|
+
Stages changes and generates structured, task-scoped commits (`feat(#42/T1): ...`) paired with an issue progress update.
|
|
98
|
+
|
|
99
|
+
### 4. Synthesize the Pull Request
|
|
100
|
+
```bash
|
|
101
|
+
/lognexus pr
|
|
102
|
+
```
|
|
103
|
+
Compiles all commits, discoveries, discarded alternatives, and verification steps into a comprehensive Journey Timeline inside the PR description.
|
|
104
|
+
|
|
105
|
+
### 5. Cross-Model Review & Gate Verification
|
|
106
|
+
```bash
|
|
107
|
+
/lognexus review
|
|
108
|
+
```
|
|
109
|
+
An independent model inspects the PR diff, verifies task contracts, and signs off (`Reviewed-by: <model>`) before merge.
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Installation
|
|
114
|
+
|
|
115
|
+
### As a Claude Code Plugin
|
|
116
|
+
```bash
|
|
117
|
+
# From repository
|
|
118
|
+
claude plugin add digital-lake-ai/lognexus
|
|
119
|
+
|
|
120
|
+
# Or link locally
|
|
121
|
+
claude plugin add ./path/to/lognexus
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Via Agent Skills (Antigravity / Cursor / Codex)
|
|
125
|
+
```bash
|
|
126
|
+
npx -y skills add digital-lake-ai/lognexus
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Via Global CLI
|
|
130
|
+
```bash
|
|
131
|
+
npm install -g @digital-lake/lognexus
|
|
132
|
+
lognexus doctor
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## Configuration
|
|
138
|
+
|
|
139
|
+
Configure your active provider in `.lognexus/config.json` or through environment variables:
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
# Provider selection
|
|
143
|
+
export LOGNEXUS_PROVIDER=gemini # 'gemini' or 'deepseek'
|
|
144
|
+
|
|
145
|
+
# Google Gemini
|
|
146
|
+
export GEMINI_API_KEY="your-api-key"
|
|
147
|
+
export GEMINI_MODEL="gemini-3.8-flash"
|
|
148
|
+
|
|
149
|
+
# DeepSeek
|
|
150
|
+
export DEEPSEEK_API_KEY="your-api-key"
|
|
151
|
+
export DEEPSEEK_BASE_URL="https://api.deepseek.com"
|
|
152
|
+
export DEEPSEEK_MODEL="deepseek-chat"
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Verify your environment anytime:
|
|
156
|
+
```bash
|
|
157
|
+
lognexus doctor
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## Disambiguation
|
|
163
|
+
|
|
164
|
+
**LogNexus** by Digital Lake is an open-source development orchestrator and Git memory system for AI agents. It is not affiliated with academic research papers on industrial log compression (e.g. ISSTA 2026).
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## Based on & Acknowledgments
|
|
169
|
+
|
|
170
|
+
LogNexus is an independent hard fork and continuation of [`shiplog`](https://github.com/devallibus/shiplog), originally created by **devallibus** under the MIT License.
|
|
171
|
+
|
|
172
|
+
We extend our deep gratitude to **devallibus** for pioneering the concept of Git-as-knowledge-graph for AI development. LogNexus builds upon that foundation by introducing:
|
|
173
|
+
- Multi-model routing with native **Google Gemini** and **DeepSeek** provider strategies.
|
|
174
|
+
- A standalone TypeScript runtime and automated verification CLI.
|
|
175
|
+
- Resilient backwards-compatibility for existing `.shiplog` envelopes and workflows.
|
|
176
|
+
|
|
177
|
+
Additional inspirations and patterns are derived from [OrchestKit](https://github.com/yonatangross/orchestkit) and [Superpowers](https://github.com/obra/superpowers). Detailed license texts are preserved in the [`LICENSES/`](LICENSES/) directory and in [`NOTICE.md`](NOTICE.md).
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## License
|
|
182
|
+
|
|
183
|
+
LogNexus is released under the [MIT License](LICENSE).
|
|
184
|
+
Copyright (c) 2026 devallibus
|
|
185
|
+
Copyright (c) 2026 Digital Lake and LogNexus contributors.
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { execSync } from "node:child_process";
|
|
3
|
+
import { loadConfig } from "./config/loadConfig.js";
|
|
4
|
+
import { createProvider } from "./providers/factory.js";
|
|
5
|
+
import { resolveTier } from "./routing/tierRouter.js";
|
|
6
|
+
function printHeader() {
|
|
7
|
+
console.log("\n🔷 LogNexus CLI v1.0.0-alpha.0 — Digital Lake\n");
|
|
8
|
+
}
|
|
9
|
+
function redactKey(key) {
|
|
10
|
+
if (!key)
|
|
11
|
+
return "❌ (not set)";
|
|
12
|
+
if (key.length <= 8)
|
|
13
|
+
return "•••••••• (set)";
|
|
14
|
+
return `${key.slice(0, 4)}••••${key.slice(-4)}`;
|
|
15
|
+
}
|
|
16
|
+
async function runDoctor(args) {
|
|
17
|
+
printHeader();
|
|
18
|
+
console.log("Running diagnostics...\n");
|
|
19
|
+
const live = args.includes("--live");
|
|
20
|
+
// 1. Git Check
|
|
21
|
+
try {
|
|
22
|
+
const gitVer = execSync("git --version", { encoding: "utf-8" }).trim();
|
|
23
|
+
const isRepo = execSync("git rev-parse --is-inside-work-tree", {
|
|
24
|
+
encoding: "utf-8",
|
|
25
|
+
stdio: ["pipe", "pipe", "ignore"],
|
|
26
|
+
}).trim();
|
|
27
|
+
console.log(`[PASS] Git: ${gitVer} (inside git repository: ${isRepo})`);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
console.log("[FAIL] Git: Git command failed or not in a git repository");
|
|
31
|
+
}
|
|
32
|
+
// 2. GitHub CLI Check
|
|
33
|
+
try {
|
|
34
|
+
const ghVer = execSync("gh --version", { encoding: "utf-8" }).split("\n")[0];
|
|
35
|
+
console.log(`[PASS] GitHub CLI: ${ghVer}`);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
console.log("[WARN] GitHub CLI: 'gh' not found in PATH or not installed");
|
|
39
|
+
}
|
|
40
|
+
// 3. Load Configuration
|
|
41
|
+
const config = loadConfig();
|
|
42
|
+
console.log(`\n[INFO] Active Provider Strategy: ${config.provider.toUpperCase()}`);
|
|
43
|
+
console.log(` - Gemini Key: ${redactKey(config.gemini.apiKey)}`);
|
|
44
|
+
console.log(` - Gemini Model: ${config.gemini.model}`);
|
|
45
|
+
console.log(` - DeepSeek Key: ${redactKey(config.deepseek.apiKey)}`);
|
|
46
|
+
console.log(` - DeepSeek Model: ${config.deepseek.model}`);
|
|
47
|
+
// 4. Live Provider Connectivity Check (Optional)
|
|
48
|
+
if (live) {
|
|
49
|
+
console.log("\nTesting live API connectivity...");
|
|
50
|
+
if (config.gemini.apiKey) {
|
|
51
|
+
const gemini = createProvider("gemini", config);
|
|
52
|
+
const health = await gemini.healthCheck();
|
|
53
|
+
console.log(` - Gemini Live: ${health.ok ? "✅ PASS" : "❌ FAIL"} — ${health.message}`);
|
|
54
|
+
}
|
|
55
|
+
if (config.deepseek.apiKey) {
|
|
56
|
+
const deepseek = createProvider("deepseek", config);
|
|
57
|
+
const health = await deepseek.healthCheck();
|
|
58
|
+
console.log(` - DeepSeek Live: ${health.ok ? "✅ PASS" : "❌ FAIL"} — ${health.message}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
console.log("\nTip: Pass --live to verify API keys with real connectivity checks.");
|
|
63
|
+
}
|
|
64
|
+
console.log("\nDiagnostic complete.\n");
|
|
65
|
+
}
|
|
66
|
+
function runRoute(args) {
|
|
67
|
+
const tierArg = args[0];
|
|
68
|
+
if (!tierArg || !["tier-1", "tier-2", "tier-3"].includes(tierArg)) {
|
|
69
|
+
console.error("Usage: lognexus route <tier-1 | tier-2 | tier-3>");
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
|
72
|
+
const tier = tierArg;
|
|
73
|
+
const config = loadConfig();
|
|
74
|
+
const assignment = resolveTier(tier, config);
|
|
75
|
+
console.log(`\n🔷 LogNexus Tier Route: [${assignment.tier}]`);
|
|
76
|
+
console.log(`Provider: ${assignment.provider.id}`);
|
|
77
|
+
console.log(`Model: ${assignment.model}`);
|
|
78
|
+
console.log(`Purpose: ${assignment.description}\n`);
|
|
79
|
+
}
|
|
80
|
+
function runHelp() {
|
|
81
|
+
printHeader();
|
|
82
|
+
console.log("Usage: lognexus <command> [options]\n");
|
|
83
|
+
console.log("Commands:");
|
|
84
|
+
console.log(" doctor [--live] Run environment and credentials diagnostic");
|
|
85
|
+
console.log(" route <tier> Resolve assigned model/provider for a tier (tier-1, tier-2, tier-3)");
|
|
86
|
+
console.log(" config Display sanitized configuration");
|
|
87
|
+
console.log(" help Show this help message\n");
|
|
88
|
+
}
|
|
89
|
+
async function main() {
|
|
90
|
+
const command = process.argv[2] || "help";
|
|
91
|
+
const args = process.argv.slice(3);
|
|
92
|
+
switch (command) {
|
|
93
|
+
case "doctor":
|
|
94
|
+
await runDoctor(args);
|
|
95
|
+
break;
|
|
96
|
+
case "route":
|
|
97
|
+
runRoute(args);
|
|
98
|
+
break;
|
|
99
|
+
case "config":
|
|
100
|
+
printHeader();
|
|
101
|
+
console.log(JSON.stringify({
|
|
102
|
+
...loadConfig(),
|
|
103
|
+
gemini: { ...loadConfig().gemini, apiKey: redactKey(loadConfig().gemini.apiKey) },
|
|
104
|
+
deepseek: { ...loadConfig().deepseek, apiKey: redactKey(loadConfig().deepseek.apiKey) },
|
|
105
|
+
}, null, 2));
|
|
106
|
+
break;
|
|
107
|
+
default:
|
|
108
|
+
runHelp();
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
main().catch((err) => {
|
|
113
|
+
console.error("Fatal error:", err);
|
|
114
|
+
process.exit(1);
|
|
115
|
+
});
|
|
116
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const ProviderTypeSchema: z.ZodEnum<{
|
|
3
|
+
deepseek: "deepseek";
|
|
4
|
+
gemini: "gemini";
|
|
5
|
+
}>;
|
|
6
|
+
export type ProviderType = z.infer<typeof ProviderTypeSchema>;
|
|
7
|
+
export declare const GeminiConfigSchema: z.ZodObject<{
|
|
8
|
+
apiKey: z.ZodOptional<z.ZodString>;
|
|
9
|
+
model: z.ZodDefault<z.ZodString>;
|
|
10
|
+
apiBaseUrl: z.ZodDefault<z.ZodString>;
|
|
11
|
+
}, z.core.$strip>;
|
|
12
|
+
export declare const DeepSeekConfigSchema: z.ZodObject<{
|
|
13
|
+
apiKey: z.ZodOptional<z.ZodString>;
|
|
14
|
+
model: z.ZodDefault<z.ZodString>;
|
|
15
|
+
apiBaseUrl: z.ZodDefault<z.ZodString>;
|
|
16
|
+
}, z.core.$strip>;
|
|
17
|
+
export declare const LogNexusConfigSchema: z.ZodObject<{
|
|
18
|
+
provider: z.ZodDefault<z.ZodEnum<{
|
|
19
|
+
deepseek: "deepseek";
|
|
20
|
+
gemini: "gemini";
|
|
21
|
+
}>>;
|
|
22
|
+
gemini: z.ZodDefault<z.ZodObject<{
|
|
23
|
+
apiKey: z.ZodOptional<z.ZodString>;
|
|
24
|
+
model: z.ZodDefault<z.ZodString>;
|
|
25
|
+
apiBaseUrl: z.ZodDefault<z.ZodString>;
|
|
26
|
+
}, z.core.$strip>>;
|
|
27
|
+
deepseek: z.ZodDefault<z.ZodObject<{
|
|
28
|
+
apiKey: z.ZodOptional<z.ZodString>;
|
|
29
|
+
model: z.ZodDefault<z.ZodString>;
|
|
30
|
+
apiBaseUrl: z.ZodDefault<z.ZodString>;
|
|
31
|
+
}, z.core.$strip>>;
|
|
32
|
+
}, z.core.$strip>;
|
|
33
|
+
export type LogNexusConfig = z.infer<typeof LogNexusConfigSchema>;
|
|
34
|
+
export declare function loadConfigFile(customPath?: string): Partial<LogNexusConfig>;
|
|
35
|
+
export declare function loadConfig(customConfigPath?: string, env?: NodeJS.ProcessEnv): LogNexusConfig;
|
|
36
|
+
//# sourceMappingURL=loadConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadConfig.d.ts","sourceRoot":"","sources":["../../src/config/loadConfig.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,kBAAkB;;;EAAiC,CAAC;AACjE,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,eAAO,MAAM,kBAAkB;;;;iBAI7B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;iBAI/B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;iBAU/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,wBAAgB,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAoB3E;AAED,wBAAgB,UAAU,CACxB,gBAAgB,CAAC,EAAE,MAAM,EACzB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,cAAc,CAsBhB"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
export const ProviderTypeSchema = z.enum(["gemini", "deepseek"]);
|
|
5
|
+
export const GeminiConfigSchema = z.object({
|
|
6
|
+
apiKey: z.string().optional(),
|
|
7
|
+
model: z.string().default("gemini-3.8-flash"),
|
|
8
|
+
apiBaseUrl: z.string().default("https://generativelanguage.googleapis.com/v1beta"),
|
|
9
|
+
});
|
|
10
|
+
export const DeepSeekConfigSchema = z.object({
|
|
11
|
+
apiKey: z.string().optional(),
|
|
12
|
+
model: z.string().default("deepseek-chat"),
|
|
13
|
+
apiBaseUrl: z.string().default("https://api.deepseek.com"),
|
|
14
|
+
});
|
|
15
|
+
export const LogNexusConfigSchema = z.object({
|
|
16
|
+
provider: ProviderTypeSchema.default("gemini"),
|
|
17
|
+
gemini: GeminiConfigSchema.default({
|
|
18
|
+
model: "gemini-3.8-flash",
|
|
19
|
+
apiBaseUrl: "https://generativelanguage.googleapis.com/v1beta",
|
|
20
|
+
}),
|
|
21
|
+
deepseek: DeepSeekConfigSchema.default({
|
|
22
|
+
model: "deepseek-chat",
|
|
23
|
+
apiBaseUrl: "https://api.deepseek.com",
|
|
24
|
+
}),
|
|
25
|
+
});
|
|
26
|
+
export function loadConfigFile(customPath) {
|
|
27
|
+
const candidates = customPath
|
|
28
|
+
? [customPath]
|
|
29
|
+
: [
|
|
30
|
+
path.resolve(process.cwd(), ".lognexus/config.json"),
|
|
31
|
+
path.resolve(process.cwd(), ".shiplog/config.json"),
|
|
32
|
+
];
|
|
33
|
+
for (const candidate of candidates) {
|
|
34
|
+
if (fs.existsSync(candidate)) {
|
|
35
|
+
try {
|
|
36
|
+
const raw = fs.readFileSync(candidate, "utf-8");
|
|
37
|
+
return JSON.parse(raw);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// ignore parse errors and proceed to next/defaults
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return {};
|
|
45
|
+
}
|
|
46
|
+
export function loadConfig(customConfigPath, env = process.env) {
|
|
47
|
+
const fileConfig = loadConfigFile(customConfigPath);
|
|
48
|
+
const merged = {
|
|
49
|
+
provider: env.LOGNEXUS_PROVIDER || fileConfig.provider || "gemini",
|
|
50
|
+
gemini: {
|
|
51
|
+
apiKey: env.GEMINI_API_KEY || fileConfig.gemini?.apiKey,
|
|
52
|
+
model: env.GEMINI_MODEL || fileConfig.gemini?.model || "gemini-3.8-flash",
|
|
53
|
+
apiBaseUrl: env.GEMINI_BASE_URL ||
|
|
54
|
+
fileConfig.gemini?.apiBaseUrl ||
|
|
55
|
+
"https://generativelanguage.googleapis.com/v1beta",
|
|
56
|
+
},
|
|
57
|
+
deepseek: {
|
|
58
|
+
apiKey: env.DEEPSEEK_API_KEY || fileConfig.deepseek?.apiKey,
|
|
59
|
+
model: env.DEEPSEEK_MODEL || fileConfig.deepseek?.model || "deepseek-chat",
|
|
60
|
+
apiBaseUrl: env.DEEPSEEK_BASE_URL || fileConfig.deepseek?.apiBaseUrl || "https://api.deepseek.com",
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
return LogNexusConfigSchema.parse(merged);
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=loadConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadConfig.js","sourceRoot":"","sources":["../../src/config/loadConfig.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from "./config/loadConfig.js";
|
|
2
|
+
export * from "./providers/deepseek.js";
|
|
3
|
+
export * from "./providers/factory.js";
|
|
4
|
+
export * from "./providers/gemini.js";
|
|
5
|
+
export * from "./providers/openaiCompatible.js";
|
|
6
|
+
export * from "./providers/types.js";
|
|
7
|
+
export * from "./routing/tierRouter.js";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iCAAiC,CAAC;AAChD,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from "./config/loadConfig.js";
|
|
2
|
+
export * from "./providers/deepseek.js";
|
|
3
|
+
export * from "./providers/factory.js";
|
|
4
|
+
export * from "./providers/gemini.js";
|
|
5
|
+
export * from "./providers/openaiCompatible.js";
|
|
6
|
+
export * from "./providers/types.js";
|
|
7
|
+
export * from "./routing/tierRouter.js";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iCAAiC,CAAC;AAChD,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { OpenAICompatibleProvider } from "./openaiCompatible.js";
|
|
2
|
+
export interface DeepSeekProviderOptions {
|
|
3
|
+
apiKey?: string;
|
|
4
|
+
model?: string;
|
|
5
|
+
apiBaseUrl?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare class DeepSeekProvider extends OpenAICompatibleProvider {
|
|
8
|
+
constructor(options?: DeepSeekProviderOptions);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=deepseek.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deepseek.d.ts","sourceRoot":"","sources":["../../src/providers/deepseek.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAE/F,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,gBAAiB,SAAQ,wBAAwB;IAC5D,YAAY,OAAO,GAAE,uBAA4B,EAQhD;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { OpenAICompatibleProvider } from "./openaiCompatible.js";
|
|
2
|
+
export class DeepSeekProvider extends OpenAICompatibleProvider {
|
|
3
|
+
constructor(options = {}) {
|
|
4
|
+
const opts = {
|
|
5
|
+
id: "deepseek",
|
|
6
|
+
apiKey: options.apiKey,
|
|
7
|
+
model: options.model || "deepseek-chat",
|
|
8
|
+
apiBaseUrl: options.apiBaseUrl || "https://api.deepseek.com",
|
|
9
|
+
};
|
|
10
|
+
super(opts);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=deepseek.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deepseek.js","sourceRoot":"","sources":["../../src/providers/deepseek.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAQ/F,MAAM,OAAO,gBAAiB,SAAQ,wBAAwB;IAC5D,YAAY,OAAO,GAA4B,EAAE;QAC/C,MAAM,IAAI,GAA4B;YACpC,EAAE,EAAE,UAAU;YACd,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,eAAe;YACvC,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,0BAA0B;SAC7D,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,CAAC;IACd,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/providers/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAG5E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAgB,cAAc,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,GAAG,WAAW,CAmBtF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { DeepSeekProvider } from "./deepseek.js";
|
|
2
|
+
import { GeminiProvider } from "./gemini.js";
|
|
3
|
+
export function createProvider(type, config) {
|
|
4
|
+
switch (type) {
|
|
5
|
+
case "gemini":
|
|
6
|
+
return new GeminiProvider({
|
|
7
|
+
apiKey: config.gemini.apiKey,
|
|
8
|
+
model: config.gemini.model,
|
|
9
|
+
apiBaseUrl: config.gemini.apiBaseUrl,
|
|
10
|
+
});
|
|
11
|
+
case "deepseek":
|
|
12
|
+
return new DeepSeekProvider({
|
|
13
|
+
apiKey: config.deepseek.apiKey,
|
|
14
|
+
model: config.deepseek.model,
|
|
15
|
+
apiBaseUrl: config.deepseek.apiBaseUrl,
|
|
16
|
+
});
|
|
17
|
+
default: {
|
|
18
|
+
const exhaustiveCheck = type;
|
|
19
|
+
throw new Error(`Unsupported provider: ${exhaustiveCheck}`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/providers/factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,MAAM,UAAU,cAAc,CAAC,IAAkB,EAAE,MAAsB;IACvE,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,IAAI,cAAc,CAAC;gBACxB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;gBAC5B,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK;gBAC1B,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU;aACrC,CAAC,CAAC;QACL,KAAK,UAAU;YACb,OAAO,IAAI,gBAAgB,CAAC;gBAC1B,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM;gBAC9B,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK;gBAC5B,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU;aACvC,CAAC,CAAC;QACL,SAAS,CAAC;YACR,MAAM,eAAe,GAAU,IAAI,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,yBAAyB,eAAe,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { GenerateRequest, LLMProvider, LLMResponse, ProviderHealth } from "./types.js";
|
|
2
|
+
export interface GeminiProviderOptions {
|
|
3
|
+
apiKey?: string;
|
|
4
|
+
model?: string;
|
|
5
|
+
apiBaseUrl?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare class GeminiProvider implements LLMProvider {
|
|
8
|
+
readonly id = "gemini";
|
|
9
|
+
private apiKey?;
|
|
10
|
+
private defaultModel;
|
|
11
|
+
private apiBaseUrl;
|
|
12
|
+
constructor(options?: GeminiProviderOptions);
|
|
13
|
+
private mapRole;
|
|
14
|
+
generate(req: GenerateRequest): Promise<LLMResponse>;
|
|
15
|
+
healthCheck(): Promise<ProviderHealth>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=gemini.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/providers/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EAEf,WAAW,EACX,WAAW,EACX,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,cAAe,YAAW,WAAW;IAChD,SAAgB,EAAE,YAAY;IAC9B,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,UAAU,CAAS;IAE3B,YAAY,OAAO,GAAE,qBAA0B,EAI9C;IAED,OAAO,CAAC,OAAO;IAIF,QAAQ,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC,CAuFhE;IAEY,WAAW,IAAI,OAAO,CAAC,cAAc,CAAC,CAyBlD;CACF"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
export class GeminiProvider {
|
|
2
|
+
id = "gemini";
|
|
3
|
+
apiKey;
|
|
4
|
+
defaultModel;
|
|
5
|
+
apiBaseUrl;
|
|
6
|
+
constructor(options = {}) {
|
|
7
|
+
this.apiKey = options.apiKey;
|
|
8
|
+
this.defaultModel = options.model || "gemini-3.8-flash";
|
|
9
|
+
this.apiBaseUrl = options.apiBaseUrl || "https://generativelanguage.googleapis.com/v1beta";
|
|
10
|
+
}
|
|
11
|
+
mapRole(role) {
|
|
12
|
+
return role === "assistant" ? "model" : "user";
|
|
13
|
+
}
|
|
14
|
+
async generate(req) {
|
|
15
|
+
if (!this.apiKey) {
|
|
16
|
+
throw new Error("Gemini API key is required. Set GEMINI_API_KEY in your environment or .lognexus/config.json");
|
|
17
|
+
}
|
|
18
|
+
const model = req.model || this.defaultModel;
|
|
19
|
+
const url = `${this.apiBaseUrl}/models/${encodeURIComponent(model)}:generateContent`;
|
|
20
|
+
const systemMessages = req.messages.filter((m) => m.role === "system");
|
|
21
|
+
const nonSystemMessages = req.messages.filter((m) => m.role !== "system");
|
|
22
|
+
const contents = nonSystemMessages.map((msg) => ({
|
|
23
|
+
role: this.mapRole(msg.role),
|
|
24
|
+
parts: [{ text: msg.content }],
|
|
25
|
+
}));
|
|
26
|
+
const payload = {
|
|
27
|
+
contents,
|
|
28
|
+
};
|
|
29
|
+
if (systemMessages.length > 0) {
|
|
30
|
+
payload.systemInstruction = {
|
|
31
|
+
parts: [{ text: systemMessages.map((m) => m.content).join("\n\n") }],
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
if (req.temperature !== undefined || req.maxTokens !== undefined) {
|
|
35
|
+
payload.generationConfig = {
|
|
36
|
+
...(req.temperature !== undefined ? { temperature: req.temperature } : {}),
|
|
37
|
+
...(req.maxTokens !== undefined ? { maxOutputTokens: req.maxTokens } : {}),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
const res = await fetch(url, {
|
|
41
|
+
method: "POST",
|
|
42
|
+
headers: {
|
|
43
|
+
"Content-Type": "application/json",
|
|
44
|
+
"x-goog-api-key": this.apiKey,
|
|
45
|
+
},
|
|
46
|
+
body: JSON.stringify(payload),
|
|
47
|
+
});
|
|
48
|
+
if (!res.ok) {
|
|
49
|
+
let errorDetails = `HTTP ${res.status} ${res.statusText}`;
|
|
50
|
+
try {
|
|
51
|
+
const errorJson = (await res.json());
|
|
52
|
+
if (errorJson.error?.message) {
|
|
53
|
+
errorDetails = errorJson.error.message;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
// Fallback to status text
|
|
58
|
+
}
|
|
59
|
+
throw new Error(`Gemini API Error: ${errorDetails}`);
|
|
60
|
+
}
|
|
61
|
+
const data = (await res.json());
|
|
62
|
+
const text = data.candidates?.[0]?.content?.parts?.[0]?.text ?? "";
|
|
63
|
+
const usage = data.usageMetadata
|
|
64
|
+
? {
|
|
65
|
+
promptTokens: data.usageMetadata.promptTokenCount ?? 0,
|
|
66
|
+
completionTokens: data.usageMetadata.candidatesTokenCount ?? 0,
|
|
67
|
+
totalTokens: data.usageMetadata.totalTokenCount ?? 0,
|
|
68
|
+
}
|
|
69
|
+
: undefined;
|
|
70
|
+
return {
|
|
71
|
+
text,
|
|
72
|
+
usage,
|
|
73
|
+
model,
|
|
74
|
+
provider: this.id,
|
|
75
|
+
raw: data,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
async healthCheck() {
|
|
79
|
+
if (!this.apiKey) {
|
|
80
|
+
return {
|
|
81
|
+
ok: false,
|
|
82
|
+
message: "Missing GEMINI_API_KEY in environment or configuration",
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
const start = Date.now();
|
|
86
|
+
try {
|
|
87
|
+
await this.generate({
|
|
88
|
+
messages: [{ role: "user", content: "Ping" }],
|
|
89
|
+
maxTokens: 1,
|
|
90
|
+
});
|
|
91
|
+
return {
|
|
92
|
+
ok: true,
|
|
93
|
+
message: `Connected successfully to Gemini (${this.defaultModel})`,
|
|
94
|
+
latencyMs: Date.now() - start,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
return {
|
|
99
|
+
ok: false,
|
|
100
|
+
message: err instanceof Error ? err.message : String(err),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=gemini.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/providers/gemini.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { GenerateRequest, LLMProvider, LLMResponse, ProviderHealth } from "./types.js";
|
|
2
|
+
export interface OpenAICompatibleOptions {
|
|
3
|
+
id?: string;
|
|
4
|
+
apiKey?: string;
|
|
5
|
+
model: string;
|
|
6
|
+
apiBaseUrl: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class OpenAICompatibleProvider implements LLMProvider {
|
|
9
|
+
readonly id: string;
|
|
10
|
+
protected apiKey?: string;
|
|
11
|
+
protected defaultModel: string;
|
|
12
|
+
protected apiBaseUrl: string;
|
|
13
|
+
constructor(options: OpenAICompatibleOptions);
|
|
14
|
+
generate(req: GenerateRequest): Promise<LLMResponse>;
|
|
15
|
+
healthCheck(): Promise<ProviderHealth>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=openaiCompatible.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openaiCompatible.d.ts","sourceRoot":"","sources":["../../src/providers/openaiCompatible.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5F,MAAM,WAAW,uBAAuB;IACtC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,wBAAyB,YAAW,WAAW;IAC1D,SAAgB,EAAE,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC;IAC/B,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC;IAE7B,YAAY,OAAO,EAAE,uBAAuB,EAK3C;IAEY,QAAQ,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC,CAmFhE;IAEY,WAAW,IAAI,OAAO,CAAC,cAAc,CAAC,CAyBlD;CACF"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
export class OpenAICompatibleProvider {
|
|
2
|
+
id;
|
|
3
|
+
apiKey;
|
|
4
|
+
defaultModel;
|
|
5
|
+
apiBaseUrl;
|
|
6
|
+
constructor(options) {
|
|
7
|
+
this.id = options.id || "openai-compatible";
|
|
8
|
+
this.apiKey = options.apiKey;
|
|
9
|
+
this.defaultModel = options.model;
|
|
10
|
+
this.apiBaseUrl = options.apiBaseUrl.replace(/\/+$/, "");
|
|
11
|
+
}
|
|
12
|
+
async generate(req) {
|
|
13
|
+
if (!this.apiKey) {
|
|
14
|
+
throw new Error(`API key is required for provider "${this.id}". Set appropriate environment variable or .lognexus/config.json`);
|
|
15
|
+
}
|
|
16
|
+
const model = req.model || this.defaultModel;
|
|
17
|
+
const url = `${this.apiBaseUrl}/chat/completions`;
|
|
18
|
+
const payload = {
|
|
19
|
+
model,
|
|
20
|
+
messages: req.messages.map((m) => ({
|
|
21
|
+
role: m.role,
|
|
22
|
+
content: m.content,
|
|
23
|
+
})),
|
|
24
|
+
};
|
|
25
|
+
if (req.temperature !== undefined) {
|
|
26
|
+
payload.temperature = req.temperature;
|
|
27
|
+
}
|
|
28
|
+
if (req.maxTokens !== undefined) {
|
|
29
|
+
payload.max_tokens = req.maxTokens;
|
|
30
|
+
}
|
|
31
|
+
if (req.responseFormat === "json") {
|
|
32
|
+
payload.response_format = { type: "json_object" };
|
|
33
|
+
}
|
|
34
|
+
const headers = {
|
|
35
|
+
"Content-Type": "application/json",
|
|
36
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
37
|
+
};
|
|
38
|
+
const res = await fetch(url, {
|
|
39
|
+
method: "POST",
|
|
40
|
+
headers,
|
|
41
|
+
body: JSON.stringify(payload),
|
|
42
|
+
});
|
|
43
|
+
if (!res.ok) {
|
|
44
|
+
let errorDetails = `HTTP ${res.status} ${res.statusText}`;
|
|
45
|
+
try {
|
|
46
|
+
const errorJson = (await res.json());
|
|
47
|
+
if (errorJson.error?.message) {
|
|
48
|
+
errorDetails = errorJson.error.message;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// Fallback
|
|
53
|
+
}
|
|
54
|
+
throw new Error(`${this.id} API Error: ${errorDetails}`);
|
|
55
|
+
}
|
|
56
|
+
const data = (await res.json());
|
|
57
|
+
const text = data.choices?.[0]?.message?.content ?? "";
|
|
58
|
+
const usage = data.usage
|
|
59
|
+
? {
|
|
60
|
+
promptTokens: data.usage.prompt_tokens ?? 0,
|
|
61
|
+
completionTokens: data.usage.completion_tokens ?? 0,
|
|
62
|
+
totalTokens: data.usage.total_tokens ?? 0,
|
|
63
|
+
}
|
|
64
|
+
: undefined;
|
|
65
|
+
return {
|
|
66
|
+
text,
|
|
67
|
+
usage,
|
|
68
|
+
model,
|
|
69
|
+
provider: this.id,
|
|
70
|
+
raw: data,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
async healthCheck() {
|
|
74
|
+
if (!this.apiKey) {
|
|
75
|
+
return {
|
|
76
|
+
ok: false,
|
|
77
|
+
message: `Missing API key for provider "${this.id}"`,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
const start = Date.now();
|
|
81
|
+
try {
|
|
82
|
+
await this.generate({
|
|
83
|
+
messages: [{ role: "user", content: "Ping" }],
|
|
84
|
+
maxTokens: 1,
|
|
85
|
+
});
|
|
86
|
+
return {
|
|
87
|
+
ok: true,
|
|
88
|
+
message: `Connected successfully to ${this.id} (${this.defaultModel})`,
|
|
89
|
+
latencyMs: Date.now() - start,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
return {
|
|
94
|
+
ok: false,
|
|
95
|
+
message: err instanceof Error ? err.message : String(err),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=openaiCompatible.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openaiCompatible.js","sourceRoot":"","sources":["../../src/providers/openaiCompatible.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export type MessageRole = "system" | "user" | "assistant";
|
|
2
|
+
export interface LLMMessage {
|
|
3
|
+
role: MessageRole;
|
|
4
|
+
content: string;
|
|
5
|
+
}
|
|
6
|
+
export interface GenerateRequest {
|
|
7
|
+
messages: LLMMessage[];
|
|
8
|
+
model?: string;
|
|
9
|
+
temperature?: number;
|
|
10
|
+
maxTokens?: number;
|
|
11
|
+
responseFormat?: "text" | "json";
|
|
12
|
+
}
|
|
13
|
+
export interface TokenUsage {
|
|
14
|
+
promptTokens: number;
|
|
15
|
+
completionTokens: number;
|
|
16
|
+
totalTokens: number;
|
|
17
|
+
}
|
|
18
|
+
export interface LLMResponse {
|
|
19
|
+
text: string;
|
|
20
|
+
usage?: TokenUsage;
|
|
21
|
+
model: string;
|
|
22
|
+
provider: string;
|
|
23
|
+
raw?: unknown;
|
|
24
|
+
}
|
|
25
|
+
export interface ProviderHealth {
|
|
26
|
+
ok: boolean;
|
|
27
|
+
message: string;
|
|
28
|
+
latencyMs?: number;
|
|
29
|
+
}
|
|
30
|
+
export interface LLMProvider {
|
|
31
|
+
readonly id: string;
|
|
32
|
+
generate(req: GenerateRequest): Promise<LLMResponse>;
|
|
33
|
+
healthCheck(): Promise<ProviderHealth>;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAE1D,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACrD,WAAW,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC;CACxC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { LogNexusConfig } from "../config/loadConfig.js";
|
|
2
|
+
import type { LLMProvider } from "../providers/types.js";
|
|
3
|
+
export type OperationTier = "tier-1" | "tier-2" | "tier-3";
|
|
4
|
+
export interface TierAssignment {
|
|
5
|
+
tier: OperationTier;
|
|
6
|
+
provider: LLMProvider;
|
|
7
|
+
model: string;
|
|
8
|
+
description: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function resolveTier(tier: OperationTier, config: LogNexusConfig): TierAssignment;
|
|
11
|
+
//# sourceMappingURL=tierRouter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tierRouter.d.ts","sourceRoot":"","sources":["../../src/routing/tierRouter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE3D,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,aAAa,CAAC;IACpB,QAAQ,EAAE,WAAW,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,GAAG,cAAc,CAuCvF"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { createProvider } from "../providers/factory.js";
|
|
2
|
+
export function resolveTier(tier, config) {
|
|
3
|
+
switch (tier) {
|
|
4
|
+
case "tier-1": {
|
|
5
|
+
// Tier 1 (Reasoning): Gemini Pro/Flash High or DeepSeek Reasoner
|
|
6
|
+
if (config.provider === "deepseek") {
|
|
7
|
+
return {
|
|
8
|
+
tier,
|
|
9
|
+
provider: createProvider("deepseek", config),
|
|
10
|
+
model: "deepseek-reasoner",
|
|
11
|
+
description: "High-reasoning architecture & review (DeepSeek Reasoner)",
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
return {
|
|
15
|
+
tier,
|
|
16
|
+
provider: createProvider("gemini", config),
|
|
17
|
+
model: config.gemini.model,
|
|
18
|
+
description: `High-reasoning architecture & review (Gemini: ${config.gemini.model})`,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
case "tier-2": {
|
|
22
|
+
// Tier 2 (Context): Ingestion, discovery, knowledge
|
|
23
|
+
return {
|
|
24
|
+
tier,
|
|
25
|
+
provider: createProvider("gemini", config),
|
|
26
|
+
model: config.gemini.model,
|
|
27
|
+
description: `Long-context codebase exploration & triage (Gemini: ${config.gemini.model})`,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
case "tier-3": {
|
|
31
|
+
// Tier 3 (Execution): DeepSeek Chat (or configured background provider)
|
|
32
|
+
const providerType = config.deepseek.apiKey ? "deepseek" : config.provider;
|
|
33
|
+
return {
|
|
34
|
+
tier,
|
|
35
|
+
provider: createProvider(providerType, config),
|
|
36
|
+
model: providerType === "deepseek" ? config.deepseek.model : config.gemini.model,
|
|
37
|
+
description: `Fast execution under closed delegation contract (${providerType})`,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=tierRouter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tierRouter.js","sourceRoot":"","sources":["../../src/routing/tierRouter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAYzD,MAAM,UAAU,WAAW,CAAC,IAAmB,EAAE,MAAsB;IACrE,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ,EAAE,CAAC;YACd,iEAAiE;YACjE,IAAI,MAAM,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;gBACnC,OAAO;oBACL,IAAI;oBACJ,QAAQ,EAAE,cAAc,CAAC,UAAU,EAAE,MAAM,CAAC;oBAC5C,KAAK,EAAE,mBAAmB;oBAC1B,WAAW,EAAE,0DAA0D;iBACxE,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,IAAI;gBACJ,QAAQ,EAAE,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAC1C,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK;gBAC1B,WAAW,EAAE,iDAAiD,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG;aACrF,CAAC;QACJ,CAAC;QACD,KAAK,QAAQ,EAAE,CAAC;YACd,oDAAoD;YACpD,OAAO;gBACL,IAAI;gBACJ,QAAQ,EAAE,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAC1C,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK;gBAC1B,WAAW,EAAE,uDAAuD,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG;aAC3F,CAAC;QACJ,CAAC;QACD,KAAK,QAAQ,EAAE,CAAC;YACd,wEAAwE;YACxE,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;YAC3E,OAAO;gBACL,IAAI;gBACJ,QAAQ,EAAE,cAAc,CAAC,YAAY,EAAE,MAAM,CAAC;gBAC9C,KAAK,EAAE,YAAY,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK;gBAChF,WAAW,EAAE,oDAAoD,YAAY,GAAG;aACjF,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,66 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@digital-lake/lognexus",
|
|
3
|
-
"version": "0.0.0
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "1.0.0-alpha.0",
|
|
4
|
+
"description": "The Git-powered memory nexus for AI agents. Multi-model routing, durable cognitive logs, and traceable pull requests.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"lognexus": "dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsc",
|
|
13
|
+
"lint": "biome check .",
|
|
14
|
+
"test": "vitest run",
|
|
15
|
+
"prepublishOnly": "npm run build && npm run test"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"git",
|
|
19
|
+
"ai",
|
|
20
|
+
"agents",
|
|
21
|
+
"orchestrator",
|
|
22
|
+
"gemini",
|
|
23
|
+
"deepseek",
|
|
24
|
+
"claude",
|
|
25
|
+
"memory",
|
|
26
|
+
"traceability",
|
|
27
|
+
"knowledge-graph"
|
|
28
|
+
],
|
|
29
|
+
"author": {
|
|
30
|
+
"name": "Digital Lake",
|
|
31
|
+
"url": "https://github.com/digital-lake-ai"
|
|
32
|
+
},
|
|
33
|
+
"contributors": [
|
|
34
|
+
{
|
|
35
|
+
"name": "devallibus",
|
|
36
|
+
"url": "https://github.com/devallibus"
|
|
37
|
+
}
|
|
38
|
+
],
|
|
39
|
+
"repository": {
|
|
40
|
+
"type": "git",
|
|
41
|
+
"url": "git+https://github.com/digital-lake-ai/lognexus.git"
|
|
42
|
+
},
|
|
43
|
+
"homepage": "https://github.com/digital-lake-ai/lognexus#readme",
|
|
44
|
+
"bugs": {
|
|
45
|
+
"url": "https://github.com/digital-lake-ai/lognexus/issues"
|
|
46
|
+
},
|
|
47
|
+
"license": "MIT",
|
|
48
|
+
"files": [
|
|
49
|
+
"dist",
|
|
50
|
+
"README.md",
|
|
51
|
+
"LICENSE",
|
|
52
|
+
"NOTICE.md"
|
|
53
|
+
],
|
|
54
|
+
"engines": {
|
|
55
|
+
"node": ">=20.0.0"
|
|
56
|
+
},
|
|
57
|
+
"dependencies": {
|
|
58
|
+
"zod": "^4.6.7"
|
|
59
|
+
},
|
|
60
|
+
"devDependencies": {
|
|
61
|
+
"@biomejs/biome": "^2.6.2",
|
|
62
|
+
"@types/node": "^26.6.5",
|
|
63
|
+
"typescript": "^7.0.2",
|
|
64
|
+
"vitest": "^5.0.5"
|
|
65
|
+
}
|
|
66
|
+
}
|