16 KiB
AGENTS.md
WelsonJS Agent Architecture Guide
WelsonJS consists of two major execution layers:
- JavaScript execution environment based on Windows Script Host (WSH) with
core-jspolyfills - Native/Managed module environment provided through the
WelsonJS.Toolkitsuite
This document defines the agents that operate inside WelsonJS, including their responsibilities, interaction boundaries, and design principles.
1. Overview & Design Principles
WelsonJS aims to enable Windows application development using JavaScript on top of the legacy WSH engine while safely extending system-level functionality through .NET modules.
All agents follow these principles:
- Single responsibility — each agent performs one well-defined task
- Minimal & explicit interfaces
- Security & integrity first
- Polyfill-based compatibility (ES3 → ES5)
- Graceful degradation when native modules are unavailable
2. Agent Types
WelsonJS defines two main categories of agents:
| Category | Description |
|---|---|
| JavaScript Runtime Agent | Executes user scripts in a WSH + polyfill environment. Provides compatibility up to ES5 using core-js and related shims. |
| Native/Managed Module Agents | Extensions written in C# or VB.NET under the WelsonJS.Toolkit solution that provide system-level capabilities. |
3. JavaScript Runtime Agent
3.1 Description
The JavaScript Runtime Agent executes scripts using the Windows Script Host engine (JScript). Although the engine itself is ES3-level, WelsonJS uses core-js polyfills to emulate many ES5 features, allowing more modern syntax and APIs.
3.2 Responsibilities
- Load and initialize polyfills (
core-js,JSON2.js, additional shims) - Provide CommonJS-style module system (
require,exports, caching, resolution) - Execute user scripts in a controlled environment
- Provide bound APIs that connect to native agents
- Ensure minimal pollution of the global scope
- Provide compatibility with classical WSH functions and COM interoperability
- Handle script errors and propagate exceptions with useful metadata
3.3 Execution Constraints
- Must assume an ES3 core with ES5 via polyfills
- Features requiring ES6+ must be explicitly shimmed or avoided
- All host-bound functionality must route through defined native agents
4. Native/Managed Module Agents (Toolkit Agents)
The WelsonJS.Toolkit solution provides several functional agents designed as modular .NET libraries. Each project acts as a distinct agent with its own role and responsibility.
4.1 Catswords.Phantomizer — Assembly Loading Agent
Purpose: Dynamic loading and resolution of native/managed assemblies.
Responsibilities:
- Load DLLs from disk or remote CDN
- Support
.dll.gzcompressed downloads for performance - Perform integrity/signed verification
- Cache resolved versions locally
- Provide fallback when assemblies fail to load
Notes: This agent enables WelsonJS to remain lightweight while extending capabilities dynamically.
4.2 WelsonJS.Esent — Database Access Agent
Purpose: Expose Windows’ native ESENT database engine to JavaScript.
Responsibilities:
- Create, open, and manage ESENT databases
- Provide JS-friendly abstraction for tables, cursors, and transactions
- Perform safe parameter marshaling
- Ensure proper disposal of unmanaged resources
- Support transactional metadata operations (e.g., metadata store, instance tracking)
4.3 WelsonJS.Cryptography — Cryptography Agent
Purpose: Provide cryptographic functions not available in WSH/JS.
Responsibilities:
- Expose symmetric/legacy/industrial cryptographic algorithms
- Bridge specialized Korean algorithms (SEED, ARIA, HIGHT, LEA) where required
- Provide secure random generation utilities
- Ensure compliance with expected test vectors
- Offer safe JS bindings that validate parameters and reject unsafe operations
Additional:
WelsonJS.Cryptography.Test provides validation and regression testing for algorithm correctness.
4.4 WelsonJS.Launcher — Bootstrap Agent
Purpose: Serve as the entry point of a WelsonJS application.
Responsibilities:
- Initialize environment
- Load Phantomizer & toolkit modules
- Load and execute the main JavaScript script
- Handle configuration (AppName, BaseUrl, service mode, etc.)
- Provide safe-mode and fallback execution
- Manage initial logging and diagnostics
Notes: Launcher must start with only .NET BCL dependencies to ensure predictable initialization.
4.5 WelsonJS.Service — Windows Service Agent
Purpose: Allow WelsonJS applications to run as Windows services.
Responsibilities:
- Install/uninstall service
- Run JavaScript scripts in service context
- Manage service lifecycle events (start, stop)
- Provide safe shutdown & worker loop management
4.6 WelsonJS.Toolkit — General Utility Agent
Purpose: A shared utility library providing cross-cutting functionality.
Typical responsibilities include:
- IO helpers
- Reflection helpers
- JS–Native bridging utilities
- Shared types and error-handling helpers
- Logging abstractions
It acts as the common foundation for other Toolkit modules.
5. Optional & Internal Agents
5.1 Interop / Binding Agent
Acts as a transport layer between JS Runtime Agent and Toolkit Agents.
Responsibilities:
- Marshal parameters and return values
- Validate type compatibility
- Protect against injection or malformed input
- Normalize exceptions into JS-friendly error objects
- Enforce version negotiation and capability detection
Often implemented inside each Toolkit module but may be abstracted.
5.2 Security / Policy Agent
Provides security boundaries.
Responsibilities:
- Module integrity verification
- Allowed module list management
- Restricting file system or registry access
- Enforcing sandbox policies for script execution
- Logging suspicious activity
5.3 Fallback / Compatibility Agent
Ensures application execution even without native modules.
Responsibilities:
- JS-only polyfill alternatives
- Reduced functionality mode
- Diagnostics for missing dependencies
6. Agent Interaction Model
[WelsonJS.Launcher]
↓ Initialization + Configuration
[JavaScript Runtime Agent] ←→ [Toolkit Agents]
↑ ↑
(Interop Layer) (Security/Policy)
- Launcher bootstraps the system.
- JS Runtime Agent handles all user logic.
- Toolkit Agents provide extended OS-level capabilities.
- Interop Layer ensures safe crossing between JS and .NET worlds.
- Security Agent governs what is allowed.
7. Implementation Guidelines
- Follow "least-privilege" principles for all native module operations.
- All JS ↔ Native APIs must be explicit and documented.
- Native agents must degrade gracefully when unavailable.
- Polyfills must not assume ES6+ features unless explicitly shimmed.
- Fallback behaviors must be deterministic and logged.
- All agents must respect long-term compatibility from Windows XP → Windows 10/11.
8. Purpose of This Document
AGENTS.md provides a shared understanding across contributors so that:
- New toolkit modules follow consistent architecture.
- JS runtime bindings remain predictable and safe.
- Extension developers can easily understand boundaries and responsibilities.
- The ecosystem grows without introducing breaking or conflicting functionality.
9. Test Structure (Test Plan)
WelsonJS uses JSON-based test profiles plus a script runner (testloader.js) to verify both the JavaScript Runtime Agent and the Toolkit Agents.
A representative profile is test-oss-korea-2023.json, used in the 2023 South Korea OSS Contest to validate the WelsonJS environment.
9.1 Testing Approach
-
Tests are grouped into profiles (single JSON file per profile).
-
Each profile describes:
- Test metadata (description, updated date, dependencies, authors, references, tags)
- Schema version
- An array of test entries, each with
id,description, andtags
-
testloader.js:- Loads a given profile JSON
- Interprets each test
idas a runnable unit (usually bound to a script or implementation defined inside WelsonJS) - Executes them in the same WSH + polyfill environment that real users will use
- Aggregates pass/fail status and reports the result
This keeps tests:
- Close to real execution (same engine, same polyfills)
- Capable of testing JS-only behavior and JS ↔ native agent integration
- Easy to extend by just adding new entries into JSON
9.2 Test Layers Mapped to Existing IDs
The existing test profile covers multiple layers of the system.
-
JavaScript Runtime / Polyfill Layer
es5_polyfills– checks whether polyfills above ES5 level run successfully on the built-in engine.- These tests verify
core-js, JSON handling, and basic language/runtime correctness.
-
Windows Systems & Toolkit Integration
- Registry:
registry_find_provider,registry_write,registry_read - WMI:
wmi_create_object,wmi_execute_query,wmi_result_query - Shell:
shell_create_object,shell_build_command_line,shell_set_charset,shell_working_directory,shell_create_process,shell_execute,shell_run,shell_run_as,shell_find_my_documents,shell_release - PowerShell:
powershell_set_command,powershell_set_file,powershell_set_uri,powershell_execute,powershell_run_as - System information:
system_resolve_env,system_check_as,system_get_os_version,system_get_architecture,system_get_uuid,system_get_working_directory,system_get_script_directory,system_get_network_interfaces,system_get_process_list,system_get_process_list_by_name,system_register_uri,system_pipe_ipc
These exercise the Interop/Binding Agent and various Toolkit Agents that expose Windows APIs.
- Registry:
-
Human Interface / Virtual Input (VHID)
vhid_find_window,vhid_send_click,vhid_send_keys,vhid_send_key_enter,vhid_send_key_functions,vhid_alert,vhid_confirm,vhid_prompt
These validate keyboard/mouse simulation and dialog APIs, ensuring the Virtual Human Interface agent behaves as expected.
-
Network & HTTP Layer
network_http_get,network_http_post,network_http_extended,network_attach_debugger,network_detect_charset,network_detect_http_ssl,network_send_icmp
These tests exercise HTTP/ICMP functionality and optional debugger integration (e.g., Fiddler) via Toolkit Agents.
-
Advanced String / NLP / Utility
extramath_dtm,extramath_cosine_similarity,base64_encode,base64_decode
These validate extra math/string/NLP-style helpers that may be implemented in JS or as native helpers.
-
Chromium / Browser Control
chromium_run,chromium_create_profile,chromium_run_incognito,chromium_navigate,chromium_get_active_pages,chromium_find_page_by_id,chromium_find_pages_by_title,chromium_move_focused,chromium_adjust_window_size,chromium_get_element_position,chromium_get_mapreduced_element_position,chromium_set_value_to_textbox,chromium_send_click,chromium_send_keys,chromium_auto_scroll_until_end
These test the ChromiumDevTools-related agent responsible for controlling a Chromium-based browser.
-
gRPC & GUI Integration
- gRPC:
grpc_run_server,grpc_receive_command - WebView:
gui_check
These validate that network service agents (gRPC) and GUI/WebView integration work correctly in real environments.
- gRPC:
9.3 Test Profile Schema
A test profile JSON follows this general schema:
-
description: Human-readable description of the profile
-
updated_on: Last update date (string, e.g.
"2023-10-30") -
dependencies: Object listing required WelsonJS version or other requirements
-
authors: Array of strings identifying authors
-
references: Array of related URLs (repository, social, external descriptions)
-
tags: Profile-wide tags (technologies, platforms, etc.)
-
schema:
version: Schema version used bytestloader.js(e.g."0.2")
-
tests:
-
Array of test objects, each having:
id: Unique test identifier (string)description: What the test checks (string)tags: Array of tags describing category and domain
-
Example (simplified):
{
"description": "2023 South Korea OSS Contest Test Profile for WelsonJS",
"updated_on": "2023-10-30",
"dependencies": {
"welsonjs": "0.2.7"
},
"schema": {
"version": "0.2"
},
"tests": [
{
"id": "es5_polyfills",
"description": "Checks whether polyfills above the ES5 level run successfully (using Windows' built-in engine).",
"tags": ["JavaScript Engine", "ECMAScript Polyfills"]
}
]
}
The exact semantics for how each
idmaps to a concrete script or implementation are defined intestloader.jsand the surrounding WelsonJS test harness.
9.4 Using testloader.js
testloader.js is the standard runner that:
-
Accepts one or more profile JSON paths (e.g.,
test-oss-korea-2023.json). -
Parses the profile according to the schema version.
-
Iterates over
tests[], and for eachid:- Resolves the underlying implementation (JS file, bound function, etc.)
- Executes the test logic in the WSH + polyfill environment
- Captures success/failure and any diagnostic output
-
Produces a summary result (per test and overall).
When adding or modifying tests:
- Prefer extending existing profiles rather than inventing new formats.
- Keep
idstable once published, so existing CI or documentation references do not break. - Use
tagsto reflect which agent(s) a test touches (e.g.,"Windows Systems","Chromium-Based Browser","gRPC").
9.5 Naming & Organization
Recommended file organization:
/tests
test-oss-korea-2023.json # Contest profile (broad coverage)
... # Future profiles (e.g., cryptography-only, ESENT-only)
testloader.js
Guidelines:
- Use profile-level tags to describe the scope (
"windows","wsh","chromium","grpc", etc.). - Keep large, real-world coverage (like the OSS contest profile) but also allow smaller focused profiles for specific agents (e.g., ESENT regression suite, Cryptography regression suite).
- For new features or agents, introduce corresponding
tests[]entries with descriptiveidanddescription, and appropriatetags.
9.6 Regression & Compatibility
Because WelsonJS targets a wide range of Windows environments:
-
Use the existing wide-coverage profile (like the OSS contest profile) as a baseline regression suite.
-
When fixing a bug in any agent (e.g., ESENT, Chromium control, VHID input, HTTP stack):
- Add or update a test entry in a JSON profile.
- Ensure
testloader.jscan run it in automated environments.
-
Keep compatibility in mind: if behavior must differ by OS version, reflect that in tests or tags (e.g., Windows XP vs Windows 10).
9.7 CI / Automation (Optional)
If a CI pipeline is configured:
-
Add a step that:
- Invokes
testloader.json one or more profiles - Fails the build if any test in the profile fails
- Invokes
-
Optionally support:
- Running a quick subset (e.g., only
es5_polyfills+ core system tests) - Running the full OSS profile for release candidates or nightly builds
- Running a quick subset (e.g., only