@integrity-labs/agt-cli 0.28.476 → 0.28.478

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.
@@ -33505,6 +33505,10 @@ var INSTALLABLE_NATIVE_INTEGRATION_IDS = INSTALLABLE_NATIVE_INTEGRATIONS.map((i)
33505
33505
  var MB2 = 1024 * 1024;
33506
33506
  var DIRECT_CHAT_UPLOAD_MAX_BYTES = 10 * MB2;
33507
33507
 
33508
+ // ../core/dist/direct-chat/notice-display.js
33509
+ var AGENT_DIRECTED_NOTICE_KINDS = ["scheduled_task_nudge", "kanban_check"];
33510
+ var AGENT_DIRECTED_KIND_SET = new Set(AGENT_DIRECTED_NOTICE_KINDS);
33511
+
33508
33512
  // ../core/dist/onboarding/state-machine.js
33509
33513
  var AREA_ORDER = [
33510
33514
  "framing",
@@ -35287,6 +35291,18 @@ var FLAG_REGISTRY = [
35287
35291
  // the sidebar renders inside the active-org cookie's scope, which is exactly
35288
35292
  // the org whose brand should be shown.
35289
35293
  public: true
35294
+ },
35295
+ {
35296
+ key: "agent-recruit",
35297
+ description: "The `recruit_agent` MCP tool (ENG-8159): lets an ordinary managed agent PROPOSE a new teammate in its own org. The proposal is filed under the `agent.recruit` approval verb and routed to an org owner as a server-rendered card, so this gates the ASK \u2014 nothing is created until a human taps Approve. Deliberately distinct from augmented-support-writes, which gates the concierge's own create_agent surface: the two requesters are separately controllable because an org may well want its support concierge to propose agents without giving every agent in the fleet the same power. Ships dark.",
35298
+ flagType: "boolean",
35299
+ // Declared safe value is `false`. The write is human-gated either way, but an
35300
+ // unbounded ask is still an unbounded demand on an owner's attention, so the
35301
+ // fail-closed direction on a flag-DB fault is "an agent cannot ask".
35302
+ defaultValue: false,
35303
+ // Turning this on lets agents originate proposals that create customer
35304
+ // infrastructure once approved — same posture as augmented-support-writes.
35305
+ sensitive: true
35290
35306
  }
35291
35307
  ];
35292
35308
  var REGISTRY_BY_KEY = new Map(FLAG_REGISTRY.map((definition) => [definition.key, definition]));
package/dist/mcp/index.js CHANGED
@@ -21357,6 +21357,64 @@ function describeFeatureRequestResult(resp) {
21357
21357
  };
21358
21358
  }
21359
21359
 
21360
+ // src/recruit-agent.ts
21361
+ function describeRecruitAgentResult(resp) {
21362
+ switch (resp.status) {
21363
+ case "proposed": {
21364
+ const name = resp.code_name ? `"${resp.code_name}"` : "the new agent";
21365
+ return {
21366
+ text: `Nothing has been created yet. Your request for ${name} was sent to an organization owner for approval` + (resp.expires_at ? ` and expires at ${resp.expires_at}` : "") + `.
21367
+
21368
+ ` + (resp.request_id ? `Check on it with check_approval using request_id "${resp.request_id}".
21369
+
21370
+ ` : "") + `Do NOT send this request again \u2014 a duplicate just puts a second card in front of the same person. Tell whoever asked that it is waiting on an owner's approval.`,
21371
+ isError: false
21372
+ };
21373
+ }
21374
+ case "feature_disabled":
21375
+ return {
21376
+ text: `${resp.message ?? "Recruiting teammates is not enabled for this organization."} This is a setting, not a fault \u2014 do not retry. Tell your operator what you need and why.`,
21377
+ isError: true
21378
+ };
21379
+ case "agent_limit_reached":
21380
+ return {
21381
+ text: `${resp.message ?? "Your organization's plan agent limit has been reached."} Retrying will not help: someone has to free a slot or upgrade the plan first.`,
21382
+ isError: true
21383
+ };
21384
+ case "name_reserved":
21385
+ return {
21386
+ text: `${resp.message ?? "That display name is reserved."} Pick a different display_name and try once more.`,
21387
+ isError: true
21388
+ };
21389
+ case "no_approver":
21390
+ return {
21391
+ text: `${resp.message ?? "No approval channel is configured for your organization."} Nothing was sent to anyone. Do not retry until an operator has set this up.`,
21392
+ isError: true
21393
+ };
21394
+ case "delivery_failed":
21395
+ return {
21396
+ text: `${resp.message ?? "The approval card could not be delivered."} The request was not left waiting \u2014 it has been closed, so a fresh attempt is needed once the messaging setup is fixed.`,
21397
+ isError: true
21398
+ };
21399
+ case "rate_limited": {
21400
+ const mins = resp.retry_after_seconds ? Math.ceil(resp.retry_after_seconds / 60) : null;
21401
+ return {
21402
+ text: (
21403
+ // Relay the server's own wording like every other branch does; it can
21404
+ // carry a specific quota detail the generic sentence would drop.
21405
+ `${resp.message ?? "Too many pending recruit proposals"}${mins ? ` Try again in about ${mins} minutes.` : ""} This limit exists to protect the person who has to read these \u2014 do not work around it.`
21406
+ ),
21407
+ isError: true
21408
+ };
21409
+ }
21410
+ default:
21411
+ return {
21412
+ text: `Could not request a new teammate${resp.message ? `: ${resp.message}` : ""}. Nothing was created and nobody was asked. Fix what the message describes, or tell your operator \u2014 don't keep retrying.`,
21413
+ isError: true
21414
+ };
21415
+ }
21416
+ }
21417
+
21360
21418
  // src/request-reconnect.ts
21361
21419
  function describeReconnectRequestResult(resp) {
21362
21420
  switch (resp.status) {
@@ -22541,6 +22599,62 @@ server.tool(
22541
22599
  return { content: [{ type: "text", text }], ...isError ? { isError: true } : {} };
22542
22600
  }
22543
22601
  );
22602
+ server.tool(
22603
+ "recruit_agent",
22604
+ "Propose a NEW teammate agent for your organization when the work in front of you genuinely needs a different agent \u2014 a distinct role, a separate remit, or capacity you cannot cover yourself. This does NOT create anything: it sends a request to an organization owner, who approves or denies it. Use it sparingly and only when you can say concretely what the new agent is for; do not use it to duplicate yourself, to get around a tool you are missing (use request_feature), or because a single task is large. After calling this, stop and report that it is awaiting approval \u2014 poll with check_approval if you need the outcome.",
22605
+ {
22606
+ code_name: external_exports.string().min(1).max(64).regex(/^[a-z0-9]+(-[a-z0-9]+)*$/, "code_name must be kebab-case").describe(
22607
+ 'kebab-case identifier for the proposed agent (lowercase, hyphen-separated), e.g. "invoice-helper". If the name is already taken in your team a numeric suffix is added automatically.'
22608
+ ),
22609
+ display_name: external_exports.string().min(1).max(120).describe('Human-facing name for the proposed agent, e.g. "Invoice Helper".'),
22610
+ description: external_exports.string().min(20).max(2e3).describe(
22611
+ "What this teammate is FOR: its remit, the work it would take on, and why that work needs a separate agent. A human reads this to decide \u2014 be specific and honest. Vague descriptions get denied."
22612
+ ),
22613
+ role: external_exports.string().max(200).optional().describe('Optional short role label for the proposed agent, e.g. "Accounts receivable".'),
22614
+ reason: external_exports.string().max(1e3).optional().describe(
22615
+ "Optional context for the approver: what prompted this now (a spike in volume, a user request, a gap you keep hitting). Shown as context only \u2014 the decision is made on the description above."
22616
+ ),
22617
+ host_id: external_exports.string().uuid().optional().describe(
22618
+ "Optional host (UUID) to place the new agent on. Omit unless you have a specific reason \u2014 it defaults to your own host."
22619
+ )
22620
+ },
22621
+ async (params) => {
22622
+ if (!AGT_AGENT_CODE_NAME) {
22623
+ return {
22624
+ content: [{ type: "text", text: "Error: AGT_AGENT_CODE_NAME not configured." }],
22625
+ isError: true
22626
+ };
22627
+ }
22628
+ let resp;
22629
+ try {
22630
+ resp = await apiPost("/host/recruit-agent", {
22631
+ agent_code_name: AGT_AGENT_CODE_NAME,
22632
+ code_name: params.code_name,
22633
+ display_name: params.display_name,
22634
+ description: params.description,
22635
+ ...params.role ? { role: params.role } : {},
22636
+ ...params.reason ? { reason: params.reason } : {},
22637
+ ...params.host_id ? { host_id: params.host_id } : {}
22638
+ });
22639
+ } catch (err) {
22640
+ process.stderr.write(
22641
+ `recruit_agent: POST /host/recruit-agent failed: ${err instanceof Error ? err.message : String(err)}
22642
+ `
22643
+ );
22644
+ return {
22645
+ content: [
22646
+ {
22647
+ type: "text",
22648
+ text: "Could not reach the recruiting service. It is not known whether the request was filed \u2014 do not send it again; tell your operator to check the logs."
22649
+ }
22650
+ ],
22651
+ isError: true
22652
+ };
22653
+ }
22654
+ const { text, isError } = describeRecruitAgentResult(resp);
22655
+ return { content: [{ type: "text", text }], ...isError ? { isError: true } : {} };
22656
+ }
22657
+ );
22544
22658
  server.tool(
22545
22659
  "request_reconnect",
22546
22660
  'Ask for one of YOUR OWN integrations to be reconnected when its tools fail with authentication/authorization errors (expired or revoked credentials, "needs re-auth", 401/403 from the provider). This notifies your human manager with a reconnect link \u2014 you cannot re-auth an integration yourself. Use it once per failing integration instead of retrying the failing tool; do NOT use it for tools you never had, for transient errors (timeouts, rate limits), or to request new integrations (use request_feature for that).',
@@ -23916,6 +24030,10 @@ var LOCAL_TOOL_NAMES = /* @__PURE__ */ new Set([
23916
24030
  // ENG-7495: agent-requested integration reconnect (always registered). No
23917
24031
  // API tool shares this name; listed here to keep the lockstep guard green.
23918
24032
  "request_reconnect",
24033
+ // ENG-8159: propose a new teammate (always registered — the gate is the
24034
+ // server-side org-scoped agent-recruit flag, see the registration comment).
24035
+ // No API tool shares this name; listed here to keep the lockstep guard green.
24036
+ "recruit_agent",
23919
24037
  // ENG-6686: self-service identity edit (always registered). Listed here to
23920
24038
  // keep the lockstep guard green; no API tool shares this name.
23921
24039
  "update_identity",
@@ -39832,6 +39832,10 @@ var INSTALLABLE_NATIVE_INTEGRATION_IDS = INSTALLABLE_NATIVE_INTEGRATIONS.map((i)
39832
39832
  var MB2 = 1024 * 1024;
39833
39833
  var DIRECT_CHAT_UPLOAD_MAX_BYTES = 10 * MB2;
39834
39834
 
39835
+ // ../core/dist/direct-chat/notice-display.js
39836
+ var AGENT_DIRECTED_NOTICE_KINDS = ["scheduled_task_nudge", "kanban_check"];
39837
+ var AGENT_DIRECTED_KIND_SET = new Set(AGENT_DIRECTED_NOTICE_KINDS);
39838
+
39835
39839
  // ../core/dist/onboarding/state-machine.js
39836
39840
  var AREA_ORDER = [
39837
39841
  "framing",
@@ -41234,6 +41238,18 @@ var FLAG_REGISTRY = [
41234
41238
  // the sidebar renders inside the active-org cookie's scope, which is exactly
41235
41239
  // the org whose brand should be shown.
41236
41240
  public: true
41241
+ },
41242
+ {
41243
+ key: "agent-recruit",
41244
+ description: "The `recruit_agent` MCP tool (ENG-8159): lets an ordinary managed agent PROPOSE a new teammate in its own org. The proposal is filed under the `agent.recruit` approval verb and routed to an org owner as a server-rendered card, so this gates the ASK \u2014 nothing is created until a human taps Approve. Deliberately distinct from augmented-support-writes, which gates the concierge's own create_agent surface: the two requesters are separately controllable because an org may well want its support concierge to propose agents without giving every agent in the fleet the same power. Ships dark.",
41245
+ flagType: "boolean",
41246
+ // Declared safe value is `false`. The write is human-gated either way, but an
41247
+ // unbounded ask is still an unbounded demand on an owner's attention, so the
41248
+ // fail-closed direction on a flag-DB fault is "an agent cannot ask".
41249
+ defaultValue: false,
41250
+ // Turning this on lets agents originate proposals that create customer
41251
+ // infrastructure once approved — same posture as augmented-support-writes.
41252
+ sensitive: true
41237
41253
  }
41238
41254
  ];
41239
41255
  var REGISTRY_BY_KEY = new Map(FLAG_REGISTRY.map((definition) => [definition.key, definition]));
@@ -33727,6 +33727,10 @@ var INSTALLABLE_NATIVE_INTEGRATION_IDS = INSTALLABLE_NATIVE_INTEGRATIONS.map((i)
33727
33727
  var MB2 = 1024 * 1024;
33728
33728
  var DIRECT_CHAT_UPLOAD_MAX_BYTES = 10 * MB2;
33729
33729
 
33730
+ // ../core/dist/direct-chat/notice-display.js
33731
+ var AGENT_DIRECTED_NOTICE_KINDS = ["scheduled_task_nudge", "kanban_check"];
33732
+ var AGENT_DIRECTED_KIND_SET = new Set(AGENT_DIRECTED_NOTICE_KINDS);
33733
+
33730
33734
  // ../core/dist/onboarding/state-machine.js
33731
33735
  var AREA_ORDER = [
33732
33736
  "framing",
@@ -35512,6 +35516,18 @@ var FLAG_REGISTRY = [
35512
35516
  // the sidebar renders inside the active-org cookie's scope, which is exactly
35513
35517
  // the org whose brand should be shown.
35514
35518
  public: true
35519
+ },
35520
+ {
35521
+ key: "agent-recruit",
35522
+ description: "The `recruit_agent` MCP tool (ENG-8159): lets an ordinary managed agent PROPOSE a new teammate in its own org. The proposal is filed under the `agent.recruit` approval verb and routed to an org owner as a server-rendered card, so this gates the ASK \u2014 nothing is created until a human taps Approve. Deliberately distinct from augmented-support-writes, which gates the concierge's own create_agent surface: the two requesters are separately controllable because an org may well want its support concierge to propose agents without giving every agent in the fleet the same power. Ships dark.",
35523
+ flagType: "boolean",
35524
+ // Declared safe value is `false`. The write is human-gated either way, but an
35525
+ // unbounded ask is still an unbounded demand on an owner's attention, so the
35526
+ // fail-closed direction on a flag-DB fault is "an agent cannot ask".
35527
+ defaultValue: false,
35528
+ // Turning this on lets agents originate proposals that create customer
35529
+ // infrastructure once approved — same posture as augmented-support-writes.
35530
+ sensitive: true
35515
35531
  }
35516
35532
  ];
35517
35533
  var REGISTRY_BY_KEY = new Map(FLAG_REGISTRY.map((definition) => [definition.key, definition]));
@@ -34053,6 +34053,10 @@ var INSTALLABLE_NATIVE_INTEGRATION_IDS = INSTALLABLE_NATIVE_INTEGRATIONS.map((i)
34053
34053
  var MB2 = 1024 * 1024;
34054
34054
  var DIRECT_CHAT_UPLOAD_MAX_BYTES = 10 * MB2;
34055
34055
 
34056
+ // ../core/dist/direct-chat/notice-display.js
34057
+ var AGENT_DIRECTED_NOTICE_KINDS = ["scheduled_task_nudge", "kanban_check"];
34058
+ var AGENT_DIRECTED_KIND_SET = new Set(AGENT_DIRECTED_NOTICE_KINDS);
34059
+
34056
34060
  // ../core/dist/onboarding/state-machine.js
34057
34061
  var AREA_ORDER = [
34058
34062
  "framing",
@@ -35838,6 +35842,18 @@ var FLAG_REGISTRY = [
35838
35842
  // the sidebar renders inside the active-org cookie's scope, which is exactly
35839
35843
  // the org whose brand should be shown.
35840
35844
  public: true
35845
+ },
35846
+ {
35847
+ key: "agent-recruit",
35848
+ description: "The `recruit_agent` MCP tool (ENG-8159): lets an ordinary managed agent PROPOSE a new teammate in its own org. The proposal is filed under the `agent.recruit` approval verb and routed to an org owner as a server-rendered card, so this gates the ASK \u2014 nothing is created until a human taps Approve. Deliberately distinct from augmented-support-writes, which gates the concierge's own create_agent surface: the two requesters are separately controllable because an org may well want its support concierge to propose agents without giving every agent in the fleet the same power. Ships dark.",
35849
+ flagType: "boolean",
35850
+ // Declared safe value is `false`. The write is human-gated either way, but an
35851
+ // unbounded ask is still an unbounded demand on an owner's attention, so the
35852
+ // fail-closed direction on a flag-DB fault is "an agent cannot ask".
35853
+ defaultValue: false,
35854
+ // Turning this on lets agents originate proposals that create customer
35855
+ // infrastructure once approved — same posture as augmented-support-writes.
35856
+ sensitive: true
35841
35857
  }
35842
35858
  ];
35843
35859
  var REGISTRY_BY_KEY = new Map(FLAG_REGISTRY.map((definition) => [definition.key, definition]));
@@ -36,7 +36,7 @@ import {
36
36
  writeDirectChatSessionState,
37
37
  writeEgressAllowlist,
38
38
  writePersistentClaudeWrapper
39
- } from "./chunk-Q6RVMDAC.js";
39
+ } from "./chunk-WANZSIX6.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-QITF76DO.js.map
80
+ //# sourceMappingURL=persistent-session-FQKD2RA6.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  paneLogPath
3
- } from "./chunk-Q6RVMDAC.js";
3
+ } from "./chunk-WANZSIX6.js";
4
4
  import "./chunk-XWVM4KPK.js";
5
5
 
6
6
  // src/lib/responsiveness-probe.ts
@@ -596,4 +596,4 @@ export {
596
596
  readAndResetSlackReplyBindingClassifications,
597
597
  readAndResetSlackReplyTargetClassifications
598
598
  };
599
- //# sourceMappingURL=responsiveness-probe-BEA4J6IL.js.map
599
+ //# sourceMappingURL=responsiveness-probe-JQUE3XQG.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@integrity-labs/agt-cli",
3
- "version": "0.28.476",
3
+ "version": "0.28.478",
4
4
  "description": "Augmented Team CLI — agent provisioning and management",
5
5
  "type": "module",
6
6
  "engines": {