paseo-aydo 0.3.0 → 0.4.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 +26 -12
- package/README.md +13 -14
- package/client/native-agent-view.ts +1 -1
- package/client/panel/ApprovalsList.tsx +1 -1
- package/licenses/Apache-2.0.txt +201 -0
- package/package.json +5 -5
- package/paseo-plugin.json +1 -1
- package/server/approvals.ts +1 -1
- package/server/bot-home.ts +2 -2
- package/server/host-caps.ts +1 -1
- package/shared/approvals.ts +1 -1
- package/shared/host-caps.ts +1 -1
- package/shared/identity.ts +1 -1
- package/shared/locales/en.json +5 -5
- package/shared/locales/zh-CN.json +5 -5
- package/shared/playbooks.ts +6 -3
- package/shared/rpc.ts +1 -1
- package/shared/skills.ts +5 -3
- package/shared/templates.ts +8 -8
- package/shared/version.ts +1 -1
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
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
|
|
12
|
-
|
|
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
|
-
|
|
16
|
-
|
|
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
|
|
5
|
+
# Aydo
|
|
6
6
|
|
|
7
|
-
Aydo: personal assistants for [Paseo](https://paseo.sh)
|
|
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 |
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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/
|
|
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
|
|
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`.
|
|
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.
|
|
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/
|
|
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();
|
|
@@ -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
|
+
"version": "0.4.0",
|
|
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
|
|
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
|
|
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.
|
|
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
|
}
|
package/server/approvals.ts
CHANGED
|
@@ -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/
|
|
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
|
|
package/server/bot-home.ts
CHANGED
|
@@ -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
|
|
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
|
|
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
|
}
|
package/server/host-caps.ts
CHANGED
|
@@ -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
|
|
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 {
|
package/shared/approvals.ts
CHANGED
|
@@ -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/
|
|
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
|
|
package/shared/host-caps.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* What the host (Paseo or
|
|
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 {
|
package/shared/identity.ts
CHANGED
|
@@ -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 (
|
|
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
|
|
package/shared/locales/en.json
CHANGED
|
@@ -208,7 +208,7 @@
|
|
|
208
208
|
},
|
|
209
209
|
"folders": {
|
|
210
210
|
"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 (
|
|
211
|
+
"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
212
|
"antigravity": "It never asks for approval. Its tools are files, since it cannot take the plugin's MCP server."
|
|
213
213
|
},
|
|
214
214
|
"tool": {
|
|
@@ -1328,13 +1328,13 @@
|
|
|
1328
1328
|
"copyName": "{{name}} copy",
|
|
1329
1329
|
"assistant": {
|
|
1330
1330
|
"name": "Assistant",
|
|
1331
|
-
"title": "
|
|
1332
|
-
"description": "
|
|
1331
|
+
"title": "Everyday helper",
|
|
1332
|
+
"description": "Handles questions, writing and small jobs you pass along."
|
|
1333
1333
|
},
|
|
1334
1334
|
"research": {
|
|
1335
1335
|
"name": "Scout",
|
|
1336
|
-
"title": "
|
|
1337
|
-
"description": "
|
|
1336
|
+
"title": "Research assistant",
|
|
1337
|
+
"description": "Searches the web and your files and returns a short, sourced summary."
|
|
1338
1338
|
}
|
|
1339
1339
|
}
|
|
1340
1340
|
}
|
|
@@ -205,7 +205,7 @@
|
|
|
205
205
|
},
|
|
206
206
|
"folders": {
|
|
207
207
|
"attached": "在项目文件夹中,此助理自己的文件夹会被附加进来,因此写入它时的询问方式与在项目中编辑相同,取决于助理的批准模式(“总是询问”时每次都问)。",
|
|
208
|
-
"devinNotAttached": "
|
|
208
|
+
"devinNotAttached": "在项目文件夹中,只有当宿主注入系统提示时此助理才保留它的身份(原版 Paseo 会丢弃),并且它对自己文件夹的写入每个会话询问一次(宿主尚未附加该文件夹)。",
|
|
209
209
|
"antigravity": "它从不请求批准。它的工具是文件,因为它无法使用插件的 MCP 服务器。"
|
|
210
210
|
},
|
|
211
211
|
"tool": {
|
|
@@ -1300,13 +1300,13 @@
|
|
|
1300
1300
|
"copyName": "{{name}} 副本",
|
|
1301
1301
|
"assistant": {
|
|
1302
1302
|
"name": "助理",
|
|
1303
|
-
"title": "
|
|
1304
|
-
"description": "
|
|
1303
|
+
"title": "日常助理",
|
|
1304
|
+
"description": "处理提问、写作和你随手交给它的小事。"
|
|
1305
1305
|
},
|
|
1306
1306
|
"research": {
|
|
1307
1307
|
"name": "探路者",
|
|
1308
|
-
"title": "
|
|
1309
|
-
"description": "
|
|
1308
|
+
"title": "调研助理",
|
|
1309
|
+
"description": "检索网络和你的文件,给出一份带来源的简要结论。"
|
|
1310
1310
|
}
|
|
1311
1311
|
}
|
|
1312
1312
|
}
|
package/shared/playbooks.ts
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import type { Playbook } from "./bot";
|
|
2
2
|
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
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/
|
|
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
|
|
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
|
|
65
|
-
*
|
|
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[] = [];
|
package/shared/templates.ts
CHANGED
|
@@ -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,
|
|
8
|
-
// (src/lib/
|
|
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: "
|
|
30
|
-
description: "
|
|
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
|
|
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: "
|
|
41
|
-
description: "
|
|
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
|
|
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.
|
|
2
|
+
export const PLUGIN_VERSION = "0.4.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";
|