paseo-aydo 0.2.0 → 0.3.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/LICENSE +1 -1
- package/NOTICE +16 -0
- package/client/BotsNav.tsx +5 -17
- package/index.client.tsx +3 -4
- package/package.json +3 -2
- package/shared/version.ts +1 -1
- package/client/nav-hosts.ts +0 -14
package/LICENSE
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
MIT License
|
|
2
2
|
|
|
3
3
|
Copyright (c) 2026 Ondrej Rehacek
|
|
4
|
-
Copyright (c) 2026
|
|
4
|
+
Copyright (c) 2026 Qiang Wei
|
|
5
5
|
|
|
6
6
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
7
|
of this software and associated documentation files (the "Software"), to deal
|
package/NOTICE
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
Aydo (offline edition)
|
|
2
|
+
|
|
3
|
+
Based on oliexe/paseo-bots, Copyright (c) 2026 Ondrej Rehacek, MIT License (see LICENSE).
|
|
4
|
+
|
|
5
|
+
The design of the bots (teams with a Chief of Staff, memory and its journal, playbooks,
|
|
6
|
+
routines and webhooks, saved commands, presets, skill review, the way one bot asks another)
|
|
7
|
+
follows OpenMausBot, https://github.com/milind-soni/OpenMausBot, licensed under the
|
|
8
|
+
Apache License 2.0. Where this code is derived from it, the Apache License 2.0 applies to
|
|
9
|
+
that part: https://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
|
|
11
|
+
The names OpenMausBot and MausBot and its mascot are trademarks of Supamaus Software Private
|
|
12
|
+
Limited. This project is not affiliated with or endorsed by them and does not use their
|
|
13
|
+
names for itself; they appear in comments only to say which design a piece of code follows.
|
|
14
|
+
|
|
15
|
+
This edition changes the original: it removes everything that connects to the network, and
|
|
16
|
+
adds memory upkeep, Devin support and bot tools as files, and follow-up questions between bots.
|
package/client/BotsNav.tsx
CHANGED
|
@@ -2,18 +2,16 @@ import type { PluginSidebarItemProps } from "@getpaseo/plugin/client";
|
|
|
2
2
|
import { useWorkspace } from "@getpaseo/plugin/client";
|
|
3
3
|
import { SidebarRow } from "@getpaseo/plugin/client/ui";
|
|
4
4
|
import { useEffect, useState } from "react";
|
|
5
|
-
import {
|
|
6
|
-
import { Icon } from "@getpaseo/plugin/client/react-native";
|
|
5
|
+
import { View } from "react-native";
|
|
7
6
|
import { botIdOfDirectory } from "../shared/chat";
|
|
8
7
|
import { bucketLabel, botsBadge } from "../shared/sidebar";
|
|
9
8
|
import { useApprovals } from "./approvals";
|
|
10
9
|
import { useBotHost, useHostWorkspaces } from "./data";
|
|
11
10
|
import { useT } from "./i18n/use-t";
|
|
12
|
-
import { shortHostName } from "./nav-hosts";
|
|
13
11
|
|
|
14
12
|
/**
|
|
15
|
-
* The
|
|
16
|
-
*
|
|
13
|
+
* The Aydo row of the sidebar: it opens the Aydo screen and carries one dot for all assistants together (they wait for you,
|
|
14
|
+
* failed, or are working). It names no host: the host shows one row for the plugin, and the screen has its own host picker.
|
|
17
15
|
*/
|
|
18
16
|
export function BotsNav({ theme, host, currentScreen, openScreen }: PluginSidebarItemProps) {
|
|
19
17
|
const { t } = useT();
|
|
@@ -32,19 +30,9 @@ export function BotsNav({ theme, host, currentScreen, openScreen }: PluginSideba
|
|
|
32
30
|
<View>
|
|
33
31
|
<SidebarRow
|
|
34
32
|
icon="Bot"
|
|
35
|
-
onPress={() => openScreen({ screenId: "bots"
|
|
33
|
+
onPress={() => openScreen({ screenId: "bots" })}
|
|
36
34
|
active={currentScreen?.screenId === "bots"}
|
|
37
|
-
trailing={
|
|
38
|
-
<View style={{ flexDirection: "row", alignItems: "center", gap: 6, flexShrink: 1 }}>
|
|
39
|
-
{/* "(server icon, host name)" after the row's name, cut short so a long name leaves room for the dot. */}
|
|
40
|
-
<View accessibilityLabel={host.label} style={{ flexDirection: "row", alignItems: "center", gap: 3, flexShrink: 1 }}>
|
|
41
|
-
<Text numberOfLines={1} style={{ color: colors.foregroundMuted, fontSize: 12 }}>(</Text>
|
|
42
|
-
<Icon name="Server" size={12} color={colors.foregroundMuted} />
|
|
43
|
-
<Text numberOfLines={1} style={{ color: colors.foregroundMuted, fontSize: 12, flexShrink: 1 }}>{shortHostName(host.label)})</Text>
|
|
44
|
-
</View>
|
|
45
|
-
{color ? <View accessibilityLabel={waitingApprovals > 0 ? t("sidebar.approvalsWaiting", { count: waitingApprovals }) : t("sidebar.statusLabel", { status: badge ? bucketLabel(badge, t) : "" })} style={{ width: 8, height: 8, borderRadius: 4, backgroundColor: color }} /> : null}
|
|
46
|
-
</View>
|
|
47
|
-
}
|
|
35
|
+
trailing={color ? <View accessibilityLabel={waitingApprovals > 0 ? t("sidebar.approvalsWaiting", { count: waitingApprovals }) : t("sidebar.statusLabel", { status: badge ? bucketLabel(badge, t) : "" })} style={{ width: 8, height: 8, borderRadius: 4, backgroundColor: color }} /> : null}
|
|
48
36
|
/>
|
|
49
37
|
{botWorkspaces.map((workspace) => (
|
|
50
38
|
<StatusProbe key={workspace.id} workspaceId={workspace.id} report={report} />
|
package/index.client.tsx
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import type { PluginClientContext } from "@getpaseo/plugin/client";
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
import { BotsNav } from "./client/BotsNav";
|
|
4
|
-
import { screenTitle } from "./client/nav-hosts";
|
|
5
4
|
import { BotsSurface } from "./client/BotsSurface";
|
|
6
5
|
import { ApprovalCard } from "./client/chat/stream/ApprovalCard";
|
|
7
6
|
import { ProposalCard } from "./client/chat/stream/ProposalCard";
|
|
@@ -21,10 +20,10 @@ export default function contribute(client: PluginClientContext) {
|
|
|
21
20
|
void client.rpc(helloRpc, {}).catch(() => {});
|
|
22
21
|
const removeTooltips = installTooltips();
|
|
23
22
|
// A newer host titles the screen; an older one only knows surfaces (which are titled by their id).
|
|
24
|
-
if (typeof client.addScreen === "function") client.addScreen({ id: "bots", title:
|
|
23
|
+
if (typeof client.addScreen === "function") client.addScreen({ id: "bots", title: "Aydo", Component: BotsSurface });
|
|
25
24
|
else client.addSurface("bots", BotsSurface);
|
|
26
|
-
// The row is ours on every host (Paseo 0.13 and later have addSidebarHeaderItem):
|
|
27
|
-
//
|
|
25
|
+
// The row is ours on every host (Paseo 0.13 and later have addSidebarHeaderItem): one status dot for all assistants. The host shows
|
|
26
|
+
// one row per plugin and keeps the host in its own picker on the screen, so neither names a host.
|
|
28
27
|
client.addSidebarHeaderItem({ id: "bots", title: "Aydo", Component: BotsNav });
|
|
29
28
|
client.addSettingsScreen({ id: "bots", title: "Aydo", icon: "Bot", Component: BotsSettings });
|
|
30
29
|
client.addCommandCenterItem({
|
package/package.json
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "paseo-aydo",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
7
7
|
"files": [
|
|
8
8
|
"paseo-plugin.json",
|
|
9
|
+
"NOTICE",
|
|
9
10
|
"tsconfig.json",
|
|
10
11
|
"index.client.ts",
|
|
11
12
|
"index.client.tsx",
|
|
@@ -34,7 +35,7 @@
|
|
|
34
35
|
},
|
|
35
36
|
"description": "Personal bots for Paseo and Irix: instructions, a model, memory, routines, teams, skills and local MCP tools. Offline edition: makes no network connections of its own.",
|
|
36
37
|
"license": "MIT",
|
|
37
|
-
"author": "
|
|
38
|
+
"author": "Qiang Wei",
|
|
38
39
|
"keywords": [
|
|
39
40
|
"paseo",
|
|
40
41
|
"paseo-plugin",
|
package/shared/version.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** The plugin's version, shown on the splash. Kept in step with package.json by a test. */
|
|
2
|
-
export const PLUGIN_VERSION = "0.
|
|
2
|
+
export const PLUGIN_VERSION = "0.3.0";
|
|
3
3
|
|
|
4
4
|
/** The plugin's id (paseo-plugin.json); timeline items it appends carry it as their pluginId. */
|
|
5
5
|
export const PLUGIN_ID = "aydo";
|
package/client/nav-hosts.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/** A host's name cut to `max` characters with "..." after it, so a long name does not push the row's status dot out. */
|
|
2
|
-
export function shortHostName(label: string, max = 14): string {
|
|
3
|
-
const name = label.trim();
|
|
4
|
-
const chars = Array.from(name);
|
|
5
|
-
return chars.length <= max ? name : `${chars.slice(0, max).join("").trimEnd()}...`;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* The Aydo screen's title, the product name with the host name after it in brackets, when the row that opened it named its host in the params, else "Aydo" (the Command Center
|
|
10
|
-
* opens the screen without one). The header takes text only, so the host icon of the sidebar row cannot go here.
|
|
11
|
-
*/
|
|
12
|
-
export function screenTitle(params: Record<string, string>): string {
|
|
13
|
-
return params.host?.trim() ? `Aydo (${shortHostName(params.host, 24)})` : "Aydo";
|
|
14
|
-
}
|