@kienmatu/inkos 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 +661 -0
- package/dist/book-backup.d.ts +33 -0
- package/dist/book-backup.d.ts.map +1 -0
- package/dist/book-backup.js +74 -0
- package/dist/book-backup.js.map +1 -0
- package/dist/commands/agent.d.ts +3 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +71 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/analytics.d.ts +3 -0
- package/dist/commands/analytics.d.ts.map +1 -0
- package/dist/commands/analytics.js +74 -0
- package/dist/commands/analytics.js.map +1 -0
- package/dist/commands/audit.d.ts +3 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +81 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/auto.d.ts +3 -0
- package/dist/commands/auto.d.ts.map +1 -0
- package/dist/commands/auto.js +136 -0
- package/dist/commands/auto.js.map +1 -0
- package/dist/commands/book.d.ts +3 -0
- package/dist/commands/book.d.ts.map +1 -0
- package/dist/commands/book.js +324 -0
- package/dist/commands/book.js.map +1 -0
- package/dist/commands/chapter.d.ts +3 -0
- package/dist/commands/chapter.d.ts.map +1 -0
- package/dist/commands/chapter.js +103 -0
- package/dist/commands/chapter.js.map +1 -0
- package/dist/commands/compose.d.ts +3 -0
- package/dist/commands/compose.d.ts.map +1 -0
- package/dist/commands/compose.js +46 -0
- package/dist/commands/compose.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +321 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/consolidate.d.ts +3 -0
- package/dist/commands/consolidate.d.ts.map +1 -0
- package/dist/commands/consolidate.js +50 -0
- package/dist/commands/consolidate.js.map +1 -0
- package/dist/commands/daemon.d.ts +4 -0
- package/dist/commands/daemon.d.ts.map +1 -0
- package/dist/commands/daemon.js +118 -0
- package/dist/commands/daemon.js.map +1 -0
- package/dist/commands/detect.d.ts +3 -0
- package/dist/commands/detect.d.ts.map +1 -0
- package/dist/commands/detect.js +104 -0
- package/dist/commands/detect.js.map +1 -0
- package/dist/commands/doctor.d.ts +8 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +356 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/draft.d.ts +3 -0
- package/dist/commands/draft.d.ts.map +1 -0
- package/dist/commands/draft.js +42 -0
- package/dist/commands/draft.js.map +1 -0
- package/dist/commands/eval.d.ts +3 -0
- package/dist/commands/eval.d.ts.map +1 -0
- package/dist/commands/eval.js +57 -0
- package/dist/commands/eval.js.map +1 -0
- package/dist/commands/export.d.ts +3 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +46 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/fanfic.d.ts +3 -0
- package/dist/commands/fanfic.d.ts.map +1 -0
- package/dist/commands/fanfic.js +177 -0
- package/dist/commands/fanfic.js.map +1 -0
- package/dist/commands/forecast.d.ts +12 -0
- package/dist/commands/forecast.d.ts.map +1 -0
- package/dist/commands/forecast.js +156 -0
- package/dist/commands/forecast.js.map +1 -0
- package/dist/commands/genre.d.ts +11 -0
- package/dist/commands/genre.d.ts.map +1 -0
- package/dist/commands/genre.js +186 -0
- package/dist/commands/genre.js.map +1 -0
- package/dist/commands/import.d.ts +3 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +110 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +63 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/interact.d.ts +6 -0
- package/dist/commands/interact.d.ts.map +1 -0
- package/dist/commands/interact.js +95 -0
- package/dist/commands/interact.js.map +1 -0
- package/dist/commands/plan.d.ts +3 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +50 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/radar.d.ts +3 -0
- package/dist/commands/radar.d.ts.map +1 -0
- package/dist/commands/radar.js +52 -0
- package/dist/commands/radar.js.map +1 -0
- package/dist/commands/review.d.ts +3 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +229 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/revise.d.ts +3 -0
- package/dist/commands/revise.d.ts.map +1 -0
- package/dist/commands/revise.js +91 -0
- package/dist/commands/revise.js.map +1 -0
- package/dist/commands/short-fiction.d.ts +4 -0
- package/dist/commands/short-fiction.d.ts.map +1 -0
- package/dist/commands/short-fiction.js +220 -0
- package/dist/commands/short-fiction.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +123 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/studio.d.ts +21 -0
- package/dist/commands/studio.d.ts.map +1 -0
- package/dist/commands/studio.js +151 -0
- package/dist/commands/studio.js.map +1 -0
- package/dist/commands/style.d.ts +3 -0
- package/dist/commands/style.d.ts.map +1 -0
- package/dist/commands/style.js +95 -0
- package/dist/commands/style.js.map +1 -0
- package/dist/commands/translate.d.ts +3 -0
- package/dist/commands/translate.d.ts.map +1 -0
- package/dist/commands/translate.js +111 -0
- package/dist/commands/translate.js.map +1 -0
- package/dist/commands/tui.d.ts +6 -0
- package/dist/commands/tui.d.ts.map +1 -0
- package/dist/commands/tui.js +14 -0
- package/dist/commands/tui.js.map +1 -0
- package/dist/commands/update.d.ts +3 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +40 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/write.d.ts +3 -0
- package/dist/commands/write.d.ts.map +1 -0
- package/dist/commands/write.js +371 -0
- package/dist/commands/write.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/localization.d.ts +103 -0
- package/dist/localization.d.ts.map +1 -0
- package/dist/localization.js +377 -0
- package/dist/localization.js.map +1 -0
- package/dist/notify-helper.d.ts +17 -0
- package/dist/notify-helper.d.ts.map +1 -0
- package/dist/notify-helper.js +27 -0
- package/dist/notify-helper.js.map +1 -0
- package/dist/program.d.ts +10 -0
- package/dist/program.d.ts.map +1 -0
- package/dist/program.js +97 -0
- package/dist/program.js.map +1 -0
- package/dist/progress-text.d.ts +26 -0
- package/dist/progress-text.d.ts.map +1 -0
- package/dist/progress-text.js +35 -0
- package/dist/progress-text.js.map +1 -0
- package/dist/project-bootstrap.d.ts +8 -0
- package/dist/project-bootstrap.d.ts.map +1 -0
- package/dist/project-bootstrap.js +139 -0
- package/dist/project-bootstrap.js.map +1 -0
- package/dist/runtime-requirements.d.ts +24 -0
- package/dist/runtime-requirements.d.ts.map +1 -0
- package/dist/runtime-requirements.js +89 -0
- package/dist/runtime-requirements.js.map +1 -0
- package/dist/tui/__tests__/markdown.test.d.ts +2 -0
- package/dist/tui/__tests__/markdown.test.d.ts.map +1 -0
- package/dist/tui/__tests__/markdown.test.js +58 -0
- package/dist/tui/__tests__/markdown.test.js.map +1 -0
- package/dist/tui/activity-state.d.ts +9 -0
- package/dist/tui/activity-state.d.ts.map +1 -0
- package/dist/tui/activity-state.js +6 -0
- package/dist/tui/activity-state.js.map +1 -0
- package/dist/tui/agent-input.d.ts +118 -0
- package/dist/tui/agent-input.d.ts.map +1 -0
- package/dist/tui/agent-input.js +255 -0
- package/dist/tui/agent-input.js.map +1 -0
- package/dist/tui/ansi.d.ts +40 -0
- package/dist/tui/ansi.d.ts.map +1 -0
- package/dist/tui/ansi.js +62 -0
- package/dist/tui/ansi.js.map +1 -0
- package/dist/tui/app.d.ts +13 -0
- package/dist/tui/app.d.ts.map +1 -0
- package/dist/tui/app.js +109 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/tui/chat-depth.d.ts +9 -0
- package/dist/tui/chat-depth.d.ts.map +1 -0
- package/dist/tui/chat-depth.js +14 -0
- package/dist/tui/chat-depth.js.map +1 -0
- package/dist/tui/chat-draft.d.ts +4 -0
- package/dist/tui/chat-draft.d.ts.map +1 -0
- package/dist/tui/chat-draft.js +28 -0
- package/dist/tui/chat-draft.js.map +1 -0
- package/dist/tui/composer-caret.d.ts +10 -0
- package/dist/tui/composer-caret.d.ts.map +1 -0
- package/dist/tui/composer-caret.js +13 -0
- package/dist/tui/composer-caret.js.map +1 -0
- package/dist/tui/composer-display.d.ts +7 -0
- package/dist/tui/composer-display.d.ts.map +1 -0
- package/dist/tui/composer-display.js +17 -0
- package/dist/tui/composer-display.js.map +1 -0
- package/dist/tui/dashboard-model.d.ts +46 -0
- package/dist/tui/dashboard-model.d.ts.map +1 -0
- package/dist/tui/dashboard-model.js +105 -0
- package/dist/tui/dashboard-model.js.map +1 -0
- package/dist/tui/dashboard.d.ts +38 -0
- package/dist/tui/dashboard.d.ts.map +1 -0
- package/dist/tui/dashboard.js +357 -0
- package/dist/tui/dashboard.js.map +1 -0
- package/dist/tui/effects.d.ts +61 -0
- package/dist/tui/effects.d.ts.map +1 -0
- package/dist/tui/effects.js +451 -0
- package/dist/tui/effects.js.map +1 -0
- package/dist/tui/i18n.d.ts +63 -0
- package/dist/tui/i18n.d.ts.map +1 -0
- package/dist/tui/i18n.js +205 -0
- package/dist/tui/i18n.js.map +1 -0
- package/dist/tui/input-history.d.ts +12 -0
- package/dist/tui/input-history.d.ts.map +1 -0
- package/dist/tui/input-history.js +47 -0
- package/dist/tui/input-history.js.map +1 -0
- package/dist/tui/local-commands.d.ts +12 -0
- package/dist/tui/local-commands.d.ts.map +1 -0
- package/dist/tui/local-commands.js +50 -0
- package/dist/tui/local-commands.js.map +1 -0
- package/dist/tui/markdown.d.ts +2 -0
- package/dist/tui/markdown.d.ts.map +1 -0
- package/dist/tui/markdown.js +60 -0
- package/dist/tui/markdown.js.map +1 -0
- package/dist/tui/session-store.d.ts +2 -0
- package/dist/tui/session-store.d.ts.map +1 -0
- package/dist/tui/session-store.js +2 -0
- package/dist/tui/session-store.js.map +1 -0
- package/dist/tui/setup.d.ts +53 -0
- package/dist/tui/setup.d.ts.map +1 -0
- package/dist/tui/setup.js +313 -0
- package/dist/tui/setup.js.map +1 -0
- package/dist/tui/slash-autocomplete.d.ts +8 -0
- package/dist/tui/slash-autocomplete.d.ts.map +1 -0
- package/dist/tui/slash-autocomplete.js +48 -0
- package/dist/tui/slash-autocomplete.js.map +1 -0
- package/dist/tui/theme.d.ts +28 -0
- package/dist/tui/theme.d.ts.map +1 -0
- package/dist/tui/theme.js +53 -0
- package/dist/tui/theme.js.map +1 -0
- package/dist/utils.d.ts +32 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +165 -0
- package/dist/utils.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
/* ── Auto-init & environment detection for TUI ── */
|
|
2
|
+
import { access, mkdir, readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import { join, basename } from "node:path";
|
|
4
|
+
import readline from "node:readline/promises";
|
|
5
|
+
import { c, bold, dim, cyan, gray, brightCyan, brightGreen, brightWhite, } from "./ansi.js";
|
|
6
|
+
import { resolveTuiLocale } from "./i18n.js";
|
|
7
|
+
import { GLOBAL_ENV_PATH, loadConfig } from "../utils.js";
|
|
8
|
+
import { ensureProjectGitignore } from "../project-bootstrap.js";
|
|
9
|
+
const PROVIDERS = ["openai", "anthropic", "kkaiapi", "custom"];
|
|
10
|
+
const KKAIAPI_BASE_URL = "https://api.kkaiapi.com/v1";
|
|
11
|
+
export function resolveSetupProvider(provider, baseUrl) {
|
|
12
|
+
const normalizedProvider = PROVIDERS.includes(provider.trim())
|
|
13
|
+
? provider.trim()
|
|
14
|
+
: "openai";
|
|
15
|
+
const normalizedUrl = baseUrl.trim().toLowerCase();
|
|
16
|
+
if (normalizedUrl.includes("api.kimi.com/coding")) {
|
|
17
|
+
return "anthropic";
|
|
18
|
+
}
|
|
19
|
+
if (normalizedProvider === "anthropic" || normalizedProvider === "custom") {
|
|
20
|
+
return normalizedProvider;
|
|
21
|
+
}
|
|
22
|
+
return "openai";
|
|
23
|
+
}
|
|
24
|
+
export function resolveSetupService(provider, baseUrl) {
|
|
25
|
+
const normalizedProvider = provider.trim().toLowerCase();
|
|
26
|
+
const normalizedUrl = baseUrl.trim().toLowerCase();
|
|
27
|
+
if (normalizedProvider === "kkaiapi" || normalizedUrl.includes("api.kkaiapi.com")) {
|
|
28
|
+
return "kkaiapi";
|
|
29
|
+
}
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
export function buildInteractiveSetupCopy(locale) {
|
|
33
|
+
if (locale === "en") {
|
|
34
|
+
return {
|
|
35
|
+
title: "LLM Setup",
|
|
36
|
+
subtitle: "Configure your model provider to start writing.",
|
|
37
|
+
steps: {
|
|
38
|
+
provider: "Provider",
|
|
39
|
+
baseUrl: "Base URL",
|
|
40
|
+
apiKey: "API Key",
|
|
41
|
+
model: "Model",
|
|
42
|
+
scope: "Save scope",
|
|
43
|
+
},
|
|
44
|
+
hints: {
|
|
45
|
+
provider: "openai / anthropic / kkaiapi / custom (OpenAI-compatible proxy)",
|
|
46
|
+
baseUrl: "Your API endpoint",
|
|
47
|
+
apiKey: "Paste the API key for the selected provider.",
|
|
48
|
+
model: "e.g. gpt-4o, claude-sonnet-4-20250514, deepseek-chat",
|
|
49
|
+
scope: "global = all projects, project = this directory only",
|
|
50
|
+
},
|
|
51
|
+
defaults: {
|
|
52
|
+
provider: "openai",
|
|
53
|
+
baseUrl: "(default)",
|
|
54
|
+
scope: "[global]",
|
|
55
|
+
},
|
|
56
|
+
scopeChoices: {
|
|
57
|
+
global: "all projects",
|
|
58
|
+
project: "this directory",
|
|
59
|
+
},
|
|
60
|
+
savedTo: "Saved to",
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
title: "模型配置",
|
|
65
|
+
subtitle: "配置模型服务后即可开始使用。",
|
|
66
|
+
steps: {
|
|
67
|
+
provider: "服务提供方",
|
|
68
|
+
baseUrl: "接口地址",
|
|
69
|
+
apiKey: "API 密钥",
|
|
70
|
+
model: "模型",
|
|
71
|
+
scope: "保存范围",
|
|
72
|
+
},
|
|
73
|
+
hints: {
|
|
74
|
+
provider: "openai / anthropic / kkaiapi / custom(兼容 OpenAI 的代理)",
|
|
75
|
+
baseUrl: "你的 API 入口地址",
|
|
76
|
+
apiKey: "粘贴所选服务商的 API Key",
|
|
77
|
+
model: "例如 gpt-5.4、claude-sonnet-4-20250514、deepseek-chat",
|
|
78
|
+
scope: "global = 所有项目,project = 仅当前目录",
|
|
79
|
+
},
|
|
80
|
+
defaults: {
|
|
81
|
+
provider: "openai",
|
|
82
|
+
baseUrl: "(默认)",
|
|
83
|
+
scope: "[global]",
|
|
84
|
+
},
|
|
85
|
+
scopeChoices: {
|
|
86
|
+
global: "所有项目",
|
|
87
|
+
project: "当前目录",
|
|
88
|
+
},
|
|
89
|
+
savedTo: "已保存到",
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
export function buildAutoInitMessages(projectName, locale) {
|
|
93
|
+
if (locale === "en") {
|
|
94
|
+
return {
|
|
95
|
+
initializing: `Initializing project in ${projectName}/ ...`,
|
|
96
|
+
initialized: "Project initialized",
|
|
97
|
+
envTemplateHeader: "# LLM Configuration — run inkos tui to configure interactively",
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
initializing: `正在初始化项目:${projectName}/ ...`,
|
|
102
|
+
initialized: "项目已初始化",
|
|
103
|
+
envTemplateHeader: "# LLM 配置 —— 运行 inkos tui 进行交互式配置",
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
export async function ensureProject(cwd) {
|
|
107
|
+
const configPath = join(cwd, "inkos.json");
|
|
108
|
+
const hasConfig = await fileExists(configPath);
|
|
109
|
+
if (!hasConfig) {
|
|
110
|
+
await autoInit(cwd);
|
|
111
|
+
}
|
|
112
|
+
const hasLlm = await hasLlmConfig(cwd);
|
|
113
|
+
return { projectRoot: cwd, hasLlmConfig: hasLlm };
|
|
114
|
+
}
|
|
115
|
+
export async function interactiveLlmSetup(projectRoot) {
|
|
116
|
+
const projectLanguage = await detectProjectLanguage(projectRoot);
|
|
117
|
+
const locale = resolveTuiLocale(process.env, projectLanguage);
|
|
118
|
+
const copy = buildInteractiveSetupCopy(locale);
|
|
119
|
+
const rl = readline.createInterface({
|
|
120
|
+
input: process.stdin,
|
|
121
|
+
output: process.stdout,
|
|
122
|
+
});
|
|
123
|
+
try {
|
|
124
|
+
console.log();
|
|
125
|
+
console.log(` ${c("◈", brightCyan)} ${c(copy.title, bold, brightWhite)}`);
|
|
126
|
+
console.log(c(` ${copy.subtitle}`, dim));
|
|
127
|
+
console.log();
|
|
128
|
+
// Provider
|
|
129
|
+
console.log(` ${c("1", cyan)} ${c(copy.steps.provider, gray)}`);
|
|
130
|
+
console.log(c(` ${copy.hints.provider}`, dim));
|
|
131
|
+
const providerInput = await rl.question(` ${c("❯", cyan)} `);
|
|
132
|
+
const provider = PROVIDERS.includes(providerInput.trim())
|
|
133
|
+
? providerInput.trim()
|
|
134
|
+
: copy.defaults.provider;
|
|
135
|
+
const providerDefaultBaseUrl = provider === "kkaiapi" ? KKAIAPI_BASE_URL : copy.defaults.baseUrl;
|
|
136
|
+
console.log(` ${c("✓", brightGreen)} ${provider}`);
|
|
137
|
+
console.log();
|
|
138
|
+
// Base URL
|
|
139
|
+
console.log(` ${c("2", cyan)} ${c(copy.steps.baseUrl, gray)}`);
|
|
140
|
+
console.log(c(` ${copy.hints.baseUrl}`, dim));
|
|
141
|
+
const baseUrl = await rl.question(` ${c("❯", cyan)} `);
|
|
142
|
+
console.log(` ${c("✓", brightGreen)} ${baseUrl.trim() || providerDefaultBaseUrl}`);
|
|
143
|
+
console.log();
|
|
144
|
+
// API Key
|
|
145
|
+
console.log(` ${c("3", cyan)} ${c(copy.steps.apiKey, gray)}`);
|
|
146
|
+
console.log(c(` ${copy.hints.apiKey}`, dim));
|
|
147
|
+
const apiKey = await rl.question(` ${c("❯", cyan)} `);
|
|
148
|
+
const maskedKey = apiKey.trim().length > 8
|
|
149
|
+
? apiKey.trim().slice(0, 4) + "···" + apiKey.trim().slice(-4)
|
|
150
|
+
: "···";
|
|
151
|
+
console.log(` ${c("✓", brightGreen)} ${maskedKey}`);
|
|
152
|
+
console.log();
|
|
153
|
+
// Model
|
|
154
|
+
console.log(` ${c("4", cyan)} ${c(copy.steps.model, gray)}`);
|
|
155
|
+
console.log(c(` ${copy.hints.model}`, dim));
|
|
156
|
+
const model = await rl.question(` ${c("❯", cyan)} `);
|
|
157
|
+
console.log(` ${c("✓", brightGreen)} ${model.trim()}`);
|
|
158
|
+
console.log();
|
|
159
|
+
// Scope
|
|
160
|
+
console.log(` ${c("5", cyan)} ${c(copy.steps.scope, gray)}`);
|
|
161
|
+
console.log(c(` ${copy.hints.scope}`, dim));
|
|
162
|
+
const scope = await rl.question(` ${c("❯", cyan)} ${c(copy.defaults.scope, dim)} `);
|
|
163
|
+
const useGlobal = scope.trim().toLowerCase() !== "project";
|
|
164
|
+
const effectiveBaseUrl = baseUrl.trim() || (provider === "kkaiapi" ? providerDefaultBaseUrl : "");
|
|
165
|
+
const finalProvider = resolveSetupProvider(provider, effectiveBaseUrl);
|
|
166
|
+
const finalService = resolveSetupService(provider, effectiveBaseUrl);
|
|
167
|
+
const envContent = [
|
|
168
|
+
`INKOS_LLM_PROVIDER=${finalProvider}`,
|
|
169
|
+
...(finalService ? [`INKOS_LLM_SERVICE=${finalService}`] : []),
|
|
170
|
+
`INKOS_LLM_BASE_URL=${effectiveBaseUrl}`,
|
|
171
|
+
`INKOS_LLM_API_KEY=${apiKey.trim()}`,
|
|
172
|
+
`INKOS_LLM_MODEL=${model.trim()}`,
|
|
173
|
+
].join("\n");
|
|
174
|
+
if (useGlobal) {
|
|
175
|
+
const globalDir = join(GLOBAL_ENV_PATH, "..");
|
|
176
|
+
await mkdir(globalDir, { recursive: true });
|
|
177
|
+
await writeFile(GLOBAL_ENV_PATH, envContent + "\n", "utf-8");
|
|
178
|
+
console.log();
|
|
179
|
+
console.log(` ${c("✓", brightGreen, bold)} ${c(copy.savedTo, dim)} ${c(GLOBAL_ENV_PATH, gray)}`);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
await writeFile(join(projectRoot, ".env"), envContent + "\n", "utf-8");
|
|
183
|
+
console.log();
|
|
184
|
+
console.log(` ${c("✓", brightGreen, bold)} ${c(copy.savedTo, dim)} ${c(".env", gray)}`);
|
|
185
|
+
}
|
|
186
|
+
console.log();
|
|
187
|
+
}
|
|
188
|
+
finally {
|
|
189
|
+
rl.close();
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
async function autoInit(cwd) {
|
|
193
|
+
const projectName = basename(cwd);
|
|
194
|
+
const locale = resolveTuiLocale();
|
|
195
|
+
const messages = buildAutoInitMessages(projectName, locale);
|
|
196
|
+
console.log();
|
|
197
|
+
console.log(` ${c("◌", cyan)} ${c(messages.initializing, dim)}`);
|
|
198
|
+
await mkdir(join(cwd, "books"), { recursive: true });
|
|
199
|
+
await mkdir(join(cwd, "radar"), { recursive: true });
|
|
200
|
+
const config = {
|
|
201
|
+
name: projectName,
|
|
202
|
+
version: "0.1.0",
|
|
203
|
+
language: "zh",
|
|
204
|
+
llm: {
|
|
205
|
+
provider: process.env.INKOS_LLM_PROVIDER ?? "openai",
|
|
206
|
+
baseUrl: process.env.INKOS_LLM_BASE_URL ?? "",
|
|
207
|
+
model: process.env.INKOS_LLM_MODEL ?? "",
|
|
208
|
+
},
|
|
209
|
+
notify: [],
|
|
210
|
+
daemon: {
|
|
211
|
+
schedule: {
|
|
212
|
+
radarCron: "0 */6 * * *",
|
|
213
|
+
writeCron: "*/15 * * * *",
|
|
214
|
+
},
|
|
215
|
+
maxConcurrentBooks: 3,
|
|
216
|
+
},
|
|
217
|
+
};
|
|
218
|
+
await writeFile(join(cwd, "inkos.json"), JSON.stringify(config, null, 2), "utf-8");
|
|
219
|
+
const hasGlobal = await hasGlobalConfig();
|
|
220
|
+
if (!hasGlobal) {
|
|
221
|
+
await writeFile(join(cwd, ".env"), [
|
|
222
|
+
messages.envTemplateHeader,
|
|
223
|
+
"INKOS_LLM_PROVIDER=openai",
|
|
224
|
+
"INKOS_LLM_BASE_URL=",
|
|
225
|
+
"INKOS_LLM_API_KEY=",
|
|
226
|
+
"INKOS_LLM_MODEL=",
|
|
227
|
+
].join("\n"), "utf-8");
|
|
228
|
+
}
|
|
229
|
+
await ensureProjectGitignore(cwd);
|
|
230
|
+
console.log(` ${c("✓", brightGreen, bold)} ${c(messages.initialized, dim)}`);
|
|
231
|
+
}
|
|
232
|
+
async function hasLlmConfig(projectRoot) {
|
|
233
|
+
const projectEnv = join(projectRoot, ".env");
|
|
234
|
+
if (await checkEnvForKey(projectEnv))
|
|
235
|
+
return true;
|
|
236
|
+
return checkEnvForKey(GLOBAL_ENV_PATH);
|
|
237
|
+
}
|
|
238
|
+
async function hasGlobalConfig() {
|
|
239
|
+
return checkEnvForKey(GLOBAL_ENV_PATH);
|
|
240
|
+
}
|
|
241
|
+
async function checkEnvForKey(envPath) {
|
|
242
|
+
try {
|
|
243
|
+
const content = await readFile(envPath, "utf-8");
|
|
244
|
+
const match = content.match(/INKOS_LLM_API_KEY=(.+)/);
|
|
245
|
+
return !!match && match[1].trim().length > 0 && !match[1].includes("your-api-key");
|
|
246
|
+
}
|
|
247
|
+
catch {
|
|
248
|
+
return false;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
export async function detectModelInfo(projectRoot) {
|
|
252
|
+
try {
|
|
253
|
+
const config = await loadConfig({ requireApiKey: false, projectRoot });
|
|
254
|
+
const service = config.llm.service?.trim();
|
|
255
|
+
const provider = service || config.llm.provider || "openai";
|
|
256
|
+
const model = config.llm.model?.trim() || "unknown";
|
|
257
|
+
return {
|
|
258
|
+
provider,
|
|
259
|
+
model,
|
|
260
|
+
baseUrl: config.llm.baseUrl ?? "",
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
catch {
|
|
264
|
+
// Fall back to legacy env parsing below.
|
|
265
|
+
}
|
|
266
|
+
const paths = [join(projectRoot, ".env"), GLOBAL_ENV_PATH];
|
|
267
|
+
for (const p of paths) {
|
|
268
|
+
const info = await parseEnvModel(p);
|
|
269
|
+
if (info)
|
|
270
|
+
return info;
|
|
271
|
+
}
|
|
272
|
+
return undefined;
|
|
273
|
+
}
|
|
274
|
+
export async function detectProjectLanguage(projectRoot) {
|
|
275
|
+
try {
|
|
276
|
+
const raw = await readFile(join(projectRoot, "inkos.json"), "utf-8");
|
|
277
|
+
const parsed = JSON.parse(raw);
|
|
278
|
+
return parsed.language;
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
return undefined;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
async function parseEnvModel(envPath) {
|
|
285
|
+
try {
|
|
286
|
+
const content = await readFile(envPath, "utf-8");
|
|
287
|
+
const get = (key) => {
|
|
288
|
+
const m = content.match(new RegExp(`^${key}=(.+)$`, "m"));
|
|
289
|
+
return m?.[1]?.trim() ?? "";
|
|
290
|
+
};
|
|
291
|
+
const key = get("INKOS_LLM_API_KEY");
|
|
292
|
+
if (!key || key.includes("your-api-key"))
|
|
293
|
+
return undefined;
|
|
294
|
+
return {
|
|
295
|
+
provider: get("INKOS_LLM_PROVIDER") || "openai",
|
|
296
|
+
model: get("INKOS_LLM_MODEL") || "unknown",
|
|
297
|
+
baseUrl: get("INKOS_LLM_BASE_URL") || "",
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
catch {
|
|
301
|
+
return undefined;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
async function fileExists(path) {
|
|
305
|
+
try {
|
|
306
|
+
await access(path);
|
|
307
|
+
return true;
|
|
308
|
+
}
|
|
309
|
+
catch {
|
|
310
|
+
return false;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/tui/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { CliLanguage } from "../localization.js";
|
|
2
|
+
export declare function buildSlashCommands(language?: CliLanguage): readonly string[];
|
|
3
|
+
export declare const SLASH_COMMANDS: readonly string[];
|
|
4
|
+
export type SlashNavigationDirection = "up" | "down";
|
|
5
|
+
export declare function getSlashSuggestions(input: string, commands: readonly string[]): string[];
|
|
6
|
+
export declare function getNextSlashSelection(currentIndex: number, suggestionCount: number, direction: SlashNavigationDirection): number;
|
|
7
|
+
export declare function applySlashSuggestion(_input: string, suggestions: readonly string[], selectedIndex: number): string;
|
|
8
|
+
//# sourceMappingURL=slash-autocomplete.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slash-autocomplete.d.ts","sourceRoot":"","sources":["../../src/tui/slash-autocomplete.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAmBtD,wBAAgB,kBAAkB,CAAC,QAAQ,GAAE,WAAkB,GAAG,SAAS,MAAM,EAAE,CAElF;AAED,eAAO,MAAM,cAAc,mBAA2B,CAAC;AAEvD,MAAM,MAAM,wBAAwB,GAAG,IAAI,GAAG,MAAM,CAAC;AAErD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAOxF;AAED,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,EACvB,SAAS,EAAE,wBAAwB,GAClC,MAAM,CAUR;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,SAAS,MAAM,EAAE,EAC9B,aAAa,EAAE,MAAM,GACpB,MAAM,CAGR"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
const SLASH_COMMAND_VARIANTS = [
|
|
2
|
+
{ zh: "/new 输入你的想法", en: "/new describe your idea" },
|
|
3
|
+
{ zh: "/short 输入短篇方向", en: "/short describe the short" },
|
|
4
|
+
{ zh: "/play [open|guided] 输入互动世界开局", en: "/play [open|guided] describe the opening" },
|
|
5
|
+
{ zh: "/cover 输入封面方向", en: "/cover describe the cover" },
|
|
6
|
+
{ zh: "/write", en: "/write" },
|
|
7
|
+
{ zh: "/confirm", en: "/confirm" },
|
|
8
|
+
{ zh: "/cancel", en: "/cancel" },
|
|
9
|
+
{ zh: "/model <model>", en: "/model <model>" },
|
|
10
|
+
{ zh: "/help", en: "/help" },
|
|
11
|
+
{ zh: "/status", en: "/status" },
|
|
12
|
+
{ zh: "/clear", en: "/clear" },
|
|
13
|
+
{ zh: "/depth <light|normal|deep>", en: "/depth <light|normal|deep>" },
|
|
14
|
+
{ zh: "/quit", en: "/quit" },
|
|
15
|
+
{ zh: "/exit", en: "/exit" },
|
|
16
|
+
];
|
|
17
|
+
export function buildSlashCommands(language = "zh") {
|
|
18
|
+
return SLASH_COMMAND_VARIANTS.map((variant) => (language === "en" ? variant.en : variant.zh));
|
|
19
|
+
}
|
|
20
|
+
export const SLASH_COMMANDS = buildSlashCommands("zh");
|
|
21
|
+
export function getSlashSuggestions(input, commands) {
|
|
22
|
+
const value = input.trim();
|
|
23
|
+
if (!value.startsWith("/")) {
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
return commands.filter((command) => slashCommandStem(command).startsWith(value));
|
|
27
|
+
}
|
|
28
|
+
export function getNextSlashSelection(currentIndex, suggestionCount, direction) {
|
|
29
|
+
if (suggestionCount <= 0) {
|
|
30
|
+
return 0;
|
|
31
|
+
}
|
|
32
|
+
if (direction === "down") {
|
|
33
|
+
return (currentIndex + 1) % suggestionCount;
|
|
34
|
+
}
|
|
35
|
+
return (currentIndex - 1 + suggestionCount) % suggestionCount;
|
|
36
|
+
}
|
|
37
|
+
export function applySlashSuggestion(_input, suggestions, selectedIndex) {
|
|
38
|
+
const suggestion = suggestions[selectedIndex] ?? "";
|
|
39
|
+
return slashSuggestionInsertion(suggestion);
|
|
40
|
+
}
|
|
41
|
+
function slashCommandStem(command) {
|
|
42
|
+
return command.match(/^\/\S+/)?.[0] ?? command;
|
|
43
|
+
}
|
|
44
|
+
function slashSuggestionInsertion(suggestion) {
|
|
45
|
+
const stem = slashCommandStem(suggestion);
|
|
46
|
+
return suggestion === stem ? stem : `${stem} `;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=slash-autocomplete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slash-autocomplete.js","sourceRoot":"","sources":["../../src/tui/slash-autocomplete.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/** Whether the terminal is macOS Terminal.app. */
|
|
2
|
+
export declare const isAppleTerminal: boolean;
|
|
3
|
+
export type TerminalBackground = "dark" | "light";
|
|
4
|
+
export interface TuiTheme {
|
|
5
|
+
readonly accent: string;
|
|
6
|
+
readonly muted: string;
|
|
7
|
+
readonly reply: string;
|
|
8
|
+
readonly border: string;
|
|
9
|
+
readonly success: string;
|
|
10
|
+
readonly error: string;
|
|
11
|
+
readonly active: string;
|
|
12
|
+
readonly idle: string;
|
|
13
|
+
readonly user: string;
|
|
14
|
+
readonly system: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function detectTerminalBackground(env?: Partial<NodeJS.ProcessEnv>): TerminalBackground;
|
|
17
|
+
export declare function resolveTuiTheme(env?: Partial<NodeJS.ProcessEnv>): TuiTheme;
|
|
18
|
+
export declare const WARM_ACCENT: string;
|
|
19
|
+
export declare const WARM_MUTED: string;
|
|
20
|
+
export declare const WARM_REPLY: string;
|
|
21
|
+
export declare const WARM_BORDER: string;
|
|
22
|
+
export declare const STATUS_SUCCESS: string;
|
|
23
|
+
export declare const STATUS_ERROR: string;
|
|
24
|
+
export declare const STATUS_ACTIVE: string;
|
|
25
|
+
export declare const STATUS_IDLE: string;
|
|
26
|
+
export declare const ROLE_USER: string;
|
|
27
|
+
export declare const ROLE_SYSTEM: string;
|
|
28
|
+
//# sourceMappingURL=theme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/tui/theme.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,eAAO,MAAM,eAAe,SAAgD,CAAC;AAE7E,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,OAAO,CAAC;AAElD,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AA4BD,wBAAgB,wBAAwB,CAAC,GAAG,GAAE,OAAO,CAAC,MAAM,CAAC,UAAU,CAAe,GAAG,kBAAkB,CAU1G;AAED,wBAAgB,eAAe,CAAC,GAAG,GAAE,OAAO,CAAC,MAAM,CAAC,UAAU,CAAe,GAAG,QAAQ,CAEvF;AAID,eAAO,MAAM,WAAW,QAAuB,CAAC;AAChD,eAAO,MAAM,UAAU,QAAsB,CAAC;AAC9C,eAAO,MAAM,UAAU,QAAsB,CAAC;AAC9C,eAAO,MAAM,WAAW,QAAuB,CAAC;AAChD,eAAO,MAAM,cAAc,QAAwB,CAAC;AACpD,eAAO,MAAM,YAAY,QAAsB,CAAC;AAChD,eAAO,MAAM,aAAa,QAAuB,CAAC;AAClD,eAAO,MAAM,WAAW,QAAqB,CAAC;AAC9C,eAAO,MAAM,SAAS,QAAqB,CAAC;AAC5C,eAAO,MAAM,WAAW,QAAuB,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/** Whether the terminal is macOS Terminal.app. */
|
|
2
|
+
export const isAppleTerminal = process.env.TERM_PROGRAM === "Apple_Terminal";
|
|
3
|
+
const DARK_THEME = {
|
|
4
|
+
accent: "#d49a63",
|
|
5
|
+
muted: "#b8aa99",
|
|
6
|
+
reply: "#f7efe3",
|
|
7
|
+
border: "#8f8173",
|
|
8
|
+
success: "#8fd18f",
|
|
9
|
+
error: "#ff6f6f",
|
|
10
|
+
active: "#e0ad6f",
|
|
11
|
+
idle: "#a79a8c",
|
|
12
|
+
user: "#9bd3ef",
|
|
13
|
+
system: "#c8b1ef",
|
|
14
|
+
};
|
|
15
|
+
const LIGHT_THEME = {
|
|
16
|
+
accent: "#8a4f18",
|
|
17
|
+
muted: "#5f554b",
|
|
18
|
+
reply: "#1f1711",
|
|
19
|
+
border: "#7d7165",
|
|
20
|
+
success: "#1b7f3a",
|
|
21
|
+
error: "#b42318",
|
|
22
|
+
active: "#9a5f1f",
|
|
23
|
+
idle: "#6b6156",
|
|
24
|
+
user: "#005f87",
|
|
25
|
+
system: "#6b3fa0",
|
|
26
|
+
};
|
|
27
|
+
export function detectTerminalBackground(env = process.env) {
|
|
28
|
+
const explicit = env.INKOS_TUI_THEME?.trim().toLowerCase();
|
|
29
|
+
if (explicit === "light" || explicit === "dark")
|
|
30
|
+
return explicit;
|
|
31
|
+
const colorFgBg = env.COLORFGBG?.trim();
|
|
32
|
+
if (colorFgBg) {
|
|
33
|
+
const background = Number(colorFgBg.split(/[;:]/).at(-1));
|
|
34
|
+
if (Number.isFinite(background))
|
|
35
|
+
return background === 7 || background === 15 ? "light" : "dark";
|
|
36
|
+
}
|
|
37
|
+
return "dark";
|
|
38
|
+
}
|
|
39
|
+
export function resolveTuiTheme(env = process.env) {
|
|
40
|
+
return detectTerminalBackground(env) === "light" ? LIGHT_THEME : DARK_THEME;
|
|
41
|
+
}
|
|
42
|
+
const CURRENT_THEME = resolveTuiTheme();
|
|
43
|
+
export const WARM_ACCENT = CURRENT_THEME.accent;
|
|
44
|
+
export const WARM_MUTED = CURRENT_THEME.muted;
|
|
45
|
+
export const WARM_REPLY = CURRENT_THEME.reply;
|
|
46
|
+
export const WARM_BORDER = CURRENT_THEME.border;
|
|
47
|
+
export const STATUS_SUCCESS = CURRENT_THEME.success;
|
|
48
|
+
export const STATUS_ERROR = CURRENT_THEME.error;
|
|
49
|
+
export const STATUS_ACTIVE = CURRENT_THEME.active;
|
|
50
|
+
export const STATUS_IDLE = CURRENT_THEME.idle;
|
|
51
|
+
export const ROLE_USER = CURRENT_THEME.user;
|
|
52
|
+
export const ROLE_SYSTEM = CURRENT_THEME.system;
|
|
53
|
+
//# sourceMappingURL=theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/tui/theme.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,MAAM,CAAC,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,gBAAgB,CAAC;AAiB7E,MAAM,UAAU,GAAa;IAC3B,MAAM,EAAE,SAAS;IACjB,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,SAAS;IACjB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,SAAS;CAClB,CAAC;AAEF,MAAM,WAAW,GAAa;IAC5B,MAAM,EAAE,SAAS;IACjB,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,SAAS;IACjB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,SAAS;CAClB,CAAC;AAEF,MAAM,UAAU,wBAAwB,CAAC,MAAkC,OAAO,CAAC,GAAG;IACpF,MAAM,QAAQ,GAAG,GAAG,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3D,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,QAAQ,CAAC;IAEjE,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC;IACxC,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;YAAE,OAAO,UAAU,KAAK,CAAC,IAAI,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IACnG,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAkC,OAAO,CAAC,GAAG;IAC3E,OAAO,wBAAwB,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC;AAC9E,CAAC;AAED,MAAM,aAAa,GAAG,eAAe,EAAE,CAAC;AAExC,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC;AAChD,MAAM,CAAC,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC;AAC9C,MAAM,CAAC,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC;AAC9C,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC;AAChD,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAC,OAAO,CAAC;AACpD,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAC,KAAK,CAAC;AAChD,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC;AAClD,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC;AAC9C,MAAM,CAAC,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC;AAC5C,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC"}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { GLOBAL_CONFIG_DIR, GLOBAL_ENV_PATH, type EffectiveLLMConfigResult, type LLMConfigCliOverrides, type ProjectConfig, type PipelineConfig } from "@kienmatu/inkos-core";
|
|
2
|
+
export { GLOBAL_CONFIG_DIR, GLOBAL_ENV_PATH };
|
|
3
|
+
export declare function resolveContext(opts: {
|
|
4
|
+
readonly context?: string;
|
|
5
|
+
readonly contextFile?: string;
|
|
6
|
+
}): Promise<string | undefined>;
|
|
7
|
+
export declare function findProjectRoot(): string;
|
|
8
|
+
export declare function loadConfig(options?: {
|
|
9
|
+
readonly requireApiKey?: boolean;
|
|
10
|
+
readonly projectRoot?: string;
|
|
11
|
+
readonly cli?: LLMConfigCliOverrides;
|
|
12
|
+
}): Promise<ProjectConfig>;
|
|
13
|
+
export declare function loadConfigWithDiagnostics(options?: {
|
|
14
|
+
readonly requireApiKey?: boolean;
|
|
15
|
+
readonly projectRoot?: string;
|
|
16
|
+
readonly cli?: LLMConfigCliOverrides;
|
|
17
|
+
}): Promise<EffectiveLLMConfigResult>;
|
|
18
|
+
export declare function createClient(config: ProjectConfig): import("@kienmatu/inkos-core").LLMClient;
|
|
19
|
+
export declare function parseLLMOverridesFromArgv(argv: readonly string[]): LLMConfigCliOverrides;
|
|
20
|
+
export declare function buildPipelineConfig(config: ProjectConfig, root: string, extra?: Partial<Pick<PipelineConfig, "notifyChannels" | "radarSources" | "externalContext" | "chapterReviewMode" | "revisionGate">> & {
|
|
21
|
+
readonly quiet?: boolean;
|
|
22
|
+
readonly logFile?: NodeJS.WritableStream;
|
|
23
|
+
}): PipelineConfig;
|
|
24
|
+
export declare function log(message: string): void;
|
|
25
|
+
export declare function logError(message: string): void;
|
|
26
|
+
/**
|
|
27
|
+
* Resolve book-id: if provided use it, otherwise auto-detect when exactly one book exists.
|
|
28
|
+
* Validates that the book actually exists.
|
|
29
|
+
*/
|
|
30
|
+
export declare function resolveBookId(bookIdArg: string | undefined, root: string): Promise<string>;
|
|
31
|
+
export declare function getLegacyMigrationHint(root: string, bookId: string): Promise<string | null>;
|
|
32
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkI,iBAAiB,EAAE,eAAe,EAAE,KAAK,wBAAwB,EAAE,KAAK,qBAAqB,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,EAAgB,MAAM,sBAAsB,CAAC;AAE5T,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,CAAC;AAG9C,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAe9B;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAsB,UAAU,CAAC,OAAO,CAAC,EAAE;IACzC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,GAAG,CAAC,EAAE,qBAAqB,CAAC;CACtC,GAAG,OAAO,CAAC,aAAa,CAAC,CAEzB;AAED,wBAAsB,yBAAyB,CAAC,OAAO,CAAC,EAAE;IACxD,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,GAAG,CAAC,EAAE,qBAAqB,CAAC;CACtC,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAcpC;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,4CAEjD;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,qBAAqB,CAwCxF;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,gBAAgB,GAAG,cAAc,GAAG,iBAAiB,GAAG,mBAAmB,GAAG,cAAc,CAAC,CAAC,GAAG;IACpI,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;CAC1C,GACA,cAAc,CAsChB;AAED,wBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEzC;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,CAyBjB;AAED,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAYxB"}
|