pi-oracle 0.7.4 → 0.7.6
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/CHANGELOG.md +32 -0
- package/README.md +53 -18
- package/docs/ORACLE_DESIGN.md +16 -8
- package/docs/platform-smoke.md +156 -0
- package/extensions/oracle/index.ts +10 -4
- package/extensions/oracle/lib/config.ts +53 -27
- package/extensions/oracle/lib/jobs.ts +9 -5
- package/extensions/oracle/lib/poller.ts +1 -0
- package/extensions/oracle/lib/runtime.ts +107 -32
- package/extensions/oracle/lib/tools.ts +138 -12
- package/extensions/oracle/shared/browser-profile-helpers.d.mts +59 -0
- package/extensions/oracle/shared/browser-profile-helpers.mjs +395 -0
- package/extensions/oracle/shared/process-helpers.mjs +12 -1
- package/extensions/oracle/shared/state-coordination-helpers.mjs +8 -2
- package/extensions/oracle/worker/auth-bootstrap.mjs +39 -10
- package/extensions/oracle/worker/chatgpt-ui-helpers.d.mts +2 -0
- package/extensions/oracle/worker/chatgpt-ui-helpers.mjs +157 -1
- package/extensions/oracle/worker/chromium-cookie-source.mjs +2 -1
- package/extensions/oracle/worker/run-job.mjs +107 -25
- package/package.json +30 -9
- package/platform-smoke.config.mjs +66 -0
- package/scripts/oracle-real-smoke.mjs +500 -0
- package/scripts/platform-smoke/Dockerfile.ubuntu +8 -0
- package/scripts/platform-smoke/artifacts.mjs +87 -0
- package/scripts/platform-smoke/assertions.mjs +34 -0
- package/scripts/platform-smoke/crabbox-runner.mjs +135 -0
- package/scripts/platform-smoke/doctor.mjs +239 -0
- package/scripts/platform-smoke/invariants.mjs +124 -0
- package/scripts/platform-smoke/platform-build-windows.ps1 +168 -0
- package/scripts/platform-smoke/targets.mjs +434 -0
- package/scripts/platform-smoke.mjs +152 -0
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { createRequire } from "node:module";
|
|
4
|
+
import { dirname, resolve } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
|
|
7
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
8
|
+
const __dirname = dirname(__filename);
|
|
9
|
+
const repoRoot = resolve(__dirname, "..");
|
|
10
|
+
const require = createRequire(import.meta.url);
|
|
11
|
+
|
|
12
|
+
let config;
|
|
13
|
+
try {
|
|
14
|
+
config = require(resolve(repoRoot, "platform-smoke.config.mjs"));
|
|
15
|
+
if (config.default) config = config.default;
|
|
16
|
+
} catch (error) {
|
|
17
|
+
config = null;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function printHelp() {
|
|
21
|
+
console.log(`Usage: node scripts/platform-smoke.mjs <command> [options]
|
|
22
|
+
|
|
23
|
+
Commands:
|
|
24
|
+
doctor Run mandatory Crabbox, host, target-tool, auth, and package preflight checks
|
|
25
|
+
run --target <names> Run one or more comma-separated targets concurrently
|
|
26
|
+
run --suite <name> Run one suite on the configured target(s)
|
|
27
|
+
|
|
28
|
+
Options:
|
|
29
|
+
--target Comma-separated target names. Supported: macos,ubuntu,windows-native
|
|
30
|
+
--suite Suite name. Supported: platform-build,real-extension
|
|
31
|
+
--help, -h Show this help
|
|
32
|
+
|
|
33
|
+
Examples:
|
|
34
|
+
node scripts/platform-smoke.mjs doctor
|
|
35
|
+
node scripts/platform-smoke.mjs run --target macos
|
|
36
|
+
node scripts/platform-smoke.mjs run --target ubuntu
|
|
37
|
+
node scripts/platform-smoke.mjs run --target windows-native
|
|
38
|
+
node scripts/platform-smoke.mjs run --target macos,ubuntu,windows-native --suite platform-build
|
|
39
|
+
node scripts/platform-smoke.mjs run --target macos,ubuntu,windows-native --suite real-extension
|
|
40
|
+
|
|
41
|
+
Canonical workflows:
|
|
42
|
+
Everyday local iteration: npm run verify:oracle
|
|
43
|
+
Platform-sensitive changes: npm run smoke:platform:doctor, then focused run --target <target> --suite <suite>
|
|
44
|
+
Platform matrix proof: npm run smoke:platform:all
|
|
45
|
+
Full release gate: npm run release:check
|
|
46
|
+
|
|
47
|
+
Environment:
|
|
48
|
+
PLATFORM_SMOKE_CRABBOX Reusable Crabbox binary override (defaults to PATH)
|
|
49
|
+
PI_ORACLE_SMOKE_CRABBOX Project-specific Crabbox binary override (wins over PLATFORM_SMOKE_CRABBOX)
|
|
50
|
+
PLATFORM_SMOKE_MAC_HOST macOS SSH host (default: localhost)
|
|
51
|
+
PLATFORM_SMOKE_MAC_USER macOS SSH user (default: $USER)
|
|
52
|
+
PLATFORM_SMOKE_MAC_WORK_ROOT macOS Crabbox work root
|
|
53
|
+
PLATFORM_SMOKE_UBUNTU_IMAGE Optional local-container image override
|
|
54
|
+
PLATFORM_SMOKE_WINDOWS_VM Parallels source VM (default from config)
|
|
55
|
+
PLATFORM_SMOKE_WINDOWS_SNAPSHOT Parallels snapshot (default from config)
|
|
56
|
+
PLATFORM_SMOKE_WINDOWS_USER Windows SSH user (default: $USER)
|
|
57
|
+
PLATFORM_SMOKE_WINDOWS_WORK_ROOT Windows work root
|
|
58
|
+
PI_ORACLE_SMOKE_* Project-specific aliases for the PLATFORM_SMOKE_* knobs above
|
|
59
|
+
PI_ORACLE_REAL_TEST_PROVIDER Real smoke provider (default: zai)
|
|
60
|
+
PI_ORACLE_REAL_TEST_MODEL Real smoke model (default: glm-5.1)
|
|
61
|
+
ZAI_API_KEY Default real-smoke provider API key for optional model-agent debugging
|
|
62
|
+
`);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function parseArgs(argv) {
|
|
66
|
+
const args = { command: null, target: null, suite: null };
|
|
67
|
+
for (let i = 2; i < argv.length; i += 1) {
|
|
68
|
+
const arg = argv[i];
|
|
69
|
+
if (arg === "--help" || arg === "-h") {
|
|
70
|
+
args.command = "help";
|
|
71
|
+
return args;
|
|
72
|
+
}
|
|
73
|
+
if (arg === "doctor" || arg === "run") {
|
|
74
|
+
args.command = arg;
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (arg === "--target" && i + 1 < argv.length) {
|
|
78
|
+
args.target = argv[i + 1];
|
|
79
|
+
i += 1;
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (arg === "--suite" && i + 1 < argv.length) {
|
|
83
|
+
args.suite = argv[i + 1];
|
|
84
|
+
i += 1;
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
throw new Error(`unknown argument: ${arg}`);
|
|
88
|
+
}
|
|
89
|
+
return args;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function splitCsv(value) {
|
|
93
|
+
return value.split(",").map((part) => part.trim()).filter(Boolean);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function validateSelection(targets, suites) {
|
|
97
|
+
const supportedTargets = new Set(config.requiredTargets ?? ["ubuntu"]);
|
|
98
|
+
const supportedSuites = new Set(config.requiredSuites ?? ["platform-build"]);
|
|
99
|
+
for (const target of targets) {
|
|
100
|
+
if (!supportedTargets.has(target)) throw new Error(`unsupported target: ${target}`);
|
|
101
|
+
}
|
|
102
|
+
for (const suite of suites) {
|
|
103
|
+
if (!supportedSuites.has(suite)) throw new Error(`unsupported suite: ${suite}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
async function runDoctor() {
|
|
108
|
+
const { runDoctor } = await import("./platform-smoke/doctor.mjs");
|
|
109
|
+
await runDoctor(config);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
async function runTarget(targetName, suites, singleSuite) {
|
|
113
|
+
const { runTargetSuite, runTargetSuites } = await import("./platform-smoke/targets.mjs");
|
|
114
|
+
if (singleSuite) return runTargetSuite(config, targetName, suites[0]);
|
|
115
|
+
return runTargetSuites(config, targetName, suites);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
async function main() {
|
|
119
|
+
const args = parseArgs(process.argv);
|
|
120
|
+
if (!args.command || args.command === "help") {
|
|
121
|
+
printHelp();
|
|
122
|
+
process.exit(args.command === "help" ? 0 : 1);
|
|
123
|
+
}
|
|
124
|
+
if (!config) throw new Error("platform-smoke.config.mjs not found or failed to load");
|
|
125
|
+
|
|
126
|
+
if (args.command === "doctor") {
|
|
127
|
+
await runDoctor();
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (args.command === "run") {
|
|
132
|
+
const targets = args.target ? splitCsv(args.target) : config.requiredTargets;
|
|
133
|
+
const suites = args.suite ? [args.suite] : config.requiredSuites;
|
|
134
|
+
validateSelection(targets, suites);
|
|
135
|
+
const results = await Promise.all(targets.map(async (target) => {
|
|
136
|
+
console.log(`\n=== Target: ${target} ===`);
|
|
137
|
+
return { target, result: await runTarget(target, suites, Boolean(args.suite)) };
|
|
138
|
+
}));
|
|
139
|
+
if (results.some(({ result }) => !result.ok)) {
|
|
140
|
+
console.log("\nOne or more platform smoke suites failed. Check .artifacts/platform-smoke/ for details.");
|
|
141
|
+
process.exit(1);
|
|
142
|
+
}
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
throw new Error(`unknown command: ${args.command}`);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
main().catch((error) => {
|
|
150
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
151
|
+
process.exit(1);
|
|
152
|
+
});
|