@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,87 @@
|
|
|
1
|
+
import { parseCanonicalLifecycle, deriveLegacyStatus } from '../lifecycle-state.js';
|
|
2
|
+
import { createActivitySignal } from '../activity-signal.js';
|
|
3
|
+
import { AGENT_REPORT_METADATA_KEYS } from '../agent-report.js';
|
|
4
|
+
import { dedupePrInfos, parsePrFromUrl } from './pr.js';
|
|
5
|
+
import { safeJsonParse, validateStatus } from './validation.js';
|
|
6
|
+
|
|
7
|
+
function deriveDefaultActivitySignal(options) {
|
|
8
|
+
if (options.activitySignal) {
|
|
9
|
+
return options.activitySignal;
|
|
10
|
+
}
|
|
11
|
+
if (options.activity === undefined || options.activity === null) {
|
|
12
|
+
return createActivitySignal("unavailable");
|
|
13
|
+
}
|
|
14
|
+
return createActivitySignal("valid", {
|
|
15
|
+
activity: options.activity,
|
|
16
|
+
timestamp: options.lastActivityAt,
|
|
17
|
+
source: options.activity === "exited" ? "runtime" : "native",
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
function sessionFromMetadata(sessionId, meta, options = {}) {
|
|
21
|
+
const runtimeHandle = options.runtimeHandle !== undefined
|
|
22
|
+
? options.runtimeHandle
|
|
23
|
+
: meta["runtimeHandle"]
|
|
24
|
+
? safeJsonParse(meta["runtimeHandle"])
|
|
25
|
+
: null;
|
|
26
|
+
const lifecycle = parseCanonicalLifecycle(meta, {
|
|
27
|
+
sessionId,
|
|
28
|
+
status: options.status ?? validateStatus(meta["status"]),
|
|
29
|
+
runtimeHandle,
|
|
30
|
+
createdAt: options.createdAt,
|
|
31
|
+
sessionKind: options.sessionKind,
|
|
32
|
+
});
|
|
33
|
+
const status = options.status ?? deriveLegacyStatus(lifecycle);
|
|
34
|
+
const prUrl = lifecycle.pr.url ?? meta["pr"];
|
|
35
|
+
const prIsDraft = meta[AGENT_REPORT_METADATA_KEYS.PR_IS_DRAFT] === "true";
|
|
36
|
+
// Build a PRInfo object from a single URL string.
|
|
37
|
+
// isDraft defaults to false for secondary PRs — only the primary PR carries the flag.
|
|
38
|
+
const buildPRInfo = (url, isDraft = false, lifecyclePrNumber) => {
|
|
39
|
+
const parsed = parsePrFromUrl(url);
|
|
40
|
+
return {
|
|
41
|
+
number: parsed?.number || lifecyclePrNumber || 0,
|
|
42
|
+
url,
|
|
43
|
+
title: "",
|
|
44
|
+
owner: parsed?.owner ?? "",
|
|
45
|
+
repo: parsed?.repo ?? "",
|
|
46
|
+
branch: meta["branch"] ?? "",
|
|
47
|
+
baseBranch: "",
|
|
48
|
+
isDraft,
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
// Build prs[] from metadata.
|
|
52
|
+
// New sessions write "prs" as comma-separated URLs for all PRs.
|
|
53
|
+
// Old sessions only have a single "pr" field — wrap it for backwards compat.
|
|
54
|
+
const prsRaw = meta["prs"];
|
|
55
|
+
const lifecyclePrNumber = lifecycle.pr.number ?? null;
|
|
56
|
+
const parsedPrs = prsRaw
|
|
57
|
+
? prsRaw
|
|
58
|
+
.split(",")
|
|
59
|
+
.map((u, i) => buildPRInfo(u.trim(), i === 0 ? prIsDraft : false, i === 0 ? lifecyclePrNumber : null))
|
|
60
|
+
.filter((p) => Boolean(p.url))
|
|
61
|
+
: prUrl
|
|
62
|
+
? [buildPRInfo(prUrl, prIsDraft, lifecyclePrNumber)]
|
|
63
|
+
: [];
|
|
64
|
+
const prs = dedupePrInfos(parsedPrs);
|
|
65
|
+
return {
|
|
66
|
+
id: sessionId,
|
|
67
|
+
projectId: meta["project"] ?? options.projectId ?? "",
|
|
68
|
+
status,
|
|
69
|
+
activity: options.activity ?? null,
|
|
70
|
+
activitySignal: deriveDefaultActivitySignal(options),
|
|
71
|
+
lifecycle,
|
|
72
|
+
branch: meta["branch"] || null,
|
|
73
|
+
issueId: meta["issue"] || null,
|
|
74
|
+
pr: prs[0] ?? null,
|
|
75
|
+
prs,
|
|
76
|
+
workspacePath: meta["worktree"] || options.workspacePathFallback || null,
|
|
77
|
+
runtimeHandle: lifecycle.runtime.handle ?? runtimeHandle,
|
|
78
|
+
agentInfo: meta["summary"] ? { summary: meta["summary"], agentSessionId: null } : null,
|
|
79
|
+
createdAt: meta["createdAt"] ? new Date(meta["createdAt"]) : (options.createdAt ?? new Date()),
|
|
80
|
+
lastActivityAt: options.lastActivityAt ?? new Date(),
|
|
81
|
+
restoredAt: options.restoredAt ?? (meta["restoredAt"] ? new Date(meta["restoredAt"]) : undefined),
|
|
82
|
+
metadata: meta,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export { sessionFromMetadata };
|
|
87
|
+
//# sourceMappingURL=session-from-metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-from-metadata.js","sources":["../../src/utils/session-from-metadata.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-id.d.ts","sourceRoot":"","sources":["../../src/utils/session-id.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,eAAO,MAAM,4BAA4B,QAAqB,CAAC;AAE/D,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,SAAS,EACpB,OAAO,SAAe,GACrB,IAAI,CAIN"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
const SESSION_ID_COMPONENT_PATTERN = /^[a-zA-Z0-9_-]+$/;
|
|
2
|
+
function assertValidSessionIdComponent(sessionId, context = "session ID") {
|
|
3
|
+
if (!SESSION_ID_COMPONENT_PATTERN.test(sessionId)) {
|
|
4
|
+
throw new Error(`Invalid ${context}: ${sessionId}`);
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export { SESSION_ID_COMPONENT_PATTERN, assertValidSessionIdComponent };
|
|
9
|
+
//# sourceMappingURL=session-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-id.js","sources":["../../src/utils/session-id.ts"],"sourcesContent":[null],"names":[],"mappings":"AAEO,MAAM,4BAA4B,GAAG;SAE5B,6BAA6B,CAC3C,SAAoB,EACpB,OAAO,GAAG,YAAY,EAAA;IAEtB,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;QACjD,MAAM,IAAI,KAAK,CAAC,CAAA,QAAA,EAAW,OAAO,CAAA,EAAA,EAAK,SAAS,CAAA,CAAE,CAAC;IACrD;AACF;;;;"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared validation utilities.
|
|
3
|
+
*/
|
|
4
|
+
import type { SessionStatus } from "../types.js";
|
|
5
|
+
/** Safely parse JSON, returning null on failure. */
|
|
6
|
+
export declare function safeJsonParse<T>(str: string): T | null;
|
|
7
|
+
/** Validate and normalize a status string. */
|
|
8
|
+
export declare function validateStatus(raw: string | undefined): SessionStatus;
|
|
9
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAwBjD,oDAAoD;AACpD,wBAAgB,aAAa,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAMtD;AAED,8CAA8C;AAC9C,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa,CAKrE"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared validation utilities.
|
|
3
|
+
*/
|
|
4
|
+
/** Valid session statuses for validation. */
|
|
5
|
+
const VALID_STATUSES = new Set([
|
|
6
|
+
"spawning",
|
|
7
|
+
"working",
|
|
8
|
+
"detecting",
|
|
9
|
+
"pr_open",
|
|
10
|
+
"ci_failed",
|
|
11
|
+
"review_pending",
|
|
12
|
+
"changes_requested",
|
|
13
|
+
"approved",
|
|
14
|
+
"mergeable",
|
|
15
|
+
"merged",
|
|
16
|
+
"cleanup",
|
|
17
|
+
"needs_input",
|
|
18
|
+
"stuck",
|
|
19
|
+
"errored",
|
|
20
|
+
"killed",
|
|
21
|
+
"idle",
|
|
22
|
+
"done",
|
|
23
|
+
"terminated",
|
|
24
|
+
]);
|
|
25
|
+
/** Safely parse JSON, returning null on failure. */
|
|
26
|
+
function safeJsonParse(str) {
|
|
27
|
+
try {
|
|
28
|
+
return JSON.parse(str);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** Validate and normalize a status string. */
|
|
35
|
+
function validateStatus(raw) {
|
|
36
|
+
// Bash scripts write "starting" — treat as "working"
|
|
37
|
+
if (raw === "starting")
|
|
38
|
+
return "working";
|
|
39
|
+
if (raw && VALID_STATUSES.has(raw))
|
|
40
|
+
return raw;
|
|
41
|
+
return "spawning";
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export { safeJsonParse, validateStatus };
|
|
45
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sources":["../../src/utils/validation.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;;AAEG;AAIH;AACA,MAAM,cAAc,GAAwB,IAAI,GAAG,CAAC;IAClD,UAAU;IACV,SAAS;IACT,WAAW;IACX,SAAS;IACT,WAAW;IACX,gBAAgB;IAChB,mBAAmB;IACnB,UAAU;IACV,WAAW;IACX,QAAQ;IACR,SAAS;IACT,aAAa;IACb,OAAO;IACP,SAAS;IACT,QAAQ;IACR,MAAM;IACN,MAAM;IACN,YAAY;AACb,CAAA,CAAC;AAEF;AACM,SAAU,aAAa,CAAI,GAAW,EAAA;AAC1C,IAAA,IAAI;AACF,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM;IAC7B;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,IAAI;IACb;AACF;AAEA;AACM,SAAU,cAAc,CAAC,GAAuB,EAAA;;IAEpD,IAAI,GAAG,KAAK,UAAU;AAAE,QAAA,OAAO,SAAS;AACxC,IAAA,IAAI,GAAG,IAAI,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC;AAAE,QAAA,OAAO,GAAoB;AAC/D,IAAA,OAAO,UAAU;AACnB;;;;"}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utility functions for agent-orchestrator plugins.
|
|
3
|
+
*/
|
|
4
|
+
import type { OrchestratorConfig } from "./types.js";
|
|
5
|
+
/**
|
|
6
|
+
* Shell-safe escaping for the platform's default shell.
|
|
7
|
+
*
|
|
8
|
+
* - Unix (/bin/sh): wraps in single quotes, escapes embedded ' as '\''
|
|
9
|
+
* - Windows (PowerShell): wraps in single quotes, escapes embedded ' as ''
|
|
10
|
+
*/
|
|
11
|
+
export declare function shellEscape(arg: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Escape a string for safe interpolation inside AppleScript double-quoted strings.
|
|
14
|
+
* Handles backslashes and double quotes which would otherwise break or inject.
|
|
15
|
+
*/
|
|
16
|
+
export declare function escapeAppleScript(s: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* Validate that a URL starts with http:// or https://.
|
|
19
|
+
* Throws with a descriptive error including the plugin label if invalid.
|
|
20
|
+
*/
|
|
21
|
+
export declare function validateUrl(url: string, label: string): void;
|
|
22
|
+
/**
|
|
23
|
+
* Conservative subset of git `check-ref-format` rules for branch-like names.
|
|
24
|
+
* Used before passing tracker-supplied names to `git worktree` / `checkout -b`.
|
|
25
|
+
*
|
|
26
|
+
* Slashes are allowed (e.g. `feature/foo-bar`).
|
|
27
|
+
*/
|
|
28
|
+
export declare function isGitBranchNameSafe(name: string): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Returns true if an HTTP status code should be retried.
|
|
31
|
+
* Retry only 429 (rate-limit) and 5xx (server) failures.
|
|
32
|
+
*/
|
|
33
|
+
export declare function isRetryableHttpStatus(status: number): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Normalize retry config from plugin config with sane defaults.
|
|
36
|
+
*/
|
|
37
|
+
export declare function normalizeRetryConfig(config: Record<string, unknown> | undefined, defaults?: {
|
|
38
|
+
retries: number;
|
|
39
|
+
retryDelayMs: number;
|
|
40
|
+
}): {
|
|
41
|
+
retries: number;
|
|
42
|
+
retryDelayMs: number;
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Read the last entry from a JSONL file.
|
|
46
|
+
* Reads backwards from end of file — pure Node.js, no external binaries.
|
|
47
|
+
*
|
|
48
|
+
* @param filePath - Path to the JSONL file
|
|
49
|
+
* @returns Object containing the last entry's `type`, nested `payload.type` (Codex shape),
|
|
50
|
+
* top-level `subtype` and `level` (Claude `system`-entry shape), and the file mtime.
|
|
51
|
+
* Returns null if the file is empty or unreadable.
|
|
52
|
+
*/
|
|
53
|
+
export declare function readLastJsonlEntry(filePath: string): Promise<{
|
|
54
|
+
lastType: string | null;
|
|
55
|
+
payloadType: string | null;
|
|
56
|
+
lastSubtype: string | null;
|
|
57
|
+
lastLevel: string | null;
|
|
58
|
+
modifiedAt: Date;
|
|
59
|
+
} | null>;
|
|
60
|
+
/**
|
|
61
|
+
* Given a session ID and the orchestrator config, find which project it belongs
|
|
62
|
+
* to by matching session prefixes.
|
|
63
|
+
*/
|
|
64
|
+
export declare function resolveProjectIdForSessionId(config: OrchestratorConfig, sessionId: string): string | undefined;
|
|
65
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAGrD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAO/C;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAI5D;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAgBzD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC3C,QAAQ,GAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAuC,GACvF;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAQ3C;AAkDD;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAClE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,IAAI,CAAC;CAClB,GAAG,IAAI,CAAC,CA8BR;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,kBAAkB,EAC1B,SAAS,EAAE,MAAM,GAChB,MAAM,GAAG,SAAS,CAQpB"}
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { stat, open } from 'node:fs/promises';
|
|
2
|
+
import { isWindows } from './platform.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Shared utility functions for agent-orchestrator plugins.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Shell-safe escaping for the platform's default shell.
|
|
9
|
+
*
|
|
10
|
+
* - Unix (/bin/sh): wraps in single quotes, escapes embedded ' as '\''
|
|
11
|
+
* - Windows (PowerShell): wraps in single quotes, escapes embedded ' as ''
|
|
12
|
+
*/
|
|
13
|
+
function shellEscape(arg) {
|
|
14
|
+
if (isWindows()) {
|
|
15
|
+
// PowerShell: single-quoted strings use '' for embedded single quotes
|
|
16
|
+
return "'" + arg.replace(/'/g, "''") + "'";
|
|
17
|
+
}
|
|
18
|
+
// POSIX sh: single-quoted strings use '\'' for embedded single quotes
|
|
19
|
+
return "'" + arg.replace(/'/g, "'\\''") + "'";
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Escape a string for safe interpolation inside AppleScript double-quoted strings.
|
|
23
|
+
* Handles backslashes and double quotes which would otherwise break or inject.
|
|
24
|
+
*/
|
|
25
|
+
function escapeAppleScript(s) {
|
|
26
|
+
return s.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Validate that a URL starts with http:// or https://.
|
|
30
|
+
* Throws with a descriptive error including the plugin label if invalid.
|
|
31
|
+
*/
|
|
32
|
+
function validateUrl(url, label) {
|
|
33
|
+
if (!url.startsWith("https://") && !url.startsWith("http://")) {
|
|
34
|
+
throw new Error(`[${label}] Invalid url: must be http(s), got "${url}"`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Conservative subset of git `check-ref-format` rules for branch-like names.
|
|
39
|
+
* Used before passing tracker-supplied names to `git worktree` / `checkout -b`.
|
|
40
|
+
*
|
|
41
|
+
* Slashes are allowed (e.g. `feature/foo-bar`).
|
|
42
|
+
*/
|
|
43
|
+
function isGitBranchNameSafe(name) {
|
|
44
|
+
if (!name)
|
|
45
|
+
return false;
|
|
46
|
+
if (name === "@" || name.startsWith(".") || name.endsWith(".") || name.endsWith("/"))
|
|
47
|
+
return false;
|
|
48
|
+
if (name.endsWith(".lock"))
|
|
49
|
+
return false;
|
|
50
|
+
if (name.includes(".."))
|
|
51
|
+
return false;
|
|
52
|
+
if (name.includes("//"))
|
|
53
|
+
return false;
|
|
54
|
+
if (name.includes("/."))
|
|
55
|
+
return false;
|
|
56
|
+
if (name.includes("@{"))
|
|
57
|
+
return false;
|
|
58
|
+
if (name.startsWith("/"))
|
|
59
|
+
return false;
|
|
60
|
+
for (let i = 0; i < name.length; i++) {
|
|
61
|
+
const c = name.charCodeAt(i);
|
|
62
|
+
if (c <= 0x1f || c === 0x7f)
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
// Space and git-forbidden punctuation (see git-check-ref-format)
|
|
66
|
+
if (/[\s~^:?*[\\]/.test(name))
|
|
67
|
+
return false;
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Returns true if an HTTP status code should be retried.
|
|
72
|
+
* Retry only 429 (rate-limit) and 5xx (server) failures.
|
|
73
|
+
*/
|
|
74
|
+
function isRetryableHttpStatus(status) {
|
|
75
|
+
return status === 429 || status >= 500;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Normalize retry config from plugin config with sane defaults.
|
|
79
|
+
*/
|
|
80
|
+
function normalizeRetryConfig(config, defaults = { retries: 2, retryDelayMs: 1000 }) {
|
|
81
|
+
const rawRetries = config?.retries;
|
|
82
|
+
const rawDelay = config?.retryDelayMs;
|
|
83
|
+
const retries = Number.isFinite(rawRetries) ? Math.max(0, rawRetries ?? 0) : defaults.retries;
|
|
84
|
+
const retryDelayMs = Number.isFinite(rawDelay) && (rawDelay ?? -1) >= 0
|
|
85
|
+
? rawDelay
|
|
86
|
+
: defaults.retryDelayMs;
|
|
87
|
+
return { retries, retryDelayMs };
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Read the last line from a file by reading backwards from the end.
|
|
91
|
+
* Pure Node.js — no external binaries. Handles any file size.
|
|
92
|
+
*/
|
|
93
|
+
async function readLastLine(filePath) {
|
|
94
|
+
const CHUNK = 4096;
|
|
95
|
+
const fh = await open(filePath, "r");
|
|
96
|
+
try {
|
|
97
|
+
const { size } = await fh.stat();
|
|
98
|
+
if (size === 0)
|
|
99
|
+
return null;
|
|
100
|
+
// Read backwards in chunks, accumulating raw buffers to avoid
|
|
101
|
+
// corrupting multi-byte UTF-8 characters at chunk boundaries.
|
|
102
|
+
const chunks = [];
|
|
103
|
+
let totalBytes = 0;
|
|
104
|
+
let pos = size;
|
|
105
|
+
while (pos > 0) {
|
|
106
|
+
const readSize = Math.min(CHUNK, pos);
|
|
107
|
+
pos -= readSize;
|
|
108
|
+
const chunk = Buffer.alloc(readSize);
|
|
109
|
+
await fh.read(chunk, 0, readSize, pos);
|
|
110
|
+
chunks.unshift(chunk);
|
|
111
|
+
totalBytes += readSize;
|
|
112
|
+
// Convert all accumulated bytes to string at once (safe for multi-byte)
|
|
113
|
+
const tail = Buffer.concat(chunks, totalBytes).toString("utf-8");
|
|
114
|
+
// Find the last non-empty line
|
|
115
|
+
const lines = tail.split("\n");
|
|
116
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
117
|
+
const line = lines[i].trim();
|
|
118
|
+
if (line) {
|
|
119
|
+
// If i > 0, we have a complete line (there's a newline before it)
|
|
120
|
+
// If i === 0 and pos === 0, we've read the whole file — line is complete
|
|
121
|
+
// If i === 0 and pos > 0, the line may be truncated — keep reading
|
|
122
|
+
if (i > 0 || pos === 0)
|
|
123
|
+
return line;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
const tail = Buffer.concat(chunks, totalBytes).toString("utf-8");
|
|
128
|
+
return tail.trim() || null;
|
|
129
|
+
}
|
|
130
|
+
finally {
|
|
131
|
+
await fh.close();
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Read the last entry from a JSONL file.
|
|
136
|
+
* Reads backwards from end of file — pure Node.js, no external binaries.
|
|
137
|
+
*
|
|
138
|
+
* @param filePath - Path to the JSONL file
|
|
139
|
+
* @returns Object containing the last entry's `type`, nested `payload.type` (Codex shape),
|
|
140
|
+
* top-level `subtype` and `level` (Claude `system`-entry shape), and the file mtime.
|
|
141
|
+
* Returns null if the file is empty or unreadable.
|
|
142
|
+
*/
|
|
143
|
+
async function readLastJsonlEntry(filePath) {
|
|
144
|
+
try {
|
|
145
|
+
const [line, fileStat] = await Promise.all([readLastLine(filePath), stat(filePath)]);
|
|
146
|
+
if (!line)
|
|
147
|
+
return null;
|
|
148
|
+
const parsed = JSON.parse(line);
|
|
149
|
+
if (typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)) {
|
|
150
|
+
const obj = parsed;
|
|
151
|
+
const lastType = typeof obj.type === "string" ? obj.type : null;
|
|
152
|
+
const lastSubtype = typeof obj.subtype === "string" ? obj.subtype : null;
|
|
153
|
+
const lastLevel = typeof obj.level === "string" ? obj.level : null;
|
|
154
|
+
let payloadType = null;
|
|
155
|
+
if (typeof obj.payload === "object" && obj.payload !== null && !Array.isArray(obj.payload)) {
|
|
156
|
+
const payload = obj.payload;
|
|
157
|
+
if (typeof payload.type === "string")
|
|
158
|
+
payloadType = payload.type;
|
|
159
|
+
}
|
|
160
|
+
return { lastType, payloadType, lastSubtype, lastLevel, modifiedAt: fileStat.mtime };
|
|
161
|
+
}
|
|
162
|
+
return {
|
|
163
|
+
lastType: null,
|
|
164
|
+
payloadType: null,
|
|
165
|
+
lastSubtype: null,
|
|
166
|
+
lastLevel: null,
|
|
167
|
+
modifiedAt: fileStat.mtime,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Given a session ID and the orchestrator config, find which project it belongs
|
|
176
|
+
* to by matching session prefixes.
|
|
177
|
+
*/
|
|
178
|
+
function resolveProjectIdForSessionId(config, sessionId) {
|
|
179
|
+
for (const [projectId, project] of Object.entries(config.projects)) {
|
|
180
|
+
const prefix = project.sessionPrefix;
|
|
181
|
+
if (sessionId === prefix || sessionId.startsWith(`${prefix}-`)) {
|
|
182
|
+
return projectId;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return undefined;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
export { escapeAppleScript, isGitBranchNameSafe, isRetryableHttpStatus, normalizeRetryConfig, readLastJsonlEntry, resolveProjectIdForSessionId, shellEscape, validateUrl };
|
|
189
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../src/utils.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Channel-aware semver comparison for the AO release pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Lives in core (not the CLI) because both the CLI's update-check and the
|
|
5
|
+
* dashboard's `/api/version` route compare versions and must stay in lockstep.
|
|
6
|
+
* Keeping the implementation here means there is exactly one tested copy.
|
|
7
|
+
*
|
|
8
|
+
* Spec: release-process.html §07 (Auto-update mechanics).
|
|
9
|
+
*/
|
|
10
|
+
import type { UpdateChannel } from "./global-config.js";
|
|
11
|
+
export declare function isVersionOutdatedForChannel(current: string, latest: string, channel: UpdateChannel): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Returns true if `current` is an older version than `latest`.
|
|
14
|
+
*
|
|
15
|
+
* Compares numeric major/minor/patch first, then handles prereleases:
|
|
16
|
+
* - When base versions are equal:
|
|
17
|
+
* prerelease vs stable → prerelease is OLDER (`0.5.0-nightly < 0.5.0`)
|
|
18
|
+
* prerelease vs prerelease → compare the prerelease identifiers
|
|
19
|
+
* segment-by-segment (numeric or lexical),
|
|
20
|
+
* so `0.5.0-nightly-abc < 0.5.0-nightly-def`
|
|
21
|
+
* works for SHA-suffixed snapshots.
|
|
22
|
+
*
|
|
23
|
+
* Channel-aware comparison happens at the *cache layer* (callers only cache
|
|
24
|
+
* the tag they're tracking), so this function just answers: is current < latest?
|
|
25
|
+
*/
|
|
26
|
+
export declare function isVersionOutdated(current: string, latest: string): boolean;
|
|
27
|
+
//# sourceMappingURL=version-compare.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-compare.d.ts","sourceRoot":"","sources":["../src/version-compare.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,aAAa,GACrB,OAAO,CAYT;AAUD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAiB1E"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Channel-aware semver comparison for the AO release pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Lives in core (not the CLI) because both the CLI's update-check and the
|
|
5
|
+
* dashboard's `/api/version` route compare versions and must stay in lockstep.
|
|
6
|
+
* Keeping the implementation here means there is exactly one tested copy.
|
|
7
|
+
*
|
|
8
|
+
* Spec: release-process.html §07 (Auto-update mechanics).
|
|
9
|
+
*/
|
|
10
|
+
function isVersionOutdatedForChannel(current, latest, channel) {
|
|
11
|
+
if (channel === "nightly") {
|
|
12
|
+
const currentParsed = parseVersion(current);
|
|
13
|
+
const latestParsed = parseVersion(latest);
|
|
14
|
+
if (isNightlyPrerelease(currentParsed.prerelease) &&
|
|
15
|
+
isNightlyPrerelease(latestParsed.prerelease)) {
|
|
16
|
+
return current !== latest;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return isVersionOutdated(current, latest);
|
|
20
|
+
}
|
|
21
|
+
function isNightlyPrerelease(prerelease) {
|
|
22
|
+
return (prerelease === "nightly" ||
|
|
23
|
+
prerelease?.startsWith("nightly-") === true ||
|
|
24
|
+
prerelease?.startsWith("nightly.") === true);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Returns true if `current` is an older version than `latest`.
|
|
28
|
+
*
|
|
29
|
+
* Compares numeric major/minor/patch first, then handles prereleases:
|
|
30
|
+
* - When base versions are equal:
|
|
31
|
+
* prerelease vs stable → prerelease is OLDER (`0.5.0-nightly < 0.5.0`)
|
|
32
|
+
* prerelease vs prerelease → compare the prerelease identifiers
|
|
33
|
+
* segment-by-segment (numeric or lexical),
|
|
34
|
+
* so `0.5.0-nightly-abc < 0.5.0-nightly-def`
|
|
35
|
+
* works for SHA-suffixed snapshots.
|
|
36
|
+
*
|
|
37
|
+
* Channel-aware comparison happens at the *cache layer* (callers only cache
|
|
38
|
+
* the tag they're tracking), so this function just answers: is current < latest?
|
|
39
|
+
*/
|
|
40
|
+
function isVersionOutdated(current, latest) {
|
|
41
|
+
const c = parseVersion(current);
|
|
42
|
+
const l = parseVersion(latest);
|
|
43
|
+
for (let i = 0; i < 3; i++) {
|
|
44
|
+
const cp = c.parts[i] ?? 0;
|
|
45
|
+
const lp = l.parts[i] ?? 0;
|
|
46
|
+
if (Number.isNaN(cp) || Number.isNaN(lp))
|
|
47
|
+
return false;
|
|
48
|
+
if (cp < lp)
|
|
49
|
+
return true;
|
|
50
|
+
if (cp > lp)
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
// Numeric base equal — compare prerelease tags.
|
|
54
|
+
if (!c.prerelease && !l.prerelease)
|
|
55
|
+
return false;
|
|
56
|
+
if (c.prerelease && !l.prerelease)
|
|
57
|
+
return true; // prerelease < stable
|
|
58
|
+
if (!c.prerelease && l.prerelease)
|
|
59
|
+
return false; // stable > prerelease
|
|
60
|
+
return comparePrereleaseSegments(c.prerelease ?? "", l.prerelease ?? "") < 0;
|
|
61
|
+
}
|
|
62
|
+
function parseVersion(version) {
|
|
63
|
+
const [base, ...rest] = version.split("-");
|
|
64
|
+
const prerelease = rest.length > 0 ? rest.join("-") : undefined;
|
|
65
|
+
return {
|
|
66
|
+
parts: (base ?? "").split(".").map(Number),
|
|
67
|
+
prerelease,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Compare two prerelease identifiers segment-by-segment.
|
|
72
|
+
* Returns -1 if a < b, 0 if equal, 1 if a > b.
|
|
73
|
+
*
|
|
74
|
+
* Rules:
|
|
75
|
+
* - Numeric segments compare numerically (`rc.1` < `rc.2`).
|
|
76
|
+
* - Numeric < non-numeric (`0.5.0-1` < `0.5.0-alpha`).
|
|
77
|
+
* - Longer prerelease wins when all shared segments are equal
|
|
78
|
+
* (`0.5.0-nightly` < `0.5.0-nightly.1`).
|
|
79
|
+
* - **Differing non-numeric segments → treat current as older.** Git SHAs
|
|
80
|
+
* are uniformly random hex, so a lexical compare (`'f' < '0'`) gives the
|
|
81
|
+
* wrong answer ~50% of the time for snapshot tags like `nightly-<sha>`.
|
|
82
|
+
* The cache layer always carries the registry's CURRENT dist-tag, so a
|
|
83
|
+
* mismatch here means the installed copy is behind by construction —
|
|
84
|
+
* return -1 unconditionally for non-numeric differences so the update
|
|
85
|
+
* banner surfaces. (Caveat: this would over-fire if a user manually
|
|
86
|
+
* installed `0.5.0-beta` when the registry only has `0.5.0-alpha`. AO's
|
|
87
|
+
* release pipeline only emits SHA-suffixed nightly prereleases, so the
|
|
88
|
+
* scenario doesn't occur in practice.)
|
|
89
|
+
*/
|
|
90
|
+
function comparePrereleaseSegments(a, b) {
|
|
91
|
+
const aSeg = a.split(".");
|
|
92
|
+
const bSeg = b.split(".");
|
|
93
|
+
const max = Math.max(aSeg.length, bSeg.length);
|
|
94
|
+
for (let i = 0; i < max; i++) {
|
|
95
|
+
const ax = aSeg[i];
|
|
96
|
+
const bx = bSeg[i];
|
|
97
|
+
if (ax === undefined)
|
|
98
|
+
return -1;
|
|
99
|
+
if (bx === undefined)
|
|
100
|
+
return 1;
|
|
101
|
+
const aNum = /^\d+$/.test(ax);
|
|
102
|
+
const bNum = /^\d+$/.test(bx);
|
|
103
|
+
if (aNum && bNum) {
|
|
104
|
+
const an = Number(ax);
|
|
105
|
+
const bn = Number(bx);
|
|
106
|
+
if (an !== bn)
|
|
107
|
+
return an < bn ? -1 : 1;
|
|
108
|
+
}
|
|
109
|
+
else if (aNum !== bNum) {
|
|
110
|
+
return aNum ? -1 : 1; // numeric < non-numeric
|
|
111
|
+
}
|
|
112
|
+
else if (ax !== bx) {
|
|
113
|
+
// Both non-numeric and differ. Cannot reliably order — return "older."
|
|
114
|
+
return -1;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return 0;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export { isVersionOutdated, isVersionOutdatedForChannel };
|
|
121
|
+
//# sourceMappingURL=version-compare.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-compare.js","sources":["../src/version-compare.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface WindowsPtyHostEntry {
|
|
2
|
+
sessionId: string;
|
|
3
|
+
ptyHostPid: number;
|
|
4
|
+
pipePath: string;
|
|
5
|
+
registeredAt: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Add (or replace) an entry for a freshly-spawned pty-host.
|
|
9
|
+
* If a stale entry for the same `sessionId` exists, it's overwritten.
|
|
10
|
+
*/
|
|
11
|
+
export declare function registerWindowsPtyHost(entry: Omit<WindowsPtyHostEntry, "registeredAt">): void;
|
|
12
|
+
/**
|
|
13
|
+
* Remove an entry by `sessionId`. No-op if absent.
|
|
14
|
+
*/
|
|
15
|
+
export declare function unregisterWindowsPtyHost(sessionId: string): void;
|
|
16
|
+
/**
|
|
17
|
+
* Read all live entries, auto-pruning entries whose PID is no longer alive.
|
|
18
|
+
* The on-disk file is rewritten if any entries were pruned.
|
|
19
|
+
*/
|
|
20
|
+
export declare function getWindowsPtyHosts(): WindowsPtyHostEntry[];
|
|
21
|
+
/**
|
|
22
|
+
* Best-effort: delete the entire registry file. Used for tests and recovery.
|
|
23
|
+
*/
|
|
24
|
+
export declare function clearWindowsPtyHostRegistry(): void;
|
|
25
|
+
/** Exported for tests. */
|
|
26
|
+
export declare function __getWindowsPtyRegistryFile(): string;
|
|
27
|
+
//# sourceMappingURL=windows-pty-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"windows-pty-registry.d.ts","sourceRoot":"","sources":["../src/windows-pty-registry.ts"],"names":[],"mappings":"AAyBA,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAiDD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,IAAI,CAAC,mBAAmB,EAAE,cAAc,CAAC,GAAG,IAAI,CAI7F;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAKhE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,mBAAmB,EAAE,CAK1D;AAED;;GAEG;AACH,wBAAgB,2BAA2B,IAAI,IAAI,CAElD;AAED,0BAA0B;AAC1B,wBAAgB,2BAA2B,IAAI,MAAM,CAEpD"}
|