sparkecoder 0.1.119 → 0.1.120
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/agent/index.d.ts +3 -3
- package/dist/agent/index.js +2 -0
- package/dist/agent/index.js.map +1 -1
- package/dist/cli.js +91 -10
- package/dist/cli.js.map +1 -1
- package/dist/db/index.d.ts +2 -2
- package/dist/{index-Bcz0aCAR.d.ts → index-DczYH89U.d.ts} +104 -104
- package/dist/index.d.ts +5 -5
- package/dist/index.js +91 -10
- package/dist/index.js.map +1 -1
- package/dist/{schema-BWbWmfDQ.d.ts → schema-DxrKyetI.d.ts} +3 -3
- package/dist/{search-DOzC4ojH.d.ts → search-CVVfuBPZ.d.ts} +4 -4
- package/dist/server/index.js +91 -10
- package/dist/server/index.js.map +1 -1
- package/dist/tools/index.d.ts +3 -3
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/web/.next/build-manifest.json +2 -2
- package/web/.next/standalone/web/.next/prerender-manifest.json +3 -3
- package/web/.next/standalone/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/standalone/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.html +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/agents.html +1 -1
- package/web/.next/standalone/web/.next/server/app/agents.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/agents.segments/!KG1haW4p/agents/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/agents.segments/!KG1haW4p/agents.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/agents.segments/!KG1haW4p.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/agents.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/agents.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/agents.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/agents.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/installation.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/skills.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/tools.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/docs/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/docs.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.html +1 -1
- package/web/.next/standalone/web/.next/server/app/index.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/settings.html +1 -1
- package/web/.next/standalone/web/.next/server/app/settings.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/settings.segments/!KG1haW4p/settings/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/settings.segments/!KG1haW4p/settings.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/settings.segments/!KG1haW4p.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/settings.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/settings.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/pages/404.html +1 -1
- package/web/.next/standalone/web/.next/server/pages/500.html +2 -2
- package/web/.next/standalone/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/server-reference-manifest.json +1 -1
- /package/web/.next/standalone/web/.next/static/{Bt00m8W4k5F79ALhN700F → static/uy1OnyxIm3QeGGgKEmxAj}/_buildManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/{Bt00m8W4k5F79ALhN700F → static/uy1OnyxIm3QeGGgKEmxAj}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/standalone/web/.next/static/{Bt00m8W4k5F79ALhN700F → static/uy1OnyxIm3QeGGgKEmxAj}/_ssgManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/{static/Bt00m8W4k5F79ALhN700F → uy1OnyxIm3QeGGgKEmxAj}/_buildManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/{static/Bt00m8W4k5F79ALhN700F → uy1OnyxIm3QeGGgKEmxAj}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/standalone/web/.next/static/{static/Bt00m8W4k5F79ALhN700F → uy1OnyxIm3QeGGgKEmxAj}/_ssgManifest.js +0 -0
- /package/web/.next/static/{Bt00m8W4k5F79ALhN700F → uy1OnyxIm3QeGGgKEmxAj}/_buildManifest.js +0 -0
- /package/web/.next/static/{Bt00m8W4k5F79ALhN700F → uy1OnyxIm3QeGGgKEmxAj}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{Bt00m8W4k5F79ALhN700F → uy1OnyxIm3QeGGgKEmxAj}/_ssgManifest.js +0 -0
package/dist/cli.js
CHANGED
|
@@ -8545,6 +8545,9 @@ function isSlackConfigured() {
|
|
|
8545
8545
|
function getSlackSigningSecret() {
|
|
8546
8546
|
return readSlackConfig()?.signingSecret ?? null;
|
|
8547
8547
|
}
|
|
8548
|
+
function getSlackBotToken() {
|
|
8549
|
+
return readSlackConfig()?.botToken ?? null;
|
|
8550
|
+
}
|
|
8548
8551
|
function getDefaultOrchestratorName() {
|
|
8549
8552
|
return readSlackConfig()?.defaultOrchestratorName ?? null;
|
|
8550
8553
|
}
|
|
@@ -8599,6 +8602,62 @@ function getSlackAllowlistPolicy() {
|
|
|
8599
8602
|
return { allowedUsers: [], allowedChannels: [], allowDmsFromAnyone: true };
|
|
8600
8603
|
}
|
|
8601
8604
|
}
|
|
8605
|
+
async function fetchSlackUserName(userId) {
|
|
8606
|
+
const token = getSlackBotToken();
|
|
8607
|
+
if (!token) return null;
|
|
8608
|
+
try {
|
|
8609
|
+
const res = await fetch(`https://slack.com/api/users.info?user=${encodeURIComponent(userId)}`, {
|
|
8610
|
+
headers: { Authorization: `Bearer ${token}` }
|
|
8611
|
+
});
|
|
8612
|
+
const data = await res.json().catch(() => ({}));
|
|
8613
|
+
if (!data?.ok) {
|
|
8614
|
+
console.warn(`[slack] users.info(${userId}) failed: ${data?.error || `HTTP ${res.status}`}`);
|
|
8615
|
+
return null;
|
|
8616
|
+
}
|
|
8617
|
+
const profile = data.user?.profile || {};
|
|
8618
|
+
const name = profile.display_name_normalized || profile.display_name || profile.real_name_normalized || profile.real_name || data.user?.real_name || data.user?.name || null;
|
|
8619
|
+
return name ? String(name) : null;
|
|
8620
|
+
} catch (err) {
|
|
8621
|
+
console.warn(`[slack] users.info(${userId}) error:`, err?.message || err);
|
|
8622
|
+
return null;
|
|
8623
|
+
}
|
|
8624
|
+
}
|
|
8625
|
+
async function resolveSlackUserName(userId) {
|
|
8626
|
+
if (!userId) return null;
|
|
8627
|
+
const now = Date.now();
|
|
8628
|
+
const hit = userNameCache.get(userId);
|
|
8629
|
+
if (hit && hit.expiresAt > now) return hit.name;
|
|
8630
|
+
const inflight = userInflight.get(userId);
|
|
8631
|
+
if (inflight) return inflight;
|
|
8632
|
+
const p = (async () => {
|
|
8633
|
+
const name = await fetchSlackUserName(userId);
|
|
8634
|
+
userNameCache.set(userId, {
|
|
8635
|
+
name,
|
|
8636
|
+
expiresAt: now + (name ? USER_TTL_MS : USER_FAIL_TTL_MS)
|
|
8637
|
+
});
|
|
8638
|
+
userInflight.delete(userId);
|
|
8639
|
+
return name;
|
|
8640
|
+
})();
|
|
8641
|
+
userInflight.set(userId, p);
|
|
8642
|
+
return p;
|
|
8643
|
+
}
|
|
8644
|
+
async function normalizeSlackMentions(text) {
|
|
8645
|
+
if (!text) return text;
|
|
8646
|
+
const userMentionRe = /<@([UW][A-Z0-9]+)(?:\|([^>]+))?>/g;
|
|
8647
|
+
const userIds = /* @__PURE__ */ new Set();
|
|
8648
|
+
for (const m of text.matchAll(userMentionRe)) {
|
|
8649
|
+
if (!m[2]) userIds.add(m[1]);
|
|
8650
|
+
}
|
|
8651
|
+
if (userIds.size > 0) {
|
|
8652
|
+
await Promise.all([...userIds].map((id) => resolveSlackUserName(id)));
|
|
8653
|
+
}
|
|
8654
|
+
return text.replace(userMentionRe, (_full, id, label) => {
|
|
8655
|
+
if (label) return `${label} <@${id}>`;
|
|
8656
|
+
const cached = userNameCache.get(id);
|
|
8657
|
+
const name = cached?.name;
|
|
8658
|
+
return name ? `${name} <@${id}>` : `<@${id}>`;
|
|
8659
|
+
});
|
|
8660
|
+
}
|
|
8602
8661
|
function getSlackDeniedReplyPolicy() {
|
|
8603
8662
|
try {
|
|
8604
8663
|
const cfg = getConfig();
|
|
@@ -8611,13 +8670,17 @@ function getSlackDeniedReplyPolicy() {
|
|
|
8611
8670
|
return { enabled: true, template: DEFAULT_DENIED_TEMPLATE };
|
|
8612
8671
|
}
|
|
8613
8672
|
}
|
|
8614
|
-
var cachedSelf, selfInflight, DEFAULT_DENIED_TEMPLATE;
|
|
8673
|
+
var cachedSelf, selfInflight, USER_TTL_MS, USER_FAIL_TTL_MS, userNameCache, userInflight, DEFAULT_DENIED_TEMPLATE;
|
|
8615
8674
|
var init_client3 = __esm({
|
|
8616
8675
|
"src/integrations/slack/client.ts"() {
|
|
8617
8676
|
"use strict";
|
|
8618
8677
|
init_config();
|
|
8619
8678
|
cachedSelf = null;
|
|
8620
8679
|
selfInflight = null;
|
|
8680
|
+
USER_TTL_MS = 60 * 60 * 1e3;
|
|
8681
|
+
USER_FAIL_TTL_MS = 5 * 60 * 1e3;
|
|
8682
|
+
userNameCache = /* @__PURE__ */ new Map();
|
|
8683
|
+
userInflight = /* @__PURE__ */ new Map();
|
|
8621
8684
|
DEFAULT_DENIED_TEMPLATE = "Sorry, you don't have permission to use this bot. (Contact the bot owner if you think this is a mistake.)";
|
|
8622
8685
|
}
|
|
8623
8686
|
});
|
|
@@ -8632,9 +8695,6 @@ function markThreadOwned(channel, threadTs) {
|
|
|
8632
8695
|
function isThreadOwned(channel, threadTs) {
|
|
8633
8696
|
return ownedThreads.has(threadKey(channel, threadTs));
|
|
8634
8697
|
}
|
|
8635
|
-
function stripMention(text) {
|
|
8636
|
-
return String(text || "").replace(/<@[^>]+>/g, "").trim();
|
|
8637
|
-
}
|
|
8638
8698
|
function isSelfAuthored(event, self) {
|
|
8639
8699
|
if (!self) return true;
|
|
8640
8700
|
if (self.botId && event.bot_id && event.bot_id === self.botId) return true;
|
|
@@ -8649,14 +8709,22 @@ function slackEventToInboundResult(event, opts = {}) {
|
|
|
8649
8709
|
return { event: null, dropReason: "bot_message" };
|
|
8650
8710
|
}
|
|
8651
8711
|
if (event.type === "message" && event.subtype && IGNORED_MESSAGE_SUBTYPES.has(event.subtype)) {
|
|
8652
|
-
return { event: null, dropReason: "
|
|
8712
|
+
return { event: null, dropReason: "ignored_subtype" };
|
|
8653
8713
|
}
|
|
8654
8714
|
const isDm = event.type === "message" && event.channel_type === "im";
|
|
8655
8715
|
const isThreadReply = event.type === "message" && !isDm && typeof event.thread_ts === "string" && event.thread_ts !== event.ts;
|
|
8716
|
+
const isNonThreadChannelMsg = event.type === "message" && !isDm && !isThreadReply && (event.channel_type === "channel" || event.channel_type === "group" || event.channel_type === "mpim" || // Some payload shapes omit channel_type for channel messages.
|
|
8717
|
+
typeof event.channel === "string");
|
|
8656
8718
|
if (event.type !== "app_mention" && !isDm && !isThreadReply) {
|
|
8719
|
+
if (isNonThreadChannelMsg) {
|
|
8720
|
+
return { event: null, dropReason: "non_thread_channel_msg" };
|
|
8721
|
+
}
|
|
8722
|
+
if (event.type !== "message") {
|
|
8723
|
+
return { event: null, dropReason: "non_message_event" };
|
|
8724
|
+
}
|
|
8657
8725
|
return { event: null, dropReason: "unsupported_type" };
|
|
8658
8726
|
}
|
|
8659
|
-
const text =
|
|
8727
|
+
const text = (event.text ?? "").trim();
|
|
8660
8728
|
if (!text) return { event: null, dropReason: "empty_text" };
|
|
8661
8729
|
const policy = getSlackAllowlistPolicy();
|
|
8662
8730
|
const userAllowlistActive = policy.allowedUsers.length > 0;
|
|
@@ -14625,16 +14693,18 @@ init_webhook_events();
|
|
|
14625
14693
|
init_inbox();
|
|
14626
14694
|
var recentlyHandled = /* @__PURE__ */ new Map();
|
|
14627
14695
|
var MAX_RECENT = 1e3;
|
|
14628
|
-
function
|
|
14696
|
+
function wasHandled(channel, ts) {
|
|
14629
14697
|
if (!channel || !ts) return false;
|
|
14698
|
+
return recentlyHandled.has(`${channel}\u241F${ts}`);
|
|
14699
|
+
}
|
|
14700
|
+
function markHandled(channel, ts) {
|
|
14701
|
+
if (!channel || !ts) return;
|
|
14630
14702
|
const key2 = `${channel}\u241F${ts}`;
|
|
14631
|
-
if (recentlyHandled.has(key2)) return true;
|
|
14632
14703
|
recentlyHandled.set(key2, Date.now());
|
|
14633
14704
|
if (recentlyHandled.size > MAX_RECENT) {
|
|
14634
14705
|
const oldest = recentlyHandled.keys().next().value;
|
|
14635
14706
|
if (oldest) recentlyHandled.delete(oldest);
|
|
14636
14707
|
}
|
|
14637
|
-
return false;
|
|
14638
14708
|
}
|
|
14639
14709
|
var slack = new Hono6();
|
|
14640
14710
|
slack.post("/events", async (c) => {
|
|
@@ -14671,7 +14741,7 @@ slack.post("/events", async (c) => {
|
|
|
14671
14741
|
textSnippet: typeof ev.text === "string" ? ev.text : void 0,
|
|
14672
14742
|
meta: { ts: ev.ts, thread_ts: ev.thread_ts, team: ev.team, event_subtype: ev.subtype }
|
|
14673
14743
|
});
|
|
14674
|
-
if (
|
|
14744
|
+
if (wasHandled(ev.channel, ev.ts)) {
|
|
14675
14745
|
updateEvent(auditId, { status: "dropped", dropReason: "duplicate_delivery" });
|
|
14676
14746
|
return c.json({ ok: true });
|
|
14677
14747
|
}
|
|
@@ -14695,7 +14765,18 @@ slack.post("/events", async (c) => {
|
|
|
14695
14765
|
}
|
|
14696
14766
|
const orchestratorId = await findOrCreateOrchestratorId();
|
|
14697
14767
|
if (orchestratorId) {
|
|
14768
|
+
inbound.content = await normalizeSlackMentions(inbound.content);
|
|
14769
|
+
if (ev.user) {
|
|
14770
|
+
const speakerName = await resolveSlackUserName(ev.user);
|
|
14771
|
+
if (speakerName) {
|
|
14772
|
+
inbound.content = inbound.content.replace(
|
|
14773
|
+
`user=${ev.user}`,
|
|
14774
|
+
`user=${speakerName} <@${ev.user}>`
|
|
14775
|
+
);
|
|
14776
|
+
}
|
|
14777
|
+
}
|
|
14698
14778
|
pushToInbox(orchestratorId, inbound);
|
|
14779
|
+
markHandled(ev.channel, ev.ts);
|
|
14699
14780
|
updateEvent(auditId, { status: "routed", sessionId: orchestratorId });
|
|
14700
14781
|
} else {
|
|
14701
14782
|
updateEvent(auditId, { status: "error", error: "no orchestrator session available" });
|