@meetquinn/animactl 0.1.21 → 0.1.22-canary.564.1.e778c46
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/server/inbox/observed-conversation.d.ts +24 -0
- package/dist/server/inbox/observed-conversation.d.ts.map +1 -0
- package/dist/server/inbox/observed-conversation.js +69 -0
- package/dist/server/inbox/slack-events.d.ts +14 -0
- package/dist/server/inbox/slack-events.d.ts.map +1 -1
- package/dist/server/inbox/slack-events.js +18 -0
- package/dist/server/inbox/slack-subscriber.d.ts.map +1 -1
- package/dist/server/inbox/slack-subscriber.js +11 -1
- package/dist/server/inbox/wake-queue.service.d.ts +14 -0
- package/dist/server/inbox/wake-queue.service.d.ts.map +1 -1
- package/dist/server/inbox/wake-queue.service.js +16 -0
- package/dist/server/runtime/cursor-delivery.d.ts +222 -0
- package/dist/server/runtime/cursor-delivery.d.ts.map +1 -0
- package/dist/server/runtime/cursor-delivery.js +919 -0
- package/dist/server/runtime/delivery-prompt.d.ts +9 -1
- package/dist/server/runtime/delivery-prompt.d.ts.map +1 -1
- package/dist/server/runtime/delivery-prompt.js +19 -1
- package/dist/server/runtime/followup-appender.d.ts +23 -0
- package/dist/server/runtime/followup-appender.d.ts.map +1 -1
- package/dist/server/runtime/followup-appender.js +185 -12
- package/dist/server/runtime/runtime-bridge.d.ts +2 -0
- package/dist/server/runtime/runtime-bridge.d.ts.map +1 -1
- package/dist/server/runtime/runtime-bridge.js +22 -11
- package/dist/server/runtime/runtime-worker.d.ts +6 -0
- package/dist/server/runtime/runtime-worker.d.ts.map +1 -1
- package/dist/server/runtime/runtime-worker.js +95 -4
- package/dist/server/runtime/types.d.ts +3 -0
- package/dist/server/runtime/types.d.ts.map +1 -1
- package/dist/server/storage/schema/observed-conversation.store.d.ts +235 -0
- package/dist/server/storage/schema/observed-conversation.store.d.ts.map +1 -0
- package/dist/server/storage/schema/observed-conversation.store.js +512 -0
- package/dist/server/storage/schema/server.store.d.ts +3 -0
- package/dist/server/storage/schema/server.store.d.ts.map +1 -1
- package/dist/server/storage/schema/server.store.js +2 -1
- package/dist/server/storage/schema/wake-queue.store.d.ts +6 -0
- package/dist/server/storage/schema/wake-queue.store.d.ts.map +1 -1
- package/dist/server/storage/schema/wake-queue.store.js +30 -8
- package/dist/server/tests/cursor-delivery.test.d.ts +2 -0
- package/dist/server/tests/cursor-delivery.test.d.ts.map +1 -0
- package/dist/server/tests/cursor-delivery.test.js +1447 -0
- package/dist/server/tests/observed-conversation.test.d.ts +2 -0
- package/dist/server/tests/observed-conversation.test.d.ts.map +1 -0
- package/dist/server/tests/observed-conversation.test.js +680 -0
- package/dist/shared/server-settings.d.ts +8 -0
- package/dist/shared/server-settings.d.ts.map +1 -1
- package/dist/shared/server-settings.js +7 -0
- package/dist/web/assets/{FileViewer-Tlst5lS-.js → FileViewer-DttsVKoh.js} +3 -3
- package/dist/web/assets/{SlackTimeline-CFkqHv_6.js → SlackTimeline-DN7PC2rS.js} +1 -1
- package/dist/web/assets/{activity-B6LMcJ_v.js → activity-B8YSya_J.js} +1 -1
- package/dist/web/assets/{arc-Bu40QpvC.js → arc-CaK4n9nG.js} +1 -1
- package/dist/web/assets/architecture-7EHR7CIX-BreBqhiV.js +1 -0
- package/dist/web/assets/{architectureDiagram-3BPJPVTR-961FLmfV.js → architectureDiagram-3BPJPVTR-CWw4T0Y2.js} +1 -1
- package/dist/web/assets/{blockDiagram-GPEHLZMM-Brub6ok9.js → blockDiagram-GPEHLZMM-78WRRtt_.js} +1 -1
- package/dist/web/assets/{c4Diagram-AAUBKEIU-CLPy17sx.js → c4Diagram-AAUBKEIU-DdW0CAPw.js} +1 -1
- package/dist/web/assets/channel-DulET7md.js +1 -0
- package/dist/web/assets/{channels-BU5_kJmI.js → channels-DBYukBy9.js} +1 -1
- package/dist/web/assets/{chunk-2J33WTMH-e88wk53H.js → chunk-2J33WTMH-BqitmYQU.js} +1 -1
- package/dist/web/assets/{chunk-3OPIFGDE-D9sLrB75.js → chunk-3OPIFGDE-DixCJAqQ.js} +1 -1
- package/dist/web/assets/{chunk-4BX2VUAB-Dh21Agzv.js → chunk-4BX2VUAB-DyWR9eaa.js} +1 -1
- package/dist/web/assets/{chunk-55IACEB6-uX2pfdrt.js → chunk-55IACEB6-DT1FAD2l.js} +1 -1
- package/dist/web/assets/{chunk-5ZQYHXKU-CGdRvzSp.js → chunk-5ZQYHXKU-D1__iWl7.js} +1 -1
- package/dist/web/assets/{chunk-727SXJPM-Cymxlz5m.js → chunk-727SXJPM-B1KtzVEW.js} +1 -1
- package/dist/web/assets/{chunk-AQP2D5EJ-CGGJjJC5.js → chunk-AQP2D5EJ-DCQ7PEwd.js} +1 -1
- package/dist/web/assets/{chunk-BSJP7CBP-DjWoPZjU.js → chunk-BSJP7CBP-LhjokPl1.js} +1 -1
- package/dist/web/assets/{chunk-CSCIHK7Q-DFOYiUFH.js → chunk-CSCIHK7Q-CWD84hYf.js} +3 -3
- package/dist/web/assets/{chunk-FMBD7UC4-RwoVTfjv.js → chunk-FMBD7UC4-BKf1KRCj.js} +1 -1
- package/dist/web/assets/{chunk-KSCS5N6A-27-7vLqB.js → chunk-KSCS5N6A-ByBHtzyk.js} +1 -1
- package/dist/web/assets/{chunk-L5ZTLDWV-C3sjkyB5.js → chunk-L5ZTLDWV-TA624hoN.js} +1 -1
- package/dist/web/assets/{chunk-LZXEDZCA-Df2tXIM-.js → chunk-LZXEDZCA-CFMuTl93.js} +2 -2
- package/dist/web/assets/{chunk-ND2GUHAM-BNZ72F4e.js → chunk-ND2GUHAM-CkWP9y41.js} +1 -1
- package/dist/web/assets/{chunk-NZK2D7GU-CKnfEi5K.js → chunk-NZK2D7GU-CpAqZerI.js} +1 -1
- package/dist/web/assets/{chunk-O5CBEL6O-Cmq72YOv.js → chunk-O5CBEL6O-DRhpj_VS.js} +1 -1
- package/dist/web/assets/chunk-QZHKN3VN-CeVT0-3o.js +1 -0
- package/dist/web/assets/chunk-WU5MYG2G-B0OPimH7.js +1 -0
- package/dist/web/assets/{chunk-XPW4576I-B3hqx7kw.js → chunk-XPW4576I-WcqHlgnB.js} +1 -1
- package/dist/web/assets/classDiagram-4FO5ZUOK-D9YZrdkg.js +1 -0
- package/dist/web/assets/classDiagram-v2-Q7XG4LA2-D9YZrdkg.js +1 -0
- package/dist/web/assets/{cose-bilkent-S5V4N54A-Bq4LaglA.js → cose-bilkent-S5V4N54A-G-L0EB4Z.js} +1 -1
- package/dist/web/assets/{dagre-BM42HDAG-BbeX80CE.js → dagre-BM42HDAG-DFvvGrhJ.js} +1 -1
- package/dist/web/assets/{diagram-2AECGRRQ-BDe_mLi1.js → diagram-2AECGRRQ-BlnpBPXw.js} +1 -1
- package/dist/web/assets/{diagram-5GNKFQAL-CVSM3Uag.js → diagram-5GNKFQAL-CREMQzVo.js} +1 -1
- package/dist/web/assets/{diagram-KO2AKTUF-CpwcqvTw.js → diagram-KO2AKTUF-DNmUeAa_.js} +1 -1
- package/dist/web/assets/{diagram-LMA3HP47-Byhn8ReX.js → diagram-LMA3HP47-DT9ZLU5i.js} +1 -1
- package/dist/web/assets/{diagram-OG6HWLK6-BF16PLSK.js → diagram-OG6HWLK6-B_E1bkQ0.js} +1 -1
- package/dist/web/assets/{dist-DbZp7RyW.js → dist-BDxJVPyg.js} +1 -1
- package/dist/web/assets/{erDiagram-TEJ5UH35-C0Bkq9O0.js → erDiagram-TEJ5UH35-BUo1CPd7.js} +1 -1
- package/dist/web/assets/eventmodeling-FCH6USID-XUs0jsXT.js +1 -0
- package/dist/web/assets/{files-D20bqugc.js → files-CIdTJ9zr.js} +1 -1
- package/dist/web/assets/{flowDiagram-I6XJVG4X-BXoFrcs7.js → flowDiagram-I6XJVG4X-B6YD-WVA.js} +1 -1
- package/dist/web/assets/{ganttDiagram-6RSMTGT7-B6LWJxI4.js → ganttDiagram-6RSMTGT7-CH17009G.js} +1 -1
- package/dist/web/assets/gitGraph-WXDBUCRP-Y-z-hlhG.js +1 -0
- package/dist/web/assets/{gitGraphDiagram-PVQCEYII-CQWBM9pA.js → gitGraphDiagram-PVQCEYII-CO_7FH5g.js} +1 -1
- package/dist/web/assets/{index-KlmQNWXH.js → index-DdK2sYCG.js} +3 -3
- package/dist/web/assets/info-J43DQDTF-VgeS_otQ.js +1 -0
- package/dist/web/assets/{infoDiagram-5YYISTIA-BJKvwh_M.js → infoDiagram-5YYISTIA-DJIvPrRk.js} +1 -1
- package/dist/web/assets/{ishikawaDiagram-YF4QCWOH-CXs8M6-e.js → ishikawaDiagram-YF4QCWOH-DZghI5Yj.js} +1 -1
- package/dist/web/assets/{journeyDiagram-JHISSGLW-CKCZF6Zi.js → journeyDiagram-JHISSGLW-SdF5vDgG.js} +1 -1
- package/dist/web/assets/{kanban-definition-UN3LZRKU-DKmXUL5c.js → kanban-definition-UN3LZRKU-C_gKXHK8.js} +1 -1
- package/dist/web/assets/{kb-deNAMRYy.js → kb-BE4TtmH9.js} +1 -1
- package/dist/web/assets/{lightbulb-JkS5kBc0.js → lightbulb-BK0a8Sco.js} +1 -1
- package/dist/web/assets/{line-DX68wfAK.js → line-Coz6mH0u.js} +1 -1
- package/dist/web/assets/{linear-ZDpeN7XU.js → linear-CVHpIraJ.js} +1 -1
- package/dist/web/assets/{login-DyrK0Hjs.js → login-D8p6PeCr.js} +1 -1
- package/dist/web/assets/{mermaid-parser.core-CwWFc6WQ.js → mermaid-parser.core-BiikN4eU.js} +2 -2
- package/dist/web/assets/{mermaid.core-BJWS9ylE.js → mermaid.core-REoRTher.js} +3 -3
- package/dist/web/assets/{mindmap-definition-RKZ34NQL-pJ1HaZf_.js → mindmap-definition-RKZ34NQL-DvcDeFQP.js} +1 -1
- package/dist/web/assets/packet-YPE3B663-DIun1xH3.js +1 -0
- package/dist/web/assets/pie-LRSECV5Y-C4fiOtji.js +1 -0
- package/dist/web/assets/{pieDiagram-4H26LBE5-D-XOTDzJ.js → pieDiagram-4H26LBE5-CcUElKU6.js} +1 -1
- package/dist/web/assets/{profile-B02IuNzr.js → profile-3GkijY9B.js} +1 -1
- package/dist/web/assets/{quadrantDiagram-W4KKPZXB-BVS4Kkwv.js → quadrantDiagram-W4KKPZXB-CoK70sR1.js} +1 -1
- package/dist/web/assets/radar-GUYGQ44K-BK5oqzva.js +1 -0
- package/dist/web/assets/{reminders-CqW1Amdi.js → reminders-BKnwV6wk.js} +1 -1
- package/dist/web/assets/{requirementDiagram-4Y6WPE33-Q7B1W9eD.js → requirementDiagram-4Y6WPE33-BIcMS1E5.js} +1 -1
- package/dist/web/assets/{sankeyDiagram-5OEKKPKP--hOx-nct.js → sankeyDiagram-5OEKKPKP-thgpafCS.js} +1 -1
- package/dist/web/assets/{sequenceDiagram-3UESZ5HK-DU7yUC7p.js → sequenceDiagram-3UESZ5HK-_5Jv4kBp.js} +1 -1
- package/dist/web/assets/{src-2QsPrlXA.js → src-Dd5H_uvX.js} +1 -1
- package/dist/web/assets/{stateDiagram-AJRCARHV-BQNw7Do4.js → stateDiagram-AJRCARHV-4JhDe5KW.js} +1 -1
- package/dist/web/assets/stateDiagram-v2-BHNVJYJU-C8PJkHBN.js +1 -0
- package/dist/web/assets/{timeline-definition-PNZ67QCA-nMspZ6o7.js → timeline-definition-PNZ67QCA-DXpPUK5u.js} +1 -1
- package/dist/web/assets/treeView-BLDUP644-CEJpWIsM.js +1 -0
- package/dist/web/assets/treemap-LRROVOQU-C2EfgSiS.js +1 -0
- package/dist/web/assets/{useInfiniteQuery-ClQON2YW.js → useInfiniteQuery-BLDeFOMv.js} +1 -1
- package/dist/web/assets/{vennDiagram-CIIHVFJN-EsZOOogs.js → vennDiagram-CIIHVFJN-mDoI5-zT.js} +1 -1
- package/dist/web/assets/wardley-L42UT6IY-rnIWLLHq.js +1 -0
- package/dist/web/assets/{wardleyDiagram-YWT4CUSO-BISNhdwL.js → wardleyDiagram-YWT4CUSO-HUJ81Vik.js} +1 -1
- package/dist/web/assets/{xychartDiagram-2RQKCTM6-CeepS91B.js → xychartDiagram-2RQKCTM6-xWAx0LE5.js} +1 -1
- package/dist/web/index.html +1 -1
- package/package.json +1 -1
- package/dist/web/assets/architecture-7EHR7CIX-CszZhzwS.js +0 -1
- package/dist/web/assets/channel-vjXvA26o.js +0 -1
- package/dist/web/assets/chunk-QZHKN3VN-D7q3S54v.js +0 -1
- package/dist/web/assets/chunk-WU5MYG2G-CyRjqATw.js +0 -1
- package/dist/web/assets/classDiagram-4FO5ZUOK-CLxGaxZa.js +0 -1
- package/dist/web/assets/classDiagram-v2-Q7XG4LA2-CLxGaxZa.js +0 -1
- package/dist/web/assets/eventmodeling-FCH6USID-DT8cP89l.js +0 -1
- package/dist/web/assets/gitGraph-WXDBUCRP-0yJYGR_3.js +0 -1
- package/dist/web/assets/info-J43DQDTF-CUIgb-wr.js +0 -1
- package/dist/web/assets/packet-YPE3B663-CBwetb6C.js +0 -1
- package/dist/web/assets/pie-LRSECV5Y--AKQRXWw.js +0 -1
- package/dist/web/assets/radar-GUYGQ44K-DbTL8kMg.js +0 -1
- package/dist/web/assets/stateDiagram-v2-BHNVJYJU-CFwo95yI.js +0 -1
- package/dist/web/assets/treeView-BLDUP644-CDXyLNqI.js +0 -1
- package/dist/web/assets/treemap-LRROVOQU-DSPy4pQ-.js +0 -1
- package/dist/web/assets/wardley-L42UT6IY-dnipiXSQ.js +0 -1
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type SlackRawFile } from '../slack/slack.helper.js';
|
|
2
|
+
import { type ObservedFileDescriptor, type ObserveSlackMessageResult } from '../storage/schema/observed-conversation.store.js';
|
|
3
|
+
import { type ObservableSlackMessage, type SlackMessageEnvelope, type SlackRawMessageEvent } from './slack-events.js';
|
|
4
|
+
export declare function observeObservableSlackMessage(input: {
|
|
5
|
+
agentId: string;
|
|
6
|
+
envelope?: SlackMessageEnvelope;
|
|
7
|
+
event: ObservableSlackMessage;
|
|
8
|
+
/** When true, rethrow store failures after marking continuity degraded. Default: mark degraded and continue. */
|
|
9
|
+
throwOnError?: boolean;
|
|
10
|
+
}): Promise<ObserveSlackMessageResult | undefined>;
|
|
11
|
+
/**
|
|
12
|
+
* Ingress entry: if the raw event is observable, journal it (fail-soft by
|
|
13
|
+
* default). Returns whether observation was attempted.
|
|
14
|
+
*/
|
|
15
|
+
export declare function observeSlackEventAtIngress(input: {
|
|
16
|
+
agentId: string;
|
|
17
|
+
envelope?: SlackMessageEnvelope;
|
|
18
|
+
event: SlackRawMessageEvent;
|
|
19
|
+
throwOnError?: boolean;
|
|
20
|
+
}): Promise<ObserveSlackMessageResult | undefined>;
|
|
21
|
+
/** @deprecated Use observeObservableSlackMessage / observeSlackEventAtIngress. */
|
|
22
|
+
export declare const observeRoutableSlackMessage: typeof observeObservableSlackMessage;
|
|
23
|
+
export declare function observedFilesFromSlack(files: SlackRawFile[] | undefined): ObservedFileDescriptor[];
|
|
24
|
+
//# sourceMappingURL=observed-conversation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observed-conversation.d.ts","sourceRoot":"","sources":["../../../server/inbox/observed-conversation.ts"],"names":[],"mappings":"AAOA,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAEL,KAAK,sBAAsB,EAC3B,KAAK,yBAAyB,EAC/B,MAAM,kDAAkD,CAAC;AAC1D,OAAO,EAGL,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EAC1B,MAAM,mBAAmB,CAAC;AAE3B,wBAAsB,6BAA6B,CAAC,KAAK,EAAE;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,KAAK,EAAE,sBAAsB,CAAC;IAC9B,gHAAgH;IAChH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,GAAG,OAAO,CAAC,yBAAyB,GAAG,SAAS,CAAC,CAwBjD;AAED;;;GAGG;AACH,wBAAsB,0BAA0B,CAAC,KAAK,EAAE;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,KAAK,EAAE,oBAAoB,CAAC;IAC5B,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,GAAG,OAAO,CAAC,yBAAyB,GAAG,SAAS,CAAC,CAQjD;AAED,kFAAkF;AAClF,eAAO,MAAM,2BAA2B,sCAAgC,CAAC;AAEzE,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,YAAY,EAAE,GAAG,SAAS,GAChC,sBAAsB,EAAE,CAc1B"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// Slack ingress helper: record an observable message into the agent-scoped
|
|
2
|
+
// observed-conversation journal before wake/subscription filtering.
|
|
3
|
+
//
|
|
4
|
+
// Observation uses a broader predicate than runtime routability: userless
|
|
5
|
+
// bot_message and file-only posts are journaled without changing wake routing.
|
|
6
|
+
import { errorMessage } from '../ids.js';
|
|
7
|
+
import { slackTsToIso } from '../slack/slack.helper.js';
|
|
8
|
+
import { observedConversationStoreForAgent, } from '../storage/schema/observed-conversation.store.js';
|
|
9
|
+
import { isObservableSlackMessage, slackEventTeamId, } from './slack-events.js';
|
|
10
|
+
export async function observeObservableSlackMessage(input) {
|
|
11
|
+
const teamId = slackEventTeamId(input.envelope, input.event);
|
|
12
|
+
const store = observedConversationStoreForAgent(input.agentId);
|
|
13
|
+
const files = observedFilesFromSlack(input.event.files);
|
|
14
|
+
try {
|
|
15
|
+
return await store.observe({
|
|
16
|
+
...(input.event.bot_id ? { botId: input.event.bot_id } : {}),
|
|
17
|
+
channelId: input.event.channel,
|
|
18
|
+
...(files.length > 0 ? { files } : {}),
|
|
19
|
+
messageTs: input.event.ts,
|
|
20
|
+
...(slackTsToIso(input.event.ts) ? { receivedAt: slackTsToIso(input.event.ts) } : {}),
|
|
21
|
+
teamId,
|
|
22
|
+
text: input.event.text ?? '',
|
|
23
|
+
...(input.event.thread_ts ? { threadTs: input.event.thread_ts } : {}),
|
|
24
|
+
...(input.event.user ? { userId: input.event.user } : {}),
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
// store.observe already marks continuity degraded; helper only controls throw.
|
|
29
|
+
if (input.throwOnError)
|
|
30
|
+
throw error;
|
|
31
|
+
console.warn(`observed-conversation journal write failed for agent=${input.agentId} channel=${input.event.channel} ts=${input.event.ts}: ${errorMessage(error)}`);
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Ingress entry: if the raw event is observable, journal it (fail-soft by
|
|
37
|
+
* default). Returns whether observation was attempted.
|
|
38
|
+
*/
|
|
39
|
+
export async function observeSlackEventAtIngress(input) {
|
|
40
|
+
if (!isObservableSlackMessage(input.event))
|
|
41
|
+
return undefined;
|
|
42
|
+
return observeObservableSlackMessage({
|
|
43
|
+
agentId: input.agentId,
|
|
44
|
+
envelope: input.envelope,
|
|
45
|
+
event: input.event,
|
|
46
|
+
...(input.throwOnError ? { throwOnError: true } : {}),
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
/** @deprecated Use observeObservableSlackMessage / observeSlackEventAtIngress. */
|
|
50
|
+
export const observeRoutableSlackMessage = observeObservableSlackMessage;
|
|
51
|
+
export function observedFilesFromSlack(files) {
|
|
52
|
+
if (!Array.isArray(files) || files.length === 0)
|
|
53
|
+
return [];
|
|
54
|
+
const out = [];
|
|
55
|
+
for (const file of files) {
|
|
56
|
+
if (!file || typeof file.id !== 'string' || file.id.trim().length === 0)
|
|
57
|
+
continue;
|
|
58
|
+
const descriptor = { id: file.id };
|
|
59
|
+
if (typeof file.name === 'string' && file.name.length > 0)
|
|
60
|
+
descriptor.name = file.name;
|
|
61
|
+
else if (typeof file.title === 'string' && file.title.length > 0)
|
|
62
|
+
descriptor.name = file.title;
|
|
63
|
+
if (typeof file.mimetype === 'string' && file.mimetype.length > 0) {
|
|
64
|
+
descriptor.mimetype = file.mimetype;
|
|
65
|
+
}
|
|
66
|
+
out.push(descriptor);
|
|
67
|
+
}
|
|
68
|
+
return out;
|
|
69
|
+
}
|
|
@@ -35,6 +35,20 @@ export interface RoutableSlackMessage extends SlackRawMessageEvent {
|
|
|
35
35
|
type: 'app_mention' | 'message';
|
|
36
36
|
user: string;
|
|
37
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* Observable for the local observed-conversation journal — broader than runtime
|
|
40
|
+
* routability. Captures userless `bot_message` (bot_id only) and file-only posts
|
|
41
|
+
* without requiring a human `user`. Wake routing still uses isRoutableSlackMessage.
|
|
42
|
+
*/
|
|
43
|
+
export interface ObservableSlackMessage extends SlackRawMessageEvent {
|
|
44
|
+
channel: string;
|
|
45
|
+
ts: string;
|
|
46
|
+
type: 'app_mention' | 'message';
|
|
47
|
+
/** At least one of user / bot_id is present (enforced by the predicate). */
|
|
48
|
+
bot_id?: string;
|
|
49
|
+
user?: string;
|
|
50
|
+
}
|
|
51
|
+
export declare function isObservableSlackMessage(event: SlackRawMessageEvent): event is ObservableSlackMessage;
|
|
38
52
|
export declare function isRoutableSlackMessage(event: SlackRawMessageEvent): event is RoutableSlackMessage;
|
|
39
53
|
export declare function slackEventTeamId(envelope: SlackMessageEnvelope | undefined, event: SlackRawMessageEvent): string;
|
|
40
54
|
export declare function normalizeSlackMessage(input: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slack-events.d.ts","sourceRoot":"","sources":["../../../server/inbox/slack-events.ts"],"names":[],"mappings":"AACA,OAAO,EAA0C,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGrG,OAAO,KAAK,EAAmB,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,SAAS,GAAG,IAAI,GAAG,QAAQ,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,SAAS,GAAG,QAAQ,CAAC;CAClC;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAqB,SAAQ,oBAAoB;IAChE,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,aAAa,GAAG,SAAS,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,oBAAoB,GAAG,KAAK,IAAI,oBAAoB,CAUjG;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,oBAAoB,GAAG,SAAS,EAC1C,KAAK,EAAE,oBAAoB,GAC1B,MAAM,CAER;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,oBAAoB,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,gBAAgB,CAAC;CAChC,GAAG,cAAc,CA2BjB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAEpE;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAEpE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,cAAc,GAAG,YAAY,CAcxE"}
|
|
1
|
+
{"version":3,"file":"slack-events.d.ts","sourceRoot":"","sources":["../../../server/inbox/slack-events.ts"],"names":[],"mappings":"AACA,OAAO,EAA0C,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGrG,OAAO,KAAK,EAAmB,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,SAAS,GAAG,IAAI,GAAG,QAAQ,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,SAAS,GAAG,QAAQ,CAAC;CAClC;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAqB,SAAQ,oBAAoB;IAChE,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,aAAa,GAAG,SAAS,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,MAAM,WAAW,sBAAuB,SAAQ,oBAAoB;IAClE,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,aAAa,GAAG,SAAS,CAAC;IAChC,4EAA4E;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,oBAAoB,GAAG,KAAK,IAAI,sBAAsB,CAcrG;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,oBAAoB,GAAG,KAAK,IAAI,oBAAoB,CAUjG;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,oBAAoB,GAAG,SAAS,EAC1C,KAAK,EAAE,oBAAoB,GAC1B,MAAM,CAER;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,oBAAoB,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,gBAAgB,CAAC;CAChC,GAAG,cAAc,CA2BjB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAEpE;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAEpE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,cAAc,GAAG,YAAY,CAcxE"}
|
|
@@ -2,6 +2,24 @@ import { nowIso, slackMessageEventId, slackSurfaceId } from '../ids.js';
|
|
|
2
2
|
import { normalizeSlackEventFiles, slackTsToIso } from '../slack/slack.helper.js';
|
|
3
3
|
import { slackMessagePreviewsFromAttachments } from '../slack/message-previews.js';
|
|
4
4
|
import { slackVisibleMessageText } from '../slack/message-text.js';
|
|
5
|
+
export function isObservableSlackMessage(event) {
|
|
6
|
+
if (event.type !== 'message' && event.type !== 'app_mention')
|
|
7
|
+
return false;
|
|
8
|
+
if (typeof event.channel !== 'string' || typeof event.ts !== 'string')
|
|
9
|
+
return false;
|
|
10
|
+
if (event.subtype !== undefined && event.subtype !== 'bot_message' && event.subtype !== 'file_share') {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
const hasUser = typeof event.user === 'string' && event.user.length > 0;
|
|
14
|
+
const hasBot = typeof event.bot_id === 'string' && event.bot_id.length > 0;
|
|
15
|
+
if (!hasUser && !hasBot)
|
|
16
|
+
return false;
|
|
17
|
+
// text may be missing on bot_message; empty + files still counts.
|
|
18
|
+
const text = typeof event.text === 'string' ? event.text : '';
|
|
19
|
+
const hasText = text.trim().length > 0;
|
|
20
|
+
const hasFiles = Array.isArray(event.files) && event.files.length > 0;
|
|
21
|
+
return hasText || hasFiles;
|
|
22
|
+
}
|
|
5
23
|
export function isRoutableSlackMessage(event) {
|
|
6
24
|
return ((event.type === 'message' || event.type === 'app_mention') &&
|
|
7
25
|
typeof event.channel === 'string' &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slack-subscriber.d.ts","sourceRoot":"","sources":["../../../server/inbox/slack-subscriber.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"slack-subscriber.d.ts","sourceRoot":"","sources":["../../../server/inbox/slack-subscriber.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAoC5D,OAAO,EAAE,gBAAgB,EAA+B,MAAM,yBAAyB,CAAC;AAExF,MAAM,WAAW,2BAA2B;IAC1C,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,uGAAuG;IACvG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,gBAAgB,CAAC;CACzB;AAED,qBAAa,oBAAoB;IAQnB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAPpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAM;IAC1B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAuB;IACvD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA8B;IAG5D,OAAO,CAAC,0BAA0B,CAAS;gBAEd,OAAO,EAAE,2BAA2B;IAO3D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B,OAAO,CAAC,SAAS;YAgFH,oBAAoB;YASpB,qBAAqB;YAOrB,0BAA0B;YA2C1B,kCAAkC;YAYlC,gBAAgB;IA2E9B,OAAO,CAAC,uBAAuB;CAYhC;AAED,wBAAgB,iCAAiC,CAAC,KAAK,EAAE;IACvD,IAAI,EAAE,cAAc,CAAC;IACrB,WAAW,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC;IAC3E,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,CAAC;CACpD,GAAG,OAAO,CAAC,IAAI,CAAC,CAOhB"}
|
|
@@ -13,6 +13,7 @@ import { withCanonicalSlackVisibleText } from '../slack/message-text.js';
|
|
|
13
13
|
import { isSlackEvent, isRoutableSlackMessage, slackEventTeamId, slackSurfaceForEvent, } from './slack-events.js';
|
|
14
14
|
import { slackAttentionSuggestionPayload, } from './attention-suggestion-activity.js';
|
|
15
15
|
import { runIngestPipeline } from './ingest-pipeline.js';
|
|
16
|
+
import { observeSlackEventAtIngress } from './observed-conversation.js';
|
|
16
17
|
import { buildSlackInboxItemWithLatePreview } from './slack-ingest.js';
|
|
17
18
|
import { slackShortcutHandoffServiceForAgent } from './slack-shortcut-handoff.service.js';
|
|
18
19
|
import { slackRuntimeDecision } from './slack-subscription.service.js';
|
|
@@ -192,9 +193,18 @@ export class SlackInboxSubscriber {
|
|
|
192
193
|
// `text` can truncate before a trailing user mention; enrichment after an
|
|
193
194
|
// ignore never runs, so mention detection must see the full body first.
|
|
194
195
|
const rawEvent = withCanonicalSlackVisibleText(event);
|
|
196
|
+
const envelope = body;
|
|
197
|
+
// Observed-conversation journal (send-hold cut a): record every observable
|
|
198
|
+
// Slack message this agent process sees — including userless bot_message —
|
|
199
|
+
// BEFORE wake/subscription filtering and BEFORE isRoutableSlackMessage.
|
|
200
|
+
// Failures mark continuity degraded and never block routing.
|
|
201
|
+
await observeSlackEventAtIngress({
|
|
202
|
+
agentId: this.options.queue.agentId,
|
|
203
|
+
envelope,
|
|
204
|
+
event: rawEvent,
|
|
205
|
+
});
|
|
195
206
|
if (!isRoutableSlackMessage(rawEvent))
|
|
196
207
|
return;
|
|
197
|
-
const envelope = body;
|
|
198
208
|
const teamId = slackEventTeamId(envelope, rawEvent);
|
|
199
209
|
let latePreview;
|
|
200
210
|
await runIngestPipeline({
|
|
@@ -51,6 +51,12 @@ export declare class WakeQueueService {
|
|
|
51
51
|
* Remove a still-queued (unclaimed) item and mark it seen (true settle/dedupe).
|
|
52
52
|
*/
|
|
53
53
|
withdrawQueued(itemId: string): Promise<InboxItem | undefined>;
|
|
54
|
+
/**
|
|
55
|
+
* Atomically settle multiple still-claimable queued items to seen (one store
|
|
56
|
+
* update). Cursor-delivery coalescing uses this so the selected same-surface
|
|
57
|
+
* set cannot partially land.
|
|
58
|
+
*/
|
|
59
|
+
withdrawQueuedBatch(itemIds: string[]): Promise<InboxItem[]>;
|
|
54
60
|
/**
|
|
55
61
|
* Drop an uncommitted staged wake without a seen tombstone so the same fire
|
|
56
62
|
* id remains reusable after cancel/snooze CAS miss.
|
|
@@ -75,6 +81,14 @@ export declare class WakeQueueService {
|
|
|
75
81
|
requeue(itemId: string, options?: {
|
|
76
82
|
resumeReason?: 'runtime_restart';
|
|
77
83
|
}): Promise<void>;
|
|
84
|
+
/**
|
|
85
|
+
* Requeue without signalWake. Used when cursor-delivery prepare fails closed
|
|
86
|
+
* mid-drain: a wake would set pendingWake and immediately reclaim the same
|
|
87
|
+
* item in a hot loop. The regular poll timer retries later.
|
|
88
|
+
*/
|
|
89
|
+
requeueQuiet(itemId: string, options?: {
|
|
90
|
+
resumeReason?: 'runtime_restart';
|
|
91
|
+
}): Promise<void>;
|
|
78
92
|
requeueBatch(itemIds: string[]): Promise<InboxItem[]>;
|
|
79
93
|
requeueAppendedTo(parentItemId: string, options?: {
|
|
80
94
|
resumeReason?: 'runtime_restart';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wake-queue.service.d.ts","sourceRoot":"","sources":["../../../server/inbox/wake-queue.service.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"wake-queue.service.d.ts","sourceRoot":"","sources":["../../../server/inbox/wake-queue.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -89,6 +89,14 @@ export class WakeQueueService {
|
|
|
89
89
|
async withdrawQueued(itemId) {
|
|
90
90
|
return this.store.withdrawQueued(itemId);
|
|
91
91
|
}
|
|
92
|
+
/**
|
|
93
|
+
* Atomically settle multiple still-claimable queued items to seen (one store
|
|
94
|
+
* update). Cursor-delivery coalescing uses this so the selected same-surface
|
|
95
|
+
* set cannot partially land.
|
|
96
|
+
*/
|
|
97
|
+
async withdrawQueuedBatch(itemIds) {
|
|
98
|
+
return this.store.withdrawQueuedBatch(itemIds);
|
|
99
|
+
}
|
|
92
100
|
/**
|
|
93
101
|
* Drop an uncommitted staged wake without a seen tombstone so the same fire
|
|
94
102
|
* id remains reusable after cancel/snooze CAS miss.
|
|
@@ -156,6 +164,14 @@ export class WakeQueueService {
|
|
|
156
164
|
await this.store.requeue(itemId, options);
|
|
157
165
|
signalWake(this.agentId);
|
|
158
166
|
}
|
|
167
|
+
/**
|
|
168
|
+
* Requeue without signalWake. Used when cursor-delivery prepare fails closed
|
|
169
|
+
* mid-drain: a wake would set pendingWake and immediately reclaim the same
|
|
170
|
+
* item in a hot loop. The regular poll timer retries later.
|
|
171
|
+
*/
|
|
172
|
+
async requeueQuiet(itemId, options = {}) {
|
|
173
|
+
await this.store.requeue(itemId, options);
|
|
174
|
+
}
|
|
159
175
|
async requeueBatch(itemIds) {
|
|
160
176
|
const items = await this.store.requeueBatch(itemIds);
|
|
161
177
|
if (items.length > 0)
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import type { WakeQueueService } from '../inbox/wake-queue.service.js';
|
|
2
|
+
import { type AdvanceCursorExpected, type ObservedConversationEntry, type ObservedConversationStore } from '../storage/schema/observed-conversation.store.js';
|
|
3
|
+
import type { InboxItem, SlackInboxItem } from '../../shared/inbox.js';
|
|
4
|
+
/** Newest-fitting bound: max messages in the final provider-facing envelope. */
|
|
5
|
+
export declare const CURSOR_DELIVERY_MAX_MESSAGES = 20;
|
|
6
|
+
/**
|
|
7
|
+
* Max UTF-8 bytes of the final provider-facing rendered envelope (PRD / Iris):
|
|
8
|
+
* snapshot rows + Latest wake + previews + file metadata — everything the
|
|
9
|
+
* agent turn receives from the cursor view.
|
|
10
|
+
*/
|
|
11
|
+
export declare const CURSOR_DELIVERY_MAX_BYTES: number;
|
|
12
|
+
/** Soft per-message clip so one row cannot consume the whole budget alone. */
|
|
13
|
+
export declare const CURSOR_DELIVERY_MAX_MESSAGE_CHARS = 2000;
|
|
14
|
+
export type CursorDeliveryFailureReason = 'continuity_degraded' | 'missing_trigger_observation' | 'store_error' | 'cas_failure';
|
|
15
|
+
export declare class CursorDeliveryError extends Error {
|
|
16
|
+
readonly reason: CursorDeliveryFailureReason;
|
|
17
|
+
constructor(reason: CursorDeliveryFailureReason, message: string);
|
|
18
|
+
}
|
|
19
|
+
export interface SurfaceDeliveryPlan {
|
|
20
|
+
surfaceId: string;
|
|
21
|
+
/** What getCursor must match for CAS (absent or present@N). */
|
|
22
|
+
cursorExpected: AdvanceCursorExpected;
|
|
23
|
+
/** Inclusive ordinal to advance to (0 allowed for empty child-thread establish). */
|
|
24
|
+
nextDeliveredOrdinal: number;
|
|
25
|
+
lastDeliveredEventId?: string;
|
|
26
|
+
lastDeliveredMessageTs?: string;
|
|
27
|
+
/** Bounded journal rows delivered for this surface (chronological). */
|
|
28
|
+
entries: ObservedConversationEntry[];
|
|
29
|
+
/**
|
|
30
|
+
* Exact after-cursor population from the reconciled ordinal index
|
|
31
|
+
* (`tailOrdinal − deliveredOrdinal`), not the capped retained journal-read
|
|
32
|
+
* length. Used for “N earlier messages not shown” and merge union so archive
|
|
33
|
+
* retention / read limits cannot under-count the true conversation.
|
|
34
|
+
*/
|
|
35
|
+
candidateCount: number;
|
|
36
|
+
/** Count of this surface's candidates not included due to the bound. */
|
|
37
|
+
omittedCount: number;
|
|
38
|
+
/** True when establishing present@0 with no journal rows. */
|
|
39
|
+
establishOnly: boolean;
|
|
40
|
+
}
|
|
41
|
+
export interface CursorDeliveryPlan {
|
|
42
|
+
agentId: string;
|
|
43
|
+
triggerItemId: string;
|
|
44
|
+
triggerEventId: string;
|
|
45
|
+
surfaces: SurfaceDeliveryPlan[];
|
|
46
|
+
/** Prompt body for the Slack wake (includes bounded context + latest wake). */
|
|
47
|
+
promptBody: string;
|
|
48
|
+
committed: boolean;
|
|
49
|
+
}
|
|
50
|
+
export type PrepareCursorDeliveryResult = {
|
|
51
|
+
kind: 'disabled';
|
|
52
|
+
} | {
|
|
53
|
+
kind: 'already_delivered';
|
|
54
|
+
settledItemIds: string[];
|
|
55
|
+
} | {
|
|
56
|
+
kind: 'prepared';
|
|
57
|
+
plan: CursorDeliveryPlan;
|
|
58
|
+
} | {
|
|
59
|
+
kind: 'failed';
|
|
60
|
+
error: CursorDeliveryError;
|
|
61
|
+
};
|
|
62
|
+
export declare function setCursorDeliveryEnabledForTests(enabled: boolean | undefined): void;
|
|
63
|
+
/**
|
|
64
|
+
* Resolve whether cursor delivery is on. Settings/read failures are errors
|
|
65
|
+
* (fail-closed), not silent disable — "enabled but unreadable" must not look
|
|
66
|
+
* like intentional off.
|
|
67
|
+
*/
|
|
68
|
+
export declare function resolveCursorDeliveryEnabled(): Promise<{
|
|
69
|
+
kind: 'enabled';
|
|
70
|
+
} | {
|
|
71
|
+
kind: 'disabled';
|
|
72
|
+
} | {
|
|
73
|
+
kind: 'error';
|
|
74
|
+
error: CursorDeliveryError;
|
|
75
|
+
}>;
|
|
76
|
+
/** Convenience: true only when explicitly enabled (throws on settings error). */
|
|
77
|
+
export declare function isCursorDeliveryEnabled(): Promise<boolean>;
|
|
78
|
+
/**
|
|
79
|
+
* Surfaces to snapshot for a Slack wake.
|
|
80
|
+
* - Top-level channel: channel surface + response-thread surface (thread:messageTs).
|
|
81
|
+
* - Thread reply: thread surface only.
|
|
82
|
+
* - DM: DM surface only.
|
|
83
|
+
*/
|
|
84
|
+
export declare function surfacesForSlackWake(item: SlackInboxItem): string[];
|
|
85
|
+
export declare function triggerEventId(item: SlackInboxItem): string;
|
|
86
|
+
/**
|
|
87
|
+
* Prepare at claim/start. Does not advance cursors or settle queue.
|
|
88
|
+
* When the trigger is already covered by the primary surface cursor, returns
|
|
89
|
+
* already_delivered so the worker can settle without a provider turn.
|
|
90
|
+
*/
|
|
91
|
+
export declare function prepareCursorDelivery(input: {
|
|
92
|
+
agentId: string;
|
|
93
|
+
item: InboxItem;
|
|
94
|
+
store?: ObservedConversationStore;
|
|
95
|
+
}): Promise<PrepareCursorDeliveryResult>;
|
|
96
|
+
/**
|
|
97
|
+
* Commit at runtime.started (or after follow-up accept).
|
|
98
|
+
*
|
|
99
|
+
* Idempotent only when live cursor is already at/past the plan target
|
|
100
|
+
* (`current >= target`). Any other expectation mismatch is fail-closed —
|
|
101
|
+
* never rewrite the prepared CAS expectation to the live cursor.
|
|
102
|
+
*/
|
|
103
|
+
export declare function commitCursorDelivery(input: {
|
|
104
|
+
plan: CursorDeliveryPlan;
|
|
105
|
+
queue: WakeQueueService;
|
|
106
|
+
/** Active/trigger item must not be settled by coalesce. */
|
|
107
|
+
excludeItemIds?: Iterable<string>;
|
|
108
|
+
store?: ObservedConversationStore;
|
|
109
|
+
}): Promise<{
|
|
110
|
+
advanced: string[];
|
|
111
|
+
coalescedItemIds: string[];
|
|
112
|
+
}>;
|
|
113
|
+
/**
|
|
114
|
+
* Settle still-queued Slack wakes on the same exact surface whose observed
|
|
115
|
+
* ordinals are within the captured tail. Never touches the active item, other
|
|
116
|
+
* surfaces, later-than-tail rows, staged rows, or non-Slack items.
|
|
117
|
+
*
|
|
118
|
+
* Candidate selection is read-side; the settle is one atomic queue-store batch
|
|
119
|
+
* so the selected set moves to seen together.
|
|
120
|
+
*/
|
|
121
|
+
export declare function coalesceCoveredWakes(input: {
|
|
122
|
+
agentId: string;
|
|
123
|
+
queue: WakeQueueService;
|
|
124
|
+
surfaces: SurfaceDeliveryPlan[];
|
|
125
|
+
excludeItemIds: Set<string>;
|
|
126
|
+
store?: ObservedConversationStore;
|
|
127
|
+
}): Promise<string[]>;
|
|
128
|
+
/**
|
|
129
|
+
* Exact after-cursor count from a captured reconciled ordinal tail, not
|
|
130
|
+
* retained-window length. Fail-closed when the index cannot support the claim
|
|
131
|
+
* (missing index with retained rows, tail behind retained max, retained longer
|
|
132
|
+
* than the ordinal span, or captured tail row absent from the journal window).
|
|
133
|
+
*
|
|
134
|
+
* `candidates` must already be filtered through the same captured tail
|
|
135
|
+
* (`afterOrdinal < ordinal <= tail`).
|
|
136
|
+
*/
|
|
137
|
+
export declare function exactCandidateCountFromIndex(input: {
|
|
138
|
+
afterOrdinal: number;
|
|
139
|
+
candidates: ObservedConversationEntry[];
|
|
140
|
+
/** Captured reconciled journal-tail index; undefined when empty / unknown. */
|
|
141
|
+
index: {
|
|
142
|
+
tailOrdinal: number;
|
|
143
|
+
lastEventId?: string;
|
|
144
|
+
} | undefined;
|
|
145
|
+
isResponseThreadEstablish: boolean;
|
|
146
|
+
surfaceId: string;
|
|
147
|
+
}): number;
|
|
148
|
+
/** Conversation-time order for cross-surface selection (messageTs primary). */
|
|
149
|
+
export declare function compareByConversationTime(a: {
|
|
150
|
+
messageTs: string;
|
|
151
|
+
receivedAt?: string;
|
|
152
|
+
ordinal?: number;
|
|
153
|
+
}, b: {
|
|
154
|
+
messageTs: string;
|
|
155
|
+
receivedAt?: string;
|
|
156
|
+
ordinal?: number;
|
|
157
|
+
}): number;
|
|
158
|
+
/**
|
|
159
|
+
* Pure union of plans by exact surface id (no re-window). Entries deduped by
|
|
160
|
+
* eventId; cursorExpected prefers the more conservative (lower) present ordinal.
|
|
161
|
+
*
|
|
162
|
+
* Per-surface candidateCount is max(candidateCount_i) across plans (exact journal
|
|
163
|
+
* population after the same cursor). omitted = candidateCount − unique(entries).
|
|
164
|
+
* Never sum plan-local omitted aggregates across overlapping windows.
|
|
165
|
+
*/
|
|
166
|
+
export declare function mergeSurfacePlans(plans: CursorDeliveryPlan[]): SurfaceDeliveryPlan[];
|
|
167
|
+
/**
|
|
168
|
+
* Merge plans and rebuild the full provider-facing envelope.
|
|
169
|
+
* Single-plan merge preserves surfaces/omitted; multi-plan unions then
|
|
170
|
+
* envelope-aware re-windows under 20/16KiB with prior omissions retained.
|
|
171
|
+
*/
|
|
172
|
+
export declare function mergeCursorDeliveryPlans(plans: CursorDeliveryPlan[], triggerItem: SlackInboxItem): CursorDeliveryPlan;
|
|
173
|
+
/**
|
|
174
|
+
* Newest-fitting by conversation time using only line bytes (unit tests /
|
|
175
|
+
* internal). Prefer selectNewestFittingForEnvelope when advancing cursors.
|
|
176
|
+
*/
|
|
177
|
+
export declare function selectNewestFitting(candidates: ObservedConversationEntry[], options: {
|
|
178
|
+
maxMessages: number;
|
|
179
|
+
maxBytes: number;
|
|
180
|
+
mustIncludeEventId?: string;
|
|
181
|
+
}): {
|
|
182
|
+
entries: ObservedConversationEntry[];
|
|
183
|
+
omittedCount: number;
|
|
184
|
+
};
|
|
185
|
+
/**
|
|
186
|
+
* Newest-fitting selection measured against the final provider-facing envelope
|
|
187
|
+
* (rows + Latest wake + previews + files). Only rows that fit are returned;
|
|
188
|
+
* nextDeliveredOrdinal must be derived from this set alone.
|
|
189
|
+
*/
|
|
190
|
+
export declare function selectNewestFittingForEnvelope(candidates: ObservedConversationEntry[], options: {
|
|
191
|
+
maxMessages: number;
|
|
192
|
+
maxBytes: number;
|
|
193
|
+
mustIncludeEventId?: string;
|
|
194
|
+
triggerItem?: SlackInboxItem;
|
|
195
|
+
totalCandidates?: number;
|
|
196
|
+
}): {
|
|
197
|
+
entries: ObservedConversationEntry[];
|
|
198
|
+
omittedCount: number;
|
|
199
|
+
};
|
|
200
|
+
export declare function formatObservedLine(entry: ObservedConversationEntry): string;
|
|
201
|
+
/** @deprecated Use renderCursorDeliveryEnvelope — same output, full envelope. */
|
|
202
|
+
export declare function renderCursorDeliveryPrompt(trigger: SlackInboxItem, surfaces: SurfaceDeliveryPlan[]): string;
|
|
203
|
+
/**
|
|
204
|
+
* Final provider-facing cursor envelope: chronological rows + Latest wake +
|
|
205
|
+
* previews/files. Must not post-truncate after nextDeliveredOrdinal is chosen;
|
|
206
|
+
* callers select rows so this string is already ≤ 16 KiB.
|
|
207
|
+
*/
|
|
208
|
+
export declare function renderCursorDeliveryEnvelope(trigger: SlackInboxItem, surfaces: SurfaceDeliveryPlan[]): string;
|
|
209
|
+
export declare function renderCursorDeliveryEnvelopeFromEntries(trigger: SlackInboxItem, entries: ObservedConversationEntry[], omitted: number): string;
|
|
210
|
+
/**
|
|
211
|
+
* Truncate to maxBytes UTF-8 without splitting code points / surrogate pairs.
|
|
212
|
+
* Used for per-message clip and extras clipping — not for post-plan row mutation.
|
|
213
|
+
*/
|
|
214
|
+
export declare function truncateUtf8(text: string, maxBytes: number): string;
|
|
215
|
+
/**
|
|
216
|
+
* Clip previews/files so chrome + Latest wake + extras fit in the envelope
|
|
217
|
+
* budget even with zero snapshot rows. Never leave an over-cap prepared plan.
|
|
218
|
+
*/
|
|
219
|
+
export declare function clipTriggerExtrasForEnvelope(trigger: SlackInboxItem): SlackInboxItem;
|
|
220
|
+
/** Primary surface id for a plan (grouping key for follow-up batching). */
|
|
221
|
+
export declare function primarySurfaceId(plan: CursorDeliveryPlan): string;
|
|
222
|
+
//# sourceMappingURL=cursor-delivery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor-delivery.d.ts","sourceRoot":"","sources":["../../../server/runtime/cursor-delivery.ts"],"names":[],"mappings":"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"}
|