@opencomputer/blue 0.0.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/README.md +287 -0
- package/dist/auth/cli-auth.d.ts +30 -0
- package/dist/auth/cli-auth.js +206 -0
- package/dist/auth/cli-auth.js.map +1 -0
- package/dist/channels/slack-progress.d.ts +27 -0
- package/dist/channels/slack-progress.js +149 -0
- package/dist/channels/slack-progress.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +790 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/agent.d.ts +10 -0
- package/dist/core/agent.js +112 -0
- package/dist/core/agent.js.map +1 -0
- package/dist/core/artifact.d.ts +7 -0
- package/dist/core/artifact.js +46 -0
- package/dist/core/artifact.js.map +1 -0
- package/dist/dev/local-control-plane.d.ts +11 -0
- package/dist/dev/local-control-plane.js +639 -0
- package/dist/dev/local-control-plane.js.map +1 -0
- package/dist/dev/manager.d.ts +35 -0
- package/dist/dev/manager.js +589 -0
- package/dist/dev/manager.js.map +1 -0
- package/dist/openrouter/auth.d.ts +2 -0
- package/dist/openrouter/auth.js +144 -0
- package/dist/openrouter/auth.js.map +1 -0
- package/dist/protocol.d.ts +187 -0
- package/dist/protocol.js +14 -0
- package/dist/protocol.js.map +1 -0
- package/dist/runtime/harness.d.ts +30 -0
- package/dist/runtime/harness.js +370 -0
- package/dist/runtime/harness.js.map +1 -0
- package/dist/runtime/local-runtime.d.ts +2 -0
- package/dist/runtime/local-runtime.js +161 -0
- package/dist/runtime/local-runtime.js.map +1 -0
- package/dist/sdk/client.d.ts +28 -0
- package/dist/sdk/client.js +131 -0
- package/dist/sdk/client.js.map +1 -0
- package/dist/sdk/index.d.ts +2 -0
- package/dist/sdk/index.js +3 -0
- package/dist/sdk/index.js.map +1 -0
- package/package.json +95 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
3
|
+
import { access, chmod, mkdir, readFile, writeFile } from "node:fs/promises";
|
|
4
|
+
import { createServer } from "node:http";
|
|
5
|
+
import { homedir } from "node:os";
|
|
6
|
+
import { dirname, resolve } from "node:path";
|
|
7
|
+
import process from "node:process";
|
|
8
|
+
function userCredentialPath() {
|
|
9
|
+
const configDirectory = process.env.BLUE_CONFIG_DIR ??
|
|
10
|
+
process.env.XDG_CONFIG_HOME ??
|
|
11
|
+
resolve(homedir(), ".config");
|
|
12
|
+
return resolve(configDirectory, "blue", "openrouter.json");
|
|
13
|
+
}
|
|
14
|
+
async function findProjectCredential(startDirectory = process.cwd()) {
|
|
15
|
+
let directory = resolve(startDirectory);
|
|
16
|
+
for (;;) {
|
|
17
|
+
const path = resolve(directory, ".blue", "openrouter.json");
|
|
18
|
+
try {
|
|
19
|
+
await access(path);
|
|
20
|
+
return path;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
const parent = dirname(directory);
|
|
24
|
+
if (parent === directory)
|
|
25
|
+
return undefined;
|
|
26
|
+
directory = parent;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function openBrowser(url) {
|
|
31
|
+
const command = process.platform === "darwin"
|
|
32
|
+
? "open"
|
|
33
|
+
: process.platform === "win32"
|
|
34
|
+
? "cmd"
|
|
35
|
+
: "xdg-open";
|
|
36
|
+
const args = process.platform === "win32" ? ["/c", "start", "", url] : [url];
|
|
37
|
+
const child = spawn(command, args, {
|
|
38
|
+
detached: true,
|
|
39
|
+
stdio: "ignore",
|
|
40
|
+
});
|
|
41
|
+
child.unref();
|
|
42
|
+
}
|
|
43
|
+
async function oauthCredential() {
|
|
44
|
+
const verifier = randomBytes(48).toString("base64url");
|
|
45
|
+
const challenge = createHash("sha256")
|
|
46
|
+
.update(verifier)
|
|
47
|
+
.digest("base64url");
|
|
48
|
+
const { code, callbackUrl } = await new Promise((resolvePromise, reject) => {
|
|
49
|
+
const server = createServer();
|
|
50
|
+
server.once("error", reject);
|
|
51
|
+
server.listen(0, "127.0.0.1", () => {
|
|
52
|
+
const address = server.address();
|
|
53
|
+
if (!address || typeof address === "string") {
|
|
54
|
+
server.close();
|
|
55
|
+
reject(new Error("Could not create an OpenRouter callback listener"));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const callbackUrl = `http://localhost:${String(address.port)}/callback`;
|
|
59
|
+
const code = new Promise((resolveCode, rejectCode) => {
|
|
60
|
+
const timeout = setTimeout(() => {
|
|
61
|
+
server.close();
|
|
62
|
+
server.closeAllConnections();
|
|
63
|
+
rejectCode(new Error("OpenRouter authorization timed out"));
|
|
64
|
+
}, 5 * 60_000);
|
|
65
|
+
server.on("request", (request, response) => {
|
|
66
|
+
const url = new URL(request.url ?? "/", callbackUrl);
|
|
67
|
+
const authorizationCode = url.searchParams.get("code");
|
|
68
|
+
const error = url.searchParams.get("error");
|
|
69
|
+
if (error || !authorizationCode) {
|
|
70
|
+
response.writeHead(400, { "content-type": "text/plain" });
|
|
71
|
+
response.end("OpenRouter authorization failed. Return to Blue.");
|
|
72
|
+
clearTimeout(timeout);
|
|
73
|
+
server.close();
|
|
74
|
+
server.closeAllConnections();
|
|
75
|
+
rejectCode(new Error(error ?? "OpenRouter did not return a code"));
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
response.writeHead(200, { "content-type": "text/plain" });
|
|
79
|
+
response.end("OpenRouter is connected. You can close this tab.");
|
|
80
|
+
clearTimeout(timeout);
|
|
81
|
+
server.close();
|
|
82
|
+
server.closeAllConnections();
|
|
83
|
+
resolveCode(authorizationCode);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
resolvePromise({ code, callbackUrl });
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
const authorizationUrl = new URL("https://openrouter.ai/auth");
|
|
90
|
+
authorizationUrl.searchParams.set("callback_url", callbackUrl);
|
|
91
|
+
authorizationUrl.searchParams.set("code_challenge", challenge);
|
|
92
|
+
authorizationUrl.searchParams.set("code_challenge_method", "S256");
|
|
93
|
+
process.stdout.write(`OpenRouter authorization: ${authorizationUrl}\n`);
|
|
94
|
+
openBrowser(authorizationUrl.toString());
|
|
95
|
+
const response = await fetch("https://openrouter.ai/api/v1/auth/keys", {
|
|
96
|
+
method: "POST",
|
|
97
|
+
headers: { "content-type": "application/json" },
|
|
98
|
+
body: JSON.stringify({
|
|
99
|
+
code: await code,
|
|
100
|
+
code_verifier: verifier,
|
|
101
|
+
code_challenge_method: "S256",
|
|
102
|
+
}),
|
|
103
|
+
});
|
|
104
|
+
const body = (await response.json());
|
|
105
|
+
if (!response.ok || typeof body.key !== "string") {
|
|
106
|
+
throw new Error(`OpenRouter key exchange failed (${String(response.status)})`);
|
|
107
|
+
}
|
|
108
|
+
return body.key;
|
|
109
|
+
}
|
|
110
|
+
export async function authenticateOpenRouter() {
|
|
111
|
+
const environmentKey = process.env.OPENROUTER_API_KEY;
|
|
112
|
+
const key = environmentKey ?? (await oauthCredential());
|
|
113
|
+
const credential = {
|
|
114
|
+
key,
|
|
115
|
+
createdAt: new Date().toISOString(),
|
|
116
|
+
source: environmentKey ? "environment" : "oauth",
|
|
117
|
+
};
|
|
118
|
+
const credentialPath = userCredentialPath();
|
|
119
|
+
await mkdir(dirname(credentialPath), { recursive: true });
|
|
120
|
+
await writeFile(credentialPath, `${JSON.stringify(credential, null, 2)}\n`, {
|
|
121
|
+
mode: 0o600,
|
|
122
|
+
});
|
|
123
|
+
await chmod(credentialPath, 0o600);
|
|
124
|
+
return key;
|
|
125
|
+
}
|
|
126
|
+
export async function readOpenRouterCredential(startDirectory = process.cwd()) {
|
|
127
|
+
if (process.env.OPENROUTER_API_KEY)
|
|
128
|
+
return process.env.OPENROUTER_API_KEY;
|
|
129
|
+
const projectCredential = await findProjectCredential(startDirectory);
|
|
130
|
+
for (const path of [projectCredential, userCredentialPath()]) {
|
|
131
|
+
if (!path)
|
|
132
|
+
continue;
|
|
133
|
+
try {
|
|
134
|
+
const credential = JSON.parse(await readFile(path, "utf8"));
|
|
135
|
+
if (typeof credential.key === "string")
|
|
136
|
+
return credential.key;
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
// Try the next supported credential location.
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return undefined;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/openrouter/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
export declare const BLUE_PROTOCOL_VERSION: 1;
|
|
2
|
+
export type SessionStatus = "new" | "connecting" | "idle" | "running" | "waiting_runtime" | "suspending" | "suspended" | "resuming" | "failed" | "ended";
|
|
3
|
+
export type MicrovmLifecycleState = "running" | "suspending" | "suspended" | "resuming" | "terminated";
|
|
4
|
+
export type TurnStatus = "queued" | "running" | "completed" | "failed" | "cancelled";
|
|
5
|
+
export type BlueEventType = "session.created" | "session.status_changed" | "runtime.connected" | "runtime.disconnected" | "runtime.suspended" | "runtime.resumed" | "turn.queued" | "turn.started" | "message.received" | "message.delta" | "message.completed" | "reasoning.delta" | "reasoning.completed" | "tool.started" | "tool.completed" | "tool.failed" | "usage.recorded" | "turn.completed" | "turn.failed" | "turn.cancelled" | "session.failed" | "session.ended";
|
|
6
|
+
export interface BlueEvent {
|
|
7
|
+
id: string;
|
|
8
|
+
seq: number;
|
|
9
|
+
timestamp: string;
|
|
10
|
+
protocolVersion: typeof BLUE_PROTOCOL_VERSION;
|
|
11
|
+
accountId: string;
|
|
12
|
+
agentId: string;
|
|
13
|
+
deploymentId: string;
|
|
14
|
+
sessionId: string;
|
|
15
|
+
turnId?: string;
|
|
16
|
+
type: BlueEventType;
|
|
17
|
+
data: Record<string, unknown>;
|
|
18
|
+
}
|
|
19
|
+
export interface SessionSnapshot {
|
|
20
|
+
id: string;
|
|
21
|
+
accountId: string;
|
|
22
|
+
agentId: string;
|
|
23
|
+
deploymentId: string;
|
|
24
|
+
status: SessionStatus;
|
|
25
|
+
runtimeId?: string;
|
|
26
|
+
runtimeEpoch: number;
|
|
27
|
+
microvmId?: string;
|
|
28
|
+
microvmState?: MicrovmLifecycleState;
|
|
29
|
+
createdAt: string;
|
|
30
|
+
updatedAt: string;
|
|
31
|
+
turns: Array<{
|
|
32
|
+
id: string;
|
|
33
|
+
input: string;
|
|
34
|
+
status: TurnStatus;
|
|
35
|
+
createdAt: string;
|
|
36
|
+
updatedAt: string;
|
|
37
|
+
}>;
|
|
38
|
+
}
|
|
39
|
+
export interface InitializeSessionInput {
|
|
40
|
+
id: string;
|
|
41
|
+
accountId: string;
|
|
42
|
+
agentId: string;
|
|
43
|
+
deploymentId: string;
|
|
44
|
+
}
|
|
45
|
+
export interface InitializeSessionResult {
|
|
46
|
+
session: SessionSnapshot;
|
|
47
|
+
runtimeToken: string;
|
|
48
|
+
deployment?: AgentDeployment;
|
|
49
|
+
}
|
|
50
|
+
export interface AgentArtifactReference {
|
|
51
|
+
bucket: string;
|
|
52
|
+
key: string;
|
|
53
|
+
digest: string;
|
|
54
|
+
size: number;
|
|
55
|
+
}
|
|
56
|
+
export interface DeploymentUpload {
|
|
57
|
+
uploadUrl: string;
|
|
58
|
+
method: "PUT";
|
|
59
|
+
headers: Record<string, string>;
|
|
60
|
+
artifact: AgentArtifactReference;
|
|
61
|
+
}
|
|
62
|
+
export interface CreateDeploymentUploadInput {
|
|
63
|
+
agentId: string;
|
|
64
|
+
digest: string;
|
|
65
|
+
size: number;
|
|
66
|
+
contentType: string;
|
|
67
|
+
}
|
|
68
|
+
export interface AgentDeployment {
|
|
69
|
+
id: string;
|
|
70
|
+
agentId: string;
|
|
71
|
+
alias: string;
|
|
72
|
+
artifact: AgentArtifactReference;
|
|
73
|
+
imageArn: string;
|
|
74
|
+
imageVersion: string;
|
|
75
|
+
createdAt: string;
|
|
76
|
+
}
|
|
77
|
+
export interface AgentSummary {
|
|
78
|
+
id: string;
|
|
79
|
+
activeDeploymentId: string;
|
|
80
|
+
activeAlias: string;
|
|
81
|
+
deploymentCount: number;
|
|
82
|
+
createdAt: string;
|
|
83
|
+
updatedAt: string;
|
|
84
|
+
}
|
|
85
|
+
export interface BlueIdentity {
|
|
86
|
+
userId: string;
|
|
87
|
+
accountId: string;
|
|
88
|
+
organizationId?: string;
|
|
89
|
+
role?: string;
|
|
90
|
+
}
|
|
91
|
+
export interface RegisterDeploymentInput {
|
|
92
|
+
agentId: string;
|
|
93
|
+
alias: string;
|
|
94
|
+
artifact: AgentArtifactReference;
|
|
95
|
+
imageArn?: string;
|
|
96
|
+
imageVersion?: string;
|
|
97
|
+
}
|
|
98
|
+
export interface EnqueueTurnInput {
|
|
99
|
+
input: string;
|
|
100
|
+
idempotencyKey: string;
|
|
101
|
+
}
|
|
102
|
+
export interface EnqueueTurnResult {
|
|
103
|
+
turnId: string;
|
|
104
|
+
status: TurnStatus;
|
|
105
|
+
duplicate: boolean;
|
|
106
|
+
}
|
|
107
|
+
export interface BindMicrovmInput {
|
|
108
|
+
microvmId: string;
|
|
109
|
+
state: MicrovmLifecycleState;
|
|
110
|
+
}
|
|
111
|
+
export interface RuntimeEventInput {
|
|
112
|
+
type: BlueEventType;
|
|
113
|
+
data?: Record<string, unknown>;
|
|
114
|
+
}
|
|
115
|
+
export type RuntimeToSessionFrame = {
|
|
116
|
+
type: "runtime.ready";
|
|
117
|
+
epoch: number;
|
|
118
|
+
} | {
|
|
119
|
+
type: "runtime.heartbeat";
|
|
120
|
+
epoch: number;
|
|
121
|
+
} | {
|
|
122
|
+
type: "credential.request";
|
|
123
|
+
epoch: number;
|
|
124
|
+
provider: "openrouter";
|
|
125
|
+
} | {
|
|
126
|
+
type: "turn.accepted";
|
|
127
|
+
epoch: number;
|
|
128
|
+
turnId: string;
|
|
129
|
+
} | {
|
|
130
|
+
type: "event.batch";
|
|
131
|
+
epoch: number;
|
|
132
|
+
frameId: string;
|
|
133
|
+
turnId: string;
|
|
134
|
+
events: RuntimeEventInput[];
|
|
135
|
+
};
|
|
136
|
+
export type SessionToRuntimeFrame = {
|
|
137
|
+
type: "runtime.welcome";
|
|
138
|
+
protocolVersion: typeof BLUE_PROTOCOL_VERSION;
|
|
139
|
+
sessionId: string;
|
|
140
|
+
runtimeId: string;
|
|
141
|
+
epoch: number;
|
|
142
|
+
} | {
|
|
143
|
+
type: "turn.start";
|
|
144
|
+
turnId: string;
|
|
145
|
+
input: string;
|
|
146
|
+
} | {
|
|
147
|
+
type: "turn.cancel";
|
|
148
|
+
turnId: string;
|
|
149
|
+
} | {
|
|
150
|
+
type: "credential.response";
|
|
151
|
+
provider: "openrouter";
|
|
152
|
+
apiKey: string;
|
|
153
|
+
model: string;
|
|
154
|
+
};
|
|
155
|
+
export type ClientToSessionFrame = {
|
|
156
|
+
type: "ping";
|
|
157
|
+
} | {
|
|
158
|
+
type: "turn.create";
|
|
159
|
+
input: string;
|
|
160
|
+
idempotencyKey: string;
|
|
161
|
+
};
|
|
162
|
+
export type SessionToClientFrame = {
|
|
163
|
+
type: "ready";
|
|
164
|
+
sessionId: string;
|
|
165
|
+
cursor: number;
|
|
166
|
+
} | {
|
|
167
|
+
type: "event";
|
|
168
|
+
event: BlueEvent;
|
|
169
|
+
} | {
|
|
170
|
+
type: "pong";
|
|
171
|
+
} | {
|
|
172
|
+
type: "error";
|
|
173
|
+
code: string;
|
|
174
|
+
message: string;
|
|
175
|
+
};
|
|
176
|
+
export interface RuntimeConnectionAttachment {
|
|
177
|
+
role: "runtime";
|
|
178
|
+
runtimeId: string;
|
|
179
|
+
epoch: number;
|
|
180
|
+
}
|
|
181
|
+
export interface ClientConnectionAttachment {
|
|
182
|
+
role: "client";
|
|
183
|
+
connectionId: string;
|
|
184
|
+
}
|
|
185
|
+
export type ConnectionAttachment = RuntimeConnectionAttachment | ClientConnectionAttachment;
|
|
186
|
+
export declare function isRecord(value: unknown): value is Record<string, unknown>;
|
|
187
|
+
export declare function parseJsonRecord(value: string): Record<string, unknown> | null;
|
package/dist/protocol.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export const BLUE_PROTOCOL_VERSION = 1;
|
|
2
|
+
export function isRecord(value) {
|
|
3
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
4
|
+
}
|
|
5
|
+
export function parseJsonRecord(value) {
|
|
6
|
+
try {
|
|
7
|
+
const parsed = JSON.parse(value);
|
|
8
|
+
return isRecord(parsed) ? parsed : null;
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAU,CAAC;AA+QhD,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1C,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { RuntimeEventInput } from "../protocol.js";
|
|
2
|
+
export interface HarnessTurn {
|
|
3
|
+
turnId: string;
|
|
4
|
+
input: string;
|
|
5
|
+
}
|
|
6
|
+
export interface Harness {
|
|
7
|
+
start(): Promise<void>;
|
|
8
|
+
run(turn: HarnessTurn): AsyncIterable<RuntimeEventInput>;
|
|
9
|
+
close(): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
export type HarnessName = "mock" | "opencode";
|
|
12
|
+
export declare class MockHarness implements Harness {
|
|
13
|
+
start(): Promise<void>;
|
|
14
|
+
run(turn: HarnessTurn): AsyncIterable<RuntimeEventInput>;
|
|
15
|
+
close(): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
export declare class OpenCodeHarness implements Harness {
|
|
18
|
+
private readonly directory;
|
|
19
|
+
private readonly model;
|
|
20
|
+
private abortController?;
|
|
21
|
+
private client?;
|
|
22
|
+
private server?;
|
|
23
|
+
private sessionId?;
|
|
24
|
+
constructor(directory: string, model?: string);
|
|
25
|
+
private log;
|
|
26
|
+
start(): Promise<void>;
|
|
27
|
+
run(turn: HarnessTurn): AsyncIterable<RuntimeEventInput>;
|
|
28
|
+
close(): Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
export declare function createHarness(name: HarnessName, directory: string, model?: string): Harness;
|