@omercnet/paseo-omp 0.2.1-next.72.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/CHANGELOG.md +87 -0
- package/LICENSE +21 -0
- package/README.md +120 -0
- package/SUPPORT.md +42 -0
- package/TESTING.md +150 -0
- package/client/composer-pill-settings.tsx +157 -0
- package/client/hub-icon.tsx +12 -0
- package/client/hub-popover.tsx +132 -0
- package/client/hub-status.ts +29 -0
- package/client/mcp-authorization.tsx +168 -0
- package/client/mcp-popover.tsx +155 -0
- package/client/memory-panel.tsx +76 -0
- package/client/memory-popover.tsx +74 -0
- package/client/omp-config-surface.tsx +1433 -0
- package/client/omp-doc-links.ts +117 -0
- package/client/omp-plugin-manager.tsx +1004 -0
- package/client/omp-store-picker.tsx +89 -0
- package/client/omp-store-state.ts +45 -0
- package/client/provider-diagnostics-state.ts +262 -0
- package/client/provider-icon.tsx +27 -0
- package/client/provider-image.tsx +66 -0
- package/client/quota-popover.tsx +155 -0
- package/client/quota-state.ts +140 -0
- package/client/sessions-popover.tsx +78 -0
- package/docs/alpha-release-checklist.md +68 -0
- package/docs/configuration.md +126 -0
- package/docs/core-provider-issue-audit.md +108 -0
- package/docs/images/mcp-authorization-compact.png +0 -0
- package/docs/images/mcp-controls-wide.png +0 -0
- package/docs/images/plugin-manager.png +0 -0
- package/docs/images/workspace-settings.png +0 -0
- package/docs/installation.md +67 -0
- package/index.client.tsx +488 -0
- package/index.server.ts +81 -0
- package/package.json +84 -0
- package/paseo-plugin.json +5 -0
- package/scripts/prepare-dependencies.mjs +20 -0
- package/server/hub.ts +145 -0
- package/server/mcp-browser.ts +95 -0
- package/server/memory.ts +86 -0
- package/server/mutation-queue.ts +12 -0
- package/server/omp-config.ts +135 -0
- package/server/omp-plugins.ts +676 -0
- package/server/omp-settings.ts +499 -0
- package/server/paths.ts +181 -0
- package/server/provider/catalog.ts +172 -0
- package/server/provider/config-normalization.ts +148 -0
- package/server/provider/connection.ts +1196 -0
- package/server/provider/host-tools.ts +777 -0
- package/server/provider/image.ts +143 -0
- package/server/provider/mcp-transport.ts +394 -0
- package/server/provider/omp-rpc.ts +2806 -0
- package/server/provider/omp.svg +5 -0
- package/server/provider/profile-providers.ts +249 -0
- package/server/provider/provider-options.ts +27 -0
- package/server/provider/registration.ts +162 -0
- package/server/provider/security.ts +317 -0
- package/server/provider/session-descriptors.ts +736 -0
- package/server/provider/session.ts +4796 -0
- package/server/provider/settings.ts +78 -0
- package/server/provider/subsessions.ts +850 -0
- package/server/provider/timeline-projector.ts +1801 -0
- package/server/provider-diagnostics.ts +1143 -0
- package/server/quota.ts +55 -0
- package/server/sessions.ts +58 -0
- package/shared/composer-pill-settings.ts +28 -0
- package/shared/hub.ts +43 -0
- package/shared/mcp.ts +47 -0
- package/shared/memory.ts +24 -0
- package/shared/omp-config.ts +85 -0
- package/shared/omp-plugins.ts +264 -0
- package/shared/omp-settings.ts +214 -0
- package/shared/omp-store.ts +58 -0
- package/shared/provider-diagnostics.ts +126 -0
- package/shared/provider-image.ts +160 -0
- package/shared/quota.ts +23 -0
- package/shared/sessions.ts +24 -0
- package/tsconfig.json +16 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import type { OmpQuota } from "../shared/quota";
|
|
2
|
+
import { isOmpProvider } from "./omp-store-state";
|
|
3
|
+
|
|
4
|
+
const PROVIDER_LABELS: Record<string, string> = {
|
|
5
|
+
anthropic: "Anthropic",
|
|
6
|
+
cursor: "Cursor",
|
|
7
|
+
"google-antigravity": "Google",
|
|
8
|
+
"openai-codex": "OpenAI",
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
// Paseo's own provider brand icons (@getpaseo/protocol names such as "claude" or "omp") are
|
|
12
|
+
// host-internal: passing one as a button `icon` string fails host validation, and rendering it
|
|
13
|
+
// through `Icon` draws nothing. Plugin icons resolve Lucide names only, so each provider maps
|
|
14
|
+
// to the Lucide vector closest to its mark.
|
|
15
|
+
const PROVIDER_ICON_NAMES: Record<string, string> = {
|
|
16
|
+
anthropic: "Asterisk",
|
|
17
|
+
azure: "Cloud",
|
|
18
|
+
cursor: "MousePointer2",
|
|
19
|
+
"google-antigravity": "Gem",
|
|
20
|
+
openai: "Atom",
|
|
21
|
+
"openai-codex": "Atom",
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export function quotaProviderIconName(provider: string | null): string {
|
|
25
|
+
return (provider ? PROVIDER_ICON_NAMES[provider] : undefined) ?? "Gauge";
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export type QuotaSeverity = "ok" | "warning" | "danger" | "unknown";
|
|
29
|
+
|
|
30
|
+
export function quotaSeverityFromFraction(fraction: number | null): QuotaSeverity {
|
|
31
|
+
if (fraction === null) return "unknown";
|
|
32
|
+
if (fraction >= 0.9) return "danger";
|
|
33
|
+
if (fraction >= 0.7) return "warning";
|
|
34
|
+
return "ok";
|
|
35
|
+
}
|
|
36
|
+
export function quotaProviderFromSession(
|
|
37
|
+
provider: string,
|
|
38
|
+
model: string | null = null,
|
|
39
|
+
): string | null {
|
|
40
|
+
const [runtime, modelProvider] = provider.split("/");
|
|
41
|
+
if (!isOmpProvider(runtime)) return null;
|
|
42
|
+
if (modelProvider) return modelProvider;
|
|
43
|
+
return model?.includes("/") ? model.split("/")[0] : null;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function quotaProviderLabel(provider: string | null): string {
|
|
47
|
+
return provider
|
|
48
|
+
? (PROVIDER_LABELS[provider] ?? `${provider.slice(0, 1).toUpperCase()}${provider.slice(1)}`)
|
|
49
|
+
: "Provider";
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function quotasForProvider(
|
|
53
|
+
quotas: readonly OmpQuota[],
|
|
54
|
+
provider: string | null,
|
|
55
|
+
includeAll = false,
|
|
56
|
+
): OmpQuota[] {
|
|
57
|
+
return provider
|
|
58
|
+
? quotas.filter((quota) => quota.provider === provider)
|
|
59
|
+
: includeAll
|
|
60
|
+
? [...quotas]
|
|
61
|
+
: [];
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function quotaSummaryForProvider(
|
|
65
|
+
quotas: readonly OmpQuota[],
|
|
66
|
+
provider: string | null,
|
|
67
|
+
includeAll = false,
|
|
68
|
+
): { visible: boolean; label: string } {
|
|
69
|
+
const matching = quotasForProvider(quotas, provider, includeAll);
|
|
70
|
+
const label = provider ? quotaProviderLabel(provider) : "Quotas";
|
|
71
|
+
const used = matching.flatMap((quota) =>
|
|
72
|
+
quota.usedFraction === null ? [] : [quota.usedFraction],
|
|
73
|
+
);
|
|
74
|
+
if (used.length === 0) {
|
|
75
|
+
return provider
|
|
76
|
+
? { visible: true, label: `${quotaProviderLabel(provider)} · —` }
|
|
77
|
+
: { visible: includeAll, label: "Quotas · —" };
|
|
78
|
+
}
|
|
79
|
+
const peak = Math.round(Math.max(...used) * 100);
|
|
80
|
+
return { visible: true, label: `${label} · ${peak}%` };
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export function quotaSeverityForProvider(
|
|
84
|
+
quotas: readonly OmpQuota[],
|
|
85
|
+
provider: string | null,
|
|
86
|
+
includeAll = false,
|
|
87
|
+
): QuotaSeverity {
|
|
88
|
+
const used = quotasForProvider(quotas, provider, includeAll).flatMap((quota) =>
|
|
89
|
+
quota.usedFraction === null ? [] : [quota.usedFraction],
|
|
90
|
+
);
|
|
91
|
+
return used.length === 0 ? "unknown" : quotaSeverityFromFraction(Math.max(...used));
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export type QuotaProviderGroup = {
|
|
95
|
+
provider: string;
|
|
96
|
+
quotas: OmpQuota[];
|
|
97
|
+
peakFraction: number | null;
|
|
98
|
+
severity: QuotaSeverity;
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
/** Groups every recorded provider (not just the active session's) so a popover can show the
|
|
102
|
+
* full comparison a user needs to decide which provider to switch to. The active session's
|
|
103
|
+
* provider always sorts first; the rest fall back to worst-quota-first. */
|
|
104
|
+
export function quotaProviderGroups(
|
|
105
|
+
quotas: readonly OmpQuota[],
|
|
106
|
+
currentProvider: string | null,
|
|
107
|
+
): QuotaProviderGroup[] {
|
|
108
|
+
const byProvider = new Map<string, OmpQuota[]>();
|
|
109
|
+
for (const quota of quotas) {
|
|
110
|
+
const group = byProvider.get(quota.provider);
|
|
111
|
+
if (group) group.push(quota);
|
|
112
|
+
else byProvider.set(quota.provider, [quota]);
|
|
113
|
+
}
|
|
114
|
+
const groups = [...byProvider.entries()].map(([provider, providerQuotas]) => {
|
|
115
|
+
const used = providerQuotas.flatMap((quota) =>
|
|
116
|
+
quota.usedFraction === null ? [] : [quota.usedFraction],
|
|
117
|
+
);
|
|
118
|
+
const peakFraction = used.length === 0 ? null : Math.max(...used);
|
|
119
|
+
return {
|
|
120
|
+
provider,
|
|
121
|
+
quotas: [...providerQuotas].sort((a, b) => (b.usedFraction ?? -1) - (a.usedFraction ?? -1)),
|
|
122
|
+
peakFraction,
|
|
123
|
+
severity: quotaSeverityFromFraction(peakFraction),
|
|
124
|
+
};
|
|
125
|
+
});
|
|
126
|
+
groups.sort((a, b) => {
|
|
127
|
+
if (a.provider === currentProvider) return -1;
|
|
128
|
+
if (b.provider === currentProvider) return 1;
|
|
129
|
+
return (b.peakFraction ?? -1) - (a.peakFraction ?? -1);
|
|
130
|
+
});
|
|
131
|
+
return groups;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export function quotaResetLabel(resetsAtMs: number | null, nowMs: number = Date.now()): string {
|
|
135
|
+
if (resetsAtMs === null) return "";
|
|
136
|
+
const remainingMs = Math.max(0, resetsAtMs - nowMs);
|
|
137
|
+
const hours = Math.floor(remainingMs / 3_600_000);
|
|
138
|
+
const minutes = Math.floor((remainingMs % 3_600_000) / 60_000);
|
|
139
|
+
return hours > 0 ? `resets ${hours}h ${minutes}m` : `resets ${minutes}m`;
|
|
140
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { type PluginButtonContentProps, useAgent, useRpc } from "@getpaseo/plugin/client";
|
|
2
|
+
import { useQuery } from "@tanstack/react-query";
|
|
3
|
+
import { useMemo } from "react";
|
|
4
|
+
import { ScrollView, Text, View } from "react-native";
|
|
5
|
+
import { storeForProvider, storeLabel } from "../shared/omp-store";
|
|
6
|
+
import { listOmpSessions } from "../shared/sessions";
|
|
7
|
+
import { ompStoreKey } from "./omp-store-state";
|
|
8
|
+
|
|
9
|
+
const SESSIONS_POLL_MS = 20_000;
|
|
10
|
+
const PREVIEW_LIMIT = 20;
|
|
11
|
+
|
|
12
|
+
function age(epochSeconds: number): string {
|
|
13
|
+
const seconds = Math.max(0, Math.floor(Date.now() / 1_000 - epochSeconds));
|
|
14
|
+
if (seconds < 60) return `${seconds}s ago`;
|
|
15
|
+
const minutes = Math.floor(seconds / 60);
|
|
16
|
+
if (minutes < 60) return `${minutes}m ago`;
|
|
17
|
+
const hours = Math.floor(minutes / 60);
|
|
18
|
+
if (hours < 24) return `${hours}h ago`;
|
|
19
|
+
return `${Math.floor(hours / 24)}d ago`;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function SessionsPopover(props: PluginButtonContentProps) {
|
|
23
|
+
const { theme, layout } = props;
|
|
24
|
+
const agentId = props.context === "agent" ? props.agentId : "";
|
|
25
|
+
const agent = useAgent(agentId, ({ cwd, provider }) => ({ cwd, provider }));
|
|
26
|
+
const cwd = agent?.cwd ?? "";
|
|
27
|
+
const store = storeForProvider(agent?.provider);
|
|
28
|
+
const loadSessions = useRpc(listOmpSessions);
|
|
29
|
+
const sessions = useQuery({
|
|
30
|
+
queryKey: ["paseo-omp", "sessions", ompStoreKey(store), cwd],
|
|
31
|
+
queryFn: () => loadSessions({ cwd, store }),
|
|
32
|
+
enabled: cwd.length > 0,
|
|
33
|
+
refetchInterval: SESSIONS_POLL_MS,
|
|
34
|
+
});
|
|
35
|
+
const styles = useMemo(
|
|
36
|
+
() => ({
|
|
37
|
+
root: { gap: 8, padding: 4, maxHeight: 360, width: 320 },
|
|
38
|
+
muted: { color: theme.colors.foregroundMuted, fontSize: 13 },
|
|
39
|
+
error: { color: theme.colors.statusDanger, fontSize: 13 },
|
|
40
|
+
row: {
|
|
41
|
+
gap: 2,
|
|
42
|
+
padding: layout.compact ? 8 : 10,
|
|
43
|
+
borderWidth: 1,
|
|
44
|
+
borderColor: theme.colors.border,
|
|
45
|
+
borderRadius: 8,
|
|
46
|
+
backgroundColor: theme.colors.surface1,
|
|
47
|
+
},
|
|
48
|
+
title: { color: theme.colors.foreground, fontSize: 13, fontWeight: "600" as const },
|
|
49
|
+
prompt: { color: theme.colors.foreground, fontSize: 13 },
|
|
50
|
+
detail: { color: theme.colors.foregroundMuted, fontSize: 11 },
|
|
51
|
+
}),
|
|
52
|
+
[layout.compact, theme],
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
if (sessions.isLoading) return <Text style={styles.muted}>Loading omp history…</Text>;
|
|
56
|
+
if (sessions.error) return <Text style={styles.error}>Could not read omp history.</Text>;
|
|
57
|
+
const items = sessions.data?.sessions ?? [];
|
|
58
|
+
if (items.length === 0)
|
|
59
|
+
return <Text style={styles.muted}>No omp prompts for this directory.</Text>;
|
|
60
|
+
|
|
61
|
+
return (
|
|
62
|
+
<ScrollView contentContainerStyle={styles.root}>
|
|
63
|
+
<Text style={styles.muted}>{storeLabel(store)}</Text>
|
|
64
|
+
{items.slice(0, PREVIEW_LIMIT).map((entry) => (
|
|
65
|
+
<View key={entry.id} style={styles.row}>
|
|
66
|
+
{entry.title ? <Text style={styles.title}>{entry.title}</Text> : null}
|
|
67
|
+
<Text style={styles.prompt} numberOfLines={3}>
|
|
68
|
+
{`${entry.prompt}${entry.truncated ? "…" : ""}`}
|
|
69
|
+
</Text>
|
|
70
|
+
<Text style={styles.detail}>{age(entry.createdAt)}</Text>
|
|
71
|
+
</View>
|
|
72
|
+
))}
|
|
73
|
+
{items.length > PREVIEW_LIMIT ? (
|
|
74
|
+
<Text style={styles.muted}>{`Showing ${PREVIEW_LIMIT} of ${items.length}`}</Text>
|
|
75
|
+
) : null}
|
|
76
|
+
</ScrollView>
|
|
77
|
+
);
|
|
78
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# Alpha release checklist
|
|
2
|
+
|
|
3
|
+
This checklist prepares `paseo-omp-v0.1.0-alpha.1`. It does not authorize publication. A maintainer must explicitly approve the tested package before any push, tag, GitHub release, or npm publication.
|
|
4
|
+
|
|
5
|
+
## Release identity
|
|
6
|
+
|
|
7
|
+
- [ ] Release Please proposes `0.1.0-alpha.1` from manifest version `0.0.0`.
|
|
8
|
+
- [ ] Package and tag names are `@omercnet/paseo-omp` and `paseo-omp-v0.1.0-alpha.1`.
|
|
9
|
+
- [ ] Provider identity remains `omp-plugin`; bundled `omp` remains independent and enabled or disabled by the user.
|
|
10
|
+
- [ ] Paseo requirement remains an official released range, currently `^0.8.0`.
|
|
11
|
+
- [ ] Minimum tested OMP version, checksum, CI job, README, SUPPORT, and TESTING agree.
|
|
12
|
+
|
|
13
|
+
## Required gates
|
|
14
|
+
|
|
15
|
+
- [ ] `npm run check`
|
|
16
|
+
- [ ] `npm run typecheck`
|
|
17
|
+
- [ ] `npm run test:coverage`; aggregate loaded-source coverage meets the configured threshold.
|
|
18
|
+
- [ ] Real installed OMP regression against the documented minimum version.
|
|
19
|
+
- [ ] `npm run test:integration:install`
|
|
20
|
+
- [ ] `npm run test:integration:docker`
|
|
21
|
+
- [ ] Windows/WSL host ownership job passes in CI.
|
|
22
|
+
- [ ] Docker canary matrix passes on the exact release candidate.
|
|
23
|
+
- [ ] GitHub Actions syntax and release-configuration schemas pass.
|
|
24
|
+
|
|
25
|
+
## Required manual acceptance
|
|
26
|
+
|
|
27
|
+
- [ ] Maintainer installs the exact `npm pack` candidate into the controlled official-Paseo Docker canary.
|
|
28
|
+
- [ ] Maintainer verifies catalog, prompt, tools, configured MCP, permissions, steer, interrupt, import/resume, subagents, rewind, usage, Hub, and plugin surfaces.
|
|
29
|
+
- [ ] Maintainer confirms the known limitations are acceptable for alpha.
|
|
30
|
+
- [ ] Maintainer explicitly authorizes publication after testing. Silence or prior approval for development is not release authorization.
|
|
31
|
+
|
|
32
|
+
## Alpha blocker
|
|
33
|
+
|
|
34
|
+
- [x] `omp-audit.1`: incomplete or compacted `agent_end` frames recover success, failure, or native cancellation from complete streamed `message_end` evidence, or from bounded history whose entry IDs correlate with the streamed turn. Idle state is confirmed before and after retrieval, and concurrent interrupts remain authoritative. Missing, unavailable, non-correlatable, or conflicting terminal evidence fails closed with content-free count diagnostics.
|
|
35
|
+
|
|
36
|
+
## Accepted alpha limitations
|
|
37
|
+
|
|
38
|
+
These may remain only when called out in `SUPPORT.md`, `CHANGELOG.md`, and the GitHub prerelease notes:
|
|
39
|
+
|
|
40
|
+
- Native Fast mode is not exposed.
|
|
41
|
+
- No first-class plan mode; `/handoff` depends on native OMP prerequisites not reproduced by the deterministic canary.
|
|
42
|
+
- Terminal-started OMP sessions are importable but are not registered automatically.
|
|
43
|
+
- Large skill-body presentation has no dedicated provider regression.
|
|
44
|
+
- OMP RPC stdout contamination is structurally mitigated but requires upstream channel purity.
|
|
45
|
+
- `omp` and `omp-plugin` do not share ownership, configuration, or persisted handles.
|
|
46
|
+
- The deterministic model does not implement OMP compaction summarization; protocol fixtures cover compaction behavior.
|
|
47
|
+
- The tiny Ollama model is exploratory and is not a deterministic oracle.
|
|
48
|
+
|
|
49
|
+
## Non-blocking post-alpha cleanup
|
|
50
|
+
|
|
51
|
+
- [ ] `omp-maintenance.1`: remove `ProviderRegistrationCompat`, both `ProviderCatalogOptionsCompat` declarations, and `parseProviderInputCompat` after the published `@getpaseo/plugin` types natively expose the registration hooks and request fields they bridge. The required upstream surface is `providerOptionsSchema`, `getCatalogCacheKey`, `checkAvailability`, catalog/session-list `providerOptions` plus `settings`, and session-open `deniedTools`. This is type/compatibility cleanup only; it must not change provider behavior and does not block alpha.
|
|
52
|
+
|
|
53
|
+
## Release notes
|
|
54
|
+
|
|
55
|
+
The prerelease notes must include:
|
|
56
|
+
|
|
57
|
+
1. Alpha support statement and compatibility range.
|
|
58
|
+
2. Permanent side-by-side `omp-plugin` identity.
|
|
59
|
+
3. Provider SDK capability percentage and link to the README matrix.
|
|
60
|
+
4. Link to the deduplicated [core-provider issue audit](core-provider-issue-audit.md).
|
|
61
|
+
5. Verification totals from the exact release commit.
|
|
62
|
+
6. Known limitations above, including the distinction between supported MCP host tools, unsupported exact `toolPolicy`, and native-only `disallowedTools`.
|
|
63
|
+
7. Install, upgrade, rollback, support, and security-reporting links.
|
|
64
|
+
8. Artifact provenance verification command.
|
|
65
|
+
|
|
66
|
+
## Publication boundary
|
|
67
|
+
|
|
68
|
+
Release Please may prepare metadata. Publication must use npm trusted publishing from the immutable release commit. Never retag an alpha commit as stable.
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# Configuration
|
|
2
|
+
|
|
3
|
+
Open the global **OMP** sidebar to browse and edit machine-wide state, or open the workspace **OMP** panel from the workspace tab or Explorer to manage project-scoped state. Scalar edits in the global surface use OMP's native `config set` and `config reset` commands. Workspace edits create validated overrides in `<workspace>/.omp/config.yml`; removing an override restores the effective global or default value. Arrays, records, and credentials remain read-only in both surfaces.
|
|
4
|
+
|
|
5
|
+
The **Plugin** tab documents the supported `omp-plugin` launch options, including names-only inherited environment configuration. Paseo's public plugin API does not expose the effective provider options for active launches, so the tab does not claim profile values are active. Choose **OMP Plugin** when creating an agent. Model, mode, thinking level, system prompt, persistence, MCP servers, workspace, and agent environment use Paseo's standard provider controls.
|
|
6
|
+
|
|
7
|
+
## Optional provider profile overrides
|
|
8
|
+
|
|
9
|
+
Advanced launch overrides belong in an `omp-plugin` provider profile. The provider options schema is strict; unknown fields fail validation.
|
|
10
|
+
|
|
11
|
+
```json
|
|
12
|
+
{
|
|
13
|
+
"provider": "omp-plugin",
|
|
14
|
+
"providerOptions": {
|
|
15
|
+
"command": ["/opt/omp/bin/omp"],
|
|
16
|
+
"params": {
|
|
17
|
+
"sessionDir": "/var/lib/omp/sessions",
|
|
18
|
+
"rpcTimeoutMs": 60000,
|
|
19
|
+
"smolModel": "openai/gpt-5-mini",
|
|
20
|
+
"slowModel": "anthropic/claude-opus-5",
|
|
21
|
+
"planModel": "openai/gpt-5.4"
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
| Option | Purpose |
|
|
28
|
+
| --- | --- |
|
|
29
|
+
| `command` | Complete OMP executable and argument prefix. |
|
|
30
|
+
| `env` | Non-secret process overrides applied below the session launch environment. |
|
|
31
|
+
| `inheritEnv` | Daemon environment variable names copied only when OMP starts. Values are never stored in the profile or displayed in the sidebar. |
|
|
32
|
+
| `outputRedaction` | `none` (default) preserves native output. `configured-values` performs best-effort literal replacement only for explicitly supplied configured credential values from profile/session credential environment fields and configured MCP headers or environment. |
|
|
33
|
+
| `params.sessionDir` | Native OMP session directory supplied through `--session-dir`. Used consistently by discovery, import, resume, and launch. |
|
|
34
|
+
| `params.rpcTimeoutMs` | Startup, request, catalog, and availability timeout, from 1 ms through 10 minutes. |
|
|
35
|
+
| `params.smolModel` | Native selector supplied through `--smol`. |
|
|
36
|
+
| `params.slowModel` | Native selector supplied through `--slow`. |
|
|
37
|
+
| `params.planModel` | Native selector supplied through `--plan`. |
|
|
38
|
+
|
|
39
|
+
Paseo's generic provider profile fields remain available:
|
|
40
|
+
|
|
41
|
+
| Profile field | Behavior |
|
|
42
|
+
| --- | --- |
|
|
43
|
+
| `models` | Replaces the discovered model list. |
|
|
44
|
+
| `additionalModels` | Extends the discovered model list. |
|
|
45
|
+
| `disallowedTools` | Restricts only the known native OMP built-ins accepted by this plugin. It becomes an explicit OMP allow-list; unknown names fail closed rather than being ignored. It does not filter MCP host tools. |
|
|
46
|
+
| `paseoTools` | Enables or restricts which caller-scoped Paseo orchestration tools the daemon includes before they reach OMP as MCP host tools. |
|
|
47
|
+
|
|
48
|
+
These options cover every plugin-specific launch value. Values that belong to an individual agent, including model, mode, thinking level, title, system prompt, MCP servers, persistence, and cwd, remain standard Paseo session fields rather than duplicate plugin options.
|
|
49
|
+
|
|
50
|
+
## OMP-native plugins
|
|
51
|
+
|
|
52
|
+
Open **OMP → OMP plugins** globally for user-scoped management, or use the workspace **OMP** panel to include project-scoped installations and effective project overrides. The manager uses OMP's documented singular `omp plugin` CLI and supports install, enable, disable, upgrade, and uninstall operations. Every state-changing action requires explicit confirmation; already-running OMP sessions are unchanged.
|
|
53
|
+
|
|
54
|
+
Project-scoped lifecycle commands run from the selected workspace and use `--scope project`. Duplicate path installations that share one npm package identity remain read-only because OMP's lifecycle CLI addresses npm plugins by package name rather than installation path. Plugin configuration exposes schema metadata without returning current or default values. Non-secret scalar plugin settings can be set or deleted through write-only controls. Secret settings are presence-only and delete-only because OMP's CLI would otherwise expose a new secret through process arguments.
|
|
55
|
+
|
|
56
|
+
The Configuration view links to the official OMP settings reference, value parsing and precedence guides, relevant category sections, and a small curated set of setting-specific anchors.
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
## MCP tools, management, and policy boundary
|
|
60
|
+
|
|
61
|
+
Configured MCP servers and Paseo's caller-scoped MCP tools are supported. The plugin discovers their schemas, assigns collision-safe OMP names, binds them before `session.ready`, forwards progress and terminal results, propagates cancellation, and renders calls with friendly labels.
|
|
62
|
+
|
|
63
|
+
Use the **MCP** control beside the composer on an **OMP Plugin** agent to run OMP's native list, add, reload, test, authorize, enable, disable, resource, and prompt commands. The control is agent-scoped because OMP MCP discovery depends on both the active profile and the workspace directory. The global OMP sidebar remains a host-level health and settings surface; a separate workspace manager would duplicate OMP's own discovery and precedence rules.
|
|
64
|
+
|
|
65
|
+
Command output, setup questions, and OAuth prompts appear in the agent timeline. OAuth URLs render as an interactive card and always retain the full provider authorization URL, never substituting OMP's daemon-local `/launch` shortcut. **Open in Paseo Browser** calls the current agent's caller-scoped `browser_new_tab` tool, so the authorization page becomes a browser tab in the same workspace; it requires Paseo tools to be injected into the agent, browser tools to be enabled, and a connected Paseo desktop browser host. **Open on this device** remains available when no browser host is connected. For a loopback callback to complete automatically, the chosen browser host must run on the daemon machine. Otherwise, finish authorization in either browser, copy the final redirect URL or authorization code, and submit it in the OMP authorization prompt. Tokens and refresh material are stored by OMP on the daemon (or its configured auth broker), never in the Paseo client or plugin timeline.
|
|
66
|
+
|
|
67
|
+
Paseo's exact session `toolPolicy` preapproval grants are not equivalent to OMP's `set_host_tools` contract. The plugin cannot preserve that policy exactly, so any non-empty `toolPolicy` rejects session startup. It never converts exact grants into broader access. `disallowedTools` is separate: it controls only recognized native OMP built-ins and rejects unknown names.
|
|
68
|
+
|
|
69
|
+
## Credentials and environment
|
|
70
|
+
|
|
71
|
+
The plugin is deny-by-default. It inherits only its fixed built-in allowlist of core provider authentication variables plus exact names that an operator selects with `providerOptions.inheritEnv`; it does not discover or inherit arbitrary credential-shaped names. Prefer OMP's native credential store or auth broker whenever possible.
|
|
72
|
+
|
|
73
|
+
For example:
|
|
74
|
+
|
|
75
|
+
```json
|
|
76
|
+
{
|
|
77
|
+
"provider": "omp-plugin",
|
|
78
|
+
"providerOptions": {
|
|
79
|
+
"inheritEnv": ["ACME_OMP_API_KEY"],
|
|
80
|
+
"outputRedaction": "configured-values",
|
|
81
|
+
"env": {
|
|
82
|
+
"ACME_OMP_REGION": "us-east-1"
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
`inheritEnv` accepts an array of at most 256 names matching `[A-Za-z_][A-Za-z0-9_]{0,127}`. Selecting a name is an operator trust decision: its daemon-owned value becomes available to the OMP child and anything OMP launches. The plugin resolves selected values from the Paseo daemon environment immediately before each catalog or session launch. Unselected variables remain absent. Explicit `providerOptions.env` and per-session `env` overlays win over inherited values with the same name.
|
|
89
|
+
|
|
90
|
+
Profiles, persistence, errors, and catalog cache identity contain only the configured `inheritEnv` names, never resolved values or secret-derived hashes. A selected variable that is present and not shadowed by explicit `env` must contain at least 4 UTF-8 bytes. The existing 64 KiB per-value and 1 MiB total environment bounds still apply; shadowed daemon values are neither validated nor counted.
|
|
91
|
+
|
|
92
|
+
Process-control variables are always rejected case-insensitively, even when explicitly selected. The blocked prefix families are `BUN_INSTALL*`, `DYLD_*`, `GIT_CONFIG*`, `LD_*`, and `NPM_CONFIG_*`. The blocked exact names are:
|
|
93
|
+
|
|
94
|
+
```text
|
|
95
|
+
BASH_ENV, BUN_OPTIONS, CLASSPATH, CLAUDE_BASH_NO_CI, CLAUDE_BASH_NO_LOGIN,
|
|
96
|
+
CLAUDE_CODE_SHELL_PREFIX, EDITOR, ELECTRON_RUN_AS_NODE, ENV, GEM_HOME, GEM_PATH,
|
|
97
|
+
GIT_SSH_COMMAND, HOME, JAVA_TOOL_OPTIONS, NODE_OPTIONS, NODE_PATH,
|
|
98
|
+
OMP_AUTORESEARCH_DB_DIR, OMP_COMMAND, OMP_GITHUB_CACHE_DB, OMP_PROFILE,
|
|
99
|
+
OMP_WORKTREE_DIR, PATH, PATHEXT, PERL5LIB, PERL5OPT, PI_BASH_NO_CI,
|
|
100
|
+
PI_BASH_NO_LOGIN, PI_CODING_AGENT_DIR, PI_CODING_AGENT_SESSION_DIR,
|
|
101
|
+
PI_CONFIG_DIR, PI_CONFIG_FILES, PI_GIT_COMMON_DIR, PI_PACKAGE_DIR, PI_PROFILE,
|
|
102
|
+
PI_PROJECT_DIR, PI_SESSION_ID, PI_SHELL_PREFIX, PI_SUBPROCESS_CMD,
|
|
103
|
+
PI_WORKTREE_DIR, PWD, PYTHONHOME, PYTHONINSPECT, PYTHONPATH, PYTHONSTARTUP,
|
|
104
|
+
RUBYLIB, RUBYOPT, SHELL, SYSTEMROOT, USERPROFILE, VISUAL, XDG_CACHE_HOME,
|
|
105
|
+
XDG_CONFIG_HOME, XDG_DATA_HOME, XDG_RUNTIME_DIR, XDG_STATE_HOME, _JAVA_OPTIONS
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Unlike `inheritEnv`, `providerOptions.env` stores its literal values in the provider profile/configuration. Use it only for deliberate non-secret overrides. If configuration contains sensitive values anyway, restrict `<paseo-home>/config.json` to the daemon account (`chmod 600` on POSIX), protect backups, and never attach it to an issue.
|
|
109
|
+
|
|
110
|
+
The plugin validates and bounds native protocol data, but it does not heuristically detect, redact, or rewrite credentials in OMP, model, or tool content. Never put credentials in prompts or tool output. With `outputRedaction: "configured-values"`, every non-empty value selected through `inheritEnv` is treated as sensitive regardless of its name, alongside the existing explicitly configured credential values. Exact configured literals are replaced on a best-effort basis; generated secrets and encoded, transformed, or independently streamed fragments are not detected. With the default `none`, inherited values are not rewritten in output. Centralized Paseo policy is required for redaction guarantees. Unexpected or internal launch failures use fixed fallback messages rather than serializing the launch configuration, while explicit public validation errors may include caller-supplied configuration names or values.
|
|
111
|
+
|
|
112
|
+
## Modes and permissions
|
|
113
|
+
|
|
114
|
+
- `full` is always available.
|
|
115
|
+
- `write` and `ask` appear when Paseo negotiates provider permission support.
|
|
116
|
+
- Typed OMP approval frames become Paseo tool permissions when both sides negotiate `typedToolApprovals: 1`.
|
|
117
|
+
- OMP 18.1.15 uses the bounded generic interaction fallback.
|
|
118
|
+
- Changing approval mode requires a new session. Live model and thinking changes are supported.
|
|
119
|
+
|
|
120
|
+
## Persistence and images
|
|
121
|
+
|
|
122
|
+
Non-persisted sessions use `--no-session`. Persistent sessions keep a versioned native handle, replay before becoming ready, and recover with the effective launch configuration.
|
|
123
|
+
|
|
124
|
+
For text-only models, image inputs are written to a private bounded temporary directory shared with the local OMP child and removed after the turn, session, or failed launch.
|
|
125
|
+
|
|
126
|
+
Every OMP process launched by the plugin receives provider-owned `OMP_NO_WEBP=1` compatibility mode after caller environment validation, so generated and resized images use PNG or JPEG across Paseo clients without reducing the configured environment limits. Persisted or upstream WebP blocks are still retained: capable clients render them directly, while an unsupported client shows a per-image fallback instead of failing the timeline item.
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# Core OMP provider issue audit
|
|
2
|
+
|
|
3
|
+
This audit compares reports in `getpaseo/paseo` with the community `omp-plugin` provider. It was refreshed on 2026-09-12 from GitHub issue titles and bodies containing `OMP`, `oh-my-pi`, or `rpc-ui`, OMP-related pull requests, and materially equivalent Pi/RPC reports. GitHub Discussions were also inspected; the repository had no OMP-related discussion.
|
|
4
|
+
|
|
5
|
+
Issue and pull-request pairs are consolidated by root cause. A closed upstream issue does not prove the plugin implements the behavior, and an open upstream issue does not imply the plugin is affected.
|
|
6
|
+
|
|
7
|
+
Status meanings:
|
|
8
|
+
|
|
9
|
+
- **Verified**: the plugin has implementation and focused automated evidence for the consumer-visible behavior.
|
|
10
|
+
- **Mitigated**: the plugin bounds or rejects the failure, but an upstream or host condition remains.
|
|
11
|
+
- **Gap**: behavior is missing or only partially supported by the plugin.
|
|
12
|
+
- **Host-owned**: the report concerns Paseo behavior outside the provider boundary.
|
|
13
|
+
|
|
14
|
+
## Lifecycle, turns, and recovery
|
|
15
|
+
|
|
16
|
+
| Reports | Status | Plugin comparison |
|
|
17
|
+
| --- | --- | --- |
|
|
18
|
+
| [#3838](https://github.com/getpaseo/paseo/issues/3838), [PR #3839](https://github.com/getpaseo/paseo/pull/3839) | **Verified** | A dead OMP subprocess invalidates its generation. A later write lazily resumes the same native session. Process-tree cleanup, recovery, and registry replacement are covered. |
|
|
19
|
+
| [#3252](https://github.com/getpaseo/paseo/issues/3252), equivalent Pi [#3496](https://github.com/getpaseo/paseo/issues/3496), [PR #3258](https://github.com/getpaseo/paseo/pull/3258) | **Verified** | Hidden and custom notices do not terminalize a turn before the native user echo and terminal evidence. |
|
|
20
|
+
| [#2260](https://github.com/getpaseo/paseo/issues/2260), [PR #2261](https://github.com/getpaseo/paseo/pull/2261) | **Verified** | Incomplete or compacted `agent_end` frames use complete streamed `message_end` evidence or bounded history correlated by entry ID, with idle state confirmed before and after retrieval. Success, failure, native cancellation, and concurrent interrupts are preserved; missing, unavailable, non-correlatable, or conflicting terminal evidence fails closed with content-free count diagnostics. |
|
|
21
|
+
| [#2281](https://github.com/getpaseo/paseo/issues/2281), [PR #2282](https://github.com/getpaseo/paseo/pull/2282) | **Verified** | Local-only prompt results and structured commands have explicit terminal ownership. |
|
|
22
|
+
| [#3654](https://github.com/getpaseo/paseo/issues/3654), [#3998](https://github.com/getpaseo/paseo/issues/3998), [PR #3667](https://github.com/getpaseo/paseo/pull/3667) | **Verified** | Post-`agent_end` state reconciliation is bounded. Stale or unavailable `get_state` cannot leave a turn running forever. |
|
|
23
|
+
| [#3999](https://github.com/getpaseo/paseo/issues/3999), [#4000](https://github.com/getpaseo/paseo/issues/4000), [#4039](https://github.com/getpaseo/paseo/issues/4039), [PR #3772](https://github.com/getpaseo/paseo/pull/3772), [PR #4217](https://github.com/getpaseo/paseo/pull/4217) | **Verified** | `prompt.steer` is negotiated and implemented with expected-turn checks, acknowledgement ordering, duplicate correlation, and interrupt/terminal race coverage. |
|
|
24
|
+
| Shared RPC cancellation [#3540](https://github.com/getpaseo/paseo/issues/3540), Pi [#3749](https://github.com/getpaseo/paseo/issues/3749) | **Verified in provider** | Native abort, exactly-one terminal event, permission cleanup, descendant cleanup, and uncertain-cleanup quarantine are tested. UI keyboard delivery remains host-owned. |
|
|
25
|
+
| [#3218](https://github.com/getpaseo/paseo/issues/3218) | **Verified at provider boundary** | Session close owns and awaits OMP process cleanup. Whether every archive UI route invokes provider close is a host concern. |
|
|
26
|
+
|
|
27
|
+
## Persistence, import, and subagents
|
|
28
|
+
|
|
29
|
+
| Reports | Status | Plugin comparison |
|
|
30
|
+
| --- | --- | --- |
|
|
31
|
+
| [#2006](https://github.com/getpaseo/paseo/issues/2006), [PR #2004](https://github.com/getpaseo/paseo/pull/2004), [PR #2131](https://github.com/getpaseo/paseo/pull/2131) | **Verified** | Descriptor parsing accepts bounded leading title/session metadata. |
|
|
32
|
+
| [#2727](https://github.com/getpaseo/paseo/issues/2727), [PR #4416](https://github.com/getpaseo/paseo/pull/4416) | **Verified** | Import resolves opaque native identity and preserves model and thinking selection. |
|
|
33
|
+
| [#2796](https://github.com/getpaseo/paseo/issues/2796), [PR #2065](https://github.com/getpaseo/paseo/pull/2065), [PR #2265](https://github.com/getpaseo/paseo/pull/2265) | **Verified** | Host-wide discovery is supported when `cwd` is omitted; scoped listing still enforces absolute workspace ownership. This also prevents the previously observed import-sheet crash path. |
|
|
34
|
+
| [#2232](https://github.com/getpaseo/paseo/issues/2232), equivalent Pi [#3160](https://github.com/getpaseo/paseo/issues/3160), [PR #2052](https://github.com/getpaseo/paseo/pull/2052), [PR #2245](https://github.com/getpaseo/paseo/pull/2245), [PR #3371](https://github.com/getpaseo/paseo/pull/3371) | **Verified** | Native child lifecycle, progress, nested timelines, replay, active-child gating, and parent-terminal deferral use `session.subsession`. |
|
|
35
|
+
| Pi lifecycle variants [#3845](https://github.com/getpaseo/paseo/issues/3845), [#3847](https://github.com/getpaseo/paseo/issues/3847), [#4309](https://github.com/getpaseo/paseo/issues/4309) | **Verified by the same model** | Child activity and terminal ownership are explicit rather than inferred from one provider event. |
|
|
36
|
+
| [#2728](https://github.com/getpaseo/paseo/issues/2728) | **Gap** | Listing and import work, but the plugin does not install an OMP terminal hook that automatically creates a Paseo agent for terminal-started sessions. |
|
|
37
|
+
| [#2574](https://github.com/getpaseo/paseo/issues/2574) | **Mitigated** | Recursive bounded transcript discovery covers OMP files. Generic archived-agent and registry visibility remain host-owned. |
|
|
38
|
+
| [#4707](https://github.com/getpaseo/paseo/issues/4707) | **Host-owned** | Plugin reservations reject conflicting live ownership; archived-agent workspace re-homing policy belongs to Paseo. |
|
|
39
|
+
|
|
40
|
+
## Transport and startup
|
|
41
|
+
|
|
42
|
+
| Reports | Status | Plugin comparison |
|
|
43
|
+
| --- | --- | --- |
|
|
44
|
+
| [#2548](https://github.com/getpaseo/paseo/issues/2548), [#2966](https://github.com/getpaseo/paseo/issues/2966), [PR #3038](https://github.com/getpaseo/paseo/pull/3038), [PR #3184](https://github.com/getpaseo/paseo/pull/3184) | **Verified** | RPC protocol v2 is required. Chunk assembly, frame byte counts, deadlines, malformed frames, and oversized frames are tested. |
|
|
45
|
+
| [#2473](https://github.com/getpaseo/paseo/issues/2473) | **Mitigated** | Strict frame schemas, request correlation, session identity, and bounds prevent ordinary stdout JSON from becoming a valid response. OMP should still keep non-protocol output off RPC stdout. |
|
|
46
|
+
| [#4047](https://github.com/getpaseo/paseo/issues/4047), [PR #4048](https://github.com/getpaseo/paseo/pull/4048) | **Verified** | Stdin EPIPE and stream closure fail pending calls and enter bounded cleanup/recovery rather than crashing the daemon. |
|
|
47
|
+
| [#1657](https://github.com/getpaseo/paseo/issues/1657), [#1730](https://github.com/getpaseo/paseo/issues/1730), [#2226](https://github.com/getpaseo/paseo/issues/2226), [#4142](https://github.com/getpaseo/paseo/issues/4142), [PR #4008](https://github.com/getpaseo/paseo/pull/4008), [PR #4143](https://github.com/getpaseo/paseo/pull/4143) | **Verified** | Availability and ready probes use bounded configurable timeouts and distinguish missing, unrunnable, incompatible, and available binaries. |
|
|
48
|
+
| [#1446](https://github.com/getpaseo/paseo/issues/1446), [#2456](https://github.com/getpaseo/paseo/issues/2456) | **Mitigated / host-owned** | Plugin discovery and cache identity are bounded. Provider snapshot scheduling and stale host snapshots remain Paseo behavior. |
|
|
49
|
+
| [#2610](https://github.com/getpaseo/paseo/issues/2610) | **Mitigated / host-owned** | OMP input frames, replay, and retained state are bounded; final daemon-to-client WebSocket buffering is owned by Paseo. |
|
|
50
|
+
|
|
51
|
+
## Models, modes, commands, and usage
|
|
52
|
+
|
|
53
|
+
| Reports | Status | Plugin comparison |
|
|
54
|
+
| --- | --- | --- |
|
|
55
|
+
| [#1692](https://github.com/getpaseo/paseo/issues/1692), [PR #1698](https://github.com/getpaseo/paseo/pull/1698), [PR #2539](https://github.com/getpaseo/paseo/pull/2539) | **Verified** | The plugin uses `get_available_commands`, publishes aliases, and fails slash dispatch closed when discovery is unavailable. |
|
|
56
|
+
| [#2080](https://github.com/getpaseo/paseo/issues/2080), Pi [#2117](https://github.com/getpaseo/paseo/issues/2117), [PR #2171](https://github.com/getpaseo/paseo/pull/2171), [PR #2191](https://github.com/getpaseo/paseo/pull/2191) | **Verified** | Thinking options and defaults are model-specific; unsupported levels fail closed. |
|
|
57
|
+
| Pi [#2663](https://github.com/getpaseo/paseo/issues/2663), [#4382](https://github.com/getpaseo/paseo/issues/4382) | **Verified** | Model and thinking changes are committed only after re-reading native state. |
|
|
58
|
+
| [#2405](https://github.com/getpaseo/paseo/issues/2405), [PR #2406](https://github.com/getpaseo/paseo/pull/2406) | **Verified** | Nullable context windows remain valid catalog entries. |
|
|
59
|
+
| [#2544](https://github.com/getpaseo/paseo/issues/2544), [PR #2865](https://github.com/getpaseo/paseo/pull/2865) | **Verified** | Strict provider options expose command prefix, environment, session directory, timeout, role models, model overlays, and denied tools. |
|
|
60
|
+
| [#2857](https://github.com/getpaseo/paseo/issues/2857), [PR #2859](https://github.com/getpaseo/paseo/pull/2859) | **Verified** | Native compact requests use no ordinary RPC request timeout; provider-level compaction state owns completion, cancellation, and usage refresh. |
|
|
61
|
+
| [#4073](https://github.com/getpaseo/paseo/issues/4073), [PR #4074](https://github.com/getpaseo/paseo/pull/4074) | **Verified** | Fallback and model/thinking events trigger committed runtime-state refresh rather than trusting event labels as final state. |
|
|
62
|
+
| [#1888](https://github.com/getpaseo/paseo/issues/1888), [PR #1882](https://github.com/getpaseo/paseo/pull/1882), [PR #2503](https://github.com/getpaseo/paseo/pull/2503) | **Verified** | Active, terminal, post-compaction, fallback, and recovery sampling publish `session.usage`. |
|
|
63
|
+
| [#4437](https://github.com/getpaseo/paseo/issues/4437), [PR #4449](https://github.com/getpaseo/paseo/pull/4449) | **Gap** | The plugin advertises `full`, `write`, and `ask`; it does not expose a distinct native Fast mode. |
|
|
64
|
+
| [#3627](https://github.com/getpaseo/paseo/issues/3627), [PR #4205](https://github.com/getpaseo/paseo/pull/4205) | **Partial** | Plan role-model configuration and `/handoff` exist. There is no first-class `plan` mode, and the controlled canary does not satisfy the native handoff workflow prerequisites. |
|
|
65
|
+
|
|
66
|
+
## Timeline, media, and questions
|
|
67
|
+
|
|
68
|
+
| Reports | Status | Plugin comparison |
|
|
69
|
+
| --- | --- | --- |
|
|
70
|
+
| [#4509](https://github.com/getpaseo/paseo/issues/4509), equivalent Pi [#2803](https://github.com/getpaseo/paseo/issues/2803), [PR #4510](https://github.com/getpaseo/paseo/pull/4510) | **Verified** | `contentIndex` participates in stable reasoning identity, preserving interleaved live blocks and replay shape. |
|
|
71
|
+
| [#3244](https://github.com/getpaseo/paseo/issues/3244), [PR #3245](https://github.com/getpaseo/paseo/pull/3245) | **Verified** | Tool-result and assistant images are validated, bounded, retained, packaged, and rendered through the plugin transformer. |
|
|
72
|
+
| [#3527](https://github.com/getpaseo/paseo/issues/3527), [PR #3628](https://github.com/getpaseo/paseo/pull/3628) | **Verified** | Positional `optionDetails.description` metadata is preserved in Paseo permission questions. |
|
|
73
|
+
| [#1726](https://github.com/getpaseo/paseo/issues/1726), [PR #1879](https://github.com/getpaseo/paseo/pull/1879) | **Partial** | Structured user questions are supported. Dedicated collapsing/presentation for very large skill bodies is not demonstrated. |
|
|
74
|
+
| [#2264](https://github.com/getpaseo/paseo/issues/2264), equivalent Pi [#2674](https://github.com/getpaseo/paseo/issues/2674), [PR #2280](https://github.com/getpaseo/paseo/pull/2280) | **Verified** | `display:false` custom messages remain hidden. |
|
|
75
|
+
| [#2266](https://github.com/getpaseo/paseo/issues/2266), [PR #2284](https://github.com/getpaseo/paseo/pull/2284) | **Verified** | Manual and automatic compaction lifecycle and recap data map to stable timeline operations. |
|
|
76
|
+
| Pi [#3121](https://github.com/getpaseo/paseo/issues/3121), [PR #4497](https://github.com/getpaseo/paseo/pull/4497) | **Verified** | Todo events map to Paseo's native todo item; the plugin does not add a second timeline-card renderer. |
|
|
77
|
+
| [#3850](https://github.com/getpaseo/paseo/issues/3850) | **Verified by avoidance** | The inherited environment allowlist does not pass `TERM_PROGRAM`; the plugin never advertises Kitty graphics support. |
|
|
78
|
+
|
|
79
|
+
## MCP, tools, and host behavior
|
|
80
|
+
|
|
81
|
+
| Reports | Status | Plugin comparison |
|
|
82
|
+
| --- | --- | --- |
|
|
83
|
+
| [#2060](https://github.com/getpaseo/paseo/issues/2060), [PR #2418](https://github.com/getpaseo/paseo/pull/2418), [PR #3820](https://github.com/getpaseo/paseo/pull/3820), [PR #3449](https://github.com/getpaseo/paseo/pull/3449) | **Verified** | Configured and caller-scoped MCP tools are discovered, policy-filtered, bound before readiness, canceled, and bounded. Docker exercises a configured stdio MCP tool. |
|
|
84
|
+
| Pi [#3004](https://github.com/getpaseo/paseo/issues/3004) | **Verified structurally** | Host-tool setup completes before `session.ready`; capability-registration races cannot expose a partially bound catalog. |
|
|
85
|
+
| Pi [#3666](https://github.com/getpaseo/paseo/issues/3666) | **Verified** | Exact preapproval is validated. If policy cannot be represented, startup fails closed instead of broadening access. |
|
|
86
|
+
| [#1892](https://github.com/getpaseo/paseo/issues/1892) | **Host-owned gap** | Paseo decides global voice-mode eligibility. The plugin does not synthesize a missing speak tool. |
|
|
87
|
+
| [#3762](https://github.com/getpaseo/paseo/issues/3762), Pi [#2815](https://github.com/getpaseo/paseo/issues/2815) | **Host-owned** | The plugin preserves and validates the received tool catalog but does not redefine Paseo's own MCP schemas. |
|
|
88
|
+
| [#3178](https://github.com/getpaseo/paseo/issues/3178) | **Avoided** | The plugin permanently registers `omp-plugin`, never the built-in `omp` identity. |
|
|
89
|
+
| [#3217](https://github.com/getpaseo/paseo/issues/3217) | **Host-owned** | Draft submission and agent creation multiplicity occur before provider-session behavior. |
|
|
90
|
+
|
|
91
|
+
## Origin records, not regressions
|
|
92
|
+
|
|
93
|
+
[#1176](https://github.com/getpaseo/paseo/issues/1176), [#1189](https://github.com/getpaseo/paseo/issues/1189), [PR #1177](https://github.com/getpaseo/paseo/pull/1177), [PR #1388](https://github.com/getpaseo/paseo/pull/1388), and [PR #2067](https://github.com/getpaseo/paseo/pull/2067) requested or introduced first-class OMP support. The plugin satisfies that product goal independently under `omp-plugin`; it does not replace or migrate bundled `omp` agents.
|
|
94
|
+
|
|
95
|
+
## Release blockers and tracked gaps
|
|
96
|
+
|
|
97
|
+
Before moving from alpha toward stable, track these separately:
|
|
98
|
+
|
|
99
|
+
1. Decide whether native Fast mode can be represented honestly through the public provider SDK.
|
|
100
|
+
2. Decide whether a first-class plan mode is possible; separately make `/handoff` reproducible in the controlled canary.
|
|
101
|
+
3. Decide whether terminal-started automatic registration belongs in this plugin or requires a generic Paseo hook.
|
|
102
|
+
4. Add an explicit large-skill presentation regression or document it as host-owned.
|
|
103
|
+
5. Keep stdout contamination defenses, and pursue upstream OMP protocol-channel purity.
|
|
104
|
+
6. Keep host-owned issues visibly separated: provider snapshot refresh, voice eligibility, MCP schemas, WebSocket buffering, archive routing, and draft/agent creation.
|
|
105
|
+
|
|
106
|
+
## Maintenance rule
|
|
107
|
+
|
|
108
|
+
Refresh this audit before each release candidate. New OMP or materially shared Pi/RPC reports must be added, deduplicated by root cause, and classified with a concrete test, an explicit limitation, or a linked host/upstream issue. Never infer that a plugin is fixed merely because the corresponding core issue is closed.
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Install and update
|
|
2
|
+
|
|
3
|
+
Paseo plugins are trusted, unsandboxed code. Review this plugin and its production dependencies before installing it on the daemon host.
|
|
4
|
+
|
|
5
|
+
## Requirements
|
|
6
|
+
|
|
7
|
+
- Paseo daemon and apps: `^0.8.0`
|
|
8
|
+
- OMP: `18.1.15` or newer is the supported floor
|
|
9
|
+
- OMP RPC: protocol v2 must negotiate successfully
|
|
10
|
+
|
|
11
|
+
The first public build is an alpha. Alpha releases are compatibility previews and may require deleting and re-importing agents created by an earlier preview.
|
|
12
|
+
|
|
13
|
+
## Install a release
|
|
14
|
+
|
|
15
|
+
Install an exact published version from npm:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
paseo plugin install npm:@omercnet/paseo-omp@<version>
|
|
19
|
+
paseo plugin ls paseo-omp
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Alternatively, install the matching reviewed Git tag:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
paseo plugin add omercnet/paseo-plugins:paseo-omp --ref paseo-omp-v<version>
|
|
26
|
+
paseo plugin ls paseo-omp
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
A Git tag-pinned installation does not advance through `paseo plugin update`. To upgrade, record the current installation, then replace it with the new tag in one maintenance window:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
paseo plugin ls paseo-omp --json > paseo-omp-before-update.json
|
|
33
|
+
paseo plugin remove paseo-omp
|
|
34
|
+
paseo plugin add omercnet/paseo-plugins:paseo-omp --ref paseo-omp-v<new-version>
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Removal deletes plugin-scoped settings and briefly makes `omp-plugin` unavailable. It does not modify Paseo's bundled `omp` provider or native OMP transcripts. Roll back by repeating the remove/add sequence with the recorded tag or commit.
|
|
38
|
+
|
|
39
|
+
## Install a local checkout
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
git clone https://github.com/omercnet/paseo-plugins.git
|
|
43
|
+
cd paseo-plugins/paseo-omp
|
|
44
|
+
npm ci --ignore-scripts
|
|
45
|
+
paseo plugin install "$PWD"
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
After editing a directory installation:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
npm run check
|
|
52
|
+
npm run typecheck
|
|
53
|
+
paseo plugin reload paseo-omp
|
|
54
|
+
paseo plugin ls paseo-omp
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Track a branch
|
|
58
|
+
|
|
59
|
+
Tracking `main` executes future dependency and plugin updates with the daemon user's privileges. Record the installed commit before each update:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
paseo plugin add omercnet/paseo-plugins:paseo-omp --ref main
|
|
63
|
+
paseo plugin ls paseo-omp --json > paseo-omp-before-update.json
|
|
64
|
+
paseo plugin update paseo-omp
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
A failed Git build or incompatible update leaves the previous revision active. Remove and re-add the recorded commit to roll back.
|