@llmindset/hf-mcp 0.2.33 → 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 (76) hide show
  1. package/dist/hf-api-call.d.ts.map +1 -1
  2. package/dist/hf-api-call.js +4 -0
  3. package/dist/hf-api-call.js.map +1 -1
  4. package/dist/index.d.ts +1 -0
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +1 -0
  7. package/dist/index.js.map +1 -1
  8. package/dist/jobs/api-client.d.ts +19 -0
  9. package/dist/jobs/api-client.d.ts.map +1 -0
  10. package/dist/jobs/api-client.js +104 -0
  11. package/dist/jobs/api-client.js.map +1 -0
  12. package/dist/jobs/commands/inspect.d.ts +5 -0
  13. package/dist/jobs/commands/inspect.d.ts.map +1 -0
  14. package/dist/jobs/commands/inspect.js +21 -0
  15. package/dist/jobs/commands/inspect.js.map +1 -0
  16. package/dist/jobs/commands/logs.d.ts +4 -0
  17. package/dist/jobs/commands/logs.d.ts.map +1 -0
  18. package/dist/jobs/commands/logs.js +24 -0
  19. package/dist/jobs/commands/logs.js.map +1 -0
  20. package/dist/jobs/commands/ps.d.ts +4 -0
  21. package/dist/jobs/commands/ps.d.ts.map +1 -0
  22. package/dist/jobs/commands/ps.js +23 -0
  23. package/dist/jobs/commands/ps.js.map +1 -0
  24. package/dist/jobs/commands/run.d.ts +5 -0
  25. package/dist/jobs/commands/run.d.ts.map +1 -0
  26. package/dist/jobs/commands/run.js +89 -0
  27. package/dist/jobs/commands/run.js.map +1 -0
  28. package/dist/jobs/commands/scheduled.d.ts +10 -0
  29. package/dist/jobs/commands/scheduled.d.ts.map +1 -0
  30. package/dist/jobs/commands/scheduled.js +111 -0
  31. package/dist/jobs/commands/scheduled.js.map +1 -0
  32. package/dist/jobs/commands/utils.d.ts +19 -0
  33. package/dist/jobs/commands/utils.d.ts.map +1 -0
  34. package/dist/jobs/commands/utils.js +99 -0
  35. package/dist/jobs/commands/utils.js.map +1 -0
  36. package/dist/jobs/formatters.d.ts +6 -0
  37. package/dist/jobs/formatters.d.ts.map +1 -0
  38. package/dist/jobs/formatters.js +98 -0
  39. package/dist/jobs/formatters.js.map +1 -0
  40. package/dist/jobs/sse-handler.d.ts +12 -0
  41. package/dist/jobs/sse-handler.d.ts.map +1 -0
  42. package/dist/jobs/sse-handler.js +80 -0
  43. package/dist/jobs/sse-handler.js.map +1 -0
  44. package/dist/jobs/tool.d.ts +35 -0
  45. package/dist/jobs/tool.d.ts.map +1 -0
  46. package/dist/jobs/tool.js +333 -0
  47. package/dist/jobs/tool.js.map +1 -0
  48. package/dist/jobs/types.d.ts +295 -0
  49. package/dist/jobs/types.d.ts.map +1 -0
  50. package/dist/jobs/types.js +95 -0
  51. package/dist/jobs/types.js.map +1 -0
  52. package/dist/tool-ids.d.ts +3 -2
  53. package/dist/tool-ids.d.ts.map +1 -1
  54. package/dist/tool-ids.js +10 -2
  55. package/dist/tool-ids.js.map +1 -1
  56. package/dist/types/tool-result.d.ts +1 -0
  57. package/dist/types/tool-result.d.ts.map +1 -1
  58. package/package.json +3 -1
  59. package/src/hf-api-call.ts +6 -0
  60. package/src/index.ts +1 -0
  61. package/src/jobs/api-client.ts +195 -0
  62. package/src/jobs/commands/inspect.ts +38 -0
  63. package/src/jobs/commands/logs.ts +36 -0
  64. package/src/jobs/commands/ps.ts +40 -0
  65. package/src/jobs/commands/run.ts +134 -0
  66. package/src/jobs/commands/scheduled.ts +189 -0
  67. package/src/jobs/commands/utils.ts +158 -0
  68. package/src/jobs/formatters.ts +149 -0
  69. package/src/jobs/sse-handler.ts +144 -0
  70. package/src/jobs/tool.ts +435 -0
  71. package/src/jobs/types.ts +237 -0
  72. package/src/tool-ids.ts +11 -1
  73. package/src/types/tool-result.ts +6 -0
  74. package/test/jobs/command-translation.spec.ts +277 -0
  75. package/test/jobs/formatters.spec.ts +267 -0
  76. package/test/jobs/uv-command.spec.ts +81 -0
@@ -1 +1 @@
1
- {"version":3,"file":"hf-api-call.d.ts","sourceRoot":"","sources":["../src/hf-api-call.ts"],"names":[],"mappings":"AAGA,qBAAa,UAAW,SAAQ,KAAK;aAGnB,MAAM,EAAE,MAAM;aACd,UAAU,EAAE,MAAM;aAClB,YAAY,CAAC,EAAE,MAAM;gBAHrC,OAAO,EAAE,MAAM,EACC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,YAAY,CAAC,EAAE,MAAM,YAAA;IAYtC,qBAAqB,CAAC,mBAAmB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM;IAuC5E,mBAAmB,CAAC,mBAAmB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,UAAU;CAI9E;AAQD,qBAAa,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAAE,SAAS,GAAG,OAAO;IACvF,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAClC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/C,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;gBAE1B,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;cAe5B,YAAY,CAAC,CAAC,GAAG,SAAS,EAAE,GAAG,EAAE,GAAG,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,CAAC,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC;IA+D5G,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,GAAG;cAsBxB,OAAO,CAAC,CAAC,GAAG,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,UAAU,CAAC,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC;CAKrG"}
1
+ {"version":3,"file":"hf-api-call.d.ts","sourceRoot":"","sources":["../src/hf-api-call.ts"],"names":[],"mappings":"AAGA,qBAAa,UAAW,SAAQ,KAAK;aAGnB,MAAM,EAAE,MAAM;aACd,UAAU,EAAE,MAAM;aAClB,YAAY,CAAC,EAAE,MAAM;gBAHrC,OAAO,EAAE,MAAM,EACC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,YAAY,CAAC,EAAE,MAAM,YAAA;IAYtC,qBAAqB,CAAC,mBAAmB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM;IAuC5E,mBAAmB,CAAC,mBAAmB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,UAAU;CAI9E;AAQD,qBAAa,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAAE,SAAS,GAAG,OAAO;IACvF,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAClC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/C,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;gBAE1B,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;cAe5B,YAAY,CAAC,CAAC,GAAG,SAAS,EAAE,GAAG,EAAE,GAAG,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,CAAC,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC;IAqE5G,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,GAAG;cAsBxB,OAAO,CAAC,CAAC,GAAG,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,UAAU,CAAC,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC;CAKrG"}
@@ -70,6 +70,10 @@ export class HfApiCall {
70
70
  }
71
71
  catch {
72
72
  }
73
+ console.error(`[API Error] ${response.status} ${response.statusText}`);
74
+ if (responseBody) {
75
+ console.error('[API Error] Response:', responseBody);
76
+ }
73
77
  throw new HfApiError(`API request failed: ${response.status.toString()} ${response.statusText}`, response.status, response.statusText, responseBody);
74
78
  }
75
79
  return (await response.json());
@@ -1 +1 @@
1
- {"version":3,"file":"hf-api-call.js","sourceRoot":"","sources":["../src/hf-api-call.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hf-api-call.js","sourceRoot":"","sources":["../src/hf-api-call.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -18,6 +18,7 @@ export * from './docs-search/docs-semantic-search.js';
18
18
  export * from './docs-search/doc-fetch.js';
19
19
  export * from './readme-utils.js';
20
20
  export * from './use-space.js';
21
+ export * from './jobs/tool.js';
21
22
  export * from './types/tool-result.js';
22
23
  export * from './tool-ids.js';
23
24
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uCAAuC,CAAC;AACtD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAG/B,cAAc,wBAAwB,CAAC;AAGvC,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uCAAuC,CAAC;AACtD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAG/B,cAAc,wBAAwB,CAAC;AAGvC,cAAc,eAAe,CAAC"}
package/dist/index.js CHANGED
@@ -18,6 +18,7 @@ export * from './docs-search/docs-semantic-search.js';
18
18
  export * from './docs-search/doc-fetch.js';
19
19
  export * from './readme-utils.js';
20
20
  export * from './use-space.js';
21
+ export * from './jobs/tool.js';
21
22
  export * from './types/tool-result.js';
22
23
  export * from './tool-ids.js';
23
24
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uCAAuC,CAAC;AACtD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAG/B,cAAc,wBAAwB,CAAC;AAGvC,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uCAAuC,CAAC;AACtD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAG/B,cAAc,wBAAwB,CAAC;AAGvC,cAAc,eAAe,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { HfApiCall } from '../hf-api-call.js';
2
+ import type { JobInfo, JobSpec, ScheduledJobInfo, ScheduledJobSpec } from './types.js';
3
+ export declare class JobsApiClient extends HfApiCall {
4
+ private namespaceCache;
5
+ constructor(hfToken?: string, namespace?: string);
6
+ getNamespace(namespace?: string): Promise<string>;
7
+ runJob(jobSpec: JobSpec, namespace?: string): Promise<JobInfo>;
8
+ listJobs(namespace?: string): Promise<JobInfo[]>;
9
+ getJob(jobId: string, namespace?: string): Promise<JobInfo>;
10
+ cancelJob(jobId: string, namespace?: string): Promise<void>;
11
+ getLogsUrl(jobId: string, namespace: string): string;
12
+ createScheduledJob(spec: ScheduledJobSpec, namespace?: string): Promise<ScheduledJobInfo>;
13
+ listScheduledJobs(namespace?: string): Promise<ScheduledJobInfo[]>;
14
+ getScheduledJob(scheduledJobId: string, namespace?: string): Promise<ScheduledJobInfo>;
15
+ deleteScheduledJob(scheduledJobId: string, namespace?: string): Promise<void>;
16
+ suspendScheduledJob(scheduledJobId: string, namespace?: string): Promise<void>;
17
+ resumeScheduledJob(scheduledJobId: string, namespace?: string): Promise<void>;
18
+ }
19
+ //# sourceMappingURL=api-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/jobs/api-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAgBvF,qBAAa,aAAc,SAAQ,SAAS;IAC3C,OAAO,CAAC,cAAc,CAAuB;gBAEjC,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;IAW1C,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmBjD,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA4B9D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAWhD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW3D,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAajE,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAQ9C,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAiBzF,iBAAiB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAWlE,eAAe,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAWtF,kBAAkB,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa7E,mBAAmB,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa9E,kBAAkB,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAQnF"}
@@ -0,0 +1,104 @@
1
+ import { HfApiCall } from '../hf-api-call.js';
2
+ export class JobsApiClient extends HfApiCall {
3
+ namespaceCache = null;
4
+ constructor(hfToken, namespace) {
5
+ super('https://huggingface.co/api', hfToken);
6
+ this.namespaceCache = namespace || null;
7
+ }
8
+ async getNamespace(namespace) {
9
+ if (namespace) {
10
+ return namespace;
11
+ }
12
+ if (this.namespaceCache) {
13
+ return this.namespaceCache;
14
+ }
15
+ const whoami = await this.fetchFromApi('https://huggingface.co/api/whoami-v2');
16
+ this.namespaceCache = whoami.name;
17
+ return this.namespaceCache;
18
+ }
19
+ async runJob(jobSpec, namespace) {
20
+ const ns = await this.getNamespace(namespace);
21
+ const url = `https://huggingface.co/api/jobs/${ns}`;
22
+ console.error('[Jobs API] POST', url);
23
+ console.error('[Jobs API] Payload:', JSON.stringify(jobSpec, null, 2));
24
+ try {
25
+ const result = await this.fetchFromApi(url, {
26
+ method: 'POST',
27
+ headers: {
28
+ 'Content-Type': 'application/json',
29
+ },
30
+ body: JSON.stringify(jobSpec),
31
+ });
32
+ console.error('[Jobs API] Success:', result.id);
33
+ return result;
34
+ }
35
+ catch (error) {
36
+ console.error('[Jobs API] Error:', error);
37
+ throw error;
38
+ }
39
+ }
40
+ async listJobs(namespace) {
41
+ const ns = await this.getNamespace(namespace);
42
+ const url = `https://huggingface.co/api/jobs/${ns}`;
43
+ return this.fetchFromApi(url);
44
+ }
45
+ async getJob(jobId, namespace) {
46
+ const ns = await this.getNamespace(namespace);
47
+ const url = `https://huggingface.co/api/jobs/${ns}/${jobId}`;
48
+ return this.fetchFromApi(url);
49
+ }
50
+ async cancelJob(jobId, namespace) {
51
+ const ns = await this.getNamespace(namespace);
52
+ const url = `https://huggingface.co/api/jobs/${ns}/${jobId}/cancel`;
53
+ await this.fetchFromApi(url, {
54
+ method: 'POST',
55
+ });
56
+ }
57
+ getLogsUrl(jobId, namespace) {
58
+ return `https://huggingface.co/api/jobs/${namespace}/${jobId}/logs`;
59
+ }
60
+ async createScheduledJob(spec, namespace) {
61
+ const ns = await this.getNamespace(namespace);
62
+ const url = `https://huggingface.co/api/scheduled-jobs/${ns}`;
63
+ return this.fetchFromApi(url, {
64
+ method: 'POST',
65
+ headers: {
66
+ 'Content-Type': 'application/json',
67
+ },
68
+ body: JSON.stringify(spec),
69
+ });
70
+ }
71
+ async listScheduledJobs(namespace) {
72
+ const ns = await this.getNamespace(namespace);
73
+ const url = `https://huggingface.co/api/scheduled-jobs/${ns}`;
74
+ return this.fetchFromApi(url);
75
+ }
76
+ async getScheduledJob(scheduledJobId, namespace) {
77
+ const ns = await this.getNamespace(namespace);
78
+ const url = `https://huggingface.co/api/scheduled-jobs/${ns}/${scheduledJobId}`;
79
+ console.error(url);
80
+ return this.fetchFromApi(url);
81
+ }
82
+ async deleteScheduledJob(scheduledJobId, namespace) {
83
+ const ns = await this.getNamespace(namespace);
84
+ const url = `https://huggingface.co/api/scheduled-jobs/${ns}/${scheduledJobId}`;
85
+ await this.fetchFromApi(url, {
86
+ method: 'DELETE',
87
+ });
88
+ }
89
+ async suspendScheduledJob(scheduledJobId, namespace) {
90
+ const ns = await this.getNamespace(namespace);
91
+ const url = `https://huggingface.co/api/scheduled-jobs/${ns}/${scheduledJobId}/suspend`;
92
+ await this.fetchFromApi(url, {
93
+ method: 'POST',
94
+ });
95
+ }
96
+ async resumeScheduledJob(scheduledJobId, namespace) {
97
+ const ns = await this.getNamespace(namespace);
98
+ const url = `https://huggingface.co/api/scheduled-jobs/${ns}/${scheduledJobId}/resume`;
99
+ await this.fetchFromApi(url, {
100
+ method: 'POST',
101
+ });
102
+ }
103
+ }
104
+ //# sourceMappingURL=api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/jobs/api-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { InspectArgs, CancelArgs } from '../types.js';
2
+ import type { JobsApiClient } from '../api-client.js';
3
+ export declare function inspectCommand(args: InspectArgs, client: JobsApiClient): Promise<string>;
4
+ export declare function cancelCommand(args: CancelArgs, client: JobsApiClient): Promise<string>;
5
+ //# sourceMappingURL=inspect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../../../src/jobs/commands/inspect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAOtD,wBAAsB,cAAc,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAiB9F;AAMD,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAM5F"}
@@ -0,0 +1,21 @@
1
+ import { formatJobDetails } from '../formatters.js';
2
+ export async function inspectCommand(args, client) {
3
+ const jobIds = Array.isArray(args.job_id) ? args.job_id : [args.job_id];
4
+ const jobs = await Promise.all(jobIds.map(async (id) => {
5
+ try {
6
+ return await client.getJob(id, args.namespace);
7
+ }
8
+ catch (error) {
9
+ throw new Error(`Failed to fetch job ${id}: ${error.message}`);
10
+ }
11
+ }));
12
+ const formattedDetails = formatJobDetails(jobs);
13
+ return `**Job Details** (${jobs.length} job${jobs.length > 1 ? 's' : ''}):\n\n${formattedDetails}`;
14
+ }
15
+ export async function cancelCommand(args, client) {
16
+ await client.cancelJob(args.job_id, args.namespace);
17
+ return `✓ Job ${args.job_id} has been cancelled.
18
+
19
+ To verify: \`hf_jobs("inspect", {"job_id": "${args.job_id}"})\``;
20
+ }
21
+ //# sourceMappingURL=inspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../../src/jobs/commands/inspect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAMpD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAiB,EAAE,MAAqB;IAC5E,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAGxE,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAC7B,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;QACvB,IAAI,CAAC;YACJ,OAAO,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,uBAAuB,EAAE,KAAM,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3E,CAAC;IACF,CAAC,CAAC,CACF,CAAC;IAEF,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAEhD,OAAO,oBAAoB,IAAI,CAAC,MAAM,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,gBAAgB,EAAE,CAAC;AACpG,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAgB,EAAE,MAAqB;IAC1E,MAAM,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAEpD,OAAO,SAAS,IAAI,CAAC,MAAM;;8CAEkB,IAAI,CAAC,MAAM,OAAO,CAAC;AACjE,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { LogsArgs } from '../types.js';
2
+ import type { JobsApiClient } from '../api-client.js';
3
+ export declare function logsCommand(args: LogsArgs, client: JobsApiClient, token?: string): Promise<string>;
4
+ //# sourceMappingURL=logs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../../src/jobs/commands/logs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAOtD,wBAAsB,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA2BxG"}
@@ -0,0 +1,24 @@
1
+ import { fetchJobLogs } from '../sse-handler.js';
2
+ export async function logsCommand(args, client, token) {
3
+ const namespace = await client.getNamespace(args.namespace);
4
+ const logsUrl = client.getLogsUrl(args.job_id, namespace);
5
+ const result = await fetchJobLogs(logsUrl, {
6
+ token,
7
+ maxDuration: 10000,
8
+ maxLines: args.tail,
9
+ });
10
+ if (result.logs.length === 0) {
11
+ return `No logs available for job ${args.job_id}`;
12
+ }
13
+ let response = `**Logs for job ${args.job_id}** (last ${args.tail} lines):\n\n${'```'}\n`;
14
+ response += result.logs.join('\n');
15
+ response += `\n${'```'}`;
16
+ if (result.finished) {
17
+ response += '\n\n✓ Job finished.';
18
+ }
19
+ else if (result.truncated) {
20
+ response += '\n\n⚠ Log collection stopped after 10 seconds. Job may still be running.';
21
+ }
22
+ return response;
23
+ }
24
+ //# sourceMappingURL=logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../../src/jobs/commands/logs.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAMjD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAc,EAAE,MAAqB,EAAE,KAAc;IAEtF,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAG1D,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE;QAC1C,KAAK;QACL,WAAW,EAAE,KAAK;QAClB,QAAQ,EAAE,IAAI,CAAC,IAAI;KACnB,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,6BAA6B,IAAI,CAAC,MAAM,EAAE,CAAC;IACnD,CAAC;IAED,IAAI,QAAQ,GAAG,kBAAkB,IAAI,CAAC,MAAM,YAAY,IAAI,CAAC,IAAI,eAAe,KAAK,IAAI,CAAC;IAC1F,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,QAAQ,IAAI,KAAK,KAAK,EAAE,CAAC;IAEzB,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,QAAQ,IAAI,qBAAqB,CAAC;IACnC,CAAC;SAAM,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QAC7B,QAAQ,IAAI,0EAA0E,CAAC;IACxF,CAAC;IAED,OAAO,QAAQ,CAAC;AACjB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { PsArgs } from '../types.js';
2
+ import type { JobsApiClient } from '../api-client.js';
3
+ export declare function psCommand(args: PsArgs, client: JobsApiClient): Promise<string>;
4
+ //# sourceMappingURL=ps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ps.d.ts","sourceRoot":"","sources":["../../../src/jobs/commands/ps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAOtD,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CA+BpF"}
@@ -0,0 +1,23 @@
1
+ import { formatJobsTable } from '../formatters.js';
2
+ export async function psCommand(args, client) {
3
+ const allJobs = await client.listJobs(args.namespace);
4
+ let jobs = allJobs;
5
+ if (!args.all) {
6
+ jobs = jobs.filter((job) => job.status.stage === 'RUNNING');
7
+ }
8
+ if (args.status) {
9
+ const statusFilter = args.status.toUpperCase();
10
+ jobs = jobs.filter((job) => job.status.stage.toUpperCase().includes(statusFilter));
11
+ }
12
+ const table = formatJobsTable(jobs);
13
+ if (jobs.length === 0) {
14
+ if (args.all) {
15
+ return 'No jobs found.';
16
+ }
17
+ return 'No running jobs found. Use `{"all": true}` to show all jobs.';
18
+ }
19
+ return `**Jobs (${jobs.length} of ${allJobs.length} total):**
20
+
21
+ ${table}`;
22
+ }
23
+ //# sourceMappingURL=ps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ps.js","sourceRoot":"","sources":["../../../src/jobs/commands/ps.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAMnD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAY,EAAE,MAAqB;IAElE,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAGtD,IAAI,IAAI,GAAG,OAAO,CAAC;IAGnB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACf,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;IAC7D,CAAC;IAGD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QAC/C,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;IACpF,CAAC;IAGD,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAEpC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,gBAAgB,CAAC;QACzB,CAAC;QACD,OAAO,8DAA8D,CAAC;IACvE,CAAC;IAED,OAAO,WAAW,IAAI,CAAC,MAAM,OAAO,OAAO,CAAC,MAAM;;EAEjD,KAAK,EAAE,CAAC;AACV,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { RunArgs, UvArgs } from '../types.js';
2
+ import type { JobsApiClient } from '../api-client.js';
3
+ export declare function runCommand(args: RunArgs, client: JobsApiClient, token?: string): Promise<string>;
4
+ export declare function uvCommand(args: UvArgs, client: JobsApiClient, token?: string): Promise<string>;
5
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/jobs/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAQtD,wBAAsB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgDtG;AAMD,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAyCpG"}
@@ -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":"AAQA,OAAO,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAM3C,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAsB,EAAE,MAAqB;IAEtF,MAAM,OAAO,GAAG,aAAa,CAAC;QAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,OAAO,EAAE,IAAI,CAAC,OAAO;KACrB,CAAC,CAAC;IAGH,MAAM,aAAa,GAAqB;QACvC,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,OAAO;KACP,CAAC;IAGF,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAEpF,OAAO;;wBAEgB,YAAY,CAAC,EAAE;gBACvB,YAAY,CAAC,QAAQ;iBACpB,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;gBACpC,YAAY,CAAC,OAAO,IAAI,KAAK;;mEAEsB,YAAY,CAAC,EAAE;yCACzC,CAAC;AAC1C,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAqB,EAAE,MAAqB;IAEpF,MAAM,KAAK,GAAG,0CAA0C,CAAC;IAGzD,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC;IACjC,IAAI,OAAe,CAAC;IAEpB,IAAI,YAAY,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,YAAY,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/E,OAAO,GAAG,cAAc,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IAC9C,CAAC;SAAM,IAAI,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC7D,MAAM,IAAI,GACT,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACjH,OAAO,GAAG,SAAS,OAAO,0BAA0B,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;IACvG,CAAC;SAAM,CAAC;QACP,OAAO,GAAG,cAAc,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IAC9C,CAAC;IAGD,MAAM,gBAAgB,GAAqB;QAC1C,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,KAAK;QACL,OAAO;QACP,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,SAAS,EAAE,IAAI,CAAC,SAAS;KACzB,CAAC;IAEF,OAAO,mBAAmB,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;AACtD,CAAC;AAKD,SAAS,cAAc,CACtB,MAAc,EACd,IAAuE;IAEvE,MAAM,KAAK,GAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAEtC,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC3B,CAAC;IACF,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEnB,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrD,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACxB,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAqB,EAAE,MAAqB;IAEpF,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAG/D,IAAI,IAAI,GAAG,OAAO,CAAC;IAGnB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACf,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;IAGD,MAAM,KAAK,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;IAE7C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,0BAA0B,CAAC;QACnC,CAAC;QACD,OAAO,6EAA6E,CAAC;IACtF,CAAC;IAED,OAAO,qBAAqB,IAAI,CAAC,MAAM,OAAO,OAAO,CAAC,MAAM;;EAE3D,KAAK,EAAE,CAAC;AACV,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAAsB,EAAE,MAAqB;IAC1F,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAChF,MAAM,gBAAgB,GAAG,yBAAyB,CAAC,GAAG,CAAC,CAAC;IACxD,OAAO,iCAAiC,gBAAgB,EAAE,CAAC;AAC5D,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAAsB,EAAE,MAAqB;IACzF,MAAM,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAEvE,OAAO,mBAAmB,IAAI,CAAC,gBAAgB,oBAAoB,CAAC;AACrE,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAAsB,EAAE,MAAqB;IAC1F,MAAM,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAExE,OAAO,mBAAmB,IAAI,CAAC,gBAAgB;;iEAEiB,IAAI,CAAC,gBAAgB,OAAO,CAAC;AAC9F,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAAsB,EAAE,MAAqB;IACzF,MAAM,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAEvE,OAAO,mBAAmB,IAAI,CAAC,gBAAgB;;mEAEmB,IAAI,CAAC,gBAAgB,OAAO,CAAC;AAChG,CAAC"}
@@ -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"}