@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.
Files changed (40) hide show
  1. package/LICENSE +22 -0
  2. package/NOTICE.md +27 -0
  3. package/README.md +184 -2
  4. package/dist/cli.d.ts +3 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +116 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/config/loadConfig.d.ts +36 -0
  9. package/dist/config/loadConfig.d.ts.map +1 -0
  10. package/dist/config/loadConfig.js +65 -0
  11. package/dist/config/loadConfig.js.map +1 -0
  12. package/dist/index.d.ts +8 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +8 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/providers/deepseek.d.ts +10 -0
  17. package/dist/providers/deepseek.d.ts.map +1 -0
  18. package/dist/providers/deepseek.js +13 -0
  19. package/dist/providers/deepseek.js.map +1 -0
  20. package/dist/providers/factory.d.ts +4 -0
  21. package/dist/providers/factory.d.ts.map +1 -0
  22. package/dist/providers/factory.js +23 -0
  23. package/dist/providers/factory.js.map +1 -0
  24. package/dist/providers/gemini.d.ts +17 -0
  25. package/dist/providers/gemini.d.ts.map +1 -0
  26. package/dist/providers/gemini.js +105 -0
  27. package/dist/providers/gemini.js.map +1 -0
  28. package/dist/providers/openaiCompatible.d.ts +17 -0
  29. package/dist/providers/openaiCompatible.d.ts.map +1 -0
  30. package/dist/providers/openaiCompatible.js +100 -0
  31. package/dist/providers/openaiCompatible.js.map +1 -0
  32. package/dist/providers/types.d.ts +35 -0
  33. package/dist/providers/types.d.ts.map +1 -0
  34. package/dist/providers/types.js +2 -0
  35. package/dist/providers/types.js.map +1 -0
  36. package/dist/routing/tierRouter.d.ts +11 -0
  37. package/dist/routing/tierRouter.d.ts.map +1 -0
  38. package/dist/routing/tierRouter.js +42 -0
  39. package/dist/routing/tierRouter.js.map +1 -0
  40. 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
- # Temporary Holding Version
1
+ <p align="center">
2
+ <img src="docs/assets/logo.png" alt="LogNexus Logo" width="360">
3
+ </p>
2
4
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
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,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -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
@@ -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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"}
@@ -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,4 @@
1
+ import type { LogNexusConfig, ProviderType } from "../config/loadConfig.js";
2
+ import type { LLMProvider } from "./types.js";
3
+ export declare function createProvider(type: ProviderType, config: LogNexusConfig): LLMProvider;
4
+ //# sourceMappingURL=factory.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
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
+ }