omni-viewer-core 0.15.0 → 0.17.0

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 (36) hide show
  1. package/README.md +68 -0
  2. package/dist/i18n/catalog.en.js +151 -0
  3. package/dist/i18n/catalog.ja.js +151 -0
  4. package/dist/i18n/catalog.ko.js +151 -0
  5. package/dist/i18n/catalog.zh-cn.js +151 -0
  6. package/dist/parsers/coreml/index.d.ts +232 -0
  7. package/dist/parsers/coreml/index.js +2498 -0
  8. package/dist/parsers/hdf5/index.d.ts +98 -0
  9. package/dist/parsers/hdf5/index.js +389 -11
  10. package/dist/parsers/keras/index.d.ts +119 -0
  11. package/dist/parsers/keras/index.js +1041 -0
  12. package/dist/parsers/numpy/index.d.ts +11 -2
  13. package/dist/parsers/numpy/index.js +412 -97
  14. package/dist/parsers/safetensors/index.d.ts +6 -0
  15. package/dist/parsers/safetensors/index.js +175 -28
  16. package/dist/registry/index.d.ts +2 -0
  17. package/dist/registry/index.js +16 -0
  18. package/dist/registry/probe.js +20 -0
  19. package/dist/styles/audio.css +4 -0
  20. package/dist/styles/coreml.css +4 -0
  21. package/dist/styles/keras.css +3 -0
  22. package/dist/viewers/audio/index.js +14 -4
  23. package/dist/viewers/audio/styles.js +4 -0
  24. package/dist/viewers/coreml/index.d.ts +18 -0
  25. package/dist/viewers/coreml/index.js +767 -0
  26. package/dist/viewers/coreml/styles.d.ts +1 -0
  27. package/dist/viewers/coreml/styles.js +8 -0
  28. package/dist/viewers/keras/index.d.ts +23 -0
  29. package/dist/viewers/keras/index.js +368 -0
  30. package/dist/viewers/keras/styles.d.ts +1 -0
  31. package/dist/viewers/keras/styles.js +4 -0
  32. package/dist/viewers/numpy/index.d.ts +2 -0
  33. package/dist/viewers/numpy/index.js +83 -23
  34. package/dist/viewers/safetensors/index.d.ts +7 -0
  35. package/dist/viewers/safetensors/index.js +23 -1
  36. package/package.json +23 -2
package/README.md CHANGED
@@ -16,6 +16,7 @@ models, viewers mount into a DOM element, and everything host-specific
16
16
  legacy PPT), Markdown, LaTeX (structure and math preview, not typesetting)
17
17
  - **Data & spreadsheets** — Excel, CSV/TSV, JSON, JSONL/NDJSON, YAML, TOML,
18
18
  Parquet, Avro, HDF5, MATLAB MAT, NumPy (NPY/NPZ), Safetensors, GGUF, ONNX, TFLite/LiteRT,
19
+ Keras (.keras and legacy .h5), Core ML (.mlmodel and .mlpackage),
19
20
  Protocol Buffers, ReqIF, SQLite
20
21
  - **Media & graphics** — audio (waveform/spectrogram), video, images,
21
22
  Photoshop PSD
@@ -145,6 +146,73 @@ and searchable operator, tensor, input/output, buffer, and model-information
145
146
  panels. Custom operators, Select TensorFlow fallbacks, and buffers stored
146
147
  outside the FlatBuffer are surfaced as warnings.
147
148
 
149
+ ### Keras models
150
+
151
+ Both Keras save formats open through one viewer. A `.keras` file is a ZIP whose
152
+ members Keras stores uncompressed, so `config.json`, `metadata.json`, and the
153
+ `model.weights.h5` store are read in place — JSZip is only consulted for an
154
+ archive that was re-zipped with compression. A legacy `.h5` model is read as
155
+ HDF5, taking `model_config` and `training_config` from the root attributes and
156
+ the parameters from `/model_weights`:
157
+
158
+ ```ts
159
+ import { mountKerasViewer } from 'omni-viewer-core/viewers/keras';
160
+
161
+ await mountKerasViewer({ fileName: file.name, data: bytes }, container, ctx);
162
+ ```
163
+
164
+ Weight payloads are never read: only dataset shapes and datatypes are walked, so
165
+ parameter counts stay cheap on multi-gigabyte models. The viewer lists layers
166
+ (nested sub-models flattened by depth) with per-layer configuration, inbound
167
+ connections, and weights, plus searchable weight, configuration, training,
168
+ archive, and model-information panels.
169
+
170
+ `.keras` routes by extension, and an extensionless archive is resolved by
171
+ `probeContainer`. A `.h5` file routes to the HDF5 viewer, since only its
172
+ contents distinguish a Keras model from any other HDF5 file; hosts that read the
173
+ whole file can refine that with `looksLikeKerasHdf5` from
174
+ `omni-viewer-core/parsers/keras` and mount the Keras viewer instead.
175
+
176
+ ### Core ML models
177
+
178
+ A `.mlmodel` is a serialized `CoreML.Specification.Model` protobuf, and an
179
+ `.mlpackage` is a bundle whose `Manifest.json` points at one such spec plus the
180
+ weight blobs its ML Program references. One entry point reads both — bytes that
181
+ open with a ZIP header are treated as a packaged bundle:
182
+
183
+ ```ts
184
+ import { mountCoremlViewer } from 'omni-viewer-core/viewers/coreml';
185
+
186
+ await mountCoremlViewer({ fileName: file.name, data: bytes }, container, ctx);
187
+ ```
188
+
189
+ Weight payloads are never decoded: blob references resolve to a file, an offset,
190
+ and a byte count, and inline weight tensors to their size and quantization, so a
191
+ multi-gigabyte model costs nothing to open. Package members are read in place,
192
+ and JSZip is only consulted for a bundle that was re-zipped with compression.
193
+
194
+ Two model families carry a graph, and the viewer reads them to different depths:
195
+
196
+ - An **ML Program** (Core ML 5 and newer) is self-describing — every operation
197
+ names its own inputs, so attributes are shown exactly as the producer wrote
198
+ them, with no schema knowledge involved.
199
+ - A **neural network** (the older encoding) stores each layer's parameters in a
200
+ distinct message per layer type. Layer types resolve for all of them, and
201
+ attributes are decoded for the common types; weights need no such table, since
202
+ `WeightParams` has one shape everywhere it appears and is found structurally.
203
+
204
+ The viewer provides a per-graph computation graph with operation, value, and
205
+ weight inspection, navigation into the blocks a control-flow operation
206
+ references, and searchable operation, input/output, weight, package, and
207
+ model-information panels. Custom layers, pipeline stages, unmapped layer types,
208
+ and weight files that are not present are surfaced as warnings.
209
+
210
+ Both extensions route by extension, and an extensionless zipped bundle is
211
+ resolved by `probeContainer` from its `Manifest.json` + `Data/com.apple.CoreML`
212
+ layout. A `.mlmodel` carries no leading magic, so hosts that can read a whole
213
+ extensionless file can refine routing with `looksLikeCoremlSpec` from
214
+ `omni-viewer-core/parsers/coreml`.
215
+
148
216
  ### Archive host integration
149
217
 
150
218
  Archive decompression remains adapter-owned: pass an `ArchiveDecoder` to
@@ -71,7 +71,51 @@ export const CATALOG_EN = {
71
71
  'numpy.title': 'NumPy arrays', 'numpy.selectArray': 'Select array', 'numpy.data': 'Data',
72
72
  'numpy.arrays': 'Arrays', 'numpy.copyJson': 'Copy JSON', 'numpy.noData': 'No arrays available.',
73
73
  'numpy.previewUnavailable': 'A value preview is not available for this dtype.', 'numpy.slice': 'Slice',
74
+ 'numpy.previewLimited': 'The document preview budget was exhausted before this array.',
75
+ 'numpy.emptyArray': 'This array has no elements.',
74
76
  'numpy.gridShown': '{rows} / {totalRows} rows · {columns} / {totalColumns} columns shown',
77
+ 'numpy.document.npy': 'NumPy array', 'numpy.document.npz': 'NumPy array archive',
78
+ 'numpy.summary.arrays': 'Arrays', 'numpy.summary.elements': 'Elements', 'numpy.summary.dtypes': 'Data types',
79
+ 'numpy.summary.status': 'Status', 'numpy.invalid': 'Invalid', 'numpy.scalar': 'scalar',
80
+ 'numpy.column.name': 'Name', 'numpy.column.dtype': 'Dtype', 'numpy.column.shape': 'Shape',
81
+ 'numpy.column.order': 'Order', 'numpy.column.elements': 'Elements', 'numpy.column.dataSize': 'Data size',
82
+ 'numpy.detail.dtype': 'dtype', 'numpy.detail.shape': 'shape', 'numpy.detail.order': 'order',
83
+ 'numpy.detail.elements': 'elements', 'numpy.detail.bytes': 'bytes', 'numpy.detail.kind': 'kind',
84
+ 'numpy.axis': 'axis {axis}', 'numpy.value': 'value',
85
+ 'numpy.kind.boolean': 'boolean', 'numpy.kind.signedInteger': 'signed integer', 'numpy.kind.unsignedInteger': 'unsigned integer',
86
+ 'numpy.kind.floatingPoint': 'floating point', 'numpy.kind.complex': 'complex', 'numpy.kind.byteString': 'byte string',
87
+ 'numpy.kind.unicodeString': 'Unicode string', 'numpy.kind.timedelta': 'timedelta', 'numpy.kind.datetime': 'datetime',
88
+ 'numpy.kind.void': 'void', 'numpy.kind.object': 'object', 'numpy.kind.unknown': 'unknown',
89
+ 'numpy.warning.notNumpy': 'The file is not a NumPy .npy or .npz file.',
90
+ 'numpy.warning.npyMagic': 'The NPY magic signature is missing.', 'numpy.warning.npzMagic': 'The NPZ ZIP signature is missing.',
91
+ 'numpy.warning.npzDeclaredSize': 'The NPZ declared uncompressed size exceeds {limit}.',
92
+ 'numpy.warning.npzEntryCount': 'The NPZ archive exceeds the {limit} entry safety limit.',
93
+ 'numpy.warning.npzArrayCount': 'Only the first {limit} arrays are shown.',
94
+ 'numpy.warning.npzArraySize': 'The uncompressed array exceeds the {limit} safety limit.',
95
+ 'numpy.warning.npzCrc': 'CRC validation failed; the array was skipped.',
96
+ 'numpy.warning.npzEntryRead': 'The array member could not be decompressed and was skipped: {reason}',
97
+ 'numpy.warning.npzTotalSize': 'Stopped expanding arrays at the {limit} total safety limit.',
98
+ 'numpy.warning.npzNoArrays': 'The NPZ archive does not contain any .npy arrays.',
99
+ 'numpy.warning.npzRead': 'The NPZ archive could not be read: {reason}',
100
+ 'numpy.warning.npyHeader': 'Invalid or truncated NPY header.',
101
+ 'numpy.warning.npyVersion': 'Unsupported NPY format version {version}.',
102
+ 'numpy.warning.npyHeaderBounds': 'The declared NPY header extends beyond the file.',
103
+ 'numpy.warning.npyHeaderSize': 'The NPY header exceeds the {limit} safety limit.',
104
+ 'numpy.warning.npyHeaderDecode': 'The NPY header text could not be decoded.',
105
+ 'numpy.warning.npyHeaderFields': 'The NPY header is missing a simple dtype, shape, or storage-order declaration. Structured dtypes are not yet decoded.',
106
+ 'numpy.warning.npyHeaderGrammar': 'The NPY header contains duplicate fields or unsupported trailing syntax.',
107
+ 'numpy.warning.npyShape': 'The NPY shape contains an invalid dimension.',
108
+ 'numpy.warning.npyElementCount': 'The NPY element count is outside the safe integer range.',
109
+ 'numpy.warning.npyRank': 'The NPY array rank exceeds the {limit}-axis safety limit.',
110
+ 'numpy.warning.payloadShort': 'The array payload is shorter than its dtype and shape require.',
111
+ 'numpy.warning.payloadTrailing': 'The array payload contains trailing bytes.',
112
+ 'numpy.warning.objectUnsafe': 'Object arrays are not loaded because doing so would require unsafe pickle deserialization.',
113
+ 'numpy.warning.dtypeUnsupported': 'Values with dtype {dtype} are not decoded; metadata is still available.',
114
+ 'numpy.warning.nativeEndian': 'Native-endian dtype was interpreted as little-endian.',
115
+ 'numpy.warning.previewDecode': 'Some preview values could not be decoded.',
116
+ 'numpy.warning.previewLimit': 'The document value preview is limited to {limit} elements.',
117
+ 'numpy.warning.textPreviewLimit': 'String previews are limited to {perValue} characters per value and {total} characters per document.',
118
+ 'numpy.warning.stringItemSize': 'String values wider than {limit} are not decoded.',
75
119
  'gguf.title': 'GGUF', 'gguf.search': 'Search metadata and tensors…', 'gguf.copyJson': 'Copy JSON',
76
120
  'gguf.structure': 'Structure', 'gguf.noData': 'No data available.',
77
121
  'gguf.matchingRows': '{count} matching rows',
@@ -166,6 +210,112 @@ export const CATALOG_EN = {
166
210
  'tflite.inspector.inputs': 'Inputs', 'tflite.inspector.outputs': 'Outputs',
167
211
  'tflite.inspector.intermediates': 'Intermediates', 'tflite.inspector.options': 'Options',
168
212
  'tflite.inspector.customOptions': 'Custom options', 'tflite.inspector.subgraphs': 'Referenced subgraphs',
213
+ 'coreml.title': 'Core ML model', 'coreml.search': 'Search operations, operands, and weights…',
214
+ 'coreml.copyJson': 'Copy JSON', 'coreml.graph': 'Graph', 'coreml.unnamed': 'unnamed',
215
+ 'coreml.operations': 'Operations', 'coreml.io': 'Inputs & Outputs', 'coreml.weights': 'Weights',
216
+ 'coreml.packageContents': 'Package', 'coreml.modelInfo': 'Model Info',
217
+ 'coreml.package': 'Package', 'coreml.updatable': 'Updatable',
218
+ 'coreml.specVersion': 'specification v{version}',
219
+ 'coreml.rows': '{shown} / {total} rows shown', 'coreml.noMatches': 'No rows match the current search.',
220
+ 'coreml.selectNode': 'Select an operation or value to inspect it.',
221
+ 'coreml.graphLimited': 'Graph preview shows {shown} of {total} items.',
222
+ 'coreml.graphEdgesLimited': 'Only the first {count} connections are shown.',
223
+ 'coreml.moreItems': '{count} more…', 'coreml.optional': 'Optional', 'coreml.default': 'default',
224
+ 'coreml.unknown': 'unknown', 'coreml.external': 'from enclosing scope',
225
+ 'coreml.yes': 'Yes', 'coreml.no': 'No', 'coreml.rootItem': 'root model',
226
+ 'coreml.blobPresent': '{count} tensor(s), {referenced} referenced of {size} in the package',
227
+ 'coreml.blobAbsent': '{count} tensor(s), {referenced} referenced — the file is not available here',
228
+ 'coreml.weightFiles': 'Weight files',
229
+ 'coreml.summary.operations': 'Operations', 'coreml.summary.graphs': 'Graphs',
230
+ 'coreml.summary.inputs': 'Inputs', 'coreml.summary.outputs': 'Outputs',
231
+ 'coreml.summary.functions': 'Functions', 'coreml.summary.specVersion': 'Spec version',
232
+ 'coreml.kind.operation': 'Operation', 'coreml.kind.layer': 'Layer', 'coreml.kind.stage': 'Pipeline stage',
233
+ 'coreml.kind.input': 'Input', 'coreml.kind.output': 'Output', 'coreml.kind.state': 'State',
234
+ 'coreml.kind.trainingInput': 'Training input', 'coreml.kind.manifestItem': 'Manifest item',
235
+ 'coreml.kind.archiveMember': 'Archive member',
236
+ 'coreml.storage.blob': 'Weight file', 'coreml.storage.inline': 'Inline',
237
+ 'coreml.column.index': '#', 'coreml.column.name': 'Name', 'coreml.column.type': 'Type',
238
+ 'coreml.column.kind': 'Kind', 'coreml.column.inputs': 'Inputs', 'coreml.column.outputs': 'Outputs',
239
+ 'coreml.column.attributes': 'Attributes', 'coreml.column.weights': 'Weights',
240
+ 'coreml.column.function': 'Function', 'coreml.column.typeShape': 'Type / Shape',
241
+ 'coreml.column.flexibility': 'Flexibility', 'coreml.column.optional': 'Optional',
242
+ 'coreml.column.description': 'Description', 'coreml.column.graph': 'Graph', 'coreml.column.node': 'Operation',
243
+ 'coreml.column.parameter': 'Parameter', 'coreml.column.shape': 'Shape', 'coreml.column.elements': 'Elements',
244
+ 'coreml.column.dataSize': 'Data size', 'coreml.column.storage': 'Storage',
245
+ 'coreml.column.location': 'Location', 'coreml.column.path': 'Path',
246
+ 'coreml.info.modelType': 'Model type', 'coreml.info.specVersion': 'Specification version',
247
+ 'coreml.info.availability': 'OS availability', 'coreml.info.description': 'Description',
248
+ 'coreml.info.author': 'Author', 'coreml.info.license': 'License', 'coreml.info.version': 'Version',
249
+ 'coreml.info.updatable': 'On-device update', 'coreml.info.fileSize': 'File size',
250
+ 'coreml.info.functions': 'Functions', 'coreml.info.defaultFunction': 'Default function',
251
+ 'coreml.info.graphs': 'Graphs', 'coreml.info.classLabels': 'Class labels',
252
+ 'coreml.info.packageVersion': 'Package format', 'coreml.info.modelPath': 'Model path',
253
+ 'coreml.inspector.inputs': 'Inputs', 'coreml.inspector.outputs': 'Outputs',
254
+ 'coreml.inspector.attributes': 'Attributes', 'coreml.inspector.weights': 'Weights',
255
+ 'coreml.inspector.graphs': 'Referenced graphs',
256
+ 'coreml.warning.specVersion': 'The model declares specification version {version}, which this viewer does not have an OS mapping for.',
257
+ 'coreml.warning.noModelType': 'The model declares no model type.',
258
+ 'coreml.warning.emptyGraph': 'The model contains no operations.',
259
+ 'coreml.warning.emptyProgram': 'The ML Program declares no functions.',
260
+ 'coreml.warning.programVersion': 'The ML Program declares version {version}; this viewer targets version 1.',
261
+ 'coreml.warning.emptyPipeline': 'The pipeline contains no stages.',
262
+ 'coreml.warning.pipelineDepth': 'Pipeline nesting deeper than {limit} levels was not read.',
263
+ 'coreml.warning.unknownLayer': 'Layer {name} declares no recognized layer type.',
264
+ 'coreml.warning.customLayers': '{count} custom layer(s) require a matching runtime registration: {names}',
265
+ 'coreml.warning.blobMissing': '{count} weight file(s) the model references are not in this package: {names}',
266
+ 'coreml.warning.blobUnavailable': '{count} weight file(s) live beside this specification and were not read: {names}',
267
+ 'coreml.warning.manifestMissing': 'The package has no Manifest.json; the model was located by its conventional path.',
268
+ 'coreml.warning.manifestInvalid': 'The package Manifest.json could not be read.',
269
+ 'coreml.warning.manifestUnreadable': 'The package Manifest.json could not be extracted, so the package contents are not described.',
270
+ 'coreml.warning.textTruncated': 'Some text fields were longer than this viewer displays and were cut short.',
271
+ 'coreml.warning.archiveEntryLimit': 'Only the first {limit} archive entries were read.',
272
+ 'coreml.warning.serializedModel': 'This is a private serialized model; Apple documents no schema for its contents.',
273
+ 'coreml.warning.linkedModel': 'This model links to a separate model file that this viewer does not read.',
274
+ 'keras.title': 'Keras model', 'keras.document.v3': 'Keras v3 archive', 'keras.document.hdf5': 'Keras HDF5 model',
275
+ 'keras.version': 'Keras {version}', 'keras.search': 'Search layers, weights, and configuration…',
276
+ 'keras.copyJson': 'Copy JSON', 'keras.invalid': 'invalid',
277
+ 'keras.tab.layers': 'Layers', 'keras.tab.weights': 'Weights', 'keras.tab.config': 'Configuration',
278
+ 'keras.tab.training': 'Training', 'keras.tab.files': 'Archive', 'keras.tab.model': 'Model Info',
279
+ 'keras.rows': '{count} rows', 'keras.rowsLimited': '{shown} / {total} rows shown',
280
+ 'keras.summary.layers': 'Layers', 'keras.summary.parameters': 'Parameters',
281
+ 'keras.summary.weightBytes': 'Weight size', 'keras.summary.kerasVersion': 'Keras version',
282
+ 'keras.summary.status': 'Status',
283
+ 'keras.column.name': 'Name', 'keras.column.type': 'Type', 'keras.column.inputShape': 'Input shape',
284
+ 'keras.column.activation': 'Activation', 'keras.column.parameters': 'Parameters',
285
+ 'keras.column.weights': 'Weights', 'keras.column.trainable': 'Trainable', 'keras.column.layer': 'Layer',
286
+ 'keras.column.shape': 'Shape', 'keras.column.dtype': 'Data type', 'keras.column.bytes': 'Size',
287
+ 'keras.column.path': 'Path', 'keras.column.field': 'Field', 'keras.column.value': 'Value',
288
+ 'keras.column.size': 'Size', 'keras.column.compressed': 'Compressed', 'keras.column.method': 'Method',
289
+ 'keras.detail.identity': 'Identity', 'keras.detail.inbound': 'Inputs from',
290
+ 'keras.detail.weights': 'Weights', 'keras.detail.config': 'Configuration',
291
+ 'keras.model.format': 'Format', 'keras.model.class': 'Model class', 'keras.model.name': 'Model name',
292
+ 'keras.model.kerasVersion': 'Keras version', 'keras.model.backend': 'Backend',
293
+ 'keras.model.dateSaved': 'Saved', 'keras.model.fileSize': 'File size',
294
+ 'keras.model.parameters': 'Parameters', 'keras.model.inputs': 'Inputs', 'keras.model.outputs': 'Outputs',
295
+ 'keras.noData': 'No data to show.', 'keras.noLayers': 'No layers were found in this model.',
296
+ 'keras.noWeights': 'This file stores no weights.',
297
+ 'keras.noConfig': 'This file does not carry a readable model configuration.',
298
+ 'keras.noTraining': 'This model was saved without a training configuration.',
299
+ 'keras.warning.notKeras': 'The file is neither a .keras archive nor an HDF5 model.',
300
+ 'keras.warning.archiveUnreadable': 'The .keras archive directory could not be read.',
301
+ 'keras.warning.archiveEntryLimit': 'Only the first {limit} archive entries were inspected.',
302
+ 'keras.warning.memberTooLarge': '{name} exceeds the {limit} safety limit and was skipped.',
303
+ 'keras.warning.memberUnreadable': '{name} could not be read from the archive.',
304
+ 'keras.warning.memberMethod': '{name} uses unsupported compression method {method}.',
305
+ 'keras.warning.inflateUnavailable': '{name} is compressed, and no inflater is available on this platform.',
306
+ 'keras.warning.jsonInvalid': '{name} is not valid JSON.',
307
+ 'keras.warning.configMissing': 'The archive has no config.json, so the layer list is unavailable.',
308
+ 'keras.warning.configMissingHdf5': 'The file has no model_config attribute; it may be a weights-only checkpoint.',
309
+ 'keras.warning.configUnreadable': 'The model_config attribute could not be decoded.',
310
+ 'keras.warning.configTruncated': 'The configuration preview was truncated to {limit} characters.',
311
+ 'keras.warning.weightsMissing': 'No weight store was found, so parameter counts are unavailable.',
312
+ 'keras.warning.weightsUnreadable': 'The weight store is not a readable HDF5 file.',
313
+ 'keras.warning.weightLimit': 'Only the first {limit} weights were read.',
314
+ 'keras.warning.layerLimit': 'Only the first {limit} layers were read.',
315
+ 'keras.warning.noLayers': 'The configuration declares no layers.',
316
+ 'keras.warning.unmatchedWeights': 'Weights for "{layer}" have no matching layer in the configuration.',
317
+ 'keras.warning.unmatchedWeightsMore': '{count} further weight group(s) have no matching layer.',
318
+ 'keras.warning.structureTruncated': 'The HDF5 structure exceeded the inspection limits and was read partially.',
169
319
  'proto.title': 'Protocol Buffer', 'proto.summary': '{syntax} · {package} · {messages} messages · {services} services',
170
320
  'proto.noPackage': 'no package', 'proto.search': 'Search message, field, enum, RPC', 'proto.copyPanel': 'Copy panel',
171
321
  'proto.panel.tree': 'Message Tree', 'proto.panel.types': 'Types', 'proto.panel.relationships': 'Relationships',
@@ -360,6 +510,7 @@ export const CATALOG_EN = {
360
510
  'common.copied': 'Copied to clipboard',
361
511
  'common.noClipboard': 'Copy is unavailable on this platform',
362
512
  'common.copyTooLarge': 'Too large to copy to the clipboard ({size} bytes). Use file export instead.',
513
+ 'common.copyTooLargeNoExport': 'Too large to copy to the clipboard ({size} bytes).',
363
514
  'common.noFileSave': 'Saving files is unavailable on this platform',
364
515
  'common.saved': 'Saved {name}',
365
516
  'common.savedToOriginal': 'Saved',
@@ -67,7 +67,51 @@ export const CATALOG_JA = {
67
67
  'numpy.title': 'NumPy配列', 'numpy.selectArray': '配列を選択', 'numpy.data': 'データ',
68
68
  'numpy.arrays': '配列一覧', 'numpy.copyJson': 'JSONをコピー', 'numpy.noData': '表示できる配列がありません。',
69
69
  'numpy.previewUnavailable': 'このデータ型の値プレビューは利用できません。', 'numpy.slice': 'スライス',
70
+ 'numpy.previewLimited': 'この配列に達する前にドキュメントのプレビュー予算を使い切りました。',
71
+ 'numpy.emptyArray': 'この配列には要素がありません。',
70
72
  'numpy.gridShown': '{totalRows}行中{rows}行・{totalColumns}列中{columns}列を表示',
73
+ 'numpy.document.npy': 'NumPy配列', 'numpy.document.npz': 'NumPy配列アーカイブ',
74
+ 'numpy.summary.arrays': '配列', 'numpy.summary.elements': '要素', 'numpy.summary.dtypes': 'データ型',
75
+ 'numpy.summary.status': '状態', 'numpy.invalid': '無効', 'numpy.scalar': 'スカラー',
76
+ 'numpy.column.name': '名前', 'numpy.column.dtype': 'データ型', 'numpy.column.shape': '形状',
77
+ 'numpy.column.order': '順序', 'numpy.column.elements': '要素', 'numpy.column.dataSize': 'データサイズ',
78
+ 'numpy.detail.dtype': 'データ型', 'numpy.detail.shape': '形状', 'numpy.detail.order': '順序',
79
+ 'numpy.detail.elements': '要素', 'numpy.detail.bytes': 'バイト', 'numpy.detail.kind': '種類',
80
+ 'numpy.axis': '軸 {axis}', 'numpy.value': '値',
81
+ 'numpy.kind.boolean': 'ブール値', 'numpy.kind.signedInteger': '符号付き整数', 'numpy.kind.unsignedInteger': '符号なし整数',
82
+ 'numpy.kind.floatingPoint': '浮動小数点', 'numpy.kind.complex': '複素数', 'numpy.kind.byteString': 'バイト文字列',
83
+ 'numpy.kind.unicodeString': 'Unicode文字列', 'numpy.kind.timedelta': '時間差', 'numpy.kind.datetime': '日時',
84
+ 'numpy.kind.void': 'void', 'numpy.kind.object': 'オブジェクト', 'numpy.kind.unknown': '不明',
85
+ 'numpy.warning.notNumpy': 'NumPy .npyまたは.npzファイルではありません。',
86
+ 'numpy.warning.npyMagic': 'NPYマジックシグネチャがありません。', 'numpy.warning.npzMagic': 'NPZ ZIPシグネチャがありません。',
87
+ 'numpy.warning.npzDeclaredSize': 'NPZの宣言済み展開サイズが{limit}を超えています。',
88
+ 'numpy.warning.npzEntryCount': 'NPZアーカイブがエントリ数の安全上限{limit}を超えています。',
89
+ 'numpy.warning.npzArrayCount': '先頭{limit}個の配列のみ表示します。',
90
+ 'numpy.warning.npzArraySize': '展開された配列が安全上限{limit}を超えています。',
91
+ 'numpy.warning.npzCrc': 'CRC検証に失敗したため、配列をスキップしました。',
92
+ 'numpy.warning.npzEntryRead': '配列メンバーを展開できないためスキップしました: {reason}',
93
+ 'numpy.warning.npzTotalSize': '合計安全上限{limit}で配列の展開を停止しました。',
94
+ 'numpy.warning.npzNoArrays': 'NPZアーカイブに.npy配列がありません。',
95
+ 'numpy.warning.npzRead': 'NPZアーカイブを読み込めませんでした: {reason}',
96
+ 'numpy.warning.npyHeader': 'NPYヘッダーが無効または途中で切れています。',
97
+ 'numpy.warning.npyVersion': 'NPY形式バージョン{version}は未対応です。',
98
+ 'numpy.warning.npyHeaderBounds': '宣言されたNPYヘッダーがファイルの範囲を超えています。',
99
+ 'numpy.warning.npyHeaderSize': 'NPYヘッダーが安全上限{limit}を超えています。',
100
+ 'numpy.warning.npyHeaderDecode': 'NPYヘッダーテキストをデコードできませんでした。',
101
+ 'numpy.warning.npyHeaderFields': 'NPYヘッダーに単純なdtype、shape、または保存順序の宣言がありません。構造化dtypeはまだデコードされません。',
102
+ 'numpy.warning.npyHeaderGrammar': 'NPYヘッダーに重複フィールドまたは未対応の後続構文があります。',
103
+ 'numpy.warning.npyShape': 'NPY形状に無効な次元があります。',
104
+ 'numpy.warning.npyElementCount': 'NPY要素数が安全な整数範囲外です。',
105
+ 'numpy.warning.npyRank': 'NPY配列の次元数が安全上限{limit}軸を超えています。',
106
+ 'numpy.warning.payloadShort': '配列payloadがdtypeとshapeに必要な長さより短くなっています。',
107
+ 'numpy.warning.payloadTrailing': '配列payloadに余分なバイトがあります。',
108
+ 'numpy.warning.objectUnsafe': '安全でないpickleの逆シリアル化が必要なため、オブジェクト配列は読み込みません。',
109
+ 'numpy.warning.dtypeUnsupported': 'dtype {dtype}の値はデコードされませんが、メタデータは表示できます。',
110
+ 'numpy.warning.nativeEndian': 'ネイティブエンディアンdtypeをリトルエンディアンとして解釈しました。',
111
+ 'numpy.warning.previewDecode': '一部のプレビュー値をデコードできませんでした。',
112
+ 'numpy.warning.previewLimit': 'ドキュメントの値プレビューは{limit}要素に制限されています。',
113
+ 'numpy.warning.textPreviewLimit': '文字列プレビューは1値あたり{perValue}文字、1ドキュメントあたり{total}文字に制限されています。',
114
+ 'numpy.warning.stringItemSize': '幅が{limit}を超える文字列値はデコードされません。',
71
115
  'gguf.title': 'GGUF', 'gguf.search': 'メタデータとテンソルを検索…', 'gguf.copyJson': 'JSONをコピー',
72
116
  'gguf.structure': '構造', 'gguf.noData': '表示できるデータがありません。',
73
117
  'gguf.matchingRows': '一致する行: {count}件',
@@ -162,6 +206,112 @@ export const CATALOG_JA = {
162
206
  'tflite.inspector.inputs': '入力', 'tflite.inspector.outputs': '出力',
163
207
  'tflite.inspector.intermediates': '中間テンソル', 'tflite.inspector.options': 'オプション',
164
208
  'tflite.inspector.customOptions': 'カスタムオプション', 'tflite.inspector.subgraphs': '参照サブグラフ',
209
+ 'coreml.title': 'Core MLモデル', 'coreml.search': '演算・オペランド・重みを検索…',
210
+ 'coreml.copyJson': 'JSONをコピー', 'coreml.graph': 'グラフ', 'coreml.unnamed': '名前なし',
211
+ 'coreml.operations': '演算', 'coreml.io': '入力と出力', 'coreml.weights': '重み',
212
+ 'coreml.packageContents': 'パッケージ', 'coreml.modelInfo': 'モデル情報',
213
+ 'coreml.package': 'パッケージ', 'coreml.updatable': '更新可能',
214
+ 'coreml.specVersion': '仕様 v{version}',
215
+ 'coreml.rows': '{total}行中{shown}行を表示', 'coreml.noMatches': '現在の検索に一致する行はありません。',
216
+ 'coreml.selectNode': '演算または値を選択すると詳細が表示されます。',
217
+ 'coreml.graphLimited': 'グラフプレビューは{total}件中{shown}件を表示しています。',
218
+ 'coreml.graphEdgesLimited': '最初の{count}本の接続のみ表示しています。',
219
+ 'coreml.moreItems': '他{count}件…', 'coreml.optional': '省略可', 'coreml.default': '既定',
220
+ 'coreml.unknown': '不明', 'coreml.external': '外側のスコープから',
221
+ 'coreml.yes': 'はい', 'coreml.no': 'いいえ', 'coreml.rootItem': 'ルートモデル',
222
+ 'coreml.blobPresent': 'テンソル{count}件、パッケージ内{size}のうち{referenced}を参照',
223
+ 'coreml.blobAbsent': 'テンソル{count}件、{referenced}を参照 — このファイルはここにありません',
224
+ 'coreml.weightFiles': '重みファイル',
225
+ 'coreml.summary.operations': '演算', 'coreml.summary.graphs': 'グラフ',
226
+ 'coreml.summary.inputs': '入力', 'coreml.summary.outputs': '出力',
227
+ 'coreml.summary.functions': '関数', 'coreml.summary.specVersion': '仕様バージョン',
228
+ 'coreml.kind.operation': '演算', 'coreml.kind.layer': 'レイヤー', 'coreml.kind.stage': 'パイプライン段',
229
+ 'coreml.kind.input': '入力', 'coreml.kind.output': '出力', 'coreml.kind.state': '状態',
230
+ 'coreml.kind.trainingInput': '学習入力', 'coreml.kind.manifestItem': 'マニフェスト項目',
231
+ 'coreml.kind.archiveMember': 'アーカイブメンバー',
232
+ 'coreml.storage.blob': '重みファイル', 'coreml.storage.inline': '埋め込み',
233
+ 'coreml.column.index': '#', 'coreml.column.name': '名前', 'coreml.column.type': '種別',
234
+ 'coreml.column.kind': '分類', 'coreml.column.inputs': '入力', 'coreml.column.outputs': '出力',
235
+ 'coreml.column.attributes': '属性', 'coreml.column.weights': '重み',
236
+ 'coreml.column.function': '関数', 'coreml.column.typeShape': '型 / 形状',
237
+ 'coreml.column.flexibility': '可変性', 'coreml.column.optional': '省略可',
238
+ 'coreml.column.description': '説明', 'coreml.column.graph': 'グラフ', 'coreml.column.node': '演算',
239
+ 'coreml.column.parameter': 'パラメータ', 'coreml.column.shape': '形状', 'coreml.column.elements': '要素数',
240
+ 'coreml.column.dataSize': 'データサイズ', 'coreml.column.storage': '格納先',
241
+ 'coreml.column.location': '位置', 'coreml.column.path': 'パス',
242
+ 'coreml.info.modelType': 'モデル種別', 'coreml.info.specVersion': '仕様バージョン',
243
+ 'coreml.info.availability': '対応OS', 'coreml.info.description': '説明',
244
+ 'coreml.info.author': '作成者', 'coreml.info.license': 'ライセンス', 'coreml.info.version': 'バージョン',
245
+ 'coreml.info.updatable': 'オンデバイス更新', 'coreml.info.fileSize': 'ファイルサイズ',
246
+ 'coreml.info.functions': '関数', 'coreml.info.defaultFunction': '既定の関数',
247
+ 'coreml.info.graphs': 'グラフ', 'coreml.info.classLabels': 'クラスラベル',
248
+ 'coreml.info.packageVersion': 'パッケージ形式', 'coreml.info.modelPath': 'モデルパス',
249
+ 'coreml.inspector.inputs': '入力', 'coreml.inspector.outputs': '出力',
250
+ 'coreml.inspector.attributes': '属性', 'coreml.inspector.weights': '重み',
251
+ 'coreml.inspector.graphs': '参照グラフ',
252
+ 'coreml.warning.specVersion': 'モデルは仕様バージョン{version}を宣言していますが、このビューアーに対応OSの情報がありません。',
253
+ 'coreml.warning.noModelType': 'モデルにモデル種別が宣言されていません。',
254
+ 'coreml.warning.emptyGraph': 'モデルに演算がありません。',
255
+ 'coreml.warning.emptyProgram': 'ML Programに関数が宣言されていません。',
256
+ 'coreml.warning.programVersion': 'ML Programはバージョン{version}を宣言しています。このビューアーはバージョン1を対象としています。',
257
+ 'coreml.warning.emptyPipeline': 'パイプラインに段がありません。',
258
+ 'coreml.warning.pipelineDepth': '{limit}段より深いパイプラインのネストは読み取っていません。',
259
+ 'coreml.warning.unknownLayer': 'レイヤー{name}に認識可能なレイヤー種別がありません。',
260
+ 'coreml.warning.customLayers': 'カスタムレイヤー{count}件はランタイムへの登録が必要です: {names}',
261
+ 'coreml.warning.blobMissing': 'モデルが参照する重みファイル{count}件がこのパッケージにありません: {names}',
262
+ 'coreml.warning.blobUnavailable': '重みファイル{count}件はこの仕様ファイルと同じ場所にあり、読み取っていません: {names}',
263
+ 'coreml.warning.manifestMissing': 'パッケージにManifest.jsonがないため、慣例のパスからモデルを見つけました。',
264
+ 'coreml.warning.manifestInvalid': 'パッケージのManifest.jsonを読み取れませんでした。',
265
+ 'coreml.warning.manifestUnreadable': 'パッケージのManifest.jsonを展開できなかったため、パッケージ構成を表示できません。',
266
+ 'coreml.warning.textTruncated': '一部のテキストフィールドが表示上限を超えたため切り詰められました。',
267
+ 'coreml.warning.archiveEntryLimit': 'アーカイブ項目のうち最初の{limit}件のみ読み取りました。',
268
+ 'coreml.warning.serializedModel': '非公開のシリアライズ済みモデルです。Appleは内容のスキーマを公開していません。',
269
+ 'coreml.warning.linkedModel': 'このモデルは別のモデルファイルを参照しており、ビューアーはそのファイルを読み取りません。',
270
+ 'keras.title': 'Kerasモデル', 'keras.document.v3': 'Keras v3アーカイブ', 'keras.document.hdf5': 'Keras HDF5モデル',
271
+ 'keras.version': 'Keras {version}', 'keras.search': 'レイヤー、重み、設定を検索…',
272
+ 'keras.copyJson': 'JSONをコピー', 'keras.invalid': '無効',
273
+ 'keras.tab.layers': 'レイヤー', 'keras.tab.weights': '重み', 'keras.tab.config': '設定',
274
+ 'keras.tab.training': '学習設定', 'keras.tab.files': 'アーカイブ', 'keras.tab.model': 'モデル情報',
275
+ 'keras.rows': '{count}行', 'keras.rowsLimited': '{shown} / {total}行を表示',
276
+ 'keras.summary.layers': 'レイヤー', 'keras.summary.parameters': 'パラメーター',
277
+ 'keras.summary.weightBytes': '重みサイズ', 'keras.summary.kerasVersion': 'Kerasバージョン',
278
+ 'keras.summary.status': '状態',
279
+ 'keras.column.name': '名前', 'keras.column.type': '種類', 'keras.column.inputShape': '入力形状',
280
+ 'keras.column.activation': '活性化', 'keras.column.parameters': 'パラメーター',
281
+ 'keras.column.weights': '重み', 'keras.column.trainable': '学習可能', 'keras.column.layer': 'レイヤー',
282
+ 'keras.column.shape': '形状', 'keras.column.dtype': 'データ型', 'keras.column.bytes': 'サイズ',
283
+ 'keras.column.path': 'パス', 'keras.column.field': '項目', 'keras.column.value': '値',
284
+ 'keras.column.size': 'サイズ', 'keras.column.compressed': '圧縮後', 'keras.column.method': '圧縮方式',
285
+ 'keras.detail.identity': '識別情報', 'keras.detail.inbound': '入力元',
286
+ 'keras.detail.weights': '重み', 'keras.detail.config': '設定',
287
+ 'keras.model.format': '形式', 'keras.model.class': 'モデルクラス', 'keras.model.name': 'モデル名',
288
+ 'keras.model.kerasVersion': 'Kerasバージョン', 'keras.model.backend': 'バックエンド',
289
+ 'keras.model.dateSaved': '保存日時', 'keras.model.fileSize': 'ファイルサイズ',
290
+ 'keras.model.parameters': 'パラメーター', 'keras.model.inputs': '入力', 'keras.model.outputs': '出力',
291
+ 'keras.noData': '表示できるデータがありません。', 'keras.noLayers': 'このモデルにレイヤーは見つかりませんでした。',
292
+ 'keras.noWeights': 'このファイルには重みが保存されていません。',
293
+ 'keras.noConfig': 'このファイルには読み取り可能なモデル設定が含まれていません。',
294
+ 'keras.noTraining': 'このモデルは学習設定なしで保存されています。',
295
+ 'keras.warning.notKeras': 'このファイルは.kerasアーカイブでもHDF5モデルでもありません。',
296
+ 'keras.warning.archiveUnreadable': '.kerasアーカイブのディレクトリを読み取れませんでした。',
297
+ 'keras.warning.archiveEntryLimit': 'アーカイブの先頭{limit}件のみを検査しました。',
298
+ 'keras.warning.memberTooLarge': '{name}は安全上限の{limit}を超えるためスキップしました。',
299
+ 'keras.warning.memberUnreadable': '{name}をアーカイブから読み取れませんでした。',
300
+ 'keras.warning.memberMethod': '{name}は未対応の圧縮方式{method}を使用しています。',
301
+ 'keras.warning.inflateUnavailable': '{name}は圧縮されていますが、この環境では展開機能を利用できません。',
302
+ 'keras.warning.jsonInvalid': '{name}は有効なJSONではありません。',
303
+ 'keras.warning.configMissing': 'アーカイブにconfig.jsonがないため、レイヤー一覧を表示できません。',
304
+ 'keras.warning.configMissingHdf5': 'model_config属性がありません。重みのみのチェックポイントの可能性があります。',
305
+ 'keras.warning.configUnreadable': 'model_config属性をデコードできませんでした。',
306
+ 'keras.warning.configTruncated': '設定のプレビューを{limit}文字で打ち切りました。',
307
+ 'keras.warning.weightsMissing': '重みストアが見つからないため、パラメーター数を表示できません。',
308
+ 'keras.warning.weightsUnreadable': '重みストアは読み取り可能なHDF5ファイルではありません。',
309
+ 'keras.warning.weightLimit': '先頭{limit}件の重みのみを読み取りました。',
310
+ 'keras.warning.layerLimit': '先頭{limit}件のレイヤーのみを読み取りました。',
311
+ 'keras.warning.noLayers': '設定にレイヤーが宣言されていません。',
312
+ 'keras.warning.unmatchedWeights': '「{layer}」の重みに対応するレイヤーが設定に見つかりません。',
313
+ 'keras.warning.unmatchedWeightsMore': '対応するレイヤーがない重みグループがさらに{count}件あります。',
314
+ 'keras.warning.structureTruncated': 'HDF5構造が検査上限を超えたため、一部のみ読み取りました。',
165
315
  'proto.title': 'Protocol Buffer', 'proto.summary': '{syntax} · {package} · メッセージ{messages}件 · サービス{services}件',
166
316
  'proto.noPackage': 'パッケージなし', 'proto.search': 'メッセージ、フィールド、列挙型、RPCを検索', 'proto.copyPanel': 'パネルをコピー',
167
317
  'proto.panel.tree': 'メッセージツリー', 'proto.panel.types': '型', 'proto.panel.relationships': '関係',
@@ -356,6 +506,7 @@ export const CATALOG_JA = {
356
506
  'common.rowsMatched': '{total}行中{matched}行が一致', 'common.copied': 'クリップボードにコピーしました',
357
507
  'common.noClipboard': 'この環境ではコピーを利用できません',
358
508
  'common.copyTooLarge': 'クリップボードにコピーするには大きすぎます({size}バイト)。代わりにファイルへエクスポートしてください。',
509
+ 'common.copyTooLargeNoExport': 'クリップボードにコピーするには大きすぎます({size}バイト)。',
359
510
  'common.noFileSave': 'この環境ではファイルを保存できません', 'common.saved': '{name}を保存しました',
360
511
  'common.savedToOriginal': '保存しました', 'common.saveFailed': '保存に失敗しました',
361
512
  'common.unsaved': '未保存の変更', 'common.noWriteback': '元のファイルには保存できません。ファイルのエクスポートを使用してください。',