@cogineai/clawpacker 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +373 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +22 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/export.d.ts +11 -0
- package/dist/commands/export.js +48 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/import.d.ts +10 -0
- package/dist/commands/import.js +51 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/inspect.d.ts +10 -0
- package/dist/commands/inspect.js +80 -0
- package/dist/commands/inspect.js.map +1 -0
- package/dist/commands/validate.d.ts +9 -0
- package/dist/commands/validate.js +29 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/core/agent-extract.d.ts +5 -0
- package/dist/core/agent-extract.js +51 -0
- package/dist/core/agent-extract.js.map +1 -0
- package/dist/core/checksums.d.ts +2 -0
- package/dist/core/checksums.js +14 -0
- package/dist/core/checksums.js.map +1 -0
- package/dist/core/constants.d.ts +9 -0
- package/dist/core/constants.js +27 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/import-exec.d.ts +5 -0
- package/dist/core/import-exec.js +56 -0
- package/dist/core/import-exec.js.map +1 -0
- package/dist/core/import-plan.d.ts +8 -0
- package/dist/core/import-plan.js +91 -0
- package/dist/core/import-plan.js.map +1 -0
- package/dist/core/manifest.d.ts +24 -0
- package/dist/core/manifest.js +59 -0
- package/dist/core/manifest.js.map +1 -0
- package/dist/core/openclaw-config.d.ts +46 -0
- package/dist/core/openclaw-config.js +127 -0
- package/dist/core/openclaw-config.js.map +1 -0
- package/dist/core/package-read.d.ts +2 -0
- package/dist/core/package-read.js +64 -0
- package/dist/core/package-read.js.map +1 -0
- package/dist/core/package-write.d.ts +8 -0
- package/dist/core/package-write.js +59 -0
- package/dist/core/package-write.js.map +1 -0
- package/dist/core/skills-detect.d.ts +2 -0
- package/dist/core/skills-detect.js +43 -0
- package/dist/core/skills-detect.js.map +1 -0
- package/dist/core/types.d.ts +151 -0
- package/dist/core/types.js +3 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/validate.d.ts +6 -0
- package/dist/core/validate.js +89 -0
- package/dist/core/validate.js.map +1 -0
- package/dist/core/workspace-scan.d.ts +2 -0
- package/dist/core/workspace-scan.js +57 -0
- package/dist/core/workspace-scan.js.map +1 -0
- package/dist/utils/json.d.ts +2 -0
- package/dist/utils/json.js +12 -0
- package/dist/utils/json.js.map +1 -0
- package/package.json +33 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.runValidate = runValidate;
|
|
7
|
+
exports.registerValidateCommand = registerValidateCommand;
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
const validate_1 = require("../core/validate");
|
|
10
|
+
async function runValidate(options) {
|
|
11
|
+
if (!options.targetWorkspace) {
|
|
12
|
+
throw new Error('validate requires --target-workspace <path>');
|
|
13
|
+
}
|
|
14
|
+
const report = await (0, validate_1.validateImportedWorkspace)({
|
|
15
|
+
targetWorkspacePath: node_path_1.default.resolve(options.targetWorkspace),
|
|
16
|
+
agentId: options.agentId,
|
|
17
|
+
targetConfigPath: options.config ? node_path_1.default.resolve(options.config) : undefined,
|
|
18
|
+
});
|
|
19
|
+
console.log(JSON.stringify(report, null, 2));
|
|
20
|
+
}
|
|
21
|
+
function registerValidateCommand(command) {
|
|
22
|
+
command
|
|
23
|
+
.description('Validate an imported workspace and optional config wiring.')
|
|
24
|
+
.requiredOption('--target-workspace <path>', 'Imported target workspace path')
|
|
25
|
+
.option('--agent-id <id>', 'Expected target agent id')
|
|
26
|
+
.option('--config <path>', 'Target OpenClaw config path for consistency checks')
|
|
27
|
+
.action(runValidate);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":";;;;;AAUA,kCAYC;AAED,0DAOC;AA/BD,0DAA6B;AAE7B,+CAA6D;AAQtD,KAAK,UAAU,WAAW,CAAC,OAAwB;IACxD,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,IAAA,oCAAyB,EAAC;QAC7C,mBAAmB,EAAE,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC;QAC1D,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,gBAAgB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;KAC5E,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,SAAgB,uBAAuB,CAAC,OAAgB;IACtD,OAAO;SACJ,WAAW,CAAC,4DAA4D,CAAC;SACzE,cAAc,CAAC,2BAA2B,EAAE,gCAAgC,CAAC;SAC7E,MAAM,CAAC,iBAAiB,EAAE,0BAA0B,CAAC;SACrD,MAAM,CAAC,iBAAiB,EAAE,oDAAoD,CAAC;SAC/E,MAAM,CAAC,WAAW,CAAC,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.extractAgentDefinition = extractAgentDefinition;
|
|
7
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
8
|
+
const openclaw_config_1 = require("./openclaw-config");
|
|
9
|
+
async function extractAgentDefinition(workspacePath, options = {}) {
|
|
10
|
+
try {
|
|
11
|
+
const loaded = await (0, openclaw_config_1.loadOpenClawConfig)({ configPath: options.configPath, cwd: workspacePath });
|
|
12
|
+
return (0, openclaw_config_1.extractPortableAgentDefinition)({
|
|
13
|
+
config: loaded.config,
|
|
14
|
+
configPath: loaded.configPath,
|
|
15
|
+
workspacePath,
|
|
16
|
+
agentId: options.agentId,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
const basename = node_path_1.default.basename(workspacePath);
|
|
21
|
+
const suggestedId = basename.replace(/^workspace-/, '');
|
|
22
|
+
const suggestedName = toTitleCase(suggestedId.replace(/-/g, ' '));
|
|
23
|
+
return {
|
|
24
|
+
agent: {
|
|
25
|
+
suggestedId,
|
|
26
|
+
suggestedName,
|
|
27
|
+
workspace: {
|
|
28
|
+
suggestedBasename: basename,
|
|
29
|
+
},
|
|
30
|
+
identity: {
|
|
31
|
+
name: suggestedName,
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
fieldClassification: {
|
|
35
|
+
'agent.suggestedId': 'requiresInputOnImport',
|
|
36
|
+
'agent.suggestedName': 'portable',
|
|
37
|
+
'agent.workspace.suggestedBasename': 'requiresInputOnImport',
|
|
38
|
+
'agent.identity.name': 'portable',
|
|
39
|
+
},
|
|
40
|
+
notes: ['Conservative placeholder agent definition generated from workspace basename.'],
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function toTitleCase(value) {
|
|
45
|
+
return value
|
|
46
|
+
.split(/\s+/)
|
|
47
|
+
.filter(Boolean)
|
|
48
|
+
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
|
49
|
+
.join(' ');
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=agent-extract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-extract.js","sourceRoot":"","sources":["../../src/core/agent-extract.ts"],"names":[],"mappings":";;;;;AAIA,wDAkCC;AAtCD,0DAA6B;AAE7B,uDAAuF;AAEhF,KAAK,UAAU,sBAAsB,CAAC,aAAqB,EAAE,UAAqD,EAAE;IACzH,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAA,oCAAkB,EAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,CAAC;QAChG,OAAO,IAAA,gDAA8B,EAAC;YACpC,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,aAAa;YACb,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,QAAQ,GAAG,mBAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QAC9C,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;QACxD,MAAM,aAAa,GAAG,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;QAElE,OAAO;YACL,KAAK,EAAE;gBACL,WAAW;gBACX,aAAa;gBACb,SAAS,EAAE;oBACT,iBAAiB,EAAE,QAAQ;iBAC5B;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,aAAa;iBACpB;aACF;YACD,mBAAmB,EAAE;gBACnB,mBAAmB,EAAE,uBAAuB;gBAC5C,qBAAqB,EAAE,UAAU;gBACjC,mCAAmC,EAAE,uBAAuB;gBAC5D,qBAAqB,EAAE,UAAU;aAClC;YACD,KAAK,EAAE,CAAC,8EAA8E,CAAC;SACxF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,KAAK;SACT,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3D,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.checksumFile = checksumFile;
|
|
4
|
+
exports.checksumText = checksumText;
|
|
5
|
+
const node_crypto_1 = require("node:crypto");
|
|
6
|
+
const promises_1 = require("node:fs/promises");
|
|
7
|
+
async function checksumFile(filePath) {
|
|
8
|
+
const content = await (0, promises_1.readFile)(filePath);
|
|
9
|
+
return (0, node_crypto_1.createHash)('sha256').update(content).digest('hex');
|
|
10
|
+
}
|
|
11
|
+
function checksumText(content) {
|
|
12
|
+
return (0, node_crypto_1.createHash)('sha256').update(content).digest('hex');
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=checksums.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checksums.js","sourceRoot":"","sources":["../../src/core/checksums.ts"],"names":[],"mappings":";;AAGA,oCAGC;AAED,oCAEC;AAVD,6CAAyC;AACzC,+CAA4C;AAErC,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,MAAM,OAAO,GAAG,MAAM,IAAA,mBAAQ,EAAC,QAAQ,CAAC,CAAC;IACzC,OAAO,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED,SAAgB,YAAY,CAAC,OAAe;IAC1C,OAAO,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const PACKAGE_FORMAT_VERSION = 1;
|
|
2
|
+
export declare const PACKAGE_TYPE = "openclaw-agent-template";
|
|
3
|
+
export declare const EXPORT_MODE = "template";
|
|
4
|
+
export declare const REQUIRED_WORKSPACE_FILES: readonly ["AGENTS.md", "SOUL.md", "IDENTITY.md", "USER.md", "TOOLS.md", "MEMORY.md"];
|
|
5
|
+
export declare const OPTIONAL_WORKSPACE_FILES: readonly ["HEARTBEAT.md"];
|
|
6
|
+
export declare const ALLOWED_WORKSPACE_FILES: readonly ["AGENTS.md", "SOUL.md", "IDENTITY.md", "USER.md", "TOOLS.md", "MEMORY.md", "HEARTBEAT.md"];
|
|
7
|
+
export declare const DEFAULT_EXCLUDED_GLOBS: string[];
|
|
8
|
+
export declare const SKILLS_MODE: "manifest-only";
|
|
9
|
+
export declare const SKILL_REFERENCE_PATTERNS: RegExp[];
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SKILL_REFERENCE_PATTERNS = exports.SKILLS_MODE = exports.DEFAULT_EXCLUDED_GLOBS = exports.ALLOWED_WORKSPACE_FILES = exports.OPTIONAL_WORKSPACE_FILES = exports.REQUIRED_WORKSPACE_FILES = exports.EXPORT_MODE = exports.PACKAGE_TYPE = exports.PACKAGE_FORMAT_VERSION = void 0;
|
|
4
|
+
exports.PACKAGE_FORMAT_VERSION = 1;
|
|
5
|
+
exports.PACKAGE_TYPE = 'openclaw-agent-template';
|
|
6
|
+
exports.EXPORT_MODE = 'template';
|
|
7
|
+
exports.REQUIRED_WORKSPACE_FILES = [
|
|
8
|
+
'AGENTS.md',
|
|
9
|
+
'SOUL.md',
|
|
10
|
+
'IDENTITY.md',
|
|
11
|
+
'USER.md',
|
|
12
|
+
'TOOLS.md',
|
|
13
|
+
'MEMORY.md',
|
|
14
|
+
];
|
|
15
|
+
exports.OPTIONAL_WORKSPACE_FILES = ['HEARTBEAT.md'];
|
|
16
|
+
exports.ALLOWED_WORKSPACE_FILES = [
|
|
17
|
+
...exports.REQUIRED_WORKSPACE_FILES,
|
|
18
|
+
...exports.OPTIONAL_WORKSPACE_FILES,
|
|
19
|
+
];
|
|
20
|
+
exports.DEFAULT_EXCLUDED_GLOBS = ['memory/*.md'];
|
|
21
|
+
exports.SKILLS_MODE = 'manifest-only';
|
|
22
|
+
exports.SKILL_REFERENCE_PATTERNS = [
|
|
23
|
+
/\b(?:use|using|install|activate|invok(?:e|ing)|requires?)\s+(?:the\s+)?(?:skill\s+)?`?([a-z0-9][a-z0-9-]*)`?/gi,
|
|
24
|
+
/skills?\/[A-Za-z0-9._-]+\/([a-z0-9][a-z0-9-]*)\b/gi,
|
|
25
|
+
/<name>([a-z0-9][a-z0-9-]*)<\/name>/gi,
|
|
26
|
+
];
|
|
27
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/core/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,sBAAsB,GAAG,CAAC,CAAC;AAC3B,QAAA,YAAY,GAAG,yBAAyB,CAAC;AACzC,QAAA,WAAW,GAAG,UAAU,CAAC;AAEzB,QAAA,wBAAwB,GAAG;IACtC,WAAW;IACX,SAAS;IACT,aAAa;IACb,SAAS;IACT,UAAU;IACV,WAAW;CACH,CAAC;AAEE,QAAA,wBAAwB,GAAG,CAAC,cAAc,CAAU,CAAC;AAErD,QAAA,uBAAuB,GAAG;IACrC,GAAG,gCAAwB;IAC3B,GAAG,gCAAwB;CACnB,CAAC;AAEE,QAAA,sBAAsB,GAAG,CAAC,aAAa,CAAC,CAAC;AAEzC,QAAA,WAAW,GAAG,eAAwB,CAAC;AAEvC,QAAA,wBAAwB,GAAG;IACtC,gHAAgH;IAChH,oDAAoD;IACpD,sCAAsC;CACvC,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.executeImport = executeImport;
|
|
7
|
+
const promises_1 = require("node:fs/promises");
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
const json_1 = require("../utils/json");
|
|
10
|
+
const openclaw_config_1 = require("./openclaw-config");
|
|
11
|
+
async function executeImport(params) {
|
|
12
|
+
if (!params.plan.canProceed) {
|
|
13
|
+
throw new Error(`Import plan cannot proceed: ${params.plan.failed.concat(params.plan.requiredInputs.map((item) => item.key)).join(', ')}`);
|
|
14
|
+
}
|
|
15
|
+
if (params.plan.writePlan.overwriteExisting) {
|
|
16
|
+
await (0, promises_1.rm)(params.plan.writePlan.targetWorkspacePath, { recursive: true, force: true });
|
|
17
|
+
}
|
|
18
|
+
await (0, promises_1.mkdir)(params.plan.writePlan.targetWorkspacePath, { recursive: true });
|
|
19
|
+
for (const file of params.plan.writePlan.workspaceFiles) {
|
|
20
|
+
await (0, promises_1.mkdir)(node_path_1.default.dirname(file.targetPath), { recursive: true });
|
|
21
|
+
await (0, promises_1.cp)(file.sourcePath, file.targetPath);
|
|
22
|
+
}
|
|
23
|
+
await (0, promises_1.mkdir)(params.plan.writePlan.metadataDirectory, { recursive: true });
|
|
24
|
+
const agentRecordPath = node_path_1.default.join(params.plan.writePlan.metadataDirectory, 'agent-definition.json');
|
|
25
|
+
const importRecordPath = node_path_1.default.join(params.plan.writePlan.metadataDirectory, 'import-result.json');
|
|
26
|
+
const configFiles = [];
|
|
27
|
+
if (params.plan.writePlan.targetConfigPath) {
|
|
28
|
+
await (0, openclaw_config_1.upsertPortableAgentDefinition)({
|
|
29
|
+
configPath: params.plan.writePlan.targetConfigPath,
|
|
30
|
+
portableAgentDefinition: params.pkg.agentDefinition,
|
|
31
|
+
targetAgentId: params.plan.writePlan.targetAgentId,
|
|
32
|
+
targetWorkspacePath: params.plan.writePlan.targetWorkspacePath,
|
|
33
|
+
force: params.plan.writePlan.overwriteExisting,
|
|
34
|
+
});
|
|
35
|
+
configFiles.push(params.plan.writePlan.targetConfigPath);
|
|
36
|
+
}
|
|
37
|
+
await (0, json_1.writeJsonFile)(agentRecordPath, {
|
|
38
|
+
agentId: params.plan.writePlan.targetAgentId,
|
|
39
|
+
importedFromPackage: params.pkg.manifest.name,
|
|
40
|
+
packageType: params.pkg.manifest.packageType,
|
|
41
|
+
portableAgentDefinition: params.pkg.agentDefinition,
|
|
42
|
+
persistedToConfig: params.plan.writePlan.targetConfigPath ?? null,
|
|
43
|
+
});
|
|
44
|
+
const result = {
|
|
45
|
+
status: 'ok',
|
|
46
|
+
importedFiles: params.plan.writePlan.workspaceFiles.map((file) => file.relativePath),
|
|
47
|
+
metadataFiles: [agentRecordPath, importRecordPath, ...configFiles],
|
|
48
|
+
warnings: params.plan.warnings,
|
|
49
|
+
nextSteps: params.plan.nextSteps,
|
|
50
|
+
targetWorkspacePath: params.plan.writePlan.targetWorkspacePath,
|
|
51
|
+
agentId: params.plan.writePlan.targetAgentId,
|
|
52
|
+
};
|
|
53
|
+
await (0, json_1.writeJsonFile)(importRecordPath, result);
|
|
54
|
+
return result;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=import-exec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-exec.js","sourceRoot":"","sources":["../../src/core/import-exec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ImportPlan, ReadPackageResult } from './types';
|
|
2
|
+
export declare function planImport(params: {
|
|
3
|
+
pkg: ReadPackageResult;
|
|
4
|
+
targetWorkspacePath?: string;
|
|
5
|
+
targetAgentId?: string;
|
|
6
|
+
targetConfigPath?: string;
|
|
7
|
+
force?: boolean;
|
|
8
|
+
}): Promise<ImportPlan>;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.planImport = planImport;
|
|
7
|
+
const promises_1 = require("node:fs/promises");
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
const openclaw_config_1 = require("./openclaw-config");
|
|
10
|
+
async function planImport(params) {
|
|
11
|
+
const requiredInputs = [];
|
|
12
|
+
const failed = [];
|
|
13
|
+
const warnings = [...params.pkg.importHints.warnings];
|
|
14
|
+
const nextSteps = [
|
|
15
|
+
'Channel bindings are not restored automatically in v1.',
|
|
16
|
+
'Review the imported identity and memory files before using the agent.',
|
|
17
|
+
];
|
|
18
|
+
if (!params.targetWorkspacePath) {
|
|
19
|
+
requiredInputs.push({ key: 'targetWorkspacePath', reason: 'A target workspace path is required for import.' });
|
|
20
|
+
}
|
|
21
|
+
if (!params.targetAgentId) {
|
|
22
|
+
requiredInputs.push({ key: 'agentId', reason: 'Choose a target agent id for the imported definition.' });
|
|
23
|
+
}
|
|
24
|
+
const targetWorkspacePath = node_path_1.default.resolve(params.targetWorkspacePath ?? params.pkg.agentDefinition.agent.workspace.suggestedBasename);
|
|
25
|
+
const targetAgentId = params.targetAgentId ?? params.pkg.agentDefinition.agent.suggestedId;
|
|
26
|
+
const workspaceExists = await pathExists(targetWorkspacePath);
|
|
27
|
+
if (workspaceExists && !params.force) {
|
|
28
|
+
failed.push(`Target workspace already exists: ${targetWorkspacePath}`);
|
|
29
|
+
nextSteps.push('Choose a different --target-workspace path or re-run with --force to overwrite the existing workspace.');
|
|
30
|
+
}
|
|
31
|
+
else if (workspaceExists) {
|
|
32
|
+
warnings.push(`Target workspace exists and will be overwritten because --force was provided: ${targetWorkspacePath}`);
|
|
33
|
+
}
|
|
34
|
+
let configAgentCollision = false;
|
|
35
|
+
if (!params.targetConfigPath) {
|
|
36
|
+
warnings.push('OpenClaw config not found; agent definition will only be recorded in local import metadata.');
|
|
37
|
+
}
|
|
38
|
+
else if (await pathExists(params.targetConfigPath)) {
|
|
39
|
+
const { config } = await (0, openclaw_config_1.loadOpenClawConfig)({ configPath: params.targetConfigPath });
|
|
40
|
+
if (config.agents?.[targetAgentId]) {
|
|
41
|
+
configAgentCollision = true;
|
|
42
|
+
if (!params.force) {
|
|
43
|
+
failed.push(`Target agent already exists in OpenClaw config: ${targetAgentId}`);
|
|
44
|
+
nextSteps.push('Choose a different --agent-id or re-run with --force to update the existing OpenClaw config entry.');
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
warnings.push(`OpenClaw config already contains agent ${targetAgentId}; it will be overwritten because --force was provided.`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
warnings.push(`Target OpenClaw config does not exist yet and will be created during import: ${params.targetConfigPath}`);
|
|
53
|
+
}
|
|
54
|
+
const metadataDirectory = node_path_1.default.join(targetWorkspacePath, '.openclaw-agent-package');
|
|
55
|
+
const writePlan = {
|
|
56
|
+
workspaceFiles: params.pkg.workspaceFiles.map((file) => ({
|
|
57
|
+
sourcePath: file.absolutePath,
|
|
58
|
+
targetPath: node_path_1.default.join(targetWorkspacePath, file.relativePath),
|
|
59
|
+
relativePath: file.relativePath,
|
|
60
|
+
})),
|
|
61
|
+
overwriteExisting: Boolean(params.force),
|
|
62
|
+
targetWorkspacePath,
|
|
63
|
+
targetAgentId,
|
|
64
|
+
metadataDirectory,
|
|
65
|
+
targetConfigPath: params.targetConfigPath,
|
|
66
|
+
summary: {
|
|
67
|
+
fileCount: params.pkg.workspaceFiles.length,
|
|
68
|
+
existingWorkspaceDetected: workspaceExists,
|
|
69
|
+
targetConfigDetected: Boolean(params.targetConfigPath),
|
|
70
|
+
configAgentCollision,
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
return {
|
|
74
|
+
canProceed: requiredInputs.length === 0 && failed.length === 0,
|
|
75
|
+
requiredInputs,
|
|
76
|
+
warnings,
|
|
77
|
+
failed,
|
|
78
|
+
nextSteps,
|
|
79
|
+
writePlan,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
async function pathExists(targetPath) {
|
|
83
|
+
try {
|
|
84
|
+
await (0, promises_1.access)(targetPath);
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=import-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-plan.js","sourceRoot":"","sources":["../../src/core/import-plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AgentDefinition, ExportArtifacts, ExportReport, PackageManifest, SkillsManifest, WorkspaceScanResult } from './types';
|
|
2
|
+
export declare function buildManifest(params: {
|
|
3
|
+
packageName: string;
|
|
4
|
+
workspacePath: string;
|
|
5
|
+
scan: WorkspaceScanResult;
|
|
6
|
+
skills: SkillsManifest;
|
|
7
|
+
agentDefinition: AgentDefinition;
|
|
8
|
+
}): PackageManifest;
|
|
9
|
+
export declare function buildExportReport(params: {
|
|
10
|
+
packageName: string;
|
|
11
|
+
workspacePath: string;
|
|
12
|
+
scan: WorkspaceScanResult;
|
|
13
|
+
skills: SkillsManifest;
|
|
14
|
+
warnings?: string[];
|
|
15
|
+
}): ExportReport;
|
|
16
|
+
export declare function buildExportArtifacts(params: {
|
|
17
|
+
packageName: string;
|
|
18
|
+
workspacePath: string;
|
|
19
|
+
scan: WorkspaceScanResult;
|
|
20
|
+
skills: SkillsManifest;
|
|
21
|
+
agentDefinition: AgentDefinition;
|
|
22
|
+
checksums: Record<string, string>;
|
|
23
|
+
warnings?: string[];
|
|
24
|
+
}): ExportArtifacts;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.buildManifest = buildManifest;
|
|
7
|
+
exports.buildExportReport = buildExportReport;
|
|
8
|
+
exports.buildExportArtifacts = buildExportArtifacts;
|
|
9
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
10
|
+
const constants_1 = require("./constants");
|
|
11
|
+
function buildManifest(params) {
|
|
12
|
+
const workspaceName = node_path_1.default.basename(params.workspacePath);
|
|
13
|
+
return {
|
|
14
|
+
formatVersion: constants_1.PACKAGE_FORMAT_VERSION,
|
|
15
|
+
packageType: constants_1.PACKAGE_TYPE,
|
|
16
|
+
name: params.packageName,
|
|
17
|
+
exportMode: constants_1.EXPORT_MODE,
|
|
18
|
+
source: {
|
|
19
|
+
agentId: params.agentDefinition.agent.suggestedId,
|
|
20
|
+
workspaceName,
|
|
21
|
+
openclawVersion: 'unknown',
|
|
22
|
+
},
|
|
23
|
+
includes: {
|
|
24
|
+
workspaceFiles: params.scan.includedFiles.map((file) => file.relativePath),
|
|
25
|
+
dailyMemory: false,
|
|
26
|
+
skills: constants_1.SKILLS_MODE,
|
|
27
|
+
agentDefinition: true,
|
|
28
|
+
},
|
|
29
|
+
excludes: {
|
|
30
|
+
secrets: true,
|
|
31
|
+
sessionState: true,
|
|
32
|
+
channelBindings: true,
|
|
33
|
+
globalExtensions: true,
|
|
34
|
+
},
|
|
35
|
+
compatibility: {
|
|
36
|
+
minFormatVersion: constants_1.PACKAGE_FORMAT_VERSION,
|
|
37
|
+
notes: params.skills.notes,
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function buildExportReport(params) {
|
|
42
|
+
return {
|
|
43
|
+
packageName: params.packageName,
|
|
44
|
+
workspacePath: params.workspacePath,
|
|
45
|
+
includedFiles: params.scan.includedFiles.map((file) => file.relativePath),
|
|
46
|
+
excludedFiles: params.scan.excludedFiles,
|
|
47
|
+
ignoredFiles: params.scan.ignoredFiles,
|
|
48
|
+
warnings: params.warnings ?? [],
|
|
49
|
+
skills: params.skills,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function buildExportArtifacts(params) {
|
|
53
|
+
return {
|
|
54
|
+
manifest: buildManifest(params),
|
|
55
|
+
checksums: params.checksums,
|
|
56
|
+
exportReport: buildExportReport(params),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/core/manifest.ts"],"names":[],"mappings":";;;;;AAIA,sCAmCC;AAED,8CAgBC;AAED,oDAcC;AAzED,0DAA6B;AAC7B,2CAA6F;AAG7F,SAAgB,aAAa,CAAC,MAM7B;IACC,MAAM,aAAa,GAAG,mBAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAC1D,OAAO;QACL,aAAa,EAAE,kCAAsB;QACrC,WAAW,EAAE,wBAAY;QACzB,IAAI,EAAE,MAAM,CAAC,WAAW;QACxB,UAAU,EAAE,uBAAW;QACvB,MAAM,EAAE;YACN,OAAO,EAAE,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW;YACjD,aAAa;YACb,eAAe,EAAE,SAAS;SAC3B;QACD,QAAQ,EAAE;YACR,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC;YAC1E,WAAW,EAAE,KAAK;YAClB,MAAM,EAAE,uBAAW;YACnB,eAAe,EAAE,IAAI;SACtB;QACD,QAAQ,EAAE;YACR,OAAO,EAAE,IAAI;YACb,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,IAAI;YACrB,gBAAgB,EAAE,IAAI;SACvB;QACD,aAAa,EAAE;YACb,gBAAgB,EAAE,kCAAsB;YACxC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK;SAC3B;KACF,CAAC;AACJ,CAAC;AAED,SAAgB,iBAAiB,CAAC,MAMjC;IACC,OAAO;QACL,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC;QACzE,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa;QACxC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY;QACtC,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE;QAC/B,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC;AACJ,CAAC;AAED,SAAgB,oBAAoB,CAAC,MAQpC;IACC,OAAO;QACL,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC;QAC/B,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,YAAY,EAAE,iBAAiB,CAAC,MAAM,CAAC;KACxC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { AgentDefinition } from './types';
|
|
2
|
+
export interface MinimalOpenClawConfig {
|
|
3
|
+
agents?: Record<string, {
|
|
4
|
+
id?: string;
|
|
5
|
+
name?: string;
|
|
6
|
+
workspace?: string;
|
|
7
|
+
identity?: {
|
|
8
|
+
name?: string;
|
|
9
|
+
};
|
|
10
|
+
model?: {
|
|
11
|
+
default?: string;
|
|
12
|
+
};
|
|
13
|
+
[key: string]: unknown;
|
|
14
|
+
}>;
|
|
15
|
+
[key: string]: unknown;
|
|
16
|
+
}
|
|
17
|
+
export declare function discoverOpenClawConfig(params?: {
|
|
18
|
+
configPath?: string;
|
|
19
|
+
cwd?: string;
|
|
20
|
+
}): Promise<{
|
|
21
|
+
configPath: string;
|
|
22
|
+
}>;
|
|
23
|
+
export declare function loadOpenClawConfig(params: {
|
|
24
|
+
configPath?: string;
|
|
25
|
+
cwd?: string;
|
|
26
|
+
}): Promise<{
|
|
27
|
+
configPath: string;
|
|
28
|
+
config: MinimalOpenClawConfig;
|
|
29
|
+
}>;
|
|
30
|
+
export declare function extractPortableAgentDefinition(params: {
|
|
31
|
+
config: MinimalOpenClawConfig;
|
|
32
|
+
configPath: string;
|
|
33
|
+
workspacePath: string;
|
|
34
|
+
agentId?: string;
|
|
35
|
+
}): AgentDefinition;
|
|
36
|
+
export declare function upsertPortableAgentDefinition(params: {
|
|
37
|
+
configPath: string;
|
|
38
|
+
portableAgentDefinition: AgentDefinition;
|
|
39
|
+
targetAgentId: string;
|
|
40
|
+
targetWorkspacePath: string;
|
|
41
|
+
force?: boolean;
|
|
42
|
+
}): Promise<{
|
|
43
|
+
configPath: string;
|
|
44
|
+
created: boolean;
|
|
45
|
+
updated: boolean;
|
|
46
|
+
}>;
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.discoverOpenClawConfig = discoverOpenClawConfig;
|
|
7
|
+
exports.loadOpenClawConfig = loadOpenClawConfig;
|
|
8
|
+
exports.extractPortableAgentDefinition = extractPortableAgentDefinition;
|
|
9
|
+
exports.upsertPortableAgentDefinition = upsertPortableAgentDefinition;
|
|
10
|
+
const promises_1 = require("node:fs/promises");
|
|
11
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
12
|
+
const promises_2 = require("node:fs/promises");
|
|
13
|
+
async function discoverOpenClawConfig(params = {}) {
|
|
14
|
+
const candidates = params.configPath
|
|
15
|
+
? [node_path_1.default.resolve(params.configPath)]
|
|
16
|
+
: [
|
|
17
|
+
node_path_1.default.resolve(params.cwd ?? process.cwd(), 'openclaw-config.json'),
|
|
18
|
+
node_path_1.default.resolve(params.cwd ?? process.cwd(), 'openclaw-config.jsonc'),
|
|
19
|
+
node_path_1.default.resolve(process.env.HOME ?? '~', '.openclaw', 'config.json'),
|
|
20
|
+
node_path_1.default.resolve(process.env.HOME ?? '~', '.openclaw', 'config.jsonc'),
|
|
21
|
+
];
|
|
22
|
+
for (const candidate of candidates) {
|
|
23
|
+
try {
|
|
24
|
+
await (0, promises_1.access)(candidate);
|
|
25
|
+
return { configPath: candidate };
|
|
26
|
+
}
|
|
27
|
+
catch { }
|
|
28
|
+
}
|
|
29
|
+
throw new Error(`OpenClaw config not found. Checked: ${candidates.join(', ')}`);
|
|
30
|
+
}
|
|
31
|
+
async function loadOpenClawConfig(params) {
|
|
32
|
+
const discovered = await discoverOpenClawConfig(params);
|
|
33
|
+
const raw = await (0, promises_2.readFile)(discovered.configPath, 'utf8');
|
|
34
|
+
return {
|
|
35
|
+
configPath: discovered.configPath,
|
|
36
|
+
config: parseJsonc(raw),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function extractPortableAgentDefinition(params) {
|
|
40
|
+
const workspaceBasename = node_path_1.default.basename(params.workspacePath);
|
|
41
|
+
const fallbackId = workspaceBasename.replace(/^workspace-/, '');
|
|
42
|
+
const selectedAgentId = params.agentId ?? findAgentIdByWorkspace(params.config, params.workspacePath) ?? fallbackId;
|
|
43
|
+
const sourceAgent = params.config.agents?.[selectedAgentId];
|
|
44
|
+
if (!sourceAgent) {
|
|
45
|
+
throw new Error(`Agent not found in OpenClaw config: ${selectedAgentId}`);
|
|
46
|
+
}
|
|
47
|
+
const suggestedName = sourceAgent.name ?? sourceAgent.identity?.name ?? toTitleCase(selectedAgentId.replace(/-/g, ' '));
|
|
48
|
+
const identityName = sourceAgent.identity?.name ?? suggestedName;
|
|
49
|
+
return {
|
|
50
|
+
agent: {
|
|
51
|
+
suggestedId: selectedAgentId,
|
|
52
|
+
suggestedName,
|
|
53
|
+
workspace: {
|
|
54
|
+
suggestedBasename: workspaceBasename,
|
|
55
|
+
},
|
|
56
|
+
identity: {
|
|
57
|
+
name: identityName,
|
|
58
|
+
},
|
|
59
|
+
model: sourceAgent.model?.default ? { default: sourceAgent.model.default } : undefined,
|
|
60
|
+
},
|
|
61
|
+
fieldClassification: {
|
|
62
|
+
'agent.suggestedId': 'requiresInputOnImport',
|
|
63
|
+
'agent.suggestedName': 'portable',
|
|
64
|
+
'agent.workspace.suggestedBasename': 'requiresInputOnImport',
|
|
65
|
+
'agent.identity.name': 'portable',
|
|
66
|
+
...(sourceAgent.model?.default ? { 'agent.model.default': 'portable' } : {}),
|
|
67
|
+
'agent.channelBindings': 'excluded',
|
|
68
|
+
'agent.secrets': 'excluded',
|
|
69
|
+
},
|
|
70
|
+
notes: [`Portable agent definition derived from OpenClaw config at ${params.configPath}.`],
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
async function upsertPortableAgentDefinition(params) {
|
|
74
|
+
const resolvedPath = node_path_1.default.resolve(params.configPath);
|
|
75
|
+
let config = {};
|
|
76
|
+
let existed = false;
|
|
77
|
+
try {
|
|
78
|
+
const raw = await (0, promises_2.readFile)(resolvedPath, 'utf8');
|
|
79
|
+
config = parseJsonc(raw);
|
|
80
|
+
existed = true;
|
|
81
|
+
}
|
|
82
|
+
catch { }
|
|
83
|
+
config.agents ??= {};
|
|
84
|
+
if (config.agents[params.targetAgentId] && !params.force) {
|
|
85
|
+
throw new Error(`Target agent already exists in OpenClaw config: ${params.targetAgentId}`);
|
|
86
|
+
}
|
|
87
|
+
config.agents[params.targetAgentId] = {
|
|
88
|
+
id: params.targetAgentId,
|
|
89
|
+
name: params.portableAgentDefinition.agent.suggestedName,
|
|
90
|
+
workspace: params.targetWorkspacePath,
|
|
91
|
+
identity: {
|
|
92
|
+
name: params.portableAgentDefinition.agent.identity.name,
|
|
93
|
+
},
|
|
94
|
+
...(params.portableAgentDefinition.agent.model?.default
|
|
95
|
+
? {
|
|
96
|
+
model: {
|
|
97
|
+
default: params.portableAgentDefinition.agent.model.default,
|
|
98
|
+
},
|
|
99
|
+
}
|
|
100
|
+
: {}),
|
|
101
|
+
};
|
|
102
|
+
await (0, promises_1.mkdir)(node_path_1.default.dirname(resolvedPath), { recursive: true });
|
|
103
|
+
await (0, promises_2.writeFile)(resolvedPath, `${JSON.stringify(config, null, 2)}\n`, 'utf8');
|
|
104
|
+
return { configPath: resolvedPath, created: !existed, updated: existed };
|
|
105
|
+
}
|
|
106
|
+
function parseJsonc(value) {
|
|
107
|
+
const withoutComments = value
|
|
108
|
+
.replace(/^\s*\/\/.*$/gm, '')
|
|
109
|
+
.replace(/\/\*[\s\S]*?\*\//g, '');
|
|
110
|
+
return JSON.parse(withoutComments);
|
|
111
|
+
}
|
|
112
|
+
function findAgentIdByWorkspace(config, workspacePath) {
|
|
113
|
+
for (const [agentId, agent] of Object.entries(config.agents ?? {})) {
|
|
114
|
+
if (agent.workspace && node_path_1.default.basename(agent.workspace) === node_path_1.default.basename(workspacePath)) {
|
|
115
|
+
return agentId;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
function toTitleCase(value) {
|
|
121
|
+
return value
|
|
122
|
+
.split(/\s+/)
|
|
123
|
+
.filter(Boolean)
|
|
124
|
+
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
|
125
|
+
.join(' ');
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=openclaw-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw-config.js","sourceRoot":"","sources":["../../src/core/openclaw-config.ts"],"names":[],"mappings":";;;;;AAqBA,wDAkBC;AAED,gDAOC;AAED,wEAyCC;AAED,sEA0CC;AAvID,+CAAiD;AACjD,0DAA6B;AAE7B,+CAAuD;AAkBhD,KAAK,UAAU,sBAAsB,CAAC,SAAgD,EAAE;IAC7F,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU;QAClC,CAAC,CAAC,CAAC,mBAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACnC,CAAC,CAAC;YACE,mBAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,sBAAsB,CAAC;YACjE,mBAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,uBAAuB,CAAC;YAClE,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,WAAW,EAAE,aAAa,CAAC;YACjE,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,WAAW,EAAE,cAAc,CAAC;SACnE,CAAC;IAEN,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,IAAA,iBAAM,EAAC,SAAS,CAAC,CAAC;YACxB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,uCAAuC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAClF,CAAC;AAEM,KAAK,UAAU,kBAAkB,CAAC,MAA6C;IACpF,MAAM,UAAU,GAAG,MAAM,sBAAsB,CAAC,MAAM,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG,MAAM,IAAA,mBAAQ,EAAC,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC1D,OAAO;QACL,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,MAAM,EAAE,UAAU,CAAC,GAAG,CAA0B;KACjD,CAAC;AACJ,CAAC;AAED,SAAgB,8BAA8B,CAAC,MAK9C;IACC,MAAM,iBAAiB,GAAG,mBAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAC9D,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IAChE,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,IAAI,sBAAsB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,aAAa,CAAC,IAAI,UAAU,CAAC;IACpH,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,eAAe,CAAC,CAAC;IAE5D,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,uCAAuC,eAAe,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,aAAa,GAAG,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,QAAQ,EAAE,IAAI,IAAI,WAAW,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IACxH,MAAM,YAAY,GAAG,WAAW,CAAC,QAAQ,EAAE,IAAI,IAAI,aAAa,CAAC;IAEjE,OAAO;QACL,KAAK,EAAE;YACL,WAAW,EAAE,eAAe;YAC5B,aAAa;YACb,SAAS,EAAE;gBACT,iBAAiB,EAAE,iBAAiB;aACrC;YACD,QAAQ,EAAE;gBACR,IAAI,EAAE,YAAY;aACnB;YACD,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS;SACvF;QACD,mBAAmB,EAAE;YACnB,mBAAmB,EAAE,uBAAuB;YAC5C,qBAAqB,EAAE,UAAU;YACjC,mCAAmC,EAAE,uBAAuB;YAC5D,qBAAqB,EAAE,UAAU;YACjC,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5E,uBAAuB,EAAE,UAAU;YACnC,eAAe,EAAE,UAAU;SAC5B;QACD,KAAK,EAAE,CAAC,6DAA6D,MAAM,CAAC,UAAU,GAAG,CAAC;KAC3F,CAAC;AACJ,CAAC;AAEM,KAAK,UAAU,6BAA6B,CAAC,MAMnD;IACC,MAAM,YAAY,GAAG,mBAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACrD,IAAI,MAAM,GAA0B,EAAE,CAAC;IACvC,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,IAAA,mBAAQ,EAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACjD,MAAM,GAAG,UAAU,CAAC,GAAG,CAA0B,CAAC;QAClD,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,MAAM,CAAC,MAAM,KAAK,EAAE,CAAC;IACrB,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,mDAAmD,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;IAC7F,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG;QACpC,EAAE,EAAE,MAAM,CAAC,aAAa;QACxB,IAAI,EAAE,MAAM,CAAC,uBAAuB,CAAC,KAAK,CAAC,aAAa;QACxD,SAAS,EAAE,MAAM,CAAC,mBAAmB;QACrC,QAAQ,EAAE;YACR,IAAI,EAAE,MAAM,CAAC,uBAAuB,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI;SACzD;QACD,GAAG,CAAC,MAAM,CAAC,uBAAuB,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO;YACrD,CAAC,CAAC;gBACE,KAAK,EAAE;oBACL,OAAO,EAAE,MAAM,CAAC,uBAAuB,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO;iBAC5D;aACF;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;IAEF,MAAM,IAAA,gBAAK,EAAC,mBAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,MAAM,IAAA,oBAAS,EAAC,YAAY,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAE9E,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC3E,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,MAAM,eAAe,GAAG,KAAK;SAC1B,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;SAC5B,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;IACpC,OAAO,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,sBAAsB,CAAC,MAA6B,EAAE,aAAqB;IAClF,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;QACnE,IAAI,KAAK,CAAC,SAAS,IAAI,mBAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,mBAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YACvF,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,KAAK;SACT,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3D,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC"}
|