@principles/pd-cli 1.152.12 → 1.152.13
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/package.json +13 -7
- package/CHANGELOG.md +0 -23
- package/dist/commands/__tests__/intent-flag-wiring.test.d.ts +0 -9
- package/dist/commands/__tests__/intent-flag-wiring.test.d.ts.map +0 -1
- package/dist/commands/__tests__/intent-flag-wiring.test.js +0 -237
- package/dist/commands/__tests__/intent-flag-wiring.test.js.map +0 -1
- package/dist/commands/__tests__/legacy-cleanup.test.d.ts +0 -18
- package/dist/commands/__tests__/legacy-cleanup.test.d.ts.map +0 -1
- package/dist/commands/__tests__/legacy-cleanup.test.js +0 -467
- package/dist/commands/__tests__/legacy-cleanup.test.js.map +0 -1
- package/dist/commands/__tests__/mvp-smoke.test.d.ts +0 -15
- package/dist/commands/__tests__/mvp-smoke.test.d.ts.map +0 -1
- package/dist/commands/__tests__/mvp-smoke.test.js +0 -262
- package/dist/commands/__tests__/mvp-smoke.test.js.map +0 -1
- package/dist/commands/__tests__/pain-retry-maxTokens-flag.test.d.ts +0 -2
- package/dist/commands/__tests__/pain-retry-maxTokens-flag.test.d.ts.map +0 -1
- package/dist/commands/__tests__/pain-retry-maxTokens-flag.test.js +0 -60
- package/dist/commands/__tests__/pain-retry-maxTokens-flag.test.js.map +0 -1
- package/dist/commands/__tests__/rulecode-flag-wiring.test.d.ts +0 -21
- package/dist/commands/__tests__/rulecode-flag-wiring.test.d.ts.map +0 -1
- package/dist/commands/__tests__/rulecode-flag-wiring.test.js +0 -186
- package/dist/commands/__tests__/rulecode-flag-wiring.test.js.map +0 -1
- package/dist/commands/__tests__/rulecode-handler.test.d.ts +0 -16
- package/dist/commands/__tests__/rulecode-handler.test.d.ts.map +0 -1
- package/dist/commands/__tests__/rulecode-handler.test.js +0 -285
- package/dist/commands/__tests__/rulecode-handler.test.js.map +0 -1
- package/dist/commands/__tests__/run-rulehost-flag-wiring.test.d.ts +0 -24
- package/dist/commands/__tests__/run-rulehost-flag-wiring.test.d.ts.map +0 -1
- package/dist/commands/__tests__/run-rulehost-flag-wiring.test.js +0 -232
- package/dist/commands/__tests__/run-rulehost-flag-wiring.test.js.map +0 -1
- package/dist/commands/__tests__/runtime-activation-nextaction.test.d.ts +0 -15
- package/dist/commands/__tests__/runtime-activation-nextaction.test.d.ts.map +0 -1
- package/dist/commands/__tests__/runtime-activation-nextaction.test.js +0 -73
- package/dist/commands/__tests__/runtime-activation-nextaction.test.js.map +0 -1
- package/dist/commands/__tests__/runtime-probe-config.test.d.ts +0 -20
- package/dist/commands/__tests__/runtime-probe-config.test.d.ts.map +0 -1
- package/dist/commands/__tests__/runtime-probe-config.test.js +0 -389
- package/dist/commands/__tests__/runtime-probe-config.test.js.map +0 -1
- package/dist/commands/__tests__/telemetry-flag-wiring.test.d.ts +0 -9
- package/dist/commands/__tests__/telemetry-flag-wiring.test.d.ts.map +0 -1
- package/dist/commands/__tests__/telemetry-flag-wiring.test.js +0 -76
- package/dist/commands/__tests__/telemetry-flag-wiring.test.js.map +0 -1
- package/dist/commands/__tests__/version.test.d.ts +0 -2
- package/dist/commands/__tests__/version.test.d.ts.map +0 -1
- package/dist/commands/__tests__/version.test.js +0 -238
- package/dist/commands/__tests__/version.test.js.map +0 -1
- package/dist/commands/runtime-uat.guard.test.d.ts +0 -2
- package/dist/commands/runtime-uat.guard.test.d.ts.map +0 -1
- package/dist/commands/runtime-uat.guard.test.js +0 -153
- package/dist/commands/runtime-uat.guard.test.js.map +0 -1
- package/dist/services/__tests__/cli-output.test.d.ts +0 -18
- package/dist/services/__tests__/cli-output.test.d.ts.map +0 -1
- package/dist/services/__tests__/cli-output.test.js +0 -103
- package/dist/services/__tests__/cli-output.test.js.map +0 -1
- package/dist/services/__tests__/evaluator-runner-deps.test.d.ts +0 -2
- package/dist/services/__tests__/evaluator-runner-deps.test.d.ts.map +0 -1
- package/dist/services/__tests__/evaluator-runner-deps.test.js +0 -343
- package/dist/services/__tests__/evaluator-runner-deps.test.js.map +0 -1
- package/dist/services/__tests__/rulehost-readiness.test.d.ts +0 -2
- package/dist/services/__tests__/rulehost-readiness.test.d.ts.map +0 -1
- package/dist/services/__tests__/rulehost-readiness.test.js +0 -311
- package/dist/services/__tests__/rulehost-readiness.test.js.map +0 -1
- package/dist/services/__tests__/runtime-adapter-resolver.test.d.ts +0 -18
- package/dist/services/__tests__/runtime-adapter-resolver.test.d.ts.map +0 -1
- package/dist/services/__tests__/runtime-adapter-resolver.test.js +0 -673
- package/dist/services/__tests__/runtime-adapter-resolver.test.js.map +0 -1
- package/dist/utils/production-workspace-guard.test.d.ts +0 -2
- package/dist/utils/production-workspace-guard.test.d.ts.map +0 -1
- package/dist/utils/production-workspace-guard.test.js +0 -137
- package/dist/utils/production-workspace-guard.test.js.map +0 -1
- package/scripts/llm-dogfood.ts +0 -456
- package/scripts/migrate-illegal-expected-decision.ts +0 -252
- package/src/commands/__tests__/intent-flag-wiring.test.ts +0 -282
- package/src/commands/__tests__/legacy-cleanup.test.ts +0 -602
- package/src/commands/__tests__/mvp-smoke.test.ts +0 -300
- package/src/commands/__tests__/pain-retry-maxTokens-flag.test.ts +0 -73
- package/src/commands/__tests__/rulecode-flag-wiring.test.ts +0 -237
- package/src/commands/__tests__/rulecode-handler.test.ts +0 -369
- package/src/commands/__tests__/run-rulehost-flag-wiring.test.ts +0 -292
- package/src/commands/__tests__/runtime-activation-nextaction.test.ts +0 -81
- package/src/commands/__tests__/runtime-probe-config.test.ts +0 -432
- package/src/commands/__tests__/telemetry-flag-wiring.test.ts +0 -84
- package/src/commands/__tests__/version.test.ts +0 -251
- package/src/commands/admission-gate.ts +0 -30
- package/src/commands/artifact.ts +0 -82
- package/src/commands/build-trajectory-evidence.ts +0 -298
- package/src/commands/candidate.ts +0 -1250
- package/src/commands/codex-ingest-catchup.ts +0 -114
- package/src/commands/codex-ingest-quarantine.ts +0 -127
- package/src/commands/codex-reconcile.ts +0 -84
- package/src/commands/codex-setup.ts +0 -476
- package/src/commands/codex-worker.ts +0 -185
- package/src/commands/command-helpers.ts +0 -24
- package/src/commands/config-doctor.ts +0 -193
- package/src/commands/console.ts +0 -797
- package/src/commands/context.ts +0 -72
- package/src/commands/demo-story-a.ts +0 -241
- package/src/commands/diagnose.ts +0 -756
- package/src/commands/errors-list.ts +0 -441
- package/src/commands/evolution-tasks-list.ts +0 -48
- package/src/commands/evolution-tasks-show.ts +0 -62
- package/src/commands/flow.ts +0 -60
- package/src/commands/health-codex.ts +0 -576
- package/src/commands/health.ts +0 -315
- package/src/commands/history.ts +0 -63
- package/src/commands/intent.ts +0 -457
- package/src/commands/legacy-cleanup.ts +0 -531
- package/src/commands/legacy-import.ts +0 -104
- package/src/commands/mvp-smoke.ts +0 -160
- package/src/commands/pain-evidence.ts +0 -226
- package/src/commands/pain-list.ts +0 -239
- package/src/commands/pain-record.ts +0 -612
- package/src/commands/pain-retry.ts +0 -916
- package/src/commands/principles-stats.ts +0 -700
- package/src/commands/proven-channel-baseline.ts +0 -115
- package/src/commands/quality-scorecard.ts +0 -272
- package/src/commands/remediation-output.ts +0 -66
- package/src/commands/rulecode.ts +0 -465
- package/src/commands/run.ts +0 -89
- package/src/commands/runtime-activation.ts +0 -1629
- package/src/commands/runtime-artifact-repair.ts +0 -524
- package/src/commands/runtime-canary.ts +0 -395
- package/src/commands/runtime-compatibility-scan.ts +0 -105
- package/src/commands/runtime-diagnostics-export.ts +0 -229
- package/src/commands/runtime-features.ts +0 -153
- package/src/commands/runtime-gfi-snapshot.ts +0 -135
- package/src/commands/runtime-health-snapshot.ts +0 -108
- package/src/commands/runtime-init.ts +0 -429
- package/src/commands/runtime-internalization-enqueue-successors.ts +0 -530
- package/src/commands/runtime-internalization-integrity-repair.ts +0 -79
- package/src/commands/runtime-internalization-integrity.ts +0 -107
- package/src/commands/runtime-internalization-queue.ts +0 -135
- package/src/commands/runtime-internalization-retry.ts +0 -191
- package/src/commands/runtime-internalization-run-once.ts +0 -791
- package/src/commands/runtime-internalization-run-rulehost.ts +0 -749
- package/src/commands/runtime-internalization-wake-once.ts +0 -87
- package/src/commands/runtime-pain-flood-simulation.ts +0 -121
- package/src/commands/runtime-pruning.ts +0 -438
- package/src/commands/runtime-recovery-failed-tasks.ts +0 -258
- package/src/commands/runtime-recovery.ts +0 -109
- package/src/commands/runtime-synthetic-baseline.ts +0 -70
- package/src/commands/runtime-uat.guard.test.ts +0 -175
- package/src/commands/runtime-uat.ts +0 -380
- package/src/commands/runtime.ts +0 -473
- package/src/commands/samples-list.ts +0 -39
- package/src/commands/samples-review.ts +0 -36
- package/src/commands/task.ts +0 -271
- package/src/commands/telemetry.ts +0 -349
- package/src/commands/trace.ts +0 -174
- package/src/commands/trajectory-db-unavailable.ts +0 -19
- package/src/commands/trajectory.ts +0 -64
- package/src/commands/version.ts +0 -49
- package/src/config-reader.ts +0 -122
- package/src/index.ts +0 -1276
- package/src/legacy/legacy-import.ts +0 -179
- package/src/legacy/session-history-import.ts +0 -203
- package/src/resolve-workspace.ts +0 -106
- package/src/services/__tests__/cli-output.test.ts +0 -130
- package/src/services/__tests__/evaluator-runner-deps.test.ts +0 -382
- package/src/services/__tests__/rulehost-readiness.test.ts +0 -363
- package/src/services/__tests__/runtime-adapter-resolver.test.ts +0 -793
- package/src/services/cli-output.ts +0 -95
- package/src/services/config-doctor.ts +0 -697
- package/src/services/console-launcher.ts +0 -537
- package/src/services/demo-rule-compiler.ts +0 -40
- package/src/services/demo-story-a-runner.ts +0 -471
- package/src/services/mainline-snapshot-assembler.ts +0 -579
- package/src/services/pain-flood-simulation-runner.ts +0 -462
- package/src/services/pd-config-loader.ts +0 -433
- package/src/services/proven-channel-baseline-runner.ts +0 -157
- package/src/services/quality-scorecard/data-extractor.ts +0 -150
- package/src/services/quality-scorecard/local-evaluator.ts +0 -142
- package/src/services/quality-scorecard/strong-model-gate.ts +0 -202
- package/src/services/resolve-runtime-from-pd-config.ts +0 -230
- package/src/services/rulehost-pipeline-runner.ts +0 -1214
- package/src/services/rulehost-readiness.ts +0 -326
- package/src/services/runtime-adapter-resolver.ts +0 -364
- package/src/services/synthetic-baseline-runner.ts +0 -400
- package/src/services/version-report.ts +0 -253
- package/src/services/workspace-tool-semantics.ts +0 -26
- package/src/utils/path-security.ts +0 -96
- package/src/utils/production-workspace-guard.test.ts +0 -157
- package/src/utils/production-workspace-guard.ts +0 -210
- package/tests/bdd/cli-contract.steps.ts +0 -346
- package/tests/bdd/principles-stats.steps.ts +0 -211
- package/tests/bdd/support/gherkin-loader.ts +0 -147
- package/tests/bdd/support/repo-root.ts +0 -62
- package/tests/bdd/support/vitest-bdd.ts +0 -179
- package/tests/commands/admission-gate-coverage.test.ts +0 -79
- package/tests/commands/build-trajectory-evidence.test.ts +0 -508
- package/tests/commands/candidate-audit-repair.test.ts +0 -421
- package/tests/commands/candidate-intake.test.ts +0 -732
- package/tests/commands/candidate-internalization-backfill.test.ts +0 -548
- package/tests/commands/candidate-internalize-lineage.test.ts +0 -628
- package/tests/commands/candidate-internalize.test.ts +0 -299
- package/tests/commands/candidate-route.test.ts +0 -329
- package/tests/commands/candidate-show.test.ts +0 -95
- package/tests/commands/cli-command-tree.test.ts +0 -144
- package/tests/commands/cli-help-snapshot.test.ts +0 -155
- package/tests/commands/cli-skill-contract.test.ts +0 -121
- package/tests/commands/codex-consent-reversibility.steps.test.ts +0 -299
- package/tests/commands/codex-ingest-quarantine.test.ts +0 -136
- package/tests/commands/codex-setup.test.ts +0 -297
- package/tests/commands/codex-worker-daemon.test.ts +0 -95
- package/tests/commands/codex-worker-registration.test.ts +0 -207
- package/tests/commands/config-doctor.test.ts +0 -336
- package/tests/commands/console-launcher-edge-cases.test.ts +0 -388
- package/tests/commands/console-open.test.ts +0 -1381
- package/tests/commands/context.test.ts +0 -114
- package/tests/commands/demo-story-a.test.ts +0 -318
- package/tests/commands/diagnose.test.ts +0 -1803
- package/tests/commands/errors-list.test.ts +0 -679
- package/tests/commands/evolution-tasks-list.test.ts +0 -41
- package/tests/commands/evolution-tasks-show.test.ts +0 -46
- package/tests/commands/health-codex.test.ts +0 -349
- package/tests/commands/health-host-wiring.test.ts +0 -76
- package/tests/commands/health-reliability.test.ts +0 -99
- package/tests/commands/health.test.ts +0 -413
- package/tests/commands/intent.test.ts +0 -321
- package/tests/commands/legacy-cleanup.test.ts +0 -148
- package/tests/commands/pain-evidence.test.ts +0 -518
- package/tests/commands/pain-list.test.ts +0 -219
- package/tests/commands/pain-record-async.test.ts +0 -335
- package/tests/commands/pain-record-session-parser.test.ts +0 -228
- package/tests/commands/pain-record.test.ts +0 -851
- package/tests/commands/pain-retry.test.ts +0 -1121
- package/tests/commands/plugin-config-resolution-cutover.test.ts +0 -229
- package/tests/commands/pri-393-runtime-config-unification.test.ts +0 -443
- package/tests/commands/principles-stats-wiring.test.ts +0 -135
- package/tests/commands/principles-stats.test.ts +0 -274
- package/tests/commands/product-path-regression.test.ts +0 -86
- package/tests/commands/proven-channel-baseline.test.ts +0 -441
- package/tests/commands/rulecode.test.ts +0 -177
- package/tests/commands/run-rulehost-handler.test.ts +0 -908
- package/tests/commands/runtime-activation-approve-flag-wiring.test.ts +0 -227
- package/tests/commands/runtime-activation-deactivate-flag-wiring.test.ts +0 -167
- package/tests/commands/runtime-activation-dispatch-flag-wiring.test.ts +0 -262
- package/tests/commands/runtime-activation-governance-audit.test.ts +0 -95
- package/tests/commands/runtime-activation-list-flag-wiring.test.ts +0 -193
- package/tests/commands/runtime-activation-promote-flag-wiring.test.ts +0 -248
- package/tests/commands/runtime-activation-shadow-telemetry.test.ts +0 -130
- package/tests/commands/runtime-activation.test.ts +0 -2052
- package/tests/commands/runtime-artifact-repair-registration.test.ts +0 -74
- package/tests/commands/runtime-artifact-repair.test.ts +0 -404
- package/tests/commands/runtime-canary.test.ts +0 -430
- package/tests/commands/runtime-compatibility-scan.test.ts +0 -146
- package/tests/commands/runtime-diagnostics-export.test.ts +0 -175
- package/tests/commands/runtime-features.test.ts +0 -249
- package/tests/commands/runtime-health-snapshot.test.ts +0 -358
- package/tests/commands/runtime-init-empty-workspace.test.ts +0 -252
- package/tests/commands/runtime-init.test.ts +0 -420
- package/tests/commands/runtime-internalization-enqueue-successors.test.ts +0 -782
- package/tests/commands/runtime-internalization-integrity-repair.test.ts +0 -239
- package/tests/commands/runtime-internalization-integrity.test.ts +0 -140
- package/tests/commands/runtime-internalization-queue.test.ts +0 -380
- package/tests/commands/runtime-internalization-retry-owner-authority.test.ts +0 -431
- package/tests/commands/runtime-internalization-run-once-evaluator-parity.test.ts +0 -269
- package/tests/commands/runtime-internalization-run-once-language.test.ts +0 -303
- package/tests/commands/runtime-internalization-run-once-real-config.test.ts +0 -237
- package/tests/commands/runtime-internalization-run-once-rollout-parity.test.ts +0 -706
- package/tests/commands/runtime-internalization-run-once.test.ts +0 -1791
- package/tests/commands/runtime-internalization-wake-once.test.ts +0 -171
- package/tests/commands/runtime-internalization.test.ts +0 -53
- package/tests/commands/runtime-pain-flood-simulation.test.ts +0 -418
- package/tests/commands/runtime-pruning.test.ts +0 -694
- package/tests/commands/runtime-recovery-failed-tasks.test.ts +0 -328
- package/tests/commands/runtime-recovery.test.ts +0 -120
- package/tests/commands/runtime-synthetic-baseline.test.ts +0 -249
- package/tests/commands/runtime-uat.test.ts +0 -397
- package/tests/commands/runtime.test.ts +0 -392
- package/tests/commands/samples-list.test.ts +0 -43
- package/tests/commands/samples-review.test.ts +0 -41
- package/tests/commands/task.test.ts +0 -153
- package/tests/commands/telemetry.test.ts +0 -190
- package/tests/commands/trace.test.ts +0 -316
- package/tests/config-reader.test.ts +0 -143
- package/tests/e2e/candidate-intake-e2e.test.ts +0 -338
- package/tests/e2e/cli-full-flow.test.ts +0 -233
- package/tests/e2e/cross-package-acceptance.test.ts +0 -635
- package/tests/helpers/pd-cli-path.ts +0 -5
- package/tests/pd-cli-smoke.test.ts +0 -13
- package/tests/resolve-workspace.test.ts +0 -196
- package/tests/services/config-doctor-signal-health.test.ts +0 -109
- package/tests/services/console-launcher.test.ts +0 -114
- package/tests/services/demo-rule-compiler.test.ts +0 -242
- package/tests/services/mainline-snapshot-assembler.test.ts +0 -572
- package/tests/services/pd-config-loader.test.ts +0 -505
- package/tests/services/proven-channel-baseline-runner.test.ts +0 -30
- package/tests/services/quality-scorecard/strong-model-gate.test.ts +0 -133
- package/tests/services/resolve-runtime-from-pd-config.test.ts +0 -485
- package/tests/services/rulehost-pipeline-e2e.test.ts +0 -538
- package/tests/services/rulehost-pipeline-runner.test.ts +0 -1242
- package/tests/services/workspace-tool-semantics.test.ts +0 -76
- package/tests/utils/path-security.test.ts +0 -180
- package/tsconfig.json +0 -26
- package/vitest.config.ts +0 -10
package/src/commands/runtime.ts
DELETED
|
@@ -1,473 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* pd runtime probe command — Runtime health and capabilities inspection.
|
|
3
|
-
*
|
|
4
|
-
* Usage:
|
|
5
|
-
* pd runtime probe --runtime openclaw-cli [--openclaw-local|--openclaw-gateway] [--json]
|
|
6
|
-
* pd runtime probe --runtime pi-ai --provider <name> --model <id> --apiKeyEnv <name> [--baseUrl <url>] [--json]
|
|
7
|
-
*
|
|
8
|
-
* HG-01 HARD GATE: This command must deliver.
|
|
9
|
-
*/
|
|
10
|
-
import * as path from 'path';
|
|
11
|
-
import type { Command } from 'commander';
|
|
12
|
-
import { probeRuntime, PDRuntimeError, isRuntimeConfigError } from '@principles/core/runtime-v2';
|
|
13
|
-
import { resolveRuntimeFromPdConfig, resolveRuntimeWithOverrides } from '../services/resolve-runtime-from-pd-config.js';
|
|
14
|
-
|
|
15
|
-
interface RuntimeProbeOptions {
|
|
16
|
-
runtime: string;
|
|
17
|
-
openclawLocal?: boolean;
|
|
18
|
-
openclawGateway?: boolean;
|
|
19
|
-
agent?: string;
|
|
20
|
-
provider?: string;
|
|
21
|
-
model?: string;
|
|
22
|
-
apiKeyEnv?: string;
|
|
23
|
-
baseUrl?: string;
|
|
24
|
-
maxRetries?: number;
|
|
25
|
-
timeoutMs?: number;
|
|
26
|
-
workspace?: string;
|
|
27
|
-
json?: boolean;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Format capabilities as a key-value table for console output.
|
|
32
|
-
*/
|
|
33
|
-
function formatCapabilitiesTable(capabilities: Record<string, unknown>): string {
|
|
34
|
-
const lines: string[] = [];
|
|
35
|
-
for (const [key, value] of Object.entries(capabilities)) {
|
|
36
|
-
const displayValue = typeof value === 'boolean' ? (value ? 'yes' : 'no') : String(value);
|
|
37
|
-
lines.push(` ${key.padEnd(40)} ${displayValue}`);
|
|
38
|
-
}
|
|
39
|
-
return lines.join('\n');
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* openclaw-cli probe branch (existing behavior, unchanged).
|
|
44
|
-
*/
|
|
45
|
-
async function handleOpenClawProbe(opts: RuntimeProbeOptions): Promise<void> {
|
|
46
|
-
// Validate mutually exclusive flags (HG-03)
|
|
47
|
-
if (opts.openclawLocal && opts.openclawGateway) {
|
|
48
|
-
console.error('error: --openclaw-local and --openclaw-gateway are mutually exclusive');
|
|
49
|
-
process.exit(1);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// Require explicit runtime mode (HG-03, DPB-09)
|
|
53
|
-
if (!opts.openclawLocal && !opts.openclawGateway) {
|
|
54
|
-
console.error('error: --openclaw-local or --openclaw-gateway is required for --runtime openclaw-cli');
|
|
55
|
-
process.exit(1);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
const runtimeMode = opts.openclawLocal ? 'local' : 'gateway';
|
|
59
|
-
|
|
60
|
-
try {
|
|
61
|
-
const result = await probeRuntime({
|
|
62
|
-
runtimeKind: 'openclaw-cli',
|
|
63
|
-
runtimeMode,
|
|
64
|
-
agentId: opts.agent,
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
// Per finding #2: status must reflect actual health
|
|
68
|
-
// healthy=false → status=failed, exit 1
|
|
69
|
-
// healthy=true + degraded=true → status=degraded
|
|
70
|
-
// healthy=true + degraded=false → status=succeeded
|
|
71
|
-
let exitCode = 0;
|
|
72
|
-
const status = !result.health.healthy ? 'failed'
|
|
73
|
-
: result.health.degraded ? 'degraded'
|
|
74
|
-
: 'succeeded';
|
|
75
|
-
if (!result.health.healthy) exitCode = 1;
|
|
76
|
-
|
|
77
|
-
if (opts.json) {
|
|
78
|
-
console.log(JSON.stringify({
|
|
79
|
-
status,
|
|
80
|
-
runtimeKind: result.runtimeKind,
|
|
81
|
-
health: result.health,
|
|
82
|
-
capabilities: result.capabilities,
|
|
83
|
-
}, null, 2));
|
|
84
|
-
if (exitCode !== 0) {
|
|
85
|
-
process.exit(exitCode);
|
|
86
|
-
}
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// Human-readable output
|
|
91
|
-
console.log(`\nRuntime: ${result.runtimeKind}`);
|
|
92
|
-
console.log(`Mode: ${runtimeMode}`);
|
|
93
|
-
console.log(`Status: ${status}`);
|
|
94
|
-
console.log('');
|
|
95
|
-
console.log('Health:');
|
|
96
|
-
console.log(` healthy: ${result.health.healthy ? 'yes' : 'no'}`);
|
|
97
|
-
console.log(` degraded: ${result.health.degraded ? 'yes' : 'no'}`);
|
|
98
|
-
if (result.health.warnings.length > 0) {
|
|
99
|
-
console.log(` warnings:`);
|
|
100
|
-
for (const w of result.health.warnings) {
|
|
101
|
-
console.log(` - ${w}`);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
console.log(` lastCheckedAt: ${result.health.lastCheckedAt}`);
|
|
105
|
-
console.log('');
|
|
106
|
-
console.log('Capabilities:');
|
|
107
|
-
console.log(formatCapabilitiesTable(result.capabilities));
|
|
108
|
-
console.log('');
|
|
109
|
-
|
|
110
|
-
if (exitCode !== 0) {
|
|
111
|
-
process.exit(exitCode);
|
|
112
|
-
}
|
|
113
|
-
} catch (error: unknown) {
|
|
114
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
115
|
-
let errorCategory = 'execution_failed';
|
|
116
|
-
if (error instanceof PDRuntimeError) {
|
|
117
|
-
errorCategory = error.category;
|
|
118
|
-
}
|
|
119
|
-
if (opts.json) {
|
|
120
|
-
console.log(JSON.stringify({
|
|
121
|
-
status: 'failed',
|
|
122
|
-
errorCategory,
|
|
123
|
-
message,
|
|
124
|
-
runtimeKind: 'openclaw-cli',
|
|
125
|
-
}, null, 2));
|
|
126
|
-
} else {
|
|
127
|
-
console.error(`error: ${message} (${errorCategory})`);
|
|
128
|
-
}
|
|
129
|
-
process.exit(1);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* pi-ai probe branch — validates flags, calls probeRuntime, formats output.
|
|
135
|
-
*
|
|
136
|
-
* PRI-402: When --workspace is provided without explicit --provider,
|
|
137
|
-
* reads pi-ai config from .pd/config.yaml via resolveRuntimeWithOverrides.
|
|
138
|
-
* JSON output includes configSource, runtimeProfileId, runtimeProfileLabel
|
|
139
|
-
* for alignment with `pd config doctor`.
|
|
140
|
-
*/
|
|
141
|
-
async function handlePiAiProbe(opts: RuntimeProbeOptions): Promise<void> {
|
|
142
|
-
// D-01: flags are required for pi-ai probe unless --workspace is provided (policy fallback)
|
|
143
|
-
const workspaceDir = opts.workspace ? path.resolve(opts.workspace) : undefined;
|
|
144
|
-
let provider = opts.provider ?? '';
|
|
145
|
-
let model = opts.model ?? '';
|
|
146
|
-
let apiKeyEnv = opts.apiKeyEnv ?? '';
|
|
147
|
-
let baseUrl = opts.baseUrl ?? '';
|
|
148
|
-
let { timeoutMs, maxRetries } = opts;
|
|
149
|
-
|
|
150
|
-
// PRI-402: Track config source and profile info for JSON output
|
|
151
|
-
let configSource: string | null = null;
|
|
152
|
-
let runtimeProfileId: string | null = null;
|
|
153
|
-
let runtimeProfileLabel: string | null = null;
|
|
154
|
-
|
|
155
|
-
// PRI-393: always load workspace policy from .pd/config.yaml (not .state/workflows.yaml)
|
|
156
|
-
if (workspaceDir) {
|
|
157
|
-
const resolved = resolveRuntimeWithOverrides(workspaceDir, {
|
|
158
|
-
provider: opts.provider,
|
|
159
|
-
model: opts.model,
|
|
160
|
-
apiKeyEnv: opts.apiKeyEnv,
|
|
161
|
-
baseUrl: opts.baseUrl,
|
|
162
|
-
maxRetries: opts.maxRetries,
|
|
163
|
-
timeoutMs: opts.timeoutMs,
|
|
164
|
-
});
|
|
165
|
-
for (const w of resolved.legacyWarnings) console.warn(`Warning: ${w}`);
|
|
166
|
-
|
|
167
|
-
// PRI-402: capture profile info regardless of merge result
|
|
168
|
-
({ configSource, runtimeProfileId, runtimeProfileLabel } = resolved);
|
|
169
|
-
|
|
170
|
-
if (resolved.mergedConfig) {
|
|
171
|
-
provider = provider || resolved.mergedConfig.provider || '';
|
|
172
|
-
model = model || resolved.mergedConfig.model || '';
|
|
173
|
-
apiKeyEnv = apiKeyEnv || resolved.mergedConfig.apiKeyEnv || '';
|
|
174
|
-
baseUrl = baseUrl || resolved.mergedConfig.baseUrl || '';
|
|
175
|
-
timeoutMs = timeoutMs ?? resolved.mergedConfig.timeoutMs;
|
|
176
|
-
maxRetries = maxRetries ?? resolved.mergedConfig.maxRetries;
|
|
177
|
-
} else if (isRuntimeConfigError(resolved.result)) {
|
|
178
|
-
// PRI-402: fail-loud JSON when config.yaml is broken (EP-03, EP-04)
|
|
179
|
-
if (opts.json) {
|
|
180
|
-
console.log(JSON.stringify({
|
|
181
|
-
ok: false,
|
|
182
|
-
status: 'failed',
|
|
183
|
-
reason: resolved.result.reason,
|
|
184
|
-
message: resolved.result.message,
|
|
185
|
-
nextAction: resolved.result.nextAction,
|
|
186
|
-
configSource: resolved.configSource,
|
|
187
|
-
}, null, 2));
|
|
188
|
-
} else {
|
|
189
|
-
console.error(`error: could not resolve runtime from .pd/config.yaml — ${resolved.result.message}`);
|
|
190
|
-
console.error(`nextAction: ${resolved.result.nextAction}`);
|
|
191
|
-
}
|
|
192
|
-
process.exit(1);
|
|
193
|
-
return;
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
if (!provider) {
|
|
198
|
-
// PRI-402: fail-loud JSON when provider is missing (EP-03, EP-04)
|
|
199
|
-
if (opts.json) {
|
|
200
|
-
console.log(JSON.stringify({
|
|
201
|
-
ok: false,
|
|
202
|
-
status: 'failed',
|
|
203
|
-
reason: 'provider_missing',
|
|
204
|
-
message: '--provider is required for --runtime pi-ai (or set in .pd/config.yaml)',
|
|
205
|
-
nextAction: 'Set provider in .pd/config.yaml runtimeProfiles, or pass --provider explicitly',
|
|
206
|
-
configSource,
|
|
207
|
-
}, null, 2));
|
|
208
|
-
} else {
|
|
209
|
-
console.error("error: --provider is required for --runtime pi-ai (or set in .pd/config.yaml)");
|
|
210
|
-
console.error(" e.g.: pd runtime probe --runtime pi-ai --provider openrouter --model anthropic/claude-sonnet-4 --apiKeyEnv OPENROUTER_API_KEY");
|
|
211
|
-
}
|
|
212
|
-
process.exit(1);
|
|
213
|
-
return;
|
|
214
|
-
}
|
|
215
|
-
if (!model) {
|
|
216
|
-
if (opts.json) {
|
|
217
|
-
console.log(JSON.stringify({
|
|
218
|
-
ok: false,
|
|
219
|
-
status: 'failed',
|
|
220
|
-
reason: 'model_missing',
|
|
221
|
-
message: '--model is required for --runtime pi-ai (or set in .pd/config.yaml)',
|
|
222
|
-
nextAction: 'Set model in .pd/config.yaml runtimeProfiles, or pass --model explicitly',
|
|
223
|
-
configSource,
|
|
224
|
-
}, null, 2));
|
|
225
|
-
} else {
|
|
226
|
-
console.error("error: --model is required for --runtime pi-ai (or set in .pd/config.yaml)");
|
|
227
|
-
console.error(" e.g.: pd runtime probe --runtime pi-ai --provider openrouter --model anthropic/claude-sonnet-4 --apiKeyEnv OPENROUTER_API_KEY");
|
|
228
|
-
}
|
|
229
|
-
process.exit(1);
|
|
230
|
-
return;
|
|
231
|
-
}
|
|
232
|
-
if (!apiKeyEnv) {
|
|
233
|
-
if (opts.json) {
|
|
234
|
-
console.log(JSON.stringify({
|
|
235
|
-
ok: false,
|
|
236
|
-
status: 'failed',
|
|
237
|
-
reason: 'apiKeyEnv_missing',
|
|
238
|
-
message: '--apiKeyEnv is required for --runtime pi-ai (or set in .pd/config.yaml)',
|
|
239
|
-
nextAction: 'Set apiKeyEnv in .pd/config.yaml runtimeProfiles, or pass --apiKeyEnv explicitly',
|
|
240
|
-
configSource,
|
|
241
|
-
}, null, 2));
|
|
242
|
-
} else {
|
|
243
|
-
console.error("error: --apiKeyEnv is required for --runtime pi-ai (or set in .pd/config.yaml)");
|
|
244
|
-
console.error(" e.g.: pd runtime probe --runtime pi-ai --provider openrouter --model anthropic/claude-sonnet-4 --apiKeyEnv OPENROUTER_API_KEY");
|
|
245
|
-
}
|
|
246
|
-
process.exit(1);
|
|
247
|
-
return;
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
// D-09: check env var exists before calling probeRuntime
|
|
251
|
-
if (!process.env[apiKeyEnv]) {
|
|
252
|
-
if (opts.json) {
|
|
253
|
-
console.log(JSON.stringify({
|
|
254
|
-
ok: false,
|
|
255
|
-
status: 'failed',
|
|
256
|
-
reason: 'api_key_not_set',
|
|
257
|
-
message: `Environment variable '${apiKeyEnv}' is not set`,
|
|
258
|
-
nextAction: `Set the environment variable '${apiKeyEnv}' with a valid API key`,
|
|
259
|
-
configSource,
|
|
260
|
-
}, null, 2));
|
|
261
|
-
} else {
|
|
262
|
-
console.error(`error: environment variable '${apiKeyEnv}' is not set`);
|
|
263
|
-
}
|
|
264
|
-
process.exit(1);
|
|
265
|
-
return;
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
try {
|
|
269
|
-
const result = await probeRuntime({
|
|
270
|
-
runtimeKind: 'pi-ai',
|
|
271
|
-
provider,
|
|
272
|
-
model,
|
|
273
|
-
apiKeyEnv,
|
|
274
|
-
baseUrl,
|
|
275
|
-
maxRetries: maxRetries,
|
|
276
|
-
timeoutMs: timeoutMs ?? 120_000, // D-04: probe timeout 120s (matches Runtime defaults)
|
|
277
|
-
});
|
|
278
|
-
|
|
279
|
-
// Narrow to pi-ai result (TypeScript can't infer from input args alone)
|
|
280
|
-
if (result.runtimeKind !== 'pi-ai') {
|
|
281
|
-
throw new Error('unexpected: probeRuntime returned non-pi-ai result');
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
// Determine status from health
|
|
285
|
-
let exitCode = 0;
|
|
286
|
-
const status = !result.health.healthy ? 'failed'
|
|
287
|
-
: result.health.degraded ? 'degraded'
|
|
288
|
-
: 'succeeded';
|
|
289
|
-
if (!result.health.healthy) exitCode = 1;
|
|
290
|
-
|
|
291
|
-
if (opts.json) {
|
|
292
|
-
// PRI-402: include configSource, runtimeProfileId, runtimeProfileLabel in JSON output
|
|
293
|
-
const jsonOutput: Record<string, unknown> = {
|
|
294
|
-
ok: result.health.healthy,
|
|
295
|
-
status,
|
|
296
|
-
runtimeKind: result.runtimeKind,
|
|
297
|
-
provider: result.provider,
|
|
298
|
-
model: result.model,
|
|
299
|
-
baseUrlPresent: !!baseUrl,
|
|
300
|
-
health: result.health,
|
|
301
|
-
capabilities: result.capabilities,
|
|
302
|
-
};
|
|
303
|
-
if (configSource) jsonOutput.configSource = configSource;
|
|
304
|
-
if (runtimeProfileId) jsonOutput.runtimeProfileId = runtimeProfileId;
|
|
305
|
-
if (runtimeProfileLabel) jsonOutput.runtimeProfileLabel = runtimeProfileLabel;
|
|
306
|
-
console.log(JSON.stringify(jsonOutput, null, 2));
|
|
307
|
-
if (exitCode !== 0) process.exit(exitCode);
|
|
308
|
-
return;
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
// D-05: human-readable output
|
|
312
|
-
console.log(`\nRuntime: ${result.runtimeKind}`);
|
|
313
|
-
console.log(`Provider: ${result.provider}`);
|
|
314
|
-
console.log(`Model: ${result.model}`);
|
|
315
|
-
if (baseUrl) console.log(`BaseUrl: ${baseUrl}`);
|
|
316
|
-
if (runtimeProfileLabel) console.log(`Profile: ${runtimeProfileLabel}`);
|
|
317
|
-
if (configSource) console.log(`Config: ${configSource}`);
|
|
318
|
-
console.log(`Status: ${status}`);
|
|
319
|
-
console.log('');
|
|
320
|
-
console.log('Health:');
|
|
321
|
-
console.log(` healthy: ${result.health.healthy ? 'yes' : 'no'}`);
|
|
322
|
-
console.log(` degraded: ${result.health.degraded ? 'yes' : 'no'}`);
|
|
323
|
-
if (result.health.warnings.length > 0) {
|
|
324
|
-
console.log(' warnings:');
|
|
325
|
-
for (const w of result.health.warnings) {
|
|
326
|
-
console.log(` - ${w}`);
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
console.log(` lastCheckedAt: ${result.health.lastCheckedAt}`);
|
|
330
|
-
console.log('');
|
|
331
|
-
console.log('Capabilities:');
|
|
332
|
-
console.log(formatCapabilitiesTable(result.capabilities));
|
|
333
|
-
console.log('');
|
|
334
|
-
|
|
335
|
-
if (exitCode !== 0) process.exit(exitCode);
|
|
336
|
-
} catch (error: unknown) {
|
|
337
|
-
// D-10: test complete failure → error category + raw error
|
|
338
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
339
|
-
let errorCategory = 'execution_failed';
|
|
340
|
-
if (error instanceof PDRuntimeError) {
|
|
341
|
-
errorCategory = error.category;
|
|
342
|
-
}
|
|
343
|
-
if (opts.json) {
|
|
344
|
-
console.log(JSON.stringify({
|
|
345
|
-
ok: false,
|
|
346
|
-
status: 'failed',
|
|
347
|
-
errorCategory,
|
|
348
|
-
message,
|
|
349
|
-
runtimeKind: 'pi-ai',
|
|
350
|
-
configSource,
|
|
351
|
-
}, null, 2));
|
|
352
|
-
} else {
|
|
353
|
-
console.error(`error: ${message} (${errorCategory})`);
|
|
354
|
-
}
|
|
355
|
-
process.exit(1);
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
/**
|
|
360
|
-
* --runtime config probe branch — PRI-393
|
|
361
|
-
* Resolves runtime from .pd/config.yaml, then dispatches to pi-ai or openclaw-cli probe.
|
|
362
|
-
*/
|
|
363
|
-
async function handleConfigProbe(opts: RuntimeProbeOptions): Promise<void> {
|
|
364
|
-
const workspaceDir = opts.workspace ? path.resolve(opts.workspace) : undefined;
|
|
365
|
-
if (!workspaceDir) {
|
|
366
|
-
if (opts.json) {
|
|
367
|
-
console.log(JSON.stringify({
|
|
368
|
-
ok: false,
|
|
369
|
-
status: 'failed',
|
|
370
|
-
reason: 'workspace_missing',
|
|
371
|
-
message: '--workspace is required for --runtime config',
|
|
372
|
-
nextAction: 'Provide --workspace <path> pointing to a PD workspace directory',
|
|
373
|
-
}, null, 2));
|
|
374
|
-
} else {
|
|
375
|
-
console.error('error: --workspace is required for --runtime config');
|
|
376
|
-
}
|
|
377
|
-
process.exit(1);
|
|
378
|
-
return;
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
const resolved = resolveRuntimeFromPdConfig(workspaceDir);
|
|
382
|
-
for (const w of resolved.legacyWarnings) console.warn(`Warning: ${w}`);
|
|
383
|
-
|
|
384
|
-
if (isRuntimeConfigError(resolved.result)) {
|
|
385
|
-
if (opts.json) {
|
|
386
|
-
console.log(JSON.stringify({
|
|
387
|
-
ok: false,
|
|
388
|
-
status: 'failed',
|
|
389
|
-
errorCategory: 'config_error',
|
|
390
|
-
message: resolved.result.message,
|
|
391
|
-
reason: resolved.result.reason,
|
|
392
|
-
nextAction: resolved.result.nextAction,
|
|
393
|
-
configSource: resolved.configSource,
|
|
394
|
-
}, null, 2));
|
|
395
|
-
} else {
|
|
396
|
-
console.error(`error: ${resolved.result.message}`);
|
|
397
|
-
console.error(`nextAction: ${resolved.result.nextAction}`);
|
|
398
|
-
}
|
|
399
|
-
process.exit(1);
|
|
400
|
-
return;
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
const config = resolved.result;
|
|
404
|
-
// Dispatch to the appropriate runtime probe
|
|
405
|
-
if (config.runtimeKind === 'pi-ai') {
|
|
406
|
-
return handlePiAiProbe({
|
|
407
|
-
...opts,
|
|
408
|
-
provider: opts.provider ?? config.provider,
|
|
409
|
-
model: opts.model ?? config.model,
|
|
410
|
-
apiKeyEnv: opts.apiKeyEnv ?? config.apiKeyEnv,
|
|
411
|
-
baseUrl: opts.baseUrl ?? config.baseUrl,
|
|
412
|
-
timeoutMs: opts.timeoutMs ?? config.timeoutMs,
|
|
413
|
-
});
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
if (config.runtimeKind === 'openclaw-cli') {
|
|
417
|
-
return handleOpenClawProbe({
|
|
418
|
-
...opts,
|
|
419
|
-
openclawLocal: config.openclawMode === 'local' ? true : opts.openclawLocal,
|
|
420
|
-
openclawGateway: config.openclawMode === 'gateway' ? true : opts.openclawGateway,
|
|
421
|
-
});
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
console.error(`error: unsupported runtimeKind '${config.runtimeKind}' from .pd/config.yaml`);
|
|
425
|
-
process.exit(1);
|
|
426
|
-
return;
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
/**
|
|
430
|
-
* pd runtime probe — dispatches to openclaw-cli, pi-ai, or config branch.
|
|
431
|
-
*/
|
|
432
|
-
export async function handleRuntimeProbe(opts: RuntimeProbeOptions): Promise<void> {
|
|
433
|
-
if (opts.runtime === 'openclaw-cli') {
|
|
434
|
-
return handleOpenClawProbe(opts);
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
if (opts.runtime === 'pi-ai') {
|
|
438
|
-
return handlePiAiProbe(opts);
|
|
439
|
-
}
|
|
440
|
-
|
|
441
|
-
if (opts.runtime === 'config') {
|
|
442
|
-
return handleConfigProbe(opts);
|
|
443
|
-
}
|
|
444
|
-
|
|
445
|
-
console.error(`error: unsupported --runtime '${opts.runtime}' (supported: openclaw-cli, pi-ai, config)`);
|
|
446
|
-
process.exit(1);
|
|
447
|
-
return;
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
/**
|
|
451
|
-
* Register the `pd runtime probe` command on a Commander instance.
|
|
452
|
-
* Used by index.ts and tests to ensure real command wiring is verified (EP-04).
|
|
453
|
-
*/
|
|
454
|
-
export function registerRuntimeProbeCommand(runtimeCmd: Command): Command {
|
|
455
|
-
return runtimeCmd
|
|
456
|
-
.command('probe', { hidden: true })
|
|
457
|
-
.description('Probe runtime health and capabilities (HG-01 HARD GATE)')
|
|
458
|
-
.requiredOption('-r, --runtime <kind>', "Runtime kind: 'openclaw-cli', 'pi-ai', or 'config'")
|
|
459
|
-
.option('--openclaw-local', 'Use local OpenClaw (mutually exclusive with --openclaw-gateway)')
|
|
460
|
-
.option('--openclaw-gateway', 'Use gateway OpenClaw (mutually exclusive with --openclaw-local)')
|
|
461
|
-
.option('-a, --agent <agentId>', 'Agent ID to probe')
|
|
462
|
-
.option('--provider <name>', 'LLM provider (e.g., openrouter) \u2014 for pi-ai, falls back to .pd/config.yaml')
|
|
463
|
-
.option('--model <id>', 'Model ID (e.g., anthropic/claude-sonnet-4) \u2014 for pi-ai, falls back to .pd/config.yaml')
|
|
464
|
-
.option('--apiKeyEnv <name>', 'Env var name for API key (e.g., OPENROUTER_API_KEY) \u2014 for pi-ai, falls back to .pd/config.yaml')
|
|
465
|
-
.option('--baseUrl <url>', 'Custom base URL for OpenAI-compatible providers \u2014 for pi-ai, falls back to .pd/config.yaml')
|
|
466
|
-
.option('--maxRetries <n>', 'Max retry attempts for LLM failures', parseInt)
|
|
467
|
-
.option('--timeoutMs <ms>', 'Timeout in milliseconds for probe', parseInt)
|
|
468
|
-
.option('-w, --workspace <path>', 'Workspace directory \u2014 loads pi-ai config from .pd/config.yaml')
|
|
469
|
-
.option('--json', 'Output raw JSON')
|
|
470
|
-
.action(async (opts) => {
|
|
471
|
-
await handleRuntimeProbe(opts);
|
|
472
|
-
});
|
|
473
|
-
}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* pd samples list command implementation.
|
|
3
|
-
*
|
|
4
|
-
* Usage: pd samples list [--status pending|approved|rejected]
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { listCorrectionSamples, TrajectoryDbUnavailableError } from '@principles/core/trajectory-store';
|
|
8
|
-
import { resolveWorkspaceDir } from '../resolve-workspace.js';
|
|
9
|
-
import { exitWithTrajectoryDbUnavailable } from './trajectory-db-unavailable.js';
|
|
10
|
-
|
|
11
|
-
interface SamplesListOptions {
|
|
12
|
-
status?: 'pending' | 'approved' | 'rejected';
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export async function handleSamplesList(opts: SamplesListOptions): Promise<void> {
|
|
16
|
-
const workspaceDir = resolveWorkspaceDir();
|
|
17
|
-
const status = opts.status ?? 'pending';
|
|
18
|
-
|
|
19
|
-
let samples;
|
|
20
|
-
try {
|
|
21
|
-
samples = listCorrectionSamples(workspaceDir, status);
|
|
22
|
-
} catch (err) {
|
|
23
|
-
if (err instanceof TrajectoryDbUnavailableError) {
|
|
24
|
-
return exitWithTrajectoryDbUnavailable(err);
|
|
25
|
-
}
|
|
26
|
-
throw err;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
if (samples.length === 0) {
|
|
30
|
-
console.log('No correction samples found.');
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
console.log(`Correction Samples (${status}):`);
|
|
35
|
-
for (const sample of samples) {
|
|
36
|
-
console.log(` [${sample.sampleId}] session=${sample.sessionId} score=${sample.qualityScore} created=${sample.createdAt}`);
|
|
37
|
-
}
|
|
38
|
-
console.log(`${samples.length} sample(s)`);
|
|
39
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* pd samples review command implementation.
|
|
3
|
-
*
|
|
4
|
-
* Usage: pd samples review <sample-id> approve|reject [note]
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { reviewCorrectionSample, TrajectoryDbUnavailableError } from '@principles/core/trajectory-store';
|
|
8
|
-
import { resolveWorkspaceDir } from '../resolve-workspace.js';
|
|
9
|
-
import { exitWithTrajectoryDbUnavailable } from './trajectory-db-unavailable.js';
|
|
10
|
-
|
|
11
|
-
type ReviewDecision = 'approved' | 'rejected';
|
|
12
|
-
|
|
13
|
-
interface SamplesReviewOptions {
|
|
14
|
-
sampleId: string;
|
|
15
|
-
decision: ReviewDecision;
|
|
16
|
-
note?: string;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export async function handleSamplesReview(opts: SamplesReviewOptions): Promise<void> {
|
|
20
|
-
const workspaceDir = resolveWorkspaceDir();
|
|
21
|
-
|
|
22
|
-
try {
|
|
23
|
-
reviewCorrectionSample(opts.sampleId, opts.decision, opts.note, workspaceDir);
|
|
24
|
-
} catch (err) {
|
|
25
|
-
if (err instanceof TrajectoryDbUnavailableError) {
|
|
26
|
-
return exitWithTrajectoryDbUnavailable(err);
|
|
27
|
-
}
|
|
28
|
-
if (err instanceof Error && err.message.includes('Sample not found')) {
|
|
29
|
-
console.error(`Error: Sample not found: ${opts.sampleId}`);
|
|
30
|
-
process.exit(1);
|
|
31
|
-
}
|
|
32
|
-
throw err;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
console.log(`Sample ${opts.sampleId} marked as ${opts.decision}`);
|
|
36
|
-
}
|