@sentropic/h2a-runtime 0.90.2 → 0.90.3
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/index.d.ts.map +1 -1
- package/dist/index.js +69 -20
- package/dist/index.js.map +1 -1
- package/dist/prompt-delivery.d.ts +9 -0
- package/dist/prompt-delivery.d.ts.map +1 -1
- package/dist/prompt-delivery.js +30 -3
- package/dist/prompt-delivery.js.map +1 -1
- package/dist/relaunch.d.ts +74 -10
- package/dist/relaunch.d.ts.map +1 -1
- package/dist/relaunch.js +120 -18
- package/dist/relaunch.js.map +1 -1
- package/dist/restore.d.ts +17 -22
- package/dist/restore.d.ts.map +1 -1
- package/dist/restore.js +62 -33
- package/dist/restore.js.map +1 -1
- package/dist/session-class.d.ts +12 -0
- package/dist/session-class.d.ts.map +1 -1
- package/dist/session-class.js +15 -0
- package/dist/session-class.js.map +1 -1
- package/dist/tmux.d.ts +7 -3
- package/dist/tmux.d.ts.map +1 -1
- package/dist/tmux.js +22 -5
- package/dist/tmux.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAkIA,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAQ7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -21,8 +21,9 @@ import { buildLaunchContext } from "./launch-context.js";
|
|
|
21
21
|
import { migrateTmuxNames } from "./tmux-name-migration.js";
|
|
22
22
|
import { projectStatusForH2a } from "./status-projection.js";
|
|
23
23
|
import { buildAgentLaunchArgs, isAgentLaunchEffort, isAgentLaunchProfile, } from "./agent-launch-args.js";
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
24
|
+
import { deriveSessionClass } from "./session-class.js";
|
|
25
|
+
import { isRelaunchKillable, planRelaunch, relaunchContinuationPrompt, wakeRelaunchedSession, } from "./relaunch.js";
|
|
26
|
+
import { isHumanFacingSession, legacySessionEvidence, readConversationCustomTitle, readLastLayout, reconcileRunConvIds, restore as restoreLayout, } from "./restore.js";
|
|
26
27
|
import { getLayoutConfig } from "./config.js";
|
|
27
28
|
import { advanceJob, coerceRegistryTool, enroll, enrollFromRun, isLive, listJobs, listLocalForLs, loadRegistry, loadRegistryWithDiagnostics, resolveLocalTmuxSessionForName, tryClaimSlot, withRegistryLock, resolveRegistryPath, } from "./registry.js";
|
|
28
29
|
import { auditSessionLeaseFleet, countLiveSessionLeases, SessionLeaseStore, decideSessionBeat, isSessionLeaseAlive, isSessionLeaseAbandoned, isSessionLeaseDeadBoot, planLeaseSupervision, reclaimProposals, resolveSessionLeasePath, } from "./session-lease.js";
|
|
@@ -1505,13 +1506,14 @@ function registryEntriesForLocalTmuxTarget(target, local, entries = loadRegistry
|
|
|
1505
1506
|
});
|
|
1506
1507
|
}
|
|
1507
1508
|
function registryEntryForResumeTarget(target, local) {
|
|
1509
|
+
const evidence = legacySessionEvidence(homedir(), local === undefined ? listLocalSessions() : [local]);
|
|
1508
1510
|
const matches = registryEntriesForLocalTmuxTarget(target, local).filter((e) => {
|
|
1509
1511
|
// Resume is a human-facing operation, not a promotion path. Share the
|
|
1510
1512
|
// durable class test with restore so legacy human rows remain resumable,
|
|
1511
1513
|
// while delegated jobs and explicit background launches stay excluded.
|
|
1512
1514
|
if (e.role !== undefined)
|
|
1513
1515
|
return false;
|
|
1514
|
-
return isHumanFacingSession(e);
|
|
1516
|
+
return isHumanFacingSession(e, evidence);
|
|
1515
1517
|
});
|
|
1516
1518
|
const ids = new Set(matches.map((e) => e.id));
|
|
1517
1519
|
if (ids.size !== 1)
|
|
@@ -3395,6 +3397,15 @@ export async function main(argv) {
|
|
|
3395
3397
|
process.exitCode = 1;
|
|
3396
3398
|
return;
|
|
3397
3399
|
}
|
|
3400
|
+
let gatewayMode;
|
|
3401
|
+
try {
|
|
3402
|
+
gatewayMode = gatewayModeFromOptions(opts);
|
|
3403
|
+
}
|
|
3404
|
+
catch (error) {
|
|
3405
|
+
process.stderr.write(`[h2a] ${error.message}.\n`);
|
|
3406
|
+
process.exitCode = 1;
|
|
3407
|
+
return;
|
|
3408
|
+
}
|
|
3398
3409
|
const target = slug ?? slugify(process.cwd());
|
|
3399
3410
|
const localResolution = resolveLocalSession(target);
|
|
3400
3411
|
if (localResolution.kind === "ambiguous") {
|
|
@@ -3460,15 +3471,6 @@ export async function main(argv) {
|
|
|
3460
3471
|
return;
|
|
3461
3472
|
}
|
|
3462
3473
|
const profile = entry.tool;
|
|
3463
|
-
let gatewayMode;
|
|
3464
|
-
try {
|
|
3465
|
-
gatewayMode = gatewayModeFromOptions(opts);
|
|
3466
|
-
}
|
|
3467
|
-
catch (error) {
|
|
3468
|
-
process.stderr.write(`[h2a] ${error.message}.\n`);
|
|
3469
|
-
process.exitCode = 1;
|
|
3470
|
-
return;
|
|
3471
|
-
}
|
|
3472
3474
|
if (gatewayMode === "gateway" && !profileUsesLlmMeshGateway(profile)) {
|
|
3473
3475
|
process.stderr.write(`[h2a] --llm-gateway/--gw is unsupported for ${profile}; this gateway is Anthropic-compatible and only Claude profiles consume it.\n`);
|
|
3474
3476
|
process.exitCode = 2;
|
|
@@ -3591,13 +3593,19 @@ export async function main(argv) {
|
|
|
3591
3593
|
}
|
|
3592
3594
|
}
|
|
3593
3595
|
gateway = await injectLlmMeshGatewayEnv(effectiveGatewayMode, true, localSessionName(resumeSlug));
|
|
3594
|
-
const
|
|
3596
|
+
const sessionClass = deriveSessionClass({
|
|
3597
|
+
background: opts.attach !== true,
|
|
3598
|
+
humanTerminal: opts.attach === true &&
|
|
3599
|
+
process.stdin.isTTY === true &&
|
|
3600
|
+
process.stdout.isTTY === true,
|
|
3601
|
+
});
|
|
3602
|
+
const { name } = startLocalSession(profile, command, entry.cwd, args, resumeSlug, undefined, { sessionClass, attachedTerminal: true });
|
|
3595
3603
|
enrollFromRun({
|
|
3596
3604
|
profile,
|
|
3597
3605
|
slug: resumeSlug,
|
|
3598
3606
|
tmuxSession: name,
|
|
3599
3607
|
cwd: entry.cwd,
|
|
3600
|
-
sessionClass
|
|
3608
|
+
sessionClass,
|
|
3601
3609
|
...(entry.convId ? { convId: entry.convId } : {}),
|
|
3602
3610
|
...(gatewayMode !== "auto" ? { gatewayMode } : {}),
|
|
3603
3611
|
});
|
|
@@ -3792,7 +3800,11 @@ export async function main(argv) {
|
|
|
3792
3800
|
// A detached/background or run-once launch is a worker, even when its
|
|
3793
3801
|
// agent later emits a Claude SessionStart hook. Stamp this through tmux
|
|
3794
3802
|
// so that hook cannot reclassify it as a human session.
|
|
3795
|
-
const sessionClass =
|
|
3803
|
+
const sessionClass = deriveSessionClass({
|
|
3804
|
+
background: opts.background === true,
|
|
3805
|
+
headless: opts.headless === true,
|
|
3806
|
+
humanTerminal: opts.attachedTerminal !== false,
|
|
3807
|
+
});
|
|
3796
3808
|
let activeGateway;
|
|
3797
3809
|
const h2a = getH2aConfig();
|
|
3798
3810
|
const h2aSidecar = opts.h2a ?? h2a.enabled;
|
|
@@ -5671,7 +5683,7 @@ export async function main(argv) {
|
|
|
5671
5683
|
const finalReady = [];
|
|
5672
5684
|
for (const item of ready) {
|
|
5673
5685
|
const safety = sessionRelaunchSafety(item.action.name);
|
|
5674
|
-
if (safety
|
|
5686
|
+
if (!isRelaunchKillable(safety)) {
|
|
5675
5687
|
process.stderr.write(`[h2a] skipped ${item.action.slug}: ${safety.reason}\n`);
|
|
5676
5688
|
continue;
|
|
5677
5689
|
}
|
|
@@ -5679,14 +5691,27 @@ export async function main(argv) {
|
|
|
5679
5691
|
}
|
|
5680
5692
|
let ok = 0;
|
|
5681
5693
|
for (const { action, entry, sessionClass } of finalReady) {
|
|
5682
|
-
|
|
5683
|
-
|
|
5694
|
+
const safety = sessionRelaunchSafety(action.name);
|
|
5695
|
+
if (!isRelaunchKillable(safety)) {
|
|
5696
|
+
process.stderr.write(`[h2a] skipped ${action.slug}: became live before kill: ${safety.reason}\n`);
|
|
5697
|
+
continue;
|
|
5698
|
+
}
|
|
5699
|
+
if (!safety.identity) {
|
|
5700
|
+
process.stderr.write(`[h2a] skipped ${action.slug}: liveness identity was unreadable immediately before kill.\n`);
|
|
5701
|
+
continue;
|
|
5702
|
+
}
|
|
5703
|
+
if (!killLocalSession(action.name, safety.identity)) {
|
|
5704
|
+
process.stderr.write(`[h2a] skipped ${action.slug}: tmux session ${action.name} changed or was no longer proven dead immediately before kill.\n`);
|
|
5684
5705
|
continue;
|
|
5685
5706
|
}
|
|
5686
5707
|
try {
|
|
5687
5708
|
const gatewayMode = gatewayModeForProfile(action.profile, entry.gatewayMode ?? "auto");
|
|
5688
5709
|
await injectLlmMeshGatewayEnv(gatewayMode, true, localSessionName(action.slug));
|
|
5689
|
-
const { name } = startLocalSession(action.profile, action.command, entry.cwd, action.args, action.slug, undefined, {
|
|
5710
|
+
const { name, agentPane } = startLocalSession(action.profile, action.command, entry.cwd, action.args, action.slug, undefined, {
|
|
5711
|
+
sessionClass,
|
|
5712
|
+
resumeId: action.convId,
|
|
5713
|
+
attachedTerminal: true,
|
|
5714
|
+
});
|
|
5690
5715
|
enrollFromRun({
|
|
5691
5716
|
profile: action.profile,
|
|
5692
5717
|
slug: action.slug,
|
|
@@ -5698,8 +5723,32 @@ export async function main(argv) {
|
|
|
5698
5723
|
? { gatewayMode: entry.gatewayMode }
|
|
5699
5724
|
: {}),
|
|
5700
5725
|
});
|
|
5726
|
+
const wake = wakeRelaunchedSession(relaunchContinuationPrompt(entry.task), {
|
|
5727
|
+
deliverContinuation: (prompt) => deliverInitialPrompt(agentPane, prompt, {
|
|
5728
|
+
capturePane: capturePaneVisible,
|
|
5729
|
+
clearComposer: clearPaneComposer,
|
|
5730
|
+
pasteBlock: pasteLiteralBlock,
|
|
5731
|
+
submit: submitPane,
|
|
5732
|
+
cpuMs: paneTreeCpuMs,
|
|
5733
|
+
sleep: sleepSync,
|
|
5734
|
+
now: () => Date.now(),
|
|
5735
|
+
}),
|
|
5736
|
+
submitConfirmation: () => submitPane(agentPane),
|
|
5737
|
+
capturePane: () => capturePaneVisible(agentPane),
|
|
5738
|
+
sleep: sleepSync,
|
|
5739
|
+
now: () => Date.now(),
|
|
5740
|
+
});
|
|
5741
|
+
if (wake.confirmation === "auto-passed") {
|
|
5742
|
+
process.stderr.write(`[h2a] ${action.slug}: Claude stale-session confirmation auto-passed once\n`);
|
|
5743
|
+
}
|
|
5744
|
+
if (wake.state !== "working") {
|
|
5745
|
+
process.stderr.write(`[h2a] FAILED to wake ${action.slug} after resume: ${wake.reason}\n` +
|
|
5746
|
+
(wake.capture ? `[h2a] last screen:\n${wake.capture}\n` : ""));
|
|
5747
|
+
continue;
|
|
5748
|
+
}
|
|
5701
5749
|
ok += 1;
|
|
5702
|
-
process.stderr.write(`[h2a] force-restarted ${action.slug}: ${action.cmd}
|
|
5750
|
+
process.stderr.write(`[h2a] force-restarted ${action.slug}: ${action.cmd}; objective re-injected; agent WORKING ` +
|
|
5751
|
+
`(${Math.round(wake.delivery.cpuDeltaMs)}ms CPU, ${wake.delivery.evidence})\n`);
|
|
5703
5752
|
}
|
|
5704
5753
|
catch (error) {
|
|
5705
5754
|
process.stderr.write(`[h2a] FAILED to force-restart ${action.slug} after killing ${action.name}: ${error.message}\n`);
|