@oriro/orirocli 0.1.1 → 0.1.2
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/README.md +4 -4
- package/dist/cli.js +77 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,20 +2,20 @@
|
|
|
2
2
|
|
|
3
3
|
# ORIRO‑Terminal - **“Head | Memory | Eyeball for AI”**
|
|
4
4
|
|
|
5
|
-
# **FREE TIER | BYOK** | **Works in
|
|
5
|
+
# **FREE TIER | BYOK** | **Works in 100 Languages | Live Security Gaurdian-V3 (MCP Watch)**
|
|
6
6
|
|
|
7
|
-
A terminal coder that **sees the web**, **speaks and listens in
|
|
7
|
+
A terminal coder that **sees the web**, **speaks and listens in 100 languages**, **guards itself**, and can wear a **floating avatar that talks back in its own voice** — all on‑device.
|
|
8
8
|
|
|
9
9
|
A free, on-device-friendly terminal AI agent — built on the Pi agent harness (used as a library).
|
|
10
10
|
Your language, your machine, no paid keys required.
|
|
11
11
|
|
|
12
12
|
## What's inside
|
|
13
13
|
- **Keyless free-router Mux** — best-router selection + invisible failover across free providers, with an on-device floor. Never a paid key.
|
|
14
|
-
- **
|
|
14
|
+
- **100 languages** — type in your language; the model reasons in English; replies come back translated (on-device NLLB).
|
|
15
15
|
- **Guardian V3** — a security gate on every tool call, default-on, fail-closed.
|
|
16
16
|
- **Head** — goes out, inspects a live site, and reverse-engineers it to code.
|
|
17
17
|
- **Scriber** — a consent-gated, self-healing local work journal (never leaves your machine).
|
|
18
|
-
- **
|
|
18
|
+
- **323 skills**, **multi-agent orchestration** on the free pool, and **MCP connectors**.
|
|
19
19
|
- **Channels** — drive ORIRO from Telegram/Discord/WhatsApp with your own bot.
|
|
20
20
|
|
|
21
21
|
## Install
|
package/dist/cli.js
CHANGED
|
@@ -854,6 +854,10 @@ function avatarsInCategory(category) {
|
|
|
854
854
|
const c = category.toLowerCase();
|
|
855
855
|
return AVATARS.filter((a) => a.category.toLowerCase() === c);
|
|
856
856
|
}
|
|
857
|
+
function avatarBySlug(slug) {
|
|
858
|
+
const s = (slug || "").toLowerCase();
|
|
859
|
+
return AVATARS.find((a) => a.slug.toLowerCase() === s);
|
|
860
|
+
}
|
|
857
861
|
function avatarImageUrl(a) {
|
|
858
862
|
return a.image_url.startsWith("http") ? a.image_url : `${AVATAR_ORIGIN}${a.image_url}`;
|
|
859
863
|
}
|
|
@@ -877,6 +881,10 @@ function writeAvatarConfig(cfg) {
|
|
|
877
881
|
function isAvatarConfigured() {
|
|
878
882
|
return readAvatarConfig() !== null;
|
|
879
883
|
}
|
|
884
|
+
function getSelectedAvatar() {
|
|
885
|
+
const cfg = readAvatarConfig();
|
|
886
|
+
return cfg && avatarBySlug(cfg.slug) || null;
|
|
887
|
+
}
|
|
880
888
|
function setSelectedAvatar(avatar, opts) {
|
|
881
889
|
const cfg = {
|
|
882
890
|
slug: avatar.slug,
|
|
@@ -4543,6 +4551,73 @@ function registerSkillsCommand(program2) {
|
|
|
4543
4551
|
});
|
|
4544
4552
|
}
|
|
4545
4553
|
|
|
4554
|
+
// src/commands/language.ts
|
|
4555
|
+
import { stdin as stdin5 } from "process";
|
|
4556
|
+
function registerLanguageCommand(program2) {
|
|
4557
|
+
program2.command("language").description("show or change your terminal language").argument("[code]", "switch directly to this language (ISO code or name, e.g. es)").option("-a, --all", "list every available language").action(async (code, opts) => {
|
|
4558
|
+
if (opts.all) {
|
|
4559
|
+
heading(`Languages (${LANGUAGES.length})`);
|
|
4560
|
+
for (const l of LANGUAGES) {
|
|
4561
|
+
const star = l.neuralVoice ? accent("\u2605") : " ";
|
|
4562
|
+
process.stdout.write(` ${star} ${l.name} ${dim(`(${l.code})`)}
|
|
4563
|
+
`);
|
|
4564
|
+
}
|
|
4565
|
+
return;
|
|
4566
|
+
}
|
|
4567
|
+
if (code) {
|
|
4568
|
+
const lang = languageByCode(code);
|
|
4569
|
+
if (!lang) die(`unknown language '${code}' \u2014 run \`oriro language --all\` to see the list`);
|
|
4570
|
+
setTerminalLanguage(lang);
|
|
4571
|
+
ok(`${accent(lang.name)} is now your terminal language.`);
|
|
4572
|
+
return;
|
|
4573
|
+
}
|
|
4574
|
+
if (stdin5.isTTY) {
|
|
4575
|
+
const lang = await selectLanguageInteractive();
|
|
4576
|
+
setTerminalLanguage(lang);
|
|
4577
|
+
ok(`${accent(lang.name)} is now your terminal language.`);
|
|
4578
|
+
} else {
|
|
4579
|
+
const cur = getTerminalLanguage();
|
|
4580
|
+
info(`terminal language: ${accent(cur.name)} ${dim(`(${cur.code})`)}`);
|
|
4581
|
+
info(dim("change it with `oriro language <code>` (e.g. `oriro language es`) or `oriro language --all`"));
|
|
4582
|
+
}
|
|
4583
|
+
});
|
|
4584
|
+
}
|
|
4585
|
+
|
|
4586
|
+
// src/commands/avatar.ts
|
|
4587
|
+
import { stdin as stdin6 } from "process";
|
|
4588
|
+
function registerAvatarCommand(program2) {
|
|
4589
|
+
program2.command("avatar").description("show or change your terminal avatar").argument("[slug]", "set directly to this avatar slug").option("-l, --list", "list every avatar by category").action(async (slug, opts) => {
|
|
4590
|
+
if (opts.list) {
|
|
4591
|
+
for (const cat of avatarCategories()) {
|
|
4592
|
+
heading(cat);
|
|
4593
|
+
for (const a of avatarsInCategory(cat)) process.stdout.write(` ${accent(a.slug)}
|
|
4594
|
+
`);
|
|
4595
|
+
}
|
|
4596
|
+
return;
|
|
4597
|
+
}
|
|
4598
|
+
if (slug) {
|
|
4599
|
+
const avatar = avatarBySlug(slug);
|
|
4600
|
+
if (!avatar) die(`unknown avatar '${slug}' \u2014 run \`oriro avatar --list\` to see the faces`);
|
|
4601
|
+
setSelectedAvatar(avatar, { speak: true });
|
|
4602
|
+
ok(`${accent(avatar.slug)} is now your terminal face.`);
|
|
4603
|
+
return;
|
|
4604
|
+
}
|
|
4605
|
+
if (stdin6.isTTY) {
|
|
4606
|
+
const chosen = await selectAvatarInteractive();
|
|
4607
|
+
if (!chosen) {
|
|
4608
|
+
info("no change.");
|
|
4609
|
+
return;
|
|
4610
|
+
}
|
|
4611
|
+
setSelectedAvatar(chosen, { speak: true });
|
|
4612
|
+
await previewAvatar(chosen);
|
|
4613
|
+
} else {
|
|
4614
|
+
const cur = getSelectedAvatar();
|
|
4615
|
+
info(cur ? `terminal face: ${accent(cur.slug)}` : "no avatar set yet");
|
|
4616
|
+
info(dim("change it with `oriro avatar <slug>` or `oriro avatar --list`"));
|
|
4617
|
+
}
|
|
4618
|
+
});
|
|
4619
|
+
}
|
|
4620
|
+
|
|
4546
4621
|
// src/cli.ts
|
|
4547
4622
|
var version = createRequire(import.meta.url)("../package.json").version;
|
|
4548
4623
|
var program = new Command();
|
|
@@ -4561,6 +4636,8 @@ registerScribeCommand(program);
|
|
|
4561
4636
|
registerConnectorsCommand(program);
|
|
4562
4637
|
registerChannelsCommand(program);
|
|
4563
4638
|
registerSkillsCommand(program);
|
|
4639
|
+
registerLanguageCommand(program);
|
|
4640
|
+
registerAvatarCommand(program);
|
|
4564
4641
|
program.parseAsync().catch((e) => {
|
|
4565
4642
|
process.stderr.write(`
|
|
4566
4643
|
ORIRO error: ${e instanceof Error ? e.stack ?? e.message : String(e)}
|