@digital-lake/lognexus 1.0.0-alpha.0 → 1.0.0-alpha.4

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 (84) hide show
  1. package/README.md +86 -59
  2. package/dist/cli.js +271 -88
  3. package/dist/cli.js.map +1 -1
  4. package/dist/doctor.d.ts +10 -0
  5. package/dist/doctor.d.ts.map +1 -0
  6. package/dist/doctor.js +109 -0
  7. package/dist/doctor.js.map +1 -0
  8. package/dist/index.d.ts +12 -7
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +12 -7
  11. package/dist/index.js.map +1 -1
  12. package/dist/mcp/prompts.d.ts +30 -0
  13. package/dist/mcp/prompts.d.ts.map +1 -0
  14. package/dist/mcp/prompts.js +150 -0
  15. package/dist/mcp/prompts.js.map +1 -0
  16. package/dist/mcp/resources.d.ts +25 -0
  17. package/dist/mcp/resources.d.ts.map +1 -0
  18. package/dist/mcp/resources.js +75 -0
  19. package/dist/mcp/resources.js.map +1 -0
  20. package/dist/mcp/server.d.ts +22 -0
  21. package/dist/mcp/server.d.ts.map +1 -0
  22. package/dist/mcp/server.js +202 -0
  23. package/dist/mcp/server.js.map +1 -0
  24. package/dist/mcp/tools.d.ts +26 -0
  25. package/dist/mcp/tools.d.ts.map +1 -0
  26. package/dist/mcp/tools.js +197 -0
  27. package/dist/mcp/tools.js.map +1 -0
  28. package/dist/notes/attach.d.ts +20 -0
  29. package/dist/notes/attach.d.ts.map +1 -0
  30. package/dist/notes/attach.js +27 -0
  31. package/dist/notes/attach.js.map +1 -0
  32. package/dist/notes/notes.d.ts +14 -0
  33. package/dist/notes/notes.d.ts.map +1 -0
  34. package/dist/notes/notes.js +82 -0
  35. package/dist/notes/notes.js.map +1 -0
  36. package/dist/scaffold.d.ts +7 -0
  37. package/dist/scaffold.d.ts.map +1 -0
  38. package/dist/scaffold.js +33 -0
  39. package/dist/scaffold.js.map +1 -0
  40. package/dist/state/manager.d.ts +9 -0
  41. package/dist/state/manager.d.ts.map +1 -0
  42. package/dist/state/manager.js +72 -0
  43. package/dist/state/manager.js.map +1 -0
  44. package/dist/state/schema.d.ts +111 -0
  45. package/dist/state/schema.d.ts.map +1 -0
  46. package/dist/state/schema.js +31 -0
  47. package/dist/state/schema.js.map +1 -0
  48. package/dist/state/sync.d.ts +8 -0
  49. package/dist/state/sync.d.ts.map +1 -0
  50. package/dist/state/sync.js +79 -0
  51. package/dist/state/sync.js.map +1 -0
  52. package/dist/status.d.ts +9 -0
  53. package/dist/status.d.ts.map +1 -0
  54. package/dist/status.js +52 -0
  55. package/dist/status.js.map +1 -0
  56. package/package.json +7 -4
  57. package/dist/config/loadConfig.d.ts +0 -36
  58. package/dist/config/loadConfig.d.ts.map +0 -1
  59. package/dist/config/loadConfig.js +0 -65
  60. package/dist/config/loadConfig.js.map +0 -1
  61. package/dist/providers/deepseek.d.ts +0 -10
  62. package/dist/providers/deepseek.d.ts.map +0 -1
  63. package/dist/providers/deepseek.js +0 -13
  64. package/dist/providers/deepseek.js.map +0 -1
  65. package/dist/providers/factory.d.ts +0 -4
  66. package/dist/providers/factory.d.ts.map +0 -1
  67. package/dist/providers/factory.js +0 -23
  68. package/dist/providers/factory.js.map +0 -1
  69. package/dist/providers/gemini.d.ts +0 -17
  70. package/dist/providers/gemini.d.ts.map +0 -1
  71. package/dist/providers/gemini.js +0 -105
  72. package/dist/providers/gemini.js.map +0 -1
  73. package/dist/providers/openaiCompatible.d.ts +0 -17
  74. package/dist/providers/openaiCompatible.d.ts.map +0 -1
  75. package/dist/providers/openaiCompatible.js +0 -100
  76. package/dist/providers/openaiCompatible.js.map +0 -1
  77. package/dist/providers/types.d.ts +0 -35
  78. package/dist/providers/types.d.ts.map +0 -1
  79. package/dist/providers/types.js +0 -2
  80. package/dist/providers/types.js.map +0 -1
  81. package/dist/routing/tierRouter.d.ts +0 -11
  82. package/dist/routing/tierRouter.d.ts.map +0 -1
  83. package/dist/routing/tierRouter.js +0 -42
  84. package/dist/routing/tierRouter.js.map +0 -1
@@ -0,0 +1,33 @@
1
+ import { existsSync, mkdirSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ export const DEFAULT_ROUTING_TEMPLATE = `# Model-Tier Routing Configuration
4
+
5
+ # Modes: confirm (pause and prompt) | warn (banner only) | off (silent)
6
+ routing: confirm
7
+
8
+ # Operational Tier Taxonomy (Advisory across Claude, OpenAI, Gemini, DeepSeek)
9
+ # tier-1 (Reasoning / Arch / Review): Claude Opus, OpenAI o3/GPT, Gemini Pro, DeepSeek R1
10
+ # tier-2 (Context / Triage / Discovery): Claude Sonnet, GPT-4.1, Gemini Flash/Pro (1M), DeepSeek V3
11
+ # tier-3 (Scoped Execution / Commits): Claude Haiku, GPT-4o-mini, DeepSeek Chat (V3), Gemini Flash
12
+ `;
13
+ export function initProject(targetDir = process.cwd()) {
14
+ const result = { created: [], skipped: [] };
15
+ const lognexusDir = join(targetDir, ".lognexus");
16
+ if (!existsSync(lognexusDir)) {
17
+ mkdirSync(lognexusDir, { recursive: true });
18
+ result.created.push(".lognexus/");
19
+ }
20
+ else {
21
+ result.skipped.push(".lognexus/");
22
+ }
23
+ const routingPath = join(lognexusDir, "routing.md");
24
+ if (!existsSync(routingPath)) {
25
+ writeFileSync(routingPath, DEFAULT_ROUTING_TEMPLATE, "utf8");
26
+ result.created.push(".lognexus/routing.md");
27
+ }
28
+ else {
29
+ result.skipped.push(".lognexus/routing.md");
30
+ }
31
+ return result;
32
+ }
33
+ //# sourceMappingURL=scaffold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAOjC,MAAM,CAAC,MAAM,wBAAwB,GAAG;;;;;;;;;CASvC,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,SAAS,GAAW,OAAO,CAAC,GAAG,EAAE;IAC3D,MAAM,MAAM,GAAe,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACxD,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAEjD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACpC,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACpD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,aAAa,CAAC,WAAW,EAAE,wBAAwB,EAAE,MAAM,CAAC,CAAC;QAC7D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAC9C,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type LognexusState, type SubtaskContract } from "./schema.js";
2
+ export declare function getStatePath(targetDir?: string): string;
3
+ export declare function createEmptyState(): LognexusState;
4
+ export declare function loadState(targetDir?: string): LognexusState;
5
+ export declare function saveState(state: LognexusState, targetDir?: string): void;
6
+ export declare function clearState(targetDir?: string): LognexusState;
7
+ export declare function setSubtask(taskId: string, title?: string, contract?: SubtaskContract, targetDir?: string): LognexusState;
8
+ export declare function finishSubtask(taskId: string, targetDir?: string): LognexusState;
9
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/state/manager.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,aAAa,EAElB,KAAK,eAAe,EAErB,MAAM,aAAa,CAAC;AAErB,wBAAgB,YAAY,CAAC,SAAS,GAAE,MAAsB,GAAG,MAAM,CAEtE;AAED,wBAAgB,gBAAgB,IAAI,aAAa,CAQhD;AAED,wBAAgB,SAAS,CAAC,SAAS,GAAE,MAAsB,GAAG,aAAa,CAkB1E;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,aAAa,EAAE,SAAS,GAAE,MAAsB,GAAG,IAAI,CAUvF;AAED,wBAAgB,UAAU,CAAC,SAAS,GAAE,MAAsB,GAAG,aAAa,CAI3E;AAED,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAW,EAClB,QAAQ,CAAC,EAAE,eAAe,EAC1B,SAAS,GAAE,MAAsB,GAChC,aAAa,CAWf;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,MAAsB,GAAG,aAAa,CAU9F"}
@@ -0,0 +1,72 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { LognexusStateSchema, } from "./schema.js";
4
+ export function getStatePath(targetDir = process.cwd()) {
5
+ return join(targetDir, ".lognexus", "state.json");
6
+ }
7
+ export function createEmptyState() {
8
+ return {
9
+ schemaVersion: "1.0.0",
10
+ activeIssue: null,
11
+ currentSubtask: null,
12
+ completedSubtasks: [],
13
+ lastSync: new Date().toISOString(),
14
+ };
15
+ }
16
+ export function loadState(targetDir = process.cwd()) {
17
+ const filePath = getStatePath(targetDir);
18
+ if (!existsSync(filePath)) {
19
+ return createEmptyState();
20
+ }
21
+ try {
22
+ const raw = readFileSync(filePath, "utf8");
23
+ const json = JSON.parse(raw);
24
+ const parsed = LognexusStateSchema.safeParse(json);
25
+ if (parsed.success) {
26
+ return parsed.data;
27
+ }
28
+ return createEmptyState();
29
+ }
30
+ catch {
31
+ return createEmptyState();
32
+ }
33
+ }
34
+ export function saveState(state, targetDir = process.cwd()) {
35
+ const dirPath = join(targetDir, ".lognexus");
36
+ if (!existsSync(dirPath)) {
37
+ mkdirSync(dirPath, { recursive: true });
38
+ }
39
+ state.lastSync = new Date().toISOString();
40
+ const validated = LognexusStateSchema.parse(state);
41
+ const filePath = getStatePath(targetDir);
42
+ writeFileSync(filePath, JSON.stringify(validated, null, 2), "utf8");
43
+ }
44
+ export function clearState(targetDir = process.cwd()) {
45
+ const empty = createEmptyState();
46
+ saveState(empty, targetDir);
47
+ return empty;
48
+ }
49
+ export function setSubtask(taskId, title = "", contract, targetDir = process.cwd()) {
50
+ const state = loadState(targetDir);
51
+ const subtask = {
52
+ id: taskId,
53
+ title,
54
+ status: "in-progress",
55
+ contract,
56
+ };
57
+ state.currentSubtask = subtask;
58
+ saveState(state, targetDir);
59
+ return state;
60
+ }
61
+ export function finishSubtask(taskId, targetDir = process.cwd()) {
62
+ const state = loadState(targetDir);
63
+ if (!state.completedSubtasks.includes(taskId)) {
64
+ state.completedSubtasks.push(taskId);
65
+ }
66
+ if (state.currentSubtask?.id === taskId) {
67
+ state.currentSubtask = null;
68
+ }
69
+ saveState(state, targetDir);
70
+ return state;
71
+ }
72
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/state/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ import { z } from "zod";
2
+ export declare const SubtaskContractSchema: z.ZodObject<{
3
+ allowedFiles: z.ZodDefault<z.ZodArray<z.ZodString>>;
4
+ forbiddenFiles: z.ZodDefault<z.ZodArray<z.ZodString>>;
5
+ decisionBudget: z.ZodDefault<z.ZodEnum<{
6
+ full: "full";
7
+ narrow: "narrow";
8
+ none: "none";
9
+ }>>;
10
+ verificationCmd: z.ZodOptional<z.ZodString>;
11
+ }, z.core.$strip>;
12
+ export type SubtaskContract = z.infer<typeof SubtaskContractSchema>;
13
+ export declare const SubtaskStateSchema: z.ZodObject<{
14
+ id: z.ZodString;
15
+ title: z.ZodDefault<z.ZodString>;
16
+ status: z.ZodDefault<z.ZodEnum<{
17
+ completed: "completed";
18
+ "in-progress": "in-progress";
19
+ pending: "pending";
20
+ }>>;
21
+ contract: z.ZodOptional<z.ZodObject<{
22
+ allowedFiles: z.ZodDefault<z.ZodArray<z.ZodString>>;
23
+ forbiddenFiles: z.ZodDefault<z.ZodArray<z.ZodString>>;
24
+ decisionBudget: z.ZodDefault<z.ZodEnum<{
25
+ full: "full";
26
+ narrow: "narrow";
27
+ none: "none";
28
+ }>>;
29
+ verificationCmd: z.ZodOptional<z.ZodString>;
30
+ }, z.core.$strip>>;
31
+ }, z.core.$strip>;
32
+ export type SubtaskState = z.infer<typeof SubtaskStateSchema>;
33
+ export declare const ActiveIssueStateSchema: z.ZodObject<{
34
+ id: z.ZodNumber;
35
+ title: z.ZodDefault<z.ZodString>;
36
+ branch: z.ZodString;
37
+ phase: z.ZodDefault<z.ZodEnum<{
38
+ branch: "branch";
39
+ commit: "commit";
40
+ discovery: "discovery";
41
+ done: "done";
42
+ plan: "plan";
43
+ pr: "pr";
44
+ review: "review";
45
+ }>>;
46
+ tier: z.ZodDefault<z.ZodEnum<{
47
+ "tier-1": "tier-1";
48
+ "tier-2": "tier-2";
49
+ "tier-3": "tier-3";
50
+ }>>;
51
+ readiness: z.ZodDefault<z.ZodEnum<{
52
+ blocked: "blocked";
53
+ done: "done";
54
+ draft: "draft";
55
+ "in-review": "in-review";
56
+ ready: "ready";
57
+ }>>;
58
+ }, z.core.$strip>;
59
+ export type ActiveIssueState = z.infer<typeof ActiveIssueStateSchema>;
60
+ export declare const LognexusStateSchema: z.ZodObject<{
61
+ schemaVersion: z.ZodDefault<z.ZodString>;
62
+ activeIssue: z.ZodDefault<z.ZodNullable<z.ZodObject<{
63
+ id: z.ZodNumber;
64
+ title: z.ZodDefault<z.ZodString>;
65
+ branch: z.ZodString;
66
+ phase: z.ZodDefault<z.ZodEnum<{
67
+ branch: "branch";
68
+ commit: "commit";
69
+ discovery: "discovery";
70
+ done: "done";
71
+ plan: "plan";
72
+ pr: "pr";
73
+ review: "review";
74
+ }>>;
75
+ tier: z.ZodDefault<z.ZodEnum<{
76
+ "tier-1": "tier-1";
77
+ "tier-2": "tier-2";
78
+ "tier-3": "tier-3";
79
+ }>>;
80
+ readiness: z.ZodDefault<z.ZodEnum<{
81
+ blocked: "blocked";
82
+ done: "done";
83
+ draft: "draft";
84
+ "in-review": "in-review";
85
+ ready: "ready";
86
+ }>>;
87
+ }, z.core.$strip>>>;
88
+ currentSubtask: z.ZodDefault<z.ZodNullable<z.ZodObject<{
89
+ id: z.ZodString;
90
+ title: z.ZodDefault<z.ZodString>;
91
+ status: z.ZodDefault<z.ZodEnum<{
92
+ completed: "completed";
93
+ "in-progress": "in-progress";
94
+ pending: "pending";
95
+ }>>;
96
+ contract: z.ZodOptional<z.ZodObject<{
97
+ allowedFiles: z.ZodDefault<z.ZodArray<z.ZodString>>;
98
+ forbiddenFiles: z.ZodDefault<z.ZodArray<z.ZodString>>;
99
+ decisionBudget: z.ZodDefault<z.ZodEnum<{
100
+ full: "full";
101
+ narrow: "narrow";
102
+ none: "none";
103
+ }>>;
104
+ verificationCmd: z.ZodOptional<z.ZodString>;
105
+ }, z.core.$strip>>;
106
+ }, z.core.$strip>>>;
107
+ completedSubtasks: z.ZodDefault<z.ZodArray<z.ZodString>>;
108
+ lastSync: z.ZodDefault<z.ZodString>;
109
+ }, z.core.$strip>;
110
+ export type LognexusState = z.infer<typeof LognexusStateSchema>;
111
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/state/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,qBAAqB;;;;;;;;;iBAKhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;iBAK7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;iBASjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAM9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { z } from "zod";
2
+ export const SubtaskContractSchema = z.object({
3
+ allowedFiles: z.array(z.string()).default([]),
4
+ forbiddenFiles: z.array(z.string()).default([]),
5
+ decisionBudget: z.enum(["none", "narrow", "full"]).default("none"),
6
+ verificationCmd: z.string().optional(),
7
+ });
8
+ export const SubtaskStateSchema = z.object({
9
+ id: z.string(),
10
+ title: z.string().default(""),
11
+ status: z.enum(["pending", "in-progress", "completed"]).default("pending"),
12
+ contract: SubtaskContractSchema.optional(),
13
+ });
14
+ export const ActiveIssueStateSchema = z.object({
15
+ id: z.number(),
16
+ title: z.string().default(""),
17
+ branch: z.string(),
18
+ phase: z
19
+ .enum(["plan", "branch", "discovery", "commit", "pr", "review", "done"])
20
+ .default("branch"),
21
+ tier: z.enum(["tier-1", "tier-2", "tier-3"]).default("tier-3"),
22
+ readiness: z.enum(["draft", "ready", "blocked", "in-review", "done"]).default("ready"),
23
+ });
24
+ export const LognexusStateSchema = z.object({
25
+ schemaVersion: z.string().default("1.0.0"),
26
+ activeIssue: ActiveIssueStateSchema.nullable().default(null),
27
+ currentSubtask: SubtaskStateSchema.nullable().default(null),
28
+ completedSubtasks: z.array(z.string()).default([]),
29
+ lastSync: z.string().default(() => new Date().toISOString()),
30
+ });
31
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/state/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC7C,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC/C,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IAClE,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACvC,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAC7B,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IAC1E,QAAQ,EAAE,qBAAqB,CAAC,QAAQ,EAAE;CAC3C,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAC7B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,KAAK,EAAE,CAAC;SACL,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;SACvE,OAAO,CAAC,QAAQ,CAAC;IACpB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC9D,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;CACvF,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;IAC1C,WAAW,EAAE,sBAAsB,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAC5D,cAAc,EAAE,kBAAkB,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3D,iBAAiB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAClD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;CAC7D,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { ActiveIssueState, LognexusState } from "./schema.js";
2
+ export declare function getBranchName(targetDir?: string): string | null;
3
+ export declare function fetchIssueMeta(issueId: number, targetDir?: string): {
4
+ title: string;
5
+ readiness: ActiveIssueState["readiness"];
6
+ } | null;
7
+ export declare function syncStateFromGit(targetDir?: string): LognexusState;
8
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/state/sync.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEnE,wBAAgB,aAAa,CAAC,SAAS,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CAW9E;AAED,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,SAAS,GAAE,MAAsB,GAChC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAA;CAAE,GAAG,IAAI,CA0BpE;AAED,wBAAgB,gBAAgB,CAAC,SAAS,GAAE,MAAsB,GAAG,aAAa,CAuCjF"}
@@ -0,0 +1,79 @@
1
+ import { execSync } from "node:child_process";
2
+ import { loadState, saveState } from "./manager.js";
3
+ export function getBranchName(targetDir = process.cwd()) {
4
+ try {
5
+ const branch = execSync("git branch --show-current", {
6
+ cwd: targetDir,
7
+ encoding: "utf8",
8
+ stdio: ["pipe", "pipe", "pipe"],
9
+ }).trim();
10
+ return branch || null;
11
+ }
12
+ catch {
13
+ return null;
14
+ }
15
+ }
16
+ export function fetchIssueMeta(issueId, targetDir = process.cwd()) {
17
+ try {
18
+ const raw = execSync(`gh issue view ${issueId} --json title,state,labels`, {
19
+ cwd: targetDir,
20
+ encoding: "utf8",
21
+ stdio: ["pipe", "pipe", "pipe"],
22
+ });
23
+ const parsed = JSON.parse(raw);
24
+ const title = parsed.title ?? "";
25
+ let readiness = "ready";
26
+ const labels = parsed.labels ?? [];
27
+ const labelNames = labels.map((l) => l.name);
28
+ if (labelNames.includes("lognexus/needs-review")) {
29
+ readiness = "in-review";
30
+ }
31
+ else if (labelNames.includes("lognexus/in-progress")) {
32
+ readiness = "ready";
33
+ }
34
+ else if (labelNames.includes("lognexus/blocker")) {
35
+ readiness = "blocked";
36
+ }
37
+ return { title, readiness };
38
+ }
39
+ catch {
40
+ return null;
41
+ }
42
+ }
43
+ export function syncStateFromGit(targetDir = process.cwd()) {
44
+ const state = loadState(targetDir);
45
+ const branch = getBranchName(targetDir);
46
+ if (!branch || branch === "main" || branch === "master") {
47
+ state.activeIssue = null;
48
+ state.currentSubtask = null;
49
+ saveState(state, targetDir);
50
+ return state;
51
+ }
52
+ const match = branch.match(/issue\/(\d+)(?:-(.*))?/i);
53
+ if (match) {
54
+ const issueId = Number.parseInt(match[1], 10);
55
+ const slug = match[2] ? match[2].replace(/-/g, " ") : `Issue #${issueId}`;
56
+ let title = slug;
57
+ let readiness = "ready";
58
+ const remoteMeta = fetchIssueMeta(issueId, targetDir);
59
+ if (remoteMeta) {
60
+ if (remoteMeta.title)
61
+ title = remoteMeta.title;
62
+ readiness = remoteMeta.readiness;
63
+ }
64
+ state.activeIssue = {
65
+ id: issueId,
66
+ title,
67
+ branch,
68
+ phase: "commit",
69
+ tier: "tier-3",
70
+ readiness,
71
+ };
72
+ }
73
+ else {
74
+ state.activeIssue = null;
75
+ }
76
+ saveState(state, targetDir);
77
+ return state;
78
+ }
79
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/state/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface ProjectStatus {
2
+ branch: string;
3
+ isInsideGit: boolean;
4
+ activeIssue: string | null;
5
+ routingMode: string;
6
+ recommendedTier: string;
7
+ }
8
+ export declare function getProjectStatus(targetDir?: string): ProjectStatus;
9
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,gBAAgB,CAAC,SAAS,GAAE,MAAsB,GAAG,aAAa,CAoDjF"}
package/dist/status.js ADDED
@@ -0,0 +1,52 @@
1
+ import { execSync } from "node:child_process";
2
+ import { existsSync, readFileSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ export function getProjectStatus(targetDir = process.cwd()) {
5
+ let isInsideGit = false;
6
+ let branch = "detached";
7
+ try {
8
+ const inside = execSync("git rev-parse --is-inside-work-tree", {
9
+ cwd: targetDir,
10
+ encoding: "utf8",
11
+ stdio: ["pipe", "pipe", "pipe"],
12
+ }).trim();
13
+ isInsideGit = inside === "true";
14
+ if (isInsideGit) {
15
+ branch =
16
+ execSync("git branch --show-current", {
17
+ cwd: targetDir,
18
+ encoding: "utf8",
19
+ stdio: ["pipe", "pipe", "pipe"],
20
+ }).trim() || "detached";
21
+ }
22
+ }
23
+ catch {
24
+ isInsideGit = false;
25
+ }
26
+ let activeIssue = null;
27
+ const match = branch.match(/issue\/(\d+)/i);
28
+ if (match) {
29
+ activeIssue = `#${match[1]}`;
30
+ }
31
+ let routingMode = "not configured";
32
+ const routingFile = join(targetDir, ".lognexus", "routing.md");
33
+ if (existsSync(routingFile)) {
34
+ const content = readFileSync(routingFile, "utf8");
35
+ const m = content.match(/routing:\s*(confirm|warn|off)/i);
36
+ if (m)
37
+ routingMode = m[1].toLowerCase();
38
+ }
39
+ let recommendedTier = "tier-1 (Reasoning / Planning: Claude Opus, OpenAI o3, Gemini Pro, DeepSeek R1)";
40
+ if (activeIssue) {
41
+ recommendedTier =
42
+ "tier-3 (Scoped Execution: Claude Haiku, GPT-4o-mini, DeepSeek Chat, Gemini Flash)";
43
+ }
44
+ return {
45
+ branch,
46
+ isInsideGit,
47
+ activeIssue,
48
+ routingMode,
49
+ recommendedTier,
50
+ };
51
+ }
52
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAUjC,MAAM,UAAU,gBAAgB,CAAC,SAAS,GAAW,OAAO,CAAC,GAAG,EAAE;IAChE,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,MAAM,GAAG,UAAU,CAAC;IAExB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,qCAAqC,EAAE;YAC7D,GAAG,EAAE,SAAS;YACd,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC,IAAI,EAAE,CAAC;QACV,WAAW,GAAG,MAAM,KAAK,MAAM,CAAC;QAEhC,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM;gBACJ,QAAQ,CAAC,2BAA2B,EAAE;oBACpC,GAAG,EAAE,SAAS;oBACd,QAAQ,EAAE,MAAM;oBAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;iBAChC,CAAC,CAAC,IAAI,EAAE,IAAI,UAAU,CAAC;QAC5B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,WAAW,GAAG,KAAK,CAAC;IACtB,CAAC;IAED,IAAI,WAAW,GAAkB,IAAI,CAAC;IACtC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAC5C,IAAI,KAAK,EAAE,CAAC;QACV,WAAW,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/B,CAAC;IAED,IAAI,WAAW,GAAG,gBAAgB,CAAC;IACnC,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IAC/D,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAClD,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAC1D,IAAI,CAAC;YAAE,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1C,CAAC;IAED,IAAI,eAAe,GACjB,gFAAgF,CAAC;IACnF,IAAI,WAAW,EAAE,CAAC;QAChB,eAAe;YACb,mFAAmF,CAAC;IACxF,CAAC;IAED,OAAO;QACL,MAAM;QACN,WAAW;QACX,WAAW;QACX,WAAW;QACX,eAAe;KAChB,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@digital-lake/lognexus",
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.",
3
+ "version": "1.0.0-alpha.4",
4
+ "description": "The Universal, Git-powered context & rules framework for native AI agents (Claude, OpenAI, Gemini, DeepSeek). Scaffolding CLI and repository governance.",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "lognexus": "dist/cli.js"
@@ -18,10 +18,13 @@
18
18
  "git",
19
19
  "ai",
20
20
  "agents",
21
- "orchestrator",
21
+ "claude",
22
+ "openai",
22
23
  "gemini",
23
24
  "deepseek",
24
- "claude",
25
+ "cursor",
26
+ "antigravity",
27
+ "orchestrator",
25
28
  "memory",
26
29
  "traceability",
27
30
  "knowledge-graph"
@@ -1,36 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,65 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"loadConfig.js","sourceRoot":"","sources":["../../src/config/loadConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;AAGjE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,kBAAkB,CAAC;IAC7C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,kDAAkD,CAAC;CACnF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC;IAC1C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,0BAA0B,CAAC;CAC3D,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,QAAQ,EAAE,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC9C,MAAM,EAAE,kBAAkB,CAAC,OAAO,CAAC;QACjC,KAAK,EAAE,kBAAkB;QACzB,UAAU,EAAE,kDAAkD;KAC/D,CAAC;IACF,QAAQ,EAAE,oBAAoB,CAAC,OAAO,CAAC;QACrC,KAAK,EAAE,eAAe;QACtB,UAAU,EAAE,0BAA0B;KACvC,CAAC;CACH,CAAC,CAAC;AAIH,MAAM,UAAU,cAAc,CAAC,UAAmB;IAChD,MAAM,UAAU,GAAG,UAAU;QAC3B,CAAC,CAAC,CAAC,UAAU,CAAC;QACd,CAAC,CAAC;YACE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,uBAAuB,CAAC;YACpD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,sBAAsB,CAAC;SACpD,CAAC;IAEN,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBAChD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;YAAC,MAAM,CAAC;gBACP,mDAAmD;YACrD,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,gBAAyB,EACzB,GAAG,GAAsB,OAAO,CAAC,GAAG;IAEpC,MAAM,UAAU,GAAG,cAAc,CAAC,gBAAgB,CAAC,CAAC;IAEpD,MAAM,MAAM,GAAG;QACb,QAAQ,EAAG,GAAG,CAAC,iBAAkC,IAAI,UAAU,CAAC,QAAQ,IAAI,QAAQ;QACpF,MAAM,EAAE;YACN,MAAM,EAAE,GAAG,CAAC,cAAc,IAAI,UAAU,CAAC,MAAM,EAAE,MAAM;YACvD,KAAK,EAAE,GAAG,CAAC,YAAY,IAAI,UAAU,CAAC,MAAM,EAAE,KAAK,IAAI,kBAAkB;YACzE,UAAU,EACR,GAAG,CAAC,eAAe;gBACnB,UAAU,CAAC,MAAM,EAAE,UAAU;gBAC7B,kDAAkD;SACrD;QACD,QAAQ,EAAE;YACR,MAAM,EAAE,GAAG,CAAC,gBAAgB,IAAI,UAAU,CAAC,QAAQ,EAAE,MAAM;YAC3D,KAAK,EAAE,GAAG,CAAC,cAAc,IAAI,UAAU,CAAC,QAAQ,EAAE,KAAK,IAAI,eAAe;YAC1E,UAAU,EACR,GAAG,CAAC,iBAAiB,IAAI,UAAU,CAAC,QAAQ,EAAE,UAAU,IAAI,0BAA0B;SACzF;KACF,CAAC;IAEF,OAAO,oBAAoB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC"}
@@ -1,10 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,13 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,4 +0,0 @@
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
@@ -1 +0,0 @@
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"}