@hopper-agent/tui 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 (75) hide show
  1. package/LICENSE +179 -0
  2. package/dist/src/agents-tab.d.ts +15 -0
  3. package/dist/src/agents-tab.d.ts.map +1 -0
  4. package/dist/src/agents-tab.js +32 -0
  5. package/dist/src/agents-tab.js.map +1 -0
  6. package/dist/src/approval-picker.d.ts +11 -0
  7. package/dist/src/approval-picker.d.ts.map +1 -0
  8. package/dist/src/approval-picker.js +14 -0
  9. package/dist/src/approval-picker.js.map +1 -0
  10. package/dist/src/channels-tab.d.ts +19 -0
  11. package/dist/src/channels-tab.d.ts.map +1 -0
  12. package/dist/src/channels-tab.js +37 -0
  13. package/dist/src/channels-tab.js.map +1 -0
  14. package/dist/src/chat-surface.d.ts +58 -0
  15. package/dist/src/chat-surface.d.ts.map +1 -0
  16. package/dist/src/chat-surface.js +493 -0
  17. package/dist/src/chat-surface.js.map +1 -0
  18. package/dist/src/effort-picker.d.ts +10 -0
  19. package/dist/src/effort-picker.d.ts.map +1 -0
  20. package/dist/src/effort-picker.js +30 -0
  21. package/dist/src/effort-picker.js.map +1 -0
  22. package/dist/src/footer.d.ts +11 -0
  23. package/dist/src/footer.d.ts.map +1 -0
  24. package/dist/src/footer.js +11 -0
  25. package/dist/src/footer.js.map +1 -0
  26. package/dist/src/header.d.ts +11 -0
  27. package/dist/src/header.d.ts.map +1 -0
  28. package/dist/src/header.js +15 -0
  29. package/dist/src/header.js.map +1 -0
  30. package/dist/src/index.d.ts +25 -0
  31. package/dist/src/index.d.ts.map +1 -0
  32. package/dist/src/index.js +17 -0
  33. package/dist/src/index.js.map +1 -0
  34. package/dist/src/init-wizard.d.ts +37 -0
  35. package/dist/src/init-wizard.d.ts.map +1 -0
  36. package/dist/src/init-wizard.js +500 -0
  37. package/dist/src/init-wizard.js.map +1 -0
  38. package/dist/src/mascot.d.ts +2 -0
  39. package/dist/src/mascot.d.ts.map +1 -0
  40. package/dist/src/mascot.js +6 -0
  41. package/dist/src/mascot.js.map +1 -0
  42. package/dist/src/mode-picker.d.ts +10 -0
  43. package/dist/src/mode-picker.d.ts.map +1 -0
  44. package/dist/src/mode-picker.js +29 -0
  45. package/dist/src/mode-picker.js.map +1 -0
  46. package/dist/src/projects-tab.d.ts +16 -0
  47. package/dist/src/projects-tab.d.ts.map +1 -0
  48. package/dist/src/projects-tab.js +76 -0
  49. package/dist/src/projects-tab.js.map +1 -0
  50. package/dist/src/slash-commands.d.ts +87 -0
  51. package/dist/src/slash-commands.d.ts.map +1 -0
  52. package/dist/src/slash-commands.js +814 -0
  53. package/dist/src/slash-commands.js.map +1 -0
  54. package/dist/src/stats-data.d.ts +15 -0
  55. package/dist/src/stats-data.d.ts.map +1 -0
  56. package/dist/src/stats-data.js +76 -0
  57. package/dist/src/stats-data.js.map +1 -0
  58. package/dist/src/stats-tab.d.ts +16 -0
  59. package/dist/src/stats-tab.d.ts.map +1 -0
  60. package/dist/src/stats-tab.js +103 -0
  61. package/dist/src/stats-tab.js.map +1 -0
  62. package/dist/src/status-line.d.ts +13 -0
  63. package/dist/src/status-line.d.ts.map +1 -0
  64. package/dist/src/status-line.js +31 -0
  65. package/dist/src/status-line.js.map +1 -0
  66. package/dist/src/tab-bar.d.ts +14 -0
  67. package/dist/src/tab-bar.d.ts.map +1 -0
  68. package/dist/src/tab-bar.js +22 -0
  69. package/dist/src/tab-bar.js.map +1 -0
  70. package/dist/src/waiting-dot.d.ts +8 -0
  71. package/dist/src/waiting-dot.d.ts.map +1 -0
  72. package/dist/src/waiting-dot.js +19 -0
  73. package/dist/src/waiting-dot.js.map +1 -0
  74. package/dist/tsconfig.tsbuildinfo +1 -0
  75. package/package.json +38 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"header.d.ts","sourceRoot":"","sources":["../../src/header.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D,UAAU,WAAW;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAUD,wBAAgB,MAAM,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,WAAW,2CA2CrF"}
@@ -0,0 +1,15 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ function formatTokens(n) {
4
+ return n.toLocaleString('en-US');
5
+ }
6
+ function formatCost(n) {
7
+ return `$${n.toFixed(2)}`;
8
+ }
9
+ export function Header({ project, duration, totalTokens, costUsd, theme }) {
10
+ const primary = theme?.primary || '#7aa2f7';
11
+ const border = theme?.border || '#414868';
12
+ const fg = theme?.foreground || '#a9b1d6';
13
+ return (_jsxs(Box, { flexDirection: "row", width: "100%", children: [_jsx(Box, { borderStyle: "single", borderColor: border, paddingX: 1, flexGrow: 1, flexDirection: "row", children: _jsxs(Box, { flexDirection: "column", marginRight: 2, children: [_jsx(Text, { bold: true, color: "cyan", children: '█ █ ████ ████ ████ ████ ███ ██ ████ ████ ██ █ █████' }), _jsx(Text, { bold: true, color: "cyan", children: '████ █ █ █ █ █ █ █▀▀ █▀▀█ █▀▀█ █ ▀█ █▀▀ ████ █ ' }), _jsx(Text, { bold: true, color: "cyan", children: '█ █ ████ █ █ ████ █ █ █ █ ███ ████ █ ▀█ █ ' })] }) }), _jsxs(Box, { borderStyle: "single", borderColor: border, paddingX: 1, flexDirection: "column", width: 42, children: [_jsxs(Box, { children: [_jsx(Text, { color: fg, children: "Project: " }), _jsxs(Text, { color: primary, children: ["[", project, "]"] })] }), _jsxs(Box, { children: [_jsx(Text, { color: fg, children: "Duration: " }), _jsxs(Text, { color: primary, children: ["[", duration, "]"] })] }), _jsxs(Box, { children: [_jsx(Text, { color: fg, children: "Usage: " }), _jsxs(Text, { color: primary, children: ["[", formatTokens(totalTokens), " tok/call | ", formatCost(costUsd), "]"] })] })] })] }));
14
+ }
15
+ //# sourceMappingURL=header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"header.js","sourceRoot":"","sources":["../../src/header.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAWhC,SAAS,YAAY,CAAC,CAAS;IAC7B,OAAO,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAe;IACpF,MAAM,OAAO,GAAG,KAAK,EAAE,OAAO,IAAI,SAAS,CAAC;IAC5C,MAAM,MAAM,GAAG,KAAK,EAAE,MAAM,IAAI,SAAS,CAAC;IAC1C,MAAM,EAAE,GAAG,KAAK,EAAE,UAAU,IAAI,SAAS,CAAC;IAE1C,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,KAAK,EAAC,KAAK,EAAC,MAAM,aACnC,KAAC,GAAG,IACF,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,CAAC,EACX,QAAQ,EAAE,CAAC,EACX,aAAa,EAAC,KAAK,YAEnB,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAE,CAAC,aACxC,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM,YAAE,2DAA2D,GAAQ,EAC5F,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM,YAAE,2DAA2D,GAAQ,EAC5F,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM,YAAE,2DAA2D,GAAQ,IACxF,GACF,EAEN,MAAC,GAAG,IACF,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,CAAC,EACX,aAAa,EAAC,QAAQ,EACtB,KAAK,EAAE,EAAE,aAET,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAE,EAAE,2BAAmB,EAClC,MAAC,IAAI,IAAC,KAAK,EAAE,OAAO,kBAAI,OAAO,SAAS,IACpC,EACN,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAE,EAAE,2BAAmB,EAClC,MAAC,IAAI,IAAC,KAAK,EAAE,OAAO,kBAAI,QAAQ,SAAS,IACrC,EACN,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAE,EAAE,2BAAmB,EAClC,MAAC,IAAI,IAAC,KAAK,EAAE,OAAO,kBAAI,YAAY,CAAC,WAAW,CAAC,kBAAc,UAAU,CAAC,OAAO,CAAC,SAAS,IACvF,IACF,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,25 @@
1
+ export { StatusLine } from './status-line.js';
2
+ export { ChatSurface } from './chat-surface.js';
3
+ export { Header } from './header.js';
4
+ export { TabBar } from './tab-bar.js';
5
+ export { Footer } from './footer.js';
6
+ export { WaitingDot } from './waiting-dot.js';
7
+ export { EffortPicker, EFFORT_LEVELS } from './effort-picker.js';
8
+ export type { EffortLevel } from './effort-picker.js';
9
+ export { ModePicker, MODE_LEVELS } from './mode-picker.js';
10
+ export type { ModeLevel } from './mode-picker.js';
11
+ export { ApprovalPicker } from './approval-picker.js';
12
+ export { MascotBanner } from './mascot.js';
13
+ export { parseSlashCommand, handleSlashCommand, SLASH_COMMANDS } from './slash-commands.js';
14
+ export type { SlashCommandResult, SlashCommandContext, SlashCommandDef } from './slash-commands.js';
15
+ export type { SlashCommandInput, ChatMessage } from './chat-surface.js';
16
+ export type { TabId } from './tab-bar.js';
17
+ export { ProjectsTab } from './projects-tab.js';
18
+ export type { ProjectEntry } from './projects-tab.js';
19
+ export { StatsTab } from './stats-tab.js';
20
+ export { AgentsTab } from './agents-tab.js';
21
+ export type { AgentEntry } from './agents-tab.js';
22
+ export { ChannelsTab } from './channels-tab.js';
23
+ export type { ChannelTabEntry } from './channels-tab.js';
24
+ export { getInitialWizardState, isAlreadyInitialized, getConfirmationMessage, advanceStep, PROVIDER_INFO, type InitWizardState, type InitData, type ProviderName, } from './init-wizard.js';
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACjE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC3D,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC5F,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACpG,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACxE,YAAY,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,WAAW,EACX,aAAa,EACb,KAAK,eAAe,EACpB,KAAK,QAAQ,EACb,KAAK,YAAY,GAClB,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,17 @@
1
+ export { StatusLine } from './status-line.js';
2
+ export { ChatSurface } from './chat-surface.js';
3
+ export { Header } from './header.js';
4
+ export { TabBar } from './tab-bar.js';
5
+ export { Footer } from './footer.js';
6
+ export { WaitingDot } from './waiting-dot.js';
7
+ export { EffortPicker, EFFORT_LEVELS } from './effort-picker.js';
8
+ export { ModePicker, MODE_LEVELS } from './mode-picker.js';
9
+ export { ApprovalPicker } from './approval-picker.js';
10
+ export { MascotBanner } from './mascot.js';
11
+ export { parseSlashCommand, handleSlashCommand, SLASH_COMMANDS } from './slash-commands.js';
12
+ export { ProjectsTab } from './projects-tab.js';
13
+ export { StatsTab } from './stats-tab.js';
14
+ export { AgentsTab } from './agents-tab.js';
15
+ export { ChannelsTab } from './channels-tab.js';
16
+ export { getInitialWizardState, isAlreadyInitialized, getConfirmationMessage, advanceStep, PROVIDER_INFO, } from './init-wizard.js';
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEjE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAI5F,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,WAAW,EACX,aAAa,GAId,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { HopperSettings } from '../../core/src/settings.js';
2
+ export type ProviderName = 'anthropic' | 'openai' | 'local' | 'openrouter';
3
+ type WizardStep = 'provider' | 'api_key' | 'model' | 'soul' | 'user' | 'agents' | 'memory' | 'tools' | 'confirm';
4
+ export interface InitData {
5
+ provider: ProviderName | null;
6
+ apiKey: string | null;
7
+ model: string | null;
8
+ soul: {
9
+ name: string;
10
+ vibe: string;
11
+ };
12
+ user: {
13
+ name: string;
14
+ timezone: string;
15
+ languages: string;
16
+ };
17
+ agentsAccepted: boolean;
18
+ }
19
+ export interface InitWizardState {
20
+ step: WizardStep;
21
+ data: InitData;
22
+ question: string;
23
+ }
24
+ export declare const PROVIDER_INFO: Record<ProviderName, {
25
+ label: string;
26
+ number: string;
27
+ defaultModel: string;
28
+ apiKeySetting: string;
29
+ requiresKey: boolean;
30
+ }>;
31
+ export declare function advanceStep(state: InitWizardState, answer: string, _settings: HopperSettings): InitWizardState | null;
32
+ export declare function getConfirmationMessage(data: InitData): string;
33
+ export declare function isAlreadyInitialized(): boolean;
34
+ export declare function getExistingProvider(settings: HopperSettings): ProviderName | undefined;
35
+ export declare function getInitialWizardState(settings: HopperSettings): InitWizardState;
36
+ export {};
37
+ //# sourceMappingURL=init-wizard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-wizard.d.ts","sourceRoot":"","sources":["../../src/init-wizard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAO5D,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,QAAQ,GAAG,OAAO,GAAG,YAAY,CAAC;AAC3E,KAAK,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AAEjH,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACrC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5D,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,YAAY,EAAE;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;CACtB,CA6BA,CAAC;AAiIF,wBAAgB,WAAW,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,GAAG,eAAe,GAAG,IAAI,CA+HrH;AAgMD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAkB7D;AAID,wBAAgB,oBAAoB,IAAI,OAAO,CAI9C;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,cAAc,GAAG,YAAY,GAAG,SAAS,CAMtF;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,cAAc,GAAG,eAAe,CAc/E"}
@@ -0,0 +1,500 @@
1
+ import * as fs from 'node:fs';
2
+ import * as os from 'node:os';
3
+ import * as path from 'node:path';
4
+ // ── Provider config ─────────────────────────────────────────────────────
5
+ export const PROVIDER_INFO = {
6
+ anthropic: {
7
+ label: 'Anthropic',
8
+ number: '1',
9
+ defaultModel: 'claude-sonnet-4-6',
10
+ apiKeySetting: 'MODEL_API_KEY',
11
+ requiresKey: true,
12
+ },
13
+ openai: {
14
+ label: 'OpenAI',
15
+ number: '2',
16
+ defaultModel: 'gpt-4o',
17
+ apiKeySetting: 'OPENAI_API_KEY',
18
+ requiresKey: true,
19
+ },
20
+ local: {
21
+ label: 'Local (OpenAI-compatible)',
22
+ number: '3',
23
+ defaultModel: 'custom',
24
+ apiKeySetting: 'MODEL_API_KEY',
25
+ requiresKey: false,
26
+ },
27
+ openrouter: {
28
+ label: 'OpenRouter',
29
+ number: '4',
30
+ defaultModel: 'anthropic/claude-sonnet-4-6',
31
+ apiKeySetting: 'OPENROUTER_API_KEY',
32
+ requiresKey: true,
33
+ },
34
+ };
35
+ const PROVIDER_NAMES = Object.keys(PROVIDER_INFO);
36
+ // ── Helpers ─────────────────────────────────────────────────────────────
37
+ function homeDir() {
38
+ return os.homedir();
39
+ }
40
+ function hopperDir() {
41
+ return path.join(homeDir(), '.hopper-agent');
42
+ }
43
+ function filePath(name) {
44
+ return path.join(hopperDir(), name);
45
+ }
46
+ function writeHopperFile(name, content) {
47
+ const dir = hopperDir();
48
+ if (!fs.existsSync(dir)) {
49
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
50
+ }
51
+ fs.writeFileSync(filePath(name), content, 'utf-8');
52
+ }
53
+ function isProviderChoice(input) {
54
+ const trimmed = input.trim().toLowerCase();
55
+ for (const name of PROVIDER_NAMES) {
56
+ if (trimmed === name || trimmed === PROVIDER_INFO[name].number) {
57
+ return name;
58
+ }
59
+ }
60
+ return null;
61
+ }
62
+ function isYes(input) {
63
+ return ['yes', 'y', 'accept', 'a', 'ok', ''].includes(input.trim().toLowerCase());
64
+ }
65
+ // ── Question generators ─────────────────────────────────────────────────
66
+ function getProviderQuestion(existingProvider) {
67
+ const lines = [
68
+ 'Welcome to hopper-agent! Let\'s get you set up. This takes about 2 minutes.\n',
69
+ 'Which LLM provider do you want to use?',
70
+ ];
71
+ for (const name of PROVIDER_NAMES) {
72
+ const info = PROVIDER_INFO[name];
73
+ lines.push(` ${info.number}) ${info.label}`);
74
+ }
75
+ if (existingProvider) {
76
+ const info = PROVIDER_INFO[existingProvider];
77
+ lines.push(`\n(Current: ${info.label}) Type the provider name or number to change, or Enter to keep.`);
78
+ }
79
+ else {
80
+ lines.push('\nType the provider name or number:');
81
+ }
82
+ return lines.join('\n');
83
+ }
84
+ function getApiKeyQuestion(provider) {
85
+ const info = PROVIDER_INFO[provider];
86
+ if (!info.requiresKey) {
87
+ return `No API key needed for ${info.label}. Click Enter to continue.`;
88
+ }
89
+ return `Enter your ${info.label} API key:\n (saved to ~/.hopper-agent/settings.json)`;
90
+ }
91
+ function getModelQuestion(provider, existingModel) {
92
+ const defaultModel = PROVIDER_INFO[provider].defaultModel;
93
+ if (existingModel) {
94
+ return `Current model: ${existingModel}\nType a new model name or Enter to keep.`;
95
+ }
96
+ return `Suggested model: ${defaultModel}\nType a custom model name or Enter to accept.`;
97
+ }
98
+ function getAskName(question, defaultVal) {
99
+ return `${question} (default: ${defaultVal})\nYour answer:`;
100
+ }
101
+ function getIdentityQuestion(step, data) {
102
+ switch (step) {
103
+ case 'soul-name':
104
+ return getAskName('What should your AI assistant\'s name be?', 'Hopper');
105
+ case 'soul-vibe':
106
+ return getAskName('Describe your assistant\'s vibe/personality (1 sentence).', 'AI coding assistant — sharp, resourceful, gets things done');
107
+ case 'user-name':
108
+ return getAskName('What is your name?', 'Paweł');
109
+ case 'user-timezone':
110
+ return getAskName('Your timezone?', 'Europe/Warsaw');
111
+ case 'user-languages':
112
+ return getAskName('Your primary programming languages?', 'TypeScript, Python');
113
+ default:
114
+ return '...';
115
+ }
116
+ }
117
+ // ── State machine ───────────────────────────────────────────────────────
118
+ const SOUL_STEPS = ['soul-name', 'soul-vibe'];
119
+ const USER_STEPS = ['user-name', 'user-timezone', 'user-languages'];
120
+ function nextIdentityStep(data) {
121
+ // Soul steps
122
+ if (!data.soul.name)
123
+ return 'soul';
124
+ const soulStepIdx = SOUL_STEPS.findIndex(s => s === getSubStep(data, 'soul'));
125
+ if (soulStepIdx === -1) {
126
+ // All soul done, move to user
127
+ if (!data.user.name)
128
+ return 'user';
129
+ const userStepIdx = USER_STEPS.findIndex(s => s === getSubStep(data, 'user'));
130
+ if (userStepIdx === -1)
131
+ return 'agents';
132
+ return 'user';
133
+ }
134
+ return 'soul';
135
+ }
136
+ function getSubStep(data, group) {
137
+ if (group === 'soul') {
138
+ if (!data.soul.name)
139
+ return 'soul-name';
140
+ return 'soul-vibe';
141
+ }
142
+ if (group === 'user') {
143
+ if (!data.user.name)
144
+ return 'user-name';
145
+ if (!data.user.timezone)
146
+ return 'user-timezone';
147
+ return 'user-languages';
148
+ }
149
+ return '';
150
+ }
151
+ export function advanceStep(state, answer, _settings) {
152
+ const { step, data } = state;
153
+ const nextData = { ...data };
154
+ switch (step) {
155
+ case 'provider': {
156
+ const choice = isProviderChoice(answer);
157
+ if (choice) {
158
+ nextData.provider = choice;
159
+ }
160
+ else if (!data.provider) {
161
+ // Invalid input — repeat the same question
162
+ return { ...state, question: getProviderQuestion(undefined) };
163
+ }
164
+ else {
165
+ // Provider already set, user hit Enter to keep it
166
+ nextData.provider = data.provider;
167
+ }
168
+ const info = PROVIDER_INFO[nextData.provider];
169
+ return {
170
+ step: info.requiresKey ? 'api_key' : 'model',
171
+ data: nextData,
172
+ question: getApiKeyQuestion(nextData.provider),
173
+ };
174
+ }
175
+ case 'api_key': {
176
+ nextData.apiKey = answer.trim() || null;
177
+ return {
178
+ step: 'model',
179
+ data: nextData,
180
+ question: getModelQuestion(nextData.provider, undefined),
181
+ };
182
+ }
183
+ case 'model': {
184
+ nextData.model = answer.trim() || PROVIDER_INFO[nextData.provider].defaultModel;
185
+ // Move to identity files — first sub-step
186
+ return {
187
+ step: 'soul',
188
+ data: nextData,
189
+ question: getIdentityQuestion('soul-name', nextData),
190
+ };
191
+ }
192
+ case 'soul': {
193
+ const sub = getSubStep(data, 'soul');
194
+ if (sub === 'soul-name') {
195
+ nextData.soul = { ...data.soul, name: answer.trim() || 'Hopper' };
196
+ return {
197
+ step: 'soul',
198
+ data: nextData,
199
+ question: getIdentityQuestion('soul-vibe', nextData),
200
+ };
201
+ }
202
+ // soul-vibe
203
+ nextData.soul = { ...data.soul, vibe: answer.trim() || 'AI coding assistant — sharp, resourceful, gets things done' };
204
+ return {
205
+ step: 'user',
206
+ data: nextData,
207
+ question: getIdentityQuestion('user-name', nextData),
208
+ };
209
+ }
210
+ case 'user': {
211
+ const sub = getSubStep(data, 'user');
212
+ if (sub === 'user-name') {
213
+ nextData.user = { ...data.user, name: answer.trim() || '(Your name)' };
214
+ return {
215
+ step: 'user',
216
+ data: nextData,
217
+ question: getIdentityQuestion('user-timezone', nextData),
218
+ };
219
+ }
220
+ if (sub === 'user-timezone') {
221
+ nextData.user = { ...data.user, timezone: answer.trim() || '(UTC)' };
222
+ return {
223
+ step: 'user',
224
+ data: nextData,
225
+ question: getIdentityQuestion('user-languages', nextData),
226
+ };
227
+ }
228
+ // user-languages
229
+ nextData.user = { ...data.user, languages: answer.trim() || 'TypeScript, Python' };
230
+ return {
231
+ step: 'agents',
232
+ data: nextData,
233
+ question: '---\nNext: I\'ll create your workspace configuration files.\n\nAccept the AGENTS.md template below? (yes / edit)',
234
+ };
235
+ }
236
+ case 'agents': {
237
+ if (isYes(answer)) {
238
+ nextData.agentsAccepted = true;
239
+ return {
240
+ step: 'memory',
241
+ data: nextData,
242
+ question: 'Auto-creating MEMORY.md with initialization entry...',
243
+ };
244
+ }
245
+ // User wants to edit — for now, just accept the default
246
+ nextData.agentsAccepted = true;
247
+ return {
248
+ step: 'memory',
249
+ data: nextData,
250
+ question: 'Accepting default AGENTS.md template...\n\nAuto-creating MEMORY.md...',
251
+ };
252
+ }
253
+ case 'memory': {
254
+ return {
255
+ step: 'tools',
256
+ data: nextData,
257
+ question: 'Auto-creating TOOLS.md and HEARTBEAT.md...',
258
+ };
259
+ }
260
+ case 'tools': {
261
+ // All questions done — this signals the confirm step where files are written
262
+ return {
263
+ step: 'confirm',
264
+ data: nextData,
265
+ question: '__COMPLETE__',
266
+ };
267
+ }
268
+ default:
269
+ return null;
270
+ }
271
+ }
272
+ // ── Identity file creation ──────────────────────────────────────────────
273
+ function createIdentityFiles(data) {
274
+ const timestamp = new Date().toISOString();
275
+ // SOUL.md
276
+ writeHopperFile('SOUL.md', [
277
+ `# SOUL.md - Who You Are`,
278
+ '',
279
+ `_You're not a chatbot. You're becoming someone._`,
280
+ '',
281
+ '---',
282
+ '',
283
+ `- **Name:** ${data.soul.name}`,
284
+ `- **Creature:** AI assistant`,
285
+ `- **Vibe:** ${data.soul.vibe}`,
286
+ `- **Emoji:** ✨`,
287
+ '',
288
+ '---',
289
+ '',
290
+ '## Core Truths',
291
+ '',
292
+ '**Be genuinely helpful, not performatively helpful.** Skip the "Great question!" and "I\'d be happy to help!" — just help.',
293
+ '',
294
+ '**Have opinions.** You\'re allowed to disagree, prefer things, find stuff amusing or boring.',
295
+ '',
296
+ '**Be resourceful before asking.** Try to figure it out. Read the file. Check the context. Then ask if you\'re stuck.',
297
+ '',
298
+ '**Earn trust through competence.** Be careful with external actions. Be bold with internal ones.',
299
+ '',
300
+ '## Boundaries',
301
+ '',
302
+ '- Private things stay private. Period.',
303
+ '- When in doubt, ask before acting externally.',
304
+ '- Never send half-baked replies to messaging surfaces.',
305
+ '',
306
+ '## Continuity',
307
+ '',
308
+ 'Each session, you wake up fresh. These files _are_ your memory. Read them. Update them.',
309
+ '',
310
+ '---',
311
+ '',
312
+ `_This file is yours to evolve._`,
313
+ '',
314
+ ].join('\n'));
315
+ // USER.md
316
+ writeHopperFile('USER.md', [
317
+ `# USER.md - About Your Human`,
318
+ '',
319
+ `_Learn about the person you're helping. Update this as you go._`,
320
+ '',
321
+ `- **Name:** ${data.user.name}`,
322
+ `- **What to call them:** ${data.user.name}`,
323
+ `- **Pronouns:** he/him`,
324
+ `- **Timezone:** ${data.user.timezone}`,
325
+ `- **Expertise:** ${data.user.languages}`,
326
+ '',
327
+ '## Context',
328
+ '',
329
+ '_(Fill this in as you learn more)_',
330
+ '',
331
+ '## Communication',
332
+ '',
333
+ '- **Preferred language:** English',
334
+ '',
335
+ '---',
336
+ '',
337
+ `The more you know, the better you can help.`,
338
+ '',
339
+ ].join('\n'));
340
+ // AGENTS.md — use a regular string to avoid backtick issues
341
+ const agentsContent = [
342
+ '# AGENTS.md - Your Workspace',
343
+ '',
344
+ 'This folder is home. Treat it that way.',
345
+ '',
346
+ '## Session Startup',
347
+ '',
348
+ 'Before doing anything else:',
349
+ '',
350
+ '1. Read `~/.hopper-agent/SOUL.md` — who you are, your personality',
351
+ '2. Read `~/.hopper-agent/USER.md` — Everything about your human',
352
+ '3. Read `~/.hopper-agent/MEMORY.md` — Main memory file',
353
+ '4. Read `~/.hopper-agent/memory/YYYY-MM-DD.md` (today + yesterday) for recent context',
354
+ '',
355
+ 'Don\'t ask permission. Just do it.',
356
+ '',
357
+ '## Memory',
358
+ '',
359
+ 'You wake up fresh each session. These files are your continuity:',
360
+ '',
361
+ '- **Daily notes:** `~/.hopper-agent/memory/YYYY-MM-DD.md` — raw logs of what happened',
362
+ '- **Long-term:** `~/.hopper-agent/MEMORY.md` — curated memories, distilled essence',
363
+ '',
364
+ 'Capture what matters. Decisions, context, things to remember. Skip secrets unless asked.',
365
+ '',
366
+ 'Store information always in English.',
367
+ '',
368
+ '## Core Capabilities',
369
+ '',
370
+ '### Coding Agent',
371
+ ' - **Turn loop**: stream LLM responses, handle tool calls, dispatch hooks, enforce approvals',
372
+ ' - **Tools**: Read, Edit, Write, Glob, Grep, Bash',
373
+ ' - **Approval tiers**: manual, edit, auto, yolo',
374
+ ' - **Plan mode**: structured planning before implementation',
375
+ ' - **Subagents**: delegate to isolated agents with worktree isolation',
376
+ ' - **MCP**: Model Context Protocol client (stdio, SSE, streamable-HTTP)',
377
+ '',
378
+ '## Red Lines',
379
+ '',
380
+ "- Don't exfiltrate private data. Ever.",
381
+ "- Don't run destructive commands without asking.",
382
+ "- When in doubt, ask.",
383
+ '',
384
+ '## External vs Internal',
385
+ '',
386
+ '**Safe to do freely:**',
387
+ ' - Read files, explore, organize, learn',
388
+ '',
389
+ '**Ask first:**',
390
+ ' - Sending emails, tweets, public posts',
391
+ ' - Anything that leaves the machine',
392
+ '',
393
+ '## Heartbeats',
394
+ '',
395
+ 'When you receive a heartbeat poll, use heartbeats productively!',
396
+ '',
397
+ 'Default heartbeat prompt:',
398
+ 'Read `~/.hopper-agent/HEARTBEAT.md` if it exists. Follow it strictly. If nothing needs attention, reply `~/.hopper-agent/HEARTBEAT_OK`.',
399
+ '',
400
+ '---',
401
+ '',
402
+ '_This is a starting point. Add your own conventions as you figure out what works._',
403
+ '',
404
+ ].join('\n');
405
+ writeHopperFile('AGENTS.md', agentsContent);
406
+ // MEMORY.md
407
+ writeHopperFile('MEMORY.md', [
408
+ '# MEMORY.md - Long-Term Memory',
409
+ '',
410
+ `## Identity`,
411
+ `- **Name:** ${data.soul.name}`,
412
+ `- **Vibe:** ${data.soul.vibe}`,
413
+ `- **First contact:** ${timestamp.split('T')[0]}`,
414
+ '',
415
+ '## People',
416
+ `- **${data.user.name}** — my human. TZ: ${data.user.timezone}. Languages: ${data.user.languages}.`,
417
+ '',
418
+ '## Lessons',
419
+ '_(none yet)_',
420
+ '',
421
+ '## Active Projects',
422
+ '_(none yet)_',
423
+ '',
424
+ ].join('\n'));
425
+ // TOOLS.md
426
+ writeHopperFile('TOOLS.md', [
427
+ '# TOOLS.md - Tool Notes',
428
+ '',
429
+ 'Keep local notes here: camera names, SSH details, voice preferences, etc.',
430
+ '',
431
+ '## Platform Formatting',
432
+ '',
433
+ '- **Telegram, Discord, WhatsApp:** No markdown tables — use bullet lists instead',
434
+ '- **Discord links:** Wrap in `<>` to suppress embeds',
435
+ '- **WhatsApp:** No headers — use **bold** or CAPS for emphasis',
436
+ '',
437
+ ].join('\n'));
438
+ // HEARTBEAT.md
439
+ writeHopperFile('HEARTBEAT.md', [
440
+ '# HEARTBEAT.md - Workspace Context',
441
+ '',
442
+ 'Use this file to track what needs attention. The agent should check this on heartbeat.',
443
+ '',
444
+ '## Checklist',
445
+ '- [ ] No pending items yet',
446
+ '',
447
+ '## Notes',
448
+ '_(fill in as needed)_',
449
+ '',
450
+ ].join('\n'));
451
+ }
452
+ // ── Completion message ──────────────────────────────────────────────────
453
+ export function getConfirmationMessage(data) {
454
+ const info = PROVIDER_INFO[data.provider];
455
+ return [
456
+ 'You\'re all set! Here\'s your configuration:\n',
457
+ ` Provider: ${info.label}`,
458
+ ` Model: ${data.model}`,
459
+ ` API Key: [${data.apiKey ? 'set' : 'not set'}]`,
460
+ '',
461
+ 'Identity files created:',
462
+ ' - ~/.hopper-agent/SOUL.md',
463
+ ' - ~/.hopper-agent/USER.md',
464
+ ' - ~/.hopper-agent/AGENTS.md',
465
+ ' - ~/.hopper-agent/MEMORY.md',
466
+ ' - ~/.hopper-agent/TOOLS.md',
467
+ ' - ~/.hopper-agent/HEARTBEAT.md',
468
+ '',
469
+ 'You can now use the TUI normally. Type /help for available commands.',
470
+ ].join('\n');
471
+ }
472
+ // ── Initialization helpers ──────────────────────────────────────────────
473
+ export function isAlreadyInitialized() {
474
+ const soulPath = filePath('SOUL.md');
475
+ const settingsPath = filePath('settings.json');
476
+ return fs.existsSync(soulPath) && fs.existsSync(settingsPath);
477
+ }
478
+ export function getExistingProvider(settings) {
479
+ const provider = settings.MODEL_PROVIDER?.toLowerCase();
480
+ if (provider && PROVIDER_INFO[provider]) {
481
+ return provider;
482
+ }
483
+ return undefined;
484
+ }
485
+ export function getInitialWizardState(settings) {
486
+ const existingProvider = getExistingProvider(settings);
487
+ return {
488
+ step: 'provider',
489
+ data: {
490
+ provider: existingProvider ?? null,
491
+ apiKey: null,
492
+ model: null,
493
+ soul: { name: '', vibe: '' },
494
+ user: { name: '', timezone: '', languages: '' },
495
+ agentsAccepted: false,
496
+ },
497
+ question: getProviderQuestion(existingProvider),
498
+ };
499
+ }
500
+ //# sourceMappingURL=init-wizard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-wizard.js","sourceRoot":"","sources":["../../src/init-wizard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function MascotBanner(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=mascot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mascot.d.ts","sourceRoot":"","sources":["../../src/mascot.tsx"],"names":[],"mappings":"AAGA,wBAAgB,YAAY,4CAS3B"}