@agentworkforce/sage 1.0.5 → 1.0.6

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 (35) hide show
  1. package/dist/app.d.ts +4 -0
  2. package/dist/app.d.ts.map +1 -1
  3. package/dist/app.js +66 -35
  4. package/dist/nango.d.ts +1 -2
  5. package/dist/nango.d.ts.map +1 -1
  6. package/dist/nango.js +7 -3
  7. package/dist/proactive/context-watcher.d.ts +1 -1
  8. package/dist/proactive/context-watcher.d.ts.map +1 -1
  9. package/dist/proactive/context-watcher.js +2 -2
  10. package/dist/proactive/engine.d.ts +6 -2
  11. package/dist/proactive/engine.d.ts.map +1 -1
  12. package/dist/proactive/engine.js +13 -12
  13. package/dist/proactive/evidence-sources/affirmative-reply-source.d.ts.map +1 -1
  14. package/dist/proactive/evidence-sources/affirmative-reply-source.js +1 -1
  15. package/dist/proactive/evidence-sources/explicit-close-source.d.ts.map +1 -1
  16. package/dist/proactive/evidence-sources/explicit-close-source.js +1 -1
  17. package/dist/proactive/evidence-sources/reaction-source.d.ts.map +1 -1
  18. package/dist/proactive/evidence-sources/reaction-source.js +1 -2
  19. package/dist/proactive/follow-up-checker.d.ts +1 -1
  20. package/dist/proactive/follow-up-checker.d.ts.map +1 -1
  21. package/dist/proactive/follow-up-checker.js +5 -4
  22. package/dist/proactive/pr-matcher.d.ts +1 -1
  23. package/dist/proactive/pr-matcher.d.ts.map +1 -1
  24. package/dist/proactive/pr-matcher.js +5 -5
  25. package/dist/proactive/stale-thread-detector.d.ts +1 -1
  26. package/dist/proactive/stale-thread-detector.d.ts.map +1 -1
  27. package/dist/proactive/stale-thread-detector.js +6 -6
  28. package/dist/proactive/types.d.ts +1 -0
  29. package/dist/proactive/types.d.ts.map +1 -1
  30. package/dist/slack.d.ts +4 -4
  31. package/dist/slack.d.ts.map +1 -1
  32. package/dist/slack.js +8 -8
  33. package/dist/types.d.ts +1 -0
  34. package/dist/types.d.ts.map +1 -1
  35. package/package.json +1 -1
package/dist/app.d.ts CHANGED
@@ -10,6 +10,10 @@ type AppEnv = {
10
10
  Bindings: SageBindings;
11
11
  Variables: AppVariables;
12
12
  };
13
+ export interface ResolvedSlackConnection {
14
+ connectionId: string;
15
+ providerConfigKey: string;
16
+ }
13
17
  export declare function createSageApp(): Hono<AppEnv>;
14
18
  export {};
15
19
  //# sourceMappingURL=app.d.ts.map
package/dist/app.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAwC5B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAyB/C,UAAU,YAAY;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,yBAAyB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,8BAA8B,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/C;AAED,KAAK,MAAM,GAAG;IACZ,QAAQ,EAAE,YAAY,CAAC;IACvB,SAAS,EAAE,YAAY,CAAC;CACzB,CAAC;AAskCF,wBAAgB,aAAa,IAAI,IAAI,CAAC,MAAM,CAAC,CA0iB5C"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAwC5B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAyB/C,UAAU,YAAY;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,yBAAyB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,8BAA8B,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/C;AAED,KAAK,MAAM,GAAG;IACZ,QAAQ,EAAE,YAAY,CAAC;IACvB,SAAS,EAAE,YAAY,CAAC;CACzB,CAAC;AAyfF,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAsnBD,wBAAgB,aAAa,IAAI,IAAI,CAAC,MAAM,CAAC,CAgkB5C"}
package/dist/app.js CHANGED
@@ -367,6 +367,27 @@ async function resolveConnectionId(workspaceId, provider, env) {
367
367
  }
368
368
  return trimOptional(env.NANGO_SLACK_CONNECTION_ID) ?? null;
369
369
  }
370
+ async function resolveSlackConnection(workspaceId, env) {
371
+ const resolver = getConnectionResolver(env);
372
+ if (resolver) {
373
+ const connection = await resolver.getConnection(workspaceId, "slack");
374
+ if (connection.connectionId && connection.providerConfigKey) {
375
+ return {
376
+ connectionId: connection.connectionId,
377
+ providerConfigKey: connection.providerConfigKey,
378
+ };
379
+ }
380
+ }
381
+ const fallbackConnectionId = trimOptional(env.NANGO_SLACK_CONNECTION_ID);
382
+ const fallbackProviderConfigKey = trimOptional(env.NANGO_SLACK_PROVIDER_CONFIG_KEY);
383
+ if (fallbackConnectionId && fallbackProviderConfigKey) {
384
+ return {
385
+ connectionId: fallbackConnectionId,
386
+ providerConfigKey: fallbackProviderConfigKey,
387
+ };
388
+ }
389
+ return null;
390
+ }
370
391
  async function getRelayFileReader(slackWorkspaceId, env) {
371
392
  const resolver = getConnectionResolver(env);
372
393
  let cloudWorkspaceId = null;
@@ -491,13 +512,14 @@ async function loadClientStatus(workspaceId, env) {
491
512
  };
492
513
  }
493
514
  async function detectSlackBotUserId(env) {
494
- const staticSlackConnectionId = trimOptional(env.NANGO_SLACK_CONNECTION_ID);
515
+ const fallbackConnectionId = trimOptional(env.NANGO_SLACK_CONNECTION_ID);
516
+ const fallbackProviderConfigKey = trimOptional(env.NANGO_SLACK_PROVIDER_CONFIG_KEY);
495
517
  const fallbackSlackBotUserId = trimOptional(env.SLACK_BOT_USER_ID);
496
- if (!staticSlackConnectionId) {
518
+ if (!fallbackConnectionId || !fallbackProviderConfigKey) {
497
519
  return fallbackSlackBotUserId;
498
520
  }
499
521
  try {
500
- const userId = await getNango(env).getSlackBotUserId(staticSlackConnectionId);
522
+ const userId = await getNango(env).getSlackBotUserId(fallbackConnectionId, fallbackProviderConfigKey);
501
523
  if (userId) {
502
524
  console.log("[sage] Detected Slack bot user ID via auth.test:", userId);
503
525
  return userId;
@@ -513,6 +535,7 @@ function getDefaultSlackBotUserId(env) {
513
535
  const cacheKey = [
514
536
  requireBinding(env, "NANGO_SECRET_KEY"),
515
537
  trimOptional(env.NANGO_SLACK_CONNECTION_ID) ?? "",
538
+ trimOptional(env.NANGO_SLACK_PROVIDER_CONFIG_KEY) ?? "",
516
539
  trimOptional(env.SLACK_BOT_USER_ID) ?? "",
517
540
  ].join("\n");
518
541
  if (!cachedDefaultSlackBotUserId || cachedDefaultSlackBotUserIdKey !== cacheKey) {
@@ -521,9 +544,9 @@ function getDefaultSlackBotUserId(env) {
521
544
  }
522
545
  return cachedDefaultSlackBotUserId;
523
546
  }
524
- async function resolveSlackBotUserId(slackConnectionId, env) {
547
+ async function resolveSlackBotUserId(slack, env) {
525
548
  try {
526
- return await getNango(env).getSlackBotUserId(slackConnectionId);
549
+ return await getNango(env).getSlackBotUserId(slack.connectionId, slack.providerConfigKey);
527
550
  }
528
551
  catch (error) {
529
552
  console.warn("[sage] Failed to resolve workspace Slack bot user ID; using fallback if available", error);
@@ -643,12 +666,14 @@ async function processSlackEvent(event, workspaceId, env, options = {}) {
643
666
  const memory = getMemory(workspaceId);
644
667
  const orgMemory = getOrgMemory(workspaceId);
645
668
  const nangoClient = getNango(env);
646
- const slackConnectionId = options.slackConnectionId ?? await resolveConnectionId(workspaceId, "slack", env);
647
- if (!slackConnectionId) {
669
+ const slackConnection = options.slackConnection ?? await resolveSlackConnection(workspaceId, env);
670
+ if (!slackConnection) {
648
671
  console.warn(`[sage] No Slack connection configured for workspace "${workspaceId}"; cannot process event`);
649
672
  return;
650
673
  }
651
- const workspaceSlackBotUserId = options.slackBotUserId ?? await resolveSlackBotUserId(slackConnectionId, env);
674
+ const slackConnectionId = slackConnection.connectionId;
675
+ const slackProviderConfigKey = slackConnection.providerConfigKey;
676
+ const workspaceSlackBotUserId = options.slackBotUserId ?? await resolveSlackBotUserId(slackConnection, env);
652
677
  const githubConnectionId = await resolveConnectionId(workspaceId, "github", env);
653
678
  const relayfileReader = await getRelayFileReader(workspaceId, env);
654
679
  const github = githubConnectionId
@@ -681,7 +706,7 @@ async function processSlackEvent(event, workspaceId, env, options = {}) {
681
706
  let threadHistory = [];
682
707
  if (event.threadTs) {
683
708
  try {
684
- threadHistory = await fetchThreadHistoryViaNango(event.channel, event.threadTs, workspaceSlackBotUserId, nangoClient, slackConnectionId);
709
+ threadHistory = await fetchThreadHistoryViaNango(event.channel, event.threadTs, workspaceSlackBotUserId, nangoClient, slackConnectionId, slackProviderConfigKey);
685
710
  }
686
711
  catch (error) {
687
712
  console.warn("[sage] Proceeding without Slack thread history", error);
@@ -708,7 +733,7 @@ async function processSlackEvent(event, workspaceId, env, options = {}) {
708
733
  });
709
734
  const response = await processWithSwarm(event.text, systemPrompt, relayfileReader, github, threadHistory);
710
735
  const reply = formatSlackReply(response.content, response.citations);
711
- const postResult = await postSlackMessageChunkedViaNango(event.channel, reply, replyThreadTs, nangoClient, slackConnectionId, MAX_REPLY_CHARS);
736
+ const postResult = await postSlackMessageChunkedViaNango(event.channel, reply, replyThreadTs, nangoClient, slackConnectionId, slackProviderConfigKey, MAX_REPLY_CHARS);
712
737
  replyPosted = Boolean(postResult.ts);
713
738
  if (!postResult.ok) {
714
739
  throw new Error(postResult.error ?? "Failed to post Slack message");
@@ -733,7 +758,7 @@ async function processSlackEvent(event, workspaceId, env, options = {}) {
733
758
  return;
734
759
  }
735
760
  try {
736
- const fallbackResult = await postSlackMessageChunkedViaNango(event.channel, getUserFacingErrorMessage(error), replyThreadTs, nangoClient, slackConnectionId, MAX_REPLY_CHARS);
761
+ const fallbackResult = await postSlackMessageChunkedViaNango(event.channel, getUserFacingErrorMessage(error), replyThreadTs, nangoClient, slackConnectionId, slackProviderConfigKey, MAX_REPLY_CHARS);
737
762
  if (!fallbackResult.ok) {
738
763
  console.error("Failed to post fallback Slack message", fallbackResult.error);
739
764
  }
@@ -782,14 +807,15 @@ function resolveNotifyChannel(env, body) {
782
807
  }
783
808
  async function resolveProactiveSlackContext(env, body) {
784
809
  const workspaceId = resolveProactiveWorkspaceId(env, body);
785
- const slackConnectionId = await resolveConnectionId(workspaceId, "slack", env);
786
- if (!slackConnectionId) {
810
+ const slackConnection = await resolveSlackConnection(workspaceId, env);
811
+ if (!slackConnection) {
787
812
  throw new Error(`No Slack connection configured for workspace "${workspaceId}"`);
788
813
  }
789
814
  return {
790
815
  workspaceId,
791
- slackConnectionId,
792
- slackBotUserId: await resolveSlackBotUserId(slackConnectionId, env),
816
+ slackConnectionId: slackConnection.connectionId,
817
+ slackProviderConfigKey: slackConnection.providerConfigKey,
818
+ slackBotUserId: await resolveSlackBotUserId(slackConnection, env),
793
819
  };
794
820
  }
795
821
  function extractPRData(payload) {
@@ -884,9 +910,9 @@ export function createSageApp() {
884
910
  app.post("/api/proactive/follow-ups", async (c) => {
885
911
  try {
886
912
  const body = normalizeRequestBody(await readOptionalJsonBody(c));
887
- const { workspaceId, slackConnectionId, slackBotUserId } = await resolveProactiveSlackContext(c.env, body);
913
+ const { workspaceId, slackConnectionId, slackProviderConfigKey, slackBotUserId } = await resolveProactiveSlackContext(c.env, body);
888
914
  const githubConnectionId = await resolveConnectionId(workspaceId, "github", c.env);
889
- const count = await checkFollowUps(getMemory(workspaceId), getNango(c.env), slackConnectionId, resolveNotifyChannel(c.env, body), {
915
+ const count = await checkFollowUps(getMemory(workspaceId), getNango(c.env), slackConnectionId, slackProviderConfigKey, resolveNotifyChannel(c.env, body), {
890
916
  collector: followUpCollector,
891
917
  slackBotUserId,
892
918
  githubConnectionId: githubConnectionId ?? undefined,
@@ -903,8 +929,8 @@ export function createSageApp() {
903
929
  app.post("/api/proactive/stale-threads", async (c) => {
904
930
  try {
905
931
  const body = normalizeRequestBody(await readOptionalJsonBody(c));
906
- const { workspaceId, slackConnectionId, slackBotUserId } = await resolveProactiveSlackContext(c.env, body);
907
- const count = await detectStaleThreads(getMemory(workspaceId), workspaceId, getNango(c.env), slackConnectionId, await loadActiveThreadsMap(c.env.THREADS), slackBotUserId, resolveNotifyChannel(c.env, body));
932
+ const { workspaceId, slackConnectionId, slackProviderConfigKey, slackBotUserId } = await resolveProactiveSlackContext(c.env, body);
933
+ const count = await detectStaleThreads(getMemory(workspaceId), workspaceId, getNango(c.env), slackConnectionId, slackProviderConfigKey, await loadActiveThreadsMap(c.env.THREADS), slackBotUserId, resolveNotifyChannel(c.env, body));
908
934
  return c.json({ ok: true, workspaceId, staleThreads: count });
909
935
  }
910
936
  catch (error) {
@@ -917,8 +943,8 @@ export function createSageApp() {
917
943
  app.post("/api/proactive/context-watch", async (c) => {
918
944
  try {
919
945
  const body = normalizeRequestBody(await readOptionalJsonBody(c));
920
- const { workspaceId, slackConnectionId } = await resolveProactiveSlackContext(c.env, body);
921
- const count = await watchContext(getMemory(workspaceId), getNango(c.env), slackConnectionId, resolveNotifyChannel(c.env, body));
946
+ const { workspaceId, slackConnectionId, slackProviderConfigKey } = await resolveProactiveSlackContext(c.env, body);
947
+ const count = await watchContext(getMemory(workspaceId), getNango(c.env), slackConnectionId, slackProviderConfigKey, resolveNotifyChannel(c.env, body));
922
948
  return c.json({ ok: true, workspaceId, updates: count });
923
949
  }
924
950
  catch (error) {
@@ -939,8 +965,8 @@ export function createSageApp() {
939
965
  return c.json({ ok: false, error: "Could not parse pull request data" }, 400);
940
966
  }
941
967
  const workspaceId = resolveProactiveWorkspaceId(c.env, body);
942
- const { slackConnectionId } = await resolveProactiveSlackContext(c.env, body);
943
- const matched = await matchPRToPlans(pr, getMemory(workspaceId), getNango(c.env), slackConnectionId, resolveNotifyChannel(c.env, body));
968
+ const { slackConnectionId, slackProviderConfigKey } = await resolveProactiveSlackContext(c.env, body);
969
+ const matched = await matchPRToPlans(pr, getMemory(workspaceId), getNango(c.env), slackConnectionId, slackProviderConfigKey, resolveNotifyChannel(c.env, body));
944
970
  return c.json({
945
971
  ok: true,
946
972
  workspaceId,
@@ -1230,19 +1256,24 @@ export function createSageApp() {
1230
1256
  await markActiveThread(c.env.THREADS, event.threadTs, { workspaceId, channel: event.channel });
1231
1257
  }
1232
1258
  }
1233
- // Prefer the Nango connectionId forwarded in the envelope over a
1234
- // team_id → workspace → connection lookup. Cloud already knows which
1235
- // Nango connection received the webhook; re-resolving by team_id adds a
1236
- // translation hop that silently drops events when any link in the chain
1237
- // is missing (no slack-* row, missing team metadata, cloud route not
1238
- // deployed, etc.).
1259
+ // Prefer the Nango connectionId + providerConfigKey forwarded in the
1260
+ // envelope over a team_id → workspace → connection lookup. Cloud already
1261
+ // knows which Nango connection received the webhook; re-resolving by
1262
+ // team_id adds a translation hop that silently drops events when any link
1263
+ // in the chain is missing (no slack-* row, missing team metadata, cloud
1264
+ // route not deployed, etc.).
1239
1265
  const envelopeConnectionId = c.get("nangoEnvelopeConnectionId");
1240
- const slackConnectionId = envelopeConnectionId ?? (await resolveConnectionId(workspaceId, "slack", c.env));
1241
- if (!slackConnectionId) {
1266
+ const envelopeProviderConfigKey = c.get("nangoEnvelopeProviderConfigKey");
1267
+ const slackConnection = envelopeConnectionId && envelopeProviderConfigKey
1268
+ ? { connectionId: envelopeConnectionId, providerConfigKey: envelopeProviderConfigKey }
1269
+ : await resolveSlackConnection(workspaceId, c.env);
1270
+ if (!slackConnection) {
1242
1271
  console.warn(`[sage] No Slack connection configured for workspace "${workspaceId}"; skipping event`);
1243
1272
  return c.json({ ok: true });
1244
1273
  }
1245
- const workspaceSlackBotUserId = await resolveSlackBotUserId(slackConnectionId, c.env);
1274
+ const slackConnectionId = slackConnection.connectionId;
1275
+ const slackProviderConfigKey = slackConnection.providerConfigKey;
1276
+ const workspaceSlackBotUserId = await resolveSlackBotUserId(slackConnection, c.env);
1246
1277
  if (!event.userId || (workspaceSlackBotUserId && event.userId === workspaceSlackBotUserId)) {
1247
1278
  return c.json({ ok: true });
1248
1279
  }
@@ -1254,14 +1285,14 @@ export function createSageApp() {
1254
1285
  await markEventSeen(c.env.DEDUP, event.ts);
1255
1286
  const rateLimitResult = await getRateLimiter(c.env).limit({ key: `${workspaceId}:${event.userId}` });
1256
1287
  if (!rateLimitResult.success) {
1257
- const postResult = await postSlackMessageChunkedViaNango(event.channel, "You're sending messages too quickly. Please wait a moment.", event.threadTs ?? event.ts, getNango(c.env), slackConnectionId, MAX_REPLY_CHARS);
1288
+ const postResult = await postSlackMessageChunkedViaNango(event.channel, "You're sending messages too quickly. Please wait a moment.", event.threadTs ?? event.ts, getNango(c.env), slackConnectionId, slackProviderConfigKey, MAX_REPLY_CHARS);
1258
1289
  if (!postResult.ok) {
1259
1290
  console.error("Failed to post rate-limit Slack message", postResult.error);
1260
1291
  }
1261
1292
  return c.json({ ok: true });
1262
1293
  }
1263
1294
  if (event.ts) {
1264
- c.executionCtx.waitUntil(addSlackReactionViaNango(event.channel, event.ts, "eyes", getNango(c.env), slackConnectionId));
1295
+ c.executionCtx.waitUntil(addSlackReactionViaNango(event.channel, event.ts, "eyes", getNango(c.env), slackConnectionId, slackProviderConfigKey));
1265
1296
  }
1266
1297
  c.executionCtx.waitUntil((async () => {
1267
1298
  await runtimeReady;
@@ -1275,7 +1306,7 @@ export function createSageApp() {
1275
1306
  capability: "slack-event",
1276
1307
  raw: {
1277
1308
  run: () => processSlackEvent(event, workspaceId, c.env, {
1278
- slackConnectionId,
1309
+ slackConnection,
1279
1310
  slackBotUserId: workspaceSlackBotUserId,
1280
1311
  }),
1281
1312
  },
package/dist/nango.d.ts CHANGED
@@ -1,6 +1,5 @@
1
1
  export declare const NANGO_INTEGRATIONS: {
2
2
  readonly GITHUB: "github-app-oauth";
3
- readonly SLACK: "slack";
4
3
  };
5
4
  export interface ProxyConfig {
6
5
  connectionId: string;
@@ -43,7 +42,7 @@ export declare class NangoClient {
43
42
  proxy<T>(config: ProxyConfig): Promise<T>;
44
43
  getConnection(connectionId: string, providerConfigKey: string): Promise<NangoConnection | null>;
45
44
  discoverGitHubOrgs(connectionId: string): Promise<GitHubOrgDiscovery>;
46
- getSlackBotUserId(connectionId: string): Promise<string>;
45
+ getSlackBotUserId(connectionId: string, providerConfigKey: string): Promise<string>;
47
46
  private listGitHubInstallationRepos;
48
47
  }
49
48
  //# sourceMappingURL=nango.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"nango.d.ts","sourceRoot":"","sources":["../src/nango.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,kBAAkB;;;CAGrB,CAAC;AAKX,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;IACpD,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,QAAQ,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAClE;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CAC9B;AAgCD,qBAAa,UAAW,SAAQ,KAAK;aAEjB,SAAS,EAAE,MAAM;aACjB,MAAM,EAAE,MAAM;aACd,KAAK,EAAE,OAAO;gBAFd,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO;CAKjC;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAqD;IAC7F,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA6B;IACjE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,EAAE,SAAS,EAAE,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE;IAIhD,OAAO,CAAC,SAAS;IAIX,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC;IAQzC,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAQ/F,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAwDrE,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAsBhD,2BAA2B;CAmD1C"}
1
+ {"version":3,"file":"nango.d.ts","sourceRoot":"","sources":["../src/nango.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,kBAAkB;;CAErB,CAAC;AAKX,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;IACpD,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,QAAQ,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAClE;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CAC9B;AAgCD,qBAAa,UAAW,SAAQ,KAAK;aAEjB,SAAS,EAAE,MAAM;aACjB,MAAM,EAAE,MAAM;aACd,KAAK,EAAE,OAAO;gBAFd,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO;CAKjC;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAqD;IAC7F,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA6B;IACjE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,EAAE,SAAS,EAAE,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE;IAIhD,OAAO,CAAC,SAAS;IAIX,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC;IAQzC,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAQ/F,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAwDrE,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAsB3E,2BAA2B;CAmD1C"}
package/dist/nango.js CHANGED
@@ -1,7 +1,11 @@
1
1
  import { Nango } from '@nangohq/node';
2
+ // Nango provider_config_key values. Only listed here when sage has no other
3
+ // way to discover the value at runtime — Slack keys are always sourced from
4
+ // the webhook envelope or the cloud workspace-connections resolver, never
5
+ // hardcoded, because different deployments register the Slack bot under
6
+ // different names (`slack-sage`, `slack-my-senior-dev`, etc).
2
7
  export const NANGO_INTEGRATIONS = {
3
8
  GITHUB: 'github-app-oauth',
4
- SLACK: 'slack',
5
9
  };
6
10
  const GITHUB_DISCOVERY_TTL_MS = 30 * 60_000;
7
11
  export class NangoError extends Error {
@@ -86,14 +90,14 @@ export class NangoClient {
86
90
  });
87
91
  return cloneGitHubOrgDiscovery(value);
88
92
  }
89
- async getSlackBotUserId(connectionId) {
93
+ async getSlackBotUserId(connectionId, providerConfigKey) {
90
94
  const cached = this.slackBotUserIdCache.get(connectionId);
91
95
  if (cached) {
92
96
  return cached;
93
97
  }
94
98
  const response = await this.proxy({
95
99
  connectionId,
96
- providerConfigKey: NANGO_INTEGRATIONS.SLACK,
100
+ providerConfigKey,
97
101
  method: 'POST',
98
102
  endpoint: '/auth.test',
99
103
  });
@@ -1,4 +1,4 @@
1
1
  import type { SageMemory } from "../memory.js";
2
2
  import type { NangoClient } from "../nango.js";
3
- export declare function watchContext(memory: SageMemory, nangoClient: NangoClient, slackConnectionId: string, notifyChannel?: string): Promise<number>;
3
+ export declare function watchContext(memory: SageMemory, nangoClient: NangoClient, slackConnectionId: string, slackProviderConfigKey: string, notifyChannel?: string): Promise<number>;
4
4
  //# sourceMappingURL=context-watcher.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"context-watcher.d.ts","sourceRoot":"","sources":["../../src/proactive/context-watcher.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAsO/C,wBAAsB,YAAY,CAChC,MAAM,EAAE,UAAU,EAClB,WAAW,EAAE,WAAW,EACxB,iBAAiB,EAAE,MAAM,EACzB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC,CA8EjB"}
1
+ {"version":3,"file":"context-watcher.d.ts","sourceRoot":"","sources":["../../src/proactive/context-watcher.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAsO/C,wBAAsB,YAAY,CAChC,MAAM,EAAE,UAAU,EAClB,WAAW,EAAE,WAAW,EACxB,iBAAiB,EAAE,MAAM,EACzB,sBAAsB,EAAE,MAAM,EAC9B,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC,CA+EjB"}
@@ -169,7 +169,7 @@ function withSources(message, citations) {
169
169
  }
170
170
  return `${message}\nSources: ${sources.join(" | ")}`;
171
171
  }
172
- export async function watchContext(memory, nangoClient, slackConnectionId, notifyChannel) {
172
+ export async function watchContext(memory, nangoClient, slackConnectionId, slackProviderConfigKey, notifyChannel) {
173
173
  if (!notifyChannel) {
174
174
  console.warn("[proactive/context-watch] No notification channel configured");
175
175
  return 0;
@@ -203,7 +203,7 @@ export async function watchContext(memory, nangoClient, slackConnectionId, notif
203
203
  continue;
204
204
  }
205
205
  if (decision.shouldNotify && decision.message) {
206
- const result = await postSlackMessageChunkedViaNango(notifyChannel, withSources(decision.message, response.citations), undefined, nangoClient, slackConnectionId, MAX_REPLY_CHARS);
206
+ const result = await postSlackMessageChunkedViaNango(notifyChannel, withSources(decision.message, response.citations), undefined, nangoClient, slackConnectionId, slackProviderConfigKey, MAX_REPLY_CHARS);
207
207
  if (!result.ok) {
208
208
  console.warn(`[proactive/context-watch] Failed to post topic update for "${topic.topic}": ${result.error}`);
209
209
  continue;
@@ -2,11 +2,15 @@ import { Hono } from "hono";
2
2
  import type { SageRelayFileReader } from "../integrations/relayfile-reader.js";
3
3
  import { SageMemory } from "../memory.js";
4
4
  import { NangoClient } from "../nango.js";
5
+ export interface ResolvedSlackConnection {
6
+ connectionId: string;
7
+ providerConfigKey: string;
8
+ }
5
9
  export interface ProactiveRoutesConfig {
6
10
  nangoClient: NangoClient;
7
- resolveSlackConnectionId: (workspaceId: string) => Promise<string | null>;
11
+ resolveSlackConnection: (workspaceId: string) => Promise<ResolvedSlackConnection | null>;
8
12
  resolveGitHubConnectionId?: (workspaceId: string) => Promise<string | null>;
9
- resolveSlackBotUserId?: (slackConnectionId: string) => Promise<string | undefined>;
13
+ resolveSlackBotUserId?: (slack: ResolvedSlackConnection) => Promise<string | undefined>;
10
14
  getMemory: (workspaceId: string) => SageMemory;
11
15
  getRelayFileReader?: (workspaceId: string) => SageRelayFileReader;
12
16
  activeThreads: Map<string, {
@@ -1 +1 @@
1
- {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/proactive/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAO1C,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,WAAW,CAAC;IACzB,wBAAwB,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1E,yBAAyB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC5E,qBAAqB,CAAC,EAAE,CAAC,iBAAiB,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACnF,SAAS,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,UAAU,CAAC;IAC/C,kBAAkB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,mBAAmB,CAAC;IAClE,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAwFD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAiHzE"}
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/proactive/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAO1C,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,WAAW,CAAC;IACzB,sBAAsB,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAAC;IACzF,yBAAyB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC5E,qBAAqB,CAAC,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACxF,SAAS,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,UAAU,CAAC;IAC/C,kBAAkB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,mBAAmB,CAAC;IAClE,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA0FD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAwHzE"}
@@ -50,15 +50,16 @@ function resolveNotifyChannel(config, body) {
50
50
  }
51
51
  async function resolveSlackContext(config, body) {
52
52
  const workspaceId = resolveWorkspaceId(body);
53
- const slackConnectionId = await config.resolveSlackConnectionId(workspaceId);
54
- if (!slackConnectionId) {
53
+ const slack = await config.resolveSlackConnection(workspaceId);
54
+ if (!slack) {
55
55
  throw new Error(`No Slack connection configured for workspace "${workspaceId}"`);
56
56
  }
57
57
  return {
58
58
  workspaceId,
59
- slackConnectionId,
59
+ slackConnectionId: slack.connectionId,
60
+ slackProviderConfigKey: slack.providerConfigKey,
60
61
  slackBotUserId: config.resolveSlackBotUserId
61
- ? await config.resolveSlackBotUserId(slackConnectionId)
62
+ ? await config.resolveSlackBotUserId(slack)
62
63
  : config.slackBotUserId,
63
64
  };
64
65
  }
@@ -68,11 +69,11 @@ export function createProactiveRoutes(config) {
68
69
  routes.post("/follow-ups", async (c) => {
69
70
  try {
70
71
  const body = normalizeRequestBody(await readOptionalJsonBody(c));
71
- const { workspaceId, slackConnectionId, slackBotUserId } = await resolveSlackContext(config, body);
72
+ const { workspaceId, slackConnectionId, slackProviderConfigKey, slackBotUserId } = await resolveSlackContext(config, body);
72
73
  const githubConnectionId = config.resolveGitHubConnectionId
73
74
  ? await config.resolveGitHubConnectionId(workspaceId)
74
75
  : null;
75
- const stats = await checkFollowUps(config.getMemory(workspaceId), config.nangoClient, slackConnectionId, resolveNotifyChannel(config, body), {
76
+ const stats = await checkFollowUps(config.getMemory(workspaceId), config.nangoClient, slackConnectionId, slackProviderConfigKey, resolveNotifyChannel(config, body), {
76
77
  collector: followUpCollector,
77
78
  slackBotUserId,
78
79
  githubConnectionId: githubConnectionId ?? undefined,
@@ -89,8 +90,8 @@ export function createProactiveRoutes(config) {
89
90
  routes.post("/stale-threads", async (c) => {
90
91
  try {
91
92
  const body = normalizeRequestBody(await readOptionalJsonBody(c));
92
- const { workspaceId, slackConnectionId, slackBotUserId } = await resolveSlackContext(config, body);
93
- const count = await detectStaleThreads(config.getMemory(workspaceId), workspaceId, config.nangoClient, slackConnectionId, config.activeThreads, slackBotUserId, resolveNotifyChannel(config, body));
93
+ const { workspaceId, slackConnectionId, slackProviderConfigKey, slackBotUserId } = await resolveSlackContext(config, body);
94
+ const count = await detectStaleThreads(config.getMemory(workspaceId), workspaceId, config.nangoClient, slackConnectionId, slackProviderConfigKey, config.activeThreads, slackBotUserId, resolveNotifyChannel(config, body));
94
95
  return c.json({ ok: true, workspaceId, staleThreads: count });
95
96
  }
96
97
  catch (error) {
@@ -103,8 +104,8 @@ export function createProactiveRoutes(config) {
103
104
  routes.post("/context-watch", async (c) => {
104
105
  try {
105
106
  const body = normalizeRequestBody(await readOptionalJsonBody(c));
106
- const { workspaceId, slackConnectionId } = await resolveSlackContext(config, body);
107
- const count = await watchContext(config.getMemory(workspaceId), config.nangoClient, slackConnectionId, resolveNotifyChannel(config, body));
107
+ const { workspaceId, slackConnectionId, slackProviderConfigKey } = await resolveSlackContext(config, body);
108
+ const count = await watchContext(config.getMemory(workspaceId), config.nangoClient, slackConnectionId, slackProviderConfigKey, resolveNotifyChannel(config, body));
108
109
  return c.json({ ok: true, workspaceId, updates: count });
109
110
  }
110
111
  catch (error) {
@@ -125,8 +126,8 @@ export function createProactiveRoutes(config) {
125
126
  return c.json({ ok: false, error: "Could not parse pull request data" }, 400);
126
127
  }
127
128
  const workspaceId = resolveWorkspaceId(body);
128
- const { slackConnectionId } = await resolveSlackContext(config, body);
129
- const matched = await matchPRToPlans(pr, config.getMemory(workspaceId), config.nangoClient, slackConnectionId, resolveNotifyChannel(config, body), config.getRelayFileReader?.(workspaceId));
129
+ const { slackConnectionId, slackProviderConfigKey } = await resolveSlackContext(config, body);
130
+ const matched = await matchPRToPlans(pr, config.getMemory(workspaceId), config.nangoClient, slackConnectionId, slackProviderConfigKey, resolveNotifyChannel(config, body), config.getRelayFileReader?.(workspaceId));
130
131
  return c.json({
131
132
  ok: true,
132
133
  workspaceId,
@@ -1 +1 @@
1
- {"version":3,"file":"affirmative-reply-source.d.ts","sourceRoot":"","sources":["../../../src/proactive/evidence-sources/affirmative-reply-source.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAQ/D,wBAAgB,oCAAoC,IAAI,cAAc,CAqErE"}
1
+ {"version":3,"file":"affirmative-reply-source.d.ts","sourceRoot":"","sources":["../../../src/proactive/evidence-sources/affirmative-reply-source.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAQ/D,wBAAgB,oCAAoC,IAAI,cAAc,CAsErE"}
@@ -12,7 +12,7 @@ export function createAffirmativeReplyEvidenceSource() {
12
12
  if (!item.channel) {
13
13
  return null;
14
14
  }
15
- const history = await fetchThreadHistoryViaNango(item.channel, item.threadTs, ctx.slackBotUserId, ctx.nangoClient, ctx.slackConnectionId);
15
+ const history = await fetchThreadHistoryViaNango(item.channel, item.threadTs, ctx.slackBotUserId, ctx.nangoClient, ctx.slackConnectionId, ctx.slackProviderConfigKey);
16
16
  const thresholdMs = parseSlackTimestamp(item.followUpMessageTs) ||
17
17
  item.firstFollowUpSentAt ||
18
18
  item.createdAt;
@@ -1 +1 @@
1
- {"version":3,"file":"explicit-close-source.d.ts","sourceRoot":"","sources":["../../../src/proactive/evidence-sources/explicit-close-source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAU/D,wBAAgB,iCAAiC,IAAI,cAAc,CAwClE"}
1
+ {"version":3,"file":"explicit-close-source.d.ts","sourceRoot":"","sources":["../../../src/proactive/evidence-sources/explicit-close-source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAU/D,wBAAgB,iCAAiC,IAAI,cAAc,CAyClE"}
@@ -12,7 +12,7 @@ export function createExplicitCloseEvidenceSource() {
12
12
  if (!item.channel) {
13
13
  return null;
14
14
  }
15
- const history = await fetchThreadHistoryViaNango(item.channel, item.threadTs, ctx.slackBotUserId, ctx.nangoClient, ctx.slackConnectionId);
15
+ const history = await fetchThreadHistoryViaNango(item.channel, item.threadTs, ctx.slackBotUserId, ctx.nangoClient, ctx.slackConnectionId, ctx.slackProviderConfigKey);
16
16
  for (const message of [...history].reverse()) {
17
17
  if (message.role !== "user") {
18
18
  continue;
@@ -1 +1 @@
1
- {"version":3,"file":"reaction-source.d.ts","sourceRoot":"","sources":["../../../src/proactive/evidence-sources/reaction-source.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAsB/D,wBAAgB,4BAA4B,IAAI,cAAc,CA2C7D"}
1
+ {"version":3,"file":"reaction-source.d.ts","sourceRoot":"","sources":["../../../src/proactive/evidence-sources/reaction-source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAsB/D,wBAAgB,4BAA4B,IAAI,cAAc,CA2C7D"}
@@ -1,4 +1,3 @@
1
- import { NANGO_INTEGRATIONS } from "../../nango.js";
2
1
  const CLOSE_REACTIONS = new Set(["white_check_mark", "heavy_check_mark", "ballot_box_with_check", "tada"]);
3
2
  function parseSlackTimestamp(value) {
4
3
  const parsed = Number(value);
@@ -18,7 +17,7 @@ export function createReactionEvidenceSource() {
18
17
  });
19
18
  const response = await ctx.nangoClient.proxy({
20
19
  connectionId: ctx.slackConnectionId,
21
- providerConfigKey: NANGO_INTEGRATIONS.SLACK,
20
+ providerConfigKey: ctx.slackProviderConfigKey,
22
21
  method: "GET",
23
22
  endpoint: `/reactions.get?${params.toString()}`,
24
23
  });
@@ -26,5 +26,5 @@ export declare function hydrateItem(candidate: FollowUpCandidate, storedItems: M
26
26
  }>): FollowUpItem;
27
27
  export declare function persistItem(memory: SageMemory, item: FollowUpItem): Promise<void>;
28
28
  export declare function evaluateFollowUp(item: FollowUpItem, candidate: FollowUpCandidate, destination: "thread" | "notify-channel", ctx: CollectCtx, collector: EvidenceCollector): Promise<EvaluatedFollowUp>;
29
- export declare function checkFollowUps(memory: SageMemory, nangoClient: NangoClient, slackConnectionId: string, notifyChannel?: string, options?: CheckFollowUpsOptions): Promise<FollowUpStats>;
29
+ export declare function checkFollowUps(memory: SageMemory, nangoClient: NangoClient, slackConnectionId: string, slackProviderConfigKey: string, notifyChannel?: string, options?: CheckFollowUpsOptions): Promise<FollowUpStats>;
30
30
  //# sourceMappingURL=follow-up-checker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"follow-up-checker.d.ts","sourceRoot":"","sources":["../../src/proactive/follow-up-checker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,KAAK,EAAmB,UAAU,EAAY,cAAc,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA4DzH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAmUD,wBAAgB,WAAW,CACzB,SAAS,EAAE,iBAAiB,EAC5B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EACtC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,GACnE,YAAY,CA8Bd;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvF;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,YAAY,EAClB,SAAS,EAAE,iBAAiB,EAC5B,WAAW,EAAE,QAAQ,GAAG,gBAAgB,EACxC,GAAG,EAAE,UAAU,EACf,SAAS,EAAE,iBAAiB,GAC3B,OAAO,CAAC,iBAAiB,CAAC,CAuE5B;AAkBD,wBAAsB,cAAc,CAClC,MAAM,EAAE,UAAU,EAClB,WAAW,EAAE,WAAW,EACxB,iBAAiB,EAAE,MAAM,EACzB,aAAa,CAAC,EAAE,MAAM,EACtB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,aAAa,CAAC,CA0JxB"}
1
+ {"version":3,"file":"follow-up-checker.d.ts","sourceRoot":"","sources":["../../src/proactive/follow-up-checker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,KAAK,EAAmB,UAAU,EAAY,cAAc,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA4DzH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAmUD,wBAAgB,WAAW,CACzB,SAAS,EAAE,iBAAiB,EAC5B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EACtC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,GACnE,YAAY,CA8Bd;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvF;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,YAAY,EAClB,SAAS,EAAE,iBAAiB,EAC5B,WAAW,EAAE,QAAQ,GAAG,gBAAgB,EACxC,GAAG,EAAE,UAAU,EACf,SAAS,EAAE,iBAAiB,GAC3B,OAAO,CAAC,iBAAiB,CAAC,CAuE5B;AAkBD,wBAAsB,cAAc,CAClC,MAAM,EAAE,UAAU,EAClB,WAAW,EAAE,WAAW,EACxB,iBAAiB,EAAE,MAAM,EACzB,sBAAsB,EAAE,MAAM,EAC9B,aAAa,CAAC,EAAE,MAAM,EACtB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,aAAa,CAAC,CA8JxB"}
@@ -399,7 +399,7 @@ function shouldPersistNoop(current, next) {
399
399
  current.evidence.length !== next.evidence.length ||
400
400
  current.question !== next.question);
401
401
  }
402
- export async function checkFollowUps(memory, nangoClient, slackConnectionId, notifyChannel, options = {}) {
402
+ export async function checkFollowUps(memory, nangoClient, slackConnectionId, slackProviderConfigKey, notifyChannel, options = {}) {
403
403
  const workspaceId = getWorkspaceId(memory);
404
404
  if (!workspaceId) {
405
405
  console.warn("[proactive/follow-ups] Could not determine workspace ID");
@@ -425,6 +425,7 @@ export async function checkFollowUps(memory, nangoClient, slackConnectionId, not
425
425
  memory,
426
426
  nangoClient,
427
427
  slackConnectionId,
428
+ slackProviderConfigKey,
428
429
  slackBotUserId: options.slackBotUserId,
429
430
  githubConnectionId: options.githubConnectionId,
430
431
  now,
@@ -433,7 +434,7 @@ export async function checkFollowUps(memory, nangoClient, slackConnectionId, not
433
434
  const evaluated = await evaluateFollowUp(item, candidate, destination, ctx, collector);
434
435
  if (evaluated.action === "close") {
435
436
  if (item.channel) {
436
- const result = await postSlackMessageChunkedViaNango(item.channel, `Marking this one as done based on ${evaluated.reason}. Ping me if I got it wrong.`, item.threadTs, nangoClient, slackConnectionId, MAX_REPLY_CHARS);
437
+ const result = await postSlackMessageChunkedViaNango(item.channel, `Marking this one as done based on ${evaluated.reason}. Ping me if I got it wrong.`, item.threadTs, nangoClient, slackConnectionId, slackProviderConfigKey, MAX_REPLY_CHARS);
437
438
  if (!result.ok) {
438
439
  console.warn(`[proactive/follow-ups] Failed to post closure note for ${item.threadTs}: ${result.error}`);
439
440
  }
@@ -453,7 +454,7 @@ export async function checkFollowUps(memory, nangoClient, slackConnectionId, not
453
454
  continue;
454
455
  }
455
456
  const targetThreadTs = destination === "thread" ? item.threadTs : undefined;
456
- const result = await postSlackMessageChunkedViaNango(targetChannel, evaluated.message, targetThreadTs, nangoClient, slackConnectionId, MAX_REPLY_CHARS);
457
+ const result = await postSlackMessageChunkedViaNango(targetChannel, evaluated.message, targetThreadTs, nangoClient, slackConnectionId, slackProviderConfigKey, MAX_REPLY_CHARS);
457
458
  if (!result.ok) {
458
459
  console.warn(`[proactive/follow-ups] Failed to post follow-up for ${item.threadTs}: ${result.error}`);
459
460
  continue;
@@ -480,7 +481,7 @@ export async function checkFollowUps(memory, nangoClient, slackConnectionId, not
480
481
  continue;
481
482
  }
482
483
  const targetThreadTs = destination === "thread" ? item.threadTs : undefined;
483
- const result = await postSlackMessageChunkedViaNango(targetChannel, evaluated.message, targetThreadTs, nangoClient, slackConnectionId, MAX_REPLY_CHARS);
484
+ const result = await postSlackMessageChunkedViaNango(targetChannel, evaluated.message, targetThreadTs, nangoClient, slackConnectionId, slackProviderConfigKey, MAX_REPLY_CHARS);
484
485
  if (!result.ok) {
485
486
  console.warn(`[proactive/follow-ups] Failed to post stale ping for ${item.threadTs}: ${result.error}`);
486
487
  continue;
@@ -9,6 +9,6 @@ interface PullRequestData {
9
9
  files?: string[];
10
10
  url?: string;
11
11
  }
12
- export declare function matchPRToPlans(prData: PullRequestData, memory: SageMemory, nangoClient: NangoClient, slackConnectionId: string, notifyChannel?: string, reader?: SageRelayFileReader): Promise<boolean>;
12
+ export declare function matchPRToPlans(prData: PullRequestData, memory: SageMemory, nangoClient: NangoClient, slackConnectionId: string, slackProviderConfigKey: string, notifyChannel?: string, reader?: SageRelayFileReader): Promise<boolean>;
13
13
  export {};
14
14
  //# sourceMappingURL=pr-matcher.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pr-matcher.d.ts","sourceRoot":"","sources":["../../src/proactive/pr-matcher.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAG/E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AA4B/C,UAAU,eAAe;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AA2aD,wBAAsB,cAAc,CAClC,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,UAAU,EAClB,WAAW,EAAE,WAAW,EACxB,iBAAiB,EAAE,MAAM,EACzB,aAAa,CAAC,EAAE,MAAM,EACtB,MAAM,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,OAAO,CAAC,CA2FlB"}
1
+ {"version":3,"file":"pr-matcher.d.ts","sourceRoot":"","sources":["../../src/proactive/pr-matcher.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAG/E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AA4B/C,UAAU,eAAe;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AA6aD,wBAAsB,cAAc,CAClC,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,UAAU,EAClB,WAAW,EAAE,WAAW,EACxB,iBAAiB,EAAE,MAAM,EACzB,sBAAsB,EAAE,MAAM,EAC9B,aAAa,CAAC,EAAE,MAAM,EACtB,MAAM,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,OAAO,CAAC,CA6FlB"}
@@ -275,7 +275,7 @@ async function hasAlreadyNotified(workspaceId, prNumber) {
275
275
  const markers = await listMarkers(workspaceId);
276
276
  return markers.some((marker) => marker.includes(`pr=${prNumber}`));
277
277
  }
278
- async function maybePostPlanDrift(prData, workspaceId, memory, reader, nangoClient, slackConnectionId, notifyChannel) {
278
+ async function maybePostPlanDrift(prData, workspaceId, memory, reader, nangoClient, slackConnectionId, slackProviderConfigKey, notifyChannel) {
279
279
  if (!isPlanDriftEnabled() || !reader?.isEnabled()) {
280
280
  return;
281
281
  }
@@ -306,7 +306,7 @@ async function maybePostPlanDrift(prData, workspaceId, memory, reader, nangoClie
306
306
  repo: prData.repo,
307
307
  ...(prData.url ? { url: prData.url } : {}),
308
308
  });
309
- const postResult = await postSlackMessageChunkedViaNango(targetChannel, message, targetThreadTs, nangoClient, slackConnectionId, MAX_REPLY_CHARS);
309
+ const postResult = await postSlackMessageChunkedViaNango(targetChannel, message, targetThreadTs, nangoClient, slackConnectionId, slackProviderConfigKey, MAX_REPLY_CHARS);
310
310
  if (!postResult.ok) {
311
311
  console.warn(`[proactive/pr-matcher] Failed to post plan drift for #${prData.number}: ${postResult.error}`);
312
312
  }
@@ -323,7 +323,7 @@ async function maybePostPlanDrift(prData, workspaceId, memory, reader, nangoClie
323
323
  createdAt: Date.now(),
324
324
  });
325
325
  }
326
- export async function matchPRToPlans(prData, memory, nangoClient, slackConnectionId, notifyChannel, reader) {
326
+ export async function matchPRToPlans(prData, memory, nangoClient, slackConnectionId, slackProviderConfigKey, notifyChannel, reader) {
327
327
  if (!notifyChannel) {
328
328
  console.warn("[proactive/pr-matcher] No notification channel configured");
329
329
  return false;
@@ -367,14 +367,14 @@ export async function matchPRToPlans(prData, memory, nangoClient, slackConnectio
367
367
  console.log(`[proactive/pr-matcher] No confident match for PR #${prData.number}`);
368
368
  return false;
369
369
  }
370
- const result = await postSlackMessageChunkedViaNango(notifyChannel, decision.message, undefined, nangoClient, slackConnectionId, MAX_REPLY_CHARS);
370
+ const result = await postSlackMessageChunkedViaNango(notifyChannel, decision.message, undefined, nangoClient, slackConnectionId, slackProviderConfigKey, MAX_REPLY_CHARS);
371
371
  if (!result.ok) {
372
372
  console.warn(`[proactive/pr-matcher] Failed to post PR match for #${prData.number}: ${result.error}`);
373
373
  return false;
374
374
  }
375
375
  await memory.saveWorkspaceContext(`pr=${prData.number} repo=${prData.repo} title=${prData.title}`, [PR_MATCH_TAG]);
376
376
  try {
377
- await maybePostPlanDrift(prData, workspaceId, memory, reader, nangoClient, slackConnectionId, notifyChannel);
377
+ await maybePostPlanDrift(prData, workspaceId, memory, reader, nangoClient, slackConnectionId, slackProviderConfigKey, notifyChannel);
378
378
  }
379
379
  catch (error) {
380
380
  console.error(`[proactive/pr-matcher] Plan drift boomerang failed for #${prData.number}`, error);
@@ -4,6 +4,6 @@ interface ActiveThreadContext {
4
4
  workspaceId: string;
5
5
  channel: string;
6
6
  }
7
- export declare function detectStaleThreads(memory: SageMemory, workspaceId: string, nangoClient: NangoClient, slackConnectionId: string, activeThreads: Map<string, ActiveThreadContext>, slackBotUserId?: string, notifyChannel?: string): Promise<number>;
7
+ export declare function detectStaleThreads(memory: SageMemory, workspaceId: string, nangoClient: NangoClient, slackConnectionId: string, slackProviderConfigKey: string, activeThreads: Map<string, ActiveThreadContext>, slackBotUserId?: string, notifyChannel?: string): Promise<number>;
8
8
  export {};
9
9
  //# sourceMappingURL=stale-thread-detector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stale-thread-detector.d.ts","sourceRoot":"","sources":["../../src/proactive/stale-thread-detector.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAgC/C,UAAU,mBAAmB;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAwND,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,UAAU,EAClB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,WAAW,EACxB,iBAAiB,EAAE,MAAM,EACzB,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,EAC/C,cAAc,CAAC,EAAE,MAAM,EACvB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC,CAmFjB"}
1
+ {"version":3,"file":"stale-thread-detector.d.ts","sourceRoot":"","sources":["../../src/proactive/stale-thread-detector.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAgC/C,UAAU,mBAAmB;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAyND,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,UAAU,EAClB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,WAAW,EACxB,iBAAiB,EAAE,MAAM,EACzB,sBAAsB,EAAE,MAAM,EAC9B,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,EAC/C,cAAc,CAAC,EAAE,MAAM,EACvB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC,CAqFjB"}
@@ -134,7 +134,7 @@ async function listRecentlyAlertedThreadIds(workspaceId, now) {
134
134
  }
135
135
  return alertedThreadIds;
136
136
  }
137
- async function fetchLastActivityMs(ref, nangoClient, slackConnectionId) {
137
+ async function fetchLastActivityMs(ref, nangoClient, slackConnectionId, slackProviderConfigKey) {
138
138
  const params = new URLSearchParams({
139
139
  channel: ref.channel,
140
140
  ts: ref.threadTs,
@@ -142,7 +142,7 @@ async function fetchLastActivityMs(ref, nangoClient, slackConnectionId) {
142
142
  });
143
143
  const response = await nangoClient.proxy({
144
144
  connectionId: slackConnectionId,
145
- providerConfigKey: "slack",
145
+ providerConfigKey: slackProviderConfigKey,
146
146
  method: "GET",
147
147
  endpoint: `/conversations.replies?${params.toString()}`,
148
148
  });
@@ -169,7 +169,7 @@ async function evaluateThread(ref, history, quietPeriod) {
169
169
  ], { model: HAIKU_MODEL, temperature: 0 });
170
170
  return parseDecision(response.content);
171
171
  }
172
- export async function detectStaleThreads(memory, workspaceId, nangoClient, slackConnectionId, activeThreads, slackBotUserId, notifyChannel) {
172
+ export async function detectStaleThreads(memory, workspaceId, nangoClient, slackConnectionId, slackProviderConfigKey, activeThreads, slackBotUserId, notifyChannel) {
173
173
  if (activeThreads.size === 0) {
174
174
  console.log("[proactive/stale-threads] No active threads to inspect");
175
175
  return 0;
@@ -193,11 +193,11 @@ export async function detectStaleThreads(memory, workspaceId, nangoClient, slack
193
193
  continue;
194
194
  }
195
195
  try {
196
- const history = await fetchThreadHistoryViaNango(ref.channel, ref.threadTs, slackBotUserId, nangoClient, slackConnectionId);
196
+ const history = await fetchThreadHistoryViaNango(ref.channel, ref.threadTs, slackBotUserId, nangoClient, slackConnectionId, slackProviderConfigKey);
197
197
  if (history.length < 2 || !history.some((message) => message.role === "assistant")) {
198
198
  continue;
199
199
  }
200
- const lastActivityMs = await fetchLastActivityMs(ref, nangoClient, slackConnectionId);
200
+ const lastActivityMs = await fetchLastActivityMs(ref, nangoClient, slackConnectionId, slackProviderConfigKey);
201
201
  if (!lastActivityMs || now - lastActivityMs < THREE_DAYS_MS) {
202
202
  continue;
203
203
  }
@@ -206,7 +206,7 @@ export async function detectStaleThreads(memory, workspaceId, nangoClient, slack
206
206
  if (!decision?.shouldAlert || !decision.message) {
207
207
  continue;
208
208
  }
209
- const result = await postSlackMessageChunkedViaNango(notifyChannel ?? ref.channel, decision.message, undefined, nangoClient, slackConnectionId, MAX_REPLY_CHARS);
209
+ const result = await postSlackMessageChunkedViaNango(notifyChannel ?? ref.channel, decision.message, undefined, nangoClient, slackConnectionId, slackProviderConfigKey, MAX_REPLY_CHARS);
210
210
  if (!result.ok) {
211
211
  console.warn(`[proactive/stale-threads] Failed to post alert for ${ref.threadTs}: ${result.error}`);
212
212
  continue;
@@ -43,6 +43,7 @@ export interface CollectCtx {
43
43
  memory: SageMemory;
44
44
  nangoClient: NangoClient;
45
45
  slackConnectionId: string;
46
+ slackProviderConfigKey: string;
46
47
  slackBotUserId?: string;
47
48
  githubConnectionId?: string;
48
49
  now: number;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/proactive/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,mBAAmB,GAAG,UAAU,GAAG,gBAAgB,CAAC;AAEhG,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,aAAa,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEzE,MAAM,MAAM,cAAc,GAAG,gBAAgB,GAAG,OAAO,GAAG,aAAa,GAAG,MAAM,GAAG,YAAY,CAAC;AAEhG,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,gBAAgB,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,cAAc,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,OAAO,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;IAClD,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,UAAU,CAAC;IACnB,WAAW,EAAE,WAAW,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,YAAY,EAAE,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/proactive/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,mBAAmB,GAAG,UAAU,GAAG,gBAAgB,CAAC;AAEhG,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,aAAa,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEzE,MAAM,MAAM,cAAc,GAAG,gBAAgB,GAAG,OAAO,GAAG,aAAa,GAAG,MAAM,GAAG,YAAY,CAAC;AAEhG,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,gBAAgB,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,cAAc,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,OAAO,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;IAClD,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,UAAU,CAAC;IACnB,WAAW,EAAE,WAAW,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,YAAY,EAAE,aAAa,EAAE,CAAC"}
package/dist/slack.d.ts CHANGED
@@ -41,16 +41,16 @@ export declare function parseSlackEvent(payload: unknown): SlackEvent;
41
41
  */
42
42
  export declare function markdownToSlackMrkdwn(text: string): string;
43
43
  export declare function chunkSlackMessage(text: string, maxChars?: number): string[];
44
- export declare function postSlackMessageViaNango(channel: string, text: string, threadTs: string | undefined, nangoClient: NangoClient, connectionId: string): Promise<{
44
+ export declare function postSlackMessageViaNango(channel: string, text: string, threadTs: string | undefined, nangoClient: NangoClient, connectionId: string, providerConfigKey: string): Promise<{
45
45
  ok: boolean;
46
46
  ts?: string;
47
47
  error?: string;
48
48
  }>;
49
- export declare function postSlackMessageChunkedViaNango(channel: string, text: string, threadTs: string | undefined, nangoClient: NangoClient, connectionId: string, maxChars?: number): Promise<{
49
+ export declare function postSlackMessageChunkedViaNango(channel: string, text: string, threadTs: string | undefined, nangoClient: NangoClient, connectionId: string, providerConfigKey: string, maxChars?: number): Promise<{
50
50
  ok: boolean;
51
51
  ts?: string;
52
52
  error?: string;
53
53
  }>;
54
- export declare function addSlackReactionViaNango(channel: string, timestamp: string, emoji: string, nangoClient: NangoClient, connectionId: string): Promise<void>;
55
- export declare function fetchThreadHistoryViaNango(channel: string, threadTs: string, slackBotUserId: string | undefined, nangoClient: NangoClient, connectionId: string): Promise<ThreadMessage[]>;
54
+ export declare function addSlackReactionViaNango(channel: string, timestamp: string, emoji: string, nangoClient: NangoClient, connectionId: string, providerConfigKey: string): Promise<void>;
55
+ export declare function fetchThreadHistoryViaNango(channel: string, threadTs: string, slackBotUserId: string | undefined, nangoClient: NangoClient, connectionId: string, providerConfigKey: string): Promise<ThreadMessage[]>;
56
56
  //# sourceMappingURL=slack.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"slack.d.ts","sourceRoot":"","sources":["../src/slack.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAQ9C,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,kBAAkB,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAgGD,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GACpB,OAAO,CA2BT;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,kBAAkB,CAmB5E;AAQD,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,CA+C5D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA4C1D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAQ,GAAG,MAAM,EAAE,CAE1E;AAED,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA6BvD;AAED,wBAAsB,+BAA+B,CACnD,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,MAAM,EACpB,QAAQ,SAAQ,GACf,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA2BvD;AAED,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,aAAa,EAAE,CAAC,CAqC1B"}
1
+ {"version":3,"file":"slack.d.ts","sourceRoot":"","sources":["../src/slack.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAQ9C,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,kBAAkB,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAgGD,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GACpB,OAAO,CA2BT;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,kBAAkB,CAmB5E;AAQD,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,CA+C5D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA4C1D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAQ,GAAG,MAAM,EAAE,CAE1E;AAED,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,MAAM,EACpB,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA6BvD;AAED,wBAAsB,+BAA+B,CACnD,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,MAAM,EACpB,iBAAiB,EAAE,MAAM,EACzB,QAAQ,SAAQ,GACf,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAkCvD;AAED,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,MAAM,EACpB,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,MAAM,EACpB,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAAC,aAAa,EAAE,CAAC,CAqC1B"}
package/dist/slack.js CHANGED
@@ -213,7 +213,7 @@ export function markdownToSlackMrkdwn(text) {
213
213
  export function chunkSlackMessage(text, maxChars = 3_000) {
214
214
  return splitSlackChunk(text, maxChars);
215
215
  }
216
- export async function postSlackMessageViaNango(channel, text, threadTs, nangoClient, connectionId) {
216
+ export async function postSlackMessageViaNango(channel, text, threadTs, nangoClient, connectionId, providerConfigKey) {
217
217
  const body = {
218
218
  channel,
219
219
  text,
@@ -224,7 +224,7 @@ export async function postSlackMessageViaNango(channel, text, threadTs, nangoCli
224
224
  try {
225
225
  const data = await nangoClient.proxy({
226
226
  connectionId,
227
- providerConfigKey: "slack",
227
+ providerConfigKey,
228
228
  method: "POST",
229
229
  endpoint: "/chat.postMessage",
230
230
  data: body,
@@ -242,7 +242,7 @@ export async function postSlackMessageViaNango(channel, text, threadTs, nangoCli
242
242
  };
243
243
  }
244
244
  }
245
- export async function postSlackMessageChunkedViaNango(channel, text, threadTs, nangoClient, connectionId, maxChars = 3_000) {
245
+ export async function postSlackMessageChunkedViaNango(channel, text, threadTs, nangoClient, connectionId, providerConfigKey, maxChars = 3_000) {
246
246
  const chunks = chunkSlackMessage(text, maxChars);
247
247
  if (!chunks.length) {
248
248
  return { ok: false, error: "Cannot post an empty Slack message" };
@@ -250,7 +250,7 @@ export async function postSlackMessageChunkedViaNango(channel, text, threadTs, n
250
250
  let firstTs;
251
251
  let replyThreadTs = threadTs;
252
252
  for (const chunk of chunks) {
253
- const result = await postSlackMessageViaNango(channel, chunk, replyThreadTs, nangoClient, connectionId);
253
+ const result = await postSlackMessageViaNango(channel, chunk, replyThreadTs, nangoClient, connectionId, providerConfigKey);
254
254
  if (!result.ok) {
255
255
  return {
256
256
  ok: false,
@@ -266,11 +266,11 @@ export async function postSlackMessageChunkedViaNango(channel, text, threadTs, n
266
266
  ...(firstTs ? { ts: firstTs } : {}),
267
267
  };
268
268
  }
269
- export async function addSlackReactionViaNango(channel, timestamp, emoji, nangoClient, connectionId) {
269
+ export async function addSlackReactionViaNango(channel, timestamp, emoji, nangoClient, connectionId, providerConfigKey) {
270
270
  try {
271
271
  await nangoClient.proxy({
272
272
  connectionId,
273
- providerConfigKey: "slack",
273
+ providerConfigKey,
274
274
  method: "POST",
275
275
  endpoint: "/reactions.add",
276
276
  data: { channel, timestamp, name: emoji },
@@ -280,7 +280,7 @@ export async function addSlackReactionViaNango(channel, timestamp, emoji, nangoC
280
280
  // Non-fatal — don't block processing if reaction fails
281
281
  }
282
282
  }
283
- export async function fetchThreadHistoryViaNango(channel, threadTs, slackBotUserId, nangoClient, connectionId) {
283
+ export async function fetchThreadHistoryViaNango(channel, threadTs, slackBotUserId, nangoClient, connectionId, providerConfigKey) {
284
284
  try {
285
285
  const params = new URLSearchParams({
286
286
  channel,
@@ -289,7 +289,7 @@ export async function fetchThreadHistoryViaNango(channel, threadTs, slackBotUser
289
289
  });
290
290
  const data = await nangoClient.proxy({
291
291
  connectionId,
292
- providerConfigKey: "slack",
292
+ providerConfigKey,
293
293
  method: "GET",
294
294
  endpoint: `/conversations.replies?${params.toString()}`,
295
295
  });
package/dist/types.d.ts CHANGED
@@ -15,6 +15,7 @@ export interface SageBindings {
15
15
  RELAY_JWT_SECRET?: string;
16
16
  NANGO_GITHUB_CONNECTION_ID?: string;
17
17
  NANGO_SLACK_CONNECTION_ID?: string;
18
+ NANGO_SLACK_PROVIDER_CONFIG_KEY?: string;
18
19
  SLACK_BOT_USER_ID?: string;
19
20
  SLACK_SIGNING_SECRET?: string;
20
21
  SAGE_NOTIFY_CHANNEL?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAI/E;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAE5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE;QAAE,KAAK,EAAE,CAAC,IAAI,EAAE;YAAE,GAAG,EAAE,MAAM,CAAA;SAAE,KAAK,OAAO,CAAC;YAAE,OAAO,EAAE,OAAO,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;CAClF"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAI/E;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAE5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,+BAA+B,CAAC,EAAE,MAAM,CAAC;IACzC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE;QAAE,KAAK,EAAE,CAAC,IAAI,EAAE;YAAE,GAAG,EAAE,MAAM,CAAA;SAAE,KAAK,OAAO,CAAC;YAAE,OAAO,EAAE,OAAO,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;CAClF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentworkforce/sage",
3
- "version": "1.0.5",
3
+ "version": "1.0.6",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/AgentWorkforce/sage.git"