@hypercli.com/sdk 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +629 -0
- package/dist/acp-driver.d.ts +72 -0
- package/dist/acp-driver.d.ts.map +1 -0
- package/dist/acp-driver.js +147 -0
- package/dist/acp-driver.js.map +1 -0
- package/dist/acp-pool.d.ts +70 -0
- package/dist/acp-pool.d.ts.map +1 -0
- package/dist/acp-pool.js +181 -0
- package/dist/acp-pool.js.map +1 -0
- package/dist/acp.d.ts +179 -0
- package/dist/acp.d.ts.map +1 -0
- package/dist/acp.js +487 -0
- package/dist/acp.js.map +1 -0
- package/dist/agent-persona.d.ts +68 -0
- package/dist/agent-persona.d.ts.map +1 -0
- package/dist/agent-persona.js +78 -0
- package/dist/agent-persona.js.map +1 -0
- package/dist/agent-slots.d.ts +18 -0
- package/dist/agent-slots.d.ts.map +1 -0
- package/dist/agent-slots.js +24 -0
- package/dist/agent-slots.js.map +1 -0
- package/dist/agent-urls.d.ts +47 -0
- package/dist/agent-urls.d.ts.map +1 -0
- package/dist/agent-urls.js +178 -0
- package/dist/agent-urls.js.map +1 -0
- package/dist/agent.d.ts +482 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +926 -0
- package/dist/agent.js.map +1 -0
- package/dist/agents.d.ts +1452 -0
- package/dist/agents.d.ts.map +1 -0
- package/dist/agents.js +4022 -0
- package/dist/agents.js.map +1 -0
- package/dist/billing.d.ts +72 -0
- package/dist/billing.d.ts.map +1 -0
- package/dist/billing.js +93 -0
- package/dist/billing.js.map +1 -0
- package/dist/browser-jobs.d.ts +24 -0
- package/dist/browser-jobs.d.ts.map +1 -0
- package/dist/browser-jobs.js +209 -0
- package/dist/browser-jobs.js.map +1 -0
- package/dist/browser.d.ts +41 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +57 -0
- package/dist/browser.js.map +1 -0
- package/dist/buzz-activity.d.ts +169 -0
- package/dist/buzz-activity.d.ts.map +1 -0
- package/dist/buzz-activity.js +844 -0
- package/dist/buzz-activity.js.map +1 -0
- package/dist/channels.d.ts +99 -0
- package/dist/channels.d.ts.map +1 -0
- package/dist/channels.js +27 -0
- package/dist/channels.js.map +1 -0
- package/dist/chat-integrations.d.ts +44 -0
- package/dist/chat-integrations.d.ts.map +1 -0
- package/dist/chat-integrations.js +138 -0
- package/dist/chat-integrations.js.map +1 -0
- package/dist/client.d.ts +88 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +144 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +44 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +192 -0
- package/dist/config.js.map +1 -0
- package/dist/connectors.d.ts +80 -0
- package/dist/connectors.d.ts.map +1 -0
- package/dist/connectors.js +2 -0
- package/dist/connectors.js.map +1 -0
- package/dist/errors.d.ts +16 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +26 -0
- package/dist/errors.js.map +1 -0
- package/dist/files.d.ts +60 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +128 -0
- package/dist/files.js.map +1 -0
- package/dist/http.d.ts +56 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +362 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +49 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +64 -0
- package/dist/index.js.map +1 -0
- package/dist/instances.d.ts +94 -0
- package/dist/instances.d.ts.map +1 -0
- package/dist/instances.js +197 -0
- package/dist/instances.js.map +1 -0
- package/dist/integrations.d.ts +111 -0
- package/dist/integrations.d.ts.map +1 -0
- package/dist/integrations.js +206 -0
- package/dist/integrations.js.map +1 -0
- package/dist/job/base.d.ts +86 -0
- package/dist/job/base.d.ts.map +1 -0
- package/dist/job/base.js +206 -0
- package/dist/job/base.js.map +1 -0
- package/dist/job/comfyui.d.ts +259 -0
- package/dist/job/comfyui.d.ts.map +1 -0
- package/dist/job/comfyui.js +1563 -0
- package/dist/job/comfyui.js.map +1 -0
- package/dist/job/gradio.d.ts +48 -0
- package/dist/job/gradio.d.ts.map +1 -0
- package/dist/job/gradio.js +90 -0
- package/dist/job/gradio.js.map +1 -0
- package/dist/job-codecs.d.ts +66 -0
- package/dist/job-codecs.d.ts.map +1 -0
- package/dist/job-codecs.js +132 -0
- package/dist/job-codecs.js.map +1 -0
- package/dist/jobs.d.ts +148 -0
- package/dist/jobs.d.ts.map +1 -0
- package/dist/jobs.js +480 -0
- package/dist/jobs.js.map +1 -0
- package/dist/keys.d.ts +99 -0
- package/dist/keys.d.ts.map +1 -0
- package/dist/keys.js +145 -0
- package/dist/keys.js.map +1 -0
- package/dist/logs.d.ts +54 -0
- package/dist/logs.d.ts.map +1 -0
- package/dist/logs.js +256 -0
- package/dist/logs.js.map +1 -0
- package/dist/managed-context.d.ts +20 -0
- package/dist/managed-context.d.ts.map +1 -0
- package/dist/managed-context.js +95 -0
- package/dist/managed-context.js.map +1 -0
- package/dist/mcp.d.ts +7 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +8 -0
- package/dist/mcp.js.map +1 -0
- package/dist/memory.d.ts +87 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +79 -0
- package/dist/memory.js.map +1 -0
- package/dist/models.d.ts +15 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +19 -0
- package/dist/models.js.map +1 -0
- package/dist/openclaw-control-ui-origin.d.ts +23 -0
- package/dist/openclaw-control-ui-origin.d.ts.map +1 -0
- package/dist/openclaw-control-ui-origin.js +53 -0
- package/dist/openclaw-control-ui-origin.js.map +1 -0
- package/dist/renders.d.ts +187 -0
- package/dist/renders.d.ts.map +1 -0
- package/dist/renders.js +360 -0
- package/dist/renders.js.map +1 -0
- package/dist/routines.d.ts +59 -0
- package/dist/routines.d.ts.map +1 -0
- package/dist/routines.js +135 -0
- package/dist/routines.js.map +1 -0
- package/dist/runners.d.ts +61 -0
- package/dist/runners.d.ts.map +1 -0
- package/dist/runners.js +127 -0
- package/dist/runners.js.map +1 -0
- package/dist/sessions.d.ts +280 -0
- package/dist/sessions.d.ts.map +1 -0
- package/dist/sessions.js +292 -0
- package/dist/sessions.js.map +1 -0
- package/dist/skills.d.ts +170 -0
- package/dist/skills.d.ts.map +1 -0
- package/dist/skills.js +2 -0
- package/dist/skills.js.map +1 -0
- package/dist/user.d.ts +78 -0
- package/dist/user.d.ts.map +1 -0
- package/dist/user.js +143 -0
- package/dist/user.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/dist/voice-session.d.ts +66 -0
- package/dist/voice-session.d.ts.map +1 -0
- package/dist/voice-session.js +366 -0
- package/dist/voice-session.js.map +1 -0
- package/dist/voice-transcription-session.d.ts +64 -0
- package/dist/voice-transcription-session.d.ts.map +1 -0
- package/dist/voice-transcription-session.js +228 -0
- package/dist/voice-transcription-session.js.map +1 -0
- package/dist/voice.d.ts +62 -0
- package/dist/voice.d.ts.map +1 -0
- package/dist/voice.js +134 -0
- package/dist/voice.js.map +1 -0
- package/dist/workspace-tomd.d.ts +61 -0
- package/dist/workspace-tomd.d.ts.map +1 -0
- package/dist/workspace-tomd.js +177 -0
- package/dist/workspace-tomd.js.map +1 -0
- package/dist/workspaces.d.ts +255 -0
- package/dist/workspaces.d.ts.map +1 -0
- package/dist/workspaces.js +653 -0
- package/dist/workspaces.js.map +1 -0
- package/package.json +115 -0
- package/runtime/config-require.browser.js +4 -0
- package/runtime/config-require.d.ts +2 -0
- package/runtime/config-require.node.js +8 -0
package/dist/keys.js
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Keys management
|
|
3
|
+
*/
|
|
4
|
+
import { getApiUrl } from './config.js';
|
|
5
|
+
import { HTTPClient } from './http.js';
|
|
6
|
+
export const API_KEY_BASELINE_FAMILIES = [
|
|
7
|
+
{ key: 'api', label: 'API Keys', allowed: ['none', 'self', '*'] },
|
|
8
|
+
{ key: 'user', label: 'Profile', allowed: ['none', 'self', '*'] },
|
|
9
|
+
{ key: 'jobs', label: 'Jobs', allowed: ['none', 'self', '*'] },
|
|
10
|
+
{ key: 'renders', label: 'Renders', allowed: ['none', 'self', '*'] },
|
|
11
|
+
{ key: 'files', label: 'Files', allowed: ['none', 'self', '*'] },
|
|
12
|
+
{ key: 'agents', label: 'Agents', allowed: ['none', 'self', '*'] },
|
|
13
|
+
{ key: 'models', label: 'Models', allowed: ['none', '*'] },
|
|
14
|
+
{ key: 'voice', label: 'Voice', allowed: ['none', '*'] },
|
|
15
|
+
{ key: 'flow', label: 'Flows', allowed: ['none', '*'] },
|
|
16
|
+
];
|
|
17
|
+
function asRecord(value) {
|
|
18
|
+
if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
19
|
+
return value;
|
|
20
|
+
}
|
|
21
|
+
return {};
|
|
22
|
+
}
|
|
23
|
+
function firstString(...values) {
|
|
24
|
+
for (const value of values) {
|
|
25
|
+
if (typeof value !== 'string')
|
|
26
|
+
continue;
|
|
27
|
+
const trimmed = value.trim();
|
|
28
|
+
if (trimmed)
|
|
29
|
+
return trimmed;
|
|
30
|
+
}
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
function firstTimestamp(...values) {
|
|
34
|
+
for (const value of values) {
|
|
35
|
+
if (typeof value === 'string') {
|
|
36
|
+
const trimmed = value.trim();
|
|
37
|
+
if (!trimmed)
|
|
38
|
+
continue;
|
|
39
|
+
const numeric = Number(trimmed);
|
|
40
|
+
if (!Number.isFinite(numeric))
|
|
41
|
+
return trimmed;
|
|
42
|
+
const milliseconds = Math.abs(numeric) < 1_000_000_000_000 ? numeric * 1000 : numeric;
|
|
43
|
+
const timestamp = new Date(milliseconds);
|
|
44
|
+
if (Number.isFinite(timestamp.getTime()))
|
|
45
|
+
return timestamp.toISOString();
|
|
46
|
+
}
|
|
47
|
+
if (typeof value === 'number' && Number.isFinite(value)) {
|
|
48
|
+
const milliseconds = Math.abs(value) < 1_000_000_000_000 ? value * 1000 : value;
|
|
49
|
+
const timestamp = new Date(milliseconds);
|
|
50
|
+
if (Number.isFinite(timestamp.getTime()))
|
|
51
|
+
return timestamp.toISOString();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
function apiKeyFromDict(data) {
|
|
57
|
+
const record = asRecord(data);
|
|
58
|
+
return {
|
|
59
|
+
keyId: firstString(record.key_id, record.keyId, record.id) || '',
|
|
60
|
+
name: firstString(record.name) || '',
|
|
61
|
+
tags: Array.isArray(record.tags) ? record.tags.filter((tag) => typeof tag === 'string') : [],
|
|
62
|
+
apiKey: firstString(record.api_key, record.apiKey, record.key, record.secret, record.token, record.value),
|
|
63
|
+
apiKeyPreview: firstString(record.api_key_preview, record.apiKeyPreview, record.preview, record.masked_key, record.maskedKey),
|
|
64
|
+
last4: firstString(record.last4, record.last_4),
|
|
65
|
+
isActive: record.is_active === false || record.isActive === false || record.active === false ? false : true,
|
|
66
|
+
createdAt: firstTimestamp(record.created_at, record.createdAt) || '',
|
|
67
|
+
lastUsedAt: firstTimestamp(record.last_used_at, record.lastUsedAt),
|
|
68
|
+
expiresAt: firstTimestamp(record.expires_at, record.expiresAt),
|
|
69
|
+
capabilities: Array.isArray(record.capabilities)
|
|
70
|
+
? record.capabilities.filter((capability) => typeof capability === 'string')
|
|
71
|
+
: undefined,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
export class KeysAPI {
|
|
75
|
+
http;
|
|
76
|
+
constructor(http) {
|
|
77
|
+
this.http = http;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Create a new API key
|
|
81
|
+
*/
|
|
82
|
+
async create(name = 'default', tags, options = {}) {
|
|
83
|
+
const payload = { name };
|
|
84
|
+
if (tags !== undefined) {
|
|
85
|
+
payload.tags = tags;
|
|
86
|
+
}
|
|
87
|
+
if (options.duration !== undefined) {
|
|
88
|
+
payload.duration = options.duration;
|
|
89
|
+
}
|
|
90
|
+
if (options.expiresAt !== undefined) {
|
|
91
|
+
payload.expires_at = options.expiresAt;
|
|
92
|
+
}
|
|
93
|
+
const data = await this.http.post('/api/keys', payload);
|
|
94
|
+
return apiKeyFromDict(data);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* List all API keys (masked)
|
|
98
|
+
*/
|
|
99
|
+
async list() {
|
|
100
|
+
const data = await this.http.get('/api/keys');
|
|
101
|
+
return (data || []).map(apiKeyFromDict);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Get a specific API key (masked)
|
|
105
|
+
*/
|
|
106
|
+
async get(keyId) {
|
|
107
|
+
const data = await this.http.get(`/api/keys/${keyId}`);
|
|
108
|
+
return apiKeyFromDict(data);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Deactivate an API key (irreversible)
|
|
112
|
+
*/
|
|
113
|
+
async disable(keyId) {
|
|
114
|
+
return await this.http.delete(`/api/keys/${keyId}`);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Rename an API key
|
|
118
|
+
*/
|
|
119
|
+
async rename(keyId, name) {
|
|
120
|
+
const data = await this.http.patch(`/api/keys/${keyId}`, { name });
|
|
121
|
+
return apiKeyFromDict(data);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Issue a scoped API key for the user represented by an app JWT.
|
|
126
|
+
*
|
|
127
|
+
* The JWT authenticates only this key-creation request. Use the returned
|
|
128
|
+
* `apiKey` for subsequent SDK operations.
|
|
129
|
+
*/
|
|
130
|
+
export async function issueApiKeyFromJwt(jwt, options) {
|
|
131
|
+
const token = jwt.trim();
|
|
132
|
+
if (!token) {
|
|
133
|
+
throw new Error('JWT required');
|
|
134
|
+
}
|
|
135
|
+
const http = new HTTPClient(options.apiUrl ?? getApiUrl(), token, options.timeout ?? 30000);
|
|
136
|
+
const issued = await new KeysAPI(http).create(options.name ?? 'default', options.tags, {
|
|
137
|
+
duration: options.duration,
|
|
138
|
+
expiresAt: options.expiresAt,
|
|
139
|
+
});
|
|
140
|
+
if (!issued.apiKey) {
|
|
141
|
+
throw new Error('API key issue response did not include the key secret');
|
|
142
|
+
}
|
|
143
|
+
return issued;
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=keys.js.map
|
package/dist/keys.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"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"}
|
package/dist/logs.d.ts
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { HyperCLI } from './client.js';
|
|
2
|
+
/**
|
|
3
|
+
* Fetch logs via REST API (one-time call)
|
|
4
|
+
*/
|
|
5
|
+
export declare function fetchLogs(client: HyperCLI, jobId: string, tail?: number): Promise<string[]>;
|
|
6
|
+
/**
|
|
7
|
+
* Async log streamer - WebSocket streaming with optional initial fetch
|
|
8
|
+
*/
|
|
9
|
+
export declare class LogStream {
|
|
10
|
+
private client;
|
|
11
|
+
private jobId;
|
|
12
|
+
private jobKey?;
|
|
13
|
+
private fetchInitial;
|
|
14
|
+
private maxInitialLines;
|
|
15
|
+
private maxBuffer;
|
|
16
|
+
private ws;
|
|
17
|
+
private buffer;
|
|
18
|
+
private initialFetched;
|
|
19
|
+
private connected;
|
|
20
|
+
private closed;
|
|
21
|
+
constructor(client: HyperCLI, jobId: string, jobKey?: string | undefined, fetchInitial?: boolean, maxInitialLines?: number, maxBuffer?: number);
|
|
22
|
+
get status(): 'disconnected' | 'connecting' | 'connected' | 'closed';
|
|
23
|
+
/**
|
|
24
|
+
* Connect to log stream. Returns initial logs if fetchInitial=true.
|
|
25
|
+
*/
|
|
26
|
+
connect(): Promise<string[]>;
|
|
27
|
+
/**
|
|
28
|
+
* Close the WebSocket connection
|
|
29
|
+
*/
|
|
30
|
+
close(): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Get current buffer contents (bounded, oldest may be dropped)
|
|
33
|
+
*/
|
|
34
|
+
getBuffer(): string[];
|
|
35
|
+
/**
|
|
36
|
+
* Clear the buffer
|
|
37
|
+
*/
|
|
38
|
+
clearBuffer(): void;
|
|
39
|
+
/**
|
|
40
|
+
* Async iterate over NEW log lines from WebSocket
|
|
41
|
+
*/
|
|
42
|
+
[Symbol.asyncIterator](): AsyncGenerator<string>;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Stream logs until job reaches a terminal state
|
|
46
|
+
*/
|
|
47
|
+
export declare function streamLogs(client: HyperCLI, jobId: string, onLine: (line: string) => void, options?: {
|
|
48
|
+
untilState?: Set<string>;
|
|
49
|
+
pollStateInterval?: number;
|
|
50
|
+
fetchInitial?: boolean;
|
|
51
|
+
fetchFinal?: boolean;
|
|
52
|
+
maxInitialLines?: number;
|
|
53
|
+
}): Promise<void>;
|
|
54
|
+
//# sourceMappingURL=logs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../src/logs.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAO5C;;GAEG;AACH,wBAAsB,SAAS,CAC7B,MAAM,EAAE,QAAQ,EAChB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,EAAE,CAAC,CAcnB;AAED;;GAEG;AACH,qBAAa,SAAS;IAQlB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,MAAM,CAAC;IACf,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,SAAS;IAZnB,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAS;gBAGb,MAAM,EAAE,QAAQ,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,YAAA,EACf,YAAY,GAAE,OAAc,EAC5B,eAAe,GAAE,MAAkC,EACnD,SAAS,GAAE,MAA2B;IAGhD,IAAI,MAAM,IAAI,cAAc,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,CAKnE;IAED;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAsDlC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B;;OAEG;IACH,SAAS,IAAI,MAAM,EAAE;IAIrB;;OAEG;IACH,WAAW,IAAI,IAAI;IAInB;;OAEG;IACI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,cAAc,CAAC,MAAM,CAAC;CAqExD;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,QAAQ,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAC9B,OAAO,CAAC,EAAE;IACR,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GACA,OAAO,CAAC,IAAI,CAAC,CAoEf"}
|
package/dist/logs.js
ADDED
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Async log streaming for jobs using WebSocket
|
|
3
|
+
*/
|
|
4
|
+
import WebSocket from 'ws';
|
|
5
|
+
import { getWsUrl, WS_LOGS_PATH } from './config.js';
|
|
6
|
+
// Default limits to prevent memory blowup
|
|
7
|
+
const DEFAULT_MAX_INITIAL_LINES = 1000;
|
|
8
|
+
const DEFAULT_MAX_BUFFER = 5000;
|
|
9
|
+
/**
|
|
10
|
+
* Fetch logs via REST API (one-time call)
|
|
11
|
+
*/
|
|
12
|
+
export async function fetchLogs(client, jobId, tail) {
|
|
13
|
+
try {
|
|
14
|
+
const logs = await client.jobs.logs(jobId);
|
|
15
|
+
if (!logs) {
|
|
16
|
+
return [];
|
|
17
|
+
}
|
|
18
|
+
const lines = logs.trim().split('\n');
|
|
19
|
+
if (tail && lines.length > tail) {
|
|
20
|
+
return lines.slice(-tail);
|
|
21
|
+
}
|
|
22
|
+
return lines;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return [];
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Async log streamer - WebSocket streaming with optional initial fetch
|
|
30
|
+
*/
|
|
31
|
+
export class LogStream {
|
|
32
|
+
client;
|
|
33
|
+
jobId;
|
|
34
|
+
jobKey;
|
|
35
|
+
fetchInitial;
|
|
36
|
+
maxInitialLines;
|
|
37
|
+
maxBuffer;
|
|
38
|
+
ws = null;
|
|
39
|
+
buffer = [];
|
|
40
|
+
initialFetched = false;
|
|
41
|
+
connected = false;
|
|
42
|
+
closed = false;
|
|
43
|
+
constructor(client, jobId, jobKey, fetchInitial = true, maxInitialLines = DEFAULT_MAX_INITIAL_LINES, maxBuffer = DEFAULT_MAX_BUFFER) {
|
|
44
|
+
this.client = client;
|
|
45
|
+
this.jobId = jobId;
|
|
46
|
+
this.jobKey = jobKey;
|
|
47
|
+
this.fetchInitial = fetchInitial;
|
|
48
|
+
this.maxInitialLines = maxInitialLines;
|
|
49
|
+
this.maxBuffer = maxBuffer;
|
|
50
|
+
}
|
|
51
|
+
get status() {
|
|
52
|
+
if (this.closed)
|
|
53
|
+
return 'closed';
|
|
54
|
+
if (this.connected)
|
|
55
|
+
return 'connected';
|
|
56
|
+
if (this.ws)
|
|
57
|
+
return 'connecting';
|
|
58
|
+
return 'disconnected';
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Connect to log stream. Returns initial logs if fetchInitial=true.
|
|
62
|
+
*/
|
|
63
|
+
async connect() {
|
|
64
|
+
if (this.closed) {
|
|
65
|
+
throw new Error('LogStream is closed');
|
|
66
|
+
}
|
|
67
|
+
const initialLines = [];
|
|
68
|
+
// Fetch initial logs ONCE (bounded)
|
|
69
|
+
if (this.fetchInitial && !this.initialFetched) {
|
|
70
|
+
const logs = await fetchLogs(this.client, this.jobId, this.maxInitialLines);
|
|
71
|
+
for (const line of logs) {
|
|
72
|
+
this.buffer.push(line);
|
|
73
|
+
if (this.buffer.length > this.maxBuffer) {
|
|
74
|
+
this.buffer.shift(); // Remove oldest
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
initialLines.push(...logs);
|
|
78
|
+
this.initialFetched = true;
|
|
79
|
+
}
|
|
80
|
+
// Get job_key if not provided
|
|
81
|
+
if (!this.jobKey) {
|
|
82
|
+
const job = await this.client.jobs.get(this.jobId);
|
|
83
|
+
this.jobKey = job.jobKey;
|
|
84
|
+
}
|
|
85
|
+
// Connect WebSocket
|
|
86
|
+
if (this.jobKey && !this.ws) {
|
|
87
|
+
const wsUrl = getWsUrl();
|
|
88
|
+
const fullUrl = `${wsUrl}${WS_LOGS_PATH}/${this.jobKey}`;
|
|
89
|
+
await new Promise((resolve, reject) => {
|
|
90
|
+
const timeout = setTimeout(() => {
|
|
91
|
+
reject(new Error('WebSocket connection timeout'));
|
|
92
|
+
}, 30000);
|
|
93
|
+
this.ws = new WebSocket(fullUrl);
|
|
94
|
+
this.ws.on('open', () => {
|
|
95
|
+
clearTimeout(timeout);
|
|
96
|
+
this.connected = true;
|
|
97
|
+
resolve();
|
|
98
|
+
});
|
|
99
|
+
this.ws.on('error', (error) => {
|
|
100
|
+
clearTimeout(timeout);
|
|
101
|
+
reject(error);
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
return initialLines;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Close the WebSocket connection
|
|
109
|
+
*/
|
|
110
|
+
async close() {
|
|
111
|
+
this.closed = true;
|
|
112
|
+
this.connected = false;
|
|
113
|
+
if (this.ws) {
|
|
114
|
+
this.ws.close();
|
|
115
|
+
this.ws = null;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Get current buffer contents (bounded, oldest may be dropped)
|
|
120
|
+
*/
|
|
121
|
+
getBuffer() {
|
|
122
|
+
return [...this.buffer];
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Clear the buffer
|
|
126
|
+
*/
|
|
127
|
+
clearBuffer() {
|
|
128
|
+
this.buffer = [];
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Async iterate over NEW log lines from WebSocket
|
|
132
|
+
*/
|
|
133
|
+
async *[Symbol.asyncIterator]() {
|
|
134
|
+
if (!this.ws) {
|
|
135
|
+
throw new Error('Not connected. Call connect() first.');
|
|
136
|
+
}
|
|
137
|
+
const messageQueue = [];
|
|
138
|
+
let resolveNext = null;
|
|
139
|
+
let rejectNext = null;
|
|
140
|
+
this.ws.on('message', (data) => {
|
|
141
|
+
if (this.closed)
|
|
142
|
+
return;
|
|
143
|
+
try {
|
|
144
|
+
const message = JSON.parse(data.toString());
|
|
145
|
+
if (message.event === 'log' && message.log) {
|
|
146
|
+
for (const line of message.log.split('\n')) {
|
|
147
|
+
if (line) {
|
|
148
|
+
this.buffer.push(line);
|
|
149
|
+
if (this.buffer.length > this.maxBuffer) {
|
|
150
|
+
this.buffer.shift();
|
|
151
|
+
}
|
|
152
|
+
if (resolveNext) {
|
|
153
|
+
resolveNext({ done: false, value: line });
|
|
154
|
+
resolveNext = null;
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
messageQueue.push(line);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
// Ignore JSON parse errors
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
this.ws.on('close', () => {
|
|
168
|
+
this.connected = false;
|
|
169
|
+
if (resolveNext) {
|
|
170
|
+
resolveNext({ done: true, value: undefined });
|
|
171
|
+
resolveNext = null;
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
this.ws.on('error', (error) => {
|
|
175
|
+
if (rejectNext) {
|
|
176
|
+
rejectNext(error);
|
|
177
|
+
rejectNext = null;
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
while (!this.closed) {
|
|
181
|
+
if (messageQueue.length > 0) {
|
|
182
|
+
yield messageQueue.shift();
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
// Wait for next message
|
|
186
|
+
const result = await new Promise((resolve, reject) => {
|
|
187
|
+
resolveNext = resolve;
|
|
188
|
+
rejectNext = reject;
|
|
189
|
+
});
|
|
190
|
+
if (result.done) {
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
yield result.value;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Stream logs until job reaches a terminal state
|
|
200
|
+
*/
|
|
201
|
+
export async function streamLogs(client, jobId, onLine, options) {
|
|
202
|
+
const { untilState = new Set(['succeeded', 'failed', 'canceled', 'terminated']), pollStateInterval = 2000, fetchInitial = true, fetchFinal = true, maxInitialLines = DEFAULT_MAX_INITIAL_LINES, } = options || {};
|
|
203
|
+
let job = await client.jobs.get(jobId);
|
|
204
|
+
// Wait for job to be assigned/running
|
|
205
|
+
while (job.state === 'pending' || job.state === 'queued') {
|
|
206
|
+
await new Promise(resolve => setTimeout(resolve, pollStateInterval));
|
|
207
|
+
job = await client.jobs.get(jobId);
|
|
208
|
+
}
|
|
209
|
+
// Check for immediate terminal state
|
|
210
|
+
if (untilState.has(job.state)) {
|
|
211
|
+
if (fetchFinal) {
|
|
212
|
+
const logs = await fetchLogs(client, jobId, maxInitialLines);
|
|
213
|
+
for (const line of logs) {
|
|
214
|
+
onLine(line);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
// Fetch initial logs if running
|
|
220
|
+
if (fetchInitial && job.state === 'running') {
|
|
221
|
+
const logs = await fetchLogs(client, jobId, maxInitialLines);
|
|
222
|
+
for (const line of logs) {
|
|
223
|
+
onLine(line);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
// Connect WebSocket
|
|
227
|
+
if (job.jobKey) {
|
|
228
|
+
const stream = new LogStream(client, jobId, job.jobKey, false);
|
|
229
|
+
await stream.connect();
|
|
230
|
+
try {
|
|
231
|
+
// Stream logs while checking job state periodically
|
|
232
|
+
const checkInterval = setInterval(async () => {
|
|
233
|
+
job = await client.jobs.get(jobId);
|
|
234
|
+
if (untilState.has(job.state)) {
|
|
235
|
+
await stream.close();
|
|
236
|
+
}
|
|
237
|
+
}, pollStateInterval);
|
|
238
|
+
for await (const line of stream) {
|
|
239
|
+
onLine(line);
|
|
240
|
+
}
|
|
241
|
+
clearInterval(checkInterval);
|
|
242
|
+
}
|
|
243
|
+
finally {
|
|
244
|
+
await stream.close();
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
// Fetch final logs
|
|
248
|
+
if (fetchFinal) {
|
|
249
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
250
|
+
const logs = await fetchLogs(client, jobId, maxInitialLines);
|
|
251
|
+
for (const line of logs) {
|
|
252
|
+
onLine(line);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=logs.js.map
|
package/dist/logs.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../src/logs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Agent, Deployments } from './agents.js';
|
|
2
|
+
export declare const MANAGED_CONTEXT_PATHS: readonly [".hypercli/USER.md", ".hypercli/SOUL.md"];
|
|
3
|
+
export interface ManagedContext {
|
|
4
|
+
/** Missing means leave the file alone; null projects an explicitly empty profile. */
|
|
5
|
+
profile?: string | null;
|
|
6
|
+
description?: string | null;
|
|
7
|
+
}
|
|
8
|
+
export interface ManagedContextFileResult {
|
|
9
|
+
path: typeof MANAGED_CONTEXT_PATHS[number];
|
|
10
|
+
status: 'written' | 'unchanged' | 'preserved' | 'skipped' | 'failed';
|
|
11
|
+
detail?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Explicit, one-way projection. The caller must supply the authenticated account UUID.
|
|
15
|
+
* Owner deployments use Reef or the native runner's retained assignment root. No start, policy change,
|
|
16
|
+
* directory cleanup, or import back into account metadata occurs. Each PUT is atomic;
|
|
17
|
+
* the file API has no compare-and-swap or multi-file transaction.
|
|
18
|
+
*/
|
|
19
|
+
export declare function projectManagedContext(deployments: Deployments, agent: Agent, ownerUserId: string, context: ManagedContext): Promise<ManagedContextFileResult[]>;
|
|
20
|
+
//# sourceMappingURL=managed-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"managed-context.d.ts","sourceRoot":"","sources":["../src/managed-context.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAGtD,eAAO,MAAM,qBAAqB,qDAAsD,CAAC;AACzF,MAAM,WAAW,cAAc;IAC7B,qFAAqF;IACrF,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AACD,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAeD;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,wBAAwB,EAAE,CAAC,CA+DrC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { sha256 } from '@noble/hashes/sha256';
|
|
2
|
+
import { bytesToHex } from '@noble/hashes/utils';
|
|
3
|
+
import { APIError } from './errors.js';
|
|
4
|
+
export const MANAGED_CONTEXT_PATHS = ['.hypercli/USER.md', '.hypercli/SOUL.md'];
|
|
5
|
+
function digest(text) {
|
|
6
|
+
return bytesToHex(sha256(new TextEncoder().encode(text)));
|
|
7
|
+
}
|
|
8
|
+
function projection(text) {
|
|
9
|
+
return `<!-- hypercli-projection sha256:${digest(text)} -->\n${text}`;
|
|
10
|
+
}
|
|
11
|
+
function isUneditedProjection(text) {
|
|
12
|
+
const match = /^<!-- hypercli-projection sha256:([a-f0-9]{64}) -->\n/.exec(text);
|
|
13
|
+
return !!match && digest(text.slice(match[0].length)) === match[1];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Explicit, one-way projection. The caller must supply the authenticated account UUID.
|
|
17
|
+
* Owner deployments use Reef or the native runner's retained assignment root. No start, policy change,
|
|
18
|
+
* directory cleanup, or import back into account metadata occurs. Each PUT is atomic;
|
|
19
|
+
* the file API has no compare-and-swap or multi-file transaction.
|
|
20
|
+
*/
|
|
21
|
+
export async function projectManagedContext(deployments, agent, ownerUserId, context) {
|
|
22
|
+
const values = [context.profile, context.description];
|
|
23
|
+
const results = [];
|
|
24
|
+
let unavailable;
|
|
25
|
+
if (!ownerUserId || agent.userId !== ownerUserId)
|
|
26
|
+
unavailable = 'Only the owning account can project personal context.';
|
|
27
|
+
else if (!['STOPPED', 'RUNNING', 'STARTING', 'STOPPING'].includes(String(agent.state).toUpperCase())) {
|
|
28
|
+
unavailable = `Files are unavailable in ${agent.state}; retry when storage is ready.`;
|
|
29
|
+
}
|
|
30
|
+
if (!unavailable) {
|
|
31
|
+
try {
|
|
32
|
+
await deployments.waitForFileApiReady(agent, { timeoutMs: 10_000 });
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
unavailable = String(error);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
for (const [index, path] of MANAGED_CONTEXT_PATHS.entries()) {
|
|
39
|
+
const value = values[index];
|
|
40
|
+
if (value === undefined) {
|
|
41
|
+
results.push({ path, status: 'skipped', detail: 'No server value has been set.' });
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (unavailable) {
|
|
45
|
+
results.push({ path, status: 'skipped', detail: unavailable });
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
const include = agent.launchConfig?.sync_include;
|
|
49
|
+
const exclude = agent.launchConfig?.sync_exclude;
|
|
50
|
+
// Do not guess glob semantics or mutate an immutable retained-storage policy.
|
|
51
|
+
if (!agent.runner && ((Array.isArray(include) && !include.includes(path) && !include.includes('.hypercli'))
|
|
52
|
+
|| (Array.isArray(exclude) && exclude.length > 0))) {
|
|
53
|
+
results.push({ path, status: 'skipped', detail: 'Persistence policy does not explicitly cover this file. Review the retained-storage policy; existing agents cannot change it after first launch.' });
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
if (value !== null && (typeof value !== 'string' || [...value].length > 32768))
|
|
58
|
+
throw new Error('Markdown must be at most 32768 characters.');
|
|
59
|
+
const text = projection(value ?? '');
|
|
60
|
+
let current;
|
|
61
|
+
if (agent.runner) {
|
|
62
|
+
try {
|
|
63
|
+
current = await deployments.fileRead(agent, path);
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
if (!(error instanceof APIError) || error.statusCode !== 404 || error.detail !== 'Runner file not_found')
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
const root = await deployments.filesList(agent, '');
|
|
72
|
+
const directory = root.find((entry) => entry.name === '.hypercli');
|
|
73
|
+
if (directory && directory.type !== 'directory')
|
|
74
|
+
throw new Error('.hypercli is not a directory.');
|
|
75
|
+
const files = directory ? await deployments.filesList(agent, '.hypercli') : [];
|
|
76
|
+
const exists = files.some((entry) => entry.name === path.split('/')[1]);
|
|
77
|
+
current = exists ? await deployments.fileRead(agent, path) : undefined;
|
|
78
|
+
}
|
|
79
|
+
if (current === text)
|
|
80
|
+
results.push({ path, status: 'unchanged' });
|
|
81
|
+
else if (current !== undefined && !isUneditedProjection(current)) {
|
|
82
|
+
results.push({ path, status: 'preserved', detail: 'Existing user content preserved. Move it aside explicitly before projecting.' });
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
await deployments.fileWrite(agent, path, text);
|
|
86
|
+
results.push({ path, status: 'written' });
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
results.push({ path, status: 'failed', detail: String(error) });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return results;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=managed-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"managed-context.js","sourceRoot":"","sources":["../src/managed-context.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { McpServer } from '@agentclientprotocol/sdk';
|
|
2
|
+
/** Assemble explicit platform/integration and external selections for the
|
|
3
|
+
* existing launch `env` option. The host owns merging/conflict handling; the
|
|
4
|
+
* runtime owns transport support. No credentials or process env are discovered.
|
|
5
|
+
*/
|
|
6
|
+
export declare function buildAdditionalMcpEnv(...groups: readonly McpServer[][]): Record<string, string>;
|
|
7
|
+
//# sourceMappingURL=mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAE1D;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,MAAM,EAAE,SAAS,SAAS,EAAE,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAE/F"}
|
package/dist/mcp.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Assemble explicit platform/integration and external selections for the
|
|
2
|
+
* existing launch `env` option. The host owns merging/conflict handling; the
|
|
3
|
+
* runtime owns transport support. No credentials or process env are discovered.
|
|
4
|
+
*/
|
|
5
|
+
export function buildAdditionalMcpEnv(...groups) {
|
|
6
|
+
return { HYPER_ADDITIONAL_MCP_SERVERS: JSON.stringify(groups.flat()) };
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=mcp.js.map
|
package/dist/mcp.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAG,MAA8B;IACrE,OAAO,EAAE,4BAA4B,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;AACzE,CAAC"}
|