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.
- package/dist/.runtime-build-id +1 -1
- package/dist/adapters/backend/riff-backend.d.ts +18 -0
- package/dist/adapters/backend/riff-backend.d.ts.map +1 -1
- package/dist/adapters/backend/riff-backend.js +143 -0
- package/dist/adapters/backend/riff-backend.js.map +1 -1
- package/dist/adapters/cli/kimi.d.ts.map +1 -1
- package/dist/adapters/cli/kimi.js +22 -8
- package/dist/adapters/cli/kimi.js.map +1 -1
- package/dist/adapters/cli/pi.d.ts.map +1 -1
- package/dist/adapters/cli/pi.js +3 -1
- package/dist/adapters/cli/pi.js.map +1 -1
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +4 -1
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +65 -27
- package/dist/cli.js.map +1 -1
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +16 -2
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/dashboard-ipc-server.js +1 -1
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/dashboard-rows.d.ts +17 -1
- package/dist/core/dashboard-rows.d.ts.map +1 -1
- package/dist/core/dashboard-rows.js +13 -1
- package/dist/core/dashboard-rows.js.map +1 -1
- package/dist/core/maintenance.d.ts.map +1 -1
- package/dist/core/maintenance.js +5 -0
- package/dist/core/maintenance.js.map +1 -1
- package/dist/core/skills/cli-admin-command.d.ts.map +1 -1
- package/dist/core/skills/cli-admin-command.js +142 -3
- package/dist/core/skills/cli-admin-command.js.map +1 -1
- package/dist/core/skills/frontmatter.d.ts.map +1 -1
- package/dist/core/skills/frontmatter.js +44 -7
- package/dist/core/skills/frontmatter.js.map +1 -1
- package/dist/core/skills/im-command.d.ts +6 -0
- package/dist/core/skills/im-command.d.ts.map +1 -1
- package/dist/core/skills/im-command.js +34 -7
- package/dist/core/skills/im-command.js.map +1 -1
- package/dist/core/skills/install-command.d.ts +4 -0
- package/dist/core/skills/install-command.d.ts.map +1 -0
- package/dist/core/skills/install-command.js +89 -0
- package/dist/core/skills/install-command.js.map +1 -0
- package/dist/core/skills/package.d.ts.map +1 -1
- package/dist/core/skills/package.js +10 -3
- package/dist/core/skills/package.js.map +1 -1
- package/dist/core/skills/policy.d.ts +5 -1
- package/dist/core/skills/policy.d.ts.map +1 -1
- package/dist/core/skills/policy.js +66 -3
- package/dist/core/skills/policy.js.map +1 -1
- package/dist/core/skills/references.d.ts +9 -1
- package/dist/core/skills/references.d.ts.map +1 -1
- package/dist/core/skills/references.js +35 -2
- package/dist/core/skills/references.js.map +1 -1
- package/dist/core/skills/registry-paths.d.ts +1 -0
- package/dist/core/skills/registry-paths.d.ts.map +1 -1
- package/dist/core/skills/registry-paths.js +3 -0
- package/dist/core/skills/registry-paths.js.map +1 -1
- package/dist/core/skills/session-resolver.d.ts +2 -1
- package/dist/core/skills/session-resolver.d.ts.map +1 -1
- package/dist/core/skills/session-resolver.js +1 -0
- package/dist/core/skills/session-resolver.js.map +1 -1
- package/dist/core/skills/session-runtime.d.ts.map +1 -1
- package/dist/core/skills/session-runtime.js +2 -0
- package/dist/core/skills/session-runtime.js.map +1 -1
- package/dist/core/skills/sources.d.ts +23 -0
- package/dist/core/skills/sources.d.ts.map +1 -1
- package/dist/core/skills/sources.js +128 -12
- package/dist/core/skills/sources.js.map +1 -1
- package/dist/core/skills/types.d.ts +22 -1
- package/dist/core/skills/types.d.ts.map +1 -1
- package/dist/core/types.d.ts +2 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +52 -1
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/dashboard/bot-onboarding.d.ts.map +1 -1
- package/dist/dashboard/bot-onboarding.js +2 -114
- package/dist/dashboard/bot-onboarding.js.map +1 -1
- package/dist/dashboard/connector-api.d.ts.map +1 -1
- package/dist/dashboard/connector-api.js +66 -6
- package/dist/dashboard/connector-api.js.map +1 -1
- package/dist/dashboard/public-redact.d.ts.map +1 -1
- package/dist/dashboard/public-redact.js +3 -0
- package/dist/dashboard/public-redact.js.map +1 -1
- package/dist/dashboard/skill-install-request.js +10 -11
- package/dist/dashboard/skill-install-request.js.map +1 -1
- package/dist/dashboard/skill-pack-response.d.ts +15 -0
- package/dist/dashboard/skill-pack-response.d.ts.map +1 -0
- package/dist/dashboard/skill-pack-response.js +32 -0
- package/dist/dashboard/skill-pack-response.js.map +1 -0
- package/dist/dashboard/web/connectors-page.d.ts +69 -0
- package/dist/dashboard/web/connectors-page.d.ts.map +1 -1
- package/dist/dashboard/web/connectors-page.js +47 -7
- package/dist/dashboard/web/connectors-page.js.map +1 -1
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +301 -26
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/preferences.d.ts +4 -2
- package/dist/dashboard/web/preferences.d.ts.map +1 -1
- package/dist/dashboard/web/preferences.js +14 -6
- package/dist/dashboard/web/preferences.js.map +1 -1
- package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
- package/dist/dashboard/web/sessions-page.js +99 -3
- package/dist/dashboard/web/sessions-page.js.map +1 -1
- package/dist/dashboard/web/sessions.d.ts +3 -1
- package/dist/dashboard/web/sessions.d.ts.map +1 -1
- package/dist/dashboard/web/sessions.js +13 -6
- package/dist/dashboard/web/sessions.js.map +1 -1
- package/dist/dashboard/web/skills/bot-assignments-tab.d.ts +27 -0
- package/dist/dashboard/web/skills/bot-assignments-tab.d.ts.map +1 -0
- package/dist/dashboard/web/skills/bot-assignments-tab.js +257 -0
- package/dist/dashboard/web/skills/bot-assignments-tab.js.map +1 -0
- package/dist/dashboard/web/skills/delivery-settings-tab.d.ts +25 -0
- package/dist/dashboard/web/skills/delivery-settings-tab.d.ts.map +1 -0
- package/dist/dashboard/web/skills/delivery-settings-tab.js +20 -0
- package/dist/dashboard/web/skills/delivery-settings-tab.js.map +1 -0
- package/dist/dashboard/web/skills/shared.d.ts +86 -0
- package/dist/dashboard/web/skills/shared.d.ts.map +1 -0
- package/dist/dashboard/web/skills/shared.js +178 -0
- package/dist/dashboard/web/skills/shared.js.map +1 -0
- package/dist/dashboard/web/skills/skill-library-tab.d.ts +75 -0
- package/dist/dashboard/web/skills/skill-library-tab.d.ts.map +1 -0
- package/dist/dashboard/web/skills/skill-library-tab.js +108 -0
- package/dist/dashboard/web/skills/skill-library-tab.js.map +1 -0
- package/dist/dashboard/web/skills/skill-packs-tab.d.ts +21 -0
- package/dist/dashboard/web/skills/skill-packs-tab.d.ts.map +1 -0
- package/dist/dashboard/web/skills/skill-packs-tab.js +185 -0
- package/dist/dashboard/web/skills/skill-packs-tab.js.map +1 -0
- package/dist/dashboard/web/skills/types.d.ts +95 -0
- package/dist/dashboard/web/skills/types.d.ts.map +1 -0
- package/dist/dashboard/web/skills/types.js +2 -0
- package/dist/dashboard/web/skills/types.js.map +1 -0
- package/dist/dashboard/web/skills/use-skills-data.d.ts +31 -0
- package/dist/dashboard/web/skills/use-skills-data.d.ts.map +1 -0
- package/dist/dashboard/web/skills/use-skills-data.js +86 -0
- package/dist/dashboard/web/skills/use-skills-data.js.map +1 -0
- package/dist/dashboard/web/skills-page.d.ts +34 -31
- package/dist/dashboard/web/skills-page.d.ts.map +1 -1
- package/dist/dashboard/web/skills-page.js +321 -176
- package/dist/dashboard/web/skills-page.js.map +1 -1
- package/dist/dashboard/webhook-routes.d.ts +18 -0
- package/dist/dashboard/webhook-routes.d.ts.map +1 -1
- package/dist/dashboard/webhook-routes.js +35 -1
- package/dist/dashboard/webhook-routes.js.map +1 -1
- package/dist/dashboard-web/app.js +1 -1
- package/dist/dashboard-web/chunks/{bot-defaults-page-USC6EZXP.js → bot-defaults-page-HL655CNR.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-KOPISPHN.js → chunk-5PAYQ3KT.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-RXRJB5SO.js → chunk-5ZL7NLR5.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-A7VC4BXR.js → chunk-BFUTTYVK.js} +1 -1
- package/dist/dashboard-web/chunks/chunk-ELL53D62.js +55 -0
- package/dist/dashboard-web/chunks/connectors-page-3QQACF23.js +1 -0
- package/dist/dashboard-web/chunks/{groups-page-C6NSDTIN.js → groups-page-SDZMJ7UV.js} +1 -1
- package/dist/dashboard-web/chunks/{insights-page-UTOVYLLY.js → insights-page-ZZ3JEJ6L.js} +1 -1
- package/dist/dashboard-web/chunks/{monitor-room-UKTJYTA2.js → monitor-room-ROJ5GZ4N.js} +1 -1
- package/dist/dashboard-web/chunks/{monitoring-page-Q3CEZIVX.js → monitoring-page-IATV7KJF.js} +1 -1
- package/dist/dashboard-web/chunks/{office-page-GYCZOOVJ.js → office-page-TYO5OIIT.js} +1 -1
- package/dist/dashboard-web/chunks/{overview-page-W2VBJ6OH.js → overview-page-VJUULZF2.js} +1 -1
- package/dist/dashboard-web/chunks/{roles-page-U4SHER4K.js → roles-page-7RJJKZGK.js} +1 -1
- package/dist/dashboard-web/chunks/{schedules-page-TNPW3N3Q.js → schedules-page-JTEJ5IXW.js} +1 -1
- package/dist/dashboard-web/chunks/sessions-page-KD7HDT3U.js +8 -0
- package/dist/dashboard-web/chunks/{settings-page-VKW5ZK5K.js → settings-page-7CTTFBRS.js} +1 -1
- package/dist/dashboard-web/chunks/skills-page-57NZECJ3.js +4 -0
- package/dist/dashboard-web/chunks/{team-federation-page-OMFGGBT2.js → team-federation-page-6YYIMJG3.js} +1 -1
- package/dist/dashboard-web/chunks/{v3-page-PLXWK4KO.js → v3-page-ZGKBSBK3.js} +1 -1
- package/dist/dashboard-web/chunks/{whiteboards-page-NJQOEO2P.js → whiteboards-page-AACJF6DB.js} +1 -1
- package/dist/dashboard-web/style.css +1623 -160
- package/dist/dashboard.js +200 -16
- package/dist/dashboard.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +2 -0
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +2 -0
- package/dist/i18n/zh.js.map +1 -1
- package/dist/index-daemon.js +6 -1
- package/dist/index-daemon.js.map +1 -1
- package/dist/services/connector-store.d.ts +14 -1
- package/dist/services/connector-store.d.ts.map +1 -1
- package/dist/services/connector-store.js.map +1 -1
- package/dist/services/connector-topic-template.d.ts +7 -0
- package/dist/services/connector-topic-template.d.ts.map +1 -0
- package/dist/services/connector-topic-template.js +210 -0
- package/dist/services/connector-topic-template.js.map +1 -0
- package/dist/services/project-scanner.d.ts +33 -0
- package/dist/services/project-scanner.d.ts.map +1 -1
- package/dist/services/project-scanner.js +40 -1
- package/dist/services/project-scanner.js.map +1 -1
- package/dist/services/skill-pack-store.d.ts +50 -0
- package/dist/services/skill-pack-store.d.ts.map +1 -0
- package/dist/services/skill-pack-store.js +270 -0
- package/dist/services/skill-pack-store.js.map +1 -0
- package/dist/services/skill-registry-store.d.ts +8 -0
- package/dist/services/skill-registry-store.d.ts.map +1 -1
- package/dist/services/skill-registry-store.js +100 -68
- package/dist/services/skill-registry-store.js.map +1 -1
- package/dist/services/todo-state.d.ts +74 -0
- package/dist/services/todo-state.d.ts.map +1 -0
- package/dist/services/todo-state.js +351 -0
- package/dist/services/todo-state.js.map +1 -0
- package/dist/setup/agent-preset.d.ts.map +1 -1
- package/dist/setup/agent-preset.js +2 -0
- package/dist/setup/agent-preset.js.map +1 -1
- package/dist/setup/owner-identity.d.ts +47 -0
- package/dist/setup/owner-identity.d.ts.map +1 -0
- package/dist/setup/owner-identity.js +196 -0
- package/dist/setup/owner-identity.js.map +1 -0
- package/dist/setup/register-app.d.ts +4 -3
- package/dist/setup/register-app.d.ts.map +1 -1
- package/dist/setup/register-app.js.map +1 -1
- package/dist/setup/setup-args.d.ts +1 -1
- package/dist/setup/setup-args.d.ts.map +1 -1
- package/dist/setup/setup-args.js +7 -3
- package/dist/setup/setup-args.js.map +1 -1
- package/dist/types.d.ts +11 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/child-env.d.ts +25 -0
- package/dist/utils/child-env.d.ts.map +1 -1
- package/dist/utils/child-env.js +47 -0
- package/dist/utils/child-env.js.map +1 -1
- package/dist/worker.js +55 -16
- package/dist/worker.js.map +1 -1
- package/dist/workflows/definition.d.ts +44 -44
- package/package.json +1 -1
- package/dist/dashboard-web/chunks/chunk-M6BHWQFO.js +0 -51
- package/dist/dashboard-web/chunks/connectors-page-4Z76HWRH.js +0 -1
- package/dist/dashboard-web/chunks/sessions-page-YWWDDV57.js +0 -6
- 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;
|
|
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
|
-
|
|
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":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C;;sDAEsD;AACtD,SAAS,gBAAgB,CAAC,SAAiB;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACxC,IAAI,EAAE,CAAC;IACP,IAAI,CAAC;QAAC,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAC;IAAC,CAAC;IACvD,IAAI,EAAE,CAAC,MAAM,EAAE;QAAE,OAAO,IAAI,CAAC;IAC7B,IAAI,EAAE,CAAC,WAAW,EAAE;QAAE,OAAO,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/D,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,MAAM,CAAC,IAAY,EAAE,GAAW;IACvC,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,OAAO,IAAI,EAAE,EAAE;YAC7B,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SACvE,CAAC,CAAC,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;
|
|
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"}
|