chiasmus 0.1.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 (71) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +124 -0
  3. package/dist/formalize/engine.d.ts +47 -0
  4. package/dist/formalize/engine.d.ts.map +1 -0
  5. package/dist/formalize/engine.js +189 -0
  6. package/dist/formalize/engine.js.map +1 -0
  7. package/dist/formalize/validate.d.ts +15 -0
  8. package/dist/formalize/validate.d.ts.map +1 -0
  9. package/dist/formalize/validate.js +124 -0
  10. package/dist/formalize/validate.js.map +1 -0
  11. package/dist/llm/anthropic.d.ts +27 -0
  12. package/dist/llm/anthropic.d.ts.map +1 -0
  13. package/dist/llm/anthropic.js +86 -0
  14. package/dist/llm/anthropic.js.map +1 -0
  15. package/dist/llm/mock.d.ts +21 -0
  16. package/dist/llm/mock.d.ts.map +1 -0
  17. package/dist/llm/mock.js +29 -0
  18. package/dist/llm/mock.js.map +1 -0
  19. package/dist/llm/openai-compatible.d.ts +20 -0
  20. package/dist/llm/openai-compatible.d.ts.map +1 -0
  21. package/dist/llm/openai-compatible.js +46 -0
  22. package/dist/llm/openai-compatible.js.map +1 -0
  23. package/dist/llm/types.d.ts +11 -0
  24. package/dist/llm/types.d.ts.map +1 -0
  25. package/dist/llm/types.js +2 -0
  26. package/dist/llm/types.js.map +1 -0
  27. package/dist/mcp-server.d.ts +12 -0
  28. package/dist/mcp-server.d.ts.map +1 -0
  29. package/dist/mcp-server.js +446 -0
  30. package/dist/mcp-server.js.map +1 -0
  31. package/dist/skills/bm25.d.ts +22 -0
  32. package/dist/skills/bm25.d.ts.map +1 -0
  33. package/dist/skills/bm25.js +71 -0
  34. package/dist/skills/bm25.js.map +1 -0
  35. package/dist/skills/learner.d.ts +21 -0
  36. package/dist/skills/learner.d.ts.map +1 -0
  37. package/dist/skills/learner.js +123 -0
  38. package/dist/skills/learner.js.map +1 -0
  39. package/dist/skills/library.d.ts +36 -0
  40. package/dist/skills/library.d.ts.map +1 -0
  41. package/dist/skills/library.js +173 -0
  42. package/dist/skills/library.js.map +1 -0
  43. package/dist/skills/starters.d.ts +3 -0
  44. package/dist/skills/starters.d.ts.map +1 -0
  45. package/dist/skills/starters.js +381 -0
  46. package/dist/skills/starters.js.map +1 -0
  47. package/dist/skills/types.d.ts +54 -0
  48. package/dist/skills/types.d.ts.map +1 -0
  49. package/dist/skills/types.js +2 -0
  50. package/dist/skills/types.js.map +1 -0
  51. package/dist/solvers/correction-loop.d.ts +34 -0
  52. package/dist/solvers/correction-loop.d.ts.map +1 -0
  53. package/dist/solvers/correction-loop.js +52 -0
  54. package/dist/solvers/correction-loop.js.map +1 -0
  55. package/dist/solvers/prolog-solver.d.ts +3 -0
  56. package/dist/solvers/prolog-solver.d.ts.map +1 -0
  57. package/dist/solvers/prolog-solver.js +93 -0
  58. package/dist/solvers/prolog-solver.js.map +1 -0
  59. package/dist/solvers/session.d.ts +11 -0
  60. package/dist/solvers/session.d.ts.map +1 -0
  61. package/dist/solvers/session.js +25 -0
  62. package/dist/solvers/session.js.map +1 -0
  63. package/dist/solvers/types.d.ts +44 -0
  64. package/dist/solvers/types.d.ts.map +1 -0
  65. package/dist/solvers/types.js +2 -0
  66. package/dist/solvers/types.js.map +1 -0
  67. package/dist/solvers/z3-solver.d.ts +3 -0
  68. package/dist/solvers/z3-solver.d.ts.map +1 -0
  69. package/dist/solvers/z3-solver.js +81 -0
  70. package/dist/solvers/z3-solver.js.map +1 -0
  71. package/package.json +85 -0
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Lint and auto-fix a specification before sending to the solver.
3
+ * Fixes what it can, reports what it can't.
4
+ */
5
+ export function lintSpec(spec, solver) {
6
+ const fixes = [];
7
+ const errors = [];
8
+ let cleaned = spec;
9
+ // ── Auto-fixes (applied silently) ──────────────────────
10
+ // Strip markdown fences
11
+ const fencePattern = /^```(?:smt-lib|smtlib|smt2?|prolog|pl)?\s*\n?/gm;
12
+ if (fencePattern.test(cleaned)) {
13
+ cleaned = cleaned.replace(fencePattern, "").replace(/^```\s*$/gm, "");
14
+ fixes.push("Stripped markdown code fences");
15
+ }
16
+ // Trim whitespace
17
+ cleaned = cleaned.trim();
18
+ if (!cleaned) {
19
+ errors.push("Specification is empty after cleaning");
20
+ return { spec: cleaned, fixes, errors };
21
+ }
22
+ // Unfilled template slots — cannot auto-fix
23
+ const slotMatches = cleaned.match(/\{\{SLOT:\w+\}\}/g);
24
+ if (slotMatches) {
25
+ errors.push(`Unfilled template slots: ${slotMatches.join(", ")}`);
26
+ }
27
+ if (solver === "z3") {
28
+ ({ spec: cleaned } = lintSmtlib(cleaned, fixes, errors));
29
+ }
30
+ else {
31
+ ({ spec: cleaned } = lintProlog(cleaned, fixes, errors));
32
+ }
33
+ return { spec: cleaned, fixes, errors };
34
+ }
35
+ function lintSmtlib(spec, fixes, errors) {
36
+ let cleaned = spec;
37
+ // Auto-fix: remove (check-sat) and (get-model)
38
+ if (/\(\s*check-sat\s*\)/.test(cleaned)) {
39
+ cleaned = cleaned.replace(/\(\s*check-sat\s*\)/g, "");
40
+ fixes.push("Removed (check-sat) — added automatically by the solver");
41
+ }
42
+ if (/\(\s*get-model\s*\)/.test(cleaned)) {
43
+ cleaned = cleaned.replace(/\(\s*get-model\s*\)/g, "");
44
+ fixes.push("Removed (get-model) — added automatically by the solver");
45
+ }
46
+ if (/\(\s*exit\s*\)/.test(cleaned)) {
47
+ cleaned = cleaned.replace(/\(\s*exit\s*\)/g, "");
48
+ fixes.push("Removed (exit)");
49
+ }
50
+ // Auto-fix: remove (set-logic ...) — our solver handles this
51
+ if (/\(\s*set-logic\s+\w+\s*\)/.test(cleaned)) {
52
+ cleaned = cleaned.replace(/\(\s*set-logic\s+\w+\s*\)/g, "");
53
+ fixes.push("Removed (set-logic) — solver selects logic automatically");
54
+ }
55
+ cleaned = cleaned.trim();
56
+ // Check: balanced parentheses
57
+ let depth = 0;
58
+ for (let i = 0; i < cleaned.length; i++) {
59
+ const ch = cleaned[i];
60
+ // Skip string literals
61
+ if (ch === '"') {
62
+ i++;
63
+ while (i < cleaned.length && cleaned[i] !== '"') {
64
+ if (cleaned[i] === '\\')
65
+ i++;
66
+ i++;
67
+ }
68
+ continue;
69
+ }
70
+ // Skip line comments
71
+ if (ch === ';') {
72
+ while (i < cleaned.length && cleaned[i] !== '\n')
73
+ i++;
74
+ continue;
75
+ }
76
+ if (ch === '(')
77
+ depth++;
78
+ if (ch === ')')
79
+ depth--;
80
+ if (depth < 0) {
81
+ errors.push(`Unmatched closing parenthesis at position ${i}`);
82
+ break;
83
+ }
84
+ }
85
+ if (depth > 0) {
86
+ errors.push(`Unbalanced parentheses: ${depth} unclosed`);
87
+ }
88
+ return { spec: cleaned };
89
+ }
90
+ function lintProlog(spec, fixes, errors) {
91
+ let cleaned = spec;
92
+ // Auto-fix: remove ?- query line (we extract it separately)
93
+ // Don't report this as a fix since buildSolverInput handles it
94
+ // Strip comments and strings for structural analysis
95
+ const stripped = cleaned
96
+ .replace(/%.*$/gm, "")
97
+ .replace(/\/\*[\s\S]*?\*\//g, "")
98
+ .replace(/"[^"]*"/g, '""')
99
+ .replace(/'[^']*'/g, "''")
100
+ .trim();
101
+ if (!stripped)
102
+ return { spec: cleaned };
103
+ // Check: at least one clause ending with a period
104
+ if (!stripped.includes(".")) {
105
+ errors.push("No clauses ending with a period (.) — all Prolog clauses must end with a period");
106
+ }
107
+ // Check: balanced parentheses
108
+ let depth = 0;
109
+ for (const ch of stripped) {
110
+ if (ch === '(')
111
+ depth++;
112
+ if (ch === ')')
113
+ depth--;
114
+ if (depth < 0) {
115
+ errors.push("Unmatched closing parenthesis");
116
+ break;
117
+ }
118
+ }
119
+ if (depth > 0) {
120
+ errors.push(`Unbalanced parentheses: ${depth} unclosed`);
121
+ }
122
+ return { spec: cleaned };
123
+ }
124
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/formalize/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { LLMAdapter, LLMMessage } from "./types.js";
2
+ export interface AnthropicConfig {
3
+ apiKey: string;
4
+ model?: string;
5
+ baseUrl?: string;
6
+ maxTokens?: number;
7
+ }
8
+ export declare class AnthropicAdapter implements LLMAdapter {
9
+ private apiKey;
10
+ private model;
11
+ private baseUrl;
12
+ private maxTokens;
13
+ constructor(config: AnthropicConfig);
14
+ complete(system: string, messages: LLMMessage[]): Promise<string>;
15
+ }
16
+ /**
17
+ * Create an LLM adapter from environment variables, or null if not configured.
18
+ *
19
+ * Supported providers (checked in order):
20
+ * ANTHROPIC_API_KEY → Anthropic (Claude)
21
+ * DEEPSEEK_API_KEY → DeepSeek
22
+ * OPENAI_API_KEY → OpenAI
23
+ *
24
+ * Override base URL with CHIASMUS_API_URL and model with CHIASMUS_MODEL.
25
+ */
26
+ export declare function createLLMFromEnv(): LLMAdapter | null;
27
+ //# sourceMappingURL=anthropic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/llm/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAOzD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,gBAAiB,YAAW,UAAU;IACjD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,eAAe;IAO7B,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;CAiCxE;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,IAAI,UAAU,GAAG,IAAI,CAmCpD"}
@@ -0,0 +1,86 @@
1
+ import { OpenAICompatibleAdapter } from "./openai-compatible.js";
2
+ const DEFAULT_MODEL = "claude-sonnet-4-20250514";
3
+ const DEFAULT_URL = "https://api.anthropic.com/v1/messages";
4
+ const DEFAULT_MAX_TOKENS = 4096;
5
+ export class AnthropicAdapter {
6
+ apiKey;
7
+ model;
8
+ baseUrl;
9
+ maxTokens;
10
+ constructor(config) {
11
+ this.apiKey = config.apiKey;
12
+ this.model = config.model ?? DEFAULT_MODEL;
13
+ this.baseUrl = config.baseUrl ?? DEFAULT_URL;
14
+ this.maxTokens = config.maxTokens ?? DEFAULT_MAX_TOKENS;
15
+ }
16
+ async complete(system, messages) {
17
+ const body = {
18
+ model: this.model,
19
+ max_tokens: this.maxTokens,
20
+ system,
21
+ messages: messages.map((m) => ({
22
+ role: m.role,
23
+ content: m.content,
24
+ })),
25
+ };
26
+ const response = await fetch(this.baseUrl, {
27
+ method: "POST",
28
+ headers: {
29
+ "Content-Type": "application/json",
30
+ "x-api-key": this.apiKey,
31
+ "anthropic-version": "2023-06-01",
32
+ },
33
+ body: JSON.stringify(body),
34
+ });
35
+ if (!response.ok) {
36
+ const text = await response.text();
37
+ throw new Error(`Anthropic API error ${response.status}: ${text}`);
38
+ }
39
+ const data = (await response.json());
40
+ const textBlock = data.content.find((b) => b.type === "text");
41
+ return textBlock?.text ?? "";
42
+ }
43
+ }
44
+ /**
45
+ * Create an LLM adapter from environment variables, or null if not configured.
46
+ *
47
+ * Supported providers (checked in order):
48
+ * ANTHROPIC_API_KEY → Anthropic (Claude)
49
+ * DEEPSEEK_API_KEY → DeepSeek
50
+ * OPENAI_API_KEY → OpenAI
51
+ *
52
+ * Override base URL with CHIASMUS_API_URL and model with CHIASMUS_MODEL.
53
+ */
54
+ export function createLLMFromEnv() {
55
+ const model = process.env.CHIASMUS_MODEL;
56
+ const customUrl = process.env.CHIASMUS_API_URL;
57
+ // Anthropic
58
+ const anthropicKey = process.env.ANTHROPIC_API_KEY;
59
+ if (anthropicKey) {
60
+ return new AnthropicAdapter({
61
+ apiKey: anthropicKey,
62
+ model,
63
+ baseUrl: customUrl,
64
+ });
65
+ }
66
+ // DeepSeek / OpenAI-compatible
67
+ const deepseekKey = process.env.DEEPSEEK_API_KEY;
68
+ if (deepseekKey) {
69
+ return new OpenAICompatibleAdapter({
70
+ apiKey: deepseekKey,
71
+ baseUrl: customUrl ?? "https://api.deepseek.com",
72
+ model: model ?? "deepseek-chat",
73
+ });
74
+ }
75
+ // OpenAI
76
+ const openaiKey = process.env.OPENAI_API_KEY;
77
+ if (openaiKey) {
78
+ return new OpenAICompatibleAdapter({
79
+ apiKey: openaiKey,
80
+ baseUrl: customUrl ?? "https://api.openai.com/v1",
81
+ model: model ?? "gpt-4o",
82
+ });
83
+ }
84
+ return null;
85
+ }
86
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/llm/anthropic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { LLMAdapter, LLMMessage } from "./types.js";
2
+ /**
3
+ * Mock LLM adapter for testing. Returns pre-configured responses
4
+ * based on pattern matching against the user message.
5
+ */
6
+ export declare class MockLLMAdapter implements LLMAdapter {
7
+ responses: Array<{
8
+ pattern: RegExp;
9
+ response: string | (() => string);
10
+ }>;
11
+ private defaultResponse;
12
+ calls: Array<{
13
+ system: string;
14
+ messages: LLMMessage[];
15
+ }>;
16
+ constructor(defaultResponse?: string);
17
+ /** Register a response for messages matching a pattern */
18
+ onMatch(pattern: RegExp, response: string | (() => string)): this;
19
+ complete(system: string, messages: LLMMessage[]): Promise<string>;
20
+ }
21
+ //# sourceMappingURL=mock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../src/llm/mock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEzD;;;GAGG;AACH,qBAAa,cAAe,YAAW,UAAU;IAC/C,SAAS,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAA;KAAE,CAAC,CAAM;IAC9E,OAAO,CAAC,eAAe,CAAS;IACzB,KAAK,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,UAAU,EAAE,CAAA;KAAE,CAAC,CAAM;gBAEzD,eAAe,SAAK;IAIhC,0DAA0D;IAC1D,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,GAAG,IAAI;IAK3D,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;CAcxE"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Mock LLM adapter for testing. Returns pre-configured responses
3
+ * based on pattern matching against the user message.
4
+ */
5
+ export class MockLLMAdapter {
6
+ responses = [];
7
+ defaultResponse;
8
+ calls = [];
9
+ constructor(defaultResponse = "") {
10
+ this.defaultResponse = defaultResponse;
11
+ }
12
+ /** Register a response for messages matching a pattern */
13
+ onMatch(pattern, response) {
14
+ this.responses.push({ pattern, response });
15
+ return this;
16
+ }
17
+ async complete(system, messages) {
18
+ this.calls.push({ system, messages });
19
+ const lastUserMsg = messages.findLast((m) => m.role === "user")?.content ?? "";
20
+ const fullText = system + " " + lastUserMsg;
21
+ for (const entry of this.responses) {
22
+ if (entry.pattern.test(fullText)) {
23
+ return typeof entry.response === "function" ? entry.response() : entry.response;
24
+ }
25
+ }
26
+ return this.defaultResponse;
27
+ }
28
+ }
29
+ //# sourceMappingURL=mock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/llm/mock.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,OAAO,cAAc;IACzB,SAAS,GAAkE,EAAE,CAAC;IACtE,eAAe,CAAS;IACzB,KAAK,GAAsD,EAAE,CAAC;IAErE,YAAY,eAAe,GAAG,EAAE;QAC9B,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;IACzC,CAAC;IAED,0DAA0D;IAC1D,OAAO,CAAC,OAAe,EAAE,QAAiC;QACxD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,QAAsB;QACnD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEtC,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAa,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC;QAC3F,MAAM,QAAQ,GAAG,MAAM,GAAG,GAAG,GAAG,WAAW,CAAC;QAE5C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACjC,OAAO,OAAO,KAAK,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;YAClF,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;CACF"}
@@ -0,0 +1,20 @@
1
+ import type { LLMAdapter, LLMMessage } from "./types.js";
2
+ export interface OpenAICompatibleConfig {
3
+ apiKey: string;
4
+ baseUrl: string;
5
+ model: string;
6
+ maxTokens?: number;
7
+ }
8
+ /**
9
+ * Adapter for OpenAI-compatible APIs (DeepSeek, OpenRouter, Ollama, etc.)
10
+ * Uses the standard /chat/completions format.
11
+ */
12
+ export declare class OpenAICompatibleAdapter implements LLMAdapter {
13
+ private apiKey;
14
+ private baseUrl;
15
+ private model;
16
+ private maxTokens;
17
+ constructor(config: OpenAICompatibleConfig);
18
+ complete(system: string, messages: LLMMessage[]): Promise<string>;
19
+ }
20
+ //# sourceMappingURL=openai-compatible.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-compatible.d.ts","sourceRoot":"","sources":["../../src/llm/openai-compatible.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAIzD,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,UAAU;IACxD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,sBAAsB;IAOpC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;CAkCxE"}
@@ -0,0 +1,46 @@
1
+ const DEFAULT_MAX_TOKENS = 4096;
2
+ /**
3
+ * Adapter for OpenAI-compatible APIs (DeepSeek, OpenRouter, Ollama, etc.)
4
+ * Uses the standard /chat/completions format.
5
+ */
6
+ export class OpenAICompatibleAdapter {
7
+ apiKey;
8
+ baseUrl;
9
+ model;
10
+ maxTokens;
11
+ constructor(config) {
12
+ this.apiKey = config.apiKey;
13
+ this.baseUrl = config.baseUrl.replace(/\/+$/, "");
14
+ this.model = config.model;
15
+ this.maxTokens = config.maxTokens ?? DEFAULT_MAX_TOKENS;
16
+ }
17
+ async complete(system, messages) {
18
+ const body = {
19
+ model: this.model,
20
+ max_tokens: this.maxTokens,
21
+ messages: [
22
+ { role: "system", content: system },
23
+ ...messages.map((m) => ({
24
+ role: m.role,
25
+ content: m.content,
26
+ })),
27
+ ],
28
+ };
29
+ const url = `${this.baseUrl}/chat/completions`;
30
+ const response = await fetch(url, {
31
+ method: "POST",
32
+ headers: {
33
+ "Content-Type": "application/json",
34
+ Authorization: `Bearer ${this.apiKey}`,
35
+ },
36
+ body: JSON.stringify(body),
37
+ });
38
+ if (!response.ok) {
39
+ const text = await response.text();
40
+ throw new Error(`API error ${response.status}: ${text}`);
41
+ }
42
+ const data = (await response.json());
43
+ return data.choices?.[0]?.message?.content ?? "";
44
+ }
45
+ }
46
+ //# sourceMappingURL=openai-compatible.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-compatible.js","sourceRoot":"","sources":["../../src/llm/openai-compatible.ts"],"names":[],"mappings":"AAEA,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAShC;;;GAGG;AACH,MAAM,OAAO,uBAAuB;IAC1B,MAAM,CAAS;IACf,OAAO,CAAS;IAChB,KAAK,CAAS;IACd,SAAS,CAAS;IAE1B,YAAY,MAA8B;QACxC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,kBAAkB,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,QAAsB;QACnD,MAAM,IAAI,GAAG;YACX,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,IAAI,CAAC,SAAS;YAC1B,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,QAAiB,EAAE,OAAO,EAAE,MAAM,EAAE;gBAC5C,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACtB,IAAI,EAAE,CAAC,CAAC,IAA4B;oBACpC,OAAO,EAAE,CAAC,CAAC,OAAO;iBACnB,CAAC,CAAC;aACJ;SACF,CAAC;QAEF,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,mBAAmB,CAAC;QAC/C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;aACvC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,aAAa,QAAQ,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAElC,CAAC;QAEF,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;IACnD,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ /** A message in the LLM conversation */
2
+ export interface LLMMessage {
3
+ role: "user" | "assistant";
4
+ content: string;
5
+ }
6
+ /** Interface for LLM backends */
7
+ export interface LLMAdapter {
8
+ /** Generate a completion from a system prompt and messages */
9
+ complete(system: string, messages: LLMMessage[]): Promise<string>;
10
+ }
11
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/llm/types.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,iCAAiC;AACjC,MAAM,WAAW,UAAU;IACzB,8DAA8D;IAC9D,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACnE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/llm/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
3
+ import { SkillLibrary } from "./skills/library.js";
4
+ import { FormalizationEngine } from "./formalize/engine.js";
5
+ import type { LLMAdapter } from "./llm/types.js";
6
+ export declare function getChiasmusHome(): string;
7
+ export declare function createChiasmusServer(chiasmusHome?: string, llmOverride?: LLMAdapter | null): Promise<{
8
+ server: Server;
9
+ library: SkillLibrary;
10
+ formalizer: FormalizationEngine | null;
11
+ }>;
12
+ //# sourceMappingURL=mcp-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":";AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAQnE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGjD,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAiaD,wBAAsB,oBAAoB,CACxC,YAAY,CAAC,EAAE,MAAM,EACrB,WAAW,CAAC,EAAE,UAAU,GAAG,IAAI,GAC9B,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,YAAY,CAAC;IAAC,UAAU,EAAE,mBAAmB,GAAG,IAAI,CAAA;CAAE,CAAC,CA+C5F"}