botmux 2.83.0 → 2.84.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +1 -1
- package/README.md +5 -1
- package/dist/adapters/backend/sandbox.d.ts +4 -0
- package/dist/adapters/backend/sandbox.d.ts.map +1 -1
- package/dist/adapters/backend/sandbox.js +14 -0
- package/dist/adapters/backend/sandbox.js.map +1 -1
- package/dist/adapters/cli/claude-code.d.ts.map +1 -1
- package/dist/adapters/cli/claude-code.js +6 -43
- package/dist/adapters/cli/claude-code.js.map +1 -1
- package/dist/adapters/cli/mir.d.ts +4 -0
- package/dist/adapters/cli/mir.d.ts.map +1 -0
- package/dist/adapters/cli/mir.js +81 -0
- package/dist/adapters/cli/mir.js.map +1 -0
- package/dist/adapters/cli/registry.d.ts +2 -1
- package/dist/adapters/cli/registry.d.ts.map +1 -1
- package/dist/adapters/cli/registry.js +3 -1
- package/dist/adapters/cli/registry.js.map +1 -1
- package/dist/adapters/cli/shared-hints.d.ts +17 -0
- package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
- package/dist/adapters/cli/shared-hints.js +56 -0
- package/dist/adapters/cli/shared-hints.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +12 -1
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/bot-registry.d.ts +7 -0
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +27 -0
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +30 -65
- package/dist/cli.js.map +1 -1
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +42 -1
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
- package/dist/core/dashboard-ipc-server.js +58 -1
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/passthrough-commands.d.ts.map +1 -1
- package/dist/core/passthrough-commands.js +1 -1
- package/dist/core/passthrough-commands.js.map +1 -1
- package/dist/core/pending-response.d.ts +2 -39
- package/dist/core/pending-response.d.ts.map +1 -1
- package/dist/core/pending-response.js +5 -99
- package/dist/core/pending-response.js.map +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +4 -16
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/skills/claude-plugin-delivery.d.ts +6 -0
- package/dist/core/skills/claude-plugin-delivery.d.ts.map +1 -0
- package/dist/core/skills/claude-plugin-delivery.js +21 -0
- package/dist/core/skills/claude-plugin-delivery.js.map +1 -0
- package/dist/core/skills/cli-admin-command.d.ts +7 -0
- package/dist/core/skills/cli-admin-command.d.ts.map +1 -0
- package/dist/core/skills/cli-admin-command.js +243 -0
- package/dist/core/skills/cli-admin-command.js.map +1 -0
- package/dist/core/skills/cli-session-command.d.ts +7 -0
- package/dist/core/skills/cli-session-command.d.ts.map +1 -0
- package/dist/core/skills/cli-session-command.js +45 -0
- package/dist/core/skills/cli-session-command.js.map +1 -0
- package/dist/core/skills/delivery.d.ts +11 -0
- package/dist/core/skills/delivery.d.ts.map +1 -0
- package/dist/core/skills/delivery.js +22 -0
- package/dist/core/skills/delivery.js.map +1 -0
- package/dist/core/skills/discovery.d.ts +3 -0
- package/dist/core/skills/discovery.d.ts.map +1 -0
- package/dist/core/skills/discovery.js +34 -0
- package/dist/core/skills/discovery.js.map +1 -0
- package/dist/core/skills/frontmatter.d.ts +9 -0
- package/dist/core/skills/frontmatter.d.ts.map +1 -0
- package/dist/core/skills/frontmatter.js +42 -0
- package/dist/core/skills/frontmatter.js.map +1 -0
- package/dist/core/skills/im-command.d.ts +9 -0
- package/dist/core/skills/im-command.d.ts.map +1 -0
- package/dist/core/skills/im-command.js +107 -0
- package/dist/core/skills/im-command.js.map +1 -0
- package/dist/core/skills/manifest-store.d.ts +4 -0
- package/dist/core/skills/manifest-store.d.ts.map +1 -0
- package/dist/core/skills/manifest-store.js +26 -0
- package/dist/core/skills/manifest-store.js.map +1 -0
- package/dist/core/skills/package.d.ts +13 -0
- package/dist/core/skills/package.d.ts.map +1 -0
- package/dist/core/skills/package.js +35 -0
- package/dist/core/skills/package.js.map +1 -0
- package/dist/core/skills/policy.d.ts +18 -0
- package/dist/core/skills/policy.d.ts.map +1 -0
- package/dist/core/skills/policy.js +69 -0
- package/dist/core/skills/policy.js.map +1 -0
- package/dist/core/skills/prompt.d.ts +3 -0
- package/dist/core/skills/prompt.d.ts.map +1 -0
- package/dist/core/skills/prompt.js +25 -0
- package/dist/core/skills/prompt.js.map +1 -0
- package/dist/core/skills/references.d.ts +21 -0
- package/dist/core/skills/references.d.ts.map +1 -0
- package/dist/core/skills/references.js +27 -0
- package/dist/core/skills/references.js.map +1 -0
- package/dist/core/skills/registry-paths.d.ts +5 -0
- package/dist/core/skills/registry-paths.d.ts.map +1 -0
- package/dist/core/skills/registry-paths.js +15 -0
- package/dist/core/skills/registry-paths.js.map +1 -0
- package/dist/core/skills/resource-reader.d.ts +9 -0
- package/dist/core/skills/resource-reader.d.ts.map +1 -0
- package/dist/core/skills/resource-reader.js +97 -0
- package/dist/core/skills/resource-reader.js.map +1 -0
- package/dist/core/skills/session-resolver.d.ts +14 -0
- package/dist/core/skills/session-resolver.d.ts.map +1 -0
- package/dist/core/skills/session-resolver.js +24 -0
- package/dist/core/skills/session-resolver.js.map +1 -0
- package/dist/core/skills/session-runtime.d.ts +14 -0
- package/dist/core/skills/session-runtime.d.ts.map +1 -0
- package/dist/core/skills/session-runtime.js +32 -0
- package/dist/core/skills/session-runtime.js.map +1 -0
- package/dist/core/skills/sources.d.ts +21 -0
- package/dist/core/skills/sources.d.ts.map +1 -0
- package/dist/core/skills/sources.js +155 -0
- package/dist/core/skills/sources.js.map +1 -0
- package/dist/core/skills/types.d.ts +71 -0
- package/dist/core/skills/types.d.ts.map +1 -0
- package/dist/core/skills/types.js +2 -0
- package/dist/core/skills/types.js.map +1 -0
- package/dist/core/types.d.ts +10 -3
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/worker-pool.d.ts +14 -1
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +105 -69
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts +2 -2
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +49 -52
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/skill-install-request.d.ts +21 -0
- package/dist/dashboard/skill-install-request.d.ts.map +1 -0
- package/dist/dashboard/skill-install-request.js +62 -0
- package/dist/dashboard/skill-install-request.js.map +1 -0
- package/dist/dashboard/web/app.d.ts.map +1 -1
- package/dist/dashboard/web/app.js +4 -1
- package/dist/dashboard/web/app.js.map +1 -1
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +138 -0
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/skills.d.ts +2 -0
- package/dist/dashboard/web/skills.d.ts.map +1 -0
- package/dist/dashboard/web/skills.js +539 -0
- package/dist/dashboard/web/skills.js.map +1 -0
- package/dist/dashboard/web/workflows.js +1 -1
- package/dist/dashboard/web/workflows.js.map +1 -1
- package/dist/dashboard-web/app.js +594 -451
- package/dist/dashboard-web/index.html +1 -0
- package/dist/dashboard-web/style.css +793 -0
- package/dist/dashboard.js +231 -0
- package/dist/dashboard.js.map +1 -1
- package/dist/global-config.d.ts +7 -0
- package/dist/global-config.d.ts.map +1 -1
- package/dist/global-config.js +16 -0
- package/dist/global-config.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +2 -5
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +2 -5
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/card-builder.d.ts +0 -3
- package/dist/im/lark/card-builder.d.ts.map +1 -1
- package/dist/im/lark/card-builder.js +1 -33
- package/dist/im/lark/card-builder.js.map +1 -1
- package/dist/mir-local-runtime.d.ts +20 -0
- package/dist/mir-local-runtime.d.ts.map +1 -0
- package/dist/mir-local-runtime.js +168 -0
- package/dist/mir-local-runtime.js.map +1 -0
- package/dist/mir-runner.d.ts +3 -0
- package/dist/mir-runner.d.ts.map +1 -0
- package/dist/mir-runner.js +482 -0
- package/dist/mir-runner.js.map +1 -0
- package/dist/services/bot-config-store.d.ts +4 -4
- package/dist/services/bot-config-store.d.ts.map +1 -1
- package/dist/services/bot-config-store.js +24 -1
- package/dist/services/bot-config-store.js.map +1 -1
- package/dist/services/session-store.d.ts +1 -0
- package/dist/services/session-store.d.ts.map +1 -1
- package/dist/services/session-store.js +12 -5
- package/dist/services/session-store.js.map +1 -1
- package/dist/services/skill-registry-store.d.ts +42 -0
- package/dist/services/skill-registry-store.d.ts.map +1 -0
- package/dist/services/skill-registry-store.js +343 -0
- package/dist/services/skill-registry-store.js.map +1 -0
- package/dist/setup/bot-config-editor.d.ts.map +1 -1
- package/dist/setup/bot-config-editor.js +2 -0
- package/dist/setup/bot-config-editor.js.map +1 -1
- package/dist/setup/cli-selection.d.ts.map +1 -1
- package/dist/setup/cli-selection.js +74 -6
- package/dist/setup/cli-selection.js.map +1 -1
- package/dist/skills/installer.d.ts.map +1 -1
- package/dist/skills/installer.js +3 -0
- package/dist/skills/installer.js.map +1 -1
- package/dist/types.d.ts +2 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/file-lock.d.ts +1 -0
- package/dist/utils/file-lock.d.ts.map +1 -1
- package/dist/utils/file-lock.js +87 -1
- package/dist/utils/file-lock.js.map +1 -1
- package/dist/worker.js +5 -3
- package/dist/worker.js.map +1 -1
- package/dist/workflows/attempt-resume.d.ts.map +1 -1
- package/dist/workflows/attempt-resume.js +1 -1
- package/dist/workflows/attempt-resume.js.map +1 -1
- package/dist/workflows/definition.d.ts +16 -16
- package/dist/workflows/events/schema.d.ts +280 -280
- package/package.json +1 -1
- package/dist/services/pending-response-transaction-store.d.ts +0 -12
- package/dist/services/pending-response-transaction-store.d.ts.map +0 -1
- package/dist/services/pending-response-transaction-store.js +0 -52
- package/dist/services/pending-response-transaction-store.js.map +0 -1
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { existsSync, readdirSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { loadSkillPackage } from './package.js';
|
|
4
|
+
function listSkillDirs(root) {
|
|
5
|
+
if (!existsSync(root))
|
|
6
|
+
return [];
|
|
7
|
+
try {
|
|
8
|
+
return readdirSync(root, { withFileTypes: true })
|
|
9
|
+
.filter((entry) => entry.isDirectory())
|
|
10
|
+
.map((entry) => join(root, entry.name));
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return [];
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export function discoverProjectSkills(workingDir) {
|
|
17
|
+
const roots = [
|
|
18
|
+
join(workingDir, '.agents', 'skills'),
|
|
19
|
+
join(workingDir, '.botmux', 'skills'),
|
|
20
|
+
];
|
|
21
|
+
const out = [];
|
|
22
|
+
for (const root of roots) {
|
|
23
|
+
for (const dir of listSkillDirs(root)) {
|
|
24
|
+
try {
|
|
25
|
+
out.push(loadSkillPackage(dir, { source: { type: 'project', root: dir } }));
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// Bad project-local skills should surface through diagnostics later, not break spawn.
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return out;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../../src/core/skills/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGhD,SAAS,aAAa,CAAC,IAAY;IACjC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;aAC9C,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;aACtC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,UAAkB;IACtD,MAAM,KAAK,GAAG;QACZ,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC;QACrC,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC;KACtC,CAAC;IACF,MAAM,GAAG,GAAmB,EAAE,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,MAAM,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC;gBACH,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;YAC9E,CAAC;YAAC,MAAM,CAAC;gBACP,sFAAsF;YACxF,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface SkillFrontmatter {
|
|
2
|
+
name?: string;
|
|
3
|
+
description?: string;
|
|
4
|
+
version?: string;
|
|
5
|
+
displayName?: string;
|
|
6
|
+
tags?: string[];
|
|
7
|
+
}
|
|
8
|
+
export declare function readSkillFrontmatter(text: string): SkillFrontmatter;
|
|
9
|
+
//# sourceMappingURL=frontmatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter.d.ts","sourceRoot":"","sources":["../../../src/core/skills/frontmatter.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAqBD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAiBnE"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
function cleanScalar(raw) {
|
|
2
|
+
const v = raw.trim();
|
|
3
|
+
if ((v.startsWith('"') && v.endsWith('"')) || (v.startsWith("'") && v.endsWith("'"))) {
|
|
4
|
+
return v.slice(1, -1);
|
|
5
|
+
}
|
|
6
|
+
return v;
|
|
7
|
+
}
|
|
8
|
+
function parseTags(raw) {
|
|
9
|
+
const v = raw.trim();
|
|
10
|
+
if (!v)
|
|
11
|
+
return [];
|
|
12
|
+
if (!v.startsWith('[') || !v.endsWith(']'))
|
|
13
|
+
return [cleanScalar(v)].filter(Boolean);
|
|
14
|
+
return v
|
|
15
|
+
.slice(1, -1)
|
|
16
|
+
.split(',')
|
|
17
|
+
.map((item) => cleanScalar(item))
|
|
18
|
+
.filter(Boolean);
|
|
19
|
+
}
|
|
20
|
+
export function readSkillFrontmatter(text) {
|
|
21
|
+
if (!text.startsWith('---'))
|
|
22
|
+
return {};
|
|
23
|
+
const end = text.indexOf('\n---', 3);
|
|
24
|
+
if (end === -1)
|
|
25
|
+
return {};
|
|
26
|
+
const block = text.slice(3, end);
|
|
27
|
+
const out = {};
|
|
28
|
+
for (const line of block.split(/\r?\n/)) {
|
|
29
|
+
const m = /^\s*(name|description|version|displayName|tags)\s*:\s*(.+?)\s*$/.exec(line);
|
|
30
|
+
if (!m)
|
|
31
|
+
continue;
|
|
32
|
+
const key = m[1];
|
|
33
|
+
if (key === 'tags') {
|
|
34
|
+
out.tags = parseTags(m[2]);
|
|
35
|
+
}
|
|
36
|
+
else if (key === 'name' || key === 'description' || key === 'version' || key === 'displayName') {
|
|
37
|
+
out[key] = cleanScalar(m[2]);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return out;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=frontmatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../../src/core/skills/frontmatter.ts"],"names":[],"mappings":"AAQA,SAAS,WAAW,CAAC,GAAW;IAC9B,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACrB,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACrF,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC5B,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACrB,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAClB,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACpF,OAAO,CAAC;SACL,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;SACZ,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;SAChC,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACvC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACrC,IAAI,GAAG,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACjC,MAAM,GAAG,GAAqB,EAAE,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,iEAAiE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvF,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACjB,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YACnB,GAAG,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;aAAM,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,aAAa,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,aAAa,EAAE,CAAC;YACjG,GAAG,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { BotSkillPolicy } from './types.js';
|
|
2
|
+
export interface SkillsImCommandResult {
|
|
3
|
+
ok: boolean;
|
|
4
|
+
message: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function attachSkillPolicy(current: BotSkillPolicy | undefined, name: string): BotSkillPolicy;
|
|
7
|
+
export declare function detachSkillPolicy(current: BotSkillPolicy | undefined, name: string): BotSkillPolicy | undefined;
|
|
8
|
+
export declare function runSkillsImCommand(larkAppId: string, content: string): Promise<SkillsImCommandResult>;
|
|
9
|
+
//# sourceMappingURL=im-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"im-command.d.ts","sourceRoot":"","sources":["../../../src/core/skills/im-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAA+B,MAAM,YAAY,CAAC;AAM9E,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAUD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc,CAKnG;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAS/G;AAqCD,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAyC3G"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { getBot } from '../../bot-registry.js';
|
|
2
|
+
import { applyConfigField, findConfigField } from '../../services/bot-config-store.js';
|
|
3
|
+
import { readSkillRegistry } from '../../services/skill-registry-store.js';
|
|
4
|
+
import { readGlobalConfig } from '../../global-config.js';
|
|
5
|
+
function skillSelector(name) {
|
|
6
|
+
return `skill:${name}`;
|
|
7
|
+
}
|
|
8
|
+
function policyIsEmpty(policy) {
|
|
9
|
+
return !policy.include?.length;
|
|
10
|
+
}
|
|
11
|
+
export function attachSkillPolicy(current, name) {
|
|
12
|
+
const selector = skillSelector(name);
|
|
13
|
+
const include = new Set((current?.include ?? []).filter((item) => item.startsWith('skill:')));
|
|
14
|
+
include.add(selector);
|
|
15
|
+
return { include: [...include] };
|
|
16
|
+
}
|
|
17
|
+
export function detachSkillPolicy(current, name) {
|
|
18
|
+
if (!current)
|
|
19
|
+
return undefined;
|
|
20
|
+
const selector = skillSelector(name);
|
|
21
|
+
const include = (current.include ?? [])
|
|
22
|
+
.filter((item) => item.startsWith('skill:'))
|
|
23
|
+
.filter((item) => item !== selector);
|
|
24
|
+
const next = {};
|
|
25
|
+
if (include.length > 0)
|
|
26
|
+
next.include = include;
|
|
27
|
+
return policyIsEmpty(next) ? undefined : next;
|
|
28
|
+
}
|
|
29
|
+
function describeSource(skill) {
|
|
30
|
+
if (skill.source.type === 'github')
|
|
31
|
+
return `github:${skill.source.owner}/${skill.source.repo}/${skill.source.path}`;
|
|
32
|
+
if (skill.source.type === 'git')
|
|
33
|
+
return `${skill.source.url}#${skill.source.path}`;
|
|
34
|
+
return skill.source.type;
|
|
35
|
+
}
|
|
36
|
+
function renderStatus(larkAppId) {
|
|
37
|
+
const bot = getBot(larkAppId);
|
|
38
|
+
const registry = readSkillRegistry();
|
|
39
|
+
const installed = Object.values(registry.skills).sort((a, b) => a.name.localeCompare(b.name));
|
|
40
|
+
const policy = bot.config.skills;
|
|
41
|
+
const include = (policy?.include ?? []).filter((item) => item.startsWith('skill:'));
|
|
42
|
+
const lines = [
|
|
43
|
+
`Skill policy: ${policy ? 'custom priority' : 'default CLI behavior'}`,
|
|
44
|
+
`CLI: ${bot.config.cliId}`,
|
|
45
|
+
`delivery: ${readGlobalConfig().skills?.delivery ?? 'auto'} (global)`,
|
|
46
|
+
`priority skills: ${include.length ? include.map((item) => item.slice('skill:'.length)).join(', ') : 'none'}`,
|
|
47
|
+
`installed skills: ${installed.length}`,
|
|
48
|
+
];
|
|
49
|
+
if (installed.length > 0) {
|
|
50
|
+
lines.push(...installed.slice(0, 12).map((skill) => `- ${skill.name}${skill.description ? ` — ${skill.description}` : ''} (${describeSource(skill)})`));
|
|
51
|
+
if (installed.length > 12)
|
|
52
|
+
lines.push(`... ${installed.length - 12} more`);
|
|
53
|
+
}
|
|
54
|
+
lines.push('Commands: /skills attach <name>, /skills detach <name>');
|
|
55
|
+
return lines.join('\n');
|
|
56
|
+
}
|
|
57
|
+
async function writeSkillPolicy(larkAppId, policy) {
|
|
58
|
+
const spec = findConfigField('skills');
|
|
59
|
+
if (!spec)
|
|
60
|
+
return { ok: false, message: 'skills config field is unavailable' };
|
|
61
|
+
const result = await applyConfigField(larkAppId, spec, policy ?? null);
|
|
62
|
+
if (!result.ok)
|
|
63
|
+
return { ok: false, message: `写入失败:${result.reason}` };
|
|
64
|
+
return { ok: true, message: 'OK' };
|
|
65
|
+
}
|
|
66
|
+
export async function runSkillsImCommand(larkAppId, content) {
|
|
67
|
+
const args = content.replace(/^\/skills\s*/i, '').trim();
|
|
68
|
+
if (!args || args === 'bot' || args === 'status') {
|
|
69
|
+
return { ok: true, message: renderStatus(larkAppId) };
|
|
70
|
+
}
|
|
71
|
+
const [sub, rawName] = args.split(/\s+/, 2);
|
|
72
|
+
const name = rawName?.trim();
|
|
73
|
+
if ((sub === 'attach' || sub === 'detach') && !name) {
|
|
74
|
+
return { ok: false, message: '用法:/skills attach <name> 或 /skills detach <name>' };
|
|
75
|
+
}
|
|
76
|
+
if (sub === 'attach') {
|
|
77
|
+
const skill = readSkillRegistry().skills[name];
|
|
78
|
+
if (!skill)
|
|
79
|
+
return { ok: false, message: `未安装 skill:${name}\n先在部署机器上运行:botmux skills install <path|github>` };
|
|
80
|
+
const bot = getBot(larkAppId);
|
|
81
|
+
const result = await writeSkillPolicy(larkAppId, attachSkillPolicy(bot.config.skills, skill.name));
|
|
82
|
+
if (!result.ok)
|
|
83
|
+
return result;
|
|
84
|
+
return { ok: true, message: `已把 ${skill.name} 加入本 bot 的 priority skills。新会话生效,底层 CLI 原生 skills 仍保持可见。` };
|
|
85
|
+
}
|
|
86
|
+
if (sub === 'detach') {
|
|
87
|
+
const bot = getBot(larkAppId);
|
|
88
|
+
const next = detachSkillPolicy(bot.config.skills, name);
|
|
89
|
+
const result = await writeSkillPolicy(larkAppId, next);
|
|
90
|
+
if (!result.ok)
|
|
91
|
+
return result;
|
|
92
|
+
return { ok: true, message: next
|
|
93
|
+
? `已从本 bot 的 priority skills 移除 ${name}。新会话生效。`
|
|
94
|
+
: `已清除本 bot 的 custom skill policy;新会话回到底层 CLI 默认行为。` };
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
ok: false,
|
|
98
|
+
message: [
|
|
99
|
+
'用法:',
|
|
100
|
+
'/skills',
|
|
101
|
+
'/skills attach <name>',
|
|
102
|
+
'/skills detach <name>',
|
|
103
|
+
'安装和诊断请在部署机器上使用:botmux skills list / doctor / resolve',
|
|
104
|
+
].join('\n'),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=im-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"im-command.js","sourceRoot":"","sources":["../../../src/core/skills/im-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { SessionSkillManifest } from './types.js';
|
|
2
|
+
export declare function writeSessionSkillManifest(manifest: SessionSkillManifest): void;
|
|
3
|
+
export declare function readSessionSkillManifest(sessionId: string): SessionSkillManifest | null;
|
|
4
|
+
//# sourceMappingURL=manifest-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-store.d.ts","sourceRoot":"","sources":["../../../src/core/skills/manifest-store.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAUvD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI,CAG9E;AAED,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAQvF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { config } from '../../config.js';
|
|
4
|
+
import { atomicWriteFileSync } from '../../utils/atomic-write.js';
|
|
5
|
+
function manifestDir() {
|
|
6
|
+
return join(config.session.dataDir, 'skill-manifests');
|
|
7
|
+
}
|
|
8
|
+
function manifestPath(sessionId) {
|
|
9
|
+
return join(manifestDir(), `${sessionId}.json`);
|
|
10
|
+
}
|
|
11
|
+
export function writeSessionSkillManifest(manifest) {
|
|
12
|
+
mkdirSync(manifestDir(), { recursive: true });
|
|
13
|
+
atomicWriteFileSync(manifestPath(manifest.sessionId), JSON.stringify(manifest, null, 2) + '\n', { mode: 0o600 });
|
|
14
|
+
}
|
|
15
|
+
export function readSessionSkillManifest(sessionId) {
|
|
16
|
+
const file = manifestPath(sessionId);
|
|
17
|
+
if (!existsSync(file))
|
|
18
|
+
return null;
|
|
19
|
+
try {
|
|
20
|
+
return JSON.parse(readFileSync(file, 'utf-8'));
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=manifest-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-store.js","sourceRoot":"","sources":["../../../src/core/skills/manifest-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAGlE,SAAS,WAAW;IAClB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,YAAY,CAAC,SAAiB;IACrC,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,GAAG,SAAS,OAAO,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,QAA8B;IACtE,SAAS,CAAC,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,mBAAmB,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACnH,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,SAAiB;IACxD,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACrC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAyB,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { SkillPackage, SkillSource } from './types.js';
|
|
2
|
+
export declare function isValidSkillName(name: string): boolean;
|
|
3
|
+
export declare function validateSkillPackageDir(dir: string): {
|
|
4
|
+
ok: true;
|
|
5
|
+
} | {
|
|
6
|
+
ok: false;
|
|
7
|
+
reason: string;
|
|
8
|
+
};
|
|
9
|
+
export declare function loadSkillPackage(dir: string, opts: {
|
|
10
|
+
source: SkillSource;
|
|
11
|
+
id?: string;
|
|
12
|
+
}): SkillPackage;
|
|
13
|
+
//# sourceMappingURL=package.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package.d.ts","sourceRoot":"","sources":["../../../src/core/skills/package.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI5D,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAGjG;AAED,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GACzC,YAAY,CAmBd"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { existsSync, readFileSync, realpathSync } from 'node:fs';
|
|
2
|
+
import { basename, join } from 'node:path';
|
|
3
|
+
import { readSkillFrontmatter } from './frontmatter.js';
|
|
4
|
+
const NAME_RE = /^[a-zA-Z0-9][a-zA-Z0-9:_-]{0,127}$/;
|
|
5
|
+
export function isValidSkillName(name) {
|
|
6
|
+
return NAME_RE.test(name);
|
|
7
|
+
}
|
|
8
|
+
export function validateSkillPackageDir(dir) {
|
|
9
|
+
if (!existsSync(join(dir, 'SKILL.md')))
|
|
10
|
+
return { ok: false, reason: 'missing_skill_md' };
|
|
11
|
+
return { ok: true };
|
|
12
|
+
}
|
|
13
|
+
export function loadSkillPackage(dir, opts) {
|
|
14
|
+
const valid = validateSkillPackageDir(dir);
|
|
15
|
+
if (!valid.ok)
|
|
16
|
+
throw new Error(valid.reason);
|
|
17
|
+
const rootDir = realpathSync(dir);
|
|
18
|
+
const text = readFileSync(join(rootDir, 'SKILL.md'), 'utf-8');
|
|
19
|
+
const fm = readSkillFrontmatter(text);
|
|
20
|
+
const name = fm.name?.trim() || basename(rootDir);
|
|
21
|
+
if (!isValidSkillName(name))
|
|
22
|
+
throw new Error(`invalid_skill_name:${name}`);
|
|
23
|
+
return {
|
|
24
|
+
id: opts.id ?? name,
|
|
25
|
+
name,
|
|
26
|
+
displayName: fm.displayName,
|
|
27
|
+
description: fm.description,
|
|
28
|
+
version: fm.version,
|
|
29
|
+
tags: fm.tags ?? [],
|
|
30
|
+
rootDir,
|
|
31
|
+
entrypoint: 'SKILL.md',
|
|
32
|
+
source: opts.source,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=package.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package.js","sourceRoot":"","sources":["../../../src/core/skills/package.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAGxD,MAAM,OAAO,GAAG,oCAAoC,CAAC;AAErD,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,GAAW;IACjD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IACzF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,GAAW,EACX,IAA0C;IAE1C,MAAM,KAAK,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAC3C,IAAI,CAAC,KAAK,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;IAC9D,MAAM,EAAE,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC;IAClD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAC;IAC3E,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,IAAI;QACnB,IAAI;QACJ,WAAW,EAAE,EAAE,CAAC,WAAW;QAC3B,WAAW,EAAE,EAAE,CAAC,WAAW;QAC3B,OAAO,EAAE,EAAE,CAAC,OAAO;QACnB,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE;QACnB,OAAO;QACP,UAAU,EAAE,UAAU;QACtB,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { BotSkillPolicy, ResolvedSkill, SkillDiagnostic, SkillPackage } from './types.js';
|
|
2
|
+
export interface SkillPolicyInput {
|
|
3
|
+
registrySkills: SkillPackage[];
|
|
4
|
+
projectSkills: SkillPackage[];
|
|
5
|
+
globalProjectSkills?: 'off' | 'trusted' | 'all';
|
|
6
|
+
globalDelivery?: 'auto' | 'prompt' | 'native';
|
|
7
|
+
botPolicy: BotSkillPolicy | undefined;
|
|
8
|
+
workingDir: string;
|
|
9
|
+
}
|
|
10
|
+
export interface SkillPolicyResult {
|
|
11
|
+
enabled: boolean;
|
|
12
|
+
mode: 'priority';
|
|
13
|
+
delivery: 'auto' | 'prompt' | 'native';
|
|
14
|
+
prioritySkills: ResolvedSkill[];
|
|
15
|
+
diagnostics: SkillDiagnostic[];
|
|
16
|
+
}
|
|
17
|
+
export declare function resolveSkillPolicy(input: SkillPolicyInput): SkillPolicyResult;
|
|
18
|
+
//# sourceMappingURL=policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../../src/core/skills/policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,eAAe,EACf,YAAY,EAEb,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,YAAY,EAAE,CAAC;IAC/B,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,mBAAmB,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,KAAK,CAAC;IAChD,cAAc,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC9C,SAAS,EAAE,cAAc,GAAG,SAAS,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACvC,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,WAAW,EAAE,eAAe,EAAE,CAAC;CAChC;AAeD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,gBAAgB,GAAG,iBAAiB,CAyD7E"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
function matchesSelector(skill, selector) {
|
|
2
|
+
const [kind, ...rest] = selector.split(':');
|
|
3
|
+
const value = rest.join(':');
|
|
4
|
+
if (kind === 'skill')
|
|
5
|
+
return skill.name === value;
|
|
6
|
+
return false;
|
|
7
|
+
}
|
|
8
|
+
function appendMatches(out, skills, selector, reason) {
|
|
9
|
+
for (const skill of skills) {
|
|
10
|
+
if (matchesSelector(skill, selector))
|
|
11
|
+
out.push({ ...skill, priorityReason: reason });
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function resolveSkillPolicy(input) {
|
|
15
|
+
const policy = input.botPolicy;
|
|
16
|
+
if (!policy) {
|
|
17
|
+
return { enabled: false, mode: 'priority', delivery: 'auto', prioritySkills: [], diagnostics: [] };
|
|
18
|
+
}
|
|
19
|
+
const diagnostics = [];
|
|
20
|
+
const candidates = [...input.registrySkills];
|
|
21
|
+
const projectMode = input.globalProjectSkills ?? 'off';
|
|
22
|
+
if (projectMode === 'trusted') {
|
|
23
|
+
diagnostics.push({
|
|
24
|
+
level: 'warn',
|
|
25
|
+
code: 'project_skills_trusted_deprecated',
|
|
26
|
+
message: 'projectSkills:"trusted" is kept as a compatibility alias for "all"; no separate trust boundary is enforced',
|
|
27
|
+
});
|
|
28
|
+
candidates.push(...input.projectSkills);
|
|
29
|
+
}
|
|
30
|
+
else if (projectMode === 'all') {
|
|
31
|
+
candidates.push(...input.projectSkills);
|
|
32
|
+
}
|
|
33
|
+
const raw = [];
|
|
34
|
+
for (const selector of policy.include ?? []) {
|
|
35
|
+
if (!selector.startsWith('skill:'))
|
|
36
|
+
continue;
|
|
37
|
+
appendMatches(raw, candidates, selector, 'bot:include');
|
|
38
|
+
}
|
|
39
|
+
const seen = new Set();
|
|
40
|
+
const prioritySkills = [];
|
|
41
|
+
for (const skill of raw) {
|
|
42
|
+
if (seen.has(skill.name)) {
|
|
43
|
+
diagnostics.push({
|
|
44
|
+
level: 'warn',
|
|
45
|
+
code: 'duplicate_skill_shadowed',
|
|
46
|
+
message: `Duplicate skill shadowed: ${skill.name}`,
|
|
47
|
+
skillName: skill.name,
|
|
48
|
+
});
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
seen.add(skill.name);
|
|
52
|
+
prioritySkills.push(skill);
|
|
53
|
+
}
|
|
54
|
+
if (prioritySkills.length === 0) {
|
|
55
|
+
diagnostics.push({
|
|
56
|
+
level: 'warn',
|
|
57
|
+
code: 'empty_priority_skill_set',
|
|
58
|
+
message: 'No skills matched bot skill policy',
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
enabled: true,
|
|
63
|
+
mode: 'priority',
|
|
64
|
+
delivery: input.globalDelivery ?? 'auto',
|
|
65
|
+
prioritySkills,
|
|
66
|
+
diagnostics,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../src/core/skills/policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../../src/core/skills/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAUvD,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAejG"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
function xmlEscape(s) {
|
|
2
|
+
return s
|
|
3
|
+
.replace(/&/g, '&')
|
|
4
|
+
.replace(/</g, '<')
|
|
5
|
+
.replace(/>/g, '>')
|
|
6
|
+
.replace(/"/g, '"');
|
|
7
|
+
}
|
|
8
|
+
export function renderSkillCatalogBlock(manifest) {
|
|
9
|
+
if (!manifest || manifest.prioritySkills.length === 0)
|
|
10
|
+
return '';
|
|
11
|
+
const skills = manifest.prioritySkills.map((skill) => {
|
|
12
|
+
const tags = skill.tags.length > 0 ? ` tags="${xmlEscape(skill.tags.join(','))}"` : '';
|
|
13
|
+
const description = skill.description
|
|
14
|
+
? `\n <description>${xmlEscape(skill.description)}</description>`
|
|
15
|
+
: '';
|
|
16
|
+
return ` <skill name="${xmlEscape(skill.name)}"${tags}>${description}\n <read>botmux skill show ${xmlEscape(skill.name)}</read>\n </skill>`;
|
|
17
|
+
});
|
|
18
|
+
return [
|
|
19
|
+
`<botmux_skills mode="${manifest.policyMode}">`,
|
|
20
|
+
' <instruction>Prefer these botmux priority skills when they match the task. Read an entrypoint with `botmux skill show <name>` and referenced files with `botmux skill read <name> <relative-path>`.</instruction>',
|
|
21
|
+
...skills,
|
|
22
|
+
'</botmux_skills>',
|
|
23
|
+
].join('\n');
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../../src/core/skills/prompt.ts"],"names":[],"mappings":"AAEA,SAAS,SAAS,CAAC,CAAS;IAC1B,OAAO,CAAC;SACL,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,QAAiD;IACvF,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACjE,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACnD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACvF,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW;YACnC,CAAC,CAAC,sBAAsB,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,gBAAgB;YACpE,CAAC,CAAC,EAAE,CAAC;QACP,OAAO,kBAAkB,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,WAAW,iCAAiC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC;IACnJ,CAAC,CAAC,CAAC;IACH,OAAO;QACL,wBAAwB,QAAQ,CAAC,UAAU,IAAI;QAC/C,qNAAqN;QACrN,GAAG,MAAM;QACT,kBAAkB;KACnB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { BotSkillPolicy } from './types.js';
|
|
2
|
+
export interface SkillReferenceBotInput {
|
|
3
|
+
larkAppId: string;
|
|
4
|
+
name?: string;
|
|
5
|
+
botName?: string;
|
|
6
|
+
skills?: BotSkillPolicy | null;
|
|
7
|
+
}
|
|
8
|
+
export interface SkillReferenceBot {
|
|
9
|
+
larkAppId: string;
|
|
10
|
+
botName: string;
|
|
11
|
+
direct: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface SkillReferenceSummary {
|
|
14
|
+
bots: SkillReferenceBot[];
|
|
15
|
+
}
|
|
16
|
+
export declare function directSkillNames(policy: BotSkillPolicy | null | undefined): string[];
|
|
17
|
+
export declare function policyIncludesDirectSkill(policy: BotSkillPolicy | null | undefined, skillName: string): boolean;
|
|
18
|
+
export declare function analyzeSkillReferences(skillName: string, opts: {
|
|
19
|
+
bots: SkillReferenceBotInput[];
|
|
20
|
+
}): SkillReferenceSummary;
|
|
21
|
+
//# sourceMappingURL=references.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"references.d.ts","sourceRoot":"","sources":["../../../src/core/skills/references.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAiB,MAAM,YAAY,CAAC;AAEhE,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,iBAAiB,EAAE,CAAC;CAC3B;AAMD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,EAAE,CAIpF;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,EACzC,SAAS,EAAE,MAAM,GAChB,OAAO,CAET;AAED,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE;IACJ,IAAI,EAAE,sBAAsB,EAAE,CAAC;CAChC,GACA,qBAAqB,CAavB"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
function directSkillSelector(skillName) {
|
|
2
|
+
return `skill:${skillName}`;
|
|
3
|
+
}
|
|
4
|
+
export function directSkillNames(policy) {
|
|
5
|
+
return (policy?.include ?? [])
|
|
6
|
+
.filter((item) => item.startsWith('skill:'))
|
|
7
|
+
.map((item) => item.slice('skill:'.length));
|
|
8
|
+
}
|
|
9
|
+
export function policyIncludesDirectSkill(policy, skillName) {
|
|
10
|
+
return Array.isArray(policy?.include) && policy.include.includes(directSkillSelector(skillName));
|
|
11
|
+
}
|
|
12
|
+
export function analyzeSkillReferences(skillName, opts) {
|
|
13
|
+
const bots = [];
|
|
14
|
+
for (const bot of opts.bots) {
|
|
15
|
+
const direct = policyIncludesDirectSkill(bot.skills, skillName);
|
|
16
|
+
if (!direct)
|
|
17
|
+
continue;
|
|
18
|
+
bots.push({
|
|
19
|
+
larkAppId: bot.larkAppId,
|
|
20
|
+
botName: bot.botName ?? bot.name ?? bot.larkAppId,
|
|
21
|
+
direct,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
bots.sort((a, b) => a.botName.localeCompare(b.botName));
|
|
25
|
+
return { bots };
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=references.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"references.js","sourceRoot":"","sources":["../../../src/core/skills/references.ts"],"names":[],"mappings":"AAmBA,SAAS,mBAAmB,CAAC,SAAiB;IAC5C,OAAO,SAAS,SAAS,EAAmB,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAyC;IACxE,OAAO,CAAC,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC;SAC3B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;SAC3C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,MAAyC,EACzC,SAAiB;IAEjB,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC;AACnG,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,SAAiB,EACjB,IAEC;IAED,MAAM,IAAI,GAAwB,EAAE,CAAC;IACrC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,yBAAyB,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAChE,IAAI,CAAC,MAAM;YAAE,SAAS;QACtB,IAAI,CAAC,IAAI,CAAC;YACR,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,SAAS;YACjD,MAAM;SACP,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACxD,OAAO,EAAE,IAAI,EAAE,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-paths.d.ts","sourceRoot":"","sources":["../../../src/core/skills/registry-paths.ts"],"names":[],"mappings":"AAGA,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { homedir } from 'node:os';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
export function botmuxSkillsHome() {
|
|
4
|
+
return join(homedir(), '.botmux', 'skills');
|
|
5
|
+
}
|
|
6
|
+
export function skillRegistryPath() {
|
|
7
|
+
return join(botmuxSkillsHome(), 'registry.json');
|
|
8
|
+
}
|
|
9
|
+
export function skillStoreDir() {
|
|
10
|
+
return join(botmuxSkillsHome(), 'store');
|
|
11
|
+
}
|
|
12
|
+
export function skillSourcesDir() {
|
|
13
|
+
return join(botmuxSkillsHome(), 'sources');
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=registry-paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-paths.js","sourceRoot":"","sources":["../../../src/core/skills/registry-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,CAAC,gBAAgB,EAAE,EAAE,eAAe,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,CAAC,gBAAgB,EAAE,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,CAAC,gBAAgB,EAAE,EAAE,SAAS,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { SessionSkillManifest } from './types.js';
|
|
2
|
+
export interface SkillResourceReadResult {
|
|
3
|
+
path: string;
|
|
4
|
+
content: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function readSkillResource(manifest: SessionSkillManifest, skillName: string, relativePath: string): SkillResourceReadResult;
|
|
7
|
+
export declare function readSkillEntrypoint(manifest: SessionSkillManifest, skillName: string): SkillResourceReadResult;
|
|
8
|
+
export declare function listSkillResources(manifest: SessionSkillManifest, skillName: string): string[];
|
|
9
|
+
//# sourceMappingURL=resource-reader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-reader.d.ts","sourceRoot":"","sources":["../../../src/core/skills/resource-reader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAIvD,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAOD,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,oBAAoB,EAC9B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,uBAAuB,CAgBzB;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,GAAG,uBAAuB,CAI9G;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAkD9F"}
|