@integrity-labs/agt-cli 0.28.297 → 0.28.299
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-QXU5FMXN.js → chunk-KMJHNKPQ.js} +40 -2
- package/dist/{chunk-QXU5FMXN.js.map → chunk-KMJHNKPQ.js.map} +1 -1
- package/dist/{chunk-VTSO7X7P.js → chunk-V23GLSEX.js} +3 -3
- package/dist/{claude-pair-runtime-BIBIVB7I.js → claude-pair-runtime-ZJZ3XYH4.js} +2 -2
- package/dist/lib/manager-worker.js +27 -15
- package/dist/lib/manager-worker.js.map +1 -1
- package/dist/mcp/index.js +15 -5
- package/dist/mcp/origami.js +39 -1
- package/dist/mcp/slack-channel.js +58 -2
- package/dist/{persistent-session-A5N7BYS3.js → persistent-session-RSM62IW7.js} +2 -2
- package/dist/{responsiveness-probe-OZP2HO2F.js → responsiveness-probe-DAKU7GSN.js} +2 -2
- package/package.json +1 -1
- /package/dist/{chunk-VTSO7X7P.js.map → chunk-V23GLSEX.js.map} +0 -0
- /package/dist/{claude-pair-runtime-BIBIVB7I.js.map → claude-pair-runtime-ZJZ3XYH4.js.map} +0 -0
- /package/dist/{persistent-session-A5N7BYS3.js.map → persistent-session-RSM62IW7.js.map} +0 -0
- /package/dist/{responsiveness-probe-OZP2HO2F.js.map → responsiveness-probe-DAKU7GSN.js.map} +0 -0
package/dist/mcp/index.js
CHANGED
|
@@ -21784,7 +21784,7 @@ server.tool(
|
|
|
21784
21784
|
}
|
|
21785
21785
|
);
|
|
21786
21786
|
var kanbanMoveStatuses = AGT_KANBAN_WAITING_ENABLED ? ["backlog", "todo", "in_progress", "waiting", "done", "failed"] : ["backlog", "todo", "in_progress", "done", "failed"];
|
|
21787
|
-
var kanbanMoveDescription = AGT_KANBAN_WAITING_ENABLED ? 'Move a kanban item to a different status column. Use status="failed" for a task attempted but not completable. Use status="waiting" when you have COMPLETED your part and cannot proceed until one specific external action happens (a person approves/answers/decides, or a dependency like a PR merge or deploy completes). status="waiting" REQUIRES waiting_kind - classify the wait as "pr-review", "pr-merged", "human", "external", or "other" (the catch-all when none fit). For a PR wait ("pr-review"/"pr-merged") set waiting_repo ("owner/repo") and waiting_pr (the number) INSTEAD of waiting_on - the card then links straight to the PR and can auto-resume when it lands. For "human"/"external"/"other" set waiting_on to the
|
|
21787
|
+
var kanbanMoveDescription = AGT_KANBAN_WAITING_ENABLED ? 'Move a kanban item to a different status column. Use status="failed" for a task attempted but not completable. Use status="waiting" when you have COMPLETED your part and cannot proceed until one specific external action happens (a person approves/answers/decides, or a dependency like a PR merge or deploy completes). status="waiting" REQUIRES waiting_kind - classify the wait as "pr-review", "pr-merged", "human", "external", or "other" (the catch-all when none fit). For a PR wait ("pr-review"/"pr-merged") set waiting_repo ("owner/repo") and waiting_pr (the number) INSTEAD of waiting_on - the card then links straight to the PR and can auto-resume when it lands. For "human"/"external"/"other" set waiting_on to a one-line ask ("Answer my 5 scoping questions") AND put the full context the person needs to decide - the actual questions, options, links - in waiting_details, so they can answer from the card without opening a ticket. Do NOT use waiting to offload hard work, and do NOT confuse it with a failure. (matches the hosted kanban_move enum).' : 'Move a kanban item to a different status column. Use status="failed" to mark a task that was attempted but could not complete (matches the hosted kanban_move enum).';
|
|
21788
21788
|
var kanbanMoveStatusDescribe = AGT_KANBAN_WAITING_ENABLED ? 'Target status. "waiting" parks the card until one external action happens; it REQUIRES waiting_kind - use "pr-review"/"pr-merged" with waiting_repo + waiting_pr, or "human"/"external"/"other" with a concrete waiting_on. "failed" closes the row as a failed attempt; there is no "cancelled" status, close no-longer-needed work via kanban_done with an explanatory result.' : 'Target status. "failed" closes the row as a failed attempt; there is no "cancelled" status, close no-longer-needed work via kanban_done with an explanatory result.';
|
|
21789
21789
|
server.tool(
|
|
21790
21790
|
"kanban_move",
|
|
@@ -21796,10 +21796,13 @@ server.tool(
|
|
|
21796
21796
|
notes: external_exports.string().optional().describe("Progress notes"),
|
|
21797
21797
|
...AGT_KANBAN_WAITING_ENABLED ? {
|
|
21798
21798
|
waiting_on: external_exports.string().optional().describe(
|
|
21799
|
-
'Only with status="waiting", for a NON-PR wait:
|
|
21799
|
+
'Only with status="waiting", for a NON-PR wait: a ONE-LINE headline of what you are parked on, phrased as an instruction ("Approve the budget", "Answer my 5 scoping questions"). Keep it short - it is the card headline. Put the FULL context the person needs to decide in waiting_details, not here. For a PR wait use waiting_kind/waiting_repo/waiting_pr instead.'
|
|
21800
|
+
),
|
|
21801
|
+
waiting_details: external_exports.string().optional().describe(
|
|
21802
|
+
`Only with status="waiting" on a "human"/"external"/"other" wait: the FULL context the person needs to make the decision, inline - the actual questions, the options, the specifics, any links. Put everything here so they can answer from the card alone; NEVER just point at a ticket ("see ENG-1234"). waiting_on stays the one-line headline; this is the body. Shown in full in the card's Respond panel; the card preview and chat notifications may show a truncated preview (kept within their limits).`
|
|
21800
21803
|
),
|
|
21801
21804
|
waiting_kind: external_exports.enum(["pr-review", "pr-merged", "human", "external", "other"]).optional().describe(
|
|
21802
|
-
'REQUIRED with status="waiting": classify what you are waiting on. "pr-review" = a pull request awaiting review, "pr-merged" = a reviewed PR awaiting merge (both require waiting_repo + waiting_pr and let the card link to the PR and auto-resume). "human" = a specific person must decide/answer, "external" = a non-PR system/process must complete (a deploy, CI, a third party); for those two
|
|
21805
|
+
'REQUIRED with status="waiting": classify what you are waiting on. "pr-review" = a pull request awaiting review, "pr-merged" = a reviewed PR awaiting merge (both require waiting_repo + waiting_pr and let the card link to the PR and auto-resume). "human" = a specific person must decide/answer, "external" = a non-PR system/process must complete (a deploy, CI, a third party); for those two put a one-line ask in waiting_on and the full decision context in waiting_details. "other" = none of the above / unsure - the generic catch-all, same waiting_on + waiting_details. Always pick the most specific kind that fits; fall back to "other" rather than leaving it unset.'
|
|
21803
21806
|
),
|
|
21804
21807
|
waiting_repo: external_exports.string().optional().describe(
|
|
21805
21808
|
'Only with a pr-* waiting_kind: the "owner/repo" the pull request lives in (e.g. "Integrity-Labs/augmented").'
|
|
@@ -21844,8 +21847,11 @@ server.tool(
|
|
|
21844
21847
|
let waitingContext;
|
|
21845
21848
|
if (isPrKind) {
|
|
21846
21849
|
waitingContext = { repo: p.waiting_repo, pr_number: p.waiting_pr };
|
|
21847
|
-
} else
|
|
21848
|
-
|
|
21850
|
+
} else {
|
|
21851
|
+
const ctx = {};
|
|
21852
|
+
if (p.waiting_choices && p.waiting_choices.length > 0) ctx.choices = p.waiting_choices;
|
|
21853
|
+
if (p.waiting_details && p.waiting_details.trim().length > 0) ctx.details = p.waiting_details;
|
|
21854
|
+
if (Object.keys(ctx).length > 0) waitingContext = ctx;
|
|
21849
21855
|
}
|
|
21850
21856
|
const data = await apiPost("/host/kanban", {
|
|
21851
21857
|
agent_id: AGT_AGENT_ID,
|
|
@@ -22533,6 +22539,9 @@ server.tool(
|
|
|
22533
22539
|
"Short form title (max 24 chars - the Slack modal title limit), shown on the button and as the modal heading. Put longer context in intro."
|
|
22534
22540
|
),
|
|
22535
22541
|
intro: external_exports.string().max(1e3).optional().describe("Optional context shown above the button and inside the modal (what you are asking and why)."),
|
|
22542
|
+
button_label: external_exports.string().min(1).max(75).optional().describe(
|
|
22543
|
+
'Optional label for the button that opens the form (max 75 chars). Defaults to "Fill out form". Use a specific call-to-action so the person knows what they are opening, e.g. "Start intake", "Give feedback", "Book a slot", "Submit your update".'
|
|
22544
|
+
),
|
|
22536
22545
|
schema: external_exports.record(external_exports.unknown()).describe(
|
|
22537
22546
|
'The form definition as a constrained JSON Schema: { "type": "object", "properties": { "<field>": { "type": "string|number|integer|boolean|array", "enum"?: [...], "format"?: "date|time|date-time|email|uri", ... } }, "required": ["..."] }. Flat only - no nested objects or oneOf/anyOf/allOf.'
|
|
22538
22547
|
),
|
|
@@ -22555,6 +22564,7 @@ server.tool(
|
|
|
22555
22564
|
...params.thread_ts ? { thread_ts: params.thread_ts } : {},
|
|
22556
22565
|
title: params.title,
|
|
22557
22566
|
...params.intro ? { intro: params.intro } : {},
|
|
22567
|
+
...params.button_label ? { button_label: params.button_label } : {},
|
|
22558
22568
|
schema: params.schema,
|
|
22559
22569
|
...params.request_id ? { request_id: params.request_id } : {}
|
|
22560
22570
|
});
|
package/dist/mcp/origami.js
CHANGED
|
@@ -38842,7 +38842,10 @@ var INTEGRATION_REGISTRY = [
|
|
|
38842
38842
|
note: "Billed per second of generated video; the rate depends on the resolution.",
|
|
38843
38843
|
meters: [
|
|
38844
38844
|
{ event_type: "grok_imagine_video_1_5_480p", unit: "second" },
|
|
38845
|
-
{ event_type: "grok_imagine_video_1_5_720p", unit: "second" }
|
|
38845
|
+
{ event_type: "grok_imagine_video_1_5_720p", unit: "second" },
|
|
38846
|
+
// 1080p is image-to-video only (xAI restriction); metered when the
|
|
38847
|
+
// agent supplies image_url (ENG-7675).
|
|
38848
|
+
{ event_type: "grok_imagine_video_1_5_1080p", unit: "second" }
|
|
38846
38849
|
]
|
|
38847
38850
|
}
|
|
38848
38851
|
},
|
|
@@ -40115,6 +40118,41 @@ var FLAG_REGISTRY = [
|
|
|
40115
40118
|
// safety control, so mutations require explicit confirmation.
|
|
40116
40119
|
sensitive: true
|
|
40117
40120
|
},
|
|
40121
|
+
{
|
|
40122
|
+
key: "composio-hitl-mode",
|
|
40123
|
+
description: "Composio managed-toolkits HITL gate (ENG-6027): off = kill switch, shadow = resolve + audit the tier decision but never block, enforce = block write_high_risk+ calls (routed to approval when hitl-approval-routing is on). Per-org rollout from the admin Feature Flags page; ENG-7672 migrated this off the fleet-wide COMPOSIO_HITL_MODE env var.",
|
|
40124
|
+
flagType: "enum",
|
|
40125
|
+
allowedValues: ["off", "shadow", "enforce"],
|
|
40126
|
+
// Declared safe value is `shadow` (resolve + audit, never block) — NOT `off`.
|
|
40127
|
+
// shadow keeps the control evaluating + producing enforce-flip evidence while
|
|
40128
|
+
// staying non-blocking, and matches the pre-flag compiled default so migrating
|
|
40129
|
+
// onto the flag (ENG-7672) preserves fleet behaviour. A flag-DB read error
|
|
40130
|
+
// degrades here. `enforce` is the deliberate, audited flip.
|
|
40131
|
+
defaultValue: "shadow",
|
|
40132
|
+
// Migration override (ADR-0022): the pre-flags env gate stays the
|
|
40133
|
+
// highest-precedence operator override. It is only injected onto the Lambdas
|
|
40134
|
+
// when an operator explicitly sets it (sst.config.ts) — otherwise this flag governs.
|
|
40135
|
+
envVar: "COMPOSIO_HITL_MODE",
|
|
40136
|
+
// enforce blocks prod tool calls, so weakening it (enforce → shadow/off) drops a
|
|
40137
|
+
// safety control — mutations require explicit confirmation.
|
|
40138
|
+
sensitive: true
|
|
40139
|
+
},
|
|
40140
|
+
{
|
|
40141
|
+
key: "hitl-approval-routing",
|
|
40142
|
+
description: "Routing for HITL-blocked integration calls (ENG-6028): off = blocked calls return the terminal block, on = route them into the approval-core flow (approval_requests row + Slack approval card). Needs a block first (composio-hitl-mode=enforce, or the always-on Direct-HTTP lane). Per-org rollout; ENG-7672 migrated this off the fleet-wide HITL_APPROVAL_ROUTING env var.",
|
|
40143
|
+
flagType: "enum",
|
|
40144
|
+
allowedValues: ["off", "on"],
|
|
40145
|
+
// Declared safe value is `off` (terminal block, no new side effects) — the
|
|
40146
|
+
// most-restrictive-known state, matching the pre-flag default. A flag-DB read
|
|
40147
|
+
// error degrades here.
|
|
40148
|
+
defaultValue: "off",
|
|
40149
|
+
// Migration override (ADR-0022): only injected onto the Lambdas when an operator
|
|
40150
|
+
// explicitly sets it (sst.config.ts) — otherwise this flag governs.
|
|
40151
|
+
envVar: "HITL_APPROVAL_ROUTING",
|
|
40152
|
+
// Turning routing on starts minting approval cards / approval_requests rows — an
|
|
40153
|
+
// egress + workflow change worth an explicit confirm.
|
|
40154
|
+
sensitive: true
|
|
40155
|
+
},
|
|
40118
40156
|
{
|
|
40119
40157
|
key: "slack-reply-binding",
|
|
40120
40158
|
description: "Slack reply-target binding (ENG-7396 / WS2, cross-thread reply routing): the model names which inbound it answers (inbound_id) and the server resolves the destination from its own verified record. shadow = classify + count only, routing unchanged; warn = same routing plus a tool-result note so the model self-corrects; enforce = route a bound reply to the registry thread and REJECT a reply whose target matches no inbound this process delivered. The channel server can't evaluate flags, so the manager materializes the resolved value into the AGT_SLACK_REPLY_BINDING spawn env (the operator/canary override, ADR-0022). Ships shadow.",
|
|
@@ -15629,7 +15629,8 @@ var SLACK_EGRESS_TOOLS = /* @__PURE__ */ new Set([
|
|
|
15629
15629
|
"slack.react",
|
|
15630
15630
|
"slack.send_structured",
|
|
15631
15631
|
"slack.ask_user",
|
|
15632
|
-
"slack.upload_file"
|
|
15632
|
+
"slack.upload_file",
|
|
15633
|
+
"slack.update"
|
|
15633
15634
|
]);
|
|
15634
15635
|
|
|
15635
15636
|
// src/strip-repost-preamble.ts
|
|
@@ -20417,6 +20418,25 @@ mcp.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
|
20417
20418
|
required: ["channel", "timestamp", "emoji"]
|
|
20418
20419
|
}
|
|
20419
20420
|
},
|
|
20421
|
+
{
|
|
20422
|
+
name: "slack.update",
|
|
20423
|
+
description: 'Edit the text of a Slack message YOU already sent (Slack chat.update). Pass the channel and the message\'s ts (slack.reply returns it as `(ts=\u2026)` on a successful send) plus the new text. You can only edit your OWN messages. This REPLACES the message text - any block layout on the original is cleared - so use it to correct a typo or update a message in place instead of posting a new one. NOTE: editing an interim "On it\u2026" into the final answer does NOT clear the pending-reply obligation - your final answer must still be a separate slack.reply (interim omitted). Common Slack errors: message_not_found (wrong ts/channel), cant_update_message (not your message), edit_window_closed.',
|
|
20424
|
+
inputSchema: {
|
|
20425
|
+
type: "object",
|
|
20426
|
+
properties: {
|
|
20427
|
+
channel: {
|
|
20428
|
+
type: "string",
|
|
20429
|
+
description: "Slack channel ID the message is in (the same channel you sent it to)."
|
|
20430
|
+
},
|
|
20431
|
+
ts: {
|
|
20432
|
+
type: "string",
|
|
20433
|
+
description: 'Timestamp of the message to edit - the `ts` value slack.reply returned when you sent it (e.g. "1783902864.258519"). Must be a message the bot itself sent.'
|
|
20434
|
+
},
|
|
20435
|
+
text: { type: "string", description: "The new message text. Replaces the existing text." }
|
|
20436
|
+
},
|
|
20437
|
+
required: ["channel", "ts", "text"]
|
|
20438
|
+
}
|
|
20439
|
+
},
|
|
20420
20440
|
{
|
|
20421
20441
|
name: "slack.read_thread",
|
|
20422
20442
|
description: "Read the full message history of a Slack thread. Inbound thread replies already carry the surrounding thread inline as the <channel> tag's thread_context attribute \u2014 ground your reply in that first, and only call this tool when you need MORE history than thread_context shows (it is capped to recent messages) or to catch up on an auto-followed thread.",
|
|
@@ -20820,8 +20840,10 @@ mcp.setRequestHandler(CallToolRequestSchema, async (req) => {
|
|
|
20820
20840
|
}
|
|
20821
20841
|
})();
|
|
20822
20842
|
}
|
|
20843
|
+
const base = bindingFeedback ? `sent. ${bindingFeedback}` : "sent";
|
|
20844
|
+
const sentTs = typeof data.ts === "string" ? data.ts : void 0;
|
|
20823
20845
|
return {
|
|
20824
|
-
content: [{ type: "text", text:
|
|
20846
|
+
content: [{ type: "text", text: sentTs ? `${base} (ts=${sentTs})` : base }]
|
|
20825
20847
|
};
|
|
20826
20848
|
} catch (err) {
|
|
20827
20849
|
return {
|
|
@@ -20868,6 +20890,40 @@ mcp.setRequestHandler(CallToolRequestSchema, async (req) => {
|
|
|
20868
20890
|
};
|
|
20869
20891
|
}
|
|
20870
20892
|
}
|
|
20893
|
+
if (name === "slack.update") {
|
|
20894
|
+
const { channel, ts, text } = args;
|
|
20895
|
+
if (!channel || !ts || typeof text !== "string") {
|
|
20896
|
+
return {
|
|
20897
|
+
content: [{ type: "text", text: "slack.update requires channel, ts and text" }],
|
|
20898
|
+
isError: true
|
|
20899
|
+
};
|
|
20900
|
+
}
|
|
20901
|
+
try {
|
|
20902
|
+
const res = await fetch("https://slack.com/api/chat.update", {
|
|
20903
|
+
method: "POST",
|
|
20904
|
+
headers: {
|
|
20905
|
+
"Content-Type": "application/json; charset=utf-8",
|
|
20906
|
+
Authorization: `Bearer ${BOT_TOKEN}`
|
|
20907
|
+
},
|
|
20908
|
+
// text only: chat.update replaces the message, clearing any prior blocks.
|
|
20909
|
+
body: JSON.stringify({ channel, ts, text }),
|
|
20910
|
+
signal: AbortSignal.timeout(8e3)
|
|
20911
|
+
});
|
|
20912
|
+
const data = await res.json();
|
|
20913
|
+
if (!data.ok) {
|
|
20914
|
+
return {
|
|
20915
|
+
content: [{ type: "text", text: `Slack error: ${data.error}` }],
|
|
20916
|
+
isError: true
|
|
20917
|
+
};
|
|
20918
|
+
}
|
|
20919
|
+
return { content: [{ type: "text", text: "updated" }] };
|
|
20920
|
+
} catch (err) {
|
|
20921
|
+
return {
|
|
20922
|
+
content: [{ type: "text", text: `Failed: ${err.message}` }],
|
|
20923
|
+
isError: true
|
|
20924
|
+
};
|
|
20925
|
+
}
|
|
20926
|
+
}
|
|
20871
20927
|
if (name === "slack.read_thread") {
|
|
20872
20928
|
const { channel, thread_ts, limit: rawLimit } = args;
|
|
20873
20929
|
const limit = Math.min(Math.max(rawLimit ?? 50, 1), 200);
|
|
@@ -36,7 +36,7 @@ import {
|
|
|
36
36
|
writeDirectChatSessionState,
|
|
37
37
|
writeEgressAllowlist,
|
|
38
38
|
writePersistentClaudeWrapper
|
|
39
|
-
} from "./chunk-
|
|
39
|
+
} from "./chunk-KMJHNKPQ.js";
|
|
40
40
|
import "./chunk-XWVM4KPK.js";
|
|
41
41
|
export {
|
|
42
42
|
EGRESS_BASELINE_DOMAINS,
|
|
@@ -77,4 +77,4 @@ export {
|
|
|
77
77
|
writeEgressAllowlist,
|
|
78
78
|
writePersistentClaudeWrapper
|
|
79
79
|
};
|
|
80
|
-
//# sourceMappingURL=persistent-session-
|
|
80
|
+
//# sourceMappingURL=persistent-session-RSM62IW7.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
paneLogPath
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-KMJHNKPQ.js";
|
|
4
4
|
import "./chunk-XWVM4KPK.js";
|
|
5
5
|
|
|
6
6
|
// src/lib/responsiveness-probe.ts
|
|
@@ -418,4 +418,4 @@ export {
|
|
|
418
418
|
readAndResetSlackReplyBindingClassifications,
|
|
419
419
|
readAndResetSlackReplyTargetClassifications
|
|
420
420
|
};
|
|
421
|
-
//# sourceMappingURL=responsiveness-probe-
|
|
421
|
+
//# sourceMappingURL=responsiveness-probe-DAKU7GSN.js.map
|
package/package.json
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|