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.
Files changed (109) hide show
  1. package/dist/agent/index.d.ts +3 -3
  2. package/dist/agent/index.js +2 -0
  3. package/dist/agent/index.js.map +1 -1
  4. package/dist/cli.js +91 -10
  5. package/dist/cli.js.map +1 -1
  6. package/dist/db/index.d.ts +2 -2
  7. package/dist/{index-Bcz0aCAR.d.ts → index-DczYH89U.d.ts} +104 -104
  8. package/dist/index.d.ts +5 -5
  9. package/dist/index.js +91 -10
  10. package/dist/index.js.map +1 -1
  11. package/dist/{schema-BWbWmfDQ.d.ts → schema-DxrKyetI.d.ts} +3 -3
  12. package/dist/{search-DOzC4ojH.d.ts → search-CVVfuBPZ.d.ts} +4 -4
  13. package/dist/server/index.js +91 -10
  14. package/dist/server/index.js.map +1 -1
  15. package/dist/tools/index.d.ts +3 -3
  16. package/package.json +1 -1
  17. package/web/.next/BUILD_ID +1 -1
  18. package/web/.next/standalone/web/.next/BUILD_ID +1 -1
  19. package/web/.next/standalone/web/.next/build-manifest.json +2 -2
  20. package/web/.next/standalone/web/.next/prerender-manifest.json +3 -3
  21. package/web/.next/standalone/web/.next/server/app/_global-error.html +2 -2
  22. package/web/.next/standalone/web/.next/server/app/_global-error.rsc +1 -1
  23. package/web/.next/standalone/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  24. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  25. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  26. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  27. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  28. package/web/.next/standalone/web/.next/server/app/_not-found.html +1 -1
  29. package/web/.next/standalone/web/.next/server/app/_not-found.rsc +1 -1
  30. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  31. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  32. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  33. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  34. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  35. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  36. package/web/.next/standalone/web/.next/server/app/agents.html +1 -1
  37. package/web/.next/standalone/web/.next/server/app/agents.rsc +1 -1
  38. package/web/.next/standalone/web/.next/server/app/agents.segments/!KG1haW4p/agents/__PAGE__.segment.rsc +1 -1
  39. package/web/.next/standalone/web/.next/server/app/agents.segments/!KG1haW4p/agents.segment.rsc +1 -1
  40. package/web/.next/standalone/web/.next/server/app/agents.segments/!KG1haW4p.segment.rsc +1 -1
  41. package/web/.next/standalone/web/.next/server/app/agents.segments/_full.segment.rsc +1 -1
  42. package/web/.next/standalone/web/.next/server/app/agents.segments/_head.segment.rsc +1 -1
  43. package/web/.next/standalone/web/.next/server/app/agents.segments/_index.segment.rsc +1 -1
  44. package/web/.next/standalone/web/.next/server/app/agents.segments/_tree.segment.rsc +1 -1
  45. package/web/.next/standalone/web/.next/server/app/docs/installation.html +2 -2
  46. package/web/.next/standalone/web/.next/server/app/docs/installation.rsc +1 -1
  47. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_full.segment.rsc +1 -1
  48. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_head.segment.rsc +1 -1
  49. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_index.segment.rsc +1 -1
  50. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_tree.segment.rsc +1 -1
  51. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation/__PAGE__.segment.rsc +1 -1
  52. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation.segment.rsc +1 -1
  53. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs.segment.rsc +1 -1
  54. package/web/.next/standalone/web/.next/server/app/docs/skills.html +2 -2
  55. package/web/.next/standalone/web/.next/server/app/docs/skills.rsc +1 -1
  56. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_full.segment.rsc +1 -1
  57. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_head.segment.rsc +1 -1
  58. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_index.segment.rsc +1 -1
  59. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_tree.segment.rsc +1 -1
  60. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills/__PAGE__.segment.rsc +1 -1
  61. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills.segment.rsc +1 -1
  62. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs.segment.rsc +1 -1
  63. package/web/.next/standalone/web/.next/server/app/docs/tools.html +2 -2
  64. package/web/.next/standalone/web/.next/server/app/docs/tools.rsc +1 -1
  65. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_full.segment.rsc +1 -1
  66. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_head.segment.rsc +1 -1
  67. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_index.segment.rsc +1 -1
  68. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_tree.segment.rsc +1 -1
  69. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools/__PAGE__.segment.rsc +1 -1
  70. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools.segment.rsc +1 -1
  71. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs.segment.rsc +1 -1
  72. package/web/.next/standalone/web/.next/server/app/docs.html +2 -2
  73. package/web/.next/standalone/web/.next/server/app/docs.rsc +1 -1
  74. package/web/.next/standalone/web/.next/server/app/docs.segments/_full.segment.rsc +1 -1
  75. package/web/.next/standalone/web/.next/server/app/docs.segments/_head.segment.rsc +1 -1
  76. package/web/.next/standalone/web/.next/server/app/docs.segments/_index.segment.rsc +1 -1
  77. package/web/.next/standalone/web/.next/server/app/docs.segments/_tree.segment.rsc +1 -1
  78. package/web/.next/standalone/web/.next/server/app/docs.segments/docs/__PAGE__.segment.rsc +1 -1
  79. package/web/.next/standalone/web/.next/server/app/docs.segments/docs.segment.rsc +1 -1
  80. package/web/.next/standalone/web/.next/server/app/index.html +1 -1
  81. package/web/.next/standalone/web/.next/server/app/index.rsc +1 -1
  82. package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p/__PAGE__.segment.rsc +1 -1
  83. package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p.segment.rsc +1 -1
  84. package/web/.next/standalone/web/.next/server/app/index.segments/_full.segment.rsc +1 -1
  85. package/web/.next/standalone/web/.next/server/app/index.segments/_head.segment.rsc +1 -1
  86. package/web/.next/standalone/web/.next/server/app/index.segments/_index.segment.rsc +1 -1
  87. package/web/.next/standalone/web/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  88. package/web/.next/standalone/web/.next/server/app/settings.html +1 -1
  89. package/web/.next/standalone/web/.next/server/app/settings.rsc +1 -1
  90. package/web/.next/standalone/web/.next/server/app/settings.segments/!KG1haW4p/settings/__PAGE__.segment.rsc +1 -1
  91. package/web/.next/standalone/web/.next/server/app/settings.segments/!KG1haW4p/settings.segment.rsc +1 -1
  92. package/web/.next/standalone/web/.next/server/app/settings.segments/!KG1haW4p.segment.rsc +1 -1
  93. package/web/.next/standalone/web/.next/server/app/settings.segments/_full.segment.rsc +1 -1
  94. package/web/.next/standalone/web/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  95. package/web/.next/standalone/web/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  96. package/web/.next/standalone/web/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  97. package/web/.next/standalone/web/.next/server/pages/404.html +1 -1
  98. package/web/.next/standalone/web/.next/server/pages/500.html +2 -2
  99. package/web/.next/standalone/web/.next/server/server-reference-manifest.js +1 -1
  100. package/web/.next/standalone/web/.next/server/server-reference-manifest.json +1 -1
  101. /package/web/.next/standalone/web/.next/static/{Bt00m8W4k5F79ALhN700F → static/uy1OnyxIm3QeGGgKEmxAj}/_buildManifest.js +0 -0
  102. /package/web/.next/standalone/web/.next/static/{Bt00m8W4k5F79ALhN700F → static/uy1OnyxIm3QeGGgKEmxAj}/_clientMiddlewareManifest.json +0 -0
  103. /package/web/.next/standalone/web/.next/static/{Bt00m8W4k5F79ALhN700F → static/uy1OnyxIm3QeGGgKEmxAj}/_ssgManifest.js +0 -0
  104. /package/web/.next/standalone/web/.next/static/{static/Bt00m8W4k5F79ALhN700F → uy1OnyxIm3QeGGgKEmxAj}/_buildManifest.js +0 -0
  105. /package/web/.next/standalone/web/.next/static/{static/Bt00m8W4k5F79ALhN700F → uy1OnyxIm3QeGGgKEmxAj}/_clientMiddlewareManifest.json +0 -0
  106. /package/web/.next/standalone/web/.next/static/{static/Bt00m8W4k5F79ALhN700F → uy1OnyxIm3QeGGgKEmxAj}/_ssgManifest.js +0 -0
  107. /package/web/.next/static/{Bt00m8W4k5F79ALhN700F → uy1OnyxIm3QeGGgKEmxAj}/_buildManifest.js +0 -0
  108. /package/web/.next/static/{Bt00m8W4k5F79ALhN700F → uy1OnyxIm3QeGGgKEmxAj}/_clientMiddlewareManifest.json +0 -0
  109. /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: "bot_message" };
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 = event.type === "app_mention" ? stripMention(event.text) : (event.text ?? "").trim();
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 alreadyHandled(channel, ts) {
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 (alreadyHandled(ev.channel, ev.ts)) {
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" });