@abdasis/agentdeck 2.44.2

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 (196) hide show
  1. package/README.md +122 -0
  2. package/agent/dist/config.d.ts +31 -0
  3. package/agent/dist/config.d.ts.map +1 -0
  4. package/agent/dist/config.js +81 -0
  5. package/agent/dist/config.js.map +1 -0
  6. package/agent/dist/db/commands.d.ts +25 -0
  7. package/agent/dist/db/commands.d.ts.map +1 -0
  8. package/agent/dist/db/commands.js +93 -0
  9. package/agent/dist/db/commands.js.map +1 -0
  10. package/agent/dist/db/index.d.ts +30 -0
  11. package/agent/dist/db/index.d.ts.map +1 -0
  12. package/agent/dist/db/index.js +368 -0
  13. package/agent/dist/db/index.js.map +1 -0
  14. package/agent/dist/db/schema.d.ts +74 -0
  15. package/agent/dist/db/schema.d.ts.map +1 -0
  16. package/agent/dist/db/schema.js +100 -0
  17. package/agent/dist/db/schema.js.map +1 -0
  18. package/agent/dist/db/sessions.d.ts +46 -0
  19. package/agent/dist/db/sessions.d.ts.map +1 -0
  20. package/agent/dist/db/sessions.js +198 -0
  21. package/agent/dist/db/sessions.js.map +1 -0
  22. package/agent/dist/index.d.ts +2 -0
  23. package/agent/dist/index.d.ts.map +1 -0
  24. package/agent/dist/index.js +19 -0
  25. package/agent/dist/index.js.map +1 -0
  26. package/agent/dist/lib/command-session.d.ts +20 -0
  27. package/agent/dist/lib/command-session.d.ts.map +1 -0
  28. package/agent/dist/lib/command-session.js +64 -0
  29. package/agent/dist/lib/command-session.js.map +1 -0
  30. package/agent/dist/lib/git.d.ts +8 -0
  31. package/agent/dist/lib/git.d.ts.map +1 -0
  32. package/agent/dist/lib/git.js +194 -0
  33. package/agent/dist/lib/git.js.map +1 -0
  34. package/agent/dist/lib/init-script.d.ts +33 -0
  35. package/agent/dist/lib/init-script.d.ts.map +1 -0
  36. package/agent/dist/lib/init-script.js +523 -0
  37. package/agent/dist/lib/init-script.js.map +1 -0
  38. package/agent/dist/lib/transcript.d.ts +16 -0
  39. package/agent/dist/lib/transcript.d.ts.map +1 -0
  40. package/agent/dist/lib/transcript.js +64 -0
  41. package/agent/dist/lib/transcript.js.map +1 -0
  42. package/agent/dist/logger.d.ts +12 -0
  43. package/agent/dist/logger.d.ts.map +1 -0
  44. package/agent/dist/logger.js +39 -0
  45. package/agent/dist/logger.js.map +1 -0
  46. package/agent/dist/middleware/auth.d.ts +15 -0
  47. package/agent/dist/middleware/auth.d.ts.map +1 -0
  48. package/agent/dist/middleware/auth.js +55 -0
  49. package/agent/dist/middleware/auth.js.map +1 -0
  50. package/agent/dist/routes/commands.d.ts +8 -0
  51. package/agent/dist/routes/commands.d.ts.map +1 -0
  52. package/agent/dist/routes/commands.js +229 -0
  53. package/agent/dist/routes/commands.js.map +1 -0
  54. package/agent/dist/routes/files.d.ts +7 -0
  55. package/agent/dist/routes/files.d.ts.map +1 -0
  56. package/agent/dist/routes/files.js +206 -0
  57. package/agent/dist/routes/files.js.map +1 -0
  58. package/agent/dist/routes/hooks.d.ts +7 -0
  59. package/agent/dist/routes/hooks.d.ts.map +1 -0
  60. package/agent/dist/routes/hooks.js +147 -0
  61. package/agent/dist/routes/hooks.js.map +1 -0
  62. package/agent/dist/routes/index.d.ts +10 -0
  63. package/agent/dist/routes/index.d.ts.map +1 -0
  64. package/agent/dist/routes/index.js +10 -0
  65. package/agent/dist/routes/index.js.map +1 -0
  66. package/agent/dist/routes/pair.d.ts +26 -0
  67. package/agent/dist/routes/pair.d.ts.map +1 -0
  68. package/agent/dist/routes/pair.js +384 -0
  69. package/agent/dist/routes/pair.js.map +1 -0
  70. package/agent/dist/routes/projects.d.ts +6 -0
  71. package/agent/dist/routes/projects.d.ts.map +1 -0
  72. package/agent/dist/routes/projects.js +121 -0
  73. package/agent/dist/routes/projects.js.map +1 -0
  74. package/agent/dist/routes/sessions-git.d.ts +7 -0
  75. package/agent/dist/routes/sessions-git.d.ts.map +1 -0
  76. package/agent/dist/routes/sessions-git.js +31 -0
  77. package/agent/dist/routes/sessions-git.js.map +1 -0
  78. package/agent/dist/routes/sessions-tmux.d.ts +7 -0
  79. package/agent/dist/routes/sessions-tmux.d.ts.map +1 -0
  80. package/agent/dist/routes/sessions-tmux.js +94 -0
  81. package/agent/dist/routes/sessions-tmux.js.map +1 -0
  82. package/agent/dist/routes/sessions.d.ts +7 -0
  83. package/agent/dist/routes/sessions.d.ts.map +1 -0
  84. package/agent/dist/routes/sessions.js +172 -0
  85. package/agent/dist/routes/sessions.js.map +1 -0
  86. package/agent/dist/server.d.ts +6 -0
  87. package/agent/dist/server.d.ts.map +1 -0
  88. package/agent/dist/server.js +95 -0
  89. package/agent/dist/server.js.map +1 -0
  90. package/agent/dist/terminal.d.ts +19 -0
  91. package/agent/dist/terminal.d.ts.map +1 -0
  92. package/agent/dist/terminal.js +175 -0
  93. package/agent/dist/terminal.js.map +1 -0
  94. package/agent/dist/updater.d.ts +18 -0
  95. package/agent/dist/updater.d.ts.map +1 -0
  96. package/agent/dist/updater.js +122 -0
  97. package/agent/dist/updater.js.map +1 -0
  98. package/agent/dist/version.d.ts +20 -0
  99. package/agent/dist/version.d.ts.map +1 -0
  100. package/agent/dist/version.js +66 -0
  101. package/agent/dist/version.js.map +1 -0
  102. package/agent/dist/websocket-handlers.d.ts +38 -0
  103. package/agent/dist/websocket-handlers.d.ts.map +1 -0
  104. package/agent/dist/websocket-handlers.js +389 -0
  105. package/agent/dist/websocket-handlers.js.map +1 -0
  106. package/agent/node_modules/@agentdeck/shared/dist/index.d.ts +2 -0
  107. package/agent/node_modules/@agentdeck/shared/dist/index.d.ts.map +1 -0
  108. package/agent/node_modules/@agentdeck/shared/dist/index.js +2 -0
  109. package/agent/node_modules/@agentdeck/shared/dist/index.js.map +1 -0
  110. package/agent/node_modules/@agentdeck/shared/dist/types/index.d.ts +235 -0
  111. package/agent/node_modules/@agentdeck/shared/dist/types/index.d.ts.map +1 -0
  112. package/agent/node_modules/@agentdeck/shared/dist/types/index.js +5 -0
  113. package/agent/node_modules/@agentdeck/shared/dist/types/index.js.map +1 -0
  114. package/agent/node_modules/@agentdeck/shared/package.json +29 -0
  115. package/dist/commands/doctor.d.ts +3 -0
  116. package/dist/commands/doctor.d.ts.map +1 -0
  117. package/dist/commands/doctor.js +304 -0
  118. package/dist/commands/doctor.js.map +1 -0
  119. package/dist/commands/hooks.d.ts +3 -0
  120. package/dist/commands/hooks.d.ts.map +1 -0
  121. package/dist/commands/hooks.js +187 -0
  122. package/dist/commands/hooks.js.map +1 -0
  123. package/dist/commands/init.d.ts +3 -0
  124. package/dist/commands/init.d.ts.map +1 -0
  125. package/dist/commands/init.js +109 -0
  126. package/dist/commands/init.js.map +1 -0
  127. package/dist/commands/logs.d.ts +3 -0
  128. package/dist/commands/logs.d.ts.map +1 -0
  129. package/dist/commands/logs.js +38 -0
  130. package/dist/commands/logs.js.map +1 -0
  131. package/dist/commands/profile.d.ts +3 -0
  132. package/dist/commands/profile.d.ts.map +1 -0
  133. package/dist/commands/profile.js +156 -0
  134. package/dist/commands/profile.js.map +1 -0
  135. package/dist/commands/service.d.ts +3 -0
  136. package/dist/commands/service.d.ts.map +1 -0
  137. package/dist/commands/service.js +235 -0
  138. package/dist/commands/service.js.map +1 -0
  139. package/dist/commands/start.d.ts +3 -0
  140. package/dist/commands/start.d.ts.map +1 -0
  141. package/dist/commands/start.js +122 -0
  142. package/dist/commands/start.js.map +1 -0
  143. package/dist/commands/status.d.ts +3 -0
  144. package/dist/commands/status.d.ts.map +1 -0
  145. package/dist/commands/status.js +48 -0
  146. package/dist/commands/status.js.map +1 -0
  147. package/dist/commands/stop.d.ts +3 -0
  148. package/dist/commands/stop.d.ts.map +1 -0
  149. package/dist/commands/stop.js +23 -0
  150. package/dist/commands/stop.js.map +1 -0
  151. package/dist/commands/update.d.ts +3 -0
  152. package/dist/commands/update.d.ts.map +1 -0
  153. package/dist/commands/update.js +129 -0
  154. package/dist/commands/update.js.map +1 -0
  155. package/dist/commands/version.d.ts +3 -0
  156. package/dist/commands/version.d.ts.map +1 -0
  157. package/dist/commands/version.js +39 -0
  158. package/dist/commands/version.js.map +1 -0
  159. package/dist/index.d.ts +5 -0
  160. package/dist/index.d.ts.map +1 -0
  161. package/dist/index.js +45 -0
  162. package/dist/index.js.map +1 -0
  163. package/dist/lib/config.d.ts +68 -0
  164. package/dist/lib/config.d.ts.map +1 -0
  165. package/dist/lib/config.js +156 -0
  166. package/dist/lib/config.js.map +1 -0
  167. package/dist/lib/hooks.d.ts +67 -0
  168. package/dist/lib/hooks.d.ts.map +1 -0
  169. package/dist/lib/hooks.js +353 -0
  170. package/dist/lib/hooks.js.map +1 -0
  171. package/dist/lib/paths.d.ts +36 -0
  172. package/dist/lib/paths.d.ts.map +1 -0
  173. package/dist/lib/paths.js +77 -0
  174. package/dist/lib/paths.js.map +1 -0
  175. package/dist/lib/prerequisites.d.ts +60 -0
  176. package/dist/lib/prerequisites.d.ts.map +1 -0
  177. package/dist/lib/prerequisites.js +266 -0
  178. package/dist/lib/prerequisites.js.map +1 -0
  179. package/dist/lib/process.d.ts +40 -0
  180. package/dist/lib/process.d.ts.map +1 -0
  181. package/dist/lib/process.js +192 -0
  182. package/dist/lib/process.js.map +1 -0
  183. package/dist/service/index.d.ts +44 -0
  184. package/dist/service/index.d.ts.map +1 -0
  185. package/dist/service/index.js +18 -0
  186. package/dist/service/index.js.map +1 -0
  187. package/dist/service/launchd.d.ts +18 -0
  188. package/dist/service/launchd.d.ts.map +1 -0
  189. package/dist/service/launchd.js +208 -0
  190. package/dist/service/launchd.js.map +1 -0
  191. package/dist/service/systemd.d.ts +18 -0
  192. package/dist/service/systemd.d.ts.map +1 -0
  193. package/dist/service/systemd.js +196 -0
  194. package/dist/service/systemd.js.map +1 -0
  195. package/hooks/notify-agentdeck.sh +53 -0
  196. package/package.json +83 -0
@@ -0,0 +1,523 @@
1
+ import * as fs from 'fs';
2
+ import * as os from 'os';
3
+ import * as path from 'path';
4
+ import { execSync } from 'child_process';
5
+ /**
6
+ * Detects the user's default shell from environment or /etc/passwd.
7
+ * Falls back to bash if detection fails.
8
+ */
9
+ export function detectUserShell() {
10
+ // First try environment variable
11
+ const envShell = process.env.SHELL || '';
12
+ if (envShell.includes('zsh'))
13
+ return 'zsh';
14
+ if (envShell.includes('bash'))
15
+ return 'bash';
16
+ // If SHELL is not set (e.g., running as a service), read from /etc/passwd
17
+ try {
18
+ const user = process.env.USER || process.env.LOGNAME || os.userInfo().username;
19
+ const result = execSync(`getent passwd ${user} | cut -d: -f7`, {
20
+ encoding: 'utf-8',
21
+ timeout: 1000,
22
+ }).trim();
23
+ if (result.includes('zsh'))
24
+ return 'zsh';
25
+ }
26
+ catch {
27
+ // Ignore errors, fall back to bash
28
+ }
29
+ return 'bash';
30
+ }
31
+ /**
32
+ * Generates a bash/zsh init script for tmux session initialization.
33
+ * Features: adaptive prompt, tmux status bar, useful aliases, welcome message.
34
+ */
35
+ export function generateInitScript(options) {
36
+ const { sessionName, projectName, customEnvVars = {}, shell = 'bash', targetShell = detectUserShell(), } = options;
37
+ const escapedSession = escapeForBash(sessionName);
38
+ const escapedProject = escapeForBash(projectName);
39
+ // Build custom env var exports
40
+ const customExports = [];
41
+ for (const [key, value] of Object.entries(customEnvVars)) {
42
+ if (value && value.trim() !== '') {
43
+ customExports.push(`export ${key}="${escapeForBash(value)}"`);
44
+ }
45
+ }
46
+ // Colors matching xterm theme (256-color codes)
47
+ const colors = {
48
+ orange: '208', // #f97316 - accent
49
+ green: '114', // #4ade80
50
+ cyan: '80', // #22d3ee
51
+ muted: '245', // #52525b
52
+ magenta: '141', // #c084fc - git branch
53
+ red: '203', // #f87171 - error
54
+ white: '255', // #e4e4e7
55
+ };
56
+ // tmux status bar config
57
+ const tmuxStatusConfig = `
58
+ # tmux status bar - minimal with project info
59
+ tmux set-option -t "${escapedSession}" status on 2>/dev/null
60
+ tmux set-option -t "${escapedSession}" status-position bottom 2>/dev/null
61
+ tmux set-option -t "${escapedSession}" status-interval 10 2>/dev/null
62
+ tmux set-option -t "${escapedSession}" status-style "bg=#1a1a2e,fg=#e4e4e7" 2>/dev/null
63
+ tmux set-option -t "${escapedSession}" status-left "#[fg=#f97316,bold] AgentDeck #[fg=#52525b]|#[fg=#e4e4e7] ${escapedProject} " 2>/dev/null
64
+ tmux set-option -t "${escapedSession}" status-left-length 40 2>/dev/null
65
+ tmux set-option -t "${escapedSession}" status-right "#[fg=#52525b]|#[fg=#4ade80] %H:%M " 2>/dev/null
66
+ tmux set-option -t "${escapedSession}" status-right-length 20 2>/dev/null`;
67
+ // Prompt configuration - adapts to terminal width
68
+ // Note: $ doesn't need escaping in JS template literals except before {
69
+ const bashPromptConfig = `
70
+ # Adaptive prompt - compact on mobile, full on desktop
71
+ _agentdeck_prompt_command() {
72
+ local exit_code=$?
73
+ local cols=$(tput cols 2>/dev/null || echo 80)
74
+
75
+ # Exit code indicator (red X if failed)
76
+ local exit_ind=""
77
+ if [ $exit_code -ne 0 ]; then
78
+ exit_ind="\\[\\e[38;5;${colors.red}m\\]x \\[\\e[0m\\]"
79
+ fi
80
+
81
+ # Git branch (if in git repo)
82
+ local git_branch=""
83
+ if command -v git &>/dev/null; then
84
+ git_branch=$(git symbolic-ref --short HEAD 2>/dev/null)
85
+ if [ -n "$git_branch" ]; then
86
+ git_branch=" \\[\\e[38;5;${colors.magenta}m\\]($git_branch)\\[\\e[0m\\]"
87
+ fi
88
+ fi
89
+
90
+ # Short path (last 2 components)
91
+ local short_path="\${PWD##*/}"
92
+ local parent="\${PWD%/*}"
93
+ parent="\${parent##*/}"
94
+ if [ "$parent" != "" ] && [ "$parent" != "$short_path" ]; then
95
+ short_path="$parent/$short_path"
96
+ fi
97
+
98
+ # Mobile (<60 cols): ultra-compact
99
+ # Desktop: full info with git branch
100
+ if [ "$cols" -lt 60 ]; then
101
+ PS1="\${exit_ind}\\[\\e[38;5;${colors.orange}m\\]$short_path\\[\\e[0m\\] \\[\\e[38;5;${colors.orange}m\\]>\\[\\e[0m\\] "
102
+ else
103
+ PS1="\${exit_ind}\\[\\e[38;5;${colors.muted}m\\][\\[\\e[38;5;${colors.green}m\\]$short_path\\[\\e[0m\\]\${git_branch}\\[\\e[38;5;${colors.muted}m\\]]\\[\\e[0m\\] \\[\\e[38;5;${colors.orange}m\\]>\\[\\e[0m\\] "
104
+ fi
105
+ }
106
+
107
+ PROMPT_COMMAND="_agentdeck_prompt_command"`;
108
+ const zshPromptConfig = `
109
+ # Adaptive prompt - compact on mobile, full on desktop
110
+ setopt PROMPT_SUBST
111
+
112
+ _agentdeck_precmd() {
113
+ local exit_code=$?
114
+ local cols=$COLUMNS
115
+
116
+ # Exit indicator
117
+ local exit_ind=""
118
+ if [[ $exit_code -ne 0 ]]; then
119
+ exit_ind="%F{${colors.red}}x %f"
120
+ fi
121
+
122
+ # Git branch
123
+ local git_branch=""
124
+ if command -v git &>/dev/null; then
125
+ git_branch=$(git symbolic-ref --short HEAD 2>/dev/null)
126
+ [[ -n "$git_branch" ]] && git_branch=" %F{${colors.magenta}}($git_branch)%f"
127
+ fi
128
+
129
+ # Mobile vs Desktop
130
+ if (( cols < 60 )); then
131
+ PROMPT="\${exit_ind}%F{${colors.orange}}%1~%f %F{${colors.orange}}>%f "
132
+ else
133
+ PROMPT="\${exit_ind}%F{${colors.muted}}[%F{${colors.green}}%2~%f\${git_branch}%F{${colors.muted}}]%f %F{${colors.orange}}>%f "
134
+ fi
135
+ }
136
+
137
+ precmd_functions+=(_agentdeck_precmd)`;
138
+ const historyConfig = shell === 'zsh'
139
+ ? `
140
+ # History configuration (zsh)
141
+ HISTSIZE=50000
142
+ SAVEHIST=100000
143
+ setopt HIST_IGNORE_DUPS
144
+ setopt HIST_IGNORE_SPACE
145
+ setopt SHARE_HISTORY
146
+ setopt EXTENDED_HISTORY`
147
+ : `
148
+ # History configuration (bash)
149
+ export HISTSIZE=50000
150
+ export HISTFILESIZE=100000
151
+ export HISTCONTROL=ignoreboth:erasedups
152
+ export HISTIGNORE="ls:cd:pwd:exit:clear:history"
153
+ shopt -s histappend`;
154
+ const aliases = `
155
+ # AgentDeck Aliases
156
+ alias c='claude'
157
+ alias cc='claude --continue'
158
+ alias cr='claude --resume'
159
+
160
+ # Git shortcuts
161
+ alias gs='git status'
162
+ alias gd='git diff'
163
+ alias gl='git log --oneline -15'
164
+ alias gco='git checkout'
165
+
166
+ # Navigation & dev
167
+ alias ll='ls -lah'
168
+ alias ..='cd ..'
169
+ alias ...='cd ../..'`;
170
+ // Animated robot boot loader with starfield
171
+ // Skip animation in CI/test environments for faster startup
172
+ const loaderAnimation = `
173
+ # ═══════════════════════════════════════════════════════════════
174
+ # Animated Loader: Robot AI boot sequence with starfield
175
+ # ═══════════════════════════════════════════════════════════════
176
+
177
+ # ANSI color codes
178
+ C_RESET=$'\\033[0m'
179
+ C_ORANGE=$'\\033[38;5;${colors.orange}m'
180
+ C_GREEN=$'\\033[38;5;${colors.green}m'
181
+ C_CYAN=$'\\033[38;5;${colors.cyan}m'
182
+ C_MUTED=$'\\033[38;5;${colors.muted}m'
183
+ C_WHITE=$'\\033[38;5;${colors.white}m'
184
+ C_MAGENTA=$'\\033[38;5;${colors.magenta}m'
185
+ C_BOLD=$'\\033[1m'
186
+ C_DIM=$'\\033[2m'
187
+
188
+ # Skip animation in CI/test environments (set by terminal.ts)
189
+ if [ -n "$_agentdeck_SKIP_ANIMATION" ]; then
190
+ : # No output, go straight to welcome message
191
+ else
192
+
193
+ # Hide cursor during animation
194
+ printf "\\033[?25l"
195
+ clear
196
+
197
+ # Terminal dimensions
198
+ COLS=$(tput cols 2>/dev/null || echo 80)
199
+ ROWS=$(tput lines 2>/dev/null || echo 24)
200
+
201
+ # ─────────────────────────────────────────────────────────────
202
+ # MOBILE FALLBACK: Simplified animation for narrow terminals
203
+ # ─────────────────────────────────────────────────────────────
204
+ if [ "$COLS" -lt 60 ]; then
205
+ # Simple centered animation for mobile
206
+ cx=$((COLS / 2 - 5))
207
+
208
+ printf "\\n\\n"
209
+ printf "%*s\\033[38;5;${colors.orange}m\\033[1mAgentDeck\\033[0m\\n" "$cx" ""
210
+ printf "\\n"
211
+ printf "%*s\\033[38;5;${colors.muted}m┌───┐\\033[0m\\n" "$((cx-1))" ""
212
+ printf "%*s\\033[38;5;${colors.muted}m│\\033[38;5;${colors.cyan}m- -\\033[38;5;${colors.muted}m│\\033[0m\\n" "$((cx-1))" ""
213
+ printf "%*s\\033[38;5;${colors.muted}m└───┘\\033[0m\\n" "$((cx-1))" ""
214
+ sleep 0.3
215
+
216
+ # Wake up
217
+ printf "\\033[5;$((cx-1))H\\033[38;5;${colors.white}m┌───┐\\033[0m"
218
+ printf "\\033[6;$((cx-1))H\\033[38;5;${colors.white}m│\\033[38;5;${colors.cyan}m◕ ◕\\033[38;5;${colors.white}m│\\033[0m"
219
+ printf "\\033[7;$((cx-1))H\\033[38;5;${colors.white}m└───┘\\033[0m"
220
+ sleep 0.4
221
+
222
+ # Progress - simple version for mobile
223
+ for p in 25 50 75 100; do
224
+ filled=$((p / 10))
225
+ empty=$((10 - filled))
226
+ printf "\\033[9;$((cx-5))H\\033[K"
227
+ printf "\\033[38;5;${colors.orange}m"
228
+ j=0; while [ $j -lt $filled ]; do printf "█"; j=$((j+1)); done
229
+ printf "\\033[38;5;${colors.muted}m"
230
+ j=0; while [ $j -lt $empty ]; do printf "░"; j=$((j+1)); done
231
+ printf "\\033[0m %d%%" "$p"
232
+ sleep 0.2
233
+ done
234
+
235
+ sleep 0.3
236
+ printf "\\033[?25h"
237
+ clear
238
+ else
239
+
240
+ # ─────────────────────────────────────────────────────────────
241
+ # STARFIELD: Twinkling stars background
242
+ # ─────────────────────────────────────────────────────────────
243
+ declare -a STAR_X STAR_Y STAR_CHAR
244
+ STAR_CHARS=("." "·" "+" "*" "✦" "✧")
245
+ NUM_STARS=25
246
+
247
+ init_stars() {
248
+ for i in $(seq 0 $((NUM_STARS - 1))); do
249
+ STAR_X[$i]=$((RANDOM % (COLS - 2) + 1))
250
+ STAR_Y[$i]=$((RANDOM % (ROWS - 6) + 1))
251
+ STAR_CHAR[$i]=\${STAR_CHARS[$((RANDOM % \${#STAR_CHARS[@]}))]}
252
+ done
253
+ }
254
+
255
+ draw_stars() {
256
+ local frame=$1
257
+ for i in $(seq 0 $((NUM_STARS - 1))); do
258
+ local x=\${STAR_X[$i]}
259
+ local y=\${STAR_Y[$i]}
260
+ local char_idx=$(( (frame + i) % \${#STAR_CHARS[@]} ))
261
+ local char=\${STAR_CHARS[$char_idx]}
262
+ # Twinkle effect: some stars dim/bright
263
+ if [ $(( (frame + i) % 3 )) -eq 0 ]; then
264
+ printf "\\033[\${y};\${x}H\\033[38;5;${colors.muted}m$char\\033[0m"
265
+ else
266
+ printf "\\033[\${y};\${x}H\\033[38;5;${colors.white}m$char\\033[0m"
267
+ fi
268
+ done
269
+ }
270
+
271
+ # ─────────────────────────────────────────────────────────────
272
+ # ROBOT: Cute AI robot with expressions
273
+ # ─────────────────────────────────────────────────────────────
274
+ draw_robot() {
275
+ local state=$1 # boot, think, happy
276
+ local cx=$((COLS / 2 - 4))
277
+ local cy=8
278
+
279
+ # Clear robot area
280
+ for row in $(seq $cy $((cy + 5))); do
281
+ printf "\\033[$row;$((cx-2))H "
282
+ done
283
+
284
+ case $state in
285
+ boot)
286
+ printf "\\033[$cy;\${cx}H\\033[38;5;${colors.muted}m ┌───┐\\033[0m"
287
+ printf "\\033[$((cy+1));\${cx}H\\033[38;5;${colors.muted}m │\\033[38;5;${colors.cyan}m- -\\033[38;5;${colors.muted}m│\\033[0m"
288
+ printf "\\033[$((cy+2));\${cx}H\\033[38;5;${colors.muted}m │ \\033[38;5;${colors.white}m▽\\033[38;5;${colors.muted}m │\\033[0m"
289
+ printf "\\033[$((cy+3));\${cx}H\\033[38;5;${colors.muted}m └─┬─┘\\033[0m"
290
+ printf "\\033[$((cy+4));\${cx}H\\033[38;5;${colors.muted}m /|\\\\\\033[0m"
291
+ ;;
292
+ think)
293
+ printf "\\033[$cy;\${cx}H\\033[38;5;${colors.white}m ┌───┐\\033[0m"
294
+ printf "\\033[$((cy+1));\${cx}H\\033[38;5;${colors.white}m │\\033[38;5;${colors.cyan}m◔ ◔\\033[38;5;${colors.white}m│\\033[0m"
295
+ printf "\\033[$((cy+2));\${cx}H\\033[38;5;${colors.white}m │ \\033[38;5;${colors.orange}m○\\033[38;5;${colors.white}m │\\033[0m"
296
+ printf "\\033[$((cy+3));\${cx}H\\033[38;5;${colors.white}m └─┬─┘\\033[0m"
297
+ printf "\\033[$((cy+4));\${cx}H\\033[38;5;${colors.white}m /|\\\\\\033[0m"
298
+ # Thinking sparkle
299
+ printf "\\033[$((cy-1));$((cx+8))H\\033[38;5;${colors.magenta}m✦\\033[0m"
300
+ ;;
301
+ happy)
302
+ printf "\\033[$cy;\${cx}H\\033[38;5;${colors.white}m ┌───┐\\033[0m"
303
+ printf "\\033[$((cy+1));\${cx}H\\033[38;5;${colors.white}m │\\033[38;5;${colors.cyan}m◕ ◕\\033[38;5;${colors.white}m│\\033[0m"
304
+ printf "\\033[$((cy+2));\${cx}H\\033[38;5;${colors.white}m │ \\033[38;5;${colors.green}m◡\\033[38;5;${colors.white}m │\\033[0m"
305
+ printf "\\033[$((cy+3));\${cx}H\\033[38;5;${colors.white}m └─┬─┘\\033[0m"
306
+ printf "\\033[$((cy+4));\${cx}H\\033[38;5;${colors.white}m \\\\|/\\033[0m"
307
+ # Happy sparkles
308
+ printf "\\033[$((cy-1));$((cx-1))H\\033[38;5;${colors.orange}m✧\\033[0m"
309
+ printf "\\033[$cy;$((cx+9))H\\033[38;5;${colors.green}m✦\\033[0m"
310
+ printf "\\033[$((cy+2));$((cx-2))H\\033[38;5;${colors.cyan}m·\\033[0m"
311
+ ;;
312
+ esac
313
+ }
314
+
315
+ # ─────────────────────────────────────────────────────────────
316
+ # LOGO: AgentDeck with scan effect
317
+ # ─────────────────────────────────────────────────────────────
318
+ draw_logo() {
319
+ local scan_pos=$1
320
+ local text="AgentDeck"
321
+ local len=\${#text}
322
+ local lx=$((COLS / 2 - len / 2))
323
+ local ly=3
324
+
325
+ printf "\\033[$ly;\${lx}H"
326
+ local i=0
327
+ while [ $i -lt $len ]; do
328
+ local ch="\${text:$i:1}"
329
+ if [ "$scan_pos" -ge 0 ] && [ "$((i % 6))" -eq "$((scan_pos % 6))" ]; then
330
+ printf "\\033[38;5;${colors.white}m\\033[1m%s\\033[0m" "$ch"
331
+ else
332
+ printf "\\033[38;5;${colors.orange}m%s\\033[0m" "$ch"
333
+ fi
334
+ i=$((i+1))
335
+ done
336
+ }
337
+
338
+ # ─────────────────────────────────────────────────────────────
339
+ # PROGRESS BAR: Animated with gradient
340
+ # ─────────────────────────────────────────────────────────────
341
+ show_progress() {
342
+ local steps=("⚡ Booting up..." "🔧 Loading config..." "🌐 Connecting..." "✨ Ready!")
343
+ local total=\${#steps[@]}
344
+ local bar_width=30
345
+ local bx=$((COLS / 2 - bar_width / 2 - 3))
346
+ local by=16
347
+
348
+ for i in "\${!steps[@]}"; do
349
+ local step=\${steps[$i]}
350
+ local progress=$(( (i + 1) * 100 / total ))
351
+ local filled=$(( progress * bar_width / 100 ))
352
+ local empty=$(( bar_width - filled ))
353
+
354
+ # Draw starfield frame
355
+ draw_stars $i
356
+
357
+ # Progress bar with rounded corners
358
+ printf "\\033[$by;\${bx}H\\033[K"
359
+ printf "\\033[38;5;${colors.muted}m╭\\033[0m"
360
+ printf "\\033[38;5;${colors.orange}m%*s\\033[0m" "$filled" "" | tr ' ' '█'
361
+ printf "\\033[38;5;${colors.muted}m%*s\\033[0m" "$empty" "" | tr ' ' '░'
362
+ printf "\\033[38;5;${colors.muted}m╮\\033[0m"
363
+ printf " \\033[38;5;${colors.cyan}m%3d%%\\033[0m" "$progress"
364
+
365
+ # Status message
366
+ printf "\\033[$((by + 1));\${bx}H\\033[K"
367
+ printf "\\033[38;5;${colors.muted}m $step\\033[0m"
368
+
369
+ sleep 0.35
370
+ done
371
+ }
372
+
373
+ # ─────────────────────────────────────────────────────────────
374
+ # MAIN ANIMATION SEQUENCE (~3s)
375
+ # ─────────────────────────────────────────────────────────────
376
+ init_stars
377
+
378
+ # Phase 1: Starfield appears (0.2s)
379
+ for f in $(seq 0 2); do
380
+ draw_stars $f
381
+ sleep 0.07
382
+ done
383
+
384
+ # Phase 2: Logo with scan effect (0.6s)
385
+ for scan in $(seq 0 5); do
386
+ draw_logo $((scan % 6))
387
+ draw_stars $scan
388
+ sleep 0.1
389
+ done
390
+ draw_logo -1 # Final state (no highlight)
391
+
392
+ # Phase 3: Robot boot sequence (0.8s)
393
+ draw_robot "boot"
394
+ sleep 0.25
395
+ draw_stars 7
396
+ draw_robot "think"
397
+ sleep 0.35
398
+ draw_stars 8
399
+
400
+ # Phase 4: Progress bar (1.0s)
401
+ show_progress
402
+
403
+ # Phase 5: Robot happy (0.4s)
404
+ draw_robot "happy"
405
+ for f in $(seq 9 12); do
406
+ draw_stars $f
407
+ sleep 0.08
408
+ done
409
+
410
+ # Show cursor
411
+ printf "\\033[?25h"
412
+ sleep 0.3
413
+ clear
414
+
415
+ fi # End of desktop/mobile conditional
416
+
417
+ fi # End of animation conditional`;
418
+ const welcomeMessage = `
419
+ ${loaderAnimation}
420
+
421
+ # Welcome message
422
+ printf "\\n"
423
+ printf " \${C_MUTED}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\${C_RESET}\\n"
424
+ printf " \${C_ORANGE}\${C_BOLD}AgentDeck\${C_RESET} \${C_MUTED}│\${C_RESET} \${C_GREEN}${escapedProject}\${C_RESET}\\n"
425
+ printf " \${C_MUTED}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\${C_RESET}\\n"
426
+ printf " \${C_MUTED}Session:\${C_RESET} \${C_CYAN}${escapedSession}\${C_RESET}\\n"
427
+ printf " \${C_MUTED}Tips: \${C_RESET} \${C_DIM}Type\${C_RESET} \${C_ORANGE}claude\${C_RESET} \${C_DIM}to start Claude Code\${C_RESET}\\n"
428
+ printf " \${C_MUTED}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\${C_RESET}\\n"
429
+ printf "\\n"`;
430
+ const promptConfig = shell === 'zsh' ? zshPromptConfig : bashPromptConfig;
431
+ return `#!/bin/bash
432
+ # AgentDeck Terminal Init Script - Auto-generated
433
+ # Session: ${sessionName}
434
+ # Project: ${projectName}
435
+ # Init Shell: ${shell} (for script content)
436
+ # Target Shell: ${targetShell} (interactive session)
437
+ # Generated: ${new Date().toISOString()}
438
+
439
+ # ═══════════════════════════════════════════════════════════════
440
+ # SECTION 1: Environment Variables
441
+ # ═══════════════════════════════════════════════════════════════
442
+ export AGENTDECK_SESSION="${escapedSession}"
443
+ export CLAUDE_TMUX_SESSION="${escapedSession}"
444
+ export CODEX_TMUX_SESSION="${escapedSession}"
445
+ export CLAUDE_PROJECT="${escapedProject}"
446
+ export TERM="xterm-256color"
447
+ export COLORTERM="truecolor"
448
+ export LANG="\${LANG:-en_US.UTF-8}"
449
+ export LC_ALL="\${LC_ALL:-en_US.UTF-8}"
450
+ ${customExports.length > 0 ? customExports.join('\n') : ''}
451
+
452
+ # ═══════════════════════════════════════════════════════════════
453
+ # SECTION 2: tmux Configuration
454
+ # ═══════════════════════════════════════════════════════════════
455
+ tmux set-option -t "${escapedSession}" history-limit 50000 2>/dev/null
456
+ tmux set-option -t "${escapedSession}" mouse on 2>/dev/null
457
+ tmux set-option -t "${escapedSession}" focus-events on 2>/dev/null
458
+ ${tmuxStatusConfig}
459
+
460
+ # ═══════════════════════════════════════════════════════════════
461
+ # SECTION 3: History Configuration
462
+ # ═══════════════════════════════════════════════════════════════
463
+ ${historyConfig}
464
+
465
+ # ═══════════════════════════════════════════════════════════════
466
+ # SECTION 4: Prompt Configuration
467
+ # ═══════════════════════════════════════════════════════════════
468
+ ${promptConfig}
469
+
470
+ # ═══════════════════════════════════════════════════════════════
471
+ # SECTION 5: Useful Aliases
472
+ # ═══════════════════════════════════════════════════════════════
473
+ ${aliases}
474
+
475
+ # ═══════════════════════════════════════════════════════════════
476
+ # SECTION 6: Welcome Message
477
+ # ═══════════════════════════════════════════════════════════════
478
+ ${welcomeMessage}
479
+
480
+ # ═══════════════════════════════════════════════════════════════
481
+ # SECTION 7: Start Session
482
+ # ═══════════════════════════════════════════════════════════════
483
+ exec ${targetShell} -i
484
+ `;
485
+ }
486
+ /**
487
+ * Escapes a string for safe use in bash double-quoted strings.
488
+ */
489
+ function escapeForBash(value) {
490
+ return value
491
+ .replace(/\\/g, '\\\\')
492
+ .replace(/"/g, '\\"')
493
+ .replace(/\$/g, '\\$')
494
+ .replace(/`/g, '\\`');
495
+ }
496
+ /**
497
+ * Writes the init script to a temporary file.
498
+ * @returns The path to the created script file.
499
+ */
500
+ export function writeInitScript(sessionName, content) {
501
+ const scriptPath = path.join(os.tmpdir(), `agentdeck-init-${sessionName}.sh`);
502
+ fs.writeFileSync(scriptPath, content, { mode: 0o755 });
503
+ return scriptPath;
504
+ }
505
+ /**
506
+ * Removes the init script file.
507
+ */
508
+ export function cleanupInitScript(sessionName) {
509
+ const scriptPath = path.join(os.tmpdir(), `agentdeck-init-${sessionName}.sh`);
510
+ try {
511
+ fs.unlinkSync(scriptPath);
512
+ }
513
+ catch {
514
+ // Ignore errors (file might already be deleted)
515
+ }
516
+ }
517
+ /**
518
+ * Gets the path where an init script would be written.
519
+ */
520
+ export function getInitScriptPath(sessionName) {
521
+ return path.join(os.tmpdir(), `agentdeck-init-${sessionName}.sh`);
522
+ }
523
+ //# sourceMappingURL=init-script.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-script.js","sourceRoot":"","sources":["../../src/lib/init-script.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { SessionTokenUsage } from '@agentdeck/shared';
2
+ export interface TranscriptUsage {
3
+ usage: SessionTokenUsage;
4
+ model?: string;
5
+ costUsd?: number;
6
+ }
7
+ /**
8
+ * Parse transcript JSONL Claude Code dan jumlahkan token usage dari setiap
9
+ * assistant message. Ambil model dari message terakhir dan total costUSD jika
10
+ * ada. Defensive: baris rusak/non-JSON dilewati, field hilang dianggap 0.
11
+ *
12
+ * Claude Code menulis usage per assistant turn (input sudah termasuk cache
13
+ * untuk turn tersebut), jadi penjumlahan across turns = total token diproses.
14
+ */
15
+ export declare function parseTranscriptUsage(transcriptPath: string): Promise<TranscriptUsage | null>;
16
+ //# sourceMappingURL=transcript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript.d.ts","sourceRoot":"","sources":["../../src/lib/transcript.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,iBAAiB,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAoBD;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAqDjC"}
@@ -0,0 +1,64 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { existsSync } from 'node:fs';
3
+ /**
4
+ * Parse transcript JSONL Claude Code dan jumlahkan token usage dari setiap
5
+ * assistant message. Ambil model dari message terakhir dan total costUSD jika
6
+ * ada. Defensive: baris rusak/non-JSON dilewati, field hilang dianggap 0.
7
+ *
8
+ * Claude Code menulis usage per assistant turn (input sudah termasuk cache
9
+ * untuk turn tersebut), jadi penjumlahan across turns = total token diproses.
10
+ */
11
+ export async function parseTranscriptUsage(transcriptPath) {
12
+ if (!transcriptPath || !existsSync(transcriptPath))
13
+ return null;
14
+ let raw;
15
+ try {
16
+ // ponytail: async readFile supaya transcript JSONL MB tidak blok event loop
17
+ // (hook dipanggil pada setiap Stop). existsSync tetap sync — cek cepat, no I/O besar.
18
+ raw = await readFile(transcriptPath, 'utf8');
19
+ }
20
+ catch {
21
+ return null;
22
+ }
23
+ const usage = {
24
+ inputTokens: 0,
25
+ outputTokens: 0,
26
+ cacheReadTokens: 0,
27
+ cacheCreationTokens: 0,
28
+ };
29
+ let model;
30
+ let costUsd;
31
+ let parsedAnyTurn = false;
32
+ for (const line of raw.split('\n')) {
33
+ const trimmed = line.trim();
34
+ if (!trimmed)
35
+ continue;
36
+ let entry;
37
+ try {
38
+ entry = JSON.parse(trimmed);
39
+ }
40
+ catch {
41
+ continue;
42
+ }
43
+ const u = entry.message?.usage;
44
+ if (u) {
45
+ parsedAnyTurn = true;
46
+ usage.inputTokens += u.input_tokens ?? 0;
47
+ usage.outputTokens += u.output_tokens ?? 0;
48
+ usage.cacheReadTokens += u.cache_read_input_tokens ?? 0;
49
+ usage.cacheCreationTokens += u.cache_creation_input_tokens ?? 0;
50
+ // Model diambil dari assistant message terakhir yang punya usage.
51
+ if (entry.message?.model)
52
+ model = entry.message.model;
53
+ }
54
+ if (typeof entry.costUSD === 'number' && Number.isFinite(entry.costUSD)) {
55
+ costUsd = (costUsd ?? 0) + entry.costUSD;
56
+ }
57
+ }
58
+ // ponytail: transcript tanpa assistant turn (hook SessionStart, file baru) → return null
59
+ // supaya upsertSession tidak menimpa akumulasi token DB dengan 0.
60
+ if (!parsedAnyTurn)
61
+ return null;
62
+ return { usage, model, costUsd };
63
+ }
64
+ //# sourceMappingURL=transcript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript.js","sourceRoot":"","sources":["../../src/lib/transcript.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AA2BrC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,cAAsB;IAEtB,IAAI,CAAC,cAAc,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;QAAE,OAAO,IAAI,CAAC;IAEhE,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,4EAA4E;QAC5E,sFAAsF;QACtF,GAAG,GAAG,MAAM,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAsB;QAC/B,WAAW,EAAE,CAAC;QACd,YAAY,EAAE,CAAC;QACf,eAAe,EAAE,CAAC;QAClB,mBAAmB,EAAE,CAAC;KACvB,CAAC;IACF,IAAI,KAAyB,CAAC;IAC9B,IAAI,OAA2B,CAAC;IAChC,IAAI,aAAa,GAAG,KAAK,CAAC;IAE1B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,SAAS;QAEvB,IAAI,KAAqB,CAAC;QAC1B,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAmB,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC;QAC/B,IAAI,CAAC,EAAE,CAAC;YACN,aAAa,GAAG,IAAI,CAAC;YACrB,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC;YACzC,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC;YAC3C,KAAK,CAAC,eAAe,IAAI,CAAC,CAAC,uBAAuB,IAAI,CAAC,CAAC;YACxD,KAAK,CAAC,mBAAmB,IAAI,CAAC,CAAC,2BAA2B,IAAI,CAAC,CAAC;YAChE,kEAAkE;YAClE,IAAI,KAAK,CAAC,OAAO,EAAE,KAAK;gBAAE,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACxD,CAAC;QAED,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACxE,OAAO,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,yFAAyF;IACzF,kEAAkE;IAClE,IAAI,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC;IAChC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AACnC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import pino from 'pino';
2
+ export declare const logger: {
3
+ main: pino.Logger<never, boolean>;
4
+ server: pino.Logger<never, boolean>;
5
+ db: pino.Logger<never, boolean>;
6
+ session: pino.Logger<never, boolean>;
7
+ terminal: pino.Logger<never, boolean>;
8
+ env: pino.Logger<never, boolean>;
9
+ connections: pino.Logger<never, boolean>;
10
+ hooks: pino.Logger<never, boolean>;
11
+ };
12
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAwBxB,eAAO,MAAM,MAAM;;;;;;;;;CAwBlB,CAAC"}