@hydracept/sdk 0.2.3 → 0.3.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/CHANGELOG.md +6 -0
- package/README.md +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/jobs.d.ts +22 -0
- package/dist/jobs.d.ts.map +1 -0
- package/dist/jobs.js +115 -0
- package/dist/panel-types.d.ts +1 -0
- package/dist/panel-types.d.ts.map +1 -1
- package/dist/panels.d.ts +1 -1
- package/dist/panels.d.ts.map +1 -1
- package/dist/panels.js +3 -2
- package/dist/runtime.d.ts +8 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +41 -0
- package/dist/workspace.d.ts +17 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +54 -0
- package/package.json +8 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.3.1 — 2026-08-26
|
|
4
|
+
|
|
5
|
+
- Job downloads compare receipt SHA-256 as hex (`sha256:<hex>` prefix is stripped)
|
|
6
|
+
- High-level submit omits stale `execution.quoteId` / `estimateId`
|
|
7
|
+
- Audio downloads add `.ogg` when the receipt has no filename
|
|
8
|
+
|
|
3
9
|
## 0.2.3 — 2026-08-13
|
|
4
10
|
|
|
5
11
|
- Pinned Execution: `createPinnedInference`, `getPinnedReceipt`, `listPinnedReceipts`
|
package/README.md
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -22,4 +22,7 @@ export type HydraceptClient = {
|
|
|
22
22
|
panels: ReturnType<typeof createHydraceptPanelsApi>;
|
|
23
23
|
};
|
|
24
24
|
export declare function createHydraceptClient(options: HydraceptClientOptions): HydraceptClient;
|
|
25
|
+
export { HydraceptWorkspace } from './workspace.js';
|
|
26
|
+
export { createHydraceptJobRunner } from './jobs.js';
|
|
27
|
+
export type { HydraceptJobRunner, HydraceptJobRunResult } from './jobs.js';
|
|
25
28
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEzD,YAAY,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACpG,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzD,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzD,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,YAAY,EACV,2BAA2B,EAC3B,mBAAmB,EACnB,0BAA0B,EAC1B,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAChD,YAAY,EACV,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC;IACtD,OAAO,EAAE,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC;IACtD,MAAM,EAAE,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC;CACrD,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,eAAe,CAQtF"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEzD,YAAY,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACpG,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzD,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzD,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,YAAY,EACV,2BAA2B,EAC3B,mBAAmB,EACnB,0BAA0B,EAC1B,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAChD,YAAY,EACV,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC;IACtD,OAAO,EAAE,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC;IACtD,MAAM,EAAE,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC;CACrD,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,eAAe,CAQtF;AAED,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AACrD,YAAY,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/jobs.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { HydraceptClient } from './index.js';
|
|
2
|
+
export type HydraceptJobBinding = {
|
|
3
|
+
projectId: string;
|
|
4
|
+
environment?: string;
|
|
5
|
+
};
|
|
6
|
+
export type HydraceptJobRunResult = {
|
|
7
|
+
jobId: string;
|
|
8
|
+
status: string;
|
|
9
|
+
job: Record<string, unknown>;
|
|
10
|
+
receipt: Record<string, unknown> | null;
|
|
11
|
+
downloads: string[];
|
|
12
|
+
nextAction: string;
|
|
13
|
+
};
|
|
14
|
+
export type HydraceptJobRunner = {
|
|
15
|
+
run(capabilityKey: string, body: Record<string, unknown>, options?: {
|
|
16
|
+
downloadDir?: string;
|
|
17
|
+
pollMs?: number;
|
|
18
|
+
}): Promise<HydraceptJobRunResult>;
|
|
19
|
+
};
|
|
20
|
+
export declare function normalizeSha256Digest(value: string | undefined | null): string;
|
|
21
|
+
export declare function createHydraceptJobRunner(client: HydraceptClient, binding: HydraceptJobBinding): HydraceptJobRunner;
|
|
22
|
+
//# sourceMappingURL=jobs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../src/jobs.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAWF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,GAAG,CACD,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAClD,OAAO,CAAC,qBAAqB,CAAC,CAAC;CACnC,CAAC;AAmBF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAI9E;AAyBD,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,eAAe,EACvB,OAAO,EAAE,mBAAmB,GAC3B,kBAAkB,CA+DpB"}
|
package/dist/jobs.js
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
function nextActionForJob(job) {
|
|
5
|
+
const status = String(job.status || '').toLowerCase();
|
|
6
|
+
const artifacts = job.artifacts;
|
|
7
|
+
const hasArtifacts = Array.isArray(artifacts) && artifacts.length > 0;
|
|
8
|
+
if (['queued', 'running', 'awaiting_approval', 'canceling'].includes(status))
|
|
9
|
+
return 'poll';
|
|
10
|
+
if (status === 'succeeded')
|
|
11
|
+
return hasArtifacts ? 'download' : 'receipt';
|
|
12
|
+
return 'done';
|
|
13
|
+
}
|
|
14
|
+
function sleep(ms) {
|
|
15
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
16
|
+
}
|
|
17
|
+
const MEDIA_EXTENSIONS = {
|
|
18
|
+
'audio/ogg': '.ogg',
|
|
19
|
+
'application/ogg': '.ogg',
|
|
20
|
+
'audio/wav': '.wav',
|
|
21
|
+
'audio/mpeg': '.mp3',
|
|
22
|
+
'image/png': '.png',
|
|
23
|
+
'image/jpeg': '.jpg',
|
|
24
|
+
'image/webp': '.webp',
|
|
25
|
+
'model/gltf-binary': '.glb',
|
|
26
|
+
'video/mp4': '.mp4',
|
|
27
|
+
'application/json': '.json',
|
|
28
|
+
};
|
|
29
|
+
export function normalizeSha256Digest(value) {
|
|
30
|
+
let raw = String(value || '').trim().toLowerCase();
|
|
31
|
+
if (raw.startsWith('sha256:'))
|
|
32
|
+
raw = raw.slice(7);
|
|
33
|
+
return raw;
|
|
34
|
+
}
|
|
35
|
+
function filenameForDownload(item, artifactId) {
|
|
36
|
+
const media = String(item.mediaType || item.mimeType || '')
|
|
37
|
+
.split(';')[0]
|
|
38
|
+
.trim()
|
|
39
|
+
.toLowerCase();
|
|
40
|
+
let name = String(item.filename || item.label || artifactId || 'artifact')
|
|
41
|
+
.replace(/\\/g, '/')
|
|
42
|
+
.split('/')
|
|
43
|
+
.pop() || 'artifact';
|
|
44
|
+
const ext = MEDIA_EXTENSIONS[media];
|
|
45
|
+
if (ext && !name.toLowerCase().endsWith(ext))
|
|
46
|
+
name = `${name}${ext}`;
|
|
47
|
+
return name;
|
|
48
|
+
}
|
|
49
|
+
function omitStaleQuoteIds(body) {
|
|
50
|
+
const execution = body.execution;
|
|
51
|
+
if (!execution || typeof execution !== 'object')
|
|
52
|
+
return body;
|
|
53
|
+
const cleaned = { ...execution };
|
|
54
|
+
delete cleaned.quoteId;
|
|
55
|
+
delete cleaned.estimateId;
|
|
56
|
+
return { ...body, execution: cleaned };
|
|
57
|
+
}
|
|
58
|
+
export function createHydraceptJobRunner(client, binding) {
|
|
59
|
+
return {
|
|
60
|
+
async run(capabilityKey, body, options = {}) {
|
|
61
|
+
const payload = omitStaleQuoteIds({
|
|
62
|
+
...body,
|
|
63
|
+
context: {
|
|
64
|
+
productId: binding.projectId,
|
|
65
|
+
projectId: binding.projectId,
|
|
66
|
+
environment: binding.environment || 'development',
|
|
67
|
+
...(body.context ?? {}),
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
const submitted = (await client.runtime.submitCapabilityJob(capabilityKey, payload));
|
|
71
|
+
const jobId = String(submitted.jobId || submitted.id || '');
|
|
72
|
+
if (!jobId)
|
|
73
|
+
throw new Error('No jobId in submit response');
|
|
74
|
+
const deadline = Date.now() + (options.pollMs ?? 120_000);
|
|
75
|
+
let job = submitted;
|
|
76
|
+
let status = String(submitted.status || 'queued');
|
|
77
|
+
while (Date.now() < deadline) {
|
|
78
|
+
job = (await client.runtime.getJob(jobId));
|
|
79
|
+
status = String(job.status || 'unknown');
|
|
80
|
+
if (['succeeded', 'failed', 'canceled', 'cancelled'].includes(status))
|
|
81
|
+
break;
|
|
82
|
+
await sleep(2000);
|
|
83
|
+
}
|
|
84
|
+
let receipt = null;
|
|
85
|
+
if (status === 'succeeded') {
|
|
86
|
+
receipt = (await client.runtime.getJobReceipt(jobId));
|
|
87
|
+
}
|
|
88
|
+
const downloads = [];
|
|
89
|
+
if (options.downloadDir && status === 'succeeded' && receipt) {
|
|
90
|
+
const artifacts = receipt.artifacts || [];
|
|
91
|
+
for (const item of artifacts) {
|
|
92
|
+
const artifactId = String(item.artifactId || item.id || '');
|
|
93
|
+
if (!artifactId)
|
|
94
|
+
continue;
|
|
95
|
+
const buffer = await client.http.fetchBytes(`/jobs/${encodeURIComponent(jobId)}/artifacts/${encodeURIComponent(artifactId)}`);
|
|
96
|
+
const bytes = new Uint8Array(buffer);
|
|
97
|
+
const nested = item.digest && typeof item.digest === 'object'
|
|
98
|
+
? item.digest
|
|
99
|
+
: {};
|
|
100
|
+
const expected = normalizeSha256Digest(String(item.sha256 || nested.sha256 || ''));
|
|
101
|
+
const actual = createHash('sha256').update(bytes).digest('hex');
|
|
102
|
+
if (expected && expected !== actual) {
|
|
103
|
+
throw new Error(`SHA-256 mismatch for ${artifactId}`);
|
|
104
|
+
}
|
|
105
|
+
const filename = filenameForDownload(item, artifactId);
|
|
106
|
+
const target = join(options.downloadDir, filename);
|
|
107
|
+
mkdirSync(dirname(target), { recursive: true });
|
|
108
|
+
writeFileSync(target, bytes);
|
|
109
|
+
downloads.push(target);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return { jobId, status, job, receipt, downloads, nextAction: nextActionForJob(job) };
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
}
|
package/dist/panel-types.d.ts
CHANGED
|
@@ -20,6 +20,7 @@ export interface PanelDefinitionView {
|
|
|
20
20
|
readonly displayName: string;
|
|
21
21
|
readonly status: string;
|
|
22
22
|
readonly origin?: 'hydracept' | 'project';
|
|
23
|
+
readonly projectId?: string | null;
|
|
23
24
|
readonly currentVersion?: PanelDefinitionVersionView;
|
|
24
25
|
}
|
|
25
26
|
/** GET /v1/panel-definitions list envelope. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"panel-types.d.ts","sourceRoot":"","sources":["../src/panel-types.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAE7E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;CACnE;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,cAAc,CAAC,EAAE,0BAA0B,CAAC;CACtD;AAED,+CAA+C;AAC/C,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,WAAW,EAAE,SAAS,mBAAmB,EAAE,CAAC;CACtD;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B"}
|
|
1
|
+
{"version":3,"file":"panel-types.d.ts","sourceRoot":"","sources":["../src/panel-types.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAE7E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;CACnE;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,cAAc,CAAC,EAAE,0BAA0B,CAAC;CACtD;AAED,+CAA+C;AAC/C,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,WAAW,EAAE,SAAS,mBAAmB,EAAE,CAAC;CACtD;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B"}
|
package/dist/panels.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import type { PanelDefinitionListResponse, PanelDefinitionView, PanelSessionCrea
|
|
|
3
3
|
/** Panel definition and session helpers for hosted panels and embed integrations. */
|
|
4
4
|
export declare function createHydraceptPanelsApi(http: HydraceptHttp): {
|
|
5
5
|
createPanelDefinition<T = PanelDefinitionView>(body: unknown, init?: RequestInit): Promise<T>;
|
|
6
|
-
listPanelDefinitions(): Promise<PanelDefinitionListResponse>;
|
|
6
|
+
listPanelDefinitions(projectId?: string): Promise<PanelDefinitionListResponse>;
|
|
7
7
|
getPanelDefinition<T = unknown>(definitionId: string): Promise<T>;
|
|
8
8
|
patchPanelDefinition<T = unknown>(definitionId: string, body: unknown, init?: RequestInit): Promise<T>;
|
|
9
9
|
createPanelSession(body: unknown, init?: RequestInit): Promise<PanelSessionCreated>;
|
package/dist/panels.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"panels.d.ts","sourceRoot":"","sources":["../src/panels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,KAAK,EACV,2BAA2B,EAC3B,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,kBAAkB,CAAC;AAE1B,qFAAqF;AACrF,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,aAAa;0BAElC,CAAC,8BAA8B,OAAO,SAAQ,WAAW,GAAQ,OAAO,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"panels.d.ts","sourceRoot":"","sources":["../src/panels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,KAAK,EACV,2BAA2B,EAC3B,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,kBAAkB,CAAC;AAE1B,qFAAqF;AACrF,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,aAAa;0BAElC,CAAC,8BAA8B,OAAO,SAAQ,WAAW,GAAQ,OAAO,CAAC,CAAC,CAAC;qCAQhE,MAAM,GAAG,OAAO,CAAC,2BAA2B,CAAC;uBAK3D,CAAC,0BAA0B,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;yBAI5C,CAAC,0BACN,MAAM,QACd,OAAO,SACP,WAAW,GAChB,OAAO,CAAC,CAAC,CAAC;6BAQY,OAAO,SAAQ,WAAW,GAAQ,OAAO,CAAC,mBAAmB,CAAC;oBAQvE,CAAC,uBAAuB,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;uBAIxC,CAAC,uBAAuB,MAAM,SAAQ,WAAW,GAAQ,OAAO,CAAC,CAAC,CAAC;0BAOhE,CAAC,uBAAuB,MAAM,SAAQ,WAAW,GAAQ,OAAO,CAAC,CAAC,CAAC;sBAUvE,CAAC,mBAAkB,WAAW,GAAQ,OAAO,CAAC,CAAC,CAAC;4BAI1C,CAAC,kBAAkB,OAAO,SAAQ,WAAW,GAAQ,OAAO,CAAC,CAAC,CAAC;EAQ1F;AAED,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC"}
|
package/dist/panels.js
CHANGED
|
@@ -8,8 +8,9 @@ export function createHydraceptPanelsApi(http) {
|
|
|
8
8
|
...init,
|
|
9
9
|
});
|
|
10
10
|
},
|
|
11
|
-
listPanelDefinitions() {
|
|
12
|
-
|
|
11
|
+
listPanelDefinitions(projectId) {
|
|
12
|
+
const suffix = projectId ? `?projectId=${encodeURIComponent(projectId)}` : '';
|
|
13
|
+
return http.fetchJson(`/panel-definitions${suffix}`);
|
|
13
14
|
},
|
|
14
15
|
getPanelDefinition(definitionId) {
|
|
15
16
|
return http.fetchJson(`/panel-definitions/${encodeURIComponent(definitionId)}`);
|
package/dist/runtime.d.ts
CHANGED
|
@@ -11,6 +11,14 @@ export declare function createHydraceptRuntimeApi(http: HydraceptHttp): {
|
|
|
11
11
|
getJobResult<T = unknown>(jobId: string): Promise<T>;
|
|
12
12
|
getCapabilities<T = unknown>(): Promise<T>;
|
|
13
13
|
describeCapability<T = unknown>(key: string): Promise<T>;
|
|
14
|
+
resolveCapability<T = unknown>(body: unknown): Promise<T>;
|
|
15
|
+
estimateCapability<T = unknown>(key: string, body: unknown): Promise<T>;
|
|
16
|
+
quoteCapability<T = unknown>(key: string, body: unknown): Promise<T>;
|
|
17
|
+
createCapabilityRequest<T = unknown>(body: unknown): Promise<T>;
|
|
18
|
+
reviseCapabilityRequest<T = unknown>(requestId: string, body: unknown): Promise<T>;
|
|
19
|
+
submitCapabilityRequest<T = unknown>(requestId: string): Promise<T>;
|
|
20
|
+
getCapabilityRequest<T = unknown>(requestId: string): Promise<T>;
|
|
21
|
+
getCapabilityRequestQuote<T = unknown>(requestId: string): Promise<T>;
|
|
14
22
|
invokeCapability<T = unknown>(key: string, body: unknown, init?: RequestInit): Promise<T>;
|
|
15
23
|
submitCapabilityJob<T = unknown>(key: string, body: unknown, init?: RequestInit): Promise<T>;
|
|
16
24
|
createComparison<T = unknown>(key: string, body: unknown): Promise<T>;
|
package/dist/runtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExD,0EAA0E;AAC1E,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,aAAa;WAElD,CAAC,kBAAkB,OAAO,SAAQ,WAAW,GAAQ,OAAO,CAAC,CAAC,CAAC;kBAQxD,CAAC,yBAAyB,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;eAIhD,CAAC,yBAAyB,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;qBAIvC,CAAC,yBAAyB,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;cAMpD,CAAC,kBAAkB,OAAO,SAAQ,WAAW,GAAQ,OAAO,CAAC,CAAC,CAAC;WAQlE,CAAC,mBAAmB,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;iBAIjC,CAAC,mBAAmB,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;oBAIpC,CAAC,eAAe,OAAO,CAAC,CAAC,CAAC;uBAIvB,CAAC,iBAAiB,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime.js
CHANGED
|
@@ -39,6 +39,47 @@ export function createHydraceptRuntimeApi(http) {
|
|
|
39
39
|
describeCapability(key) {
|
|
40
40
|
return http.fetchJson(`/capabilities/${encodeURIComponent(key)}`);
|
|
41
41
|
},
|
|
42
|
+
resolveCapability(body) {
|
|
43
|
+
return http.fetchJson('/capabilities/resolve', {
|
|
44
|
+
method: 'POST',
|
|
45
|
+
body: JSON.stringify(body),
|
|
46
|
+
});
|
|
47
|
+
},
|
|
48
|
+
estimateCapability(key, body) {
|
|
49
|
+
return http.fetchJson(`/capabilities/${encodeURIComponent(key)}/quote`, {
|
|
50
|
+
method: 'POST',
|
|
51
|
+
body: JSON.stringify(body),
|
|
52
|
+
});
|
|
53
|
+
},
|
|
54
|
+
quoteCapability(key, body) {
|
|
55
|
+
return http.fetchJson(`/capabilities/${encodeURIComponent(key)}/quote`, {
|
|
56
|
+
method: 'POST',
|
|
57
|
+
body: JSON.stringify(body),
|
|
58
|
+
});
|
|
59
|
+
},
|
|
60
|
+
createCapabilityRequest(body) {
|
|
61
|
+
return http.fetchJson('/capability-requests', {
|
|
62
|
+
method: 'POST',
|
|
63
|
+
body: JSON.stringify(body),
|
|
64
|
+
});
|
|
65
|
+
},
|
|
66
|
+
reviseCapabilityRequest(requestId, body) {
|
|
67
|
+
return http.fetchJson(`/capability-requests/${encodeURIComponent(requestId)}/revisions`, {
|
|
68
|
+
method: 'POST',
|
|
69
|
+
body: JSON.stringify(body),
|
|
70
|
+
});
|
|
71
|
+
},
|
|
72
|
+
submitCapabilityRequest(requestId) {
|
|
73
|
+
return http.fetchJson(`/capability-requests/${encodeURIComponent(requestId)}/submit`, {
|
|
74
|
+
method: 'POST',
|
|
75
|
+
});
|
|
76
|
+
},
|
|
77
|
+
getCapabilityRequest(requestId) {
|
|
78
|
+
return http.fetchJson(`/capability-requests/${encodeURIComponent(requestId)}`);
|
|
79
|
+
},
|
|
80
|
+
getCapabilityRequestQuote(requestId) {
|
|
81
|
+
return http.fetchJson(`/capability-requests/${encodeURIComponent(requestId)}/quote`);
|
|
82
|
+
},
|
|
42
83
|
invokeCapability(key, body, init = {}) {
|
|
43
84
|
return http.fetchJson(`/capabilities/${encodeURIComponent(key)}/invoke`, {
|
|
44
85
|
method: 'POST',
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type HydraceptJobRunner } from './jobs.js';
|
|
2
|
+
import type { HydraceptClient } from './index.js';
|
|
3
|
+
export type HydraceptWorkspaceBinding = {
|
|
4
|
+
schemaVersion?: string;
|
|
5
|
+
projectId: string;
|
|
6
|
+
environment?: string;
|
|
7
|
+
apiOrigin?: string;
|
|
8
|
+
};
|
|
9
|
+
export declare class HydraceptWorkspace {
|
|
10
|
+
readonly client: HydraceptClient;
|
|
11
|
+
readonly jobs: HydraceptJobRunner;
|
|
12
|
+
readonly root: string;
|
|
13
|
+
readonly binding: HydraceptWorkspaceBinding;
|
|
14
|
+
private constructor();
|
|
15
|
+
static open(root?: string): HydraceptWorkspace;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=workspace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAMA,OAAO,EAA4B,KAAK,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,MAAM,yBAAyB,GAAG;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,qBAAa,kBAAkB;IAC7B,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,yBAAyB,CAAC;IAE5C,OAAO;IAYP,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,kBAAkB;CAqC/C"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { join, resolve } from 'node:path';
|
|
3
|
+
import { createHydraceptHttp } from './http.js';
|
|
4
|
+
import { createHydraceptControlApi } from './control.js';
|
|
5
|
+
import { createHydraceptPanelsApi } from './panels.js';
|
|
6
|
+
import { createHydraceptRuntimeApi } from './runtime.js';
|
|
7
|
+
import { createHydraceptJobRunner } from './jobs.js';
|
|
8
|
+
export class HydraceptWorkspace {
|
|
9
|
+
client;
|
|
10
|
+
jobs;
|
|
11
|
+
root;
|
|
12
|
+
binding;
|
|
13
|
+
constructor(root, binding, client, jobs) {
|
|
14
|
+
this.root = root;
|
|
15
|
+
this.binding = binding;
|
|
16
|
+
this.client = client;
|
|
17
|
+
this.jobs = jobs;
|
|
18
|
+
}
|
|
19
|
+
static open(root) {
|
|
20
|
+
const projectRoot = resolve(root ?? process.cwd());
|
|
21
|
+
const bindingPath = join(projectRoot, '.hydracept', 'project.json');
|
|
22
|
+
if (!existsSync(bindingPath)) {
|
|
23
|
+
throw new Error('Missing .hydracept/project.json — run python -m hydracept init');
|
|
24
|
+
}
|
|
25
|
+
const binding = JSON.parse(readFileSync(bindingPath, 'utf8'));
|
|
26
|
+
if (!binding.projectId) {
|
|
27
|
+
throw new Error('project.json is missing projectId');
|
|
28
|
+
}
|
|
29
|
+
const envProject = process.env.HYDRACEPT_PROJECT || process.env.HYDRACEPT_PROJECT_ID;
|
|
30
|
+
if (envProject && envProject !== binding.projectId) {
|
|
31
|
+
throw new Error(`HYDRACEPT_PROJECT=${envProject} disagrees with project.json projectId=${binding.projectId}`);
|
|
32
|
+
}
|
|
33
|
+
const secretsPath = join(projectRoot, '.hydracept', 'secrets.json');
|
|
34
|
+
const secrets = existsSync(secretsPath)
|
|
35
|
+
? JSON.parse(readFileSync(secretsPath, 'utf8'))
|
|
36
|
+
: {};
|
|
37
|
+
const token = process.env.HYDRACEPT_API_KEY || secrets.apiKey || secrets.token;
|
|
38
|
+
if (!token) {
|
|
39
|
+
throw new Error('No workspace API key in secrets.json');
|
|
40
|
+
}
|
|
41
|
+
const http = createHydraceptHttp({
|
|
42
|
+
baseUrl: binding.apiOrigin || 'https://api.hydracept.com',
|
|
43
|
+
token,
|
|
44
|
+
});
|
|
45
|
+
const client = {
|
|
46
|
+
http,
|
|
47
|
+
control: createHydraceptControlApi(http),
|
|
48
|
+
runtime: createHydraceptRuntimeApi(http),
|
|
49
|
+
panels: createHydraceptPanelsApi(http),
|
|
50
|
+
};
|
|
51
|
+
const jobs = createHydraceptJobRunner(client, binding);
|
|
52
|
+
return new HydraceptWorkspace(projectRoot, binding, client, jobs);
|
|
53
|
+
}
|
|
54
|
+
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hydracept/sdk",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "TypeScript client for Hydracept —
|
|
3
|
+
"version": "0.3.1",
|
|
4
|
+
"description": "TypeScript client for Hydracept — production-ready game assets, with a receipt for every run.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
@@ -33,7 +33,12 @@
|
|
|
33
33
|
"unreal",
|
|
34
34
|
"ai",
|
|
35
35
|
"llm",
|
|
36
|
+
"mcp",
|
|
36
37
|
"image-generation",
|
|
38
|
+
"sprite-sheet",
|
|
39
|
+
"transparent-png",
|
|
40
|
+
"reference-image",
|
|
41
|
+
"multi-provider",
|
|
37
42
|
"audio",
|
|
38
43
|
"byok",
|
|
39
44
|
"api",
|
|
@@ -57,6 +62,7 @@
|
|
|
57
62
|
"provenance": false
|
|
58
63
|
},
|
|
59
64
|
"devDependencies": {
|
|
65
|
+
"@types/node": "^22.10.0",
|
|
60
66
|
"typescript": "^5.7.2"
|
|
61
67
|
}
|
|
62
68
|
}
|