@llmindset/hf-mcp 0.2.32 → 0.2.34

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 (91) hide show
  1. package/dist/docs-search/docs-semantic-search.d.ts +2 -2
  2. package/dist/docs-search/docs-semantic-search.d.ts.map +1 -1
  3. package/dist/docs-search/docs-semantic-search.js +56 -21
  4. package/dist/docs-search/docs-semantic-search.js.map +1 -1
  5. package/dist/hf-api-call.d.ts.map +1 -1
  6. package/dist/hf-api-call.js +4 -0
  7. package/dist/hf-api-call.js.map +1 -1
  8. package/dist/index.d.ts +1 -0
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +1 -0
  11. package/dist/index.js.map +1 -1
  12. package/dist/jobs/api-client.d.ts +19 -0
  13. package/dist/jobs/api-client.d.ts.map +1 -0
  14. package/dist/jobs/api-client.js +104 -0
  15. package/dist/jobs/api-client.js.map +1 -0
  16. package/dist/jobs/commands/inspect.d.ts +5 -0
  17. package/dist/jobs/commands/inspect.d.ts.map +1 -0
  18. package/dist/jobs/commands/inspect.js +21 -0
  19. package/dist/jobs/commands/inspect.js.map +1 -0
  20. package/dist/jobs/commands/logs.d.ts +4 -0
  21. package/dist/jobs/commands/logs.d.ts.map +1 -0
  22. package/dist/jobs/commands/logs.js +24 -0
  23. package/dist/jobs/commands/logs.js.map +1 -0
  24. package/dist/jobs/commands/ps.d.ts +4 -0
  25. package/dist/jobs/commands/ps.d.ts.map +1 -0
  26. package/dist/jobs/commands/ps.js +23 -0
  27. package/dist/jobs/commands/ps.js.map +1 -0
  28. package/dist/jobs/commands/run.d.ts +5 -0
  29. package/dist/jobs/commands/run.d.ts.map +1 -0
  30. package/dist/jobs/commands/run.js +89 -0
  31. package/dist/jobs/commands/run.js.map +1 -0
  32. package/dist/jobs/commands/scheduled.d.ts +10 -0
  33. package/dist/jobs/commands/scheduled.d.ts.map +1 -0
  34. package/dist/jobs/commands/scheduled.js +111 -0
  35. package/dist/jobs/commands/scheduled.js.map +1 -0
  36. package/dist/jobs/commands/utils.d.ts +19 -0
  37. package/dist/jobs/commands/utils.d.ts.map +1 -0
  38. package/dist/jobs/commands/utils.js +99 -0
  39. package/dist/jobs/commands/utils.js.map +1 -0
  40. package/dist/jobs/formatters.d.ts +6 -0
  41. package/dist/jobs/formatters.d.ts.map +1 -0
  42. package/dist/jobs/formatters.js +98 -0
  43. package/dist/jobs/formatters.js.map +1 -0
  44. package/dist/jobs/sse-handler.d.ts +12 -0
  45. package/dist/jobs/sse-handler.d.ts.map +1 -0
  46. package/dist/jobs/sse-handler.js +80 -0
  47. package/dist/jobs/sse-handler.js.map +1 -0
  48. package/dist/jobs/tool.d.ts +35 -0
  49. package/dist/jobs/tool.d.ts.map +1 -0
  50. package/dist/jobs/tool.js +333 -0
  51. package/dist/jobs/tool.js.map +1 -0
  52. package/dist/jobs/types.d.ts +295 -0
  53. package/dist/jobs/types.d.ts.map +1 -0
  54. package/dist/jobs/types.js +95 -0
  55. package/dist/jobs/types.js.map +1 -0
  56. package/dist/tool-ids.d.ts +3 -2
  57. package/dist/tool-ids.d.ts.map +1 -1
  58. package/dist/tool-ids.js +10 -2
  59. package/dist/tool-ids.js.map +1 -1
  60. package/dist/types/tool-result.d.ts +1 -0
  61. package/dist/types/tool-result.d.ts.map +1 -1
  62. package/dist/use-space.d.ts +0 -1
  63. package/dist/use-space.d.ts.map +1 -1
  64. package/dist/use-space.js +0 -1
  65. package/dist/use-space.js.map +1 -1
  66. package/package.json +4 -2
  67. package/src/docs-search/docs-semantic-search.ts +71 -20
  68. package/src/hf-api-call.ts +6 -0
  69. package/src/index.ts +1 -0
  70. package/src/jobs/api-client.ts +195 -0
  71. package/src/jobs/commands/inspect.ts +38 -0
  72. package/src/jobs/commands/logs.ts +36 -0
  73. package/src/jobs/commands/ps.ts +40 -0
  74. package/src/jobs/commands/run.ts +134 -0
  75. package/src/jobs/commands/scheduled.ts +189 -0
  76. package/src/jobs/commands/utils.ts +158 -0
  77. package/src/jobs/formatters.ts +149 -0
  78. package/src/jobs/sse-handler.ts +144 -0
  79. package/src/jobs/tool.ts +435 -0
  80. package/src/jobs/types.ts +237 -0
  81. package/src/tool-ids.ts +11 -1
  82. package/src/types/tool-result.ts +6 -0
  83. package/src/use-space.ts +0 -1
  84. package/test/jobs/command-translation.spec.ts +277 -0
  85. package/test/jobs/formatters.spec.ts +267 -0
  86. package/test/jobs/uv-command.spec.ts +81 -0
  87. package/dist/types/mcp-ui-server-shim.d.ts +0 -37
  88. package/dist/types/mcp-ui-server-shim.d.ts.map +0 -1
  89. package/dist/types/mcp-ui-server-shim.js +0 -2
  90. package/dist/types/mcp-ui-server-shim.js.map +0 -1
  91. package/src/types/mcp-ui-server-shim.ts +0 -35
@@ -0,0 +1,89 @@
1
+ import { createJobSpec } from './utils.js';
2
+ import { fetchJobLogs } from '../sse-handler.js';
3
+ export async function runCommand(args, client, token) {
4
+ const jobSpec = createJobSpec({
5
+ image: args.image,
6
+ command: args.command,
7
+ flavor: args.flavor,
8
+ env: args.env,
9
+ secrets: args.secrets,
10
+ timeout: args.timeout,
11
+ });
12
+ const job = await client.runJob(jobSpec, args.namespace);
13
+ const jobUrl = `https://huggingface.co/jobs/${job.owner.name}/${job.id}`;
14
+ if (args.detach) {
15
+ return `Job started successfully!
16
+
17
+ **Job ID:** ${job.id}
18
+ **Status:** ${job.status.stage}
19
+ **View at:** ${jobUrl}
20
+
21
+ To check logs: \`hf_jobs("logs", {"job_id": "${job.id}"})\`
22
+ To inspect: \`hf_jobs("inspect", {"job_id": "${job.id}"})\``;
23
+ }
24
+ const logsUrl = client.getLogsUrl(job.id, job.owner.name);
25
+ const logResult = await fetchJobLogs(logsUrl, { token, maxDuration: 10000, maxLines: 20 });
26
+ let response = `Job started: ${job.id}\n\n`;
27
+ if (logResult.logs.length > 0) {
28
+ response += '**Logs (last 20 lines):**\n```\n';
29
+ response += logResult.logs.join('\n');
30
+ response += '\n```\n\n';
31
+ }
32
+ if (logResult.finished) {
33
+ response += `Job finished. Full details: ${jobUrl}`;
34
+ }
35
+ else if (logResult.truncated) {
36
+ response += `Log collection stopped after 10s. Job may still be running.\n`;
37
+ response += `View full logs: ${jobUrl}`;
38
+ }
39
+ return response;
40
+ }
41
+ export async function uvCommand(args, client, token) {
42
+ const image = 'ghcr.io/astral-sh/uv:latest';
43
+ const scriptSource = args.script;
44
+ let command;
45
+ if (scriptSource.startsWith('http://') || scriptSource.startsWith('https://')) {
46
+ command = buildUvCommand(scriptSource, args);
47
+ }
48
+ else if (scriptSource.includes('\n')) {
49
+ const encoded = Buffer.from(scriptSource).toString('base64');
50
+ const depsPart = args.with_deps && args.with_deps.length > 0
51
+ ? args.with_deps.map(dep => `--with ${dep}`).join(' ')
52
+ : '';
53
+ const pythonPart = args.python ? `-p ${args.python}` : '';
54
+ const uvArgs = [depsPart, pythonPart].filter(Boolean).join(' ');
55
+ const shellSnippet = `echo "${encoded}" | base64 -d | uv run${uvArgs ? ` ${uvArgs}` : ''} -`;
56
+ command = ['/bin/sh', '-lc', shellSnippet];
57
+ }
58
+ else {
59
+ command = buildUvCommand(scriptSource, args);
60
+ }
61
+ const runArgs = {
62
+ image,
63
+ command,
64
+ flavor: args.flavor,
65
+ env: args.env,
66
+ secrets: args.secrets,
67
+ timeout: args.timeout,
68
+ detach: args.detach,
69
+ namespace: args.namespace,
70
+ };
71
+ return runCommand(runArgs, client, token);
72
+ }
73
+ function buildUvCommand(script, args) {
74
+ const parts = ['uv', 'run'];
75
+ if (args.with_deps && args.with_deps.length > 0) {
76
+ for (const dep of args.with_deps) {
77
+ parts.push('--with', dep);
78
+ }
79
+ }
80
+ if (args.python) {
81
+ parts.push('-p', args.python);
82
+ }
83
+ parts.push(script);
84
+ if (args.script_args && args.script_args.length > 0) {
85
+ parts.push(...args.script_args);
86
+ }
87
+ return parts.join(' ');
88
+ }
89
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/jobs/commands/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ScheduledRunArgs, ScheduledUvArgs, ScheduledPsArgs, ScheduledJobArgs } from '../types.js';
2
+ import type { JobsApiClient } from '../api-client.js';
3
+ export declare function scheduledRunCommand(args: ScheduledRunArgs, client: JobsApiClient): Promise<string>;
4
+ export declare function scheduledUvCommand(args: ScheduledUvArgs, client: JobsApiClient): Promise<string>;
5
+ export declare function scheduledPsCommand(args: ScheduledPsArgs, client: JobsApiClient): Promise<string>;
6
+ export declare function scheduledInspectCommand(args: ScheduledJobArgs, client: JobsApiClient): Promise<string>;
7
+ export declare function scheduledDeleteCommand(args: ScheduledJobArgs, client: JobsApiClient): Promise<string>;
8
+ export declare function scheduledSuspendCommand(args: ScheduledJobArgs, client: JobsApiClient): Promise<string>;
9
+ export declare function scheduledResumeCommand(args: ScheduledJobArgs, client: JobsApiClient): Promise<string>;
10
+ //# sourceMappingURL=scheduled.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduled.d.ts","sourceRoot":"","sources":["../../../src/jobs/commands/scheduled.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,gBAAgB,EAEhB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAQtD,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CA8BxG;AAMD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAkCtG;AAkCD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAyBtG;AAMD,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAI5G;AAMD,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAI3G;AAMD,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAM5G;AAMD,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAM3G"}
@@ -0,0 +1,111 @@
1
+ import { formatScheduledJobsTable, formatScheduledJobDetails } from '../formatters.js';
2
+ import { createJobSpec } from './utils.js';
3
+ export async function scheduledRunCommand(args, client) {
4
+ const jobSpec = createJobSpec({
5
+ image: args.image,
6
+ command: args.command,
7
+ flavor: args.flavor,
8
+ env: args.env,
9
+ secrets: args.secrets,
10
+ timeout: args.timeout,
11
+ });
12
+ const scheduledSpec = {
13
+ schedule: args.schedule,
14
+ suspend: args.suspend,
15
+ jobSpec,
16
+ };
17
+ const scheduledJob = await client.createScheduledJob(scheduledSpec, args.namespace);
18
+ return `✓ Scheduled job created successfully!
19
+
20
+ **Scheduled Job ID:** ${scheduledJob.id}
21
+ **Schedule:** ${scheduledJob.schedule}
22
+ **Suspended:** ${scheduledJob.suspend ? 'Yes' : 'No'}
23
+ **Next Run:** ${scheduledJob.nextRun || 'N/A'}
24
+
25
+ To inspect: \`hf_jobs("scheduled inspect", {"scheduled_job_id": "${scheduledJob.id}"})\`
26
+ To list all: \`hf_jobs("scheduled ps")\``;
27
+ }
28
+ export async function scheduledUvCommand(args, client) {
29
+ const image = 'ghcr.io/astral-sh/uv:python3.12-bookworm';
30
+ const scriptSource = args.script;
31
+ let command;
32
+ if (scriptSource.startsWith('http://') || scriptSource.startsWith('https://')) {
33
+ command = buildUvCommand(scriptSource, args);
34
+ }
35
+ else if (scriptSource.includes('\n')) {
36
+ const encoded = Buffer.from(scriptSource).toString('base64');
37
+ const deps = args.with_deps && args.with_deps.length > 0 ? args.with_deps.map((dep) => `--with ${dep}`).join(' ') + ' ' : '';
38
+ command = `echo "${encoded}" | base64 -d | uv run ${deps}${args.python ? `-p ${args.python}` : ''} -`;
39
+ }
40
+ else {
41
+ command = buildUvCommand(scriptSource, args);
42
+ }
43
+ const scheduledRunArgs = {
44
+ schedule: args.schedule,
45
+ suspend: args.suspend,
46
+ image,
47
+ command,
48
+ flavor: args.flavor,
49
+ env: args.env,
50
+ secrets: args.secrets,
51
+ timeout: args.timeout,
52
+ detach: args.detach,
53
+ namespace: args.namespace,
54
+ };
55
+ return scheduledRunCommand(scheduledRunArgs, client);
56
+ }
57
+ function buildUvCommand(script, args) {
58
+ const parts = ['uv', 'run'];
59
+ if (args.with_deps && args.with_deps.length > 0) {
60
+ for (const dep of args.with_deps) {
61
+ parts.push('--with', dep);
62
+ }
63
+ }
64
+ if (args.python) {
65
+ parts.push('-p', args.python);
66
+ }
67
+ parts.push(script);
68
+ if (args.script_args && args.script_args.length > 0) {
69
+ parts.push(...args.script_args);
70
+ }
71
+ return parts.join(' ');
72
+ }
73
+ export async function scheduledPsCommand(args, client) {
74
+ const allJobs = await client.listScheduledJobs(args.namespace);
75
+ let jobs = allJobs;
76
+ if (!args.all) {
77
+ jobs = jobs.filter((job) => !job.suspend);
78
+ }
79
+ const table = formatScheduledJobsTable(jobs);
80
+ if (jobs.length === 0) {
81
+ if (args.all) {
82
+ return 'No scheduled jobs found.';
83
+ }
84
+ return 'No active scheduled jobs found. Use `{"all": true}` to show suspended jobs.';
85
+ }
86
+ return `**Scheduled Jobs (${jobs.length} of ${allJobs.length} total):**
87
+
88
+ ${table}`;
89
+ }
90
+ export async function scheduledInspectCommand(args, client) {
91
+ const job = await client.getScheduledJob(args.scheduled_job_id, args.namespace);
92
+ const formattedDetails = formatScheduledJobDetails(job);
93
+ return `**Scheduled Job Details:**\n\n${formattedDetails}`;
94
+ }
95
+ export async function scheduledDeleteCommand(args, client) {
96
+ await client.deleteScheduledJob(args.scheduled_job_id, args.namespace);
97
+ return `✓ Scheduled job ${args.scheduled_job_id} has been deleted.`;
98
+ }
99
+ export async function scheduledSuspendCommand(args, client) {
100
+ await client.suspendScheduledJob(args.scheduled_job_id, args.namespace);
101
+ return `✓ Scheduled job ${args.scheduled_job_id} has been suspended.
102
+
103
+ To resume: \`hf_jobs("scheduled resume", {"scheduled_job_id": "${args.scheduled_job_id}"})\``;
104
+ }
105
+ export async function scheduledResumeCommand(args, client) {
106
+ await client.resumeScheduledJob(args.scheduled_job_id, args.namespace);
107
+ return `✓ Scheduled job ${args.scheduled_job_id} has been resumed.
108
+
109
+ To inspect: \`hf_jobs("scheduled inspect", {"scheduled_job_id": "${args.scheduled_job_id}"})\``;
110
+ }
111
+ //# sourceMappingURL=scheduled.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduled.js","sourceRoot":"","sources":["../../../src/jobs/commands/scheduled.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { JobSpec } from '../types.js';
2
+ export declare function parseTimeout(timeout: string): number;
3
+ export declare function parseImageSource(image: string): {
4
+ dockerImage?: string;
5
+ spaceId?: string;
6
+ };
7
+ export declare function parseCommand(command: string | string[]): {
8
+ command: string[];
9
+ arguments?: string[];
10
+ };
11
+ export declare function createJobSpec(args: {
12
+ image: string;
13
+ command: string | string[];
14
+ flavor?: string;
15
+ env?: Record<string, string>;
16
+ secrets?: Record<string, string>;
17
+ timeout?: string;
18
+ }): JobSpec;
19
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/jobs/commands/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAqC3C,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAuBpD;AAMD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAgB1F;AAMD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAiCpG;AAKD,wBAAgB,aAAa,CAAC,IAAI,EAAE;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAwBV"}
@@ -0,0 +1,99 @@
1
+ import { parse as parseShellArgs } from 'shell-quote';
2
+ const SPECIAL_PARAMS = new Set(['*', '@', '#', '?', '!', '-', '_']);
3
+ function isEnvToken(entry) {
4
+ return Boolean(entry && typeof entry === 'object' && entry.type === 'env');
5
+ }
6
+ function formatEnvReference(key) {
7
+ if (key === '') {
8
+ return '$';
9
+ }
10
+ if (key === '$') {
11
+ return '$$';
12
+ }
13
+ if (/^[A-Za-z0-9_]+$/.test(key)) {
14
+ return `$${key}`;
15
+ }
16
+ if (SPECIAL_PARAMS.has(key)) {
17
+ return `$${key}`;
18
+ }
19
+ return `\${${key}}`;
20
+ }
21
+ export function parseTimeout(timeout) {
22
+ const timeUnits = {
23
+ s: 1,
24
+ m: 60,
25
+ h: 3600,
26
+ d: 86400,
27
+ };
28
+ const match = timeout.match(/^(\d+(?:\.\d+)?)(s|m|h|d)$/);
29
+ if (!match || !match[1] || !match[2]) {
30
+ const seconds = parseInt(timeout, 10);
31
+ if (!isNaN(seconds)) {
32
+ return seconds;
33
+ }
34
+ throw new Error(`Invalid timeout format: "${timeout}". Use format like "5m", "2h", "30s", or plain seconds.`);
35
+ }
36
+ const value = parseFloat(match[1]);
37
+ const unit = match[2];
38
+ return Math.floor(value * timeUnits[unit]);
39
+ }
40
+ export function parseImageSource(image) {
41
+ const spacePrefixes = [
42
+ 'https://huggingface.co/spaces/',
43
+ 'https://hf.co/spaces/',
44
+ 'huggingface.co/spaces/',
45
+ 'hf.co/spaces/',
46
+ ];
47
+ for (const prefix of spacePrefixes) {
48
+ if (image.startsWith(prefix)) {
49
+ return { spaceId: image.substring(prefix.length) };
50
+ }
51
+ }
52
+ return { dockerImage: image };
53
+ }
54
+ export function parseCommand(command) {
55
+ if (Array.isArray(command)) {
56
+ return { command, arguments: [] };
57
+ }
58
+ const parsed = parseShellArgs(command, key => ({ type: 'env', key }));
59
+ const stringArgs = [];
60
+ for (const arg of parsed) {
61
+ if (typeof arg === 'string') {
62
+ stringArgs.push(arg);
63
+ }
64
+ else if (isEnvToken(arg)) {
65
+ stringArgs.push(formatEnvReference(arg.key));
66
+ }
67
+ else {
68
+ throw new Error(`Unsupported shell syntax in command: "${command}". ` +
69
+ `Please use an array format for commands with complex shell operators, ` +
70
+ `or use simple quoted strings.`);
71
+ }
72
+ }
73
+ if (stringArgs.length === 0) {
74
+ throw new Error(`Invalid command: "${command}". Command cannot be empty.`);
75
+ }
76
+ return { command: stringArgs, arguments: [] };
77
+ }
78
+ export function createJobSpec(args) {
79
+ if (!args.image) {
80
+ throw new Error('image parameter is required. Provide a Docker image (e.g., "python:3.12") or Space URL.');
81
+ }
82
+ if (!args.command) {
83
+ throw new Error('command parameter is required. Provide a command as string or array.');
84
+ }
85
+ const imageSource = parseImageSource(args.image);
86
+ const { command, arguments: cmdArgs } = parseCommand(args.command);
87
+ const timeoutSeconds = args.timeout ? parseTimeout(args.timeout) : undefined;
88
+ const spec = {
89
+ ...imageSource,
90
+ command,
91
+ arguments: cmdArgs,
92
+ flavor: args.flavor || 'cpu-basic',
93
+ environment: args.env || {},
94
+ secrets: args.secrets || {},
95
+ timeoutSeconds,
96
+ };
97
+ return spec;
98
+ }
99
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/jobs/commands/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { JobInfo, ScheduledJobInfo } from './types.js';
2
+ export declare function formatJobsTable(jobs: JobInfo[]): string;
3
+ export declare function formatScheduledJobsTable(jobs: ScheduledJobInfo[]): string;
4
+ export declare function formatJobDetails(jobs: JobInfo | JobInfo[]): string;
5
+ export declare function formatScheduledJobDetails(jobs: ScheduledJobInfo | ScheduledJobInfo[]): string;
6
+ //# sourceMappingURL=formatters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../../src/jobs/formatters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAqD5D,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAkCvD;AAKD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAsCzE;AAKD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,EAAE,GAAG,MAAM,CAIlE;AAKD,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,gBAAgB,GAAG,gBAAgB,EAAE,GAAG,MAAM,CAI7F"}
@@ -0,0 +1,98 @@
1
+ function truncate(str, maxLength) {
2
+ if (str.length <= maxLength) {
3
+ return str;
4
+ }
5
+ return str.substring(0, maxLength - 3) + '...';
6
+ }
7
+ function formatDate(dateStr) {
8
+ if (!dateStr) {
9
+ return 'N/A';
10
+ }
11
+ try {
12
+ const date = new Date(dateStr);
13
+ return date.toISOString().replace('T', ' ').substring(0, 19);
14
+ }
15
+ catch {
16
+ return dateStr;
17
+ }
18
+ }
19
+ function formatCommand(command) {
20
+ if (!command || command.length === 0) {
21
+ return 'N/A';
22
+ }
23
+ return command.join(' ');
24
+ }
25
+ function getImageOrSpace(job) {
26
+ if (job.spaceId) {
27
+ return job.spaceId;
28
+ }
29
+ if (job.dockerImage) {
30
+ return job.dockerImage;
31
+ }
32
+ return 'N/A';
33
+ }
34
+ export function formatJobsTable(jobs) {
35
+ if (jobs.length === 0) {
36
+ return 'No jobs found.';
37
+ }
38
+ const longestIdLength = Math.max(...jobs.map((job) => job.id.length));
39
+ const idColumnWidth = Math.max(longestIdLength, 'JOB ID'.length);
40
+ const colWidths = {
41
+ id: idColumnWidth,
42
+ image: 20,
43
+ command: 30,
44
+ created: 19,
45
+ status: 12,
46
+ };
47
+ const header = `| ${'JOB ID'.padEnd(colWidths.id)} | ${'IMAGE/SPACE'.padEnd(colWidths.image)} | ${'COMMAND'.padEnd(colWidths.command)} | ${'CREATED'.padEnd(colWidths.created)} | ${'STATUS'.padEnd(colWidths.status)} |`;
48
+ const separator = `|${'-'.repeat(colWidths.id + 2)}|${'-'.repeat(colWidths.image + 2)}|${'-'.repeat(colWidths.command + 2)}|${'-'.repeat(colWidths.created + 2)}|${'-'.repeat(colWidths.status + 2)}|`;
49
+ const rows = jobs.map((job) => {
50
+ const id = job.id;
51
+ const image = truncate(getImageOrSpace(job), colWidths.image);
52
+ const command = truncate(formatCommand(job.command), colWidths.command);
53
+ const created = truncate(formatDate(job.createdAt), colWidths.created);
54
+ const status = truncate(job.status.stage, colWidths.status);
55
+ return `| ${id.padEnd(colWidths.id)} | ${image.padEnd(colWidths.image)} | ${command.padEnd(colWidths.command)} | ${created.padEnd(colWidths.created)} | ${status.padEnd(colWidths.status)} |`;
56
+ });
57
+ return [header, separator, ...rows].join('\n');
58
+ }
59
+ export function formatScheduledJobsTable(jobs) {
60
+ if (jobs.length === 0) {
61
+ return 'No scheduled jobs found.';
62
+ }
63
+ const longestIdLength = Math.max(...jobs.map((job) => job.id.length));
64
+ const idColumnWidth = Math.max(longestIdLength, 'ID'.length);
65
+ const colWidths = {
66
+ id: idColumnWidth,
67
+ schedule: 12,
68
+ image: 18,
69
+ command: 25,
70
+ lastRun: 19,
71
+ nextRun: 19,
72
+ suspend: 9,
73
+ };
74
+ const header = `| ${'ID'.padEnd(colWidths.id)} | ${'SCHEDULE'.padEnd(colWidths.schedule)} | ${'IMAGE/SPACE'.padEnd(colWidths.image)} | ${'COMMAND'.padEnd(colWidths.command)} | ${'LAST RUN'.padEnd(colWidths.lastRun)} | ${'NEXT RUN'.padEnd(colWidths.nextRun)} | ${'SUSPENDED'.padEnd(colWidths.suspend)} |`;
75
+ const separator = `|${'-'.repeat(colWidths.id + 2)}|${'-'.repeat(colWidths.schedule + 2)}|${'-'.repeat(colWidths.image + 2)}|${'-'.repeat(colWidths.command + 2)}|${'-'.repeat(colWidths.lastRun + 2)}|${'-'.repeat(colWidths.nextRun + 2)}|${'-'.repeat(colWidths.suspend + 2)}|`;
76
+ const rows = jobs.map((job) => {
77
+ const id = job.id;
78
+ const schedule = truncate(job.schedule, colWidths.schedule);
79
+ const image = truncate(getImageOrSpace(job.jobSpec), colWidths.image);
80
+ const command = truncate(formatCommand(job.jobSpec.command), colWidths.command);
81
+ const lastRun = truncate(formatDate(job.lastRun), colWidths.lastRun);
82
+ const nextRun = truncate(formatDate(job.nextRun), colWidths.nextRun);
83
+ const suspend = job.suspend ? 'Yes' : 'No';
84
+ return `| ${id.padEnd(colWidths.id)} | ${schedule.padEnd(colWidths.schedule)} | ${image.padEnd(colWidths.image)} | ${command.padEnd(colWidths.command)} | ${lastRun.padEnd(colWidths.lastRun)} | ${nextRun.padEnd(colWidths.nextRun)} | ${suspend.padEnd(colWidths.suspend)} |`;
85
+ });
86
+ return [header, separator, ...rows].join('\n');
87
+ }
88
+ export function formatJobDetails(jobs) {
89
+ const jobArray = Array.isArray(jobs) ? jobs : [jobs];
90
+ const json = JSON.stringify(jobArray, null, 2);
91
+ return `\`\`\`json\n${json}\n\`\`\``;
92
+ }
93
+ export function formatScheduledJobDetails(jobs) {
94
+ const jobArray = Array.isArray(jobs) ? jobs : [jobs];
95
+ const json = JSON.stringify(jobArray, null, 2);
96
+ return `\`\`\`json\n${json}\n\`\`\``;
97
+ }
98
+ //# sourceMappingURL=formatters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters.js","sourceRoot":"","sources":["../../src/jobs/formatters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface SseLogOptions {
2
+ maxDuration?: number;
3
+ maxLines?: number;
4
+ token?: string;
5
+ }
6
+ export interface SseLogResult {
7
+ logs: string[];
8
+ finished: boolean;
9
+ truncated: boolean;
10
+ }
11
+ export declare function fetchJobLogs(url: string, options?: SseLogOptions): Promise<SseLogResult>;
12
+ //# sourceMappingURL=sse-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-handler.d.ts","sourceRoot":"","sources":["../../src/jobs/sse-handler.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAE7B,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAKD,MAAM,WAAW,YAAY;IAE5B,IAAI,EAAE,MAAM,EAAE,CAAC;IAEf,QAAQ,EAAE,OAAO,CAAC;IAElB,SAAS,EAAE,OAAO,CAAC;CACnB;AAUD,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CA6GlG"}
@@ -0,0 +1,80 @@
1
+ export async function fetchJobLogs(url, options = {}) {
2
+ const { maxDuration = 10000, maxLines = 20, token } = options;
3
+ const logLines = [];
4
+ let finished = false;
5
+ let truncated = false;
6
+ const controller = new AbortController();
7
+ const timeoutId = setTimeout(() => {
8
+ controller.abort();
9
+ truncated = true;
10
+ }, maxDuration);
11
+ try {
12
+ const headers = {
13
+ Accept: 'text/event-stream',
14
+ };
15
+ if (token) {
16
+ headers['Authorization'] = `Bearer ${token}`;
17
+ }
18
+ const response = await fetch(url, {
19
+ headers,
20
+ signal: controller.signal,
21
+ });
22
+ if (!response.ok) {
23
+ throw new Error(`Failed to fetch logs: ${response.status} ${response.statusText}`);
24
+ }
25
+ if (!response.body) {
26
+ throw new Error('Response body is null');
27
+ }
28
+ const reader = response.body.getReader();
29
+ const decoder = new TextDecoder();
30
+ let buffer = '';
31
+ while (true) {
32
+ const { done, value } = await reader.read();
33
+ if (done) {
34
+ break;
35
+ }
36
+ buffer += decoder.decode(value, { stream: true });
37
+ const lines = buffer.split('\n');
38
+ buffer = lines.pop() || '';
39
+ for (const line of lines) {
40
+ if (line.startsWith('data: ')) {
41
+ try {
42
+ const jsonStr = line.substring(6);
43
+ const event = JSON.parse(jsonStr);
44
+ if (event.data.startsWith('===== Job started')) {
45
+ continue;
46
+ }
47
+ if (event.data.startsWith('===== Job finished')) {
48
+ finished = true;
49
+ logLines.push(event.data);
50
+ break;
51
+ }
52
+ logLines.push(event.data);
53
+ }
54
+ catch {
55
+ continue;
56
+ }
57
+ }
58
+ }
59
+ if (finished) {
60
+ break;
61
+ }
62
+ }
63
+ await reader.cancel();
64
+ }
65
+ catch (error) {
66
+ if (error.name !== 'AbortError') {
67
+ throw error;
68
+ }
69
+ }
70
+ finally {
71
+ clearTimeout(timeoutId);
72
+ }
73
+ const lastLines = logLines.slice(-maxLines);
74
+ return {
75
+ logs: lastLines,
76
+ finished,
77
+ truncated: truncated && !finished,
78
+ };
79
+ }
80
+ //# sourceMappingURL=sse-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-handler.js","sourceRoot":"","sources":["../../src/jobs/sse-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { z } from 'zod';
2
+ import type { ToolResult } from '../types/tool-result.js';
3
+ export * from './types.js';
4
+ export { JobsApiClient } from './api-client.js';
5
+ export declare const HF_JOBS_TOOL_CONFIG: {
6
+ readonly name: "hf_jobs";
7
+ readonly description: string;
8
+ readonly schema: z.ZodObject<{
9
+ command: z.ZodOptional<z.ZodString>;
10
+ args: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
11
+ }, "strip", z.ZodTypeAny, {
12
+ command?: string | undefined;
13
+ args?: Record<string, any> | undefined;
14
+ }, {
15
+ command?: string | undefined;
16
+ args?: Record<string, any> | undefined;
17
+ }>;
18
+ readonly annotations: {
19
+ readonly title: "HuggingFace Jobs";
20
+ readonly destructiveHint: false;
21
+ readonly readOnlyHint: false;
22
+ readonly openWorldHint: true;
23
+ };
24
+ };
25
+ export declare class HfJobsTool {
26
+ private client;
27
+ private hfToken?;
28
+ private isAuthenticated;
29
+ constructor(hfToken?: string, isAuthenticated?: boolean, namespace?: string);
30
+ execute(params: {
31
+ command?: string;
32
+ args?: Record<string, unknown>;
33
+ }): Promise<ToolResult>;
34
+ }
35
+ //# sourceMappingURL=tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/jobs/tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAgBxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAe1D,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAmOhD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;CAuBtB,CAAC;AAKX,qBAAa,UAAU;IACtB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,eAAe,CAAU;gBAErB,OAAO,CAAC,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM;IASrE,OAAO,CAAC,MAAM,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,CAAC;CAqIhG"}