@integrity-labs/agt-cli 0.28.931 → 0.28.933

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 (25) hide show
  1. package/dist/bin/agt.js +5 -5
  2. package/dist/{chunk-HC3EDWKC.js → chunk-3ZYWTOUW.js} +2 -2
  3. package/dist/{chunk-7F32775G.js → chunk-TH3HADAH.js} +98 -9
  4. package/dist/chunk-TH3HADAH.js.map +1 -0
  5. package/dist/{chunk-HSXAGIVO.js → chunk-UAC3N4QQ.js} +4 -4
  6. package/dist/{claude-pair-runtime-TDP2NJTT.js → claude-pair-runtime-GMAY5E45.js} +2 -2
  7. package/dist/lib/manager-worker.js +14 -14
  8. package/dist/mcp/direct-chat-channel.js +10 -1
  9. package/dist/mcp/index.js +9 -0
  10. package/dist/mcp/origami.js +37 -2
  11. package/dist/mcp/slack-channel.js +10 -1
  12. package/dist/mcp/teams-channel.js +1 -1
  13. package/dist/mcp/telegram-channel.js +10 -1
  14. package/dist/mcp/whatsapp-channel.js +2 -2
  15. package/dist/{persistent-session-Z7S2MMRH.js → persistent-session-JL7QVQJH.js} +3 -3
  16. package/dist/{responsiveness-probe-SR62Y32C.js → responsiveness-probe-H5HCW7HT.js} +3 -3
  17. package/dist/{session-auth-dead-25KP23AU.js → session-auth-dead-PRK7BNLU.js} +2 -2
  18. package/package.json +1 -1
  19. package/dist/chunk-7F32775G.js.map +0 -1
  20. /package/dist/{chunk-HC3EDWKC.js.map → chunk-3ZYWTOUW.js.map} +0 -0
  21. /package/dist/{chunk-HSXAGIVO.js.map → chunk-UAC3N4QQ.js.map} +0 -0
  22. /package/dist/{claude-pair-runtime-TDP2NJTT.js.map → claude-pair-runtime-GMAY5E45.js.map} +0 -0
  23. /package/dist/{persistent-session-Z7S2MMRH.js.map → persistent-session-JL7QVQJH.js.map} +0 -0
  24. /package/dist/{responsiveness-probe-SR62Y32C.js.map → responsiveness-probe-H5HCW7HT.js.map} +0 -0
  25. /package/dist/{session-auth-dead-25KP23AU.js.map → session-auth-dead-PRK7BNLU.js.map} +0 -0
@@ -16,7 +16,7 @@ import {
16
16
  parseEnvIntegrations,
17
17
  shellQuote,
18
18
  summarizeUnanswerablePane
19
- } from "./chunk-HC3EDWKC.js";
19
+ } from "./chunk-3ZYWTOUW.js";
20
20
  import {
21
21
  BIND_FAILURE_QUARANTINE_THRESHOLD,
22
22
  INTEGRATIONS_SECTION_END,
@@ -76,7 +76,7 @@ import {
76
76
  sessionTranscriptDir,
77
77
  worseConnectivityOutcome,
78
78
  wrapScheduledTaskPrompt
79
- } from "./chunk-7F32775G.js";
79
+ } from "./chunk-TH3HADAH.js";
80
80
  import {
81
81
  parsePsRows
82
82
  } from "./chunk-XWVM4KPK.js";
@@ -6942,7 +6942,7 @@ function exchangeFailureKind(err) {
6942
6942
  }
6943
6943
 
6944
6944
  // src/lib/api-client.ts
6945
- var agtCliVersion = true ? "0.28.931" : "dev";
6945
+ var agtCliVersion = true ? "0.28.933" : "dev";
6946
6946
  var lastConfigHash = null;
6947
6947
  function setConfigHash(hash) {
6948
6948
  lastConfigHash = hash && hash.length > 0 ? hash : null;
@@ -11567,4 +11567,4 @@ export {
11567
11567
  managerInstallSystemUnitCommand,
11568
11568
  managerUninstallSystemUnitCommand
11569
11569
  };
11570
- //# sourceMappingURL=chunk-HSXAGIVO.js.map
11570
+ //# sourceMappingURL=chunk-UAC3N4QQ.js.map
@@ -100,7 +100,7 @@ async function spawnPairSession(session) {
100
100
  return { ok: true };
101
101
  } catch {
102
102
  }
103
- const { resolveClaudeBinary } = await import("./persistent-session-Z7S2MMRH.js");
103
+ const { resolveClaudeBinary } = await import("./persistent-session-JL7QVQJH.js");
104
104
  const claudeBin = resolveClaudeBinary();
105
105
  const pairEnv = {
106
106
  ...process.env,
@@ -373,4 +373,4 @@ export {
373
373
  startClaudePair,
374
374
  submitClaudePairCode
375
375
  };
376
- //# sourceMappingURL=claude-pair-runtime-TDP2NJTT.js.map
376
+ //# sourceMappingURL=claude-pair-runtime-GMAY5E45.js.map
@@ -63,7 +63,7 @@ import {
63
63
  safeWriteJsonAtomic,
64
64
  setConfigHash,
65
65
  tripClass
66
- } from "../chunk-HSXAGIVO.js";
66
+ } from "../chunk-UAC3N4QQ.js";
67
67
  import {
68
68
  getProjectDir as getProjectDir2,
69
69
  getReadyTasks,
@@ -136,7 +136,7 @@ import {
136
136
  takeZombieDetection,
137
137
  toOpencodeModel,
138
138
  writeEgressAllowlist
139
- } from "../chunk-HC3EDWKC.js";
139
+ } from "../chunk-3ZYWTOUW.js";
140
140
  import {
141
141
  ACCOUNT_ENFORCEMENT_MARKER_FILENAME,
142
142
  AnchorSessionClient,
@@ -232,7 +232,7 @@ import {
232
232
  subagentActivityAgeSeconds,
233
233
  sumTranscriptUsageInWindow,
234
234
  transcriptActivityAgeSeconds
235
- } from "../chunk-7F32775G.js";
235
+ } from "../chunk-TH3HADAH.js";
236
236
  import {
237
237
  reapOrphanChannelMcps
238
238
  } from "../chunk-XWVM4KPK.js";
@@ -13230,7 +13230,7 @@ var pendingDayRolloverReset = /* @__PURE__ */ new Set();
13230
13230
  var dayRolloverInboundHold = /* @__PURE__ */ new Map();
13231
13231
  var INBOUND_HOLD_EPISODE_GAP_MS = 12e4;
13232
13232
  async function channelInboundActivityAgeSecondsFor(codeName) {
13233
- const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-SR62Y32C.js");
13233
+ const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-H5HCW7HT.js");
13234
13234
  const newest = newestPendingInboundActivityMtimeMs(dirname11(paneLogPath(codeName)));
13235
13235
  if (newest === null) return null;
13236
13236
  return Math.max(0, Math.floor((Date.now() - newest) / 1e3));
@@ -13915,7 +13915,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
13915
13915
  var lastVersionCheckAt = 0;
13916
13916
  var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
13917
13917
  var lastResponsivenessProbeAt = 0;
13918
- var agtCliVersion = true ? "0.28.931" : "dev";
13918
+ var agtCliVersion = true ? "0.28.933" : "dev";
13919
13919
  function resolveBrewPath(execFileSync2) {
13920
13920
  try {
13921
13921
  const out = execFileSync2("which", ["brew"], { timeout: 5e3 }).toString().trim();
@@ -15505,7 +15505,7 @@ function flushRestartedAgentDiagnostics(hostId, codeNames) {
15505
15505
  if (codeNames.length === 0) return;
15506
15506
  void (async () => {
15507
15507
  try {
15508
- const { collectDiagnostics } = await import("../persistent-session-Z7S2MMRH.js");
15508
+ const { collectDiagnostics } = await import("../persistent-session-JL7QVQJH.js");
15509
15509
  await api.post("/host/heartbeat", {
15510
15510
  host_id: hostId,
15511
15511
  agent_diagnostics: collectDiagnostics(codeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor)
@@ -15647,7 +15647,7 @@ async function pollCycleInner() {
15647
15647
  }
15648
15648
  try {
15649
15649
  const { detectHostSecurity } = await import("../host-security-6PDFG7F5.js");
15650
- const { collectDiagnostics } = await import("../persistent-session-Z7S2MMRH.js");
15650
+ const { collectDiagnostics } = await import("../persistent-session-JL7QVQJH.js");
15651
15651
  const diagCodeNames = [...agentState.persistentSessionAgents];
15652
15652
  const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor) : void 0;
15653
15653
  let tailscaleHostname;
@@ -15822,7 +15822,7 @@ async function pollCycleInner() {
15822
15822
  collectPanelessActivityProbes,
15823
15823
  getResponsivenessIntervalMs,
15824
15824
  occupancyQualificationClassifications
15825
- } = await import("../responsiveness-probe-SR62Y32C.js");
15825
+ } = await import("../responsiveness-probe-H5HCW7HT.js");
15826
15826
  const probeIntervalMs = getResponsivenessIntervalMs();
15827
15827
  if (now - lastResponsivenessProbeAt > probeIntervalMs) {
15828
15828
  const probeCodeNames = [...agentState.persistentSessionAgents];
@@ -15939,7 +15939,7 @@ async function pollCycleInner() {
15939
15939
  collectResponsivenessProbes,
15940
15940
  livePendingInboundOldestAgeSeconds,
15941
15941
  parkPendingInbound
15942
- } = await import("../responsiveness-probe-SR62Y32C.js");
15942
+ } = await import("../responsiveness-probe-H5HCW7HT.js");
15943
15943
  const { getProjectDir: wedgeProjectDir } = await import("../scheduler-engine-NDP36U7O.js");
15944
15944
  const wedgeNow = /* @__PURE__ */ new Date();
15945
15945
  const liveAgents = agentState.persistentSessionAgents;
@@ -16095,7 +16095,7 @@ async function pollCycleInner() {
16095
16095
  }
16096
16096
  try {
16097
16097
  const { scrapeMcpFailedBannerCount } = await import("../pane-mcp-banner-scraper-JA437JIB.js");
16098
- const { probeSessionAuth } = await import("../session-auth-dead-25KP23AU.js");
16098
+ const { probeSessionAuth } = await import("../session-auth-dead-PRK7BNLU.js");
16099
16099
  const observations = [];
16100
16100
  const pendingCacheCommits = [];
16101
16101
  const modelApiErrorReportingOn = hostFlagStore().getBoolean("model-api-error-reporting");
@@ -20359,7 +20359,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
20359
20359
  try {
20360
20360
  const freshId = rotateSessionForWedge(codeName);
20361
20361
  consecutiveWedgeCycles.delete(codeName);
20362
- const { parkPendingInbound: parkForRestart } = await import("../responsiveness-probe-SR62Y32C.js");
20362
+ const { parkPendingInbound: parkForRestart } = await import("../responsiveness-probe-H5HCW7HT.js");
20363
20363
  const { parked, deadLettered } = parkForRestart(codeName, /* @__PURE__ */ new Date());
20364
20364
  const parkNote = parked > 0 ? `, ${parked} inbound parked` : "";
20365
20365
  const deadNote = deadLettered > 0 ? `, ${deadLettered} undeliverable dead-lettered` : "";
@@ -20402,7 +20402,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
20402
20402
  void api.post("/host/restart-ack", { host_id: hostId, agent_id: agentId, restart_requested_at: requestedAt }).catch((err) => log(`[restart-lane] ack failed for '${codeName}': ${err.message}`));
20403
20403
  void (async () => {
20404
20404
  try {
20405
- const { collectDiagnostics } = await import("../persistent-session-Z7S2MMRH.js");
20405
+ const { collectDiagnostics } = await import("../persistent-session-JL7QVQJH.js");
20406
20406
  await api.post("/host/heartbeat", {
20407
20407
  host_id: hostId,
20408
20408
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor)
@@ -20453,7 +20453,7 @@ async function respawnAgentAfterMcpStop(codeName, reason) {
20453
20453
  }
20454
20454
  try {
20455
20455
  const hostId = await getHostId();
20456
- const { collectDiagnostics } = await import("../persistent-session-Z7S2MMRH.js");
20456
+ const { collectDiagnostics } = await import("../persistent-session-JL7QVQJH.js");
20457
20457
  await api.post("/host/heartbeat", {
20458
20458
  host_id: hostId,
20459
20459
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor)
@@ -21095,7 +21095,7 @@ async function processClaudePairSessions(agents) {
21095
21095
  killPairSession,
21096
21096
  pairTmuxSession,
21097
21097
  finalizeClaudePairOnboarding
21098
- } = await import("../claude-pair-runtime-TDP2NJTT.js");
21098
+ } = await import("../claude-pair-runtime-GMAY5E45.js");
21099
21099
  for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
21100
21100
  log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
21101
21101
  const killed = await killPairSession(pairTmuxSession(pairId));
@@ -30596,6 +30596,11 @@ var integration_metadata_v1_default = {
30596
30596
  pattern: "^[A-Za-z0-9!#$%&'*+.^_`|~-]+$",
30597
30597
  description: "Authorization scheme word placed before the credential, e.g. `Key` for Higgsfield's `Authorization: Key KEY_ID:KEY_SECRET` (ENG-8440). Omit for the `Bearer` default. Constrained to a single RFC 7230 token because it is concatenated straight into a header value."
30598
30598
  },
30599
+ auth_encoding: {
30600
+ type: "string",
30601
+ enum: ["basic_username"],
30602
+ description: "How the credential is encoded into Authorization (ENG-10524). `basic_username` sends it as the HTTP Basic username with an empty password (`Authorization: Basic base64(<credential>:)`), Sportsyear's API-key form. Omit for `<auth_scheme> <credential>`. Must not be combined with `auth_scheme`."
30603
+ },
30599
30604
  runtime_scopes: {
30600
30605
  type: "object",
30601
30606
  description: "Per-runtime-scope support map. Each slot is either null (the integration does not support installs at this scope) or an object describing how token resolution and auth work for that scope.",
@@ -30630,6 +30635,10 @@ var integration_metadata_v1_default = {
30630
30635
  required: ["tools"]
30631
30636
  },
30632
30637
  then: { required: ["base_url"] },
30638
+ not: {
30639
+ description: "auth_scheme and auth_encoding are mutually exclusive (ENG-10524). The templater refuses the combination on every call, so catalog validation refuses it first.",
30640
+ required: ["auth_scheme", "auth_encoding"]
30641
+ },
30633
30642
  $defs: {
30634
30643
  scopeConfig: {
30635
30644
  oneOf: [
@@ -39891,7 +39900,7 @@ async function readCursorAdvanceBody(res) {
39891
39900
  function buildDirectChatMcpInstructions() {
39892
39901
  return [
39893
39902
  "CRITICAL: every response to a direct-chat <channel> tag MUST go through direct_chat.reply (passing the session_id verbatim). Text in your session WITHOUT a direct_chat.reply call never reaches the operator \u2014 the reply dies inside the agent process.",
39894
- 'Messages from the webapp Direct Chat arrive as <channel source="direct-chat" session_id="..." user="...">.',
39903
+ "Messages from the webapp Direct Chat arrive as a channel tag whose source is direct-chat, carrying session_id and user.",
39895
39904
  "When the tag carries user_name (and sometimes user_email / user_role), that is the verified human you are talking with; address them by name and tailor your reply to who they are. If those attributes are absent, the sender is unknown, so just reply helpfully without personalization.",
39896
39905
  "Reply using the direct_chat.reply tool, passing the session_id from the tag.",
39897
39906
  "Always reply to every direct chat message that expects a reply (its meta has requires_reply=true, or no requires_reply field) \u2014 the user is waiting in the webapp.",
package/dist/mcp/index.js CHANGED
@@ -23172,6 +23172,11 @@ var integration_metadata_v1_default = {
23172
23172
  pattern: "^[A-Za-z0-9!#$%&'*+.^_`|~-]+$",
23173
23173
  description: "Authorization scheme word placed before the credential, e.g. `Key` for Higgsfield's `Authorization: Key KEY_ID:KEY_SECRET` (ENG-8440). Omit for the `Bearer` default. Constrained to a single RFC 7230 token because it is concatenated straight into a header value."
23174
23174
  },
23175
+ auth_encoding: {
23176
+ type: "string",
23177
+ enum: ["basic_username"],
23178
+ description: "How the credential is encoded into Authorization (ENG-10524). `basic_username` sends it as the HTTP Basic username with an empty password (`Authorization: Basic base64(<credential>:)`), Sportsyear's API-key form. Omit for `<auth_scheme> <credential>`. Must not be combined with `auth_scheme`."
23179
+ },
23175
23180
  runtime_scopes: {
23176
23181
  type: "object",
23177
23182
  description: "Per-runtime-scope support map. Each slot is either null (the integration does not support installs at this scope) or an object describing how token resolution and auth work for that scope.",
@@ -23206,6 +23211,10 @@ var integration_metadata_v1_default = {
23206
23211
  required: ["tools"]
23207
23212
  },
23208
23213
  then: { required: ["base_url"] },
23214
+ not: {
23215
+ description: "auth_scheme and auth_encoding are mutually exclusive (ENG-10524). The templater refuses the combination on every call, so catalog validation refuses it first.",
23216
+ required: ["auth_scheme", "auth_encoding"]
23217
+ },
23209
23218
  $defs: {
23210
23219
  scopeConfig: {
23211
23220
  oneOf: [
@@ -37118,6 +37118,11 @@ var integration_metadata_v1_default = {
37118
37118
  pattern: "^[A-Za-z0-9!#$%&'*+.^_`|~-]+$",
37119
37119
  description: "Authorization scheme word placed before the credential, e.g. `Key` for Higgsfield's `Authorization: Key KEY_ID:KEY_SECRET` (ENG-8440). Omit for the `Bearer` default. Constrained to a single RFC 7230 token because it is concatenated straight into a header value."
37120
37120
  },
37121
+ auth_encoding: {
37122
+ type: "string",
37123
+ enum: ["basic_username"],
37124
+ description: "How the credential is encoded into Authorization (ENG-10524). `basic_username` sends it as the HTTP Basic username with an empty password (`Authorization: Basic base64(<credential>:)`), Sportsyear's API-key form. Omit for `<auth_scheme> <credential>`. Must not be combined with `auth_scheme`."
37125
+ },
37121
37126
  runtime_scopes: {
37122
37127
  type: "object",
37123
37128
  description: "Per-runtime-scope support map. Each slot is either null (the integration does not support installs at this scope) or an object describing how token resolution and auth work for that scope.",
@@ -37152,6 +37157,10 @@ var integration_metadata_v1_default = {
37152
37157
  required: ["tools"]
37153
37158
  },
37154
37159
  then: { required: ["base_url"] },
37160
+ not: {
37161
+ description: "auth_scheme and auth_encoding are mutually exclusive (ENG-10524). The templater refuses the combination on every call, so catalog validation refuses it first.",
37162
+ required: ["auth_scheme", "auth_encoding"]
37163
+ },
37155
37164
  $defs: {
37156
37165
  scopeConfig: {
37157
37166
  oneOf: [
@@ -37284,7 +37293,7 @@ var FIXED_SECONDS = {
37284
37293
  // ../core/dist/integrations/integration-broker/http-templater.js
37285
37294
  var PLACEHOLDER_RE = /\{([a-zA-Z_][a-zA-Z0-9_]*)\}/g;
37286
37295
  function buildHttpRequest(input) {
37287
- const { tool, args, baseUrl, bearerToken, authScheme, requestId, extraHeaders } = input;
37296
+ const { tool, args, baseUrl, bearerToken, authScheme, authEncoding, requestId, extraHeaders } = input;
37288
37297
  const { method, path_template, query_template, headers_template, body_template, idempotency_key_header } = tool.http;
37289
37298
  const path = templatePath(path_template, args);
37290
37299
  const query = query_template ? buildQueryString(query_template, args) : "";
@@ -37293,7 +37302,7 @@ function buildHttpRequest(input) {
37293
37302
  Accept: "application/json"
37294
37303
  };
37295
37304
  if (bearerToken) {
37296
- headers["Authorization"] = `${resolveAuthScheme(authScheme)} ${bearerToken}`;
37305
+ headers["Authorization"] = authorizationValue(bearerToken, authScheme, authEncoding);
37297
37306
  }
37298
37307
  if (method !== "GET") {
37299
37308
  const headerName = idempotency_key_header ?? "Idempotency-Key";
@@ -37371,6 +37380,32 @@ function omitKeys(args, keys) {
37371
37380
  }
37372
37381
  return out;
37373
37382
  }
37383
+ function authorizationValue(token, scheme, encoding) {
37384
+ if (encoding === void 0 || encoding.trim() === "") {
37385
+ return `${resolveAuthScheme(scheme)} ${token}`;
37386
+ }
37387
+ const trimmed = encoding.trim();
37388
+ if (trimmed !== "basic_username") {
37389
+ throw new TemplateError(`unsupported auth_encoding: ${trimmed}`);
37390
+ }
37391
+ if (scheme !== void 0 && scheme.trim() !== "") {
37392
+ throw new TemplateError("auth_scheme cannot be combined with auth_encoding");
37393
+ }
37394
+ return basicUsernameAuthorization(token);
37395
+ }
37396
+ function basicUsernameAuthorization(credential) {
37397
+ if (credential.includes(":")) {
37398
+ throw new TemplateError('credential for basic_username auth must not contain ":"');
37399
+ }
37400
+ if (!isValidHeaderValue(credential)) {
37401
+ throw new TemplateError("credential for basic_username auth contains control characters");
37402
+ }
37403
+ const bytes = new TextEncoder().encode(`${credential}:`);
37404
+ let binary = "";
37405
+ for (const b of bytes)
37406
+ binary += String.fromCharCode(b);
37407
+ return `Basic ${btoa(binary)}`;
37408
+ }
37374
37409
  function resolveAuthScheme(scheme) {
37375
37410
  if (scheme === void 0)
37376
37411
  return "Bearer";
@@ -31542,6 +31542,11 @@ var integration_metadata_v1_default = {
31542
31542
  pattern: "^[A-Za-z0-9!#$%&'*+.^_`|~-]+$",
31543
31543
  description: "Authorization scheme word placed before the credential, e.g. `Key` for Higgsfield's `Authorization: Key KEY_ID:KEY_SECRET` (ENG-8440). Omit for the `Bearer` default. Constrained to a single RFC 7230 token because it is concatenated straight into a header value."
31544
31544
  },
31545
+ auth_encoding: {
31546
+ type: "string",
31547
+ enum: ["basic_username"],
31548
+ description: "How the credential is encoded into Authorization (ENG-10524). `basic_username` sends it as the HTTP Basic username with an empty password (`Authorization: Basic base64(<credential>:)`), Sportsyear's API-key form. Omit for `<auth_scheme> <credential>`. Must not be combined with `auth_scheme`."
31549
+ },
31545
31550
  runtime_scopes: {
31546
31551
  type: "object",
31547
31552
  description: "Per-runtime-scope support map. Each slot is either null (the integration does not support installs at this scope) or an object describing how token resolution and auth work for that scope.",
@@ -31576,6 +31581,10 @@ var integration_metadata_v1_default = {
31576
31581
  required: ["tools"]
31577
31582
  },
31578
31583
  then: { required: ["base_url"] },
31584
+ not: {
31585
+ description: "auth_scheme and auth_encoding are mutually exclusive (ENG-10524). The templater refuses the combination on every call, so catalog validation refuses it first.",
31586
+ required: ["auth_scheme", "auth_encoding"]
31587
+ },
31579
31588
  $defs: {
31580
31589
  scopeConfig: {
31581
31590
  oneOf: [
@@ -42842,7 +42851,7 @@ function buildSlackMcpInstructions(opts) {
42842
42851
  const { ackReaction, skipReactionOn, skipReaction } = opts;
42843
42852
  return [
42844
42853
  "CRITICAL: every response to a Slack <channel> tag MUST go through slack.reply - typed text never reaches the user. Slow work: interim ack (slack.reply interim:true), then your FINAL answer as a separate slack.reply (interim omitted). An ack is not the answer.",
42845
- `Inbound: <channel ... inbound_id="ib_..." message_ts="..." [thread_context="..."]>. Reply with slack.reply passing inbound_id (copy it verbatim from the tag you are answering) + text; the server routes it to the right thread. Multiple <channel> tags = separate conversations: NEVER answer one user in another's inbound_id/thread. thread_context = pre-loaded thread; ground replies ONLY in it. For a self-initiated message (not a reply) set proactive:true.`,
42854
+ "Each inbound tag carries inbound_id and message_ts, and sometimes thread_context. Reply with slack.reply passing inbound_id (copy it verbatim from the tag you are answering) + text; the server routes it to the right thread. Multiple <channel> tags = separate conversations: NEVER answer one user in another's inbound_id/thread. thread_context = pre-loaded thread; ground replies ONLY in it. For a self-initiated message (not a reply) set proactive:true.",
42846
42855
  "Attachments: <channel> `files` is a JSON string - JSON.parse it. Entry with `path` (or a top-level `image_path`) is already downloaded - Read it; do NOT call slack.download_attachment. Only entries with `file_id` and no `path` (PDF/docx/csv) need slack.download_attachment (pass file_id + channel), then Read the returned path. Don't surface file-handling errors that don't affect the answer.",
42847
42856
  "Address users by user_name, never raw user ID. In multi-participant threads the CURRENT speaker is on the latest <channel> tag.",
42848
42857
  `Reactions (slack.react sparingly - prefer a reply): :${ackReaction}: = ack (auto-added on inbound, don't duplicate); \u2705 = success.` + (skipReactionOn ? ` "${skipReaction}" = seen, not replying.` : "") + " NEVER react to signal failure of your work - on failure slack.reply one sentence explaining it (no stack traces/secrets). \u23F3 and \u274C are system-only; never add them.",
@@ -15707,7 +15707,7 @@ var mcp = new Server(
15707
15707
  // High-priority lines first — Claude Code truncates instructions at
15708
15708
  // 2048 chars, so anything appended late silently disappears.
15709
15709
  "CRITICAL: every response to an MS Teams <channel> tag MUST go through teams.reply. Text in your session without a teams.reply call never reaches the user.",
15710
- 'Messages from Teams arrive as <channel source="msteams" user="<aad-id>" user_name="<display>" conversation_id="..." service_url="..." reply_to_id="..." />. Pass conversation_id + service_url + reply_to_id from the tag to teams.reply verbatim; threaded replies must include reply_to_id.',
15710
+ "Messages from Teams arrive as a channel tag carrying user (an AAD id), user_name, conversation_id, service_url and reply_to_id. Pass conversation_id + service_url + reply_to_id from the tag to teams.reply verbatim; threaded replies must include reply_to_id.",
15711
15711
  "Address users by user_name, never by raw user id (AAD object ids leak directory information).",
15712
15712
  "service_url is region-specific and arrives on every inbound \u2014 NEVER hardcode it, always echo the inbound value.",
15713
15713
  'Channel message + auto_followed="true": only reply if you have something useful to add; otherwise silently skip.',
@@ -31584,6 +31584,11 @@ var integration_metadata_v1_default = {
31584
31584
  pattern: "^[A-Za-z0-9!#$%&'*+.^_`|~-]+$",
31585
31585
  description: "Authorization scheme word placed before the credential, e.g. `Key` for Higgsfield's `Authorization: Key KEY_ID:KEY_SECRET` (ENG-8440). Omit for the `Bearer` default. Constrained to a single RFC 7230 token because it is concatenated straight into a header value."
31586
31586
  },
31587
+ auth_encoding: {
31588
+ type: "string",
31589
+ enum: ["basic_username"],
31590
+ description: "How the credential is encoded into Authorization (ENG-10524). `basic_username` sends it as the HTTP Basic username with an empty password (`Authorization: Basic base64(<credential>:)`), Sportsyear's API-key form. Omit for `<auth_scheme> <credential>`. Must not be combined with `auth_scheme`."
31591
+ },
31587
31592
  runtime_scopes: {
31588
31593
  type: "object",
31589
31594
  description: "Per-runtime-scope support map. Each slot is either null (the integration does not support installs at this scope) or an object describing how token resolution and auth work for that scope.",
@@ -31618,6 +31623,10 @@ var integration_metadata_v1_default = {
31618
31623
  required: ["tools"]
31619
31624
  },
31620
31625
  then: { required: ["base_url"] },
31626
+ not: {
31627
+ description: "auth_scheme and auth_encoding are mutually exclusive (ENG-10524). The templater refuses the combination on every call, so catalog validation refuses it first.",
31628
+ required: ["auth_scheme", "auth_encoding"]
31629
+ },
31621
31630
  $defs: {
31622
31631
  scopeConfig: {
31623
31632
  oneOf: [
@@ -42288,7 +42297,7 @@ function buildTelegramMcpInstructions(opts) {
42288
42297
  const skipReactionOn = opts.skipReactionOn && emoji2.length > 0 && emoji2.length <= MAX_SKIP_REACTION_UNITS;
42289
42298
  return [
42290
42299
  "CRITICAL: every response to a Telegram <channel> tag MUST go through telegram.reply with the chat_id from the tag \u2014 typed text never reaches the user. Slow work: interim ack (telegram.reply interim:true), then your FINAL answer as a separate telegram.reply (interim omitted). An ack is not the answer.",
42291
- 'Messages from Telegram arrive as <channel source="telegram" chat_id="..." user="..." user_name="..." message_id="...">. Pass reply_to_message_id from the tag so the response lands as a quote-reply in busy chats.',
42300
+ "Messages from Telegram arrive as a channel tag carrying chat_id, user, user_name and message_id. Pass reply_to_message_id from the tag so the response lands as a quote-reply in busy chats.",
42292
42301
  "Deliberately NOT replying (a standing rule bars you from that chat, or the message only changed state)? Call telegram.consume with the chat_id and a short reason: it settles the message without posting anything. Without a reply or a consume it counts as undelivered and re-delivers to you forever.",
42293
42302
  "Inbound attachments: `files` on the tag is a JSON string \u2014 JSON.parse it. An entry with `path` (or top-level `image_path`) is already downloaded \u2014 Read it. Entries with `file_id` and no `path` need telegram.download_attachment (file_id + chat_id), then Read the returned path.",
42294
42303
  'For work >30s follow the CLAUDE.md kanban flow: kanban_add \u2192 reply "On it \u2014 tracking here: <kanban URL>" \u2192 in_progress \u2192 reply the result. Simple lookups skip kanban but still reply.',
@@ -156050,11 +156050,11 @@ var mcp = new Server(
156050
156050
  },
156051
156051
  instructions: (IS_BAILEYS ? [
156052
156052
  "CRITICAL: every response to a WhatsApp <channel> tag MUST go through whatsapp.reply. Text in your session without a tool call never reaches the user.",
156053
- 'Messages arrive as <channel source="whatsapp" sender="<jid>" conversation_id="..." message_id="..." />. Pass the `sender` value verbatim as the `to` argument to whatsapp.reply.',
156053
+ "Messages arrive as a channel tag carrying sender (a JID), conversation_id and message_id. Pass the `sender` value verbatim as the `to` argument to whatsapp.reply.",
156054
156054
  "whatsapp.reply sends free-form text with no restrictions (this is a linked personal number, not a business template flow)."
156055
156055
  ] : [
156056
156056
  "CRITICAL: every response to a WhatsApp <channel> tag MUST go through whatsapp.reply (or whatsapp.send_template). Text in your session without a tool call never reaches the user.",
156057
- 'Messages arrive as <channel source="whatsapp" sender="<id>" conversation_id="..." message_id="..." />. Pass the `sender` value verbatim as the `to` argument to whatsapp.reply.',
156057
+ "Messages arrive as a channel tag carrying sender, conversation_id and message_id. Pass the `sender` value verbatim as the `to` argument to whatsapp.reply.",
156058
156058
  "whatsapp.reply sends free-form text and only works inside the 24h customer-service window (24h since the user last messaged). If it reports the window is closed, use whatsapp.send_template with a pre-approved template instead."
156059
156059
  ]).join(" ")
156060
156060
  }
@@ -62,8 +62,8 @@ import {
62
62
  writeDirectChatSessionState,
63
63
  writeEgressAllowlist,
64
64
  writePersistentClaudeWrapper
65
- } from "./chunk-HC3EDWKC.js";
66
- import "./chunk-7F32775G.js";
65
+ } from "./chunk-3ZYWTOUW.js";
66
+ import "./chunk-TH3HADAH.js";
67
67
  import "./chunk-XWVM4KPK.js";
68
68
  export {
69
69
  CLAUDE_HOST_WIDE,
@@ -130,4 +130,4 @@ export {
130
130
  writeEgressAllowlist,
131
131
  writePersistentClaudeWrapper
132
132
  };
133
- //# sourceMappingURL=persistent-session-Z7S2MMRH.js.map
133
+ //# sourceMappingURL=persistent-session-JL7QVQJH.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  paneLogPath
3
- } from "./chunk-HC3EDWKC.js";
4
- import "./chunk-7F32775G.js";
3
+ } from "./chunk-3ZYWTOUW.js";
4
+ import "./chunk-TH3HADAH.js";
5
5
  import "./chunk-XWVM4KPK.js";
6
6
 
7
7
  // src/lib/responsiveness-probe.ts
@@ -799,4 +799,4 @@ export {
799
799
  readAndResetSlackReplyBindingClassifications,
800
800
  readAndResetSlackReplyTargetClassifications
801
801
  };
802
- //# sourceMappingURL=responsiveness-probe-SR62Y32C.js.map
802
+ //# sourceMappingURL=responsiveness-probe-H5HCW7HT.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  sessionTranscriptDir
3
- } from "./chunk-7F32775G.js";
3
+ } from "./chunk-TH3HADAH.js";
4
4
 
5
5
  // src/lib/session-auth-dead.ts
6
6
  import { closeSync, openSync, readSync, readdirSync, statSync } from "fs";
@@ -203,4 +203,4 @@ export {
203
203
  decideSessionAuthState,
204
204
  probeSessionAuth
205
205
  };
206
- //# sourceMappingURL=session-auth-dead-25KP23AU.js.map
206
+ //# sourceMappingURL=session-auth-dead-PRK7BNLU.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@integrity-labs/agt-cli",
3
- "version": "0.28.931",
3
+ "version": "0.28.933",
4
4
  "description": "Augmented Team CLI — agent provisioning and management",
5
5
  "type": "module",
6
6
  "engines": {