crewly 1.20.460 → 1.20.461
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/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +29 -0
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision-card.d.ts +15 -1
- package/dist/backend/backend/src/services/decisions/decision-card.d.ts.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision-card.js +20 -4
- package/dist/backend/backend/src/services/decisions/decision-card.js.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.service.d.ts +2 -0
- package/dist/backend/backend/src/services/decisions/decision.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.service.js +5 -4
- package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -1
- package/dist/backend/backend/src/services/orc/private-share-decisions.d.ts +139 -0
- package/dist/backend/backend/src/services/orc/private-share-decisions.d.ts.map +1 -0
- package/dist/backend/backend/src/services/orc/private-share-decisions.js +200 -0
- package/dist/backend/backend/src/services/orc/private-share-decisions.js.map +1 -0
- package/dist/backend/backend/src/services/orc/reply-audience.d.ts +4 -0
- package/dist/backend/backend/src/services/orc/reply-audience.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/reply-audience.js +19 -1
- package/dist/backend/backend/src/services/orc/reply-audience.js.map +1 -1
- package/dist/backend/backend/src/services/orc/reply-destination.wiring.d.ts +18 -0
- package/dist/backend/backend/src/services/orc/reply-destination.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/reply-destination.wiring.js +30 -1
- package/dist/backend/backend/src/services/orc/reply-destination.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/v3/owner-receipt/owner-pulls-weekly.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/owner-receipt/owner-pulls-weekly.js +1 -0
- package/dist/backend/backend/src/services/v3/owner-receipt/owner-pulls-weekly.js.map +1 -1
- package/dist/backend/backend/src/types/decision.types.d.ts +26 -1
- package/dist/backend/backend/src/types/decision.types.d.ts.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/services/decisions/decision-card.d.ts +15 -1
- package/dist/cli/backend/src/services/decisions/decision-card.d.ts.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision-card.js +20 -4
- package/dist/cli/backend/src/services/decisions/decision-card.js.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision.service.d.ts +2 -0
- package/dist/cli/backend/src/services/decisions/decision.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision.service.js +5 -4
- package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -1
- package/dist/cli/backend/src/types/decision.types.d.ts +26 -1
- package/dist/cli/backend/src/types/decision.types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Private-share decisions (crewly#969, specs/per-person-access.md).
|
|
3
|
+
*
|
|
4
|
+
* When the audience check moves an agent's reply from a shared place to the
|
|
5
|
+
* owner's DM (it draws on someone's private data), the owner gets a card
|
|
6
|
+
* under it: *Share in #room?* — Share / Keep private. A tap on Share posts
|
|
7
|
+
* the reply where it was going, as written, and logs the share; anything
|
|
8
|
+
* else leaves it in the DM. The default, applied unanswered after a day, is
|
|
9
|
+
* Keep private.
|
|
10
|
+
*
|
|
11
|
+
* The post happens in exactly one place, {@link PrivateShareDecisions.onSettled},
|
|
12
|
+
* which the decision service calls when the card settles. Nothing an agent
|
|
13
|
+
* can call reaches it, so an agent cannot share its own held reply (the
|
|
14
|
+
* owner's word in the DM plus `reply --share` remains the other way).
|
|
15
|
+
*
|
|
16
|
+
* @module services/orc/private-share-decisions
|
|
17
|
+
*/
|
|
18
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
19
|
+
import { recordActivity } from '../activity/activity-log.service.js';
|
|
20
|
+
import { PRIVATE_REPLY_ACTIONS } from './reply-audience.js';
|
|
21
|
+
import { stripTraceMarkers } from '../trace/trace-markers.js';
|
|
22
|
+
/** Option keys on the card. */
|
|
23
|
+
export const PRIVATE_SHARE_KEYS = { SHARE: 'share', KEEP: 'keep' };
|
|
24
|
+
/** How long the card waits before the (safe) default, Keep private, applies. */
|
|
25
|
+
export const PRIVATE_SHARE_DEADLINE_MS = 24 * 60 * 60 * 1000;
|
|
26
|
+
/** Reply characters quoted on the card. */
|
|
27
|
+
const PREVIEW_CHARS = 400;
|
|
28
|
+
/**
|
|
29
|
+
* Who acted on the card for the activity log: the owner when they answered
|
|
30
|
+
* and how; a deadline outcome is the system.
|
|
31
|
+
*
|
|
32
|
+
* @param decision - Settled decision
|
|
33
|
+
* @returns Actor
|
|
34
|
+
*/
|
|
35
|
+
function decisionActor(decision) {
|
|
36
|
+
if (decision.answeredVia === 'deadline' || decision.status === 'expired' || decision.status === 'defaulted')
|
|
37
|
+
return { type: 'system', via: 'deadline' };
|
|
38
|
+
return { type: 'owner', ...(decision.answeredBy ? { id: decision.answeredBy } : {}), ...(decision.answeredVia ? { via: decision.answeredVia } : {}) };
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Names for a list of person ids ("Alice and Bob").
|
|
42
|
+
*
|
|
43
|
+
* @param people - Person ids
|
|
44
|
+
* @param name - Lookup
|
|
45
|
+
* @returns Names joined for a sentence
|
|
46
|
+
*/
|
|
47
|
+
function namesOf(people, name) {
|
|
48
|
+
const names = people.map((p) => name?.(p) || p);
|
|
49
|
+
if (names.length <= 1)
|
|
50
|
+
return names.join('');
|
|
51
|
+
return `${names.slice(0, -1).join(', ')} and ${names[names.length - 1]}`;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Raises the share card for a held reply and applies the owner's answer.
|
|
55
|
+
*/
|
|
56
|
+
export class PrivateShareDecisions {
|
|
57
|
+
deps;
|
|
58
|
+
logger;
|
|
59
|
+
constructor(deps) {
|
|
60
|
+
this.deps = deps;
|
|
61
|
+
this.logger = LoggerService.getInstance().createComponentLogger('PrivateShareDecisions');
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Whether a card would go up for a held reply right now (the DM copy's
|
|
65
|
+
* note can then point at it).
|
|
66
|
+
*
|
|
67
|
+
* @returns True when the decision service is up and Slack is connected
|
|
68
|
+
*/
|
|
69
|
+
offersCard() {
|
|
70
|
+
try {
|
|
71
|
+
return !!this.deps.decisions() && this.deps.canAsk();
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* A reply was moved to the owner DM: ask the owner, in that DM, whether to
|
|
79
|
+
* post it where it was going. One open card per agent + place + text.
|
|
80
|
+
*
|
|
81
|
+
* @param held - The held reply
|
|
82
|
+
* @returns The card's decision, or null when none was raised
|
|
83
|
+
*/
|
|
84
|
+
async onHeld(held) {
|
|
85
|
+
const decisions = this.deps.decisions();
|
|
86
|
+
if (!decisions || !this.deps.canAsk())
|
|
87
|
+
return null;
|
|
88
|
+
const open = await decisions.list('open').catch(() => []);
|
|
89
|
+
const same = open.find((d) => d.kind === 'private_share' && d.privateShare?.agentSession === held.session && d.privateShare.heldFrom === held.heldFrom && d.privateShare.content === held.content);
|
|
90
|
+
if (same) {
|
|
91
|
+
this.logger.info('Held reply asked again while its card is open — reusing it', { decisionId: same.id, session: held.session });
|
|
92
|
+
return same;
|
|
93
|
+
}
|
|
94
|
+
const agentName = (await this.deps.agentNameOf?.(held.session).catch(() => undefined)) ?? held.session;
|
|
95
|
+
const who = namesOf(held.people, this.deps.personName);
|
|
96
|
+
const slackDm = this.deps.slackChannelOf(held.ownerDm);
|
|
97
|
+
const shown = stripTraceMarkers(held.content).trim();
|
|
98
|
+
const preview = shown.length > PREVIEW_CHARS ? `${shown.slice(0, PREVIEW_CHARS)}…` : shown;
|
|
99
|
+
const decision = await decisions.askPrebuilt({
|
|
100
|
+
kind: 'private_share',
|
|
101
|
+
asker: held.session,
|
|
102
|
+
question: `Share ${agentName}'s reply in ${held.heldFrom}? It draws on ${who}'s data, which only you and they may see.`,
|
|
103
|
+
options: [
|
|
104
|
+
{ key: PRIVATE_SHARE_KEYS.SHARE, label: 'Share', detail: `post it in ${held.heldFrom} as written, once` },
|
|
105
|
+
{ key: PRIVATE_SHARE_KEYS.KEEP, label: 'Keep private', detail: 'it stays here in your DM' },
|
|
106
|
+
],
|
|
107
|
+
defaultKey: PRIVATE_SHARE_KEYS.KEEP,
|
|
108
|
+
yesKey: PRIVATE_SHARE_KEYS.SHARE,
|
|
109
|
+
deadline: new Date((this.deps.now?.() ?? Date.now()) + PRIVATE_SHARE_DEADLINE_MS),
|
|
110
|
+
title: 'Private data',
|
|
111
|
+
body: [`> ${preview.replace(/\n/g, '\n> ')}`],
|
|
112
|
+
...(slackDm ? { place: { slackChannelId: slackDm } } : {}),
|
|
113
|
+
privateShare: {
|
|
114
|
+
agentSession: held.session,
|
|
115
|
+
agentName,
|
|
116
|
+
content: held.content,
|
|
117
|
+
destination: held.destination,
|
|
118
|
+
heldFrom: held.heldFrom,
|
|
119
|
+
people: held.people,
|
|
120
|
+
ownerDm: held.ownerDm,
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
this.logger.info('Asked the owner whether to share a held reply', { decisionId: decision.id, session: held.session, heldFrom: held.heldFrom });
|
|
124
|
+
return decision;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* A `private_share` card settled. The only place a held reply is posted
|
|
128
|
+
* from a card.
|
|
129
|
+
*
|
|
130
|
+
* @param decision - The settled decision
|
|
131
|
+
* @returns Note for the agent, or null (a quiet default wakes nobody)
|
|
132
|
+
*/
|
|
133
|
+
async onSettled(decision) {
|
|
134
|
+
const subject = decision.privateShare;
|
|
135
|
+
if (!subject)
|
|
136
|
+
return null;
|
|
137
|
+
const shareChosen = decision.status === 'resolved' && decision.chosenKey === PRIVATE_SHARE_KEYS.SHARE;
|
|
138
|
+
const record = this.deps.record ?? recordActivity;
|
|
139
|
+
if (!shareChosen) {
|
|
140
|
+
this.logger.info('Held reply kept private', { decisionId: decision.id, status: decision.status });
|
|
141
|
+
if (decision.status !== 'resolved')
|
|
142
|
+
return null;
|
|
143
|
+
record({
|
|
144
|
+
actor: decisionActor(decision),
|
|
145
|
+
action: PRIVATE_REPLY_ACTIONS.KEPT,
|
|
146
|
+
target: { type: 'conversation', id: subject.ownerDm },
|
|
147
|
+
after: { people: subject.people, heldFrom: subject.heldFrom, decisionId: decision.id },
|
|
148
|
+
note: `the owner kept ${subject.agentSession}'s reply held from ${subject.heldFrom} private`,
|
|
149
|
+
});
|
|
150
|
+
return `[PRIVATE] The owner kept your reply held from ${subject.heldFrom} in their DM. Do not post it there another way.`;
|
|
151
|
+
}
|
|
152
|
+
const held = {
|
|
153
|
+
session: subject.agentSession,
|
|
154
|
+
content: subject.content,
|
|
155
|
+
destination: subject.destination,
|
|
156
|
+
heldFrom: subject.heldFrom,
|
|
157
|
+
people: subject.people,
|
|
158
|
+
ownerDm: subject.ownerDm,
|
|
159
|
+
};
|
|
160
|
+
let posted;
|
|
161
|
+
try {
|
|
162
|
+
posted = await this.deps.post(held);
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
posted = { ok: false, error: err instanceof Error ? err.message : String(err) };
|
|
166
|
+
}
|
|
167
|
+
if (!posted.ok) {
|
|
168
|
+
this.logger.warn('Owner tapped Share but the held reply could not be posted', { decisionId: decision.id, error: posted.error });
|
|
169
|
+
return `[PRIVATE] The owner tapped Share on your reply held from ${subject.heldFrom}, but it could not be posted there: ${posted.error}. Tell the owner in your DM.`;
|
|
170
|
+
}
|
|
171
|
+
record({
|
|
172
|
+
actor: decisionActor(decision),
|
|
173
|
+
action: PRIVATE_REPLY_ACTIONS.SHARED,
|
|
174
|
+
target: held.destination.kind === 'conversation' ? { type: 'conversation', id: held.destination.conversationId } : { type: 'reply', id: subject.agentSession },
|
|
175
|
+
after: { people: subject.people, sharedTo: posted.place, decisionId: decision.id },
|
|
176
|
+
note: `the owner shared ${subject.agentSession}'s reply drawing on ${namesOf(subject.people, this.deps.personName)}'s data in ${posted.place} from the card`,
|
|
177
|
+
});
|
|
178
|
+
this.logger.info('Held reply shared from the card', { decisionId: decision.id, session: subject.agentSession, place: posted.place });
|
|
179
|
+
return `[PRIVATE] The owner shared your reply held from ${subject.heldFrom}; it is posted there now. Nothing more to send.`;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
let instance = null;
|
|
183
|
+
/**
|
|
184
|
+
* The private-share handler the composition root registered, or null.
|
|
185
|
+
*
|
|
186
|
+
* @returns Handler or null
|
|
187
|
+
*/
|
|
188
|
+
export function getPrivateShareDecisions() {
|
|
189
|
+
return instance;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Register (or clear, with null) the private-share handler the reply
|
|
193
|
+
* delivery raises cards through.
|
|
194
|
+
*
|
|
195
|
+
* @param handler - Handler or null
|
|
196
|
+
*/
|
|
197
|
+
export function setPrivateShareDecisions(handler) {
|
|
198
|
+
instance = handler;
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=private-share-decisions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"private-share-decisions.js","sourceRoot":"","sources":["../../../../../../backend/src/services/orc/private-share-decisions.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,6 +24,8 @@ export declare const PRIVATE_REPLY_ACTIONS: {
|
|
|
24
24
|
readonly HELD: "connector.private_output.held";
|
|
25
25
|
/** The owner said to share it: posted to the shared place with `--share` */
|
|
26
26
|
readonly SHARED: "connector.private_output.shared";
|
|
27
|
+
/** The owner kept a held reply in their DM (the card's Keep private) */
|
|
28
|
+
readonly KEPT: "connector.private_output.kept";
|
|
27
29
|
};
|
|
28
30
|
/** What the check needs to know. */
|
|
29
31
|
export interface ReplyAudienceDeps {
|
|
@@ -41,6 +43,8 @@ export interface ReplyAudienceDeps {
|
|
|
41
43
|
conversationPlace?(conversationId: string): string | null;
|
|
42
44
|
/** Activity-log writer (default: the real one) */
|
|
43
45
|
record?(input: ActivityEntryInput): void;
|
|
46
|
+
/** Whether a Share / Keep private card follows the DM copy (the note then points at it) */
|
|
47
|
+
offersCard?(): boolean;
|
|
44
48
|
}
|
|
45
49
|
/** The check's verdict. */
|
|
46
50
|
export type ReplyAudienceVerdict =
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reply-audience.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/orc/reply-audience.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAkB,KAAK,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAE9F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAExE,iDAAiD;AACjD,eAAO,MAAM,qBAAqB;IAChC,0CAA0C;;IAE1C,oDAAoD;;IAEpD,4EAA4E;;
|
|
1
|
+
{"version":3,"file":"reply-audience.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/orc/reply-audience.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAkB,KAAK,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAE9F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAExE,iDAAiD;AACjD,eAAO,MAAM,qBAAqB;IAChC,0CAA0C;;IAE1C,oDAAoD;;IAEpD,4EAA4E;;IAE5E,wEAAwE;;CAEhE,CAAC;AAEX,oCAAoC;AACpC,MAAM,WAAW,iBAAiB;IAChC,kFAAkF;IAClF,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACxC,oFAAoF;IACpF,gBAAgB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,QAAQ,GAAG,SAAS,CAAC;IACtE,2FAA2F;IAC3F,cAAc,CAAC,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACvD,iDAAiD;IACjD,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACjD,8BAA8B;IAC9B,UAAU,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC5C,6DAA6D;IAC7D,iBAAiB,CAAC,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC1D,kDAAkD;IAClD,MAAM,CAAC,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACzC,2FAA2F;IAC3F,UAAU,CAAC,IAAI,OAAO,CAAC;CACxB;AAED,2BAA2B;AAC3B,MAAM,MAAM,oBAAoB;AAC9B,4DAA4D;AAC1D;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE;AAClB,+EAA+E;GAC7E;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,WAAW,EAAE,OAAO,CAAC,gBAAgB,EAAE;QAAE,IAAI,EAAE,cAAc,CAAA;KAAE,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE;AAC1I,qFAAqF;GACnF;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtF;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,gBAAgB,EAAE;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAYvH;AA+BD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,iBAAiB,EAAE,cAAc,CAAC,GAAG,MAAM,EAAE,CAMxG;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,gBAAgB,EAAE;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,GAAG,MAAM,EAAE,CAY9I;AAgBD;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,OAAO,CAAC,gBAAgB,EAAE;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC,EACvD,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,oBAAoB,CAAC,CA8C/B"}
|
|
@@ -25,6 +25,8 @@ export const PRIVATE_REPLY_ACTIONS = {
|
|
|
25
25
|
HELD: 'connector.private_output.held',
|
|
26
26
|
/** The owner said to share it: posted to the shared place with `--share` */
|
|
27
27
|
SHARED: 'connector.private_output.shared',
|
|
28
|
+
/** The owner kept a held reply in their DM (the card's Keep private) */
|
|
29
|
+
KEPT: 'connector.private_output.kept',
|
|
28
30
|
};
|
|
29
31
|
/**
|
|
30
32
|
* Whether a resolved destination is a place other people can read.
|
|
@@ -120,6 +122,20 @@ export function recordPrivateShare(session, dest, deps) {
|
|
|
120
122
|
});
|
|
121
123
|
return people;
|
|
122
124
|
}
|
|
125
|
+
/**
|
|
126
|
+
* Whether a share card follows the DM copy (never throws).
|
|
127
|
+
*
|
|
128
|
+
* @param deps - Lookups
|
|
129
|
+
* @returns True when the card is offered
|
|
130
|
+
*/
|
|
131
|
+
function offersCard(deps) {
|
|
132
|
+
try {
|
|
133
|
+
return deps.offersCard?.() === true;
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
123
139
|
/**
|
|
124
140
|
* Check whether a reply may go where the resolver sent it.
|
|
125
141
|
*
|
|
@@ -169,7 +185,9 @@ export async function checkReplyAudience(session, dest, deps) {
|
|
|
169
185
|
source: 'owner-dm',
|
|
170
186
|
reason: `held from ${heldFrom}: it draws on ${who}'s data`,
|
|
171
187
|
},
|
|
172
|
-
note:
|
|
188
|
+
note: offersCard(deps)
|
|
189
|
+
? `_Held from ${heldFrom}: this draws on ${who}'s data, which only you and they may see. Tap *Share* on the card below, or say "share it" here, and I will post it there._`
|
|
190
|
+
: `_Held from ${heldFrom}: this draws on ${who}'s data, which only you and they may see. Say "share it" here and I will post it there._`,
|
|
173
191
|
people,
|
|
174
192
|
heldFrom,
|
|
175
193
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reply-audience.js","sourceRoot":"","sources":["../../../../../../backend/src/services/orc/reply-audience.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,cAAc,EAA2B,MAAM,qCAAqC,CAAC;AAC9F,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAGzD,iDAAiD;AACjD,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,0CAA0C;IAC1C,UAAU,EAAE,qCAAqC;IACjD,oDAAoD;IACpD,IAAI,EAAE,+BAA+B;IACrC,4EAA4E;IAC5E,MAAM,EAAE,iCAAiC;
|
|
1
|
+
{"version":3,"file":"reply-audience.js","sourceRoot":"","sources":["../../../../../../backend/src/services/orc/reply-audience.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,7 @@ import { type WorkDestinationDeps } from './work-item-destination.wiring.js';
|
|
|
12
12
|
import { type MessageRoute, type RouteCheckOutcome } from './message-route.js';
|
|
13
13
|
import { type TurnTrigger } from '../trace/turn-trigger.js';
|
|
14
14
|
import { type ReplyAudienceDeps } from './reply-audience.js';
|
|
15
|
+
import { type HeldReply, type HeldReplyPost } from './private-share-decisions.js';
|
|
15
16
|
/** Forget recent deliveries (tests). */
|
|
16
17
|
export declare function resetReplyDeliveryGuardForTesting(): void;
|
|
17
18
|
/** Delivery into a chat-v2 conversation (chat.controller `deliverAgentReplyToConversation`). */
|
|
@@ -93,6 +94,12 @@ export interface ReplyDeliveryDeps {
|
|
|
93
94
|
* place. Omitted: no check.
|
|
94
95
|
*/
|
|
95
96
|
audience?: ReplyAudienceDeps;
|
|
97
|
+
/**
|
|
98
|
+
* A reply was moved to the owner DM: raise the Share / Keep private card
|
|
99
|
+
* under it (crewly#969). Called after the DM copy landed; a failure is
|
|
100
|
+
* logged, the DM copy stands.
|
|
101
|
+
*/
|
|
102
|
+
privateShareCard?: (held: HeldReply) => Promise<unknown>;
|
|
96
103
|
}
|
|
97
104
|
/** What a delivery did. */
|
|
98
105
|
export type ReplyDelivery = {
|
|
@@ -234,6 +241,17 @@ export declare function notDelivered(why: string, fix: string): string;
|
|
|
234
241
|
* @returns Deps
|
|
235
242
|
*/
|
|
236
243
|
export declare function defaultReplyDeliveryDeps(): Promise<ReplyDeliveryDeps>;
|
|
244
|
+
/**
|
|
245
|
+
* Post a reply the audience check held, where it was going, as written: the
|
|
246
|
+
* owner tapped Share on its card (crewly#969). The audience check is not run
|
|
247
|
+
* again (the owner's tap is the approval); the share itself is logged by the
|
|
248
|
+
* card handler.
|
|
249
|
+
*
|
|
250
|
+
* @param held - The held reply
|
|
251
|
+
* @param deps - Delivery deps (default: the real ones)
|
|
252
|
+
* @returns What happened
|
|
253
|
+
*/
|
|
254
|
+
export declare function postHeldReply(held: HeldReply, deps?: ReplyDeliveryDeps): Promise<HeldReplyPost>;
|
|
237
255
|
/** The chat-v2 lookups {@link chatConversationPlace} and {@link ownerWroteInThreadRecently} use. */
|
|
238
256
|
interface ChatChannelLookup {
|
|
239
257
|
getChannelForBridge(id: string): {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reply-destination.wiring.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/orc/reply-destination.wiring.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,UAAU,EACf,KAAK,cAAc,EAEnB,KAAK,iBAAiB,EACvB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAA8B,KAAK,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAC7G,OAAO,EAAwD,KAAK,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAEnI,OAAO,EAAuD,KAAK,YAAY,EAAkB,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAKpJ,OAAO,EAAyB,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAInF,OAAO,EAA0C,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"reply-destination.wiring.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/orc/reply-destination.wiring.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,6 +26,7 @@ import { triggeredByMetadata, triggeredByPhrase, withTriggeredByLine } from './t
|
|
|
26
26
|
import { stripOwnerTextIds } from '../../utils/owner-text-ids.utils.js';
|
|
27
27
|
import { memberNameFromSession } from '../../utils/member-session-name.utils.js';
|
|
28
28
|
import { checkReplyAudience, recordPrivateShare } from './reply-audience.js';
|
|
29
|
+
import { getPrivateShareDecisions } from './private-share-decisions.js';
|
|
29
30
|
/** How long an identical reply from one agent counts as a duplicate send. */
|
|
30
31
|
const REPLY_DUPLICATE_WINDOW_MS = 120_000;
|
|
31
32
|
/** Deliveries that landed recently, by agent + text hash. */
|
|
@@ -185,6 +186,7 @@ async function deliverReplyUntraced(input, deps) {
|
|
|
185
186
|
// crewly#969: what the agent read through a person's grant is that person's
|
|
186
187
|
// data; a reply drawing on it does not go where other people read.
|
|
187
188
|
let heldFrom;
|
|
189
|
+
let held;
|
|
188
190
|
if (d.audience) {
|
|
189
191
|
const audience = { ...d.audience, ...(d.conversationPlace ? { conversationPlace: d.conversationPlace } : {}) };
|
|
190
192
|
const shared = input.share === true && (await ownerSaidShare(input.session, d)) ? recordPrivateShare(input.session, dest, audience) : [];
|
|
@@ -202,6 +204,7 @@ async function deliverReplyUntraced(input, deps) {
|
|
|
202
204
|
}
|
|
203
205
|
if (verdict.kind === 'redirect') {
|
|
204
206
|
logger.info('Agent reply moved to the owner DM: it draws on private data', { session: input.session, heldFrom: verdict.heldFrom, people: verdict.people });
|
|
207
|
+
held = { session: input.session, content: input.content, destination: dest, heldFrom: verdict.heldFrom, people: verdict.people, ownerDm: verdict.destination.conversationId };
|
|
205
208
|
dest = verdict.destination;
|
|
206
209
|
heldFrom = verdict.heldFrom;
|
|
207
210
|
input = { ...input, content: `${verdict.note}\n\n${input.content}` };
|
|
@@ -209,8 +212,13 @@ async function deliverReplyUntraced(input, deps) {
|
|
|
209
212
|
}
|
|
210
213
|
}
|
|
211
214
|
let result = await attempt(input, dest, prompt, d);
|
|
212
|
-
if (result.ok && heldFrom)
|
|
215
|
+
if (result.ok && heldFrom) {
|
|
213
216
|
result = { ...result, heldFrom };
|
|
217
|
+
if (held && d.privateShareCard) {
|
|
218
|
+
const card = held;
|
|
219
|
+
void d.privateShareCard(card).catch((err) => logger.warn('Share card not raised for a held reply', { session: card.session, heldFrom: card.heldFrom, error: err instanceof Error ? err.message : String(err) }));
|
|
220
|
+
}
|
|
221
|
+
}
|
|
214
222
|
if (result.ok || ('held' in result && result.held))
|
|
215
223
|
return result;
|
|
216
224
|
// Work handed over from the owner's DM with another agent (a lead's
|
|
@@ -946,8 +954,28 @@ export async function defaultReplyDeliveryDeps() {
|
|
|
946
954
|
currentTrace: (session) => getTraceContext().currentTrace(session),
|
|
947
955
|
conversationPlace: (id) => chatConversationPlace(chatLookup, id),
|
|
948
956
|
audience: await defaultAudienceDeps(resolver, chatLookup),
|
|
957
|
+
privateShareCard: (held) => getPrivateShareDecisions()?.onHeld(held) ?? Promise.resolve(null),
|
|
949
958
|
};
|
|
950
959
|
}
|
|
960
|
+
/**
|
|
961
|
+
* Post a reply the audience check held, where it was going, as written: the
|
|
962
|
+
* owner tapped Share on its card (crewly#969). The audience check is not run
|
|
963
|
+
* again (the owner's tap is the approval); the share itself is logged by the
|
|
964
|
+
* card handler.
|
|
965
|
+
*
|
|
966
|
+
* @param held - The held reply
|
|
967
|
+
* @param deps - Delivery deps (default: the real ones)
|
|
968
|
+
* @returns What happened
|
|
969
|
+
*/
|
|
970
|
+
export async function postHeldReply(held, deps) {
|
|
971
|
+
const d = deps ?? (await defaultReplyDeliveryDeps());
|
|
972
|
+
const place = (held.destination.kind === 'conversation' ? d.conversationPlace?.(held.destination.conversationId) : null) ?? held.heldFrom;
|
|
973
|
+
const result = await attempt({ session: held.session, content: held.content }, held.destination, undefined, d);
|
|
974
|
+
if (!result.ok)
|
|
975
|
+
return { ok: false, error: result.error };
|
|
976
|
+
logger.info('Held reply posted where it was going: the owner tapped Share', { session: held.session, place });
|
|
977
|
+
return { ok: true, place };
|
|
978
|
+
}
|
|
951
979
|
/**
|
|
952
980
|
* Whether the owner wrote to the agent in its owner DM recently — the
|
|
953
981
|
* approval `reply --share` stands on (crewly#969).
|
|
@@ -988,6 +1016,7 @@ async function defaultAudienceDeps(resolver, chatLookup) {
|
|
|
988
1016
|
},
|
|
989
1017
|
slackChannelOf: (id) => resolver.slackChannelOfConversation(id),
|
|
990
1018
|
ownerDm: (session) => resolver.ownerDm(session),
|
|
1019
|
+
offersCard: () => getPrivateShareDecisions()?.offersCard() ?? false,
|
|
991
1020
|
personName: (id) => {
|
|
992
1021
|
try {
|
|
993
1022
|
return getPeopleDirectory().get(id)?.name ?? undefined;
|