@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,516 @@
|
|
|
1
|
+
import { existsSync, readFileSync, mkdirSync, writeFileSync, appendFileSync } from 'node:fs';
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
3
|
+
import { basename, dirname, join } from 'node:path';
|
|
4
|
+
import { recordActivityEvent } from './activity-events.js';
|
|
5
|
+
import { readMetadataRaw, mutateMetadata } from './metadata.js';
|
|
6
|
+
import { cloneLifecycle, parseCanonicalLifecycle, deriveLegacyStatus, buildLifecycleMetadataPatch } from './lifecycle-state.js';
|
|
7
|
+
import { parsePrFromUrl } from './utils/pr.js';
|
|
8
|
+
import { assertValidSessionIdComponent } from './utils/session-id.js';
|
|
9
|
+
import { validateStatus } from './utils/validation.js';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Agent Report — explicit workflow transitions declared by the worker agent.
|
|
13
|
+
*
|
|
14
|
+
* Stage 3 of the state-machine redesign. Agents run `athene acknowledge` and
|
|
15
|
+
* `athene report <state>` from inside a managed session to declare the workflow
|
|
16
|
+
* phase they are entering. The lifecycle manager prefers fresh agent reports
|
|
17
|
+
* over weak inference, but runtime evidence (process death, merged PR) and
|
|
18
|
+
* SCM ground-truth (CI, review decisions) still take precedence.
|
|
19
|
+
*
|
|
20
|
+
* Fallback matrix (highest precedence first):
|
|
21
|
+
* 1. Runtime dead + no recent activity → terminated/stuck
|
|
22
|
+
* 2. Agent activity plugin surfaces waiting_input/exited
|
|
23
|
+
* 3. SCM/PR ground truth (merged, closed, CI, reviews)
|
|
24
|
+
* 4. Fresh agent report (this module)
|
|
25
|
+
* 5. Idle-beyond-threshold promotion → stuck
|
|
26
|
+
* 6. Default to working
|
|
27
|
+
*/
|
|
28
|
+
/**
|
|
29
|
+
* Canonical set of states an agent can self-declare.
|
|
30
|
+
*
|
|
31
|
+
* - `started` — agent has begun the task after planning
|
|
32
|
+
* - `working` — generic working signal, useful after a pause
|
|
33
|
+
* - `waiting` — blocked on an external dependency agent cannot unblock
|
|
34
|
+
* - `needs_input` — blocked on human input
|
|
35
|
+
* - `fixing_ci` — responding to a failing CI run
|
|
36
|
+
* - `addressing_reviews`— responding to requested review changes
|
|
37
|
+
* - `pr_created` / `draft_pr_created` / `ready_for_review`
|
|
38
|
+
* — non-terminal PR workflow events with optional PR metadata
|
|
39
|
+
* - `completed` — finished research/non-coding work (not "merged")
|
|
40
|
+
*
|
|
41
|
+
* Note: agents cannot self-report `done`, `terminated`, or terminal PR states
|
|
42
|
+
* like `merged` / `closed`. Those remain owned by AO so ground-truth sources
|
|
43
|
+
* (SCM, runtime) stay authoritative.
|
|
44
|
+
*/
|
|
45
|
+
const AGENT_REPORTED_STATES = [
|
|
46
|
+
"started",
|
|
47
|
+
"working",
|
|
48
|
+
"waiting",
|
|
49
|
+
"needs_input",
|
|
50
|
+
"fixing_ci",
|
|
51
|
+
"addressing_reviews",
|
|
52
|
+
"pr_created",
|
|
53
|
+
"draft_pr_created",
|
|
54
|
+
"ready_for_review",
|
|
55
|
+
"completed",
|
|
56
|
+
];
|
|
57
|
+
/** Metadata keys written by `applyAgentReport`. Keep in sync with CLI parsing. */
|
|
58
|
+
const AGENT_REPORT_METADATA_KEYS = {
|
|
59
|
+
STATE: "agentReportedState",
|
|
60
|
+
AT: "agentReportedAt",
|
|
61
|
+
NOTE: "agentReportedNote",
|
|
62
|
+
PR_NUMBER: "agentReportedPrNumber",
|
|
63
|
+
PR_URL: "agentReportedPrUrl",
|
|
64
|
+
PR_IS_DRAFT: "agentReportedPrIsDraft",
|
|
65
|
+
};
|
|
66
|
+
/** Freshness window — agent reports older than this are ignored. */
|
|
67
|
+
const AGENT_REPORT_FRESHNESS_MS = 300_000; // 5 minutes
|
|
68
|
+
const AGENT_REPORT_CLOCK_SKEW_TOLERANCE_MS = 60_000; // 60 seconds
|
|
69
|
+
/**
|
|
70
|
+
* CLI surface accepts these hyphen/underscore aliases for convenience.
|
|
71
|
+
*
|
|
72
|
+
* Note: `done` is intentionally NOT an alias — agents cannot self-report
|
|
73
|
+
* terminal `done` state (AO owns that transition via SCM ground truth). Use
|
|
74
|
+
* `completed` for finished non-coding research/analysis work.
|
|
75
|
+
*/
|
|
76
|
+
const INPUT_ALIASES = {
|
|
77
|
+
start: "started",
|
|
78
|
+
started: "started",
|
|
79
|
+
working: "working",
|
|
80
|
+
work: "working",
|
|
81
|
+
wait: "waiting",
|
|
82
|
+
waiting: "waiting",
|
|
83
|
+
"needs-input": "needs_input",
|
|
84
|
+
needs_input: "needs_input",
|
|
85
|
+
input: "needs_input",
|
|
86
|
+
"fixing-ci": "fixing_ci",
|
|
87
|
+
fixing_ci: "fixing_ci",
|
|
88
|
+
ci: "fixing_ci",
|
|
89
|
+
"addressing-reviews": "addressing_reviews",
|
|
90
|
+
addressing_reviews: "addressing_reviews",
|
|
91
|
+
reviews: "addressing_reviews",
|
|
92
|
+
"pr-created": "pr_created",
|
|
93
|
+
pr_created: "pr_created",
|
|
94
|
+
"draft-pr-created": "draft_pr_created",
|
|
95
|
+
draft_pr_created: "draft_pr_created",
|
|
96
|
+
"ready-for-review": "ready_for_review",
|
|
97
|
+
ready_for_review: "ready_for_review",
|
|
98
|
+
completed: "completed",
|
|
99
|
+
complete: "completed",
|
|
100
|
+
};
|
|
101
|
+
/** Normalize a user-supplied report name into the canonical form. */
|
|
102
|
+
function normalizeAgentReportedState(input) {
|
|
103
|
+
if (!input)
|
|
104
|
+
return null;
|
|
105
|
+
return INPUT_ALIASES[input.trim().toLowerCase()] ?? null;
|
|
106
|
+
}
|
|
107
|
+
/** Canonical mapping: AgentReportedState → (canonical session state, reason). */
|
|
108
|
+
function mapAgentReportToLifecycle(state) {
|
|
109
|
+
switch (state) {
|
|
110
|
+
case "started":
|
|
111
|
+
return { sessionState: "working", sessionReason: "agent_acknowledged" };
|
|
112
|
+
case "working":
|
|
113
|
+
return { sessionState: "working", sessionReason: "task_in_progress" };
|
|
114
|
+
case "waiting":
|
|
115
|
+
return { sessionState: "idle", sessionReason: "awaiting_external_review" };
|
|
116
|
+
case "needs_input":
|
|
117
|
+
return { sessionState: "needs_input", sessionReason: "awaiting_user_input" };
|
|
118
|
+
case "fixing_ci":
|
|
119
|
+
return { sessionState: "working", sessionReason: "fixing_ci" };
|
|
120
|
+
case "addressing_reviews":
|
|
121
|
+
return { sessionState: "working", sessionReason: "resolving_review_comments" };
|
|
122
|
+
case "pr_created":
|
|
123
|
+
return { sessionState: "idle", sessionReason: "pr_created" };
|
|
124
|
+
case "draft_pr_created":
|
|
125
|
+
return { sessionState: "working", sessionReason: "task_in_progress" };
|
|
126
|
+
case "ready_for_review":
|
|
127
|
+
return { sessionState: "idle", sessionReason: "awaiting_external_review" };
|
|
128
|
+
case "completed":
|
|
129
|
+
return { sessionState: "idle", sessionReason: "research_complete" };
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
function isPRWorkflowReport(state) {
|
|
133
|
+
return state === "pr_created" || state === "draft_pr_created" || state === "ready_for_review";
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Validate whether an agent-issued report is allowed given the current lifecycle.
|
|
137
|
+
*
|
|
138
|
+
* Rules:
|
|
139
|
+
* - Orchestrator sessions cannot accept agent reports (orchestrator sessions
|
|
140
|
+
* are read-only coordinators).
|
|
141
|
+
* - Terminal states (`done`, `terminated`) cannot be re-opened by an agent.
|
|
142
|
+
* - Merged PRs cannot be re-opened by an agent (`completed`/`working` etc.
|
|
143
|
+
* attempts are rejected).
|
|
144
|
+
* - Runtime state of `missing`/`exited` means the agent cannot possibly be
|
|
145
|
+
* reporting — reject so we don't silently contradict runtime truth.
|
|
146
|
+
*/
|
|
147
|
+
function validateAgentReportTransition(lifecycle, _next) {
|
|
148
|
+
if (lifecycle.session.kind === "orchestrator") {
|
|
149
|
+
return { ok: false, reason: "orchestrator sessions cannot self-report" };
|
|
150
|
+
}
|
|
151
|
+
if (lifecycle.session.state === "terminated") {
|
|
152
|
+
return { ok: false, reason: "session is terminated" };
|
|
153
|
+
}
|
|
154
|
+
// Terminal states cannot be re-opened by an agent — including `completed`,
|
|
155
|
+
// which maps back to `idle` and would otherwise reanimate a `done` session.
|
|
156
|
+
if (lifecycle.session.state === "done") {
|
|
157
|
+
return { ok: false, reason: "session is already done" };
|
|
158
|
+
}
|
|
159
|
+
if (lifecycle.pr.state === "merged" || lifecycle.pr.state === "closed") {
|
|
160
|
+
return { ok: false, reason: `PR already ${lifecycle.pr.state}` };
|
|
161
|
+
}
|
|
162
|
+
if (lifecycle.runtime.state === "missing" || lifecycle.runtime.state === "exited") {
|
|
163
|
+
return { ok: false, reason: "runtime is not alive" };
|
|
164
|
+
}
|
|
165
|
+
return { ok: true };
|
|
166
|
+
}
|
|
167
|
+
function buildAuditDir(dataDir) {
|
|
168
|
+
return join(dataDir, ".agent-report-audit");
|
|
169
|
+
}
|
|
170
|
+
function inferProjectIdFromDataDir(dataDir) {
|
|
171
|
+
// dataDir is `.../projects/{projectId}/sessions`; recover projectId for filtering.
|
|
172
|
+
return basename(dirname(dataDir)) || undefined;
|
|
173
|
+
}
|
|
174
|
+
const AGENT_REPORT_AUDIT_MAX_BYTES = 256 * 1024;
|
|
175
|
+
const AGENT_REPORT_AUDIT_MAX_ENTRIES = 200;
|
|
176
|
+
function validateAuditSessionId(sessionId) {
|
|
177
|
+
assertValidSessionIdComponent(sessionId);
|
|
178
|
+
}
|
|
179
|
+
function buildAuditFilePath(dataDir, sessionId) {
|
|
180
|
+
validateAuditSessionId(sessionId);
|
|
181
|
+
return join(buildAuditDir(dataDir), `${sessionId}.ndjson`);
|
|
182
|
+
}
|
|
183
|
+
function normalizeActor(actor) {
|
|
184
|
+
const trimmed = actor?.trim();
|
|
185
|
+
if (trimmed)
|
|
186
|
+
return trimmed;
|
|
187
|
+
return "unknown";
|
|
188
|
+
}
|
|
189
|
+
function buildAuditSnapshot(lifecycle, legacyStatus) {
|
|
190
|
+
return {
|
|
191
|
+
legacyStatus,
|
|
192
|
+
sessionState: lifecycle.session.state,
|
|
193
|
+
sessionReason: lifecycle.session.reason,
|
|
194
|
+
lastTransitionAt: lifecycle.session.lastTransitionAt,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
function appendAgentReportAuditEntry(dataDir, sessionId, entry) {
|
|
198
|
+
const auditDir = buildAuditDir(dataDir);
|
|
199
|
+
mkdirSync(auditDir, { recursive: true });
|
|
200
|
+
const auditFilePath = buildAuditFilePath(dataDir, sessionId);
|
|
201
|
+
const serializedEntry = `${JSON.stringify(entry)}\n`;
|
|
202
|
+
if (existsSync(auditFilePath)) {
|
|
203
|
+
const current = readFileSync(auditFilePath, "utf8");
|
|
204
|
+
let entries = current
|
|
205
|
+
.split("\n")
|
|
206
|
+
.filter((line) => line.length > 0)
|
|
207
|
+
.slice(-199);
|
|
208
|
+
entries.push(serializedEntry.trimEnd());
|
|
209
|
+
while (entries.length > 1 &&
|
|
210
|
+
Buffer.byteLength(`${entries.join("\n")}\n`, "utf8") > AGENT_REPORT_AUDIT_MAX_BYTES) {
|
|
211
|
+
entries = entries.slice(1);
|
|
212
|
+
}
|
|
213
|
+
if (entries.length > AGENT_REPORT_AUDIT_MAX_ENTRIES) {
|
|
214
|
+
entries = entries.slice(-AGENT_REPORT_AUDIT_MAX_ENTRIES);
|
|
215
|
+
}
|
|
216
|
+
if (Buffer.byteLength(current, "utf8") + Buffer.byteLength(serializedEntry, "utf8") >=
|
|
217
|
+
AGENT_REPORT_AUDIT_MAX_BYTES) {
|
|
218
|
+
writeFileSync(auditFilePath, `${entries.join("\n")}\n`, "utf8");
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
appendFileSync(auditFilePath, serializedEntry, "utf8");
|
|
223
|
+
}
|
|
224
|
+
function readAgentReportAuditTrail(dataDir, sessionId) {
|
|
225
|
+
const auditFilePath = buildAuditFilePath(dataDir, sessionId);
|
|
226
|
+
if (!existsSync(auditFilePath)) {
|
|
227
|
+
return [];
|
|
228
|
+
}
|
|
229
|
+
return parseAgentReportAuditTrail(readFileSync(auditFilePath, "utf8"));
|
|
230
|
+
}
|
|
231
|
+
async function readAgentReportAuditTrailAsync(dataDir, sessionId) {
|
|
232
|
+
const auditFilePath = buildAuditFilePath(dataDir, sessionId);
|
|
233
|
+
if (!existsSync(auditFilePath)) {
|
|
234
|
+
return [];
|
|
235
|
+
}
|
|
236
|
+
return parseAgentReportAuditTrail(await readFile(auditFilePath, "utf8"));
|
|
237
|
+
}
|
|
238
|
+
function parseAgentReportAuditTrail(content) {
|
|
239
|
+
return content
|
|
240
|
+
.split("\n")
|
|
241
|
+
.map((line) => line.trim())
|
|
242
|
+
.filter((line) => line.length > 0)
|
|
243
|
+
.flatMap((line) => {
|
|
244
|
+
try {
|
|
245
|
+
const parsed = JSON.parse(line);
|
|
246
|
+
if (typeof parsed.timestamp !== "string" ||
|
|
247
|
+
typeof parsed.actor !== "string" ||
|
|
248
|
+
(parsed.source !== "acknowledge" && parsed.source !== "report") ||
|
|
249
|
+
!AGENT_REPORTED_STATES.includes(parsed.reportState) ||
|
|
250
|
+
typeof parsed.accepted !== "boolean" ||
|
|
251
|
+
!parsed.before ||
|
|
252
|
+
!parsed.after) {
|
|
253
|
+
return [];
|
|
254
|
+
}
|
|
255
|
+
return [parsed];
|
|
256
|
+
}
|
|
257
|
+
catch {
|
|
258
|
+
return [];
|
|
259
|
+
}
|
|
260
|
+
})
|
|
261
|
+
.reverse();
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Apply an agent report to a session: update the canonical lifecycle on disk
|
|
265
|
+
* and persist the report metadata keys. Throws when the transition is rejected.
|
|
266
|
+
*
|
|
267
|
+
* The write is idempotent: applying the same report twice is safe (lifecycle
|
|
268
|
+
* fields are already set, metadata timestamp refreshes).
|
|
269
|
+
*/
|
|
270
|
+
function applyAgentReport(dataDir, sessionId, input) {
|
|
271
|
+
const projectId = inferProjectIdFromDataDir(dataDir);
|
|
272
|
+
const raw = readMetadataRaw(dataDir, sessionId);
|
|
273
|
+
if (!raw) {
|
|
274
|
+
recordActivityEvent({
|
|
275
|
+
projectId,
|
|
276
|
+
sessionId,
|
|
277
|
+
source: "api",
|
|
278
|
+
kind: "api.agent_report.session_not_found",
|
|
279
|
+
level: "warn",
|
|
280
|
+
summary: `applyAgentReport: session not found: ${sessionId}`,
|
|
281
|
+
data: {
|
|
282
|
+
reportState: input.state,
|
|
283
|
+
actor: input.actor,
|
|
284
|
+
source: input.source,
|
|
285
|
+
},
|
|
286
|
+
});
|
|
287
|
+
throw new Error(`Session not found: ${sessionId}`);
|
|
288
|
+
}
|
|
289
|
+
validateAuditSessionId(sessionId);
|
|
290
|
+
const now = (input.now ?? new Date()).toISOString();
|
|
291
|
+
const source = input.source ?? "report";
|
|
292
|
+
const actor = normalizeActor(input.actor);
|
|
293
|
+
const trimmedNote = input.note?.trim() || undefined;
|
|
294
|
+
const trimmedPrUrl = input.prUrl?.trim() || undefined;
|
|
295
|
+
const parsedPrNumber = typeof input.prNumber === "number" && Number.isInteger(input.prNumber) && input.prNumber > 0
|
|
296
|
+
? input.prNumber
|
|
297
|
+
: undefined;
|
|
298
|
+
const parsedPrFromUrl = trimmedPrUrl ? parsePrFromUrl(trimmedPrUrl) : null;
|
|
299
|
+
const urlPrNumber = parsedPrFromUrl?.number;
|
|
300
|
+
if (trimmedPrUrl &&
|
|
301
|
+
parsedPrNumber !== undefined &&
|
|
302
|
+
urlPrNumber !== undefined &&
|
|
303
|
+
parsedPrNumber !== urlPrNumber) {
|
|
304
|
+
throw new Error(`PR number ${parsedPrNumber} does not match PR URL ${trimmedPrUrl}`);
|
|
305
|
+
}
|
|
306
|
+
const inferredPrNumber = urlPrNumber;
|
|
307
|
+
const prNumber = parsedPrNumber ?? inferredPrNumber;
|
|
308
|
+
const prIsDraft = input.state === "draft_pr_created"
|
|
309
|
+
? true
|
|
310
|
+
: input.state === "pr_created" || input.state === "ready_for_review"
|
|
311
|
+
? false
|
|
312
|
+
: undefined;
|
|
313
|
+
const existingPrUrl = raw[AGENT_REPORT_METADATA_KEYS.PR_URL]?.trim() || undefined;
|
|
314
|
+
const existingPrNumberRaw = raw[AGENT_REPORT_METADATA_KEYS.PR_NUMBER];
|
|
315
|
+
const existingPrNumber = existingPrNumberRaw && /^\d+$/.test(existingPrNumberRaw)
|
|
316
|
+
? Number.parseInt(existingPrNumberRaw, 10)
|
|
317
|
+
: undefined;
|
|
318
|
+
let before = null;
|
|
319
|
+
let previousState = null;
|
|
320
|
+
let nextState = null;
|
|
321
|
+
let legacyStatus = null;
|
|
322
|
+
let previousLegacyStatus = null;
|
|
323
|
+
const nextMetadata = mutateMetadata(dataDir, sessionId, (existing) => {
|
|
324
|
+
const current = cloneLifecycle(parseCanonicalLifecycle(existing, {
|
|
325
|
+
sessionId,
|
|
326
|
+
status: validateStatus(existing["status"]),
|
|
327
|
+
}));
|
|
328
|
+
previousLegacyStatus = deriveLegacyStatus(current);
|
|
329
|
+
before = buildAuditSnapshot(current, previousLegacyStatus);
|
|
330
|
+
const validation = validateAgentReportTransition(current, input.state);
|
|
331
|
+
if (!validation.ok) {
|
|
332
|
+
const rejectionReason = validation.reason ?? "transition rejected";
|
|
333
|
+
appendAgentReportAuditEntry(dataDir, sessionId, {
|
|
334
|
+
timestamp: now,
|
|
335
|
+
actor,
|
|
336
|
+
source,
|
|
337
|
+
reportState: input.state,
|
|
338
|
+
note: trimmedNote,
|
|
339
|
+
prNumber,
|
|
340
|
+
prUrl: trimmedPrUrl,
|
|
341
|
+
prIsDraft,
|
|
342
|
+
accepted: false,
|
|
343
|
+
rejectionReason,
|
|
344
|
+
before,
|
|
345
|
+
after: before,
|
|
346
|
+
});
|
|
347
|
+
recordActivityEvent({
|
|
348
|
+
projectId,
|
|
349
|
+
sessionId,
|
|
350
|
+
source: "api",
|
|
351
|
+
kind: "api.agent_report.transition_rejected",
|
|
352
|
+
level: "warn",
|
|
353
|
+
summary: `applyAgentReport rejected ${input.state} for ${sessionId}: ${rejectionReason}`,
|
|
354
|
+
data: {
|
|
355
|
+
reportState: input.state,
|
|
356
|
+
rejectionReason,
|
|
357
|
+
actor,
|
|
358
|
+
reportSource: source,
|
|
359
|
+
fromState: current.session.state,
|
|
360
|
+
fromReason: current.session.reason,
|
|
361
|
+
legacyStatus: previousLegacyStatus,
|
|
362
|
+
},
|
|
363
|
+
});
|
|
364
|
+
throw new Error(rejectionReason);
|
|
365
|
+
}
|
|
366
|
+
const mapped = mapAgentReportToLifecycle(input.state);
|
|
367
|
+
previousState = current.session.state;
|
|
368
|
+
nextState = mapped.sessionState;
|
|
369
|
+
current.session.state = mapped.sessionState;
|
|
370
|
+
current.session.reason = mapped.sessionReason;
|
|
371
|
+
current.session.lastTransitionAt = now;
|
|
372
|
+
if (isPRWorkflowReport(input.state)) {
|
|
373
|
+
const effectivePrUrl = trimmedPrUrl ?? current.pr.url ?? existingPrUrl;
|
|
374
|
+
const effectivePrNumber = prNumber ?? current.pr.number ?? existingPrNumber ?? parsedPrFromUrl?.number;
|
|
375
|
+
const canAdvancePrState = effectivePrUrl !== undefined ||
|
|
376
|
+
effectivePrNumber !== undefined ||
|
|
377
|
+
current.pr.state !== "none";
|
|
378
|
+
if (canAdvancePrState) {
|
|
379
|
+
current.pr.state = "open";
|
|
380
|
+
current.pr.reason = input.state === "ready_for_review" ? "review_pending" : "in_progress";
|
|
381
|
+
current.pr.lastObservedAt = now;
|
|
382
|
+
}
|
|
383
|
+
if (effectivePrUrl) {
|
|
384
|
+
current.pr.url = effectivePrUrl;
|
|
385
|
+
}
|
|
386
|
+
if (effectivePrNumber !== undefined) {
|
|
387
|
+
current.pr.number = effectivePrNumber;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
if (mapped.sessionState === "working" && current.session.startedAt === null) {
|
|
391
|
+
current.session.startedAt = now;
|
|
392
|
+
}
|
|
393
|
+
legacyStatus = deriveLegacyStatus(current);
|
|
394
|
+
const next = { ...existing };
|
|
395
|
+
Object.assign(next, buildLifecycleMetadataPatch(current), {
|
|
396
|
+
[AGENT_REPORT_METADATA_KEYS.STATE]: input.state,
|
|
397
|
+
[AGENT_REPORT_METADATA_KEYS.AT]: now,
|
|
398
|
+
});
|
|
399
|
+
if (trimmedNote) {
|
|
400
|
+
next[AGENT_REPORT_METADATA_KEYS.NOTE] = trimmedNote;
|
|
401
|
+
}
|
|
402
|
+
else {
|
|
403
|
+
next[AGENT_REPORT_METADATA_KEYS.NOTE] = "";
|
|
404
|
+
}
|
|
405
|
+
if (isPRWorkflowReport(input.state)) {
|
|
406
|
+
if (trimmedPrUrl) {
|
|
407
|
+
next[AGENT_REPORT_METADATA_KEYS.PR_URL] = trimmedPrUrl;
|
|
408
|
+
}
|
|
409
|
+
if (prNumber !== undefined) {
|
|
410
|
+
next[AGENT_REPORT_METADATA_KEYS.PR_NUMBER] = String(prNumber);
|
|
411
|
+
}
|
|
412
|
+
if (prIsDraft !== undefined) {
|
|
413
|
+
next[AGENT_REPORT_METADATA_KEYS.PR_IS_DRAFT] = prIsDraft ? "true" : "false";
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
return next;
|
|
417
|
+
}, { activityEventSource: "api" });
|
|
418
|
+
if (!nextMetadata || !before || !previousState || !nextState || !legacyStatus) {
|
|
419
|
+
recordActivityEvent({
|
|
420
|
+
projectId,
|
|
421
|
+
sessionId,
|
|
422
|
+
source: "api",
|
|
423
|
+
kind: "api.agent_report.apply_failed",
|
|
424
|
+
level: "error",
|
|
425
|
+
summary: `failed to apply agent report ${input.state} for ${sessionId}`,
|
|
426
|
+
data: {
|
|
427
|
+
reportState: input.state,
|
|
428
|
+
actor,
|
|
429
|
+
source,
|
|
430
|
+
},
|
|
431
|
+
});
|
|
432
|
+
throw new Error(`Failed to apply agent report for session ${sessionId}`);
|
|
433
|
+
}
|
|
434
|
+
const nextLifecycle = parseCanonicalLifecycle(nextMetadata, {
|
|
435
|
+
sessionId,
|
|
436
|
+
status: validateStatus(nextMetadata["status"]),
|
|
437
|
+
});
|
|
438
|
+
const after = buildAuditSnapshot(nextLifecycle, legacyStatus);
|
|
439
|
+
const auditEntry = {
|
|
440
|
+
timestamp: now,
|
|
441
|
+
actor,
|
|
442
|
+
source,
|
|
443
|
+
reportState: input.state,
|
|
444
|
+
note: trimmedNote,
|
|
445
|
+
prNumber,
|
|
446
|
+
prUrl: trimmedPrUrl,
|
|
447
|
+
prIsDraft,
|
|
448
|
+
accepted: true,
|
|
449
|
+
before,
|
|
450
|
+
after,
|
|
451
|
+
};
|
|
452
|
+
appendAgentReportAuditEntry(dataDir, sessionId, auditEntry);
|
|
453
|
+
return {
|
|
454
|
+
report: {
|
|
455
|
+
state: input.state,
|
|
456
|
+
timestamp: now,
|
|
457
|
+
note: trimmedNote,
|
|
458
|
+
prNumber,
|
|
459
|
+
prUrl: trimmedPrUrl,
|
|
460
|
+
prIsDraft,
|
|
461
|
+
actor,
|
|
462
|
+
source,
|
|
463
|
+
},
|
|
464
|
+
legacyStatus,
|
|
465
|
+
previousState,
|
|
466
|
+
nextState,
|
|
467
|
+
auditEntry,
|
|
468
|
+
};
|
|
469
|
+
}
|
|
470
|
+
/** Read an agent report out of a session's raw metadata, or null if absent. */
|
|
471
|
+
function readAgentReport(meta) {
|
|
472
|
+
if (!meta)
|
|
473
|
+
return null;
|
|
474
|
+
const state = meta[AGENT_REPORT_METADATA_KEYS.STATE];
|
|
475
|
+
const at = meta[AGENT_REPORT_METADATA_KEYS.AT];
|
|
476
|
+
if (!state || !at)
|
|
477
|
+
return null;
|
|
478
|
+
if (!AGENT_REPORTED_STATES.includes(state))
|
|
479
|
+
return null;
|
|
480
|
+
const parsed = Date.parse(at);
|
|
481
|
+
if (Number.isNaN(parsed))
|
|
482
|
+
return null;
|
|
483
|
+
const note = meta[AGENT_REPORT_METADATA_KEYS.NOTE];
|
|
484
|
+
const rawPrNumber = meta[AGENT_REPORT_METADATA_KEYS.PR_NUMBER];
|
|
485
|
+
const prNumber = rawPrNumber && /^\d+$/.test(rawPrNumber) ? Number.parseInt(rawPrNumber, 10) : undefined;
|
|
486
|
+
const prUrl = meta[AGENT_REPORT_METADATA_KEYS.PR_URL] || undefined;
|
|
487
|
+
const rawPrIsDraft = meta[AGENT_REPORT_METADATA_KEYS.PR_IS_DRAFT];
|
|
488
|
+
const prIsDraft = rawPrIsDraft === "true" ? true : rawPrIsDraft === "false" ? false : undefined;
|
|
489
|
+
return {
|
|
490
|
+
state: state,
|
|
491
|
+
timestamp: new Date(parsed).toISOString(),
|
|
492
|
+
note: note && note.length > 0 ? note : undefined,
|
|
493
|
+
prNumber,
|
|
494
|
+
prUrl,
|
|
495
|
+
prIsDraft,
|
|
496
|
+
};
|
|
497
|
+
}
|
|
498
|
+
/**
|
|
499
|
+
* Check whether an agent report is fresh (within the freshness window).
|
|
500
|
+
*
|
|
501
|
+
* Future timestamps (clock skew, malformed input) are rejected — otherwise a
|
|
502
|
+
* single skewed `agentReportedAt` could appear "fresh" indefinitely and
|
|
503
|
+
* override stronger inference signals.
|
|
504
|
+
*/
|
|
505
|
+
function isAgentReportFresh(report, now = new Date(), windowMs = AGENT_REPORT_FRESHNESS_MS, clockSkewToleranceMs = AGENT_REPORT_CLOCK_SKEW_TOLERANCE_MS) {
|
|
506
|
+
const reportedAt = Date.parse(report.timestamp);
|
|
507
|
+
if (Number.isNaN(reportedAt))
|
|
508
|
+
return false;
|
|
509
|
+
const currentTime = now.getTime();
|
|
510
|
+
if (reportedAt > currentTime + clockSkewToleranceMs)
|
|
511
|
+
return false;
|
|
512
|
+
return currentTime - reportedAt <= windowMs;
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
export { AGENT_REPORTED_STATES, AGENT_REPORT_CLOCK_SKEW_TOLERANCE_MS, AGENT_REPORT_FRESHNESS_MS, AGENT_REPORT_METADATA_KEYS, applyAgentReport, isAgentReportFresh, mapAgentReportToLifecycle, normalizeAgentReportedState, readAgentReport, readAgentReportAuditTrail, readAgentReportAuditTrailAsync, validateAgentReportTransition };
|
|
516
|
+
//# sourceMappingURL=agent-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-report.js","sources":["../src/agent-report.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type AgentPermissionMode, type AgentSpecificConfig, type DefaultPlugins, type ProjectConfig } from "./types.js";
|
|
2
|
+
export type SessionRole = "orchestrator" | "worker";
|
|
3
|
+
export interface ResolvedAgentSelection {
|
|
4
|
+
role: SessionRole;
|
|
5
|
+
agentName: string;
|
|
6
|
+
agentConfig: AgentSpecificConfig;
|
|
7
|
+
model?: string;
|
|
8
|
+
permissions?: AgentPermissionMode;
|
|
9
|
+
subagent?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function resolveSessionRole(sessionId: string, metadata: Record<string, string> | undefined, sessionPrefix: string, allSessionPrefixes?: string[]): SessionRole;
|
|
12
|
+
/**
|
|
13
|
+
* Resolve the agent identity for a session metadata record. Normalized Session
|
|
14
|
+
* objects are expected to carry metadata.agent; fallback resolution exists only
|
|
15
|
+
* for legacy raw metadata read/repair boundaries.
|
|
16
|
+
*/
|
|
17
|
+
export declare function resolveAgentSelectionForSession(params: {
|
|
18
|
+
sessionId: string;
|
|
19
|
+
metadata?: Record<string, string>;
|
|
20
|
+
project: ProjectConfig;
|
|
21
|
+
defaults: DefaultPlugins;
|
|
22
|
+
allSessionPrefixes?: string[];
|
|
23
|
+
}): ResolvedAgentSelection;
|
|
24
|
+
export declare function resolveAgentSelection(params: {
|
|
25
|
+
role: SessionRole;
|
|
26
|
+
project: ProjectConfig;
|
|
27
|
+
defaults: DefaultPlugins;
|
|
28
|
+
persistedAgent?: string;
|
|
29
|
+
spawnAgentOverride?: string;
|
|
30
|
+
}): ResolvedAgentSelection;
|
|
31
|
+
//# sourceMappingURL=agent-selection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-selection.d.ts","sourceRoot":"","sources":["../src/agent-selection.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG,QAAQ,CAAC;AAEpD,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,mBAAmB,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAC5C,aAAa,EAAE,MAAM,EACrB,kBAAkB,CAAC,EAAE,MAAM,EAAE,GAC5B,WAAW,CAIb;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,MAAM,EAAE;IACtD,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,OAAO,EAAE,aAAa,CAAC;IACvB,QAAQ,EAAE,cAAc,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC/B,GAAG,sBAAsB,CAYzB;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE;IAC5C,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,aAAa,CAAC;IACvB,QAAQ,EAAE,cAAc,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,GAAG,sBAAsB,CAuDzB"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { normalizeAgentPermissionMode, isOrchestratorSession } from './types.js';
|
|
2
|
+
|
|
3
|
+
function resolveSessionRole(sessionId, metadata, sessionPrefix, allSessionPrefixes) {
|
|
4
|
+
return isOrchestratorSession({ id: sessionId, metadata }, sessionPrefix, allSessionPrefixes)
|
|
5
|
+
? "orchestrator"
|
|
6
|
+
: "worker";
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Resolve the agent identity for a session metadata record. Normalized Session
|
|
10
|
+
* objects are expected to carry metadata.agent; fallback resolution exists only
|
|
11
|
+
* for legacy raw metadata read/repair boundaries.
|
|
12
|
+
*/
|
|
13
|
+
function resolveAgentSelectionForSession(params) {
|
|
14
|
+
return resolveAgentSelection({
|
|
15
|
+
role: resolveSessionRole(params.sessionId, params.metadata, params.project.sessionPrefix, params.allSessionPrefixes),
|
|
16
|
+
project: params.project,
|
|
17
|
+
defaults: params.defaults,
|
|
18
|
+
persistedAgent: params.metadata?.["agent"],
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
function resolveAgentSelection(params) {
|
|
22
|
+
const { role, project, defaults, persistedAgent, spawnAgentOverride } = params;
|
|
23
|
+
const roleProjectConfig = role === "orchestrator" ? project.orchestrator : project.worker;
|
|
24
|
+
const roleDefaults = role === "orchestrator" ? defaults.orchestrator : defaults.worker;
|
|
25
|
+
const sharedConfig = project.agentConfig ?? {};
|
|
26
|
+
const roleAgentConfig = roleProjectConfig?.agentConfig ?? {};
|
|
27
|
+
const agentName = persistedAgent
|
|
28
|
+
? persistedAgent
|
|
29
|
+
: role === "worker"
|
|
30
|
+
? (spawnAgentOverride ??
|
|
31
|
+
roleProjectConfig?.agent ??
|
|
32
|
+
project.agent ??
|
|
33
|
+
roleDefaults?.agent ??
|
|
34
|
+
defaults.agent)
|
|
35
|
+
: (roleProjectConfig?.agent ?? project.agent ?? roleDefaults?.agent ?? defaults.agent);
|
|
36
|
+
const agentConfig = {
|
|
37
|
+
...sharedConfig,
|
|
38
|
+
};
|
|
39
|
+
for (const [key, value] of Object.entries(roleAgentConfig)) {
|
|
40
|
+
if (value !== undefined) {
|
|
41
|
+
agentConfig[key] = value;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
const model = role === "orchestrator"
|
|
45
|
+
? (roleAgentConfig.orchestratorModel ??
|
|
46
|
+
roleAgentConfig.model ??
|
|
47
|
+
sharedConfig.orchestratorModel ??
|
|
48
|
+
sharedConfig.model)
|
|
49
|
+
: (roleAgentConfig.model ?? sharedConfig.model);
|
|
50
|
+
if (model !== undefined) {
|
|
51
|
+
agentConfig.model = model;
|
|
52
|
+
}
|
|
53
|
+
const permissions = normalizeAgentPermissionMode(typeof agentConfig.permissions === "string" ? agentConfig.permissions : undefined);
|
|
54
|
+
if (permissions !== undefined) {
|
|
55
|
+
agentConfig.permissions = permissions;
|
|
56
|
+
}
|
|
57
|
+
const subagent = typeof agentConfig["subagent"] === "string" ? agentConfig["subagent"] : undefined;
|
|
58
|
+
return {
|
|
59
|
+
role,
|
|
60
|
+
agentName,
|
|
61
|
+
agentConfig,
|
|
62
|
+
model,
|
|
63
|
+
permissions,
|
|
64
|
+
subagent,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export { resolveAgentSelection, resolveAgentSelectionForSession, resolveSessionRole };
|
|
69
|
+
//# sourceMappingURL=agent-selection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-selection.js","sources":["../src/agent-selection.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAoBM,SAAU,kBAAkB,CAChC,SAAiB,EACjB,QAA4C,EAC5C,aAAqB,EACrB,kBAA6B,EAAA;AAE7B,IAAA,OAAO,qBAAqB,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,aAAa,EAAE,kBAAkB;AACzF,UAAE;UACA,QAAQ;AACd;AAEA;;;;AAIG;AACG,SAAU,+BAA+B,CAAC,MAM/C,EAAA;AACC,IAAA,OAAO,qBAAqB,CAAC;QAC3B,IAAI,EAAE,kBAAkB,CACtB,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,OAAO,CAAC,aAAa,EAC5B,MAAM,CAAC,kBAAkB,CAC1B;QACD,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;AACzB,QAAA,cAAc,EAAE,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC;AAC3C,KAAA,CAAC;AACJ;AAEM,SAAU,qBAAqB,CAAC,MAMrC,EAAA;AACC,IAAA,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,MAAM;AAC9E,IAAA,MAAM,iBAAiB,GAAG,IAAI,KAAK,cAAc,GAAG,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC,MAAM;AACzF,IAAA,MAAM,YAAY,GAAG,IAAI,KAAK,cAAc,GAAG,QAAQ,CAAC,YAAY,GAAG,QAAQ,CAAC,MAAM;AACtF,IAAA,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE;AAC9C,IAAA,MAAM,eAAe,GAAG,iBAAiB,EAAE,WAAW,IAAI,EAAE;IAE5D,MAAM,SAAS,GAAG;AAChB,UAAE;UACA,IAAI,KAAK;eACN,kBAAkB;AACnB,gBAAA,iBAAiB,EAAE,KAAK;AACxB,gBAAA,OAAO,CAAC,KAAK;AACb,gBAAA,YAAY,EAAE,KAAK;gBACnB,QAAQ,CAAC,KAAK;AAChB,eAAG,iBAAiB,EAAE,KAAK,IAAI,OAAO,CAAC,KAAK,IAAI,YAAY,EAAE,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC;AAE1F,IAAA,MAAM,WAAW,GAAwB;AACvC,QAAA,GAAG,YAAY;KAChB;AACD,IAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE;AAC1D,QAAA,IAAI,KAAK,KAAK,SAAS,EAAE;AACvB,YAAA,WAAW,CAAC,GAAG,CAAC,GAAG,KAAK;QAC1B;IACF;AAEA,IAAA,MAAM,KAAK,GACT,IAAI,KAAK;AACP,WAAG,eAAe,CAAC,iBAAiB;AAClC,YAAA,eAAe,CAAC,KAAK;AACrB,YAAA,YAAY,CAAC,iBAAiB;YAC9B,YAAY,CAAC,KAAK;WACjB,eAAe,CAAC,KAAK,IAAI,YAAY,CAAC,KAAK,CAAC;AAEnD,IAAA,IAAI,KAAK,KAAK,SAAS,EAAE;AACvB,QAAA,WAAW,CAAC,KAAK,GAAG,KAAK;IAC3B;IAEA,MAAM,WAAW,GAAG,4BAA4B,CAC9C,OAAO,WAAW,CAAC,WAAW,KAAK,QAAQ,GAAG,WAAW,CAAC,WAAW,GAAG,SAAS,CAClF;AACD,IAAA,IAAI,WAAW,KAAK,SAAS,EAAE;AAC7B,QAAA,WAAW,CAAC,WAAW,GAAG,WAAW;IACvC;IACA,MAAM,QAAQ,GACZ,OAAO,WAAW,CAAC,UAAU,CAAC,KAAK,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,GAAG,SAAS;IAEnF,OAAO;QACL,IAAI;QACJ,SAAS;QACT,WAAW;QACX,KAAK;QACL,WAAW;QACX,QAAQ;KACT;AACH;;;;"}
|