diff --git a/.gitignore b/.gitignore
index 8ea831d..5ca0757 100644
--- a/.gitignore
+++ b/.gitignore
@@ -36,4 +36,5 @@ ____*
bindings/wasm/pkg/
sdk/js/server/pkg/
sdk/js/server/dist/
-sdk/js/web/pkg/
\ No newline at end of file
+sdk/js/web/pkg/
+pnpm-lock.yaml
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..f7d7fa9
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,20 @@
+### v6.0.1 - 19 March 2026
+- added wasm bindings for Node, Bun, Browser, Deno and Edge
+- Bug fix in wasm binding
+
+### v6.0 - 18 March 26
+- added has_decision_observer in runtime : Python SDK
+- Fixed Rust engine bugs
+- Support for JS server sdk
+
+### v0.5.1
+- wasm bindings added
+
+### v5.0
+- Support for MCP, Agents and LLM integrations in Python SDK
+
+### v0.4.0 & Earlier
+- Bug fixes
+- Added Error class in Python SDK
+- Python SDK
+- Initial release with core rust engine
\ No newline at end of file
diff --git a/Cargo.toml b/Cargo.toml
index bb5d439..06c0483 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -9,7 +9,7 @@ members = [
resolver = "2"
[workspace.package]
-version = "0.6.0"
+version = "0.6.1"
edition = "2021"
license = "Apache-2.0"
authors = ["Amit Saxena"]
diff --git a/bindings/node/test_basic.js b/bindings/node/test_basic.js
index f7111b6..31338b1 100644
--- a/bindings/node/test_basic.js
+++ b/bindings/node/test_basic.js
@@ -36,7 +36,7 @@ const actra = new Actra(schema, policy)
const result = actra.evaluate({
action: { type: "delete" },
actor: { role: "admin" },
- snapshot: {}
+ snapshot: {fraud_flag:true}
})
console.log(result)
\ No newline at end of file
diff --git a/bindings/wasm/package.json b/bindings/wasm/package.json
new file mode 100644
index 0000000..7844ba2
--- /dev/null
+++ b/bindings/wasm/package.json
@@ -0,0 +1,33 @@
+{
+ "name": "wasm-binding-test",
+ "version": "1.0.0",
+ "type": "module",
+ "files": [
+ "pkg"
+ ],
+ "scripts": {
+ "build": "node scripts/build.mjs",
+ "test:webpack": "webpack serve --config test/webpack/webpack.config.js",
+ "test:node": "node test/test-node.mjs",
+ "test:bun": "bun test/test-bun.mjs",
+ "test:deno": "deno run --allow-read test/test-deno.ts",
+ "test:bundler": "node test/test-bundler.mjs",
+ "test:browser": "npx serve ."
+ },
+ "exports": {
+ ".": {
+ "types": "./pkg/node/actra_wasm.d.ts",
+ "node": "./pkg/node/actra_wasm.js",
+ "deno": "./pkg/deno/actra_wasm.js",
+ "browser": "./pkg/web/actra_wasm.js",
+ "worker": "./pkg/web/actra_wasm.js",
+ "default": "./pkg/bundler/actra_wasm.js"
+ }
+ },
+ "devDependencies": {
+ "html-webpack-plugin": "^5.6.6",
+ "webpack": "^5.105.4",
+ "webpack-cli": "^7.0.2",
+ "webpack-dev-server": "^5.2.3"
+ }
+}
diff --git a/bindings/wasm/scripts/build.mjs b/bindings/wasm/scripts/build.mjs
new file mode 100644
index 0000000..479c1f9
--- /dev/null
+++ b/bindings/wasm/scripts/build.mjs
@@ -0,0 +1,24 @@
+import { execSync } from "child_process";
+import { rmSync, existsSync } from "fs";
+
+const builds = [
+ { target: "bundler", out: "pkg/bundler" },
+ { target: "web", out: "pkg/web" },
+ { target: "nodejs", out: "pkg/node" },
+ { target: "deno", out: "pkg/deno" }
+];
+
+console.log("CWD:", process.cwd());
+
+if (existsSync("pkg")) {
+ console.log("\nCleaning pkg directory...");
+ rmSync("pkg", { recursive: true, force: true });
+}
+
+for (const b of builds) {
+ console.log(`\nBuilding ${b.target}...`);
+ execSync(
+ `wasm-pack build . --target ${b.target} --out-dir ${b.out} --release`,
+ { stdio: "inherit" }
+ );
+}
\ No newline at end of file
diff --git a/bindings/wasm/test/browser_test.html b/bindings/wasm/test/browser_test.html
deleted file mode 100644
index 88e60ca..0000000
--- a/bindings/wasm/test/browser_test.html
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
- Actra WASM Test
-
-
- Actra WASM Browser Test
-
-
-
-
-
\ No newline at end of file
diff --git a/bindings/wasm/test/loader.js b/bindings/wasm/test/loader.js
deleted file mode 100644
index d8bb474..0000000
--- a/bindings/wasm/test/loader.js
+++ /dev/null
@@ -1,21 +0,0 @@
-let wasmModule;
-
-export async function loadActra() {
- if (!wasmModule) {
- if (typeof window !== "undefined") {
- // Browser
- wasmModule = await import("../pkg/web/actra_wasm.js");
- // Prefer default export init (common in wasm-pack)
- if (wasmModule.default) {
- await wasmModule.default();
- } else if (wasmModule.init) {
- await wasmModule.init();
- }
- } else {
- // Node, Bun, Cloudflare Workers, Lambda
- wasmModule = await import("../pkg/all/actra_wasm.js");
- }
- }
-
- return wasmModule;
-}
\ No newline at end of file
diff --git a/bindings/wasm/test/node_test.js b/bindings/wasm/test/node_test.js
deleted file mode 100644
index 550d5be..0000000
--- a/bindings/wasm/test/node_test.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import { loadActra } from "./loader.js";
-
-async function run() {
- const wasm = await loadActra();
- console.log("Actra WASM compiler version:", wasm.Actra.compiler_version());
-
-}
-
-run();
\ No newline at end of file
diff --git a/bindings/wasm/test/package.json b/bindings/wasm/test/package.json
deleted file mode 100644
index 746685a..0000000
--- a/bindings/wasm/test/package.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "name": "test",
- "type": "module",
- "version": "1.0.0",
- "main": "index.js",
- "scripts": {
- "start": "node --experimental-wasm-modules index.js"
- },
- "keywords": [],
- "author": "",
- "license": "Apache-2.0",
- "description": "",
- "dependencies": {
- "actra-wasm": "file:../pkg"
- },
- "devDependencies": {
- "esbuild": "^0.27.4"
- }
-}
\ No newline at end of file
diff --git a/bindings/wasm/test/test-bun.mjs b/bindings/wasm/test/test-bun.mjs
new file mode 100644
index 0000000..e4da964
--- /dev/null
+++ b/bindings/wasm/test/test-bun.mjs
@@ -0,0 +1,11 @@
+async function run() {
+ try {
+ const wasm = await import("../pkg/node/actra_wasm.js");
+ const version = wasm.Actra.compiler_version();
+ console.log("Actra WASM compiler version:", version);
+ } catch (err) {
+ console.error(err);
+ }
+}
+
+run();
\ No newline at end of file
diff --git a/bindings/wasm/test/test-bundler.mjs b/bindings/wasm/test/test-bundler.mjs
new file mode 100644
index 0000000..44f5f93
--- /dev/null
+++ b/bindings/wasm/test/test-bundler.mjs
@@ -0,0 +1,11 @@
+async function run() {
+ try {
+ const wasm = await import("../pkg/bundler/actra_wasm.js");
+ const version = wasm.Actra.compiler_version();
+ console.log("Actra WASM compiler version:", version);
+ } catch (err) {
+ console.error(err);
+ }
+}
+
+run();
\ No newline at end of file
diff --git a/bindings/wasm/test/test-deno.ts b/bindings/wasm/test/test-deno.ts
new file mode 100644
index 0000000..c37a6e8
--- /dev/null
+++ b/bindings/wasm/test/test-deno.ts
@@ -0,0 +1,11 @@
+async function run() {
+ try {
+ const wasm = await import("../pkg/deno/actra_wasm.js");
+ const version = wasm.Actra.compiler_version();
+ console.log("Actra WASM compiler version:", version);
+ } catch (err) {
+ console.error(err);
+ }
+}
+
+run();
\ No newline at end of file
diff --git a/bindings/wasm/test/test-node.mjs b/bindings/wasm/test/test-node.mjs
new file mode 100644
index 0000000..e4da964
--- /dev/null
+++ b/bindings/wasm/test/test-node.mjs
@@ -0,0 +1,11 @@
+async function run() {
+ try {
+ const wasm = await import("../pkg/node/actra_wasm.js");
+ const version = wasm.Actra.compiler_version();
+ console.log("Actra WASM compiler version:", version);
+ } catch (err) {
+ console.error(err);
+ }
+}
+
+run();
\ No newline at end of file
diff --git a/bindings/wasm/test/test_browser.html b/bindings/wasm/test/test_browser.html
new file mode 100644
index 0000000..ebd1cdd
--- /dev/null
+++ b/bindings/wasm/test/test_browser.html
@@ -0,0 +1,24 @@
+
+
+
+
+ Browser Test
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/bindings/wasm/test/webpack/index.html b/bindings/wasm/test/webpack/index.html
new file mode 100644
index 0000000..138467d
--- /dev/null
+++ b/bindings/wasm/test/webpack/index.html
@@ -0,0 +1,9 @@
+
+
+
+
+ Webpack WASM Test
+ Loading...
+
+
+
\ No newline at end of file
diff --git a/bindings/wasm/test/webpack/index.js b/bindings/wasm/test/webpack/index.js
new file mode 100644
index 0000000..04ff32e
--- /dev/null
+++ b/bindings/wasm/test/webpack/index.js
@@ -0,0 +1,18 @@
+async function run() {
+ const el = document.getElementById("output");
+
+ try {
+ el.textContent = "Loading WASM...";
+
+ const wasm = await import("../../pkg/bundler/actra_wasm.js");
+
+ const version = wasm.Actra.compiler_version();
+
+ el.textContent = "Compiler Version: " + version;
+ } catch (err) {
+ console.error(err);
+ el.textContent = "Error loading WASM";
+ }
+}
+
+run();
\ No newline at end of file
diff --git a/bindings/wasm/test/webpack/webpack.config.js b/bindings/wasm/test/webpack/webpack.config.js
new file mode 100644
index 0000000..69b5a08
--- /dev/null
+++ b/bindings/wasm/test/webpack/webpack.config.js
@@ -0,0 +1,30 @@
+import path from "path";
+import HtmlWebpackPlugin from "html-webpack-plugin";
+
+export default {
+ mode: "development",
+ devtool: "source-map",
+
+ entry: "./test/webpack/index.js",
+
+ output: {
+ path: path.resolve("./test/webpack/dist"),
+ filename: "bundle.js",
+ publicPath: "/"
+ },
+
+ experiments: {
+ asyncWebAssembly: true
+ },
+
+ plugins: [
+ new HtmlWebpackPlugin({
+ template: "./test/webpack/index.html"
+ })
+ ],
+
+ devServer: {
+ port: 8080,
+ open: true
+ }
+};
\ No newline at end of file
diff --git a/bindings/wasm/webpack.config.js b/bindings/wasm/webpack.config.js
new file mode 100644
index 0000000..c8f80dc
--- /dev/null
+++ b/bindings/wasm/webpack.config.js
@@ -0,0 +1,6 @@
+export default {
+ mode: "development",
+ experiments: {
+ asyncWebAssembly: true
+ }
+};
\ No newline at end of file
diff --git a/scripts/wasm_pack.sh b/scripts/wasm_pack.sh
index 69eac1a..2f2176e 100644
--- a/scripts/wasm_pack.sh
+++ b/scripts/wasm_pack.sh
@@ -29,6 +29,7 @@ wasm-pack build bindings/wasm --target web --out-dir pkg/web --release
# 2. Server build
wasm-pack build bindings/wasm --target nodejs --out-dir pkg/server --release
+wasm-pack build bindings/wasm --target bundler --out-dir pkg/server --release
# cargo install wasm-opt