@omercnet/paseo-omp 3.0.0 → 4.0.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/OVERVIEW.md +2 -1
- package/README.md +6 -6
- package/client/hub-icon.ts +4 -0
- package/client/hub-sidebar.tsx +2 -1
- package/client/mcp-authorization.tsx +1 -1
- package/client/mcp-popover.tsx +1 -1
- package/client/omp-config-surface.tsx +1 -2
- package/client/omp-model-picker.tsx +1 -1
- package/client/omp-plugin-manager.tsx +1 -1
- package/client/omp-routing-editor.tsx +1 -1
- package/client/provider-icon.tsx +1 -1
- package/client/quota-popover.tsx +1 -1
- package/client/svg.d.ts +4 -0
- package/index.client.tsx +2 -4
- package/npm-shrinkwrap.json +25 -21
- package/package.json +6 -6
- package/paseo-plugin.json +1 -1
- package/server/package-version.ts +1 -1
- package/server/provider/omp-rpc-transport.ts +18 -0
- package/server/provider/registration.ts +1 -1
- package/client/hub-icon.tsx +0 -12
- /package/{server/provider → shared}/omp.svg +0 -0
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.
|
|
5
|
+
- Paseo ^0.13.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
|
|
|
@@ -11,6 +11,7 @@ OMP adds an agent provider for the OMP coding agent, plus an OMP sidebar and wor
|
|
|
11
11
|
- Edit OMP settings and project configuration for the default store or a named profile.
|
|
12
12
|
- Manage OMP's own plugins, and view quota history, memory, hub processes, session history and a support report.
|
|
13
13
|
- An **MCP** composer control runs OMP's MCP management in the current session, with authorization prompts shown in the chat.
|
|
14
|
+
- OMP agents can call Paseo's orchestration tools with the optional `serverId` argument and `list_hosts` to delegate work to other connected Paseo hosts.
|
|
14
15
|
|
|
15
16
|
## Reads and sends
|
|
16
17
|
|
package/README.md
CHANGED
|
@@ -24,7 +24,7 @@ before capture.
|
|
|
24
24
|
|
|
25
25
|
## Quick start
|
|
26
26
|
|
|
27
|
-
Requirements: Paseo `^0.
|
|
27
|
+
Requirements: Paseo `^0.13.0`, OMP `18.1.15` or newer, and OMP RPC protocol v2. Workspace discovery passes `includeBackground`, which throws on hosts that do not advertise `features.backgroundWorkspaces`; every 0.13 host does.
|
|
28
28
|
|
|
29
29
|
```bash
|
|
30
30
|
paseo plugin install npm:@omercnet/paseo-omp@<version>
|
|
@@ -40,7 +40,7 @@ Open the **OMP** sidebar to review the provider-profile contract, choose which c
|
|
|
40
40
|
- [Core-provider issue and parity audit](docs/core-provider-issue-audit.md)
|
|
41
41
|
- [Release checklist](docs/release-checklist.md)
|
|
42
42
|
|
|
43
|
-
The plugin uses public Paseo 0.
|
|
43
|
+
The plugin uses public Paseo 0.13 provider and client contracts and registers distinct `omp-plugin` and `omp-plugin-<profile>` identities; it does not modify the bundled `omp` provider.
|
|
44
44
|
|
|
45
45
|
## Named OMP profiles
|
|
46
46
|
|
|
@@ -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.13.0, 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 registration, screen, and sidebar APIs introduced in 0.11. This measures strict SDK surface
|
|
@@ -95,12 +95,12 @@ Provider functionality outside the capability flags is tracked separately:
|
|
|
95
95
|
| --- | ---: | --- |
|
|
96
96
|
| Registration metadata and sanitized SVG icon | **100%** | Stable `omp-plugin` identity, label, description, and bundled icon. |
|
|
97
97
|
| Strict `providerOptionsSchema` | **100%** | Command, literal environment, names-only profile inherited environment, output-redaction mode, session directory, RPC timeout, and role-model options are validated and normalized. Host-wide inherited names are separately persisted and merged at launch. |
|
|
98
|
-
| Availability diagnostics | **50%** | The plugin implements a `checkAvailability` hook with bounded checks that distinguish missing, unrunnable, incompatible, and available OMP runtimes, but Paseo 0.
|
|
98
|
+
| Availability diagnostics | **50%** | The plugin implements a `checkAvailability` hook with bounded checks that distinguish missing, unrunnable, incompatible, and available OMP runtimes, but Paseo 0.13 does not call it. The host uses the `status()` hook below instead, which reuses this probe for the default launch. |
|
|
99
99
|
| Catalog cache identity | **100%** | Hash includes effective options, merged host/profile inherited-environment names, settings, scope, cwd, and default command, but never resolves or fingerprints inherited values. |
|
|
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. 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. |
|
|
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. Through the same bridge, OMP agents get the optional `serverId` argument on Paseo's host-targeting orchestration tools and the `list_hosts` tool, so they can delegate work to other connected Paseo hosts; the bridged tools execute on the daemon host while OMP stays local. |
|
|
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. |
|
|
@@ -125,7 +125,7 @@ Existing agents whose provider is `omp` remain owned by the bundled provider. Ne
|
|
|
125
125
|
|
|
126
126
|
OMP `18.1.15` is the oldest version tested end to end. The direct provider's hard compatibility gate is `rpc-ui` protocol v2: metadata-free legacy ready frames and v1-only runtimes are rejected before a provider session opens because they cannot support the advertised persistence and conversation-rewind capabilities. Typed tool approvals remain capability-gated and fall back as described above. For terminal completion, a matching `agent_end.requestId` is authoritative and mismatches are ignored before state changes. Released OMP 18.2.x builds that omit that field use an ordered fallback requiring a fresh correlated native user entry followed by current-turn assistant activity, an idle non-compacting runtime, and no conflicting permission, tool, steer, or child-session work. Ambiguous events while OMP is active are ignored; unresolved ambiguity after confirmed idle fails only the Paseo turn. This trades a bounded residual same-agent stale-event risk for compatibility with released OMP instead of terminating and lazily restarting the runtime after every later prompt. Paseo clients, including mobile clients inside reconnect grace, do not own or terminate the daemon-managed OMP session.
|
|
127
127
|
|
|
128
|
-
Paseo 0.
|
|
128
|
+
Paseo 0.13 is the minimum supported release. The controlled Docker canary is pinned to official 0.13.0; nightly SDK checks cover the latest and beta channels. The canary preserves nested provider-subagent ancestry and spawning-tool links, and validates npm-managed plugin sources, platform-owned external URL opening, and whole-item timeline transforms before Overview grouping.
|
|
129
129
|
|
|
130
130
|
Install, update, disable, or remove `paseo-omp` independently of the bundled provider. Verify the provider snapshot contains `omp-plugin` after installation; a bundled `omp` entry may remain present and is not modified by this plugin.
|
|
131
131
|
|
package/client/hub-sidebar.tsx
CHANGED
|
@@ -2,6 +2,7 @@ import type { PluginPopoverProps, PluginSidebarItemProps } from "@getpaseo/plugi
|
|
|
2
2
|
import { SidebarRow } from "@getpaseo/plugin/client/ui";
|
|
3
3
|
import { useQuery } from "@tanstack/react-query";
|
|
4
4
|
import { Text, View } from "react-native";
|
|
5
|
+
import { OMP_ICON } from "./hub-icon";
|
|
5
6
|
import { HubProcessList } from "./hub-popover";
|
|
6
7
|
import { CONFIG_SCREEN_ID, type HubSnapshot, hubTrailing } from "./sidebar-compat";
|
|
7
8
|
|
|
@@ -12,7 +13,7 @@ const HUB_SIDEBAR_QUERY_KEY = ["paseo-omp", "hub-sidebar"] as const;
|
|
|
12
13
|
export function ConfigSidebarItem({ currentScreen, openScreen }: PluginSidebarItemProps) {
|
|
13
14
|
return (
|
|
14
15
|
<SidebarRow
|
|
15
|
-
icon=
|
|
16
|
+
icon={OMP_ICON}
|
|
16
17
|
label="OMP"
|
|
17
18
|
active={currentScreen?.screenId === CONFIG_SCREEN_ID}
|
|
18
19
|
onPress={() => openScreen({ screenId: CONFIG_SCREEN_ID })}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type PluginTimelineItemProps, useRpc } from "@getpaseo/plugin/client";
|
|
2
|
-
import { Icon } from "@getpaseo/plugin/client/
|
|
2
|
+
import { Icon } from "@getpaseo/plugin/client/ui";
|
|
3
3
|
import { useMemo, useState } from "react";
|
|
4
4
|
import { Pressable, Text, View } from "react-native";
|
|
5
5
|
import {
|
package/client/mcp-popover.tsx
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type PluginButtonContentProps, useAgent, usePaseo } from "@getpaseo/plugin/client";
|
|
2
|
-
import { TextInput } from "@getpaseo/plugin/client/
|
|
2
|
+
import { TextInput } from "@getpaseo/plugin/client/ui";
|
|
3
3
|
import { useMemo, useState } from "react";
|
|
4
4
|
import { Pressable, Text, View } from "react-native";
|
|
5
5
|
import { buildOmpMcpServerCommand, type OmpMcpServerAction } from "../shared/mcp";
|
|
@@ -5,8 +5,7 @@ import {
|
|
|
5
5
|
useRpc,
|
|
6
6
|
useWorkspace,
|
|
7
7
|
} from "@getpaseo/plugin/client";
|
|
8
|
-
import { copyText, Icon, TextInput } from "@getpaseo/plugin/client/
|
|
9
|
-
import { ExternalLink } from "@getpaseo/plugin/client/ui";
|
|
8
|
+
import { copyText, ExternalLink, Icon, TextInput } from "@getpaseo/plugin/client/ui";
|
|
10
9
|
import { useIsMutating, useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
11
10
|
import type { ReactNode } from "react";
|
|
12
11
|
import { useCallback, useMemo, useState } from "react";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { PluginSurfaceProps } from "@getpaseo/plugin/client";
|
|
2
|
-
import { TextInput } from "@getpaseo/plugin/client/
|
|
2
|
+
import { TextInput } from "@getpaseo/plugin/client/ui";
|
|
3
3
|
import { useMemo, useState } from "react";
|
|
4
4
|
import type { TextStyle, ViewStyle } from "react-native";
|
|
5
5
|
import { Pressable, Text, View } from "react-native";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type PluginSurfaceProps, useRpc } from "@getpaseo/plugin/client";
|
|
2
|
-
import { TextInput } from "@getpaseo/plugin/client/
|
|
2
|
+
import { TextInput } from "@getpaseo/plugin/client/ui";
|
|
3
3
|
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
4
4
|
import { useEffect, useMemo, useRef, useState } from "react";
|
|
5
5
|
import type { TextStyle, ViewStyle } from "react-native";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { PluginSurfaceProps } from "@getpaseo/plugin/client";
|
|
2
|
-
import { TextInput } from "@getpaseo/plugin/client/
|
|
2
|
+
import { TextInput } from "@getpaseo/plugin/client/ui";
|
|
3
3
|
import { useState } from "react";
|
|
4
4
|
import { Pressable, Text, View } from "react-native";
|
|
5
5
|
import {
|
package/client/provider-icon.tsx
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { PluginButtonIconProps } from "@getpaseo/plugin/client";
|
|
2
|
-
import { Icon } from "@getpaseo/plugin/client/
|
|
2
|
+
import { Icon } from "@getpaseo/plugin/client/ui";
|
|
3
3
|
import type { ComponentType } from "react";
|
|
4
4
|
import { View } from "react-native";
|
|
5
5
|
import { type QuotaSeverity, quotaProviderIconName } from "./quota-state";
|
package/client/quota-popover.tsx
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type PluginButtonContentProps, useAgent, useRpc } from "@getpaseo/plugin/client";
|
|
2
|
-
import { Icon } from "@getpaseo/plugin/client/
|
|
2
|
+
import { Icon } from "@getpaseo/plugin/client/ui";
|
|
3
3
|
import { useQuery } from "@tanstack/react-query";
|
|
4
4
|
import { useMemo } from "react";
|
|
5
5
|
import { Text, View } from "react-native";
|
package/client/svg.d.ts
ADDED
package/index.client.tsx
CHANGED
|
@@ -4,7 +4,7 @@ import type {
|
|
|
4
4
|
PluginClientContext,
|
|
5
5
|
PluginSurfaceProps,
|
|
6
6
|
} from "@getpaseo/plugin/client";
|
|
7
|
-
import {
|
|
7
|
+
import { OMP_ICON } from "./client/hub-icon";
|
|
8
8
|
import { HubPopover } from "./client/hub-popover";
|
|
9
9
|
import { ConfigSidebarItem, createHubSidebar } from "./client/hub-sidebar";
|
|
10
10
|
import { summarizeHubProcesses } from "./client/hub-status";
|
|
@@ -184,7 +184,6 @@ export default function contribute(client: PluginClientContext) {
|
|
|
184
184
|
id: "memory",
|
|
185
185
|
title: "OMP Memory",
|
|
186
186
|
icon: "Brain",
|
|
187
|
-
context: "workspace",
|
|
188
187
|
locations: ["explorer"],
|
|
189
188
|
Component: OmpMemoryPanel,
|
|
190
189
|
});
|
|
@@ -202,7 +201,6 @@ export default function contribute(client: PluginClientContext) {
|
|
|
202
201
|
id: "workspace",
|
|
203
202
|
title: "OMP",
|
|
204
203
|
icon: "Settings",
|
|
205
|
-
context: "workspace",
|
|
206
204
|
locations: ["workspace", "explorer"],
|
|
207
205
|
Component: OmpWorkspacePanel,
|
|
208
206
|
});
|
|
@@ -279,7 +277,7 @@ export default function contribute(client: PluginClientContext) {
|
|
|
279
277
|
agentId: agent.id,
|
|
280
278
|
button: {
|
|
281
279
|
title: "Hub processes",
|
|
282
|
-
icon:
|
|
280
|
+
icon: OMP_ICON,
|
|
283
281
|
label: "Hub",
|
|
284
282
|
visible: false,
|
|
285
283
|
behavior: { kind: "popover", Content: HubPopover },
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@omercnet/paseo-omp",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.0",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@omercnet/paseo-omp",
|
|
9
|
-
"version": "
|
|
9
|
+
"version": "4.0.0",
|
|
10
10
|
"dependencies": {
|
|
11
|
-
"@getpaseo/protocol": "0.
|
|
11
|
+
"@getpaseo/protocol": "0.13.0",
|
|
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.13.0",
|
|
18
|
+
"resolved": "https://registry.npmjs.org/@getpaseo/protocol/-/protocol-0.13.0.tgz",
|
|
19
|
+
"integrity": "sha512-g5Hp6QP5hV7KTCrSRBVye2+qhptwnhhLXRn6PHaS1L8PgmeRh5LvrE8PZq3HRq8B1WxflVDuV2WRB2Z3FNcvJA==",
|
|
20
20
|
"dependencies": {
|
|
21
21
|
"semver": "^7.8.5",
|
|
22
22
|
"zod": "^4.4.3"
|
|
@@ -121,18 +121,18 @@
|
|
|
121
121
|
}
|
|
122
122
|
},
|
|
123
123
|
"node_modules/body-parser": {
|
|
124
|
-
"version": "2.
|
|
125
|
-
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.
|
|
126
|
-
"integrity": "sha512-
|
|
124
|
+
"version": "2.4.0",
|
|
125
|
+
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.4.0.tgz",
|
|
126
|
+
"integrity": "sha512-Ifk1KcLrxaGt1occQagQNFNNOqRt1LFuehEnHHzB8Z6cRgIxRU1TBaiIsUiCdA+gy5PL7Y1IX31DNKkRmxtXjQ==",
|
|
127
127
|
"license": "MIT",
|
|
128
128
|
"dependencies": {
|
|
129
129
|
"bytes": "^3.1.2",
|
|
130
|
-
"content-type": "^2.
|
|
130
|
+
"content-type": "^2.1.0",
|
|
131
131
|
"debug": "^4.4.3",
|
|
132
132
|
"http-errors": "^2.0.1",
|
|
133
|
-
"iconv-lite": "^0.7.
|
|
133
|
+
"iconv-lite": "^0.7.3",
|
|
134
134
|
"on-finished": "^2.4.1",
|
|
135
|
-
"qs": "^6.
|
|
135
|
+
"qs": "^6.16.1",
|
|
136
136
|
"raw-body": "^3.0.2",
|
|
137
137
|
"type-is": "^2.1.0"
|
|
138
138
|
},
|
|
@@ -469,9 +469,9 @@
|
|
|
469
469
|
"license": "MIT"
|
|
470
470
|
},
|
|
471
471
|
"node_modules/fast-uri": {
|
|
472
|
-
"version": "3.1.
|
|
473
|
-
"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.
|
|
474
|
-
"integrity": "sha512-
|
|
472
|
+
"version": "3.1.9",
|
|
473
|
+
"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.9.tgz",
|
|
474
|
+
"integrity": "sha512-hS/0Wt3Ya043oKXs0sIxrMpKQITXhMLIrVAKKXi4gozGC9v7YRWVnXIZzjNPTO02M9BdxLCWqK1yRXgNziVyJQ==",
|
|
475
475
|
"funding": [
|
|
476
476
|
{
|
|
477
477
|
"type": "github",
|
|
@@ -687,9 +687,9 @@
|
|
|
687
687
|
"license": "ISC"
|
|
688
688
|
},
|
|
689
689
|
"node_modules/jose": {
|
|
690
|
-
"version": "6.2.
|
|
691
|
-
"resolved": "https://registry.npmjs.org/jose/-/jose-6.2.
|
|
692
|
-
"integrity": "sha512-
|
|
690
|
+
"version": "6.2.13",
|
|
691
|
+
"resolved": "https://registry.npmjs.org/jose/-/jose-6.2.13.tgz",
|
|
692
|
+
"integrity": "sha512-7TIg10ZE1x82YediN+lcrPNvGMKge9yFHQD+Qho/b8y2adfugU3AsvvHfxV0fzyFllT6l9xCjf4RWY9g/Z9PJQ==",
|
|
693
693
|
"license": "MIT",
|
|
694
694
|
"funding": {
|
|
695
695
|
"url": "https://github.com/sponsors/panva"
|
|
@@ -823,15 +823,19 @@
|
|
|
823
823
|
}
|
|
824
824
|
},
|
|
825
825
|
"node_modules/on-finished": {
|
|
826
|
-
"version": "2.4.
|
|
827
|
-
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.
|
|
828
|
-
"integrity": "sha512-
|
|
826
|
+
"version": "2.4.2",
|
|
827
|
+
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.2.tgz",
|
|
828
|
+
"integrity": "sha512-ATWUv387i+nLD49EiDoOft5scf32Vsdz3ktrQJG9bi7jRFmaXTssvyvj1EmeKVVgvesbqUtvQQvaS2TpTukAZQ==",
|
|
829
829
|
"license": "MIT",
|
|
830
830
|
"dependencies": {
|
|
831
831
|
"ee-first": "1.1.1"
|
|
832
832
|
},
|
|
833
833
|
"engines": {
|
|
834
834
|
"node": ">= 0.8"
|
|
835
|
+
},
|
|
836
|
+
"funding": {
|
|
837
|
+
"type": "opencollective",
|
|
838
|
+
"url": "https://opencollective.com/express"
|
|
835
839
|
}
|
|
836
840
|
},
|
|
837
841
|
"node_modules/once": {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@omercnet/paseo-omp",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Paseo integration for OMP, including its direct provider and workspace tooling.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -53,16 +53,16 @@
|
|
|
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.13.0",
|
|
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.
|
|
62
|
+
"@getpaseo/cli": "0.13.0",
|
|
63
|
+
"@getpaseo/client": "0.13.0",
|
|
64
|
+
"@getpaseo/plugin": "0.13.0",
|
|
65
|
+
"@getpaseo/server": "0.13.0",
|
|
66
66
|
"@oh-my-pi/pi-agent-core": "18.10.1",
|
|
67
67
|
"@oh-my-pi/pi-coding-agent": "18.10.1",
|
|
68
68
|
"@tanstack/react-query": "^5.102.3",
|
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.
|
|
4
|
+
"requirements": { "paseo": "^0.13.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
|
+
export const PASEO_OMP_PACKAGE_VERSION = "4.0.0"; // x-release-please-version
|
|
@@ -71,6 +71,7 @@ const CHUNK_STALE_MS = 30_000;
|
|
|
71
71
|
const MAX_PHYSICAL_FRAME_BYTES = 1024 * 1024;
|
|
72
72
|
const MAX_STREAM_TEXT_LENGTH = 4 * 1024 * 1024;
|
|
73
73
|
const MAX_ACTIVE_TOOLS = 64;
|
|
74
|
+
const MAX_ENDED_TOOL_IDS = 1_024;
|
|
74
75
|
const MAX_PENDING_REQUESTS = 256;
|
|
75
76
|
const MAX_PENDING_ONE_WAY_WRITES = 256;
|
|
76
77
|
const MAX_PENDING_WRITE_BYTES = 8 * 1024 * 1024;
|
|
@@ -164,6 +165,9 @@ export class OmpRpcProcess {
|
|
|
164
165
|
private readonly streamedBlocks = new Map<number, string>();
|
|
165
166
|
private readonly activeToolCallIds = new Set<string>();
|
|
166
167
|
private readonly announcedToolCallIds = new Set<string>();
|
|
168
|
+
// Detached background tools keep streaming updates after they return and after turn_end.
|
|
169
|
+
// FIFO-capped: an update for an id evicted after MAX_ENDED_TOOL_IDS later calls is flagged again.
|
|
170
|
+
private readonly endedToolCallIds = new Set<string>();
|
|
167
171
|
private pendingWriteBytes = 0;
|
|
168
172
|
private commandTextLength = 0;
|
|
169
173
|
private lineParts: Buffer[] = [];
|
|
@@ -1081,6 +1085,8 @@ export class OmpRpcProcess {
|
|
|
1081
1085
|
});
|
|
1082
1086
|
return;
|
|
1083
1087
|
}
|
|
1088
|
+
// Emitted once the session has no live or background work. Nothing consumes it yet.
|
|
1089
|
+
if (type === "session_settled") return;
|
|
1084
1090
|
if (type === "ready") {
|
|
1085
1091
|
if (this.readyReceived) {
|
|
1086
1092
|
this.recordProtocolViolation("duplicate-ready", {
|
|
@@ -1121,6 +1127,12 @@ export class OmpRpcProcess {
|
|
|
1121
1127
|
});
|
|
1122
1128
|
return;
|
|
1123
1129
|
}
|
|
1130
|
+
if (
|
|
1131
|
+
event.data.type === "tool_execution_update" &&
|
|
1132
|
+
this.endedToolCallIds.has(event.data.toolCallId)
|
|
1133
|
+
) {
|
|
1134
|
+
return;
|
|
1135
|
+
}
|
|
1124
1136
|
if (!this.acceptEventState(event.data)) {
|
|
1125
1137
|
this.recordProtocolViolation("invalid-event-state", {
|
|
1126
1138
|
reason: "event-state-transition",
|
|
@@ -1188,6 +1200,7 @@ export class OmpRpcProcess {
|
|
|
1188
1200
|
return false;
|
|
1189
1201
|
}
|
|
1190
1202
|
this.activeToolCallIds.add(event.toolCallId);
|
|
1203
|
+
this.endedToolCallIds.delete(event.toolCallId);
|
|
1191
1204
|
return true;
|
|
1192
1205
|
}
|
|
1193
1206
|
if (event.type === "tool_stream_update") {
|
|
@@ -1203,6 +1216,11 @@ export class OmpRpcProcess {
|
|
|
1203
1216
|
if (!this.activeToolCallIds.has(event.toolCallId)) return false;
|
|
1204
1217
|
this.activeToolCallIds.delete(event.toolCallId);
|
|
1205
1218
|
this.announcedToolCallIds.delete(event.toolCallId);
|
|
1219
|
+
if (this.endedToolCallIds.size >= MAX_ENDED_TOOL_IDS) {
|
|
1220
|
+
const oldest = this.endedToolCallIds.values().next().value;
|
|
1221
|
+
if (oldest !== undefined) this.endedToolCallIds.delete(oldest);
|
|
1222
|
+
}
|
|
1223
|
+
this.endedToolCallIds.add(event.toolCallId);
|
|
1206
1224
|
return true;
|
|
1207
1225
|
}
|
|
1208
1226
|
if (
|
|
@@ -173,7 +173,7 @@ export function createOmpProvider(options: OmpProviderOptions = {}): ProviderReg
|
|
|
173
173
|
id: "omp-plugin",
|
|
174
174
|
label: "OMP Plugin",
|
|
175
175
|
description: "Direct plugin provider for OMP's rpc-ui protocol",
|
|
176
|
-
icon: "
|
|
176
|
+
icon: "shared/omp.svg",
|
|
177
177
|
providerOptionsSchema: OmpProviderOptionsSchema,
|
|
178
178
|
async getCatalogCacheKey(catalogOptions) {
|
|
179
179
|
const providerOptions = parseOmpProviderOptions(catalogOptions.providerOptions);
|
package/client/hub-icon.tsx
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { PluginButtonIconProps } from "@getpaseo/plugin/client";
|
|
2
|
-
import { Text, View } from "react-native";
|
|
3
|
-
|
|
4
|
-
// omp (oh-my-pi) uses the option/alt-key glyph "⌥" as its mark; there is no separate
|
|
5
|
-
// logo asset to bundle, so the pill renders the glyph directly at the host's icon size.
|
|
6
|
-
export function OmpIcon({ size, color }: PluginButtonIconProps) {
|
|
7
|
-
return (
|
|
8
|
-
<View style={{ width: size, height: size, alignItems: "center", justifyContent: "center" }}>
|
|
9
|
-
<Text style={{ fontSize: size * 0.85, lineHeight: size, color, fontWeight: "600" }}>⌥</Text>
|
|
10
|
-
</View>
|
|
11
|
-
);
|
|
12
|
-
}
|
|
File without changes
|