@alan512/experienceengine 0.3.2 → 0.3.3

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.
Files changed (51) hide show
  1. package/.mcp.json +11 -11
  2. package/dist/adapters/codex/mcp-server.js +1 -1
  3. package/dist/analyzer/llm-learning-gate.d.ts +7 -0
  4. package/dist/analyzer/llm-learning-gate.js +76 -11
  5. package/dist/analyzer/llm-learning-gate.js.map +1 -1
  6. package/dist/cli/commands/inspect.js +9 -0
  7. package/dist/cli/commands/inspect.js.map +1 -1
  8. package/dist/cli/index.js +0 -0
  9. package/dist/controller/injection-renderer.d.ts +7 -2
  10. package/dist/controller/injection-renderer.js +50 -19
  11. package/dist/controller/injection-renderer.js.map +1 -1
  12. package/dist/controller/injection-scorecard.js +3 -0
  13. package/dist/controller/injection-scorecard.js.map +1 -1
  14. package/dist/controller/intervention-controller.js +8 -2
  15. package/dist/controller/intervention-controller.js.map +1 -1
  16. package/dist/controller/skip-reason.d.ts +12 -0
  17. package/dist/controller/skip-reason.js +82 -0
  18. package/dist/controller/skip-reason.js.map +1 -0
  19. package/dist/controller/skip-scorecard.d.ts +2 -0
  20. package/dist/controller/skip-scorecard.js +39 -0
  21. package/dist/controller/skip-scorecard.js.map +1 -0
  22. package/dist/install/claude-code-doctor.js +6 -4
  23. package/dist/install/claude-code-doctor.js.map +1 -1
  24. package/dist/install/claude-code-installer.js +2 -5
  25. package/dist/install/claude-code-installer.js.map +1 -1
  26. package/dist/install/claude-runtime-target.js +7 -1
  27. package/dist/install/claude-runtime-target.js.map +1 -1
  28. package/dist/install/openclaw-installer.js +5 -9
  29. package/dist/install/openclaw-installer.js.map +1 -1
  30. package/dist/interaction/service.js +3 -0
  31. package/dist/interaction/service.js.map +1 -1
  32. package/dist/plugin/openclaw-plugin.d.ts +1 -1
  33. package/dist/runtime/learning-candidate-factory.d.ts +3 -0
  34. package/dist/runtime/learning-candidate-factory.js +126 -0
  35. package/dist/runtime/learning-candidate-factory.js.map +1 -0
  36. package/dist/runtime/learning-pipeline-service.d.ts +24 -0
  37. package/dist/runtime/learning-pipeline-service.js +78 -0
  38. package/dist/runtime/learning-pipeline-service.js.map +1 -0
  39. package/dist/runtime/prompt-service.d.ts +3 -3
  40. package/dist/runtime/prompt-service.js +39 -34
  41. package/dist/runtime/prompt-service.js.map +1 -1
  42. package/dist/runtime/service.d.ts +5 -5
  43. package/dist/runtime/service.js +70 -306
  44. package/dist/runtime/service.js.map +1 -1
  45. package/dist/runtime/task-finalization-service.d.ts +36 -0
  46. package/dist/runtime/task-finalization-service.js +97 -0
  47. package/dist/runtime/task-finalization-service.js.map +1 -0
  48. package/dist/types/domain.d.ts +7 -0
  49. package/docs/releases/v0.3.3.md +18 -0
  50. package/openclaw.plugin.json +1 -1
  51. package/package.json +13 -12
@@ -0,0 +1,36 @@
1
+ import type { InputRecordRepository } from "../store/sqlite/repositories/input-record-repo.js";
2
+ import type { OutcomeRecordRepository } from "../store/sqlite/repositories/outcome-record-repo.js";
3
+ import type { ScopeRepository } from "../store/sqlite/repositories/scope-repo.js";
4
+ import type { StatsRepository } from "../store/sqlite/repositories/stats-repo.js";
5
+ import type { TaskRunRepository } from "../store/sqlite/repositories/task-run-repo.js";
6
+ import type { ExperienceInput, ExperienceInputRecord, TaskRun, ToolEvent } from "../types/domain.js";
7
+ import type { HostPromptContext } from "../types/plugin.js";
8
+ export type TaskFinalizationSessionState = {
9
+ context?: HostPromptContext;
10
+ toolEvents: ToolEvent[];
11
+ injectedNodeIds: string[];
12
+ };
13
+ export type TaskFinalizationServiceOptions = {
14
+ scopeRepo: ScopeRepository;
15
+ inputRepo: InputRecordRepository;
16
+ taskRunRepo: TaskRunRepository;
17
+ outcomeRepo: OutcomeRecordRepository;
18
+ statsRepo: StatsRepository;
19
+ };
20
+ export declare const mergeContext: (existing: HostPromptContext | undefined, incoming: HostPromptContext) => HostPromptContext;
21
+ export declare class TaskFinalizationService {
22
+ private readonly options;
23
+ constructor(options: TaskFinalizationServiceOptions);
24
+ buildFinalizedInput(context: HostPromptContext, session: TaskFinalizationSessionState): ExperienceInput;
25
+ persistFinalizedRun(input: {
26
+ experienceInput: ExperienceInput;
27
+ sessionId: string;
28
+ session: TaskFinalizationSessionState;
29
+ episodeId?: string;
30
+ context: HostPromptContext;
31
+ cwd?: string;
32
+ }): {
33
+ record: ExperienceInputRecord;
34
+ taskRun: TaskRun;
35
+ };
36
+ }
@@ -0,0 +1,97 @@
1
+ import { buildCandidateSignals } from "../analyzer/candidate-signals.js";
2
+ import { createEmptyStats, updateStats } from "../feedback/stats-updater.js";
3
+ import { buildExperienceInput } from "../input/input-adapter.js";
4
+ import { resolveScope } from "../input/scope-resolver.js";
5
+ import { nowIso } from "../utils/clock.js";
6
+ import { createId, stableId } from "../utils/ids.js";
7
+ export const mergeContext = (existing, incoming) => ({
8
+ host: incoming.host ?? existing?.host,
9
+ sessionId: incoming.sessionId ?? existing?.sessionId,
10
+ cwd: incoming.cwd ?? existing?.cwd,
11
+ userMessage: incoming.userMessage || existing?.userMessage || "",
12
+ taskSummary: incoming.taskSummary ?? existing?.taskSummary,
13
+ contextSummary: incoming.contextSummary ?? existing?.contextSummary,
14
+ injectedNodeIds: incoming.injectedNodeIds ?? existing?.injectedNodeIds
15
+ });
16
+ const toEvidence = (input) => input.tool_events.map((event) => [event.tool_name, event.status, event.error_signature ?? event.output_summary]
17
+ .filter(Boolean)
18
+ .join(": "));
19
+ const toInputRecord = (input, sessionId, episodeId) => ({
20
+ record_id: createId("input"),
21
+ episode_id: episodeId,
22
+ scope_id: input.scope_id,
23
+ session_id: sessionId,
24
+ task_type: input.task_type,
25
+ task_summary: input.task_summary,
26
+ outcome_signal: input.outcome_signal,
27
+ context_summary: input.context_summary,
28
+ evidence: toEvidence(input),
29
+ injected_node_ids: input.injected_node_ids,
30
+ created_at: nowIso()
31
+ });
32
+ const toTaskRun = (input, sessionId, context, episodeId) => {
33
+ const timestamp = nowIso();
34
+ const signals = buildCandidateSignals(input);
35
+ return {
36
+ id: stableId("taskrun", `${sessionId}:${input.task_summary}:${timestamp}`),
37
+ episode_id: episodeId,
38
+ host: context.host ?? "openclaw",
39
+ scope_id: input.scope_id,
40
+ session_id: sessionId,
41
+ task_type: input.task_type,
42
+ task_summary: input.task_summary,
43
+ prompt_excerpt: context.userMessage,
44
+ context_summary: input.context_summary,
45
+ started_at: timestamp,
46
+ ended_at: timestamp,
47
+ final_status: input.outcome_signal === "success" ? "success" : input.outcome_signal === "failure" ? "failure" : "unknown",
48
+ failure_signature: signals.failure_signature,
49
+ learning_status: undefined,
50
+ learning_reason: undefined,
51
+ created_at: timestamp,
52
+ updated_at: timestamp
53
+ };
54
+ };
55
+ const toOutcomeRecord = (taskRun, input, episodeId) => ({
56
+ id: createId("outcome"),
57
+ episode_id: episodeId,
58
+ task_run_id: taskRun.id,
59
+ outcome_signal: input.outcome_signal,
60
+ failure_signature: taskRun.failure_signature,
61
+ summary: input.task_summary,
62
+ created_at: nowIso()
63
+ });
64
+ export class TaskFinalizationService {
65
+ options;
66
+ constructor(options) {
67
+ this.options = options;
68
+ }
69
+ buildFinalizedInput(context, session) {
70
+ const mergedContext = mergeContext(session.context, context);
71
+ const injectedNodeIds = session.injectedNodeIds.length > 0 ? session.injectedNodeIds : mergedContext.injectedNodeIds ?? [];
72
+ return buildExperienceInput({
73
+ ...mergedContext,
74
+ injectedNodeIds
75
+ }, session.toolEvents);
76
+ }
77
+ persistFinalizedRun(input) {
78
+ const resolvedScope = resolveScope(input.cwd ?? input.session.context?.cwd);
79
+ const existingScope = this.options.scopeRepo.getById(resolvedScope.scope_id);
80
+ this.options.scopeRepo.upsert({
81
+ ...resolvedScope,
82
+ is_disabled: existingScope?.is_disabled ?? resolvedScope.is_disabled
83
+ });
84
+ const record = toInputRecord(input.experienceInput, input.sessionId, input.episodeId);
85
+ this.options.inputRepo.upsert(record);
86
+ if (input.experienceInput.task_type !== "unknown") {
87
+ const currentStats = this.options.statsRepo.get(input.experienceInput.scope_id, input.experienceInput.task_type) ??
88
+ createEmptyStats(input.experienceInput.scope_id, input.experienceInput.task_type);
89
+ this.options.statsRepo.upsert(updateStats(currentStats, input.experienceInput.outcome_signal, input.experienceInput.injected_node_ids.length > 0));
90
+ }
91
+ const taskRun = toTaskRun(input.experienceInput, input.sessionId, input.context, input.episodeId);
92
+ this.options.taskRunRepo.upsert(taskRun);
93
+ this.options.outcomeRepo.upsert(toOutcomeRecord(taskRun, input.experienceInput, input.episodeId));
94
+ return { record, taskRun };
95
+ }
96
+ }
97
+ //# sourceMappingURL=task-finalization-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-finalization-service.js","sourceRoot":"","sources":["../../src/runtime/task-finalization-service.ts"],"names":[],"mappings":"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"}
@@ -28,6 +28,7 @@ export type MatchScorecard = {
28
28
  };
29
29
  export type InterventionConfidence = "low" | "medium" | "high";
30
30
  export type InterventionBudgetClass = "none" | "single_hint" | "multi_hint";
31
+ export type SkipReasonCode = "scope_disabled" | "repo_policy_blocked_or_circuit_open" | "holdout_suppressed" | "shadow_suppressed" | "no_candidate" | "candidate_not_mature" | "delivery_state_shadow_only" | "recent_harm_or_quarantined" | "semantic_match_policy_rejected" | "task_family_mismatch" | "low_confidence_or_score_margin" | "record_only_diagnostic_candidate";
31
32
  export type SyncSecondOpinionDecision = "allow" | "allow_conservative" | "skip";
32
33
  export type SyncSecondOpinionTrigger = "conservative_delivery_state" | "harm_history" | "close_score_margin" | "expectation_correction";
33
34
  export type EvaluationMode = "live" | "shadow" | "holdout";
@@ -358,6 +359,9 @@ export type InterventionRejectedCandidate = {
358
359
  };
359
360
  export type InterventionDecisionDiagnostics = {
360
361
  interventionStrength?: InterventionStrength;
362
+ renderingPolicyReason?: string;
363
+ skipReasonCode?: SkipReasonCode;
364
+ skipReasonExplanation?: string;
361
365
  recordOnlyDiagnosticCandidateIds?: string[];
362
366
  retrievalPolicyDiagnostics?: RetrievalPolicyDiagnostics;
363
367
  topCandidates: InjectionScorecardCandidate[];
@@ -387,6 +391,9 @@ export type InjectionScorecard = {
387
391
  taskSummary: string;
388
392
  mode: InjectionMode;
389
393
  interventionStrength?: InterventionStrength;
394
+ renderingPolicyReason?: string;
395
+ skipReasonCode?: SkipReasonCode;
396
+ skipReasonExplanation?: string;
390
397
  riskLevel: InjectionRiskLevel;
391
398
  recommendation: string;
392
399
  reasons: string[];
@@ -0,0 +1,18 @@
1
+ # ExperienceEngine v0.3.3
2
+
3
+ Release date: 2026-05-14
4
+
5
+ ## Summary
6
+
7
+ v0.3.3 is an OpenClaw packaging metadata patch that keeps the packaged plugin manifest version aligned with the npm package version.
8
+
9
+ ## Included
10
+
11
+ - Updated the OpenClaw plugin manifest version for the v0.3.3 package.
12
+ - Made the OpenClaw install tarball generator write `openclaw.plugin.json` with the same version as `package.json`.
13
+ - Added package verification coverage so future OpenClaw install artifacts cannot drift between package and plugin manifest versions.
14
+
15
+ ## Upgrade Notes
16
+
17
+ - Existing OpenClaw users should update to `@alan512/experienceengine@0.3.3`, then run `ee upgrade openclaw` or `ee repair openclaw` in the OpenClaw host environment.
18
+ - If OpenClaw is installed inside WSL, run the command from that WSL distribution so the plugin is installed into the correct host config and extension directories.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "experienceengine",
3
3
  "name": "ExperienceEngine",
4
- "version": "0.3.1",
4
+ "version": "0.3.3",
5
5
  "description": "Context-aware experience intervention controller for coding and debugging tasks.",
6
6
  "configSchema": {
7
7
  "type": "object",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alan512/experienceengine",
3
- "version": "0.3.2",
3
+ "version": "0.3.3",
4
4
  "type": "module",
5
5
  "description": "Experience governance for coding agents: learn from real task outcomes, inject reusable hints, and retire low-value guidance.",
6
6
  "license": "MIT",
@@ -41,16 +41,6 @@
41
41
  "scripts/claude-plugin",
42
42
  ".env.example"
43
43
  ],
44
- "dependencies": {
45
- "@modelcontextprotocol/sdk": "^1.27.1",
46
- "zod": "^3.25.76"
47
- },
48
- "devDependencies": {
49
- "@types/node": "^22.13.14",
50
- "tsx": "^4.19.3",
51
- "typescript": "^5.8.2",
52
- "vitest": "^3.0.9"
53
- },
54
44
  "scripts": {
55
45
  "build": "node scripts/build/clean-dist.mjs && tsc -p tsconfig.build.json && node scripts/build/copy-sqlite-schema.mjs",
56
46
  "dev": "tsx watch src/cli/index.ts",
@@ -60,8 +50,19 @@
60
50
  "maintenance:merge-warning-variants": "tsx scripts/maintenance/merge-warning-variants.ts",
61
51
  "runtime:promote-payload": "tsx scripts/openclaw/promote-runtime-payload.ts",
62
52
  "runtime:replay-fixture": "tsx scripts/openclaw/replay-runtime-fixture.ts",
53
+ "prepack": "pnpm build",
63
54
  "typecheck": "tsc --noEmit",
64
55
  "test": "vitest run",
65
56
  "check": "pnpm typecheck && pnpm test && pnpm build"
57
+ },
58
+ "dependencies": {
59
+ "@modelcontextprotocol/sdk": "^1.27.1",
60
+ "zod": "^3.25.76"
61
+ },
62
+ "devDependencies": {
63
+ "@types/node": "^22.13.14",
64
+ "tsx": "^4.19.3",
65
+ "typescript": "^5.8.2",
66
+ "vitest": "^3.0.9"
66
67
  }
67
- }
68
+ }