@anhlp/alp-paseo 0.0.0-beta.2 → 0.0.1-beta.3

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/README.md CHANGED
@@ -45,13 +45,13 @@ and project overrides.
45
45
 
46
46
  ## Install
47
47
 
48
- This is the beta `0.0.0-beta.2` (until it is on npm, `@beta` installs `0.0.0-beta.1`; check with
48
+ This is the beta `0.0.1-beta.3` (until it is on npm, `@beta` installs `0.0.0-beta.2`, which Paseo 0.12 refuses; check with
49
49
  `npm view @anhlp/alp-paseo dist-tags`); name it when you install (`@beta`, or
50
- exactly `@0.0.0-beta.2`). See the
50
+ exactly `@0.0.1-beta.3`). See the
51
51
  [release notes](https://github.com/phucanh08/alp/blob/main/docs/alp/beta-release-notes.md) and
52
52
  [install, upgrade and removal steps](https://github.com/phucanh08/alp/blob/main/docs/alp/beta-install.md).
53
53
 
54
- Requires Paseo `>=0.11.1 <0.12.0`, Node.js 22 (22.12 or later) or 24 on Linux or macOS
54
+ Requires Paseo `>=0.11.1 <0.13.0` (0.11.x or 0.12.x), Node.js 22 (22.12 or later) or 24 on Linux or macOS
55
55
  (Windows and Node.js 26 are experimental), and an authenticated native Codex or Claude Code
56
56
  executable on PATH.
57
57
 
@@ -129,7 +129,7 @@ for existing projects, model selection, permissions, and runtime limitations.
129
129
 
130
130
  ## Remote mode (deferred, not in the beta)
131
131
 
132
- Remote mode is **not part of the beta (`0.0.0-beta.2`)**: it needs `@anhlp/alp-gateway`, which is not
132
+ Remote mode is **not part of the beta (`0.0.1-beta.3`)**: it needs `@anhlp/alp-gateway`, which is not
133
133
  published. The text below describes the code in this repository for development only.
134
134
 
135
135
  To use ALP running on another machine, start the daemon process that loads this plugin with
@@ -170,6 +170,18 @@ Do not use `--legacy-peer-deps` for a standalone installation unless you supply
170
170
  peers explicitly. The binary is also discoverable on PATH, so registration is optional
171
171
  for a global install. For a local install, run
172
172
  `./node_modules/.bin/alp-web-integration --register` with the intended `ALP_HOME`.
173
+
174
+ A plugin directory managed by `paseo plugin add npm:…` is not a standalone web
175
+ installation. Paseo installs it without peers and supplies `@getpaseo/plugin` through
176
+ its plugin loader. Running `node <managed-plugin>/server/dist/main.js --register`
177
+ directly bypasses that loader and can fail with `ERR_MODULE_NOT_FOUND` for
178
+ `@getpaseo/plugin`; this invocation from the managed directory is unsupported
179
+ ([#154](https://github.com/phucanh08/alp/issues/154)). Use the normal npm installation
180
+ and `alp-web-integration --register` shown above. For a local npm installation with
181
+ required peers, use `./node_modules/.bin/alp-web-integration --register` with the
182
+ intended `ALP_HOME`. Registration records the entry path; it does not install missing
183
+ peers or turn a host-managed plugin into a standalone installation.
184
+
173
185
  Adding the plugin to a Paseo host (`npm:` from beta.2; by path in beta.1, see above) remains
174
186
  available independently of this standalone web process.
175
187
 
@@ -55,7 +55,7 @@ export const LANGUAGES = [
55
55
  { label: 'Deutsch', value: 'German' }, { label: 'Español', value: 'Spanish' },
56
56
  ];
57
57
  /** librarySkills: for agents, the skills the library gives it by name (role-skills.json). */
58
- type Entry = { kind: Kind; name: string; source: string; overrides?: string; content: Content; revision: string | null; usedBy: string[]; librarySkills?: string[] };
58
+ type Entry = { kind: Kind; name: string; source: string; overrides?: string; content: Content; revision: string | null; usedBy: string[]; librarySkills?: string[]; secrets?: string[] };
59
59
  /** `readOnly`: the library can only be looked at from here (ALP remote mode), and why. */
60
60
  type Where = { projectRoot: string | null; library: string; readOnly?: { reason: string; unlisted?: string } } | null;
61
61
 
@@ -189,7 +189,7 @@ type WorkspaceProps = {
189
189
  };
190
190
 
191
191
  /** The aside's groups: General (the library only), Organisation, Capabilities and Runtimes, each kind with its entries. */
192
- export function navGroups(scope: Scope, lists: Lists, readOnly = false): NavGroup[] {
192
+ export function navGroups(scope: Scope, lists: Lists): NavGroup[] {
193
193
  const groups: NavGroup[] = scope === 'library' ? [{ key: 'General', label: 'General', items: [{ key: 'language', label: 'Language', icon: 'Languages' }] }] : [];
194
194
  for (const item of shownIn(scope)) {
195
195
  let group = groups.find(candidate => candidate.label === item.group);
@@ -197,8 +197,7 @@ export function navGroups(scope: Scope, lists: Lists, readOnly = false): NavGrou
197
197
  const rows = lists[item.kind];
198
198
  group.items.push({
199
199
  key: item.kind, label: item.title, icon: item.icon, ...(rows ? { count: rows.length } : {}),
200
- // A read-only library's entries cannot be opened, so the aside lists kinds only.
201
- children: readOnly ? [] : (rows ?? []).map(row => ({ key: row.name, label: row.name, tone: sourceTone(row.source) })),
200
+ children: (rows ?? []).map(row => ({ key: row.name, label: row.name, tone: sourceTone(row.source) })),
202
201
  });
203
202
  }
204
203
  return groups;
@@ -209,7 +208,7 @@ export function LibraryWorkspace({ theme, compact, scope, where, lists, error, s
209
208
  const styles = useMemo(() => makeStyles(theme, compact), [theme, compact]);
210
209
  const title = scope === 'library' ? 'ALP library' : 'ALP project';
211
210
  const subtitle = scope === 'library' ? where?.library : where?.projectRoot ?? undefined;
212
- const groups = navGroups(scope, lists, !!where?.readOnly);
211
+ const groups = navGroups(scope, lists);
213
212
  const onSelect = (kind: string, name?: string) => actions.select(kind === 'language' ? { kind } : { kind: kind as Kind, ...(name ? { name } : {}) });
214
213
  if (scope === 'project' && where?.readOnly?.unlisted) {
215
214
  return <View style={styles.screen}><Text style={styles.muted}>{where.readOnly.unlisted}</Text></View>;
@@ -221,6 +220,23 @@ export function LibraryWorkspace({ theme, compact, scope, where, lists, error, s
221
220
  return <LanguageSettings theme={theme} compact={compact} language={language ?? null} error={error} actions={actions} layout={{ title, subtitle, groups, onSelect, initialCollapsed, embedded }} styles={styles} />;
222
221
  }
223
222
  const kind = kindOf(selection.kind);
223
+ if (where?.readOnly && (selection.name || selection.creating)) {
224
+ // A selection can change before its async get resolves; never label the previous entry as the new one.
225
+ const viewed = !where.readOnly.unlisted && entry && entry.name === selection.name && entry.kind === selection.kind ? entry : null;
226
+ return <SideNavLayout theme={theme} compact={compact} title={title} subtitle={subtitle} groups={groups} active={{ item: selection.kind, ...(selection.name ? { child: selection.name } : {}) }} onSelect={onSelect} initialCollapsed={initialCollapsed} embedded={embedded}
227
+ breadcrumb={[kind.title, selection.name ?? 'Read only']}
228
+ badges={viewed ? <Pill theme={theme} label={sourceLabel(viewed.source)} tone={sourceTone(viewed.source)} /> : null}
229
+ actions={<Button theme={theme} icon="ArrowLeft" label={`All ${kind.title.toLowerCase()}`} onPress={() => actions.select({ kind: selection.kind })} />}>
230
+ <Text style={styles.muted}>{where.readOnly.reason}</Text>
231
+ {error || where.readOnly.unlisted ? <Text style={styles.muted}>{error ?? where.readOnly.unlisted}</Text> : selection.creating ? <Text style={styles.muted}>Create entries on the ALP host.</Text> : !viewed ? <Text style={styles.muted}>Loading…</Text> : <>
232
+ {viewed.overrides ? <Text style={styles.small}>Overrides {sourceLabel(viewed.overrides)}.</Text> : null}
233
+ {viewed.usedBy.length ? <Text style={styles.small}>Used by {viewed.usedBy.join(', ')}.</Text> : null}
234
+ {viewed.librarySkills?.length ? <Text style={styles.small}>Library skills: {viewed.librarySkills.join(', ')}.</Text> : null}
235
+ {viewed.secrets?.length ? <Text style={styles.muted}>Secrets hidden: {viewed.secrets.join(', ')}. Secret markers stand for values kept on the ALP host.</Text> : null}
236
+ <Text selectable style={styles.small}>{JSON.stringify(viewed.content, null, 2)}</Text>
237
+ </>}
238
+ </SideNavLayout>;
239
+ }
224
240
  if (selection.name || selection.creating) {
225
241
  return <EntryEditor key={`${selection.kind}/${selection.name ?? 'new'}/${entry?.revision ?? 'new'}/${(entry?.librarySkills ?? []).join(',')}`} theme={theme} compact={compact} scope={scope} kind={selection.kind} entry={selection.creating ? null : entry}
226
242
  lists={lists} actions={actions} layout={{ title, subtitle, groups, onSelect, initialCollapsed, embedded }} />;
@@ -306,7 +322,7 @@ export function KindOverview({ theme, compact, scope, kind, rows, error, where,
306
322
  <View style={styles.table}>
307
323
  {shown.map((row, index) => (
308
324
  <View key={row.name} style={[styles.tableRow, index ? styles.tableRowRule : null]}>
309
- <Pressable accessibilityRole={readOnly ? undefined : 'button'} accessibilityLabel={`${readOnly ? '' : 'Open '}${one} ${row.name}`} disabled={!!readOnly} onPress={() => actions.select({ kind, name: row.name })} style={styles.rowMain}>
325
+ <Pressable accessibilityRole="button" accessibilityLabel={`Open ${one} ${row.name}`} onPress={() => actions.select({ kind, name: row.name })} style={styles.rowMain}>
310
326
  <View style={styles.rowTitle}>
311
327
  <Text style={styles.name}>{row.name}</Text>
312
328
  <Pill theme={theme} label={sourceLabel(row.source)} tone={sourceTone(row.source)} />
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anhlp/alp-paseo",
3
- "version": "0.0.0-beta.2",
3
+ "version": "0.0.1-beta.3",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "paseo-plugin.json",
@@ -16,20 +16,20 @@
16
16
  "@anthropic-ai/sdk": "0.131.0",
17
17
  "@modelcontextprotocol/sdk": "1.32.1",
18
18
  "zod": "4.4.3",
19
- "@anhlp/alp-protocol": "0.0.0-beta.2",
20
- "@anhlp/alp-core": "0.0.0-beta.2",
21
- "@anhlp/alp-runtime": "0.0.0-beta.2",
22
- "@anhlp/alp-daemon": "0.0.0-beta.2",
23
- "@anhlp/alp-client": "0.0.0-beta.2",
19
+ "@anhlp/alp-protocol": "0.0.1-beta.3",
20
+ "@anhlp/alp-core": "0.0.1-beta.3",
21
+ "@anhlp/alp-runtime": "0.0.1-beta.3",
22
+ "@anhlp/alp-daemon": "0.0.1-beta.3",
23
+ "@anhlp/alp-client": "0.0.1-beta.3",
24
24
  "ws": "^8.22.0"
25
25
  },
26
26
  "peerDependencies": {
27
- "@getpaseo/plugin": ">=0.11.1 <0.12.0",
27
+ "@getpaseo/plugin": ">=0.11.1 <0.13.0",
28
28
  "react": ">=19 <20",
29
29
  "react-native": ">=0.81 <0.82",
30
- "@getpaseo/client": ">=0.11.1 <0.12.0",
31
- "@getpaseo/protocol": ">=0.11.1 <0.12.0",
32
- "@getpaseo/relay": ">=0.11.1 <0.12.0",
30
+ "@getpaseo/client": ">=0.11.1 <0.13.0",
31
+ "@getpaseo/protocol": ">=0.11.1 <0.13.0",
32
+ "@getpaseo/relay": ">=0.11.1 <0.13.0",
33
33
  "ws": "*"
34
34
  },
35
35
  "peerDependenciesMeta": {
@@ -88,10 +88,10 @@
88
88
  }
89
89
  },
90
90
  "devDependencies": {
91
- "@getpaseo/client": "0.11.1",
92
- "@getpaseo/plugin": "0.11.1",
93
- "@getpaseo/protocol": "0.11.2",
94
- "@getpaseo/relay": "0.11.1",
91
+ "@getpaseo/client": "0.12.0",
92
+ "@getpaseo/plugin": "0.12.0",
93
+ "@getpaseo/protocol": "0.12.0",
94
+ "@getpaseo/relay": "0.12.0",
95
95
  "esbuild": "0.25.12",
96
96
  "react-dom": "19.1.0"
97
97
  }
package/paseo-plugin.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "id": "alp-provider",
3
3
  "description": "Run filesystem-defined ALP agents",
4
- "requirements": { "paseo": ">=0.11.1 <0.12.0" }
4
+ "requirements": { "paseo": ">=0.11.1 <0.13.0" }
5
5
  }
@@ -4,7 +4,7 @@ The bundled files of this package include code from the packages below; each kee
4
4
  its own licence, reproduced here.
5
5
 
6
6
  ================================================================================
7
- @getpaseo/protocol@0.11.2 (Apache-2.0)
7
+ @getpaseo/protocol@0.12.0 (Apache-2.0)
8
8
  ================================================================================
9
9
 
10
10
  Copyright (c) 2025-present Mohamed Boudra
@@ -220,7 +220,7 @@ Portions of this software are licensed as follows:
220
220
  limitations under the License.
221
221
 
222
222
  ================================================================================
223
- @getpaseo/relay@0.11.1 (Apache-2.0)
223
+ @getpaseo/relay@0.12.0 (Apache-2.0)
224
224
  ================================================================================
225
225
 
226
226
  Copyright (c) 2025-present Mohamed Boudra