Commit Graph

180 Commits

Author SHA1 Message Date
EugeneTes
93a4504607 feat(a2a): standalone A2A sample host 2026-10-07 13:45:53 +00:00
EugeneTes
baddd320c7 fix(a2a): fresh response artifact per run, atomic continuation, sturdier e2e tests
- Each run's first text delta replaces the response artifact (append:false) and a resumed task
  drops the previous run's response, so a failed/canceled continuation never keeps old text.
- Resumed is built from a fresh store read, history chronological (question, then answer),
  timestamps on the TaskUpdater clock.
- Pool.Track refuses a second unfinished run of the same task; the pre-check rejects
  continuations of a running task with UnsupportedOperation.
- Tests: continuation history, streaming continuation, response replacement, concurrent
  continuation; busy test waits for the model call; TimeoutException in waits; push test
  matches TASK_STATE_COMPLETED; harness cleans up on failed start.
2026-10-07 13:38:36 +00:00
EugeneTes
ebdf4a1aa4 test(a2a): push delivery, URL guard and push receiver 2026-10-07 13:25:33 +00:00
EugeneTes
7b044c5437 test(a2a): streaming, input-required, busy contexts, cancel, subscribe, files and hops 2026-10-07 13:25:33 +00:00
EugeneTes
7d4b6ae119 fix(a2a): continuations emit the resumed task, guarded clients bypass proxies
A continued task (input-required -> new message) produced only status updates, so the SDK
answered 'Agent handler did not produce any response events'. The handler now enqueues the
resumed task (caller message and question in history, working) as the first event.
The guarded SocketsHttpHandler sets UseProxy = false: a proxy would make the connection and
skip the ConnectCallback address check.
2026-10-07 13:25:33 +00:00
EugeneTes
098ab9f5ac test(a2a): end-to-end server flows through the SDK client 2026-10-07 13:22:09 +00:00
EugeneTes
0ae8fdd19f fix(a2a): dedicated guarded HTTP clients, context-checked continuations, request-scoped card URL 2026-10-07 13:19:04 +00:00
EugeneTes
9c51c97c93 feat(a2a): per-caller SDK servers behind a key filter, cards and push receiver 2026-10-07 13:10:19 +00:00
EugeneTes
f925eaaafd fix(a2a): track live runs from the start, atomic eviction, token-based cancel and safe final writes 2026-10-07 13:05:06 +00:00
EugeneTes
e932a44877 feat(a2a): map one A2A task to one agent session run 2026-10-07 12:51:32 +00:00
EugeneTes
79079ea6ba feat(a2a): pool one agent session per caller context 2026-10-07 12:50:04 +00:00
EugeneTes
2c9f18a7bd feat(a2a): request_input, notify_owner and an artifact chat channel for server sessions 2026-10-07 12:49:09 +00:00
EugeneTes
ab4af2cc21 fix(a2a): reject malformed file part URLs as prompt errors 2026-10-07 12:41:55 +00:00
EugeneTes
ee06e84cd5 feat(a2a): build session prompts from A2A messages, save file parts to the inbox 2026-10-07 12:35:53 +00:00
EugeneTes
2bfa76e0be feat(a2a): per-caller task files with lazy restart recovery 2026-10-07 12:34:01 +00:00
EugeneTes
a2e6a1ac9c feat(a2a): read callers.json from workspaces on every request 2026-10-07 12:18:36 +00:00
EugeneTes
39c9c2467f feat(a2a): scaffold the A2A server library and its tests 2026-10-07 12:18:18 +00:00
EugeneTes
99528d003f docs(plan): A2A server implementation plan 2026-10-07 11:26:18 +00:00
EugeneTes
3569f25eb0 docs(spec): A2A server and client designs 2026-10-07 10:11:57 +00:00
EugeneTes
3a07d00eb2 feat(telegram): log trigger changes and the trigger count at startup 2026-10-05 18:43:30 +00:00
EugeneTes
145977c6fb chore: decline release notes for this repo 2026-10-05 16:32:36 +00:00
EugeneTes
cabec7ad70 docs(telegram): groups and Jev topic triggers 2026-10-05 16:29:07 +00:00
EugeneTes
be3c77b4d0 feat(telegram): watch groups silently and route Jev topic triggers to the owner's chat 2026-10-05 16:26:16 +00:00
EugeneTes
4ce71201b0 feat(telegram): trigger engine with Jev classification, debounce and snooze batches 2026-10-05 16:21:41 +00:00
EugeneTes
50d0e81aac feat(telegram): group registry, trigger store and snooze queue 2026-10-05 16:17:17 +00:00
EugeneTes
af714cc50b feat(telegram): trigger options and Jev client for OpenRouter systemone 2026-10-05 16:15:06 +00:00
EugeneTes
7520ff56a2 docs(spec): Telegram groups and Jev topic triggers 2026-10-05 15:42:19 +00:00
EugeneTes
92a0061fdd feat(telegram): ADMIN_USER_ID may /impersonate another user
While on, the admin's updates are routed as the target user's (allow-list,
chat, workspace, session, settings, jobs) and the target chat's output goes
to the admin's chat. The target's own updates are dropped with a notice that
an admin is working with their account. In memory; /impersonate 0 stops.
2026-10-05 07:24:07 +00:00
EugeneTes
64ea6f7fa1 feat(telegram): retry transient speech-to-text failures up to 3 attempts 2026-10-05 07:02:23 +00:00
EugeneTes
094d518827 fix(claude-code): disable built-in plugins and learn new ones from init
Claude Code 2.1.287 loads cc-plugin-* built-ins regardless of --setting-sources,
which tripped the fail-closed init check. Disable every known built-in in
--settings, and when init lists only built-ins that slipped through, disable them
process-wide and replay the request once. Other plugins still fail closed.
2026-10-02 10:08:23 +00:00
EugeneTes
39e7849039 fix(telegram): cut the voice transcript echo to 1024 characters 2026-10-02 09:51:57 +00:00
EugeneTes
3a57b81d88 feat(docker): trust every git repository through GIT_CONFIG_* in compose 2026-10-02 09:21:24 +00:00
EugeneTes
0cb791d529 fix(telegram): break the DI cycle through CalendarScriptEnvironment
ChatRegistry -> JobScheduler -> IScriptEnvironment -> ChatRegistry made the host
fail at startup. CalendarScriptEnvironment now takes TelegramOptions and computes
the workspace with the new static ChatRegistry.WorkspaceFor(options, chatId).
2026-10-02 08:45:48 +00:00
EugeneTes
d2fd7ffa02 feat(google-calendar): encrypt chat tokens and give watchers a short-lived access token
token.json is sealed with AES-256-GCM (key derived from the OAuth client secret,
bound to the chat), so the agent's processes can read the file but not the
refresh token. Plain files, including VolcanicSecretary's refresh_token format,
are rewritten sealed on first read.

The scheduler gains IScriptEnvironment: extra per-run variables set after the
process environment filter and redacted from the run's output. The Telegram
host uses it to pass GOOGLE_ACCESS_TOKEN, refreshed to cover the job's timeout;
the refresh token and client secret never reach the script.
2026-10-02 08:31:24 +00:00
EugeneTes
28bbfbc759 feat(scheduler): store jobs per chat and import VolcanicSecretary job files
Each chat's jobs live in <workspace>/.volcanic/scheduler/jobs.json. On start the
scheduler loads every chat's file, moves the retired shared
<agentDir>/scheduler/jobs.json into them and renames it .migrated-<ts>.
A VolcanicSecretary jobs.json (bare array) in a chat's folder is converted
in place for that chat; the original is kept as .secretary-<ts>.

Also adds the VolcanicSecretary data migration plan.
2026-10-02 07:29:48 +00:00
EugeneTes
28c6f90d91 feat(docker): bind the data volumes to /media/disk1/containers/volcanic_secretary_core
The entrypoint chowns the three mount roots before dropping to app, since
Docker creates missing bind directories as root.
2026-09-29 09:40:28 +00:00
EugeneTes
8014a0e770 refactor(scheduler): drop the reminder job kind
Jobs are prompts or watchers. A reminder is a prompt the agent passes on, so
it lands in the transcript. Stored reminder jobs load as prompts
("Remind me: <text>"). Also records the Coolify deploy target in CLAUDE.md.
2026-09-29 09:30:40 +00:00
EugeneTes
c3a0cf234c feat(google-calendar): store each chat's token in its workspace
Tokens now live in <cwd>/.volcanic/google-calendar/token.json, as in the
VolcanicSecretary reference, instead of <agentDir>/google-calendar/<chat
key>/. GoogleCalendarOptions.TokenDirectory, when set, keeps the old
per-chat layout under that root. Spec, docs and CLAUDE.md updated.
2026-09-28 20:42:58 +02:00
EugeneTes
809261b29e Merge branch 'feat/docker-deployment' 2026-09-27 12:38:54 +02:00
EugeneTes
7bb41f0b5b fix(docker): address review findings
Entrypoint drops the capability bounding set and sets no_new_privs. Security docs
and spec no longer claim the agent can't reach the secrets; docker exec fallbacks
use a clean environment. PLAYWRIGHT_ENABLED drops the nested compose default.
Tests pin the Dockerfile's Playwright install step and the compose model fallback.
2026-09-27 12:34:58 +02:00
EugeneTes
b9a95a57c8 docs(docker): mark the deployment spec implemented
Status implemented, verification intro rewritten, and a verification record of the final checks (dotnet build/test, both image variants, offline probes of uid, /proc environ and the diagnostics socket, playwright-mcp --version offline, headless Chromium as app, docker compose config, compose start with a fake token -> 401 -> exit 1). Open question 2 (Playwright compose default) marked resolved.
2026-09-27 12:22:06 +02:00
EugeneTes
92c881377b docs(docker): link the container setup from the README, bot and MCP docs 2026-09-27 12:17:41 +02:00
EugeneTes
f0c511f953 docs(docker): Docker and Coolify deployment guide
Image contents, build arguments, the environment table with what the agent's processes can't see, volumes, Coolify steps, first Claude login, updating (the npm layer is cached: build without cache or pin CLAUDE_CODE_VERSION), extensions, troubleshooting and security.
2026-09-27 12:15:45 +02:00
EugeneTes
2461dfebce feat(docker): compose file and .env.example for Coolify
One bot service with init: true, 1 GB /dev/shm, three named volumes and every setting as an environment variable; PLAYWRIGHT_ENABLED follows INSTALL_PLAYWRIGHT. .env is git-ignored.
2026-09-27 12:12:49 +02:00
EugeneTes
9a9e55f783 feat(docker): optional Playwright MCP and Chromium in the image
INSTALL_PLAYWRIGHT=true installs @playwright/mcp@0.0.82 globally and runs its own playwright dependency's installer (install --with-deps chromium) into /opt/ms-playwright, readable by all users. The build fails if playwright-mcp --version does not run.
2026-09-27 12:09:52 +02:00
EugeneTes
4ed3758f9c feat(docker): Dockerfile for the Telegram host
Two-stage build, agent tools, Node 24, claude CLI, data dirs owned by app, DOTNET_EnableDiagnostics=0. Adds the MCP spec's deferred test that the Dockerfile's PLAYWRIGHT_MCP_VERSION equals PlaywrightPreset.DefaultPackage.

Spec change: the image keeps root as its user and the entrypoint drops to app with setpriv. With USER app, compose's docker-init (PID 1) runs as app and its /proc/1/environ exposes every secret to the agent's bash. The spec also lists the csprojs the restore layer copies (GoogleCalendar, Mcp, Scheduler included) and sets HOME=/home/app in the image.
2026-09-27 12:04:42 +02:00
EugeneTes
80358784ac docs(plan): docker-deployment implementation plan 2026-09-27 11:58:42 +02:00
EugeneTes
1353717ca0 test(telegram): relogin test deactivates host tools such as set_timezone
The fake claude never starts the proposal bridge, so the test needs a
session with no active tools. Since the scheduler spec every chat
registers set_timezone, which made the provider wait for the bridge and
fail with mcp_startup on Linux (the test returns early on Windows).
2026-09-27 11:07:56 +02:00
EugeneTes
7879969c5f Merge branch 'feat/scheduler' 2026-09-27 11:00:31 +02:00
EugeneTes
fd6b9027b6 fix(scheduler): address review findings
- JobScheduler: a stored job whose zone lookup throws no longer fails StartAsync; timer re-armed under the lock;
  a delivery cut off by shutdown isn't recorded (one-offs fire again after restart); CancelJobAsync in one step
- Schedules.ParseAt: ISO 8601 with a date only (no machine-clock date for a bare 09:00)
- core: a FollowUp prompt that loses the race to a starting run joins it as a follow-up, not steering
- Telegram: TimeZoneFor tolerates non-numeric targets; RunPromptAsync waits only when queued; one agent dir
- ScriptRunner: bad workspace paths are Failed, not exceptions; zone id helpers share TimeZoneIds.ToIana's rule
- tests: no wall-clock sleeps in scheduler tests; transcript-entry, disabled-scheduler and failing-prompt coverage
- docs: spec notes for the above; README row for the scheduler
2026-09-27 10:56:45 +02:00