@integrity-labs/agt-cli 0.28.164 → 0.28.165

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 CHANGED
@@ -37,7 +37,7 @@ import {
37
37
  success,
38
38
  table,
39
39
  warn
40
- } from "../chunk-7YBYMQNJ.js";
40
+ } from "../chunk-KBFXXA5U.js";
41
41
  import {
42
42
  CHANNEL_REGISTRY,
43
43
  DEFAULT_FRAMEWORK,
@@ -4778,7 +4778,7 @@ import { execFileSync, execSync } from "child_process";
4778
4778
  import { existsSync as existsSync10, realpathSync as realpathSync2 } from "fs";
4779
4779
  import chalk18 from "chalk";
4780
4780
  import ora16 from "ora";
4781
- var cliVersion = true ? "0.28.164" : "dev";
4781
+ var cliVersion = true ? "0.28.165" : "dev";
4782
4782
  async function fetchLatestVersion() {
4783
4783
  const host2 = getHost();
4784
4784
  if (!host2) return null;
@@ -5792,7 +5792,7 @@ function handleError(err) {
5792
5792
  }
5793
5793
 
5794
5794
  // src/bin/agt.ts
5795
- var cliVersion2 = true ? "0.28.164" : "dev";
5795
+ var cliVersion2 = true ? "0.28.165" : "dev";
5796
5796
  var program = new Command();
5797
5797
  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");
5798
5798
  program.hook("preAction", async (thisCommand, actionCommand) => {
@@ -7948,7 +7948,7 @@ function requireHost() {
7948
7948
  }
7949
7949
 
7950
7950
  // src/lib/api-client.ts
7951
- var agtCliVersion = true ? "0.28.164" : "dev";
7951
+ var agtCliVersion = true ? "0.28.165" : "dev";
7952
7952
  var lastConfigHash = null;
7953
7953
  function setConfigHash(hash) {
7954
7954
  lastConfigHash = hash && hash.length > 0 ? hash : null;
@@ -9253,4 +9253,4 @@ export {
9253
9253
  managerInstallSystemUnitCommand,
9254
9254
  managerUninstallSystemUnitCommand
9255
9255
  };
9256
- //# sourceMappingURL=chunk-7YBYMQNJ.js.map
9256
+ //# sourceMappingURL=chunk-KBFXXA5U.js.map
@@ -28,7 +28,7 @@ import {
28
28
  requireHost,
29
29
  safeWriteJsonAtomic,
30
30
  setConfigHash
31
- } from "../chunk-7YBYMQNJ.js";
31
+ } from "../chunk-KBFXXA5U.js";
32
32
  import {
33
33
  getProjectDir as getProjectDir2,
34
34
  getReadyTasks,
@@ -6878,7 +6878,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
6878
6878
  var lastVersionCheckAt = 0;
6879
6879
  var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
6880
6880
  var lastResponsivenessProbeAt = 0;
6881
- var agtCliVersion = true ? "0.28.164" : "dev";
6881
+ var agtCliVersion = true ? "0.28.165" : "dev";
6882
6882
  function resolveBrewPath(execFileSync4) {
6883
6883
  try {
6884
6884
  const out = execFileSync4("which", ["brew"], { timeout: 5e3 }).toString().trim();
@@ -14182,6 +14182,204 @@ var Server = class extends Protocol {
14182
14182
  }
14183
14183
  };
14184
14184
 
14185
+ // src/slack-rich-text.ts
14186
+ var MAX_DEPTH = 12;
14187
+ function isRecord(v) {
14188
+ return typeof v === "object" && v !== null && !Array.isArray(v);
14189
+ }
14190
+ function asString(v) {
14191
+ return typeof v === "string" ? v : "";
14192
+ }
14193
+ function asArray(v) {
14194
+ return Array.isArray(v) ? v : [];
14195
+ }
14196
+ function isTableElement(el) {
14197
+ return isRecord(el) && asString(el.type).includes("table");
14198
+ }
14199
+ function renderEmoji(el) {
14200
+ const unicode = asString(el.unicode);
14201
+ if (unicode) {
14202
+ try {
14203
+ const cps = unicode.split("-").map((h) => parseInt(h, 16));
14204
+ if (cps.every((n) => Number.isFinite(n) && n >= 0 && n <= 1114111)) {
14205
+ return String.fromCodePoint(...cps);
14206
+ }
14207
+ } catch {
14208
+ }
14209
+ }
14210
+ const name = asString(el.name);
14211
+ return name ? `:${name}:` : "";
14212
+ }
14213
+ function renderLeaf(el) {
14214
+ if (!isRecord(el)) return "";
14215
+ switch (asString(el.type)) {
14216
+ case "text":
14217
+ return asString(el.text);
14218
+ case "link": {
14219
+ const label = asString(el.text);
14220
+ const url = asString(el.url);
14221
+ if (label && url && label !== url) return `${label} (${url})`;
14222
+ return label || url;
14223
+ }
14224
+ case "emoji":
14225
+ return renderEmoji(el);
14226
+ case "user":
14227
+ return `<@${asString(el.user_id)}>`;
14228
+ case "usergroup":
14229
+ return `<!subteam^${asString(el.usergroup_id)}>`;
14230
+ case "channel":
14231
+ return `<#${asString(el.channel_id)}>`;
14232
+ case "broadcast":
14233
+ return `@${asString(el.range) || "channel"}`;
14234
+ case "date":
14235
+ return asString(el.fallback) || asString(el.timestamp);
14236
+ default:
14237
+ if (Array.isArray(el.elements)) return renderInline(el.elements);
14238
+ return asString(el.text);
14239
+ }
14240
+ }
14241
+ function renderInline(elements) {
14242
+ return elements.map(renderLeaf).join("");
14243
+ }
14244
+ function deepText(node, depth) {
14245
+ if (depth > MAX_DEPTH) return "";
14246
+ if (typeof node === "string") return node;
14247
+ if (Array.isArray(node)) return node.map((n) => deepText(n, depth + 1)).join("");
14248
+ if (!isRecord(node)) return "";
14249
+ const type = asString(node.type);
14250
+ if (type && type !== "rich_text" && !type.startsWith("rich_text_") && !type.includes("table")) {
14251
+ return renderLeaf(node);
14252
+ }
14253
+ if (Array.isArray(node.elements)) return node.elements.map((n) => deepText(n, depth + 1)).join("");
14254
+ if (Array.isArray(node.rows)) return node.rows.map((n) => deepText(n, depth + 1)).join(" ");
14255
+ return asString(node.text);
14256
+ }
14257
+ function renderCell(cell) {
14258
+ if (!isRecord(cell)) return deepText(cell, 0).replace(/\s*\n\s*/g, " ").trim();
14259
+ const inner = Array.isArray(cell.elements) ? renderSection(cell, 0) : deepText(cell, 0);
14260
+ return inner.replace(/\s*\n\s*/g, " ").trim();
14261
+ }
14262
+ function renderTable(el) {
14263
+ const rawRows = asArray(el.elements).length ? asArray(el.elements) : asArray(el.rows);
14264
+ const rows = [];
14265
+ for (const row of rawRows) {
14266
+ if (!isRecord(row) && !Array.isArray(row)) continue;
14267
+ const rawCells = Array.isArray(row) ? row : asArray(row.elements).length ? asArray(row.elements) : asArray(row.cells);
14268
+ if (rawCells.length === 0) continue;
14269
+ rows.push(rawCells.map(renderCell));
14270
+ }
14271
+ if (rows.length === 0) {
14272
+ const fallback = deepText(el, 0).replace(/[ \t]+\n/g, "\n").trim();
14273
+ return fallback;
14274
+ }
14275
+ const colCount = rows.reduce((max, r) => Math.max(max, r.length), 0);
14276
+ const pad = (r) => {
14277
+ const cells = r.slice();
14278
+ while (cells.length < colCount) cells.push("");
14279
+ return cells.map((c) => c.replace(/\|/g, "\\|"));
14280
+ };
14281
+ const lines = [];
14282
+ const header = rows[0] ?? [];
14283
+ const body = rows.slice(1);
14284
+ lines.push(`| ${pad(header).join(" | ")} |`);
14285
+ lines.push(`| ${Array.from({ length: colCount }, () => "---").join(" | ")} |`);
14286
+ for (const r of body) lines.push(`| ${pad(r).join(" | ")} |`);
14287
+ return lines.join("\n");
14288
+ }
14289
+ function renderSection(section, depth) {
14290
+ if (depth > MAX_DEPTH || !isRecord(section)) return "";
14291
+ const type = asString(section.type);
14292
+ if (isTableElement(section)) return renderTable(section);
14293
+ switch (type) {
14294
+ case "rich_text_section":
14295
+ return renderInline(asArray(section.elements));
14296
+ case "rich_text_preformatted": {
14297
+ const code = renderInline(asArray(section.elements));
14298
+ return code ? `\`\`\`
14299
+ ${code}
14300
+ \`\`\`` : "";
14301
+ }
14302
+ case "rich_text_quote": {
14303
+ const quoted = renderInline(asArray(section.elements));
14304
+ return quoted ? quoted.split("\n").map((l) => `> ${l}`).join("\n") : "";
14305
+ }
14306
+ case "rich_text_list": {
14307
+ const ordered = asString(section.style) === "ordered";
14308
+ const items = asArray(section.elements).map((item, i) => {
14309
+ const body = renderSection(item, depth + 1) || renderInline(asArray(item?.elements));
14310
+ const marker = ordered ? `${i + 1}.` : "-";
14311
+ return `${marker} ${body}`.trimEnd();
14312
+ });
14313
+ return items.join("\n");
14314
+ }
14315
+ default:
14316
+ if (Array.isArray(section.elements)) return renderInline(asArray(section.elements));
14317
+ return deepText(section, depth + 1);
14318
+ }
14319
+ }
14320
+ function renderSlackBlocks(blocks) {
14321
+ let hadTable = false;
14322
+ const out = [];
14323
+ try {
14324
+ for (const block of asArray(blocks)) {
14325
+ if (!isRecord(block) || asString(block.type) !== "rich_text") continue;
14326
+ for (const section of asArray(block.elements)) {
14327
+ if (isTableElement(section)) hadTable = true;
14328
+ const rendered = renderSection(section, 0);
14329
+ if (rendered.trim().length > 0) out.push(rendered);
14330
+ }
14331
+ }
14332
+ } catch {
14333
+ }
14334
+ const text = out.join("\n\n").replace(/[ \t]+$/gm, "").replace(/\n{3,}/g, "\n\n").trim();
14335
+ return { text, hadTable };
14336
+ }
14337
+ function mergeInboundText(text, blocks) {
14338
+ const { text: rendered, hadTable } = renderSlackBlocks(blocks);
14339
+ if (!hadTable) return { content: text, recoveredTable: false };
14340
+ const content = rendered.length > 0 ? rendered : text;
14341
+ return { content, recoveredTable: rendered.length > 0 && content !== text };
14342
+ }
14343
+
14344
+ // src/slack-forwarded.ts
14345
+ function asTrimmed(v) {
14346
+ return typeof v === "string" ? v.trim() : "";
14347
+ }
14348
+ function extractForwardedContent(attachments) {
14349
+ if (!Array.isArray(attachments)) return { text: "", files: [] };
14350
+ const parts = [];
14351
+ const files = [];
14352
+ for (const raw of attachments) {
14353
+ if (!raw || typeof raw !== "object") continue;
14354
+ const att = raw;
14355
+ let body = asTrimmed(att.text) || asTrimmed(att.fallback);
14356
+ if (!body && Array.isArray(att.message_blocks)) {
14357
+ for (const mb of att.message_blocks) {
14358
+ const rendered = renderSlackBlocks(mb?.message?.blocks).text.trim();
14359
+ if (rendered) {
14360
+ body = rendered;
14361
+ break;
14362
+ }
14363
+ }
14364
+ }
14365
+ const title = asTrimmed(att.title);
14366
+ const link = asTrimmed(att.title_link) || asTrimmed(att.from_url);
14367
+ const imageUrl = asTrimmed(att.image_url) || asTrimmed(att.thumb_url);
14368
+ const lines = [];
14369
+ if (body) lines.push(body);
14370
+ if (title && title !== body) lines.push(title);
14371
+ if (link) lines.push(link);
14372
+ if (imageUrl) lines.push(`[image] ${imageUrl}`);
14373
+ if (lines.length) parts.push(lines.join("\n"));
14374
+ if (Array.isArray(att.files)) files.push(...att.files);
14375
+ }
14376
+ return { text: parts.join("\n\n"), files };
14377
+ }
14378
+ function hasForwardedContent(attachments) {
14379
+ const { text, files } = extractForwardedContent(attachments);
14380
+ return text.length > 0 || files.length > 0;
14381
+ }
14382
+
14185
14383
  // src/slack-inbound-filter.ts
14186
14384
  var ALLOWED_MESSAGE_SUBTYPES = /* @__PURE__ */ new Set([
14187
14385
  void 0,
@@ -14201,7 +14399,8 @@ function decideSlackMessageForward(evt) {
14201
14399
  const hasText = typeof evt.text === "string" && evt.text.trim().length > 0;
14202
14400
  const hasFiles = Array.isArray(evt.files) && evt.files.length > 0;
14203
14401
  const hasBlocks = Array.isArray(evt.blocks) && evt.blocks.length > 0;
14204
- if (!hasText && !hasFiles && !hasBlocks) {
14402
+ const hasAttachments = hasForwardedContent(evt.attachments);
14403
+ if (!hasText && !hasFiles && !hasBlocks && !hasAttachments) {
14205
14404
  return { forward: false, reason: "empty" };
14206
14405
  }
14207
14406
  return { forward: true };
@@ -16119,165 +16318,6 @@ function buildSafeInboundPath2(codeName, fileId, mimetype) {
16119
16318
  return buildSafeInboundPath(resolveSlackInboundDir(codeName), fileId, mimetype);
16120
16319
  }
16121
16320
 
16122
- // src/slack-rich-text.ts
16123
- var MAX_DEPTH = 12;
16124
- function isRecord(v) {
16125
- return typeof v === "object" && v !== null && !Array.isArray(v);
16126
- }
16127
- function asString(v) {
16128
- return typeof v === "string" ? v : "";
16129
- }
16130
- function asArray(v) {
16131
- return Array.isArray(v) ? v : [];
16132
- }
16133
- function isTableElement(el) {
16134
- return isRecord(el) && asString(el.type).includes("table");
16135
- }
16136
- function renderEmoji(el) {
16137
- const unicode = asString(el.unicode);
16138
- if (unicode) {
16139
- try {
16140
- const cps = unicode.split("-").map((h) => parseInt(h, 16));
16141
- if (cps.every((n) => Number.isFinite(n) && n >= 0 && n <= 1114111)) {
16142
- return String.fromCodePoint(...cps);
16143
- }
16144
- } catch {
16145
- }
16146
- }
16147
- const name = asString(el.name);
16148
- return name ? `:${name}:` : "";
16149
- }
16150
- function renderLeaf(el) {
16151
- if (!isRecord(el)) return "";
16152
- switch (asString(el.type)) {
16153
- case "text":
16154
- return asString(el.text);
16155
- case "link": {
16156
- const label = asString(el.text);
16157
- const url = asString(el.url);
16158
- if (label && url && label !== url) return `${label} (${url})`;
16159
- return label || url;
16160
- }
16161
- case "emoji":
16162
- return renderEmoji(el);
16163
- case "user":
16164
- return `<@${asString(el.user_id)}>`;
16165
- case "usergroup":
16166
- return `<!subteam^${asString(el.usergroup_id)}>`;
16167
- case "channel":
16168
- return `<#${asString(el.channel_id)}>`;
16169
- case "broadcast":
16170
- return `@${asString(el.range) || "channel"}`;
16171
- case "date":
16172
- return asString(el.fallback) || asString(el.timestamp);
16173
- default:
16174
- if (Array.isArray(el.elements)) return renderInline(el.elements);
16175
- return asString(el.text);
16176
- }
16177
- }
16178
- function renderInline(elements) {
16179
- return elements.map(renderLeaf).join("");
16180
- }
16181
- function deepText(node, depth) {
16182
- if (depth > MAX_DEPTH) return "";
16183
- if (typeof node === "string") return node;
16184
- if (Array.isArray(node)) return node.map((n) => deepText(n, depth + 1)).join("");
16185
- if (!isRecord(node)) return "";
16186
- const type = asString(node.type);
16187
- if (type && type !== "rich_text" && !type.startsWith("rich_text_") && !type.includes("table")) {
16188
- return renderLeaf(node);
16189
- }
16190
- if (Array.isArray(node.elements)) return node.elements.map((n) => deepText(n, depth + 1)).join("");
16191
- if (Array.isArray(node.rows)) return node.rows.map((n) => deepText(n, depth + 1)).join(" ");
16192
- return asString(node.text);
16193
- }
16194
- function renderCell(cell) {
16195
- if (!isRecord(cell)) return deepText(cell, 0).replace(/\s*\n\s*/g, " ").trim();
16196
- const inner = Array.isArray(cell.elements) ? renderSection(cell, 0) : deepText(cell, 0);
16197
- return inner.replace(/\s*\n\s*/g, " ").trim();
16198
- }
16199
- function renderTable(el) {
16200
- const rawRows = asArray(el.elements).length ? asArray(el.elements) : asArray(el.rows);
16201
- const rows = [];
16202
- for (const row of rawRows) {
16203
- if (!isRecord(row) && !Array.isArray(row)) continue;
16204
- const rawCells = Array.isArray(row) ? row : asArray(row.elements).length ? asArray(row.elements) : asArray(row.cells);
16205
- if (rawCells.length === 0) continue;
16206
- rows.push(rawCells.map(renderCell));
16207
- }
16208
- if (rows.length === 0) {
16209
- const fallback = deepText(el, 0).replace(/[ \t]+\n/g, "\n").trim();
16210
- return fallback;
16211
- }
16212
- const colCount = rows.reduce((max, r) => Math.max(max, r.length), 0);
16213
- const pad = (r) => {
16214
- const cells = r.slice();
16215
- while (cells.length < colCount) cells.push("");
16216
- return cells.map((c) => c.replace(/\|/g, "\\|"));
16217
- };
16218
- const lines = [];
16219
- const header = rows[0] ?? [];
16220
- const body = rows.slice(1);
16221
- lines.push(`| ${pad(header).join(" | ")} |`);
16222
- lines.push(`| ${Array.from({ length: colCount }, () => "---").join(" | ")} |`);
16223
- for (const r of body) lines.push(`| ${pad(r).join(" | ")} |`);
16224
- return lines.join("\n");
16225
- }
16226
- function renderSection(section, depth) {
16227
- if (depth > MAX_DEPTH || !isRecord(section)) return "";
16228
- const type = asString(section.type);
16229
- if (isTableElement(section)) return renderTable(section);
16230
- switch (type) {
16231
- case "rich_text_section":
16232
- return renderInline(asArray(section.elements));
16233
- case "rich_text_preformatted": {
16234
- const code = renderInline(asArray(section.elements));
16235
- return code ? `\`\`\`
16236
- ${code}
16237
- \`\`\`` : "";
16238
- }
16239
- case "rich_text_quote": {
16240
- const quoted = renderInline(asArray(section.elements));
16241
- return quoted ? quoted.split("\n").map((l) => `> ${l}`).join("\n") : "";
16242
- }
16243
- case "rich_text_list": {
16244
- const ordered = asString(section.style) === "ordered";
16245
- const items = asArray(section.elements).map((item, i) => {
16246
- const body = renderSection(item, depth + 1) || renderInline(asArray(item?.elements));
16247
- const marker = ordered ? `${i + 1}.` : "-";
16248
- return `${marker} ${body}`.trimEnd();
16249
- });
16250
- return items.join("\n");
16251
- }
16252
- default:
16253
- if (Array.isArray(section.elements)) return renderInline(asArray(section.elements));
16254
- return deepText(section, depth + 1);
16255
- }
16256
- }
16257
- function renderSlackBlocks(blocks) {
16258
- let hadTable = false;
16259
- const out = [];
16260
- try {
16261
- for (const block of asArray(blocks)) {
16262
- if (!isRecord(block) || asString(block.type) !== "rich_text") continue;
16263
- for (const section of asArray(block.elements)) {
16264
- if (isTableElement(section)) hadTable = true;
16265
- const rendered = renderSection(section, 0);
16266
- if (rendered.trim().length > 0) out.push(rendered);
16267
- }
16268
- }
16269
- } catch {
16270
- }
16271
- const text = out.join("\n\n").replace(/[ \t]+$/gm, "").replace(/\n{3,}/g, "\n\n").trim();
16272
- return { text, hadTable };
16273
- }
16274
- function mergeInboundText(text, blocks) {
16275
- const { text: rendered, hadTable } = renderSlackBlocks(blocks);
16276
- if (!hadTable) return { content: text, recoveredTable: false };
16277
- const content = rendered.length > 0 ? rendered : text;
16278
- return { content, recoveredTable: rendered.length > 0 && content !== text };
16279
- }
16280
-
16281
16321
  // src/inbound-dedup.ts
16282
16322
  var DEFAULT_TTL_MS = 5 * 6e4;
16283
16323
  var MAX_ENTRIES = 2e3;
@@ -20870,7 +20910,12 @@ async function connectSocketMode() {
20870
20910
  }
20871
20911
  }
20872
20912
  const userName = await resolveUserName(user);
20873
- const fileMeta = await buildInboundFileMeta(evt.files, AGENT_CODE_NAME, channel);
20913
+ const forwarded = extractForwardedContent(evt.attachments);
20914
+ const fileMeta = await buildInboundFileMeta(
20915
+ [...evt.files ?? [], ...forwarded.files],
20916
+ AGENT_CODE_NAME,
20917
+ channel
20918
+ );
20874
20919
  const downloadedImages = fileMeta.filter(
20875
20920
  (f) => f.kind === "image" && typeof f.path === "string"
20876
20921
  );
@@ -20898,10 +20943,20 @@ async function connectSocketMode() {
20898
20943
  );
20899
20944
  }
20900
20945
  }
20901
- const { content: inboundContent, recoveredTable } = mergeInboundText(text, evt.blocks);
20946
+ const { content: mergedText, recoveredTable } = mergeInboundText(text, evt.blocks);
20902
20947
  if (recoveredTable) {
20903
20948
  process.stderr.write(
20904
20949
  `slack-channel(${AGENT_CODE_NAME}): recovered rich_text table from blocks (channel=${redactSlackId(channel)} ts=${redactSlackId(ts)})
20950
+ `
20951
+ );
20952
+ }
20953
+ let inboundContent = mergedText;
20954
+ if (forwarded.text) {
20955
+ inboundContent = mergedText.trim().length > 0 ? `${mergedText}
20956
+
20957
+ ${forwarded.text}` : forwarded.text;
20958
+ process.stderr.write(
20959
+ `slack-channel(${AGENT_CODE_NAME}): recovered forwarded message content (channel=${redactSlackId(channel)} ts=${redactSlackId(ts)})
20905
20960
  `
20906
20961
  );
20907
20962
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@integrity-labs/agt-cli",
3
- "version": "0.28.164",
3
+ "version": "0.28.165",
4
4
  "description": "Augmented Team CLI — agent provisioning and management",
5
5
  "type": "module",
6
6
  "engines": {