@fasaled/sailkari 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.
- package/LICENSE +21 -0
- package/README.md +229 -0
- package/dist/application.d.ts +47 -0
- package/dist/application.js +100 -0
- package/dist/application.js.map +1 -0
- package/dist/autocomplete.d.ts +2 -0
- package/dist/autocomplete.js +62 -0
- package/dist/autocomplete.js.map +1 -0
- package/dist/classification-store.d.ts +20 -0
- package/dist/classification-store.js +83 -0
- package/dist/classification-store.js.map +1 -0
- package/dist/classifier.d.ts +6 -0
- package/dist/classifier.js +85 -0
- package/dist/classifier.js.map +1 -0
- package/dist/command-history.d.ts +12 -0
- package/dist/command-history.js +49 -0
- package/dist/command-history.js.map +1 -0
- package/dist/command-parser.d.ts +32 -0
- package/dist/command-parser.js +90 -0
- package/dist/command-parser.js.map +1 -0
- package/dist/command-queue.d.ts +21 -0
- package/dist/command-queue.js +33 -0
- package/dist/command-queue.js.map +1 -0
- package/dist/config.d.ts +8 -0
- package/dist/config.js +26 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +16 -0
- package/dist/context.js +12 -0
- package/dist/context.js.map +1 -0
- package/dist/evaluation-metrics.d.ts +22 -0
- package/dist/evaluation-metrics.js +120 -0
- package/dist/evaluation-metrics.js.map +1 -0
- package/dist/file-scanner.d.ts +2 -0
- package/dist/file-scanner.js +37 -0
- package/dist/file-scanner.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/llm-engine.d.ts +42 -0
- package/dist/llm-engine.js +181 -0
- package/dist/llm-engine.js.map +1 -0
- package/dist/logger.d.ts +15 -0
- package/dist/logger.js +48 -0
- package/dist/logger.js.map +1 -0
- package/dist/mcp.d.ts +8 -0
- package/dist/mcp.js +97 -0
- package/dist/mcp.js.map +1 -0
- package/dist/metadata.d.ts +4 -0
- package/dist/metadata.js +28 -0
- package/dist/metadata.js.map +1 -0
- package/dist/operation-worker.d.ts +1 -0
- package/dist/operation-worker.js +86 -0
- package/dist/operation-worker.js.map +1 -0
- package/dist/parser.d.ts +3 -0
- package/dist/parser.js +86 -0
- package/dist/parser.js.map +1 -0
- package/dist/progress.d.ts +4 -0
- package/dist/progress.js +56 -0
- package/dist/progress.js.map +1 -0
- package/dist/prompt.d.ts +19 -0
- package/dist/prompt.js +63 -0
- package/dist/prompt.js.map +1 -0
- package/dist/tui.d.ts +2 -0
- package/dist/tui.js +237 -0
- package/dist/tui.js.map +1 -0
- package/dist/types.d.ts +43 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/watcher.d.ts +9 -0
- package/dist/watcher.js +94 -0
- package/dist/watcher.js.map +1 -0
- package/package.json +62 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
if (process.argv.includes("--mcp")) {
|
|
3
|
+
const { runMcpServer } = await import("./mcp.js");
|
|
4
|
+
await runMcpServer();
|
|
5
|
+
}
|
|
6
|
+
else {
|
|
7
|
+
const [{ render }, React, { App }] = await Promise.all([
|
|
8
|
+
import("ink"),
|
|
9
|
+
import("react"),
|
|
10
|
+
import("./tui.js"),
|
|
11
|
+
]);
|
|
12
|
+
render(React.createElement(App), { alternateScreen: true });
|
|
13
|
+
}
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":";AAEA,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;IACpC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,YAAY,EAAE,CAAC;AACtB,CAAC;KAAM,CAAC;IACP,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACtD,MAAM,CAAC,KAAK,CAAC;QACb,MAAM,CAAC,OAAO,CAAC;QACf,MAAM,CAAC,UAAU,CAAC;KAClB,CAAC,CAAC;IACH,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { LlamaLogLevel } from "node-llama-cpp";
|
|
2
|
+
import type { ClassificationResult, Label } from "./types.js";
|
|
3
|
+
export declare const EFFECTIVE_LIMIT: number;
|
|
4
|
+
export type ProgressCallback = (current: number, total: number, message: string) => void;
|
|
5
|
+
export type NativeLogCallback = (level: LlamaLogLevel, message: string) => void;
|
|
6
|
+
export interface GenerationOptions {
|
|
7
|
+
systemPrompt: string;
|
|
8
|
+
prompt: string;
|
|
9
|
+
maxTokens?: number;
|
|
10
|
+
onToken?: (text: string) => void;
|
|
11
|
+
signal?: AbortSignal;
|
|
12
|
+
}
|
|
13
|
+
export interface EngineContext {
|
|
14
|
+
generate(options: GenerationOptions): Promise<string>;
|
|
15
|
+
clearHistory(): Promise<void>;
|
|
16
|
+
dispose(): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
export interface EngineModel {
|
|
19
|
+
createContext(): Promise<EngineContext>;
|
|
20
|
+
dispose(): Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
export interface EngineDriver {
|
|
23
|
+
loadModel(modelPath: string): Promise<EngineModel>;
|
|
24
|
+
dispose(): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
export declare function createLLMEngine(logger: NativeLogCallback): LLMEngine;
|
|
27
|
+
export declare class LLMEngine {
|
|
28
|
+
private readonly driver;
|
|
29
|
+
private model;
|
|
30
|
+
private disposed;
|
|
31
|
+
constructor(driver?: EngineDriver);
|
|
32
|
+
loadModel(modelPath: string): Promise<void>;
|
|
33
|
+
createContext(): Promise<EngineContext>;
|
|
34
|
+
generate(options: GenerationOptions): Promise<string>;
|
|
35
|
+
classify(content: string, labels: Label[], onProgress?: ProgressCallback, systemPrompt?: string, signal?: AbortSignal, context?: EngineContext): Promise<ClassificationResult | null>;
|
|
36
|
+
classifyChunked(content: string, labels: Label[], onProgress?: ProgressCallback, systemPrompt?: string, signal?: AbortSignal, context?: EngineContext): Promise<{
|
|
37
|
+
result: ClassificationResult | null;
|
|
38
|
+
chunks: number;
|
|
39
|
+
calls: number;
|
|
40
|
+
}>;
|
|
41
|
+
dispose(): Promise<void>;
|
|
42
|
+
}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { getLlama, LlamaChatSession, LlamaLogLevel, } from "node-llama-cpp";
|
|
2
|
+
import { parseResponse, selectLabelByMajority } from "./parser.js";
|
|
3
|
+
import { DEFAULT_SYSTEM_PROMPT, buildUserPayload } from "./prompt.js";
|
|
4
|
+
const MAX_CONTEXT = 32768;
|
|
5
|
+
const SYSTEM_RESERVE = 1024;
|
|
6
|
+
export const EFFECTIVE_LIMIT = MAX_CONTEXT - SYSTEM_RESERVE;
|
|
7
|
+
const noopProgress = () => { };
|
|
8
|
+
class NodeLlamaContext {
|
|
9
|
+
context;
|
|
10
|
+
constructor(context) {
|
|
11
|
+
this.context = context;
|
|
12
|
+
}
|
|
13
|
+
async generate(options) {
|
|
14
|
+
const session = new LlamaChatSession({
|
|
15
|
+
contextSequence: this.context.getSequence(),
|
|
16
|
+
systemPrompt: options.systemPrompt,
|
|
17
|
+
autoDisposeSequence: false,
|
|
18
|
+
});
|
|
19
|
+
try {
|
|
20
|
+
return await session.prompt(options.prompt, {
|
|
21
|
+
maxTokens: options.maxTokens ?? 64,
|
|
22
|
+
temperature: 0,
|
|
23
|
+
onTextChunk: options.onToken,
|
|
24
|
+
signal: options.signal,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
finally {
|
|
28
|
+
session.dispose();
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async dispose() {
|
|
32
|
+
await this.context.dispose();
|
|
33
|
+
}
|
|
34
|
+
async clearHistory() {
|
|
35
|
+
await this.context.getSequence().clearHistory();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
class NodeLlamaModel {
|
|
39
|
+
model;
|
|
40
|
+
constructor(model) {
|
|
41
|
+
this.model = model;
|
|
42
|
+
}
|
|
43
|
+
async createContext() {
|
|
44
|
+
const context = await this.model.createContext({
|
|
45
|
+
contextSize: MAX_CONTEXT,
|
|
46
|
+
});
|
|
47
|
+
return new NodeLlamaContext(context);
|
|
48
|
+
}
|
|
49
|
+
async dispose() {
|
|
50
|
+
await this.model.dispose();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
class NodeLlamaDriver {
|
|
54
|
+
logger;
|
|
55
|
+
llama = null;
|
|
56
|
+
constructor(logger) {
|
|
57
|
+
this.logger = logger;
|
|
58
|
+
}
|
|
59
|
+
async loadModel(modelPath) {
|
|
60
|
+
this.llama ??= await getLlama({
|
|
61
|
+
build: "never",
|
|
62
|
+
usePrebuiltBinaries: true,
|
|
63
|
+
logLevel: LlamaLogLevel.warn,
|
|
64
|
+
logger: this.logger,
|
|
65
|
+
});
|
|
66
|
+
const model = await this.llama.loadModel({ modelPath });
|
|
67
|
+
return new NodeLlamaModel(model);
|
|
68
|
+
}
|
|
69
|
+
async dispose() {
|
|
70
|
+
if (this.llama) {
|
|
71
|
+
await this.llama.dispose();
|
|
72
|
+
this.llama = null;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
export function createLLMEngine(logger) {
|
|
77
|
+
return new LLMEngine(new NodeLlamaDriver(logger));
|
|
78
|
+
}
|
|
79
|
+
export class LLMEngine {
|
|
80
|
+
driver;
|
|
81
|
+
model = null;
|
|
82
|
+
disposed = false;
|
|
83
|
+
constructor(driver = new NodeLlamaDriver()) {
|
|
84
|
+
this.driver = driver;
|
|
85
|
+
}
|
|
86
|
+
async loadModel(modelPath) {
|
|
87
|
+
if (this.disposed) {
|
|
88
|
+
throw new Error("The engine has been disposed.");
|
|
89
|
+
}
|
|
90
|
+
if (this.model) {
|
|
91
|
+
throw new Error("A model is already loaded. Dispose the engine before loading another model.");
|
|
92
|
+
}
|
|
93
|
+
this.model = await this.driver.loadModel(modelPath);
|
|
94
|
+
}
|
|
95
|
+
async createContext() {
|
|
96
|
+
if (!this.model) {
|
|
97
|
+
throw new Error("No model is loaded. Call loadModel() first.");
|
|
98
|
+
}
|
|
99
|
+
return this.model.createContext();
|
|
100
|
+
}
|
|
101
|
+
async generate(options) {
|
|
102
|
+
const context = await this.createContext();
|
|
103
|
+
try {
|
|
104
|
+
return await context.generate(options);
|
|
105
|
+
}
|
|
106
|
+
finally {
|
|
107
|
+
await context.dispose();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
async classify(content, labels, onProgress = noopProgress, systemPrompt = DEFAULT_SYSTEM_PROMPT, signal, context) {
|
|
111
|
+
signal?.throwIfAborted();
|
|
112
|
+
onProgress(0, 1, "classifying");
|
|
113
|
+
const options = {
|
|
114
|
+
systemPrompt,
|
|
115
|
+
prompt: buildUserPayload(labels, content),
|
|
116
|
+
signal,
|
|
117
|
+
};
|
|
118
|
+
const text = context ? await context.generate(options) : await this.generate(options);
|
|
119
|
+
onProgress(1, 1, "done");
|
|
120
|
+
const result = parseResponse(text, labels);
|
|
121
|
+
return result?.labels.length ? { labels: result.labels.slice(0, 1) } : null;
|
|
122
|
+
}
|
|
123
|
+
async classifyChunked(content, labels, onProgress = noopProgress, systemPrompt = DEFAULT_SYSTEM_PROMPT, signal, context) {
|
|
124
|
+
const chunkSize = EFFECTIVE_LIMIT - 2000;
|
|
125
|
+
const chunks = [];
|
|
126
|
+
let start = 0;
|
|
127
|
+
while (start < content.length) {
|
|
128
|
+
let end = start + chunkSize;
|
|
129
|
+
if (end < content.length) {
|
|
130
|
+
const spaceIndex = content.lastIndexOf(" ", end);
|
|
131
|
+
if (spaceIndex > start + chunkSize / 2) {
|
|
132
|
+
end = spaceIndex;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
chunks.push(content.slice(start, end));
|
|
136
|
+
start = end;
|
|
137
|
+
}
|
|
138
|
+
const labelCounts = {};
|
|
139
|
+
let calls = 0;
|
|
140
|
+
for (let i = 0; i < chunks.length; i++) {
|
|
141
|
+
signal?.throwIfAborted();
|
|
142
|
+
if (i > 0)
|
|
143
|
+
await context?.clearHistory();
|
|
144
|
+
onProgress(i, chunks.length, `chunk ${i + 1}/${chunks.length}`);
|
|
145
|
+
const chunk = chunks[i];
|
|
146
|
+
const options = {
|
|
147
|
+
systemPrompt,
|
|
148
|
+
prompt: buildUserPayload(labels, chunk),
|
|
149
|
+
signal,
|
|
150
|
+
};
|
|
151
|
+
const text = context ? await context.generate(options) : await this.generate(options);
|
|
152
|
+
calls++;
|
|
153
|
+
const parsed = parseResponse(text, labels);
|
|
154
|
+
if (parsed?.labels.length) {
|
|
155
|
+
const label = parsed.labels[0];
|
|
156
|
+
labelCounts[label] = (labelCounts[label] ?? 0) + 1;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
onProgress(chunks.length, chunks.length, "finalizing");
|
|
160
|
+
const winner = selectLabelByMajority(labelCounts);
|
|
161
|
+
return {
|
|
162
|
+
result: winner ? { labels: [winner] } : null,
|
|
163
|
+
chunks: chunks.length,
|
|
164
|
+
calls,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
async dispose() {
|
|
168
|
+
if (this.disposed)
|
|
169
|
+
return;
|
|
170
|
+
this.disposed = true;
|
|
171
|
+
const model = this.model;
|
|
172
|
+
this.model = null;
|
|
173
|
+
try {
|
|
174
|
+
await model?.dispose();
|
|
175
|
+
}
|
|
176
|
+
finally {
|
|
177
|
+
await this.driver.dispose();
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=llm-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-engine.js","sourceRoot":"","sources":["../src/llm-engine.ts"],"names":[],"mappings":"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"}
|
package/dist/logger.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ProcessingResult } from "./types.js";
|
|
2
|
+
export declare function formatTimestamp(startTime: Date): string;
|
|
3
|
+
export declare function logProgress(result: ProcessingResult, startTime: Date, _labels?: Label[]): void;
|
|
4
|
+
export declare function logSummary(summary: {
|
|
5
|
+
processed: number;
|
|
6
|
+
tagged: number;
|
|
7
|
+
noLabel: number;
|
|
8
|
+
skipped: number;
|
|
9
|
+
totalTime: number;
|
|
10
|
+
}): void;
|
|
11
|
+
interface Label {
|
|
12
|
+
name: string;
|
|
13
|
+
description: string;
|
|
14
|
+
}
|
|
15
|
+
export {};
|
package/dist/logger.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { finishProgress } from "./progress.js";
|
|
2
|
+
export function formatTimestamp(startTime) {
|
|
3
|
+
const now = new Date();
|
|
4
|
+
const diff = Math.floor((now.getTime() - startTime.getTime()) / 1000);
|
|
5
|
+
const mins = Math.floor(diff / 60);
|
|
6
|
+
const secs = diff % 60;
|
|
7
|
+
return `${String(mins).padStart(2, "0")}:${String(secs).padStart(2, "0")}`;
|
|
8
|
+
}
|
|
9
|
+
export function logProgress(result, startTime, _labels = []) {
|
|
10
|
+
const timestamp = formatTimestamp(startTime);
|
|
11
|
+
const filename = result.filePath.split("/").pop() || result.filePath;
|
|
12
|
+
const paddedFilename = filename.padEnd(28).slice(0, 28);
|
|
13
|
+
let line = "";
|
|
14
|
+
if (result.status === "skip") {
|
|
15
|
+
line = `[${timestamp}] SKIP ${paddedFilename} → already classified`;
|
|
16
|
+
}
|
|
17
|
+
else if (result.status === "ok") {
|
|
18
|
+
let extra = "";
|
|
19
|
+
if (result.chunks && result.calls) {
|
|
20
|
+
extra = ` (chunks: ${result.chunks}, calls: ${result.calls})`;
|
|
21
|
+
}
|
|
22
|
+
const labelStr = result.labels?.join(", ") || "";
|
|
23
|
+
line = `[${timestamp}] OK ${paddedFilename} → ${labelStr}${extra}`;
|
|
24
|
+
}
|
|
25
|
+
else if (result.status === "none") {
|
|
26
|
+
line = `[${timestamp}] NONE ${paddedFilename} → no label found`;
|
|
27
|
+
}
|
|
28
|
+
finishProgress(line);
|
|
29
|
+
}
|
|
30
|
+
export function logSummary(summary) {
|
|
31
|
+
const totalTimeStr = formatDuration(summary.totalTime);
|
|
32
|
+
console.log("──────────────────────────────────────────");
|
|
33
|
+
console.log(`Processed: ${summary.processed} files`);
|
|
34
|
+
console.log(` Tagged: ${summary.tagged}`);
|
|
35
|
+
console.log(` No label: ${summary.noLabel} (no matching label)`);
|
|
36
|
+
console.log(`Skipped: ${summary.skipped} (already classified)`);
|
|
37
|
+
console.log(`Total time: ${totalTimeStr}`);
|
|
38
|
+
console.log("──────────────────────────────────────────");
|
|
39
|
+
}
|
|
40
|
+
function formatDuration(seconds) {
|
|
41
|
+
const mins = Math.floor(seconds / 60);
|
|
42
|
+
const secs = seconds % 60;
|
|
43
|
+
if (mins > 0) {
|
|
44
|
+
return `${mins}m ${secs}s`;
|
|
45
|
+
}
|
|
46
|
+
return `${secs}s`;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { SailkariApplication } from "./application.js";
|
|
3
|
+
interface McpState {
|
|
4
|
+
application: SailkariApplication;
|
|
5
|
+
}
|
|
6
|
+
export declare function createMcpServer(state?: McpState): McpServer;
|
|
7
|
+
export declare function runMcpServer(): Promise<void>;
|
|
8
|
+
export {};
|
package/dist/mcp.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { resolve } from "node:path";
|
|
5
|
+
import { SailkariApplication } from "./application.js";
|
|
6
|
+
import { OUTPUT_CONTRACT } from "./prompt.js";
|
|
7
|
+
import { formatEvaluationTableRow } from "./evaluation-metrics.js";
|
|
8
|
+
const SYSTEM_PROMPT_GUIDANCE = `Sailkari classifies one document at a time from a supplied label taxonomy.
|
|
9
|
+
|
|
10
|
+
A compatible system prompt must:
|
|
11
|
+
- ask for exactly one label from the labels supplied in the user message;
|
|
12
|
+
- use label descriptions to decide the primary subject;
|
|
13
|
+
- return only the label name, with no explanation or extra text;
|
|
14
|
+
- return NONE when no label fits;
|
|
15
|
+
- never invent or combine labels.
|
|
16
|
+
|
|
17
|
+
${OUTPUT_CONTRACT}`;
|
|
18
|
+
function jsonResult(value) {
|
|
19
|
+
return {
|
|
20
|
+
content: [{ type: "text", text: JSON.stringify(value, null, 2) }],
|
|
21
|
+
structuredContent: value,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function createState() {
|
|
25
|
+
return { application: new SailkariApplication() };
|
|
26
|
+
}
|
|
27
|
+
export function createMcpServer(state = createState()) {
|
|
28
|
+
const server = new McpServer({ name: "sailkari", version: "0.1.0" });
|
|
29
|
+
server.registerResource("system-prompt-contract", "sailkari://system-prompt-contract", { title: "Sailkari system prompt contract", description: "Output format and behavioral requirements for generated classification prompts.", mimeType: "text/plain" }, async (uri) => ({ contents: [{ uri: uri.href, mimeType: "text/plain", text: SYSTEM_PROMPT_GUIDANCE }] }));
|
|
30
|
+
server.registerPrompt("generate-system-prompt", {
|
|
31
|
+
title: "Generate a Sailkari system prompt",
|
|
32
|
+
description: "Ask an agent to generate a system prompt compatible with Sailkari's classifier parser.",
|
|
33
|
+
argsSchema: { taxonomy: z.string().describe("Label names and descriptions that the prompt must classify") },
|
|
34
|
+
}, ({ taxonomy }) => ({
|
|
35
|
+
description: "Generate a strict Sailkari classification system prompt.",
|
|
36
|
+
messages: [{
|
|
37
|
+
role: "user",
|
|
38
|
+
content: {
|
|
39
|
+
type: "text",
|
|
40
|
+
text: `Generate a system prompt for Sailkari using this taxonomy:\n\n${taxonomy}\n\nThe prompt must satisfy this contract:\n\n${SYSTEM_PROMPT_GUIDANCE}`,
|
|
41
|
+
},
|
|
42
|
+
}],
|
|
43
|
+
}));
|
|
44
|
+
server.registerTool("load_model", {
|
|
45
|
+
description: "Load an instruction-tuned GGUF model for subsequent Sailkari evaluations.",
|
|
46
|
+
inputSchema: { modelPath: z.string().describe("Path to the GGUF model") },
|
|
47
|
+
}, async ({ modelPath }) => {
|
|
48
|
+
const loadedModelPath = await state.application.loadModel(modelPath);
|
|
49
|
+
return jsonResult({ modelPath: loadedModelPath, loaded: true });
|
|
50
|
+
});
|
|
51
|
+
server.registerTool("set_system_prompt", {
|
|
52
|
+
description: "Set the system prompt used for model evaluation. Read sailkari://system-prompt-contract first or use generate-system-prompt.",
|
|
53
|
+
inputSchema: { systemPrompt: z.string().min(1).describe("Classifier system prompt") },
|
|
54
|
+
}, async ({ systemPrompt }) => {
|
|
55
|
+
const result = await state.application.setSystemPrompt(systemPrompt);
|
|
56
|
+
return jsonResult({ warnings: result.warnings, configured: true });
|
|
57
|
+
});
|
|
58
|
+
server.registerTool("classify_documents", {
|
|
59
|
+
description: "Evaluate text documents with the loaded GGUF model and return per-file and aggregate benchmark metrics.",
|
|
60
|
+
inputSchema: {
|
|
61
|
+
folder: z.string().describe("Folder containing documents to evaluate"),
|
|
62
|
+
labels: z.string().describe("YAML label taxonomy path"),
|
|
63
|
+
force: z.boolean().optional().default(false).describe("Run inference even when stored labels exist"),
|
|
64
|
+
contextReuse: z.enum(["none", "file", "command"]).optional().default("none").describe("Context allocation scope"),
|
|
65
|
+
},
|
|
66
|
+
}, async ({ folder, labels, force, contextReuse }) => {
|
|
67
|
+
if (!state.application.loadedModelPath)
|
|
68
|
+
throw new Error("Load a model first with load_model.");
|
|
69
|
+
const evaluation = await state.application.evaluate({ folder, labels, force, contextReuse });
|
|
70
|
+
return jsonResult({
|
|
71
|
+
modelPath: state.application.loadedModelPath,
|
|
72
|
+
folder: evaluation.folder,
|
|
73
|
+
contextReuse,
|
|
74
|
+
results: evaluation.results.map((result) => ({ ...result, tableRow: formatEvaluationTableRow(result.filePath.split("/").pop() ?? result.filePath, result) })),
|
|
75
|
+
summary: evaluation.summary,
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
server.registerTool("list_classifications", {
|
|
79
|
+
description: "List stored classification labels for a folder.",
|
|
80
|
+
inputSchema: { folder: z.string().describe("Evaluated folder") },
|
|
81
|
+
}, async ({ folder }) => {
|
|
82
|
+
return jsonResult({ entries: state.application.listClassifications(folder) });
|
|
83
|
+
});
|
|
84
|
+
server.registerTool("remove_classifications", {
|
|
85
|
+
description: "Remove stored classification labels from a folder.",
|
|
86
|
+
inputSchema: { folder: z.string().describe("Evaluated folder") },
|
|
87
|
+
}, async ({ folder }) => {
|
|
88
|
+
const entries = state.application.removeClassifications(folder);
|
|
89
|
+
return jsonResult({ removed: entries.length, folder: resolve(folder) });
|
|
90
|
+
});
|
|
91
|
+
return server;
|
|
92
|
+
}
|
|
93
|
+
export async function runMcpServer() {
|
|
94
|
+
const server = createMcpServer();
|
|
95
|
+
await server.connect(new StdioServerTransport());
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=mcp.js.map
|
package/dist/mcp.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { FileInfo, FileMetadata } from "./types.js";
|
|
2
|
+
import type { ClassificationStore } from "./classification-store.js";
|
|
3
|
+
export declare function extractFileInfo(filePath: string, store?: ClassificationStore): FileInfo;
|
|
4
|
+
export declare function extractMetadata(filePath: string, tokenCount: number, store?: ClassificationStore): Promise<FileMetadata>;
|
package/dist/metadata.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { statSync } from "node:fs";
|
|
3
|
+
import { basename, extname } from "node:path";
|
|
4
|
+
export function extractFileInfo(filePath, store) {
|
|
5
|
+
const stats = statSync(filePath);
|
|
6
|
+
const name = basename(filePath);
|
|
7
|
+
const extension = extname(name).toLowerCase();
|
|
8
|
+
const existingTags = store?.getTags(filePath) ?? [];
|
|
9
|
+
return {
|
|
10
|
+
path: filePath,
|
|
11
|
+
name,
|
|
12
|
+
extension,
|
|
13
|
+
size: stats.size,
|
|
14
|
+
created: stats.birthtime,
|
|
15
|
+
modified: stats.mtime,
|
|
16
|
+
existingTags,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export async function extractMetadata(filePath, tokenCount, store) {
|
|
20
|
+
const content = await readFile(filePath, "utf8");
|
|
21
|
+
const info = extractFileInfo(filePath, store);
|
|
22
|
+
return {
|
|
23
|
+
info,
|
|
24
|
+
content,
|
|
25
|
+
tokenCount,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAI9C,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,KAA2B;IAC3E,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAChC,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAC9C,MAAM,YAAY,GAAG,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IAEpD,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,IAAI;QACJ,SAAS;QACT,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,KAAK,CAAC,SAAS;QACxB,QAAQ,EAAE,KAAK,CAAC,KAAK;QACrB,YAAY;KACb,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAAgB,EAChB,UAAkB,EAClB,KAA2B;IAE3B,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAE9C,OAAO;QACL,IAAI;QACJ,OAAO;QACP,UAAU;KACX,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { parentPort } from "node:worker_threads";
|
|
2
|
+
import { basename, resolve } from "node:path";
|
|
3
|
+
import { SailkariApplication } from "./application.js";
|
|
4
|
+
import { formatEvaluationSummaryTable, formatEvaluationTableHeader, formatEvaluationTableRow, summarizeEvaluation } from "./evaluation-metrics.js";
|
|
5
|
+
let activeOperationId = null;
|
|
6
|
+
const nativeLogger = (level, message) => {
|
|
7
|
+
const text = message.trim();
|
|
8
|
+
if (activeOperationId !== null && text && !text.includes("llama_context: setting new yarn_attn_factor")) {
|
|
9
|
+
post({ type: "native-log", id: activeOperationId, level, text });
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
const application = new SailkariApplication(nativeLogger);
|
|
13
|
+
const controllers = new Map();
|
|
14
|
+
function post(message) {
|
|
15
|
+
parentPort?.postMessage(message);
|
|
16
|
+
}
|
|
17
|
+
async function run({ id, command, systemPrompt }) {
|
|
18
|
+
const controller = new AbortController();
|
|
19
|
+
controllers.set(id, controller);
|
|
20
|
+
activeOperationId = id;
|
|
21
|
+
const { signal } = controller;
|
|
22
|
+
try {
|
|
23
|
+
if (command.type === "model") {
|
|
24
|
+
const modelPath = resolve(command.path);
|
|
25
|
+
post({ type: "event", id, text: `Loading model: ${modelPath}` });
|
|
26
|
+
await application.loadModel(modelPath);
|
|
27
|
+
signal.throwIfAborted();
|
|
28
|
+
post({ type: "model-loaded", id, modelPath });
|
|
29
|
+
}
|
|
30
|
+
else if (command.type === "prompt") {
|
|
31
|
+
const prompt = await application.loadSystemPrompt(command.path);
|
|
32
|
+
signal.throwIfAborted();
|
|
33
|
+
post({ type: "prompt-loaded", id, prompt: prompt.prompt, systemPromptPath: prompt.path, warnings: prompt.warnings });
|
|
34
|
+
}
|
|
35
|
+
else if (command.type === "classify") {
|
|
36
|
+
const evaluation = await application.evaluate({
|
|
37
|
+
folder: command.folder,
|
|
38
|
+
labels: command.labels,
|
|
39
|
+
force: command.force,
|
|
40
|
+
contextReuse: command.contextReuse,
|
|
41
|
+
signal,
|
|
42
|
+
onStart: (folder, fileCount) => {
|
|
43
|
+
post({ type: "event", id, text: `Benchmarking ${fileCount} files in ${folder} (${command.contextReuse === "none" ? "fresh context per call" : `reuse context per ${command.contextReuse}`})` });
|
|
44
|
+
for (const line of formatEvaluationTableHeader())
|
|
45
|
+
post({ type: "event", id, text: line, tone: "muted" });
|
|
46
|
+
},
|
|
47
|
+
onProgress: (filePath, current, total, message) => post({ type: "progress", id, text: `${basename(filePath)}: ${message} (${current}/${total})` }),
|
|
48
|
+
onResult: (result) => {
|
|
49
|
+
const name = basename(result.filePath);
|
|
50
|
+
post({ type: "event", id, text: formatEvaluationTableRow(name, result), tone: result.status === "ok" ? "success" : result.status === "skip" ? "muted" : undefined });
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
for (const line of formatEvaluationSummaryTable(evaluation.summary))
|
|
54
|
+
post({ type: "event", id, text: line, tone: "success" });
|
|
55
|
+
}
|
|
56
|
+
else if (command.type === "list-tags" || command.type === "remove-tags") {
|
|
57
|
+
const entries = application.listClassifications(command.folder);
|
|
58
|
+
if (command.type === "remove-tags")
|
|
59
|
+
application.removeClassifications(command.folder);
|
|
60
|
+
for (const entry of entries) {
|
|
61
|
+
signal.throwIfAborted();
|
|
62
|
+
if (command.type === "list-tags")
|
|
63
|
+
post({ type: "event", id, text: `${basename(entry.filePath)} -> ${entry.labels.join(", ") || "no label"}` });
|
|
64
|
+
else {
|
|
65
|
+
post({ type: "event", id, text: `${basename(entry.filePath)} -> removed`, tone: "success" });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
post({ type: "done", id });
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
post({ type: signal.aborted ? "cancelled" : "error", id, text: error instanceof Error ? error.message : String(error) });
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
controllers.delete(id);
|
|
76
|
+
if (activeOperationId === id)
|
|
77
|
+
activeOperationId = null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
parentPort?.on("message", (message) => {
|
|
81
|
+
if (message.type === "cancel")
|
|
82
|
+
controllers.get(message.id)?.abort(new Error("Operation cancelled."));
|
|
83
|
+
else
|
|
84
|
+
void run(message);
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=operation-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operation-worker.js","sourceRoot":"","sources":["../src/operation-worker.ts"],"names":[],"mappings":"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"}
|
package/dist/parser.d.ts
ADDED