@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.
- package/dist/app.d.ts +4 -0
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +66 -35
- package/dist/nango.d.ts +1 -2
- package/dist/nango.d.ts.map +1 -1
- package/dist/nango.js +7 -3
- package/dist/proactive/context-watcher.d.ts +1 -1
- package/dist/proactive/context-watcher.d.ts.map +1 -1
- package/dist/proactive/context-watcher.js +2 -2
- package/dist/proactive/engine.d.ts +6 -2
- package/dist/proactive/engine.d.ts.map +1 -1
- package/dist/proactive/engine.js +13 -12
- package/dist/proactive/evidence-sources/affirmative-reply-source.d.ts.map +1 -1
- package/dist/proactive/evidence-sources/affirmative-reply-source.js +1 -1
- package/dist/proactive/evidence-sources/explicit-close-source.d.ts.map +1 -1
- package/dist/proactive/evidence-sources/explicit-close-source.js +1 -1
- package/dist/proactive/evidence-sources/reaction-source.d.ts.map +1 -1
- package/dist/proactive/evidence-sources/reaction-source.js +1 -2
- package/dist/proactive/follow-up-checker.d.ts +1 -1
- package/dist/proactive/follow-up-checker.d.ts.map +1 -1
- package/dist/proactive/follow-up-checker.js +5 -4
- package/dist/proactive/pr-matcher.d.ts +1 -1
- package/dist/proactive/pr-matcher.d.ts.map +1 -1
- package/dist/proactive/pr-matcher.js +5 -5
- package/dist/proactive/stale-thread-detector.d.ts +1 -1
- package/dist/proactive/stale-thread-detector.d.ts.map +1 -1
- package/dist/proactive/stale-thread-detector.js +6 -6
- package/dist/proactive/types.d.ts +1 -0
- package/dist/proactive/types.d.ts.map +1 -1
- package/dist/slack.d.ts +4 -4
- package/dist/slack.d.ts.map +1 -1
- package/dist/slack.js +8 -8
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- 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;
|
|
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
|
|
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 (!
|
|
518
|
+
if (!fallbackConnectionId || !fallbackProviderConfigKey) {
|
|
497
519
|
return fallbackSlackBotUserId;
|
|
498
520
|
}
|
|
499
521
|
try {
|
|
500
|
-
const userId = await getNango(env).getSlackBotUserId(
|
|
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(
|
|
547
|
+
async function resolveSlackBotUserId(slack, env) {
|
|
525
548
|
try {
|
|
526
|
-
return await getNango(env).getSlackBotUserId(
|
|
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
|
|
647
|
-
if (!
|
|
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
|
|
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
|
|
786
|
-
if (!
|
|
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
|
-
|
|
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
|
|
1234
|
-
// team_id → workspace → connection lookup. Cloud already
|
|
1235
|
-
// Nango connection received the webhook; re-resolving by
|
|
1236
|
-
// translation hop that silently drops events when any link
|
|
1237
|
-
// is missing (no slack-* row, missing team metadata, cloud
|
|
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
|
|
1241
|
-
|
|
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
|
|
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
|
-
|
|
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
|
package/dist/nango.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nango.d.ts","sourceRoot":"","sources":["../src/nango.ts"],"names":[],"mappings":"
|
|
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
|
|
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,
|
|
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
|
-
|
|
11
|
+
resolveSlackConnection: (workspaceId: string) => Promise<ResolvedSlackConnection | null>;
|
|
8
12
|
resolveGitHubConnectionId?: (workspaceId: string) => Promise<string | null>;
|
|
9
|
-
resolveSlackBotUserId?: (
|
|
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,
|
|
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"}
|
package/dist/proactive/engine.js
CHANGED
|
@@ -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
|
|
54
|
-
if (!
|
|
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(
|
|
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,
|
|
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,
|
|
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":"
|
|
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:
|
|
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,
|
|
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;
|
|
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;
|
|
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:
|
|
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;
|
|
@@ -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
|
package/dist/slack.d.ts.map
CHANGED
|
@@ -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,
|
|
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
|
|
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
|
|
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
|
|
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;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -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"}
|