@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.
Files changed (250) hide show
  1. package/LICENSE +661 -0
  2. package/dist/book-backup.d.ts +33 -0
  3. package/dist/book-backup.d.ts.map +1 -0
  4. package/dist/book-backup.js +74 -0
  5. package/dist/book-backup.js.map +1 -0
  6. package/dist/commands/agent.d.ts +3 -0
  7. package/dist/commands/agent.d.ts.map +1 -0
  8. package/dist/commands/agent.js +71 -0
  9. package/dist/commands/agent.js.map +1 -0
  10. package/dist/commands/analytics.d.ts +3 -0
  11. package/dist/commands/analytics.d.ts.map +1 -0
  12. package/dist/commands/analytics.js +74 -0
  13. package/dist/commands/analytics.js.map +1 -0
  14. package/dist/commands/audit.d.ts +3 -0
  15. package/dist/commands/audit.d.ts.map +1 -0
  16. package/dist/commands/audit.js +81 -0
  17. package/dist/commands/audit.js.map +1 -0
  18. package/dist/commands/auto.d.ts +3 -0
  19. package/dist/commands/auto.d.ts.map +1 -0
  20. package/dist/commands/auto.js +136 -0
  21. package/dist/commands/auto.js.map +1 -0
  22. package/dist/commands/book.d.ts +3 -0
  23. package/dist/commands/book.d.ts.map +1 -0
  24. package/dist/commands/book.js +324 -0
  25. package/dist/commands/book.js.map +1 -0
  26. package/dist/commands/chapter.d.ts +3 -0
  27. package/dist/commands/chapter.d.ts.map +1 -0
  28. package/dist/commands/chapter.js +103 -0
  29. package/dist/commands/chapter.js.map +1 -0
  30. package/dist/commands/compose.d.ts +3 -0
  31. package/dist/commands/compose.d.ts.map +1 -0
  32. package/dist/commands/compose.js +46 -0
  33. package/dist/commands/compose.js.map +1 -0
  34. package/dist/commands/config.d.ts +3 -0
  35. package/dist/commands/config.d.ts.map +1 -0
  36. package/dist/commands/config.js +321 -0
  37. package/dist/commands/config.js.map +1 -0
  38. package/dist/commands/consolidate.d.ts +3 -0
  39. package/dist/commands/consolidate.d.ts.map +1 -0
  40. package/dist/commands/consolidate.js +50 -0
  41. package/dist/commands/consolidate.js.map +1 -0
  42. package/dist/commands/daemon.d.ts +4 -0
  43. package/dist/commands/daemon.d.ts.map +1 -0
  44. package/dist/commands/daemon.js +118 -0
  45. package/dist/commands/daemon.js.map +1 -0
  46. package/dist/commands/detect.d.ts +3 -0
  47. package/dist/commands/detect.d.ts.map +1 -0
  48. package/dist/commands/detect.js +104 -0
  49. package/dist/commands/detect.js.map +1 -0
  50. package/dist/commands/doctor.d.ts +8 -0
  51. package/dist/commands/doctor.d.ts.map +1 -0
  52. package/dist/commands/doctor.js +356 -0
  53. package/dist/commands/doctor.js.map +1 -0
  54. package/dist/commands/draft.d.ts +3 -0
  55. package/dist/commands/draft.d.ts.map +1 -0
  56. package/dist/commands/draft.js +42 -0
  57. package/dist/commands/draft.js.map +1 -0
  58. package/dist/commands/eval.d.ts +3 -0
  59. package/dist/commands/eval.d.ts.map +1 -0
  60. package/dist/commands/eval.js +57 -0
  61. package/dist/commands/eval.js.map +1 -0
  62. package/dist/commands/export.d.ts +3 -0
  63. package/dist/commands/export.d.ts.map +1 -0
  64. package/dist/commands/export.js +46 -0
  65. package/dist/commands/export.js.map +1 -0
  66. package/dist/commands/fanfic.d.ts +3 -0
  67. package/dist/commands/fanfic.d.ts.map +1 -0
  68. package/dist/commands/fanfic.js +177 -0
  69. package/dist/commands/fanfic.js.map +1 -0
  70. package/dist/commands/forecast.d.ts +12 -0
  71. package/dist/commands/forecast.d.ts.map +1 -0
  72. package/dist/commands/forecast.js +156 -0
  73. package/dist/commands/forecast.js.map +1 -0
  74. package/dist/commands/genre.d.ts +11 -0
  75. package/dist/commands/genre.d.ts.map +1 -0
  76. package/dist/commands/genre.js +186 -0
  77. package/dist/commands/genre.js.map +1 -0
  78. package/dist/commands/import.d.ts +3 -0
  79. package/dist/commands/import.d.ts.map +1 -0
  80. package/dist/commands/import.js +110 -0
  81. package/dist/commands/import.js.map +1 -0
  82. package/dist/commands/init.d.ts +3 -0
  83. package/dist/commands/init.d.ts.map +1 -0
  84. package/dist/commands/init.js +63 -0
  85. package/dist/commands/init.js.map +1 -0
  86. package/dist/commands/interact.d.ts +6 -0
  87. package/dist/commands/interact.d.ts.map +1 -0
  88. package/dist/commands/interact.js +95 -0
  89. package/dist/commands/interact.js.map +1 -0
  90. package/dist/commands/plan.d.ts +3 -0
  91. package/dist/commands/plan.d.ts.map +1 -0
  92. package/dist/commands/plan.js +50 -0
  93. package/dist/commands/plan.js.map +1 -0
  94. package/dist/commands/radar.d.ts +3 -0
  95. package/dist/commands/radar.d.ts.map +1 -0
  96. package/dist/commands/radar.js +52 -0
  97. package/dist/commands/radar.js.map +1 -0
  98. package/dist/commands/review.d.ts +3 -0
  99. package/dist/commands/review.d.ts.map +1 -0
  100. package/dist/commands/review.js +229 -0
  101. package/dist/commands/review.js.map +1 -0
  102. package/dist/commands/revise.d.ts +3 -0
  103. package/dist/commands/revise.d.ts.map +1 -0
  104. package/dist/commands/revise.js +91 -0
  105. package/dist/commands/revise.js.map +1 -0
  106. package/dist/commands/short-fiction.d.ts +4 -0
  107. package/dist/commands/short-fiction.d.ts.map +1 -0
  108. package/dist/commands/short-fiction.js +220 -0
  109. package/dist/commands/short-fiction.js.map +1 -0
  110. package/dist/commands/status.d.ts +3 -0
  111. package/dist/commands/status.d.ts.map +1 -0
  112. package/dist/commands/status.js +123 -0
  113. package/dist/commands/status.js.map +1 -0
  114. package/dist/commands/studio.d.ts +21 -0
  115. package/dist/commands/studio.d.ts.map +1 -0
  116. package/dist/commands/studio.js +151 -0
  117. package/dist/commands/studio.js.map +1 -0
  118. package/dist/commands/style.d.ts +3 -0
  119. package/dist/commands/style.d.ts.map +1 -0
  120. package/dist/commands/style.js +95 -0
  121. package/dist/commands/style.js.map +1 -0
  122. package/dist/commands/translate.d.ts +3 -0
  123. package/dist/commands/translate.d.ts.map +1 -0
  124. package/dist/commands/translate.js +111 -0
  125. package/dist/commands/translate.js.map +1 -0
  126. package/dist/commands/tui.d.ts +6 -0
  127. package/dist/commands/tui.d.ts.map +1 -0
  128. package/dist/commands/tui.js +14 -0
  129. package/dist/commands/tui.js.map +1 -0
  130. package/dist/commands/update.d.ts +3 -0
  131. package/dist/commands/update.d.ts.map +1 -0
  132. package/dist/commands/update.js +40 -0
  133. package/dist/commands/update.js.map +1 -0
  134. package/dist/commands/write.d.ts +3 -0
  135. package/dist/commands/write.d.ts.map +1 -0
  136. package/dist/commands/write.js +371 -0
  137. package/dist/commands/write.js.map +1 -0
  138. package/dist/index.d.ts +3 -0
  139. package/dist/index.d.ts.map +1 -0
  140. package/dist/index.js +4 -0
  141. package/dist/index.js.map +1 -0
  142. package/dist/localization.d.ts +103 -0
  143. package/dist/localization.d.ts.map +1 -0
  144. package/dist/localization.js +377 -0
  145. package/dist/localization.js.map +1 -0
  146. package/dist/notify-helper.d.ts +17 -0
  147. package/dist/notify-helper.d.ts.map +1 -0
  148. package/dist/notify-helper.js +27 -0
  149. package/dist/notify-helper.js.map +1 -0
  150. package/dist/program.d.ts +10 -0
  151. package/dist/program.d.ts.map +1 -0
  152. package/dist/program.js +97 -0
  153. package/dist/program.js.map +1 -0
  154. package/dist/progress-text.d.ts +26 -0
  155. package/dist/progress-text.d.ts.map +1 -0
  156. package/dist/progress-text.js +35 -0
  157. package/dist/progress-text.js.map +1 -0
  158. package/dist/project-bootstrap.d.ts +8 -0
  159. package/dist/project-bootstrap.d.ts.map +1 -0
  160. package/dist/project-bootstrap.js +139 -0
  161. package/dist/project-bootstrap.js.map +1 -0
  162. package/dist/runtime-requirements.d.ts +24 -0
  163. package/dist/runtime-requirements.d.ts.map +1 -0
  164. package/dist/runtime-requirements.js +89 -0
  165. package/dist/runtime-requirements.js.map +1 -0
  166. package/dist/tui/__tests__/markdown.test.d.ts +2 -0
  167. package/dist/tui/__tests__/markdown.test.d.ts.map +1 -0
  168. package/dist/tui/__tests__/markdown.test.js +58 -0
  169. package/dist/tui/__tests__/markdown.test.js.map +1 -0
  170. package/dist/tui/activity-state.d.ts +9 -0
  171. package/dist/tui/activity-state.d.ts.map +1 -0
  172. package/dist/tui/activity-state.js +6 -0
  173. package/dist/tui/activity-state.js.map +1 -0
  174. package/dist/tui/agent-input.d.ts +118 -0
  175. package/dist/tui/agent-input.d.ts.map +1 -0
  176. package/dist/tui/agent-input.js +255 -0
  177. package/dist/tui/agent-input.js.map +1 -0
  178. package/dist/tui/ansi.d.ts +40 -0
  179. package/dist/tui/ansi.d.ts.map +1 -0
  180. package/dist/tui/ansi.js +62 -0
  181. package/dist/tui/ansi.js.map +1 -0
  182. package/dist/tui/app.d.ts +13 -0
  183. package/dist/tui/app.d.ts.map +1 -0
  184. package/dist/tui/app.js +109 -0
  185. package/dist/tui/app.js.map +1 -0
  186. package/dist/tui/chat-depth.d.ts +9 -0
  187. package/dist/tui/chat-depth.d.ts.map +1 -0
  188. package/dist/tui/chat-depth.js +14 -0
  189. package/dist/tui/chat-depth.js.map +1 -0
  190. package/dist/tui/chat-draft.d.ts +4 -0
  191. package/dist/tui/chat-draft.d.ts.map +1 -0
  192. package/dist/tui/chat-draft.js +28 -0
  193. package/dist/tui/chat-draft.js.map +1 -0
  194. package/dist/tui/composer-caret.d.ts +10 -0
  195. package/dist/tui/composer-caret.d.ts.map +1 -0
  196. package/dist/tui/composer-caret.js +13 -0
  197. package/dist/tui/composer-caret.js.map +1 -0
  198. package/dist/tui/composer-display.d.ts +7 -0
  199. package/dist/tui/composer-display.d.ts.map +1 -0
  200. package/dist/tui/composer-display.js +17 -0
  201. package/dist/tui/composer-display.js.map +1 -0
  202. package/dist/tui/dashboard-model.d.ts +46 -0
  203. package/dist/tui/dashboard-model.d.ts.map +1 -0
  204. package/dist/tui/dashboard-model.js +105 -0
  205. package/dist/tui/dashboard-model.js.map +1 -0
  206. package/dist/tui/dashboard.d.ts +38 -0
  207. package/dist/tui/dashboard.d.ts.map +1 -0
  208. package/dist/tui/dashboard.js +357 -0
  209. package/dist/tui/dashboard.js.map +1 -0
  210. package/dist/tui/effects.d.ts +61 -0
  211. package/dist/tui/effects.d.ts.map +1 -0
  212. package/dist/tui/effects.js +451 -0
  213. package/dist/tui/effects.js.map +1 -0
  214. package/dist/tui/i18n.d.ts +63 -0
  215. package/dist/tui/i18n.d.ts.map +1 -0
  216. package/dist/tui/i18n.js +205 -0
  217. package/dist/tui/i18n.js.map +1 -0
  218. package/dist/tui/input-history.d.ts +12 -0
  219. package/dist/tui/input-history.d.ts.map +1 -0
  220. package/dist/tui/input-history.js +47 -0
  221. package/dist/tui/input-history.js.map +1 -0
  222. package/dist/tui/local-commands.d.ts +12 -0
  223. package/dist/tui/local-commands.d.ts.map +1 -0
  224. package/dist/tui/local-commands.js +50 -0
  225. package/dist/tui/local-commands.js.map +1 -0
  226. package/dist/tui/markdown.d.ts +2 -0
  227. package/dist/tui/markdown.d.ts.map +1 -0
  228. package/dist/tui/markdown.js +60 -0
  229. package/dist/tui/markdown.js.map +1 -0
  230. package/dist/tui/session-store.d.ts +2 -0
  231. package/dist/tui/session-store.d.ts.map +1 -0
  232. package/dist/tui/session-store.js +2 -0
  233. package/dist/tui/session-store.js.map +1 -0
  234. package/dist/tui/setup.d.ts +53 -0
  235. package/dist/tui/setup.d.ts.map +1 -0
  236. package/dist/tui/setup.js +313 -0
  237. package/dist/tui/setup.js.map +1 -0
  238. package/dist/tui/slash-autocomplete.d.ts +8 -0
  239. package/dist/tui/slash-autocomplete.d.ts.map +1 -0
  240. package/dist/tui/slash-autocomplete.js +48 -0
  241. package/dist/tui/slash-autocomplete.js.map +1 -0
  242. package/dist/tui/theme.d.ts +28 -0
  243. package/dist/tui/theme.d.ts.map +1 -0
  244. package/dist/tui/theme.js +53 -0
  245. package/dist/tui/theme.js.map +1 -0
  246. package/dist/utils.d.ts +32 -0
  247. package/dist/utils.d.ts.map +1 -0
  248. package/dist/utils.js +165 -0
  249. package/dist/utils.js.map +1 -0
  250. package/package.json +72 -0
@@ -0,0 +1,255 @@
1
+ import { ActionPayloadSchema, appendInteractionMessage, clearPendingDecision, createLLMClient, RequestedIntentSchema, runAgentSession, SessionKindSchema, toWritingLanguage, } from "@kienmatu/inkos-core";
2
+ import { persistProjectSession } from "./session-store.js";
3
+ import { buildPipelineConfig, loadConfig } from "../utils.js";
4
+ export async function processTuiAgentInput(params) {
5
+ const config = await loadConfig({
6
+ requireApiKey: false,
7
+ projectRoot: params.projectRoot,
8
+ ...(params.session.modelOverride ? { cli: { model: params.session.modelOverride } } : {}),
9
+ });
10
+ const client = createLLMClient(config.llm);
11
+ const pipeline = new (await import("@kienmatu/inkos-core")).PipelineRunner(buildPipelineConfig(config, params.projectRoot, { quiet: true }));
12
+ const userTimestamp = Date.now();
13
+ const currentBookId = params.activeBookId ?? params.session.activeBookId ?? null;
14
+ const language = toWritingLanguage(config.language);
15
+ const route = resolveTuiAgentRoute(params.input, params.session, currentBookId, language);
16
+ const resolvedBookId = route.detachBook ? null : currentBookId;
17
+ const initialMessages = params.session.messages
18
+ .filter((message) => message.role === "user" || message.role === "assistant")
19
+ .map((message) => ({ role: message.role, content: message.content }));
20
+ let nextSession = appendInteractionMessage(clearPendingDecision({
21
+ ...params.session,
22
+ sessionKind: route.sessionKind,
23
+ ...(route.playMode ? { playMode: route.playMode } : {}),
24
+ ...(route.detachBook ? { activeBookId: undefined } : resolvedBookId ? { activeBookId: resolvedBookId } : {}),
25
+ currentExecution: {
26
+ status: "planning",
27
+ ...(resolvedBookId ? { bookId: resolvedBookId } : {}),
28
+ ...(params.session.activeChapterNumber ? { chapterNumber: params.session.activeChapterNumber } : {}),
29
+ stageLabel: "agent",
30
+ },
31
+ }), {
32
+ role: "user",
33
+ content: params.input,
34
+ timestamp: userTimestamp,
35
+ });
36
+ if (route.clearPending) {
37
+ delete nextSession.pendingProposedAction;
38
+ }
39
+ if (route.localResponse) {
40
+ nextSession = appendInteractionMessage({
41
+ ...nextSession,
42
+ currentExecution: {
43
+ status: "completed",
44
+ ...(resolvedBookId ? { bookId: resolvedBookId } : {}),
45
+ stageLabel: "agent",
46
+ },
47
+ }, {
48
+ role: "assistant",
49
+ content: route.localResponse,
50
+ timestamp: userTimestamp + 1,
51
+ });
52
+ await persistProjectSession(params.projectRoot, nextSession);
53
+ return { responseText: route.localResponse, session: nextSession };
54
+ }
55
+ const result = await runAgentSession({
56
+ sessionId: params.session.sessionId,
57
+ bookId: resolvedBookId,
58
+ sessionKind: route.sessionKind,
59
+ actionSource: route.actionSource,
60
+ ...(route.requestedIntent ? { requestedIntent: route.requestedIntent } : {}),
61
+ ...(route.actionPayload ? { actionPayload: route.actionPayload } : {}),
62
+ ...(route.requestedSkills?.length ? { requestedSkills: route.requestedSkills } : {}),
63
+ ...(route.playMode ? { playMode: route.playMode } : {}),
64
+ language,
65
+ pipeline,
66
+ projectRoot: params.projectRoot,
67
+ model: client._piModel
68
+ ? client._piModel
69
+ : { provider: config.llm.provider ?? "openai", modelId: config.llm.model },
70
+ apiKey: client._apiKey,
71
+ onEvent: (event) => {
72
+ if (event.type === "message_update" && event.assistantMessageEvent?.type === "text_delta") {
73
+ params.onTextDelta?.(event.assistantMessageEvent.delta);
74
+ }
75
+ },
76
+ }, route.userMessage, initialMessages);
77
+ const createdBookId = extractCreatedBookId(result.messages);
78
+ const activeBookId = createdBookId ?? resolvedBookId;
79
+ const proposedAction = extractProposedAction(result.messages);
80
+ const responseText = proposedAction
81
+ ? formatProposedAction(proposedAction, language)
82
+ : result.responseText;
83
+ const completedSession = {
84
+ ...nextSession,
85
+ sessionKind: route.sessionKind,
86
+ ...(route.playMode ? { playMode: route.playMode } : {}),
87
+ ...(activeBookId ? { activeBookId } : {}),
88
+ ...(proposedAction ? { pendingProposedAction: proposedAction } : {}),
89
+ currentExecution: {
90
+ status: "completed",
91
+ ...(activeBookId ? { bookId: activeBookId } : {}),
92
+ ...(params.session.activeChapterNumber ? { chapterNumber: params.session.activeChapterNumber } : {}),
93
+ stageLabel: "agent",
94
+ },
95
+ };
96
+ if (responseText?.trim()) {
97
+ const lastAssistant = result.messages
98
+ .filter((message) => message.role === "assistant")
99
+ .at(-1);
100
+ nextSession = appendInteractionMessage(completedSession, {
101
+ role: "assistant",
102
+ content: responseText,
103
+ ...(lastAssistant?.thinking ? { thinking: lastAssistant.thinking } : {}),
104
+ timestamp: userTimestamp + 1,
105
+ });
106
+ }
107
+ else {
108
+ nextSession = completedSession;
109
+ }
110
+ if (!proposedAction && (route.clearPending || route.requestedIntent)) {
111
+ delete nextSession.pendingProposedAction;
112
+ }
113
+ await persistProjectSession(params.projectRoot, nextSession);
114
+ return { responseText, session: nextSession };
115
+ }
116
+ export function resolveTuiAgentRoute(rawInput, session, activeBookId, language = "zh") {
117
+ const input = rawInput.trim();
118
+ const currentKind = session.sessionKind ?? (activeBookId ? "book" : "chat");
119
+ if (/^\/confirm$/i.test(input)) {
120
+ const pending = session.pendingProposedAction;
121
+ if (!pending) {
122
+ return localConfirmationRoute(currentKind, input, language === "en" ? "There is no pending action." : "没有待确认的动作。");
123
+ }
124
+ const requestedIntent = RequestedIntentSchema.safeParse(pending.action);
125
+ const actionPayload = pending.actionPayload === undefined
126
+ ? { success: true, data: undefined }
127
+ : ActionPayloadSchema.safeParse(pending.actionPayload);
128
+ if (!requestedIntent.success || !actionPayload.success) {
129
+ return localConfirmationRoute(currentKind, input, language === "en"
130
+ ? "This pending action is no longer valid. Please propose it again."
131
+ : "这条待确认动作已失效,请重新提出需求。");
132
+ }
133
+ return {
134
+ userMessage: pending.instruction,
135
+ sessionKind: pending.targetSessionKind,
136
+ actionSource: "slash",
137
+ requestedIntent: requestedIntent.data,
138
+ ...(actionPayload.data ? { actionPayload: actionPayload.data } : {}),
139
+ ...(pending.requestedSkills?.length ? { requestedSkills: pending.requestedSkills } : {}),
140
+ ...(pending.playMode ? { playMode: pending.playMode } : {}),
141
+ ...(detachesFromBook(pending.targetSessionKind) ? { detachBook: true } : {}),
142
+ clearPending: true,
143
+ };
144
+ }
145
+ if (/^\/(?:cancel|reject)$/i.test(input)) {
146
+ return localConfirmationRoute(currentKind, input, session.pendingProposedAction
147
+ ? language === "en" ? "Pending action cancelled." : "已取消待确认动作。"
148
+ : language === "en" ? "There is no pending action." : "没有待确认的动作。");
149
+ }
150
+ const newMatch = input.match(/^\/new(?:\s+([\s\S]+))?$/i);
151
+ if (newMatch) {
152
+ return entryRoute("book-create", commandBody(newMatch[1], language === "en"
153
+ ? "I want to create a new book. Confirm the direction with me first."
154
+ : "我想创建一本新书,请先和我确认方向。"));
155
+ }
156
+ const shortMatch = input.match(/^\/short(?:\s+([\s\S]+))?$/i);
157
+ if (shortMatch) {
158
+ return entryRoute("short", commandBody(shortMatch[1], language === "en"
159
+ ? "I want to create an InkOS Short. Confirm the direction with me first."
160
+ : "我想做 InkOS Short,请先和我确认方向。"));
161
+ }
162
+ const coverMatch = input.match(/^\/cover(?:\s+([\s\S]+))?$/i);
163
+ if (coverMatch) {
164
+ return entryRoute("short", commandBody(coverMatch[1], language === "en"
165
+ ? "I want to create or redo a cover. Confirm the target with me first."
166
+ : "我想生成或重做封面,请先和我确认目标。"));
167
+ }
168
+ const playMatch = input.match(/^\/play(?:\s+(open|guided))?(?:\s+([\s\S]+))?$/i);
169
+ if (playMatch) {
170
+ const playMode = playMatch[1]?.toLowerCase();
171
+ return {
172
+ ...entryRoute("play", commandBody(playMatch[2], language === "en"
173
+ ? "I want to start an interactive world. Confirm the opening with me first."
174
+ : "我想启动互动世界,请先和我确认开局。")),
175
+ ...(playMode ? { playMode } : {}),
176
+ };
177
+ }
178
+ if (/^\/write$/i.test(input)) {
179
+ return {
180
+ userMessage: language === "en" ? "Write the next chapter" : "写下一章",
181
+ sessionKind: activeBookId ? "book" : currentKind,
182
+ actionSource: "slash",
183
+ requestedIntent: "write_next",
184
+ };
185
+ }
186
+ return {
187
+ userMessage: input,
188
+ sessionKind: currentKind,
189
+ actionSource: "free-text",
190
+ ...(session.playMode ? { playMode: session.playMode } : {}),
191
+ };
192
+ }
193
+ function entryRoute(sessionKind, userMessage) {
194
+ return { userMessage, sessionKind, actionSource: "slash", detachBook: true };
195
+ }
196
+ function localConfirmationRoute(sessionKind, userMessage, localResponse) {
197
+ return { userMessage, sessionKind, actionSource: "slash", clearPending: true, localResponse };
198
+ }
199
+ function detachesFromBook(sessionKind) {
200
+ return sessionKind === "book-create"
201
+ || sessionKind === "short"
202
+ || sessionKind === "play"
203
+ || sessionKind === "script"
204
+ || sessionKind === "storyboard"
205
+ || sessionKind === "interactive-film";
206
+ }
207
+ function commandBody(value, fallback) {
208
+ const trimmed = value?.trim();
209
+ return trimmed && trimmed.length > 0 ? trimmed : fallback;
210
+ }
211
+ function extractCreatedBookId(messages) {
212
+ for (const message of [...messages].reverse()) {
213
+ const details = message.details;
214
+ if (details?.kind === "book_created" && details.bookId)
215
+ return details.bookId;
216
+ }
217
+ return undefined;
218
+ }
219
+ function extractProposedAction(messages) {
220
+ for (const message of [...messages].reverse()) {
221
+ const details = message.details;
222
+ if (!details || details.kind !== "proposed_action")
223
+ continue;
224
+ const action = RequestedIntentSchema.safeParse(details.action);
225
+ const targetSessionKind = SessionKindSchema.safeParse(details.targetSessionKind);
226
+ const instruction = typeof details.instruction === "string" ? details.instruction.trim() : "";
227
+ const actionPayload = details.actionPayload === undefined
228
+ ? { success: true, data: undefined }
229
+ : ActionPayloadSchema.safeParse(details.actionPayload);
230
+ if (!action.success || !targetSessionKind.success || !instruction || !actionPayload.success)
231
+ continue;
232
+ const requestedSkills = Array.isArray(details.requestedSkills)
233
+ ? [...new Set(details.requestedSkills.filter((value) => typeof value === "string" && value.trim().length > 0)
234
+ .map((value) => value.trim().toLowerCase()))]
235
+ : undefined;
236
+ const playMode = actionPayload.data?.playStart?.mode;
237
+ return {
238
+ action: action.data,
239
+ targetSessionKind: targetSessionKind.data,
240
+ instruction,
241
+ ...(typeof details.title === "string" && details.title.trim() ? { title: details.title.trim() } : {}),
242
+ ...(typeof details.summary === "string" && details.summary.trim() ? { summary: details.summary.trim() } : {}),
243
+ ...(playMode ? { playMode } : {}),
244
+ ...(requestedSkills?.length ? { requestedSkills } : {}),
245
+ ...(actionPayload.data ? { actionPayload: actionPayload.data } : {}),
246
+ };
247
+ }
248
+ return undefined;
249
+ }
250
+ function formatProposedAction(action, language) {
251
+ return language === "en"
252
+ ? [action.title ?? "Confirm action", action.summary ?? "Confirm to continue.", "", action.instruction, "", "Type /confirm to continue, or /cancel to cancel."].join("\n")
253
+ : [action.title ?? "确认执行", action.summary ?? "确认后继续执行。", "", action.instruction, "", "输入 /confirm 继续,或 /cancel 取消。"].join("\n");
254
+ }
255
+ //# sourceMappingURL=agent-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-input.js","sourceRoot":"","sources":["../../src/tui/agent-input.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,oBAAoB,EACpB,eAAe,EACf,qBAAqB,EACrB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,GAQlB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAe9D,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAM1C;IACC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC;QAC9B,aAAa,EAAE,KAAK;QACpB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1F,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,cAAc,CACxE,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CACjE,CAAC;IACF,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACjC,MAAM,aAAa,GAAG,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC;IACjF,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,oBAAoB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;IAC1F,MAAM,cAAc,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC;IAC/D,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ;SAC5C,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC;SAC5E,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAExE,IAAI,WAAW,GAAG,wBAAwB,CAAC,oBAAoB,CAAC;QAC9D,GAAG,MAAM,CAAC,OAAO;QACjB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5G,gBAAgB,EAAE;YAChB,MAAM,EAAE,UAAU;YAClB,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpG,UAAU,EAAE,OAAO;SACpB;KACF,CAAC,EAAE;QACF,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,MAAM,CAAC,KAAK;QACrB,SAAS,EAAE,aAAa;KACzB,CAAC,CAAC;IAEH,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,OAAO,WAAW,CAAC,qBAAqB,CAAC;IAC3C,CAAC;IAED,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;QACxB,WAAW,GAAG,wBAAwB,CAAC;YACrC,GAAG,WAAW;YACd,gBAAgB,EAAE;gBAChB,MAAM,EAAE,WAAW;gBACnB,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrD,UAAU,EAAE,OAAO;aACpB;SACF,EAAE;YACD,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,KAAK,CAAC,aAAa;YAC5B,SAAS,EAAE,aAAa,GAAG,CAAC;SAC7B,CAAC,CAAC;QACH,MAAM,qBAAqB,CAAC,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAC7D,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IACrE,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,eAAe,CAClC;QACE,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS;QACnC,MAAM,EAAE,cAAc;QACtB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,GAAG,CAAC,KAAK,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpF,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,QAAQ;QACR,QAAQ;QACR,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,KAAK,EAAE,MAAM,CAAC,QAAQ;YACpB,CAAC,CAAC,MAAM,CAAC,QAAQ;YACjB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,IAAI,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE;QAC5E,MAAM,EAAE,MAAM,CAAC,OAAO;QACtB,OAAO,EAAE,CAAC,KAAU,EAAE,EAAE;YACtB,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,IAAI,KAAK,CAAC,qBAAqB,EAAE,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC1F,MAAM,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;KACF,EACD,KAAK,CAAC,WAAW,EACjB,eAAe,CAChB,CAAC;IACF,MAAM,aAAa,GAAG,oBAAoB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5D,MAAM,YAAY,GAAG,aAAa,IAAI,cAAc,CAAC;IACrD,MAAM,cAAc,GAAG,qBAAqB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC9D,MAAM,YAAY,GAAG,cAAc;QACjC,CAAC,CAAC,oBAAoB,CAAC,cAAc,EAAE,QAAQ,CAAC;QAChD,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;IAExB,MAAM,gBAAgB,GAAG;QACvB,GAAG,WAAW;QACd,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,gBAAgB,EAAE;YAChB,MAAM,EAAE,WAAoB;YAC5B,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjD,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpG,UAAU,EAAE,OAAO;SACpB;KACF,CAAC;IAEF,IAAI,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC;QACzB,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ;aAClC,MAAM,CAAC,CAAC,OAAY,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC;aACtD,EAAE,CAAC,CAAC,CAAC,CAAsC,CAAC;QAC/C,WAAW,GAAG,wBAAwB,CAAC,gBAAgB,EAAE;YACvD,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,YAAY;YACrB,GAAG,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxE,SAAS,EAAE,aAAa,GAAG,CAAC;SAC7B,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,WAAW,GAAG,gBAAgB,CAAC;IACjC,CAAC;IAED,IAAI,CAAC,cAAc,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC;QACrE,OAAO,WAAW,CAAC,qBAAqB,CAAC;IAC3C,CAAC;IAED,MAAM,qBAAqB,CAAC,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAC7D,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,QAAgB,EAChB,OAA2B,EAC3B,YAA2B,EAC3B,WAAwB,IAAI;IAE5B,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC9B,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAE5E,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,qBAAqB,CAAC;QAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,sBAAsB,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QACrH,CAAC;QACD,MAAM,eAAe,GAAG,qBAAqB,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACxE,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,KAAK,SAAS;YACvD,CAAC,CAAC,EAAE,OAAO,EAAE,IAAa,EAAE,IAAI,EAAE,SAAS,EAAE;YAC7C,CAAC,CAAC,mBAAmB,CAAC,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACzD,IAAI,CAAC,eAAe,CAAC,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;YACvD,OAAO,sBAAsB,CAC3B,WAAW,EACX,KAAK,EACL,QAAQ,KAAK,IAAI;gBACf,CAAC,CAAC,kEAAkE;gBACpE,CAAC,CAAC,qBAAqB,CAC1B,CAAC;QACJ,CAAC;QACD,OAAO;YACL,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,WAAW,EAAE,OAAO,CAAC,iBAAiB;YACtC,YAAY,EAAE,OAAO;YACrB,eAAe,EAAE,eAAe,CAAC,IAAI;YACrC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpE,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxF,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5E,YAAY,EAAE,IAAI;SACnB,CAAC;IACJ,CAAC;IAED,IAAI,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACzC,OAAO,sBAAsB,CAC3B,WAAW,EACX,KAAK,EACL,OAAO,CAAC,qBAAqB;YAC3B,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,WAAW;YAC/D,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,WAAW,CACpE,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC1D,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,UAAU,CAAC,aAAa,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,KAAK,IAAI;YACzE,CAAC,CAAC,mEAAmE;YACrE,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC9D,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,UAAU,CAAC,OAAO,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,KAAK,IAAI;YACrE,CAAC,CAAC,uEAAuE;YACzE,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC9D,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,UAAU,CAAC,OAAO,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,KAAK,IAAI;YACrE,CAAC,CAAC,qEAAqE;YACvE,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACjF,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAA0B,CAAC;QACrE,OAAO;YACL,GAAG,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,KAAK,IAAI;gBAC/D,CAAC,CAAC,0EAA0E;gBAC5E,CAAC,CAAC,oBAAoB,CAAC,CAAC;YAC1B,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClC,CAAC;IACJ,CAAC;IAED,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO;YACL,WAAW,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,MAAM;YAClE,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW;YAChD,YAAY,EAAE,OAAO;YACrB,eAAe,EAAE,YAAY;SAC9B,CAAC;IACJ,CAAC;IAED,OAAO;QACL,WAAW,EAAE,KAAK;QAClB,WAAW,EAAE,WAAW;QACxB,YAAY,EAAE,WAAW;QACzB,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5D,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,WAAwB,EAAE,WAAmB;IAC/D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AAC/E,CAAC;AAED,SAAS,sBAAsB,CAAC,WAAwB,EAAE,WAAmB,EAAE,aAAqB;IAClG,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;AAChG,CAAC;AAED,SAAS,gBAAgB,CAAC,WAAwB;IAChD,OAAO,WAAW,KAAK,aAAa;WAC/B,WAAW,KAAK,OAAO;WACvB,WAAW,KAAK,MAAM;WACtB,WAAW,KAAK,QAAQ;WACxB,WAAW,KAAK,YAAY;WAC5B,WAAW,KAAK,kBAAkB,CAAC;AAC1C,CAAC;AAED,SAAS,WAAW,CAAC,KAAyB,EAAE,QAAgB;IAC9D,MAAM,OAAO,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IAC9B,OAAO,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC5D,CAAC;AAED,SAAS,oBAAoB,CAAC,QAAgC;IAC5D,KAAK,MAAM,OAAO,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAC9C,MAAM,OAAO,GAAI,OAA4D,CAAC,OAAO,CAAC;QACtF,IAAI,OAAO,EAAE,IAAI,KAAK,cAAc,IAAI,OAAO,CAAC,MAAM;YAAE,OAAO,OAAO,CAAC,MAAM,CAAC;IAChF,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,qBAAqB,CAAC,QAAgC;IAC7D,KAAK,MAAM,OAAO,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAC9C,MAAM,OAAO,GAAI,OAAiD,CAAC,OAAO,CAAC;QAC3E,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,iBAAiB;YAAE,SAAS;QAC7D,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC/D,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,SAAS,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACjF,MAAM,WAAW,GAAG,OAAO,OAAO,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9F,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,KAAK,SAAS;YACvD,CAAC,CAAC,EAAE,OAAO,EAAE,IAAa,EAAE,IAAI,EAAE,SAAS,EAAE;YAC7C,CAAC,CAAC,mBAAmB,CAAC,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,iBAAiB,CAAC,OAAO,IAAI,CAAC,WAAW,IAAI,CAAC,aAAa,CAAC,OAAO;YAAE,SAAS;QAEtG,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC;YAC5D,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;qBAC3H,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YAC/C,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC;QACrD,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,IAAI;YACnB,iBAAiB,EAAE,iBAAiB,CAAC,IAAI;YACzC,WAAW;YACX,GAAG,CAAC,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrG,GAAG,CAAC,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7G,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvD,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrE,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,oBAAoB,CAAC,MAA6B,EAAE,QAAqB;IAChF,OAAO,QAAQ,KAAK,IAAI;QACtB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,gBAAgB,EAAE,MAAM,CAAC,OAAO,IAAI,sBAAsB,EAAE,EAAE,EAAE,MAAM,CAAC,WAAW,EAAE,EAAE,EAAE,kDAAkD,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACzK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,EAAE,MAAM,CAAC,OAAO,IAAI,UAAU,EAAE,EAAE,EAAE,MAAM,CAAC,WAAW,EAAE,EAAE,EAAE,8BAA8B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACpI,CAAC"}
@@ -0,0 +1,40 @@
1
+ export declare const reset = "\u001B[0m";
2
+ export declare const bold = "\u001B[1m";
3
+ export declare const dim = "\u001B[2m";
4
+ export declare const italic = "\u001B[3m";
5
+ export declare const red = "\u001B[31m";
6
+ export declare const green = "\u001B[32m";
7
+ export declare const yellow = "\u001B[33m";
8
+ export declare const blue = "\u001B[34m";
9
+ export declare const magenta = "\u001B[35m";
10
+ export declare const cyan = "\u001B[36m";
11
+ export declare const white = "\u001B[37m";
12
+ export declare const gray = "\u001B[90m";
13
+ export declare const brightRed = "\u001B[91m";
14
+ export declare const brightGreen = "\u001B[92m";
15
+ export declare const brightYellow = "\u001B[93m";
16
+ export declare const brightBlue = "\u001B[94m";
17
+ export declare const brightMagenta = "\u001B[95m";
18
+ export declare const brightCyan = "\u001B[96m";
19
+ export declare const brightWhite = "\u001B[97m";
20
+ export declare const bgCyan = "\u001B[46m";
21
+ export declare const bgBlue = "\u001B[44m";
22
+ export declare const bgMagenta = "\u001B[45m";
23
+ export declare const bgGreen = "\u001B[42m";
24
+ export declare const bgYellow = "\u001B[43m";
25
+ export declare const bgRed = "\u001B[41m";
26
+ export declare const bgGray = "\u001B[100m";
27
+ export declare const clearScreen = "\u001B[2J\u001B[H";
28
+ export declare const showCursor = "\u001B[?25h";
29
+ export declare const hideCursor = "\u001B[?25l";
30
+ export declare const clearLine = "\u001B[2K\r";
31
+ export declare const saveCursor = "\u001B[s";
32
+ export declare const restoreCursor = "\u001B[u";
33
+ export declare function c(text: string, ...codes: string[]): string;
34
+ export declare function termWidth(): number;
35
+ export declare function stripAnsi(s: string): string;
36
+ export declare function hr(char?: string): string;
37
+ export declare function box(lines: string[], width?: number): string;
38
+ export declare function badge(text: string, bg: string, fg?: string): string;
39
+ export declare function sleep(ms: number): Promise<void>;
40
+ //# sourceMappingURL=ansi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ansi.d.ts","sourceRoot":"","sources":["../../src/tui/ansi.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,KAAK,cAAY,CAAC;AAC/B,eAAO,MAAM,IAAI,cAAY,CAAC;AAC9B,eAAO,MAAM,GAAG,cAAY,CAAC;AAC7B,eAAO,MAAM,MAAM,cAAY,CAAC;AAEhC,eAAO,MAAM,GAAG,eAAa,CAAC;AAC9B,eAAO,MAAM,KAAK,eAAa,CAAC;AAChC,eAAO,MAAM,MAAM,eAAa,CAAC;AACjC,eAAO,MAAM,IAAI,eAAa,CAAC;AAC/B,eAAO,MAAM,OAAO,eAAa,CAAC;AAClC,eAAO,MAAM,IAAI,eAAa,CAAC;AAC/B,eAAO,MAAM,KAAK,eAAa,CAAC;AAChC,eAAO,MAAM,IAAI,eAAa,CAAC;AAC/B,eAAO,MAAM,SAAS,eAAa,CAAC;AACpC,eAAO,MAAM,WAAW,eAAa,CAAC;AACtC,eAAO,MAAM,YAAY,eAAa,CAAC;AACvC,eAAO,MAAM,UAAU,eAAa,CAAC;AACrC,eAAO,MAAM,aAAa,eAAa,CAAC;AACxC,eAAO,MAAM,UAAU,eAAa,CAAC;AACrC,eAAO,MAAM,WAAW,eAAa,CAAC;AAEtC,eAAO,MAAM,MAAM,eAAa,CAAC;AACjC,eAAO,MAAM,MAAM,eAAa,CAAC;AACjC,eAAO,MAAM,SAAS,eAAa,CAAC;AACpC,eAAO,MAAM,OAAO,eAAa,CAAC;AAClC,eAAO,MAAM,QAAQ,eAAa,CAAC;AACnC,eAAO,MAAM,KAAK,eAAa,CAAC;AAChC,eAAO,MAAM,MAAM,gBAAc,CAAC;AAElC,eAAO,MAAM,WAAW,sBAAkB,CAAC;AAC3C,eAAO,MAAM,UAAU,gBAAc,CAAC;AACtC,eAAO,MAAM,UAAU,gBAAc,CAAC;AACtC,eAAO,MAAM,SAAS,gBAAc,CAAC;AACrC,eAAO,MAAM,UAAU,aAAW,CAAC;AACnC,eAAO,MAAM,aAAa,aAAW,CAAC;AAEtC,wBAAgB,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAE1D;AAED,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,wBAAgB,EAAE,CAAC,IAAI,SAAM,GAAG,MAAM,CAErC;AAED,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,SAAK,GAAG,MAAM,CASvD;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,GAAE,MAAoB,GAAG,MAAM,CAEhF;AAED,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C"}
@@ -0,0 +1,62 @@
1
+ /* ── ANSI terminal helpers ── zero dependencies ── */
2
+ export const reset = "\x1b[0m";
3
+ export const bold = "\x1b[1m";
4
+ export const dim = "\x1b[2m";
5
+ export const italic = "\x1b[3m";
6
+ export const red = "\x1b[31m";
7
+ export const green = "\x1b[32m";
8
+ export const yellow = "\x1b[33m";
9
+ export const blue = "\x1b[34m";
10
+ export const magenta = "\x1b[35m";
11
+ export const cyan = "\x1b[36m";
12
+ export const white = "\x1b[37m";
13
+ export const gray = "\x1b[90m";
14
+ export const brightRed = "\x1b[91m";
15
+ export const brightGreen = "\x1b[92m";
16
+ export const brightYellow = "\x1b[93m";
17
+ export const brightBlue = "\x1b[94m";
18
+ export const brightMagenta = "\x1b[95m";
19
+ export const brightCyan = "\x1b[96m";
20
+ export const brightWhite = "\x1b[97m";
21
+ export const bgCyan = "\x1b[46m";
22
+ export const bgBlue = "\x1b[44m";
23
+ export const bgMagenta = "\x1b[45m";
24
+ export const bgGreen = "\x1b[42m";
25
+ export const bgYellow = "\x1b[43m";
26
+ export const bgRed = "\x1b[41m";
27
+ export const bgGray = "\x1b[100m";
28
+ export const clearScreen = "\x1b[2J\x1b[H";
29
+ export const showCursor = "\x1b[?25h";
30
+ export const hideCursor = "\x1b[?25l";
31
+ export const clearLine = "\x1b[2K\r";
32
+ export const saveCursor = "\x1b[s";
33
+ export const restoreCursor = "\x1b[u";
34
+ export function c(text, ...codes) {
35
+ return `${codes.join("")}${text}${reset}`;
36
+ }
37
+ export function termWidth() {
38
+ return process.stdout.columns ?? 80;
39
+ }
40
+ export function stripAnsi(s) {
41
+ return s.replace(/\x1b\[[0-9;]*m/g, "");
42
+ }
43
+ export function hr(char = "─") {
44
+ return char.repeat(Math.min(termWidth(), 60));
45
+ }
46
+ export function box(lines, width = 56) {
47
+ const top = `╭${"─".repeat(width - 2)}╮`;
48
+ const bot = `╰${"─".repeat(width - 2)}╯`;
49
+ const rows = lines.map((line) => {
50
+ const visible = stripAnsi(line);
51
+ const pad = Math.max(0, width - 2 - visible.length);
52
+ return `│${line}${" ".repeat(pad)}│`;
53
+ });
54
+ return [top, ...rows, bot].join("\n");
55
+ }
56
+ export function badge(text, bg, fg = brightWhite) {
57
+ return `${bg}${fg}${bold} ${text} ${reset}`;
58
+ }
59
+ export function sleep(ms) {
60
+ return new Promise((resolve) => setTimeout(resolve, ms));
61
+ }
62
+ //# sourceMappingURL=ansi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ansi.js","sourceRoot":"","sources":["../../src/tui/ansi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { type TuiLocale } from "./i18n.js";
2
+ export interface TuiFrameState {
3
+ readonly locale?: TuiLocale;
4
+ readonly projectName: string;
5
+ readonly activeBookTitle?: string;
6
+ readonly automationMode: string;
7
+ readonly status: string;
8
+ readonly messages?: ReadonlyArray<string>;
9
+ readonly events?: ReadonlyArray<string>;
10
+ }
11
+ export declare function renderTuiFrame(state: TuiFrameState): string;
12
+ export declare function launchTui(projectRoot: string): Promise<void>;
13
+ //# sourceMappingURL=app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/tui/app.ts"],"names":[],"mappings":"AAKA,OAAO,EAAsE,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAK/G,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CACzC;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAqB3D;AA8BD,wBAAsB,SAAS,CAC7B,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAwDf"}
@@ -0,0 +1,109 @@
1
+ import { access } from "node:fs/promises";
2
+ import { basename, dirname, join } from "node:path";
3
+ import { render } from "ink";
4
+ import React from "react";
5
+ import { InkTuiApp } from "./dashboard.js";
6
+ import { formatModeLabel, getTuiCopy, normalizeStageLabel, resolveTuiLocale } from "./i18n.js";
7
+ import { loadProjectSession } from "./session-store.js";
8
+ import { detectModelInfo, detectProjectLanguage, ensureProject, interactiveLlmSetup } from "./setup.js";
9
+ import { animateStartup } from "./effects.js";
10
+ export function renderTuiFrame(state) {
11
+ const locale = state.locale ?? resolveTuiLocale();
12
+ const copy = getTuiCopy(locale);
13
+ const lines = [
14
+ `${copy.labels.project} ${state.projectName}`,
15
+ `${copy.labels.stage} ${normalizeStageLabel(state.status, copy)}`,
16
+ `${copy.labels.mode} ${formatModeLabel(state.automationMode, copy)}`,
17
+ `${copy.labels.book} ${state.activeBookTitle ?? copy.labels.none}`,
18
+ "",
19
+ ...(state.messages?.length
20
+ ? state.messages.slice(-6).map((message) => `- ${message}`)
21
+ : [`- (${copy.labels.none})`]),
22
+ "",
23
+ state.events?.length
24
+ ? state.events.slice(-1).map((event) => `${copy.labels.recent} ${event}`)[0]
25
+ : `${copy.labels.recent} (${copy.labels.none})`,
26
+ "",
27
+ copy.composer.placeholder,
28
+ "> ",
29
+ ];
30
+ return lines.join("\n");
31
+ }
32
+ async function readVersion() {
33
+ try {
34
+ const { readFile } = await import("node:fs/promises");
35
+ const { join, dirname } = await import("node:path");
36
+ const { fileURLToPath } = await import("node:url");
37
+ const root = join(dirname(fileURLToPath(import.meta.url)), "..", "..");
38
+ const pkg = JSON.parse(await readFile(join(root, "package.json"), "utf-8"));
39
+ return pkg.version ?? "dev";
40
+ }
41
+ catch {
42
+ return "dev";
43
+ }
44
+ }
45
+ async function resolveProjectRoot(cwd) {
46
+ // If CWD is a book directory (contains book.json), walk up to the actual project root.
47
+ // Structure: <projectRoot>/books/<bookId>/book.json
48
+ try {
49
+ await access(join(cwd, "book.json"));
50
+ const parent = dirname(cwd);
51
+ if (basename(parent) === "books") {
52
+ return dirname(parent);
53
+ }
54
+ }
55
+ catch {
56
+ // not a book directory
57
+ }
58
+ return cwd;
59
+ }
60
+ export async function launchTui(projectRoot) {
61
+ projectRoot = await resolveProjectRoot(projectRoot);
62
+ const { hasLlmConfig } = await ensureProject(projectRoot);
63
+ const projectLanguage = await detectProjectLanguage(projectRoot);
64
+ const locale = resolveTuiLocale(process.env, projectLanguage);
65
+ const copy = getTuiCopy(locale);
66
+ if (!hasLlmConfig) {
67
+ console.log();
68
+ console.log(copy.notes.noLlmConfig);
69
+ console.log(copy.notes.setupProvider);
70
+ await interactiveLlmSetup(projectRoot);
71
+ }
72
+ if (!process.stdin.isTTY || !process.stdout.isTTY) {
73
+ return;
74
+ }
75
+ const session = await loadProjectSession(projectRoot);
76
+ const modelInfo = await detectModelInfo(projectRoot);
77
+ const modelLabel = modelInfo
78
+ ? `${modelInfo.model && modelInfo.model !== "unknown" ? modelInfo.model : copy.labels.unknown} (${modelInfo.provider})`
79
+ : copy.labels.notConfigured;
80
+ const version = await readVersion();
81
+ const chatStreamBridge = {};
82
+ const originalEmitWarning = process.emitWarning;
83
+ process.emitWarning = (() => { });
84
+ const originalStderrWrite = process.stderr.write.bind(process.stderr);
85
+ process.stderr.write = (chunk, ...args) => {
86
+ const text = typeof chunk === "string" ? chunk : chunk.toString();
87
+ if (text.includes("ExperimentalWarning") || text.includes("--trace-warnings")) {
88
+ return true;
89
+ }
90
+ return originalStderrWrite(chunk, ...args);
91
+ };
92
+ try {
93
+ await animateStartup(version, basename(projectRoot), session.activeBookId, modelInfo);
94
+ const app = render(React.createElement(InkTuiApp, {
95
+ locale,
96
+ projectRoot,
97
+ projectName: basename(projectRoot),
98
+ modelLabel,
99
+ initialSession: session,
100
+ chatStreamBridge,
101
+ }), { exitOnCtrlC: true });
102
+ await app.waitUntilExit();
103
+ }
104
+ finally {
105
+ process.emitWarning = originalEmitWarning;
106
+ process.stderr.write = originalStderrWrite;
107
+ }
108
+ }
109
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/tui/app.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export type ChatDepth = "light" | "normal" | "deep";
2
+ export interface ChatDepthProfile {
3
+ readonly depth: ChatDepth;
4
+ readonly temperature: number;
5
+ readonly maxTokens?: number;
6
+ readonly label: string;
7
+ }
8
+ export declare function resolveChatDepthProfile(depth: ChatDepth): ChatDepthProfile;
9
+ //# sourceMappingURL=chat-depth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-depth.d.ts","sourceRoot":"","sources":["../../src/tui/chat-depth.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEpD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,SAAS,GAAG,gBAAgB,CAY1E"}
@@ -0,0 +1,14 @@
1
+ export function resolveChatDepthProfile(depth) {
2
+ switch (depth) {
3
+ case "light":
4
+ return { depth, temperature: 0.3, maxTokens: 160, label: "light" };
5
+ case "deep":
6
+ return { depth, temperature: 0.45, maxTokens: 420, label: "deep" };
7
+ case "normal":
8
+ default:
9
+ // No maxTokens — let the model decide its own output length.
10
+ // Only /depth light|deep explicitly caps tokens.
11
+ return { depth: "normal", temperature: 0.4, label: "normal" };
12
+ }
13
+ }
14
+ //# sourceMappingURL=chat-depth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-depth.js","sourceRoot":"","sources":["../../src/tui/chat-depth.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,uBAAuB,CAAC,KAAgB;IACtD,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,OAAO;YACV,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QACrE,KAAK,MAAM;YACT,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QACrE,KAAK,QAAQ,CAAC;QACd;YACE,6DAA6D;YAC7D,iDAAiD;YACjD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClE,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type InteractionSession } from "@kienmatu/inkos-core";
2
+ export declare function createOptimisticUserMessageSession(session: InteractionSession, input: string, timestamp?: number): InteractionSession;
3
+ export declare function appendStreamingAssistantChunk(session: InteractionSession, chunk: string, timestamp?: number): InteractionSession;
4
+ //# sourceMappingURL=chat-draft.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-draft.d.ts","sourceRoot":"","sources":["../../src/tui/chat-draft.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,sBAAsB,CAAC;AAE9B,wBAAgB,kCAAkC,CAChD,OAAO,EAAE,kBAAkB,EAC3B,KAAK,EAAE,MAAM,EACb,SAAS,GAAE,MAAmB,GAC7B,kBAAkB,CAMpB;AAED,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,kBAAkB,EAC3B,KAAK,EAAE,MAAM,EACb,SAAS,GAAE,MAAmB,GAC7B,kBAAkB,CAoBpB"}
@@ -0,0 +1,28 @@
1
+ import { appendInteractionMessage, } from "@kienmatu/inkos-core";
2
+ export function createOptimisticUserMessageSession(session, input, timestamp = Date.now()) {
3
+ return appendInteractionMessage(session, {
4
+ role: "user",
5
+ content: input,
6
+ timestamp,
7
+ });
8
+ }
9
+ export function appendStreamingAssistantChunk(session, chunk, timestamp = Date.now()) {
10
+ if (!chunk) {
11
+ return session;
12
+ }
13
+ const lastMessage = session.messages.at(-1);
14
+ if (lastMessage?.role === "assistant" && lastMessage.timestamp === timestamp) {
15
+ return {
16
+ ...session,
17
+ messages: session.messages.map((message, index) => index === session.messages.length - 1
18
+ ? { ...message, content: message.content + chunk }
19
+ : message),
20
+ };
21
+ }
22
+ return appendInteractionMessage(session, {
23
+ role: "assistant",
24
+ content: chunk,
25
+ timestamp,
26
+ });
27
+ }
28
+ //# sourceMappingURL=chat-draft.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-draft.js","sourceRoot":"","sources":["../../src/tui/chat-draft.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,GAEzB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,UAAU,kCAAkC,CAChD,OAA2B,EAC3B,KAAa,EACb,YAAoB,IAAI,CAAC,GAAG,EAAE;IAE9B,OAAO,wBAAwB,CAAC,OAAO,EAAE;QACvC,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,KAAK;QACd,SAAS;KACV,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,OAA2B,EAC3B,KAAa,EACb,YAAoB,IAAI,CAAC,GAAG,EAAE;IAE9B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,IAAI,WAAW,EAAE,IAAI,KAAK,WAAW,IAAI,WAAW,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QAC7E,OAAO;YACL,GAAG,OAAO;YACV,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;gBACtF,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,GAAG,KAAK,EAAE;gBAClD,CAAC,CAAC,OAAO,CAAC;SACb,CAAC;IACJ,CAAC;IAED,OAAO,wBAAwB,CAAC,OAAO,EAAE;QACvC,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,KAAK;QACd,SAAS;KACV,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,10 @@
1
+ export interface ComposerCaretState {
2
+ readonly visible: boolean;
3
+ readonly shouldAnimate: boolean;
4
+ }
5
+ export declare function resolveComposerCaretState(params: {
6
+ readonly inputValue: string;
7
+ readonly isSubmitting: boolean;
8
+ readonly blinkTick: number;
9
+ }): ComposerCaretState;
10
+ //# sourceMappingURL=composer-caret.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composer-caret.d.ts","sourceRoot":"","sources":["../../src/tui/composer-caret.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;CACjC;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE;IAChD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,GAAG,kBAAkB,CAYrB"}
@@ -0,0 +1,13 @@
1
+ export function resolveComposerCaretState(params) {
2
+ if (params.isSubmitting) {
3
+ return {
4
+ visible: false,
5
+ shouldAnimate: false,
6
+ };
7
+ }
8
+ return {
9
+ visible: true,
10
+ shouldAnimate: false,
11
+ };
12
+ }
13
+ //# sourceMappingURL=composer-caret.js.map