kokorobox-native 0.16.1 → 0.16.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -29,6 +29,38 @@ const app = await inspectApplication("/Applications/KokoroBox.app");
29
29
 
30
30
  Check `getNativeCapabilities()` before using optional platform features.
31
31
 
32
+ ## Diagnostics
33
+
34
+ `drainNativeLogs()` returns English JSON-compatible records with `ts`, `level`,
35
+ `target`, and `msg`. Use one consumer to periodically drain the queue into the
36
+ application's log. It retains at most 500 records; overflow produces a warning.
37
+ `setNativeLogLevel("debug" | "info" | "warn" | "error")` changes recording
38
+ severity (default: `info`). Healthy polling is only recorded at `debug`. Operation failures retain
39
+ their original exceptions and causes; lifecycle successes record the operation
40
+ name without arguments, keys, or signatures.
41
+
42
+ The traffic presenter emits JSON Lines to stderr. The Windows portable updater
43
+ also saves its last run in `%TEMP%/kokorobox-portable-updater.log` because Desktop
44
+ exits before extraction. These sidecars include Unix milliseconds in `timestamp`.
45
+
46
+ ## System Proxy diagnostics
47
+
48
+ `getSystemProxyDiagnostics()` returns actual OS configuration with independent
49
+ availability information. Windows, macOS and Linux share the same entry point;
50
+ platform-specific details are nested under `windows`, `macos` or `linux`.
51
+ macOS uses SystemConfiguration for effective HTTP/HTTPS/SOCKS, PAC/discovery,
52
+ primary IPv4/IPv6 services and the current Network Location. Reading never asks
53
+ for administrator authorization. Runtime health and connectivity belong to
54
+ KokoroBox Service, not this API.
55
+
56
+ `setSystemProxy(settings)` supports explicit Windows/macOS manual, PAC and
57
+ disabled actions. macOS honors `onlyActiveDevice`, preserves PAC/discovery
58
+ when restoring manual proxies, and reuses Native's administrator dialog if
59
+ required for a write. Its structured result includes
60
+ `automaticSettingsPreserved`; callers must not resume a legacy watchdog or
61
+ cleanup that would erase those settings. Never invoke this setter merely to
62
+ inspect or refresh diagnostics.
63
+
32
64
  ## Documentation
33
65
 
34
66
  - [JavaScript API guide](../docs/api.md)
package/diagnostics.js ADDED
@@ -0,0 +1,144 @@
1
+ // Diagnostics belong to the calling application. Do not open a log file or
2
+ // retain operation arguments (which may contain keys or signatures).
3
+ const maxEntries = 500;
4
+ const maxMessageLength = 4096;
5
+ const levels = ["debug", "info", "warn", "error"];
6
+ const lifecycleOperations = new Set([
7
+ "runServiceLifecycleElevated",
8
+ "registerMacosManagedService",
9
+ "unregisterMacosManagedService",
10
+ "reloadMacosManagedService",
11
+ "cleanupLegacyMacosService",
12
+ "stopMacosManagedService",
13
+ "repairManagedFilePermissions",
14
+ "setCorePrivileges",
15
+ "applyMacosApplicationRouting",
16
+ "stopMacosApplicationRouting",
17
+ "setLaunchAtLogin",
18
+ "setUwpLoopbackExemption",
19
+ "setSystemProxy",
20
+ ]);
21
+
22
+ function boundedMessage(value) {
23
+ const text = String(value);
24
+ if (text.length <= maxMessageLength) return text;
25
+ let end = maxMessageLength;
26
+ if (/^[\uDC00-\uDFFF]$/.test(text[end])) end--;
27
+ return text.slice(0, end) + "…";
28
+ }
29
+
30
+ export function nativeErrorMessage(error) {
31
+ const parts = [];
32
+ const seen = new Set();
33
+ function visit(value, depth = 0) {
34
+ if (depth > 4 || seen.has(value)) return;
35
+ seen.add(value);
36
+ const message = value instanceof Error ? value.message : String(value);
37
+ if (message && !parts.includes(message))
38
+ parts.push(boundedMessage(message));
39
+ if (value && typeof value === "object" && value.cause != null) {
40
+ if (Array.isArray(value.cause))
41
+ value.cause.slice(0, 4).forEach((item) => visit(item, depth + 1));
42
+ else visit(value.cause, depth + 1);
43
+ }
44
+ }
45
+ visit(error);
46
+ return boundedMessage(parts.join(": "));
47
+ }
48
+
49
+ export function createNativeDiagnostics() {
50
+ let minimum = "info";
51
+ let entries = [];
52
+ let dropped = 0;
53
+ const record = (level, target, msg) => {
54
+ if (levels.indexOf(level) < levels.indexOf(minimum)) return;
55
+ entries.push({
56
+ ts: new Date().toISOString(),
57
+ level,
58
+ target,
59
+ msg: boundedMessage(msg),
60
+ });
61
+ if (entries.length > maxEntries) {
62
+ entries.shift();
63
+ dropped++;
64
+ }
65
+ };
66
+ return {
67
+ setLevel(level) {
68
+ if (!levels.includes(level))
69
+ throw new TypeError(
70
+ "Invalid Native log level: expected debug, info, warn, or error",
71
+ );
72
+ minimum = level;
73
+ },
74
+ drain() {
75
+ const result = entries;
76
+ entries = [];
77
+ if (dropped) {
78
+ result.unshift({
79
+ ts: new Date().toISOString(),
80
+ level: "warn",
81
+ target: "diagnostics",
82
+ msg: `Dropped ${dropped} older Native log entries`,
83
+ });
84
+ dropped = 0;
85
+ }
86
+ return result;
87
+ },
88
+ wrap(target, operation) {
89
+ if (typeof operation !== "function") return operation;
90
+ const failed = (error) => {
91
+ record("error", target, nativeErrorMessage(error));
92
+ throw error;
93
+ };
94
+ const completed = (value) => {
95
+ if (target === "getSystemProxyDiagnostics") {
96
+ record(value.status === "available" ? "info" : "warn", "SystemProxy", `[SystemProxy] Configuration: ${value.status}; Proxy enabled: ${value.enabled ?? "unknown"}`);
97
+ if (value.macos) {
98
+ const effective = value.macos.effective;
99
+ const count = value.macos.activeServiceIds?.length ?? 0;
100
+ record("info", "SystemProxy", `[SystemProxy/macOS] Active network services: ${count}; HTTP: ${effective?.http?.enabled ?? "unknown"}; HTTPS: ${effective?.https?.enabled ?? "unknown"}; PAC: ${effective?.pacEnabled ?? "unknown"}; Auto discovery: ${effective?.autoDiscovery ?? "unknown"}`);
101
+ }
102
+ if (value.linux) {
103
+ const backend = ["gnome", "kde", "environment", "unsupported"].includes(value.linux.backend) ? value.linux.backend : "unknown";
104
+ const portal = value.linux.portal?.status === "available" ? "available" : "unavailable";
105
+ record("info", "SystemProxy", `[SystemProxy] Linux backend: ${backend}; Portal: ${portal}`);
106
+ }
107
+ if (value.pac?.enabled) record("info", "SystemProxy", "[SystemProxy] PAC configuration detected");
108
+ for (const [name, state] of Object.entries({winHttp: value.windows?.winHttp, appContainer: value.windows?.appContainer})) {
109
+ if (state?.status === "unavailable") record("warn", "SystemProxy", `[SystemProxy] ${name}: unavailable`);
110
+ }
111
+ return value;
112
+ }
113
+ if (value && value.state === "error")
114
+ record(
115
+ "error",
116
+ target,
117
+ typeof value.message === "string"
118
+ ? value.message
119
+ : "Native operation returned an error status",
120
+ );
121
+ else if (lifecycleOperations.has(target))
122
+ record("info", target, "Native operation completed");
123
+ else record("debug", target, "Native operation completed");
124
+ return value;
125
+ };
126
+ return function (...args) {
127
+ let result;
128
+ try {
129
+ result = Reflect.apply(operation, this, args);
130
+ } catch (error) {
131
+ return failed(error);
132
+ }
133
+ if (result && typeof result.then === "function")
134
+ return result.then(completed, failed);
135
+ return completed(result);
136
+ };
137
+ },
138
+ };
139
+ }
140
+
141
+ const diagnostics = createNativeDiagnostics();
142
+ export const wrapNativeOperation = diagnostics.wrap;
143
+ export const drainNativeLogs = diagnostics.drain;
144
+ export const setNativeLogLevel = diagnostics.setLevel;
package/index.d.ts CHANGED
@@ -1,3 +1,14 @@
1
+ export interface NativeLogEntry {
2
+ ts: string;
3
+ level: "debug" | "info" | "warn" | "error";
4
+ target: string;
5
+ msg: string;
6
+ }
7
+ /** Drains at most 500 entries and an optional overflow warning; use one consumer. */
8
+ export declare function drainNativeLogs(): NativeLogEntry[];
9
+ /** Controls recording, independently from display language. Defaults to info. */
10
+ export declare function setNativeLogLevel(level: NativeLogEntry["level"]): void;
11
+
1
12
  export interface UwpLoopbackApp {
2
13
  /** Opaque identifier used only when changing this app's loopback exemption. */
3
14
  id: string;
@@ -314,3 +325,94 @@ export function ensureKokoroBoxCoreFirewall(
314
325
  ): void;
315
326
  export function listUwpLoopbackApps(): UwpLoopbackApp[];
316
327
  export function setUwpLoopbackExemption(id: string, enabled: boolean): void;
328
+
329
+ export interface NativeProxyEndpoint {
330
+ host: string;
331
+ port: number;
332
+ }
333
+ export interface MacProxyProtocol {
334
+ enabled: boolean;
335
+ endpoint?: NativeProxyEndpoint | null;
336
+ }
337
+ export interface MacProxyState {
338
+ http: MacProxyProtocol;
339
+ https: MacProxyProtocol;
340
+ socks: MacProxyProtocol;
341
+ pacEnabled: boolean;
342
+ pacUrl?: string | null;
343
+ autoDiscovery: boolean;
344
+ bypass: string[];
345
+ excludeSimpleHostnames: boolean;
346
+ }
347
+ export interface MacNetworkService {
348
+ id: string;
349
+ name: string;
350
+ interface?: string | null;
351
+ enabled: boolean;
352
+ active: boolean;
353
+ primary: boolean;
354
+ status: "available" | "unavailable";
355
+ proxies?: MacProxyState | null;
356
+ }
357
+ export interface MacOSProxyDetails {
358
+ effective?: MacProxyState | null;
359
+ activeServiceIds: string[];
360
+ services: MacNetworkService[];
361
+ networkLocation?: string | null;
362
+ locationErrorCode?: string | null;
363
+ serviceErrorCode?: string | null;
364
+ }
365
+ export interface NativeSystemProxyMutation {
366
+ automaticSettingsPreserved: boolean;
367
+ }
368
+ export interface NativeSystemProxyDiagnostics {
369
+ platform: "windows" | "darwin" | "linux";
370
+ status: "available" | "unavailable" | "unsupported";
371
+ errorCode?: string | null;
372
+ enabled?: boolean | null;
373
+ proxies: {
374
+ http?: NativeProxyEndpoint | null;
375
+ https?: NativeProxyEndpoint | null;
376
+ socks?: NativeProxyEndpoint | null;
377
+ };
378
+ pac?: { enabled: boolean; url?: string | null } | null;
379
+ bypass: string[];
380
+ macos?: MacOSProxyDetails | null;
381
+ linux?: {
382
+ desktopEnvironment: string;
383
+ backend: "gnome" | "kde" | "environment" | "unsupported";
384
+ mode?: "none" | "manual" | "auto" | "wpad" | "environment" | null;
385
+ reversedBypass: boolean;
386
+ environment: { name: string; endpoint?: NativeProxyEndpoint | null; bypass: string[]; valid: boolean }[];
387
+ portal: { status: "available" | "unavailable"; direct: boolean; proxies: NativeProxyEndpoint[]; errorCode?: string | null };
388
+ } | null;
389
+ windows?: {
390
+ proxyServer?: string | null;
391
+ proxyOverride?: string | null;
392
+ autoConfigUrl?: string | null;
393
+ winHttp: {
394
+ status: "available" | "unavailable";
395
+ mode?: "direct" | "proxy" | "advanced" | null;
396
+ proxy?: string | null;
397
+ bypass?: string | null;
398
+ errorCode?: string | null;
399
+ };
400
+ appContainer: {
401
+ supported: boolean;
402
+ status: "available" | "unavailable";
403
+ loopbackExemptionCount?: number | null;
404
+ errorCode?: string | null;
405
+ };
406
+ } | null;
407
+ }
408
+ export interface NativeSystemProxySettings {
409
+ mode: "manual" | "auto" | "disabled";
410
+ host?: string;
411
+ port?: number;
412
+ bypass: string[];
413
+ pacUrl?: string;
414
+ onlyActiveDevice?: boolean;
415
+ }
416
+ export declare function getSystemProxyDiagnostics(): Promise<NativeSystemProxyDiagnostics>;
417
+ /** Explicit user action only. Leaves WinHTTP/UWP unchanged; macOS manual restore preserves PAC/discovery. */
418
+ export declare function setSystemProxy(settings: NativeSystemProxySettings): Promise<NativeSystemProxyMutation>;
package/index.js CHANGED
@@ -5,6 +5,13 @@
5
5
  import { existsSync } from 'node:fs'
6
6
  import { dirname, join } from "node:path";
7
7
  import { createRequire } from "node:module";
8
+ import {
9
+ nativeErrorMessage,
10
+ wrapNativeOperation,
11
+ drainNativeLogs,
12
+ setNativeLogLevel,
13
+ } from "./diagnostics.js";
14
+ export { drainNativeLogs, setNativeLogLevel };
8
15
 
9
16
  const require = createRequire(import.meta.url);
10
17
  const __dirname = new URL(".", import.meta.url).pathname.replace(
@@ -71,7 +78,9 @@ export function getPortableUpdaterPath() {
71
78
  const packagedPath = join(dirname(packageEntry), filename);
72
79
  if (existsSync(packagedPath)) return packagedPath;
73
80
  }
74
- throw new Error(`Portable updater is missing for ${process.platform} ${process.arch}`);
81
+ throw new Error(
82
+ `Portable updater is missing for ${process.platform} ${process.arch}`,
83
+ );
75
84
  }
76
85
 
77
86
  function requireNative() {
@@ -105,49 +114,91 @@ function requireNative() {
105
114
  const nativeBinding = requireNative();
106
115
 
107
116
  if (!nativeBinding) {
108
- const error = new Error("Failed to load kokorobox-native binding");
117
+ const detail = nativeErrorMessage({
118
+ cause: loadErrors,
119
+ toString: () => "Failed to load kokorobox-native binding",
120
+ });
121
+ const error = new Error(detail);
109
122
  error.cause = loadErrors;
110
123
  throw error;
111
124
  }
112
125
 
113
- export default nativeBinding;
114
- export const fileToDataUrl = nativeBinding.fileToDataUrl;
115
- export const fileToStr = nativeBinding.fileToStr;
116
- export const getAppName = nativeBinding.getAppName;
117
- export const getNativeCapabilities = nativeBinding.getNativeCapabilities;
118
- export const getWindowsServiceStatus = nativeBinding.getWindowsServiceStatus;
119
- export const getLinuxServiceStatus = nativeBinding.getLinuxServiceStatus;
120
- export const setTerminalProxyEnvironment = nativeBinding.setTerminalProxyEnvironment;
121
- export const clearTerminalProxyEnvironment = nativeBinding.clearTerminalProxyEnvironment;
122
- export const findExecutables = nativeBinding.findExecutables;
123
- export const getLaunchAtLogin = nativeBinding.getLaunchAtLogin;
124
- export const setLaunchAtLogin = nativeBinding.setLaunchAtLogin;
125
- export const getNetworkContext = nativeBinding.getNetworkContext;
126
- export const waitForNetworkContextChange = nativeBinding.waitForNetworkContextChange;
127
- export const getMacosManagedServiceStatus = nativeBinding.getMacosManagedServiceStatus;
128
- export const getMacosServiceProcessStatus = nativeBinding.getMacosServiceProcessStatus;
129
- export const registerMacosManagedService = nativeBinding.registerMacosManagedService;
130
- export const unregisterMacosManagedService = nativeBinding.unregisterMacosManagedService;
131
- export const reloadMacosManagedService = nativeBinding.reloadMacosManagedService;
132
- export const openMacosLoginItemsSettings = nativeBinding.openMacosLoginItemsSettings;
133
- export const applyMacosApplicationRouting = nativeBinding.applyMacosApplicationRouting;
134
- export const getMacosApplicationRoutingStatus = nativeBinding.getMacosApplicationRoutingStatus;
135
- export const stopMacosApplicationRouting = nativeBinding.stopMacosApplicationRouting;
136
- export const openMacosApplicationRoutingSettings = nativeBinding.openMacosApplicationRoutingSettings;
137
- export const runServiceLifecycleElevated = nativeBinding.runServiceLifecycleElevated;
138
- export const cleanupLegacyMacosService = nativeBinding.cleanupLegacyMacosService;
139
- export const stopMacosManagedService = nativeBinding.stopMacosManagedService;
140
- export const repairManagedFilePermissions = nativeBinding.repairManagedFilePermissions;
141
- export const relaunchCurrentApplicationWithPrivilege = nativeBinding.relaunchCurrentApplicationWithPrivilege;
142
- export const getCorePrivilegeStatus = nativeBinding.getCorePrivilegeStatus;
143
- export const setCorePrivileges = nativeBinding.setCorePrivileges;
144
- export const inspectApplication = nativeBinding.inspectApplication;
145
- export const scanWindowsApplications = nativeBinding.scanWindowsApplications;
146
- export const getCurrentUserSid = nativeBinding.getCurrentUserSid;
147
- export const isRunningAsAdmin = nativeBinding.isRunningAsAdmin;
148
- export const ensureKokoroBoxCoreFirewall = nativeBinding.ensureKokoroBoxCoreFirewall;
149
- export const listUwpLoopbackApps = nativeBinding.listUwpLoopbackApps;
150
- export const setUwpLoopbackExemption = nativeBinding.setUwpLoopbackExemption;
151
- export const ServiceIdentity = nativeBinding.ServiceIdentity;
152
- export const openServiceIdentity = nativeBinding.openServiceIdentity;
153
- export const deleteServiceIdentity = nativeBinding.deleteServiceIdentity;
126
+ // Preserve native classes and unsupported exports; wrap callable operations
127
+ // for both named imports and the default binding without changing arguments.
128
+ const diagnosticBinding = {};
129
+ for (const [name, descriptor] of Object.entries(
130
+ Object.getOwnPropertyDescriptors(nativeBinding),
131
+ )) {
132
+ if (/^[a-z]/.test(name) && typeof descriptor.value === "function") {
133
+ descriptor.value = wrapNativeOperation(name, descriptor.value);
134
+ }
135
+ Object.defineProperty(diagnosticBinding, name, descriptor);
136
+ }
137
+ diagnosticBinding.drainNativeLogs = drainNativeLogs;
138
+ diagnosticBinding.setNativeLogLevel = setNativeLogLevel;
139
+ export default diagnosticBinding;
140
+ export const fileToDataUrl = diagnosticBinding.fileToDataUrl;
141
+ export const fileToStr = diagnosticBinding.fileToStr;
142
+ export const getAppName = diagnosticBinding.getAppName;
143
+ export const getNativeCapabilities = diagnosticBinding.getNativeCapabilities;
144
+ export const getWindowsServiceStatus =
145
+ diagnosticBinding.getWindowsServiceStatus;
146
+ export const getLinuxServiceStatus = diagnosticBinding.getLinuxServiceStatus;
147
+ export const setTerminalProxyEnvironment =
148
+ diagnosticBinding.setTerminalProxyEnvironment;
149
+ export const clearTerminalProxyEnvironment =
150
+ diagnosticBinding.clearTerminalProxyEnvironment;
151
+ export const findExecutables = diagnosticBinding.findExecutables;
152
+ export const getLaunchAtLogin = diagnosticBinding.getLaunchAtLogin;
153
+ export const setLaunchAtLogin = diagnosticBinding.setLaunchAtLogin;
154
+ export const getNetworkContext = diagnosticBinding.getNetworkContext;
155
+ export const waitForNetworkContextChange =
156
+ diagnosticBinding.waitForNetworkContextChange;
157
+ export const getMacosManagedServiceStatus =
158
+ diagnosticBinding.getMacosManagedServiceStatus;
159
+ export const getMacosServiceProcessStatus =
160
+ diagnosticBinding.getMacosServiceProcessStatus;
161
+ export const registerMacosManagedService =
162
+ diagnosticBinding.registerMacosManagedService;
163
+ export const unregisterMacosManagedService =
164
+ diagnosticBinding.unregisterMacosManagedService;
165
+ export const reloadMacosManagedService =
166
+ diagnosticBinding.reloadMacosManagedService;
167
+ export const openMacosLoginItemsSettings =
168
+ diagnosticBinding.openMacosLoginItemsSettings;
169
+ export const applyMacosApplicationRouting =
170
+ diagnosticBinding.applyMacosApplicationRouting;
171
+ export const getMacosApplicationRoutingStatus =
172
+ diagnosticBinding.getMacosApplicationRoutingStatus;
173
+ export const stopMacosApplicationRouting =
174
+ diagnosticBinding.stopMacosApplicationRouting;
175
+ export const openMacosApplicationRoutingSettings =
176
+ diagnosticBinding.openMacosApplicationRoutingSettings;
177
+ export const runServiceLifecycleElevated =
178
+ diagnosticBinding.runServiceLifecycleElevated;
179
+ export const cleanupLegacyMacosService =
180
+ diagnosticBinding.cleanupLegacyMacosService;
181
+ export const stopMacosManagedService =
182
+ diagnosticBinding.stopMacosManagedService;
183
+ export const repairManagedFilePermissions =
184
+ diagnosticBinding.repairManagedFilePermissions;
185
+ export const relaunchCurrentApplicationWithPrivilege =
186
+ diagnosticBinding.relaunchCurrentApplicationWithPrivilege;
187
+ export const getCorePrivilegeStatus = diagnosticBinding.getCorePrivilegeStatus;
188
+ export const setCorePrivileges = diagnosticBinding.setCorePrivileges;
189
+ export const inspectApplication = diagnosticBinding.inspectApplication;
190
+ export const scanWindowsApplications =
191
+ diagnosticBinding.scanWindowsApplications;
192
+ export const getCurrentUserSid = diagnosticBinding.getCurrentUserSid;
193
+ export const isRunningAsAdmin = diagnosticBinding.isRunningAsAdmin;
194
+ export const ensureKokoroBoxCoreFirewall =
195
+ diagnosticBinding.ensureKokoroBoxCoreFirewall;
196
+ export const listUwpLoopbackApps = diagnosticBinding.listUwpLoopbackApps;
197
+ export const setUwpLoopbackExemption =
198
+ diagnosticBinding.setUwpLoopbackExemption;
199
+ export const ServiceIdentity = diagnosticBinding.ServiceIdentity;
200
+ export const openServiceIdentity = diagnosticBinding.openServiceIdentity;
201
+ export const deleteServiceIdentity = diagnosticBinding.deleteServiceIdentity;
202
+
203
+ export const getSystemProxyDiagnostics = diagnosticBinding.getSystemProxyDiagnostics;
204
+ export const setSystemProxy = diagnosticBinding.setSystemProxy;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kokorobox-native",
3
- "version": "0.16.1",
3
+ "version": "0.16.3",
4
4
  "description": "KokoroBox native bridge",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -17,6 +17,7 @@
17
17
  "license": "GPL-3.0-only",
18
18
  "files": [
19
19
  "index.js",
20
+ "diagnostics.js",
20
21
  "index.d.ts",
21
22
  "README.md"
22
23
  ],
@@ -32,6 +33,7 @@
32
33
  ]
33
34
  },
34
35
  "scripts": {
36
+ "test:logs": "node --test tests/diagnostics.test.mjs",
35
37
  "build": "napi build --platform --release --strip --no-js --dts napi.generated.d.ts",
36
38
  "build:debug": "napi build --platform --no-js --dts napi.generated.d.ts",
37
39
  "create-npm-dirs": "napi create-npm-dirs",
@@ -48,11 +50,11 @@
48
50
  "access": "public"
49
51
  },
50
52
  "optionalDependencies": {
51
- "kokorobox-native-win32-x64-msvc": "0.16.1",
52
- "kokorobox-native-win32-arm64-msvc": "0.16.1",
53
- "kokorobox-native-darwin-x64": "0.16.1",
54
- "kokorobox-native-darwin-arm64": "0.16.1",
55
- "kokorobox-native-linux-x64-gnu": "0.16.1",
56
- "kokorobox-native-linux-arm64-gnu": "0.16.1"
53
+ "kokorobox-native-win32-x64-msvc": "0.16.3",
54
+ "kokorobox-native-win32-arm64-msvc": "0.16.3",
55
+ "kokorobox-native-darwin-x64": "0.16.3",
56
+ "kokorobox-native-darwin-arm64": "0.16.3",
57
+ "kokorobox-native-linux-x64-gnu": "0.16.3",
58
+ "kokorobox-native-linux-arm64-gnu": "0.16.3"
57
59
  }
58
60
  }