@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.
Files changed (68) hide show
  1. package/README.md +11 -0
  2. package/package.json +1 -1
  3. package/src/core/mascot.js +80 -80
  4. package/src/interfaces/web/dist/assets/index-CQc_5t8F.js +629 -0
  5. package/src/interfaces/web/dist/assets/index-CQc_5t8F.js.map +1 -0
  6. package/src/interfaces/web/dist/assets/{index-B6sYFQFa.css → index-hwxuTPcK.css} +1 -1
  7. package/src/interfaces/web/dist/index.html +2 -2
  8. package/src/interfaces/web/src/App.tsx +15 -24
  9. package/src/interfaces/web/src/components/ModelCombobox.tsx +1 -1
  10. package/src/interfaces/web/src/components/Roby.tsx +96 -0
  11. package/src/interfaces/web/src/components/TelegramChannelDialog.tsx +11 -11
  12. package/src/interfaces/web/src/components/TelegramSendDialog.tsx +5 -5
  13. package/src/interfaces/web/src/components/chat/MessageBubble.tsx +2 -2
  14. package/src/interfaces/web/src/components/chat/ModelPicker.tsx +5 -5
  15. package/src/interfaces/web/src/components/chat/ToolCall.tsx +23 -19
  16. package/src/interfaces/web/src/components/code/CodeArtifactsTab.tsx +10 -10
  17. package/src/interfaces/web/src/components/code/CodeContextTab.tsx +7 -7
  18. package/src/interfaces/web/src/components/code/CodeProjectPicker.tsx +3 -2
  19. package/src/interfaces/web/src/components/common/TabNav.tsx +3 -2
  20. package/src/interfaces/web/src/components/config/ConfigTabsEditor.tsx +3 -2
  21. package/src/interfaces/web/src/components/config/GlobalConfigEditor.tsx +2 -2
  22. package/src/interfaces/web/src/components/config/global-config-sections.ts +9 -9
  23. package/src/interfaces/web/src/components/config/project-config-sections.ts +61 -54
  24. package/src/interfaces/web/src/components/deck/DaemonCard.tsx +6 -5
  25. package/src/interfaces/web/src/components/inputs/KeyValueList.tsx +5 -4
  26. package/src/interfaces/web/src/components/inputs/VarTokenInput.tsx +3 -3
  27. package/src/interfaces/web/src/components/layout/ProjectSidebar.tsx +22 -9
  28. package/src/interfaces/web/src/components/settings/AdvancedPanel.tsx +1 -1
  29. package/src/interfaces/web/src/components/settings/AppearancePanel.tsx +1 -1
  30. package/src/interfaces/web/src/components/settings/DefaultRouterCard.tsx +14 -14
  31. package/src/interfaces/web/src/components/settings/DevicesPanel.tsx +3 -3
  32. package/src/interfaces/web/src/components/settings/EnginesPanel.tsx +7 -7
  33. package/src/interfaces/web/src/components/settings/IdentityPanel.tsx +2 -2
  34. package/src/interfaces/web/src/components/settings/MemoryPanel.tsx +37 -37
  35. package/src/interfaces/web/src/components/settings/SkillsInspectorPanel.tsx +44 -35
  36. package/src/interfaces/web/src/components/settings/SuperAgentPanel.tsx +5 -5
  37. package/src/interfaces/web/src/components/settings/TelegramChannelsPanel.tsx +3 -3
  38. package/src/interfaces/web/src/components/settings/TelegramContactsPanel.tsx +1 -1
  39. package/src/interfaces/web/src/components/settings/TelegramGlobalPanel.tsx +3 -3
  40. package/src/interfaces/web/src/components/settings/TelegramRolesPanel.tsx +1 -1
  41. package/src/interfaces/web/src/components/settings/providers/ProviderCard.tsx +6 -6
  42. package/src/interfaces/web/src/components/settings/providers/ProviderModal.tsx +36 -36
  43. package/src/interfaces/web/src/components/voice/VoiceProviderList.tsx +15 -14
  44. package/src/interfaces/web/src/components/voice/VoiceProviderModal.tsx +22 -22
  45. package/src/interfaces/web/src/components/voice/VoiceSttCard.tsx +18 -17
  46. package/src/interfaces/web/src/components/voice/VoiceTestCard.tsx +19 -18
  47. package/src/interfaces/web/src/hooks/useChat.ts +6 -5
  48. package/src/interfaces/web/src/i18n/en.ts +517 -1
  49. package/src/interfaces/web/src/i18n/es.ts +517 -1
  50. package/src/interfaces/web/src/i18n/index.ts +1 -1
  51. package/src/interfaces/web/src/lib/api/voice.ts +5 -5
  52. package/src/interfaces/web/src/screens/ProjectScreen.tsx +14 -1
  53. package/src/interfaces/web/src/screens/SettingsScreen.tsx +1 -1
  54. package/src/interfaces/web/src/screens/base/AgentDefaultsTab.tsx +8 -8
  55. package/src/interfaces/web/src/screens/base/ComingSoon.tsx +3 -2
  56. package/src/interfaces/web/src/screens/modules/CodeScreen.tsx +12 -12
  57. package/src/interfaces/web/src/screens/modules/DeckScreen.tsx +15 -15
  58. package/src/interfaces/web/src/screens/modules/DesktopScreen.tsx +37 -37
  59. package/src/interfaces/web/src/screens/modules/VoiceScreen.tsx +8 -8
  60. package/src/interfaces/web/src/screens/project/AgentBrainGraph.tsx +16 -10
  61. package/src/interfaces/web/src/screens/project/AgentDetailScreen.tsx +25 -24
  62. package/src/interfaces/web/src/screens/project/ChatTab.tsx +2 -2
  63. package/src/interfaces/web/src/screens/project/ConfigTab.tsx +3 -3
  64. package/src/interfaces/web/src/screens/project/McpsTab.tsx +6 -9
  65. package/src/interfaces/web/src/screens/project/RoutinesTab.tsx +66 -52
  66. package/src/interfaces/web/src/screens/project/TelegramTab.tsx +1 -1
  67. package/src/interfaces/web/dist/assets/index-DsADpObh.js +0 -633
  68. 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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentprojectcontext/apx",
3
- "version": "1.37.0",
3
+ "version": "1.38.0",
4
4
  "description": "APX — unified CLI + daemon for the Agent Project Context (APC) standard.",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -1,122 +1,122 @@
1
- // APX mascot — a panda that appears in different moods across the CLI.
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
- // Each mood: [panda lines, caption]
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
- color: GR,
20
- lines: [
21
- ` ${BK}${W} ▄███████▄ ${R}`,
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
- color: CY,
34
- lines: [
35
- ` ${BK}${W} ▄███████▄ ${R} ${DI}/)${R}`,
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
- color: YE,
48
- lines: [
49
- ` ${BK}${W} ▄███████▄ ${R} ${YE}?${R}`,
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
- color: RE,
62
- lines: [
63
- ` ${BK}${W} ▄███████▄ ${R}`,
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
- color: BL,
76
- lines: [
77
- ` ${BK}${W} ▄███████▄ ${R} ${BL}↑${R}`,
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
- color: DI,
90
- lines: [
91
- ` ${BK}${W} ▄███████▄ ${R} ${DI}z z z${R}`,
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 output).
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
- ].join("\n");
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 = (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);
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);