instar 1.3.1619 → 1.3.1621
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/commands/server.d.ts +6 -0
- package/dist/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +115 -9
- package/dist/commands/server.js.map +1 -1
- package/dist/core/PostUpdateMigrator.d.ts +6 -0
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +24 -0
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/core/TopicProfileOrchestrator.d.ts +4 -0
- package/dist/core/TopicProfileOrchestrator.d.ts.map +1 -1
- package/dist/core/TopicProfileOrchestrator.js +14 -1
- package/dist/core/TopicProfileOrchestrator.js.map +1 -1
- package/dist/core/TopicSpawnBriefStore.d.ts +48 -0
- package/dist/core/TopicSpawnBriefStore.d.ts.map +1 -0
- package/dist/core/TopicSpawnBriefStore.js +107 -0
- package/dist/core/TopicSpawnBriefStore.js.map +1 -0
- package/dist/core/componentCategories.d.ts.map +1 -1
- package/dist/core/componentCategories.js +1 -0
- package/dist/core/componentCategories.js.map +1 -1
- package/dist/core/devGatedFeatures.js +1 -1
- package/dist/core/devGatedFeatures.js.map +1 -1
- package/dist/data/llmBenchCoverage.d.ts.map +1 -1
- package/dist/data/llmBenchCoverage.js +5 -0
- package/dist/data/llmBenchCoverage.js.map +1 -1
- package/dist/data/provenanceCoverage.d.ts +2 -0
- package/dist/data/provenanceCoverage.d.ts.map +1 -1
- package/dist/data/provenanceCoverage.js +15 -0
- package/dist/data/provenanceCoverage.js.map +1 -1
- package/dist/data/standards-guard-index.json +1 -1
- package/dist/data/standards-guard-index.meta.json +2 -2
- package/dist/data/standards-registry.meta.json +1 -1
- package/dist/monitoring/MachineWedgeJudge.d.ts +28 -0
- package/dist/monitoring/MachineWedgeJudge.d.ts.map +1 -0
- package/dist/monitoring/MachineWedgeJudge.js +114 -0
- package/dist/monitoring/MachineWedgeJudge.js.map +1 -0
- package/dist/monitoring/MachineWedgeNotice.d.ts +38 -0
- package/dist/monitoring/MachineWedgeNotice.d.ts.map +1 -0
- package/dist/monitoring/MachineWedgeNotice.js +71 -0
- package/dist/monitoring/MachineWedgeNotice.js.map +1 -0
- package/dist/monitoring/guardManifest.d.ts.map +1 -1
- package/dist/monitoring/guardManifest.js +1 -0
- package/dist/monitoring/guardManifest.js.map +1 -1
- package/dist/monitoring/machineMaintenance/DrainRehearsal.d.ts +6 -0
- package/dist/monitoring/machineMaintenance/DrainRehearsal.d.ts.map +1 -1
- package/dist/monitoring/machineMaintenance/DrainRehearsal.js +7 -2
- package/dist/monitoring/machineMaintenance/DrainRehearsal.js.map +1 -1
- package/dist/monitoring/machineMaintenance/HostMaintenanceStore.d.ts +36 -0
- package/dist/monitoring/machineMaintenance/HostMaintenanceStore.d.ts.map +1 -1
- package/dist/monitoring/machineMaintenance/HostMaintenanceStore.js +54 -0
- package/dist/monitoring/machineMaintenance/HostMaintenanceStore.js.map +1 -1
- package/dist/monitoring/machineMaintenance/WedgeMonitor.d.ts +191 -0
- package/dist/monitoring/machineMaintenance/WedgeMonitor.d.ts.map +1 -0
- package/dist/monitoring/machineMaintenance/WedgeMonitor.js +489 -0
- package/dist/monitoring/machineMaintenance/WedgeMonitor.js.map +1 -0
- package/dist/monitoring/machineMaintenance/readings.d.ts +46 -0
- package/dist/monitoring/machineMaintenance/readings.d.ts.map +1 -1
- package/dist/monitoring/machineMaintenance/readings.js +71 -8
- package/dist/monitoring/machineMaintenance/readings.js.map +1 -1
- package/dist/monitoring/machineMaintenance/wedgeEvidence.d.ts +73 -0
- package/dist/monitoring/machineMaintenance/wedgeEvidence.d.ts.map +1 -0
- package/dist/monitoring/machineMaintenance/wedgeEvidence.js +111 -0
- package/dist/monitoring/machineMaintenance/wedgeEvidence.js.map +1 -0
- package/dist/monitoring/machineMaintenance/wedgeWindow.d.ts +94 -0
- package/dist/monitoring/machineMaintenance/wedgeWindow.d.ts.map +1 -0
- package/dist/monitoring/machineMaintenance/wedgeWindow.js +126 -0
- package/dist/monitoring/machineMaintenance/wedgeWindow.js.map +1 -0
- package/dist/monitoring/selfaction/policies.d.ts.map +1 -1
- package/dist/monitoring/selfaction/policies.js +15 -0
- package/dist/monitoring/selfaction/policies.js.map +1 -1
- package/dist/native/instar-desktop-host +0 -0
- package/dist/scaffold/templates.d.ts.map +1 -1
- package/dist/scaffold/templates.js +2 -1
- package/dist/scaffold/templates.js.map +1 -1
- package/dist/server/CapabilityIndex.js +1 -1
- package/dist/server/CapabilityIndex.js.map +1 -1
- package/dist/server/routes.d.ts +3 -0
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +56 -12
- package/dist/server/routes.js.map +1 -1
- package/dist/server/sessionSpawnTopicBinding.d.ts +26 -0
- package/dist/server/sessionSpawnTopicBinding.d.ts.map +1 -1
- package/dist/server/sessionSpawnTopicBinding.js +50 -0
- package/dist/server/sessionSpawnTopicBinding.js.map +1 -1
- package/dist/testing/selfActionRegistry.d.ts.map +1 -1
- package/dist/testing/selfActionRegistry.js +63 -0
- package/dist/testing/selfActionRegistry.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +63 -63
- package/src/data/llmBenchCoverage.ts +7 -0
- package/src/data/provenanceCoverage.ts +18 -0
- package/src/data/standards-guard-index.json +1 -1
- package/src/data/standards-guard-index.meta.json +2 -2
- package/src/data/standards-registry.meta.json +1 -1
- package/src/scaffold/templates.ts +2 -1
- package/upgrades/1.3.1620.md +26 -0
- package/upgrades/1.3.1621.md +27 -0
- package/upgrades/eli16/profile-restart-keeps-spawn-brief.md +24 -0
- package/upgrades/side-effects/machine-wedge-dryrun.eli16.md +15 -0
- package/upgrades/side-effects/machine-wedge-dryrun.md +146 -0
- package/upgrades/side-effects/profile-restart-keeps-spawn-brief.md +91 -0
|
@@ -33,6 +33,12 @@ spawnOpts?: {
|
|
|
33
33
|
* relay block) and no initial message, exactly what the raw
|
|
34
34
|
* spawnInteractiveSession(undefined, …) path injected before. */
|
|
35
35
|
silentStart?: boolean;
|
|
36
|
+
/** The prompt the replaced session was originally started with (direct
|
|
37
|
+
* spawn route). It is not in the thread history, so a CONTINUATION
|
|
38
|
+
* respawn (topic-profile re-apply) includes it — otherwise the new
|
|
39
|
+
* session sees nothing in flight and idles. Ignored when a user message
|
|
40
|
+
* drives the spawn. */
|
|
41
|
+
carriedBrief?: string;
|
|
36
42
|
}): Promise<string>;
|
|
37
43
|
/**
|
|
38
44
|
* Resolve the hub-intent classifier deps (Conversion #3,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/server.js
CHANGED
|
@@ -88,6 +88,7 @@ import { NewTopicDefaultStore, evaluateSessionPoolLocalClaim, createSpawnForTopi
|
|
|
88
88
|
import { parseDashboardCreatePayload, safeMachineLabel, createDashboardCreateStartRunner } from '../core/dashboardMachineChoice.js';
|
|
89
89
|
import { slugifyChannelName } from '../messaging/slack/sanitize.js';
|
|
90
90
|
import { TopicProfileOrchestrator, resolvedToApplied, } from '../core/TopicProfileOrchestrator.js';
|
|
91
|
+
import { TopicSpawnBriefStore, formatCarriedBriefBlock } from '../core/TopicSpawnBriefStore.js';
|
|
91
92
|
import { CodexResumeMap } from '../core/CodexResumeMap.js';
|
|
92
93
|
import { resolveStageBProductionActivation } from '../core/StageBActivationGate.js';
|
|
93
94
|
import { createInboundDeliveryTransferHandler, createInboundDeliveryTransferStep, writeStageCActivationLease } from '../core/CodexLifecycleProductionComposition.js';
|
|
@@ -880,6 +881,10 @@ let _topicProfileCarrier = null;
|
|
|
880
881
|
* respawn phase — the spawn chokepoint must not double-report the failure to
|
|
881
882
|
* the §10.4 breaker (the orchestrator records its own spawn outcome). */
|
|
882
883
|
const _orchestratorSpawnInFlight = new Set();
|
|
884
|
+
/** Direct-spawn brief store (set at server boot). spawnSessionForTopic clears
|
|
885
|
+
* a topic's brief on any spawn the orchestrator did not start, so an old
|
|
886
|
+
* task never reaches a later session that reuses the same tmux name. */
|
|
887
|
+
let _topicSpawnBriefsRef = null;
|
|
883
888
|
/** §5.3 "possibly stale" read disclosure — once per (topic, process). */
|
|
884
889
|
const _pendingPullStaleDisclosed = new Set();
|
|
885
890
|
/** Default framework for sessions when no per-topic override is set. */
|
|
@@ -1111,6 +1116,10 @@ accountSwap,
|
|
|
1111
1116
|
* worktree work resumes in ITS tree). Omitted = module project dir. */
|
|
1112
1117
|
spawnOpts) {
|
|
1113
1118
|
const silentStart = spawnOpts?.silentStart === true;
|
|
1119
|
+
const carriedBriefBlock = !silentStart && typeof spawnOpts?.carriedBrief === 'string' && spawnOpts.carriedBrief.length > 0
|
|
1120
|
+
&& !(typeof latestMessage === 'string' && latestMessage.length > 0)
|
|
1121
|
+
? formatCarriedBriefBlock(spawnOpts.carriedBrief)
|
|
1122
|
+
: null;
|
|
1114
1123
|
const hasLatestMessage = typeof latestMessage === 'string' && latestMessage.length > 0;
|
|
1115
1124
|
const msg = hasLatestMessage ? latestMessage : 'Session started — send a message to continue.';
|
|
1116
1125
|
// If memory is elevated/critical and we have the reaper, try to free memory
|
|
@@ -1279,6 +1288,9 @@ spawnOpts) {
|
|
|
1279
1288
|
else {
|
|
1280
1289
|
console.warn(`[telegram→session] Open commitments for topic ${topicId} unavailable for the handoff instruction (tracker not wired)`);
|
|
1281
1290
|
}
|
|
1291
|
+
if (carriedBriefBlock) {
|
|
1292
|
+
parts.push(carriedBriefBlock, ``);
|
|
1293
|
+
}
|
|
1282
1294
|
parts.push(buildHandoffContinuationInstruction(openCommitments));
|
|
1283
1295
|
}
|
|
1284
1296
|
bootstrapMessage = parts.join('\n');
|
|
@@ -1295,13 +1307,8 @@ spawnOpts) {
|
|
|
1295
1307
|
newSessionParts.push(userContextBlock);
|
|
1296
1308
|
newSessionParts.push(``);
|
|
1297
1309
|
}
|
|
1298
|
-
newSessionParts.push(`[telegram:${topicId}] ${msg}`);
|
|
1299
|
-
|
|
1300
|
-
bootstrapMessage = newSessionParts.join('\n');
|
|
1301
|
-
}
|
|
1302
|
-
else {
|
|
1303
|
-
bootstrapMessage = `[telegram:${topicId}] ${msg}`;
|
|
1304
|
-
}
|
|
1310
|
+
newSessionParts.push(carriedBriefBlock ? `[telegram:${topicId}]\n${carriedBriefBlock}` : `[telegram:${topicId}] ${msg}`);
|
|
1311
|
+
bootstrapMessage = newSessionParts.join('\n');
|
|
1305
1312
|
}
|
|
1306
1313
|
// Resolve the FULL topic profile EARLY (Topic Profile §5.2 — the single
|
|
1307
1314
|
// resolution point: framework + model + thinking mode, with the read-time
|
|
@@ -1432,6 +1439,18 @@ spawnOpts) {
|
|
|
1432
1439
|
if (resumeSessionId) {
|
|
1433
1440
|
_topicResumeMap?.remove(topicId);
|
|
1434
1441
|
}
|
|
1442
|
+
// A spawn the orchestrator did not start is a new session taking over the
|
|
1443
|
+
// topic (a natural or user-driven spawn): the previous session's direct-spawn
|
|
1444
|
+
// brief no longer applies. Clearing it here is what keeps a later profile
|
|
1445
|
+
// respawn of THIS session (same tmux name) from carrying a finished task.
|
|
1446
|
+
if (_topicSpawnBriefsRef && !_orchestratorSpawnInFlight.has(String(topicId))) {
|
|
1447
|
+
try {
|
|
1448
|
+
_topicSpawnBriefsRef.clear(topicId);
|
|
1449
|
+
}
|
|
1450
|
+
catch (err) {
|
|
1451
|
+
console.warn(`[spawnSessionForTopic] could not clear spawn brief for topic ${topicId}: ${err instanceof Error ? err.message : String(err)}`);
|
|
1452
|
+
}
|
|
1453
|
+
}
|
|
1435
1454
|
// TOPIC-PROFILE-SPEC §10.4 — record the successful spawn so the §10.4 breaker
|
|
1436
1455
|
// resets + the codex same-cwd fence window opens. SKIPPED when the orchestrator
|
|
1437
1456
|
// initiated THIS respawn: it records its own spawn outcome (the spawn port),
|
|
@@ -22842,6 +22861,7 @@ export async function startServer(options) {
|
|
|
22842
22861
|
const throwaway = classifyLocation({ projectDir, record: readThrowawayRecord(projectDir) }).throwaway;
|
|
22843
22862
|
if (mmEnabled() && !throwaway) {
|
|
22844
22863
|
const { DrainRehearsal, readHostCensus, setActiveDrainRehearsal } = await import('../monitoring/machineMaintenance/DrainRehearsal.js');
|
|
22864
|
+
const { getActiveWedgeMonitor: getActiveWedgeMonitorRef } = await import('../monitoring/machineMaintenance/WedgeMonitor.js');
|
|
22845
22865
|
const { HostMaintenanceStore } = await import('../monitoring/machineMaintenance/HostMaintenanceStore.js');
|
|
22846
22866
|
const { normalizeSettings } = await import('../monitoring/machineMaintenance/planner.js');
|
|
22847
22867
|
const { makeReadOnlyRunner, readMachineSignals } = await import('../monitoring/machineMaintenance/readings.js');
|
|
@@ -22898,10 +22918,68 @@ export async function startServer(options) {
|
|
|
22898
22918
|
},
|
|
22899
22919
|
coResidentAgents: () => readHostCensus(path.join(os.homedir(), '.instar', 'registry.json'), Date.now()),
|
|
22900
22920
|
holdsLease: () => (coordinator.enabled ? coordinator.holdsLease() : null),
|
|
22921
|
+
forcedDueAt: () => getActiveWedgeMonitorRef()?.forcedDueAt() ?? null,
|
|
22901
22922
|
ownUser: os.userInfo().username,
|
|
22902
22923
|
log: (line) => console.log(pc.yellow(` [machine-maintenance] ${line}`)),
|
|
22903
22924
|
});
|
|
22904
22925
|
setActiveDrainRehearsal(rehearsal);
|
|
22926
|
+
// Wedge detection, dry-run (Part E, CMT-1202): samples the evidence families on the
|
|
22927
|
+
// host maintainer only, records candidates and the judge's proposal, and marks the next
|
|
22928
|
+
// window due early. No rung exists in this build. The operator notice is off unless
|
|
22929
|
+
// machineMaintenance.wedgeRestart.dryRunNotice is true.
|
|
22930
|
+
const { WedgeMonitor, normalizeWedgeSettings, setActiveWedgeMonitor } = await import('../monitoring/machineMaintenance/WedgeMonitor.js');
|
|
22931
|
+
const { makeProbeRunner, parseBootTime } = await import('../monitoring/machineMaintenance/readings.js');
|
|
22932
|
+
const { windowFor } = await import('../monitoring/machineMaintenance/planner.js');
|
|
22933
|
+
const { makeMachineWedgeJudge } = await import('../monitoring/MachineWedgeJudge.js');
|
|
22934
|
+
const { makeWedgeNoticeSender } = await import('../monitoring/MachineWedgeNotice.js');
|
|
22935
|
+
const wedgeRead = makeReadOnlyRunner(config.sessions.tmuxPath);
|
|
22936
|
+
const wedgeMachineId = () => coordinator.identity?.machineId ?? `m_host_${os.hostname()}`;
|
|
22937
|
+
const wedgeMonitor = new WedgeMonitor({
|
|
22938
|
+
agentName: config.projectName,
|
|
22939
|
+
machineId: wedgeMachineId,
|
|
22940
|
+
platform: process.platform === 'darwin' ? 'darwin' : isWslHost() ? 'wsl' : process.platform === 'linux' ? 'linux' : 'other',
|
|
22941
|
+
logPath: path.join(config.stateDir, '..', 'logs', 'machine-maintenance.jsonl'),
|
|
22942
|
+
store: new HostMaintenanceStore(),
|
|
22943
|
+
enabled: mmEnabled,
|
|
22944
|
+
settings: () => normalizeWedgeSettings(liveConfig.get('machineMaintenance.wedgeRestart', undefined)),
|
|
22945
|
+
probe: makeProbeRunner(),
|
|
22946
|
+
readBootAt: async () => {
|
|
22947
|
+
if (process.platform !== 'darwin')
|
|
22948
|
+
return Math.round(Date.now() - os.uptime() * 1000);
|
|
22949
|
+
const out = await wedgeRead('bootTime');
|
|
22950
|
+
return out === null ? null : parseBootTime(out);
|
|
22951
|
+
},
|
|
22952
|
+
lockState: async () => {
|
|
22953
|
+
const { getActiveMachineLockStateReader } = await import('../core/MachineLockStateReader.js');
|
|
22954
|
+
const reader = getActiveMachineLockStateReader();
|
|
22955
|
+
return reader ? (await reader.read()).lockState : null;
|
|
22956
|
+
},
|
|
22957
|
+
loadReading: () => {
|
|
22958
|
+
const r = _machineLoadSampler?.read() ?? null;
|
|
22959
|
+
return r ? { verdict: r.verdict, cpuIdlePct: r.cpuIdlePct, eventLoopLagP99Ms: r.eventLoopLagP99Ms, sampleAgeMs: r.sampleAgeMs } : null;
|
|
22960
|
+
},
|
|
22961
|
+
// No counter of system-reason spawn failures exists yet: unknown, never zero.
|
|
22962
|
+
spawnSystemFailures30m: () => null,
|
|
22963
|
+
sessionsCount: () => { try {
|
|
22964
|
+
return sessionManager.getCachedRunningSessions().sessions.length;
|
|
22965
|
+
}
|
|
22966
|
+
catch {
|
|
22967
|
+
return null;
|
|
22968
|
+
} }, // @silent-fallback-ok — null reads as unknown in the judge's evidence
|
|
22969
|
+
nextWindowRestartAt: (now) => {
|
|
22970
|
+
const cfg = normalizeSettings(liveConfig.get('machineMaintenance', undefined));
|
|
22971
|
+
const w = windowFor(now, cfg.window);
|
|
22972
|
+
return w.restartAt > now ? w.restartAt : windowFor(w.end + 1, cfg.window).restartAt;
|
|
22973
|
+
},
|
|
22974
|
+
judge: makeMachineWedgeJudge(sharedIntelligence),
|
|
22975
|
+
raiseNotice: makeWedgeNoticeSender({
|
|
22976
|
+
createAttentionItem: telegram ? async (item) => telegram.createAttentionItem(item) : null,
|
|
22977
|
+
machineLabel: () => coordinator.identity?.name || os.hostname(),
|
|
22978
|
+
}),
|
|
22979
|
+
log: (line) => console.log(pc.yellow(` [machine-maintenance] ${line}`)),
|
|
22980
|
+
});
|
|
22981
|
+
setActiveWedgeMonitor(wedgeMonitor);
|
|
22982
|
+
wedgeMonitor.start();
|
|
22905
22983
|
rehearsal.start();
|
|
22906
22984
|
// Honest lock reading (Part A): a read of the session, never the flag alone.
|
|
22907
22985
|
const { MachineLockStateReader, setActiveMachineLockStateReader } = await import('../core/MachineLockStateReader.js');
|
|
@@ -28490,6 +28568,11 @@ export async function startServer(options) {
|
|
|
28490
28568
|
// into AgentServer → routes, so the orchestrator + carrier (which late-bind
|
|
28491
28569
|
// off the just-constructed AgentServer's governors / the mesh block) are
|
|
28492
28570
|
// attached to THIS object after construction and reach the routes live.
|
|
28571
|
+
// Direct-spawn briefs (POST /sessions/spawn with a topic): carried into a
|
|
28572
|
+
// CONTINUATION profile respawn of the same session, since the brief is
|
|
28573
|
+
// not in the topic's chat history.
|
|
28574
|
+
const _topicSpawnBriefs = new TopicSpawnBriefStore(config.stateDir);
|
|
28575
|
+
_topicSpawnBriefsRef = _topicSpawnBriefs;
|
|
28493
28576
|
const _topicProfileCtx = (_topicProfileStore && _topicProfileResolver && _topicProfileWriteSurface && _topicProfileConfirmSlots)
|
|
28494
28577
|
? {
|
|
28495
28578
|
store: _topicProfileStore,
|
|
@@ -28500,6 +28583,7 @@ export async function startServer(options) {
|
|
|
28500
28583
|
carrier: _topicProfileCarrier,
|
|
28501
28584
|
// dashboard-door-model-controls (§3.2/§3.3) — the dashboard create path.
|
|
28502
28585
|
newTopicDefault: new NewTopicDefaultStore(config.stateDir),
|
|
28586
|
+
spawnBriefs: _topicSpawnBriefs,
|
|
28503
28587
|
audit: (event) => { appendTopicProfileAudit(config.stateDir, event); },
|
|
28504
28588
|
discloseCreationSeed: async (topicKey, text) => {
|
|
28505
28589
|
if (!telegram)
|
|
@@ -30195,7 +30279,7 @@ export async function startServer(options) {
|
|
|
30195
30279
|
// supposed to be a no-op.
|
|
30196
30280
|
return sessionManager.killSessionByTmuxName(sessionName);
|
|
30197
30281
|
},
|
|
30198
|
-
spawn: async (topicKey, _resolved,
|
|
30282
|
+
spawn: async (topicKey, _resolved, directive) => {
|
|
30199
30283
|
// The orchestrator already killed; respawn re-resolves the (now
|
|
30200
30284
|
// updated) pin via spawnSessionForTopic and picks up the resume id
|
|
30201
30285
|
// from the resume map. We mark the spawn in-flight so the spawn-path
|
|
@@ -30204,9 +30288,31 @@ export async function startServer(options) {
|
|
|
30204
30288
|
if (!Number.isFinite(n) || !telegram)
|
|
30205
30289
|
return { ok: false, failureClass: 'unknown' };
|
|
30206
30290
|
const topicName = telegram.getTopicName(n) || `topic-${n}`;
|
|
30291
|
+
// A CONTINUATION respawn rebuilds context from the thread history,
|
|
30292
|
+
// which does not hold a direct-spawn brief — carry the replaced
|
|
30293
|
+
// session's brief so the new session keeps its task. A resume
|
|
30294
|
+
// respawn keeps the whole conversation, so it needs no carry.
|
|
30295
|
+
let carriedBrief;
|
|
30296
|
+
try {
|
|
30297
|
+
carriedBrief = directive.method === 'continuation'
|
|
30298
|
+
? (_topicSpawnBriefs.getForSession(n, directive.replacedSessionName)?.prompt ?? undefined)
|
|
30299
|
+
: undefined;
|
|
30300
|
+
}
|
|
30301
|
+
catch { /* @silent-fallback-ok: an unreadable brief degrades to today's history-only continuation; the respawn itself must not fail on it */
|
|
30302
|
+
carriedBrief = undefined;
|
|
30303
|
+
}
|
|
30207
30304
|
_orchestratorSpawnInFlight.add(topicKey);
|
|
30208
30305
|
try {
|
|
30209
|
-
const spawnedName = await spawnSessionForTopic(sessionManager, telegram, topicName, n, undefined, topicMemory, undefined, undefined, undefined, { awaitInitialInjection: true });
|
|
30306
|
+
const spawnedName = await spawnSessionForTopic(sessionManager, telegram, topicName, n, undefined, topicMemory, undefined, undefined, undefined, { awaitInitialInjection: true, ...(carriedBrief ? { carriedBrief } : {}) });
|
|
30307
|
+
if (directive.replacedSessionName) {
|
|
30308
|
+
try {
|
|
30309
|
+
_topicSpawnBriefs.rebind(n, directive.replacedSessionName, spawnedName);
|
|
30310
|
+
}
|
|
30311
|
+
catch { /* @silent-fallback-ok: a failed re-key only means a LATER profile respawn of the new session will not carry the brief again */ }
|
|
30312
|
+
}
|
|
30313
|
+
if (carriedBrief) {
|
|
30314
|
+
appendTopicProfileAudit(config.stateDir, { type: 'respawn-brief-carried', topic: topicKey, chars: carriedBrief.length });
|
|
30315
|
+
}
|
|
30210
30316
|
const spawned = sessionManager.listRunningSessions()
|
|
30211
30317
|
.find((session) => session.tmuxSession === spawnedName);
|
|
30212
30318
|
return {
|