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 CHANGED
@@ -1,7 +1,7 @@
1
1
  MIT License
2
2
 
3
3
  Copyright (c) 2026 Ondrej Rehacek
4
- Copyright (c) 2026 quickwind
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.
@@ -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 { Text, View } from "react-native";
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 "Bots" row of a host sidebar that hides the Bots project: it opens the Bots screen and carries one dot for
16
- * all bots together (they wait for you, failed, or are working), since their own workspaces are not listed there.
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", params: { host: host.label } })}
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: screenTitle, Component: BotsSurface });
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): it names the host it belongs to and carries one
27
- // status dot for all bots. Where the host hides the Bots project from its sidebar the row stands for it; elsewhere it sits beside it.
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.2.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": "Ondrej Rehacek",
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.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";
@@ -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
- }