botmux 2.84.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.
Files changed (179) hide show
  1. package/README.md +4 -0
  2. package/dist/adapters/backend/sandbox.d.ts +4 -0
  3. package/dist/adapters/backend/sandbox.d.ts.map +1 -1
  4. package/dist/adapters/backend/sandbox.js +14 -0
  5. package/dist/adapters/backend/sandbox.js.map +1 -1
  6. package/dist/adapters/cli/claude-code.d.ts.map +1 -1
  7. package/dist/adapters/cli/claude-code.js +4 -1
  8. package/dist/adapters/cli/claude-code.js.map +1 -1
  9. package/dist/adapters/cli/types.d.ts +11 -0
  10. package/dist/adapters/cli/types.d.ts.map +1 -1
  11. package/dist/bot-registry.d.ts +7 -0
  12. package/dist/bot-registry.d.ts.map +1 -1
  13. package/dist/bot-registry.js +27 -0
  14. package/dist/bot-registry.js.map +1 -1
  15. package/dist/cli.d.ts.map +1 -1
  16. package/dist/cli.js +30 -65
  17. package/dist/cli.js.map +1 -1
  18. package/dist/core/command-handler.d.ts.map +1 -1
  19. package/dist/core/command-handler.js +42 -1
  20. package/dist/core/command-handler.js.map +1 -1
  21. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  22. package/dist/core/dashboard-ipc-server.js +58 -1
  23. package/dist/core/dashboard-ipc-server.js.map +1 -1
  24. package/dist/core/passthrough-commands.d.ts.map +1 -1
  25. package/dist/core/passthrough-commands.js +1 -1
  26. package/dist/core/passthrough-commands.js.map +1 -1
  27. package/dist/core/pending-response.d.ts +2 -39
  28. package/dist/core/pending-response.d.ts.map +1 -1
  29. package/dist/core/pending-response.js +5 -99
  30. package/dist/core/pending-response.js.map +1 -1
  31. package/dist/core/session-manager.d.ts.map +1 -1
  32. package/dist/core/session-manager.js +4 -16
  33. package/dist/core/session-manager.js.map +1 -1
  34. package/dist/core/skills/claude-plugin-delivery.d.ts +6 -0
  35. package/dist/core/skills/claude-plugin-delivery.d.ts.map +1 -0
  36. package/dist/core/skills/claude-plugin-delivery.js +21 -0
  37. package/dist/core/skills/claude-plugin-delivery.js.map +1 -0
  38. package/dist/core/skills/cli-admin-command.d.ts +7 -0
  39. package/dist/core/skills/cli-admin-command.d.ts.map +1 -0
  40. package/dist/core/skills/cli-admin-command.js +243 -0
  41. package/dist/core/skills/cli-admin-command.js.map +1 -0
  42. package/dist/core/skills/cli-session-command.d.ts +7 -0
  43. package/dist/core/skills/cli-session-command.d.ts.map +1 -0
  44. package/dist/core/skills/cli-session-command.js +45 -0
  45. package/dist/core/skills/cli-session-command.js.map +1 -0
  46. package/dist/core/skills/delivery.d.ts +11 -0
  47. package/dist/core/skills/delivery.d.ts.map +1 -0
  48. package/dist/core/skills/delivery.js +22 -0
  49. package/dist/core/skills/delivery.js.map +1 -0
  50. package/dist/core/skills/discovery.d.ts +3 -0
  51. package/dist/core/skills/discovery.d.ts.map +1 -0
  52. package/dist/core/skills/discovery.js +34 -0
  53. package/dist/core/skills/discovery.js.map +1 -0
  54. package/dist/core/skills/frontmatter.d.ts +9 -0
  55. package/dist/core/skills/frontmatter.d.ts.map +1 -0
  56. package/dist/core/skills/frontmatter.js +42 -0
  57. package/dist/core/skills/frontmatter.js.map +1 -0
  58. package/dist/core/skills/im-command.d.ts +9 -0
  59. package/dist/core/skills/im-command.d.ts.map +1 -0
  60. package/dist/core/skills/im-command.js +107 -0
  61. package/dist/core/skills/im-command.js.map +1 -0
  62. package/dist/core/skills/manifest-store.d.ts +4 -0
  63. package/dist/core/skills/manifest-store.d.ts.map +1 -0
  64. package/dist/core/skills/manifest-store.js +26 -0
  65. package/dist/core/skills/manifest-store.js.map +1 -0
  66. package/dist/core/skills/package.d.ts +13 -0
  67. package/dist/core/skills/package.d.ts.map +1 -0
  68. package/dist/core/skills/package.js +35 -0
  69. package/dist/core/skills/package.js.map +1 -0
  70. package/dist/core/skills/policy.d.ts +18 -0
  71. package/dist/core/skills/policy.d.ts.map +1 -0
  72. package/dist/core/skills/policy.js +69 -0
  73. package/dist/core/skills/policy.js.map +1 -0
  74. package/dist/core/skills/prompt.d.ts +3 -0
  75. package/dist/core/skills/prompt.d.ts.map +1 -0
  76. package/dist/core/skills/prompt.js +25 -0
  77. package/dist/core/skills/prompt.js.map +1 -0
  78. package/dist/core/skills/references.d.ts +21 -0
  79. package/dist/core/skills/references.d.ts.map +1 -0
  80. package/dist/core/skills/references.js +27 -0
  81. package/dist/core/skills/references.js.map +1 -0
  82. package/dist/core/skills/registry-paths.d.ts +5 -0
  83. package/dist/core/skills/registry-paths.d.ts.map +1 -0
  84. package/dist/core/skills/registry-paths.js +15 -0
  85. package/dist/core/skills/registry-paths.js.map +1 -0
  86. package/dist/core/skills/resource-reader.d.ts +9 -0
  87. package/dist/core/skills/resource-reader.d.ts.map +1 -0
  88. package/dist/core/skills/resource-reader.js +97 -0
  89. package/dist/core/skills/resource-reader.js.map +1 -0
  90. package/dist/core/skills/session-resolver.d.ts +14 -0
  91. package/dist/core/skills/session-resolver.d.ts.map +1 -0
  92. package/dist/core/skills/session-resolver.js +24 -0
  93. package/dist/core/skills/session-resolver.js.map +1 -0
  94. package/dist/core/skills/session-runtime.d.ts +14 -0
  95. package/dist/core/skills/session-runtime.d.ts.map +1 -0
  96. package/dist/core/skills/session-runtime.js +32 -0
  97. package/dist/core/skills/session-runtime.js.map +1 -0
  98. package/dist/core/skills/sources.d.ts +21 -0
  99. package/dist/core/skills/sources.d.ts.map +1 -0
  100. package/dist/core/skills/sources.js +155 -0
  101. package/dist/core/skills/sources.js.map +1 -0
  102. package/dist/core/skills/types.d.ts +71 -0
  103. package/dist/core/skills/types.d.ts.map +1 -0
  104. package/dist/core/skills/types.js +2 -0
  105. package/dist/core/skills/types.js.map +1 -0
  106. package/dist/core/types.d.ts +10 -3
  107. package/dist/core/types.d.ts.map +1 -1
  108. package/dist/core/types.js.map +1 -1
  109. package/dist/core/worker-pool.d.ts +14 -1
  110. package/dist/core/worker-pool.d.ts.map +1 -1
  111. package/dist/core/worker-pool.js +89 -62
  112. package/dist/core/worker-pool.js.map +1 -1
  113. package/dist/daemon.d.ts +2 -2
  114. package/dist/daemon.d.ts.map +1 -1
  115. package/dist/daemon.js +49 -52
  116. package/dist/daemon.js.map +1 -1
  117. package/dist/dashboard/skill-install-request.d.ts +21 -0
  118. package/dist/dashboard/skill-install-request.d.ts.map +1 -0
  119. package/dist/dashboard/skill-install-request.js +62 -0
  120. package/dist/dashboard/skill-install-request.js.map +1 -0
  121. package/dist/dashboard/web/app.d.ts.map +1 -1
  122. package/dist/dashboard/web/app.js +4 -1
  123. package/dist/dashboard/web/app.js.map +1 -1
  124. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  125. package/dist/dashboard/web/i18n.js +138 -0
  126. package/dist/dashboard/web/i18n.js.map +1 -1
  127. package/dist/dashboard/web/skills.d.ts +2 -0
  128. package/dist/dashboard/web/skills.d.ts.map +1 -0
  129. package/dist/dashboard/web/skills.js +539 -0
  130. package/dist/dashboard/web/skills.js.map +1 -0
  131. package/dist/dashboard-web/app.js +594 -451
  132. package/dist/dashboard-web/index.html +1 -0
  133. package/dist/dashboard-web/style.css +793 -0
  134. package/dist/dashboard.js +231 -0
  135. package/dist/dashboard.js.map +1 -1
  136. package/dist/global-config.d.ts +7 -0
  137. package/dist/global-config.d.ts.map +1 -1
  138. package/dist/global-config.js +16 -0
  139. package/dist/global-config.js.map +1 -1
  140. package/dist/i18n/en.d.ts.map +1 -1
  141. package/dist/i18n/en.js +2 -5
  142. package/dist/i18n/en.js.map +1 -1
  143. package/dist/i18n/zh.d.ts.map +1 -1
  144. package/dist/i18n/zh.js +2 -5
  145. package/dist/i18n/zh.js.map +1 -1
  146. package/dist/im/lark/card-builder.d.ts +0 -3
  147. package/dist/im/lark/card-builder.d.ts.map +1 -1
  148. package/dist/im/lark/card-builder.js +0 -33
  149. package/dist/im/lark/card-builder.js.map +1 -1
  150. package/dist/services/bot-config-store.d.ts +4 -4
  151. package/dist/services/bot-config-store.d.ts.map +1 -1
  152. package/dist/services/bot-config-store.js +24 -1
  153. package/dist/services/bot-config-store.js.map +1 -1
  154. package/dist/services/session-store.d.ts +1 -0
  155. package/dist/services/session-store.d.ts.map +1 -1
  156. package/dist/services/session-store.js +12 -5
  157. package/dist/services/session-store.js.map +1 -1
  158. package/dist/services/skill-registry-store.d.ts +42 -0
  159. package/dist/services/skill-registry-store.d.ts.map +1 -0
  160. package/dist/services/skill-registry-store.js +343 -0
  161. package/dist/services/skill-registry-store.js.map +1 -0
  162. package/dist/skills/installer.d.ts.map +1 -1
  163. package/dist/skills/installer.js +3 -0
  164. package/dist/skills/installer.js.map +1 -1
  165. package/dist/types.d.ts +2 -5
  166. package/dist/types.d.ts.map +1 -1
  167. package/dist/utils/file-lock.d.ts +1 -0
  168. package/dist/utils/file-lock.d.ts.map +1 -1
  169. package/dist/utils/file-lock.js +87 -1
  170. package/dist/utils/file-lock.js.map +1 -1
  171. package/dist/worker.js +2 -0
  172. package/dist/worker.js.map +1 -1
  173. package/dist/workflows/definition.d.ts +16 -16
  174. package/dist/workflows/events/schema.d.ts +280 -280
  175. package/package.json +1 -1
  176. package/dist/services/pending-response-transaction-store.d.ts +0 -12
  177. package/dist/services/pending-response-transaction-store.d.ts.map +0 -1
  178. package/dist/services/pending-response-transaction-store.js +0 -52
  179. 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,3 @@
1
+ import type { SessionSkillManifest } from './types.js';
2
+ export declare function renderSkillCatalogBlock(manifest: SessionSkillManifest | null | undefined): string;
3
+ //# sourceMappingURL=prompt.d.ts.map
@@ -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, '&amp;')
4
+ .replace(/</g, '&lt;')
5
+ .replace(/>/g, '&gt;')
6
+ .replace(/"/g, '&quot;');
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,5 @@
1
+ export declare function botmuxSkillsHome(): string;
2
+ export declare function skillRegistryPath(): string;
3
+ export declare function skillStoreDir(): string;
4
+ export declare function skillSourcesDir(): string;
5
+ //# sourceMappingURL=registry-paths.d.ts.map
@@ -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"}