@made-by-moonlight/athene-core 0.9.1
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/LICENSE +22 -0
- package/README.md +241 -0
- package/dist/activity-events.d.ts +42 -0
- package/dist/activity-events.d.ts.map +1 -0
- package/dist/activity-events.js +192 -0
- package/dist/activity-events.js.map +1 -0
- package/dist/activity-log.d.ts +71 -0
- package/dist/activity-log.d.ts.map +1 -0
- package/dist/activity-log.js +203 -0
- package/dist/activity-log.js.map +1 -0
- package/dist/activity-signal.d.ts +20 -0
- package/dist/activity-signal.d.ts.map +1 -0
- package/dist/activity-signal.js +91 -0
- package/dist/activity-signal.js.map +1 -0
- package/dist/agent-report.d.ts +148 -0
- package/dist/agent-report.d.ts.map +1 -0
- package/dist/agent-report.js +516 -0
- package/dist/agent-report.js.map +1 -0
- package/dist/agent-selection.d.ts +31 -0
- package/dist/agent-selection.d.ts.map +1 -0
- package/dist/agent-selection.js +69 -0
- package/dist/agent-selection.js.map +1 -0
- package/dist/agent-workspace-hooks.d.ts +74 -0
- package/dist/agent-workspace-hooks.d.ts.map +1 -0
- package/dist/agent-workspace-hooks.js +988 -0
- package/dist/agent-workspace-hooks.js.map +1 -0
- package/dist/atomic-write.d.ts +6 -0
- package/dist/atomic-write.d.ts.map +1 -0
- package/dist/atomic-write.js +49 -0
- package/dist/atomic-write.js.map +1 -0
- package/dist/cleanup-stack.d.ts +37 -0
- package/dist/cleanup-stack.d.ts.map +1 -0
- package/dist/cleanup-stack.js +45 -0
- package/dist/cleanup-stack.js.map +1 -0
- package/dist/code-review-manager.d.ts +118 -0
- package/dist/code-review-manager.d.ts.map +1 -0
- package/dist/code-review-manager.js +719 -0
- package/dist/code-review-manager.js.map +1 -0
- package/dist/code-review-store.d.ts +114 -0
- package/dist/code-review-store.d.ts.map +1 -0
- package/dist/code-review-store.js +346 -0
- package/dist/code-review-store.js.map +1 -0
- package/dist/config-generator.d.ts +84 -0
- package/dist/config-generator.d.ts.map +1 -0
- package/dist/config-generator.js +295 -0
- package/dist/config-generator.js.map +1 -0
- package/dist/config.d.ts +55 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +852 -0
- package/dist/config.js.map +1 -0
- package/dist/daemon-children.d.ts +55 -0
- package/dist/daemon-children.d.ts.map +1 -0
- package/dist/daemon-children.js +435 -0
- package/dist/daemon-children.js.map +1 -0
- package/dist/dashboard-notifications.d.ts +42 -0
- package/dist/dashboard-notifications.d.ts.map +1 -0
- package/dist/dashboard-notifications.js +123 -0
- package/dist/dashboard-notifications.js.map +1 -0
- package/dist/events-db.d.ts +39 -0
- package/dist/events-db.d.ts.map +1 -0
- package/dist/events-db.js +185 -0
- package/dist/events-db.js.map +1 -0
- package/dist/feature-flags.d.ts +2 -0
- package/dist/feature-flags.d.ts.map +1 -0
- package/dist/feature-flags.js +9 -0
- package/dist/feature-flags.js.map +1 -0
- package/dist/feedback-tools.d.ts +97 -0
- package/dist/feedback-tools.d.ts.map +1 -0
- package/dist/feedback-tools.js +161 -0
- package/dist/feedback-tools.js.map +1 -0
- package/dist/file-lock.d.ts +5 -0
- package/dist/file-lock.d.ts.map +1 -0
- package/dist/file-lock.js +59 -0
- package/dist/file-lock.js.map +1 -0
- package/dist/format-automated-comments.d.ts +18 -0
- package/dist/format-automated-comments.d.ts.map +1 -0
- package/dist/gh-trace.d.ts +57 -0
- package/dist/gh-trace.d.ts.map +1 -0
- package/dist/gh-trace.js +320 -0
- package/dist/gh-trace.js.map +1 -0
- package/dist/git-activity.d.ts +10 -0
- package/dist/git-activity.d.ts.map +1 -0
- package/dist/git-activity.js +30 -0
- package/dist/git-activity.js.map +1 -0
- package/dist/global-config.d.ts +1085 -0
- package/dist/global-config.d.ts.map +1 -0
- package/dist/global-config.js +1067 -0
- package/dist/global-config.js.map +1 -0
- package/dist/index.d.ts +91 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +59 -0
- package/dist/index.js.map +1 -0
- package/dist/key-value.d.ts +7 -0
- package/dist/key-value.d.ts.map +1 -0
- package/dist/key-value.js +24 -0
- package/dist/key-value.js.map +1 -0
- package/dist/lifecycle-manager.d.ts +22 -0
- package/dist/lifecycle-manager.d.ts.map +1 -0
- package/dist/lifecycle-manager.js +2813 -0
- package/dist/lifecycle-manager.js.map +1 -0
- package/dist/lifecycle-state.d.ts +28 -0
- package/dist/lifecycle-state.d.ts.map +1 -0
- package/dist/lifecycle-state.js +446 -0
- package/dist/lifecycle-state.js.map +1 -0
- package/dist/lifecycle-status-decisions.d.ts +85 -0
- package/dist/lifecycle-status-decisions.d.ts.map +1 -0
- package/dist/lifecycle-status-decisions.js +262 -0
- package/dist/lifecycle-status-decisions.js.map +1 -0
- package/dist/lifecycle-transition.d.ts +81 -0
- package/dist/lifecycle-transition.d.ts.map +1 -0
- package/dist/lifecycle-transition.js +207 -0
- package/dist/lifecycle-transition.js.map +1 -0
- package/dist/metadata.d.ts +54 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/metadata.js +484 -0
- package/dist/metadata.js.map +1 -0
- package/dist/migration/storage-v2.d.ts +76 -0
- package/dist/migration/storage-v2.d.ts.map +1 -0
- package/dist/migration/storage-v2.js +1614 -0
- package/dist/migration/storage-v2.js.map +1 -0
- package/dist/notification-data.d.ts +135 -0
- package/dist/notification-data.d.ts.map +1 -0
- package/dist/notification-data.js +204 -0
- package/dist/notification-data.js.map +1 -0
- package/dist/notification-observability.d.ts +21 -0
- package/dist/notification-observability.d.ts.map +1 -0
- package/dist/notification-observability.js +154 -0
- package/dist/notification-observability.js.map +1 -0
- package/dist/notifier-resolution.d.ts +14 -0
- package/dist/notifier-resolution.d.ts.map +1 -0
- package/dist/notifier-resolution.js +23 -0
- package/dist/notifier-resolution.js.map +1 -0
- package/dist/observability.d.ts +100 -0
- package/dist/observability.d.ts.map +1 -0
- package/dist/observability.js +535 -0
- package/dist/observability.js.map +1 -0
- package/dist/opencode-agents-md.d.ts +3 -0
- package/dist/opencode-agents-md.d.ts.map +1 -0
- package/dist/opencode-agents-md.js +40 -0
- package/dist/opencode-agents-md.js.map +1 -0
- package/dist/opencode-config.d.ts +2 -0
- package/dist/opencode-config.d.ts.map +1 -0
- package/dist/opencode-config.js +17 -0
- package/dist/opencode-config.js.map +1 -0
- package/dist/opencode-session-id.d.ts +2 -0
- package/dist/opencode-session-id.d.ts.map +1 -0
- package/dist/opencode-session-id.js +12 -0
- package/dist/opencode-session-id.js.map +1 -0
- package/dist/opencode-shared.d.ts +80 -0
- package/dist/opencode-shared.d.ts.map +1 -0
- package/dist/opencode-shared.js +202 -0
- package/dist/opencode-shared.js.map +1 -0
- package/dist/orchestrator-prompt.d.ts +19 -0
- package/dist/orchestrator-prompt.d.ts.map +1 -0
- package/dist/orchestrator-prompt.js +130 -0
- package/dist/orchestrator-prompt.js.map +1 -0
- package/dist/orchestrator-session-strategy.d.ts +5 -0
- package/dist/orchestrator-session-strategy.d.ts.map +1 -0
- package/dist/orchestrator-session-strategy.js +13 -0
- package/dist/orchestrator-session-strategy.js.map +1 -0
- package/dist/paths.d.ts +145 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +288 -0
- package/dist/paths.js.map +1 -0
- package/dist/platform.d.ts +32 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +211 -0
- package/dist/platform.js.map +1 -0
- package/dist/plugin-registry.d.ts +15 -0
- package/dist/plugin-registry.d.ts.map +1 -0
- package/dist/plugin-registry.js +499 -0
- package/dist/plugin-registry.js.map +1 -0
- package/dist/portfolio-projects.d.ts +7 -0
- package/dist/portfolio-projects.d.ts.map +1 -0
- package/dist/portfolio-projects.js +65 -0
- package/dist/portfolio-projects.js.map +1 -0
- package/dist/portfolio-registry.d.ts +42 -0
- package/dist/portfolio-registry.d.ts.map +1 -0
- package/dist/portfolio-registry.js +311 -0
- package/dist/portfolio-registry.js.map +1 -0
- package/dist/portfolio-routing.d.ts +5 -0
- package/dist/portfolio-routing.d.ts.map +1 -0
- package/dist/portfolio-routing.js +24 -0
- package/dist/portfolio-routing.js.map +1 -0
- package/dist/portfolio-session-service.d.ts +15 -0
- package/dist/portfolio-session-service.d.ts.map +1 -0
- package/dist/portfolio-session-service.js +206 -0
- package/dist/portfolio-session-service.js.map +1 -0
- package/dist/process-cache.d.ts +32 -0
- package/dist/process-cache.d.ts.map +1 -0
- package/dist/process-cache.js +44 -0
- package/dist/process-cache.js.map +1 -0
- package/dist/project-resolver.d.ts +5 -0
- package/dist/project-resolver.d.ts.map +1 -0
- package/dist/project-resolver.js +20 -0
- package/dist/project-resolver.js.map +1 -0
- package/dist/prompt-builder.d.ts +42 -0
- package/dist/prompt-builder.d.ts.map +1 -0
- package/dist/prompt-builder.js +182 -0
- package/dist/prompt-builder.js.map +1 -0
- package/dist/prompts/orchestrator.md.js +4 -0
- package/dist/prompts/orchestrator.md.js.map +1 -0
- package/dist/query-activity-events.d.ts +42 -0
- package/dist/query-activity-events.d.ts.map +1 -0
- package/dist/query-activity-events.js +170 -0
- package/dist/query-activity-events.js.map +1 -0
- package/dist/recovery/actions.d.ts +7 -0
- package/dist/recovery/actions.d.ts.map +1 -0
- package/dist/recovery/index.d.ts +8 -0
- package/dist/recovery/index.d.ts.map +1 -0
- package/dist/recovery/logger.d.ts +12 -0
- package/dist/recovery/logger.d.ts.map +1 -0
- package/dist/recovery/manager.d.ts +24 -0
- package/dist/recovery/manager.d.ts.map +1 -0
- package/dist/recovery/scanner.d.ts +11 -0
- package/dist/recovery/scanner.d.ts.map +1 -0
- package/dist/recovery/types.d.ts +170 -0
- package/dist/recovery/types.d.ts.map +1 -0
- package/dist/recovery/validator.d.ts +8 -0
- package/dist/recovery/validator.d.ts.map +1 -0
- package/dist/report-watcher.d.ts +93 -0
- package/dist/report-watcher.d.ts.map +1 -0
- package/dist/report-watcher.js +182 -0
- package/dist/report-watcher.js.map +1 -0
- package/dist/scm-webhook-utils.d.ts +6 -0
- package/dist/scm-webhook-utils.d.ts.map +1 -0
- package/dist/scm-webhook-utils.js +36 -0
- package/dist/scm-webhook-utils.js.map +1 -0
- package/dist/session-manager.d.ts +22 -0
- package/dist/session-manager.d.ts.map +1 -0
- package/dist/session-manager.js +3077 -0
- package/dist/session-manager.js.map +1 -0
- package/dist/spawn-target.d.ts +23 -0
- package/dist/spawn-target.d.ts.map +1 -0
- package/dist/spawn-target.js +39 -0
- package/dist/spawn-target.js.map +1 -0
- package/dist/storage-key.d.ts +9 -0
- package/dist/storage-key.d.ts.map +1 -0
- package/dist/storage-key.js +59 -0
- package/dist/storage-key.js.map +1 -0
- package/dist/tmux.d.ts +39 -0
- package/dist/tmux.d.ts.map +1 -0
- package/dist/tmux.js +141 -0
- package/dist/tmux.js.map +1 -0
- package/dist/types.d.ts +1496 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +215 -0
- package/dist/types.js.map +1 -0
- package/dist/update-cache.d.ts +59 -0
- package/dist/update-cache.d.ts.map +1 -0
- package/dist/update-cache.js +77 -0
- package/dist/update-cache.js.map +1 -0
- package/dist/utils/metadata-flatten.d.ts +3 -0
- package/dist/utils/metadata-flatten.d.ts.map +1 -0
- package/dist/utils/metadata-flatten.js +18 -0
- package/dist/utils/metadata-flatten.js.map +1 -0
- package/dist/utils/pr.d.ts +7 -0
- package/dist/utils/pr.d.ts.map +1 -0
- package/dist/utils/pr.js +97 -0
- package/dist/utils/pr.js.map +1 -0
- package/dist/utils/session-from-metadata.d.ts +16 -0
- package/dist/utils/session-from-metadata.d.ts.map +1 -0
- package/dist/utils/session-from-metadata.js +87 -0
- package/dist/utils/session-from-metadata.js.map +1 -0
- package/dist/utils/session-id.d.ts +4 -0
- package/dist/utils/session-id.d.ts.map +1 -0
- package/dist/utils/session-id.js +9 -0
- package/dist/utils/session-id.js.map +1 -0
- package/dist/utils/validation.d.ts +9 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +45 -0
- package/dist/utils/validation.js.map +1 -0
- package/dist/utils.d.ts +65 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +189 -0
- package/dist/utils.js.map +1 -0
- package/dist/version-compare.d.ts +27 -0
- package/dist/version-compare.d.ts.map +1 -0
- package/dist/version-compare.js +121 -0
- package/dist/version-compare.js.map +1 -0
- package/dist/windows-pty-registry.d.ts +27 -0
- package/dist/windows-pty-registry.d.ts.map +1 -0
- package/dist/windows-pty-registry.js +109 -0
- package/dist/windows-pty-registry.js.map +1 -0
- package/package.json +110 -0
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { SESSION_STATUS, CI_STATUS, PR_STATE } from './types.js';
|
|
3
|
+
import { supportsRecentLiveness } from './activity-signal.js';
|
|
4
|
+
|
|
5
|
+
const DETECTING_MAX_ATTEMPTS = 3;
|
|
6
|
+
/** Hard time cap for detecting state — escalate after this regardless of attempts. */
|
|
7
|
+
const DETECTING_MAX_DURATION_MS = 5 * 60 * 1000; // 5 minutes
|
|
8
|
+
/**
|
|
9
|
+
* Create a short hash of evidence string for detecting unchanged evidence.
|
|
10
|
+
* Used to prevent counter reset when the same weak evidence re-presents.
|
|
11
|
+
*/
|
|
12
|
+
function normalizeEvidenceForHash(evidence) {
|
|
13
|
+
return evidence
|
|
14
|
+
.replace(/\sactivity=[^\s]+/g, "")
|
|
15
|
+
.replace(/\sat=[^\s]+/g, "")
|
|
16
|
+
.trim();
|
|
17
|
+
}
|
|
18
|
+
function hashEvidence(evidence) {
|
|
19
|
+
return createHash("sha256")
|
|
20
|
+
.update(normalizeEvidenceForHash(evidence))
|
|
21
|
+
.digest("hex")
|
|
22
|
+
.slice(0, 12);
|
|
23
|
+
}
|
|
24
|
+
function createLifecycleDecision(decision) {
|
|
25
|
+
return decision;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Check if detecting has exceeded its time budget.
|
|
29
|
+
*/
|
|
30
|
+
function isDetectingTimedOut(detectingStartedAt, now = new Date()) {
|
|
31
|
+
if (!detectingStartedAt)
|
|
32
|
+
return false;
|
|
33
|
+
const startedAt = Date.parse(detectingStartedAt);
|
|
34
|
+
if (Number.isNaN(startedAt))
|
|
35
|
+
return false;
|
|
36
|
+
return now.getTime() - startedAt > DETECTING_MAX_DURATION_MS;
|
|
37
|
+
}
|
|
38
|
+
function createDetectingDecision(input) {
|
|
39
|
+
const now = "now" in input && input.now ? input.now : new Date();
|
|
40
|
+
const nowIso = now.toISOString();
|
|
41
|
+
const evidenceHash = hashEvidence(input.evidence);
|
|
42
|
+
// Determine the starting time for detecting
|
|
43
|
+
// If we have a previous startedAt AND evidence is unchanged, preserve it
|
|
44
|
+
// Otherwise, start fresh
|
|
45
|
+
const previousEvidenceHash = "previousEvidenceHash" in input ? input.previousEvidenceHash : undefined;
|
|
46
|
+
const previousStartedAt = "detectingStartedAt" in input ? input.detectingStartedAt : undefined;
|
|
47
|
+
// Evidence is considered unchanged if:
|
|
48
|
+
// 1. We have a previous hash AND it matches, OR
|
|
49
|
+
// 2. We have no previous hash (first time entering detecting)
|
|
50
|
+
const evidenceChanged = previousEvidenceHash !== undefined && previousEvidenceHash !== evidenceHash;
|
|
51
|
+
const detectingStartedAt = evidenceChanged ? nowIso : (previousStartedAt ?? nowIso);
|
|
52
|
+
// Calculate attempts: reset if evidence changed, otherwise increment
|
|
53
|
+
const attempts = evidenceChanged ? 1 : input.currentAttempts + 1;
|
|
54
|
+
// Check escalation conditions: attempt limit OR time limit
|
|
55
|
+
const attemptLimitExceeded = attempts > DETECTING_MAX_ATTEMPTS;
|
|
56
|
+
const timeLimitExceeded = isDetectingTimedOut(detectingStartedAt, now);
|
|
57
|
+
if (attemptLimitExceeded || timeLimitExceeded) {
|
|
58
|
+
return createLifecycleDecision({
|
|
59
|
+
status: SESSION_STATUS.STUCK,
|
|
60
|
+
evidence: input.evidence,
|
|
61
|
+
detecting: { attempts, startedAt: detectingStartedAt, evidenceHash },
|
|
62
|
+
sessionState: "stuck",
|
|
63
|
+
sessionReason: input.idleWasBlocked ? "error_in_process" : "probe_failure",
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
return createLifecycleDecision({
|
|
67
|
+
status: SESSION_STATUS.DETECTING,
|
|
68
|
+
evidence: input.evidence,
|
|
69
|
+
detecting: { attempts, startedAt: detectingStartedAt, evidenceHash },
|
|
70
|
+
sessionState: "detecting",
|
|
71
|
+
sessionReason: input.reason ?? "probe_failure",
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
function resolveTerminalPRStateDecision(prState) {
|
|
75
|
+
if (prState === PR_STATE.MERGED) {
|
|
76
|
+
return createLifecycleDecision({
|
|
77
|
+
status: SESSION_STATUS.MERGED,
|
|
78
|
+
evidence: "pr_merged",
|
|
79
|
+
detecting: { attempts: 0 },
|
|
80
|
+
prState: "merged",
|
|
81
|
+
prReason: "merged",
|
|
82
|
+
sessionState: "idle",
|
|
83
|
+
sessionReason: "merged_waiting_decision",
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
if (prState === PR_STATE.CLOSED) {
|
|
87
|
+
return createLifecycleDecision({
|
|
88
|
+
status: SESSION_STATUS.IDLE,
|
|
89
|
+
evidence: "pr_closed",
|
|
90
|
+
detecting: { attempts: 0 },
|
|
91
|
+
prState: "closed",
|
|
92
|
+
prReason: "closed_unmerged",
|
|
93
|
+
sessionState: "idle",
|
|
94
|
+
sessionReason: "pr_closed_waiting_decision",
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
function resolveOpenPRDecision(input) {
|
|
100
|
+
if (input.ciFailing) {
|
|
101
|
+
return createLifecycleDecision({
|
|
102
|
+
status: SESSION_STATUS.CI_FAILED,
|
|
103
|
+
evidence: "ci_failing",
|
|
104
|
+
detecting: { attempts: 0 },
|
|
105
|
+
prState: "open",
|
|
106
|
+
prReason: "ci_failing",
|
|
107
|
+
sessionState: "working",
|
|
108
|
+
sessionReason: "fixing_ci",
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
if (input.reviewDecision === "changes_requested") {
|
|
112
|
+
return createLifecycleDecision({
|
|
113
|
+
status: SESSION_STATUS.CHANGES_REQUESTED,
|
|
114
|
+
evidence: "review_changes_requested",
|
|
115
|
+
detecting: { attempts: 0 },
|
|
116
|
+
prState: "open",
|
|
117
|
+
prReason: "changes_requested",
|
|
118
|
+
sessionState: "working",
|
|
119
|
+
sessionReason: "resolving_review_comments",
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
if (input.reviewDecision === "approved" || input.reviewDecision === "none") {
|
|
123
|
+
if (input.mergeable) {
|
|
124
|
+
return createLifecycleDecision({
|
|
125
|
+
status: SESSION_STATUS.MERGEABLE,
|
|
126
|
+
evidence: "merge_ready",
|
|
127
|
+
detecting: { attempts: 0 },
|
|
128
|
+
prState: "open",
|
|
129
|
+
prReason: "merge_ready",
|
|
130
|
+
sessionState: "idle",
|
|
131
|
+
sessionReason: "awaiting_external_review",
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
if (input.reviewDecision === "approved") {
|
|
135
|
+
return createLifecycleDecision({
|
|
136
|
+
status: SESSION_STATUS.APPROVED,
|
|
137
|
+
evidence: "review_approved",
|
|
138
|
+
detecting: { attempts: 0 },
|
|
139
|
+
prState: "open",
|
|
140
|
+
prReason: "approved",
|
|
141
|
+
sessionState: "idle",
|
|
142
|
+
sessionReason: "awaiting_external_review",
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (input.reviewDecision === "pending") {
|
|
147
|
+
return createLifecycleDecision({
|
|
148
|
+
status: SESSION_STATUS.REVIEW_PENDING,
|
|
149
|
+
evidence: "review_pending",
|
|
150
|
+
detecting: { attempts: 0 },
|
|
151
|
+
prState: "open",
|
|
152
|
+
prReason: "review_pending",
|
|
153
|
+
sessionState: "idle",
|
|
154
|
+
sessionReason: "awaiting_external_review",
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
if (input.shouldEscalateIdleToStuck) {
|
|
158
|
+
return createLifecycleDecision({
|
|
159
|
+
status: SESSION_STATUS.STUCK,
|
|
160
|
+
evidence: `idle_beyond_threshold ${input.activityEvidence}`,
|
|
161
|
+
detecting: { attempts: 0 },
|
|
162
|
+
prState: "open",
|
|
163
|
+
prReason: "in_progress",
|
|
164
|
+
sessionState: "stuck",
|
|
165
|
+
sessionReason: input.idleWasBlocked ? "error_in_process" : "probe_failure",
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
return createLifecycleDecision({
|
|
169
|
+
status: SESSION_STATUS.PR_OPEN,
|
|
170
|
+
evidence: "pr_open",
|
|
171
|
+
detecting: { attempts: 0 },
|
|
172
|
+
prState: "open",
|
|
173
|
+
prReason: "in_progress",
|
|
174
|
+
sessionState: "idle",
|
|
175
|
+
sessionReason: "pr_created",
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
function parseAttemptCount(raw) {
|
|
179
|
+
if (!raw)
|
|
180
|
+
return 0;
|
|
181
|
+
const parsed = Number.parseInt(raw, 10);
|
|
182
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : 0;
|
|
183
|
+
}
|
|
184
|
+
function resolveProbeDecision(input) {
|
|
185
|
+
const recentActivitySupportsLiveness = supportsRecentLiveness(input.activitySignal);
|
|
186
|
+
if (input.runtimeProbe.failed || input.processProbe.failed) {
|
|
187
|
+
return createDetectingDecision({
|
|
188
|
+
currentAttempts: input.currentAttempts,
|
|
189
|
+
idleWasBlocked: input.idleWasBlocked,
|
|
190
|
+
evidence: `probe_failed runtime=${input.runtimeProbe.state} process=${input.processProbe.state} ${input.activityEvidence}`,
|
|
191
|
+
detectingStartedAt: input.detectingStartedAt,
|
|
192
|
+
previousEvidenceHash: input.previousEvidenceHash,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
if ((input.runtimeProbe.state === "dead" && input.processProbe.state === "alive") ||
|
|
196
|
+
(input.runtimeProbe.state === "alive" && input.processProbe.state === "dead") ||
|
|
197
|
+
(input.runtimeProbe.state === "dead" && recentActivitySupportsLiveness)) {
|
|
198
|
+
return createDetectingDecision({
|
|
199
|
+
currentAttempts: input.currentAttempts,
|
|
200
|
+
idleWasBlocked: input.idleWasBlocked,
|
|
201
|
+
evidence: `signal_disagreement runtime=${input.runtimeProbe.state} process=${input.processProbe.state} ${input.activityEvidence}`,
|
|
202
|
+
reason: input.runtimeProbe.state === "dead" ? "runtime_lost" : "agent_process_exited",
|
|
203
|
+
detectingStartedAt: input.detectingStartedAt,
|
|
204
|
+
previousEvidenceHash: input.previousEvidenceHash,
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
if (input.runtimeProbe.state === "dead" &&
|
|
208
|
+
input.processProbe.state === "unknown" &&
|
|
209
|
+
input.canProbeRuntimeIdentity) {
|
|
210
|
+
return createDetectingDecision({
|
|
211
|
+
currentAttempts: input.currentAttempts,
|
|
212
|
+
idleWasBlocked: input.idleWasBlocked,
|
|
213
|
+
evidence: `runtime_dead process_unknown ${input.activityEvidence}`,
|
|
214
|
+
reason: "runtime_lost",
|
|
215
|
+
detectingStartedAt: input.detectingStartedAt,
|
|
216
|
+
previousEvidenceHash: input.previousEvidenceHash,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
if (input.runtimeProbe.state === "dead" &&
|
|
220
|
+
input.processProbe.state === "dead" &&
|
|
221
|
+
!recentActivitySupportsLiveness) {
|
|
222
|
+
return createLifecycleDecision({
|
|
223
|
+
status: SESSION_STATUS.KILLED,
|
|
224
|
+
evidence: `runtime_dead process_dead ${input.activityEvidence}`,
|
|
225
|
+
detecting: { attempts: 0 },
|
|
226
|
+
sessionState: "terminated",
|
|
227
|
+
sessionReason: "runtime_lost",
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
return null;
|
|
231
|
+
}
|
|
232
|
+
function resolvePREnrichmentDecision(cachedData, options) {
|
|
233
|
+
const terminalDecision = resolveTerminalPRStateDecision(cachedData.state);
|
|
234
|
+
if (terminalDecision) {
|
|
235
|
+
return terminalDecision;
|
|
236
|
+
}
|
|
237
|
+
return resolveOpenPRDecision({
|
|
238
|
+
reviewDecision: cachedData.reviewDecision,
|
|
239
|
+
ciFailing: cachedData.ciStatus === CI_STATUS.FAILING,
|
|
240
|
+
mergeable: cachedData.mergeable,
|
|
241
|
+
shouldEscalateIdleToStuck: options.shouldEscalateIdleToStuck,
|
|
242
|
+
idleWasBlocked: options.idleWasBlocked,
|
|
243
|
+
activityEvidence: options.activityEvidence,
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
function resolvePRLiveDecision(input) {
|
|
247
|
+
const terminalDecision = resolveTerminalPRStateDecision(input.prState);
|
|
248
|
+
if (terminalDecision) {
|
|
249
|
+
return terminalDecision;
|
|
250
|
+
}
|
|
251
|
+
return resolveOpenPRDecision({
|
|
252
|
+
reviewDecision: input.reviewDecision,
|
|
253
|
+
ciFailing: input.ciStatus === CI_STATUS.FAILING,
|
|
254
|
+
mergeable: input.mergeable,
|
|
255
|
+
shouldEscalateIdleToStuck: input.shouldEscalateIdleToStuck,
|
|
256
|
+
idleWasBlocked: input.idleWasBlocked,
|
|
257
|
+
activityEvidence: input.activityEvidence,
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
export { DETECTING_MAX_ATTEMPTS, DETECTING_MAX_DURATION_MS, createDetectingDecision, hashEvidence, isDetectingTimedOut, parseAttemptCount, resolvePREnrichmentDecision, resolvePRLiveDecision, resolveProbeDecision };
|
|
262
|
+
//# sourceMappingURL=lifecycle-status-decisions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle-status-decisions.js","sources":["../src/lifecycle-status-decisions.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lifecycle Transition Service
|
|
3
|
+
*
|
|
4
|
+
* Centralizes all lifecycle state mutations behind a single boundary.
|
|
5
|
+
* This module ensures:
|
|
6
|
+
* - Consistent timestamp handling
|
|
7
|
+
* - Before/after state capture for observability
|
|
8
|
+
* - Atomic metadata persistence
|
|
9
|
+
* - Validation before mutation
|
|
10
|
+
*
|
|
11
|
+
* All lifecycle changes (from polling, agent reports, spawn, kill) should
|
|
12
|
+
* flow through this module.
|
|
13
|
+
*/
|
|
14
|
+
import type { CanonicalSessionLifecycle, CanonicalSessionReason, CanonicalSessionState, SessionId, SessionStatus } from "./types.js";
|
|
15
|
+
import type { LifecycleDecision } from "./lifecycle-status-decisions.js";
|
|
16
|
+
/**
|
|
17
|
+
* Source of the lifecycle transition — used for audit and observability.
|
|
18
|
+
*/
|
|
19
|
+
export type TransitionSource = "poll" | "agent_report" | "spawn" | "restore" | "kill" | "cleanup" | "claim_pr";
|
|
20
|
+
/**
|
|
21
|
+
* Result of a lifecycle transition attempt.
|
|
22
|
+
*/
|
|
23
|
+
export interface TransitionResult {
|
|
24
|
+
success: boolean;
|
|
25
|
+
/** The previous lifecycle state (before mutation). */
|
|
26
|
+
previousLifecycle: CanonicalSessionLifecycle;
|
|
27
|
+
/** The new lifecycle state (after mutation). */
|
|
28
|
+
nextLifecycle: CanonicalSessionLifecycle;
|
|
29
|
+
/** The previous legacy status. */
|
|
30
|
+
previousStatus: SessionStatus;
|
|
31
|
+
/** The new legacy status. */
|
|
32
|
+
nextStatus: SessionStatus;
|
|
33
|
+
/** ISO timestamp when the transition occurred. */
|
|
34
|
+
transitionedAt: string;
|
|
35
|
+
/** Whether the status actually changed. */
|
|
36
|
+
statusChanged: boolean;
|
|
37
|
+
/** Reason if transition was rejected. */
|
|
38
|
+
rejectionReason?: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Input for applying a lifecycle decision.
|
|
42
|
+
*/
|
|
43
|
+
export interface ApplyDecisionInput {
|
|
44
|
+
dataDir: string;
|
|
45
|
+
sessionId: SessionId;
|
|
46
|
+
decision: LifecycleDecision;
|
|
47
|
+
/** Additional metadata to persist alongside the lifecycle. */
|
|
48
|
+
additionalMetadata?: Record<string, string>;
|
|
49
|
+
/** Source of the transition for observability. */
|
|
50
|
+
source: TransitionSource;
|
|
51
|
+
/** Override the current time (for testing). */
|
|
52
|
+
now?: Date;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Apply a lifecycle decision to the in-memory lifecycle object.
|
|
56
|
+
* This mutates the lifecycle in place.
|
|
57
|
+
*/
|
|
58
|
+
export declare function applyDecisionToLifecycle(lifecycle: CanonicalSessionLifecycle, decision: LifecycleDecision, nowIso: string): void;
|
|
59
|
+
/**
|
|
60
|
+
* Build the full metadata patch for a lifecycle poll transition.
|
|
61
|
+
* Unlike buildLifecycleMetadataPatch(), this includes detecting metadata
|
|
62
|
+
* (attempts, startedAt, evidenceHash) and lifecycle evidence from the decision.
|
|
63
|
+
* Used exclusively by the lifecycle manager polling loop.
|
|
64
|
+
*/
|
|
65
|
+
export declare function buildTransitionMetadataPatch(lifecycle: CanonicalSessionLifecycle, decision: LifecycleDecision): Record<string, string>;
|
|
66
|
+
/**
|
|
67
|
+
* Apply a lifecycle decision and persist to metadata.
|
|
68
|
+
*
|
|
69
|
+
* This is the primary entry point for lifecycle mutations. It:
|
|
70
|
+
* 1. Reads the current lifecycle state
|
|
71
|
+
* 2. Validates the transition (if applicable)
|
|
72
|
+
* 3. Applies the decision to the lifecycle
|
|
73
|
+
* 4. Persists the updated lifecycle and metadata
|
|
74
|
+
* 5. Returns before/after state for observability
|
|
75
|
+
*/
|
|
76
|
+
export declare function applyLifecycleDecision(input: ApplyDecisionInput): TransitionResult;
|
|
77
|
+
/**
|
|
78
|
+
* Helper to create a minimal lifecycle decision for direct state updates.
|
|
79
|
+
*/
|
|
80
|
+
export declare function createStateTransitionDecision(status: SessionStatus, state: CanonicalSessionState, reason: CanonicalSessionReason, evidence: string): LifecycleDecision;
|
|
81
|
+
//# sourceMappingURL=lifecycle-transition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle-transition.d.ts","sourceRoot":"","sources":["../src/lifecycle-transition.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,yBAAyB,EACzB,sBAAsB,EACtB,qBAAqB,EACrB,SAAS,EACT,aAAa,EACd,MAAM,YAAY,CAAC;AAOpB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEzE;;GAEG;AACH,MAAM,MAAM,gBAAgB,GACxB,MAAM,GACN,cAAc,GACd,OAAO,GACP,SAAS,GACT,MAAM,GACN,SAAS,GACT,UAAU,CAAC;AAGf;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,sDAAsD;IACtD,iBAAiB,EAAE,yBAAyB,CAAC;IAC7C,gDAAgD;IAChD,aAAa,EAAE,yBAAyB,CAAC;IACzC,kCAAkC;IAClC,cAAc,EAAE,aAAa,CAAC;IAC9B,6BAA6B;IAC7B,UAAU,EAAE,aAAa,CAAC;IAC1B,kDAAkD;IAClD,cAAc,EAAE,MAAM,CAAC;IACvB,2CAA2C;IAC3C,aAAa,EAAE,OAAO,CAAC;IACvB,yCAAyC;IACzC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,8DAA8D;IAC9D,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,kDAAkD;IAClD,MAAM,EAAE,gBAAgB,CAAC;IACzB,+CAA+C;IAC/C,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,yBAAyB,EACpC,QAAQ,EAAE,iBAAiB,EAC3B,MAAM,EAAE,MAAM,GACb,IAAI,CA6BN;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,yBAAyB,EACpC,QAAQ,EAAE,iBAAiB,GAC1B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAsCxB;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,kBAAkB,GACxB,gBAAgB,CA4ElB;AAkCD;;GAEG;AACH,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,qBAAqB,EAC5B,MAAM,EAAE,sBAAsB,EAC9B,QAAQ,EAAE,MAAM,GACf,iBAAiB,CAQnB"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { clearTerminalMarkersForNonTerminalState, cloneLifecycle, deriveLegacyStatus } from './lifecycle-state.js';
|
|
2
|
+
import { readMetadataRaw, readCanonicalLifecycle, updateMetadata } from './metadata.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Lifecycle Transition Service
|
|
6
|
+
*
|
|
7
|
+
* Centralizes all lifecycle state mutations behind a single boundary.
|
|
8
|
+
* This module ensures:
|
|
9
|
+
* - Consistent timestamp handling
|
|
10
|
+
* - Before/after state capture for observability
|
|
11
|
+
* - Atomic metadata persistence
|
|
12
|
+
* - Validation before mutation
|
|
13
|
+
*
|
|
14
|
+
* All lifecycle changes (from polling, agent reports, spawn, kill) should
|
|
15
|
+
* flow through this module.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Apply a lifecycle decision to the in-memory lifecycle object.
|
|
19
|
+
* This mutates the lifecycle in place.
|
|
20
|
+
*/
|
|
21
|
+
function applyDecisionToLifecycle(lifecycle, decision, nowIso) {
|
|
22
|
+
// Apply PR state if present
|
|
23
|
+
if (decision.prState) {
|
|
24
|
+
lifecycle.pr.state = decision.prState;
|
|
25
|
+
lifecycle.pr.lastObservedAt = nowIso;
|
|
26
|
+
}
|
|
27
|
+
if (decision.prReason) {
|
|
28
|
+
lifecycle.pr.reason = decision.prReason;
|
|
29
|
+
}
|
|
30
|
+
// Apply session state if present
|
|
31
|
+
if (decision.sessionState && decision.sessionReason) {
|
|
32
|
+
lifecycle.session.state = decision.sessionState;
|
|
33
|
+
lifecycle.session.reason = decision.sessionReason;
|
|
34
|
+
lifecycle.session.lastTransitionAt = nowIso;
|
|
35
|
+
// Handle special timestamp fields (only set if not already set)
|
|
36
|
+
if (decision.sessionState === "working" && lifecycle.session.startedAt === null) {
|
|
37
|
+
lifecycle.session.startedAt = nowIso;
|
|
38
|
+
}
|
|
39
|
+
if (decision.sessionState === "done" && lifecycle.session.completedAt === null) {
|
|
40
|
+
lifecycle.session.completedAt = nowIso;
|
|
41
|
+
}
|
|
42
|
+
if (decision.sessionState === "terminated" && lifecycle.session.terminatedAt === null) {
|
|
43
|
+
lifecycle.session.terminatedAt = nowIso;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
clearTerminalMarkersForNonTerminalState(lifecycle);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Build the full metadata patch for a lifecycle poll transition.
|
|
50
|
+
* Unlike buildLifecycleMetadataPatch(), this includes detecting metadata
|
|
51
|
+
* (attempts, startedAt, evidenceHash) and lifecycle evidence from the decision.
|
|
52
|
+
* Used exclusively by the lifecycle manager polling loop.
|
|
53
|
+
*/
|
|
54
|
+
function buildTransitionMetadataPatch(lifecycle, decision) {
|
|
55
|
+
const patch = {
|
|
56
|
+
lifecycle: JSON.stringify(lifecycle),
|
|
57
|
+
// status is NOT persisted — computed on read via deriveLegacyStatus()
|
|
58
|
+
};
|
|
59
|
+
// Include lifecycle evidence
|
|
60
|
+
if (decision.evidence) {
|
|
61
|
+
patch["lifecycleEvidence"] = decision.evidence;
|
|
62
|
+
}
|
|
63
|
+
// Include detecting metadata
|
|
64
|
+
if (decision.detecting.attempts > 0) {
|
|
65
|
+
patch["detectingAttempts"] = String(decision.detecting.attempts);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
patch["detectingAttempts"] = "";
|
|
69
|
+
}
|
|
70
|
+
if (decision.detecting.startedAt) {
|
|
71
|
+
patch["detectingStartedAt"] = decision.detecting.startedAt;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
patch["detectingStartedAt"] = "";
|
|
75
|
+
}
|
|
76
|
+
if (decision.detecting.evidenceHash) {
|
|
77
|
+
patch["detectingEvidenceHash"] = decision.detecting.evidenceHash;
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
patch["detectingEvidenceHash"] = "";
|
|
81
|
+
}
|
|
82
|
+
patch["pr"] = lifecycle.pr.url ?? "";
|
|
83
|
+
patch["runtimeHandle"] = lifecycle.runtime.handle ? JSON.stringify(lifecycle.runtime.handle) : "";
|
|
84
|
+
patch["tmuxName"] = lifecycle.runtime.tmuxName ?? "";
|
|
85
|
+
patch["role"] = lifecycle.session.kind === "orchestrator" ? "orchestrator" : "";
|
|
86
|
+
return patch;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Apply a lifecycle decision and persist to metadata.
|
|
90
|
+
*
|
|
91
|
+
* This is the primary entry point for lifecycle mutations. It:
|
|
92
|
+
* 1. Reads the current lifecycle state
|
|
93
|
+
* 2. Validates the transition (if applicable)
|
|
94
|
+
* 3. Applies the decision to the lifecycle
|
|
95
|
+
* 4. Persists the updated lifecycle and metadata
|
|
96
|
+
* 5. Returns before/after state for observability
|
|
97
|
+
*/
|
|
98
|
+
function applyLifecycleDecision(input) {
|
|
99
|
+
const now = input.now ?? new Date();
|
|
100
|
+
const nowIso = now.toISOString();
|
|
101
|
+
// Read current state
|
|
102
|
+
const rawMeta = readMetadataRaw(input.dataDir, input.sessionId);
|
|
103
|
+
if (!rawMeta) {
|
|
104
|
+
const emptyLifecycle = createEmptyLifecycle();
|
|
105
|
+
return {
|
|
106
|
+
success: false,
|
|
107
|
+
previousLifecycle: emptyLifecycle,
|
|
108
|
+
nextLifecycle: emptyLifecycle,
|
|
109
|
+
previousStatus: "working",
|
|
110
|
+
nextStatus: "working",
|
|
111
|
+
transitionedAt: nowIso,
|
|
112
|
+
statusChanged: false,
|
|
113
|
+
rejectionReason: `Session not found: ${input.sessionId}`,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
const currentLifecycle = readCanonicalLifecycle(input.dataDir, input.sessionId);
|
|
117
|
+
if (!currentLifecycle) {
|
|
118
|
+
const emptyLifecycle = createEmptyLifecycle();
|
|
119
|
+
return {
|
|
120
|
+
success: false,
|
|
121
|
+
previousLifecycle: emptyLifecycle,
|
|
122
|
+
nextLifecycle: emptyLifecycle,
|
|
123
|
+
previousStatus: "working",
|
|
124
|
+
nextStatus: "working",
|
|
125
|
+
transitionedAt: nowIso,
|
|
126
|
+
statusChanged: false,
|
|
127
|
+
rejectionReason: `Failed to read lifecycle for session: ${input.sessionId}`,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
const previousLifecycle = cloneLifecycle(currentLifecycle);
|
|
131
|
+
const previousStatus = deriveLegacyStatus(previousLifecycle);
|
|
132
|
+
// Apply the decision to the lifecycle
|
|
133
|
+
const nextLifecycle = cloneLifecycle(currentLifecycle);
|
|
134
|
+
applyDecisionToLifecycle(nextLifecycle, input.decision, nowIso);
|
|
135
|
+
const nextStatus = deriveLegacyStatus(nextLifecycle);
|
|
136
|
+
const statusChanged = nextStatus !== previousStatus;
|
|
137
|
+
// Build metadata patch, starting with additional metadata (so lifecycle keys take precedence)
|
|
138
|
+
const metadataPatch = {};
|
|
139
|
+
// Apply additional metadata first
|
|
140
|
+
if (input.additionalMetadata) {
|
|
141
|
+
for (const [key, value] of Object.entries(input.additionalMetadata)) {
|
|
142
|
+
metadataPatch[key] = value;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// Apply lifecycle patch second (overwrites any conflicting keys from additionalMetadata)
|
|
146
|
+
const lifecyclePatch = buildTransitionMetadataPatch(nextLifecycle, input.decision);
|
|
147
|
+
for (const [key, value] of Object.entries(lifecyclePatch)) {
|
|
148
|
+
metadataPatch[key] = value;
|
|
149
|
+
}
|
|
150
|
+
// Persist
|
|
151
|
+
updateMetadata(input.dataDir, input.sessionId, metadataPatch);
|
|
152
|
+
return {
|
|
153
|
+
success: true,
|
|
154
|
+
previousLifecycle,
|
|
155
|
+
nextLifecycle,
|
|
156
|
+
previousStatus,
|
|
157
|
+
nextStatus,
|
|
158
|
+
transitionedAt: nowIso,
|
|
159
|
+
statusChanged,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Create an empty lifecycle for error cases.
|
|
164
|
+
*/
|
|
165
|
+
function createEmptyLifecycle() {
|
|
166
|
+
return {
|
|
167
|
+
version: 2,
|
|
168
|
+
session: {
|
|
169
|
+
kind: "worker",
|
|
170
|
+
state: "not_started",
|
|
171
|
+
reason: "spawn_requested",
|
|
172
|
+
startedAt: null,
|
|
173
|
+
completedAt: null,
|
|
174
|
+
terminatedAt: null,
|
|
175
|
+
lastTransitionAt: new Date().toISOString(),
|
|
176
|
+
},
|
|
177
|
+
pr: {
|
|
178
|
+
state: "none",
|
|
179
|
+
reason: "not_created",
|
|
180
|
+
number: null,
|
|
181
|
+
url: null,
|
|
182
|
+
lastObservedAt: null,
|
|
183
|
+
},
|
|
184
|
+
runtime: {
|
|
185
|
+
state: "unknown",
|
|
186
|
+
reason: "spawn_incomplete",
|
|
187
|
+
lastObservedAt: null,
|
|
188
|
+
handle: null,
|
|
189
|
+
tmuxName: null,
|
|
190
|
+
},
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Helper to create a minimal lifecycle decision for direct state updates.
|
|
195
|
+
*/
|
|
196
|
+
function createStateTransitionDecision(status, state, reason, evidence) {
|
|
197
|
+
return {
|
|
198
|
+
status,
|
|
199
|
+
evidence,
|
|
200
|
+
detecting: { attempts: 0 },
|
|
201
|
+
sessionState: state,
|
|
202
|
+
sessionReason: reason,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
export { applyDecisionToLifecycle, applyLifecycleDecision, buildTransitionMetadataPatch, createStateTransitionDecision };
|
|
207
|
+
//# sourceMappingURL=lifecycle-transition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle-transition.js","sources":["../src/lifecycle-transition.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session metadata read/write — JSON format.
|
|
3
|
+
*
|
|
4
|
+
* V2 storage layout:
|
|
5
|
+
* - Session metadata: ~/.agent-orchestrator/projects/{projectId}/sessions/{sessionId}.json
|
|
6
|
+
* - Orchestrator metadata: ~/.agent-orchestrator/projects/{projectId}/orchestrator.json
|
|
7
|
+
*
|
|
8
|
+
* Format: JSON (2-space indented), one object per file.
|
|
9
|
+
* Status: computed on read from lifecycle via deriveLegacyStatus().
|
|
10
|
+
* Pre-lifecycle sessions retain a stored status field; lifecycle sessions omit it on write.
|
|
11
|
+
*/
|
|
12
|
+
import type { CanonicalSessionLifecycle, SessionId, SessionMetadata } from "./types.js";
|
|
13
|
+
import { type ActivityEventSource } from "./activity-events.js";
|
|
14
|
+
/**
|
|
15
|
+
* Read metadata for a session. Returns null if the file doesn't exist.
|
|
16
|
+
*/
|
|
17
|
+
export declare function readMetadata(dataDir: string, sessionId: SessionId): SessionMetadata | null;
|
|
18
|
+
/**
|
|
19
|
+
* Read raw metadata as a plain object (for arbitrary key access).
|
|
20
|
+
*/
|
|
21
|
+
export declare function readMetadataRaw(dataDir: string, sessionId: SessionId): Record<string, string> | null;
|
|
22
|
+
/**
|
|
23
|
+
* Write full metadata for a session (overwrites existing file).
|
|
24
|
+
*/
|
|
25
|
+
export declare function writeMetadata(dataDir: string, sessionId: SessionId, metadata: SessionMetadata): void;
|
|
26
|
+
/**
|
|
27
|
+
* Update specific fields in a session's metadata.
|
|
28
|
+
* Reads existing file, merges updates, writes back.
|
|
29
|
+
*/
|
|
30
|
+
export declare function updateMetadata(dataDir: string, sessionId: SessionId, updates: Partial<Record<string, string>>): void;
|
|
31
|
+
export declare function applyMetadataUpdates(existing: Record<string, string>, updates: Partial<Record<string, string>>): Record<string, string>;
|
|
32
|
+
export interface MutateMetadataOptions {
|
|
33
|
+
createIfMissing?: boolean;
|
|
34
|
+
activityEventSource?: ActivityEventSource;
|
|
35
|
+
}
|
|
36
|
+
export declare function mutateMetadata(dataDir: string, sessionId: SessionId, updater: (existing: Record<string, string>) => Record<string, string>, options?: MutateMetadataOptions): Record<string, string> | null;
|
|
37
|
+
export declare function readCanonicalLifecycle(dataDir: string, sessionId: SessionId): CanonicalSessionLifecycle | null;
|
|
38
|
+
export declare function writeCanonicalLifecycle(dataDir: string, sessionId: SessionId, lifecycle: CanonicalSessionLifecycle): void;
|
|
39
|
+
export declare function updateCanonicalLifecycle(dataDir: string, sessionId: SessionId, updater: (current: CanonicalSessionLifecycle) => CanonicalSessionLifecycle): CanonicalSessionLifecycle | null;
|
|
40
|
+
/**
|
|
41
|
+
* Delete a session's metadata file permanently.
|
|
42
|
+
*/
|
|
43
|
+
export declare function deleteMetadata(dataDir: string, sessionId: SessionId): void;
|
|
44
|
+
/**
|
|
45
|
+
* List all session IDs that have metadata files.
|
|
46
|
+
* Reads .json files from the sessions directory.
|
|
47
|
+
*/
|
|
48
|
+
export declare function listMetadata(dataDir: string): SessionId[];
|
|
49
|
+
/**
|
|
50
|
+
* Atomically reserve a session ID by creating its metadata file with O_EXCL.
|
|
51
|
+
* Returns true if the ID was successfully reserved, false if it already exists.
|
|
52
|
+
*/
|
|
53
|
+
export declare function reserveSessionId(dataDir: string, sessionId: SessionId): boolean;
|
|
54
|
+
//# sourceMappingURL=metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAeH,OAAO,KAAK,EACV,yBAAyB,EAEzB,SAAS,EACT,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAuB,KAAK,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AA8GrF;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,eAAe,GAAG,IAAI,CA4D1F;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,SAAS,GACnB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAuB/B;AA2CD;;GAEG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,eAAe,GACxB,IAAI,CAsCN;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GACvC,IAAI,CASN;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAChC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GACvC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAcxB;AAQD,MAAM,WAAW,qBAAqB;IACpC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;CAC3C;AAED,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACrE,OAAO,GAAE,qBAA0B,GAClC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CA8E/B;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,SAAS,GACnB,yBAAyB,GAAG,IAAI,CAIlC;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,yBAAyB,GACnC,IAAI,CAEN;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,CAAC,OAAO,EAAE,yBAAyB,KAAK,yBAAyB,GACzE,yBAAyB,GAAG,IAAI,CAUlC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,CAS1E;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,CAkBzD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAU/E"}
|