crewly 1.20.181 → 1.20.182

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 (136) hide show
  1. package/dist/backend/backend/src/constants.d.ts +66 -1
  2. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  3. package/dist/backend/backend/src/constants.js +75 -1
  4. package/dist/backend/backend/src/constants.js.map +1 -1
  5. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.d.ts +11 -1
  6. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.d.ts.map +1 -1
  7. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.js +44 -9
  8. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.js.map +1 -1
  9. package/dist/backend/backend/src/controllers/system/runtime-terms.controller.d.ts +31 -0
  10. package/dist/backend/backend/src/controllers/system/runtime-terms.controller.d.ts.map +1 -0
  11. package/dist/backend/backend/src/controllers/system/runtime-terms.controller.js +99 -0
  12. package/dist/backend/backend/src/controllers/system/runtime-terms.controller.js.map +1 -0
  13. package/dist/backend/backend/src/index.d.ts.map +1 -1
  14. package/dist/backend/backend/src/index.js +4 -0
  15. package/dist/backend/backend/src/index.js.map +1 -1
  16. package/dist/backend/backend/src/routes/modules/system.routes.d.ts.map +1 -1
  17. package/dist/backend/backend/src/routes/modules/system.routes.js +3 -0
  18. package/dist/backend/backend/src/routes/modules/system.routes.js.map +1 -1
  19. package/dist/backend/backend/src/services/agent/antigravity-runtime.service.d.ts.map +1 -1
  20. package/dist/backend/backend/src/services/agent/antigravity-runtime.service.js +5 -0
  21. package/dist/backend/backend/src/services/agent/antigravity-runtime.service.js.map +1 -1
  22. package/dist/backend/backend/src/services/decisions/decision-card.d.ts +14 -4
  23. package/dist/backend/backend/src/services/decisions/decision-card.d.ts.map +1 -1
  24. package/dist/backend/backend/src/services/decisions/decision-card.js +31 -10
  25. package/dist/backend/backend/src/services/decisions/decision-card.js.map +1 -1
  26. package/dist/backend/backend/src/services/decisions/decision.service.d.ts +40 -2
  27. package/dist/backend/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  28. package/dist/backend/backend/src/services/decisions/decision.service.js +100 -8
  29. package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -1
  30. package/dist/backend/backend/src/services/decisions/decision.wiring.d.ts.map +1 -1
  31. package/dist/backend/backend/src/services/decisions/decision.wiring.js +7 -0
  32. package/dist/backend/backend/src/services/decisions/decision.wiring.js.map +1 -1
  33. package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.d.ts +8 -0
  34. package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.d.ts.map +1 -1
  35. package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.js +5 -0
  36. package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.js.map +1 -1
  37. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts +2 -0
  38. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts.map +1 -1
  39. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js +4 -0
  40. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js.map +1 -1
  41. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts +2 -0
  42. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts.map +1 -1
  43. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.js.map +1 -1
  44. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.d.ts.map +1 -1
  45. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js +3 -0
  46. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js.map +1 -1
  47. package/dist/backend/backend/src/services/runtime-fallback/runtime-smoke-test.service.d.ts +15 -1
  48. package/dist/backend/backend/src/services/runtime-fallback/runtime-smoke-test.service.d.ts.map +1 -1
  49. package/dist/backend/backend/src/services/runtime-fallback/runtime-smoke-test.service.js +13 -2
  50. package/dist/backend/backend/src/services/runtime-fallback/runtime-smoke-test.service.js.map +1 -1
  51. package/dist/backend/backend/src/services/runtime-terms/antigravity-terms-driver.d.ts +92 -0
  52. package/dist/backend/backend/src/services/runtime-terms/antigravity-terms-driver.d.ts.map +1 -0
  53. package/dist/backend/backend/src/services/runtime-terms/antigravity-terms-driver.js +199 -0
  54. package/dist/backend/backend/src/services/runtime-terms/antigravity-terms-driver.js.map +1 -0
  55. package/dist/backend/backend/src/services/runtime-terms/antigravity-terms-screens.d.ts +79 -0
  56. package/dist/backend/backend/src/services/runtime-terms/antigravity-terms-screens.d.ts.map +1 -0
  57. package/dist/backend/backend/src/services/runtime-terms/antigravity-terms-screens.js +145 -0
  58. package/dist/backend/backend/src/services/runtime-terms/antigravity-terms-screens.js.map +1 -0
  59. package/dist/backend/backend/src/services/runtime-terms/fake-agy-tui.fixture.d.ts +75 -0
  60. package/dist/backend/backend/src/services/runtime-terms/fake-agy-tui.fixture.d.ts.map +1 -0
  61. package/dist/backend/backend/src/services/runtime-terms/fake-agy-tui.fixture.js +218 -0
  62. package/dist/backend/backend/src/services/runtime-terms/fake-agy-tui.fixture.js.map +1 -0
  63. package/dist/backend/backend/src/services/runtime-terms/runtime-terms-consent.service.d.ts +245 -0
  64. package/dist/backend/backend/src/services/runtime-terms/runtime-terms-consent.service.d.ts.map +1 -0
  65. package/dist/backend/backend/src/services/runtime-terms/runtime-terms-consent.service.js +428 -0
  66. package/dist/backend/backend/src/services/runtime-terms/runtime-terms-consent.service.js.map +1 -0
  67. package/dist/backend/backend/src/services/runtime-terms/runtime-terms.store.d.ts +67 -0
  68. package/dist/backend/backend/src/services/runtime-terms/runtime-terms.store.d.ts.map +1 -0
  69. package/dist/backend/backend/src/services/runtime-terms/runtime-terms.store.js +78 -0
  70. package/dist/backend/backend/src/services/runtime-terms/runtime-terms.store.js.map +1 -0
  71. package/dist/backend/backend/src/services/runtime-terms/runtime-terms.wiring.d.ts +39 -0
  72. package/dist/backend/backend/src/services/runtime-terms/runtime-terms.wiring.d.ts.map +1 -0
  73. package/dist/backend/backend/src/services/runtime-terms/runtime-terms.wiring.js +161 -0
  74. package/dist/backend/backend/src/services/runtime-terms/runtime-terms.wiring.js.map +1 -0
  75. package/dist/backend/backend/src/types/decision.types.d.ts +29 -5
  76. package/dist/backend/backend/src/types/decision.types.d.ts.map +1 -1
  77. package/dist/backend/build-info.json +2 -2
  78. package/dist/cli/backend/src/constants.d.ts +66 -1
  79. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  80. package/dist/cli/backend/src/constants.js +75 -1
  81. package/dist/cli/backend/src/constants.js.map +1 -1
  82. package/dist/cli/backend/src/services/agent/antigravity-runtime.service.d.ts.map +1 -1
  83. package/dist/cli/backend/src/services/agent/antigravity-runtime.service.js +5 -0
  84. package/dist/cli/backend/src/services/agent/antigravity-runtime.service.js.map +1 -1
  85. package/dist/cli/backend/src/services/decisions/decision-card.d.ts +165 -0
  86. package/dist/cli/backend/src/services/decisions/decision-card.d.ts.map +1 -0
  87. package/dist/cli/backend/src/services/decisions/decision-card.js +358 -0
  88. package/dist/cli/backend/src/services/decisions/decision-card.js.map +1 -0
  89. package/dist/cli/backend/src/services/decisions/decision-contract.d.ts +83 -0
  90. package/dist/cli/backend/src/services/decisions/decision-contract.d.ts.map +1 -0
  91. package/dist/cli/backend/src/services/decisions/decision-contract.js +226 -0
  92. package/dist/cli/backend/src/services/decisions/decision-contract.js.map +1 -0
  93. package/dist/cli/backend/src/services/decisions/decision-store.d.ts +80 -0
  94. package/dist/cli/backend/src/services/decisions/decision-store.d.ts.map +1 -0
  95. package/dist/cli/backend/src/services/decisions/decision-store.js +151 -0
  96. package/dist/cli/backend/src/services/decisions/decision-store.js.map +1 -0
  97. package/dist/cli/backend/src/services/decisions/decision.service.d.ts +376 -0
  98. package/dist/cli/backend/src/services/decisions/decision.service.d.ts.map +1 -0
  99. package/dist/cli/backend/src/services/decisions/decision.service.js +821 -0
  100. package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -0
  101. package/dist/cli/backend/src/services/decisions/ticket-thread-store.d.ts +97 -0
  102. package/dist/cli/backend/src/services/decisions/ticket-thread-store.d.ts.map +1 -0
  103. package/dist/cli/backend/src/services/decisions/ticket-thread-store.js +137 -0
  104. package/dist/cli/backend/src/services/decisions/ticket-thread-store.js.map +1 -0
  105. package/dist/cli/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts +136 -0
  106. package/dist/cli/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts.map +1 -0
  107. package/dist/cli/backend/src/services/runtime-fallback/runtime-fallback.types.js +152 -0
  108. package/dist/cli/backend/src/services/runtime-fallback/runtime-fallback.types.js.map +1 -0
  109. package/dist/cli/backend/src/services/runtime-fallback/runtime-smoke-test.service.d.ts +217 -0
  110. package/dist/cli/backend/src/services/runtime-fallback/runtime-smoke-test.service.d.ts.map +1 -0
  111. package/dist/cli/backend/src/services/runtime-fallback/runtime-smoke-test.service.js +430 -0
  112. package/dist/cli/backend/src/services/runtime-fallback/runtime-smoke-test.service.js.map +1 -0
  113. package/dist/cli/backend/src/services/runtime-terms/antigravity-terms-driver.d.ts +92 -0
  114. package/dist/cli/backend/src/services/runtime-terms/antigravity-terms-driver.d.ts.map +1 -0
  115. package/dist/cli/backend/src/services/runtime-terms/antigravity-terms-driver.js +199 -0
  116. package/dist/cli/backend/src/services/runtime-terms/antigravity-terms-driver.js.map +1 -0
  117. package/dist/cli/backend/src/services/runtime-terms/antigravity-terms-screens.d.ts +79 -0
  118. package/dist/cli/backend/src/services/runtime-terms/antigravity-terms-screens.d.ts.map +1 -0
  119. package/dist/cli/backend/src/services/runtime-terms/antigravity-terms-screens.js +145 -0
  120. package/dist/cli/backend/src/services/runtime-terms/antigravity-terms-screens.js.map +1 -0
  121. package/dist/cli/backend/src/services/runtime-terms/runtime-terms-consent.service.d.ts +245 -0
  122. package/dist/cli/backend/src/services/runtime-terms/runtime-terms-consent.service.d.ts.map +1 -0
  123. package/dist/cli/backend/src/services/runtime-terms/runtime-terms-consent.service.js +428 -0
  124. package/dist/cli/backend/src/services/runtime-terms/runtime-terms-consent.service.js.map +1 -0
  125. package/dist/cli/backend/src/services/runtime-terms/runtime-terms.store.d.ts +67 -0
  126. package/dist/cli/backend/src/services/runtime-terms/runtime-terms.store.d.ts.map +1 -0
  127. package/dist/cli/backend/src/services/runtime-terms/runtime-terms.store.js +78 -0
  128. package/dist/cli/backend/src/services/runtime-terms/runtime-terms.store.js.map +1 -0
  129. package/dist/cli/backend/src/types/decision.types.d.ts +192 -0
  130. package/dist/cli/backend/src/types/decision.types.d.ts.map +1 -0
  131. package/dist/cli/backend/src/types/decision.types.js +13 -0
  132. package/dist/cli/backend/src/types/decision.types.js.map +1 -0
  133. package/dist/cli/cli/src/commands/harness-setup.js +2 -2
  134. package/frontend/dist/assets/{index-4271e95e.js → index-9c91de50.js} +138 -138
  135. package/frontend/dist/index.html +1 -1
  136. package/package.json +1 -1
@@ -0,0 +1,376 @@
1
+ /**
2
+ * Decision cards (specs/2026-10-01-decision-cards.md).
3
+ *
4
+ * The responsible agent asks the owner ONE structured question; its own
5
+ * Slack bot posts a Block Kit card in the team channel (the ticket's thread,
6
+ * or a new thread), and the owner answers with a button, a reaction, a
7
+ * thread reply or the dashboard. The answer updates the card in place, goes
8
+ * into the ticket log, is delivered to the asking agent and clears the
9
+ * owner-message watchdog for that thread. At the deadline the default is
10
+ * applied — except for sensitive asks, which are re-asked once and parked.
11
+ *
12
+ * Every collaborator is injected ({@link DecisionServiceDeps}); the wiring
13
+ * with the real Slack / tickets / agents lives in `decision.wiring.ts`.
14
+ *
15
+ * @module services/decisions/decision.service
16
+ */
17
+ import { type ComponentLogger } from '../core/logger.service.js';
18
+ import type { SlackBlock, SlackIncomingMessage, SlackOutgoingMessage } from '../../types/slack.types.js';
19
+ import type { AskOwnerInput, DecisionKind, DecisionOption, DecisionSensitiveKind, DecisionSystemRef, OwnerDecision } from '../../types/decision.types.js';
20
+ import { formatWhen } from './decision-card.js';
21
+ import { DecisionStore } from './decision-store.js';
22
+ import type { TicketThreadStore } from './ticket-thread-store.js';
23
+ /** Thrown for requests the caller must fix (HTTP 4xx). */
24
+ export declare class DecisionError extends Error {
25
+ readonly status: number;
26
+ constructor(status: number, message: string);
27
+ }
28
+ /** The slice of SlackService used here. */
29
+ export interface DecisionSlackApi {
30
+ isConnected(): boolean;
31
+ sendMessage(message: SlackOutgoingMessage): Promise<string>;
32
+ updateMessage(channelId: string, messageTs: string, text: string, blocks?: SlackBlock[], botToken?: string): Promise<void>;
33
+ }
34
+ /** How an agent posts: its own bot token, else the shared bot with its name/icon. */
35
+ export interface DecisionPostIdentity {
36
+ botToken?: string;
37
+ username?: string;
38
+ iconEmoji?: string;
39
+ iconUrl?: string;
40
+ }
41
+ /** A ticket the question is about, resolved by the wiring. */
42
+ export interface DecisionTicketContext {
43
+ projectId: string;
44
+ projectPath: string;
45
+ projectName?: string;
46
+ id: string;
47
+ title: string;
48
+ /** Session that owns the question: the assignee, else the team's lead */
49
+ asker: string;
50
+ /** Team whose channel carries the card */
51
+ teamId?: string;
52
+ }
53
+ /** A Slack place to post into. */
54
+ export interface DecisionSlackPlace {
55
+ slackChannelId: string;
56
+ threadTs?: string;
57
+ teamId?: string;
58
+ }
59
+ /** Collaborators. */
60
+ export interface DecisionServiceDeps {
61
+ store: DecisionStore;
62
+ threads: TicketThreadStore;
63
+ slack: () => DecisionSlackApi | null;
64
+ /** This instance (button values carry it; Cloud routes clicks by it) */
65
+ instanceId: () => string;
66
+ /** Whether a Slack user may answer (the owner) */
67
+ isOwner: (slackUserId: string) => boolean;
68
+ /** The owner's Slack user id, for mentions in reminders */
69
+ ownerUserId?: () => string | null;
70
+ /** Display name of a Slack user ("Steve") */
71
+ userName?: (slackUserId: string) => Promise<string | undefined>;
72
+ /** How an agent posts */
73
+ identityOf: (session: string) => Promise<DecisionPostIdentity>;
74
+ /** Slack channel of a team */
75
+ teamChannelOf: (teamId: string) => Promise<string | null>;
76
+ /** The team an agent belongs to */
77
+ teamOf: (session: string) => Promise<string | undefined>;
78
+ /** Resolve a ticket ask (access-checked); throws DecisionError */
79
+ resolveTicket: (project: string, ticketId: string, callerSession: string | undefined) => Promise<DecisionTicketContext>;
80
+ /** Mark the ticket as waiting on the owner (label + log line) */
81
+ markTicketAsked: (ctx: DecisionTicketContext, question: string, decisionId: string) => Promise<void>;
82
+ /** Append a ticket log line; `clearNeedsOwner` removes the needs-owner label */
83
+ logTicket: (ticket: NonNullable<OwnerDecision['ticket']>, line: string, clearNeedsOwner: boolean) => Promise<void>;
84
+ /** The Slack destination of the agent's current work, when it is a Slack place */
85
+ workDestination?: (session: string) => Promise<DecisionSlackPlace | null>;
86
+ /** The work item the agent is on */
87
+ currentWorkItemId?: (session: string) => Promise<string | undefined>;
88
+ /** Deliver a message to an agent (wakes a stopped one); false when it could not */
89
+ deliverToAgent: (session: string, text: string) => Promise<boolean>;
90
+ /** Close the owner-message watchdog entries this agent owes in the thread */
91
+ closeWatchdog?: (session: string, slackChannelId: string, threadTs: string) => void;
92
+ /** The owner's DM with the bot of `identity` (system decisions); null when there is none */
93
+ ownerDmOf?: (identity: DecisionPostIdentity) => Promise<string | null>;
94
+ now?: () => Date;
95
+ logger?: ComponentLogger;
96
+ }
97
+ /** A decision the harness asks itself ({@link DecisionService.askSystem}). */
98
+ export interface SystemAskInput {
99
+ /** Kind whose registered handler acts on the answer */
100
+ kind: DecisionKind;
101
+ system: DecisionSystemRef;
102
+ /** Card header */
103
+ title: string;
104
+ /** One line */
105
+ question: string;
106
+ /** Extra mrkdwn sections under the question */
107
+ body?: string[];
108
+ /** `["Label", "Label — detail"]` or `[{label, detail?}]` */
109
+ options: unknown[];
110
+ /** Option label */
111
+ default: string;
112
+ deadline: Date;
113
+ sensitive?: DecisionSensitiveKind;
114
+ }
115
+ /** What a Slack interaction did. */
116
+ export interface InteractionOutcome {
117
+ handled: boolean;
118
+ reason: string;
119
+ decision?: OwnerDecision;
120
+ }
121
+ /** A Slack `block_actions` payload (the fields used). */
122
+ export interface BlockActionsPayload {
123
+ type?: string;
124
+ user?: {
125
+ id?: string;
126
+ name?: string;
127
+ username?: string;
128
+ };
129
+ actions?: Array<{
130
+ action_id?: string;
131
+ value?: string;
132
+ action_ts?: string;
133
+ }>;
134
+ container?: {
135
+ channel_id?: string;
136
+ message_ts?: string;
137
+ thread_ts?: string;
138
+ };
139
+ channel?: {
140
+ id?: string;
141
+ };
142
+ message?: {
143
+ ts?: string;
144
+ thread_ts?: string;
145
+ };
146
+ }
147
+ /** A `reaction_added` event (the fields used). */
148
+ export interface ReactionEvent {
149
+ user?: string;
150
+ reaction?: string;
151
+ item?: {
152
+ type?: string;
153
+ channel?: string;
154
+ ts?: string;
155
+ };
156
+ }
157
+ /**
158
+ * Acts on the outcome of a decision Crewly asked itself ({@link DecisionKind}).
159
+ */
160
+ export interface DecisionKindHandler {
161
+ /**
162
+ * Called once when such a decision settles (resolved, defaulted at the
163
+ * deadline, parked, cancelled or expired). Does the kind's work (e.g. lets a held
164
+ * browser click through) and returns the note for the asking agent, which
165
+ * replaces the generic `[DECISION]` note; null sends nothing.
166
+ *
167
+ * @param decision - The settled decision
168
+ * @returns Note for the asker, or null
169
+ */
170
+ onSettled(decision: OwnerDecision): Promise<string | null>;
171
+ }
172
+ /** A question Crewly builds itself (no ask-owner contract parsing). */
173
+ export interface PrebuiltAsk {
174
+ kind: DecisionKind;
175
+ /** Agent the question is about — its bot posts the card and it gets the answer */
176
+ asker: string;
177
+ question: string;
178
+ options: DecisionOption[];
179
+ defaultKey: string;
180
+ yesKey?: string;
181
+ deadline: Date;
182
+ sensitive?: DecisionSensitiveKind;
183
+ browser?: OwnerDecision['browser'];
184
+ }
185
+ /**
186
+ * Decision cards service.
187
+ */
188
+ export declare class DecisionService {
189
+ private static instance;
190
+ private readonly deps;
191
+ private readonly logger;
192
+ private readonly now;
193
+ private timer;
194
+ private ticking;
195
+ /**
196
+ * @param deps - Collaborators
197
+ */
198
+ constructor(deps: DecisionServiceDeps);
199
+ /** @returns The process-wide instance, or null before wiring */
200
+ static getInstance(): DecisionService | null;
201
+ /** @param service - Instance to install (null clears) */
202
+ static setInstance(service: DecisionService | null): void;
203
+ /**
204
+ * Register the handler of a decision kind.
205
+ *
206
+ * @param kind - Decision kind
207
+ * @param handler - Handler (null removes it)
208
+ */
209
+ static registerKindHandler(kind: DecisionKind, handler: DecisionKindHandler | null): void;
210
+ /** Start the deadline / reminder tick. */
211
+ start(): void;
212
+ /** Stop the tick. */
213
+ stop(): void;
214
+ /**
215
+ * Ask the owner. Validates the contract, stores the decision and posts the
216
+ * card as the responsible agent's own bot.
217
+ *
218
+ * @param callerSession - Agent calling ask-owner (undefined = owner / dashboard)
219
+ * @param input - The ask
220
+ * @returns The stored decision (with `card`, or `postError` when Slack refused; retried on the tick)
221
+ * @throws DecisionError(400) for a contract violation, other 4xx from ticket resolution
222
+ */
223
+ ask(callerSession: string | undefined, input: AskOwnerInput): Promise<OwnerDecision>;
224
+ /**
225
+ * Ask the owner on the harness's own behalf (no agent): the card goes to
226
+ * the owner's DM with this machine's orc bot, and the answer goes to the
227
+ * kind's handler only — no agent is told or woken.
228
+ *
229
+ * @param input - The ask
230
+ * @returns The stored decision (with `card`, or `postError`; retried on the tick)
231
+ * @throws DecisionError(400) for bad options / default / deadline
232
+ */
233
+ askSystem(input: SystemAskInput): Promise<OwnerDecision>;
234
+ /**
235
+ * Ask a question Crewly built itself (e.g. a held browser action). The card
236
+ * goes where an ask-owner card without a ticket goes: the thread of the
237
+ * agent's current work item, else its team channel — from its own bot.
238
+ *
239
+ * @param ask - The prebuilt question
240
+ * @returns The stored decision (with `card`, or `postError`; retried on the tick)
241
+ */
242
+ askPrebuilt(ask: PrebuiltAsk): Promise<OwnerDecision>;
243
+ /**
244
+ * Post a line in a decision's card thread (as the asker's bot).
245
+ *
246
+ * @param id - Decision id
247
+ * @param text - mrkdwn text
248
+ * @returns True when there was a card to reply to
249
+ */
250
+ replyInThread(id: string, text: string): Promise<boolean>;
251
+ /**
252
+ * Mark an open decision as expired: what it asked about is gone. The card
253
+ * says so, and the kind's handler tells the agent.
254
+ *
255
+ * @param id - Decision id
256
+ * @returns The expired decision, or null when it was not pending
257
+ */
258
+ expire(id: string): Promise<OwnerDecision | null>;
259
+ /**
260
+ * Post (or re-try posting) the card of an open decision.
261
+ *
262
+ * @param decision - Decision without a card
263
+ * @returns The decision with `card` or `postError`
264
+ */
265
+ postCard(decision: OwnerDecision): Promise<OwnerDecision>;
266
+ /**
267
+ * Where the card goes: the ticket's thread (created on first use), else the
268
+ * asker's current work destination, else a new thread in its team channel.
269
+ */
270
+ private placeFor;
271
+ /**
272
+ * Send as the agent's own bot; when Slack refuses that bot (not in the
273
+ * channel, revoked), fall back to the shared bot with the agent's name.
274
+ */
275
+ private send;
276
+ /**
277
+ * A Slack `block_actions` payload (Cloud relay, Socket Mode or the HTTP
278
+ * endpoint). Ignores anything that is not one of this instance's cards.
279
+ *
280
+ * @param payload - Slack payload
281
+ * @returns What happened
282
+ */
283
+ handleInteraction(payload: BlockActionsPayload): Promise<InteractionOutcome>;
284
+ /**
285
+ * A reaction on a card: ✅ default/first, ❌ the "no" option, ⏰ remind.
286
+ *
287
+ * @param event - `reaction_added` event
288
+ * @returns What happened
289
+ */
290
+ handleReaction(event: ReactionEvent): Promise<InteractionOutcome>;
291
+ /**
292
+ * An owner reply in a card's thread. The newest open card in that thread
293
+ * takes it; words that match no option are passed to the asker verbatim.
294
+ *
295
+ * @param message - Inbound Slack message
296
+ * @returns What happened
297
+ */
298
+ handleThreadReply(message: Pick<SlackIncomingMessage, 'channelId' | 'threadTs' | 'ts' | 'text' | 'userId' | 'authorAgentSession'>): Promise<InteractionOutcome>;
299
+ /**
300
+ * The owner answered from the dashboard.
301
+ *
302
+ * @param id - Decision id
303
+ * @param optionKey - Option key (or label / number)
304
+ * @returns The resolved decision
305
+ * @throws DecisionError(404/409/400)
306
+ */
307
+ chooseFromDashboard(id: string, optionKey: string): Promise<OwnerDecision>;
308
+ /**
309
+ * "Remind me tomorrow" from the dashboard.
310
+ *
311
+ * @param id - Decision id
312
+ * @returns The snoozed decision
313
+ */
314
+ remindFromDashboard(id: string): Promise<OwnerDecision>;
315
+ /**
316
+ * Withdraw open decisions (the asker no longer needs an answer, or the
317
+ * ticket's mark was cleared).
318
+ *
319
+ * @param filter - Which decisions
320
+ * @param note - Why (ticket log)
321
+ * @returns How many were withdrawn
322
+ */
323
+ cancelWhere(filter: (d: OwnerDecision) => boolean, note?: string): Promise<number>;
324
+ /**
325
+ * List decisions.
326
+ *
327
+ * @param which - `open` (open + parked) or `all`
328
+ * @returns Decisions, newest first
329
+ */
330
+ list(which?: 'open' | 'all'): Promise<OwnerDecision[]>;
331
+ /**
332
+ * One decision.
333
+ *
334
+ * @param id - Decision id
335
+ * @returns Decision or null
336
+ */
337
+ get(id: string): Promise<OwnerDecision | null>;
338
+ private requirePending;
339
+ /**
340
+ * Apply a choice: resolve (or snooze), update the card, log the ticket,
341
+ * tell the asker, close the watchdog entry.
342
+ */
343
+ private apply;
344
+ /** The note the asker receives when the owner answered. */
345
+ private answerNote;
346
+ /** Where the asker's follow-up belongs. */
347
+ private whereLine;
348
+ /**
349
+ * One pass: retry unposted cards, post due reminders, apply defaults at
350
+ * the deadline, re-ask / park sensitive asks, prune old decisions.
351
+ *
352
+ * @returns Ids acted on
353
+ */
354
+ tick(): Promise<string[]>;
355
+ /** Post the "Remind me tomorrow" reminder in the card's thread. */
356
+ private remindNow;
357
+ /** Non-sensitive deadline: apply the default (or say it keeps waiting). */
358
+ private applyDefault;
359
+ /** Sensitive deadline: re-ask once after 24 h, then park. Never auto-applied. */
360
+ private sensitiveStep;
361
+ /** Re-render the card for the decision's current state (with the posting bot's token). */
362
+ private refreshCard;
363
+ /** Post a line in the card's thread, as the asker. */
364
+ private postInThread;
365
+ private logTicket;
366
+ /**
367
+ * Tell the asker how a decision settled: through its kind's handler when
368
+ * it has one (which also acts on the answer), else with `fallback`.
369
+ */
370
+ private notifyAsker;
371
+ private tellAsker;
372
+ private closeWatchdog;
373
+ }
374
+ /** Re-exported for the deadline line in the dashboard/API. */
375
+ export { formatWhen };
376
+ //# sourceMappingURL=decision.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decision.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/decisions/decision.service.ts"],"names":[],"mappings":"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"}