Goon
591d809779
Merge remote-tracking branch 'upstream/dev' into dev
...
# Conflicts:
# internal/cron/service.go
2026-06-15 14:14:16 +07:00
Duy /zuey/ and GitHub
4dd2a0ce28
Merge pull request #1210 from keithy/feature/pkg-helper-fallback
...
feat: implement pkg-helper fallback execution
2026-06-15 10:41:17 +07:00
Duy /zuey/ and GitHub
9c1c572298
Merge pull request #1172 from raihan0824/feat/provider-kimi-coding
...
Feat/provider kimi coding
2026-06-15 10:40:45 +07:00
Duy /zuey/ and GitHub
00c25635e5
Merge pull request #1176 from dataplanelabs/upstream-fix/tts-timeout-wire
...
fix(tts): wire dashboard tts.timeout_ms through ApplySystemConfigs + seed
2026-06-15 10:36:50 +07:00
Raihan Afiandi and Goon
b844af8d25
feat(providers): add kimi_coding provider with fixed User-Agent + temp lock
...
Moonshot's Kimi Coding endpoint is OpenAI-compatible on the wire but
has two non-standard rules:
1. Every request must carry `User-Agent: claude-code/0.1.0` — without
it the upstream rejects the call outright.
2. `temperature` is locked to the server default; passing any other
value returns HTTP 400 `invalid temperature: only 1 is allowed for
this model`.
Rather than special-case either, this commit generalises both:
- WithExtraHeaders on OpenAIProvider — static headers attached to
every outgoing request. Reusable by any future provider that needs
pinned identity headers; mirrored in adapter_openai.ToRequest so
callers using the adapter path see the same shape.
- The existing skipTemp branch in openai_request.go gets a
provider_type check — kimi_coding joins o1/o3/o4/gpt-5-mini in
omitting `temperature` from the request body.
Provider wiring:
- store.ProviderKimiCoding constant + ValidProviderTypes entry +
KimiCoding{DefaultAPIBase,DefaultModel,RequiredUserAgent}.
- case store.ProviderKimiCoding in both registration switches
(cmd/gateway_providers.go and internal/http/providers.go).
- UI dropdown entry with the API base pre-filled.
5 unit tests cover: real outgoing header injection, adapter-path
header mirroring, empty-map WithExtraHeaders no-op, kimi_coding
strips temperature, and the negative control (other providers still
forward temperature).
Admin flow: Providers → Add → "Kimi Coding (Moonshot)" → paste API
key → save.
2026-06-15 10:16:47 +07:00
Goon
cd7c812b3d
fix(cron): suppress no-reply deliveries by token
2026-06-13 09:01:56 +07:00
Goon
06877365c4
merge: sync dev into usage analytics branch
2026-06-12 17:58:22 +07:00
Goon
4002bb4c13
feat(usage): add event analytics dashboard
2026-06-12 17:51:12 +07:00
Goon
9cd57a920c
feat: add multi-attachment delivery batching
2026-06-12 17:33:54 +07:00
Duy /zuey/ and GitHub
515596c44c
Merge pull request #167 from digitopvn/codex/issue-161-skill-self-evolution
...
feat(skills): add skill self-evolution metrics
2026-06-12 15:55:18 +07:00
Goon
a76f443411
feat: add persona context to delivery messages
2026-06-12 15:17:57 +07:00
Goon
248d591f52
fix: resolve dev merge conflicts
2026-06-12 15:01:38 +07:00
Goon
7692939d09
Merge remote-tracking branch 'origin/dev' into codex/issue-161-skill-self-evolution
...
# Conflicts:
# cmd/skills_cmd.go
# docs/project-changelog.md
# internal/http/skills.go
# internal/store/sqlitestore/schema.go
2026-06-12 14:57:09 +07:00
Goon
016a6d2de8
fix(cli): avoid skill evolution JSON helper collision
2026-06-12 14:50:33 +07:00
Goon
fa79693b5d
Merge remote-tracking branch 'origin/dev' into codex/issue-161-skill-self-evolution
...
# Conflicts:
# docs/project-changelog.md
2026-06-12 14:48:55 +07:00
Goon
f45bfa860c
feat(skills): add skill self-evolution metrics
2026-06-12 14:47:51 +07:00
Goon
569e946e43
fix: resolve issue 159 dev merge conflict
2026-06-12 14:42:48 +07:00
Goon
c320de5a87
feat: grant first setup agent gateway operator access
2026-06-12 10:40:59 +07:00
Goon
0bf7f88054
feat(skills): add lifecycle API and CLI
2026-06-12 10:38:53 +07:00
Goon
e2c0398ec9
feat(cli): add trace operator commands
2026-06-12 09:48:01 +07:00
Keith Patrick
a61bbe85f6
fix(pkg-helper): pass -n to sudo to prevent blocking on password prompts
2026-06-11 13:49:58 +01:00
Keith Patrick
d04108fff9
feat: implement sudo fallback for pkg-helper
2026-06-11 13:48:36 +01:00
Keith Patrick
37e2d37cf4
feat: implement pkg-helper fallback execution
...
Add CLI argument support to pkg-helper and fallback execution via $PATH in dep_installer when the Unix socket is unavailable.
💘 Generated with Crush
Assisted-by: Crush:gemini-3.1-pro-preview-customtools
2026-06-11 13:34:49 +01:00
Duy /zuey/ and GitHub
50c8519f01
fix(channels): require generated delivery replies
...
Quick Ack and Intermediate Replies now require generated delivery text in generated modes, while fixed-template mode remains explicit. Includes provider/model resolution coverage and UI copy updates.
2026-06-10 16:29:39 +07:00
Duy /zuey/ and GitHub
fdba1c2138
feat(channels): add sidecar delivery behavior overrides
...
Closes #144 .
- Retire user-facing Tool Status Messages and deterministic tool-status channel text.
- Add sidecar-generated Quick Acknowledgement and Intermediate Replies with provider/model/timeout/token/char caps.
- Resolve delivery behavior as Channel > Agent > Workspace with agent overrides in other_config.delivery_behavior.
- Preserve legacy block_reply defaults for Intermediate Replies.
2026-06-09 22:24:24 +07:00
Duy /zuey/ and GitHub
53ef912441
fix(channels): add reasoning delivery modes ( #135 )
2026-06-03 11:01:14 +07:00
Goon
1f40047583
fix(channels): gate initial intermediate replies
2026-05-31 18:10:12 +07:00
Duy /zuey/ and GitHub
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/ and GitHub
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/ and GitHub
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/ and GitHub
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/ and GitHub
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/ and GitHub
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/ and GitHub
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/ and GitHub
3569f8d681
fix(channels): load WhatsApp QR channel on create
...
Squash merge PR #98 in priority order after #97 . Existing PR checks were green; branch workflow status will be tracked.
2026-05-31 11:33:41 +07:00
Goon
8d45168b35
feat(channel-memory): run passive extraction pipeline
2026-05-29 20:48:19 +07:00
Goon
f20d776ebb
feat(channels): expose context capability matrix
2026-05-29 19:17:18 +07:00
Duy /zuey/ and GitHub
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/ and GitHub
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
Duc Nguyen
944ba4ccff
fix(tts): wire dashboard tts.timeout_ms through ApplySystemConfigs + seed
...
ApplySystemConfigs and seedConfigForContext both handle tts.provider,
tts.auto, tts.mode, tts.max_length — but neither carries tts.timeout_ms.
Result: the dashboard /tts page Timeout (ms) input is inert; cfg.Tts.TimeoutMs
stays at config.json default; setupTTS passes 0 to provider constructors;
each provider falls back to its hardcoded default (e.g. edge = 30s).
Two-line fix to mirror the existing pattern for the other tts.* keys.
2026-05-26 08:01:01 +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
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
Duy /zuey/ and GitHub
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/ and GitHub
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/ and GitHub
68684e4859
feat(browser): add scoped cookie sync
...
Fixes #49
2026-05-24 11:27:02 +07:00