@actalk/inkos 1.1.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/LICENSE +661 -21
  2. package/dist/commands/interact.d.ts +25 -0
  3. package/dist/commands/interact.d.ts.map +1 -0
  4. package/dist/commands/interact.js +73 -0
  5. package/dist/commands/interact.js.map +1 -0
  6. package/dist/commands/revise.d.ts.map +1 -1
  7. package/dist/commands/revise.js +4 -1
  8. package/dist/commands/revise.js.map +1 -1
  9. package/dist/commands/studio.d.ts +5 -0
  10. package/dist/commands/studio.d.ts.map +1 -1
  11. package/dist/commands/studio.js +23 -1
  12. package/dist/commands/studio.js.map +1 -1
  13. package/dist/commands/tui.d.ts +6 -0
  14. package/dist/commands/tui.d.ts.map +1 -0
  15. package/dist/commands/tui.js +14 -0
  16. package/dist/commands/tui.js.map +1 -0
  17. package/dist/commands/write.js +65 -1
  18. package/dist/commands/write.js.map +1 -1
  19. package/dist/index.js +2 -63
  20. package/dist/index.js.map +1 -1
  21. package/dist/localization.d.ts +0 -1
  22. package/dist/localization.d.ts.map +1 -1
  23. package/dist/localization.js +0 -6
  24. package/dist/localization.js.map +1 -1
  25. package/dist/program.d.ts +10 -0
  26. package/dist/program.d.ts.map +1 -0
  27. package/dist/program.js +85 -0
  28. package/dist/program.js.map +1 -0
  29. package/dist/tui/activity-state.d.ts +10 -0
  30. package/dist/tui/activity-state.d.ts.map +1 -0
  31. package/dist/tui/activity-state.js +27 -0
  32. package/dist/tui/activity-state.js.map +1 -0
  33. package/dist/tui/ansi.d.ts +40 -0
  34. package/dist/tui/ansi.d.ts.map +1 -0
  35. package/dist/tui/ansi.js +62 -0
  36. package/dist/tui/ansi.js.map +1 -0
  37. package/dist/tui/app.d.ts +103 -0
  38. package/dist/tui/app.d.ts.map +1 -0
  39. package/dist/tui/app.js +134 -0
  40. package/dist/tui/app.js.map +1 -0
  41. package/dist/tui/chat-depth.d.ts +9 -0
  42. package/dist/tui/chat-depth.d.ts.map +1 -0
  43. package/dist/tui/chat-depth.js +12 -0
  44. package/dist/tui/chat-depth.js.map +1 -0
  45. package/dist/tui/chat-draft.d.ts +4 -0
  46. package/dist/tui/chat-draft.d.ts.map +1 -0
  47. package/dist/tui/chat-draft.js +28 -0
  48. package/dist/tui/chat-draft.js.map +1 -0
  49. package/dist/tui/composer-caret.d.ts +10 -0
  50. package/dist/tui/composer-caret.d.ts.map +1 -0
  51. package/dist/tui/composer-caret.js +13 -0
  52. package/dist/tui/composer-caret.js.map +1 -0
  53. package/dist/tui/composer-display.d.ts +7 -0
  54. package/dist/tui/composer-display.d.ts.map +1 -0
  55. package/dist/tui/composer-display.js +17 -0
  56. package/dist/tui/composer-display.js.map +1 -0
  57. package/dist/tui/dashboard-model.d.ts +45 -0
  58. package/dist/tui/dashboard-model.d.ts.map +1 -0
  59. package/dist/tui/dashboard-model.js +101 -0
  60. package/dist/tui/dashboard-model.js.map +1 -0
  61. package/dist/tui/dashboard.d.ts +38 -0
  62. package/dist/tui/dashboard.d.ts.map +1 -0
  63. package/dist/tui/dashboard.js +320 -0
  64. package/dist/tui/dashboard.js.map +1 -0
  65. package/dist/tui/effects.d.ts +61 -0
  66. package/dist/tui/effects.d.ts.map +1 -0
  67. package/dist/tui/effects.js +459 -0
  68. package/dist/tui/effects.js.map +1 -0
  69. package/dist/tui/i18n.d.ts +69 -0
  70. package/dist/tui/i18n.d.ts.map +1 -0
  71. package/dist/tui/i18n.js +239 -0
  72. package/dist/tui/i18n.js.map +1 -0
  73. package/dist/tui/input-history.d.ts +12 -0
  74. package/dist/tui/input-history.d.ts.map +1 -0
  75. package/dist/tui/input-history.js +47 -0
  76. package/dist/tui/input-history.js.map +1 -0
  77. package/dist/tui/local-commands.d.ts +5 -0
  78. package/dist/tui/local-commands.d.ts.map +1 -0
  79. package/dist/tui/local-commands.js +43 -0
  80. package/dist/tui/local-commands.js.map +1 -0
  81. package/dist/tui/output.d.ts +11 -0
  82. package/dist/tui/output.d.ts.map +1 -0
  83. package/dist/tui/output.js +24 -0
  84. package/dist/tui/output.js.map +1 -0
  85. package/dist/tui/session-store.d.ts +2 -0
  86. package/dist/tui/session-store.d.ts.map +1 -0
  87. package/dist/tui/session-store.js +2 -0
  88. package/dist/tui/session-store.js.map +1 -0
  89. package/dist/tui/setup.d.ts +49 -0
  90. package/dist/tui/setup.d.ts.map +1 -0
  91. package/dist/tui/setup.js +268 -0
  92. package/dist/tui/setup.js.map +1 -0
  93. package/dist/tui/slash-autocomplete.d.ts +6 -0
  94. package/dist/tui/slash-autocomplete.d.ts.map +1 -0
  95. package/dist/tui/slash-autocomplete.js +50 -0
  96. package/dist/tui/slash-autocomplete.js.map +1 -0
  97. package/dist/tui/theme.d.ts +11 -0
  98. package/dist/tui/theme.d.ts.map +1 -0
  99. package/dist/tui/theme.js +13 -0
  100. package/dist/tui/theme.js.map +1 -0
  101. package/dist/tui/tools.d.ts +15 -0
  102. package/dist/tui/tools.d.ts.map +1 -0
  103. package/dist/tui/tools.js +17 -0
  104. package/dist/tui/tools.js.map +1 -0
  105. package/package.json +12 -7
@@ -0,0 +1,17 @@
1
+ export function renderComposerDisplay(inputValue, placeholder, showCursor) {
2
+ if (!inputValue) {
3
+ return {
4
+ textBeforeCursor: showCursor ? "" : placeholder,
5
+ textAfterCursor: showCursor ? placeholder : "",
6
+ cursor: showCursor ? "│" : "",
7
+ isPlaceholder: true,
8
+ };
9
+ }
10
+ return {
11
+ textBeforeCursor: inputValue,
12
+ textAfterCursor: "",
13
+ cursor: showCursor ? "│" : "",
14
+ isPlaceholder: false,
15
+ };
16
+ }
17
+ //# sourceMappingURL=composer-display.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composer-display.js","sourceRoot":"","sources":["../../src/tui/composer-display.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,qBAAqB,CACnC,UAAkB,EAClB,WAAmB,EACnB,UAAmB;IAOnB,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO;YACL,gBAAgB,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW;YAC/C,eAAe,EAAE,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;YAC9C,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YAC7B,aAAa,EAAE,IAAI;SACpB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,gBAAgB,EAAE,UAAU;QAC5B,eAAe,EAAE,EAAE;QACnB,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QAC7B,aAAa,EAAE,KAAK;KACrB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,45 @@
1
+ import type { ExecutionStatus, InteractionMessage, InteractionSession } from "@actalk/inkos-core";
2
+ import { type TuiCopy } from "./i18n.js";
3
+ export interface DashboardMessageRow {
4
+ readonly key: string;
5
+ readonly label: string;
6
+ readonly role: InteractionMessage["role"];
7
+ readonly content: string;
8
+ }
9
+ export interface DashboardEventRow {
10
+ readonly key: string;
11
+ readonly status: ExecutionStatus;
12
+ readonly summary: string;
13
+ }
14
+ export interface DashboardViewModel {
15
+ readonly projectName: string;
16
+ readonly activeBookTitle?: string;
17
+ readonly modelLabel: string;
18
+ readonly modeLabel: string;
19
+ readonly executionStatus: ExecutionStatus;
20
+ readonly executionLabel: string;
21
+ readonly headerLine: string;
22
+ readonly statusPrimaryLine: string;
23
+ readonly statusSecondaryLine: string;
24
+ readonly messageRows: ReadonlyArray<DashboardMessageRow>;
25
+ readonly eventRows: ReadonlyArray<DashboardEventRow>;
26
+ readonly pendingDecisionSummary?: string;
27
+ readonly composerPlaceholder: string;
28
+ readonly composerHelper: string;
29
+ readonly composerStatus: string;
30
+ readonly errorText?: string;
31
+ }
32
+ export interface BuildDashboardViewModelParams {
33
+ readonly projectName: string;
34
+ readonly activeBookTitle?: string;
35
+ readonly modelLabel: string;
36
+ readonly depthLabel?: string;
37
+ readonly copy: TuiCopy;
38
+ readonly session: InteractionSession;
39
+ readonly isSubmitting: boolean;
40
+ readonly lastError?: string;
41
+ readonly sinceTimestamp?: number;
42
+ readonly terminalRows?: number;
43
+ }
44
+ export declare function buildDashboardViewModel(params: BuildDashboardViewModelParams): DashboardViewModel;
45
+ //# sourceMappingURL=dashboard-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-model.d.ts","sourceRoot":"","sources":["../../src/tui/dashboard-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EAEf,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAwC,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAE/E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAC1C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAC;IACzD,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;IACrD,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;IACrC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,6BAA6B,GAAG,kBAAkB,CAyEjG"}
@@ -0,0 +1,101 @@
1
+ import { formatModeLabel, normalizeStageLabel } from "./i18n.js";
2
+ export function buildDashboardViewModel(params) {
3
+ const status = params.session.currentExecution?.status ?? "idle";
4
+ const executionLabel = normalizeStageLabel(params.session.currentExecution?.stageLabel ?? status, params.copy);
5
+ const modeLabel = formatModeLabel(params.session.automationMode, params.copy);
6
+ const bookLabel = params.activeBookTitle ?? params.session.activeBookId ?? params.copy.labels.none;
7
+ const draftTitle = params.session.creationDraft?.title;
8
+ const draftQuestion = params.session.creationDraft?.nextQuestion;
9
+ const sinceTimestamp = params.sinceTimestamp ?? 0;
10
+ const terminalRows = params.terminalRows ?? process.stdout.rows ?? 24;
11
+ const conversationLimit = Math.max(4, terminalRows - 10);
12
+ const messageRows = params.session.messages
13
+ .filter((message) => message.timestamp >= sinceTimestamp)
14
+ .slice(-conversationLimit)
15
+ .map((message, index) => ({
16
+ key: `${message.timestamp}-${index}`,
17
+ label: roleLabel(message.role, params.copy),
18
+ role: message.role,
19
+ content: message.content,
20
+ }));
21
+ const eventRows = params.session.events
22
+ .filter((event) => event.timestamp >= sinceTimestamp)
23
+ .slice(-3)
24
+ .map((event, index) => ({
25
+ key: `${event.timestamp}-${index}`,
26
+ status: event.status,
27
+ summary: summarizeEvent(event, params.copy),
28
+ }));
29
+ const latestEventSummary = eventRows[eventRows.length - 1]?.summary;
30
+ return {
31
+ projectName: params.projectName,
32
+ activeBookTitle: params.activeBookTitle ?? params.session.activeBookId,
33
+ modelLabel: params.modelLabel,
34
+ modeLabel,
35
+ executionStatus: status,
36
+ executionLabel,
37
+ headerLine: [
38
+ `${params.copy.labels.project} ${params.projectName}`,
39
+ `${params.copy.labels.book} ${bookLabel}`,
40
+ draftTitle ? `${params.copy.labels.draft} ${draftTitle}` : undefined,
41
+ `${params.copy.labels.depth} ${params.depthLabel ?? params.copy.depthLabels.normal}`,
42
+ `${params.copy.labels.session} ${params.session.sessionId.slice(-4)}`,
43
+ params.copy.labels.messageCount(params.session.messages.length),
44
+ ].filter(Boolean).join(" · "),
45
+ statusPrimaryLine: `${params.copy.labels.stage} ${executionLabel} · ${params.copy.labels.mode} ${modeLabel} · ${params.copy.labels.model} ${params.modelLabel}`,
46
+ statusSecondaryLine: params.lastError
47
+ ? `${params.copy.labels.error} · ${compactInline(params.lastError)}`
48
+ : params.isSubmitting && latestEventSummary
49
+ ? `${params.copy.labels.recent} · ${latestEventSummary}`
50
+ : params.session.pendingDecision?.summary
51
+ ? `${params.copy.labels.pending} · ${compactInline(params.session.pendingDecision.summary)}`
52
+ : draftQuestion
53
+ ? `${params.copy.labels.draft} · ${compactInline(draftQuestion)}`
54
+ : draftTitle
55
+ ? `${params.copy.labels.draft} · ${draftTitle}`
56
+ : latestEventSummary
57
+ ? `${params.copy.labels.recent} · ${latestEventSummary}`
58
+ : `${params.copy.labels.ready} · ${bookLabel}`,
59
+ messageRows,
60
+ eventRows,
61
+ pendingDecisionSummary: params.session.pendingDecision?.summary,
62
+ composerPlaceholder: params.copy.composer.placeholder,
63
+ composerHelper: params.copy.composer.helper,
64
+ composerStatus: params.isSubmitting
65
+ ? params.copy.composer.submitting
66
+ : params.lastError
67
+ ? params.copy.composer.failed
68
+ : params.copy.composer.ready,
69
+ errorText: params.lastError,
70
+ };
71
+ }
72
+ function roleLabel(role, copy) {
73
+ switch (role) {
74
+ case "user":
75
+ return copy.roles.user;
76
+ case "assistant":
77
+ return copy.roles.assistant;
78
+ case "system":
79
+ return copy.roles.system;
80
+ default:
81
+ return role;
82
+ }
83
+ }
84
+ function summarizeEvent(event, copy) {
85
+ const base = compactInline(event.detail?.trim() || event.kind);
86
+ if (event.bookId && event.chapterNumber !== undefined) {
87
+ const chapterLabel = copy.locale === "zh-CN"
88
+ ? `第 ${event.chapterNumber} 章`
89
+ : `ch.${event.chapterNumber}`;
90
+ return `${base} (${event.bookId} ${chapterLabel})`;
91
+ }
92
+ if (event.bookId) {
93
+ return `${base} (${event.bookId})`;
94
+ }
95
+ return base;
96
+ }
97
+ function compactInline(value) {
98
+ const singleLine = value.replace(/\s+/g, " ").trim();
99
+ return singleLine.length > 72 ? singleLine.slice(0, 69) + "..." : singleLine;
100
+ }
101
+ //# sourceMappingURL=dashboard-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-model.js","sourceRoot":"","sources":["../../src/tui/dashboard-model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import React from "react";
2
+ import { type InteractionRuntimeTools, type InteractionSession } from "@actalk/inkos-core";
3
+ import { type TuiLocale } from "./i18n.js";
4
+ export interface InkTuiDashboardProps {
5
+ readonly locale: TuiLocale;
6
+ readonly projectName: string;
7
+ readonly activeBookTitle?: string;
8
+ readonly modelLabel: string;
9
+ readonly depthLabel?: string;
10
+ readonly session: InteractionSession;
11
+ readonly inputValue: string;
12
+ readonly isSubmitting: boolean;
13
+ readonly sinceTimestamp?: number;
14
+ readonly lastError?: string;
15
+ readonly slashSuggestions?: ReadonlyArray<string>;
16
+ readonly selectedSlashIndex?: number;
17
+ readonly showComposerCursor?: boolean;
18
+ readonly onInputChange?: (value: string) => void;
19
+ readonly onSubmit?: (value: string) => void;
20
+ }
21
+ export interface InkTuiAppProps {
22
+ readonly locale: TuiLocale;
23
+ readonly projectRoot: string;
24
+ readonly projectName: string;
25
+ readonly modelLabel: string;
26
+ readonly initialSession: InteractionSession;
27
+ readonly tools: InteractionRuntimeTools;
28
+ readonly chatStreamBridge?: {
29
+ onTextDelta?: (text: string) => void;
30
+ getChatRequestOptions?: () => {
31
+ readonly temperature?: number;
32
+ readonly maxTokens?: number;
33
+ };
34
+ };
35
+ }
36
+ export declare function InkTuiDashboard(props: InkTuiDashboardProps): React.JSX.Element;
37
+ export declare function InkTuiApp(props: InkTuiAppProps): React.JSX.Element;
38
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/tui/dashboard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAC3D,OAAO,EAKL,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EACxB,MAAM,oBAAoB,CAAC;AAU5B,OAAO,EAAoD,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAe7F,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAClD,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IACtC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,EAAE,kBAAkB,CAAC;IAC5C,QAAQ,CAAC,KAAK,EAAE,uBAAuB,CAAC;IACxC,QAAQ,CAAC,gBAAgB,CAAC,EAAE;QAC1B,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;QACrC,qBAAqB,CAAC,EAAE,MAAM;YAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;YAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;SAC7B,CAAC;KACH,CAAC;CACH;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAwG9E;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA+PlE"}
@@ -0,0 +1,320 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useState } from "react";
3
+ import { appendInteractionMessage, processProjectInteractionInput, routeNaturalLanguageIntent, } from "@actalk/inkos-core";
4
+ import { Box, Text, useApp, useInput } from "ink";
5
+ import { describeActivityState } from "./activity-state.js";
6
+ import { resolveComposerCaretState } from "./composer-caret.js";
7
+ import { resolveChatDepthProfile } from "./chat-depth.js";
8
+ import { appendStreamingAssistantChunk, createOptimisticUserMessageSession } from "./chat-draft.js";
9
+ import { renderComposerDisplay } from "./composer-display.js";
10
+ import { formatTuiResult } from "./output.js";
11
+ import { buildDashboardViewModel } from "./dashboard-model.js";
12
+ import { buildInputHistory, moveHistoryCursor } from "./input-history.js";
13
+ import { formatModeLabel, getTuiCopy, normalizeStageLabel } from "./i18n.js";
14
+ import { loadProjectSession, persistProjectSession, resolveSessionActiveBook } from "./session-store.js";
15
+ import { classifyLocalTuiCommand, parseDepthCommand } from "./local-commands.js";
16
+ import { applySlashSuggestion, getNextSlashSelection, getSlashSuggestions, SLASH_COMMANDS, } from "./slash-autocomplete.js";
17
+ import { WARM_ACCENT, WARM_BORDER, WARM_MUTED, WARM_REPLY, STATUS_SUCCESS, STATUS_ERROR, STATUS_ACTIVE, STATUS_IDLE, ROLE_USER, ROLE_SYSTEM, } from "./theme.js";
18
+ export function InkTuiDashboard(props) {
19
+ const copy = getTuiCopy(props.locale);
20
+ const model = buildDashboardViewModel({
21
+ copy,
22
+ projectName: props.projectName,
23
+ activeBookTitle: props.activeBookTitle,
24
+ modelLabel: props.modelLabel,
25
+ depthLabel: props.depthLabel,
26
+ session: props.session,
27
+ isSubmitting: props.isSubmitting,
28
+ lastError: props.lastError,
29
+ sinceTimestamp: props.sinceTimestamp,
30
+ });
31
+ const activeAccent = props.isSubmitting ? WARM_ACCENT : statusColor(model.executionStatus);
32
+ const composer = renderComposerDisplay(props.inputValue, model.composerPlaceholder, props.showComposerCursor ?? false);
33
+ const separatorWidth = Math.max(20, (process.stdout.columns ?? 60) - 8);
34
+ const thinRule = "─".repeat(separatorWidth);
35
+ return (_jsxs(Box, { flexDirection: "column", width: "100%", paddingX: 2, children: [_jsx(Text, { color: WARM_MUTED, children: model.headerLine }), _jsx(Text, { color: WARM_BORDER, children: thinRule }), _jsx(Box, { flexDirection: "column", marginTop: 1, flexGrow: 1, children: model.messageRows.length > 0 ? (model.messageRows.map((row) => _jsx(ConversationRow, { row: row }, row.key))) : (_jsx(Box, { marginY: 1, children: _jsxs(Text, { color: WARM_MUTED, italic: true, children: [" ", copy.composer.emptyConversation] }) })) }), _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { color: WARM_BORDER, children: thinRule }), _jsxs(Box, { marginTop: 1, children: [_jsx(ExecutionBadge, { status: model.executionStatus, color: activeAccent }), _jsxs(Text, { color: activeAccent, children: [" ", model.statusPrimaryLine] })] }), _jsx(Text, { color: model.errorText ? STATUS_ERROR : props.isSubmitting ? WARM_ACCENT : WARM_MUTED, children: " " + model.statusSecondaryLine }), _jsxs(Box, { marginTop: 1, flexDirection: "column", width: "100%", borderStyle: "round", borderColor: props.isSubmitting ? STATUS_ACTIVE : WARM_BORDER, paddingX: 1, children: [_jsxs(Box, { children: [_jsxs(Text, { color: props.isSubmitting ? STATUS_ACTIVE : WARM_ACCENT, bold: true, children: ["\u203A", " "] }), composer.textBeforeCursor ? (_jsx(Text, { color: composer.isPlaceholder ? WARM_MUTED : WARM_REPLY, children: composer.textBeforeCursor })) : null, composer.cursor ? (_jsx(Text, { color: props.isSubmitting ? STATUS_ACTIVE : WARM_ACCENT, children: composer.cursor })) : null, composer.textAfterCursor ? (_jsx(Text, { color: composer.isPlaceholder ? WARM_MUTED : WARM_REPLY, children: composer.textAfterCursor })) : null] }), _jsxs(Box, { children: [_jsx(Text, { color: props.isSubmitting ? STATUS_ACTIVE : WARM_MUTED, children: model.composerStatus }), _jsx(Text, { color: WARM_BORDER, children: " \u2502 " }), _jsx(Text, { color: WARM_MUTED, children: model.composerHelper })] }), props.slashSuggestions && props.slashSuggestions.length > 0 ? (_jsx(Box, { flexDirection: "column", marginTop: 1, borderTop: true, borderColor: WARM_BORDER, children: props.slashSuggestions.slice(0, 6).map((suggestion, index) => {
36
+ const isSelected = index === (props.selectedSlashIndex ?? 0);
37
+ return (_jsxs(Box, { children: [_jsx(Text, { color: isSelected ? WARM_ACCENT : WARM_BORDER, children: isSelected ? "› " : " " }), _jsx(Text, { color: isSelected ? WARM_REPLY : WARM_MUTED, bold: isSelected, children: suggestion })] }, suggestion));
38
+ }) })) : null] })] })] }));
39
+ }
40
+ export function InkTuiApp(props) {
41
+ const { exit } = useApp();
42
+ const copy = getTuiCopy(props.locale);
43
+ const [session, setSession] = useState(props.initialSession);
44
+ const [inputValue, setInputValue] = useState("");
45
+ const [isSubmitting, setIsSubmitting] = useState(false);
46
+ const [lastError, setLastError] = useState();
47
+ const [sinceTimestamp, setSinceTimestamp] = useState();
48
+ const [selectedSlashIndex, setSelectedSlashIndex] = useState(0);
49
+ const [historyState, setHistoryState] = useState({
50
+ cursor: null,
51
+ draft: "",
52
+ });
53
+ const [activityIntent, setActivityIntent] = useState("unknown");
54
+ const [activityFrameIndex, setActivityFrameIndex] = useState(0);
55
+ const [chatDepth, setChatDepth] = useState("normal");
56
+ const assistantDraftTimestampRef = useRef(null);
57
+ const submitLockRef = useRef(false);
58
+ const slashSuggestions = getSlashSuggestions(inputValue, SLASH_COMMANDS);
59
+ const inputHistory = buildInputHistory(session.messages);
60
+ const activity = describeActivityState(activityIntent, copy);
61
+ const chatDepthProfile = resolveChatDepthProfile(chatDepth);
62
+ const composerCaret = resolveComposerCaretState({
63
+ inputValue,
64
+ isSubmitting,
65
+ blinkTick: 0,
66
+ });
67
+ useEffect(() => {
68
+ if (!isSubmitting) {
69
+ setActivityFrameIndex(0);
70
+ return;
71
+ }
72
+ const timer = setInterval(() => {
73
+ setActivityFrameIndex((current) => (current + 1) % activity.frames.length);
74
+ }, activity.intervalMs);
75
+ return () => clearInterval(timer);
76
+ }, [activity.frames.length, activity.intervalMs, isSubmitting]);
77
+ if (props.chatStreamBridge) {
78
+ props.chatStreamBridge.getChatRequestOptions = () => ({
79
+ temperature: chatDepthProfile.temperature,
80
+ maxTokens: chatDepthProfile.maxTokens,
81
+ });
82
+ }
83
+ props.chatStreamBridge && (props.chatStreamBridge.onTextDelta = (text) => {
84
+ const timestamp = assistantDraftTimestampRef.current;
85
+ if (timestamp === null) {
86
+ return;
87
+ }
88
+ setSession((current) => appendStreamingAssistantChunk(current, text, timestamp));
89
+ });
90
+ useInput((_input, key) => {
91
+ if (key.escape) {
92
+ exit();
93
+ return;
94
+ }
95
+ if (slashSuggestions.length > 0 && key.tab) {
96
+ setInputValue(applySlashSuggestion(inputValue, slashSuggestions, selectedSlashIndex));
97
+ setSelectedSlashIndex(0);
98
+ return;
99
+ }
100
+ if (key.backspace || key.delete) {
101
+ setInputValue((current) => current.slice(0, -1));
102
+ setSelectedSlashIndex(0);
103
+ return;
104
+ }
105
+ if (slashSuggestions.length > 0 && key.downArrow) {
106
+ setSelectedSlashIndex((current) => getNextSlashSelection(current, slashSuggestions.length, "down"));
107
+ return;
108
+ }
109
+ if (slashSuggestions.length > 0 && key.upArrow) {
110
+ setSelectedSlashIndex((current) => getNextSlashSelection(current, slashSuggestions.length, "up"));
111
+ return;
112
+ }
113
+ if (key.downArrow) {
114
+ const next = moveHistoryCursor(inputHistory, historyState, inputValue, "down");
115
+ setHistoryState(next.state);
116
+ setInputValue(next.value);
117
+ return;
118
+ }
119
+ if (key.upArrow) {
120
+ const next = moveHistoryCursor(inputHistory, historyState, inputValue, "up");
121
+ setHistoryState(next.state);
122
+ setInputValue(next.value);
123
+ return;
124
+ }
125
+ if (key.return) {
126
+ void handleSubmit(inputValue);
127
+ return;
128
+ }
129
+ if (_input && !_input.includes("\r") && !_input.includes("\n") && !key.ctrl && !key.meta) {
130
+ setInputValue((current) => current + _input);
131
+ setSelectedSlashIndex(0);
132
+ }
133
+ });
134
+ const appendSystemNote = (content) => {
135
+ setLastError(undefined);
136
+ setSession((current) => appendInteractionMessage(current, {
137
+ role: "system",
138
+ content,
139
+ timestamp: Date.now(),
140
+ }));
141
+ };
142
+ const handleSubmit = async (rawValue) => {
143
+ const input = rawValue.trim();
144
+ if (!input || isSubmitting || submitLockRef.current) {
145
+ return;
146
+ }
147
+ submitLockRef.current = true;
148
+ try {
149
+ const localCommand = classifyLocalTuiCommand(input);
150
+ const depthCommand = parseDepthCommand(input);
151
+ if (localCommand) {
152
+ setInputValue("");
153
+ if (localCommand === "quit") {
154
+ exit();
155
+ return;
156
+ }
157
+ if (localCommand === "help") {
158
+ appendSystemNote(copy.notes.help);
159
+ return;
160
+ }
161
+ if (localCommand === "status") {
162
+ const stage = normalizeStageLabel(session.currentExecution?.stageLabel ?? session.currentExecution?.status ?? "idle", copy);
163
+ appendSystemNote(copy.notes.status(stage, formatModeLabel(session.automationMode, copy)));
164
+ return;
165
+ }
166
+ if (localCommand === "clear") {
167
+ setLastError(undefined);
168
+ setSinceTimestamp(Date.now());
169
+ return;
170
+ }
171
+ if (localCommand === "config") {
172
+ appendSystemNote(copy.notes.config);
173
+ return;
174
+ }
175
+ }
176
+ if (depthCommand) {
177
+ setInputValue("");
178
+ setChatDepth(depthCommand);
179
+ appendSystemNote(copy.notes.depthSet(copy.depthLabels[depthCommand]));
180
+ return;
181
+ }
182
+ const activeBookId = await resolveSessionActiveBook(props.projectRoot, session);
183
+ const routed = routeNaturalLanguageIntent(input, {
184
+ activeBookId,
185
+ hasCreationDraft: Boolean(session.creationDraft),
186
+ });
187
+ const userTimestamp = Date.now();
188
+ const assistantDraftTimestamp = routed.intent === "chat" ? userTimestamp + 1 : null;
189
+ assistantDraftTimestampRef.current = assistantDraftTimestamp;
190
+ setActivityIntent(routed.intent);
191
+ setIsSubmitting(true);
192
+ setLastError(undefined);
193
+ setInputValue("");
194
+ setHistoryState({ cursor: null, draft: "" });
195
+ setSession((current) => createOptimisticUserMessageSession(current, input, userTimestamp));
196
+ const result = await processProjectInteractionInput({
197
+ projectRoot: props.projectRoot,
198
+ input,
199
+ tools: props.tools,
200
+ activeBookId,
201
+ });
202
+ const summary = formatTuiResult({
203
+ intent: result.request.intent,
204
+ status: result.session.currentExecution?.status ?? "completed",
205
+ bookId: result.session.activeBookId,
206
+ mode: result.request.mode,
207
+ responseText: result.responseText,
208
+ locale: props.locale,
209
+ });
210
+ const nextSession = appendInteractionMessage(result.session, {
211
+ role: "assistant",
212
+ content: summary,
213
+ timestamp: Date.now(),
214
+ });
215
+ await persistProjectSession(props.projectRoot, nextSession);
216
+ setSession(nextSession);
217
+ }
218
+ catch (error) {
219
+ const message = error instanceof Error ? error.message : String(error);
220
+ const failedSession = await loadProjectSession(props.projectRoot);
221
+ setSession(failedSession);
222
+ setLastError(message);
223
+ }
224
+ finally {
225
+ assistantDraftTimestampRef.current = null;
226
+ setIsSubmitting(false);
227
+ setActivityIntent("unknown");
228
+ submitLockRef.current = false;
229
+ }
230
+ };
231
+ const activitySession = isSubmitting
232
+ ? {
233
+ ...session,
234
+ currentExecution: {
235
+ status: "planning",
236
+ bookId: session.activeBookId,
237
+ chapterNumber: session.activeChapterNumber,
238
+ stageLabel: `${activity.label} ${activity.frames[activityFrameIndex] ?? ""}`.trim(),
239
+ },
240
+ }
241
+ : session;
242
+ return (_jsx(InkTuiDashboard, { locale: props.locale, projectName: props.projectName, activeBookTitle: activitySession.activeBookId, modelLabel: props.modelLabel, depthLabel: copy.depthLabels[chatDepth], session: activitySession, inputValue: inputValue, isSubmitting: isSubmitting, sinceTimestamp: sinceTimestamp, lastError: lastError, slashSuggestions: slashSuggestions, selectedSlashIndex: selectedSlashIndex, showComposerCursor: composerCaret.visible, onInputChange: (value) => {
243
+ setInputValue(value);
244
+ setSelectedSlashIndex(0);
245
+ setHistoryState((current) => current.cursor === null ? current : { cursor: null, draft: value });
246
+ }, onSubmit: (value) => {
247
+ void handleSubmit(value);
248
+ } }));
249
+ }
250
+ function ConversationRow(props) {
251
+ const { role, content, label } = props.row;
252
+ if (role === "user") {
253
+ return (_jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { color: ROLE_USER, children: "\u2502 " }), _jsx(Text, { color: WARM_REPLY, children: content })] }));
254
+ }
255
+ if (role === "system") {
256
+ return (_jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { color: ROLE_SYSTEM, children: "\u00B7 " }), _jsx(Text, { color: ROLE_SYSTEM, children: content })] }));
257
+ }
258
+ // assistant
259
+ return (_jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { color: WARM_ACCENT, children: "\u25C6 " }), _jsx(Text, { color: WARM_REPLY, children: content })] }));
260
+ }
261
+ function ExecutionBadge(props) {
262
+ const icon = statusIcon(props.status);
263
+ return (_jsx(Text, { color: props.color ?? statusColor(props.status), bold: true, children: icon }));
264
+ }
265
+ function statusIcon(status) {
266
+ switch (status) {
267
+ case "completed":
268
+ return "✓";
269
+ case "failed":
270
+ return "✗";
271
+ case "blocked":
272
+ case "waiting_human":
273
+ return "◈";
274
+ case "writing":
275
+ return "✎";
276
+ case "planning":
277
+ case "composing":
278
+ return "◇";
279
+ case "repairing":
280
+ case "persisting":
281
+ return "◉";
282
+ default:
283
+ return "●";
284
+ }
285
+ }
286
+ function MutedText(props) {
287
+ return _jsx(Text, { color: WARM_MUTED, children: props.children });
288
+ }
289
+ function messageColor(role) {
290
+ switch (role) {
291
+ case "user":
292
+ return WARM_MUTED;
293
+ case "assistant":
294
+ return WARM_REPLY;
295
+ case "system":
296
+ return WARM_ACCENT;
297
+ default:
298
+ return WARM_REPLY;
299
+ }
300
+ }
301
+ function statusColor(status) {
302
+ switch (status) {
303
+ case "completed":
304
+ return STATUS_SUCCESS;
305
+ case "failed":
306
+ return STATUS_ERROR;
307
+ case "blocked":
308
+ case "waiting_human":
309
+ return WARM_ACCENT;
310
+ case "writing":
311
+ case "repairing":
312
+ case "planning":
313
+ case "composing":
314
+ case "persisting":
315
+ return STATUS_ACTIVE;
316
+ default:
317
+ return STATUS_IDLE;
318
+ }
319
+ }
320
+ //# sourceMappingURL=dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/tui/dashboard.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import { type TuiLocale } from "./i18n.js";
2
+ export interface OperationTheme {
3
+ readonly icon: string;
4
+ readonly color: string;
5
+ readonly brightColor: string;
6
+ readonly bg: string;
7
+ readonly label: string;
8
+ readonly frames: ReadonlyArray<string>;
9
+ }
10
+ export interface StyledHelpSection {
11
+ readonly title: string;
12
+ readonly commands: ReadonlyArray<readonly [string, string]>;
13
+ }
14
+ export declare const THEMES: Record<string, OperationTheme>;
15
+ export declare class ThemedSpinner {
16
+ private interval;
17
+ private frame;
18
+ private elapsed;
19
+ private theme;
20
+ constructor(themeName?: string);
21
+ start(label?: string): void;
22
+ update(label: string): void;
23
+ succeed(message?: string): void;
24
+ fail(message?: string): void;
25
+ stop(): void;
26
+ private clear;
27
+ }
28
+ export declare function inputPromptPrefix(): string;
29
+ export declare function drawInputHint(): void;
30
+ export declare function printInputSeparator(): void;
31
+ export interface StartupModelInfo {
32
+ readonly provider: string;
33
+ readonly model: string;
34
+ }
35
+ export declare function animateStartup(version: string, projectName: string, bookTitle?: string, modelInfo?: StartupModelInfo): Promise<void>;
36
+ export declare function formatResultCard(content: string, intent?: string): string;
37
+ export declare function intentToBadge(intent: string, locale?: TuiLocale): string;
38
+ export declare function intentToTheme(intent: string): string;
39
+ export declare function printStyledHelp(): void;
40
+ export declare function printStyledStatus(params: {
41
+ readonly mode: string;
42
+ readonly bookId?: string;
43
+ readonly status: string;
44
+ readonly events: ReadonlyArray<{
45
+ readonly kind: string;
46
+ readonly detail?: string;
47
+ readonly status: string;
48
+ }>;
49
+ }): void;
50
+ export declare function formatStyledStatusLines(locale: TuiLocale, params: {
51
+ readonly mode: string;
52
+ readonly bookId?: string;
53
+ readonly status: string;
54
+ readonly events: ReadonlyArray<{
55
+ readonly kind: string;
56
+ readonly detail?: string;
57
+ readonly status: string;
58
+ }>;
59
+ }): string[];
60
+ export declare function buildStyledHelpSections(locale?: TuiLocale): StyledHelpSection[];
61
+ //# sourceMappingURL=effects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effects.d.ts","sourceRoot":"","sources":["../../src/tui/effects.ts"],"names":[],"mappings":"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"}