@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.
Files changed (72) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +229 -0
  3. package/dist/application.d.ts +47 -0
  4. package/dist/application.js +100 -0
  5. package/dist/application.js.map +1 -0
  6. package/dist/autocomplete.d.ts +2 -0
  7. package/dist/autocomplete.js +62 -0
  8. package/dist/autocomplete.js.map +1 -0
  9. package/dist/classification-store.d.ts +20 -0
  10. package/dist/classification-store.js +83 -0
  11. package/dist/classification-store.js.map +1 -0
  12. package/dist/classifier.d.ts +6 -0
  13. package/dist/classifier.js +85 -0
  14. package/dist/classifier.js.map +1 -0
  15. package/dist/command-history.d.ts +12 -0
  16. package/dist/command-history.js +49 -0
  17. package/dist/command-history.js.map +1 -0
  18. package/dist/command-parser.d.ts +32 -0
  19. package/dist/command-parser.js +90 -0
  20. package/dist/command-parser.js.map +1 -0
  21. package/dist/command-queue.d.ts +21 -0
  22. package/dist/command-queue.js +33 -0
  23. package/dist/command-queue.js.map +1 -0
  24. package/dist/config.d.ts +8 -0
  25. package/dist/config.js +26 -0
  26. package/dist/config.js.map +1 -0
  27. package/dist/context.d.ts +16 -0
  28. package/dist/context.js +12 -0
  29. package/dist/context.js.map +1 -0
  30. package/dist/evaluation-metrics.d.ts +22 -0
  31. package/dist/evaluation-metrics.js +120 -0
  32. package/dist/evaluation-metrics.js.map +1 -0
  33. package/dist/file-scanner.d.ts +2 -0
  34. package/dist/file-scanner.js +37 -0
  35. package/dist/file-scanner.js.map +1 -0
  36. package/dist/index.d.ts +2 -0
  37. package/dist/index.js +15 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/llm-engine.d.ts +42 -0
  40. package/dist/llm-engine.js +181 -0
  41. package/dist/llm-engine.js.map +1 -0
  42. package/dist/logger.d.ts +15 -0
  43. package/dist/logger.js +48 -0
  44. package/dist/logger.js.map +1 -0
  45. package/dist/mcp.d.ts +8 -0
  46. package/dist/mcp.js +97 -0
  47. package/dist/mcp.js.map +1 -0
  48. package/dist/metadata.d.ts +4 -0
  49. package/dist/metadata.js +28 -0
  50. package/dist/metadata.js.map +1 -0
  51. package/dist/operation-worker.d.ts +1 -0
  52. package/dist/operation-worker.js +86 -0
  53. package/dist/operation-worker.js.map +1 -0
  54. package/dist/parser.d.ts +3 -0
  55. package/dist/parser.js +86 -0
  56. package/dist/parser.js.map +1 -0
  57. package/dist/progress.d.ts +4 -0
  58. package/dist/progress.js +56 -0
  59. package/dist/progress.js.map +1 -0
  60. package/dist/prompt.d.ts +19 -0
  61. package/dist/prompt.js +63 -0
  62. package/dist/prompt.js.map +1 -0
  63. package/dist/tui.d.ts +2 -0
  64. package/dist/tui.js +237 -0
  65. package/dist/tui.js.map +1 -0
  66. package/dist/types.d.ts +43 -0
  67. package/dist/types.js +2 -0
  68. package/dist/types.js.map +1 -0
  69. package/dist/watcher.d.ts +9 -0
  70. package/dist/watcher.js +94 -0
  71. package/dist/watcher.js.map +1 -0
  72. package/package.json +62 -0
package/dist/parser.js ADDED
@@ -0,0 +1,86 @@
1
+ export function parseResponse(response, validLabels) {
2
+ if (!response || !validLabels) {
3
+ return null;
4
+ }
5
+ const trimmed = response.trim();
6
+ if (!trimmed) {
7
+ return null;
8
+ }
9
+ if (trimmed.startsWith("{")) {
10
+ const firstBrace = trimmed.indexOf("{");
11
+ const lastBrace = trimmed.lastIndexOf("}");
12
+ if (firstBrace !== -1 && lastBrace !== -1 && lastBrace > firstBrace) {
13
+ const jsonStr = trimmed.slice(firstBrace, lastBrace + 1);
14
+ try {
15
+ const parsed = JSON.parse(jsonStr);
16
+ return parseJsonResult(parsed, validLabels);
17
+ }
18
+ catch {
19
+ // Fall through to text parsing
20
+ }
21
+ }
22
+ }
23
+ return parseTextResult(trimmed, validLabels);
24
+ }
25
+ function parseJsonResult(parsed, validLabels) {
26
+ const labels = [];
27
+ if (Array.isArray(parsed)) {
28
+ for (const item of parsed) {
29
+ if (item && typeof item.label === "string") {
30
+ const matched = validLabels.find((l) => l.name.toLowerCase() === item.label.toLowerCase().trim());
31
+ if (matched) {
32
+ labels.push(matched.name);
33
+ }
34
+ }
35
+ }
36
+ }
37
+ else if (parsed && Array.isArray(parsed.labels)) {
38
+ const rawLabels = parsed.labels;
39
+ for (let i = 0; i < rawLabels.length; i++) {
40
+ const labelName = String(rawLabels[i]).toLowerCase().trim();
41
+ const matched = validLabels.find((l) => l.name.toLowerCase() === labelName);
42
+ if (matched) {
43
+ labels.push(matched.name);
44
+ }
45
+ }
46
+ }
47
+ if (labels.length === 0) {
48
+ return null;
49
+ }
50
+ return { labels };
51
+ }
52
+ function parseTextResult(text, validLabels) {
53
+ const lowerText = text.toLowerCase();
54
+ const scoredLabels = [];
55
+ for (const label of validLabels) {
56
+ const labelLower = label.name.toLowerCase();
57
+ const index = lowerText.indexOf(labelLower);
58
+ if (index !== -1) {
59
+ let score = 10;
60
+ if (index === 0 || /[\s\n\t,;:]/.test(text[index - 1])) {
61
+ score += 5;
62
+ }
63
+ const endIndex = index + label.name.length;
64
+ if (endIndex >= text.length || /[\s\n\t,;:.]/.test(text[endIndex])) {
65
+ score += 5;
66
+ }
67
+ scoredLabels.push({ name: label.name, score });
68
+ }
69
+ }
70
+ if (scoredLabels.length === 0) {
71
+ return null;
72
+ }
73
+ scoredLabels.sort((a, b) => b.score - a.score);
74
+ return {
75
+ labels: [scoredLabels[0].name],
76
+ };
77
+ }
78
+ export function selectLabelByMajority(labelCounts) {
79
+ const entries = Object.entries(labelCounts);
80
+ if (entries.length === 0) {
81
+ return null;
82
+ }
83
+ entries.sort((a, b) => b[1] - a[1]);
84
+ return entries[0][0];
85
+ }
86
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function startProgress(filename: string, total: number, message?: string): void;
2
+ export declare function updateProgress(filename: string, current: number, total: number, message?: string): void;
3
+ export declare function finishProgress(resultLine: string): void;
4
+ export declare function clearProgress(): void;
@@ -0,0 +1,56 @@
1
+ const BAR_WIDTH = 20;
2
+ const FILENAME_WIDTH = 28;
3
+ let isActive = false;
4
+ let currentLength = 0;
5
+ function render(filename, current, total, message) {
6
+ const percent = total > 0 ? Math.floor((current / total) * 100) : 0;
7
+ const filled = total > 0 ? Math.floor((current / total) * BAR_WIDTH) : 0;
8
+ const bar = "█".repeat(filled) + "░".repeat(BAR_WIDTH - filled);
9
+ const truncatedName = filename.length > FILENAME_WIDTH
10
+ ? filename.slice(0, FILENAME_WIDTH - 3) + "..."
11
+ : filename.padEnd(FILENAME_WIDTH);
12
+ const msg = message ? ` ${message}` : "";
13
+ return `${truncatedName} [${bar}] ${String(percent).padStart(3)}%${msg}`;
14
+ }
15
+ export function startProgress(filename, total, message = "") {
16
+ if (isActive) {
17
+ process.stdout.write(`\r${" ".repeat(currentLength)}\r`);
18
+ }
19
+ const text = render(filename, 0, total, message);
20
+ process.stdout.write(text);
21
+ currentLength = text.length;
22
+ isActive = true;
23
+ }
24
+ export function updateProgress(filename, current, total, message = "") {
25
+ if (!isActive)
26
+ return;
27
+ process.stdout.write("\r");
28
+ const text = render(filename, current, total, message);
29
+ if (text.length < currentLength) {
30
+ process.stdout.write(text + " ".repeat(currentLength - text.length));
31
+ }
32
+ else {
33
+ process.stdout.write(text);
34
+ currentLength = text.length;
35
+ }
36
+ }
37
+ export function finishProgress(resultLine) {
38
+ if (!isActive) {
39
+ process.stdout.write(resultLine + "\n");
40
+ return;
41
+ }
42
+ const padded = resultLine.length < currentLength
43
+ ? resultLine + " ".repeat(currentLength - resultLine.length)
44
+ : resultLine;
45
+ process.stdout.write("\r" + padded + "\n");
46
+ isActive = false;
47
+ currentLength = 0;
48
+ }
49
+ export function clearProgress() {
50
+ if (!isActive)
51
+ return;
52
+ process.stdout.write(`\r${" ".repeat(currentLength)}\r`);
53
+ isActive = false;
54
+ currentLength = 0;
55
+ }
56
+ //# sourceMappingURL=progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.js","sourceRoot":"","sources":["../src/progress.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { Label } from "./types.js";
2
+ /**
3
+ * The parser accepts:
4
+ * - a bare label name (preferred): banking
5
+ * - JSON: {"labels":["banking"]} or [{"label":"banking"}]
6
+ *
7
+ * A system prompt used with this CLI must tell the model to produce
8
+ * one of those shapes. Otherwise replies become NONE even when the
9
+ * classification itself is reasonable.
10
+ */
11
+ export declare const OUTPUT_CONTRACT = "Output contract:\n- Reply with ONLY the label name, matching a name from the list exactly.\n- No quotes, no markdown, no punctuation, no explanation, no extra lines.\n- Do not invent labels. Do not repeat the label description.\n- If no label fits, reply with NONE.";
12
+ export declare const DEFAULT_SYSTEM_PROMPT = "You are a document classifier.\n\nThe user message contains a list of labels (each with a name and a description) and one document.\n\nAssign the document to exactly one label from that list. Use the descriptions as the definition of each category. If two labels could apply, pick the one that matches the document's primary subject, not its file format.\n\nOutput contract:\n- Reply with ONLY the label name, matching a name from the list exactly.\n- No quotes, no markdown, no punctuation, no explanation, no extra lines.\n- Do not invent labels. Do not repeat the label description.\n- If no label fits, reply with NONE.";
13
+ export declare function buildUserPayload(labels: Label[], document: string): string;
14
+ export declare function buildChatMessages(systemPrompt: string, labels: Label[], document: string): {
15
+ role: "system" | "user";
16
+ content: string;
17
+ }[];
18
+ export declare function inspectSystemPrompt(text: string): string[];
19
+ export declare function loadSystemPrompt(path: string): Promise<string>;
package/dist/prompt.js ADDED
@@ -0,0 +1,63 @@
1
+ import { readFile } from "node:fs/promises";
2
+ /**
3
+ * The parser accepts:
4
+ * - a bare label name (preferred): banking
5
+ * - JSON: {"labels":["banking"]} or [{"label":"banking"}]
6
+ *
7
+ * A system prompt used with this CLI must tell the model to produce
8
+ * one of those shapes. Otherwise replies become NONE even when the
9
+ * classification itself is reasonable.
10
+ */
11
+ export const OUTPUT_CONTRACT = `Output contract:
12
+ - Reply with ONLY the label name, matching a name from the list exactly.
13
+ - No quotes, no markdown, no punctuation, no explanation, no extra lines.
14
+ - Do not invent labels. Do not repeat the label description.
15
+ - If no label fits, reply with NONE.`;
16
+ export const DEFAULT_SYSTEM_PROMPT = `You are a document classifier.
17
+
18
+ The user message contains a list of labels (each with a name and a description) and one document.
19
+
20
+ Assign the document to exactly one label from that list. Use the descriptions as the definition of each category. If two labels could apply, pick the one that matches the document's primary subject, not its file format.
21
+
22
+ ${OUTPUT_CONTRACT}`;
23
+ export function buildUserPayload(labels, document) {
24
+ const labelsText = labels.map((l) => l.name + ": " + l.description).join("\n");
25
+ return "LABELS:\n" + labelsText + "\n\nDOCUMENT:\n" + document;
26
+ }
27
+ export function buildChatMessages(systemPrompt, labels, document) {
28
+ return [
29
+ { role: "system", content: systemPrompt },
30
+ { role: "user", content: buildUserPayload(labels, document) },
31
+ ];
32
+ }
33
+ export function inspectSystemPrompt(text) {
34
+ const warnings = [];
35
+ const lower = text.toLowerCase();
36
+ const asksForSingleLabel = /exactly one/.test(lower) ||
37
+ /one label/.test(lower) ||
38
+ /single label/.test(lower) ||
39
+ /only the label/.test(lower) ||
40
+ /only the name/.test(lower);
41
+ const constrainsFormat = /only the label/.test(lower) ||
42
+ /only the name/.test(lower) ||
43
+ /no explanation/.test(lower) ||
44
+ /no markdown/.test(lower) ||
45
+ /no preamble/.test(lower) ||
46
+ /output contract/.test(lower) ||
47
+ (/\bjson\b/.test(lower) && /\blabels\b/.test(lower));
48
+ if (!asksForSingleLabel) {
49
+ warnings.push("System prompt does not clearly ask for exactly one label from the provided list.");
50
+ }
51
+ if (!constrainsFormat) {
52
+ warnings.push("System prompt does not constrain the reply format. The parser expects a bare label name (or JSON {\"labels\":[\"name\"]}). Unconstrained replies are recorded as NONE.");
53
+ }
54
+ return warnings;
55
+ }
56
+ export async function loadSystemPrompt(path) {
57
+ const text = (await readFile(path, "utf8")).trim();
58
+ if (!text) {
59
+ throw new Error(`System prompt file is empty: ${path}`);
60
+ }
61
+ return text;
62
+ }
63
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;;;;qCAIM,CAAC;AAEtC,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;;;EAMnC,eAAe,EAAE,CAAC;AAEpB,MAAM,UAAU,gBAAgB,CAAC,MAAe,EAAE,QAAgB;IAChE,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/E,OAAO,WAAW,GAAG,UAAU,GAAG,iBAAiB,GAAG,QAAQ,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,YAAoB,EACpB,MAAe,EACf,QAAgB;IAEhB,OAAO;QACL,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE;QACzC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE;KAC9D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAEjC,MAAM,kBAAkB,GACtB,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;QACzB,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;QACvB,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;QAC1B,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;QAC5B,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAE9B,MAAM,gBAAgB,GACpB,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;QAC5B,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;QAC3B,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;QAC5B,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;QACzB,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;QACzB,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC;QAC7B,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAEvD,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,QAAQ,CAAC,IAAI,CACX,kFAAkF,CACnF,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,QAAQ,CAAC,IAAI,CACX,wKAAwK,CACzK,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY;IACjD,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACnD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
package/dist/tui.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ import React from "react";
2
+ export declare function App(): React.ReactElement;
package/dist/tui.js ADDED
@@ -0,0 +1,237 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React, { useEffect, useRef, useState } from "react";
3
+ import { Box, Text, useApp, useInput, useWindowSize } from "ink";
4
+ import TextInput from "ink-text-input";
5
+ import { Worker } from "node:worker_threads";
6
+ import { DEFAULT_SYSTEM_PROMPT } from "./prompt.js";
7
+ import { loadConfig, saveConfig } from "./config.js";
8
+ import { HELP_TEXT, parseCommand } from "./command-parser.js";
9
+ import { applyCompletion, completeInput } from "./autocomplete.js";
10
+ import { CommandQueue } from "./command-queue.js";
11
+ import { CommandHistory } from "./command-history.js";
12
+ const COMMAND_PANEL_HEIGHT = 9;
13
+ const PANEL_GAP = 1;
14
+ export function App() {
15
+ const { exit } = useApp();
16
+ const { rows } = useWindowSize();
17
+ const [input, setInput] = useState("");
18
+ const [events, setEvents] = useState([
19
+ { id: 0, text: "Ready. Type `help` to see the available commands.", tone: "muted" },
20
+ ]);
21
+ const [busy, setBusy] = useState(false);
22
+ const [config, setConfig] = useState({});
23
+ const [prompt, setPrompt] = useState(DEFAULT_SYSTEM_PROMPT);
24
+ const [suggestions, setSuggestions] = useState([]);
25
+ const [suggestionIndex, setSuggestionIndex] = useState(0);
26
+ const [inputVersion, setInputVersion] = useState(0);
27
+ const [activityScroll, setActivityScroll] = useState(0);
28
+ const [queue, setQueue] = useState([]);
29
+ const [activeTask, setActiveTask] = useState(null);
30
+ const workerRef = useRef(null);
31
+ const commandQueueRef = useRef(new CommandQueue());
32
+ const activeCommandRef = useRef(null);
33
+ const commandHistoryRef = useRef(new CommandHistory());
34
+ const nextEventIdRef = useRef(1);
35
+ const activityHeight = Math.max(1, rows - COMMAND_PANEL_HEIGHT - PANEL_GAP);
36
+ const activityLines = Math.max(1, activityHeight - 4);
37
+ const firstVisibleEvent = Math.max(0, events.length - activityLines - activityScroll);
38
+ const lastVisibleEvent = Math.max(firstVisibleEvent, events.length - activityScroll);
39
+ useEffect(() => {
40
+ const worker = new Worker(new URL("./operation-worker.js", import.meta.url));
41
+ workerRef.current = worker;
42
+ worker.on("message", (message) => {
43
+ if (message.type === "event")
44
+ addEvent(message.text, message.tone);
45
+ if (message.type === "native-log")
46
+ addEvent(`[llama.cpp] ${message.text}`, message.level === "error" || message.level === "fatal" ? "error" : "warning");
47
+ if (message.type === "model-loaded") {
48
+ setConfig((current) => {
49
+ const next = { ...current, modelPath: message.modelPath };
50
+ void saveConfig(next);
51
+ return next;
52
+ });
53
+ addEvent("Model loaded and configuration saved.", "success");
54
+ }
55
+ if (message.type === "prompt-loaded") {
56
+ for (const warning of message.warnings ?? [])
57
+ addEvent(`Warning: ${warning}`, "muted");
58
+ setPrompt(message.prompt);
59
+ setConfig((current) => {
60
+ const next = { ...current };
61
+ if (message.systemPromptPath)
62
+ next.systemPromptPath = message.systemPromptPath;
63
+ else
64
+ delete next.systemPromptPath;
65
+ void saveConfig(next);
66
+ return next;
67
+ });
68
+ addEvent(message.systemPromptPath ? `System prompt configured: ${message.systemPromptPath}` : "Using the default system prompt.", "success");
69
+ }
70
+ if (message.type === "error" || message.type === "cancelled" || message.type === "done") {
71
+ if (message.type === "error")
72
+ addEvent(message.text, "error");
73
+ if (message.type === "cancelled")
74
+ addEvent("Operation cancelled.", "muted");
75
+ finishActiveCommand(message.id);
76
+ }
77
+ });
78
+ void loadConfig().then((loaded) => {
79
+ setConfig(loaded);
80
+ commandHistoryRef.current.load(loaded.commandHistory ?? []);
81
+ if (loaded.modelPath)
82
+ commandQueueRef.current.enqueue(`model ${loaded.modelPath}`, { type: "model", path: loaded.modelPath });
83
+ if (loaded.systemPromptPath)
84
+ commandQueueRef.current.enqueue(`prompt ${loaded.systemPromptPath}`, { type: "prompt", path: loaded.systemPromptPath });
85
+ refreshQueue();
86
+ void runNextCommand();
87
+ });
88
+ return () => { void worker.terminate(); };
89
+ }, []);
90
+ function addEvent(text, tone) {
91
+ const event = { id: nextEventIdRef.current++, text, tone };
92
+ setEvents((current) => [...current, event].slice(-300));
93
+ setActivityScroll(0);
94
+ }
95
+ useInput((_value, key) => {
96
+ if (key.tab && !busy) {
97
+ const nextSuggestions = suggestions.length > 0 ? suggestions : completeInput(input);
98
+ if (nextSuggestions.length === 0)
99
+ return;
100
+ const completion = applyCompletion(input, nextSuggestions[suggestionIndex]);
101
+ setInput(completion);
102
+ setInputVersion((current) => current + 1);
103
+ setSuggestionIndex((suggestionIndex + 1) % nextSuggestions.length);
104
+ setSuggestions(nextSuggestions);
105
+ return;
106
+ }
107
+ if (key.shift && key.upArrow) {
108
+ setActivityScroll((current) => Math.min(current + activityLines, Math.max(0, events.length - activityLines)));
109
+ return;
110
+ }
111
+ if (key.shift && key.downArrow) {
112
+ setActivityScroll((current) => Math.max(0, current - activityLines));
113
+ return;
114
+ }
115
+ if (key.upArrow) {
116
+ const previous = commandHistoryRef.current.previous(input);
117
+ if (previous !== undefined) {
118
+ setInput(previous);
119
+ setInputVersion((current) => current + 1);
120
+ setSuggestions(completeInput(previous));
121
+ setSuggestionIndex(0);
122
+ }
123
+ return;
124
+ }
125
+ if (key.downArrow) {
126
+ const next = commandHistoryRef.current.next();
127
+ if (next !== undefined) {
128
+ setInput(next);
129
+ setInputVersion((current) => current + 1);
130
+ setSuggestions(completeInput(next));
131
+ setSuggestionIndex(0);
132
+ }
133
+ return;
134
+ }
135
+ if (key.pageUp) {
136
+ setActivityScroll((current) => Math.min(current + activityLines, Math.max(0, events.length - activityLines)));
137
+ }
138
+ else if (key.pageDown) {
139
+ setActivityScroll((current) => Math.max(0, current - activityLines));
140
+ }
141
+ });
142
+ function refreshQueue() {
143
+ setQueue([...commandQueueRef.current.entries()]);
144
+ }
145
+ function finishActiveCommand(id) {
146
+ if (activeCommandRef.current?.id !== id)
147
+ return;
148
+ const completed = activeCommandRef.current;
149
+ activeCommandRef.current = null;
150
+ setBusy(false);
151
+ setActiveTask(null);
152
+ if (completed.command.type === "quit") {
153
+ exit();
154
+ return;
155
+ }
156
+ void runNextCommand();
157
+ }
158
+ async function runNextCommand() {
159
+ if (activeCommandRef.current)
160
+ return;
161
+ const next = commandQueueRef.current.dequeue();
162
+ refreshQueue();
163
+ if (!next)
164
+ return;
165
+ activeCommandRef.current = next;
166
+ setBusy(true);
167
+ setActiveTask(`running: ${next.input}`);
168
+ const { command } = next;
169
+ if (command.type === "help") {
170
+ for (const line of HELP_TEXT.split("\n"))
171
+ addEvent(line, "muted");
172
+ finishActiveCommand(next.id);
173
+ return;
174
+ }
175
+ if (command.type === "quit") {
176
+ finishActiveCommand(next.id);
177
+ return;
178
+ }
179
+ workerRef.current?.postMessage({ type: "run", id: next.id, command, systemPrompt: prompt });
180
+ }
181
+ function submit(value) {
182
+ setInput("");
183
+ setSuggestions([]);
184
+ setSuggestionIndex(0);
185
+ commandHistoryRef.current.record(value);
186
+ setConfig((current) => {
187
+ const next = { ...current, commandHistory: [...commandHistoryRef.current.all()] };
188
+ void saveConfig(next);
189
+ return next;
190
+ });
191
+ try {
192
+ const command = parseCommand(value);
193
+ if (command.type === "cancel") {
194
+ const active = activeCommandRef.current;
195
+ if (active)
196
+ workerRef.current?.postMessage({ type: "cancel", id: active.id });
197
+ else
198
+ addEvent("No active operation to cancel.", "muted");
199
+ }
200
+ else if (command.type === "queue") {
201
+ if (command.action === "show") {
202
+ const entries = commandQueueRef.current.entries();
203
+ addEvent(entries.length ? entries.map((entry, index) => `${index + 1}. ${entry.input}`).join(" | ") : "Queue is empty.", "muted");
204
+ }
205
+ else if (command.action === "clear") {
206
+ addEvent(`Removed ${commandQueueRef.current.clear()} queued command(s).`, "muted");
207
+ refreshQueue();
208
+ }
209
+ else if (command.action === "remove") {
210
+ const removed = commandQueueRef.current.remove(command.position);
211
+ addEvent(removed ? `Removed: ${removed.input}` : "No queued command at that position.", "muted");
212
+ refreshQueue();
213
+ }
214
+ else {
215
+ const moved = commandQueueRef.current.move(command.position, command.destination);
216
+ addEvent(moved ? "Queue reordered." : "Invalid queue positions.", "muted");
217
+ refreshQueue();
218
+ }
219
+ }
220
+ else {
221
+ commandQueueRef.current.enqueue(value, command);
222
+ refreshQueue();
223
+ void runNextCommand();
224
+ }
225
+ }
226
+ catch (error) {
227
+ addEvent(error instanceof Error ? error.message : String(error), "error");
228
+ }
229
+ }
230
+ return (_jsxs(Box, { flexDirection: "column", height: rows, paddingX: 1, children: [_jsxs(Box, { flexDirection: "column", height: activityHeight, overflow: "hidden", borderStyle: "round", borderColor: "gray", paddingX: 1, children: [_jsxs(Box, { justifyContent: "space-between", children: [_jsx(Text, { bold: true, color: "cyan", children: "SAILKARI" }), _jsxs(Text, { dimColor: true, children: ["activity ", activityScroll > 0 ? `(page ${Math.ceil(activityScroll / activityLines)})` : "(latest)"] })] }), events.slice(firstVisibleEvent, lastVisibleEvent).map((event, index) => (_jsxs(Text, { color: event.tone === "error" ? "red" : event.tone === "success" ? "green" : event.tone === "warning" ? "yellow" : event.tone === "muted" ? "gray" : undefined, children: [event.tone === "error" ? "! " : event.tone === "success" ? "✓ " : " ", event.text] }, event.id)))] }), _jsxs(Box, { flexDirection: "column", height: COMMAND_PANEL_HEIGHT, borderStyle: "round", borderColor: "cyan", paddingX: 1, marginTop: PANEL_GAP, children: [_jsxs(Box, { justifyContent: "space-between", children: [_jsx(Text, { bold: true, color: "cyan", children: "COMMAND" }), _jsx(Text, { dimColor: true, children: busy ? "working... cancel stop" : "Enter run Tab complete Up/Down history" })] }), _jsx(Text, { color: "gray", wrap: "truncate-end", children: suggestions.length > 0 ? suggestions.join(" ") : " " }), _jsxs(Text, { dimColor: true, wrap: "truncate-end", children: ["cwd: ", process.cwd()] }), _jsxs(Text, { dimColor: true, wrap: "truncate-end", children: ["model: ", config.modelPath ?? "not configured", " | prompt: ", config.systemPromptPath ?? "default"] }), _jsxs(Text, { dimColor: true, wrap: "truncate-end", children: ["active: ", activeTask ?? "idle"] }), _jsxs(Text, { color: "yellow", wrap: "truncate-end", children: ["queue: ", queue.length ? queue.map((entry, index) => `${index + 1}. ${entry.input}`).join(" | ") : "empty"] }), _jsxs(Box, { children: [_jsx(Text, { color: "cyan", children: "\u276F " }), _jsx(TextInput, { value: input, onChange: (value) => {
231
+ setInput(value);
232
+ commandHistoryRef.current.reset();
233
+ setSuggestions(completeInput(value));
234
+ setSuggestionIndex(0);
235
+ }, onSubmit: submit }, inputVersion)] })] })] }));
236
+ }
237
+ //# sourceMappingURL=tui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui.js","sourceRoot":"","sources":["../src/tui.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ export interface Label {
2
+ name: string;
3
+ description: string;
4
+ }
5
+ export interface LabelsFile {
6
+ [key: string]: string;
7
+ }
8
+ export interface ClassificationResult {
9
+ labels: string[];
10
+ }
11
+ export interface FileInfo {
12
+ path: string;
13
+ name: string;
14
+ extension: string;
15
+ size: number;
16
+ created: Date;
17
+ modified: Date;
18
+ existingTags: string[];
19
+ }
20
+ export interface FileMetadata {
21
+ info: FileInfo;
22
+ content: string;
23
+ tokenCount: number;
24
+ }
25
+ export interface ProcessingResult {
26
+ status: "ok" | "none" | "skip";
27
+ filePath: string;
28
+ labels?: string[];
29
+ chunks?: number;
30
+ calls?: number;
31
+ reason?: string;
32
+ durationMs?: number;
33
+ inferenceMs?: number;
34
+ sourceBytes?: number;
35
+ inputTokensEstimate?: number;
36
+ }
37
+ export interface ProcessingSummary {
38
+ processed: number;
39
+ tagged: number;
40
+ noLabel: number;
41
+ skipped: number;
42
+ totalTime: number;
43
+ }
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ import { type FSWatcher } from "node:fs";
2
+ export interface WatchOptions {
3
+ folder: string;
4
+ onFile: (filePath: string) => void | Promise<void>;
5
+ debounceMs?: number;
6
+ cooldownMs?: number;
7
+ signal?: AbortSignal;
8
+ }
9
+ export declare function watchFolder(opts: WatchOptions): Promise<FSWatcher>;