Duy /zuey/
10e663f21d
Merge pull request #120 from digitopvn/codex/issue-117-agent-scoped-git-credentials-plan
...
feat(cli-credentials): add agent-scoped git credentials
2026-05-31 17:40:50 +07:00
Goon
994acfe3a4
feat(cli-credentials): add agent-scoped git credentials
2026-05-31 16:49:23 +07:00
Goon
32273f04d3
feat(channels): use generated quick ack progress
2026-05-31 16:19:23 +07:00
Goon
d78f97b9d7
feat(channel-memory): merge dev for passive extraction
2026-05-31 14:01:29 +07:00
Duy /zuey/
2cd750ac44
feat(channels): add context capability admin surface
...
Squash merge PR #115 after resolving changelog and SQLite migration-map conflicts with current dev. Renumbered channel-context PostgreSQL migration to 000075 and bumped PG required schema to 75 plus SQLite schema to 44 so it follows the run timeline migration. Local checks passed: go test ./..., go build ./..., go build -tags sqliteonly ./..., go vet ./..., and pnpm -C ui/web build. PR CI run 26705617311 passed release-versioning, go, and web.
2026-05-31 13:50:31 +07:00
Duy /zuey/
2a523e3f97
feat: add group chat context prompt
...
Squash merge PR #114 after resolving changelog and pipeline input conflicts with current dev. Local checks passed: go test ./internal/agent ./cmd ./internal/channels/..., go build ./..., go build -tags sqliteonly ./..., and go vet ./.... PR CI run 26705332779 passed release-versioning, go, and web.
2026-05-31 13:35:04 +07:00
Duy /zuey/
269e2618ae
feat: add archived run timeline
...
Squash merge PR #113 after resolving the project changelog conflict with current dev. Local checks passed: Go store/http/gateway/agent/pipeline tests, SQLite-tagged tests, both Go builds, web Vitest, and web build. PR CI run 26705098712 passed release-versioning, go, and web.
2026-05-31 13:22:07 +07:00
Duy /zuey/
990fabf94b
fix(config): persist shell deny group disables
...
Squash merge PR #112 after resolving the project changelog conflict with current dev. Local checks passed: config gateway tests, provider/http/tools deny-pattern tests, go build ./..., and go build -tags sqliteonly ./.... PR CI run 26704832350 passed release-versioning, go, and web.
2026-05-31 13:08:24 +07:00
Duy /zuey/
9ab3d6dfe5
feat(tools): local-first document extraction for read_document
...
Squash merge PR #111 after resolving docs/changelog conflicts. Local checks covered tools/config and both Go builds; PR CI run 26704622503 passed release-versioning, go, and web.
2026-05-31 12:55:38 +07:00
Duy /zuey/
80893a1e6c
feat(skills): add selected skill downloads
...
Squash merge PR #110 after resolving dev changelog conflict. Local checks covered Go http/store, full web test/build; PR CI run 26704448786 passed release-versioning, go, and web.
2026-05-31 12:44:29 +07:00
Duy /zuey/
1d9436350d
fix(discord): backfill thread history attachments
...
Squash merge PR #106 after resolving dev changelog conflict. PR CI run 26704244687 passed release-versioning, go, and web.
2026-05-31 12:33:15 +07:00
Duy /zuey/
df8a03df48
fix: allow skill_manage companion files
...
Squash merge PR #104 after validation.
2026-05-31 12:24:22 +07:00
Duy /zuey/
484bcc7b71
fix: harden parallel tool scheduling
...
Squash merge PR #103 after validation.
2026-05-31 12:24:00 +07:00
Duy /zuey/
4de94c1d7c
fix(telegram): repair voice transcription routing
...
Squash merge PR #102 after resolving dev changelog conflict. PR CI run 26704061639 passed release-versioning, go, and web.
2026-05-31 12:23:40 +07:00
Duy /zuey/
cf66bda618
fix(rapidapi): add cron credential diagnostics
...
Squash merge PR #101 after resolving dev conflicts and fixing cron GetJob snapshot race. PR CI run 26703877225 passed release-versioning, go, and web.
2026-05-31 12:13:14 +07:00
Duy /zuey/
4ed4eb9509
fix(sandbox): isolate tenant workspace mounts
...
Squash merge PR #100 after resolving changelog conflict with current dev. PR CI run 26703558537 passed release-versioning, go, and web.
2026-05-31 11:55:10 +07:00
Duy /zuey/
f0f39ce31f
feat(channels): add human-like chat behavior
...
Squash merge PR #99 after resolving conflicts with current dev. PR CI run 26703381807 passed release-versioning, go, and web.
2026-05-31 11:44:56 +07:00
Duy /zuey/
361f2abbf5
fix(packages): use writable scratch dir for github updates
...
Squash merge PR #97 after resolving changelog conflict with current dev. PR CI run 26703171763 passed release-versioning, go, and web.
2026-05-31 11:33:12 +07:00
Duy /zuey/
c4e0bd2be5
fix(cli-credentials): stabilize git preset creation
...
Squash merge PR #96 after PR #92 . PR checks were green; dev beta CI will be monitored after merge.
2026-05-31 11:05:47 +07:00
Goon
34bb6121b8
feat(channel-memory): document passive extraction
2026-05-29 20:48:45 +07:00
Goon
697aa266e0
feat(channels): document context admin surface
2026-05-29 19:43:06 +07:00
Duy /zuey/
f771cff77c
fix(channels): coalesce multi-attachment inbounds ( #63 ) ( #90 )
...
Implements 3 coalescing layers to handle rapid multi-attachment inbounds:
- Bus debouncer: delays inbound messages 1s, merges duplicates
- Web chat debouncer: buffers client-side inbound frames for batch RPC
- Telegram album aggregator: collects album members via AfterFunc+Stop timer
Drops media-bypass shortcut (forces 1s media floor). Aggregator enforces:
- AfterFunc+Stop timer discipline with ordered drain on stop
- 2-tuple (album_id, sender) keying for isolation
- Dual DoS caps: max 10 albums per sender, max 100 messages per album
- merged_message_ids dedup seeding across all 3 surfaces
Closes #63
2026-05-28 18:30:34 +07:00
Duy /zuey/
a591473546
feat(secure-cli): CLI credential adapters framework + git adapter ( #82 ) ( #89 )
...
* feat(secure-cli): Phase 1 schema + storage delta (issue #82 )
Adds `adapter_name` column to secure_cli_binaries and `credential_type` + `host_scope` columns to secure_cli_user_credentials. LookupByBinary LEFT JOIN now projects AdapterName, UserCredentialType, and UserHostScope. Extends SecureCLIStore with SetUserCredentialsTyped(ctx, binaryID, userID, env, credType, hostScope); legacy SetUserCredentials delegates to typed variant with nil/nil for backward compat.
PG migration 73 + RequiredSchemaVersion bumped to 73. SQLite incremental migrations (versions 39–41) + SchemaVersion 42. 7 SQLite + 6 PG integration tests covering schema, round-trip, NULL legacy, LookupByBinary projection.
Fixes #82
* feat(secure-cli): Phase 2 CredentialAdapter framework + passthrough (issue #82 )
Adds CredentialAdapter interface + Injection{ArgvPrefix,Env,Cleanup,ScrubValues} struct. Registry resolves by name; falls back to passthrough for empty/unknown. passthroughAdapter is default no-op — all existing presets (gh/aws/gcloud/kubectl/terraform/gws) behave bit-for-bit identically.
Per-request WithScrubBag(ctx) + AddScrubValuesCtx + ScrubCredentialsCtx for multi-tenant secret isolation (replaces package-global slice). Hook in executeCredentialed between env merge and exec: resolve adapter by bin.AdapterName, reject non-passthrough in sandbox, call Prepare, splice ArgvPrefix, merge Env, defer Cleanup, register ScrubValues.
Audit log security.system_env_injection records adapter name + env key names + argv_prefix_len + sha256(host_scope) — NEVER values. CLIPreset.AdapterName field added; empty default for legacy presets.
12 unit tests covering passthrough no-op, registry fallback + nil safety, Injection shape, hashHostScope determinism, sortedKeys, scrub bag per-request isolation + concurrent + short-value guard.
Fixes #82
* feat(secure-cli): Phase 2b extensibility helpers + psql stub adapter (issue #82 )
Proves CredentialAdapter framework generalizes beyond git. Adds materializeEphemeral(ctx, content, prefix) shared helper — 0600 tmpfile + idempotent atomic.Bool cleanup latch; memfd intentionally rejected (resolves "self" against child process).
Adds psqlAdapter consuming framework end-to-end via PGPASSFILE pattern; libpq-spec .pgpass escaping for `:` and `\`. Registers psql preset with AdapterName: "psql" (production UI for typed creds lands in v2).
Interface validation gate passes: Injection shape unchanged, hook is psql-agnostic, no special branch needed.
Tests: ephemeral write/cleanup/concurrent/zero-content; psql routing/content/escaping/error paths/registration.
Fixes #82
* feat(secure-cli): git adapter PAT + SSH implementation (issue #82 )
Phase 3 — PAT path
- gitAdapter PAT branch via GIT_CONFIG_COUNT/KEY_0/VALUE_0 env (git 2.31+)
so the token never lands on argv, .git/config, or remote URL
- Host-scope enforcement with IDN normalization (golang.org/x/net/idna)
and embedded-userinfo rejection in URL parsing
- CVE-2018-17456 mitigation: resolve remote URLs via `git config --get`
not `git remote get-url` to dodge ext::sh protocol handler injection
- Case-insensitive DenyArgs blocking `-c http.`, `-c credential.`,
`-c core.sshcommand`, `config --global/--system`, `credential-helper`,
bare `daemon`
- New WithExecCwd / ExecCwdFromContext context helpers — fixes a latent
design gap where the adapter's pre-flight `git config --get` ran in
goclaw's daemon CWD instead of the agent's repo
- 14 unit tests covering subcommand routing, host normalization,
scp-form parsing, userinfo rejection, CRLF token rejection,
CVE-2018-17456 regression, DenyArgs preset coverage
- 3 integration tests against a local TLS git-http-backend server
proving end-to-end clone + fetch + host-mismatch rejection with
zero token leakage into the cloned .git/config
Phase 4 — SSH path
- gitAdapter ssh_key branch materializes per-call 0600 tmpfile via
the Phase 2b materializeEphemeral helper, injects GIT_SSH_COMMAND
with -o IdentitiesOnly=yes -o BatchMode=yes
-o StrictHostKeyChecking=accept-new, idempotent cleanup
- ValidateSSHKey using golang.org/x/crypto/ssh rejects
passphrase-protected keys via ErrSSHKeyPassphraseUnsupported sentinel
- 8 unit tests covering passphrase rejection, env shape, cleanup
lifecycle, host-mismatch reuse, malformed-blob rejection
- 3 integration tests proving tmpfile 0600 lifecycle, env propagation
to child process, cleanup-on-exec-failure, no-orphan-on-rejection
- 2 new i18n keys (en/vi/zh) for SSH-passphrase and SSH-key-invalid
Verification: go vet clean, go build ./... clean,
go build -tags sqliteonly ./... clean, go test -race
./internal/tools/ pass, go test -tags integration
./tests/integration/ -run TestGitAdapter pass.
Refs #82
* feat(secure-cli): UI presets + typed credential HTTP path + i18n (issue #82 )
Phase 5. Typed PUT envelope with {error:{code,message}, error_key} for
field-level errors. CliCredentialGitFields React component (PAT/SSH picker,
host_scope input, CRLF→LF normalization, masked-edit). 17 i18n keys × 3
locales (backend + frontend). i18n parity test.
* feat(secure-cli): audit log schema + adapter framework docs (issue #82 )
Phase 6. emitSystemEnvInjectionAudit helper centralizes
security.system_env_injection slog with host_scope_hash (SHA-256 8 hex,
plaintext hostname omitted for PII safety). Audit shape pinned by
TestEmitSystemEnvInjectionAudit_*. New docs: git-credential-adapter.md
(user guide), credential-adapter-playbook.md (R1 implementer guide w/
kubectl/docker/npm/aws/psql worked mappings). 09-security.md § 14
trust-boundary diagram + SSH TOFU + SIGKILL caveats. 03-tools-system.md
§ 8a. Changelog entry.
* docs(journal): issue #82 CLI credential adapters shipped
Retrospective covering 6 commits across phases 1-6: framework, git PAT/SSH, psql stub, UI/i18n, audit log schema, docs. Notes memfd-drop rationale, TOFU/SIGKILL caveats, sentinel-length lesson from audit-shape tests.
* fix(secure-cli): honor per-request scrub bag on success+failure paths (#82 )
Sandbox and host exec paths called the non-Ctx ScrubCredentials, so
adapter ScrubValues registered into the per-request bag during Prepare
(e.g. GitLab glpat-, Bitbucket app-passwords, Azure DevOps PATs, Gitea
tokens, SSH key tmpfile paths) were ignored on stdout/stderr returned
to the agent. Only the package-global regex pass ran — covering ghp_
but nothing else.
Switch all four exec/sandbox call sites to ScrubCredentialsCtx so the
bag is consulted. Also scrub the slog adapter_cleanup_failed line —
os.Remove errors embed the full tmpfile path.
Add 5 regression tests that pin success path, failure path, negative
control (proves the bag is what catches the sentinel), classic-PAT
sanity, and timeout path no-leak.
Locks AC6 against non-GitHub PAT providers.
* fix(secure-cli): address review-pr #89 findings
- ui/web: SSH key Textarea was 'text-xs' on all viewports, triggering
iOS Safari auto-zoom on focus. Switch to 'text-base md:text-xs' so
mobile renders 16px (no zoom) while desktop keeps compact mono font.
- psql adapter: add on-disk pgpass tmpfile path to ScrubValues. psql
echoes 'could not open password file "<path>"' on IO errors, so
the path needs scrubbing alongside the password. Mirrors the git SSH
adapter pattern. Update test assertion accordingly.
- psql adapter: replace literal 'nil' context with 'context.TODO()'
to silence staticcheck SA1012.
2026-05-28 18:17:49 +07:00
Duy /zuey/
74930a1625
fix(ci): base64-encode zuey SSH key secret to dodge libcrypto error ( #79 )
...
* fix(ci): base64-encode zuey SSH key secret to dodge libcrypto error
First real deploy_zuey_beta run failed at the new 'Sync zuey ops scripts
to VPS' step with 'Load key: error in libcrypto' / Permission denied,
because GitHub Secrets storage normalized newlines inside the multi-line
PEM block.
Switch the secret to ZUEY_SSH_PRIVATE_KEY_B64 (single-line base64) and
base64 -d it on the runner. Single-line storage is immune to whitespace
mangling. Add a ssh-keygen -y -f pre-flight check that fails fast with
a clear remediation message if either the base64 or the decoded key is
malformed.
Refs: workflow run 26499549166
* fix(ci): create SSH key at 0600 from birth via umask 077
Defense-in-depth from review of PR #79 : wrap the base64-decode pipeline
in a subshell that sets umask 077 so the decoded private key file is
created at 0600 directly, instead of relying on a chmod 0600 after the
fact (which left a brief 0644 window).
2026-05-27 17:59:08 +07:00
Goon
17845305dc
feat(deploy): track zuey ops scripts in repo + CI auto-sync
...
- Move scripts/goclaw-upgrade-release.sh -> scripts/zuey/goclaw-upgrade-release.sh
- Add scripts/zuey/goclaw-deploy.sh (canonical source for /usr/local/bin/goclaw-deploy)
with self-loop symlink guard fix: readlink -f ... 2>/dev/null || true + warn
when previous resolves to empty. Without this, /opt/goclaw/current -> current
aborts set -euo pipefail before ln -sfn fixes the symlink (observed 2026-05-27,
silently failing every deploy_zuey_beta CI run).
- Wire Sync zuey ops scripts to VPS step in dev-beta-release.yaml:
scp + sudo install both scripts before triggering gateway upgrade endpoint.
Backup-if-changed via cmp -s; root:root 0755; bash -n syntax check; key shred.
Gracefully skips with warning if ZUEY_SSH_PRIVATE_KEY or ZUEY_SUDO_PASS unset.
- Document required secrets and manual sync recipe in docs/deployment-guide.md.
- Changelog entry 2026-05-27.
2026-05-27 15:18:08 +07:00
Goon
87b9e296b1
Merge remote-tracking branch 'origin/dev' into codex/configurable-exec-timeout
...
# Conflicts:
# docs/project-changelog.md
2026-05-24 20:19:40 +07:00
Goon
3a749ff91c
Merge remote-tracking branch 'origin/dev' into codex/issue-48-google-workspace-cli
...
# Conflicts:
# docs/project-changelog.md
2026-05-24 18:57:47 +07:00
Goon
c99f7e1fa4
feat(skills): add slash command activation
2026-05-24 16:39:44 +07:00
Goon
1296031d5a
feat(skills): configure upload size limits
2026-05-24 15:57:21 +07:00
Goon
3294fccbad
feat(cli): split env visibility for credentials
2026-05-24 15:14:43 +07:00
Duy /zuey/
2bb736cf18
feat(usage): add AI budget usage caps
...
Merge usage-cap budget controls with conflict resolution against dev.
2026-05-24 13:57:31 +07:00
Duy /zuey/
61fdcdcb81
feat(tools): add command keyword allowlist
...
Closes #42
2026-05-24 13:52:23 +07:00
Goon
7fee3073df
merge(dev): resolve usage cap conflicts
2026-05-24 13:49:40 +07:00
Duy /zuey/
5ae5815738
fix(telegram): preserve archive upload paths ( #58 )
2026-05-24 12:48:51 +07:00
Goon
12fb1baf79
feat(runtime): add Google Workspace CLI support
2026-05-24 12:12:16 +07:00
Duy /zuey/
68684e4859
feat(browser): add scoped cookie sync
...
Fixes #49
2026-05-24 11:27:02 +07:00
Duy /zuey/
f9440baca2
fix(cron): preserve SecureCLI credential context
...
Closes #54
2026-05-24 09:42:44 +07:00
Duy /zuey/
2c699f31de
fix(chat): support zero debounce and agent overrides
2026-05-23 14:02:34 +07:00
Goon
e4acb147d6
feat(usage): edit cap policies and trace decisions
2026-05-23 09:34:29 +07:00
Goon
a9a6463f71
feat(usage): bridge agent monthly budget caps
2026-05-23 08:51:04 +07:00
Goon
3e29b4f019
Merge remote-tracking branch 'origin/dev' into codex/usage-cap-budget-controls
...
# Conflicts:
# docs/project-changelog.md
2026-05-23 08:23:52 +07:00
Duy /zuey/
8af0e4ae09
feat(chat): debounce rapid web messages
2026-05-23 07:47:05 +07:00
Goon
ade1c1b838
fix(store): avoid usage cap migration keyword
2026-05-23 00:39:14 +07:00
Goon
1f51f988a3
Merge remote-tracking branch 'origin/dev' into codex/usage-cap-budget-controls
2026-05-23 00:17:20 +07:00
Goon
9ff5a629d2
feat(usage): add AI budget usage caps
2026-05-23 00:16:03 +07:00
Duy /zuey/
8b661951c0
fix(deploy): detach gateway upgrades from service ( #45 )
2026-05-22 21:53:10 +07:00
Duy /zuey/
43049d3b3f
feat(http): unblock CLI P6 backend APIs ( #44 )
...
* feat(api): unblock trace follow and provider reconnect
* test(cron): stabilize run log execution test
* feat(http): add CLI P6 backend endpoints
2026-05-22 20:59:47 +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
Goon
04d2b4266e
feat(tools): make exec timeout configurable
2026-05-21 16:44: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