@opentag/client 0.1.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/README.md +57 -0
- package/dist/index.d.ts +111 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +178 -0
- package/dist/index.js.map +1 -0
- package/package.json +41 -0
package/README.md
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# @opentag/client
|
|
2
|
+
|
|
3
|
+
HTTP client SDK for talking to an OpenTag dispatcher.
|
|
4
|
+
|
|
5
|
+
Use this package from ingress apps, admin setup scripts, local daemons, hosted runners, or tests that need to create, claim, update, or inspect OpenTag runs over the dispatcher API.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
pnpm add @opentag/client
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Exports
|
|
14
|
+
|
|
15
|
+
- `createOpenTagClient`: full dispatcher client for run creation, claiming, progress, completion, and binding management.
|
|
16
|
+
- `createDispatcherClient`: runner-focused compatibility wrapper used by `opentagd`.
|
|
17
|
+
- `createDispatcherAdminClient`: admin-focused compatibility wrapper for runner registration and bindings.
|
|
18
|
+
- `OpenTagClient`, `ClaimedOpenTagRun`, `RepoBindingInput`, `RunProgressInput`: public TypeScript contracts.
|
|
19
|
+
|
|
20
|
+
## Example
|
|
21
|
+
|
|
22
|
+
```ts
|
|
23
|
+
import { createOpenTagClient } from "@opentag/client";
|
|
24
|
+
|
|
25
|
+
const client = createOpenTagClient({
|
|
26
|
+
dispatcherUrl: "https://opentag.example.com",
|
|
27
|
+
pairingToken: process.env.OPENTAG_DISPATCHER_TOKEN
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
await client.createRun({
|
|
31
|
+
runId: `run_${Date.now()}`,
|
|
32
|
+
event
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
const claimed = await client.claim({ runnerId: "runner_local" });
|
|
36
|
+
if (claimed) {
|
|
37
|
+
await client.markRunning({ runId: claimed.run.id, executor: "custom" });
|
|
38
|
+
await client.progress({
|
|
39
|
+
runId: claimed.run.id,
|
|
40
|
+
type: "executor.progress",
|
|
41
|
+
message: "Working on the request",
|
|
42
|
+
at: new Date().toISOString()
|
|
43
|
+
});
|
|
44
|
+
await client.complete({
|
|
45
|
+
runId: claimed.run.id,
|
|
46
|
+
result: { conclusion: "success", summary: "Done" }
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Error Handling
|
|
52
|
+
|
|
53
|
+
Non-2xx dispatcher responses throw `Error` values that include the HTTP status and response body excerpt. Treat these messages as diagnostic text, not a stable machine-readable API.
|
|
54
|
+
|
|
55
|
+
## Stability
|
|
56
|
+
|
|
57
|
+
The method names and input object shapes are public API. New fields should be optional by default. Breaking changes follow the repository versioning policy.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { type OpenTagEvent, type OpenTagRun, type OpenTagRunResult } from "@opentag/core";
|
|
2
|
+
export type ClaimedOpenTagRun = {
|
|
3
|
+
run: OpenTagRun;
|
|
4
|
+
event: OpenTagEvent;
|
|
5
|
+
};
|
|
6
|
+
export type RepoBindingInput = {
|
|
7
|
+
provider: string;
|
|
8
|
+
owner: string;
|
|
9
|
+
repo: string;
|
|
10
|
+
runnerId: string;
|
|
11
|
+
workspacePath?: string;
|
|
12
|
+
defaultExecutor?: string;
|
|
13
|
+
allowedActors?: string[];
|
|
14
|
+
};
|
|
15
|
+
export type RepositoryBindingConfig = {
|
|
16
|
+
provider: string;
|
|
17
|
+
owner: string;
|
|
18
|
+
repo: string;
|
|
19
|
+
checkoutPath: string;
|
|
20
|
+
defaultExecutor?: string;
|
|
21
|
+
baseBranch?: string;
|
|
22
|
+
pushRemote?: string;
|
|
23
|
+
};
|
|
24
|
+
export type SlackChannelBindingInput = {
|
|
25
|
+
teamId: string;
|
|
26
|
+
channelId: string;
|
|
27
|
+
owner: string;
|
|
28
|
+
repo: string;
|
|
29
|
+
};
|
|
30
|
+
export type OpenTagClientOptions = {
|
|
31
|
+
dispatcherUrl: string;
|
|
32
|
+
pairingToken?: string;
|
|
33
|
+
fetchImpl?: typeof fetch;
|
|
34
|
+
};
|
|
35
|
+
export type RunnerClientOptions = OpenTagClientOptions & {
|
|
36
|
+
runnerId: string;
|
|
37
|
+
};
|
|
38
|
+
export type RunProgressInput = {
|
|
39
|
+
type?: string;
|
|
40
|
+
message: string;
|
|
41
|
+
at?: string;
|
|
42
|
+
};
|
|
43
|
+
export type CreateRunInput = {
|
|
44
|
+
runId: string;
|
|
45
|
+
event: OpenTagEvent;
|
|
46
|
+
};
|
|
47
|
+
export type OpenTagClient = {
|
|
48
|
+
registerRunner(input: {
|
|
49
|
+
runnerId: string;
|
|
50
|
+
name?: string;
|
|
51
|
+
}): Promise<void>;
|
|
52
|
+
bindRepository(input: RepoBindingInput): Promise<void>;
|
|
53
|
+
getRepositoryBinding(input: {
|
|
54
|
+
provider: string;
|
|
55
|
+
owner: string;
|
|
56
|
+
repo: string;
|
|
57
|
+
}): Promise<{
|
|
58
|
+
binding: RepoBindingInput;
|
|
59
|
+
}>;
|
|
60
|
+
bindSlackChannel(input: SlackChannelBindingInput): Promise<void>;
|
|
61
|
+
getSlackChannelBinding(input: {
|
|
62
|
+
teamId: string;
|
|
63
|
+
channelId: string;
|
|
64
|
+
}): Promise<{
|
|
65
|
+
binding: SlackChannelBindingInput;
|
|
66
|
+
}>;
|
|
67
|
+
createRun(input: CreateRunInput): Promise<{
|
|
68
|
+
run: OpenTagRun;
|
|
69
|
+
}>;
|
|
70
|
+
claim(input: {
|
|
71
|
+
runnerId: string;
|
|
72
|
+
}): Promise<ClaimedOpenTagRun | null>;
|
|
73
|
+
heartbeat(input: {
|
|
74
|
+
runnerId: string;
|
|
75
|
+
runId: string;
|
|
76
|
+
}): Promise<void>;
|
|
77
|
+
markRunning(input: {
|
|
78
|
+
runId: string;
|
|
79
|
+
executor: string;
|
|
80
|
+
}): Promise<void>;
|
|
81
|
+
progress(input: {
|
|
82
|
+
runId: string;
|
|
83
|
+
} & RunProgressInput): Promise<void>;
|
|
84
|
+
complete(input: {
|
|
85
|
+
runId: string;
|
|
86
|
+
result: OpenTagRunResult;
|
|
87
|
+
}): Promise<void>;
|
|
88
|
+
getRun(input: {
|
|
89
|
+
runId: string;
|
|
90
|
+
}): Promise<ClaimedOpenTagRun>;
|
|
91
|
+
listRunEvents(input: {
|
|
92
|
+
runId: string;
|
|
93
|
+
}): Promise<{
|
|
94
|
+
events: unknown[];
|
|
95
|
+
}>;
|
|
96
|
+
};
|
|
97
|
+
export type DispatcherRunnerClient = {
|
|
98
|
+
claim(): Promise<ClaimedOpenTagRun | null>;
|
|
99
|
+
markRunning(runId: string, executor: string): Promise<void>;
|
|
100
|
+
heartbeat(runId: string): Promise<void>;
|
|
101
|
+
progress(runId: string, input: Required<RunProgressInput>): Promise<void>;
|
|
102
|
+
complete(runId: string, result: OpenTagRunResult): Promise<void>;
|
|
103
|
+
};
|
|
104
|
+
export declare function createOpenTagClient(options: OpenTagClientOptions): OpenTagClient;
|
|
105
|
+
export declare function createDispatcherClient(options: RunnerClientOptions): DispatcherRunnerClient;
|
|
106
|
+
export declare function createDispatcherAdminClient(options: RunnerClientOptions): {
|
|
107
|
+
registerRunner(name?: string): Promise<void>;
|
|
108
|
+
bindRepository(binding: RepositoryBindingConfig): Promise<void>;
|
|
109
|
+
bindSlackChannel(binding: SlackChannelBindingInput): Promise<void>;
|
|
110
|
+
};
|
|
111
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
// src/index.ts
|
|
2
|
+
import {
|
|
3
|
+
OpenTagEventSchema,
|
|
4
|
+
OpenTagRunResultSchema,
|
|
5
|
+
OpenTagRunSchema
|
|
6
|
+
} from "@opentag/core";
|
|
7
|
+
function baseUrlFrom(dispatcherUrl) {
|
|
8
|
+
return dispatcherUrl.replace(/\/$/, "");
|
|
9
|
+
}
|
|
10
|
+
function authHeaders(pairingToken) {
|
|
11
|
+
return pairingToken ? { authorization: `Bearer ${pairingToken}` } : {};
|
|
12
|
+
}
|
|
13
|
+
function jsonHeaders(pairingToken) {
|
|
14
|
+
return { "content-type": "application/json", ...authHeaders(pairingToken) };
|
|
15
|
+
}
|
|
16
|
+
async function assertOk(response, action) {
|
|
17
|
+
if (!response.ok) {
|
|
18
|
+
const text = await response.text();
|
|
19
|
+
throw new Error(`${action} failed: ${response.status}${text ? ` ${text}` : ""}`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function parseClaimedRun(body) {
|
|
23
|
+
return {
|
|
24
|
+
run: OpenTagRunSchema.parse(body.run),
|
|
25
|
+
event: OpenTagEventSchema.parse(body.event)
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function createOpenTagClient(options) {
|
|
29
|
+
const baseUrl = baseUrlFrom(options.dispatcherUrl);
|
|
30
|
+
const fetchImpl = options.fetchImpl ?? fetch;
|
|
31
|
+
return {
|
|
32
|
+
async registerRunner(input) {
|
|
33
|
+
const response = await fetchImpl(`${baseUrl}/v1/runners`, {
|
|
34
|
+
method: "POST",
|
|
35
|
+
headers: jsonHeaders(options.pairingToken),
|
|
36
|
+
body: JSON.stringify({ runnerId: input.runnerId, name: input.name ?? input.runnerId })
|
|
37
|
+
});
|
|
38
|
+
await assertOk(response, "registerRunner");
|
|
39
|
+
},
|
|
40
|
+
async bindRepository(input) {
|
|
41
|
+
const response = await fetchImpl(`${baseUrl}/v1/repo-bindings`, {
|
|
42
|
+
method: "POST",
|
|
43
|
+
headers: jsonHeaders(options.pairingToken),
|
|
44
|
+
body: JSON.stringify(input)
|
|
45
|
+
});
|
|
46
|
+
await assertOk(response, "bindRepository");
|
|
47
|
+
},
|
|
48
|
+
async getRepositoryBinding(input) {
|
|
49
|
+
const response = await fetchImpl(`${baseUrl}/v1/repo-bindings/${input.provider}/${input.owner}/${input.repo}`, {
|
|
50
|
+
headers: authHeaders(options.pairingToken)
|
|
51
|
+
});
|
|
52
|
+
await assertOk(response, "getRepositoryBinding");
|
|
53
|
+
return await response.json();
|
|
54
|
+
},
|
|
55
|
+
async bindSlackChannel(input) {
|
|
56
|
+
const response = await fetchImpl(`${baseUrl}/v1/slack-channel-bindings`, {
|
|
57
|
+
method: "POST",
|
|
58
|
+
headers: jsonHeaders(options.pairingToken),
|
|
59
|
+
body: JSON.stringify(input)
|
|
60
|
+
});
|
|
61
|
+
await assertOk(response, "bindSlackChannel");
|
|
62
|
+
},
|
|
63
|
+
async getSlackChannelBinding(input) {
|
|
64
|
+
const response = await fetchImpl(`${baseUrl}/v1/slack-channel-bindings/${input.teamId}/${input.channelId}`, {
|
|
65
|
+
headers: authHeaders(options.pairingToken)
|
|
66
|
+
});
|
|
67
|
+
await assertOk(response, "getSlackChannelBinding");
|
|
68
|
+
return await response.json();
|
|
69
|
+
},
|
|
70
|
+
async createRun(input) {
|
|
71
|
+
const event = OpenTagEventSchema.parse(input.event);
|
|
72
|
+
const response = await fetchImpl(`${baseUrl}/v1/runs`, {
|
|
73
|
+
method: "POST",
|
|
74
|
+
headers: jsonHeaders(options.pairingToken),
|
|
75
|
+
body: JSON.stringify({ runId: input.runId, event })
|
|
76
|
+
});
|
|
77
|
+
await assertOk(response, "createRun");
|
|
78
|
+
const body = await response.json();
|
|
79
|
+
return { run: OpenTagRunSchema.parse(body.run) };
|
|
80
|
+
},
|
|
81
|
+
async claim(input) {
|
|
82
|
+
const response = await fetchImpl(`${baseUrl}/v1/runners/${input.runnerId}/claim`, {
|
|
83
|
+
method: "POST",
|
|
84
|
+
headers: authHeaders(options.pairingToken)
|
|
85
|
+
});
|
|
86
|
+
if (response.status === 204) return null;
|
|
87
|
+
await assertOk(response, "claim");
|
|
88
|
+
return parseClaimedRun(await response.json());
|
|
89
|
+
},
|
|
90
|
+
async heartbeat(input) {
|
|
91
|
+
const response = await fetchImpl(`${baseUrl}/v1/runners/${input.runnerId}/runs/${input.runId}/heartbeat`, {
|
|
92
|
+
method: "POST",
|
|
93
|
+
headers: authHeaders(options.pairingToken)
|
|
94
|
+
});
|
|
95
|
+
await assertOk(response, "heartbeat");
|
|
96
|
+
},
|
|
97
|
+
async markRunning(input) {
|
|
98
|
+
const response = await fetchImpl(`${baseUrl}/v1/runs/${input.runId}/running`, {
|
|
99
|
+
method: "POST",
|
|
100
|
+
headers: jsonHeaders(options.pairingToken),
|
|
101
|
+
body: JSON.stringify({ executor: input.executor })
|
|
102
|
+
});
|
|
103
|
+
await assertOk(response, "markRunning");
|
|
104
|
+
},
|
|
105
|
+
async progress(input) {
|
|
106
|
+
const response = await fetchImpl(`${baseUrl}/v1/runs/${input.runId}/progress`, {
|
|
107
|
+
method: "POST",
|
|
108
|
+
headers: jsonHeaders(options.pairingToken),
|
|
109
|
+
body: JSON.stringify({
|
|
110
|
+
...input.type ? { type: input.type } : {},
|
|
111
|
+
message: input.message,
|
|
112
|
+
...input.at ? { at: input.at } : {}
|
|
113
|
+
})
|
|
114
|
+
});
|
|
115
|
+
await assertOk(response, "progress");
|
|
116
|
+
},
|
|
117
|
+
async complete(input) {
|
|
118
|
+
const result = OpenTagRunResultSchema.parse(input.result);
|
|
119
|
+
const response = await fetchImpl(`${baseUrl}/v1/runs/${input.runId}/complete`, {
|
|
120
|
+
method: "POST",
|
|
121
|
+
headers: jsonHeaders(options.pairingToken),
|
|
122
|
+
body: JSON.stringify({ result })
|
|
123
|
+
});
|
|
124
|
+
await assertOk(response, "complete");
|
|
125
|
+
},
|
|
126
|
+
async getRun(input) {
|
|
127
|
+
const response = await fetchImpl(`${baseUrl}/v1/runs/${input.runId}`, {
|
|
128
|
+
headers: authHeaders(options.pairingToken)
|
|
129
|
+
});
|
|
130
|
+
await assertOk(response, "getRun");
|
|
131
|
+
return parseClaimedRun(await response.json());
|
|
132
|
+
},
|
|
133
|
+
async listRunEvents(input) {
|
|
134
|
+
const response = await fetchImpl(`${baseUrl}/v1/runs/${input.runId}/events`, {
|
|
135
|
+
headers: authHeaders(options.pairingToken)
|
|
136
|
+
});
|
|
137
|
+
await assertOk(response, "listRunEvents");
|
|
138
|
+
return await response.json();
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
function createDispatcherClient(options) {
|
|
143
|
+
const client = createOpenTagClient(options);
|
|
144
|
+
return {
|
|
145
|
+
claim: () => client.claim({ runnerId: options.runnerId }),
|
|
146
|
+
markRunning: (runId, executor) => client.markRunning({ runId, executor }),
|
|
147
|
+
heartbeat: (runId) => client.heartbeat({ runnerId: options.runnerId, runId }),
|
|
148
|
+
progress: (runId, input) => client.progress({ runId, ...input }),
|
|
149
|
+
complete: (runId, result) => client.complete({ runId, result })
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
function createDispatcherAdminClient(options) {
|
|
153
|
+
const client = createOpenTagClient(options);
|
|
154
|
+
return {
|
|
155
|
+
registerRunner(name = options.runnerId) {
|
|
156
|
+
return client.registerRunner({ runnerId: options.runnerId, name });
|
|
157
|
+
},
|
|
158
|
+
bindRepository(binding) {
|
|
159
|
+
return client.bindRepository({
|
|
160
|
+
provider: binding.provider,
|
|
161
|
+
owner: binding.owner,
|
|
162
|
+
repo: binding.repo,
|
|
163
|
+
runnerId: options.runnerId,
|
|
164
|
+
workspacePath: binding.checkoutPath,
|
|
165
|
+
...binding.defaultExecutor ? { defaultExecutor: binding.defaultExecutor } : {}
|
|
166
|
+
});
|
|
167
|
+
},
|
|
168
|
+
bindSlackChannel(binding) {
|
|
169
|
+
return client.bindSlackChannel(binding);
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
export {
|
|
174
|
+
createDispatcherAdminClient,
|
|
175
|
+
createDispatcherClient,
|
|
176
|
+
createOpenTagClient
|
|
177
|
+
};
|
|
178
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n OpenTagEventSchema,\n OpenTagRunResultSchema,\n OpenTagRunSchema,\n type OpenTagEvent,\n type OpenTagRun,\n type OpenTagRunResult\n} from \"@opentag/core\";\n\nexport type ClaimedOpenTagRun = {\n run: OpenTagRun;\n event: OpenTagEvent;\n};\n\nexport type RepoBindingInput = {\n provider: string;\n owner: string;\n repo: string;\n runnerId: string;\n workspacePath?: string;\n defaultExecutor?: string;\n allowedActors?: string[];\n};\n\nexport type RepositoryBindingConfig = {\n provider: string;\n owner: string;\n repo: string;\n checkoutPath: string;\n defaultExecutor?: string;\n baseBranch?: string;\n pushRemote?: string;\n};\n\nexport type SlackChannelBindingInput = {\n teamId: string;\n channelId: string;\n owner: string;\n repo: string;\n};\n\nexport type OpenTagClientOptions = {\n dispatcherUrl: string;\n pairingToken?: string;\n fetchImpl?: typeof fetch;\n};\n\nexport type RunnerClientOptions = OpenTagClientOptions & {\n runnerId: string;\n};\n\nexport type RunProgressInput = {\n type?: string;\n message: string;\n at?: string;\n};\n\nexport type CreateRunInput = {\n runId: string;\n event: OpenTagEvent;\n};\n\nexport type OpenTagClient = {\n registerRunner(input: { runnerId: string; name?: string }): Promise<void>;\n bindRepository(input: RepoBindingInput): Promise<void>;\n getRepositoryBinding(input: { provider: string; owner: string; repo: string }): Promise<{ binding: RepoBindingInput }>;\n bindSlackChannel(input: SlackChannelBindingInput): Promise<void>;\n getSlackChannelBinding(input: { teamId: string; channelId: string }): Promise<{ binding: SlackChannelBindingInput }>;\n createRun(input: CreateRunInput): Promise<{ run: OpenTagRun }>;\n claim(input: { runnerId: string }): Promise<ClaimedOpenTagRun | null>;\n heartbeat(input: { runnerId: string; runId: string }): Promise<void>;\n markRunning(input: { runId: string; executor: string }): Promise<void>;\n progress(input: { runId: string } & RunProgressInput): Promise<void>;\n complete(input: { runId: string; result: OpenTagRunResult }): Promise<void>;\n getRun(input: { runId: string }): Promise<ClaimedOpenTagRun>;\n listRunEvents(input: { runId: string }): Promise<{ events: unknown[] }>;\n};\n\nexport type DispatcherRunnerClient = {\n claim(): Promise<ClaimedOpenTagRun | null>;\n markRunning(runId: string, executor: string): Promise<void>;\n heartbeat(runId: string): Promise<void>;\n progress(runId: string, input: Required<RunProgressInput>): Promise<void>;\n complete(runId: string, result: OpenTagRunResult): Promise<void>;\n};\n\nfunction baseUrlFrom(dispatcherUrl: string): string {\n return dispatcherUrl.replace(/\\/$/, \"\");\n}\n\nfunction authHeaders(pairingToken: string | undefined): Record<string, string> {\n return pairingToken ? { authorization: `Bearer ${pairingToken}` } : {};\n}\n\nfunction jsonHeaders(pairingToken: string | undefined): Record<string, string> {\n return { \"content-type\": \"application/json\", ...authHeaders(pairingToken) };\n}\n\nasync function assertOk(response: Response, action: string): Promise<void> {\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`${action} failed: ${response.status}${text ? ` ${text}` : \"\"}`);\n }\n}\n\nfunction parseClaimedRun(body: { run: unknown; event: unknown }): ClaimedOpenTagRun {\n return {\n run: OpenTagRunSchema.parse(body.run),\n event: OpenTagEventSchema.parse(body.event)\n };\n}\n\nexport function createOpenTagClient(options: OpenTagClientOptions): OpenTagClient {\n const baseUrl = baseUrlFrom(options.dispatcherUrl);\n const fetchImpl = options.fetchImpl ?? fetch;\n\n return {\n async registerRunner(input) {\n const response = await fetchImpl(`${baseUrl}/v1/runners`, {\n method: \"POST\",\n headers: jsonHeaders(options.pairingToken),\n body: JSON.stringify({ runnerId: input.runnerId, name: input.name ?? input.runnerId })\n });\n await assertOk(response, \"registerRunner\");\n },\n\n async bindRepository(input) {\n const response = await fetchImpl(`${baseUrl}/v1/repo-bindings`, {\n method: \"POST\",\n headers: jsonHeaders(options.pairingToken),\n body: JSON.stringify(input)\n });\n await assertOk(response, \"bindRepository\");\n },\n\n async getRepositoryBinding(input) {\n const response = await fetchImpl(`${baseUrl}/v1/repo-bindings/${input.provider}/${input.owner}/${input.repo}`, {\n headers: authHeaders(options.pairingToken)\n });\n await assertOk(response, \"getRepositoryBinding\");\n return (await response.json()) as { binding: RepoBindingInput };\n },\n\n async bindSlackChannel(input) {\n const response = await fetchImpl(`${baseUrl}/v1/slack-channel-bindings`, {\n method: \"POST\",\n headers: jsonHeaders(options.pairingToken),\n body: JSON.stringify(input)\n });\n await assertOk(response, \"bindSlackChannel\");\n },\n\n async getSlackChannelBinding(input) {\n const response = await fetchImpl(`${baseUrl}/v1/slack-channel-bindings/${input.teamId}/${input.channelId}`, {\n headers: authHeaders(options.pairingToken)\n });\n await assertOk(response, \"getSlackChannelBinding\");\n return (await response.json()) as { binding: SlackChannelBindingInput };\n },\n\n async createRun(input) {\n const event = OpenTagEventSchema.parse(input.event);\n const response = await fetchImpl(`${baseUrl}/v1/runs`, {\n method: \"POST\",\n headers: jsonHeaders(options.pairingToken),\n body: JSON.stringify({ runId: input.runId, event })\n });\n await assertOk(response, \"createRun\");\n const body = (await response.json()) as { run: unknown };\n return { run: OpenTagRunSchema.parse(body.run) };\n },\n\n async claim(input) {\n const response = await fetchImpl(`${baseUrl}/v1/runners/${input.runnerId}/claim`, {\n method: \"POST\",\n headers: authHeaders(options.pairingToken)\n });\n if (response.status === 204) return null;\n await assertOk(response, \"claim\");\n return parseClaimedRun((await response.json()) as { run: unknown; event: unknown });\n },\n\n async heartbeat(input) {\n const response = await fetchImpl(`${baseUrl}/v1/runners/${input.runnerId}/runs/${input.runId}/heartbeat`, {\n method: \"POST\",\n headers: authHeaders(options.pairingToken)\n });\n await assertOk(response, \"heartbeat\");\n },\n\n async markRunning(input) {\n const response = await fetchImpl(`${baseUrl}/v1/runs/${input.runId}/running`, {\n method: \"POST\",\n headers: jsonHeaders(options.pairingToken),\n body: JSON.stringify({ executor: input.executor })\n });\n await assertOk(response, \"markRunning\");\n },\n\n async progress(input) {\n const response = await fetchImpl(`${baseUrl}/v1/runs/${input.runId}/progress`, {\n method: \"POST\",\n headers: jsonHeaders(options.pairingToken),\n body: JSON.stringify({\n ...(input.type ? { type: input.type } : {}),\n message: input.message,\n ...(input.at ? { at: input.at } : {})\n })\n });\n await assertOk(response, \"progress\");\n },\n\n async complete(input) {\n const result = OpenTagRunResultSchema.parse(input.result);\n const response = await fetchImpl(`${baseUrl}/v1/runs/${input.runId}/complete`, {\n method: \"POST\",\n headers: jsonHeaders(options.pairingToken),\n body: JSON.stringify({ result })\n });\n await assertOk(response, \"complete\");\n },\n\n async getRun(input) {\n const response = await fetchImpl(`${baseUrl}/v1/runs/${input.runId}`, {\n headers: authHeaders(options.pairingToken)\n });\n await assertOk(response, \"getRun\");\n return parseClaimedRun((await response.json()) as { run: unknown; event: unknown });\n },\n\n async listRunEvents(input) {\n const response = await fetchImpl(`${baseUrl}/v1/runs/${input.runId}/events`, {\n headers: authHeaders(options.pairingToken)\n });\n await assertOk(response, \"listRunEvents\");\n return (await response.json()) as { events: unknown[] };\n }\n };\n}\n\nexport function createDispatcherClient(options: RunnerClientOptions): DispatcherRunnerClient {\n const client = createOpenTagClient(options);\n return {\n claim: () => client.claim({ runnerId: options.runnerId }),\n markRunning: (runId, executor) => client.markRunning({ runId, executor }),\n heartbeat: (runId) => client.heartbeat({ runnerId: options.runnerId, runId }),\n progress: (runId, input) => client.progress({ runId, ...input }),\n complete: (runId, result) => client.complete({ runId, result })\n };\n}\n\nexport function createDispatcherAdminClient(options: RunnerClientOptions) {\n const client = createOpenTagClient(options);\n return {\n registerRunner(name = options.runnerId): Promise<void> {\n return client.registerRunner({ runnerId: options.runnerId, name });\n },\n\n bindRepository(binding: RepositoryBindingConfig): Promise<void> {\n return client.bindRepository({\n provider: binding.provider,\n owner: binding.owner,\n repo: binding.repo,\n runnerId: options.runnerId,\n workspacePath: binding.checkoutPath,\n ...(binding.defaultExecutor ? { defaultExecutor: binding.defaultExecutor } : {})\n });\n },\n\n bindSlackChannel(binding: SlackChannelBindingInput): Promise<void> {\n return client.bindSlackChannel(binding);\n }\n };\n}\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AA+EP,SAAS,YAAY,eAA+B;AAClD,SAAO,cAAc,QAAQ,OAAO,EAAE;AACxC;AAEA,SAAS,YAAY,cAA0D;AAC7E,SAAO,eAAe,EAAE,eAAe,UAAU,YAAY,GAAG,IAAI,CAAC;AACvE;AAEA,SAAS,YAAY,cAA0D;AAC7E,SAAO,EAAE,gBAAgB,oBAAoB,GAAG,YAAY,YAAY,EAAE;AAC5E;AAEA,eAAe,SAAS,UAAoB,QAA+B;AACzE,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,UAAM,IAAI,MAAM,GAAG,MAAM,YAAY,SAAS,MAAM,GAAG,OAAO,IAAI,IAAI,KAAK,EAAE,EAAE;AAAA,EACjF;AACF;AAEA,SAAS,gBAAgB,MAA2D;AAClF,SAAO;AAAA,IACL,KAAK,iBAAiB,MAAM,KAAK,GAAG;AAAA,IACpC,OAAO,mBAAmB,MAAM,KAAK,KAAK;AAAA,EAC5C;AACF;AAEO,SAAS,oBAAoB,SAA8C;AAChF,QAAM,UAAU,YAAY,QAAQ,aAAa;AACjD,QAAM,YAAY,QAAQ,aAAa;AAEvC,SAAO;AAAA,IACL,MAAM,eAAe,OAAO;AAC1B,YAAM,WAAW,MAAM,UAAU,GAAG,OAAO,eAAe;AAAA,QACxD,QAAQ;AAAA,QACR,SAAS,YAAY,QAAQ,YAAY;AAAA,QACzC,MAAM,KAAK,UAAU,EAAE,UAAU,MAAM,UAAU,MAAM,MAAM,QAAQ,MAAM,SAAS,CAAC;AAAA,MACvF,CAAC;AACD,YAAM,SAAS,UAAU,gBAAgB;AAAA,IAC3C;AAAA,IAEA,MAAM,eAAe,OAAO;AAC1B,YAAM,WAAW,MAAM,UAAU,GAAG,OAAO,qBAAqB;AAAA,QAC9D,QAAQ;AAAA,QACR,SAAS,YAAY,QAAQ,YAAY;AAAA,QACzC,MAAM,KAAK,UAAU,KAAK;AAAA,MAC5B,CAAC;AACD,YAAM,SAAS,UAAU,gBAAgB;AAAA,IAC3C;AAAA,IAEA,MAAM,qBAAqB,OAAO;AAChC,YAAM,WAAW,MAAM,UAAU,GAAG,OAAO,qBAAqB,MAAM,QAAQ,IAAI,MAAM,KAAK,IAAI,MAAM,IAAI,IAAI;AAAA,QAC7G,SAAS,YAAY,QAAQ,YAAY;AAAA,MAC3C,CAAC;AACD,YAAM,SAAS,UAAU,sBAAsB;AAC/C,aAAQ,MAAM,SAAS,KAAK;AAAA,IAC9B;AAAA,IAEA,MAAM,iBAAiB,OAAO;AAC5B,YAAM,WAAW,MAAM,UAAU,GAAG,OAAO,8BAA8B;AAAA,QACvE,QAAQ;AAAA,QACR,SAAS,YAAY,QAAQ,YAAY;AAAA,QACzC,MAAM,KAAK,UAAU,KAAK;AAAA,MAC5B,CAAC;AACD,YAAM,SAAS,UAAU,kBAAkB;AAAA,IAC7C;AAAA,IAEA,MAAM,uBAAuB,OAAO;AAClC,YAAM,WAAW,MAAM,UAAU,GAAG,OAAO,8BAA8B,MAAM,MAAM,IAAI,MAAM,SAAS,IAAI;AAAA,QAC1G,SAAS,YAAY,QAAQ,YAAY;AAAA,MAC3C,CAAC;AACD,YAAM,SAAS,UAAU,wBAAwB;AACjD,aAAQ,MAAM,SAAS,KAAK;AAAA,IAC9B;AAAA,IAEA,MAAM,UAAU,OAAO;AACrB,YAAM,QAAQ,mBAAmB,MAAM,MAAM,KAAK;AAClD,YAAM,WAAW,MAAM,UAAU,GAAG,OAAO,YAAY;AAAA,QACrD,QAAQ;AAAA,QACR,SAAS,YAAY,QAAQ,YAAY;AAAA,QACzC,MAAM,KAAK,UAAU,EAAE,OAAO,MAAM,OAAO,MAAM,CAAC;AAAA,MACpD,CAAC;AACD,YAAM,SAAS,UAAU,WAAW;AACpC,YAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,aAAO,EAAE,KAAK,iBAAiB,MAAM,KAAK,GAAG,EAAE;AAAA,IACjD;AAAA,IAEA,MAAM,MAAM,OAAO;AACjB,YAAM,WAAW,MAAM,UAAU,GAAG,OAAO,eAAe,MAAM,QAAQ,UAAU;AAAA,QAChF,QAAQ;AAAA,QACR,SAAS,YAAY,QAAQ,YAAY;AAAA,MAC3C,CAAC;AACD,UAAI,SAAS,WAAW,IAAK,QAAO;AACpC,YAAM,SAAS,UAAU,OAAO;AAChC,aAAO,gBAAiB,MAAM,SAAS,KAAK,CAAsC;AAAA,IACpF;AAAA,IAEA,MAAM,UAAU,OAAO;AACrB,YAAM,WAAW,MAAM,UAAU,GAAG,OAAO,eAAe,MAAM,QAAQ,SAAS,MAAM,KAAK,cAAc;AAAA,QACxG,QAAQ;AAAA,QACR,SAAS,YAAY,QAAQ,YAAY;AAAA,MAC3C,CAAC;AACD,YAAM,SAAS,UAAU,WAAW;AAAA,IACtC;AAAA,IAEA,MAAM,YAAY,OAAO;AACvB,YAAM,WAAW,MAAM,UAAU,GAAG,OAAO,YAAY,MAAM,KAAK,YAAY;AAAA,QAC5E,QAAQ;AAAA,QACR,SAAS,YAAY,QAAQ,YAAY;AAAA,QACzC,MAAM,KAAK,UAAU,EAAE,UAAU,MAAM,SAAS,CAAC;AAAA,MACnD,CAAC;AACD,YAAM,SAAS,UAAU,aAAa;AAAA,IACxC;AAAA,IAEA,MAAM,SAAS,OAAO;AACpB,YAAM,WAAW,MAAM,UAAU,GAAG,OAAO,YAAY,MAAM,KAAK,aAAa;AAAA,QAC7E,QAAQ;AAAA,QACR,SAAS,YAAY,QAAQ,YAAY;AAAA,QACzC,MAAM,KAAK,UAAU;AAAA,UACnB,GAAI,MAAM,OAAO,EAAE,MAAM,MAAM,KAAK,IAAI,CAAC;AAAA,UACzC,SAAS,MAAM;AAAA,UACf,GAAI,MAAM,KAAK,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC;AAAA,QACrC,CAAC;AAAA,MACH,CAAC;AACD,YAAM,SAAS,UAAU,UAAU;AAAA,IACrC;AAAA,IAEA,MAAM,SAAS,OAAO;AACpB,YAAM,SAAS,uBAAuB,MAAM,MAAM,MAAM;AACxD,YAAM,WAAW,MAAM,UAAU,GAAG,OAAO,YAAY,MAAM,KAAK,aAAa;AAAA,QAC7E,QAAQ;AAAA,QACR,SAAS,YAAY,QAAQ,YAAY;AAAA,QACzC,MAAM,KAAK,UAAU,EAAE,OAAO,CAAC;AAAA,MACjC,CAAC;AACD,YAAM,SAAS,UAAU,UAAU;AAAA,IACrC;AAAA,IAEA,MAAM,OAAO,OAAO;AAClB,YAAM,WAAW,MAAM,UAAU,GAAG,OAAO,YAAY,MAAM,KAAK,IAAI;AAAA,QACpE,SAAS,YAAY,QAAQ,YAAY;AAAA,MAC3C,CAAC;AACD,YAAM,SAAS,UAAU,QAAQ;AACjC,aAAO,gBAAiB,MAAM,SAAS,KAAK,CAAsC;AAAA,IACpF;AAAA,IAEA,MAAM,cAAc,OAAO;AACzB,YAAM,WAAW,MAAM,UAAU,GAAG,OAAO,YAAY,MAAM,KAAK,WAAW;AAAA,QAC3E,SAAS,YAAY,QAAQ,YAAY;AAAA,MAC3C,CAAC;AACD,YAAM,SAAS,UAAU,eAAe;AACxC,aAAQ,MAAM,SAAS,KAAK;AAAA,IAC9B;AAAA,EACF;AACF;AAEO,SAAS,uBAAuB,SAAsD;AAC3F,QAAM,SAAS,oBAAoB,OAAO;AAC1C,SAAO;AAAA,IACL,OAAO,MAAM,OAAO,MAAM,EAAE,UAAU,QAAQ,SAAS,CAAC;AAAA,IACxD,aAAa,CAAC,OAAO,aAAa,OAAO,YAAY,EAAE,OAAO,SAAS,CAAC;AAAA,IACxE,WAAW,CAAC,UAAU,OAAO,UAAU,EAAE,UAAU,QAAQ,UAAU,MAAM,CAAC;AAAA,IAC5E,UAAU,CAAC,OAAO,UAAU,OAAO,SAAS,EAAE,OAAO,GAAG,MAAM,CAAC;AAAA,IAC/D,UAAU,CAAC,OAAO,WAAW,OAAO,SAAS,EAAE,OAAO,OAAO,CAAC;AAAA,EAChE;AACF;AAEO,SAAS,4BAA4B,SAA8B;AACxE,QAAM,SAAS,oBAAoB,OAAO;AAC1C,SAAO;AAAA,IACL,eAAe,OAAO,QAAQ,UAAyB;AACrD,aAAO,OAAO,eAAe,EAAE,UAAU,QAAQ,UAAU,KAAK,CAAC;AAAA,IACnE;AAAA,IAEA,eAAe,SAAiD;AAC9D,aAAO,OAAO,eAAe;AAAA,QAC3B,UAAU,QAAQ;AAAA,QAClB,OAAO,QAAQ;AAAA,QACf,MAAM,QAAQ;AAAA,QACd,UAAU,QAAQ;AAAA,QAClB,eAAe,QAAQ;AAAA,QACvB,GAAI,QAAQ,kBAAkB,EAAE,iBAAiB,QAAQ,gBAAgB,IAAI,CAAC;AAAA,MAChF,CAAC;AAAA,IACH;AAAA,IAEA,iBAAiB,SAAkD;AACjE,aAAO,OAAO,iBAAiB,OAAO;AAAA,IACxC;AAAA,EACF;AACF;","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@opentag/client",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "HTTP client SDK for creating, claiming, and updating OpenTag dispatcher runs.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"development": "./src/index.ts",
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"README.md"
|
|
18
|
+
],
|
|
19
|
+
"publishConfig": {
|
|
20
|
+
"access": "public"
|
|
21
|
+
},
|
|
22
|
+
"keywords": [
|
|
23
|
+
"opentag",
|
|
24
|
+
"sdk",
|
|
25
|
+
"client",
|
|
26
|
+
"dispatcher",
|
|
27
|
+
"agents"
|
|
28
|
+
],
|
|
29
|
+
"license": "Apache-2.0",
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@opentag/core": "0.1.0"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"tsup": "^8.3.5",
|
|
35
|
+
"typescript": "^5.7.2"
|
|
36
|
+
},
|
|
37
|
+
"scripts": {
|
|
38
|
+
"build": "tsup && tsc -b tsconfig.json --emitDeclarationOnly --force",
|
|
39
|
+
"lint": "tsc --noEmit"
|
|
40
|
+
}
|
|
41
|
+
}
|