Commit Graph
198 Commits
Author SHA1 Message Date
Sycun 0d931569be feat: carry the release version across an update, so the header matches the code
The repository's config.example.yaml ships the release version this code was cut
from (upstream bumps it in the release commit: v1.7.21's config.example says
v1.7.21), while the live config.yaml is operator data that no merge ever touches.
So after an update the header badge - and the ?v= on every static asset - kept
saying the version the installation was born with while the tree already ran
newer code.

An update, an adoption, or a rollback now keeps the two together: after the merge
the update reads the version the new code carries (config.example.yaml) and writes
it into the live config's version field - that one line, temp file plus atomic
rename, everything else byte-for-byte preserved, and only when the value actually
differs. The job log records the change (the page shows the step), and the state
file records both numbers so a rollback puts the old version back with the old
code; a number hand-edited after the update is the operator's and is left alone.
The side effect worth naming: the version bump also changes the ?v= query on
static assets, so a browser stops serving the pre-update JavaScript.

Trees without a live config or without a shipped version are left untouched -
a source checkout has nothing to sync, and nothing is ever guessed.

internal/config gains the two focused helpers (FileVersion / WriteVersion, line
level like the tarball upgrade path always did); tests pin the replace, the
insert-when-absent, byte preservation, the mode, the malformed-value refusal, and
the update/adopt/rollback/leave-alone behaviours end to end.
2026-10-08 13:57:11 +08:00
Sycun 94a18263b9 feat: make the update source one repository address, the official repo by default
The update source used to be three things - a remote name or an address, plus an
optional branch - and unset it followed whatever this directory's remotes and
upstream happened to say. That asked people to understand git topology before
they could update, and the person it was built for could not tell what "follow
the remote this tree tracks" meant. It is now one field: config.yaml update.repo,
an address, empty meaning the official repository
(https://github.com/AIPentest/CyberStrikeAI.git). Point it at a mirror (GitHub is
hard to reach in some places) or at your own fork and that is the whole
configuration.

The branch nothing is any more: an update follows the source repository's own
default branch, resolved from the source itself (ls-remote --symref HEAD), so a
fork whose default is not "main" still works and nobody has to name a branch.
Remote names, the mine/origin/upstream ranking, @{upstream} tracking and the
adopt flow's branch argument are all gone with it.

The console page loses two input fields: the source section is one address, a
hint that empty means the official repository, and a save button; clearing the
address is the way back to the default. The install facts drop the remote name,
the check section shows the source's default branch once the network answer
arrives, and the adopt entry no longer requires saving an address first - the
official default makes connecting a tarball install a zero-configuration action.

The CLI now reads the same update.repo field the page saves (LoadUpdateRepo reads
just that field, without validating the rest of the file - a broken unrelated
section must not block the path that fixes the tree), so the keyboard and the
button cannot update from different repositories. -check-update prints the source
it is about to use.

Tests: the source suite now pins the default (official), the single-address save
(including the empty-string reset), and that the followed branch comes from the
source's own default branch rather than a hardcoded "main"; the console suite
posts the one field and renders the default hint; docs, config.example.yaml and
upgrade.sh describe the one-field story.
2026-10-08 13:46:14 +08:00
Sycun cbd8073beb feat: move the one-click update into the system settings menu
The update console stops being a page of its own and becomes the last section
of 系统设置 (data-section="update", gated by update:read): the sidebar entry
and page-system-update are gone, the console markup lives in
settings-section-update, and the settings menu is where an operator now finds
it. #system-update keeps working as an alias - both hash parsers normalize it
to settings + the update section - so existing deep links and docs keep landing.

Polling follows the new home: leaving the settings page (router) or switching
to another section (settings.js) stops it, selecting the section loads the
console, and returning to the settings page with the section still selected
re-reads the install tree and re-arms the poller (a frozen progress read is
the "nothing is happening" picture an operator must never be shown).

The guard suite follows the move: the old nav/page assertions become "must not
exist", the new ones pin the section, the alias, the poller handoff and the
retired nav.systemUpdate key (settings.nav.update replaces it in zh/EN/RU).
README and both developer/deployment guides say 系统设置 → 一键更新.
2026-10-07 22:52:56 +08:00
Sycun 27c1ff6573 feat: give the update source a page, and the adopt flow its preview
The console page grows an update-source section: what is in effect and where it
comes from (config.yaml or the tree's own tracking), an edit form for the three
fields, and - for a directory that is not a git installation - the adopt entry.
Adopt is preview-first: the plan lists what would be replaced and what would be
kept, the confirm dialog carries the counts, and the restart tick is the same one
an update uses. A refused save shows the server's own sentence (a remote name and
an address together, an ext:: address) instead of a generic failure, and the typed
values survive the failed save and the polling redraws.

zh/EN/RU dictionaries carry the 27 new keys; the console page's contract tests
grow to 29 (source rendering and save body, the refusal path, adopt gating by
installation kind, preview-then-confirm); docs/README describe choosing a source
and connecting an unpacked installation.
2026-10-07 12:49:15 +08:00
Sycun dc5c4d6a75 fix: build the server through the package, not one file
The CLI now lives in two files (main.go and update_cli.go), so
`go build cmd/server/main.go` compiles only main.go and leaves
updateCommandIfNeeded undefined - which is exactly how run.sh (twice) and both
READMEs built. `go build ./cmd/server` compiles the whole package; run.sh's
rebuild check already scans internal/ and cmd/ for newer sources, so nothing
else needed adjusting.
2026-10-07 12:11:50 +08:00
Sycun cb8bc6b824 feat: update this installation's own source in one action
An operator running a fork has no honest way to upgrade: upgrade.sh downloads the
Release tarball of one hard-coded third-party repository and rsyncs it over the
tree, so "upgrade" means "overwrite yourself with somebody else's code", and the
safe alternative is to pull by hand and remember the build command.

internal/update drives the remote the directory already tracks: fetch, fast-forward,
go build into .update-staging, atomic rename of the binary (the previous one kept as
cyberstrike-ai.prev), and a .update-state.json so a rollback has a target that is
not guessed at. Refusals are the point - local source edits and a diverged branch
stop with the file names and commit counts in the error rather than being reset to
match, and operator-owned content (roles/skills/tools/agents/data/config.yaml) is put
aside before the merge and restored over it, with what was kept listed in keptContent
instead of quietly dropped.

Consumers: GET/POST /api/system/update* behind update:read / update:apply (mutations
are process-global, so they need a global-scope session); a console page at
#system-update with an apply button that names why it is blocked, a job polled from
the server and a rollback control; the same three actions as -check-update / -update
/ -update-rollback on the binary; OpenAPI entries for all five endpoints. Permission
gating no longer re-enables a control a page disabled for a reason of its own
(data-state-disabled), which every state-disabled, permission-gated button in the
console was subject to. upgrade.sh becomes a thin shell over the same implementation
and only falls back to the tarball path for installs that are not git work trees.

Docs and the zh/EN/RU dictionaries are updated. The package runs 13 tests against
real temporary git repositories; the HTTP layer, RBAC and the console page each
carry their own contract tests.
2026-10-07 12:07:26 +08:00
Ed1s0nZ e9b6e0d86e docs: update WeCom group QR references 2026-09-23 18:02:00 +08:00
Ed1s0nZ f7882be546 feat: manage task process lifetimes and preserve turn history 2026-09-16 17:52:58 +08:00
Ed1s0nZ eca26f0e4d docs: remove sponsorship content and QR image 2026-09-14 13:48:42 +08:00
Ed1s0nZ 6ad9ea2d13 feat: add configurable tool call blocking and monitoring 2026-09-08 09:44:32 +08:00
temp c70da22de7 Remove conversation grouping feature 2026-08-26 15:00:09 +08:00
公明 f285d47404 Add files via upload 2026-07-23 19:14:09 +08:00
公明 c4a56c1ada Add files via upload 2026-07-21 21:04:53 +08:00
公明 ef2c3474fe Add files via upload 2026-07-20 16:54:50 +08:00
公明 c915abf310 Add files via upload 2026-07-17 17:17:10 +08:00
公明 4349742b12 Add files via upload 2026-07-16 21:37:30 +08:00
公明 4df916cfc5 Update README.md 2026-07-14 17:59:03 +08:00
公明 16be9edf51 Update README.md 2026-07-14 17:58:32 +08:00
公明 7d73530538 Update README.md 2026-07-14 17:58:07 +08:00
公明 10e606742b Update README.md 2026-07-14 17:57:36 +08:00
公明 2924d6636c Add files via upload 2026-07-14 15:11:50 +08:00
公明 f77cc09477 Add files via upload 2026-07-13 17:25:30 +08:00
公明 5423bd5e1e Add files via upload 2026-07-13 17:22:31 +08:00
公明 a64c18df6d Add files via upload 2026-07-13 17:12:48 +08:00
公明 23ec222b77 Add files via upload 2026-07-13 16:53:08 +08:00
公明 1cf10981ef Add files via upload 2026-07-11 11:30:50 +08:00
公明 c33e5f2026 Add files via upload 2026-07-10 21:35:49 +08:00
公明 7522bab98c Add files via upload 2026-07-08 15:28:38 +08:00
公明 cdd1894737 Add files via upload 2026-07-07 14:20:55 +08:00
公明 caf4cf61c1 Add files via upload 2026-07-07 14:06:29 +08:00
公明 00802a275c Add files via upload 2026-07-07 14:04:18 +08:00
公明 60ba6b8eb3 Add files via upload 2026-07-07 11:48:53 +08:00
公明 1dc43083b0 Add files via upload 2026-07-06 16:20:29 +08:00
公明 33d6f8bb0c Add files via upload 2026-07-06 14:56:46 +08:00
公明 4af5e2691e Update README.md 2026-07-03 19:35:28 +08:00
公明 a3739210e4 Add files via upload 2026-07-03 17:10:03 +08:00
公明 1ff2df68ac Add files via upload 2026-07-02 23:32:48 +08:00
公明 7e764df0e8 Add files via upload 2026-07-02 18:02:45 +08:00
公明 926491b746 Add files via upload 2026-07-02 12:08:14 +08:00
公明 d9ed36cfb1 Add files via upload 2026-06-20 19:45:29 +08:00
公明 508de5fad0 Add files via upload 2026-06-18 12:47:24 +08:00
公明 96ccbff77c Add files via upload 2026-06-12 21:28:51 +08:00
公明 9857003018 Add files via upload 2026-06-11 01:38:25 +08:00
公明 c2892ccd33 Add files via upload 2026-06-08 15:55:03 +08:00
公明 3a6bc60276 Add files via upload 2026-06-03 17:09:56 +08:00
公明 b8b1e8431b Add files via upload 2026-06-02 13:34:12 +08:00
公明 44ced98863 Add files via upload 2026-05-26 14:24:32 +08:00
公明 9b82f265fd Add files via upload 2026-05-20 18:24:17 +08:00
公明 d961ba1ec7 Add files via upload 2026-05-15 11:43:33 +08:00
公明 4a11ba8f14 Add files via upload 2026-05-13 10:40:56 +08:00