@actalk/inkos 1.1.1 → 1.2.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 -21
- package/dist/commands/interact.d.ts +25 -0
- package/dist/commands/interact.d.ts.map +1 -0
- package/dist/commands/interact.js +73 -0
- package/dist/commands/interact.js.map +1 -0
- package/dist/commands/revise.d.ts.map +1 -1
- package/dist/commands/revise.js +4 -1
- package/dist/commands/revise.js.map +1 -1
- package/dist/commands/studio.d.ts +5 -0
- package/dist/commands/studio.d.ts.map +1 -1
- package/dist/commands/studio.js +23 -1
- package/dist/commands/studio.js.map +1 -1
- 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/write.js +65 -1
- package/dist/commands/write.js.map +1 -1
- package/dist/index.js +2 -63
- package/dist/index.js.map +1 -1
- package/dist/localization.d.ts +0 -1
- package/dist/localization.d.ts.map +1 -1
- package/dist/localization.js +0 -6
- package/dist/localization.js.map +1 -1
- package/dist/program.d.ts +10 -0
- package/dist/program.d.ts.map +1 -0
- package/dist/program.js +85 -0
- package/dist/program.js.map +1 -0
- package/dist/tui/activity-state.d.ts +10 -0
- package/dist/tui/activity-state.d.ts.map +1 -0
- package/dist/tui/activity-state.js +27 -0
- package/dist/tui/activity-state.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 +103 -0
- package/dist/tui/app.d.ts.map +1 -0
- package/dist/tui/app.js +134 -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 +12 -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 +45 -0
- package/dist/tui/dashboard-model.d.ts.map +1 -0
- package/dist/tui/dashboard-model.js +101 -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 +320 -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 +459 -0
- package/dist/tui/effects.js.map +1 -0
- package/dist/tui/i18n.d.ts +69 -0
- package/dist/tui/i18n.d.ts.map +1 -0
- package/dist/tui/i18n.js +239 -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 +5 -0
- package/dist/tui/local-commands.d.ts.map +1 -0
- package/dist/tui/local-commands.js +43 -0
- package/dist/tui/local-commands.js.map +1 -0
- package/dist/tui/output.d.ts +11 -0
- package/dist/tui/output.d.ts.map +1 -0
- package/dist/tui/output.js +24 -0
- package/dist/tui/output.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 +49 -0
- package/dist/tui/setup.d.ts.map +1 -0
- package/dist/tui/setup.js +268 -0
- package/dist/tui/setup.js.map +1 -0
- package/dist/tui/slash-autocomplete.d.ts +6 -0
- package/dist/tui/slash-autocomplete.d.ts.map +1 -0
- package/dist/tui/slash-autocomplete.js +50 -0
- package/dist/tui/slash-autocomplete.js.map +1 -0
- package/dist/tui/theme.d.ts +11 -0
- package/dist/tui/theme.d.ts.map +1 -0
- package/dist/tui/theme.js +13 -0
- package/dist/tui/theme.js.map +1 -0
- package/dist/tui/tools.d.ts +15 -0
- package/dist/tui/tools.d.ts.map +1 -0
- package/dist/tui/tools.js +17 -0
- package/dist/tui/tools.js.map +1 -0
- package/package.json +12 -7
|
@@ -0,0 +1,268 @@
|
|
|
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 } from "../utils.js";
|
|
8
|
+
const PROVIDERS = ["openai", "anthropic", "custom"];
|
|
9
|
+
export function buildInteractiveSetupCopy(locale) {
|
|
10
|
+
if (locale === "en") {
|
|
11
|
+
return {
|
|
12
|
+
title: "LLM Setup",
|
|
13
|
+
subtitle: "Configure your model provider to start writing.",
|
|
14
|
+
steps: {
|
|
15
|
+
provider: "Provider",
|
|
16
|
+
baseUrl: "Base URL",
|
|
17
|
+
apiKey: "API Key",
|
|
18
|
+
model: "Model",
|
|
19
|
+
scope: "Save scope",
|
|
20
|
+
},
|
|
21
|
+
hints: {
|
|
22
|
+
provider: "openai / anthropic / custom (OpenAI-compatible proxy)",
|
|
23
|
+
baseUrl: "Your API endpoint",
|
|
24
|
+
model: "e.g. gpt-4o, claude-sonnet-4-20250514, deepseek-chat",
|
|
25
|
+
scope: "global = all projects, project = this directory only",
|
|
26
|
+
},
|
|
27
|
+
defaults: {
|
|
28
|
+
provider: "openai",
|
|
29
|
+
baseUrl: "(default)",
|
|
30
|
+
scope: "[global]",
|
|
31
|
+
},
|
|
32
|
+
scopeChoices: {
|
|
33
|
+
global: "all projects",
|
|
34
|
+
project: "this directory",
|
|
35
|
+
},
|
|
36
|
+
savedTo: "Saved to",
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
title: "模型配置",
|
|
41
|
+
subtitle: "配置模型服务后即可开始使用。",
|
|
42
|
+
steps: {
|
|
43
|
+
provider: "服务提供方",
|
|
44
|
+
baseUrl: "接口地址",
|
|
45
|
+
apiKey: "API 密钥",
|
|
46
|
+
model: "模型",
|
|
47
|
+
scope: "保存范围",
|
|
48
|
+
},
|
|
49
|
+
hints: {
|
|
50
|
+
provider: "openai / anthropic / custom(兼容 OpenAI 的代理)",
|
|
51
|
+
baseUrl: "你的 API 入口地址",
|
|
52
|
+
model: "例如 gpt-5.4、claude-sonnet-4-20250514、deepseek-chat",
|
|
53
|
+
scope: "global = 所有项目,project = 仅当前目录",
|
|
54
|
+
},
|
|
55
|
+
defaults: {
|
|
56
|
+
provider: "openai",
|
|
57
|
+
baseUrl: "(默认)",
|
|
58
|
+
scope: "[global]",
|
|
59
|
+
},
|
|
60
|
+
scopeChoices: {
|
|
61
|
+
global: "所有项目",
|
|
62
|
+
project: "当前目录",
|
|
63
|
+
},
|
|
64
|
+
savedTo: "已保存到",
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export function buildAutoInitMessages(projectName, locale) {
|
|
68
|
+
if (locale === "en") {
|
|
69
|
+
return {
|
|
70
|
+
initializing: `Initializing project in ${projectName}/ ...`,
|
|
71
|
+
initialized: "Project initialized",
|
|
72
|
+
envTemplateHeader: "# LLM Configuration — run inkos tui to configure interactively",
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
initializing: `正在初始化项目:${projectName}/ ...`,
|
|
77
|
+
initialized: "项目已初始化",
|
|
78
|
+
envTemplateHeader: "# LLM 配置 —— 运行 inkos tui 进行交互式配置",
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
export async function ensureProject(cwd) {
|
|
82
|
+
const configPath = join(cwd, "inkos.json");
|
|
83
|
+
const hasConfig = await fileExists(configPath);
|
|
84
|
+
if (!hasConfig) {
|
|
85
|
+
await autoInit(cwd);
|
|
86
|
+
}
|
|
87
|
+
const hasLlm = await hasLlmConfig(cwd);
|
|
88
|
+
return { projectRoot: cwd, hasLlmConfig: hasLlm };
|
|
89
|
+
}
|
|
90
|
+
export async function interactiveLlmSetup(projectRoot) {
|
|
91
|
+
const projectLanguage = await detectProjectLanguage(projectRoot);
|
|
92
|
+
const locale = resolveTuiLocale(process.env, projectLanguage);
|
|
93
|
+
const copy = buildInteractiveSetupCopy(locale);
|
|
94
|
+
const rl = readline.createInterface({
|
|
95
|
+
input: process.stdin,
|
|
96
|
+
output: process.stdout,
|
|
97
|
+
});
|
|
98
|
+
try {
|
|
99
|
+
console.log();
|
|
100
|
+
console.log(` ${c("◈", brightCyan)} ${c(copy.title, bold, brightWhite)}`);
|
|
101
|
+
console.log(c(` ${copy.subtitle}`, dim));
|
|
102
|
+
console.log();
|
|
103
|
+
// Provider
|
|
104
|
+
console.log(` ${c("1", cyan)} ${c(copy.steps.provider, gray)}`);
|
|
105
|
+
console.log(c(` ${copy.hints.provider}`, dim));
|
|
106
|
+
const providerInput = await rl.question(` ${c("❯", cyan)} `);
|
|
107
|
+
const provider = PROVIDERS.includes(providerInput.trim())
|
|
108
|
+
? providerInput.trim()
|
|
109
|
+
: copy.defaults.provider;
|
|
110
|
+
console.log(` ${c("✓", brightGreen)} ${provider}`);
|
|
111
|
+
console.log();
|
|
112
|
+
// Base URL
|
|
113
|
+
console.log(` ${c("2", cyan)} ${c(copy.steps.baseUrl, gray)}`);
|
|
114
|
+
console.log(c(` ${copy.hints.baseUrl}`, dim));
|
|
115
|
+
const baseUrl = await rl.question(` ${c("❯", cyan)} `);
|
|
116
|
+
console.log(` ${c("✓", brightGreen)} ${baseUrl.trim() || copy.defaults.baseUrl}`);
|
|
117
|
+
console.log();
|
|
118
|
+
// API Key
|
|
119
|
+
console.log(` ${c("3", cyan)} ${c(copy.steps.apiKey, gray)}`);
|
|
120
|
+
const apiKey = await rl.question(` ${c("❯", cyan)} `);
|
|
121
|
+
const maskedKey = apiKey.trim().length > 8
|
|
122
|
+
? apiKey.trim().slice(0, 4) + "···" + apiKey.trim().slice(-4)
|
|
123
|
+
: "···";
|
|
124
|
+
console.log(` ${c("✓", brightGreen)} ${maskedKey}`);
|
|
125
|
+
console.log();
|
|
126
|
+
// Model
|
|
127
|
+
console.log(` ${c("4", cyan)} ${c(copy.steps.model, gray)}`);
|
|
128
|
+
console.log(c(` ${copy.hints.model}`, dim));
|
|
129
|
+
const model = await rl.question(` ${c("❯", cyan)} `);
|
|
130
|
+
console.log(` ${c("✓", brightGreen)} ${model.trim()}`);
|
|
131
|
+
console.log();
|
|
132
|
+
// Scope
|
|
133
|
+
console.log(` ${c("5", cyan)} ${c(copy.steps.scope, gray)}`);
|
|
134
|
+
console.log(c(` ${copy.hints.scope}`, dim));
|
|
135
|
+
const scope = await rl.question(` ${c("❯", cyan)} ${c(copy.defaults.scope, dim)} `);
|
|
136
|
+
const useGlobal = scope.trim().toLowerCase() !== "project";
|
|
137
|
+
const envContent = [
|
|
138
|
+
`INKOS_LLM_PROVIDER=${provider}`,
|
|
139
|
+
`INKOS_LLM_BASE_URL=${baseUrl.trim()}`,
|
|
140
|
+
`INKOS_LLM_API_KEY=${apiKey.trim()}`,
|
|
141
|
+
`INKOS_LLM_MODEL=${model.trim()}`,
|
|
142
|
+
].join("\n");
|
|
143
|
+
if (useGlobal) {
|
|
144
|
+
const globalDir = join(GLOBAL_ENV_PATH, "..");
|
|
145
|
+
await mkdir(globalDir, { recursive: true });
|
|
146
|
+
await writeFile(GLOBAL_ENV_PATH, envContent + "\n", "utf-8");
|
|
147
|
+
console.log();
|
|
148
|
+
console.log(` ${c("✓", brightGreen, bold)} ${c(copy.savedTo, dim)} ${c(GLOBAL_ENV_PATH, gray)}`);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
await writeFile(join(projectRoot, ".env"), envContent + "\n", "utf-8");
|
|
152
|
+
console.log();
|
|
153
|
+
console.log(` ${c("✓", brightGreen, bold)} ${c(copy.savedTo, dim)} ${c(".env", gray)}`);
|
|
154
|
+
}
|
|
155
|
+
console.log();
|
|
156
|
+
}
|
|
157
|
+
finally {
|
|
158
|
+
rl.close();
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
async function autoInit(cwd) {
|
|
162
|
+
const projectName = basename(cwd);
|
|
163
|
+
const locale = resolveTuiLocale();
|
|
164
|
+
const messages = buildAutoInitMessages(projectName, locale);
|
|
165
|
+
console.log();
|
|
166
|
+
console.log(` ${c("◌", cyan)} ${c(messages.initializing, dim)}`);
|
|
167
|
+
await mkdir(join(cwd, "books"), { recursive: true });
|
|
168
|
+
await mkdir(join(cwd, "radar"), { recursive: true });
|
|
169
|
+
const config = {
|
|
170
|
+
name: projectName,
|
|
171
|
+
version: "0.1.0",
|
|
172
|
+
language: "zh",
|
|
173
|
+
llm: {
|
|
174
|
+
provider: process.env.INKOS_LLM_PROVIDER ?? "openai",
|
|
175
|
+
baseUrl: process.env.INKOS_LLM_BASE_URL ?? "",
|
|
176
|
+
model: process.env.INKOS_LLM_MODEL ?? "",
|
|
177
|
+
},
|
|
178
|
+
notify: [],
|
|
179
|
+
daemon: {
|
|
180
|
+
schedule: {
|
|
181
|
+
radarCron: "0 */6 * * *",
|
|
182
|
+
writeCron: "*/15 * * * *",
|
|
183
|
+
},
|
|
184
|
+
maxConcurrentBooks: 3,
|
|
185
|
+
},
|
|
186
|
+
};
|
|
187
|
+
await writeFile(join(cwd, "inkos.json"), JSON.stringify(config, null, 2), "utf-8");
|
|
188
|
+
const hasGlobal = await hasGlobalConfig();
|
|
189
|
+
if (!hasGlobal) {
|
|
190
|
+
await writeFile(join(cwd, ".env"), [
|
|
191
|
+
messages.envTemplateHeader,
|
|
192
|
+
"INKOS_LLM_PROVIDER=openai",
|
|
193
|
+
"INKOS_LLM_BASE_URL=",
|
|
194
|
+
"INKOS_LLM_API_KEY=",
|
|
195
|
+
"INKOS_LLM_MODEL=",
|
|
196
|
+
].join("\n"), "utf-8");
|
|
197
|
+
}
|
|
198
|
+
await writeFile(join(cwd, ".gitignore"), [".env", "node_modules/", ".DS_Store"].join("\n"), "utf-8");
|
|
199
|
+
console.log(` ${c("✓", brightGreen, bold)} ${c(messages.initialized, dim)}`);
|
|
200
|
+
}
|
|
201
|
+
async function hasLlmConfig(projectRoot) {
|
|
202
|
+
const projectEnv = join(projectRoot, ".env");
|
|
203
|
+
if (await checkEnvForKey(projectEnv))
|
|
204
|
+
return true;
|
|
205
|
+
return checkEnvForKey(GLOBAL_ENV_PATH);
|
|
206
|
+
}
|
|
207
|
+
async function hasGlobalConfig() {
|
|
208
|
+
return checkEnvForKey(GLOBAL_ENV_PATH);
|
|
209
|
+
}
|
|
210
|
+
async function checkEnvForKey(envPath) {
|
|
211
|
+
try {
|
|
212
|
+
const content = await readFile(envPath, "utf-8");
|
|
213
|
+
const match = content.match(/INKOS_LLM_API_KEY=(.+)/);
|
|
214
|
+
return !!match && match[1].trim().length > 0 && !match[1].includes("your-api-key");
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
export async function detectModelInfo(projectRoot) {
|
|
221
|
+
const paths = [join(projectRoot, ".env"), GLOBAL_ENV_PATH];
|
|
222
|
+
for (const p of paths) {
|
|
223
|
+
const info = await parseEnvModel(p);
|
|
224
|
+
if (info)
|
|
225
|
+
return info;
|
|
226
|
+
}
|
|
227
|
+
return undefined;
|
|
228
|
+
}
|
|
229
|
+
export async function detectProjectLanguage(projectRoot) {
|
|
230
|
+
try {
|
|
231
|
+
const raw = await readFile(join(projectRoot, "inkos.json"), "utf-8");
|
|
232
|
+
const parsed = JSON.parse(raw);
|
|
233
|
+
return parsed.language;
|
|
234
|
+
}
|
|
235
|
+
catch {
|
|
236
|
+
return undefined;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
async function parseEnvModel(envPath) {
|
|
240
|
+
try {
|
|
241
|
+
const content = await readFile(envPath, "utf-8");
|
|
242
|
+
const get = (key) => {
|
|
243
|
+
const m = content.match(new RegExp(`^${key}=(.+)$`, "m"));
|
|
244
|
+
return m?.[1]?.trim() ?? "";
|
|
245
|
+
};
|
|
246
|
+
const key = get("INKOS_LLM_API_KEY");
|
|
247
|
+
if (!key || key.includes("your-api-key"))
|
|
248
|
+
return undefined;
|
|
249
|
+
return {
|
|
250
|
+
provider: get("INKOS_LLM_PROVIDER") || "openai",
|
|
251
|
+
model: get("INKOS_LLM_MODEL") || "unknown",
|
|
252
|
+
baseUrl: get("INKOS_LLM_BASE_URL") || "",
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
catch {
|
|
256
|
+
return undefined;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
async function fileExists(path) {
|
|
260
|
+
try {
|
|
261
|
+
await access(path);
|
|
262
|
+
return true;
|
|
263
|
+
}
|
|
264
|
+
catch {
|
|
265
|
+
return false;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/tui/setup.ts"],"names":[],"mappings":"AAAA,qDAAqD;AAErD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EACL,CAAC,EAAE,IAAI,EAAE,GAAG,EACZ,IAAI,EAAiB,IAAI,EACzB,UAAU,EAAE,WAAW,EAAE,WAAW,GACrC,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,gBAAgB,EAAkB,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,SAAS,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAU,CAAC;AAmC7D,MAAM,UAAU,yBAAyB,CAAC,MAAiB;IACzD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO;YACL,KAAK,EAAE,WAAW;YAClB,QAAQ,EAAE,iDAAiD;YAC3D,KAAK,EAAE;gBACL,QAAQ,EAAE,UAAU;gBACpB,OAAO,EAAE,UAAU;gBACnB,MAAM,EAAE,SAAS;gBACjB,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,YAAY;aACpB;YACD,KAAK,EAAE;gBACL,QAAQ,EAAE,uDAAuD;gBACjE,OAAO,EAAE,mBAAmB;gBAC5B,KAAK,EAAE,sDAAsD;gBAC7D,KAAK,EAAE,sDAAsD;aAC9D;YACD,QAAQ,EAAE;gBACR,QAAQ,EAAE,QAAQ;gBAClB,OAAO,EAAE,WAAW;gBACpB,KAAK,EAAE,UAAU;aAClB;YACD,YAAY,EAAE;gBACZ,MAAM,EAAE,cAAc;gBACtB,OAAO,EAAE,gBAAgB;aAC1B;YACD,OAAO,EAAE,UAAU;SACpB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,KAAK,EAAE,MAAM;QACb,QAAQ,EAAE,gBAAgB;QAC1B,KAAK,EAAE;YACL,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,MAAM;YACf,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,MAAM;SACd;QACD,KAAK,EAAE;YACL,QAAQ,EAAE,4CAA4C;YACtD,OAAO,EAAE,aAAa;YACtB,KAAK,EAAE,mDAAmD;YAC1D,KAAK,EAAE,+BAA+B;SACvC;QACD,QAAQ,EAAE;YACR,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,MAAM;YACf,KAAK,EAAE,UAAU;SAClB;QACD,YAAY,EAAE;YACZ,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,MAAM;SAChB;QACD,OAAO,EAAE,MAAM;KAChB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,WAAmB,EAAE,MAAiB;IAK1E,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO;YACL,YAAY,EAAE,2BAA2B,WAAW,OAAO;YAC3D,WAAW,EAAE,qBAAqB;YAClC,iBAAiB,EAAE,gEAAgE;SACpF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,YAAY,EAAE,WAAW,WAAW,OAAO;QAC3C,WAAW,EAAE,QAAQ;QACrB,iBAAiB,EAAE,kCAAkC;KACtD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAW;IAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;IAE/C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;IACvC,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,WAAmB;IAEnB,MAAM,eAAe,GAAG,MAAM,qBAAqB,CAAC,WAAW,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;QAC3E,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,WAAW;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;QACnD,MAAM,aAAa,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QACjE,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,EAA8B,CAAC;YACnF,CAAC,CAAC,aAAa,CAAC,IAAI,EAAE;YACtB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,WAAW;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QACtF,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,UAAU;QACV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1D,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YACxC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC7D,CAAC,CAAC,KAAK,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,QAAQ;QACR,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,QAAQ;QACR,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;QACxF,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,SAAS,CAAC;QAE3D,MAAM,UAAU,GAAG;YACjB,sBAAsB,QAAQ,EAAE;YAChC,sBAAsB,OAAO,CAAC,IAAI,EAAE,EAAE;YACtC,qBAAqB,MAAM,CAAC,IAAI,EAAE,EAAE;YACpC,mBAAmB,KAAK,CAAC,IAAI,EAAE,EAAE;SAClC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;YAC9C,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5C,MAAM,SAAS,CAAC,eAAe,EAAE,UAAU,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,eAAe,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACpG,CAAC;aAAM,CAAC;YACN,MAAM,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;YACvE,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3F,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,GAAW;IACjC,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,YAAY,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAElE,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAErD,MAAM,MAAM,GAAG;QACb,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,OAAO;QAChB,QAAQ,EAAE,IAAI;QACd,GAAG,EAAE;YACH,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,QAAQ;YACpD,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE;YAC7C,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE;SACzC;QACD,MAAM,EAAE,EAAE;QACV,MAAM,EAAE;YACN,QAAQ,EAAE;gBACR,SAAS,EAAE,aAAa;gBACxB,SAAS,EAAE,cAAc;aAC1B;YACD,kBAAkB,EAAE,CAAC;SACtB;KACF,CAAC;IAEF,MAAM,SAAS,CACb,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,EACvB,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAC/B,OAAO,CACR,CAAC;IAEF,MAAM,SAAS,GAAG,MAAM,eAAe,EAAE,CAAC;IAC1C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,SAAS,CACb,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,EACjB;YACE,QAAQ,CAAC,iBAAiB;YAC1B,2BAA2B;YAC3B,qBAAqB;YACrB,oBAAoB;YACpB,kBAAkB;SACnB,CAAC,IAAI,CAAC,IAAI,CAAC,EACZ,OAAO,CACR,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,CACb,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,EACvB,CAAC,MAAM,EAAE,eAAe,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EACjD,OAAO,CACR,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;AAChF,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,WAAmB;IAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC7C,IAAI,MAAM,cAAc,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAClD,OAAO,cAAc,CAAC,eAAe,CAAC,CAAC;AACzC,CAAC;AAED,KAAK,UAAU,eAAe;IAC5B,OAAO,cAAc,CAAC,eAAe,CAAC,CAAC;AACzC,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,OAAe;IAC3C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QACtD,OAAO,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IACvF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,WAAmB;IACvD,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,eAAe,CAAC,CAAC;IAC3D,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;IACxB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,WAAmB;IAC7D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;QACrE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA0B,CAAC;QACxD,OAAO,MAAM,CAAC,QAAQ,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,OAAe;IAC1C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,GAAG,GAAG,CAAC,GAAW,EAAE,EAAE;YAC1B,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;YAC1D,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC9B,CAAC,CAAC;QACF,MAAM,GAAG,GAAG,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC;YAAE,OAAO,SAAS,CAAC;QAC3D,OAAO;YACL,QAAQ,EAAE,GAAG,CAAC,oBAAoB,CAAC,IAAI,QAAQ;YAC/C,KAAK,EAAE,GAAG,CAAC,iBAAiB,CAAC,IAAI,SAAS;YAC1C,OAAO,EAAE,GAAG,CAAC,oBAAoB,CAAC,IAAI,EAAE;SACzC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAY;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const SLASH_COMMANDS: readonly ["/new <idea>", "/draft", "/create", "/discard", "/write", "/books", "/open <book>", "/mode <auto|semi|manual>", "/rewrite <n>", "/focus <text>", "/truth <file> <content>", "/rename <from> => <to>", "/replace <n> <from> => <to>", "/export [txt|md|epub]", "/help", "/status", "/clear", "/depth <light|normal|deep>", "/quit", "/exit"];
|
|
2
|
+
export type SlashNavigationDirection = "up" | "down";
|
|
3
|
+
export declare function getSlashSuggestions(input: string, commands: readonly string[]): string[];
|
|
4
|
+
export declare function getNextSlashSelection(currentIndex: number, suggestionCount: number, direction: SlashNavigationDirection): number;
|
|
5
|
+
export declare function applySlashSuggestion(_input: string, suggestions: readonly string[], selectedIndex: number): string;
|
|
6
|
+
//# 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,eAAO,MAAM,cAAc,uVAqBjB,CAAC;AAEX,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,50 @@
|
|
|
1
|
+
export const SLASH_COMMANDS = [
|
|
2
|
+
"/new <idea>",
|
|
3
|
+
"/draft",
|
|
4
|
+
"/create",
|
|
5
|
+
"/discard",
|
|
6
|
+
"/write",
|
|
7
|
+
"/books",
|
|
8
|
+
"/open <book>",
|
|
9
|
+
"/mode <auto|semi|manual>",
|
|
10
|
+
"/rewrite <n>",
|
|
11
|
+
"/focus <text>",
|
|
12
|
+
"/truth <file> <content>",
|
|
13
|
+
"/rename <from> => <to>",
|
|
14
|
+
"/replace <n> <from> => <to>",
|
|
15
|
+
"/export [txt|md|epub]",
|
|
16
|
+
"/help",
|
|
17
|
+
"/status",
|
|
18
|
+
"/clear",
|
|
19
|
+
"/depth <light|normal|deep>",
|
|
20
|
+
"/quit",
|
|
21
|
+
"/exit",
|
|
22
|
+
];
|
|
23
|
+
export function getSlashSuggestions(input, commands) {
|
|
24
|
+
const value = input.trim();
|
|
25
|
+
if (!value.startsWith("/")) {
|
|
26
|
+
return [];
|
|
27
|
+
}
|
|
28
|
+
return commands.filter((command) => slashCommandStem(command).startsWith(value));
|
|
29
|
+
}
|
|
30
|
+
export function getNextSlashSelection(currentIndex, suggestionCount, direction) {
|
|
31
|
+
if (suggestionCount <= 0) {
|
|
32
|
+
return 0;
|
|
33
|
+
}
|
|
34
|
+
if (direction === "down") {
|
|
35
|
+
return (currentIndex + 1) % suggestionCount;
|
|
36
|
+
}
|
|
37
|
+
return (currentIndex - 1 + suggestionCount) % suggestionCount;
|
|
38
|
+
}
|
|
39
|
+
export function applySlashSuggestion(_input, suggestions, selectedIndex) {
|
|
40
|
+
const suggestion = suggestions[selectedIndex] ?? "";
|
|
41
|
+
return slashSuggestionInsertion(suggestion);
|
|
42
|
+
}
|
|
43
|
+
function slashCommandStem(command) {
|
|
44
|
+
return command.match(/^\/\S+/)?.[0] ?? command;
|
|
45
|
+
}
|
|
46
|
+
function slashSuggestionInsertion(suggestion) {
|
|
47
|
+
const stem = slashCommandStem(suggestion);
|
|
48
|
+
return suggestion === stem ? stem : `${stem} `;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=slash-autocomplete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slash-autocomplete.js","sourceRoot":"","sources":["../../src/tui/slash-autocomplete.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,aAAa;IACb,QAAQ;IACR,SAAS;IACT,UAAU;IACV,QAAQ;IACR,QAAQ;IACR,cAAc;IACd,0BAA0B;IAC1B,cAAc;IACd,eAAe;IACf,yBAAyB;IACzB,wBAAwB;IACxB,6BAA6B;IAC7B,uBAAuB;IACvB,OAAO;IACP,SAAS;IACT,QAAQ;IACR,4BAA4B;IAC5B,OAAO;IACP,OAAO;CACC,CAAC;AAIX,MAAM,UAAU,mBAAmB,CAAC,KAAa,EAAE,QAA2B;IAC5E,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;AACnF,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,YAAoB,EACpB,eAAuB,EACvB,SAAmC;IAEnC,IAAI,eAAe,IAAI,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QACzB,OAAO,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,eAAe,CAAC;IAC9C,CAAC;IAED,OAAO,CAAC,YAAY,GAAG,CAAC,GAAG,eAAe,CAAC,GAAG,eAAe,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,MAAc,EACd,WAA8B,EAC9B,aAAqB;IAErB,MAAM,UAAU,GAAG,WAAW,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IACpD,OAAO,wBAAwB,CAAC,UAAU,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe;IACvC,OAAO,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC;AACjD,CAAC;AAED,SAAS,wBAAwB,CAAC,UAAkB;IAClD,MAAM,IAAI,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAC1C,OAAO,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const WARM_ACCENT = "#c88a56";
|
|
2
|
+
export declare const WARM_MUTED = "#8f8374";
|
|
3
|
+
export declare const WARM_REPLY = "#f0e6d8";
|
|
4
|
+
export declare const WARM_BORDER = "#6b6156";
|
|
5
|
+
export declare const STATUS_SUCCESS = "#7ec87e";
|
|
6
|
+
export declare const STATUS_ERROR = "#e06060";
|
|
7
|
+
export declare const STATUS_ACTIVE = "#d4a76a";
|
|
8
|
+
export declare const STATUS_IDLE = "#7a7268";
|
|
9
|
+
export declare const ROLE_USER = "#a8c4d4";
|
|
10
|
+
export declare const ROLE_SYSTEM = "#b8a8d0";
|
|
11
|
+
//# sourceMappingURL=theme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/tui/theme.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,YAAY,CAAC;AACrC,eAAO,MAAM,UAAU,YAAY,CAAC;AACpC,eAAO,MAAM,UAAU,YAAY,CAAC;AACpC,eAAO,MAAM,WAAW,YAAY,CAAC;AAGrC,eAAO,MAAM,cAAc,YAAY,CAAC;AACxC,eAAO,MAAM,YAAY,YAAY,CAAC;AACtC,eAAO,MAAM,aAAa,YAAY,CAAC;AACvC,eAAO,MAAM,WAAW,YAAY,CAAC;AAGrC,eAAO,MAAM,SAAS,YAAY,CAAC;AACnC,eAAO,MAAM,WAAW,YAAY,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export const WARM_ACCENT = "#c88a56";
|
|
2
|
+
export const WARM_MUTED = "#8f8374";
|
|
3
|
+
export const WARM_REPLY = "#f0e6d8";
|
|
4
|
+
export const WARM_BORDER = "#6b6156";
|
|
5
|
+
// Semantic status colors
|
|
6
|
+
export const STATUS_SUCCESS = "#7ec87e";
|
|
7
|
+
export const STATUS_ERROR = "#e06060";
|
|
8
|
+
export const STATUS_ACTIVE = "#d4a76a";
|
|
9
|
+
export const STATUS_IDLE = "#7a7268";
|
|
10
|
+
// Role colors
|
|
11
|
+
export const ROLE_USER = "#a8c4d4";
|
|
12
|
+
export const ROLE_SYSTEM = "#b8a8d0";
|
|
13
|
+
//# sourceMappingURL=theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/tui/theme.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,SAAS,CAAC;AACrC,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,CAAC;AACpC,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,CAAC;AACpC,MAAM,CAAC,MAAM,WAAW,GAAG,SAAS,CAAC;AAErC,yBAAyB;AACzB,MAAM,CAAC,MAAM,cAAc,GAAG,SAAS,CAAC;AACxC,MAAM,CAAC,MAAM,YAAY,GAAG,SAAS,CAAC;AACtC,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAC;AACvC,MAAM,CAAC,MAAM,WAAW,GAAG,SAAS,CAAC;AAErC,cAAc;AACd,MAAM,CAAC,MAAM,SAAS,GAAG,SAAS,CAAC;AACnC,MAAM,CAAC,MAAM,WAAW,GAAG,SAAS,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { PipelineRunner, StateManager, type InteractionRuntimeTools } from "@actalk/inkos-core";
|
|
2
|
+
type CliPipelineLike = Pick<PipelineRunner, "writeNextChapter" | "reviseDraft">;
|
|
3
|
+
type CliStateLike = Pick<StateManager, "ensureControlDocuments" | "bookDir" | "loadBookConfig" | "loadChapterIndex" | "saveChapterIndex" | "listBooks">;
|
|
4
|
+
type CliInteractionToolHooks = {
|
|
5
|
+
readonly onChatTextDelta?: (text: string) => void;
|
|
6
|
+
readonly getChatRequestOptions?: () => {
|
|
7
|
+
readonly temperature?: number;
|
|
8
|
+
readonly maxTokens?: number;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
export declare function createCliInteractionToolsFromDeps(pipeline: CliPipelineLike, state: CliStateLike, hooks?: CliInteractionToolHooks): InteractionRuntimeTools;
|
|
12
|
+
export declare function createInteractionToolsFromDepsCompat(_projectRoot: string, pipeline: CliPipelineLike, state: CliStateLike, hooks?: CliInteractionToolHooks): InteractionRuntimeTools;
|
|
13
|
+
export { createInteractionToolsFromDepsCompat as createInteractionToolsFromDeps };
|
|
14
|
+
export declare function createInteractionTools(projectRoot: string, hooks?: CliInteractionToolHooks): Promise<InteractionRuntimeTools>;
|
|
15
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/tui/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,YAAY,EAEZ,KAAK,uBAAuB,EAC7B,MAAM,oBAAoB,CAAC;AAG5B,KAAK,eAAe,GAAG,IAAI,CAAC,cAAc,EAAE,kBAAkB,GAAG,aAAa,CAAC,CAAC;AAChF,KAAK,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,wBAAwB,GAAG,SAAS,GAAG,gBAAgB,GAAG,kBAAkB,GAAG,kBAAkB,GAAG,WAAW,CAAC,CAAC;AACxJ,KAAK,uBAAuB,GAAG;IAC7B,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM;QACrC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;KAC7B,CAAC;CACH,CAAC;AAEF,wBAAgB,iCAAiC,CAC/C,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE,YAAY,EACnB,KAAK,CAAC,EAAE,uBAAuB,GAC9B,uBAAuB,CAEzB;AAGD,wBAAgB,oCAAoC,CAClD,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE,YAAY,EACnB,KAAK,CAAC,EAAE,uBAAuB,GAC9B,uBAAuB,CAEzB;AAED,OAAO,EAAE,oCAAoC,IAAI,8BAA8B,EAAE,CAAC;AAElF,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,uBAAuB,GAC9B,OAAO,CAAC,uBAAuB,CAAC,CAKlC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { PipelineRunner, StateManager, createInteractionToolsFromDeps, } from "@actalk/inkos-core";
|
|
2
|
+
import { buildPipelineConfig, loadConfig } from "../utils.js";
|
|
3
|
+
export function createCliInteractionToolsFromDeps(pipeline, state, hooks) {
|
|
4
|
+
return createInteractionToolsFromDeps(pipeline, state, hooks);
|
|
5
|
+
}
|
|
6
|
+
// Backward-compatible export for the current CLI tests during the extraction phase.
|
|
7
|
+
export function createInteractionToolsFromDepsCompat(_projectRoot, pipeline, state, hooks) {
|
|
8
|
+
return createInteractionToolsFromDeps(pipeline, state, hooks);
|
|
9
|
+
}
|
|
10
|
+
export { createInteractionToolsFromDepsCompat as createInteractionToolsFromDeps };
|
|
11
|
+
export async function createInteractionTools(projectRoot, hooks) {
|
|
12
|
+
const config = await loadConfig();
|
|
13
|
+
const pipeline = new PipelineRunner(buildPipelineConfig(config, projectRoot));
|
|
14
|
+
const state = new StateManager(projectRoot);
|
|
15
|
+
return createInteractionToolsFromDeps(pipeline, state, hooks);
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/tui/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,YAAY,EACZ,8BAA8B,GAE/B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAY9D,MAAM,UAAU,iCAAiC,CAC/C,QAAyB,EACzB,KAAmB,EACnB,KAA+B;IAE/B,OAAO,8BAA8B,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAChE,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,oCAAoC,CAClD,YAAoB,EACpB,QAAyB,EACzB,KAAmB,EACnB,KAA+B;IAE/B,OAAO,8BAA8B,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAChE,CAAC;AAED,OAAO,EAAE,oCAAoC,IAAI,8BAA8B,EAAE,CAAC;AAElF,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,WAAmB,EACnB,KAA+B;IAE/B,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,mBAAmB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;IAC9E,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,WAAW,CAAC,CAAC;IAC5C,OAAO,8BAA8B,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAChE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@actalk/inkos",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "Autonomous AI novel writing CLI agent — 10-agent pipeline that writes, audits, and revises novels with continuity tracking. Supports LitRPG, Progression Fantasy, Isekai, Romantasy, Sci-Fi and more.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai-novel-writing",
|
|
@@ -27,24 +27,29 @@
|
|
|
27
27
|
"dist",
|
|
28
28
|
"!dist/__tests__"
|
|
29
29
|
],
|
|
30
|
-
"license": "
|
|
30
|
+
"license": "AGPL-3.0-only",
|
|
31
31
|
"repository": {
|
|
32
32
|
"type": "git",
|
|
33
33
|
"url": "https://github.com/Narcooo/inkos.git",
|
|
34
34
|
"directory": "packages/cli"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@actalk/inkos-core": "1.
|
|
38
|
-
"@actalk/inkos-studio": "1.
|
|
37
|
+
"@actalk/inkos-core": "1.2.0",
|
|
38
|
+
"@actalk/inkos-studio": "1.2.0",
|
|
39
39
|
"commander": "^13.0.0",
|
|
40
40
|
"dotenv": "^16.4.0",
|
|
41
41
|
"epub-gen-memory": "^1.0.10",
|
|
42
|
-
"
|
|
42
|
+
"ink": "^7.0.0",
|
|
43
|
+
"ink-text-input": "^6.0.0",
|
|
44
|
+
"marked": "^15.0.0",
|
|
45
|
+
"react": "^19.2.4"
|
|
43
46
|
},
|
|
44
47
|
"devDependencies": {
|
|
48
|
+
"@types/react": "^19.2.14",
|
|
49
|
+
"@types/node": "^22.0.0",
|
|
50
|
+
"ink-testing-library": "^4.0.0",
|
|
45
51
|
"typescript": "^5.8.0",
|
|
46
|
-
"vitest": "^3.0.0"
|
|
47
|
-
"@types/node": "^22.0.0"
|
|
52
|
+
"vitest": "^3.0.0"
|
|
48
53
|
},
|
|
49
54
|
"scripts": {
|
|
50
55
|
"build": "tsc",
|