@integrity-labs/agt-cli 0.28.611 → 0.28.612
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-DD6NRRYC.js → chunk-DJP4JZGE.js} +2 -2
- package/dist/{chunk-6L5WLLVR.js → chunk-F2WTBHMD.js} +4 -4
- package/dist/{chunk-2ASO4HVN.js → chunk-RQAAW5LL.js} +24 -1
- package/dist/chunk-RQAAW5LL.js.map +1 -0
- package/dist/{claude-pair-runtime-SZM65MVE.js → claude-pair-runtime-4MKFMNYN.js} +2 -2
- package/dist/lib/manager-worker.js +13 -13
- package/dist/mcp/direct-chat-channel.js +30 -3
- package/dist/mcp/origami.js +23 -0
- package/dist/mcp/slack-channel.js +30 -3
- package/dist/mcp/telegram-channel.js +30 -3
- package/dist/{persistent-session-JWBUD6RZ.js → persistent-session-KO24RZN7.js} +3 -3
- package/dist/{responsiveness-probe-GJEX44DE.js → responsiveness-probe-V4O7DXYV.js} +3 -3
- package/dist/{session-auth-dead-LBRWZQPW.js → session-auth-dead-S7WK33WO.js} +2 -2
- package/package.json +1 -1
- package/dist/chunk-2ASO4HVN.js.map +0 -1
- /package/dist/{chunk-DD6NRRYC.js.map → chunk-DJP4JZGE.js.map} +0 -0
- /package/dist/{chunk-6L5WLLVR.js.map → chunk-F2WTBHMD.js.map} +0 -0
- /package/dist/{claude-pair-runtime-SZM65MVE.js.map → claude-pair-runtime-4MKFMNYN.js.map} +0 -0
- /package/dist/{persistent-session-JWBUD6RZ.js.map → persistent-session-KO24RZN7.js.map} +0 -0
- /package/dist/{responsiveness-probe-GJEX44DE.js.map → responsiveness-probe-V4O7DXYV.js.map} +0 -0
- /package/dist/{session-auth-dead-LBRWZQPW.js.map → session-auth-dead-S7WK33WO.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-KO24RZN7.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-4MKFMNYN.js.map
|
|
@@ -53,7 +53,7 @@ import {
|
|
|
53
53
|
safeWriteJsonAtomic,
|
|
54
54
|
setConfigHash,
|
|
55
55
|
tripClass
|
|
56
|
-
} from "../chunk-
|
|
56
|
+
} from "../chunk-F2WTBHMD.js";
|
|
57
57
|
import {
|
|
58
58
|
getProjectDir as getProjectDir2,
|
|
59
59
|
getReadyTasks,
|
|
@@ -109,7 +109,7 @@ import {
|
|
|
109
109
|
takeZombieDetection,
|
|
110
110
|
toOpencodeModel,
|
|
111
111
|
writeEgressAllowlist
|
|
112
|
-
} from "../chunk-
|
|
112
|
+
} from "../chunk-DJP4JZGE.js";
|
|
113
113
|
import {
|
|
114
114
|
ACCOUNT_ENFORCEMENT_MARKER_FILENAME,
|
|
115
115
|
AnchorSessionClient,
|
|
@@ -186,7 +186,7 @@ import {
|
|
|
186
186
|
subagentActivityAgeSeconds,
|
|
187
187
|
sumTranscriptUsageInWindow,
|
|
188
188
|
transcriptActivityAgeSeconds
|
|
189
|
-
} from "../chunk-
|
|
189
|
+
} from "../chunk-RQAAW5LL.js";
|
|
190
190
|
import {
|
|
191
191
|
reapOrphanChannelMcps
|
|
192
192
|
} from "../chunk-XWVM4KPK.js";
|
|
@@ -11287,7 +11287,7 @@ var pendingDayRolloverReset = /* @__PURE__ */ new Set();
|
|
|
11287
11287
|
var dayRolloverInboundHold = /* @__PURE__ */ new Map();
|
|
11288
11288
|
var INBOUND_HOLD_EPISODE_GAP_MS = 12e4;
|
|
11289
11289
|
async function channelInboundActivityAgeSecondsFor(codeName) {
|
|
11290
|
-
const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-
|
|
11290
|
+
const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-V4O7DXYV.js");
|
|
11291
11291
|
const newest = newestPendingInboundActivityMtimeMs(dirname9(paneLogPath(codeName)));
|
|
11292
11292
|
if (newest === null) return null;
|
|
11293
11293
|
return Math.max(0, Math.floor((Date.now() - newest) / 1e3));
|
|
@@ -11926,7 +11926,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
|
|
|
11926
11926
|
var lastVersionCheckAt = 0;
|
|
11927
11927
|
var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
|
|
11928
11928
|
var lastResponsivenessProbeAt = 0;
|
|
11929
|
-
var agtCliVersion = true ? "0.28.
|
|
11929
|
+
var agtCliVersion = true ? "0.28.612" : "dev";
|
|
11930
11930
|
function resolveBrewPath(execFileSync3) {
|
|
11931
11931
|
try {
|
|
11932
11932
|
const out = execFileSync3("which", ["brew"], { timeout: 5e3 }).toString().trim();
|
|
@@ -13233,7 +13233,7 @@ function flushRestartedAgentDiagnostics(hostId, codeNames) {
|
|
|
13233
13233
|
if (codeNames.length === 0) return;
|
|
13234
13234
|
void (async () => {
|
|
13235
13235
|
try {
|
|
13236
|
-
const { collectDiagnostics } = await import("../persistent-session-
|
|
13236
|
+
const { collectDiagnostics } = await import("../persistent-session-KO24RZN7.js");
|
|
13237
13237
|
await api.post("/host/heartbeat", {
|
|
13238
13238
|
host_id: hostId,
|
|
13239
13239
|
agent_diagnostics: collectDiagnostics(codeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor)
|
|
@@ -13341,7 +13341,7 @@ async function pollCycle() {
|
|
|
13341
13341
|
}
|
|
13342
13342
|
try {
|
|
13343
13343
|
const { detectHostSecurity } = await import("../host-security-6PDFG7F5.js");
|
|
13344
|
-
const { collectDiagnostics } = await import("../persistent-session-
|
|
13344
|
+
const { collectDiagnostics } = await import("../persistent-session-KO24RZN7.js");
|
|
13345
13345
|
const diagCodeNames = [...agentState.persistentSessionAgents];
|
|
13346
13346
|
const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor) : void 0;
|
|
13347
13347
|
let tailscaleHostname;
|
|
@@ -13464,7 +13464,7 @@ async function pollCycle() {
|
|
|
13464
13464
|
collectPanelessActivityProbes,
|
|
13465
13465
|
getResponsivenessIntervalMs,
|
|
13466
13466
|
occupancyQualificationClassifications
|
|
13467
|
-
} = await import("../responsiveness-probe-
|
|
13467
|
+
} = await import("../responsiveness-probe-V4O7DXYV.js");
|
|
13468
13468
|
const probeIntervalMs = getResponsivenessIntervalMs();
|
|
13469
13469
|
if (now - lastResponsivenessProbeAt > probeIntervalMs) {
|
|
13470
13470
|
const probeCodeNames = [...agentState.persistentSessionAgents];
|
|
@@ -13570,7 +13570,7 @@ async function pollCycle() {
|
|
|
13570
13570
|
collectResponsivenessProbes,
|
|
13571
13571
|
livePendingInboundOldestAgeSeconds,
|
|
13572
13572
|
parkPendingInbound
|
|
13573
|
-
} = await import("../responsiveness-probe-
|
|
13573
|
+
} = await import("../responsiveness-probe-V4O7DXYV.js");
|
|
13574
13574
|
const { getProjectDir: wedgeProjectDir } = await import("../scheduler-engine-NDP36U7O.js");
|
|
13575
13575
|
const wedgeNow = /* @__PURE__ */ new Date();
|
|
13576
13576
|
const liveAgents = agentState.persistentSessionAgents;
|
|
@@ -13726,7 +13726,7 @@ async function pollCycle() {
|
|
|
13726
13726
|
}
|
|
13727
13727
|
try {
|
|
13728
13728
|
const { scrapeMcpFailedBannerCount } = await import("../pane-mcp-banner-scraper-JA437JIB.js");
|
|
13729
|
-
const { probeSessionAuth } = await import("../session-auth-dead-
|
|
13729
|
+
const { probeSessionAuth } = await import("../session-auth-dead-S7WK33WO.js");
|
|
13730
13730
|
const observations = [];
|
|
13731
13731
|
const pendingCacheCommits = [];
|
|
13732
13732
|
const modelApiErrorReportingOn = hostFlagStore().getBoolean("model-api-error-reporting");
|
|
@@ -17215,7 +17215,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
|
|
|
17215
17215
|
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}`));
|
|
17216
17216
|
void (async () => {
|
|
17217
17217
|
try {
|
|
17218
|
-
const { collectDiagnostics } = await import("../persistent-session-
|
|
17218
|
+
const { collectDiagnostics } = await import("../persistent-session-KO24RZN7.js");
|
|
17219
17219
|
await api.post("/host/heartbeat", {
|
|
17220
17220
|
host_id: hostId,
|
|
17221
17221
|
agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor)
|
|
@@ -17266,7 +17266,7 @@ async function respawnAgentAfterMcpStop(codeName, reason) {
|
|
|
17266
17266
|
}
|
|
17267
17267
|
try {
|
|
17268
17268
|
const hostId = await getHostId();
|
|
17269
|
-
const { collectDiagnostics } = await import("../persistent-session-
|
|
17269
|
+
const { collectDiagnostics } = await import("../persistent-session-KO24RZN7.js");
|
|
17270
17270
|
await api.post("/host/heartbeat", {
|
|
17271
17271
|
host_id: hostId,
|
|
17272
17272
|
agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor)
|
|
@@ -17862,7 +17862,7 @@ async function processClaudePairSessions(agents) {
|
|
|
17862
17862
|
killPairSession,
|
|
17863
17863
|
pairTmuxSession,
|
|
17864
17864
|
finalizeClaudePairOnboarding
|
|
17865
|
-
} = await import("../claude-pair-runtime-
|
|
17865
|
+
} = await import("../claude-pair-runtime-4MKFMNYN.js");
|
|
17866
17866
|
for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
|
|
17867
17867
|
log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
|
|
17868
17868
|
const killed = await killPairSession(pairTmuxSession(pairId));
|
|
@@ -30142,8 +30142,12 @@ function busyAckNoticeText() {
|
|
|
30142
30142
|
return "\u{1F6E0}\uFE0F I'm in the middle of something right now \u2014 I'll follow up on this as soon as I'm free.";
|
|
30143
30143
|
}
|
|
30144
30144
|
var GIVE_UP_SIGNAL_MAX_AGE_MS = 30 * 60 * 1e3;
|
|
30145
|
-
function turnFailedNoticeText() {
|
|
30146
|
-
|
|
30145
|
+
function turnFailedNoticeText(failureClass) {
|
|
30146
|
+
const cause = failureClass === "overloaded" ? "the service I run on is overloaded right now \u2014 nothing to do with you or what you asked for" : failureClass === "server_error" ? "something upstream of me is failing right now \u2014 nothing to do with you or what you asked for" : null;
|
|
30147
|
+
if (cause === null) {
|
|
30148
|
+
return "\u26A0\uFE0F Something went wrong on my side and I couldn\u2019t finish that. Sorry \u2014 send it again when you get a chance and I\u2019ll pick it straight up.";
|
|
30149
|
+
}
|
|
30150
|
+
return `\u26A0\uFE0F I couldn\u2019t finish that \u2014 ${cause}. Sorry \u2014 send it again when you get a chance and I\u2019ll pick it straight up.`;
|
|
30147
30151
|
}
|
|
30148
30152
|
function oldestPendingMarkerAgeMs(dir, now = Date.now(), opts) {
|
|
30149
30153
|
if (!dir) return null;
|
|
@@ -34872,6 +34876,29 @@ registerTriggerSource(videoRenderTriggerAdapter);
|
|
|
34872
34876
|
|
|
34873
34877
|
// ../core/dist/feature-flags/registry.js
|
|
34874
34878
|
var FLAG_REGISTRY = [
|
|
34879
|
+
{
|
|
34880
|
+
key: "impersonation-enabled",
|
|
34881
|
+
description: "Kill switch for admin impersonation (ENG-9080), filed during the 18 Aug cross-tenant identity incident. ON (default) = impersonation works as today. OFF = both halves of the flow refuse: the mint route stops issuing redeem URLs, and \u2014 the half that actually matters \u2014 the REDEEM route refuses before it inserts the nonce or calls generateLink, so a URL that was already issued cannot still mint a session. Redeem tokens live REDEEM_TTL_SECONDS = 300, so gating only the mint route would leave five minutes in which new sessions keep appearing after an operator believes they have stopped it. Evaluated as a GLOBAL stage value, read UNCACHED on the redeem path (see readImpersonationEnabled): a kill switch that takes a cache TTL to bite is not a kill switch. Containment only \u2014 it does not fix the underlying defect that redeem writes the target's cookies into whatever browser context opens the URL (ENG-8923 / ENG-9020).",
|
|
34882
|
+
flagType: "boolean",
|
|
34883
|
+
// Declared safe value is `true` = impersonation available, i.e. today's
|
|
34884
|
+
// behaviour, so merging this changes nothing until an operator flips it.
|
|
34885
|
+
//
|
|
34886
|
+
// NOTE the asymmetry with the other gates in this file, and it is
|
|
34887
|
+
// deliberate: their safe direction is "off / don't do the new thing"
|
|
34888
|
+
// because they gate NEW behaviour. This one gates EXISTING behaviour, so
|
|
34889
|
+
// the no-op default is `true`. The READ direction is where the safety lives
|
|
34890
|
+
// instead — an unreachable flag store resolves to DISABLED, not to this
|
|
34891
|
+
// default. See readImpersonationEnabled for that argument.
|
|
34892
|
+
defaultValue: true,
|
|
34893
|
+
// Enforcement gate (ADR-0022 section 4): re-enabling impersonation is
|
|
34894
|
+
// "relaxing a security control", exactly the mutation that must not happen
|
|
34895
|
+
// on a single unguarded write. The emergency direction (turning it OFF)
|
|
34896
|
+
// costs one confirmation, which is the right price.
|
|
34897
|
+
sensitive: true
|
|
34898
|
+
// Deliberately NOT public. A browser has no business evaluating whether
|
|
34899
|
+
// impersonation is available; both consumers are server-side route
|
|
34900
|
+
// handlers.
|
|
34901
|
+
},
|
|
34875
34902
|
{
|
|
34876
34903
|
key: "at-rest-v2-writes",
|
|
34877
34904
|
description: "ADR-0061 A2\u2192arm cutover (ENG-8944, parent ENG-8764). Gates whether the at-rest writer (encryptSecret/encryptAtRest) emits the v2 AAD-bound envelope when a DecryptContext is supplied; OFF (default) = the legacy v1 envelope (pre-ADR-0061 behaviour). Resolved FLEET-WIDE and process-global via setV2WritesArmed at the API + webapp + cron bootstrap seams, so ONLY the stage value applies \u2014 per-org overrides do not (the crypto writer carries no request/org context). Ships dark. Flip on only once every reader parses v2 (fleet-wide since release A1) AND the re-seal engine can re-seal v2 blobs before any AUTH_ENCRYPTION_KEY rotation (slice 5b). Reversible without redeploy: clearing it returns the writer to v1 within the flag cache TTL; already-written v2 blobs stay readable.",
|
|
@@ -38105,7 +38132,7 @@ function armTurnFailureWatch(args) {
|
|
|
38105
38132
|
return;
|
|
38106
38133
|
}
|
|
38107
38134
|
lastTurnFailedNoticeAt.set(args.sessionId, now);
|
|
38108
|
-
const ok = await postDirectChatNoticeMessage(args.sessionId, turnFailedNoticeText());
|
|
38135
|
+
const ok = await postDirectChatNoticeMessage(args.sessionId, turnFailedNoticeText(failure.failureClass));
|
|
38109
38136
|
if (!ok) {
|
|
38110
38137
|
lastTurnFailedNoticeAt.delete(args.sessionId);
|
|
38111
38138
|
process.stderr.write(
|
package/dist/mcp/origami.js
CHANGED
|
@@ -40763,6 +40763,29 @@ registerTriggerSource(videoRenderTriggerAdapter);
|
|
|
40763
40763
|
|
|
40764
40764
|
// ../core/dist/feature-flags/registry.js
|
|
40765
40765
|
var FLAG_REGISTRY = [
|
|
40766
|
+
{
|
|
40767
|
+
key: "impersonation-enabled",
|
|
40768
|
+
description: "Kill switch for admin impersonation (ENG-9080), filed during the 18 Aug cross-tenant identity incident. ON (default) = impersonation works as today. OFF = both halves of the flow refuse: the mint route stops issuing redeem URLs, and \u2014 the half that actually matters \u2014 the REDEEM route refuses before it inserts the nonce or calls generateLink, so a URL that was already issued cannot still mint a session. Redeem tokens live REDEEM_TTL_SECONDS = 300, so gating only the mint route would leave five minutes in which new sessions keep appearing after an operator believes they have stopped it. Evaluated as a GLOBAL stage value, read UNCACHED on the redeem path (see readImpersonationEnabled): a kill switch that takes a cache TTL to bite is not a kill switch. Containment only \u2014 it does not fix the underlying defect that redeem writes the target's cookies into whatever browser context opens the URL (ENG-8923 / ENG-9020).",
|
|
40769
|
+
flagType: "boolean",
|
|
40770
|
+
// Declared safe value is `true` = impersonation available, i.e. today's
|
|
40771
|
+
// behaviour, so merging this changes nothing until an operator flips it.
|
|
40772
|
+
//
|
|
40773
|
+
// NOTE the asymmetry with the other gates in this file, and it is
|
|
40774
|
+
// deliberate: their safe direction is "off / don't do the new thing"
|
|
40775
|
+
// because they gate NEW behaviour. This one gates EXISTING behaviour, so
|
|
40776
|
+
// the no-op default is `true`. The READ direction is where the safety lives
|
|
40777
|
+
// instead — an unreachable flag store resolves to DISABLED, not to this
|
|
40778
|
+
// default. See readImpersonationEnabled for that argument.
|
|
40779
|
+
defaultValue: true,
|
|
40780
|
+
// Enforcement gate (ADR-0022 section 4): re-enabling impersonation is
|
|
40781
|
+
// "relaxing a security control", exactly the mutation that must not happen
|
|
40782
|
+
// on a single unguarded write. The emergency direction (turning it OFF)
|
|
40783
|
+
// costs one confirmation, which is the right price.
|
|
40784
|
+
sensitive: true
|
|
40785
|
+
// Deliberately NOT public. A browser has no business evaluating whether
|
|
40786
|
+
// impersonation is available; both consumers are server-side route
|
|
40787
|
+
// handlers.
|
|
40788
|
+
},
|
|
40766
40789
|
{
|
|
40767
40790
|
key: "at-rest-v2-writes",
|
|
40768
40791
|
description: "ADR-0061 A2\u2192arm cutover (ENG-8944, parent ENG-8764). Gates whether the at-rest writer (encryptSecret/encryptAtRest) emits the v2 AAD-bound envelope when a DecryptContext is supplied; OFF (default) = the legacy v1 envelope (pre-ADR-0061 behaviour). Resolved FLEET-WIDE and process-global via setV2WritesArmed at the API + webapp + cron bootstrap seams, so ONLY the stage value applies \u2014 per-org overrides do not (the crypto writer carries no request/org context). Ships dark. Flip on only once every reader parses v2 (fleet-wide since release A1) AND the re-seal engine can re-seal v2 blobs before any AUTH_ENCRYPTION_KEY rotation (slice 5b). Reversible without redeploy: clearing it returns the writer to v1 within the flag cache TTL; already-written v2 blobs stay readable.",
|
|
@@ -35208,6 +35208,29 @@ registerTriggerSource(videoRenderTriggerAdapter);
|
|
|
35208
35208
|
|
|
35209
35209
|
// ../core/dist/feature-flags/registry.js
|
|
35210
35210
|
var FLAG_REGISTRY = [
|
|
35211
|
+
{
|
|
35212
|
+
key: "impersonation-enabled",
|
|
35213
|
+
description: "Kill switch for admin impersonation (ENG-9080), filed during the 18 Aug cross-tenant identity incident. ON (default) = impersonation works as today. OFF = both halves of the flow refuse: the mint route stops issuing redeem URLs, and \u2014 the half that actually matters \u2014 the REDEEM route refuses before it inserts the nonce or calls generateLink, so a URL that was already issued cannot still mint a session. Redeem tokens live REDEEM_TTL_SECONDS = 300, so gating only the mint route would leave five minutes in which new sessions keep appearing after an operator believes they have stopped it. Evaluated as a GLOBAL stage value, read UNCACHED on the redeem path (see readImpersonationEnabled): a kill switch that takes a cache TTL to bite is not a kill switch. Containment only \u2014 it does not fix the underlying defect that redeem writes the target's cookies into whatever browser context opens the URL (ENG-8923 / ENG-9020).",
|
|
35214
|
+
flagType: "boolean",
|
|
35215
|
+
// Declared safe value is `true` = impersonation available, i.e. today's
|
|
35216
|
+
// behaviour, so merging this changes nothing until an operator flips it.
|
|
35217
|
+
//
|
|
35218
|
+
// NOTE the asymmetry with the other gates in this file, and it is
|
|
35219
|
+
// deliberate: their safe direction is "off / don't do the new thing"
|
|
35220
|
+
// because they gate NEW behaviour. This one gates EXISTING behaviour, so
|
|
35221
|
+
// the no-op default is `true`. The READ direction is where the safety lives
|
|
35222
|
+
// instead — an unreachable flag store resolves to DISABLED, not to this
|
|
35223
|
+
// default. See readImpersonationEnabled for that argument.
|
|
35224
|
+
defaultValue: true,
|
|
35225
|
+
// Enforcement gate (ADR-0022 section 4): re-enabling impersonation is
|
|
35226
|
+
// "relaxing a security control", exactly the mutation that must not happen
|
|
35227
|
+
// on a single unguarded write. The emergency direction (turning it OFF)
|
|
35228
|
+
// costs one confirmation, which is the right price.
|
|
35229
|
+
sensitive: true
|
|
35230
|
+
// Deliberately NOT public. A browser has no business evaluating whether
|
|
35231
|
+
// impersonation is available; both consumers are server-side route
|
|
35232
|
+
// handlers.
|
|
35233
|
+
},
|
|
35211
35234
|
{
|
|
35212
35235
|
key: "at-rest-v2-writes",
|
|
35213
35236
|
description: "ADR-0061 A2\u2192arm cutover (ENG-8944, parent ENG-8764). Gates whether the at-rest writer (encryptSecret/encryptAtRest) emits the v2 AAD-bound envelope when a DecryptContext is supplied; OFF (default) = the legacy v1 envelope (pre-ADR-0061 behaviour). Resolved FLEET-WIDE and process-global via setV2WritesArmed at the API + webapp + cron bootstrap seams, so ONLY the stage value applies \u2014 per-org overrides do not (the crypto writer carries no request/org context). Ships dark. Flip on only once every reader parses v2 (fleet-wide since release A1) AND the re-seal engine can re-seal v2 blobs before any AUTH_ENCRYPTION_KEY rotation (slice 5b). Reversible without redeploy: clearing it returns the writer to v1 within the flag cache TTL; already-written v2 blobs stay readable.",
|
|
@@ -36974,8 +36997,12 @@ function giveUpNoticeText(reason = null) {
|
|
|
36974
36997
|
}
|
|
36975
36998
|
return "\u26A0\uFE0F I couldn't read your last message \u2014 please resend it.";
|
|
36976
36999
|
}
|
|
36977
|
-
function turnFailedNoticeText() {
|
|
36978
|
-
|
|
37000
|
+
function turnFailedNoticeText(failureClass) {
|
|
37001
|
+
const cause = failureClass === "overloaded" ? "the service I run on is overloaded right now \u2014 nothing to do with you or what you asked for" : failureClass === "server_error" ? "something upstream of me is failing right now \u2014 nothing to do with you or what you asked for" : null;
|
|
37002
|
+
if (cause === null) {
|
|
37003
|
+
return "\u26A0\uFE0F Something went wrong on my side and I couldn\u2019t finish that. Sorry \u2014 send it again when you get a chance and I\u2019ll pick it straight up.";
|
|
37004
|
+
}
|
|
37005
|
+
return `\u26A0\uFE0F I couldn\u2019t finish that \u2014 ${cause}. Sorry \u2014 send it again when you get a chance and I\u2019ll pick it straight up.`;
|
|
36979
37006
|
}
|
|
36980
37007
|
function turnRetryingNoticeText() {
|
|
36981
37008
|
return "\u23F3 Still working on this \u2014 things are running slower than usual on my side. I\u2019ll reply as soon as I have it.";
|
|
@@ -42678,7 +42705,7 @@ function armSlackTurnFailureWatch(args) {
|
|
|
42678
42705
|
const posted = await postSlackTurnNotice({
|
|
42679
42706
|
channel,
|
|
42680
42707
|
threadTs: args.threadTs,
|
|
42681
|
-
text: turnFailedNoticeText()
|
|
42708
|
+
text: turnFailedNoticeText(failure.failureClass)
|
|
42682
42709
|
});
|
|
42683
42710
|
if (!posted.ok) {
|
|
42684
42711
|
lastSlackTurnFailedNoticeAt.delete(conversationKey);
|
|
@@ -35367,6 +35367,29 @@ registerTriggerSource(videoRenderTriggerAdapter);
|
|
|
35367
35367
|
|
|
35368
35368
|
// ../core/dist/feature-flags/registry.js
|
|
35369
35369
|
var FLAG_REGISTRY = [
|
|
35370
|
+
{
|
|
35371
|
+
key: "impersonation-enabled",
|
|
35372
|
+
description: "Kill switch for admin impersonation (ENG-9080), filed during the 18 Aug cross-tenant identity incident. ON (default) = impersonation works as today. OFF = both halves of the flow refuse: the mint route stops issuing redeem URLs, and \u2014 the half that actually matters \u2014 the REDEEM route refuses before it inserts the nonce or calls generateLink, so a URL that was already issued cannot still mint a session. Redeem tokens live REDEEM_TTL_SECONDS = 300, so gating only the mint route would leave five minutes in which new sessions keep appearing after an operator believes they have stopped it. Evaluated as a GLOBAL stage value, read UNCACHED on the redeem path (see readImpersonationEnabled): a kill switch that takes a cache TTL to bite is not a kill switch. Containment only \u2014 it does not fix the underlying defect that redeem writes the target's cookies into whatever browser context opens the URL (ENG-8923 / ENG-9020).",
|
|
35373
|
+
flagType: "boolean",
|
|
35374
|
+
// Declared safe value is `true` = impersonation available, i.e. today's
|
|
35375
|
+
// behaviour, so merging this changes nothing until an operator flips it.
|
|
35376
|
+
//
|
|
35377
|
+
// NOTE the asymmetry with the other gates in this file, and it is
|
|
35378
|
+
// deliberate: their safe direction is "off / don't do the new thing"
|
|
35379
|
+
// because they gate NEW behaviour. This one gates EXISTING behaviour, so
|
|
35380
|
+
// the no-op default is `true`. The READ direction is where the safety lives
|
|
35381
|
+
// instead — an unreachable flag store resolves to DISABLED, not to this
|
|
35382
|
+
// default. See readImpersonationEnabled for that argument.
|
|
35383
|
+
defaultValue: true,
|
|
35384
|
+
// Enforcement gate (ADR-0022 section 4): re-enabling impersonation is
|
|
35385
|
+
// "relaxing a security control", exactly the mutation that must not happen
|
|
35386
|
+
// on a single unguarded write. The emergency direction (turning it OFF)
|
|
35387
|
+
// costs one confirmation, which is the right price.
|
|
35388
|
+
sensitive: true
|
|
35389
|
+
// Deliberately NOT public. A browser has no business evaluating whether
|
|
35390
|
+
// impersonation is available; both consumers are server-side route
|
|
35391
|
+
// handlers.
|
|
35392
|
+
},
|
|
35370
35393
|
{
|
|
35371
35394
|
key: "at-rest-v2-writes",
|
|
35372
35395
|
description: "ADR-0061 A2\u2192arm cutover (ENG-8944, parent ENG-8764). Gates whether the at-rest writer (encryptSecret/encryptAtRest) emits the v2 AAD-bound envelope when a DecryptContext is supplied; OFF (default) = the legacy v1 envelope (pre-ADR-0061 behaviour). Resolved FLEET-WIDE and process-global via setV2WritesArmed at the API + webapp + cron bootstrap seams, so ONLY the stage value applies \u2014 per-org overrides do not (the crypto writer carries no request/org context). Ships dark. Flip on only once every reader parses v2 (fleet-wide since release A1) AND the re-seal engine can re-seal v2 blobs before any AUTH_ENCRYPTION_KEY rotation (slice 5b). Reversible without redeploy: clearing it returns the writer to v1 within the flag cache TTL; already-written v2 blobs stay readable.",
|
|
@@ -39578,8 +39601,12 @@ function giveUpNoticeText(reason = null) {
|
|
|
39578
39601
|
}
|
|
39579
39602
|
return "\u26A0\uFE0F I couldn't read your last message \u2014 please resend it.";
|
|
39580
39603
|
}
|
|
39581
|
-
function turnFailedNoticeText() {
|
|
39582
|
-
|
|
39604
|
+
function turnFailedNoticeText(failureClass) {
|
|
39605
|
+
const cause = failureClass === "overloaded" ? "the service I run on is overloaded right now \u2014 nothing to do with you or what you asked for" : failureClass === "server_error" ? "something upstream of me is failing right now \u2014 nothing to do with you or what you asked for" : null;
|
|
39606
|
+
if (cause === null) {
|
|
39607
|
+
return "\u26A0\uFE0F Something went wrong on my side and I couldn\u2019t finish that. Sorry \u2014 send it again when you get a chance and I\u2019ll pick it straight up.";
|
|
39608
|
+
}
|
|
39609
|
+
return `\u26A0\uFE0F I couldn\u2019t finish that \u2014 ${cause}. Sorry \u2014 send it again when you get a chance and I\u2019ll pick it straight up.`;
|
|
39583
39610
|
}
|
|
39584
39611
|
function turnRetryingNoticeText() {
|
|
39585
39612
|
return "\u23F3 Still working on this \u2014 things are running slower than usual on my side. I\u2019ll reply as soon as I have it.";
|
|
@@ -41993,7 +42020,7 @@ function armTelegramTurnFailureWatch(args) {
|
|
|
41993
42020
|
const posted = await postTelegramTurnNotice({
|
|
41994
42021
|
chatId: args.chatId,
|
|
41995
42022
|
...args.messageThreadId != null ? { messageThreadId: args.messageThreadId } : {},
|
|
41996
|
-
text: turnFailedNoticeText()
|
|
42023
|
+
text: turnFailedNoticeText(failure.failureClass)
|
|
41997
42024
|
});
|
|
41998
42025
|
if (!posted) {
|
|
41999
42026
|
lastTurnFailedNoticeAt.delete(conversationKey);
|
|
@@ -43,8 +43,8 @@ import {
|
|
|
43
43
|
writeDirectChatSessionState,
|
|
44
44
|
writeEgressAllowlist,
|
|
45
45
|
writePersistentClaudeWrapper
|
|
46
|
-
} from "./chunk-
|
|
47
|
-
import "./chunk-
|
|
46
|
+
} from "./chunk-DJP4JZGE.js";
|
|
47
|
+
import "./chunk-RQAAW5LL.js";
|
|
48
48
|
import "./chunk-XWVM4KPK.js";
|
|
49
49
|
export {
|
|
50
50
|
EGRESS_BASELINE_DOMAINS,
|
|
@@ -92,4 +92,4 @@ export {
|
|
|
92
92
|
writeEgressAllowlist,
|
|
93
93
|
writePersistentClaudeWrapper
|
|
94
94
|
};
|
|
95
|
-
//# sourceMappingURL=persistent-session-
|
|
95
|
+
//# sourceMappingURL=persistent-session-KO24RZN7.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
paneLogPath
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
3
|
+
} from "./chunk-DJP4JZGE.js";
|
|
4
|
+
import "./chunk-RQAAW5LL.js";
|
|
5
5
|
import "./chunk-XWVM4KPK.js";
|
|
6
6
|
|
|
7
7
|
// src/lib/responsiveness-probe.ts
|
|
@@ -710,4 +710,4 @@ export {
|
|
|
710
710
|
readAndResetSlackReplyBindingClassifications,
|
|
711
711
|
readAndResetSlackReplyTargetClassifications
|
|
712
712
|
};
|
|
713
|
-
//# sourceMappingURL=responsiveness-probe-
|
|
713
|
+
//# sourceMappingURL=responsiveness-probe-V4O7DXYV.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
sessionTranscriptDir
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-RQAAW5LL.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-S7WK33WO.js.map
|