@hypertabai/mcp 0.2.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/README.md +264 -0
  2. package/dist/bridge/api-client.d.ts +157 -0
  3. package/dist/bridge/api-client.d.ts.map +1 -0
  4. package/dist/bridge/api-client.js +140 -0
  5. package/dist/bridge/api-client.js.map +1 -0
  6. package/dist/bridge/artifacts.d.ts +11 -0
  7. package/dist/bridge/artifacts.d.ts.map +1 -0
  8. package/dist/bridge/artifacts.js +45 -0
  9. package/dist/bridge/artifacts.js.map +1 -0
  10. package/dist/bridge/command-contract.d.ts +14 -0
  11. package/dist/bridge/command-contract.d.ts.map +1 -0
  12. package/dist/bridge/command-contract.js +152 -0
  13. package/dist/bridge/command-contract.js.map +1 -0
  14. package/dist/bridge/index.d.ts +248 -0
  15. package/dist/bridge/index.d.ts.map +1 -0
  16. package/dist/bridge/index.js +875 -0
  17. package/dist/bridge/index.js.map +1 -0
  18. package/dist/bridge/spool.d.ts +30 -0
  19. package/dist/bridge/spool.d.ts.map +1 -0
  20. package/dist/bridge/spool.js +108 -0
  21. package/dist/bridge/spool.js.map +1 -0
  22. package/dist/connect.js +1 -1
  23. package/dist/idempotency.d.ts +11 -0
  24. package/dist/idempotency.d.ts.map +1 -0
  25. package/dist/idempotency.js +63 -0
  26. package/dist/idempotency.js.map +1 -0
  27. package/dist/index.js +5 -1
  28. package/dist/index.js.map +1 -1
  29. package/dist/install/skill-writer.d.ts +1 -1
  30. package/dist/install/skill-writer.d.ts.map +1 -1
  31. package/dist/install/skill-writer.js +21 -1
  32. package/dist/install/skill-writer.js.map +1 -1
  33. package/dist/surfaces/build.d.ts +22 -0
  34. package/dist/surfaces/build.d.ts.map +1 -0
  35. package/dist/surfaces/build.js +122 -0
  36. package/dist/surfaces/build.js.map +1 -0
  37. package/dist/surfaces/detect.d.ts +20 -0
  38. package/dist/surfaces/detect.d.ts.map +1 -0
  39. package/dist/surfaces/detect.js +130 -0
  40. package/dist/surfaces/detect.js.map +1 -0
  41. package/dist/surfaces/index.d.ts +35 -0
  42. package/dist/surfaces/index.d.ts.map +1 -0
  43. package/dist/surfaces/index.js +117 -0
  44. package/dist/surfaces/index.js.map +1 -0
  45. package/dist/surfaces/package.d.ts +48 -0
  46. package/dist/surfaces/package.d.ts.map +1 -0
  47. package/dist/surfaces/package.js +86 -0
  48. package/dist/surfaces/package.js.map +1 -0
  49. package/dist/surfaces/publish-client.d.ts +40 -0
  50. package/dist/surfaces/publish-client.d.ts.map +1 -0
  51. package/dist/surfaces/publish-client.js +111 -0
  52. package/dist/surfaces/publish-client.js.map +1 -0
  53. package/package.json +8 -3
  54. package/templates/bridge-wrapper.mjs +138 -0
  55. package/templates/bridge-wrapper.sh +78 -0
  56. package/dist/__tests__/config-writer.test.d.ts +0 -2
  57. package/dist/__tests__/config-writer.test.d.ts.map +0 -1
  58. package/dist/__tests__/config-writer.test.js +0 -186
  59. package/dist/__tests__/config-writer.test.js.map +0 -1
  60. package/dist/__tests__/index.test.d.ts +0 -2
  61. package/dist/__tests__/index.test.d.ts.map +0 -1
  62. package/dist/__tests__/index.test.js +0 -113
  63. package/dist/__tests__/index.test.js.map +0 -1
  64. package/dist/__tests__/install.test.d.ts +0 -2
  65. package/dist/__tests__/install.test.d.ts.map +0 -1
  66. package/dist/__tests__/install.test.js +0 -211
  67. package/dist/__tests__/install.test.js.map +0 -1
  68. package/dist/__tests__/platforms.test.d.ts +0 -2
  69. package/dist/__tests__/platforms.test.d.ts.map +0 -1
  70. package/dist/__tests__/platforms.test.js +0 -109
  71. package/dist/__tests__/platforms.test.js.map +0 -1
  72. package/dist/__tests__/uninstall.test.d.ts +0 -2
  73. package/dist/__tests__/uninstall.test.d.ts.map +0 -1
  74. package/dist/__tests__/uninstall.test.js +0 -117
  75. package/dist/__tests__/uninstall.test.js.map +0 -1
@@ -0,0 +1,20 @@
1
+ export type SurfaceFramework = 'vite-react' | 'vite' | 'astro-static' | 'plain-static' | 'unsupported-server' | 'unknown';
2
+ export interface SurfaceProjectDetection {
3
+ root: string;
4
+ packageJsonPath: string | null;
5
+ packageManager: string | null;
6
+ framework: SurfaceFramework;
7
+ supported: boolean;
8
+ staticOutput: boolean;
9
+ outputDir: string;
10
+ outputExists: boolean;
11
+ outputFiles: string[];
12
+ buildCommand: string | null;
13
+ reason: string;
14
+ guidance: string | null;
15
+ }
16
+ export declare function detectSurfaceProject(input: {
17
+ directory: string;
18
+ outDir?: string;
19
+ }): Promise<SurfaceProjectDetection>;
20
+ //# sourceMappingURL=detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/surfaces/detect.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,gBAAgB,GACzB,YAAY,GACZ,MAAM,GACN,cAAc,GACd,cAAc,GACd,oBAAoB,GACpB,SAAS,CAAA;AAEZ,MAAM,WAAW,uBAAuB;IACvC,IAAI,EAAE,MAAM,CAAA;IACZ,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,SAAS,EAAE,gBAAgB,CAAA;IAC3B,SAAS,EAAE,OAAO,CAAA;IAClB,YAAY,EAAE,OAAO,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,OAAO,CAAA;IACrB,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB;AA2BD,wBAAsB,oBAAoB,CAAC,KAAK,EAAE;IACjD,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;CACf,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAuBnC"}
@@ -0,0 +1,130 @@
1
+ import { access, readFile } from 'node:fs/promises';
2
+ import { join, resolve } from 'node:path';
3
+ import fg from 'fast-glob';
4
+ const SERVER_FRAMEWORKS = new Set([
5
+ 'next',
6
+ '@sveltejs/kit',
7
+ 'nuxt',
8
+ '@remix-run/node',
9
+ '@remix-run/react',
10
+ 'express',
11
+ 'fastify',
12
+ ]);
13
+ export async function detectSurfaceProject(input) {
14
+ const root = resolve(input.directory);
15
+ const packageJson = await readPackageJson(root);
16
+ const decision = await decideFramework(root, packageJson);
17
+ const outputDir = resolve(root, input.outDir ?? decision.defaultOutputDir);
18
+ const outputFiles = await listOutputFiles(outputDir);
19
+ const staticOutput = outputFiles.includes('index.html');
20
+ const outputExists = await pathExists(outputDir);
21
+ return {
22
+ root,
23
+ packageJsonPath: packageJson ? join(root, 'package.json') : null,
24
+ packageManager: await detectPackageManager(root, packageJson),
25
+ framework: decision.framework,
26
+ supported: decision.supported,
27
+ staticOutput,
28
+ outputDir,
29
+ outputExists,
30
+ outputFiles,
31
+ buildCommand: packageJson?.scripts.build ?? null,
32
+ reason: buildReason(decision, outputExists, staticOutput, outputDir),
33
+ guidance: decision.guidance,
34
+ };
35
+ }
36
+ async function decideFramework(root, packageJson) {
37
+ if (!packageJson) {
38
+ if (await pathExists(join(root, 'index.html'))) {
39
+ return supported('plain-static', '.', 'Plain static HTML project detected.');
40
+ }
41
+ return unsupported('unknown', '.', 'No package.json or root index.html was found.', 'Create a static dashboard project, or run the command from a directory with package.json or index.html.');
42
+ }
43
+ const deps = dependencyNames(packageJson);
44
+ const serverDependency = [...SERVER_FRAMEWORKS].find((name) => deps.has(name));
45
+ if (serverDependency) {
46
+ return unsupported('unsupported-server', 'dist', `${serverDependency} looks like a server app, which Hypertab does not host in v1.`, 'Convert the dashboard to a static browser app, preferably Vite + React, and move backend work into Hypertab endpoints, tables, smart columns, or agent commands.');
47
+ }
48
+ if (deps.has('vite')) {
49
+ const framework = deps.has('react') || deps.has('@vitejs/plugin-react') ? 'vite-react' : 'vite';
50
+ return supported(framework, 'dist', `${framework} project detected.`);
51
+ }
52
+ if (deps.has('astro'))
53
+ return supported('astro-static', 'dist', 'Astro static project detected.');
54
+ if (await pathExists(join(root, 'index.html')))
55
+ return supported('plain-static', '.', 'Plain static HTML project detected.');
56
+ return unsupported('unknown', 'dist', 'No supported static dashboard framework was detected.', 'Use Vite, Astro static, or plain HTML for v1 Hypertab surface hosting.');
57
+ }
58
+ function supported(framework, defaultOutputDir, reason) {
59
+ return { framework, supported: true, defaultOutputDir, reason, guidance: null };
60
+ }
61
+ function unsupported(framework, defaultOutputDir, reason, guidance) {
62
+ return { framework, supported: false, defaultOutputDir, reason, guidance };
63
+ }
64
+ function dependencyNames(packageJson) {
65
+ return new Set([...Object.keys(packageJson.dependencies), ...Object.keys(packageJson.devDependencies)]);
66
+ }
67
+ async function readPackageJson(root) {
68
+ const path = join(root, 'package.json');
69
+ if (!(await pathExists(path)))
70
+ return null;
71
+ const raw = JSON.parse(await readFile(path, 'utf8'));
72
+ if (!raw || typeof raw !== 'object')
73
+ return null;
74
+ const record = raw;
75
+ return {
76
+ scripts: stringRecord(record.scripts),
77
+ dependencies: stringRecord(record.dependencies),
78
+ devDependencies: stringRecord(record.devDependencies),
79
+ packageManager: typeof record.packageManager === 'string' ? record.packageManager : undefined,
80
+ };
81
+ }
82
+ function stringRecord(value) {
83
+ if (!value || typeof value !== 'object')
84
+ return {};
85
+ return Object.fromEntries(Object.entries(value)
86
+ .filter((entry) => typeof entry[1] === 'string')
87
+ .map(([key, val]) => [key, val]));
88
+ }
89
+ async function detectPackageManager(root, packageJson) {
90
+ if (packageJson?.packageManager)
91
+ return packageJson.packageManager;
92
+ if (await pathExists(join(root, 'pnpm-lock.yaml')))
93
+ return 'pnpm';
94
+ if (await pathExists(join(root, 'yarn.lock')))
95
+ return 'yarn';
96
+ if (await pathExists(join(root, 'bun.lockb')))
97
+ return 'bun';
98
+ if (await pathExists(join(root, 'package-lock.json')))
99
+ return 'npm';
100
+ return null;
101
+ }
102
+ async function listOutputFiles(outputDir) {
103
+ if (!(await pathExists(outputDir)))
104
+ return [];
105
+ return fg('**/*', {
106
+ cwd: outputDir,
107
+ onlyFiles: true,
108
+ dot: false,
109
+ ignore: ['node_modules/**', '.git/**'],
110
+ });
111
+ }
112
+ function buildReason(decision, outputExists, staticOutput, outputDir) {
113
+ if (!decision.supported)
114
+ return decision.reason;
115
+ if (!outputExists)
116
+ return `${decision.reason} Static output directory does not exist yet: ${outputDir}.`;
117
+ if (!staticOutput)
118
+ return `${decision.reason} Static output is missing index.html in ${outputDir}.`;
119
+ return `${decision.reason} Static output is ready at ${outputDir}.`;
120
+ }
121
+ async function pathExists(path) {
122
+ try {
123
+ await access(path);
124
+ return true;
125
+ }
126
+ catch {
127
+ return false;
128
+ }
129
+ }
130
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/surfaces/detect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { Command } from 'commander';
2
+ export declare const DEFAULT_SURFACE_API_URL = "https://api.hypertab.ai";
3
+ export interface SurfacePublishOptions {
4
+ apiKey?: string;
5
+ apiUrl: string;
6
+ directory: string;
7
+ outDir?: string;
8
+ slug?: string;
9
+ title?: string;
10
+ buildCommand?: string;
11
+ activate: boolean;
12
+ json: boolean;
13
+ timeoutMs?: number;
14
+ }
15
+ interface RawSurfacePublishOptions {
16
+ apiKey?: string;
17
+ apiUrl: string;
18
+ dir: string;
19
+ outDir?: string;
20
+ slug?: string;
21
+ title?: string;
22
+ build?: string;
23
+ activate: boolean;
24
+ json?: boolean;
25
+ timeoutMs?: number;
26
+ }
27
+ interface SurfaceCommandDependencies {
28
+ runPublish?: (options: SurfacePublishOptions) => Promise<number>;
29
+ exit?: (code: number) => void;
30
+ }
31
+ export declare function registerSurfacesCommand(program: Command, deps?: SurfaceCommandDependencies): void;
32
+ export declare function normalizeSurfacePublishOptions(opts: RawSurfacePublishOptions): SurfacePublishOptions;
33
+ export declare function runSurfacePublish(options: SurfacePublishOptions): Promise<number>;
34
+ export {};
35
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/surfaces/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAWxC,eAAO,MAAM,uBAAuB,4BAA4B,CAAA;AAEhE,MAAM,WAAW,qBAAqB;IACrC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,OAAO,CAAA;IACjB,IAAI,EAAE,OAAO,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,UAAU,wBAAwB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,OAAO,CAAA;IACjB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,UAAU,0BAA0B;IACnC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IAChE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAC7B;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,GAAE,0BAA+B,GAAG,IAAI,CA+BrG;AAED,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,wBAAwB,GAAG,qBAAqB,CAapG;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CA6DvF"}
@@ -0,0 +1,117 @@
1
+ import { runSurfaceBuildAndValidate } from './build.js';
2
+ import { detectSurfaceProject } from './detect.js';
3
+ import { createSurfacePublishBundle } from './package.js';
4
+ import { DEFAULT_SURFACE_PUBLISH_TIMEOUT_MS, publishSurfaceBundle, resolvePublishApiKey, resolvePublishIdentity, } from './publish-client.js';
5
+ export const DEFAULT_SURFACE_API_URL = 'https://api.hypertab.ai';
6
+ export function registerSurfacesCommand(program, deps = {}) {
7
+ const runPublish = deps.runPublish ?? runSurfacePublish;
8
+ const exit = deps.exit ?? ((code) => process.exit(code));
9
+ const surfaces = program
10
+ .command('surfaces')
11
+ .description('Build and manage hosted Hypertab internal surfaces')
12
+ .showHelpAfterError();
13
+ surfaces
14
+ .command('publish')
15
+ .description('Publish a static dashboard surface to Hypertab')
16
+ .option('-k, --api-key <key>', 'Hypertab API key (ht_sk_...). Prefer HYPERTAB_API_KEY env var for safety.')
17
+ .option('-u, --api-url <url>', 'Hypertab API URL', DEFAULT_SURFACE_API_URL)
18
+ .option('-d, --dir <path>', 'Project directory to inspect and build', '.')
19
+ .option('--out-dir <path>', 'Static build output directory, for example dist')
20
+ .option('--slug <slug>', 'Hosted surface slug')
21
+ .option('--title <title>', 'Hosted surface title')
22
+ .option('--build <command>', 'Build command to run before packaging')
23
+ .option('--no-activate', 'Upload without activating the new deployment')
24
+ .option('--json', 'Print machine-readable JSON output for agents')
25
+ .option('--timeout-ms <ms>', 'Publish API request timeout in milliseconds', parsePositiveIntOption, DEFAULT_SURFACE_PUBLISH_TIMEOUT_MS)
26
+ .action(async (opts) => {
27
+ const code = await runPublish(normalizeSurfacePublishOptions(opts));
28
+ exit(code);
29
+ });
30
+ }
31
+ export function normalizeSurfacePublishOptions(opts) {
32
+ return {
33
+ apiKey: opts.apiKey,
34
+ apiUrl: opts.apiUrl,
35
+ directory: opts.dir,
36
+ outDir: opts.outDir,
37
+ slug: opts.slug,
38
+ title: opts.title,
39
+ buildCommand: opts.build,
40
+ activate: opts.activate,
41
+ json: opts.json ?? false,
42
+ timeoutMs: opts.timeoutMs ?? DEFAULT_SURFACE_PUBLISH_TIMEOUT_MS,
43
+ };
44
+ }
45
+ export async function runSurfacePublish(options) {
46
+ const detection = await detectSurfaceProject({ directory: options.directory, outDir: options.outDir });
47
+ if (!detection.supported) {
48
+ writeFailure(options, 'SURFACE_PROJECT_UNSUPPORTED', detection.reason, { guidance: detection.guidance });
49
+ return 2;
50
+ }
51
+ const build = await runSurfaceBuildAndValidate({
52
+ directory: options.directory,
53
+ outDir: options.outDir,
54
+ buildCommand: options.buildCommand,
55
+ detection,
56
+ });
57
+ if (!build.ok) {
58
+ writeFailure(options, build.errorCode ?? 'SURFACE_BUILD_FAILED', build.message, {
59
+ stderr: build.stderr || undefined,
60
+ });
61
+ return 2;
62
+ }
63
+ const bundle = await createSurfacePublishBundle({ build });
64
+ const apiKey = resolvePublishApiKey({ apiKey: options.apiKey });
65
+ if (!apiKey) {
66
+ writeFailure(options, 'SURFACE_API_KEY_MISSING', 'Provide a Hypertab API key with --api-key or HYPERTAB_API_KEY. It must start with ht_sk_.');
67
+ return 2;
68
+ }
69
+ const identity = resolvePublishIdentity({ slug: options.slug, title: options.title, root: build.detection.root });
70
+ const published = await publishSurfaceBundle({
71
+ apiUrl: options.apiUrl,
72
+ apiKey,
73
+ slug: identity.slug,
74
+ title: identity.title,
75
+ activate: options.activate,
76
+ bundle,
77
+ timeoutMs: options.timeoutMs,
78
+ });
79
+ if (!published.ok) {
80
+ writeFailure(options, published.code, published.message, { status: published.status, details: published.details });
81
+ return 2;
82
+ }
83
+ if (options.json) {
84
+ process.stdout.write(`${JSON.stringify({ success: true, data: published.data, meta: { slug: identity.slug, content_hash: bundle.contentHash } })}\n`);
85
+ return 0;
86
+ }
87
+ process.stdout.write([
88
+ `Published Hypertab surface '${identity.slug}'.`,
89
+ `Files: ${bundle.files.length}`,
90
+ `Bytes: ${bundle.totalBytes}`,
91
+ `Content hash: ${bundle.contentHash}`,
92
+ '',
93
+ ].join('\n'));
94
+ return 0;
95
+ }
96
+ function parsePositiveIntOption(value) {
97
+ const parsed = Number.parseInt(value, 10);
98
+ if (!Number.isInteger(parsed) || parsed <= 0)
99
+ throw new Error(`Expected a positive integer, received '${value}'.`);
100
+ return parsed;
101
+ }
102
+ function writeFailure(options, code, message, details) {
103
+ if (options.json) {
104
+ process.stdout.write(`${JSON.stringify({ success: false, error: { code, message, details } })}\n`);
105
+ return;
106
+ }
107
+ process.stderr.write([
108
+ `Error: ${message}`,
109
+ `Code: ${code}`,
110
+ details?.stderr ? `stderr:\n${details.stderr}` : null,
111
+ details?.guidance ? `Guidance: ${details.guidance}` : null,
112
+ '',
113
+ ]
114
+ .filter((line) => line !== null)
115
+ .join('\n'));
116
+ }
117
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/surfaces/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAA;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAA;AACzD,OAAO,EACN,kCAAkC,EAClC,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,GACtB,MAAM,qBAAqB,CAAA;AAE5B,MAAM,CAAC,MAAM,uBAAuB,GAAG,yBAAyB,CAAA;AAiChE,MAAM,UAAU,uBAAuB,CAAC,OAAgB,EAAE,OAAmC,EAAE;IAC9F,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,iBAAiB,CAAA;IACvD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;IAEhE,MAAM,QAAQ,GAAG,OAAO;SACtB,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,oDAAoD,CAAC;SACjE,kBAAkB,EAAE,CAAA;IAEtB,QAAQ;SACN,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,gDAAgD,CAAC;SAC7D,MAAM,CAAC,qBAAqB,EAAE,2EAA2E,CAAC;SAC1G,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,EAAE,uBAAuB,CAAC;SAC1E,MAAM,CAAC,kBAAkB,EAAE,wCAAwC,EAAE,GAAG,CAAC;SACzE,MAAM,CAAC,kBAAkB,EAAE,iDAAiD,CAAC;SAC7E,MAAM,CAAC,eAAe,EAAE,qBAAqB,CAAC;SAC9C,MAAM,CAAC,iBAAiB,EAAE,sBAAsB,CAAC;SACjD,MAAM,CAAC,mBAAmB,EAAE,uCAAuC,CAAC;SACpE,MAAM,CAAC,eAAe,EAAE,8CAA8C,CAAC;SACvE,MAAM,CAAC,QAAQ,EAAE,+CAA+C,CAAC;SACjE,MAAM,CACN,mBAAmB,EACnB,6CAA6C,EAC7C,sBAAsB,EACtB,kCAAkC,CAClC;SACA,MAAM,CAAC,KAAK,EAAE,IAA8B,EAAE,EAAE;QAChD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,8BAA8B,CAAC,IAAI,CAAC,CAAC,CAAA;QACnE,IAAI,CAAC,IAAI,CAAC,CAAA;IACX,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,IAA8B;IAC5E,OAAO;QACN,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,SAAS,EAAE,IAAI,CAAC,GAAG;QACnB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,YAAY,EAAE,IAAI,CAAC,KAAK;QACxB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,KAAK;QACxB,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,kCAAkC;KAC/D,CAAA;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAA8B;IACrE,MAAM,SAAS,GAAG,MAAM,oBAAoB,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IACtG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;QAC1B,YAAY,CAAC,OAAO,EAAE,6BAA6B,EAAE,SAAS,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAA;QACxG,OAAO,CAAC,CAAA;IACT,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,0BAA0B,CAAC;QAC9C,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,SAAS;KACT,CAAC,CAAA;IACF,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;QACf,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,IAAI,sBAAsB,EAAE,KAAK,CAAC,OAAO,EAAE;YAC/E,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,SAAS;SACjC,CAAC,CAAA;QACF,OAAO,CAAC,CAAA;IACT,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;IAC1D,MAAM,MAAM,GAAG,oBAAoB,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAC/D,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,YAAY,CACX,OAAO,EACP,yBAAyB,EACzB,2FAA2F,CAC3F,CAAA;QACD,OAAO,CAAC,CAAA;IACT,CAAC;IACD,MAAM,QAAQ,GAAG,sBAAsB,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAA;IACjH,MAAM,SAAS,GAAG,MAAM,oBAAoB,CAAC;QAC5C,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM;QACN,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,MAAM;QACN,SAAS,EAAE,OAAO,CAAC,SAAS;KAC5B,CAAC,CAAA;IACF,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;QACnB,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAA;QAClH,OAAO,CAAC,CAAA;IACT,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CACnB,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,CAC/H,CAAA;QACD,OAAO,CAAC,CAAA;IACT,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CACnB;QACC,+BAA+B,QAAQ,CAAC,IAAI,IAAI;QAChD,UAAU,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE;QAC/B,UAAU,MAAM,CAAC,UAAU,EAAE;QAC7B,iBAAiB,MAAM,CAAC,WAAW,EAAE;QACrC,EAAE;KACF,CAAC,IAAI,CAAC,IAAI,CAAC,CACZ,CAAA;IACD,OAAO,CAAC,CAAA;AACT,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAa;IAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IACzC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,KAAK,IAAI,CAAC,CAAA;IAClH,OAAO,MAAM,CAAA;AACd,CAAC;AAED,SAAS,YAAY,CAAC,OAA8B,EAAE,IAAY,EAAE,OAAe,EAAE,OAAiC;IACrH,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,CAAA;QAClG,OAAM;IACP,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CACnB;QACC,UAAU,OAAO,EAAE;QACnB,SAAS,IAAI,EAAE;QACf,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,YAAY,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI;QACrD,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,aAAa,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI;QAC1D,EAAE;KACF;SACC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC;SAC/C,IAAI,CAAC,IAAI,CAAC,CACZ,CAAA;AACF,CAAC"}
@@ -0,0 +1,48 @@
1
+ import type { SurfaceBuildValidationResult } from './build.js';
2
+ export interface SurfaceManifestAsset {
3
+ path: string;
4
+ asset_type: 'entry' | 'asset' | 'source_map' | 'preview' | 'manifest';
5
+ mime_type: string;
6
+ size_bytes: number;
7
+ content_hash: string;
8
+ cache_policy: 'immutable' | 'short' | 'none';
9
+ }
10
+ export interface SurfacePublishFile {
11
+ path: string;
12
+ content_base64: string;
13
+ mime_type: string;
14
+ asset_type: SurfaceManifestAsset['asset_type'];
15
+ content_hash: string;
16
+ }
17
+ export interface SurfacePublishManifest {
18
+ schema_version: 1;
19
+ kind: 'hosted_static';
20
+ entry_path: string;
21
+ assets: SurfaceManifestAsset[];
22
+ routes: Array<{
23
+ path: string;
24
+ entry_path: string;
25
+ }>;
26
+ actions: [];
27
+ api: {
28
+ cors_mode: 'same_origin';
29
+ allowed_origins: [];
30
+ scopes: ['observe'];
31
+ };
32
+ build: {
33
+ framework?: string;
34
+ command?: string;
35
+ output_dir?: string;
36
+ };
37
+ metadata: Record<string, unknown>;
38
+ }
39
+ export interface SurfacePublishBundle {
40
+ manifest: SurfacePublishManifest;
41
+ files: SurfacePublishFile[];
42
+ totalBytes: number;
43
+ contentHash: string;
44
+ }
45
+ export declare function createSurfacePublishBundle(input: {
46
+ build: SurfaceBuildValidationResult;
47
+ }): Promise<SurfacePublishBundle>;
48
+ //# sourceMappingURL=package.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.d.ts","sourceRoot":"","sources":["../../src/surfaces/package.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAA;AAG9D,MAAM,WAAW,oBAAoB;IACpC,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,OAAO,GAAG,OAAO,GAAG,YAAY,GAAG,SAAS,GAAG,UAAU,CAAA;IACrE,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,WAAW,GAAG,OAAO,GAAG,MAAM,CAAA;CAC5C;AAED,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,oBAAoB,CAAC,YAAY,CAAC,CAAA;IAC9C,YAAY,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,sBAAsB;IACtC,cAAc,EAAE,CAAC,CAAA;IACjB,IAAI,EAAE,eAAe,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,oBAAoB,EAAE,CAAA;IAC9B,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACnD,OAAO,EAAE,EAAE,CAAA;IACX,GAAG,EAAE;QAAE,SAAS,EAAE,aAAa,CAAC;QAAC,eAAe,EAAE,EAAE,CAAC;QAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAA;KAAE,CAAA;IAC3E,KAAK,EAAE;QACN,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,UAAU,CAAC,EAAE,MAAM,CAAA;KACnB,CAAA;IACD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACjC;AAED,MAAM,WAAW,oBAAoB;IACpC,QAAQ,EAAE,sBAAsB,CAAA;IAChC,KAAK,EAAE,kBAAkB,EAAE,CAAA;IAC3B,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;CACnB;AAED,wBAAsB,0BAA0B,CAAC,KAAK,EAAE;IACvD,KAAK,EAAE,4BAA4B,CAAA;CACnC,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAkChC"}
@@ -0,0 +1,86 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { readFile } from 'node:fs/promises';
3
+ import { join, relative, sep } from 'node:path';
4
+ import { lookup } from 'mime-types';
5
+ export async function createSurfacePublishBundle(input) {
6
+ const detection = input.build.detection;
7
+ if (!input.build.ok || !detection.staticOutput) {
8
+ throw new Error('Cannot create a publish manifest before static output is validated.');
9
+ }
10
+ const files = await Promise.all(detection.outputFiles.sort().map((path) => readPublishFile(detection, path)));
11
+ const assets = files.map((file) => ({
12
+ path: file.path,
13
+ asset_type: file.asset_type,
14
+ mime_type: file.mime_type,
15
+ size_bytes: Buffer.from(file.content_base64, 'base64').byteLength,
16
+ content_hash: file.content_hash,
17
+ cache_policy: cachePolicyFor(file.path, file.asset_type),
18
+ }));
19
+ const totalBytes = assets.reduce((sum, asset) => sum + asset.size_bytes, 0);
20
+ const contentHash = hashText(assets.map((asset) => `${asset.path}:${asset.content_hash}`).join('\n'));
21
+ return {
22
+ manifest: {
23
+ schema_version: 1,
24
+ kind: 'hosted_static',
25
+ entry_path: 'index.html',
26
+ assets,
27
+ routes: [{ path: '/', entry_path: 'index.html' }],
28
+ actions: [],
29
+ api: { cors_mode: 'same_origin', allowed_origins: [], scopes: ['observe'] },
30
+ build: buildMetadata(input.build),
31
+ metadata: { content_hash: contentHash, total_bytes: totalBytes },
32
+ },
33
+ files,
34
+ totalBytes,
35
+ contentHash,
36
+ };
37
+ }
38
+ async function readPublishFile(detection, path) {
39
+ const bytes = await readFile(join(detection.outputDir, path));
40
+ const mimeType = lookup(path) || 'application/octet-stream';
41
+ return {
42
+ path,
43
+ content_base64: bytes.toString('base64'),
44
+ mime_type: mimeType,
45
+ asset_type: assetTypeFor(path),
46
+ content_hash: hashBytes(bytes),
47
+ };
48
+ }
49
+ function assetTypeFor(path) {
50
+ if (path === 'index.html')
51
+ return 'entry';
52
+ if (path.endsWith('.map'))
53
+ return 'source_map';
54
+ if (path.endsWith('.webmanifest') || path === 'manifest.json')
55
+ return 'manifest';
56
+ return 'asset';
57
+ }
58
+ function cachePolicyFor(path, type) {
59
+ if (type === 'entry' || path.endsWith('.html'))
60
+ return 'none';
61
+ if (type === 'source_map')
62
+ return 'short';
63
+ return 'immutable';
64
+ }
65
+ function buildMetadata(build) {
66
+ const outputDir = relativeBuildOutput(build.detection);
67
+ return {
68
+ framework: build.detection.framework,
69
+ command: build.buildCommand ?? undefined,
70
+ output_dir: outputDir,
71
+ };
72
+ }
73
+ function relativeBuildOutput(detection) {
74
+ const value = relative(detection.root, detection.outputDir);
75
+ if (!value || value === '.')
76
+ return undefined;
77
+ const normalized = value.split(sep).join('/');
78
+ return normalized.startsWith('..') ? undefined : normalized;
79
+ }
80
+ function hashBytes(bytes) {
81
+ return `sha256:${createHash('sha256').update(bytes).digest('hex')}`;
82
+ }
83
+ function hashText(value) {
84
+ return `sha256:${createHash('sha256').update(value).digest('hex')}`;
85
+ }
86
+ //# sourceMappingURL=package.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.js","sourceRoot":"","sources":["../../src/surfaces/package.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { SurfacePublishBundle } from './package.js';
2
+ export declare const DEFAULT_SURFACE_PUBLISH_TIMEOUT_MS = 60000;
3
+ export interface SurfacePublishRequest {
4
+ apiUrl: string;
5
+ apiKey: string;
6
+ slug: string;
7
+ title: string;
8
+ activate: boolean;
9
+ bundle: SurfacePublishBundle;
10
+ idempotencyKey?: string;
11
+ timeoutMs?: number;
12
+ fetchImpl?: typeof fetch;
13
+ }
14
+ export interface SurfacePublishSuccess {
15
+ ok: true;
16
+ status: number;
17
+ data: unknown;
18
+ }
19
+ export interface SurfacePublishFailure {
20
+ ok: false;
21
+ status: number;
22
+ code: string;
23
+ message: string;
24
+ details?: unknown;
25
+ }
26
+ export type SurfacePublishResponse = SurfacePublishSuccess | SurfacePublishFailure;
27
+ export declare function resolvePublishIdentity(input: {
28
+ slug?: string;
29
+ title?: string;
30
+ root: string;
31
+ }): {
32
+ slug: string;
33
+ title: string;
34
+ };
35
+ export declare function resolvePublishApiKey(input: {
36
+ apiKey?: string;
37
+ env?: NodeJS.ProcessEnv;
38
+ }): string | null;
39
+ export declare function publishSurfaceBundle(input: SurfacePublishRequest): Promise<SurfacePublishResponse>;
40
+ //# sourceMappingURL=publish-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish-client.d.ts","sourceRoot":"","sources":["../../src/surfaces/publish-client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAGxD,eAAO,MAAM,kCAAkC,QAAS,CAAA;AAExD,MAAM,WAAW,qBAAqB;IACrC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,OAAO,CAAA;IACjB,MAAM,EAAE,oBAAoB,CAAA;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CACxB;AAED,MAAM,WAAW,qBAAqB;IACrC,EAAE,EAAE,IAAI,CAAA;IACR,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,OAAO,CAAA;CACb;AAED,MAAM,WAAW,qBAAqB;IACrC,EAAE,EAAE,KAAK,CAAA;IACT,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,MAAM,sBAAsB,GAAG,qBAAqB,GAAG,qBAAqB,CAAA;AAElF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAM9H;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,GAAG,MAAM,GAAG,IAAI,CAGvG;AAED,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAoExG"}
@@ -0,0 +1,111 @@
1
+ import { basename } from 'node:path';
2
+ import { buildClientOperationIdempotencyKey, OPERATION_IDEMPOTENCY_HEADER } from '../idempotency.js';
3
+ // Bundle uploads carry base64 file content, so the default is more generous than the bridge client's 30s.
4
+ export const DEFAULT_SURFACE_PUBLISH_TIMEOUT_MS = 60_000;
5
+ export function resolvePublishIdentity(input) {
6
+ const slug = input.slug ?? slugify(basename(input.root) || 'surface');
7
+ return {
8
+ slug,
9
+ title: input.title ?? titleFromSlug(slug),
10
+ };
11
+ }
12
+ export function resolvePublishApiKey(input) {
13
+ const key = input.apiKey ?? input.env?.HYPERTAB_API_KEY ?? process.env.HYPERTAB_API_KEY;
14
+ return key?.startsWith('ht_sk_') ? key : null;
15
+ }
16
+ export async function publishSurfaceBundle(input) {
17
+ const fetchImpl = input.fetchImpl ?? fetch;
18
+ const idempotencyKey = buildClientOperationIdempotencyKey({
19
+ operation: 'surface.publish',
20
+ target: input.slug,
21
+ fingerprint: `${input.bundle.contentHash}:${input.activate ? 'activate' : 'draft'}`,
22
+ providedKey: input.idempotencyKey,
23
+ });
24
+ const timeoutMs = input.timeoutMs ?? DEFAULT_SURFACE_PUBLISH_TIMEOUT_MS;
25
+ const controller = new AbortController();
26
+ let timedOut = false;
27
+ const timer = setTimeout(() => {
28
+ timedOut = true;
29
+ controller.abort();
30
+ }, timeoutMs);
31
+ let res;
32
+ let payload;
33
+ try {
34
+ res = await fetchImpl(`${input.apiUrl.replace(/\/$/, '')}/api/surfaces/publish`, {
35
+ method: 'POST',
36
+ headers: {
37
+ Authorization: `Bearer ${input.apiKey}`,
38
+ 'Content-Type': 'application/json',
39
+ [OPERATION_IDEMPOTENCY_HEADER]: idempotencyKey,
40
+ },
41
+ body: JSON.stringify({
42
+ slug: input.slug,
43
+ title: input.title,
44
+ manifest: input.bundle.manifest,
45
+ files: input.bundle.files,
46
+ source_type: 'cli',
47
+ activate: input.activate,
48
+ }),
49
+ signal: controller.signal,
50
+ });
51
+ payload = await parseResponse(res);
52
+ }
53
+ catch (error) {
54
+ if (timedOut) {
55
+ return {
56
+ ok: false,
57
+ status: 0,
58
+ code: 'SURFACE_PUBLISH_TIMEOUT',
59
+ message: `Surface publish request timed out after ${timeoutMs}ms without a response. ` +
60
+ 'The Hypertab API may be stalled. Retry the publish (the upload carries an idempotency key), or pass --timeout-ms to wait longer.',
61
+ details: { timeout_ms: timeoutMs },
62
+ };
63
+ }
64
+ return {
65
+ ok: false,
66
+ status: 0,
67
+ code: 'SURFACE_PUBLISH_UNREACHABLE',
68
+ message: error instanceof Error ? error.message : 'Surface publish request failed before receiving a response.',
69
+ };
70
+ }
71
+ finally {
72
+ clearTimeout(timer);
73
+ }
74
+ if (!res.ok || payload.success !== true) {
75
+ const errorPayload = payload;
76
+ return {
77
+ ok: false,
78
+ status: res.status,
79
+ code: errorPayload.error?.code ?? 'SURFACE_PUBLISH_API_FAILED',
80
+ message: errorPayload.error?.message ?? `Surface publish API failed with HTTP ${res.status}.`,
81
+ details: errorPayload.error?.details,
82
+ };
83
+ }
84
+ return { ok: true, status: res.status, data: payload.data };
85
+ }
86
+ async function parseResponse(res) {
87
+ const text = await res.text();
88
+ if (!text)
89
+ return {};
90
+ try {
91
+ return JSON.parse(text);
92
+ }
93
+ catch {
94
+ return { success: false, error: { code: 'SURFACE_PUBLISH_API_INVALID_JSON', message: text.slice(0, 500) } };
95
+ }
96
+ }
97
+ function slugify(value) {
98
+ const slug = value
99
+ .toLowerCase()
100
+ .replace(/[^a-z0-9]+/g, '-')
101
+ .replace(/^-+|-+$/g, '');
102
+ return slug || 'surface';
103
+ }
104
+ function titleFromSlug(slug) {
105
+ return slug
106
+ .split('-')
107
+ .filter(Boolean)
108
+ .map((part) => `${part.slice(0, 1).toUpperCase()}${part.slice(1)}`)
109
+ .join(' ');
110
+ }
111
+ //# sourceMappingURL=publish-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish-client.js","sourceRoot":"","sources":["../../src/surfaces/publish-client.ts"],"names":[],"mappings":"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"}