@integrity-labs/agt-cli 0.28.676 → 0.28.678
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 +5 -5
- package/dist/{chunk-S6TPCOGW.js → chunk-3PCP5NT2.js} +551 -397
- package/dist/chunk-3PCP5NT2.js.map +1 -0
- package/dist/{chunk-AJNES24H.js → chunk-5DHJE2G7.js} +49 -1
- package/dist/chunk-5DHJE2G7.js.map +1 -0
- package/dist/{chunk-7Y54PSMR.js → chunk-LTOGVWUR.js} +2 -2
- package/dist/{claude-pair-runtime-VAU7UXE4.js → claude-pair-runtime-X6CWJNW2.js} +2 -2
- package/dist/lib/manager-worker.js +15 -13
- package/dist/lib/manager-worker.js.map +1 -1
- package/dist/mcp/augmented-admin.js +34 -1
- package/dist/mcp/direct-chat-channel.js +48 -0
- package/dist/mcp/index.js +48 -0
- package/dist/mcp/origami.js +48 -0
- package/dist/mcp/slack-channel.js +48 -0
- package/dist/mcp/telegram-channel.js +48 -0
- package/dist/{persistent-session-F7JEOWHQ.js → persistent-session-EZEYH3PM.js} +3 -3
- package/dist/{responsiveness-probe-7465YNMN.js → responsiveness-probe-VS6GODYP.js} +3 -3
- package/dist/{session-auth-dead-GBC5QPH3.js → session-auth-dead-7U24PZZS.js} +2 -2
- package/package.json +1 -1
- package/dist/chunk-AJNES24H.js.map +0 -1
- package/dist/chunk-S6TPCOGW.js.map +0 -1
- /package/dist/{chunk-7Y54PSMR.js.map → chunk-LTOGVWUR.js.map} +0 -0
- /package/dist/{claude-pair-runtime-VAU7UXE4.js.map → claude-pair-runtime-X6CWJNW2.js.map} +0 -0
- /package/dist/{persistent-session-F7JEOWHQ.js.map → persistent-session-EZEYH3PM.js.map} +0 -0
- /package/dist/{responsiveness-probe-7465YNMN.js.map → responsiveness-probe-VS6GODYP.js.map} +0 -0
- /package/dist/{session-auth-dead-GBC5QPH3.js.map → session-auth-dead-7U24PZZS.js.map} +0 -0
|
@@ -21326,6 +21326,18 @@ var AdminDebugClient = class _AdminDebugClient {
|
|
|
21326
21326
|
run_id: this.runId
|
|
21327
21327
|
});
|
|
21328
21328
|
}
|
|
21329
|
+
/** Request a HITL-gated end to a circuit-breaker pause (ENG-9343). */
|
|
21330
|
+
requestResumeAgent(args) {
|
|
21331
|
+
if (!this.agentId) {
|
|
21332
|
+
throw makeError(400, "AdminDebugClient.requestResumeAgent requires agentId (set AGT_AGENT_ID)");
|
|
21333
|
+
}
|
|
21334
|
+
return this.post("/admin/debug/actions/resume", {
|
|
21335
|
+
target_agent_id: args.target_agent_id,
|
|
21336
|
+
reason: args.reason,
|
|
21337
|
+
agent_id: this.agentId,
|
|
21338
|
+
run_id: this.runId
|
|
21339
|
+
});
|
|
21340
|
+
}
|
|
21329
21341
|
/** Poll a remedial action's HITL decision. */
|
|
21330
21342
|
getActionStatus(requestId) {
|
|
21331
21343
|
return this.get(`/admin/debug/actions/${encodeURIComponent(requestId)}`);
|
|
@@ -21457,6 +21469,12 @@ var clearRestartRequestSchema = strictObject({
|
|
|
21457
21469
|
target_agent_id: external_exports.string().min(1).max(64).describe("UUID of the customer agent whose stuck restart request to clear (from the inspect result)."),
|
|
21458
21470
|
reason: external_exports.string().min(1).max(2e3).describe("Why this stuck restart request should be cleared \u2014 shown verbatim to the human approver. Be specific.")
|
|
21459
21471
|
});
|
|
21472
|
+
var resumeAgentSchema = strictObject({
|
|
21473
|
+
target_agent_id: external_exports.string().min(1).max(64).describe("UUID of the customer agent whose CIRCUIT-BREAKER pause to end (from debug_search_agents status=paused)."),
|
|
21474
|
+
reason: external_exports.string().min(1).max(2e3).describe(
|
|
21475
|
+
'Why this agent should come back now, and what you know about the condition that tripped the breaker - shown verbatim to the human approver alongside the trip reason and count. Be specific: the approver is deciding "resume DESPITE this driver", not "resume".'
|
|
21476
|
+
)
|
|
21477
|
+
});
|
|
21460
21478
|
var listAlertsSchema = strictObject({
|
|
21461
21479
|
severity: external_exports.string().max(16).optional().describe("Filter by severity (critical | warning | info)."),
|
|
21462
21480
|
open: external_exports.boolean().optional().describe("When true, only currently-open (unclosed) alerts."),
|
|
@@ -21869,7 +21887,7 @@ server.registerTool(
|
|
|
21869
21887
|
);
|
|
21870
21888
|
server.registerTool(
|
|
21871
21889
|
"debug_restart_agent",
|
|
21872
|
-
{ description: `Request a HITL-gated RESTART of a customer agent \u2014 bounce its session so the manager respawns it on the next poll (reversible; the inbound backlog replays). Use this to recover a wedged agent or to make it pick up a newly-bound integration/config change. A HUMAN must approve in Slack before anything happens, and only if writes are armed for this stage; in shadow mode the approval runs but nothing executes. Org-agnostic: keyed on the agent's host assignment, so it works cross-org without an active-org dependency. This is the same path as request_action({ action: "restart" }), exposed as a dedicated tool for discoverability. Returns { request_id, status, write_mode, notification_status }. Surface a brief, jargon-free note to the user (e.g. "I've asked an admin to approve restarting that agent"). Pass { target_agent_id, reason }.`, inputSchema: restartAgentSchema },
|
|
21890
|
+
{ description: `Request a HITL-gated RESTART of a customer agent \u2014 bounce its session so the manager respawns it on the next poll (reversible; the inbound backlog replays). Use this to recover a wedged agent or to make it pick up a newly-bound integration/config change. NOT for a PAUSED agent: a paused agent's manager does not respawn it, so a restart against one does nothing at all - use \`debug_resume_agent\`, which is the only tool that ends a pause (ENG-9343). A HUMAN must approve in Slack before anything happens, and only if writes are armed for this stage; in shadow mode the approval runs but nothing executes. Org-agnostic: keyed on the agent's host assignment, so it works cross-org without an active-org dependency. This is the same path as request_action({ action: "restart" }), exposed as a dedicated tool for discoverability. Returns { request_id, status, write_mode, notification_status }. Surface a brief, jargon-free note to the user (e.g. "I've asked an admin to approve restarting that agent"). Pass { target_agent_id, reason }.`, inputSchema: restartAgentSchema },
|
|
21873
21891
|
async (args) => {
|
|
21874
21892
|
try {
|
|
21875
21893
|
const result = await client.requestAction("restart", {
|
|
@@ -21882,6 +21900,21 @@ server.registerTool(
|
|
|
21882
21900
|
}
|
|
21883
21901
|
}
|
|
21884
21902
|
);
|
|
21903
|
+
server.registerTool(
|
|
21904
|
+
"debug_resume_agent",
|
|
21905
|
+
{ description: 'Request a HITL-gated END to a customer agent\'s CIRCUIT-BREAKER pause - flip it back to active so its manager respawns it, close the agent_paused alert, and clear any pending restart request. This is the ONLY tool that ends a pause; debug_restart_agent does NOT, because a paused agent\'s manager never respawns it, so a restart against a paused agent is a no-op. SCOPE: it touches ONLY pauses whose reason is `circuit_breaker`. A "manual" pause (a person clicked Pause) and an "hourly_cost_exceeded" pause (a budget guard) are refused with a 409 - do not retry those, escalate to a human. BEFORE YOU CALL IT: the approval card names the breaker\'s trip reason and count and flags when that condition still appears to hold (e.g. other agents on the same host tripping on the same driver), so write a `reason` that addresses the driver, not just the downtime - the approver is deciding "resume DESPITE day-rollover=3", not "resume". Resuming while the driver is still live just re-trips the breaker and the agent flaps instead of failing cleanly. A HUMAN must approve in Slack, and only if writes are armed for this stage (shadow mode runs the approval but executes nothing). Returns { request_id, status, write_mode, trip_driver, trip_count, precondition_verdict, precondition_signals, notification_status }; after approval, poll check_action_status (result_payload carries { resumed, alert_closed, cleared_restart_bindings } or { resumed: false, not_eligible }). Pass { target_agent_id, reason }.', inputSchema: resumeAgentSchema },
|
|
21906
|
+
async (args) => {
|
|
21907
|
+
try {
|
|
21908
|
+
const result = await client.requestResumeAgent({
|
|
21909
|
+
target_agent_id: args.target_agent_id,
|
|
21910
|
+
reason: args.reason
|
|
21911
|
+
});
|
|
21912
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
21913
|
+
} catch (err) {
|
|
21914
|
+
return { content: [{ type: "text", text: formatError2(err) }], isError: true };
|
|
21915
|
+
}
|
|
21916
|
+
}
|
|
21917
|
+
);
|
|
21885
21918
|
server.registerTool(
|
|
21886
21919
|
"request_config_update",
|
|
21887
21920
|
{ description: "Request a HITL-gated change to a customer agent's model config (primary/secondary/tertiary_model). A HUMAN must approve in Slack before anything happens, and only if writes are armed for this stage (shadow mode runs the approval but executes nothing). The change is reversible and applies at the agent's NEXT session launch after /host/refresh \u2014 it does not restart the agent. The new value is validated against the agent before approval is requested: Claude Code (subscription) agents take a family alias (fable/opus/opus[fast]/sonnet/haiku); routed agents take a full stored model id (e.g. openrouter/anthropic/claude-opus-4-6). Use this to fix a misconfigured model (e.g. an agent wedged on a model its auth can't access). Returns { request_id, status, write_mode, notification_status }. Pass { target_agent_id, field, new_value, reason }.", inputSchema: requestConfigUpdateSchema },
|
|
@@ -34277,6 +34277,9 @@ var DIRECTIVE_KINDS = [
|
|
|
34277
34277
|
];
|
|
34278
34278
|
var DIRECTIVE_SET = new Set(DIRECTIVE_KINDS);
|
|
34279
34279
|
|
|
34280
|
+
// ../core/dist/admin-debug/resume-precondition.js
|
|
34281
|
+
var DEFAULT_RESUME_LOOKBACK_MS = 14 * 24 * 60 * 60 * 1e3;
|
|
34282
|
+
|
|
34280
34283
|
// ../core/dist/admin-debug/index.js
|
|
34281
34284
|
var STUCK_RESTART_THRESHOLD_SECONDS = 15 * 60;
|
|
34282
34285
|
|
|
@@ -35892,6 +35895,29 @@ var FLAG_REGISTRY = [
|
|
|
35892
35895
|
// first the real cut is higher than this and the pin under-reports.
|
|
35893
35896
|
since: "0.28.570"
|
|
35894
35897
|
},
|
|
35898
|
+
{
|
|
35899
|
+
key: "secret-files-tmpfs",
|
|
35900
|
+
description: "Host-side RAM-backing of the per-agent .env.integrations secret files (ENG-9348, epic ENG-9347). When on, the manager turns both copies (the agent-dir file and the project/ mirror) into symlinks pointing at a 0700 per-agent directory under tmpfs (/dev/shm, else /run), so plaintext channel/integration tokens live only in RAM: the persistent EBS volume holds a symlink (no token bytes), an EBS snapshot captures nothing, and a host shutdown is a genuine wipe. Every consumer path is unchanged (same file paths). Boolean gate; ships dark. Fail-safe in every direction \u2014 off is byte-for-byte today; a host with no genuine tmpfs root (e.g. macOS dev) silently keeps the persistent files; a symlink-setup error logs and falls back to the persistent path. Reboot clears tmpfs, and the manager re-backs on its next refresh (surviving reboot is not required \u2014 secrets are re-fetched on refresh).",
|
|
35901
|
+
flagType: "boolean",
|
|
35902
|
+
// Declared safe value is `false` (persistent files, today's behaviour).
|
|
35903
|
+
// Fail-safe direction: a flag-DB read error must never, on its own, start
|
|
35904
|
+
// relocating where prod secret files physically live. Flip on per-host for a
|
|
35905
|
+
// canary, verify no plaintext lands on the persistent volume, then fleet-wide
|
|
35906
|
+
// from the admin Feature Flags page.
|
|
35907
|
+
defaultValue: false,
|
|
35908
|
+
// ADR-0022 operator override, read by the host flag store's env layer (not a
|
|
35909
|
+
// hand-written process.env gate) — same posture as memory-extraction /
|
|
35910
|
+
// tool-call-audit above. Gives a per-host canary before the DB flag exists.
|
|
35911
|
+
envVar: "AGT_SECRET_FILES_TMPFS_ENABLED",
|
|
35912
|
+
// Deliberately-unreachable placeholder until this ships: no published CLI
|
|
35913
|
+
// carries the manager reader + core writer yet, so reach must report "no
|
|
35914
|
+
// host honors" rather than the `honors`-for-everyone that omitting `since`
|
|
35915
|
+
// produces. MOVE THIS PIN to the actual auto-published agt-cli version at
|
|
35916
|
+
// merge (auto-publish patch-bumps from main; verify against the tarball, the
|
|
35917
|
+
// ENG-8575/ENG-9350 lesson) — the marker is `setSecretFileTmpfsBacking` in
|
|
35918
|
+
// package/dist/lib/manager-worker.js.
|
|
35919
|
+
since: "99.0.0"
|
|
35920
|
+
},
|
|
35895
35921
|
{
|
|
35896
35922
|
key: "memory-file-tombstones",
|
|
35897
35923
|
description: "Host-side removal of RETIRED agent memory files (ENG-9257). The control plane sends an explicit tombstone list on /host/memories and the manager moves the matching .md out of the agent's memory directory \u2014 but only when its write-time manifest says the manager itself wrote that exact file and the sha256 still matches, so an agent-edited or hand-authored file is retained and reported instead. Boolean gate; ships dark. Scope is retirement only, never expiry: /host/memories has always withheld expired rows, so an expiry-driven list would make months of accumulated backlog deletable on the first armed tick. This is the ONLY thing that makes retirement visible to the agent, which reads its memory directory straight off disk \u2014 every server-side reader already excludes retired rows, so with this off a retired memory is gone everywhere except the one surface that changes the agent's behaviour.",
|
|
@@ -36563,6 +36589,28 @@ var FLAG_REGISTRY = [
|
|
|
36563
36589
|
// exactly the org whose brand should be shown.
|
|
36564
36590
|
public: true
|
|
36565
36591
|
},
|
|
36592
|
+
{
|
|
36593
|
+
key: "ninjafy-logo",
|
|
36594
|
+
description: "Which Ninjafy logo TREATMENT the console chrome renders (ENG-9365). This is a SUB-SELECTION under ninjafy-brand, not a second brand gate: it is consulted only once ninjafy-brand has already resolved ON, so with the brand off the value is inert and the half-branded state that flag's description calls unreachable stays unreachable. ninjafy-brand remains the single kill switch for the rebrand. It exists so candidate logo treatments can be put in front of a human and compared in the running console, rather than judged from a static export. lockup = mark and wordmark together, both in the brand blue \u2014 exactly what ENG-9298 shipped, so an unset flag is a no-op. two-tone = the mark in brand blue with the wordmark in the neutral text colour (the treatment of the blue-icon/black-wordmark artwork). wordmark = the word alone, no mark. Every treatment is composed from the ENG-9298 geometry \u2014 ENG-9312 pins that the lockup's blue path IS the mark subpath followed by the wordmark subpaths, byte for byte \u2014 so a new treatment is a composition, never a fresh trace, and the three drawings cannot drift apart. Surfaces are the dashboard sidebar and the top nav. The top nav shows the WORDMARK portion at every width whatever the treatment, because ENG-9342 decided that deliberately (a full lockup at the header's icon height crowds the team switcher on a phone) \u2014 so a treatment changes the word's colour there, never whether a mark appears. The admin sidebar (ENG-9323) is NOT wired to this key and always renders the mark; widening it is a separate decision. Resolved SERVER-SIDE in (dashboard)/layout.tsx via getPublicEnumFlagServer, beside ninjafy-brand and in the same single GET /flags round trip, then passed down as a required prop. That is not a style preference: the client hook starts at its default and updates after an async fetch, so a client read would paint one logo and swap it after hydration \u2014 the exact flash ENG-9227 removed from the wordmark and ENG-8858 removed from the palette. Org and team are the useful pilot grains, as for ninjafy-brand: the single consumer evaluates in the active-org cookie scope, so a host- or agent-scoped override row is accepted by the table but never reached by the console.",
|
|
36595
|
+
flagType: "enum",
|
|
36596
|
+
allowedValues: ["lockup", "two-tone", "wordmark"],
|
|
36597
|
+
// Declared safe value is `lockup` — what ENG-9298 shipped. This flag has no
|
|
36598
|
+
// "off" direction: it selects among presentations that are all live-safe, so
|
|
36599
|
+
// fail-safe here means "the treatment currently in production", not the
|
|
36600
|
+
// narrowest one. A flag-DB read error, an archived row, or a stored value
|
|
36601
|
+
// outside allowedValues all resolve here (evaluate.ts normalizeFlagValue),
|
|
36602
|
+
// which is what makes an experimental value impossible to strand.
|
|
36603
|
+
defaultValue: "lockup",
|
|
36604
|
+
// Same trap as ninjafy-brand, and it bites harder here because there are no
|
|
36605
|
+
// client readers of this key AT ALL — it is server-resolved by construction.
|
|
36606
|
+
// `public` does NOT mean "read by a browser"; it means "readable through the
|
|
36607
|
+
// public map". getPublicEnumFlagServer resolves against the same GET /flags
|
|
36608
|
+
// endpoint the browser uses, and that route filters to listPublicFlagKeys()
|
|
36609
|
+
// (routes/flags.ts). Drop `public` and the key is simply absent from the map,
|
|
36610
|
+
// so the helper falls through to its default and returns `lockup` FOREVER —
|
|
36611
|
+
// the dropdown appearing to do nothing, with no error raised anywhere.
|
|
36612
|
+
public: true
|
|
36613
|
+
},
|
|
36566
36614
|
{
|
|
36567
36615
|
key: "agent-recruit",
|
|
36568
36616
|
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.",
|
package/dist/mcp/index.js
CHANGED
|
@@ -41597,6 +41597,9 @@ var DIRECTIVE_KINDS = [
|
|
|
41597
41597
|
];
|
|
41598
41598
|
var DIRECTIVE_SET = new Set(DIRECTIVE_KINDS);
|
|
41599
41599
|
|
|
41600
|
+
// ../core/dist/admin-debug/resume-precondition.js
|
|
41601
|
+
var DEFAULT_RESUME_LOOKBACK_MS = 14 * 24 * 60 * 60 * 1e3;
|
|
41602
|
+
|
|
41600
41603
|
// ../core/dist/admin-debug/index.js
|
|
41601
41604
|
var STUCK_RESTART_THRESHOLD_SECONDS = 15 * 60;
|
|
41602
41605
|
|
|
@@ -42819,6 +42822,29 @@ var FLAG_REGISTRY = [
|
|
|
42819
42822
|
// first the real cut is higher than this and the pin under-reports.
|
|
42820
42823
|
since: "0.28.570"
|
|
42821
42824
|
},
|
|
42825
|
+
{
|
|
42826
|
+
key: "secret-files-tmpfs",
|
|
42827
|
+
description: "Host-side RAM-backing of the per-agent .env.integrations secret files (ENG-9348, epic ENG-9347). When on, the manager turns both copies (the agent-dir file and the project/ mirror) into symlinks pointing at a 0700 per-agent directory under tmpfs (/dev/shm, else /run), so plaintext channel/integration tokens live only in RAM: the persistent EBS volume holds a symlink (no token bytes), an EBS snapshot captures nothing, and a host shutdown is a genuine wipe. Every consumer path is unchanged (same file paths). Boolean gate; ships dark. Fail-safe in every direction \u2014 off is byte-for-byte today; a host with no genuine tmpfs root (e.g. macOS dev) silently keeps the persistent files; a symlink-setup error logs and falls back to the persistent path. Reboot clears tmpfs, and the manager re-backs on its next refresh (surviving reboot is not required \u2014 secrets are re-fetched on refresh).",
|
|
42828
|
+
flagType: "boolean",
|
|
42829
|
+
// Declared safe value is `false` (persistent files, today's behaviour).
|
|
42830
|
+
// Fail-safe direction: a flag-DB read error must never, on its own, start
|
|
42831
|
+
// relocating where prod secret files physically live. Flip on per-host for a
|
|
42832
|
+
// canary, verify no plaintext lands on the persistent volume, then fleet-wide
|
|
42833
|
+
// from the admin Feature Flags page.
|
|
42834
|
+
defaultValue: false,
|
|
42835
|
+
// ADR-0022 operator override, read by the host flag store's env layer (not a
|
|
42836
|
+
// hand-written process.env gate) — same posture as memory-extraction /
|
|
42837
|
+
// tool-call-audit above. Gives a per-host canary before the DB flag exists.
|
|
42838
|
+
envVar: "AGT_SECRET_FILES_TMPFS_ENABLED",
|
|
42839
|
+
// Deliberately-unreachable placeholder until this ships: no published CLI
|
|
42840
|
+
// carries the manager reader + core writer yet, so reach must report "no
|
|
42841
|
+
// host honors" rather than the `honors`-for-everyone that omitting `since`
|
|
42842
|
+
// produces. MOVE THIS PIN to the actual auto-published agt-cli version at
|
|
42843
|
+
// merge (auto-publish patch-bumps from main; verify against the tarball, the
|
|
42844
|
+
// ENG-8575/ENG-9350 lesson) — the marker is `setSecretFileTmpfsBacking` in
|
|
42845
|
+
// package/dist/lib/manager-worker.js.
|
|
42846
|
+
since: "99.0.0"
|
|
42847
|
+
},
|
|
42822
42848
|
{
|
|
42823
42849
|
key: "memory-file-tombstones",
|
|
42824
42850
|
description: "Host-side removal of RETIRED agent memory files (ENG-9257). The control plane sends an explicit tombstone list on /host/memories and the manager moves the matching .md out of the agent's memory directory \u2014 but only when its write-time manifest says the manager itself wrote that exact file and the sha256 still matches, so an agent-edited or hand-authored file is retained and reported instead. Boolean gate; ships dark. Scope is retirement only, never expiry: /host/memories has always withheld expired rows, so an expiry-driven list would make months of accumulated backlog deletable on the first armed tick. This is the ONLY thing that makes retirement visible to the agent, which reads its memory directory straight off disk \u2014 every server-side reader already excludes retired rows, so with this off a retired memory is gone everywhere except the one surface that changes the agent's behaviour.",
|
|
@@ -43490,6 +43516,28 @@ var FLAG_REGISTRY = [
|
|
|
43490
43516
|
// exactly the org whose brand should be shown.
|
|
43491
43517
|
public: true
|
|
43492
43518
|
},
|
|
43519
|
+
{
|
|
43520
|
+
key: "ninjafy-logo",
|
|
43521
|
+
description: "Which Ninjafy logo TREATMENT the console chrome renders (ENG-9365). This is a SUB-SELECTION under ninjafy-brand, not a second brand gate: it is consulted only once ninjafy-brand has already resolved ON, so with the brand off the value is inert and the half-branded state that flag's description calls unreachable stays unreachable. ninjafy-brand remains the single kill switch for the rebrand. It exists so candidate logo treatments can be put in front of a human and compared in the running console, rather than judged from a static export. lockup = mark and wordmark together, both in the brand blue \u2014 exactly what ENG-9298 shipped, so an unset flag is a no-op. two-tone = the mark in brand blue with the wordmark in the neutral text colour (the treatment of the blue-icon/black-wordmark artwork). wordmark = the word alone, no mark. Every treatment is composed from the ENG-9298 geometry \u2014 ENG-9312 pins that the lockup's blue path IS the mark subpath followed by the wordmark subpaths, byte for byte \u2014 so a new treatment is a composition, never a fresh trace, and the three drawings cannot drift apart. Surfaces are the dashboard sidebar and the top nav. The top nav shows the WORDMARK portion at every width whatever the treatment, because ENG-9342 decided that deliberately (a full lockup at the header's icon height crowds the team switcher on a phone) \u2014 so a treatment changes the word's colour there, never whether a mark appears. The admin sidebar (ENG-9323) is NOT wired to this key and always renders the mark; widening it is a separate decision. Resolved SERVER-SIDE in (dashboard)/layout.tsx via getPublicEnumFlagServer, beside ninjafy-brand and in the same single GET /flags round trip, then passed down as a required prop. That is not a style preference: the client hook starts at its default and updates after an async fetch, so a client read would paint one logo and swap it after hydration \u2014 the exact flash ENG-9227 removed from the wordmark and ENG-8858 removed from the palette. Org and team are the useful pilot grains, as for ninjafy-brand: the single consumer evaluates in the active-org cookie scope, so a host- or agent-scoped override row is accepted by the table but never reached by the console.",
|
|
43522
|
+
flagType: "enum",
|
|
43523
|
+
allowedValues: ["lockup", "two-tone", "wordmark"],
|
|
43524
|
+
// Declared safe value is `lockup` — what ENG-9298 shipped. This flag has no
|
|
43525
|
+
// "off" direction: it selects among presentations that are all live-safe, so
|
|
43526
|
+
// fail-safe here means "the treatment currently in production", not the
|
|
43527
|
+
// narrowest one. A flag-DB read error, an archived row, or a stored value
|
|
43528
|
+
// outside allowedValues all resolve here (evaluate.ts normalizeFlagValue),
|
|
43529
|
+
// which is what makes an experimental value impossible to strand.
|
|
43530
|
+
defaultValue: "lockup",
|
|
43531
|
+
// Same trap as ninjafy-brand, and it bites harder here because there are no
|
|
43532
|
+
// client readers of this key AT ALL — it is server-resolved by construction.
|
|
43533
|
+
// `public` does NOT mean "read by a browser"; it means "readable through the
|
|
43534
|
+
// public map". getPublicEnumFlagServer resolves against the same GET /flags
|
|
43535
|
+
// endpoint the browser uses, and that route filters to listPublicFlagKeys()
|
|
43536
|
+
// (routes/flags.ts). Drop `public` and the key is simply absent from the map,
|
|
43537
|
+
// so the helper falls through to its default and returns `lockup` FOREVER —
|
|
43538
|
+
// the dropdown appearing to do nothing, with no error raised anywhere.
|
|
43539
|
+
public: true
|
|
43540
|
+
},
|
|
43493
43541
|
{
|
|
43494
43542
|
key: "agent-recruit",
|
|
43495
43543
|
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.",
|
package/dist/mcp/origami.js
CHANGED
|
@@ -40429,6 +40429,9 @@ var DIRECTIVE_KINDS = [
|
|
|
40429
40429
|
];
|
|
40430
40430
|
var DIRECTIVE_SET = new Set(DIRECTIVE_KINDS);
|
|
40431
40431
|
|
|
40432
|
+
// ../core/dist/admin-debug/resume-precondition.js
|
|
40433
|
+
var DEFAULT_RESUME_LOOKBACK_MS = 14 * 24 * 60 * 60 * 1e3;
|
|
40434
|
+
|
|
40432
40435
|
// ../core/dist/admin-debug/index.js
|
|
40433
40436
|
var STUCK_RESTART_THRESHOLD_SECONDS = 15 * 60;
|
|
40434
40437
|
|
|
@@ -41630,6 +41633,29 @@ var FLAG_REGISTRY = [
|
|
|
41630
41633
|
// first the real cut is higher than this and the pin under-reports.
|
|
41631
41634
|
since: "0.28.570"
|
|
41632
41635
|
},
|
|
41636
|
+
{
|
|
41637
|
+
key: "secret-files-tmpfs",
|
|
41638
|
+
description: "Host-side RAM-backing of the per-agent .env.integrations secret files (ENG-9348, epic ENG-9347). When on, the manager turns both copies (the agent-dir file and the project/ mirror) into symlinks pointing at a 0700 per-agent directory under tmpfs (/dev/shm, else /run), so plaintext channel/integration tokens live only in RAM: the persistent EBS volume holds a symlink (no token bytes), an EBS snapshot captures nothing, and a host shutdown is a genuine wipe. Every consumer path is unchanged (same file paths). Boolean gate; ships dark. Fail-safe in every direction \u2014 off is byte-for-byte today; a host with no genuine tmpfs root (e.g. macOS dev) silently keeps the persistent files; a symlink-setup error logs and falls back to the persistent path. Reboot clears tmpfs, and the manager re-backs on its next refresh (surviving reboot is not required \u2014 secrets are re-fetched on refresh).",
|
|
41639
|
+
flagType: "boolean",
|
|
41640
|
+
// Declared safe value is `false` (persistent files, today's behaviour).
|
|
41641
|
+
// Fail-safe direction: a flag-DB read error must never, on its own, start
|
|
41642
|
+
// relocating where prod secret files physically live. Flip on per-host for a
|
|
41643
|
+
// canary, verify no plaintext lands on the persistent volume, then fleet-wide
|
|
41644
|
+
// from the admin Feature Flags page.
|
|
41645
|
+
defaultValue: false,
|
|
41646
|
+
// ADR-0022 operator override, read by the host flag store's env layer (not a
|
|
41647
|
+
// hand-written process.env gate) — same posture as memory-extraction /
|
|
41648
|
+
// tool-call-audit above. Gives a per-host canary before the DB flag exists.
|
|
41649
|
+
envVar: "AGT_SECRET_FILES_TMPFS_ENABLED",
|
|
41650
|
+
// Deliberately-unreachable placeholder until this ships: no published CLI
|
|
41651
|
+
// carries the manager reader + core writer yet, so reach must report "no
|
|
41652
|
+
// host honors" rather than the `honors`-for-everyone that omitting `since`
|
|
41653
|
+
// produces. MOVE THIS PIN to the actual auto-published agt-cli version at
|
|
41654
|
+
// merge (auto-publish patch-bumps from main; verify against the tarball, the
|
|
41655
|
+
// ENG-8575/ENG-9350 lesson) — the marker is `setSecretFileTmpfsBacking` in
|
|
41656
|
+
// package/dist/lib/manager-worker.js.
|
|
41657
|
+
since: "99.0.0"
|
|
41658
|
+
},
|
|
41633
41659
|
{
|
|
41634
41660
|
key: "memory-file-tombstones",
|
|
41635
41661
|
description: "Host-side removal of RETIRED agent memory files (ENG-9257). The control plane sends an explicit tombstone list on /host/memories and the manager moves the matching .md out of the agent's memory directory \u2014 but only when its write-time manifest says the manager itself wrote that exact file and the sha256 still matches, so an agent-edited or hand-authored file is retained and reported instead. Boolean gate; ships dark. Scope is retirement only, never expiry: /host/memories has always withheld expired rows, so an expiry-driven list would make months of accumulated backlog deletable on the first armed tick. This is the ONLY thing that makes retirement visible to the agent, which reads its memory directory straight off disk \u2014 every server-side reader already excludes retired rows, so with this off a retired memory is gone everywhere except the one surface that changes the agent's behaviour.",
|
|
@@ -42301,6 +42327,28 @@ var FLAG_REGISTRY = [
|
|
|
42301
42327
|
// exactly the org whose brand should be shown.
|
|
42302
42328
|
public: true
|
|
42303
42329
|
},
|
|
42330
|
+
{
|
|
42331
|
+
key: "ninjafy-logo",
|
|
42332
|
+
description: "Which Ninjafy logo TREATMENT the console chrome renders (ENG-9365). This is a SUB-SELECTION under ninjafy-brand, not a second brand gate: it is consulted only once ninjafy-brand has already resolved ON, so with the brand off the value is inert and the half-branded state that flag's description calls unreachable stays unreachable. ninjafy-brand remains the single kill switch for the rebrand. It exists so candidate logo treatments can be put in front of a human and compared in the running console, rather than judged from a static export. lockup = mark and wordmark together, both in the brand blue \u2014 exactly what ENG-9298 shipped, so an unset flag is a no-op. two-tone = the mark in brand blue with the wordmark in the neutral text colour (the treatment of the blue-icon/black-wordmark artwork). wordmark = the word alone, no mark. Every treatment is composed from the ENG-9298 geometry \u2014 ENG-9312 pins that the lockup's blue path IS the mark subpath followed by the wordmark subpaths, byte for byte \u2014 so a new treatment is a composition, never a fresh trace, and the three drawings cannot drift apart. Surfaces are the dashboard sidebar and the top nav. The top nav shows the WORDMARK portion at every width whatever the treatment, because ENG-9342 decided that deliberately (a full lockup at the header's icon height crowds the team switcher on a phone) \u2014 so a treatment changes the word's colour there, never whether a mark appears. The admin sidebar (ENG-9323) is NOT wired to this key and always renders the mark; widening it is a separate decision. Resolved SERVER-SIDE in (dashboard)/layout.tsx via getPublicEnumFlagServer, beside ninjafy-brand and in the same single GET /flags round trip, then passed down as a required prop. That is not a style preference: the client hook starts at its default and updates after an async fetch, so a client read would paint one logo and swap it after hydration \u2014 the exact flash ENG-9227 removed from the wordmark and ENG-8858 removed from the palette. Org and team are the useful pilot grains, as for ninjafy-brand: the single consumer evaluates in the active-org cookie scope, so a host- or agent-scoped override row is accepted by the table but never reached by the console.",
|
|
42333
|
+
flagType: "enum",
|
|
42334
|
+
allowedValues: ["lockup", "two-tone", "wordmark"],
|
|
42335
|
+
// Declared safe value is `lockup` — what ENG-9298 shipped. This flag has no
|
|
42336
|
+
// "off" direction: it selects among presentations that are all live-safe, so
|
|
42337
|
+
// fail-safe here means "the treatment currently in production", not the
|
|
42338
|
+
// narrowest one. A flag-DB read error, an archived row, or a stored value
|
|
42339
|
+
// outside allowedValues all resolve here (evaluate.ts normalizeFlagValue),
|
|
42340
|
+
// which is what makes an experimental value impossible to strand.
|
|
42341
|
+
defaultValue: "lockup",
|
|
42342
|
+
// Same trap as ninjafy-brand, and it bites harder here because there are no
|
|
42343
|
+
// client readers of this key AT ALL — it is server-resolved by construction.
|
|
42344
|
+
// `public` does NOT mean "read by a browser"; it means "readable through the
|
|
42345
|
+
// public map". getPublicEnumFlagServer resolves against the same GET /flags
|
|
42346
|
+
// endpoint the browser uses, and that route filters to listPublicFlagKeys()
|
|
42347
|
+
// (routes/flags.ts). Drop `public` and the key is simply absent from the map,
|
|
42348
|
+
// so the helper falls through to its default and returns `lockup` FOREVER —
|
|
42349
|
+
// the dropdown appearing to do nothing, with no error raised anywhere.
|
|
42350
|
+
public: true
|
|
42351
|
+
},
|
|
42304
42352
|
{
|
|
42305
42353
|
key: "agent-recruit",
|
|
42306
42354
|
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.",
|
|
@@ -34495,6 +34495,9 @@ var DIRECTIVE_KINDS = [
|
|
|
34495
34495
|
];
|
|
34496
34496
|
var DIRECTIVE_SET = new Set(DIRECTIVE_KINDS);
|
|
34497
34497
|
|
|
34498
|
+
// ../core/dist/admin-debug/resume-precondition.js
|
|
34499
|
+
var DEFAULT_RESUME_LOOKBACK_MS = 14 * 24 * 60 * 60 * 1e3;
|
|
34500
|
+
|
|
34498
34501
|
// ../core/dist/admin-debug/index.js
|
|
34499
34502
|
var STUCK_RESTART_THRESHOLD_SECONDS = 15 * 60;
|
|
34500
34503
|
|
|
@@ -36113,6 +36116,29 @@ var FLAG_REGISTRY = [
|
|
|
36113
36116
|
// first the real cut is higher than this and the pin under-reports.
|
|
36114
36117
|
since: "0.28.570"
|
|
36115
36118
|
},
|
|
36119
|
+
{
|
|
36120
|
+
key: "secret-files-tmpfs",
|
|
36121
|
+
description: "Host-side RAM-backing of the per-agent .env.integrations secret files (ENG-9348, epic ENG-9347). When on, the manager turns both copies (the agent-dir file and the project/ mirror) into symlinks pointing at a 0700 per-agent directory under tmpfs (/dev/shm, else /run), so plaintext channel/integration tokens live only in RAM: the persistent EBS volume holds a symlink (no token bytes), an EBS snapshot captures nothing, and a host shutdown is a genuine wipe. Every consumer path is unchanged (same file paths). Boolean gate; ships dark. Fail-safe in every direction \u2014 off is byte-for-byte today; a host with no genuine tmpfs root (e.g. macOS dev) silently keeps the persistent files; a symlink-setup error logs and falls back to the persistent path. Reboot clears tmpfs, and the manager re-backs on its next refresh (surviving reboot is not required \u2014 secrets are re-fetched on refresh).",
|
|
36122
|
+
flagType: "boolean",
|
|
36123
|
+
// Declared safe value is `false` (persistent files, today's behaviour).
|
|
36124
|
+
// Fail-safe direction: a flag-DB read error must never, on its own, start
|
|
36125
|
+
// relocating where prod secret files physically live. Flip on per-host for a
|
|
36126
|
+
// canary, verify no plaintext lands on the persistent volume, then fleet-wide
|
|
36127
|
+
// from the admin Feature Flags page.
|
|
36128
|
+
defaultValue: false,
|
|
36129
|
+
// ADR-0022 operator override, read by the host flag store's env layer (not a
|
|
36130
|
+
// hand-written process.env gate) — same posture as memory-extraction /
|
|
36131
|
+
// tool-call-audit above. Gives a per-host canary before the DB flag exists.
|
|
36132
|
+
envVar: "AGT_SECRET_FILES_TMPFS_ENABLED",
|
|
36133
|
+
// Deliberately-unreachable placeholder until this ships: no published CLI
|
|
36134
|
+
// carries the manager reader + core writer yet, so reach must report "no
|
|
36135
|
+
// host honors" rather than the `honors`-for-everyone that omitting `since`
|
|
36136
|
+
// produces. MOVE THIS PIN to the actual auto-published agt-cli version at
|
|
36137
|
+
// merge (auto-publish patch-bumps from main; verify against the tarball, the
|
|
36138
|
+
// ENG-8575/ENG-9350 lesson) — the marker is `setSecretFileTmpfsBacking` in
|
|
36139
|
+
// package/dist/lib/manager-worker.js.
|
|
36140
|
+
since: "99.0.0"
|
|
36141
|
+
},
|
|
36116
36142
|
{
|
|
36117
36143
|
key: "memory-file-tombstones",
|
|
36118
36144
|
description: "Host-side removal of RETIRED agent memory files (ENG-9257). The control plane sends an explicit tombstone list on /host/memories and the manager moves the matching .md out of the agent's memory directory \u2014 but only when its write-time manifest says the manager itself wrote that exact file and the sha256 still matches, so an agent-edited or hand-authored file is retained and reported instead. Boolean gate; ships dark. Scope is retirement only, never expiry: /host/memories has always withheld expired rows, so an expiry-driven list would make months of accumulated backlog deletable on the first armed tick. This is the ONLY thing that makes retirement visible to the agent, which reads its memory directory straight off disk \u2014 every server-side reader already excludes retired rows, so with this off a retired memory is gone everywhere except the one surface that changes the agent's behaviour.",
|
|
@@ -36784,6 +36810,28 @@ var FLAG_REGISTRY = [
|
|
|
36784
36810
|
// exactly the org whose brand should be shown.
|
|
36785
36811
|
public: true
|
|
36786
36812
|
},
|
|
36813
|
+
{
|
|
36814
|
+
key: "ninjafy-logo",
|
|
36815
|
+
description: "Which Ninjafy logo TREATMENT the console chrome renders (ENG-9365). This is a SUB-SELECTION under ninjafy-brand, not a second brand gate: it is consulted only once ninjafy-brand has already resolved ON, so with the brand off the value is inert and the half-branded state that flag's description calls unreachable stays unreachable. ninjafy-brand remains the single kill switch for the rebrand. It exists so candidate logo treatments can be put in front of a human and compared in the running console, rather than judged from a static export. lockup = mark and wordmark together, both in the brand blue \u2014 exactly what ENG-9298 shipped, so an unset flag is a no-op. two-tone = the mark in brand blue with the wordmark in the neutral text colour (the treatment of the blue-icon/black-wordmark artwork). wordmark = the word alone, no mark. Every treatment is composed from the ENG-9298 geometry \u2014 ENG-9312 pins that the lockup's blue path IS the mark subpath followed by the wordmark subpaths, byte for byte \u2014 so a new treatment is a composition, never a fresh trace, and the three drawings cannot drift apart. Surfaces are the dashboard sidebar and the top nav. The top nav shows the WORDMARK portion at every width whatever the treatment, because ENG-9342 decided that deliberately (a full lockup at the header's icon height crowds the team switcher on a phone) \u2014 so a treatment changes the word's colour there, never whether a mark appears. The admin sidebar (ENG-9323) is NOT wired to this key and always renders the mark; widening it is a separate decision. Resolved SERVER-SIDE in (dashboard)/layout.tsx via getPublicEnumFlagServer, beside ninjafy-brand and in the same single GET /flags round trip, then passed down as a required prop. That is not a style preference: the client hook starts at its default and updates after an async fetch, so a client read would paint one logo and swap it after hydration \u2014 the exact flash ENG-9227 removed from the wordmark and ENG-8858 removed from the palette. Org and team are the useful pilot grains, as for ninjafy-brand: the single consumer evaluates in the active-org cookie scope, so a host- or agent-scoped override row is accepted by the table but never reached by the console.",
|
|
36816
|
+
flagType: "enum",
|
|
36817
|
+
allowedValues: ["lockup", "two-tone", "wordmark"],
|
|
36818
|
+
// Declared safe value is `lockup` — what ENG-9298 shipped. This flag has no
|
|
36819
|
+
// "off" direction: it selects among presentations that are all live-safe, so
|
|
36820
|
+
// fail-safe here means "the treatment currently in production", not the
|
|
36821
|
+
// narrowest one. A flag-DB read error, an archived row, or a stored value
|
|
36822
|
+
// outside allowedValues all resolve here (evaluate.ts normalizeFlagValue),
|
|
36823
|
+
// which is what makes an experimental value impossible to strand.
|
|
36824
|
+
defaultValue: "lockup",
|
|
36825
|
+
// Same trap as ninjafy-brand, and it bites harder here because there are no
|
|
36826
|
+
// client readers of this key AT ALL — it is server-resolved by construction.
|
|
36827
|
+
// `public` does NOT mean "read by a browser"; it means "readable through the
|
|
36828
|
+
// public map". getPublicEnumFlagServer resolves against the same GET /flags
|
|
36829
|
+
// endpoint the browser uses, and that route filters to listPublicFlagKeys()
|
|
36830
|
+
// (routes/flags.ts). Drop `public` and the key is simply absent from the map,
|
|
36831
|
+
// so the helper falls through to its default and returns `lockup` FOREVER —
|
|
36832
|
+
// the dropdown appearing to do nothing, with no error raised anywhere.
|
|
36833
|
+
public: true
|
|
36834
|
+
},
|
|
36787
36835
|
{
|
|
36788
36836
|
key: "agent-recruit",
|
|
36789
36837
|
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.",
|
|
@@ -34639,6 +34639,9 @@ var DIRECTIVE_KINDS = [
|
|
|
34639
34639
|
];
|
|
34640
34640
|
var DIRECTIVE_SET = new Set(DIRECTIVE_KINDS);
|
|
34641
34641
|
|
|
34642
|
+
// ../core/dist/admin-debug/resume-precondition.js
|
|
34643
|
+
var DEFAULT_RESUME_LOOKBACK_MS = 14 * 24 * 60 * 60 * 1e3;
|
|
34644
|
+
|
|
34642
34645
|
// ../core/dist/admin-debug/index.js
|
|
34643
34646
|
var STUCK_RESTART_THRESHOLD_SECONDS = 15 * 60;
|
|
34644
34647
|
|
|
@@ -36257,6 +36260,29 @@ var FLAG_REGISTRY = [
|
|
|
36257
36260
|
// first the real cut is higher than this and the pin under-reports.
|
|
36258
36261
|
since: "0.28.570"
|
|
36259
36262
|
},
|
|
36263
|
+
{
|
|
36264
|
+
key: "secret-files-tmpfs",
|
|
36265
|
+
description: "Host-side RAM-backing of the per-agent .env.integrations secret files (ENG-9348, epic ENG-9347). When on, the manager turns both copies (the agent-dir file and the project/ mirror) into symlinks pointing at a 0700 per-agent directory under tmpfs (/dev/shm, else /run), so plaintext channel/integration tokens live only in RAM: the persistent EBS volume holds a symlink (no token bytes), an EBS snapshot captures nothing, and a host shutdown is a genuine wipe. Every consumer path is unchanged (same file paths). Boolean gate; ships dark. Fail-safe in every direction \u2014 off is byte-for-byte today; a host with no genuine tmpfs root (e.g. macOS dev) silently keeps the persistent files; a symlink-setup error logs and falls back to the persistent path. Reboot clears tmpfs, and the manager re-backs on its next refresh (surviving reboot is not required \u2014 secrets are re-fetched on refresh).",
|
|
36266
|
+
flagType: "boolean",
|
|
36267
|
+
// Declared safe value is `false` (persistent files, today's behaviour).
|
|
36268
|
+
// Fail-safe direction: a flag-DB read error must never, on its own, start
|
|
36269
|
+
// relocating where prod secret files physically live. Flip on per-host for a
|
|
36270
|
+
// canary, verify no plaintext lands on the persistent volume, then fleet-wide
|
|
36271
|
+
// from the admin Feature Flags page.
|
|
36272
|
+
defaultValue: false,
|
|
36273
|
+
// ADR-0022 operator override, read by the host flag store's env layer (not a
|
|
36274
|
+
// hand-written process.env gate) — same posture as memory-extraction /
|
|
36275
|
+
// tool-call-audit above. Gives a per-host canary before the DB flag exists.
|
|
36276
|
+
envVar: "AGT_SECRET_FILES_TMPFS_ENABLED",
|
|
36277
|
+
// Deliberately-unreachable placeholder until this ships: no published CLI
|
|
36278
|
+
// carries the manager reader + core writer yet, so reach must report "no
|
|
36279
|
+
// host honors" rather than the `honors`-for-everyone that omitting `since`
|
|
36280
|
+
// produces. MOVE THIS PIN to the actual auto-published agt-cli version at
|
|
36281
|
+
// merge (auto-publish patch-bumps from main; verify against the tarball, the
|
|
36282
|
+
// ENG-8575/ENG-9350 lesson) — the marker is `setSecretFileTmpfsBacking` in
|
|
36283
|
+
// package/dist/lib/manager-worker.js.
|
|
36284
|
+
since: "99.0.0"
|
|
36285
|
+
},
|
|
36260
36286
|
{
|
|
36261
36287
|
key: "memory-file-tombstones",
|
|
36262
36288
|
description: "Host-side removal of RETIRED agent memory files (ENG-9257). The control plane sends an explicit tombstone list on /host/memories and the manager moves the matching .md out of the agent's memory directory \u2014 but only when its write-time manifest says the manager itself wrote that exact file and the sha256 still matches, so an agent-edited or hand-authored file is retained and reported instead. Boolean gate; ships dark. Scope is retirement only, never expiry: /host/memories has always withheld expired rows, so an expiry-driven list would make months of accumulated backlog deletable on the first armed tick. This is the ONLY thing that makes retirement visible to the agent, which reads its memory directory straight off disk \u2014 every server-side reader already excludes retired rows, so with this off a retired memory is gone everywhere except the one surface that changes the agent's behaviour.",
|
|
@@ -36928,6 +36954,28 @@ var FLAG_REGISTRY = [
|
|
|
36928
36954
|
// exactly the org whose brand should be shown.
|
|
36929
36955
|
public: true
|
|
36930
36956
|
},
|
|
36957
|
+
{
|
|
36958
|
+
key: "ninjafy-logo",
|
|
36959
|
+
description: "Which Ninjafy logo TREATMENT the console chrome renders (ENG-9365). This is a SUB-SELECTION under ninjafy-brand, not a second brand gate: it is consulted only once ninjafy-brand has already resolved ON, so with the brand off the value is inert and the half-branded state that flag's description calls unreachable stays unreachable. ninjafy-brand remains the single kill switch for the rebrand. It exists so candidate logo treatments can be put in front of a human and compared in the running console, rather than judged from a static export. lockup = mark and wordmark together, both in the brand blue \u2014 exactly what ENG-9298 shipped, so an unset flag is a no-op. two-tone = the mark in brand blue with the wordmark in the neutral text colour (the treatment of the blue-icon/black-wordmark artwork). wordmark = the word alone, no mark. Every treatment is composed from the ENG-9298 geometry \u2014 ENG-9312 pins that the lockup's blue path IS the mark subpath followed by the wordmark subpaths, byte for byte \u2014 so a new treatment is a composition, never a fresh trace, and the three drawings cannot drift apart. Surfaces are the dashboard sidebar and the top nav. The top nav shows the WORDMARK portion at every width whatever the treatment, because ENG-9342 decided that deliberately (a full lockup at the header's icon height crowds the team switcher on a phone) \u2014 so a treatment changes the word's colour there, never whether a mark appears. The admin sidebar (ENG-9323) is NOT wired to this key and always renders the mark; widening it is a separate decision. Resolved SERVER-SIDE in (dashboard)/layout.tsx via getPublicEnumFlagServer, beside ninjafy-brand and in the same single GET /flags round trip, then passed down as a required prop. That is not a style preference: the client hook starts at its default and updates after an async fetch, so a client read would paint one logo and swap it after hydration \u2014 the exact flash ENG-9227 removed from the wordmark and ENG-8858 removed from the palette. Org and team are the useful pilot grains, as for ninjafy-brand: the single consumer evaluates in the active-org cookie scope, so a host- or agent-scoped override row is accepted by the table but never reached by the console.",
|
|
36960
|
+
flagType: "enum",
|
|
36961
|
+
allowedValues: ["lockup", "two-tone", "wordmark"],
|
|
36962
|
+
// Declared safe value is `lockup` — what ENG-9298 shipped. This flag has no
|
|
36963
|
+
// "off" direction: it selects among presentations that are all live-safe, so
|
|
36964
|
+
// fail-safe here means "the treatment currently in production", not the
|
|
36965
|
+
// narrowest one. A flag-DB read error, an archived row, or a stored value
|
|
36966
|
+
// outside allowedValues all resolve here (evaluate.ts normalizeFlagValue),
|
|
36967
|
+
// which is what makes an experimental value impossible to strand.
|
|
36968
|
+
defaultValue: "lockup",
|
|
36969
|
+
// Same trap as ninjafy-brand, and it bites harder here because there are no
|
|
36970
|
+
// client readers of this key AT ALL — it is server-resolved by construction.
|
|
36971
|
+
// `public` does NOT mean "read by a browser"; it means "readable through the
|
|
36972
|
+
// public map". getPublicEnumFlagServer resolves against the same GET /flags
|
|
36973
|
+
// endpoint the browser uses, and that route filters to listPublicFlagKeys()
|
|
36974
|
+
// (routes/flags.ts). Drop `public` and the key is simply absent from the map,
|
|
36975
|
+
// so the helper falls through to its default and returns `lockup` FOREVER —
|
|
36976
|
+
// the dropdown appearing to do nothing, with no error raised anywhere.
|
|
36977
|
+
public: true
|
|
36978
|
+
},
|
|
36931
36979
|
{
|
|
36932
36980
|
key: "agent-recruit",
|
|
36933
36981
|
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.",
|
|
@@ -43,8 +43,8 @@ import {
|
|
|
43
43
|
writeDirectChatSessionState,
|
|
44
44
|
writeEgressAllowlist,
|
|
45
45
|
writePersistentClaudeWrapper
|
|
46
|
-
} from "./chunk-
|
|
47
|
-
import "./chunk-
|
|
46
|
+
} from "./chunk-LTOGVWUR.js";
|
|
47
|
+
import "./chunk-5DHJE2G7.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-
|
|
95
|
+
//# sourceMappingURL=persistent-session-EZEYH3PM.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
paneLogPath
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
3
|
+
} from "./chunk-LTOGVWUR.js";
|
|
4
|
+
import "./chunk-5DHJE2G7.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-
|
|
730
|
+
//# sourceMappingURL=responsiveness-probe-VS6GODYP.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
sessionTranscriptDir
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-5DHJE2G7.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-
|
|
206
|
+
//# sourceMappingURL=session-auth-dead-7U24PZZS.js.map
|