@ubnt/cawcut 0.1.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 (76) hide show
  1. package/config/developer-capabilities.json +36 -0
  2. package/config/products.json +45 -0
  3. package/dist/commands/app.d.ts +2 -0
  4. package/dist/commands/app.js +156 -0
  5. package/dist/commands/app.js.map +1 -0
  6. package/dist/commands/auth.d.ts +2 -0
  7. package/dist/commands/auth.js +62 -0
  8. package/dist/commands/auth.js.map +1 -0
  9. package/dist/commands/capabilities.d.ts +2 -0
  10. package/dist/commands/capabilities.js +83 -0
  11. package/dist/commands/capabilities.js.map +1 -0
  12. package/dist/commands/generate.d.ts +2 -0
  13. package/dist/commands/generate.js +73 -0
  14. package/dist/commands/generate.js.map +1 -0
  15. package/dist/commands/set.d.ts +2 -0
  16. package/dist/commands/set.js +25 -0
  17. package/dist/commands/set.js.map +1 -0
  18. package/dist/commands/task.d.ts +2 -0
  19. package/dist/commands/task.js +48 -0
  20. package/dist/commands/task.js.map +1 -0
  21. package/dist/index.d.ts +2 -0
  22. package/dist/index.js +21 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/lib/app-inputs.d.ts +17 -0
  25. package/dist/lib/app-inputs.js +191 -0
  26. package/dist/lib/app-inputs.js.map +1 -0
  27. package/dist/lib/assets.d.ts +16 -0
  28. package/dist/lib/assets.js +42 -0
  29. package/dist/lib/assets.js.map +1 -0
  30. package/dist/lib/capabilities.d.ts +6 -0
  31. package/dist/lib/capabilities.js +17 -0
  32. package/dist/lib/capabilities.js.map +1 -0
  33. package/dist/lib/capability-catalog.d.ts +56 -0
  34. package/dist/lib/capability-catalog.js +135 -0
  35. package/dist/lib/capability-catalog.js.map +1 -0
  36. package/dist/lib/capability-catalog.json +2743 -0
  37. package/dist/lib/config.d.ts +46 -0
  38. package/dist/lib/config.js +177 -0
  39. package/dist/lib/config.js.map +1 -0
  40. package/dist/lib/credentials.d.ts +11 -0
  41. package/dist/lib/credentials.js +47 -0
  42. package/dist/lib/credentials.js.map +1 -0
  43. package/dist/lib/developer.d.ts +36 -0
  44. package/dist/lib/developer.js +75 -0
  45. package/dist/lib/developer.js.map +1 -0
  46. package/dist/lib/download.d.ts +3 -0
  47. package/dist/lib/download.js +38 -0
  48. package/dist/lib/download.js.map +1 -0
  49. package/dist/lib/generate-request.d.ts +20 -0
  50. package/dist/lib/generate-request.js +74 -0
  51. package/dist/lib/generate-request.js.map +1 -0
  52. package/dist/lib/http.d.ts +16 -0
  53. package/dist/lib/http.js +90 -0
  54. package/dist/lib/http.js.map +1 -0
  55. package/dist/lib/local-config.d.ts +6 -0
  56. package/dist/lib/local-config.js +23 -0
  57. package/dist/lib/local-config.js.map +1 -0
  58. package/dist/lib/oauth.d.ts +25 -0
  59. package/dist/lib/oauth.js +141 -0
  60. package/dist/lib/oauth.js.map +1 -0
  61. package/dist/lib/output.d.ts +4 -0
  62. package/dist/lib/output.js +22 -0
  63. package/dist/lib/output.js.map +1 -0
  64. package/dist/lib/poll.d.ts +12 -0
  65. package/dist/lib/poll.js +26 -0
  66. package/dist/lib/poll.js.map +1 -0
  67. package/dist/lib/result-output.d.ts +18 -0
  68. package/dist/lib/result-output.js +82 -0
  69. package/dist/lib/result-output.js.map +1 -0
  70. package/dist/lib/spinner.d.ts +5 -0
  71. package/dist/lib/spinner.js +39 -0
  72. package/dist/lib/spinner.js.map +1 -0
  73. package/dist/lib/validate-generate.d.ts +21 -0
  74. package/dist/lib/validate-generate.js +191 -0
  75. package/dist/lib/validate-generate.js.map +1 -0
  76. package/package.json +34 -0
@@ -0,0 +1,17 @@
1
+ import type { ResolvedConfig } from "./config.js";
2
+ export type AppInputKind = "text" | "image" | "video" | "audio";
3
+ export interface AppInputSlot {
4
+ key: string;
5
+ kind: AppInputKind;
6
+ description: string;
7
+ required: boolean;
8
+ portId?: string;
9
+ nodeId?: string;
10
+ sampleUrl?: string;
11
+ cliExample?: string;
12
+ }
13
+ export declare function parseAppInputSlots(schema: Record<string, unknown> | undefined): AppInputSlot[];
14
+ export declare function findAppInputSlot(slots: AppInputSlot[], key: string): AppInputSlot | undefined;
15
+ export declare function formatAppInputSchemaLines(schema: Record<string, unknown> | undefined): string[];
16
+ export declare function formatAppInputsTable(appId: string, description: string | undefined, slots: AppInputSlot[]): string;
17
+ export declare function resolveAppInputs(config: ResolvedConfig, schema: Record<string, unknown> | undefined, raw: Record<string, unknown>, fetchImpl?: typeof fetch): Promise<Record<string, unknown>>;
@@ -0,0 +1,191 @@
1
+ import { existsSync } from "node:fs";
2
+ import { resolveMediaReference } from "./assets.js";
3
+ const KIND_LABEL = {
4
+ text: "text",
5
+ image: "image",
6
+ video: "video",
7
+ audio: "audio",
8
+ };
9
+ function asString(value) {
10
+ return typeof value === "string" && value.trim() !== "" ? value : undefined;
11
+ }
12
+ function parseKind(meta) {
13
+ const raw = asString(meta["x-cawcut-input-kind"]);
14
+ if (raw === "text" || raw === "image" || raw === "video" || raw === "audio") {
15
+ return raw;
16
+ }
17
+ if (meta.type === "string") {
18
+ return "text";
19
+ }
20
+ if (Array.isArray(meta.oneOf)) {
21
+ return "image";
22
+ }
23
+ return undefined;
24
+ }
25
+ export function parseAppInputSlots(schema) {
26
+ if (!schema) {
27
+ return [];
28
+ }
29
+ const properties = schema.properties;
30
+ if (!properties) {
31
+ return [];
32
+ }
33
+ const required = new Set(schema.required ?? []);
34
+ const slots = [];
35
+ for (const [key, meta] of Object.entries(properties)) {
36
+ const kind = parseKind(meta);
37
+ if (!kind) {
38
+ continue;
39
+ }
40
+ slots.push({
41
+ key,
42
+ kind,
43
+ description: asString(meta.description) ?? key,
44
+ required: required.has(key),
45
+ portId: asString(meta["x-cawcut-port-id"]),
46
+ nodeId: asString(meta["x-cawcut-node-id"]),
47
+ sampleUrl: asString(meta["x-cawcut-sample-url"]),
48
+ cliExample: asString(meta["x-cawcut-cli-example"]),
49
+ });
50
+ }
51
+ return slots;
52
+ }
53
+ function slotIndex(slots) {
54
+ const out = new Map();
55
+ for (const slot of slots) {
56
+ out.set(slot.key.toLowerCase(), slot);
57
+ if (slot.portId) {
58
+ out.set(slot.portId.toLowerCase(), slot);
59
+ }
60
+ if (slot.nodeId) {
61
+ out.set(slot.nodeId.toLowerCase(), slot);
62
+ }
63
+ }
64
+ return out;
65
+ }
66
+ export function findAppInputSlot(slots, key) {
67
+ return slotIndex(slots).get(key.trim().toLowerCase());
68
+ }
69
+ export function formatAppInputSchemaLines(schema) {
70
+ const slots = parseAppInputSlots(schema);
71
+ if (slots.length === 0) {
72
+ return [];
73
+ }
74
+ return slots.map((slot) => {
75
+ const req = slot.required ? "required" : "optional";
76
+ const kind = KIND_LABEL[slot.kind];
77
+ const hint = slot.kind === "text"
78
+ ? "string"
79
+ : "URL, @/local/path (auto-upload), or {asset_id,url} object";
80
+ return ` ${slot.key} [${kind}, ${req}] — ${slot.description} (${hint})`;
81
+ });
82
+ }
83
+ export function formatAppInputsTable(appId, description, slots) {
84
+ const lines = [];
85
+ lines.push(`App: ${appId}`);
86
+ if (description?.trim()) {
87
+ lines.push(`Description: ${description.trim()}`);
88
+ }
89
+ lines.push("");
90
+ if (slots.length === 0) {
91
+ lines.push("No exposed inputs (app may run without --input).");
92
+ return lines.join("\n");
93
+ }
94
+ lines.push("Inputs — use the KEY column with --input KEY=value:");
95
+ lines.push("");
96
+ lines.push(" KEY".padEnd(22) + "KIND".padEnd(8) + "REQ".padEnd(6) + "DESCRIPTION");
97
+ for (const slot of slots) {
98
+ const req = slot.required ? "yes" : "no";
99
+ lines.push(` ${slot.key}`.padEnd(22) +
100
+ KIND_LABEL[slot.kind].padEnd(8) +
101
+ req.padEnd(6) +
102
+ slot.description);
103
+ if (slot.cliExample) {
104
+ lines.push(` example: ${slot.cliExample}`);
105
+ }
106
+ if (slot.sampleUrl) {
107
+ lines.push(` sample: ${slot.sampleUrl}`);
108
+ }
109
+ }
110
+ const examples = slots
111
+ .slice(0, 3)
112
+ .map((s) => s.kind === "text"
113
+ ? `--input ${JSON.stringify(`${s.key}=...`)}`
114
+ : `--input ${JSON.stringify(`${s.key}=@/path/to/file`)}`);
115
+ lines.push("");
116
+ lines.push(`Run: cawcut app run ${appId} ${examples.join(" ")}`);
117
+ return lines.join("\n");
118
+ }
119
+ function looksLikeLocalMediaPath(value) {
120
+ const trimmed = value.trim();
121
+ if (!trimmed) {
122
+ return false;
123
+ }
124
+ if (trimmed.startsWith("@")) {
125
+ return true;
126
+ }
127
+ if (/^https?:\/\//i.test(trimmed)) {
128
+ return false;
129
+ }
130
+ if (trimmed.startsWith("/") || trimmed.startsWith("./") || trimmed.startsWith("../")) {
131
+ return existsSync(trimmed.startsWith("@") ? trimmed.slice(1) : trimmed);
132
+ }
133
+ return existsSync(trimmed);
134
+ }
135
+ async function resolveMediaInput(config, value, fetchImpl) {
136
+ if (value !== null && typeof value === "object" && !Array.isArray(value)) {
137
+ return value;
138
+ }
139
+ if (typeof value !== "string") {
140
+ throw new Error("expected URL string, @/path, or {asset_id,url} object");
141
+ }
142
+ let pathOrUrl = value.trim();
143
+ if (pathOrUrl.startsWith("@")) {
144
+ pathOrUrl = pathOrUrl.slice(1);
145
+ }
146
+ const ref = await resolveMediaReference(config, pathOrUrl, fetchImpl);
147
+ return {
148
+ asset_id: ref.asset_id,
149
+ url: ref.url,
150
+ format: ref.format,
151
+ mode: ref.mode,
152
+ preview_url: ref.preview_url,
153
+ };
154
+ }
155
+ export async function resolveAppInputs(config, schema, raw, fetchImpl = fetch) {
156
+ const slots = parseAppInputSlots(schema);
157
+ const index = slotIndex(slots);
158
+ const resolved = {};
159
+ for (const [key, value] of Object.entries(raw)) {
160
+ const slot = index.get(key.trim().toLowerCase());
161
+ if (!slot && slots.length > 0) {
162
+ const known = slots.map((s) => s.key).join(", ");
163
+ throw new Error(`unknown input key "${key}" (known keys: ${known})`);
164
+ }
165
+ const schemaKey = slot?.key ?? key;
166
+ if (!slot) {
167
+ if (typeof value === "string" && looksLikeLocalMediaPath(value)) {
168
+ resolved[schemaKey] = await resolveMediaInput(config, value, fetchImpl);
169
+ }
170
+ else {
171
+ resolved[schemaKey] = value;
172
+ }
173
+ continue;
174
+ }
175
+ if (slot.kind === "text") {
176
+ if (typeof value === "string") {
177
+ resolved[schemaKey] = value;
178
+ }
179
+ else if (typeof value === "number" || typeof value === "boolean") {
180
+ resolved[schemaKey] = String(value);
181
+ }
182
+ else {
183
+ throw new Error("expected text string");
184
+ }
185
+ continue;
186
+ }
187
+ resolved[schemaKey] = await resolveMediaInput(config, value, fetchImpl);
188
+ }
189
+ return resolved;
190
+ }
191
+ //# sourceMappingURL=app-inputs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-inputs.js","sourceRoot":"","sources":["../../src/lib/app-inputs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { ResolvedConfig } from "./config.js";
2
+ export interface UploadAssetResponse {
3
+ asset_id: string;
4
+ url: string;
5
+ format: string;
6
+ mode: string;
7
+ preview_url?: string;
8
+ }
9
+ export declare function resolveMediaReference(config: ResolvedConfig, pathOrUrl: string, fetchImpl?: typeof fetch): Promise<{
10
+ asset_id?: string;
11
+ url?: string;
12
+ format?: string;
13
+ mode?: string;
14
+ preview_url?: string;
15
+ }>;
16
+ export declare function uploadDeveloperAsset(config: ResolvedConfig, filePath: string, fetchImpl?: typeof fetch): Promise<UploadAssetResponse>;
@@ -0,0 +1,42 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { basename } from "node:path";
3
+ import { apiRequest } from "./http.js";
4
+ function isHttpUrl(value) {
5
+ return /^https?:\/\//i.test(value);
6
+ }
7
+ export async function resolveMediaReference(config, pathOrUrl, fetchImpl = fetch) {
8
+ const trimmed = pathOrUrl.trim();
9
+ if (!trimmed) {
10
+ throw new Error("Media path or URL is empty");
11
+ }
12
+ if (isHttpUrl(trimmed)) {
13
+ return { url: trimmed };
14
+ }
15
+ const uploaded = await uploadDeveloperAsset(config, trimmed, fetchImpl);
16
+ return {
17
+ asset_id: uploaded.asset_id,
18
+ url: uploaded.url,
19
+ format: uploaded.format,
20
+ mode: uploaded.mode,
21
+ preview_url: uploaded.preview_url,
22
+ };
23
+ }
24
+ export async function uploadDeveloperAsset(config, filePath, fetchImpl = fetch) {
25
+ const bytes = readFileSync(filePath);
26
+ const form = new FormData();
27
+ form.append("file", new Blob([bytes]), basename(filePath));
28
+ form.append("mode", "input");
29
+ form.append("expires_after_second", "604800");
30
+ const response = await apiRequest(config, "/developer/assets", {
31
+ api: "workflow",
32
+ method: "POST",
33
+ body: form,
34
+ }, fetchImpl);
35
+ const body = (await response.json());
36
+ const data = body.data;
37
+ if (!data?.asset_id || !data.url) {
38
+ throw new Error("Asset upload did not return asset_id and url");
39
+ }
40
+ return data;
41
+ }
42
+ //# sourceMappingURL=assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.js","sourceRoot":"","sources":["../../src/lib/assets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAUvC,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAsB,EACtB,SAAiB,EACjB,YAA0B,KAAK;IAQ/B,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;IAC1B,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACxE,OAAO;QACL,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,GAAG,EAAE,QAAQ,CAAC,GAAG;QACjB,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,WAAW,EAAE,QAAQ,CAAC,WAAW;KAClC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAsB,EACtB,QAAgB,EAChB,YAA0B,KAAK;IAE/B,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3D,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE,QAAQ,CAAC,CAAC;IAE9C,MAAM,QAAQ,GAAG,MAAM,UAAU,CAC/B,MAAM,EACN,mBAAmB,EACnB;QACE,GAAG,EAAE,UAAU;QACf,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI;KACX,EACD,SAAS,CACV,CAAC;IAEF,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAmC,CAAC;IACvE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvB,IAAI,CAAC,IAAI,EAAE,QAAQ,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { type CapabilitySpec } from "./capability-catalog.js";
2
+ export type CapabilityKey = string;
3
+ export declare function listCapabilityKeys(): string[];
4
+ export declare function assertCapabilityKey(key: string): CapabilityKey;
5
+ export declare function isCapabilityKey(key: string): key is CapabilityKey;
6
+ export declare function getCapability(key: string): CapabilitySpec | undefined;
@@ -0,0 +1,17 @@
1
+ import { getCapabilitySpec, listCapabilityKeys as listCatalogKeys, } from "./capability-catalog.js";
2
+ export function listCapabilityKeys() {
3
+ return listCatalogKeys();
4
+ }
5
+ export function assertCapabilityKey(key) {
6
+ if (!isCapabilityKey(key)) {
7
+ throw new Error(`Unknown capability "${key}". Valid: ${listCapabilityKeys().join(", ")}`);
8
+ }
9
+ return key;
10
+ }
11
+ export function isCapabilityKey(key) {
12
+ return getCapabilitySpec(key) !== undefined;
13
+ }
14
+ export function getCapability(key) {
15
+ return getCapabilitySpec(key);
16
+ }
17
+ //# sourceMappingURL=capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/lib/capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,kBAAkB,IAAI,eAAe,GAEtC,MAAM,yBAAyB,CAAC;AAIjC,MAAM,UAAU,kBAAkB;IAChC,OAAO,eAAe,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,uBAAuB,GAAG,aAAa,kBAAkB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACzE,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,OAAO,iBAAiB,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,56 @@
1
+ export type ParamType = "string" | "int" | "long" | "float" | "bool";
2
+ export interface ParamSpec {
3
+ name: string;
4
+ type: ParamType;
5
+ default?: string | number | boolean;
6
+ enum?: string[];
7
+ min?: number;
8
+ max?: number;
9
+ minLength?: number;
10
+ maxLength?: number;
11
+ title?: string;
12
+ }
13
+ export interface MediaLimit {
14
+ min: number;
15
+ max: number;
16
+ }
17
+ export interface MediaSpec {
18
+ images: MediaLimit;
19
+ videos: MediaLimit;
20
+ audios: MediaLimit;
21
+ }
22
+ export interface CliMediaLimit {
23
+ maxImages: number;
24
+ maxVideos: number;
25
+ maxAudios: number;
26
+ }
27
+ export type RequiresMedia = "image" | "video" | "audio" | "omni" | null;
28
+ export interface ModelSpec {
29
+ id: string;
30
+ vendorId?: string;
31
+ vendorName?: string;
32
+ media: MediaSpec;
33
+ params: ParamSpec[];
34
+ }
35
+ export interface CapabilitySpec {
36
+ capability: string;
37
+ hybridAppId: string | null;
38
+ subAppId: string;
39
+ subType: string | null;
40
+ defaultModel: string;
41
+ requiresMedia: RequiresMedia;
42
+ configSource: string;
43
+ cliMedia: CliMediaLimit;
44
+ models: ModelSpec[];
45
+ }
46
+ export interface CapabilityCatalog {
47
+ generatedAt: string;
48
+ aiKitRoot: string;
49
+ capabilities: Record<string, CapabilitySpec>;
50
+ }
51
+ export declare function getCapabilityCatalog(): CapabilityCatalog;
52
+ export declare function listCatalogCapabilities(): CapabilitySpec[];
53
+ export declare function getCapabilitySpec(capability: string): CapabilitySpec | undefined;
54
+ export declare function listCapabilityKeys(): string[];
55
+ export declare function getModelSpec(capability: CapabilitySpec, modelId?: string): ModelSpec | undefined;
56
+ export declare function capabilityInputSchema(spec: CapabilitySpec, model?: ModelSpec): Record<string, unknown>;
@@ -0,0 +1,135 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ let catalogCache;
5
+ function catalogPath() {
6
+ return join(dirname(fileURLToPath(import.meta.url)), "capability-catalog.json");
7
+ }
8
+ export function getCapabilityCatalog() {
9
+ if (!catalogCache) {
10
+ catalogCache = JSON.parse(readFileSync(catalogPath(), "utf8"));
11
+ }
12
+ return catalogCache;
13
+ }
14
+ export function listCatalogCapabilities() {
15
+ return Object.values(getCapabilityCatalog().capabilities);
16
+ }
17
+ export function getCapabilitySpec(capability) {
18
+ return getCapabilityCatalog().capabilities[capability];
19
+ }
20
+ export function listCapabilityKeys() {
21
+ return Object.keys(getCapabilityCatalog().capabilities);
22
+ }
23
+ export function getModelSpec(capability, modelId) {
24
+ const want = modelId?.trim() || capability.defaultModel;
25
+ return capability.models.find((m) => m.id === want);
26
+ }
27
+ export function capabilityInputSchema(spec, model) {
28
+ const modelSpec = model ?? getModelSpec(spec);
29
+ const paramProps = {};
30
+ for (const p of modelSpec?.params ?? []) {
31
+ const prop = { type: jsonSchemaType(p.type) };
32
+ if (p.enum) {
33
+ prop.enum = p.enum;
34
+ }
35
+ if (p.default !== undefined) {
36
+ prop.default = p.default;
37
+ }
38
+ if (p.min !== undefined) {
39
+ prop.minimum = p.min;
40
+ }
41
+ if (p.max !== undefined) {
42
+ prop.maximum = p.max;
43
+ }
44
+ if (p.title) {
45
+ prop.description = p.title;
46
+ }
47
+ paramProps[p.name] = prop;
48
+ }
49
+ const mediaDesc = formatMediaHelp(spec, modelSpec);
50
+ return {
51
+ type: "object",
52
+ properties: {
53
+ capability: { type: "string", const: spec.capability },
54
+ prompt: { type: "string", description: "Generation prompt" },
55
+ model: {
56
+ type: "string",
57
+ enum: spec.models.map((m) => m.id),
58
+ default: spec.defaultModel,
59
+ description: "AI Kit model id",
60
+ },
61
+ params: {
62
+ type: "object",
63
+ properties: paramProps,
64
+ additionalProperties: false,
65
+ description: "Model parameters (--param key=value)",
66
+ },
67
+ media: {
68
+ type: "object",
69
+ description: mediaDesc,
70
+ properties: {
71
+ image: { type: "string", description: "Local path or URL (--image)" },
72
+ video: { type: "string", description: "Local path or URL (--video)" },
73
+ audio: { type: "string", description: "Local path or URL (--audio)" },
74
+ },
75
+ },
76
+ },
77
+ required: buildRequired(spec),
78
+ };
79
+ }
80
+ function jsonSchemaType(type) {
81
+ switch (type) {
82
+ case "int":
83
+ case "long":
84
+ return "integer";
85
+ case "float":
86
+ return "number";
87
+ case "bool":
88
+ return "boolean";
89
+ default:
90
+ return "string";
91
+ }
92
+ }
93
+ function buildRequired(spec) {
94
+ const required = ["capability"];
95
+ if (spec.requiresMedia === "image") {
96
+ required.push("media.image");
97
+ }
98
+ else if (spec.requiresMedia === "video") {
99
+ required.push("media.video");
100
+ }
101
+ else if (spec.requiresMedia === "audio") {
102
+ required.push("media.audio");
103
+ }
104
+ else if (spec.requiresMedia === "omni") {
105
+ required.push("media");
106
+ }
107
+ else {
108
+ required.push("prompt");
109
+ }
110
+ return required;
111
+ }
112
+ function formatMediaHelp(spec, model) {
113
+ if (!model) {
114
+ return "Media inputs";
115
+ }
116
+ const m = model.media;
117
+ const parts = [];
118
+ if (m.images.max > 0) {
119
+ parts.push(`images ${m.images.min}-${Math.min(m.images.max, spec.cliMedia.maxImages)}`);
120
+ }
121
+ if (m.videos.max > 0) {
122
+ parts.push(`videos ${m.videos.min}-${Math.min(m.videos.max, spec.cliMedia.maxVideos)}`);
123
+ }
124
+ if (m.audios.max > 0) {
125
+ parts.push(`audios ${m.audios.min}-${Math.min(m.audios.max, spec.cliMedia.maxAudios)}`);
126
+ }
127
+ if (spec.requiresMedia === "omni") {
128
+ return `Exactly one of image, video, or audio (${parts.join("; ") || "see model"})`;
129
+ }
130
+ if (parts.length === 0) {
131
+ return "No media inputs";
132
+ }
133
+ return parts.join("; ");
134
+ }
135
+ //# sourceMappingURL=capability-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability-catalog.js","sourceRoot":"","sources":["../../src/lib/capability-catalog.ts"],"names":[],"mappings":"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"}