@integrity-labs/agt-cli 0.28.27 → 0.28.29
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/bin/agt.js +4 -4
- package/dist/{chunk-G6KRGRHY.js → chunk-FIB2OQLF.js} +2 -2
- package/dist/{chunk-IHPN6AX7.js → chunk-SR6RHUAV.js} +2 -2
- package/dist/{chunk-SN2G4B2Z.js → chunk-VIIPFWE4.js} +254 -254
- package/dist/chunk-VIIPFWE4.js.map +1 -0
- package/dist/{claude-pair-runtime-UKOL6GWJ.js → claude-pair-runtime-RLIUZRLZ.js} +2 -2
- package/dist/lib/manager-worker.js +590 -586
- package/dist/lib/manager-worker.js.map +1 -1
- package/dist/mcp/direct-chat-channel.js +61 -17
- package/dist/{persistent-session-34CY65FC.js → persistent-session-JHBXSNVW.js} +3 -3
- package/dist/{responsiveness-probe-KKWPOZSX.js → responsiveness-probe-SKVWT5CO.js} +3 -3
- package/package.json +1 -1
- package/dist/chunk-SN2G4B2Z.js.map +0 -1
- /package/dist/{chunk-G6KRGRHY.js.map → chunk-FIB2OQLF.js.map} +0 -0
- /package/dist/{chunk-IHPN6AX7.js.map → chunk-SR6RHUAV.js.map} +0 -0
- /package/dist/{claude-pair-runtime-UKOL6GWJ.js.map → claude-pair-runtime-RLIUZRLZ.js.map} +0 -0
- /package/dist/{persistent-session-34CY65FC.js.map → persistent-session-JHBXSNVW.js.map} +0 -0
- /package/dist/{responsiveness-probe-KKWPOZSX.js.map → responsiveness-probe-SKVWT5CO.js.map} +0 -0
package/dist/bin/agt.js
CHANGED
|
@@ -33,7 +33,7 @@ import {
|
|
|
33
33
|
success,
|
|
34
34
|
table,
|
|
35
35
|
warn
|
|
36
|
-
} from "../chunk-
|
|
36
|
+
} from "../chunk-FIB2OQLF.js";
|
|
37
37
|
import {
|
|
38
38
|
CHANNEL_REGISTRY,
|
|
39
39
|
DEPLOYMENT_TEMPLATES,
|
|
@@ -60,7 +60,7 @@ import {
|
|
|
60
60
|
renderTemplate,
|
|
61
61
|
resolveChannels,
|
|
62
62
|
serializeManifestForSlackCli
|
|
63
|
-
} from "../chunk-
|
|
63
|
+
} from "../chunk-VIIPFWE4.js";
|
|
64
64
|
|
|
65
65
|
// src/bin/agt.ts
|
|
66
66
|
import { join as join21 } from "path";
|
|
@@ -4773,7 +4773,7 @@ import { execFileSync, execSync } from "child_process";
|
|
|
4773
4773
|
import { existsSync as existsSync10, realpathSync as realpathSync2 } from "fs";
|
|
4774
4774
|
import chalk18 from "chalk";
|
|
4775
4775
|
import ora16 from "ora";
|
|
4776
|
-
var cliVersion = true ? "0.28.
|
|
4776
|
+
var cliVersion = true ? "0.28.29" : "dev";
|
|
4777
4777
|
async function fetchLatestVersion() {
|
|
4778
4778
|
const host2 = getHost();
|
|
4779
4779
|
if (!host2) return null;
|
|
@@ -5696,7 +5696,7 @@ function handleError(err) {
|
|
|
5696
5696
|
}
|
|
5697
5697
|
|
|
5698
5698
|
// src/bin/agt.ts
|
|
5699
|
-
var cliVersion2 = true ? "0.28.
|
|
5699
|
+
var cliVersion2 = true ? "0.28.29" : "dev";
|
|
5700
5700
|
var program = new Command();
|
|
5701
5701
|
program.name("agt").description("Augmented CLI \u2014 agent provisioning and management").version(cliVersion2).option("--json", "Emit machine-readable JSON output (suppress spinners and colors)").option("--skip-update-check", "Skip the automatic update check on startup");
|
|
5702
5702
|
program.hook("preAction", async (thisCommand, actionCommand) => {
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
registerFramework,
|
|
15
15
|
resolveAvatarEnvUrl,
|
|
16
16
|
wrapScheduledTaskPrompt
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-VIIPFWE4.js";
|
|
18
18
|
|
|
19
19
|
// ../../packages/core/dist/integrations/registry.js
|
|
20
20
|
var INTEGRATION_REGISTRY = [
|
|
@@ -8313,4 +8313,4 @@ export {
|
|
|
8313
8313
|
managerInstallSystemUnitCommand,
|
|
8314
8314
|
managerUninstallSystemUnitCommand
|
|
8315
8315
|
};
|
|
8316
|
-
//# sourceMappingURL=chunk-
|
|
8316
|
+
//# sourceMappingURL=chunk-FIB2OQLF.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
claudeModelAlias,
|
|
3
3
|
isClaudeFastMode
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-VIIPFWE4.js";
|
|
5
5
|
import {
|
|
6
6
|
reapOrphanChannelMcps
|
|
7
7
|
} from "./chunk-XWVM4KPK.js";
|
|
@@ -1487,4 +1487,4 @@ export {
|
|
|
1487
1487
|
stopAllSessionsAndWait,
|
|
1488
1488
|
getProjectDir
|
|
1489
1489
|
};
|
|
1490
|
-
//# sourceMappingURL=chunk-
|
|
1490
|
+
//# sourceMappingURL=chunk-SR6RHUAV.js.map
|
|
@@ -116,259 +116,6 @@ function stripPriorRunsBlock(wrappedPrompt) {
|
|
|
116
116
|
return wrappedPrompt.slice(0, start) + wrappedPrompt.slice(stripEnd);
|
|
117
117
|
}
|
|
118
118
|
|
|
119
|
-
// ../../packages/core/dist/delivery/parse.js
|
|
120
|
-
function parseDeliveryTarget(raw) {
|
|
121
|
-
if (raw === null || typeof raw !== "object" || Array.isArray(raw)) {
|
|
122
|
-
return {
|
|
123
|
-
ok: false,
|
|
124
|
-
code: "MALFORMED_DELIVERY_TARGET",
|
|
125
|
-
detail: "delivery_to must be a JSON object"
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
const obj = raw;
|
|
129
|
-
const kind = obj["kind"];
|
|
130
|
-
if (kind === "channel") {
|
|
131
|
-
return parseChannelTarget(obj);
|
|
132
|
-
}
|
|
133
|
-
if (kind === "dm") {
|
|
134
|
-
return parseDmTarget(obj);
|
|
135
|
-
}
|
|
136
|
-
return {
|
|
137
|
-
ok: false,
|
|
138
|
-
code: "UNKNOWN_KIND",
|
|
139
|
-
detail: `delivery_to.kind must be 'channel' or 'dm' (got ${JSON.stringify(kind)})`
|
|
140
|
-
};
|
|
141
|
-
}
|
|
142
|
-
function parseChannelTarget(obj) {
|
|
143
|
-
const provider = obj["provider"];
|
|
144
|
-
if (provider === "slack") {
|
|
145
|
-
const channelId = obj["channel_id"];
|
|
146
|
-
if (typeof channelId !== "string" || channelId.length === 0) {
|
|
147
|
-
return {
|
|
148
|
-
ok: false,
|
|
149
|
-
code: "MISSING_CHANNEL_ID",
|
|
150
|
-
detail: "channel:slack target requires a non-empty channel_id"
|
|
151
|
-
};
|
|
152
|
-
}
|
|
153
|
-
const threadTs = obj["thread_ts"];
|
|
154
|
-
if (threadTs !== void 0 && threadTs !== null) {
|
|
155
|
-
if (typeof threadTs !== "string" || threadTs.length === 0) {
|
|
156
|
-
return {
|
|
157
|
-
ok: false,
|
|
158
|
-
code: "MALFORMED_DELIVERY_TARGET",
|
|
159
|
-
detail: "channel:slack thread_ts must be a non-empty string when present"
|
|
160
|
-
};
|
|
161
|
-
}
|
|
162
|
-
return { kind: "channel", provider: "slack", channel_id: channelId, thread_ts: threadTs };
|
|
163
|
-
}
|
|
164
|
-
return { kind: "channel", provider: "slack", channel_id: channelId };
|
|
165
|
-
}
|
|
166
|
-
if (provider === "telegram") {
|
|
167
|
-
const chatId = obj["chat_id"];
|
|
168
|
-
if (typeof chatId !== "string" || chatId.length === 0) {
|
|
169
|
-
return {
|
|
170
|
-
ok: false,
|
|
171
|
-
code: "MISSING_CHAT_ID",
|
|
172
|
-
detail: "channel:telegram target requires a non-empty chat_id"
|
|
173
|
-
};
|
|
174
|
-
}
|
|
175
|
-
return { kind: "channel", provider: "telegram", chat_id: chatId };
|
|
176
|
-
}
|
|
177
|
-
return {
|
|
178
|
-
ok: false,
|
|
179
|
-
code: "UNKNOWN_PROVIDER",
|
|
180
|
-
detail: `channel.provider must be 'slack' or 'telegram' (got ${JSON.stringify(provider)})`
|
|
181
|
-
};
|
|
182
|
-
}
|
|
183
|
-
var SUPPORTED_MEDIUMS = /* @__PURE__ */ new Set(["auto", "slack", "telegram"]);
|
|
184
|
-
var RESERVED_MEDIUMS = /* @__PURE__ */ new Set(["teams", "whatsapp", "imessage"]);
|
|
185
|
-
function parseDmTarget(obj) {
|
|
186
|
-
const personId = obj["person_id"];
|
|
187
|
-
if (typeof personId !== "string" || personId.length === 0) {
|
|
188
|
-
return {
|
|
189
|
-
ok: false,
|
|
190
|
-
code: "MISSING_PERSON_ID",
|
|
191
|
-
detail: "dm target requires a non-empty person_id"
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
|
-
const followReportsTo = obj["follow_reports_to"];
|
|
195
|
-
if (typeof followReportsTo !== "boolean") {
|
|
196
|
-
return {
|
|
197
|
-
ok: false,
|
|
198
|
-
code: "MALFORMED_DELIVERY_TARGET",
|
|
199
|
-
detail: "dm.follow_reports_to must be a boolean"
|
|
200
|
-
};
|
|
201
|
-
}
|
|
202
|
-
const medium = obj["medium"];
|
|
203
|
-
if (typeof medium !== "string") {
|
|
204
|
-
return {
|
|
205
|
-
ok: false,
|
|
206
|
-
code: "MALFORMED_DELIVERY_TARGET",
|
|
207
|
-
detail: "dm.medium must be a string"
|
|
208
|
-
};
|
|
209
|
-
}
|
|
210
|
-
if (RESERVED_MEDIUMS.has(medium)) {
|
|
211
|
-
return {
|
|
212
|
-
ok: false,
|
|
213
|
-
code: "DM_MEDIUM_NOT_SUPPORTED",
|
|
214
|
-
detail: `dm.medium '${medium}' is reserved but not yet dispatchable (ENG-4427)`
|
|
215
|
-
};
|
|
216
|
-
}
|
|
217
|
-
if (!SUPPORTED_MEDIUMS.has(medium)) {
|
|
218
|
-
return {
|
|
219
|
-
ok: false,
|
|
220
|
-
code: "UNKNOWN_MEDIUM",
|
|
221
|
-
detail: `dm.medium must be 'auto', 'slack', or 'telegram' (got ${JSON.stringify(medium)})`
|
|
222
|
-
};
|
|
223
|
-
}
|
|
224
|
-
return {
|
|
225
|
-
kind: "dm",
|
|
226
|
-
person_id: personId,
|
|
227
|
-
follow_reports_to: followReportsTo,
|
|
228
|
-
medium
|
|
229
|
-
};
|
|
230
|
-
}
|
|
231
|
-
function isParseError(v) {
|
|
232
|
-
return typeof v === "object" && v !== null && "ok" in v && v.ok === false;
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
// ../../packages/core/dist/delivery/format.js
|
|
236
|
-
function formatDmFooter(teamName, agentDisplayName) {
|
|
237
|
-
const team = teamName?.trim() || "unassigned team";
|
|
238
|
-
return `\u2014 scheduled by ${team} / ${agentDisplayName}`;
|
|
239
|
-
}
|
|
240
|
-
function appendDmFooter(body, teamName, agentDisplayName) {
|
|
241
|
-
const footer = formatDmFooter(teamName, agentDisplayName);
|
|
242
|
-
const trimmed = body.replace(/\s+$/, "");
|
|
243
|
-
if (trimmed.endsWith(footer))
|
|
244
|
-
return trimmed;
|
|
245
|
-
return `${trimmed}
|
|
246
|
-
|
|
247
|
-
${footer}`;
|
|
248
|
-
}
|
|
249
|
-
function formatForOpenClawCli(target) {
|
|
250
|
-
if (target.kind === "channel") {
|
|
251
|
-
if (target.provider === "slack") {
|
|
252
|
-
if (!target.channel_id) {
|
|
253
|
-
throw new Error("INVALID_DELIVERY_TARGET: slack channel target is missing channel_id");
|
|
254
|
-
}
|
|
255
|
-
return `channel:${target.channel_id}`;
|
|
256
|
-
}
|
|
257
|
-
if (!target.chat_id) {
|
|
258
|
-
throw new Error("INVALID_DELIVERY_TARGET: telegram channel target is missing chat_id");
|
|
259
|
-
}
|
|
260
|
-
return `chat:${target.chat_id}`;
|
|
261
|
-
}
|
|
262
|
-
throw new Error(`DM_NOT_SUPPORTED_ON_FRAMEWORK: dm targets can't be passed to openclaw cron add. See ENG-4423 \xA79.1 and the follow-up ENG-4431.`);
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
// ../../packages/core/dist/delivery/resolve.js
|
|
266
|
-
function resolveDmTarget(target, agent, people) {
|
|
267
|
-
if (target.kind === "channel") {
|
|
268
|
-
if (target.provider === "slack") {
|
|
269
|
-
return {
|
|
270
|
-
ok: true,
|
|
271
|
-
kind: "channel",
|
|
272
|
-
provider: "slack",
|
|
273
|
-
channel_id: target.channel_id ?? "",
|
|
274
|
-
// ENG-6038: carry the originating-thread coordinate through to
|
|
275
|
-
// dispatch. Absent → top-level post (pre-ENG-6038 behaviour).
|
|
276
|
-
...target.thread_ts ? { thread_ts: target.thread_ts } : {}
|
|
277
|
-
};
|
|
278
|
-
}
|
|
279
|
-
return {
|
|
280
|
-
ok: true,
|
|
281
|
-
kind: "channel",
|
|
282
|
-
provider: "telegram",
|
|
283
|
-
chat_id: target.chat_id ?? ""
|
|
284
|
-
};
|
|
285
|
-
}
|
|
286
|
-
const effectivePersonId = resolveEffectivePersonId(target, agent);
|
|
287
|
-
if ("ok" in effectivePersonId)
|
|
288
|
-
return effectivePersonId;
|
|
289
|
-
const person = people.get(effectivePersonId.person_id);
|
|
290
|
-
if (!person) {
|
|
291
|
-
return {
|
|
292
|
-
ok: false,
|
|
293
|
-
code: "DM_TARGET_PERSON_NOT_FOUND",
|
|
294
|
-
detail: `person ${effectivePersonId.person_id} not present in resolver people map`
|
|
295
|
-
};
|
|
296
|
-
}
|
|
297
|
-
const FALLBACK_ORDER = ["slack", "telegram"];
|
|
298
|
-
const preferredMedium = target.medium === "auto" ? null : target.medium;
|
|
299
|
-
const chosenMedium = preferredMedium ? agent.dm_capable_mediums.includes(preferredMedium) && personHasMedium(person, preferredMedium) ? preferredMedium : null : FALLBACK_ORDER.find((m) => agent.dm_capable_mediums.includes(m) && personHasMedium(person, m)) ?? null;
|
|
300
|
-
if (!chosenMedium) {
|
|
301
|
-
return {
|
|
302
|
-
ok: false,
|
|
303
|
-
code: "DM_TARGET_NO_REACHABLE_MEDIUM",
|
|
304
|
-
detail: `agent and person ${person.person_id} share no DM-capable medium`
|
|
305
|
-
};
|
|
306
|
-
}
|
|
307
|
-
if (chosenMedium === "slack") {
|
|
308
|
-
return {
|
|
309
|
-
ok: true,
|
|
310
|
-
kind: "dm",
|
|
311
|
-
medium: "slack",
|
|
312
|
-
slack_user_id: person.slack_user_id,
|
|
313
|
-
recipient_person_id: person.person_id
|
|
314
|
-
};
|
|
315
|
-
}
|
|
316
|
-
return {
|
|
317
|
-
ok: true,
|
|
318
|
-
kind: "dm",
|
|
319
|
-
medium: "telegram",
|
|
320
|
-
telegram_chat_id: person.telegram_chat_id,
|
|
321
|
-
recipient_person_id: person.person_id
|
|
322
|
-
};
|
|
323
|
-
}
|
|
324
|
-
function resolveEffectivePersonId(target, agent) {
|
|
325
|
-
if (target.follow_reports_to) {
|
|
326
|
-
if (agent.reports_to_type !== "person" || !agent.reports_to_person_id) {
|
|
327
|
-
return {
|
|
328
|
-
ok: false,
|
|
329
|
-
code: "DM_FOLLOW_TARGET_NOT_PERSON",
|
|
330
|
-
detail: "follow_reports_to=true but the agent has no person-typed reports_to at dispatch time"
|
|
331
|
-
};
|
|
332
|
-
}
|
|
333
|
-
return { person_id: agent.reports_to_person_id };
|
|
334
|
-
}
|
|
335
|
-
return { person_id: target.person_id };
|
|
336
|
-
}
|
|
337
|
-
function personHasMedium(person, medium) {
|
|
338
|
-
if (medium === "slack")
|
|
339
|
-
return Boolean(person.slack_user_id);
|
|
340
|
-
return Boolean(person.telegram_chat_id);
|
|
341
|
-
}
|
|
342
|
-
function isResolveError(v) {
|
|
343
|
-
return "ok" in v && v.ok === false;
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
// ../../packages/core/dist/delivery/console-url.js
|
|
347
|
-
function deriveConsoleUrl(apiUrl) {
|
|
348
|
-
const trimmed = apiUrl?.trim();
|
|
349
|
-
if (!trimmed)
|
|
350
|
-
return null;
|
|
351
|
-
let parsed;
|
|
352
|
-
try {
|
|
353
|
-
parsed = new URL(trimmed);
|
|
354
|
-
} catch {
|
|
355
|
-
return null;
|
|
356
|
-
}
|
|
357
|
-
const host = parsed.hostname;
|
|
358
|
-
if (host === "api.agt.localhost") {
|
|
359
|
-
parsed.hostname = "console.agt.localhost";
|
|
360
|
-
return stripTrailingSlash(parsed.toString());
|
|
361
|
-
}
|
|
362
|
-
if (host.startsWith("api.")) {
|
|
363
|
-
parsed.hostname = `app.${host.slice(4)}`;
|
|
364
|
-
return stripTrailingSlash(parsed.toString());
|
|
365
|
-
}
|
|
366
|
-
return null;
|
|
367
|
-
}
|
|
368
|
-
function stripTrailingSlash(value) {
|
|
369
|
-
return value.replace(/\/+$/, "");
|
|
370
|
-
}
|
|
371
|
-
|
|
372
119
|
// ../../packages/core/dist/types/models.js
|
|
373
120
|
var DEFAULT_MODELS = {
|
|
374
121
|
primary: "openrouter/anthropic/claude-opus-4-6",
|
|
@@ -4668,6 +4415,259 @@ function detectDrift(snapshot, liveState, agentId, codeName, riskTier) {
|
|
|
4668
4415
|
};
|
|
4669
4416
|
}
|
|
4670
4417
|
|
|
4418
|
+
// ../../packages/core/dist/delivery/parse.js
|
|
4419
|
+
function parseDeliveryTarget(raw) {
|
|
4420
|
+
if (raw === null || typeof raw !== "object" || Array.isArray(raw)) {
|
|
4421
|
+
return {
|
|
4422
|
+
ok: false,
|
|
4423
|
+
code: "MALFORMED_DELIVERY_TARGET",
|
|
4424
|
+
detail: "delivery_to must be a JSON object"
|
|
4425
|
+
};
|
|
4426
|
+
}
|
|
4427
|
+
const obj = raw;
|
|
4428
|
+
const kind = obj["kind"];
|
|
4429
|
+
if (kind === "channel") {
|
|
4430
|
+
return parseChannelTarget(obj);
|
|
4431
|
+
}
|
|
4432
|
+
if (kind === "dm") {
|
|
4433
|
+
return parseDmTarget(obj);
|
|
4434
|
+
}
|
|
4435
|
+
return {
|
|
4436
|
+
ok: false,
|
|
4437
|
+
code: "UNKNOWN_KIND",
|
|
4438
|
+
detail: `delivery_to.kind must be 'channel' or 'dm' (got ${JSON.stringify(kind)})`
|
|
4439
|
+
};
|
|
4440
|
+
}
|
|
4441
|
+
function parseChannelTarget(obj) {
|
|
4442
|
+
const provider = obj["provider"];
|
|
4443
|
+
if (provider === "slack") {
|
|
4444
|
+
const channelId = obj["channel_id"];
|
|
4445
|
+
if (typeof channelId !== "string" || channelId.length === 0) {
|
|
4446
|
+
return {
|
|
4447
|
+
ok: false,
|
|
4448
|
+
code: "MISSING_CHANNEL_ID",
|
|
4449
|
+
detail: "channel:slack target requires a non-empty channel_id"
|
|
4450
|
+
};
|
|
4451
|
+
}
|
|
4452
|
+
const threadTs = obj["thread_ts"];
|
|
4453
|
+
if (threadTs !== void 0 && threadTs !== null) {
|
|
4454
|
+
if (typeof threadTs !== "string" || threadTs.length === 0) {
|
|
4455
|
+
return {
|
|
4456
|
+
ok: false,
|
|
4457
|
+
code: "MALFORMED_DELIVERY_TARGET",
|
|
4458
|
+
detail: "channel:slack thread_ts must be a non-empty string when present"
|
|
4459
|
+
};
|
|
4460
|
+
}
|
|
4461
|
+
return { kind: "channel", provider: "slack", channel_id: channelId, thread_ts: threadTs };
|
|
4462
|
+
}
|
|
4463
|
+
return { kind: "channel", provider: "slack", channel_id: channelId };
|
|
4464
|
+
}
|
|
4465
|
+
if (provider === "telegram") {
|
|
4466
|
+
const chatId = obj["chat_id"];
|
|
4467
|
+
if (typeof chatId !== "string" || chatId.length === 0) {
|
|
4468
|
+
return {
|
|
4469
|
+
ok: false,
|
|
4470
|
+
code: "MISSING_CHAT_ID",
|
|
4471
|
+
detail: "channel:telegram target requires a non-empty chat_id"
|
|
4472
|
+
};
|
|
4473
|
+
}
|
|
4474
|
+
return { kind: "channel", provider: "telegram", chat_id: chatId };
|
|
4475
|
+
}
|
|
4476
|
+
return {
|
|
4477
|
+
ok: false,
|
|
4478
|
+
code: "UNKNOWN_PROVIDER",
|
|
4479
|
+
detail: `channel.provider must be 'slack' or 'telegram' (got ${JSON.stringify(provider)})`
|
|
4480
|
+
};
|
|
4481
|
+
}
|
|
4482
|
+
var SUPPORTED_MEDIUMS = /* @__PURE__ */ new Set(["auto", "slack", "telegram"]);
|
|
4483
|
+
var RESERVED_MEDIUMS = /* @__PURE__ */ new Set(["teams", "whatsapp", "imessage"]);
|
|
4484
|
+
function parseDmTarget(obj) {
|
|
4485
|
+
const personId = obj["person_id"];
|
|
4486
|
+
if (typeof personId !== "string" || personId.length === 0) {
|
|
4487
|
+
return {
|
|
4488
|
+
ok: false,
|
|
4489
|
+
code: "MISSING_PERSON_ID",
|
|
4490
|
+
detail: "dm target requires a non-empty person_id"
|
|
4491
|
+
};
|
|
4492
|
+
}
|
|
4493
|
+
const followReportsTo = obj["follow_reports_to"];
|
|
4494
|
+
if (typeof followReportsTo !== "boolean") {
|
|
4495
|
+
return {
|
|
4496
|
+
ok: false,
|
|
4497
|
+
code: "MALFORMED_DELIVERY_TARGET",
|
|
4498
|
+
detail: "dm.follow_reports_to must be a boolean"
|
|
4499
|
+
};
|
|
4500
|
+
}
|
|
4501
|
+
const medium = obj["medium"];
|
|
4502
|
+
if (typeof medium !== "string") {
|
|
4503
|
+
return {
|
|
4504
|
+
ok: false,
|
|
4505
|
+
code: "MALFORMED_DELIVERY_TARGET",
|
|
4506
|
+
detail: "dm.medium must be a string"
|
|
4507
|
+
};
|
|
4508
|
+
}
|
|
4509
|
+
if (RESERVED_MEDIUMS.has(medium)) {
|
|
4510
|
+
return {
|
|
4511
|
+
ok: false,
|
|
4512
|
+
code: "DM_MEDIUM_NOT_SUPPORTED",
|
|
4513
|
+
detail: `dm.medium '${medium}' is reserved but not yet dispatchable (ENG-4427)`
|
|
4514
|
+
};
|
|
4515
|
+
}
|
|
4516
|
+
if (!SUPPORTED_MEDIUMS.has(medium)) {
|
|
4517
|
+
return {
|
|
4518
|
+
ok: false,
|
|
4519
|
+
code: "UNKNOWN_MEDIUM",
|
|
4520
|
+
detail: `dm.medium must be 'auto', 'slack', or 'telegram' (got ${JSON.stringify(medium)})`
|
|
4521
|
+
};
|
|
4522
|
+
}
|
|
4523
|
+
return {
|
|
4524
|
+
kind: "dm",
|
|
4525
|
+
person_id: personId,
|
|
4526
|
+
follow_reports_to: followReportsTo,
|
|
4527
|
+
medium
|
|
4528
|
+
};
|
|
4529
|
+
}
|
|
4530
|
+
function isParseError(v) {
|
|
4531
|
+
return typeof v === "object" && v !== null && "ok" in v && v.ok === false;
|
|
4532
|
+
}
|
|
4533
|
+
|
|
4534
|
+
// ../../packages/core/dist/delivery/format.js
|
|
4535
|
+
function formatDmFooter(teamName, agentDisplayName) {
|
|
4536
|
+
const team = teamName?.trim() || "unassigned team";
|
|
4537
|
+
return `\u2014 scheduled by ${team} / ${agentDisplayName}`;
|
|
4538
|
+
}
|
|
4539
|
+
function appendDmFooter(body, teamName, agentDisplayName) {
|
|
4540
|
+
const footer = formatDmFooter(teamName, agentDisplayName);
|
|
4541
|
+
const trimmed = body.replace(/\s+$/, "");
|
|
4542
|
+
if (trimmed.endsWith(footer))
|
|
4543
|
+
return trimmed;
|
|
4544
|
+
return `${trimmed}
|
|
4545
|
+
|
|
4546
|
+
${footer}`;
|
|
4547
|
+
}
|
|
4548
|
+
function formatForOpenClawCli(target) {
|
|
4549
|
+
if (target.kind === "channel") {
|
|
4550
|
+
if (target.provider === "slack") {
|
|
4551
|
+
if (!target.channel_id) {
|
|
4552
|
+
throw new Error("INVALID_DELIVERY_TARGET: slack channel target is missing channel_id");
|
|
4553
|
+
}
|
|
4554
|
+
return `channel:${target.channel_id}`;
|
|
4555
|
+
}
|
|
4556
|
+
if (!target.chat_id) {
|
|
4557
|
+
throw new Error("INVALID_DELIVERY_TARGET: telegram channel target is missing chat_id");
|
|
4558
|
+
}
|
|
4559
|
+
return `chat:${target.chat_id}`;
|
|
4560
|
+
}
|
|
4561
|
+
throw new Error(`DM_NOT_SUPPORTED_ON_FRAMEWORK: dm targets can't be passed to openclaw cron add. See ENG-4423 \xA79.1 and the follow-up ENG-4431.`);
|
|
4562
|
+
}
|
|
4563
|
+
|
|
4564
|
+
// ../../packages/core/dist/delivery/resolve.js
|
|
4565
|
+
function resolveDmTarget(target, agent, people) {
|
|
4566
|
+
if (target.kind === "channel") {
|
|
4567
|
+
if (target.provider === "slack") {
|
|
4568
|
+
return {
|
|
4569
|
+
ok: true,
|
|
4570
|
+
kind: "channel",
|
|
4571
|
+
provider: "slack",
|
|
4572
|
+
channel_id: target.channel_id ?? "",
|
|
4573
|
+
// ENG-6038: carry the originating-thread coordinate through to
|
|
4574
|
+
// dispatch. Absent → top-level post (pre-ENG-6038 behaviour).
|
|
4575
|
+
...target.thread_ts ? { thread_ts: target.thread_ts } : {}
|
|
4576
|
+
};
|
|
4577
|
+
}
|
|
4578
|
+
return {
|
|
4579
|
+
ok: true,
|
|
4580
|
+
kind: "channel",
|
|
4581
|
+
provider: "telegram",
|
|
4582
|
+
chat_id: target.chat_id ?? ""
|
|
4583
|
+
};
|
|
4584
|
+
}
|
|
4585
|
+
const effectivePersonId = resolveEffectivePersonId(target, agent);
|
|
4586
|
+
if ("ok" in effectivePersonId)
|
|
4587
|
+
return effectivePersonId;
|
|
4588
|
+
const person = people.get(effectivePersonId.person_id);
|
|
4589
|
+
if (!person) {
|
|
4590
|
+
return {
|
|
4591
|
+
ok: false,
|
|
4592
|
+
code: "DM_TARGET_PERSON_NOT_FOUND",
|
|
4593
|
+
detail: `person ${effectivePersonId.person_id} not present in resolver people map`
|
|
4594
|
+
};
|
|
4595
|
+
}
|
|
4596
|
+
const FALLBACK_ORDER = ["slack", "telegram"];
|
|
4597
|
+
const preferredMedium = target.medium === "auto" ? null : target.medium;
|
|
4598
|
+
const chosenMedium = preferredMedium ? agent.dm_capable_mediums.includes(preferredMedium) && personHasMedium(person, preferredMedium) ? preferredMedium : null : FALLBACK_ORDER.find((m) => agent.dm_capable_mediums.includes(m) && personHasMedium(person, m)) ?? null;
|
|
4599
|
+
if (!chosenMedium) {
|
|
4600
|
+
return {
|
|
4601
|
+
ok: false,
|
|
4602
|
+
code: "DM_TARGET_NO_REACHABLE_MEDIUM",
|
|
4603
|
+
detail: `agent and person ${person.person_id} share no DM-capable medium`
|
|
4604
|
+
};
|
|
4605
|
+
}
|
|
4606
|
+
if (chosenMedium === "slack") {
|
|
4607
|
+
return {
|
|
4608
|
+
ok: true,
|
|
4609
|
+
kind: "dm",
|
|
4610
|
+
medium: "slack",
|
|
4611
|
+
slack_user_id: person.slack_user_id,
|
|
4612
|
+
recipient_person_id: person.person_id
|
|
4613
|
+
};
|
|
4614
|
+
}
|
|
4615
|
+
return {
|
|
4616
|
+
ok: true,
|
|
4617
|
+
kind: "dm",
|
|
4618
|
+
medium: "telegram",
|
|
4619
|
+
telegram_chat_id: person.telegram_chat_id,
|
|
4620
|
+
recipient_person_id: person.person_id
|
|
4621
|
+
};
|
|
4622
|
+
}
|
|
4623
|
+
function resolveEffectivePersonId(target, agent) {
|
|
4624
|
+
if (target.follow_reports_to) {
|
|
4625
|
+
if (agent.reports_to_type !== "person" || !agent.reports_to_person_id) {
|
|
4626
|
+
return {
|
|
4627
|
+
ok: false,
|
|
4628
|
+
code: "DM_FOLLOW_TARGET_NOT_PERSON",
|
|
4629
|
+
detail: "follow_reports_to=true but the agent has no person-typed reports_to at dispatch time"
|
|
4630
|
+
};
|
|
4631
|
+
}
|
|
4632
|
+
return { person_id: agent.reports_to_person_id };
|
|
4633
|
+
}
|
|
4634
|
+
return { person_id: target.person_id };
|
|
4635
|
+
}
|
|
4636
|
+
function personHasMedium(person, medium) {
|
|
4637
|
+
if (medium === "slack")
|
|
4638
|
+
return Boolean(person.slack_user_id);
|
|
4639
|
+
return Boolean(person.telegram_chat_id);
|
|
4640
|
+
}
|
|
4641
|
+
function isResolveError(v) {
|
|
4642
|
+
return "ok" in v && v.ok === false;
|
|
4643
|
+
}
|
|
4644
|
+
|
|
4645
|
+
// ../../packages/core/dist/delivery/console-url.js
|
|
4646
|
+
function deriveConsoleUrl(apiUrl) {
|
|
4647
|
+
const trimmed = apiUrl?.trim();
|
|
4648
|
+
if (!trimmed)
|
|
4649
|
+
return null;
|
|
4650
|
+
let parsed;
|
|
4651
|
+
try {
|
|
4652
|
+
parsed = new URL(trimmed);
|
|
4653
|
+
} catch {
|
|
4654
|
+
return null;
|
|
4655
|
+
}
|
|
4656
|
+
const host = parsed.hostname;
|
|
4657
|
+
if (host === "api.agt.localhost") {
|
|
4658
|
+
parsed.hostname = "console.agt.localhost";
|
|
4659
|
+
return stripTrailingSlash(parsed.toString());
|
|
4660
|
+
}
|
|
4661
|
+
if (host.startsWith("api.")) {
|
|
4662
|
+
parsed.hostname = `app.${host.slice(4)}`;
|
|
4663
|
+
return stripTrailingSlash(parsed.toString());
|
|
4664
|
+
}
|
|
4665
|
+
return null;
|
|
4666
|
+
}
|
|
4667
|
+
function stripTrailingSlash(value) {
|
|
4668
|
+
return value.replace(/\/+$/, "");
|
|
4669
|
+
}
|
|
4670
|
+
|
|
4671
4671
|
// ../../packages/core/dist/liveness/agent-liveness.js
|
|
4672
4672
|
var FRESH_HEARTBEAT_THRESHOLD_MS = 2 * 60 * 1e3;
|
|
4673
4673
|
|
|
@@ -5305,4 +5305,4 @@ export {
|
|
|
5305
5305
|
coerceEnvValue,
|
|
5306
5306
|
FLAGS_SCHEMA_VERSION
|
|
5307
5307
|
};
|
|
5308
|
-
//# sourceMappingURL=chunk-
|
|
5308
|
+
//# sourceMappingURL=chunk-VIIPFWE4.js.map
|