@integrity-labs/agt-cli 0.28.670 → 0.28.672

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 (27) hide show
  1. package/dist/bin/agt.js +6 -6
  2. package/dist/bin/agt.js.map +1 -1
  3. package/dist/{chunk-Z4O42VGJ.js → chunk-EX6INJDG.js} +20 -76
  4. package/dist/chunk-EX6INJDG.js.map +1 -0
  5. package/dist/{chunk-5GDKWIB3.js → chunk-YAVWYI5S.js} +126 -15
  6. package/dist/chunk-YAVWYI5S.js.map +1 -0
  7. package/dist/{chunk-HGVJVYKW.js → chunk-YOID6KOQ.js} +43 -1
  8. package/dist/chunk-YOID6KOQ.js.map +1 -0
  9. package/dist/{claude-pair-runtime-W6KBVHK4.js → claude-pair-runtime-UZ2JB2KY.js} +2 -2
  10. package/dist/lib/manager-worker.js +52 -20
  11. package/dist/lib/manager-worker.js.map +1 -1
  12. package/dist/mcp/direct-chat-channel.js +42 -0
  13. package/dist/mcp/index.js +42 -0
  14. package/dist/mcp/origami.js +42 -0
  15. package/dist/mcp/slack-channel.js +42 -0
  16. package/dist/mcp/telegram-channel.js +42 -0
  17. package/dist/{persistent-session-RZH67PNC.js → persistent-session-PYAJ4VJW.js} +3 -3
  18. package/dist/{responsiveness-probe-NPNMNOFF.js → responsiveness-probe-5I2LIVCA.js} +3 -3
  19. package/dist/{session-auth-dead-CFAYSZ43.js → session-auth-dead-NUX643UJ.js} +2 -2
  20. package/package.json +1 -1
  21. package/dist/chunk-5GDKWIB3.js.map +0 -1
  22. package/dist/chunk-HGVJVYKW.js.map +0 -1
  23. package/dist/chunk-Z4O42VGJ.js.map +0 -1
  24. /package/dist/{claude-pair-runtime-W6KBVHK4.js.map → claude-pair-runtime-UZ2JB2KY.js.map} +0 -0
  25. /package/dist/{persistent-session-RZH67PNC.js.map → persistent-session-PYAJ4VJW.js.map} +0 -0
  26. /package/dist/{responsiveness-probe-NPNMNOFF.js.map → responsiveness-probe-5I2LIVCA.js.map} +0 -0
  27. /package/dist/{session-auth-dead-CFAYSZ43.js.map → session-auth-dead-NUX643UJ.js.map} +0 -0
@@ -36456,6 +36456,27 @@ var FLAG_REGISTRY = [
36456
36456
  // consumed by the manager's own logic, not an in-container MCP, so no env materialization.
36457
36457
  defaultValue: false
36458
36458
  },
36459
+ {
36460
+ key: "spawn-inject-channel-secrets",
36461
+ description: "ENG-9350 (host key-management hardening, epic ENG-9347): deliver a managed agent's channel bot tokens (SLACK_BOT_TOKEN, SLACK_APP_TOKEN, TELEGRAM_BOT_TOKEN, MSTEAMS_CLIENT_SECRET) into the Claude Code spawn env via `tmux new-session -e KEY=VALUE` (the same posture as ANTHROPIC_API_KEY / AGT_API_KEY) instead of writing them as plaintext to the on-disk `.env.integrations` file. ON = the manager injects the four channel secrets at spawn and evicts them from `.env.integrations`; the `.mcp.json` `${VAR}` templates are unchanged and now resolve from the spawn env, so the value never touches persistent EBS (and, under Docker isolation, is name-only forwarded into the container the same way AGT_API_KEY is). OFF (default) = today's behaviour, byte-for-byte: the tokens are written to `.env.integrations` (0600) and the wrapper sources them. Resolved host-side by the manager via hostFlagStore().getBooleanForAgent \u2014 the manager owns the spawn path, so no in-container MCP reads this; it materializes the VALUES, not the flag. A channel- token rotation already forces a session respawn (ENG-6062), so the injected value is bound at the same moment the file value used to be \u2014 the two paths are behaviourally equivalent, this one just keeps the plaintext off disk. Ships dark; flip per-agent/ host to soak before fleet convergence, flip OFF to fall back to the file path instantly without a code rollback. Integration credentials + the OAuth remote-MCP live-read proxy deliberately stay on the file (later slices / a permanent bounded carve-out, ADR-0062 Part 5).",
36462
+ flagType: "boolean",
36463
+ // Declared safe value is `false`: the current on-disk `.env.integrations` delivery,
36464
+ // byte-for-byte. `false` is also the fail-safe direction — a flag-store read error must
36465
+ // never silently move a fleet onto the spawn-env path (a bug there = a channel with no
36466
+ // token = a silently dead channel). Net-new gate consumed by the manager's own spawn
36467
+ // logic, not an in-container MCP, so registry-only with NO envVar materialization
36468
+ // (mirrors scheduled-task-nudge-durable). Turning it ON removes plaintext at rest.
36469
+ defaultValue: false,
36470
+ // ENG-7997 flip-reach estimate: `since` is the first agt-cli build whose
36471
+ // dist carries this host-side reader. That build is the one THIS PR's merge
36472
+ // auto-publishes — unknown until then, and every already-published version
36473
+ // (0.28.x) demonstrably lacks the reader (CodeRabbit npm-pack check). An
36474
+ // UNREACHABLE placeholder is the fail-safe: the reach estimate counts zero
36475
+ // hosts as honoring the flip (rather than over-claiming that 0.28.x hosts do,
36476
+ // while they still write tokens to disk). MUST be updated to the actual
36477
+ // published version once the release lands (tracked on ENG-9350).
36478
+ since: "99.0.0"
36479
+ },
36459
36480
  {
36460
36481
  key: "scheduled-task-confirmation-card",
36461
36482
  description: `Post the \u{1F44D}/\u{1F44E} "Task complete?" kanban confirmation card for completed scheduled_task runs (ENG-4576 / ENG-6048). OFF (default) kills these cards fleet-wide: ENG-8072 found they mis-thread onto the run's captured slack_delivery, which in the persistent-session model is frequently a conversational reply rather than the task's own output - so a routine cron's confirmation card lands in an unrelated human thread (e.g. a half-hourly reconciliation card posted into a "you're back online" DM), and a clean cron emits a human \u{1F44D}/\u{1F44E} prompt on every tick regardless. The card was net-negative, so it is disabled by default. Turn it ON per org to restore scheduled-task ratings for a customer who wants them (e.g. a daily digest delivered to a channel). Evaluated per-org in the API (POST /host/runs/finish + the manager rating-prompt route) via getEvaluatedFlags(); the decision is passed into postScheduledTaskKanbanConfirmation. API-only gate - no host env materialization. Ships dark (cards off).`,
@@ -36599,6 +36620,27 @@ var FLAG_REGISTRY = [
36599
36620
  // never auto-attach an integration nobody asked for, and both ENG-8332
36600
36621
  // prerequisites above are still open.
36601
36622
  defaultValue: false
36623
+ },
36624
+ {
36625
+ key: "host-right-sizing",
36626
+ description: 'ADR-0072. Gates the HostRightSizer cron, which evaluates every managed EC2 host against 7 days of memory and CPU and (at enforce) resizes it one rung inside the host\'s own maintenance window. off = the cron returns immediately: nothing is read, nothing is written. shadow = evaluate, persist a verdict row per host, and post the weekly summary \u2014 NO resize, and no actor code runs. enforce = as shadow, plus enqueue resizes. AS OF PHASE 1 (ENG-9324) THERE IS NO ACTOR, SO `enforce` BEHAVES EXACTLY LIKE `shadow`: selecting it records the mode on each verdict row and changes nothing else, and no host is resized. This note comes out when the Phase 3 actor lands; until then treat enforce as shadow-with-a-label, not as an armed fleet. Ships dark: this mechanism ends in a stop/start of a customer production host, so an unreachable flag store must resolve to NOT acting. TWO BOUNDS WORTH KNOWING BEFORE FLIPPING. (1) off is not a stop button for in-flight work \u2014 HostResizeDispatcher reads only ec2_pending_instance_type and knows nothing about this flag, so flipping to off stops new enqueues and lets every already-enqueued host complete its stop/modify/start; combined with the ~5-minute eval cache the true blast unit is one tick of open windows. A real kill switch has to live inside the dispatcher. (2) BYO hosts (ADR-0028) are EXCLUDED in Phase 1, not merely clamped to shadow: their instances live in the customer AWS account while the cron authenticates only with the platform provisioner role, so their metrics read as empty and every evaluation would land as unknown. ADR-0072 \xA79 intends them to be shadow-only ("we recommend; they resize") and making that real needs the per-host cross_account_role_arn resolved - its own slice. Pool hosts (ADR-0042) are excluded too, while host_kind is unset in prod. Both are eligibility predicates applied by the cron, documented here so the admin page showing enforce for such an org is not read as behaviour.',
36627
+ flagType: "enum",
36628
+ allowedValues: ["off", "shadow", "enforce"],
36629
+ // Ships dark at `off`, NOT `shadow`. Diverging deliberately from
36630
+ // slack-scheduled-channel-guard, whose shadow is a free local log line:
36631
+ // THIS shadow spends a fleet-wide CloudWatch GetMetricData sweep per tick
36632
+ // and writes a row per host, so defaulting to shadow would newly bill and
36633
+ // newly write for every org that never opted in. shadow is the per-canary
36634
+ // opt-in; enforce is the audited flip after the Phase 2 review.
36635
+ defaultValue: "off",
36636
+ // Evaluated centrally, in the API cron — there is no host-side reader, so
36637
+ // no `since` and no dependence on fleet agt-cli convergence.
36638
+ // NOTE: deliberately NO envVar. ADR-0072 §9 wants this gate scoped per
36639
+ // org/host, and an envVar would be highest-precedence (ADR-0022) — a
36640
+ // literal in sst.config.ts would pin every stage and make the admin page a
36641
+ // control that does nothing, which is the ENG-8303 class exactly.
36642
+ // enforce arms automated downtime on a customer's production host.
36643
+ sensitive: true
36602
36644
  }
36603
36645
  ];
36604
36646
  var REGISTRY_BY_KEY = new Map(FLAG_REGISTRY.map((definition) => [definition.key, definition]));
package/dist/mcp/index.js CHANGED
@@ -43395,6 +43395,27 @@ var FLAG_REGISTRY = [
43395
43395
  // consumed by the manager's own logic, not an in-container MCP, so no env materialization.
43396
43396
  defaultValue: false
43397
43397
  },
43398
+ {
43399
+ key: "spawn-inject-channel-secrets",
43400
+ description: "ENG-9350 (host key-management hardening, epic ENG-9347): deliver a managed agent's channel bot tokens (SLACK_BOT_TOKEN, SLACK_APP_TOKEN, TELEGRAM_BOT_TOKEN, MSTEAMS_CLIENT_SECRET) into the Claude Code spawn env via `tmux new-session -e KEY=VALUE` (the same posture as ANTHROPIC_API_KEY / AGT_API_KEY) instead of writing them as plaintext to the on-disk `.env.integrations` file. ON = the manager injects the four channel secrets at spawn and evicts them from `.env.integrations`; the `.mcp.json` `${VAR}` templates are unchanged and now resolve from the spawn env, so the value never touches persistent EBS (and, under Docker isolation, is name-only forwarded into the container the same way AGT_API_KEY is). OFF (default) = today's behaviour, byte-for-byte: the tokens are written to `.env.integrations` (0600) and the wrapper sources them. Resolved host-side by the manager via hostFlagStore().getBooleanForAgent \u2014 the manager owns the spawn path, so no in-container MCP reads this; it materializes the VALUES, not the flag. A channel- token rotation already forces a session respawn (ENG-6062), so the injected value is bound at the same moment the file value used to be \u2014 the two paths are behaviourally equivalent, this one just keeps the plaintext off disk. Ships dark; flip per-agent/ host to soak before fleet convergence, flip OFF to fall back to the file path instantly without a code rollback. Integration credentials + the OAuth remote-MCP live-read proxy deliberately stay on the file (later slices / a permanent bounded carve-out, ADR-0062 Part 5).",
43401
+ flagType: "boolean",
43402
+ // Declared safe value is `false`: the current on-disk `.env.integrations` delivery,
43403
+ // byte-for-byte. `false` is also the fail-safe direction — a flag-store read error must
43404
+ // never silently move a fleet onto the spawn-env path (a bug there = a channel with no
43405
+ // token = a silently dead channel). Net-new gate consumed by the manager's own spawn
43406
+ // logic, not an in-container MCP, so registry-only with NO envVar materialization
43407
+ // (mirrors scheduled-task-nudge-durable). Turning it ON removes plaintext at rest.
43408
+ defaultValue: false,
43409
+ // ENG-7997 flip-reach estimate: `since` is the first agt-cli build whose
43410
+ // dist carries this host-side reader. That build is the one THIS PR's merge
43411
+ // auto-publishes — unknown until then, and every already-published version
43412
+ // (0.28.x) demonstrably lacks the reader (CodeRabbit npm-pack check). An
43413
+ // UNREACHABLE placeholder is the fail-safe: the reach estimate counts zero
43414
+ // hosts as honoring the flip (rather than over-claiming that 0.28.x hosts do,
43415
+ // while they still write tokens to disk). MUST be updated to the actual
43416
+ // published version once the release lands (tracked on ENG-9350).
43417
+ since: "99.0.0"
43418
+ },
43398
43419
  {
43399
43420
  key: "scheduled-task-confirmation-card",
43400
43421
  description: `Post the \u{1F44D}/\u{1F44E} "Task complete?" kanban confirmation card for completed scheduled_task runs (ENG-4576 / ENG-6048). OFF (default) kills these cards fleet-wide: ENG-8072 found they mis-thread onto the run's captured slack_delivery, which in the persistent-session model is frequently a conversational reply rather than the task's own output - so a routine cron's confirmation card lands in an unrelated human thread (e.g. a half-hourly reconciliation card posted into a "you're back online" DM), and a clean cron emits a human \u{1F44D}/\u{1F44E} prompt on every tick regardless. The card was net-negative, so it is disabled by default. Turn it ON per org to restore scheduled-task ratings for a customer who wants them (e.g. a daily digest delivered to a channel). Evaluated per-org in the API (POST /host/runs/finish + the manager rating-prompt route) via getEvaluatedFlags(); the decision is passed into postScheduledTaskKanbanConfirmation. API-only gate - no host env materialization. Ships dark (cards off).`,
@@ -43538,6 +43559,27 @@ var FLAG_REGISTRY = [
43538
43559
  // never auto-attach an integration nobody asked for, and both ENG-8332
43539
43560
  // prerequisites above are still open.
43540
43561
  defaultValue: false
43562
+ },
43563
+ {
43564
+ key: "host-right-sizing",
43565
+ description: 'ADR-0072. Gates the HostRightSizer cron, which evaluates every managed EC2 host against 7 days of memory and CPU and (at enforce) resizes it one rung inside the host\'s own maintenance window. off = the cron returns immediately: nothing is read, nothing is written. shadow = evaluate, persist a verdict row per host, and post the weekly summary \u2014 NO resize, and no actor code runs. enforce = as shadow, plus enqueue resizes. AS OF PHASE 1 (ENG-9324) THERE IS NO ACTOR, SO `enforce` BEHAVES EXACTLY LIKE `shadow`: selecting it records the mode on each verdict row and changes nothing else, and no host is resized. This note comes out when the Phase 3 actor lands; until then treat enforce as shadow-with-a-label, not as an armed fleet. Ships dark: this mechanism ends in a stop/start of a customer production host, so an unreachable flag store must resolve to NOT acting. TWO BOUNDS WORTH KNOWING BEFORE FLIPPING. (1) off is not a stop button for in-flight work \u2014 HostResizeDispatcher reads only ec2_pending_instance_type and knows nothing about this flag, so flipping to off stops new enqueues and lets every already-enqueued host complete its stop/modify/start; combined with the ~5-minute eval cache the true blast unit is one tick of open windows. A real kill switch has to live inside the dispatcher. (2) BYO hosts (ADR-0028) are EXCLUDED in Phase 1, not merely clamped to shadow: their instances live in the customer AWS account while the cron authenticates only with the platform provisioner role, so their metrics read as empty and every evaluation would land as unknown. ADR-0072 \xA79 intends them to be shadow-only ("we recommend; they resize") and making that real needs the per-host cross_account_role_arn resolved - its own slice. Pool hosts (ADR-0042) are excluded too, while host_kind is unset in prod. Both are eligibility predicates applied by the cron, documented here so the admin page showing enforce for such an org is not read as behaviour.',
43566
+ flagType: "enum",
43567
+ allowedValues: ["off", "shadow", "enforce"],
43568
+ // Ships dark at `off`, NOT `shadow`. Diverging deliberately from
43569
+ // slack-scheduled-channel-guard, whose shadow is a free local log line:
43570
+ // THIS shadow spends a fleet-wide CloudWatch GetMetricData sweep per tick
43571
+ // and writes a row per host, so defaulting to shadow would newly bill and
43572
+ // newly write for every org that never opted in. shadow is the per-canary
43573
+ // opt-in; enforce is the audited flip after the Phase 2 review.
43574
+ defaultValue: "off",
43575
+ // Evaluated centrally, in the API cron — there is no host-side reader, so
43576
+ // no `since` and no dependence on fleet agt-cli convergence.
43577
+ // NOTE: deliberately NO envVar. ADR-0072 §9 wants this gate scoped per
43578
+ // org/host, and an envVar would be highest-precedence (ADR-0022) — a
43579
+ // literal in sst.config.ts would pin every stage and make the admin page a
43580
+ // control that does nothing, which is the ENG-8303 class exactly.
43581
+ // enforce arms automated downtime on a customer's production host.
43582
+ sensitive: true
43541
43583
  }
43542
43584
  ];
43543
43585
  var REGISTRY_BY_KEY = new Map(FLAG_REGISTRY.map((definition) => [definition.key, definition]));
@@ -42206,6 +42206,27 @@ var FLAG_REGISTRY = [
42206
42206
  // consumed by the manager's own logic, not an in-container MCP, so no env materialization.
42207
42207
  defaultValue: false
42208
42208
  },
42209
+ {
42210
+ key: "spawn-inject-channel-secrets",
42211
+ description: "ENG-9350 (host key-management hardening, epic ENG-9347): deliver a managed agent's channel bot tokens (SLACK_BOT_TOKEN, SLACK_APP_TOKEN, TELEGRAM_BOT_TOKEN, MSTEAMS_CLIENT_SECRET) into the Claude Code spawn env via `tmux new-session -e KEY=VALUE` (the same posture as ANTHROPIC_API_KEY / AGT_API_KEY) instead of writing them as plaintext to the on-disk `.env.integrations` file. ON = the manager injects the four channel secrets at spawn and evicts them from `.env.integrations`; the `.mcp.json` `${VAR}` templates are unchanged and now resolve from the spawn env, so the value never touches persistent EBS (and, under Docker isolation, is name-only forwarded into the container the same way AGT_API_KEY is). OFF (default) = today's behaviour, byte-for-byte: the tokens are written to `.env.integrations` (0600) and the wrapper sources them. Resolved host-side by the manager via hostFlagStore().getBooleanForAgent \u2014 the manager owns the spawn path, so no in-container MCP reads this; it materializes the VALUES, not the flag. A channel- token rotation already forces a session respawn (ENG-6062), so the injected value is bound at the same moment the file value used to be \u2014 the two paths are behaviourally equivalent, this one just keeps the plaintext off disk. Ships dark; flip per-agent/ host to soak before fleet convergence, flip OFF to fall back to the file path instantly without a code rollback. Integration credentials + the OAuth remote-MCP live-read proxy deliberately stay on the file (later slices / a permanent bounded carve-out, ADR-0062 Part 5).",
42212
+ flagType: "boolean",
42213
+ // Declared safe value is `false`: the current on-disk `.env.integrations` delivery,
42214
+ // byte-for-byte. `false` is also the fail-safe direction — a flag-store read error must
42215
+ // never silently move a fleet onto the spawn-env path (a bug there = a channel with no
42216
+ // token = a silently dead channel). Net-new gate consumed by the manager's own spawn
42217
+ // logic, not an in-container MCP, so registry-only with NO envVar materialization
42218
+ // (mirrors scheduled-task-nudge-durable). Turning it ON removes plaintext at rest.
42219
+ defaultValue: false,
42220
+ // ENG-7997 flip-reach estimate: `since` is the first agt-cli build whose
42221
+ // dist carries this host-side reader. That build is the one THIS PR's merge
42222
+ // auto-publishes — unknown until then, and every already-published version
42223
+ // (0.28.x) demonstrably lacks the reader (CodeRabbit npm-pack check). An
42224
+ // UNREACHABLE placeholder is the fail-safe: the reach estimate counts zero
42225
+ // hosts as honoring the flip (rather than over-claiming that 0.28.x hosts do,
42226
+ // while they still write tokens to disk). MUST be updated to the actual
42227
+ // published version once the release lands (tracked on ENG-9350).
42228
+ since: "99.0.0"
42229
+ },
42209
42230
  {
42210
42231
  key: "scheduled-task-confirmation-card",
42211
42232
  description: `Post the \u{1F44D}/\u{1F44E} "Task complete?" kanban confirmation card for completed scheduled_task runs (ENG-4576 / ENG-6048). OFF (default) kills these cards fleet-wide: ENG-8072 found they mis-thread onto the run's captured slack_delivery, which in the persistent-session model is frequently a conversational reply rather than the task's own output - so a routine cron's confirmation card lands in an unrelated human thread (e.g. a half-hourly reconciliation card posted into a "you're back online" DM), and a clean cron emits a human \u{1F44D}/\u{1F44E} prompt on every tick regardless. The card was net-negative, so it is disabled by default. Turn it ON per org to restore scheduled-task ratings for a customer who wants them (e.g. a daily digest delivered to a channel). Evaluated per-org in the API (POST /host/runs/finish + the manager rating-prompt route) via getEvaluatedFlags(); the decision is passed into postScheduledTaskKanbanConfirmation. API-only gate - no host env materialization. Ships dark (cards off).`,
@@ -42349,6 +42370,27 @@ var FLAG_REGISTRY = [
42349
42370
  // never auto-attach an integration nobody asked for, and both ENG-8332
42350
42371
  // prerequisites above are still open.
42351
42372
  defaultValue: false
42373
+ },
42374
+ {
42375
+ key: "host-right-sizing",
42376
+ description: 'ADR-0072. Gates the HostRightSizer cron, which evaluates every managed EC2 host against 7 days of memory and CPU and (at enforce) resizes it one rung inside the host\'s own maintenance window. off = the cron returns immediately: nothing is read, nothing is written. shadow = evaluate, persist a verdict row per host, and post the weekly summary \u2014 NO resize, and no actor code runs. enforce = as shadow, plus enqueue resizes. AS OF PHASE 1 (ENG-9324) THERE IS NO ACTOR, SO `enforce` BEHAVES EXACTLY LIKE `shadow`: selecting it records the mode on each verdict row and changes nothing else, and no host is resized. This note comes out when the Phase 3 actor lands; until then treat enforce as shadow-with-a-label, not as an armed fleet. Ships dark: this mechanism ends in a stop/start of a customer production host, so an unreachable flag store must resolve to NOT acting. TWO BOUNDS WORTH KNOWING BEFORE FLIPPING. (1) off is not a stop button for in-flight work \u2014 HostResizeDispatcher reads only ec2_pending_instance_type and knows nothing about this flag, so flipping to off stops new enqueues and lets every already-enqueued host complete its stop/modify/start; combined with the ~5-minute eval cache the true blast unit is one tick of open windows. A real kill switch has to live inside the dispatcher. (2) BYO hosts (ADR-0028) are EXCLUDED in Phase 1, not merely clamped to shadow: their instances live in the customer AWS account while the cron authenticates only with the platform provisioner role, so their metrics read as empty and every evaluation would land as unknown. ADR-0072 \xA79 intends them to be shadow-only ("we recommend; they resize") and making that real needs the per-host cross_account_role_arn resolved - its own slice. Pool hosts (ADR-0042) are excluded too, while host_kind is unset in prod. Both are eligibility predicates applied by the cron, documented here so the admin page showing enforce for such an org is not read as behaviour.',
42377
+ flagType: "enum",
42378
+ allowedValues: ["off", "shadow", "enforce"],
42379
+ // Ships dark at `off`, NOT `shadow`. Diverging deliberately from
42380
+ // slack-scheduled-channel-guard, whose shadow is a free local log line:
42381
+ // THIS shadow spends a fleet-wide CloudWatch GetMetricData sweep per tick
42382
+ // and writes a row per host, so defaulting to shadow would newly bill and
42383
+ // newly write for every org that never opted in. shadow is the per-canary
42384
+ // opt-in; enforce is the audited flip after the Phase 2 review.
42385
+ defaultValue: "off",
42386
+ // Evaluated centrally, in the API cron — there is no host-side reader, so
42387
+ // no `since` and no dependence on fleet agt-cli convergence.
42388
+ // NOTE: deliberately NO envVar. ADR-0072 §9 wants this gate scoped per
42389
+ // org/host, and an envVar would be highest-precedence (ADR-0022) — a
42390
+ // literal in sst.config.ts would pin every stage and make the admin page a
42391
+ // control that does nothing, which is the ENG-8303 class exactly.
42392
+ // enforce arms automated downtime on a customer's production host.
42393
+ sensitive: true
42352
42394
  }
42353
42395
  ];
42354
42396
  var REGISTRY_BY_KEY = new Map(FLAG_REGISTRY.map((definition) => [definition.key, definition]));
@@ -36689,6 +36689,27 @@ var FLAG_REGISTRY = [
36689
36689
  // consumed by the manager's own logic, not an in-container MCP, so no env materialization.
36690
36690
  defaultValue: false
36691
36691
  },
36692
+ {
36693
+ key: "spawn-inject-channel-secrets",
36694
+ description: "ENG-9350 (host key-management hardening, epic ENG-9347): deliver a managed agent's channel bot tokens (SLACK_BOT_TOKEN, SLACK_APP_TOKEN, TELEGRAM_BOT_TOKEN, MSTEAMS_CLIENT_SECRET) into the Claude Code spawn env via `tmux new-session -e KEY=VALUE` (the same posture as ANTHROPIC_API_KEY / AGT_API_KEY) instead of writing them as plaintext to the on-disk `.env.integrations` file. ON = the manager injects the four channel secrets at spawn and evicts them from `.env.integrations`; the `.mcp.json` `${VAR}` templates are unchanged and now resolve from the spawn env, so the value never touches persistent EBS (and, under Docker isolation, is name-only forwarded into the container the same way AGT_API_KEY is). OFF (default) = today's behaviour, byte-for-byte: the tokens are written to `.env.integrations` (0600) and the wrapper sources them. Resolved host-side by the manager via hostFlagStore().getBooleanForAgent \u2014 the manager owns the spawn path, so no in-container MCP reads this; it materializes the VALUES, not the flag. A channel- token rotation already forces a session respawn (ENG-6062), so the injected value is bound at the same moment the file value used to be \u2014 the two paths are behaviourally equivalent, this one just keeps the plaintext off disk. Ships dark; flip per-agent/ host to soak before fleet convergence, flip OFF to fall back to the file path instantly without a code rollback. Integration credentials + the OAuth remote-MCP live-read proxy deliberately stay on the file (later slices / a permanent bounded carve-out, ADR-0062 Part 5).",
36695
+ flagType: "boolean",
36696
+ // Declared safe value is `false`: the current on-disk `.env.integrations` delivery,
36697
+ // byte-for-byte. `false` is also the fail-safe direction — a flag-store read error must
36698
+ // never silently move a fleet onto the spawn-env path (a bug there = a channel with no
36699
+ // token = a silently dead channel). Net-new gate consumed by the manager's own spawn
36700
+ // logic, not an in-container MCP, so registry-only with NO envVar materialization
36701
+ // (mirrors scheduled-task-nudge-durable). Turning it ON removes plaintext at rest.
36702
+ defaultValue: false,
36703
+ // ENG-7997 flip-reach estimate: `since` is the first agt-cli build whose
36704
+ // dist carries this host-side reader. That build is the one THIS PR's merge
36705
+ // auto-publishes — unknown until then, and every already-published version
36706
+ // (0.28.x) demonstrably lacks the reader (CodeRabbit npm-pack check). An
36707
+ // UNREACHABLE placeholder is the fail-safe: the reach estimate counts zero
36708
+ // hosts as honoring the flip (rather than over-claiming that 0.28.x hosts do,
36709
+ // while they still write tokens to disk). MUST be updated to the actual
36710
+ // published version once the release lands (tracked on ENG-9350).
36711
+ since: "99.0.0"
36712
+ },
36692
36713
  {
36693
36714
  key: "scheduled-task-confirmation-card",
36694
36715
  description: `Post the \u{1F44D}/\u{1F44E} "Task complete?" kanban confirmation card for completed scheduled_task runs (ENG-4576 / ENG-6048). OFF (default) kills these cards fleet-wide: ENG-8072 found they mis-thread onto the run's captured slack_delivery, which in the persistent-session model is frequently a conversational reply rather than the task's own output - so a routine cron's confirmation card lands in an unrelated human thread (e.g. a half-hourly reconciliation card posted into a "you're back online" DM), and a clean cron emits a human \u{1F44D}/\u{1F44E} prompt on every tick regardless. The card was net-negative, so it is disabled by default. Turn it ON per org to restore scheduled-task ratings for a customer who wants them (e.g. a daily digest delivered to a channel). Evaluated per-org in the API (POST /host/runs/finish + the manager rating-prompt route) via getEvaluatedFlags(); the decision is passed into postScheduledTaskKanbanConfirmation. API-only gate - no host env materialization. Ships dark (cards off).`,
@@ -36832,6 +36853,27 @@ var FLAG_REGISTRY = [
36832
36853
  // never auto-attach an integration nobody asked for, and both ENG-8332
36833
36854
  // prerequisites above are still open.
36834
36855
  defaultValue: false
36856
+ },
36857
+ {
36858
+ key: "host-right-sizing",
36859
+ description: 'ADR-0072. Gates the HostRightSizer cron, which evaluates every managed EC2 host against 7 days of memory and CPU and (at enforce) resizes it one rung inside the host\'s own maintenance window. off = the cron returns immediately: nothing is read, nothing is written. shadow = evaluate, persist a verdict row per host, and post the weekly summary \u2014 NO resize, and no actor code runs. enforce = as shadow, plus enqueue resizes. AS OF PHASE 1 (ENG-9324) THERE IS NO ACTOR, SO `enforce` BEHAVES EXACTLY LIKE `shadow`: selecting it records the mode on each verdict row and changes nothing else, and no host is resized. This note comes out when the Phase 3 actor lands; until then treat enforce as shadow-with-a-label, not as an armed fleet. Ships dark: this mechanism ends in a stop/start of a customer production host, so an unreachable flag store must resolve to NOT acting. TWO BOUNDS WORTH KNOWING BEFORE FLIPPING. (1) off is not a stop button for in-flight work \u2014 HostResizeDispatcher reads only ec2_pending_instance_type and knows nothing about this flag, so flipping to off stops new enqueues and lets every already-enqueued host complete its stop/modify/start; combined with the ~5-minute eval cache the true blast unit is one tick of open windows. A real kill switch has to live inside the dispatcher. (2) BYO hosts (ADR-0028) are EXCLUDED in Phase 1, not merely clamped to shadow: their instances live in the customer AWS account while the cron authenticates only with the platform provisioner role, so their metrics read as empty and every evaluation would land as unknown. ADR-0072 \xA79 intends them to be shadow-only ("we recommend; they resize") and making that real needs the per-host cross_account_role_arn resolved - its own slice. Pool hosts (ADR-0042) are excluded too, while host_kind is unset in prod. Both are eligibility predicates applied by the cron, documented here so the admin page showing enforce for such an org is not read as behaviour.',
36860
+ flagType: "enum",
36861
+ allowedValues: ["off", "shadow", "enforce"],
36862
+ // Ships dark at `off`, NOT `shadow`. Diverging deliberately from
36863
+ // slack-scheduled-channel-guard, whose shadow is a free local log line:
36864
+ // THIS shadow spends a fleet-wide CloudWatch GetMetricData sweep per tick
36865
+ // and writes a row per host, so defaulting to shadow would newly bill and
36866
+ // newly write for every org that never opted in. shadow is the per-canary
36867
+ // opt-in; enforce is the audited flip after the Phase 2 review.
36868
+ defaultValue: "off",
36869
+ // Evaluated centrally, in the API cron — there is no host-side reader, so
36870
+ // no `since` and no dependence on fleet agt-cli convergence.
36871
+ // NOTE: deliberately NO envVar. ADR-0072 §9 wants this gate scoped per
36872
+ // org/host, and an envVar would be highest-precedence (ADR-0022) — a
36873
+ // literal in sst.config.ts would pin every stage and make the admin page a
36874
+ // control that does nothing, which is the ENG-8303 class exactly.
36875
+ // enforce arms automated downtime on a customer's production host.
36876
+ sensitive: true
36835
36877
  }
36836
36878
  ];
36837
36879
  var REGISTRY_BY_KEY = new Map(FLAG_REGISTRY.map((definition) => [definition.key, definition]));
@@ -36833,6 +36833,27 @@ var FLAG_REGISTRY = [
36833
36833
  // consumed by the manager's own logic, not an in-container MCP, so no env materialization.
36834
36834
  defaultValue: false
36835
36835
  },
36836
+ {
36837
+ key: "spawn-inject-channel-secrets",
36838
+ description: "ENG-9350 (host key-management hardening, epic ENG-9347): deliver a managed agent's channel bot tokens (SLACK_BOT_TOKEN, SLACK_APP_TOKEN, TELEGRAM_BOT_TOKEN, MSTEAMS_CLIENT_SECRET) into the Claude Code spawn env via `tmux new-session -e KEY=VALUE` (the same posture as ANTHROPIC_API_KEY / AGT_API_KEY) instead of writing them as plaintext to the on-disk `.env.integrations` file. ON = the manager injects the four channel secrets at spawn and evicts them from `.env.integrations`; the `.mcp.json` `${VAR}` templates are unchanged and now resolve from the spawn env, so the value never touches persistent EBS (and, under Docker isolation, is name-only forwarded into the container the same way AGT_API_KEY is). OFF (default) = today's behaviour, byte-for-byte: the tokens are written to `.env.integrations` (0600) and the wrapper sources them. Resolved host-side by the manager via hostFlagStore().getBooleanForAgent \u2014 the manager owns the spawn path, so no in-container MCP reads this; it materializes the VALUES, not the flag. A channel- token rotation already forces a session respawn (ENG-6062), so the injected value is bound at the same moment the file value used to be \u2014 the two paths are behaviourally equivalent, this one just keeps the plaintext off disk. Ships dark; flip per-agent/ host to soak before fleet convergence, flip OFF to fall back to the file path instantly without a code rollback. Integration credentials + the OAuth remote-MCP live-read proxy deliberately stay on the file (later slices / a permanent bounded carve-out, ADR-0062 Part 5).",
36839
+ flagType: "boolean",
36840
+ // Declared safe value is `false`: the current on-disk `.env.integrations` delivery,
36841
+ // byte-for-byte. `false` is also the fail-safe direction — a flag-store read error must
36842
+ // never silently move a fleet onto the spawn-env path (a bug there = a channel with no
36843
+ // token = a silently dead channel). Net-new gate consumed by the manager's own spawn
36844
+ // logic, not an in-container MCP, so registry-only with NO envVar materialization
36845
+ // (mirrors scheduled-task-nudge-durable). Turning it ON removes plaintext at rest.
36846
+ defaultValue: false,
36847
+ // ENG-7997 flip-reach estimate: `since` is the first agt-cli build whose
36848
+ // dist carries this host-side reader. That build is the one THIS PR's merge
36849
+ // auto-publishes — unknown until then, and every already-published version
36850
+ // (0.28.x) demonstrably lacks the reader (CodeRabbit npm-pack check). An
36851
+ // UNREACHABLE placeholder is the fail-safe: the reach estimate counts zero
36852
+ // hosts as honoring the flip (rather than over-claiming that 0.28.x hosts do,
36853
+ // while they still write tokens to disk). MUST be updated to the actual
36854
+ // published version once the release lands (tracked on ENG-9350).
36855
+ since: "99.0.0"
36856
+ },
36836
36857
  {
36837
36858
  key: "scheduled-task-confirmation-card",
36838
36859
  description: `Post the \u{1F44D}/\u{1F44E} "Task complete?" kanban confirmation card for completed scheduled_task runs (ENG-4576 / ENG-6048). OFF (default) kills these cards fleet-wide: ENG-8072 found they mis-thread onto the run's captured slack_delivery, which in the persistent-session model is frequently a conversational reply rather than the task's own output - so a routine cron's confirmation card lands in an unrelated human thread (e.g. a half-hourly reconciliation card posted into a "you're back online" DM), and a clean cron emits a human \u{1F44D}/\u{1F44E} prompt on every tick regardless. The card was net-negative, so it is disabled by default. Turn it ON per org to restore scheduled-task ratings for a customer who wants them (e.g. a daily digest delivered to a channel). Evaluated per-org in the API (POST /host/runs/finish + the manager rating-prompt route) via getEvaluatedFlags(); the decision is passed into postScheduledTaskKanbanConfirmation. API-only gate - no host env materialization. Ships dark (cards off).`,
@@ -36976,6 +36997,27 @@ var FLAG_REGISTRY = [
36976
36997
  // never auto-attach an integration nobody asked for, and both ENG-8332
36977
36998
  // prerequisites above are still open.
36978
36999
  defaultValue: false
37000
+ },
37001
+ {
37002
+ key: "host-right-sizing",
37003
+ description: 'ADR-0072. Gates the HostRightSizer cron, which evaluates every managed EC2 host against 7 days of memory and CPU and (at enforce) resizes it one rung inside the host\'s own maintenance window. off = the cron returns immediately: nothing is read, nothing is written. shadow = evaluate, persist a verdict row per host, and post the weekly summary \u2014 NO resize, and no actor code runs. enforce = as shadow, plus enqueue resizes. AS OF PHASE 1 (ENG-9324) THERE IS NO ACTOR, SO `enforce` BEHAVES EXACTLY LIKE `shadow`: selecting it records the mode on each verdict row and changes nothing else, and no host is resized. This note comes out when the Phase 3 actor lands; until then treat enforce as shadow-with-a-label, not as an armed fleet. Ships dark: this mechanism ends in a stop/start of a customer production host, so an unreachable flag store must resolve to NOT acting. TWO BOUNDS WORTH KNOWING BEFORE FLIPPING. (1) off is not a stop button for in-flight work \u2014 HostResizeDispatcher reads only ec2_pending_instance_type and knows nothing about this flag, so flipping to off stops new enqueues and lets every already-enqueued host complete its stop/modify/start; combined with the ~5-minute eval cache the true blast unit is one tick of open windows. A real kill switch has to live inside the dispatcher. (2) BYO hosts (ADR-0028) are EXCLUDED in Phase 1, not merely clamped to shadow: their instances live in the customer AWS account while the cron authenticates only with the platform provisioner role, so their metrics read as empty and every evaluation would land as unknown. ADR-0072 \xA79 intends them to be shadow-only ("we recommend; they resize") and making that real needs the per-host cross_account_role_arn resolved - its own slice. Pool hosts (ADR-0042) are excluded too, while host_kind is unset in prod. Both are eligibility predicates applied by the cron, documented here so the admin page showing enforce for such an org is not read as behaviour.',
37004
+ flagType: "enum",
37005
+ allowedValues: ["off", "shadow", "enforce"],
37006
+ // Ships dark at `off`, NOT `shadow`. Diverging deliberately from
37007
+ // slack-scheduled-channel-guard, whose shadow is a free local log line:
37008
+ // THIS shadow spends a fleet-wide CloudWatch GetMetricData sweep per tick
37009
+ // and writes a row per host, so defaulting to shadow would newly bill and
37010
+ // newly write for every org that never opted in. shadow is the per-canary
37011
+ // opt-in; enforce is the audited flip after the Phase 2 review.
37012
+ defaultValue: "off",
37013
+ // Evaluated centrally, in the API cron — there is no host-side reader, so
37014
+ // no `since` and no dependence on fleet agt-cli convergence.
37015
+ // NOTE: deliberately NO envVar. ADR-0072 §9 wants this gate scoped per
37016
+ // org/host, and an envVar would be highest-precedence (ADR-0022) — a
37017
+ // literal in sst.config.ts would pin every stage and make the admin page a
37018
+ // control that does nothing, which is the ENG-8303 class exactly.
37019
+ // enforce arms automated downtime on a customer's production host.
37020
+ sensitive: true
36979
37021
  }
36980
37022
  ];
36981
37023
  var REGISTRY_BY_KEY = new Map(FLAG_REGISTRY.map((definition) => [definition.key, definition]));
@@ -43,8 +43,8 @@ import {
43
43
  writeDirectChatSessionState,
44
44
  writeEgressAllowlist,
45
45
  writePersistentClaudeWrapper
46
- } from "./chunk-5GDKWIB3.js";
47
- import "./chunk-HGVJVYKW.js";
46
+ } from "./chunk-YAVWYI5S.js";
47
+ import "./chunk-YOID6KOQ.js";
48
48
  import "./chunk-XWVM4KPK.js";
49
49
  export {
50
50
  EGRESS_BASELINE_DOMAINS,
@@ -92,4 +92,4 @@ export {
92
92
  writeEgressAllowlist,
93
93
  writePersistentClaudeWrapper
94
94
  };
95
- //# sourceMappingURL=persistent-session-RZH67PNC.js.map
95
+ //# sourceMappingURL=persistent-session-PYAJ4VJW.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  paneLogPath
3
- } from "./chunk-5GDKWIB3.js";
4
- import "./chunk-HGVJVYKW.js";
3
+ } from "./chunk-YAVWYI5S.js";
4
+ import "./chunk-YOID6KOQ.js";
5
5
  import "./chunk-XWVM4KPK.js";
6
6
 
7
7
  // src/lib/responsiveness-probe.ts
@@ -727,4 +727,4 @@ export {
727
727
  readAndResetSlackReplyBindingClassifications,
728
728
  readAndResetSlackReplyTargetClassifications
729
729
  };
730
- //# sourceMappingURL=responsiveness-probe-NPNMNOFF.js.map
730
+ //# sourceMappingURL=responsiveness-probe-5I2LIVCA.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  sessionTranscriptDir
3
- } from "./chunk-HGVJVYKW.js";
3
+ } from "./chunk-YOID6KOQ.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-CFAYSZ43.js.map
206
+ //# sourceMappingURL=session-auth-dead-NUX643UJ.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@integrity-labs/agt-cli",
3
- "version": "0.28.670",
3
+ "version": "0.28.672",
4
4
  "description": "Augmented Team CLI — agent provisioning and management",
5
5
  "type": "module",
6
6
  "engines": {