@telora/daemon 0.17.36 → 0.17.42
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/build-info.json +5 -3
- package/dist/assembly-engine.d.ts +6 -0
- package/dist/assembly-engine.d.ts.map +1 -1
- package/dist/assembly-engine.js +19 -0
- package/dist/assembly-engine.js.map +1 -1
- package/dist/assembly-resolvers.d.ts +17 -8
- package/dist/assembly-resolvers.d.ts.map +1 -1
- package/dist/assembly-resolvers.js +19 -8
- package/dist/assembly-resolvers.js.map +1 -1
- package/dist/cli/session-state.d.ts +10 -0
- package/dist/cli/session-state.d.ts.map +1 -1
- package/dist/cli/session-state.js +31 -0
- package/dist/cli/session-state.js.map +1 -1
- package/dist/completion/completion-decision.d.ts +83 -0
- package/dist/completion/completion-decision.d.ts.map +1 -0
- package/dist/completion/completion-decision.js +48 -0
- package/dist/completion/completion-decision.js.map +1 -0
- package/dist/completion/event-escalations.d.ts +97 -0
- package/dist/completion/event-escalations.d.ts.map +1 -0
- package/dist/completion/event-escalations.js +213 -0
- package/dist/completion/event-escalations.js.map +1 -0
- package/dist/completion/event.d.ts +1 -72
- package/dist/completion/event.d.ts.map +1 -1
- package/dist/completion/event.js +148 -322
- package/dist/completion/event.js.map +1 -1
- package/dist/completion/exit-classification.d.ts +82 -0
- package/dist/completion/exit-classification.d.ts.map +1 -0
- package/dist/completion/exit-classification.js +61 -0
- package/dist/completion/exit-classification.js.map +1 -0
- package/dist/completion/index.d.ts +14 -5
- package/dist/completion/index.d.ts.map +1 -1
- package/dist/completion/index.js +14 -5
- package/dist/completion/index.js.map +1 -1
- package/dist/completion/merge-phase.d.ts +114 -0
- package/dist/completion/merge-phase.d.ts.map +1 -0
- package/dist/completion/merge-phase.js +198 -0
- package/dist/completion/merge-phase.js.map +1 -0
- package/dist/completion/review-exit-phase.d.ts +82 -0
- package/dist/completion/review-exit-phase.d.ts.map +1 -0
- package/dist/completion/review-exit-phase.js +228 -0
- package/dist/completion/review-exit-phase.js.map +1 -0
- package/dist/completion/status-advance-phase.d.ts +61 -0
- package/dist/completion/status-advance-phase.d.ts.map +1 -0
- package/dist/completion/status-advance-phase.js +182 -0
- package/dist/completion/status-advance-phase.js.map +1 -0
- package/dist/completion/team-completion.d.ts +28 -269
- package/dist/completion/team-completion.d.ts.map +1 -1
- package/dist/completion/team-completion.js +145 -676
- package/dist/completion/team-completion.js.map +1 -1
- package/dist/daemon-process.d.ts +18 -2
- package/dist/daemon-process.d.ts.map +1 -1
- package/dist/daemon-process.js +7 -2
- package/dist/daemon-process.js.map +1 -1
- package/dist/directive/close-loop-stage.d.ts +50 -0
- package/dist/directive/close-loop-stage.d.ts.map +1 -0
- package/dist/directive/close-loop-stage.js +196 -0
- package/dist/directive/close-loop-stage.js.map +1 -0
- package/dist/directive/directive-assembly.d.ts +33 -0
- package/dist/directive/directive-assembly.d.ts.map +1 -0
- package/dist/directive/directive-assembly.js +77 -0
- package/dist/directive/directive-assembly.js.map +1 -0
- package/dist/directive/directive-dispatch.d.ts +103 -0
- package/dist/directive/directive-dispatch.d.ts.map +1 -0
- package/dist/directive/directive-dispatch.js +279 -0
- package/dist/directive/directive-dispatch.js.map +1 -0
- package/dist/directive/phase-sync.d.ts +89 -0
- package/dist/directive/phase-sync.d.ts.map +1 -0
- package/dist/directive/phase-sync.js +173 -0
- package/dist/directive/phase-sync.js.map +1 -0
- package/dist/directive-executor.d.ts +21 -223
- package/dist/directive-executor.d.ts.map +1 -1
- package/dist/directive-executor.js +28 -687
- package/dist/directive-executor.js.map +1 -1
- package/dist/focus-engine.d.ts.map +1 -1
- package/dist/focus-engine.js +8 -0
- package/dist/focus-engine.js.map +1 -1
- package/dist/focus-executor.d.ts +29 -8
- package/dist/focus-executor.d.ts.map +1 -1
- package/dist/focus-executor.js +29 -10
- package/dist/focus-executor.js.map +1 -1
- package/dist/focus-stage-lifecycle.d.ts +7 -5
- package/dist/focus-stage-lifecycle.d.ts.map +1 -1
- package/dist/focus-stage-lifecycle.js +11 -6
- package/dist/focus-stage-lifecycle.js.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/pipeline-config.d.ts +13 -0
- package/dist/pipeline-config.d.ts.map +1 -1
- package/dist/pipeline-config.js +15 -0
- package/dist/pipeline-config.js.map +1 -1
- package/dist/resolvers/agent-escalations.d.ts +8 -1
- package/dist/resolvers/agent-escalations.d.ts.map +1 -1
- package/dist/resolvers/agent-escalations.js +25 -22
- package/dist/resolvers/agent-escalations.js.map +1 -1
- package/dist/resolvers/agent-session-summaries.d.ts +8 -1
- package/dist/resolvers/agent-session-summaries.d.ts.map +1 -1
- package/dist/resolvers/agent-session-summaries.js +21 -18
- package/dist/resolvers/agent-session-summaries.js.map +1 -1
- package/dist/resolvers/delivery-acceptance-criteria.d.ts +7 -1
- package/dist/resolvers/delivery-acceptance-criteria.d.ts.map +1 -1
- package/dist/resolvers/delivery-acceptance-criteria.js +14 -11
- package/dist/resolvers/delivery-acceptance-criteria.js.map +1 -1
- package/dist/resolvers/delivery-description.d.ts +7 -1
- package/dist/resolvers/delivery-description.d.ts.map +1 -1
- package/dist/resolvers/delivery-description.js +14 -11
- package/dist/resolvers/delivery-description.js.map +1 -1
- package/dist/resolvers/delivery-issues.d.ts +8 -1
- package/dist/resolvers/delivery-issues.d.ts.map +1 -1
- package/dist/resolvers/delivery-issues.js +51 -48
- package/dist/resolvers/delivery-issues.js.map +1 -1
- package/dist/resolvers/delivery-listing.d.ts +16 -1
- package/dist/resolvers/delivery-listing.d.ts.map +1 -1
- package/dist/resolvers/delivery-listing.js +36 -33
- package/dist/resolvers/delivery-listing.js.map +1 -1
- package/dist/resolvers/delivery-tech-context.d.ts +7 -1
- package/dist/resolvers/delivery-tech-context.d.ts.map +1 -1
- package/dist/resolvers/delivery-tech-context.js +14 -11
- package/dist/resolvers/delivery-tech-context.js.map +1 -1
- package/dist/resolvers/deployment-profile.d.ts +8 -1
- package/dist/resolvers/deployment-profile.d.ts.map +1 -1
- package/dist/resolvers/deployment-profile.js +20 -17
- package/dist/resolvers/deployment-profile.js.map +1 -1
- package/dist/resolvers/focus-anchoring-injections.d.ts +26 -1
- package/dist/resolvers/focus-anchoring-injections.d.ts.map +1 -1
- package/dist/resolvers/focus-anchoring-injections.js +91 -88
- package/dist/resolvers/focus-anchoring-injections.js.map +1 -1
- package/dist/resolvers/focus-context.d.ts +9 -1
- package/dist/resolvers/focus-context.d.ts.map +1 -1
- package/dist/resolvers/focus-context.js +38 -35
- package/dist/resolvers/focus-context.js.map +1 -1
- package/dist/resolvers/focus-injections.d.ts +13 -1
- package/dist/resolvers/focus-injections.d.ts.map +1 -1
- package/dist/resolvers/focus-injections.js +60 -57
- package/dist/resolvers/focus-injections.js.map +1 -1
- package/dist/resolvers/focus-last-review-report.d.ts +2 -1
- package/dist/resolvers/focus-last-review-report.d.ts.map +1 -1
- package/dist/resolvers/focus-last-review-report.js +33 -30
- package/dist/resolvers/focus-last-review-report.js.map +1 -1
- package/dist/resolvers/focus-reality-tree.d.ts +15 -1
- package/dist/resolvers/focus-reality-tree.d.ts.map +1 -1
- package/dist/resolvers/focus-reality-tree.js +35 -32
- package/dist/resolvers/focus-reality-tree.js.map +1 -1
- package/dist/resolvers/git-diff-against-base.d.ts +8 -1
- package/dist/resolvers/git-diff-against-base.d.ts.map +1 -1
- package/dist/resolvers/git-diff-against-base.js +33 -30
- package/dist/resolvers/git-diff-against-base.js.map +1 -1
- package/dist/resolvers/guards-evaluation-results.d.ts +7 -1
- package/dist/resolvers/guards-evaluation-results.d.ts.map +1 -1
- package/dist/resolvers/guards-evaluation-results.js +25 -22
- package/dist/resolvers/guards-evaluation-results.js.map +1 -1
- package/dist/resolvers/index.d.ts +22 -40
- package/dist/resolvers/index.d.ts.map +1 -1
- package/dist/resolvers/index.js +112 -41
- package/dist/resolvers/index.js.map +1 -1
- package/dist/resolvers/loop-context.d.ts +18 -1
- package/dist/resolvers/loop-context.d.ts.map +1 -1
- package/dist/resolvers/loop-context.js +21 -18
- package/dist/resolvers/loop-context.js.map +1 -1
- package/dist/resolvers/loop-delivery-index.d.ts +17 -1
- package/dist/resolvers/loop-delivery-index.d.ts.map +1 -1
- package/dist/resolvers/loop-delivery-index.js +51 -48
- package/dist/resolvers/loop-delivery-index.js.map +1 -1
- package/dist/resolvers/loop-documents.d.ts +9 -1
- package/dist/resolvers/loop-documents.d.ts.map +1 -1
- package/dist/resolvers/loop-documents.js +22 -19
- package/dist/resolvers/loop-documents.js.map +1 -1
- package/dist/resolvers/loop-expected-effects.d.ts +11 -1
- package/dist/resolvers/loop-expected-effects.d.ts.map +1 -1
- package/dist/resolvers/loop-expected-effects.js +53 -50
- package/dist/resolvers/loop-expected-effects.js.map +1 -1
- package/dist/resolvers/loop-frt-statement.d.ts +11 -1
- package/dist/resolvers/loop-frt-statement.d.ts.map +1 -1
- package/dist/resolvers/loop-frt-statement.js +28 -25
- package/dist/resolvers/loop-frt-statement.js.map +1 -1
- package/dist/resolvers/loop-injection.d.ts +10 -1
- package/dist/resolvers/loop-injection.d.ts.map +1 -1
- package/dist/resolvers/loop-injection.js +38 -35
- package/dist/resolvers/loop-injection.js.map +1 -1
- package/dist/resolvers/loop-persona.d.ts +20 -1
- package/dist/resolvers/loop-persona.d.ts.map +1 -1
- package/dist/resolvers/loop-persona.js +20 -17
- package/dist/resolvers/loop-persona.js.map +1 -1
- package/dist/resolvers/loop-questions.d.ts +8 -1
- package/dist/resolvers/loop-questions.d.ts.map +1 -1
- package/dist/resolvers/loop-questions.js +39 -36
- package/dist/resolvers/loop-questions.js.map +1 -1
- package/dist/resolvers/loop-upstream-udes.d.ts +11 -1
- package/dist/resolvers/loop-upstream-udes.d.ts.map +1 -1
- package/dist/resolvers/loop-upstream-udes.js +74 -71
- package/dist/resolvers/loop-upstream-udes.js.map +1 -1
- package/dist/resolvers/prd-context.d.ts +2 -0
- package/dist/resolvers/prd-context.d.ts.map +1 -1
- package/dist/resolvers/prd-context.js +16 -13
- package/dist/resolvers/prd-context.js.map +1 -1
- package/dist/resolvers/prd-persona.d.ts +2 -0
- package/dist/resolvers/prd-persona.d.ts.map +1 -1
- package/dist/resolvers/prd-persona.js +6 -3
- package/dist/resolvers/prd-persona.js.map +1 -1
- package/dist/resolvers/reality-metrics.d.ts +8 -1
- package/dist/resolvers/reality-metrics.d.ts.map +1 -1
- package/dist/resolvers/reality-metrics.js +73 -70
- package/dist/resolvers/reality-metrics.js.map +1 -1
- package/dist/resolvers/reality-projections.d.ts +7 -1
- package/dist/resolvers/reality-projections.d.ts.map +1 -1
- package/dist/resolvers/reality-projections.js +35 -32
- package/dist/resolvers/reality-projections.js.map +1 -1
- package/dist/resolvers/reality-tree-snapshot.d.ts +10 -1
- package/dist/resolvers/reality-tree-snapshot.d.ts.map +1 -1
- package/dist/resolvers/reality-tree-snapshot.js +34 -31
- package/dist/resolvers/reality-tree-snapshot.js.map +1 -1
- package/dist/resolvers/retired-injections.d.ts +10 -1
- package/dist/resolvers/retired-injections.d.ts.map +1 -1
- package/dist/resolvers/retired-injections.js +68 -65
- package/dist/resolvers/retired-injections.js.map +1 -1
- package/dist/resolvers/review-outcomes.d.ts +11 -1
- package/dist/resolvers/review-outcomes.d.ts.map +1 -1
- package/dist/resolvers/review-outcomes.js +27 -24
- package/dist/resolvers/review-outcomes.js.map +1 -1
- package/dist/resolvers/security-advisory.d.ts +2 -1
- package/dist/resolvers/security-advisory.d.ts.map +1 -1
- package/dist/resolvers/security-advisory.js +47 -44
- package/dist/resolvers/security-advisory.js.map +1 -1
- package/dist/resolvers/wiki-search.d.ts +8 -1
- package/dist/resolvers/wiki-search.d.ts.map +1 -1
- package/dist/resolvers/wiki-search.js +17 -14
- package/dist/resolvers/wiki-search.js.map +1 -1
- package/dist/resolvers/wiki-topic.d.ts +9 -1
- package/dist/resolvers/wiki-topic.d.ts.map +1 -1
- package/dist/resolvers/wiki-topic.js +21 -18
- package/dist/resolvers/wiki-topic.js.map +1 -1
- package/dist/resolvers/workflow-stages.d.ts +7 -1
- package/dist/resolvers/workflow-stages.d.ts.map +1 -1
- package/dist/resolvers/workflow-stages.js +20 -17
- package/dist/resolvers/workflow-stages.js.map +1 -1
- package/dist/self-update.d.ts +6 -0
- package/dist/self-update.d.ts.map +1 -1
- package/dist/self-update.js +6 -1
- package/dist/self-update.js.map +1 -1
- package/dist/spawner/index.d.ts +2 -1
- package/dist/spawner/index.d.ts.map +1 -1
- package/dist/spawner/index.js +2 -1
- package/dist/spawner/index.js.map +1 -1
- package/dist/spawner/spawn-team.d.ts +14 -52
- package/dist/spawner/spawn-team.d.ts.map +1 -1
- package/dist/spawner/spawn-team.js +14 -469
- package/dist/spawner/spawn-team.js.map +1 -1
- package/dist/staleness.d.ts +124 -0
- package/dist/staleness.d.ts.map +1 -0
- package/dist/staleness.js +215 -0
- package/dist/staleness.js.map +1 -0
- package/dist/state-cascade.d.ts +3 -2
- package/dist/state-cascade.d.ts.map +1 -1
- package/dist/state-cascade.js +7 -3
- package/dist/state-cascade.js.map +1 -1
- package/dist/types/focus.d.ts +5 -4
- package/dist/types/focus.d.ts.map +1 -1
- package/dist/types/session.d.ts +2 -3
- package/dist/types/session.d.ts.map +1 -1
- package/dist/unified-shell.d.ts.map +1 -1
- package/dist/unified-shell.js +21 -12
- package/dist/unified-shell.js.map +1 -1
- package/package.json +2 -2
- package/dist/session-lifecycle.d.ts +0 -78
- package/dist/session-lifecycle.d.ts.map +0 -1
- package/dist/session-lifecycle.js +0 -382
- package/dist/session-lifecycle.js.map +0 -1
|
@@ -1,474 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* DEPRECATED SHIM -- the real spawn implementation lives in focus-executor.ts.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
import { getFocusWorktree, setFocusWorktree } from '../focus-worktree-state.js';
|
|
15
|
-
import { recordActivity } from '../heartbeat.js';
|
|
16
|
-
import { buildFocusTeamPrompt } from '../focus-prompt-builder.js';
|
|
17
|
-
import { getFocusDeliveries, getFocusIssues, getProductContextForFocus, getProductDeploymentProfileSnapshot } from '../queries/focuses.js';
|
|
18
|
-
import { buildLeveredSpawnEnvironment, fetchBackendEnvExtras } from '../spawn-environment.js';
|
|
19
|
-
import { sanitizeGitSegment } from '../git-utils.js';
|
|
20
|
-
import { recordFocusTeardown } from '../spawn-cooldown.js';
|
|
21
|
-
import { markSessionPersisted } from '../telemetry-writer.js';
|
|
22
|
-
import { consumePendingSpawnDirective } from '../directive-executor.js';
|
|
23
|
-
import { isStatusAgentActionable, isStatusBlocking } from '../stage-classifier.js';
|
|
24
|
-
import { getActiveTeams, deriveExecutionConfig, } from '../focus-team-state.js';
|
|
25
|
-
import { setupOutputMonitoring } from '../output-monitor.js';
|
|
26
|
-
import { resolveResumeId } from '../session-lineage.js';
|
|
27
|
-
import { getBackend, resolveBackend } from '../backends/index.js';
|
|
28
|
-
// ── Resource governor (optional, injected by FocusEngine) ─────────
|
|
29
|
-
let governor = null;
|
|
30
|
-
/** Inject the resource governor for global concurrency limiting. */
|
|
31
|
-
export function initGovernor(gov) {
|
|
32
|
-
governor = gov;
|
|
33
|
-
}
|
|
34
|
-
/** Get the current resource governor (for use by session-lifecycle). */
|
|
35
|
-
export function getGovernor() {
|
|
36
|
-
return governor;
|
|
37
|
-
}
|
|
38
|
-
// ── Team spawning helpers ─────────────────────────────────────────────
|
|
39
|
-
/**
|
|
40
|
-
* Generate branch name for focus-level work.
|
|
41
|
-
*/
|
|
42
|
-
export function generateFocusBranchName(role, focusName, focusId) {
|
|
43
|
-
const sanitizedRoleName = sanitizeGitSegment(role.name);
|
|
44
|
-
const shortId = focusId.slice(0, 8);
|
|
45
|
-
const sanitizedFocusName = sanitizeGitSegment(focusName);
|
|
46
|
-
return `agent/${sanitizedRoleName}/${sanitizedFocusName}-${shortId}`;
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Build CLI args for the team lead via the selected backend.
|
|
50
|
-
*
|
|
51
|
-
* Engine-specific flag construction (Claude's `--teammate-mode` + stream-json,
|
|
52
|
-
* Codex's `exec --json`, ...) lives in the backend. Resume uses the backend's
|
|
53
|
-
* dedicated resume-arg builder because some engines (Codex) resume via a
|
|
54
|
-
* different subcommand than they spawn.
|
|
55
|
-
*/
|
|
56
|
-
export function buildAgentArgs(backend, config, worktreePath, pipelineConfig, resumeSessionId) {
|
|
57
|
-
const base = { config, worktreePath, model: pipelineConfig?.model ?? null };
|
|
58
|
-
return resumeSessionId
|
|
59
|
-
? backend.buildResumeArgs({ ...base, resumeSessionId })
|
|
60
|
-
: backend.buildSpawnArgs(base);
|
|
61
|
-
}
|
|
62
|
-
// ── Phase functions ───────────────────────────────────────────────────
|
|
63
|
-
/**
|
|
64
|
-
* Set up or reuse a worktree for the focus.
|
|
65
|
-
* Returns the worktree path, or null if setup fails.
|
|
66
|
-
*/
|
|
67
|
-
async function setupWorktree(config, focusId, focusName, branchName, readOnly) {
|
|
68
|
-
const existingWorktree = getFocusWorktree(focusId);
|
|
69
|
-
if (existingWorktree) {
|
|
70
|
-
const worktreePath = existingWorktree.worktreePath;
|
|
71
|
-
// Rebase onto integration to pick up latest changes from other focuses
|
|
72
|
-
const rebaseResult = runGitSync(['rebase', config.integrationBranch], worktreePath);
|
|
73
|
-
if (!rebaseResult.success) {
|
|
74
|
-
runGitSync(['rebase', '--abort'], worktreePath);
|
|
75
|
-
console.warn(`[focus-executor] Rebase failed for "${focusName}", continuing with existing state`);
|
|
76
|
-
}
|
|
77
|
-
console.log(` Worktree (reused): ${worktreePath}`);
|
|
78
|
-
return worktreePath;
|
|
79
|
-
}
|
|
80
|
-
// Guard: can't create worktrees in a repo with no commits
|
|
81
|
-
if (!repoHasCommits(config.repoPath)) {
|
|
82
|
-
console.warn(`[focus-executor] Repository has no commits -- cannot create worktree for "${focusName}"`);
|
|
83
|
-
return null;
|
|
84
|
-
}
|
|
85
|
-
// Fallback: worktree doesn't exist yet (race condition or first poll)
|
|
86
|
-
console.warn(`[focus-executor] No persistent worktree for "${focusName}", creating inline`);
|
|
87
|
-
try {
|
|
88
|
-
const worktreePath = await createWorktree(config, branchName);
|
|
89
|
-
setFocusWorktree(focusId, {
|
|
90
|
-
focusId,
|
|
91
|
-
focusName,
|
|
92
|
-
worktreePath,
|
|
93
|
-
branchName,
|
|
94
|
-
createdAt: new Date(),
|
|
95
|
-
});
|
|
96
|
-
console.log(` Worktree (created inline): ${worktreePath}`);
|
|
97
|
-
// Install audit pre-commit hook for read-only focuses
|
|
98
|
-
if (readOnly) {
|
|
99
|
-
installAuditPreCommitHook(worktreePath);
|
|
100
|
-
console.log(` Installed audit pre-commit hook (read-only mode)`);
|
|
101
|
-
}
|
|
102
|
-
return worktreePath;
|
|
103
|
-
}
|
|
104
|
-
catch (err) {
|
|
105
|
-
console.error(`[focus-executor] Failed to create worktree for focus "${focusName}":`, err instanceof Error ? err.message : String(err));
|
|
106
|
-
return null;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Fetch all focus context: deliveries, issues, product context, deployment profile.
|
|
111
|
-
*/
|
|
112
|
-
async function fetchFocusContext(config, focusId, _focusName) {
|
|
113
|
-
const [deliveries, issues, productContextDocs, deploymentProfileSnapshot] = await Promise.all([
|
|
114
|
-
getFocusDeliveries(focusId),
|
|
115
|
-
getFocusIssues(focusId),
|
|
116
|
-
getProductContextForFocus(config.productId, focusId),
|
|
117
|
-
getProductDeploymentProfileSnapshot(config.productId).catch((err) => {
|
|
118
|
-
console.debug(`[focus-executor] Could not fetch deployment profile snapshot (non-fatal):`, err.message);
|
|
119
|
-
return null;
|
|
120
|
-
}),
|
|
121
|
-
]);
|
|
122
|
-
return { deliveries, issues, productContextDocs, deploymentProfileSnapshot };
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Create a session record for the team lead.
|
|
126
|
-
* Returns the session, or null if creation fails.
|
|
127
|
-
*/
|
|
128
|
-
async function createTeamSession(config, role, focusId, branchName, focusName, sessionType = 'coding') {
|
|
129
|
-
try {
|
|
130
|
-
const session = await createSession({
|
|
131
|
-
organizationId: config.organizationId,
|
|
132
|
-
roleId: role.id,
|
|
133
|
-
issueId: null,
|
|
134
|
-
focusId,
|
|
135
|
-
branchName,
|
|
136
|
-
sessionType,
|
|
137
|
-
});
|
|
138
|
-
// Register so the telemetry writer's persistence gate keeps the session_id
|
|
139
|
-
// intact for any OTLP rows tagged with this id. Mirrors the pattern in
|
|
140
|
-
// focus-executor.ts:markSessionPersisted (defensive: this code path is
|
|
141
|
-
// currently unreachable but must be correct if it becomes reachable).
|
|
142
|
-
markSessionPersisted(session.id);
|
|
143
|
-
return session;
|
|
144
|
-
}
|
|
145
|
-
catch (err) {
|
|
146
|
-
console.error(`[focus-executor] Failed to create session for focus "${focusName}":`, err.message);
|
|
147
|
-
return null;
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* Open log file streams for the team lead process.
|
|
152
|
-
*/
|
|
153
|
-
function openLogStreams(config, branchName, focusName) {
|
|
154
|
-
// Ensure log directory exists
|
|
155
|
-
if (!existsSync(config.logDir)) {
|
|
156
|
-
mkdirSync(config.logDir, { recursive: true, mode: 0o700 });
|
|
157
|
-
}
|
|
158
|
-
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
159
|
-
const logPrefix = `focus-${branchName.replace(/\//g, '-')}-${timestamp}`;
|
|
160
|
-
const stdoutPath = join(config.logDir, `${logPrefix}.stdout.log`);
|
|
161
|
-
const stderrPath = join(config.logDir, `${logPrefix}.stderr.log`);
|
|
162
|
-
const jsonlPath = join(config.logDir, `${logPrefix}.stream.jsonl`);
|
|
163
|
-
const stdoutLogStream = createWriteStream(stdoutPath, { mode: 0o600 });
|
|
164
|
-
const stderrStream = createWriteStream(stderrPath, { mode: 0o600 });
|
|
165
|
-
const jsonlStream = createWriteStream(jsonlPath, { mode: 0o600 });
|
|
166
|
-
// Attach error handlers to prevent unhandled 'error' events from crashing the daemon
|
|
167
|
-
stdoutLogStream.on('error', (err) => {
|
|
168
|
-
console.warn(`[focus-executor] stdout log stream error for "${focusName}": ${err.message}`);
|
|
169
|
-
});
|
|
170
|
-
stderrStream.on('error', (err) => {
|
|
171
|
-
console.warn(`[focus-executor] stderr log stream error for "${focusName}": ${err.message}`);
|
|
172
|
-
});
|
|
173
|
-
jsonlStream.on('error', (err) => {
|
|
174
|
-
console.warn(`[focus-executor] jsonl log stream error for "${focusName}": ${err.message}`);
|
|
175
|
-
});
|
|
176
|
-
return { stdoutLogStream, stderrStream, jsonlStream, stdoutPath, stderrPath };
|
|
177
|
-
}
|
|
178
|
-
/**
|
|
179
|
-
* Build args, env, acquire governor slot, and spawn the Claude Code process.
|
|
180
|
-
* Returns the child process, or null if governor denied the slot.
|
|
181
|
-
*/
|
|
182
|
-
async function buildAndSpawnProcess(config, backend, pipelineConfig, resumeId, sessionId, focusId, focusName, worktreePath,
|
|
183
|
-
/**
|
|
184
|
-
* Loop/execution phase to stamp on telemetry (the controllable lever). The
|
|
185
|
-
* focus team-lead runs the focus's execute phase; review-lineage spawns run
|
|
186
|
-
* the gate phase. Mirrors focus-executor.ts so both team-lead spawn paths
|
|
187
|
-
* tag spend identically.
|
|
188
|
-
*/
|
|
189
|
-
spawnPhase,
|
|
190
|
-
/**
|
|
191
|
-
* Workflow stage active at spawn. This module does not resolve the workflow
|
|
192
|
-
* stage NAME from the delivery's currentWorkflowStageId (a UUID); the caller
|
|
193
|
-
* passes the coding-stage default, which is the correct stage for the normal
|
|
194
|
-
* focus team-lead spawn this module drives.
|
|
195
|
-
*/
|
|
196
|
-
spawnStage) {
|
|
197
|
-
const args = buildAgentArgs(backend, config, worktreePath, pipelineConfig, resumeId);
|
|
198
|
-
if (resumeId) {
|
|
199
|
-
console.log(`[focus-executor] Resuming ${backend.displayName} session ${resumeId} for "${focusName}"`);
|
|
200
|
-
}
|
|
201
|
-
// Levered spawn: phase + stage are REQUIRED by buildLeveredSpawnEnvironment,
|
|
202
|
-
// so this team-lead path can no longer drop the telemetry lever silently.
|
|
203
|
-
const spawnEnv = buildLeveredSpawnEnvironment(config, {
|
|
204
|
-
orgId: config.organizationId,
|
|
205
|
-
focusId,
|
|
206
|
-
sessionId,
|
|
207
|
-
phase: spawnPhase,
|
|
208
|
-
stage: spawnStage,
|
|
209
|
-
});
|
|
210
|
-
// Inject backend-specific org secrets (e.g. CODEX_API_KEY for the codex backend).
|
|
211
|
-
// Non-fatal: fetchBackendEnvExtras returns {} on any error, falling back to host creds.
|
|
212
|
-
Object.assign(spawnEnv, await fetchBackendEnvExtras(backend.id));
|
|
213
|
-
// Acquire governor slot (if governor is configured)
|
|
214
|
-
if (governor) {
|
|
215
|
-
try {
|
|
216
|
-
await governor.acquireSlot('focus');
|
|
217
|
-
}
|
|
218
|
-
catch (err) {
|
|
219
|
-
console.warn(`[focus-executor] Governor denied slot for "${focusName}":`, err.message);
|
|
220
|
-
return null;
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
// Spawn the team lead process
|
|
224
|
-
const proc = spawn(backend.resolveCommand(config), args, {
|
|
225
|
-
cwd: worktreePath,
|
|
226
|
-
env: spawnEnv,
|
|
227
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
228
|
-
});
|
|
229
|
-
return proc;
|
|
230
|
-
}
|
|
231
|
-
// ── Main spawn function ───────────────────────────────────────────────
|
|
232
|
-
/**
|
|
233
|
-
* Spawn a focus team to execute all deliveries in a focus.
|
|
4
|
+
* This file held a 612-line decomposed near-duplicate of focus-executor's
|
|
5
|
+
* spawnFocusTeam. The two copies had to be kept in sync by hand, and the
|
|
6
|
+
* duplicate (reachable only via the dead session-lifecycle retry loop)
|
|
7
|
+
* silently drifted: it resolved its resume-failure respawn and its resource
|
|
8
|
+
* governor from module-local bindings nothing initialized. The Daemon
|
|
9
|
+
* Orchestration Decomposition focus (injection #12) unified the paths: ONE
|
|
10
|
+
* spawn implementation -- focus-executor.spawnFocusTeam -- serves all callers
|
|
11
|
+
* (the listener poll loop, directive spawn mode via the pending-directive
|
|
12
|
+
* queue, and the resume-failure retry injected into
|
|
13
|
+
* spawner/helpers.handleTeamProcessClose).
|
|
234
14
|
*
|
|
235
|
-
*
|
|
236
|
-
*
|
|
15
|
+
* Kept as a re-export shim so the spawner barrel (index.ts) and any direct
|
|
16
|
+
* importers keep resolving the SAME live symbols. Do not add logic here.
|
|
237
17
|
*/
|
|
238
|
-
export
|
|
239
|
-
const { config, focusId, focusName, role, pipelineConfig, readOnly = false, claudeSessionIds, engineOverride, orgDefaultEngine } = params;
|
|
240
|
-
const activeTeams = getActiveTeams();
|
|
241
|
-
// The agent backend is resolved per-pass below, once the spawn's lineage
|
|
242
|
-
// (coding vs review) is known from the pending directive (D3).
|
|
243
|
-
// Prevent double-spawn
|
|
244
|
-
if (activeTeams.has(focusId)) {
|
|
245
|
-
console.warn(`[focus-executor] Team already active for focus "${focusName}", skipping spawn`);
|
|
246
|
-
return;
|
|
247
|
-
}
|
|
248
|
-
const executionConfig = deriveExecutionConfig(pipelineConfig);
|
|
249
|
-
const branchName = generateFocusBranchName(role, focusName, focusId);
|
|
250
|
-
// Initialize team state
|
|
251
|
-
const teamState = {
|
|
252
|
-
focusId,
|
|
253
|
-
focusName,
|
|
254
|
-
roleId: role.id,
|
|
255
|
-
roleName: role.name,
|
|
256
|
-
organizationId: config.organizationId,
|
|
257
|
-
productId: config.productId,
|
|
258
|
-
executionConfig,
|
|
259
|
-
pipelineConfig,
|
|
260
|
-
startedAt: new Date(),
|
|
261
|
-
phase: 'initializing',
|
|
262
|
-
knownDeliveryIds: new Set(),
|
|
263
|
-
mergedDeliveryIds: new Set(),
|
|
264
|
-
planningPhase: false,
|
|
265
|
-
shutdownReason: null,
|
|
266
|
-
deliveryStageIds: new Map(),
|
|
267
|
-
leadSessionId: null,
|
|
268
|
-
leadPid: null,
|
|
269
|
-
leadStdin: null,
|
|
270
|
-
branchName,
|
|
271
|
-
worktreePath: null,
|
|
272
|
-
resolvingMergeConflict: false,
|
|
273
|
-
readOnly,
|
|
274
|
-
completionDetector: null,
|
|
275
|
-
claudeSessionId: null,
|
|
276
|
-
lastProgressSnapshot: null,
|
|
277
|
-
noProgressCycles: 0,
|
|
278
|
-
lastConsumedDirectiveHash: null,
|
|
279
|
-
sessionType: 'coding',
|
|
280
|
-
lineage: 'coding',
|
|
281
|
-
};
|
|
282
|
-
activeTeams.set(focusId, teamState);
|
|
283
|
-
console.log(`[focus-executor] Spawning team for focus "${focusName}"${readOnly ? ' [READ-ONLY]' : ''}`);
|
|
284
|
-
console.log(` Role: ${role.name}`);
|
|
285
|
-
console.log(` Model: ${pipelineConfig?.model ?? '(CLI default)'}`);
|
|
286
|
-
console.log(` Max workers: ${executionConfig.maxWorkers}`);
|
|
287
|
-
console.log(` Branch: ${branchName}`);
|
|
288
|
-
// Fetch all deliveries, issues, product context, and deployment profile for the focus
|
|
289
|
-
let deliveries;
|
|
290
|
-
let issues;
|
|
291
|
-
let productContextDocs;
|
|
292
|
-
let deploymentProfileSnapshot;
|
|
293
|
-
try {
|
|
294
|
-
({ deliveries, issues, productContextDocs, deploymentProfileSnapshot } =
|
|
295
|
-
await fetchFocusContext(config, focusId, focusName));
|
|
296
|
-
}
|
|
297
|
-
catch (err) {
|
|
298
|
-
console.error(`[focus-executor] Failed to fetch context for focus "${focusName}":`, err.message);
|
|
299
|
-
activeTeams.delete(focusId);
|
|
300
|
-
return;
|
|
301
|
-
}
|
|
302
|
-
// Check for pending spawn directive (e.g., stage directive spawn).
|
|
303
|
-
// Record its content hash on team state so the spawn-guard in
|
|
304
|
-
// executeSpawnDirective can detect divergent directives within the 60s
|
|
305
|
-
// skip window.
|
|
306
|
-
const pendingDirective = consumePendingSpawnDirective(focusId);
|
|
307
|
-
if (pendingDirective) {
|
|
308
|
-
teamState.lastConsumedDirectiveHash = pendingDirective.contentHash;
|
|
309
|
-
teamState.sessionType = pendingDirective.sessionType;
|
|
310
|
-
teamState.lineage = pendingDirective.lineage;
|
|
311
|
-
}
|
|
312
|
-
// Resolve the engine backend for this spawn's pass (coding vs review) via the
|
|
313
|
-
// single resolveBackend() selection point (D3). Nulls => 'claude' (parity).
|
|
314
|
-
const enginePass = teamState.lineage === 'review' ? 'review' : 'coding';
|
|
315
|
-
const resolvedEngine = resolveBackend({ focusOverride: engineOverride, pass: enginePass, orgDefault: orgDefaultEngine });
|
|
316
|
-
const backend = getBackend(resolvedEngine.engineId);
|
|
317
|
-
console.log(`[focus-executor] Engine for "${focusName}" pass=${enginePass}: ` +
|
|
318
|
-
`${resolvedEngine.engineId} (source: ${resolvedEngine.source})`);
|
|
319
|
-
// Pre-spawn guard: enforce rank-ordered execution.
|
|
320
|
-
// Walk deliveries in priority_rank order (already sorted by API).
|
|
321
|
-
// A delivery is actionable only if all lower-ranked deliveries are non-blocking.
|
|
322
|
-
// Skip this guard when a pending directive exists -- the directive has its own intent.
|
|
323
|
-
if (!pendingDirective) {
|
|
324
|
-
let nextActionable = null;
|
|
325
|
-
for (const d of deliveries) {
|
|
326
|
-
const status = d.executionStatus ?? '';
|
|
327
|
-
if (!isStatusBlocking(status))
|
|
328
|
-
continue;
|
|
329
|
-
if (isStatusAgentActionable(status)) {
|
|
330
|
-
nextActionable = d;
|
|
331
|
-
}
|
|
332
|
-
else {
|
|
333
|
-
// Blocking status (planning, paused) prevents subsequent deliveries
|
|
334
|
-
console.log(`[focus-executor] Delivery "${d.name}" (rank ${d.priorityRank}) ` +
|
|
335
|
-
`is in "${status}" state -- blocking subsequent deliveries in focus "${focusName}"`);
|
|
336
|
-
}
|
|
337
|
-
break;
|
|
338
|
-
}
|
|
339
|
-
if (!nextActionable || !isStatusAgentActionable(nextActionable.executionStatus ?? '')) {
|
|
340
|
-
console.log(`[focus-executor] No actionable deliveries for focus "${focusName}" -- skipping spawn`);
|
|
341
|
-
activeTeams.delete(focusId);
|
|
342
|
-
return;
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
const actionableDeliveries = deliveries.filter(d => isStatusAgentActionable(d.executionStatus ?? ''));
|
|
346
|
-
// Track known deliveries, pre-populate already-completed ones.
|
|
347
|
-
// Empty deliveries (planning spawn) yields zero iterations.
|
|
348
|
-
for (const d of deliveries) {
|
|
349
|
-
teamState.knownDeliveryIds.add(d.id);
|
|
350
|
-
teamState.deliveryStageIds.set(d.id, d.currentWorkflowStageId);
|
|
351
|
-
if (!isStatusAgentActionable(d.executionStatus ?? '') && !isStatusBlocking(d.executionStatus ?? '')) {
|
|
352
|
-
teamState.mergedDeliveryIds.add(d.id);
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
console.log(` Deliveries: ${deliveries.length} (${actionableDeliveries.length} queued)`);
|
|
356
|
-
console.log(` Issues: ${issues.length}`);
|
|
357
|
-
// Set up worktree
|
|
358
|
-
const worktreePath = await setupWorktree(config, focusId, focusName, branchName, readOnly);
|
|
359
|
-
if (!worktreePath) {
|
|
360
|
-
activeTeams.delete(focusId);
|
|
361
|
-
// Record a cooldown so the daemon backs off instead of retrying every poll cycle
|
|
362
|
-
recordFocusTeardown(focusId);
|
|
363
|
-
return;
|
|
364
|
-
}
|
|
365
|
-
teamState.worktreePath = worktreePath;
|
|
366
|
-
// Create session record for the team lead
|
|
367
|
-
const session = await createTeamSession(config, role, focusId, branchName, focusName, 'coding');
|
|
368
|
-
if (!session) {
|
|
369
|
-
// Worktree is focus-owned and persists even if session creation fails
|
|
370
|
-
activeTeams.delete(focusId);
|
|
371
|
-
return;
|
|
372
|
-
}
|
|
373
|
-
teamState.leadSessionId = session.id;
|
|
374
|
-
recordActivity();
|
|
375
|
-
// Build the team lead prompt with full focus context
|
|
376
|
-
const prompt = buildFocusTeamPrompt(role, {
|
|
377
|
-
focusId,
|
|
378
|
-
focusName,
|
|
379
|
-
organizationId: config.organizationId,
|
|
380
|
-
productId: config.productId,
|
|
381
|
-
deliveries,
|
|
382
|
-
issues,
|
|
383
|
-
executionConfig,
|
|
384
|
-
pipelineConfig,
|
|
385
|
-
productContextDocs,
|
|
386
|
-
deploymentProfileSnapshot,
|
|
387
|
-
readOnly,
|
|
388
|
-
engineId: backend.id,
|
|
389
|
-
});
|
|
390
|
-
// Open log streams
|
|
391
|
-
const logStreams = openLogStreams(config, branchName, focusName);
|
|
392
|
-
// Build args and env, acquire governor slot, spawn process.
|
|
393
|
-
// Resolve the resume id from the focus's per-lineage session map (INJ-A),
|
|
394
|
-
// honoring the spawn's declared continuity policy (INJ-B). The legacy
|
|
395
|
-
// non-directive path defaults to coding/resume.
|
|
396
|
-
const spawnContinuity = pendingDirective?.continuity ?? 'resume';
|
|
397
|
-
const resumeId = resolveResumeId({
|
|
398
|
-
sessionMap: claudeSessionIds,
|
|
399
|
-
lineage: teamState.lineage,
|
|
400
|
-
continuity: spawnContinuity,
|
|
401
|
-
});
|
|
402
|
-
// Update session to starting with log paths
|
|
403
|
-
await updateSession(session.id, {
|
|
404
|
-
status: 'starting',
|
|
405
|
-
started_at: new Date().toISOString(),
|
|
406
|
-
stdout_path: logStreams.stdoutPath,
|
|
407
|
-
stderr_path: logStreams.stderrPath,
|
|
408
|
-
});
|
|
409
|
-
// If a spawn directive specifies a model override, use it
|
|
410
|
-
const effectivePipelineConfig = pendingDirective?.model
|
|
411
|
-
? { ...pipelineConfig, model: pendingDirective.model }
|
|
412
|
-
: pipelineConfig;
|
|
413
|
-
// Tag spend with the lever. The team-lead runs the focus's execute phase;
|
|
414
|
-
// a review-lineage spawn runs the gate phase (mirrors focus-executor.ts).
|
|
415
|
-
// Stage: this module does not resolve the workflow-stage name, so the
|
|
416
|
-
// team-lead spawn uses the coding-stage default (the stage a normal
|
|
417
|
-
// execute-phase team runs in). Review spawns are tagged 'reviewing'.
|
|
418
|
-
const spawnPhase = teamState.lineage === 'review' ? 'gate' : 'execute';
|
|
419
|
-
const spawnStage = teamState.lineage === 'review' ? 'reviewing' : 'coding';
|
|
420
|
-
const proc = await buildAndSpawnProcess(config, backend, effectivePipelineConfig, resumeId, session.id, focusId, focusName, worktreePath, spawnPhase, spawnStage);
|
|
421
|
-
if (!proc) {
|
|
422
|
-
activeTeams.delete(focusId);
|
|
423
|
-
logStreams.stdoutLogStream.end();
|
|
424
|
-
logStreams.stderrStream.end();
|
|
425
|
-
logStreams.jsonlStream.end();
|
|
426
|
-
return;
|
|
427
|
-
}
|
|
428
|
-
teamState.leadPid = proc.pid ?? null;
|
|
429
|
-
teamState.leadStdin = proc.stdin;
|
|
430
|
-
teamState.phase = 'executing';
|
|
431
|
-
// Set up output monitoring (stream parsing, activity tracking, event logging)
|
|
432
|
-
const { completionDetector, activityTracker } = setupOutputMonitoring({
|
|
433
|
-
proc,
|
|
434
|
-
backend,
|
|
435
|
-
teamState,
|
|
436
|
-
focusId,
|
|
437
|
-
focusName,
|
|
438
|
-
sessionId: session.id,
|
|
439
|
-
logStreams,
|
|
440
|
-
});
|
|
441
|
-
// Stderr pipes to log
|
|
442
|
-
proc.stderr?.pipe(logStreams.stderrStream);
|
|
443
|
-
// Send prompt via stdin (engine-specific input encoding lives in the backend)
|
|
444
|
-
proc.stdin.write(backend.encodeInput(prompt));
|
|
445
|
-
// If a spawn directive is pending, send its assembled content as a follow-up message
|
|
446
|
-
if (pendingDirective && pendingDirective.message.trim()) {
|
|
447
|
-
console.log(`[focus-executor] Sending pending spawn directive to "${focusName}" ` +
|
|
448
|
-
`(${pendingDirective.message.length} chars, model: ${pendingDirective.model ?? 'default'})`);
|
|
449
|
-
proc.stdin.write(backend.encodeInput(pendingDirective.message));
|
|
450
|
-
}
|
|
451
|
-
// Update session to running
|
|
452
|
-
await updateSession(session.id, {
|
|
453
|
-
status: 'running',
|
|
454
|
-
pid: proc.pid,
|
|
455
|
-
});
|
|
456
|
-
console.log(`[focus-executor] Team lead spawned for "${focusName}" (PID: ${proc.pid}, session: ${session.id})`);
|
|
457
|
-
// Set up session lifecycle handlers (completion, close, error)
|
|
458
|
-
const { attachSessionLifecycle } = await import('../session-lifecycle.js');
|
|
459
|
-
attachSessionLifecycle({
|
|
460
|
-
proc,
|
|
461
|
-
params,
|
|
462
|
-
teamState,
|
|
463
|
-
sessionId: session.id,
|
|
464
|
-
focusId,
|
|
465
|
-
focusName,
|
|
466
|
-
completionDetector,
|
|
467
|
-
activityTracker,
|
|
468
|
-
logStreams,
|
|
469
|
-
resumeId,
|
|
470
|
-
spawnedAt: Date.now(),
|
|
471
|
-
config,
|
|
472
|
-
});
|
|
473
|
-
}
|
|
18
|
+
export { spawnFocusTeam, generateFocusBranchName, buildAgentArgs, initGovernor, getGovernor, } from '../focus-executor.js';
|
|
474
19
|
//# sourceMappingURL=spawn-team.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spawn-team.js","sourceRoot":"","sources":["../../src/spawner/spawn-team.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"spawn-team.js","sourceRoot":"","sources":["../../src/spawner/spawn-team.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,cAAc,EACd,YAAY,EACZ,WAAW,GAEZ,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Staleness signal: is the RUNNING daemon behind the latest published release?
|
|
3
|
+
*
|
|
4
|
+
* Consumed by `telora-daemon status` and `telora-daemon session-state` to
|
|
5
|
+
* surface a one-line warning when the running daemon version is behind the
|
|
6
|
+
* latest published @telora/daemon. The CLI binary executing those commands may
|
|
7
|
+
* be a DIFFERENT install than the running daemon (repo checkout vs npx cache),
|
|
8
|
+
* so the running version comes from daemon.meta.json -- stamped by the daemon
|
|
9
|
+
* itself at startup -- never from the CLI's own package.json.
|
|
10
|
+
*
|
|
11
|
+
* Design constraints:
|
|
12
|
+
* - Silent degradation: never writes to stdout; any failure (no meta, legacy
|
|
13
|
+
* meta without a version stamp, daemon not running, registry unreachable)
|
|
14
|
+
* returns null so callers print their normal output unchanged. The
|
|
15
|
+
* underlying checkForUpdates console.warns on failure -- that goes to
|
|
16
|
+
* stderr, which the session-state stdout contract tolerates.
|
|
17
|
+
* - Cached: the registry answer is cached in the global state dir
|
|
18
|
+
* (version-check-cache.json) with a 6h TTL. An EXPIRED cache is never used
|
|
19
|
+
* as a fallback -- a failed refresh returns null rather than reporting
|
|
20
|
+
* staleness from old data (no stale-cache false positives).
|
|
21
|
+
* - Latency split: session-state is CACHE-ONLY (zero network -- the
|
|
22
|
+
* SessionStart hook blocks Claude Code on this command, and an unreachable
|
|
23
|
+
* registry would otherwise hang it for the full fetch timeout). The async
|
|
24
|
+
* half of "async or cached" lives in the RUNNING DAEMON, which refreshes
|
|
25
|
+
* the cache on a timer (startVersionCacheRefreshLoop) in every install
|
|
26
|
+
* mode, including npx with auto-update disabled -- the case the signal
|
|
27
|
+
* exists for. `status` keeps the live registry fallback: it is an
|
|
28
|
+
* interactive command where a few seconds for a fresh answer is fine.
|
|
29
|
+
*/
|
|
30
|
+
import { type DaemonMeta } from './daemon-process.js';
|
|
31
|
+
import { type VersionCheckResult } from './version-check.js';
|
|
32
|
+
import type { InstallMode } from './self-update.js';
|
|
33
|
+
export interface StalenessInfo {
|
|
34
|
+
/** Version of the running daemon (from daemon.meta.json). */
|
|
35
|
+
runningVersion: string;
|
|
36
|
+
/** Latest published version (registry or fresh cache). */
|
|
37
|
+
latestVersion: string;
|
|
38
|
+
/** True when latestVersion is strictly newer than runningVersion. */
|
|
39
|
+
updateAvailable: boolean;
|
|
40
|
+
/** Install mode of the running daemon, when stamped. */
|
|
41
|
+
installMode?: InstallMode;
|
|
42
|
+
/** Whether the running daemon has auto-update enabled, when stamped. */
|
|
43
|
+
autoUpdateEnabled?: boolean;
|
|
44
|
+
}
|
|
45
|
+
/** On-disk shape of the version-check cache file. */
|
|
46
|
+
export interface VersionCheckCache {
|
|
47
|
+
checkedAt: string;
|
|
48
|
+
latestVersion: string;
|
|
49
|
+
}
|
|
50
|
+
/** Cache freshness window. Within this, no network call is made. */
|
|
51
|
+
export declare const VERSION_CHECK_CACHE_TTL_MS: number;
|
|
52
|
+
/** Cache file name within the global state dir (~/.telora/). */
|
|
53
|
+
export declare const VERSION_CHECK_CACHE_FILE = "version-check-cache.json";
|
|
54
|
+
/** Injectable dependencies for {@link getStalenessInfoCore} (tests). */
|
|
55
|
+
export interface StalenessDeps {
|
|
56
|
+
readMeta: () => DaemonMeta | null;
|
|
57
|
+
isDaemonRunning: () => boolean;
|
|
58
|
+
readCache: () => VersionCheckCache | null;
|
|
59
|
+
writeCache: (cache: VersionCheckCache) => void;
|
|
60
|
+
checkForUpdates: (currentVersion: string) => Promise<VersionCheckResult | null>;
|
|
61
|
+
now: () => number;
|
|
62
|
+
}
|
|
63
|
+
export declare function resolveVersionCheckCachePath(): string;
|
|
64
|
+
/** Options for {@link getStalenessInfoCore} / {@link getStalenessInfo}. */
|
|
65
|
+
export interface StalenessOptions {
|
|
66
|
+
/**
|
|
67
|
+
* Never touch the network: answer from a fresh cache or return null.
|
|
68
|
+
* Used by session-state, whose stdout the SessionStart hook blocks on --
|
|
69
|
+
* an unreachable registry must not add even one fetch-timeout of latency.
|
|
70
|
+
* The running daemon's refresh loop keeps the cache warm.
|
|
71
|
+
*/
|
|
72
|
+
cacheOnly?: boolean;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Compute staleness info for the running daemon, with injected dependencies.
|
|
76
|
+
*
|
|
77
|
+
* Returns null whenever the signal cannot be established with confidence:
|
|
78
|
+
* no meta file, legacy meta without a version stamp, daemon not running,
|
|
79
|
+
* or no fresh latest-version answer (expired cache + failed registry check,
|
|
80
|
+
* or expired cache in cacheOnly mode).
|
|
81
|
+
*/
|
|
82
|
+
export declare function getStalenessInfoCore(deps: StalenessDeps, opts?: StalenessOptions): Promise<StalenessInfo | null>;
|
|
83
|
+
/**
|
|
84
|
+
* Compute staleness info for the running daemon (production deps).
|
|
85
|
+
* Never throws; never writes stdout. Returns null when no signal applies.
|
|
86
|
+
*/
|
|
87
|
+
export declare function getStalenessInfo(opts?: StalenessOptions): Promise<StalenessInfo | null>;
|
|
88
|
+
/** Injectable dependencies for {@link maybeRefreshVersionCheckCacheCore} (tests). */
|
|
89
|
+
export interface CacheRefreshDeps {
|
|
90
|
+
readCache: () => VersionCheckCache | null;
|
|
91
|
+
writeCache: (cache: VersionCheckCache) => void;
|
|
92
|
+
checkForUpdates: (currentVersion: string) => Promise<VersionCheckResult | null>;
|
|
93
|
+
now: () => number;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Refresh the version-check cache when it is missing or expired.
|
|
97
|
+
* Returns true when a fresh registry answer was written, false when the
|
|
98
|
+
* cache was already fresh or the registry was unreachable (no write -- an
|
|
99
|
+
* expired cache stays expired rather than being re-stamped with old data).
|
|
100
|
+
*/
|
|
101
|
+
export declare function maybeRefreshVersionCheckCacheCore(deps: CacheRefreshDeps, currentVersion: string): Promise<boolean>;
|
|
102
|
+
/** Production wrapper for {@link maybeRefreshVersionCheckCacheCore}. Never throws. */
|
|
103
|
+
export declare function maybeRefreshVersionCheckCache(currentVersion: string): Promise<boolean>;
|
|
104
|
+
/** Default interval for the daemon-side cache refresh loop (1h, like auto-update). */
|
|
105
|
+
export declare const VERSION_CACHE_REFRESH_INTERVAL_MS: number;
|
|
106
|
+
/**
|
|
107
|
+
* Start the daemon-side version-cache refresh loop.
|
|
108
|
+
*
|
|
109
|
+
* Runs in EVERY install mode regardless of the auto-update flag -- npx with
|
|
110
|
+
* auto-update disabled is precisely the configuration the staleness signal
|
|
111
|
+
* exists for. Each tick refreshes the cache only when it is missing/expired
|
|
112
|
+
* (the TTL throttles registry traffic to ~one fetch per 6h). The unref'd
|
|
113
|
+
* timer never blocks process exit. Returns a cleanup function.
|
|
114
|
+
*/
|
|
115
|
+
export declare function startVersionCacheRefreshLoop(currentVersion: string, intervalMs?: number): () => void;
|
|
116
|
+
/**
|
|
117
|
+
* Format the one-line staleness warning, or null when no warning applies.
|
|
118
|
+
*
|
|
119
|
+
* When the daemon runs from an npx cache with auto-update disabled, the line
|
|
120
|
+
* carries the explicit escape hatch: self-update cannot replace an npx-cached
|
|
121
|
+
* binary in place, so a global install + restart is the fix.
|
|
122
|
+
*/
|
|
123
|
+
export declare function formatStalenessWarning(info: StalenessInfo | null): string | null;
|
|
124
|
+
//# sourceMappingURL=staleness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"staleness.d.ts","sourceRoot":"","sources":["../src/staleness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAIH,OAAO,EAKL,KAAK,UAAU,EAChB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAmC,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC9F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAMpD,MAAM,WAAW,aAAa;IAC5B,6DAA6D;IAC7D,cAAc,EAAE,MAAM,CAAC;IACvB,0DAA0D;IAC1D,aAAa,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,eAAe,EAAE,OAAO,CAAC;IACzB,wDAAwD;IACxD,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,wEAAwE;IACxE,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,qDAAqD;AACrD,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,oEAAoE;AACpE,eAAO,MAAM,0BAA0B,QAAqB,CAAC;AAE7D,gEAAgE;AAChE,eAAO,MAAM,wBAAwB,6BAA6B,CAAC;AAEnE,wEAAwE;AACxE,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,UAAU,GAAG,IAAI,CAAC;IAClC,eAAe,EAAE,MAAM,OAAO,CAAC;IAC/B,SAAS,EAAE,MAAM,iBAAiB,GAAG,IAAI,CAAC;IAC1C,UAAU,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC/C,eAAe,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;IAChF,GAAG,EAAE,MAAM,MAAM,CAAC;CACnB;AAMD,wBAAgB,4BAA4B,IAAI,MAAM,CAErD;AAiCD,2EAA2E;AAC3E,MAAM,WAAW,gBAAgB;IAC/B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,aAAa,EACnB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAmC/B;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAajG;AAMD,qFAAqF;AACrF,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,iBAAiB,GAAG,IAAI,CAAC;IAC1C,UAAU,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC/C,eAAe,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;IAChF,GAAG,EAAE,MAAM,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAsB,iCAAiC,CACrD,IAAI,EAAE,gBAAgB,EACtB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,OAAO,CAAC,CAelB;AAED,sFAAsF;AACtF,wBAAsB,6BAA6B,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAW5F;AAED,sFAAsF;AACtF,eAAO,MAAM,iCAAiC,QAAiB,CAAC;AAEhE;;;;;;;;GAQG;AACH,wBAAgB,4BAA4B,CAC1C,cAAc,EAAE,MAAM,EACtB,UAAU,GAAE,MAA0C,GACrD,MAAM,IAAI,CAaZ;AAMD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAShF"}
|