@tickernelz/paperclip-pro-server 2026.1017.2 → 2026.1018.0
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/build-info.json +1 -1
- package/dist/modules/agent-lifecycle/__tests__/lifecycle.test.js +36 -0
- package/dist/modules/agent-lifecycle/__tests__/lifecycle.test.js.map +1 -1
- package/dist/routes/attention.d.ts.map +1 -1
- package/dist/routes/attention.js +44 -26
- package/dist/routes/attention.js.map +1 -1
- package/dist/routes/browser-use.d.ts +2 -2
- package/dist/routes/openapi.d.ts.map +1 -1
- package/dist/routes/openapi.js +12 -2
- package/dist/routes/openapi.js.map +1 -1
- package/dist/services/cancelled-native-startup.d.ts.map +1 -1
- package/dist/services/cancelled-native-startup.js +21 -5
- package/dist/services/cancelled-native-startup.js.map +1 -1
- package/dist/services/cancelled-native-startup.test.d.ts +2 -0
- package/dist/services/cancelled-native-startup.test.d.ts.map +1 -0
- package/dist/services/cancelled-native-startup.test.js +243 -0
- package/dist/services/cancelled-native-startup.test.js.map +1 -0
- package/dist/services/chat-action-work.d.ts +1 -0
- package/dist/services/chat-action-work.d.ts.map +1 -1
- package/dist/services/chat-action-work.js +6 -0
- package/dist/services/chat-action-work.js.map +1 -1
- package/dist/services/chat-channels.d.ts +1 -0
- package/dist/services/chat-channels.d.ts.map +1 -1
- package/dist/services/chat-channels.js +2 -0
- package/dist/services/chat-channels.js.map +1 -1
- package/dist/services/chat-work-notifications.d.ts +1 -0
- package/dist/services/chat-work-notifications.d.ts.map +1 -1
- package/dist/services/chat-work-notifications.js +1 -0
- package/dist/services/chat-work-notifications.js.map +1 -1
- package/dist/services/connectors/slack.d.ts +14 -14
- package/dist/services/decision-desk.d.ts +19 -0
- package/dist/services/decision-desk.d.ts.map +1 -0
- package/dist/services/decision-desk.js +135 -0
- package/dist/services/decision-desk.js.map +1 -0
- package/dist/services/delivery-work-notifications.d.ts +1 -0
- package/dist/services/delivery-work-notifications.d.ts.map +1 -1
- package/dist/services/delivery-work-notifications.js +1 -0
- package/dist/services/delivery-work-notifications.js.map +1 -1
- package/dist/services/execution-recovery-attempt.d.ts +3 -0
- package/dist/services/execution-recovery-attempt.d.ts.map +1 -1
- package/dist/services/execution-recovery-attempt.js +7 -0
- package/dist/services/execution-recovery-attempt.js.map +1 -1
- package/dist/services/explicit-native-continuation.test.js +17 -4
- package/dist/services/explicit-native-continuation.test.js.map +1 -1
- package/dist/services/heartbeat/local-cli-admission.d.ts.map +1 -1
- package/dist/services/heartbeat/local-cli-admission.js +15 -1
- package/dist/services/heartbeat/local-cli-admission.js.map +1 -1
- package/dist/services/heartbeat/local-cli-admission.test.js +3 -1
- package/dist/services/heartbeat/local-cli-admission.test.js.map +1 -1
- package/dist/services/heartbeat/local-run-memory-gate.d.ts +41 -0
- package/dist/services/heartbeat/local-run-memory-gate.d.ts.map +1 -0
- package/dist/services/heartbeat/local-run-memory-gate.js +158 -0
- package/dist/services/heartbeat/local-run-memory-gate.js.map +1 -0
- package/dist/services/heartbeat/local-run-memory-gate.test.d.ts +2 -0
- package/dist/services/heartbeat/local-run-memory-gate.test.d.ts.map +1 -0
- package/dist/services/heartbeat/local-run-memory-gate.test.js +152 -0
- package/dist/services/heartbeat/local-run-memory-gate.test.js.map +1 -0
- package/dist/services/heartbeat/queue.d.ts +2 -0
- package/dist/services/heartbeat/queue.d.ts.map +1 -1
- package/dist/services/heartbeat/queue.js +25 -0
- package/dist/services/heartbeat/queue.js.map +1 -1
- package/dist/services/heartbeat/retries.d.ts +29 -22
- package/dist/services/heartbeat/retries.d.ts.map +1 -1
- package/dist/services/heartbeat/retries.js +45 -13
- package/dist/services/heartbeat/retries.js.map +1 -1
- package/dist/services/heartbeat/workspaces.d.ts.map +1 -1
- package/dist/services/heartbeat/workspaces.js +2 -1
- package/dist/services/heartbeat/workspaces.js.map +1 -1
- package/dist/services/heartbeat.d.ts +8 -8
- package/dist/services/heartbeat.d.ts.map +1 -1
- package/dist/services/heartbeat.js +3 -5
- package/dist/services/heartbeat.js.map +1 -1
- package/dist/services/issue-thread-interactions.d.ts.map +1 -1
- package/dist/services/issue-thread-interactions.js +13 -0
- package/dist/services/issue-thread-interactions.js.map +1 -1
- package/dist/services/native-runtime/native-session-executor.d.ts +2 -2
- package/dist/services/native-runtime/native-session-executor.d.ts.map +1 -1
- package/dist/services/native-runtime/native-session-resume.test.js +17 -0
- package/dist/services/native-runtime/native-session-resume.test.js.map +1 -1
- package/dist/services/native-runtime/runner-api-client.d.ts +3 -3
- package/dist/services/native-runtime/runner-api-client.d.ts.map +1 -1
- package/dist/services/openwa/guidance.d.ts +3 -1
- package/dist/services/openwa/guidance.d.ts.map +1 -1
- package/dist/services/openwa/guidance.js +25 -8
- package/dist/services/openwa/guidance.js.map +1 -1
- package/dist/services/openwa/owners.d.ts +1 -0
- package/dist/services/openwa/owners.d.ts.map +1 -1
- package/dist/services/openwa/owners.js +8 -1
- package/dist/services/openwa/owners.js.map +1 -1
- package/dist/services/openwa/pending-cards.d.ts +46 -0
- package/dist/services/openwa/pending-cards.d.ts.map +1 -0
- package/dist/services/openwa/pending-cards.js +307 -0
- package/dist/services/openwa/pending-cards.js.map +1 -0
- package/dist/services/openwa/session-health.d.ts +3 -1
- package/dist/services/openwa/session-health.d.ts.map +1 -1
- package/dist/services/openwa/session-health.js +18 -4
- package/dist/services/openwa/session-health.js.map +1 -1
- package/dist/services/owner-decision-relay.d.ts +12 -2
- package/dist/services/owner-decision-relay.d.ts.map +1 -1
- package/dist/services/owner-decision-relay.js +57 -18
- package/dist/services/owner-decision-relay.js.map +1 -1
- package/dist/services/pre-dispatch-review-wait.d.ts +2 -0
- package/dist/services/pre-dispatch-review-wait.d.ts.map +1 -1
- package/dist/services/pre-dispatch-review-wait.js +11 -7
- package/dist/services/pre-dispatch-review-wait.js.map +1 -1
- package/dist/services/recovery/service.d.ts.map +1 -1
- package/dist/services/recovery/service.js +9 -5
- package/dist/services/recovery/service.js.map +1 -1
- package/dist/services/recovery/stranded-notice.d.ts +1 -0
- package/dist/services/recovery/stranded-notice.d.ts.map +1 -1
- package/dist/services/recovery/stranded-notice.js +10 -0
- package/dist/services/recovery/stranded-notice.js.map +1 -1
- package/dist/services/status-card-update-engine.d.ts +4 -4
- package/dist/services/status-card-update-engine.d.ts.map +1 -1
- package/dist/services/task-watchdogs.d.ts +1 -1
- package/dist/services/tool-gateway.d.ts +1 -1
- package/dist/services/tool-gateway.d.ts.map +1 -1
- package/dist/services/voice/voice-inbound-service.d.ts +3 -3
- package/package.json +21 -21
- package/skills/openwa/SKILL.md +8 -2
- package/skills/paperclip/SKILL.md +1 -1
- package/ui-dist/assets/{AgentAvatar-Cy7DadMK.js → AgentAvatar-rZFrG-iC.js} +1 -1
- package/ui-dist/assets/{Agents.production-BJyEbiQk.js → Agents.production-uSJFITvi.js} +2 -2
- package/ui-dist/assets/{BreadcrumbContext-CIC8QOSJ.js → BreadcrumbContext-za5ULJSm.js} +2 -2
- package/ui-dist/assets/{CompanyActivity.production-Dp4ldx4P.js → CompanyActivity.production-fp0biOpS.js} +1 -1
- package/ui-dist/assets/{CompanyExport-BBAKbfHg.js → CompanyExport-IOz8ZA8x.js} +2 -2
- package/ui-dist/assets/{CompanySkills.production-XuOHqAg6.js → CompanySkills.production-CffIe8qr.js} +2 -2
- package/ui-dist/assets/{EmptyState-Dvu_j1Dk.js → EmptyState-BJJPfoYe.js} +1 -1
- package/ui-dist/assets/{MarkdownBody-Dh6kczcO.js → MarkdownBody-C4hEmflc.js} +3 -3
- package/ui-dist/assets/{MarkdownEditor-nPcj3w4g.js → MarkdownEditor-DBC64_fF.js} +1 -1
- package/ui-dist/assets/{OrgChart.production-B-U1K3BO.js → OrgChart.production-CjZIrTL_.js} +1 -1
- package/ui-dist/assets/{PageSkeleton-B858kNMV.js → PageSkeleton-D-vmgL0l.js} +1 -1
- package/ui-dist/assets/{RoutineDetail.production-DR37hdFP.js → RoutineDetail.production-1l07aNMo.js} +1 -1
- package/ui-dist/assets/{RoutineRunVariablesDialog-TmqPj_PL.js → RoutineRunVariablesDialog-B8lrS2FZ.js} +2 -2
- package/ui-dist/assets/{Routines.production-D4Jwvus7.js → Routines.production-D87FWVo9.js} +1 -1
- package/ui-dist/assets/{StatusIcon-PIDWeOS3.js → StatusIcon-t9uPRpE5.js} +1 -1
- package/ui-dist/assets/{ToastContext-B6w8XXdu.js → ToastContext-fIh2QNZJ.js} +1 -1
- package/ui-dist/assets/{agent-avatar-url-Dp-4-Emx.js → agent-avatar-url-BHbCsFus.js} +21 -21
- package/ui-dist/assets/{alert-dialog-Cgn1_GT7.js → alert-dialog-BQZoePYb.js} +1 -1
- package/ui-dist/assets/{arrow-right-Dblp-MTW.js → arrow-right-BzMD-DNO.js} +1 -1
- package/ui-dist/assets/{badge-B6lcLGFG.js → badge-dcpUmKh9.js} +1 -1
- package/ui-dist/assets/{bot-BIsZWSPn.js → bot-DoEo7gOa.js} +1 -1
- package/ui-dist/assets/{card-Byu34cBe.js → card-mNYVrsX_.js} +1 -1
- package/ui-dist/assets/{check-AN9f-5s7.js → check-BkartoVa.js} +1 -1
- package/ui-dist/assets/{checkbox-DVrU8RYw.js → checkbox-JP8qevXt.js} +1 -1
- package/ui-dist/assets/{clipboard-Bj1LrAus.js → clipboard-Bz_p8QHy.js} +1 -1
- package/ui-dist/assets/{company-members-B3Kl56Wi.js → company-members-rOuXjQRg.js} +1 -1
- package/ui-dist/assets/{definition-DSY4nExe.js → definition-dyCYbBA7.js} +1 -1
- package/ui-dist/assets/{dist-qobNlkwf.js → dist-CI0Tr-Id.js} +1 -1
- package/ui-dist/assets/{dist-BoN0lntx.js → dist-CMclhGEN.js} +1 -1
- package/ui-dist/assets/{dist-DNeg6Olm.js → dist-D2Bp7-l0.js} +1 -1
- package/ui-dist/assets/{environments-CnsaRGwX.js → environments-BIMSsOem.js} +1 -1
- package/ui-dist/assets/{external-link-DJ5KXpF5.js → external-link-CUBJORqK.js} +1 -1
- package/ui-dist/assets/{file-text-BqJfYVg5.js → file-text-CTqnIoYc.js} +1 -1
- package/ui-dist/assets/{health-DXJ-aWLi.js → health-DzPZ7RTI.js} +1 -1
- package/ui-dist/assets/{heartbeats-BoD7FLml.js → heartbeats-cR8PFCO4.js} +1 -1
- package/ui-dist/assets/{index-BVwUuuxT.js → index-BQ6k9M0h.js} +159 -159
- package/ui-dist/assets/{input-BGjNwUvf.js → input-DWDEF0_4.js} +1 -1
- package/ui-dist/assets/{label-CKJXPwWx.js → label-D1IFWYWZ.js} +2 -2
- package/ui-dist/assets/{mention-chips-BovBgzq0.js → mention-chips-tvFPtLxM.js} +1 -1
- package/ui-dist/assets/{rotate-ccw-B7ntLtp4.js → rotate-ccw-CIoC0n9j.js} +1 -1
- package/ui-dist/assets/{select-DIma4_VX.js → select-DDOAq1-R.js} +1 -1
- package/ui-dist/assets/{sheet-C9tsiOQC.js → sheet-De2PrRU3.js} +1 -1
- package/ui-dist/assets/skeleton-BBZG3C3Z.js +1 -0
- package/ui-dist/assets/{tabs-nc-7quf8.js → tabs-DNtO_nZK.js} +1 -1
- package/ui-dist/assets/{use-adapter-capabilities-DiUfxjZz.js → use-adapter-capabilities-BHmVN8eS.js} +1 -1
- package/ui-dist/assets/{use-copy-action-RWCAx8p8.js → use-copy-action-CEHlaOnX.js} +1 -1
- package/ui-dist/assets/{useHiddenSettings-Be7MTSIM.js → useHiddenSettings-tTY86zjx.js} +1 -1
- package/ui-dist/index.html +39 -39
- package/ui-dist/sw.js +1 -1
- package/ui-dist/assets/skeleton-CyS6Uq5n.js +0 -1
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { issueThreadInteractions, type Db } from "@tickernelz/paperclip-pro-db";
|
|
2
|
+
type DbTransaction = Parameters<Parameters<Db["transaction"]>[0]>[0];
|
|
3
|
+
type CardRow = typeof issueThreadInteractions.$inferSelect;
|
|
4
|
+
export declare const OPENWA_PENDING_CARD_ACTION_KIND = "openwa_pending_card";
|
|
5
|
+
export declare const OPENWA_PENDING_CARD_WAKE_ACTOR_ID = "openwa:pending-card";
|
|
6
|
+
export declare const OPENWA_PENDING_CARD_BATCH_MS = 60000;
|
|
7
|
+
/** True for a pending agent-created human_only card an owner may answer from WhatsApp. */
|
|
8
|
+
export declare function openwaOwnerCard(card: Pick<CardRow, "id" | "kind" | "status" | "payload" | "createdByAgentId" | "effectiveResolverPolicy">): boolean;
|
|
9
|
+
/** Queues one owner-chat wake per active OpenWA endpoint for a new owner card, inside the card's transaction. */
|
|
10
|
+
export declare function stageOpenwaPendingCardWakes(tx: DbTransaction, card: CardRow): Promise<string[]>;
|
|
11
|
+
/** Wakes the endpoint agent in the owner chat for one staged card; settles a resolved card without waking. */
|
|
12
|
+
export declare function dispatchOpenwaPendingCardWake(db: Db, actionId: string): Promise<boolean>;
|
|
13
|
+
export declare function processPendingOpenwaPendingCardWakes(db: Db, limit?: number): Promise<number>;
|
|
14
|
+
export interface OpenwaPendingCard {
|
|
15
|
+
interactionId: string;
|
|
16
|
+
card: string;
|
|
17
|
+
kind: string;
|
|
18
|
+
issue: string;
|
|
19
|
+
issueTitle: string;
|
|
20
|
+
url: string;
|
|
21
|
+
requestedBy: string | null;
|
|
22
|
+
title: string | null;
|
|
23
|
+
prompt: string | null;
|
|
24
|
+
options: Array<{
|
|
25
|
+
id: string;
|
|
26
|
+
label: string;
|
|
27
|
+
}>;
|
|
28
|
+
questions: Array<{
|
|
29
|
+
id: string;
|
|
30
|
+
prompt: string;
|
|
31
|
+
selectionMode: "single" | "multi";
|
|
32
|
+
options: Array<{
|
|
33
|
+
id: string;
|
|
34
|
+
label: string;
|
|
35
|
+
}>;
|
|
36
|
+
}>;
|
|
37
|
+
}
|
|
38
|
+
/** Still-pending owner cards named by a wake; titles, prompts and labels are worker-authored data. */
|
|
39
|
+
export declare function openwaPendingCardsForWake(db: Db, input: {
|
|
40
|
+
companyId: string;
|
|
41
|
+
endpointId: string;
|
|
42
|
+
chatKey: string;
|
|
43
|
+
interactionIds: string[];
|
|
44
|
+
}): Promise<OpenwaPendingCard[]>;
|
|
45
|
+
export {};
|
|
46
|
+
//# sourceMappingURL=pending-cards.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pending-cards.d.ts","sourceRoot":"","sources":["../../../src/services/openwa/pending-cards.ts"],"names":[],"mappings":"AACA,OAAO,EAAsC,uBAAuB,EAAU,KAAK,EAAE,EAAE,MAAM,8BAA8B,CAAC;AAgB5H,KAAK,aAAa,GAAG,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAGrE,KAAK,OAAO,GAAG,OAAO,uBAAuB,CAAC,YAAY,CAAC;AAE3D,eAAO,MAAM,+BAA+B,wBAAwB,CAAC;AACrE,eAAO,MAAM,iCAAiC,wBAAwB,CAAC;AAGvE,eAAO,MAAM,4BAA4B,QAAS,CAAC;AAmBnD,0FAA0F;AAC1F,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,kBAAkB,GAAG,yBAAyB,CAAC,GAAG,OAAO,CASnJ;AA4BD,iHAAiH;AACjH,wBAAsB,2BAA2B,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA0FrG;AAED,8GAA8G;AAC9G,wBAAsB,6BAA6B,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAoG9F;AAED,wBAAsB,oCAAoC,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAW9F;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9C,SAAS,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,QAAQ,GAAG,OAAO,CAAC;QAAC,OAAO,EAAE,KAAK,CAAC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAC;CACpI;AAWD,sGAAsG;AACtG,wBAAsB,yBAAyB,CAC7C,EAAE,EAAE,EAAE,EACN,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,EAAE,CAAA;CAAE,GAC1F,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA4C9B"}
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import { and, asc, desc, eq, inArray, isNotNull } from "drizzle-orm";
|
|
2
|
+
import { agents, chatActions, chatEndpoints, issueThreadInteractions, issues } from "@tickernelz/paperclip-pro-db";
|
|
3
|
+
import { openwaEndpointPolicySchema } from "@tickernelz/paperclip-pro-shared";
|
|
4
|
+
import { canActorReadIssuePrivacy, issuePrivacyMode } from "../authorization.js";
|
|
5
|
+
import { forbidden } from "../../errors.js";
|
|
6
|
+
import { logger } from "../../middleware/logger.js";
|
|
7
|
+
import { dueChatAction } from "../chat-action-work.js";
|
|
8
|
+
import { notifyChatActionWork } from "../chat-work-notifications.js";
|
|
9
|
+
import { createDurableChatWakeupRequest } from "../durable-chat-wakeup.js";
|
|
10
|
+
import { issueService } from "../issues.js";
|
|
11
|
+
import { publicChatTaskUrl } from "../chat-task-url.js";
|
|
12
|
+
import { ownerRelayBlockedReason, pendingDecisionCardShape } from "../owner-decision-relay.js";
|
|
13
|
+
import { openwaWakeRuntime } from "./approvals.js";
|
|
14
|
+
import { openwaChatKey } from "./outbound.js";
|
|
15
|
+
import { openwaCurrentOwners } from "./owners.js";
|
|
16
|
+
import { openwaOwnerApprovalConversation } from "./session-health.js";
|
|
17
|
+
export const OPENWA_PENDING_CARD_ACTION_KIND = "openwa_pending_card";
|
|
18
|
+
export const OPENWA_PENDING_CARD_WAKE_ACTOR_ID = "openwa:pending-card";
|
|
19
|
+
const WAKE_MAX_ATTEMPTS = 5;
|
|
20
|
+
const WAKE_RETRY_MS = 30_000;
|
|
21
|
+
export const OPENWA_PENDING_CARD_BATCH_MS = 60_000;
|
|
22
|
+
const MAX_CARDS_PER_ACTION = 10;
|
|
23
|
+
const CARD_MAX_PER_WAKE = 10;
|
|
24
|
+
const CARD_MAX_OPTIONS = 10;
|
|
25
|
+
const CARD_TITLE_LIMIT = 200;
|
|
26
|
+
const CARD_PROMPT_LIMIT = 600;
|
|
27
|
+
const CARD_LABEL_LIMIT = 120;
|
|
28
|
+
const RELAYED_KINDS = new Set([
|
|
29
|
+
"ask_user_questions",
|
|
30
|
+
"request_confirmation",
|
|
31
|
+
"request_checkbox_confirmation",
|
|
32
|
+
"suggest_tasks",
|
|
33
|
+
"request_item_verdicts",
|
|
34
|
+
]);
|
|
35
|
+
function record(value) {
|
|
36
|
+
return value && typeof value === "object" && !Array.isArray(value) ? value : {};
|
|
37
|
+
}
|
|
38
|
+
/** True for a pending agent-created human_only card an owner may answer from WhatsApp. */
|
|
39
|
+
export function openwaOwnerCard(card) {
|
|
40
|
+
return (card.status === "pending" &&
|
|
41
|
+
card.effectiveResolverPolicy === "human_only" &&
|
|
42
|
+
Boolean(card.createdByAgentId) &&
|
|
43
|
+
RELAYED_KINDS.has(card.kind) &&
|
|
44
|
+
record(card.payload).destructive !== true &&
|
|
45
|
+
ownerRelayBlockedReason(card) === null);
|
|
46
|
+
}
|
|
47
|
+
/** Owners who read the chat a card is sent to: the chat's own owner in a DM, every current owner in owner_number mode. */
|
|
48
|
+
async function chatRecipients(db, endpoint, chatKey) {
|
|
49
|
+
const owners = await openwaCurrentOwners(db, endpoint);
|
|
50
|
+
const policy = openwaEndpointPolicySchema.parse(endpoint.policy ?? {});
|
|
51
|
+
const readers = policy.numberMode === "owner_number" ? owners : owners.filter((owner) => owner.jids.map(openwaChatKey).includes(chatKey));
|
|
52
|
+
return [...new Set(readers.map((owner) => owner.userId))];
|
|
53
|
+
}
|
|
54
|
+
/** True when the endpoint agent, acting for each recipient, may read the issue; fails closed without recipients. */
|
|
55
|
+
async function recipientsMayRead(db, endpoint, issueId, recipients) {
|
|
56
|
+
if (issuePrivacyMode() !== "enforce")
|
|
57
|
+
return true;
|
|
58
|
+
if (!endpoint.assignedAgentId || recipients.length === 0)
|
|
59
|
+
return false;
|
|
60
|
+
const [issue] = await db.select().from(issues).where(and(eq(issues.id, issueId), eq(issues.companyId, endpoint.companyId))).limit(1);
|
|
61
|
+
if (!issue)
|
|
62
|
+
return false;
|
|
63
|
+
for (const userId of recipients) {
|
|
64
|
+
const actor = { type: "agent", agentId: endpoint.assignedAgentId, companyId: endpoint.companyId, onBehalfOfUserId: userId };
|
|
65
|
+
if (!(await canActorReadIssuePrivacy(db, actor, issue)))
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
/** Queues one owner-chat wake per active OpenWA endpoint for a new owner card, inside the card's transaction. */
|
|
71
|
+
export async function stageOpenwaPendingCardWakes(tx, card) {
|
|
72
|
+
if (!openwaOwnerCard(card))
|
|
73
|
+
return [];
|
|
74
|
+
const endpoints = await tx
|
|
75
|
+
.select()
|
|
76
|
+
.from(chatEndpoints)
|
|
77
|
+
.where(and(eq(chatEndpoints.companyId, card.companyId), eq(chatEndpoints.provider, "openwa"), eq(chatEndpoints.status, "active"), isNotNull(chatEndpoints.assignedAgentId)));
|
|
78
|
+
if (!endpoints.length)
|
|
79
|
+
return [];
|
|
80
|
+
const [issue] = await tx
|
|
81
|
+
.select({ identifier: issues.identifier })
|
|
82
|
+
.from(issues)
|
|
83
|
+
.where(and(eq(issues.companyId, card.companyId), eq(issues.id, card.issueId)))
|
|
84
|
+
.limit(1);
|
|
85
|
+
const staged = [];
|
|
86
|
+
for (const endpoint of endpoints) {
|
|
87
|
+
const account = endpoint.providerAccountId ?? "";
|
|
88
|
+
if (!account.includes("#"))
|
|
89
|
+
continue;
|
|
90
|
+
const target = await openwaOwnerApprovalConversation(tx, endpoint, {
|
|
91
|
+
sessionId: account.slice(account.lastIndexOf("#") + 1),
|
|
92
|
+
selfChatKey: (endpoint.botExternalId ?? "").replace(/\D/g, "") + "@c.us",
|
|
93
|
+
...(card.addresseeUserId ? { onlyUserId: card.addresseeUserId } : {}),
|
|
94
|
+
});
|
|
95
|
+
if (!target) {
|
|
96
|
+
logger.warn({ endpointId: endpoint.id, interactionId: card.id }, "OpenWA owner card has no owner conversation");
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
if (!(await recipientsMayRead(tx, endpoint, card.issueId, await chatRecipients(tx, endpoint, target.chatKey))))
|
|
100
|
+
continue;
|
|
101
|
+
const [open] = await tx
|
|
102
|
+
.select()
|
|
103
|
+
.from(chatActions)
|
|
104
|
+
.where(and(eq(chatActions.companyId, card.companyId), eq(chatActions.endpointId, endpoint.id), eq(chatActions.conversationId, target.conversationId), eq(chatActions.kind, OPENWA_PENDING_CARD_ACTION_KIND), eq(chatActions.status, "received")))
|
|
105
|
+
.orderBy(desc(chatActions.createdAt))
|
|
106
|
+
.limit(1)
|
|
107
|
+
.for("update");
|
|
108
|
+
const openIds = open ? (record(record(open.payload).openwa).pendingCardIds ?? []) : [];
|
|
109
|
+
if (open && openIds.length < MAX_CARDS_PER_ACTION && !openIds.includes(card.id)) {
|
|
110
|
+
const openwa = { ...record(open.payload.openwa), pendingCardIds: [...openIds, card.id] };
|
|
111
|
+
await tx.update(chatActions).set({ payload: { ...open.payload, openwa }, updatedAt: new Date() }).where(eq(chatActions.id, open.id));
|
|
112
|
+
staged.push(open.id);
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
const payload = {
|
|
116
|
+
version: 1,
|
|
117
|
+
issueId: target.issueId,
|
|
118
|
+
agentId: target.agentId,
|
|
119
|
+
interactionId: card.id,
|
|
120
|
+
chatKey: target.chatKey,
|
|
121
|
+
openwa: { event: "pending_card", triggerClass: "other", deliveryIds: [], pendingCardIds: [card.id] },
|
|
122
|
+
};
|
|
123
|
+
const [action] = await tx
|
|
124
|
+
.insert(chatActions)
|
|
125
|
+
.values({
|
|
126
|
+
companyId: card.companyId,
|
|
127
|
+
endpointId: endpoint.id,
|
|
128
|
+
conversationId: target.conversationId,
|
|
129
|
+
kind: OPENWA_PENDING_CARD_ACTION_KIND,
|
|
130
|
+
providerActionId: "openwa-pending-card:" + card.id,
|
|
131
|
+
status: "received",
|
|
132
|
+
payload,
|
|
133
|
+
result: { retryAt: new Date(Date.now() + OPENWA_PENDING_CARD_BATCH_MS).toISOString() },
|
|
134
|
+
})
|
|
135
|
+
.onConflictDoNothing()
|
|
136
|
+
.returning({ id: chatActions.id });
|
|
137
|
+
if (!action)
|
|
138
|
+
continue;
|
|
139
|
+
const comment = await issueService(tx).addComment(target.issueId, "Paperclip card " + card.id.slice(0, 8) + " on " + (issue?.identifier ?? card.issueId) + " waits for an owner decision.", {}, { authorType: "system" }, tx);
|
|
140
|
+
await tx.update(chatActions).set({ payload: { ...payload, commentId: comment.id } }).where(eq(chatActions.id, action.id));
|
|
141
|
+
staged.push(action.id);
|
|
142
|
+
}
|
|
143
|
+
if (staged.length)
|
|
144
|
+
await notifyChatActionWork(tx, OPENWA_PENDING_CARD_ACTION_KIND);
|
|
145
|
+
return staged;
|
|
146
|
+
}
|
|
147
|
+
/** Wakes the endpoint agent in the owner chat for one staged card; settles a resolved card without waking. */
|
|
148
|
+
export async function dispatchOpenwaPendingCardWake(db, actionId) {
|
|
149
|
+
const runtime = openwaWakeRuntime(db);
|
|
150
|
+
if (!runtime)
|
|
151
|
+
return false;
|
|
152
|
+
const now = new Date();
|
|
153
|
+
const [claimed] = await db
|
|
154
|
+
.update(chatActions)
|
|
155
|
+
.set({ status: "processing", updatedAt: now })
|
|
156
|
+
.where(and(eq(chatActions.id, actionId), dueChatAction(OPENWA_PENDING_CARD_ACTION_KIND, now.getTime())))
|
|
157
|
+
.returning();
|
|
158
|
+
if (!claimed)
|
|
159
|
+
return false;
|
|
160
|
+
const payload = claimed.payload;
|
|
161
|
+
const attemptCount = Number(record(claimed.result).attemptCount ?? 0) + 1;
|
|
162
|
+
const settle = (status, result) => db
|
|
163
|
+
.update(chatActions)
|
|
164
|
+
.set({ status, result: { ...result, attemptCount }, updatedAt: new Date() })
|
|
165
|
+
.where(and(eq(chatActions.id, claimed.id), eq(chatActions.status, "processing")));
|
|
166
|
+
try {
|
|
167
|
+
const issueId = String(payload.issueId);
|
|
168
|
+
const agentId = String(payload.agentId);
|
|
169
|
+
const commentId = String(payload.commentId);
|
|
170
|
+
const openwa = record(payload.openwa);
|
|
171
|
+
const cardIds = Array.isArray(openwa.pendingCardIds) ? openwa.pendingCardIds.filter((id) => typeof id === "string") : [];
|
|
172
|
+
const pendingCards = cardIds.length
|
|
173
|
+
? await db
|
|
174
|
+
.select({ id: issueThreadInteractions.id, issueId: issueThreadInteractions.issueId })
|
|
175
|
+
.from(issueThreadInteractions)
|
|
176
|
+
.where(and(eq(issueThreadInteractions.companyId, claimed.companyId), inArray(issueThreadInteractions.id, cardIds), eq(issueThreadInteractions.status, "pending")))
|
|
177
|
+
: [];
|
|
178
|
+
if (pendingCards.length === 0) {
|
|
179
|
+
await settle("processed", { code: "openwa_pending_card_resolved" });
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
const [issue] = await db
|
|
183
|
+
.select({ identifier: issues.identifier, assigneeAgentId: issues.assigneeAgentId, status: issues.status })
|
|
184
|
+
.from(issues)
|
|
185
|
+
.where(and(eq(issues.companyId, claimed.companyId), eq(issues.id, issueId)))
|
|
186
|
+
.limit(1);
|
|
187
|
+
if (!issue || issue.assigneeAgentId !== agentId || ["backlog", "done", "cancelled"].includes(issue.status)) {
|
|
188
|
+
await settle("failed", { code: "openwa_pending_card_target_changed" });
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
const [endpoint] = await db.select().from(chatEndpoints).where(and(eq(chatEndpoints.companyId, claimed.companyId), eq(chatEndpoints.id, claimed.endpointId))).limit(1);
|
|
192
|
+
const recipients = endpoint ? await chatRecipients(db, endpoint, String(payload.chatKey ?? "")) : [];
|
|
193
|
+
const readable = endpoint
|
|
194
|
+
? await Promise.all(pendingCards.map((pending) => recipientsMayRead(db, endpoint, pending.issueId, recipients)))
|
|
195
|
+
: [];
|
|
196
|
+
if (!readable.some(Boolean)) {
|
|
197
|
+
await settle("processed", { code: "openwa_pending_card_unreadable" });
|
|
198
|
+
return false;
|
|
199
|
+
}
|
|
200
|
+
const request = createDurableChatWakeupRequest({
|
|
201
|
+
id: claimed.id,
|
|
202
|
+
companyId: claimed.companyId,
|
|
203
|
+
agentId,
|
|
204
|
+
issueId,
|
|
205
|
+
commentId,
|
|
206
|
+
requestedByActorType: "system",
|
|
207
|
+
requestedByActorId: OPENWA_PENDING_CARD_WAKE_ACTOR_ID,
|
|
208
|
+
requestedAt: claimed.createdAt,
|
|
209
|
+
authorize: async (tx) => {
|
|
210
|
+
const [endpoint] = await tx
|
|
211
|
+
.select({ status: chatEndpoints.status, assignedAgentId: chatEndpoints.assignedAgentId })
|
|
212
|
+
.from(chatEndpoints)
|
|
213
|
+
.where(and(eq(chatEndpoints.companyId, claimed.companyId), eq(chatEndpoints.id, claimed.endpointId), eq(chatEndpoints.provider, "openwa")))
|
|
214
|
+
.limit(1);
|
|
215
|
+
if (!endpoint || endpoint.status === "archived" || endpoint.assignedAgentId !== agentId)
|
|
216
|
+
throw forbidden("The OpenWA endpoint changed", { code: "chat_action_authorization_changed" });
|
|
217
|
+
},
|
|
218
|
+
});
|
|
219
|
+
const context = { issueId, taskKey: issue.identifier, wakeCommentId: commentId, openwa };
|
|
220
|
+
await runtime.wakeup(agentId, {
|
|
221
|
+
source: "assignment",
|
|
222
|
+
triggerDetail: "system",
|
|
223
|
+
reason: "Paperclip card waits for an owner",
|
|
224
|
+
payload: { ...context, mutation: "openwa_pending_card" },
|
|
225
|
+
contextSnapshot: { ...context, source: "chat:openwa" },
|
|
226
|
+
allowRunCoalescing: false,
|
|
227
|
+
requestedByActorType: "system",
|
|
228
|
+
requestedByActorId: OPENWA_PENDING_CARD_WAKE_ACTOR_ID,
|
|
229
|
+
durableChatRequest: request,
|
|
230
|
+
});
|
|
231
|
+
await settle("processed", { code: "openwa_pending_card_wake_dispatched", wakeupRequestId: claimed.id });
|
|
232
|
+
return true;
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
logger.warn({ err: error, actionId: claimed.id }, "failed to dispatch OpenWA pending card wake");
|
|
236
|
+
await settle("failed", {
|
|
237
|
+
code: "openwa_pending_card_wake_failed",
|
|
238
|
+
error: error instanceof Error ? error.message : String(error),
|
|
239
|
+
retryable: attemptCount < WAKE_MAX_ATTEMPTS,
|
|
240
|
+
retryAt: new Date(Date.now() + WAKE_RETRY_MS * attemptCount).toISOString(),
|
|
241
|
+
});
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
export async function processPendingOpenwaPendingCardWakes(db, limit = 25) {
|
|
246
|
+
if (!openwaWakeRuntime(db))
|
|
247
|
+
return 0;
|
|
248
|
+
const rows = await db
|
|
249
|
+
.select({ id: chatActions.id })
|
|
250
|
+
.from(chatActions)
|
|
251
|
+
.where(dueChatAction(OPENWA_PENDING_CARD_ACTION_KIND))
|
|
252
|
+
.orderBy(chatActions.createdAt)
|
|
253
|
+
.limit(limit);
|
|
254
|
+
let dispatched = 0;
|
|
255
|
+
for (const row of rows)
|
|
256
|
+
if (await dispatchOpenwaPendingCardWake(db, row.id))
|
|
257
|
+
dispatched++;
|
|
258
|
+
return dispatched;
|
|
259
|
+
}
|
|
260
|
+
function clip(value, max) {
|
|
261
|
+
const text = value.replace(/\s+/g, " ").trim();
|
|
262
|
+
return text.length > max ? text.slice(0, max - 1) + "\u2026" : text;
|
|
263
|
+
}
|
|
264
|
+
function clipOptions(options) {
|
|
265
|
+
return options.slice(0, CARD_MAX_OPTIONS).map((option) => ({ id: option.id, label: clip(option.label, CARD_LABEL_LIMIT) }));
|
|
266
|
+
}
|
|
267
|
+
/** Still-pending owner cards named by a wake; titles, prompts and labels are worker-authored data. */
|
|
268
|
+
export async function openwaPendingCardsForWake(db, input) {
|
|
269
|
+
const { companyId, interactionIds } = input;
|
|
270
|
+
if (!interactionIds.length)
|
|
271
|
+
return [];
|
|
272
|
+
const [endpoint] = await db.select().from(chatEndpoints).where(and(eq(chatEndpoints.companyId, companyId), eq(chatEndpoints.id, input.endpointId))).limit(1);
|
|
273
|
+
if (!endpoint)
|
|
274
|
+
return [];
|
|
275
|
+
const recipients = await chatRecipients(db, endpoint, input.chatKey);
|
|
276
|
+
const rows = await db
|
|
277
|
+
.select({ card: issueThreadInteractions, identifier: issues.identifier, issueTitle: issues.title, requestedBy: agents.name })
|
|
278
|
+
.from(issueThreadInteractions)
|
|
279
|
+
.innerJoin(issues, and(eq(issues.companyId, issueThreadInteractions.companyId), eq(issues.id, issueThreadInteractions.issueId)))
|
|
280
|
+
.leftJoin(agents, and(eq(agents.companyId, issueThreadInteractions.companyId), eq(agents.id, issueThreadInteractions.createdByAgentId)))
|
|
281
|
+
.where(and(eq(issueThreadInteractions.companyId, companyId), inArray(issueThreadInteractions.id, interactionIds.slice(0, CARD_MAX_PER_WAKE)), eq(issueThreadInteractions.status, "pending")))
|
|
282
|
+
.orderBy(asc(issueThreadInteractions.createdAt));
|
|
283
|
+
const readable = await Promise.all(rows.map(async (row) => openwaOwnerCard(row.card) && (await recipientsMayRead(db, endpoint, row.card.issueId, recipients))));
|
|
284
|
+
return rows.filter((_, index) => readable[index]).map(({ card, identifier, issueTitle, requestedBy }) => {
|
|
285
|
+
const shape = pendingDecisionCardShape(card.kind, record(card.payload));
|
|
286
|
+
const reference = identifier ?? card.issueId;
|
|
287
|
+
return {
|
|
288
|
+
interactionId: card.id,
|
|
289
|
+
card: card.id.slice(0, 8),
|
|
290
|
+
kind: card.kind,
|
|
291
|
+
issue: reference,
|
|
292
|
+
issueTitle: clip(issueTitle, CARD_TITLE_LIMIT),
|
|
293
|
+
url: publicChatTaskUrl(reference) ?? "/issues/" + reference,
|
|
294
|
+
requestedBy,
|
|
295
|
+
title: card.title ? clip(card.title, CARD_TITLE_LIMIT) : null,
|
|
296
|
+
prompt: shape.prompt ? clip(shape.prompt, CARD_PROMPT_LIMIT) : null,
|
|
297
|
+
options: clipOptions(shape.options),
|
|
298
|
+
questions: shape.questions.slice(0, CARD_MAX_OPTIONS).map((question) => ({
|
|
299
|
+
id: question.id,
|
|
300
|
+
prompt: clip(question.prompt, CARD_PROMPT_LIMIT),
|
|
301
|
+
selectionMode: question.selectionMode,
|
|
302
|
+
options: clipOptions(question.options),
|
|
303
|
+
})),
|
|
304
|
+
};
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
//# sourceMappingURL=pending-cards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pending-cards.js","sourceRoot":"","sources":["../../../src/services/openwa/pending-cards.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,14 +23,16 @@ export type OpenwaSessionHealthWakeStage = {
|
|
|
23
23
|
staged: false;
|
|
24
24
|
reason: "no_assigned_agent" | "no_owner_conversation";
|
|
25
25
|
};
|
|
26
|
-
/** Owner approval chat of the endpoint: self-chat in owner_number mode, else the most recent active owner DM. */
|
|
26
|
+
/** Owner approval chat of the endpoint: self-chat in owner_number mode, else the most recent active owner DM (phone or LID). */
|
|
27
27
|
export declare function openwaOwnerApprovalConversation(tx: DbTransaction, endpoint: EndpointRow, input: {
|
|
28
28
|
sessionId: string;
|
|
29
29
|
selfChatKey: string;
|
|
30
|
+
onlyUserId?: string;
|
|
30
31
|
}): Promise<{
|
|
31
32
|
conversationId: string;
|
|
32
33
|
issueId: string;
|
|
33
34
|
agentId: string;
|
|
35
|
+
chatKey: string;
|
|
34
36
|
} | null>;
|
|
35
37
|
/** Writes the system comment and queued wake action for one session health transition inside its transaction. */
|
|
36
38
|
export declare function stageOpenwaSessionHealthWake(tx: DbTransaction, endpoint: EndpointRow, input: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-health.d.ts","sourceRoot":"","sources":["../../../src/services/openwa/session-health.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkC,aAAa,EAAU,KAAK,EAAE,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"session-health.d.ts","sourceRoot":"","sources":["../../../src/services/openwa/session-health.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkC,aAAa,EAAU,KAAK,EAAE,EAAE,MAAM,8BAA8B,CAAC;AAU9G,KAAK,aAAa,GAAG,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrE,KAAK,WAAW,GAAG,OAAO,aAAa,CAAC,YAAY,CAAC;AAErD,eAAO,MAAM,sCAAsC,iCAAiC,CAAC;AACrF,eAAO,MAAM,mCAAmC,0BAA0B,CAAC;AAK3E,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,QAAQ,GAAG,aAAa,CAAC;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,WAAW,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;CAC7G;AAED,MAAM,MAAM,4BAA4B,GACpC;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC3E;IAAE,MAAM,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,mBAAmB,GAAG,uBAAuB,CAAA;CAAE,CAAC;AAqB7E,gIAAgI;AAChI,wBAAsB,+BAA+B,CACnD,EAAE,EAAE,aAAa,EACjB,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GACrE,OAAO,CAAC;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CA2C/F;AAED,iHAAiH;AACjH,wBAAsB,4BAA4B,CAChD,EAAE,EAAE,aAAa,EACjB,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,wBAAwB,CAAA;CAAE,GACjF,OAAO,CAAC,4BAA4B,CAAC,CA8BvC;AAED,wBAAsB,+BAA+B,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAiFhG;AAED,wBAAsB,sCAAsC,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAiBhG"}
|
|
@@ -7,6 +7,7 @@ import { logger } from "../../middleware/logger.js";
|
|
|
7
7
|
import { createDurableChatWakeupRequest } from "../durable-chat-wakeup.js";
|
|
8
8
|
import { issueService } from "../issues.js";
|
|
9
9
|
import { openwaWakeRuntime } from "./approvals.js";
|
|
10
|
+
import { openwaChatKey } from "./outbound.js";
|
|
10
11
|
import { openwaCurrentOwners } from "./owners.js";
|
|
11
12
|
export const OPENWA_SESSION_HEALTH_WAKE_ACTION_KIND = "openwa_session_health_wakeup";
|
|
12
13
|
export const OPENWA_SESSION_HEALTH_WAKE_ACTOR_ID = "openwa:session-health";
|
|
@@ -29,26 +30,39 @@ function healthComment(facts) {
|
|
|
29
30
|
(restriction?.expiresAt ? " until " + restriction.expiresAt : "") +
|
|
30
31
|
".");
|
|
31
32
|
}
|
|
32
|
-
/** Owner approval chat of the endpoint: self-chat in owner_number mode, else the most recent active owner DM. */
|
|
33
|
+
/** Owner approval chat of the endpoint: self-chat in owner_number mode, else the most recent active owner DM (phone or LID). */
|
|
33
34
|
export async function openwaOwnerApprovalConversation(tx, endpoint, input) {
|
|
34
35
|
if (!endpoint.assignedAgentId)
|
|
35
36
|
return null;
|
|
36
37
|
const policy = openwaEndpointPolicySchema.parse(endpoint.policy ?? {});
|
|
38
|
+
const owners = (await openwaCurrentOwners(tx, endpoint)).filter((owner) => !input.onlyUserId || owner.userId === input.onlyUserId);
|
|
39
|
+
if (input.onlyUserId && owners.length === 0)
|
|
40
|
+
return null;
|
|
37
41
|
const chatKeys = policy.numberMode === "owner_number"
|
|
38
42
|
? [input.selfChatKey]
|
|
39
43
|
: [
|
|
40
|
-
...new Set(
|
|
44
|
+
...new Set(owners.flatMap((owner) => [
|
|
45
|
+
...(owner.digits ? [owner.digits + "@c.us"] : []),
|
|
46
|
+
...owner.jids.filter((jid) => jid.endsWith("@lid")).map(openwaChatKey),
|
|
47
|
+
])),
|
|
41
48
|
];
|
|
42
49
|
if (!chatKeys.length)
|
|
43
50
|
return null;
|
|
44
51
|
const [row] = await tx
|
|
45
|
-
.select({ conversationId: chatConversations.id, issueId: issues.id })
|
|
52
|
+
.select({ conversationId: chatConversations.id, issueId: issues.id, externalConversationId: chatConversations.externalConversationId })
|
|
46
53
|
.from(chatConversations)
|
|
47
54
|
.innerJoin(issues, and(eq(issues.companyId, chatConversations.companyId), eq(issues.id, chatConversations.issueId)))
|
|
48
55
|
.where(and(eq(chatConversations.companyId, endpoint.companyId), eq(chatConversations.endpointId, endpoint.id), inArray(chatConversations.externalConversationId, chatKeys.map((chatKey) => "openwa:" + input.sessionId + ":" + chatKey)), inArray(chatConversations.state, ["active", "waiting"]), eq(issues.assigneeAgentId, endpoint.assignedAgentId), notInArray(issues.status, INELIGIBLE_ISSUE_STATUSES)))
|
|
49
56
|
.orderBy(sql `${chatConversations.lastActivityAt} desc nulls last`, desc(chatConversations.createdAt))
|
|
50
57
|
.limit(1);
|
|
51
|
-
|
|
58
|
+
if (!row)
|
|
59
|
+
return null;
|
|
60
|
+
return {
|
|
61
|
+
conversationId: row.conversationId,
|
|
62
|
+
issueId: row.issueId,
|
|
63
|
+
agentId: endpoint.assignedAgentId,
|
|
64
|
+
chatKey: row.externalConversationId.slice(("openwa:" + input.sessionId + ":").length),
|
|
65
|
+
};
|
|
52
66
|
}
|
|
53
67
|
/** Writes the system comment and queued wake action for one session health transition inside its transaction. */
|
|
54
68
|
export async function stageOpenwaSessionHealthWake(tx, endpoint, input) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-health.js","sourceRoot":"","sources":["../../../src/services/openwa/session-health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,EAAW,MAAM,8BAA8B,CAAC;AAC9G,OAAO,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACpD,OAAO,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAKlD,MAAM,CAAC,MAAM,sCAAsC,GAAG,8BAA8B,CAAC;AACrF,MAAM,CAAC,MAAM,mCAAmC,GAAG,uBAAuB,CAAC;AAC3E,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAC5B,MAAM,wBAAwB,GAAG,CAAC,GAAG,MAAM,CAAC;AAC5C,MAAM,yBAAyB,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;AAanE,SAAS,MAAM,CAAC,KAAc;IAC5B,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAE,KAAiC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/G,CAAC;AAED,SAAS,aAAa,CAAC,KAA+B;IACpD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;QACzB,OAAO,KAAK,CAAC,OAAO;YAClB,CAAC,CAAC,qEAAqE;YACvE,CAAC,CAAC,yDAAyD,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,WAAW,CAAC,GAAG,GAAG,CAAC;IACtG,IAAI,KAAK,CAAC,OAAO;QAAE,OAAO,oFAAoF,CAAC;IAC/G,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;IACtC,OAAO,CACL,gEAAgE;QAChE,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,WAAW,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,GAAG,CACJ,CAAC;AACJ,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"session-health.js","sourceRoot":"","sources":["../../../src/services/openwa/session-health.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Request, RequestHandler } from "express";
|
|
2
2
|
import { type Db } from "@tickernelz/paperclip-pro-db";
|
|
3
|
-
import type { AnswerDecisionForOwner, IssueThreadInteractionOwnerRelay, IssueThreadInteractionOwnerRelayChannel, PendingDecision } from "@tickernelz/paperclip-pro-shared";
|
|
3
|
+
import type { AnswerDecisionForOwner, AttentionItem, IssueThreadInteractionOwnerRelay, IssueThreadInteractionOwnerRelayChannel, PendingDecision } from "@tickernelz/paperclip-pro-shared";
|
|
4
4
|
export declare const OWNER_CONFIRMATION_REQUIRED_CODE = "owner_confirmation_required";
|
|
5
5
|
export interface OwnerRelayAuthority {
|
|
6
6
|
channel: IssueThreadInteractionOwnerRelayChannel;
|
|
@@ -60,10 +60,20 @@ export declare function dispatchAsOwner(handle: RequestHandler, req: Request, in
|
|
|
60
60
|
status: number;
|
|
61
61
|
body: unknown;
|
|
62
62
|
}>;
|
|
63
|
+
/** Prompt, options and questions of a card as the owner sees them. */
|
|
64
|
+
export declare function pendingDecisionCardShape(kind: string, payload: Record<string, unknown>): Pick<PendingDecision, "prompt" | "options" | "questions">;
|
|
65
|
+
export declare function isOpenAttentionItem(item: AttentionItem, now: number): boolean;
|
|
66
|
+
export declare function relayStateByItem(db: Db, companyId: string, items: AttentionItem[]): Promise<Map<string, {
|
|
67
|
+
relayable: boolean;
|
|
68
|
+
relayBlockedReason: string | null;
|
|
69
|
+
}>>;
|
|
63
70
|
export declare function listPendingDecisions(db: Db, input: {
|
|
64
71
|
companyId: string;
|
|
65
72
|
actor: Request["actor"];
|
|
66
73
|
userId: string | null;
|
|
67
|
-
}): Promise<
|
|
74
|
+
}): Promise<{
|
|
75
|
+
items: PendingDecision[];
|
|
76
|
+
omittedCount: number;
|
|
77
|
+
}>;
|
|
68
78
|
export {};
|
|
69
79
|
//# sourceMappingURL=owner-decision-relay.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"owner-decision-relay.d.ts","sourceRoot":"","sources":["../../src/services/owner-decision-relay.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAY,MAAM,SAAS,CAAC;AACjE,OAAO,EAWL,KAAK,EAAE,EACR,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EACV,sBAAsB,
|
|
1
|
+
{"version":3,"file":"owner-decision-relay.d.ts","sourceRoot":"","sources":["../../src/services/owner-decision-relay.ts"],"names":[],"mappings":"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"}
|