@integrity-labs/agt-cli 0.28.890 → 0.28.892
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-FHJLOWU2.js → chunk-FZ6KIIYX.js} +86 -22
- package/dist/chunk-FZ6KIIYX.js.map +1 -0
- package/dist/{chunk-WGMIKXTX.js → chunk-SUVQ2KSP.js} +4 -4
- package/dist/{chunk-AQM4A5JF.js → chunk-WMJBXN6N.js} +2 -2
- package/dist/{claude-pair-runtime-XSOXRHGZ.js → claude-pair-runtime-RTD7ZCVS.js} +2 -2
- package/dist/lib/manager-worker.js +14 -39
- package/dist/lib/manager-worker.js.map +1 -1
- package/dist/mcp/direct-chat-channel.js +85 -21
- package/dist/mcp/index.js +1316 -1237
- package/dist/mcp/origami.js +85 -21
- package/dist/mcp/slack-channel.js +85 -21
- package/dist/mcp/telegram-channel.js +85 -21
- package/dist/{persistent-session-DVG5WKZZ.js → persistent-session-ARKZDYMX.js} +3 -3
- package/dist/{responsiveness-probe-PPI3AFQG.js → responsiveness-probe-X2WXPIUI.js} +3 -3
- package/dist/{session-auth-dead-L7TAICNC.js → session-auth-dead-BLEV4AUJ.js} +2 -2
- package/package.json +2 -2
- package/dist/assets/review/SKILL.md +0 -223
- package/dist/assets/review/SWEEP.md +0 -169
- package/dist/chunk-FHJLOWU2.js.map +0 -1
- /package/dist/{chunk-WGMIKXTX.js.map → chunk-SUVQ2KSP.js.map} +0 -0
- /package/dist/{chunk-AQM4A5JF.js.map → chunk-WMJBXN6N.js.map} +0 -0
- /package/dist/{claude-pair-runtime-XSOXRHGZ.js.map → claude-pair-runtime-RTD7ZCVS.js.map} +0 -0
- /package/dist/{persistent-session-DVG5WKZZ.js.map → persistent-session-ARKZDYMX.js.map} +0 -0
- /package/dist/{responsiveness-probe-PPI3AFQG.js.map → responsiveness-probe-X2WXPIUI.js.map} +0 -0
- /package/dist/{session-auth-dead-L7TAICNC.js.map → session-auth-dead-BLEV4AUJ.js.map} +0 -0
package/dist/mcp/origami.js
CHANGED
|
@@ -41494,6 +41494,12 @@ var CURSOR_SHORTFALL_REASONS = [
|
|
|
41494
41494
|
var NON_SHORTFALL_KEYS = new Set(CURSOR_ADVANCE_NON_SHORTFALL_KEYS);
|
|
41495
41495
|
var KNOWN_REASONS = new Set(CURSOR_SHORTFALL_REASONS.filter((k) => !NON_SHORTFALL_KEYS.has(k)));
|
|
41496
41496
|
|
|
41497
|
+
// ../core/dist/direct-chat/agent-history-notices.js
|
|
41498
|
+
var AGENT_HISTORY_TURNS_ONLY_OR_FILTER = [
|
|
41499
|
+
"payload->>kind.is.null",
|
|
41500
|
+
`payload->>kind.in.("",${[...USER_FACING_NOTICE_KINDS].sort().join(",")})`
|
|
41501
|
+
].join(",");
|
|
41502
|
+
|
|
41497
41503
|
// ../core/dist/onboarding/state-machine.js
|
|
41498
41504
|
var AREA_ORDER = [
|
|
41499
41505
|
"framing",
|
|
@@ -43707,14 +43713,38 @@ var FLAG_REGISTRY = [
|
|
|
43707
43713
|
},
|
|
43708
43714
|
{
|
|
43709
43715
|
key: "agent-unified-screen",
|
|
43710
|
-
description: 'Unified agent screen redesign (ENG-8478 epic / ENG-8480). When ON, the webapp renders the new single-screen "viewing is editing" agent surface (stripped-back hero, working agent switcher, inline-editable profile, embedded operational panels + a live direct-chat drawer) in place of the separate agent view/edit pages; when OFF, the current view/edit pages are unchanged. Additive UI gate \u2014 no data-model change: each panel reads the same existing endpoints the current pages use. Composes independently with app-top-nav-shell (the two flags are reconciled in ENG-8488).
|
|
43716
|
+
description: 'Unified agent screen redesign (ENG-8478 epic / ENG-8480). When ON, the webapp renders the new single-screen "viewing is editing" agent surface (stripped-back hero, working agent switcher, inline-editable profile, embedded operational panels + a live direct-chat drawer) in place of the separate agent view/edit pages; when OFF, the current view/edit pages are unchanged. Additive UI gate \u2014 no data-model change: each panel reads the same existing endpoints the current pages use. Composes independently with app-top-nav-shell (the two flags are reconciled in ENG-8488). NO LONGER DARK: ENG-9832 cutover step 1 flipped the default to true, so an org with no override now gets the unified screen. The key survives only until cutover step 2 deletes it \u2014 which is blocked on ENG-8547 and ENG-8559, because the flag-off branch is still the only home for the /edit tabs.',
|
|
43711
43717
|
flagType: "boolean",
|
|
43712
|
-
//
|
|
43713
|
-
//
|
|
43714
|
-
|
|
43715
|
-
//
|
|
43716
|
-
// so
|
|
43717
|
-
//
|
|
43718
|
+
// ENG-9832 (cutover step 1): flipped `false` -> `true`. The comment this
|
|
43719
|
+
// replaces called `false` the safe direction — "the current view/edit
|
|
43720
|
+
// pages", never "a half-built redesign". That was true while the redesign
|
|
43721
|
+
// was half built. It has been the shipped surface for the pilot orgs since
|
|
43722
|
+
// ENG-8481, so `false` now points at the pages being retired, not at safety.
|
|
43723
|
+
// The old rationale is recorded rather than deleted because it was correct
|
|
43724
|
+
// under a premise that has since expired.
|
|
43725
|
+
//
|
|
43726
|
+
// MIND THE SPLIT. This value is consulted by the API evaluator when it
|
|
43727
|
+
// builds the `GET /flags` map for an org with NO override. It is NOT the
|
|
43728
|
+
// fallback the webapp uses when that fetch fails: `getPublicBooleanFlagServer`
|
|
43729
|
+
// and `usePublicBooleanFlag` both return the argument passed at the CALL
|
|
43730
|
+
// SITE and never consult this registry. Three call sites carry `true` to
|
|
43731
|
+
// match — agents/[agentId]/page.tsx, agents/[agentId]/edit/page.tsx and
|
|
43732
|
+
// `useAgentUnifiedScreenEnabled` in lib/redesign-flags.ts. Flipping the
|
|
43733
|
+
// registry alone leaves the cutover half-applied with no error anywhere;
|
|
43734
|
+
// eng-9832-unified-fallback-parity.test.ts fails if any of the three drifts.
|
|
43735
|
+
defaultValue: true,
|
|
43736
|
+
// Read BOTH server-side (agents/[agentId]/page.tsx and its /edit sibling, via
|
|
43737
|
+
// getPublicBooleanFlagServer) and client-side (dashboard-sherlock-shell.tsx,
|
|
43738
|
+
// via usePublicBooleanFlag), so the key must be in the browser-exposed public
|
|
43739
|
+
// map. Additive viewer gate, resolved within the active-org cookie's scope
|
|
43740
|
+
// — not sensitive.
|
|
43741
|
+
//
|
|
43742
|
+
// `public` MUST STAY until step 2 deletes the key, and the reason reads
|
|
43743
|
+
// backwards: the server helper resolves against the very SAME public-filtered
|
|
43744
|
+
// `GET /flags` the browser uses (routes/flags.ts filters to
|
|
43745
|
+
// listPublicFlagKeys()). Drop `public` and the key is simply absent from the
|
|
43746
|
+
// map, so both server readers fall through to their call-site argument
|
|
43747
|
+
// forever — silently, with no error raised anywhere.
|
|
43718
43748
|
public: true
|
|
43719
43749
|
},
|
|
43720
43750
|
{
|
|
@@ -43731,16 +43761,36 @@ var FLAG_REGISTRY = [
|
|
|
43731
43761
|
},
|
|
43732
43762
|
{
|
|
43733
43763
|
key: "ninjafy-brand",
|
|
43734
|
-
description: 'Present the product under the Ninjafy brand instead of Augmented Team (ENG-8250). This is the UMBRELLA brand gate, not a one-off nav toggle: every subsequent rebrand surface (page titles, email templates, marketing-facing copy) reads THIS key rather than adding its own flag, so the whole rebrand keeps a single kill switch. First surface is the left-hand nav wordmark \u2014 ON replaces the human+robot mark and the "augmented.team" text with italic lowercase "ninjafy"; OFF renders exactly what shipped before. Scope is the USER-FACING BRAND PRESENTATION \u2014 text AND VISUAL THEME. ENG-8858 widened this from text alone: the Ninjafy palette is gated here too, because a colour theme is not text. It stays ONE key rather than gaining a `ninjafy-theme` sibling, so a half-branded state \u2014 ninjafy wordmark over Augmented green \u2014 is unreachable and the rebrand keeps a single kill switch. It must never gate a code identifier, package name, env var or CLI name. EXISTING identifiers stay `Augmented`/`agt` per the CLAUDE.md naming contract, which protects them from premature renaming \u2014 the deep rename is workstream C of docs/runbooks/rebrand-ninjafy-migration.md and is out of scope here. That contract does NOT require NEW code to carry the old brand: artefacts created specifically for the rebrand take Ninjafy naming (ENG-8078 decision 9; see the CLAUDE.md rebrand carve-out). Either way it is a naming rule, not a flag concern \u2014 this key gates presentation, never an identifier. Set the stage-wide default to flip a whole environment, or add a feature_flag_overrides row to pilot a subset while everyone else still sees Augmented. Overrides resolve at FOUR grains, most specific first \u2014 agent, team, host, then org-wide (evaluate.ts:79-81); organization_id is always required, so there is no global override. Org and team are the useful pilot grains for THIS flag: there is now exactly ONE consumer \u2014 (dashboard)/layout.tsx via getPublicBooleanFlagServer \u2014 evaluating in the active-org cookie scope, so a host- or agent-scoped row is accepted by the table but never reached by the console. It resolves the key ONCE per request and passes the boolean down to sidebar.tsx and top-nav.tsx as a required prop. Resolution is SERVER-side deliberately: the client hook starts at its default and updates after an async GET /flags, so anything gated on it paints Augmented and then repaints. ENG-8858 moved the PALETTE for that reason (a full-page colour flash); ENG-9227 moved the WORDMARK, which had been the last surface still swapping after hydration. A consequence worth knowing: /login and the marketing routes stay on the Augmented palette whatever an org sets, because
|
|
43764
|
+
description: 'Present the product under the Ninjafy brand instead of Augmented Team (ENG-8250). This is the UMBRELLA brand gate, not a one-off nav toggle: every subsequent rebrand surface (page titles, email templates, marketing-facing copy) reads THIS key rather than adding its own flag, so the whole rebrand keeps a single kill switch. First surface is the left-hand nav wordmark \u2014 ON replaces the human+robot mark and the "augmented.team" text with italic lowercase "ninjafy"; OFF renders exactly what shipped before. Scope is the USER-FACING BRAND PRESENTATION \u2014 text AND VISUAL THEME. ENG-8858 widened this from text alone: the Ninjafy palette is gated here too, because a colour theme is not text. It stays ONE key rather than gaining a `ninjafy-theme` sibling, so a half-branded state \u2014 ninjafy wordmark over Augmented green \u2014 is unreachable and the rebrand keeps a single kill switch. It must never gate a code identifier, package name, env var or CLI name. EXISTING identifiers stay `Augmented`/`agt` per the CLAUDE.md naming contract, which protects them from premature renaming \u2014 the deep rename is workstream C of docs/runbooks/rebrand-ninjafy-migration.md and is out of scope here. That contract does NOT require NEW code to carry the old brand: artefacts created specifically for the rebrand take Ninjafy naming (ENG-8078 decision 9; see the CLAUDE.md rebrand carve-out). Either way it is a naming rule, not a flag concern \u2014 this key gates presentation, never an identifier. Set the stage-wide default to flip a whole environment, or add a feature_flag_overrides row to pilot a subset while everyone else still sees Augmented. Overrides resolve at FOUR grains, most specific first \u2014 agent, team, host, then org-wide (evaluate.ts:79-81); organization_id is always required, so there is no global override. Org and team are the useful pilot grains for THIS flag: there is now exactly ONE consumer \u2014 (dashboard)/layout.tsx via getPublicBooleanFlagServer \u2014 evaluating in the active-org cookie scope, so a host- or agent-scoped row is accepted by the table but never reached by the console. It resolves the key ONCE per request and passes the boolean down to sidebar.tsx and top-nav.tsx as a required prop. Resolution is SERVER-side deliberately: the client hook starts at its default and updates after an async GET /flags, so anything gated on it paints Augmented and then repaints. ENG-8858 moved the PALETTE for that reason (a full-page colour flash); ENG-9227 moved the WORDMARK, which had been the last surface still swapping after hydration. A consequence worth knowing: /login and the marketing routes stay on the Augmented palette whatever an org sets, because fetchPublicFlags returns null without a verified session and a pre-auth page has neither a session nor an active org \u2014 a PER-ORG flag structurally cannot brand one. ENG-9830 CORRECTS what used to be written here ("those surfaces follow only when the stage-wide default flips"): they do not follow it at all. Two reasons. The value returned on a null fetch is the CALL SITE\u2019s passed argument, not this registry default; and six such pages (/login, /reset-password, /auth/confirm, the pre-redeem member-signin gate and the two public Slack-install terminal pages) do not mount <BrandStamp/> AT ALL \u2014 deliberately, enumerated with per-page reasons in eng-9266-brand-stamp-coverage.test.ts. They become branded when the flag is REMOVED at cutover step 2 and the palette moves into bare :root, with no read left to gate it. NO LONGER DARK: ENG-9830 cutover step 1 flipped the default to true, so an org with no override now sees Ninjafy. The key survives only until cutover step 2 deletes it.',
|
|
43735
43765
|
flagType: "boolean",
|
|
43736
|
-
//
|
|
43737
|
-
//
|
|
43738
|
-
//
|
|
43739
|
-
// rebrand
|
|
43740
|
-
|
|
43766
|
+
// ENG-9830 (cutover step 1): flipped `false` -> `true`. The comment this
|
|
43767
|
+
// replaces argued `false` was the fail-closed direction — "never leak an
|
|
43768
|
+
// UNANNOUNCED rebrand to every customer at once". That was correct for as
|
|
43769
|
+
// long as the rebrand was unannounced. It is not any more: Ninjafy is the
|
|
43770
|
+
// live, announced brand (ENG-9613 reconciled the console onto the master
|
|
43771
|
+
// assets while the flag was already ON in production), so `false` now points
|
|
43772
|
+
// at the brand we no longer ship. A flags outage that reverted a customer to
|
|
43773
|
+
// Augmented would be the incident, not the safe harbour.
|
|
43774
|
+
//
|
|
43775
|
+
// The old rationale is recorded rather than deleted because it is a correct
|
|
43776
|
+
// argument whose PREMISE expired — reading the change without it looks like
|
|
43777
|
+
// someone overriding a deliberate fail-closed default.
|
|
43778
|
+
//
|
|
43779
|
+
// NOTE this value is only consulted by the API evaluator when building the
|
|
43780
|
+
// `GET /flags` map for an org with no override. It is NOT the fallback the
|
|
43781
|
+
// webapp uses on an outage: `getPublicBooleanFlagServer(key, defaultValue)`
|
|
43782
|
+
// returns its own PASSED argument when the fetch fails, so the call sites in
|
|
43783
|
+
// (dashboard)/layout.tsx and components/brand-stamp.tsx carry `true` too.
|
|
43784
|
+
// Flipping only one of the two leaves the cutover half-applied.
|
|
43785
|
+
defaultValue: true,
|
|
43741
43786
|
// ENG-9227: there are NO client readers of this key left. (dashboard)/
|
|
43742
43787
|
// layout.tsx resolves it ONCE server-side via getPublicBooleanFlagServer and
|
|
43743
43788
|
// passes the boolean down to sidebar.tsx and top-nav.tsx as a required prop.
|
|
43789
|
+
// "ONCE" is about the chrome, not the key: components/brand-stamp.tsx is a
|
|
43790
|
+
// SECOND, independent server read of `ninjafy-brand` (CodeRabbit, #5385).
|
|
43791
|
+
// Both are listed in the note above because both carry an outage fallback
|
|
43792
|
+
// that has to move together — reading this paragraph alone would leave you
|
|
43793
|
+
// updating one of the two.
|
|
43744
43794
|
// ENG-8858 did that for the THEME; ENG-9227 finished the job for the
|
|
43745
43795
|
// WORDMARK, which had kept usePublicBooleanFlag and so kept swapping
|
|
43746
43796
|
// "augmented.team" to "ninjafy" after hydration.
|
|
@@ -43762,24 +43812,38 @@ var FLAG_REGISTRY = [
|
|
|
43762
43812
|
},
|
|
43763
43813
|
{
|
|
43764
43814
|
key: "ninjafy-logo",
|
|
43765
|
-
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
|
|
43815
|
+
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 existed so candidate logo treatments could be put in front of a human and compared in the running console, rather than judged from a static export. That comparison has happened: ENG-9830 cutover step 1 chose TWO-TONE, so that is now the default and an unset flag renders it. NOTE this reverses the property this description used to claim \u2014 an unset flag was a no-op while the default was lockup (what ENG-9298 shipped), and that is deliberately given up at cutover: the default MOVING is the change. The key survives only until cutover step 2 hardcodes the chosen treatment and deletes it. lockup = mark and wordmark together, both in the brand blue \u2014 what ENG-9298 shipped. two-tone = the mark in brand blue with the wordmark in the neutral text colour (the treatment of the blue-icon/black-wordmark artwork); the chosen one. 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.",
|
|
43766
43816
|
flagType: "enum",
|
|
43767
43817
|
allowedValues: ["lockup", "two-tone", "wordmark"],
|
|
43768
|
-
//
|
|
43769
|
-
//
|
|
43770
|
-
//
|
|
43818
|
+
// ENG-9830 (cutover step 1): `lockup` -> `two-tone`. The treatments existed
|
|
43819
|
+
// so they could be compared in the running console rather than judged from a
|
|
43820
|
+
// static export (ENG-9365); that comparison has now happened and `two-tone`
|
|
43821
|
+
// — the mark in brand blue with the wordmark in the neutral text colour — is
|
|
43822
|
+
// the chosen treatment. It becomes the hardcoded one when this key is
|
|
43823
|
+
// removed at cutover step 2.
|
|
43824
|
+
//
|
|
43825
|
+
// The rule this value obeys is unchanged: this flag has no "off" direction,
|
|
43826
|
+
// so fail-safe means "the treatment currently in production", not the
|
|
43771
43827
|
// narrowest one. A flag-DB read error, an archived row, or a stored value
|
|
43772
43828
|
// outside allowedValues all resolve here (evaluate.ts normalizeFlagValue),
|
|
43773
|
-
// which is what makes an experimental value impossible to strand.
|
|
43774
|
-
|
|
43829
|
+
// which is what makes an experimental value impossible to strand. Only which
|
|
43830
|
+
// treatment holds that position has moved.
|
|
43831
|
+
//
|
|
43832
|
+
// Same split as ninjafy-brand above: this governs the API evaluation path
|
|
43833
|
+
// only. The webapp's outage fallback is the argument passed at the
|
|
43834
|
+
// (dashboard)/layout.tsx call site, which carries 'two-tone' to match.
|
|
43835
|
+
defaultValue: "two-tone",
|
|
43775
43836
|
// Same trap as ninjafy-brand, and it bites harder here because there are no
|
|
43776
43837
|
// client readers of this key AT ALL — it is server-resolved by construction.
|
|
43777
43838
|
// `public` does NOT mean "read by a browser"; it means "readable through the
|
|
43778
43839
|
// public map". getPublicEnumFlagServer resolves against the same GET /flags
|
|
43779
43840
|
// endpoint the browser uses, and that route filters to listPublicFlagKeys()
|
|
43780
43841
|
// (routes/flags.ts). Drop `public` and the key is simply absent from the map,
|
|
43781
|
-
// so the helper falls through to
|
|
43782
|
-
// the dropdown appearing to do nothing, with no error
|
|
43842
|
+
// so the helper falls through to the fallback passed at that call site and
|
|
43843
|
+
// returns it FOREVER — the dropdown appearing to do nothing, with no error
|
|
43844
|
+
// raised anywhere. Named as the call site rather than as a literal on
|
|
43845
|
+
// purpose: this comment said `lockup` for exactly as long as `lockup` was
|
|
43846
|
+
// the answer, and ENG-9830 flipping the winner is what made it a lie.
|
|
43783
43847
|
public: true
|
|
43784
43848
|
},
|
|
43785
43849
|
{
|
|
@@ -35724,6 +35724,12 @@ var CURSOR_SHORTFALL_REASONS = [
|
|
|
35724
35724
|
var NON_SHORTFALL_KEYS = new Set(CURSOR_ADVANCE_NON_SHORTFALL_KEYS);
|
|
35725
35725
|
var KNOWN_REASONS = new Set(CURSOR_SHORTFALL_REASONS.filter((k) => !NON_SHORTFALL_KEYS.has(k)));
|
|
35726
35726
|
|
|
35727
|
+
// ../core/dist/direct-chat/agent-history-notices.js
|
|
35728
|
+
var AGENT_HISTORY_TURNS_ONLY_OR_FILTER = [
|
|
35729
|
+
"payload->>kind.is.null",
|
|
35730
|
+
`payload->>kind.in.("",${[...USER_FACING_NOTICE_KINDS].sort().join(",")})`
|
|
35731
|
+
].join(",");
|
|
35732
|
+
|
|
35727
35733
|
// ../core/dist/onboarding/state-machine.js
|
|
35728
35734
|
var AREA_ORDER = [
|
|
35729
35735
|
"framing",
|
|
@@ -38344,14 +38350,38 @@ var FLAG_REGISTRY = [
|
|
|
38344
38350
|
},
|
|
38345
38351
|
{
|
|
38346
38352
|
key: "agent-unified-screen",
|
|
38347
|
-
description: 'Unified agent screen redesign (ENG-8478 epic / ENG-8480). When ON, the webapp renders the new single-screen "viewing is editing" agent surface (stripped-back hero, working agent switcher, inline-editable profile, embedded operational panels + a live direct-chat drawer) in place of the separate agent view/edit pages; when OFF, the current view/edit pages are unchanged. Additive UI gate \u2014 no data-model change: each panel reads the same existing endpoints the current pages use. Composes independently with app-top-nav-shell (the two flags are reconciled in ENG-8488).
|
|
38353
|
+
description: 'Unified agent screen redesign (ENG-8478 epic / ENG-8480). When ON, the webapp renders the new single-screen "viewing is editing" agent surface (stripped-back hero, working agent switcher, inline-editable profile, embedded operational panels + a live direct-chat drawer) in place of the separate agent view/edit pages; when OFF, the current view/edit pages are unchanged. Additive UI gate \u2014 no data-model change: each panel reads the same existing endpoints the current pages use. Composes independently with app-top-nav-shell (the two flags are reconciled in ENG-8488). NO LONGER DARK: ENG-9832 cutover step 1 flipped the default to true, so an org with no override now gets the unified screen. The key survives only until cutover step 2 deletes it \u2014 which is blocked on ENG-8547 and ENG-8559, because the flag-off branch is still the only home for the /edit tabs.',
|
|
38348
38354
|
flagType: "boolean",
|
|
38349
|
-
//
|
|
38350
|
-
//
|
|
38351
|
-
|
|
38352
|
-
//
|
|
38353
|
-
// so
|
|
38354
|
-
//
|
|
38355
|
+
// ENG-9832 (cutover step 1): flipped `false` -> `true`. The comment this
|
|
38356
|
+
// replaces called `false` the safe direction — "the current view/edit
|
|
38357
|
+
// pages", never "a half-built redesign". That was true while the redesign
|
|
38358
|
+
// was half built. It has been the shipped surface for the pilot orgs since
|
|
38359
|
+
// ENG-8481, so `false` now points at the pages being retired, not at safety.
|
|
38360
|
+
// The old rationale is recorded rather than deleted because it was correct
|
|
38361
|
+
// under a premise that has since expired.
|
|
38362
|
+
//
|
|
38363
|
+
// MIND THE SPLIT. This value is consulted by the API evaluator when it
|
|
38364
|
+
// builds the `GET /flags` map for an org with NO override. It is NOT the
|
|
38365
|
+
// fallback the webapp uses when that fetch fails: `getPublicBooleanFlagServer`
|
|
38366
|
+
// and `usePublicBooleanFlag` both return the argument passed at the CALL
|
|
38367
|
+
// SITE and never consult this registry. Three call sites carry `true` to
|
|
38368
|
+
// match — agents/[agentId]/page.tsx, agents/[agentId]/edit/page.tsx and
|
|
38369
|
+
// `useAgentUnifiedScreenEnabled` in lib/redesign-flags.ts. Flipping the
|
|
38370
|
+
// registry alone leaves the cutover half-applied with no error anywhere;
|
|
38371
|
+
// eng-9832-unified-fallback-parity.test.ts fails if any of the three drifts.
|
|
38372
|
+
defaultValue: true,
|
|
38373
|
+
// Read BOTH server-side (agents/[agentId]/page.tsx and its /edit sibling, via
|
|
38374
|
+
// getPublicBooleanFlagServer) and client-side (dashboard-sherlock-shell.tsx,
|
|
38375
|
+
// via usePublicBooleanFlag), so the key must be in the browser-exposed public
|
|
38376
|
+
// map. Additive viewer gate, resolved within the active-org cookie's scope
|
|
38377
|
+
// — not sensitive.
|
|
38378
|
+
//
|
|
38379
|
+
// `public` MUST STAY until step 2 deletes the key, and the reason reads
|
|
38380
|
+
// backwards: the server helper resolves against the very SAME public-filtered
|
|
38381
|
+
// `GET /flags` the browser uses (routes/flags.ts filters to
|
|
38382
|
+
// listPublicFlagKeys()). Drop `public` and the key is simply absent from the
|
|
38383
|
+
// map, so both server readers fall through to their call-site argument
|
|
38384
|
+
// forever — silently, with no error raised anywhere.
|
|
38355
38385
|
public: true
|
|
38356
38386
|
},
|
|
38357
38387
|
{
|
|
@@ -38368,16 +38398,36 @@ var FLAG_REGISTRY = [
|
|
|
38368
38398
|
},
|
|
38369
38399
|
{
|
|
38370
38400
|
key: "ninjafy-brand",
|
|
38371
|
-
description: 'Present the product under the Ninjafy brand instead of Augmented Team (ENG-8250). This is the UMBRELLA brand gate, not a one-off nav toggle: every subsequent rebrand surface (page titles, email templates, marketing-facing copy) reads THIS key rather than adding its own flag, so the whole rebrand keeps a single kill switch. First surface is the left-hand nav wordmark \u2014 ON replaces the human+robot mark and the "augmented.team" text with italic lowercase "ninjafy"; OFF renders exactly what shipped before. Scope is the USER-FACING BRAND PRESENTATION \u2014 text AND VISUAL THEME. ENG-8858 widened this from text alone: the Ninjafy palette is gated here too, because a colour theme is not text. It stays ONE key rather than gaining a `ninjafy-theme` sibling, so a half-branded state \u2014 ninjafy wordmark over Augmented green \u2014 is unreachable and the rebrand keeps a single kill switch. It must never gate a code identifier, package name, env var or CLI name. EXISTING identifiers stay `Augmented`/`agt` per the CLAUDE.md naming contract, which protects them from premature renaming \u2014 the deep rename is workstream C of docs/runbooks/rebrand-ninjafy-migration.md and is out of scope here. That contract does NOT require NEW code to carry the old brand: artefacts created specifically for the rebrand take Ninjafy naming (ENG-8078 decision 9; see the CLAUDE.md rebrand carve-out). Either way it is a naming rule, not a flag concern \u2014 this key gates presentation, never an identifier. Set the stage-wide default to flip a whole environment, or add a feature_flag_overrides row to pilot a subset while everyone else still sees Augmented. Overrides resolve at FOUR grains, most specific first \u2014 agent, team, host, then org-wide (evaluate.ts:79-81); organization_id is always required, so there is no global override. Org and team are the useful pilot grains for THIS flag: there is now exactly ONE consumer \u2014 (dashboard)/layout.tsx via getPublicBooleanFlagServer \u2014 evaluating in the active-org cookie scope, so a host- or agent-scoped row is accepted by the table but never reached by the console. It resolves the key ONCE per request and passes the boolean down to sidebar.tsx and top-nav.tsx as a required prop. Resolution is SERVER-side deliberately: the client hook starts at its default and updates after an async GET /flags, so anything gated on it paints Augmented and then repaints. ENG-8858 moved the PALETTE for that reason (a full-page colour flash); ENG-9227 moved the WORDMARK, which had been the last surface still swapping after hydration. A consequence worth knowing: /login and the marketing routes stay on the Augmented palette whatever an org sets, because
|
|
38401
|
+
description: 'Present the product under the Ninjafy brand instead of Augmented Team (ENG-8250). This is the UMBRELLA brand gate, not a one-off nav toggle: every subsequent rebrand surface (page titles, email templates, marketing-facing copy) reads THIS key rather than adding its own flag, so the whole rebrand keeps a single kill switch. First surface is the left-hand nav wordmark \u2014 ON replaces the human+robot mark and the "augmented.team" text with italic lowercase "ninjafy"; OFF renders exactly what shipped before. Scope is the USER-FACING BRAND PRESENTATION \u2014 text AND VISUAL THEME. ENG-8858 widened this from text alone: the Ninjafy palette is gated here too, because a colour theme is not text. It stays ONE key rather than gaining a `ninjafy-theme` sibling, so a half-branded state \u2014 ninjafy wordmark over Augmented green \u2014 is unreachable and the rebrand keeps a single kill switch. It must never gate a code identifier, package name, env var or CLI name. EXISTING identifiers stay `Augmented`/`agt` per the CLAUDE.md naming contract, which protects them from premature renaming \u2014 the deep rename is workstream C of docs/runbooks/rebrand-ninjafy-migration.md and is out of scope here. That contract does NOT require NEW code to carry the old brand: artefacts created specifically for the rebrand take Ninjafy naming (ENG-8078 decision 9; see the CLAUDE.md rebrand carve-out). Either way it is a naming rule, not a flag concern \u2014 this key gates presentation, never an identifier. Set the stage-wide default to flip a whole environment, or add a feature_flag_overrides row to pilot a subset while everyone else still sees Augmented. Overrides resolve at FOUR grains, most specific first \u2014 agent, team, host, then org-wide (evaluate.ts:79-81); organization_id is always required, so there is no global override. Org and team are the useful pilot grains for THIS flag: there is now exactly ONE consumer \u2014 (dashboard)/layout.tsx via getPublicBooleanFlagServer \u2014 evaluating in the active-org cookie scope, so a host- or agent-scoped row is accepted by the table but never reached by the console. It resolves the key ONCE per request and passes the boolean down to sidebar.tsx and top-nav.tsx as a required prop. Resolution is SERVER-side deliberately: the client hook starts at its default and updates after an async GET /flags, so anything gated on it paints Augmented and then repaints. ENG-8858 moved the PALETTE for that reason (a full-page colour flash); ENG-9227 moved the WORDMARK, which had been the last surface still swapping after hydration. A consequence worth knowing: /login and the marketing routes stay on the Augmented palette whatever an org sets, because fetchPublicFlags returns null without a verified session and a pre-auth page has neither a session nor an active org \u2014 a PER-ORG flag structurally cannot brand one. ENG-9830 CORRECTS what used to be written here ("those surfaces follow only when the stage-wide default flips"): they do not follow it at all. Two reasons. The value returned on a null fetch is the CALL SITE\u2019s passed argument, not this registry default; and six such pages (/login, /reset-password, /auth/confirm, the pre-redeem member-signin gate and the two public Slack-install terminal pages) do not mount <BrandStamp/> AT ALL \u2014 deliberately, enumerated with per-page reasons in eng-9266-brand-stamp-coverage.test.ts. They become branded when the flag is REMOVED at cutover step 2 and the palette moves into bare :root, with no read left to gate it. NO LONGER DARK: ENG-9830 cutover step 1 flipped the default to true, so an org with no override now sees Ninjafy. The key survives only until cutover step 2 deletes it.',
|
|
38372
38402
|
flagType: "boolean",
|
|
38373
|
-
//
|
|
38374
|
-
//
|
|
38375
|
-
//
|
|
38376
|
-
// rebrand
|
|
38377
|
-
|
|
38403
|
+
// ENG-9830 (cutover step 1): flipped `false` -> `true`. The comment this
|
|
38404
|
+
// replaces argued `false` was the fail-closed direction — "never leak an
|
|
38405
|
+
// UNANNOUNCED rebrand to every customer at once". That was correct for as
|
|
38406
|
+
// long as the rebrand was unannounced. It is not any more: Ninjafy is the
|
|
38407
|
+
// live, announced brand (ENG-9613 reconciled the console onto the master
|
|
38408
|
+
// assets while the flag was already ON in production), so `false` now points
|
|
38409
|
+
// at the brand we no longer ship. A flags outage that reverted a customer to
|
|
38410
|
+
// Augmented would be the incident, not the safe harbour.
|
|
38411
|
+
//
|
|
38412
|
+
// The old rationale is recorded rather than deleted because it is a correct
|
|
38413
|
+
// argument whose PREMISE expired — reading the change without it looks like
|
|
38414
|
+
// someone overriding a deliberate fail-closed default.
|
|
38415
|
+
//
|
|
38416
|
+
// NOTE this value is only consulted by the API evaluator when building the
|
|
38417
|
+
// `GET /flags` map for an org with no override. It is NOT the fallback the
|
|
38418
|
+
// webapp uses on an outage: `getPublicBooleanFlagServer(key, defaultValue)`
|
|
38419
|
+
// returns its own PASSED argument when the fetch fails, so the call sites in
|
|
38420
|
+
// (dashboard)/layout.tsx and components/brand-stamp.tsx carry `true` too.
|
|
38421
|
+
// Flipping only one of the two leaves the cutover half-applied.
|
|
38422
|
+
defaultValue: true,
|
|
38378
38423
|
// ENG-9227: there are NO client readers of this key left. (dashboard)/
|
|
38379
38424
|
// layout.tsx resolves it ONCE server-side via getPublicBooleanFlagServer and
|
|
38380
38425
|
// passes the boolean down to sidebar.tsx and top-nav.tsx as a required prop.
|
|
38426
|
+
// "ONCE" is about the chrome, not the key: components/brand-stamp.tsx is a
|
|
38427
|
+
// SECOND, independent server read of `ninjafy-brand` (CodeRabbit, #5385).
|
|
38428
|
+
// Both are listed in the note above because both carry an outage fallback
|
|
38429
|
+
// that has to move together — reading this paragraph alone would leave you
|
|
38430
|
+
// updating one of the two.
|
|
38381
38431
|
// ENG-8858 did that for the THEME; ENG-9227 finished the job for the
|
|
38382
38432
|
// WORDMARK, which had kept usePublicBooleanFlag and so kept swapping
|
|
38383
38433
|
// "augmented.team" to "ninjafy" after hydration.
|
|
@@ -38399,24 +38449,38 @@ var FLAG_REGISTRY = [
|
|
|
38399
38449
|
},
|
|
38400
38450
|
{
|
|
38401
38451
|
key: "ninjafy-logo",
|
|
38402
|
-
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
|
|
38452
|
+
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 existed so candidate logo treatments could be put in front of a human and compared in the running console, rather than judged from a static export. That comparison has happened: ENG-9830 cutover step 1 chose TWO-TONE, so that is now the default and an unset flag renders it. NOTE this reverses the property this description used to claim \u2014 an unset flag was a no-op while the default was lockup (what ENG-9298 shipped), and that is deliberately given up at cutover: the default MOVING is the change. The key survives only until cutover step 2 hardcodes the chosen treatment and deletes it. lockup = mark and wordmark together, both in the brand blue \u2014 what ENG-9298 shipped. two-tone = the mark in brand blue with the wordmark in the neutral text colour (the treatment of the blue-icon/black-wordmark artwork); the chosen one. 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.",
|
|
38403
38453
|
flagType: "enum",
|
|
38404
38454
|
allowedValues: ["lockup", "two-tone", "wordmark"],
|
|
38405
|
-
//
|
|
38406
|
-
//
|
|
38407
|
-
//
|
|
38455
|
+
// ENG-9830 (cutover step 1): `lockup` -> `two-tone`. The treatments existed
|
|
38456
|
+
// so they could be compared in the running console rather than judged from a
|
|
38457
|
+
// static export (ENG-9365); that comparison has now happened and `two-tone`
|
|
38458
|
+
// — the mark in brand blue with the wordmark in the neutral text colour — is
|
|
38459
|
+
// the chosen treatment. It becomes the hardcoded one when this key is
|
|
38460
|
+
// removed at cutover step 2.
|
|
38461
|
+
//
|
|
38462
|
+
// The rule this value obeys is unchanged: this flag has no "off" direction,
|
|
38463
|
+
// so fail-safe means "the treatment currently in production", not the
|
|
38408
38464
|
// narrowest one. A flag-DB read error, an archived row, or a stored value
|
|
38409
38465
|
// outside allowedValues all resolve here (evaluate.ts normalizeFlagValue),
|
|
38410
|
-
// which is what makes an experimental value impossible to strand.
|
|
38411
|
-
|
|
38466
|
+
// which is what makes an experimental value impossible to strand. Only which
|
|
38467
|
+
// treatment holds that position has moved.
|
|
38468
|
+
//
|
|
38469
|
+
// Same split as ninjafy-brand above: this governs the API evaluation path
|
|
38470
|
+
// only. The webapp's outage fallback is the argument passed at the
|
|
38471
|
+
// (dashboard)/layout.tsx call site, which carries 'two-tone' to match.
|
|
38472
|
+
defaultValue: "two-tone",
|
|
38412
38473
|
// Same trap as ninjafy-brand, and it bites harder here because there are no
|
|
38413
38474
|
// client readers of this key AT ALL — it is server-resolved by construction.
|
|
38414
38475
|
// `public` does NOT mean "read by a browser"; it means "readable through the
|
|
38415
38476
|
// public map". getPublicEnumFlagServer resolves against the same GET /flags
|
|
38416
38477
|
// endpoint the browser uses, and that route filters to listPublicFlagKeys()
|
|
38417
38478
|
// (routes/flags.ts). Drop `public` and the key is simply absent from the map,
|
|
38418
|
-
// so the helper falls through to
|
|
38419
|
-
// the dropdown appearing to do nothing, with no error
|
|
38479
|
+
// so the helper falls through to the fallback passed at that call site and
|
|
38480
|
+
// returns it FOREVER — the dropdown appearing to do nothing, with no error
|
|
38481
|
+
// raised anywhere. Named as the call site rather than as a literal on
|
|
38482
|
+
// purpose: this comment said `lockup` for exactly as long as `lockup` was
|
|
38483
|
+
// the answer, and ENG-9830 flipping the winner is what made it a lie.
|
|
38420
38484
|
public: true
|
|
38421
38485
|
},
|
|
38422
38486
|
{
|
|
@@ -35774,6 +35774,12 @@ var CURSOR_SHORTFALL_REASONS = [
|
|
|
35774
35774
|
var NON_SHORTFALL_KEYS = new Set(CURSOR_ADVANCE_NON_SHORTFALL_KEYS);
|
|
35775
35775
|
var KNOWN_REASONS = new Set(CURSOR_SHORTFALL_REASONS.filter((k) => !NON_SHORTFALL_KEYS.has(k)));
|
|
35776
35776
|
|
|
35777
|
+
// ../core/dist/direct-chat/agent-history-notices.js
|
|
35778
|
+
var AGENT_HISTORY_TURNS_ONLY_OR_FILTER = [
|
|
35779
|
+
"payload->>kind.is.null",
|
|
35780
|
+
`payload->>kind.in.("",${[...USER_FACING_NOTICE_KINDS].sort().join(",")})`
|
|
35781
|
+
].join(",");
|
|
35782
|
+
|
|
35777
35783
|
// ../core/dist/onboarding/state-machine.js
|
|
35778
35784
|
var AREA_ORDER = [
|
|
35779
35785
|
"framing",
|
|
@@ -38394,14 +38400,38 @@ var FLAG_REGISTRY = [
|
|
|
38394
38400
|
},
|
|
38395
38401
|
{
|
|
38396
38402
|
key: "agent-unified-screen",
|
|
38397
|
-
description: 'Unified agent screen redesign (ENG-8478 epic / ENG-8480). When ON, the webapp renders the new single-screen "viewing is editing" agent surface (stripped-back hero, working agent switcher, inline-editable profile, embedded operational panels + a live direct-chat drawer) in place of the separate agent view/edit pages; when OFF, the current view/edit pages are unchanged. Additive UI gate \u2014 no data-model change: each panel reads the same existing endpoints the current pages use. Composes independently with app-top-nav-shell (the two flags are reconciled in ENG-8488).
|
|
38403
|
+
description: 'Unified agent screen redesign (ENG-8478 epic / ENG-8480). When ON, the webapp renders the new single-screen "viewing is editing" agent surface (stripped-back hero, working agent switcher, inline-editable profile, embedded operational panels + a live direct-chat drawer) in place of the separate agent view/edit pages; when OFF, the current view/edit pages are unchanged. Additive UI gate \u2014 no data-model change: each panel reads the same existing endpoints the current pages use. Composes independently with app-top-nav-shell (the two flags are reconciled in ENG-8488). NO LONGER DARK: ENG-9832 cutover step 1 flipped the default to true, so an org with no override now gets the unified screen. The key survives only until cutover step 2 deletes it \u2014 which is blocked on ENG-8547 and ENG-8559, because the flag-off branch is still the only home for the /edit tabs.',
|
|
38398
38404
|
flagType: "boolean",
|
|
38399
|
-
//
|
|
38400
|
-
//
|
|
38401
|
-
|
|
38402
|
-
//
|
|
38403
|
-
// so
|
|
38404
|
-
//
|
|
38405
|
+
// ENG-9832 (cutover step 1): flipped `false` -> `true`. The comment this
|
|
38406
|
+
// replaces called `false` the safe direction — "the current view/edit
|
|
38407
|
+
// pages", never "a half-built redesign". That was true while the redesign
|
|
38408
|
+
// was half built. It has been the shipped surface for the pilot orgs since
|
|
38409
|
+
// ENG-8481, so `false` now points at the pages being retired, not at safety.
|
|
38410
|
+
// The old rationale is recorded rather than deleted because it was correct
|
|
38411
|
+
// under a premise that has since expired.
|
|
38412
|
+
//
|
|
38413
|
+
// MIND THE SPLIT. This value is consulted by the API evaluator when it
|
|
38414
|
+
// builds the `GET /flags` map for an org with NO override. It is NOT the
|
|
38415
|
+
// fallback the webapp uses when that fetch fails: `getPublicBooleanFlagServer`
|
|
38416
|
+
// and `usePublicBooleanFlag` both return the argument passed at the CALL
|
|
38417
|
+
// SITE and never consult this registry. Three call sites carry `true` to
|
|
38418
|
+
// match — agents/[agentId]/page.tsx, agents/[agentId]/edit/page.tsx and
|
|
38419
|
+
// `useAgentUnifiedScreenEnabled` in lib/redesign-flags.ts. Flipping the
|
|
38420
|
+
// registry alone leaves the cutover half-applied with no error anywhere;
|
|
38421
|
+
// eng-9832-unified-fallback-parity.test.ts fails if any of the three drifts.
|
|
38422
|
+
defaultValue: true,
|
|
38423
|
+
// Read BOTH server-side (agents/[agentId]/page.tsx and its /edit sibling, via
|
|
38424
|
+
// getPublicBooleanFlagServer) and client-side (dashboard-sherlock-shell.tsx,
|
|
38425
|
+
// via usePublicBooleanFlag), so the key must be in the browser-exposed public
|
|
38426
|
+
// map. Additive viewer gate, resolved within the active-org cookie's scope
|
|
38427
|
+
// — not sensitive.
|
|
38428
|
+
//
|
|
38429
|
+
// `public` MUST STAY until step 2 deletes the key, and the reason reads
|
|
38430
|
+
// backwards: the server helper resolves against the very SAME public-filtered
|
|
38431
|
+
// `GET /flags` the browser uses (routes/flags.ts filters to
|
|
38432
|
+
// listPublicFlagKeys()). Drop `public` and the key is simply absent from the
|
|
38433
|
+
// map, so both server readers fall through to their call-site argument
|
|
38434
|
+
// forever — silently, with no error raised anywhere.
|
|
38405
38435
|
public: true
|
|
38406
38436
|
},
|
|
38407
38437
|
{
|
|
@@ -38418,16 +38448,36 @@ var FLAG_REGISTRY = [
|
|
|
38418
38448
|
},
|
|
38419
38449
|
{
|
|
38420
38450
|
key: "ninjafy-brand",
|
|
38421
|
-
description: 'Present the product under the Ninjafy brand instead of Augmented Team (ENG-8250). This is the UMBRELLA brand gate, not a one-off nav toggle: every subsequent rebrand surface (page titles, email templates, marketing-facing copy) reads THIS key rather than adding its own flag, so the whole rebrand keeps a single kill switch. First surface is the left-hand nav wordmark \u2014 ON replaces the human+robot mark and the "augmented.team" text with italic lowercase "ninjafy"; OFF renders exactly what shipped before. Scope is the USER-FACING BRAND PRESENTATION \u2014 text AND VISUAL THEME. ENG-8858 widened this from text alone: the Ninjafy palette is gated here too, because a colour theme is not text. It stays ONE key rather than gaining a `ninjafy-theme` sibling, so a half-branded state \u2014 ninjafy wordmark over Augmented green \u2014 is unreachable and the rebrand keeps a single kill switch. It must never gate a code identifier, package name, env var or CLI name. EXISTING identifiers stay `Augmented`/`agt` per the CLAUDE.md naming contract, which protects them from premature renaming \u2014 the deep rename is workstream C of docs/runbooks/rebrand-ninjafy-migration.md and is out of scope here. That contract does NOT require NEW code to carry the old brand: artefacts created specifically for the rebrand take Ninjafy naming (ENG-8078 decision 9; see the CLAUDE.md rebrand carve-out). Either way it is a naming rule, not a flag concern \u2014 this key gates presentation, never an identifier. Set the stage-wide default to flip a whole environment, or add a feature_flag_overrides row to pilot a subset while everyone else still sees Augmented. Overrides resolve at FOUR grains, most specific first \u2014 agent, team, host, then org-wide (evaluate.ts:79-81); organization_id is always required, so there is no global override. Org and team are the useful pilot grains for THIS flag: there is now exactly ONE consumer \u2014 (dashboard)/layout.tsx via getPublicBooleanFlagServer \u2014 evaluating in the active-org cookie scope, so a host- or agent-scoped row is accepted by the table but never reached by the console. It resolves the key ONCE per request and passes the boolean down to sidebar.tsx and top-nav.tsx as a required prop. Resolution is SERVER-side deliberately: the client hook starts at its default and updates after an async GET /flags, so anything gated on it paints Augmented and then repaints. ENG-8858 moved the PALETTE for that reason (a full-page colour flash); ENG-9227 moved the WORDMARK, which had been the last surface still swapping after hydration. A consequence worth knowing: /login and the marketing routes stay on the Augmented palette whatever an org sets, because
|
|
38451
|
+
description: 'Present the product under the Ninjafy brand instead of Augmented Team (ENG-8250). This is the UMBRELLA brand gate, not a one-off nav toggle: every subsequent rebrand surface (page titles, email templates, marketing-facing copy) reads THIS key rather than adding its own flag, so the whole rebrand keeps a single kill switch. First surface is the left-hand nav wordmark \u2014 ON replaces the human+robot mark and the "augmented.team" text with italic lowercase "ninjafy"; OFF renders exactly what shipped before. Scope is the USER-FACING BRAND PRESENTATION \u2014 text AND VISUAL THEME. ENG-8858 widened this from text alone: the Ninjafy palette is gated here too, because a colour theme is not text. It stays ONE key rather than gaining a `ninjafy-theme` sibling, so a half-branded state \u2014 ninjafy wordmark over Augmented green \u2014 is unreachable and the rebrand keeps a single kill switch. It must never gate a code identifier, package name, env var or CLI name. EXISTING identifiers stay `Augmented`/`agt` per the CLAUDE.md naming contract, which protects them from premature renaming \u2014 the deep rename is workstream C of docs/runbooks/rebrand-ninjafy-migration.md and is out of scope here. That contract does NOT require NEW code to carry the old brand: artefacts created specifically for the rebrand take Ninjafy naming (ENG-8078 decision 9; see the CLAUDE.md rebrand carve-out). Either way it is a naming rule, not a flag concern \u2014 this key gates presentation, never an identifier. Set the stage-wide default to flip a whole environment, or add a feature_flag_overrides row to pilot a subset while everyone else still sees Augmented. Overrides resolve at FOUR grains, most specific first \u2014 agent, team, host, then org-wide (evaluate.ts:79-81); organization_id is always required, so there is no global override. Org and team are the useful pilot grains for THIS flag: there is now exactly ONE consumer \u2014 (dashboard)/layout.tsx via getPublicBooleanFlagServer \u2014 evaluating in the active-org cookie scope, so a host- or agent-scoped row is accepted by the table but never reached by the console. It resolves the key ONCE per request and passes the boolean down to sidebar.tsx and top-nav.tsx as a required prop. Resolution is SERVER-side deliberately: the client hook starts at its default and updates after an async GET /flags, so anything gated on it paints Augmented and then repaints. ENG-8858 moved the PALETTE for that reason (a full-page colour flash); ENG-9227 moved the WORDMARK, which had been the last surface still swapping after hydration. A consequence worth knowing: /login and the marketing routes stay on the Augmented palette whatever an org sets, because fetchPublicFlags returns null without a verified session and a pre-auth page has neither a session nor an active org \u2014 a PER-ORG flag structurally cannot brand one. ENG-9830 CORRECTS what used to be written here ("those surfaces follow only when the stage-wide default flips"): they do not follow it at all. Two reasons. The value returned on a null fetch is the CALL SITE\u2019s passed argument, not this registry default; and six such pages (/login, /reset-password, /auth/confirm, the pre-redeem member-signin gate and the two public Slack-install terminal pages) do not mount <BrandStamp/> AT ALL \u2014 deliberately, enumerated with per-page reasons in eng-9266-brand-stamp-coverage.test.ts. They become branded when the flag is REMOVED at cutover step 2 and the palette moves into bare :root, with no read left to gate it. NO LONGER DARK: ENG-9830 cutover step 1 flipped the default to true, so an org with no override now sees Ninjafy. The key survives only until cutover step 2 deletes it.',
|
|
38422
38452
|
flagType: "boolean",
|
|
38423
|
-
//
|
|
38424
|
-
//
|
|
38425
|
-
//
|
|
38426
|
-
// rebrand
|
|
38427
|
-
|
|
38453
|
+
// ENG-9830 (cutover step 1): flipped `false` -> `true`. The comment this
|
|
38454
|
+
// replaces argued `false` was the fail-closed direction — "never leak an
|
|
38455
|
+
// UNANNOUNCED rebrand to every customer at once". That was correct for as
|
|
38456
|
+
// long as the rebrand was unannounced. It is not any more: Ninjafy is the
|
|
38457
|
+
// live, announced brand (ENG-9613 reconciled the console onto the master
|
|
38458
|
+
// assets while the flag was already ON in production), so `false` now points
|
|
38459
|
+
// at the brand we no longer ship. A flags outage that reverted a customer to
|
|
38460
|
+
// Augmented would be the incident, not the safe harbour.
|
|
38461
|
+
//
|
|
38462
|
+
// The old rationale is recorded rather than deleted because it is a correct
|
|
38463
|
+
// argument whose PREMISE expired — reading the change without it looks like
|
|
38464
|
+
// someone overriding a deliberate fail-closed default.
|
|
38465
|
+
//
|
|
38466
|
+
// NOTE this value is only consulted by the API evaluator when building the
|
|
38467
|
+
// `GET /flags` map for an org with no override. It is NOT the fallback the
|
|
38468
|
+
// webapp uses on an outage: `getPublicBooleanFlagServer(key, defaultValue)`
|
|
38469
|
+
// returns its own PASSED argument when the fetch fails, so the call sites in
|
|
38470
|
+
// (dashboard)/layout.tsx and components/brand-stamp.tsx carry `true` too.
|
|
38471
|
+
// Flipping only one of the two leaves the cutover half-applied.
|
|
38472
|
+
defaultValue: true,
|
|
38428
38473
|
// ENG-9227: there are NO client readers of this key left. (dashboard)/
|
|
38429
38474
|
// layout.tsx resolves it ONCE server-side via getPublicBooleanFlagServer and
|
|
38430
38475
|
// passes the boolean down to sidebar.tsx and top-nav.tsx as a required prop.
|
|
38476
|
+
// "ONCE" is about the chrome, not the key: components/brand-stamp.tsx is a
|
|
38477
|
+
// SECOND, independent server read of `ninjafy-brand` (CodeRabbit, #5385).
|
|
38478
|
+
// Both are listed in the note above because both carry an outage fallback
|
|
38479
|
+
// that has to move together — reading this paragraph alone would leave you
|
|
38480
|
+
// updating one of the two.
|
|
38431
38481
|
// ENG-8858 did that for the THEME; ENG-9227 finished the job for the
|
|
38432
38482
|
// WORDMARK, which had kept usePublicBooleanFlag and so kept swapping
|
|
38433
38483
|
// "augmented.team" to "ninjafy" after hydration.
|
|
@@ -38449,24 +38499,38 @@ var FLAG_REGISTRY = [
|
|
|
38449
38499
|
},
|
|
38450
38500
|
{
|
|
38451
38501
|
key: "ninjafy-logo",
|
|
38452
|
-
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
|
|
38502
|
+
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 existed so candidate logo treatments could be put in front of a human and compared in the running console, rather than judged from a static export. That comparison has happened: ENG-9830 cutover step 1 chose TWO-TONE, so that is now the default and an unset flag renders it. NOTE this reverses the property this description used to claim \u2014 an unset flag was a no-op while the default was lockup (what ENG-9298 shipped), and that is deliberately given up at cutover: the default MOVING is the change. The key survives only until cutover step 2 hardcodes the chosen treatment and deletes it. lockup = mark and wordmark together, both in the brand blue \u2014 what ENG-9298 shipped. two-tone = the mark in brand blue with the wordmark in the neutral text colour (the treatment of the blue-icon/black-wordmark artwork); the chosen one. 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.",
|
|
38453
38503
|
flagType: "enum",
|
|
38454
38504
|
allowedValues: ["lockup", "two-tone", "wordmark"],
|
|
38455
|
-
//
|
|
38456
|
-
//
|
|
38457
|
-
//
|
|
38505
|
+
// ENG-9830 (cutover step 1): `lockup` -> `two-tone`. The treatments existed
|
|
38506
|
+
// so they could be compared in the running console rather than judged from a
|
|
38507
|
+
// static export (ENG-9365); that comparison has now happened and `two-tone`
|
|
38508
|
+
// — the mark in brand blue with the wordmark in the neutral text colour — is
|
|
38509
|
+
// the chosen treatment. It becomes the hardcoded one when this key is
|
|
38510
|
+
// removed at cutover step 2.
|
|
38511
|
+
//
|
|
38512
|
+
// The rule this value obeys is unchanged: this flag has no "off" direction,
|
|
38513
|
+
// so fail-safe means "the treatment currently in production", not the
|
|
38458
38514
|
// narrowest one. A flag-DB read error, an archived row, or a stored value
|
|
38459
38515
|
// outside allowedValues all resolve here (evaluate.ts normalizeFlagValue),
|
|
38460
|
-
// which is what makes an experimental value impossible to strand.
|
|
38461
|
-
|
|
38516
|
+
// which is what makes an experimental value impossible to strand. Only which
|
|
38517
|
+
// treatment holds that position has moved.
|
|
38518
|
+
//
|
|
38519
|
+
// Same split as ninjafy-brand above: this governs the API evaluation path
|
|
38520
|
+
// only. The webapp's outage fallback is the argument passed at the
|
|
38521
|
+
// (dashboard)/layout.tsx call site, which carries 'two-tone' to match.
|
|
38522
|
+
defaultValue: "two-tone",
|
|
38462
38523
|
// Same trap as ninjafy-brand, and it bites harder here because there are no
|
|
38463
38524
|
// client readers of this key AT ALL — it is server-resolved by construction.
|
|
38464
38525
|
// `public` does NOT mean "read by a browser"; it means "readable through the
|
|
38465
38526
|
// public map". getPublicEnumFlagServer resolves against the same GET /flags
|
|
38466
38527
|
// endpoint the browser uses, and that route filters to listPublicFlagKeys()
|
|
38467
38528
|
// (routes/flags.ts). Drop `public` and the key is simply absent from the map,
|
|
38468
|
-
// so the helper falls through to
|
|
38469
|
-
// the dropdown appearing to do nothing, with no error
|
|
38529
|
+
// so the helper falls through to the fallback passed at that call site and
|
|
38530
|
+
// returns it FOREVER — the dropdown appearing to do nothing, with no error
|
|
38531
|
+
// raised anywhere. Named as the call site rather than as a literal on
|
|
38532
|
+
// purpose: this comment said `lockup` for exactly as long as `lockup` was
|
|
38533
|
+
// the answer, and ENG-9830 flipping the winner is what made it a lie.
|
|
38470
38534
|
public: true
|
|
38471
38535
|
},
|
|
38472
38536
|
{
|
|
@@ -62,8 +62,8 @@ import {
|
|
|
62
62
|
writeDirectChatSessionState,
|
|
63
63
|
writeEgressAllowlist,
|
|
64
64
|
writePersistentClaudeWrapper
|
|
65
|
-
} from "./chunk-
|
|
66
|
-
import "./chunk-
|
|
65
|
+
} from "./chunk-WMJBXN6N.js";
|
|
66
|
+
import "./chunk-FZ6KIIYX.js";
|
|
67
67
|
import "./chunk-XWVM4KPK.js";
|
|
68
68
|
export {
|
|
69
69
|
CLAUDE_HOST_WIDE,
|
|
@@ -130,4 +130,4 @@ export {
|
|
|
130
130
|
writeEgressAllowlist,
|
|
131
131
|
writePersistentClaudeWrapper
|
|
132
132
|
};
|
|
133
|
-
//# sourceMappingURL=persistent-session-
|
|
133
|
+
//# sourceMappingURL=persistent-session-ARKZDYMX.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
paneLogPath
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
3
|
+
} from "./chunk-WMJBXN6N.js";
|
|
4
|
+
import "./chunk-FZ6KIIYX.js";
|
|
5
5
|
import "./chunk-XWVM4KPK.js";
|
|
6
6
|
|
|
7
7
|
// src/lib/responsiveness-probe.ts
|
|
@@ -764,4 +764,4 @@ export {
|
|
|
764
764
|
readAndResetSlackReplyBindingClassifications,
|
|
765
765
|
readAndResetSlackReplyTargetClassifications
|
|
766
766
|
};
|
|
767
|
-
//# sourceMappingURL=responsiveness-probe-
|
|
767
|
+
//# sourceMappingURL=responsiveness-probe-X2WXPIUI.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
sessionTranscriptDir
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-FZ6KIIYX.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-BLEV4AUJ.js.map
|