@integrity-labs/agt-cli 0.28.715 → 0.28.716
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 +618 -65
- package/dist/bin/agt.js.map +1 -1
- package/dist/{chunk-RPWLPRGP.js → chunk-ILDRNSOB.js} +7 -4
- package/dist/chunk-ILDRNSOB.js.map +1 -0
- package/dist/{chunk-VZPXV57A.js → chunk-OOYUWMTR.js} +350 -61
- package/dist/chunk-OOYUWMTR.js.map +1 -0
- package/dist/{claude-pair-runtime-GYS4MOPM.js → claude-pair-runtime-JK7GQU25.js} +2 -2
- package/dist/lib/manager-worker.js +418 -698
- package/dist/lib/manager-worker.js.map +1 -1
- package/dist/{persistent-session-Z4UOM4V6.js → persistent-session-DJSSEIR6.js} +4 -2
- package/dist/{responsiveness-probe-XJZSVXMW.js → responsiveness-probe-A5335ORT.js} +2 -2
- package/package.json +1 -1
- package/dist/chunk-RPWLPRGP.js.map +0 -1
- package/dist/chunk-VZPXV57A.js.map +0 -1
- /package/dist/{claude-pair-runtime-GYS4MOPM.js.map → claude-pair-runtime-JK7GQU25.js.map} +0 -0
- /package/dist/{persistent-session-Z4UOM4V6.js.map → persistent-session-DJSSEIR6.js.map} +0 -0
- /package/dist/{responsiveness-probe-XJZSVXMW.js.map → responsiveness-probe-A5335ORT.js.map} +0 -0
|
@@ -6,13 +6,14 @@ import {
|
|
|
6
6
|
buildOAuthRemoteMcpProxyEntry,
|
|
7
7
|
buildRemoteMcpEntry,
|
|
8
8
|
expandTemplateVars,
|
|
9
|
+
getProjectDir,
|
|
9
10
|
isolationMode,
|
|
10
11
|
log,
|
|
11
12
|
mergeEnvIntegrationsContent,
|
|
12
13
|
parseEnvFileEntries,
|
|
13
14
|
parseEnvIntegrations,
|
|
14
15
|
shellQuote
|
|
15
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-ILDRNSOB.js";
|
|
16
17
|
import {
|
|
17
18
|
BIND_FAILURE_QUARANTINE_THRESHOLD,
|
|
18
19
|
INTEGRATIONS_SECTION_END,
|
|
@@ -50,6 +51,7 @@ import {
|
|
|
50
51
|
probeComposioMcpToolCall,
|
|
51
52
|
probeHttpProvider,
|
|
52
53
|
probeMcpHttp,
|
|
54
|
+
readDailySessionPin,
|
|
53
55
|
readRemoteMcpAuthConfig,
|
|
54
56
|
registerFramework,
|
|
55
57
|
remoteMcpConnectionScopedEnvVar,
|
|
@@ -57,6 +59,7 @@ import {
|
|
|
57
59
|
remoteMcpServerKey,
|
|
58
60
|
resolveAvatarEnvUrl,
|
|
59
61
|
resolveConnectivityProbe,
|
|
62
|
+
sessionTranscriptDir,
|
|
60
63
|
worseConnectivityOutcome,
|
|
61
64
|
wrapScheduledTaskPrompt
|
|
62
65
|
} from "./chunk-LHYYO4NY.js";
|
|
@@ -939,11 +942,11 @@ function decodeValue(buf, offset) {
|
|
|
939
942
|
if (end > buf.length)
|
|
940
943
|
throw new CborDecodeError("cbor: truncated text string");
|
|
941
944
|
const bytes = buf.subarray(head.next, end);
|
|
942
|
-
const
|
|
943
|
-
if (!Buffer.from(
|
|
945
|
+
const str2 = bytes.toString("utf8");
|
|
946
|
+
if (!Buffer.from(str2, "utf8").equals(bytes)) {
|
|
944
947
|
throw new CborDecodeError("cbor: invalid UTF-8 in text string");
|
|
945
948
|
}
|
|
946
|
-
return { value:
|
|
949
|
+
return { value: str2, next: end };
|
|
947
950
|
}
|
|
948
951
|
case MAJOR_ARRAY: {
|
|
949
952
|
const arr = [];
|
|
@@ -1589,7 +1592,7 @@ function writeEnvIntegrationsForAgent(codeName, args) {
|
|
|
1589
1592
|
} catch {
|
|
1590
1593
|
}
|
|
1591
1594
|
try {
|
|
1592
|
-
const projectDir =
|
|
1595
|
+
const projectDir = getProjectDir2(codeName);
|
|
1593
1596
|
mkdirSync3(projectDir, { recursive: true });
|
|
1594
1597
|
const dest = join3(projectDir, ".env.integrations");
|
|
1595
1598
|
writeFileSync4(dest, content, { mode: SECRET_FILE_MODE });
|
|
@@ -1878,7 +1881,7 @@ function syncGitHubBrokerCredentialTooling(projectDir, enabled) {
|
|
|
1878
1881
|
chmodSync4(shimPath, BROKER_SCRIPT_MODE);
|
|
1879
1882
|
return buildGitCredentialEnv(helperPath);
|
|
1880
1883
|
}
|
|
1881
|
-
function
|
|
1884
|
+
function getProjectDir2(codeName) {
|
|
1882
1885
|
return join3(getAgentDir(codeName), "project");
|
|
1883
1886
|
}
|
|
1884
1887
|
function getScratchDir(codeName) {
|
|
@@ -1954,7 +1957,7 @@ function isFreshWithin(path, cutoff) {
|
|
|
1954
1957
|
}
|
|
1955
1958
|
function syncMcpToProject(codeName) {
|
|
1956
1959
|
const agentDir = getAgentDir(codeName);
|
|
1957
|
-
const projectDir =
|
|
1960
|
+
const projectDir = getProjectDir2(codeName);
|
|
1958
1961
|
const provisionMcpPath = join3(agentDir, "provision", ".mcp.json");
|
|
1959
1962
|
const projectMcpPath = join3(projectDir, ".mcp.json");
|
|
1960
1963
|
try {
|
|
@@ -2001,7 +2004,7 @@ function readIntegrationsSummaryForAgent(codeName) {
|
|
|
2001
2004
|
}
|
|
2002
2005
|
function renderChannelMessageHandlerForAgent(codeName) {
|
|
2003
2006
|
const agentDir = getAgentDir(codeName);
|
|
2004
|
-
const projectDir =
|
|
2007
|
+
const projectDir = getProjectDir2(codeName);
|
|
2005
2008
|
const provisionMcpPath = join3(agentDir, "provision", ".mcp.json");
|
|
2006
2009
|
let mcpServerKeys;
|
|
2007
2010
|
try {
|
|
@@ -2089,7 +2092,7 @@ function ensureWorkspaceTrusted(projectDir) {
|
|
|
2089
2092
|
}
|
|
2090
2093
|
}
|
|
2091
2094
|
function deployArtifactsToProject(codeName, provisionDir) {
|
|
2092
|
-
const projectDir =
|
|
2095
|
+
const projectDir = getProjectDir2(codeName);
|
|
2093
2096
|
mkdirSync3(projectDir, { recursive: true });
|
|
2094
2097
|
ensureWorkspaceTrusted(projectDir);
|
|
2095
2098
|
try {
|
|
@@ -2280,7 +2283,7 @@ function deployArtifactsToProject(codeName, provisionDir) {
|
|
|
2280
2283
|
}
|
|
2281
2284
|
}
|
|
2282
2285
|
function provisionStopHook(codeName) {
|
|
2283
|
-
const projectDir =
|
|
2286
|
+
const projectDir = getProjectDir2(codeName);
|
|
2284
2287
|
const claudeDir = join3(projectDir, ".claude");
|
|
2285
2288
|
mkdirSync3(claudeDir, { recursive: true });
|
|
2286
2289
|
const hookScriptPath = join3(claudeDir, "agt-stop-hook.sh");
|
|
@@ -3209,7 +3212,7 @@ function provisionStopHook(codeName) {
|
|
|
3209
3212
|
writeFileSync4(settingsPath, JSON.stringify(settings, null, 2));
|
|
3210
3213
|
}
|
|
3211
3214
|
function provisionIsolationHook(codeName, agentId) {
|
|
3212
|
-
const projectDir =
|
|
3215
|
+
const projectDir = getProjectDir2(codeName);
|
|
3213
3216
|
const claudeDir = join3(projectDir, ".claude");
|
|
3214
3217
|
mkdirSync3(claudeDir, { recursive: true });
|
|
3215
3218
|
const hasAgentId = agentId !== void 0;
|
|
@@ -3295,7 +3298,7 @@ function provisionIsolationHook(codeName, agentId) {
|
|
|
3295
3298
|
writeFileSync4(settingsPath, JSON.stringify(settings, null, 2));
|
|
3296
3299
|
}
|
|
3297
3300
|
function provisionBacklogPullHook(codeName) {
|
|
3298
|
-
const projectDir =
|
|
3301
|
+
const projectDir = getProjectDir2(codeName);
|
|
3299
3302
|
const claudeDir = join3(projectDir, ".claude");
|
|
3300
3303
|
mkdirSync3(claudeDir, { recursive: true });
|
|
3301
3304
|
const hookScriptPath = join3(claudeDir, "agt-backlog-pull-hook.sh");
|
|
@@ -3464,7 +3467,7 @@ exit 0
|
|
|
3464
3467
|
return hookScriptPath;
|
|
3465
3468
|
}
|
|
3466
3469
|
function provisionAutoKanbanProgressHook(codeName) {
|
|
3467
|
-
const projectDir =
|
|
3470
|
+
const projectDir = getProjectDir2(codeName);
|
|
3468
3471
|
const claudeDir = join3(projectDir, ".claude");
|
|
3469
3472
|
mkdirSync3(claudeDir, { recursive: true });
|
|
3470
3473
|
const hookScriptPath = join3(claudeDir, "agt-auto-kanban-progress-hook.sh");
|
|
@@ -3594,7 +3597,7 @@ exit 0
|
|
|
3594
3597
|
writeFileSync4(settingsPath, JSON.stringify(settings, null, 2));
|
|
3595
3598
|
}
|
|
3596
3599
|
function provisionChannelProgressHook(codeName) {
|
|
3597
|
-
const projectDir =
|
|
3600
|
+
const projectDir = getProjectDir2(codeName);
|
|
3598
3601
|
const claudeDir = join3(projectDir, ".claude");
|
|
3599
3602
|
mkdirSync3(claudeDir, { recursive: true });
|
|
3600
3603
|
const hookScriptPath = join3(claudeDir, "agt-channel-progress-hook.sh");
|
|
@@ -3687,7 +3690,7 @@ exit 0
|
|
|
3687
3690
|
writeFileSync4(settingsPath, JSON.stringify(settings, null, 2));
|
|
3688
3691
|
}
|
|
3689
3692
|
function provisionOrientHook(codeName) {
|
|
3690
|
-
const projectDir =
|
|
3693
|
+
const projectDir = getProjectDir2(codeName);
|
|
3691
3694
|
const claudeDir = join3(projectDir, ".claude");
|
|
3692
3695
|
mkdirSync3(claudeDir, { recursive: true });
|
|
3693
3696
|
const agentDir = getAgentDir(codeName);
|
|
@@ -3868,7 +3871,7 @@ function provisionOrientHook(codeName) {
|
|
|
3868
3871
|
writeFileSync4(settingsPath, JSON.stringify(settings, null, 2));
|
|
3869
3872
|
}
|
|
3870
3873
|
function provisionPreCompactHook(codeName) {
|
|
3871
|
-
const projectDir =
|
|
3874
|
+
const projectDir = getProjectDir2(codeName);
|
|
3872
3875
|
const claudeDir = join3(projectDir, ".claude");
|
|
3873
3876
|
mkdirSync3(claudeDir, { recursive: true });
|
|
3874
3877
|
const agentDir = getAgentDir(codeName);
|
|
@@ -4005,7 +4008,7 @@ function provisionPreCompactHook(codeName) {
|
|
|
4005
4008
|
writeFileSync4(settingsPath, JSON.stringify(settings, null, 2));
|
|
4006
4009
|
}
|
|
4007
4010
|
function provisionSessionStateHook(codeName) {
|
|
4008
|
-
const projectDir =
|
|
4011
|
+
const projectDir = getProjectDir2(codeName);
|
|
4009
4012
|
const claudeDir = join3(projectDir, ".claude");
|
|
4010
4013
|
mkdirSync3(claudeDir, { recursive: true });
|
|
4011
4014
|
const agentDir = getAgentDir(codeName);
|
|
@@ -4218,7 +4221,7 @@ function buildSettingsJson(input) {
|
|
|
4218
4221
|
}
|
|
4219
4222
|
};
|
|
4220
4223
|
settings["model"] = agent.primary_model || "claude-opus-4-7";
|
|
4221
|
-
const projectDir =
|
|
4224
|
+
const projectDir = getProjectDir2(agent.code_name);
|
|
4222
4225
|
const agentDir = getAgentDir(agent.code_name);
|
|
4223
4226
|
const homeDir = getHomeDir();
|
|
4224
4227
|
const codenameAliasDir = join3(homeDir, ".augmented", agent.code_name);
|
|
@@ -4347,7 +4350,7 @@ ${integrationsBlock}`;
|
|
|
4347
4350
|
}
|
|
4348
4351
|
function renderAugmentedWorkerForAgent(codeName) {
|
|
4349
4352
|
const agentDir = getAgentDir(codeName);
|
|
4350
|
-
const projectDir =
|
|
4353
|
+
const projectDir = getProjectDir2(codeName);
|
|
4351
4354
|
const provisionMcpPath = join3(agentDir, "provision", ".mcp.json");
|
|
4352
4355
|
let mcpServerKeys;
|
|
4353
4356
|
try {
|
|
@@ -4481,7 +4484,7 @@ function buildMcpJson(input) {
|
|
|
4481
4484
|
// getProjectDir (the ADR-0049 seam), not the MCP child's inherited
|
|
4482
4485
|
// cwd, so the path stays correct if Claude Code ever spawns the
|
|
4483
4486
|
// server from somewhere else.
|
|
4484
|
-
XERO_EXPORT_DIR: join3(
|
|
4487
|
+
XERO_EXPORT_DIR: join3(getProjectDir2(input.agent.code_name), "xero-exports"),
|
|
4485
4488
|
PATH: process.env["PATH"] ?? "",
|
|
4486
4489
|
HOME: process.env["HOME"] ?? ""
|
|
4487
4490
|
}
|
|
@@ -4493,7 +4496,7 @@ function buildMcpJson(input) {
|
|
|
4493
4496
|
}
|
|
4494
4497
|
const remoteOAuthProxyPaths = {
|
|
4495
4498
|
proxyPath: join3(getHomeDir(), ".augmented", "_mcp", "remote-oauth-proxy.js"),
|
|
4496
|
-
tokenFile: join3(
|
|
4499
|
+
tokenFile: join3(getProjectDir2(input.agent.code_name), ".env.integrations")
|
|
4497
4500
|
};
|
|
4498
4501
|
for (const integration of input.integrations ?? []) {
|
|
4499
4502
|
const connectionKey = integration.connection_key;
|
|
@@ -4877,7 +4880,7 @@ ${sections}`
|
|
|
4877
4880
|
ensureIdKeyedLayout(codeName, agentId);
|
|
4878
4881
|
}
|
|
4879
4882
|
const agentDir = getAgentDir(codeName);
|
|
4880
|
-
const projectDir =
|
|
4883
|
+
const projectDir = getProjectDir2(codeName);
|
|
4881
4884
|
mkdirSync3(agentDir, { recursive: true });
|
|
4882
4885
|
mkdirSync3(projectDir, { recursive: true });
|
|
4883
4886
|
writeFileSync4(join3(agentDir, "registration.json"), JSON.stringify({
|
|
@@ -5254,7 +5257,7 @@ ${sections}`
|
|
|
5254
5257
|
return;
|
|
5255
5258
|
}
|
|
5256
5259
|
syncMcpToProject(codeName);
|
|
5257
|
-
const staleChannelsPath = join3(
|
|
5260
|
+
const staleChannelsPath = join3(getProjectDir2(codeName), ".mcp-channels.json");
|
|
5258
5261
|
if (existsSync4(staleChannelsPath)) {
|
|
5259
5262
|
try {
|
|
5260
5263
|
rmSync2(staleChannelsPath, { force: true });
|
|
@@ -5590,7 +5593,7 @@ ${sections}`
|
|
|
5590
5593
|
},
|
|
5591
5594
|
seedProfileConfig(codeName) {
|
|
5592
5595
|
const agentDir = getAgentDir(codeName);
|
|
5593
|
-
const projectDir =
|
|
5596
|
+
const projectDir = getProjectDir2(codeName);
|
|
5594
5597
|
mkdirSync3(join3(agentDir, "provision"), { recursive: true });
|
|
5595
5598
|
mkdirSync3(projectDir, { recursive: true });
|
|
5596
5599
|
},
|
|
@@ -5677,7 +5680,7 @@ ${sections}`
|
|
|
5677
5680
|
envUpdates[scoped] = value;
|
|
5678
5681
|
}
|
|
5679
5682
|
}
|
|
5680
|
-
Object.assign(envUpdates, syncGitHubBrokerCredentialTooling(
|
|
5683
|
+
Object.assign(envUpdates, syncGitHubBrokerCredentialTooling(getProjectDir2(codeName), decryptedIntegrations.some((i) => i.definition_id === "github" && i.credentialDelivery === "broker")));
|
|
5681
5684
|
writeEnvIntegrationsForAgent(codeName, {
|
|
5682
5685
|
mode: "replace-preserving",
|
|
5683
5686
|
updates: envUpdates
|
|
@@ -5734,7 +5737,7 @@ ${sections}`
|
|
|
5734
5737
|
}
|
|
5735
5738
|
const remoteOAuthProxyPaths = {
|
|
5736
5739
|
proxyPath: join3(getHomeDir(), ".augmented", "_mcp", "remote-oauth-proxy.js"),
|
|
5737
|
-
tokenFile: join3(
|
|
5740
|
+
tokenFile: join3(getProjectDir2(codeName), ".env.integrations")
|
|
5738
5741
|
};
|
|
5739
5742
|
for (const integration of integrations) {
|
|
5740
5743
|
const connectionKey = integration.connection_key;
|
|
@@ -5968,7 +5971,7 @@ ${sections}`
|
|
|
5968
5971
|
}
|
|
5969
5972
|
}
|
|
5970
5973
|
}
|
|
5971
|
-
const projectDir =
|
|
5974
|
+
const projectDir = getProjectDir2(codeName);
|
|
5972
5975
|
const claudeMdPath = join3(projectDir, "CLAUDE.md");
|
|
5973
5976
|
try {
|
|
5974
5977
|
const existing = readFileSync4(claudeMdPath, "utf-8");
|
|
@@ -6101,7 +6104,7 @@ ${sections}`
|
|
|
6101
6104
|
const READ_ONLY_MODE = 292;
|
|
6102
6105
|
const READ_WRITE_MODE = 420;
|
|
6103
6106
|
const agentDir = getAgentDir(codeName);
|
|
6104
|
-
const projectDir =
|
|
6107
|
+
const projectDir = getProjectDir2(codeName);
|
|
6105
6108
|
for (const baseDir of [join3(agentDir, "skills"), join3(projectDir, ".claude", "skills")]) {
|
|
6106
6109
|
const skillDir = join3(baseDir, skillId);
|
|
6107
6110
|
mkdirSync3(skillDir, { recursive: true });
|
|
@@ -6163,7 +6166,7 @@ ${sections}`
|
|
|
6163
6166
|
provisionPluginFull(codeName, plugin, contextValues, options) {
|
|
6164
6167
|
assertValidCodeName(codeName);
|
|
6165
6168
|
assertValidCodeName(plugin.slug);
|
|
6166
|
-
const projectDir =
|
|
6169
|
+
const projectDir = getProjectDir2(codeName);
|
|
6167
6170
|
const claudeDir = join3(projectDir, ".claude");
|
|
6168
6171
|
mkdirSync3(claudeDir, { recursive: true });
|
|
6169
6172
|
const sourceSpec = options?.scriptSource ?? `augmented-plugin:${plugin.slug}`;
|
|
@@ -6246,7 +6249,7 @@ ${sections}`
|
|
|
6246
6249
|
executePluginHook(ctx) {
|
|
6247
6250
|
assertValidCodeName(ctx.codeName);
|
|
6248
6251
|
const agentRootDir = join3(getHomeDir(), ".augmented", ctx.codeName);
|
|
6249
|
-
const projectDir =
|
|
6252
|
+
const projectDir = getProjectDir2(ctx.codeName);
|
|
6250
6253
|
mkdirSync3(agentRootDir, { recursive: true });
|
|
6251
6254
|
mkdirSync3(projectDir, { recursive: true });
|
|
6252
6255
|
const startedAt = Date.now();
|
|
@@ -6425,7 +6428,7 @@ function exchangeFailureKind(err) {
|
|
|
6425
6428
|
}
|
|
6426
6429
|
|
|
6427
6430
|
// src/lib/api-client.ts
|
|
6428
|
-
var agtCliVersion = true ? "0.28.
|
|
6431
|
+
var agtCliVersion = true ? "0.28.716" : "dev";
|
|
6429
6432
|
var lastConfigHash = null;
|
|
6430
6433
|
function setConfigHash(hash) {
|
|
6431
6434
|
lastConfigHash = hash && hash.length > 0 ? hash : null;
|
|
@@ -6735,8 +6738,8 @@ function writeFlagsCache(path, file) {
|
|
|
6735
6738
|
atomicWriteFileSync(path, `${JSON.stringify(file, null, 2)}
|
|
6736
6739
|
`);
|
|
6737
6740
|
}
|
|
6738
|
-
function flagsCacheAgeSeconds(
|
|
6739
|
-
const fromRecorded = Date.parse(
|
|
6741
|
+
function flagsCacheAgeSeconds(cache2, path, now = /* @__PURE__ */ new Date()) {
|
|
6742
|
+
const fromRecorded = Date.parse(cache2.updated_at);
|
|
6740
6743
|
if (!Number.isNaN(fromRecorded)) {
|
|
6741
6744
|
return Math.max(0, (now.getTime() - fromRecorded) / 1e3);
|
|
6742
6745
|
}
|
|
@@ -9287,6 +9290,288 @@ function describeWorkerModuleFailure(err) {
|
|
|
9287
9290
|
return `[startup] FATAL \u2014 the manager worker module failed to load, so this process will never poll. The pidfile it already wrote would otherwise make it look like a healthy manager forever (ENG-9129). Exiting so the supervisor can react. Cause: ${detail}`;
|
|
9288
9291
|
}
|
|
9289
9292
|
|
|
9293
|
+
// src/lib/drain-transcript-flush.ts
|
|
9294
|
+
import { existsSync as existsSync8, readdirSync as readdirSync2 } from "fs";
|
|
9295
|
+
import { homedir as homedir5 } from "os";
|
|
9296
|
+
import { dirname as dirname6, join as join8, relative as relative2, sep } from "path";
|
|
9297
|
+
import { spawn as spawn2 } from "child_process";
|
|
9298
|
+
|
|
9299
|
+
// src/lib/host-archive-address.ts
|
|
9300
|
+
import { readFileSync as readFileSync9 } from "fs";
|
|
9301
|
+
var DEFAULT_ARCHIVE_ADDRESS_PATH = "/var/lib/augmented/session-archive-address.json";
|
|
9302
|
+
var CACHE_TTL_MS = 5 * 60 * 1e3;
|
|
9303
|
+
var cache = /* @__PURE__ */ new Map();
|
|
9304
|
+
function str(value) {
|
|
9305
|
+
if (typeof value !== "string") return null;
|
|
9306
|
+
const trimmed = value.trim();
|
|
9307
|
+
return trimmed.length > 0 ? trimmed : null;
|
|
9308
|
+
}
|
|
9309
|
+
function readHostArchiveAddress(path) {
|
|
9310
|
+
const file = path ?? process.env["ARCHIVE_ADDRESS_FILE"]?.trim() ?? process.env["AGT_SESSION_ARCHIVE_ADDRESS_FILE"]?.trim() ?? DEFAULT_ARCHIVE_ADDRESS_PATH;
|
|
9311
|
+
const now = Date.now();
|
|
9312
|
+
const hit = cache.get(file);
|
|
9313
|
+
if (hit && now - hit.at < CACHE_TTL_MS) return hit.value;
|
|
9314
|
+
let value = null;
|
|
9315
|
+
try {
|
|
9316
|
+
const raw = readFileSync9(file, "utf-8");
|
|
9317
|
+
const parsed = JSON.parse(raw);
|
|
9318
|
+
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
9319
|
+
const obj = parsed;
|
|
9320
|
+
const bucket = str(obj["bucket"]);
|
|
9321
|
+
const keyPrefix = str(obj["key_prefix"]);
|
|
9322
|
+
if (bucket && keyPrefix) {
|
|
9323
|
+
value = {
|
|
9324
|
+
bucket,
|
|
9325
|
+
region: str(obj["region"]),
|
|
9326
|
+
instanceId: str(obj["instance_id"]),
|
|
9327
|
+
keyPrefix
|
|
9328
|
+
};
|
|
9329
|
+
}
|
|
9330
|
+
}
|
|
9331
|
+
} catch {
|
|
9332
|
+
value = null;
|
|
9333
|
+
}
|
|
9334
|
+
cache.set(file, { at: now, value });
|
|
9335
|
+
return value;
|
|
9336
|
+
}
|
|
9337
|
+
|
|
9338
|
+
// src/lib/drain-transcript-flush.ts
|
|
9339
|
+
function sessionsBaseDir() {
|
|
9340
|
+
return join8(homedir5(), ".claude", "projects");
|
|
9341
|
+
}
|
|
9342
|
+
var PER_FILE_UPLOAD_TIMEOUT_MS = 3e4;
|
|
9343
|
+
var UPLOAD_CONCURRENCY = 4;
|
|
9344
|
+
var DRAIN_MANIFEST_VERSION = 1;
|
|
9345
|
+
var DRAIN_MANIFEST_FILENAME = "_augmented-drain-manifest.json";
|
|
9346
|
+
function listJsonlFiles(dir) {
|
|
9347
|
+
if (!existsSync8(dir)) return [];
|
|
9348
|
+
const out = [];
|
|
9349
|
+
const walk = (d) => {
|
|
9350
|
+
for (const entry of readdirSync2(d, { withFileTypes: true })) {
|
|
9351
|
+
const full = join8(d, entry.name);
|
|
9352
|
+
if (entry.isDirectory()) walk(full);
|
|
9353
|
+
else if (entry.isFile() && entry.name.endsWith(".jsonl")) out.push(full);
|
|
9354
|
+
}
|
|
9355
|
+
};
|
|
9356
|
+
try {
|
|
9357
|
+
walk(dir);
|
|
9358
|
+
} catch {
|
|
9359
|
+
}
|
|
9360
|
+
return out;
|
|
9361
|
+
}
|
|
9362
|
+
function transcriptObjectKey(keyPrefix, baseDir, file) {
|
|
9363
|
+
const rel = relative2(baseDir, file).split(sep).join("/");
|
|
9364
|
+
if (!rel || rel.startsWith("../") || rel === "..") return null;
|
|
9365
|
+
return `${keyPrefix.replace(/\/+$/, "")}/${rel}`;
|
|
9366
|
+
}
|
|
9367
|
+
function drainManifestObjectKey(keyPrefix, baseDir, transcriptDir) {
|
|
9368
|
+
return transcriptObjectKey(keyPrefix, baseDir, join8(transcriptDir, DRAIN_MANIFEST_FILENAME));
|
|
9369
|
+
}
|
|
9370
|
+
async function flushAgentTranscriptsOnDrain(codeName, deps) {
|
|
9371
|
+
const dir = deps.resolveTranscriptDir(codeName);
|
|
9372
|
+
const files = deps.listTranscripts(dir);
|
|
9373
|
+
if (files.length === 0) {
|
|
9374
|
+
return {
|
|
9375
|
+
status: "no-transcripts",
|
|
9376
|
+
uploaded: 0,
|
|
9377
|
+
failed: 0,
|
|
9378
|
+
total: 0,
|
|
9379
|
+
manifest: "skipped",
|
|
9380
|
+
manifestKey: null
|
|
9381
|
+
};
|
|
9382
|
+
}
|
|
9383
|
+
const address = deps.readAddress();
|
|
9384
|
+
if (!address || !address.bucket || !address.keyPrefix) {
|
|
9385
|
+
deps.log(
|
|
9386
|
+
`[drain-flush] NO S3 ADDRESS for '${codeName}' \u2014 ${files.length} transcript file(s) will NOT be shipped before teardown; this session may be lost (ENG-9491). The host archive address is unresolved (agt-session-archiver has published none).`
|
|
9387
|
+
);
|
|
9388
|
+
return {
|
|
9389
|
+
status: "no-address",
|
|
9390
|
+
uploaded: 0,
|
|
9391
|
+
failed: files.length,
|
|
9392
|
+
total: files.length,
|
|
9393
|
+
manifest: "skipped",
|
|
9394
|
+
manifestKey: null
|
|
9395
|
+
};
|
|
9396
|
+
}
|
|
9397
|
+
const { bucket, keyPrefix, region } = address;
|
|
9398
|
+
let uploaded = 0;
|
|
9399
|
+
let failed = 0;
|
|
9400
|
+
const keys = [];
|
|
9401
|
+
const missing = [];
|
|
9402
|
+
let cursor = 0;
|
|
9403
|
+
const worker = async () => {
|
|
9404
|
+
for (; ; ) {
|
|
9405
|
+
const i = cursor;
|
|
9406
|
+
cursor += 1;
|
|
9407
|
+
if (i >= files.length) return;
|
|
9408
|
+
const file = files[i];
|
|
9409
|
+
const key = transcriptObjectKey(keyPrefix, deps.baseDir, file);
|
|
9410
|
+
if (!key) {
|
|
9411
|
+
failed += 1;
|
|
9412
|
+
missing.push(file);
|
|
9413
|
+
deps.log(
|
|
9414
|
+
`[drain-flush] SKIP '${file}' for '${codeName}' \u2014 outside sessions base dir '${deps.baseDir}', cannot key it (ENG-9491)`
|
|
9415
|
+
);
|
|
9416
|
+
continue;
|
|
9417
|
+
}
|
|
9418
|
+
const res = await deps.uploadFile({ file, bucket, key, region });
|
|
9419
|
+
if (res.ok) {
|
|
9420
|
+
uploaded += 1;
|
|
9421
|
+
keys.push(key);
|
|
9422
|
+
} else {
|
|
9423
|
+
failed += 1;
|
|
9424
|
+
missing.push(file);
|
|
9425
|
+
deps.log(
|
|
9426
|
+
`[drain-flush] UPLOAD FAILED for '${codeName}' '${file}' \u2192 s3://${bucket}/${key}: ${res.detail} (ENG-9491)`
|
|
9427
|
+
);
|
|
9428
|
+
}
|
|
9429
|
+
}
|
|
9430
|
+
};
|
|
9431
|
+
await Promise.all(
|
|
9432
|
+
Array.from({ length: Math.min(UPLOAD_CONCURRENCY, files.length) }, () => worker())
|
|
9433
|
+
);
|
|
9434
|
+
const uploadStatus = failed === 0 ? "flushed" : uploaded === 0 ? "failed" : "partial";
|
|
9435
|
+
if (uploadStatus !== "flushed") {
|
|
9436
|
+
deps.log(
|
|
9437
|
+
`[drain-flush] INCOMPLETE for '${codeName}': ${uploaded}/${files.length} transcript file(s) shipped, ${failed} FAILED before teardown \u2014 session data may be lost (ENG-9491).`
|
|
9438
|
+
);
|
|
9439
|
+
}
|
|
9440
|
+
const { manifest, manifestKey } = await writeDrainManifest(codeName, deps, {
|
|
9441
|
+
bucket,
|
|
9442
|
+
keyPrefix,
|
|
9443
|
+
region,
|
|
9444
|
+
transcriptDir: dir,
|
|
9445
|
+
keys,
|
|
9446
|
+
missing,
|
|
9447
|
+
complete: failed === 0
|
|
9448
|
+
});
|
|
9449
|
+
const status = uploadStatus === "flushed" && manifest !== "written" ? "no-manifest" : uploadStatus;
|
|
9450
|
+
return { status, uploaded, failed, total: files.length, manifest, manifestKey };
|
|
9451
|
+
}
|
|
9452
|
+
async function writeDrainManifest(codeName, deps, ctx) {
|
|
9453
|
+
const manifestKey = drainManifestObjectKey(ctx.keyPrefix, deps.baseDir, ctx.transcriptDir);
|
|
9454
|
+
if (!manifestKey) {
|
|
9455
|
+
deps.log(
|
|
9456
|
+
`[drain-flush] NO MANIFEST for '${codeName}' \u2014 transcript dir '${ctx.transcriptDir}' is outside sessions base dir '${deps.baseDir}', so no manifest key could be computed. Any shipped object is UNRESTORABLE: nothing records the session pin or the source layout (ENG-9566).`
|
|
9457
|
+
);
|
|
9458
|
+
return { manifest: "unkeyable", manifestKey: null };
|
|
9459
|
+
}
|
|
9460
|
+
let layout = null;
|
|
9461
|
+
try {
|
|
9462
|
+
layout = deps.readSourceLayout(codeName);
|
|
9463
|
+
} catch (err) {
|
|
9464
|
+
deps.log(
|
|
9465
|
+
`[drain-flush] could not resolve source layout for '${codeName}': ${err.message} \u2014 manifest will record it as unknown (ENG-9566)`
|
|
9466
|
+
);
|
|
9467
|
+
}
|
|
9468
|
+
let sessionPin = null;
|
|
9469
|
+
try {
|
|
9470
|
+
sessionPin = deps.readSessionPin(codeName);
|
|
9471
|
+
} catch (err) {
|
|
9472
|
+
deps.log(
|
|
9473
|
+
`[drain-flush] could not read the session pin for '${codeName}': ${err.message} \u2014 a restore will not be able to identify the live conversation (ENG-9566)`
|
|
9474
|
+
);
|
|
9475
|
+
}
|
|
9476
|
+
const manifestBody = {
|
|
9477
|
+
version: DRAIN_MANIFEST_VERSION,
|
|
9478
|
+
codeName,
|
|
9479
|
+
writtenAt: deps.now().toISOString(),
|
|
9480
|
+
sourceLayout: layout?.layout ?? null,
|
|
9481
|
+
sourceAgentDir: layout?.agentDir ?? null,
|
|
9482
|
+
sourceTranscriptDir: ctx.transcriptDir,
|
|
9483
|
+
sourceBaseDir: deps.baseDir,
|
|
9484
|
+
bucket: ctx.bucket,
|
|
9485
|
+
keyPrefix: ctx.keyPrefix,
|
|
9486
|
+
keys: ctx.keys,
|
|
9487
|
+
missing: ctx.missing,
|
|
9488
|
+
complete: ctx.complete,
|
|
9489
|
+
sessionPin
|
|
9490
|
+
};
|
|
9491
|
+
const res = await deps.uploadManifest({
|
|
9492
|
+
body: `${JSON.stringify(manifestBody, null, 2)}
|
|
9493
|
+
`,
|
|
9494
|
+
bucket: ctx.bucket,
|
|
9495
|
+
key: manifestKey,
|
|
9496
|
+
region: ctx.region
|
|
9497
|
+
});
|
|
9498
|
+
if (!res.ok) {
|
|
9499
|
+
deps.log(
|
|
9500
|
+
`[drain-flush] MANIFEST UPLOAD FAILED for '${codeName}' \u2192 s3://${ctx.bucket}/${manifestKey}: ${res.detail}. ${ctx.keys.length} shipped object(s) are UNRESTORABLE without it (ENG-9566).`
|
|
9501
|
+
);
|
|
9502
|
+
return { manifest: "failed", manifestKey: null };
|
|
9503
|
+
}
|
|
9504
|
+
return { manifest: "written", manifestKey };
|
|
9505
|
+
}
|
|
9506
|
+
function drainTranscriptFlushDeps(log2) {
|
|
9507
|
+
return {
|
|
9508
|
+
resolveTranscriptDir: (codeName) => sessionTranscriptDir(getProjectDir(codeName)),
|
|
9509
|
+
readAddress: () => readHostArchiveAddress(),
|
|
9510
|
+
listTranscripts: listJsonlFiles,
|
|
9511
|
+
baseDir: sessionsBaseDir(),
|
|
9512
|
+
now: () => /* @__PURE__ */ new Date(),
|
|
9513
|
+
// ENG-9566: derive the layout from the seam's OUTPUT rather than re-running
|
|
9514
|
+
// its lstat. getProjectDir already resolved the codename symlink (or didn't);
|
|
9515
|
+
// if what came back is not under the codename dir, this host is id-keyed.
|
|
9516
|
+
// Observing the resolver keeps a second copy of ADR-0049's rule out of the
|
|
9517
|
+
// tree — the thing host-archive-address.ts's header warns about.
|
|
9518
|
+
readSourceLayout: (codeName) => {
|
|
9519
|
+
const agentDir = dirname6(getProjectDir(codeName));
|
|
9520
|
+
const codeNameDir = join8(homedir5(), ".augmented", codeName);
|
|
9521
|
+
return { layout: agentDir === codeNameDir ? "codename-keyed" : "id-keyed", agentDir };
|
|
9522
|
+
},
|
|
9523
|
+
readSessionPin: (codeName) => readDailySessionPin(codeName),
|
|
9524
|
+
uploadFile: ({ file, bucket, key, region }) => runAwsCp(awsCpArgs(file, bucket, key, region), null),
|
|
9525
|
+
uploadManifest: ({ body, bucket, key, region }) => (
|
|
9526
|
+
// `-` is `aws s3 cp`'s stdin source, so the manifest never touches disk.
|
|
9527
|
+
runAwsCp(
|
|
9528
|
+
[...awsCpArgs("-", bucket, key, region), "--content-type", "application/json"],
|
|
9529
|
+
body
|
|
9530
|
+
)
|
|
9531
|
+
),
|
|
9532
|
+
log: log2
|
|
9533
|
+
};
|
|
9534
|
+
}
|
|
9535
|
+
function awsCpArgs(source, bucket, key, region) {
|
|
9536
|
+
const args = ["s3", "cp", source, `s3://${bucket}/${key}`, "--only-show-errors"];
|
|
9537
|
+
if (region) args.push("--region", region);
|
|
9538
|
+
return args;
|
|
9539
|
+
}
|
|
9540
|
+
function runAwsCp(args, body) {
|
|
9541
|
+
return new Promise((resolve) => {
|
|
9542
|
+
const child = spawn2("aws", args, {
|
|
9543
|
+
stdio: [body === null ? "ignore" : "pipe", "ignore", "pipe"]
|
|
9544
|
+
});
|
|
9545
|
+
let stderr = "";
|
|
9546
|
+
let settled = false;
|
|
9547
|
+
const finish = (r) => {
|
|
9548
|
+
if (settled) return;
|
|
9549
|
+
settled = true;
|
|
9550
|
+
clearTimeout(timer);
|
|
9551
|
+
resolve(r);
|
|
9552
|
+
};
|
|
9553
|
+
const timer = setTimeout(() => {
|
|
9554
|
+
child.kill("SIGKILL");
|
|
9555
|
+
finish({ ok: false, detail: `aws s3 cp timed out after ${PER_FILE_UPLOAD_TIMEOUT_MS}ms` });
|
|
9556
|
+
}, PER_FILE_UPLOAD_TIMEOUT_MS);
|
|
9557
|
+
child.stderr?.on("data", (d) => {
|
|
9558
|
+
stderr += String(d);
|
|
9559
|
+
});
|
|
9560
|
+
child.on("error", (err) => finish({ ok: false, detail: err.message }));
|
|
9561
|
+
child.on(
|
|
9562
|
+
"close",
|
|
9563
|
+
(code) => finish(
|
|
9564
|
+
code === 0 ? { ok: true, detail: "" } : { ok: false, detail: stderr.trim().slice(0, 500) || `aws exited with code ${code ?? "null"}` }
|
|
9565
|
+
)
|
|
9566
|
+
);
|
|
9567
|
+
if (body !== null) {
|
|
9568
|
+
child.stdin?.on("error", () => {
|
|
9569
|
+
});
|
|
9570
|
+
child.stdin?.end(body);
|
|
9571
|
+
}
|
|
9572
|
+
});
|
|
9573
|
+
}
|
|
9574
|
+
|
|
9290
9575
|
// src/lib/self-update-pin.ts
|
|
9291
9576
|
function isValidPinVersion(v) {
|
|
9292
9577
|
return PIN_VERSION_RE.test(v);
|
|
@@ -9319,25 +9604,25 @@ function decidePin(opts) {
|
|
|
9319
9604
|
|
|
9320
9605
|
// src/commands/manager.ts
|
|
9321
9606
|
import chalk3 from "chalk";
|
|
9322
|
-
import { existsSync as
|
|
9323
|
-
import { join as
|
|
9324
|
-
import { homedir as
|
|
9325
|
-
import { spawn as
|
|
9607
|
+
import { existsSync as existsSync10, realpathSync as realpathSync2 } from "fs";
|
|
9608
|
+
import { join as join10 } from "path";
|
|
9609
|
+
import { homedir as homedir6, userInfo } from "os";
|
|
9610
|
+
import { spawn as spawn4 } from "child_process";
|
|
9326
9611
|
|
|
9327
9612
|
// src/lib/watchdog.ts
|
|
9328
|
-
import { readFileSync as
|
|
9329
|
-
import { join as
|
|
9330
|
-
import { spawn as
|
|
9331
|
-
var DEFAULT_CONFIG_DIR =
|
|
9613
|
+
import { readFileSync as readFileSync10, writeFileSync as writeFileSync6, unlinkSync as unlinkSync4, existsSync as existsSync9, mkdirSync as mkdirSync6, openSync as openSync2, closeSync as closeSync2, chmodSync as chmodSync5 } from "fs";
|
|
9614
|
+
import { join as join9 } from "path";
|
|
9615
|
+
import { spawn as spawn3, execFileSync as execFileSync3 } from "child_process";
|
|
9616
|
+
var DEFAULT_CONFIG_DIR = join9(process.env["HOME"] ?? "/tmp", ".augmented");
|
|
9332
9617
|
function getManagerPaths(configDir) {
|
|
9333
9618
|
return {
|
|
9334
|
-
pidFile:
|
|
9335
|
-
stateFile:
|
|
9336
|
-
logFile:
|
|
9619
|
+
pidFile: join9(configDir, "manager.pid"),
|
|
9620
|
+
stateFile: join9(configDir, "manager-state.json"),
|
|
9621
|
+
logFile: join9(configDir, "manager.log")
|
|
9337
9622
|
};
|
|
9338
9623
|
}
|
|
9339
9624
|
function ensureDir(configDir) {
|
|
9340
|
-
if (!
|
|
9625
|
+
if (!existsSync9(configDir)) {
|
|
9341
9626
|
mkdirSync6(configDir, { recursive: true });
|
|
9342
9627
|
}
|
|
9343
9628
|
}
|
|
@@ -9347,7 +9632,7 @@ function writePidFile(configDir, pid) {
|
|
|
9347
9632
|
}
|
|
9348
9633
|
function readPidFile(configDir) {
|
|
9349
9634
|
try {
|
|
9350
|
-
const raw =
|
|
9635
|
+
const raw = readFileSync10(getManagerPaths(configDir).pidFile, "utf-8").trim();
|
|
9351
9636
|
const pid = parseInt(raw, 10);
|
|
9352
9637
|
return isNaN(pid) ? null : pid;
|
|
9353
9638
|
} catch {
|
|
@@ -9393,7 +9678,7 @@ function defaultPgrep() {
|
|
|
9393
9678
|
}
|
|
9394
9679
|
function readStateFile(configDir) {
|
|
9395
9680
|
try {
|
|
9396
|
-
const raw =
|
|
9681
|
+
const raw = readFileSync10(getManagerPaths(configDir).stateFile, "utf-8");
|
|
9397
9682
|
return JSON.parse(raw);
|
|
9398
9683
|
} catch {
|
|
9399
9684
|
return null;
|
|
@@ -9431,7 +9716,7 @@ function startWatchdog(opts) {
|
|
|
9431
9716
|
} catch {
|
|
9432
9717
|
}
|
|
9433
9718
|
const intervalSec = String(Math.max(Math.floor(opts.intervalMs / 1e3), 5));
|
|
9434
|
-
const child =
|
|
9719
|
+
const child = spawn3(
|
|
9435
9720
|
process.execPath,
|
|
9436
9721
|
[process.argv[1], "manager", "start", "--interval", intervalSec, "--config-dir", configDir, "--supervise"],
|
|
9437
9722
|
{
|
|
@@ -9449,7 +9734,7 @@ function startWatchdog(opts) {
|
|
|
9449
9734
|
const deadline = Date.now() + 5e3;
|
|
9450
9735
|
const sleepBuf = new Int32Array(new SharedArrayBuffer(4));
|
|
9451
9736
|
while (Date.now() < deadline) {
|
|
9452
|
-
if (
|
|
9737
|
+
if (existsSync9(pidFile)) {
|
|
9453
9738
|
return { pid: child.pid };
|
|
9454
9739
|
}
|
|
9455
9740
|
if (child.exitCode !== null) {
|
|
@@ -9555,7 +9840,7 @@ function normalizePinInEnv(env) {
|
|
|
9555
9840
|
function managerStartCommand(opts) {
|
|
9556
9841
|
const json = isJsonMode();
|
|
9557
9842
|
if (!process.env.HOME || !process.env.HOME.trim()) {
|
|
9558
|
-
const fallback =
|
|
9843
|
+
const fallback = homedir6();
|
|
9559
9844
|
process.env.HOME = fallback;
|
|
9560
9845
|
if (!json) {
|
|
9561
9846
|
info(`HOME was not set in the manager env \u2014 defaulting to ${fallback}.`);
|
|
@@ -9589,7 +9874,7 @@ function managerStartCommand(opts) {
|
|
|
9589
9874
|
process.exitCode = 1;
|
|
9590
9875
|
return;
|
|
9591
9876
|
}
|
|
9592
|
-
const configDir = opts.configDir ??
|
|
9877
|
+
const configDir = opts.configDir ?? join10(homedir6(), ".augmented");
|
|
9593
9878
|
if (opts.supervise) {
|
|
9594
9879
|
if (json) {
|
|
9595
9880
|
jsonOutput({ ok: false, error: "--supervise is not supported with --json" });
|
|
@@ -9644,7 +9929,7 @@ function runSupervisorLoop(intervalSec, configDir) {
|
|
|
9644
9929
|
process.on("SIGINT", forwardOrExit("SIGINT"));
|
|
9645
9930
|
const runOne = () => {
|
|
9646
9931
|
respawnTimer = null;
|
|
9647
|
-
currentChild =
|
|
9932
|
+
currentChild = spawn4(
|
|
9648
9933
|
process.execPath,
|
|
9649
9934
|
[process.argv[1], "manager", "start", "--interval", String(intervalSec), "--config-dir", configDir],
|
|
9650
9935
|
{ stdio: "inherit", env: process.env }
|
|
@@ -9685,7 +9970,7 @@ function runSupervisorLoop(intervalSec, configDir) {
|
|
|
9685
9970
|
}
|
|
9686
9971
|
async function managerStopCommand(opts = {}) {
|
|
9687
9972
|
const json = isJsonMode();
|
|
9688
|
-
const configDir = opts.configDir ??
|
|
9973
|
+
const configDir = opts.configDir ?? join10(homedir6(), ".augmented");
|
|
9689
9974
|
try {
|
|
9690
9975
|
const result = await stopWatchdog(configDir);
|
|
9691
9976
|
if (!result.stopped && !result.pid) {
|
|
@@ -9713,7 +9998,7 @@ async function managerStopCommand(opts = {}) {
|
|
|
9713
9998
|
}
|
|
9714
9999
|
function managerStatusCommand(opts = {}) {
|
|
9715
10000
|
const json = isJsonMode();
|
|
9716
|
-
const configDir = opts.configDir ??
|
|
10001
|
+
const configDir = opts.configDir ?? join10(homedir6(), ".augmented");
|
|
9717
10002
|
const status = getManagerStatus(configDir);
|
|
9718
10003
|
if (!status) {
|
|
9719
10004
|
if (json) {
|
|
@@ -9785,7 +10070,7 @@ function resolveStableAgtBin(rawPath) {
|
|
|
9785
10070
|
if (!prefix || !formula) return rawPath;
|
|
9786
10071
|
const candidates = [`${prefix}/bin/${formula}`, `${prefix}/bin/agt`];
|
|
9787
10072
|
for (const candidate of candidates) {
|
|
9788
|
-
if (!
|
|
10073
|
+
if (!existsSync10(candidate)) continue;
|
|
9789
10074
|
try {
|
|
9790
10075
|
realpathSync2(candidate);
|
|
9791
10076
|
return candidate;
|
|
@@ -9805,7 +10090,7 @@ async function managerInstallCommand(opts = {}) {
|
|
|
9805
10090
|
process.exitCode = 1;
|
|
9806
10091
|
return;
|
|
9807
10092
|
}
|
|
9808
|
-
const configDir = opts.configDir ??
|
|
10093
|
+
const configDir = opts.configDir ?? join10(homedir6(), ".augmented");
|
|
9809
10094
|
const rawAgtBin = process.argv[1];
|
|
9810
10095
|
if (!rawAgtBin) {
|
|
9811
10096
|
const msg = "Could not resolve the agt binary path from argv. Re-run via the installed `agt` command.";
|
|
@@ -9816,9 +10101,9 @@ async function managerInstallCommand(opts = {}) {
|
|
|
9816
10101
|
}
|
|
9817
10102
|
const agtBin = resolveStableAgtBin(rawAgtBin);
|
|
9818
10103
|
if (process.platform === "darwin") {
|
|
9819
|
-
const home =
|
|
10104
|
+
const home = homedir6();
|
|
9820
10105
|
const protectedRoots = ["Documents", "Downloads", "Desktop", "Movies", "Music", "Pictures"];
|
|
9821
|
-
const offending = protectedRoots.map((r) =>
|
|
10106
|
+
const offending = protectedRoots.map((r) => join10(home, r)).find((p) => agtBin === p || agtBin.startsWith(`${p}/`));
|
|
9822
10107
|
if (offending) {
|
|
9823
10108
|
const msg = `agt binary at ${agtBin} sits inside a macOS TCC-protected folder (${offending}). launchd-spawned processes cannot read files there and the manager would EPERM on startup. Either install agt globally (\`npm install -g @integrity-labs/agt-cli\`) or copy the dist outside protected folders before running this command.`;
|
|
9824
10109
|
if (json) jsonOutput({ ok: false, error: msg });
|
|
@@ -9831,7 +10116,7 @@ async function managerInstallCommand(opts = {}) {
|
|
|
9831
10116
|
AGT_HOST: getHost(),
|
|
9832
10117
|
// ?? alone wouldn't catch `HOME=""` from a stripped systemd env.
|
|
9833
10118
|
// Treat empty / whitespace-only as missing.
|
|
9834
|
-
HOME: process.env.HOME?.trim() ||
|
|
10119
|
+
HOME: process.env.HOME?.trim() || homedir6(),
|
|
9835
10120
|
USER: process.env.USER?.trim() || userInfo().username
|
|
9836
10121
|
};
|
|
9837
10122
|
const apiKey = getApiKey();
|
|
@@ -9887,7 +10172,7 @@ async function managerInstallSystemUnitCommand(opts = {}) {
|
|
|
9887
10172
|
return;
|
|
9888
10173
|
}
|
|
9889
10174
|
const user = opts.user ?? "root";
|
|
9890
|
-
const configDir = opts.configDir ?? (user === "root" ? "/root/.augmented" :
|
|
10175
|
+
const configDir = opts.configDir ?? (user === "root" ? "/root/.augmented" : join10("/home", user, ".augmented"));
|
|
9891
10176
|
const rawAgtBin = process.argv[1];
|
|
9892
10177
|
if (!rawAgtBin) {
|
|
9893
10178
|
const msg = "Could not resolve the agt binary path from argv. Re-run via the installed `agt` command.";
|
|
@@ -10164,6 +10449,10 @@ export {
|
|
|
10164
10449
|
gatherSessionToolBindProbe,
|
|
10165
10450
|
provision,
|
|
10166
10451
|
describeStartupCompletion,
|
|
10452
|
+
readHostArchiveAddress,
|
|
10453
|
+
DRAIN_MANIFEST_FILENAME,
|
|
10454
|
+
flushAgentTranscriptsOnDrain,
|
|
10455
|
+
drainTranscriptFlushDeps,
|
|
10167
10456
|
executeConnectivityProbe,
|
|
10168
10457
|
isValidPinVersion,
|
|
10169
10458
|
resolveEffectivePinRaw,
|
|
@@ -10181,4 +10470,4 @@ export {
|
|
|
10181
10470
|
managerInstallSystemUnitCommand,
|
|
10182
10471
|
managerUninstallSystemUnitCommand
|
|
10183
10472
|
};
|
|
10184
|
-
//# sourceMappingURL=chunk-
|
|
10473
|
+
//# sourceMappingURL=chunk-OOYUWMTR.js.map
|