@copilotkit/shared 1.66.4 → 1.67.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +53 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +2 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +2 -1
- package/dist/index.mjs.map +1 -1
- package/dist/index.umd.js +149 -4
- package/dist/index.umd.js.map +1 -1
- package/dist/package.cjs +1 -1
- package/dist/package.mjs +1 -1
- package/dist/utils/index.cjs +3 -2
- package/dist/utils/index.cjs.map +1 -1
- package/dist/utils/index.d.cts +1 -0
- package/dist/utils/index.d.cts.map +1 -1
- package/dist/utils/index.d.mts +1 -0
- package/dist/utils/index.d.mts.map +1 -1
- package/dist/utils/index.mjs +3 -2
- package/dist/utils/index.mjs.map +1 -1
- package/dist/utils/inspector-metadata.cjs +147 -0
- package/dist/utils/inspector-metadata.cjs.map +1 -0
- package/dist/utils/inspector-metadata.d.cts +55 -0
- package/dist/utils/inspector-metadata.d.cts.map +1 -0
- package/dist/utils/inspector-metadata.d.mts +55 -0
- package/dist/utils/inspector-metadata.d.mts.map +1 -0
- package/dist/utils/inspector-metadata.mjs +146 -0
- package/dist/utils/inspector-metadata.mjs.map +1 -0
- package/dist/utils/types.cjs.map +1 -1
- package/dist/utils/types.d.cts +2 -0
- package/dist/utils/types.d.cts.map +1 -1
- package/dist/utils/types.d.mts +2 -0
- package/dist/utils/types.d.mts.map +1 -1
- package/dist/utils/types.mjs.map +1 -1
- package/package.json +1 -1
- package/src/utils/index.ts +3 -2
- package/src/utils/inspector-metadata.test.ts +742 -0
- package/src/utils/inspector-metadata.ts +273 -0
- package/src/utils/types.ts +2 -0
package/dist/package.cjs
CHANGED
package/dist/package.mjs
CHANGED
package/dist/utils/index.cjs
CHANGED
|
@@ -4,6 +4,7 @@ const require_conditions = require('./conditions.cjs');
|
|
|
4
4
|
const require_console_styling = require('./console-styling.cjs');
|
|
5
5
|
const require_errors = require('./errors.cjs');
|
|
6
6
|
const require_json_schema = require('./json-schema.cjs');
|
|
7
|
+
const require_inspector_metadata = require('./inspector-metadata.cjs');
|
|
7
8
|
const require_types = require('./types.cjs');
|
|
8
9
|
const require_random_id = require('./random-id.cjs');
|
|
9
10
|
const require_requests = require('./requests.cjs');
|
|
@@ -20,7 +21,7 @@ partial_json = require_runtime.__toESM(partial_json);
|
|
|
20
21
|
function parseJson(json, fallback = "unset") {
|
|
21
22
|
try {
|
|
22
23
|
return JSON.parse(json);
|
|
23
|
-
} catch
|
|
24
|
+
} catch {
|
|
24
25
|
return fallback === "unset" ? null : fallback;
|
|
25
26
|
}
|
|
26
27
|
}
|
|
@@ -33,7 +34,7 @@ function partialJSONParse(json) {
|
|
|
33
34
|
const parsed = partial_json.parse(json);
|
|
34
35
|
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) return parsed;
|
|
35
36
|
return {};
|
|
36
|
-
} catch
|
|
37
|
+
} catch {
|
|
37
38
|
return {};
|
|
38
39
|
}
|
|
39
40
|
}
|
package/dist/utils/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["PartialJSON"],"sources":["../../src/utils/index.ts"],"sourcesContent":["export * from \"./clipboard\";\nexport * from \"./conditions\";\nexport * from \"./console-styling\";\nexport * from \"./errors\";\nexport * from \"./json-schema\";\nexport * from \"./types\";\nexport * from \"./random-id\";\nexport * from \"./requests\";\n\nimport * as PartialJSON from \"partial-json\";\n\n/**\n * Safely parses a JSON string into an object\n * @param json The JSON string to parse\n * @param fallback Optional fallback value to return if parsing fails. If not provided or set to \"unset\", returns null\n * @returns The parsed JSON object, or the fallback value (or null) if parsing fails\n */\nexport function parseJson(json: string, fallback: any = \"unset\") {\n try {\n return JSON.parse(json);\n } catch
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["PartialJSON"],"sources":["../../src/utils/index.ts"],"sourcesContent":["export * from \"./clipboard\";\nexport * from \"./conditions\";\nexport * from \"./console-styling\";\nexport * from \"./errors\";\nexport * from \"./json-schema\";\nexport * from \"./inspector-metadata\";\nexport * from \"./types\";\nexport * from \"./random-id\";\nexport * from \"./requests\";\n\nimport * as PartialJSON from \"partial-json\";\n\n/**\n * Safely parses a JSON string into an object\n * @param json The JSON string to parse\n * @param fallback Optional fallback value to return if parsing fails. If not provided or set to \"unset\", returns null\n * @returns The parsed JSON object, or the fallback value (or null) if parsing fails\n */\nexport function parseJson(json: string, fallback: any = \"unset\") {\n try {\n return JSON.parse(json);\n } catch {\n return fallback === \"unset\" ? null : fallback;\n }\n}\n\n/**\n * Parses a partial/incomplete JSON string, returning as much valid data as possible.\n * Falls back to an empty object if parsing fails entirely.\n */\nexport function partialJSONParse(json: string) {\n try {\n const parsed = PartialJSON.parse(json);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parsed;\n }\n return {};\n } catch {\n return {};\n }\n}\n\n/**\n * Returns an exponential backoff function suitable for Phoenix.js\n * `reconnectAfterMs` and `rejoinAfterMs` options.\n *\n * @param baseMs - Initial delay for the first retry attempt.\n * @param maxMs - Upper bound — delays are capped at this value.\n *\n * Phoenix calls the returned function with a 1-based `tries` count.\n * The delay doubles on each attempt: baseMs, 2×baseMs, 4×baseMs, …, maxMs.\n */\nexport function phoenixExponentialBackoff(\n baseMs: number,\n maxMs: number,\n): (tries: number) => number {\n return (tries: number) => Math.min(baseMs * 2 ** (tries - 1), maxMs);\n}\n\n/**\n * Maps an array of items to a new array, skipping items that throw errors during mapping\n * @param items The array to map\n * @param callback The mapping function to apply to each item\n * @returns A new array containing only the successfully mapped items\n */\nexport function tryMap<TItem, TMapped>(\n items: TItem[],\n callback: (item: TItem, index: number, array: TItem[]) => TMapped,\n): TMapped[] {\n return items.reduce<TMapped[]>((acc, item, index, array) => {\n try {\n acc.push(callback(item, index, array));\n } catch (error) {\n console.error(error);\n }\n return acc;\n }, []);\n}\n\n/**\n * Checks if the current environment is macOS\n * @returns {boolean} True if running on macOS, false otherwise\n */\nexport function isMacOS(): boolean {\n return /Mac|iMac|Macintosh/i.test(navigator.userAgent);\n}\n\n/**\n * Safely parses a JSON string into a tool arguments object.\n * Returns the parsed object only if it's a plain object (not an array, null, etc.).\n * Falls back to an empty object for any non-object JSON value or parse failure.\n */\nexport function safeParseToolArgs(raw: string): Record<string, unknown> {\n try {\n const parsed = JSON.parse(raw);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parsed;\n }\n console.warn(\n `[CopilotKit] Tool arguments parsed to non-object (${typeof parsed}), falling back to empty object`,\n );\n return {};\n } catch {\n console.warn(\n \"[CopilotKit] Failed to parse tool arguments, falling back to empty object\",\n );\n return {};\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAkBA,SAAgB,UAAU,MAAc,WAAgB,SAAS;AAC/D,KAAI;AACF,SAAO,KAAK,MAAM,KAAK;SACjB;AACN,SAAO,aAAa,UAAU,OAAO;;;;;;;AAQzC,SAAgB,iBAAiB,MAAc;AAC7C,KAAI;EACF,MAAM,SAASA,aAAY,MAAM,KAAK;AACtC,MAAI,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,OAAO,CAChE,QAAO;AAET,SAAO,EAAE;SACH;AACN,SAAO,EAAE;;;;;;;;;;;;;AAcb,SAAgB,0BACd,QACA,OAC2B;AAC3B,SAAQ,UAAkB,KAAK,IAAI,SAAS,MAAM,QAAQ,IAAI,MAAM;;;;;;;;AAStE,SAAgB,OACd,OACA,UACW;AACX,QAAO,MAAM,QAAmB,KAAK,MAAM,OAAO,UAAU;AAC1D,MAAI;AACF,OAAI,KAAK,SAAS,MAAM,OAAO,MAAM,CAAC;WAC/B,OAAO;AACd,WAAQ,MAAM,MAAM;;AAEtB,SAAO;IACN,EAAE,CAAC;;;;;;AAOR,SAAgB,UAAmB;AACjC,QAAO,sBAAsB,KAAK,UAAU,UAAU;;;;;;;AAQxD,SAAgB,kBAAkB,KAAsC;AACtE,KAAI;EACF,MAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,MAAI,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,OAAO,CAChE,QAAO;AAET,UAAQ,KACN,qDAAqD,OAAO,OAAO,iCACpE;AACD,SAAO,EAAE;SACH;AACN,UAAQ,KACN,4EACD;AACD,SAAO,EAAE"}
|
package/dist/utils/index.d.cts
CHANGED
|
@@ -3,6 +3,7 @@ import { BaseCondition, ComparisonCondition, ComparisonRule, Condition, Existenc
|
|
|
3
3
|
import { ConsoleColors, ConsoleStyles, logCopilotKitPlatformMessage, logStyled, publicApiKeyRequired, styledConsole } from "./console-styling.cjs";
|
|
4
4
|
import { BANNER_ERROR_NAMES, COPILOT_CLOUD_ERROR_NAMES, ConfigurationError, CopilotKitAgentDiscoveryError, CopilotKitApiDiscoveryError, CopilotKitError, CopilotKitErrorCode, CopilotKitLowLevelError, CopilotKitMisuseError, CopilotKitRemoteEndpointDiscoveryError, CopilotKitVersionMismatchError, ERROR_CONFIG, ERROR_NAMES, ErrorVisibility, MissingPublicApiKeyError, ResolvedCopilotKitError, Severity, UpgradeRequiredError, ensureStructuredError, getPossibleVersionMismatch, isStructuredCopilotKitError } from "./errors.cjs";
|
|
5
5
|
import { JSONSchema, JSONSchemaArray, JSONSchemaBoolean, JSONSchemaNumber, JSONSchemaObject, JSONSchemaString, actionParametersToJsonSchema, convertJsonSchemaToZodSchema, getZodParameters, jsonSchemaToActionParameters } from "./json-schema.cjs";
|
|
6
|
+
import { InspectorMetadataV1, parseInspectorMetadataV1 } from "./inspector-metadata.cjs";
|
|
6
7
|
import { A2UIRuntimeInfo, AgentDescription, IntelligenceRuntimeInfo, MaybePromise, NonEmptyRecord, RUNTIME_MODE_INTELLIGENCE, RUNTIME_MODE_SSE, RuntimeInfo, RuntimeLicenseStatus, RuntimeMode, ThreadEndpointRuntimeInfo } from "./types.cjs";
|
|
7
8
|
import { dataToUUID, isValidUUID, randomId, randomUUID } from "./random-id.cjs";
|
|
8
9
|
import { readBody } from "./requests.cjs";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../../src/utils/index.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../../src/utils/index.ts"],"mappings":";;;;;;;;;;;;;AAkBA;;;;iBAAgB,SAAA,CAAU,IAAA,UAAc,QAAA;AAYxC;;;;AAAA,iBAAgB,gBAAA,CAAiB,IAAA;AAsBjC;;;;;;;;;AAaA;AAbA,iBAAgB,yBAAA,CACd,MAAA,UACA,KAAA,YACE,KAAA;;;;;;;iBAUY,MAAA,gBAAA,CACd,KAAA,EAAO,KAAA,IACP,QAAA,GAAW,IAAA,EAAM,KAAA,EAAO,KAAA,UAAe,KAAA,EAAO,KAAA,OAAY,OAAA,GACzD,OAAA;;;;;iBAea,OAAA,CAAA;;;;;;iBASA,iBAAA,CAAkB,GAAA,WAAc,MAAA"}
|
package/dist/utils/index.d.mts
CHANGED
|
@@ -3,6 +3,7 @@ import { BaseCondition, ComparisonCondition, ComparisonRule, Condition, Existenc
|
|
|
3
3
|
import { ConsoleColors, ConsoleStyles, logCopilotKitPlatformMessage, logStyled, publicApiKeyRequired, styledConsole } from "./console-styling.mjs";
|
|
4
4
|
import { BANNER_ERROR_NAMES, COPILOT_CLOUD_ERROR_NAMES, ConfigurationError, CopilotKitAgentDiscoveryError, CopilotKitApiDiscoveryError, CopilotKitError, CopilotKitErrorCode, CopilotKitLowLevelError, CopilotKitMisuseError, CopilotKitRemoteEndpointDiscoveryError, CopilotKitVersionMismatchError, ERROR_CONFIG, ERROR_NAMES, ErrorVisibility, MissingPublicApiKeyError, ResolvedCopilotKitError, Severity, UpgradeRequiredError, ensureStructuredError, getPossibleVersionMismatch, isStructuredCopilotKitError } from "./errors.mjs";
|
|
5
5
|
import { JSONSchema, JSONSchemaArray, JSONSchemaBoolean, JSONSchemaNumber, JSONSchemaObject, JSONSchemaString, actionParametersToJsonSchema, convertJsonSchemaToZodSchema, getZodParameters, jsonSchemaToActionParameters } from "./json-schema.mjs";
|
|
6
|
+
import { InspectorMetadataV1, parseInspectorMetadataV1 } from "./inspector-metadata.mjs";
|
|
6
7
|
import { A2UIRuntimeInfo, AgentDescription, IntelligenceRuntimeInfo, MaybePromise, NonEmptyRecord, RUNTIME_MODE_INTELLIGENCE, RUNTIME_MODE_SSE, RuntimeInfo, RuntimeLicenseStatus, RuntimeMode, ThreadEndpointRuntimeInfo } from "./types.mjs";
|
|
7
8
|
import { dataToUUID, isValidUUID, randomId, randomUUID } from "./random-id.mjs";
|
|
8
9
|
import { readBody } from "./requests.mjs";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/utils/index.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/utils/index.ts"],"mappings":";;;;;;;;;;;;;AAkBA;;;;iBAAgB,SAAA,CAAU,IAAA,UAAc,QAAA;AAYxC;;;;AAAA,iBAAgB,gBAAA,CAAiB,IAAA;AAsBjC;;;;;;;;;AAaA;AAbA,iBAAgB,yBAAA,CACd,MAAA,UACA,KAAA,YACE,KAAA;;;;;;;iBAUY,MAAA,gBAAA,CACd,KAAA,EAAO,KAAA,IACP,QAAA,GAAW,IAAA,EAAM,KAAA,EAAO,KAAA,UAAe,KAAA,EAAO,KAAA,OAAY,OAAA,GACzD,OAAA;;;;;iBAea,OAAA,CAAA;;;;;;iBASA,iBAAA,CAAkB,GAAA,WAAc,MAAA"}
|
package/dist/utils/index.mjs
CHANGED
|
@@ -3,6 +3,7 @@ import { executeConditions } from "./conditions.mjs";
|
|
|
3
3
|
import { ConsoleColors, ConsoleStyles, logCopilotKitPlatformMessage, logStyled, publicApiKeyRequired, styledConsole } from "./console-styling.mjs";
|
|
4
4
|
import { BANNER_ERROR_NAMES, COPILOT_CLOUD_ERROR_NAMES, ConfigurationError, CopilotKitAgentDiscoveryError, CopilotKitApiDiscoveryError, CopilotKitError, CopilotKitErrorCode, CopilotKitLowLevelError, CopilotKitMisuseError, CopilotKitRemoteEndpointDiscoveryError, CopilotKitVersionMismatchError, ERROR_CONFIG, ERROR_NAMES, ErrorVisibility, MissingPublicApiKeyError, ResolvedCopilotKitError, Severity, UpgradeRequiredError, ensureStructuredError, getPossibleVersionMismatch, isStructuredCopilotKitError } from "./errors.mjs";
|
|
5
5
|
import { actionParametersToJsonSchema, convertJsonSchemaToZodSchema, getZodParameters, jsonSchemaToActionParameters } from "./json-schema.mjs";
|
|
6
|
+
import { parseInspectorMetadataV1 } from "./inspector-metadata.mjs";
|
|
6
7
|
import { RUNTIME_MODE_INTELLIGENCE, RUNTIME_MODE_SSE } from "./types.mjs";
|
|
7
8
|
import { dataToUUID, isValidUUID, randomId, randomUUID } from "./random-id.mjs";
|
|
8
9
|
import { readBody } from "./requests.mjs";
|
|
@@ -18,7 +19,7 @@ import * as PartialJSON from "partial-json";
|
|
|
18
19
|
function parseJson(json, fallback = "unset") {
|
|
19
20
|
try {
|
|
20
21
|
return JSON.parse(json);
|
|
21
|
-
} catch
|
|
22
|
+
} catch {
|
|
22
23
|
return fallback === "unset" ? null : fallback;
|
|
23
24
|
}
|
|
24
25
|
}
|
|
@@ -31,7 +32,7 @@ function partialJSONParse(json) {
|
|
|
31
32
|
const parsed = PartialJSON.parse(json);
|
|
32
33
|
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) return parsed;
|
|
33
34
|
return {};
|
|
34
|
-
} catch
|
|
35
|
+
} catch {
|
|
35
36
|
return {};
|
|
36
37
|
}
|
|
37
38
|
}
|
package/dist/utils/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/utils/index.ts"],"sourcesContent":["export * from \"./clipboard\";\nexport * from \"./conditions\";\nexport * from \"./console-styling\";\nexport * from \"./errors\";\nexport * from \"./json-schema\";\nexport * from \"./types\";\nexport * from \"./random-id\";\nexport * from \"./requests\";\n\nimport * as PartialJSON from \"partial-json\";\n\n/**\n * Safely parses a JSON string into an object\n * @param json The JSON string to parse\n * @param fallback Optional fallback value to return if parsing fails. If not provided or set to \"unset\", returns null\n * @returns The parsed JSON object, or the fallback value (or null) if parsing fails\n */\nexport function parseJson(json: string, fallback: any = \"unset\") {\n try {\n return JSON.parse(json);\n } catch
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/utils/index.ts"],"sourcesContent":["export * from \"./clipboard\";\nexport * from \"./conditions\";\nexport * from \"./console-styling\";\nexport * from \"./errors\";\nexport * from \"./json-schema\";\nexport * from \"./inspector-metadata\";\nexport * from \"./types\";\nexport * from \"./random-id\";\nexport * from \"./requests\";\n\nimport * as PartialJSON from \"partial-json\";\n\n/**\n * Safely parses a JSON string into an object\n * @param json The JSON string to parse\n * @param fallback Optional fallback value to return if parsing fails. If not provided or set to \"unset\", returns null\n * @returns The parsed JSON object, or the fallback value (or null) if parsing fails\n */\nexport function parseJson(json: string, fallback: any = \"unset\") {\n try {\n return JSON.parse(json);\n } catch {\n return fallback === \"unset\" ? null : fallback;\n }\n}\n\n/**\n * Parses a partial/incomplete JSON string, returning as much valid data as possible.\n * Falls back to an empty object if parsing fails entirely.\n */\nexport function partialJSONParse(json: string) {\n try {\n const parsed = PartialJSON.parse(json);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parsed;\n }\n return {};\n } catch {\n return {};\n }\n}\n\n/**\n * Returns an exponential backoff function suitable for Phoenix.js\n * `reconnectAfterMs` and `rejoinAfterMs` options.\n *\n * @param baseMs - Initial delay for the first retry attempt.\n * @param maxMs - Upper bound — delays are capped at this value.\n *\n * Phoenix calls the returned function with a 1-based `tries` count.\n * The delay doubles on each attempt: baseMs, 2×baseMs, 4×baseMs, …, maxMs.\n */\nexport function phoenixExponentialBackoff(\n baseMs: number,\n maxMs: number,\n): (tries: number) => number {\n return (tries: number) => Math.min(baseMs * 2 ** (tries - 1), maxMs);\n}\n\n/**\n * Maps an array of items to a new array, skipping items that throw errors during mapping\n * @param items The array to map\n * @param callback The mapping function to apply to each item\n * @returns A new array containing only the successfully mapped items\n */\nexport function tryMap<TItem, TMapped>(\n items: TItem[],\n callback: (item: TItem, index: number, array: TItem[]) => TMapped,\n): TMapped[] {\n return items.reduce<TMapped[]>((acc, item, index, array) => {\n try {\n acc.push(callback(item, index, array));\n } catch (error) {\n console.error(error);\n }\n return acc;\n }, []);\n}\n\n/**\n * Checks if the current environment is macOS\n * @returns {boolean} True if running on macOS, false otherwise\n */\nexport function isMacOS(): boolean {\n return /Mac|iMac|Macintosh/i.test(navigator.userAgent);\n}\n\n/**\n * Safely parses a JSON string into a tool arguments object.\n * Returns the parsed object only if it's a plain object (not an array, null, etc.).\n * Falls back to an empty object for any non-object JSON value or parse failure.\n */\nexport function safeParseToolArgs(raw: string): Record<string, unknown> {\n try {\n const parsed = JSON.parse(raw);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parsed;\n }\n console.warn(\n `[CopilotKit] Tool arguments parsed to non-object (${typeof parsed}), falling back to empty object`,\n );\n return {};\n } catch {\n console.warn(\n \"[CopilotKit] Failed to parse tool arguments, falling back to empty object\",\n );\n return {};\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAkBA,SAAgB,UAAU,MAAc,WAAgB,SAAS;AAC/D,KAAI;AACF,SAAO,KAAK,MAAM,KAAK;SACjB;AACN,SAAO,aAAa,UAAU,OAAO;;;;;;;AAQzC,SAAgB,iBAAiB,MAAc;AAC7C,KAAI;EACF,MAAM,SAAS,YAAY,MAAM,KAAK;AACtC,MAAI,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,OAAO,CAChE,QAAO;AAET,SAAO,EAAE;SACH;AACN,SAAO,EAAE;;;;;;;;;;;;;AAcb,SAAgB,0BACd,QACA,OAC2B;AAC3B,SAAQ,UAAkB,KAAK,IAAI,SAAS,MAAM,QAAQ,IAAI,MAAM;;;;;;;;AAStE,SAAgB,OACd,OACA,UACW;AACX,QAAO,MAAM,QAAmB,KAAK,MAAM,OAAO,UAAU;AAC1D,MAAI;AACF,OAAI,KAAK,SAAS,MAAM,OAAO,MAAM,CAAC;WAC/B,OAAO;AACd,WAAQ,MAAM,MAAM;;AAEtB,SAAO;IACN,EAAE,CAAC;;;;;;AAOR,SAAgB,UAAmB;AACjC,QAAO,sBAAsB,KAAK,UAAU,UAAU;;;;;;;AAQxD,SAAgB,kBAAkB,KAAsC;AACtE,KAAI;EACF,MAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,MAAI,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,OAAO,CAChE,QAAO;AAET,UAAQ,KACN,qDAAqD,OAAO,OAAO,iCACpE;AACD,SAAO,EAAE;SACH;AACN,UAAQ,KACN,4EACD;AACD,SAAO,EAAE"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/utils/inspector-metadata.ts
|
|
3
|
+
function isRecord(value) {
|
|
4
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) return false;
|
|
5
|
+
try {
|
|
6
|
+
const prototype = Object.getPrototypeOf(value);
|
|
7
|
+
return prototype === Object.prototype || prototype === null;
|
|
8
|
+
} catch {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function readOwnDataProperty(value, key) {
|
|
13
|
+
try {
|
|
14
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
15
|
+
return descriptor !== void 0 && "value" in descriptor ? descriptor.value : void 0;
|
|
16
|
+
} catch {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function parseNonBlankString(value) {
|
|
21
|
+
if (typeof value !== "string") return;
|
|
22
|
+
const parsed = value.trim();
|
|
23
|
+
return parsed.length > 0 ? parsed : void 0;
|
|
24
|
+
}
|
|
25
|
+
function parseIdentity(value) {
|
|
26
|
+
if (!isRecord(value)) return;
|
|
27
|
+
const organizationName = parseNonBlankString(value.organizationName);
|
|
28
|
+
const projectName = parseNonBlankString(value.projectName);
|
|
29
|
+
if (organizationName === void 0 || projectName === void 0) return;
|
|
30
|
+
return {
|
|
31
|
+
organizationName,
|
|
32
|
+
projectName
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function parsePlan(value) {
|
|
36
|
+
if (!isRecord(value)) return;
|
|
37
|
+
const code = parseNonBlankString(value.code);
|
|
38
|
+
const label = parseNonBlankString(value.label);
|
|
39
|
+
if (code === void 0 || label === void 0) return;
|
|
40
|
+
return {
|
|
41
|
+
code,
|
|
42
|
+
label
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function parseLicense(value) {
|
|
46
|
+
if (!isRecord(value)) return;
|
|
47
|
+
switch (value.state) {
|
|
48
|
+
case "valid":
|
|
49
|
+
case "none":
|
|
50
|
+
case "expired":
|
|
51
|
+
case "unknown": return { state: value.state };
|
|
52
|
+
default: return;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function parseActionKind(value) {
|
|
56
|
+
switch (value) {
|
|
57
|
+
case "manage_plan":
|
|
58
|
+
case "renew":
|
|
59
|
+
case "enable_intelligence": return value;
|
|
60
|
+
default: return;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function parseSafeActionUrl(value) {
|
|
64
|
+
const url = parseNonBlankString(value);
|
|
65
|
+
if (url === void 0 || url.includes("?") || url.includes("#")) return;
|
|
66
|
+
const authorityStart = url.indexOf("://");
|
|
67
|
+
if (authorityStart < 1) return;
|
|
68
|
+
const authorityAndPath = url.slice(authorityStart + 3);
|
|
69
|
+
const pathStart = authorityAndPath.indexOf("/");
|
|
70
|
+
if ((pathStart === -1 ? authorityAndPath : authorityAndPath.slice(0, pathStart)).includes("@")) return;
|
|
71
|
+
let parsed;
|
|
72
|
+
try {
|
|
73
|
+
parsed = new URL(url);
|
|
74
|
+
} catch {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (parsed.hostname.length === 0 || parsed.username || parsed.password) return;
|
|
78
|
+
if (parsed.protocol === "https:") return url;
|
|
79
|
+
const isLoopbackHost = parsed.hostname === "localhost" || parsed.hostname === "127.0.0.1" || parsed.hostname === "[::1]";
|
|
80
|
+
if (parsed.protocol === "http:" && isLoopbackHost) return url;
|
|
81
|
+
}
|
|
82
|
+
function parseAction(value) {
|
|
83
|
+
if (!isRecord(value)) return;
|
|
84
|
+
const kind = parseActionKind(value.kind);
|
|
85
|
+
const url = parseSafeActionUrl(value.url);
|
|
86
|
+
if (kind === void 0 || url === void 0) return;
|
|
87
|
+
return {
|
|
88
|
+
kind,
|
|
89
|
+
url
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
function isFiniteNonnegativeInteger(value) {
|
|
93
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
|
|
94
|
+
}
|
|
95
|
+
function parseUsageLimit(value) {
|
|
96
|
+
if (!isRecord(value)) return;
|
|
97
|
+
if (value.kind === "finite") {
|
|
98
|
+
if (typeof value.value !== "number" || !Number.isSafeInteger(value.value) || value.value < 1) return;
|
|
99
|
+
return {
|
|
100
|
+
kind: "finite",
|
|
101
|
+
value: value.value
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
if (value.kind === "unlimited") return { kind: "unlimited" };
|
|
105
|
+
if (value.kind === "unknown") return { kind: "unknown" };
|
|
106
|
+
}
|
|
107
|
+
function parseUsage(value) {
|
|
108
|
+
if (!isRecord(value)) return;
|
|
109
|
+
const limit = parseUsageLimit(value.limit);
|
|
110
|
+
const used = value.used;
|
|
111
|
+
if (!isFiniteNonnegativeInteger(used) || limit === void 0) return;
|
|
112
|
+
const rawExpiringSoonCount = readOwnDataProperty(value, "expiringSoonCount");
|
|
113
|
+
const expiringSoonCount = isFiniteNonnegativeInteger(rawExpiringSoonCount) ? rawExpiringSoonCount : void 0;
|
|
114
|
+
return {
|
|
115
|
+
used,
|
|
116
|
+
limit,
|
|
117
|
+
...expiringSoonCount === void 0 ? {} : { expiringSoonCount }
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Parses untrusted inspector metadata without letting one invalid optional
|
|
122
|
+
* module hide the other valid modules.
|
|
123
|
+
*
|
|
124
|
+
* @param value - The decoded runtime response body.
|
|
125
|
+
* @returns Normalized version 1 metadata, or `undefined` for an unsupported
|
|
126
|
+
* top-level payload.
|
|
127
|
+
*/
|
|
128
|
+
function parseInspectorMetadataV1(value) {
|
|
129
|
+
if (!isRecord(value) || value.schemaVersion !== 1) return;
|
|
130
|
+
const identity = parseIdentity(value.identity);
|
|
131
|
+
const plan = parsePlan(value.plan);
|
|
132
|
+
const license = parseLicense(value.license);
|
|
133
|
+
const action = parseAction(value.action);
|
|
134
|
+
const usage = parseUsage(value.usage);
|
|
135
|
+
return {
|
|
136
|
+
schemaVersion: 1,
|
|
137
|
+
...identity === void 0 ? {} : { identity },
|
|
138
|
+
...plan === void 0 ? {} : { plan },
|
|
139
|
+
...license === void 0 ? {} : { license },
|
|
140
|
+
...action === void 0 ? {} : { action },
|
|
141
|
+
...usage === void 0 ? {} : { usage }
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
//#endregion
|
|
146
|
+
exports.parseInspectorMetadataV1 = parseInspectorMetadataV1;
|
|
147
|
+
//# sourceMappingURL=inspector-metadata.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspector-metadata.cjs","names":[],"sources":["../../src/utils/inspector-metadata.ts"],"sourcesContent":["/**\n * Inspector metadata supplied by a trusted CopilotKit runtime.\n *\n * Each optional module is independent so clients can render partial metadata\n * from runtimes that do not expose every module.\n */\nexport interface InspectorMetadataV1 {\n readonly schemaVersion: 1;\n readonly identity?: {\n readonly organizationName: string;\n readonly projectName: string;\n };\n readonly plan?: {\n readonly code: string;\n readonly label: string;\n };\n readonly license?: {\n readonly state: \"valid\" | \"none\" | \"expired\" | \"unknown\";\n };\n readonly action?:\n | { readonly kind: \"manage_plan\"; readonly url: string }\n | { readonly kind: \"renew\"; readonly url: string }\n | { readonly kind: \"enable_intelligence\"; readonly url: string };\n readonly usage?: {\n readonly used: number;\n readonly limit:\n | { readonly kind: \"finite\"; readonly value: number }\n | { readonly kind: \"unlimited\" }\n | { readonly kind: \"unknown\" };\n readonly expiringSoonCount?: number;\n };\n}\n\ntype UnknownRecord = Record<string, unknown>;\ntype InspectorIdentity = NonNullable<InspectorMetadataV1[\"identity\"]>;\ntype InspectorPlan = NonNullable<InspectorMetadataV1[\"plan\"]>;\ntype InspectorLicense = NonNullable<InspectorMetadataV1[\"license\"]>;\ntype InspectorAction = NonNullable<InspectorMetadataV1[\"action\"]>;\ntype InspectorUsage = NonNullable<InspectorMetadataV1[\"usage\"]>;\ntype InspectorUsageLimit = InspectorUsage[\"limit\"];\n\nfunction isRecord(value: unknown): value is UnknownRecord {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n\n try {\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n } catch {\n return false;\n }\n}\n\nfunction readOwnDataProperty(value: UnknownRecord, key: string): unknown {\n try {\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n return descriptor !== undefined && \"value\" in descriptor\n ? descriptor.value\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction parseNonBlankString(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const parsed = value.trim();\n return parsed.length > 0 ? parsed : undefined;\n}\n\nfunction parseIdentity(value: unknown): InspectorIdentity | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n\n const organizationName = parseNonBlankString(value.organizationName);\n const projectName = parseNonBlankString(value.projectName);\n if (organizationName === undefined || projectName === undefined) {\n return undefined;\n }\n\n return { organizationName, projectName };\n}\n\nfunction parsePlan(value: unknown): InspectorPlan | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n\n const code = parseNonBlankString(value.code);\n const label = parseNonBlankString(value.label);\n if (code === undefined || label === undefined) {\n return undefined;\n }\n\n return { code, label };\n}\n\nfunction parseLicense(value: unknown): InspectorLicense | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n\n switch (value.state) {\n case \"valid\":\n case \"none\":\n case \"expired\":\n case \"unknown\":\n return { state: value.state };\n default:\n return undefined;\n }\n}\n\nfunction parseActionKind(value: unknown): InspectorAction[\"kind\"] | undefined {\n switch (value) {\n case \"manage_plan\":\n case \"renew\":\n case \"enable_intelligence\":\n return value;\n default:\n return undefined;\n }\n}\n\nfunction parseSafeActionUrl(value: unknown): string | undefined {\n const url = parseNonBlankString(value);\n if (url === undefined || url.includes(\"?\") || url.includes(\"#\")) {\n return undefined;\n }\n\n const authorityStart = url.indexOf(\"://\");\n if (authorityStart < 1) {\n return undefined;\n }\n\n const authorityAndPath = url.slice(authorityStart + 3);\n const pathStart = authorityAndPath.indexOf(\"/\");\n const authority =\n pathStart === -1 ? authorityAndPath : authorityAndPath.slice(0, pathStart);\n if (authority.includes(\"@\")) {\n return undefined;\n }\n\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return undefined;\n }\n\n if (parsed.hostname.length === 0 || parsed.username || parsed.password) {\n return undefined;\n }\n\n if (parsed.protocol === \"https:\") {\n return url;\n }\n\n const isLoopbackHost =\n parsed.hostname === \"localhost\" ||\n parsed.hostname === \"127.0.0.1\" ||\n parsed.hostname === \"[::1]\";\n if (parsed.protocol === \"http:\" && isLoopbackHost) {\n return url;\n }\n\n return undefined;\n}\n\nfunction parseAction(value: unknown): InspectorAction | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n\n const kind = parseActionKind(value.kind);\n const url = parseSafeActionUrl(value.url);\n if (kind === undefined || url === undefined) {\n return undefined;\n }\n\n return { kind, url };\n}\n\nfunction isFiniteNonnegativeInteger(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0;\n}\n\nfunction parseUsageLimit(value: unknown): InspectorUsageLimit | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n\n if (value.kind === \"finite\") {\n if (\n typeof value.value !== \"number\" ||\n !Number.isSafeInteger(value.value) ||\n value.value < 1\n ) {\n return undefined;\n }\n\n return { kind: \"finite\", value: value.value };\n }\n\n if (value.kind === \"unlimited\") {\n return { kind: \"unlimited\" };\n }\n\n if (value.kind === \"unknown\") {\n return { kind: \"unknown\" };\n }\n\n return undefined;\n}\n\nfunction parseUsage(value: unknown): InspectorUsage | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n\n const limit = parseUsageLimit(value.limit);\n const used = value.used;\n if (!isFiniteNonnegativeInteger(used) || limit === undefined) {\n return undefined;\n }\n\n const rawExpiringSoonCount = readOwnDataProperty(value, \"expiringSoonCount\");\n const expiringSoonCount = isFiniteNonnegativeInteger(rawExpiringSoonCount)\n ? rawExpiringSoonCount\n : undefined;\n\n return {\n used,\n limit,\n ...(expiringSoonCount === undefined ? {} : { expiringSoonCount }),\n };\n}\n\n/**\n * Parses untrusted inspector metadata without letting one invalid optional\n * module hide the other valid modules.\n *\n * @param value - The decoded runtime response body.\n * @returns Normalized version 1 metadata, or `undefined` for an unsupported\n * top-level payload.\n */\nexport function parseInspectorMetadataV1(\n value: unknown,\n): InspectorMetadataV1 | undefined {\n if (!isRecord(value) || value.schemaVersion !== 1) {\n return undefined;\n }\n\n const identity = parseIdentity(value.identity);\n const plan = parsePlan(value.plan);\n const license = parseLicense(value.license);\n const action = parseAction(value.action);\n const usage = parseUsage(value.usage);\n\n return {\n schemaVersion: 1,\n ...(identity === undefined ? {} : { identity }),\n ...(plan === undefined ? {} : { plan }),\n ...(license === undefined ? {} : { license }),\n ...(action === undefined ? {} : { action }),\n ...(usage === undefined ? {} : { usage }),\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
//#region src/utils/inspector-metadata.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Inspector metadata supplied by a trusted CopilotKit runtime.
|
|
4
|
+
*
|
|
5
|
+
* Each optional module is independent so clients can render partial metadata
|
|
6
|
+
* from runtimes that do not expose every module.
|
|
7
|
+
*/
|
|
8
|
+
interface InspectorMetadataV1 {
|
|
9
|
+
readonly schemaVersion: 1;
|
|
10
|
+
readonly identity?: {
|
|
11
|
+
readonly organizationName: string;
|
|
12
|
+
readonly projectName: string;
|
|
13
|
+
};
|
|
14
|
+
readonly plan?: {
|
|
15
|
+
readonly code: string;
|
|
16
|
+
readonly label: string;
|
|
17
|
+
};
|
|
18
|
+
readonly license?: {
|
|
19
|
+
readonly state: "valid" | "none" | "expired" | "unknown";
|
|
20
|
+
};
|
|
21
|
+
readonly action?: {
|
|
22
|
+
readonly kind: "manage_plan";
|
|
23
|
+
readonly url: string;
|
|
24
|
+
} | {
|
|
25
|
+
readonly kind: "renew";
|
|
26
|
+
readonly url: string;
|
|
27
|
+
} | {
|
|
28
|
+
readonly kind: "enable_intelligence";
|
|
29
|
+
readonly url: string;
|
|
30
|
+
};
|
|
31
|
+
readonly usage?: {
|
|
32
|
+
readonly used: number;
|
|
33
|
+
readonly limit: {
|
|
34
|
+
readonly kind: "finite";
|
|
35
|
+
readonly value: number;
|
|
36
|
+
} | {
|
|
37
|
+
readonly kind: "unlimited";
|
|
38
|
+
} | {
|
|
39
|
+
readonly kind: "unknown";
|
|
40
|
+
};
|
|
41
|
+
readonly expiringSoonCount?: number;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Parses untrusted inspector metadata without letting one invalid optional
|
|
46
|
+
* module hide the other valid modules.
|
|
47
|
+
*
|
|
48
|
+
* @param value - The decoded runtime response body.
|
|
49
|
+
* @returns Normalized version 1 metadata, or `undefined` for an unsupported
|
|
50
|
+
* top-level payload.
|
|
51
|
+
*/
|
|
52
|
+
declare function parseInspectorMetadataV1(value: unknown): InspectorMetadataV1 | undefined;
|
|
53
|
+
//#endregion
|
|
54
|
+
export { InspectorMetadataV1, parseInspectorMetadataV1 };
|
|
55
|
+
//# sourceMappingURL=inspector-metadata.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspector-metadata.d.cts","names":[],"sources":["../../src/utils/inspector-metadata.ts"],"mappings":";;AAMA;;;;;UAAiB,mBAAA;EAAA,SACN,aAAA;EAAA,SACA,QAAA;IAAA,SACE,gBAAA;IAAA,SACA,WAAA;EAAA;EAAA,SAEF,IAAA;IAAA,SACE,IAAA;IAAA,SACA,KAAA;EAAA;EAAA,SAEF,OAAA;IAAA,SACE,KAAA;EAAA;EAAA,SAEF,MAAA;IAAA,SACM,IAAA;IAAA,SAA8B,GAAA;EAAA;IAAA,SAC9B,IAAA;IAAA,SAAwB,GAAA;EAAA;IAAA,SACxB,IAAA;IAAA,SAAsC,GAAA;EAAA;EAAA,SAC5C,KAAA;IAAA,SACE,IAAA;IAAA,SACA,KAAA;MAAA,SACM,IAAA;MAAA,SAAyB,KAAA;IAAA;MAAA,SACzB,IAAA;IAAA;MAAA,SACA,IAAA;IAAA;IAAA,SACN,iBAAA;EAAA;AAAA;;;;;;;;;iBA8NG,wBAAA,CACd,KAAA,YACC,mBAAA"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
//#region src/utils/inspector-metadata.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Inspector metadata supplied by a trusted CopilotKit runtime.
|
|
4
|
+
*
|
|
5
|
+
* Each optional module is independent so clients can render partial metadata
|
|
6
|
+
* from runtimes that do not expose every module.
|
|
7
|
+
*/
|
|
8
|
+
interface InspectorMetadataV1 {
|
|
9
|
+
readonly schemaVersion: 1;
|
|
10
|
+
readonly identity?: {
|
|
11
|
+
readonly organizationName: string;
|
|
12
|
+
readonly projectName: string;
|
|
13
|
+
};
|
|
14
|
+
readonly plan?: {
|
|
15
|
+
readonly code: string;
|
|
16
|
+
readonly label: string;
|
|
17
|
+
};
|
|
18
|
+
readonly license?: {
|
|
19
|
+
readonly state: "valid" | "none" | "expired" | "unknown";
|
|
20
|
+
};
|
|
21
|
+
readonly action?: {
|
|
22
|
+
readonly kind: "manage_plan";
|
|
23
|
+
readonly url: string;
|
|
24
|
+
} | {
|
|
25
|
+
readonly kind: "renew";
|
|
26
|
+
readonly url: string;
|
|
27
|
+
} | {
|
|
28
|
+
readonly kind: "enable_intelligence";
|
|
29
|
+
readonly url: string;
|
|
30
|
+
};
|
|
31
|
+
readonly usage?: {
|
|
32
|
+
readonly used: number;
|
|
33
|
+
readonly limit: {
|
|
34
|
+
readonly kind: "finite";
|
|
35
|
+
readonly value: number;
|
|
36
|
+
} | {
|
|
37
|
+
readonly kind: "unlimited";
|
|
38
|
+
} | {
|
|
39
|
+
readonly kind: "unknown";
|
|
40
|
+
};
|
|
41
|
+
readonly expiringSoonCount?: number;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Parses untrusted inspector metadata without letting one invalid optional
|
|
46
|
+
* module hide the other valid modules.
|
|
47
|
+
*
|
|
48
|
+
* @param value - The decoded runtime response body.
|
|
49
|
+
* @returns Normalized version 1 metadata, or `undefined` for an unsupported
|
|
50
|
+
* top-level payload.
|
|
51
|
+
*/
|
|
52
|
+
declare function parseInspectorMetadataV1(value: unknown): InspectorMetadataV1 | undefined;
|
|
53
|
+
//#endregion
|
|
54
|
+
export { InspectorMetadataV1, parseInspectorMetadataV1 };
|
|
55
|
+
//# sourceMappingURL=inspector-metadata.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspector-metadata.d.mts","names":[],"sources":["../../src/utils/inspector-metadata.ts"],"mappings":";;AAMA;;;;;UAAiB,mBAAA;EAAA,SACN,aAAA;EAAA,SACA,QAAA;IAAA,SACE,gBAAA;IAAA,SACA,WAAA;EAAA;EAAA,SAEF,IAAA;IAAA,SACE,IAAA;IAAA,SACA,KAAA;EAAA;EAAA,SAEF,OAAA;IAAA,SACE,KAAA;EAAA;EAAA,SAEF,MAAA;IAAA,SACM,IAAA;IAAA,SAA8B,GAAA;EAAA;IAAA,SAC9B,IAAA;IAAA,SAAwB,GAAA;EAAA;IAAA,SACxB,IAAA;IAAA,SAAsC,GAAA;EAAA;EAAA,SAC5C,KAAA;IAAA,SACE,IAAA;IAAA,SACA,KAAA;MAAA,SACM,IAAA;MAAA,SAAyB,KAAA;IAAA;MAAA,SACzB,IAAA;IAAA;MAAA,SACA,IAAA;IAAA;IAAA,SACN,iBAAA;EAAA;AAAA;;;;;;;;;iBA8NG,wBAAA,CACd,KAAA,YACC,mBAAA"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
//#region src/utils/inspector-metadata.ts
|
|
2
|
+
function isRecord(value) {
|
|
3
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) return false;
|
|
4
|
+
try {
|
|
5
|
+
const prototype = Object.getPrototypeOf(value);
|
|
6
|
+
return prototype === Object.prototype || prototype === null;
|
|
7
|
+
} catch {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
function readOwnDataProperty(value, key) {
|
|
12
|
+
try {
|
|
13
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
14
|
+
return descriptor !== void 0 && "value" in descriptor ? descriptor.value : void 0;
|
|
15
|
+
} catch {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function parseNonBlankString(value) {
|
|
20
|
+
if (typeof value !== "string") return;
|
|
21
|
+
const parsed = value.trim();
|
|
22
|
+
return parsed.length > 0 ? parsed : void 0;
|
|
23
|
+
}
|
|
24
|
+
function parseIdentity(value) {
|
|
25
|
+
if (!isRecord(value)) return;
|
|
26
|
+
const organizationName = parseNonBlankString(value.organizationName);
|
|
27
|
+
const projectName = parseNonBlankString(value.projectName);
|
|
28
|
+
if (organizationName === void 0 || projectName === void 0) return;
|
|
29
|
+
return {
|
|
30
|
+
organizationName,
|
|
31
|
+
projectName
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function parsePlan(value) {
|
|
35
|
+
if (!isRecord(value)) return;
|
|
36
|
+
const code = parseNonBlankString(value.code);
|
|
37
|
+
const label = parseNonBlankString(value.label);
|
|
38
|
+
if (code === void 0 || label === void 0) return;
|
|
39
|
+
return {
|
|
40
|
+
code,
|
|
41
|
+
label
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function parseLicense(value) {
|
|
45
|
+
if (!isRecord(value)) return;
|
|
46
|
+
switch (value.state) {
|
|
47
|
+
case "valid":
|
|
48
|
+
case "none":
|
|
49
|
+
case "expired":
|
|
50
|
+
case "unknown": return { state: value.state };
|
|
51
|
+
default: return;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function parseActionKind(value) {
|
|
55
|
+
switch (value) {
|
|
56
|
+
case "manage_plan":
|
|
57
|
+
case "renew":
|
|
58
|
+
case "enable_intelligence": return value;
|
|
59
|
+
default: return;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function parseSafeActionUrl(value) {
|
|
63
|
+
const url = parseNonBlankString(value);
|
|
64
|
+
if (url === void 0 || url.includes("?") || url.includes("#")) return;
|
|
65
|
+
const authorityStart = url.indexOf("://");
|
|
66
|
+
if (authorityStart < 1) return;
|
|
67
|
+
const authorityAndPath = url.slice(authorityStart + 3);
|
|
68
|
+
const pathStart = authorityAndPath.indexOf("/");
|
|
69
|
+
if ((pathStart === -1 ? authorityAndPath : authorityAndPath.slice(0, pathStart)).includes("@")) return;
|
|
70
|
+
let parsed;
|
|
71
|
+
try {
|
|
72
|
+
parsed = new URL(url);
|
|
73
|
+
} catch {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (parsed.hostname.length === 0 || parsed.username || parsed.password) return;
|
|
77
|
+
if (parsed.protocol === "https:") return url;
|
|
78
|
+
const isLoopbackHost = parsed.hostname === "localhost" || parsed.hostname === "127.0.0.1" || parsed.hostname === "[::1]";
|
|
79
|
+
if (parsed.protocol === "http:" && isLoopbackHost) return url;
|
|
80
|
+
}
|
|
81
|
+
function parseAction(value) {
|
|
82
|
+
if (!isRecord(value)) return;
|
|
83
|
+
const kind = parseActionKind(value.kind);
|
|
84
|
+
const url = parseSafeActionUrl(value.url);
|
|
85
|
+
if (kind === void 0 || url === void 0) return;
|
|
86
|
+
return {
|
|
87
|
+
kind,
|
|
88
|
+
url
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function isFiniteNonnegativeInteger(value) {
|
|
92
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
|
|
93
|
+
}
|
|
94
|
+
function parseUsageLimit(value) {
|
|
95
|
+
if (!isRecord(value)) return;
|
|
96
|
+
if (value.kind === "finite") {
|
|
97
|
+
if (typeof value.value !== "number" || !Number.isSafeInteger(value.value) || value.value < 1) return;
|
|
98
|
+
return {
|
|
99
|
+
kind: "finite",
|
|
100
|
+
value: value.value
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
if (value.kind === "unlimited") return { kind: "unlimited" };
|
|
104
|
+
if (value.kind === "unknown") return { kind: "unknown" };
|
|
105
|
+
}
|
|
106
|
+
function parseUsage(value) {
|
|
107
|
+
if (!isRecord(value)) return;
|
|
108
|
+
const limit = parseUsageLimit(value.limit);
|
|
109
|
+
const used = value.used;
|
|
110
|
+
if (!isFiniteNonnegativeInteger(used) || limit === void 0) return;
|
|
111
|
+
const rawExpiringSoonCount = readOwnDataProperty(value, "expiringSoonCount");
|
|
112
|
+
const expiringSoonCount = isFiniteNonnegativeInteger(rawExpiringSoonCount) ? rawExpiringSoonCount : void 0;
|
|
113
|
+
return {
|
|
114
|
+
used,
|
|
115
|
+
limit,
|
|
116
|
+
...expiringSoonCount === void 0 ? {} : { expiringSoonCount }
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Parses untrusted inspector metadata without letting one invalid optional
|
|
121
|
+
* module hide the other valid modules.
|
|
122
|
+
*
|
|
123
|
+
* @param value - The decoded runtime response body.
|
|
124
|
+
* @returns Normalized version 1 metadata, or `undefined` for an unsupported
|
|
125
|
+
* top-level payload.
|
|
126
|
+
*/
|
|
127
|
+
function parseInspectorMetadataV1(value) {
|
|
128
|
+
if (!isRecord(value) || value.schemaVersion !== 1) return;
|
|
129
|
+
const identity = parseIdentity(value.identity);
|
|
130
|
+
const plan = parsePlan(value.plan);
|
|
131
|
+
const license = parseLicense(value.license);
|
|
132
|
+
const action = parseAction(value.action);
|
|
133
|
+
const usage = parseUsage(value.usage);
|
|
134
|
+
return {
|
|
135
|
+
schemaVersion: 1,
|
|
136
|
+
...identity === void 0 ? {} : { identity },
|
|
137
|
+
...plan === void 0 ? {} : { plan },
|
|
138
|
+
...license === void 0 ? {} : { license },
|
|
139
|
+
...action === void 0 ? {} : { action },
|
|
140
|
+
...usage === void 0 ? {} : { usage }
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
//#endregion
|
|
145
|
+
export { parseInspectorMetadataV1 };
|
|
146
|
+
//# sourceMappingURL=inspector-metadata.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspector-metadata.mjs","names":[],"sources":["../../src/utils/inspector-metadata.ts"],"sourcesContent":["/**\n * Inspector metadata supplied by a trusted CopilotKit runtime.\n *\n * Each optional module is independent so clients can render partial metadata\n * from runtimes that do not expose every module.\n */\nexport interface InspectorMetadataV1 {\n readonly schemaVersion: 1;\n readonly identity?: {\n readonly organizationName: string;\n readonly projectName: string;\n };\n readonly plan?: {\n readonly code: string;\n readonly label: string;\n };\n readonly license?: {\n readonly state: \"valid\" | \"none\" | \"expired\" | \"unknown\";\n };\n readonly action?:\n | { readonly kind: \"manage_plan\"; readonly url: string }\n | { readonly kind: \"renew\"; readonly url: string }\n | { readonly kind: \"enable_intelligence\"; readonly url: string };\n readonly usage?: {\n readonly used: number;\n readonly limit:\n | { readonly kind: \"finite\"; readonly value: number }\n | { readonly kind: \"unlimited\" }\n | { readonly kind: \"unknown\" };\n readonly expiringSoonCount?: number;\n };\n}\n\ntype UnknownRecord = Record<string, unknown>;\ntype InspectorIdentity = NonNullable<InspectorMetadataV1[\"identity\"]>;\ntype InspectorPlan = NonNullable<InspectorMetadataV1[\"plan\"]>;\ntype InspectorLicense = NonNullable<InspectorMetadataV1[\"license\"]>;\ntype InspectorAction = NonNullable<InspectorMetadataV1[\"action\"]>;\ntype InspectorUsage = NonNullable<InspectorMetadataV1[\"usage\"]>;\ntype InspectorUsageLimit = InspectorUsage[\"limit\"];\n\nfunction isRecord(value: unknown): value is UnknownRecord {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n\n try {\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n } catch {\n return false;\n }\n}\n\nfunction readOwnDataProperty(value: UnknownRecord, key: string): unknown {\n try {\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n return descriptor !== undefined && \"value\" in descriptor\n ? descriptor.value\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction parseNonBlankString(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const parsed = value.trim();\n return parsed.length > 0 ? parsed : undefined;\n}\n\nfunction parseIdentity(value: unknown): InspectorIdentity | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n\n const organizationName = parseNonBlankString(value.organizationName);\n const projectName = parseNonBlankString(value.projectName);\n if (organizationName === undefined || projectName === undefined) {\n return undefined;\n }\n\n return { organizationName, projectName };\n}\n\nfunction parsePlan(value: unknown): InspectorPlan | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n\n const code = parseNonBlankString(value.code);\n const label = parseNonBlankString(value.label);\n if (code === undefined || label === undefined) {\n return undefined;\n }\n\n return { code, label };\n}\n\nfunction parseLicense(value: unknown): InspectorLicense | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n\n switch (value.state) {\n case \"valid\":\n case \"none\":\n case \"expired\":\n case \"unknown\":\n return { state: value.state };\n default:\n return undefined;\n }\n}\n\nfunction parseActionKind(value: unknown): InspectorAction[\"kind\"] | undefined {\n switch (value) {\n case \"manage_plan\":\n case \"renew\":\n case \"enable_intelligence\":\n return value;\n default:\n return undefined;\n }\n}\n\nfunction parseSafeActionUrl(value: unknown): string | undefined {\n const url = parseNonBlankString(value);\n if (url === undefined || url.includes(\"?\") || url.includes(\"#\")) {\n return undefined;\n }\n\n const authorityStart = url.indexOf(\"://\");\n if (authorityStart < 1) {\n return undefined;\n }\n\n const authorityAndPath = url.slice(authorityStart + 3);\n const pathStart = authorityAndPath.indexOf(\"/\");\n const authority =\n pathStart === -1 ? authorityAndPath : authorityAndPath.slice(0, pathStart);\n if (authority.includes(\"@\")) {\n return undefined;\n }\n\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return undefined;\n }\n\n if (parsed.hostname.length === 0 || parsed.username || parsed.password) {\n return undefined;\n }\n\n if (parsed.protocol === \"https:\") {\n return url;\n }\n\n const isLoopbackHost =\n parsed.hostname === \"localhost\" ||\n parsed.hostname === \"127.0.0.1\" ||\n parsed.hostname === \"[::1]\";\n if (parsed.protocol === \"http:\" && isLoopbackHost) {\n return url;\n }\n\n return undefined;\n}\n\nfunction parseAction(value: unknown): InspectorAction | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n\n const kind = parseActionKind(value.kind);\n const url = parseSafeActionUrl(value.url);\n if (kind === undefined || url === undefined) {\n return undefined;\n }\n\n return { kind, url };\n}\n\nfunction isFiniteNonnegativeInteger(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0;\n}\n\nfunction parseUsageLimit(value: unknown): InspectorUsageLimit | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n\n if (value.kind === \"finite\") {\n if (\n typeof value.value !== \"number\" ||\n !Number.isSafeInteger(value.value) ||\n value.value < 1\n ) {\n return undefined;\n }\n\n return { kind: \"finite\", value: value.value };\n }\n\n if (value.kind === \"unlimited\") {\n return { kind: \"unlimited\" };\n }\n\n if (value.kind === \"unknown\") {\n return { kind: \"unknown\" };\n }\n\n return undefined;\n}\n\nfunction parseUsage(value: unknown): InspectorUsage | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n\n const limit = parseUsageLimit(value.limit);\n const used = value.used;\n if (!isFiniteNonnegativeInteger(used) || limit === undefined) {\n return undefined;\n }\n\n const rawExpiringSoonCount = readOwnDataProperty(value, \"expiringSoonCount\");\n const expiringSoonCount = isFiniteNonnegativeInteger(rawExpiringSoonCount)\n ? rawExpiringSoonCount\n : undefined;\n\n return {\n used,\n limit,\n ...(expiringSoonCount === undefined ? {} : { expiringSoonCount }),\n };\n}\n\n/**\n * Parses untrusted inspector metadata without letting one invalid optional\n * module hide the other valid modules.\n *\n * @param value - The decoded runtime response body.\n * @returns Normalized version 1 metadata, or `undefined` for an unsupported\n * top-level payload.\n */\nexport function parseInspectorMetadataV1(\n value: unknown,\n): InspectorMetadataV1 | undefined {\n if (!isRecord(value) || value.schemaVersion !== 1) {\n return undefined;\n }\n\n const identity = parseIdentity(value.identity);\n const plan = parsePlan(value.plan);\n const license = parseLicense(value.license);\n const action = parseAction(value.action);\n const usage = parseUsage(value.usage);\n\n return {\n schemaVersion: 1,\n ...(identity === undefined ? {} : { identity }),\n ...(plan === undefined ? {} : { plan }),\n ...(license === undefined ? {} : { license }),\n ...(action === undefined ? {} : { action }),\n ...(usage === undefined ? {} : { usage }),\n };\n}\n"],"mappings":"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"}
|
package/dist/utils/types.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.cjs","names":[],"sources":["../../src/utils/types.ts"],"sourcesContent":["import type { AgentCapabilities } from \"@ag-ui/core\";\n\nexport type MaybePromise<T> = T | PromiseLike<T>;\n\n/**\n * More specific utility for records with at least one key\n */\nexport type NonEmptyRecord<T> =\n T extends Record<string, unknown>\n ? keyof T extends never\n ? never\n : T\n : never;\n\n/**\n * Type representing an agent's basic information\n */\nexport interface AgentDescription {\n name: string;\n className: string;\n description: string;\n capabilities?: AgentCapabilities;\n}\n\nexport type RuntimeMode = \"sse\" | \"intelligence\";\n\nexport const RUNTIME_MODE_SSE = \"sse\" as const;\nexport const RUNTIME_MODE_INTELLIGENCE = \"intelligence\" as const;\n\nexport interface IntelligenceRuntimeInfo {\n wsUrl: string;\n}\n\nexport interface ThreadEndpointRuntimeInfo {\n list: boolean;\n inspect: boolean;\n mutations: boolean;\n realtimeMetadata: boolean;\n}\n\nexport type RuntimeLicenseStatus =\n | \"valid\"\n | \"none\"\n | \"expired\"\n | \"expiring\"\n | \"invalid\"\n | \"unknown\";\n\nexport interface A2UIRuntimeInfo {\n enabled: boolean;\n /**\n * Agent ids the runtime applies A2UI to. When omitted, A2UI applies to\n * every agent served by the runtime.\n */\n agents?: string[];\n}\n\nexport interface RuntimeInfo {\n version: string;\n agents: Record<string, AgentDescription>;\n audioFileTranscriptionEnabled: boolean;\n mode: RuntimeMode;\n intelligence?: IntelligenceRuntimeInfo;\n threadEndpoints?: ThreadEndpointRuntimeInfo;\n /**\n * When true, the runtime exposes POST /agent/:agentId/suggest for stateless\n * suggestion generation. Absent on older runtimes; clients fall back to a\n * client-side agent run.\n */\n suggestions?: boolean;\n /**\n * @deprecated Use `a2ui` instead, which preserves per-agent scoping.\n * Kept for backward compatibility with older clients.\n */\n a2uiEnabled?: boolean;\n a2ui?: A2UIRuntimeInfo;\n openGenerativeUIEnabled?: boolean;\n licenseStatus?: RuntimeLicenseStatus;\n telemetryDisabled?: boolean;\n}\n"],"mappings":";;AA0BA,MAAa,mBAAmB;AAChC,MAAa,4BAA4B"}
|
|
1
|
+
{"version":3,"file":"types.cjs","names":[],"sources":["../../src/utils/types.ts"],"sourcesContent":["import type { AgentCapabilities } from \"@ag-ui/core\";\n\nexport type MaybePromise<T> = T | PromiseLike<T>;\n\n/**\n * More specific utility for records with at least one key\n */\nexport type NonEmptyRecord<T> =\n T extends Record<string, unknown>\n ? keyof T extends never\n ? never\n : T\n : never;\n\n/**\n * Type representing an agent's basic information\n */\nexport interface AgentDescription {\n name: string;\n className: string;\n description: string;\n capabilities?: AgentCapabilities;\n}\n\nexport type RuntimeMode = \"sse\" | \"intelligence\";\n\nexport const RUNTIME_MODE_SSE = \"sse\" as const;\nexport const RUNTIME_MODE_INTELLIGENCE = \"intelligence\" as const;\n\nexport interface IntelligenceRuntimeInfo {\n wsUrl: string;\n}\n\nexport interface ThreadEndpointRuntimeInfo {\n list: boolean;\n inspect: boolean;\n mutations: boolean;\n realtimeMetadata: boolean;\n}\n\nexport type RuntimeLicenseStatus =\n | \"valid\"\n | \"none\"\n | \"expired\"\n | \"expiring\"\n | \"invalid\"\n | \"unknown\";\n\nexport interface A2UIRuntimeInfo {\n enabled: boolean;\n /**\n * Agent ids the runtime applies A2UI to. When omitted, A2UI applies to\n * every agent served by the runtime.\n */\n agents?: string[];\n}\n\nexport interface RuntimeInfo {\n version: string;\n agents: Record<string, AgentDescription>;\n audioFileTranscriptionEnabled: boolean;\n mode: RuntimeMode;\n intelligence?: IntelligenceRuntimeInfo;\n threadEndpoints?: ThreadEndpointRuntimeInfo;\n /** Whether this runtime exposes trusted inspector metadata. */\n inspectorMetadata?: boolean;\n /**\n * When true, the runtime exposes POST /agent/:agentId/suggest for stateless\n * suggestion generation. Absent on older runtimes; clients fall back to a\n * client-side agent run.\n */\n suggestions?: boolean;\n /**\n * @deprecated Use `a2ui` instead, which preserves per-agent scoping.\n * Kept for backward compatibility with older clients.\n */\n a2uiEnabled?: boolean;\n a2ui?: A2UIRuntimeInfo;\n openGenerativeUIEnabled?: boolean;\n licenseStatus?: RuntimeLicenseStatus;\n telemetryDisabled?: boolean;\n}\n"],"mappings":";;AA0BA,MAAa,mBAAmB;AAChC,MAAa,4BAA4B"}
|
package/dist/utils/types.d.cts
CHANGED
|
@@ -43,6 +43,8 @@ interface RuntimeInfo {
|
|
|
43
43
|
mode: RuntimeMode;
|
|
44
44
|
intelligence?: IntelligenceRuntimeInfo;
|
|
45
45
|
threadEndpoints?: ThreadEndpointRuntimeInfo;
|
|
46
|
+
/** Whether this runtime exposes trusted inspector metadata. */
|
|
47
|
+
inspectorMetadata?: boolean;
|
|
46
48
|
/**
|
|
47
49
|
* When true, the runtime exposes POST /agent/:agentId/suggest for stateless
|
|
48
50
|
* suggestion generation. Absent on older runtimes; clients fall back to a
|