@reicek/neataptic-ts 0.1.24 → 0.1.26

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 (215) hide show
  1. package/.github/copilot-instructions.md +11 -0
  2. package/.github/skills/trace-analyzer-extension/SKILL.md +3 -3
  3. package/.github/skills/trace-analyzer-extension/assets/extension-checklist.md +1 -1
  4. package/.github/skills/trace-analyzer-extension/references/analyzer-extension-workflow.md +1 -1
  5. package/.github/skills/trace-audit-reporting/SKILL.md +3 -3
  6. package/.github/skills/trace-audit-reporting/references/trace-analysis-workflow.md +1 -1
  7. package/.github/workflows/ci.yml +3 -3
  8. package/.github/workflows/deploy-pages.yml +6 -6
  9. package/.github/workflows/manual_release_pipeline.yml +3 -3
  10. package/.github/workflows/publish.yml +18 -19
  11. package/.github/workflows/release_dispatch.yml +3 -3
  12. package/package.json +26 -20
  13. package/plans/Flappy_Bird_Folder_Documentation_Pass.md +4 -4
  14. package/plans/README.md +24 -0
  15. package/plans/Roadmap.md +62 -40
  16. package/plans/analyze-trace-solid-split.plans.md +66 -0
  17. package/plans/architecture-solid-split.plans.md +9 -15
  18. package/plans/asciiMaze-typescript-repair.plans.md +1 -1
  19. package/plans/generate-docs-solid-split.plans.md +87 -0
  20. package/plans/methods-docs.plans.md +25 -1
  21. package/plans/methods-solid-split.plans.md +14 -14
  22. package/plans/neat-docs.plans.md +9 -1
  23. package/plans/neat-test-surface-repair.plans.md +1 -1
  24. package/plans/render-docs-html-solid-split.plans.md +68 -0
  25. package/plans/src-no-explicit-any-cleanup.plans.md +1 -1
  26. package/plans/utils-docs.plans.md +6 -1
  27. package/scripts/analyze-trace/analyze-trace.analysis.ts +479 -0
  28. package/scripts/analyze-trace/analyze-trace.constants.ts +35 -0
  29. package/scripts/analyze-trace/analyze-trace.io.ts +69 -0
  30. package/scripts/analyze-trace/analyze-trace.report.ts +100 -0
  31. package/scripts/analyze-trace/analyze-trace.shared.ts +116 -0
  32. package/scripts/analyze-trace/analyze-trace.ts +45 -0
  33. package/scripts/analyze-trace/analyze-trace.types.ts +72 -0
  34. package/scripts/assets/theme.css +80 -23
  35. package/scripts/copy-examples.ts +239 -0
  36. package/scripts/export-onnx.ts +223 -0
  37. package/scripts/generate-bench-tables.ts +378 -37
  38. package/scripts/generate-docs/generate-docs.constants.ts +107 -0
  39. package/scripts/generate-docs/generate-docs.order.ts +355 -0
  40. package/scripts/generate-docs/generate-docs.state.ts +31 -0
  41. package/scripts/generate-docs/generate-docs.targets.ts +165 -0
  42. package/scripts/generate-docs/generate-docs.ts +63 -0
  43. package/scripts/generate-docs/generate-docs.types.ts +112 -0
  44. package/scripts/generate-docs/output/generate-docs.output.folder-index.utils.ts +167 -0
  45. package/scripts/generate-docs/output/generate-docs.output.ordering.utils.ts +353 -0
  46. package/scripts/generate-docs/output/generate-docs.output.readme.utils.ts +420 -0
  47. package/scripts/generate-docs/output/generate-docs.output.ts +123 -0
  48. package/scripts/generate-docs/output/generate-docs.output.warnings.utils.ts +219 -0
  49. package/scripts/generate-docs/symbols/generate-docs.symbols.collection.utils.ts +365 -0
  50. package/scripts/generate-docs/symbols/generate-docs.symbols.jsdoc.utils.ts +373 -0
  51. package/scripts/generate-docs/symbols/generate-docs.symbols.normalize.utils.ts +155 -0
  52. package/scripts/generate-docs/symbols/generate-docs.symbols.render.utils.ts +149 -0
  53. package/scripts/generate-docs/symbols/generate-docs.symbols.signature.utils.ts +289 -0
  54. package/scripts/generate-docs/symbols/generate-docs.symbols.ts +11 -0
  55. package/scripts/mermaid-cli.mjs +102 -22
  56. package/scripts/mermaid-cli.ts +736 -0
  57. package/scripts/render-docs-html/render-docs-html.assets.ts +54 -0
  58. package/scripts/render-docs-html/render-docs-html.mermaid.ts +245 -0
  59. package/scripts/{render-docs-html.sidebar.ts → render-docs-html/render-docs-html.navigation.ts} +141 -144
  60. package/scripts/render-docs-html/render-docs-html.pages.ts +333 -0
  61. package/scripts/render-docs-html/render-docs-html.shared.ts +333 -0
  62. package/scripts/render-docs-html/render-docs-html.types.ts +42 -0
  63. package/scripts/render-docs-html.ts +23 -587
  64. package/scripts/run-docs.ts +238 -0
  65. package/scripts/write-dist-docs-pkg.ts +40 -0
  66. package/src/README.md +75 -75
  67. package/src/architecture/connection/README.md +5 -5
  68. package/src/architecture/layer/README.md +508 -508
  69. package/src/architecture/network/README.md +1458 -1458
  70. package/src/architecture/network/activate/README.md +694 -694
  71. package/src/architecture/network/bootstrap/README.md +77 -77
  72. package/src/architecture/network/connect/README.md +74 -74
  73. package/src/architecture/network/deterministic/README.md +135 -135
  74. package/src/architecture/network/evolve/README.md +364 -364
  75. package/src/architecture/network/gating/README.md +130 -130
  76. package/src/architecture/network/genetic/README.md +399 -399
  77. package/src/architecture/network/mutate/README.md +897 -897
  78. package/src/architecture/network/onnx/README.md +720 -720
  79. package/src/architecture/network/onnx/export/README.md +728 -728
  80. package/src/architecture/network/onnx/export/layers/README.md +450 -450
  81. package/src/architecture/network/onnx/import/README.md +618 -618
  82. package/src/architecture/network/onnx/schema/README.md +32 -32
  83. package/src/architecture/network/prune/README.md +245 -245
  84. package/src/architecture/network/remove/README.md +135 -135
  85. package/src/architecture/network/runtime/README.md +106 -106
  86. package/src/architecture/network/serialize/README.md +542 -542
  87. package/src/architecture/network/slab/README.md +608 -608
  88. package/src/architecture/network/standalone/README.md +212 -212
  89. package/src/architecture/network/stats/README.md +84 -84
  90. package/src/architecture/network/topology/README.md +465 -465
  91. package/src/architecture/network/training/README.md +200 -200
  92. package/src/architecture/node/README.md +5 -5
  93. package/src/architecture/nodePool/README.md +14 -14
  94. package/src/methods/README.md +99 -99
  95. package/src/methods/activation/README.md +189 -189
  96. package/src/methods/cost/README.md +131 -131
  97. package/src/methods/rate/README.md +86 -86
  98. package/src/multithreading/README.md +77 -77
  99. package/src/multithreading/workers/browser/README.md +8 -8
  100. package/src/multithreading/workers/node/README.md +8 -8
  101. package/src/neat/README.md +148 -148
  102. package/src/neat/adaptive/README.md +120 -120
  103. package/src/neat/adaptive/acceptance/README.md +40 -40
  104. package/src/neat/adaptive/complexity/README.md +137 -137
  105. package/src/neat/adaptive/core/README.md +197 -197
  106. package/src/neat/adaptive/lineage/README.md +90 -90
  107. package/src/neat/adaptive/mutation/README.md +284 -284
  108. package/src/neat/compat/README.md +43 -43
  109. package/src/neat/compat/core/README.md +90 -90
  110. package/src/neat/diversity/README.md +35 -35
  111. package/src/neat/diversity/core/README.md +88 -88
  112. package/src/neat/evaluate/README.md +85 -85
  113. package/src/neat/evaluate/auto-distance/README.md +75 -75
  114. package/src/neat/evaluate/entropy-compat/README.md +37 -37
  115. package/src/neat/evaluate/entropy-sharing/README.md +43 -43
  116. package/src/neat/evaluate/fitness/README.md +23 -23
  117. package/src/neat/evaluate/novelty/README.md +120 -120
  118. package/src/neat/evaluate/objectives/README.md +17 -17
  119. package/src/neat/evaluate/shared/README.md +94 -94
  120. package/src/neat/evolve/README.md +96 -96
  121. package/src/neat/evolve/adaptive/README.md +60 -60
  122. package/src/neat/evolve/objectives/README.md +63 -63
  123. package/src/neat/evolve/offspring/README.md +56 -56
  124. package/src/neat/evolve/population/README.md +171 -171
  125. package/src/neat/evolve/runtime/README.md +79 -79
  126. package/src/neat/evolve/speciation/README.md +74 -74
  127. package/src/neat/evolve/warnings/README.md +10 -10
  128. package/src/neat/export/README.md +114 -114
  129. package/src/neat/helpers/README.md +50 -50
  130. package/src/neat/init/README.md +9 -9
  131. package/src/neat/lineage/core/README.md +101 -101
  132. package/src/neat/multiobjective/category/README.md +74 -74
  133. package/src/neat/multiobjective/crowding/README.md +272 -272
  134. package/src/neat/multiobjective/dominance/README.md +171 -171
  135. package/src/neat/multiobjective/fronts/README.md +68 -68
  136. package/src/neat/multiobjective/metrics/README.md +43 -43
  137. package/src/neat/multiobjective/objectives/README.md +31 -31
  138. package/src/neat/multiobjective/shared/README.md +27 -27
  139. package/src/neat/mutation/README.md +97 -97
  140. package/src/neat/mutation/add-conn/README.md +115 -115
  141. package/src/neat/mutation/add-node/README.md +126 -126
  142. package/src/neat/mutation/flow/README.md +149 -149
  143. package/src/neat/mutation/repair/README.md +185 -185
  144. package/src/neat/mutation/select/README.md +117 -117
  145. package/src/neat/mutation/shared/README.md +32 -32
  146. package/src/neat/objectives/README.md +25 -25
  147. package/src/neat/objectives/core/README.md +67 -67
  148. package/src/neat/pruning/README.md +40 -40
  149. package/src/neat/pruning/core/README.md +171 -171
  150. package/src/neat/pruning/facade/README.md +32 -32
  151. package/src/neat/rng/README.md +104 -104
  152. package/src/neat/rng/core/README.md +137 -137
  153. package/src/neat/rng/facade/README.md +50 -50
  154. package/src/neat/selection/README.md +111 -111
  155. package/src/neat/selection/core/README.md +227 -227
  156. package/src/neat/selection/facade/README.md +61 -61
  157. package/src/neat/shared/README.md +163 -163
  158. package/src/neat/speciation/README.md +31 -31
  159. package/src/neat/speciation/threshold/README.md +35 -35
  160. package/src/neat/species/README.md +25 -25
  161. package/src/neat/species/core/README.md +20 -20
  162. package/src/neat/species/core/shared/README.md +18 -18
  163. package/src/neat/species/history/context/README.md +22 -22
  164. package/src/neat/telemetry/accessors/README.md +58 -58
  165. package/src/neat/telemetry/exports/README.md +233 -233
  166. package/src/neat/telemetry/facade/README.md +252 -252
  167. package/src/neat/telemetry/facade/archive/README.md +57 -57
  168. package/src/neat/telemetry/facade/buffer/README.md +43 -43
  169. package/src/neat/telemetry/facade/lineage/README.md +12 -12
  170. package/src/neat/telemetry/facade/objectives/README.md +44 -44
  171. package/src/neat/telemetry/facade/runtime/README.md +26 -26
  172. package/src/neat/telemetry/facade/species/README.md +27 -27
  173. package/src/neat/telemetry/metrics/README.md +696 -696
  174. package/src/neat/telemetry/recorder/README.md +57 -57
  175. package/src/neat/telemetry/types/README.md +32 -32
  176. package/src/neat/topology-intent/README.md +75 -75
  177. package/src/utils/README.md +193 -193
  178. package/test/examples/asciiMaze/browser-entry/README.md +92 -92
  179. package/test/examples/asciiMaze/dashboardManager/README.md +109 -109
  180. package/test/examples/asciiMaze/dashboardManager/telemetry/README.md +28 -28
  181. package/test/examples/asciiMaze/evolutionEngine/README.md +1527 -1527
  182. package/test/examples/asciiMaze/mazeMovement/README.md +105 -105
  183. package/test/examples/asciiMaze/mazeMovement/finalization/README.md +16 -16
  184. package/test/examples/asciiMaze/mazeMovement/policy/README.md +57 -57
  185. package/test/examples/asciiMaze/mazeMovement/runtime/README.md +52 -52
  186. package/test/examples/asciiMaze/mazeMovement/shaping/README.md +46 -46
  187. package/test/examples/flappy_bird/browser-entry/README.md +508 -508
  188. package/test/examples/flappy_bird/browser-entry/host/README.md +101 -101
  189. package/test/examples/flappy_bird/browser-entry/host/resize/README.md +144 -144
  190. package/test/examples/flappy_bird/browser-entry/network-view/README.md +194 -194
  191. package/test/examples/flappy_bird/browser-entry/playback/README.md +278 -278
  192. package/test/examples/flappy_bird/browser-entry/playback/background/README.md +129 -129
  193. package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/README.md +502 -502
  194. package/test/examples/flappy_bird/browser-entry/playback/frame-render/README.md +139 -139
  195. package/test/examples/flappy_bird/browser-entry/playback/snapshot/README.md +10 -10
  196. package/test/examples/flappy_bird/browser-entry/playback/trail/README.md +43 -43
  197. package/test/examples/flappy_bird/browser-entry/playback/worker-channel/README.md +30 -30
  198. package/test/examples/flappy_bird/browser-entry/runtime/README.md +59 -59
  199. package/test/examples/flappy_bird/browser-entry/visualization/README.md +276 -276
  200. package/test/examples/flappy_bird/browser-entry/worker-channel/README.md +16 -16
  201. package/test/examples/flappy_bird/constants/README.md +1070 -1070
  202. package/test/examples/flappy_bird/environment/README.md +22 -22
  203. package/test/examples/flappy_bird/evaluation/README.md +32 -32
  204. package/test/examples/flappy_bird/evaluation/rollout/README.md +141 -141
  205. package/test/examples/flappy_bird/flappy-evolution-worker/README.md +425 -425
  206. package/test/examples/flappy_bird/simulation-shared/README.md +170 -170
  207. package/test/examples/flappy_bird/simulation-shared/observation/README.md +109 -109
  208. package/test/examples/flappy_bird/trainer/README.md +325 -325
  209. package/test/examples/flappy_bird/trainer/evaluation/README.md +74 -74
  210. package/scripts/analyze-trace.ts +0 -590
  211. package/scripts/copy-examples.mjs +0 -114
  212. package/scripts/export-onnx.mjs +0 -86
  213. package/scripts/generate-bench-tables.mjs +0 -182
  214. package/scripts/generate-docs.ts +0 -2900
  215. package/scripts/write-dist-docs-pkg.mjs +0 -16
@@ -0,0 +1,239 @@
1
+ /*
2
+ * Copies browser-viewable examples into docs/examples/* so GitHub Pages can
3
+ * publish them alongside the generated documentation site.
4
+ *
5
+ * The script intentionally keeps one narrow contract: copy each example's
6
+ * browser entrypoint into its published docs folder, then rebuild the shared
7
+ * examples landing page from the demos that were actually published.
8
+ */
9
+
10
+ import { access, copyFile, mkdir, writeFile } from 'node:fs/promises';
11
+ import path from 'node:path';
12
+
13
+ const DOCS_EXAMPLES_LOG_PREFIX = '[docs:examples]';
14
+ const DOCS_EXAMPLES_DIR = path.resolve('docs', 'examples');
15
+ const EXAMPLE_ENTRY_FILE_NAME = 'index.html';
16
+ const DOCS_THEME_STYLESHEET_PATH = '../assets/theme.css';
17
+ const DOCS_HOME_PATH = '../index.html';
18
+ const EXAMPLES_HOME_PATH = './index.html';
19
+ const GITHUB_REPOSITORY_URL = 'https://github.com/reicek/NeatapticTS';
20
+
21
+ interface ExampleDefinition {
22
+ dirName: string;
23
+ label: string;
24
+ title: string;
25
+ sourceDir: string;
26
+ }
27
+
28
+ interface PublishedExample {
29
+ dirName: string;
30
+ label: string;
31
+ title: string;
32
+ }
33
+
34
+ const EXAMPLE_DEFINITIONS: readonly ExampleDefinition[] = [
35
+ {
36
+ dirName: 'asciiMaze',
37
+ label: 'asciiMaze',
38
+ title: 'ASCII Maze (NeatapticTS)',
39
+ sourceDir: path.resolve('test', 'examples', 'asciiMaze'),
40
+ },
41
+ {
42
+ dirName: 'flappy_bird',
43
+ label: 'flappy_bird',
44
+ title: 'Flappy Bird (NeatapticTS)',
45
+ sourceDir: path.resolve('test', 'examples', 'flappy_bird'),
46
+ },
47
+ ];
48
+
49
+ /**
50
+ * Runs the example-copy workflow.
51
+ *
52
+ * Step 1 copies published browser entrypoints for all known examples.
53
+ * Step 2 rebuilds the landing page from the demos that were actually copied.
54
+ *
55
+ * @returns Promise resolved when copying and landing-page generation complete.
56
+ */
57
+ async function main(): Promise<void> {
58
+ const publishedExamples = (
59
+ await Promise.all(EXAMPLE_DEFINITIONS.map(copyExampleEntryPoint))
60
+ ).filter(isPublishedExample);
61
+
62
+ await writeExamplesLandingPage(publishedExamples);
63
+ }
64
+
65
+ /**
66
+ * Copies one example entrypoint into `docs/examples/<name>/index.html`.
67
+ *
68
+ * @param exampleDefinition - Example publishing definition.
69
+ * @returns Published example metadata when the example entrypoint was copied,
70
+ * otherwise `null`.
71
+ */
72
+ async function copyExampleEntryPoint(
73
+ exampleDefinition: ExampleDefinition,
74
+ ): Promise<PublishedExample | null> {
75
+ const hasSourceDirectory = await pathExists(exampleDefinition.sourceDir);
76
+ if (!hasSourceDirectory) {
77
+ console.warn(
78
+ `${DOCS_EXAMPLES_LOG_PREFIX} ${exampleDefinition.dirName} source directory not found, skipping`,
79
+ );
80
+ return null;
81
+ }
82
+
83
+ const sourceIndexPath = path.join(
84
+ exampleDefinition.sourceDir,
85
+ EXAMPLE_ENTRY_FILE_NAME,
86
+ );
87
+ const hasSourceIndex = await pathExists(sourceIndexPath);
88
+ if (!hasSourceIndex) {
89
+ console.warn(
90
+ `${DOCS_EXAMPLES_LOG_PREFIX} ${exampleDefinition.dirName} ${EXAMPLE_ENTRY_FILE_NAME} missing`,
91
+ );
92
+ return null;
93
+ }
94
+
95
+ const destinationDirectoryPath = path.join(
96
+ DOCS_EXAMPLES_DIR,
97
+ exampleDefinition.dirName,
98
+ );
99
+ const destinationIndexPath = path.join(
100
+ destinationDirectoryPath,
101
+ EXAMPLE_ENTRY_FILE_NAME,
102
+ );
103
+
104
+ await mkdir(destinationDirectoryPath, { recursive: true });
105
+ await copyFile(sourceIndexPath, destinationIndexPath);
106
+
107
+ console.log(
108
+ `${DOCS_EXAMPLES_LOG_PREFIX} Copied ${exampleDefinition.dirName} ${EXAMPLE_ENTRY_FILE_NAME}`,
109
+ );
110
+
111
+ return {
112
+ dirName: exampleDefinition.dirName,
113
+ label: exampleDefinition.label,
114
+ title: exampleDefinition.title,
115
+ };
116
+ }
117
+
118
+ /**
119
+ * Writes the shared docs/examples landing page.
120
+ *
121
+ * @param publishedExamples - Examples that were published in the current run.
122
+ * @returns Promise resolved when the landing page has been written.
123
+ */
124
+ async function writeExamplesLandingPage(
125
+ publishedExamples: readonly PublishedExample[],
126
+ ): Promise<void> {
127
+ await mkdir(DOCS_EXAMPLES_DIR, { recursive: true });
128
+
129
+ const examplesLandingPageHtml =
130
+ buildExamplesLandingPageHtml(publishedExamples);
131
+ await writeFile(
132
+ path.join(DOCS_EXAMPLES_DIR, EXAMPLE_ENTRY_FILE_NAME),
133
+ examplesLandingPageHtml,
134
+ 'utf8',
135
+ );
136
+
137
+ console.log(`${DOCS_EXAMPLES_LOG_PREFIX} Wrote examples landing page`);
138
+ }
139
+
140
+ /**
141
+ * Builds the shared examples landing page HTML.
142
+ *
143
+ * @param publishedExamples - Examples that were published in the current run.
144
+ * @returns Rendered landing page HTML.
145
+ */
146
+ function buildExamplesLandingPageHtml(
147
+ publishedExamples: readonly PublishedExample[],
148
+ ): string {
149
+ const examplesListMarkup = buildExamplesListMarkup(publishedExamples);
150
+
151
+ return `<!doctype html>
152
+ <html lang="en">
153
+ <head>
154
+ <meta charset="utf-8" />
155
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
156
+ <title>Examples • NeatapticTS Docs</title>
157
+ <link rel="stylesheet" href="${DOCS_THEME_STYLESHEET_PATH}" />
158
+ </head>
159
+ <body>
160
+ <header class="topbar">
161
+ <div class="inner">
162
+ <div class="brand"><a href="${DOCS_HOME_PATH}">NeatapticTS</a></div>
163
+ <nav class="main-nav">
164
+ <a href="${DOCS_HOME_PATH}">Home</a>
165
+ <a href="${DOCS_HOME_PATH}">Docs</a>
166
+ <a href="${EXAMPLES_HOME_PATH}" class="active">Examples</a>
167
+ <a href="${GITHUB_REPOSITORY_URL}" target="_blank" rel="noopener">GitHub</a>
168
+ </nav>
169
+ </div>
170
+ </header>
171
+ <div class="layout">
172
+ <main class="content">
173
+ <h1>Examples</h1>
174
+ <p>Interactive browser demos built from this repository:</p>
175
+ ${examplesListMarkup}
176
+ <footer class="site-footer">Generated from source JSDoc • <a href="${GITHUB_REPOSITORY_URL}">GitHub</a></footer>
177
+ </main>
178
+ </div>
179
+ </body>
180
+ </html>`;
181
+ }
182
+
183
+ /**
184
+ * Builds the published examples list markup.
185
+ *
186
+ * @param publishedExamples - Examples that were published in the current run.
187
+ * @returns HTML list markup.
188
+ */
189
+ function buildExamplesListMarkup(
190
+ publishedExamples: readonly PublishedExample[],
191
+ ): string {
192
+ if (publishedExamples.length === 0) {
193
+ return '<p>No interactive examples were published in this run.</p>';
194
+ }
195
+
196
+ const listItemsMarkup = publishedExamples
197
+ .toSorted((leftExample, rightExample) =>
198
+ leftExample.title.localeCompare(rightExample.title),
199
+ )
200
+ .map(
201
+ (publishedExample) =>
202
+ `<li><a href="./${publishedExample.dirName}/${EXAMPLE_ENTRY_FILE_NAME}">${publishedExample.title}</a> <span class="demo-path">(examples/${publishedExample.label})</span></li>`,
203
+ )
204
+ .join('');
205
+
206
+ return `<ul>${listItemsMarkup}</ul>`;
207
+ }
208
+
209
+ /**
210
+ * Resolves whether a filesystem path exists.
211
+ *
212
+ * @param targetPath - Filesystem path to check.
213
+ * @returns True when the path exists.
214
+ */
215
+ async function pathExists(targetPath: string): Promise<boolean> {
216
+ try {
217
+ await access(targetPath);
218
+ return true;
219
+ } catch {
220
+ return false;
221
+ }
222
+ }
223
+
224
+ /**
225
+ * Narrows `Promise.all` output to the published example shape.
226
+ *
227
+ * @param publishedExample - Candidate example result.
228
+ * @returns `true` when the example was published successfully.
229
+ */
230
+ function isPublishedExample(
231
+ publishedExample: PublishedExample | null,
232
+ ): publishedExample is PublishedExample {
233
+ return publishedExample !== null;
234
+ }
235
+
236
+ main().catch((error: unknown) => {
237
+ console.error(`${DOCS_EXAMPLES_LOG_PREFIX} Failed:`, error);
238
+ process.exit(1);
239
+ });
@@ -0,0 +1,223 @@
1
+ /**
2
+ * Minimal CLI to export a JSON ONNX model from a serialized network state.
3
+ *
4
+ * Usage:
5
+ * npm run onnx:export -- --in network.json --out model.onnx.json [--metadata] [--batch] [--legacy] [--partial] [--mixed]
6
+ *
7
+ * This stays intentionally lightweight. For larger automation flows, prefer
8
+ * calling the ONNX export API directly from application code.
9
+ */
10
+
11
+ import fs from 'node:fs';
12
+ import path from 'node:path';
13
+ import { pathToFileURL } from 'node:url';
14
+
15
+ const PRIMARY_ONNX_MODULE_PATH = path.resolve(
16
+ 'dist',
17
+ 'architecture',
18
+ 'onnx.js',
19
+ );
20
+ const FALLBACK_ONNX_MODULE_PATH = path.resolve(
21
+ 'dist',
22
+ 'architecture',
23
+ 'network',
24
+ 'network.onnx.js',
25
+ );
26
+ const NETWORK_MODULE_PATH = path.resolve('dist', 'architecture', 'network.js');
27
+
28
+ interface ExportOnnxOptions {
29
+ includeMetadata: boolean;
30
+ batchDimension: boolean;
31
+ legacyNodeOrdering: boolean;
32
+ allowPartialConnectivity: boolean;
33
+ allowMixedActivations: boolean;
34
+ }
35
+
36
+ interface NetworkLike {
37
+ toJSON?: () => unknown;
38
+ }
39
+
40
+ interface NetworkFactory<TNetwork extends NetworkLike> {
41
+ fromJSON(raw: unknown): TNetwork;
42
+ }
43
+
44
+ interface OnnxExportModule<TNetwork extends NetworkLike> {
45
+ exportToONNX: (network: TNetwork, options: ExportOnnxOptions) => unknown;
46
+ }
47
+
48
+ interface DistDependencies<TNetwork extends NetworkLike> {
49
+ Network: NetworkFactory<TNetwork>;
50
+ exportToONNX: OnnxExportModule<TNetwork>['exportToONNX'];
51
+ }
52
+
53
+ interface ParsedCliOptions extends ExportOnnxOptions {
54
+ inputFile: string;
55
+ outputFile: string;
56
+ }
57
+
58
+ /**
59
+ * Runs the ONNX export CLI.
60
+ *
61
+ * @returns Promise resolved when export succeeds.
62
+ */
63
+ async function main(): Promise<void> {
64
+ const rawArguments = process.argv.slice(2);
65
+ if (hasFlag(rawArguments, '--help') || hasFlag(rawArguments, '-h')) {
66
+ printUsage();
67
+ return;
68
+ }
69
+
70
+ const cliOptions = parseCliOptions(rawArguments);
71
+ const { Network, exportToONNX } = await loadDistDependencies<NetworkLike>();
72
+ const networkJson = readJsonFile(cliOptions.inputFile);
73
+ const network = Network.fromJSON(networkJson);
74
+ const onnxJson = exportToONNX(network, cliOptions);
75
+
76
+ fs.writeFileSync(
77
+ path.resolve(cliOptions.outputFile),
78
+ `${JSON.stringify(onnxJson, null, 2)}\n`,
79
+ 'utf8',
80
+ );
81
+ console.log(`ONNX JSON written to ${cliOptions.outputFile}`);
82
+ }
83
+
84
+ /**
85
+ * Parses CLI options from raw process arguments.
86
+ *
87
+ * @param rawArguments - CLI arguments after the script path.
88
+ * @returns Parsed and validated CLI options.
89
+ */
90
+ function parseCliOptions(rawArguments: readonly string[]): ParsedCliOptions {
91
+ const inputFile = resolveOptionValue(rawArguments, '--in');
92
+ const outputFile = resolveOptionValue(rawArguments, '--out');
93
+
94
+ if (!inputFile || !outputFile) {
95
+ printUsageAndExit('Error: --in and --out are required.');
96
+ }
97
+
98
+ return {
99
+ inputFile,
100
+ outputFile,
101
+ includeMetadata: hasFlag(rawArguments, '--metadata'),
102
+ batchDimension: hasFlag(rawArguments, '--batch'),
103
+ legacyNodeOrdering: hasFlag(rawArguments, '--legacy'),
104
+ allowPartialConnectivity: hasFlag(rawArguments, '--partial'),
105
+ allowMixedActivations: hasFlag(rawArguments, '--mixed'),
106
+ };
107
+ }
108
+
109
+ /**
110
+ * Resolves one option value from `--name value` or `--name=value` syntax.
111
+ *
112
+ * @param rawArguments - CLI arguments after the script path.
113
+ * @param optionName - Long option name including leading dashes.
114
+ * @returns Option value when present.
115
+ */
116
+ function resolveOptionValue(
117
+ rawArguments: readonly string[],
118
+ optionName: string,
119
+ ): string | undefined {
120
+ const exactIndex = rawArguments.indexOf(optionName);
121
+ if (exactIndex >= 0) {
122
+ return rawArguments[exactIndex + 1];
123
+ }
124
+
125
+ const inlineArgument = rawArguments.find((argument) =>
126
+ argument.startsWith(`${optionName}=`),
127
+ );
128
+ return inlineArgument?.slice(optionName.length + 1);
129
+ }
130
+
131
+ /**
132
+ * Checks whether a boolean flag is present.
133
+ *
134
+ * @param rawArguments - CLI arguments after the script path.
135
+ * @param optionName - Flag name including leading dashes.
136
+ * @returns `true` when the flag is present.
137
+ */
138
+ function hasFlag(rawArguments: readonly string[], optionName: string): boolean {
139
+ return rawArguments.includes(optionName);
140
+ }
141
+
142
+ /**
143
+ * Loads the built network and ONNX export modules from `dist/`.
144
+ *
145
+ * @returns The built network constructor and ONNX export function.
146
+ */
147
+ async function loadDistDependencies<TNetwork extends NetworkLike>(): Promise<
148
+ DistDependencies<TNetwork>
149
+ > {
150
+ const onnxModule = (await importModuleWithFallback<
151
+ Partial<OnnxExportModule<TNetwork>>
152
+ >(PRIMARY_ONNX_MODULE_PATH, FALLBACK_ONNX_MODULE_PATH)) as Partial<
153
+ OnnxExportModule<TNetwork>
154
+ >;
155
+ const networkModule = (await import(
156
+ pathToFileURL(NETWORK_MODULE_PATH).href
157
+ )) as { default?: NetworkFactory<TNetwork> };
158
+
159
+ if (!networkModule.default || typeof onnxModule.exportToONNX !== 'function') {
160
+ throw new Error(
161
+ 'Failed to load built ONNX export dependencies from dist/.',
162
+ );
163
+ }
164
+
165
+ return {
166
+ Network: networkModule.default,
167
+ exportToONNX: onnxModule.exportToONNX,
168
+ };
169
+ }
170
+
171
+ /**
172
+ * Imports the primary built module, falling back to a secondary path when the
173
+ * public layout has shifted.
174
+ *
175
+ * @param primaryModulePath - Preferred built module path.
176
+ * @param fallbackModulePath - Fallback built module path.
177
+ * @returns Imported module namespace.
178
+ */
179
+ async function importModuleWithFallback<TModule>(
180
+ primaryModulePath: string,
181
+ fallbackModulePath: string,
182
+ ): Promise<TModule> {
183
+ try {
184
+ return (await import(pathToFileURL(primaryModulePath).href)) as TModule;
185
+ } catch {
186
+ return (await import(pathToFileURL(fallbackModulePath).href)) as TModule;
187
+ }
188
+ }
189
+
190
+ /**
191
+ * Reads and parses one JSON file.
192
+ *
193
+ * @param filePath - Source JSON file path.
194
+ * @returns Parsed JSON value.
195
+ */
196
+ function readJsonFile(filePath: string): unknown {
197
+ return JSON.parse(fs.readFileSync(path.resolve(filePath), 'utf8')) as unknown;
198
+ }
199
+
200
+ /** Prints CLI usage text. */
201
+ function printUsage(): void {
202
+ console.log(
203
+ 'Usage: npm run onnx:export -- --in network.json --out model.onnx.json [--metadata] [--batch] [--legacy] [--partial] [--mixed]',
204
+ );
205
+ }
206
+
207
+ /**
208
+ * Prints CLI usage text and exits the process with failure.
209
+ *
210
+ * @param message - Error message shown before usage text.
211
+ * @returns Never returns.
212
+ */
213
+ function printUsageAndExit(message: string): never {
214
+ console.error(message);
215
+ printUsage();
216
+ process.exit(1);
217
+ }
218
+
219
+ main().catch((error: unknown) => {
220
+ const errorMessage = error instanceof Error ? error.message : String(error);
221
+ console.error('Export failed:', errorMessage);
222
+ process.exit(1);
223
+ });