@omercnet/paseo-omp 2.0.1 → 2.0.2-next.260.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/OVERVIEW.md +1 -1
- package/README.md +3 -3
- package/npm-shrinkwrap.json +18 -18
- package/package.json +10 -10
- package/paseo-plugin.json +1 -1
- package/server/package-version.ts +1 -1
- package/server/provider/host-tools.ts +16 -1
- package/server/provider/timeline-projector.ts +10 -2
package/OVERVIEW.md
CHANGED
|
@@ -2,7 +2,7 @@ OMP adds an agent provider for the OMP coding agent, plus an OMP sidebar and wor
|
|
|
2
2
|
|
|
3
3
|
## Setup
|
|
4
4
|
|
|
5
|
-
- Paseo ^0.11.0.
|
|
5
|
+
- Paseo ^0.11.0 || ^0.12.0.
|
|
6
6
|
- OMP 18.1.15 or newer on the daemon host, speaking RPC protocol v2. Older runtimes are rejected.
|
|
7
7
|
- Provider options let you change the OMP command, set environment values, choose an output redaction mode and set a session directory and timeout. Named OMP profiles appear as separate `OMP · <profile>` providers.
|
|
8
8
|
|
package/README.md
CHANGED
|
@@ -24,7 +24,7 @@ before capture.
|
|
|
24
24
|
|
|
25
25
|
## Quick start
|
|
26
26
|
|
|
27
|
-
Requirements: Paseo `^0.11.0`, OMP `18.1.15` or newer, and OMP RPC protocol v2. The config screen and Hub row use the 0.11 screen and sidebar APIs, so Paseo 0.9 and 0.10 hosts are no longer supported.
|
|
27
|
+
Requirements: Paseo `^0.11.0 || ^0.12.0`, OMP `18.1.15` or newer, and OMP RPC protocol v2. The config screen and Hub row use the 0.11 screen and sidebar APIs, so Paseo 0.9 and 0.10 hosts are no longer supported.
|
|
28
28
|
|
|
29
29
|
```bash
|
|
30
30
|
paseo plugin install npm:@omercnet/paseo-omp@<version>
|
|
@@ -54,7 +54,7 @@ Profile selection is request-local: concurrent clients cannot change each other'
|
|
|
54
54
|
|
|
55
55
|
## Paseo provider SDK coverage
|
|
56
56
|
|
|
57
|
-
The capability inventory is pinned to `@getpaseo/plugin` 0.
|
|
57
|
+
The capability inventory is pinned to `@getpaseo/plugin` 0.12.0-beta.2, with nightly compatibility checks
|
|
58
58
|
against the latest and beta channels. Provider capability scoring covers
|
|
59
59
|
all 17 entries in the SDK's `PROVIDER_CAPABILITIES`; the separate provider/client SDK table below
|
|
60
60
|
also tracks the 0.11 registration, screen, and sidebar APIs. This measures strict SDK surface
|
|
@@ -100,7 +100,7 @@ Provider functionality outside the capability flags is tracked separately:
|
|
|
100
100
|
| Models, modes, and thinking catalog | **100%** | Native catalog is mapped to opaque public model IDs with committed defaults and permission-gated modes. |
|
|
101
101
|
| Connection `send` / `onEvent` / `close` lifecycle | **100%** | Request correlation, multi-session ownership, process recovery, teardown, and provider reload/removal are covered. |
|
|
102
102
|
| Session launch: cwd, env, system prompt, title, and persistence | **100%** | Complete launch configuration is bounded, validated, forwarded, and re-read on recovery; selected host and profile daemon environment values are resolved only when catalog and session children spawn. |
|
|
103
|
-
| MCP server forwarding and host tools | **100%** | Configured MCP tools are discovered, namespaced, labeled, executed, canceled, and bounded. Caller-scoped Paseo orchestration tools retain their native names, such as `create_agent` and `list_profiles`, so OMP skills can invoke them directly. The MCP composer control delegates native server management to OMP instead of duplicating its profile and workspace precedence. Exact `toolPolicy` remains the separate 0% capability above. |
|
|
103
|
+
| MCP server forwarding and host tools | **100%** | Configured MCP tools are discovered, namespaced, labeled, executed, canceled, and bounded. Forwarded tools are namespaced `mcpx__<server>_<tool>`: OMP treats `mcp__` as its own MCP manager's namespace and deletes that whole namespace from the session registry on every `refreshMCPTools`, so a forwarded tool registered under it is accepted and then dropped. Registration races OMP's deferred MCP discovery on every supported release; from 18.9.0 the ordering is deterministic and the tools were always lost. An OMP approval policy or inline-docs glob keyed on the old `mcp__<server>_<tool>` spelling must be re-keyed to `mcpx__<server>_<tool>`; OMP matches approval entries by exact tool name. Caller-scoped Paseo orchestration tools retain their native names, such as `create_agent` and `list_profiles`, so OMP skills can invoke them directly. The MCP composer control delegates native server management to OMP instead of duplicating its profile and workspace precedence. Exact `toolPolicy` remains the separate 0% capability above. |
|
|
104
104
|
| Denied native tools | **100%** | `disallowedTools` becomes an explicit OMP allow-list; unknown names fail closed. |
|
|
105
105
|
| Commands and committed session state events | **100%** | Publishes `session.commands`, `session.opened`, `session.config`, `session.ready`, and request completion in protocol order. |
|
|
106
106
|
| Built-in timeline snapshots | **100%** | Assistant, reasoning, tools, todos, notifications, errors, compaction, and friendly MCP labels use stable IDs and complete snapshots. OMP emits client-safe PNG/JPEG when possible; validated legacy WebP images render on capable clients with an explicit per-image fallback elsewhere. |
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,31 +1,31 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@omercnet/paseo-omp",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.2",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@omercnet/paseo-omp",
|
|
9
|
-
"version": "2.0.
|
|
9
|
+
"version": "2.0.2",
|
|
10
10
|
"dependencies": {
|
|
11
|
-
"@getpaseo/protocol": "0.
|
|
11
|
+
"@getpaseo/protocol": "0.12.0-beta.2",
|
|
12
12
|
"@modelcontextprotocol/sdk": "1.30.0",
|
|
13
13
|
"yaml": "^2.9.0"
|
|
14
14
|
}
|
|
15
15
|
},
|
|
16
16
|
"node_modules/@getpaseo/protocol": {
|
|
17
|
-
"version": "0.
|
|
18
|
-
"resolved": "https://registry.npmjs.org/@getpaseo/protocol/-/protocol-0.
|
|
19
|
-
"integrity": "sha512-
|
|
17
|
+
"version": "0.12.0-beta.2",
|
|
18
|
+
"resolved": "https://registry.npmjs.org/@getpaseo/protocol/-/protocol-0.12.0-beta.2.tgz",
|
|
19
|
+
"integrity": "sha512-Rolt7NUf+aJpoRM8Rqxj5Ao0i6wz/MMj0i57IqJsGdxJRBS+SrnfacJD1cqtq4TY8UicsI3GBEue6V3+LOyBnw==",
|
|
20
20
|
"dependencies": {
|
|
21
21
|
"semver": "^7.8.5",
|
|
22
22
|
"zod": "^4.4.3"
|
|
23
23
|
}
|
|
24
24
|
},
|
|
25
25
|
"node_modules/@hono/node-server": {
|
|
26
|
-
"version": "2.1.
|
|
27
|
-
"resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-2.1.
|
|
28
|
-
"integrity": "sha512-
|
|
26
|
+
"version": "2.1.5",
|
|
27
|
+
"resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-2.1.5.tgz",
|
|
28
|
+
"integrity": "sha512-MgP/I06GdvsilDspMk/qmRzpk8LOUStP6jFAbSRi40W09DhoyUn+Mj7eyKICPqeYKybOjVFLVIAQzvu1bfIa7Q==",
|
|
29
29
|
"license": "MIT",
|
|
30
30
|
"engines": {
|
|
31
31
|
"node": ">=20"
|
|
@@ -657,9 +657,9 @@
|
|
|
657
657
|
"license": "ISC"
|
|
658
658
|
},
|
|
659
659
|
"node_modules/ip-address": {
|
|
660
|
-
"version": "10.7.
|
|
661
|
-
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.
|
|
662
|
-
"integrity": "sha512-
|
|
660
|
+
"version": "10.7.4",
|
|
661
|
+
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.4.tgz",
|
|
662
|
+
"integrity": "sha512-DWBMKyeM25D70nrIiTkgQth59/G+naKOTep6huF9j+GmeK3DMD60Zvxg5d5qQnz+38AHgou6ean2LECX+lrKDg==",
|
|
663
663
|
"license": "MIT",
|
|
664
664
|
"engines": {
|
|
665
665
|
"node": ">= 12"
|
|
@@ -898,9 +898,9 @@
|
|
|
898
898
|
}
|
|
899
899
|
},
|
|
900
900
|
"node_modules/qs": {
|
|
901
|
-
"version": "6.16.
|
|
902
|
-
"resolved": "https://registry.npmjs.org/qs/-/qs-6.16.
|
|
903
|
-
"integrity": "sha512-
|
|
901
|
+
"version": "6.16.1",
|
|
902
|
+
"resolved": "https://registry.npmjs.org/qs/-/qs-6.16.1.tgz",
|
|
903
|
+
"integrity": "sha512-5Px6J7rfHBAGUhNQ3es4YzcOdBBw0SDcVtThJml4RdnKw4tKs2epA0kPZ+K8X+WiHktT93RHVcQ/3ym5aTCgtg==",
|
|
904
904
|
"license": "BSD-3-Clause",
|
|
905
905
|
"dependencies": {
|
|
906
906
|
"es-define-property": "^1.0.1",
|
|
@@ -1232,9 +1232,9 @@
|
|
|
1232
1232
|
}
|
|
1233
1233
|
},
|
|
1234
1234
|
"node_modules/zod": {
|
|
1235
|
-
"version": "4.6.
|
|
1236
|
-
"resolved": "https://registry.npmjs.org/zod/-/zod-4.6.
|
|
1237
|
-
"integrity": "sha512-
|
|
1235
|
+
"version": "4.6.7",
|
|
1236
|
+
"resolved": "https://registry.npmjs.org/zod/-/zod-4.6.7.tgz",
|
|
1237
|
+
"integrity": "sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg==",
|
|
1238
1238
|
"license": "MIT",
|
|
1239
1239
|
"funding": {
|
|
1240
1240
|
"url": "https://github.com/sponsors/colinhacks"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@omercnet/paseo-omp",
|
|
3
|
-
"version": "2.0.1",
|
|
3
|
+
"version": "2.0.2-next.260.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Paseo integration for OMP, including its direct provider and workspace tooling.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"publishConfig": {
|
|
17
17
|
"access": "public"
|
|
18
18
|
},
|
|
19
|
-
"packageManager": "bun@1.4.
|
|
19
|
+
"packageManager": "bun@1.4.3",
|
|
20
20
|
"engines": {
|
|
21
21
|
"node": ">=22.18.0"
|
|
22
22
|
},
|
|
@@ -53,26 +53,26 @@
|
|
|
53
53
|
"typecheck": "tsc --noEmit -p tsconfig.client.json && tsc --noEmit -p tsconfig.server.json && tsc --noEmit -p tsconfig.tests.json"
|
|
54
54
|
},
|
|
55
55
|
"dependencies": {
|
|
56
|
-
"@getpaseo/protocol": "0.
|
|
56
|
+
"@getpaseo/protocol": "0.12.0-beta.2",
|
|
57
57
|
"@modelcontextprotocol/sdk": "1.30.0",
|
|
58
58
|
"yaml": "^2.9.0"
|
|
59
59
|
},
|
|
60
60
|
"devDependencies": {
|
|
61
61
|
"@biomejs/biome": "^2.5.10",
|
|
62
|
-
"@getpaseo/cli": "0.
|
|
63
|
-
"@getpaseo/client": "0.
|
|
64
|
-
"@getpaseo/plugin": "0.
|
|
65
|
-
"@getpaseo/server": "0.
|
|
66
|
-
"@oh-my-pi/pi-agent-core": "18.
|
|
67
|
-
"@oh-my-pi/pi-coding-agent": "18.
|
|
62
|
+
"@getpaseo/cli": "0.12.0-beta.2",
|
|
63
|
+
"@getpaseo/client": "0.12.0-beta.2",
|
|
64
|
+
"@getpaseo/plugin": "0.12.0-beta.2",
|
|
65
|
+
"@getpaseo/server": "0.12.0-beta.2",
|
|
66
|
+
"@oh-my-pi/pi-agent-core": "18.10.1",
|
|
67
|
+
"@oh-my-pi/pi-coding-agent": "18.10.1",
|
|
68
68
|
"@tanstack/react-query": "^5.102.3",
|
|
69
69
|
"@types/node": "^24.10.1",
|
|
70
70
|
"@types/react": "^19.2.18",
|
|
71
71
|
"@vitest/coverage-v8": "^5.0.0",
|
|
72
72
|
"esbuild": "0.28.2",
|
|
73
|
+
"pino": "10.3.1",
|
|
73
74
|
"react": "19.1.0",
|
|
74
75
|
"react-native": "0.81.5",
|
|
75
|
-
"pino": "10.3.1",
|
|
76
76
|
"tsx": "^4.20.6",
|
|
77
77
|
"typescript": "^7.0.2",
|
|
78
78
|
"vitest": "^5.0.0",
|
package/paseo-plugin.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "paseo-omp",
|
|
3
3
|
"description": "Paseo integration for OMP, including its direct provider and workspace tooling.",
|
|
4
|
-
"requirements": { "paseo": "^0.11.0" },
|
|
4
|
+
"requirements": { "paseo": "^0.11.0 || ^0.12.0" },
|
|
5
5
|
"build": [["node", "scripts/prepare-dependencies.mjs"]]
|
|
6
6
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/** Release Please keeps this bundle-safe constant aligned with package.json. */
|
|
2
|
-
export const PASEO_OMP_PACKAGE_VERSION = "2.0.1"; // x-release-please-version
|
|
2
|
+
export const PASEO_OMP_PACKAGE_VERSION = "2.0.2-next.260.1"; // x-release-please-version
|
|
@@ -259,11 +259,26 @@ function serverNamespaces(servers: readonly ClassifiedServer[]): ReadonlyMap<str
|
|
|
259
259
|
);
|
|
260
260
|
}
|
|
261
261
|
|
|
262
|
+
/**
|
|
263
|
+
* Namespace prefix for tools this plugin registers through `set_host_tools`.
|
|
264
|
+
*
|
|
265
|
+
* It deliberately avoids OMP's `mcp__` prefix. OMP treats that prefix as its own
|
|
266
|
+
* MCP manager's namespace (`isMCPToolName`), and every `refreshMCPTools` deletes
|
|
267
|
+
* the whole namespace from the session tool registry before rebuilding it from
|
|
268
|
+
* manager- and extension-owned tools only. Host tools registered over RPC are in
|
|
269
|
+
* neither set, so an `mcp__` name is accepted and then dropped once OMP's own
|
|
270
|
+
* deferred MCP discovery completes, leaving the tool callable from nowhere.
|
|
271
|
+
*/
|
|
272
|
+
export const HOST_TOOL_NAME_PREFIX = "mcpx__";
|
|
273
|
+
|
|
274
|
+
/** Prefix used before {@link HOST_TOOL_NAME_PREFIX}; still rendered in persisted timelines. */
|
|
275
|
+
export const LEGACY_HOST_TOOL_NAME_PREFIX = "mcp__";
|
|
276
|
+
|
|
262
277
|
function exposedToolName(server: ClassifiedServer, namespace: string, toolName: string): string {
|
|
263
278
|
const tool = safeName(toolName, "tool");
|
|
264
279
|
if (server.canonical) return tool;
|
|
265
280
|
const unprefixed = tool.startsWith(`${namespace}_`) ? tool.slice(namespace.length + 1) : tool;
|
|
266
|
-
const base =
|
|
281
|
+
const base = `${HOST_TOOL_NAME_PREFIX}${namespace}_${unprefixed}`;
|
|
267
282
|
if (utf8Bytes(base) <= MAX_HOST_TOOL_NAME_BYTES) return base;
|
|
268
283
|
const suffix = digest(`${server.name}\0${toolName}`);
|
|
269
284
|
return `${base.slice(0, MAX_HOST_TOOL_NAME_BYTES - suffix.length - 1)}_${suffix}`;
|
|
@@ -5,6 +5,7 @@ import type {
|
|
|
5
5
|
ProviderToolCallDetail,
|
|
6
6
|
} from "@getpaseo/plugin/server/provider";
|
|
7
7
|
import { OMP_MCP_AUTH_TIMELINE_KIND } from "../../shared/mcp";
|
|
8
|
+
import { HOST_TOOL_NAME_PREFIX, LEGACY_HOST_TOOL_NAME_PREFIX } from "./host-tools";
|
|
8
9
|
import { isOmpImageMimeType, isValidImagePayload, type OmpImageMimeType } from "./image";
|
|
9
10
|
import {
|
|
10
11
|
OMP_MAX_CONTENT_PARTS,
|
|
@@ -189,8 +190,15 @@ function xdeviceToolName(nativeName: string, input: JsonValue): string | undefin
|
|
|
189
190
|
const match = path?.match(/^xd:\/\/([A-Za-z0-9_][A-Za-z0-9_.-]{0,255})(?:[/?#]|$)/u);
|
|
190
191
|
return match?.[1];
|
|
191
192
|
}
|
|
193
|
+
function hostToolPrefixOf(name: string): string | undefined {
|
|
194
|
+
if (name.startsWith(HOST_TOOL_NAME_PREFIX)) return HOST_TOOL_NAME_PREFIX;
|
|
195
|
+
// Timelines persisted before the rename still carry the legacy prefix.
|
|
196
|
+
if (name.startsWith(LEGACY_HOST_TOOL_NAME_PREFIX)) return LEGACY_HOST_TOOL_NAME_PREFIX;
|
|
197
|
+
return undefined;
|
|
198
|
+
}
|
|
192
199
|
function friendlyXdeviceToolName(name: string): string {
|
|
193
|
-
const
|
|
200
|
+
const prefix = hostToolPrefixOf(name);
|
|
201
|
+
const routedName = prefix ? name.slice(prefix.length) : name;
|
|
194
202
|
const words = routedName
|
|
195
203
|
.replace(/[-_.]+/gu, " ")
|
|
196
204
|
.replace(/\s+/gu, " ")
|
|
@@ -541,7 +549,7 @@ export class OmpTimelineProjector {
|
|
|
541
549
|
const routedToolName = xdeviceToolName(event.toolName, input);
|
|
542
550
|
const displayName =
|
|
543
551
|
this.hostToolLabels.get(routedToolName ?? event.toolName) ??
|
|
544
|
-
(routedToolName || event.toolName
|
|
552
|
+
(routedToolName || hostToolPrefixOf(event.toolName)
|
|
545
553
|
? friendlyXdeviceToolName(routedToolName ?? event.toolName)
|
|
546
554
|
: event.toolName);
|
|
547
555
|
const snapshot: ToolSnapshot = {
|