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.
Files changed (43) hide show
  1. package/dist/bus-client.d.ts +45 -2
  2. package/dist/bus-client.d.ts.map +1 -1
  3. package/dist/bus-client.js +157 -3
  4. package/dist/bus-client.js.map +1 -1
  5. package/dist/claim-tracker.d.ts +19 -0
  6. package/dist/claim-tracker.d.ts.map +1 -0
  7. package/dist/claim-tracker.js +26 -0
  8. package/dist/claim-tracker.js.map +1 -0
  9. package/dist/context-probe.d.ts +43 -0
  10. package/dist/context-probe.d.ts.map +1 -0
  11. package/dist/context-probe.js +210 -0
  12. package/dist/context-probe.js.map +1 -0
  13. package/dist/contracts.d.ts +27 -0
  14. package/dist/contracts.d.ts.map +1 -0
  15. package/dist/contracts.js +34 -0
  16. package/dist/contracts.js.map +1 -0
  17. package/dist/http-client.d.ts +66 -5
  18. package/dist/http-client.d.ts.map +1 -1
  19. package/dist/http-client.js +148 -9
  20. package/dist/http-client.js.map +1 -1
  21. package/dist/index.d.ts +4 -0
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +4 -0
  24. package/dist/index.js.map +1 -1
  25. package/dist/protocol.d.ts +9 -1
  26. package/dist/protocol.d.ts.map +1 -1
  27. package/dist/protocol.js.map +1 -1
  28. package/dist/provider-catalog.d.ts +80 -0
  29. package/dist/provider-catalog.d.ts.map +1 -0
  30. package/dist/provider-catalog.js +84 -0
  31. package/dist/provider-catalog.js.map +1 -0
  32. package/dist/types.d.ts +921 -4
  33. package/dist/types.d.ts.map +1 -1
  34. package/package.json +17 -1
  35. package/src/bus-client.ts +176 -4
  36. package/src/claim-tracker.ts +40 -0
  37. package/src/context-probe.ts +257 -0
  38. package/src/contracts.ts +47 -0
  39. package/src/http-client.ts +166 -11
  40. package/src/index.ts +4 -0
  41. package/src/protocol.ts +10 -0
  42. package/src/provider-catalog.ts +174 -0
  43. 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"}
@@ -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 readonly token?;
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;AAEtG,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,QAAQ,CAAC,KAAK,CAAC,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,EAAE,iBAAiB;IAMtC,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,SAAS,CAAC;IAItD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAMrD,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,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzD,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxD,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;IAI1C,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASlE,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;IAI1C,OAAO,CAAC,IAAI;YAIE,OAAO;YAKP,OAAO;YAeP,aAAa;IAS3B,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,GAAG;CAGZ"}
1
+ {"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../src/http-client.ts"],"names":[],"mappings":"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"}
@@ -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 true;
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();