ava-engine 0.0.0-stage → 0.2.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.
- package/.env.example +63 -0
- package/CLA.md +43 -0
- package/COMMERCIAL-LICENSE.md +43 -0
- package/LICENSE +73 -0
- package/README.md +240 -2
- package/THIRD_PARTY_NOTICES.md +38 -0
- package/TRADEMARKS.md +31 -0
- package/bin/ava-engine.mjs +12 -0
- package/lib/asr.mjs +147 -0
- package/lib/cli/apply.mjs +58 -0
- package/lib/cli/config.mjs +95 -0
- package/lib/cli/main.mjs +187 -0
- package/lib/cli/setup-server.mjs +195 -0
- package/lib/cli/setup.mjs +233 -0
- package/lib/fetch-models.mjs +104 -0
- package/lib/guard.mjs +92 -0
- package/lib/kokoro-model.mjs +51 -0
- package/lib/models.mjs +47 -0
- package/lib/openrouter.mjs +153 -0
- package/lib/ours.mjs +766 -0
- package/lib/platforms.mjs +201 -0
- package/lib/state.mjs +150 -0
- package/lib/stt.mjs +22 -0
- package/lib/tts.mjs +178 -0
- package/lib/workflow.mjs +18 -0
- package/package.json +80 -4
- package/public/app.js +1708 -0
- package/public/demo.js +420 -0
- package/public/favicon.svg +1 -0
- package/public/fonts/OFL.txt +96 -0
- package/public/fonts/inter-tight-var.woff2 +0 -0
- package/public/fonts/inter-var.woff2 +0 -0
- package/public/fonts/plex-mono-400.woff2 +0 -0
- package/public/fonts/plex-mono-500.woff2 +0 -0
- package/public/img/cta-1600.avif +0 -0
- package/public/img/cta-1600.webp +0 -0
- package/public/img/cta-2400.avif +0 -0
- package/public/img/cta-2400.webp +0 -0
- package/public/img/cta-960.avif +0 -0
- package/public/img/cta-960.webp +0 -0
- package/public/img/flows-1600.avif +0 -0
- package/public/img/flows-1600.webp +0 -0
- package/public/img/flows-2400.avif +0 -0
- package/public/img/flows-2400.webp +0 -0
- package/public/img/flows-960.avif +0 -0
- package/public/img/flows-960.webp +0 -0
- package/public/img/hero-1600.avif +0 -0
- package/public/img/hero-1600.webp +0 -0
- package/public/img/hero-2400.avif +0 -0
- package/public/img/hero-2400.webp +0 -0
- package/public/img/hero-960.avif +0 -0
- package/public/img/hero-960.webp +0 -0
- package/public/img/p-csm-480.avif +0 -0
- package/public/img/p-csm-480.webp +0 -0
- package/public/img/p-csm-800.avif +0 -0
- package/public/img/p-csm-800.webp +0 -0
- package/public/img/p-docs-480.avif +0 -0
- package/public/img/p-docs-480.webp +0 -0
- package/public/img/p-docs-800.avif +0 -0
- package/public/img/p-docs-800.webp +0 -0
- package/public/img/p-quiet-480.avif +0 -0
- package/public/img/p-quiet-480.webp +0 -0
- package/public/img/p-quiet-800.avif +0 -0
- package/public/img/p-quiet-800.webp +0 -0
- package/public/img/p-tickets-480.avif +0 -0
- package/public/img/p-tickets-480.webp +0 -0
- package/public/img/p-tickets-800.avif +0 -0
- package/public/img/p-tickets-800.webp +0 -0
- package/public/img/p-trial-480.avif +0 -0
- package/public/img/p-trial-480.webp +0 -0
- package/public/img/p-trial-800.avif +0 -0
- package/public/img/p-trial-800.webp +0 -0
- package/public/img/sees-1600.avif +0 -0
- package/public/img/sees-1600.webp +0 -0
- package/public/img/sees-2400.avif +0 -0
- package/public/img/sees-2400.webp +0 -0
- package/public/img/sees-960.avif +0 -0
- package/public/img/sees-960.webp +0 -0
- package/public/img/speaks-1600.avif +0 -0
- package/public/img/speaks-1600.webp +0 -0
- package/public/img/speaks-2400.avif +0 -0
- package/public/img/speaks-2400.webp +0 -0
- package/public/img/speaks-960.avif +0 -0
- package/public/img/speaks-960.webp +0 -0
- package/public/img/voice-1600.avif +0 -0
- package/public/img/voice-1600.webp +0 -0
- package/public/img/voice-2400.avif +0 -0
- package/public/img/voice-2400.webp +0 -0
- package/public/img/voice-960.avif +0 -0
- package/public/img/voice-960.webp +0 -0
- package/public/index.html +440 -0
- package/public/landing.html +975 -0
- package/public/pcm-worklet.js +11 -0
- package/public/perceptionWorker.js +103 -0
- package/public/rtc.js +60 -0
- package/public/setup.css +94 -0
- package/public/setup.html +129 -0
- package/public/setup.js +264 -0
- package/public/specialist.html +92 -0
- package/public/specialist.js +132 -0
- package/public/style.css +836 -0
- package/public/vendor/lenis.min.js +3 -0
- package/scripts/fetch-models.sh +15 -0
- package/server.mjs +502 -0
package/.env.example
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# ── Ava · environment ─────────────────────────────────────────────────────────
|
|
2
|
+
# Copy to .env. Only OPENROUTER_API_KEY is needed for live replies; everything
|
|
3
|
+
# else has a sensible default (see lib/models.mjs and lib/tts.mjs).
|
|
4
|
+
|
|
5
|
+
# OpenRouter — https://openrouter.ai/keys (empty = MOCK mode: synthetic replies)
|
|
6
|
+
OPENROUTER_API_KEY=
|
|
7
|
+
|
|
8
|
+
# Server
|
|
9
|
+
PORT=5190
|
|
10
|
+
# HOST=127.0.0.1 # only this computer can connect (default: all interfaces)
|
|
11
|
+
|
|
12
|
+
# ── Access & spend limits ──
|
|
13
|
+
# Every call spends YOUR model/voice credit. Before the server is reachable by
|
|
14
|
+
# anyone else, set a password: the app, specialist console, API and WebSockets
|
|
15
|
+
# then require it (the landing page stays public).
|
|
16
|
+
# ACCESS_PASSWORD=
|
|
17
|
+
# TRUST_PROXY=1 # behind Fly/Cloudflare/nginx: rate-limit by the real client IP
|
|
18
|
+
# SESSION_BUDGET_USD=2 # model spend cap per call
|
|
19
|
+
# MAX_SESSIONS=50 # concurrent calls (idle ones expire after 30 min)
|
|
20
|
+
# MAX_ASR_CONNECTIONS=40 # concurrent speech-to-text streams
|
|
21
|
+
# RATE_SESSIONS_PER_MIN=10 # new calls per client IP per minute
|
|
22
|
+
# RATE_API_PER_MIN=240 # other API requests per client IP per minute
|
|
23
|
+
|
|
24
|
+
# ── Models (OpenRouter slugs) — one per role ──
|
|
25
|
+
# MODEL_TALKER=meta-llama/llama-3.3-70b-instruct # the spoken reply (latency-critical)
|
|
26
|
+
# MODEL_PERCEPTION=google/gemini-2.5-flash # reads the shared screen
|
|
27
|
+
# MODEL_INTENT=google/gemini-2.5-flash-lite # intent, reasoning, workflow checks
|
|
28
|
+
# MODEL_PLANNER=anthropic/claude-sonnet-4.5 # goal + plan, async
|
|
29
|
+
|
|
30
|
+
# Provider routing for latency-critical roles ("auto" = let OpenRouter pick)
|
|
31
|
+
# TALKER_PROVIDER=groq
|
|
32
|
+
# PERCEPTION_PROVIDER=
|
|
33
|
+
|
|
34
|
+
# Max wait (ms) for a fresh screen read on a turn
|
|
35
|
+
# PERCEIVE_BUDGET_MS=2800
|
|
36
|
+
|
|
37
|
+
# Optional app attribution shown on openrouter.ai
|
|
38
|
+
# OPENROUTER_REFERER=https://your-site.example
|
|
39
|
+
# OPENROUTER_TITLE=Ava
|
|
40
|
+
|
|
41
|
+
# ── Voice (text-to-speech) ──
|
|
42
|
+
# TTS_DEFAULT=elevenlabs # elevenlabs | kokoro | hume | browser
|
|
43
|
+
# ELEVENLABS_API_KEY=
|
|
44
|
+
# ELEVEN_VOICE_ID=
|
|
45
|
+
# ELEVEN_MODEL=eleven_turbo_v2_5
|
|
46
|
+
# ELEVEN_LABEL=
|
|
47
|
+
# KOKORO=off # offline Kokoro TTS is on by default
|
|
48
|
+
# KOKORO_VOICE=af_heart
|
|
49
|
+
# KOKORO_MODEL=onnx-community/Kokoro-82M-v1.0-ONNX
|
|
50
|
+
# KOKORO_DTYPE=q8
|
|
51
|
+
# KOKORO_MAX_QUEUE=6 # pending local syntheses before new ones get a 429
|
|
52
|
+
# HUME_API_KEY=
|
|
53
|
+
# HUME_VOICE_ID=
|
|
54
|
+
# HUME_LABEL=
|
|
55
|
+
# HUME_DESCRIPTION=
|
|
56
|
+
|
|
57
|
+
# ── Speech-to-text ──
|
|
58
|
+
# Offline sherpa-onnx models live in ./models (see Dockerfile / README).
|
|
59
|
+
# SHERPA_MODEL_DIR= # override the streaming zipformer directory
|
|
60
|
+
# SENSEVOICE_LANG=en
|
|
61
|
+
# Optional cloud fallback when the offline models aren't installed:
|
|
62
|
+
# DEEPGRAM_API_KEY=
|
|
63
|
+
# DEEPGRAM_MODEL=nova-3
|
package/CLA.md
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Ava Engine Individual Contributor License Agreement
|
|
2
|
+
|
|
3
|
+
Thank you for contributing to Ava Engine (the "Project"), which is owned by Irvan (the "Owner"). The Project is offered under the Ava Engine License and also under paid commercial licenses. This agreement lets the Owner keep offering both. You keep the copyright in your own contributions.
|
|
4
|
+
|
|
5
|
+
By commenting on a pull request that you agree, or by signing it through the Project's CLA bot, you ("You") accept the following terms for every Contribution You submit to the Project, now or in the future.
|
|
6
|
+
|
|
7
|
+
## 1. Definitions
|
|
8
|
+
|
|
9
|
+
**"Contribution"** means any work of authorship, including code, documentation, designs, translations and other material, that You intentionally submit to the Project, for example through a pull request, a patch, an issue or a comment.
|
|
10
|
+
|
|
11
|
+
## 2. Copyright license
|
|
12
|
+
|
|
13
|
+
You grant the Owner, and recipients of software distributed by the Owner, a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute, sublicense and **relicense** Your Contributions and derivative works of them, under **any license terms, including proprietary and commercial terms**.
|
|
14
|
+
|
|
15
|
+
## 3. Patent license
|
|
16
|
+
|
|
17
|
+
You grant the Owner, and recipients of software distributed by the Owner, a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable patent license to make, have made, use, sell, offer to sell, import and otherwise transfer Your Contributions, where such license applies only to patent claims You can license that are necessarily infringed by Your Contributions alone or in combination with the Project.
|
|
18
|
+
|
|
19
|
+
## 4. Your representations
|
|
20
|
+
|
|
21
|
+
You represent that:
|
|
22
|
+
|
|
23
|
+
1. each Contribution is Your original work, or You have the right to submit it under this agreement, and You identify any third-party material and its license when You submit it;
|
|
24
|
+
2. You are legally entitled to grant these licenses. If Your employer has rights to work You create, You have received permission to make the Contribution on its behalf, or Your employer has waived those rights; and
|
|
25
|
+
3. to Your knowledge, no Contribution infringes anyone else's rights.
|
|
26
|
+
|
|
27
|
+
## 5. No obligation
|
|
28
|
+
|
|
29
|
+
The Owner may use Your Contributions, change them, or not use them at all. Nothing in this agreement obliges the Owner to include them in the Project or to pay You.
|
|
30
|
+
|
|
31
|
+
## 6. No warranty
|
|
32
|
+
|
|
33
|
+
Unless required by law or agreed in writing, You provide Your Contributions "as is", without warranties or conditions of any kind.
|
|
34
|
+
|
|
35
|
+
## 7. Transfer
|
|
36
|
+
|
|
37
|
+
The Owner may assign this agreement, and the licenses You grant in it, to a successor or buyer of the Project.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
To sign, comment on your pull request:
|
|
42
|
+
|
|
43
|
+
> I have read the CLA Document and I hereby sign the CLA
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Licensing Ava Engine
|
|
2
|
+
|
|
3
|
+
Ava Engine is **source-available** under the [Ava Engine License](LICENSE). Build your business on it: run it, change it, put your brand on your product and charge for it. Just don't resell or republish the engine itself as your own.
|
|
4
|
+
|
|
5
|
+
## ✅ Free, including for companies
|
|
6
|
+
|
|
7
|
+
- Running Ava in your business, for your own team or for your customers
|
|
8
|
+
- Building a **paid product or SaaS** on Ava under **your own brand**
|
|
9
|
+
- Changing the code however you need
|
|
10
|
+
- Deploying Ava for your clients
|
|
11
|
+
- Forking it to contribute back or to make your own changes
|
|
12
|
+
|
|
13
|
+
The only requirement: keep the license and copyright notice in the code, and credit **"Built on Ava Engine"** with a link, somewhere your users can find it, such as your docs, an "About" page, a credits page or your legal notices. It doesn't have to be in your main interface. The ready-made [badge and snippets](docs/brand/README.md) make this a one-minute job.
|
|
14
|
+
|
|
15
|
+
## ❌ Needs a commercial license
|
|
16
|
+
|
|
17
|
+
- **Selling or licensing the engine itself**, as source code, a package or a self-hosted product, renamed or not
|
|
18
|
+
- **Publishing a renamed copy** of Ava as a separate engine, framework, SDK, template, boilerplate or starter kit, for free or for a fee
|
|
19
|
+
- **Removing the "Built on Ava Engine" credit** or the copyright notice
|
|
20
|
+
|
|
21
|
+
The test: if what you're offering is *a product or service that uses Ava*, it's free. If what you're offering is *Ava itself*, under any name, it needs a license.
|
|
22
|
+
|
|
23
|
+
## Commercial licenses
|
|
24
|
+
|
|
25
|
+
| License | Price | For |
|
|
26
|
+
| --- | --- | --- |
|
|
27
|
+
| **White-label** | $1,500 one-time | Remove the "Built on Ava Engine" credit from one product |
|
|
28
|
+
| **Support** | $750 / month | Priority email support, upgrade help, security notices |
|
|
29
|
+
| **OEM / redistribution** | from $9,000 / year | Resell or bundle the engine itself, e.g. as part of your platform or for your own customers to self-host |
|
|
30
|
+
| **Setup & integration** | from $3,500 | We set Ava up on your infrastructure, in about 2 weeks |
|
|
31
|
+
|
|
32
|
+
Prices are in USD, and the license agreement governs.
|
|
33
|
+
|
|
34
|
+
## Get a license
|
|
35
|
+
|
|
36
|
+
Message [@Mr-vero on GitHub](https://github.com/Mr-vero) with your company name, your use case and the license you're interested in.
|
|
37
|
+
<!-- TODO: add licensing@YOUR-DOMAIN once the project domain is live -->
|
|
38
|
+
|
|
39
|
+
## Ownership
|
|
40
|
+
|
|
41
|
+
Copyright © 2026 Irvan. Contributions are accepted under the [Contributor License Agreement](CLA.md), so the project can keep offering both the free and the commercial licenses. Names and logos are covered by the [trademark policy](TRADEMARKS.md).
|
|
42
|
+
|
|
43
|
+
*This page summarizes the [license](LICENSE). If they ever differ, the license governs.*
|
package/LICENSE
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
Required Notice: Copyright (c) 2026 Irvan (https://github.com/Mr-vero). Built on Ava Engine.
|
|
2
|
+
|
|
3
|
+
# Ava Engine License 1.0
|
|
4
|
+
|
|
5
|
+
Ava Engine is source-available. You may use it, change it and build businesses with it, including paid products and hosted services. What you may not do, without a commercial license, is resell or republish the engine itself as your own. The terms below are the actual license; COMMERCIAL-LICENSE.md and TRADEMARKS.md explain them in plain words.
|
|
6
|
+
|
|
7
|
+
## 1. Acceptance
|
|
8
|
+
|
|
9
|
+
To get any license under these terms, you must agree to them as both obligations and conditions of your license.
|
|
10
|
+
|
|
11
|
+
## 2. Copyright license
|
|
12
|
+
|
|
13
|
+
The licensor grants you a worldwide, non-exclusive, royalty-free copyright license to use, copy, modify, create derivative works of, and run the software, **for any purpose, including commercial purposes**, subject to the limitations and conditions below.
|
|
14
|
+
|
|
15
|
+
## 3. Products and services you build
|
|
16
|
+
|
|
17
|
+
You may build products and services that use the software, alone or with your own work, and offer them to others for free or for a fee, including:
|
|
18
|
+
|
|
19
|
+
- hosted and software-as-a-service (SaaS) products,
|
|
20
|
+
- products and services under your own brand, and
|
|
21
|
+
- deployments you set up and operate for your clients.
|
|
22
|
+
|
|
23
|
+
Letting people use the software's functionality through a product or service you operate is **not** distribution of the software, and it's permitted.
|
|
24
|
+
|
|
25
|
+
## 4. Limitations
|
|
26
|
+
|
|
27
|
+
Without a separate commercial license from the licensor, you may not:
|
|
28
|
+
|
|
29
|
+
1. **sell, license, sublicense, rent, lease or otherwise provide the software, or a derivative engine, to anyone for a fee or other consideration;**
|
|
30
|
+
2. **make the software, or a derivative engine, available to others, for free or for a fee, as a standalone engine, framework, platform, library, SDK, template, boilerplate, starter kit or self-hosted product, under any name** (except as allowed in section 5); or
|
|
31
|
+
3. **remove, change or hide** this license, the `Required Notice:` line, or the attribution required in section 6, or present the software or a derivative engine as anyone's original work but the licensor's.
|
|
32
|
+
|
|
33
|
+
## 5. Sharing you may do without a commercial license
|
|
34
|
+
|
|
35
|
+
You may give copies of the software, changed or not, free of charge:
|
|
36
|
+
|
|
37
|
+
1. as a public fork or patch kept under this license, with the `Required Notice:` line intact, that says it's based on Ava Engine, and that is meant for contributing back, studying or making your own changes, not promoted as a separate engine or alternative to Ava Engine;
|
|
38
|
+
2. to your employees, contractors and affiliates, so they can work on your products and services; and
|
|
39
|
+
3. to a client you deploy it for, so they can run it for their own business under this license.
|
|
40
|
+
|
|
41
|
+
Anyone who gets a copy from you gets it under this license, and you must give them these terms.
|
|
42
|
+
|
|
43
|
+
## 6. Attribution
|
|
44
|
+
|
|
45
|
+
1. Every copy of the software, or of any part of it, must include this license and the `Required Notice:` line.
|
|
46
|
+
2. Every product or service built on the software must credit it with the words "Built on Ava Engine" and a link to the project, in a place its users can reasonably find, such as the documentation, an "About" page, a credits page or the legal notices. The credit doesn't need to appear in the main interface.
|
|
47
|
+
|
|
48
|
+
## 7. Trademarks
|
|
49
|
+
|
|
50
|
+
This license grants no rights to the names "Ava Engine" or "Ava" (when used for this software), or to the ΛVΛ logo, except for the attribution required in section 6. Your products and forks must use their own names and logos. See TRADEMARKS.md.
|
|
51
|
+
|
|
52
|
+
## 8. Patent license
|
|
53
|
+
|
|
54
|
+
The licensor grants you a patent license for the software, covering patent claims the licensor can license, that you would infringe by using the software as this license allows. If you or your company claim in writing that the software infringes a patent, your patent license ends immediately.
|
|
55
|
+
|
|
56
|
+
## 9. Contributions
|
|
57
|
+
|
|
58
|
+
Contributions to the software are accepted only under the project's Contributor License Agreement (CLA.md).
|
|
59
|
+
|
|
60
|
+
## 10. Violations and termination
|
|
61
|
+
|
|
62
|
+
If you break these terms, your license ends. However, the first time the licensor notifies you in writing of a violation, your license continues if you fully comply within 32 days of the notice and take practical steps to fix past violations.
|
|
63
|
+
|
|
64
|
+
## 11. No warranty or liability
|
|
65
|
+
|
|
66
|
+
As far as the law allows, the software comes as is, without any warranty or condition, and the licensor won't be liable to you for any damages arising from these terms or from the use or nature of the software, under any kind of legal claim.
|
|
67
|
+
|
|
68
|
+
## 12. Definitions
|
|
69
|
+
|
|
70
|
+
- The **licensor** is the copyright holder named in the `Required Notice:` line, and their successors and assignees.
|
|
71
|
+
- The **software** is Ava Engine, the source code and other material the licensor makes available under these terms.
|
|
72
|
+
- A **derivative engine** is any work that contains the software or a substantial part of it, changed or not, whose main purpose is to give others the software's core functionality as software, rather than to be part of a product or service you operate. Renaming, rebranding, restyling or reorganizing the software doesn't stop a work from being a derivative engine.
|
|
73
|
+
- **You** are the individual or entity agreeing to these terms, and **your company** is any organization you work for, together with organizations that control it, are controlled by it, or are under common control with it.
|
package/README.md
CHANGED
|
@@ -1,3 +1,241 @@
|
|
|
1
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="docs/media/logo.svg" alt="Ava" width="72" height="72">
|
|
3
|
+
</p>
|
|
2
4
|
|
|
3
|
-
|
|
5
|
+
<h1 align="center">Ava Engine</h1>
|
|
6
|
+
|
|
7
|
+
<p align="center">
|
|
8
|
+
<b>A source-available, screen-aware voice agent.</b><br>
|
|
9
|
+
Ava joins your customer on a call, sees the tab they share, and talks them through<br>
|
|
10
|
+
onboarding, support and setup, then hands off to a human when it should.
|
|
11
|
+
</p>
|
|
12
|
+
|
|
13
|
+
<p align="center">
|
|
14
|
+
<a href="https://www.npmjs.com/package/ava-engine"><img alt="npm" src="https://img.shields.io/npm/v/ava-engine?color=0A0A0C&label=npm"></a>
|
|
15
|
+
<a href="https://scorecard.dev/viewer/?uri=github.com/Mr-vero/ava-engine"><img alt="OpenSSF Scorecard" src="https://api.scorecard.dev/projects/github.com/Mr-vero/ava-engine/badge"></a>
|
|
16
|
+
<a href="https://github.com/Mr-vero/ava-engine/actions/workflows/ci.yml"><img alt="CI" src="https://github.com/Mr-vero/ava-engine/actions/workflows/ci.yml/badge.svg"></a>
|
|
17
|
+
<a href="COMMERCIAL-LICENSE.md"><img alt="License: Ava Engine License (source-available)" src="https://img.shields.io/badge/license-source--available-0A0A0C"></a>
|
|
18
|
+
<img alt="Node 22.9+" src="https://img.shields.io/badge/node-22.9%2B-4F46E5">
|
|
19
|
+
<img alt="No build step" src="https://img.shields.io/badge/build%20step-none-16A34A">
|
|
20
|
+
<img alt="WCAG 2.1 AA audited" src="https://img.shields.io/badge/WCAG%202.1-AA%20audited-2F6DB0">
|
|
21
|
+
<a href="CONTRIBUTING.md"><img alt="PRs welcome" src="https://img.shields.io/badge/PRs-welcome-E44332"></a>
|
|
22
|
+
</p>
|
|
23
|
+
|
|
24
|
+
<p align="center">
|
|
25
|
+
<a href="#quick-start">Quick start</a> ·
|
|
26
|
+
<a href="#set-it-up">Setup guides</a> ·
|
|
27
|
+
<a href="#how-it-works">How it works</a> ·
|
|
28
|
+
<a href="docs/README.md">Docs</a> ·
|
|
29
|
+
<a href="CONTRIBUTING.md">Contributing</a> ·
|
|
30
|
+
<a href="SECURITY.md">Security</a>
|
|
31
|
+
</p>
|
|
32
|
+
|
|
33
|
+
<p align="center">
|
|
34
|
+
<a href="docs/media/ava-demo.mp4"><img src="docs/media/ava-demo.gif" alt="Demo: Ava guides a new user through onboarding on Basewell, a fictional developer platform: reading the screen, catching an email typo, and ticking off each step" width="100%"></a>
|
|
35
|
+
<br>
|
|
36
|
+
<sub><b>▶ <a href="docs/media/ava-demo.mp4">Watch the full 2-minute demo with sound</a></b>. A real run: live models, Ava's own voice, an onboarding flow with a deliberate typo. The GIF plays at 4× speed.</sub>
|
|
37
|
+
</p>
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Why Ava
|
|
42
|
+
|
|
43
|
+
Docs and chatbots can't see what your customer is looking at, and a call with your team doesn't scale. Ava sits in between. It **sees the screen**, **speaks**, catches mistakes before they cost money, and knows when to bring in a person.
|
|
44
|
+
|
|
45
|
+
- 🎙️ **Real conversation.** Streamed voice that starts speaking in well under a second, and you can interrupt it at any time.
|
|
46
|
+
- 👀 **Grounded in the screen.** Every answer is based on what's actually on the shared tab. If Ava isn't sure, it takes another look.
|
|
47
|
+
- 🧠 **A crew, not one model.** Perception, intent, a talker and a planner run in parallel, and only the reply you hear is on the critical path.
|
|
48
|
+
- 🙋 **Human handoff.** One tap brings a specialist into the same call over WebRTC, with the goal, the screen and the progress already there.
|
|
49
|
+
- 🔓 **Build your business on it.** Run it, rebrand your product and charge for it; just credit "Built on Ava Engine". Plain Node with no framework and no build step, and offline speech in both directions by default.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## Quick start
|
|
54
|
+
|
|
55
|
+
Requires **Node 22.9+** and desktop **Chrome**. One command installs Ava and walks you through setup:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
npx ava-engine
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Set up **in your browser** (a step-by-step page) or **in the terminal**; both do the same:
|
|
62
|
+
1. check your OpenRouter key (or look around with no keys, in MOCK mode);
|
|
63
|
+
2. pick Ava's voice, and download the free offline voice (Kokoro, ~90 MB) with progress;
|
|
64
|
+
3. download offline speech recognition, also with progress;
|
|
65
|
+
4. protect Ava with a password if other people will use it;
|
|
66
|
+
5. start Ava and open **http://localhost:5190/app**.
|
|
67
|
+
|
|
68
|
+
After that, `npx ava-engine` just starts Ava.
|
|
69
|
+
|
|
70
|
+
| Command | What it does |
|
|
71
|
+
| --- | --- |
|
|
72
|
+
| `npx ava-engine setup` | Re-run setup to change keys, voice, password or port (`--web` for the browser, `--terminal` for here) |
|
|
73
|
+
| `npx ava-engine doctor` | Check everything and get a fix for anything that's wrong |
|
|
74
|
+
| `npx ava-engine models` | Download speech models or the Kokoro voice (`models kokoro`) |
|
|
75
|
+
| `npx ava-engine start --port 8080` | Start on another port |
|
|
76
|
+
|
|
77
|
+
Settings live in `~/.ava-engine` (set `AVA_HOME` to move them). **Watch the demo locally** at `http://localhost:5190/app?demo=simple`.
|
|
78
|
+
|
|
79
|
+
**On a server:** `npx ava-engine setup --web` works over SSH too. Forward the port (`ssh -L 5190:localhost:5190 your-server`) and open the link it prints. Or skip the questions: `OPENROUTER_API_KEY=… ACCESS_PASSWORD=… npx ava-engine setup --yes --models english-small,kokoro`. There's also a Docker image; see [DEPLOY.md](DEPLOY.md).
|
|
80
|
+
|
|
81
|
+
<details>
|
|
82
|
+
<summary><b>Working on Ava itself? Run from source</b></summary>
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
git clone https://github.com/Mr-vero/ava-engine.git && cd ava-engine
|
|
86
|
+
npm install
|
|
87
|
+
cp .env.example .env # add OPENROUTER_API_KEY, or leave it empty for MOCK mode
|
|
88
|
+
./scripts/fetch-models.sh # optional: offline speech-to-text
|
|
89
|
+
npm run dev # → http://localhost:5190/app
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
93
|
+
</details>
|
|
94
|
+
|
|
95
|
+
> ⚠️ **Every call spends your API credit.** If anyone else can reach your server, choose "My team or customers" in setup to get a password. See [SECURITY.md](SECURITY.md).
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Set it up
|
|
100
|
+
|
|
101
|
+
| | Guide | You'll set |
|
|
102
|
+
| --- | --- | --- |
|
|
103
|
+
| 🧠 | [**Language models**](docs/setup/llm.md) | `OPENROUTER_API_KEY`, which model plays each role, latency and cost |
|
|
104
|
+
| 🔊 | [**Voice**](docs/setup/voice.md) | Kokoro (free, offline, the default), ElevenLabs or Hume |
|
|
105
|
+
| 🎧 | [**Speech-to-text**](docs/setup/speech-to-text.md) | Offline sherpa-onnx models, English or multilingual |
|
|
106
|
+
| 🧩 | [**Customizing**](docs/setup/customize.md) | Products in the onboarding catalogue, persona, look |
|
|
107
|
+
| 🚀 | [**Deploying**](DEPLOY.md) | A Cloudflare tunnel, Fly.io or any Docker host |
|
|
108
|
+
| 📚 | [**Reference**](docs/REFERENCE.md) | Every route, file and setting |
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## A tour
|
|
113
|
+
|
|
114
|
+
<p align="center">
|
|
115
|
+
<img src="docs/screenshots/app-call.webp" alt="A live call: Ava's orb tile, the customer tile, a live caption and the transcript rail" width="100%">
|
|
116
|
+
</p>
|
|
117
|
+
|
|
118
|
+
| Start a session | Joining |
|
|
119
|
+
| --- | --- |
|
|
120
|
+
| <img src="docs/screenshots/app-lobby.webp" alt="Lobby: photo panel on the left, session setup on the right"> | <img src="docs/screenshots/app-connecting.webp" alt="Connecting pre-roll: dark stage, glowing orb, voice ribbon and three step bars"> |
|
|
121
|
+
| **Onboarding mode (Todoist), with the live step tracker** | **Console: latency, crew, compiled context and spend** |
|
|
122
|
+
| <img src="docs/screenshots/app-onboarding-call.webp" alt="Onboarding call themed to the platform, with the step tracker on the left"> | <img src="docs/screenshots/app-console.webp" alt="Call with the console drawer open"> |
|
|
123
|
+
| **Session recap and agent replay** | **Pick a platform to onboard** |
|
|
124
|
+
| <img src="docs/screenshots/app-recap.webp" alt="Session recap: summary, stats, agent flow and timestamped timeline"> | <img src="docs/screenshots/app-lobby-onboarding.webp" alt="Lobby with onboarding mode and platform picker"> |
|
|
125
|
+
|
|
126
|
+
<details>
|
|
127
|
+
<summary><b>On phones, and the landing page</b></summary>
|
|
128
|
+
|
|
129
|
+
<p align="center">
|
|
130
|
+
<img src="docs/screenshots/mobile.webp" alt="Landing, lobby, live call and comparison on a phone" width="100%">
|
|
131
|
+
</p>
|
|
132
|
+
|
|
133
|
+
### The landing page
|
|
134
|
+
|
|
135
|
+
| Pinned feature stage | Use cases |
|
|
136
|
+
| --- | --- |
|
|
137
|
+
| <img src="docs/screenshots/landing-features.webp" alt="Pinned photo stage cross-fading through Ava's capabilities"> | <img src="docs/screenshots/landing-use-cases.webp" alt="Six real example questions across onboarding, support, billing and setup"> |
|
|
138
|
+
|
|
139
|
+
<p align="center">
|
|
140
|
+
<img src="docs/screenshots/landing-compare.webp" alt="Comparison: Ava vs calls with your team vs docs and chatbots" width="100%">
|
|
141
|
+
</p>
|
|
142
|
+
|
|
143
|
+
</details>
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## What Ava does
|
|
148
|
+
|
|
149
|
+
**For the customer**
|
|
150
|
+
- **Talks, naturally.** Live voice with streamed replies, interruptible at any time (barge-in), in text or voice.
|
|
151
|
+
- **Sees their screen.** Reads the shared tab — the page, what's selected, the numbers on it — and grounds every answer in it. Never invents buttons; if it isn't sure, it takes another look.
|
|
152
|
+
- **Helps with anything on the page.** A *Flexible agent* for whatever the customer is doing, and an *Onboarding agent* that walks a journey step by step on a chosen product (Todoist, Supabase, Stripe, AWS Console, Salesforce, Datadog, Vercel).
|
|
153
|
+
- **Speaks up.** Reacts when the screen changes, and flags risky or costly moves before they happen (a $9,900 seat count, a destructive click).
|
|
154
|
+
- **Knows when it's done.** Confirms each step actually worked, and goes quiet once the task is complete.
|
|
155
|
+
- **A person, one tap away.** Hands off to a human specialist with the goal, the screen and the progress already shared — the specialist joins the same call over WebRTC.
|
|
156
|
+
|
|
157
|
+
**For the team running it**
|
|
158
|
+
- **Session recap** — an AI summary, highlights and stats, plus a replay of how the agents worked, with a timestamped timeline.
|
|
159
|
+
- **Console** — end-to-end latency per turn, which agents ran and how long each took, the compiled context the talker saw, and live spend.
|
|
160
|
+
- **Per-platform theming** — onboarding calls take on the product's brand colour.
|
|
161
|
+
- **Pop-out** — a picture-in-picture miniature of the call, so the customer can keep working in the shared tab.
|
|
162
|
+
- **Demo mode** — scripted, self-recording showcase runs (`/app?demo=simple|moderate|complex`).
|
|
163
|
+
- **Privacy by design** — Ava sees only the single tab the customer chooses to share; screens aren't stored.
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## How it works
|
|
168
|
+
|
|
169
|
+
Ava is a small crew of specialised agents around a shared, compiled context — not one model doing everything. Only the reply the customer actually *hears* sits on the latency-critical path; everything else runs in parallel or in the background.
|
|
170
|
+
|
|
171
|
+
```mermaid
|
|
172
|
+
flowchart LR
|
|
173
|
+
subgraph Browser
|
|
174
|
+
MIC["Mic<br/>client VAD + barge-in"]
|
|
175
|
+
TAB["Shared tab<br/>getDisplayMedia"]
|
|
176
|
+
W["Frame worker<br/>downscale + dHash"]
|
|
177
|
+
SPK["Speaker<br/>streamed audio"]
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
subgraph Server["Server (raw Node)"]
|
|
181
|
+
STT["Speech-to-text<br/>sherpa-onnx zipformer / SenseVoice + Silero VAD"]
|
|
182
|
+
P["Perception<br/>vision, diff-gated"]
|
|
183
|
+
I["Intent + reasoning<br/>fast classifier"]
|
|
184
|
+
R["Router<br/>deterministic code"]
|
|
185
|
+
BB[("Compiled context<br/>(blackboard)")]
|
|
186
|
+
T["Talker<br/>streamed reply"]
|
|
187
|
+
TTS["Voice<br/>clause-chunked TTS"]
|
|
188
|
+
PL["Planner<br/>async goal + plan"]
|
|
189
|
+
OB["Observe loop<br/>proactive nudges"]
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
MIC -->|16 kHz PCM over WS| STT --> I
|
|
193
|
+
TAB --> W -->|only when the screen changed| P
|
|
194
|
+
W --> OB --> P
|
|
195
|
+
P --> BB
|
|
196
|
+
I --> R --> BB
|
|
197
|
+
PL <--> BB
|
|
198
|
+
BB --> T --> TTS --> SPK
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
| Role | What it does | Default model / engine |
|
|
202
|
+
| --- | --- | --- |
|
|
203
|
+
| **Perception** | Reads the shared screen into structured state (page, elements, on-screen content, what's selected). Skipped when the frame's perceptual hash hasn't changed; forced to re-read when the user asks about the screen or disputes it. | `google/gemini-2.5-flash` |
|
|
204
|
+
| **Intent / reasoning** | Classifies the turn and judges whether the user is stuck, hesitant or done — in parallel with perception. | `google/gemini-2.5-flash-lite` |
|
|
205
|
+
| **Router** | Plain code: decides what the turn needs and compiles the context the talker sees. | — |
|
|
206
|
+
| **Talker** | The spoken reply. Latency-critical, streamed token by token, routed to a low-latency provider. | `meta-llama/llama-3.3-70b-instruct` on Groq |
|
|
207
|
+
| **Planner** | Keeps the goal and a grounded plan up to date, off the hot path. | `anthropic/claude-sonnet-4.5` |
|
|
208
|
+
| **Speech-to-text** | Streaming, on the server, free and offline. | sherpa-onnx (zipformer EN, SenseVoice multilingual) + Silero VAD; browser or Deepgram fallback |
|
|
209
|
+
| **Voice** | Streamed in clause-sized chunks so the first words play fast. | ElevenLabs turbo, Kokoro (offline), Hume, or the browser |
|
|
210
|
+
|
|
211
|
+
All language models go through [OpenRouter](https://openrouter.ai), and every role's model is swappable with an env var. Why it's fast:
|
|
212
|
+
|
|
213
|
+
- **Only the talker is on the critical path.** Intent, reasoning and perception run in parallel; the planner runs after the reply.
|
|
214
|
+
- **Diff-gated vision.** A 32×32 perceptual hash in a Web Worker means vision is called only when the screen actually changed, and bursts of changes are coalesced into one read.
|
|
215
|
+
- **Streaming end to end.** Talker tokens stream into a TTS that speaks clause by clause, so audio starts before the reply is finished.
|
|
216
|
+
- **Pre-warmed voice.** The lobby's voice preview and the connecting screen both warm the voice model, so the greeting starts quickly.
|
|
217
|
+
|
|
218
|
+
The console shows every turn's end-to-end latency and per-agent timings live, so you can see the effect of each choice.
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## Quality and security
|
|
223
|
+
|
|
224
|
+
- **Tests:** unit and API tests (`npm test`); Chromium end-to-end tests that run real voice, screen sharing and the WebRTC handoff (`npm run test:e2e`); an automated WCAG 2.1 AA accessibility audit on every screen. CI runs ESLint, all of the tests, a Docker build and CodeQL.
|
|
225
|
+
- **Security:** a password gate, per-IP rate limits, a per-call spend cap, a strict Content-Security-Policy, and revocable handoff links. See [SECURITY.md](SECURITY.md).
|
|
226
|
+
- **Standards:** [docs/QUALITY.md](docs/QUALITY.md) maps the project to ISO/IEC 25010 software quality, WCAG 2.1 (ISO/IEC 40500) and the OWASP guidance it follows.
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
## Contributing
|
|
231
|
+
|
|
232
|
+
Ava is small on purpose and easy to change. Adding a product to the onboarding catalogue is a single data entry. Start with [CONTRIBUTING.md](CONTRIBUTING.md), and please follow the [Code of Conduct](CODE_OF_CONDUCT.md).
|
|
233
|
+
|
|
234
|
+
## License
|
|
235
|
+
|
|
236
|
+
Ava Engine is **source-available** under the [Ava Engine License](LICENSE):
|
|
237
|
+
|
|
238
|
+
- ✅ **Free for everyone, companies included.** Run it, change it, and build paid products and SaaS on it under your own brand. Just credit "Built on Ava Engine" in your docs, about page or legal notices; [the badge](docs/brand/README.md) makes it easy.
|
|
239
|
+
- ❌ **Not allowed without a [commercial license](COMMERCIAL-LICENSE.md):** reselling or republishing the engine itself as your own (renamed copies, templates, SDKs, self-hosted packages) or removing the credit.
|
|
240
|
+
|
|
241
|
+
Forks need their own name ([trademark policy](TRADEMARKS.md)), and contributions are welcome under the [CLA](CLA.md). Fonts, vendored code and downloaded models carry their own licenses; see [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md). Product names in the onboarding catalogue and demo mode belong to their owners, and Ava isn't affiliated with them.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Third-party notices
|
|
2
|
+
|
|
3
|
+
Ava's own code is source-available under the Ava Engine License, with commercial licenses available (see [LICENSE](LICENSE) and [COMMERCIAL-LICENSE.md](COMMERCIAL-LICENSE.md)). The third-party components below keep their own licenses. It ships with, or downloads at setup time, the following third-party components under their own licenses.
|
|
4
|
+
|
|
5
|
+
## Bundled in this repository
|
|
6
|
+
|
|
7
|
+
| Component | Where | License |
|
|
8
|
+
| --- | --- | --- |
|
|
9
|
+
| [Inter](https://github.com/rsms/inter), [Inter Tight](https://github.com/rsms/inter) | `public/fonts/inter-*.woff2` | SIL Open Font License 1.1 (see [`public/fonts/OFL.txt`](public/fonts/OFL.txt)) |
|
|
10
|
+
| [IBM Plex Mono](https://github.com/IBM/plex) | `public/fonts/plex-mono-*.woff2` | SIL Open Font License 1.1 (see [`public/fonts/OFL.txt`](public/fonts/OFL.txt)) |
|
|
11
|
+
| [Lenis](https://github.com/darkroomengineering/lenis) 1.1.13 | `public/vendor/lenis.min.js` | MIT, © darkroom.engineering |
|
|
12
|
+
|
|
13
|
+
## npm dependencies
|
|
14
|
+
|
|
15
|
+
Installed by `npm install`; each package carries its own license file in `node_modules`.
|
|
16
|
+
|
|
17
|
+
| Package | License |
|
|
18
|
+
| --- | --- |
|
|
19
|
+
| [`ws`](https://github.com/websockets/ws) | MIT |
|
|
20
|
+
| [`sherpa-onnx-node`](https://github.com/k2-fsa/sherpa-onnx) | Apache-2.0 |
|
|
21
|
+
| [`kokoro-js`](https://github.com/hexgrad/kokoro) | Apache-2.0 |
|
|
22
|
+
|
|
23
|
+
Their transitive dependencies are MIT, BSD-3-Clause, Apache-2.0, ISC or BlueOak-1.0.0, with one exception. `kokoro-js` pulls in [`sharp`](https://github.com/lovell/sharp), whose prebuilt `@img/sharp-libvips-*` binary is libvips under LGPL-3.0-or-later. It's dynamically linked and installed from npm, not redistributed in this repository. Run `npx license-checker --production --summary` to audit the full tree.
|
|
24
|
+
|
|
25
|
+
## Models downloaded at setup or first run
|
|
26
|
+
|
|
27
|
+
These aren't in the repository. `scripts/fetch-models.sh` (and the Dockerfile) fetch the speech-to-text models, and Kokoro fetches its voice model from Hugging Face on first use. Check each model's license before you use it commercially.
|
|
28
|
+
|
|
29
|
+
| Model | Source | License |
|
|
30
|
+
| --- | --- | --- |
|
|
31
|
+
| Streaming Zipformer (English, 2023-06-26) | [k2-fsa/sherpa-onnx releases](https://github.com/k2-fsa/sherpa-onnx/releases/tag/asr-models) | Apache-2.0 |
|
|
32
|
+
| SenseVoice Small (zh/en/ja/ko/yue) | [k2-fsa/sherpa-onnx releases](https://github.com/k2-fsa/sherpa-onnx/releases/tag/asr-models), from [FunAudioLLM/SenseVoice](https://github.com/FunAudioLLM/SenseVoice) | [FunASR Model License](https://github.com/modelscope/FunASR/blob/main/MODEL_LICENSE) |
|
|
33
|
+
| Silero VAD | [snakers4/silero-vad](https://github.com/snakers4/silero-vad) | MIT |
|
|
34
|
+
| Kokoro-82M (ONNX) | [onnx-community/Kokoro-82M-v1.0-ONNX](https://huggingface.co/onnx-community/Kokoro-82M-v1.0-ONNX) | Apache-2.0 |
|
|
35
|
+
|
|
36
|
+
## Trademarks
|
|
37
|
+
|
|
38
|
+
The onboarding catalogue (`lib/platforms.mjs`) and demo mode (`public/demo.js`) mention third-party products such as Todoist, Supabase, Stripe, AWS, Salesforce, Datadog, Vercel and Google Workspace, and demo mode draws simplified look-alike screens of some of them. The main demo (`/app?demo=simple`, and the README video) uses **Basewell**, a fictional product drawn for the demo. These names are used only to describe what Ava can help with. They're trademarks of their owners, and Ava isn't affiliated with or endorsed by any of them.
|
package/TRADEMARKS.md
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Trademark policy
|
|
2
|
+
|
|
3
|
+
"Ava Engine", "Ava" when used for this software, and the ΛVΛ logo are trademarks of Irvan (the "Marks"). The [software license](LICENSE) covers the code; it does **not** give you any rights to the Marks. This policy explains what you can do with them.
|
|
4
|
+
|
|
5
|
+
## Fine without asking
|
|
6
|
+
|
|
7
|
+
- Saying truthfully that your project is "based on Ava Engine" or "a fork of Ava Engine", in plain text, as long as you don't suggest it's official or endorsed
|
|
8
|
+
- Linking to this repository and writing about Ava Engine: articles, tutorials, talks, reviews
|
|
9
|
+
- The credit "Built on Ava Engine", and the official [badge](docs/brand/README.md) used unmodified, which the [license](LICENSE) asks your product to show
|
|
10
|
+
- Keeping the Marks in an unmodified copy of the software that you run yourself
|
|
11
|
+
|
|
12
|
+
## Not allowed without written permission
|
|
13
|
+
|
|
14
|
+
- Naming a fork, product, service, company or domain "Ava Engine", or anything confusingly similar (e.g. "AvaEngine Pro", "Ava Engine Cloud"). Your product built on Ava should have its own name
|
|
15
|
+
- Using the ΛVΛ logo, or a modified version of it, for a fork or a different product
|
|
16
|
+
- Distributing a **modified** version under the Ava Engine name or logo. Forks must use their own name and branding
|
|
17
|
+
- Suggesting that Irvan or the Ava Engine project sponsors, endorses or supports your fork, product or service
|
|
18
|
+
|
|
19
|
+
## Forks
|
|
20
|
+
|
|
21
|
+
You're welcome to fork Ava Engine under the [license](LICENSE), to contribute back or to adapt it for your own products. A fork must:
|
|
22
|
+
|
|
23
|
+
1. use its own name and logo,
|
|
24
|
+
2. keep the license and the `Required Notice:` copyright line from this repository, as the license requires, and
|
|
25
|
+
3. say it's based on Ava Engine, if it says anything about its origins, without implying endorsement.
|
|
26
|
+
|
|
27
|
+
Publishing a fork as a separate engine, framework or template, or selling the engine itself, needs a [commercial license](COMMERCIAL-LICENSE.md), whatever the fork is called. Products and services you build on Ava don't.
|
|
28
|
+
|
|
29
|
+
## Questions and permission
|
|
30
|
+
|
|
31
|
+
Message [@Mr-vero on GitHub](https://github.com/Mr-vero).
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Entry point for `npx ava-engine`. Kept tiny and old-syntax-safe so an outdated
|
|
3
|
+
// Node gets a clear message instead of a syntax error.
|
|
4
|
+
const [major, minor] = process.versions.node.split(".").map(Number);
|
|
5
|
+
if (major < 22 || (major === 22 && minor < 9)) {
|
|
6
|
+
console.error(`\n Ava Engine needs Node.js 22.9 or newer (you have ${process.versions.node}).\n Install it from https://nodejs.org and try again.\n`);
|
|
7
|
+
process.exit(1);
|
|
8
|
+
}
|
|
9
|
+
import("../lib/cli/main.mjs")
|
|
10
|
+
.then(({ main }) => main(process.argv.slice(2)))
|
|
11
|
+
.then((code) => { if (typeof code === "number") process.exitCode = code; })
|
|
12
|
+
.catch((e) => { console.error(`\n ✗ ${e?.stack || e}\n`); process.exit(1); });
|