@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.
- package/README.md +122 -0
- package/agent/dist/config.d.ts +31 -0
- package/agent/dist/config.d.ts.map +1 -0
- package/agent/dist/config.js +81 -0
- package/agent/dist/config.js.map +1 -0
- package/agent/dist/db/commands.d.ts +25 -0
- package/agent/dist/db/commands.d.ts.map +1 -0
- package/agent/dist/db/commands.js +93 -0
- package/agent/dist/db/commands.js.map +1 -0
- package/agent/dist/db/index.d.ts +30 -0
- package/agent/dist/db/index.d.ts.map +1 -0
- package/agent/dist/db/index.js +368 -0
- package/agent/dist/db/index.js.map +1 -0
- package/agent/dist/db/schema.d.ts +74 -0
- package/agent/dist/db/schema.d.ts.map +1 -0
- package/agent/dist/db/schema.js +100 -0
- package/agent/dist/db/schema.js.map +1 -0
- package/agent/dist/db/sessions.d.ts +46 -0
- package/agent/dist/db/sessions.d.ts.map +1 -0
- package/agent/dist/db/sessions.js +198 -0
- package/agent/dist/db/sessions.js.map +1 -0
- package/agent/dist/index.d.ts +2 -0
- package/agent/dist/index.d.ts.map +1 -0
- package/agent/dist/index.js +19 -0
- package/agent/dist/index.js.map +1 -0
- package/agent/dist/lib/command-session.d.ts +20 -0
- package/agent/dist/lib/command-session.d.ts.map +1 -0
- package/agent/dist/lib/command-session.js +64 -0
- package/agent/dist/lib/command-session.js.map +1 -0
- package/agent/dist/lib/git.d.ts +8 -0
- package/agent/dist/lib/git.d.ts.map +1 -0
- package/agent/dist/lib/git.js +194 -0
- package/agent/dist/lib/git.js.map +1 -0
- package/agent/dist/lib/init-script.d.ts +33 -0
- package/agent/dist/lib/init-script.d.ts.map +1 -0
- package/agent/dist/lib/init-script.js +523 -0
- package/agent/dist/lib/init-script.js.map +1 -0
- package/agent/dist/lib/transcript.d.ts +16 -0
- package/agent/dist/lib/transcript.d.ts.map +1 -0
- package/agent/dist/lib/transcript.js +64 -0
- package/agent/dist/lib/transcript.js.map +1 -0
- package/agent/dist/logger.d.ts +12 -0
- package/agent/dist/logger.d.ts.map +1 -0
- package/agent/dist/logger.js +39 -0
- package/agent/dist/logger.js.map +1 -0
- package/agent/dist/middleware/auth.d.ts +15 -0
- package/agent/dist/middleware/auth.d.ts.map +1 -0
- package/agent/dist/middleware/auth.js +55 -0
- package/agent/dist/middleware/auth.js.map +1 -0
- package/agent/dist/routes/commands.d.ts +8 -0
- package/agent/dist/routes/commands.d.ts.map +1 -0
- package/agent/dist/routes/commands.js +229 -0
- package/agent/dist/routes/commands.js.map +1 -0
- package/agent/dist/routes/files.d.ts +7 -0
- package/agent/dist/routes/files.d.ts.map +1 -0
- package/agent/dist/routes/files.js +206 -0
- package/agent/dist/routes/files.js.map +1 -0
- package/agent/dist/routes/hooks.d.ts +7 -0
- package/agent/dist/routes/hooks.d.ts.map +1 -0
- package/agent/dist/routes/hooks.js +147 -0
- package/agent/dist/routes/hooks.js.map +1 -0
- package/agent/dist/routes/index.d.ts +10 -0
- package/agent/dist/routes/index.d.ts.map +1 -0
- package/agent/dist/routes/index.js +10 -0
- package/agent/dist/routes/index.js.map +1 -0
- package/agent/dist/routes/pair.d.ts +26 -0
- package/agent/dist/routes/pair.d.ts.map +1 -0
- package/agent/dist/routes/pair.js +384 -0
- package/agent/dist/routes/pair.js.map +1 -0
- package/agent/dist/routes/projects.d.ts +6 -0
- package/agent/dist/routes/projects.d.ts.map +1 -0
- package/agent/dist/routes/projects.js +121 -0
- package/agent/dist/routes/projects.js.map +1 -0
- package/agent/dist/routes/sessions-git.d.ts +7 -0
- package/agent/dist/routes/sessions-git.d.ts.map +1 -0
- package/agent/dist/routes/sessions-git.js +31 -0
- package/agent/dist/routes/sessions-git.js.map +1 -0
- package/agent/dist/routes/sessions-tmux.d.ts +7 -0
- package/agent/dist/routes/sessions-tmux.d.ts.map +1 -0
- package/agent/dist/routes/sessions-tmux.js +94 -0
- package/agent/dist/routes/sessions-tmux.js.map +1 -0
- package/agent/dist/routes/sessions.d.ts +7 -0
- package/agent/dist/routes/sessions.d.ts.map +1 -0
- package/agent/dist/routes/sessions.js +172 -0
- package/agent/dist/routes/sessions.js.map +1 -0
- package/agent/dist/server.d.ts +6 -0
- package/agent/dist/server.d.ts.map +1 -0
- package/agent/dist/server.js +95 -0
- package/agent/dist/server.js.map +1 -0
- package/agent/dist/terminal.d.ts +19 -0
- package/agent/dist/terminal.d.ts.map +1 -0
- package/agent/dist/terminal.js +175 -0
- package/agent/dist/terminal.js.map +1 -0
- package/agent/dist/updater.d.ts +18 -0
- package/agent/dist/updater.d.ts.map +1 -0
- package/agent/dist/updater.js +122 -0
- package/agent/dist/updater.js.map +1 -0
- package/agent/dist/version.d.ts +20 -0
- package/agent/dist/version.d.ts.map +1 -0
- package/agent/dist/version.js +66 -0
- package/agent/dist/version.js.map +1 -0
- package/agent/dist/websocket-handlers.d.ts +38 -0
- package/agent/dist/websocket-handlers.d.ts.map +1 -0
- package/agent/dist/websocket-handlers.js +389 -0
- package/agent/dist/websocket-handlers.js.map +1 -0
- package/agent/node_modules/@agentdeck/shared/dist/index.d.ts +2 -0
- package/agent/node_modules/@agentdeck/shared/dist/index.d.ts.map +1 -0
- package/agent/node_modules/@agentdeck/shared/dist/index.js +2 -0
- package/agent/node_modules/@agentdeck/shared/dist/index.js.map +1 -0
- package/agent/node_modules/@agentdeck/shared/dist/types/index.d.ts +235 -0
- package/agent/node_modules/@agentdeck/shared/dist/types/index.d.ts.map +1 -0
- package/agent/node_modules/@agentdeck/shared/dist/types/index.js +5 -0
- package/agent/node_modules/@agentdeck/shared/dist/types/index.js.map +1 -0
- package/agent/node_modules/@agentdeck/shared/package.json +29 -0
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +304 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/hooks.d.ts +3 -0
- package/dist/commands/hooks.d.ts.map +1 -0
- package/dist/commands/hooks.js +187 -0
- package/dist/commands/hooks.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +109 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/logs.d.ts +3 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +38 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/profile.d.ts +3 -0
- package/dist/commands/profile.d.ts.map +1 -0
- package/dist/commands/profile.js +156 -0
- package/dist/commands/profile.js.map +1 -0
- package/dist/commands/service.d.ts +3 -0
- package/dist/commands/service.d.ts.map +1 -0
- package/dist/commands/service.js +235 -0
- package/dist/commands/service.js.map +1 -0
- package/dist/commands/start.d.ts +3 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +122 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +48 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/stop.d.ts +3 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +23 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/commands/update.d.ts +3 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +129 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/version.d.ts +3 -0
- package/dist/commands/version.d.ts.map +1 -0
- package/dist/commands/version.js +39 -0
- package/dist/commands/version.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/config.d.ts +68 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +156 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/hooks.d.ts +67 -0
- package/dist/lib/hooks.d.ts.map +1 -0
- package/dist/lib/hooks.js +353 -0
- package/dist/lib/hooks.js.map +1 -0
- package/dist/lib/paths.d.ts +36 -0
- package/dist/lib/paths.d.ts.map +1 -0
- package/dist/lib/paths.js +77 -0
- package/dist/lib/paths.js.map +1 -0
- package/dist/lib/prerequisites.d.ts +60 -0
- package/dist/lib/prerequisites.d.ts.map +1 -0
- package/dist/lib/prerequisites.js +266 -0
- package/dist/lib/prerequisites.js.map +1 -0
- package/dist/lib/process.d.ts +40 -0
- package/dist/lib/process.d.ts.map +1 -0
- package/dist/lib/process.js +192 -0
- package/dist/lib/process.js.map +1 -0
- package/dist/service/index.d.ts +44 -0
- package/dist/service/index.d.ts.map +1 -0
- package/dist/service/index.js +18 -0
- package/dist/service/index.js.map +1 -0
- package/dist/service/launchd.d.ts +18 -0
- package/dist/service/launchd.d.ts.map +1 -0
- package/dist/service/launchd.js +208 -0
- package/dist/service/launchd.js.map +1 -0
- package/dist/service/systemd.d.ts +18 -0
- package/dist/service/systemd.d.ts.map +1 -0
- package/dist/service/systemd.js +196 -0
- package/dist/service/systemd.js.map +1 -0
- package/hooks/notify-agentdeck.sh +53 -0
- 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"}
|