easymodd 0.1.0__tar.gz → 0.2.4__tar.gz

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.
Files changed (66) hide show
  1. easymodd-0.2.4/PKG-INFO +466 -0
  2. easymodd-0.2.4/README.md +426 -0
  3. {easymodd-0.1.0 → easymodd-0.2.4}/pyproject.toml +5 -3
  4. easymodd-0.2.4/src/EasyModel/__init__.py +81 -0
  5. easymodd-0.2.4/src/EasyModel/app_builder.py +45 -0
  6. easymodd-0.2.4/src/EasyModel/artifacts.py +64 -0
  7. easymodd-0.2.4/src/EasyModel/backends.py +52 -0
  8. easymodd-0.2.4/src/EasyModel/cli.py +129 -0
  9. easymodd-0.2.4/src/EasyModel/compilers.py +51 -0
  10. easymodd-0.2.4/src/EasyModel/config.py +43 -0
  11. easymodd-0.2.4/src/EasyModel/decompilers.py +55 -0
  12. easymodd-0.2.4/src/EasyModel/encryption.py +180 -0
  13. easymodd-0.2.4/src/EasyModel/errors.py +29 -0
  14. easymodd-0.2.4/src/EasyModel/events.py +96 -0
  15. easymodd-0.2.4/src/EasyModel/extensions.py +88 -0
  16. easymodd-0.2.4/src/EasyModel/mathx.py +109 -0
  17. easymodd-0.2.4/src/EasyModel/networking.py +165 -0
  18. easymodd-0.2.4/src/EasyModel/passport.py +234 -0
  19. easymodd-0.2.4/src/EasyModel/process.py +73 -0
  20. easymodd-0.2.4/src/EasyModel/reports.py +46 -0
  21. easymodd-0.2.4/src/EasyModel/security.py +35 -0
  22. easymodd-0.2.4/src/EasyModel/simulation.py +76 -0
  23. easymodd-0.2.4/src/EasyModel/webui.py +172 -0
  24. easymodd-0.2.4/src/EasyModel/workbench.py +157 -0
  25. {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/__init__.py +5 -1
  26. {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/cli.py +14 -1
  27. easymodd-0.2.4/src/easymodd/corpus.py +159 -0
  28. {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/data.py +64 -0
  29. easymodd-0.2.4/src/easymodd.egg-info/PKG-INFO +466 -0
  30. {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd.egg-info/SOURCES.txt +28 -1
  31. {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd.egg-info/entry_points.txt +1 -0
  32. {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd.egg-info/requires.txt +3 -0
  33. easymodd-0.2.4/src/easymodd.egg-info/top_level.txt +2 -0
  34. easymodd-0.2.4/tests/test_artifacts.py +64 -0
  35. easymodd-0.2.4/tests/test_full_stack.py +53 -0
  36. easymodd-0.2.4/tests/test_multifile_project.py +51 -0
  37. easymodd-0.2.4/tests/test_security_and_web.py +99 -0
  38. easymodd-0.2.4/tests/test_training_and_math.py +66 -0
  39. easymodd-0.1.0/PKG-INFO +0 -231
  40. easymodd-0.1.0/README.md +0 -193
  41. easymodd-0.1.0/src/easymodd.egg-info/PKG-INFO +0 -231
  42. easymodd-0.1.0/src/easymodd.egg-info/top_level.txt +0 -1
  43. {easymodd-0.1.0 → easymodd-0.2.4}/LICENSE +0 -0
  44. {easymodd-0.1.0 → easymodd-0.2.4}/setup.cfg +0 -0
  45. {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/callbacks.py +0 -0
  46. {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/checkpoints.py +0 -0
  47. {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/config.py +0 -0
  48. {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/experiments.py +0 -0
  49. {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/losses.py +0 -0
  50. {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/metrics.py +0 -0
  51. {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/models/__init__.py +0 -0
  52. {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/models/mlp.py +0 -0
  53. {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/models/text_transformer.py +0 -0
  54. {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/models/vision_transformer.py +0 -0
  55. {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/nn.py +0 -0
  56. {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/optim.py +0 -0
  57. {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/py.typed +0 -0
  58. {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/registry.py +0 -0
  59. {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/schedulers.py +0 -0
  60. {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/secret_store.py +0 -0
  61. {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/serialization.py +0 -0
  62. {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/tensor.py +0 -0
  63. {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/training.py +0 -0
  64. {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/transforms.py +0 -0
  65. {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd/visualization.py +0 -0
  66. {easymodd-0.1.0 → easymodd-0.2.4}/src/easymodd.egg-info/dependency_links.txt +0 -0
@@ -0,0 +1,466 @@
1
+ Metadata-Version: 2.4
2
+ Name: easymodd
3
+ Version: 0.2.4
4
+ Summary: Composable model training, artifact analysis, secure workflows, and efficient data tooling
5
+ Author: Vnex Lab
6
+ Maintainer: Vnex Lab
7
+ License-Expression: MIT
8
+ Project-URL: Homepage, https://github.com/vnex-lab/EasyMoDD
9
+ Project-URL: Repository, https://github.com/vnex-lab/EasyMoDD
10
+ Project-URL: Issues, https://github.com/vnex-lab/EasyMoDD/issues
11
+ Project-URL: Documentation, https://github.com/vnex-lab/EasyMoDD#readme
12
+ Project-URL: Support, https://ko-fi.com/vnexlab
13
+ Keywords: machine-learning,deep-learning,numpy,cuda,training,transformers,artifact-analysis,decompiler,compiler,encryption
14
+ Classifier: Development Status :: 3 - Alpha
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: Intended Audience :: Science/Research
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Programming Language :: Python :: 3.14
22
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
23
+ Requires-Python: >=3.11
24
+ Description-Content-Type: text/markdown
25
+ License-File: LICENSE
26
+ Requires-Dist: numpy>=2.0
27
+ Provides-Extra: cuda
28
+ Requires-Dist: cupy-cuda12x>=13.6; extra == "cuda"
29
+ Provides-Extra: data
30
+ Requires-Dist: pandas>=2.0; extra == "data"
31
+ Requires-Dist: pyarrow>=15.0; extra == "data"
32
+ Requires-Dist: scikit-learn>=1.4; extra == "data"
33
+ Provides-Extra: security
34
+ Requires-Dist: cryptography>=44; extra == "security"
35
+ Provides-Extra: dev
36
+ Requires-Dist: build>=1.2; extra == "dev"
37
+ Requires-Dist: pytest>=8.0; extra == "dev"
38
+ Requires-Dist: twine>=5.0; extra == "dev"
39
+ Dynamic: license-file
40
+
41
+ # EasyMoDD
42
+
43
+ EasyMoDD is a configurable, training-first machine-learning library. It is
44
+ programmable from Python like a numerical library, with reusable tensors,
45
+ modules, datasets, losses, optimizers, trainers, model families, and checkpoint
46
+ policies.
47
+
48
+ Models initialize randomly unless a consuming project explicitly resumes from
49
+ its own checkpoint. EasyMoDD does not include a chatbot, web application,
50
+ built-in corpus, project `config.txt`, generated checkpoints, or demo data.
51
+
52
+ ## Install
53
+
54
+ ```powershell
55
+ python -m pip install easymodd
56
+ ```
57
+
58
+ For a local checkout:
59
+
60
+ ```powershell
61
+ python -m pip install -e .
62
+ ```
63
+
64
+ The core distribution is source-only plus NumPy; it does not bundle model
65
+ weights, corpora, JDKs, native toolchains, browsers, or decompiler binaries.
66
+ The web console uses Python's standard library. CUDA, tabular-data tooling,
67
+ and AES-GCM encryption are optional extras, keeping a normal install far below
68
+ 2 GB. Large datasets, generated apps, models, and user-selected toolchains stay
69
+ outside the library package.
70
+
71
+
72
+ The package version is controlled by `project.version` in `pyproject.toml`.
73
+ Increase it for every PyPI release, and do not reuse an already-uploaded
74
+ version.
75
+
76
+ Optional integrations:
77
+
78
+ ```powershell
79
+ python -m pip install easymodd[cuda]
80
+ python -m pip install easymodd[data]
81
+ python -m pip install easymodd[dev]
82
+ ```
83
+
84
+ ## Python API
85
+
86
+ ```python
87
+ import numpy as np
88
+ from easymodd import ArrayDataset, MSELoss, SGD, Trainer, build_mlp
89
+
90
+ model = build_mlp(input_size=1, hidden_sizes=[8], output_size=1)
91
+ dataset = ArrayDataset(
92
+ np.array([[1.0], [2.0], [3.0]], dtype=np.float32),
93
+ np.array([[2.0], [4.0], [6.0]], dtype=np.float32),
94
+ )
95
+ history = Trainer(
96
+ SGD(model.parameters(), learning_rate=0.01),
97
+ MSELoss(),
98
+ max_steps=100,
99
+ ).fit(model, dataset)
100
+ print(history.values["loss"][-1])
101
+ ```
102
+
103
+ The programmable foundation includes:
104
+
105
+ - NumPy and explicit CUDA backend helpers
106
+ - `Module`, `Parameter`, `Linear`, `ReLU`, and `Sequential`
107
+ - GELU, sigmoid, tanh, and dropout layers
108
+ - MLP model factory
109
+ - Model registries for custom factories
110
+ - `ArrayDataset` and packed `TextDataset`
111
+ - `BatchLoader`, deterministic splits, and `Subset`
112
+ - Composable transforms and batch collation
113
+ - MSE and cross-entropy loss contracts
114
+ - L1 and Huber losses
115
+ - SGD, Adam, and AdamW optimizers
116
+ - Cosine and warmup learning-rate schedulers
117
+ - Reusable `Trainer` and `TrainingHistory`
118
+ - Accuracy, MAE, and perplexity metrics
119
+ - JSONL metrics logging and early stopping callbacks
120
+ - Local experiment tracking and dependency-free summaries
121
+ - Versioned model/optimizer/scheduler serialization
122
+ - Environment-only secrets for optional integrations
123
+ - Config loading and validation for consuming projects
124
+ - Checkpoint enable/disable, retention, and compression policy
125
+ - Separate text Transformer and Vision Transformer configuration modules
126
+ - Streaming corpus fingerprints and bounded-memory duplicate audits
127
+ - Memory-mapped text windows for large byte-token corpora
128
+
129
+ ### Corpus audit before training
130
+
131
+ The streaming auditor fingerprints the exact source file, estimates words and
132
+ tokens, reports blank or malformed records, and detects normalized duplicates.
133
+ It stores only record hashes in a temporary SQLite file rather than loading the
134
+ corpus or all hashes into RAM. Optionally write a deduplicated copy:
135
+
136
+ ```powershell
137
+ easymodd audit-corpus --source corpus.jsonl --format jsonl `
138
+ --text-field response.text --deduplicated-output cleaned.jsonl --json
139
+ ```
140
+
141
+ Plain UTF-8 text is treated as newline-delimited records. JSONL is validated
142
+ one record at a time. The SHA-256 fingerprint and audit counts can be saved
143
+ with an experiment to make dataset changes visible before expensive training.
144
+
145
+ For training on a corpus larger than available RAM, use `MMapTextDataset`:
146
+
147
+ ```python
148
+ from easymodd import MMapTextDataset
149
+
150
+ with MMapTextDataset("corpus.txt", sequence_length=512, stride=512) as dataset:
151
+ inputs, next_tokens = dataset[0]
152
+ print(len(dataset), inputs.shape, next_tokens.shape)
153
+ ```
154
+
155
+ It uses raw UTF-8 bytes as token IDs 0-255, keeps the source file memory-mapped,
156
+ and materializes only the requested sequence window. Use `stride < sequence_length`
157
+ for overlapping windows; this increases training examples and I/O.
158
+
159
+ The restored prototype scripts remain available as compatibility programs for
160
+ existing custom checkpoints. New projects should import EasyMoDD directly.
161
+
162
+ ## Consumer Project Configuration
163
+
164
+ EasyMoDD does not force users into one project layout. A consuming project can
165
+ create its own `config.txt` using TOML syntax and load it with:
166
+
167
+ ```python
168
+ from easymodd import load_config
169
+ config = load_config("config.txt")
170
+ ```
171
+
172
+ The config loader supports project-defined paths for datasets, runs, models,
173
+ logs, and checkpoints. The library never assumes a filename such as
174
+ `best.bin`.
175
+
176
+ A consumer project can configure checkpoint behavior like this:
177
+
178
+ ```toml
179
+ [checkpoints]
180
+ enabled = true
181
+ keep_recent = 2
182
+ compress_old = true
183
+ ```
184
+
185
+ When disabled, `CheckpointManager` creates no directory or files. When enabled,
186
+ older numbered checkpoints can be compressed while recent checkpoints remain
187
+ available.
188
+
189
+ ## Package Layout
190
+
191
+ ```text
192
+ src/easymodd/
193
+ models/
194
+ mlp.py
195
+ text_transformer.py
196
+ vision_transformer.py
197
+ data.py
198
+ losses.py
199
+ nn.py
200
+ tensor.py
201
+ optim.py
202
+ training.py
203
+ checkpoints.py
204
+ config.py
205
+ cli.py
206
+ ```
207
+
208
+ Each model family has its own module. The shared training contracts are designed
209
+ so new model types can be added without changing dataset or checkpoint code.
210
+
211
+ ## Extending EasyMoDD
212
+
213
+ Register a custom model factory:
214
+
215
+ ```python
216
+ from easymodd import ModelRegistry
217
+
218
+ registry = ModelRegistry()
219
+ registry.register("my_model", lambda width=8: build_my_model(width))
220
+ model = registry.create("my_model", width=32)
221
+ ```
222
+
223
+ Optional integrations can read environment variables without storing secrets:
224
+
225
+ ```python
226
+ from easymodd import SecretStore
227
+
228
+ secrets = SecretStore(prefix="MY_APP_")
229
+ token = secrets.get("TRACKING_TOKEN")
230
+ ```
231
+
232
+ EasyMoDD never writes API keys to configs, checkpoints, experiment files, or
233
+ logs. Provider-specific integrations can be built on top of this helper.
234
+
235
+ ## Data and Training
236
+
237
+ The library does not ship a general-purpose training database. Users provide
238
+ legally obtained text, image, or tabular data in their own projects. EasyMoDD
239
+ provides dataset contracts and validation helpers; it does not pretend that a
240
+ small demo corpus can produce a general assistant.
241
+
242
+ ## Development Status
243
+
244
+ The tensor/module API, programmable MLP training loop, dataset contracts,
245
+ checkpoint policy, model-family layout, and config loader are implemented.
246
+ Text Transformer training, Vision Transformer training, full resume manifests,
247
+ evaluation, schedulers, callbacks, and additional model families are active
248
+ parts of the public-library roadmap.
249
+
250
+ Support development on [Ko-fi](https://ko-fi.com/vnexlab).
251
+
252
+ ## Tests and examples
253
+
254
+ The `tests/` directory contains individual subsystem tests plus a full-stack
255
+ integration test. `examples/multi_file_project/` demonstrates a real consumer
256
+ project layout with TOML config, multiple Python plugin files, custom web
257
+ routes/pages, C++ source, a CMake shared-library recipe, and a custom DLL
258
+ metadata backend.
259
+
260
+ The multi-file test loads that consumer config, discovers the C++ source,
261
+ registers the custom backend/API/page, and inspects a synthetic PE DLL without
262
+ loading or executing it. A C++ compiler command is dry-run only and is skipped
263
+ when no compatible compiler is installed. Tests also cover Java JAR/class,
264
+ Python bytecode, WebAssembly, training, corpus auditing, encryption, web auth,
265
+ simulation, math helpers, and local forwarding.
266
+
267
+ Run the suite with:
268
+
269
+ ```powershell
270
+ python -m pip install -e ".[dev,security]"
271
+ python -m pytest -q
272
+ ```
273
+
274
+ If a native C++ compiler is installed, the suite also verifies the compiler
275
+ adapter's dry-run command. It does not execute generated DLL/EXE fixtures.
276
+
277
+ ## EasyModel artifact tooling
278
+
279
+ This distribution also includes the separate `EasyModel` namespace for safe,
280
+ configurable artifact inspection, simulations, app scaffolding, networking, and
281
+ compiler/decompiler adapters. It does not replace the `easymodd` training API.
282
+
283
+ The namespaces connect through `EasyModel.Workbench` and a bounded,
284
+ thread-safe event bus. Training, simulations, corpus audits, artifact
285
+ inspection, encryption, and custom tools publish redacted events to one local
286
+ run history. `EzMHandler` is the root facade for coordinated operations.
287
+
288
+ ```python
289
+ from EasyModel import SecurityPolicy, detect_artifact
290
+ from EzDecompiler import EzDecompiler
291
+
292
+ handler = EzDecompiler(policy=SecurityPolicy(allow_native_tools=False))
293
+ artifact = handler.detect("application.jar")
294
+ report = handler.inspect("application.jar")
295
+ print(artifact.kind, report.to_json())
296
+ ```
297
+
298
+ From a source checkout:
299
+
300
+ ```powershell
301
+ python EzDecompiler.py detect application.jar --json
302
+ python EzDecompiler.py inspect application.jar --json
303
+ python EzDecompiler.py decompile application.jar --dry-run --json
304
+ ```
305
+
306
+ After installation:
307
+
308
+ ```powershell
309
+ easymodel detect application.jar --json
310
+ easymodel inspect application.jar --json
311
+ easymodel passport application.jar --json
312
+ easymodel compare original.jar --against rebuilt.jar --json
313
+ easymodel web
314
+ easymodel lan
315
+ easymodel app --name my_toolbox --directory ./my_toolbox --template toolbox
316
+ ```
317
+
318
+ An Artifact Passport adds a streaming SHA-256 identity plus safe structural
319
+ metadata: JAR entry and manifest inventory, archive traversal/duplicate-name
320
+ warnings, PE sections and .NET marker detection, Python bytecode header details,
321
+ and WebAssembly section sizes. It never extracts or executes the artifact.
322
+ Passports can be compared to see whether rebuilt or transformed outputs changed.
323
+
324
+ ### Local web workbench
325
+
326
+ `easymodel web` starts a standard-library web console at `127.0.0.1:8765`. It
327
+ combines artifact passports, corpus audits, file encryption, and recent shared
328
+ events. The server prints a random session token; enter it in the page. Remote
329
+ binding is rejected unless explicitly enabled with a token, and remote use must
330
+ be behind HTTPS. Keyboard shortcuts only operate inside the open browser page;
331
+ the library does not capture system-wide keystrokes.
332
+
333
+ Trusted plugins can add isolated browser pages and authenticated POST API
334
+ routes. A custom page can call registered routes through the parent console
335
+ bridge without receiving the session token. Plugins execute Python code, so
336
+ load only modules you trust.
337
+
338
+ ### Custom pages and API plugins
339
+
340
+ Consumer-owned TOML controls plugin loading and the web address:
341
+
342
+ ```toml
343
+ [plugins]
344
+ enabled = true
345
+ modules = ["my_project.easy_plugins"]
346
+
347
+ [web]
348
+ host = "127.0.0.1"
349
+ port = 8765
350
+ allow_remote = false
351
+ ```
352
+
353
+ Each configured module exposes `register(workbench)`:
354
+
355
+ ```python
356
+ from EasyModel import ApiRoute, ArtifactKind, WebPage
357
+ from EasyModel.compilers import CompilerBackend
358
+ from EasyModel.decompilers import ExternalDecompiler
359
+
360
+ def register(workbench):
361
+ workbench.register_component("tools", "hello", lambda: {"ready": True})
362
+ workbench.register_compiler_backend(CompilerBackend("cc", "cc"))
363
+ workbench.register_decompiler_backend(ExternalDecompiler(
364
+ "my-java-decompiler", "my-decompiler", {ArtifactKind.JAR, ArtifactKind.CLASS}
365
+ ))
366
+ workbench.register_page(WebPage(
367
+ "/pages/status", "Project status",
368
+ "<main><h1>Project status</h1><p>Custom page content.</p></main>",
369
+ ))
370
+ workbench.register_api_route(ApiRoute(
371
+ "/api/custom/status", lambda body, hub: {"ready": True}
372
+ ))
373
+ ```
374
+
375
+ The page runs in a sandboxed frame. It can ask the parent workbench to call
376
+ only registered custom POST routes:
377
+
378
+ ```javascript
379
+ window.parent.postMessage({
380
+ type: "easymodel-api",
381
+ path: "/api/custom/status",
382
+ payload: {}
383
+ }, "*");
384
+ ```
385
+
386
+ The browser hosts custom page HTML in a sandboxed frame. Custom API routes are
387
+ POST-only and require the same session authentication as built-in operations.
388
+
389
+ ### App builder, simulation, and math
390
+
391
+ Scaffold a separate consumer project without overwriting existing files:
392
+
393
+ ```powershell
394
+ easymodel app --name lab_app --directory ./lab_app --template web
395
+ easymodel app --name queue_sim --directory ./queue_sim --template simulation
396
+ easymodel app --name model_lab --directory ./model_lab --template training
397
+ ```
398
+
399
+ The `DiscreteEventSimulator` provides deterministic event scheduling, seeded
400
+ randomness, and a maximum event count. Register simulation factories under
401
+ the `simulations` component group and run them with `easymodel simulate --config
402
+ config.toml --component your_simulator`. `EasyModel.mathx` provides stable
403
+ softmax, blockwise pairwise distances, linear solves, and Simpson integration
404
+ using NumPy's optimized kernels, finite-difference gradients, and deterministic memory-bounded Monte Carlo integration.
405
+
406
+ The shared component registry includes starter providers for MLP models,
407
+ discrete-event simulations, JAR inspection, project scaffolding, corpus audit,
408
+ and artifact passports. Custom plugins may register more models, simulators,
409
+ compilers, decompilers, apps, browser pages, and authenticated API routes.
410
+
411
+ Compiler commands are blocked unless execution is explicitly allowed. Inspect
412
+ the structured command first with `--dry-run`; only execute a toolchain and
413
+ source you trust:
414
+
415
+ ```powershell
416
+ easymodel compile main.c --backend cc --output app --dry-run --config config.toml
417
+ easymodel compile main.c --backend cc --output app --allow-execution --config config.toml
418
+ ```
419
+
420
+ ### LAN hosting and TCP forwarding
421
+
422
+ `easymodel lan` reports private interface addresses. To intentionally make the
423
+ console reachable on a trusted LAN, use an environment token and explicitly
424
+ enable remote binding:
425
+
426
+ ```powershell
427
+ $env:EASYMODEL_WEB_TOKEN = "a-long-random-token"
428
+ easymodel web --host 0.0.0.0 --allow-remote
429
+ ```
430
+
431
+ `easymodel forward --port 9000 --target-host 127.0.0.1 --target-port 8000`
432
+ forwards a local TCP port. Non-loopback bind addresses require
433
+ `--allow-remote`. Forwarding does not edit router/firewall rules, configure
434
+ UPnP, or create an Internet tunnel. External reachability remains the network
435
+ owner's responsibility; never expose an unauthenticated service.
436
+
437
+ ### Streaming file encryption
438
+
439
+ Install the optional security extra and keep passphrases in the environment,
440
+ not shell history:
441
+
442
+ ```powershell
443
+ python -m pip install "easymodd[security]"
444
+ $env:EASYMODEL_PASSPHRASE = "use-a-long-unique-passphrase"
445
+ easymodel encrypt confidential.bin --output confidential.bin.emenc
446
+ easymodel decrypt confidential.bin.emenc --output restored.bin
447
+ ```
448
+
449
+ Encryption uses chunked AES-256-GCM with authenticated headers/chunks,
450
+ truncation detection, and atomic output. Files stream through fixed-size
451
+ buffers rather than loading entirely into RAM. Passphrases are never saved in
452
+ configs, event logs, or file metadata. Losing the passphrase means the file
453
+ cannot be recovered.
454
+
455
+ Supported artifact families include Java JAR/class, Windows PE EXE/DLL,
456
+ .NET assemblies, Python bytecode, and WebAssembly detection. The first
457
+ release provides safe built-in JAR inspection plus optional external-tool
458
+ adapters. Native binaries can produce headers, imports, assembly, or
459
+ pseudocode, but cannot reliably restore original optimized source code.
460
+
461
+ Compiler adapters use installed toolchains such as `javac`, `.NET`, Python,
462
+ GCC/Clang/MSVC, or WebAssembly tools. Tool execution is policy-controlled and
463
+ disabled by default unless explicitly enabled by the consumer project.
464
+
465
+ Only analyze software you own or have permission to inspect. EasyModel does
466
+ not provide DRM, anti-tamper, or access-control bypass functionality.