@sheepbun/yips 0.1.1
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/dist/agent/commands/command-catalog.js +243 -0
- package/dist/agent/commands/commands.js +418 -0
- package/dist/agent/conductor.js +118 -0
- package/dist/agent/context/code-context.js +68 -0
- package/dist/agent/context/memory-store.js +159 -0
- package/dist/agent/context/session-store.js +211 -0
- package/dist/agent/protocol/tool-protocol.js +160 -0
- package/dist/agent/skills/skills.js +327 -0
- package/dist/agent/tools/tool-executor.js +415 -0
- package/dist/agent/tools/tool-safety.js +52 -0
- package/dist/app/index.js +35 -0
- package/dist/app/repl.js +105 -0
- package/dist/app/update-check.js +132 -0
- package/dist/app/version.js +51 -0
- package/dist/code-context.js +68 -0
- package/dist/colors.js +204 -0
- package/dist/command-catalog.js +242 -0
- package/dist/commands.js +350 -0
- package/dist/conductor.js +94 -0
- package/dist/config/config.js +335 -0
- package/dist/config/hooks.js +187 -0
- package/dist/config.js +335 -0
- package/dist/downloader-state.js +302 -0
- package/dist/downloader-ui.js +289 -0
- package/dist/gateway/adapters/discord.js +108 -0
- package/dist/gateway/adapters/formatting.js +96 -0
- package/dist/gateway/adapters/telegram.js +106 -0
- package/dist/gateway/adapters/types.js +2 -0
- package/dist/gateway/adapters/whatsapp.js +124 -0
- package/dist/gateway/auth-policy.js +66 -0
- package/dist/gateway/core.js +87 -0
- package/dist/gateway/headless-conductor.js +328 -0
- package/dist/gateway/message-router.js +23 -0
- package/dist/gateway/rate-limiter.js +48 -0
- package/dist/gateway/runtime/backend-policy.js +18 -0
- package/dist/gateway/runtime/discord-bot.js +104 -0
- package/dist/gateway/runtime/discord-main.js +69 -0
- package/dist/gateway/session-manager.js +77 -0
- package/dist/gateway/types.js +2 -0
- package/dist/hardware.js +92 -0
- package/dist/hooks.js +187 -0
- package/dist/index.js +34 -0
- package/dist/input-engine.js +250 -0
- package/dist/llama-client.js +227 -0
- package/dist/llama-server.js +620 -0
- package/dist/llm/llama-client.js +227 -0
- package/dist/llm/llama-server.js +620 -0
- package/dist/llm/token-counter.js +47 -0
- package/dist/memory-store.js +159 -0
- package/dist/messages.js +59 -0
- package/dist/model-downloader.js +382 -0
- package/dist/model-manager-state.js +118 -0
- package/dist/model-manager-ui.js +194 -0
- package/dist/model-manager.js +190 -0
- package/dist/models/hardware.js +92 -0
- package/dist/models/model-downloader.js +382 -0
- package/dist/models/model-manager.js +190 -0
- package/dist/prompt-box.js +78 -0
- package/dist/prompt-composer.js +498 -0
- package/dist/repl.js +105 -0
- package/dist/session-store.js +211 -0
- package/dist/spinner.js +76 -0
- package/dist/title-box.js +388 -0
- package/dist/token-counter.js +47 -0
- package/dist/tool-executor.js +415 -0
- package/dist/tool-protocol.js +121 -0
- package/dist/tool-safety.js +52 -0
- package/dist/tui/app.js +2553 -0
- package/dist/tui/startup.js +56 -0
- package/dist/tui-input-routing.js +53 -0
- package/dist/tui.js +51 -0
- package/dist/types/app-types.js +2 -0
- package/dist/types.js +2 -0
- package/dist/ui/colors.js +204 -0
- package/dist/ui/downloader/downloader-state.js +302 -0
- package/dist/ui/downloader/downloader-ui.js +289 -0
- package/dist/ui/input/input-engine.js +250 -0
- package/dist/ui/input/tui-input-routing.js +53 -0
- package/dist/ui/input/vt-session.js +168 -0
- package/dist/ui/messages.js +59 -0
- package/dist/ui/model-manager/model-manager-state.js +118 -0
- package/dist/ui/model-manager/model-manager-ui.js +194 -0
- package/dist/ui/prompt/prompt-box.js +78 -0
- package/dist/ui/prompt/prompt-composer.js +498 -0
- package/dist/ui/spinner.js +76 -0
- package/dist/ui/title-box.js +388 -0
- package/dist/ui/tui/app.js +6 -0
- package/dist/ui/tui/autocomplete.js +85 -0
- package/dist/ui/tui/constants.js +18 -0
- package/dist/ui/tui/history.js +29 -0
- package/dist/ui/tui/layout.js +341 -0
- package/dist/ui/tui/runtime-core.js +2584 -0
- package/dist/ui/tui/runtime-utils.js +53 -0
- package/dist/ui/tui/start-tui.js +54 -0
- package/dist/ui/tui/startup.js +56 -0
- package/dist/version.js +51 -0
- package/dist/vt-session.js +168 -0
- package/install.sh +457 -0
- package/package.json +128 -0
package/install.sh
ADDED
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
+
REPO_ROOT="$SCRIPT_DIR"
|
|
7
|
+
LLAMA_REPO_DIR="${HOME}/llama.cpp"
|
|
8
|
+
LLAMA_BUILD_DIR="${LLAMA_REPO_DIR}/build"
|
|
9
|
+
LLAMA_SERVER_BIN="${LLAMA_BUILD_DIR}/bin/llama-server"
|
|
10
|
+
YIPS_DIR="${HOME}/.yips"
|
|
11
|
+
YIPS_MODELS_DIR="${YIPS_DIR}/models"
|
|
12
|
+
YIPS_ENV_FILE="${YIPS_DIR}/env.sh"
|
|
13
|
+
YIPS_BIN_DIR="${HOME}/.local/bin"
|
|
14
|
+
YIPS_LAUNCHER_PATH="${YIPS_BIN_DIR}/yips"
|
|
15
|
+
YIPS_CONFIG_PATH="${YIPS_DIR}/config.json"
|
|
16
|
+
|
|
17
|
+
OS_NAME=""
|
|
18
|
+
PKG_MANAGER=""
|
|
19
|
+
INSTALL_PREFIX=()
|
|
20
|
+
APT_UPDATED=0
|
|
21
|
+
PACMAN_UPDATED=0
|
|
22
|
+
INSTALL_CUDA=0
|
|
23
|
+
NODE_RUNTIME_DIAG=""
|
|
24
|
+
|
|
25
|
+
log() {
|
|
26
|
+
printf '[install] %s\n' "$*"
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
warn() {
|
|
30
|
+
printf '[install][warn] %s\n' "$*" >&2
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
die() {
|
|
34
|
+
printf '[install][error] %s\n' "$*" >&2
|
|
35
|
+
exit 1
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
on_error() {
|
|
39
|
+
local line="${1:-unknown}"
|
|
40
|
+
die "Installer failed near line ${line}. Re-run with: bash -x ./install.sh"
|
|
41
|
+
}
|
|
42
|
+
trap 'on_error "${LINENO}"' ERR
|
|
43
|
+
|
|
44
|
+
detect_platform() {
|
|
45
|
+
local uname_out
|
|
46
|
+
uname_out="$(uname -s)"
|
|
47
|
+
case "$uname_out" in
|
|
48
|
+
Linux) OS_NAME="linux" ;;
|
|
49
|
+
Darwin) OS_NAME="macos" ;;
|
|
50
|
+
*) die "Unsupported OS: ${uname_out}" ;;
|
|
51
|
+
esac
|
|
52
|
+
|
|
53
|
+
if command -v apt-get >/dev/null 2>&1; then
|
|
54
|
+
PKG_MANAGER="apt"
|
|
55
|
+
elif command -v pacman >/dev/null 2>&1; then
|
|
56
|
+
PKG_MANAGER="pacman"
|
|
57
|
+
elif command -v dnf >/dev/null 2>&1; then
|
|
58
|
+
PKG_MANAGER="dnf"
|
|
59
|
+
elif command -v brew >/dev/null 2>&1; then
|
|
60
|
+
PKG_MANAGER="brew"
|
|
61
|
+
else
|
|
62
|
+
die "No supported package manager found. Install dependencies manually: git cmake build tools nodejs npm curl."
|
|
63
|
+
fi
|
|
64
|
+
|
|
65
|
+
if [[ "$(id -u)" -ne 0 ]] && command -v sudo >/dev/null 2>&1; then
|
|
66
|
+
INSTALL_PREFIX=(sudo)
|
|
67
|
+
else
|
|
68
|
+
INSTALL_PREFIX=()
|
|
69
|
+
fi
|
|
70
|
+
|
|
71
|
+
log "Detected OS=${OS_NAME}, package manager=${PKG_MANAGER}"
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
parse_args() {
|
|
75
|
+
while [[ $# -gt 0 ]]; do
|
|
76
|
+
case "$1" in
|
|
77
|
+
--cuda)
|
|
78
|
+
INSTALL_CUDA=1
|
|
79
|
+
shift
|
|
80
|
+
;;
|
|
81
|
+
-h|--help)
|
|
82
|
+
cat <<'EOF'
|
|
83
|
+
Usage: ./install.sh [--cuda]
|
|
84
|
+
|
|
85
|
+
Options:
|
|
86
|
+
--cuda Install CUDA toolkit via package manager and build llama.cpp with CUDA.
|
|
87
|
+
EOF
|
|
88
|
+
exit 0
|
|
89
|
+
;;
|
|
90
|
+
*)
|
|
91
|
+
die "Unknown argument: $1 (try --help)"
|
|
92
|
+
;;
|
|
93
|
+
esac
|
|
94
|
+
done
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
install_packages_apt() {
|
|
98
|
+
local packages=("$@")
|
|
99
|
+
if [[ "$APT_UPDATED" -eq 0 ]]; then
|
|
100
|
+
"${INSTALL_PREFIX[@]}" apt-get update -y
|
|
101
|
+
APT_UPDATED=1
|
|
102
|
+
fi
|
|
103
|
+
"${INSTALL_PREFIX[@]}" apt-get install -y "${packages[@]}"
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
install_packages_dnf() {
|
|
107
|
+
local packages=("$@")
|
|
108
|
+
"${INSTALL_PREFIX[@]}" dnf install -y "${packages[@]}"
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
install_packages_pacman() {
|
|
112
|
+
local packages=("$@")
|
|
113
|
+
if [[ "$PACMAN_UPDATED" -eq 0 ]]; then
|
|
114
|
+
log "Arch detected: using full-upgrade pacman workflow (Syu)."
|
|
115
|
+
"${INSTALL_PREFIX[@]}" pacman -Syu --needed --noconfirm "${packages[@]}"
|
|
116
|
+
PACMAN_UPDATED=1
|
|
117
|
+
else
|
|
118
|
+
"${INSTALL_PREFIX[@]}" pacman -S --needed --noconfirm "${packages[@]}"
|
|
119
|
+
fi
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
install_packages_brew() {
|
|
123
|
+
local packages=("$@")
|
|
124
|
+
brew install "${packages[@]}"
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
install_cuda_toolkit() {
|
|
128
|
+
if [[ "${INSTALL_CUDA}" -ne 1 ]]; then
|
|
129
|
+
return
|
|
130
|
+
fi
|
|
131
|
+
|
|
132
|
+
log "--cuda enabled: installing CUDA toolkit prerequisites"
|
|
133
|
+
case "$PKG_MANAGER" in
|
|
134
|
+
apt)
|
|
135
|
+
install_packages_apt nvidia-cuda-toolkit
|
|
136
|
+
;;
|
|
137
|
+
pacman)
|
|
138
|
+
install_packages_pacman cuda
|
|
139
|
+
;;
|
|
140
|
+
dnf)
|
|
141
|
+
install_packages_dnf cuda
|
|
142
|
+
;;
|
|
143
|
+
brew)
|
|
144
|
+
warn "CUDA installation is not managed on macOS via Homebrew by this script; continuing without toolkit install."
|
|
145
|
+
;;
|
|
146
|
+
*)
|
|
147
|
+
die "Unsupported package manager for CUDA install: ${PKG_MANAGER}"
|
|
148
|
+
;;
|
|
149
|
+
esac
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
ensure_prerequisites() {
|
|
153
|
+
local missing=()
|
|
154
|
+
local cmd
|
|
155
|
+
for cmd in git cmake curl node npm; do
|
|
156
|
+
if ! command -v "$cmd" >/dev/null 2>&1; then
|
|
157
|
+
missing+=("$cmd")
|
|
158
|
+
fi
|
|
159
|
+
done
|
|
160
|
+
|
|
161
|
+
if [[ "${#missing[@]}" -eq 0 ]]; then
|
|
162
|
+
log "Prerequisites already available."
|
|
163
|
+
return
|
|
164
|
+
fi
|
|
165
|
+
|
|
166
|
+
log "Installing missing prerequisites: ${missing[*]}"
|
|
167
|
+
case "$PKG_MANAGER" in
|
|
168
|
+
apt)
|
|
169
|
+
install_packages_apt git cmake build-essential curl nodejs npm
|
|
170
|
+
;;
|
|
171
|
+
pacman)
|
|
172
|
+
install_packages_pacman git cmake base-devel curl nodejs npm
|
|
173
|
+
;;
|
|
174
|
+
dnf)
|
|
175
|
+
install_packages_dnf git cmake gcc-c++ make curl nodejs npm
|
|
176
|
+
;;
|
|
177
|
+
brew)
|
|
178
|
+
install_packages_brew git cmake curl node
|
|
179
|
+
;;
|
|
180
|
+
*)
|
|
181
|
+
die "Unsupported package manager: ${PKG_MANAGER}"
|
|
182
|
+
;;
|
|
183
|
+
esac
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
capture_node_runtime_diag() {
|
|
187
|
+
local node_diag npm_diag
|
|
188
|
+
node_diag="$(node -v 2>&1 || true)"
|
|
189
|
+
npm_diag="$(npm -v 2>&1 || true)"
|
|
190
|
+
NODE_RUNTIME_DIAG=$'node -v:\n'"${node_diag}"$'\n\nnpm -v:\n'"${npm_diag}"
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
node_runtime_healthy() {
|
|
194
|
+
node -v >/dev/null 2>&1 && npm -v >/dev/null 2>&1
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
repair_node_runtime_arch() {
|
|
198
|
+
warn "Detected broken Node runtime linkage. Attempting Arch self-heal reinstall (nodejs/npm/simdjson)."
|
|
199
|
+
install_packages_pacman nodejs npm simdjson
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
ensure_node_runtime_healthy() {
|
|
203
|
+
if node_runtime_healthy; then
|
|
204
|
+
return
|
|
205
|
+
fi
|
|
206
|
+
|
|
207
|
+
capture_node_runtime_diag
|
|
208
|
+
|
|
209
|
+
if [[ "$PKG_MANAGER" == "pacman" ]]; then
|
|
210
|
+
repair_node_runtime_arch
|
|
211
|
+
if node_runtime_healthy; then
|
|
212
|
+
log "Node runtime self-heal succeeded."
|
|
213
|
+
return
|
|
214
|
+
fi
|
|
215
|
+
capture_node_runtime_diag
|
|
216
|
+
die $'Node runtime is still unhealthy after Arch self-heal.\nRun manually:\n sudo pacman -Syu --needed nodejs npm simdjson\nThen retry ./install.sh\n\nDiagnostics:\n'"${NODE_RUNTIME_DIAG}"
|
|
217
|
+
fi
|
|
218
|
+
|
|
219
|
+
die $'Node runtime is unhealthy.\nPlease repair your Node installation and retry.\n\nDiagnostics:\n'"${NODE_RUNTIME_DIAG}"
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
setup_llama_repo() {
|
|
223
|
+
if [[ -d "${LLAMA_REPO_DIR}/.git" ]]; then
|
|
224
|
+
log "Updating existing llama.cpp checkout in ${LLAMA_REPO_DIR}"
|
|
225
|
+
git -C "${LLAMA_REPO_DIR}" pull --ff-only
|
|
226
|
+
else
|
|
227
|
+
log "Cloning llama.cpp into ${LLAMA_REPO_DIR}"
|
|
228
|
+
git clone https://github.com/ggerganov/llama.cpp "${LLAMA_REPO_DIR}"
|
|
229
|
+
fi
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
num_jobs() {
|
|
233
|
+
if command -v nproc >/dev/null 2>&1; then
|
|
234
|
+
nproc
|
|
235
|
+
return
|
|
236
|
+
fi
|
|
237
|
+
if command -v sysctl >/dev/null 2>&1; then
|
|
238
|
+
sysctl -n hw.logicalcpu 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 4
|
|
239
|
+
return
|
|
240
|
+
fi
|
|
241
|
+
echo 4
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
build_llama_cpu() {
|
|
245
|
+
log "Building llama.cpp (CPU mode)"
|
|
246
|
+
# Ensure prior CUDA configure state does not leak into CPU fallback.
|
|
247
|
+
rm -f "${LLAMA_BUILD_DIR}/CMakeCache.txt"
|
|
248
|
+
rm -rf "${LLAMA_BUILD_DIR}/CMakeFiles"
|
|
249
|
+
cmake -S "${LLAMA_REPO_DIR}" -B "${LLAMA_BUILD_DIR}" -DGGML_CUDA=OFF
|
|
250
|
+
cmake --build "${LLAMA_BUILD_DIR}" -j "$(num_jobs)"
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
build_llama_cuda_then_fallback() {
|
|
254
|
+
if [[ "${INSTALL_CUDA}" -eq 1 ]]; then
|
|
255
|
+
log "--cuda enabled: attempting CUDA build first."
|
|
256
|
+
fi
|
|
257
|
+
|
|
258
|
+
if command -v nvidia-smi >/dev/null 2>&1 && nvidia-smi >/dev/null 2>&1; then
|
|
259
|
+
if ! command -v nvcc >/dev/null 2>&1; then
|
|
260
|
+
warn "NVIDIA GPU detected but nvcc is unavailable. Skipping CUDA build and using CPU mode."
|
|
261
|
+
build_llama_cpu
|
|
262
|
+
return
|
|
263
|
+
fi
|
|
264
|
+
log "NVIDIA GPU detected. Attempting CUDA build."
|
|
265
|
+
if cmake -S "${LLAMA_REPO_DIR}" -B "${LLAMA_BUILD_DIR}" -DGGML_CUDA=ON &&
|
|
266
|
+
cmake --build "${LLAMA_BUILD_DIR}" -j "$(num_jobs)"; then
|
|
267
|
+
log "CUDA build succeeded."
|
|
268
|
+
return
|
|
269
|
+
fi
|
|
270
|
+
warn "CUDA build failed. Falling back to CPU build."
|
|
271
|
+
else
|
|
272
|
+
log "No NVIDIA GPU detected. Using CPU build."
|
|
273
|
+
fi
|
|
274
|
+
build_llama_cpu
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
validate_llama_server_binary() {
|
|
278
|
+
[[ -x "${LLAMA_SERVER_BIN}" ]] || die "llama-server not found at ${LLAMA_SERVER_BIN} after build."
|
|
279
|
+
"${LLAMA_SERVER_BIN}" --help >/dev/null 2>&1 || true
|
|
280
|
+
log "llama-server ready: ${LLAMA_SERVER_BIN}"
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
ensure_yips_dirs() {
|
|
284
|
+
mkdir -p "${YIPS_MODELS_DIR}"
|
|
285
|
+
mkdir -p "${YIPS_BIN_DIR}"
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
write_env_file() {
|
|
289
|
+
local temp_file
|
|
290
|
+
temp_file="$(mktemp)"
|
|
291
|
+
if [[ -f "${YIPS_ENV_FILE}" ]]; then
|
|
292
|
+
grep -vE '^export (LLAMA_SERVER_PATH|YIPS_LLAMA_SERVER_PATH|YIPS_LLAMA_MODELS_DIR|YIPS_CONFIG_PATH|YIPS_BIN_DIR)=' "${YIPS_ENV_FILE}" \
|
|
293
|
+
| grep -vE '^export PATH="\$YIPS_BIN_DIR:\$PATH"$' >"${temp_file}" || true
|
|
294
|
+
fi
|
|
295
|
+
{
|
|
296
|
+
echo "export LLAMA_SERVER_PATH=\"${LLAMA_SERVER_BIN}\""
|
|
297
|
+
echo "export YIPS_LLAMA_SERVER_PATH=\"${LLAMA_SERVER_BIN}\""
|
|
298
|
+
echo "export YIPS_LLAMA_MODELS_DIR=\"${YIPS_MODELS_DIR}\""
|
|
299
|
+
echo "export YIPS_CONFIG_PATH=\"${YIPS_CONFIG_PATH}\""
|
|
300
|
+
echo "export YIPS_BIN_DIR=\"${YIPS_BIN_DIR}\""
|
|
301
|
+
echo 'export PATH="$YIPS_BIN_DIR:$PATH"'
|
|
302
|
+
} >>"${temp_file}"
|
|
303
|
+
mv "${temp_file}" "${YIPS_ENV_FILE}"
|
|
304
|
+
chmod 600 "${YIPS_ENV_FILE}"
|
|
305
|
+
log "Updated ${YIPS_ENV_FILE}"
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
install_yips_launcher() {
|
|
309
|
+
cat >"${YIPS_LAUNCHER_PATH}" <<EOF
|
|
310
|
+
#!/usr/bin/env bash
|
|
311
|
+
set -euo pipefail
|
|
312
|
+
REPO_ROOT="${REPO_ROOT}"
|
|
313
|
+
if [[ ! -d "\${REPO_ROOT}" ]]; then
|
|
314
|
+
echo "[yips launcher] Repository path not found: \${REPO_ROOT}" >&2
|
|
315
|
+
exit 1
|
|
316
|
+
fi
|
|
317
|
+
# Preserve caller cwd so Yips reflects where the command was launched.
|
|
318
|
+
# Set YIPS_USE_DIST=1 to prefer compiled output when desired.
|
|
319
|
+
if [[ "\${YIPS_USE_DIST:-0}" == "1" ]] && [[ -f "\${REPO_ROOT}/dist/app/index.js" ]]; then
|
|
320
|
+
exec node "\${REPO_ROOT}/dist/app/index.js" "\$@"
|
|
321
|
+
fi
|
|
322
|
+
TSX_BIN="\${REPO_ROOT}/node_modules/tsx/dist/cli.mjs"
|
|
323
|
+
if [[ ! -f "\${TSX_BIN}" ]]; then
|
|
324
|
+
echo "[yips launcher] Missing tsx runtime at \${TSX_BIN}" >&2
|
|
325
|
+
echo "[yips launcher] Run: (cd \${REPO_ROOT} && npm install)" >&2
|
|
326
|
+
exit 1
|
|
327
|
+
fi
|
|
328
|
+
exec node "\${TSX_BIN}" "\${REPO_ROOT}/src/app/index.ts" "\$@"
|
|
329
|
+
EOF
|
|
330
|
+
chmod +x "${YIPS_LAUNCHER_PATH}"
|
|
331
|
+
log "Installed launcher: ${YIPS_LAUNCHER_PATH}"
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
update_yips_config() {
|
|
335
|
+
log "Normalizing ${YIPS_CONFIG_PATH}"
|
|
336
|
+
node - "${YIPS_CONFIG_PATH}" "${LLAMA_SERVER_BIN}" "${YIPS_MODELS_DIR}" <<'NODE'
|
|
337
|
+
const fs = require("node:fs");
|
|
338
|
+
const path = require("node:path");
|
|
339
|
+
|
|
340
|
+
const configPath = process.argv[2];
|
|
341
|
+
const llamaServerPath = process.argv[3];
|
|
342
|
+
const modelsDir = process.argv[4];
|
|
343
|
+
|
|
344
|
+
const defaults = {
|
|
345
|
+
streaming: true,
|
|
346
|
+
verbose: false,
|
|
347
|
+
backend: "llamacpp",
|
|
348
|
+
llamaBaseUrl: "http://127.0.0.1:8080",
|
|
349
|
+
llamaServerPath,
|
|
350
|
+
llamaModelsDir: modelsDir,
|
|
351
|
+
llamaHost: "127.0.0.1",
|
|
352
|
+
llamaPort: 8080,
|
|
353
|
+
llamaContextSize: 8192,
|
|
354
|
+
llamaGpuLayers: 999,
|
|
355
|
+
llamaAutoStart: true,
|
|
356
|
+
model: "default",
|
|
357
|
+
nicknames: {}
|
|
358
|
+
};
|
|
359
|
+
|
|
360
|
+
let current = {};
|
|
361
|
+
if (fs.existsSync(configPath)) {
|
|
362
|
+
try {
|
|
363
|
+
current = JSON.parse(fs.readFileSync(configPath, "utf8"));
|
|
364
|
+
} catch (error) {
|
|
365
|
+
console.warn(`[install][warn] Existing config unreadable, rewriting with defaults: ${String(error)}`);
|
|
366
|
+
current = {};
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
const merged = {
|
|
371
|
+
...defaults,
|
|
372
|
+
...current
|
|
373
|
+
};
|
|
374
|
+
|
|
375
|
+
if (typeof current.llamaServerPath !== "string" || current.llamaServerPath.trim().length === 0) {
|
|
376
|
+
merged.llamaServerPath = llamaServerPath;
|
|
377
|
+
}
|
|
378
|
+
if (typeof current.llamaModelsDir !== "string" || current.llamaModelsDir.trim().length === 0) {
|
|
379
|
+
merged.llamaModelsDir = modelsDir;
|
|
380
|
+
}
|
|
381
|
+
if (typeof current.llamaHost !== "string" || current.llamaHost.trim().length === 0) {
|
|
382
|
+
merged.llamaHost = "127.0.0.1";
|
|
383
|
+
}
|
|
384
|
+
if (!Number.isInteger(current.llamaPort) || current.llamaPort <= 0) {
|
|
385
|
+
merged.llamaPort = 8080;
|
|
386
|
+
}
|
|
387
|
+
if (typeof current.llamaBaseUrl !== "string" || current.llamaBaseUrl.trim().length === 0) {
|
|
388
|
+
merged.llamaBaseUrl = `http://${merged.llamaHost}:${merged.llamaPort}`;
|
|
389
|
+
}
|
|
390
|
+
if (!Number.isInteger(current.llamaContextSize) || current.llamaContextSize <= 0) {
|
|
391
|
+
merged.llamaContextSize = 8192;
|
|
392
|
+
}
|
|
393
|
+
if (!Number.isInteger(current.llamaGpuLayers) || current.llamaGpuLayers <= 0) {
|
|
394
|
+
merged.llamaGpuLayers = 999;
|
|
395
|
+
}
|
|
396
|
+
if (typeof current.llamaAutoStart !== "boolean") {
|
|
397
|
+
merged.llamaAutoStart = true;
|
|
398
|
+
}
|
|
399
|
+
if (!merged.nicknames || typeof merged.nicknames !== "object" || Array.isArray(merged.nicknames)) {
|
|
400
|
+
merged.nicknames = {};
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
fs.mkdirSync(path.dirname(configPath), { recursive: true });
|
|
404
|
+
fs.writeFileSync(configPath, `${JSON.stringify(merged, null, 2)}\n`, "utf8");
|
|
405
|
+
NODE
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
install_node_dependencies() {
|
|
409
|
+
ensure_node_runtime_healthy
|
|
410
|
+
log "Installing Node dependencies"
|
|
411
|
+
(cd "${REPO_ROOT}" && npm install)
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
count_models() {
|
|
415
|
+
find "${YIPS_MODELS_DIR}" -type f -name '*.gguf' 2>/dev/null | wc -l | tr -d ' '
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
print_summary() {
|
|
419
|
+
local models_count
|
|
420
|
+
models_count="$(count_models)"
|
|
421
|
+
log "Install complete."
|
|
422
|
+
echo
|
|
423
|
+
echo "Summary:"
|
|
424
|
+
echo " - llama-server: ${LLAMA_SERVER_BIN}"
|
|
425
|
+
echo " - yips launcher: ${YIPS_LAUNCHER_PATH}"
|
|
426
|
+
echo " - Yips env file: ${YIPS_ENV_FILE}"
|
|
427
|
+
echo " - Models dir: ${YIPS_MODELS_DIR}"
|
|
428
|
+
echo " - .yips_config.json: ${YIPS_CONFIG_PATH}"
|
|
429
|
+
echo " - GGUF models detected: ${models_count}"
|
|
430
|
+
echo
|
|
431
|
+
echo "Next:"
|
|
432
|
+
echo " 1) source \"${YIPS_ENV_FILE}\""
|
|
433
|
+
echo " 2) Run: yips"
|
|
434
|
+
echo " (launch from any directory; Yips keeps your current working directory)"
|
|
435
|
+
if [[ "${models_count}" == "0" ]]; then
|
|
436
|
+
echo " 3) In Yips, use /download (or /model) to fetch/select a GGUF model."
|
|
437
|
+
fi
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
main() {
|
|
441
|
+
parse_args "$@"
|
|
442
|
+
detect_platform
|
|
443
|
+
ensure_prerequisites
|
|
444
|
+
ensure_node_runtime_healthy
|
|
445
|
+
install_cuda_toolkit
|
|
446
|
+
setup_llama_repo
|
|
447
|
+
build_llama_cuda_then_fallback
|
|
448
|
+
validate_llama_server_binary
|
|
449
|
+
ensure_yips_dirs
|
|
450
|
+
write_env_file
|
|
451
|
+
install_node_dependencies
|
|
452
|
+
update_yips_config
|
|
453
|
+
install_yips_launcher
|
|
454
|
+
print_summary
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
main "$@"
|
package/package.json
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@sheepbun/yips",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Local-first AI code editor and self-hosted gateway (TypeScript rewrite).",
|
|
5
|
+
"license": "UNLICENSED",
|
|
6
|
+
"homepage": "https://yips.dev",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/sheepbun/yips.git"
|
|
10
|
+
},
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/sheepbun/yips/issues"
|
|
13
|
+
},
|
|
14
|
+
"main": "dist/app/index.js",
|
|
15
|
+
"bin": {
|
|
16
|
+
"yips": "dist/app/index.js"
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist/**",
|
|
20
|
+
"install.sh"
|
|
21
|
+
],
|
|
22
|
+
"imports": {
|
|
23
|
+
"#app/*": {
|
|
24
|
+
"development": "./src/app/*.ts",
|
|
25
|
+
"default": "./dist/app/*.js"
|
|
26
|
+
},
|
|
27
|
+
"#agent/conductor": {
|
|
28
|
+
"development": "./src/agent/conductor.ts",
|
|
29
|
+
"default": "./dist/agent/conductor.js"
|
|
30
|
+
},
|
|
31
|
+
"#agent/commands/*": {
|
|
32
|
+
"development": "./src/agent/commands/*.ts",
|
|
33
|
+
"default": "./dist/agent/commands/*.js"
|
|
34
|
+
},
|
|
35
|
+
"#agent/context/*": {
|
|
36
|
+
"development": "./src/agent/context/*.ts",
|
|
37
|
+
"default": "./dist/agent/context/*.js"
|
|
38
|
+
},
|
|
39
|
+
"#agent/protocol/*": {
|
|
40
|
+
"development": "./src/agent/protocol/*.ts",
|
|
41
|
+
"default": "./dist/agent/protocol/*.js"
|
|
42
|
+
},
|
|
43
|
+
"#agent/tools/*": {
|
|
44
|
+
"development": "./src/agent/tools/*.ts",
|
|
45
|
+
"default": "./dist/agent/tools/*.js"
|
|
46
|
+
},
|
|
47
|
+
"#agent/skills/*": {
|
|
48
|
+
"development": "./src/agent/skills/*.ts",
|
|
49
|
+
"default": "./dist/agent/skills/*.js"
|
|
50
|
+
},
|
|
51
|
+
"#config/*": {
|
|
52
|
+
"development": "./src/config/*.ts",
|
|
53
|
+
"default": "./dist/config/*.js"
|
|
54
|
+
},
|
|
55
|
+
"#gateway/*": {
|
|
56
|
+
"development": "./src/gateway/*.ts",
|
|
57
|
+
"default": "./dist/gateway/*.js"
|
|
58
|
+
},
|
|
59
|
+
"#llm/*": {
|
|
60
|
+
"development": "./src/llm/*.ts",
|
|
61
|
+
"default": "./dist/llm/*.js"
|
|
62
|
+
},
|
|
63
|
+
"#models/*": {
|
|
64
|
+
"development": "./src/models/*.ts",
|
|
65
|
+
"default": "./dist/models/*.js"
|
|
66
|
+
},
|
|
67
|
+
"#types/*": {
|
|
68
|
+
"development": "./src/types/*.ts",
|
|
69
|
+
"default": "./dist/types/*.js"
|
|
70
|
+
},
|
|
71
|
+
"#ui/*": {
|
|
72
|
+
"development": "./src/ui/*.ts",
|
|
73
|
+
"default": "./dist/ui/*.js"
|
|
74
|
+
},
|
|
75
|
+
"#ui/prompt/*": {
|
|
76
|
+
"development": "./src/ui/prompt/*.ts",
|
|
77
|
+
"default": "./dist/ui/prompt/*.js"
|
|
78
|
+
},
|
|
79
|
+
"#ui/input/*": {
|
|
80
|
+
"development": "./src/ui/input/*.ts",
|
|
81
|
+
"default": "./dist/ui/input/*.js"
|
|
82
|
+
},
|
|
83
|
+
"#ui/downloader/*": {
|
|
84
|
+
"development": "./src/ui/downloader/*.ts",
|
|
85
|
+
"default": "./dist/ui/downloader/*.js"
|
|
86
|
+
},
|
|
87
|
+
"#ui/model-manager/*": {
|
|
88
|
+
"development": "./src/ui/model-manager/*.ts",
|
|
89
|
+
"default": "./dist/ui/model-manager/*.js"
|
|
90
|
+
},
|
|
91
|
+
"#ui/tui/*": {
|
|
92
|
+
"development": "./src/ui/tui/*.ts",
|
|
93
|
+
"default": "./dist/ui/tui/*.js"
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
"engines": {
|
|
97
|
+
"node": ">=20.0.0"
|
|
98
|
+
},
|
|
99
|
+
"scripts": {
|
|
100
|
+
"build": "tsc -p tsconfig.build.json",
|
|
101
|
+
"dev": "tsx --conditions=development src/app/index.ts",
|
|
102
|
+
"gateway:discord": "tsx --conditions=development src/gateway/runtime/discord-main.ts",
|
|
103
|
+
"start": "node dist/app/index.js",
|
|
104
|
+
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
105
|
+
"test": "vitest run",
|
|
106
|
+
"test:watch": "vitest",
|
|
107
|
+
"lint": "eslint \"src/**/*.ts\" \"tests/**/*.ts\"",
|
|
108
|
+
"format": "prettier --write \"src/**/*.ts\" \"tests/**/*.ts\" \".github/**/*.yml\" \"*.json\"",
|
|
109
|
+
"format:check": "prettier --check \"src/**/*.ts\" \"tests/**/*.ts\" \".github/**/*.yml\" \"*.json\""
|
|
110
|
+
},
|
|
111
|
+
"devDependencies": {
|
|
112
|
+
"@types/node": "^22.13.4",
|
|
113
|
+
"@types/react": "^18.3.26",
|
|
114
|
+
"@typescript-eslint/eslint-plugin": "^7.18.0",
|
|
115
|
+
"@typescript-eslint/parser": "^7.18.0",
|
|
116
|
+
"eslint": "^8.57.1",
|
|
117
|
+
"prettier": "^3.5.3",
|
|
118
|
+
"tsx": "^4.19.3",
|
|
119
|
+
"typescript": "^5.8.2",
|
|
120
|
+
"vitest": "^3.0.7"
|
|
121
|
+
},
|
|
122
|
+
"dependencies": {
|
|
123
|
+
"discord.js": "^14.22.1",
|
|
124
|
+
"ink": "^4.4.1",
|
|
125
|
+
"node-pty": "^1.1.0",
|
|
126
|
+
"react": "^18.3.1"
|
|
127
|
+
}
|
|
128
|
+
}
|