principles-disciple 1.72.0 → 1.73.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/openclaw.plugin.json +10 -5
- package/package.json +17 -19
- package/scripts/acceptance-test.mjs +16 -73
- package/scripts/sync-plugin.mjs +382 -77
- package/src/commands/archive-impl.ts +2 -1
- package/src/commands/capabilities.ts +2 -2
- package/src/commands/context.ts +2 -2
- package/src/commands/disable-impl.ts +2 -1
- package/src/commands/evolution-status.ts +16 -16
- package/src/commands/export.ts +12 -67
- package/src/commands/pain.ts +91 -1
- package/src/commands/principle-rollback.ts +2 -1
- package/src/commands/promote-impl.ts +7 -43
- package/src/commands/rollback-impl.ts +2 -1
- package/src/commands/rollback.ts +2 -1
- package/src/commands/samples.ts +2 -1
- package/src/commands/thinking-os.ts +2 -1
- package/src/config/errors.ts +18 -2
- package/src/constants/diagnostician.ts +2 -2
- package/src/constants/tools.ts +2 -1
- package/src/core/__tests__/focus-history.test.ts +210 -0
- package/src/core/config.ts +1 -1
- package/src/core/confirm-first-gate.ts +255 -0
- package/src/core/correction-cue-learner.ts +2 -136
- package/src/core/correction-types.ts +16 -88
- package/src/core/dictionary.ts +19 -20
- package/src/core/empathy-keyword-matcher.ts +17 -289
- package/src/core/empathy-types.ts +18 -229
- package/src/core/event-log.ts +38 -132
- package/src/core/evolution-reducer.ts +21 -2
- package/src/core/evolution-types.ts +76 -464
- package/src/core/file-store.ts +80 -0
- package/src/core/focus-history.ts +228 -955
- package/src/core/local-worker-routing.ts +34 -314
- package/src/core/merge-gate-audit.ts +0 -195
- package/src/core/pain-diagnostic-gate.ts +154 -0
- package/src/core/pain-signal.ts +21 -138
- package/src/core/pain.ts +15 -88
- package/src/core/pd-task-reconciler.ts +26 -115
- package/src/core/pd-task-service.ts +9 -9
- package/src/core/pd-task-types.ts +23 -127
- package/src/core/principle-compiler/__tests__/compiler-replay-gate.test.ts +174 -0
- package/src/core/principle-compiler/code-validator.ts +15 -42
- package/src/core/principle-compiler/compiler.ts +100 -15
- package/src/core/principle-compiler/index.ts +5 -2
- package/src/core/principle-compiler/template-generator.ts +4 -104
- package/src/core/principle-injection.ts +10 -202
- package/src/core/principle-internalization/filesystem-lifecycle-datasource.ts +42 -0
- package/src/core/principle-internalization/lifecycle-read-model.ts +39 -242
- package/src/core/principle-internalization/principle-lifecycle-service.ts +12 -10
- package/src/core/principle-tree-ledger-adapter.ts +145 -0
- package/src/core/principle-tree-ledger.ts +8 -6
- package/src/core/reflection/reflection-context.ts +14 -109
- package/src/core/replay-engine.ts +8 -500
- package/src/core/rule-host-helpers.ts +5 -35
- package/src/core/rule-host-types.ts +10 -82
- package/src/core/rule-host.ts +6 -63
- package/src/core/runtime-v2-prompt-activation-reader.ts +231 -0
- package/src/core/session-tracker.ts +87 -101
- package/src/core/shadow-observation-registry.ts +19 -48
- package/src/core/trajectory.ts +3 -1
- package/src/core/workflow-funnel-loader.ts +62 -68
- package/src/core/workspace-context.ts +46 -0
- package/src/core/workspace-dir-service.ts +1 -1
- package/src/core/workspace-dir-validation.ts +18 -9
- package/src/hooks/AGENTS.md +1 -1
- package/src/hooks/gate-block-helper.ts +46 -44
- package/src/hooks/gate.ts +207 -7
- package/src/hooks/lifecycle.ts +30 -32
- package/src/hooks/llm.ts +60 -32
- package/src/hooks/pain.ts +297 -103
- package/src/hooks/prompt.ts +459 -439
- package/src/hooks/subagent.ts +2 -29
- package/src/i18n/commands.ts +2 -10
- package/src/index.ts +95 -85
- package/src/openclaw-sdk.ts +311 -0
- package/src/service/central-database.ts +8 -4
- package/src/service/evolution-queue-migration.ts +2 -1
- package/src/service/evolution-worker.ts +163 -1786
- package/src/service/internalization-trigger-adapter.ts +302 -0
- package/src/service/keyword-optimization-service.ts +4 -4
- package/src/service/monitoring-query-service.ts +1 -215
- package/src/service/queue-io.ts +60 -331
- package/src/service/runtime-summary-service.ts +59 -16
- package/src/service/subagent-workflow/index.ts +0 -41
- package/src/service/subagent-workflow/types.ts +9 -120
- package/src/service/subagent-workflow/workflow-store.ts +2 -119
- package/src/service/workflow-watchdog.ts +0 -43
- package/src/types/event-payload.ts +16 -74
- package/src/types/event-types.ts +39 -547
- package/src/types/hygiene-types.ts +7 -30
- package/src/types/principle-tree-schema.ts +20 -222
- package/src/types/queue.ts +15 -70
- package/src/types/runtime-summary.ts +5 -49
- package/src/utils/io.ts +10 -0
- package/src/utils/retry.ts +1 -1
- package/src/utils/shadow-fingerprint.ts +2 -2
- package/src/utils/workspace-resolver.ts +50 -0
- package/templates/langs/en/core/AGENTS.md +2 -2
- package/templates/langs/en/core/BOOT.md +1 -1
- package/templates/langs/en/core/HEARTBEAT.md +2 -2
- package/templates/langs/en/skills/ai-sprint-orchestration/references/agent-registry.json +1 -72
- package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/bugfix-complex-template.json +6 -6
- package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/feature-complex-template.json +6 -6
- package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal-verify.json +2 -12
- package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal.json +2 -12
- package/templates/langs/en/skills/ai-sprint-orchestration/runtime/.gitignore +2 -2
- package/templates/langs/en/skills/ai-sprint-orchestration/scripts/run.mjs +51 -15
- package/templates/langs/en/skills/evolve-task/SKILL.md +1 -1
- package/templates/langs/en/skills/pd-cli-operator/SKILL.md +67 -0
- package/templates/langs/en/skills/pd-diagnostician/SKILL.md +1 -1
- package/templates/langs/en/skills/pd-mentor/SKILL.md +1 -1
- package/templates/langs/en/skills/pd-pain-signal/SKILL.md +17 -39
- package/templates/langs/en/skills/pd-runtime-v2/SKILL.md +61 -0
- package/templates/langs/zh/core/AGENTS.md +2 -2
- package/templates/langs/zh/core/BOOT.md +1 -1
- package/templates/langs/zh/core/HEARTBEAT.md +2 -2
- package/templates/langs/zh/skills/ai-sprint-orchestration/references/agent-registry.json +1 -72
- package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/bugfix-complex-template.json +6 -6
- package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/feature-complex-template.json +6 -6
- package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/nocturnal-trinity-quality-enhancement.json +8 -8
- package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal-verify.json +2 -12
- package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal.json +2 -12
- package/templates/langs/zh/skills/ai-sprint-orchestration/runtime/.gitignore +2 -2
- package/templates/langs/zh/skills/ai-sprint-orchestration/scripts/run.mjs +51 -15
- package/templates/langs/zh/skills/ai-sprint-orchestration/test/run.test.mjs +21 -5
- package/templates/langs/zh/skills/evolve-task/SKILL.md +2 -2
- package/templates/langs/zh/skills/pd-cli-operator/SKILL.md +67 -0
- package/templates/langs/zh/skills/pd-diagnostician/SKILL.md +1 -1
- package/templates/langs/zh/skills/pd-mentor/SKILL.md +1 -1
- package/templates/langs/zh/skills/pd-pain-signal/SKILL.md +17 -38
- package/templates/langs/zh/skills/pd-runtime-v2/SKILL.md +61 -0
- package/tests/build-artifacts.test.ts +1 -3
- package/tests/commands/evolution-status.test.ts +0 -118
- package/tests/core/bootstrap-rules.test.ts +1 -1
- package/tests/core/config.test.ts +1 -1
- package/tests/core/event-log.test.ts +35 -0
- package/tests/core/evolution-engine.test.ts +610 -0
- package/tests/core/file-store.test.ts +102 -0
- package/tests/core/focus-history.test.ts +203 -11
- package/tests/core/merge-gate-audit.test.ts +2 -169
- package/tests/core/model-deployment-registry.test.ts +7 -1
- package/tests/core/model-training-registry.test.ts +19 -0
- package/tests/core/observability.test.ts +0 -1
- package/tests/core/pain-diagnostic-gate.test.ts +498 -0
- package/tests/core/pain.test.ts +0 -1
- package/tests/core/principle-internalization/deprecated-readiness.test.ts +2 -2
- package/tests/core/principle-internalization/lifecycle-metrics.test.ts +2 -2
- package/tests/core/principle-internalization/{internalization-routing-policy.test.ts → lifecycle-routing-policy.test.ts} +6 -6
- package/tests/core/principle-internalization/lineage-source-retired.test.ts +56 -0
- package/tests/core/principle-internalization/principle-lifecycle-service.test.ts +1 -23
- package/tests/core/principle-tree-ledger-adapter.test.ts +253 -0
- package/tests/core/reflection-context.test.ts +0 -14
- package/tests/core/replay-engine.test.ts +127 -215
- package/tests/core/rule-host-helpers.test.ts +2 -2
- package/tests/core/rule-implementation-runtime.test.ts +0 -27
- package/tests/core/workflow-funnel-loader.test.ts +162 -0
- package/tests/core/workspace-dir-validation.test.ts +8 -1
- package/tests/core-anti-growth.test.ts +192 -0
- package/tests/hook-workspace-nextaction-contract.test.ts +42 -0
- package/tests/hooks/confirm-first-gate.test.ts +333 -0
- package/tests/hooks/gate-auto-correct-shadow.test.ts +310 -0
- package/tests/hooks/gate-auto-correct.test.ts +665 -0
- package/tests/hooks/gate-rule-host-pipeline.test.ts +2 -1
- package/tests/hooks/pain.test.ts +269 -12
- package/tests/hooks/prompt-characterization.test.ts +500 -0
- package/tests/hooks/prompt-size-guard.test.ts +32 -17
- package/tests/hooks/runtime-v2-prompt-activation.test.ts +869 -0
- package/tests/index.test.ts +94 -1
- package/tests/integration/auto-entry-gate.test.ts +248 -0
- package/tests/integration/internalization-trigger-guard.test.ts +69 -0
- package/tests/integration/m8-legacy-paths.test.ts +63 -0
- package/tests/integration/runtime-v2-pain-guard.test.ts +125 -0
- package/tests/plugin-config-resolution-cutover.test.ts +359 -0
- package/tests/runtime-v2-discovery-guard.test.ts +154 -0
- package/tests/service/central-database.test.ts +457 -0
- package/tests/service/evolution-worker.correction-observer.test.ts +173 -0
- package/tests/service/evolution-worker.timeout.test.ts +11 -129
- package/tests/service/internalization-trigger-adapter.test.ts +251 -0
- package/tests/service/monitoring-query-service.test.ts +1 -47
- package/tests/service/queue-io.test.ts +1 -62
- package/tests/service/runtime-summary-service.test.ts +3 -1
- package/tests/service/workflow-watchdog.test.ts +0 -91
- package/tests/utils/file-lock.test.ts +5 -3
- package/tests/utils/session-key.test.ts +52 -0
- package/tests/utils/subagent-probe.test.ts +48 -1
- package/vitest.config.ts +4 -11
- package/.planning/codebase/ARCHITECTURE.md +0 -157
- package/.planning/codebase/CONCERNS.md +0 -145
- package/.planning/codebase/CONVENTIONS.md +0 -148
- package/.planning/codebase/INTEGRATIONS.md +0 -81
- package/.planning/codebase/STACK.md +0 -87
- package/.planning/codebase/STRUCTURE.md +0 -193
- package/.planning/codebase/TESTING.md +0 -243
- package/.planning/phases/01-basic-visualization/01-GAP-CLOSURE-VERIFICATION.md +0 -113
- package/docs/COMMAND_REFERENCE.md +0 -76
- package/docs/COMMAND_REFERENCE_EN.md +0 -79
- package/scripts/build-web.mjs +0 -46
- package/scripts/diagnose-nocturnal.mjs +0 -537
- package/scripts/seed-nocturnal-scenarios.mjs +0 -384
- package/src/commands/nocturnal-review.ts +0 -322
- package/src/commands/nocturnal-rollout.ts +0 -790
- package/src/commands/nocturnal-train.ts +0 -986
- package/src/commands/pd-reflect.ts +0 -88
- package/src/core/adaptive-thresholds.ts +0 -478
- package/src/core/diagnostician-task-store.ts +0 -192
- package/src/core/nocturnal-arbiter.ts +0 -715
- package/src/core/nocturnal-artifact-lineage.ts +0 -116
- package/src/core/nocturnal-artificer.ts +0 -257
- package/src/core/nocturnal-candidate-scoring.ts +0 -530
- package/src/core/nocturnal-compliance.ts +0 -1146
- package/src/core/nocturnal-dataset.ts +0 -763
- package/src/core/nocturnal-executability.ts +0 -428
- package/src/core/nocturnal-export.ts +0 -499
- package/src/core/nocturnal-paths.ts +0 -240
- package/src/core/nocturnal-reasoning-deriver.ts +0 -343
- package/src/core/nocturnal-rule-implementation-validator.ts +0 -246
- package/src/core/nocturnal-snapshot-contract.ts +0 -99
- package/src/core/nocturnal-trajectory-extractor.ts +0 -512
- package/src/core/nocturnal-trinity-types.ts +0 -218
- package/src/core/nocturnal-trinity.ts +0 -2680
- package/src/core/principle-internalization/deprecated-readiness.ts +0 -93
- package/src/core/principle-internalization/internalization-routing-policy.ts +0 -208
- package/src/core/principle-internalization/lifecycle-metrics.ts +0 -152
- package/src/http/principles-console-route.ts +0 -709
- package/src/service/central-health-service.ts +0 -49
- package/src/service/central-overview-service.ts +0 -138
- package/src/service/control-ui-query-service.ts +0 -900
- package/src/service/cooldown-strategy.ts +0 -97
- package/src/service/evolution-pain-context.ts +0 -79
- package/src/service/evolution-query-service.ts +0 -407
- package/src/service/health-query-service.ts +0 -1038
- package/src/service/nocturnal-config.ts +0 -214
- package/src/service/nocturnal-runtime.ts +0 -734
- package/src/service/nocturnal-service.ts +0 -1605
- package/src/service/nocturnal-target-selector.ts +0 -545
- package/src/service/sleep-cycle.ts +0 -157
- package/src/service/startup-reconciler.ts +0 -112
- package/src/service/subagent-workflow/correction-observer-types.ts +0 -82
- package/src/service/subagent-workflow/correction-observer-workflow-manager.ts +0 -250
- package/src/service/subagent-workflow/deep-reflect-workflow-manager.ts +0 -1
- package/src/service/subagent-workflow/dynamic-timeout.ts +0 -30
- package/src/service/subagent-workflow/empathy-observer-workflow-manager.ts +0 -268
- package/src/service/subagent-workflow/nocturnal-workflow-manager.ts +0 -795
- package/src/service/subagent-workflow/runtime-direct-driver.ts +0 -268
- package/src/service/subagent-workflow/workflow-manager-base.ts +0 -580
- package/src/tools/write-pain-flag.ts +0 -215
- package/tests/commands/nocturnal-review.test.ts +0 -448
- package/tests/commands/nocturnal-train.test.ts +0 -97
- package/tests/commands/pd-reflect.test.ts +0 -49
- package/tests/core/adaptive-thresholds.test.ts +0 -261
- package/tests/core/nocturnal-arbiter.test.ts +0 -559
- package/tests/core/nocturnal-artifact-lineage.test.ts +0 -53
- package/tests/core/nocturnal-artificer.test.ts +0 -241
- package/tests/core/nocturnal-candidate-scoring.test.ts +0 -532
- package/tests/core/nocturnal-compliance-p-principles.test.ts +0 -133
- package/tests/core/nocturnal-compliance.test.ts +0 -646
- package/tests/core/nocturnal-dataset.test.ts +0 -892
- package/tests/core/nocturnal-e2e.test.ts +0 -234
- package/tests/core/nocturnal-executability.test.ts +0 -357
- package/tests/core/nocturnal-export.test.ts +0 -517
- package/tests/core/nocturnal-reasoning-deriver.test.ts +0 -372
- package/tests/core/nocturnal-reviewed-subset-comparison.test.ts +0 -428
- package/tests/core/nocturnal-rule-implementation-validator.test.ts +0 -127
- package/tests/core/nocturnal-snapshot-contract.test.ts +0 -121
- package/tests/core/nocturnal-trajectory-extractor.test.ts +0 -634
- package/tests/core/nocturnal-trinity.test.ts +0 -2053
- package/tests/core/pain-auto-repair.test.ts +0 -96
- package/tests/core/pain-integration.test.ts +0 -510
- package/tests/fixtures/nocturnal-reviewed-subset.json +0 -183
- package/tests/http/principles-console-route.test.ts +0 -162
- package/tests/integration/chaos-resilience.test.ts +0 -348
- package/tests/integration/empathy-workflow-integration.test.ts +0 -626
- package/tests/integration/pain-diagnostician-loop.e2e.test.ts +0 -380
- package/tests/service/control-ui-query-service.test.ts +0 -121
- package/tests/service/cooldown-strategy.test.ts +0 -164
- package/tests/service/data-endpoints-regression.test.ts +0 -834
- package/tests/service/empathy-observer-workflow-manager.test.ts +0 -175
- package/tests/service/evolution-worker.nocturnal.test.ts +0 -601
- package/tests/service/nocturnal-runtime-hardening.test.ts +0 -118
- package/tests/service/nocturnal-runtime.test.ts +0 -473
- package/tests/service/nocturnal-service-code-candidate.test.ts +0 -330
- package/tests/service/nocturnal-target-selector.test.ts +0 -615
- package/tests/service/startup-reconciler.test.ts +0 -148
- package/tests/tools/write-pain-flag.test.ts +0 -358
- package/ui/src/App.tsx +0 -45
- package/ui/src/api.ts +0 -220
- package/ui/src/charts.tsx +0 -955
- package/ui/src/components/ErrorState.tsx +0 -6
- package/ui/src/components/Loading.tsx +0 -13
- package/ui/src/components/ProtectedRoute.tsx +0 -12
- package/ui/src/components/Shell.tsx +0 -91
- package/ui/src/components/WorkspaceConfig.tsx +0 -178
- package/ui/src/components/index.ts +0 -5
- package/ui/src/context/auth.tsx +0 -80
- package/ui/src/context/theme.tsx +0 -66
- package/ui/src/hooks/useAutoRefresh.ts +0 -39
- package/ui/src/i18n/ui.ts +0 -473
- package/ui/src/main.tsx +0 -16
- package/ui/src/pages/EvolutionPage.tsx +0 -333
- package/ui/src/pages/FeedbackPage.tsx +0 -138
- package/ui/src/pages/GateMonitorPage.tsx +0 -136
- package/ui/src/pages/LoginPage.tsx +0 -89
- package/ui/src/pages/OverviewPage.tsx +0 -599
- package/ui/src/pages/SamplesPage.tsx +0 -174
- package/ui/src/pages/ThinkingModelsPage.tsx +0 -702
- package/ui/src/styles.css +0 -2020
- package/ui/src/types.ts +0 -384
- package/ui/src/utils/format.ts +0 -15
package/src/commands/context.ts
CHANGED
|
@@ -3,7 +3,7 @@ import * as fs from 'fs';
|
|
|
3
3
|
import * as path from 'path';
|
|
4
4
|
import type { PluginCommandContext, PluginCommandResult } from '../openclaw-sdk.js';
|
|
5
5
|
import { resolvePluginCommandWorkspaceDir } from '../utils/workspace-resolver.js';
|
|
6
|
-
import { atomicWriteFileSync } from '../utils/io.js';
|
|
6
|
+
import { atomicWriteFileSync, normalizeCommandArgs } from '../utils/io.js';
|
|
7
7
|
import type { ContextInjectionConfig} from '../types.js';
|
|
8
8
|
import { defaultContextConfig } from '../types.js';
|
|
9
9
|
import { loadContextInjectionConfig } from '../hooks/prompt.js';
|
|
@@ -305,7 +305,7 @@ function showHelp(isZh: boolean): string {
|
|
|
305
305
|
|
|
306
306
|
export function handleContextCommand(ctx: PluginCommandContext): PluginCommandResult {
|
|
307
307
|
const workspaceDir = getWorkspaceDir(ctx);
|
|
308
|
-
const args = (ctx.args
|
|
308
|
+
const args = normalizeCommandArgs(ctx.args).trim().split(/\s+/);
|
|
309
309
|
const subCommand = args[0]?.toLowerCase() || 'status';
|
|
310
310
|
const value = args[1]?.toLowerCase() || '';
|
|
311
311
|
|
|
@@ -21,6 +21,7 @@ import {
|
|
|
21
21
|
} from '../core/principle-tree-ledger.js';
|
|
22
22
|
import type { Implementation, ImplementationLifecycleState } from '../types/principle-tree-schema.js';
|
|
23
23
|
import type { PluginCommandContext, PluginCommandResult } from '../openclaw-sdk.js';
|
|
24
|
+
import { normalizeCommandArgs } from '../utils/io.js';
|
|
24
25
|
import { resolvePluginCommandWorkspaceDir } from '../utils/workspace-resolver.js';
|
|
25
26
|
|
|
26
27
|
/**
|
|
@@ -139,7 +140,7 @@ export function handleDisableImplCommand(ctx: PluginCommandContext): PluginComma
|
|
|
139
140
|
const lang = (ctx.config?.language as string) || 'en';
|
|
140
141
|
const isZh = lang === 'zh';
|
|
141
142
|
|
|
142
|
-
const args = (ctx.args
|
|
143
|
+
const args = normalizeCommandArgs(ctx.args).trim();
|
|
143
144
|
|
|
144
145
|
// Parse args: [implId] [--reason "..."]
|
|
145
146
|
const parts = args.split(/\s+/);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as path from 'path';
|
|
2
2
|
import type { EvolutionReducerImpl } from '../core/evolution-reducer.js';
|
|
3
|
-
import type {
|
|
3
|
+
import type { LifecycleRouteRecommendation } from '@principles/core/runtime-v2';
|
|
4
4
|
import { WorkflowFunnelLoader } from '../core/workflow-funnel-loader.js';
|
|
5
5
|
import { resolvePdPath } from '../core/paths.js';
|
|
6
6
|
import { WorkspaceContext } from '../core/workspace-context.js';
|
|
@@ -33,7 +33,7 @@ function formatSources(
|
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
function formatRouteRecommendations(
|
|
36
|
-
recommendations:
|
|
36
|
+
recommendations: LifecycleRouteRecommendation[],
|
|
37
37
|
emptyLabel: string,
|
|
38
38
|
): string {
|
|
39
39
|
if (recommendations.length === 0) {
|
|
@@ -57,7 +57,7 @@ function buildEnglishOutput(
|
|
|
57
57
|
warnings: string[],
|
|
58
58
|
stats: ReturnType<EvolutionReducerImpl['getStats']>,
|
|
59
59
|
summary: ReturnType<typeof RuntimeSummaryService.getSummary>,
|
|
60
|
-
recommendations:
|
|
60
|
+
recommendations: LifecycleRouteRecommendation[],
|
|
61
61
|
): string {
|
|
62
62
|
const lines: string[] = [
|
|
63
63
|
'Evolution Status',
|
|
@@ -78,13 +78,13 @@ function buildEnglishOutput(
|
|
|
78
78
|
`- Phase 3: ready ${summary.phase3.phase3ShadowEligible ? 'yes' : 'no'}, queueTruthReady ${summary.phase3.queueTruthReady ? 'yes' : 'no'}, eligible ${summary.phase3.evolutionEligible}, reference_only ${summary.phase3.evolutionReferenceOnly}, rejected ${summary.phase3.evolutionRejected}${summary.phase3.evolutionReferenceOnlyReasons.length > 0 ? ` (reference ${summary.phase3.evolutionReferenceOnlyReasons.slice(0, 2).join(', ')})` : ''}${summary.phase3.evolutionRejectedReasons.length > 0 ? ` (${summary.phase3.evolutionRejectedReasons.slice(0, 3).join(', ')})` : ''}`,
|
|
79
79
|
`- Phase 3 Legacy Directive File: ${summary.phase3.directiveStatus} (${summary.phase3.directiveIgnoredReason})`,
|
|
80
80
|
'',
|
|
81
|
-
// D: Heartbeat Diagnostician chain
|
|
81
|
+
// D: Heartbeat Diagnostician chain
|
|
82
82
|
'Heartbeat Diagnostician (Pain → Principle)',
|
|
83
|
-
`- Pending tasks: ${summary.
|
|
84
|
-
`- Tasks written today: ${summary.
|
|
85
|
-
`- Reports written today: ${summary.
|
|
86
|
-
`- Candidates created today: ${summary.
|
|
87
|
-
`- Heartbeats injected today: ${summary.
|
|
83
|
+
`- Pending tasks: ${summary.runtimeDiagnosis.pendingTasks}`,
|
|
84
|
+
`- Tasks written today: ${summary.runtimeDiagnosis.tasksWrittenToday}`,
|
|
85
|
+
`- Reports written today: ${summary.runtimeDiagnosis.reportsWrittenToday}`,
|
|
86
|
+
`- Candidates created today: ${summary.runtimeDiagnosis.candidatesCreatedToday}`,
|
|
87
|
+
`- Heartbeats injected today: ${summary.runtimeDiagnosis.heartbeatsInjectedToday}`,
|
|
88
88
|
'',
|
|
89
89
|
'Principles',
|
|
90
90
|
`- candidate principles: ${stats.candidateCount}`,
|
|
@@ -129,7 +129,7 @@ function buildChineseOutput(
|
|
|
129
129
|
warnings: string[],
|
|
130
130
|
stats: ReturnType<EvolutionReducerImpl['getStats']>,
|
|
131
131
|
summary: ReturnType<typeof RuntimeSummaryService.getSummary>,
|
|
132
|
-
recommendations:
|
|
132
|
+
recommendations: LifecycleRouteRecommendation[],
|
|
133
133
|
): string {
|
|
134
134
|
const lines: string[] = [
|
|
135
135
|
'进化状态',
|
|
@@ -150,13 +150,13 @@ function buildChineseOutput(
|
|
|
150
150
|
`- Phase 3: ready ${summary.phase3.phase3ShadowEligible ? 'yes' : 'no'},queueTruthReady ${summary.phase3.queueTruthReady ? 'yes' : 'no'},eligible ${summary.phase3.evolutionEligible},reference_only ${summary.phase3.evolutionReferenceOnly},rejected ${summary.phase3.evolutionRejected}${summary.phase3.evolutionReferenceOnlyReasons.length > 0 ? ` (reference ${summary.phase3.evolutionReferenceOnlyReasons.slice(0, 2).join(', ')})` : ''}${summary.phase3.evolutionRejectedReasons.length > 0 ? ` (${summary.phase3.evolutionRejectedReasons.slice(0, 3).join(', ')})` : ''}`,
|
|
151
151
|
`- Phase 3 Legacy Directive File: ${summary.phase3.directiveStatus} (${summary.phase3.directiveIgnoredReason})`,
|
|
152
152
|
'',
|
|
153
|
-
// D: Heartbeat Diagnostician chain
|
|
153
|
+
// D: Heartbeat Diagnostician chain
|
|
154
154
|
'心跳诊断链路(Pain → 原则)',
|
|
155
|
-
`- 等待处理: ${summary.
|
|
156
|
-
`- 今日写入任务: ${summary.
|
|
157
|
-
`- 今日写入报告: ${summary.
|
|
158
|
-
`- 今日创建候选: ${summary.
|
|
159
|
-
`- 今日心跳注入: ${summary.
|
|
155
|
+
`- 等待处理: ${summary.runtimeDiagnosis.pendingTasks}`,
|
|
156
|
+
`- 今日写入任务: ${summary.runtimeDiagnosis.tasksWrittenToday}`,
|
|
157
|
+
`- 今日写入报告: ${summary.runtimeDiagnosis.reportsWrittenToday}`,
|
|
158
|
+
`- 今日创建候选: ${summary.runtimeDiagnosis.candidatesCreatedToday}`,
|
|
159
|
+
`- 今日心跳注入: ${summary.runtimeDiagnosis.heartbeatsInjectedToday}`,
|
|
160
160
|
'',
|
|
161
161
|
'原则统计',
|
|
162
162
|
`- 候选原则: ${stats.candidateCount}`,
|
package/src/commands/export.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { WorkspaceContext } from '../core/workspace-context.js';
|
|
2
2
|
import type { PluginCommandContext, PluginCommandResult } from '../openclaw-sdk.js';
|
|
3
|
+
import { normalizeCommandArgs } from '../utils/io.js';
|
|
3
4
|
import { resolvePluginCommandWorkspaceDir } from '../utils/workspace-resolver.js';
|
|
4
|
-
import { exportORPOSamples, listExports } from '../core/nocturnal-export.js';
|
|
5
5
|
|
|
6
6
|
function isZh(ctx: PluginCommandContext): boolean {
|
|
7
7
|
return String(ctx.config?.language || 'en').startsWith('zh');
|
|
@@ -10,77 +10,17 @@ function isZh(ctx: PluginCommandContext): boolean {
|
|
|
10
10
|
export function handleExportCommand(ctx: PluginCommandContext): PluginCommandResult {
|
|
11
11
|
const workspaceDir = resolvePluginCommandWorkspaceDir(ctx, 'export');
|
|
12
12
|
const zh = isZh(ctx);
|
|
13
|
-
const args = (ctx.args
|
|
13
|
+
const args = normalizeCommandArgs(ctx.args).trim();
|
|
14
14
|
const parts = args.split(/\s+/).filter(Boolean);
|
|
15
15
|
const [subcommand = 'corrections'] = parts;
|
|
16
16
|
const wctx = WorkspaceContext.fromHookContext({ workspaceDir, ...ctx.config });
|
|
17
17
|
|
|
18
18
|
try {
|
|
19
|
-
if (subcommand === 'orpo') {
|
|
20
|
-
// Nocturnal ORPO export
|
|
21
|
-
// Usage: pd-export orpo [--family=<targetModelFamily>]
|
|
22
|
-
const familyArg = parts.find((p) => p.startsWith('--family='));
|
|
23
|
-
const targetModelFamily = familyArg ? familyArg.split('=')[1] : undefined;
|
|
24
|
-
|
|
25
|
-
const result = exportORPOSamples(workspaceDir, targetModelFamily);
|
|
26
|
-
|
|
27
|
-
if (!result.success) {
|
|
28
|
-
const reasonMap: Record<string, string> = {
|
|
29
|
-
no_approved_samples: zh
|
|
30
|
-
? '没有已批准的样本'
|
|
31
|
-
: 'No approved samples',
|
|
32
|
-
family_mismatch: zh
|
|
33
|
-
? '没有找到指定模型家族的已批准样本'
|
|
34
|
-
: 'No approved samples for the specified target model family',
|
|
35
|
-
all_samples_missing_artifacts: zh
|
|
36
|
-
? '所有样本的 artifact 文件都缺失'
|
|
37
|
-
: 'All sample artifact files are missing',
|
|
38
|
-
};
|
|
39
|
-
return {
|
|
40
|
-
text: zh
|
|
41
|
-
? `ORPO 导出失败: ${reasonMap[result.emptyReason ?? ''] ?? result.error}`
|
|
42
|
-
: `ORPO export failed: ${reasonMap[result.emptyReason ?? ''] ?? result.error}`,
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
return {
|
|
49
|
-
text: zh
|
|
50
|
-
? `已导出 ORPO 决策点样本到 ${result.manifest!.exportPath},` +
|
|
51
|
-
`共 ${result.manifest!.sampleCount} 条,模型家族: ${result.manifest!.targetModelFamily},` +
|
|
52
|
-
`数据集指纹: ${result.manifest!.datasetFingerprint.substring(0, 16)}...`
|
|
53
|
-
: `Exported ORPO decision-point samples to ${result.manifest!.exportPath}, ` +
|
|
54
|
-
`${result.manifest!.sampleCount} samples, target: ${result.manifest!.targetModelFamily}, ` +
|
|
55
|
-
`dataset fingerprint: ${result.manifest!.datasetFingerprint.substring(0, 16)}...`,
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
if (subcommand === 'orpo-list') {
|
|
60
|
-
// List previous ORPO exports
|
|
61
|
-
const exports = listExports(workspaceDir);
|
|
62
|
-
if (exports.length === 0) {
|
|
63
|
-
return {
|
|
64
|
-
text: zh
|
|
65
|
-
? '没有找到 ORPO 导出记录。'
|
|
66
|
-
: 'No ORPO exports found.',
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
const lines = exports.slice(0, 10).map((e) =>
|
|
70
|
-
`- ${e.exportId.substring(0, 8)}... | ${e.sampleCount} samples | ${e.targetModelFamily} | ${new Date(e.createdAt).toLocaleDateString()}`
|
|
71
|
-
);
|
|
72
|
-
return {
|
|
73
|
-
text: zh
|
|
74
|
-
? `ORPO 导出记录:\n${lines.join('\n')}`
|
|
75
|
-
: `ORPO exports:\n${lines.join('\n')}`,
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
|
|
79
19
|
if (subcommand !== 'analytics' && subcommand !== 'corrections') {
|
|
80
20
|
return {
|
|
81
21
|
text: zh
|
|
82
|
-
? '无效的导出类型。请使用 `analytics
|
|
83
|
-
: 'Invalid export target. Use `analytics
|
|
22
|
+
? '无效的导出类型。请使用 `analytics` 或 `corrections [--redacted]`。'
|
|
23
|
+
: 'Invalid export target. Use `analytics` or `corrections [--redacted]`',
|
|
84
24
|
};
|
|
85
25
|
}
|
|
86
26
|
|
|
@@ -104,11 +44,16 @@ export function handleExportCommand(ctx: PluginCommandContext): PluginCommandRes
|
|
|
104
44
|
? `已导出纠错样本到 ${result.filePath},模式 ${result.mode},共 ${result.count} 条。`
|
|
105
45
|
: `Exported correction samples to ${result.filePath} (mode=${result.mode}, count=${result.count}).`,
|
|
106
46
|
};
|
|
107
|
-
} catch {
|
|
47
|
+
} catch (err) {
|
|
48
|
+
console.error('[pd-export] Export failed:', {
|
|
49
|
+
subcommand,
|
|
50
|
+
error: err instanceof Error ? err.message : String(err),
|
|
51
|
+
stack: err instanceof Error ? err.stack : undefined,
|
|
52
|
+
});
|
|
108
53
|
return {
|
|
109
54
|
text: zh
|
|
110
|
-
?
|
|
111
|
-
:
|
|
55
|
+
? `导出失败 (${subcommand}): ${err instanceof Error ? err.message : String(err)}`
|
|
56
|
+
: `Export failed (${subcommand}): ${err instanceof Error ? err.message : String(err)}`,
|
|
112
57
|
};
|
|
113
58
|
}
|
|
114
59
|
}
|
package/src/commands/pain.ts
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import { resetFriction, getSession } from '../core/session-tracker.js';
|
|
2
2
|
import { WorkspaceContext } from '../core/workspace-context.js';
|
|
3
3
|
import type { PluginCommandContext, PluginCommandResult } from '../openclaw-sdk.js';
|
|
4
|
+
import { normalizeCommandArgs } from '../utils/io.js';
|
|
4
5
|
import { resolvePluginCommandWorkspaceDir } from '../utils/workspace-resolver.js';
|
|
5
6
|
import type { EmpathyEventStats } from '../types/event-types.js';
|
|
7
|
+
import type { EvolutionLoopEvent } from '../core/evolution-types.js';
|
|
8
|
+
import { computeHash } from '../utils/hashing.js';
|
|
9
|
+
import { PainToPrincipleService, PrincipleTreeLedgerAdapter } from '@principles/core/runtime-v2';
|
|
6
10
|
|
|
7
11
|
/**
|
|
8
12
|
* Creates a visual progress bar (e.g., [██████░░░░])
|
|
@@ -100,7 +104,7 @@ export function handlePainCommand(ctx: PluginCommandContext): PluginCommandResul
|
|
|
100
104
|
const isZh = lang === 'zh';
|
|
101
105
|
const { sessionId } = ctx as SessionAwareCommandContext;
|
|
102
106
|
|
|
103
|
-
const args = (ctx.args
|
|
107
|
+
const args = normalizeCommandArgs(ctx.args).trim();
|
|
104
108
|
|
|
105
109
|
// Handle empathy subcommand
|
|
106
110
|
if (args.startsWith('empathy')) {
|
|
@@ -267,3 +271,89 @@ function handleEmpathySubcommand(
|
|
|
267
271
|
|
|
268
272
|
return { text };
|
|
269
273
|
}
|
|
274
|
+
|
|
275
|
+
export async function handlePainReportCommand(ctx: PluginCommandContext): Promise<PluginCommandResult> {
|
|
276
|
+
const workspaceDir = resolvePluginCommandWorkspaceDir(ctx, 'pain-report');
|
|
277
|
+
const wctx = WorkspaceContext.fromHookContext({ workspaceDir, ...ctx.config });
|
|
278
|
+
const lang = (ctx.config?.language as string) || 'en';
|
|
279
|
+
const isZh = lang === 'zh';
|
|
280
|
+
const { sessionId } = ctx as SessionAwareCommandContext;
|
|
281
|
+
const args = normalizeCommandArgs(ctx.args).trim();
|
|
282
|
+
|
|
283
|
+
if (!args) {
|
|
284
|
+
return {
|
|
285
|
+
text: isZh
|
|
286
|
+
? '❌ 请提供 pain reason。用法: `/pd-pain <描述你遇到的问题>`'
|
|
287
|
+
: '❌ Please provide a pain reason. Usage: `/pd-pain <describe the issue you encountered>`',
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
if (!sessionId || sessionId === 'unknown') {
|
|
292
|
+
return {
|
|
293
|
+
text: isZh
|
|
294
|
+
? '❌ 无法获取当前会话 ID。请在 OpenClaw 对话会话中使用此命令。'
|
|
295
|
+
: '❌ Session ID not available. Please use this command in an OpenClaw chat session.',
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
const painId = `manual_${Date.now()}_${computeHash(sessionId).slice(0, 8)}`;
|
|
300
|
+
const painData = {
|
|
301
|
+
painId,
|
|
302
|
+
painType: 'user_frustration' as const,
|
|
303
|
+
source: 'manual',
|
|
304
|
+
reason: args,
|
|
305
|
+
score: 90,
|
|
306
|
+
sessionId,
|
|
307
|
+
agentId: 'openclaw-host',
|
|
308
|
+
provenance: 'openclaw_context_bound' as const,
|
|
309
|
+
};
|
|
310
|
+
|
|
311
|
+
try {
|
|
312
|
+
const ledgerAdapter = new PrincipleTreeLedgerAdapter({ stateDir: wctx.stateDir });
|
|
313
|
+
const service = new PainToPrincipleService({
|
|
314
|
+
workspaceDir: wctx.workspaceDir,
|
|
315
|
+
stateDir: wctx.stateDir,
|
|
316
|
+
ledgerAdapter,
|
|
317
|
+
owner: 'openclaw-plugin',
|
|
318
|
+
autoIntakeEnabled: true,
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
const result = await service.recordPain({
|
|
322
|
+
painId: painData.painId,
|
|
323
|
+
painType: painData.painType,
|
|
324
|
+
source: painData.source,
|
|
325
|
+
reason: painData.reason,
|
|
326
|
+
score: painData.score,
|
|
327
|
+
sessionId: painData.sessionId,
|
|
328
|
+
agentId: painData.agentId,
|
|
329
|
+
provenance: painData.provenance,
|
|
330
|
+
recordObservability: true,
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
if (result.status === 'succeeded') {
|
|
334
|
+
wctx.evolutionReducer.emitSync({
|
|
335
|
+
ts: new Date().toISOString(),
|
|
336
|
+
type: 'pain_detected',
|
|
337
|
+
data: painData,
|
|
338
|
+
} as EvolutionLoopEvent);
|
|
339
|
+
|
|
340
|
+
return {
|
|
341
|
+
text: isZh
|
|
342
|
+
? `✅ Pain 已记录 (context-bound)\n\n📋 **Pain ID**: ${painId}\n📝 **Reason**: ${args}\n🔗 **Provenance**: openclaw_context_bound\n📌 **Session**: ${sessionId}\n\n系统将基于当前会话上下文进行诊断。`
|
|
343
|
+
: `✅ Pain recorded (context-bound)\n\n📋 **Pain ID**: ${painId}\n📝 **Reason**: ${args}\n🔗 **Provenance**: openclaw_context_bound\n📌 **Session**: ${sessionId}\n\nThe system will diagnose using current session context.`,
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
return {
|
|
348
|
+
text: isZh
|
|
349
|
+
? `⚠️ Pain 记录未成功 (status: ${result.status})。请检查系统日志或使用 \`/pd-status\` 查看状态。`
|
|
350
|
+
: `⚠️ Pain recording not accepted (status: ${result.status}). Check system logs or use \`/pd-status\` for status.`,
|
|
351
|
+
};
|
|
352
|
+
} catch (err) {
|
|
353
|
+
return {
|
|
354
|
+
text: isZh
|
|
355
|
+
? `❌ Pain 记录失败: ${String(err)}。请检查系统日志或重试。`
|
|
356
|
+
: `❌ Failed to record pain: ${String(err)}. Check system logs or try again.`,
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { WorkspaceContext } from '../core/workspace-context.js';
|
|
2
2
|
import type { PluginCommandContext } from '../openclaw-sdk.js';
|
|
3
|
+
import { normalizeCommandArgs } from '../utils/io.js';
|
|
3
4
|
import { resolvePluginCommandWorkspaceDir } from '../utils/workspace-resolver.js';
|
|
4
5
|
|
|
5
6
|
|
|
6
7
|
export function handlePrincipleRollbackCommand(ctx: PluginCommandContext): { text: string } {
|
|
7
8
|
const workspaceDir = resolvePluginCommandWorkspaceDir(ctx, 'principle-rollback');
|
|
8
|
-
const argText = (ctx.args
|
|
9
|
+
const argText = normalizeCommandArgs(ctx.args).trim();
|
|
9
10
|
const [principleId = '', ...reasonParts] = argText.split(/\s+/);
|
|
10
11
|
const reason = (reasonParts.join(' ') || 'manual rollback').trim();
|
|
11
12
|
const isZh = (ctx.config?.language as string)?.startsWith('zh');
|
|
@@ -14,6 +14,9 @@
|
|
|
14
14
|
* VALIDATION:
|
|
15
15
|
* - Candidate must have at least one replay report with 'pass' decision
|
|
16
16
|
* - Only candidate -> active is valid for promotion
|
|
17
|
+
* - NOTE (PRI-230): The legacy replay generation path has been retired.
|
|
18
|
+
* This command is temporarily unavailable for implementations without
|
|
19
|
+
* pre-existing replay reports until a Runtime V2 replay entry is wired.
|
|
17
20
|
*/
|
|
18
21
|
|
|
19
22
|
import * as fs from 'fs';
|
|
@@ -28,6 +31,7 @@ import {
|
|
|
28
31
|
} from '../core/principle-tree-ledger.js';
|
|
29
32
|
import { WorkspaceContext } from '../core/workspace-context.js';
|
|
30
33
|
import type { PluginCommandContext, PluginCommandResult } from '../openclaw-sdk.js';
|
|
34
|
+
import { normalizeCommandArgs } from '../utils/io.js';
|
|
31
35
|
import { resolvePluginCommandWorkspaceDir } from '../utils/workspace-resolver.js';
|
|
32
36
|
import type { Implementation, ImplementationLifecycleState } from '../types/principle-tree-schema.js';
|
|
33
37
|
import { withLock } from '../utils/file-lock.js';
|
|
@@ -99,35 +103,6 @@ function _handleShowReport(
|
|
|
99
103
|
return { text: formatReplayReport(report) };
|
|
100
104
|
}
|
|
101
105
|
|
|
102
|
-
interface RunReplayOptions {
|
|
103
|
-
workspaceDir: string;
|
|
104
|
-
stateDir: string;
|
|
105
|
-
implId: string;
|
|
106
|
-
isZh: boolean;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
function _handleRunReplay(options: RunReplayOptions): PluginCommandResult {
|
|
110
|
-
const { workspaceDir, stateDir, implId, isZh } = options;
|
|
111
|
-
const engine = new ReplayEngine(workspaceDir, stateDir);
|
|
112
|
-
|
|
113
|
-
try {
|
|
114
|
-
const report = engine.runReplayForImplementation(implId);
|
|
115
|
-
let text = formatReplayReport(report);
|
|
116
|
-
if (report.sampleFingerprints.length === 0) {
|
|
117
|
-
text += isZh
|
|
118
|
-
? '\n⚠️ 未找到已分类的 replay 样本。报告已生成,但当前结果只反映空样本集。\n'
|
|
119
|
-
: '\n⚠️ No classified replay samples were found. The report was generated, but it only reflects an empty sample set.\n';
|
|
120
|
-
}
|
|
121
|
-
return { text };
|
|
122
|
-
} catch (error: unknown) {
|
|
123
|
-
return {
|
|
124
|
-
text: isZh
|
|
125
|
-
? `❌ 回放评估失败: ${String(error)}`
|
|
126
|
-
: `❌ Replay evaluation failed: ${String(error)}`,
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
106
|
interface PromoteImplOptions {
|
|
132
107
|
workspaceDir: string;
|
|
133
108
|
stateDir: string;
|
|
@@ -162,8 +137,8 @@ function _handlePromoteImpl(options: PromoteImplOptions): PluginCommandResult {
|
|
|
162
137
|
if (!engine.hasPassingReport(implId)) {
|
|
163
138
|
return {
|
|
164
139
|
text: isZh
|
|
165
|
-
? `❌ 实现 ${implId}
|
|
166
|
-
: `❌ Implementation ${implId} has no passing replay report. Promotion rejected.\n\
|
|
140
|
+
? `❌ 实现 ${implId} 没有通过的回放报告,晋升被拒绝。\n\nLegacy replay 生成路径已在 PRI-230 退役,当前无可用的 replay 证据生成入口。该命令暂不可用于没有既有 replay 报告的实现。`
|
|
141
|
+
: `❌ Implementation ${implId} has no passing replay report. Promotion rejected.\n\nThe legacy replay generation path was retired in PRI-230; no replay evidence generation entry is currently available. This command is temporarily unavailable for implementations without pre-existing replay reports.`,
|
|
167
142
|
};
|
|
168
143
|
}
|
|
169
144
|
|
|
@@ -256,7 +231,7 @@ export function handlePromoteImplCommand(ctx: PluginCommandContext): PluginComma
|
|
|
256
231
|
const lang = (ctx.config?.language as string) || 'en';
|
|
257
232
|
const isZh = lang === 'zh';
|
|
258
233
|
|
|
259
|
-
const args = (ctx.args
|
|
234
|
+
const args = normalizeCommandArgs(ctx.args).trim().split(/\s+/);
|
|
260
235
|
const subcommand = args[0] || '';
|
|
261
236
|
const implId = args[1] || '';
|
|
262
237
|
|
|
@@ -275,16 +250,5 @@ export function handlePromoteImplCommand(ctx: PluginCommandContext): PluginComma
|
|
|
275
250
|
return _handleShowReport(stateDir, implId, isZh);
|
|
276
251
|
}
|
|
277
252
|
|
|
278
|
-
if (subcommand === 'eval') {
|
|
279
|
-
if (!implId) {
|
|
280
|
-
return {
|
|
281
|
-
text: isZh
|
|
282
|
-
? '请指定要评估的实现ID: /pd-promote-impl eval <implId>'
|
|
283
|
-
: 'Please specify an implementation ID: /pd-promote-impl eval <implId>',
|
|
284
|
-
};
|
|
285
|
-
}
|
|
286
|
-
return _handleRunReplay({ workspaceDir, stateDir, implId, isZh });
|
|
287
|
-
}
|
|
288
|
-
|
|
289
253
|
return _handlePromoteImpl({ workspaceDir, stateDir, implId: subcommand, isZh });
|
|
290
254
|
}
|
|
@@ -25,6 +25,7 @@ import {
|
|
|
25
25
|
} from '../core/principle-tree-ledger.js';
|
|
26
26
|
import type { Implementation } from '../types/principle-tree-schema.js';
|
|
27
27
|
import type { PluginCommandContext, PluginCommandResult } from '../openclaw-sdk.js';
|
|
28
|
+
import { normalizeCommandArgs } from '../utils/io.js';
|
|
28
29
|
import { resolvePluginCommandWorkspaceDir } from '../utils/workspace-resolver.js';
|
|
29
30
|
|
|
30
31
|
/**
|
|
@@ -50,7 +51,7 @@ export function handleRollbackImplCommand(ctx: PluginCommandContext): PluginComm
|
|
|
50
51
|
const lang = (ctx.config?.language as string) || 'en';
|
|
51
52
|
const isZh = lang === 'zh';
|
|
52
53
|
|
|
53
|
-
const args = (ctx.args
|
|
54
|
+
const args = normalizeCommandArgs(ctx.args).trim();
|
|
54
55
|
|
|
55
56
|
// Parse args
|
|
56
57
|
const subcommand = args.split(/\s+/)[0] || '';
|
package/src/commands/rollback.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { WorkspaceContext } from '../core/workspace-context.js';
|
|
2
2
|
import { resetFriction } from '../core/session-tracker.js';
|
|
3
3
|
import type { PluginCommandContext, PluginCommandResult } from '../openclaw-sdk.js';
|
|
4
|
+
import { normalizeCommandArgs } from '../utils/io.js';
|
|
4
5
|
import { resolvePluginCommandWorkspaceDir } from '../utils/workspace-resolver.js';
|
|
5
6
|
|
|
6
7
|
/**
|
|
@@ -26,7 +27,7 @@ export function handleRollbackCommand(ctx: PluginCommandContext): PluginCommandR
|
|
|
26
27
|
const isZh = lang === 'zh';
|
|
27
28
|
const { sessionId } = ctx as SessionAwareCommandContext;
|
|
28
29
|
|
|
29
|
-
const args = (ctx.args
|
|
30
|
+
const args = normalizeCommandArgs(ctx.args).trim();
|
|
30
31
|
|
|
31
32
|
if (!args) {
|
|
32
33
|
return {
|
package/src/commands/samples.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { WorkspaceContext } from '../core/workspace-context.js';
|
|
2
2
|
import type { PluginCommandContext, PluginCommandResult } from '../openclaw-sdk.js';
|
|
3
|
+
import { normalizeCommandArgs } from '../utils/io.js';
|
|
3
4
|
import { resolvePluginCommandWorkspaceDir } from '../utils/workspace-resolver.js';
|
|
4
5
|
|
|
5
6
|
function isZh(ctx: PluginCommandContext): boolean {
|
|
@@ -9,7 +10,7 @@ function isZh(ctx: PluginCommandContext): boolean {
|
|
|
9
10
|
export function handleSamplesCommand(ctx: PluginCommandContext): PluginCommandResult {
|
|
10
11
|
const workspaceDir = resolvePluginCommandWorkspaceDir(ctx, 'samples');
|
|
11
12
|
const zh = isZh(ctx);
|
|
12
|
-
const args = (ctx.args
|
|
13
|
+
const args = normalizeCommandArgs(ctx.args).trim();
|
|
13
14
|
const wctx = WorkspaceContext.fromHookContext({ workspaceDir, ...ctx.config });
|
|
14
15
|
|
|
15
16
|
if (args.startsWith('review ')) {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
|
|
2
2
|
import * as fs from 'fs';
|
|
3
3
|
import type { PluginCommandContext, PluginCommandResult } from '../openclaw-sdk.js';
|
|
4
|
+
import { normalizeCommandArgs } from '../utils/io.js';
|
|
4
5
|
import { resolvePluginCommandWorkspaceDir } from '../utils/workspace-resolver.js';
|
|
5
6
|
import { WorkspaceContext } from '../core/workspace-context.js';
|
|
6
7
|
|
|
@@ -162,7 +163,7 @@ function formatAuditReport(wctx: WorkspaceContext): string {
|
|
|
162
163
|
export function handleThinkingOs(ctx: PluginCommandContext): PluginCommandResult {
|
|
163
164
|
const workspaceDir = getWorkspaceDir(ctx);
|
|
164
165
|
const wctx = WorkspaceContext.fromHookContext({ workspaceDir, ...ctx.config });
|
|
165
|
-
const args = (ctx.args
|
|
166
|
+
const args = normalizeCommandArgs(ctx.args).trim();
|
|
166
167
|
const subCommand = args.split(/\s+/)[0]?.toLowerCase();
|
|
167
168
|
const rest = args.slice(subCommand?.length || 0).trim();
|
|
168
169
|
|
package/src/config/errors.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Domain-Specific Errors for Principles Disciple
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
4
|
* These errors provide semantic meaning to failure modes,
|
|
5
5
|
* making it easier to distinguish between:
|
|
6
6
|
* - Lock contention (resource busy)
|
|
@@ -9,18 +9,34 @@
|
|
|
9
9
|
* - Configuration issues
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
+
import type { PDErrorCategory } from '@principles/core';
|
|
13
|
+
|
|
14
|
+
/** Maps legacy PdError codes to canonical PDErrorCategory values. */
|
|
15
|
+
const codeToCategory: Record<string, PDErrorCategory> = {
|
|
16
|
+
LOCK_UNAVAILABLE: 'lease_conflict',
|
|
17
|
+
PATH_RESOLUTION_ERROR: 'workspace_invalid',
|
|
18
|
+
WORKSPACE_NOT_FOUND: 'workspace_invalid',
|
|
19
|
+
SAMPLE_NOT_FOUND: 'storage_unavailable',
|
|
20
|
+
CONFIGURATION_ERROR: 'input_invalid',
|
|
21
|
+
DEPENDENCY_ERROR: 'runtime_unavailable',
|
|
22
|
+
EVOLUTION_PROCESSING_ERROR: 'execution_failed',
|
|
23
|
+
TRAJECTORY_ERROR: 'storage_unavailable',
|
|
24
|
+
};
|
|
25
|
+
|
|
12
26
|
/**
|
|
13
27
|
* Base class for all Principles Disciple errors
|
|
14
28
|
*/
|
|
15
29
|
export class PdError extends Error {
|
|
30
|
+
readonly category: PDErrorCategory;
|
|
31
|
+
|
|
16
32
|
constructor(
|
|
17
33
|
message: string,
|
|
18
|
-
|
|
19
34
|
public readonly code: string,
|
|
20
35
|
options?: { cause?: unknown }
|
|
21
36
|
) {
|
|
22
37
|
super(message, options);
|
|
23
38
|
this.name = 'PdError';
|
|
39
|
+
this.category = codeToCategory[code] ?? 'execution_failed';
|
|
24
40
|
}
|
|
25
41
|
}
|
|
26
42
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Diagnostician 协议常量
|
|
3
3
|
*
|
|
4
|
-
* 用于
|
|
4
|
+
* 用于 Runtime V2 diagnostician prompt
|
|
5
5
|
* 与 templates/langs/zh/skills/pd-diagnostician/SKILL.md 保持一致
|
|
6
6
|
*/
|
|
7
7
|
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
export const DIAGNOSTICIAN_PROTOCOL_SUMMARY = `## Diagnostic Protocol (5 Whys)
|
|
14
14
|
|
|
15
15
|
**Phase 1 - Evidence Gathering**:
|
|
16
|
-
-
|
|
16
|
+
- Use the task input/context provided by Runtime V2 for pain context
|
|
17
17
|
- Read .state/logs/events.jsonl recent entries
|
|
18
18
|
- Search codebase for error patterns from Reason field
|
|
19
19
|
- Record all evidence sources (file:line)
|
package/src/constants/tools.ts
CHANGED