crewly 1.20.188 → 1.20.190

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.
Files changed (140) hide show
  1. package/config/skills/agent/core/attach-file/execute.sh +13 -4
  2. package/config/skills/agent/core/complete-task/execute.sh +3 -0
  3. package/config/skills/agent/core/reply/SKILL.md +32 -4
  4. package/config/skills/agent/core/reply/execute.sh +23 -1
  5. package/config/skills/agent/core/reply/execute.test.sh +9 -0
  6. package/config/skills/agent/core/reply-chat/SKILL.md +9 -2
  7. package/config/skills/agent/core/reply-chat/execute.sh +13 -1
  8. package/config/skills/agent/core/report-status/execute.sh +5 -0
  9. package/config/skills/agent/core/send-chat-response/execute.sh +1 -1
  10. package/dist/backend/backend/src/constants.d.ts +23 -0
  11. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  12. package/dist/backend/backend/src/constants.js +27 -1
  13. package/dist/backend/backend/src/constants.js.map +1 -1
  14. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.d.ts +14 -1
  15. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.d.ts.map +1 -1
  16. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js +66 -78
  17. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js.map +1 -1
  18. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts +12 -0
  19. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
  20. package/dist/backend/backend/src/controllers/chat/chat.controller.js +148 -24
  21. package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
  22. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts.map +1 -1
  23. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js +62 -0
  24. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js.map +1 -1
  25. package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
  26. package/dist/backend/backend/src/controllers/slack/slack.controller.js +120 -35
  27. package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
  28. package/dist/backend/backend/src/scripts/repair-orphan-superseded-decisions.d.ts +56 -0
  29. package/dist/backend/backend/src/scripts/repair-orphan-superseded-decisions.d.ts.map +1 -0
  30. package/dist/backend/backend/src/scripts/repair-orphan-superseded-decisions.js +114 -0
  31. package/dist/backend/backend/src/scripts/repair-orphan-superseded-decisions.js.map +1 -0
  32. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts +7 -0
  33. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
  34. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js +9 -0
  35. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
  36. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts +7 -0
  37. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
  38. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js +19 -0
  39. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
  40. package/dist/backend/backend/src/services/decisions/decision.service.d.ts +4 -1
  41. package/dist/backend/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  42. package/dist/backend/backend/src/services/decisions/decision.service.js +10 -3
  43. package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -1
  44. package/dist/backend/backend/src/services/memory/project-memory.service.d.ts.map +1 -1
  45. package/dist/backend/backend/src/services/memory/project-memory.service.js +21 -10
  46. package/dist/backend/backend/src/services/memory/project-memory.service.js.map +1 -1
  47. package/dist/backend/backend/src/services/open-items/open-items.service.d.ts +29 -0
  48. package/dist/backend/backend/src/services/open-items/open-items.service.d.ts.map +1 -1
  49. package/dist/backend/backend/src/services/open-items/open-items.service.js +92 -8
  50. package/dist/backend/backend/src/services/open-items/open-items.service.js.map +1 -1
  51. package/dist/backend/backend/src/services/open-items/open-items.wiring.js +2 -2
  52. package/dist/backend/backend/src/services/open-items/open-items.wiring.js.map +1 -1
  53. package/dist/backend/backend/src/services/orc/agent-prompt-reference.service.d.ts +81 -0
  54. package/dist/backend/backend/src/services/orc/agent-prompt-reference.service.d.ts.map +1 -0
  55. package/dist/backend/backend/src/services/orc/agent-prompt-reference.service.js +88 -0
  56. package/dist/backend/backend/src/services/orc/agent-prompt-reference.service.js.map +1 -0
  57. package/dist/backend/backend/src/services/orc/orc-reply-route.service.d.ts +8 -0
  58. package/dist/backend/backend/src/services/orc/orc-reply-route.service.d.ts.map +1 -1
  59. package/dist/backend/backend/src/services/orc/orc-reply-route.service.js +11 -0
  60. package/dist/backend/backend/src/services/orc/orc-reply-route.service.js.map +1 -1
  61. package/dist/backend/backend/src/services/orc/reply-destination-resolver.d.ts +218 -0
  62. package/dist/backend/backend/src/services/orc/reply-destination-resolver.d.ts.map +1 -0
  63. package/dist/backend/backend/src/services/orc/reply-destination-resolver.js +343 -0
  64. package/dist/backend/backend/src/services/orc/reply-destination-resolver.js.map +1 -0
  65. package/dist/backend/backend/src/services/orc/reply-destination.wiring.d.ts +98 -0
  66. package/dist/backend/backend/src/services/orc/reply-destination.wiring.d.ts.map +1 -0
  67. package/dist/backend/backend/src/services/orc/reply-destination.wiring.js +362 -0
  68. package/dist/backend/backend/src/services/orc/reply-destination.wiring.js.map +1 -0
  69. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.d.ts +9 -1
  70. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
  71. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js +32 -7
  72. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
  73. package/dist/backend/backend/src/services/slack/slack-agent-post.service.d.ts +2 -2
  74. package/dist/backend/backend/src/services/slack/slack-agent-post.service.d.ts.map +1 -1
  75. package/dist/backend/backend/src/services/slack/slack-agent-post.service.js +9 -0
  76. package/dist/backend/backend/src/services/slack/slack-agent-post.service.js.map +1 -1
  77. package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
  78. package/dist/backend/backend/src/services/slack/slack-initializer.js +4 -1
  79. package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
  80. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +1 -1
  81. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  82. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +24 -4
  83. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  84. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts +89 -7
  85. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
  86. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js +159 -21
  87. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
  88. package/dist/backend/backend/src/services/v3/ticket-intake.service.d.ts +23 -4
  89. package/dist/backend/backend/src/services/v3/ticket-intake.service.d.ts.map +1 -1
  90. package/dist/backend/backend/src/services/v3/ticket-intake.service.js +42 -4
  91. package/dist/backend/backend/src/services/v3/ticket-intake.service.js.map +1 -1
  92. package/dist/backend/build-info.json +2 -2
  93. package/dist/cli/backend/src/constants.d.ts +23 -0
  94. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  95. package/dist/cli/backend/src/constants.js +27 -1
  96. package/dist/cli/backend/src/constants.js.map +1 -1
  97. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts +7 -0
  98. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
  99. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js +9 -0
  100. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
  101. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts +7 -0
  102. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
  103. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js +19 -0
  104. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
  105. package/dist/cli/backend/src/services/decisions/decision.service.d.ts +4 -1
  106. package/dist/cli/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  107. package/dist/cli/backend/src/services/decisions/decision.service.js +10 -3
  108. package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -1
  109. package/dist/cli/backend/src/services/memory/project-memory.service.d.ts.map +1 -1
  110. package/dist/cli/backend/src/services/memory/project-memory.service.js +21 -10
  111. package/dist/cli/backend/src/services/memory/project-memory.service.js.map +1 -1
  112. package/dist/cli/backend/src/services/open-items/open-items.service.d.ts +457 -0
  113. package/dist/cli/backend/src/services/open-items/open-items.service.d.ts.map +1 -0
  114. package/dist/cli/backend/src/services/open-items/open-items.service.js +1158 -0
  115. package/dist/cli/backend/src/services/open-items/open-items.service.js.map +1 -0
  116. package/dist/cli/backend/src/services/orc/agent-prompt-reference.service.d.ts +81 -0
  117. package/dist/cli/backend/src/services/orc/agent-prompt-reference.service.d.ts.map +1 -0
  118. package/dist/cli/backend/src/services/orc/agent-prompt-reference.service.js +88 -0
  119. package/dist/cli/backend/src/services/orc/agent-prompt-reference.service.js.map +1 -0
  120. package/dist/cli/backend/src/services/orc/orc-reply-route.service.d.ts +8 -0
  121. package/dist/cli/backend/src/services/orc/orc-reply-route.service.d.ts.map +1 -1
  122. package/dist/cli/backend/src/services/orc/orc-reply-route.service.js +11 -0
  123. package/dist/cli/backend/src/services/orc/orc-reply-route.service.js.map +1 -1
  124. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.d.ts +9 -1
  125. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
  126. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js +32 -7
  127. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
  128. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +1 -1
  129. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  130. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +24 -4
  131. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  132. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts +89 -7
  133. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
  134. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js +159 -21
  135. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
  136. package/dist/cli/backend/src/services/v3/ticket-intake.service.d.ts +23 -4
  137. package/dist/cli/backend/src/services/v3/ticket-intake.service.d.ts.map +1 -1
  138. package/dist/cli/backend/src/services/v3/ticket-intake.service.js +42 -4
  139. package/dist/cli/backend/src/services/v3/ticket-intake.service.js.map +1 -1
  140. package/package.json +1 -1
@@ -0,0 +1,457 @@
1
+ /**
2
+ * Open items — Crewly tracks what agents promise and ask the owner in their
3
+ * replies, so nothing is silently dropped (specs/2026-10-01-reply-open-items.md).
4
+ *
5
+ * Incident (TKT-185, 2026-10-01): in #book-publish Atlas told the owner "Kai is
6
+ * going through the four episodes… 明天中午给我,我核过以后挑最有用的几条发你"
7
+ * and asked "第 13 章「互评当体检用」这个读法,你同意吗?". The ticket was already
8
+ * closed. Kai finished at 18:14 and Atlas verified it, but nobody delivered
9
+ * it and Atlas went idle; the question was never tracked.
10
+ *
11
+ * Now, for every agent message in a ticket's conversation:
12
+ *
13
+ * - **Extract** commitments and owner questions (rules, {@link extractOpenItems}).
14
+ * - **Hold the ticket open**: items live on `Request.openItems`; while one is
15
+ * active the ticket is `awaiting_followup` (RequestService gates `done`).
16
+ * - **Commitments**: a follow-up WorkItem for the agent, due at the parsed
17
+ * time; the delegated child work is linked; when that work is finished
18
+ * before the agent delivers, the agent is woken at once ("the work you
19
+ * promised the owner is ready — deliver it now"); past the due time the
20
+ * agent is nudged once, then the owner is told in the thread what is late
21
+ * and why; the agent's next post in the thread once the work is ready
22
+ * marks it delivered.
23
+ * - **Questions**: a decision card in the same thread, asked as the agent,
24
+ * with options and a default derived from its words ({@link deriveQuestionCard});
25
+ * answers reach the agent through the decision flow. No second card when
26
+ * the agent already asked the same thing with ask-owner.
27
+ *
28
+ * Collaborators are injected ({@link OpenItemsDeps}); `open-items.wiring.ts`
29
+ * connects the real ones.
30
+ *
31
+ * @module services/open-items/open-items.service
32
+ */
33
+ import { type ComponentLogger } from '../core/logger.service.js';
34
+ import type { Request } from '../../types/v2/request.types.js';
35
+ import type { WorkItem } from '../../types/v2/work-item.types.js';
36
+ import { type RequestOpenItem } from '../../types/v2/open-item.types.js';
37
+ import type { DecisionSource, OwnerDecision } from '../../types/decision.types.js';
38
+ import { type DerivedQuestionCard } from './open-item-card.js';
39
+ import { type ReplyReference } from '../orc/agent-prompt-reference.service.js';
40
+ /** The chat-v2 message fields the service reads. */
41
+ export interface OpenItemsChatMessage {
42
+ id: string;
43
+ channelId: string;
44
+ senderType: string;
45
+ senderId: string;
46
+ content: string;
47
+ threadId?: string;
48
+ /** Epoch ms (defaults to now) */
49
+ createdAt?: number;
50
+ metadata?: Record<string, unknown>;
51
+ }
52
+ /** Where a request's conversation lives in Slack, when it does. */
53
+ export interface OpenItemsSlackPlace {
54
+ slackChannelId: string;
55
+ threadTs: string;
56
+ }
57
+ /** Input to create a commitment's follow-up WorkItem. */
58
+ export interface FollowUpInput {
59
+ request: Request;
60
+ item: RequestOpenItem;
61
+ /** Slack thread of the conversation, when it has one */
62
+ place: OpenItemsSlackPlace | null;
63
+ }
64
+ /** Input to card a question. */
65
+ export interface QuestionCardInput {
66
+ request: Request;
67
+ item: RequestOpenItem;
68
+ card: DerivedQuestionCard;
69
+ place: OpenItemsSlackPlace | null;
70
+ /** `backfill` when the backfill cards an old reply */
71
+ source?: DecisionSource;
72
+ }
73
+ /** Collaborators. */
74
+ export interface OpenItemsDeps {
75
+ requests: {
76
+ getById(id: string): Promise<Request | null>;
77
+ listAll(): Promise<Request[]>;
78
+ update(id: string, updates: Parameters<import('../v3/request.service.js').RequestService['update']>[1]): Promise<Request>;
79
+ };
80
+ /** Every WorkItem in the pool */
81
+ listWorkItems: () => Promise<WorkItem[]>;
82
+ /** Queue the follow-up WorkItem (held until delivered); returns its id */
83
+ createFollowUp?: (input: FollowUpInput) => Promise<string | null>;
84
+ /** Close the follow-up WorkItem: `delivered` → done, else cancelled */
85
+ closeFollowUp?: (workItemId: string, outcome: 'delivered' | 'cancelled', reason: string) => Promise<void>;
86
+ /** Decisions the agent asked recently (for the ask-owner dedupe) */
87
+ recentDecisionsBy?: (agent: string, sinceMs: number) => Promise<OwnerDecision[]>;
88
+ /** Post a card for a question; returns the decision */
89
+ askQuestion?: (input: QuestionCardInput) => Promise<OwnerDecision | null>;
90
+ /** Withdraw a question's card (the ticket was cancelled) */
91
+ cancelQuestion?: (decisionId: string, note: string) => Promise<void>;
92
+ /** A question the owner skipped in this request (not asked again for 30 days) */
93
+ skippedQuestion?: (requestId: string, agent: string, question: string) => Promise<OwnerDecision | null>;
94
+ /** Skip a question's card (the owner skipped the open item); false when it was not pending */
95
+ skipQuestion?: (decisionId: string) => Promise<boolean>;
96
+ /** A decision by id (sweep catches answers a missed handler call left behind) */
97
+ getDecision?: (decisionId: string) => Promise<OwnerDecision | null>;
98
+ /** Deliver a note to an agent, waking it; false when it could not */
99
+ deliverToAgent: (session: string, text: string) => Promise<boolean>;
100
+ /** Post a note for the owner in the request's conversation */
101
+ postOwnerNote: (request: Request, text: string) => Promise<boolean>;
102
+ /** Display name of an agent ("Atlas") */
103
+ displayName?: (session: string) => Promise<string>;
104
+ /** Names of the agent's colleagues (questions to them are not for the owner) */
105
+ colleagueNames?: (session: string) => Promise<string[]>;
106
+ /** The owner's Slack user id */
107
+ ownerSlackUserId?: () => string | null;
108
+ now?: () => Date;
109
+ logger?: ComponentLogger;
110
+ }
111
+ /** What one extraction would add (also the backfill's dry-run row). */
112
+ export interface PlannedOpenItem {
113
+ item: RequestOpenItem;
114
+ /** Question: the card it would post (absent when an ask-owner card already covers it) */
115
+ card?: DerivedQuestionCard;
116
+ /** Question: the ask-owner decision it is linked to instead of a new card */
117
+ linkedDecisionId?: string;
118
+ /** Question: the owner already skipped the same question here — tracked as skipped, never carded */
119
+ skippedDecisionId?: string;
120
+ }
121
+ /** Thrown for open-item requests the caller must fix (HTTP 4xx). */
122
+ export declare class OpenItemsError extends Error {
123
+ readonly status: number;
124
+ constructor(status: number, message: string);
125
+ }
126
+ /**
127
+ * The Slack thread of a request's conversation (`origin.threadRef` is
128
+ * `slack:<channel>:<ts>`).
129
+ *
130
+ * @param request - Request
131
+ * @returns Place, or null for chat-only conversations
132
+ */
133
+ export declare function slackPlaceOf(request: Pick<Request, 'origin'>): OpenItemsSlackPlace | null;
134
+ /**
135
+ * Whether a message is in the request's conversation.
136
+ *
137
+ * @param request - Ticket with a chatRef
138
+ * @param message - chat-v2 message
139
+ * @returns True for its thread (or its root)
140
+ */
141
+ export declare function inRequestThread(request: Pick<Request, 'chatRef'>, message: Pick<OpenItemsChatMessage, 'channelId' | 'threadId' | 'id'>): boolean;
142
+ /**
143
+ * The delegated child work a commitment waits on: WorkItems of the request
144
+ * given to someone else, started around the promise and not already finished
145
+ * before it.
146
+ *
147
+ * @param request - Request
148
+ * @param item - Commitment
149
+ * @param pool - Every WorkItem
150
+ * @returns Child WorkItem ids
151
+ */
152
+ export declare function childWorkFor(request: Request, item: Pick<RequestOpenItem, 'agent' | 'createdAt'>, pool: readonly WorkItem[]): string[];
153
+ /**
154
+ * Whether every child of a commitment is finished (cancelled ones ignored).
155
+ *
156
+ * @param ids - Child ids
157
+ * @param pool - Every WorkItem
158
+ * @returns `ready` with the latest finish time, or not ready (with what is left)
159
+ */
160
+ export declare function childrenState(ids: readonly string[], pool: readonly WorkItem[]): {
161
+ ready: boolean;
162
+ finishedAt?: string;
163
+ pending: WorkItem[];
164
+ done: WorkItem[];
165
+ };
166
+ /**
167
+ * Whether two items are the same thing said once: same message, or the same
168
+ * words by the same agent within {@link OPEN_ITEMS_CONSTANTS.DUPLICATE_WINDOW_MS}.
169
+ *
170
+ * @param a - Item
171
+ * @param b - Item
172
+ * @returns True for a duplicate
173
+ */
174
+ export declare function isSameItem(a: Pick<RequestOpenItem, 'sourceMessageId' | 'text' | 'agent' | 'createdAt'>, b: Pick<RequestOpenItem, 'sourceMessageId' | 'text' | 'agent' | 'createdAt'>): boolean;
175
+ /** Whether the owner's message agrees ("可以", "同意", "ok", "go ahead", 👍) and does not hold back. */
176
+ export declare function isApproval(text: string): boolean;
177
+ /**
178
+ * Whether a post plausibly fulfils a promise (specs/2026-10-02-harness-owned-routing.md §5):
179
+ * the harness marked it as the ticket's delivery; or, for a promise of a
180
+ * deliverable (preview, PDF, link, report, file…), it carries a link, an
181
+ * attachment or names the same kind of thing; or, for a plain promise, it
182
+ * is a substantive post — not an ack, a progress line, or only a question.
183
+ *
184
+ * @param promise - The commitment's words
185
+ * @param message - The post
186
+ * @returns True when it can be the delivery
187
+ */
188
+ export declare function plausiblyFulfils(promise: string, message: Pick<OpenItemsChatMessage, 'content' | 'metadata'>): boolean;
189
+ /**
190
+ * Whether two commitments are the same promise: the same words, or — from the
191
+ * same agent within {@link OPEN_ITEMS_CONSTANTS.PROMISE_DUPLICATE_WINDOW_MS} —
192
+ * very similar words, or the same deliverable (same person named and the same
193
+ * kind of thing handed over).
194
+ *
195
+ * @param a - One item
196
+ * @param b - The other
197
+ * @returns True for one promise said twice
198
+ */
199
+ export declare function isSamePromise(a: RequestOpenItem, b: RequestOpenItem): boolean;
200
+ /**
201
+ * The reference a follow-up prompt names (specs/2026-10-02-harness-owned-routing.md §4).
202
+ *
203
+ * @param request - Request
204
+ * @param item - Commitment
205
+ * @returns The ticket (and follow-up work item) the agent answers about
206
+ */
207
+ export declare function followUpReference(request: Request, item: Pick<RequestOpenItem, 'workItemId'>): ReplyReference;
208
+ /**
209
+ * The exact command a follow-up prompt tells the agent to run — a reference,
210
+ * never a raw thread key (the harness finds the thread).
211
+ *
212
+ * @param ref - Follow-up reference
213
+ * @returns Command text
214
+ */
215
+ export declare function followUpCommand(ref: ReplyReference): string;
216
+ /**
217
+ * Tracks commitments and questions on Requests. See module docs.
218
+ */
219
+ export declare class OpenItemsService {
220
+ private readonly deps;
221
+ private static instance;
222
+ private readonly logger;
223
+ private readonly now;
224
+ private chain;
225
+ private timer;
226
+ /**
227
+ * @param deps - Collaborators
228
+ */
229
+ constructor(deps: OpenItemsDeps);
230
+ /** @returns The process-wide instance, or null before wiring */
231
+ static getInstance(): OpenItemsService | null;
232
+ /** @param service - Instance to install (null clears) */
233
+ static setInstance(service: OpenItemsService | null): void;
234
+ /** Start the periodic sweep. */
235
+ start(): void;
236
+ /** Stop the sweep. */
237
+ stop(): void;
238
+ /**
239
+ * One change at a time (a chat message, a WorkItem event and the sweep may
240
+ * touch the same request).
241
+ */
242
+ private serial;
243
+ /**
244
+ * The ticket an agent message belongs to: the one whose thread it is in
245
+ * (any status but cancelled, closed within the lookback), else — for a
246
+ * top-level message — the newest open ticket in that channel the agent is
247
+ * answering.
248
+ *
249
+ * @param message - chat-v2 message
250
+ * @param all - Every request
251
+ * @returns The request, or null
252
+ */
253
+ findRequestFor(message: OpenItemsChatMessage, all: readonly Request[]): Request | null;
254
+ /**
255
+ * An agent posted in chat-v2: mark what it delivered, and track what it
256
+ * newly promised or asked.
257
+ *
258
+ * @param message - The message
259
+ * @returns The request it changed, or null
260
+ */
261
+ onAgentMessage(message: OpenItemsChatMessage): Promise<Request | null>;
262
+ /**
263
+ * The owner posted in a ticket's thread: a yes opens the conditional
264
+ * promises that wait on them.
265
+ *
266
+ * @param message - The owner's message
267
+ * @returns The request it changed, or null
268
+ */
269
+ onOwnerMessage(message: OpenItemsChatMessage): Promise<Request | null>;
270
+ /**
271
+ * Open waiting promises: their due time is counted from `at`, and the
272
+ * follow-up WorkItem is created now.
273
+ *
274
+ * @param request - Request
275
+ * @param at - When the owner agreed
276
+ * @param why - For the log
277
+ * @param pick - Which waiting items
278
+ * @returns The updated request, or null when none matched
279
+ */
280
+ private openWaiting;
281
+ /**
282
+ * What a message would add, without side effects (also the backfill's view).
283
+ *
284
+ * @param request - Its request
285
+ * @param message - The agent message
286
+ * @param at - When it was posted
287
+ * @returns Planned items
288
+ */
289
+ plan(request: Request, message: OpenItemsChatMessage, at: Date): Promise<PlannedOpenItem[]>;
290
+ /**
291
+ * The newest ask-owner decision this agent made shortly before `at` (the card a conditional promise waits on).
292
+ *
293
+ * @param agent - Agent
294
+ * @param at - When the promise was made
295
+ * @returns The decision, or null
296
+ */
297
+ private recentDecision;
298
+ /**
299
+ * The ask-owner decision the agent already made for this question, if any.
300
+ *
301
+ * @param agent - Asking agent
302
+ * @param q - The question
303
+ * @param at - When it was asked in the reply
304
+ * @returns The decision, or null
305
+ */
306
+ private alreadyAsked;
307
+ /**
308
+ * Turn a planned item into a tracked one: link child work and queue the
309
+ * follow-up (commitment), or post / link the card (question).
310
+ *
311
+ * @param request - Its request
312
+ * @param p - Planned item
313
+ * @param pool - Every WorkItem
314
+ * @returns The stored item
315
+ */
316
+ private activate;
317
+ /**
318
+ * Commitments this message delivers.
319
+ *
320
+ * @param items - Current items
321
+ * @param message - The post
322
+ * @param at - Its time
323
+ * @param pool - Every WorkItem
324
+ * @returns Updated (delivered) items
325
+ */
326
+ private deliveries;
327
+ /**
328
+ * Whether a post in the thread delivers a commitment: by the promising
329
+ * agent (or one doing the child work), once the child work is finished.
330
+ * With no child work: a later post by the promising agent, at least
331
+ * {@link OPEN_ITEMS_CONSTANTS.MIN_DELIVERY_GAP_MS} after the promise, that
332
+ * does not itself promise something new.
333
+ *
334
+ * @param item - Commitment
335
+ * @param message - The post (`createdAt` set)
336
+ * @param pool - Every WorkItem
337
+ * @returns True when it is the delivery
338
+ */
339
+ deliveredBy(item: RequestOpenItem, message: OpenItemsChatMessage, pool: readonly WorkItem[]): boolean;
340
+ /**
341
+ * Whether a post makes a NEW promise: restating the one it delivers does not count.
342
+ *
343
+ * @param item - The commitment being delivered
344
+ * @param message - The post
345
+ * @param at - Its time (epoch ms)
346
+ * @returns True when it promises something else
347
+ */
348
+ private promisesAnew;
349
+ /**
350
+ * The agent that owns a follow-up WorkItem closes it as already delivered:
351
+ * the open item is closed and the WorkItem finished (no done_by_worker step).
352
+ *
353
+ * @param workItemId - The follow-up WorkItem
354
+ * @param agent - The session closing it (must be the promising agent)
355
+ * @param summary - What the agent says (where it was delivered)
356
+ * @returns True when an active item of that agent was closed
357
+ */
358
+ closeByAgent(workItemId: string, agent: string, summary: string): Promise<boolean>;
359
+ /**
360
+ * Take planned items onto a request (the backfill's apply step).
361
+ *
362
+ * @param requestId - Request
363
+ * @param planned - Items from {@link plan}
364
+ * @param opts - `source: 'backfill'` marks the cards it posts as backfilled; `caller` is
365
+ * the session of whoever asked for it (logged: who ran an apply)
366
+ * @returns Updated request, or null when it is gone
367
+ */
368
+ adopt(requestId: string, planned: PlannedOpenItem[], opts?: {
369
+ source?: DecisionSource;
370
+ caller?: string;
371
+ }): Promise<Request | null>;
372
+ /**
373
+ * Store items, and move the request between `done` and `awaiting_followup`.
374
+ *
375
+ * @param request - Request as read
376
+ * @param items - New item list
377
+ * @param added - New active items were added
378
+ * @returns Updated request
379
+ */
380
+ private save;
381
+ /**
382
+ * A WorkItem finished (task:done / task:verified): wake whoever promised
383
+ * the owner the result, if that was the last piece.
384
+ *
385
+ * @param workItemId - The WorkItem
386
+ * @returns Items that became ready
387
+ */
388
+ onWorkItemSettled(workItemId: string): Promise<RequestOpenItem[]>;
389
+ /**
390
+ * The child work is finished: wake the agent to deliver.
391
+ *
392
+ * @param request - Request
393
+ * @param item - Commitment
394
+ * @param finishedAt - When the last child finished
395
+ * @param done - Finished children
396
+ * @returns Updated item (`ready`)
397
+ */
398
+ private markReady;
399
+ /**
400
+ * A `reply_question` decision settled: close its open item and give the
401
+ * agent the answer (the generic decision note).
402
+ *
403
+ * @param d - The decision
404
+ * @param fallback - The generic note
405
+ * @returns The note for the agent (null when withdrawn)
406
+ */
407
+ onDecisionSettled(d: OwnerDecision, fallback: string | null | undefined): Promise<string | null>;
408
+ /**
409
+ * The owner skipped an open item ("I don't care about this anymore"). A
410
+ * promise is closed, its follow-up WorkItem cancelled and the agent told
411
+ * once to drop it; a question's card is skipped (which closes the item and
412
+ * tells the agent). The request completes when nothing else is open.
413
+ *
414
+ * @param requestId - Request
415
+ * @param itemId - Open item
416
+ * @returns The closed item
417
+ * @throws OpenItemsError(404 / 409)
418
+ */
419
+ skipItem(requestId: string, itemId: string): Promise<RequestOpenItem>;
420
+ /**
421
+ * Periodic pass: link late child work, catch missed readiness, nudge
422
+ * overdue promises once and then tell the owner, sync answered questions,
423
+ * expire stale items, close cancelled tickets' items.
424
+ *
425
+ * @returns Counts of what happened
426
+ */
427
+ sweep(): Promise<{
428
+ ready: number;
429
+ nudged: number;
430
+ ownerNotes: number;
431
+ expired: number;
432
+ closed: number;
433
+ }>;
434
+ /**
435
+ * One item's sweep step.
436
+ */
437
+ private sweepItem;
438
+ /**
439
+ * The owner's note for a late promise: what, by when, and why it is late.
440
+ *
441
+ * @param request - Request
442
+ * @param item - Commitment
443
+ * @param pool - Every WorkItem
444
+ * @param now - Clock
445
+ * @returns Note text (English harness text; the agent's words quoted)
446
+ */
447
+ ownerNote(request: Request, item: RequestOpenItem, pool: readonly WorkItem[], now: Date): Promise<string>;
448
+ private closeFollowUp;
449
+ }
450
+ /**
451
+ * The open-item status a settled decision leaves its question in.
452
+ *
453
+ * @param d - Decision
454
+ * @returns Status (`open` while it is still pending)
455
+ */
456
+ export declare function itemStatusFor(d: Pick<OwnerDecision, 'status'>): RequestOpenItem['status'];
457
+ //# sourceMappingURL=open-items.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-items.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/open-items/open-items.service.ts"],"names":[],"mappings":"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"}