botmux 3.12.0 → 3.12.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 (229) hide show
  1. package/dist/.runtime-build-id +1 -1
  2. package/dist/adapters/backend/riff-backend.d.ts +18 -0
  3. package/dist/adapters/backend/riff-backend.d.ts.map +1 -1
  4. package/dist/adapters/backend/riff-backend.js +143 -0
  5. package/dist/adapters/backend/riff-backend.js.map +1 -1
  6. package/dist/adapters/cli/kimi.d.ts.map +1 -1
  7. package/dist/adapters/cli/kimi.js +22 -8
  8. package/dist/adapters/cli/kimi.js.map +1 -1
  9. package/dist/adapters/cli/pi.d.ts.map +1 -1
  10. package/dist/adapters/cli/pi.js +3 -1
  11. package/dist/adapters/cli/pi.js.map +1 -1
  12. package/dist/bot-registry.d.ts.map +1 -1
  13. package/dist/bot-registry.js +4 -1
  14. package/dist/bot-registry.js.map +1 -1
  15. package/dist/cli.d.ts.map +1 -1
  16. package/dist/cli.js +65 -27
  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 +16 -2
  20. package/dist/core/command-handler.js.map +1 -1
  21. package/dist/core/dashboard-ipc-server.js +1 -1
  22. package/dist/core/dashboard-ipc-server.js.map +1 -1
  23. package/dist/core/dashboard-rows.d.ts +17 -1
  24. package/dist/core/dashboard-rows.d.ts.map +1 -1
  25. package/dist/core/dashboard-rows.js +13 -1
  26. package/dist/core/dashboard-rows.js.map +1 -1
  27. package/dist/core/maintenance.d.ts.map +1 -1
  28. package/dist/core/maintenance.js +5 -0
  29. package/dist/core/maintenance.js.map +1 -1
  30. package/dist/core/skills/cli-admin-command.d.ts.map +1 -1
  31. package/dist/core/skills/cli-admin-command.js +142 -3
  32. package/dist/core/skills/cli-admin-command.js.map +1 -1
  33. package/dist/core/skills/frontmatter.d.ts.map +1 -1
  34. package/dist/core/skills/frontmatter.js +44 -7
  35. package/dist/core/skills/frontmatter.js.map +1 -1
  36. package/dist/core/skills/im-command.d.ts +6 -0
  37. package/dist/core/skills/im-command.d.ts.map +1 -1
  38. package/dist/core/skills/im-command.js +34 -7
  39. package/dist/core/skills/im-command.js.map +1 -1
  40. package/dist/core/skills/install-command.d.ts +4 -0
  41. package/dist/core/skills/install-command.d.ts.map +1 -0
  42. package/dist/core/skills/install-command.js +89 -0
  43. package/dist/core/skills/install-command.js.map +1 -0
  44. package/dist/core/skills/package.d.ts.map +1 -1
  45. package/dist/core/skills/package.js +10 -3
  46. package/dist/core/skills/package.js.map +1 -1
  47. package/dist/core/skills/policy.d.ts +5 -1
  48. package/dist/core/skills/policy.d.ts.map +1 -1
  49. package/dist/core/skills/policy.js +66 -3
  50. package/dist/core/skills/policy.js.map +1 -1
  51. package/dist/core/skills/references.d.ts +9 -1
  52. package/dist/core/skills/references.d.ts.map +1 -1
  53. package/dist/core/skills/references.js +35 -2
  54. package/dist/core/skills/references.js.map +1 -1
  55. package/dist/core/skills/registry-paths.d.ts +1 -0
  56. package/dist/core/skills/registry-paths.d.ts.map +1 -1
  57. package/dist/core/skills/registry-paths.js +3 -0
  58. package/dist/core/skills/registry-paths.js.map +1 -1
  59. package/dist/core/skills/session-resolver.d.ts +2 -1
  60. package/dist/core/skills/session-resolver.d.ts.map +1 -1
  61. package/dist/core/skills/session-resolver.js +1 -0
  62. package/dist/core/skills/session-resolver.js.map +1 -1
  63. package/dist/core/skills/session-runtime.d.ts.map +1 -1
  64. package/dist/core/skills/session-runtime.js +2 -0
  65. package/dist/core/skills/session-runtime.js.map +1 -1
  66. package/dist/core/skills/sources.d.ts +23 -0
  67. package/dist/core/skills/sources.d.ts.map +1 -1
  68. package/dist/core/skills/sources.js +128 -12
  69. package/dist/core/skills/sources.js.map +1 -1
  70. package/dist/core/skills/types.d.ts +22 -1
  71. package/dist/core/skills/types.d.ts.map +1 -1
  72. package/dist/core/types.d.ts +2 -0
  73. package/dist/core/types.d.ts.map +1 -1
  74. package/dist/core/types.js.map +1 -1
  75. package/dist/core/worker-pool.d.ts.map +1 -1
  76. package/dist/core/worker-pool.js +52 -1
  77. package/dist/core/worker-pool.js.map +1 -1
  78. package/dist/dashboard/bot-onboarding.d.ts.map +1 -1
  79. package/dist/dashboard/bot-onboarding.js +2 -114
  80. package/dist/dashboard/bot-onboarding.js.map +1 -1
  81. package/dist/dashboard/connector-api.d.ts.map +1 -1
  82. package/dist/dashboard/connector-api.js +66 -6
  83. package/dist/dashboard/connector-api.js.map +1 -1
  84. package/dist/dashboard/public-redact.d.ts.map +1 -1
  85. package/dist/dashboard/public-redact.js +3 -0
  86. package/dist/dashboard/public-redact.js.map +1 -1
  87. package/dist/dashboard/skill-install-request.js +10 -11
  88. package/dist/dashboard/skill-install-request.js.map +1 -1
  89. package/dist/dashboard/skill-pack-response.d.ts +15 -0
  90. package/dist/dashboard/skill-pack-response.d.ts.map +1 -0
  91. package/dist/dashboard/skill-pack-response.js +32 -0
  92. package/dist/dashboard/skill-pack-response.js.map +1 -0
  93. package/dist/dashboard/web/connectors-page.d.ts +69 -0
  94. package/dist/dashboard/web/connectors-page.d.ts.map +1 -1
  95. package/dist/dashboard/web/connectors-page.js +47 -7
  96. package/dist/dashboard/web/connectors-page.js.map +1 -1
  97. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  98. package/dist/dashboard/web/i18n.js +301 -26
  99. package/dist/dashboard/web/i18n.js.map +1 -1
  100. package/dist/dashboard/web/preferences.d.ts +4 -2
  101. package/dist/dashboard/web/preferences.d.ts.map +1 -1
  102. package/dist/dashboard/web/preferences.js +14 -6
  103. package/dist/dashboard/web/preferences.js.map +1 -1
  104. package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
  105. package/dist/dashboard/web/sessions-page.js +99 -3
  106. package/dist/dashboard/web/sessions-page.js.map +1 -1
  107. package/dist/dashboard/web/sessions.d.ts +3 -1
  108. package/dist/dashboard/web/sessions.d.ts.map +1 -1
  109. package/dist/dashboard/web/sessions.js +13 -6
  110. package/dist/dashboard/web/sessions.js.map +1 -1
  111. package/dist/dashboard/web/skills/bot-assignments-tab.d.ts +27 -0
  112. package/dist/dashboard/web/skills/bot-assignments-tab.d.ts.map +1 -0
  113. package/dist/dashboard/web/skills/bot-assignments-tab.js +257 -0
  114. package/dist/dashboard/web/skills/bot-assignments-tab.js.map +1 -0
  115. package/dist/dashboard/web/skills/delivery-settings-tab.d.ts +25 -0
  116. package/dist/dashboard/web/skills/delivery-settings-tab.d.ts.map +1 -0
  117. package/dist/dashboard/web/skills/delivery-settings-tab.js +20 -0
  118. package/dist/dashboard/web/skills/delivery-settings-tab.js.map +1 -0
  119. package/dist/dashboard/web/skills/shared.d.ts +86 -0
  120. package/dist/dashboard/web/skills/shared.d.ts.map +1 -0
  121. package/dist/dashboard/web/skills/shared.js +178 -0
  122. package/dist/dashboard/web/skills/shared.js.map +1 -0
  123. package/dist/dashboard/web/skills/skill-library-tab.d.ts +75 -0
  124. package/dist/dashboard/web/skills/skill-library-tab.d.ts.map +1 -0
  125. package/dist/dashboard/web/skills/skill-library-tab.js +108 -0
  126. package/dist/dashboard/web/skills/skill-library-tab.js.map +1 -0
  127. package/dist/dashboard/web/skills/skill-packs-tab.d.ts +21 -0
  128. package/dist/dashboard/web/skills/skill-packs-tab.d.ts.map +1 -0
  129. package/dist/dashboard/web/skills/skill-packs-tab.js +185 -0
  130. package/dist/dashboard/web/skills/skill-packs-tab.js.map +1 -0
  131. package/dist/dashboard/web/skills/types.d.ts +95 -0
  132. package/dist/dashboard/web/skills/types.d.ts.map +1 -0
  133. package/dist/dashboard/web/skills/types.js +2 -0
  134. package/dist/dashboard/web/skills/types.js.map +1 -0
  135. package/dist/dashboard/web/skills/use-skills-data.d.ts +31 -0
  136. package/dist/dashboard/web/skills/use-skills-data.d.ts.map +1 -0
  137. package/dist/dashboard/web/skills/use-skills-data.js +86 -0
  138. package/dist/dashboard/web/skills/use-skills-data.js.map +1 -0
  139. package/dist/dashboard/web/skills-page.d.ts +34 -31
  140. package/dist/dashboard/web/skills-page.d.ts.map +1 -1
  141. package/dist/dashboard/web/skills-page.js +321 -176
  142. package/dist/dashboard/web/skills-page.js.map +1 -1
  143. package/dist/dashboard/webhook-routes.d.ts +18 -0
  144. package/dist/dashboard/webhook-routes.d.ts.map +1 -1
  145. package/dist/dashboard/webhook-routes.js +35 -1
  146. package/dist/dashboard/webhook-routes.js.map +1 -1
  147. package/dist/dashboard-web/app.js +1 -1
  148. package/dist/dashboard-web/chunks/{bot-defaults-page-USC6EZXP.js → bot-defaults-page-HL655CNR.js} +1 -1
  149. package/dist/dashboard-web/chunks/{chunk-KOPISPHN.js → chunk-5PAYQ3KT.js} +1 -1
  150. package/dist/dashboard-web/chunks/{chunk-RXRJB5SO.js → chunk-5ZL7NLR5.js} +1 -1
  151. package/dist/dashboard-web/chunks/{chunk-A7VC4BXR.js → chunk-BFUTTYVK.js} +1 -1
  152. package/dist/dashboard-web/chunks/chunk-ELL53D62.js +55 -0
  153. package/dist/dashboard-web/chunks/connectors-page-3QQACF23.js +1 -0
  154. package/dist/dashboard-web/chunks/{groups-page-C6NSDTIN.js → groups-page-SDZMJ7UV.js} +1 -1
  155. package/dist/dashboard-web/chunks/{insights-page-UTOVYLLY.js → insights-page-ZZ3JEJ6L.js} +1 -1
  156. package/dist/dashboard-web/chunks/{monitor-room-UKTJYTA2.js → monitor-room-ROJ5GZ4N.js} +1 -1
  157. package/dist/dashboard-web/chunks/{monitoring-page-Q3CEZIVX.js → monitoring-page-IATV7KJF.js} +1 -1
  158. package/dist/dashboard-web/chunks/{office-page-GYCZOOVJ.js → office-page-TYO5OIIT.js} +1 -1
  159. package/dist/dashboard-web/chunks/{overview-page-W2VBJ6OH.js → overview-page-VJUULZF2.js} +1 -1
  160. package/dist/dashboard-web/chunks/{roles-page-U4SHER4K.js → roles-page-7RJJKZGK.js} +1 -1
  161. package/dist/dashboard-web/chunks/{schedules-page-TNPW3N3Q.js → schedules-page-JTEJ5IXW.js} +1 -1
  162. package/dist/dashboard-web/chunks/sessions-page-KD7HDT3U.js +8 -0
  163. package/dist/dashboard-web/chunks/{settings-page-VKW5ZK5K.js → settings-page-7CTTFBRS.js} +1 -1
  164. package/dist/dashboard-web/chunks/skills-page-57NZECJ3.js +4 -0
  165. package/dist/dashboard-web/chunks/{team-federation-page-OMFGGBT2.js → team-federation-page-6YYIMJG3.js} +1 -1
  166. package/dist/dashboard-web/chunks/{v3-page-PLXWK4KO.js → v3-page-ZGKBSBK3.js} +1 -1
  167. package/dist/dashboard-web/chunks/{whiteboards-page-NJQOEO2P.js → whiteboards-page-AACJF6DB.js} +1 -1
  168. package/dist/dashboard-web/style.css +1623 -160
  169. package/dist/dashboard.js +200 -16
  170. package/dist/dashboard.js.map +1 -1
  171. package/dist/i18n/en.d.ts.map +1 -1
  172. package/dist/i18n/en.js +2 -0
  173. package/dist/i18n/en.js.map +1 -1
  174. package/dist/i18n/zh.d.ts.map +1 -1
  175. package/dist/i18n/zh.js +2 -0
  176. package/dist/i18n/zh.js.map +1 -1
  177. package/dist/index-daemon.js +6 -1
  178. package/dist/index-daemon.js.map +1 -1
  179. package/dist/services/connector-store.d.ts +14 -1
  180. package/dist/services/connector-store.d.ts.map +1 -1
  181. package/dist/services/connector-store.js.map +1 -1
  182. package/dist/services/connector-topic-template.d.ts +7 -0
  183. package/dist/services/connector-topic-template.d.ts.map +1 -0
  184. package/dist/services/connector-topic-template.js +210 -0
  185. package/dist/services/connector-topic-template.js.map +1 -0
  186. package/dist/services/project-scanner.d.ts +33 -0
  187. package/dist/services/project-scanner.d.ts.map +1 -1
  188. package/dist/services/project-scanner.js +40 -1
  189. package/dist/services/project-scanner.js.map +1 -1
  190. package/dist/services/skill-pack-store.d.ts +50 -0
  191. package/dist/services/skill-pack-store.d.ts.map +1 -0
  192. package/dist/services/skill-pack-store.js +270 -0
  193. package/dist/services/skill-pack-store.js.map +1 -0
  194. package/dist/services/skill-registry-store.d.ts +8 -0
  195. package/dist/services/skill-registry-store.d.ts.map +1 -1
  196. package/dist/services/skill-registry-store.js +100 -68
  197. package/dist/services/skill-registry-store.js.map +1 -1
  198. package/dist/services/todo-state.d.ts +74 -0
  199. package/dist/services/todo-state.d.ts.map +1 -0
  200. package/dist/services/todo-state.js +351 -0
  201. package/dist/services/todo-state.js.map +1 -0
  202. package/dist/setup/agent-preset.d.ts.map +1 -1
  203. package/dist/setup/agent-preset.js +2 -0
  204. package/dist/setup/agent-preset.js.map +1 -1
  205. package/dist/setup/owner-identity.d.ts +47 -0
  206. package/dist/setup/owner-identity.d.ts.map +1 -0
  207. package/dist/setup/owner-identity.js +196 -0
  208. package/dist/setup/owner-identity.js.map +1 -0
  209. package/dist/setup/register-app.d.ts +4 -3
  210. package/dist/setup/register-app.d.ts.map +1 -1
  211. package/dist/setup/register-app.js.map +1 -1
  212. package/dist/setup/setup-args.d.ts +1 -1
  213. package/dist/setup/setup-args.d.ts.map +1 -1
  214. package/dist/setup/setup-args.js +7 -3
  215. package/dist/setup/setup-args.js.map +1 -1
  216. package/dist/types.d.ts +11 -0
  217. package/dist/types.d.ts.map +1 -1
  218. package/dist/utils/child-env.d.ts +25 -0
  219. package/dist/utils/child-env.d.ts.map +1 -1
  220. package/dist/utils/child-env.js +47 -0
  221. package/dist/utils/child-env.js.map +1 -1
  222. package/dist/worker.js +55 -16
  223. package/dist/worker.js.map +1 -1
  224. package/dist/workflows/definition.d.ts +44 -44
  225. package/package.json +1 -1
  226. package/dist/dashboard-web/chunks/chunk-M6BHWQFO.js +0 -51
  227. package/dist/dashboard-web/chunks/connectors-page-4Z76HWRH.js +0 -1
  228. package/dist/dashboard-web/chunks/sessions-page-YWWDDV57.js +0 -6
  229. package/dist/dashboard-web/chunks/skills-page-ZCEDFGZZ.js +0 -4
@@ -0,0 +1,210 @@
1
+ import { getJsonPathValue } from './webhook-lifecycle-extractors.js';
2
+ const TEMPLATE_TOKEN = /{{\s*(?:(mention)\s+)?([A-Za-z][A-Za-z0-9_.-]{0,63})\s*}}/g;
3
+ const MAX_TOPIC_MESSAGE_CODEPOINTS = 200;
4
+ const MAX_MENTION_VALUES = 20;
5
+ const MAX_MENTION_NAME_CODEPOINTS = 32;
6
+ const MAX_OPEN_ID_CODEPOINTS = 80;
7
+ const MAX_PROTECTED_POST_MENTION_CODEPOINTS = 16;
8
+ const VALID_OPEN_ID = /^ou_[A-Za-z0-9_-]+$/;
9
+ function scalarText(value) {
10
+ if (typeof value === 'string')
11
+ return value.trim() || undefined;
12
+ if (typeof value === 'number' || typeof value === 'boolean')
13
+ return String(value);
14
+ return undefined;
15
+ }
16
+ /** Neutralize Lark-native tags originating in webhook data. Full-width
17
+ * punctuation keeps the visible information while making `<at>` inert. */
18
+ export function escapeConnectorTopicText(value) {
19
+ return value.replaceAll('&', '&').replaceAll('<', '<').replaceAll('>', '>');
20
+ }
21
+ function mentionCandidates(value, extractor, limit) {
22
+ const values = Array.isArray(value) ? value : [value];
23
+ const candidates = [];
24
+ for (const item of values) {
25
+ if (candidates.length >= limit)
26
+ break;
27
+ const identityValue = extractor.identityPath
28
+ ? getJsonPathValue(item, extractor.identityPath)
29
+ : item;
30
+ const identity = scalarText(identityValue);
31
+ if (!identity || Array.from(identity).length > 320 || /[<>\r\n]/.test(identity))
32
+ continue;
33
+ const extractedName = extractor.namePath
34
+ ? scalarText(getJsonPathValue(item, extractor.namePath))
35
+ : undefined;
36
+ candidates.push({ identity, name: extractedName ?? identity });
37
+ }
38
+ return candidates;
39
+ }
40
+ function codepointLength(value) {
41
+ return Array.from(value).length;
42
+ }
43
+ function truncateCodepoints(value, limit) {
44
+ return Array.from(value).slice(0, Math.max(0, limit)).join('');
45
+ }
46
+ function renderMention(chunk) {
47
+ const name = truncateCodepoints(chunk.name, MAX_MENTION_NAME_CODEPOINTS);
48
+ if (!name)
49
+ return '';
50
+ const separator = chunk.separator ?? '';
51
+ if (chunk.openId) {
52
+ return `${separator}<at user_id="${chunk.openId}">${name}</at>`;
53
+ }
54
+ return `${separator}${name}`;
55
+ }
56
+ function appendStaticChunks(chunks, text, protectPostMention) {
57
+ if (!protectPostMention) {
58
+ chunks.push({ text, kind: 'static' });
59
+ return;
60
+ }
61
+ const protectedText = truncateCodepoints(text, MAX_PROTECTED_POST_MENTION_CODEPOINTS);
62
+ if (protectedText)
63
+ chunks.push({ text: protectedText, kind: 'protected' });
64
+ const remainder = Array.from(text).slice(MAX_PROTECTED_POST_MENTION_CODEPOINTS).join('');
65
+ if (remainder)
66
+ chunks.push({ text: remainder, kind: 'static' });
67
+ }
68
+ function limitedTopicMessage(chunks) {
69
+ const protectedLength = chunks
70
+ .filter((chunk) => chunk.kind === 'protected')
71
+ .reduce((total, chunk) => total + codepointLength(chunk.text), 0);
72
+ let protectedBudget = Math.min(protectedLength, MAX_TOPIC_MESSAGE_CODEPOINTS);
73
+ let remainingBudget = MAX_TOPIC_MESSAGE_CODEPOINTS - protectedBudget;
74
+ const mentions = chunks.filter((chunk) => chunk.kind === 'mention');
75
+ const mentionText = new Map();
76
+ const desiredMentions = mentions.map(renderMention);
77
+ const desiredMentionLength = desiredMentions.reduce((total, value) => total + codepointLength(value), 0);
78
+ if (desiredMentionLength <= remainingBudget) {
79
+ mentions.forEach((chunk, index) => mentionText.set(chunk, desiredMentions[index]));
80
+ remainingBudget -= desiredMentionLength;
81
+ }
82
+ else {
83
+ for (const [index, chunk] of mentions.entries()) {
84
+ const rendered = desiredMentions[index];
85
+ const renderedLength = codepointLength(rendered);
86
+ if (renderedLength > remainingBudget)
87
+ break;
88
+ mentionText.set(chunk, rendered);
89
+ remainingBudget -= renderedLength;
90
+ }
91
+ }
92
+ const staticLength = chunks
93
+ .filter((chunk) => chunk.kind === 'static')
94
+ .reduce((total, chunk) => total + codepointLength(chunk.text), 0);
95
+ let staticBudget = Math.min(staticLength, remainingBudget);
96
+ remainingBudget -= staticBudget;
97
+ let flexibleBudget = remainingBudget;
98
+ const output = [];
99
+ for (const chunk of chunks) {
100
+ if (chunk.kind === 'mention') {
101
+ const rendered = mentionText.get(chunk);
102
+ if (rendered)
103
+ output.push(rendered);
104
+ continue;
105
+ }
106
+ const budget = chunk.kind === 'protected'
107
+ ? protectedBudget
108
+ : chunk.kind === 'static'
109
+ ? staticBudget
110
+ : flexibleBudget;
111
+ const take = Math.min(budget, codepointLength(chunk.text));
112
+ if (take > 0)
113
+ output.push(truncateCodepoints(chunk.text, take));
114
+ if (chunk.kind === 'protected')
115
+ protectedBudget -= take;
116
+ else if (chunk.kind === 'static')
117
+ staticBudget -= take;
118
+ else
119
+ flexibleBudget -= take;
120
+ }
121
+ return output.join('').trim();
122
+ }
123
+ export async function renderConnectorTopicTemplate(connector, payload, resolveIdentities) {
124
+ const topicMessage = connector.topicMessage;
125
+ if (topicMessage?.mode !== 'template' || !topicMessage.text || !topicMessage.extractors)
126
+ return undefined;
127
+ const mentionValues = new Map();
128
+ const identities = [];
129
+ let mentionCount = 0;
130
+ const referencedMentionAliases = new Set([...topicMessage.text.matchAll(TEMPLATE_TOKEN)]
131
+ .filter(match => Boolean(match[1]))
132
+ .map(match => match[2]));
133
+ for (const [alias, extractor] of Object.entries(topicMessage.extractors)) {
134
+ if (extractor.kind !== 'mention' || !referencedMentionAliases.has(alias))
135
+ continue;
136
+ const candidates = mentionCandidates(getJsonPathValue(payload, extractor.path), extractor, Math.max(0, MAX_MENTION_VALUES - mentionCount));
137
+ mentionValues.set(alias, candidates);
138
+ mentionCount += candidates.length;
139
+ for (const candidate of candidates) {
140
+ if (!identities.includes(candidate.identity))
141
+ identities.push(candidate.identity);
142
+ }
143
+ }
144
+ let resolved = new Map();
145
+ if (identities.length > 0) {
146
+ try {
147
+ resolved = await resolveIdentities(connector.target.botId, identities);
148
+ }
149
+ catch {
150
+ // Identity lookup is best-effort. A contact outage must not discard the
151
+ // whole authenticated webhook; unresolved entries fall back to safe text.
152
+ }
153
+ }
154
+ const source = connector.promptEnvelope.sourceName || connector.name;
155
+ const chunks = [];
156
+ let cursor = 0;
157
+ let previousTokenWasMention = false;
158
+ for (const match of topicMessage.text.matchAll(TEMPLATE_TOKEN)) {
159
+ const index = match.index ?? 0;
160
+ if (index > cursor) {
161
+ appendStaticChunks(chunks, topicMessage.text.slice(cursor, index), previousTokenWasMention);
162
+ }
163
+ const mention = match[1];
164
+ const alias = match[2];
165
+ if (alias === 'source') {
166
+ chunks.push({ text: escapeConnectorTopicText(source), kind: 'flexible' });
167
+ cursor = index + match[0].length;
168
+ previousTokenWasMention = false;
169
+ continue;
170
+ }
171
+ const extractor = topicMessage.extractors?.[alias];
172
+ if (!extractor) {
173
+ cursor = index + match[0].length;
174
+ previousTokenWasMention = false;
175
+ continue;
176
+ }
177
+ if (!mention) {
178
+ const value = scalarText(getJsonPathValue(payload, extractor.path));
179
+ if (value)
180
+ chunks.push({ text: escapeConnectorTopicText(value), kind: 'flexible' });
181
+ cursor = index + match[0].length;
182
+ previousTokenWasMention = false;
183
+ continue;
184
+ }
185
+ const renderedMentions = (mentionValues.get(alias) ?? []).map(candidate => {
186
+ const openId = resolved.get(candidate.identity);
187
+ const name = escapeConnectorTopicText(candidate.name);
188
+ return {
189
+ kind: 'mention',
190
+ name,
191
+ ...(openId
192
+ && codepointLength(openId) <= MAX_OPEN_ID_CODEPOINTS
193
+ && VALID_OPEN_ID.test(openId)
194
+ ? { openId }
195
+ : {}),
196
+ };
197
+ });
198
+ renderedMentions.forEach((value, position) => chunks.push({
199
+ ...value,
200
+ ...(position > 0 ? { separator: ' ' } : {}),
201
+ }));
202
+ cursor = index + match[0].length;
203
+ previousTokenWasMention = true;
204
+ }
205
+ if (cursor < topicMessage.text.length) {
206
+ appendStaticChunks(chunks, topicMessage.text.slice(cursor), previousTokenWasMention);
207
+ }
208
+ return limitedTopicMessage(chunks) || undefined;
209
+ }
210
+ //# sourceMappingURL=connector-topic-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connector-topic-template.js","sourceRoot":"","sources":["../../src/services/connector-topic-template.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,40 @@ export interface ProjectInfo {
6
6
  }
7
7
  export interface ProjectScanOptions {
8
8
  includeWorktrees?: boolean;
9
+ /** Hard cap on directories visited during a single scan. Guards against a
10
+ * misconfigured scan root (e.g. `~`) turning the synchronous walk into a
11
+ * minutes-long event-loop stall. Defaults to DEFAULT_MAX_SCAN_DIRS. */
12
+ maxScanDirs?: number;
13
+ /** Wall-clock budget (ms) for a single scan, checked between filesystem
14
+ * calls. A dir-count cap alone doesn't bound a "repo storm" root where
15
+ * each repo spawns a slow `git` subprocess; this stops the walk once the
16
+ * budget is spent. Defaults to DEFAULT_MAX_SCAN_MS. Note: this cannot
17
+ * interrupt a single syscall already blocked in the kernel (e.g. a
18
+ * readdir that hangs on a protected/stale directory) — only the space
19
+ * between calls. Narrowing the scan root remains the real fix. */
20
+ maxScanMs?: number;
21
+ /** Invoked once, after the walk, if either budget (dirs or wall-clock) was
22
+ * hit — meaning the returned list may be incomplete. Lets a caller surface a
23
+ * "scan root too large / narrow it" hint to the user instead of silently
24
+ * showing a partial list or a misleading "no repos found". Not called when
25
+ * the scan completes within budget. `reason` says which cap tripped. */
26
+ onBudgetExceeded?: (info: {
27
+ reason: 'dirs' | 'time';
28
+ dirsVisited: number;
29
+ baseDir: string;
30
+ }) => void;
9
31
  }
32
+ /** Upper bound on directories a single `scanProjects` walk will visit before
33
+ * bailing out. `scanProjects` is fully synchronous (readdirSync + a `git`
34
+ * subprocess per repo), so an unbounded walk over a huge root such as the
35
+ * home directory blocks the daemon's event loop — no repo card is ever sent
36
+ * and the whole bot appears hung. 4000 dirs comfortably covers a normal
37
+ * projects root while capping the worst case. */
38
+ export declare const DEFAULT_MAX_SCAN_DIRS = 4000;
39
+ /** Wall-clock budget for one scan. A normal projects root scans in well under
40
+ * a second; anything past a few seconds means the root is misconfigured
41
+ * (pointed at `~` or similar). Bailing keeps the daemon responsive. */
42
+ export declare const DEFAULT_MAX_SCAN_MS = 4000;
10
43
  /**
11
44
  * Describe a single directory as a project: the main worktree basename +
12
45
  * current git ref, or null if the directory isn't a git repo/worktree. Using
@@ -1 +1 @@
1
- {"version":3,"file":"project-scanner.d.ts","sourceRoot":"","sources":["../../src/services/project-scanner.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAWvF;AAsFD;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,WAAW,EAAE,CA+CnH;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,QAAQ,GAAE,MAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,WAAW,EAAE,CAe9H"}
1
+ {"version":3,"file":"project-scanner.d.ts","sourceRoot":"","sources":["../../src/services/project-scanner.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;4EAEwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;uEAMmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;6EAIyE;IACzE,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CACtG;AAED;;;;;kDAKkD;AAClD,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAE1C;;wEAEwE;AACxE,eAAO,MAAM,mBAAmB,OAAO,CAAC;AAExC;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAWvF;AAsFD;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,WAAW,EAAE,CAmEnH;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,QAAQ,GAAE,MAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,WAAW,EAAE,CAe9H"}
@@ -30,6 +30,17 @@ function runGit(args, cwd) {
30
30
  return null;
31
31
  }
32
32
  }
33
+ /** Upper bound on directories a single `scanProjects` walk will visit before
34
+ * bailing out. `scanProjects` is fully synchronous (readdirSync + a `git`
35
+ * subprocess per repo), so an unbounded walk over a huge root such as the
36
+ * home directory blocks the daemon's event loop — no repo card is ever sent
37
+ * and the whole bot appears hung. 4000 dirs comfortably covers a normal
38
+ * projects root while capping the worst case. */
39
+ export const DEFAULT_MAX_SCAN_DIRS = 4000;
40
+ /** Wall-clock budget for one scan. A normal projects root scans in well under
41
+ * a second; anything past a few seconds means the root is misconfigured
42
+ * (pointed at `~` or similar). Bailing keeps the daemon responsive. */
43
+ export const DEFAULT_MAX_SCAN_MS = 4000;
33
44
  /**
34
45
  * Describe a single directory as a project: the main worktree basename +
35
46
  * current git ref, or null if the directory isn't a git repo/worktree. Using
@@ -141,9 +152,28 @@ export function scanProjects(baseDir, maxDepth = 3, options = {}) {
141
152
  const projects = [];
142
153
  const seenRepos = new Set(); // by git-common-dir
143
154
  const seenPaths = new Set(); // by absolute path
155
+ const maxScanDirs = options.maxScanDirs ?? DEFAULT_MAX_SCAN_DIRS;
156
+ const maxScanMs = options.maxScanMs ?? DEFAULT_MAX_SCAN_MS;
157
+ const deadline = Date.now() + maxScanMs;
158
+ let dirsVisited = 0;
159
+ let budgetReason = null;
160
+ function overBudget() {
161
+ if (dirsVisited >= maxScanDirs) {
162
+ budgetReason ??= 'dirs';
163
+ return true;
164
+ }
165
+ if (Date.now() >= deadline) {
166
+ budgetReason ??= 'time';
167
+ return true;
168
+ }
169
+ return false;
170
+ }
144
171
  function walk(dir, depth) {
145
172
  if (depth > maxDepth)
146
173
  return;
174
+ if (overBudget())
175
+ return;
176
+ dirsVisited++;
147
177
  let entries;
148
178
  try {
149
179
  entries = readdirSync(dir);
@@ -167,6 +197,8 @@ export function scanProjects(baseDir, maxDepth = 3, options = {}) {
167
197
  for (const entry of entries) {
168
198
  if (entry.startsWith('.') || entry === 'node_modules' || entry === 'vendor' || entry === 'dist')
169
199
  continue;
200
+ if (overBudget())
201
+ return;
170
202
  const fullPath = join(dir, entry);
171
203
  try {
172
204
  if (statSync(fullPath).isDirectory()) {
@@ -180,7 +212,14 @@ export function scanProjects(baseDir, maxDepth = 3, options = {}) {
180
212
  }
181
213
  walk(baseDir, 0);
182
214
  projects.sort(compareProjects);
183
- logger.info(`Scanned ${baseDir}: found ${projects.length} project(s)`);
215
+ if (budgetReason) {
216
+ const limit = budgetReason === 'dirs' ? `${maxScanDirs}-dir` : `${maxScanMs}ms`;
217
+ logger.warn(`Scanned ${baseDir}: hit ${limit} budget after ${dirsVisited} dirs, found ${projects.length} project(s) so far — results may be incomplete. Configure a narrower workingDirs to avoid scanning a huge root.`);
218
+ options.onBudgetExceeded?.({ reason: budgetReason, dirsVisited, baseDir });
219
+ }
220
+ else {
221
+ logger.info(`Scanned ${baseDir}: found ${projects.length} project(s)`);
222
+ }
184
223
  return projects;
185
224
  }
186
225
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"project-scanner.js","sourceRoot":"","sources":["../../src/services/project-scanner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project-scanner.js","sourceRoot":"","sources":["../../src/services/project-scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import type { SkillPack, SkillPackRegistryFile } from '../core/skills/types.js';
2
+ export interface SkillPackInput {
3
+ id: string;
4
+ name: string;
5
+ description?: string;
6
+ tags?: string[];
7
+ include: Array<`skill:${string}`>;
8
+ }
9
+ export interface SkillPackUpdateInput {
10
+ name?: string;
11
+ description?: string | null;
12
+ tags?: string[] | null;
13
+ include?: Array<`skill:${string}`>;
14
+ /** Expected current revision; if it does not match, the update is rejected
15
+ * with `SKILL_PACK_REVISION_CONFLICT` so two dashboard tabs cannot silently
16
+ * overwrite each other. */
17
+ expectedRevision?: number;
18
+ }
19
+ export type SkillPackStoreErrorDetail = {
20
+ code: 'SKILL_PACK_NOT_FOUND';
21
+ id: string;
22
+ } | {
23
+ code: 'SKILL_PACK_ID_CONFLICT';
24
+ id: string;
25
+ } | {
26
+ code: 'SKILL_PACK_INVALID_SELECTOR';
27
+ selector: string;
28
+ } | {
29
+ code: 'SKILL_PACK_INVALID';
30
+ reason: string;
31
+ } | {
32
+ code: 'SKILL_PACK_REVISION_CONFLICT';
33
+ id: string;
34
+ current: number;
35
+ } | {
36
+ code: 'SKILL_PACK_IN_USE';
37
+ id: string;
38
+ };
39
+ export declare class SkillPackStoreError extends Error {
40
+ readonly detail: SkillPackStoreErrorDetail;
41
+ constructor(detail: SkillPackStoreErrorDetail);
42
+ }
43
+ export declare function readSkillPackRegistry(): SkillPackRegistryFile;
44
+ export declare function listSkillPacks(): SkillPack[];
45
+ export declare function getSkillPack(id: string): SkillPack | undefined;
46
+ export declare function createSkillPack(input: SkillPackInput): SkillPack;
47
+ export declare function updateSkillPack(id: string, input: SkillPackUpdateInput): SkillPack;
48
+ export declare function deleteSkillPack(id: string): void;
49
+ export declare function cloneSkillPack(id: string, newId: string): SkillPack;
50
+ //# sourceMappingURL=skill-pack-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-pack-store.d.ts","sourceRoot":"","sources":["../../src/services/skill-pack-store.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAShF,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,KAAK,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACvB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;IACnC;;gCAE4B;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,MAAM,yBAAyB,GACjC;IAAE,IAAI,EAAE,sBAAsB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,wBAAwB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,6BAA6B,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,8BAA8B,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACrE;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9C,qBAAa,mBAAoB,SAAQ,KAAK;aAChB,MAAM,EAAE,yBAAyB;gBAAjC,MAAM,EAAE,yBAAyB;CAI9D;AAsCD,wBAAgB,qBAAqB,IAAI,qBAAqB,CAE7D;AA4HD,wBAAgB,cAAc,IAAI,SAAS,EAAE,CAE5C;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAG9D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS,CAoBhE;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,oBAAoB,GAAG,SAAS,CAmBlF;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAKhD;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,CAsBnE"}