glimmervoid 0.38.2 → 0.40.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/README.md +1 -1
- package/dist/bin/glimmervoid.js +33 -42
- package/dist/chunks/{adapters-CAHxZYT3.js → adapters-B6tbX3Aj.js} +27 -14
- package/dist/chunks/{adapters-DDjC7_vG.js → adapters-CXQfLoyj.js} +1 -1
- package/dist/chunks/agent-api-cli-BBech5lF.js +1 -0
- package/dist/chunks/{agent-api-cli-B5Tm0wXO.js → agent-api-cli-BNHJTmNW.js} +44 -77
- package/dist/chunks/agent-api-core-DDrJQEdE.js +304 -0
- package/dist/chunks/{agent-setup-cli-DmMfCw5O.js → agent-setup-cli-CeBBwKuL.js} +2 -2
- package/dist/chunks/config-store-BZpN2djp.js +1 -0
- package/dist/chunks/{config-store-BUNZs4j7.js → config-store-DqMScSdg.js} +82 -268
- package/dist/chunks/contracts-CloExMlS.js +680 -0
- package/dist/chunks/{contracts-HVCEJfxs.js → control-messages-DpBaniJi.js} +1275 -1021
- package/dist/chunks/{git-version-rWZjF2Px.js → git-version-CJQMfxtZ.js} +2 -2
- package/dist/chunks/{grok-B6bsCgdd.js → grok-BLzhApwT.js} +7 -8
- package/dist/chunks/{guardrails-deps-Cb-ki4EU.js → guardrails-deps-CLxK4J-g.js} +1 -1
- package/dist/chunks/{json-file-CIJf0Cel.js → json-file-DFCTvPjj.js} +3 -7
- package/dist/chunks/{main-BNSbP-Yk.js → main-DDU8IvFD.js} +28791 -31978
- package/dist/chunks/{pair-cli-DNp8i5L4.js → pair-cli-CsOVTQGJ.js} +2 -2
- package/dist/chunks/{remote-config-C_s2pnLC.js → remote-config-HlABuLTp.js} +2 -2
- package/dist/chunks/{session-BlT68ppa.js → session-BwB43SCa.js} +119 -71
- package/dist/chunks/{session-routes-CT1JrjoT.js → session-routes-DNJzsckH.js} +25 -10
- package/dist/chunks/{settings-cli-BbzxCyG5.js → settings-cli-DkkbK-dj.js} +30 -156
- package/dist/chunks/settings-readout-core-DrXT4aWm.js +201 -0
- package/dist/chunks/{ssh-sign-cli-C74BGTQS.js → ssh-sign-cli-CYeKRevK.js} +2 -2
- package/dist/client/assets/index-BK9jLR47.js +148 -0
- package/dist/client/assets/index-CU_uqJmi.css +2 -0
- package/dist/client/assets/xterm-kR64YvZ-.js +79 -0
- package/dist/client/assets/zod-BRLv4KqJ.js +55 -0
- package/dist/client/index.html +7 -3
- package/dist/scripts/postinstall-path-check.js +21 -3
- package/dist/server/index.js +1 -1
- package/package.json +3 -4
- package/dist/chunks/agent-api-cli-BDu1CxZf.js +0 -1
- package/dist/chunks/agent-api-core-B_mUSenR.js +0 -341
- package/dist/chunks/browser-config-BrBT8269.js +0 -762
- package/dist/chunks/config-CjawSOBk.js +0 -219
- package/dist/chunks/config-store-MAVQhGMh.js +0 -1
- package/dist/chunks/factory-D7ryES9n.js +0 -240
- package/dist/chunks/knowledge-graph-cli-ByUJoKw_.js +0 -1354
- package/dist/client/assets/index-B5uVtedd.css +0 -1
- package/dist/client/assets/index-b13-NGGS.js +0 -275
|
@@ -1,341 +0,0 @@
|
|
|
1
|
-
import { b as ORCHESTRATOR_AGENT_VERBS, c as AgentFactorySetupRequest, d as AgentSpawnRequest, i as AgentAttentionRequest, l as AgentFactoryStatusRequest, o as AgentEditRequest, s as AgentFactoryRetryRequest, t as AGENT_API_VERBS } from "./session-BlT68ppa.js";
|
|
2
|
-
import { c as spawnRoute, i as editRoute, n as attentionRoute, s as pushRoute, t as NO_OWN_WORKTREE_REASON } from "./session-routes-CT1JrjoT.js";
|
|
3
|
-
import { t as AgentFactoryQueueRequest } from "./factory-D7ryES9n.js";
|
|
4
|
-
import path from "node:path";
|
|
5
|
-
import crypto from "node:crypto";
|
|
6
|
-
var MAX_SPAWNS_IN_FLIGHT = 1;
|
|
7
|
-
var SPAWNABLE_DEPTH = 0;
|
|
8
|
-
var REFUSAL_REASON = "unknown session";
|
|
9
|
-
var INVALID_BODY_STATUS = 400;
|
|
10
|
-
var PUSH_REFUSED_STATUS = 409;
|
|
11
|
-
var PUSH_REFUSAL_COPY = Object.freeze({
|
|
12
|
-
"no-worktree": () => NO_OWN_WORKTREE_REASON,
|
|
13
|
-
"merge-in-progress": () => "a merge for this session is already running, so try again when it ends",
|
|
14
|
-
"not-continuable": () => "this session cannot be merged in its current state",
|
|
15
|
-
destroyed: () => "this session is ending",
|
|
16
|
-
"nothing-to-commit": () => "no commit on this branch is missing from the integration branch, so commit your work first",
|
|
17
|
-
"rebase-conflict": ({ base, conflicts = [] }) => `this branch conflicts with ${base} in ${conflicts.join(", ") || "one or more files"}, so rebase onto ${base}, resolve the conflicts, commit, then push again`,
|
|
18
|
-
"not-fast-forward": ({ base }) => `${base} could not be fast-forwarded to this branch, and a push is never forced`,
|
|
19
|
-
"base-diverged": ({ base }) => `the local ${base} and origin/${base} have diverged, which the operator has to reconcile`
|
|
20
|
-
});
|
|
21
|
-
function tokensMatch(presented, expected) {
|
|
22
|
-
if (presented.length !== expected.length) return false;
|
|
23
|
-
try {
|
|
24
|
-
return crypto.timingSafeEqual(Buffer.from(presented, "utf8"), Buffer.from(expected, "utf8"));
|
|
25
|
-
} catch {
|
|
26
|
-
return false;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
function refused() {
|
|
30
|
-
return {
|
|
31
|
-
ok: false,
|
|
32
|
-
status: 404,
|
|
33
|
-
reason: REFUSAL_REASON
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
function decideAgentRequest({ sessionId, presentedToken, expectedToken, isLoopback }) {
|
|
37
|
-
if (!isLoopback) return refused();
|
|
38
|
-
if (!sessionId) return refused();
|
|
39
|
-
if (!expectedToken) return refused();
|
|
40
|
-
if (!presentedToken) return refused();
|
|
41
|
-
if (!tokensMatch(presentedToken, expectedToken)) return refused();
|
|
42
|
-
return { ok: true };
|
|
43
|
-
}
|
|
44
|
-
function refuseByRole(route) {
|
|
45
|
-
if (route.answers) return { ok: true };
|
|
46
|
-
return {
|
|
47
|
-
ok: false,
|
|
48
|
-
status: 403,
|
|
49
|
-
reason: route.reason
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
function decideSpawnAllowance({ liveChildren, lifetimeSpawns, inFlight, depth, isFactoryWorker, isEphemeral }) {
|
|
53
|
-
const role = refuseByRole(spawnRoute({
|
|
54
|
-
isEphemeral,
|
|
55
|
-
isSpawnedChild: depth !== SPAWNABLE_DEPTH,
|
|
56
|
-
factoryRole: isFactoryWorker ? "worker" : null
|
|
57
|
-
}));
|
|
58
|
-
if (!role.ok) return role;
|
|
59
|
-
if (inFlight >= MAX_SPAWNS_IN_FLIGHT) return {
|
|
60
|
-
ok: false,
|
|
61
|
-
status: 429,
|
|
62
|
-
reason: "a spawn is already in flight"
|
|
63
|
-
};
|
|
64
|
-
if (liveChildren >= 3) return {
|
|
65
|
-
ok: false,
|
|
66
|
-
status: 429,
|
|
67
|
-
reason: `at most 3 spawned sessions may be live at once`
|
|
68
|
-
};
|
|
69
|
-
if (lifetimeSpawns >= 10) return {
|
|
70
|
-
ok: false,
|
|
71
|
-
status: 429,
|
|
72
|
-
reason: `this session has used its 10 spawns`
|
|
73
|
-
};
|
|
74
|
-
return { ok: true };
|
|
75
|
-
}
|
|
76
|
-
function decideAttentionAllowance(caller) {
|
|
77
|
-
return refuseByRole(attentionRoute(caller));
|
|
78
|
-
}
|
|
79
|
-
function decideEditAllowance(caller) {
|
|
80
|
-
return refuseByRole(editRoute(caller));
|
|
81
|
-
}
|
|
82
|
-
function factoryControlRoute({ factoryRole, isEphemeral, isSpawnedChild }) {
|
|
83
|
-
if (!(factoryRole !== null || isEphemeral && !isSpawnedChild)) return { answers: true };
|
|
84
|
-
return {
|
|
85
|
-
answers: false,
|
|
86
|
-
reason: "only an operator session or a session it spawned may use the factory commands, so factory and lane sessions stay on their own task"
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
function decideFactoryControlAllowance(caller) {
|
|
90
|
-
return refuseByRole(factoryControlRoute(caller));
|
|
91
|
-
}
|
|
92
|
-
function describePushRouteRefusal(caller) {
|
|
93
|
-
const route = pushRoute(caller);
|
|
94
|
-
if (route.answers) return null;
|
|
95
|
-
return {
|
|
96
|
-
status: PUSH_REFUSED_STATUS,
|
|
97
|
-
body: {
|
|
98
|
-
ok: false,
|
|
99
|
-
reason: route.code,
|
|
100
|
-
error: route.reason
|
|
101
|
-
}
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
function isAgentApiVerb(verb) {
|
|
105
|
-
return AGENT_API_VERBS.includes(verb);
|
|
106
|
-
}
|
|
107
|
-
function isOrchestratorAgentVerb(verb) {
|
|
108
|
-
return ORCHESTRATOR_AGENT_VERBS.includes(verb);
|
|
109
|
-
}
|
|
110
|
-
var TICKET_ACTION_STATES = Object.freeze({
|
|
111
|
-
reopen: Object.freeze(["blocked"]),
|
|
112
|
-
cancel: Object.freeze(["open", "blocked"])
|
|
113
|
-
});
|
|
114
|
-
function decideTicketAction({ verb, intentId, ticket }) {
|
|
115
|
-
if (!ticket) return {
|
|
116
|
-
ok: false,
|
|
117
|
-
reason: "no such ticket"
|
|
118
|
-
};
|
|
119
|
-
if (ticket.parent !== intentId) return {
|
|
120
|
-
ok: false,
|
|
121
|
-
reason: "the ticket is not a child of the active intent"
|
|
122
|
-
};
|
|
123
|
-
const allowed = TICKET_ACTION_STATES[verb];
|
|
124
|
-
if (!allowed.includes(ticket.state)) return {
|
|
125
|
-
ok: false,
|
|
126
|
-
reason: `only a ${allowed.join(" or ")} ticket can be ${verb === "reopen" ? "reopened" : "cancelled"}, and this one is ${ticket.state}`
|
|
127
|
-
};
|
|
128
|
-
if (verb === "reopen") return {
|
|
129
|
-
ok: true,
|
|
130
|
-
kind: "transition",
|
|
131
|
-
to: "open"
|
|
132
|
-
};
|
|
133
|
-
return {
|
|
134
|
-
ok: true,
|
|
135
|
-
kind: "close",
|
|
136
|
-
outcome: "cancelled"
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
function refuseInvalidBody(issues) {
|
|
140
|
-
return {
|
|
141
|
-
ok: false,
|
|
142
|
-
status: INVALID_BODY_STATUS,
|
|
143
|
-
error: issues[0]?.message || "invalid request"
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
|
-
function parseAgentVerb(verb, payload) {
|
|
147
|
-
if (!isAgentApiVerb(verb)) return {
|
|
148
|
-
ok: false,
|
|
149
|
-
status: 404,
|
|
150
|
-
error: REFUSAL_REASON
|
|
151
|
-
};
|
|
152
|
-
if (verb === "factory-status") {
|
|
153
|
-
const parsed = AgentFactoryStatusRequest.safeParse(payload);
|
|
154
|
-
if (!parsed.success) return refuseInvalidBody(parsed.error.issues);
|
|
155
|
-
return {
|
|
156
|
-
ok: true,
|
|
157
|
-
verb,
|
|
158
|
-
request: parsed.data
|
|
159
|
-
};
|
|
160
|
-
}
|
|
161
|
-
if (verb === "factory-retry") {
|
|
162
|
-
const parsed = AgentFactoryRetryRequest.safeParse(payload);
|
|
163
|
-
if (!parsed.success) return refuseInvalidBody(parsed.error.issues);
|
|
164
|
-
return {
|
|
165
|
-
ok: true,
|
|
166
|
-
verb,
|
|
167
|
-
request: parsed.data
|
|
168
|
-
};
|
|
169
|
-
}
|
|
170
|
-
if (verb === "factory-setup") {
|
|
171
|
-
const parsed = AgentFactorySetupRequest.safeParse(payload);
|
|
172
|
-
if (!parsed.success) return refuseInvalidBody(parsed.error.issues);
|
|
173
|
-
return {
|
|
174
|
-
ok: true,
|
|
175
|
-
verb,
|
|
176
|
-
request: parsed.data
|
|
177
|
-
};
|
|
178
|
-
}
|
|
179
|
-
if (verb === "factory-queue") {
|
|
180
|
-
const parsed = AgentFactoryQueueRequest.safeParse(payload);
|
|
181
|
-
if (!parsed.success) return refuseInvalidBody(parsed.error.issues);
|
|
182
|
-
return {
|
|
183
|
-
ok: true,
|
|
184
|
-
verb,
|
|
185
|
-
request: parsed.data
|
|
186
|
-
};
|
|
187
|
-
}
|
|
188
|
-
if (isOrchestratorAgentVerb(verb)) return {
|
|
189
|
-
ok: false,
|
|
190
|
-
status: 403,
|
|
191
|
-
error: `${verb} requires a live factory orchestrator`
|
|
192
|
-
};
|
|
193
|
-
if (verb === "board" || verb === "push" || verb === "limits") return {
|
|
194
|
-
ok: true,
|
|
195
|
-
verb
|
|
196
|
-
};
|
|
197
|
-
if (verb === "attention") {
|
|
198
|
-
const parsed = AgentAttentionRequest.safeParse(payload);
|
|
199
|
-
if (!parsed.success) return refuseInvalidBody(parsed.error.issues);
|
|
200
|
-
return {
|
|
201
|
-
ok: true,
|
|
202
|
-
verb,
|
|
203
|
-
request: parsed.data
|
|
204
|
-
};
|
|
205
|
-
}
|
|
206
|
-
if (verb === "edit") {
|
|
207
|
-
const parsed = AgentEditRequest.safeParse(payload);
|
|
208
|
-
if (!parsed.success) return refuseInvalidBody(parsed.error.issues);
|
|
209
|
-
return {
|
|
210
|
-
ok: true,
|
|
211
|
-
verb,
|
|
212
|
-
request: parsed.data
|
|
213
|
-
};
|
|
214
|
-
}
|
|
215
|
-
const parsed = AgentSpawnRequest.safeParse(payload);
|
|
216
|
-
if (!parsed.success) return refuseInvalidBody(parsed.error.issues);
|
|
217
|
-
return {
|
|
218
|
-
ok: true,
|
|
219
|
-
verb,
|
|
220
|
-
request: parsed.data
|
|
221
|
-
};
|
|
222
|
-
}
|
|
223
|
-
function describePushLanding(landing) {
|
|
224
|
-
if (!landing.merged) {
|
|
225
|
-
const reason = landing.reason || "unknown";
|
|
226
|
-
const explain = PUSH_REFUSAL_COPY[reason];
|
|
227
|
-
return {
|
|
228
|
-
status: PUSH_REFUSED_STATUS,
|
|
229
|
-
body: {
|
|
230
|
-
ok: false,
|
|
231
|
-
reason,
|
|
232
|
-
error: explain ? explain(landing) : `the merge stopped: ${reason}`
|
|
233
|
-
}
|
|
234
|
-
};
|
|
235
|
-
}
|
|
236
|
-
if (landing.pushed) return {
|
|
237
|
-
status: 200,
|
|
238
|
-
body: {
|
|
239
|
-
ok: true,
|
|
240
|
-
landedOn: landing.base ?? null,
|
|
241
|
-
pushed: true
|
|
242
|
-
}
|
|
243
|
-
};
|
|
244
|
-
return {
|
|
245
|
-
status: 200,
|
|
246
|
-
body: {
|
|
247
|
-
ok: true,
|
|
248
|
-
landedOn: landing.base ?? null,
|
|
249
|
-
pushed: false,
|
|
250
|
-
note: "landed locally and nothing was pushed, because the repository has no origin remote or origin did not take a fast-forward"
|
|
251
|
-
}
|
|
252
|
-
};
|
|
253
|
-
}
|
|
254
|
-
function deriveChildSessionName(parentName, existingNames) {
|
|
255
|
-
const base = `${String(parentName || "").trim() || "session"} agent`;
|
|
256
|
-
const taken = new Set(existingNames);
|
|
257
|
-
let candidate = base;
|
|
258
|
-
let suffix = 1;
|
|
259
|
-
while (taken.has(candidate)) {
|
|
260
|
-
suffix += 1;
|
|
261
|
-
candidate = `${base} ${suffix}`;
|
|
262
|
-
}
|
|
263
|
-
return candidate;
|
|
264
|
-
}
|
|
265
|
-
function factoryTicketNextAction(ticket, intentId) {
|
|
266
|
-
if (ticket.state === "completed" || ticket.state === "cancelled") return "none";
|
|
267
|
-
if (ticket.parked) return `glimmervoid factory retry ${intentId}`;
|
|
268
|
-
if (ticket.state === "blocked") return "orchestrator reopens";
|
|
269
|
-
return "in progress";
|
|
270
|
-
}
|
|
271
|
-
function describeFactoryProjectUnavailability(project) {
|
|
272
|
-
if (project.error !== null) return project.error;
|
|
273
|
-
if (project.heading.action === "refuse") return `orientation refused: ${project.heading.reasons.join("; ") || "no reason given"}`;
|
|
274
|
-
return null;
|
|
275
|
-
}
|
|
276
|
-
function describeUnavailableFactoryState(projects) {
|
|
277
|
-
for (const project of projects) {
|
|
278
|
-
const unavailability = describeFactoryProjectUnavailability(project);
|
|
279
|
-
if (unavailability !== null) return `Factory state for ${project.projectId} is unavailable: ${unavailability}`;
|
|
280
|
-
}
|
|
281
|
-
return null;
|
|
282
|
-
}
|
|
283
|
-
function describeSpentToday(spentTodayUsd) {
|
|
284
|
-
if (spentTodayUsd === void 0) return "unknown";
|
|
285
|
-
return `$${spentTodayUsd.toFixed(2)}`;
|
|
286
|
-
}
|
|
287
|
-
function describeDailyBudget(dailyBudgetUsd) {
|
|
288
|
-
if (dailyBudgetUsd === null) return "unlimited";
|
|
289
|
-
if (dailyBudgetUsd === void 0) return "unknown";
|
|
290
|
-
return `$${dailyBudgetUsd.toFixed(2)}`;
|
|
291
|
-
}
|
|
292
|
-
function formatFactoryStatus(projects, buildDigest) {
|
|
293
|
-
const lines = [];
|
|
294
|
-
for (const project of projects) {
|
|
295
|
-
lines.push(`Project ${project.projectId}: ${project.projectName}`);
|
|
296
|
-
lines.push(`Project spend today: ${describeSpentToday(project.spentTodayUsd)} of ${describeDailyBudget(project.dailyBudgetUsd)} budget`);
|
|
297
|
-
const unavailability = describeFactoryProjectUnavailability(project);
|
|
298
|
-
if (unavailability !== null) lines.push(`Factory exception: ${unavailability}`);
|
|
299
|
-
const ticketsByIntentId = /* @__PURE__ */ new Map();
|
|
300
|
-
const partialIntentIds = new Set(project.partialIntentIds ?? []);
|
|
301
|
-
for (const order of project.orders) {
|
|
302
|
-
if (order.parent === null) continue;
|
|
303
|
-
const tickets = ticketsByIntentId.get(order.parent) ?? [];
|
|
304
|
-
tickets.push(order);
|
|
305
|
-
ticketsByIntentId.set(order.parent, tickets);
|
|
306
|
-
}
|
|
307
|
-
let intentCount = 0;
|
|
308
|
-
for (const intent of project.orders) {
|
|
309
|
-
if (intent.parent !== null || intent.state === "cancelled") continue;
|
|
310
|
-
intentCount += 1;
|
|
311
|
-
const tickets = ticketsByIntentId.get(intent.id) ?? [];
|
|
312
|
-
const digest = buildDigest({
|
|
313
|
-
...project,
|
|
314
|
-
orders: [intent, ...tickets],
|
|
315
|
-
partialIntentIds: partialIntentIds.has(intent.id) ? [intent.id] : []
|
|
316
|
-
}, intent.id);
|
|
317
|
-
const outcome = intent.state === "completed" ? "completed" : digest.isPartial ? "partial" : "in progress";
|
|
318
|
-
lines.push(`Intent ${intent.id}: ${intent.objective}`, `Outcome: ${outcome}; merged: ${digest.merged.length}; parked: ${digest.parked.length}`);
|
|
319
|
-
for (const ticket of tickets) lines.push(` ${ticket.id} | state: ${ticket.parked ? "parked" : ticket.state} | blocks: ${ticket.blockCount ?? 0} | last reason: ${ticket.blockReason ?? "none"} | next action: ${factoryTicketNextAction(ticket, intent.id)}`);
|
|
320
|
-
lines.push("Confirmed flakes:");
|
|
321
|
-
for (const flake of digest.confirmedFlakes) lines.push(` ${flake}`);
|
|
322
|
-
if (digest.confirmedFlakes.length === 0) lines.push(" none");
|
|
323
|
-
}
|
|
324
|
-
if (intentCount === 0 && unavailability === null) lines.push("No intents.");
|
|
325
|
-
}
|
|
326
|
-
return lines.join("\n") || "No factory projects.";
|
|
327
|
-
}
|
|
328
|
-
function findSessionProjectId(projects, sessionPath) {
|
|
329
|
-
const resolvedSessionPath = path.resolve(sessionPath);
|
|
330
|
-
return projects?.find((project) => path.resolve(project.path) === resolvedSessionPath)?.id ?? null;
|
|
331
|
-
}
|
|
332
|
-
var FACTORY_QUEUE_STEP = "glimmervoid factory queue <intent.json>, with an intent cut by the spec skill or written in the Factory tab request shape";
|
|
333
|
-
function describeFactorySetupProfile(profile, isFactoryProject) {
|
|
334
|
-
return [
|
|
335
|
-
`Factory checks: ${profile.checks?.join(", ") || "none"}`,
|
|
336
|
-
`Focused test command: ${profile.focusedTestCommand ?? "none proven, so every ticket runs the full checks"}`,
|
|
337
|
-
isFactoryProject ? `Next: ${FACTORY_QUEUE_STEP}` : `Next: commit a coherence.config.json holding {} at the repository root, land it with glimmervoid push, then ${FACTORY_QUEUE_STEP}`
|
|
338
|
-
].join("\n");
|
|
339
|
-
}
|
|
340
|
-
//#endregion
|
|
341
|
-
export { parseAgentVerb as _, decideFactoryControlAllowance as a, deriveChildSessionName as c, describePushRouteRefusal as d, describeUnavailableFactoryState as f, isOrchestratorAgentVerb as g, isAgentApiVerb as h, decideEditAllowance as i, describeFactorySetupProfile as l, formatFactoryStatus as m, decideAgentRequest as n, decideSpawnAllowance as o, findSessionProjectId as p, decideAttentionAllowance as r, decideTicketAction as s, REFUSAL_REASON as t, describePushLanding as u };
|