@agentprojectcontext/apx 1.37.0 → 1.38.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/README.md +11 -0
- package/package.json +1 -1
- package/src/core/mascot.js +80 -80
- package/src/interfaces/web/dist/assets/index-CQc_5t8F.js +629 -0
- package/src/interfaces/web/dist/assets/index-CQc_5t8F.js.map +1 -0
- package/src/interfaces/web/dist/assets/{index-B6sYFQFa.css → index-hwxuTPcK.css} +1 -1
- package/src/interfaces/web/dist/index.html +2 -2
- package/src/interfaces/web/src/App.tsx +15 -24
- package/src/interfaces/web/src/components/ModelCombobox.tsx +1 -1
- package/src/interfaces/web/src/components/Roby.tsx +96 -0
- package/src/interfaces/web/src/components/TelegramChannelDialog.tsx +11 -11
- package/src/interfaces/web/src/components/TelegramSendDialog.tsx +5 -5
- package/src/interfaces/web/src/components/chat/MessageBubble.tsx +2 -2
- package/src/interfaces/web/src/components/chat/ModelPicker.tsx +5 -5
- package/src/interfaces/web/src/components/chat/ToolCall.tsx +23 -19
- package/src/interfaces/web/src/components/code/CodeArtifactsTab.tsx +10 -10
- package/src/interfaces/web/src/components/code/CodeContextTab.tsx +7 -7
- package/src/interfaces/web/src/components/code/CodeProjectPicker.tsx +3 -2
- package/src/interfaces/web/src/components/common/TabNav.tsx +3 -2
- package/src/interfaces/web/src/components/config/ConfigTabsEditor.tsx +3 -2
- package/src/interfaces/web/src/components/config/GlobalConfigEditor.tsx +2 -2
- package/src/interfaces/web/src/components/config/global-config-sections.ts +9 -9
- package/src/interfaces/web/src/components/config/project-config-sections.ts +61 -54
- package/src/interfaces/web/src/components/deck/DaemonCard.tsx +6 -5
- package/src/interfaces/web/src/components/inputs/KeyValueList.tsx +5 -4
- package/src/interfaces/web/src/components/inputs/VarTokenInput.tsx +3 -3
- package/src/interfaces/web/src/components/layout/ProjectSidebar.tsx +22 -9
- package/src/interfaces/web/src/components/settings/AdvancedPanel.tsx +1 -1
- package/src/interfaces/web/src/components/settings/AppearancePanel.tsx +1 -1
- package/src/interfaces/web/src/components/settings/DefaultRouterCard.tsx +14 -14
- package/src/interfaces/web/src/components/settings/DevicesPanel.tsx +3 -3
- package/src/interfaces/web/src/components/settings/EnginesPanel.tsx +7 -7
- package/src/interfaces/web/src/components/settings/IdentityPanel.tsx +2 -2
- package/src/interfaces/web/src/components/settings/MemoryPanel.tsx +37 -37
- package/src/interfaces/web/src/components/settings/SkillsInspectorPanel.tsx +44 -35
- package/src/interfaces/web/src/components/settings/SuperAgentPanel.tsx +5 -5
- package/src/interfaces/web/src/components/settings/TelegramChannelsPanel.tsx +3 -3
- package/src/interfaces/web/src/components/settings/TelegramContactsPanel.tsx +1 -1
- package/src/interfaces/web/src/components/settings/TelegramGlobalPanel.tsx +3 -3
- package/src/interfaces/web/src/components/settings/TelegramRolesPanel.tsx +1 -1
- package/src/interfaces/web/src/components/settings/providers/ProviderCard.tsx +6 -6
- package/src/interfaces/web/src/components/settings/providers/ProviderModal.tsx +36 -36
- package/src/interfaces/web/src/components/voice/VoiceProviderList.tsx +15 -14
- package/src/interfaces/web/src/components/voice/VoiceProviderModal.tsx +22 -22
- package/src/interfaces/web/src/components/voice/VoiceSttCard.tsx +18 -17
- package/src/interfaces/web/src/components/voice/VoiceTestCard.tsx +19 -18
- package/src/interfaces/web/src/hooks/useChat.ts +6 -5
- package/src/interfaces/web/src/i18n/en.ts +517 -1
- package/src/interfaces/web/src/i18n/es.ts +517 -1
- package/src/interfaces/web/src/i18n/index.ts +1 -1
- package/src/interfaces/web/src/lib/api/voice.ts +5 -5
- package/src/interfaces/web/src/screens/ProjectScreen.tsx +14 -1
- package/src/interfaces/web/src/screens/SettingsScreen.tsx +1 -1
- package/src/interfaces/web/src/screens/base/AgentDefaultsTab.tsx +8 -8
- package/src/interfaces/web/src/screens/base/ComingSoon.tsx +3 -2
- package/src/interfaces/web/src/screens/modules/CodeScreen.tsx +12 -12
- package/src/interfaces/web/src/screens/modules/DeckScreen.tsx +15 -15
- package/src/interfaces/web/src/screens/modules/DesktopScreen.tsx +37 -37
- package/src/interfaces/web/src/screens/modules/VoiceScreen.tsx +8 -8
- package/src/interfaces/web/src/screens/project/AgentBrainGraph.tsx +16 -10
- package/src/interfaces/web/src/screens/project/AgentDetailScreen.tsx +25 -24
- package/src/interfaces/web/src/screens/project/ChatTab.tsx +2 -2
- package/src/interfaces/web/src/screens/project/ConfigTab.tsx +3 -3
- package/src/interfaces/web/src/screens/project/McpsTab.tsx +6 -9
- package/src/interfaces/web/src/screens/project/RoutinesTab.tsx +66 -52
- package/src/interfaces/web/src/screens/project/TelegramTab.tsx +1 -1
- package/src/interfaces/web/dist/assets/index-DsADpObh.js +0 -633
- package/src/interfaces/web/dist/assets/index-DsADpObh.js.map +0 -1
package/README.md
CHANGED
|
@@ -41,6 +41,17 @@ APX is a daemon + CLI that brings the APC convention to life:
|
|
|
41
41
|
|
|
42
42
|
APX is opinionated about storage: the filesystem is the source of truth. Project definitions and curated memory live in the repo. Runtime state such as sessions, conversations, messages, and caches lives in `~/.apx/` and is never committed.
|
|
43
43
|
|
|
44
|
+
<div align="center">
|
|
45
|
+
<pre>
|
|
46
|
+
▄███████▄
|
|
47
|
+
█ ██ ██ █
|
|
48
|
+
█ ◕ ◕ █
|
|
49
|
+
█ ‿ █
|
|
50
|
+
▀███████▀
|
|
51
|
+
</pre>
|
|
52
|
+
<sub>Meet <b>Roby</b> — your project's super-agent. He greets you across the <code>apx</code> CLI and the web admin.</sub>
|
|
53
|
+
</div>
|
|
54
|
+
|
|
44
55
|
## Quick start
|
|
45
56
|
|
|
46
57
|
```bash
|
package/package.json
CHANGED
package/src/core/mascot.js
CHANGED
|
@@ -1,122 +1,122 @@
|
|
|
1
|
-
// APX mascot — a
|
|
1
|
+
// APX mascot — "Roby", a little terminal critter that shows up across the CLI.
|
|
2
2
|
// Usage: import { mascot } from '#core/mascot.js'; mascot('happy');
|
|
3
|
+
//
|
|
4
|
+
// Same character as the web Splash/404 ("Roby"): a chunky ▄███████▄ head with
|
|
5
|
+
// two screen-eyes and a tiny mouth. Rendered as clean emerald-green line art on
|
|
6
|
+
// the terminal's own background — no heavy black-on-white blocks, no stray legs.
|
|
7
|
+
// Kept deliberately simple and a touch hand-made, not a photoreal sprite.
|
|
3
8
|
|
|
4
9
|
const R = "\x1b[0m";
|
|
5
10
|
const B = "\x1b[1m";
|
|
6
|
-
const W = "\x1b[97m"; // bright white
|
|
7
|
-
const BK = "\x1b[40m"; // bg black
|
|
8
|
-
const CY = "\x1b[36m";
|
|
9
|
-
const YE = "\x1b[33m";
|
|
10
|
-
const GR = "\x1b[32m";
|
|
11
|
-
const RE = "\x1b[31m";
|
|
12
11
|
const DI = "\x1b[2m";
|
|
13
|
-
const BL = "\x1b[34m";
|
|
14
12
|
|
|
15
|
-
//
|
|
13
|
+
// Honor NO_COLOR; otherwise tint in emerald to match the web Roby (text-emerald).
|
|
14
|
+
const NO_COLOR = !!process.env.NO_COLOR;
|
|
15
|
+
const truecolor = /truecolor|24bit/i.test(process.env.COLORTERM || "");
|
|
16
|
+
|
|
17
|
+
function rgb(r, g, b) {
|
|
18
|
+
if (NO_COLOR) return "";
|
|
19
|
+
if (truecolor) return `\x1b[38;2;${r};${g};${b}m`;
|
|
20
|
+
// 6x6x6 cube fallback for 256-color terminals.
|
|
21
|
+
const q = (v) => Math.round((v / 255) * 5);
|
|
22
|
+
return `\x1b[38;5;${16 + 36 * q(r) + 6 * q(g) + q(b)}m`;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Two emerald tones: a bright frame and a dimmer "screen" green for the eyes,
|
|
26
|
+
// so the face reads without resorting to a second background colour.
|
|
27
|
+
const G = rgb(52, 211, 153); // emerald-400 — frame, mouth, pupils
|
|
28
|
+
const GD = rgb(20, 120, 92); // dim emerald — recessed eye screens
|
|
29
|
+
const reset = NO_COLOR ? "" : R;
|
|
30
|
+
const bold = NO_COLOR ? "" : B;
|
|
31
|
+
const dim = NO_COLOR ? "" : DI;
|
|
32
|
+
|
|
33
|
+
// Caption colours per mood (still emerald-family, just a nudge of hue).
|
|
34
|
+
const C_OK = rgb(52, 211, 153);
|
|
35
|
+
const C_INFO = rgb(94, 198, 255);
|
|
36
|
+
const C_WARN = rgb(240, 200, 90);
|
|
37
|
+
const C_BAD = rgb(240, 110, 110);
|
|
38
|
+
|
|
39
|
+
// Build Roby's head. `eyes` is [left, right] pupils; `mouth` is one glyph;
|
|
40
|
+
// `top` is an optional floating accent that hovers over the head.
|
|
41
|
+
function buildRoby({ eyes, mouth, top = "" }) {
|
|
42
|
+
const [el, er] = eyes;
|
|
43
|
+
const lines = [];
|
|
44
|
+
lines.push(top ? ` ${dim}${top}${reset}` : "");
|
|
45
|
+
lines.push(` ${G}▄███████▄${reset}`);
|
|
46
|
+
// Eye screens: dim ██ sockets set into the bright frame.
|
|
47
|
+
lines.push(` ${G}█ ${GD}██${G} ${GD}██${G} █${reset}`);
|
|
48
|
+
// Pupils + mouth, each a single green run (clean, no inline colour breaks).
|
|
49
|
+
lines.push(` ${G}█ ${el} ${er} █${reset}`);
|
|
50
|
+
lines.push(` ${G}█ ${mouth} █${reset}`);
|
|
51
|
+
lines.push(` ${G}▀███████▀${reset}`);
|
|
52
|
+
return lines.filter((l, i) => !(i === 0 && l === ""));
|
|
53
|
+
}
|
|
54
|
+
|
|
16
55
|
const MOODS = {
|
|
17
56
|
// ─── happy: default greeting / daemon started ────────────────────────────
|
|
18
57
|
happy: {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
` ${BK}${W} █ ${R}${B}██${R}${W} ${B}██${R}${BK}${W} █ ${R}`,
|
|
23
|
-
` ${BK}${W} █ ◕ ◕ █ ${R}`,
|
|
24
|
-
` ${BK}${W} █ ╰ω╯ █ ${R}`,
|
|
25
|
-
` ${BK}${W} ▀███████▀ ${R}`,
|
|
26
|
-
` ${DI} ╱ ╲ ╱ ╲ ${R}`,
|
|
27
|
-
],
|
|
28
|
-
caption: `${GR}${B}ready to go!${R}`,
|
|
58
|
+
caption: "ready to go!",
|
|
59
|
+
color: C_OK,
|
|
60
|
+
lines: buildRoby({ eyes: ["◕", "◕"], mouth: "‿" }),
|
|
29
61
|
},
|
|
30
62
|
|
|
31
63
|
// ─── wave: first run / setup ─────────────────────────────────────────────
|
|
32
64
|
wave: {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
` ${BK}${W} █ ${R}${B}██${R}${W} ${B}██${R}${BK}${W} █ ${R} ${DI}//${R}`,
|
|
37
|
-
` ${BK}${W} █ ◕ ◕ █ ${R} ${DI}//${R}`,
|
|
38
|
-
` ${BK}${W} █ ╰▽╯ █ ${R}${DI}/${R}`,
|
|
39
|
-
` ${BK}${W} ▀███████▀ ${R}`,
|
|
40
|
-
` ${DI} ╱ ╲ ╱ ╲ ${R}`,
|
|
41
|
-
],
|
|
42
|
-
caption: `${CY}${B}APX — Agent Project Context${R}`,
|
|
65
|
+
caption: "APX — Agent Project Context",
|
|
66
|
+
color: C_OK,
|
|
67
|
+
lines: buildRoby({ eyes: ["◕", "◕"], mouth: "▽", top: "·" }),
|
|
43
68
|
},
|
|
44
69
|
|
|
45
|
-
// ─── confused: unknown command / not found
|
|
70
|
+
// ─── confused: unknown command / not found (the web 404 "lost" Roby) ──────
|
|
46
71
|
confused: {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
` ${BK}${W} █ ${R}${B}██${R}${W} ${B}██${R}${BK}${W} █ ${R}`,
|
|
51
|
-
` ${BK}${W} █ ◔ ◔ █ ${R}`,
|
|
52
|
-
` ${BK}${W} █ ╰~╯ █ ${R}`,
|
|
53
|
-
` ${BK}${W} ▀███████▀ ${R}`,
|
|
54
|
-
` ${DI} ╱ ╲ ╱ ╲ ${R}`,
|
|
55
|
-
],
|
|
56
|
-
caption: `${YE}${B}hmm, I don't know that one${R}`,
|
|
72
|
+
caption: "hmm, I don't know that one",
|
|
73
|
+
color: C_WARN,
|
|
74
|
+
lines: buildRoby({ eyes: ["◑", "◐"], mouth: "o", top: "?" }),
|
|
57
75
|
},
|
|
58
76
|
|
|
59
77
|
// ─── sad: error ───────────────────────────────────────────────────────────
|
|
60
78
|
sad: {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
` ${BK}${W} █ ${R}${B}██${R}${W} ${B}██${R}${BK}${W} █ ${R}`,
|
|
65
|
-
` ${BK}${W} █ ╥ ╥ █ ${R}`,
|
|
66
|
-
` ${BK}${W} █ ╰︵╯ █ ${R}`,
|
|
67
|
-
` ${BK}${W} ▀███████▀ ${R}`,
|
|
68
|
-
` ${DI} ╱ ╲ ╱ ╲ ${R}`,
|
|
69
|
-
],
|
|
70
|
-
caption: `${RE}${B}something went wrong${R}`,
|
|
79
|
+
caption: "something went wrong",
|
|
80
|
+
color: C_BAD,
|
|
81
|
+
lines: buildRoby({ eyes: ["╥", "╥"], mouth: "︵" }),
|
|
71
82
|
},
|
|
72
83
|
|
|
73
84
|
// ─── excited: update available ────────────────────────────────────────────
|
|
74
85
|
excited: {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
` ${BK}${W} █ ${R}${B}██${R}${W} ${B}██${R}${BK}${W} █ ${R}`,
|
|
79
|
-
` ${BK}${W} █ ★ ★ █ ${R}`,
|
|
80
|
-
` ${BK}${W} █ ╰◡╯ █ ${R}`,
|
|
81
|
-
` ${BK}${W} ▀███████▀ ${R}`,
|
|
82
|
-
` ${DI} ╱ ╲ ╱ ╲ ${R}`,
|
|
83
|
-
],
|
|
84
|
-
caption: `${BL}${B}new version available!${R}`,
|
|
86
|
+
caption: "new version available!",
|
|
87
|
+
color: C_INFO,
|
|
88
|
+
lines: buildRoby({ eyes: ["★", "★"], mouth: "▽", top: "✦" }),
|
|
85
89
|
},
|
|
86
90
|
|
|
87
91
|
// ─── sleeping: daemon not running ────────────────────────────────────────
|
|
88
92
|
sleeping: {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
` ${BK}${W} █ ${R}${B}██${R}${W} ${B}██${R}${BK}${W} █ ${R}`,
|
|
93
|
-
` ${BK}${W} █ − − █ ${R}`,
|
|
94
|
-
` ${BK}${W} █ ╰_╯ █ ${R}`,
|
|
95
|
-
` ${BK}${W} ▀███████▀ ${R}`,
|
|
96
|
-
` ${DI} ╱ ╲ ╱ ╲ ${R}`,
|
|
97
|
-
],
|
|
98
|
-
caption: `${DI}${B}daemon is not running${R}`,
|
|
93
|
+
caption: "daemon is not running",
|
|
94
|
+
color: rgb(150, 150, 150),
|
|
95
|
+
lines: buildRoby({ eyes: ["−", "−"], mouth: "‿", top: "z z" }),
|
|
99
96
|
},
|
|
100
97
|
};
|
|
101
98
|
|
|
102
|
-
// Print the mascot to stderr (doesn't interfere with piped
|
|
99
|
+
// Print the mascot to stderr (doesn't interfere with piped stdout).
|
|
103
100
|
// mood: 'happy' | 'wave' | 'confused' | 'sad' | 'excited' | 'sleeping'
|
|
104
101
|
export function mascot(mood = "happy", message = "") {
|
|
105
102
|
const def = MOODS[mood] || MOODS.happy;
|
|
106
103
|
const out = [
|
|
107
104
|
"",
|
|
108
105
|
...def.lines,
|
|
109
|
-
` ${def.caption}`,
|
|
110
|
-
message ? ` ${def.color}${message}${R}` : "",
|
|
111
106
|
"",
|
|
112
|
-
|
|
107
|
+
` ${def.color}${bold}${def.caption}${reset}`,
|
|
108
|
+
message ? ` ${dim}${message}${reset}` : "",
|
|
109
|
+
"",
|
|
110
|
+
]
|
|
111
|
+
.filter((l, i, a) => !(l === "" && a[i - 1] === ""))
|
|
112
|
+
.join("\n");
|
|
113
113
|
process.stderr.write(out + "\n");
|
|
114
114
|
}
|
|
115
115
|
|
|
116
116
|
// One-liner for inline use: mascot.confused("apx: unknown command: foo")
|
|
117
|
-
mascot.confused
|
|
118
|
-
mascot.sad
|
|
119
|
-
mascot.happy
|
|
120
|
-
mascot.wave
|
|
121
|
-
mascot.excited
|
|
122
|
-
mascot.sleeping
|
|
117
|
+
mascot.confused = (msg) => mascot("confused", msg);
|
|
118
|
+
mascot.sad = (msg) => mascot("sad", msg);
|
|
119
|
+
mascot.happy = (msg) => mascot("happy", msg);
|
|
120
|
+
mascot.wave = (msg) => mascot("wave", msg);
|
|
121
|
+
mascot.excited = (msg) => mascot("excited", msg);
|
|
122
|
+
mascot.sleeping = (msg) => mascot("sleeping", msg);
|