Commit Graph
1582 Commits
Author SHA1 Message Date
Duy /zuey/ ef829c1ab4 fix(bitrix24): resolve PR 8-10 stack findings
Resolve the PR #8/#9/#10 stack on current dev, including Bitrix24 install callback hardening, migration renumbering, duplicate-domain fail-closed routing, UI textarea/mobile cleanup, and review hardening.
2026-05-22 20:53:01 +07:00
Duy /zuey/ faa195156e feat(ci): deploy zuey beta releases (#40)
* feat(ci): deploy zuey beta releases

Add automatic zuey VPS deployment to the dev beta release workflow after prerelease assets are published. Publish beta checksums and make the host upgrade script tolerate beta asset naming and checksum fallback.

* fix(deploy): allow active beta release reruns

Treat an existing target release as success only when it is already the active release and still contains the expected binary and migrations. This keeps automated beta deploy reruns from failing after a prior successful deploy while preserving fail-closed behavior for stale or partial release directories.
2026-05-22 19:49:43 +07:00
Duy /zuey/ 81d96ae014 feat(skills): clarify access modes and repair file paths (#31)
* feat(skills): add bulk management actions

* feat(skills): improve operations UX

* feat(skills): clarify access modes and repair file paths
2026-05-21 16:37:50 +07:00
Duy /zuey/ 56e227c403 feat(api): unblock goclaw-cli P6 trace follow and provider reconnect (#37)
* feat(api): unblock trace follow and provider reconnect

* test(cron): stabilize run log execution test
2026-05-21 16:37:19 +07:00
Duy /zuey/ e51fe80212 fix(http): harden automation API contracts (#36) 2026-05-20 22:17:13 +07:00
Duy /zuey/ ce5ea10d46 fix(runtime): repair package installs, archives, logs, and telegram startup
Merge runtime/package install fixes, archive attachment handling, operator log access, and Telegram startup IPv4 fallback.
2026-05-20 21:26:10 +07:00
Duy /zuey/ 532ff91d8e fix(security): harden upstream critical surfaces (#32)
* fix(security): harden upstream critical surfaces

Refs #30

* fix(security): close pre-landing review gaps

Refs #30

* fix(security): close official release blockers
2026-05-20 16:33:49 +07:00
Duy /zuey/ 2a48e62c6b feat(skills): add bulk management actions
Adds Skills bulk actions, Grant all agents support, header-level skill version selector, and upload write validation.
2026-05-19 18:31:29 +07:00
Duy /zuey/ 1858cebe9c feat(skills): add management metadata and deeplinks
Closes #26
2026-05-19 16:35:56 +07:00
Duy /zuey/ 328cbf3d61 Merge pull request #25 from digitopvn/codex/securecli-openrouter-alias
fix(secure-cli): resolve runtime npm binary aliases
2026-05-19 10:23:14 +07:00
Duy /zuey/ 951733c136 Merge pull request #24 from digitopvn/codex/feat-wait-tool
feat(tools): add built-in wait tool
2026-05-19 09:57:42 +07:00
Goon a08c626867 fix(secure-cli): resolve runtime npm binary aliases 2026-05-19 09:54:21 +07:00
Goon f55ea3dc26 fix(pipeline): remove BOM from deps source 2026-05-19 09:45:50 +07:00
Goon 703c0b2df0 fix(config): remove BOM from channels config 2026-05-19 09:28:13 +07:00
Goon ed558e6f89 merge: bring dev into wait tool branch 2026-05-19 09:18:29 +07:00
Duy Nguyen d48ae43e4f feat(tools): add built-in wait tool 2026-05-19 06:53:45 +07:00
Duy /zuey/ 069f984f2f Merge pull request #19 from digitopvn/fix/github-installer-runtime-bin
fix(packages): use runtime dir for GitHub binaries
2026-05-19 06:51:22 +07:00
Duy Nguyen c174279e01 fix(packages): use runtime dir for GitHub binaries 2026-05-18 21:43:03 +07:00
Duy /zuey/ 077e81c990 Merge pull request #16 from digitopvn/fix/skill-grants-tenant-scope
fix(skills): enforce tenant scope on agent grants
2026-05-18 20:50:02 +07:00
Duy Nguyen 8ef8fc4f73 fix(skills): scope agent grant status joins 2026-05-18 20:44:45 +07:00
Duy /zuey/ 52aa110e1f feat(providers): default ChatGPT OAuth to GPT-5.5
Default ChatGPT Subscription (OAuth) provider model selection to GPT-5.5 and update model metadata, tests, and docs.
2026-05-18 20:33:40 +07:00
Duy /zuey/ 134cc7119f docs(deployment): document codex service user auth (#17) 2026-05-18 20:23:41 +07:00
Goon 2686a6c989 docs: add skill grants beta ship journal 2026-05-18 17:43:25 +07:00
Goon 3a62bb50e8 fix(skills): enforce tenant scope on agent grants
Reject cross-tenant skill grant and revoke operations before grant rows or skill visibility can be changed. Clean legacy invalid grant rows in PostgreSQL and SQLite migrations, hide owner IDs from skill API/UI responses, and cover the tenant-isolation cases with PG and SQLite regression tests.
2026-05-18 17:40:41 +07:00
Goon 8f5aad5c07 Merge remote-tracking branch 'origin/dev' into fix/skill-grants-tenant-scope 2026-05-18 17:18:19 +07:00
Goon 99460a7f8a fix(packages): repack npm fallback without scripts
Create sanitized npm tarballs directly in Go so workspace dependency fallback does not run package lifecycle scripts or create global symlinks to temporary folders.
2026-05-18 16:04:12 +07:00
Goon d8fdf8fcd3 fix(packages): install sanitized npm tarballs
Avoid npm global symlinks to temporary fallback directories by repacking rewritten workspace dependency packages before install.
2026-05-18 15:58:57 +07:00
Goon 1de07cf8c4 fix(packages): support npm workspace dependency installs
Retry npm global installs that fail on workspace protocol dependencies by packing the registry tarball, rewriting workspace ranges to published versions, and installing the sanitized package folder.
2026-05-18 15:53:42 +07:00
Goon b377282164 Merge branch 'dev' of github.com:digitopvn/goclaw into dev 2026-05-18 13:13:47 +07:00
Goon 27cf2d2a20 chore: codex AGENTS.md 2026-05-18 13:13:42 +07:00
Duy Nguyen a33de08119 fix(packages): support bare-metal runtime installs 2026-05-18 06:56:17 +07:00
Duy Nguyen f09b08e44f feat(gateway): add remote release upgrade trigger 2026-05-18 06:56:17 +07:00
Duy Nguyen 0d6c5bbb7c fix(skills): add agent manage grants
Add explicit per-agent manage grants for skills so granted agents can patch/delete skills when ownership identity drifts.

Expose skill owner and manage-grant controls in the web skills UI, and add PostgreSQL/SQLite migrations plus coverage for preserve/revoke behavior.
2026-05-17 23:15:52 +07:00
Duy /zuey/ ba3b535286 fix(agents): handle null JSON config updates (#13)
* fix(agents): handle null JSON config updates

* docs(changelog): note agent provider switch fix

* docs(journal): record agent provider switch fix
2026-05-17 22:34:19 +07:00
Duy Nguyen 0b6ecdecfe docs(deploy): add sanitized VPS deployment runbook 2026-05-17 20:47:33 +07:00
Duy Nguyen 3084896dc3 fix(ci): publish beta release without checkout 2026-05-17 20:11:11 +07:00
Duy Nguyen d931dc04a3 fix(ci): allow ghcr-only beta releases 2026-05-17 18:57:54 +07:00
Duy Nguyen 6a253c46ca fix(test): stabilize ci unit tests 2026-05-17 18:47:46 +07:00
Duy Nguyen 9a6fd2dec9 feat(ci): automate dev beta releases 2026-05-17 18:36:13 +07:00
Duy Nguyen d57d3810e4 fix(cli-credentials): clarify agent grant env controls 2026-05-17 18:01:41 +07:00
Duy Nguyen f1277af8c9 style(protocol): format method constants 2026-05-17 17:20:50 +07:00
Duy Nguyen 9a3aad51ba chore(repo): add agent instructions and ignore backups 2026-05-17 17:07:50 +07:00
Duy Nguyen 506e96cd63 feat(agents): add model fallback configuration 2026-05-17 15:51:56 +07:00
Duy Nguyen 5a189330f9 fix(test): support windows test execution 2026-05-17 15:33:55 +07:00
Duy Nguyen 2fa715ba4e fix(context): share agent scoped context data 2026-05-17 15:33:27 +07:00
Duy Nguyen 536ab4ac6c feat(permissions): add agent channel permission matrix 2026-05-17 15:09:49 +07:00
Duy Nguyen c029e4f6bf feat(cli-credentials): support per-agent env grants
- enforce binary/grant parent checks on nested grant routes
- validate grant binary/agent tenant scope on create
- fail closed on invalid per-user env and preserve per-user precedence
- remove duplicate CLI Credentials sidebar entry while keeping Packages tab route
- refs #12
2026-05-17 14:35:34 +07:00
Duy /zuey/ 425cecb9a3 feat(packages): Phase 2b — apk update flow + pkg-helper v2 protocol (#900) (#7)
* feat(packages): add apk update flow + pkg-helper v2 protocol

- APK update checker/executor via helper IPC (runtime detection, upgrade scan via apk list --upgradable)
- BREAKING: pkg-helper v2 protocol (5 actions: check_apk/check_pip/check_npm/exec_apk/exec_pip, code/data fields, renewable 10min deadline, apkMutex, 1MB scanner)
- Edition gating: SupportsApk + IsAlpineRuntime double-gate (Standard/Full only)
- Backend 3-branch wiring: alpine/apt/yum routes + update_registry, dep_installer helpers
- i18n: 5 apk keys (EN/VI/ZH catalogs)
- Frontend: source pill Alpine badge, APK in updates-list/summary-bar/update-all modal
- E2E tests: apk_e2e build tag covering checker/executor/helper protocol
- Docs: packages-apk.md, security/changelog updates
- Plans + reports under plans/260417-1500-packages-update-phase2b-apk-pkghelper/ + plans/reports/

* docs(packages): journal Phase 2b apk + pkg-helper v2
2026-05-11 15:41:27 +07:00
Duy /zuey/ 6e5e51a18b feat(packages): Phase 2a — pip + npm update flow (#900) (#6)
* feat(packages): backend pip + npm update flow (#900)

Extend Phase 1 update infrastructure to pip + npm sources. Register
checkers/executors behind edition gate (Lite edition stays github-only).
Per-source sentinel errors + stderr classifier; strict package-name
validators reject @version suffix. Shared PackageLocker serializes
install + update paths. HTTP response surfaces per-source availability
from LookPath detection.

Closes part of #900 (Phase 2a).

* feat(packages): frontend multi-source updates UI (#900)

Unified flat updates list with source pill (github/pip/npm) + filter
dropdown. Summary bar shows per-source counts, hiding sources whose
backend availability=false. 30 i18n keys with full en/vi/zh parity.
Mobile-safe table (overflow-x-auto + min-w-[600px]).

Part of #900 (Phase 2a).

* test(packages): pip + npm integration e2e (#900)

Optional real-runtime integration test behind `pipnpm_e2e` build tag.
Skipped by default CI; exercises full check + apply cycle with real
pip3/npm in Alpine container.

Part of #900 (Phase 2a).

* docs(packages): document pip + npm update flow (#900)

Adds packages-pip-npm.md covering command matrix, exit codes, stderr
error classes, pre-release handling, availability detection, runbook
for EACCES/ERESOLVE/externally-managed, min versions, fixture regen.
Cross-link from packages-github.md. Changelogs updated.

Part of #900 (Phase 2a).

* fix(packages): set exec bit on testdata npm/pip scripts
2026-05-11 15:31:32 +07:00
Duy /zuey/ 4472c607b8 feat(workstation): Remote Workstation Runtime — SSH exec + security + audit (#4)
* feat(packages): add update flow for GitHub binaries (#900)

Closes #900. Proactive update-check + atomic swap for GitHub-installed
binaries on the Runtime & Packages page. Interfaces prepared for pip/npm/apk
extension in Phase 2.

- UpdateCache + UpdateRegistry + PackageLocker (ctx-aware keyed mutex)
- GitHubUpdateChecker: ETag-aware, distinct /latest vs /list ETag keys,
  semver-correct ordering via golang.org/x/mod/semver, non-semver fallback
  that refuses to downgrade, pre-release + stable candidate fusion for
  the v1.0.0-rc.1 -> v1.0.0 transition
- GitHubUpdateExecutor: two-phase .bak swap with hadBackup-aware rollback,
  manifest save retry (3x, 100ms/500ms/1s backoff), nil-safe meta access,
  explicit ScratchDir, 0755 set pre-rename
- HTTP: GET /v1/packages/updates (SWR), POST /v1/packages/updates/refresh,
  POST /v1/packages/update, POST /v1/packages/updates/apply-all
  (always 200, failed[] is error source). Master-scope gated.
- WS events package.update.{checked,started,succeeded,failed} forwarded to
  owner clients via event_filter.go
- Frontend: useUpdates hook + 3 components (summary bar, update-all modal,
  row button), master-scope-gated disabled state
- i18n: 8 backend keys + 17 frontend keys x en/vi/zh
- Config: packages.github_token (reserved), updates_check_ttl, scratch_dir
- 45+ new tests, race-clean, BenchmarkCheckAll10Packages ~1.1ms/op warm

* docs(packages): document update flow + Phase 1 completion

- packages-github.md: "Updating Installed Packages" section with UI + API
  contract, troubleshooting runbook (corrupt cache, rate-limit, scratch dir,
  mid-swap recovery)
- 17-changelog.md + CHANGELOG.md: Phase 1 entry
- 14-skills-runtime.md: cross-ref to update flow
- journal entry capturing CRIT fixes (double-write, lock-key mismatch,
  rollback false-alarm) + design wins (keyed locks, red-team pre-flight)

* feat(workstation): remote workstation runtime — SSH exec + security + audit

Adds generic Remote Workstation Runtime enabling agents to execute commands
on user-owned SSH workstations. Includes registry (DB + API + UI), SSH backend
with connection pool and circuit breaker, workstation.exec + claude_remote tools,
NFKC + binary-name allowlist security, and audit logging.

Standard edition only. Closes #941.

* fix(workstation): address 3 critical + 5 important code review findings

- C1: Add json:"-" to Metadata/DefaultEnv fields; use SanitizedView() in
  all API responses to prevent SSH private key leakage
- C2: Wire CheckEnv into PermCheckFn; LD_PRELOAD/PATH injection now blocked
- C3: SSH Setenv fallback — prepend `export K=V;` when server rejects Setenv
- I1: BackendCache sync.RWMutex → sync.Mutex (fix data race on lastUsed)
- I2: Validate metadata shape in handleUpdate before store write
- I3: Include command in exec-done event; activity sink uses actual cmd hash
- I4: Wrap pool release in sync.Once (idempotent double-call safety)
- I5: Verify workstation tenant ownership before adding permissions

* fix(packages): bypass HTTPS+IP validation in update executor tests

Test httptest servers bind to http://127.0.0.1 which fails both the
HTTPS scheme check and literal-IP SSRF guard. Add testSkipDownloadValidation
flag (same pattern as existing withTestDownloadHosts) to skip full URL
validation in test context.

* fix(workstation): address Claude review findings — tenant isolation + pool leak + dead code

- Activity list: add workstation ownership check before listing
  (prevents cross-tenant activity enumeration via known UUID)
- SSH pool: clean up p.sem + p.circuits maps in CloseWorkstation,
  prune, and Close to prevent unbounded map growth
- RPC handlers: return ErrInvalidRequest on JSON unmarshal failure
  instead of silently using zero-value params
- Remove unused containsControlChars function in normalize.go
- HTTP tests: add 10s context timeout to prevent CI package timeout

* fix(workstation): DefaultEnv JSON parse, backend cache leak, perm ownership check

- DefaultEnv: replace KEY=VALUE text parse with json.Unmarshal (stored as
  JSON by HTTP handler, was silently ignored)
- BackendCache: close losing backend on concurrent cache miss to prevent
  pruneLoop goroutine leak
- Backend interface: add Close() error method; SSHBackend delegates to
  pool.Close()
- handlePermList: add wsStore.GetByID ownership check (prevents cross-tenant
  UUID enumeration returning empty array vs 404)
- scanRows: log scan errors instead of silently skipping

* fix(workstation): wire activity sink shutdown + remove misleading comment

- WireActivitySink: capture cleanup func, register in gateway shutdown
  (was discarded → retention goroutine leaked + buffered rows lost)
- Add Stop() to WorkstationActivityStore interface (PG+SQLite already had it)
- wireWorkstationTools returns cleanup func; gateway.go defers it
- Remove misleading "re-validate env" comment in allowlist.go Check()

* ci: bump unit test timeout from 90s to 120s

hooks/handlers package (goja script tests) consumes ~85s on cold CI
runners, leaving insufficient headroom for HTTP retry tests with 1s
backoff. 120s provides adequate breathing room without masking real
deadlocks.

* fix: compile errors in integration tests + allowlist docstring

- packages_update_test: add missing lockKey arg to registry.Apply
- mcp_grant_revoke_test: remove unused fakeMCPClient struct
- allowlist.go: fix Check() docstring to match actual 3-step pipeline

* fix(test): relax mcp grant revoke assertion for pre-Phase02 state

Execute-time grant checking not yet wired — test correctly gets an
error but the message is "no active client" (nil clientPtr) rather
than "grant revoked". Accept any error as valid regression guard.

* chore: trigger CI on digitopvn/goclaw fork

* ci: retrigger workflows

* fix(permissions): classify workstation methods in RBAC policy
2026-05-11 14:58:19 +07:00