@agentworkforce/sage 1.2.1 → 1.2.2

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/app.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AA0C5B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAwB/C,UAAU,YAAY;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,KAAK,MAAM,GAAG;IACZ,QAAQ,EAAE,YAAY,CAAC;IACvB,SAAS,EAAE,YAAY,CAAC;CACzB,CAAC;AAivCF,wBAAgB,aAAa,IAAI,IAAI,CAAC,MAAM,CAAC,CAmiB5C"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AA0C5B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAwB/C,UAAU,YAAY;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,KAAK,MAAM,GAAG;IACZ,QAAQ,EAAE,YAAY,CAAC;IACvB,SAAS,EAAE,YAAY,CAAC;CACzB,CAAC;AAkwCF,wBAAgB,aAAa,IAAI,IAAI,CAAC,MAAM,CAAC,CAoiB5C"}
package/dist/app.js CHANGED
@@ -700,7 +700,10 @@ async function processSlackEvent(event, workspaceId, env, slack, options = {}) {
700
700
  ttlSeconds: ACTIVE_THREAD_TTL_SECONDS,
701
701
  });
702
702
  const workspaceSlackBotUserId = options.slackBotUserId ?? await detectSlackBotUserId(slack);
703
- const { connectionId: githubConnectionId, providerConfigKey: githubProviderConfigKey, } = await resolveGitHubConnection(workspaceId, env);
703
+ // Use the cloud workspace UUID for cross-provider lookups (GitHub, Linear,
704
+ // etc.) instead of the Slack team id.
705
+ const cloudWorkspaceId = options.cloudWorkspaceId ?? slack.getResolvedWorkspaceId() ?? workspaceId;
706
+ const { connectionId: githubConnectionId, providerConfigKey: githubProviderConfigKey, } = await resolveGitHubConnection(cloudWorkspaceId, env);
704
707
  const relayfileReader = await getRelayFileReader(workspaceId, env);
705
708
  const github = githubConnectionId && githubProviderConfigKey
706
709
  ? new GitHubIntegration({
@@ -854,9 +857,10 @@ function readCachedSlackBotUserId(workspaceId) {
854
857
  }
855
858
  return entry.userId; // may be undefined (previous fetch failed) — still cached
856
859
  }
857
- function writeCachedSlackBotUserId(workspaceId, userId) {
860
+ function writeCachedSlackBotUserId(workspaceId, userId, cloudWorkspaceId) {
858
861
  slackBotUserIdCache.set(workspaceId, {
859
862
  userId,
863
+ cloudWorkspaceId,
860
864
  expiresAt: Date.now() + SLACK_BOT_USER_ID_CACHE_TTL_MS,
861
865
  });
862
866
  return userId;
@@ -865,18 +869,27 @@ async function resolveWorkspaceSlackContext(workspaceId, provider) {
865
869
  const slack = createSlackEgress(provider, workspaceId);
866
870
  // Cache hit = skip the auth.test round trip entirely. Important for
867
871
  // hot webhook paths where every saved ms compounds under retry storms.
868
- const cached = readCachedSlackBotUserId(workspaceId);
869
- if (cached !== null) {
872
+ // Only use the cache when cloudWorkspaceId was actually resolved; an
873
+ // undefined value means a prior call never received the UUID (e.g.
874
+ // staggered proxy rollout or transient response), so we re-resolve.
875
+ const cachedEntry = slackBotUserIdCache.get(workspaceId);
876
+ if (cachedEntry && cachedEntry.expiresAt > Date.now() && cachedEntry.cloudWorkspaceId !== undefined) {
870
877
  return {
871
878
  workspaceId,
879
+ cloudWorkspaceId: cachedEntry.cloudWorkspaceId,
872
880
  slack,
873
- ...(cached !== undefined ? { slackBotUserId: cached } : {}),
881
+ ...(cachedEntry.userId !== undefined ? { slackBotUserId: cachedEntry.userId } : {}),
874
882
  };
875
883
  }
884
+ if (cachedEntry) {
885
+ slackBotUserIdCache.delete(workspaceId);
886
+ }
876
887
  const userId = await detectSlackBotUserId(slack);
877
- writeCachedSlackBotUserId(workspaceId, userId);
888
+ const resolvedCloudId = slack.getResolvedWorkspaceId();
889
+ writeCachedSlackBotUserId(workspaceId, userId, resolvedCloudId);
878
890
  return {
879
891
  workspaceId,
892
+ cloudWorkspaceId: resolvedCloudId ?? workspaceId,
880
893
  slack,
881
894
  ...(userId !== undefined ? { slackBotUserId: userId } : {}),
882
895
  };
@@ -996,8 +1009,8 @@ export function createSageApp() {
996
1009
  const cloudProxyProvider = getCloudProxyProvider(c.env);
997
1010
  if (pathname === "/follow-ups") {
998
1011
  try {
999
- const { slack } = await resolveWorkspaceSlackContext(workspaceId, cloudProxyProvider);
1000
- const { connectionId: githubConnectionId, providerConfigKey: githubProviderConfigKey, } = await resolveGitHubConnection(workspaceId, c.env);
1012
+ const { slack, cloudWorkspaceId } = await resolveWorkspaceSlackContext(workspaceId, cloudProxyProvider);
1013
+ const { connectionId: githubConnectionId, providerConfigKey: githubProviderConfigKey, } = await resolveGitHubConnection(cloudWorkspaceId, c.env);
1001
1014
  const collector = new ProviderConfigAwareEvidenceCollector(getFollowUpEvidenceCollector(), githubProviderConfigKey ?? undefined);
1002
1015
  const stats = await checkFollowUps(getMemory(workspaceId), slack, notifyChannel, {
1003
1016
  collector,
@@ -1337,7 +1350,7 @@ export function createSageApp() {
1337
1350
  await markEventSeen(c.env.DEDUP, deduplicationKey);
1338
1351
  const workspaceId = getWorkspaceId(event, c.env);
1339
1352
  const cloudProxyProvider = getCloudProxyProvider(c.env);
1340
- const { slack, slackBotUserId: workspaceSlackBotUserId } = await resolveWorkspaceSlackContext(workspaceId, cloudProxyProvider);
1353
+ const { slack, slackBotUserId: workspaceSlackBotUserId, cloudWorkspaceId } = await resolveWorkspaceSlackContext(workspaceId, cloudProxyProvider);
1341
1354
  const threadGate = new SlackThreadGate({
1342
1355
  store: createThreadStore(c.env.THREADS),
1343
1356
  ttlSeconds: ACTIVE_THREAD_TTL_SECONDS,
@@ -1388,6 +1401,7 @@ export function createSageApp() {
1388
1401
  raw: {
1389
1402
  run: () => processSlackEvent(event, workspaceId, c.env, slack, {
1390
1403
  slackBotUserId: workspaceSlackBotUserId,
1404
+ cloudWorkspaceId,
1391
1405
  }),
1392
1406
  },
1393
1407
  });
@@ -12,6 +12,8 @@ export interface ProxyResponse<T = unknown> {
12
12
  status: number;
13
13
  headers: ProxyHeaders;
14
14
  data: T;
15
+ /** Cloud workspace UUID resolved by the proxy (present when the proxy resolves a Slack team id). */
16
+ resolvedWorkspaceId?: string;
15
17
  }
16
18
  export interface ConnectionProvider {
17
19
  readonly name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"cloud-proxy-provider.d.ts","sourceRoot":"","sources":["../../src/integrations/cloud-proxy-provider.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;AACtE,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAClD,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEhD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,OAAO;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,YAAY,CAAC;IACtB,IAAI,EAAE,CAAC,CAAC;CACT;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CACjC;AAsDD,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;gBAEnB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE;CAOjG;AAwBD,qBAAa,kBAAmB,YAAW,kBAAkB;IAC3D,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;gBAE3B,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE;IAK5D,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IA0DpE,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAWtC"}
1
+ {"version":3,"file":"cloud-proxy-provider.d.ts","sourceRoot":"","sources":["../../src/integrations/cloud-proxy-provider.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;AACtE,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAClD,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEhD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,OAAO;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,YAAY,CAAC;IACtB,IAAI,EAAE,CAAC,CAAC;IACR,oGAAoG;IACpG,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CACjC;AAwDD,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;gBAEnB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE;CAOjG;AAyBD,qBAAa,kBAAmB,YAAW,kBAAkB;IAC3D,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;gBAE3B,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE;IAK5D,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IA2DpE,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAWtC"}
@@ -54,6 +54,7 @@ function parseEnvelope(payload) {
54
54
  return {
55
55
  ok: true,
56
56
  data: ("data" in payload ? payload.data : undefined),
57
+ ...(readString(payload.workspaceId) ? { workspaceId: readString(payload.workspaceId) } : {}),
57
58
  };
58
59
  }
59
60
  return {
@@ -122,6 +123,7 @@ export class CloudProxyProvider {
122
123
  status: response.status,
123
124
  headers: {},
124
125
  data: payload.data,
126
+ ...(payload.workspaceId ? { resolvedWorkspaceId: payload.workspaceId } : {}),
125
127
  };
126
128
  }
127
129
  async healthCheck() {
@@ -22,6 +22,8 @@ export interface SlackEgress {
22
22
  fetchThreadHistory(channel: string, threadTs: string, botUserId?: string): Promise<ThreadMessage[]>;
23
23
  getBotUserId(): Promise<string | undefined>;
24
24
  getReactions(channel: string, timestamp: string): Promise<SlackReaction[]>;
25
+ /** Cloud workspace UUID resolved from the Slack team id. Available after the first proxy call. */
26
+ getResolvedWorkspaceId(): string | undefined;
25
27
  }
26
28
  export declare function createSlackEgress(provider: ConnectionProvider, workspaceId: string, overlay?: RecentActionsOverlay): SlackEgress;
27
29
  export type { ConnectionProvider } from "./cloud-proxy-provider.js";
@@ -1 +1 @@
1
- {"version":3,"file":"slack-egress.d.ts","sourceRoot":"","sources":["../../src/integrations/slack-egress.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAgB,MAAM,2BAA2B,CAAC;AAClF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAExE,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,aAAa,CAAC;AA4BrB,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;gBAEnB,OAAO,EAAE,MAAM,EAAE,IAAI,SAAwB,EAAE,YAAY,CAAC,EAAE,MAAM;CAMjF;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC1F,kBAAkB,CAChB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC9B,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,kBAAkB,CAChB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAC5B,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC5C,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;CAC5E;AAqGD,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,kBAAkB,EAC5B,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,WAAW,CAgLb;AAED,YAAY,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"slack-egress.d.ts","sourceRoot":"","sources":["../../src/integrations/slack-egress.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAgB,MAAM,2BAA2B,CAAC;AAClF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAExE,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,aAAa,CAAC;AA4BrB,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;gBAEnB,OAAO,EAAE,MAAM,EAAE,IAAI,SAAwB,EAAE,YAAY,CAAC,EAAE,MAAM;CAMjF;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC1F,kBAAkB,CAChB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC9B,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,kBAAkB,CAChB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAC5B,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC5C,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAC3E,kGAAkG;IAClG,sBAAsB,IAAI,MAAM,GAAG,SAAS,CAAC;CAC9C;AAqGD,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,kBAAkB,EAC5B,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,WAAW,CAgNb;AAED,YAAY,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
@@ -81,6 +81,7 @@ export function createSlackEgress(provider, workspaceId, overlay) {
81
81
  const resolvedWorkspaceId = assertWorkspaceId(workspaceId);
82
82
  let cachedBotUserId;
83
83
  let botUserIdLoaded = false;
84
+ let cloudWorkspaceId;
84
85
  const postMessage = async (channel, text, threadTs) => {
85
86
  const body = {
86
87
  channel,
@@ -177,10 +178,31 @@ export function createSlackEgress(provider, workspaceId, overlay) {
177
178
  if (botUserIdLoaded) {
178
179
  return cachedBotUserId;
179
180
  }
180
- const response = await executeSlackRequest(provider, createProxyRequest(resolvedWorkspaceId, "/auth.test", "POST"));
181
- cachedBotUserId = asString(response.user_id);
182
- botUserIdLoaded = true;
183
- return cachedBotUserId;
181
+ try {
182
+ const proxyResponse = await provider.proxy(createProxyRequest(resolvedWorkspaceId, "/auth.test", "POST"));
183
+ if (proxyResponse.resolvedWorkspaceId) {
184
+ cloudWorkspaceId = proxyResponse.resolvedWorkspaceId;
185
+ }
186
+ const data = proxyResponse.data;
187
+ // Restore the Slack-level error check that executeSlackRequest performs.
188
+ // The cloud proxy wraps Slack errors as {ok: true, data: {ok: false, error: "..."}},
189
+ // so we must inspect the inner envelope.
190
+ if (isRecord(data) && data.ok === false) {
191
+ throw new SlackEgressError(asString(data.error) ?? "Slack request failed", asString(data.code) ?? "slack_error", asNumber(data.retryAfterMs));
192
+ }
193
+ if (proxyResponse.status >= 400) {
194
+ throw new SlackEgressError(`Slack request failed with status ${proxyResponse.status}`, `http_${proxyResponse.status}`);
195
+ }
196
+ cachedBotUserId = isRecord(data) ? asString(data.user_id) : undefined;
197
+ botUserIdLoaded = true;
198
+ return cachedBotUserId;
199
+ }
200
+ catch (error) {
201
+ throw toSlackEgressError(error);
202
+ }
203
+ },
204
+ getResolvedWorkspaceId() {
205
+ return cloudWorkspaceId;
184
206
  },
185
207
  async getReactions(channel, timestamp) {
186
208
  const response = await executeSlackRequest(provider, createProxyRequest(resolvedWorkspaceId, "/reactions.get", "GET", {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentworkforce/sage",
3
- "version": "1.2.1",
3
+ "version": "1.2.2",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/AgentWorkforce/sage.git"