omnius 1.0.680 → 1.0.682

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.
@@ -291370,6 +291370,33 @@ var MANAGED_ASR_VENV = join4(homedir5(), ".omnius", "runtimes", "asr", ".venv-wh
291370
291370
  var MANAGED_TRANSCRIBE_CLI_DIR = join4(homedir5(), ".omnius", "runtimes", "asr", "transcribe-cli-node");
291371
291371
  var YT_DLP_VENV = join4(homedir5(), ".omnius", "runtimes", "media-tools", ".venv-ytdlp");
291372
291372
 
291373
+ // packages/execution/dist/tools/document.js
291374
+ var DEFAULT_MAX_DOCUMENT_BYTES = 8 * 1024 * 1024;
291375
+ var MAX_ZIP_EXPANDED_BYTES = 16 * 1024 * 1024;
291376
+ var MAX_ZIP_ENTRY_BYTES = 4 * 1024 * 1024;
291377
+
291378
+ // packages/execution/dist/tools/safe-image-edit.js
291379
+ var MAX_INPUT_BYTES = 25 * 1024 * 1024;
291380
+ var MAX_OUTPUT_BYTES = 30 * 1024 * 1024;
291381
+
291382
+ // packages/execution/dist/tools/audio-edit.js
291383
+ init_process_async();
291384
+ var AUDIO_EDIT_LIMITS = {
291385
+ maxInputFiles: 16,
291386
+ maxMixInputs: 8,
291387
+ maxSegments: 32,
291388
+ maxInputBytes: 512 * 1024 * 1024,
291389
+ maxTotalInputBytes: 1024 * 1024 * 1024,
291390
+ maxInputDurationSec: 2 * 60 * 60,
291391
+ maxTotalInputDurationSec: 4 * 60 * 60,
291392
+ maxOutputDurationSec: 2 * 60 * 60,
291393
+ maxOutputBytes: 512 * 1024 * 1024,
291394
+ maxSilenceSegmentSec: 5 * 60,
291395
+ maxTotalSilenceSec: 10 * 60,
291396
+ maxDelaySec: 10 * 60,
291397
+ processTimeoutMs: 10 * 60 * 1e3
291398
+ };
291399
+
291373
291400
  // packages/execution/dist/tools/safe-math-eval.js
291374
291401
  var CONSTANTS = {
291375
291402
  "math.pi": Math.PI,
@@ -293091,7 +293118,7 @@ var DEFAULT_SPONSOR_MEDIA_LIMITS = {
293091
293118
 
293092
293119
  // packages/execution/dist/tools/pdf-document.js
293093
293120
  init_process_async();
293094
- var DEFAULT_MAX_DOCUMENT_BYTES = 500 * 1024 * 1024;
293121
+ var DEFAULT_MAX_DOCUMENT_BYTES2 = 500 * 1024 * 1024;
293095
293122
 
293096
293123
  // packages/execution/dist/index.js
293097
293124
  init_vision();
@@ -25220,11 +25220,11 @@
25220
25220
  },
25221
25221
  {
25222
25222
  "signature": "/remind <when> <message>",
25223
- "description": "Set a scoped minimal reminder; a due time is required"
25223
+ "description": "Set a scoped person notification; a due time is required"
25224
25224
  },
25225
25225
  {
25226
25226
  "signature": "/remind in 30m <message>",
25227
- "description": "Set a scoped minimal reminder with a relative due time"
25227
+ "description": "Set a scoped person notification with a relative due time"
25228
25228
  },
25229
25229
  {
25230
25230
  "signature": "/reminders",
@@ -36648,6 +36648,62 @@
36648
36648
  }
36649
36649
  ]
36650
36650
  },
36651
+ {
36652
+ "id": "tool.audio-edit",
36653
+ "kind": "tool",
36654
+ "title": "Audio Edit",
36655
+ "summary": "audio_edit is a directly callable Omnius tool.",
36656
+ "aliases": [
36657
+ "audio_edit"
36658
+ ],
36659
+ "keywords": [
36660
+ "tool",
36661
+ "audio",
36662
+ "edit"
36663
+ ],
36664
+ "maturity": "stable",
36665
+ "layer": "execution",
36666
+ "audiences": [
36667
+ "coding-agent",
36668
+ "integrator",
36669
+ "service-agent"
36670
+ ],
36671
+ "use_when": [
36672
+ "The caller needs this isolated operation and live metadata confirms direct-call availability"
36673
+ ],
36674
+ "avoid_when": [
36675
+ "The live registry reports the tool unavailable or the caller lacks its required scope"
36676
+ ],
36677
+ "interfaces": [
36678
+ {
36679
+ "type": "rest-schema",
36680
+ "target": "/v1/tools/audio_edit"
36681
+ },
36682
+ {
36683
+ "type": "rest-call",
36684
+ "target": "/v1/tools/audio_edit/call"
36685
+ }
36686
+ ],
36687
+ "references": [
36688
+ {
36689
+ "type": "source",
36690
+ "target": "packages/execution/src/tools/audio-edit.ts",
36691
+ "relation": "implementation"
36692
+ }
36693
+ ],
36694
+ "direct_callable": true,
36695
+ "live_metadata": "GET /v1/tools/audio_edit",
36696
+ "source_of_truth": [
36697
+ "packages/execution/src/tools/audio-edit.ts",
36698
+ "GET /v1/tools/audio_edit"
36699
+ ],
36700
+ "verification": [
36701
+ {
36702
+ "check": "Inspect GET /v1/tools/audio_edit before use",
36703
+ "expected": "Schema, security, exposure, and availability match the intended invocation"
36704
+ }
36705
+ ]
36706
+ },
36651
36707
  {
36652
36708
  "id": "tool.audio-playback",
36653
36709
  "kind": "tool",
@@ -37710,6 +37766,61 @@
37710
37766
  }
37711
37767
  ]
37712
37768
  },
37769
+ {
37770
+ "id": "tool.document",
37771
+ "kind": "tool",
37772
+ "title": "Document",
37773
+ "summary": "document is a directly callable Omnius tool.",
37774
+ "aliases": [
37775
+ "document"
37776
+ ],
37777
+ "keywords": [
37778
+ "tool",
37779
+ "document"
37780
+ ],
37781
+ "maturity": "stable",
37782
+ "layer": "execution",
37783
+ "audiences": [
37784
+ "coding-agent",
37785
+ "integrator",
37786
+ "service-agent"
37787
+ ],
37788
+ "use_when": [
37789
+ "The caller needs this isolated operation and live metadata confirms direct-call availability"
37790
+ ],
37791
+ "avoid_when": [
37792
+ "The live registry reports the tool unavailable or the caller lacks its required scope"
37793
+ ],
37794
+ "interfaces": [
37795
+ {
37796
+ "type": "rest-schema",
37797
+ "target": "/v1/tools/document"
37798
+ },
37799
+ {
37800
+ "type": "rest-call",
37801
+ "target": "/v1/tools/document/call"
37802
+ }
37803
+ ],
37804
+ "references": [
37805
+ {
37806
+ "type": "source",
37807
+ "target": "packages/execution/src/tools/document.ts",
37808
+ "relation": "implementation"
37809
+ }
37810
+ ],
37811
+ "direct_callable": true,
37812
+ "live_metadata": "GET /v1/tools/document",
37813
+ "source_of_truth": [
37814
+ "packages/execution/src/tools/document.ts",
37815
+ "GET /v1/tools/document"
37816
+ ],
37817
+ "verification": [
37818
+ {
37819
+ "check": "Inspect GET /v1/tools/document before use",
37820
+ "expected": "Schema, security, exposure, and availability match the intended invocation"
37821
+ }
37822
+ ]
37823
+ },
37713
37824
  {
37714
37825
  "id": "tool.embedding-store",
37715
37826
  "kind": "tool",
@@ -41445,6 +41556,63 @@
41445
41556
  }
41446
41557
  ]
41447
41558
  },
41559
+ {
41560
+ "id": "tool.safe-image-edit",
41561
+ "kind": "tool",
41562
+ "title": "Safe Image Edit",
41563
+ "summary": "safe_image_edit is a directly callable Omnius tool.",
41564
+ "aliases": [
41565
+ "safe_image_edit"
41566
+ ],
41567
+ "keywords": [
41568
+ "tool",
41569
+ "safe",
41570
+ "image",
41571
+ "edit"
41572
+ ],
41573
+ "maturity": "stable",
41574
+ "layer": "execution",
41575
+ "audiences": [
41576
+ "coding-agent",
41577
+ "integrator",
41578
+ "service-agent"
41579
+ ],
41580
+ "use_when": [
41581
+ "The caller needs this isolated operation and live metadata confirms direct-call availability"
41582
+ ],
41583
+ "avoid_when": [
41584
+ "The live registry reports the tool unavailable or the caller lacks its required scope"
41585
+ ],
41586
+ "interfaces": [
41587
+ {
41588
+ "type": "rest-schema",
41589
+ "target": "/v1/tools/safe_image_edit"
41590
+ },
41591
+ {
41592
+ "type": "rest-call",
41593
+ "target": "/v1/tools/safe_image_edit/call"
41594
+ }
41595
+ ],
41596
+ "references": [
41597
+ {
41598
+ "type": "source",
41599
+ "target": "packages/execution/src/tools/safe-image-edit.ts",
41600
+ "relation": "implementation"
41601
+ }
41602
+ ],
41603
+ "direct_callable": true,
41604
+ "live_metadata": "GET /v1/tools/safe_image_edit",
41605
+ "source_of_truth": [
41606
+ "packages/execution/src/tools/safe-image-edit.ts",
41607
+ "GET /v1/tools/safe_image_edit"
41608
+ ],
41609
+ "verification": [
41610
+ {
41611
+ "check": "Inspect GET /v1/tools/safe_image_edit before use",
41612
+ "expected": "Schema, security, exposure, and availability match the intended invocation"
41613
+ }
41614
+ ]
41615
+ },
41448
41616
  {
41449
41617
  "id": "tool.safe-python",
41450
41618
  "kind": "tool",
package/docs/DISCOVERY.md CHANGED
@@ -657,6 +657,7 @@ Daemon equivalents are `GET /v1/discovery/bootstrap`, `GET /v1/discovery?q=<inte
657
657
  | `tool.asr-listen` | Asr Listen | asr_listen is a directly callable Omnius tool. |
658
658
  | `tool.audio-analyze` | Audio Analyze | audio_analyze is a directly callable Omnius tool. |
659
659
  | `tool.audio-capture` | Audio Capture | audio_capture is a directly callable Omnius tool. |
660
+ | `tool.audio-edit` | Audio Edit | audio_edit is a directly callable Omnius tool. |
660
661
  | `tool.audio-playback` | Audio Playback | audio_playback is a directly callable Omnius tool. |
661
662
  | `tool.autoresearch` | Autoresearch | autoresearch is a directly callable Omnius tool. |
662
663
  | `tool.av-comprehend` | Av Comprehend | av_comprehend is a directly callable Omnius tool. |
@@ -676,6 +677,7 @@ Daemon equivalents are `GET /v1/discovery/bootstrap`, `GET /v1/discovery?q=<inte
676
677
  | `tool.desktop-click` | Desktop Click | desktop_click is a directly callable Omnius tool. |
677
678
  | `tool.desktop-describe` | Desktop Describe | desktop_describe is a directly callable Omnius tool. |
678
679
  | `tool.diagnostic` | Diagnostic | diagnostic is a directly callable Omnius tool. |
680
+ | `tool.document` | Document | document is a directly callable Omnius tool. |
679
681
  | `tool.embedding-store` | Embedding Store | embedding_store is a directly callable Omnius tool. |
680
682
  | `tool.enter-worktree` | Enter Worktree | enter_worktree is a directly callable Omnius tool. |
681
683
  | `tool.exit-worktree` | Exit Worktree | exit_worktree is a directly callable Omnius tool. |
@@ -742,6 +744,7 @@ Daemon equivalents are `GET /v1/discovery/bootstrap`, `GET /v1/discovery?q=<inte
742
744
  | `tool.repl-exec` | Repl Exec | repl_exec is a directly callable Omnius tool. |
743
745
  | `tool.replay-with-intervention` | Replay With Intervention | replay_with_intervention is a directly callable Omnius tool. |
744
746
  | `tool.repo-map` | Repo Map | repo_map is a directly callable Omnius tool. |
747
+ | `tool.safe-image-edit` | Safe Image Edit | safe_image_edit is a directly callable Omnius tool. |
745
748
  | `tool.safe-python` | Safe Python | safe_python is a directly callable Omnius tool. |
746
749
  | `tool.scheduler` | Scheduler | scheduler is a directly callable Omnius tool. |
747
750
  | `tool.screenshot` | Screenshot | screenshot is a directly callable Omnius tool. |
@@ -29,7 +29,7 @@ The Telegram bridge is a scoped public ingress and egress layer. It supports adm
29
29
  | Public group | scoped public intake | only if Telegram grants send rights | creative/public policy | group plus sender |
30
30
  | No send rights | observed incoming messages only | no | no outbound retry loop | failure noted for that chat |
31
31
 
32
- If Telegram returns a send failure, store the raw failed tool output in the conversation trajectory. The agent should reason from the observed failure and avoid repeated sends to a chat where it lacks rights.
32
+ If Telegram returns a permanent write refusal, the bridge opens a durable read-only circuit for that chat. Later messages still enter scoped history, but they do not start reply inference. A time-gated `getChatMember` permission check must confirm restored text-write capability before reply inference resumes.
33
33
 
34
34
  ## Scope Model
35
35
 
@@ -64,7 +64,11 @@ Preference writes require an explicit tool decision. They are not selected by re
64
64
 
65
65
  ## Failure Feedback
66
66
 
67
- Telegram platform and tool failures should be passed back to the agent loop as raw observed output. Do not hardcode behavior around a specific Telegram error string. The model should see the observed failure and choose a corrected action.
67
+ Telegram platform and tool failures remain raw trajectory evidence when the model can choose a corrected action. Permanent transport capability failures are different. The host must stop work that cannot be delivered.
68
+
69
+ The write-capability circuit classifies only caught `Error` objects and structured Bot API responses. It never scans participant text. `CHAT_WRITE_FORBIDDEN`, bot removal/blocking, missing send rights, and an unavailable chat open the chat-scoped circuit. A closed topic opens a topic-scoped circuit. These checks establish transport capability only; they do not classify conversational intent or decide whether a message deserves a reply.
70
+
71
+ Typing begins only after the relationship router returns a valid, input-bound `should_reply=true` decision. If the first typing action returns a permanent write refusal, Omnius does not retry without the topic, does not start a heartbeat, and does not generate the reply. Later read-only intake does not invoke the attention router.
68
72
 
69
73
  Failure feedback should include:
70
74
 
@@ -74,7 +78,47 @@ Failure feedback should include:
74
78
  - whether the failure happened before or after content generation
75
79
  - current chat/user preference scope
76
80
 
77
- The feedback is ordinary trajectory evidence. It should not be converted into reward hacks, hidden classifiers, or error-specific branches.
81
+ Other feedback is ordinary trajectory evidence. It should not be converted into reward hacks or hidden conversational classifiers.
82
+
83
+ ## Scheduled Reminders
84
+
85
+ Telegram reminders have two explicit outcomes:
86
+
87
+ - `person_notification` stores text and sends that text to the scoped person or chat when due.
88
+ - `agent_action` stores a task description, starts a new tool-capable run when due, and lets the host deliver the verified final result to the stored Telegram scope.
89
+
90
+ The legacy names `minimal` and `action` remain accepted for existing data. The
91
+ model must select the outcome from the requested future effect. “Remind me to
92
+ read the news at 09:00” is a person notification. “Get the news on topic X,
93
+ validate it, summarize it, and send it every morning at 9” is an agent action
94
+ with `repeat="daily"`, `time="09:00"`, and a complete `task_description`.
95
+
96
+ The scheduler claims each occurrence with a durable lease. It renews the lease
97
+ while the action runs. It increments `triggerCount` and advances recurrence only
98
+ after verified task completion and a target delivery receipt. A crash, incomplete
99
+ run, unavailable bridge, or failed send retains the occurrence and records
100
+ bounded exponential backoff. The host owns result delivery. An action task must
101
+ not send a second copy or create another reminder as a delivery workaround.
102
+
103
+ ## Latency Adaptation
104
+
105
+ Telegram measures the full interval from intake receipt to a durable delivery receipt. Each chat/model pair starts with the full profile. A turn beyond the hard latency limit trials one leaner profile on the next real turn. Omnius does not issue duplicate inference to race profiles.
106
+
107
+ The normal router is a dependent decision cascade. Its first frame emits only route, reply authorization, actor role, reply basis, and cited evidence. A chat decision can proceed immediately. An action decision expands inside the task runner, where mission, effects, verification, and delivery are tracked. Durable peer-output classification is exposed only when the host packet contains repeated same-actor bot evidence. A strict retry uses the same small authorization frame and cannot create preferences, pattern memory, stimulation state, or expected-outcome side decisions.
108
+
109
+ This keeps ordinary human chat replies within a 320-token router ceiling. The 420-token recovery ceiling exists only for an invalid core contract. The larger contract is reserved for the evidence-gated repeated peer-output branch. More output capacity does not force generation, but the common path does not expose fields that the model does not need.
110
+
111
+ The full, balanced, and lean profiles preserve the typed relationship decision, action routing, evidence checks, and final Telegram receipt. Leaner chat profiles reduce optional context duplication and output ceilings. A failed typed contract or delivery receipt immediately returns the session to a richer profile. A leaner profile remains selected only after enough receipt-valid samples show no material quality-rate loss and at least a 10 percent median latency improvement.
112
+
113
+ Tuneables:
114
+
115
+ | Variable | Default | Purpose |
116
+ | --- | ---: | --- |
117
+ | `OMNIUS_TG_LATENCY_TARGET_MS` | `30000` | Desired end-to-end Telegram reply time |
118
+ | `OMNIUS_TG_LATENCY_HARD_MS` | `60000` | Latency that trials the next leaner profile |
119
+ | `OMNIUS_TG_LATENCY_MIN_SAMPLES` | `3` | Valid samples required before retaining a challenger |
120
+ | `OMNIUS_TG_LATENCY_SAMPLE_WINDOW` | `24` | Per-profile rolling comparison window |
121
+ | `OMNIUS_TG_WRITE_CAPABILITY_RECHECK_MS` | `300000` | Minimum interval between read-only permission probes |
78
122
 
79
123
  ## Public Creative Tools
80
124
 
@@ -86,6 +130,39 @@ Public users can create files, images, and audio through scoped creative workspa
86
130
 
87
131
  These tools should not grant arbitrary filesystem access.
88
132
 
133
+ Every public artifact is retained as an encrypted per-chat object and bound to
134
+ a host-signed capability containing its logical path, byte length, content
135
+ hash, detected MIME type, source tool, expiry, delivery allowance, and review
136
+ receipts. The model cannot mint that capability. Telegram delivery verifies
137
+ the decrypted bytes against it and uses a durable, idempotent delivery job with
138
+ a lease, bounded backoff, and the returned Telegram message ID.
139
+
140
+ ### Scoped create, edit, review, deliver loop
141
+
142
+ | Artifact | Typed tool | Supported work | Required review before delivery |
143
+ | --- | --- | --- | --- |
144
+ | Raster image | `safe_image_edit` | inspect, crop, resize, upscale/downscale, mask, composite, combine, convert | `telegram_image_analyze detail='full'` on the exact output |
145
+ | Audio | `audio_edit` | inspect, trim, concatenate, typed splice and silence, mix, normalize, fade, convert, resample | `audio_analyze` for sound/music or `transcribe_file` for speech |
146
+ | PDF or DOCX | `document` | create from heading/paragraph/bullet/page-break blocks, inspect, hash-guarded revise | `document action='inspect'` on the exact output |
147
+
148
+ These tools do not accept shell commands, raw FFmpeg filters, ImageMagick
149
+ expressions, raw PDF/OOXML bytes, HTML, macros, or paths outside the chat
150
+ workspace. Image and audio edits never overwrite an artifact. Document
151
+ revision requires `overwrite=true` and the `expected_hash` from the latest
152
+ receipt. A changed output receives a new content hash, so old review evidence
153
+ cannot authorize delivery of new bytes.
154
+
155
+ The image tool uses fixed ImageMagick argument vectors. The audio tool uses
156
+ fixed FFmpeg and FFprobe argument vectors. Both require those host programs to
157
+ be installed. The dependency-free document tool creates real PDF 1.4 and
158
+ OOXML DOCX files. PDF text uses the built-in WinAnsi font set; use DOCX for
159
+ full Unicode. DOCX pagination is explicitly reported as an estimate.
160
+
161
+ The agent must inspect the returned receipt, compare the reviewed evidence to
162
+ the user request, and create another output when the evidence exposes a gap.
163
+ Automatic attachment waits for the matching signed review receipt. Public
164
+ edits also use a separate per-user, per-chat hourly quota.
165
+
89
166
  ## Media Intake
90
167
 
91
168
  Photos, documents, audio, video, and voice messages use a two-stage intake:
@@ -127,4 +204,4 @@ Acquired public media remains blocked from delivery and `task_complete` until re
127
204
 
128
205
  ## Verification
129
206
 
130
- Relevant focused tests include `telegram-media-admission.test.ts`, `telegram-media-cache.test.ts`, `telegram-media-evidence.test.ts`, `telegram-public-media.test.ts`, `telegram-creative-tools.test.ts`, Telegram delivery preferences, inference error suppression, reflection corpus, and Bot API compatibility tests.
207
+ Relevant focused tests include `telegram-media-admission.test.ts`, `telegram-media-cache.test.ts`, `telegram-media-evidence.test.ts`, `telegram-public-media.test.ts`, `telegram-artifact-ledger.test.ts`, `telegram-creative-tools.test.ts`, `safe-image-edit.test.ts`, `audio-edit.test.ts`, `document.test.ts`, Telegram delivery preferences, inference error suppression, reflection corpus, and Bot API compatibility tests.
@@ -18,6 +18,11 @@ Configuration is layered from environment, global user settings, project setting
18
18
  | `OMNIUS_DAEMON` | Start in daemon mode when set to `1` |
19
19
  | `OMNIUS_FORCE_NO_THINK` | Force `think: false` for Qwen-style backends |
20
20
  | `OMNIUS_THINK_AUTO` | Enable opt-in automatic thinking mode trigger |
21
+ | `OMNIUS_TG_LATENCY_TARGET_MS` | Desired end-to-end Telegram reply time (default `30000`) |
22
+ | `OMNIUS_TG_LATENCY_HARD_MS` | Trial a leaner Telegram chat profile after this total latency (default `60000`) |
23
+ | `OMNIUS_TG_LATENCY_MIN_SAMPLES` | Receipt-valid samples required to retain a leaner profile (default `3`) |
24
+ | `OMNIUS_TG_LATENCY_SAMPLE_WINDOW` | Per-profile rolling Telegram latency sample count (default `24`) |
25
+ | `OMNIUS_TG_WRITE_CAPABILITY_RECHECK_MS` | Minimum read-only Telegram permission-probe interval (default `300000`, minimum `15000`) |
21
26
  | `OMNIUS_ASR_CUDA_VISIBLE_DEVICES` | Exact CUDA GPU index or UUID used for managed ASR activation; multi-device masks are rejected (Jetson's integrated GPU is `0`) |
22
27
  | `OMNIUS_VIBEVOICE_PYTHON` | Host Python used to create the VibeVoice venv; its CUDA-enabled Torch is inherited with `--system-site-packages` |
23
28
  | `OMNIUS_VIBEVOICE_ATTN` | VibeVoice attention implementation (`sdpa` by default; use a host-supported implementation) |
@@ -1093,8 +1093,8 @@ List scoped TUI reminders
1093
1093
  Signatures:
1094
1094
 
1095
1095
  - `/reminder [list\|all]` - List scoped TUI reminders
1096
- - `/remind &lt;when&gt; &lt;message&gt;` - Set a scoped minimal reminder; a due time is required
1097
- - `/remind in 30m &lt;message&gt;` - Set a scoped minimal reminder with a relative due time
1096
+ - `/remind &lt;when&gt; &lt;message&gt;` - Set a scoped person notification; a due time is required
1097
+ - `/remind in 30m &lt;message&gt;` - Set a scoped person notification with a relative due time
1098
1098
  - `/reminders` - Alias for /reminder
1099
1099
 
1100
1100
  ### /scheduler
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "omnius",
3
- "version": "1.0.680",
3
+ "version": "1.0.682",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "omnius",
9
- "version": "1.0.680",
9
+ "version": "1.0.682",
10
10
  "bundleDependencies": [
11
11
  "image-to-ascii"
12
12
  ],