All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
--show-reasoning/HYPERAGENT_SHOW_REASONINGremoved — the flag was misnamed (it controls reasoning effort, not the display of reasoning). Use--reasoning-effort [level]/HYPERAGENT_REASONING_EFFORTinstead. Same accepted levels (low/medium/high/xhigh, defaulthigh), same wiring into the Copilot SDK session — the old name is gone, no silent fallback.
--very-verbose/-vv/HYPERAGENT_VERY_VERBOSE— extends--verboseso the full result body is printed for every tool (audit progress, plugin enable/disable, module registration, intent reports, handler registration, …), not just the sandbox tools.--verboseon its own keeps the leaner default (sandbox tool bodies only; one-line✅ Donefor everything else).--base-dir <path>/HYPERAGENT_BASE_DIR— auto-enables both thefs-readandfs-writeplugins at startup with the supplied directory as theirbaseDir. The directory is created if missing and symlinks are still rejected. Independent of--auto-approve— the flag itself is the approval signal for the two first-party path-jailed plugins.
--verboseignored non-sandbox tool result bodies — the event handler returned early for anything other thanexecute_javascript/execute_bash, soplugin_info,module_info,report_intent,register_handler, and friends always rendered as a terse✅ Doneeven in verbose mode. The early-return is gone;--verbosenow prints sandbox tool bodies and--very-verboseprints every tool body.
/skills <name>did nothing — the REPL forwarded the raw/skills kql-expertstring but the Copilot SDK only understands/<skillname>, so the LLM saw a free-text request and sometimes mis-firedgenerate_skill. REPL now rewrites/skills <name>→/<name>before dispatch, gating onvalidateSkillName()so reserved subcommands (info,edit,delete,list,reload) pass through untouched (#151)/skills reloadwas rewritten to/reload— a parallel hardcodedKNOWN_SKILLS_SUBSset drifted fromRESERVED_SKILL_NAMESand missed the newreloadsubcommand. Rewrite is now gated onvalidateSkillName()(single source of truth) (#151)- Path traversal in slash-command skill detection — default-case
existsSync(join(skillsDir, cmd.slice(1), "SKILL.md"))used unvalidated input;/../etcresolved outsideskillsDir, turning the "is this a skill?" check into an arbitrary filesystem probe. Now routes throughsystemSkillExists()which validates first (#151) generate_skillcould silently shadow built-in skills — collision check only consulted user skills, letting/save-skill kql-expertoverwrite the bundled curated copy without warning. NewsystemSkillExists()helper +⚠️ SHADOW banner + explicitoverwrite=truerequirement on system collisions (#151)- Sandbox verbose traces leaked into REPL terminal —
[sandbox] setPlugins / invalidateSandboxWithSave / autoSaveStatechatter bypassed the debug log.tool.jsnow takes adebugLogcallback, wired to the existing~/.hyperagent/logs/agent-debug-*.logsink (#151) marked-terminalv7 broke**bold**in tight list items — itstextrenderer usedtoken.textraw instead of recursing viaparseInline(), leaking literal asterisks to the terminal. Patched via renderer override + regression tests (#151)###heading prefix leaked through terminal renderer — flippedshowSectionPrefix: falseso headings render cleanly (#151)- Profile-apply preview printed raw
**Configuration:**— twoconsole.logcallsites bypassed the markdown renderer. Fixed to route throughrenderMarkdown()(#151) - MCP missing-prerequisite guidance was buried mid-document —
formatGuidance()hid the "you need to configure server X" block where the model ignored it. Now appears at the top under aMISSING PREREQUISITESbanner (#151) - MCP synthesised fake
--mcp-setup-${name}flags — for servers without a real shortcut.MCP_SETUP_COMMANDSexpanded to all 5 supported servers; unsupported servers now correctly point atconfig.jsoninstead of a non-existent flag (#151)
/skills reload— hot-reload the SDK skill registry mid-session without restarting. Auto-reload also fires aftergenerate_skillwrites so freshly authored skills are invocable immediately (#151)/markdownsubcommands —/markdown status,/markdown on,/markdown off,/markdown toggle— no more toggle-trap where you couldn't query the current state (#151)- Profile-apply preview as markdown table —
applyProfileImplnow emits aLimit / Before / Aftertable when/markdownis on, rendered bymarked-terminalas a unicode box-drawing table that's much easier to scan than the previous flat list (#151) - README quick install section — surfaced near the top of the README for faster onboarding (#149)
- Dependency bumps —
@github/copilot1.0.39 → 1.0.48 (#150)
v0.6.0 - 2026-05-15
- User-generated skills from session learnings — Persist what the agent learned in a session as a reusable skill at
~/.hyperagent/skills/<name>/SKILL.md, surviving upgrades and overriding bundled skills with the same name. Triggered via/save-skill [name]or natural language ("save this as a skill"). Newgenerate_skilltool with interactive approval;/skillsgainsinfo,edit,deletesubcommands; skill-loader supports override semantics across multiple directories (#139) - KQL expert skill — New skill with 35 triggers and
requires-mcp: fabric-rti-mcpfrontmatter, KQL/Kusto syntax highlighting in terminal markdown (derived from@kusto/monaco-kusto),requires-mcpenrichment wiring,--mcp-setup-fabric-rtiCLI command, intent-matcher regression tests (#137) - Terminal markdown rendering — LLM output is now rendered through
marked+marked-terminalwith proper headings, bold, code blocks, lists, tables, and links. Enabled by default; opt out with--no-markdown(or toggle off with/markdown//md, or setHYPERAGENT_MARKDOWN=0) to restore raw streaming (#135, #136) - Verbose/debug diagnostic gating —
[hyperlight-analysis]Rust diagnostics,[mcp]connection messages, and MCP subprocess stderr now only surface underHYPERAGENT_VERBOSE/HYPERAGENT_DEBUG(#137) execute_bashlarge output interception — Mirrors theexecute_javascriptpattern, saves results to disk before the SDK can truncate to inaccessible host/tmpfiles (#134)
markedv15 +marked-terminalv7 incompat — Switched from the legacynew TerminalRenderer(opts)constructor to themarkedTerminal()factory; the legacy route assigned config to own enumerable properties (this.o,this.tab, …) which mademarkedv15'suse()validator throw "renderer 'o' does not exist" at module init. Added a regression import test (#138)- HybridFs sandbox path mapping —
/tmp/foo.txtnow maps totmp/foo.txt(notfoo.txt), preventing collisions with user files inbaseDir; bash FS adapter refactored from a 12-method delegation object intoHybridFs extends InMemoryFsfor cleaner super-method fallbacks (#134) - Prettier mangling of styled help/error templates — Nested template literals inside
C.dim/C.err/C.ok/C.warnreplaced with string concatenation so Prettier can't rewrite them into broken output (#134) - Error message styling — Full error text (not just the
❌ Error:label) is now wrapped inC.err()so the detail stays red across 11 paths inslash-commands.tsand SDK-level tool-failure display inevent-handler.ts(#135) /markdowntoggle missed system-prompt rebuild — Setting the toggle now flipssessionNeedsRebuildso the system prompt reflects the new mode (#136)- Markdown false positives — Removed over-eager bold and unordered-list patterns from
looksLikeMarkdown;Markednow uses a local instance instead of globalsetOptions(#136)
- Dependency bumps —
@azure/msal-node5.1.5 → 5.2.1,tsx4.21.0 → 4.22.0,@types/node25.6.0 → 25.8.0,tokioin code-validator guest (#142, #143, #146, #147)
v0.5.0 - 2026-05-07
- Estimated cost in token display — Per-request and session-level cost estimates based on model list pricing (Claude, OpenAI, Gemini). Shows cache savings breakdown. New
getModelPricing()andestimateCost()exports for reuse (#114) - Actionable limit error messages — Every plugin error about a breached configurable limit now tells the LLM which config field to increase via
manage_plugin(21 messages across fs-read, fs-write, fetch) (#112) - Configurable plugin limits — Previously hardcoded ceilings (per-call chunk sizes, rate limits, session budgets, etc.) are now user-configurable with no artificial maximums. Includes
maxReadChunkKb,maxListResults,maxWriteChunkKb,maxRedirects,maxJsonResponseBytes,maxTextResponseBytesand more (#106) - Clarifying questions for skills — pptx-expert, pdf-expert, xlsx-expert skills now include structured "Clarifying Questions" sections that tell the LLM what to ask when details are missing (#110)
- Cache write token tracking —
cacheWriteTokensfrom the SDK is now accumulated in session state for accurate cost calculation (#114)
- PPTX hex colour XML injection —
hexColor()did no validation, allowing non-hex strings (like gradient XML) to be embedded assrgbClr valattributes, producing corrupt OOXML that PowerPoint would repair by stripping entire slides. Now validates withHEX_REand throws descriptive errors (#115) - ha:pdf import validation failure — Native module resolution loop broke early when a transitive dependency (e.g.
ha:ziplib) had no JS source, producing a cryptic empty error. Now checksmoduleJsonsanddtsSourcesalongsidesourcesbefore breaking (#111) - PPTX shape ID collision on restore —
restorePresentation()set the shape ID counter AFTERcreatePresentation(), causing duplicate IDs when shapes were created between the two calls. Counter is now restored FIRST. Includes fallback max-ID scan for legacy serialized data (#113) - Plugin config silently clamped —
safeNumericConfigfrompath-jail.tsdefaults to a 10 MB ceiling. Plugin code that omitted the ceiling arg had values likemaxWriteSizeKb: 20480silently clamped to 10240 (#106) - fetchJSON/fetchText byte counting — Used
body.length(UTF-16 code units) instead ofBuffer.byteLength(body, 'utf8')for the configured byte limit check (#106)
- Handler validation guidance — Stricter handler shape requirements with better error messages; nested helper functions no longer trigger false-positive misnamed-handler errors;
function(expressions properly skipped in return detection (#105, #101) - SDK forward compatibility — Use SDK
SessionEventtype for forward compat with copilot-sdk 0.3.0 (#100)
v0.4.2 - 2026-04-29
- MSAL M365 server discovery — Bootstrap MCP server discovery for Microsoft 365 services using MSAL authentication (#97)
v0.4.1 - 2026-04-29
- Release smoke test — Removed fragile package size check from post-publish smoke test (#96)
v0.4.0 - 2026-04-29
- MCP tool discovery flow — Improved MCP tool discovery and connection lifecycle (#95)
- Bold slash command detection — Detect suggested slash commands wrapped in markdown bold formatting (#94)
- npm package size — Reduced published package size and hardened post-publish smoke test (#93)
v0.3.0 - 2026-04-28
- Excel XLSX module — Promoted
ha:xlsxto a builtin module with workbook, sheet, chart, pivot table, and conditional formatting APIs (#86) - M365 MCP integration — Microsoft 365 MCP server support for calendar, email, and Teams (#83)
/pluginsalias —/pluginsnow works as an alias for/plugin(#84)
- Handler edits and MCP gateway — Improved handler edit flow and MCP gateway module loading (#88)
- README — Restructured to be capabilities-first (#87)
- CI — Added post-publish smoke test job (#85)
v0.2.3 - 2026-04-23
- npm install — Fixed package installation issues (#79)
v0.2.2 - 2026-04-23
- Publish workflow — Fixed npm publishing workflow and updated release documentation (#77, #78)
v0.2.1 - 2026-04-23
- PDF document support — Full PDF generation with flow layout, charts, themes, and font embedding via
ha:pdf,ha:pdf-charts, andha:doc-coremodules (#51) - MCP integration — Model Context Protocol support for external tool servers with SSE and stdio transports (#57)
- Kubernetes deployment — AKS and KIND deployment manifests with Hyperlight DaemonSet and agent pods (#54)
- Token usage tracking — Per-request and session-total token counts with cache hit reporting (#58)
- Trusted npm publishing — OIDC-based publishing with
--provenance(#62) - Dependabot automation — Enhanced Dependabot config with auto-approval for patch updates (#20, #45)
- Hyperlight dependency alignment — Aligned code-validator Hyperlight deps with hyperlight-js to prevent version skew (#64)
- npm publish — Fixed publish workflow issues (#76)
v0.1.6 - 2026-03-27
- Cross-platform npm publishing — Publish workflow now builds native addons on Linux (glibc + musl) and Windows in parallel, uploads artifacts, and combines them into a single cross-platform npm package
- musl/Alpine support — Added
x86_64-unknown-linux-muslNAPI build target forhyperlight-analysis; CI cross-compiles musl from glibc runner withmusl-tools - Runtime NAPI platform detection — Binary launcher uses napi-rs generated
index.jsforjs-host-api(full musl/glibc/win32 detection) and probeslddforhyperlight-analysismusl vs glibc resolution - ha-modules.d.ts sync test — New test in
dts-sync.test.tsregeneratesha-modules.d.tsand compares to committed version, catching drift when module exports/types change without re-running the generator
- Cross-platform .node loading —
build-binary.jsno longer hardcodes the NAPI triple at build time; copies all available platform.nodefiles and uses runtime detection to load the correct one - postinstall script — Fixed missing closing brace in
package.jsonnode -esnippet that caused SyntaxError duringnpm install - Publish artifact ordering — Download artifacts AFTER
just setupto avoid symlink/junction clobber whenbuild-hyperlightre-createsdeps/js-host-api - ha-modules.d.ts stale types — Regenerated with
ShapeFragmentreturn types (wasstring) to match upstream ShapeFragment safety system - Node.js launcher URL — Use
pathToFileURL(cjs).hrefinstead of manualfile://concatenation (fixes invalid URLs on Windows) - Unix PATH instructions — Removed backslash escaping of
$PATHin post-build output - pattern-loader test cleanup —
afterEachonly swallowsEBUSY/EPERMon Windows; rethrows real errors on other platforms
- Publish workflow — Replaced single-platform
ubuntu-latestpublish with multi-platform matrix build (Linux KVM, Linux musl, Windows WHP) followed by artifact-combining publish job on self-hosted runner - Publish runner —
publish-npmjob now runs on self-hostedhld-kvm-amdrunner (needs Rust toolchain forjust setup)
v0.1.5 - 2026-03-27
- Windows WHP support — HyperAgent now runs on Windows with hardware-isolated Hyperlight micro-VMs via Windows Hypervisor Platform (WHP)
- Justfile:
[windows]recipes forbuild-hyperlight,resolve-hyperlight-dir,start-debug - Justfile:
runtime-cflagsforward-slash fix for clang cross-compilation on Windows build-binary.js:.cmdlauncher and platform-aware post-build output with PowerShell instructionsagent/index.ts:pathToFileURL()for ESM plugin imports on Windowsbuild.rs: forward-slash CFLAGS for clang on Windowscode-validator/guest:win32-x64-msvcNAPI build target.gitattributes: enforce LF line endings across platformsREADME.md: document Windows WHP as supported prerequisite
- Justfile:
- CI Windows matrix —
pr-validate.ymlnow includes Windows WHP build/test entries;publish.ymlupdated for Windows builds - Deterministic VM dispose —
invalidateSandbox()now callsdispose()onLoadedJSSandboxandJSSandboxfor deterministic VM resource cleanup instead of relying on V8 GC - PPTX ShapeFragment safety system — Branded opaque type for shape builders with validation engine (#14)
- Duplicate error messages —
event-handler.tsnow suppresses duplicate "Tool execution failed" output when the handler has already displayed the error - MMIO error detection —
sandbox/tool.jsdetects MMIO unmapped-address errors in both compilation and runtime paths, providing clearer error messages - Plugin O_NOFOLLOW on Windows —
fs-readandfs-writeplugins fall back gracefully whenO_NOFOLLOWis unavailable (Windows), relying onlstatSyncpre-check for symlink safety - Test Windows compatibility — Symlink tests skip with EPERM on Windows (
path-jail,fs-read,fs-write);dts-syncusesrmSyncinstead of shellrm -rf;pattern-loaderuses uniqueos.tmpdir()paths to avoid Windows Defender EBUSY locks - CI docs-only job — Added missing checkout step to docs-pr CI job (#12)
- postinstall script — Fixed missing closing brace in
package.jsonpostinstallnode -esnippet
- Surrogate pool env vars —
agent/index.tssetsHYPERLIGHT_INITIAL_SURROGATES=2andHYPERLIGHT_MAX_SURROGATES=24on Windows - hyperlight-js dependency — Updated to include
dispose()API and npm audit fixes - Build system — Eliminated
deps/hyperlight-jsgit clone; Cargo dep now resolves hyperlight-js checkout via Cargo's git cache (#13) - npm scripts —
prepareandpostinstallusenode -einstead of POSIX shell for cross-platform compatibility
- npm audit fixes — Updated
picomatchandbrace-expansionacross all workspaces (root,code-validator/guest,deps/js-host-api)
v0.1.4 - 2026-03-24
- Plugin schema extraction — Schema extraction failed on compiled
.jsfiles, causingapplyInlineConfigto find no recognised keys andallowedDomainsto never be set. Now prefers.tssource for schema parsing (read-only) with TOCTOU-safe fallback to.js - Pre-approved plugin enable — Fast-path (approved plugins skip audit) failed to call
loadSource(), leavingplugin.sourcenull.verifySourceHash()then returned false, silently disabling the plugin on sandbox rebuild - CI docs-only skip — PR validation now skips heavy CI jobs (lint, build, test) when only markdown files change.
skills/**andpatterns/**are treated as code (they have integrity tests)
v0.1.3 - 2026-03-24
- Plugin loading under npm — Plugins failed with "Stripping types is currently unsupported for files under node_modules" when installed via npm. Plugin loader now prefers compiled
.jsover.tswhen running undernode_modules, while still using.tsin dev mode for live editing - Plugin hash/approval consistency —
computePluginHash(),loadSource(), andverifySourceHash()now use centralisedresolvePluginSource()helper to ensure hashing and import use the same file
v0.1.2 - 2026-03-23
- npm global install — Launcher script now resolves symlinks before computing lib/ path, fixing
Cannot find module 'hyperagent-launcher.cjs'when installed vianpm install -g(symlink from npm bin dir broke relative path resolution) - PATH invocation — Handle bare command name (no slash in
$0) by resolving viacommand -vbefore symlink resolution
v0.1.1 - 2026-03-23
- Version display — Strip leading "v" prefix from
VERSIONenv var and build-time injection to prevent "vv0.1.0" in banner display - Plugin validation — Reject plugin manifest versions with "v" prefix (e.g. "v1.0.0") to prevent double-prefix in display
- npm install — Skip
postinstall/preparescripts gracefully when installed as a published npm package (scripts only exist in the source repo) - Rust lint — Fix clippy errors:
unwrap_used,manual_strip, dead code,needless_range_loop; allowexpect_usedon static regex patterns in plugin scanner
- CI quality gate — PR validation now runs
just lint-all+just test-all, adding Rust clippy and fmt checks that were previously missing - npm registry — Publish to npmjs.org (public) instead of GitHub Packages (required custom registry config)
- Just recipes renamed —
lint-rust→lint-analysis-guest,fmt-rust→fmt-analysis-guest,test-rust→test-analysis-guestfor clarity - Rust formatting — Applied
cargo fmtacross all Rust workspaces (analysis-guest and sandbox runtime) - cfg(hyperlight) — Added
check-cfgtonative-globalsCargo.toml to silence warnings
v0.1.0 - 2026-03-20
Initial public release.
-
Core Agent
- Interactive REPL with GitHub Copilot SDK integration
- Sandboxed JavaScript execution in Hyperlight micro-VMs
- MinVer-style versioning from git tags
- Session management with persistence and resume
- Context compaction for infinite conversations
- Multi-model support with mid-conversation switching
-
Plugin System
fs-read- Read-only filesystem access (path-jailed)fs-write- Write-only filesystem access (path-jailed)fetch- HTTPS fetch with SSRF protection- LLM-based plugin security auditing with canary verification
- Plugin approval persistence with content-hash invalidation
-
Skills System
- Domain expertise via markdown files with YAML frontmatter
- Auto-matching via trigger keywords
- Tool restrictions per skill
- Built-in skills: pptx-expert, web-scraper, research-synthesiser, data-processor, report-builder, api-explorer
-
Patterns System
- Code generation templates for common tasks
- Built-in patterns: two-handler-pipeline, file-generation, fetch-and-process, data-transformation, data-extraction, image-embed
-
Resource Profiles
- Bundled limit and plugin presets
- Stackable profiles (max limits, union of plugins)
- Built-in profiles: default, file-builder, web-research, heavy-compute
-
Module System
- Built-in modules: str-bytes, crc32, base64, xml-escape, deflate, zip-format, ooxml-core, pptx, pptx-charts, pptx-tables
- User-defined modules persisted to ~/.hyperagent/modules/
- Shared state across handler recompiles via ha:shared-state
-
Code Validation
- Pre-execution validation in isolated Rust guest (hyperlight-analysis-guest)
- QuickJS parser for syntax checking
- Import validation against available modules
- Plugin source scanning for dangerous patterns
-
CLI Features
- Non-interactive mode with
--promptand--auto-approve - Slash commands for runtime configuration
- Command suggestions extracted from LLM output
- Ctrl+R reverse history search
- Session transcript recording
- Non-interactive mode with
- Hardware isolation via Hyperlight micro-VMs (KVM/MSHV/WHP)
- Tool gating blocks all SDK built-in tools (bash, edit, grep, read, write)
- LLM-based plugin security auditing with anti-prompt-injection canaries
- Code validation before execution in isolated sandbox
- Path jailing for filesystem plugins
- SSRF protection for fetch plugin (DNS + post-connect IP validation)