@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.
Files changed (41) hide show
  1. package/README.md +287 -0
  2. package/dist/auth/cli-auth.d.ts +30 -0
  3. package/dist/auth/cli-auth.js +206 -0
  4. package/dist/auth/cli-auth.js.map +1 -0
  5. package/dist/channels/slack-progress.d.ts +27 -0
  6. package/dist/channels/slack-progress.js +149 -0
  7. package/dist/channels/slack-progress.js.map +1 -0
  8. package/dist/cli/index.d.ts +2 -0
  9. package/dist/cli/index.js +790 -0
  10. package/dist/cli/index.js.map +1 -0
  11. package/dist/core/agent.d.ts +10 -0
  12. package/dist/core/agent.js +112 -0
  13. package/dist/core/agent.js.map +1 -0
  14. package/dist/core/artifact.d.ts +7 -0
  15. package/dist/core/artifact.js +46 -0
  16. package/dist/core/artifact.js.map +1 -0
  17. package/dist/dev/local-control-plane.d.ts +11 -0
  18. package/dist/dev/local-control-plane.js +639 -0
  19. package/dist/dev/local-control-plane.js.map +1 -0
  20. package/dist/dev/manager.d.ts +35 -0
  21. package/dist/dev/manager.js +589 -0
  22. package/dist/dev/manager.js.map +1 -0
  23. package/dist/openrouter/auth.d.ts +2 -0
  24. package/dist/openrouter/auth.js +144 -0
  25. package/dist/openrouter/auth.js.map +1 -0
  26. package/dist/protocol.d.ts +187 -0
  27. package/dist/protocol.js +14 -0
  28. package/dist/protocol.js.map +1 -0
  29. package/dist/runtime/harness.d.ts +30 -0
  30. package/dist/runtime/harness.js +370 -0
  31. package/dist/runtime/harness.js.map +1 -0
  32. package/dist/runtime/local-runtime.d.ts +2 -0
  33. package/dist/runtime/local-runtime.js +161 -0
  34. package/dist/runtime/local-runtime.js.map +1 -0
  35. package/dist/sdk/client.d.ts +28 -0
  36. package/dist/sdk/client.js +131 -0
  37. package/dist/sdk/client.js.map +1 -0
  38. package/dist/sdk/index.d.ts +2 -0
  39. package/dist/sdk/index.js +3 -0
  40. package/dist/sdk/index.js.map +1 -0
  41. package/package.json +95 -0
@@ -0,0 +1,131 @@
1
+ export class BlueClient {
2
+ apiKey;
3
+ baseUrl;
4
+ constructor(baseUrl = "http://127.0.0.1:8787", apiKey) {
5
+ this.apiKey = apiKey;
6
+ this.baseUrl = baseUrl.replace(/\/$/, "");
7
+ }
8
+ async createSession(input = {}) {
9
+ return this.request("/v1/sessions", {
10
+ method: "POST",
11
+ headers: { "content-type": "application/json" },
12
+ body: JSON.stringify(input),
13
+ });
14
+ }
15
+ async registerDeployment(input) {
16
+ return this.request("/v1/deployments", {
17
+ method: "POST",
18
+ headers: { "content-type": "application/json" },
19
+ body: JSON.stringify(input),
20
+ });
21
+ }
22
+ async createDeploymentUpload(input) {
23
+ return this.request("/v1/deployment-uploads", {
24
+ method: "POST",
25
+ headers: { "content-type": "application/json" },
26
+ body: JSON.stringify(input),
27
+ });
28
+ }
29
+ async getDeployment(deploymentId) {
30
+ return this.request(`/v1/deployments/${encodeURIComponent(deploymentId)}`);
31
+ }
32
+ async listAgents() {
33
+ const result = await this.request("/v1/agents");
34
+ return result.agents;
35
+ }
36
+ async whoami() {
37
+ return this.request("/v1/me");
38
+ }
39
+ async listSessions() {
40
+ const result = await this.request("/v1/sessions");
41
+ return result.sessions;
42
+ }
43
+ async getSession(sessionId) {
44
+ return this.request(`/v1/sessions/${encodeURIComponent(sessionId)}`);
45
+ }
46
+ async createTurn(sessionId, input, idempotencyKey = crypto.randomUUID()) {
47
+ return this.request(`/v1/sessions/${encodeURIComponent(sessionId)}/turns`, {
48
+ method: "POST",
49
+ headers: { "content-type": "application/json" },
50
+ body: JSON.stringify({ input, idempotencyKey }),
51
+ });
52
+ }
53
+ async listEvents(sessionId, after = 0) {
54
+ const result = await this.request(`/v1/sessions/${encodeURIComponent(sessionId)}/events?after=${after}`);
55
+ return result.events;
56
+ }
57
+ async endSession(sessionId) {
58
+ return this.request(`/v1/sessions/${encodeURIComponent(sessionId)}/end`, {
59
+ method: "POST",
60
+ });
61
+ }
62
+ async resumeSession(sessionId) {
63
+ return this.request(`/v1/sessions/${encodeURIComponent(sessionId)}/resume`, {
64
+ method: "POST",
65
+ });
66
+ }
67
+ async suspendSession(sessionId) {
68
+ return this.request(`/v1/sessions/${encodeURIComponent(sessionId)}/suspend`, { method: "POST" });
69
+ }
70
+ async terminateSession(sessionId) {
71
+ return this.request(`/v1/sessions/${encodeURIComponent(sessionId)}/terminate`, { method: "POST" });
72
+ }
73
+ async bindMicrovm(sessionId, input) {
74
+ return this.request(`/v1/sessions/${encodeURIComponent(sessionId)}/microvm`, {
75
+ method: "PUT",
76
+ headers: { "content-type": "application/json" },
77
+ body: JSON.stringify(input),
78
+ });
79
+ }
80
+ async updateMicrovmState(sessionId, input) {
81
+ return this.request(`/v1/sessions/${encodeURIComponent(sessionId)}/microvm`, {
82
+ method: "PATCH",
83
+ headers: { "content-type": "application/json" },
84
+ body: JSON.stringify(input),
85
+ });
86
+ }
87
+ connect(sessionId, cursor = 0) {
88
+ const url = new URL(`/v1/sessions/${encodeURIComponent(sessionId)}/connect`, this.baseUrl);
89
+ url.protocol = url.protocol === "https:" ? "wss:" : "ws:";
90
+ url.searchParams.set("role", "client");
91
+ url.searchParams.set("cursor", String(cursor));
92
+ if (this.apiKey) {
93
+ url.searchParams.set("api_key", this.apiKey);
94
+ }
95
+ return new WebSocket(url.toString());
96
+ }
97
+ async request(path, init) {
98
+ const headers = new Headers(init?.headers);
99
+ if (this.apiKey) {
100
+ headers.set("authorization", `Bearer ${this.apiKey}`);
101
+ }
102
+ const response = await fetch(`${this.baseUrl}${path}`, {
103
+ ...init,
104
+ headers,
105
+ });
106
+ const contentType = response.headers.get("content-type") ?? "";
107
+ if (!contentType.includes("application/json")) {
108
+ throw new Error(`Blue API returned ${String(response.status)} ${contentType || "without a content type"} from ${this.baseUrl}${path}`);
109
+ }
110
+ const body = await response.json();
111
+ if (!response.ok) {
112
+ const message = typeof body === "object" &&
113
+ body !== null &&
114
+ "message" in body &&
115
+ typeof body.message === "string"
116
+ ? body.message
117
+ : typeof body === "object" &&
118
+ body !== null &&
119
+ "error" in body &&
120
+ typeof body.error === "object" &&
121
+ body.error !== null &&
122
+ "message" in body.error &&
123
+ typeof body.error.message === "string"
124
+ ? body.error.message
125
+ : `Request failed with status ${response.status}`;
126
+ throw new Error(message);
127
+ }
128
+ return body;
129
+ }
130
+ }
131
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/sdk/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from "./client.js";
2
+ export * from "../protocol.js";
@@ -0,0 +1,3 @@
1
+ export * from "./client.js";
2
+ export * from "../protocol.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sdk/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,95 @@
1
+ {
2
+ "name": "@opencomputer/blue",
3
+ "version": "0.0.1",
4
+ "description": "Build, test, deploy, and run persistent OpenCode agents with Blue.",
5
+ "type": "module",
6
+ "main": "./dist/sdk/index.js",
7
+ "types": "./dist/sdk/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/sdk/index.d.ts",
11
+ "import": "./dist/sdk/index.js"
12
+ },
13
+ "./protocol": {
14
+ "types": "./dist/protocol.d.ts",
15
+ "import": "./dist/protocol.js"
16
+ }
17
+ },
18
+ "bin": {
19
+ "blue": "dist/cli/index.js"
20
+ },
21
+ "files": [
22
+ "dist/auth",
23
+ "dist/channels",
24
+ "dist/cli",
25
+ "dist/core",
26
+ "dist/dev",
27
+ "dist/openrouter",
28
+ "dist/runtime",
29
+ "dist/sdk",
30
+ "dist/protocol.d.ts",
31
+ "dist/protocol.js",
32
+ "dist/protocol.js.map",
33
+ "README.md"
34
+ ],
35
+ "publishConfig": {
36
+ "access": "public"
37
+ },
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "git+https://github.com/diggerhq/blue.git"
41
+ },
42
+ "homepage": "https://github.com/diggerhq/blue#readme",
43
+ "keywords": [
44
+ "agents",
45
+ "opencode",
46
+ "ai",
47
+ "cli"
48
+ ],
49
+ "scripts": {
50
+ "build": "tsc -p tsconfig.build.json",
51
+ "check": "tsc --noEmit",
52
+ "prepack": "npm run build",
53
+ "dev": "tsx src/cli/index.ts dev",
54
+ "blue": "tsx src/cli/index.ts",
55
+ "runtime": "tsx src/runtime/local-runtime.ts",
56
+ "test": "vitest run",
57
+ "test:watch": "vitest",
58
+ "typegen": "wrangler types",
59
+ "deploy": "wrangler deploy",
60
+ "deploy:edge:production": "wrangler deploy --config wrangler.production.jsonc",
61
+ "deploy:platform": "wrangler deploy --config wrangler.platform.jsonc",
62
+ "deploy:dry-run": "wrangler deploy --dry-run",
63
+ "check:startup": "wrangler check startup"
64
+ },
65
+ "dependencies": {
66
+ "@opencode-ai/sdk": "1.18.4",
67
+ "@slack/socket-mode": "^3.0.0",
68
+ "@slack/web-api": "^8.0.0",
69
+ "jose": "^6.2.4",
70
+ "opencode-ai": "1.18.4",
71
+ "ws": "^8.21.1"
72
+ },
73
+ "devDependencies": {
74
+ "@aws-sdk/client-ec2": "^3.1094.0",
75
+ "@aws-sdk/client-iam": "^3.1094.0",
76
+ "@aws-sdk/client-lambda-core": "^3.1094.0",
77
+ "@aws-sdk/client-lambda-microvms": "^3.1094.0",
78
+ "@aws-sdk/client-s3": "^3.1094.0",
79
+ "@aws-sdk/client-s3files": "^3.1094.0",
80
+ "@aws-sdk/client-sts": "^3.1094.0",
81
+ "@aws-sdk/credential-providers": "^3.1094.0",
82
+ "@aws-sdk/s3-request-presigner": "^3.1095.0",
83
+ "@cloudflare/vitest-pool-workers": "0.18.8",
84
+ "@cloudflare/workers-types": "5.20260723.1",
85
+ "@types/node": "^24.0.0",
86
+ "@types/ws": "^8.18.1",
87
+ "tsx": "^4.20.0",
88
+ "typescript": "^5.9.0",
89
+ "vitest": "4.1.10",
90
+ "wrangler": "4.114.0"
91
+ },
92
+ "engines": {
93
+ "node": ">=22"
94
+ }
95
+ }