@omercnet/paseo-omp 0.4.0 → 1.0.0-next.160.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.
Files changed (40) hide show
  1. package/README.md +8 -8
  2. package/client/external-url.ts +2 -11
  3. package/client/omp-config-styles.ts +284 -0
  4. package/client/omp-config-surface.tsx +16 -286
  5. package/client/omp-routing-editor.tsx +1 -3
  6. package/client/provider-launch-settings.tsx +118 -0
  7. package/index.client.tsx +21 -2
  8. package/index.server.ts +10 -0
  9. package/package.json +14 -9
  10. package/paseo-plugin.json +2 -1
  11. package/scripts/prepare-dependencies.mjs +44 -11
  12. package/server/omp-models.ts +2 -6
  13. package/server/package-version.ts +1 -1
  14. package/server/protocol-violation-diagnostics.ts +1 -1
  15. package/server/provider/catalog.ts +2 -1
  16. package/server/provider/config-normalization.ts +19 -3
  17. package/server/provider/connection.ts +30 -0
  18. package/server/provider/host-tools.ts +2 -2
  19. package/server/provider/mcp-transport.ts +9 -2
  20. package/server/provider/omp-rpc-environment.ts +368 -0
  21. package/server/provider/omp-rpc-process.ts +119 -0
  22. package/server/provider/omp-rpc-protocol.ts +1949 -0
  23. package/server/provider/omp-rpc-transport.ts +1373 -0
  24. package/server/provider/omp-rpc-values.ts +31 -0
  25. package/server/provider/omp-rpc.ts +267 -3311
  26. package/server/provider/profile-providers.ts +2 -1
  27. package/server/provider/prompt-payload.ts +253 -0
  28. package/server/provider/registration.ts +10 -2
  29. package/server/provider/session-compaction.ts +187 -0
  30. package/server/provider/session-descriptors.ts +52 -18
  31. package/server/provider/session-events.ts +42 -0
  32. package/server/provider/session-permissions.ts +987 -0
  33. package/server/provider/session-terminal.ts +307 -0
  34. package/server/provider/session-usage.ts +234 -0
  35. package/server/provider/session.ts +145 -1853
  36. package/server/provider/settings.ts +8 -5
  37. package/server/provider/subsessions.ts +30 -9
  38. package/server/provider/timeline-projector.ts +140 -29
  39. package/shared/external-url.ts +0 -9
  40. package/shared/provider-launch-settings.ts +18 -0
package/README.md CHANGED
@@ -20,7 +20,7 @@ before capture.
20
20
 
21
21
  ## Quick start
22
22
 
23
- Requirements: Paseo `>=0.9.0-beta.1 <0.10.0`, OMP `18.1.15` or newer, and OMP RPC protocol v2. Paseo 0.9 is required for the Help report's supported copy and external-link APIs, nested provider-subagent ancestry, spawning-tool links, npm-managed installation, and the complete client integration.
23
+ Requirements: Paseo `^0.9.2`, OMP `18.1.15` or newer, and OMP RPC protocol v2. Paseo 0.9.2 is required for reliable plugin-provider request failure containment, reload cleanup, and daemon shutdown ordering, in addition to the 0.9 client APIs used by the plugin.
24
24
 
25
25
  ```bash
26
26
  paseo plugin install npm:@omercnet/paseo-omp@<version>
@@ -36,7 +36,7 @@ Open the **OMP** sidebar to review the provider-profile contract, choose which c
36
36
  - [Core-provider issue and parity audit](docs/core-provider-issue-audit.md)
37
37
  - [Alpha release checklist](docs/alpha-release-checklist.md)
38
38
 
39
- The plugin uses public Paseo 0.9 beta provider and client contracts and registers distinct `omp-plugin` and `omp-plugin-<profile>` identities; it does not modify the bundled `omp` provider.
39
+ The plugin uses public Paseo 0.9 provider and client contracts and registers distinct `omp-plugin` and `omp-plugin-<profile>` identities; it does not modify the bundled `omp` provider.
40
40
 
41
41
  ## Named OMP profiles
42
42
 
@@ -50,7 +50,7 @@ Profile selection is request-local: concurrent clients cannot change each other'
50
50
 
51
51
  ## Paseo provider SDK coverage
52
52
 
53
- This matrix inventories the complete capability set exported by the pinned `@getpaseo/plugin` 0.9.0-beta.1 provider SDK. It measures strict SDK surface coverage, not general product quality.
53
+ This matrix inventories the complete capability set exported by the pinned `@getpaseo/plugin` 0.9.2 provider SDK. It measures strict SDK surface coverage, not general product quality.
54
54
 
55
55
  **Current capability completeness: 61.8%.** The provider advertises 11 of 17 capabilities (64.7%); ten are complete and `session.configure` is partial.
56
56
 
@@ -86,12 +86,12 @@ Provider functionality outside the capability flags is tracked separately:
86
86
  | Provider SDK surface | Completeness | Implementation |
87
87
  | --- | ---: | --- |
88
88
  | Registration metadata and sanitized SVG icon | **100%** | Stable `omp-plugin` identity, label, description, and bundled icon. |
89
- | Strict `providerOptionsSchema` | **100%** | Command, literal and names-only inherited environment, output-redaction mode, session directory, RPC timeout, and role-model options are validated and normalized. |
89
+ | 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. |
90
90
  | Availability diagnostics | **100%** | Bounded checks distinguish missing, unrunnable, incompatible, and available OMP runtimes. |
91
- | Catalog cache identity | **100%** | Hash includes effective options, configured inherited-environment names, settings, scope, cwd, and default command, but never resolves or fingerprints inherited values. |
91
+ | 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. |
92
92
  | Models, modes, and thinking catalog | **100%** | Native catalog is mapped to opaque public model IDs with committed defaults and permission-gated modes. |
93
93
  | Connection `send` / `onEvent` / `close` lifecycle | **100%** | Request correlation, multi-session ownership, process recovery, teardown, and provider reload/removal are covered. |
94
- | Session launch: cwd, env, system prompt, title, and persistence | **100%** | Complete launch configuration is bounded, validated, forwarded, and re-read on recovery; selected daemon environment values are resolved only when catalog and session children spawn. |
94
+ | 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. |
95
95
  | 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. |
96
96
  | Denied native tools | **100%** | `disallowedTools` becomes an explicit OMP allow-list; unknown names fail closed. |
97
97
  | Commands and committed session state events | **100%** | Publishes `session.commands`, `session.opened`, `session.config`, `session.ready`, and request completion in protocol order. |
@@ -113,7 +113,7 @@ Existing agents whose provider is `omp` remain owned by the bundled provider. Ne
113
113
 
114
114
  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.
115
115
 
116
- Paseo 0.9.0-beta.1 is the verified canary target and minimum supported release. It preserves nested provider-subagent ancestry and spawning-tool links, and provides npm-managed plugin sources, platform-owned external URL opening, and whole-item timeline transforms before Overview grouping. The required full Docker canary passes there with OMP 18.1.15 and 18.2.0.
116
+ Paseo 0.9.2 is the minimum supported release. The controlled Docker canary uses the pinned official 0.9.2 image; its compatibility matrix covers OMP 18.1.15 and 18.2.0. 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.
117
117
 
118
118
  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.
119
119
 
@@ -121,7 +121,7 @@ Install, update, disable, or remove `paseo-omp` independently of the bundled pro
121
121
 
122
122
  The plugin validates OMP protocol data and bounds public strings and structured values. It does not heuristically redact or rewrite content produced by native OMP, models, or tools. Do not put credentials in prompts or tool output, because that content may be published unchanged after validation and bounding.
123
123
 
124
- `providerOptions.outputRedaction` defaults to `none`, preserving native content subject to those bounds. `configured-values` provides best-effort literal replacement for explicitly supplied credential values and every non-empty daemon value selected through `inheritEnv`, regardless of its name. It does not detect generated secrets or encoded, transformed, or independently streamed fragments of configured values. Centralized Paseo policy is required when a deployment needs redaction guarantees.
124
+ `providerOptions.outputRedaction` defaults to `none`, preserving native content subject to those bounds. `configured-values` provides best-effort literal replacement for explicitly supplied credential values and every non-empty daemon value selected through host or profile `inheritEnv`, regardless of its name. It does not detect generated secrets or encoded, transformed, or independently streamed fragments of configured values. Centralized Paseo policy is required when a deployment needs redaction guarantees.
125
125
 
126
126
  Unexpected or internal launch failures use fixed fallback messages rather than serializing the launch configuration. Explicit public validation errors may include caller-supplied configuration names or values. Deployments that require host-wide content redaction should implement it in a dedicated host or plugin layer rather than this protocol adapter.
127
127
 
@@ -1,14 +1,5 @@
1
- import * as paseoClient from "@getpaseo/plugin/client";
2
- import { Linking } from "react-native";
3
- import { selectExternalUrlOpener, validatedHttpUrl } from "../shared/external-url";
4
-
5
- const paseoOpenExternalUrl =
6
- "openExternalUrl" in paseoClient && typeof paseoClient.openExternalUrl === "function"
7
- ? paseoClient.openExternalUrl
8
- : undefined;
9
- const openExternalUrl = selectExternalUrlOpener(paseoOpenExternalUrl, (url) =>
10
- Linking.openURL(url),
11
- );
1
+ import { openExternalUrl } from "@getpaseo/plugin/client";
2
+ import { validatedHttpUrl } from "../shared/external-url";
12
3
 
13
4
  export function openOmpExternalUrl(url: string): Promise<void> {
14
5
  return openExternalUrl(validatedHttpUrl(url));
@@ -0,0 +1,284 @@
1
+ import type { PluginSurfaceProps } from "@getpaseo/plugin/client";
2
+ import { useMemo } from "react";
3
+ import type { TextStyle, ViewStyle } from "react-native";
4
+
5
+ export interface OmpConfigStyles {
6
+ root: ViewStyle;
7
+ pageTitle: TextStyle;
8
+ topTabs: ViewStyle;
9
+ topTab: ViewStyle;
10
+ topTabActive: ViewStyle;
11
+ topTabLabel: TextStyle;
12
+ topTabLabelActive: TextStyle;
13
+ workspace: ViewStyle;
14
+ categoryRail: ViewStyle;
15
+ categoryList: ViewStyle;
16
+ categoryButton: ViewStyle;
17
+ categoryButtonActive: ViewStyle;
18
+ categoryLabel: TextStyle;
19
+ categoryLabelActive: TextStyle;
20
+ categoryContent: ViewStyle;
21
+ search: TextStyle;
22
+ sectionHeader: ViewStyle;
23
+ sectionHeaderRow: ViewStyle;
24
+ sectionTitle: TextStyle;
25
+ source: TextStyle;
26
+ muted: TextStyle;
27
+ error: TextStyle;
28
+ refresh: ViewStyle;
29
+ docsActions: ViewStyle;
30
+ docLink: ViewStyle;
31
+ docLinkPressed: ViewStyle;
32
+ docLinkText: TextStyle;
33
+ refreshLabel: TextStyle;
34
+ helpActions: ViewStyle;
35
+ helpReport: ViewStyle;
36
+ helpReportText: TextStyle;
37
+ helpLinkText: TextStyle;
38
+ card: ViewStyle;
39
+ cardHeader: ViewStyle;
40
+ cardTitle: TextStyle;
41
+ row: ViewStyle;
42
+ rowLabel: TextStyle;
43
+ rowValue: TextStyle;
44
+ setting: ViewStyle;
45
+ settingHeader: ViewStyle;
46
+ settingPath: TextStyle;
47
+ settingDescription: TextStyle;
48
+ settingValue: TextStyle;
49
+ collectionSummary: TextStyle;
50
+ chipList: ViewStyle;
51
+ chip: ViewStyle;
52
+ chipText: TextStyle;
53
+ recordList: ViewStyle;
54
+ recordRow: ViewStyle;
55
+ recordKey: TextStyle;
56
+ recordValue: TextStyle;
57
+ editorActions: ViewStyle;
58
+ editorAction: ViewStyle;
59
+ editorActionPrimary: ViewStyle;
60
+ editorActionText: TextStyle;
61
+ editorActionTextPrimary: TextStyle;
62
+ scalarInput: TextStyle;
63
+ resetAction: TextStyle;
64
+ }
65
+
66
+ export function useConfigStyles(
67
+ theme: PluginSurfaceProps["theme"],
68
+ compact: boolean,
69
+ ): OmpConfigStyles {
70
+ return useMemo(
71
+ () => ({
72
+ root: {
73
+ flex: 1,
74
+ gap: compact ? 10 : 14,
75
+ padding: compact ? 16 : 24,
76
+ backgroundColor: theme.colors.surface0,
77
+ },
78
+ pageTitle: {
79
+ color: theme.colors.foreground,
80
+ fontSize: compact ? 22 : 26,
81
+ fontWeight: "700",
82
+ },
83
+ topTabs: {
84
+ flexWrap: "wrap",
85
+ flexDirection: "row",
86
+ alignSelf: "flex-start",
87
+ gap: 4,
88
+ padding: 4,
89
+ borderWidth: 1,
90
+ borderColor: theme.colors.border,
91
+ borderRadius: 10,
92
+ backgroundColor: theme.colors.surface1,
93
+ },
94
+ topTab: {
95
+ paddingHorizontal: compact ? 10 : 14,
96
+ paddingVertical: 8,
97
+ borderRadius: 7,
98
+ },
99
+ topTabActive: { backgroundColor: theme.colors.accent },
100
+ topTabLabel: { color: theme.colors.foregroundMuted, fontSize: 13, fontWeight: "600" },
101
+ topTabLabelActive: { color: theme.colors.accentForeground },
102
+ workspace: {
103
+ flexDirection: compact ? "column" : "row",
104
+ alignItems: compact ? "stretch" : "flex-start",
105
+ gap: compact ? 10 : 18,
106
+ },
107
+ categoryRail: {
108
+ width: compact ? "100%" : 220,
109
+ gap: 10,
110
+ padding: 10,
111
+ borderWidth: 1,
112
+ borderColor: theme.colors.border,
113
+ borderRadius: 10,
114
+ backgroundColor: theme.colors.surface1,
115
+ },
116
+ categoryList: { gap: 4 },
117
+ categoryButton: { paddingHorizontal: 10, paddingVertical: 9, borderRadius: 7 },
118
+ categoryButtonActive: { backgroundColor: theme.colors.surface2 },
119
+ categoryLabel: { color: theme.colors.foregroundMuted, fontSize: 13, fontWeight: "500" },
120
+ categoryLabelActive: { color: theme.colors.foreground, fontWeight: "700" },
121
+ categoryContent: { flex: compact ? undefined : 1, minWidth: 0, gap: 10 },
122
+ search: {
123
+ color: theme.colors.foreground,
124
+ borderWidth: 1,
125
+ borderColor: theme.colors.border,
126
+ borderRadius: 8,
127
+ backgroundColor: theme.colors.surface0,
128
+ paddingHorizontal: 10,
129
+ paddingVertical: 8,
130
+ fontSize: 13,
131
+ },
132
+ sectionHeader: { gap: 4, marginTop: compact ? 2 : 4 },
133
+ sectionHeaderRow: { flexDirection: "row", alignItems: "center", flexWrap: "wrap", gap: 10 },
134
+ sectionTitle: {
135
+ color: theme.colors.foreground,
136
+ fontSize: compact ? 16 : 18,
137
+ fontWeight: "600",
138
+ },
139
+ source: { color: theme.colors.foregroundMuted, fontSize: 12 },
140
+ muted: { color: theme.colors.foregroundMuted, fontSize: 13 },
141
+ error: { color: theme.colors.statusDanger, fontSize: 13 },
142
+ docsActions: { flexDirection: "row", alignItems: "center", flexWrap: "wrap", gap: 6 },
143
+ docLink: {
144
+ paddingHorizontal: 8,
145
+ paddingVertical: 5,
146
+ borderWidth: 1,
147
+ borderColor: theme.colors.border,
148
+ borderRadius: 7,
149
+ backgroundColor: theme.colors.surface1,
150
+ },
151
+ docLinkPressed: { opacity: 0.72 },
152
+ docLinkText: { color: theme.colors.accent, fontSize: 12, fontWeight: "600" },
153
+ refresh: {
154
+ flexDirection: "row",
155
+ alignItems: "center",
156
+ gap: 6,
157
+ paddingHorizontal: 10,
158
+ paddingVertical: 6,
159
+ borderWidth: 1,
160
+ borderColor: theme.colors.border,
161
+ borderRadius: 8,
162
+ backgroundColor: theme.colors.surface1,
163
+ },
164
+ refreshLabel: { color: theme.colors.foreground, fontSize: 13 },
165
+ helpActions: {
166
+ flexDirection: "row",
167
+ alignItems: "center",
168
+ flexWrap: "wrap",
169
+ gap: 8,
170
+ },
171
+ helpReport: {
172
+ maxWidth: "100%",
173
+ padding: compact ? 10 : 12,
174
+ borderWidth: 1,
175
+ borderColor: theme.colors.border,
176
+ borderRadius: 10,
177
+ backgroundColor: theme.colors.surface1,
178
+ },
179
+ helpReportText: {
180
+ color: theme.colors.foreground,
181
+ fontSize: compact ? 11 : 12,
182
+ lineHeight: compact ? 16 : 18,
183
+ },
184
+ helpLinkText: { color: theme.colors.accent, fontSize: 13, fontWeight: "600" },
185
+ cardHeader: {
186
+ flexDirection: "row",
187
+ alignItems: "center",
188
+ justifyContent: "space-between",
189
+ flexWrap: "wrap",
190
+ gap: 8,
191
+ },
192
+ card: {
193
+ gap: 8,
194
+ padding: compact ? 10 : 12,
195
+ borderWidth: 1,
196
+ borderColor: theme.colors.border,
197
+ borderRadius: 10,
198
+ backgroundColor: theme.colors.surface1,
199
+ },
200
+ cardTitle: { color: theme.colors.foreground, fontSize: 14, fontWeight: "600" },
201
+ row: { flexDirection: "row", gap: 8, flexWrap: "wrap" },
202
+ rowLabel: { color: theme.colors.foregroundMuted, fontSize: 13 },
203
+ rowValue: { color: theme.colors.foreground, fontSize: 13, flexShrink: 1 },
204
+ setting: {
205
+ gap: 5,
206
+ paddingVertical: 10,
207
+ borderTopWidth: 1,
208
+ borderTopColor: theme.colors.border,
209
+ },
210
+ settingHeader: {
211
+ flexDirection: "row",
212
+ alignItems: "baseline",
213
+ justifyContent: "space-between",
214
+ gap: 12,
215
+ },
216
+ settingPath: { color: theme.colors.foregroundMuted, fontSize: 11, flexShrink: 1 },
217
+ settingDescription: { color: theme.colors.foregroundMuted, fontSize: 12, lineHeight: 17 },
218
+ settingValue: { color: theme.colors.foreground, fontSize: 13, fontWeight: "600" },
219
+ collectionSummary: { color: theme.colors.foregroundMuted, fontSize: 12 },
220
+ chipList: { flexDirection: "row", flexWrap: "wrap", gap: 6 },
221
+ chip: {
222
+ paddingHorizontal: 8,
223
+ paddingVertical: 5,
224
+ borderWidth: 1,
225
+ borderColor: theme.colors.border,
226
+ borderRadius: 999,
227
+ backgroundColor: theme.colors.surface2,
228
+ },
229
+ chipText: { color: theme.colors.foreground, fontSize: 12 },
230
+ recordList: { gap: 6 },
231
+ recordRow: {
232
+ flexDirection: compact ? "column" : "row",
233
+ alignItems: compact ? "flex-start" : "baseline",
234
+ gap: compact ? 2 : 12,
235
+ paddingVertical: 5,
236
+ },
237
+ recordKey: {
238
+ width: compact ? undefined : 150,
239
+ color: theme.colors.foregroundMuted,
240
+ fontSize: 12,
241
+ fontWeight: "600",
242
+ },
243
+ recordValue: { flex: 1, color: theme.colors.foreground, fontSize: 12 },
244
+ editorActions: {
245
+ flexDirection: "row",
246
+ alignItems: "center",
247
+ justifyContent: "flex-end",
248
+ gap: 8,
249
+ padding: 10,
250
+ borderWidth: 1,
251
+ borderColor: theme.colors.border,
252
+ borderRadius: 10,
253
+ backgroundColor: theme.colors.surface1,
254
+ },
255
+ editorAction: {
256
+ paddingHorizontal: 12,
257
+ paddingVertical: 8,
258
+ borderWidth: 1,
259
+ borderColor: theme.colors.border,
260
+ borderRadius: 8,
261
+ },
262
+ editorActionPrimary: {
263
+ backgroundColor: theme.colors.accent,
264
+ borderColor: theme.colors.accent,
265
+ },
266
+ editorActionText: { color: theme.colors.foreground, fontSize: 13, fontWeight: "600" },
267
+ editorActionTextPrimary: { color: theme.colors.accentForeground },
268
+ scalarInput: {
269
+ minWidth: 180,
270
+ maxWidth: 420,
271
+ color: theme.colors.foreground,
272
+ borderWidth: 1,
273
+ borderColor: theme.colors.border,
274
+ borderRadius: 7,
275
+ backgroundColor: theme.colors.surface0,
276
+ paddingHorizontal: 9,
277
+ paddingVertical: 6,
278
+ fontSize: 13,
279
+ },
280
+ resetAction: { color: theme.colors.accent, fontSize: 12, fontWeight: "600" },
281
+ }),
282
+ [compact, theme],
283
+ );
284
+ }