paseo-aydo 0.3.0 → 0.4.1

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
- Copyright (c) 2026 Ondrej Rehacek
4
3
  Copyright (c) 2026 Qiang Wei
4
+ Copyright (c) 2026 Ondrej Rehacek
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 CHANGED
@@ -1,16 +1,30 @@
1
- Aydo (offline edition)
1
+ Aydo
2
2
 
3
- Based on oliexe/paseo-bots, Copyright (c) 2026 Ondrej Rehacek, MIT License (see LICENSE).
3
+ Copyright (c) 2026 Qiang Wei. Based on oliexe/paseo-bots, Copyright (c) 2026 Ondrej Rehacek, MIT License (see LICENSE).
4
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
5
+ Parts adapted from OpenMausBot
6
+ ------------------------------
7
+ https://github.com/milind-soni/OpenMausBot
8
+ Copyright 2026 Milind Soni and OpenMausBot contributors
9
+ Licensed under the Apache License, Version 2.0. The licence text is in licenses/Apache-2.0.txt
10
+ (https://www.apache.org/licenses/LICENSE-2.0). The Apache License 2.0 applies to the parts below, which were
11
+ changed from the original:
10
12
 
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.
13
+ - shared/playbooks.ts: choosing playbooks by trigger words (adapted from server/installed-playbooks.ts).
14
+ - shared/skills.ts, scanSkillText: the checks run on a skill before a bot gets it (adapted from shared/skill-md.ts).
14
15
 
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.
16
+ The design of the bots (teams with a Chief of Staff, memory and its journal, playbooks, routines and webhooks,
17
+ saved commands, presets, skill review, the way one bot asks another) also follows OpenMausBot; those parts were
18
+ written independently, and comments in the code say which design a piece follows. A few short constants and
19
+ sentences (memory size limits, webhook limits, one sentence of the prompt about past notes) match it as well.
20
+
21
+ The names OpenMausBot and MausBot and its mascot are trademarks of Supamaus Software Private Limited. This project
22
+ is not affiliated with or endorsed by them and does not use their names for itself; they appear in comments only to
23
+ say which design a piece of code follows.
24
+
25
+ Changes in this edition
26
+ -----------------------
27
+ This edition changes the original: it removes everything that connects to the network, and adds memory upkeep,
28
+ Devin support and bot tools as files, follow-up questions between bots, approvals, project workspaces, and
29
+ Chinese (zh-CN) support. These changes suit deployments with restricted environments, such as no outbound network access
30
+ or limits on which tools a provider may use.
package/README.md CHANGED
@@ -2,21 +2,21 @@
2
2
  <img src="docs/bots.svg" width="512" alt="Six pixel-art assistants">
3
3
  </p>
4
4
 
5
- # Aydo, offline edition
5
+ # Aydo
6
6
 
7
- Aydo: personal assistants for [Paseo](https://paseo.sh) and Irix: give each assistant instructions, a model, memory, skills and tools, then chat with it in its own workspace or let it run routines.
7
+ Aydo: personal assistants for [Paseo](https://paseo.sh): give each assistant instructions, a model, memory, skills and tools, then chat with it in its own workspace or let it run routines.
8
8
 
9
9
  Aydo is based on [oliexe/paseo-bots](https://github.com/oliexe/paseo-bots) 0.2.0 (MIT, by Ondrej Rehacek) for machines that must not send data to cloud services. **The plugin makes no network connections of its own.** Everything that needed one is gone, and a test keeps it that way.
10
10
 
11
11
  ## What is different
12
12
 
13
- | Upstream feature | Offline edition |
13
+ | Upstream feature | Aydo |
14
14
  | --- | --- |
15
15
  | Connected apps through Composio (Gmail, Slack, Notion, 1,000+ more) | Removed, with its relay proxy, API key, sign-in cards and the roles built on it (Inbox, Watch, Ops) |
16
16
  | Avatar pictures drawn by OpenAI | Removed; pixel-art faces, and pictures you upload |
17
17
  | Pictures from an image address | Removed; a picture is kept only as an uploaded `data:` image |
18
18
  | Importing skills from GitHub or a link | Imports from **a folder on this computer** instead |
19
- | Testing MCP servers at a remote address (HTTP, SSE) | The plugin only tests programs and `http://localhost` addresses. A remote server (for example one inside your company) is imported and can be turned on without a test; the assistant's agent is the one that connects to it |
19
+ | Testing MCP servers at a remote address (HTTP, SSE) | The plugin only tests programs and `http://localhost` addresses. A remote server (for example one on a private network) is imported and can be turned on without a test; the assistant's agent is the one that connects to it |
20
20
  | GitHub link on the start screen | Removed |
21
21
 
22
22
  Everything else is unchanged: assistants, memory, routines and webhooks, teams, the skill and MCP library, `/learn`, Paseo's own tools for assistants, and sharing assistants and teams as files.
@@ -41,21 +41,20 @@ Everything else is unchanged: assistants, memory, routines and webhooks, teams,
41
41
 
42
42
  ## Install
43
43
 
44
- Get the plugin folder onto the machine (the offline package unzips into one), then install it from that folder.
44
+ Get the plugin folder onto the machine (the package unzips into one), then install it from that folder.
45
45
 
46
46
  ``bash
47
- irix plugin install /path/to/aydo # Irix
48
- paseo plugin install /path/to/aydo # Paseo
47
+ paseo plugin install /path/to/aydo
49
48
  ``
50
49
 
51
- Turn on **Settings → Plugins → Enable plugins** first. Requires Paseo 0.13 or later. Aydo shows in English and Chinese (zh-CN), following the Paseo/Irix language setting. Irix installs plugins from a local folder only, which is what this edition is for.
50
+ Turn on **Settings → Plugins → Enable plugins** first. Requires Paseo 0.13 or later. Aydo shows in English and Chinese (zh-CN), following the Paseo language setting. Plugins install from a local folder, which is what this edition is for.
52
51
 
53
52
  ## Usage
54
53
 
55
54
  ### Assistants
56
55
 
57
56
  1. Open **Aydo** in Paseo's sidebar and press **New assistant**. Start blank, from a role, from one of your presets, or paste an assistant or team file under **Import**.
58
- 2. Chat with it. Every chat is a thread in the assistant's workspace; **Open in Paseo** in a chat's menu shows it in Paseo's own view. On Irix builds that offer the embedded chat (`ui.AgentView`), an open chat is Irix's own chat view inside the Assistants page, so the model, mode and thinking pickers, slash commands and other plugins' cards work there too; the first message of a new chat is still typed in the plugin's own box, because it builds the assistant's system prompt. On Paseo without it, the plugin's own chat window is used.
57
+ 2. Chat with it. Every chat is a thread in the assistant's workspace; **Open in Paseo** in a chat's menu shows it in Paseo's own view. On hosts that offer an embedded chat (`ui.AgentView`), an open chat is the host's own chat view inside the Assistants page, so the model, mode and thinking pickers, slash commands and other plugins' cards work there too; the first message of a new chat is still typed in the plugin's own box, because it builds the assistant's system prompt. On Paseo without it, the plugin's own chat window is used.
59
58
  3. Open its settings with the panel button at the top right of a chat, or **Open assistant settings** in the assistant's menu. **Identity** holds the name, avatar and voice, **Soul** its standing instructions, **Model** the provider and model, and **Permissions** the approval mode.
60
59
 
61
60
  Assistants can do the setting up too. Ask one in a chat, for example "Create a research team of three assistants with Scout as Chief of Staff", and it shows every change on one card; **Apply changes** makes them. An assistant can create, edit and delete assistants, teams, routines, library skills and MCP servers, and change what new assistants start with. Each assistant's earlier settings stay under **History** in its settings.
@@ -122,22 +121,22 @@ After a task, send `/learn` in the chat, or `/learn <what to focus on>`. The ass
122
121
 
123
122
  Assistants get Paseo's own tools, so you can ask one in a chat to start other agents, open workspaces and terminals, set up schedules or use the browser. An assistant's **Access** settings show whether they're on, and **Turn on** there switches them on for every agent on the host.
124
123
 
125
- ## Building the offline package
124
+ ## Building the package
126
125
 
127
126
  ``bash
128
127
  npm ci --ignore-scripts
129
128
  npm run typecheck && npm test
130
- node scripts/pack-offline.mjs --out ../aydo-offline
129
+ node scripts/pack.mjs --out ../aydo-dist
131
130
  ``
132
131
 
133
132
  The package is a zip of the plugin's source files only (the daemon compiles them when the plugin starts). It has no runtime dependencies, so installing it needs no npm and no internet.
134
133
 
135
- `tests/offline.test.ts` scans the whole source for network code (`fetch`, sockets, WebSocket, a remote address in code, an image loaded from an address) and fails if it finds any outside the one MCP probe, which refuses everything but this computer (remote MCP servers are the agent's to connect to). Run it after every change.
134
+ `tests/no-network.test.ts` scans the whole source for network code (`fetch`, sockets, WebSocket, a remote address in code, an image loaded from an address) and fails if it finds any outside the one MCP probe, which refuses everything but this computer (remote MCP servers are the agent's to connect to). Run it after every change.
136
135
 
137
136
  ## Staying close to upstream
138
137
 
139
- `upstream` is the original repository. Merge it into the `offline` branch from time to time; the removed features will conflict, and the test above will tell you if a merge brings network code back.
138
+ `upstream` is the original repository. Merge it from time to time; the removed features will conflict, and the test above will tell you if a merge brings network code back.
140
139
 
141
140
  ## License
142
141
 
143
- MIT, as upstream. See `LICENSE`. The design follows OpenMausBot (Apache-2.0); see `NOTICE`.
142
+ MIT, as upstream. See `LICENSE`. Parts are adapted from OpenMausBot (Apache-2.0) and the design follows it; see `NOTICE` and `licenses/`.
@@ -2,7 +2,7 @@ import * as hostUi from "@getpaseo/plugin/client/ui";
2
2
  import type { ComponentType } from "react";
3
3
 
4
4
  /**
5
- * Paseo's own chat view for one agent. Irix adds it to `@getpaseo/plugin/client/ui`; stock Paseo
5
+ * Paseo's own chat view for one agent. A host may add it to `@getpaseo/plugin/client/ui`; stock Paseo
6
6
  * does not have it, so the plugin looks for it at run time and keeps its own chat window otherwise.
7
7
  */
8
8
  export interface NativeAgentViewProps {
@@ -20,7 +20,7 @@ interface ApprovalsListProps {
20
20
 
21
21
  /**
22
22
  * Every approval a bot asked for: what waits for the user first (decided here, on the same card as in the chat),
23
- * then the history with who decided and when. The audit file behind it keeps more (docs/superpowers/specs/2026-10-21-approvals-design.md).
23
+ * then the history with who decided and when. The audit file behind it keeps more (docs/specs/2026-10-21-approvals-design.md).
24
24
  */
25
25
  export function ApprovalsList({ colors, compact, onBack, onOpenChat }: ApprovalsListProps) {
26
26
  const { t } = useT();
package/index.client.tsx CHANGED
@@ -24,7 +24,7 @@ export default function contribute(client: PluginClientContext) {
24
24
  else client.addSurface("bots", BotsSurface);
25
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
26
  // one row per plugin and keeps the host in its own picker on the screen, so neither names a host.
27
- client.addSidebarHeaderItem({ id: "bots", title: "Aydo", Component: BotsNav });
27
+ client.addSidebarHeaderItem({ id: "bots", title: messages.message("host.sidebarTitle"), Component: BotsNav });
28
28
  client.addSettingsScreen({ id: "bots", title: "Aydo", icon: "Bot", Component: BotsSettings });
29
29
  client.addCommandCenterItem({
30
30
  id: "open-bots",
@@ -0,0 +1,201 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
177
+
178
+ APPENDIX: How to apply the Apache License to your work.
179
+
180
+ To apply the Apache License to your work, attach the following
181
+ boilerplate notice, with the fields enclosed by brackets "{}"
182
+ replaced with your own identifying information. (Don't include
183
+ the brackets!) The text should be enclosed in the appropriate
184
+ comment syntax for the file format. We also recommend that a
185
+ file or class name and description of purpose be included on the
186
+ same "printed page" as the copyright notice for easier
187
+ identification within third-party archives.
188
+
189
+ Copyright {yyyy} {name of copyright owner}
190
+
191
+ Licensed under the Apache License, Version 2.0 (the "License");
192
+ you may not use this file except in compliance with the License.
193
+ You may obtain a copy of the License at
194
+
195
+ http://www.apache.org/licenses/LICENSE-2.0
196
+
197
+ Unless required by applicable law or agreed to in writing, software
198
+ distributed under the License is distributed on an "AS IS" BASIS,
199
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
+ See the License for the specific language governing permissions and
201
+ limitations under the License.
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "paseo-aydo",
3
- "version": "0.3.0",
3
+ "version": "0.4.1",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
7
7
  "files": [
8
8
  "paseo-plugin.json",
9
9
  "NOTICE",
10
+ "licenses/",
10
11
  "tsconfig.json",
11
12
  "index.client.ts",
12
13
  "index.client.tsx",
@@ -19,7 +20,7 @@
19
20
  "scripts": {
20
21
  "typecheck": "tsc --noEmit",
21
22
  "test": "vitest run",
22
- "pack:offline": "node scripts/pack-offline.mjs"
23
+ "pack": "node scripts/pack.mjs"
23
24
  },
24
25
  "devDependencies": {
25
26
  "@getpaseo/client": "^0.14.0",
@@ -33,7 +34,7 @@
33
34
  "vitest": "^4.1.11",
34
35
  "zod": "^4.4.3"
35
36
  },
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.",
37
+ "description": "Personal assistants for Paseo: instructions, a model, memory, routines, teams, skills and local MCP tools. Makes no network connections of its own.",
37
38
  "license": "MIT",
38
39
  "author": "Qiang Wei",
39
40
  "keywords": [
@@ -41,7 +42,6 @@
41
42
  "paseo-plugin",
42
43
  "bots",
43
44
  "agents",
44
- "mcp",
45
- "offline"
45
+ "mcp"
46
46
  ]
47
47
  }
package/paseo-plugin.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "id": "aydo",
3
- "description": "Aydo: personal assistants with their own instructions, agent, memory, routines, skills and local tools. Offline edition: no network connections of its own.",
3
+ "description": "Aydo: personal assistants with their own instructions, agent, memory, routines, skills and local tools. No network connections of its own.",
4
4
  "requirements": {
5
5
  "paseo": ">=0.13.0"
6
6
  }
@@ -13,7 +13,7 @@ import { workspaceOfChat } from "./workspaces";
13
13
 
14
14
  // A bot puts a matter to the user and waits. The card is decided by the user only (the RPCs in index.server.ts); the
15
15
  // plugin stops the asking chat as far as it can, holds what it would send into it (server/chat-send.ts), checks an
16
- // approval a bot cites, and records everything in the audit (docs/superpowers/specs/2026-10-21-approvals-design.md).
16
+ // approval a bot cites, and records everything in the audit (docs/specs/2026-10-21-approvals-design.md).
17
17
 
18
18
  const INTERRUPT_TEXT = "[Aydo] STOP: your request for the user's approval is waiting. Do not run anything else; reply only with the word WAITING. The user's answer will arrive here as a message.";
19
19
 
@@ -16,14 +16,14 @@ export function pluginDataPath(): string {
16
16
  /**
17
17
  * One folder for every bot that uses the managed folder. Paseo files each agent
18
18
  * under the workspace of its folder, so sharing it keeps all bot chats in a
19
- * single workspace; Paseo names the project after the folder, hence "Aydo" (it was "Bots" until offline.65).
19
+ * single workspace; Paseo names the project after the folder, hence "Aydo" (it was "Bots" until build 65).
20
20
  */
21
21
  export function botsHomePath(): string {
22
22
  // Nested because macOS folders are case-insensitive and "bots" held per-bot folders in v0.1.
23
23
  return join(pluginDataPath(), "shared", "Aydo");
24
24
  }
25
25
 
26
- /** The folder of versions before offline.65. Kept as a link to botsHomePath so chats and workspaces made there still work. */
26
+ /** The folder of versions before build 65. Kept as a link to botsHomePath so chats and workspaces made there still work. */
27
27
  function previousHomePath(): string {
28
28
  return join(pluginDataPath(), "shared", "Bots");
29
29
  }
@@ -1,7 +1,7 @@
1
1
  import { hostCaps, type HostCaps } from "../shared/host-caps";
2
2
 
3
3
  /**
4
- * What the host announces about itself in the IRIX_HOST_CAPS environment variable (a JSON object, set by Irix
4
+ * What the host announces about itself in the IRIX_HOST_CAPS environment variable (a JSON object, set by the host
5
5
  * when it starts). Stock Paseo sets nothing, so every capability is false there.
6
6
  */
7
7
  export function readHostCaps(env: Record<string, string | undefined> = process.env): HostCaps {
@@ -1,4 +1,5 @@
1
1
  import { lstat, mkdir } from "node:fs/promises";
2
+ import { join } from "node:path";
2
3
  import { isBotsProjectRoot } from "../shared/chat";
3
4
  import { allPages } from "../shared/pages";
4
5
  import { grantScope, workspaceInputProblem, folderNameFor, type CreateWorkspaceInput } from "../shared/workspaces";
@@ -109,7 +110,7 @@ export async function createWorkspace(paseo: PaseoApi, project: ProjectRef, inpu
109
110
  const handle = await paseo.workspaces.create({ title: input.title, source: { kind: "worktree", projectId: project.id, ...(input.base ? { baseBranch: input.base } : {}), branchName } });
110
111
  return `${created(input.title, handle.id, handle.directory ?? "unknown")} Paseo adds a number to the branch name when it was taken; run git branch in the folder to see the real one.`;
111
112
  }
112
- const path = `${project.root.replace(/[\\/]+$/, "")}/${folderNameFor(input.title)}`;
113
+ const path = join(project.root, folderNameFor(input.title));
113
114
  const entries = await workspaceEntries(paseo);
114
115
  const have = entries.find((entry) => !isArchiving(entry) && entry.projectId === project.id && samePath(directoryOf(entry), path));
115
116
  if (have) return `Workspace "${input.title}" already exists: id ${have.id}, folder ${directoryOf(have)}.`;
@@ -3,7 +3,7 @@ import { botToolName } from "./bot-tools";
3
3
  import { englishTranslate, type Translate } from "./translate";
4
4
 
5
5
  // An approval is a matter a bot puts to the user and then waits for. Unlike a proposal card it blocks the asking
6
- // chat until the user decides, and every one is recorded for audit (docs/superpowers/specs/2026-10-21-approvals-design.md).
6
+ // chat until the user decides, and every one is recorded for audit (docs/specs/2026-10-21-approvals-design.md).
7
7
 
8
8
  export const ApprovalStatusSchema = z.enum(["pending", "approved", "rejected", "withdrawn"]);
9
9
 
@@ -1,5 +1,5 @@
1
1
  /**
2
- * What the host (Paseo or Irix) does for providers that the plugin cannot see for itself. Everything is
2
+ * What the host (Paseo or another host) does for providers that the plugin cannot see for itself. Everything is
3
3
  * false until the host says otherwise, which is how stock Paseo behaves.
4
4
  */
5
5
  export interface HostCaps {
@@ -2,7 +2,7 @@ import type { PromptSection } from "./bot";
2
2
  import { NO_HOST_CAPS, type HostCaps } from "./host-caps";
3
3
 
4
4
  // A bot's identity (persona, standing instructions, memory, skills) reaches Devin as an always-on
5
- // rule file in the bot's folder: stock Paseo gives Devin no system prompt channel over ACP (Irix injects one into
5
+ // rule file in the bot's folder: stock Paseo gives Devin no system prompt channel over ACP (a host may inject one into
6
6
  // the first message), but Devin reads `.devin/rules/*.md` that say `trigger: always_on`, and takes a snapshot
7
7
  // when a chat is created.
8
8
 
@@ -8,6 +8,7 @@
8
8
  "settingsUnreadable": "Settings can't be read."
9
9
  },
10
10
  "host": {
11
+ "sidebarTitle": "Aydo",
11
12
  "openBots": "Open Assistants",
12
13
  "newBot": "New assistant",
13
14
  "learn": "Save what the assistant just did as a skill",
@@ -208,7 +209,7 @@
208
209
  },
209
210
  "folders": {
210
211
  "attached": "In a project folder this assistant's own folder is attached, so writes to it ask exactly what edits in the project ask in the assistant's approval mode (Always ask asks every time).",
211
- "devinNotAttached": "In a project folder this assistant keeps its identity only if the host injects the system prompt (Irix does, stock Paseo drops it), and its writes to its own folder ask once per session (the host does not attach it yet).",
212
+ "devinNotAttached": "In a project folder this assistant keeps its identity only if the host injects the system prompt (stock Paseo drops it), and its writes to its own folder ask once per session (the host does not attach it yet).",
212
213
  "antigravity": "It never asks for approval. Its tools are files, since it cannot take the plugin's MCP server."
213
214
  },
214
215
  "tool": {
@@ -1328,13 +1329,13 @@
1328
1329
  "copyName": "{{name}} copy",
1329
1330
  "assistant": {
1330
1331
  "name": "Assistant",
1331
- "title": "General assistant",
1332
- "description": "Answers questions, drafts text, and takes on whatever you hand it."
1332
+ "title": "Everyday helper",
1333
+ "description": "Handles questions, writing and small jobs you pass along."
1333
1334
  },
1334
1335
  "research": {
1335
1336
  "name": "Scout",
1336
- "title": "Researcher",
1337
- "description": "Digs through the web and your files, and comes back with a sourced brief."
1337
+ "title": "Research assistant",
1338
+ "description": "Searches the web and your files and returns a short, sourced summary."
1338
1339
  }
1339
1340
  }
1340
1341
  }
@@ -8,6 +8,7 @@
8
8
  "settingsUnreadable": "无法读取设置。"
9
9
  },
10
10
  "host": {
11
+ "sidebarTitle": "Aydo 个人助理",
11
12
  "openBots": "打开助理",
12
13
  "newBot": "新建助理",
13
14
  "learn": "把助理刚做的事存成技能",
@@ -205,7 +206,7 @@
205
206
  },
206
207
  "folders": {
207
208
  "attached": "在项目文件夹中,此助理自己的文件夹会被附加进来,因此写入它时的询问方式与在项目中编辑相同,取决于助理的批准模式(“总是询问”时每次都问)。",
208
- "devinNotAttached": "在项目文件夹中,只有当宿主注入系统提示时此助理才保留它的身份(Irix 会注入,原版 Paseo 会丢弃),并且它对自己文件夹的写入每个会话询问一次(宿主尚未附加该文件夹)。",
209
+ "devinNotAttached": "在项目文件夹中,只有当宿主注入系统提示时此助理才保留它的身份(原版 Paseo 会丢弃),并且它对自己文件夹的写入每个会话询问一次(宿主尚未附加该文件夹)。",
209
210
  "antigravity": "它从不请求批准。它的工具是文件,因为它无法使用插件的 MCP 服务器。"
210
211
  },
211
212
  "tool": {
@@ -1300,13 +1301,13 @@
1300
1301
  "copyName": "{{name}} 副本",
1301
1302
  "assistant": {
1302
1303
  "name": "助理",
1303
- "title": "通用助理",
1304
- "description": "回答问题、起草文本,并处理你交给它的任何事情。"
1304
+ "title": "日常助理",
1305
+ "description": "处理提问、写作和你随手交给它的小事。"
1305
1306
  },
1306
1307
  "research": {
1307
1308
  "name": "探路者",
1308
- "title": "研究员",
1309
- "description": "搜索网络和你的文件,带回一份附有来源的简报。"
1309
+ "title": "调研助理",
1310
+ "description": "检索网络和你的文件,给出一份带来源的简要结论。"
1310
1311
  }
1311
1312
  }
1312
1313
  }
@@ -1,8 +1,11 @@
1
1
  import type { Playbook } from "./bot";
2
2
 
3
- // OpenMausBot's playbooks: process guidance with trigger words. A chat gets a
4
- // playbook only when one of its triggers appears in the job (the chat's first
5
- // message), so unrelated guidance stays out of the prompt.
3
+ // Playbooks: process guidance with trigger words. A chat gets a playbook only when one of its triggers appears in the job (the
4
+ // chat's first message), so unrelated guidance stays out of the prompt.
5
+ //
6
+ // Adapted from OpenMausBot's server/installed-playbooks.ts (Apache License 2.0, Copyright 2026 Milind Soni and OpenMausBot
7
+ // contributors; see NOTICE and licenses/Apache-2.0.txt). Changed here: renamed and reorganised, a different matching
8
+ // framing text and language handling.
6
9
 
7
10
  const MAX_SELECTED = 3;
8
11
  const MAX_CHARS = 24_000;
package/shared/rpc.ts CHANGED
@@ -351,7 +351,7 @@ export const commandRemoveRpc = defineRpc({
351
351
  output: z.object({ ok: z.boolean() }),
352
352
  });
353
353
 
354
- // ---------------------------------------------------------------- approvals (docs/superpowers/specs/2026-10-21-approvals-design.md)
354
+ // ---------------------------------------------------------------- approvals (docs/specs/2026-10-21-approvals-design.md)
355
355
 
356
356
  const ApprovalId = z.string().regex(/^a-[a-f0-9]{10}$/);
357
357
  const AuditEventSchema = z.object({
package/shared/skills.ts CHANGED
@@ -3,7 +3,7 @@ import { englishTranslate, type Translate } from "./translate";
3
3
  /** An absolute path on this computer: `/…`, `~`, a Windows drive (`C:\…`) or a UNC path (`\\server\…`). */
4
4
  const LOCAL_FOLDER = /^(\/|~([\\/]|$)|[A-Za-z]:[\\/]|\\\\)/;
5
5
 
6
- /** Whether a skill's source is a folder on this computer, which an update can read again offline. */
6
+ /** Whether a skill's source is a folder on this computer, which an update can read again without a network. */
7
7
  export function isLocalFolder(source: string): boolean {
8
8
  return LOCAL_FOLDER.test(source.trim());
9
9
  }
@@ -61,8 +61,10 @@ export function expandLearn(text: string): string | null {
61
61
  }
62
62
 
63
63
  /**
64
- * Things worth a second look before a skill reaches a bot, as OpenMausBot's
65
- * scanSkillText flags them. They warn; the user decides.
64
+ * Things worth a second look before a skill reaches a bot. They warn; the user decides.
65
+ *
66
+ * Adapted from OpenMausBot's scanSkillText (shared/skill-md.ts; Apache License 2.0, Copyright 2026 Milind Soni and OpenMausBot
67
+ * contributors; see NOTICE and licenses/Apache-2.0.txt). Changed here: different thresholds and wording, two more checks.
66
68
  */
67
69
  export function scanSkillText(text: string, t: Translate = englishTranslate): string[] {
68
70
  const warnings: string[] = [];
@@ -4,8 +4,8 @@ import { withToolModeFor } from "./tools-mode";
4
4
  import { englishTranslate, type Translate } from "./translate";
5
5
  import { newBotId, type Bot, type Preset } from "./bot";
6
6
 
7
- // Starting points for a new bot, from OpenMausBot's New bot roles
8
- // (src/lib/bot-roles.ts): a name, a job and standing instructions.
7
+ // Starting points for a new bot: a name, a job and standing instructions. The idea of ready-made roles follows OpenMausBot's
8
+ // (src/lib/ready-bots.ts); the texts here were rewritten for Aydo (see NOTICE).
9
9
 
10
10
  export interface BotTemplate {
11
11
  id: string;
@@ -26,24 +26,24 @@ export const BOT_TEMPLATES: readonly BotTemplate[] = [
26
26
  {
27
27
  id: "assistant",
28
28
  name: "Assistant",
29
- title: "General assistant",
30
- description: "Answers questions, drafts text, and takes on whatever you hand it.",
29
+ title: "Everyday helper",
30
+ description: "Handles questions, writing and small jobs you pass along.",
31
31
  nameKey: "templates.assistant.name",
32
32
  titleKey: "templates.assistant.title",
33
33
  descriptionKey: "templates.assistant.description",
34
34
  avatarSeed: "assistant-7",
35
- soul: "You are a capable, plain-spoken assistant. Ask one clarifying question when a request is ambiguous; otherwise do the work and show the result. Keep replies short and concrete.",
35
+ soul: "You are a practical assistant who speaks plainly. If a request could mean two different things, check with the user first; if it is clear, just do it and report what you did. Be brief and specific.",
36
36
  },
37
37
  {
38
38
  id: "research",
39
39
  name: "Scout",
40
- title: "Researcher",
41
- description: "Digs through the web and your files, and comes back with a sourced brief.",
40
+ title: "Research assistant",
41
+ description: "Searches the web and your files and returns a short, sourced summary.",
42
42
  nameKey: "templates.research.name",
43
43
  titleKey: "templates.research.title",
44
44
  descriptionKey: "templates.research.description",
45
45
  avatarSeed: "research-5",
46
- soul: "You research questions and return a brief: the answer first, then the evidence with links, then what you could not verify. Prefer primary sources. Say clearly when sources disagree. Never present a guess as a finding.",
46
+ soul: "You investigate questions and write up what you find. Lead with the conclusion, then the supporting evidence with links, then anything still uncertain. Favor original sources, point out where they conflict, and never state a guess as a fact.",
47
47
  },
48
48
  ];
49
49
 
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.3.0";
2
+ export const PLUGIN_VERSION = "0.4.1";
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";