diff --git a/bun.lock b/bun.lock index 81e3b083ec..d3373daeae 100644 --- a/bun.lock +++ b/bun.lock @@ -156,6 +156,8 @@ "version": "0.0.2", "dependencies": { "arktype": "2.2.3", + "croner": "10.0.1", + "unicode-case-folding": "1.1.1", }, "devDependencies": { "@typescript/native": "npm:typescript@7.0.2", @@ -1130,6 +1132,8 @@ "cose-base": ["cose-base@1.0.3", "", { "dependencies": { "layout-base": "^1.0.0" } }, "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg=="], + "croner": ["croner@10.0.1", "", {}, "sha512-ixNtAJndqh173VQ4KodSdJEI6nuioBWI0V1ITNKhZZsO0pEMoDxz539T4FTTbSZ/xIOSuDnzxLVRqBVSvPNE2g=="], + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], "crossws": ["crossws@0.4.9", "", { "peerDependencies": { "srvx": ">=0.11.5" }, "optionalPeers": ["srvx"] }, "sha512-iWx+1OMSG2aOHpjyf9AESOzkwsVdS49cXM9dVrI2PDhxU5l2RIWE/KG56gk4BbAnsMoycvniJ9OnOxO9LRzHVA=="], @@ -1920,6 +1924,8 @@ "unenv": ["unenv@2.0.0-rc.24", "", { "dependencies": { "pathe": "^2.0.3" } }, "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw=="], + "unicode-case-folding": ["unicode-case-folding@1.1.1", "", {}, "sha512-ZAYziAnMTBisO2dT5tyGvBFMNsIfonOS/BZTd3UZaKWtXMOZqK8s8HRUCrlKxGCTeCxCuCjS/6HW+4a6G+rbzw=="], + "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="], "unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="], diff --git a/convex/schema.ts b/convex/schema.ts index 2247a5466f..6184579cbd 100644 --- a/convex/schema.ts +++ b/convex/schema.ts @@ -1,6 +1,7 @@ import { authTables } from "@convex-dev/auth/server"; +import { createClawManifestSummarySchema } from "clawhub-schema"; import { defineSchema, defineTable } from "convex/server"; -import { v } from "convex/values"; +import { type GenericValidator, v } from "convex/values"; import { EMBEDDING_DIMENSIONS } from "./lib/embeddings"; const PLATFORM_SKILL_LICENSE = "MIT-0" as const; @@ -541,6 +542,7 @@ const packageFamilyValidator = v.union( v.literal("skill"), v.literal("code-plugin"), v.literal("bundle-plugin"), + v.literal("claw"), ); const packageChannelValidator = v.union( @@ -669,6 +671,17 @@ const pluginManifestSummaryValidator = v.object({ ), }); +const clawManifestSummaryValidator = createClawManifestSummarySchema({ + literalOne: v.literal(1), + string: v.string(), + number: v.number(), + stringArray: v.array(v.string()), + // Convex validators cannot express string lengths; publication must validate with the shared schema. + boundedString: () => v.string(), + optional: (validator) => v.optional(validator), + object: (fields) => v.object(fields), +}); + const packageVerificationValidator = v.optional( v.object({ tier: packageVerificationTierValidator, @@ -1729,6 +1742,7 @@ const packageReleases = defineTable({ normalizedBundleManifest: v.optional(v.any()), manifestSearchTerms: v.optional(v.array(v.string())), pluginManifestSummary: v.optional(pluginManifestSummaryValidator), + clawManifestSummary: v.optional(clawManifestSummaryValidator), compatibility: packageCompatibilityValidator, runtimeId: v.optional(v.string()), sourceRepo: v.optional(v.string()), diff --git a/packages/schema/dist/claws.d.ts b/packages/schema/dist/claws.d.ts new file mode 100644 index 0000000000..3b6bf6041e --- /dev/null +++ b/packages/schema/dist/claws.d.ts @@ -0,0 +1,177 @@ +import { type BaseType, type inferred } from "arktype"; +export declare const CLAW_SCHEMA_VERSION: 1; +export declare const CLAW_SUMMARY_AGENT_NAME_MAX_CHARS = 128; +export declare const CLAW_SUMMARY_AGENT_DESCRIPTION_MAX_CHARS = 1024; +export declare const CLAW_BOOTSTRAP_FILE_NAMES: readonly ["AGENTS.md", "SOUL.md", "IDENTITY.md", "TOOLS.md", "HEARTBEAT.md"]; +export declare const ClawManifestSchema: import("arktype/internal/variants/object.ts").ObjectType<{ + schemaVersion: 1; + agent: { + id: string; + name?: string | undefined; + description?: string | undefined; + identity?: { + name?: string | undefined; + theme?: string | undefined; + emoji?: string | undefined; + avatar?: string | undefined; + } | undefined; + }; + metadata?: { + [x: string]: string; + } | undefined; + workspace?: { + bootstrapFiles?: { + "AGENTS.md"?: { + source: string; + } | undefined; + "SOUL.md"?: { + source: string; + } | undefined; + "IDENTITY.md"?: { + source: string; + } | undefined; + "TOOLS.md"?: { + source: string; + } | undefined; + "HEARTBEAT.md"?: { + source: string; + } | undefined; + } | undefined; + files?: { + source: string; + path: string; + }[] | undefined; + } | undefined; + packages?: { + kind: "plugin" | "skill"; + source: "clawhub"; + ref: string; + version: string; + }[] | undefined; + mcpServers?: { + [x: string]: { + command: string; + transport?: "stdio" | undefined; + args?: string[] | undefined; + env?: { + [x: string]: string; + } | undefined; + toolFilter?: { + include?: string[] | undefined; + exclude?: string[] | undefined; + } | undefined; + timeout?: number | undefined; + connectTimeout?: number | undefined; + } | { + url: string; + transport: "sse" | "streamable-http"; + auth?: "oauth" | undefined; + toolFilter?: { + include?: string[] | undefined; + exclude?: string[] | undefined; + } | undefined; + timeout?: number | undefined; + connectTimeout?: number | undefined; + }; + } | undefined; + cronJobs?: { + id: string; + name?: string | undefined; + schedule: { + cron: string; + timezone: string; + }; + session: "isolated" | "main"; + message: string; + delivery?: { + mode: "announce" | "none"; + channel?: "last" | undefined; + } | undefined; + }[] | undefined; +}, {}>; +export type ClawManifest = (typeof ClawManifestSchema)[inferred]; +export type ClawManifestSummary = { + schemaVersion: 1; + agent: { + id: string; + name?: string; + description?: string; + }; + workspace: { + bootstrapFiles: string[]; + fileCount: number; + }; + packages: { + skillCount: number; + pluginCount: number; + }; + mcpServerCount: number; + cronJobCount: number; +}; +export type ClawManifestSummarySchemaAdapter = { + literalOne: TValue; + string: TValue; + number: TValue; + stringArray: TValue; + boundedString: (maxCharacters: number) => TValue; + optional: (schema: TValue) => TOptional; + object: (fields: Record) => TValue; +}; +/** Builds the v1 summary structure for both the public schema and durable storage validators. */ +export declare function createClawManifestSummarySchema(adapter: ClawManifestSummarySchemaAdapter): TValue; +export declare const ClawManifestSummarySchema: BaseType; +export declare const CLAW_MANIFEST_VALIDATION_PHASE: "schema"; +export declare const CLAW_MANIFEST_VALIDATION_CODES: { + readonly invalidManifestShape: "claw_v1_invalid_manifest_shape"; + readonly invalidAgentId: "claw_v1_invalid_agent_id"; + readonly nonCanonicalString: "claw_v1_non_canonical_string"; + readonly emptyList: "claw_v1_empty_list"; + readonly invalidProfilePath: "claw_v1_invalid_profile_path"; + readonly unsafePath: "claw_v1_unsafe_path"; + readonly duplicateWorkspaceDestination: "claw_v1_duplicate_workspace_destination"; + readonly invalidAvatar: "claw_v1_invalid_avatar"; + readonly undeclaredAvatar: "claw_v1_undeclared_avatar"; + readonly invalidPackageReference: "claw_v1_invalid_package_reference"; + readonly invalidPackageVersion: "claw_v1_invalid_package_version"; + readonly duplicatePackage: "claw_v1_duplicate_package"; + readonly invalidMcpServerId: "claw_v1_invalid_mcp_server_id"; + readonly invalidMcpUrl: "claw_v1_invalid_mcp_url"; + readonly mcpUrlCredentials: "claw_v1_mcp_url_credentials"; + readonly unpinnedMcpPackage: "claw_v1_unpinned_mcp_package"; + readonly invalidToolFilter: "claw_v1_invalid_tool_filter"; + readonly duplicateToolFilter: "claw_v1_duplicate_tool_filter"; + readonly invalidEnvironmentKey: "claw_v1_invalid_environment_key"; + readonly blockedEnvironmentKey: "claw_v1_blocked_environment_key"; + readonly invalidEnvironmentReference: "claw_v1_invalid_environment_reference"; + readonly invalidTimeout: "claw_v1_invalid_timeout"; + readonly invalidCronJobId: "claw_v1_invalid_cron_job_id"; + readonly invalidCronSchedule: "claw_v1_invalid_cron_schedule"; + readonly invalidCronDelivery: "claw_v1_invalid_cron_delivery"; + readonly duplicateCronJob: "claw_v1_duplicate_cron_job"; +}; +export type ClawManifestValidationCode = (typeof CLAW_MANIFEST_VALIDATION_CODES)[keyof typeof CLAW_MANIFEST_VALIDATION_CODES]; +export type ClawManifestValidationIssue = { + code: ClawManifestValidationCode; + phase: typeof CLAW_MANIFEST_VALIDATION_PHASE; + path: string; + message: string; +}; +export declare const OPENCLAW_CLAW_HOST_ENV_POLICY_V1: { + readonly contractVersion: 1; + readonly source: { + readonly repository: "openclaw/openclaw"; + readonly commit: "f50a918af102b950721c1b380f7eb8af4e0389d1"; + readonly path: "src/infra/host-env-security-policy.json"; + readonly sha256: "4639dcfa157d4fa4c2fb84f8c5347ffe2252eb4ddb3d818afd7f87d68173b92b"; + }; + readonly blockedKeys: readonly ["NODE_OPTIONS", "NODE_PATH", "NODE_REDIRECT_WARNINGS", "NODE_REPL_EXTERNAL_MODULE", "NODE_REPL_HISTORY", "NODE_V8_COVERAGE", "PYTHONHOME", "PYTHONPATH", "PERL5LIB", "PERL5OPT", "RUBYLIB", "RUBYOPT", "BASHOPTS", "BASH_ENV", "ENV", "KSH_ENV", "BROWSER", "GIT_ALLOW_PROTOCOL", "GIT_EDITOR", "GIT_EXTERNAL_DIFF", "GIT_DIR", "GIT_WORK_TREE", "GIT_COMMON_DIR", "GIT_EXEC_PATH", "GIT_INDEX_FILE", "GIT_OBJECT_DIRECTORY", "GIT_ALTERNATE_OBJECT_DIRECTORIES", "GIT_NAMESPACE", "GIT_PROTOCOL_FROM_USER", "GIT_SEQUENCE_EDITOR", "GIT_TEMPLATE_DIR", "GIT_SSL_NO_VERIFY", "GIT_SSL_CAINFO", "GIT_SSL_CAPATH", "CC", "CPP", "CXX", "CARGO_BUILD_RUSTC", "CARGO_BUILD_RUSTC_WRAPPER", "CARGO_BUILD_RUSTC_WORKSPACE_WRAPPER", "CARGO_BUILD_RUSTDOC", "RUSTC", "RUSTC_WRAPPER", "RUSTC_WORKSPACE_WRAPPER", "RUSTDOC", "CMAKE_C_COMPILER", "CMAKE_CXX_COMPILER", "SHELL", "SHELLOPTS", "PS4", "GCONV_PATH", "IFS", "SSLKEYLOGFILE", "JAVA_OPTS", "JAVA_TOOL_OPTIONS", "_JAVA_OPTIONS", "JDK_JAVA_OPTIONS", "PYTHONBREAKPOINT", "DOTNET_STARTUP_HOOKS", "DOTNET_ADDITIONAL_DEPS", "FPATH", "GLIBC_TUNABLES", "MAVEN_OPTS", "MAKE", "MAKEFLAGS", "MFLAGS", "SBT_OPTS", "GRADLE_OPTS", "ANT_OPTS", "HGRCPATH", "HGEDITOR", "HGMERGE", "EXINIT", "VIMINIT", "MYVIMRC", "GVIMINIT", "LUA_INIT", "LUA_INIT_5_1", "LUA_INIT_5_2", "LUA_INIT_5_3", "LUA_INIT_5_4", "EMACSLOADPATH", "RUBYSHELL", "GIT_HOOK_PATH", "SVN_EDITOR", "SVN_SSH", "BZR_EDITOR", "BZR_SSH", "BZR_PLUGIN_PATH", "SUDO_ASKPASS", "JULIA_EDITOR", "CONFIG_SITE", "CONFIG_SHELL", "CMAKE_TOOLCHAIN_FILE", "CATALINA_OPTS", "CORECLR_PROFILER", "HELM_PLUGINS", "PACKER_PLUGIN_PATH", "VAGRANT_VAGRANTFILE", "ERL_AFLAGS", "ERL_FLAGS", "ERL_ZFLAGS", "ELIXIR_ERL_OPTIONS", "R_ENVIRON", "R_PROFILE", "R_ENVIRON_USER", "R_PROFILE_USER", "TCLLIBPATH", "HOSTALIASES"]; + readonly blockedPrefixes: readonly ["DYLD_", "LD_", "BASH_FUNC_"]; +}; +export declare function validateClawManifest(value: unknown): { + ok: true; + manifest: ClawManifest; +} | { + ok: false; + issues: ClawManifestValidationIssue[]; +}; +export declare function summarizeClawManifest(manifest: ClawManifest): ClawManifestSummary; diff --git a/packages/schema/dist/claws.js b/packages/schema/dist/claws.js new file mode 100644 index 0000000000..077b2c6129 --- /dev/null +++ b/packages/schema/dist/claws.js @@ -0,0 +1,641 @@ +import { ArkErrors, type } from "arktype"; +import { Cron } from "croner"; +import { caseFold } from "unicode-case-folding"; +export const CLAW_SCHEMA_VERSION = 1; +export const CLAW_SUMMARY_AGENT_NAME_MAX_CHARS = 128; +export const CLAW_SUMMARY_AGENT_DESCRIPTION_MAX_CHARS = 1_024; +export const CLAW_BOOTSTRAP_FILE_NAMES = [ + "AGENTS.md", + "SOUL.md", + "IDENTITY.md", + "TOOLS.md", + "HEARTBEAT.md", +]; +const StringArraySchema = type("string[]"); +const WorkspaceSourceSchema = type({ "+": "reject", source: "string" }); +const ToolFilterSchema = type({ + "+": "reject", + include: StringArraySchema.optional(), + exclude: StringArraySchema.optional(), +}); +const StdioMcpServerSchema = type({ + "+": "reject", + command: "string", + transport: '"stdio"?', + args: StringArraySchema.optional(), + env: type({ "[string]": "string" }).optional(), + toolFilter: ToolFilterSchema.optional(), + timeout: "number?", + connectTimeout: "number?", +}); +const RemoteMcpServerSchema = type({ + "+": "reject", + url: "string", + transport: '"sse"|"streamable-http"', + auth: '"oauth"?', + toolFilter: ToolFilterSchema.optional(), + timeout: "number?", + connectTimeout: "number?", +}); +export const ClawManifestSchema = type({ + "+": "reject", + schemaVersion: "1", + agent: { + "+": "reject", + id: "string", + name: "string?", + description: "string?", + identity: type({ + "+": "reject", + name: "string?", + theme: "string?", + emoji: "string?", + avatar: "string?", + }).optional(), + }, + metadata: type({ "[string]": "string" }).optional(), + workspace: type({ + "+": "reject", + bootstrapFiles: type({ + "+": "reject", + "AGENTS.md": WorkspaceSourceSchema.optional(), + "SOUL.md": WorkspaceSourceSchema.optional(), + "IDENTITY.md": WorkspaceSourceSchema.optional(), + "TOOLS.md": WorkspaceSourceSchema.optional(), + "HEARTBEAT.md": WorkspaceSourceSchema.optional(), + }).optional(), + files: type({ "+": "reject", source: "string", path: "string" }).array().optional(), + }).optional(), + packages: type({ + "+": "reject", + kind: '"skill"|"plugin"', + source: '"clawhub"', + ref: "string", + version: "string", + }) + .array() + .optional(), + mcpServers: type({ + "[string]": StdioMcpServerSchema.or(RemoteMcpServerSchema), + }).optional(), + cronJobs: type({ + "+": "reject", + id: "string", + name: "string?", + schedule: { "+": "reject", cron: "string", timezone: "string" }, + session: '"main"|"isolated"', + message: "string", + delivery: type({ + "+": "reject", + mode: '"none"|"announce"', + channel: '"last"?', + }).optional(), + }) + .array() + .optional(), +}); +/** Builds the v1 summary structure for both the public schema and durable storage validators. */ +export function createClawManifestSummarySchema(adapter) { + return adapter.object({ + schemaVersion: adapter.literalOne, + agent: adapter.object({ + id: adapter.string, + name: adapter.optional(adapter.boundedString(CLAW_SUMMARY_AGENT_NAME_MAX_CHARS)), + description: adapter.optional(adapter.boundedString(CLAW_SUMMARY_AGENT_DESCRIPTION_MAX_CHARS)), + }), + workspace: adapter.object({ + bootstrapFiles: adapter.stringArray, + fileCount: adapter.number, + }), + packages: adapter.object({ + skillCount: adapter.number, + pluginCount: adapter.number, + }), + mcpServerCount: adapter.number, + cronJobCount: adapter.number, + }); +} +export const ClawManifestSummarySchema = createClawManifestSummarySchema({ + literalOne: type("1"), + string: type("string"), + number: type("number"), + stringArray: type("string[]"), + boundedString: (maxCharacters) => type("string").narrow((value) => Array.from(value).length <= maxCharacters), + optional: (schema) => schema.optional(), + object: (fields) => type({ "+": "reject", ...fields }), +}); +export const CLAW_MANIFEST_VALIDATION_PHASE = "schema"; +export const CLAW_MANIFEST_VALIDATION_CODES = { + invalidManifestShape: "claw_v1_invalid_manifest_shape", + invalidAgentId: "claw_v1_invalid_agent_id", + nonCanonicalString: "claw_v1_non_canonical_string", + emptyList: "claw_v1_empty_list", + invalidProfilePath: "claw_v1_invalid_profile_path", + unsafePath: "claw_v1_unsafe_path", + duplicateWorkspaceDestination: "claw_v1_duplicate_workspace_destination", + invalidAvatar: "claw_v1_invalid_avatar", + undeclaredAvatar: "claw_v1_undeclared_avatar", + invalidPackageReference: "claw_v1_invalid_package_reference", + invalidPackageVersion: "claw_v1_invalid_package_version", + duplicatePackage: "claw_v1_duplicate_package", + invalidMcpServerId: "claw_v1_invalid_mcp_server_id", + invalidMcpUrl: "claw_v1_invalid_mcp_url", + mcpUrlCredentials: "claw_v1_mcp_url_credentials", + unpinnedMcpPackage: "claw_v1_unpinned_mcp_package", + invalidToolFilter: "claw_v1_invalid_tool_filter", + duplicateToolFilter: "claw_v1_duplicate_tool_filter", + invalidEnvironmentKey: "claw_v1_invalid_environment_key", + blockedEnvironmentKey: "claw_v1_blocked_environment_key", + invalidEnvironmentReference: "claw_v1_invalid_environment_reference", + invalidTimeout: "claw_v1_invalid_timeout", + invalidCronJobId: "claw_v1_invalid_cron_job_id", + invalidCronSchedule: "claw_v1_invalid_cron_schedule", + invalidCronDelivery: "claw_v1_invalid_cron_delivery", + duplicateCronJob: "claw_v1_duplicate_cron_job", +}; +const AGENT_ID_PATTERN = /^[a-z][a-z0-9_-]{0,63}$/; +const EXACT_VERSION_PATTERN = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[A-Za-z-][0-9A-Za-z-]*)(?:\.(?:0|[1-9]\d*|\d*[A-Za-z-][0-9A-Za-z-]*))*))?(?:\+([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?$/; +const ENV_REFERENCE_PATTERN = /^\$\{[A-Z_][A-Z0-9_]*\}$/; +const PACKAGE_NAME_PATTERN = /^(?:@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*$/; +const WINDOWS_INVALID_PATH_CHARS = /[<>:"|?*]/; +const WINDOWS_RESERVED_PATH_SEGMENT = /^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\..*)?$/i; +const UNICODE_CONTROL_CHARACTER = /\p{Cc}/u; +const AVATAR_MAX_BYTES = 2 * 1024 * 1024; +const AVATAR_MAX_DATA_URL_CHARS = 2_796_230; +const AVATAR_DATA_URL_PATTERN = /^data:image\/[^,]*,/i; +const AVATAR_EXTENSION_PATTERN = /\.(?:png|jpe?g|gif|webp|svg)$/i; +const BASE64_PAYLOAD_PATTERN = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/; +const PORTABLE_ENV_KEY_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/; +// Versioned compatibility artifact for the OpenClaw policy applied by the v1 consumer. +export const OPENCLAW_CLAW_HOST_ENV_POLICY_V1 = { + contractVersion: 1, + source: { + repository: "openclaw/openclaw", + commit: "f50a918af102b950721c1b380f7eb8af4e0389d1", + path: "src/infra/host-env-security-policy.json", + sha256: "4639dcfa157d4fa4c2fb84f8c5347ffe2252eb4ddb3d818afd7f87d68173b92b", + }, + blockedKeys: [ + "NODE_OPTIONS", + "NODE_PATH", + "NODE_REDIRECT_WARNINGS", + "NODE_REPL_EXTERNAL_MODULE", + "NODE_REPL_HISTORY", + "NODE_V8_COVERAGE", + "PYTHONHOME", + "PYTHONPATH", + "PERL5LIB", + "PERL5OPT", + "RUBYLIB", + "RUBYOPT", + "BASHOPTS", + "BASH_ENV", + "ENV", + "KSH_ENV", + "BROWSER", + "GIT_ALLOW_PROTOCOL", + "GIT_EDITOR", + "GIT_EXTERNAL_DIFF", + "GIT_DIR", + "GIT_WORK_TREE", + "GIT_COMMON_DIR", + "GIT_EXEC_PATH", + "GIT_INDEX_FILE", + "GIT_OBJECT_DIRECTORY", + "GIT_ALTERNATE_OBJECT_DIRECTORIES", + "GIT_NAMESPACE", + "GIT_PROTOCOL_FROM_USER", + "GIT_SEQUENCE_EDITOR", + "GIT_TEMPLATE_DIR", + "GIT_SSL_NO_VERIFY", + "GIT_SSL_CAINFO", + "GIT_SSL_CAPATH", + "CC", + "CPP", + "CXX", + "CARGO_BUILD_RUSTC", + "CARGO_BUILD_RUSTC_WRAPPER", + "CARGO_BUILD_RUSTC_WORKSPACE_WRAPPER", + "CARGO_BUILD_RUSTDOC", + "RUSTC", + "RUSTC_WRAPPER", + "RUSTC_WORKSPACE_WRAPPER", + "RUSTDOC", + "CMAKE_C_COMPILER", + "CMAKE_CXX_COMPILER", + "SHELL", + "SHELLOPTS", + "PS4", + "GCONV_PATH", + "IFS", + "SSLKEYLOGFILE", + "JAVA_OPTS", + "JAVA_TOOL_OPTIONS", + "_JAVA_OPTIONS", + "JDK_JAVA_OPTIONS", + "PYTHONBREAKPOINT", + "DOTNET_STARTUP_HOOKS", + "DOTNET_ADDITIONAL_DEPS", + "FPATH", + "GLIBC_TUNABLES", + "MAVEN_OPTS", + "MAKE", + "MAKEFLAGS", + "MFLAGS", + "SBT_OPTS", + "GRADLE_OPTS", + "ANT_OPTS", + "HGRCPATH", + "HGEDITOR", + "HGMERGE", + "EXINIT", + "VIMINIT", + "MYVIMRC", + "GVIMINIT", + "LUA_INIT", + "LUA_INIT_5_1", + "LUA_INIT_5_2", + "LUA_INIT_5_3", + "LUA_INIT_5_4", + "EMACSLOADPATH", + "RUBYSHELL", + "GIT_HOOK_PATH", + "SVN_EDITOR", + "SVN_SSH", + "BZR_EDITOR", + "BZR_SSH", + "BZR_PLUGIN_PATH", + "SUDO_ASKPASS", + "JULIA_EDITOR", + "CONFIG_SITE", + "CONFIG_SHELL", + "CMAKE_TOOLCHAIN_FILE", + "CATALINA_OPTS", + "CORECLR_PROFILER", + "HELM_PLUGINS", + "PACKER_PLUGIN_PATH", + "VAGRANT_VAGRANTFILE", + "ERL_AFLAGS", + "ERL_FLAGS", + "ERL_ZFLAGS", + "ELIXIR_ERL_OPTIONS", + "R_ENVIRON", + "R_PROFILE", + "R_ENVIRON_USER", + "R_PROFILE_USER", + "TCLLIBPATH", + "HOSTALIASES", + ], + blockedPrefixes: ["DYLD_", "LD_", "BASH_FUNC_"], +}; +const BLOCKED_PROCESS_ENV_KEYS = new Set(OPENCLAW_CLAW_HOST_ENV_POLICY_V1.blockedKeys); +const BLOCKED_PROCESS_ENV_PREFIXES = OPENCLAW_CLAW_HOST_ENV_POLICY_V1.blockedPrefixes; +function isStrictNonEmpty(value) { + return value.length > 0 && value === value.trim(); +} +function isBlockedProcessEnvKey(value) { + const upper = value.toUpperCase(); + return (BLOCKED_PROCESS_ENV_KEYS.has(upper) || + BLOCKED_PROCESS_ENV_PREFIXES.some((prefix) => upper.startsWith(prefix))); +} +function isSafePackagePath(value) { + const normalized = value.replaceAll("\\", "/"); + if (!isStrictNonEmpty(normalized) || + normalized.startsWith("/") || + /^[A-Za-z]:\//.test(normalized)) { + return false; + } + return normalized + .split("/") + .every((segment) => segment !== "" && + segment !== "." && + segment !== ".." && + !WINDOWS_INVALID_PATH_CHARS.test(segment) && + !UNICODE_CONTROL_CHARACTER.test(segment) && + !segment.endsWith(".") && + !segment.endsWith(" ") && + !WINDOWS_RESERVED_PATH_SEGMENT.test(segment)); +} +function portablePathKey(value) { + return caseFold(value.replaceAll("\\", "/").normalize("NFC")); +} +function isPortableAvatar(value) { + if (AVATAR_DATA_URL_PATTERN.test(value)) { + if (value.length > AVATAR_MAX_DATA_URL_CHARS) + return false; + const comma = value.indexOf(","); + if (comma < 0) + return false; + const metadata = value.slice(0, comma); + const payload = value.slice(comma + 1); + try { + const base64 = /;base64(?:;|$)/i.test(metadata); + if (payload.length === 0 || (base64 && !BASE64_PAYLOAD_PATTERN.test(payload))) + return false; + const byteLength = base64 + ? (payload.length / 4) * 3 - (payload.endsWith("==") ? 2 : payload.endsWith("=") ? 1 : 0) + : new TextEncoder().encode(decodeURIComponent(payload)).byteLength; + return byteLength > 0 && byteLength <= AVATAR_MAX_BYTES; + } + catch { + return false; + } + } + return isSafePackagePath(value) && AVATAR_EXTENSION_PATTERN.test(value); +} +function conflictsWithWorkspaceTarget(targets, candidate) { + for (const target of targets) { + if (target === candidate || + target.startsWith(`${candidate}/`) || + candidate.startsWith(`${target}/`)) { + return true; + } + } + return false; +} +function packageManagerArtifacts(command, args) { + const executable = command + .split(/[\\/]/) + .at(-1) + ?.replace(/\.(?:cmd|exe)$/i, "") + .toLowerCase(); + let start = 0; + let scansOptionsAfterPositional = false; + if (executable === "npm") { + if (args[0] !== "exec" && args[0] !== "x") + return undefined; + start = 1; + scansOptionsAfterPositional = true; + } + else if (executable === "bun") { + if (args[0] !== "x") + return undefined; + start = 1; + } + else if (executable === "pnpm" || executable === "yarn") { + if (args[0] !== "dlx") + return undefined; + start = 1; + } + else if (executable !== "npx" && executable !== "pnpx" && executable !== "bunx") { + return undefined; + } + const selected = []; + let positional; + for (let index = start; index < args.length; index += 1) { + const value = args[index]; + if (!value) + continue; + if (value === "--") { + positional ??= args[index + 1] ?? ""; + break; + } + if (value === "-p" || value === "--package") { + selected.push(args[index + 1] ?? ""); + index += 1; + continue; + } + if (value.startsWith("--package=")) { + selected.push(value.slice("--package=".length)); + continue; + } + if (value === "-y" || value === "--yes") + continue; + if (value.startsWith("-")) + return [""]; + if (positional === undefined && !value.startsWith("-")) { + positional = value; + if (!scansOptionsAfterPositional) + break; + } + } + return selected.length > 0 ? selected : [positional ?? ""]; +} +function truncateSummaryText(value, maxChars) { + if (!value) + return undefined; + return Array.from(value).slice(0, maxChars).join(""); +} +function isPackageManagerArtifactPinned(command, args) { + const artifacts = packageManagerArtifacts(command, args); + if (artifacts === undefined) + return undefined; + return artifacts.every((artifact) => { + const separator = artifact.lastIndexOf("@"); + const scopedSlash = artifact.startsWith("@") ? artifact.indexOf("/") : -1; + return (separator > 0 && + separator > scopedSlash && + EXACT_VERSION_PATTERN.test(artifact.slice(separator + 1))); + }); +} +function validationIssue(code, path, message) { + return { code, phase: CLAW_MANIFEST_VALIDATION_PHASE, path, message }; +} +function arkIssues(errors) { + return Array.from(errors, (error) => validationIssue(CLAW_MANIFEST_VALIDATION_CODES.invalidManifestShape, error.path.length > 0 ? `$.${error.path.join(".")}` : "$", error.description ?? "Manifest must match the strict Claw v1 shape.")); +} +function pushNonEmpty(issues, path, value) { + if (value !== undefined && !isStrictNonEmpty(value)) { + issues.push(validationIssue(CLAW_MANIFEST_VALIDATION_CODES.nonCanonicalString, path, "Must be non-empty without leading or trailing whitespace.")); + } +} +function pushNonEmptyArray(issues, path, values, requireEntry) { + if (requireEntry && values !== undefined && values.length === 0) { + issues.push(validationIssue(CLAW_MANIFEST_VALIDATION_CODES.emptyList, path, "Must contain at least one value.")); + } + for (const [index, value] of (values ?? []).entries()) { + pushNonEmpty(issues, `${path}.${index}`, value); + } +} +export function validateClawManifest(value) { + const parsed = ClawManifestSchema(value); + if (parsed instanceof ArkErrors) + return { ok: false, issues: arkIssues(parsed) }; + const issues = []; + if (!AGENT_ID_PATTERN.test(parsed.agent.id)) { + issues.push(validationIssue(CLAW_MANIFEST_VALIDATION_CODES.invalidAgentId, "$.agent.id", "Invalid portable agent id.")); + } + pushNonEmpty(issues, "$.agent.name", parsed.agent.name); + pushNonEmpty(issues, "$.agent.description", parsed.agent.description); + for (const field of ["name", "theme", "emoji", "avatar"]) { + pushNonEmpty(issues, `$.agent.identity.${field}`, parsed.agent.identity?.[field]); + } + for (const key of Object.keys(parsed.metadata ?? {})) { + pushNonEmpty(issues, `$.metadata.${key}`, key); + } + const openClawProfilePath = parsed.metadata?.["openclaw.config"]; + if (openClawProfilePath !== undefined && + (openClawProfilePath.includes("\\") || + !isSafePackagePath(openClawProfilePath) || + !/\.ya?ml$/i.test(openClawProfilePath))) { + issues.push(validationIssue(CLAW_MANIFEST_VALIDATION_CODES.invalidProfilePath, "$.metadata.openclaw.config", "Must reference a forward-slash package-relative .yml or .yaml file.")); + } + const workspaceTargets = new Set(); + for (const name of CLAW_BOOTSTRAP_FILE_NAMES) { + const source = parsed.workspace?.bootstrapFiles?.[name]?.source; + if (source === undefined) + continue; + if (!isSafePackagePath(source)) { + issues.push(validationIssue(CLAW_MANIFEST_VALIDATION_CODES.unsafePath, `$.workspace.bootstrapFiles.${name}.source`, "Must be a safe package-relative path.")); + } + workspaceTargets.add(portablePathKey(name)); + } + for (const [index, file] of (parsed.workspace?.files ?? []).entries()) { + if (!isSafePackagePath(file.source)) { + issues.push(validationIssue(CLAW_MANIFEST_VALIDATION_CODES.unsafePath, `$.workspace.files.${index}.source`, "Must be a safe package-relative path.")); + } + if (!isSafePackagePath(file.path)) { + issues.push(validationIssue(CLAW_MANIFEST_VALIDATION_CODES.unsafePath, `$.workspace.files.${index}.path`, "Must be a safe package-relative path.")); + } + const destinationKey = portablePathKey(file.path); + if (conflictsWithWorkspaceTarget(workspaceTargets, destinationKey)) { + issues.push(validationIssue(CLAW_MANIFEST_VALIDATION_CODES.duplicateWorkspaceDestination, `$.workspace.files.${index}.path`, "Workspace destination is declared more than once.")); + } + workspaceTargets.add(destinationKey); + } + const avatar = parsed.agent.identity?.avatar; + if (avatar !== undefined) { + if (!isPortableAvatar(avatar)) { + issues.push(validationIssue(CLAW_MANIFEST_VALIDATION_CODES.invalidAvatar, "$.agent.identity.avatar", "Must be a bounded image data URL or managed workspace-relative image path.")); + } + else if (!AVATAR_DATA_URL_PATTERN.test(avatar) && + !workspaceTargets.has(portablePathKey(avatar))) { + issues.push(validationIssue(CLAW_MANIFEST_VALIDATION_CODES.undeclaredAvatar, "$.agent.identity.avatar", "Workspace-relative avatar must match a workspace.files destination.")); + } + } + const packageKeys = new Set(); + for (const [index, pkg] of (parsed.packages ?? []).entries()) { + pushNonEmpty(issues, `$.packages.${index}.ref`, pkg.ref); + if (!PACKAGE_NAME_PATTERN.test(pkg.ref)) { + issues.push(validationIssue(CLAW_MANIFEST_VALIDATION_CODES.invalidPackageReference, `$.packages.${index}.ref`, "Must be a lowercase ClawHub package name.")); + } + if (!EXACT_VERSION_PATTERN.test(pkg.version)) { + issues.push(validationIssue(CLAW_MANIFEST_VALIDATION_CODES.invalidPackageVersion, `$.packages.${index}.version`, "Must be an exact semantic version.")); + } + const key = `${pkg.kind}:${pkg.source}:${pkg.ref.toLowerCase()}`; + if (packageKeys.has(key)) { + issues.push(validationIssue(CLAW_MANIFEST_VALIDATION_CODES.duplicatePackage, `$.packages.${index}`, "Package is declared more than once.")); + } + packageKeys.add(key); + } + for (const [name, server] of Object.entries(parsed.mcpServers ?? {})) { + if (!AGENT_ID_PATTERN.test(name)) { + issues.push(validationIssue(CLAW_MANIFEST_VALIDATION_CODES.invalidMcpServerId, `$.mcpServers.${name}`, "Invalid MCP server name.")); + } + if ("url" in server) { + pushNonEmpty(issues, `$.mcpServers.${name}.url`, server.url); + try { + const url = new URL(server.url); + const loopback = ["localhost", "127.0.0.1", "[::1]"].includes(url.hostname); + if (url.protocol !== "https:" && !(url.protocol === "http:" && loopback)) { + throw new Error("protocol"); + } + if (url.username || url.password || url.hash) { + issues.push(validationIssue(CLAW_MANIFEST_VALIDATION_CODES.mcpUrlCredentials, `$.mcpServers.${name}.url`, "Must not contain embedded credentials or fragments.")); + } + } + catch { + issues.push(validationIssue(CLAW_MANIFEST_VALIDATION_CODES.invalidMcpUrl, `$.mcpServers.${name}.url`, "Must use HTTPS, except HTTP on an exact loopback host.")); + } + } + if ("command" in server) { + pushNonEmpty(issues, `$.mcpServers.${name}.command`, server.command); + pushNonEmptyArray(issues, `$.mcpServers.${name}.args`, server.args, false); + if (isPackageManagerArtifactPinned(server.command, server.args ?? []) === false) { + issues.push(validationIssue(CLAW_MANIFEST_VALIDATION_CODES.unpinnedMcpPackage, `$.mcpServers.${name}.args`, "Package-manager MCP commands must select one exact immutable package version.")); + } + } + pushNonEmptyArray(issues, `$.mcpServers.${name}.toolFilter.include`, server.toolFilter?.include, true); + pushNonEmptyArray(issues, `$.mcpServers.${name}.toolFilter.exclude`, server.toolFilter?.exclude, true); + for (const field of ["include", "exclude"]) { + const seen = new Set(); + for (const [index, entry] of (server.toolFilter?.[field] ?? []).entries()) { + if (entry.includes("?") || entry.includes("[") || entry.includes("]")) { + issues.push(validationIssue(CLAW_MANIFEST_VALIDATION_CODES.invalidToolFilter, `$.mcpServers.${name}.toolFilter.${field}.${index}`, "Tool filters support only exact names and * wildcards.")); + } + if (seen.has(entry)) { + issues.push(validationIssue(CLAW_MANIFEST_VALIDATION_CODES.duplicateToolFilter, `$.mcpServers.${name}.toolFilter.${field}.${index}`, "Tool filter entries must be unique.")); + } + seen.add(entry); + } + } + if ("env" in server) { + for (const [key, envValue] of Object.entries(server.env ?? {})) { + pushNonEmpty(issues, `$.mcpServers.${name}.env`, key); + if (!PORTABLE_ENV_KEY_PATTERN.test(key)) { + issues.push(validationIssue(CLAW_MANIFEST_VALIDATION_CODES.invalidEnvironmentKey, `$.mcpServers.${name}.env.${key}`, "Invalid portable environment key.")); + } + if (isBlockedProcessEnvKey(key)) { + issues.push(validationIssue(CLAW_MANIFEST_VALIDATION_CODES.blockedEnvironmentKey, `$.mcpServers.${name}.env.${key}`, "Environment key is blocked by the spawned-process safety policy.")); + } + if (!ENV_REFERENCE_PATTERN.test(envValue)) { + issues.push(validationIssue(CLAW_MANIFEST_VALIDATION_CODES.invalidEnvironmentReference, `$.mcpServers.${name}.env.${key}`, "Must be an unresolved ${ENV_VAR} reference.")); + } + } + } + if (server.timeout !== undefined && (!Number.isFinite(server.timeout) || server.timeout <= 0)) { + issues.push(validationIssue(CLAW_MANIFEST_VALIDATION_CODES.invalidTimeout, `$.mcpServers.${name}.timeout`, "Must be positive.")); + } + if (server.connectTimeout !== undefined && + (!Number.isFinite(server.connectTimeout) || server.connectTimeout <= 0)) { + issues.push(validationIssue(CLAW_MANIFEST_VALIDATION_CODES.invalidTimeout, `$.mcpServers.${name}.connectTimeout`, "Must be positive.")); + } + } + const cronIds = new Set(); + for (const [index, job] of (parsed.cronJobs ?? []).entries()) { + if (!AGENT_ID_PATTERN.test(job.id)) { + issues.push(validationIssue(CLAW_MANIFEST_VALIDATION_CODES.invalidCronJobId, `$.cronJobs.${index}.id`, "Invalid cron job id.")); + } + pushNonEmpty(issues, `$.cronJobs.${index}.name`, job.name); + pushNonEmpty(issues, `$.cronJobs.${index}.schedule.cron`, job.schedule.cron); + pushNonEmpty(issues, `$.cronJobs.${index}.schedule.timezone`, job.schedule.timezone); + pushNonEmpty(issues, `$.cronJobs.${index}.message`, job.message); + try { + if (job.schedule.cron.trim().split(/\s+/).length !== 5) + throw new Error("fields"); + const cron = new Cron(job.schedule.cron.trim(), { + timezone: job.schedule.timezone.trim(), + catch: false, + paused: true, + }); + if (!cron.nextRun(new Date())) + throw new Error("No future run"); + } + catch { + issues.push(validationIssue(CLAW_MANIFEST_VALIDATION_CODES.invalidCronSchedule, `$.cronJobs.${index}.schedule`, "Must contain a valid cron expression and timezone.")); + } + if ((job.delivery?.mode === "none" && job.delivery.channel !== undefined) || + (job.delivery?.mode === "announce" && job.delivery.channel !== "last")) { + issues.push(validationIssue(CLAW_MANIFEST_VALIDATION_CODES.invalidCronDelivery, `$.cronJobs.${index}.delivery`, 'Must be { mode: "none" } or { mode: "announce", channel: "last" }.')); + } + if (cronIds.has(job.id)) { + issues.push(validationIssue(CLAW_MANIFEST_VALIDATION_CODES.duplicateCronJob, `$.cronJobs.${index}.id`, "Cron job id is declared more than once.")); + } + cronIds.add(job.id); + } + return issues.length > 0 ? { ok: false, issues } : { ok: true, manifest: parsed }; +} +export function summarizeClawManifest(manifest) { + const packages = manifest.packages ?? []; + const agentName = truncateSummaryText(manifest.agent.name, CLAW_SUMMARY_AGENT_NAME_MAX_CHARS); + const agentDescription = truncateSummaryText(manifest.agent.description, CLAW_SUMMARY_AGENT_DESCRIPTION_MAX_CHARS); + return { + schemaVersion: CLAW_SCHEMA_VERSION, + agent: { + id: manifest.agent.id, + ...(agentName ? { name: agentName } : {}), + ...(agentDescription ? { description: agentDescription } : {}), + }, + workspace: { + bootstrapFiles: CLAW_BOOTSTRAP_FILE_NAMES.filter((name) => manifest.workspace?.bootstrapFiles?.[name] !== undefined), + fileCount: manifest.workspace?.files?.length ?? 0, + }, + packages: { + skillCount: packages.filter((pkg) => pkg.kind === "skill").length, + pluginCount: packages.filter((pkg) => pkg.kind === "plugin").length, + }, + mcpServerCount: Object.keys(manifest.mcpServers ?? {}).length, + cronJobCount: manifest.cronJobs?.length ?? 0, + }; +} +//# sourceMappingURL=claws.js.map \ No newline at end of file diff --git a/packages/schema/dist/claws.js.map b/packages/schema/dist/claws.js.map new file mode 100644 index 0000000000..69d09f82ca --- /dev/null +++ b/packages/schema/dist/claws.js.map @@ -0,0 +1 @@ +{"version":3,"file":"claws.js","sourceRoot":"","sources":["../src/claws.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/schema/dist/index.d.ts b/packages/schema/dist/index.d.ts index 099df5383b..d03a08a7d4 100644 --- a/packages/schema/dist/index.d.ts +++ b/packages/schema/dist/index.d.ts @@ -1,5 +1,6 @@ export type { ArkValidator } from "./ark.js"; export { formatArkErrors, parseArk } from "./ark.js"; +export * from "./claws.js"; export * from "./catalogFeed.js"; export * from "./catalogMetadata.js"; export * from "./docsLinks.js"; diff --git a/packages/schema/dist/index.js b/packages/schema/dist/index.js index be1a5b59f4..2ded7f40c9 100644 --- a/packages/schema/dist/index.js +++ b/packages/schema/dist/index.js @@ -1,4 +1,5 @@ export { formatArkErrors, parseArk } from "./ark.js"; +export * from "./claws.js"; export * from "./catalogFeed.js"; export * from "./catalogMetadata.js"; export * from "./docsLinks.js"; diff --git a/packages/schema/dist/index.js.map b/packages/schema/dist/index.js.map index efe98db65b..b5e68b2e75 100644 --- a/packages/schema/dist/index.js.map +++ b/packages/schema/dist/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACrD,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACzD,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACrD,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACzD,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC"} \ No newline at end of file diff --git a/packages/schema/dist/packages.d.ts b/packages/schema/dist/packages.d.ts index f7420e228a..f8acebafe5 100644 --- a/packages/schema/dist/packages.d.ts +++ b/packages/schema/dist/packages.d.ts @@ -8,8 +8,10 @@ export declare function getPackageScopeOwnerMismatch(name: string, ownerHandle: suggestedName: string; message: string; } | null; -export declare const PackageFamilySchema: import("arktype/internal/variants/string.ts").StringType<"bundle-plugin" | "code-plugin" | "skill", {}>; +export declare const PackageFamilySchema: import("arktype/internal/variants/string.ts").StringType<"bundle-plugin" | "claw" | "code-plugin" | "skill", {}>; export type PackageFamily = (typeof PackageFamilySchema)[inferred]; +export declare const PackagePublishFamilySchema: import("arktype/internal/variants/string.ts").StringType<"bundle-plugin" | "code-plugin" | "skill", {}>; +export type PackagePublishFamily = (typeof PackagePublishFamilySchema)[inferred]; export declare const PackageChannelSchema: import("arktype/internal/variants/string.ts").StringType<"community" | "official" | "private", {}>; export type PackageChannel = (typeof PackageChannelSchema)[inferred]; export declare const PackageVerificationTierSchema: import("arktype/internal/variants/string.ts").StringType<"provenance-verified" | "rebuild-verified" | "source-linked" | "structural", {}>; @@ -337,7 +339,7 @@ export type ServerPackagePublishRequest = (typeof ServerPackagePublishRequestSch export declare const PackageListItemSchema: import("arktype/internal/variants/object.ts").ObjectType<{ name: string; displayName: string; - family: "bundle-plugin" | "code-plugin" | "skill"; + family: "bundle-plugin" | "claw" | "code-plugin" | "skill"; runtimeId?: string | null | undefined; channel: "community" | "official" | "private"; isOfficial: boolean; @@ -363,7 +365,7 @@ export declare const ApiV1PackageListResponseSchema: import("arktype/internal/va items: { name: string; displayName: string; - family: "bundle-plugin" | "code-plugin" | "skill"; + family: "bundle-plugin" | "claw" | "code-plugin" | "skill"; runtimeId?: string | null | undefined; channel: "community" | "official" | "private"; isOfficial: boolean; @@ -393,7 +395,7 @@ export declare const ApiV1PackageSearchResponseSchema: import("arktype/internal/ package: { name: string; displayName: string; - family: "bundle-plugin" | "code-plugin" | "skill"; + family: "bundle-plugin" | "claw" | "code-plugin" | "skill"; runtimeId?: string | null | undefined; channel: "community" | "official" | "private"; isOfficial: boolean; @@ -421,7 +423,7 @@ export declare const ApiV1PackageResponseSchema: import("arktype/internal/varian package: { name: string; displayName: string; - family: "bundle-plugin" | "code-plugin" | "skill"; + family: "bundle-plugin" | "claw" | "code-plugin" | "skill"; runtimeId?: string | null | undefined; channel: "community" | "official" | "private"; isOfficial: boolean; @@ -530,7 +532,7 @@ export declare const ApiV1PackageVersionResponseSchema: import("arktype/internal package: { name: string; displayName: string; - family: "bundle-plugin" | "code-plugin" | "skill"; + family: "bundle-plugin" | "claw" | "code-plugin" | "skill"; } | null; version: { version: string; @@ -678,7 +680,7 @@ export declare const ApiV1PackageArtifactResponseSchema: import("arktype/interna package: { name: string; displayName: string; - family: "bundle-plugin" | "code-plugin" | "skill"; + family: "bundle-plugin" | "claw" | "code-plugin" | "skill"; }; version: string; artifact: { @@ -706,7 +708,7 @@ export declare const ApiV1PackageSecurityResponseSchema: import("arktype/interna package: { name: string; displayName: string; - family: "bundle-plugin" | "code-plugin" | "skill"; + family: "bundle-plugin" | "claw" | "code-plugin" | "skill"; }; release: { releaseId: string; @@ -781,7 +783,7 @@ export declare const ApiV1PackageAppealListResponseSchema: import("arktype/inter releaseId: string; name: string; displayName: string; - family: "bundle-plugin" | "code-plugin" | "skill"; + family: "bundle-plugin" | "claw" | "code-plugin" | "skill"; version: string; message: string; status: "accepted" | "open" | "rejected"; @@ -816,7 +818,7 @@ export declare const ApiV1PackageReportListResponseSchema: import("arktype/inter releaseId?: string | null | undefined; name: string; displayName: string; - family: "bundle-plugin" | "code-plugin" | "skill"; + family: "bundle-plugin" | "claw" | "code-plugin" | "skill"; version?: string | null | undefined; reason?: string | null | undefined; status: "confirmed" | "dismissed" | "open"; @@ -849,7 +851,7 @@ export declare const ApiV1PackageModerationStatusResponseSchema: import("arktype packageId: string; name: string; displayName: string; - family: "bundle-plugin" | "code-plugin" | "skill"; + family: "bundle-plugin" | "claw" | "code-plugin" | "skill"; channel: "community" | "official" | "private"; isOfficial: boolean; reportCount: number; @@ -880,7 +882,7 @@ export declare const ApiV1PackageReadinessResponseSchema: import("arktype/intern package: { name: string; displayName: string; - family: "bundle-plugin" | "code-plugin" | "skill"; + family: "bundle-plugin" | "claw" | "code-plugin" | "skill"; isOfficial: boolean; latestVersion?: string | null | undefined; }; @@ -1090,7 +1092,7 @@ export declare const ApiV1PackageModerationQueueResponseSchema: import("arktype/ releaseId: string; name: string; displayName: string; - family: "bundle-plugin" | "code-plugin" | "skill"; + family: "bundle-plugin" | "claw" | "code-plugin" | "skill"; channel: "community" | "official" | "private"; isOfficial: boolean; version: string; diff --git a/packages/schema/dist/packages.js b/packages/schema/dist/packages.js index c1bd8843d2..b3f1a5caa9 100644 --- a/packages/schema/dist/packages.js +++ b/packages/schema/dist/packages.js @@ -22,7 +22,9 @@ export function getPackageScopeOwnerMismatch(name, ownerHandle) { message: `Package scope "@${scope}" must match selected owner "@${selectedOwner}". Publish as "@${scope}" or rename this package to "@${selectedOwner}/${packageSlug}". More info: ${DocsLinks.clawhub.packageScopeFaq}`, }; } -export const PackageFamilySchema = type('"skill"|"code-plugin"|"bundle-plugin"'); +export const PackageFamilySchema = type('"skill"|"code-plugin"|"bundle-plugin"|"claw"'); +// Publication stays narrower until a family has a complete validation path. +export const PackagePublishFamilySchema = type('"skill"|"code-plugin"|"bundle-plugin"'); export const PackageChannelSchema = type('"official"|"community"|"private"'); export const PackageVerificationTierSchema = type('"structural"|"source-linked"|"provenance-verified"|"rebuild-verified"'); export const PackageVerificationScopeSchema = type('"artifact-only"|"dependency-graph-aware"'); @@ -255,7 +257,7 @@ const PackagePublishMetadataFields = { name: "string", displayName: "string?", ownerHandle: "string?", - family: PackageFamilySchema, + family: PackagePublishFamilySchema, version: "string", changelog: "string", manualOverrideReason: "string?", diff --git a/packages/schema/dist/packages.js.map b/packages/schema/dist/packages.js.map index c11a29a81f..fc72befb17 100644 --- a/packages/schema/dist/packages.js.map +++ b/packages/schema/dist/packages.js.map @@ -1 +1 @@ -{"version":3,"file":"packages.js","sourceRoot":"","sources":["../src/packages.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"packages.js","sourceRoot":"","sources":["../src/packages.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/schema/package.json b/packages/schema/package.json index b768cab89d..c86b85ba01 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -30,7 +30,9 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "arktype": "2.2.3" + "arktype": "2.2.3", + "croner": "10.0.1", + "unicode-case-folding": "1.1.1" }, "devDependencies": { "@typescript/native": "npm:typescript@7.0.2", diff --git a/packages/schema/src/claws.test.ts b/packages/schema/src/claws.test.ts new file mode 100644 index 0000000000..e591ae0207 --- /dev/null +++ b/packages/schema/src/claws.test.ts @@ -0,0 +1,692 @@ +/* @vitest-environment node */ + +import { ArkErrors } from "arktype"; +import { describe, expect, it, vi } from "vitest"; +import { + CLAW_MANIFEST_VALIDATION_CODES, + ClawManifestSummarySchema, + OPENCLAW_CLAW_HOST_ENV_POLICY_V1, + summarizeClawManifest, + validateClawManifest, +} from "./claws"; +import { PackageFamilySchema, PackagePublishMetadataSchema } from "./packages"; + +const fixture = { + schemaVersion: 1, + agent: { id: "financial-analyst", name: "Financial Analyst" }, + workspace: { + bootstrapFiles: { "SOUL.md": { source: "workspace/SOUL.md" } }, + files: [{ source: "workspace/reference/policy.md", path: "reference/policy.md" }], + }, + packages: [ + { + kind: "skill", + source: "clawhub", + ref: "@openclaw/research", + version: "1.2.3", + }, + { + kind: "plugin", + source: "clawhub", + ref: "@openclaw/markets", + version: "2.0.0", + }, + ], + mcpServers: { + filings: { + url: "https://example.test/mcp", + transport: "streamable-http", + auth: "oauth", + }, + }, + cronJobs: [ + { + id: "morning-brief", + schedule: { cron: "0 8 * * 1-5", timezone: "America/New_York" }, + session: "isolated", + message: "Prepare the morning brief.", + }, + ], +} as const; + +describe("Claw manifest contract", () => { + it("allows Claws in storage contracts without opening generic publication", () => { + expect(PackageFamilySchema("claw")).toBe("claw"); + expect( + PackagePublishMetadataSchema({ + name: "@openclaw/financial-analyst", + family: "claw", + version: "1.0.0", + changelog: "Initial release", + }), + ).toBeInstanceOf(ArkErrors); + }); + + it("accepts the grouped OpenClaw v1 fixture and derives a safe summary", () => { + const result = validateClawManifest(fixture); + expect(result.ok).toBe(true); + if (!result.ok) return; + expect(summarizeClawManifest(result.manifest)).toEqual({ + schemaVersion: 1, + agent: { id: "financial-analyst", name: "Financial Analyst" }, + workspace: { bootstrapFiles: ["SOUL.md"], fileCount: 1 }, + packages: { skillCount: 1, pluginCount: 1 }, + mcpServerCount: 1, + cronJobCount: 1, + }); + }); + + it("does not schedule timers while validating cron syntax", () => { + vi.useFakeTimers(); + try { + expect(validateClawManifest(fixture).ok).toBe(true); + expect(vi.getTimerCount()).toBe(0); + } finally { + vi.useRealTimers(); + } + }); + + it("accepts opaque string metadata for namespaced harness profile pointers", () => { + const result = validateClawManifest({ + ...fixture, + metadata: { + "openclaw.config": "profiles/openclaw.yml", + "example.hint": "opaque-value", + }, + }); + + expect(result.ok).toBe(true); + if (!result.ok) return; + expect(result.manifest.metadata).toEqual({ + "openclaw.config": "profiles/openclaw.yml", + "example.hint": "opaque-value", + }); + }); + + it.each(["", " openclaw.config "])("rejects non-canonical metadata key %j", (metadataKey) => { + const result = validateClawManifest({ + ...fixture, + metadata: { [metadataKey]: "opaque-value" }, + }); + + expect(result.ok).toBe(false); + if (result.ok) return; + expect(result.issues.map((issue) => issue.path)).toContain(`$.metadata.${metadataKey}`); + }); + + it("rejects non-string metadata values and harness policy embedded in the portable agent", () => { + expect( + validateClawManifest({ + ...fixture, + metadata: { "openclaw.config": { path: "profiles/openclaw.yml" } }, + }).ok, + ).toBe(false); + + expect( + validateClawManifest({ + ...fixture, + agent: { + ...fixture.agent, + tools: { profile: "coding" }, + }, + }).ok, + ).toBe(false); + + expect( + validateClawManifest({ + ...fixture, + agent: { + ...fixture.agent, + memory: { search: { enabled: true } }, + }, + }).ok, + ).toBe(false); + }); + + it.each([ + "../openclaw.yml", + "/profiles/openclaw.yml", + "profiles/openclaw.json", + "profiles\\openclaw.yml", + ])("rejects unsafe or non-YAML OpenClaw profile pointer %s", (profilePath) => { + const result = validateClawManifest({ + ...fixture, + metadata: { "openclaw.config": profilePath }, + }); + + expect(result.ok).toBe(false); + }); + + it("fails closed on unknown fields", () => { + expect(validateClawManifest({ ...fixture, model: "gpt-5" }).ok).toBe(false); + }); + + it("returns stable v1 codes and schema phases for every rejection", () => { + const structural = validateClawManifest({ ...fixture, model: "gpt-5" }); + expect(structural.ok).toBe(false); + if (structural.ok) return; + expect(structural.issues).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + code: "claw_v1_invalid_manifest_shape", + phase: "schema", + path: "$.model", + }), + ]), + ); + + const semantic = validateClawManifest({ + ...fixture, + packages: [{ kind: "skill", source: "clawhub", ref: "demo", version: "latest" }], + }); + expect(semantic.ok).toBe(false); + if (semantic.ok) return; + expect(semantic.issues).toContainEqual({ + code: "claw_v1_invalid_package_version", + phase: "schema", + path: "$.packages.0.version", + message: "Must be an exact semantic version.", + }); + }); + + it("rejects traversal, floating versions, and inline MCP values", () => { + const result = validateClawManifest({ + ...fixture, + workspace: { files: [{ source: "../outside", path: "outside" }] }, + packages: [{ kind: "skill", source: "clawhub", ref: "demo", version: "latest" }], + mcpServers: { + unsafe: { command: "server", env: { SETTING: "inline-value" } }, + }, + }); + expect(result.ok).toBe(false); + if (result.ok) return; + expect(result.issues.map((issue) => issue.path)).toEqual( + expect.arrayContaining([ + "$.workspace.files.0.source", + "$.packages.0.version", + "$.mcpServers.unsafe.env.SETTING", + ]), + ); + }); + + it.each(["01.2.3", "1.2.3-.."])("rejects invalid semantic version %s", (version) => { + expect( + validateClawManifest({ + ...fixture, + packages: [{ kind: "skill", source: "clawhub", ref: "demo", version }], + }).ok, + ).toBe(false); + }); + + it("rejects malformed ClawHub package references", () => { + expect( + validateClawManifest({ + ...fixture, + packages: [ + { + kind: "skill", + source: "clawhub", + ref: "not a package", + version: "1.0.0", + }, + ], + }).ok, + ).toBe(false); + }); + + it("rejects non-portable and platform-equivalent workspace destinations", () => { + const invalidPath = validateClawManifest({ + ...fixture, + workspace: { + files: [{ source: "workspace/a\u0000b", path: "reference/a.md" }], + }, + }); + expect(invalidPath.ok).toBe(false); + + const collision = validateClawManifest({ + ...fixture, + workspace: { + files: [ + { source: "workspace/a.md", path: "reference/policy.md" }, + { source: "workspace/b.md", path: "REFERENCE\\policy.md" }, + ], + }, + }); + expect(collision.ok).toBe(false); + + const hierarchy = validateClawManifest({ + ...fixture, + workspace: { + files: [ + { source: "workspace/a.md", path: "reference" }, + { source: "workspace/b.md", path: "reference/policy.md" }, + ], + }, + }); + expect(hierarchy.ok).toBe(false); + }); + + it.each(["\u007f", "\u0085"])( + "rejects Unicode control character U+%s in package paths", + (controlCharacter) => { + expect( + validateClawManifest({ + ...fixture, + workspace: { + files: [{ source: `workspace/a${controlCharacter}.md`, path: "reference/a.md" }], + }, + }).ok, + ).toBe(false); + }, + ); + + it("rejects workspace destinations that collide after Unicode case folding", () => { + const result = validateClawManifest({ + ...fixture, + workspace: { + files: [ + { source: "workspace/a.md", path: "Straße.md" }, + { source: "workspace/b.md", path: "STRASSE.md" }, + ], + }, + }); + + expect(result.ok).toBe(false); + if (result.ok) return; + expect(result.issues.map((issue) => issue.path)).toContain("$.workspace.files.1.path"); + }); + + it("rejects credentials embedded in remote MCP URLs", () => { + const result = validateClawManifest({ + ...fixture, + mcpServers: { + filings: { + url: ["https://alice", "embedded@example.test/mcp"].join(":"), + transport: "streamable-http", + }, + }, + }); + expect(result.ok).toBe(false); + if (result.ok) return; + expect(result.issues).toContainEqual({ + code: CLAW_MANIFEST_VALIDATION_CODES.mcpUrlCredentials, + phase: "schema", + path: "$.mcpServers.filings.url", + message: "Must not contain embedded credentials or fragments.", + }); + }); + + it("rejects ambiguous MCP transport declarations structurally", () => { + const result = validateClawManifest({ + ...fixture, + mcpServers: { + unsafe: { command: "server", url: "https://example.test" }, + }, + }); + expect(result.ok).toBe(false); + if (result.ok) return; + expect(result.issues.map((issue) => issue.path)).toContain("$.mcpServers.unsafe"); + }); + + it("rejects infinite MCP timeouts", () => { + const result = validateClawManifest({ + ...fixture, + mcpServers: { + local: { command: "server", timeout: Number.POSITIVE_INFINITY }, + remote: { + url: "https://example.test/mcp", + transport: "streamable-http", + connectTimeout: Number.POSITIVE_INFINITY, + }, + }, + }); + expect(result.ok).toBe(false); + if (result.ok) return; + expect(result.issues.map((issue) => issue.path)).toEqual( + expect.arrayContaining(["$.mcpServers.local.timeout", "$.mcpServers.remote.connectTimeout"]), + ); + }); + + it("rejects empty portable names and MCP selector lists", () => { + const result = validateClawManifest({ + ...fixture, + agent: { + ...fixture.agent, + identity: { name: " " }, + }, + mcpServers: { + local: { + command: "server", + args: [""], + toolFilter: { include: [] }, + }, + }, + }); + expect(result.ok).toBe(false); + }); + + it("rejects invalid cron schedules and empty stdio commands", () => { + const result = validateClawManifest({ + ...fixture, + mcpServers: { empty: { command: " " } }, + cronJobs: [ + { + id: "broken", + schedule: { cron: "not-a-cron", timezone: "Not/AZone" }, + session: "isolated", + message: "Run.", + }, + ], + }); + expect(result.ok).toBe(false); + if (result.ok) return; + expect(result.issues.map((issue) => issue.path)).toEqual( + expect.arrayContaining(["$.mcpServers.empty.command", "$.cronJobs.0.schedule"]), + ); + }); + + it("allows one ClawHub coordinate under distinct package kinds", () => { + const result = validateClawManifest({ + ...fixture, + packages: [ + { kind: "skill", source: "clawhub", ref: "demo", version: "1.0.0" }, + { kind: "plugin", source: "clawhub", ref: "demo", version: "1.0.0" }, + ], + }); + expect(result.ok).toBe(true); + }); + + it("requires local avatars to be portable managed workspace files", () => { + expect( + validateClawManifest({ + ...fixture, + agent: { ...fixture.agent, identity: { avatar: "avatars/analyst.png" } }, + }).ok, + ).toBe(false); + + expect( + validateClawManifest({ + ...fixture, + agent: { ...fixture.agent, identity: { avatar: "avatars/analyst.png" } }, + workspace: { + ...fixture.workspace, + files: [ + ...fixture.workspace.files, + { source: "workspace/avatars/analyst.png", path: "avatars/analyst.png" }, + ], + }, + }).ok, + ).toBe(true); + + expect( + validateClawManifest({ + ...fixture, + agent: { ...fixture.agent, identity: { avatar: "https://example.test/avatar.png" } }, + }).ok, + ).toBe(false); + + expect( + validateClawManifest({ + ...fixture, + agent: { ...fixture.agent, identity: { avatar: "data:image/bmp;base64,AA==" } }, + }).ok, + ).toBe(true); + }); + + it("enforces portable MCP and cron declarations", () => { + const result = validateClawManifest({ + ...fixture, + mcpServers: { + floating: { + command: "npx", + args: ["mcp-server@latest"], + env: { "BAD-KEY": "${BAD_KEY}" }, + toolFilter: { include: ["search", "search"] }, + }, + remote: { + url: "http://example.test/mcp#token", + transport: "streamable-http", + }, + }, + cronJobs: [ + { + id: "brief", + schedule: { cron: "0 8 * * * *", timezone: "UTC" }, + session: "isolated", + message: "Prepare brief.", + delivery: { mode: "none", channel: "last" }, + }, + ], + }); + expect(result.ok).toBe(false); + if (result.ok) return; + expect(result.issues.map((issue) => issue.path)).toEqual( + expect.arrayContaining([ + "$.mcpServers.floating.args", + "$.mcpServers.floating.env.BAD-KEY", + "$.mcpServers.floating.toolFilter.include.1", + "$.mcpServers.remote.url", + "$.cronJobs.0.schedule", + "$.cronJobs.0.delivery", + ]), + ); + }); + + it("enforces the versioned OpenClaw spawned-process environment policy", () => { + expect(OPENCLAW_CLAW_HOST_ENV_POLICY_V1.blockedKeys).toContain("CPP"); + const blockedKeys = [ + ...OPENCLAW_CLAW_HOST_ENV_POLICY_V1.blockedKeys, + ...OPENCLAW_CLAW_HOST_ENV_POLICY_V1.blockedPrefixes.map( + (prefix) => `${prefix}CLAW_CONFORMANCE_TEST`, + ), + ]; + const result = validateClawManifest({ + ...fixture, + mcpServers: { + local: { + command: "server", + env: Object.fromEntries(blockedKeys.map((key) => [key, `\${${key}}`] as const)), + }, + }, + }); + + expect(result.ok).toBe(false); + if (result.ok) return; + const rejectedKeys = result.issues + .filter((issue) => issue.code === CLAW_MANIFEST_VALIDATION_CODES.blockedEnvironmentKey) + .map((issue) => issue.path.replace("$.mcpServers.local.env.", "")); + expect(new Set(rejectedKeys)).toEqual(new Set(blockedKeys)); + }); + + it("rejects any floating package selected by an MCP runner", () => { + expect( + validateClawManifest({ + ...fixture, + mcpServers: { + unsafe: { + command: "npx", + args: ["--package", "safe@1.0.0", "--package", "unsafe@latest", "server"], + }, + }, + }).ok, + ).toBe(false); + + for (const [command, args] of [ + ["npm", ["exec", "--yes", "unsafe@latest"]], + ["npm", ["x", "unsafe@latest"]], + ["bun", ["x", "unsafe@latest"]], + ] as const) { + expect( + validateClawManifest({ + ...fixture, + mcpServers: { unsafe: { command, args: [...args] } }, + }).ok, + ).toBe(false); + } + + expect( + validateClawManifest({ + ...fixture, + mcpServers: { safe: { command: "npm", args: ["exec", "safe@1.0.0"] } }, + }).ok, + ).toBe(true); + }); + + it("checks npm exec package selectors that follow the inferred command", () => { + const result = validateClawManifest({ + ...fixture, + mcpServers: { + unsafe: { + command: "npm", + args: ["exec", "safe@1.0.0", "--package=unsafe@latest"], + }, + }, + }); + + expect(result.ok).toBe(false); + if (result.ok) return; + expect(result.issues.map((issue) => issue.path)).toContain("$.mcpServers.unsafe.args"); + + expect( + validateClawManifest({ + ...fixture, + mcpServers: { + safe: { + command: "npm", + args: ["exec", "safe@1.0.0", "--", "--package=child-argument"], + }, + }, + }).ok, + ).toBe(true); + }); + + it.each([ + ["npx", ["--cache", "safe@1.0.0", "unsafe@latest"]], + ["npm", ["exec", "--cache", "safe@1.0.0", "unsafe@latest"]], + ] as const)("fails closed on unrecognized %s options before the package", (command, args) => { + expect( + validateClawManifest({ + ...fixture, + mcpServers: { unsafe: { command, args: [...args] } }, + }).ok, + ).toBe(false); + }); + + it.each([ + ["npm", ["run", "serve"]], + ["bun", ["run", "serve"]], + ["pnpm", ["run", "serve"]], + ["yarn", ["run", "serve"]], + ] as const)( + "does not classify non-download %s commands as package selectors", + (command, args) => { + expect( + validateClawManifest({ + ...fixture, + mcpServers: { local: { command, args: [...args] } }, + }).ok, + ).toBe(true); + }, + ); + + it("keeps public manifest summaries bounded", () => { + const result = validateClawManifest({ + ...fixture, + agent: { + ...fixture.agent, + name: "n".repeat(500), + description: "d".repeat(5_000), + }, + }); + expect(result.ok).toBe(true); + if (!result.ok) return; + const summary = summarizeClawManifest(result.manifest); + + expect(summary.agent.name).toHaveLength(128); + expect(summary.agent.description).toHaveLength(1_024); + expect(ClawManifestSummarySchema.allows(summary)).toBe(true); + expect( + ClawManifestSummarySchema.allows({ + ...summary, + agent: { ...summary.agent, description: "d".repeat(1_025) }, + }), + ).toBe(false); + }); + + it("does not treat child-process arguments as package-manager selectors", () => { + expect( + validateClawManifest({ + ...fixture, + mcpServers: { + safe: { + command: "npx", + args: ["--package", "safe@1.0.0", "server", "--package", "child-argument"], + }, + }, + }).ok, + ).toBe(true); + expect( + validateClawManifest({ + ...fixture, + mcpServers: { unsafe: { command: "npx", args: ["--", "unsafe@latest"] } }, + }).ok, + ).toBe(false); + }); + + it("rejects padded strict strings, unsupported tool globs, and dangerous env keys", () => { + const result = validateClawManifest({ + ...fixture, + agent: { ...fixture.agent, name: " Financial Analyst" }, + mcpServers: { + local: { + command: "node", + env: { + NODE_OPTIONS: "${NODE_OPTIONS}", + LD_PRELOAD: "${LD_PRELOAD}", + }, + toolFilter: { include: ["issue?", "issue[0-9]"] }, + }, + }, + }); + expect(result.ok).toBe(false); + if (result.ok) return; + expect(result.issues.map((issue) => issue.path)).toEqual( + expect.arrayContaining([ + "$.agent.name", + "$.mcpServers.local.env.NODE_OPTIONS", + "$.mcpServers.local.env.LD_PRELOAD", + "$.mcpServers.local.toolFilter.include.0", + "$.mcpServers.local.toolFilter.include.1", + ]), + ); + }); + + it("requires an explicit timezone and rejects host-relative cron sessions", () => { + expect( + validateClawManifest({ + ...fixture, + cronJobs: [ + { + id: "brief", + schedule: { cron: "0 8 * * *" }, + session: "isolated", + message: "Prepare brief.", + }, + ], + }).ok, + ).toBe(false); + expect( + validateClawManifest({ + ...fixture, + cronJobs: [ + { + id: "brief", + schedule: { cron: "0 8 * * *", timezone: "UTC" }, + session: "current", + message: "Prepare brief.", + }, + ], + }).ok, + ).toBe(false); + }); +}); diff --git a/packages/schema/src/claws.ts b/packages/schema/src/claws.ts new file mode 100644 index 0000000000..268ae296de --- /dev/null +++ b/packages/schema/src/claws.ts @@ -0,0 +1,904 @@ +import { ArkErrors, type BaseType, type inferred, type } from "arktype"; +import { Cron } from "croner"; +import { caseFold } from "unicode-case-folding"; + +export const CLAW_SCHEMA_VERSION = 1 as const; +export const CLAW_SUMMARY_AGENT_NAME_MAX_CHARS = 128; +export const CLAW_SUMMARY_AGENT_DESCRIPTION_MAX_CHARS = 1_024; +export const CLAW_BOOTSTRAP_FILE_NAMES = [ + "AGENTS.md", + "SOUL.md", + "IDENTITY.md", + "TOOLS.md", + "HEARTBEAT.md", +] as const; + +const StringArraySchema = type("string[]"); +const WorkspaceSourceSchema = type({ "+": "reject", source: "string" }); +const ToolFilterSchema = type({ + "+": "reject", + include: StringArraySchema.optional(), + exclude: StringArraySchema.optional(), +}); +const StdioMcpServerSchema = type({ + "+": "reject", + command: "string", + transport: '"stdio"?', + args: StringArraySchema.optional(), + env: type({ "[string]": "string" }).optional(), + toolFilter: ToolFilterSchema.optional(), + timeout: "number?", + connectTimeout: "number?", +}); +const RemoteMcpServerSchema = type({ + "+": "reject", + url: "string", + transport: '"sse"|"streamable-http"', + auth: '"oauth"?', + toolFilter: ToolFilterSchema.optional(), + timeout: "number?", + connectTimeout: "number?", +}); + +export const ClawManifestSchema = type({ + "+": "reject", + schemaVersion: "1", + agent: { + "+": "reject", + id: "string", + name: "string?", + description: "string?", + identity: type({ + "+": "reject", + name: "string?", + theme: "string?", + emoji: "string?", + avatar: "string?", + }).optional(), + }, + metadata: type({ "[string]": "string" }).optional(), + workspace: type({ + "+": "reject", + bootstrapFiles: type({ + "+": "reject", + "AGENTS.md": WorkspaceSourceSchema.optional(), + "SOUL.md": WorkspaceSourceSchema.optional(), + "IDENTITY.md": WorkspaceSourceSchema.optional(), + "TOOLS.md": WorkspaceSourceSchema.optional(), + "HEARTBEAT.md": WorkspaceSourceSchema.optional(), + }).optional(), + files: type({ "+": "reject", source: "string", path: "string" }).array().optional(), + }).optional(), + packages: type({ + "+": "reject", + kind: '"skill"|"plugin"', + source: '"clawhub"', + ref: "string", + version: "string", + }) + .array() + .optional(), + mcpServers: type({ + "[string]": StdioMcpServerSchema.or(RemoteMcpServerSchema), + }).optional(), + cronJobs: type({ + "+": "reject", + id: "string", + name: "string?", + schedule: { "+": "reject", cron: "string", timezone: "string" }, + session: '"main"|"isolated"', + message: "string", + delivery: type({ + "+": "reject", + mode: '"none"|"announce"', + channel: '"last"?', + }).optional(), + }) + .array() + .optional(), +}); +export type ClawManifest = (typeof ClawManifestSchema)[inferred]; + +export type ClawManifestSummary = { + schemaVersion: 1; + agent: { id: string; name?: string; description?: string }; + workspace: { bootstrapFiles: string[]; fileCount: number }; + packages: { skillCount: number; pluginCount: number }; + mcpServerCount: number; + cronJobCount: number; +}; + +export type ClawManifestSummarySchemaAdapter = { + literalOne: TValue; + string: TValue; + number: TValue; + stringArray: TValue; + boundedString: (maxCharacters: number) => TValue; + optional: (schema: TValue) => TOptional; + object: (fields: Record) => TValue; +}; + +/** Builds the v1 summary structure for both the public schema and durable storage validators. */ +export function createClawManifestSummarySchema( + adapter: ClawManifestSummarySchemaAdapter, +): TValue { + return adapter.object({ + schemaVersion: adapter.literalOne, + agent: adapter.object({ + id: adapter.string, + name: adapter.optional(adapter.boundedString(CLAW_SUMMARY_AGENT_NAME_MAX_CHARS)), + description: adapter.optional( + adapter.boundedString(CLAW_SUMMARY_AGENT_DESCRIPTION_MAX_CHARS), + ), + }), + workspace: adapter.object({ + bootstrapFiles: adapter.stringArray, + fileCount: adapter.number, + }), + packages: adapter.object({ + skillCount: adapter.number, + pluginCount: adapter.number, + }), + mcpServerCount: adapter.number, + cronJobCount: adapter.number, + }); +} + +export const ClawManifestSummarySchema = createClawManifestSummarySchema( + { + literalOne: type("1"), + string: type("string"), + number: type("number"), + stringArray: type("string[]"), + boundedString: (maxCharacters) => + type("string").narrow((value) => Array.from(value).length <= maxCharacters), + optional: (schema) => schema.optional(), + object: (fields) => type({ "+": "reject", ...fields }), + }, +) as BaseType; + +export const CLAW_MANIFEST_VALIDATION_PHASE = "schema" as const; +export const CLAW_MANIFEST_VALIDATION_CODES = { + invalidManifestShape: "claw_v1_invalid_manifest_shape", + invalidAgentId: "claw_v1_invalid_agent_id", + nonCanonicalString: "claw_v1_non_canonical_string", + emptyList: "claw_v1_empty_list", + invalidProfilePath: "claw_v1_invalid_profile_path", + unsafePath: "claw_v1_unsafe_path", + duplicateWorkspaceDestination: "claw_v1_duplicate_workspace_destination", + invalidAvatar: "claw_v1_invalid_avatar", + undeclaredAvatar: "claw_v1_undeclared_avatar", + invalidPackageReference: "claw_v1_invalid_package_reference", + invalidPackageVersion: "claw_v1_invalid_package_version", + duplicatePackage: "claw_v1_duplicate_package", + invalidMcpServerId: "claw_v1_invalid_mcp_server_id", + invalidMcpUrl: "claw_v1_invalid_mcp_url", + mcpUrlCredentials: "claw_v1_mcp_url_credentials", + unpinnedMcpPackage: "claw_v1_unpinned_mcp_package", + invalidToolFilter: "claw_v1_invalid_tool_filter", + duplicateToolFilter: "claw_v1_duplicate_tool_filter", + invalidEnvironmentKey: "claw_v1_invalid_environment_key", + blockedEnvironmentKey: "claw_v1_blocked_environment_key", + invalidEnvironmentReference: "claw_v1_invalid_environment_reference", + invalidTimeout: "claw_v1_invalid_timeout", + invalidCronJobId: "claw_v1_invalid_cron_job_id", + invalidCronSchedule: "claw_v1_invalid_cron_schedule", + invalidCronDelivery: "claw_v1_invalid_cron_delivery", + duplicateCronJob: "claw_v1_duplicate_cron_job", +} as const; +export type ClawManifestValidationCode = + (typeof CLAW_MANIFEST_VALIDATION_CODES)[keyof typeof CLAW_MANIFEST_VALIDATION_CODES]; +export type ClawManifestValidationIssue = { + code: ClawManifestValidationCode; + phase: typeof CLAW_MANIFEST_VALIDATION_PHASE; + path: string; + message: string; +}; + +const AGENT_ID_PATTERN = /^[a-z][a-z0-9_-]{0,63}$/; +const EXACT_VERSION_PATTERN = + /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[A-Za-z-][0-9A-Za-z-]*)(?:\.(?:0|[1-9]\d*|\d*[A-Za-z-][0-9A-Za-z-]*))*))?(?:\+([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?$/; +const ENV_REFERENCE_PATTERN = /^\$\{[A-Z_][A-Z0-9_]*\}$/; +const PACKAGE_NAME_PATTERN = /^(?:@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*$/; +const WINDOWS_INVALID_PATH_CHARS = /[<>:"|?*]/; +const WINDOWS_RESERVED_PATH_SEGMENT = /^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\..*)?$/i; +const UNICODE_CONTROL_CHARACTER = /\p{Cc}/u; +const AVATAR_MAX_BYTES = 2 * 1024 * 1024; +const AVATAR_MAX_DATA_URL_CHARS = 2_796_230; +const AVATAR_DATA_URL_PATTERN = /^data:image\/[^,]*,/i; +const AVATAR_EXTENSION_PATTERN = /\.(?:png|jpe?g|gif|webp|svg)$/i; +const BASE64_PAYLOAD_PATTERN = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/; +const PORTABLE_ENV_KEY_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/; +// Versioned compatibility artifact for the OpenClaw policy applied by the v1 consumer. +export const OPENCLAW_CLAW_HOST_ENV_POLICY_V1 = { + contractVersion: 1, + source: { + repository: "openclaw/openclaw", + commit: "f50a918af102b950721c1b380f7eb8af4e0389d1", + path: "src/infra/host-env-security-policy.json", + sha256: "4639dcfa157d4fa4c2fb84f8c5347ffe2252eb4ddb3d818afd7f87d68173b92b", + }, + blockedKeys: [ + "NODE_OPTIONS", + "NODE_PATH", + "NODE_REDIRECT_WARNINGS", + "NODE_REPL_EXTERNAL_MODULE", + "NODE_REPL_HISTORY", + "NODE_V8_COVERAGE", + "PYTHONHOME", + "PYTHONPATH", + "PERL5LIB", + "PERL5OPT", + "RUBYLIB", + "RUBYOPT", + "BASHOPTS", + "BASH_ENV", + "ENV", + "KSH_ENV", + "BROWSER", + "GIT_ALLOW_PROTOCOL", + "GIT_EDITOR", + "GIT_EXTERNAL_DIFF", + "GIT_DIR", + "GIT_WORK_TREE", + "GIT_COMMON_DIR", + "GIT_EXEC_PATH", + "GIT_INDEX_FILE", + "GIT_OBJECT_DIRECTORY", + "GIT_ALTERNATE_OBJECT_DIRECTORIES", + "GIT_NAMESPACE", + "GIT_PROTOCOL_FROM_USER", + "GIT_SEQUENCE_EDITOR", + "GIT_TEMPLATE_DIR", + "GIT_SSL_NO_VERIFY", + "GIT_SSL_CAINFO", + "GIT_SSL_CAPATH", + "CC", + "CPP", + "CXX", + "CARGO_BUILD_RUSTC", + "CARGO_BUILD_RUSTC_WRAPPER", + "CARGO_BUILD_RUSTC_WORKSPACE_WRAPPER", + "CARGO_BUILD_RUSTDOC", + "RUSTC", + "RUSTC_WRAPPER", + "RUSTC_WORKSPACE_WRAPPER", + "RUSTDOC", + "CMAKE_C_COMPILER", + "CMAKE_CXX_COMPILER", + "SHELL", + "SHELLOPTS", + "PS4", + "GCONV_PATH", + "IFS", + "SSLKEYLOGFILE", + "JAVA_OPTS", + "JAVA_TOOL_OPTIONS", + "_JAVA_OPTIONS", + "JDK_JAVA_OPTIONS", + "PYTHONBREAKPOINT", + "DOTNET_STARTUP_HOOKS", + "DOTNET_ADDITIONAL_DEPS", + "FPATH", + "GLIBC_TUNABLES", + "MAVEN_OPTS", + "MAKE", + "MAKEFLAGS", + "MFLAGS", + "SBT_OPTS", + "GRADLE_OPTS", + "ANT_OPTS", + "HGRCPATH", + "HGEDITOR", + "HGMERGE", + "EXINIT", + "VIMINIT", + "MYVIMRC", + "GVIMINIT", + "LUA_INIT", + "LUA_INIT_5_1", + "LUA_INIT_5_2", + "LUA_INIT_5_3", + "LUA_INIT_5_4", + "EMACSLOADPATH", + "RUBYSHELL", + "GIT_HOOK_PATH", + "SVN_EDITOR", + "SVN_SSH", + "BZR_EDITOR", + "BZR_SSH", + "BZR_PLUGIN_PATH", + "SUDO_ASKPASS", + "JULIA_EDITOR", + "CONFIG_SITE", + "CONFIG_SHELL", + "CMAKE_TOOLCHAIN_FILE", + "CATALINA_OPTS", + "CORECLR_PROFILER", + "HELM_PLUGINS", + "PACKER_PLUGIN_PATH", + "VAGRANT_VAGRANTFILE", + "ERL_AFLAGS", + "ERL_FLAGS", + "ERL_ZFLAGS", + "ELIXIR_ERL_OPTIONS", + "R_ENVIRON", + "R_PROFILE", + "R_ENVIRON_USER", + "R_PROFILE_USER", + "TCLLIBPATH", + "HOSTALIASES", + ], + blockedPrefixes: ["DYLD_", "LD_", "BASH_FUNC_"], +} as const; + +const BLOCKED_PROCESS_ENV_KEYS = new Set(OPENCLAW_CLAW_HOST_ENV_POLICY_V1.blockedKeys); +const BLOCKED_PROCESS_ENV_PREFIXES = OPENCLAW_CLAW_HOST_ENV_POLICY_V1.blockedPrefixes; + +function isStrictNonEmpty(value: string): boolean { + return value.length > 0 && value === value.trim(); +} + +function isBlockedProcessEnvKey(value: string): boolean { + const upper = value.toUpperCase(); + return ( + BLOCKED_PROCESS_ENV_KEYS.has(upper) || + BLOCKED_PROCESS_ENV_PREFIXES.some((prefix) => upper.startsWith(prefix)) + ); +} + +function isSafePackagePath(value: string): boolean { + const normalized = value.replaceAll("\\", "/"); + if ( + !isStrictNonEmpty(normalized) || + normalized.startsWith("/") || + /^[A-Za-z]:\//.test(normalized) + ) { + return false; + } + return normalized + .split("/") + .every( + (segment) => + segment !== "" && + segment !== "." && + segment !== ".." && + !WINDOWS_INVALID_PATH_CHARS.test(segment) && + !UNICODE_CONTROL_CHARACTER.test(segment) && + !segment.endsWith(".") && + !segment.endsWith(" ") && + !WINDOWS_RESERVED_PATH_SEGMENT.test(segment), + ); +} + +function portablePathKey(value: string): string { + return caseFold(value.replaceAll("\\", "/").normalize("NFC")); +} + +function isPortableAvatar(value: string): boolean { + if (AVATAR_DATA_URL_PATTERN.test(value)) { + if (value.length > AVATAR_MAX_DATA_URL_CHARS) return false; + const comma = value.indexOf(","); + if (comma < 0) return false; + const metadata = value.slice(0, comma); + const payload = value.slice(comma + 1); + try { + const base64 = /;base64(?:;|$)/i.test(metadata); + if (payload.length === 0 || (base64 && !BASE64_PAYLOAD_PATTERN.test(payload))) return false; + const byteLength = base64 + ? (payload.length / 4) * 3 - (payload.endsWith("==") ? 2 : payload.endsWith("=") ? 1 : 0) + : new TextEncoder().encode(decodeURIComponent(payload)).byteLength; + return byteLength > 0 && byteLength <= AVATAR_MAX_BYTES; + } catch { + return false; + } + } + return isSafePackagePath(value) && AVATAR_EXTENSION_PATTERN.test(value); +} + +function conflictsWithWorkspaceTarget(targets: Set, candidate: string): boolean { + for (const target of targets) { + if ( + target === candidate || + target.startsWith(`${candidate}/`) || + candidate.startsWith(`${target}/`) + ) { + return true; + } + } + return false; +} + +function packageManagerArtifacts(command: string, args: string[]): string[] | undefined { + const executable = command + .split(/[\\/]/) + .at(-1) + ?.replace(/\.(?:cmd|exe)$/i, "") + .toLowerCase(); + let start = 0; + let scansOptionsAfterPositional = false; + if (executable === "npm") { + if (args[0] !== "exec" && args[0] !== "x") return undefined; + start = 1; + scansOptionsAfterPositional = true; + } else if (executable === "bun") { + if (args[0] !== "x") return undefined; + start = 1; + } else if (executable === "pnpm" || executable === "yarn") { + if (args[0] !== "dlx") return undefined; + start = 1; + } else if (executable !== "npx" && executable !== "pnpx" && executable !== "bunx") { + return undefined; + } + const selected: string[] = []; + let positional: string | undefined; + for (let index = start; index < args.length; index += 1) { + const value = args[index]; + if (!value) continue; + if (value === "--") { + positional ??= args[index + 1] ?? ""; + break; + } + if (value === "-p" || value === "--package") { + selected.push(args[index + 1] ?? ""); + index += 1; + continue; + } + if (value.startsWith("--package=")) { + selected.push(value.slice("--package=".length)); + continue; + } + if (value === "-y" || value === "--yes") continue; + if (value.startsWith("-")) return [""]; + if (positional === undefined && !value.startsWith("-")) { + positional = value; + if (!scansOptionsAfterPositional) break; + } + } + return selected.length > 0 ? selected : [positional ?? ""]; +} + +function truncateSummaryText(value: string | undefined, maxChars: number): string | undefined { + if (!value) return undefined; + return Array.from(value).slice(0, maxChars).join(""); +} + +function isPackageManagerArtifactPinned(command: string, args: string[]): boolean | undefined { + const artifacts = packageManagerArtifacts(command, args); + if (artifacts === undefined) return undefined; + return artifacts.every((artifact) => { + const separator = artifact.lastIndexOf("@"); + const scopedSlash = artifact.startsWith("@") ? artifact.indexOf("/") : -1; + return ( + separator > 0 && + separator > scopedSlash && + EXACT_VERSION_PATTERN.test(artifact.slice(separator + 1)) + ); + }); +} + +function validationIssue( + code: ClawManifestValidationCode, + path: string, + message: string, +): ClawManifestValidationIssue { + return { code, phase: CLAW_MANIFEST_VALIDATION_PHASE, path, message }; +} + +function arkIssues(errors: ArkErrors): ClawManifestValidationIssue[] { + return Array.from(errors, (error) => + validationIssue( + CLAW_MANIFEST_VALIDATION_CODES.invalidManifestShape, + error.path.length > 0 ? `$.${error.path.join(".")}` : "$", + error.description ?? "Manifest must match the strict Claw v1 shape.", + ), + ); +} + +function pushNonEmpty( + issues: ClawManifestValidationIssue[], + path: string, + value: string | undefined, +): void { + if (value !== undefined && !isStrictNonEmpty(value)) { + issues.push( + validationIssue( + CLAW_MANIFEST_VALIDATION_CODES.nonCanonicalString, + path, + "Must be non-empty without leading or trailing whitespace.", + ), + ); + } +} + +function pushNonEmptyArray( + issues: ClawManifestValidationIssue[], + path: string, + values: string[] | undefined, + requireEntry: boolean, +): void { + if (requireEntry && values !== undefined && values.length === 0) { + issues.push( + validationIssue( + CLAW_MANIFEST_VALIDATION_CODES.emptyList, + path, + "Must contain at least one value.", + ), + ); + } + for (const [index, value] of (values ?? []).entries()) { + pushNonEmpty(issues, `${path}.${index}`, value); + } +} + +export function validateClawManifest( + value: unknown, +): { ok: true; manifest: ClawManifest } | { ok: false; issues: ClawManifestValidationIssue[] } { + const parsed = ClawManifestSchema(value); + if (parsed instanceof ArkErrors) return { ok: false, issues: arkIssues(parsed) }; + + const issues: ClawManifestValidationIssue[] = []; + if (!AGENT_ID_PATTERN.test(parsed.agent.id)) { + issues.push( + validationIssue( + CLAW_MANIFEST_VALIDATION_CODES.invalidAgentId, + "$.agent.id", + "Invalid portable agent id.", + ), + ); + } + pushNonEmpty(issues, "$.agent.name", parsed.agent.name); + pushNonEmpty(issues, "$.agent.description", parsed.agent.description); + for (const field of ["name", "theme", "emoji", "avatar"] as const) { + pushNonEmpty(issues, `$.agent.identity.${field}`, parsed.agent.identity?.[field]); + } + for (const key of Object.keys(parsed.metadata ?? {})) { + pushNonEmpty(issues, `$.metadata.${key}`, key); + } + const openClawProfilePath = parsed.metadata?.["openclaw.config"]; + if ( + openClawProfilePath !== undefined && + (openClawProfilePath.includes("\\") || + !isSafePackagePath(openClawProfilePath) || + !/\.ya?ml$/i.test(openClawProfilePath)) + ) { + issues.push( + validationIssue( + CLAW_MANIFEST_VALIDATION_CODES.invalidProfilePath, + "$.metadata.openclaw.config", + "Must reference a forward-slash package-relative .yml or .yaml file.", + ), + ); + } + const workspaceTargets = new Set(); + for (const name of CLAW_BOOTSTRAP_FILE_NAMES) { + const source = parsed.workspace?.bootstrapFiles?.[name]?.source; + if (source === undefined) continue; + if (!isSafePackagePath(source)) { + issues.push( + validationIssue( + CLAW_MANIFEST_VALIDATION_CODES.unsafePath, + `$.workspace.bootstrapFiles.${name}.source`, + "Must be a safe package-relative path.", + ), + ); + } + workspaceTargets.add(portablePathKey(name)); + } + for (const [index, file] of (parsed.workspace?.files ?? []).entries()) { + if (!isSafePackagePath(file.source)) { + issues.push( + validationIssue( + CLAW_MANIFEST_VALIDATION_CODES.unsafePath, + `$.workspace.files.${index}.source`, + "Must be a safe package-relative path.", + ), + ); + } + if (!isSafePackagePath(file.path)) { + issues.push( + validationIssue( + CLAW_MANIFEST_VALIDATION_CODES.unsafePath, + `$.workspace.files.${index}.path`, + "Must be a safe package-relative path.", + ), + ); + } + const destinationKey = portablePathKey(file.path); + if (conflictsWithWorkspaceTarget(workspaceTargets, destinationKey)) { + issues.push( + validationIssue( + CLAW_MANIFEST_VALIDATION_CODES.duplicateWorkspaceDestination, + `$.workspace.files.${index}.path`, + "Workspace destination is declared more than once.", + ), + ); + } + workspaceTargets.add(destinationKey); + } + const avatar = parsed.agent.identity?.avatar; + if (avatar !== undefined) { + if (!isPortableAvatar(avatar)) { + issues.push( + validationIssue( + CLAW_MANIFEST_VALIDATION_CODES.invalidAvatar, + "$.agent.identity.avatar", + "Must be a bounded image data URL or managed workspace-relative image path.", + ), + ); + } else if ( + !AVATAR_DATA_URL_PATTERN.test(avatar) && + !workspaceTargets.has(portablePathKey(avatar)) + ) { + issues.push( + validationIssue( + CLAW_MANIFEST_VALIDATION_CODES.undeclaredAvatar, + "$.agent.identity.avatar", + "Workspace-relative avatar must match a workspace.files destination.", + ), + ); + } + } + + const packageKeys = new Set(); + for (const [index, pkg] of (parsed.packages ?? []).entries()) { + pushNonEmpty(issues, `$.packages.${index}.ref`, pkg.ref); + if (!PACKAGE_NAME_PATTERN.test(pkg.ref)) { + issues.push( + validationIssue( + CLAW_MANIFEST_VALIDATION_CODES.invalidPackageReference, + `$.packages.${index}.ref`, + "Must be a lowercase ClawHub package name.", + ), + ); + } + if (!EXACT_VERSION_PATTERN.test(pkg.version)) { + issues.push( + validationIssue( + CLAW_MANIFEST_VALIDATION_CODES.invalidPackageVersion, + `$.packages.${index}.version`, + "Must be an exact semantic version.", + ), + ); + } + const key = `${pkg.kind}:${pkg.source}:${pkg.ref.toLowerCase()}`; + if (packageKeys.has(key)) { + issues.push( + validationIssue( + CLAW_MANIFEST_VALIDATION_CODES.duplicatePackage, + `$.packages.${index}`, + "Package is declared more than once.", + ), + ); + } + packageKeys.add(key); + } + + for (const [name, server] of Object.entries(parsed.mcpServers ?? {})) { + if (!AGENT_ID_PATTERN.test(name)) { + issues.push( + validationIssue( + CLAW_MANIFEST_VALIDATION_CODES.invalidMcpServerId, + `$.mcpServers.${name}`, + "Invalid MCP server name.", + ), + ); + } + if ("url" in server) { + pushNonEmpty(issues, `$.mcpServers.${name}.url`, server.url); + try { + const url = new URL(server.url); + const loopback = ["localhost", "127.0.0.1", "[::1]"].includes(url.hostname); + if (url.protocol !== "https:" && !(url.protocol === "http:" && loopback)) { + throw new Error("protocol"); + } + if (url.username || url.password || url.hash) { + issues.push( + validationIssue( + CLAW_MANIFEST_VALIDATION_CODES.mcpUrlCredentials, + `$.mcpServers.${name}.url`, + "Must not contain embedded credentials or fragments.", + ), + ); + } + } catch { + issues.push( + validationIssue( + CLAW_MANIFEST_VALIDATION_CODES.invalidMcpUrl, + `$.mcpServers.${name}.url`, + "Must use HTTPS, except HTTP on an exact loopback host.", + ), + ); + } + } + if ("command" in server) { + pushNonEmpty(issues, `$.mcpServers.${name}.command`, server.command); + pushNonEmptyArray(issues, `$.mcpServers.${name}.args`, server.args, false); + if (isPackageManagerArtifactPinned(server.command, server.args ?? []) === false) { + issues.push( + validationIssue( + CLAW_MANIFEST_VALIDATION_CODES.unpinnedMcpPackage, + `$.mcpServers.${name}.args`, + "Package-manager MCP commands must select one exact immutable package version.", + ), + ); + } + } + pushNonEmptyArray( + issues, + `$.mcpServers.${name}.toolFilter.include`, + server.toolFilter?.include, + true, + ); + pushNonEmptyArray( + issues, + `$.mcpServers.${name}.toolFilter.exclude`, + server.toolFilter?.exclude, + true, + ); + for (const field of ["include", "exclude"] as const) { + const seen = new Set(); + for (const [index, entry] of (server.toolFilter?.[field] ?? []).entries()) { + if (entry.includes("?") || entry.includes("[") || entry.includes("]")) { + issues.push( + validationIssue( + CLAW_MANIFEST_VALIDATION_CODES.invalidToolFilter, + `$.mcpServers.${name}.toolFilter.${field}.${index}`, + "Tool filters support only exact names and * wildcards.", + ), + ); + } + if (seen.has(entry)) { + issues.push( + validationIssue( + CLAW_MANIFEST_VALIDATION_CODES.duplicateToolFilter, + `$.mcpServers.${name}.toolFilter.${field}.${index}`, + "Tool filter entries must be unique.", + ), + ); + } + seen.add(entry); + } + } + if ("env" in server) { + for (const [key, envValue] of Object.entries(server.env ?? {})) { + pushNonEmpty(issues, `$.mcpServers.${name}.env`, key); + if (!PORTABLE_ENV_KEY_PATTERN.test(key)) { + issues.push( + validationIssue( + CLAW_MANIFEST_VALIDATION_CODES.invalidEnvironmentKey, + `$.mcpServers.${name}.env.${key}`, + "Invalid portable environment key.", + ), + ); + } + if (isBlockedProcessEnvKey(key)) { + issues.push( + validationIssue( + CLAW_MANIFEST_VALIDATION_CODES.blockedEnvironmentKey, + `$.mcpServers.${name}.env.${key}`, + "Environment key is blocked by the spawned-process safety policy.", + ), + ); + } + if (!ENV_REFERENCE_PATTERN.test(envValue)) { + issues.push( + validationIssue( + CLAW_MANIFEST_VALIDATION_CODES.invalidEnvironmentReference, + `$.mcpServers.${name}.env.${key}`, + "Must be an unresolved ${ENV_VAR} reference.", + ), + ); + } + } + } + if (server.timeout !== undefined && (!Number.isFinite(server.timeout) || server.timeout <= 0)) { + issues.push( + validationIssue( + CLAW_MANIFEST_VALIDATION_CODES.invalidTimeout, + `$.mcpServers.${name}.timeout`, + "Must be positive.", + ), + ); + } + if ( + server.connectTimeout !== undefined && + (!Number.isFinite(server.connectTimeout) || server.connectTimeout <= 0) + ) { + issues.push( + validationIssue( + CLAW_MANIFEST_VALIDATION_CODES.invalidTimeout, + `$.mcpServers.${name}.connectTimeout`, + "Must be positive.", + ), + ); + } + } + + const cronIds = new Set(); + for (const [index, job] of (parsed.cronJobs ?? []).entries()) { + if (!AGENT_ID_PATTERN.test(job.id)) { + issues.push( + validationIssue( + CLAW_MANIFEST_VALIDATION_CODES.invalidCronJobId, + `$.cronJobs.${index}.id`, + "Invalid cron job id.", + ), + ); + } + pushNonEmpty(issues, `$.cronJobs.${index}.name`, job.name); + pushNonEmpty(issues, `$.cronJobs.${index}.schedule.cron`, job.schedule.cron); + pushNonEmpty(issues, `$.cronJobs.${index}.schedule.timezone`, job.schedule.timezone); + pushNonEmpty(issues, `$.cronJobs.${index}.message`, job.message); + try { + if (job.schedule.cron.trim().split(/\s+/).length !== 5) throw new Error("fields"); + const cron = new Cron(job.schedule.cron.trim(), { + timezone: job.schedule.timezone.trim(), + catch: false, + paused: true, + }); + if (!cron.nextRun(new Date())) throw new Error("No future run"); + } catch { + issues.push( + validationIssue( + CLAW_MANIFEST_VALIDATION_CODES.invalidCronSchedule, + `$.cronJobs.${index}.schedule`, + "Must contain a valid cron expression and timezone.", + ), + ); + } + if ( + (job.delivery?.mode === "none" && job.delivery.channel !== undefined) || + (job.delivery?.mode === "announce" && job.delivery.channel !== "last") + ) { + issues.push( + validationIssue( + CLAW_MANIFEST_VALIDATION_CODES.invalidCronDelivery, + `$.cronJobs.${index}.delivery`, + 'Must be { mode: "none" } or { mode: "announce", channel: "last" }.', + ), + ); + } + if (cronIds.has(job.id)) { + issues.push( + validationIssue( + CLAW_MANIFEST_VALIDATION_CODES.duplicateCronJob, + `$.cronJobs.${index}.id`, + "Cron job id is declared more than once.", + ), + ); + } + cronIds.add(job.id); + } + + return issues.length > 0 ? { ok: false, issues } : { ok: true, manifest: parsed }; +} + +export function summarizeClawManifest(manifest: ClawManifest): ClawManifestSummary { + const packages = manifest.packages ?? []; + const agentName = truncateSummaryText(manifest.agent.name, CLAW_SUMMARY_AGENT_NAME_MAX_CHARS); + const agentDescription = truncateSummaryText( + manifest.agent.description, + CLAW_SUMMARY_AGENT_DESCRIPTION_MAX_CHARS, + ); + return { + schemaVersion: CLAW_SCHEMA_VERSION, + agent: { + id: manifest.agent.id, + ...(agentName ? { name: agentName } : {}), + ...(agentDescription ? { description: agentDescription } : {}), + }, + workspace: { + bootstrapFiles: CLAW_BOOTSTRAP_FILE_NAMES.filter( + (name) => manifest.workspace?.bootstrapFiles?.[name] !== undefined, + ), + fileCount: manifest.workspace?.files?.length ?? 0, + }, + packages: { + skillCount: packages.filter((pkg) => pkg.kind === "skill").length, + pluginCount: packages.filter((pkg) => pkg.kind === "plugin").length, + }, + mcpServerCount: Object.keys(manifest.mcpServers ?? {}).length, + cronJobCount: manifest.cronJobs?.length ?? 0, + }; +} diff --git a/packages/schema/src/index.ts b/packages/schema/src/index.ts index 099df5383b..d03a08a7d4 100644 --- a/packages/schema/src/index.ts +++ b/packages/schema/src/index.ts @@ -1,5 +1,6 @@ export type { ArkValidator } from "./ark.js"; export { formatArkErrors, parseArk } from "./ark.js"; +export * from "./claws.js"; export * from "./catalogFeed.js"; export * from "./catalogMetadata.js"; export * from "./docsLinks.js"; diff --git a/packages/schema/src/packages.ts b/packages/schema/src/packages.ts index adc8960db9..13e838df05 100644 --- a/packages/schema/src/packages.ts +++ b/packages/schema/src/packages.ts @@ -26,9 +26,13 @@ export function getPackageScopeOwnerMismatch(name: string, ownerHandle: string | }; } -export const PackageFamilySchema = type('"skill"|"code-plugin"|"bundle-plugin"'); +export const PackageFamilySchema = type('"skill"|"code-plugin"|"bundle-plugin"|"claw"'); export type PackageFamily = (typeof PackageFamilySchema)[inferred]; +// Publication stays narrower until a family has a complete validation path. +export const PackagePublishFamilySchema = type('"skill"|"code-plugin"|"bundle-plugin"'); +export type PackagePublishFamily = (typeof PackagePublishFamilySchema)[inferred]; + export const PackageChannelSchema = type('"official"|"community"|"private"'); export type PackageChannel = (typeof PackageChannelSchema)[inferred]; @@ -347,7 +351,7 @@ const PackagePublishMetadataFields = { name: "string", displayName: "string?", ownerHandle: "string?", - family: PackageFamilySchema, + family: PackagePublishFamilySchema, version: "string", changelog: "string", manualOverrideReason: "string?", diff --git a/specs/claws.md b/specs/claws.md new file mode 100644 index 0000000000..ea8634f1a6 --- /dev/null +++ b/specs/claws.md @@ -0,0 +1,70 @@ +# Experimental Claw packages + +ClawHub's Claw support implements the registry side of +[OpenClaw RFC #27](https://github.com/openclaw/rfcs/pull/27) plus the experimental +portable-core addendum in [RFC #48](https://github.com/openclaw/rfcs/pull/48). A +Claw package describes one complete new agent using the grouped `CLAW.md` +schema. ClawHub owns publication, ownership, discovery, package detail APIs, +and hosted feed export. OpenClaw remains authoritative for local planning, +consent, mutation, provenance, update, and removal. + +The YAML frontmatter is the portable manifest. The `CLAW.md` body remains +documentation-only in the current contract and may be empty; it does not imply +or replace any managed workspace file. + +The portable agent object carries only identity and purpose. Harness-specific +settings live in package-local profiles addressed through opaque string +metadata. OpenClaw recognizes `metadata.openclaw.config`; export conventionally +uses `profiles/openclaw.yml`, but the pointer is normative and authors may use +another safe package-relative YAML path. + +That profile exists only inside the Claw package. It is validated during +publication and application, participates in package integrity, and is never +copied into ordinary OpenClaw configuration. Other harnesses may ignore +OpenClaw's namespaced key or define their own profile-pointer contract. + +## Experimental contract + +- Backend Claw publication and read surfaces require + `CLAWHUB_EXPERIMENTAL_CLAWS=1`. +- The gate is not user consent and must not bypass validation, moderation, + ownership, or scanner checks. +- Disabled deployments must not accept Claw publication or expose Claws through + Claw-specific discovery surfaces. +- Public Claw schemas and APIs may change while the gate is required. Removing + the gate requires a separate compatibility and migration decision. + +## Staged implementation + +1. Add the shared grouped manifest contract, safe summary, and storage model. +2. Add feature-gated authenticated publication, validation, and authoring docs. +3. Add feature-gated search, detail, and API surfaces. +4. Add hosted feed export and a published-package end-to-end proof through + OpenClaw `claws add --dry-run`. + +The publish schema intentionally remains narrower than the storage family in +the first slice. This prevents existing generic package endpoints from +accepting Claws before their dedicated validation and gate are in place. + +The shared validator follows the RFC's strict v1 contract: strings are not +trimmed into validity, MCP package selectors must resolve exact versions, +process environment keys follow OpenClaw's host-wide safety policy, and tool +filters accept only exact names plus `*` wildcards. Registry validation must +not accept a declaration that the applying OpenClaw client rejects. + +`OPENCLAW_CLAW_HOST_ENV_POLICY_V1` is the versioned cross-repository +compatibility artifact for that environment policy. It records the exact +OpenClaw source path, consumer commit, and source-file SHA-256; ClawHub derives +its blocked-key lookups from the artifact and runs every key/prefix as a +conformance vector. A policy change requires a new reviewed artifact version or +an intentional update of the existing experimental v1 contract. + +Manifest rejections expose stable `claw_v1_*` diagnostic codes with phase +`schema`, plus the field path and human-readable message. Consumers may branch +on the code and phase; messages are explanatory text rather than identifiers. + +The durable version document stores only the bounded manifest summary. Its +field structure is built from `createClawManifestSummarySchema` in both the +public ArkType contract and the Convex storage validator. Convex cannot express +the summary text-length caps, so publication must validate or derive summaries +through the shared schema before storage. diff --git a/src/lib/packageLabels.test.ts b/src/lib/packageLabels.test.ts index 856c96dc55..3454f87ce9 100644 --- a/src/lib/packageLabels.test.ts +++ b/src/lib/packageLabels.test.ts @@ -10,4 +10,8 @@ describe("packageLabels", () => { expect(familyLabel("code-plugin")).toBe("Code Plugin"); expect(familyLabel("bundle-plugin")).toBe("Bundle Plugin"); }); + + it("labels experimental Claw packages", () => { + expect(familyLabel("claw")).toBe("Claw"); + }); }); diff --git a/src/lib/packageLabels.ts b/src/lib/packageLabels.ts index b85467df36..92b75e197c 100644 --- a/src/lib/packageLabels.ts +++ b/src/lib/packageLabels.ts @@ -6,6 +6,8 @@ export function familyLabel(family: PackageFamily) { return "Code Plugin"; case "bundle-plugin": return "Bundle Plugin"; + case "claw": + return "Claw"; default: return "Skill"; }