@integrity-labs/agt-cli 0.28.921 → 0.28.922

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
@@ -40,7 +40,7 @@ import {
40
40
  success,
41
41
  table,
42
42
  warn
43
- } from "../chunk-GWP5VUJ4.js";
43
+ } from "../chunk-JTWIYGY2.js";
44
44
  import {
45
45
  getProjectDir,
46
46
  isSessionResumeDisabled,
@@ -5467,7 +5467,7 @@ import { execFileSync, execSync } from "child_process";
5467
5467
  import { existsSync as existsSync11, realpathSync as realpathSync2 } from "fs";
5468
5468
  import chalk18 from "chalk";
5469
5469
  import ora16 from "ora";
5470
- var cliVersion = true ? "0.28.921" : "dev";
5470
+ var cliVersion = true ? "0.28.922" : "dev";
5471
5471
  async function fetchLatestVersion() {
5472
5472
  const host2 = getHost();
5473
5473
  if (!host2) return null;
@@ -6682,7 +6682,7 @@ function handleError(err) {
6682
6682
  }
6683
6683
 
6684
6684
  // src/bin/agt.ts
6685
- var cliVersion2 = true ? "0.28.921" : "dev";
6685
+ var cliVersion2 = true ? "0.28.922" : "dev";
6686
6686
  var program = new Command();
6687
6687
  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");
6688
6688
  program.hook("preAction", async (thisCommand, actionCommand) => {
@@ -6942,7 +6942,7 @@ function exchangeFailureKind(err) {
6942
6942
  }
6943
6943
 
6944
6944
  // src/lib/api-client.ts
6945
- var agtCliVersion = true ? "0.28.921" : "dev";
6945
+ var agtCliVersion = true ? "0.28.922" : "dev";
6946
6946
  var lastConfigHash = null;
6947
6947
  function setConfigHash(hash) {
6948
6948
  lastConfigHash = hash && hash.length > 0 ? hash : null;
@@ -11552,4 +11552,4 @@ export {
11552
11552
  managerInstallSystemUnitCommand,
11553
11553
  managerUninstallSystemUnitCommand
11554
11554
  };
11555
- //# sourceMappingURL=chunk-GWP5VUJ4.js.map
11555
+ //# sourceMappingURL=chunk-JTWIYGY2.js.map
@@ -63,7 +63,7 @@ import {
63
63
  safeWriteJsonAtomic,
64
64
  setConfigHash,
65
65
  tripClass
66
- } from "../chunk-GWP5VUJ4.js";
66
+ } from "../chunk-JTWIYGY2.js";
67
67
  import {
68
68
  getProjectDir as getProjectDir2,
69
69
  getReadyTasks,
@@ -13823,7 +13823,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
13823
13823
  var lastVersionCheckAt = 0;
13824
13824
  var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
13825
13825
  var lastResponsivenessProbeAt = 0;
13826
- var agtCliVersion = true ? "0.28.921" : "dev";
13826
+ var agtCliVersion = true ? "0.28.922" : "dev";
13827
13827
  function resolveBrewPath(execFileSync2) {
13828
13828
  try {
13829
13829
  const out = execFileSync2("which", ["brew"], { timeout: 5e3 }).toString().trim();
package/dist/mcp/index.js CHANGED
@@ -48514,7 +48514,7 @@ server.tool(
48514
48514
  );
48515
48515
  server.tool(
48516
48516
  "routine_list",
48517
- "List the routines YOU own - the recurring responsibilities a human accepted on your behalf. Call this FIRST whenever you need a routine_id: routine_revise and submit_routine_output both require one, and this is the only tool that produces it. Each entry gives you the routine_id, its name and status, the schedule it runs on (id, cron, timezone), its version, whether it owes a submit_routine_output call, and its FULL current prompt. The prompt is complete and untruncated on purpose: routine_revise replaces a routine's substance wholesale, so anything missing from what you read is missing from what you write. Read it here before revising rather than reconstructing it from memory. Returns an empty list if you own none - that is an answer, not an error.",
48517
+ "List the routines YOU own - the recurring responsibilities a human accepted on your behalf. Call this FIRST whenever you need a routine_id: routine_revise and submit_routine_output both require one, and this is the only tool that produces it. Each entry gives you the routine_id, its name and status, the schedule it runs on (id, cron, timezone), its version, whether it owes a submit_routine_output call, whether a revision you proposed is still waiting on your manager (ENG-10494 - one is pending until they resolve it, and it blocks every further revision of that routine), and its FULL current prompt. The prompt is complete and untruncated on purpose: routine_revise replaces a routine's substance wholesale, so anything missing from what you read is missing from what you write. Read it here before revising rather than reconstructing it from memory. Returns an empty list if you own none - that is an answer, not an error.",
48518
48518
  {},
48519
48519
  async () => {
48520
48520
  try {
@@ -48537,9 +48537,13 @@ server.tool(
48537
48537
  const when = r.cron ? `cron ${r.cron}` : r.every ? `every ${r.every}` : "no schedule";
48538
48538
  const tz = r.timezone ? ` ${r.timezone}` : "";
48539
48539
  const gated = r.requires_output_approval ? "\n approval: REQUIRED \u2014 call submit_routine_output instead of delivering directly" : "";
48540
+ const pending = r.pending_revision ? `
48541
+ revision pending since ${r.pending_revision.proposed_at}` + (r.pending_revision.summary ? ` \u2014 "${r.pending_revision.summary}"` : "") + (r.pending_revision.snoozed_until ? `
48542
+ your manager chose "not now"; the card re-surfaces ${r.pending_revision.snoozed_until}` : "") + (r.pending_revision.review_url ? `
48543
+ review: ${r.pending_revision.review_url}` : "") + "\n You cannot propose another revision of this routine until they resolve it. Call routine_proposal_status to read what is waiting." : "";
48540
48544
  return `\u2022 ${r.name} [${r.status}] v${r.version}
48541
48545
  routine_id: ${r.routine_id}
48542
- schedule_id: ${r.schedule_id ?? "(none \u2014 this routine has no runtime row)"} (${when}${tz})${gated}
48546
+ schedule_id: ${r.schedule_id ?? "(none \u2014 this routine has no runtime row)"} (${when}${tz})${gated}${pending}
48543
48547
  prompt:
48544
48548
  ${r.prompt ?? "(none)"}`;
48545
48549
  }).join("\n\n");
@@ -48589,11 +48593,14 @@ server.tool(
48589
48593
  content: [{ type: "text", text: data.error ?? data.message ?? "Could not propose the revision." }]
48590
48594
  };
48591
48595
  }
48596
+ const link = data.review_url ? `
48597
+
48598
+ Give your manager this link so they can accept or decline it: ${data.review_url}` : "";
48592
48599
  return {
48593
48600
  content: [
48594
48601
  {
48595
48602
  type: "text",
48596
- text: data.message ?? "Revision proposed. The live routine is unchanged until your manager accepts it."
48603
+ text: (data.message ?? "Revision proposed. The live routine is unchanged until your manager accepts it.") + link + "\n\nCheck the outcome later with routine_proposal_status \u2014 until they resolve this one you cannot propose another revision of this routine."
48597
48604
  }
48598
48605
  ]
48599
48606
  };
@@ -48612,6 +48619,74 @@ server.tool(
48612
48619
  }
48613
48620
  }
48614
48621
  );
48622
+ server.tool(
48623
+ "routine_proposal_status",
48624
+ "Read the outcome of the routine revisions YOU proposed with routine_revise: pending (your manager has not resolved it yet), accepted, declined, or expired - plus the summary and the FULL replacement description you submitted, so you can see what is actually waiting on them. A pending proposal also returns a review_url to hand to your manager, and is flagged `stale` when the routine has changed since you proposed (accepting it would apply a rewrite of text the routine no longer says - propose again against the current prompt instead). Call this when routine_list shows a revision pending, when routine_revise refuses because one already is, or to close the loop on a proposal you filed in an earlier session. No decline reason is recorded anywhere on this path, so a declined proposal tells you THAT it was declined and not why - ask the person rather than reporting a reason you do not have.",
48625
+ {
48626
+ routine_id: external_exports.string().trim().min(1).optional().describe("Optional: only proposals targeting this routine (the id from routine_list).")
48627
+ },
48628
+ async (params) => {
48629
+ try {
48630
+ const data = await apiPost(
48631
+ "/host/routines/proposals",
48632
+ {
48633
+ agent_id: AGT_AGENT_ID,
48634
+ ...params.routine_id ? { routine_id: params.routine_id } : {}
48635
+ },
48636
+ false,
48637
+ 15e3,
48638
+ "routine_proposal_status",
48639
+ true
48640
+ );
48641
+ if (!data.ok) {
48642
+ return { content: [{ type: "text", text: data.error ?? "Could not read your revision proposals." }] };
48643
+ }
48644
+ const proposals = data.proposals ?? [];
48645
+ if (proposals.length === 0) {
48646
+ return {
48647
+ content: [
48648
+ {
48649
+ type: "text",
48650
+ text: params.routine_id ? `You have proposed no revisions of routine ${params.routine_id}.` : "You have proposed no routine revisions."
48651
+ }
48652
+ ]
48653
+ };
48654
+ }
48655
+ const body = proposals.map((p2) => {
48656
+ const stale = p2.stale ? `
48657
+ STALE \u2014 the routine is now v${p2.current_version ?? "?"} but you proposed against v${p2.from_version ?? "?"}. Read the current prompt with routine_list and propose again.` : "";
48658
+ const snoozed = p2.snoozed_until ? `
48659
+ your manager chose "not now"; the card re-surfaces ${p2.snoozed_until}` : "";
48660
+ const resolved = p2.resolved_at ? `
48661
+ resolved: ${p2.resolved_at}` : "";
48662
+ const link = p2.review_url ? `
48663
+ review: ${p2.review_url}` : "";
48664
+ return `\u2022 ${p2.routine_name ?? p2.routine_id} \u2014 ${p2.state.toUpperCase()}${stale}
48665
+ routine_id: ${p2.routine_id}
48666
+ proposed: ${p2.proposed_at}${resolved}${snoozed}${link}
48667
+ summary: ${p2.summary ?? "(none)"}
48668
+ proposed description:
48669
+ ${p2.proposed_description ?? "(none)"}`;
48670
+ }).join("\n\n");
48671
+ return {
48672
+ content: [
48673
+ {
48674
+ type: "text",
48675
+ text: `${proposals.length} routine revision${proposals.length === 1 ? "" : "s"} you proposed:
48676
+
48677
+ ${body}` + (data.truncated ? "\n\nTHIS IS A PAGE, NOT THE WHOLE HISTORY \u2014 the read hit its row cap, so older proposals exist that are not listed. Pass routine_id to narrow it." : "") + "\n\nNo decline reason is captured on this path \u2014 a declined proposal records that it was declined, not why."
48678
+ }
48679
+ ]
48680
+ };
48681
+ } catch (err) {
48682
+ const msg = err instanceof Error ? err.message : String(err);
48683
+ return {
48684
+ content: [{ type: "text", text: `Could not read your revision proposals: ${msg}` }],
48685
+ isError: true
48686
+ };
48687
+ }
48688
+ }
48689
+ );
48615
48690
  server.tool(
48616
48691
  "submit_routine_output",
48617
48692
  "Submit a gated routine's drafted output for human approval. Use ONLY when your routine prompt says the routine is in its approval phase - the platform delivers the draft after sign-off; do not deliver it yourself.",
@@ -49498,6 +49573,9 @@ var LOCAL_TOOL_NAMES = /* @__PURE__ */ new Set([
49498
49573
  "routine_revise",
49499
49574
  // ENG-9431: the discovery primitive both of the above depend on.
49500
49575
  "routine_list",
49576
+ // ENG-10494: the verdict loop for routine_revise. Without it a proposed
49577
+ // revision is write-only, and an unseen one blocks that routine for good.
49578
+ "routine_proposal_status",
49501
49579
  // ENG-10276: knowledge_get is the untruncated single-entry read. The list and
49502
49580
  // search tools serve a stored SUMMARY column, not the entry, so this is the
49503
49581
  // only one that can be trusted before a knowledge_update.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@integrity-labs/agt-cli",
3
- "version": "0.28.921",
3
+ "version": "0.28.922",
4
4
  "description": "Augmented Team CLI — agent provisioning and management",
5
5
  "type": "module",
6
6
  "engines": {