agent-relay-sdk 0.1.0 → 0.2.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/dist/bus-client.d.ts +45 -2
- package/dist/bus-client.d.ts.map +1 -1
- package/dist/bus-client.js +157 -3
- package/dist/bus-client.js.map +1 -1
- package/dist/claim-tracker.d.ts +19 -0
- package/dist/claim-tracker.d.ts.map +1 -0
- package/dist/claim-tracker.js +26 -0
- package/dist/claim-tracker.js.map +1 -0
- package/dist/context-probe.d.ts +43 -0
- package/dist/context-probe.d.ts.map +1 -0
- package/dist/context-probe.js +210 -0
- package/dist/context-probe.js.map +1 -0
- package/dist/contracts.d.ts +27 -0
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js +34 -0
- package/dist/contracts.js.map +1 -0
- package/dist/http-client.d.ts +66 -5
- package/dist/http-client.d.ts.map +1 -1
- package/dist/http-client.js +148 -9
- package/dist/http-client.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/protocol.d.ts +9 -1
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js.map +1 -1
- package/dist/provider-catalog.d.ts +80 -0
- package/dist/provider-catalog.d.ts.map +1 -0
- package/dist/provider-catalog.js +84 -0
- package/dist/provider-catalog.js.map +1 -0
- package/dist/types.d.ts +921 -4
- package/dist/types.d.ts.map +1 -1
- package/package.json +17 -1
- package/src/bus-client.ts +176 -4
- package/src/claim-tracker.ts +40 -0
- package/src/context-probe.ts +257 -0
- package/src/contracts.ts +47 -0
- package/src/http-client.ts +166 -11
- package/src/index.ts +4 -0
- package/src/protocol.ts +10 -0
- package/src/provider-catalog.ts +174 -0
- package/src/types.ts +1035 -8
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { basename, dirname, join } from "node:path";
|
|
4
|
+
import { spawnSync } from "node:child_process";
|
|
5
|
+
export const DEFAULT_CONTEXT_PROBE_STATE_DIR = tmpdir();
|
|
6
|
+
export const DEFAULT_CONTEXT_PROBE_PATTERNS = [
|
|
7
|
+
{
|
|
8
|
+
name: "percent",
|
|
9
|
+
regex: /(\d+(?:\.\d+)?)%\s*(?:context|ctx)?/i,
|
|
10
|
+
extract: (match) => ({ contextPercent: Number(match[1]) }),
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
name: "token-count",
|
|
14
|
+
regex: /(\d[\d,]*)\s*\/\s*(\d[\d,]*)\s*(?:tokens?|tok)/i,
|
|
15
|
+
extract: (match) => ({
|
|
16
|
+
tokensUsed: parseInt(String(match[1]).replace(/,/g, ""), 10),
|
|
17
|
+
tokensMax: parseInt(String(match[2]).replace(/,/g, ""), 10),
|
|
18
|
+
}),
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
name: "quota",
|
|
22
|
+
regex: /quota[:\s]+(\d+(?:\.\d+)?)\s*%/i,
|
|
23
|
+
extract: (match) => ({ quotaUsed: Number(match[1]) }),
|
|
24
|
+
},
|
|
25
|
+
];
|
|
26
|
+
export function contextProbeStatePath(agentId, stateDir = DEFAULT_CONTEXT_PROBE_STATE_DIR) {
|
|
27
|
+
return join(stateDir, `agent-relay-context-${safeStateId(agentId)}.json`);
|
|
28
|
+
}
|
|
29
|
+
export function parseContextProbeMetrics(input, options = {}) {
|
|
30
|
+
const timestamp = options.now ?? Date.now();
|
|
31
|
+
const fromJson = parseClaudeStatusLineInput(input, options.agentId, timestamp, options.env);
|
|
32
|
+
if (fromJson)
|
|
33
|
+
return fromJson;
|
|
34
|
+
const partial = {};
|
|
35
|
+
for (const pattern of options.parsePatterns ?? DEFAULT_CONTEXT_PROBE_PATTERNS) {
|
|
36
|
+
const match = input.match(pattern.regex);
|
|
37
|
+
if (match)
|
|
38
|
+
Object.assign(partial, pattern.extract(match));
|
|
39
|
+
}
|
|
40
|
+
if (partial.contextPercent === undefined && partial.tokensUsed !== undefined && partial.tokensMax) {
|
|
41
|
+
partial.contextPercent = (partial.tokensUsed / partial.tokensMax) * 100;
|
|
42
|
+
}
|
|
43
|
+
if (partial.contextPercent === undefined)
|
|
44
|
+
return null;
|
|
45
|
+
return normalizeMetrics({
|
|
46
|
+
agentId: options.agentId || envAgentId(options.env) || "unknown",
|
|
47
|
+
contextPercent: partial.contextPercent,
|
|
48
|
+
tokensUsed: partial.tokensUsed,
|
|
49
|
+
tokensMax: partial.tokensMax,
|
|
50
|
+
quotaUsed: partial.quotaUsed,
|
|
51
|
+
quotaLimit: partial.quotaLimit,
|
|
52
|
+
quotaResetIn: partial.quotaResetIn,
|
|
53
|
+
source: partial.source ?? "statusline",
|
|
54
|
+
confidence: partial.confidence ?? "estimated",
|
|
55
|
+
timestamp,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
export function contextStateFromProbeMetrics(metrics) {
|
|
59
|
+
return {
|
|
60
|
+
utilization: Math.max(0, Math.min(1, metrics.contextPercent / 100)),
|
|
61
|
+
...(metrics.tokensUsed !== undefined ? { tokensUsed: metrics.tokensUsed } : {}),
|
|
62
|
+
...(metrics.tokensMax !== undefined ? { tokensMax: metrics.tokensMax } : {}),
|
|
63
|
+
lifecycleState: "working",
|
|
64
|
+
warmTopics: [],
|
|
65
|
+
activeMemories: [],
|
|
66
|
+
tasksSinceCompact: 0,
|
|
67
|
+
lastUpdatedAt: metrics.timestamp,
|
|
68
|
+
source: metrics.source,
|
|
69
|
+
confidence: metrics.confidence,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
export function writeContextProbeState(metrics, stateDir = DEFAULT_CONTEXT_PROBE_STATE_DIR) {
|
|
73
|
+
const file = contextProbeStatePath(metrics.agentId, stateDir);
|
|
74
|
+
mkdirSync(dirname(file), { recursive: true });
|
|
75
|
+
const tmp = `${file}.${process.pid}.tmp`;
|
|
76
|
+
writeFileSync(tmp, JSON.stringify(metrics, null, 2));
|
|
77
|
+
renameSync(tmp, file);
|
|
78
|
+
return file;
|
|
79
|
+
}
|
|
80
|
+
export function readContextProbeState(agentId, stateDir = DEFAULT_CONTEXT_PROBE_STATE_DIR) {
|
|
81
|
+
try {
|
|
82
|
+
const parsed = JSON.parse(readFileSync(contextProbeStatePath(agentId, stateDir), "utf8"));
|
|
83
|
+
return isContextProbeMetrics(parsed) ? parsed : null;
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
export function runContextProbe(input, options = {}) {
|
|
90
|
+
let wrappedExitCode;
|
|
91
|
+
let wrappedStdout = "";
|
|
92
|
+
let wrappedStderr = "";
|
|
93
|
+
if (options.wrapCommand) {
|
|
94
|
+
const result = spawnSync(options.wrapCommand, {
|
|
95
|
+
input,
|
|
96
|
+
shell: true,
|
|
97
|
+
encoding: "utf8",
|
|
98
|
+
env: { ...process.env, ...(options.env ?? {}) },
|
|
99
|
+
});
|
|
100
|
+
wrappedExitCode = typeof result.status === "number" ? result.status : result.error ? 1 : 0;
|
|
101
|
+
wrappedStdout = result.stdout ?? "";
|
|
102
|
+
wrappedStderr = result.stderr ?? "";
|
|
103
|
+
}
|
|
104
|
+
const metrics = parseContextProbeMetrics(input, options) ??
|
|
105
|
+
(wrappedStdout ? parseContextProbeMetrics(wrappedStdout, { ...options, now: options.now }) : null);
|
|
106
|
+
const stateFile = metrics ? writeContextProbeState(metrics, options.stateDir) : undefined;
|
|
107
|
+
const output = options.wrapCommand ? wrappedStdout : standaloneOutput(metrics);
|
|
108
|
+
return { metrics, stateFile, wrappedExitCode, wrappedStdout, wrappedStderr, output };
|
|
109
|
+
}
|
|
110
|
+
function parseClaudeStatusLineInput(input, explicitAgentId, timestamp, env) {
|
|
111
|
+
let data;
|
|
112
|
+
try {
|
|
113
|
+
data = JSON.parse(input);
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
if (!isRecord(data))
|
|
119
|
+
return null;
|
|
120
|
+
const context = isRecord(data.context_window) ? data.context_window : undefined;
|
|
121
|
+
if (!context)
|
|
122
|
+
return null;
|
|
123
|
+
const contextPercent = numberValue(context.used_percentage);
|
|
124
|
+
const tokensMax = numberValue(context.context_window_size);
|
|
125
|
+
const usage = isRecord(context.current_usage) ? context.current_usage : undefined;
|
|
126
|
+
const tokensUsed = sumNumbers(usage?.input_tokens, usage?.cache_creation_input_tokens, usage?.cache_read_input_tokens);
|
|
127
|
+
if (contextPercent === undefined && tokensUsed === undefined)
|
|
128
|
+
return null;
|
|
129
|
+
const rateLimits = isRecord(data.rate_limits) ? data.rate_limits : undefined;
|
|
130
|
+
const fiveHour = isRecord(rateLimits?.five_hour) ? rateLimits.five_hour : undefined;
|
|
131
|
+
const model = stringValue(data.model) ?? envString(env, "CLAUDE_MODEL");
|
|
132
|
+
const effort = isRecord(data.effort) ? stringValue(data.effort.level) : stringValue(data.effort);
|
|
133
|
+
const resolvedEffort = effort ?? envString(env, "CLAUDE_EFFORT") ?? envString(env, "CLAUDE_CODE_EFFORT_LEVEL");
|
|
134
|
+
return normalizeMetrics({
|
|
135
|
+
agentId: explicitAgentId || envAgentId(env) || stringValue(data.session_id) || "unknown",
|
|
136
|
+
contextPercent: contextPercent ?? ((tokensUsed ?? 0) / (tokensMax || 1)) * 100,
|
|
137
|
+
tokensUsed,
|
|
138
|
+
tokensMax,
|
|
139
|
+
quotaUsed: numberValue(fiveHour?.used_percentage),
|
|
140
|
+
quotaResetIn: secondsUntil(numberValue(fiveHour?.resets_at), timestamp),
|
|
141
|
+
...(model ? { model } : {}),
|
|
142
|
+
...(resolvedEffort ? { effort: resolvedEffort } : {}),
|
|
143
|
+
source: "statusline",
|
|
144
|
+
confidence: "exact",
|
|
145
|
+
timestamp,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
function normalizeMetrics(metrics) {
|
|
149
|
+
return {
|
|
150
|
+
...metrics,
|
|
151
|
+
contextPercent: Math.max(0, Math.min(100, metrics.contextPercent)),
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
function standaloneOutput(metrics) {
|
|
155
|
+
if (!metrics)
|
|
156
|
+
return "agent-relay context: unavailable";
|
|
157
|
+
const pct = Math.round(metrics.contextPercent);
|
|
158
|
+
const tokens = metrics.tokensUsed && metrics.tokensMax ? ` ${formatTokens(metrics.tokensUsed)}/${formatTokens(metrics.tokensMax)}` : "";
|
|
159
|
+
return `agent-relay context: ${pct}%${tokens}`;
|
|
160
|
+
}
|
|
161
|
+
function formatTokens(tokens) {
|
|
162
|
+
if (tokens >= 1_000_000)
|
|
163
|
+
return `${(tokens / 1_000_000).toFixed(1)}M`;
|
|
164
|
+
if (tokens >= 1_000)
|
|
165
|
+
return `${Math.round(tokens / 1_000)}K`;
|
|
166
|
+
return String(tokens);
|
|
167
|
+
}
|
|
168
|
+
function safeStateId(agentId) {
|
|
169
|
+
return basename(agentId).replace(/[^a-zA-Z0-9._-]/g, "-") || "unknown";
|
|
170
|
+
}
|
|
171
|
+
function envAgentId(env) {
|
|
172
|
+
if (env !== undefined)
|
|
173
|
+
return stringValue(env.AGENT_RELAY_AGENT_ID) ?? stringValue(env.AGENT_RELAY_ID);
|
|
174
|
+
return stringValue(process.env.AGENT_RELAY_AGENT_ID) ?? stringValue(process.env.AGENT_RELAY_ID);
|
|
175
|
+
}
|
|
176
|
+
function envString(env, key) {
|
|
177
|
+
if (env !== undefined)
|
|
178
|
+
return stringValue(env[key]);
|
|
179
|
+
return stringValue(process.env[key]);
|
|
180
|
+
}
|
|
181
|
+
function numberValue(value) {
|
|
182
|
+
return typeof value === "number" && Number.isFinite(value) ? value : undefined;
|
|
183
|
+
}
|
|
184
|
+
function stringValue(value) {
|
|
185
|
+
return typeof value === "string" && value ? value : undefined;
|
|
186
|
+
}
|
|
187
|
+
function sumNumbers(...values) {
|
|
188
|
+
let total = 0;
|
|
189
|
+
let seen = false;
|
|
190
|
+
for (const value of values) {
|
|
191
|
+
if (typeof value === "number" && Number.isFinite(value)) {
|
|
192
|
+
total += value;
|
|
193
|
+
seen = true;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return seen ? total : undefined;
|
|
197
|
+
}
|
|
198
|
+
function secondsUntil(epochSeconds, nowMs) {
|
|
199
|
+
return epochSeconds === undefined ? undefined : Math.max(0, Math.round(epochSeconds - nowMs / 1000));
|
|
200
|
+
}
|
|
201
|
+
function isContextProbeMetrics(value) {
|
|
202
|
+
return isRecord(value) &&
|
|
203
|
+
typeof value.agentId === "string" &&
|
|
204
|
+
typeof value.contextPercent === "number" &&
|
|
205
|
+
typeof value.timestamp === "number";
|
|
206
|
+
}
|
|
207
|
+
function isRecord(value) {
|
|
208
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=context-probe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-probe.js","sourceRoot":"","sources":["../src/context-probe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ContractCompatibility, RuntimeContractName, RuntimeContracts } from "./types.js";
|
|
2
|
+
export declare const CONTRACT_VERSIONS: {
|
|
3
|
+
readonly relayApi: 1;
|
|
4
|
+
readonly orchestratorProtocol: 3;
|
|
5
|
+
readonly runnerProtocol: 1;
|
|
6
|
+
readonly providerPluginProtocol: 1;
|
|
7
|
+
};
|
|
8
|
+
export declare const CONTRACT_REQUIREMENTS: {
|
|
9
|
+
readonly orchestratorProtocol: {
|
|
10
|
+
readonly min: 3;
|
|
11
|
+
readonly maxExclusive: 4;
|
|
12
|
+
};
|
|
13
|
+
readonly runnerProtocol: {
|
|
14
|
+
readonly min: 1;
|
|
15
|
+
readonly maxExclusive: 2;
|
|
16
|
+
};
|
|
17
|
+
readonly providerPluginProtocol: {
|
|
18
|
+
readonly min: 1;
|
|
19
|
+
readonly maxExclusive: 2;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
export interface ContractRequirement {
|
|
23
|
+
min: number;
|
|
24
|
+
maxExclusive: number;
|
|
25
|
+
}
|
|
26
|
+
export declare function contractCompatibility(contracts: RuntimeContracts, requirements: Partial<Record<RuntimeContractName, ContractRequirement>>): ContractCompatibility;
|
|
27
|
+
//# sourceMappingURL=contracts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAA8B,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE3H,eAAO,MAAM,iBAAiB;;;;;CAK0B,CAAC;AAEzD,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;CAIxB,CAAC;AAEX,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,gBAAgB,EAC3B,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,CAAC,GACtE,qBAAqB,CAuBvB"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export const CONTRACT_VERSIONS = {
|
|
2
|
+
relayApi: 1,
|
|
3
|
+
orchestratorProtocol: 3,
|
|
4
|
+
runnerProtocol: 1,
|
|
5
|
+
providerPluginProtocol: 1,
|
|
6
|
+
};
|
|
7
|
+
export const CONTRACT_REQUIREMENTS = {
|
|
8
|
+
orchestratorProtocol: { min: 3, maxExclusive: 4 },
|
|
9
|
+
runnerProtocol: { min: 1, maxExclusive: 2 },
|
|
10
|
+
providerPluginProtocol: { min: 1, maxExclusive: 2 },
|
|
11
|
+
};
|
|
12
|
+
export function contractCompatibility(contracts, requirements) {
|
|
13
|
+
const issues = [];
|
|
14
|
+
let unknown = false;
|
|
15
|
+
for (const [contract, requirement] of Object.entries(requirements)) {
|
|
16
|
+
const actual = contracts[contract];
|
|
17
|
+
const expected = `>=${requirement.min} <${requirement.maxExclusive}`;
|
|
18
|
+
if (!Number.isFinite(actual)) {
|
|
19
|
+
unknown = true;
|
|
20
|
+
issues.push({ contract, expected });
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
if (actual < requirement.min || actual >= requirement.maxExclusive) {
|
|
24
|
+
issues.push({ contract, expected, actual });
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const incompatible = issues.some((issue) => issue.actual !== undefined);
|
|
28
|
+
return {
|
|
29
|
+
status: incompatible ? "incompatible" : unknown ? "unknown" : "compatible",
|
|
30
|
+
compatible: !incompatible && !unknown,
|
|
31
|
+
issues,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=contracts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,QAAQ,EAAE,CAAC;IACX,oBAAoB,EAAE,CAAC;IACvB,cAAc,EAAE,CAAC;IACjB,sBAAsB,EAAE,CAAC;CAC6B,CAAC;AAEzD,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,oBAAoB,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE;IACjD,cAAc,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE;IAC3C,sBAAsB,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE;CAC3C,CAAC;AAOX,MAAM,UAAU,qBAAqB,CACnC,SAA2B,EAC3B,YAAuE;IAEvE,MAAM,MAAM,GAAiC,EAAE,CAAC;IAChD,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,KAAK,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAsD,EAAE,CAAC;QACxH,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAG,KAAK,WAAW,CAAC,GAAG,KAAK,WAAW,CAAC,YAAY,EAAE,CAAC;QACrE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,OAAO,GAAG,IAAI,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;YACpC,SAAS;QACX,CAAC;QACD,IAAI,MAAO,GAAG,WAAW,CAAC,GAAG,IAAI,MAAO,IAAI,WAAW,CAAC,YAAY,EAAE,CAAC;YACrE,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;IACxE,OAAO;QACL,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY;QAC1E,UAAU,EAAE,CAAC,YAAY,IAAI,CAAC,OAAO;QACrC,MAAM;KACP,CAAC;AACJ,CAAC"}
|
package/dist/http-client.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AgentCard, PollQuery, RegisterAgentInput, SendMessageInput, Message } from "./types.js";
|
|
1
|
+
import type { AgentCard, Artifact, ArtifactKind, ArtifactSensitivity, PollQuery, RegisterAgentInput, SendMessageInput, Message, MessageDeliveryState, MessageDeliveryStatus, ReplyObligation, Task, TaskStatusInput } from "./types.js";
|
|
2
2
|
export interface HttpClientOptions {
|
|
3
3
|
baseUrl: string;
|
|
4
4
|
token?: string;
|
|
@@ -14,34 +14,95 @@ export declare class RelayHttpError extends Error {
|
|
|
14
14
|
}
|
|
15
15
|
export declare class RelayHttpClient {
|
|
16
16
|
private readonly baseUrl;
|
|
17
|
-
private
|
|
17
|
+
private token?;
|
|
18
18
|
private readonly timeout;
|
|
19
19
|
constructor(options: HttpClientOptions);
|
|
20
|
+
setToken(token?: string): void;
|
|
20
21
|
registerAgent(input: RegisterAgentInput): Promise<AgentCard>;
|
|
21
22
|
getAgent(id: string): Promise<AgentCard | null>;
|
|
23
|
+
listReplyObligations(agentId: string): Promise<ReplyObligation[]>;
|
|
22
24
|
listAgents(filter?: {
|
|
23
25
|
tag?: string;
|
|
24
26
|
machine?: string;
|
|
25
27
|
status?: string;
|
|
26
28
|
}): Promise<AgentCard[]>;
|
|
27
|
-
heartbeat(agentId: string): Promise<void>;
|
|
28
|
-
setStatus(agentId: string, status: string): Promise<void>;
|
|
29
|
-
setReady(agentId: string, ready: boolean): Promise<void>;
|
|
29
|
+
heartbeat(agentId: string, instanceId?: string): Promise<void>;
|
|
30
|
+
setStatus(agentId: string, status: string, instanceId?: string): Promise<void>;
|
|
31
|
+
setReady(agentId: string, ready: boolean, instanceId?: string): Promise<void>;
|
|
30
32
|
setLabel(agentId: string, label: string | null): Promise<void>;
|
|
31
33
|
deleteAgent(agentId: string): Promise<void>;
|
|
32
34
|
sendMessage(input: SendMessageInput): Promise<Message>;
|
|
33
35
|
pollMessages(query: PollQuery): Promise<Message[]>;
|
|
34
36
|
getMessage(id: number): Promise<Message | null>;
|
|
35
37
|
getThread(messageId: number): Promise<Message[]>;
|
|
38
|
+
getMessageDelivery(messageId: number): Promise<MessageDeliveryState>;
|
|
39
|
+
recordMessageDeliveryAttempt(messageId: number, input: {
|
|
40
|
+
agentId?: string;
|
|
41
|
+
status: MessageDeliveryStatus;
|
|
42
|
+
error?: string;
|
|
43
|
+
nextRetryAt?: number;
|
|
44
|
+
poisonReason?: string;
|
|
45
|
+
}): Promise<MessageDeliveryState>;
|
|
46
|
+
updateMessageDelivery(messageId: number, input: {
|
|
47
|
+
action: "retry-now" | "mark-dead" | "clear";
|
|
48
|
+
reason?: string;
|
|
49
|
+
agentId?: string;
|
|
50
|
+
}): Promise<MessageDeliveryState>;
|
|
36
51
|
claimMessage(messageId: number, agentId: string): Promise<boolean>;
|
|
52
|
+
claimMessageResult(messageId: number, agentId: string): Promise<{
|
|
53
|
+
ok: boolean;
|
|
54
|
+
claimExpiresAt?: number;
|
|
55
|
+
task?: Task;
|
|
56
|
+
}>;
|
|
57
|
+
renewMessageClaim(messageId: number, agentId: string): Promise<{
|
|
58
|
+
ok: boolean;
|
|
59
|
+
claimExpiresAt?: number;
|
|
60
|
+
}>;
|
|
61
|
+
updateTaskStatus(taskId: number, input: TaskStatusInput): Promise<Task>;
|
|
37
62
|
markRead(messageId: number, agentId: string): Promise<void>;
|
|
38
63
|
deleteMessage(messageId: number): Promise<void>;
|
|
39
64
|
getCursor(): Promise<{
|
|
40
65
|
latestId: number;
|
|
41
66
|
}>;
|
|
67
|
+
uploadArtifact(file: Blob | Buffer | ReadableStream, opts?: {
|
|
68
|
+
filename?: string;
|
|
69
|
+
mediaType?: string;
|
|
70
|
+
digest?: string;
|
|
71
|
+
kind?: ArtifactKind;
|
|
72
|
+
sensitivity?: ArtifactSensitivity;
|
|
73
|
+
metadata?: Record<string, unknown>;
|
|
74
|
+
expiresAt?: number;
|
|
75
|
+
}): Promise<Artifact>;
|
|
76
|
+
downloadArtifact(id: string): Promise<{
|
|
77
|
+
stream: ReadableStream<Uint8Array>;
|
|
78
|
+
meta: Artifact;
|
|
79
|
+
}>;
|
|
80
|
+
getArtifact(id: string): Promise<Artifact>;
|
|
81
|
+
artifactExists(id: string): Promise<boolean>;
|
|
82
|
+
deleteArtifact(id: string): Promise<void>;
|
|
83
|
+
listArtifacts(query?: {
|
|
84
|
+
messageId?: number;
|
|
85
|
+
taskId?: number;
|
|
86
|
+
createdBy?: string;
|
|
87
|
+
limit?: number;
|
|
88
|
+
}): Promise<Artifact[]>;
|
|
89
|
+
renewRuntimeToken(): Promise<{
|
|
90
|
+
token: string;
|
|
91
|
+
record: {
|
|
92
|
+
jti: string;
|
|
93
|
+
profileId?: string;
|
|
94
|
+
expiresAt?: number;
|
|
95
|
+
};
|
|
96
|
+
previous: {
|
|
97
|
+
jti: string;
|
|
98
|
+
expiresAt?: number;
|
|
99
|
+
};
|
|
100
|
+
}>;
|
|
42
101
|
private json;
|
|
43
102
|
private jsonUrl;
|
|
44
103
|
private request;
|
|
104
|
+
private requestRaw;
|
|
105
|
+
private parseResponseForOk;
|
|
45
106
|
private parseResponse;
|
|
46
107
|
private headers;
|
|
47
108
|
private url;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../src/http-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../src/http-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,mBAAmB,EAAE,SAAS,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,eAAe,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAExO,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAe,SAAQ,KAAK;IAErC,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAJZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM;CAIxB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,KAAK,CAAC,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,EAAE,iBAAiB;IAMtC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAI9B,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,SAAS,CAAC;IAItD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAMrD,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAIjE,UAAU,CAAC,MAAM,GAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAQ5F,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9D,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9E,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7E,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9D,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjD,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAItD,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAW5C,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAOrD,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAIhD,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAIpE,4BAA4B,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE;QACrD,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,qBAAqB,CAAC;QAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAIjC,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE;QAC9C,MAAM,EAAE,WAAW,GAAG,WAAW,GAAG,OAAO,CAAC;QAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAI3B,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIlE,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,IAAI,CAAA;KAAE,CAAC;IAStH,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IASxG,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAMvE,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3D,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD,SAAS,IAAI,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAIpC,cAAc,CAClB,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,cAAc,EACpC,IAAI,GAAE;QACJ,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,YAAY,CAAC;QACpB,WAAW,CAAC,EAAE,mBAAmB,CAAC;QAClC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnC,SAAS,CAAC,EAAE,MAAM,CAAC;KACf,GACL,OAAO,CAAC,QAAQ,CAAC;IAoCd,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,CAAC;IAS7F,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAI1C,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAO5C,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C,aAAa,CAAC,KAAK,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAS3H,iBAAiB,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,SAAS,CAAC,EAAE,MAAM,CAAC;YAAC,SAAS,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,QAAQ,EAAE;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,SAAS,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;IAI/J,OAAO,CAAC,IAAI;YAIE,OAAO;YAKP,OAAO;YAeP,UAAU;YAeV,kBAAkB;YAOlB,aAAa;IAS3B,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,GAAG;CAGZ"}
|
package/dist/http-client.js
CHANGED
|
@@ -22,6 +22,9 @@ export class RelayHttpClient {
|
|
|
22
22
|
this.token = options.token;
|
|
23
23
|
this.timeout = options.timeout ?? 10_000;
|
|
24
24
|
}
|
|
25
|
+
setToken(token) {
|
|
26
|
+
this.token = token;
|
|
27
|
+
}
|
|
25
28
|
registerAgent(input) {
|
|
26
29
|
return this.json("POST", "/api/agents", input);
|
|
27
30
|
}
|
|
@@ -31,6 +34,9 @@ export class RelayHttpClient {
|
|
|
31
34
|
return null;
|
|
32
35
|
return this.parseResponse(response, "GET", `/api/agents/${id}`);
|
|
33
36
|
}
|
|
37
|
+
listReplyObligations(agentId) {
|
|
38
|
+
return this.json("GET", `/api/agents/${encodeURIComponent(agentId)}/reply-obligations`);
|
|
39
|
+
}
|
|
34
40
|
listAgents(filter = {}) {
|
|
35
41
|
const url = this.url("/api/agents");
|
|
36
42
|
for (const [key, value] of Object.entries(filter)) {
|
|
@@ -39,14 +45,14 @@ export class RelayHttpClient {
|
|
|
39
45
|
}
|
|
40
46
|
return this.jsonUrl("GET", url);
|
|
41
47
|
}
|
|
42
|
-
async heartbeat(agentId) {
|
|
43
|
-
await this.json("POST", `/api/agents/${encodeURIComponent(agentId)}/heartbeat
|
|
48
|
+
async heartbeat(agentId, instanceId) {
|
|
49
|
+
await this.json("POST", `/api/agents/${encodeURIComponent(agentId)}/heartbeat`, instanceId ? { instanceId } : undefined);
|
|
44
50
|
}
|
|
45
|
-
async setStatus(agentId, status) {
|
|
46
|
-
await this.json("PATCH", `/api/agents/${encodeURIComponent(agentId)}/status`, { status });
|
|
51
|
+
async setStatus(agentId, status, instanceId) {
|
|
52
|
+
await this.json("PATCH", `/api/agents/${encodeURIComponent(agentId)}/status`, { status, ...(instanceId ? { instanceId } : {}) });
|
|
47
53
|
}
|
|
48
|
-
async setReady(agentId, ready) {
|
|
49
|
-
await this.json("PATCH", `/api/agents/${encodeURIComponent(agentId)}/ready`, { ready });
|
|
54
|
+
async setReady(agentId, ready, instanceId) {
|
|
55
|
+
await this.json("PATCH", `/api/agents/${encodeURIComponent(agentId)}/ready`, { ready, ...(instanceId ? { instanceId } : {}) });
|
|
50
56
|
}
|
|
51
57
|
async setLabel(agentId, label) {
|
|
52
58
|
await this.json("PATCH", `/api/agents/${encodeURIComponent(agentId)}/label`, { label });
|
|
@@ -82,15 +88,43 @@ export class RelayHttpClient {
|
|
|
82
88
|
getThread(messageId) {
|
|
83
89
|
return this.json("GET", `/api/messages/${messageId}/thread`);
|
|
84
90
|
}
|
|
91
|
+
getMessageDelivery(messageId) {
|
|
92
|
+
return this.json("GET", `/api/messages/${messageId}/delivery`);
|
|
93
|
+
}
|
|
94
|
+
recordMessageDeliveryAttempt(messageId, input) {
|
|
95
|
+
return this.json("POST", `/api/messages/${messageId}/delivery/attempts`, input);
|
|
96
|
+
}
|
|
97
|
+
updateMessageDelivery(messageId, input) {
|
|
98
|
+
return this.json("POST", `/api/messages/${messageId}/delivery/actions`, input);
|
|
99
|
+
}
|
|
85
100
|
async claimMessage(messageId, agentId) {
|
|
101
|
+
return (await this.claimMessageResult(messageId, agentId)).ok;
|
|
102
|
+
}
|
|
103
|
+
async claimMessageResult(messageId, agentId) {
|
|
86
104
|
const path = `/api/messages/${messageId}/claim`;
|
|
87
105
|
const response = await this.request("POST", path, { agentId });
|
|
88
106
|
if (response.ok)
|
|
89
|
-
return
|
|
107
|
+
return this.parseResponse(response, "POST", path);
|
|
90
108
|
if ([400, 404, 409].includes(response.status))
|
|
91
|
-
return false;
|
|
109
|
+
return { ok: false };
|
|
110
|
+
await this.parseResponse(response, "POST", path);
|
|
111
|
+
return { ok: false };
|
|
112
|
+
}
|
|
113
|
+
async renewMessageClaim(messageId, agentId) {
|
|
114
|
+
const path = `/api/messages/${messageId}/claim/renew`;
|
|
115
|
+
const response = await this.request("POST", path, { agentId });
|
|
116
|
+
if (response.ok)
|
|
117
|
+
return this.parseResponse(response, "POST", path);
|
|
118
|
+
if ([400, 404, 409].includes(response.status))
|
|
119
|
+
return { ok: false };
|
|
92
120
|
await this.parseResponse(response, "POST", path);
|
|
93
|
-
return false;
|
|
121
|
+
return { ok: false };
|
|
122
|
+
}
|
|
123
|
+
async updateTaskStatus(taskId, input) {
|
|
124
|
+
const payload = await this.json("PATCH", `/api/tasks/${taskId}/status`, input);
|
|
125
|
+
if (!payload.task)
|
|
126
|
+
throw new Error(`task status update failed: missing task ${taskId}`);
|
|
127
|
+
return payload.task;
|
|
94
128
|
}
|
|
95
129
|
async markRead(messageId, agentId) {
|
|
96
130
|
await this.json("PATCH", `/api/messages/${messageId}`, { readBy: agentId });
|
|
@@ -101,6 +135,90 @@ export class RelayHttpClient {
|
|
|
101
135
|
getCursor() {
|
|
102
136
|
return this.json("GET", "/api/messages/cursor");
|
|
103
137
|
}
|
|
138
|
+
async uploadArtifact(file, opts = {}) {
|
|
139
|
+
if (opts.metadata && !(file instanceof ReadableStream)) {
|
|
140
|
+
const form = new FormData();
|
|
141
|
+
if (file instanceof Blob) {
|
|
142
|
+
form.append("file", file, opts.filename);
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
const arrayBuffer = file.buffer.slice(file.byteOffset, file.byteOffset + file.byteLength);
|
|
146
|
+
form.append("file", new Blob([arrayBuffer], { type: opts.mediaType }), opts.filename);
|
|
147
|
+
}
|
|
148
|
+
if (opts.filename)
|
|
149
|
+
form.append("filename", opts.filename);
|
|
150
|
+
if (opts.digest)
|
|
151
|
+
form.append("digest", opts.digest);
|
|
152
|
+
if (opts.kind)
|
|
153
|
+
form.append("kind", opts.kind);
|
|
154
|
+
if (opts.sensitivity)
|
|
155
|
+
form.append("sensitivity", opts.sensitivity);
|
|
156
|
+
if (opts.expiresAt)
|
|
157
|
+
form.append("expiresAt", String(opts.expiresAt));
|
|
158
|
+
form.append("metadata", JSON.stringify(opts.metadata));
|
|
159
|
+
const response = await this.requestRaw("POST", "/api/artifacts", form);
|
|
160
|
+
return this.parseResponse(response, "POST", "/api/artifacts");
|
|
161
|
+
}
|
|
162
|
+
const headers = {};
|
|
163
|
+
if (opts.mediaType)
|
|
164
|
+
headers["Content-Type"] = opts.mediaType;
|
|
165
|
+
if (opts.filename)
|
|
166
|
+
headers["X-Artifact-Filename"] = opts.filename;
|
|
167
|
+
if (opts.digest)
|
|
168
|
+
headers["X-Artifact-Digest"] = opts.digest;
|
|
169
|
+
if (opts.kind)
|
|
170
|
+
headers["X-Artifact-Kind"] = opts.kind;
|
|
171
|
+
if (opts.sensitivity)
|
|
172
|
+
headers["X-Artifact-Sensitivity"] = opts.sensitivity;
|
|
173
|
+
if (opts.expiresAt)
|
|
174
|
+
headers["X-Artifact-Expires-At"] = String(opts.expiresAt);
|
|
175
|
+
let body;
|
|
176
|
+
if (file instanceof Blob)
|
|
177
|
+
body = file;
|
|
178
|
+
else if (file instanceof ReadableStream)
|
|
179
|
+
body = file;
|
|
180
|
+
else
|
|
181
|
+
body = file;
|
|
182
|
+
const response = await this.requestRaw("POST", "/api/artifacts", body, headers);
|
|
183
|
+
return this.parseResponse(response, "POST", "/api/artifacts");
|
|
184
|
+
}
|
|
185
|
+
async downloadArtifact(id) {
|
|
186
|
+
const meta = await this.getArtifact(id);
|
|
187
|
+
const path = `/api/artifacts/${encodeURIComponent(id)}/content`;
|
|
188
|
+
const response = await this.requestRaw("GET", path);
|
|
189
|
+
await this.parseResponseForOk(response, "GET", path);
|
|
190
|
+
if (!response.body)
|
|
191
|
+
throw new RelayHttpError("GET", path, response.status, response.statusText, "missing response body");
|
|
192
|
+
return { stream: response.body, meta };
|
|
193
|
+
}
|
|
194
|
+
async getArtifact(id) {
|
|
195
|
+
return this.json("GET", `/api/artifacts/${encodeURIComponent(id)}`);
|
|
196
|
+
}
|
|
197
|
+
async artifactExists(id) {
|
|
198
|
+
const response = await this.requestRaw("HEAD", `/api/artifacts/${encodeURIComponent(id)}/content`);
|
|
199
|
+
if (response.status === 404)
|
|
200
|
+
return false;
|
|
201
|
+
await this.parseResponseForOk(response, "HEAD", `/api/artifacts/${id}/content`);
|
|
202
|
+
return true;
|
|
203
|
+
}
|
|
204
|
+
async deleteArtifact(id) {
|
|
205
|
+
await this.json("DELETE", `/api/artifacts/${encodeURIComponent(id)}`);
|
|
206
|
+
}
|
|
207
|
+
listArtifacts(query = {}) {
|
|
208
|
+
const url = this.url("/api/artifacts");
|
|
209
|
+
if (query.messageId !== undefined)
|
|
210
|
+
url.searchParams.set("messageId", String(query.messageId));
|
|
211
|
+
if (query.taskId !== undefined)
|
|
212
|
+
url.searchParams.set("taskId", String(query.taskId));
|
|
213
|
+
if (query.createdBy)
|
|
214
|
+
url.searchParams.set("createdBy", query.createdBy);
|
|
215
|
+
if (query.limit !== undefined)
|
|
216
|
+
url.searchParams.set("limit", String(query.limit));
|
|
217
|
+
return this.jsonUrl("GET", url);
|
|
218
|
+
}
|
|
219
|
+
renewRuntimeToken() {
|
|
220
|
+
return this.json("POST", "/api/runtime-tokens/renew");
|
|
221
|
+
}
|
|
104
222
|
json(method, path, body) {
|
|
105
223
|
return this.jsonUrl(method, this.url(path), body);
|
|
106
224
|
}
|
|
@@ -123,6 +241,27 @@ export class RelayHttpClient {
|
|
|
123
241
|
clearTimeout(timeout);
|
|
124
242
|
}
|
|
125
243
|
}
|
|
244
|
+
async requestRaw(method, pathOrUrl, body, headers = {}) {
|
|
245
|
+
const controller = new AbortController();
|
|
246
|
+
const timeout = setTimeout(() => controller.abort(), this.timeout);
|
|
247
|
+
try {
|
|
248
|
+
return await fetch(pathOrUrl instanceof URL ? pathOrUrl : this.url(pathOrUrl), {
|
|
249
|
+
method,
|
|
250
|
+
headers: this.headers(headers),
|
|
251
|
+
body,
|
|
252
|
+
signal: controller.signal,
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
finally {
|
|
256
|
+
clearTimeout(timeout);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
async parseResponseForOk(response, method, path) {
|
|
260
|
+
if (!response.ok) {
|
|
261
|
+
const text = await response.text();
|
|
262
|
+
throw new RelayHttpError(method, path, response.status, response.statusText, text);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
126
265
|
async parseResponse(response, method, path) {
|
|
127
266
|
if (!response.ok) {
|
|
128
267
|
const text = await response.text();
|