28 Commits

Author SHA1 Message Date
EugeneTes
644f72068c feat(skills): session-start and turn-end hooks and protected paths declared in SKILL.md
A skill's SKILL.md frontmatter may declare session-start (output into
<skill_session_context>, at session start, /new, resume and after compaction),
turn-end (after every run, in the background; output or a failure reaches the
next run as a hidden notice, repeats suppressed until a clean run) and
protected-paths (write/edit refused inside them). Hooks run from the skill
directory with VOLCANIC_WORKSPACE, VOLCANIC_SKILL_DIR and the chat's TZ; waits
are bounded by each hook's timeout and failures never break a run. /skills
shows declared hooks and broken fields.
2026-10-16 12:27:44 +00:00
EugeneTes
0cae6f600a feat(telegram): pass GOOGLE_CLIENT_SECRET to agent processes, still redacted
GOOGLE_CLIENT_SECRET is no longer denied by name in the core defaults (the
*_SECRET glob still removes it); the Telegram host allows it by default so
workspace skills (gmail, gdrive) can use the Google OAuth client. Its value
stays in SecretValues: redacted from tool output, and aliases with the same
value are still removed.
2026-10-12 15:10:49 +00:00
EugeneTes
bb1c534a7a feat(core): always-on INSTRUCTIONS.md in skill directories
A skill directory may hold INSTRUCTIONS.md, with or without SKILL.md. Its body
(frontmatter cut) goes into every system prompt in <skill_instructions>, re-read
on every run: 16 KB per file, 64 KB in total, truncation marked with the file's
path. /skills marks skills with instructions and lists instruction-only dirs.
2026-10-12 10:15:05 +00:00
EugeneTes
dccdf3a8ed fix(core): skills live in <cwd>/.volcanic/skills, next to the rest of the workspace config 2026-10-10 14:16:20 +00:00
EugeneTes
c3095c69ca feat(core): per-workspace Agent Skills listed in the system prompt, /skills in Telegram
Skills live in <cwd>/.claude/skills/<name>/SKILL.md (frontmatter name + description).
SkillCatalog re-reads them on every run and the prompt lists name, description and
path; the model reads the full SKILL.md with the read tool when a task matches.
2026-10-10 14:13:42 +00: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
EugeneTes
64e67b00d7 feat(core): session SetTimeZone and the date and zone in the system prompt 2026-09-27 09:58:26 +02:00
EugeneTes
6ab98a8155 fix(telegram): address review findings
- A speech or download timeout (TaskCanceledException nobody asked for) is a failure
  with the user notice, not a silent shutdown; OpenAiSpeechToText maps it to
  "the request timed out."; UpdateRouter only treats the caller's cancellation as shutdown.
- send: WorkspacePaths resolves the real path component by component (realpath),
  closing the directory-link-inside-target bypass; `.` reports a directory.
- Image documents are attached inline only when their magic bytes are JPEG/PNG/GIF/WebP,
  under the detected type.
- Audio goes to STT as an ASCII audio.<ext> name.
- MCP Browser section mentions send only when it is active.
- RunInOrderAsync takes a cancellation token; queued work is skipped once disposal gives up;
  SendReplyAsync stays private behind ReplyInOrderAsync.
- Speech HttpClient handler recycles pooled connections; BuiltInTools.Send();
  IExtensionHost.Channel is abstract; WorkspacePaths in its own file.
- Tests: timeouts, symlink chains (Linux), sniffing, channel delivery failures,
  queued-work cancellation, gated voice ordering. Spec and docs updated.
2026-09-26 22:35:20 +02:00
EugeneTes
b22d0d159e feat(core): register send for sessions with a chat channel 2026-09-26 21:52:22 +02:00
EugeneTes
7dce84ddc5 feat(core): send tool delivers workspace files through IChatChannel
SendTool (Tool<SendArgs>, sequential) confines the path to the workspace including symlinked files and parent directories (WorkspacePaths), checks caption, photo and document limits before sending, and picks Document for non-photo extensions (.gif included) or oversized images under kind auto. Not registered yet; that is the next task.
2026-09-26 21:49:02 +02:00
EugeneTes
f2d6b7e5dc feat(core): IChatChannel contract and AgentSessionOptions.Channel
Adds the host-agnostic IChatChannel contract (ChatFile, ChatDelivery, ChatChannelLimits, ChatDeliveryException) to Abstractions/Ui, AgentSessionOptions.Channel, AgentSession.Channel and IExtensionContext.Channel. IExtensionHost.Channel is an internal plumbing default member that ExtensionContext forwards. Test support: FakeChatChannel and the TestHost builder's Channel.
2026-09-26 21:45:57 +02:00
EugeneTes
aaca3ad15a refactor(tools): move ToolExecutionException to Abstractions 2026-09-26 20:12:19 +02:00
EugeneTes
76bda6cf55 fix(processes): address review findings
- Fill TimeZoneId only for a configured session/host zone with a resolvable IANA id
  (IExtensionHost.TimeZoneId); otherwise children inherit the host's TZ instead of TZ=Local/UTC.
- Host hardening logs a warning instead of throwing when libc/prctl can't be resolved.
- A hook or process_spawn handler returning a null or incomplete context fails the spawn with
  InvalidOperationException, so bash reports "process environment hook failed".
- Move tool-result redaction into the Agent slice with a behavioural no-change check.
- ProcessSpawnContext.ApplyTo(psi) sets cwd and replaces the environment; used by bash and ExecAsync.
- Split the Telegram process environment types into their own files; move the Extensions.Tests
  NoHostHardening under Support/; check the Claude Code assembly never references the spawn policy.
- Spec and docs: TZ inheritance, incomplete contexts, ApplyTo, async spawn handlers, root skip.
2026-09-26 19:32:47 +02:00
EugeneTes
4f97db0643 feat(tools): bash spawns through the process spawn policy 2026-09-26 19:17:04 +02:00
EugeneTes
187414a459 feat(extensions): session-bound process preparation and ProcessSpawnEvent
IExtensionContext.PrepareProcessAsync fills scope, session id and zone, runs the host policy, then ProcessSpawnEvent handlers (a throwing handler fails the spawn). IExtensionApi.Processes/Redactor are available during activation. ExecAsync spawns through the policy. Spec section 4 notes the default interface members and the fail-closed dispatch.
2026-09-26 19:15:26 +02:00
EugeneTes
52439b0dc4 feat(processes): redact known secret values from tool output
ISecretRedactor (Abstractions) and SecretRedactor (ordinal, longest first,
values under 8 characters ignored) registered as a singleton over
ProcessEnvironment.SecretValues. AgentSession.RunOneAsync redacts progress
snapshots, every result and error path before ToolResultEvent, and again
after the handlers run.
2026-09-26 19:12:16 +02:00
EugeneTes
76e0f8c0e2 feat(processes): make the host process non-dumpable on Linux
HostProcessHardening calls prctl(PR_SET_DUMPABLE, 0) through LibraryImport, once per process, from the ProcessSpawnPolicy constructor, and warns when DOTNET_EnableDiagnostics is not 0. Test projects consume the one-shot call with the flag off in a module initializer. A HardeningProbe helper backs a Linux-only /proc integration test.
2026-09-26 19:09:45 +02:00
EugeneTes
0000266ead feat(processes): process spawn contract and default policy
Add the Abstractions spawn contract (ProcessPurpose, ProcessSpawnRequest,
ProcessSpawnContext, ProcessSpawnHook, IProcessSpawnPolicy, ProcessSpawnEvent),
ProcessEnvironmentOptions with DefaultDeny and Validate, EnvironmentFilter,
ProcessSpawnPolicy, AgenticCoreOptions.ProcessEnvironment and the
TryAddSingleton registration in AddAgenticCore.

Spec: section 2 says Deny/Allow match case-insensitively and names Validate,
DefaultDeny and MinimumSecretLength; section 3 describes the factory
registration and that the constructor throws on validation errors.
2026-09-26 19:07:33 +02:00
EugeneTes
399762669e feat(agent): session time zone contract
Adds AgentSessionOptions.TimeZone, AgenticCoreOptions.DefaultTimeZone, AgentSession.TimeZone, IExtensionHost.TimeZone, IExtensionContext.TimeZone (default member returning TimeZoneInfo.Local) and TimeZoneIds.ToIana, ahead of the rest of scheduler spec section 8. Spec sentences added to process-environment-hook section 4 and scheduler section 8.
2026-09-26 19:05:45 +02:00
EugeneTes
17ce025c57 feat(prompt): PERSONA.md and MEMORY.md in the system prompt; AGENTS.md or CLAUDE.md, not both 2026-09-25 16:36:49 +00:00
VolcanicAgenticCore
692992bb35 fix(abstractions): session events serialise to JSON (Partial no longer required) 2026-09-25 13:17:11 +00:00
VolcanicAgenticCore
424027cf86 test: end-to-end bash round trip; docs: record spec deviations 2026-09-25 12:37:06 +00:00
VolcanicAgenticCore
26c634a2d5 feat(core): agent loop, session facade, factory, hosting and faux provider 2026-09-25 12:28:24 +00:00
VolcanicAgenticCore
a49a2ea375 feat(core): extensions and commands slices 2026-09-25 12:16:33 +00:00
VolcanicAgenticCore
9ab663665c feat(core): tools slice with built-in tools 2026-09-25 12:12:30 +00:00
VolcanicAgenticCore
7e346aff61 feat(core): models and sessions slices 2026-09-25 12:09:18 +00:00
VolcanicAgenticCore
4169b19764 feat(abstractions): message model, provider, tool, extension, session and UI contracts 2026-09-25 12:05:48 +00:00
VolcanicAgenticCore
351bc0a2f6 chore: scaffold solution 2026-09-25 11:56:33 +00:00