Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
91 commits
Select commit Hold shift + click to select a range
6de200f
[Activity] add journaling
GuillaumeDSM Sep 9, 2026
b070bae
[WebInterface] remove metrics
GuillaumeDSM Sep 13, 2026
086d875
[Stats] temporarily restore community bot stats
GuillaumeDSM Sep 15, 2026
071649e
[Journal] fixes and simplifications
GuillaumeDSM Sep 15, 2026
b6bc8e6
[Cloud env] init cloud env
GuillaumeDSM Sep 16, 2026
ea1e61c
[Cloud env] prefer repo-pinned Node (.nvmrc) in generated env.sh
cursoragent Sep 16, 2026
b80126a
[Node] fix parser errors
GuillaumeDSM Sep 16, 2026
e239470
[Trading] avoid error on missing portfolio when can't fetch
GuillaumeDSM Sep 16, 2026
1d79e4f
[Node] fix error swallowing
GuillaumeDSM Sep 16, 2026
7d24335
[Node] fix tasks pagination
GuillaumeDSM Sep 16, 2026
916a59b
[Cloud env] add agent docs and init extended linter
GuillaumeDSM Sep 16, 2026
03a4379
[Cloud env] add agent seed
GuillaumeDSM Sep 17, 2026
09e0d63
[Cloud env] add roadmap skill
GuillaumeDSM Sep 17, 2026
a7389ba
[Cloud env] add tests debug process
GuillaumeDSM Sep 18, 2026
46e1626
Add max_retry_interval jitter to loop_until DSL operator
cursoragent Sep 17, 2026
c97f1d0
Test loop_until jitter DSL in OctoBot flow client
cursoragent Sep 17, 2026
9f92c61
Wire LOOP_INTERVAL_MAX into loop_until automation DSL
cursoragent Sep 17, 2026
69387a8
[Node] fix jitter parsing
GuillaumeDSM Sep 18, 2026
aba3622
[Cloud env] add openapi agent guidance
GuillaumeDSM Sep 18, 2026
f447f4d
[Cloud env] add plan & e2e tests guidance
GuillaumeDSM Sep 18, 2026
43ad491
[Cloud env] add guards on agent files edit
GuillaumeDSM Sep 18, 2026
4046198
[Cloud env] add UI agent guidance
GuillaumeDSM Sep 19, 2026
eea6c1c
Improve Node unlock auth errors and login guidance
cursoragent Sep 18, 2026
940de16
Simplify deps auth_errors import to api package path
cursoragent Sep 18, 2026
b227bd6
Use relative import for auth_errors in node API deps
cursoragent Sep 18, 2026
fe0a0b5
[Symbols] support @network symbols
GuillaumeDSM Sep 19, 2026
e15e570
[DSL] fix market_expiry category
GuillaumeDSM Sep 20, 2026
7940516
[Agents] add more guidance on good practices
GuillaumeDSM Sep 21, 2026
eeba1aa
[Node] make schedules disableable
GuillaumeDSM Sep 21, 2026
9db4775
[Protocol] sync client dep and lockfile for 0.9.0
cursoragent Sep 21, 2026
a2bae78
[Protocol] restore 0.9.0 workspace package version on dev
cursoragent Sep 21, 2026
53a5e95
[Node] best effort to include results in error/cancelled automations
GuillaumeDSM Sep 21, 2026
a00ee35
[Node] update to dbos==2.31.1
GuillaumeDSM Sep 21, 2026
44ad45f
[Node] allow viewing results for error/cancel tasks
GuillaumeDSM Sep 21, 2026
2a704fe
[Node] udpate to dbos v3
GuillaumeDSM Sep 21, 2026
6403837
[Node] select workflows by name instead of queue & optimize select
GuillaumeDSM Sep 22, 2026
8ae9ad0
[Node] optimise wf select with id prefix and queues_only filters
GuillaumeDSM Sep 22, 2026
cecc928
[Node] refresh tasks every 5s instead of 2
GuillaumeDSM Sep 22, 2026
c0a3d65
feat(feedback): replace upload with export JSON endpoint
cursoragent Sep 21, 2026
7d9c086
feat(feedback): client zip download and mailto handoff
cursoragent Sep 21, 2026
b316aed
test(feedback): assert export route and no upload path
cursoragent Sep 21, 2026
b7aedbd
refactor(feedback): build journal zip with fflate
cursoragent Sep 21, 2026
f093ef2
[Node] fix mailto content
GuillaumeDSM Sep 22, 2026
860108b
[Node] bump UI dependencies
GuillaumeDSM Sep 22, 2026
8e3f27e
[Config] fix schema backwards compat
GuillaumeDSM Sep 23, 2026
cb8a3db
[Deps] bump deps & remove pyiceberg, telethon
GuillaumeDSM Sep 23, 2026
e94bfba
[Node] fix Task model after pydantic up
GuillaumeDSM Sep 23, 2026
5fb092d
[Deps] up web3 to 7.16.0
GuillaumeDSM Sep 23, 2026
af5599e
[Node] extract feedback zip logic to server
GuillaumeDSM Sep 23, 2026
ad25d5f
[Deps] bump fastapi and remove fastapi cli from deps
GuillaumeDSM Sep 23, 2026
ffe38ea
[Alchemy] add uniswapv4 test
GuillaumeDSM Sep 13, 2026
437be69
[deps] bump aiohttp
GuillaumeDSM Sep 23, 2026
98aae67
[Coinrabbit] update tests
GuillaumeDSM Sep 12, 2026
ac0d88e
[WebInterface] migrate from gevent to uvicorn
GuillaumeDSM Sep 23, 2026
1ff2d72
[CI] log test report
GuillaumeDSM Sep 24, 2026
c3d9995
Phase 1: add non-skippable BIP39 seed reveal step for wallet generate
cursoragent Sep 21, 2026
a792b33
Phase 2: add seed confirmation quiz with Previous back to reveal
cursoragent Sep 21, 2026
3497051
Phase 3: wire generate onboarding into setup and Add wallet dialog
cursoragent Sep 21, 2026
99f93a8
Phase 4: document wallet generate seed onboarding in README
cursoragent Sep 21, 2026
a5214f5
fix(node-web): seed reveal checkbox-only continue + per-field quiz er…
cursoragent Sep 24, 2026
6c5029b
[Node] properly display passphrase error when using multi wallet
GuillaumeDSM Sep 24, 2026
41db6ef
Improve seed confirm quiz with reveal-style word grid
cursoragent Sep 24, 2026
93e3f0b
Fix seed quiz blur validation using input value on blur
cursoragent Sep 24, 2026
d3863e8
Align seed phrase grid cell heights and widen onboarding dialog
cursoragent Sep 24, 2026
9143e7a
Fix seed grid slot height to keep quiz rows aligned
cursoragent Sep 24, 2026
08b5e34
Disable spellcheck on crypto-secret wallet inputs
cursoragent Sep 24, 2026
c730443
Add login seed recovery flow with rate-limited backend
cursoragent Sep 24, 2026
ea7085e
Fix login recover-seed routing with login layout outlet
cursoragent Sep 24, 2026
67692ea
Fix recover rate limit: 429 only on subsequent requests after N failures
cursoragent Sep 24, 2026
e397ffc
feat(node-ui): Phase 4 passphrase recovery UX gates
cursoragent Sep 24, 2026
2ed1e52
refactor(node-api): generic in-process rate limit for recovery
cursoragent Sep 24, 2026
46b6fd1
refactor(rate-limit): commons base + HTTPRateLimiter decorator
cursoragent Sep 24, 2026
39fb312
[NodeAPI] improve recovery checks
GuillaumeDSM Sep 24, 2026
2132ea7
[Node] show wallet name at login & recovery
GuillaumeDSM Sep 25, 2026
6a2646b
[Logs] add node & scheduler init logs
GuillaumeDSM Sep 25, 2026
b296ce3
[Node] rate limit authentication
GuillaumeDSM Sep 25, 2026
dda44d9
[Node] show rate limit duration in UI
GuillaumeDSM Sep 25, 2026
501894b
[Node] update guides links
GuillaumeDSM Sep 28, 2026
144e74b
[Binary] remove gevent hiddenimports
GuillaumeDSM Sep 28, 2026
e6a1a17
[Binary] update to pyinstaller 6.22.3
GuillaumeDSM Sep 28, 2026
fc7fee2
[Binary] fix web3 import metadata
GuillaumeDSM Sep 28, 2026
d3436a3
[Binary] add web deps
GuillaumeDSM Sep 28, 2026
1709a65
[Version] 3.0.0-beta3
GuillaumeDSM Sep 28, 2026
6eea4ff
[Logs] fix misleading logs & skip web notifier when no web interface
GuillaumeDSM Sep 29, 2026
0a44d37
[Exchanges] support ob_exchanges ccxt icons
GuillaumeDSM Sep 30, 2026
80e82bc
[Commons] simplify code
GuillaumeDSM Oct 1, 2026
1bb5689
[Trading] fix issnan()
GuillaumeDSM Oct 1, 2026
b69066d
[Cloud] strip UTF-8 BOM from agent-seed.env
cursoragent Oct 6, 2026
4792687
[Cloud] install the ui-node-web profile by default
cursoragent Oct 6, 2026
2ba0668
Binary testing instructions, agent-seed bootstrap scenarios and binar…
cursoragent Oct 6, 2026
4771d9e
[Flow] fix channel init issue
GuillaumeDSM Oct 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
28 changes: 28 additions & 0 deletions .cursor/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
FROM python:3.13-slim-trixie

ENV DEBIAN_FRONTEND=noninteractive
ENV CRYPTOGRAPHY_DONT_BUILD_RUST=1

RUN apt-get update \
&& apt-get install -y --no-install-recommends \
git \
sudo \
curl \
ca-certificates \
build-essential \
gcc \
binutils \
libffi-dev \
libssl-dev \
libxml2-dev \
libxslt1-dev \
libjpeg62-turbo-dev \
libopenblas-dev \
zlib1g-dev \
&& rm -rf /var/lib/apt/lists/*

RUN curl -fsSL https://deb.nodesource.com/setup_24.x | bash - \

Check warning on line 24 in .cursor/Dockerfile

View workflow job for this annotation

GitHub Actions / Build & Push Docker images (ubuntu-latest)

[hadolint] reported by reviewdog 🐶 Set the SHELL option -o pipefail before RUN with a pipe in it. If you are using /bin/sh in an alpine image or if your shell is symlinked to busybox then consider explicitly setting your SHELL to /bin/ash, or disable this check Raw Output: message:"Set the SHELL option -o pipefail before RUN with a pipe in it. If you are using /bin/sh in an alpine image or if your shell is symlinked to busybox then consider explicitly setting your SHELL to /bin/ash, or disable this check" location:{path:".cursor/Dockerfile" range:{start:{line:24 column:1}}} severity:WARNING source:{name:"hadolint" url:"https://github.com/hadolint/hadolint"} code:{value:"DL4006" url:"https://github.com/hadolint/hadolint/wiki/DL4006"}
&& apt-get install -y --no-install-recommends nodejs \
&& rm -rf /var/lib/apt/lists/*

WORKDIR /workspace
51 changes: 51 additions & 0 deletions .cursor/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# OctoBot Cursor Cloud environment

CI-parity install and validation for [Cursor Cloud Agents](https://cursor.com/docs/cloud-agent/setup).

## Profiles (`OCTOBOT_CLOUD_PROFILE`)

| Profile | Layers |
|---------|--------|
| `package-only` | L1–L3 (no tentacles install) |
| `ci-tentacles` | L1–L5 (GitHub `cloud-env-validate`) |
| `ui-node-web` | L1–L6 (**default** in `environment.json`; includes `node_web_interface` build) |

Install: `bash .cursor/cloud-install.sh` (profile via env var).

## Agent / shell usage

```bash
source .cursor/env.sh
# Python, OctoBot CLI, pytest
```

Node web UI demo (seed, debug view): skill **agent-seed** (`.cursor/skills/agent-seed/SKILL.md`).

After editing `packages/tentacles/`: `bash .cursor/reinstall-tentacles.sh` (do not edit repo-root `tentacles/`).

## Validate environment (on demand)

```bash
source .cursor/env.sh
bash .cursor/cloud-validate.sh --profile ci-tentacles --json
```

Not run from install; use after Build changes or when debugging a broken env.

## Debugging failures

| Surface | What to search |
|---------|----------------|
| Cursor Cloud Build log | `OCTOBOT_CLOUD_FAILED` or `==> [L` step markers |
| GitHub `cloud-env-validate` | Same markers; `cloud-validate.json` artifact on failure |
| Success install | `OCTOBOT_CLOUD_INSTALL_OK` |

If a dashboard environment snapshot shadows this repo config, remove the saved snapshot so committed `environment.json` wins.

## PRs and policy

- Target branch: **`dev`** (unless release flow to `master`).
- Before handoff: `python -m tools.extended_linter --base origin/dev` (match PR base ref).
- CI: **OctoBot-CI** job **`extended_linter`** (wheel + tentacles + `pytest tools/tests`; PR policy step uses `--skip-tentacles-reinstall`, no `cloud-install`). Cloud agents use **`ui-node-web`** (`environment.json`). GitHub **`cloud-env-validate`** still installs **`ci-tentacles`**.
- Agent docs: colocated `AGENTS.md` (see root index), skills **octobot-cloud** and **agent-seed** (Node UI QA).
- Plans whose title or description include **roadmap**: skill **cloud-roadmap** (`.cursor/skills/cloud-roadmap/SKILL.md`) before `CreatePlan`; execution uses **octobot-cloud**.
2 changes: 2 additions & 0 deletions .cursor/agent-seed.env
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
OCTOBOT_AGENT_SEED_USER_FOLDER=user/agent-seed
NODE_SQLITE_FILE=user/agent-seed/tasks.db
55 changes: 55 additions & 0 deletions .cursor/cloud-install.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
#!/usr/bin/env bash
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/cloud-shell-lib.sh"
cloud_lib_init "cloud-install.sh"

echo "OCTOBOT_CLOUD_PROFILE=${CLOUD_PROFILE}"
log_step "INIT" "repo=${REPO_ROOT}"

if cloud_profile_includes_layer "L1"; then
log_step "L1" "Toolchain (Pants, optional Rust)"
if ! command -v pants >/dev/null 2>&1; then
curl --proto '=https' --tlsv1.2 -fsSL https://static.pantsbuild.org/setup/get-pants.sh | bash
fi
export PATH="${HOME}/.local/bin:${PATH}"
if compgen -G "packages/*/crates/*/Cargo.toml" >/dev/null 2>&1; then
if ! command -v cargo >/dev/null 2>&1; then
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable
# shellcheck disable=SC1091
source "${HOME}/.cargo/env"
fi
fi
fi

if cloud_profile_includes_layer "L2"; then
log_step "L2" "Pants package OctoBot wheel"
export PATH="${HOME}/.local/bin:${PATH}"
pants package :OctoBot $(pants list --filter-target-type=package_shell_command ::)
fi

if cloud_profile_includes_layer "L3"; then
log_step "L3" "Python venv and OctoBot wheel"
python3 -m venv "${REPO_ROOT}/.cursor/venv"
cloud_write_env_files
# shellcheck disable=SC1091
source "${REPO_ROOT}/.cursor/env.sh"
pip install --upgrade pip setuptools wheel
pip install -r dev_requirements.txt
pip install dist/*.whl
if compgen -G "packages/*/crates/*/Cargo.toml" >/dev/null 2>&1; then
pip install maturin
fi
fi

if cloud_profile_includes_layer "L4"; then
cloud_npm_client_build
fi

if cloud_profile_includes_layer "L5"; then
cloud_tentacles_pack_and_install
fi

if [[ "${CLOUD_PROFILE}" == "ui-node-web" ]]; then
cloud_node_web_interface_build
fi

echo "OCTOBOT_CLOUD_INSTALL_OK profile=${CLOUD_PROFILE}"
109 changes: 109 additions & 0 deletions .cursor/cloud-shell-lib.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
# Shared helpers for OctoBot Cursor Cloud shell scripts.
# shellcheck shell=bash

cloud_lib_init() {
local script_name="$1"
CLOUD_SCRIPT_NAME="$script_name"
set -euo pipefail
CLOUD_LIB_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "${CLOUD_LIB_DIR}/.." && pwd)"
cd "${REPO_ROOT}"
CLOUD_PROFILE="${OCTOBOT_CLOUD_PROFILE:-ci-tentacles}"
CLOUD_LAST_LOG_TAIL=""
trap 'cloud_err_trap' ERR
}

log_step() {
local step_id="$1"
local message="$2"
echo "==> [${step_id}] ${message}"
}

die() {
local step_id="$1"
local message="$2"
echo "OCTOBOT_CLOUD_FAILED script=${CLOUD_SCRIPT_NAME} step=${step_id} profile=${CLOUD_PROFILE} message=${message}" >&2
if [[ -n "${CLOUD_LAST_LOG_TAIL}" && -f "${CLOUD_LAST_LOG_TAIL}" ]]; then
echo "--- last command output (tail) ---" >&2
tail -n 30 "${CLOUD_LAST_LOG_TAIL}" >&2 || true
fi
exit 1
}

cloud_err_trap() {
local step_id="${CLOUD_TRAP_STEP:-ERR}"
die "${step_id}" "command failed: ${BASH_COMMAND}"
}

cloud_profile_includes_layer() {
local layer="$1"
case "${CLOUD_PROFILE}" in
package-only)
[[ "${layer}" == "L1" || "${layer}" == "L2" || "${layer}" == "L3" ]] && return 0
return 1
;;
ci-tentacles)
[[ "${layer}" == "L6" ]] && return 1
return 0
;;
ui-node-web)
return 0
;;
*)
die "INIT" "unknown OCTOBOT_CLOUD_PROFILE=${CLOUD_PROFILE}"
;;
esac
}

cloud_write_env_files() {
log_step "ENV_FILES" "Writing .cursor/env.sh and .cursor/pythonpath.sh"
cat >"${REPO_ROOT}/.cursor/env.sh" <<EOF
# Generated by cloud-install.sh — source before Python, OctoBot, pytest
export OCTOBOT_REPO_ROOT="${REPO_ROOT}"
export OCTOBOT_CLOUD_VENV="${REPO_ROOT}/.cursor/venv"
export DISABLE_SENTRY=True
# Prefer the repo-pinned Node (.nvmrc) over any platform-provided node earlier in PATH.
# Prepended before the venv so the venv still wins for python/OctoBot below.
_octobot_nvmrc_major="\$(tr -dc '0-9.' < "${REPO_ROOT}/.nvmrc" 2>/dev/null | cut -d. -f1)"
for _octobot_node in /usr/bin/node /usr/local/bin/node; do
if [ -x "\$_octobot_node" ]; then
_octobot_node_major="\$("\$_octobot_node" --version 2>/dev/null | tr -dc '0-9.' | cut -d. -f1)"
if [ -n "\$_octobot_nvmrc_major" ] && [ "\$_octobot_node_major" = "\$_octobot_nvmrc_major" ]; then
export PATH="\$(dirname "\$_octobot_node"):\${PATH}"
break
fi
fi
done
unset _octobot_nvmrc_major _octobot_node _octobot_node_major
# venv bin must remain first so python/OctoBot resolve to the OctoBot venv.
export PATH="\${OCTOBOT_CLOUD_VENV}/bin:\${PATH}"
EOF
cat >"${REPO_ROOT}/.cursor/pythonpath.sh" <<'EOF'
# For packages/node, packages/flow, packages/copy tests from repo root (matches CI)
export PYTHONPATH=".:${PYTHONPATH:-}"
EOF
}

cloud_tentacles_pack_and_install() {
log_step "TENTACLES_PACK" "OctoBot tentacles pack from packages/tentacles"
mkdir -p "${REPO_ROOT}/output"
export ALLOW_UNSIGNED_TENTACLES=true
# shellcheck disable=SC1091
source "${REPO_ROOT}/.cursor/env.sh"
# -p is package filename only; default output_dir is output/ (see main.yml tentacles install)
OctoBot tentacles -d packages/tentacles -p any_platform.zip
log_step "TENTACLES_INSTALL" "OctoBot tentacles install to repo root"
OctoBot tentacles --install --location output/any_platform.zip --all
}

cloud_npm_client_build() {
log_step "L4" "npm ci and build octobot_client_ts"
npm ci
npm run build -w packages/client/octobot_client_ts
}

cloud_node_web_interface_build() {
local ui_dir="${REPO_ROOT}/packages/tentacles/Services/Interfaces/node_web_interface"
log_step "L6" "npm ci and build node_web_interface"
(cd "${ui_dir}" && npm ci && npm run build)
}
Loading
Loading