cueline 0.2.1 → 0.3.0
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/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/CHANGELOG.md +58 -0
- package/README.ja.md +12 -12
- package/README.ko.md +12 -12
- package/README.md +12 -12
- package/README.zh-CN.md +12 -12
- package/README.zh-TW.md +12 -12
- package/dist/src/api-controller-handoff.js +1 -1
- package/dist/src/api-controller-handoff.js.map +1 -1
- package/dist/src/api-run-prune.d.ts +41 -0
- package/dist/src/api-run-prune.js +218 -0
- package/dist/src/api-run-prune.js.map +1 -0
- package/dist/src/api-runtime-lifecycle.js +4 -4
- package/dist/src/api-runtime-lifecycle.js.map +1 -1
- package/dist/src/api.d.ts +3 -0
- package/dist/src/api.js +3 -0
- package/dist/src/api.js.map +1 -1
- package/dist/src/cli/health-commands.js +35 -0
- package/dist/src/cli/health-commands.js.map +1 -1
- package/dist/src/cli/main.js +95 -3
- package/dist/src/cli/main.js.map +1 -1
- package/dist/src/cli/observation-commands.js +94 -1
- package/dist/src/cli/observation-commands.js.map +1 -1
- package/dist/src/core/controller-command-execution.d.ts +1 -1
- package/dist/src/core/controller-command-execution.js +7 -7
- package/dist/src/core/controller-command-execution.js.map +1 -1
- package/dist/src/core/controller-evidence.d.ts +1 -0
- package/dist/src/core/controller-evidence.js +20 -0
- package/dist/src/core/controller-evidence.js.map +1 -1
- package/dist/src/core/controller-loop.js +11 -7
- package/dist/src/core/controller-loop.js.map +1 -1
- package/dist/src/core/controller-turn.d.ts +1 -1
- package/dist/src/core/controller-turn.js +16 -8
- package/dist/src/core/controller-turn.js.map +1 -1
- package/dist/src/diagnostics/offline-self-test.d.ts +23 -0
- package/dist/src/diagnostics/offline-self-test.js +163 -0
- package/dist/src/diagnostics/offline-self-test.js.map +1 -0
- package/dist/src/diagnostics/secret-audit.d.ts +25 -0
- package/dist/src/diagnostics/secret-audit.js +114 -0
- package/dist/src/diagnostics/secret-audit.js.map +1 -0
- package/dist/src/diagnostics/upgrade-preflight.d.ts +41 -0
- package/dist/src/diagnostics/upgrade-preflight.js +182 -0
- package/dist/src/diagnostics/upgrade-preflight.js.map +1 -0
- package/dist/src/observation/run-bundle.d.ts +27 -0
- package/dist/src/observation/run-bundle.js +55 -0
- package/dist/src/observation/run-bundle.js.map +1 -0
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/docs/1.0/ideas/machine-output-contracts.md +47 -0
- package/docs/1.0/ideas/node26-contract.md +50 -0
- package/docs/1.0/ideas/offline-self-test.md +52 -0
- package/docs/1.0/ideas/upgrade-preflight.md +46 -0
- package/docs/compatibility.md +5 -5
- package/docs/runner-contract.md +1 -1
- package/package.json +12 -2
- package/schemas/cli-doctor.schema.json +77 -0
- package/schemas/cli-routing-explain.schema.json +88 -0
- package/schemas/cli-routing.schema.json +65 -0
- package/schemas/cli-run-audit-secrets.schema.json +72 -0
- package/schemas/cli-run-export.schema.json +410 -0
- package/schemas/cli-runs-prune.schema.json +93 -0
- package/scripts/artifact-integrity.mjs +114 -0
- package/scripts/release-check.mjs +118 -0
- package/scripts/validate-cli-contracts.mjs +59 -0
- package/scripts/validate-doc-versions.mjs +79 -0
- package/scripts/validate-node-support.mjs +118 -0
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { mkdtemp, rm } from "node:fs/promises";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { runCueLine } from "../api.js";
|
|
5
|
+
import { verifyCueLineRun } from "../api-run-verification.js";
|
|
6
|
+
import { CueLineError } from "../core/errors.js";
|
|
7
|
+
import { CUELINE_VERSION } from "../version.js";
|
|
8
|
+
const EMPTY_CHECKS = {
|
|
9
|
+
controllerRounds: 0,
|
|
10
|
+
completedJobs: 0,
|
|
11
|
+
finalDelivery: false,
|
|
12
|
+
durableRunVerification: false,
|
|
13
|
+
};
|
|
14
|
+
function controlReply(input, command) {
|
|
15
|
+
return {
|
|
16
|
+
text: `<CueLineControl>${JSON.stringify({
|
|
17
|
+
protocol: "cueline/0.1",
|
|
18
|
+
run_id: input.runId,
|
|
19
|
+
round: input.round,
|
|
20
|
+
request_id: input.requestId,
|
|
21
|
+
...command,
|
|
22
|
+
})}</CueLineControl>`,
|
|
23
|
+
conversationUrl: "https://chatgpt.com/c/cueline-offline-self-test",
|
|
24
|
+
model: {
|
|
25
|
+
provider: "chatgpt",
|
|
26
|
+
selectedLabel: "Pro",
|
|
27
|
+
responseModelSlug: "gpt-5-6-pro",
|
|
28
|
+
source: "composer_and_response",
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
class OfflineController {
|
|
33
|
+
rounds = 0;
|
|
34
|
+
async sendTurn(input) {
|
|
35
|
+
this.rounds += 1;
|
|
36
|
+
if (this.rounds === 1) {
|
|
37
|
+
if (!input.prompt.includes("offline [node-offline-self-test]")) {
|
|
38
|
+
throw new CueLineError("SELF_TEST_ROUTING_PROMPT_MISSING", "The controller prompt did not expose the isolated offline lane.");
|
|
39
|
+
}
|
|
40
|
+
return controlReply(input, {
|
|
41
|
+
action: "dispatch",
|
|
42
|
+
jobs: [
|
|
43
|
+
{
|
|
44
|
+
job_key: "offline-worker",
|
|
45
|
+
lane: "offline",
|
|
46
|
+
mode: "advise",
|
|
47
|
+
task: "CUELINE_OFFLINE_WORKER_OK",
|
|
48
|
+
required: true,
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
if (this.rounds === 2) {
|
|
54
|
+
if (!input.prompt.includes("WORKER:CUELINE_OFFLINE_WORKER_OK")) {
|
|
55
|
+
throw new CueLineError("SELF_TEST_WORKER_EVIDENCE_MISSING", "The controller did not receive the isolated worker evidence.");
|
|
56
|
+
}
|
|
57
|
+
return controlReply(input, {
|
|
58
|
+
action: "complete",
|
|
59
|
+
final_delivery_text: "CUELINE_OFFLINE_SELF_TEST_OK",
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
throw new CueLineError("SELF_TEST_CONTROLLER_ROUNDS_EXCEEDED", "The isolated controller requested an unexpected extra round.");
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function failedReport(code, message) {
|
|
66
|
+
return {
|
|
67
|
+
schema: "cueline-offline-self-test/1",
|
|
68
|
+
version: CUELINE_VERSION,
|
|
69
|
+
status: "failed",
|
|
70
|
+
offline: true,
|
|
71
|
+
checks: { ...EMPTY_CHECKS },
|
|
72
|
+
findings: [{ code, message }],
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Exercises the public controller loop with only an in-memory controller and
|
|
77
|
+
* the current Node executable. All durable state lives below two fresh temp
|
|
78
|
+
* directories and is removed before this function returns.
|
|
79
|
+
*/
|
|
80
|
+
export async function runOfflineSelfTest(environment = process.env) {
|
|
81
|
+
if (environment.CUELINE_DEPTH !== undefined) {
|
|
82
|
+
return failedReport("NESTED_ROUTING_REJECTED", "Offline self-test cannot run from inside another CueLine execution.");
|
|
83
|
+
}
|
|
84
|
+
let home;
|
|
85
|
+
let workspace;
|
|
86
|
+
try {
|
|
87
|
+
home = await mkdtemp(path.join(tmpdir(), "cueline-offline-self-test-home-"));
|
|
88
|
+
workspace = await mkdtemp(path.join(tmpdir(), "cueline-offline-self-test-workspace-"));
|
|
89
|
+
const controller = new OfflineController();
|
|
90
|
+
const routingConfig = {
|
|
91
|
+
version: 1,
|
|
92
|
+
lanes: {
|
|
93
|
+
offline: {
|
|
94
|
+
enabled: true,
|
|
95
|
+
candidates: [
|
|
96
|
+
{
|
|
97
|
+
id: "node-offline-self-test",
|
|
98
|
+
argv: [
|
|
99
|
+
process.execPath,
|
|
100
|
+
"-e",
|
|
101
|
+
"process.stdin.setEncoding('utf8'); let data=''; process.stdin.on('data', chunk => data += chunk); process.stdin.on('end', () => process.stdout.write('WORKER:' + data));",
|
|
102
|
+
],
|
|
103
|
+
task_input: "stdin",
|
|
104
|
+
},
|
|
105
|
+
],
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
const runId = `run_offline_self_test_${process.pid}_${Date.now()}`;
|
|
110
|
+
const result = await runCueLine({
|
|
111
|
+
executor: "process",
|
|
112
|
+
allowProcessExecution: true,
|
|
113
|
+
request: "Verify the installed CueLine controller loop offline.",
|
|
114
|
+
runId,
|
|
115
|
+
home,
|
|
116
|
+
cwd: workspace,
|
|
117
|
+
browser: controller,
|
|
118
|
+
routingConfig,
|
|
119
|
+
environment: { ...environment },
|
|
120
|
+
maxRounds: 2,
|
|
121
|
+
});
|
|
122
|
+
const verification = await verifyCueLineRun(runId, { home, environment });
|
|
123
|
+
const completedJobs = Object.values(result.state.jobs).filter((job) => job.runtime?.phase === "completed").length;
|
|
124
|
+
const checks = {
|
|
125
|
+
controllerRounds: controller.rounds,
|
|
126
|
+
completedJobs,
|
|
127
|
+
finalDelivery: result.status === "complete" &&
|
|
128
|
+
result.finalDeliveryText === "CUELINE_OFFLINE_SELF_TEST_OK",
|
|
129
|
+
durableRunVerification: verification.outcome === "verified",
|
|
130
|
+
};
|
|
131
|
+
const ok = checks.controllerRounds === 2 &&
|
|
132
|
+
checks.completedJobs === 1 &&
|
|
133
|
+
checks.finalDelivery &&
|
|
134
|
+
checks.durableRunVerification;
|
|
135
|
+
return {
|
|
136
|
+
schema: "cueline-offline-self-test/1",
|
|
137
|
+
version: CUELINE_VERSION,
|
|
138
|
+
status: ok ? "ok" : "failed",
|
|
139
|
+
offline: true,
|
|
140
|
+
checks,
|
|
141
|
+
findings: ok
|
|
142
|
+
? []
|
|
143
|
+
: [
|
|
144
|
+
{
|
|
145
|
+
code: "SELF_TEST_INVARIANT_FAILED",
|
|
146
|
+
message: "One or more isolated controller-loop invariants did not pass.",
|
|
147
|
+
},
|
|
148
|
+
],
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
return failedReport(error instanceof CueLineError ? error.code : "SELF_TEST_EXECUTION_FAILED", error instanceof CueLineError
|
|
153
|
+
? error.message
|
|
154
|
+
: "The isolated controller loop did not complete.");
|
|
155
|
+
}
|
|
156
|
+
finally {
|
|
157
|
+
await Promise.all([
|
|
158
|
+
...(home === undefined ? [] : [rm(home, { recursive: true, force: true })]),
|
|
159
|
+
...(workspace === undefined ? [] : [rm(workspace, { recursive: true, force: true })]),
|
|
160
|
+
]);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=offline-self-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offline-self-test.js","sourceRoot":"","sources":["../../../src/diagnostics/offline-self-test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { CueLineRuntimeOptions } from "../api-contracts.js";
|
|
2
|
+
export declare const SECRET_AUDIT_PROTOCOL = "cueline-secret-audit/0.1";
|
|
3
|
+
export type SecretFindingKind = "aws_access_key_id" | "github_token" | "slack_token" | "anthropic_api_key" | "openai_api_key" | "google_api_key" | "jwt" | "private_key_block" | "bearer_token" | "credential_assignment";
|
|
4
|
+
export interface CueLineSecretFinding {
|
|
5
|
+
kind: SecretFindingKind;
|
|
6
|
+
sequence: number;
|
|
7
|
+
eventType: string;
|
|
8
|
+
path: string;
|
|
9
|
+
matchLength: number;
|
|
10
|
+
maskedPreview: string;
|
|
11
|
+
}
|
|
12
|
+
export interface CueLineSecretAuditReport {
|
|
13
|
+
protocol: typeof SECRET_AUDIT_PROTOCOL;
|
|
14
|
+
runId: string;
|
|
15
|
+
scannedEvents: number;
|
|
16
|
+
scannedFields: number;
|
|
17
|
+
findings: CueLineSecretFinding[];
|
|
18
|
+
clean: boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Read-only sweep of a run's durable events for secret-shaped strings.
|
|
22
|
+
* The report never contains the matched bytes; each finding carries only
|
|
23
|
+
* the kind, location, length, and a four-character masked preview.
|
|
24
|
+
*/
|
|
25
|
+
export declare function auditCueLineRunSecrets(runId: string, options?: Pick<CueLineRuntimeOptions, "home" | "environment">): Promise<CueLineSecretAuditReport>;
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { CueLineError } from "../core/errors.js";
|
|
2
|
+
import { runtimeEnvironment } from "../core/runtime.js";
|
|
3
|
+
import { defaultCueLineHome } from "../state/paths.js";
|
|
4
|
+
import { readAuthoritativeRunEvents } from "../state/store.js";
|
|
5
|
+
export const SECRET_AUDIT_PROTOCOL = "cueline-secret-audit/0.1";
|
|
6
|
+
// Order matters: the first matching detector claims the span, so the more
|
|
7
|
+
// specific prefixes (sk-ant-) must run before their generic parents (sk-).
|
|
8
|
+
const DETECTORS = [
|
|
9
|
+
{ kind: "private_key_block", pattern: /-----BEGIN [A-Z ]*PRIVATE KEY-----/g },
|
|
10
|
+
{ kind: "aws_access_key_id", pattern: /\bAKIA[0-9A-Z]{16}\b/g },
|
|
11
|
+
{
|
|
12
|
+
kind: "github_token",
|
|
13
|
+
pattern: /\b(?:gh[pousr]_[A-Za-z0-9]{36,}|github_pat_[A-Za-z0-9_]{22,})\b/g,
|
|
14
|
+
},
|
|
15
|
+
{ kind: "slack_token", pattern: /\bxox[baprs]-[A-Za-z0-9-]{10,}\b/g },
|
|
16
|
+
{ kind: "anthropic_api_key", pattern: /\bsk-ant-[A-Za-z0-9_-]{20,}\b/g },
|
|
17
|
+
{ kind: "openai_api_key", pattern: /\bsk-(?!ant-)[A-Za-z0-9_-]{20,}\b/g },
|
|
18
|
+
{ kind: "google_api_key", pattern: /\bAIza[0-9A-Za-z_-]{35}\b/g },
|
|
19
|
+
{
|
|
20
|
+
kind: "jwt",
|
|
21
|
+
pattern: /\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{5,}\b/g,
|
|
22
|
+
},
|
|
23
|
+
{ kind: "bearer_token", pattern: /\bBearer +[A-Za-z0-9._~+/=-]{20,}\b/g },
|
|
24
|
+
{
|
|
25
|
+
kind: "credential_assignment",
|
|
26
|
+
pattern: /\b(?:api[_-]?key|secret|token|password|passwd|credential)s?\b['"]? *[:=] *['"]?[A-Za-z0-9_/+.=-]{12,}/gi,
|
|
27
|
+
},
|
|
28
|
+
];
|
|
29
|
+
function maskedPreview(match) {
|
|
30
|
+
const visible = match.slice(0, 4);
|
|
31
|
+
return `${visible}…(${match.length} chars)`;
|
|
32
|
+
}
|
|
33
|
+
function scanText(text, sequence, eventType, fieldPath, findings) {
|
|
34
|
+
const claimed = [];
|
|
35
|
+
for (const detector of DETECTORS) {
|
|
36
|
+
detector.pattern.lastIndex = 0;
|
|
37
|
+
for (const match of text.matchAll(detector.pattern)) {
|
|
38
|
+
const start = match.index;
|
|
39
|
+
const end = start + match[0].length;
|
|
40
|
+
if (claimed.some(([from, to]) => start < to && end > from))
|
|
41
|
+
continue;
|
|
42
|
+
claimed.push([start, end]);
|
|
43
|
+
findings.push({
|
|
44
|
+
kind: detector.kind,
|
|
45
|
+
sequence,
|
|
46
|
+
eventType,
|
|
47
|
+
path: fieldPath,
|
|
48
|
+
matchLength: match[0].length,
|
|
49
|
+
maskedPreview: maskedPreview(match[0]),
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Path segments are part of the report, so a secret-shaped object key must
|
|
56
|
+
* never appear verbatim: mask it in the path and report the key itself.
|
|
57
|
+
*/
|
|
58
|
+
function safePathSegment(key) {
|
|
59
|
+
for (const detector of DETECTORS) {
|
|
60
|
+
detector.pattern.lastIndex = 0;
|
|
61
|
+
if (detector.pattern.test(key))
|
|
62
|
+
return maskedPreview(key);
|
|
63
|
+
}
|
|
64
|
+
return key;
|
|
65
|
+
}
|
|
66
|
+
function walk(value, sequence, eventType, fieldPath, findings, counter) {
|
|
67
|
+
if (typeof value === "string") {
|
|
68
|
+
counter.fields += 1;
|
|
69
|
+
scanText(value, sequence, eventType, fieldPath, findings);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
if (Array.isArray(value)) {
|
|
73
|
+
value.forEach((item, index) => {
|
|
74
|
+
walk(item, sequence, eventType, `${fieldPath}[${index}]`, findings, counter);
|
|
75
|
+
});
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (typeof value === "object" && value !== null) {
|
|
79
|
+
for (const [key, item] of Object.entries(value)) {
|
|
80
|
+
const segment = safePathSegment(key);
|
|
81
|
+
const childPath = `${fieldPath}.${segment}`;
|
|
82
|
+
scanText(key, sequence, eventType, childPath, findings);
|
|
83
|
+
walk(item, sequence, eventType, childPath, findings, counter);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Read-only sweep of a run's durable events for secret-shaped strings.
|
|
89
|
+
* The report never contains the matched bytes; each finding carries only
|
|
90
|
+
* the kind, location, length, and a four-character masked preview.
|
|
91
|
+
*/
|
|
92
|
+
export async function auditCueLineRunSecrets(runId, options = {}) {
|
|
93
|
+
const environment = options.environment ?? runtimeEnvironment();
|
|
94
|
+
const home = options.home ?? defaultCueLineHome(environment);
|
|
95
|
+
const events = await readAuthoritativeRunEvents(home, runId);
|
|
96
|
+
if (events.length === 0) {
|
|
97
|
+
throw new CueLineError("RUN_NOT_FOUND", `Run '${runId}' has no durable events; refusing to report a missing run as clean.`);
|
|
98
|
+
}
|
|
99
|
+
const findings = [];
|
|
100
|
+
const counter = { fields: 0 };
|
|
101
|
+
for (const event of events) {
|
|
102
|
+
walk(event.payload, event.sequence, event.type, "payload", findings, counter);
|
|
103
|
+
}
|
|
104
|
+
findings.sort((left, right) => left.sequence - right.sequence || left.path.localeCompare(right.path));
|
|
105
|
+
return {
|
|
106
|
+
protocol: SECRET_AUDIT_PROTOCOL,
|
|
107
|
+
runId,
|
|
108
|
+
scannedEvents: events.length,
|
|
109
|
+
scannedFields: counter.fields,
|
|
110
|
+
findings,
|
|
111
|
+
clean: findings.length === 0,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=secret-audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret-audit.js","sourceRoot":"","sources":["../../../src/diagnostics/secret-audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export type UpgradePreflightSurface = "version" | "node" | "config" | "state" | "runs";
|
|
2
|
+
export interface UpgradePreflightFinding {
|
|
3
|
+
code: string;
|
|
4
|
+
severity: "blocker" | "warning";
|
|
5
|
+
surface: UpgradePreflightSurface;
|
|
6
|
+
message: string;
|
|
7
|
+
}
|
|
8
|
+
export interface UpgradePreflightReport {
|
|
9
|
+
schema: "cueline-upgrade-preflight/1";
|
|
10
|
+
version: string;
|
|
11
|
+
targetVersion: string;
|
|
12
|
+
status: "ready" | "blocked";
|
|
13
|
+
checks: {
|
|
14
|
+
node: {
|
|
15
|
+
version: string;
|
|
16
|
+
requirement: ">=22";
|
|
17
|
+
ok: boolean;
|
|
18
|
+
};
|
|
19
|
+
config: {
|
|
20
|
+
path: string;
|
|
21
|
+
valid: boolean;
|
|
22
|
+
};
|
|
23
|
+
stateHome: {
|
|
24
|
+
path: string;
|
|
25
|
+
kind: "missing" | "directory" | "symlink" | "other";
|
|
26
|
+
private: boolean | null;
|
|
27
|
+
};
|
|
28
|
+
runs: {
|
|
29
|
+
total: number;
|
|
30
|
+
nonTerminal: number;
|
|
31
|
+
unreadable: number;
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
findings: UpgradePreflightFinding[];
|
|
35
|
+
}
|
|
36
|
+
export interface UpgradePreflightOptions {
|
|
37
|
+
targetVersion: string;
|
|
38
|
+
environment?: NodeJS.ProcessEnv;
|
|
39
|
+
nodeVersion?: string;
|
|
40
|
+
}
|
|
41
|
+
export declare function collectUpgradePreflight(options: UpgradePreflightOptions): Promise<UpgradePreflightReport>;
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { lstat } from "node:fs/promises";
|
|
2
|
+
import { listCueLineRuns, routingConfigPath } from "../api.js";
|
|
3
|
+
import { loadRoutingConfig } from "../router/config-loader.js";
|
|
4
|
+
import { defaultCueLineHome } from "../state/paths.js";
|
|
5
|
+
import { CUELINE_VERSION } from "../version.js";
|
|
6
|
+
const STABLE_SEMVER = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/;
|
|
7
|
+
function parseStableVersion(value) {
|
|
8
|
+
const match = STABLE_SEMVER.exec(value);
|
|
9
|
+
if (match === null)
|
|
10
|
+
return undefined;
|
|
11
|
+
return {
|
|
12
|
+
major: Number(match[1]),
|
|
13
|
+
minor: Number(match[2]),
|
|
14
|
+
patch: Number(match[3]),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function compareVersion(left, right) {
|
|
18
|
+
return left.major - right.major || left.minor - right.minor || left.patch - right.patch;
|
|
19
|
+
}
|
|
20
|
+
function isNotFound(error) {
|
|
21
|
+
return (typeof error === "object" &&
|
|
22
|
+
error !== null &&
|
|
23
|
+
"code" in error &&
|
|
24
|
+
error.code === "ENOENT");
|
|
25
|
+
}
|
|
26
|
+
export async function collectUpgradePreflight(options) {
|
|
27
|
+
const environment = options.environment ?? process.env;
|
|
28
|
+
const nodeVersion = options.nodeVersion ?? process.versions.node;
|
|
29
|
+
const targetVersion = options.targetVersion;
|
|
30
|
+
const configPath = routingConfigPath(environment);
|
|
31
|
+
const home = defaultCueLineHome(environment);
|
|
32
|
+
const findings = [];
|
|
33
|
+
const current = parseStableVersion(CUELINE_VERSION);
|
|
34
|
+
const target = parseStableVersion(targetVersion);
|
|
35
|
+
if (target === undefined) {
|
|
36
|
+
findings.push({
|
|
37
|
+
code: "TARGET_VERSION_INVALID",
|
|
38
|
+
severity: "blocker",
|
|
39
|
+
surface: "version",
|
|
40
|
+
message: "Target version must be a stable semantic version such as 1.0.0.",
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
else if (current !== undefined && compareVersion(target, current) < 0) {
|
|
44
|
+
findings.push({
|
|
45
|
+
code: "TARGET_VERSION_DOWNGRADE",
|
|
46
|
+
severity: "blocker",
|
|
47
|
+
surface: "version",
|
|
48
|
+
message: "Upgrade preflight does not authorize a downgrade.",
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
else if (current !== undefined && compareVersion(target, current) === 0) {
|
|
52
|
+
findings.push({
|
|
53
|
+
code: "TARGET_VERSION_NOT_NEWER",
|
|
54
|
+
severity: "warning",
|
|
55
|
+
surface: "version",
|
|
56
|
+
message: "Target version is already installed.",
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
const nodeMajor = Number.parseInt(nodeVersion.split(".")[0] ?? "0", 10);
|
|
60
|
+
const nodeOk = Number.isSafeInteger(nodeMajor) && nodeMajor >= 22;
|
|
61
|
+
if (!nodeOk) {
|
|
62
|
+
findings.push({
|
|
63
|
+
code: "NODE_VERSION_UNSUPPORTED",
|
|
64
|
+
severity: "blocker",
|
|
65
|
+
surface: "node",
|
|
66
|
+
message: "Node.js 22 or newer is required before upgrading CueLine.",
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
let configValid = true;
|
|
70
|
+
try {
|
|
71
|
+
await loadRoutingConfig(configPath);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
configValid = false;
|
|
75
|
+
findings.push({
|
|
76
|
+
code: "ROUTING_CONFIG_INVALID",
|
|
77
|
+
severity: "blocker",
|
|
78
|
+
surface: "config",
|
|
79
|
+
message: "The active routing configuration cannot be loaded by this version.",
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
let stateKind = "missing";
|
|
83
|
+
let statePrivate = null;
|
|
84
|
+
try {
|
|
85
|
+
const state = await lstat(home);
|
|
86
|
+
if (state.isSymbolicLink()) {
|
|
87
|
+
stateKind = "symlink";
|
|
88
|
+
findings.push({
|
|
89
|
+
code: "STATE_HOME_SYMLINK_UNSAFE",
|
|
90
|
+
severity: "blocker",
|
|
91
|
+
surface: "state",
|
|
92
|
+
message: "CueLine state home is a symbolic link; resolve it explicitly before upgrading.",
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
else if (state.isDirectory()) {
|
|
96
|
+
stateKind = "directory";
|
|
97
|
+
statePrivate = (state.mode & 0o077) === 0;
|
|
98
|
+
if (!statePrivate) {
|
|
99
|
+
findings.push({
|
|
100
|
+
code: "STATE_HOME_PERMISSIONS_UNSAFE",
|
|
101
|
+
severity: "blocker",
|
|
102
|
+
surface: "state",
|
|
103
|
+
message: "CueLine state home grants group or other permissions.",
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
stateKind = "other";
|
|
109
|
+
findings.push({
|
|
110
|
+
code: "STATE_HOME_NOT_DIRECTORY",
|
|
111
|
+
severity: "blocker",
|
|
112
|
+
surface: "state",
|
|
113
|
+
message: "CueLine state home exists but is not a directory.",
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
if (!isNotFound(error)) {
|
|
119
|
+
stateKind = "other";
|
|
120
|
+
findings.push({
|
|
121
|
+
code: "STATE_HOME_UNREADABLE",
|
|
122
|
+
severity: "blocker",
|
|
123
|
+
surface: "state",
|
|
124
|
+
message: "CueLine state home metadata cannot be read.",
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
let totalRuns = 0;
|
|
129
|
+
let nonTerminalRuns = 0;
|
|
130
|
+
let unreadableRuns = 0;
|
|
131
|
+
if (stateKind === "missing" || (stateKind === "directory" && statePrivate === true)) {
|
|
132
|
+
try {
|
|
133
|
+
const runs = await listCueLineRuns({ home, environment });
|
|
134
|
+
totalRuns = runs.length;
|
|
135
|
+
unreadableRuns = runs.filter((run) => !run.readable).length;
|
|
136
|
+
nonTerminalRuns = runs.filter((run) => run.readable &&
|
|
137
|
+
run.status !== "complete" &&
|
|
138
|
+
run.status !== "blocked" &&
|
|
139
|
+
run.status !== "cancelled").length;
|
|
140
|
+
if (unreadableRuns > 0) {
|
|
141
|
+
findings.push({
|
|
142
|
+
code: "RUN_EVIDENCE_UNREADABLE",
|
|
143
|
+
severity: "blocker",
|
|
144
|
+
surface: "runs",
|
|
145
|
+
message: "At least one persisted run cannot be read safely.",
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
if (nonTerminalRuns > 0) {
|
|
149
|
+
findings.push({
|
|
150
|
+
code: "NON_TERMINAL_RUNS_PRESENT",
|
|
151
|
+
severity: "blocker",
|
|
152
|
+
surface: "runs",
|
|
153
|
+
message: "Finish, block, or cancel every persisted run before upgrading.",
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
findings.push({
|
|
159
|
+
code: "RUN_STORE_UNREADABLE",
|
|
160
|
+
severity: "blocker",
|
|
161
|
+
surface: "runs",
|
|
162
|
+
message: "The persisted run store cannot be inspected safely.",
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return {
|
|
167
|
+
schema: "cueline-upgrade-preflight/1",
|
|
168
|
+
version: CUELINE_VERSION,
|
|
169
|
+
targetVersion,
|
|
170
|
+
status: findings.some((finding) => finding.severity === "blocker")
|
|
171
|
+
? "blocked"
|
|
172
|
+
: "ready",
|
|
173
|
+
checks: {
|
|
174
|
+
node: { version: nodeVersion, requirement: ">=22", ok: nodeOk },
|
|
175
|
+
config: { path: configPath, valid: configValid },
|
|
176
|
+
stateHome: { path: home, kind: stateKind, private: statePrivate },
|
|
177
|
+
runs: { total: totalRuns, nonTerminal: nonTerminalRuns, unreadable: unreadableRuns },
|
|
178
|
+
},
|
|
179
|
+
findings,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=upgrade-preflight.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade-preflight.js","sourceRoot":"","sources":["../../../src/diagnostics/upgrade-preflight.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { CueLineRunVerificationReport, CueLineRuntimeOptions } from "../api-contracts.js";
|
|
2
|
+
import { safeCueLineRunStatus } from "../cli/run-status-view.js";
|
|
3
|
+
import { type CueLineRunDiagnosis } from "../diagnostics/run-doctor.js";
|
|
4
|
+
import { type CueLineRunTimeline } from "./run-timeline.js";
|
|
5
|
+
export declare const RUN_BUNDLE_PROTOCOL = "cueline-run-bundle/0.1";
|
|
6
|
+
export interface CueLineRunSupportBundle {
|
|
7
|
+
schema: "cueline-run-export/1";
|
|
8
|
+
protocol: typeof RUN_BUNDLE_PROTOCOL;
|
|
9
|
+
version: string;
|
|
10
|
+
generatedAt: string;
|
|
11
|
+
runId: string;
|
|
12
|
+
status: ReturnType<typeof safeCueLineRunStatus>;
|
|
13
|
+
verification: CueLineRunVerificationReport;
|
|
14
|
+
diagnosis: CueLineRunDiagnosis;
|
|
15
|
+
timeline: CueLineRunTimeline;
|
|
16
|
+
}
|
|
17
|
+
export interface CueLineRunSupportBundleOptions extends Pick<CueLineRuntimeOptions, "home" | "environment" | "now"> {
|
|
18
|
+
timelineLimit?: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* One sanitized JSON document for bug reports and cross-machine support:
|
|
22
|
+
* metadata-only status, content-free verification, doctor diagnosis, and the
|
|
23
|
+
* hashed audit timeline. Every section reuses an existing sanitized surface;
|
|
24
|
+
* this module adds no new evidence projection of its own, so it cannot leak
|
|
25
|
+
* more than the surfaces it composes.
|
|
26
|
+
*/
|
|
27
|
+
export declare function buildCueLineRunSupportBundle(runId: string, options?: CueLineRunSupportBundleOptions): Promise<CueLineRunSupportBundle>;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { loadCueLineRunStatus } from "../api-runtime-lifecycle.js";
|
|
2
|
+
import { verifyCueLineRun } from "../api-run-verification.js";
|
|
3
|
+
import { safeCueLineRunStatus } from "../cli/run-status-view.js";
|
|
4
|
+
import { CueLineError } from "../core/errors.js";
|
|
5
|
+
import { runtimeEnvironment } from "../core/runtime.js";
|
|
6
|
+
import { diagnoseCueLineRunStatus, } from "../diagnostics/run-doctor.js";
|
|
7
|
+
import { defaultCueLineHome } from "../state/paths.js";
|
|
8
|
+
import { CUELINE_VERSION } from "../version.js";
|
|
9
|
+
import { loadCueLineRunTimeline } from "./run-timeline.js";
|
|
10
|
+
export const RUN_BUNDLE_PROTOCOL = "cueline-run-bundle/0.1";
|
|
11
|
+
/**
|
|
12
|
+
* One sanitized JSON document for bug reports and cross-machine support:
|
|
13
|
+
* metadata-only status, content-free verification, doctor diagnosis, and the
|
|
14
|
+
* hashed audit timeline. Every section reuses an existing sanitized surface;
|
|
15
|
+
* this module adds no new evidence projection of its own, so it cannot leak
|
|
16
|
+
* more than the surfaces it composes.
|
|
17
|
+
*/
|
|
18
|
+
export async function buildCueLineRunSupportBundle(runId, options = {}) {
|
|
19
|
+
const timelineLimit = options.timelineLimit ?? 1000;
|
|
20
|
+
if (!Number.isSafeInteger(timelineLimit) ||
|
|
21
|
+
timelineLimit < 1 ||
|
|
22
|
+
timelineLimit > 1000) {
|
|
23
|
+
throw new CueLineError("RUN_BUNDLE_LIMIT_INVALID", "timelineLimit must be an integer between 1 and 1000.");
|
|
24
|
+
}
|
|
25
|
+
const environment = options.environment ?? runtimeEnvironment();
|
|
26
|
+
const home = options.home ?? defaultCueLineHome(environment);
|
|
27
|
+
const shared = {
|
|
28
|
+
home,
|
|
29
|
+
...(options.environment === undefined ? {} : { environment: options.environment }),
|
|
30
|
+
};
|
|
31
|
+
const status = await loadCueLineRunStatus(runId, {
|
|
32
|
+
...shared,
|
|
33
|
+
...(options.now === undefined ? {} : { now: options.now }),
|
|
34
|
+
});
|
|
35
|
+
const [verification, timeline] = await Promise.all([
|
|
36
|
+
verifyCueLineRun(runId, {
|
|
37
|
+
...shared,
|
|
38
|
+
...(options.now === undefined ? {} : { now: options.now }),
|
|
39
|
+
}),
|
|
40
|
+
loadCueLineRunTimeline(runId, { ...shared, limit: timelineLimit }),
|
|
41
|
+
]);
|
|
42
|
+
const generatedAt = (options.now === undefined ? new Date() : options.now()).toISOString();
|
|
43
|
+
return {
|
|
44
|
+
schema: "cueline-run-export/1",
|
|
45
|
+
protocol: RUN_BUNDLE_PROTOCOL,
|
|
46
|
+
version: CUELINE_VERSION,
|
|
47
|
+
generatedAt,
|
|
48
|
+
runId,
|
|
49
|
+
status: safeCueLineRunStatus(status),
|
|
50
|
+
verification,
|
|
51
|
+
diagnosis: diagnoseCueLineRunStatus(status),
|
|
52
|
+
timeline,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=run-bundle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-bundle.js","sourceRoot":"","sources":["../../../src/observation/run-bundle.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EACL,wBAAwB,GAEzB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAA2B,MAAM,mBAAmB,CAAC;AAEpF,MAAM,CAAC,MAAM,mBAAmB,GAAG,wBAAwB,CAAC;AAmB5D;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,KAAa,EACb,OAAO,GAAmC,EAAE;IAE5C,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC;IACpD,IACE,CAAC,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC;QACpC,aAAa,GAAG,CAAC;QACjB,aAAa,GAAG,IAAI,EACpB,CAAC;QACD,MAAM,IAAI,YAAY,CACpB,0BAA0B,EAC1B,sDAAsD,CACvD,CAAC;IACJ,CAAC;IACD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,kBAAkB,EAAE,CAAC;IAChE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG;QACb,IAAI;QACJ,GAAG,CAAC,OAAO,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC;KACnF,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,KAAK,EAAE;QAC/C,GAAG,MAAM;QACT,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KAC3D,CAAC,CAAC;IACH,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACjD,gBAAgB,CAAC,KAAK,EAAE;YACtB,GAAG,MAAM;YACT,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SAC3D,CAAC;QACF,sBAAsB,CAAC,KAAK,EAAE,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;KACnE,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC3F,OAAO;QACL,MAAM,EAAE,sBAAsB;QAC9B,QAAQ,EAAE,mBAAmB;QAC7B,OAAO,EAAE,eAAe;QACxB,WAAW;QACX,KAAK;QACL,MAAM,EAAE,oBAAoB,CAAC,MAAM,CAAC;QACpC,YAAY;QACZ,SAAS,EAAE,wBAAwB,CAAC,MAAM,CAAC;QAC3C,QAAQ;KACT,CAAC;AACJ,CAAC"}
|
package/dist/src/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const CUELINE_VERSION = "0.
|
|
1
|
+
export declare const CUELINE_VERSION = "0.3.0";
|
package/dist/src/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const CUELINE_VERSION = "0.
|
|
1
|
+
export const CUELINE_VERSION = "0.3.0";
|
|
2
2
|
//# sourceMappingURL=version.js.map
|