@getpaseo/server 0.9.2 → 0.10.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/dist/scripts/supervisor.js +51 -21
- package/dist/server/server/agent/agent-manager.js +22 -2
- package/dist/server/server/agent/agent-prompt.js +12 -0
- package/dist/server/server/agent/agent-sdk-types.d.ts +3 -0
- package/dist/server/server/agent/mcp-shared.d.ts +5 -1
- package/dist/server/server/agent/mcp-shared.js +2 -1
- package/dist/server/server/agent/provider-launch-config.d.ts +2 -2
- package/dist/server/server/agent/provider-launch-config.js +1 -1
- package/dist/server/server/agent/provider-registry.js +2 -2
- package/dist/server/server/agent/providers/acp-agent.js +20 -11
- package/dist/server/server/agent/providers/claude/agent.d.ts +1 -2
- package/dist/server/server/agent/providers/claude/agent.js +10 -9
- package/dist/server/server/agent/providers/claude/models.d.ts +1 -1
- package/dist/server/server/agent/providers/claude/models.js +1 -5
- package/dist/server/server/agent/providers/claude/project-dir.d.ts +1 -0
- package/dist/server/server/agent/providers/claude/project-dir.js +5 -1
- package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +6 -1
- package/dist/server/server/agent/providers/codex-app-server-agent.js +10 -1
- package/dist/server/server/agent/providers/generic-acp-agent.js +3 -1
- package/dist/server/server/agent/providers/omp/agent.js +23 -6
- package/dist/server/server/agent/providers/omp/rpc-types.d.ts +1 -0
- package/dist/server/server/agent/providers/omp/rpc-types.js +1 -0
- package/dist/server/server/agent/providers/opencode/bridge.d.ts +5 -1
- package/dist/server/server/agent/providers/opencode/bridge.js +56 -5
- package/dist/server/server/agent/providers/opencode/http-error.d.ts +8 -0
- package/dist/server/server/agent/providers/opencode/http-error.js +13 -0
- package/dist/server/server/agent/providers/opencode/runtime-client.d.ts +38 -0
- package/dist/server/server/agent/providers/opencode/runtime-client.js +131 -0
- package/dist/server/server/agent/providers/opencode/runtime-notice.d.ts +3 -0
- package/dist/server/server/agent/providers/opencode/runtime-notice.js +47 -0
- package/dist/server/server/agent/providers/opencode/server-manager.js +19 -8
- package/dist/server/server/agent/providers/opencode/v2/agent.d.ts +36 -0
- package/dist/server/server/agent/providers/opencode/v2/agent.js +211 -0
- package/dist/server/server/agent/providers/opencode/v2/api.d.ts +18 -0
- package/dist/server/server/agent/providers/opencode/v2/api.js +2 -0
- package/dist/server/server/agent/providers/opencode/v2/bridge-plugin.bundle.mjs +6693 -0
- package/dist/server/server/agent/providers/opencode/v2/capabilities.d.ts +3 -0
- package/dist/server/server/agent/providers/opencode/v2/capabilities.js +13 -0
- package/dist/server/server/agent/providers/opencode/v2/children.d.ts +20 -0
- package/dist/server/server/agent/providers/opencode/v2/children.js +75 -0
- package/dist/server/server/agent/providers/opencode/v2/commands.d.ts +4 -0
- package/dist/server/server/agent/providers/opencode/v2/commands.js +36 -0
- package/dist/server/server/agent/providers/opencode/v2/configuration.d.ts +8 -0
- package/dist/server/server/agent/providers/opencode/v2/configuration.js +64 -0
- package/dist/server/server/agent/providers/opencode/v2/history.d.ts +4 -0
- package/dist/server/server/agent/providers/opencode/v2/history.js +15 -0
- package/dist/server/server/agent/providers/opencode/v2/mapping.d.ts +7 -0
- package/dist/server/server/agent/providers/opencode/v2/mapping.js +42 -0
- package/dist/server/server/agent/providers/opencode/v2/permissions.d.ts +18 -0
- package/dist/server/server/agent/providers/opencode/v2/permissions.js +157 -0
- package/dist/server/server/agent/providers/opencode/v2/readiness.d.ts +18 -0
- package/dist/server/server/agent/providers/opencode/v2/readiness.js +51 -0
- package/dist/server/server/agent/providers/opencode/v2/runtime.d.ts +36 -0
- package/dist/server/server/agent/providers/opencode/v2/runtime.js +230 -0
- package/dist/server/server/agent/providers/opencode/v2/session.d.ts +84 -0
- package/dist/server/server/agent/providers/opencode/v2/session.js +468 -0
- package/dist/server/server/agent/providers/opencode/v2/structured-output.d.ts +8 -0
- package/dist/server/server/agent/providers/opencode/v2/structured-output.js +32 -0
- package/dist/server/server/agent/providers/opencode/v2/timeline.d.ts +28 -0
- package/dist/server/server/agent/providers/opencode/v2/timeline.js +154 -0
- package/dist/server/server/agent/providers/opencode/v2/turns.d.ts +40 -0
- package/dist/server/server/agent/providers/opencode/v2/turns.js +226 -0
- package/dist/server/server/agent/providers/opencode-agent.d.ts +26 -7
- package/dist/server/server/agent/providers/opencode-agent.js +100 -40
- package/dist/server/server/agent/providers/pi/agent.d.ts +6 -6
- package/dist/server/server/agent/providers/pi/agent.js +114 -165
- package/dist/server/server/agent/providers/pi/extensions/child-session.d.ts +4 -0
- package/dist/server/server/agent/providers/pi/extensions/child-session.js +59 -0
- package/dist/server/server/agent/providers/pi/extensions/contract.d.ts +68 -0
- package/dist/server/server/agent/providers/pi/extensions/contract.js +2 -0
- package/dist/server/server/agent/providers/pi/extensions/gotgenes-pi-subagents/index.d.ts +3 -0
- package/dist/server/server/agent/providers/pi/extensions/gotgenes-pi-subagents/index.js +159 -0
- package/dist/server/server/agent/providers/pi/extensions/host.d.ts +28 -0
- package/dist/server/server/agent/providers/pi/extensions/host.js +94 -0
- package/dist/server/server/agent/providers/pi/extensions/index.d.ts +7 -0
- package/dist/server/server/agent/providers/pi/extensions/index.js +6 -0
- package/dist/server/server/agent/providers/pi/extensions/pi-ask-user/index.d.ts +3 -0
- package/dist/server/server/agent/providers/pi/extensions/pi-ask-user/index.js +138 -0
- package/dist/server/server/agent/providers/pi/extensions/pi-example-todo/index.d.ts +3 -0
- package/dist/server/server/agent/providers/pi/extensions/pi-example-todo/index.js +38 -0
- package/dist/server/server/agent/providers/pi/extensions/pi-goal-x/index.d.ts +3 -0
- package/dist/server/server/agent/providers/pi/extensions/pi-goal-x/index.js +63 -0
- package/dist/server/server/agent/providers/pi/extensions/pi-mcp-adapter/index.d.ts +3 -0
- package/dist/server/server/agent/providers/pi/extensions/pi-mcp-adapter/index.js +48 -0
- package/dist/server/server/agent/providers/pi/extensions/pi-subagents/index.d.ts +3 -0
- package/dist/server/server/agent/providers/pi/extensions/pi-subagents/index.js +131 -0
- package/dist/server/server/agent/providers/pi/extensions/registry.d.ts +2 -0
- package/dist/server/server/agent/providers/pi/extensions/registry.js +21 -0
- package/dist/server/server/agent/providers/pi/extensions/rpiv-ask-user-question/index.d.ts +3 -0
- package/dist/server/server/agent/providers/pi/extensions/rpiv-ask-user-question/index.js +180 -0
- package/dist/server/server/agent/providers/pi/extensions/rpiv-todo/index.d.ts +3 -0
- package/dist/server/server/agent/providers/pi/extensions/rpiv-todo/index.js +51 -0
- package/dist/server/server/agent/providers/pi/extensions/subagent-fixture-test.d.ts +22 -0
- package/dist/server/server/agent/providers/pi/extensions/subagent-fixture-test.js +66 -0
- package/dist/server/server/agent/providers/pi/extensions/task-fixture-test.d.ts +4 -0
- package/dist/server/server/agent/providers/pi/extensions/task-fixture-test.js +79 -0
- package/dist/server/server/agent/providers/pi/extensions/tintinweb-pi-subagents/index.d.ts +3 -0
- package/dist/server/server/agent/providers/pi/extensions/tintinweb-pi-subagents/index.js +149 -0
- package/dist/server/server/agent/providers/pi/history-mapper.d.ts +7 -2
- package/dist/server/server/agent/providers/pi/history-mapper.js +78 -35
- package/dist/server/server/agent/providers/pi/rpc-types.d.ts +3 -0
- package/dist/server/server/agent/providers/pi/test-utils/fake-pi.d.ts +170 -0
- package/dist/server/server/agent/providers/pi/test-utils/fake-pi.js +355 -0
- package/dist/server/server/agent/providers/pi/tool-call-mapper.d.ts +1 -6
- package/dist/server/server/agent/providers/pi/tool-call-mapper.js +1 -97
- package/dist/server/server/agent/tools/paseo-tools.js +22 -15
- package/dist/server/server/auth.d.ts +1 -2
- package/dist/server/server/auth.js +8 -14
- package/dist/server/server/bootstrap.js +10 -2
- package/dist/server/server/daemon-instance.d.ts +1 -0
- package/dist/server/server/daemon-instance.js +1 -0
- package/dist/server/server/exports.d.ts +1 -1
- package/dist/server/server/exports.js +1 -1
- package/dist/server/server/local-credential.d.ts +6 -0
- package/dist/server/server/local-credential.js +82 -0
- package/dist/server/server/session-admission-auth.d.ts +16 -0
- package/dist/server/server/session-admission-auth.js +26 -0
- package/dist/server/server/websocket-server.d.ts +6 -1
- package/dist/server/server/websocket-server.js +132 -55
- package/dist/server/web-ui/_expo/static/js/web/{desktop-attachment-bridge-f41bce08c3c4ac2de0652d20234d19e9.js → desktop-attachment-bridge-9da07adb97f5e0eb726f7762afee43f5.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/{desktop-attachment-bridge-f41bce08c3c4ac2de0652d20234d19e9.js.br → desktop-attachment-bridge-9da07adb97f5e0eb726f7762afee43f5.js.br} +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-9da07adb97f5e0eb726f7762afee43f5.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{desktop-attachment-store-9e271e161480b0d1dd35e58616a37341.js → desktop-attachment-store-d5d3402a752965d3037191484127123b.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/{desktop-attachment-store-9e271e161480b0d1dd35e58616a37341.js.br → desktop-attachment-store-d5d3402a752965d3037191484127123b.js.br} +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-d5d3402a752965d3037191484127123b.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{index-8868523fc6d311c5da524c067d1cd426.js → index-136fa41d4adb7ec5c6392839cc354136.js} +1580 -1576
- package/dist/server/web-ui/_expo/static/js/web/index-136fa41d4adb7ec5c6392839cc354136.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/index-136fa41d4adb7ec5c6392839cc354136.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{indexeddb-attachment-store-369cdb67f5856fd2c72d640df0b7b79e.js → indexeddb-attachment-store-3afc19e43c8152bd3c6d71b3ea8776dc.js} +1 -1
- package/dist/server/web-ui/_expo/static/js/web/{indexeddb-attachment-store-369cdb67f5856fd2c72d640df0b7b79e.js.br → indexeddb-attachment-store-3afc19e43c8152bd3c6d71b3ea8776dc.js.br} +0 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-3afc19e43c8152bd3c6d71b3ea8776dc.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{native-file-attachment-store-bcd89f6ce714279a8f4fa0e024f3a610.js → native-file-attachment-store-187a9d5c32188f357dbbf037a0f89073.js} +3 -3
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-187a9d5c32188f357dbbf037a0f89073.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-187a9d5c32188f357dbbf037a0f89073.js.gz +0 -0
- package/dist/server/web-ui/index.html +1 -1
- package/dist/server/web-ui/index.html.br +0 -0
- package/dist/server/web-ui/index.html.gz +0 -0
- package/dist/src/server/agent/provider-launch-config.js +1 -1
- package/dist/src/server/daemon-instance.js +1 -0
- package/dist/src/server/local-credential.js +82 -0
- package/package.json +8 -7
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-f41bce08c3c4ac2de0652d20234d19e9.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-9e271e161480b0d1dd35e58616a37341.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/index-8868523fc6d311c5da524c067d1cd426.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/index-8868523fc6d311c5da524c067d1cd426.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-369cdb67f5856fd2c72d640df0b7b79e.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-bcd89f6ce714279a8f4fa0e024f3a610.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-bcd89f6ce714279a8f4fa0e024f3a610.js.gz +0 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export const V2_CAPABILITIES = {
|
|
2
|
+
supportsStreaming: true,
|
|
3
|
+
supportsSessionPersistence: true,
|
|
4
|
+
supportsSessionListing: true,
|
|
5
|
+
supportsDynamicModes: true,
|
|
6
|
+
supportsMcpServers: true,
|
|
7
|
+
supportsReasoningStream: true,
|
|
8
|
+
supportsToolInvocations: true,
|
|
9
|
+
supportsRewindBoth: true,
|
|
10
|
+
supportsRewindConversation: false,
|
|
11
|
+
supportsRewindFiles: false,
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=capabilities.js.map
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { AgentStreamEvent } from "../../../agent-sdk-types.js";
|
|
2
|
+
import type { V2Api } from "./api.js";
|
|
3
|
+
interface ChildrenOptions {
|
|
4
|
+
client(): V2Api;
|
|
5
|
+
id: string;
|
|
6
|
+
emit(event: AgentStreamEvent): void;
|
|
7
|
+
reconcilePermissions(id: string): Promise<void>;
|
|
8
|
+
bindChild?: (id: string) => void;
|
|
9
|
+
}
|
|
10
|
+
export declare class SessionChildren {
|
|
11
|
+
private readonly options;
|
|
12
|
+
private readonly children;
|
|
13
|
+
private readonly childStates;
|
|
14
|
+
constructor(options: ChildrenOptions);
|
|
15
|
+
observe(event: import("@opencode/client").OpenCodeEvent): Promise<void>;
|
|
16
|
+
reconcile(parentID: string): Promise<void>;
|
|
17
|
+
private reconcileChild;
|
|
18
|
+
}
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=children.d.ts.map
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { V2Timeline } from "./timeline.js";
|
|
2
|
+
import { messages } from "./history.js";
|
|
3
|
+
export class SessionChildren {
|
|
4
|
+
constructor(options) {
|
|
5
|
+
this.options = options;
|
|
6
|
+
this.children = new Map();
|
|
7
|
+
this.childStates = new Map();
|
|
8
|
+
}
|
|
9
|
+
async observe(event) {
|
|
10
|
+
if (event.type === "session.created" &&
|
|
11
|
+
event.data.parentID &&
|
|
12
|
+
(event.data.parentID === this.options.id || this.children.has(event.data.parentID))) {
|
|
13
|
+
await this.reconcile(event.data.parentID);
|
|
14
|
+
}
|
|
15
|
+
if ("sessionID" in event.data &&
|
|
16
|
+
typeof event.data.sessionID === "string" &&
|
|
17
|
+
this.children.has(event.data.sessionID)) {
|
|
18
|
+
await this.reconcileChild(await this.options.client().session.get({ sessionID: event.data.sessionID }));
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
async reconcile(parentID) {
|
|
22
|
+
let cursor;
|
|
23
|
+
do {
|
|
24
|
+
const page = await this.options.client().session.list({
|
|
25
|
+
...(cursor ? { cursor } : { parentID }),
|
|
26
|
+
limit: 100,
|
|
27
|
+
});
|
|
28
|
+
for (const child of page.data) {
|
|
29
|
+
await this.reconcileChild(child);
|
|
30
|
+
await this.reconcile(child.id);
|
|
31
|
+
}
|
|
32
|
+
cursor = page.cursor.next ?? undefined;
|
|
33
|
+
} while (cursor);
|
|
34
|
+
}
|
|
35
|
+
async reconcileChild(info) {
|
|
36
|
+
await this.options.reconcilePermissions(info.id);
|
|
37
|
+
let timeline = this.children.get(info.id);
|
|
38
|
+
if (!timeline) {
|
|
39
|
+
timeline = new V2Timeline();
|
|
40
|
+
this.children.set(info.id, timeline);
|
|
41
|
+
this.options.bindChild?.(info.id);
|
|
42
|
+
}
|
|
43
|
+
const active = await this.options.client().session.active();
|
|
44
|
+
let status = "completed";
|
|
45
|
+
if (active[info.id])
|
|
46
|
+
status = "running";
|
|
47
|
+
else if (info.outcome === "failed")
|
|
48
|
+
status = "failed";
|
|
49
|
+
else if (info.outcome === "interrupted")
|
|
50
|
+
status = "canceled";
|
|
51
|
+
const presentation = {
|
|
52
|
+
type: "upsert",
|
|
53
|
+
id: info.id,
|
|
54
|
+
parentSubagentId: info.parentID === this.options.id ? null : info.parentID,
|
|
55
|
+
title: info.title ?? null,
|
|
56
|
+
status,
|
|
57
|
+
cwd: info.location.directory,
|
|
58
|
+
timestamp: new Date(info.time.updated).toISOString(),
|
|
59
|
+
};
|
|
60
|
+
const signature = JSON.stringify(presentation);
|
|
61
|
+
if (this.childStates.get(info.id) !== signature) {
|
|
62
|
+
this.childStates.set(info.id, signature);
|
|
63
|
+
this.options.emit({ type: "provider_subagent", provider: "opencode", event: presentation });
|
|
64
|
+
}
|
|
65
|
+
for (const event of timeline.messages(await messages(this.options.client(), info.id))) {
|
|
66
|
+
if (event.type === "timeline")
|
|
67
|
+
this.options.emit({
|
|
68
|
+
type: "provider_subagent",
|
|
69
|
+
provider: "opencode",
|
|
70
|
+
event: { type: "timeline", id: info.id, item: event.item, timestamp: event.timestamp },
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=children.js.map
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { waitForLocationReady } from "./readiness.js";
|
|
2
|
+
export async function commands(client, directory) {
|
|
3
|
+
const location = { directory };
|
|
4
|
+
await waitForLocationReady({ client, location });
|
|
5
|
+
const [configured, skills] = await Promise.all([
|
|
6
|
+
client.command.list({ location }),
|
|
7
|
+
client.skill.list({ location }),
|
|
8
|
+
]);
|
|
9
|
+
const result = new Map();
|
|
10
|
+
for (const name of ["compact", "summarize"])
|
|
11
|
+
result.set(name, {
|
|
12
|
+
name,
|
|
13
|
+
description: "Compact the current session",
|
|
14
|
+
argumentHint: "",
|
|
15
|
+
kind: "command",
|
|
16
|
+
});
|
|
17
|
+
for (const command of configured.data)
|
|
18
|
+
result.set(command.name, {
|
|
19
|
+
name: command.name,
|
|
20
|
+
description: command.description ?? "",
|
|
21
|
+
argumentHint: "",
|
|
22
|
+
kind: "command",
|
|
23
|
+
});
|
|
24
|
+
for (const skill of skills.data) {
|
|
25
|
+
if (result.has(skill.id))
|
|
26
|
+
continue;
|
|
27
|
+
result.set(skill.id, {
|
|
28
|
+
name: skill.id,
|
|
29
|
+
description: skill.description ?? "",
|
|
30
|
+
argumentHint: "",
|
|
31
|
+
kind: "skill",
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
return [...result.values()];
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SessionInfo, PermissionRuleset } from "@opencode/client";
|
|
2
|
+
import type { V2Api } from "./api.js";
|
|
3
|
+
import type { AgentFeature, AgentLaunchContext, AgentSessionConfig } from "../../../agent-sdk-types.js";
|
|
4
|
+
export declare function features(config: AgentSessionConfig): AgentFeature[];
|
|
5
|
+
export declare function permissionRules(config: AgentSessionConfig): PermissionRuleset;
|
|
6
|
+
export declare function applyResumeOverrides(client: V2Api, info: SessionInfo, overrides?: Partial<AgentSessionConfig>): Promise<void>;
|
|
7
|
+
export declare function requiresDedicatedV2Server(config: AgentSessionConfig, launch?: AgentLaunchContext): boolean;
|
|
8
|
+
//# sourceMappingURL=configuration.d.ts.map
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { OpenCodeProviderOptionsSchema, buildOpenCodePermissionRules } from "../options.js";
|
|
2
|
+
import { modelRef } from "./mapping.js";
|
|
3
|
+
export function features(config) {
|
|
4
|
+
return [
|
|
5
|
+
{
|
|
6
|
+
type: "toggle",
|
|
7
|
+
id: "auto_accept",
|
|
8
|
+
label: "Auto-accept",
|
|
9
|
+
value: config.featureValues?.["auto_accept"] === true,
|
|
10
|
+
},
|
|
11
|
+
];
|
|
12
|
+
}
|
|
13
|
+
export function permissionRules(config) {
|
|
14
|
+
const rules = buildOpenCodePermissionRules(OpenCodeProviderOptionsSchema.parse(config.providerOptions ?? {}), undefined) ?? [];
|
|
15
|
+
const grants = (config.toolPolicy?.preapproved ?? []).map((grant) => ({
|
|
16
|
+
action: `${grant.server.replace(/[^a-zA-Z0-9_-]/g, "_")}_${grant.tool.replace(/[^a-zA-Z0-9_-]/g, "_")}`,
|
|
17
|
+
resource: "*",
|
|
18
|
+
effect: "allow",
|
|
19
|
+
}));
|
|
20
|
+
return [
|
|
21
|
+
...grants,
|
|
22
|
+
...rules.map((rule) => ({
|
|
23
|
+
action: nativePermissionAction(rule.permission),
|
|
24
|
+
resource: rule.pattern,
|
|
25
|
+
effect: rule.action,
|
|
26
|
+
})),
|
|
27
|
+
];
|
|
28
|
+
}
|
|
29
|
+
function nativePermissionAction(action) {
|
|
30
|
+
if (action === "bash")
|
|
31
|
+
return "shell";
|
|
32
|
+
if (action === "task")
|
|
33
|
+
return "subagent";
|
|
34
|
+
return action;
|
|
35
|
+
}
|
|
36
|
+
export async function applyResumeOverrides(client, info, overrides) {
|
|
37
|
+
if (overrides?.modeId) {
|
|
38
|
+
await client.session.switchAgent({
|
|
39
|
+
sessionID: info.id,
|
|
40
|
+
agent: overrides.modeId,
|
|
41
|
+
});
|
|
42
|
+
info.agent = overrides.modeId;
|
|
43
|
+
}
|
|
44
|
+
if (overrides?.model || overrides?.thinkingOptionId !== undefined) {
|
|
45
|
+
const model = overrides.model
|
|
46
|
+
? modelRef(overrides.model, overrides.thinkingOptionId ?? info.model?.variant)
|
|
47
|
+
: info.model && { ...info.model, variant: overrides.thinkingOptionId };
|
|
48
|
+
if (!model)
|
|
49
|
+
throw new Error("Select an OpenCode model before changing its variant");
|
|
50
|
+
await client.session.switchModel({ sessionID: info.id, model });
|
|
51
|
+
info.model = model;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Agent identity env is applied per session through `session.environment`, so
|
|
55
|
+
// it must not force a dedicated server. Custom MCP is location-scoped, and any
|
|
56
|
+
// other env key belongs to the process, so both need isolation. Mirrors the v1
|
|
57
|
+
// adapter's `requiresDedicatedOpenCodeServer`.
|
|
58
|
+
const V2_SESSION_ENV_KEYS = new Set(["PASEO_AGENT_ID", "PASEO_AGENT_CWD"]);
|
|
59
|
+
export function requiresDedicatedV2Server(config, launch) {
|
|
60
|
+
if (Object.keys(config.mcpServers ?? {}).length > 0)
|
|
61
|
+
return true;
|
|
62
|
+
return Object.keys(launch?.env ?? {}).some((key) => !V2_SESSION_ENV_KEYS.has(key));
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=configuration.js.map
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export async function messages(client, sessionID) {
|
|
2
|
+
const result = [];
|
|
3
|
+
let cursor;
|
|
4
|
+
do {
|
|
5
|
+
const page = await client.message.list({
|
|
6
|
+
sessionID,
|
|
7
|
+
...(cursor ? { cursor } : { order: "asc" }),
|
|
8
|
+
limit: 100,
|
|
9
|
+
});
|
|
10
|
+
result.push(...page.data);
|
|
11
|
+
cursor = page.cursor.next ?? undefined;
|
|
12
|
+
} while (cursor);
|
|
13
|
+
return result;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AgentInfo, ModelInfo, ModelRef, SessionInfo } from "@opencode/client";
|
|
2
|
+
import type { AgentMode, AgentModelDefinition, AgentUsage } from "../../../agent-sdk-types.js";
|
|
3
|
+
export declare function modelRef(id: string, variant?: string | null): ModelRef;
|
|
4
|
+
export declare function modelsFromV2(models: ModelInfo[]): AgentModelDefinition[];
|
|
5
|
+
export declare function modesFromV2(agents: AgentInfo[]): AgentMode[];
|
|
6
|
+
export declare function usageFromV2(session: SessionInfo): AgentUsage;
|
|
7
|
+
//# sourceMappingURL=mapping.d.ts.map
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export function modelRef(id, variant) {
|
|
2
|
+
const slash = id.indexOf("/");
|
|
3
|
+
if (slash < 1 || slash === id.length - 1)
|
|
4
|
+
throw new Error("OpenCode model must be provider/model");
|
|
5
|
+
return {
|
|
6
|
+
providerID: id.slice(0, slash),
|
|
7
|
+
id: id.slice(slash + 1),
|
|
8
|
+
...(variant ? { variant } : {}),
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export function modelsFromV2(models) {
|
|
12
|
+
return models
|
|
13
|
+
.filter((model) => model.enabled)
|
|
14
|
+
.map((model) => ({
|
|
15
|
+
provider: "opencode",
|
|
16
|
+
id: `${model.providerID}/${model.id}`,
|
|
17
|
+
label: model.name,
|
|
18
|
+
contextWindowMaxTokens: model.limit.context,
|
|
19
|
+
metadata: {
|
|
20
|
+
providerId: model.providerID,
|
|
21
|
+
modelId: model.id,
|
|
22
|
+
supportsAttachments: model.capabilities.input.includes("image"),
|
|
23
|
+
supportsToolCall: model.capabilities.tools,
|
|
24
|
+
contextWindowMaxTokens: model.limit.context,
|
|
25
|
+
},
|
|
26
|
+
thinkingOptions: model.variants.map((variant) => ({ id: variant.id, label: variant.id })),
|
|
27
|
+
}));
|
|
28
|
+
}
|
|
29
|
+
export function modesFromV2(agents) {
|
|
30
|
+
return agents
|
|
31
|
+
.filter((agent) => !agent.hidden && agent.mode !== "subagent")
|
|
32
|
+
.map((agent) => ({ id: agent.id, label: agent.name, description: agent.description }));
|
|
33
|
+
}
|
|
34
|
+
export function usageFromV2(session) {
|
|
35
|
+
return {
|
|
36
|
+
inputTokens: session.tokens.input,
|
|
37
|
+
outputTokens: session.tokens.output,
|
|
38
|
+
cachedInputTokens: session.tokens.cache.read,
|
|
39
|
+
totalCostUsd: session.cost,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=mapping.js.map
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { V2Api } from "./api.js";
|
|
2
|
+
import type { AgentPermissionRequest, AgentPermissionResponse, AgentSessionConfig, AgentStreamEvent } from "../../../agent-sdk-types.js";
|
|
3
|
+
export declare class SessionPermissions {
|
|
4
|
+
private readonly getClient;
|
|
5
|
+
private readonly id;
|
|
6
|
+
private readonly config;
|
|
7
|
+
private readonly emit;
|
|
8
|
+
private readonly pending;
|
|
9
|
+
private readonly permissionOwners;
|
|
10
|
+
private readonly forms;
|
|
11
|
+
constructor(getClient: () => V2Api, id: string, config: AgentSessionConfig, emit: (event: AgentStreamEvent) => void);
|
|
12
|
+
observe(event: import("@opencode/client").OpenCodeEvent): void;
|
|
13
|
+
list(): AgentPermissionRequest[];
|
|
14
|
+
respondToPermission(requestId: string, response: AgentPermissionResponse): Promise<void>;
|
|
15
|
+
reconcile(sessionID: string): Promise<void>;
|
|
16
|
+
resolvePending(requestId: string, resolution: AgentPermissionResponse): void;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
export class SessionPermissions {
|
|
2
|
+
constructor(getClient, id, config, emit) {
|
|
3
|
+
this.getClient = getClient;
|
|
4
|
+
this.id = id;
|
|
5
|
+
this.config = config;
|
|
6
|
+
this.emit = emit;
|
|
7
|
+
this.pending = new Map();
|
|
8
|
+
this.permissionOwners = new Map();
|
|
9
|
+
this.forms = new Map();
|
|
10
|
+
}
|
|
11
|
+
observe(event) {
|
|
12
|
+
if (event.type === "permission.replied") {
|
|
13
|
+
this.resolvePending(event.data.requestID, {
|
|
14
|
+
behavior: event.data.reply === "reject" ? "deny" : "allow",
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
if (event.type === "form.replied" || event.type === "form.cancelled") {
|
|
18
|
+
this.resolvePending(event.data.id, {
|
|
19
|
+
behavior: event.type === "form.cancelled" ? "deny" : "allow",
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
list() {
|
|
24
|
+
return [...this.pending.values()];
|
|
25
|
+
}
|
|
26
|
+
async respondToPermission(requestId, response) {
|
|
27
|
+
const form = this.forms.get(requestId);
|
|
28
|
+
if (form) {
|
|
29
|
+
if (response.behavior === "deny")
|
|
30
|
+
await this.getClient().session.form.cancel({ sessionID: form.sessionID, formID: form.id });
|
|
31
|
+
else {
|
|
32
|
+
const raw = response.updatedInput?.answers;
|
|
33
|
+
const answer = {};
|
|
34
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw))
|
|
35
|
+
throw new Error("OpenCode question response requires answers");
|
|
36
|
+
for (const field of form.fields) {
|
|
37
|
+
const value = Reflect.get(raw, field.key) ?? Reflect.get(raw, field.title ?? field.key);
|
|
38
|
+
const normalized = formAnswer(field, value);
|
|
39
|
+
if (normalized !== undefined)
|
|
40
|
+
answer[field.key] = normalized;
|
|
41
|
+
}
|
|
42
|
+
await this.getClient().session.form.reply({
|
|
43
|
+
sessionID: form.sessionID,
|
|
44
|
+
formID: form.id,
|
|
45
|
+
answer,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
this.forms.delete(requestId);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
await this.getClient().permission.reply({
|
|
52
|
+
sessionID: this.permissionOwners.get(requestId) ?? this.id,
|
|
53
|
+
requestID: requestId,
|
|
54
|
+
decision: permissionReply(response),
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
this.resolvePending(requestId, response);
|
|
58
|
+
}
|
|
59
|
+
async reconcile(sessionID) {
|
|
60
|
+
const [permissions, forms] = await Promise.all([
|
|
61
|
+
this.getClient().permission.list({ sessionID }),
|
|
62
|
+
this.getClient().session.form.list({ sessionID }),
|
|
63
|
+
]);
|
|
64
|
+
for (const request of permissions) {
|
|
65
|
+
if (this.pending.has(request.id))
|
|
66
|
+
continue;
|
|
67
|
+
const pending = {
|
|
68
|
+
id: request.id,
|
|
69
|
+
provider: "opencode",
|
|
70
|
+
kind: "tool",
|
|
71
|
+
name: request.action,
|
|
72
|
+
description: request.message ?? request.resources.join("\n"),
|
|
73
|
+
actions: [
|
|
74
|
+
{ id: "once", label: "Allow once", behavior: "allow" },
|
|
75
|
+
{ id: "always", label: "Always allow", behavior: "allow" },
|
|
76
|
+
{ id: "reject", label: "Deny", behavior: "deny" },
|
|
77
|
+
],
|
|
78
|
+
};
|
|
79
|
+
this.pending.set(request.id, pending);
|
|
80
|
+
this.permissionOwners.set(request.id, sessionID);
|
|
81
|
+
if (!this.config.toolPolicy && this.config.featureValues?.["auto_accept"] === true)
|
|
82
|
+
await this.respondToPermission(request.id, { behavior: "allow" });
|
|
83
|
+
else
|
|
84
|
+
this.emit({ type: "permission_requested", provider: "opencode", request: pending });
|
|
85
|
+
}
|
|
86
|
+
for (const form of forms) {
|
|
87
|
+
if (this.pending.has(form.id))
|
|
88
|
+
continue;
|
|
89
|
+
const pending = {
|
|
90
|
+
id: form.id,
|
|
91
|
+
provider: "opencode",
|
|
92
|
+
name: "question",
|
|
93
|
+
kind: "question",
|
|
94
|
+
title: form.title,
|
|
95
|
+
input: {
|
|
96
|
+
questions: form.fields.map((field) => ({
|
|
97
|
+
header: field.key,
|
|
98
|
+
question: field.title ?? field.key,
|
|
99
|
+
options: "options" in field ? field.options : undefined,
|
|
100
|
+
multiple: field.type === "multiselect",
|
|
101
|
+
})),
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
this.forms.set(form.id, form);
|
|
105
|
+
this.pending.set(form.id, pending);
|
|
106
|
+
this.emit({ type: "permission_requested", provider: "opencode", request: pending });
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
resolvePending(requestId, resolution) {
|
|
110
|
+
if (!this.pending.delete(requestId))
|
|
111
|
+
return;
|
|
112
|
+
this.forms.delete(requestId);
|
|
113
|
+
this.permissionOwners.delete(requestId);
|
|
114
|
+
this.emit({ type: "permission_resolved", provider: "opencode", requestId, resolution });
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function permissionReply(response) {
|
|
118
|
+
if (response.behavior === "deny")
|
|
119
|
+
return "reject";
|
|
120
|
+
return response.selectedActionId === "always" ? "always" : "once";
|
|
121
|
+
}
|
|
122
|
+
function formAnswer(field, value) {
|
|
123
|
+
if (value === undefined)
|
|
124
|
+
return undefined;
|
|
125
|
+
if (field.type === "external")
|
|
126
|
+
return undefined;
|
|
127
|
+
const labelValue = (label) => {
|
|
128
|
+
const options = "options" in field ? field.options : undefined;
|
|
129
|
+
return (options?.find((option) => option.value === label)?.value ??
|
|
130
|
+
options?.find((option) => option.label === label)?.value ??
|
|
131
|
+
label);
|
|
132
|
+
};
|
|
133
|
+
if (field.type === "multiselect") {
|
|
134
|
+
if (Array.isArray(value) && value.every((item) => typeof item === "string"))
|
|
135
|
+
return value.map(labelValue);
|
|
136
|
+
}
|
|
137
|
+
else if (field.type === "string" && typeof value === "string") {
|
|
138
|
+
return labelValue(value);
|
|
139
|
+
}
|
|
140
|
+
else if (field.type === "boolean") {
|
|
141
|
+
if (typeof value === "boolean")
|
|
142
|
+
return value;
|
|
143
|
+
if (value === "true")
|
|
144
|
+
return true;
|
|
145
|
+
if (value === "false")
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
else if (field.type === "number" || field.type === "integer") {
|
|
149
|
+
const numeric = typeof value === "string" && value.trim() ? Number(value) : value;
|
|
150
|
+
if (typeof numeric === "number" &&
|
|
151
|
+
Number.isFinite(numeric) &&
|
|
152
|
+
(field.type !== "integer" || Number.isInteger(numeric)))
|
|
153
|
+
return numeric;
|
|
154
|
+
}
|
|
155
|
+
throw new Error(`Invalid answer for OpenCode question ${field.key}`);
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=permissions.js.map
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { V2Api } from "./api.js";
|
|
2
|
+
interface ReadinessInput {
|
|
3
|
+
client: Pick<V2Api, "plugin">;
|
|
4
|
+
location: {
|
|
5
|
+
directory: string;
|
|
6
|
+
};
|
|
7
|
+
signal?: AbortSignal;
|
|
8
|
+
timeoutMs?: number;
|
|
9
|
+
}
|
|
10
|
+
export declare class OpenCodeLocationReadyTimeoutError extends Error {
|
|
11
|
+
readonly directory: string;
|
|
12
|
+
readonly waitedMs: number;
|
|
13
|
+
constructor(directory: string, waitedMs: number);
|
|
14
|
+
}
|
|
15
|
+
export declare function waitForLocationReady(input: ReadinessInput): Promise<void>;
|
|
16
|
+
export declare function awaitPaseoPlugin(input: ReadinessInput): Promise<void>;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=readiness.d.ts.map
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { setTimeout as delay } from "node:timers/promises";
|
|
2
|
+
import { raceProviderRefreshAbort } from "../../../provider-refresh-deadline.js";
|
|
3
|
+
export class OpenCodeLocationReadyTimeoutError extends Error {
|
|
4
|
+
constructor(directory, waitedMs) {
|
|
5
|
+
super(`OpenCode location ${directory} did not activate within ${waitedMs}ms`);
|
|
6
|
+
this.directory = directory;
|
|
7
|
+
this.waitedMs = waitedMs;
|
|
8
|
+
this.name = "OpenCodeLocationReadyTimeoutError";
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export function waitForLocationReady(input) {
|
|
12
|
+
return waitForPlugins({ ...input, requireBridge: false });
|
|
13
|
+
}
|
|
14
|
+
export function awaitPaseoPlugin(input) {
|
|
15
|
+
return waitForPlugins({ ...input, requireBridge: true });
|
|
16
|
+
}
|
|
17
|
+
async function waitForPlugins(input) {
|
|
18
|
+
const { client, location, signal, requireBridge, timeoutMs = 30000 } = input;
|
|
19
|
+
signal?.throwIfAborted();
|
|
20
|
+
const deadline = AbortSignal.timeout(timeoutMs);
|
|
21
|
+
const lifetime = signal ? AbortSignal.any([signal, deadline]) : deadline;
|
|
22
|
+
try {
|
|
23
|
+
while (true) {
|
|
24
|
+
const requestTimeout = AbortSignal.timeout(5000);
|
|
25
|
+
const requestSignal = AbortSignal.any([lifetime, requestTimeout]);
|
|
26
|
+
try {
|
|
27
|
+
const plugins = await raceProviderRefreshAbort(requestSignal, client.plugin.list({ location }, { signal: requestSignal }));
|
|
28
|
+
if (!requireBridge && plugins.data.length > 0)
|
|
29
|
+
return;
|
|
30
|
+
const bridge = plugins.data.find((plugin) => plugin.id === "paseo");
|
|
31
|
+
if (requireBridge && bridge?.state.status === "active")
|
|
32
|
+
return;
|
|
33
|
+
if (requireBridge && bridge?.state.status === "failed")
|
|
34
|
+
throw new Error(`OpenCode Paseo tool bridge plugin failed: ${bridge.state.error}`);
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
lifetime.throwIfAborted();
|
|
38
|
+
if (!requestTimeout.aborted)
|
|
39
|
+
throw error;
|
|
40
|
+
}
|
|
41
|
+
await delay(50, undefined, { signal: lifetime });
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
signal?.throwIfAborted();
|
|
46
|
+
if (deadline.aborted)
|
|
47
|
+
throw new OpenCodeLocationReadyTimeoutError(location.directory, timeoutMs);
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=readiness.js.map
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { V2Api } from "./api.js";
|
|
2
|
+
import type { Logger } from "pino";
|
|
3
|
+
import { type ProviderRuntimeSettings } from "../../../provider-launch-config.js";
|
|
4
|
+
import type { ManagedProcessRegistry } from "../../../../managed-processes/managed-processes.js";
|
|
5
|
+
export interface V2Connection {
|
|
6
|
+
client: V2Api;
|
|
7
|
+
release(): Promise<void>;
|
|
8
|
+
retain(): V2Connection;
|
|
9
|
+
readonly exited: Promise<Error>;
|
|
10
|
+
}
|
|
11
|
+
export interface V2RuntimeOptions {
|
|
12
|
+
logger: Logger;
|
|
13
|
+
settings?: ProviderRuntimeSettings;
|
|
14
|
+
managedProcesses?: ManagedProcessRegistry;
|
|
15
|
+
decorateEnv?: (env: Record<string, string>) => Promise<Record<string, string>>;
|
|
16
|
+
}
|
|
17
|
+
export interface V2RuntimeAcquireOptions {
|
|
18
|
+
fresh?: boolean;
|
|
19
|
+
dedicated?: boolean;
|
|
20
|
+
env?: Record<string, string>;
|
|
21
|
+
signal?: AbortSignal;
|
|
22
|
+
}
|
|
23
|
+
export declare class V2Runtime {
|
|
24
|
+
private readonly options;
|
|
25
|
+
private current;
|
|
26
|
+
private generations;
|
|
27
|
+
private starts;
|
|
28
|
+
private closed;
|
|
29
|
+
constructor(options: V2RuntimeOptions);
|
|
30
|
+
acquire(input?: V2RuntimeAcquireOptions): Promise<V2Connection>;
|
|
31
|
+
private lease;
|
|
32
|
+
shutdown(): Promise<void>;
|
|
33
|
+
private startTracked;
|
|
34
|
+
private start;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=runtime.d.ts.map
|