@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 @@
|
|
|
1
|
+
{"version":3,"file":"progress-text.js","sourceRoot":"","sources":["../src/progress-text.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,6BAA6B,EAC7B,0BAA0B,EAC1B,uBAAuB,EACvB,uBAAuB,EACvB,0BAA0B,GAE3B,MAAM,mBAAmB,CAAC;AAI3B,MAAM,UAAU,oBAAoB,CAClC,QAAqB,EACrB,OAAe,EACf,KAAa,EACb,MAAc;IAEd,OAAO,uBAAuB,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,QAAqB,EACrB,MAYC;IAED,OAAO,CAAC,GAAG,0BAA0B,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAqB;IACvD,OAAO,uBAAuB,CAAC,QAAQ,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,QAAqB,EACrB,YAAoB,EACpB,MAAc;IAEd,OAAO,6BAA6B,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,QAAqB,EACrB,UAAkB;IAElB,OAAO,0BAA0B,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,QAAqB,EACrB,MAKC;IAED,OAAO;QACL,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO;QAChD,QAAQ,KAAK,IAAI;YACf,CAAC,CAAC,wBAAwB,MAAM,CAAC,aAAa,EAAE;YAChD,CAAC,CAAC,WAAW,MAAM,CAAC,aAAa,EAAE;QACrC,QAAQ,KAAK,IAAI;YACf,CAAC,CAAC,mBAAmB,MAAM,CAAC,eAAe,EAAE;YAC7C,CAAC,CAAC,SAAS,MAAM,CAAC,eAAe,EAAE;QACrC,QAAQ,KAAK,IAAI;YACf,CAAC,CAAC,0BAA0B,MAAM,CAAC,WAAW,EAAE;YAChD,CAAC,CAAC,WAAW,MAAM,CAAC,WAAW,EAAE;QACnC,EAAE;QACF,QAAQ,KAAK,IAAI;YACf,CAAC,CAAC,yBAAyB,MAAM,CAAC,MAAM,wBAAwB;YAChE,CAAC,CAAC,wBAAwB,MAAM,CAAC,MAAM,SAAS;KACnD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface ProjectBootstrapOptions {
|
|
2
|
+
readonly language?: "zh" | "en" | "vi";
|
|
3
|
+
readonly overwriteSupportFiles?: boolean;
|
|
4
|
+
}
|
|
5
|
+
export declare function ensureProjectGitignore(projectDir: string): Promise<void>;
|
|
6
|
+
export declare function initializeProjectDirectory(projectDir: string, options?: ProjectBootstrapOptions): Promise<void>;
|
|
7
|
+
export declare function ensureProjectDirectoryInitialized(projectDir: string, options?: Omit<ProjectBootstrapOptions, "overwriteSupportFiles">): Promise<boolean>;
|
|
8
|
+
//# sourceMappingURL=project-bootstrap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-bootstrap.d.ts","sourceRoot":"","sources":["../src/project-bootstrap.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;CAC1C;AA6BD,wBAAsB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB9E;AA8DD,wBAAsB,0BAA0B,CAC9C,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,IAAI,CAAC,CA8Bf;AAED,wBAAsB,iCAAiC,CACrD,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,IAAI,CAAC,uBAAuB,EAAE,uBAAuB,CAAM,GACnE,OAAO,CAAC,OAAO,CAAC,CAWlB"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { access, mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { basename, join } from "node:path";
|
|
3
|
+
import { GLOBAL_ENV_PATH } from "./utils.js";
|
|
4
|
+
async function hasGlobalConfig() {
|
|
5
|
+
try {
|
|
6
|
+
const content = await readFile(GLOBAL_ENV_PATH, "utf-8");
|
|
7
|
+
return content.includes("INKOS_LLM_API_KEY=") && !content.includes("your-api-key-here");
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
async function exists(path) {
|
|
14
|
+
try {
|
|
15
|
+
await access(path);
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
async function writeMaybe(path, content, overwrite) {
|
|
23
|
+
if (!overwrite && await exists(path)) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
await writeFile(path, content, "utf-8");
|
|
27
|
+
}
|
|
28
|
+
const DEFAULT_GITIGNORE_ENTRIES = [".env", "node_modules/", ".DS_Store"];
|
|
29
|
+
export async function ensureProjectGitignore(projectDir) {
|
|
30
|
+
const path = join(projectDir, ".gitignore");
|
|
31
|
+
let existing = "";
|
|
32
|
+
if (await exists(path)) {
|
|
33
|
+
existing = await readFile(path, "utf-8");
|
|
34
|
+
}
|
|
35
|
+
const existingEntries = new Set(existing
|
|
36
|
+
.split(/\r?\n/)
|
|
37
|
+
.map((line) => line.trim())
|
|
38
|
+
.filter((line) => line.length > 0 && !line.startsWith("#")));
|
|
39
|
+
const missing = DEFAULT_GITIGNORE_ENTRIES.filter((entry) => !existingEntries.has(entry));
|
|
40
|
+
if (missing.length === 0)
|
|
41
|
+
return;
|
|
42
|
+
if (!existing) {
|
|
43
|
+
await writeFile(path, `${missing.join("\n")}\n`, "utf-8");
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const separator = existing.endsWith("\n") ? "" : "\n";
|
|
47
|
+
await writeFile(path, `${existing}${separator}${missing.join("\n")}\n`, "utf-8");
|
|
48
|
+
}
|
|
49
|
+
function buildProjectConfig(projectDir, language) {
|
|
50
|
+
return {
|
|
51
|
+
name: basename(projectDir),
|
|
52
|
+
version: "0.1.0",
|
|
53
|
+
language,
|
|
54
|
+
llm: {
|
|
55
|
+
provider: "openai",
|
|
56
|
+
service: "custom",
|
|
57
|
+
configSource: "studio",
|
|
58
|
+
baseUrl: "",
|
|
59
|
+
model: "",
|
|
60
|
+
apiFormat: "chat",
|
|
61
|
+
stream: true,
|
|
62
|
+
},
|
|
63
|
+
notify: [],
|
|
64
|
+
daemon: {
|
|
65
|
+
schedule: {
|
|
66
|
+
radarCron: "0 */6 * * *",
|
|
67
|
+
writeCron: "*/15 * * * *",
|
|
68
|
+
},
|
|
69
|
+
maxConcurrentBooks: 3,
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function buildProjectEnvTemplate(globalConfigured) {
|
|
74
|
+
if (globalConfigured) {
|
|
75
|
+
return [
|
|
76
|
+
"# Project-level LLM overrides (optional)",
|
|
77
|
+
"# Global config at ~/.inkos/.env will be used by default.",
|
|
78
|
+
"# Switch Studio to 'Use Studio config' (使用 Studio 配置) if you want per-project service settings.",
|
|
79
|
+
"# Uncomment below to override for this project only:",
|
|
80
|
+
"# INKOS_LLM_PROVIDER=openai",
|
|
81
|
+
"# INKOS_LLM_BASE_URL=",
|
|
82
|
+
"# INKOS_LLM_API_KEY=",
|
|
83
|
+
"# INKOS_LLM_MODEL=",
|
|
84
|
+
"",
|
|
85
|
+
"# Web search (optional):",
|
|
86
|
+
"# TAVILY_API_KEY=tvly-xxxxx",
|
|
87
|
+
"",
|
|
88
|
+
].join("\n");
|
|
89
|
+
}
|
|
90
|
+
return [
|
|
91
|
+
"# Optional project-level LLM overrides",
|
|
92
|
+
"# Studio can manage provider / model / key without editing this file.",
|
|
93
|
+
"# Uncomment only if you want this directory to force env-based config:",
|
|
94
|
+
"# INKOS_LLM_PROVIDER=openai",
|
|
95
|
+
"# INKOS_LLM_BASE_URL=",
|
|
96
|
+
"# INKOS_LLM_API_KEY=",
|
|
97
|
+
"# INKOS_LLM_MODEL=",
|
|
98
|
+
"# INKOS_LLM_API_FORMAT=chat",
|
|
99
|
+
"# INKOS_LLM_STREAM=true",
|
|
100
|
+
"",
|
|
101
|
+
"# Web search (optional):",
|
|
102
|
+
"# TAVILY_API_KEY=tvly-xxxxx",
|
|
103
|
+
"",
|
|
104
|
+
].join("\n");
|
|
105
|
+
}
|
|
106
|
+
export async function initializeProjectDirectory(projectDir, options = {}) {
|
|
107
|
+
// `inkos init` always writes an explicit language key, which makes
|
|
108
|
+
// languageExplicit true and bypasses the schema default — so the default
|
|
109
|
+
// has to be repeated here for a bare `inkos init` to produce a Vietnamese UI.
|
|
110
|
+
const language = options.language ?? "vi";
|
|
111
|
+
const overwriteSupportFiles = options.overwriteSupportFiles ?? true;
|
|
112
|
+
const configPath = join(projectDir, "inkos.json");
|
|
113
|
+
if (await exists(configPath)) {
|
|
114
|
+
throw new Error(`inkos.json already exists in ${projectDir}. Use a different directory or delete the existing project.`);
|
|
115
|
+
}
|
|
116
|
+
await mkdir(projectDir, { recursive: true });
|
|
117
|
+
await mkdir(join(projectDir, "books"), { recursive: true });
|
|
118
|
+
await mkdir(join(projectDir, "radar"), { recursive: true });
|
|
119
|
+
await writeFile(configPath, JSON.stringify(buildProjectConfig(projectDir, language), null, 2), "utf-8");
|
|
120
|
+
const globalConfigured = await hasGlobalConfig();
|
|
121
|
+
await Promise.all([
|
|
122
|
+
writeMaybe(join(projectDir, ".env"), buildProjectEnvTemplate(globalConfigured), overwriteSupportFiles),
|
|
123
|
+
ensureProjectGitignore(projectDir),
|
|
124
|
+
writeMaybe(join(projectDir, ".nvmrc"), "22\n", overwriteSupportFiles),
|
|
125
|
+
writeMaybe(join(projectDir, ".node-version"), "22\n", overwriteSupportFiles),
|
|
126
|
+
]);
|
|
127
|
+
}
|
|
128
|
+
export async function ensureProjectDirectoryInitialized(projectDir, options = {}) {
|
|
129
|
+
const configPath = join(projectDir, "inkos.json");
|
|
130
|
+
if (await exists(configPath)) {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
await initializeProjectDirectory(projectDir, {
|
|
134
|
+
language: options.language,
|
|
135
|
+
overwriteSupportFiles: false,
|
|
136
|
+
});
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=project-bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-bootstrap.js","sourceRoot":"","sources":["../src/project-bootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export declare const MIN_NODE_MAJOR = 22;
|
|
2
|
+
export declare const NODE_PIN_VERSION: string;
|
|
3
|
+
export declare const NODE_PIN_FILES: readonly [".nvmrc", ".node-version"];
|
|
4
|
+
export interface NodeRuntimeSupportResult {
|
|
5
|
+
readonly ok: boolean;
|
|
6
|
+
readonly detail: string;
|
|
7
|
+
}
|
|
8
|
+
export interface NodeRuntimePinStatus {
|
|
9
|
+
readonly ok: boolean;
|
|
10
|
+
readonly detail: string;
|
|
11
|
+
readonly missing: ReadonlyArray<string>;
|
|
12
|
+
}
|
|
13
|
+
export interface NodeRuntimePinRepairResult {
|
|
14
|
+
readonly updated: boolean;
|
|
15
|
+
readonly written: ReadonlyArray<string>;
|
|
16
|
+
}
|
|
17
|
+
export declare function inspectNodeRuntimePinFiles(root: string): Promise<NodeRuntimePinStatus>;
|
|
18
|
+
export declare function ensureNodeRuntimePinFiles(root: string): Promise<NodeRuntimePinRepairResult>;
|
|
19
|
+
export declare function parseNodeMajor(version: string): number;
|
|
20
|
+
export declare function evaluateNodeRuntimeSupport(options?: {
|
|
21
|
+
readonly nodeVersion?: string;
|
|
22
|
+
readonly hasNodeSqlite?: boolean;
|
|
23
|
+
}): NodeRuntimeSupportResult;
|
|
24
|
+
//# sourceMappingURL=runtime-requirements.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-requirements.d.ts","sourceRoot":"","sources":["../src/runtime-requirements.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,cAAc,KAAK,CAAC;AACjC,eAAO,MAAM,gBAAgB,QAAyB,CAAC;AACvD,eAAO,MAAM,cAAc,sCAAuC,CAAC;AAEnE,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CACzC;AAED,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA2B5F;AAED,wBAAsB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAwBjG;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtD;AAWD,wBAAgB,0BAA0B,CAAC,OAAO,CAAC,EAAE;IACnD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;CAClC,GAAG,wBAAwB,CAuB3B"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { createRequire } from "node:module";
|
|
4
|
+
const require = createRequire(import.meta.url);
|
|
5
|
+
export const MIN_NODE_MAJOR = 22;
|
|
6
|
+
export const NODE_PIN_VERSION = String(MIN_NODE_MAJOR);
|
|
7
|
+
export const NODE_PIN_FILES = [".nvmrc", ".node-version"];
|
|
8
|
+
export async function inspectNodeRuntimePinFiles(root) {
|
|
9
|
+
const missing = [];
|
|
10
|
+
for (const file of NODE_PIN_FILES) {
|
|
11
|
+
try {
|
|
12
|
+
const content = await readFile(join(root, file), "utf-8");
|
|
13
|
+
if (content.trim() !== NODE_PIN_VERSION) {
|
|
14
|
+
missing.push(file);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
missing.push(file);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (missing.length === 0) {
|
|
22
|
+
return {
|
|
23
|
+
ok: true,
|
|
24
|
+
detail: `Pinned to Node ${NODE_PIN_VERSION} via ${NODE_PIN_FILES.join(", ")}.`,
|
|
25
|
+
missing,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
ok: false,
|
|
30
|
+
detail: `Missing or outdated: ${missing.join(", ")}. Run 'inkos doctor --repair-node-runtime'.`,
|
|
31
|
+
missing,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export async function ensureNodeRuntimePinFiles(root) {
|
|
35
|
+
const written = [];
|
|
36
|
+
for (const file of NODE_PIN_FILES) {
|
|
37
|
+
const path = join(root, file);
|
|
38
|
+
let content = "";
|
|
39
|
+
try {
|
|
40
|
+
content = await readFile(path, "utf-8");
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
content = "";
|
|
44
|
+
}
|
|
45
|
+
if (content.trim() === NODE_PIN_VERSION) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
await writeFile(path, `${NODE_PIN_VERSION}\n`, "utf-8");
|
|
49
|
+
written.push(file);
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
updated: written.length > 0,
|
|
53
|
+
written,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export function parseNodeMajor(version) {
|
|
57
|
+
return parseInt(version.replace(/^v/i, "").split(".")[0] ?? "0", 10);
|
|
58
|
+
}
|
|
59
|
+
function hasNodeSqliteBuiltin() {
|
|
60
|
+
try {
|
|
61
|
+
require("node:sqlite");
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export function evaluateNodeRuntimeSupport(options) {
|
|
69
|
+
const nodeVersion = options?.nodeVersion ?? process.version;
|
|
70
|
+
const major = parseNodeMajor(nodeVersion);
|
|
71
|
+
if (major < MIN_NODE_MAJOR) {
|
|
72
|
+
return {
|
|
73
|
+
ok: false,
|
|
74
|
+
detail: `Unsupported runtime ${nodeVersion}. InkOS requires Node ${MIN_NODE_MAJOR}+.`,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
const hasNodeSqlite = options?.hasNodeSqlite ?? hasNodeSqliteBuiltin();
|
|
78
|
+
if (!hasNodeSqlite) {
|
|
79
|
+
return {
|
|
80
|
+
ok: false,
|
|
81
|
+
detail: `${nodeVersion} detected, but the required node:sqlite module is unavailable.`,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
ok: true,
|
|
86
|
+
detail: `Available on ${nodeVersion}.`,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=runtime-requirements.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-requirements.js","sourceRoot":"","sources":["../src/runtime-requirements.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AACjC,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;AACvD,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,eAAe,CAAU,CAAC;AAkBnE,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,IAAY;IAC3D,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YAC1D,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,gBAAgB,EAAE,CAAC;gBACxC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,kBAAkB,gBAAgB,QAAQ,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;YAC9E,OAAO;SACR,CAAC;IACJ,CAAC;IAED,OAAO;QACL,EAAE,EAAE,KAAK;QACT,MAAM,EAAE,wBAAwB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,6CAA6C;QAC/F,OAAO;KACR,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,IAAY;IAC1D,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC9B,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,GAAG,EAAE,CAAC;QACf,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,gBAAgB,EAAE,CAAC;YACxC,SAAS;QACX,CAAC;QAED,MAAM,SAAS,CAAC,IAAI,EAAE,GAAG,gBAAgB,IAAI,EAAE,OAAO,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IAED,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC;QAC3B,OAAO;KACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,OAAO,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,oBAAoB;IAC3B,IAAI,CAAC;QACH,OAAO,CAAC,aAAa,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,OAG1C;IACC,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAC5D,MAAM,KAAK,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IAE1C,IAAI,KAAK,GAAG,cAAc,EAAE,CAAC;QAC3B,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,uBAAuB,WAAW,yBAAyB,cAAc,IAAI;SACtF,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,EAAE,aAAa,IAAI,oBAAoB,EAAE,CAAC;IACvE,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,GAAG,WAAW,gEAAgE;SACvF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,EAAE,EAAE,IAAI;QACR,MAAM,EAAE,gBAAgB,WAAW,GAAG;KACvC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.test.d.ts","sourceRoot":"","sources":["../../../src/tui/__tests__/markdown.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
2
|
+
import { renderMarkdown } from "../markdown.js";
|
|
3
|
+
describe("renderMarkdown", () => {
|
|
4
|
+
const origTermProgram = process.env.TERM_PROGRAM;
|
|
5
|
+
afterEach(() => {
|
|
6
|
+
if (origTermProgram === undefined)
|
|
7
|
+
delete process.env.TERM_PROGRAM;
|
|
8
|
+
else
|
|
9
|
+
process.env.TERM_PROGRAM = origTermProgram;
|
|
10
|
+
});
|
|
11
|
+
it("converts **text** to ANSI bold", () => {
|
|
12
|
+
const result = renderMarkdown("这是 **加粗** 文本");
|
|
13
|
+
// Should contain ANSI bold on/off around 加粗
|
|
14
|
+
expect(result).toContain("\x1b[1m加粗\x1b[22m");
|
|
15
|
+
// Should NOT contain raw ** markers
|
|
16
|
+
expect(result).not.toContain("**");
|
|
17
|
+
});
|
|
18
|
+
it("converts * bullets to · bullets", () => {
|
|
19
|
+
const result = renderMarkdown("* 第一项\n* 第二项");
|
|
20
|
+
expect(result).toContain("· 第一项");
|
|
21
|
+
expect(result).toContain("· 第二项");
|
|
22
|
+
// No raw * bullets remaining
|
|
23
|
+
expect(result).not.toMatch(/^\s*\* /m);
|
|
24
|
+
});
|
|
25
|
+
it("renders bold inside list items", () => {
|
|
26
|
+
const result = renderMarkdown("* **昨日**: 总统套房\n* **今日**: 桥洞");
|
|
27
|
+
expect(result).toContain("\x1b[1m昨日\x1b[22m");
|
|
28
|
+
expect(result).toContain("\x1b[1m今日\x1b[22m");
|
|
29
|
+
expect(result).toContain("·");
|
|
30
|
+
expect(result).not.toContain("**");
|
|
31
|
+
});
|
|
32
|
+
it("does not leak bold across lines", () => {
|
|
33
|
+
const result = renderMarkdown("打磨**冲突场景**,还是梳理**心理转变弧线**。");
|
|
34
|
+
// Each bold region should be self-contained
|
|
35
|
+
const boldRegions = [...result.matchAll(/\x1b\[1m(.*?)\x1b\[22m/g)];
|
|
36
|
+
expect(boldRegions).toHaveLength(2);
|
|
37
|
+
expect(boldRegions[0][1]).toBe("冲突场景");
|
|
38
|
+
expect(boldRegions[1][1]).toBe("心理转变弧线");
|
|
39
|
+
});
|
|
40
|
+
it("renders tables with box-drawing characters", () => {
|
|
41
|
+
const result = renderMarkdown("| 属性 | 值 |\n|------|----|\n| 住所 | 桥洞 |");
|
|
42
|
+
expect(result).toContain("┌");
|
|
43
|
+
expect(result).toContain("│");
|
|
44
|
+
expect(result).toContain("└");
|
|
45
|
+
});
|
|
46
|
+
it("does not contain full-reset codes that override parent Ink color", () => {
|
|
47
|
+
// \x1b[0m resets ALL terminal attributes including color set by Ink's <Text>.
|
|
48
|
+
// renderMarkdown must not emit it, so the parent <Text color={...}> stays in effect.
|
|
49
|
+
const result = renderMarkdown("这是 **加粗** 文本");
|
|
50
|
+
expect(result).not.toContain("\x1b[0m");
|
|
51
|
+
});
|
|
52
|
+
it("falls back to raw text on parse error", () => {
|
|
53
|
+
// renderMarkdown should never throw; it returns raw text on failure
|
|
54
|
+
const result = renderMarkdown("plain text");
|
|
55
|
+
expect(result).toContain("plain text");
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=markdown.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.test.js","sourceRoot":"","sources":["../../../src/tui/__tests__/markdown.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { TuiCopy } from "./i18n.js";
|
|
2
|
+
export interface ActivityState {
|
|
3
|
+
readonly label: string;
|
|
4
|
+
readonly frames: readonly string[];
|
|
5
|
+
readonly accent: string;
|
|
6
|
+
readonly intervalMs: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function describeActivityState(copy: Pick<TuiCopy, "activity">): ActivityState;
|
|
9
|
+
//# sourceMappingURL=activity-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity-state.d.ts","sourceRoot":"","sources":["../../src/tui/activity-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAID,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,aAAa,CAEpF"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { WARM_ACCENT } from "./theme.js";
|
|
2
|
+
const DOTS = ["· ", "·· ", "···", " ··", " ·"];
|
|
3
|
+
export function describeActivityState(copy) {
|
|
4
|
+
return { label: copy.activity.thinking, frames: DOTS, accent: WARM_ACCENT, intervalMs: 220 };
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=activity-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity-state.js","sourceRoot":"","sources":["../../src/tui/activity-state.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AASzC,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAU,CAAC;AAE1D,MAAM,UAAU,qBAAqB,CAAC,IAA+B;IACnE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;AAC/F,CAAC"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { type ActionPayload, type ActionSource, type InteractionSession, type PlayMode, type RequestedIntent, type SessionKind } from "@kienmatu/inkos-core";
|
|
2
|
+
interface TuiAgentRoute {
|
|
3
|
+
readonly userMessage: string;
|
|
4
|
+
readonly sessionKind: SessionKind;
|
|
5
|
+
readonly actionSource: Extract<ActionSource, "free-text" | "slash">;
|
|
6
|
+
readonly requestedIntent?: RequestedIntent;
|
|
7
|
+
readonly actionPayload?: ActionPayload;
|
|
8
|
+
readonly requestedSkills?: ReadonlyArray<string>;
|
|
9
|
+
readonly playMode?: PlayMode;
|
|
10
|
+
readonly detachBook?: boolean;
|
|
11
|
+
readonly clearPending?: boolean;
|
|
12
|
+
readonly localResponse?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function processTuiAgentInput(params: {
|
|
15
|
+
readonly projectRoot: string;
|
|
16
|
+
readonly input: string;
|
|
17
|
+
readonly session: InteractionSession;
|
|
18
|
+
readonly activeBookId?: string;
|
|
19
|
+
readonly onTextDelta?: (text: string) => void;
|
|
20
|
+
}): Promise<{
|
|
21
|
+
responseText: string;
|
|
22
|
+
session: {
|
|
23
|
+
events: {
|
|
24
|
+
status: "completed" | "writing" | "failed" | "blocked" | "idle" | "planning" | "composing" | "assessing" | "repairing" | "persisting" | "waiting_human";
|
|
25
|
+
kind: string;
|
|
26
|
+
timestamp: number;
|
|
27
|
+
bookId?: string | undefined;
|
|
28
|
+
chapterNumber?: number | undefined;
|
|
29
|
+
detail?: string | undefined;
|
|
30
|
+
}[];
|
|
31
|
+
messages: {
|
|
32
|
+
content: string;
|
|
33
|
+
role: "user" | "assistant" | "system";
|
|
34
|
+
timestamp: number;
|
|
35
|
+
thinking?: string | undefined;
|
|
36
|
+
toolExecutions?: {
|
|
37
|
+
status: "completed" | "running" | "error" | "processing";
|
|
38
|
+
id: string;
|
|
39
|
+
label: string;
|
|
40
|
+
tool: string;
|
|
41
|
+
startedAt: number;
|
|
42
|
+
error?: string | undefined;
|
|
43
|
+
details?: unknown;
|
|
44
|
+
agent?: string | undefined;
|
|
45
|
+
args?: Record<string, unknown> | undefined;
|
|
46
|
+
result?: string | undefined;
|
|
47
|
+
stages?: {
|
|
48
|
+
status: "active" | "completed" | "pending";
|
|
49
|
+
label: string;
|
|
50
|
+
}[] | undefined;
|
|
51
|
+
completedAt?: number | undefined;
|
|
52
|
+
}[] | undefined;
|
|
53
|
+
}[];
|
|
54
|
+
sessionId: string;
|
|
55
|
+
projectRoot: string;
|
|
56
|
+
draftRounds: {
|
|
57
|
+
summary: string;
|
|
58
|
+
timestamp: number;
|
|
59
|
+
roundId: number;
|
|
60
|
+
userMessage: string;
|
|
61
|
+
assistantRaw: string;
|
|
62
|
+
fieldsUpdated: string[];
|
|
63
|
+
}[];
|
|
64
|
+
automationMode: "auto" | "manual" | "semi";
|
|
65
|
+
playMode?: "open" | "guided" | undefined;
|
|
66
|
+
sessionKind?: "chat" | "script" | "storyboard" | "interactive-film" | "play" | "short" | "book" | "book-create" | "edit" | "interactive-film-authoring" | undefined;
|
|
67
|
+
modelOverride?: string | undefined;
|
|
68
|
+
activeBookId?: string | undefined;
|
|
69
|
+
activeChapterNumber?: number | undefined;
|
|
70
|
+
creationDraft?: {
|
|
71
|
+
concept: string;
|
|
72
|
+
missingFields: string[];
|
|
73
|
+
readyToCreate: boolean;
|
|
74
|
+
title?: string | undefined;
|
|
75
|
+
platform?: string | undefined;
|
|
76
|
+
genre?: string | undefined;
|
|
77
|
+
targetChapters?: number | undefined;
|
|
78
|
+
chapterWordCount?: number | undefined;
|
|
79
|
+
language?: "zh" | "en" | undefined;
|
|
80
|
+
protagonist?: string | undefined;
|
|
81
|
+
authorIntent?: string | undefined;
|
|
82
|
+
currentFocus?: string | undefined;
|
|
83
|
+
volumeOutline?: string | undefined;
|
|
84
|
+
blurb?: string | undefined;
|
|
85
|
+
worldPremise?: string | undefined;
|
|
86
|
+
settingNotes?: string | undefined;
|
|
87
|
+
supportingCast?: string | undefined;
|
|
88
|
+
conflictCore?: string | undefined;
|
|
89
|
+
constraints?: string | undefined;
|
|
90
|
+
nextQuestion?: string | undefined;
|
|
91
|
+
} | undefined;
|
|
92
|
+
pendingDecision?: {
|
|
93
|
+
kind: string;
|
|
94
|
+
summary: string;
|
|
95
|
+
bookId: string;
|
|
96
|
+
chapterNumber?: number | undefined;
|
|
97
|
+
} | undefined;
|
|
98
|
+
pendingProposedAction?: {
|
|
99
|
+
action: string;
|
|
100
|
+
instruction: string;
|
|
101
|
+
targetSessionKind: "chat" | "script" | "storyboard" | "interactive-film" | "play" | "short" | "book" | "book-create" | "edit" | "interactive-film-authoring";
|
|
102
|
+
title?: string | undefined;
|
|
103
|
+
summary?: string | undefined;
|
|
104
|
+
playMode?: "open" | "guided" | undefined;
|
|
105
|
+
requestedSkills?: string[] | undefined;
|
|
106
|
+
actionPayload?: Record<string, unknown> | undefined;
|
|
107
|
+
} | undefined;
|
|
108
|
+
currentExecution?: {
|
|
109
|
+
status: "completed" | "writing" | "failed" | "blocked" | "idle" | "planning" | "composing" | "assessing" | "repairing" | "persisting" | "waiting_human";
|
|
110
|
+
bookId?: string | undefined;
|
|
111
|
+
chapterNumber?: number | undefined;
|
|
112
|
+
stageLabel?: string | undefined;
|
|
113
|
+
} | undefined;
|
|
114
|
+
};
|
|
115
|
+
}>;
|
|
116
|
+
export declare function resolveTuiAgentRoute(rawInput: string, session: InteractionSession, activeBookId: string | null, language?: "zh" | "en"): TuiAgentRoute;
|
|
117
|
+
export {};
|
|
118
|
+
//# sourceMappingURL=agent-input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-input.d.ts","sourceRoot":"","sources":["../../src/tui/agent-input.ts"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,kBAAkB,EAEvB,KAAK,QAAQ,EACb,KAAK,eAAe,EACpB,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAC;AAI9B,UAAU,aAAa;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC;IACpE,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,CAAC;IAC3C,QAAQ,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC;IACvC,QAAQ,CAAC,eAAe,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACjD,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,wBAAsB,oBAAoB,CAAC,MAAM,EAAE;IACjD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;IACrC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/C;;;;;;;kBAmS+/V,CAAC;yBAA2C,CAAC;kBAAoC,CAAC;;;;;;oBAAkK,CAAC;0BAA4C,CAAC;;;;;;qBAAuM,CAAC;uBAAyC,CAAC;qBAA4B,CAAC;oBAAsC,CAAC;sBAAyD,CAAC;sBAAwC,CAAC;;;;2BAAmJ,CAAC;;;;;;;;;;;;;;;;;;;;;;;iBAA8yB,CAAC;oBAAsC,CAAC;iBAAmC,CAAC;0BAA4C,CAAC;4BAA8C,CAAC;oBAAsC,CAAC;uBAA8C,CAAC;wBAA0C,CAAC;wBAA0C,CAAC;yBAA2C,CAAC;iBAAmC,CAAC;wBAA0C,CAAC;wBAA0C,CAAC;0BAA4C,CAAC;wBAA0C,CAAC;uBAAyC,CAAC;wBAA0C,CAAC;;;;;;yBAA6J,CAAC;;;;;;iBAA+S,CAAC;mBAAqC,CAAC;oBAAsC,CAAC;2BAAwD,CAAC;yBAA6C,CAAC;;;;kBAAkQ,CAAC;yBAA2C,CAAC;sBAAwC,CAAC;;;GAvK7vc;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,kBAAkB,EAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,QAAQ,GAAE,IAAI,GAAG,IAAW,GAC3B,aAAa,CA4Ff"}
|