@integrity-labs/agt-cli 0.28.517 → 0.28.519
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 +4 -4
- package/dist/{chunk-P2WZKAPY.js → chunk-FRIAJDCT.js} +3 -3
- package/dist/{chunk-UQ3TQ7M4.js → chunk-XH3O62OZ.js} +78 -5
- package/dist/chunk-XH3O62OZ.js.map +1 -0
- package/dist/{claude-pair-runtime-FWD7QWAR.js → claude-pair-runtime-7SEXFLEZ.js} +2 -2
- package/dist/lib/manager-worker.js +10 -10
- package/dist/mcp/direct-chat-channel.js +77 -4
- package/dist/mcp/index.js +23 -1
- package/dist/mcp/origami.js +77 -4
- package/dist/mcp/slack-channel.js +77 -4
- package/dist/mcp/telegram-channel.js +77 -4
- package/dist/{persistent-session-3SY36KIU.js → persistent-session-U4GCKL6C.js} +2 -2
- package/dist/{responsiveness-probe-DSWGHXGG.js → responsiveness-probe-G2CAGG6M.js} +2 -2
- package/package.json +1 -1
- package/dist/chunk-UQ3TQ7M4.js.map +0 -1
- /package/dist/{chunk-P2WZKAPY.js.map → chunk-FRIAJDCT.js.map} +0 -0
- /package/dist/{claude-pair-runtime-FWD7QWAR.js.map → claude-pair-runtime-7SEXFLEZ.js.map} +0 -0
- /package/dist/{persistent-session-3SY36KIU.js.map → persistent-session-U4GCKL6C.js.map} +0 -0
- /package/dist/{responsiveness-probe-DSWGHXGG.js.map → responsiveness-probe-G2CAGG6M.js.map} +0 -0
|
@@ -100,7 +100,7 @@ async function spawnPairSession(session) {
|
|
|
100
100
|
return { ok: true };
|
|
101
101
|
} catch {
|
|
102
102
|
}
|
|
103
|
-
const { resolveClaudeBinary } = await import("./persistent-session-
|
|
103
|
+
const { resolveClaudeBinary } = await import("./persistent-session-U4GCKL6C.js");
|
|
104
104
|
const claudeBin = resolveClaudeBinary();
|
|
105
105
|
const pairEnv = {
|
|
106
106
|
...process.env,
|
|
@@ -373,4 +373,4 @@ export {
|
|
|
373
373
|
startClaudePair,
|
|
374
374
|
submitClaudePairCode
|
|
375
375
|
};
|
|
376
|
-
//# sourceMappingURL=claude-pair-runtime-
|
|
376
|
+
//# sourceMappingURL=claude-pair-runtime-7SEXFLEZ.js.map
|
|
@@ -53,7 +53,7 @@ import {
|
|
|
53
53
|
safeWriteJsonAtomic,
|
|
54
54
|
setConfigHash,
|
|
55
55
|
tripClass
|
|
56
|
-
} from "../chunk-
|
|
56
|
+
} from "../chunk-FRIAJDCT.js";
|
|
57
57
|
import {
|
|
58
58
|
getProjectDir as getProjectDir2,
|
|
59
59
|
getReadyTasks,
|
|
@@ -177,7 +177,7 @@ import {
|
|
|
177
177
|
toOpencodeModel,
|
|
178
178
|
transcriptActivityAgeSeconds,
|
|
179
179
|
writeEgressAllowlist
|
|
180
|
-
} from "../chunk-
|
|
180
|
+
} from "../chunk-XH3O62OZ.js";
|
|
181
181
|
import {
|
|
182
182
|
reapOrphanChannelMcps
|
|
183
183
|
} from "../chunk-XWVM4KPK.js";
|
|
@@ -10106,7 +10106,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
|
|
|
10106
10106
|
var lastVersionCheckAt = 0;
|
|
10107
10107
|
var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
|
|
10108
10108
|
var lastResponsivenessProbeAt = 0;
|
|
10109
|
-
var agtCliVersion = true ? "0.28.
|
|
10109
|
+
var agtCliVersion = true ? "0.28.519" : "dev";
|
|
10110
10110
|
function resolveBrewPath(execFileSync2) {
|
|
10111
10111
|
try {
|
|
10112
10112
|
const out = execFileSync2("which", ["brew"], { timeout: 5e3 }).toString().trim();
|
|
@@ -11314,7 +11314,7 @@ function flushRestartedAgentDiagnostics(hostId, codeNames) {
|
|
|
11314
11314
|
if (codeNames.length === 0) return;
|
|
11315
11315
|
void (async () => {
|
|
11316
11316
|
try {
|
|
11317
|
-
const { collectDiagnostics } = await import("../persistent-session-
|
|
11317
|
+
const { collectDiagnostics } = await import("../persistent-session-U4GCKL6C.js");
|
|
11318
11318
|
await api.post("/host/heartbeat", {
|
|
11319
11319
|
host_id: hostId,
|
|
11320
11320
|
agent_diagnostics: collectDiagnostics(codeNames, quarantineEntriesFor, claudeMdSizeFor)
|
|
@@ -11421,7 +11421,7 @@ async function pollCycle() {
|
|
|
11421
11421
|
}
|
|
11422
11422
|
try {
|
|
11423
11423
|
const { detectHostSecurity } = await import("../host-security-6PDFG7F5.js");
|
|
11424
|
-
const { collectDiagnostics } = await import("../persistent-session-
|
|
11424
|
+
const { collectDiagnostics } = await import("../persistent-session-U4GCKL6C.js");
|
|
11425
11425
|
const diagCodeNames = [...agentState.persistentSessionAgents];
|
|
11426
11426
|
const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames, quarantineEntriesFor, claudeMdSizeFor) : void 0;
|
|
11427
11427
|
let tailscaleHostname;
|
|
@@ -11536,7 +11536,7 @@ async function pollCycle() {
|
|
|
11536
11536
|
collectResponsivenessProbes,
|
|
11537
11537
|
collectPanelessActivityProbes,
|
|
11538
11538
|
getResponsivenessIntervalMs
|
|
11539
|
-
} = await import("../responsiveness-probe-
|
|
11539
|
+
} = await import("../responsiveness-probe-G2CAGG6M.js");
|
|
11540
11540
|
const probeIntervalMs = getResponsivenessIntervalMs();
|
|
11541
11541
|
if (now - lastResponsivenessProbeAt > probeIntervalMs) {
|
|
11542
11542
|
const probeCodeNames = [...agentState.persistentSessionAgents];
|
|
@@ -11600,7 +11600,7 @@ async function pollCycle() {
|
|
|
11600
11600
|
collectResponsivenessProbes,
|
|
11601
11601
|
livePendingInboundOldestAgeSeconds,
|
|
11602
11602
|
parkPendingInbound
|
|
11603
|
-
} = await import("../responsiveness-probe-
|
|
11603
|
+
} = await import("../responsiveness-probe-G2CAGG6M.js");
|
|
11604
11604
|
const { getProjectDir: wedgeProjectDir } = await import("../scheduler-engine-NDP36U7O.js");
|
|
11605
11605
|
const wedgeNow = /* @__PURE__ */ new Date();
|
|
11606
11606
|
const liveAgents = agentState.persistentSessionAgents;
|
|
@@ -15108,7 +15108,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
|
|
|
15108
15108
|
void api.post("/host/restart-ack", { host_id: hostId, agent_id: agentId, restart_requested_at: requestedAt }).catch((err) => log(`[restart-lane] ack failed for '${codeName}': ${err.message}`));
|
|
15109
15109
|
void (async () => {
|
|
15110
15110
|
try {
|
|
15111
|
-
const { collectDiagnostics } = await import("../persistent-session-
|
|
15111
|
+
const { collectDiagnostics } = await import("../persistent-session-U4GCKL6C.js");
|
|
15112
15112
|
await api.post("/host/heartbeat", {
|
|
15113
15113
|
host_id: hostId,
|
|
15114
15114
|
agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor)
|
|
@@ -15158,7 +15158,7 @@ async function respawnAgentAfterMcpStop(codeName, reason) {
|
|
|
15158
15158
|
}
|
|
15159
15159
|
try {
|
|
15160
15160
|
const hostId = await getHostId();
|
|
15161
|
-
const { collectDiagnostics } = await import("../persistent-session-
|
|
15161
|
+
const { collectDiagnostics } = await import("../persistent-session-U4GCKL6C.js");
|
|
15162
15162
|
await api.post("/host/heartbeat", {
|
|
15163
15163
|
host_id: hostId,
|
|
15164
15164
|
agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor)
|
|
@@ -15676,7 +15676,7 @@ async function processClaudePairSessions(agents) {
|
|
|
15676
15676
|
killPairSession,
|
|
15677
15677
|
pairTmuxSession,
|
|
15678
15678
|
finalizeClaudePairOnboarding
|
|
15679
|
-
} = await import("../claude-pair-runtime-
|
|
15679
|
+
} = await import("../claude-pair-runtime-7SEXFLEZ.js");
|
|
15680
15680
|
for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
|
|
15681
15681
|
log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
|
|
15682
15682
|
const killed = await killPairSession(pairTmuxSession(pairId));
|
|
@@ -32303,11 +32303,60 @@ var MARKUP_BRIDGE_SCRIPT = `<script>(function(){
|
|
|
32303
32303
|
e.preventDefault(); e.stopPropagation(); startEditTextNode(tn, el);
|
|
32304
32304
|
}
|
|
32305
32305
|
}, true);
|
|
32306
|
-
|
|
32306
|
+
// ENG-8500: while the inline editor is focused, the artefact's OWN keyboard
|
|
32307
|
+
// handlers must not see the keystroke.
|
|
32308
|
+
//
|
|
32309
|
+
// Decks ship as a single self-contained file with their own slide navigation
|
|
32310
|
+
// bound to space and the arrow keys, and that script is agent-authored content
|
|
32311
|
+
// we neither control nor can retro-patch - the published object is immutable,
|
|
32312
|
+
// so every deck already out there has its handler baked in. It also runs FIRST:
|
|
32313
|
+
// the bridge is appended after the artefact HTML (frame.srcdoc = html +
|
|
32314
|
+
// MARKUP_BRIDGE in publisher.ts), so the deck registers its listener before we
|
|
32315
|
+
// register ours.
|
|
32316
|
+
//
|
|
32317
|
+
// The consequence was not a keyboard annoyance, it was silent data corruption.
|
|
32318
|
+
// The deck's handler called preventDefault() on space, so the spaces a viewer
|
|
32319
|
+
// typed never reached the editor and words concatenated -
|
|
32320
|
+
// "albreakevenreached in June 2026" - with Save sitting right there. In English
|
|
32321
|
+
// prose a reader might catch it; in a number, a product name or a URL they
|
|
32322
|
+
// would not.
|
|
32323
|
+
//
|
|
32324
|
+
// Registration order cannot be won, so win on PHASE instead. The capture path
|
|
32325
|
+
// is window -> document -> ... -> target, so a capture listener on the window object
|
|
32326
|
+
// fires before any document-level or bubble-phase listener no matter when it
|
|
32327
|
+
// was registered. stopImmediatePropagation() then keeps the event from ever
|
|
32328
|
+
// reaching the deck.
|
|
32329
|
+
//
|
|
32330
|
+
// The one case this does not beat is an artefact that itself registers on
|
|
32331
|
+
// the window object with capture BEFORE the bridge loads. Deck templates use
|
|
32332
|
+
// document.addEventListener for keydown, so that is theoretical rather
|
|
32333
|
+
// than observed - but it is a real limit and worth knowing before someone
|
|
32334
|
+
// assumes this is airtight.
|
|
32335
|
+
//
|
|
32336
|
+
// Note what is deliberately NOT called for ordinary keys: preventDefault(). The
|
|
32337
|
+
// whole point is that space, arrows, Home/End and PageUp/PageDown do their
|
|
32338
|
+
// normal text-editing work. We suppress the artefact, not the browser.
|
|
32339
|
+
window.addEventListener('keydown', function(e){
|
|
32340
|
+
// Not editing: the artefact keeps its keyboard entirely. Slide navigation
|
|
32341
|
+
// must behave exactly as it does today (ENG-8500 AC2).
|
|
32307
32342
|
if(!editing) return;
|
|
32308
|
-
|
|
32309
|
-
|
|
32310
|
-
|
|
32343
|
+
// Editing, but the keystroke is going somewhere else (the viewer clicked
|
|
32344
|
+
// away, or is in the shell's own UI). Not ours to swallow.
|
|
32345
|
+
var t=e.target;
|
|
32346
|
+
var inEditor = t===editing || (editing.contains && t && t.nodeType && editing.contains(t));
|
|
32347
|
+
if(!inEditor) return;
|
|
32348
|
+
|
|
32349
|
+
// Escape cancels the edit; Enter commits. Both are deliberate terminal
|
|
32350
|
+
// actions rather than text input, so they DO preventDefault - Enter must not
|
|
32351
|
+
// also insert a newline into the field it is closing. Shift+Enter is left
|
|
32352
|
+
// alone as a genuine newline.
|
|
32353
|
+
if(e.key==='Escape'){ e.preventDefault(); e.stopImmediatePropagation(); endEdit(false); return; }
|
|
32354
|
+
if(e.key==='Enter' && !e.shiftKey){ e.preventDefault(); e.stopImmediatePropagation(); endEdit(true); return; }
|
|
32355
|
+
|
|
32356
|
+
// Everything else: let the browser handle it as text input, and stop the
|
|
32357
|
+
// artefact's own handlers from seeing it at all.
|
|
32358
|
+
e.stopImmediatePropagation();
|
|
32359
|
+
}, true);
|
|
32311
32360
|
|
|
32312
32361
|
document.addEventListener('mouseup', function(){
|
|
32313
32362
|
if(editing) return; // a selection inside the editor is for the cursor, not a comment
|
|
@@ -35550,6 +35599,30 @@ var FLAG_REGISTRY = [
|
|
|
35550
35599
|
// must never be serialized into the browser map.
|
|
35551
35600
|
defaultValue: false
|
|
35552
35601
|
},
|
|
35602
|
+
{
|
|
35603
|
+
key: "agent-unified-screen",
|
|
35604
|
+
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). Ships dark.',
|
|
35605
|
+
flagType: "boolean",
|
|
35606
|
+
// Declared safe value is `false` = the current view/edit pages. A flag-DB read
|
|
35607
|
+
// error must fall back to what ships today, never a half-built redesign.
|
|
35608
|
+
defaultValue: false,
|
|
35609
|
+
// Read CLIENT-SIDE by the agent screen ("use client") via usePublicBooleanFlag,
|
|
35610
|
+
// so the key must be in the browser-exposed public map. Additive viewer gate,
|
|
35611
|
+
// resolved within the active-org cookie's scope — not sensitive.
|
|
35612
|
+
public: true
|
|
35613
|
+
},
|
|
35614
|
+
{
|
|
35615
|
+
key: "app-top-nav-shell",
|
|
35616
|
+
description: "Global top-navigation shell redesign (ENG-8478 epic / ENG-8486). When ON, the dashboard chrome replaces the left sidebar with a top navigation bar (team switcher \xB7 destinations \xB7 command palette + account) so the left side is free for an agent-scoped rail; when OFF, the existing left sidebar is unchanged. Additive layout gate \u2014 no data-model change. Composes independently with agent-unified-screen (the two flags are reconciled in ENG-8488). Ships dark.",
|
|
35617
|
+
flagType: "boolean",
|
|
35618
|
+
// Declared safe value is `false` = the current left sidebar. Fail-closed to the
|
|
35619
|
+
// shell that ships today if the flag DB is unreachable.
|
|
35620
|
+
defaultValue: false,
|
|
35621
|
+
// Read CLIENT-SIDE by the dashboard layout + sidebar ("use client") via
|
|
35622
|
+
// usePublicBooleanFlag, so the key must be in the browser-exposed public map.
|
|
35623
|
+
// Additive layout gate — not sensitive.
|
|
35624
|
+
public: true
|
|
35625
|
+
},
|
|
35553
35626
|
{
|
|
35554
35627
|
key: "ninjafy-brand",
|
|
35555
35628
|
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 USER-FACING BRAND TEXT ONLY: it must never gate a code identifier, package name, env var or CLI name, which stay `Augmented`/`agt` per the CLAUDE.md naming contract (the deep code rename is workstream C of docs/runbooks/rebrand-ninjafy-migration.md and is out of scope here). Set the stage-wide default to flip a whole environment, or add a feature_flag_overrides row to pilot one organization while every other org still sees Augmented. Ships dark.',
|
package/dist/mcp/index.js
CHANGED
|
@@ -21773,7 +21773,29 @@ function scopeFooter(scope) {
|
|
|
21773
21773
|
const visible = scope?.teams_visible;
|
|
21774
21774
|
const total = scope?.teams_in_org;
|
|
21775
21775
|
const teams = typeof visible === "number" && typeof total === "number" ? ` (${visible} of ${total} team${total === 1 ? "" : "s"} visible to you)` : "";
|
|
21776
|
-
return `Scope: ${org} only${teams}. Other organizations are not searchable from here, so one match is not proof it is the only one, and no match is not proof there is none
|
|
21776
|
+
return `Scope: ${org} only${teams}. Other organizations are not searchable from here, so one match is not proof it is the only one, and no match is not proof there is none.` + (peopleExclusionNote(scope) ?? "");
|
|
21777
|
+
}
|
|
21778
|
+
function peopleExclusionNote(scope) {
|
|
21779
|
+
const excluded = scope?.people_excluded;
|
|
21780
|
+
if (typeof excluded !== "number" || excluded <= 0) return null;
|
|
21781
|
+
const by = scope?.people_excluded_by_reason ?? {};
|
|
21782
|
+
const parts = [];
|
|
21783
|
+
const unlinked = by.no_platform_account;
|
|
21784
|
+
if (typeof unlinked === "number" && unlinked > 0) {
|
|
21785
|
+
parts.push(`${unlinked} with no linked console account`);
|
|
21786
|
+
}
|
|
21787
|
+
const infra = by.host_runtime_user;
|
|
21788
|
+
if (typeof infra === "number" && infra > 0) {
|
|
21789
|
+
parts.push(`${infra} infrastructure account${infra === 1 ? "" : "s"}`);
|
|
21790
|
+
}
|
|
21791
|
+
const noEmail = by.no_email;
|
|
21792
|
+
if (typeof noEmail === "number" && noEmail > 0) {
|
|
21793
|
+
parts.push(`${noEmail} with no email on record`);
|
|
21794
|
+
}
|
|
21795
|
+
const because = parts.length > 0 ? ` (${parts.join(", ")})` : "";
|
|
21796
|
+
return `
|
|
21797
|
+
|
|
21798
|
+
Note: ${excluded} more ${excluded === 1 ? "person is" : "people are"} in this organization but not listed above${because}. The people list is FILTERED, not complete - do not conclude someone does not exist because they are absent from it. If you needed a Slack id to address a card and found none, that is very likely why; ask a human rather than parking the card on nobody.`;
|
|
21777
21799
|
}
|
|
21778
21800
|
function formatDirectoryResult(data, query, slackUserId) {
|
|
21779
21801
|
const agents = data.agents ?? [];
|
package/dist/mcp/origami.js
CHANGED
|
@@ -38641,11 +38641,60 @@ var MARKUP_BRIDGE_SCRIPT = `<script>(function(){
|
|
|
38641
38641
|
e.preventDefault(); e.stopPropagation(); startEditTextNode(tn, el);
|
|
38642
38642
|
}
|
|
38643
38643
|
}, true);
|
|
38644
|
-
|
|
38644
|
+
// ENG-8500: while the inline editor is focused, the artefact's OWN keyboard
|
|
38645
|
+
// handlers must not see the keystroke.
|
|
38646
|
+
//
|
|
38647
|
+
// Decks ship as a single self-contained file with their own slide navigation
|
|
38648
|
+
// bound to space and the arrow keys, and that script is agent-authored content
|
|
38649
|
+
// we neither control nor can retro-patch - the published object is immutable,
|
|
38650
|
+
// so every deck already out there has its handler baked in. It also runs FIRST:
|
|
38651
|
+
// the bridge is appended after the artefact HTML (frame.srcdoc = html +
|
|
38652
|
+
// MARKUP_BRIDGE in publisher.ts), so the deck registers its listener before we
|
|
38653
|
+
// register ours.
|
|
38654
|
+
//
|
|
38655
|
+
// The consequence was not a keyboard annoyance, it was silent data corruption.
|
|
38656
|
+
// The deck's handler called preventDefault() on space, so the spaces a viewer
|
|
38657
|
+
// typed never reached the editor and words concatenated -
|
|
38658
|
+
// "albreakevenreached in June 2026" - with Save sitting right there. In English
|
|
38659
|
+
// prose a reader might catch it; in a number, a product name or a URL they
|
|
38660
|
+
// would not.
|
|
38661
|
+
//
|
|
38662
|
+
// Registration order cannot be won, so win on PHASE instead. The capture path
|
|
38663
|
+
// is window -> document -> ... -> target, so a capture listener on the window object
|
|
38664
|
+
// fires before any document-level or bubble-phase listener no matter when it
|
|
38665
|
+
// was registered. stopImmediatePropagation() then keeps the event from ever
|
|
38666
|
+
// reaching the deck.
|
|
38667
|
+
//
|
|
38668
|
+
// The one case this does not beat is an artefact that itself registers on
|
|
38669
|
+
// the window object with capture BEFORE the bridge loads. Deck templates use
|
|
38670
|
+
// document.addEventListener for keydown, so that is theoretical rather
|
|
38671
|
+
// than observed - but it is a real limit and worth knowing before someone
|
|
38672
|
+
// assumes this is airtight.
|
|
38673
|
+
//
|
|
38674
|
+
// Note what is deliberately NOT called for ordinary keys: preventDefault(). The
|
|
38675
|
+
// whole point is that space, arrows, Home/End and PageUp/PageDown do their
|
|
38676
|
+
// normal text-editing work. We suppress the artefact, not the browser.
|
|
38677
|
+
window.addEventListener('keydown', function(e){
|
|
38678
|
+
// Not editing: the artefact keeps its keyboard entirely. Slide navigation
|
|
38679
|
+
// must behave exactly as it does today (ENG-8500 AC2).
|
|
38645
38680
|
if(!editing) return;
|
|
38646
|
-
|
|
38647
|
-
|
|
38648
|
-
|
|
38681
|
+
// Editing, but the keystroke is going somewhere else (the viewer clicked
|
|
38682
|
+
// away, or is in the shell's own UI). Not ours to swallow.
|
|
38683
|
+
var t=e.target;
|
|
38684
|
+
var inEditor = t===editing || (editing.contains && t && t.nodeType && editing.contains(t));
|
|
38685
|
+
if(!inEditor) return;
|
|
38686
|
+
|
|
38687
|
+
// Escape cancels the edit; Enter commits. Both are deliberate terminal
|
|
38688
|
+
// actions rather than text input, so they DO preventDefault - Enter must not
|
|
38689
|
+
// also insert a newline into the field it is closing. Shift+Enter is left
|
|
38690
|
+
// alone as a genuine newline.
|
|
38691
|
+
if(e.key==='Escape'){ e.preventDefault(); e.stopImmediatePropagation(); endEdit(false); return; }
|
|
38692
|
+
if(e.key==='Enter' && !e.shiftKey){ e.preventDefault(); e.stopImmediatePropagation(); endEdit(true); return; }
|
|
38693
|
+
|
|
38694
|
+
// Everything else: let the browser handle it as text input, and stop the
|
|
38695
|
+
// artefact's own handlers from seeing it at all.
|
|
38696
|
+
e.stopImmediatePropagation();
|
|
38697
|
+
}, true);
|
|
38649
38698
|
|
|
38650
38699
|
document.addEventListener('mouseup', function(){
|
|
38651
38700
|
if(editing) return; // a selection inside the editor is for the cursor, not a comment
|
|
@@ -41452,6 +41501,30 @@ var FLAG_REGISTRY = [
|
|
|
41452
41501
|
// must never be serialized into the browser map.
|
|
41453
41502
|
defaultValue: false
|
|
41454
41503
|
},
|
|
41504
|
+
{
|
|
41505
|
+
key: "agent-unified-screen",
|
|
41506
|
+
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). Ships dark.',
|
|
41507
|
+
flagType: "boolean",
|
|
41508
|
+
// Declared safe value is `false` = the current view/edit pages. A flag-DB read
|
|
41509
|
+
// error must fall back to what ships today, never a half-built redesign.
|
|
41510
|
+
defaultValue: false,
|
|
41511
|
+
// Read CLIENT-SIDE by the agent screen ("use client") via usePublicBooleanFlag,
|
|
41512
|
+
// so the key must be in the browser-exposed public map. Additive viewer gate,
|
|
41513
|
+
// resolved within the active-org cookie's scope — not sensitive.
|
|
41514
|
+
public: true
|
|
41515
|
+
},
|
|
41516
|
+
{
|
|
41517
|
+
key: "app-top-nav-shell",
|
|
41518
|
+
description: "Global top-navigation shell redesign (ENG-8478 epic / ENG-8486). When ON, the dashboard chrome replaces the left sidebar with a top navigation bar (team switcher \xB7 destinations \xB7 command palette + account) so the left side is free for an agent-scoped rail; when OFF, the existing left sidebar is unchanged. Additive layout gate \u2014 no data-model change. Composes independently with agent-unified-screen (the two flags are reconciled in ENG-8488). Ships dark.",
|
|
41519
|
+
flagType: "boolean",
|
|
41520
|
+
// Declared safe value is `false` = the current left sidebar. Fail-closed to the
|
|
41521
|
+
// shell that ships today if the flag DB is unreachable.
|
|
41522
|
+
defaultValue: false,
|
|
41523
|
+
// Read CLIENT-SIDE by the dashboard layout + sidebar ("use client") via
|
|
41524
|
+
// usePublicBooleanFlag, so the key must be in the browser-exposed public map.
|
|
41525
|
+
// Additive layout gate — not sensitive.
|
|
41526
|
+
public: true
|
|
41527
|
+
},
|
|
41455
41528
|
{
|
|
41456
41529
|
key: "ninjafy-brand",
|
|
41457
41530
|
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 USER-FACING BRAND TEXT ONLY: it must never gate a code identifier, package name, env var or CLI name, which stay `Augmented`/`agt` per the CLAUDE.md naming contract (the deep code rename is workstream C of docs/runbooks/rebrand-ninjafy-migration.md and is out of scope here). Set the stage-wide default to flip a whole environment, or add a feature_flag_overrides row to pilot one organization while every other org still sees Augmented. Ships dark.',
|
|
@@ -32525,11 +32525,60 @@ var MARKUP_BRIDGE_SCRIPT = `<script>(function(){
|
|
|
32525
32525
|
e.preventDefault(); e.stopPropagation(); startEditTextNode(tn, el);
|
|
32526
32526
|
}
|
|
32527
32527
|
}, true);
|
|
32528
|
-
|
|
32528
|
+
// ENG-8500: while the inline editor is focused, the artefact's OWN keyboard
|
|
32529
|
+
// handlers must not see the keystroke.
|
|
32530
|
+
//
|
|
32531
|
+
// Decks ship as a single self-contained file with their own slide navigation
|
|
32532
|
+
// bound to space and the arrow keys, and that script is agent-authored content
|
|
32533
|
+
// we neither control nor can retro-patch - the published object is immutable,
|
|
32534
|
+
// so every deck already out there has its handler baked in. It also runs FIRST:
|
|
32535
|
+
// the bridge is appended after the artefact HTML (frame.srcdoc = html +
|
|
32536
|
+
// MARKUP_BRIDGE in publisher.ts), so the deck registers its listener before we
|
|
32537
|
+
// register ours.
|
|
32538
|
+
//
|
|
32539
|
+
// The consequence was not a keyboard annoyance, it was silent data corruption.
|
|
32540
|
+
// The deck's handler called preventDefault() on space, so the spaces a viewer
|
|
32541
|
+
// typed never reached the editor and words concatenated -
|
|
32542
|
+
// "albreakevenreached in June 2026" - with Save sitting right there. In English
|
|
32543
|
+
// prose a reader might catch it; in a number, a product name or a URL they
|
|
32544
|
+
// would not.
|
|
32545
|
+
//
|
|
32546
|
+
// Registration order cannot be won, so win on PHASE instead. The capture path
|
|
32547
|
+
// is window -> document -> ... -> target, so a capture listener on the window object
|
|
32548
|
+
// fires before any document-level or bubble-phase listener no matter when it
|
|
32549
|
+
// was registered. stopImmediatePropagation() then keeps the event from ever
|
|
32550
|
+
// reaching the deck.
|
|
32551
|
+
//
|
|
32552
|
+
// The one case this does not beat is an artefact that itself registers on
|
|
32553
|
+
// the window object with capture BEFORE the bridge loads. Deck templates use
|
|
32554
|
+
// document.addEventListener for keydown, so that is theoretical rather
|
|
32555
|
+
// than observed - but it is a real limit and worth knowing before someone
|
|
32556
|
+
// assumes this is airtight.
|
|
32557
|
+
//
|
|
32558
|
+
// Note what is deliberately NOT called for ordinary keys: preventDefault(). The
|
|
32559
|
+
// whole point is that space, arrows, Home/End and PageUp/PageDown do their
|
|
32560
|
+
// normal text-editing work. We suppress the artefact, not the browser.
|
|
32561
|
+
window.addEventListener('keydown', function(e){
|
|
32562
|
+
// Not editing: the artefact keeps its keyboard entirely. Slide navigation
|
|
32563
|
+
// must behave exactly as it does today (ENG-8500 AC2).
|
|
32529
32564
|
if(!editing) return;
|
|
32530
|
-
|
|
32531
|
-
|
|
32532
|
-
|
|
32565
|
+
// Editing, but the keystroke is going somewhere else (the viewer clicked
|
|
32566
|
+
// away, or is in the shell's own UI). Not ours to swallow.
|
|
32567
|
+
var t=e.target;
|
|
32568
|
+
var inEditor = t===editing || (editing.contains && t && t.nodeType && editing.contains(t));
|
|
32569
|
+
if(!inEditor) return;
|
|
32570
|
+
|
|
32571
|
+
// Escape cancels the edit; Enter commits. Both are deliberate terminal
|
|
32572
|
+
// actions rather than text input, so they DO preventDefault - Enter must not
|
|
32573
|
+
// also insert a newline into the field it is closing. Shift+Enter is left
|
|
32574
|
+
// alone as a genuine newline.
|
|
32575
|
+
if(e.key==='Escape'){ e.preventDefault(); e.stopImmediatePropagation(); endEdit(false); return; }
|
|
32576
|
+
if(e.key==='Enter' && !e.shiftKey){ e.preventDefault(); e.stopImmediatePropagation(); endEdit(true); return; }
|
|
32577
|
+
|
|
32578
|
+
// Everything else: let the browser handle it as text input, and stop the
|
|
32579
|
+
// artefact's own handlers from seeing it at all.
|
|
32580
|
+
e.stopImmediatePropagation();
|
|
32581
|
+
}, true);
|
|
32533
32582
|
|
|
32534
32583
|
document.addEventListener('mouseup', function(){
|
|
32535
32584
|
if(editing) return; // a selection inside the editor is for the cursor, not a comment
|
|
@@ -35719,6 +35768,30 @@ var FLAG_REGISTRY = [
|
|
|
35719
35768
|
// must never be serialized into the browser map.
|
|
35720
35769
|
defaultValue: false
|
|
35721
35770
|
},
|
|
35771
|
+
{
|
|
35772
|
+
key: "agent-unified-screen",
|
|
35773
|
+
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). Ships dark.',
|
|
35774
|
+
flagType: "boolean",
|
|
35775
|
+
// Declared safe value is `false` = the current view/edit pages. A flag-DB read
|
|
35776
|
+
// error must fall back to what ships today, never a half-built redesign.
|
|
35777
|
+
defaultValue: false,
|
|
35778
|
+
// Read CLIENT-SIDE by the agent screen ("use client") via usePublicBooleanFlag,
|
|
35779
|
+
// so the key must be in the browser-exposed public map. Additive viewer gate,
|
|
35780
|
+
// resolved within the active-org cookie's scope — not sensitive.
|
|
35781
|
+
public: true
|
|
35782
|
+
},
|
|
35783
|
+
{
|
|
35784
|
+
key: "app-top-nav-shell",
|
|
35785
|
+
description: "Global top-navigation shell redesign (ENG-8478 epic / ENG-8486). When ON, the dashboard chrome replaces the left sidebar with a top navigation bar (team switcher \xB7 destinations \xB7 command palette + account) so the left side is free for an agent-scoped rail; when OFF, the existing left sidebar is unchanged. Additive layout gate \u2014 no data-model change. Composes independently with agent-unified-screen (the two flags are reconciled in ENG-8488). Ships dark.",
|
|
35786
|
+
flagType: "boolean",
|
|
35787
|
+
// Declared safe value is `false` = the current left sidebar. Fail-closed to the
|
|
35788
|
+
// shell that ships today if the flag DB is unreachable.
|
|
35789
|
+
defaultValue: false,
|
|
35790
|
+
// Read CLIENT-SIDE by the dashboard layout + sidebar ("use client") via
|
|
35791
|
+
// usePublicBooleanFlag, so the key must be in the browser-exposed public map.
|
|
35792
|
+
// Additive layout gate — not sensitive.
|
|
35793
|
+
public: true
|
|
35794
|
+
},
|
|
35722
35795
|
{
|
|
35723
35796
|
key: "ninjafy-brand",
|
|
35724
35797
|
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 USER-FACING BRAND TEXT ONLY: it must never gate a code identifier, package name, env var or CLI name, which stay `Augmented`/`agt` per the CLAUDE.md naming contract (the deep code rename is workstream C of docs/runbooks/rebrand-ninjafy-migration.md and is out of scope here). Set the stage-wide default to flip a whole environment, or add a feature_flag_overrides row to pilot one organization while every other org still sees Augmented. Ships dark.',
|
|
@@ -32851,11 +32851,60 @@ var MARKUP_BRIDGE_SCRIPT = `<script>(function(){
|
|
|
32851
32851
|
e.preventDefault(); e.stopPropagation(); startEditTextNode(tn, el);
|
|
32852
32852
|
}
|
|
32853
32853
|
}, true);
|
|
32854
|
-
|
|
32854
|
+
// ENG-8500: while the inline editor is focused, the artefact's OWN keyboard
|
|
32855
|
+
// handlers must not see the keystroke.
|
|
32856
|
+
//
|
|
32857
|
+
// Decks ship as a single self-contained file with their own slide navigation
|
|
32858
|
+
// bound to space and the arrow keys, and that script is agent-authored content
|
|
32859
|
+
// we neither control nor can retro-patch - the published object is immutable,
|
|
32860
|
+
// so every deck already out there has its handler baked in. It also runs FIRST:
|
|
32861
|
+
// the bridge is appended after the artefact HTML (frame.srcdoc = html +
|
|
32862
|
+
// MARKUP_BRIDGE in publisher.ts), so the deck registers its listener before we
|
|
32863
|
+
// register ours.
|
|
32864
|
+
//
|
|
32865
|
+
// The consequence was not a keyboard annoyance, it was silent data corruption.
|
|
32866
|
+
// The deck's handler called preventDefault() on space, so the spaces a viewer
|
|
32867
|
+
// typed never reached the editor and words concatenated -
|
|
32868
|
+
// "albreakevenreached in June 2026" - with Save sitting right there. In English
|
|
32869
|
+
// prose a reader might catch it; in a number, a product name or a URL they
|
|
32870
|
+
// would not.
|
|
32871
|
+
//
|
|
32872
|
+
// Registration order cannot be won, so win on PHASE instead. The capture path
|
|
32873
|
+
// is window -> document -> ... -> target, so a capture listener on the window object
|
|
32874
|
+
// fires before any document-level or bubble-phase listener no matter when it
|
|
32875
|
+
// was registered. stopImmediatePropagation() then keeps the event from ever
|
|
32876
|
+
// reaching the deck.
|
|
32877
|
+
//
|
|
32878
|
+
// The one case this does not beat is an artefact that itself registers on
|
|
32879
|
+
// the window object with capture BEFORE the bridge loads. Deck templates use
|
|
32880
|
+
// document.addEventListener for keydown, so that is theoretical rather
|
|
32881
|
+
// than observed - but it is a real limit and worth knowing before someone
|
|
32882
|
+
// assumes this is airtight.
|
|
32883
|
+
//
|
|
32884
|
+
// Note what is deliberately NOT called for ordinary keys: preventDefault(). The
|
|
32885
|
+
// whole point is that space, arrows, Home/End and PageUp/PageDown do their
|
|
32886
|
+
// normal text-editing work. We suppress the artefact, not the browser.
|
|
32887
|
+
window.addEventListener('keydown', function(e){
|
|
32888
|
+
// Not editing: the artefact keeps its keyboard entirely. Slide navigation
|
|
32889
|
+
// must behave exactly as it does today (ENG-8500 AC2).
|
|
32855
32890
|
if(!editing) return;
|
|
32856
|
-
|
|
32857
|
-
|
|
32858
|
-
|
|
32891
|
+
// Editing, but the keystroke is going somewhere else (the viewer clicked
|
|
32892
|
+
// away, or is in the shell's own UI). Not ours to swallow.
|
|
32893
|
+
var t=e.target;
|
|
32894
|
+
var inEditor = t===editing || (editing.contains && t && t.nodeType && editing.contains(t));
|
|
32895
|
+
if(!inEditor) return;
|
|
32896
|
+
|
|
32897
|
+
// Escape cancels the edit; Enter commits. Both are deliberate terminal
|
|
32898
|
+
// actions rather than text input, so they DO preventDefault - Enter must not
|
|
32899
|
+
// also insert a newline into the field it is closing. Shift+Enter is left
|
|
32900
|
+
// alone as a genuine newline.
|
|
32901
|
+
if(e.key==='Escape'){ e.preventDefault(); e.stopImmediatePropagation(); endEdit(false); return; }
|
|
32902
|
+
if(e.key==='Enter' && !e.shiftKey){ e.preventDefault(); e.stopImmediatePropagation(); endEdit(true); return; }
|
|
32903
|
+
|
|
32904
|
+
// Everything else: let the browser handle it as text input, and stop the
|
|
32905
|
+
// artefact's own handlers from seeing it at all.
|
|
32906
|
+
e.stopImmediatePropagation();
|
|
32907
|
+
}, true);
|
|
32859
32908
|
|
|
32860
32909
|
document.addEventListener('mouseup', function(){
|
|
32861
32910
|
if(editing) return; // a selection inside the editor is for the cursor, not a comment
|
|
@@ -36045,6 +36094,30 @@ var FLAG_REGISTRY = [
|
|
|
36045
36094
|
// must never be serialized into the browser map.
|
|
36046
36095
|
defaultValue: false
|
|
36047
36096
|
},
|
|
36097
|
+
{
|
|
36098
|
+
key: "agent-unified-screen",
|
|
36099
|
+
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). Ships dark.',
|
|
36100
|
+
flagType: "boolean",
|
|
36101
|
+
// Declared safe value is `false` = the current view/edit pages. A flag-DB read
|
|
36102
|
+
// error must fall back to what ships today, never a half-built redesign.
|
|
36103
|
+
defaultValue: false,
|
|
36104
|
+
// Read CLIENT-SIDE by the agent screen ("use client") via usePublicBooleanFlag,
|
|
36105
|
+
// so the key must be in the browser-exposed public map. Additive viewer gate,
|
|
36106
|
+
// resolved within the active-org cookie's scope — not sensitive.
|
|
36107
|
+
public: true
|
|
36108
|
+
},
|
|
36109
|
+
{
|
|
36110
|
+
key: "app-top-nav-shell",
|
|
36111
|
+
description: "Global top-navigation shell redesign (ENG-8478 epic / ENG-8486). When ON, the dashboard chrome replaces the left sidebar with a top navigation bar (team switcher \xB7 destinations \xB7 command palette + account) so the left side is free for an agent-scoped rail; when OFF, the existing left sidebar is unchanged. Additive layout gate \u2014 no data-model change. Composes independently with agent-unified-screen (the two flags are reconciled in ENG-8488). Ships dark.",
|
|
36112
|
+
flagType: "boolean",
|
|
36113
|
+
// Declared safe value is `false` = the current left sidebar. Fail-closed to the
|
|
36114
|
+
// shell that ships today if the flag DB is unreachable.
|
|
36115
|
+
defaultValue: false,
|
|
36116
|
+
// Read CLIENT-SIDE by the dashboard layout + sidebar ("use client") via
|
|
36117
|
+
// usePublicBooleanFlag, so the key must be in the browser-exposed public map.
|
|
36118
|
+
// Additive layout gate — not sensitive.
|
|
36119
|
+
public: true
|
|
36120
|
+
},
|
|
36048
36121
|
{
|
|
36049
36122
|
key: "ninjafy-brand",
|
|
36050
36123
|
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 USER-FACING BRAND TEXT ONLY: it must never gate a code identifier, package name, env var or CLI name, which stay `Augmented`/`agt` per the CLAUDE.md naming contract (the deep code rename is workstream C of docs/runbooks/rebrand-ninjafy-migration.md and is out of scope here). Set the stage-wide default to flip a whole environment, or add a feature_flag_overrides row to pilot one organization while every other org still sees Augmented. Ships dark.',
|
|
@@ -37,7 +37,7 @@ import {
|
|
|
37
37
|
writeDirectChatSessionState,
|
|
38
38
|
writeEgressAllowlist,
|
|
39
39
|
writePersistentClaudeWrapper
|
|
40
|
-
} from "./chunk-
|
|
40
|
+
} from "./chunk-XH3O62OZ.js";
|
|
41
41
|
import "./chunk-XWVM4KPK.js";
|
|
42
42
|
export {
|
|
43
43
|
EGRESS_BASELINE_DOMAINS,
|
|
@@ -79,4 +79,4 @@ export {
|
|
|
79
79
|
writeEgressAllowlist,
|
|
80
80
|
writePersistentClaudeWrapper
|
|
81
81
|
};
|
|
82
|
-
//# sourceMappingURL=persistent-session-
|
|
82
|
+
//# sourceMappingURL=persistent-session-U4GCKL6C.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
paneLogPath
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-XH3O62OZ.js";
|
|
4
4
|
import "./chunk-XWVM4KPK.js";
|
|
5
5
|
|
|
6
6
|
// src/lib/responsiveness-probe.ts
|
|
@@ -662,4 +662,4 @@ export {
|
|
|
662
662
|
readAndResetSlackReplyBindingClassifications,
|
|
663
663
|
readAndResetSlackReplyTargetClassifications
|
|
664
664
|
};
|
|
665
|
-
//# sourceMappingURL=responsiveness-probe-
|
|
665
|
+
//# sourceMappingURL=responsiveness-probe-G2CAGG6M.js.map
|